From af103e9c41a3099d62f4ff5afa99b3f25e9c1508 Mon Sep 17 00:00:00 2001 From: Mark Crane Date: Mon, 4 Jun 2012 14:58:40 +0000 Subject: [PATCH] Add a missing file sip_profile_copy.php to the dev branch. --- .htaccess | 5 + app/adminer/adminer.php | 1452 +++++ app/adminer/app_config.php | 24 + app/adminer/index.php | 66 + app/adminer/root.php | 50 + app/call_broadcast/app_config.php | 120 + app/call_broadcast/root.php | 50 + app/call_broadcast/v_call_broadcast.php | 151 + .../v_call_broadcast_delete.php | 61 + app/call_broadcast/v_call_broadcast_edit.php | 560 ++ app/call_broadcast/v_call_broadcast_send.php | 374 ++ app/call_center/app_config.php | 457 ++ app/call_center/root.php | 50 + app/call_center/v_call_center_agent.php | 190 + .../v_call_center_agent_delete.php | 85 + app/call_center/v_call_center_agent_edit.php | 513 ++ .../v_call_center_agent_status.php | 235 + app/call_center/v_call_center_queue.php | 194 + .../v_call_center_queue_delete.php | 93 + app/call_center/v_call_center_queue_edit.php | 633 +++ app/call_center/v_call_center_tier.php | 177 + app/call_center/v_call_center_tier_delete.php | 89 + app/call_center/v_call_center_tier_edit.php | 437 ++ app/call_center/v_cmd.php | 57 + app/call_center_active/app_config.php | 26 + app/call_center_active/root.php | 50 + .../v_call_center_active.php | 122 + .../v_call_center_active_inc.php | 302 + app/call_center_active/v_call_center_exec.php | 96 + .../v_call_center_queue.php | 177 + app/calls/app_config.php | 37 + app/calls/root.php | 50 + app/calls/v_call_edit.php | 751 +++ app/calls/v_calls.php | 196 + app/calls_active/app_config.php | 75 + app/calls_active/root.php | 50 + app/calls_active/v_calls_active.php | 165 + ...v_calls_active_assigned_extensions_inc.php | 231 + .../v_calls_active_extensions.php | 337 ++ .../v_calls_active_extensions_inc.php | 561 ++ app/calls_active/v_calls_active_inc.php | 172 + app/calls_active/v_calls_exec.php | 259 + app/click_to_call/app_config.php | 30 + app/click_to_call/click_to_call.php | 331 ++ app/click_to_call/root.php | 50 + app/conferences/app_config.php | 140 + app/conferences/conferences.php | 202 + app/conferences/conferences_delete.php | 91 + app/conferences/conferences_edit.php | 541 ++ app/conferences/root.php | 50 + app/conferences_active/app_config.php | 70 + app/conferences_active/root.php | 50 + app/conferences_active/v_conference_exec.php | 126 + .../v_conference_interactive.php | 129 + .../v_conference_interactive_inc.php | 263 + .../v_conferences_active.php | 112 + .../v_conferences_active_inc.php | 107 + app/contacts/app_config.php | 275 + app/contacts/contact_addresses.php | 173 + app/contacts/contact_addresses_delete.php | 61 + app/contacts/contact_addresses_edit.php | 352 ++ app/contacts/contact_notes.php | 179 + app/contacts/contact_notes_delete.php | 60 + app/contacts/contact_notes_edit.php | 210 + app/contacts/contact_phones.php | 154 + app/contacts/contact_phones_delete.php | 61 + app/contacts/contact_phones_edit.php | 320 ++ app/contacts/contacts.php | 224 + app/contacts/contacts_delete.php | 86 + app/contacts/contacts_edit.php | 481 ++ app/contacts/contacts_vcard.php | 202 + app/contacts/root.php | 50 + app/content/app_config.php | 351 ++ app/content/config.php | 32 + app/content/index.php | 50 + app/content/root.php | 50 + app/content/rss.css | 44 + app/content/rss.php | 244 + app/content/rssadd.php | 347 ++ app/content/rsscontent.php | 74 + app/content/rssdelete.php | 62 + app/content/rsslist.php | 217 + app/content/rssmovedown.php | 92 + app/content/rssmoveup.php | 76 + app/content/rsssearch.php | 277 + app/content/rsssubadd.php | 174 + app/content/rsssubcategoryadd.php | 117 + app/content/rsssubcategorylist.php | 204 + app/content/rsssubcategoryupdate.php | 134 + app/content/rsssubdelete.php | 60 + app/content/rsssublist.php | 444 ++ app/content/rsssubsearch.php | 260 + app/content/rsssubupdate.php | 206 + app/content/rssupdate.php | 392 ++ app/destinations/app_config.php | 75 + app/destinations/destinations.php | 134 + app/destinations/destinations_delete.php | 35 + app/destinations/destinations_edit.php | 249 + app/destinations/root.php | 50 + app/dialplan/app_config.php | 160 + app/dialplan/app_defaults.php | 74 + app/dialplan/dialplan_add.php | 734 +++ app/dialplan/dialplan_advanced.php | 155 + app/dialplan/dialplan_copy.php | 164 + app/dialplan/dialplan_delete.php | 107 + app/dialplan/dialplan_details_delete.php | 69 + app/dialplan/dialplan_details_edit.php | 561 ++ app/dialplan/dialplan_edit.php | 592 ++ app/dialplan/dialplans.php | 348 ++ .../xml/dialplan/100_call-direction.xml | 5 + .../xml/dialplan/220_global-intercept.xml | 7 + .../xml/dialplan/230_group-intercept.xml | 7 + .../resources/xml/dialplan/240_redial.xml | 5 + .../resources/xml/dialplan/245_page.xml | 9 + .../resources/xml/dialplan/250_global.xml | 11 + .../resources/xml/dialplan/260_eavesdrop.xml | 6 + .../xml/dialplan/270_call_privacy.xml | 8 + .../xml/dialplan/280_call_return.xml | 5 + .../xml/dialplan/290_intercept-ext.xml | 7 + .../xml/dialplan/300_extension-intercom.xml | 7 + .../xml/dialplan/310_send_to_voicemail.xml | 9 + .../resources/xml/dialplan/320_vmain.xml | 8 + .../resources/xml/dialplan/330_vmain_user.xml | 8 + .../resources/xml/dialplan/340_delay_echo.xml | 6 + .../resources/xml/dialplan/350_echo.xml | 6 + .../resources/xml/dialplan/360_milliwatt.xml | 6 + .../xml/dialplan/370_tone_stream.xml | 6 + .../resources/xml/dialplan/380_hold_music.xml | 13 + .../resources/xml/dialplan/400_recordings.xml | 10 + .../dialplan/410_freeswitch_conference.xml | 14 + .../resources/xml/dialplan/420_disa.xml | 8 + .../resources/xml/dialplan/430_directory.xml | 5 + .../resources/xml/dialplan/440_wake-up.xml | 8 + .../resources/xml/dialplan/450_park_in.xml | 12 + .../resources/xml/dialplan/455_park_out.xml | 7 + .../resources/xml/dialplan/460_park_slots.xml | 11 + .../xml/dialplan/999_local_extension.xml | 32 + app/dialplan/root.php | 50 + app/dialplan_inbound/app_config.php | 36 + app/dialplan_inbound/app_defaults.php | 71 + app/dialplan_inbound/dialplan_inbound_add.php | 808 +++ app/dialplan_inbound/root.php | 50 + app/dialplan_outbound/app_config.php | 40 + app/dialplan_outbound/app_defaults.php | 39 + .../dialplan_outbound_add.php | 987 ++++ app/dialplan_outbound/root.php | 50 + app/exec/app_config.php | 29 + app/exec/root.php | 50 + app/exec/v_exec.php | 204 + app/extensions/app_config.php | 261 + app/extensions/app_defaults.php | 30 + app/extensions/root.php | 50 + app/extensions/v_extensions.php | 183 + app/extensions/v_extensions_copy.php | 151 + app/extensions/v_extensions_delete.php | 81 + app/extensions/v_extensions_edit.php | 1315 +++++ app/fax/app_config.php | 190 + app/fax/root.php | 50 + app/fax/v_fax.php | 180 + app/fax/v_fax_delete.php | 97 + app/fax/v_fax_edit.php | 631 ++ app/fax/v_fax_view.php | 725 +++ app/fifo/app_config.php | 36 + app/fifo/root.php | 50 + app/fifo/v_fifo.php | 194 + app/fifo/v_fifo_add.php | 426 ++ app/fifo/v_fifo_delete.php | 81 + app/fifo/v_fifo_details_delete.php | 66 + app/fifo/v_fifo_details_edit.php | 456 ++ app/fifo/v_fifo_edit.php | 515 ++ app/fifo_agents/app_config.php | 39 + app/fifo_agents/fifo_agent/root.php | 50 + app/fifo_agents/fifo_agent/v_fifo_agent.php | 186 + .../fifo_agent/v_fifo_agent_edit.php | 412 ++ .../fifo_agent/v_fifo_agent_login.php | 297 + .../fifo_agent/v_fifo_agent_logout.php | 74 + .../fifo_agent/v_fifo_agent_remote.php | 52 + app/fifo_agents/fifo_agent_call_logs/root.php | 50 + .../v_fifo_agent_call_logs.php | 170 + .../v_fifo_agent_call_logs.sql | 1 + .../v_fifo_agent_call_logs_delete.php | 61 + .../v_fifo_agent_call_logs_edit.php | 299 + app/fifo_agents/fifo_agent_profiles/root.php | 50 + .../v_fifo_agent_profile_members.php | 161 + .../v_fifo_agent_profile_members.sql | 1 + .../v_fifo_agent_profile_members_delete.php | 62 + .../v_fifo_agent_profile_members_edit.php | 358 ++ .../v_fifo_agent_profiles.php | 156 + .../v_fifo_agent_profiles.sql | 1 + .../v_fifo_agent_profiles_delete.php | 72 + .../v_fifo_agent_profiles_edit.php | 222 + .../fifo_agent_status_logs/root.php | 50 + .../v_fifo_agent_status_logs.php | 185 + .../v_fifo_agent_status_logs.sql | 1 + .../v_fifo_agent_status_logs_delete.php | 60 + .../v_fifo_agent_status_logs_edit.php | 262 + app/fifo_agents/fifo_languages/root.php | 50 + .../fifo_languages/v_fifo_agent_languages.php | 161 + .../fifo_languages/v_fifo_agent_languages.sql | 1 + .../v_fifo_agent_languages_delete.php | 60 + .../v_fifo_agent_languages_edit.php | 336 ++ app/fifo_agents/root.php | 50 + app/fifo_agents/v_fifo_agents.php | 206 + app/fifo_agents/v_fifo_agents.sql | 1 + app/fifo_agents/v_fifo_agents_delete.php | 60 + app/fifo_agents/v_fifo_agents_edit.php | 479 ++ app/fifo_list/app_config.php | 37 + app/fifo_list/root.php | 50 + app/fifo_list/v_fifo_exec.php | 89 + app/fifo_list/v_fifo_interactive.php | 143 + app/fifo_list/v_fifo_interactive_inc.php | 206 + app/fifo_list/v_fifo_list.php | 112 + app/fifo_list/v_fifo_list_inc.php | 121 + app/gateways/app_config.php | 166 + app/gateways/root.php | 50 + app/gateways/v_gateways.php | 252 + app/gateways/v_gateways_copy.php | 161 + app/gateways/v_gateways_delete.php | 122 + app/gateways/v_gateways_edit.php | 797 +++ app/grammar_edit/app_config.php | 28 + app/grammar_edit/clipadd.php | 126 + app/grammar_edit/clipdelete.php | 56 + app/grammar_edit/cliplist.php | 235 + app/grammar_edit/clipoptions.php | 71 + app/grammar_edit/clipoptionslist.php | 228 + app/grammar_edit/clipsearch.php | 180 + app/grammar_edit/clipupdate.php | 138 + app/grammar_edit/filedelete.php | 84 + app/grammar_edit/filelist.php | 252 + app/grammar_edit/filenew.php | 88 + app/grammar_edit/fileoptions.php | 85 + app/grammar_edit/fileoptionslist.php | 246 + app/grammar_edit/fileread.php | 49 + app/grammar_edit/filerename.php | 102 + app/grammar_edit/filesave.php | 50 + app/grammar_edit/folderdelete.php | 46 + app/grammar_edit/foldernew.php | 83 + app/grammar_edit/footer.php | 43 + app/grammar_edit/header.php | 83 + app/grammar_edit/images/Thumbs.db | Bin 0 -> 20992 bytes app/grammar_edit/images/file.gif | Bin 0 -> 96 bytes app/grammar_edit/images/file.png | Bin 0 -> 434 bytes app/grammar_edit/images/folder.gif | Bin 0 -> 585 bytes app/grammar_edit/images/gear.png | Bin 0 -> 822 bytes app/grammar_edit/images/leaf.gif | Bin 0 -> 585 bytes app/grammar_edit/images/minus.gif | Bin 0 -> 124 bytes app/grammar_edit/images/plus.gif | Bin 0 -> 129 bytes app/grammar_edit/images/program.gif | Bin 0 -> 61 bytes app/grammar_edit/images/thumbnails/Thumbs.db | Bin 0 -> 18432 bytes .../images/thumbnails/cliplibrary.png | Bin 0 -> 20544 bytes .../images/thumbnails/filemanagement.png | Bin 0 -> 23105 bytes .../images/thumbnails/phpeditor.png | Bin 0 -> 98754 bytes app/grammar_edit/index.php | 200 + app/grammar_edit/list.php | 107 + app/grammar_edit/readme.txt | 7 + app/grammar_edit/root.php | 50 + app/hardware_phones/app_config.php | 115 + app/hardware_phones/root.php | 50 + app/hardware_phones/v_hardware_phones.php | 162 + .../v_hardware_phones_delete.php | 64 + .../v_hardware_phones_edit.php | 426 ++ app/hunt_group/app_config.php | 263 + app/hunt_group/root.php | 50 + app/hunt_group/v_hunt_group.php | 182 + app/hunt_group/v_hunt_group_call_forward.php | 130 + .../v_hunt_group_call_forward_edit.php | 491 ++ app/hunt_group/v_hunt_group_copy.php | 168 + app/hunt_group/v_hunt_group_delete.php | 105 + .../v_hunt_group_destinations_delete.php | 67 + .../v_hunt_group_destinations_edit.php | 365 ++ app/hunt_group/v_hunt_group_edit.php | 752 +++ app/ivr_menu/app_config.php | 239 + app/ivr_menu/root.php | 50 + app/ivr_menu/v_ivr_menu.php | 173 + app/ivr_menu/v_ivr_menu_copy.php | 184 + app/ivr_menu/v_ivr_menu_delete.php | 67 + app/ivr_menu/v_ivr_menu_edit.php | 817 +++ app/ivr_menu/v_ivr_menu_options.php | 181 + app/ivr_menu/v_ivr_menu_options_delete.php | 66 + app/ivr_menu/v_ivr_menu_options_edit.php | 361 ++ app/log_viewer/app_config.php | 27 + app/log_viewer/log_viewer.php | 250 + app/log_viewer/root.php | 50 + app/modules/app_config.php | 87 + app/modules/app_defaults.php | 39 + app/modules/root.php | 50 + app/modules/v_modules.php | 221 + app/modules/v_modules_delete.php | 58 + app/modules/v_modules_edit.php | 304 + app/music_on_hold/app_config.php | 29 + app/music_on_hold/root.php | 50 + app/music_on_hold/slim.swf | Bin 0 -> 56327 bytes app/music_on_hold/v_music_on_hold.php | 228 + app/music_on_hold/v_music_on_hold_play.php | 78 + app/php_edit/app_config.php | 61 + app/php_edit/app_defaults.php | 66 + app/php_edit/clipadd.php | 126 + app/php_edit/clipdelete.php | 56 + app/php_edit/cliplist.php | 235 + app/php_edit/clipoptions.php | 71 + app/php_edit/clipoptionslist.php | 228 + app/php_edit/clipsearch.php | 180 + app/php_edit/clipupdate.php | 138 + app/php_edit/filedelete.php | 84 + app/php_edit/filelist.php | 287 + app/php_edit/filenew.php | 88 + app/php_edit/fileoptions.php | 85 + app/php_edit/fileoptionslist.php | 270 + app/php_edit/fileread.php | 49 + app/php_edit/filerename.php | 102 + app/php_edit/filesave.php | 50 + app/php_edit/folderdelete.php | 46 + app/php_edit/foldernew.php | 83 + app/php_edit/footer.php | 43 + app/php_edit/header.php | 83 + app/php_edit/images/Thumbs.db | Bin 0 -> 20992 bytes app/php_edit/images/file.gif | Bin 0 -> 96 bytes app/php_edit/images/file.png | Bin 0 -> 434 bytes app/php_edit/images/folder.gif | Bin 0 -> 585 bytes app/php_edit/images/gear.png | Bin 0 -> 822 bytes app/php_edit/images/leaf.gif | Bin 0 -> 585 bytes app/php_edit/images/minus.gif | Bin 0 -> 124 bytes app/php_edit/images/plus.gif | Bin 0 -> 129 bytes app/php_edit/images/program.gif | Bin 0 -> 61 bytes app/php_edit/images/thumbnails/Thumbs.db | Bin 0 -> 18432 bytes .../images/thumbnails/cliplibrary.png | Bin 0 -> 20544 bytes .../images/thumbnails/filemanagement.png | Bin 0 -> 23105 bytes app/php_edit/images/thumbnails/phpeditor.png | Bin 0 -> 98754 bytes app/php_edit/index.php | 224 + app/php_edit/list.php | 107 + app/php_edit/readme.txt | 7 + app/php_edit/root.php | 50 + app/php_service/app_config.php | 82 + app/php_service/root.php | 50 + app/php_service/v_php_service.php | 176 + app/php_service/v_php_service_delete.php | 82 + app/php_service/v_php_service_edit.php | 556 ++ app/provision/app_config.php | 25 + app/provision/index.php | 400 ++ app/provision/provision_write.php | 237 + app/provision/root.php | 50 + app/provision_editor/app_config.php | 26 + app/provision_editor/clip.db | Bin 0 -> 2056 bytes app/provision_editor/clipadd.php | 122 + app/provision_editor/clipdelete.php | 54 + app/provision_editor/cliplist.php | 221 + app/provision_editor/clipoptions.php | 73 + app/provision_editor/clipoptionslist.php | 247 + app/provision_editor/clipsearch.php | 187 + app/provision_editor/clipupdate.php | 142 + app/provision_editor/config.php | 176 + app/provision_editor/filedelete.php | 87 + app/provision_editor/filelist.php | 239 + app/provision_editor/filenew.php | 90 + app/provision_editor/fileoptions.php | 89 + app/provision_editor/fileoptionslist.php | 270 + app/provision_editor/fileread.php | 48 + app/provision_editor/filerename.php | 102 + app/provision_editor/filesave.php | 50 + app/provision_editor/folderdelete.php | 46 + app/provision_editor/foldernew.php | 86 + app/provision_editor/footer.php | 43 + app/provision_editor/header.php | 83 + app/provision_editor/images/file.gif | Bin 0 -> 96 bytes app/provision_editor/images/file.png | Bin 0 -> 434 bytes app/provision_editor/images/folder.gif | Bin 0 -> 585 bytes app/provision_editor/images/gear.png | Bin 0 -> 822 bytes app/provision_editor/images/leaf.gif | Bin 0 -> 585 bytes app/provision_editor/images/minus.gif | Bin 0 -> 124 bytes app/provision_editor/images/plus.gif | Bin 0 -> 129 bytes app/provision_editor/images/program.gif | Bin 0 -> 61 bytes .../images/thumbnails/Thumbs.db | Bin 0 -> 18432 bytes .../images/thumbnails/cliplibrary.png | Bin 0 -> 20544 bytes .../images/thumbnails/filemanagement.png | Bin 0 -> 23105 bytes .../images/thumbnails/phpeditor.png | Bin 0 -> 98754 bytes app/provision_editor/index.php | 207 + app/provision_editor/list.php | 113 + app/provision_editor/readme.txt | 7 + app/provision_editor/root.php | 50 + app/recordings/app_config.php | 100 + app/recordings/app_defaults.php | 30 + app/recordings/root.php | 50 + app/recordings/slim.swf | Bin 0 -> 56327 bytes app/recordings/v_recordings.php | 294 + app/recordings/v_recordings_delete.php | 75 + app/recordings/v_recordings_edit.php | 271 + app/recordings/v_recordings_play.php | 78 + app/registrations/app_config.php | 29 + app/registrations/root.php | 50 + app/registrations/v_status_registrations.php | 189 + app/ring_groups/app_config.php | 127 + app/ring_groups/ring_groups.php | 167 + app/ring_groups/ring_groups_delete.php | 88 + app/ring_groups/ring_groups_edit.php | 529 ++ app/ring_groups/root.php | 50 + app/script_edit/app_config.php | 26 + app/script_edit/clipadd.php | 126 + app/script_edit/clipdelete.php | 56 + app/script_edit/cliplist.php | 235 + app/script_edit/clipoptions.php | 71 + app/script_edit/clipoptionslist.php | 228 + app/script_edit/clipsearch.php | 180 + app/script_edit/clipupdate.php | 138 + app/script_edit/filedelete.php | 84 + app/script_edit/filelist.php | 254 + app/script_edit/filenew.php | 88 + app/script_edit/fileoptions.php | 85 + app/script_edit/fileoptionslist.php | 246 + app/script_edit/fileread.php | 49 + app/script_edit/filerename.php | 102 + app/script_edit/filesave.php | 50 + app/script_edit/folderdelete.php | 46 + app/script_edit/foldernew.php | 83 + app/script_edit/footer.php | 43 + app/script_edit/header.php | 83 + app/script_edit/images/Thumbs.db | Bin 0 -> 20992 bytes app/script_edit/images/file.gif | Bin 0 -> 96 bytes app/script_edit/images/file.png | Bin 0 -> 434 bytes app/script_edit/images/folder.gif | Bin 0 -> 585 bytes app/script_edit/images/gear.png | Bin 0 -> 822 bytes app/script_edit/images/leaf.gif | Bin 0 -> 585 bytes app/script_edit/images/minus.gif | Bin 0 -> 124 bytes app/script_edit/images/plus.gif | Bin 0 -> 129 bytes app/script_edit/images/program.gif | Bin 0 -> 61 bytes app/script_edit/images/thumbnails/Thumbs.db | Bin 0 -> 18432 bytes .../images/thumbnails/cliplibrary.png | Bin 0 -> 20544 bytes .../images/thumbnails/filemanagement.png | Bin 0 -> 23105 bytes .../images/thumbnails/phpeditor.png | Bin 0 -> 98754 bytes app/script_edit/index.php | 200 + app/script_edit/list.php | 107 + app/script_edit/readme.txt | 7 + app/script_edit/root.php | 50 + app/services/app_config.php | 101 + app/services/root.php | 50 + app/services/v_services.php | 222 + app/services/v_services_delete.php | 60 + app/services/v_services_edit.php | 294 + app/settings/app_config.php | 123 + app/settings/root.php | 50 + app/settings/v_settings_edit.php | 523 ++ app/signup/app_config.php | 22 + app/signup/config.php.dist | 8 + app/signup/root.php | 50 + app/signup/signup.php | 177 + app/signup/user_template.php | 61 + app/signup/v_fields.php | 30 + app/sip_profiles/app_config.php | 84 + app/sip_profiles/app_defaults.php | 134 + .../resources/xml/sip_profiles/default.xml | 25 + .../resources/xml/sip_profiles/external.xml | 23 + .../xml/sip_profiles/internal-ipv6.xml | 6 + .../resources/xml/sip_profiles/internal.xml | 26 + app/sip_profiles/root.php | 50 + app/sip_profiles/sip_profile_copy.php | 128 + app/sip_profiles/sip_profile_settings.php | 163 + .../sip_profile_settings_delete.php | 66 + .../sip_profile_settings_edit.php | 271 + app/sip_profiles/sip_profiles.php | 159 + app/sip_profiles/sip_profiles_delete.php | 77 + app/sip_profiles/sip_profiles_edit.php | 206 + app/sip_status/app_config.php | 29 + app/sip_status/cmd.php | 68 + app/sip_status/root.php | 50 + app/sip_status/sip_status.php | 260 + app/sql_query/app_config.php | 26 + app/sql_query/root.php | 50 + app/sql_query/v_sql_backup.php | 133 + app/sql_query/v_sql_db_conversion.php | 495 ++ app/sql_query/v_sql_query.php | 171 + app/sql_query/v_sql_query_db.php | 149 + app/sql_query/v_sql_query_pdo.php | 225 + app/sql_query/v_sql_query_result.php | 298 + app/system/app_config.php | 62 + app/system/root.php | 50 + app/system/system.php | 332 ++ app/time_conditions/app_config.php | 37 + app/time_conditions/root.php | 50 + app/time_conditions/time_condition_add.php | 1077 ++++ app/traffic_graph/app_config.php | 23 + app/traffic_graph/root.php | 50 + app/traffic_graph/status_graph.php | 137 + app/traffic_graph/status_interface.php | 139 + app/traffic_graph/svg_graph.php | 372 ++ app/users/app_config.php | 33 + app/users/root.php | 50 + app/users/usersupdate.php | 447 ++ app/vars/app_config.php | 89 + app/vars/app_defaults.php | 118 + app/vars/root.php | 50 + app/vars/v_vars.php | 185 + app/vars/v_vars.textarea.php | 162 + app/vars/v_vars_delete.php | 62 + app/vars/v_vars_edit.php | 384 ++ app/virtual_tables/app_config.php | 369 ++ app/virtual_tables/root.php | 50 + .../v_virtual_table_data_delete.php | 103 + .../v_virtual_table_data_edit.php | 982 ++++ .../v_virtual_table_data_types_name_value.php | 151 + ...ual_table_data_types_name_value_delete.php | 64 + ...rtual_table_data_types_name_value_edit.php | 232 + .../v_virtual_table_data_view.php | 399 ++ app/virtual_tables/v_virtual_table_fields.php | 158 + .../v_virtual_table_fields_delete.php | 63 + .../v_virtual_table_fields_edit.php | 545 ++ app/virtual_tables/v_virtual_tables.php | 161 + .../v_virtual_tables_delete.php | 65 + app/virtual_tables/v_virtual_tables_edit.php | 355 ++ .../v_virtual_tables_import.php | 373 ++ app/voicemail_greetings/app_config.php | 102 + app/voicemail_greetings/root.php | 50 + .../v_voicemail_greetings.php | 403 ++ .../v_voicemail_greetings_delete.php | 83 + .../v_voicemail_greetings_edit.php | 237 + .../v_voicemail_greetings_play.php | 78 + app/voicemail_msgs/app_config.php | 37 + app/voicemail_msgs/root.php | 50 + app/voicemail_msgs/v_voicemail_msgs.php | 295 + .../v_voicemail_msgs_delete.php | 89 + .../v_voicemail_msgs_password.php | 422 ++ app/voicemail_msgs/v_voicemail_msgs_play.php | 112 + app/voicemail_status/app_config.php | 30 + app/voicemail_status/root.php | 50 + app/voicemail_status/v_voicemail.php | 198 + .../v_voicemail_prefs_delete.php | 66 + app/xml_cdr/app_config.php | 275 + app/xml_cdr/app_defaults.php | 39 + app/xml_cdr/root.php | 50 + app/xml_cdr/v_xml_cdr_import.php | 359 ++ app/xml_cdr/xml_cdr.php | 427 ++ app/xml_cdr/xml_cdr_csv.php | 82 + app/xml_cdr/xml_cdr_details.php | 508 ++ app/xml_cdr/xml_cdr_import_update.php | 159 + app/xml_cdr/xml_cdr_inc.php | 203 + app/xml_cdr/xml_cdr_search.php | 157 + app/xml_cdr/xml_cdr_statistics.php | 219 + app/xml_cdr/xml_cdr_statistics_csv.php | 73 + app/xml_cdr/xml_cdr_statistics_inc.php | 246 + app/xml_edit/app_config.php | 26 + app/xml_edit/clip.db | Bin 0 -> 2056 bytes app/xml_edit/clipadd.php | 123 + app/xml_edit/clipdelete.php | 54 + app/xml_edit/cliplist.php | 224 + app/xml_edit/clipoptions.php | 73 + app/xml_edit/clipoptionslist.php | 247 + app/xml_edit/clipsearch.php | 187 + app/xml_edit/clipupdate.php | 142 + app/xml_edit/config.php | 176 + app/xml_edit/filedelete.php | 87 + app/xml_edit/filelist.php | 281 + app/xml_edit/filenew.php | 90 + app/xml_edit/fileoptions.php | 89 + app/xml_edit/fileoptionslist.php | 270 + app/xml_edit/fileread.php | 48 + app/xml_edit/filerename.php | 102 + app/xml_edit/filesave.php | 50 + app/xml_edit/folderdelete.php | 46 + app/xml_edit/foldernew.php | 86 + app/xml_edit/footer.php | 43 + app/xml_edit/header.php | 83 + app/xml_edit/images/Thumbs.db | Bin 0 -> 20992 bytes app/xml_edit/images/file.gif | Bin 0 -> 96 bytes app/xml_edit/images/file.png | Bin 0 -> 434 bytes app/xml_edit/images/folder.gif | Bin 0 -> 585 bytes app/xml_edit/images/gear.png | Bin 0 -> 822 bytes app/xml_edit/images/leaf.gif | Bin 0 -> 585 bytes app/xml_edit/images/minus.gif | Bin 0 -> 124 bytes app/xml_edit/images/plus.gif | Bin 0 -> 129 bytes app/xml_edit/images/program.gif | Bin 0 -> 61 bytes app/xml_edit/images/thumbnails/Thumbs.db | Bin 0 -> 18432 bytes .../images/thumbnails/cliplibrary.png | Bin 0 -> 20544 bytes .../images/thumbnails/filemanagement.png | Bin 0 -> 23105 bytes app/xml_edit/images/thumbnails/phpeditor.png | Bin 0 -> 98754 bytes app/xml_edit/index.php | 201 + app/xml_edit/list.php | 113 + app/xml_edit/readme.txt | 7 + app/xml_edit/root.php | 50 + app/xmpp/README | 3 + app/xmpp/app_config.php | 142 + app/xmpp/client_template.php | 53 + app/xmpp/db_create.php | 51 + app/xmpp/errors.php | 31 + app/xmpp/profile_edit.php | 286 + app/xmpp/profile_list.php | 61 + app/xmpp/root.php | 50 + app/xmpp/update_complete.php | 11 + app/xmpp/v_profile_delete.php | 95 + app/xmpp/v_profile_edit.php | 245 + app/xmpp/v_xmpp.php | 95 + core/apps/app_config.php | 46 + core/apps/apps.php | 118 + core/apps/apps_delete.php | 95 + core/apps/apps_edit.php | 215 + core/apps/root.php | 50 + core/backup/backup.php | 45 + core/backup/backupandrestore.php | 87 + core/backup/root.php | 50 + core/databases/app_config.php | 97 + core/databases/database_delete.php | 58 + core/databases/database_edit.php | 346 ++ core/databases/databases.php | 162 + core/databases/root.php | 50 + core/default_settings/app_config.php | 65 + core/default_settings/app_defaults.php | 29 + core/default_settings/default_settings.php | 190 + .../default_settings_delete.php | 58 + .../default_settings_edit.php | 372 ++ core/default_settings/root.php | 50 + core/domains/app_config.php | 115 + core/domains/app_defaults.php | 37 + core/domains/domain_settings.php | 189 + core/domains/domain_settings_delete.php | 60 + core/domains/domain_settings_edit.php | 369 ++ core/domains/domains.php | 197 + core/domains/domains_delete.php | 195 + core/domains/domains_edit.php | 216 + core/domains/root.php | 50 + core/menu/app_config.php | 232 + core/menu/app_defaults.php | 118 + core/menu/menu.php | 152 + core/menu/menu_delete.php | 83 + core/menu/menu_edit.php | 245 + core/menu/menu_item_delete.php | 62 + core/menu/menu_item_edit.php | 464 ++ core/menu/menu_item_list.php | 371 ++ core/menu/menu_item_move_down.php | 88 + core/menu/menu_item_move_up.php | 75 + core/menu/menu_restore_default.php | 63 + core/menu/root.php | 50 + core/servers/app_config.php | 98 + core/servers/root.php | 50 + core/servers/v_server_settings.php | 161 + core/servers/v_server_settings_delete.php | 60 + core/servers/v_server_settings_edit.php | 244 + core/servers/v_servers.php | 158 + core/servers/v_servers_delete.php | 59 + core/servers/v_servers_edit.php | 212 + core/upgrade/app_config.php | 71 + core/upgrade/app_defaults.php | 132 + core/upgrade/root.php | 50 + core/upgrade/upgrade.php | 101 + core/upgrade/upgrade_domains.php | 188 + core/upgrade/upgrade_schema.php | 71 + core/upgrade/upgrade_svn.php | 296 + core/users/app_config.php | 356 ++ core/users/app_defaults.php | 169 + core/users/group_permissions.php | 275 + core/users/groupadd.php | 134 + core/users/groupdelete.php | 56 + core/users/grouplist.php | 137 + core/users/groupmemberadd.php | 80 + core/users/groupmemberdelete.php | 68 + core/users/groupmembers.php | 166 + core/users/index.php | 57 + core/users/root.php | 50 + core/users/signup.php | 258 + core/users/userdelete.php | 87 + core/users/userlist.php | 192 + core/users/usersupdate.php | 612 ++ favicon.ico | Bin 0 -> 930 bytes images/background_cell_active.gif | Bin 0 -> 128 bytes images/background_cell_conference.gif | Bin 0 -> 128 bytes images/background_cell_fifo.gif | Bin 0 -> 128 bytes images/background_cell_light.gif | Bin 0 -> 149 bytes images/blank.gif | Bin 0 -> 49 bytes images/icon_cal.gif | Bin 0 -> 646 bytes images/icon_e.gif | Bin 0 -> 1106 bytes images/icon_e.png | Bin 0 -> 1009 bytes images/icon_plus.gif | Bin 0 -> 1100 bytes images/icon_plus.png | Bin 0 -> 915 bytes images/icon_restart.gif | Bin 0 -> 1120 bytes images/icon_start.gif | Bin 0 -> 1119 bytes images/icon_stop.gif | Bin 0 -> 1106 bytes images/icon_up.gif | Bin 0 -> 1116 bytes images/icon_view.gif | Bin 0 -> 1109 bytes images/icon_x.gif | Bin 0 -> 1111 bytes images/icon_x.png | Bin 0 -> 1045 bytes includes/calendar_lw_layers.js | 189 + includes/calendar_lw_menu.js | 376 ++ includes/calendar_popcalendar.js | 637 +++ includes/captcha/config.php | 108 + includes/captcha/fonts/ROUGD.TTF | Bin 0 -> 65036 bytes includes/captcha/fonts/Zebra.ttf | Bin 0 -> 82064 bytes includes/captcha/fonts/hanshand.ttf | Bin 0 -> 53424 bytes includes/captcha/img.php | 123 + includes/captcha/root.php | 48 + includes/checkauth.php | 159 + includes/checkstring.php | 30 + includes/class.phpmailer.php | 1896 ++++++ includes/class.smtp.php | 1062 ++++ includes/class_vcard.php | 198 + includes/classes/array_order.php | 45 + includes/classes/call_forward.php | 195 + includes/classes/database.php | 469 ++ includes/classes/dialplan.php | 343 ++ includes/classes/do_not_disturb.php | 169 + includes/classes/follow_me.php | 338 ++ includes/classes/install.php | 217 + includes/classes/menu.php | 340 ++ includes/classes/root.php | 50 + includes/classes/schema.php | 121 + includes/classes/switch_directory.php | 694 +++ includes/classes/switch_fax.php | 530 ++ includes/classes/switch_ivr_menu.php | 621 ++ includes/classes/switch_modules.php | 766 +++ includes/cmd.php | 53 + includes/config.php.dist | 62 + includes/directory.php | 278 + includes/download.php | 36 + includes/edit_area/edit_area_full.gz | Bin 0 -> 29125 bytes includes/edit_area/edit_area_full.js | 38 + includes/edit_area/images/autocompletion.gif | Bin 0 -> 359 bytes includes/edit_area/images/close.gif | Bin 0 -> 102 bytes includes/edit_area/images/fullscreen.gif | Bin 0 -> 198 bytes includes/edit_area/images/go_to_line.gif | Bin 0 -> 1053 bytes includes/edit_area/images/help.gif | Bin 0 -> 295 bytes includes/edit_area/images/highlight.gif | Bin 0 -> 256 bytes includes/edit_area/images/load.gif | Bin 0 -> 1041 bytes includes/edit_area/images/move.gif | Bin 0 -> 257 bytes includes/edit_area/images/newdocument.gif | Bin 0 -> 170 bytes includes/edit_area/images/opacity.png | Bin 0 -> 147 bytes includes/edit_area/images/processing.gif | Bin 0 -> 825 bytes includes/edit_area/images/redo.gif | Bin 0 -> 169 bytes includes/edit_area/images/reset_highlight.gif | Bin 0 -> 168 bytes includes/edit_area/images/save.gif | Bin 0 -> 285 bytes includes/edit_area/images/search.gif | Bin 0 -> 191 bytes .../edit_area/images/smooth_selection.gif | Bin 0 -> 174 bytes includes/edit_area/images/spacer.gif | Bin 0 -> 43 bytes .../edit_area/images/statusbar_resize.gif | Bin 0 -> 79 bytes includes/edit_area/images/undo.gif | Bin 0 -> 175 bytes includes/edit_area/images/word_wrap.gif | Bin 0 -> 951 bytes includes/edit_area/langs/bg.js | 73 + includes/edit_area/langs/cs.js | 67 + includes/edit_area/langs/de.js | 67 + includes/edit_area/langs/dk.js | 67 + includes/edit_area/langs/en.js | 67 + includes/edit_area/langs/eo.js | 67 + includes/edit_area/langs/es.js | 64 + includes/edit_area/langs/fi.js | 67 + includes/edit_area/langs/fr.js | 67 + includes/edit_area/langs/hr.js | 67 + includes/edit_area/langs/it.js | 67 + includes/edit_area/langs/ja.js | 67 + includes/edit_area/langs/mk.js | 67 + includes/edit_area/langs/nl.js | 67 + includes/edit_area/langs/pl.js | 67 + includes/edit_area/langs/pt.js | 67 + includes/edit_area/langs/ru.js | 67 + includes/edit_area/langs/sk.js | 67 + includes/edit_area/langs/zh.js | 67 + includes/edit_area/plugins/charmap/charmap.js | 90 + .../edit_area/plugins/charmap/css/charmap.css | 64 + .../plugins/charmap/images/charmap.gif | Bin 0 -> 245 bytes .../edit_area/plugins/charmap/jscripts/map.js | 373 ++ .../edit_area/plugins/charmap/langs/bg.js | 12 + .../edit_area/plugins/charmap/langs/cs.js | 6 + .../edit_area/plugins/charmap/langs/de.js | 6 + .../edit_area/plugins/charmap/langs/dk.js | 6 + .../edit_area/plugins/charmap/langs/en.js | 6 + .../edit_area/plugins/charmap/langs/eo.js | 6 + .../edit_area/plugins/charmap/langs/es.js | 6 + .../edit_area/plugins/charmap/langs/fr.js | 6 + .../edit_area/plugins/charmap/langs/hr.js | 6 + .../edit_area/plugins/charmap/langs/it.js | 6 + .../edit_area/plugins/charmap/langs/ja.js | 6 + .../edit_area/plugins/charmap/langs/mk.js | 6 + .../edit_area/plugins/charmap/langs/nl.js | 6 + .../edit_area/plugins/charmap/langs/pl.js | 6 + .../edit_area/plugins/charmap/langs/pt.js | 6 + .../edit_area/plugins/charmap/langs/ru.js | 6 + .../edit_area/plugins/charmap/langs/sk.js | 6 + .../edit_area/plugins/charmap/langs/zh.js | 6 + includes/edit_area/plugins/charmap/popup.html | 24 + includes/edit_area/plugins/test/css/test.css | 3 + .../edit_area/plugins/test/images/Thumbs.db | Bin 0 -> 3584 bytes .../edit_area/plugins/test/images/test.gif | Bin 0 -> 87 bytes includes/edit_area/plugins/test/langs/bg.js | 10 + includes/edit_area/plugins/test/langs/cs.js | 4 + includes/edit_area/plugins/test/langs/de.js | 4 + includes/edit_area/plugins/test/langs/dk.js | 4 + includes/edit_area/plugins/test/langs/en.js | 4 + includes/edit_area/plugins/test/langs/eo.js | 4 + includes/edit_area/plugins/test/langs/es.js | 4 + includes/edit_area/plugins/test/langs/fr.js | 4 + includes/edit_area/plugins/test/langs/hr.js | 4 + includes/edit_area/plugins/test/langs/it.js | 4 + includes/edit_area/plugins/test/langs/ja.js | 4 + includes/edit_area/plugins/test/langs/mk.js | 4 + includes/edit_area/plugins/test/langs/nl.js | 4 + includes/edit_area/plugins/test/langs/pl.js | 4 + includes/edit_area/plugins/test/langs/pt.js | 4 + includes/edit_area/plugins/test/langs/ru.js | 4 + includes/edit_area/plugins/test/langs/sk.js | 4 + includes/edit_area/plugins/test/langs/zh.js | 4 + includes/edit_area/plugins/test/test.js | 110 + includes/edit_area/plugins/test/test2.js | 1 + includes/edit_area/reg_syntax/basic.js | 69 + includes/edit_area/reg_syntax/brainfuck.js | 44 + includes/edit_area/reg_syntax/c.js | 62 + includes/edit_area/reg_syntax/coldfusion.js | 119 + includes/edit_area/reg_syntax/cpp.js | 65 + includes/edit_area/reg_syntax/css.js | 84 + includes/edit_area/reg_syntax/html.js | 50 + includes/edit_area/reg_syntax/java.js | 56 + includes/edit_area/reg_syntax/js.js | 93 + includes/edit_area/reg_syntax/pas.js | 82 + includes/edit_area/reg_syntax/perl.js | 88 + includes/edit_area/reg_syntax/php.js | 156 + includes/edit_area/reg_syntax/python.js | 144 + includes/edit_area/reg_syntax/robotstxt.js | 24 + includes/edit_area/reg_syntax/ruby.js | 67 + includes/edit_area/reg_syntax/sql.js | 55 + includes/edit_area/reg_syntax/tsql.js | 87 + includes/edit_area/reg_syntax/vb.js | 52 + includes/edit_area/reg_syntax/xml.js | 56 + includes/email_address_validator.php | 181 + includes/footer.php | 101 + includes/fpdf/font/courier.php | 8 + includes/fpdf/font/courierb.php | 8 + includes/fpdf/font/courierbi.php | 8 + includes/fpdf/font/courieri.php | 8 + includes/fpdf/font/helvetica.php | 19 + includes/fpdf/font/helveticab.php | 19 + includes/fpdf/font/helveticabi.php | 19 + includes/fpdf/font/helveticai.php | 19 + includes/fpdf/font/symbol.php | 19 + includes/fpdf/font/times.php | 19 + includes/fpdf/font/timesb.php | 19 + includes/fpdf/font/timesbi.php | 19 + includes/fpdf/font/timesi.php | 19 + includes/fpdf/font/zapfdingbats.php | 19 + includes/fpdf/fpdf.php | 1804 ++++++ includes/header.php | 137 + .../install/autoload_configs/cdr_csv.conf.xml | 20 + includes/install/dialplan/default.xml | 832 +++ includes/install/htdocs/license.txt | 10 + includes/install/htdocs/slim.swf | Bin 0 -> 56327 bytes includes/install/htdocs/slimtest.htm | 23 + includes/install/lang/en/en.xml | 15 + includes/install/lang/en/wakeup/sounds.xml | 129 + .../scripts/call_broadcast_originate.js | 80 + includes/install/scripts/call_forward.lua | 127 + includes/install/scripts/disa.lua | 156 + includes/install/scripts/eavesdrop.lua | 101 + includes/install/scripts/fax_retry.lua | 70 + includes/install/scripts/fifo_member.lua | 99 + .../install/scripts/huntgroup_originate.lua | 108 + includes/install/scripts/intercept.lua | 100 + includes/install/scripts/originate.js | 43 + includes/install/scripts/page.lua | 138 + includes/install/scripts/park.lua | 229 + includes/install/scripts/park_monitor.lua | 149 + includes/install/scripts/pin_number.lua | 54 + includes/install/scripts/recordings.lua | 162 + includes/install/scripts/ring_group.lua | 98 + includes/install/scripts/roku.lua | 91 + includes/install/scripts/wakeup.lua | 203 + .../sounds/en/us/callie/custom/16000/4.wav | Bin 0 -> 13752 bytes .../sounds/en/us/callie/custom/16000/a.wav | Bin 0 -> 12042 bytes .../en/us/callie/custom/16000/accept.wav | Bin 0 -> 17934 bytes .../sounds/en/us/callie/custom/16000/and.wav | Bin 0 -> 10902 bytes .../sounds/en/us/callie/custom/16000/been.wav | Bin 0 -> 14146 bytes .../en/us/callie/custom/16000/begin.wav | Bin 0 -> 16314 bytes .../callie/custom/16000/begin_recording.wav | Bin 0 -> 77156 bytes .../sounds/en/us/callie/custom/16000/call.wav | Bin 0 -> 12782 bytes .../16000/call_forward_has_been_deleted.wav | Bin 0 -> 114092 bytes .../16000/call_forward_has_been_set.wav | Bin 0 -> 123164 bytes .../en/us/callie/custom/16000/calling.wav | Bin 0 -> 15016 bytes .../en/us/callie/custom/16000/cancel.wav | Bin 0 -> 16972 bytes .../en/us/callie/custom/16000/delete.wav | Bin 0 -> 15550 bytes .../en/us/callie/custom/16000/digit.wav | Bin 0 -> 11708 bytes .../en/us/callie/custom/16000/digits.wav | Bin 0 -> 12620 bytes .../en/us/callie/custom/16000/enter.wav | Bin 0 -> 14202 bytes .../sounds/en/us/callie/custom/16000/exit.wav | Bin 0 -> 22404 bytes .../en/us/callie/custom/16000/extension.wav | Bin 0 -> 22502 bytes .../us/callie/custom/16000/followme_menu.wav | Bin 0 -> 248228 bytes .../sounds/en/us/callie/custom/16000/for.wav | Bin 0 -> 13752 bytes .../en/us/callie/custom/16000/forward.wav | Bin 0 -> 19044 bytes .../en/us/callie/custom/16000/goodbye.wav | Bin 0 -> 17898 bytes .../sounds/en/us/callie/custom/16000/has.wav | Bin 0 -> 7958 bytes .../en/us/callie/custom/16000/hours.wav | Bin 0 -> 13984 bytes .../en/us/callie/custom/16000/incorrect.wav | Bin 0 -> 22596 bytes .../sounds/en/us/callie/custom/16000/is.wav | Bin 0 -> 8304 bytes .../sounds/en/us/callie/custom/16000/m.wav | Bin 0 -> 9704 bytes .../en/us/callie/custom/16000/minutes.wav | Bin 0 -> 10480 bytes .../sounds/en/us/callie/custom/16000/name.wav | Bin 0 -> 13150 bytes .../sounds/en/us/callie/custom/16000/new.wav | Bin 0 -> 15330 bytes .../sounds/en/us/callie/custom/16000/now.wav | Bin 0 -> 11934 bytes .../en/us/callie/custom/16000/number.wav | Bin 0 -> 14560 bytes .../sounds/en/us/callie/custom/16000/or.wav | Bin 0 -> 9470 bytes .../sounds/en/us/callie/custom/16000/p.wav | Bin 0 -> 13282 bytes .../sounds/en/us/callie/custom/16000/pin.wav | Bin 0 -> 13170 bytes .../en/us/callie/custom/16000/please.wav | Bin 0 -> 12246 bytes .../please_enter_the_extension_number.wav | Bin 0 -> 128996 bytes .../16000/please_enter_the_phone_number.wav | Bin 0 -> 105668 bytes .../16000/please_enter_the_pin_number.wav | Bin 0 -> 109556 bytes .../please_enter_the_recording_number.wav | Bin 0 -> 63548 bytes .../16000/please_enter_your_pin_number.wav | Bin 0 -> 112148 bytes ...e_say_your_name_and_reason_for_calling.wav | Bin 0 -> 143252 bytes .../en/us/callie/custom/16000/press.wav | Bin 0 -> 4840 bytes ..._accept_2_to_reject_or_3_for_voicemail.wav | Bin 0 -> 223604 bytes .../16000/press_1_to_accept_this_call.wav | Bin 0 -> 68408 bytes .../en/us/callie/custom/16000/reason.wav | Bin 0 -> 16480 bytes .../en/us/callie/custom/16000/recording.wav | Bin 0 -> 19640 bytes .../en/us/callie/custom/16000/reject.wav | Bin 0 -> 10288 bytes .../sounds/en/us/callie/custom/16000/say.wav | Bin 0 -> 15008 bytes .../en/us/callie/custom/16000/schedule.wav | Bin 0 -> 22012 bytes .../en/us/callie/custom/16000/scheduled.wav | Bin 0 -> 20662 bytes .../sounds/en/us/callie/custom/16000/set.wav | Bin 0 -> 10818 bytes .../en/us/callie/custom/16000/snooze.wav | Bin 0 -> 41224 bytes .../sounds/en/us/callie/custom/16000/the.wav | Bin 0 -> 7238 bytes .../sounds/en/us/callie/custom/16000/this.wav | Bin 0 -> 8160 bytes .../sounds/en/us/callie/custom/16000/time.wav | Bin 0 -> 15052 bytes .../sounds/en/us/callie/custom/16000/to.wav | Bin 0 -> 12172 bytes .../en/us/callie/custom/16000/voicemail.wav | Bin 0 -> 12788 bytes .../en/us/callie/custom/16000/wakeup.wav | Bin 0 -> 18752 bytes .../sounds/en/us/callie/custom/16000/your.wav | Bin 0 -> 12726 bytes .../your_pin_number_is_incorect_goodbye.wav | Bin 0 -> 143252 bytes .../sounds/en/us/callie/custom/8000/4.wav | Bin 0 -> 5978 bytes .../sounds/en/us/callie/custom/8000/a.wav | Bin 0 -> 5478 bytes .../en/us/callie/custom/8000/accept.wav | Bin 0 -> 8934 bytes .../sounds/en/us/callie/custom/8000/and.wav | Bin 0 -> 5232 bytes .../sounds/en/us/callie/custom/8000/been.wav | Bin 0 -> 6918 bytes .../sounds/en/us/callie/custom/8000/begin.wav | Bin 0 -> 8040 bytes .../us/callie/custom/8000/begin_recording.wav | Bin 0 -> 19480 bytes .../sounds/en/us/callie/custom/8000/call.wav | Bin 0 -> 6110 bytes .../8000/call_forward_has_been_deleted.wav | Bin 0 -> 28668 bytes .../custom/8000/call_forward_has_been_set.wav | Bin 0 -> 30976 bytes .../en/us/callie/custom/8000/calling.wav | Bin 0 -> 8116 bytes .../en/us/callie/custom/8000/cancel.wav | Bin 0 -> 8670 bytes .../en/us/callie/custom/8000/delete.wav | Bin 0 -> 7978 bytes .../sounds/en/us/callie/custom/8000/digit.wav | Bin 0 -> 6228 bytes .../en/us/callie/custom/8000/digits.wav | Bin 0 -> 6332 bytes .../sounds/en/us/callie/custom/8000/enter.wav | Bin 0 -> 7306 bytes .../sounds/en/us/callie/custom/8000/exit.wav | Bin 0 -> 5852 bytes .../en/us/callie/custom/8000/extension.wav | Bin 0 -> 11084 bytes .../us/callie/custom/8000/followme_menu.wav | Bin 0 -> 66860 bytes .../sounds/en/us/callie/custom/8000/for.wav | Bin 0 -> 5978 bytes .../en/us/callie/custom/8000/forward.wav | Bin 0 -> 9538 bytes .../en/us/callie/custom/8000/goodbye.wav | Bin 0 -> 8970 bytes .../sounds/en/us/callie/custom/8000/has.wav | Bin 0 -> 4180 bytes .../sounds/en/us/callie/custom/8000/hours.wav | Bin 0 -> 7754 bytes .../en/us/callie/custom/8000/incorrect.wav | Bin 0 -> 11158 bytes .../sounds/en/us/callie/custom/8000/is.wav | Bin 0 -> 4582 bytes .../sounds/en/us/callie/custom/8000/m.wav | Bin 0 -> 4776 bytes .../en/us/callie/custom/8000/minutes.wav | Bin 0 -> 5362 bytes .../sounds/en/us/callie/custom/8000/name.wav | Bin 0 -> 6590 bytes .../sounds/en/us/callie/custom/8000/new.wav | Bin 0 -> 7430 bytes .../sounds/en/us/callie/custom/8000/now.wav | Bin 0 -> 5682 bytes .../en/us/callie/custom/8000/number.wav | Bin 0 -> 7030 bytes .../sounds/en/us/callie/custom/8000/or.wav | Bin 0 -> 4692 bytes .../sounds/en/us/callie/custom/8000/p.wav | Bin 0 -> 11728 bytes .../sounds/en/us/callie/custom/8000/pin.wav | Bin 0 -> 6654 bytes .../en/us/callie/custom/8000/please.wav | Bin 0 -> 7284 bytes .../please_enter_the_extension_number.wav | Bin 0 -> 32360 bytes .../8000/please_enter_the_phone_number.wav | Bin 0 -> 26552 bytes .../8000/please_enter_the_pin_number.wav | Bin 0 -> 27504 bytes .../please_enter_the_recording_number.wav | Bin 0 -> 31796 bytes .../8000/please_enter_your_pin_number.wav | Bin 0 -> 28212 bytes ...e_say_your_name_and_reason_for_calling.wav | Bin 0 -> 35860 bytes .../sounds/en/us/callie/custom/8000/press.wav | Bin 0 -> 4842 bytes ..._accept_2_to_reject_or_3_for_voicemail.wav | Bin 0 -> 68104 bytes .../8000/press_1_to_accept_this_call.wav | Bin 0 -> 32908 bytes .../en/us/callie/custom/8000/reason.wav | Bin 0 -> 7944 bytes .../en/us/callie/custom/8000/recording.wav | Bin 0 -> 9630 bytes .../en/us/callie/custom/8000/reject.wav | Bin 0 -> 10030 bytes .../sounds/en/us/callie/custom/8000/say.wav | Bin 0 -> 6404 bytes .../en/us/callie/custom/8000/schedule.wav | Bin 0 -> 8970 bytes .../en/us/callie/custom/8000/scheduled.wav | Bin 0 -> 10028 bytes .../sounds/en/us/callie/custom/8000/set.wav | Bin 0 -> 5278 bytes .../en/us/callie/custom/8000/snooze.wav | Bin 0 -> 10946 bytes .../sounds/en/us/callie/custom/8000/the.wav | Bin 0 -> 3760 bytes .../sounds/en/us/callie/custom/8000/this.wav | Bin 0 -> 4264 bytes .../sounds/en/us/callie/custom/8000/time.wav | Bin 0 -> 7364 bytes .../sounds/en/us/callie/custom/8000/to.wav | Bin 0 -> 4964 bytes .../en/us/callie/custom/8000/voicemail.wav | Bin 0 -> 12608 bytes .../en/us/callie/custom/8000/wakeup.wav | Bin 0 -> 9042 bytes .../sounds/en/us/callie/custom/8000/your.wav | Bin 0 -> 5938 bytes .../your_pin_number_is_incorect_goodbye.wav | Bin 0 -> 43420 bytes includes/install/source.xml | 5063 +++++++++++++++++ includes/install/sql/mysql.sql | 1 + includes/install/sql/pgsql.sql | 9 + includes/install/sql/sqlite.sql | 9 + includes/jquery/flot/excanvas.min.js | 1 + includes/jquery/flot/jquery.flot.js | 2599 +++++++++ includes/jquery/flot/jquery.min.js | 23 + includes/jquery/jquery-1.7.2.min.js | 4 + includes/lib_cdr.php | 100 + includes/lib_functions.php | 948 +++ includes/lib_pdo.php | 374 ++ includes/lib_pdo_vm.php | 69 + includes/lib_php.php | 67 + includes/lib_schema.php | 584 ++ includes/lib_switch.php | 4335 ++++++++++++++ includes/menu.php | 80 + includes/paging.php | 102 + includes/persistform.php | 46 + includes/persistformvar.php | 47 + includes/phpsvnclient/definitions.php | 81 + includes/phpsvnclient/http.php | 1985 +++++++ includes/phpsvnclient/phpsvnclient.php | 709 +++ includes/phpsvnclient/xml2Array.php | 56 + includes/phpsvnclient/xml_parser.php | 427 ++ includes/pop3/mime_parser.php | 2439 ++++++++ includes/pop3/parse_message.php | 87 + includes/pop3/pop3.php | 796 +++ includes/pop3/rfc822_addresses.php | 903 +++ includes/qr/qrcode.php | 1470 +++++ includes/recaptchalib.php | 276 + includes/require.php | 32 + includes/root.php | 50 + includes/securedownload.php | 91 + .../templates/conf/autoload_configs/.htaccess | 3 + .../autoload_configs/abstraction.conf.xml | 5 + .../conf/autoload_configs/acl.conf.xml | 32 + .../conf/autoload_configs/alsa.conf.xml | 12 + .../conf/autoload_configs/blacklist.conf.xml | 11 + .../conf/autoload_configs/callcenter.conf.xml | 23 + .../conf/autoload_configs/cdr_csv.conf.xml | 23 + .../autoload_configs/cdr_mongodb.conf.xml | 13 + .../conf/autoload_configs/cdr_pg_csv.conf.xml | 40 + .../conf/autoload_configs/cdr_sqlite.conf.xml | 18 + .../conf/autoload_configs/cepstral.conf.xml | 12 + .../conf/autoload_configs/cidlookup.conf.xml | 33 + .../conf/autoload_configs/conference.conf.xml | 226 + .../conf/autoload_configs/console.conf.xml | 56 + .../conf/autoload_configs/db.conf.xml | 5 + .../dialplan_directory.conf.xml | 9 + .../conf/autoload_configs/dingaling.conf.xml | 9 + .../conf/autoload_configs/directory.conf.xml | 21 + .../autoload_configs/distributor.conf.xml | 10 + .../conf/autoload_configs/easyroute.conf.xml | 28 + .../conf/autoload_configs/enum.conf.xml | 13 + .../autoload_configs/erlang_event.conf.xml | 23 + .../autoload_configs/event_multicast.conf.xml | 14 + .../autoload_configs/event_socket.conf.xml | 9 + .../conf/autoload_configs/fax.conf.xml | 12 + .../conf/autoload_configs/fifo.conf.xml | 10 + .../conf/autoload_configs/hash.conf.xml | 6 + .../conf/autoload_configs/httapi.conf.xml | 127 + .../conf/autoload_configs/http_cache.conf.xml | 10 + .../conf/autoload_configs/ivr.conf.xml | 5 + .../conf/autoload_configs/java.conf.xml | 13 + .../conf/autoload_configs/lcr.conf.xml | 89 + .../autoload_configs/local_stream.conf.xml | 49 + .../conf/autoload_configs/logfile.conf.xml | 29 + .../conf/autoload_configs/lua.conf.xml | 30 + .../conf/autoload_configs/memcache.conf.xml | 6 + .../conf/autoload_configs/modules.conf.xml | 126 + .../conf/autoload_configs/mongo.conf.xml | 20 + .../conf/autoload_configs/nibblebill.conf.xml | 50 + .../conf/autoload_configs/opal.conf.xml | 18 + .../conf/autoload_configs/osp.conf.xml | 53 + .../conf/autoload_configs/perl.conf.xml | 16 + .../autoload_configs/pocketsphinx.conf.xml | 12 + .../conf/autoload_configs/portaudio.conf.xml | 218 + .../post_load_modules.conf.xml | 4 + .../autoload_configs/presence_map.conf.xml | 7 + .../conf/autoload_configs/python.conf.xml | 16 + .../conf/autoload_configs/redis.conf.xml | 7 + .../conf/autoload_configs/rss.conf.xml | 7 + .../conf/autoload_configs/rtmp.conf.xml | 17 + .../autoload_configs/sangoma_codec.conf.xml | 37 + .../conf/autoload_configs/shout.conf.xml | 8 + .../conf/autoload_configs/skinny.conf.xml | 6 + .../conf/autoload_configs/sofia.conf.xml | 19 + .../conf/autoload_configs/spandsp.conf.xml | 108 + .../autoload_configs/spidermonkey.conf.xml | 8 + .../conf/autoload_configs/switch.conf.xml | 165 + .../conf/autoload_configs/syslog.conf.xml | 18 + .../conf/autoload_configs/timezones.conf.xml | 551 ++ .../autoload_configs/tts_commandline.conf.xml | 15 + .../conf/autoload_configs/unicall.conf.xml | 25 + .../conf/autoload_configs/unimrcp.conf.xml | 23 + .../conf/autoload_configs/voicemail.conf.xml | 70 + .../autoload_configs/voicemail_ivr.conf.xml | 208 + .../conf/autoload_configs/xml_cdr.conf.xml | 71 + .../conf/autoload_configs/xml_curl.conf.xml | 49 + .../conf/autoload_configs/xml_rpc.conf.xml | 10 + .../conf/autoload_configs/zeroconf.conf.xml | 6 + includes/templates/conf/chatplan/default.xml | 11 + includes/templates/conf/dialplan/default.xml | 6 + .../dialplan/default/00_ladspa.xml.noload | 77 + .../dialplan/default/00_pizza_demo.xml.noload | 9 + .../default/01_Talking_Clock.xml.noload | 32 + .../default/01_example.com.xml.noload | 30 + includes/templates/conf/dialplan/features.xml | 67 + includes/templates/conf/dialplan/public.xml | 71 + .../dialplan/public/00_inbound_did.xml.noload | 18 + .../conf/dialplan/skinny-patterns.xml | 30 + .../conf/dialplan/skinny-patterns/20-Demo.xml | 8 + .../skinny-patterns/20-Local_extension.xml | 13 + .../dialplan/skinny-patterns/90-External.xml | 8 + .../skinny-patterns/99-Default_Drop.xml | 9 + includes/templates/conf/directory/default.xml | 78 + .../conf/directory/default/brian.xml.noload | 92 + .../conf/directory/default/default.xml.noload | 22 + .../directory/default/example.com.xml.noload | 26 + .../default/skinny-example.xml.noload | 35 + includes/templates/conf/extensions.conf | 21 + includes/templates/conf/freeswitch.xml | 67 + includes/templates/conf/fur_elise.ttml | 83 + .../templates/conf/ivr_menus/demo_ivr.xml | 64 + .../templates/conf/jingle_profiles/client.xml | 32 + .../templates/conf/jingle_profiles/server.xml | 21 + includes/templates/conf/lang/de/de.xml | 11 + includes/templates/conf/lang/de/demo/demo.xml | 71 + includes/templates/conf/lang/de/vm/sounds.xml | 402 ++ includes/templates/conf/lang/de/vm/tts.xml | 213 + .../templates/conf/lang/en/demo/demo-ivr.xml | 145 + includes/templates/conf/lang/en/demo/demo.xml | 71 + .../templates/conf/lang/en/dir/sounds.xml | 119 + includes/templates/conf/lang/en/dir/tts.xml | 95 + includes/templates/conf/lang/en/en.xml | 14 + .../templates/conf/lang/en/ivr/sounds.xml | 134 + .../templates/conf/lang/en/ivr/wakeup.xml | 129 + includes/templates/conf/lang/en/vm/sounds.xml | 430 ++ includes/templates/conf/lang/en/vm/tts.xml | 238 + .../conf/lang/en/vm/voicemail_ivr.xml | 397 ++ includes/templates/conf/lang/fr/demo/demo.xml | 18 + .../templates/conf/lang/fr/dir/sounds.xml | 122 + includes/templates/conf/lang/fr/dir/tts.xml | 101 + includes/templates/conf/lang/fr/fr.xml | 12 + includes/templates/conf/lang/fr/vm/sounds.xml | 244 + .../templates/conf/lang/he/demo/demo-ivr.xml | 146 + includes/templates/conf/lang/he/demo/demo.xml | 71 + .../templates/conf/lang/he/dir/sounds.xml | 122 + includes/templates/conf/lang/he/he.xml | 11 + includes/templates/conf/lang/he/vm/sounds.xml | 406 ++ .../templates/conf/lang/ru/demo/demo-ivr.xml | 145 + includes/templates/conf/lang/ru/demo/demo.xml | 100 + .../templates/conf/lang/ru/dir/sounds.xml | 121 + includes/templates/conf/lang/ru/dir/tts.xml | 96 + includes/templates/conf/lang/ru/ru.xml | 13 + includes/templates/conf/lang/ru/vm/sounds.xml | 365 ++ includes/templates/conf/lang/ru/vm/tts.xml | 239 + includes/templates/conf/mime.types | 983 ++++ .../conf/mrcp_profiles/loquendo-7-mrcp-v2.xml | 32 + .../mrcp_profiles/nuance-1.0.0-mrcp-v1.xml | 39 + .../conf/mrcp_profiles/nuance-5.0-mrcp-v1.xml | 39 + .../conf/mrcp_profiles/nuance-5.0-mrcp-v2.xml | 43 + .../mrcp_profiles/unimrcpserver-mrcp-v1.xml | 27 + .../voxeo-prophecy-8.0-mrcp-v1.xml | 27 + includes/templates/conf/notify-voicemail.tpl | 44 + .../templates/conf/sip_profiles/external.xml | 95 + .../conf/sip_profiles/external/example.xml | 38 + .../conf/sip_profiles/internal-ipv6.xml | 129 + .../templates/conf/sip_profiles/internal.xml | 373 ++ .../conf/sip_profiles/internal/example.xml | 37 + .../conf/skinny_profiles/internal.xml | 37 + includes/templates/conf/tetris.ttml | 69 + includes/templates/conf/vars.xml | 255 + includes/templates/conf/voicemail.tpl | 44 + includes/templates/conf/web-vm.tpl | 13 + .../provision/aastra/675x/{v_mac}.cfg | 118 + .../provision/cisco/spa303/{v_mac}.xml | 2237 ++++++++ .../provision/cisco/spa504g/{v_mac}.xml | 682 +++ .../provision/cisco/spa525g/{v_mac}.xml | 2237 ++++++++ .../provision/linksys/spa2102/{v_mac}.xml | 76 + .../provision/linksys/spa3102/{v_mac}.xml | 95 + .../provision/linksys/spa942/{v_mac}.xml | 29 + .../provision/polycom/650/custom.cfg | 16 + .../provision/polycom/650/phone1.cfg | 35 + .../templates/provision/polycom/650/sip.cfg | 726 +++ .../polycom/650/{v_mac}-registration.cfg | 90 + .../provision/polycom/650/{v_mac}.cfg | 17 + .../provision/polycom/8030/phone1.cfg | 35 + .../templates/provision/polycom/8030/sip.cfg | 726 +++ .../polycom/8030/{v_mac}-registration.cfg | 90 + .../provision/polycom/8030/{v_mac}.cfg | 17 + .../templates/provision/snom/820/{v_mac}.xml | 54 + .../provision/yealink/t20/{v_mac}.cfg | 933 +++ .../provision/yealink/t22/{v_mac}.cfg | 950 ++++ includes/upload.php | 52 + includes/wysiwyg.php | 188 + index.php | 38 + index2.php | 93 + install.php | 1758 ++++++ licenses.php | 154 + login.php | 122 + logout.php | 38 + root.php | 50 + secure/.htaccess | 3 + secure/class.phpmailer.php | 2532 +++++++++ secure/class.smtp.php | 818 +++ secure/fax_to_email.php | 340 ++ secure/htaccess.tmp | 3 + secure/index.php | 32 + secure/root.php | 50 + secure/v_mailto.php | 232 + themes/accessible/background.jpg | Bin 0 -> 1124 bytes themes/accessible/background_black.png | Bin 0 -> 322 bytes themes/accessible/background_cell.gif | Bin 0 -> 128 bytes themes/accessible/background_head.png | Bin 0 -> 339 bytes themes/accessible/background_th.png | Bin 0 -> 324 bytes themes/accessible/background_th_blue.png | Bin 0 -> 324 bytes themes/accessible/background_th_purple.png | Bin 0 -> 310 bytes themes/accessible/blank.gif | Bin 0 -> 49 bytes themes/accessible/config.php | 11 + themes/accessible/logo.png | Bin 0 -> 17569 bytes themes/accessible/menu_background.jpg | Bin 0 -> 1124 bytes themes/accessible/root.php | 50 + themes/accessible/template.php | 533 ++ themes/classic/background.jpg | Bin 0 -> 1124 bytes themes/classic/background_black.png | Bin 0 -> 322 bytes themes/classic/background_cell.gif | Bin 0 -> 128 bytes themes/classic/background_head.png | Bin 0 -> 339 bytes themes/classic/background_th.png | Bin 0 -> 324 bytes themes/classic/background_th_blue.png | Bin 0 -> 324 bytes themes/classic/background_th_purple.png | Bin 0 -> 310 bytes themes/classic/blank.gif | Bin 0 -> 49 bytes themes/classic/config.php | 11 + themes/classic/logo.png | Bin 0 -> 17569 bytes themes/classic/root.php | 50 + themes/classic/template.php | 629 ++ themes/default/arrow.png | Bin 0 -> 389 bytes themes/default/background_black.png | Bin 0 -> 322 bytes themes/default/background_cell.gif | Bin 0 -> 72 bytes themes/default/background_th.png | Bin 0 -> 324 bytes themes/default/blank.gif | Bin 0 -> 49 bytes themes/default/config.php | 11 + themes/default/content_background.png | Bin 0 -> 1977 bytes .../images/backgrounds/yellowstone_1.jpg | Bin 0 -> 242007 bytes themes/default/login_background.png | Bin 0 -> 1787 bytes themes/default/logo.png | Bin 0 -> 17569 bytes themes/default/menu_background.png | Bin 0 -> 2000 bytes themes/default/root.php | 50 + themes/default/template.php | 829 +++ themes/enhanced/background.jpg | Bin 0 -> 1124 bytes themes/enhanced/background_black.png | Bin 0 -> 322 bytes themes/enhanced/background_cell.gif | Bin 0 -> 72 bytes themes/enhanced/background_th.png | Bin 0 -> 324 bytes themes/enhanced/blank.gif | Bin 0 -> 49 bytes themes/enhanced/config.php | 11 + themes/enhanced/content_background.png | Bin 0 -> 1977 bytes .../images/backgrounds/yellowstone_1.jpg | Bin 0 -> 242007 bytes themes/enhanced/login_background.png | Bin 0 -> 1787 bytes themes/enhanced/logo.png | Bin 0 -> 17569 bytes themes/enhanced/menu_background.png | Bin 0 -> 2000 bytes themes/enhanced/root.php | 50 + themes/enhanced/template.php | 783 +++ 1240 files changed, 164946 insertions(+) create mode 100644 .htaccess create mode 100644 app/adminer/adminer.php create mode 100644 app/adminer/app_config.php create mode 100644 app/adminer/index.php create mode 100644 app/adminer/root.php create mode 100644 app/call_broadcast/app_config.php create mode 100644 app/call_broadcast/root.php create mode 100644 app/call_broadcast/v_call_broadcast.php create mode 100644 app/call_broadcast/v_call_broadcast_delete.php create mode 100644 app/call_broadcast/v_call_broadcast_edit.php create mode 100644 app/call_broadcast/v_call_broadcast_send.php create mode 100644 app/call_center/app_config.php create mode 100644 app/call_center/root.php create mode 100644 app/call_center/v_call_center_agent.php create mode 100644 app/call_center/v_call_center_agent_delete.php create mode 100644 app/call_center/v_call_center_agent_edit.php create mode 100644 app/call_center/v_call_center_agent_status.php create mode 100644 app/call_center/v_call_center_queue.php create mode 100644 app/call_center/v_call_center_queue_delete.php create mode 100644 app/call_center/v_call_center_queue_edit.php create mode 100644 app/call_center/v_call_center_tier.php create mode 100644 app/call_center/v_call_center_tier_delete.php create mode 100644 app/call_center/v_call_center_tier_edit.php create mode 100644 app/call_center/v_cmd.php create mode 100644 app/call_center_active/app_config.php create mode 100644 app/call_center_active/root.php create mode 100644 app/call_center_active/v_call_center_active.php create mode 100644 app/call_center_active/v_call_center_active_inc.php create mode 100644 app/call_center_active/v_call_center_exec.php create mode 100644 app/call_center_active/v_call_center_queue.php create mode 100644 app/calls/app_config.php create mode 100644 app/calls/root.php create mode 100644 app/calls/v_call_edit.php create mode 100644 app/calls/v_calls.php create mode 100644 app/calls_active/app_config.php create mode 100644 app/calls_active/root.php create mode 100644 app/calls_active/v_calls_active.php create mode 100644 app/calls_active/v_calls_active_assigned_extensions_inc.php create mode 100644 app/calls_active/v_calls_active_extensions.php create mode 100644 app/calls_active/v_calls_active_extensions_inc.php create mode 100644 app/calls_active/v_calls_active_inc.php create mode 100644 app/calls_active/v_calls_exec.php create mode 100644 app/click_to_call/app_config.php create mode 100644 app/click_to_call/click_to_call.php create mode 100644 app/click_to_call/root.php create mode 100644 app/conferences/app_config.php create mode 100644 app/conferences/conferences.php create mode 100644 app/conferences/conferences_delete.php create mode 100644 app/conferences/conferences_edit.php create mode 100644 app/conferences/root.php create mode 100644 app/conferences_active/app_config.php create mode 100644 app/conferences_active/root.php create mode 100644 app/conferences_active/v_conference_exec.php create mode 100644 app/conferences_active/v_conference_interactive.php create mode 100644 app/conferences_active/v_conference_interactive_inc.php create mode 100644 app/conferences_active/v_conferences_active.php create mode 100644 app/conferences_active/v_conferences_active_inc.php create mode 100644 app/contacts/app_config.php create mode 100644 app/contacts/contact_addresses.php create mode 100644 app/contacts/contact_addresses_delete.php create mode 100644 app/contacts/contact_addresses_edit.php create mode 100644 app/contacts/contact_notes.php create mode 100644 app/contacts/contact_notes_delete.php create mode 100644 app/contacts/contact_notes_edit.php create mode 100644 app/contacts/contact_phones.php create mode 100644 app/contacts/contact_phones_delete.php create mode 100644 app/contacts/contact_phones_edit.php create mode 100644 app/contacts/contacts.php create mode 100644 app/contacts/contacts_delete.php create mode 100644 app/contacts/contacts_edit.php create mode 100644 app/contacts/contacts_vcard.php create mode 100644 app/contacts/root.php create mode 100644 app/content/app_config.php create mode 100644 app/content/config.php create mode 100644 app/content/index.php create mode 100644 app/content/root.php create mode 100644 app/content/rss.css create mode 100644 app/content/rss.php create mode 100644 app/content/rssadd.php create mode 100644 app/content/rsscontent.php create mode 100644 app/content/rssdelete.php create mode 100644 app/content/rsslist.php create mode 100644 app/content/rssmovedown.php create mode 100644 app/content/rssmoveup.php create mode 100644 app/content/rsssearch.php create mode 100644 app/content/rsssubadd.php create mode 100644 app/content/rsssubcategoryadd.php create mode 100644 app/content/rsssubcategorylist.php create mode 100644 app/content/rsssubcategoryupdate.php create mode 100644 app/content/rsssubdelete.php create mode 100644 app/content/rsssublist.php create mode 100644 app/content/rsssubsearch.php create mode 100644 app/content/rsssubupdate.php create mode 100644 app/content/rssupdate.php create mode 100644 app/destinations/app_config.php create mode 100644 app/destinations/destinations.php create mode 100644 app/destinations/destinations_delete.php create mode 100644 app/destinations/destinations_edit.php create mode 100644 app/destinations/root.php create mode 100644 app/dialplan/app_config.php create mode 100644 app/dialplan/app_defaults.php create mode 100644 app/dialplan/dialplan_add.php create mode 100644 app/dialplan/dialplan_advanced.php create mode 100644 app/dialplan/dialplan_copy.php create mode 100644 app/dialplan/dialplan_delete.php create mode 100644 app/dialplan/dialplan_details_delete.php create mode 100644 app/dialplan/dialplan_details_edit.php create mode 100644 app/dialplan/dialplan_edit.php create mode 100644 app/dialplan/dialplans.php create mode 100644 app/dialplan/resources/xml/dialplan/100_call-direction.xml create mode 100644 app/dialplan/resources/xml/dialplan/220_global-intercept.xml create mode 100644 app/dialplan/resources/xml/dialplan/230_group-intercept.xml create mode 100644 app/dialplan/resources/xml/dialplan/240_redial.xml create mode 100644 app/dialplan/resources/xml/dialplan/245_page.xml create mode 100644 app/dialplan/resources/xml/dialplan/250_global.xml create mode 100644 app/dialplan/resources/xml/dialplan/260_eavesdrop.xml create mode 100644 app/dialplan/resources/xml/dialplan/270_call_privacy.xml create mode 100644 app/dialplan/resources/xml/dialplan/280_call_return.xml create mode 100644 app/dialplan/resources/xml/dialplan/290_intercept-ext.xml create mode 100644 app/dialplan/resources/xml/dialplan/300_extension-intercom.xml create mode 100644 app/dialplan/resources/xml/dialplan/310_send_to_voicemail.xml create mode 100644 app/dialplan/resources/xml/dialplan/320_vmain.xml create mode 100644 app/dialplan/resources/xml/dialplan/330_vmain_user.xml create mode 100644 app/dialplan/resources/xml/dialplan/340_delay_echo.xml create mode 100644 app/dialplan/resources/xml/dialplan/350_echo.xml create mode 100644 app/dialplan/resources/xml/dialplan/360_milliwatt.xml create mode 100644 app/dialplan/resources/xml/dialplan/370_tone_stream.xml create mode 100644 app/dialplan/resources/xml/dialplan/380_hold_music.xml create mode 100644 app/dialplan/resources/xml/dialplan/400_recordings.xml create mode 100644 app/dialplan/resources/xml/dialplan/410_freeswitch_conference.xml create mode 100644 app/dialplan/resources/xml/dialplan/420_disa.xml create mode 100644 app/dialplan/resources/xml/dialplan/430_directory.xml create mode 100644 app/dialplan/resources/xml/dialplan/440_wake-up.xml create mode 100644 app/dialplan/resources/xml/dialplan/450_park_in.xml create mode 100644 app/dialplan/resources/xml/dialplan/455_park_out.xml create mode 100644 app/dialplan/resources/xml/dialplan/460_park_slots.xml create mode 100644 app/dialplan/resources/xml/dialplan/999_local_extension.xml create mode 100644 app/dialplan/root.php create mode 100644 app/dialplan_inbound/app_config.php create mode 100644 app/dialplan_inbound/app_defaults.php create mode 100644 app/dialplan_inbound/dialplan_inbound_add.php create mode 100644 app/dialplan_inbound/root.php create mode 100644 app/dialplan_outbound/app_config.php create mode 100644 app/dialplan_outbound/app_defaults.php create mode 100644 app/dialplan_outbound/dialplan_outbound_add.php create mode 100644 app/dialplan_outbound/root.php create mode 100644 app/exec/app_config.php create mode 100644 app/exec/root.php create mode 100644 app/exec/v_exec.php create mode 100644 app/extensions/app_config.php create mode 100644 app/extensions/app_defaults.php create mode 100644 app/extensions/root.php create mode 100644 app/extensions/v_extensions.php create mode 100644 app/extensions/v_extensions_copy.php create mode 100644 app/extensions/v_extensions_delete.php create mode 100644 app/extensions/v_extensions_edit.php create mode 100644 app/fax/app_config.php create mode 100644 app/fax/root.php create mode 100644 app/fax/v_fax.php create mode 100644 app/fax/v_fax_delete.php create mode 100644 app/fax/v_fax_edit.php create mode 100644 app/fax/v_fax_view.php create mode 100644 app/fifo/app_config.php create mode 100644 app/fifo/root.php create mode 100644 app/fifo/v_fifo.php create mode 100644 app/fifo/v_fifo_add.php create mode 100644 app/fifo/v_fifo_delete.php create mode 100644 app/fifo/v_fifo_details_delete.php create mode 100644 app/fifo/v_fifo_details_edit.php create mode 100644 app/fifo/v_fifo_edit.php create mode 100644 app/fifo_agents/app_config.php create mode 100644 app/fifo_agents/fifo_agent/root.php create mode 100644 app/fifo_agents/fifo_agent/v_fifo_agent.php create mode 100644 app/fifo_agents/fifo_agent/v_fifo_agent_edit.php create mode 100644 app/fifo_agents/fifo_agent/v_fifo_agent_login.php create mode 100644 app/fifo_agents/fifo_agent/v_fifo_agent_logout.php create mode 100644 app/fifo_agents/fifo_agent/v_fifo_agent_remote.php create mode 100644 app/fifo_agents/fifo_agent_call_logs/root.php create mode 100644 app/fifo_agents/fifo_agent_call_logs/v_fifo_agent_call_logs.php create mode 100644 app/fifo_agents/fifo_agent_call_logs/v_fifo_agent_call_logs.sql create mode 100644 app/fifo_agents/fifo_agent_call_logs/v_fifo_agent_call_logs_delete.php create mode 100644 app/fifo_agents/fifo_agent_call_logs/v_fifo_agent_call_logs_edit.php create mode 100644 app/fifo_agents/fifo_agent_profiles/root.php create mode 100644 app/fifo_agents/fifo_agent_profiles/v_fifo_agent_profile_members.php create mode 100644 app/fifo_agents/fifo_agent_profiles/v_fifo_agent_profile_members.sql create mode 100644 app/fifo_agents/fifo_agent_profiles/v_fifo_agent_profile_members_delete.php create mode 100644 app/fifo_agents/fifo_agent_profiles/v_fifo_agent_profile_members_edit.php create mode 100644 app/fifo_agents/fifo_agent_profiles/v_fifo_agent_profiles.php create mode 100644 app/fifo_agents/fifo_agent_profiles/v_fifo_agent_profiles.sql create mode 100644 app/fifo_agents/fifo_agent_profiles/v_fifo_agent_profiles_delete.php create mode 100644 app/fifo_agents/fifo_agent_profiles/v_fifo_agent_profiles_edit.php create mode 100644 app/fifo_agents/fifo_agent_status_logs/root.php create mode 100644 app/fifo_agents/fifo_agent_status_logs/v_fifo_agent_status_logs.php create mode 100644 app/fifo_agents/fifo_agent_status_logs/v_fifo_agent_status_logs.sql create mode 100644 app/fifo_agents/fifo_agent_status_logs/v_fifo_agent_status_logs_delete.php create mode 100644 app/fifo_agents/fifo_agent_status_logs/v_fifo_agent_status_logs_edit.php create mode 100644 app/fifo_agents/fifo_languages/root.php create mode 100644 app/fifo_agents/fifo_languages/v_fifo_agent_languages.php create mode 100644 app/fifo_agents/fifo_languages/v_fifo_agent_languages.sql create mode 100644 app/fifo_agents/fifo_languages/v_fifo_agent_languages_delete.php create mode 100644 app/fifo_agents/fifo_languages/v_fifo_agent_languages_edit.php create mode 100644 app/fifo_agents/root.php create mode 100644 app/fifo_agents/v_fifo_agents.php create mode 100644 app/fifo_agents/v_fifo_agents.sql create mode 100644 app/fifo_agents/v_fifo_agents_delete.php create mode 100644 app/fifo_agents/v_fifo_agents_edit.php create mode 100644 app/fifo_list/app_config.php create mode 100644 app/fifo_list/root.php create mode 100644 app/fifo_list/v_fifo_exec.php create mode 100644 app/fifo_list/v_fifo_interactive.php create mode 100644 app/fifo_list/v_fifo_interactive_inc.php create mode 100644 app/fifo_list/v_fifo_list.php create mode 100644 app/fifo_list/v_fifo_list_inc.php create mode 100644 app/gateways/app_config.php create mode 100644 app/gateways/root.php create mode 100644 app/gateways/v_gateways.php create mode 100644 app/gateways/v_gateways_copy.php create mode 100644 app/gateways/v_gateways_delete.php create mode 100644 app/gateways/v_gateways_edit.php create mode 100644 app/grammar_edit/app_config.php create mode 100644 app/grammar_edit/clipadd.php create mode 100644 app/grammar_edit/clipdelete.php create mode 100644 app/grammar_edit/cliplist.php create mode 100644 app/grammar_edit/clipoptions.php create mode 100644 app/grammar_edit/clipoptionslist.php create mode 100644 app/grammar_edit/clipsearch.php create mode 100644 app/grammar_edit/clipupdate.php create mode 100644 app/grammar_edit/filedelete.php create mode 100644 app/grammar_edit/filelist.php create mode 100644 app/grammar_edit/filenew.php create mode 100644 app/grammar_edit/fileoptions.php create mode 100644 app/grammar_edit/fileoptionslist.php create mode 100644 app/grammar_edit/fileread.php create mode 100644 app/grammar_edit/filerename.php create mode 100644 app/grammar_edit/filesave.php create mode 100644 app/grammar_edit/folderdelete.php create mode 100644 app/grammar_edit/foldernew.php create mode 100644 app/grammar_edit/footer.php create mode 100644 app/grammar_edit/header.php create mode 100644 app/grammar_edit/images/Thumbs.db create mode 100644 app/grammar_edit/images/file.gif create mode 100644 app/grammar_edit/images/file.png create mode 100644 app/grammar_edit/images/folder.gif create mode 100644 app/grammar_edit/images/gear.png create mode 100644 app/grammar_edit/images/leaf.gif create mode 100644 app/grammar_edit/images/minus.gif create mode 100644 app/grammar_edit/images/plus.gif create mode 100644 app/grammar_edit/images/program.gif create mode 100644 app/grammar_edit/images/thumbnails/Thumbs.db create mode 100644 app/grammar_edit/images/thumbnails/cliplibrary.png create mode 100644 app/grammar_edit/images/thumbnails/filemanagement.png create mode 100644 app/grammar_edit/images/thumbnails/phpeditor.png create mode 100644 app/grammar_edit/index.php create mode 100644 app/grammar_edit/list.php create mode 100644 app/grammar_edit/readme.txt create mode 100644 app/grammar_edit/root.php create mode 100644 app/hardware_phones/app_config.php create mode 100644 app/hardware_phones/root.php create mode 100644 app/hardware_phones/v_hardware_phones.php create mode 100644 app/hardware_phones/v_hardware_phones_delete.php create mode 100644 app/hardware_phones/v_hardware_phones_edit.php create mode 100644 app/hunt_group/app_config.php create mode 100644 app/hunt_group/root.php create mode 100644 app/hunt_group/v_hunt_group.php create mode 100644 app/hunt_group/v_hunt_group_call_forward.php create mode 100644 app/hunt_group/v_hunt_group_call_forward_edit.php create mode 100644 app/hunt_group/v_hunt_group_copy.php create mode 100644 app/hunt_group/v_hunt_group_delete.php create mode 100644 app/hunt_group/v_hunt_group_destinations_delete.php create mode 100644 app/hunt_group/v_hunt_group_destinations_edit.php create mode 100644 app/hunt_group/v_hunt_group_edit.php create mode 100644 app/ivr_menu/app_config.php create mode 100644 app/ivr_menu/root.php create mode 100644 app/ivr_menu/v_ivr_menu.php create mode 100644 app/ivr_menu/v_ivr_menu_copy.php create mode 100644 app/ivr_menu/v_ivr_menu_delete.php create mode 100644 app/ivr_menu/v_ivr_menu_edit.php create mode 100644 app/ivr_menu/v_ivr_menu_options.php create mode 100644 app/ivr_menu/v_ivr_menu_options_delete.php create mode 100644 app/ivr_menu/v_ivr_menu_options_edit.php create mode 100644 app/log_viewer/app_config.php create mode 100644 app/log_viewer/log_viewer.php create mode 100644 app/log_viewer/root.php create mode 100644 app/modules/app_config.php create mode 100644 app/modules/app_defaults.php create mode 100644 app/modules/root.php create mode 100644 app/modules/v_modules.php create mode 100644 app/modules/v_modules_delete.php create mode 100644 app/modules/v_modules_edit.php create mode 100644 app/music_on_hold/app_config.php create mode 100644 app/music_on_hold/root.php create mode 100644 app/music_on_hold/slim.swf create mode 100644 app/music_on_hold/v_music_on_hold.php create mode 100644 app/music_on_hold/v_music_on_hold_play.php create mode 100644 app/php_edit/app_config.php create mode 100644 app/php_edit/app_defaults.php create mode 100644 app/php_edit/clipadd.php create mode 100644 app/php_edit/clipdelete.php create mode 100644 app/php_edit/cliplist.php create mode 100644 app/php_edit/clipoptions.php create mode 100644 app/php_edit/clipoptionslist.php create mode 100644 app/php_edit/clipsearch.php create mode 100644 app/php_edit/clipupdate.php create mode 100644 app/php_edit/filedelete.php create mode 100644 app/php_edit/filelist.php create mode 100644 app/php_edit/filenew.php create mode 100644 app/php_edit/fileoptions.php create mode 100644 app/php_edit/fileoptionslist.php create mode 100644 app/php_edit/fileread.php create mode 100644 app/php_edit/filerename.php create mode 100644 app/php_edit/filesave.php create mode 100644 app/php_edit/folderdelete.php create mode 100644 app/php_edit/foldernew.php create mode 100644 app/php_edit/footer.php create mode 100644 app/php_edit/header.php create mode 100644 app/php_edit/images/Thumbs.db create mode 100644 app/php_edit/images/file.gif create mode 100644 app/php_edit/images/file.png create mode 100644 app/php_edit/images/folder.gif create mode 100644 app/php_edit/images/gear.png create mode 100644 app/php_edit/images/leaf.gif create mode 100644 app/php_edit/images/minus.gif create mode 100644 app/php_edit/images/plus.gif create mode 100644 app/php_edit/images/program.gif create mode 100644 app/php_edit/images/thumbnails/Thumbs.db create mode 100644 app/php_edit/images/thumbnails/cliplibrary.png create mode 100644 app/php_edit/images/thumbnails/filemanagement.png create mode 100644 app/php_edit/images/thumbnails/phpeditor.png create mode 100644 app/php_edit/index.php create mode 100644 app/php_edit/list.php create mode 100644 app/php_edit/readme.txt create mode 100644 app/php_edit/root.php create mode 100644 app/php_service/app_config.php create mode 100644 app/php_service/root.php create mode 100644 app/php_service/v_php_service.php create mode 100644 app/php_service/v_php_service_delete.php create mode 100644 app/php_service/v_php_service_edit.php create mode 100644 app/provision/app_config.php create mode 100644 app/provision/index.php create mode 100644 app/provision/provision_write.php create mode 100644 app/provision/root.php create mode 100644 app/provision_editor/app_config.php create mode 100644 app/provision_editor/clip.db create mode 100644 app/provision_editor/clipadd.php create mode 100644 app/provision_editor/clipdelete.php create mode 100644 app/provision_editor/cliplist.php create mode 100644 app/provision_editor/clipoptions.php create mode 100644 app/provision_editor/clipoptionslist.php create mode 100644 app/provision_editor/clipsearch.php create mode 100644 app/provision_editor/clipupdate.php create mode 100644 app/provision_editor/config.php create mode 100644 app/provision_editor/filedelete.php create mode 100644 app/provision_editor/filelist.php create mode 100644 app/provision_editor/filenew.php create mode 100644 app/provision_editor/fileoptions.php create mode 100644 app/provision_editor/fileoptionslist.php create mode 100644 app/provision_editor/fileread.php create mode 100644 app/provision_editor/filerename.php create mode 100644 app/provision_editor/filesave.php create mode 100644 app/provision_editor/folderdelete.php create mode 100644 app/provision_editor/foldernew.php create mode 100644 app/provision_editor/footer.php create mode 100644 app/provision_editor/header.php create mode 100644 app/provision_editor/images/file.gif create mode 100644 app/provision_editor/images/file.png create mode 100644 app/provision_editor/images/folder.gif create mode 100644 app/provision_editor/images/gear.png create mode 100644 app/provision_editor/images/leaf.gif create mode 100644 app/provision_editor/images/minus.gif create mode 100644 app/provision_editor/images/plus.gif create mode 100644 app/provision_editor/images/program.gif create mode 100644 app/provision_editor/images/thumbnails/Thumbs.db create mode 100644 app/provision_editor/images/thumbnails/cliplibrary.png create mode 100644 app/provision_editor/images/thumbnails/filemanagement.png create mode 100644 app/provision_editor/images/thumbnails/phpeditor.png create mode 100644 app/provision_editor/index.php create mode 100644 app/provision_editor/list.php create mode 100644 app/provision_editor/readme.txt create mode 100644 app/provision_editor/root.php create mode 100644 app/recordings/app_config.php create mode 100644 app/recordings/app_defaults.php create mode 100644 app/recordings/root.php create mode 100644 app/recordings/slim.swf create mode 100644 app/recordings/v_recordings.php create mode 100644 app/recordings/v_recordings_delete.php create mode 100644 app/recordings/v_recordings_edit.php create mode 100644 app/recordings/v_recordings_play.php create mode 100644 app/registrations/app_config.php create mode 100644 app/registrations/root.php create mode 100644 app/registrations/v_status_registrations.php create mode 100644 app/ring_groups/app_config.php create mode 100644 app/ring_groups/ring_groups.php create mode 100644 app/ring_groups/ring_groups_delete.php create mode 100644 app/ring_groups/ring_groups_edit.php create mode 100644 app/ring_groups/root.php create mode 100644 app/script_edit/app_config.php create mode 100644 app/script_edit/clipadd.php create mode 100644 app/script_edit/clipdelete.php create mode 100644 app/script_edit/cliplist.php create mode 100644 app/script_edit/clipoptions.php create mode 100644 app/script_edit/clipoptionslist.php create mode 100644 app/script_edit/clipsearch.php create mode 100644 app/script_edit/clipupdate.php create mode 100644 app/script_edit/filedelete.php create mode 100644 app/script_edit/filelist.php create mode 100644 app/script_edit/filenew.php create mode 100644 app/script_edit/fileoptions.php create mode 100644 app/script_edit/fileoptionslist.php create mode 100644 app/script_edit/fileread.php create mode 100644 app/script_edit/filerename.php create mode 100644 app/script_edit/filesave.php create mode 100644 app/script_edit/folderdelete.php create mode 100644 app/script_edit/foldernew.php create mode 100644 app/script_edit/footer.php create mode 100644 app/script_edit/header.php create mode 100644 app/script_edit/images/Thumbs.db create mode 100644 app/script_edit/images/file.gif create mode 100644 app/script_edit/images/file.png create mode 100644 app/script_edit/images/folder.gif create mode 100644 app/script_edit/images/gear.png create mode 100644 app/script_edit/images/leaf.gif create mode 100644 app/script_edit/images/minus.gif create mode 100644 app/script_edit/images/plus.gif create mode 100644 app/script_edit/images/program.gif create mode 100644 app/script_edit/images/thumbnails/Thumbs.db create mode 100644 app/script_edit/images/thumbnails/cliplibrary.png create mode 100644 app/script_edit/images/thumbnails/filemanagement.png create mode 100644 app/script_edit/images/thumbnails/phpeditor.png create mode 100644 app/script_edit/index.php create mode 100644 app/script_edit/list.php create mode 100644 app/script_edit/readme.txt create mode 100644 app/script_edit/root.php create mode 100644 app/services/app_config.php create mode 100644 app/services/root.php create mode 100644 app/services/v_services.php create mode 100644 app/services/v_services_delete.php create mode 100644 app/services/v_services_edit.php create mode 100644 app/settings/app_config.php create mode 100644 app/settings/root.php create mode 100644 app/settings/v_settings_edit.php create mode 100644 app/signup/app_config.php create mode 100644 app/signup/config.php.dist create mode 100644 app/signup/root.php create mode 100644 app/signup/signup.php create mode 100644 app/signup/user_template.php create mode 100644 app/signup/v_fields.php create mode 100644 app/sip_profiles/app_config.php create mode 100644 app/sip_profiles/app_defaults.php create mode 100644 app/sip_profiles/resources/xml/sip_profiles/default.xml create mode 100644 app/sip_profiles/resources/xml/sip_profiles/external.xml create mode 100644 app/sip_profiles/resources/xml/sip_profiles/internal-ipv6.xml create mode 100644 app/sip_profiles/resources/xml/sip_profiles/internal.xml create mode 100644 app/sip_profiles/root.php create mode 100644 app/sip_profiles/sip_profile_copy.php create mode 100644 app/sip_profiles/sip_profile_settings.php create mode 100644 app/sip_profiles/sip_profile_settings_delete.php create mode 100644 app/sip_profiles/sip_profile_settings_edit.php create mode 100644 app/sip_profiles/sip_profiles.php create mode 100644 app/sip_profiles/sip_profiles_delete.php create mode 100644 app/sip_profiles/sip_profiles_edit.php create mode 100644 app/sip_status/app_config.php create mode 100644 app/sip_status/cmd.php create mode 100644 app/sip_status/root.php create mode 100644 app/sip_status/sip_status.php create mode 100644 app/sql_query/app_config.php create mode 100644 app/sql_query/root.php create mode 100644 app/sql_query/v_sql_backup.php create mode 100644 app/sql_query/v_sql_db_conversion.php create mode 100644 app/sql_query/v_sql_query.php create mode 100644 app/sql_query/v_sql_query_db.php create mode 100644 app/sql_query/v_sql_query_pdo.php create mode 100644 app/sql_query/v_sql_query_result.php create mode 100644 app/system/app_config.php create mode 100644 app/system/root.php create mode 100644 app/system/system.php create mode 100644 app/time_conditions/app_config.php create mode 100644 app/time_conditions/root.php create mode 100644 app/time_conditions/time_condition_add.php create mode 100644 app/traffic_graph/app_config.php create mode 100644 app/traffic_graph/root.php create mode 100644 app/traffic_graph/status_graph.php create mode 100644 app/traffic_graph/status_interface.php create mode 100644 app/traffic_graph/svg_graph.php create mode 100644 app/users/app_config.php create mode 100644 app/users/root.php create mode 100644 app/users/usersupdate.php create mode 100644 app/vars/app_config.php create mode 100644 app/vars/app_defaults.php create mode 100644 app/vars/root.php create mode 100644 app/vars/v_vars.php create mode 100644 app/vars/v_vars.textarea.php create mode 100644 app/vars/v_vars_delete.php create mode 100644 app/vars/v_vars_edit.php create mode 100644 app/virtual_tables/app_config.php create mode 100644 app/virtual_tables/root.php create mode 100644 app/virtual_tables/v_virtual_table_data_delete.php create mode 100644 app/virtual_tables/v_virtual_table_data_edit.php create mode 100644 app/virtual_tables/v_virtual_table_data_types_name_value.php create mode 100644 app/virtual_tables/v_virtual_table_data_types_name_value_delete.php create mode 100644 app/virtual_tables/v_virtual_table_data_types_name_value_edit.php create mode 100644 app/virtual_tables/v_virtual_table_data_view.php create mode 100644 app/virtual_tables/v_virtual_table_fields.php create mode 100644 app/virtual_tables/v_virtual_table_fields_delete.php create mode 100644 app/virtual_tables/v_virtual_table_fields_edit.php create mode 100644 app/virtual_tables/v_virtual_tables.php create mode 100644 app/virtual_tables/v_virtual_tables_delete.php create mode 100644 app/virtual_tables/v_virtual_tables_edit.php create mode 100644 app/virtual_tables/v_virtual_tables_import.php create mode 100644 app/voicemail_greetings/app_config.php create mode 100644 app/voicemail_greetings/root.php create mode 100644 app/voicemail_greetings/v_voicemail_greetings.php create mode 100644 app/voicemail_greetings/v_voicemail_greetings_delete.php create mode 100644 app/voicemail_greetings/v_voicemail_greetings_edit.php create mode 100644 app/voicemail_greetings/v_voicemail_greetings_play.php create mode 100644 app/voicemail_msgs/app_config.php create mode 100644 app/voicemail_msgs/root.php create mode 100644 app/voicemail_msgs/v_voicemail_msgs.php create mode 100644 app/voicemail_msgs/v_voicemail_msgs_delete.php create mode 100644 app/voicemail_msgs/v_voicemail_msgs_password.php create mode 100644 app/voicemail_msgs/v_voicemail_msgs_play.php create mode 100644 app/voicemail_status/app_config.php create mode 100644 app/voicemail_status/root.php create mode 100644 app/voicemail_status/v_voicemail.php create mode 100644 app/voicemail_status/v_voicemail_prefs_delete.php create mode 100644 app/xml_cdr/app_config.php create mode 100644 app/xml_cdr/app_defaults.php create mode 100644 app/xml_cdr/root.php create mode 100644 app/xml_cdr/v_xml_cdr_import.php create mode 100644 app/xml_cdr/xml_cdr.php create mode 100644 app/xml_cdr/xml_cdr_csv.php create mode 100644 app/xml_cdr/xml_cdr_details.php create mode 100644 app/xml_cdr/xml_cdr_import_update.php create mode 100644 app/xml_cdr/xml_cdr_inc.php create mode 100644 app/xml_cdr/xml_cdr_search.php create mode 100644 app/xml_cdr/xml_cdr_statistics.php create mode 100644 app/xml_cdr/xml_cdr_statistics_csv.php create mode 100644 app/xml_cdr/xml_cdr_statistics_inc.php create mode 100644 app/xml_edit/app_config.php create mode 100644 app/xml_edit/clip.db create mode 100644 app/xml_edit/clipadd.php create mode 100644 app/xml_edit/clipdelete.php create mode 100644 app/xml_edit/cliplist.php create mode 100644 app/xml_edit/clipoptions.php create mode 100644 app/xml_edit/clipoptionslist.php create mode 100644 app/xml_edit/clipsearch.php create mode 100644 app/xml_edit/clipupdate.php create mode 100644 app/xml_edit/config.php create mode 100644 app/xml_edit/filedelete.php create mode 100644 app/xml_edit/filelist.php create mode 100644 app/xml_edit/filenew.php create mode 100644 app/xml_edit/fileoptions.php create mode 100644 app/xml_edit/fileoptionslist.php create mode 100644 app/xml_edit/fileread.php create mode 100644 app/xml_edit/filerename.php create mode 100644 app/xml_edit/filesave.php create mode 100644 app/xml_edit/folderdelete.php create mode 100644 app/xml_edit/foldernew.php create mode 100644 app/xml_edit/footer.php create mode 100644 app/xml_edit/header.php create mode 100644 app/xml_edit/images/Thumbs.db create mode 100644 app/xml_edit/images/file.gif create mode 100644 app/xml_edit/images/file.png create mode 100644 app/xml_edit/images/folder.gif create mode 100644 app/xml_edit/images/gear.png create mode 100644 app/xml_edit/images/leaf.gif create mode 100644 app/xml_edit/images/minus.gif create mode 100644 app/xml_edit/images/plus.gif create mode 100644 app/xml_edit/images/program.gif create mode 100644 app/xml_edit/images/thumbnails/Thumbs.db create mode 100644 app/xml_edit/images/thumbnails/cliplibrary.png create mode 100644 app/xml_edit/images/thumbnails/filemanagement.png create mode 100644 app/xml_edit/images/thumbnails/phpeditor.png create mode 100644 app/xml_edit/index.php create mode 100644 app/xml_edit/list.php create mode 100644 app/xml_edit/readme.txt create mode 100644 app/xml_edit/root.php create mode 100644 app/xmpp/README create mode 100644 app/xmpp/app_config.php create mode 100644 app/xmpp/client_template.php create mode 100644 app/xmpp/db_create.php create mode 100644 app/xmpp/errors.php create mode 100644 app/xmpp/profile_edit.php create mode 100644 app/xmpp/profile_list.php create mode 100644 app/xmpp/root.php create mode 100644 app/xmpp/update_complete.php create mode 100644 app/xmpp/v_profile_delete.php create mode 100644 app/xmpp/v_profile_edit.php create mode 100644 app/xmpp/v_xmpp.php create mode 100644 core/apps/app_config.php create mode 100644 core/apps/apps.php create mode 100644 core/apps/apps_delete.php create mode 100644 core/apps/apps_edit.php create mode 100644 core/apps/root.php create mode 100644 core/backup/backup.php create mode 100644 core/backup/backupandrestore.php create mode 100644 core/backup/root.php create mode 100644 core/databases/app_config.php create mode 100644 core/databases/database_delete.php create mode 100644 core/databases/database_edit.php create mode 100644 core/databases/databases.php create mode 100644 core/databases/root.php create mode 100644 core/default_settings/app_config.php create mode 100644 core/default_settings/app_defaults.php create mode 100644 core/default_settings/default_settings.php create mode 100644 core/default_settings/default_settings_delete.php create mode 100644 core/default_settings/default_settings_edit.php create mode 100644 core/default_settings/root.php create mode 100644 core/domains/app_config.php create mode 100644 core/domains/app_defaults.php create mode 100644 core/domains/domain_settings.php create mode 100644 core/domains/domain_settings_delete.php create mode 100644 core/domains/domain_settings_edit.php create mode 100644 core/domains/domains.php create mode 100644 core/domains/domains_delete.php create mode 100644 core/domains/domains_edit.php create mode 100644 core/domains/root.php create mode 100644 core/menu/app_config.php create mode 100644 core/menu/app_defaults.php create mode 100644 core/menu/menu.php create mode 100644 core/menu/menu_delete.php create mode 100644 core/menu/menu_edit.php create mode 100644 core/menu/menu_item_delete.php create mode 100644 core/menu/menu_item_edit.php create mode 100644 core/menu/menu_item_list.php create mode 100644 core/menu/menu_item_move_down.php create mode 100644 core/menu/menu_item_move_up.php create mode 100644 core/menu/menu_restore_default.php create mode 100644 core/menu/root.php create mode 100644 core/servers/app_config.php create mode 100644 core/servers/root.php create mode 100644 core/servers/v_server_settings.php create mode 100644 core/servers/v_server_settings_delete.php create mode 100644 core/servers/v_server_settings_edit.php create mode 100644 core/servers/v_servers.php create mode 100644 core/servers/v_servers_delete.php create mode 100644 core/servers/v_servers_edit.php create mode 100644 core/upgrade/app_config.php create mode 100644 core/upgrade/app_defaults.php create mode 100644 core/upgrade/root.php create mode 100644 core/upgrade/upgrade.php create mode 100644 core/upgrade/upgrade_domains.php create mode 100644 core/upgrade/upgrade_schema.php create mode 100644 core/upgrade/upgrade_svn.php create mode 100644 core/users/app_config.php create mode 100644 core/users/app_defaults.php create mode 100644 core/users/group_permissions.php create mode 100644 core/users/groupadd.php create mode 100644 core/users/groupdelete.php create mode 100644 core/users/grouplist.php create mode 100644 core/users/groupmemberadd.php create mode 100644 core/users/groupmemberdelete.php create mode 100644 core/users/groupmembers.php create mode 100644 core/users/index.php create mode 100644 core/users/root.php create mode 100644 core/users/signup.php create mode 100644 core/users/userdelete.php create mode 100644 core/users/userlist.php create mode 100644 core/users/usersupdate.php create mode 100644 favicon.ico create mode 100644 images/background_cell_active.gif create mode 100644 images/background_cell_conference.gif create mode 100644 images/background_cell_fifo.gif create mode 100644 images/background_cell_light.gif create mode 100644 images/blank.gif create mode 100644 images/icon_cal.gif create mode 100644 images/icon_e.gif create mode 100644 images/icon_e.png create mode 100644 images/icon_plus.gif create mode 100644 images/icon_plus.png create mode 100644 images/icon_restart.gif create mode 100644 images/icon_start.gif create mode 100644 images/icon_stop.gif create mode 100644 images/icon_up.gif create mode 100644 images/icon_view.gif create mode 100644 images/icon_x.gif create mode 100644 images/icon_x.png create mode 100644 includes/calendar_lw_layers.js create mode 100644 includes/calendar_lw_menu.js create mode 100644 includes/calendar_popcalendar.js create mode 100644 includes/captcha/config.php create mode 100644 includes/captcha/fonts/ROUGD.TTF create mode 100644 includes/captcha/fonts/Zebra.ttf create mode 100644 includes/captcha/fonts/hanshand.ttf create mode 100644 includes/captcha/img.php create mode 100644 includes/captcha/root.php create mode 100644 includes/checkauth.php create mode 100644 includes/checkstring.php create mode 100644 includes/class.phpmailer.php create mode 100644 includes/class.smtp.php create mode 100644 includes/class_vcard.php create mode 100644 includes/classes/array_order.php create mode 100644 includes/classes/call_forward.php create mode 100644 includes/classes/database.php create mode 100644 includes/classes/dialplan.php create mode 100644 includes/classes/do_not_disturb.php create mode 100644 includes/classes/follow_me.php create mode 100644 includes/classes/install.php create mode 100644 includes/classes/menu.php create mode 100644 includes/classes/root.php create mode 100644 includes/classes/schema.php create mode 100644 includes/classes/switch_directory.php create mode 100644 includes/classes/switch_fax.php create mode 100644 includes/classes/switch_ivr_menu.php create mode 100644 includes/classes/switch_modules.php create mode 100644 includes/cmd.php create mode 100644 includes/config.php.dist create mode 100644 includes/directory.php create mode 100644 includes/download.php create mode 100644 includes/edit_area/edit_area_full.gz create mode 100644 includes/edit_area/edit_area_full.js create mode 100644 includes/edit_area/images/autocompletion.gif create mode 100644 includes/edit_area/images/close.gif create mode 100644 includes/edit_area/images/fullscreen.gif create mode 100644 includes/edit_area/images/go_to_line.gif create mode 100644 includes/edit_area/images/help.gif create mode 100644 includes/edit_area/images/highlight.gif create mode 100644 includes/edit_area/images/load.gif create mode 100644 includes/edit_area/images/move.gif create mode 100644 includes/edit_area/images/newdocument.gif create mode 100644 includes/edit_area/images/opacity.png create mode 100644 includes/edit_area/images/processing.gif create mode 100644 includes/edit_area/images/redo.gif create mode 100644 includes/edit_area/images/reset_highlight.gif create mode 100644 includes/edit_area/images/save.gif create mode 100644 includes/edit_area/images/search.gif create mode 100644 includes/edit_area/images/smooth_selection.gif create mode 100644 includes/edit_area/images/spacer.gif create mode 100644 includes/edit_area/images/statusbar_resize.gif create mode 100644 includes/edit_area/images/undo.gif create mode 100644 includes/edit_area/images/word_wrap.gif create mode 100644 includes/edit_area/langs/bg.js create mode 100644 includes/edit_area/langs/cs.js create mode 100644 includes/edit_area/langs/de.js create mode 100644 includes/edit_area/langs/dk.js create mode 100644 includes/edit_area/langs/en.js create mode 100644 includes/edit_area/langs/eo.js create mode 100644 includes/edit_area/langs/es.js create mode 100644 includes/edit_area/langs/fi.js create mode 100644 includes/edit_area/langs/fr.js create mode 100644 includes/edit_area/langs/hr.js create mode 100644 includes/edit_area/langs/it.js create mode 100644 includes/edit_area/langs/ja.js create mode 100644 includes/edit_area/langs/mk.js create mode 100644 includes/edit_area/langs/nl.js create mode 100644 includes/edit_area/langs/pl.js create mode 100644 includes/edit_area/langs/pt.js create mode 100644 includes/edit_area/langs/ru.js create mode 100644 includes/edit_area/langs/sk.js create mode 100644 includes/edit_area/langs/zh.js create mode 100644 includes/edit_area/plugins/charmap/charmap.js create mode 100644 includes/edit_area/plugins/charmap/css/charmap.css create mode 100644 includes/edit_area/plugins/charmap/images/charmap.gif create mode 100644 includes/edit_area/plugins/charmap/jscripts/map.js create mode 100644 includes/edit_area/plugins/charmap/langs/bg.js create mode 100644 includes/edit_area/plugins/charmap/langs/cs.js create mode 100644 includes/edit_area/plugins/charmap/langs/de.js create mode 100644 includes/edit_area/plugins/charmap/langs/dk.js create mode 100644 includes/edit_area/plugins/charmap/langs/en.js create mode 100644 includes/edit_area/plugins/charmap/langs/eo.js create mode 100644 includes/edit_area/plugins/charmap/langs/es.js create mode 100644 includes/edit_area/plugins/charmap/langs/fr.js create mode 100644 includes/edit_area/plugins/charmap/langs/hr.js create mode 100644 includes/edit_area/plugins/charmap/langs/it.js create mode 100644 includes/edit_area/plugins/charmap/langs/ja.js create mode 100644 includes/edit_area/plugins/charmap/langs/mk.js create mode 100644 includes/edit_area/plugins/charmap/langs/nl.js create mode 100644 includes/edit_area/plugins/charmap/langs/pl.js create mode 100644 includes/edit_area/plugins/charmap/langs/pt.js create mode 100644 includes/edit_area/plugins/charmap/langs/ru.js create mode 100644 includes/edit_area/plugins/charmap/langs/sk.js create mode 100644 includes/edit_area/plugins/charmap/langs/zh.js create mode 100644 includes/edit_area/plugins/charmap/popup.html create mode 100644 includes/edit_area/plugins/test/css/test.css create mode 100644 includes/edit_area/plugins/test/images/Thumbs.db create mode 100644 includes/edit_area/plugins/test/images/test.gif create mode 100644 includes/edit_area/plugins/test/langs/bg.js create mode 100644 includes/edit_area/plugins/test/langs/cs.js create mode 100644 includes/edit_area/plugins/test/langs/de.js create mode 100644 includes/edit_area/plugins/test/langs/dk.js create mode 100644 includes/edit_area/plugins/test/langs/en.js create mode 100644 includes/edit_area/plugins/test/langs/eo.js create mode 100644 includes/edit_area/plugins/test/langs/es.js create mode 100644 includes/edit_area/plugins/test/langs/fr.js create mode 100644 includes/edit_area/plugins/test/langs/hr.js create mode 100644 includes/edit_area/plugins/test/langs/it.js create mode 100644 includes/edit_area/plugins/test/langs/ja.js create mode 100644 includes/edit_area/plugins/test/langs/mk.js create mode 100644 includes/edit_area/plugins/test/langs/nl.js create mode 100644 includes/edit_area/plugins/test/langs/pl.js create mode 100644 includes/edit_area/plugins/test/langs/pt.js create mode 100644 includes/edit_area/plugins/test/langs/ru.js create mode 100644 includes/edit_area/plugins/test/langs/sk.js create mode 100644 includes/edit_area/plugins/test/langs/zh.js create mode 100644 includes/edit_area/plugins/test/test.js create mode 100644 includes/edit_area/plugins/test/test2.js create mode 100644 includes/edit_area/reg_syntax/basic.js create mode 100644 includes/edit_area/reg_syntax/brainfuck.js create mode 100644 includes/edit_area/reg_syntax/c.js create mode 100644 includes/edit_area/reg_syntax/coldfusion.js create mode 100644 includes/edit_area/reg_syntax/cpp.js create mode 100644 includes/edit_area/reg_syntax/css.js create mode 100644 includes/edit_area/reg_syntax/html.js create mode 100644 includes/edit_area/reg_syntax/java.js create mode 100644 includes/edit_area/reg_syntax/js.js create mode 100644 includes/edit_area/reg_syntax/pas.js create mode 100644 includes/edit_area/reg_syntax/perl.js create mode 100644 includes/edit_area/reg_syntax/php.js create mode 100644 includes/edit_area/reg_syntax/python.js create mode 100644 includes/edit_area/reg_syntax/robotstxt.js create mode 100644 includes/edit_area/reg_syntax/ruby.js create mode 100644 includes/edit_area/reg_syntax/sql.js create mode 100644 includes/edit_area/reg_syntax/tsql.js create mode 100644 includes/edit_area/reg_syntax/vb.js create mode 100644 includes/edit_area/reg_syntax/xml.js create mode 100644 includes/email_address_validator.php create mode 100644 includes/footer.php create mode 100644 includes/fpdf/font/courier.php create mode 100644 includes/fpdf/font/courierb.php create mode 100644 includes/fpdf/font/courierbi.php create mode 100644 includes/fpdf/font/courieri.php create mode 100644 includes/fpdf/font/helvetica.php create mode 100644 includes/fpdf/font/helveticab.php create mode 100644 includes/fpdf/font/helveticabi.php create mode 100644 includes/fpdf/font/helveticai.php create mode 100644 includes/fpdf/font/symbol.php create mode 100644 includes/fpdf/font/times.php create mode 100644 includes/fpdf/font/timesb.php create mode 100644 includes/fpdf/font/timesbi.php create mode 100644 includes/fpdf/font/timesi.php create mode 100644 includes/fpdf/font/zapfdingbats.php create mode 100644 includes/fpdf/fpdf.php create mode 100644 includes/header.php create mode 100644 includes/install/autoload_configs/cdr_csv.conf.xml create mode 100644 includes/install/dialplan/default.xml create mode 100644 includes/install/htdocs/license.txt create mode 100644 includes/install/htdocs/slim.swf create mode 100644 includes/install/htdocs/slimtest.htm create mode 100644 includes/install/lang/en/en.xml create mode 100644 includes/install/lang/en/wakeup/sounds.xml create mode 100644 includes/install/scripts/call_broadcast_originate.js create mode 100644 includes/install/scripts/call_forward.lua create mode 100644 includes/install/scripts/disa.lua create mode 100644 includes/install/scripts/eavesdrop.lua create mode 100644 includes/install/scripts/fax_retry.lua create mode 100644 includes/install/scripts/fifo_member.lua create mode 100644 includes/install/scripts/huntgroup_originate.lua create mode 100644 includes/install/scripts/intercept.lua create mode 100644 includes/install/scripts/originate.js create mode 100644 includes/install/scripts/page.lua create mode 100644 includes/install/scripts/park.lua create mode 100644 includes/install/scripts/park_monitor.lua create mode 100644 includes/install/scripts/pin_number.lua create mode 100644 includes/install/scripts/recordings.lua create mode 100644 includes/install/scripts/ring_group.lua create mode 100644 includes/install/scripts/roku.lua create mode 100644 includes/install/scripts/wakeup.lua create mode 100644 includes/install/sounds/en/us/callie/custom/16000/4.wav create mode 100644 includes/install/sounds/en/us/callie/custom/16000/a.wav create mode 100644 includes/install/sounds/en/us/callie/custom/16000/accept.wav create mode 100644 includes/install/sounds/en/us/callie/custom/16000/and.wav create mode 100644 includes/install/sounds/en/us/callie/custom/16000/been.wav create mode 100644 includes/install/sounds/en/us/callie/custom/16000/begin.wav create mode 100644 includes/install/sounds/en/us/callie/custom/16000/begin_recording.wav create mode 100644 includes/install/sounds/en/us/callie/custom/16000/call.wav create mode 100644 includes/install/sounds/en/us/callie/custom/16000/call_forward_has_been_deleted.wav create mode 100644 includes/install/sounds/en/us/callie/custom/16000/call_forward_has_been_set.wav create mode 100644 includes/install/sounds/en/us/callie/custom/16000/calling.wav create mode 100644 includes/install/sounds/en/us/callie/custom/16000/cancel.wav create mode 100644 includes/install/sounds/en/us/callie/custom/16000/delete.wav create mode 100644 includes/install/sounds/en/us/callie/custom/16000/digit.wav create mode 100644 includes/install/sounds/en/us/callie/custom/16000/digits.wav create mode 100644 includes/install/sounds/en/us/callie/custom/16000/enter.wav create mode 100644 includes/install/sounds/en/us/callie/custom/16000/exit.wav create mode 100644 includes/install/sounds/en/us/callie/custom/16000/extension.wav create mode 100644 includes/install/sounds/en/us/callie/custom/16000/followme_menu.wav create mode 100644 includes/install/sounds/en/us/callie/custom/16000/for.wav create mode 100644 includes/install/sounds/en/us/callie/custom/16000/forward.wav create mode 100644 includes/install/sounds/en/us/callie/custom/16000/goodbye.wav create mode 100644 includes/install/sounds/en/us/callie/custom/16000/has.wav create mode 100644 includes/install/sounds/en/us/callie/custom/16000/hours.wav create mode 100644 includes/install/sounds/en/us/callie/custom/16000/incorrect.wav create mode 100644 includes/install/sounds/en/us/callie/custom/16000/is.wav create mode 100644 includes/install/sounds/en/us/callie/custom/16000/m.wav create mode 100644 includes/install/sounds/en/us/callie/custom/16000/minutes.wav create mode 100644 includes/install/sounds/en/us/callie/custom/16000/name.wav create mode 100644 includes/install/sounds/en/us/callie/custom/16000/new.wav create mode 100644 includes/install/sounds/en/us/callie/custom/16000/now.wav create mode 100644 includes/install/sounds/en/us/callie/custom/16000/number.wav create mode 100644 includes/install/sounds/en/us/callie/custom/16000/or.wav create mode 100644 includes/install/sounds/en/us/callie/custom/16000/p.wav create mode 100644 includes/install/sounds/en/us/callie/custom/16000/pin.wav create mode 100644 includes/install/sounds/en/us/callie/custom/16000/please.wav create mode 100644 includes/install/sounds/en/us/callie/custom/16000/please_enter_the_extension_number.wav create mode 100644 includes/install/sounds/en/us/callie/custom/16000/please_enter_the_phone_number.wav create mode 100644 includes/install/sounds/en/us/callie/custom/16000/please_enter_the_pin_number.wav create mode 100644 includes/install/sounds/en/us/callie/custom/16000/please_enter_the_recording_number.wav create mode 100644 includes/install/sounds/en/us/callie/custom/16000/please_enter_your_pin_number.wav create mode 100644 includes/install/sounds/en/us/callie/custom/16000/please_say_your_name_and_reason_for_calling.wav create mode 100644 includes/install/sounds/en/us/callie/custom/16000/press.wav create mode 100644 includes/install/sounds/en/us/callie/custom/16000/press_1_to_accept_2_to_reject_or_3_for_voicemail.wav create mode 100644 includes/install/sounds/en/us/callie/custom/16000/press_1_to_accept_this_call.wav create mode 100644 includes/install/sounds/en/us/callie/custom/16000/reason.wav create mode 100644 includes/install/sounds/en/us/callie/custom/16000/recording.wav create mode 100644 includes/install/sounds/en/us/callie/custom/16000/reject.wav create mode 100644 includes/install/sounds/en/us/callie/custom/16000/say.wav create mode 100644 includes/install/sounds/en/us/callie/custom/16000/schedule.wav create mode 100644 includes/install/sounds/en/us/callie/custom/16000/scheduled.wav create mode 100644 includes/install/sounds/en/us/callie/custom/16000/set.wav create mode 100644 includes/install/sounds/en/us/callie/custom/16000/snooze.wav create mode 100644 includes/install/sounds/en/us/callie/custom/16000/the.wav create mode 100644 includes/install/sounds/en/us/callie/custom/16000/this.wav create mode 100644 includes/install/sounds/en/us/callie/custom/16000/time.wav create mode 100644 includes/install/sounds/en/us/callie/custom/16000/to.wav create mode 100644 includes/install/sounds/en/us/callie/custom/16000/voicemail.wav create mode 100644 includes/install/sounds/en/us/callie/custom/16000/wakeup.wav create mode 100644 includes/install/sounds/en/us/callie/custom/16000/your.wav create mode 100644 includes/install/sounds/en/us/callie/custom/16000/your_pin_number_is_incorect_goodbye.wav create mode 100644 includes/install/sounds/en/us/callie/custom/8000/4.wav create mode 100644 includes/install/sounds/en/us/callie/custom/8000/a.wav create mode 100644 includes/install/sounds/en/us/callie/custom/8000/accept.wav create mode 100644 includes/install/sounds/en/us/callie/custom/8000/and.wav create mode 100644 includes/install/sounds/en/us/callie/custom/8000/been.wav create mode 100644 includes/install/sounds/en/us/callie/custom/8000/begin.wav create mode 100644 includes/install/sounds/en/us/callie/custom/8000/begin_recording.wav create mode 100644 includes/install/sounds/en/us/callie/custom/8000/call.wav create mode 100644 includes/install/sounds/en/us/callie/custom/8000/call_forward_has_been_deleted.wav create mode 100644 includes/install/sounds/en/us/callie/custom/8000/call_forward_has_been_set.wav create mode 100644 includes/install/sounds/en/us/callie/custom/8000/calling.wav create mode 100644 includes/install/sounds/en/us/callie/custom/8000/cancel.wav create mode 100644 includes/install/sounds/en/us/callie/custom/8000/delete.wav create mode 100644 includes/install/sounds/en/us/callie/custom/8000/digit.wav create mode 100644 includes/install/sounds/en/us/callie/custom/8000/digits.wav create mode 100644 includes/install/sounds/en/us/callie/custom/8000/enter.wav create mode 100644 includes/install/sounds/en/us/callie/custom/8000/exit.wav create mode 100644 includes/install/sounds/en/us/callie/custom/8000/extension.wav create mode 100644 includes/install/sounds/en/us/callie/custom/8000/followme_menu.wav create mode 100644 includes/install/sounds/en/us/callie/custom/8000/for.wav create mode 100644 includes/install/sounds/en/us/callie/custom/8000/forward.wav create mode 100644 includes/install/sounds/en/us/callie/custom/8000/goodbye.wav create mode 100644 includes/install/sounds/en/us/callie/custom/8000/has.wav create mode 100644 includes/install/sounds/en/us/callie/custom/8000/hours.wav create mode 100644 includes/install/sounds/en/us/callie/custom/8000/incorrect.wav create mode 100644 includes/install/sounds/en/us/callie/custom/8000/is.wav create mode 100644 includes/install/sounds/en/us/callie/custom/8000/m.wav create mode 100644 includes/install/sounds/en/us/callie/custom/8000/minutes.wav create mode 100644 includes/install/sounds/en/us/callie/custom/8000/name.wav create mode 100644 includes/install/sounds/en/us/callie/custom/8000/new.wav create mode 100644 includes/install/sounds/en/us/callie/custom/8000/now.wav create mode 100644 includes/install/sounds/en/us/callie/custom/8000/number.wav create mode 100644 includes/install/sounds/en/us/callie/custom/8000/or.wav create mode 100644 includes/install/sounds/en/us/callie/custom/8000/p.wav create mode 100644 includes/install/sounds/en/us/callie/custom/8000/pin.wav create mode 100644 includes/install/sounds/en/us/callie/custom/8000/please.wav create mode 100644 includes/install/sounds/en/us/callie/custom/8000/please_enter_the_extension_number.wav create mode 100644 includes/install/sounds/en/us/callie/custom/8000/please_enter_the_phone_number.wav create mode 100644 includes/install/sounds/en/us/callie/custom/8000/please_enter_the_pin_number.wav create mode 100644 includes/install/sounds/en/us/callie/custom/8000/please_enter_the_recording_number.wav create mode 100644 includes/install/sounds/en/us/callie/custom/8000/please_enter_your_pin_number.wav create mode 100644 includes/install/sounds/en/us/callie/custom/8000/please_say_your_name_and_reason_for_calling.wav create mode 100644 includes/install/sounds/en/us/callie/custom/8000/press.wav create mode 100644 includes/install/sounds/en/us/callie/custom/8000/press_1_to_accept_2_to_reject_or_3_for_voicemail.wav create mode 100644 includes/install/sounds/en/us/callie/custom/8000/press_1_to_accept_this_call.wav create mode 100644 includes/install/sounds/en/us/callie/custom/8000/reason.wav create mode 100644 includes/install/sounds/en/us/callie/custom/8000/recording.wav create mode 100644 includes/install/sounds/en/us/callie/custom/8000/reject.wav create mode 100644 includes/install/sounds/en/us/callie/custom/8000/say.wav create mode 100644 includes/install/sounds/en/us/callie/custom/8000/schedule.wav create mode 100644 includes/install/sounds/en/us/callie/custom/8000/scheduled.wav create mode 100644 includes/install/sounds/en/us/callie/custom/8000/set.wav create mode 100644 includes/install/sounds/en/us/callie/custom/8000/snooze.wav create mode 100644 includes/install/sounds/en/us/callie/custom/8000/the.wav create mode 100644 includes/install/sounds/en/us/callie/custom/8000/this.wav create mode 100644 includes/install/sounds/en/us/callie/custom/8000/time.wav create mode 100644 includes/install/sounds/en/us/callie/custom/8000/to.wav create mode 100644 includes/install/sounds/en/us/callie/custom/8000/voicemail.wav create mode 100644 includes/install/sounds/en/us/callie/custom/8000/wakeup.wav create mode 100644 includes/install/sounds/en/us/callie/custom/8000/your.wav create mode 100644 includes/install/sounds/en/us/callie/custom/8000/your_pin_number_is_incorect_goodbye.wav create mode 100644 includes/install/source.xml create mode 100644 includes/install/sql/mysql.sql create mode 100644 includes/install/sql/pgsql.sql create mode 100644 includes/install/sql/sqlite.sql create mode 100644 includes/jquery/flot/excanvas.min.js create mode 100644 includes/jquery/flot/jquery.flot.js create mode 100644 includes/jquery/flot/jquery.min.js create mode 100644 includes/jquery/jquery-1.7.2.min.js create mode 100644 includes/lib_cdr.php create mode 100644 includes/lib_functions.php create mode 100644 includes/lib_pdo.php create mode 100644 includes/lib_pdo_vm.php create mode 100644 includes/lib_php.php create mode 100644 includes/lib_schema.php create mode 100644 includes/lib_switch.php create mode 100644 includes/menu.php create mode 100644 includes/paging.php create mode 100644 includes/persistform.php create mode 100644 includes/persistformvar.php create mode 100644 includes/phpsvnclient/definitions.php create mode 100644 includes/phpsvnclient/http.php create mode 100644 includes/phpsvnclient/phpsvnclient.php create mode 100644 includes/phpsvnclient/xml2Array.php create mode 100644 includes/phpsvnclient/xml_parser.php create mode 100644 includes/pop3/mime_parser.php create mode 100644 includes/pop3/parse_message.php create mode 100644 includes/pop3/pop3.php create mode 100644 includes/pop3/rfc822_addresses.php create mode 100644 includes/qr/qrcode.php create mode 100644 includes/recaptchalib.php create mode 100644 includes/require.php create mode 100644 includes/root.php create mode 100644 includes/securedownload.php create mode 100644 includes/templates/conf/autoload_configs/.htaccess create mode 100644 includes/templates/conf/autoload_configs/abstraction.conf.xml create mode 100644 includes/templates/conf/autoload_configs/acl.conf.xml create mode 100644 includes/templates/conf/autoload_configs/alsa.conf.xml create mode 100644 includes/templates/conf/autoload_configs/blacklist.conf.xml create mode 100644 includes/templates/conf/autoload_configs/callcenter.conf.xml create mode 100644 includes/templates/conf/autoload_configs/cdr_csv.conf.xml create mode 100644 includes/templates/conf/autoload_configs/cdr_mongodb.conf.xml create mode 100644 includes/templates/conf/autoload_configs/cdr_pg_csv.conf.xml create mode 100644 includes/templates/conf/autoload_configs/cdr_sqlite.conf.xml create mode 100644 includes/templates/conf/autoload_configs/cepstral.conf.xml create mode 100644 includes/templates/conf/autoload_configs/cidlookup.conf.xml create mode 100644 includes/templates/conf/autoload_configs/conference.conf.xml create mode 100644 includes/templates/conf/autoload_configs/console.conf.xml create mode 100644 includes/templates/conf/autoload_configs/db.conf.xml create mode 100644 includes/templates/conf/autoload_configs/dialplan_directory.conf.xml create mode 100644 includes/templates/conf/autoload_configs/dingaling.conf.xml create mode 100644 includes/templates/conf/autoload_configs/directory.conf.xml create mode 100644 includes/templates/conf/autoload_configs/distributor.conf.xml create mode 100644 includes/templates/conf/autoload_configs/easyroute.conf.xml create mode 100644 includes/templates/conf/autoload_configs/enum.conf.xml create mode 100644 includes/templates/conf/autoload_configs/erlang_event.conf.xml create mode 100644 includes/templates/conf/autoload_configs/event_multicast.conf.xml create mode 100644 includes/templates/conf/autoload_configs/event_socket.conf.xml create mode 100644 includes/templates/conf/autoload_configs/fax.conf.xml create mode 100644 includes/templates/conf/autoload_configs/fifo.conf.xml create mode 100644 includes/templates/conf/autoload_configs/hash.conf.xml create mode 100644 includes/templates/conf/autoload_configs/httapi.conf.xml create mode 100644 includes/templates/conf/autoload_configs/http_cache.conf.xml create mode 100644 includes/templates/conf/autoload_configs/ivr.conf.xml create mode 100644 includes/templates/conf/autoload_configs/java.conf.xml create mode 100644 includes/templates/conf/autoload_configs/lcr.conf.xml create mode 100644 includes/templates/conf/autoload_configs/local_stream.conf.xml create mode 100644 includes/templates/conf/autoload_configs/logfile.conf.xml create mode 100644 includes/templates/conf/autoload_configs/lua.conf.xml create mode 100644 includes/templates/conf/autoload_configs/memcache.conf.xml create mode 100644 includes/templates/conf/autoload_configs/modules.conf.xml create mode 100644 includes/templates/conf/autoload_configs/mongo.conf.xml create mode 100644 includes/templates/conf/autoload_configs/nibblebill.conf.xml create mode 100644 includes/templates/conf/autoload_configs/opal.conf.xml create mode 100644 includes/templates/conf/autoload_configs/osp.conf.xml create mode 100644 includes/templates/conf/autoload_configs/perl.conf.xml create mode 100644 includes/templates/conf/autoload_configs/pocketsphinx.conf.xml create mode 100644 includes/templates/conf/autoload_configs/portaudio.conf.xml create mode 100644 includes/templates/conf/autoload_configs/post_load_modules.conf.xml create mode 100644 includes/templates/conf/autoload_configs/presence_map.conf.xml create mode 100644 includes/templates/conf/autoload_configs/python.conf.xml create mode 100644 includes/templates/conf/autoload_configs/redis.conf.xml create mode 100644 includes/templates/conf/autoload_configs/rss.conf.xml create mode 100644 includes/templates/conf/autoload_configs/rtmp.conf.xml create mode 100644 includes/templates/conf/autoload_configs/sangoma_codec.conf.xml create mode 100644 includes/templates/conf/autoload_configs/shout.conf.xml create mode 100644 includes/templates/conf/autoload_configs/skinny.conf.xml create mode 100644 includes/templates/conf/autoload_configs/sofia.conf.xml create mode 100644 includes/templates/conf/autoload_configs/spandsp.conf.xml create mode 100644 includes/templates/conf/autoload_configs/spidermonkey.conf.xml create mode 100644 includes/templates/conf/autoload_configs/switch.conf.xml create mode 100644 includes/templates/conf/autoload_configs/syslog.conf.xml create mode 100644 includes/templates/conf/autoload_configs/timezones.conf.xml create mode 100644 includes/templates/conf/autoload_configs/tts_commandline.conf.xml create mode 100644 includes/templates/conf/autoload_configs/unicall.conf.xml create mode 100644 includes/templates/conf/autoload_configs/unimrcp.conf.xml create mode 100644 includes/templates/conf/autoload_configs/voicemail.conf.xml create mode 100644 includes/templates/conf/autoload_configs/voicemail_ivr.conf.xml create mode 100644 includes/templates/conf/autoload_configs/xml_cdr.conf.xml create mode 100644 includes/templates/conf/autoload_configs/xml_curl.conf.xml create mode 100644 includes/templates/conf/autoload_configs/xml_rpc.conf.xml create mode 100644 includes/templates/conf/autoload_configs/zeroconf.conf.xml create mode 100644 includes/templates/conf/chatplan/default.xml create mode 100644 includes/templates/conf/dialplan/default.xml create mode 100644 includes/templates/conf/dialplan/default/00_ladspa.xml.noload create mode 100644 includes/templates/conf/dialplan/default/00_pizza_demo.xml.noload create mode 100644 includes/templates/conf/dialplan/default/01_Talking_Clock.xml.noload create mode 100644 includes/templates/conf/dialplan/default/01_example.com.xml.noload create mode 100644 includes/templates/conf/dialplan/features.xml create mode 100644 includes/templates/conf/dialplan/public.xml create mode 100644 includes/templates/conf/dialplan/public/00_inbound_did.xml.noload create mode 100644 includes/templates/conf/dialplan/skinny-patterns.xml create mode 100644 includes/templates/conf/dialplan/skinny-patterns/20-Demo.xml create mode 100644 includes/templates/conf/dialplan/skinny-patterns/20-Local_extension.xml create mode 100644 includes/templates/conf/dialplan/skinny-patterns/90-External.xml create mode 100644 includes/templates/conf/dialplan/skinny-patterns/99-Default_Drop.xml create mode 100644 includes/templates/conf/directory/default.xml create mode 100644 includes/templates/conf/directory/default/brian.xml.noload create mode 100644 includes/templates/conf/directory/default/default.xml.noload create mode 100644 includes/templates/conf/directory/default/example.com.xml.noload create mode 100644 includes/templates/conf/directory/default/skinny-example.xml.noload create mode 100644 includes/templates/conf/extensions.conf create mode 100644 includes/templates/conf/freeswitch.xml create mode 100644 includes/templates/conf/fur_elise.ttml create mode 100644 includes/templates/conf/ivr_menus/demo_ivr.xml create mode 100644 includes/templates/conf/jingle_profiles/client.xml create mode 100644 includes/templates/conf/jingle_profiles/server.xml create mode 100644 includes/templates/conf/lang/de/de.xml create mode 100644 includes/templates/conf/lang/de/demo/demo.xml create mode 100644 includes/templates/conf/lang/de/vm/sounds.xml create mode 100644 includes/templates/conf/lang/de/vm/tts.xml create mode 100644 includes/templates/conf/lang/en/demo/demo-ivr.xml create mode 100644 includes/templates/conf/lang/en/demo/demo.xml create mode 100644 includes/templates/conf/lang/en/dir/sounds.xml create mode 100644 includes/templates/conf/lang/en/dir/tts.xml create mode 100644 includes/templates/conf/lang/en/en.xml create mode 100644 includes/templates/conf/lang/en/ivr/sounds.xml create mode 100644 includes/templates/conf/lang/en/ivr/wakeup.xml create mode 100644 includes/templates/conf/lang/en/vm/sounds.xml create mode 100644 includes/templates/conf/lang/en/vm/tts.xml create mode 100644 includes/templates/conf/lang/en/vm/voicemail_ivr.xml create mode 100644 includes/templates/conf/lang/fr/demo/demo.xml create mode 100644 includes/templates/conf/lang/fr/dir/sounds.xml create mode 100644 includes/templates/conf/lang/fr/dir/tts.xml create mode 100644 includes/templates/conf/lang/fr/fr.xml create mode 100644 includes/templates/conf/lang/fr/vm/sounds.xml create mode 100644 includes/templates/conf/lang/he/demo/demo-ivr.xml create mode 100644 includes/templates/conf/lang/he/demo/demo.xml create mode 100644 includes/templates/conf/lang/he/dir/sounds.xml create mode 100644 includes/templates/conf/lang/he/he.xml create mode 100644 includes/templates/conf/lang/he/vm/sounds.xml create mode 100644 includes/templates/conf/lang/ru/demo/demo-ivr.xml create mode 100644 includes/templates/conf/lang/ru/demo/demo.xml create mode 100644 includes/templates/conf/lang/ru/dir/sounds.xml create mode 100644 includes/templates/conf/lang/ru/dir/tts.xml create mode 100644 includes/templates/conf/lang/ru/ru.xml create mode 100644 includes/templates/conf/lang/ru/vm/sounds.xml create mode 100644 includes/templates/conf/lang/ru/vm/tts.xml create mode 100644 includes/templates/conf/mime.types create mode 100644 includes/templates/conf/mrcp_profiles/loquendo-7-mrcp-v2.xml create mode 100644 includes/templates/conf/mrcp_profiles/nuance-1.0.0-mrcp-v1.xml create mode 100644 includes/templates/conf/mrcp_profiles/nuance-5.0-mrcp-v1.xml create mode 100644 includes/templates/conf/mrcp_profiles/nuance-5.0-mrcp-v2.xml create mode 100644 includes/templates/conf/mrcp_profiles/unimrcpserver-mrcp-v1.xml create mode 100644 includes/templates/conf/mrcp_profiles/voxeo-prophecy-8.0-mrcp-v1.xml create mode 100644 includes/templates/conf/notify-voicemail.tpl create mode 100644 includes/templates/conf/sip_profiles/external.xml create mode 100644 includes/templates/conf/sip_profiles/external/example.xml create mode 100644 includes/templates/conf/sip_profiles/internal-ipv6.xml create mode 100644 includes/templates/conf/sip_profiles/internal.xml create mode 100644 includes/templates/conf/sip_profiles/internal/example.xml create mode 100644 includes/templates/conf/skinny_profiles/internal.xml create mode 100644 includes/templates/conf/tetris.ttml create mode 100644 includes/templates/conf/vars.xml create mode 100644 includes/templates/conf/voicemail.tpl create mode 100644 includes/templates/conf/web-vm.tpl create mode 100644 includes/templates/provision/aastra/675x/{v_mac}.cfg create mode 100644 includes/templates/provision/cisco/spa303/{v_mac}.xml create mode 100644 includes/templates/provision/cisco/spa504g/{v_mac}.xml create mode 100644 includes/templates/provision/cisco/spa525g/{v_mac}.xml create mode 100644 includes/templates/provision/linksys/spa2102/{v_mac}.xml create mode 100644 includes/templates/provision/linksys/spa3102/{v_mac}.xml create mode 100644 includes/templates/provision/linksys/spa942/{v_mac}.xml create mode 100644 includes/templates/provision/polycom/650/custom.cfg create mode 100644 includes/templates/provision/polycom/650/phone1.cfg create mode 100644 includes/templates/provision/polycom/650/sip.cfg create mode 100644 includes/templates/provision/polycom/650/{v_mac}-registration.cfg create mode 100644 includes/templates/provision/polycom/650/{v_mac}.cfg create mode 100644 includes/templates/provision/polycom/8030/phone1.cfg create mode 100644 includes/templates/provision/polycom/8030/sip.cfg create mode 100644 includes/templates/provision/polycom/8030/{v_mac}-registration.cfg create mode 100644 includes/templates/provision/polycom/8030/{v_mac}.cfg create mode 100644 includes/templates/provision/snom/820/{v_mac}.xml create mode 100644 includes/templates/provision/yealink/t20/{v_mac}.cfg create mode 100644 includes/templates/provision/yealink/t22/{v_mac}.cfg create mode 100644 includes/upload.php create mode 100644 includes/wysiwyg.php create mode 100644 index.php create mode 100644 index2.php create mode 100644 install.php create mode 100644 licenses.php create mode 100644 login.php create mode 100644 logout.php create mode 100644 root.php create mode 100644 secure/.htaccess create mode 100644 secure/class.phpmailer.php create mode 100644 secure/class.smtp.php create mode 100644 secure/fax_to_email.php create mode 100644 secure/htaccess.tmp create mode 100644 secure/index.php create mode 100644 secure/root.php create mode 100644 secure/v_mailto.php create mode 100644 themes/accessible/background.jpg create mode 100644 themes/accessible/background_black.png create mode 100644 themes/accessible/background_cell.gif create mode 100644 themes/accessible/background_head.png create mode 100644 themes/accessible/background_th.png create mode 100644 themes/accessible/background_th_blue.png create mode 100644 themes/accessible/background_th_purple.png create mode 100644 themes/accessible/blank.gif create mode 100644 themes/accessible/config.php create mode 100644 themes/accessible/logo.png create mode 100644 themes/accessible/menu_background.jpg create mode 100644 themes/accessible/root.php create mode 100644 themes/accessible/template.php create mode 100644 themes/classic/background.jpg create mode 100644 themes/classic/background_black.png create mode 100644 themes/classic/background_cell.gif create mode 100644 themes/classic/background_head.png create mode 100644 themes/classic/background_th.png create mode 100644 themes/classic/background_th_blue.png create mode 100644 themes/classic/background_th_purple.png create mode 100644 themes/classic/blank.gif create mode 100644 themes/classic/config.php create mode 100644 themes/classic/logo.png create mode 100644 themes/classic/root.php create mode 100644 themes/classic/template.php create mode 100644 themes/default/arrow.png create mode 100644 themes/default/background_black.png create mode 100644 themes/default/background_cell.gif create mode 100644 themes/default/background_th.png create mode 100644 themes/default/blank.gif create mode 100644 themes/default/config.php create mode 100644 themes/default/content_background.png create mode 100644 themes/default/images/backgrounds/yellowstone_1.jpg create mode 100644 themes/default/login_background.png create mode 100644 themes/default/logo.png create mode 100644 themes/default/menu_background.png create mode 100644 themes/default/root.php create mode 100644 themes/default/template.php create mode 100644 themes/enhanced/background.jpg create mode 100644 themes/enhanced/background_black.png create mode 100644 themes/enhanced/background_cell.gif create mode 100644 themes/enhanced/background_th.png create mode 100644 themes/enhanced/blank.gif create mode 100644 themes/enhanced/config.php create mode 100644 themes/enhanced/content_background.png create mode 100644 themes/enhanced/images/backgrounds/yellowstone_1.jpg create mode 100644 themes/enhanced/login_background.png create mode 100644 themes/enhanced/logo.png create mode 100644 themes/enhanced/menu_background.png create mode 100644 themes/enhanced/root.php create mode 100644 themes/enhanced/template.php diff --git a/.htaccess b/.htaccess new file mode 100644 index 0000000000..18fc58133c --- /dev/null +++ b/.htaccess @@ -0,0 +1,5 @@ +RewriteEngine On + + +RewriteRule ^([A-Fa-f0-9]{12})(\.(xml|cfg))?$ mod/provision/index.php?mac=$1 [QSA] +RewriteRule ^([A-Fa-f0-9]{2}[:-][A-Fa-f0-9]{2}[:-][A-Fa-f0-9]{2}[:-][A-Fa-f0-9]{2}[:-][A-Fa-f0-9]{2}[:-][A-Fa-f0-9]{2}[:-])(\.(xml|cfg))?$ mod/provision/index.php?mac=$1 [QSA] diff --git a/app/adminer/adminer.php b/app/adminer/adminer.php new file mode 100644 index 0000000000..fa6a60d3a0 --- /dev/null +++ b/app/adminer/adminer.php @@ -0,0 +1,1452 @@ + +function toggle(id){var el=document.getElementById(id);el.className=(el.className=='hidden'?'':'hidden');return true;} +function cookie(assign,days){var date=new Date();date.setDate(date.getDate()+days);document.cookie=assign+'; expires='+date;} +function verifyVersion(){cookie('adminer_version=0',1);var script=document.createElement('script');script.src=location.protocol+'//www.adminer.org/version.php';document.body.appendChild(script);} +function selectValue(select){var selected=select.options[select.selectedIndex];return((selected.attributes.value||{}).specified?selected.value:selected.text);} +function formCheck(el,name){var elems=el.form.elements;for(var i=0;i.*<\/noscript>/i,'');}}} +function nodePosition(el){var pos=0;while(el=el.previousSibling){pos++;} +return pos;} +function pageClick(href,page,event){if(!isNaN(page)&&page){href+=(page!=1?'&page='+(page-1):'');if(!ajaxSend(href)){location.href=href;}}} +function selectAddRow(field){field.onchange=function(){};var row=field.parentNode.cloneNode(true);var selects=row.getElementsByTagName('select');for(var i=0;i=0){input.maxLength=input.origMaxLength;}} +function ajax(url,callback,data){var xmlhttp=(window.XMLHttpRequest?new XMLHttpRequest():(window.ActiveXObject?new ActiveXObject('Microsoft.XMLHTTP'):false));if(xmlhttp){xmlhttp.open((data?'POST':'GET'),url);if(data){xmlhttp.setRequestHeader('Content-Type','application/x-www-form-urlencoded');} +xmlhttp.setRequestHeader('X-Requested-With','XMLHttpRequest');xmlhttp.onreadystatechange=function(){if(xmlhttp.readyState==4){callback(xmlhttp);}};xmlhttp.send(data);} +return xmlhttp;} +function ajaxSetHtml(url){return ajax(url,function(xmlhttp){if(xmlhttp.status){var data=eval('('+xmlhttp.responseText+')');for(var key in data){setHtml(key,data[key]);}}});} +function replaceFavicon(href){var favicon=document.getElementById('favicon');favicon.href=href;favicon.parentNode.appendChild(favicon);} +var ajaxState=0;function ajaxSend(url,data,popState){if(!history.pushState){return false;} +var currentState=++ajaxState;onblur=function(){replaceFavicon(location.pathname+'?file=loader.gif&version=3.2.2');};setHtml('loader','');return ajax(url,function(xmlhttp){if(currentState==ajaxState){var title=xmlhttp.getResponseHeader('X-AJAX-Title');if(title){document.title=decodeURIComponent(title);} +var redirect=xmlhttp.getResponseHeader('X-AJAX-Redirect');if(redirect){return ajaxSend(redirect,'',popState);} +onblur=function(){};replaceFavicon(location.pathname+'?file=favicon.ico&version=3.2.2');if(!xmlhttp.status){setHtml('loader','');}else{if(!popState){if(data||url!=location.href){history.pushState(data,'',url);} +scrollTo(0,0);} +setHtml('content',xmlhttp.responseText);var content=document.getElementById('content');var scripts=content.getElementsByTagName('script');var length=scripts.length;for(var i=0;i=allowed){return false;} +var match=/(\d+)(\.\d+)?/.exec(button.name);var x=match[0]+(match[2]?added.substr(match[2].length):added)+'1';var row=button.parentNode.parentNode;var row2=row.cloneNode(true);var tags=row.getElementsByTagName('select');var tags2=row2.getElementsByTagName('select');for(var i=0;idivs[i].offsetTop+top*em);} +if(!lineSet[id]){var line=document.getElementById(divs[i].id.replace(/^....(.+)-\d+$/,'refl$1'));var shift=ev.clientY-y-that.offsetTop;line.style.left=(left+left1)+'em';if(isTop){line.style.top=(line.offsetTop+shift)/em+'em';} +if(divs[i].parentNode!=div2.parentNode){line=line.getElementsByTagName('div')[0];line.style.height=(line.offsetHeight+(isTop?-1:1)*shift)/em+'em';} +lineSet[id]=true;}}} +that.style.left=left+'em';that.style.top=top+'em';}} +function schemaMouseup(ev,db){if(that!==undefined){ev=ev||event;tablePos[that.firstChild.firstChild.firstChild.data]=[(ev.clientY-y)/em,(ev.clientX-x)/em];that=undefined;var s='';for(var key in tablePos){s+='_'+key+':'+Math.round(tablePos[key][0]*10000)/10000+'x'+Math.round(tablePos[key][1]*10000)/10000;} +s=encodeURIComponent(s.substr(1));var link=document.getElementById('schema-link');link.href=link.href.replace(/[^=]+$/,'')+s;cookie('adminer_schema-'+db+'='+s,30);}}$y){unset($ub[$d][$Ma]);if(is_array($y)){$ub[$d][stripslashes($Ma)]=$y;$ub[]=&$ub[$d][stripslashes($Ma)];}else{$ub[$d][stripslashes($Ma)]=($_e?$y:stripslashes($y));}}}}}function +bracket_escape($N,$pf=false){static$Xd=array(':'=>':1',']'=>':2','['=>':3');return +strtr($N,($pf?array_flip($Xd):$Xd));}function +h($I){return +htmlspecialchars($I,ENT_QUOTES);}function +nbsp($I){return(trim($I)!=""?h($I):" ");}function +nl_br($I){return +str_replace("\n","
",$I);}function +checkbox($f,$q,$ab,$Ud="",$ae=""){static$S=0;$S++;$c="";return($Ud!=""?"":$c);}function +optionlist($Wc,$Mf=null,$oe=false){$c="";foreach($Wc +as$Ma=>$y){$ge=array($Ma=>$y);if(is_array($y)){$c.='';$ge=$y;}foreach($ge +as$d=>$b){$c.=''.h($b);}if(is_array($y)){$c.='';}}return$c;}function +adminer_html_select($f,$Wc,$q="",$Qb=true){if($Qb){return"";}$c="";foreach($Wc +as$d=>$b){$c.="";}return$c;}function +confirm($Qc="",$Sf=false){return" onclick=\"".($Sf?"eventStop(event); ":"")."return confirm('".lang(0).($Qc?" (' + $Qc + ')":"")."');\"";}function +js_escape($I){return +addcslashes($I,"\r\n'\\/");}function +ini_bool($Rf){$b=ini_get($Rf);return(eregi('^(on|true|yes)$',$b)||(int)$b);}function +sid(){static$c;if(!isset($c)){$c=(SID&&!($_COOKIE&&ini_bool("session.use_cookies")));}return$c;}function +q($I){global$g;return$g->quote($I);}function +get_vals($j,$C=0){global$g;$c=array();$i=$g->query($j);if(is_object($i)){while($a=$i->fetch_row()){$c[]=$a[$C];}}return$c;}function +get_key_vals($j,$G=null){global$g;if(!is_object($G)){$G=$g;}$c=array();$i=$G->query($j);if(is_object($i)){while($a=$i->fetch_row()){$c[$a[0]]=$a[1];}}return$c;}function +get_rows($j,$G=null,$n="

"){global$g;if(!is_object($G)){$G=$g;}$c=array();$i=$G->query($j);if(is_object($i)){while($a=$i->fetch_assoc()){$c[]=$a;}}elseif(!$i&&$g->error&&$n&&defined("PAGE_HEADER")){echo$n.error()."\n";}return$c;}function +unique_array($a,$J){foreach($J +as$x){if(ereg("PRIMARY|UNIQUE",$x["type"])){$c=array();foreach($x["columns"]as$d){if(!isset($a[$d])){continue +2;}$c[$d]=$a[$d];}return$c;}}$c=array();foreach($a +as$d=>$b){if(!preg_match('~^(COUNT\\((\\*|(DISTINCT )?`(?:[^`]|``)+`)\\)|(AVG|GROUP_CONCAT|MAX|MIN|SUM)\\(`(?:[^`]|``)+`\\))$~',$d)){$c[$d]=$b;}}return$c;}function +where($s){global$v;$c=array();foreach((array)$s["where"]as$d=>$b){$c[]=idf_escape(bracket_escape($d,1)).(ereg('\\.',$b)||$v=="mssql"?" LIKE ".exact_value(addcslashes($b,"%_")):" = ".exact_value($b));}foreach((array)$s["null"]as$d){$c[]=idf_escape($d)." IS NULL";}return +implode(" AND ",$c);}function +where_check($b){parse_str($b,$fe);remove_slashes(array(&$fe));return +where($fe);}function +where_link($l,$C,$q,$If="="){return"&where%5B$l%5D%5Bcol%5D=".urlencode($C)."&where%5B$l%5D%5Bop%5D=".urlencode((isset($q)?$If:"IS NULL"))."&where%5B$l%5D%5Bval%5D=".urlencode($q);}function +cookie($f,$q){global$Ac;$xc=array($f,(ereg("\n",$q)?"":$q),time()+2592000,preg_replace('~\\?.*~','',$_SERVER["REQUEST_URI"]),"",$Ac);if(version_compare(PHP_VERSION,'5.2.0')>=0){$xc[]=true;}return +call_user_func_array('setcookie',$xc);}function +restart_session(){if(!ini_bool("session.use_cookies")){session_start();}}function&get_session($d){return$_SESSION[$d][DRIVER][SERVER][$_GET["username"]];}function +set_session($d,$b){$_SESSION[$d][DRIVER][SERVER][$_GET["username"]]=$b;}function +auth_url($Ib,$F,$P){global$na;preg_match('~([^?]*)\\??(.*)~',remove_from_uri(implode("|",array_keys($na))."|username|".session_name()),$k);return"$k[1]?".(sid()?SID."&":"").($Ib!="server"||$F!=""?urlencode($Ib)."=".urlencode($F)."&":"")."username=".urlencode($P).($k[2]?"&$k[2]":"");}function +is_ajax(){return($_SERVER["HTTP_X_REQUESTED_WITH"]=="XMLHttpRequest");}function +redirect($ga,$va=null){if(isset($va)){restart_session();$_SESSION["messages"][preg_replace('~^[^?]*~','',(isset($ga)?$ga:$_SERVER["REQUEST_URI"]))][]=$va;}if(isset($ga)){if($ga==""){$ga=".";}header((is_ajax()?"X-AJAX-Redirect":"Location").": $ga");exit;}}function +query_redirect($j,$ga,$va,$fd=true,$Ef=true,$bf=false){global$g,$n,$o;if($Ef){$bf=!$g->query($j);}$xd="";if($j){$xd=$o->messageQuery("$j;");}if($bf){$n=error().$xd;return +false;}if($fd){redirect($ga,$va.$xd);}return +true;}function +queries($j=null){global$g;static$jb=array();if(!isset($j)){return +implode(";\n",$jb);}$jb[]=(ereg(';$',$j)?"DELIMITER ;;\n$j;\nDELIMITER ":$j);return$g->query($j);}function +apply_queries($j,$E,$Df='table'){foreach($E +as$h){if(!queries("$j ".$Df($h))){return +false;}}return +true;}function +queries_redirect($ga,$va,$fd){return +query_redirect(queries(),$ga,$va,$fd,false,!$fd);}function +remove_from_uri($Za=""){return +substr(preg_replace("~(?<=[?&])($Za".(SID?"":"|".session_name()).")=[^&]*&~",'',"$_SERVER[REQUEST_URI]&"),0,-1);}function +pagination($ca,$zf){return" ".($ca==$zf?$ca+1:''.($ca+1)."");}function +get_file($d,$sd=false){$Ia=$_FILES[$d];if(!$Ia||$Ia["error"]){return$Ia["error"];}$c=file_get_contents($sd&&ereg('\\.gz$',$Ia["name"])?"compress.zlib://$Ia[tmp_name]":($sd&&ereg('\\.bz2$',$Ia["name"])?"compress.bzip2://$Ia[tmp_name]":$Ia["tmp_name"]));if($sd){$Fb=substr($c,0,3);if(function_exists("iconv")&&ereg("^\xFE\xFF|^\xFF\xFE",$Fb,$Xf)){$c=iconv("utf-16","utf-8",$c);}elseif($Fb=="\xEF\xBB\xBF"){$c=substr($c,3);}}return$c;}function +upload_error($n){$gf=($n==UPLOAD_ERR_INI_SIZE?ini_get("upload_max_filesize"):null);return($n?lang(1).($gf?" ".lang(2,$gf):""):lang(3));}function +odd($c=' class="odd"'){static$l=0;if(!$c){$l=-1;}return($l++% +2?$c:'');}function +json_row($d,$b=null){static$Ba=true;if($Ba){echo"{";}if($d!=""){echo($Ba?"":",")."\n\t\"".addcslashes($d,"\r\n\"\\").'": '.(isset($b)?'"'.addcslashes($b,"\r\n\"\\").'"':'undefined');$Ba=false;}else{echo"\n}\n";$Ba=true;}}function +is_utf8($b){return(preg_match('~~u',$b)&&!preg_match('~[\\0-\\x8\\xB\\xC\\xE-\\x1F]~',$b));}function +repeat_pattern($ba,$W){return +str_repeat("$ba{0,65535}",$W/65535)."$ba{0,".($W +% +65535)."}";}function +shorten_utf8($I,$W=80,$Af=""){if(!preg_match("(^(".repeat_pattern("[\t\r\n -\x{FFFF}]",$W).")($)?)u",$I,$k)){preg_match("(^(".repeat_pattern("[\t\r\n -~]",$W).")($)?)",$I,$k);}return +h($k[1]).$Af.(isset($k[2])?"":"...");}function +friendly_url($b){return +preg_replace('~[^a-z0-9_]~i','-',$b);}function +hidden_fields($ub,$Qf=array()){while(list($d,$b)=each($ub)){if(is_array($b)){foreach($b +as$Ma=>$y){$ub[$d."[$Ma]"]=$y;}}elseif(!in_array($d,$Qf)){echo'';}}}function +hidden_fields_get(){echo(sid()?'':''),(SERVER!==null?'':""),'';}function +column_foreign_keys($h){global$o;$c=array();foreach($o->foreignKeys($h)as$A){foreach($A["source"]as$b){$c[$b][]=$A;}}return$c;}function +enum_input($z,$Ra,$e,$q,$hc=null){global$o;preg_match_all("~'((?:[^']|'')*)'~",$e["length"],$oa);$c=(isset($hc)?"":"");foreach($oa[1]as$l=>$b){$b=stripcslashes(str_replace("''","'",$b));$ab=(is_int($q)?$q==$l+1:(is_array($q)?in_array($l+1,$q):$q===$b));$c.=" ';}return$c;}function +input($e,$q,$K){global$R,$o,$v;$f=h(bracket_escape($e["field"]));echo"";$De=($v=="mssql"&&$e["auto_increment"]);if($De&&!$_POST["save"]){$K=null;}$da=(isset($_GET["select"])||$De?array("orig"=>lang(5)):array())+$o->editFunctions($e);$Ra=" name='fields[$f]'";if($e["type"]=="enum"){echo +nbsp($da[""])."".$o->editInput($_GET["edit"],$e,$Ra,$q);}else{$Ba=0;foreach($da +as$d=>$b){if($d===""||!$b){break;}$Ba++;}$Qb=($Ba?" onchange=\"var f = this.form['function[".js_escape($f)."]']; if ($Ba > f.selectedIndex) f.selectedIndex = $Ba;\"":"");$Ra.=$Qb;echo(count($da)>1?adminer_html_select("function[$f]",$da,!isset($K)||in_array($K,$da)||isset($da[$K])?$K:"","functionChange(this);"):nbsp(reset($da))).'';$Ae=$o->editInput($_GET["edit"],$e,$Ra,$q);if($Ae!=""){echo$Ae;}elseif($e["type"]=="set"){preg_match_all("~'((?:[^']|'')*)'~",$e["length"],$oa);foreach($oa[1]as$l=>$b){$b=stripcslashes(str_replace("''","'",$b));$ab=(is_int($q)?($q>>$l)&1:in_array($b,explode(",",$q),true));echo" ';}}elseif(ereg('blob|bytea|raw|file',$e["type"])&&ini_bool("file_uploads")){echo"";}elseif(ereg('text|lob',$e["type"])){echo"';}else{$nd=(!ereg('int',$e["type"])&&preg_match('~^(\\d+)(,(\\d+))?$~',$e["length"],$k)?((ereg("binary",$e["type"])?2:1)*$k[1]+($k[3]?1:0)+($k[2]&&!$e["unsigned"]?1:0)):($R[$e["type"]]?$R[$e["type"]]+($e["unsigned"]?0:1):0));echo"20?" size='40'":"")."$Ra>";}}}function +process_input($e){global$o;$N=bracket_escape($e["field"]);$K=$_POST["function"][$N];$q=$_POST["fields"][$N];if($e["type"]=="enum"){if($q==-1){return +false;}if($q==""){return"NULL";}return+$q;}if($e["auto_increment"]&&$q==""){return +null;}if($K=="orig"){return +false;}if($K=="NULL"){return"NULL";}if($e["type"]=="set"){return +array_sum((array)$q);}if(ereg('blob|bytea|raw|file',$e["type"])&&ini_bool("file_uploads")){$Ia=get_file("fields-$N");if(!is_string($Ia)){return +false;}return +q($Ia);}return$o->processInput($e,$q,$K);}function +search_tables(){global$o,$g;$_GET["where"][0]["op"]="LIKE %%";$_GET["where"][0]["val"]=$_POST["query"];$ta=false;foreach(table_status()as$h=>$D){$f=$o->tableName($D);if(isset($D["Engine"])&&$f!=""&&(!$_POST["tables"]||in_array($h,$_POST["tables"]))){$i=$g->query("SELECT".limit("1 FROM ".table($h)," WHERE ".implode(" AND ",$o->selectSearchProcess(fields($h),array())),1));if($i->fetch_row()){if(!$ta){echo"

    \n";$ta=true;}echo"
  • $f\n";}}}echo($ta?"
":"

".lang(6))."\n";}function +dump_headers($Sc,$_d=false){global$o;$c=$o->dumpHeaders($Sc,$_d);$Na=$_POST["output"];if($Na!="text"){header("Content-Disposition: attachment; filename=".($Sc!=""?friendly_url($Sc):"dump").".$c".($Na!="file"&&!ereg('[^0-9a-z]',$Na)?".$Na":""));}session_write_close();return$c;}function +dump_csv($a){foreach($a +as$d=>$b){if(preg_match("~[\"\n,;\t]~",$b)||$b===""){$a[$d]='"'.str_replace('"','""',$b).'"';}}echo +implode(($_POST["format"]=="csv"?",":($_POST["format"]=="tsv"?"\t":";")),$a)."\r\n";}function +apply_sql_function($K,$C){return($K?($K=="unixepoch"?"DATETIME($C, '$K')":($K=="count distinct"?"COUNT(DISTINCT ":strtoupper("$K("))."$C)"):$C);}function +password_file(){$Rc=ini_get("upload_tmp_dir");if(!$Rc){if(function_exists('sys_get_temp_dir')){$Rc=sys_get_temp_dir();}else{$ja=@tempnam("","");if(!$ja){return +false;}$Rc=dirname($ja);unlink($ja);}}$ja="$Rc/adminer.key";$c=@file_get_contents($ja);if($c){return$c;}$Pa=@fopen($ja,"w");if($Pa){$c=md5(uniqid(mt_rand(),true));fwrite($Pa,$c);fclose($Pa);}return$c;}function +is_mail($xf){$Ne='[-a-z0-9!#$%&\'*+/=?^_`{|}~]';$vc='[a-z0-9]([-a-z0-9]{0,61}[a-z0-9])';$ba="$Ne+(\\.$Ne+)*@($vc?\\.)+$vc";return +preg_match("(^$ba(,\\s*$ba)*\$)i",$xf);}function +is_url($I){$vc='[a-z0-9]([-a-z0-9]{0,61}[a-z0-9])';return(preg_match("~^(https?)://($vc?\\.)+$vc(:\\d+)?(/.*)?(\\?.*)?(#.*)?\$~i",$I,$k)?strtolower($k[1]):"");}function +print_fieldset($S,$Of,$Kf=false){echo"

$Of
\n";}function +selectSearchPrint($s,$B,$J){print_fieldset("search",lang(36),$s);foreach($J +as$l=>$x){if($x["type"]=="FULLTEXT"){echo"(".implode(", ",array_map('h',$x["columns"])).") AGAINST"," ",checkbox("boolean[$l]",1,isset($_GET["boolean"][$l]),"BOOL"),"
\n";}}$l=0;foreach((array)$_GET["where"]as$b){if("$b[col]$b[val]"!=""&&in_array($b["op"],$this->operators)){echo"
",adminer_html_select("where[$l][op]",$this->operators,$b["op"]),"
\n";$l++;}}echo"
",adminer_html_select("where[$l][op]",$this->operators,"="),"
\n","\n";}function +selectOrderPrint($Xa,$B,$J){print_fieldset("sort",lang(38),$Xa);$l=0;foreach((array)$_GET["order"]as$d=>$b){if(isset($B[$b])){echo"
",checkbox("desc[$l]",1,isset($_GET["desc"][$d]),lang(39))."
\n";$l++;}}echo"
","
\n";echo"\n";}function +selectLimitPrint($O){echo"
".lang(40)."
";echo"","
\n";}function +selectLengthPrint($Db){if(isset($Db)){echo"
".lang(41)."
",'',"
\n";}}function +selectActionPrint(){echo"
".lang(42)."
","","
\n";}function +selectEmailPrint($bg,$B){}function +selectColumnsProcess($B,$J){global$da,$lb;$Q=array();$pa=array();foreach((array)$_GET["columns"]as$d=>$b){if($b["fun"]=="count"||(isset($B[$b["col"]])&&(!$b["fun"]||in_array($b["fun"],$da)||in_array($b["fun"],$lb)))){$Q[$d]=apply_sql_function($b["fun"],(isset($B[$b["col"]])?idf_escape($b["col"]):"*"));if(!in_array($b["fun"],$lb)){$pa[]=$Q[$d];}}}return +array($Q,$pa);}function +selectSearchProcess($p,$J){global$v;$c=array();foreach($J +as$l=>$x){if($x["type"]=="FULLTEXT"&&$_GET["fulltext"][$l]!=""){$c[]="MATCH (".implode(", ",array_map('idf_escape',$x["columns"])).") AGAINST (".q($_GET["fulltext"][$l]).(isset($_GET["boolean"][$l])?" IN BOOLEAN MODE":"").")";}}foreach((array)$_GET["where"]as$b){if("$b[col]$b[val]"!=""&&in_array($b["op"],$this->operators)){$Ub=" $b[op]";if(ereg('IN$',$b["op"])){$Tb=process_length($b["val"]);$Ub.=" (".($Tb!=""?$Tb:"NULL").")";}elseif(!$b["op"]){$Ub.=$b["val"];}elseif($b["op"]=="LIKE %%"){$Ub=" LIKE ".$this->processInput($p[$b["col"]],"%$b[val]%");}elseif(!ereg('NULL$',$b["op"])){$Ub.=" ".$this->processInput($p[$b["col"]],$b["val"]);}if($b["col"]!=""){$c[]=idf_escape($b["col"]).$Ub;}else{$mb=array();foreach($p +as$f=>$e){if(is_numeric($b["val"])||!ereg('int|float|double|decimal',$e["type"])){$f=idf_escape($f);$mb[]=($v=="sql"&&ereg('char|text|enum|set',$e["type"])&&!ereg('^utf8',$e["collation"])?"CONVERT($f USING utf8)":$f);}}$c[]=($mb?"(".implode("$Ub OR ",$mb)."$Ub)":"0");}}}return$c;}function +selectOrderProcess($p,$J){$c=array();foreach((array)$_GET["order"]as$d=>$b){if(isset($p[$b])||preg_match('~^((COUNT\\(DISTINCT |[A-Z0-9_]+\\()(`(?:[^`]|``)+`|"(?:[^"]|"")+")\\)|COUNT\\(\\*\\))$~',$b)){$c[]=(isset($p[$b])?idf_escape($b):$b).(isset($_GET["desc"][$d])?" DESC":"");}}return$c;}function +selectLimitProcess(){return(isset($_GET["limit"])?$_GET["limit"]:"30");}function +selectLengthProcess(){return(isset($_GET["text_length"])?$_GET["text_length"]:"100");}function +selectEmailProcess($s,$vf){return +false;}function +messageQuery($j){global$v;static$Qc=0;restart_session();$S="sql-".($Qc++);$eb=&get_session("queries");if(strlen($j)>1e6){$j=ereg_replace('[\x80-\xFF]+$','',substr($j,0,1e6))."\n...";}$eb[$_GET["db"]][]=$j;return" ".lang(43)."';}function +editFunctions($e){global$Nb;$c=($e["null"]?"NULL/":"");foreach($Nb +as$d=>$da){if(!$d||(!isset($_GET["call"])&&(isset($_GET["select"])||where($_GET)))){foreach($da +as$ba=>$b){if(!$ba||ereg($ba,$e["type"])){$c.="/$b";}}if($d&&!ereg('set|blob|bytea|raw|file',$e["type"])){$c.="/=";}}}return +explode("/",$c);}function +editInput($h,$e,$Ra,$q){if($e["type"]=="enum"){return(isset($_GET["select"])?" ":"").($e["null"]?" ":"").enum_input("radio",$Ra,$e,$q,0);}return"";}function +processInput($e,$q,$K=""){if($K=="="){return$q;}$f=$e["field"];$c=($e["type"]=="bit"&&ereg('^[0-9]+$',$q)?$q:q($q));if(ereg('^(now|getdate|uuid)$',$K)){$c="$K()";}elseif(ereg('^current_(date|timestamp)$',$K)){$c=$K;}elseif(ereg('^([+-]|\\|\\|)$',$K)){$c=idf_escape($f)." $K $c";}elseif(ereg('^[+-] interval$',$K)){$c=idf_escape($f)." $K ".(preg_match("~^(\\d+|'[0-9.: -]') [A-Z_]+$~i",$q)?$q:$c);}elseif(ereg('^(addtime|subtime|concat)$',$K)){$c="$K(".idf_escape($f).", $c)";}elseif(ereg('^(md5|sha1|password|encrypt|hex)$',$K)){$c="$K($c)";}if(ereg("binary",$e["type"])){$c="unhex($c)";}return$c;}function +dumpOutput(){$c=array('text'=>lang(44),'file'=>lang(45));if(function_exists('gzencode')){$c['gz']='gzip';}if(function_exists('bzcompress')){$c['bz2']='bzip2';}return$c;}function +dumpFormat(){return +array('sql'=>'SQL','csv'=>'CSV,','csv;'=>'CSV;','tsv'=>'TSV');}function +dumpTable($h,$V,$bd=false){if($_POST["format"]!="sql"){echo"\xef\xbb\xbf";if($V){dump_csv(array_keys(fields($h)));}}elseif($V){$la=create_sql($h,$_POST["auto_increment"]);if($la){if($V=="DROP+CREATE"){echo"DROP ".($bd?"VIEW":"TABLE")." IF EXISTS ".table($h).";\n";}if($bd){$la=preg_replace('~^([A-Z =]+) DEFINER=`'.preg_replace('~@(.*)~','`@`(%|\\1)',logged_user()).'`~','\\1',$la);}echo($V!="CREATE+ALTER"?$la:($bd?substr_replace($la," OR REPLACE",6,0):substr_replace($la," IF NOT EXISTS",12,0))).";\n\n";}if($V=="CREATE+ALTER"&&!$bd){$j="SELECT COLUMN_NAME, COLUMN_DEFAULT, IS_NULLABLE, COLLATION_NAME, COLUMN_TYPE, EXTRA, COLUMN_COMMENT FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ".q($h)." ORDER BY ORDINAL_POSITION";echo"DELIMITER ;; +CREATE PROCEDURE adminer_alter (INOUT alter_command text) BEGIN + DECLARE _column_name, _collation_name, after varchar(64) DEFAULT ''; + DECLARE _column_type, _column_default text; + DECLARE _is_nullable char(3); + DECLARE _extra varchar(30); + DECLARE _column_comment varchar(255); + DECLARE done, set_after bool DEFAULT 0; + DECLARE add_columns text DEFAULT '";$p=array();$Jb="";foreach(get_rows($j)as$a){$za=$a["COLUMN_DEFAULT"];$a["default"]=(isset($za)?q($za):"NULL");$a["after"]=q($Jb);$a["alter"]=escape_string(idf_escape($a["COLUMN_NAME"])." $a[COLUMN_TYPE]".($a["COLLATION_NAME"]?" COLLATE $a[COLLATION_NAME]":"").(isset($za)?" DEFAULT ".($za=="CURRENT_TIMESTAMP"?$za:$a["default"]):"").($a["IS_NULLABLE"]=="YES"?"":" NOT NULL").($a["EXTRA"]?" $a[EXTRA]":"").($a["COLUMN_COMMENT"]?" COMMENT ".q($a["COLUMN_COMMENT"]):"").($Jb?" AFTER ".idf_escape($Jb):" FIRST"));echo", ADD $a[alter]";$p[]=$a;$Jb=$a["COLUMN_NAME"];}echo"'; + DECLARE columns CURSOR FOR $j; + DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; + SET @alter_table = ''; + OPEN columns; + REPEAT + FETCH columns INTO _column_name, _column_default, _is_nullable, _collation_name, _column_type, _extra, _column_comment; + IF NOT done THEN + SET set_after = 1; + CASE _column_name";foreach($p +as$a){echo" + WHEN ".q($a["COLUMN_NAME"])." THEN + SET add_columns = REPLACE(add_columns, ', ADD $a[alter]', ''); + IF NOT (_column_default <=> $a[default]) OR _is_nullable != '$a[IS_NULLABLE]' OR _collation_name != '$a[COLLATION_NAME]' OR _column_type != ".q($a["COLUMN_TYPE"])." OR _extra != '$a[EXTRA]' OR _column_comment != ".q($a["COLUMN_COMMENT"])." OR after != $a[after] THEN + SET @alter_table = CONCAT(@alter_table, ', MODIFY $a[alter]'); + END IF;";}echo" + ELSE + SET @alter_table = CONCAT(@alter_table, ', DROP ', _column_name); + SET set_after = 0; + END CASE; + IF set_after THEN + SET after = _column_name; + END IF; + END IF; + UNTIL done END REPEAT; + CLOSE columns; + IF @alter_table != '' OR add_columns != '' THEN + SET alter_command = CONCAT(alter_command, 'ALTER TABLE ".table($h)."', SUBSTR(CONCAT(add_columns, @alter_table), 2), ';\\n'); + END IF; +END;; +DELIMITER ; +CALL adminer_alter(@adminer_alter); +DROP PROCEDURE adminer_alter; + +";}}}function +dumpData($h,$V,$j){global$g,$v;$Ke=($v=="sqlite"?0:1048576);if($V){if($_POST["format"]=="sql"&&$V=="TRUNCATE+INSERT"){echo +truncate_sql($h).";\n";}if($_POST["format"]=="sql"){$p=fields($h);}$i=$g->query($j,1);if($i){$sc="";$kb="";while($a=$i->fetch_assoc()){if($_POST["format"]!="sql"){if($V=="table"){dump_csv(array_keys($a));$V="INSERT";}dump_csv($a);}else{if(!$sc){$sc="INSERT INTO ".table($h)." (".implode(", ",array_map('idf_escape',array_keys($a))).") VALUES";}foreach($a +as$d=>$b){$a[$d]=(isset($b)?(ereg('int|float|double|decimal',$p[$d]["type"])?$b:q($b)):"NULL");}$ma=implode(",\t",$a);if($V=="INSERT+UPDATE"){$r=array();foreach($a +as$d=>$b){$r[]=idf_escape($d)." = $b";}echo"$sc ($ma) ON DUPLICATE KEY UPDATE ".implode(", ",$r).";\n";}else{$ma=($Ke?"\n":" ")."($ma)";if(!$kb){$kb=$sc.$ma;}elseif(strlen($kb)+2+strlen($ma)<$Ke){$kb.=",$ma";}else{$kb.=";\n";echo$kb;$kb=$sc.$ma;}}}}if($_POST["format"]=="sql"&&$V!="INSERT+UPDATE"&&$kb){$kb.=";\n";echo$kb;}}elseif($_POST["format"]=="sql"){echo"-- ".str_replace("\n"," ",$g->error)."\n";}}}function +dumpHeaders($Sc,$_d=false){$Na=$_POST["output"];$Hb=($_POST["format"]=="sql"?"sql":($_d?"tar":"csv"));header("Content-Type: ".($Na=="bz2"?"application/x-bzip":($Na=="gz"?"application/x-gzip":($Hb=="tar"?"application/x-tar":($Hb=="sql"||$Na!="file"?"text/plain":"text/csv")."; charset=utf-8"))));if($Na=="bz2"){ob_start('bzcompress',1e6);}if($Na=="gz"){ob_start('gzencode',1e6);}return$Hb;}function +homepage(){echo'

'.($_GET["ns"]==""?''.lang(46)."\n":"");if(support("scheme")){echo"".($_GET["ns"]!=""?lang(47):lang(48))."\n";}return +true;}function +navigation($Zb){global$tc,$g,$M,$v,$na;echo'

+',$this->name(),' +',$tc,' +',(version_compare($tc,$_COOKIE["adminer_version"])<0?h($_COOKIE["adminer_version"]):""),' +

+';if($Zb=="auth"){$Ba=true;foreach((array)$_SESSION["pwds"]as$Ib=>$Uf){foreach($Uf +as$F=>$Nf){foreach($Nf +as$P=>$T){if(isset($T)){if($Ba){echo"

\n";$Ba=false;}echo"($na[$Ib]) ".h($P.($F!=""?"@$F":""))."
\n";}}}}}else{$_=get_databases();echo'

+

+';if(DB==""||!$Zb){echo"".lang(43)."\n";if(support("dump")){echo"".lang(49)."\n";}}echo' + +

+
+
+

+';hidden_fields_get();echo($_?adminer_html_select("db",array(""=>"(".lang(51).")")+$_,DB,"this.form.submit();"):''),' +';if($Zb!="db"&&DB!=""&&$g->select_db(DB)){if(support("scheme")){echo"
".adminer_html_select("ns",array(""=>"(".lang(52).")")+schemas(),$_GET["ns"],"this.form.submit();");if($_GET["ns"]!=""){set_schema($_GET["ns"]);}}if($_GET["ns"]!==""&&!$Zb){echo'

".lang(53)."\n";$E=tables_list();if(!$E){echo"

".lang(6)."\n";}else{$this->tablesPrint($E);$Ja=array();foreach($E +as$h=>$z){$Ja[]=preg_quote($h,'/');}echo"\n";}}}echo(isset($_GET["sql"])?'':(isset($_GET["schema"])?'':(isset($_GET["dump"])?'':""))),"

\n";}}function +tablesPrint($E){echo"

\n";foreach($E +as$h=>$z){echo'".lang(54)." ",'".$this->tableName(array("Name"=>$h))."
\n";}}}$o=(function_exists('adminer_object')?adminer_object():new +Adminer);if(!isset($o->operators)){$o->operators=$gc;}function +page_header($Je,$n="",$pc=array(),$Ie=""){global$ua,$o,$g,$na;header("Content-Type: text/html; charset=utf-8");$o->headers();$He=$Je.($Ie!=""?": ".h($Ie):"");$Le=strip_tags($He.(SERVER!=""&&SERVER!="localhost"?h(" - ".SERVER):"")." - ".$o->name());if(is_ajax()){header("X-AJAX-Title: ".rawurlencode($Le));}else{echo' + + + + +',$Le,' + + + + +';if($o->head()&&file_exists("adminer.css")){echo' +';}echo' +"> + + +

+'.$na[DRIVER].' » ';$w=substr(preg_replace('~(db|ns)=[^&]*&~','',ME),0,-1);$F=(SERVER!=""?h(SERVER):lang(20));if($pc===false){echo"$F\n";}else{echo"$F » ";if($_GET["ns"]!=""||(DB!=""&&is_array($pc))){echo''.h(DB).' » ';}if(is_array($pc)){if($_GET["ns"]!=""){echo''.h($_GET["ns"]).' » ';}foreach($pc +as$d=>$b){$rc=(is_array($b)?$b[1]:$b);if($rc!=""){echo''.h($rc).' » ';}}}echo"$Je\n";}}echo"\n","

$He

\n";restart_session();$Me=preg_replace('~^[^?]*~','',$_SERVER["REQUEST_URI"]);$Qe=$_SESSION["messages"][$Me];if($Qe){echo"
".implode("
\n
",$Qe)."
\n";unset($_SESSION["messages"][$Me]);}$_=&get_session("dbs");if(DB!=""&&$_&&!in_array(DB,$_,true)){$_=null;}if($n){echo"
$n
\n";}define("PAGE_HEADER",1);}function +page_footer($Zb=""){global$o;if(!is_ajax()){echo'
+ +';switch_lang();echo' +';}}function +int32($fa){while($fa>=2147483648){$fa-=4294967296;}while($fa<=-2147483649){$fa+=4294967296;}return(int)$fa;}function +long2str($y,$Hd){$ma='';foreach($y +as$b){$ma.=pack('V',$b);}if($Hd){return +substr($ma,0,end($y));}return$ma;}function +str2long($ma,$Hd){$y=array_values(unpack('V*',str_pad($ma,4*ceil(strlen($ma)/4),"\0")));if($Hd){$y[]=strlen($ma);}return$y;}function +xxtea_mx($Ca,$xa,$Fa,$Ma){return +int32((($Ca>>5&0x7FFFFFF)^$xa<<2)+(($xa>>3&0x1FFFFFFF)^$Ca<<4))^int32(($Fa^$xa)+($Ma^$Ca));}function +encrypt_string($Fc,$d){if($Fc==""){return"";}$d=array_values(unpack("V*",pack("H*",md5($d))));$y=str2long($Fc,true);$fa=count($y)-1;$Ca=$y[$fa];$xa=$y[0];$aa=floor(6+52/($fa+1));$Fa=0;while($aa-->0){$Fa=int32($Fa+0x9E3779B9);$Ec=$Fa>>2&3;for($wa=0;$wa<$fa;$wa++){$xa=$y[$wa+1];$Mb=xxtea_mx($Ca,$xa,$Fa,$d[$wa&3^$Ec]);$Ca=int32($y[$wa]+$Mb);$y[$wa]=$Ca;}$xa=$y[0];$Mb=xxtea_mx($Ca,$xa,$Fa,$d[$wa&3^$Ec]);$Ca=int32($y[$fa]+$Mb);$y[$fa]=$Ca;}return +long2str($y,false);}function +decrypt_string($Fc,$d){if($Fc==""){return"";}$d=array_values(unpack("V*",pack("H*",md5($d))));$y=str2long($Fc,false);$fa=count($y)-1;$Ca=$y[$fa];$xa=$y[0];$aa=floor(6+52/($fa+1));$Fa=int32($aa*0x9E3779B9);while($Fa){$Ec=$Fa>>2&3;for($wa=$fa;$wa>0;$wa--){$Ca=$y[$wa-1];$Mb=xxtea_mx($Ca,$xa,$Fa,$d[$wa&3^$Ec]);$xa=int32($y[$wa]-$Mb);$y[$wa]=$xa;}$Ca=$y[$fa];$Mb=xxtea_mx($Ca,$xa,$Fa,$d[$wa&3^$Ec]);$xa=int32($y[0]-$Mb);$y[0]=$xa;$Fa=int32($Fa-0x9E3779B9);}return +long2str($y,true);}$g='';$M=$_SESSION["token"];if(!$_SESSION["token"]){$_SESSION["token"]=rand(1,1e6);}$_b=array();if($_COOKIE["adminer_permanent"]){foreach(explode(" ",$_COOKIE["adminer_permanent"])as$b){list($d)=explode(":",$b);$_b[$d]=$b;}}if(isset($_POST["server"])){session_regenerate_id();$_SESSION["pwds"][$_POST["driver"]][$_POST["server"]][$_POST["username"]]=$_POST["password"];if($_POST["permanent"]){$d=base64_encode($_POST["driver"])."-".base64_encode($_POST["server"])."-".base64_encode($_POST["username"]);$Vc=$o->permanentLogin();$_b[$d]="$d:".base64_encode($Vc?encrypt_string($_POST["password"],$Vc):"");cookie("adminer_permanent",implode(" ",$_b));}if(count($_POST)==($_POST["permanent"]?5:4)||DRIVER!=$_POST["driver"]||SERVER!=$_POST["server"]||$_GET["username"]!==$_POST["username"]){redirect(auth_url($_POST["driver"],$_POST["server"],$_POST["username"]));}}elseif($_POST["logout"]){if($M&&$_POST["token"]!=$M){page_header(lang(50),lang(57));page_footer("db");exit;}else{foreach(array("pwds","dbs","queries")as$d){set_session($d,null);}$d=base64_encode(DRIVER)."-".base64_encode(SERVER)."-".base64_encode($_GET["username"]);if($_b[$d]){unset($_b[$d]);cookie("adminer_permanent",implode(" ",$_b));}redirect(substr(preg_replace('~(username|db|ns)=[^&]*&~','',ME),0,-1),lang(58));}}elseif($_b&&!$_SESSION["pwds"]){session_regenerate_id();$Vc=$o->permanentLogin();foreach($_b +as$d=>$b){list(,$Pf)=explode(":",$b);list($Ib,$F,$P)=array_map('base64_decode',explode("-",$d));$_SESSION["pwds"][$Ib][$F][$P]=decrypt_string(base64_decode($Pf),$Vc);}}function +auth_error($ze=null){global$g,$o,$M;$Tc=session_name();$n="";if(!$_COOKIE[$Tc]&&$_GET[$Tc]&&ini_bool("session.use_only_cookies")){$n=lang(59);}elseif(isset($_GET["username"])){if(($_COOKIE[$Tc]||$_GET[$Tc])&&!$M){$n=lang(60);}else{$T=&get_session("pwds");if(isset($T)){$n=h($ze?$ze->getMessage():(is_string($g)?$g:lang(61)));$T=null;}}}page_header(lang(23),$n,null);echo"
\n";$o->loginForm();echo"
";hidden_fields($_POST,array("driver","server","username","password","permanent"));echo"
\n","
\n";page_footer("auth");}if(isset($_GET["username"])){if(!class_exists("Min_DB")){unset($_SESSION["pwds"][DRIVER]);page_header(lang(62),lang(63,implode(", ",$oc)),false);page_footer("auth");exit;}$g=connect();}if(is_string($g)||!$o->login($_GET["username"],get_session("pwds"))){auth_error();exit;}$M=$_SESSION["token"];if(isset($_POST["server"])&&$_POST["token"]){$_POST["token"]=$M;}$n=($_POST?($_POST["token"]==$M?"":lang(57)):($_SERVER["REQUEST_METHOD"]!="POST"?"":lang(64,'"post_max_size"')));function +connect_error(){global$g,$M,$n,$na;$_=array();if(DB!=""){page_header(lang(65).": ".h(DB),lang(66),true);}else{if($_POST["db"]&&!$n){queries_redirect(substr(ME,0,-1),lang(67),drop_databases($_POST["db"]));}page_header(lang(68),$n,false);echo"

".lang(69)."\n";foreach(array('privileges'=>lang(70),'processlist'=>lang(71),'variables'=>lang(72),'status'=>lang(73),)as$d=>$b){if(support($d)){echo"$b\n";}}echo"

".lang(74,$na[DRIVER],"$g->server_info","$g->extension")."\n","

".lang(75,"".h(logged_user())."")."\n";if($_GET["refresh"]){set_session("dbs",null);}$_=get_databases();if($_){$Ed=support("scheme");$Z=collations();echo"

\n","\n","\n";foreach($_ +as$t){$Jd=h(ME)."db=".urlencode($t);echo"
 ".lang(65)."".lang(76)."".lang(77)."
".checkbox("db[]",$t,in_array($t,(array)$_POST["db"])),"".h($t)."","".nbsp(db_collation($t,$Z))."","?","\n";}echo"
\n","

\n";echo"\n","".lang(79)."\n","

\n";}}page_footer("db");if($_){echo"\n";}}if(isset($_GET["status"])){$_GET["variables"]=$_GET["status"];}if(!(DB!=""?$g->select_db(DB):isset($_GET["sql"])||isset($_GET["dump"])||isset($_GET["database"])||isset($_GET["processlist"])||isset($_GET["privileges"])||isset($_GET["user"])||isset($_GET["variables"])||$_GET["script"]=="connect")){if(DB!=""){set_session("dbs",null);}connect_error();exit;}if(support("scheme")&&DB!=""&&$_GET["ns"]!==""){if(!isset($_GET["ns"])){redirect(preg_replace('~ns=[^&]*&~','',ME)."ns=".get_schema());}if(!set_schema($_GET["ns"])){page_header(lang(80).": ".h($_GET["ns"]),lang(81),true);page_footer("ns");exit;}}function +select($i,$G=null,$ye=""){$Ja=array();$J=array();$B=array();$xe=array();$R=array();odd('');for($l=0;$a=$i->fetch_row();$l++){if(!$l){echo"\n","";for($ra=0;$rafetch_field();$Da=$e->orgtable;$Bc=$e->orgname;if($Da!=""){if(!isset($J[$Da])){$J[$Da]=array();foreach(indexes($Da,$G)as$x){if($x["type"]=="PRIMARY"){$J[$Da]=array_flip($x["columns"]);break;}}$B[$Da]=$J[$Da];}if(isset($B[$Da][$Bc])){unset($B[$Da][$Bc]);$J[$Da][$Bc]=$ra;$Ja[$ra]=$Da;}}if($e->charsetnr==63){$xe[$ra]=true;}$R[$ra]=$e->type;$f=h($e->name);echo"name!=$Bc?" title='".h(($Da!=""?"$Da.":"").$Bc)."'":"").">".($ye?"$f":$f);}echo"\n";}echo"";foreach($a +as$d=>$b){if(!isset($b)){$b="NULL";}else{if($xe[$d]&&!is_utf8($b)){$b="".lang(32,strlen($b))."";}elseif(!strlen($b)){$b=" ";}else{$b=h($b);if($R[$d]==254){$b="$b";}}if(isset($Ja[$d])&&!$B[$Ja[$d]]){$w="edit=".urlencode($Ja[$d]);foreach($J[$Ja[$d]]as$Pc=>$ra){$w.="&where".urlencode("[".bracket_escape($Pc)."]")."=".urlencode($a[$ra]);}$b="$b";}}echo"
$b";}}echo($l?"
":"

".lang(82))."\n";}function +referencable_primary($Tf){$c=array();foreach(table_status()as$Ea=>$h){if($Ea!=$Tf&&fk_support($h)){foreach(fields($Ea)as$e){if($e["primary"]){if($c[$Ea]){unset($c[$Ea]);break;}$c[$Ea]=$e;}}}}return$c;}function +textarea($f,$q,$H=10,$mb=80){echo"";}function +format_time($Fb,$Cc){return" (".lang(83,max(0,$Cc[0]-$Fb[0]+$Cc[1]-$Fb[1])).")";}function +edit_type($d,$e,$Z,$ha=array()){global$La,$R,$ob,$fb;echo' +',"',($ob?"':''),($ha?" ":" ");}function +process_length($W){global$Gb;return(preg_match("~^\\s*(?:$Gb)(?:\\s*,\\s*(?:$Gb))*\\s*\$~",$W)&&preg_match_all("~$Gb~",$W,$oa)?implode(",",$oa[0]):preg_replace('~[^0-9,+-]~','',$W));}function +process_type($e,$Dc="COLLATE"){global$ob;return" $e[type]".($e["length"]!=""?"(".process_length($e["length"]).")":"").(ereg('int|float|double|decimal',$e["type"])&&in_array($e["unsigned"],$ob)?" $e[unsigned]":"").(ereg('char|text|enum|set',$e["type"])&&$e["collation"]?" $Dc ".q($e["collation"]):"");}function +process_field($e,$Uc){return +array(idf_escape($e["field"]),process_type($Uc),($e["null"]?" NULL":" NOT NULL"),(isset($e["default"])?" DEFAULT ".($e["type"]=="timestamp"&&eregi("^CURRENT_TIMESTAMP$",$e["default"])?$e["default"]:q($e["default"])):""),($e["on_update"]?" ON UPDATE $e[on_update]":""),(support("comment")&&$e["comment"]!=""?" COMMENT ".q($e["comment"]):""),($e["auto_increment"]?auto_increment():null),);}function +type_class($z){foreach(array('char'=>'text','date'=>'time|year','binary'=>'blob','enum'=>'set',)as$d=>$b){if(ereg("$d|$b",$z)){return" class='$d'";}}}function +edit_fields($p,$Z,$z="TABLE",$we=0,$ha=array(),$Kb=false){global$jc;foreach($p +as$e){if($e["comment"]!=""){$Kb=true;break;}}echo' +';if($z=="PROCEDURE"){echo' ';}echo'',($z=="TABLE"?lang(87):lang(88)),'',lang(89),' +',lang(90),'',lang(91);if($z=="TABLE"){echo'NULL +AI +',lang(93),(support("comment")?"

".lang(94).": ".h($_a)."\n";}if($p){echo"\n","\n";foreach($p +as$e){echo"
".lang(101)."".lang(89).(support("comment")?"".lang(94):"")."
".h($e["field"]),"".h($e["full_type"]).($e["null"]?" NULL":"").($e["auto_increment"]?" ".lang(92)."":""),(support("comment")?"".nbsp($e["comment"]):""),"\n";}echo"
\n";if(!is_view($D)){echo"

".lang(102)."

\n";$J=indexes($m);if($J){echo"\n";foreach($J +as$f=>$x){ksort($x["columns"]);$zb=array();foreach($x["columns"]as$d=>$b){$zb[]="".h($b)."".($x["lengths"][$d]?"(".$x["lengths"][$d].")":"");}echo"
$x[type]".implode(", ",$zb)."\n";}echo"
\n";}echo'

'.lang(103)."\n";if(fk_support($D)){echo"

".lang(84)."

\n";$ha=foreign_keys($m);if($ha){echo"\n","\n";foreach($ha +as$f=>$A){$w=($A["db"]!=""?"".h($A["db"]).".":"").h($A["table"]);echo"","
".lang(104)."".lang(105)."".lang(86)."".lang(106).($v!="sqlite"?" ":"")."
".implode(", ",array_map('h',$A["source"]))."","$w","(".implode(", ",array_map('h',$A["target"])).")","$A[on_delete]\n","$A[on_update]\n";if($v!="sqlite"){echo''.lang(107).'';}}echo"
\n";}if($v!="sqlite"){echo'

'.lang(108)."\n";}}if(support("trigger")){echo"

".lang(109)."

\n";$Mc=triggers($m);if($Mc){echo"\n";foreach($Mc +as$d=>$b){echo"
$b[0]$b[1]".h($d)."".lang(107)."\n";}echo"
\n";}echo'

'.lang(110)."\n";}}}}elseif(isset($_GET["schema"])){page_header(lang(111),"",array(),DB);$sb=array();$ve=array();$f="adminer_schema";$hf=($_GET["schema"]?$_GET["schema"]:$_COOKIE[($_COOKIE["$f-".DB]?"$f-".DB:$f)]);preg_match_all('~([^:]+):([-0-9.]+)x([-0-9.]+)(_|$)~',$hf,$oa,PREG_SET_ORDER);foreach($oa +as$l=>$k){$sb[$k[1]]=array($k[2],$k[3]);$ve[]="\n\t'".js_escape($k[1])."': [ $k[2], $k[3] ]";}$Wb=0;$cf=-1;$Ka=array();$df=array();$We=array();foreach(table_status()as$a){if(!isset($a["Engine"])){continue;}$uc=0;$Ka[$a["Name"]]["fields"]=array();foreach(fields($a["Name"])as$f=>$e){$uc+=1.25;$e["pos"]=$uc;$Ka[$a["Name"]]["fields"][$f]=$e;}$Ka[$a["Name"]]["pos"]=($sb[$a["Name"]]?$sb[$a["Name"]]:array($Wb,0));foreach($o->foreignKeys($a["Name"])as$b){if(!$b["db"]){$Aa=$cf;if($sb[$a["Name"]][1]||$sb[$b["table"]][1]){$Aa=min(floatval($sb[$a["Name"]][1]),floatval($sb[$b["table"]][1]))-1;}else{$cf-=.1;}while($We[(string)$Aa]){$Aa-=.0001;}$Ka[$a["Name"]]["references"][$b["table"]][(string)$Aa]=array($b["source"],$b["target"]);$df[$b["table"]][$a["Name"]][(string)$Aa]=$b["target"];$We[(string)$Aa]=true;}}$Wb=max($Wb,$Ka[$a["Name"]]["pos"][0]+2.5+$uc);}echo'

+ +';foreach($Ka +as$f=>$h){echo"
",''.h($f)."
\n";foreach($h["fields"]as$e){$b=''.h($e["field"]).'';echo($e["primary"]?"$b":$b)."
\n";}foreach((array)$h["references"]as$Vb=>$_c){foreach($_c +as$Aa=>$hd){$wc=$Aa-$sb[$f][1];$l=0;foreach($hd[0]as$Ga){echo"
\n";}}}foreach((array)$df[$f]as$Vb=>$_c){foreach($_c +as$Aa=>$B){$wc=$Aa-$sb[$f][1];$l=0;foreach($B +as$ea){echo"
\n";}}}echo"
\n";}foreach($Ka +as$f=>$h){foreach((array)$h["references"]as$Vb=>$_c){foreach($_c +as$Aa=>$hd){$ed=$Wb;$ud=-10;foreach($hd[0]as$d=>$Ga){$Te=$h["pos"][0]+$h["fields"][$Ga]["pos"];$Xe=$Ka[$Vb]["pos"][0]+$Ka[$Vb]["fields"][$hd[1][$d]]["pos"];$ed=min($ed,$Te,$Xe);$ud=max($ud,$Te,$Xe);}echo"
\n";}}}echo'
+

',lang(112),' +';}elseif(isset($_GET["dump"])){$m=$_GET["dump"];if($_POST){$Ye="";foreach(array("output","format","db_style","routines","events","table_style","auto_increment","triggers","data_style")as$d){$Ye.="&$d=".urlencode($_POST[$d]);}cookie("adminer_export",substr($Ye,1));$Hb=dump_headers(($m!=""?$m:DB),(DB==""||count((array)$_POST["tables"]+(array)$_POST["data"])>1));$tb=($_POST["format"]=="sql");if($tb){echo"-- Adminer $tc ".$na[DRIVER]." dump + +".($v!="sql"?"":"SET NAMES utf8; +SET foreign_key_checks = 0; +SET time_zone = ".q($g->result("SELECT @@time_zone"))."; +SET sql_mode = 'NO_AUTO_VALUE_ON_ZERO'; + +");}$V=$_POST["db_style"];$_=array(DB);if(DB==""){$_=$_POST["databases"];if(is_string($_)){$_=explode("\n",rtrim(str_replace("\r","",$_),"\n"));}}foreach((array)$_ +as$t){if($g->select_db($t)){if($tb&&ereg('CREATE',$V)&&($la=$g->result("SHOW CREATE DATABASE ".idf_escape($t),1))){if($V=="DROP+CREATE"){echo"DROP DATABASE IF EXISTS ".idf_escape($t).";\n";}echo($V=="CREATE+ALTER"?preg_replace('~^CREATE DATABASE ~','\\0IF NOT EXISTS ',$la):$la).";\n";}if($tb){if($V){echo +use_sql($t).";\n\n";}if(in_array("CREATE+ALTER",array($V,$_POST["table_style"]))){echo"SET @adminer_alter = '';\n\n";}$qb="";if($_POST["routines"]){foreach(array("FUNCTION","PROCEDURE")as$Ta){foreach(get_rows("SHOW $Ta STATUS WHERE Db = ".q($t),null,"-- ")as$a){$qb.=($V!='DROP+CREATE'?"DROP $Ta IF EXISTS ".idf_escape($a["Name"]).";;\n":"").$g->result("SHOW CREATE $Ta ".idf_escape($a["Name"]),2).";;\n\n";}}}if($_POST["events"]){foreach(get_rows("SHOW EVENTS",null,"-- ")as$a){$qb.=($V!='DROP+CREATE'?"DROP EVENT IF EXISTS ".idf_escape($a["Name"]).";;\n":"").$g->result("SHOW CREATE EVENT ".idf_escape($a["Name"]),3).";;\n\n";}}if($qb){echo"DELIMITER ;;\n\n$qb"."DELIMITER ;\n\n";}}if($_POST["table_style"]||$_POST["data_style"]){$X=array();foreach(table_status()as$a){$h=(DB==""||in_array($a["Name"],(array)$_POST["tables"]));$Ze=(DB==""||in_array($a["Name"],(array)$_POST["data"]));if($h||$Ze){if(!is_view($a)){if($Hb=="tar"){ob_start();}$o->dumpTable($a["Name"],($h?$_POST["table_style"]:""));if($Ze){$o->dumpData($a["Name"],$_POST["data_style"],"SELECT * FROM ".table($a["Name"]));}if($tb&&$_POST["triggers"]&&$h&&($Mc=trigger_sql($a["Name"],$_POST["table_style"]))){echo"\nDELIMITER ;;\n$Mc\nDELIMITER ;\n";}if($Hb=="tar"){echo +tar_file((DB!=""?"":"$t/")."$a[Name].csv",ob_get_clean());}elseif($tb){echo"\n";}}elseif($tb){$X[]=$a["Name"];}}}foreach($X +as$cc){$o->dumpTable($cc,$_POST["table_style"],true);}if($Hb=="tar"){echo +pack("x512");}}if($V=="CREATE+ALTER"&&$tb){$j="SELECT TABLE_NAME, ENGINE, TABLE_COLLATION, TABLE_COMMENT FROM information_schema.TABLES WHERE TABLE_SCHEMA = DATABASE()";echo"DELIMITER ;; +CREATE PROCEDURE adminer_alter (INOUT alter_command text) BEGIN + DECLARE _table_name, _engine, _table_collation varchar(64); + DECLARE _table_comment varchar(64); + DECLARE done bool DEFAULT 0; + DECLARE tables CURSOR FOR $j; + DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; + OPEN tables; + REPEAT + FETCH tables INTO _table_name, _engine, _table_collation, _table_comment; + IF NOT done THEN + CASE _table_name";foreach(get_rows($j)as$a){$_a=q($a["ENGINE"]=="InnoDB"?preg_replace('~(?:(.+); )?InnoDB free: .*~','\\1',$a["TABLE_COMMENT"]):$a["TABLE_COMMENT"]);echo" + WHEN ".q($a["TABLE_NAME"])." THEN + ".(isset($a["ENGINE"])?"IF _engine != '$a[ENGINE]' OR _table_collation != '$a[TABLE_COLLATION]' OR _table_comment != $_a THEN + ALTER TABLE ".idf_escape($a["TABLE_NAME"])." ENGINE=$a[ENGINE] COLLATE=$a[TABLE_COLLATION] COMMENT=$_a; + END IF":"BEGIN END").";";}echo" + ELSE + SET alter_command = CONCAT(alter_command, 'DROP TABLE `', REPLACE(_table_name, '`', '``'), '`;\\n'); + END CASE; + END IF; + UNTIL done END REPEAT; + CLOSE tables; +END;; +DELIMITER ; +CALL adminer_alter(@adminer_alter); +DROP PROCEDURE adminer_alter; +";}if(in_array("CREATE+ALTER",array($V,$_POST["table_style"]))&&$tb){echo"SELECT @adminer_alter;\n";}}}if($tb){echo"-- ".$g->result("SELECT NOW()")."\n";}exit;}page_header(lang(113),"",($_GET["export"]!=""?array("table"=>$_GET["export"]):array()),DB);echo' +

+ +';$Ge=array('','USE','DROP+CREATE','CREATE');$se=array('','DROP+CREATE','CREATE');$Vd=array('','TRUNCATE+INSERT','INSERT');if($v=="sql"){$Ge[]='CREATE+ALTER';$se[]='CREATE+ALTER';$Vd[]='INSERT+UPDATE';}parse_str($_COOKIE["adminer_export"],$a);if(!$a){$a=array("output"=>"text","format"=>"sql","db_style"=>(DB!=""?"":"CREATE"),"table_style"=>"DROP+CREATE","data_style"=>"INSERT");}if(!isset($a["events"])){$a["routines"]=$a["events"]=($_GET["dump"]=="");$a["auto_increment"]=$a["triggers"]=$a["table_style"];}echo"
".lang(114)."".adminer_html_select("output",$o->dumpOutput(),$a["output"],0)."\n";echo"
".lang(115)."".adminer_html_select("format",$o->dumpFormat(),$a["format"],0)."\n";echo($v=="sqlite"?"":"
".lang(65)."".adminer_html_select('db_style',$Ge,$a["db_style"]).(support("routine")?checkbox("routines",1,$a["routines"],lang(116)):"").(support("event")?checkbox("events",1,$a["events"],lang(117)):"")),"
".lang(77)."".adminer_html_select('table_style',$se,$a["table_style"]).checkbox("auto_increment",1,$a["auto_increment"],lang(92)).(support("trigger")?checkbox("triggers",1,$a["triggers"],lang(109)):""),"
".lang(118)."".adminer_html_select('data_style',$Vd,$a["data_style"]),'
+

+ + +';$kd=array();if(DB!=""){$ab=($m!=""?"":" checked");echo"","\n";$X="";foreach(table_status()as$a){$f=$a["Name"];$zc=ereg_replace("_.*","",$f);$ab=($m==""||$m==(substr($m,-1)=="%"?"$zc%":$f));$zb="\n";$_=get_databases();if($_){foreach($_ +as$t){if(!information_schema($t)){$zc=ereg_replace("_.*","",$t);echo"
","","
".checkbox("tables[]",$f,$ab,$f,"formUncheck('check-tables');");if(is_view($a)){$X.="$zb\n";}else{echo"$zb\n";}$kd[$zc]++;}echo$X;}else{echo"
".checkbox("databases[]",$t,$m==""||$m=="$zc%",$t,"formUncheck('check-databases');")."\n";$kd[$zc]++;}}}else{echo"
";}}echo'
+

+';$Ba=true;foreach($kd +as$d=>$b){if($d!=""&&$b>1){echo($Ba?"

":" ")."".h($d)."";$Ba=false;}}}elseif(isset($_GET["privileges"])){page_header(lang(70));$i=$g->query("SELECT User, Host FROM mysql.user ORDER BY Host, User");if(!$i){echo'

+';hidden_fields_get();echo +lang(21),': +',lang(20),': + + +

+';$i=$g->query("SELECT SUBSTRING_INDEX(CURRENT_USER, '@', 1) AS User, SUBSTRING_INDEX(CURRENT_USER, '@', -1) AS Host");}echo"\n","\n";while($a=$i->fetch_assoc()){echo'
 ".lang(21)."".lang(20)."
'.lang(119).''.h($a["User"])."".h($a["Host"])."\n";}echo"
\n",'

'.lang(120)."";}elseif(isset($_GET["sql"])){if(!$n&&$_POST["export"]){dump_headers("sql");$o->dumpTable("","");$o->dumpData("","table",$_POST["query"]);exit;}restart_session();$Ff=&get_session("queries");$eb=&$Ff[DB];if(!$n&&$_POST["clear"]){$eb=array();redirect(remove_from_uri("history"));}page_header(lang(43),$n);if(!$n&&$_POST){$Pa=false;$j=$_POST["query"];if($_POST["webfile"]){$Pa=@fopen((file_exists("adminer.sql")?"adminer.sql":(file_exists("adminer.sql.gz")?"compress.zlib://adminer.sql.gz":"compress.bzip2://adminer.sql.bz2")),"rb");$j=($Pa?fread($Pa,1e6):false);}elseif($_FILES&&$_FILES["sql_file"]["error"]!=4){$j=get_file("sql_file",true);}if(is_string($j)){if(function_exists('memory_get_usage')){@ini_set("memory_limit",2*strlen($j)+memory_get_usage()+8e6);}if($j!=""&&strlen($j)<1e6){$aa=$j.(ereg(';$',$j)?"":";");if(!$eb||end($eb)!=$aa){$eb[]=$aa;}}$yc="(?:\\s|/\\*.*\\*/|(?:#|-- )[^\n]*\n|--\n)";if(!ini_bool("session.use_cookies")){session_write_close();}$ld=";";$L=0;$hc=true;$G=connect();if(is_object($G)&&DB!=""){$G->select_db(DB);}$Ab=0;$Zc=array();$Gf='[\'`"]'.($v=="pgsql"?'|\\$[^$]*\\$':($v=="mssql"||$v=="sqlite"?'|\\[':'')).'|/\\*|-- |#';$Hf=explode(" ",microtime());parse_str($_COOKIE["adminer_export"],$Xb);$Rd=$o->dumpFormat();unset($Rd["sql"]);while($j!=""){if(!$L&&$v=="sql"&&preg_match("~^$yc*DELIMITER\\s+(.+)~i",$j,$k)){$ld=$k[1];$j=substr($j,strlen($k[0]));}else{preg_match('('.preg_quote($ld)."|$Gf|\$)",$j,$k,PREG_OFFSET_CAPTURE,$L);$ta=$k[0][0];$L=$k[0][1]+strlen($ta);if(!$ta&&$Pa&&!feof($Pa)){$j.=fread($Pa,1e5);}else{if(!$ta&&rtrim($j)==""){break;}if($ta&&$ta!=$ld){while(preg_match('('.($ta=='/*'?'\\*/':($ta=='['?']':(ereg('^-- |^#',$ta)?"\n":preg_quote($ta)."|\\\\."))).'|$)s',$j,$k,PREG_OFFSET_CAPTURE,$L)){$ma=$k[0][0];$L=$k[0][1]+strlen($ma);if(!$ma&&$Pa&&!feof($Pa)){$j.=fread($Pa,1e6);}elseif($ma[0]!="\\"){break;}}}else{$hc=false;$aa=substr($j,0,$k[0][1]);$Ab++;$zb="

".shorten_utf8(trim($aa),1000)."
\n";if(!$_POST["only_errors"]){echo$zb;ob_flush();flush();}$Fb=explode(" ",microtime());if($g->multi_query($aa)){if(is_object($G)&&preg_match("~^$yc*USE\\b~isU",$aa)){$G->query($aa);}do{$i=$g->store_result();$Cc=explode(" ",microtime());$Qd=format_time($Fb,$Cc).(strlen($aa)<1000?" ".lang(31)."":"");if(!is_object($i)){if(preg_match("~^$yc*(CREATE|DROP|ALTER)$yc+(DATABASE|SCHEMA)\\b~isU",$aa)){restart_session();set_session("dbs",null);session_write_close();}if(!$_POST["only_errors"]){echo"

".lang(121,$g->affected_rows)."$Qd\n";}}else{select($i,$G);if(!$_POST["only_errors"]){echo"

\n","

".($i->num_rows?lang(122,$i->num_rows):"").$Qd;$S="export-$Ab";$Od=", ".lang(113)."";if($G&&preg_match("~^($yc|\\()*SELECT\\b~isU",$aa)&&($Cf=explain($G,$aa))){$S="explain-$Ab";echo", EXPLAIN$Od\n","

\n";}else{echo"$Od\n";}echo"
\n";}}$Fb=$Cc;}while($g->next_result());}elseif($g->error){echo($_POST["only_errors"]?$zb:""),"

".lang(123).": ".error()."\n";$Zc[]=" $Ab";if($_POST["error_stops"]){break;}}$j=substr($j,$L);$L=0;}}}}if($hc){echo"

".lang(124)."\n";}elseif($_POST["only_errors"]){echo"

".lang(125,$Ab-count($Zc)).format_time($Hf,explode(" ",microtime()))."\n";}elseif($Zc&&$Ab>1){echo"

".lang(123).": ".implode("",$Zc)."\n";}}else{echo"

".upload_error($j)."\n";}}echo' +

+

';$aa=$_GET["sql"];if($_POST){$aa=$_POST["query"];}elseif($_GET["history"]=="all"){$aa=$eb;}elseif($_GET["history"]!=""){$aa=$eb[$_GET["history"]];}textarea("query",$aa,20);echo($_POST?"":"\n"),"

".(ini_bool("file_uploads")?lang(126).': (< '.ini_get("upload_max_filesize").'B)':lang(127)),'

+ + +',checkbox("error_stops",1,$_POST["error_stops"],lang(129))."\n",checkbox("only_errors",1,$_POST["only_errors"],lang(130))."\n";print_fieldset("webfile",lang(131),$_POST["webfile"]);$td=array();foreach(array("gz"=>"zlib","bz2"=>"bz2")as$d=>$b){if(extension_loaded($b)){$td[]=".$d";}}echo +lang(132,"adminer.sql".($td?"[".implode("|",$td)."]":"").""),' ',"\n";if($eb){print_fieldset("history",lang(134),$_GET["history"]!="");foreach($eb +as$d=>$b){echo''.lang(31)." ".shorten_utf8(ltrim(str_replace("\n"," ",str_replace("\r","",preg_replace('~^(#|-- ).*~m','',$b)))),80,"")."
\n";}echo"\n","".lang(136)."\n","\n";}echo' +

+';}elseif(isset($_GET["edit"])){$m=$_GET["edit"];$s=(isset($_GET["select"])?(count($_POST["check"])==1?where_check($_POST["check"][0]):""):where($_GET));$qa=(isset($_GET["select"])?$_POST["edit"]:$s);$p=fields($m);foreach($p +as$f=>$e){if(!isset($e["privileges"][$qa?"update":"insert"])||$o->fieldName($e)==""){unset($p[$f]);}}if($_POST&&!$n&&!isset($_GET["select"])){$ga=$_POST["referer"];if($_POST["insert"]){$ga=($qa?null:$_SERVER["REQUEST_URI"]);}elseif(!ereg('^.+&select=.+$',$ga)){$ga=ME."select=".urlencode($m);}if(isset($_POST["delete"])){query_redirect("DELETE".limit1("FROM ".table($m)," WHERE $s"),$ga,lang(137));}else{$r=array();foreach($p +as$f=>$e){$b=process_input($e);if($b!==false&&$b!==null){$r[idf_escape($f)]=($qa?"\n".idf_escape($f)." = $b":$b);}}if($qa){if(!$r){redirect($ga);}query_redirect("UPDATE".limit1(table($m)." SET".implode(",",$r),"\nWHERE $s"),$ga,lang(138));}else{$i=insert_into($m,$r);$ue=($i?last_id():0);queries_redirect($ga,lang(139,($ue?" $ue":"")),$i);}}}$Ea=$o->tableName(table_status($m));page_header(($qa?lang(31):lang(140)),$n,array("select"=>array($m,$Ea)),$Ea);$a=null;if($_POST["save"]){$a=(array)$_POST["fields"];}elseif($s){$Q=array();foreach($p +as$f=>$e){if(isset($e["privileges"]["select"])){$Q[]=($_POST["clone"]&&$e["auto_increment"]?"'' AS ":(ereg("enum|set",$e["type"])?"1*".idf_escape($f)." AS ":"")).idf_escape($f);}}$a=array();if($Q){$H=get_rows("SELECT".limit(implode(", ",$Q)." FROM ".table($m)," WHERE $s",(isset($_GET["select"])?2:1)));$a=(isset($_GET["select"])&&count($H)!=1?null:reset($H));}}echo' +
+';if($p){echo"\n";foreach($p +as$f=>$e){echo"
".$o->fieldName($e);$za=$_GET["set"][bracket_escape($f)];$q=(isset($a)?($a[$f]!=""&&ereg("enum|set",$e["type"])?+$a[$f]:$a[$f]):(!$qa&&$e["auto_increment"]?"":(isset($_GET["select"])?false:(isset($za)?$za:$e["default"]))));if(!$_POST["save"]&&is_string($q)){$q=$o->editVal($q,$e);}$K=($_POST["save"]?(string)$_POST["function"][$f]:($s&&$e["on_update"]=="CURRENT_TIMESTAMP"?"now":($q===false?null:(isset($q)?'':'NULL'))));if($e["type"]=="timestamp"&&$q=="CURRENT_TIMESTAMP"){$q="";$K="now";}input($e,$q,$K);echo"\n";}echo"
\n";}echo'

+';if($p){echo"\n";if(!isset($_GET["select"])){echo'\n";}}echo($qa?"\n":($_POST||!$p?"":"\n"));if(isset($_GET["select"])){hidden_fields(array("check"=>(array)$_POST["check"],"clone"=>$_POST["clone"],"all"=>$_POST["all"]));}echo' + + +

+';}elseif(isset($_GET["create"])){$m=$_GET["create"];$pe=array('HASH','LINEAR HASH','KEY','LINEAR KEY','RANGE','LIST');$ce=referencable_primary($m);$ha=array();foreach($ce +as$Ea=>$e){$ha[str_replace("`","``",$Ea)."`".str_replace("`","``",$e["field"])]=$Ea;}$Kc=array();$Jc=array();if($m!=""){$Kc=fields($m);$Jc=table_status($m);}if($_POST&&!$_POST["fields"]){$_POST["fields"]=array();}if($_POST&&!$n&&!$_POST["add"]&&!$_POST["drop_col"]&&!$_POST["up"]&&!$_POST["down"]){if($_POST["drop"]){query_redirect("DROP TABLE ".table($m),substr(ME,0,-1),lang(145));}else{$p=array();$Oa=array();ksort($_POST["fields"]);$vd=reset($Kc);$Jb="FIRST";foreach($_POST["fields"]as$d=>$e){$A=$ha[$e["type"]];$Uc=(isset($A)?$ce[$A]:$e);if($e["field"]!=""){if(!$e["has_default"]){$e["default"]=null;}$za=eregi_replace(" *on update CURRENT_TIMESTAMP","",$e["default"]);if($za!=$e["default"]){$e["on_update"]="CURRENT_TIMESTAMP";$e["default"]=$za;}if($d==$_POST["auto_increment_col"]){$e["auto_increment"]=true;}$qe=process_field($e,$Uc);if($qe!=process_field($vd,$vd)){$p[]=array($e["orig"],$qe,$Jb);}if(isset($A)){$Oa[idf_escape($e["field"])]=($m!=""?"ADD":" ")." FOREIGN KEY (".idf_escape($e["field"]).") REFERENCES ".table($ha[$e["type"]])." (".idf_escape($Uc["field"]).")".(in_array($e["on_delete"],$fb)?" ON DELETE $e[on_delete]":"");}$Jb="AFTER ".idf_escape($e["field"]);}elseif($e["orig"]!=""){$p[]=array($e["orig"]);}if($e["orig"]!=""){$vd=next($Kc);}}$vb="";if(in_array($_POST["partition_by"],$pe)){$yd=array();if($_POST["partition_by"]=='RANGE'||$_POST["partition_by"]=='LIST'){foreach(array_filter($_POST["partition_names"])as$d=>$b){$q=$_POST["partition_values"][$d];$yd[]="\nPARTITION ".idf_escape($b)." VALUES ".($_POST["partition_by"]=='RANGE'?"LESS THAN":"IN").($q!=""?" ($q)":" MAXVALUE");}}$vb.="\nPARTITION BY $_POST[partition_by]($_POST[partition])".($yd?" (".implode(",",$yd)."\n)":($_POST["partitions"]?" PARTITIONS ".(+$_POST["partitions"]):""));}elseif($m!=""&&support("partitioning")){$vb.="\nREMOVE PARTITIONING";}$va=lang(146);if($m==""){cookie("adminer_engine",$_POST["Engine"]);$va=lang(147);}queries_redirect(ME."table=".urlencode($_POST["name"]),$va,alter_table($m,$_POST["name"],$p,$Oa,$_POST["Comment"],($_POST["Engine"]&&$_POST["Engine"]!=$Jc["Engine"]?$_POST["Engine"]:""),($_POST["Collation"]&&$_POST["Collation"]!=$Jc["Collation"]?$_POST["Collation"]:""),($_POST["Auto_increment"]!=""?+$_POST["Auto_increment"]:""),$vb));}}page_header(($m!=""?lang(28):lang(148)),$n,array("table"=>$m),$m);$a=array("Engine"=>$_COOKIE["adminer_engine"],"fields"=>array(array("field"=>"","type"=>(isset($R["int"])?"int":(isset($R["integer"])?"integer":"")))),"partition_names"=>array(""),);if($_POST){$a=$_POST;if($a["auto_increment_col"]){$a["fields"][$a["auto_increment_col"]]["auto_increment"]=true;}process_fields($a["fields"]);}elseif($m!=""){$a=$Jc;$a["name"]=$m;$a["fields"]=array();if(!$_GET["auto_increment"]){$a["Auto_increment"]="";}foreach($Kc +as$e){$e["has_default"]=isset($e["default"]);if($e["on_update"]){$e["default"].=" ON UPDATE $e[on_update]";}$a["fields"][]=$e;}if(support("partitioning")){$Yb="FROM information_schema.PARTITIONS WHERE TABLE_SCHEMA = ".q(DB)." AND TABLE_NAME = ".q($m);$i=$g->query("SELECT PARTITION_METHOD, PARTITION_ORDINAL_POSITION, PARTITION_EXPRESSION $Yb ORDER BY PARTITION_ORDINAL_POSITION DESC LIMIT 1");list($a["partition_by"],$a["partitions"],$a["partition"])=$i->fetch_row();$a["partition_names"]=array();$a["partition_values"]=array();foreach(get_rows("SELECT PARTITION_NAME, PARTITION_DESCRIPTION $Yb AND PARTITION_NAME != '' ORDER BY PARTITION_ORDINAL_POSITION")as$dd){$a["partition_names"][]=$dd["PARTITION_NAME"];$a["partition_values"][]=$dd["PARTITION_DESCRIPTION"];}$a["partition_names"][]="";}}$Z=collations();$qd=floor(extension_loaded("suhosin")?(min(ini_get("suhosin.request.max_vars"),ini_get("suhosin.post.max_vars"))-13)/10:0);if($qd&&count($a["fields"])>$qd){echo"

".h(lang(149,'suhosin.post.max_vars','suhosin.request.max_vars'))."\n";}$wd=engines();foreach($wd +as$yb){if(!strcasecmp($yb,$a["Engine"])){$a["Engine"]=$yb;break;}}echo' +

+

+',lang(150),': +';if($m==""&&!$_POST){?>"(".lang(151).")")+$wd,$a["Engine"]):""),' ',($Z&&!ereg("sqlite|mssql",$v)?adminer_html_select("Collation",array(""=>"(".lang(85).")")+$Z,$a["Collation"]):""),' + +';$Kb=edit_fields($a["fields"],$Z,"TABLE",$qd,$ha,$a["Comment"]!="");echo'
+

+',lang(92),': + +',(support("comment")?checkbox("","",$Kb,lang(94),"columnShow(this.checked, 6); toggle('Comment'); if (this.checked) this.form['Comment'].focus();").' ':''),'

+ +';if($_GET["create"]!=""){echo'';}echo' +';if(support("partitioning")){$me=ereg('RANGE|LIST',$a["partition_by"]);print_fieldset("partition",lang(152),$a["partition_by"]);echo'

+',adminer_html_select("partition_by",array(-1=>"")+$pe,$a["partition_by"],"partitionByChange(this);"),'() +',lang(153),': + + +';foreach($a["partition_names"]as$d=>$b){echo'',' + +';}echo'

+';}elseif(isset($_GET["indexes"])){$m=$_GET["indexes"];$Nc=array("PRIMARY","UNIQUE","INDEX");$D=table_status($m);if(eregi("MyISAM|M?aria",$D["Engine"])){$Nc[]="FULLTEXT";}$J=indexes($m);if($v=="sqlite"){unset($Nc[0]);unset($J[""]);}if($_POST&&!$n&&!$_POST["add"]){$u=array();foreach($_POST["indexes"]as$x){if(in_array($x["type"],$Nc)){$B=array();$ec=array();$r=array();ksort($x["columns"]);foreach($x["columns"]as$d=>$C){if($C!=""){$W=$x["lengths"][$d];$r[]=idf_escape($C).($W?"(".(+$W).")":"");$B[]=$C;$ec[]=($W?$W:null);}}if($B){foreach($J +as$f=>$Bb){ksort($Bb["columns"]);ksort($Bb["lengths"]);if($x["type"]==$Bb["type"]&&array_values($Bb["columns"])===$B&&(!$Bb["lengths"]||array_values($Bb["lengths"])===$ec)){unset($J[$f]);continue +2;}}$u[]=array($x["type"],"(".implode(", ",$r).")");}}}foreach($J +as$f=>$Bb){$u[]=array($Bb["type"],idf_escape($f),"DROP");}if(!$u){redirect(ME."table=".urlencode($m));}queries_redirect(ME."table=".urlencode($m),lang(156),alter_indexes($m,$u));}page_header(lang(102),$n,array("table"=>$m),$m);$p=array_keys(fields($m));$a=array("indexes"=>$J);if($_POST){$a=$_POST;if($_POST["add"]){foreach($a["indexes"]as$d=>$x){if($x["columns"][count($x["columns"])]!=""){$a["indexes"][$d]["columns"][]="";}}$x=end($a["indexes"]);if($x["type"]||array_filter($x["columns"],'strlen')||array_filter($x["lengths"],'strlen')){$a["indexes"][]=array("columns"=>array(1=>""));}}}else{foreach($a["indexes"]as$d=>$x){$a["indexes"][$d]["columns"][]="";}$a["indexes"][]=array("columns"=>array(1=>""));}echo' +
+ + +';$ra=1;foreach($a["indexes"]as$x){echo"
',lang(157),'',lang(158),'
".adminer_html_select("indexes[$ra][type]",array(-1=>"")+$Nc,$x["type"],($ra==count($a["indexes"])?"indexesAddRow(this);":1))."";ksort($x["columns"]);$l=1;foreach($x["columns"]as$d=>$C){echo"".adminer_html_select("indexes[$ra][columns][$l]",array(-1=>"")+$p,$C,($l==count($x["columns"])?"indexesAddColumn(this);":1))," ";$l++;}$ra++;}echo'
+

+ +

+ +

+';}elseif(isset($_GET["database"])){if($_POST&&!$n&&!isset($_POST["add_x"])){restart_session();if($_POST["drop"]){$_GET["db"]="";queries_redirect(remove_from_uri("db|database"),lang(159),drop_databases(array(DB)));}elseif(DB!==$_POST["name"]){if(DB!=""){$_GET["db"]=$_POST["name"];queries_redirect(preg_replace('~db=[^&]*&~','',ME)."db=".urlencode($_POST["name"]),lang(160),rename_database($_POST["name"],$_POST["collation"]));}else{$_=explode("\n",str_replace("\r","",$_POST["name"]));$ee=true;$xb="";foreach($_ +as$t){if(count($_)==1||$t!=""){if(!create_database($t,$_POST["collation"])){$ee=false;}$xb=$t;}}queries_redirect(ME."db=".urlencode($xb),lang(161),$ee);}}else{if(!$_POST["collation"]){redirect(substr(ME,0,-1));}query_redirect("ALTER DATABASE ".idf_escape($_POST["name"]).(eregi('^[a-z0-9_]+$',$_POST["collation"])?" COLLATE $_POST[collation]":""),substr(ME,0,-1),lang(162));}}page_header(DB!=""?lang(46):lang(163),$n,array(),DB);$Z=collations();$f=DB;$Dc=null;if($_POST){$f=$_POST["name"];$Dc=$_POST["collation"];}elseif(DB!=""){$Dc=db_collation(DB,$Z);}elseif($v=="sql"){foreach(get_vals("SHOW GRANTS")as$ka){if(preg_match('~ ON (`(([^\\\\`]|``|\\\\.)*)%`\\.\\*)?~',$ka,$k)&&$k[1]){$f=stripcslashes(idf_unescape("`$k[2]`"));break;}}}echo' +
+

+',($_POST["add_x"]||strpos($f,"\n")?'
':'')."\n".($Z?adminer_html_select("collation",array(""=>"(".lang(85).")")+$Z,$Dc):"");?> + + +';if(DB!=""){echo"\n";}elseif(!$_POST["add_x"]&&$_GET["db"]==""){echo"\n";}echo' +

+';}elseif(isset($_GET["scheme"])){if($_POST&&!$n){$w=preg_replace('~ns=[^&]*&~','',ME)."ns=";if($_POST["drop"]){query_redirect("DROP SCHEMA ".idf_escape($_GET["ns"]),$w,lang(164));}else{$w.=urlencode($_POST["name"]);if($_GET["ns"]==""){query_redirect("CREATE SCHEMA ".idf_escape($_POST["name"]),$w,lang(165));}elseif($_GET["ns"]!=$_POST["name"]){query_redirect("ALTER SCHEMA ".idf_escape($_GET["ns"])." RENAME TO ".idf_escape($_POST["name"]),$w,lang(166));}else{redirect($w);}}}page_header($_GET["ns"]!=""?lang(47):lang(48),$n);$a=array("name"=>$_GET["ns"]);if($_POST){$a=$_POST;}echo' +
+

+ +';if($_GET["ns"]!=""){echo"\n";}echo' +

+';}elseif(isset($_GET["call"])){$Va=$_GET["call"];page_header(lang(167).": ".h($Va),$n);$Ta=routine($Va,(isset($_GET["callf"])?"FUNCTION":"PROCEDURE"));$Tb=array();$qb=array();foreach($Ta["fields"]as$l=>$e){if(substr($e["inout"],-3)=="OUT"){$qb[$l]="@".idf_escape($e["field"])." AS ".idf_escape($e["field"]);}if(!$e["inout"]||substr($e["inout"],0,2)=="IN"){$Tb[]=$l;}}if(!$n&&$_POST){$de=array();foreach($Ta["fields"]as$d=>$e){if(in_array($d,$Tb)){$b=process_input($e);if($b===false){$b="''";}if(isset($qb[$d])){$g->query("SET @".idf_escape($e["field"])." = $b");}}$de[]=(isset($qb[$d])?"@".idf_escape($e["field"]):$b);}$j=(isset($_GET["callf"])?"SELECT":"CALL")." ".idf_escape($Va)."(".implode(", ",$de).")";echo"

".h($j)." ".lang(31)."\n";if(!$g->multi_query($j)){echo"

".error()."\n";}else{do{$i=$g->store_result();if(is_object($i)){select($i);}else{echo"

".lang(168,$g->affected_rows)."\n";}}while($g->next_result());if($qb){select($g->query("SELECT ".implode(", ",$qb)));}}}echo' +

+';if($Tb){echo"\n";foreach($Tb +as$d){$e=$Ta["fields"][$d];$f=$e["field"];echo"
".$o->fieldName($e);$q=$_POST["fields"][$f];if($q!=""){if($e["type"]=="enum"){$q=+$q;}if($e["type"]=="set"){$q=array_sum($q);}}input($e,$q,(string)$_POST["function"][$f]);echo"\n";}echo"
\n";}echo'

+ + +

+';}elseif(isset($_GET["foreign"])){$m=$_GET["foreign"];if($_POST&&!$n&&!$_POST["add"]&&!$_POST["change"]&&!$_POST["change-js"]){if($_POST["drop"]){query_redirect("ALTER TABLE ".table($m)."\nDROP ".($v=="sql"?"FOREIGN KEY ":"CONSTRAINT ").idf_escape($_GET["name"]),ME."table=".urlencode($m),lang(169));}else{$Ga=array_filter($_POST["source"],'strlen');ksort($Ga);$ea=array();foreach($Ga +as$d=>$b){$ea[$d]=$_POST["target"][$d];}query_redirect("ALTER TABLE ".table($m).($_GET["name"]!=""?"\nDROP FOREIGN KEY ".idf_escape($_GET["name"]).",":"")."\nADD FOREIGN KEY (".implode(", ",array_map('idf_escape',$Ga)).") REFERENCES ".table($_POST["table"])." (".implode(", ",array_map('idf_escape',$ea)).")".(in_array($_POST["on_delete"],$fb)?" ON DELETE $_POST[on_delete]":"").(in_array($_POST["on_update"],$fb)?" ON UPDATE $_POST[on_update]":""),ME."table=".urlencode($m),($_GET["name"]!=""?lang(170):lang(171)));$n=lang(172)."
$n";}}page_header(lang(173),$n,array("table"=>$m),$m);$a=array("table"=>$m,"source"=>array(""));if($_POST){$a=$_POST;ksort($a["source"]);if($_POST["add"]){$a["source"][]="";}elseif($_POST["change"]||$_POST["change-js"]){$a["target"]=array();}}elseif($_GET["name"]!=""){$ha=foreign_keys($m);$a=$ha[$_GET["name"]];$a["source"][]="";}$Ga=array_keys(fields($m));$ea=($m===$a["table"]?$Ga:array_keys(fields($a["table"])));$je=array();foreach(table_status()as$f=>$D){if(fk_support($D)){$je[]=$f;}}echo' +
+

+';if($a["db"]==""){echo +lang(174),': +',adminer_html_select("table",$je,$a["table"],"this.form['change-js'].value = '1'; this.form.submit();"),' +

+ + +';$ra=0;foreach($a["source"]as$d=>$b){echo"","
',lang(104),'',lang(105),'
".adminer_html_select("source[".(+$d)."]",array(-1=>"")+$Ga,$b,($ra==count($a["source"])-1?"foreignAddRow(this);":1)),"".adminer_html_select("target[".(+$d)."]",$ea,$a["target"][$d]);$ra++;}echo'
+

+',lang(86),': ',adminer_html_select("on_delete",array(-1=>"")+$fb,$a["on_delete"]),' ',lang(106),': ',adminer_html_select("on_update",array(-1=>"")+$fb,$a["on_update"]),'

+ +

+';}if($_GET["name"]!=""){echo'';}echo' +

+';}elseif(isset($_GET["view"])){$m=$_GET["view"];$hb=false;if($_POST&&!$n){$hb=drop_create("DROP VIEW ".table($m),"CREATE VIEW ".table($_POST["name"])." AS\n$_POST[select]",($_POST["drop"]?substr(ME,0,-1):ME."table=".urlencode($_POST["name"])),lang(177),lang(178),lang(179),$m);}page_header(($m!=""?lang(27):lang(180)),$n,array("table"=>$m),$m);$a=array();if($_POST){$a=$_POST;}elseif($m!=""){$a=view($m);$a["name"]=$m;}echo' +
+

',lang(181),': +

';textarea("select",$a["select"]);echo'

+';if($hb){echo'';}echo' +';if($_GET["view"]!=""){echo'';}echo' +

+';}elseif(isset($_GET["event"])){$ib=$_GET["event"];$ie=array("YEAR","QUARTER","MONTH","DAY","HOUR","MINUTE","WEEK","SECOND","YEAR_MONTH","DAY_HOUR","DAY_MINUTE","DAY_SECOND","HOUR_MINUTE","HOUR_SECOND","MINUTE_SECOND");$Md=array("ENABLED"=>"ENABLE","DISABLED"=>"DISABLE","SLAVESIDE_DISABLED"=>"DISABLE ON SLAVE");if($_POST&&!$n){if($_POST["drop"]){query_redirect("DROP EVENT ".idf_escape($ib),substr(ME,0,-1),lang(182));}elseif(in_array($_POST["INTERVAL_FIELD"],$ie)&&isset($Md[$_POST["STATUS"]])){$he="\nON SCHEDULE ".($_POST["INTERVAL_VALUE"]?"EVERY ".q($_POST["INTERVAL_VALUE"])." $_POST[INTERVAL_FIELD]".($_POST["STARTS"]?" STARTS ".q($_POST["STARTS"]):"").($_POST["ENDS"]?" ENDS ".q($_POST["ENDS"]):""):"AT ".q($_POST["STARTS"]))." ON COMPLETION".($_POST["ON_COMPLETION"]?"":" NOT")." PRESERVE";queries_redirect(substr(ME,0,-1),($ib!=""?lang(183):lang(184)),queries(($ib!=""?"ALTER EVENT ".idf_escape($ib).$he.($ib!=$_POST["EVENT_NAME"]?"\nRENAME TO ".idf_escape($_POST["EVENT_NAME"]):""):"CREATE EVENT ".idf_escape($_POST["EVENT_NAME"]).$he)."\n".$Md[$_POST["STATUS"]]." COMMENT ".q($_POST["EVENT_COMMENT"]).rtrim(" DO\n$_POST[EVENT_DEFINITION]",";").";"));}}page_header(($ib!=""?lang(185).": ".h($ib):lang(186)),$n);$a=array();if($_POST){$a=$_POST;}elseif($ib!=""){$H=get_rows("SELECT * FROM information_schema.EVENTS WHERE EVENT_SCHEMA = ".q(DB)." AND EVENT_NAME = ".q($ib));$a=reset($H);}echo' +
+ +
',lang(181),' +
',lang(187),' +
',lang(188),' +
',lang(189),' ',adminer_html_select("INTERVAL_FIELD",$ie,$a["INTERVAL_FIELD"]),'
',lang(73),'',adminer_html_select("STATUS",$Md,$a["STATUS"]),'
',lang(94),' +
 ',checkbox("ON_COMPLETION","PRESERVE",$a["ON_COMPLETION"]=="PRESERVE",lang(190)),'
+

';textarea("EVENT_DEFINITION",$a["EVENT_DEFINITION"]);echo'

+ +';if($ib!=""){echo'';}echo' +

+';}elseif(isset($_GET["procedure"])){$Va=$_GET["procedure"];$Ta=(isset($_GET["function"])?"FUNCTION":"PROCEDURE");$hb=false;if($_POST&&!$n&&!$_POST["add"]&&!$_POST["drop_col"]&&!$_POST["up"]&&!$_POST["down"]){$r=array();$p=(array)$_POST["fields"];ksort($p);foreach($p +as$e){if($e["field"]!=""){$r[]=(in_array($e["inout"],$jc)?"$e[inout] ":"").idf_escape($e["field"]).process_type($e,"CHARACTER SET");}}$hb=drop_create("DROP $Ta ".idf_escape($Va),"CREATE $Ta ".idf_escape($_POST["name"])." (".implode(", ",$r).")".(isset($_GET["function"])?" RETURNS".process_type($_POST["returns"],"CHARACTER SET"):"").rtrim("\n$_POST[definition]",";").";",substr(ME,0,-1),lang(191),lang(192),lang(193),$Va);}page_header(($Va!=""?(isset($_GET["function"])?lang(194):lang(195)).": ".h($Va):(isset($_GET["function"])?lang(196):lang(197))),$n);$Z=get_vals("SHOW CHARACTER SET");sort($Z);$a=array("fields"=>array());if($_POST){$a=$_POST;$a["fields"]=(array)$a["fields"];process_fields($a["fields"]);}elseif($Va!=""){$a=routine($Va,$Ta);$a["name"]=$Va;}echo' +
+

',lang(181),': + +';edit_fields($a["fields"],$Z,$Ta);if(isset($_GET["function"])){echo"
".lang(198);edit_type("returns",$a["returns"],$Z);}echo'
+

';textarea("definition",$a["definition"]);echo'

+ +';if($Va!=""){echo'';}if($hb){echo'';}echo' +

+';}elseif(isset($_GET["sequence"])){$Eb=$_GET["sequence"];if($_POST&&!$n){$w=substr(ME,0,-1);if($_POST["drop"]){query_redirect("DROP SEQUENCE ".idf_escape($Eb),$w,lang(199));}elseif($Eb==""){query_redirect("CREATE SEQUENCE ".idf_escape($_POST["name"]),$w,lang(200));}elseif($Eb!=$_POST["name"]){query_redirect("ALTER SEQUENCE ".idf_escape($Eb)." RENAME TO ".idf_escape($_POST["name"]),$w,lang(201));}else{redirect($w);}}page_header($Eb!=""?lang(202).": ".h($Eb):lang(203),$n);$a=array("name"=>$Eb);if($_POST){$a=$_POST;}echo' +
+

+ +';if($Eb!=""){echo"\n";}echo' +

+';}elseif(isset($_GET["type"])){$Oc=$_GET["type"];if($_POST&&!$n){$w=substr(ME,0,-1);if($_POST["drop"]){query_redirect("DROP TYPE ".idf_escape($Oc),$w,lang(204));}else{query_redirect("CREATE TYPE ".idf_escape($_POST["name"])." $_POST[as]",$w,lang(205));}}page_header($Oc!=""?lang(206).": ".h($Oc):lang(207),$n);$a["as"]="AS ";if($_POST){$a=$_POST;}echo' +
+

+';if($Oc!=""){echo"\n";}else{echo"\n";textarea("as",$a["as"]);echo"

\n";}echo' +

+';}elseif(isset($_GET["trigger"])){$m=$_GET["trigger"];$Ic=trigger_options();$te=array("INSERT","UPDATE","DELETE");$hb=false;if($_POST&&!$n&&in_array($_POST["Timing"],$Ic["Timing"])&&in_array($_POST["Event"],$te)&&in_array($_POST["Type"],$Ic["Type"])){$re=" $_POST[Timing] $_POST[Event]";$Cb=" ON ".table($m);$hb=drop_create("DROP TRIGGER ".idf_escape($_GET["name"]).($v=="pgsql"?$Cb:""),"CREATE TRIGGER ".idf_escape($_POST["Trigger"]).($v=="mssql"?$Cb.$re:$re.$Cb).rtrim(" $_POST[Type]\n$_POST[Statement]",";").";",ME."table=".urlencode($m),lang(208),lang(209),lang(210),$_GET["name"]);}page_header(($_GET["name"]!=""?lang(211).": ".h($_GET["name"]):lang(212)),$n,array("table"=>$m));$a=array("Trigger"=>$m."_bi");if($_POST){$a=$_POST;}elseif($_GET["name"]!=""){$a=trigger($_GET["name"]);}echo' +
+ +
',lang(213),'',adminer_html_select("Timing",$Ic["Timing"],$a["Timing"],"if (/^".h(preg_quote($m,"/"))."_[ba][iud]$/.test(this.form['Trigger'].value)) this.form['Trigger'].value = '".h(js_escape($m))."_' + selectValue(this).charAt(0).toLowerCase() + selectValue(this.form['Event']).charAt(0).toLowerCase();"),'
',lang(214),'',adminer_html_select("Event",$te,$a["Event"],"this.form['Timing'].onchange();"),'
',lang(89),'',adminer_html_select("Type",$Ic["Type"],$a["Type"]),'
+

',lang(181),': +

';textarea("Statement",$a["Statement"]);echo'

+ +';if($_GET["name"]!=""){echo'';}if($hb){echo'';}echo' +

+';}elseif(isset($_GET["user"])){$Fd=$_GET["user"];$sa=array(""=>array("All privileges"=>""));foreach(get_rows("SHOW PRIVILEGES")as$a){foreach(explode(",",($a["Privilege"]=="Grant option"?"":$a["Context"]))as$Gc){$sa[$Gc][$a["Privilege"]]=$a["Comment"];}}$sa["Server Admin"]+=$sa["File access on server"];$sa["Databases"]["Create routine"]=$sa["Procedures"]["Create routine"];unset($sa["Procedures"]["Create routine"]);$sa["Columns"]=array();foreach(array("Select","Insert","Update","References")as$b){$sa["Columns"][$b]=$sa["Tables"][$b];}unset($sa["Server Admin"]["Usage"]);foreach($sa["Tables"]as$d=>$b){unset($sa["Databases"][$d]);}$nc=array();if($_POST){foreach($_POST["objects"]as$d=>$b){$nc[$b]=(array)$nc[$b]+(array)$_POST["grants"][$d];}}$nb=array();$Xc="";if(isset($_GET["host"])&&($i=$g->query("SHOW GRANTS FOR ".q($Fd)."@".q($_GET["host"])))){while($a=$i->fetch_row()){if(preg_match('~GRANT (.*) ON (.*) TO ~',$a[0],$k)&&preg_match_all('~ *([^(,]*[^ ,(])( *\\([^)]+\\))?~',$k[1],$oa,PREG_SET_ORDER)){foreach($oa +as$b){if($b[1]!="USAGE"){$nb["$k[2]$b[2]"][$b[1]]=true;}if(ereg(' WITH GRANT OPTION',$a[0])){$nb["$k[2]$b[2]"]["GRANT OPTION"]=true;}}}if(preg_match("~ IDENTIFIED BY PASSWORD '([^']+)~",$a[0],$k)){$Xc=$k[1];}}}if($_POST&&!$n){$ac=(isset($_GET["host"])?q($Fd)."@".q($_GET["host"]):"''");$pb=q($_POST["user"])."@".q($_POST["host"]);$Ad=q($_POST["pass"]);if($_POST["drop"]){query_redirect("DROP USER $ac",ME."privileges=",lang(215));}else{if($ac!=$pb){$n=!queries(($g->server_info<5?"GRANT USAGE ON *.* TO":"CREATE USER")." $pb IDENTIFIED BY".($_POST["hashed"]?" PASSWORD":"")." $Ad");}elseif($_POST["pass"]!=$Xc||!$_POST["hashed"]){queries("SET PASSWORD FOR $pb = ".($_POST["hashed"]?$Ad:"PASSWORD($Ad)"));}if(!$n){$qc=array();foreach($nc +as$bb=>$ka){if(isset($_GET["grant"])){$ka=array_filter($ka);}$ka=array_keys($ka);if(isset($_GET["grant"])){$qc=array_diff(array_keys(array_filter($nc[$bb],'strlen')),$ka);}elseif($ac==$pb){$Sd=array_keys((array)$nb[$bb]);$qc=array_diff($Sd,$ka);$ka=array_diff($ka,$Sd);unset($nb[$bb]);}if(preg_match('~^(.+)\\s*(\\(.*\\))?$~U',$bb,$k)&&(!grant("REVOKE",$qc,$k[2]," ON $k[1] FROM $pb")||!grant("GRANT",$ka,$k[2]," ON $k[1] TO $pb"))){$n=true;break;}}}if(!$n&&isset($_GET["host"])){if($ac!=$pb){queries("DROP USER $ac");}elseif(!isset($_GET["grant"])){foreach($nb +as$bb=>$qc){if(preg_match('~^(.+)(\\(.*\\))?$~U',$bb,$k)){grant("REVOKE",array_keys($qc),$k[2]," ON $k[1] FROM $pb");}}}}queries_redirect(ME."privileges=",(isset($_GET["host"])?lang(216):lang(217)),!$n);if($ac!=$pb){$g->query("DROP USER $pb");}}}page_header((isset($_GET["host"])?lang(21).": ".h("$Fd@$_GET[host]"):lang(120)),$n,array("privileges"=>array('',lang(70))));if($_POST){$a=$_POST;$nb=$nc;}else{$a=$_GET+array("host"=>$g->result("SELECT SUBSTRING_INDEX(CURRENT_USER, '@', -1)"));$a["pass"]=$Xc;if($Xc!=""){$a["hashed"]=true;}$nb[""]=true;}echo'
+ +
',lang(21),' +
',lang(20),' +
',lang(22),' +';if(!$a["hashed"]){echo'';}echo +checkbox("hashed",1,$a["hashed"],lang(218),"typePassword(this.form['pass'], this.checked);"),'
+ +';echo"\n","\n";foreach(array(""=>"","Server Admin"=>lang(20),"Databases"=>lang(65),"Tables"=>lang(100),"Columns"=>lang(101),"Procedures"=>lang(219),)as$Gc=>$rc){foreach((array)$sa[$Gc]as$mc=>$_a){echo"$rc'.h($mc);$l=0;foreach($nb +as$bb=>$ka){$f="'grants[$l][".h(strtoupper($mc))."]'";$q=$ka[strtoupper($mc)];if($Gc=="Server Admin"&&$bb!=(isset($nb["*.*"])?"*.*":"")){echo"
".lang(70)."";$l=0;foreach($nb +as$bb=>$ka){echo''.($bb!="*.*"?"":"*.*");$l++;}echo"
 ";}elseif(isset($_GET["grant"])){echo"";}else{echo"";}$l++;}}}echo"
\n",'

+ +';if(isset($_GET["host"])){echo'';}echo' +

+';}elseif(isset($_GET["processlist"])){if($_POST&&!$n){$Id=0;foreach((array)$_POST["kill"]as$b){if(queries("KILL ".(+$b))){$Id++;}}queries_redirect(ME."processlist=",lang(222,$Id),$Id||!$_POST["kill"]);}page_header(lang(71),$n);echo' +
+ +';$l=-1;foreach(get_rows("SHOW FULL PROCESSLIST")as$l=>$a){if(!$l){echo"\n";}echo"
 ".implode("",array_keys($a))."
".checkbox("kill[]",$a["Id"],0);foreach($a +as$d=>$b){echo"".($d=="Info"&&$b!=""?"".shorten_utf8($b,100,"").' '.lang(31).'':nbsp($b));}echo"\n";}echo'
+

',($l+1)."/".lang(223,$g->result("SELECT @@max_connections")),'

+ + +

+';}elseif(isset($_GET["select"])){$m=$_GET["select"];$D=table_status($m);$J=indexes($m);$p=fields($m);$ha=column_foreign_keys($m);if($D["Oid"]=="t"){$J[]=array("type"=>"PRIMARY","columns"=>array("oid"));}$Td=array();$B=array();$Db=null;foreach($p +as$d=>$e){$f=$o->fieldName($e);if(isset($e["privileges"]["select"])&&$f!=""){$B[$d]=html_entity_decode(strip_tags($f));if(ereg('text|lob',$e["type"])){$Db=$o->selectLengthProcess();}}$Td+=$e["privileges"];}list($Q,$pa)=$o->selectColumnsProcess($B,$J);$s=$o->selectSearchProcess($p,$J);$Xa=$o->selectOrderProcess($p,$J);$O=$o->selectLimitProcess();$Yb=($Q?implode(", ",$Q):($D["Oid"]=="t"?"oid, ":"")."*")."\nFROM ".table($m);$Ld=($pa&&count($pa)$a){echo$g->result("SELECT".limit(idf_escape(key($a))." FROM ".table($m)," WHERE ".where_check($gb).($s?" AND ".implode(" AND ",$s):"").($Xa?" ORDER BY ".implode(", ",$Xa):""),1));}exit;}if($_POST&&!$n){$ne="(".implode(") OR (",array_map('where_check',(array)$_POST["check"])).")";$Qa=$ad=null;foreach($J +as$x){if($x["type"]=="PRIMARY"){$Qa=array_flip($x["columns"]);$ad=($Q?$Qa:array());break;}}foreach($Q +as$d=>$b){$b=$_GET["columns"][$d];if(!$b["fun"]){unset($ad[$b["col"]]);}}if($_POST["export"]){dump_headers($m);$o->dumpTable($m,"");if(!is_array($_POST["check"])||$ad===array()){$bc=$s;if(is_array($_POST["check"])){$bc[]="($ne)";}$j="SELECT $Yb".($bc?"\nWHERE ".implode(" AND ",$bc):"").$Ld;}else{$Zd=array();foreach($_POST["check"]as$b){$Zd[]="(SELECT".limit($Yb,"\nWHERE ".($s?implode(" AND ",$s)." AND ":"").where_check($b).$Ld,1).")";}$j=implode(" UNION ALL ",$Zd);}$o->dumpData($m,"table",$j);exit;}if(!$o->selectEmailProcess($s,$ha)){if($_POST["save"]||$_POST["delete"]){$i=true;$wb=0;$j=table($m);$r=array();if(!$_POST["delete"]){foreach($B +as$f=>$b){$b=process_input($p[$f]);if($b!==null){if($_POST["clone"]){$r[idf_escape($f)]=($b!==false?$b:idf_escape($f));}elseif($b!==false){$r[]=idf_escape($f)." = $b";}}}$j.=($_POST["clone"]?" (".implode(", ",array_keys($r)).")\nSELECT ".implode(", ",$r)."\nFROM ".table($m):" SET\n".implode(",\n",$r));}if($_POST["delete"]||$r){$id="UPDATE";if($_POST["delete"]){$id="DELETE";$j="FROM $j";}if($_POST["clone"]){$id="INSERT";$j="INTO $j";}if($_POST["all"]||($ad===array()&&$_POST["check"])||count($pa)affected_rows;}else{foreach((array)$_POST["check"]as$b){$i=queries($id.limit1($j,"\nWHERE ".where_check($b)));if(!$i){break;}$wb+=$g->affected_rows;}}}queries_redirect(remove_from_uri("page"),lang(225,$wb),$i);}elseif(!$_POST["import"]){if(!$_POST["val"]){$n=lang(226);}else{$i=true;$wb=0;foreach($_POST["val"]as$gb=>$a){$r=array();foreach($a +as$d=>$b){$d=bracket_escape($d,1);$r[]=idf_escape($d)." = ".(ereg('char|text',$p[$d]["type"])||$b!=""?$o->processInput($p[$d],$b):"NULL");}$j=table($m)." SET ".implode(", ",$r);$bc=" WHERE ".where_check($gb).($s?" AND ".implode(" AND ",$s):"");$i=queries("UPDATE".(count($pa)affected_rows;}queries_redirect(remove_from_uri(),lang(225,$wb),$i);}}elseif(is_string($Ia=get_file("csv_file",true))){$i=true;$mb=array_keys($p);preg_match_all('~(?>"[^"]*"|[^"\\r\\n]+)+~',$Ia,$oa);$wb=count($oa[0]);begin();$Wa=($_POST["separator"]=="csv"?",":($_POST["separator"]=="tsv"?"\t":";"));foreach($oa[0]as$d=>$b){preg_match_all("~((\"[^\"]*\")+|[^$Wa]*)$Wa~",$b.$Wa,$Gd);if(!$d&&!array_diff($Gd[1],$mb)){$mb=$Gd[1];$wb--;}else{$r=array();foreach($Gd[1]as$l=>$Pc){$r[idf_escape($mb[$l])]=($Pc==""&&$p[$mb[$l]]["null"]?"NULL":q(str_replace('""','"',preg_replace('~^"|"$~','',$Pc))));}$i=insert_update($m,$r,$Qa);if(!$i){break;}}}if($i){queries("COMMIT");}queries_redirect(remove_from_uri("page"),lang(227,$wb),$i);queries("ROLLBACK");}else{$n=upload_error($Ia);}}}$Ea=$o->tableName($D);page_header(lang(33).": $Ea",$n);session_write_close();$r=null;if(isset($Td["insert"])){$r="";foreach((array)$_GET["where"]as$b){if(count($ha[$b["col"]])==1&&($b["op"]=="="||(!$b["op"]&&!ereg('[_%]',$b["val"])))){$r.="&set".urlencode("[".bracket_escape($b["col"])."]")."=".urlencode($b["val"]);}}}$o->selectLinks($D,$r);if(!$B){echo"

".lang(228).($p?".":": ".error())."\n";}else{echo"

\n","
";hidden_fields_get();echo(DB!=""?''.(isset($_GET["ns"])?'':""):"");echo'',"
\n";$o->selectColumnsPrint($Q,$B);$o->selectSearchPrint($s,$B,$J);$o->selectOrderPrint($Xa,$B,$J);$o->selectLimitPrint($O);$o->selectLengthPrint($Db);$o->selectActionPrint($Db);echo"
\n";$ca=$_GET["page"];if($ca=="last"){$Ya=$g->result("SELECT COUNT(*) FROM ".table($m).($s?" WHERE ".implode(" AND ",$s):""));$ca=floor(max(0,$Ya-1)/$O);}$j="SELECT".limit((+$O&&$pa&&count($pa)selectQuery($j);$i=$g->query($j);if(!$i){echo"

".error()."\n";}else{if($v=="mssql"){$i->seek($O*$ca);}$Hc=array();echo"

\n";$H=array();while($a=$i->fetch_assoc()){$H[]=$a;}if($_GET["page"]!="last"){$Ya=(+$O&&$pa&&count($pa)result(" SELECT FOUND_ROWS()"):$g->result("SELECT COUNT(*) FROM ($j) x")):count($H));}if(!$H){echo"

".lang(82)."\n";}else{$Bd=$o->backwardKeys($m,$Ea);echo"\n","".(!$pa&&$Q?"":"\n";foreach($o->rowDescriptions($H,$ha)as$fa=>$a){$pd=unique_array($H[$fa],$J);$gb="";foreach($pd +as$d=>$b){$gb.="&".(isset($b)?urlencode("where[".bracket_escape($d)."]")."=".urlencode($b):"null%5B%5D=".urlencode($d));}echo"".(!$pa&&$Q?"":"\n";}echo"
".lang(119)."");$Cd=array();$da=array();reset($Q);$ke=1;foreach($H[0]as$d=>$b){if($D["Oid"]!="t"||$d!="oid"){$b=$_GET["columns"][key($Q)];$e=$p[$Q?$b["col"]:$d];$f=($e?$o->fieldName($e,$ke):"*");if($f!=""){$ke++;$Cd[$d]=$f;$C=idf_escape($d);echo''.apply_sql_function($b["fun"],$f)."";}$da[$d]=$b["fun"];next($Q);}}$ec=array();if($_GET["modify"]){foreach($H +as$a){foreach($a +as$d=>$b){$ec[$d]=max($ec[$d],min(40,strlen(utf8_decode($b))));}}}echo($Bd?"".lang(229):"")."
".checkbox("check[]",substr($gb,1),in_array(substr($gb,1),(array)$_POST["check"]),"","this.form['all'].checked = false; formUncheck('all-page');").(count($pa)".lang(119).""));foreach($a +as$d=>$b){if(isset($Cd[$d])){$e=$p[$d];if($b!=""&&(!isset($Hc[$d])||$Hc[$d]!="")){$Hc[$d]=(is_mail($b)?$Cd[$d]:"");}$w="";$b=$o->editVal($b,$e);if(!isset($b)){$b="NULL";}else{if(ereg('blob|bytea|raw|file',$e["type"])&&$b!=""){$w=h(ME.'download='.urlencode($m).'&field='.urlencode($d).$gb);}if($b===""){$b=" ";}elseif($Db!=""&&ereg('text|blob',$e["type"])&&is_utf8($b)){$b=shorten_utf8($b,max(0,+$Db));}else{$b=h($b);}if(!$w){foreach((array)$ha[$d]as$A){if(count($ha[$d])==1||end($A["source"])==$d){$w="";foreach($A["source"]as$l=>$Ga){$w.=where_link($l,$A["target"][$l],$H[$fa][$Ga]);}$w=h(($A["db"]!=""?preg_replace('~([?&]db=)[^&]+~','\\1'.urlencode($A["db"]),ME):ME).'select='.urlencode($A["table"]).$w);if(count($A["source"])==1){break;}}}}if($d=="COUNT(*)"){$w=h(ME."select=".urlencode($m));$l=0;foreach((array)$_GET["where"]as$y){if(!array_key_exists($y["col"],$pd)){$w.=h(where_link($l++,$y["col"],$y["val"],$y["op"]));}}foreach($pd +as$Ma=>$y){$w.=h(where_link($l++,$Ma,$y));}}}if(!$w){if(is_mail($b)){$w="mailto:$b";}if($le=is_url($a[$d])){$w=($le=="http"&&$Ac?$a[$d]:"$le://www.adminer.org/redirect/?url=".urlencode($a[$d]));}}$S=h("val[$gb][".bracket_escape($d)."]");$q=$_POST["val"][$gb][bracket_escape($d)];$Pd=h(isset($q)?$q:$a[$d]);$uf=strpos($b,"...");$Yd=is_utf8($b)&&$H[$fa][$d]==$a[$d]&&!$da[$d];$Wd=ereg('text|lob',$e["type"]);echo(($_GET["modify"]&&$Yd)||isset($q)?"".($Wd?"":""):"".$o->selectVal($b,$w,$e));}}if($Bd){echo"";}$o->backwardKeysPrint($Bd,$H[$fa]);echo"
\n";}parse_str($_COOKIE["adminer_export"],$Xb);if($H||$ca){$md=true;if($_GET["page"]!="last"&&+$O&&count($pa)>=count($Q)&&($Ya>=$O||$ca)){$Ya=$D["Rows"];if(!isset($Ya)||$s||($D["Engine"]=="InnoDB"&&$Yaresult("SELECT COUNT(*) FROM ".table($m).($s?" WHERE ".implode(" AND ",$s):""));}else{$md=false;}}echo"

";if(+$O&&$Ya>$O){$Nd=floor(($Ya-1)/$O);echo'".lang(231).":",pagination(0,$ca).($ca>5?" ...":"");for($l=max(1,$ca-4);$l'.lang(232)."");}echo" (".($md?"":"~ ").lang(122,$Ya).") ".checkbox("all",1,0,lang(233))."\n";if(!information_schema(DB)){echo'

',lang(31),'
+ + + + +
+';}print_fieldset("export",lang(113));$Na=$o->dumpOutput();echo($Na?adminer_html_select("output",$Na,$Xb["output"])." ":""),adminer_html_select("format",$o->dumpFormat(),$Xb["format"])," \n","\n";}print_fieldset("import",lang(235),!$H);echo" ",adminer_html_select("separator",array("csv"=>"CSV,","csv;"=>"CSV;","tsv"=>"TSV"),$Xb["format"],1);echo" ","\n","\n";$o->selectEmailPrint(array_filter($Hc,'strlen'),$B);echo"\n";}}}elseif(isset($_GET["variables"])){$fc=isset($_GET["status"]);page_header($fc?lang(73):lang(72));$Pe=($fc?show_status():show_variables());if(!$Pe){echo"

".lang(82)."\n";}else{echo"\n";foreach($Pe +as$d=>$b){echo"","
".h($d)."","".nbsp($b);}echo"
\n";}}elseif(isset($_GET["script"])){header("Content-Type: text/javascript; charset=utf-8");if($_GET["script"]=="db"){$Yc=array("Data_length"=>0,"Index_length"=>0,"Data_free"=>0);foreach(table_status()as$a){$S=js_escape($a["Name"]);json_row("Comment-$S",nbsp($a["Comment"]));if(!is_view($a)){foreach(array("Engine","Collation")as$d){json_row("$d-$S",nbsp($a[$d]));}foreach($Yc+array("Auto_increment"=>0,"Rows"=>0)as$d=>$b){if($a[$d]!=""){$b=number_format($a[$d],0,'.',lang(236));json_row("$d-$S",($d=="Rows"&&$a["Engine"]=="InnoDB"&&$b?"~ $b":$b));if(isset($Yc[$d])){$Yc[$d]+=($a["Engine"]!="InnoDB"||$d!="Data_free"?$a[$d]:0);}}elseif(array_key_exists($d,$a)){json_row("$d-$S");}}}}foreach($Yc +as$d=>$b){json_row("sum-$d",number_format($b,0,'.',lang(236)));}json_row("");}else{foreach(count_tables(get_databases())as$t=>$b){json_row("tables-".js_escape($t),$b);}json_row("");}exit;}else{$Fe=array_merge((array)$_POST["tables"],(array)$_POST["views"]);if($Fe&&!$n&&!$_POST["search"]){$i=true;$va="";if($v=="sql"&&count($_POST["tables"])>1&&($_POST["drop"]||$_POST["truncate"]||$_POST["copy"])){queries("SET foreign_key_checks = 0");}if($_POST["truncate"]){if($_POST["tables"]){$i=truncate_tables($_POST["tables"]);}$va=lang(237);}elseif($_POST["move"]){$i=move_tables((array)$_POST["tables"],(array)$_POST["views"],$_POST["target"]);$va=lang(238);}elseif($_POST["copy"]){$i=copy_tables((array)$_POST["tables"],(array)$_POST["views"],$_POST["target"]);$va=lang(239);}elseif($_POST["drop"]){if($_POST["views"]){$i=drop_views($_POST["views"]);}if($i&&$_POST["tables"]){$i=drop_tables($_POST["tables"]);}$va=lang(240);}elseif($_POST["tables"]&&($i=queries(($_POST["optimize"]?"OPTIMIZE":($_POST["check"]?"CHECK":($_POST["repair"]?"REPAIR":"ANALYZE")))." TABLE ".implode(", ",array_map('idf_escape',$_POST["tables"]))))){while($a=$i->fetch_assoc()){$va.="".h($a["Table"]).": ".h($a["Msg_text"])."
";}}queries_redirect(substr(ME,0,-1),$va,$i);}page_header(($_GET["ns"]==""?lang(65).": ".h(DB):lang(80).": ".h($_GET["ns"])),$n,true);if($o->homepage()){if($_GET["ns"]!==""){echo''.lang(111)."\n","

".lang(241)."

\n";$jd=tables_list();if(!$jd){echo"

".lang(6)."\n";}else{echo"

\n","

".lang(242).": \n";if($_POST["search"]&&$_POST["query"]!=""){search_tables();}echo"\n",'\n";foreach($jd +as$f=>$z){$cc=(isset($z)&&!eregi("table",$z));echo'
'.lang(100).''.lang(243).''.lang(76).''.lang(244).''.lang(245).''.lang(246).''.lang(92).''.lang(247).(support("comment")?''.lang(94):'')."
'.checkbox(($cc?"views[]":"tables[]"),$f,in_array($f,$Fe,true),"","formUncheck('check-all');"),''.h($f).'';if($cc){echo''.lang(99).'','?';}else{foreach(array("Engine"=>"","Collation"=>"","Data_length"=>"create","Index_length"=>"indexes","Data_free"=>"edit","Auto_increment"=>"auto_increment=1&create","Rows"=>"select")as$d=>$w){echo($w?"?":" ");}}echo(support("comment")?" ":"");}echo"
 ".lang(223,count($jd)),"".nbsp($v=="sql"?$g->result("SELECT @@storage_engine"):""),"".nbsp(db_collation(DB,collations()));foreach(array("Data_length","Index_length","Data_free")as$d){echo" ";}echo"
\n";if(!information_schema(DB)){echo"

".($v=="sql"?" ":"")." \n";$_=(support("scheme")?schemas():get_databases());if(count($_)!=1&&$v!="sqlite"){$t=(isset($_POST["target"])?$_POST["target"]:(support("scheme")?$_GET["ns"]:DB));echo"

".lang(253).": ",($_?adminer_html_select("target",$_,$t):'')," ",(support("copy")?" ":""),"\n";}echo"\n";}echo"

\n";}echo'

'.lang(148)."\n";if(support("view")){echo''.lang(180)."\n";}if(support("routine")){echo"

".lang(116)."

\n";$Ue=routines();if($Ue){echo"\n",'\n";odd('');foreach($Ue +as$a){echo'','
'.lang(181).''.lang(89).''.lang(198)." 
'.h($a["ROUTINE_NAME"]).'',''.h($a["ROUTINE_TYPE"]),''.h($a["DTD_IDENTIFIER"]),''.lang(107)."";}echo"
\n";}echo'

'.lang(197).' '.lang(196)."\n";}if(support("sequence")){echo"

".lang(256)."

\n";$ff=get_vals("SELECT sequence_name FROM information_schema.sequences WHERE sequence_schema = current_schema()");if($ff){echo"\n","\n";odd('');foreach($ff +as$b){echo"
".lang(181)."
".h($b)."\n";}echo"
\n";}echo"

".lang(203)."\n";}if(support("type")){echo"

".lang(11)."

\n";$R=types();if($R){echo"\n","\n";odd('');foreach($R +as$b){echo"
".lang(181)."
".h($b)."\n";}echo"
\n";}echo"

".lang(207)."\n";}if(support("event")){echo"

".lang(117)."

\n";$H=get_rows("SHOW EVENTS");if($H){echo"\n","\n";foreach($H +as$a){echo"",'
".lang(181)."".lang(257)."".lang(187)."".lang(188)."
'.h($a["Name"])."","".($a["Execute at"]?lang(258)."".$a["Execute at"]:lang(189)." ".$a["Interval value"]." ".$a["Interval field"]."$a[Starts]"),"$a[Ends]";}echo"
\n";}echo'

'.lang(186)."\n";}if($jd){echo"\n";}}}}page_footer(); \ No newline at end of file diff --git a/app/adminer/app_config.php b/app/adminer/app_config.php new file mode 100644 index 0000000000..316440f3fa --- /dev/null +++ b/app/adminer/app_config.php @@ -0,0 +1,24 @@ +/app/adminer/index.php'; + $apps[$x]['menu'][0]['groups'][] = 'superadmin'; + + //permission details + $apps[$x]['permissions'][0]['name'] = 'adminer'; + $apps[$x]['permissions'][0]['groups'][] = 'superadmin'; + +?> \ No newline at end of file diff --git a/app/adminer/index.php b/app/adminer/index.php new file mode 100644 index 0000000000..9f6ea0688c --- /dev/null +++ b/app/adminer/index.php @@ -0,0 +1,66 @@ + \ No newline at end of file diff --git a/app/adminer/root.php b/app/adminer/root.php new file mode 100644 index 0000000000..7b882438ea --- /dev/null +++ b/app/adminer/root.php @@ -0,0 +1,50 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ + +// make sure the PATH_SEPARATOR is defined + if (!defined("PATH_SEPARATOR")) { + if ( strpos( $_ENV[ "OS" ], "Win" ) !== false ) { define("PATH_SEPARATOR", ";"); } else { define("PATH_SEPARATOR", ":"); } + } + +// make sure the document_root is set + $_SERVER["SCRIPT_FILENAME"] = str_replace("\\", "/", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = str_replace($_SERVER["PHP_SELF"], "", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = realpath($_SERVER["DOCUMENT_ROOT"]); + //echo "DOCUMENT_ROOT: ".$_SERVER["DOCUMENT_ROOT"]."
\n"; + //echo "PHP_SELF: ".$_SERVER["PHP_SELF"]."
\n"; + //echo "SCRIPT_FILENAME: ".$_SERVER["SCRIPT_FILENAME"]."
\n"; + +// if the project directory exists then add it to the include path otherwise add the document root to the include path + if (is_dir($_SERVER["DOCUMENT_ROOT"].'/fusionpbx')){ + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', '/fusionpbx'); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER["DOCUMENT_ROOT"].'/fusionpbx' ); + } + else { + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', ''); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER['DOCUMENT_ROOT'] ); + } + +?> \ No newline at end of file diff --git a/app/call_broadcast/app_config.php b/app/call_broadcast/app_config.php new file mode 100644 index 0000000000..750b60a72e --- /dev/null +++ b/app/call_broadcast/app_config.php @@ -0,0 +1,120 @@ + \ No newline at end of file diff --git a/app/call_broadcast/root.php b/app/call_broadcast/root.php new file mode 100644 index 0000000000..7b882438ea --- /dev/null +++ b/app/call_broadcast/root.php @@ -0,0 +1,50 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ + +// make sure the PATH_SEPARATOR is defined + if (!defined("PATH_SEPARATOR")) { + if ( strpos( $_ENV[ "OS" ], "Win" ) !== false ) { define("PATH_SEPARATOR", ";"); } else { define("PATH_SEPARATOR", ":"); } + } + +// make sure the document_root is set + $_SERVER["SCRIPT_FILENAME"] = str_replace("\\", "/", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = str_replace($_SERVER["PHP_SELF"], "", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = realpath($_SERVER["DOCUMENT_ROOT"]); + //echo "DOCUMENT_ROOT: ".$_SERVER["DOCUMENT_ROOT"]."
\n"; + //echo "PHP_SELF: ".$_SERVER["PHP_SELF"]."
\n"; + //echo "SCRIPT_FILENAME: ".$_SERVER["SCRIPT_FILENAME"]."
\n"; + +// if the project directory exists then add it to the include path otherwise add the document root to the include path + if (is_dir($_SERVER["DOCUMENT_ROOT"].'/fusionpbx')){ + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', '/fusionpbx'); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER["DOCUMENT_ROOT"].'/fusionpbx' ); + } + else { + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', ''); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER['DOCUMENT_ROOT'] ); + } + +?> \ No newline at end of file diff --git a/app/call_broadcast/v_call_broadcast.php b/app/call_broadcast/v_call_broadcast.php new file mode 100644 index 0000000000..49f636d246 --- /dev/null +++ b/app/call_broadcast/v_call_broadcast.php @@ -0,0 +1,151 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('call_broadcast_view')) { + //access granted +} +else { + echo "access denied"; + exit; +} +require_once "includes/header.php"; +require_once "includes/paging.php"; + + +//get the http get variables and set them to php variables + $order_by = $_GET["order_by"]; + $order = $_GET["order"]; + +//show the content + echo "

"; + echo "\n"; + + echo "\n"; + echo " "; + echo ""; + echo "
\n"; + echo "
"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "
Call Broadcast List 
\n"; + + $sql = "select * from v_call_broadcasts "; + $sql .= "where domain_uuid = '$domain_uuid' "; + if (strlen($order_by)> 0) { $sql .= "order by $order_by $order "; } + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + $num_rows = count($result); + unset ($prep_statement, $result, $sql); + + $rows_per_page = 10; + $param = ""; + $page = $_GET['page']; + if (strlen($page) == 0) { $page = 0; $_GET['page'] = 0; } + list($paging_controls, $rows_per_page, $var_3) = paging($num_rows, $param, $rows_per_page); + $offset = $rows_per_page * $page; + + $sql = "select * from v_call_broadcasts "; + $sql .= "where domain_uuid = '$domain_uuid' "; + if (strlen($order_by)> 0) { $sql .= "order by $order_by $order "; } + $sql .= " limit $rows_per_page offset $offset "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + $result_count = count($result); + unset ($prep_statement, $sql); + + $c = 0; + $row_style["0"] = "row_style0"; + $row_style["1"] = "row_style1"; + + echo "
\n"; + echo "\n"; + echo "\n"; + echo th_order_by('broadcast_name', 'Name', $order_by, $order); + echo th_order_by('broadcast_concurrent_limit', 'Concurrent Limit', $order_by, $order); + echo th_order_by('broadcast_description', 'Description', $order_by, $order); + //echo th_order_by('recordingid', 'Recording', $order_by, $order); + echo "\n"; + echo "\n"; + + if ($result_count > 0) { + foreach($result as $row) { + echo "\n"; + echo " \n"; + echo " \n"; + //echo " \n"; + echo " \n"; + echo " \n"; + echo "\n"; + if ($c==0) { $c=1; } else { $c=0; } + } //end foreach + unset($sql, $result, $row_count); + } //end if results + + + echo "\n"; + echo "\n"; + echo "\n"; + + echo "
\n"; + if (permission_exists('call_broadcast_add')) { + echo " $v_link_label_add\n"; + } + echo "
".$row['broadcast_name']." ".$row['broadcast_concurrent_limit']." ".$row['recordingid']."".$row['broadcast_description']." \n"; + if (permission_exists('call_broadcast_edit')) { + echo " $v_link_label_edit\n"; + } + if (permission_exists('call_broadcast_delete')) { + echo " $v_link_label_delete\n"; + } + echo "
\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "
 $paging_controls\n"; + if (permission_exists('call_broadcast_add')) { + echo " $v_link_label_add\n"; + } + echo "
\n"; + echo "
"; + echo "
"; + echo "

"; + echo "

"; + + echo "
"; + echo "
"; + echo "

"; + +require_once "includes/footer.php"; +?> \ No newline at end of file diff --git a/app/call_broadcast/v_call_broadcast_delete.php b/app/call_broadcast/v_call_broadcast_delete.php new file mode 100644 index 0000000000..0cf0d98463 --- /dev/null +++ b/app/call_broadcast/v_call_broadcast_delete.php @@ -0,0 +1,61 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('call_broadcast_delete')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +//get the id + if (count($_GET)>0) { + $id = $_GET["id"]; + } + +//delete the call broadcast entry + if (strlen($id)>0) { + $sql = "delete from v_call_broadcasts "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and call_broadcast_uuid = '$id' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + unset($sql); + } + +//redirect the user + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Delete Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + +?> \ No newline at end of file diff --git a/app/call_broadcast/v_call_broadcast_edit.php b/app/call_broadcast/v_call_broadcast_edit.php new file mode 100644 index 0000000000..2e888b273d --- /dev/null +++ b/app/call_broadcast/v_call_broadcast_edit.php @@ -0,0 +1,560 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('call_broadcast_edit')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +//set the action with add or update + if (isset($_REQUEST["id"])) { + $action = "update"; + $call_broadcast_uuid = check_str($_REQUEST["id"]); + } + else { + $action = "add"; + } + +//get the http post variables and set them to php variables + if (count($_POST)>0) { + $broadcast_name = check_str($_POST["broadcast_name"]); + $broadcast_description = check_str($_POST["broadcast_description"]); + $broadcast_timeout = check_str($_POST["broadcast_timeout"]); + $broadcast_concurrent_limit = check_str($_POST["broadcast_concurrent_limit"]); + //$recording_uuid = check_str($_POST["recording_uuid"]); + $broadcast_caller_id_name = check_str($_POST["broadcast_caller_id_name"]); + $broadcast_caller_id_number = check_str($_POST["broadcast_caller_id_number"]); + $broadcast_destination_type = check_str($_POST["broadcast_destination_type"]); + $broadcast_phone_numbers = check_str($_POST["broadcast_phone_numbers"]); + $broadcast_destination_data = check_str($_POST["broadcast_destination_data"]); + } + +if (count($_POST)>0 && strlen($_POST["persistformvar"]) == 0) { + + $msg = ''; + if ($action == "update") { + $call_broadcast_uuid = check_str($_POST["call_broadcast_uuid"]); + } + + //check for all required data + if (strlen($broadcast_name) == 0) { $msg .= "Please provide: Name
\n"; } + //if (strlen($broadcast_description) == 0) { $msg .= "Please provide: Description
\n"; } + //if (strlen($broadcast_timeout) == 0) { $msg .= "Please provide: Timeout
\n"; } + //if (strlen($broadcast_concurrent_limit) == 0) { $msg .= "Please provide: Concurrent Limit
\n"; } + //if (strlen($recording_uuid) == 0) { $msg .= "Please provide: Recording
\n"; } + //if (strlen($broadcast_caller_id_name) == 0) { $msg .= "Please provide: Caller ID Name
\n"; } + //if (strlen($broadcast_caller_id_number) == 0) { $msg .= "Please provide: Caller ID Number
\n"; } + //if (strlen($broadcast_destination_type) == 0) { $msg .= "Please provide: Type
\n"; } + //if (strlen($broadcast_phone_numbers) == 0) { $msg .= "Please provide: Phone Number List
\n"; } + //if (strlen($broadcast_destination_data) == 0) { $msg .= "Please provide: Destination
\n"; } + if (strlen($msg) > 0 && strlen($_POST["persistformvar"]) == 0) { + require_once "includes/header.php"; + require_once "includes/persistformvar.php"; + echo "
\n"; + echo "
\n"; + echo $msg."
"; + echo "
\n"; + persistformvar($_POST); + echo "
\n"; + require_once "includes/footer.php"; + return; + } + + //add or update the database + if ($_POST["persistformvar"] != "true") { + if ($action == "add" && permission_exists('call_broadcast_add')) { + $call_broadcast_uuid = uuid(); + $sql = "insert into v_call_broadcasts "; + $sql .= "("; + $sql .= "domain_uuid, "; + $sql .= "call_broadcast_uuid, "; + $sql .= "broadcast_name, "; + $sql .= "broadcast_description, "; + $sql .= "broadcast_timeout, "; + $sql .= "broadcast_concurrent_limit, "; + //$sql .= "recording_uuid, "; + $sql .= "broadcast_caller_id_name, "; + $sql .= "broadcast_caller_id_number, "; + $sql .= "broadcast_destination_type, "; + $sql .= "broadcast_phone_numbers, "; + $sql .= "broadcast_destination_data "; + $sql .= ")"; + $sql .= "values "; + $sql .= "("; + $sql .= "'$domain_uuid', "; + $sql .= "'$call_broadcast_uuid', "; + $sql .= "'$broadcast_name', "; + $sql .= "'$broadcast_description', "; + if (strlen($broadcast_timeout) == 0) { + $sql .= "null, "; + } + else { + $sql .= "'$broadcast_timeout', "; + } + if (strlen($broadcast_concurrent_limit) == 0) { + $sql .= "null, "; + } + else { + $sql .= "'$broadcast_concurrent_limit', "; + } + //$sql .= "'$recording_uuid', "; + $sql .= "'$broadcast_caller_id_name', "; + $sql .= "'$broadcast_caller_id_number', "; + $sql .= "'$broadcast_destination_type', "; + $sql .= "'$broadcast_phone_numbers', "; + $sql .= "'$broadcast_destination_data' "; + $sql .= ")"; + $db->exec(check_sql($sql)); + unset($sql); + + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Add Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + } //if ($action == "add") + + if ($action == "update" && permission_exists('call_broadcast_edit')) { + $sql = "update v_call_broadcasts set "; + $sql .= "broadcast_name = '$broadcast_name', "; + $sql .= "broadcast_description = '$broadcast_description', "; + if (strlen($broadcast_timeout) == 0) { + $sql .= "broadcast_timeout = null, "; + } + else { + $sql .= "broadcast_timeout = '$broadcast_timeout', "; + } + if (strlen($broadcast_concurrent_limit) == 0) { + $sql .= "broadcast_concurrent_limit = null, "; + } + else { + $sql .= "broadcast_concurrent_limit = '$broadcast_concurrent_limit', "; + } + //$sql .= "recording_uuid = '$recording_uuid', "; + $sql .= "broadcast_caller_id_name = '$broadcast_caller_id_name', "; + $sql .= "broadcast_caller_id_number = '$broadcast_caller_id_number', "; + $sql .= "broadcast_destination_type = '$broadcast_destination_type', "; + $sql .= "broadcast_phone_numbers = '$broadcast_phone_numbers', "; + $sql .= "broadcast_destination_data = '$broadcast_destination_data' "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and call_broadcast_uuid = '$call_broadcast_uuid'"; + $db->exec(check_sql($sql)); + unset($sql); + + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Update Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + } //if ($action == "update") + } //if ($_POST["persistformvar"] != "true") +} //(count($_POST)>0 && strlen($_POST["persistformvar"]) == 0) + +//pre-populate the form + if (count($_GET)>0 && $_POST["persistformvar"] != "true") { + $call_broadcast_uuid = $_GET["id"]; + $sql = ""; + $sql .= "select * from v_call_broadcasts "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and call_broadcast_uuid = '$call_broadcast_uuid' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + while($row = $prep_statement->fetch()) { + $broadcast_name = $row["broadcast_name"]; + $broadcast_description = $row["broadcast_description"]; + $broadcast_timeout = $row["broadcast_timeout"]; + $broadcast_concurrent_limit = $row["broadcast_concurrent_limit"]; + //$recording_uuid = $row["recording_uuid"]; + $broadcast_caller_id_name = $row["broadcast_caller_id_name"]; + $broadcast_caller_id_number = $row["broadcast_caller_id_number"]; + $broadcast_destination_type = $row["broadcast_destination_type"]; + $broadcast_phone_numbers = $row["broadcast_phone_numbers"]; + $broadcast_destination_data = $row["broadcast_destination_data"]; + break; //limit to 1 row + } + unset ($prep_statement); + } + +//begin header + require_once "includes/header.php"; + +//begin content + echo "
"; + echo "\n"; + + echo "\n"; + echo " "; + echo " "; + echo "
\n"; + echo "
"; + + echo "
\n"; + + echo "
\n"; + echo "\n"; + + echo "\n"; + if ($action == "add") { + echo "\n"; + } + if ($action == "update") { + echo "\n"; + } + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + + //echo "\n"; + //echo "\n"; + //echo "\n"; + //echo "\n"; + + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; +/* + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; +*/ + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo " \n"; + echo " \n"; + echo " "; + echo "
Call BroadcastCall Broadcast Edit\n"; + echo " \n"; + echo "
\n"; + echo " Name:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter a name here.\n"; + echo "
\n"; + echo " Timeout:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Limit the length of the call. Leave this empty for no limit.\n"; + echo "
\n"; + echo " Concurrent Limit:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Limit the approximate number of concurrent calls. Leave this empty for no limit.\n"; + echo "
\n"; + //echo " Recording:\n"; + //echo "\n"; + //echo " \n"; + //echo "
\n"; + //echo "Recording to play when the call is answered.
\n"; + //echo "\n"; + //echo "
\n"; + echo " Caller ID Name:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Applicable if the provider allow the Caller ID Name to be set. default: anonymous\n"; + echo "
\n"; + echo " Caller ID Number:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Applicable if the provider that allow the Caller ID number to be sent. default: 0000000000\n"; + echo "
\n"; + echo " Type:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Optional, Destination Type: bridge, transfer, voicemail, conference, fifo, etc.\n"; + echo "
\n"; + echo " Destination:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Optional, send the call to an auto attendant, conference room, or any other destination.

\n"; + echo "conference (8khz): 01-\${domain}@default
\n"; + echo "bridge (external number): sofia/gateway/gatewayname/12081231234
\n"; + echo "bridge (auto attendant): sofia/internal/5002@\${domain}
\n"; + echo "transfer (external number): 12081231234 XML default
\n"; + echo "
\n"; + echo " Destination Number:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Send the call to the extension an IVR Menu, Conference Room, or any other number.

\n"; + echo "
\n"; + echo " Phone Number List:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Optional, set a list of phone numbers one per row in the following format: 123-123-1234|Last Name, First Name

\n"; + echo "
\n"; + echo " Description:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter a description here.\n"; + echo "
\n"; + if ($action == "update") { + echo " \n"; + echo " \n"; + } + + echo " \n"; + echo "
"; + echo ""; + + echo "
\n"; + echo "
\n"; + echo "
\n"; + + /* + if ($action == "update") { + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "
Call Broadcast 
\n"; + + echo "
\n"; + + echo "
\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + + echo " \n"; + echo " \n"; + echo " "; + + echo "
\n"; + echo " Category:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + //echo "zzz.
\n"; + echo "\n"; + echo "
\n"; + echo " Group:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + //echo "zzz.
\n"; + echo "\n"; + echo "
\n"; + echo " Gateway:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + //echo "zzz.
\n"; + echo "\n"; + echo "
\n"; + echo " Phone Type:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + //echo "zzz.
\n"; + echo "\n"; + echo "
\n"; + echo " Phone Type:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + //echo "zzz.
\n"; + echo "\n"; + echo "
\n"; + echo " \n"; + echo " \n"; + echo "
"; + echo ""; + } + */ + + + echo "
"; + echo "
"; + + +require_once "includes/footer.php"; +?> diff --git a/app/call_broadcast/v_call_broadcast_send.php b/app/call_broadcast/v_call_broadcast_send.php new file mode 100644 index 0000000000..0cbe12c715 --- /dev/null +++ b/app/call_broadcast/v_call_broadcast_send.php @@ -0,0 +1,374 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('call_broadcast_send')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +//set the max execution time to 1 hour + ini_set(max_execution_time,3600); + +function cmd_async($cmd) { + //windows + if (stristr(PHP_OS, 'WIN')) { + $descriptorspec = array( + 0 => array("pipe", "r"), // stdin + 1 => array("pipe", "w"), // stdout + 2 => array("pipe", "w") // stderr + ); + $process = proc_open("start ".$cmd, $descriptorspec, $pipes); + //sleep(1); + proc_close($process); + } + else { //posix + exec ($cmd ." /dev/null 2>&1 &"); + } +} + +//get the http get values and set as php variables + $group_name = $_GET["group_name"]; + $call_broadcast_uuid = $_GET["call_broadcast_uuid"]; + $user_category = $_GET["user_category"]; + $gateway = $_GET["gateway"]; + $phonetype1 = $_GET["phonetype1"]; + $phonetype2 = $_GET["phonetype2"]; + +//get the call broadcast details from the database + $sql = ""; + $sql .= "select * from v_call_broadcasts "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and call_broadcast_uuid = '$call_broadcast_uuid' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + while($row = $prep_statement->fetch()) { + $broadcast_name = $row["broadcast_name"]; + $broadcast_description = $row["broadcast_description"]; + $broadcast_timeout = $row["broadcast_timeout"]; + $broadcast_concurrent_limit = $row["broadcast_concurrent_limit"]; + $recordingid = $row["recordingid"]; + $broadcast_caller_id_name = $row["broadcast_caller_id_name"]; + $broadcast_caller_id_number = $row["broadcast_caller_id_number"]; + $broadcast_destination_type = $row["broadcast_destination_type"]; + $broadcast_phone_numbers = $row["broadcast_phone_numbers"]; + $broadcast_destination_data = $row["broadcast_destination_data"]; + //if (strlen($row["broadcast_destination_data"]) == 0) { + // $broadcast_destination_application = ''; + // $broadcast_destination_data = ''; + //} + //else { + // $broadcast_destination_array = explode(":", $row["broadcast_destination_data"]); + // $broadcast_destination_application = $broadcast_destination_array[0]; + // $broadcast_destination_data = $broadcast_destination_array[1]; + //} + break; //limit to 1 row + } + unset ($prep_statement); + + if (strlen($broadcast_caller_id_name) == 0) { + $broadcast_caller_id_name = "anonymous"; + } + if (strlen($broadcast_caller_id_number) == 0) { + $broadcast_caller_id_number = "0000000000"; + } + + //get the recording name + //$recording_filename = get_recording_filename($recordingid); + +//remove unsafe characters from the name + $broadcast_name = str_replace(" ", "", $broadcast_name); + $broadcast_name = str_replace("'", "", $broadcast_name); + +//create the event socket connection + $fp = event_socket_create($_SESSION['event_socket_ip_address'], $_SESSION['event_socket_port'], $_SESSION['event_socket_password']); + +//get information over event socket + if (!$fp) { + require_once "includes/header.php"; + $msg = "
Connection to Event Socket failed.
"; + echo "
\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "
Message
$msg
\n"; + echo "
\n"; + require_once "includes/footer.php"; + } + else { + //show the header + require_once "includes/header.php"; + + //send the call broadcast + if (strlen($broadcast_phone_numbers) > 0) { + $broadcast_phone_number_array = explode ("\n", $broadcast_phone_numbers); + $count = 1; + $sched_seconds = '3'; + foreach ($broadcast_phone_number_array as $tmp_value) { + $tmp_value = str_replace(";", "|", $tmp_value); + $tmp_value_array = explode ("|", $tmp_value); + + //make sure the phone numbers are correct + $phone1 = trim($tmp_value_array[0]); + $phone1 = str_replace("-", "", $phone1); + $phone1 = str_replace("(", "", $phone1); + $phone1 = str_replace(")", "", $phone1); + $phone1 = str_replace(" ", "", $phone1); + $phone1 = str_replace(".", "", $phone1); + + //get the correct gateway + $bridge_array = outbound_route_to_bridge ($phone1); + + //prepare the string + $channel_variables = "ignore_early_media=true,origination_number=$phone1,origination_caller_id_name='$broadcast_caller_id_name',origination_caller_id_number=$broadcast_caller_id_number"; + $origination_url = "{".$channel_variables."}".$bridge_array[0].""; + + //get the context + if (count($_SESSION["domains"]) > 1) { + $context = $_SESSION['domain_name']; + } + else { + $context = "default"; + } + + //set the command + $cmd = "bgapi sched_api +".$sched_seconds." none bgapi originate ".$origination_url." ".$broadcast_destination_data." XML $context"; + + //if the event socket connection is lost then re-connect + if (!$fp) { + $fp = eventsocket_create($_SESSION['event_socket_ip_address'], $_SESSION['event_socket_port'], $_SESSION['event_socket_password']); + } + + //method 1 + $response = trim(event_socket_request($fp, 'api '.$cmd)); + + //method 2 + //cmd_async($_SESSION['switch']['bin']['dir']."/fs_cli -x \"".$cmd."\";"); + + //spread the calls out so that they are scheduled with different times + if (strlen($broadcast_concurrent_limit) > 0 && strlen($broadcast_timeout) > 0) { + if ($broadcast_concurrent_limit == $count) { + $sched_seconds = $sched_seconds + $broadcast_timeout; + $count=0; + } + } + + $count++; + } + fclose($fp); + + //echo "\n"; + echo "
\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "
Message
\n"; + echo " Call Broadcast $broadcast_name has been started.\n"; + echo "

\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "
\n"; + echo " View Calls\n"; + echo "
\n"; + echo "
\n"; + echo "
\n"; + + } + + //show the footer + require_once "includes/footer.php"; + } + +/* +//reserved for future use + +require_once "includes/header.php"; + + echo "
"; + echo "\n"; + + echo "\n"; + echo " "; + echo ""; + echo "
\n"; + echo "
"; + + + echo "\n"; + echo "\n"; + echo "\n"; + echo "
Contact List 
\n"; + + $broadcast_phone_number_array = explode ("\n", $broadcast_phone_numbers); + foreach ($broadcast_phone_number_array as $tmp_value) { + $tmp_value = str_replace(";", "|", $tmp_value); + $tmp_value_array = explode ("|", $tmp_value); + + //make sure the phone numbers are correct + $phone1 = trim($tmp_value_array[0]); + $phone1 = str_replace("-", "", $phone1); + $phone1 = str_replace("(", "", $phone1); + $phone1 = str_replace(")", "", $phone1); + $phone1 = str_replace(" ", "", $phone1); + $phone1 = str_replace(".", "", $phone1); + + if ($gateway == "loopback") { + $cmd = $_SESSION['switch']['bin']['dir']."/fs_cli -x \"luarun call_broadcast_originate.lua {call_timeout=".$broadcast_timeout."}loopback/".$phone1."/default/XML ".$_SESSION['switch']['recordings']['dir']."/".$recording_filename." '".$broadcast_caller_id_name."' ".$broadcast_caller_id_number." ".$broadcast_timeout." '".$broadcast_destination_application."' '".$broadcast_destination_data."'\";"; + } + else { + $cmd = $_SESSION['switch']['bin']['dir']."/fs_cli -x \"luarun call_broadcast_originate.lua {call_timeout=".$broadcast_timeout."}sofia/gateway/".$gateway."/".$phone1." ".$_SESSION['switch']['recordings']['dir']."/".$recording_filename." '".$broadcast_caller_id_name."' ".$broadcast_caller_id_number." ".$broadcast_timeout." '".$broadcast_destination_application."' '".$broadcast_destination_data."'\";"; + } + echo $cmd."
\n"; + cmd_async($cmd); + //sleep(60); + } + + if (strlen($group_name) > 0) { + $sql = " select * from v_users as u, v_group_users as m "; + $sql .= " where u.user_uuid = m.user_uuid "; + $sql .= " and m.group_name = '".$group_name."' "; + $sql .= " and u.user_category = '".$user_category."' "; + //echo $sql."
"; + } + else { + $sql = " select * from v_users as u "; + $sql .= " where u.user_category = '".$user_category."' "; + //echo $sql."
"; + } + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + $result_count = count($result); + unset ($prep_statement, $sql); + + $c = 0; + $row_style["0"] = "row_style0"; + $row_style["1"] = "row_style1"; + + echo "
\n"; + echo "\n"; + echo "\n"; + //echo th_order_by('username', 'Username', $order_by, $order); + echo th_order_by('user_type', 'Type', $order_by, $order); + //echo th_order_by('user_category', 'Category', $order_by, $order); + echo th_order_by('user_first_name', 'First Name', $order_by, $order); + echo th_order_by('user_last_name', 'Last Name', $order_by, $order); + echo th_order_by('user_company_name', 'Organization', $order_by, $order); + echo th_order_by('user_phone_1', 'Phone1', $order_by, $order); + echo th_order_by('user_phone_2', 'Phone2', $order_by, $order); + echo "\n"; + + if ($result_count > 0) { + foreach($result as $row) { + echo "\n"; + //echo " \n"; + echo " \n"; + //echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "\n"; + + //if (strlen($gateway) > 0) { + if ($phonetype1 == "phone1" && strlen($row[user_phone_1]) > 0) { $phone1 = $row[user_phone_1]; } + if ($phonetype1 == "phone2" && strlen($row[user_phone_2]) > 0) { $phone1 = $row[user_phone_2]; } + if ($phonetype1 == "cell" && strlen($row[user_phone_mobile]) > 0) { $phone1 = $row[user_phone_mobile]; } + if ($phonetype2 == "phone1" && strlen($row[user_phone_2]) > 0) { $phone2 = $row[user_phone_2]; } + if ($phonetype2 == "phone2" && strlen($row[user_phone_2]) > 0) { $phone2 = $row[user_phone_2]; } + if ($phonetype2 == "cell" && strlen($row[user_phone_mobile]) > 0) { $phone2 = $row[user_phone_mobile]; } + + //make sure the phone numbers are correct + $phone1 = str_replace("-", "", $phone1); + $phone1 = str_replace("(", "", $phone1); + $phone1 = str_replace(")", "", $phone1); + $phone1 = str_replace(" ", "", $phone1); + $phone1 = str_replace(".", "", $phone1); + $phone2 = str_replace("-", "", $phone2); + $phone2 = str_replace("(", "", $phone2); + $phone2 = str_replace(")", "", $phone2); + $phone2 = str_replace(" ", "", $phone2); + $phone2 = str_replace(".", "", $phone2); + + //make the call + if (strlen($phone1)> 0) { + if ($gateway == "loopback") { + $cmd = $_SESSION['switch']['bin']['dir']."/fs_cli -x \"luarun call_broadcast_originate.lua {call_timeout=".$broadcast_timeout."}loopback/".$phone1."/default/XML ".$_SESSION['switch']['recordings']['dir']."/".$recording_filename." '".$broadcast_caller_id_name."' ".$broadcast_caller_id_number." ".$broadcast_timeout." '".$broadcast_destination_application."' '".$broadcast_destination_data."'\";"; + } + else { + $cmd = $_SESSION['switch']['bin']['dir']."/fs_cli -x \"luarun call_broadcast_originate.lua {call_timeout=".$broadcast_timeout."}sofia/gateway/".$gateway."/".$phone1." ".$_SESSION['switch']['recordings']['dir']."/".$recording_filename." '".$broadcast_caller_id_name."' ".$broadcast_caller_id_number." ".$broadcast_timeout." '".$broadcast_destination_application."' '".$broadcast_destination_data."'\";"; + } + //echo $cmd."
\n"; + cmd_async($cmd); + } + if (strlen($phone2)> 0) { + if ($gateway == "loopback") { + $cmd = $_SESSION['switch']['bin']['dir']."/fs_cli -x \"luarun call_broadcast_originate.lua {call_timeout=".$broadcast_timeout."}loopback/".$phone2."/default/XML ".$_SESSION['switch']['recordings']['dir']."/".$recording_filename." '".$broadcast_caller_id_name."' ".$broadcast_caller_id_number." ".$broadcast_timeout." '".$broadcast_destination_application."' '".$broadcast_destination_data."'\";"; + } + else { + $cmd = $_SESSION['switch']['bin']['dir']."/fs_cli -x \"luarun call_broadcast_originate.lua {call_timeout=".$broadcast_timeout."}sofia/gateway/".$gateway."/".$phone2." ".$_SESSION['switch']['recordings']['dir']."/".$recording_filename." '".$broadcast_caller_id_name."' ".$broadcast_caller_id_number." ".$broadcast_timeout." '".$broadcast_destination_application."' '".$broadcast_destination_data."'\";"; + } + //echo $cmd."
\n"; + cmd_async($cmd); + } + + if ($c==0) { $c=1; } else { $c=0; } + } //end foreach + unset($sql, $result, $row_count); + } //end if results + + echo "
".$row[username]." ".$row[user_type]." ".$row[user_category]." ".$row[user_first_name]." ".$row[user_last_name]." ".$row[user_company_name]." ".$row[user_phone_1]." ".$row[user_phone_2]." 
"; + echo "
"; + echo "

"; + echo "

"; + + echo "
"; + echo "
"; + echo "

"; + + +require_once "includes/footer.php"; +unset ($result_count); +unset ($result); +unset ($key); +unset ($val); +unset ($c); +*/ +?> diff --git a/app/call_center/app_config.php b/app/call_center/app_config.php new file mode 100644 index 0000000000..7d84b72b40 --- /dev/null +++ b/app/call_center/app_config.php @@ -0,0 +1,457 @@ + \ No newline at end of file diff --git a/app/call_center/root.php b/app/call_center/root.php new file mode 100644 index 0000000000..7b882438ea --- /dev/null +++ b/app/call_center/root.php @@ -0,0 +1,50 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ + +// make sure the PATH_SEPARATOR is defined + if (!defined("PATH_SEPARATOR")) { + if ( strpos( $_ENV[ "OS" ], "Win" ) !== false ) { define("PATH_SEPARATOR", ";"); } else { define("PATH_SEPARATOR", ":"); } + } + +// make sure the document_root is set + $_SERVER["SCRIPT_FILENAME"] = str_replace("\\", "/", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = str_replace($_SERVER["PHP_SELF"], "", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = realpath($_SERVER["DOCUMENT_ROOT"]); + //echo "DOCUMENT_ROOT: ".$_SERVER["DOCUMENT_ROOT"]."
\n"; + //echo "PHP_SELF: ".$_SERVER["PHP_SELF"]."
\n"; + //echo "SCRIPT_FILENAME: ".$_SERVER["SCRIPT_FILENAME"]."
\n"; + +// if the project directory exists then add it to the include path otherwise add the document root to the include path + if (is_dir($_SERVER["DOCUMENT_ROOT"].'/fusionpbx')){ + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', '/fusionpbx'); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER["DOCUMENT_ROOT"].'/fusionpbx' ); + } + else { + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', ''); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER['DOCUMENT_ROOT'] ); + } + +?> \ No newline at end of file diff --git a/app/call_center/v_call_center_agent.php b/app/call_center/v_call_center_agent.php new file mode 100644 index 0000000000..8387e886f7 --- /dev/null +++ b/app/call_center/v_call_center_agent.php @@ -0,0 +1,190 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require_once "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('call_center_agents_view')) { + //access granted +} +else { + echo "access denied"; + exit; +} +require_once "includes/header.php"; +require_once "includes/paging.php"; + +//get http values and set them to php variables + $order_by = $_GET["order_by"]; + $order = $_GET["order"]; + +//show content + echo "
"; + echo "\n"; + echo "\n"; + echo " "; + echo ""; + echo "
\n"; + echo "
"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "
Call Center Agent List\n"; + echo " \n"; + echo " \n"; + echo "
\n"; + echo "List of call center agents.

\n"; + echo "
\n"; + + $sql = ""; + $sql .= "select * from v_call_center_agents "; + $sql .= "where domain_uuid = '$domain_uuid' "; + if (strlen($order_by) == 0) { + $order_by = 'agent_name'; + $order = 'asc'; + } + else { + $sql .= "order by $order_by $order "; + } + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + $num_rows = count($result); + unset ($prep_statement, $result, $sql); + $rows_per_page = 100; + $param = ""; + $page = $_GET['page']; + if (strlen($page) == 0) { $page = 0; $_GET['page'] = 0; } + list($paging_controls, $rows_per_page, $var_3) = paging($num_rows, $param, $rows_per_page); + $offset = $rows_per_page * $page; + + $sql = ""; + $sql .= " select * from v_call_center_agents "; + $sql .= "where domain_uuid = '$domain_uuid' "; + if (strlen($order_by) == 0) { + $order_by = 'agent_name'; + $order = 'asc'; + } + else { + $sql .= "order by $order_by $order "; + } + $sql .= " limit $rows_per_page offset $offset "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + $result_count = count($result); + unset ($prep_statement, $sql); + + + $c = 0; + $row_style["0"] = "row_style0"; + $row_style["1"] = "row_style1"; + + echo "
\n"; + echo "\n"; + + echo "\n"; + //echo th_order_by('domain_uuid', 'domain_uuid', $order_by, $order); + echo th_order_by('agent_name', 'Agent Name', $order_by, $order); + echo th_order_by('agent_type', 'Type', $order_by, $order); + echo th_order_by('agent_call_timeout', 'Call Timeout', $order_by, $order); + echo th_order_by('agent_contact', 'Contact', $order_by, $order); + echo th_order_by('agent_max_no_answer', 'Max No Answer', $order_by, $order); + echo th_order_by('agent_status', 'Status', $order_by, $order); + //echo th_order_by('agent_wrap_up_time', 'Wrap Up Time', $order_by, $order); + //echo th_order_by('agent_reject_delay_time', 'Reject Delay Time', $order_by, $order); + //echo th_order_by('agent_busy_delay_time', 'Busy Delay Time', $order_by, $order); + echo "\n"; + echo "\n"; + + if ($result_count == 0) { //no results + } + else { //received results + foreach($result as $row) { + echo "\n"; + //echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + //echo " \n"; + //echo " \n"; + //echo " \n"; + echo " \n"; + echo "\n"; + if ($c==0) { $c=1; } else { $c=0; } + } //end foreach + unset($sql, $result, $row_count); + } //end if results + + echo "\n"; + echo "\n"; + echo "\n"; + + echo "
\n"; + if (permission_exists('call_center_agents_add')) { + echo " $v_link_label_add\n"; + } + echo "
".$row[domain_uuid]."".$row[agent_name]." ".$row[agent_type]." ".$row[agent_call_timeout]." ".$row[agent_contact]." ".$row[agent_max_no_answer]." ".$row[agent_status]." ".$row[agent_wrap_up_time]." ".$row[agent_reject_delay_time]." ".$row[agent_busy_delay_time]." \n"; + if (permission_exists('call_center_agents_edit')) { + echo " $v_link_label_edit\n"; + } + if (permission_exists('call_center_agents_delete')) { + echo " $v_link_label_delete\n"; + } + //echo " \n"; + //echo " \n"; + echo "
\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "
 $paging_controls\n"; + if (permission_exists('call_center_agents_add')) { + echo " $v_link_label_add\n"; + } + echo "
\n"; + echo "
"; + echo "
"; + echo "

"; + echo "

"; + + echo "
"; + echo "
"; + echo "

"; + +//show the footer + require_once "includes/footer.php"; +?> diff --git a/app/call_center/v_call_center_agent_delete.php b/app/call_center/v_call_center_agent_delete.php new file mode 100644 index 0000000000..0c49348af5 --- /dev/null +++ b/app/call_center/v_call_center_agent_delete.php @@ -0,0 +1,85 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require_once "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('call_center_agents_delete')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +if (count($_GET)>0) { + $id = check_str($_GET["id"]); +} + +//get the agent details + $sql = ""; + $sql .= "select * from v_call_center_agents "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and call_center_agent_uuid = '$id' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach ($result as &$row) { + $agent_name = $row["agent_name"]; + break; //limit to 1 row + } + unset ($prep_statement); + +//delete the agent from the freeswitch + //setup the event socket connection + $fp = event_socket_create($_SESSION['event_socket_ip_address'], $_SESSION['event_socket_port'], $_SESSION['event_socket_password']); + //delete the agent over event socket + if ($fp) { + $cmd = "api callcenter_config agent del ".$agent_name."@".$_SESSION['domains'][$domain_uuid]['domain_name']; + $response = event_socket_request($fp, $cmd); + } + +//delete the agent from the db + if (strlen($id)>0) { + $sql = ""; + $sql .= "delete from v_call_center_agents "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and call_center_agent_uuid = '$id' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + unset($sql); + } + +//redirect the user + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Delete Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + +?> + diff --git a/app/call_center/v_call_center_agent_edit.php b/app/call_center/v_call_center_agent_edit.php new file mode 100644 index 0000000000..92d3e5eb56 --- /dev/null +++ b/app/call_center/v_call_center_agent_edit.php @@ -0,0 +1,513 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require_once "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('call_center_agents_add') || permission_exists('call_center_agents_edit')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +//action add or update + if (isset($_REQUEST["id"])) { + $action = "update"; + $call_center_agent_uuid = check_str($_REQUEST["id"]); + } + else { + $action = "add"; + } + +//get http post variables and set them to php variables + if (count($_POST)>0) { + $agent_name = check_str($_POST["agent_name"]); + $agent_type = check_str($_POST["agent_type"]); + $agent_call_timeout = check_str($_POST["agent_call_timeout"]); + $agent_contact = check_str($_POST["agent_contact"]); + $agent_status = check_str($_POST["agent_status"]); + $agent_logout = check_str($_POST["agent_logout"]); + $agent_no_answer_delay_time = check_str($_POST["agent_no_answer_delay_time"]); + $agent_max_no_answer = check_str($_POST["agent_max_no_answer"]); + $agent_wrap_up_time = check_str($_POST["agent_wrap_up_time"]); + $agent_reject_delay_time = check_str($_POST["agent_reject_delay_time"]); + $agent_busy_delay_time = check_str($_POST["agent_busy_delay_time"]); + } + +if (count($_POST)>0 && strlen($_POST["persistformvar"]) == 0) { + + $msg = ''; + + if ($action == "update") { + $call_center_agent_uuid = check_str($_POST["call_center_agent_uuid"]); + } + + //check for all required data + //if (strlen($domain_uuid) == 0) { $msg .= "Please provide: domain_uuid
\n"; } + //if (strlen($agent_name) == 0) { $msg .= "Please provide: Agent Name
\n"; } + //if (strlen($agent_type) == 0) { $msg .= "Please provide: Type
\n"; } + //if (strlen($agent_call_timeout) == 0) { $msg .= "Please provide: Call Timeout
\n"; } + //if (strlen($agent_contact) == 0) { $msg .= "Please provide: Contact
\n"; } + //if (strlen($agent_status) == 0) { $msg .= "Please provide: Status
\n"; } + //if (strlen($agent_logout) == 0) { $msg .= "Please provide: Logout
\n"; } + //if (strlen($agent_no_answer_delay_time) == 0) { $msg .= "Please provide: No Answer Delay Time
\n"; } + //if (strlen($agent_max_no_answer) == 0) { $msg .= "Please provide: Max No Answer
\n"; } + //if (strlen($agent_wrap_up_time) == 0) { $msg .= "Please provide: Wrap Up Time
\n"; } + //if (strlen($agent_reject_delay_time) == 0) { $msg .= "Please provide: Reject Delay Time
\n"; } + //if (strlen($agent_busy_delay_time) == 0) { $msg .= "Please provide: Busy Delay Time
\n"; } + if (strlen($msg) > 0 && strlen($_POST["persistformvar"]) == 0) { + require_once "includes/header.php"; + require_once "includes/persistformvar.php"; + echo "
\n"; + echo "
\n"; + echo $msg."
"; + echo "
\n"; + persistformvar($_POST); + echo "
\n"; + require_once "includes/footer.php"; + return; + } + + //get and then set the complete agent_contact with the call_timeout and when necessary confirm + $tmp_confirm = "group_confirm_file=custom/press_1_to_accept_this_call.wav,group_confirm_key=1"; + if(strstr($agent_contact, '}') === FALSE) { + //not found + if(stristr($agent_contact, 'sofia/gateway') === FALSE) { + //add the call_timeout + $tmp_agent_contact = "{call_timeout=".$agent_call_timeout."}".$agent_contact; + } + else { + //add the call_timeout and confirm + $tmp_agent_contact = $tmp_first.',call_timeout='.$agent_call_timeout.$tmp_last; + $tmp_agent_contact = "{".$tmp_confirm.",call_timeout=".$agent_call_timeout."}".$agent_contact; + } + } + else { + //found + if(stristr($agent_contact, 'sofia/gateway') === FALSE) { + //not found + if(stristr($agent_contact, 'call_timeout') === FALSE) { + //add the call_timeout + $tmp_pos = strrpos($agent_contact, "}"); + $tmp_first = substr($agent_contact, 0, $tmp_pos); + $tmp_last = substr($agent_contact, $tmp_pos); + $tmp_agent_contact = $tmp_first.',call_timeout='.$agent_call_timeout.$tmp_last; + } + else { + //the string has the call timeout + $tmp_agent_contact = $agent_contact; + } + } + else { + //found + $tmp_pos = strrpos($agent_contact, "}"); + $tmp_first = substr($agent_contact, 0, $tmp_pos); + $tmp_last = substr($agent_contact, $tmp_pos); + if(stristr($agent_contact, 'call_timeout') === FALSE) { + //add the call_timeout and confirm + $tmp_agent_contact = $tmp_first.','.$tmp_confirm.',call_timeout='.$agent_call_timeout.$tmp_last; + } + else { + //add confirm + $tmp_agent_contact = $tmp_first.','.$tmp_confirm.$tmp_last; + } + } + } + + //set the user_status + $sql = "update v_users set "; + $sql .= "user_status = '".$agent_status."' "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and username = '".$agent_name."' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + + //add the agent + //setup the event socket connection + $fp = event_socket_create($_SESSION['event_socket_ip_address'], $_SESSION['event_socket_port'], $_SESSION['event_socket_password']); + //add the agent using event socket + if ($fp) { + //add the agent + $cmd = "api callcenter_config agent add ".$agent_name."@".$_SESSION['domains'][$domain_uuid]['domain_name']." ".$agent_type; + $response = event_socket_request($fp, $cmd); + usleep(200); + //agent set contact + $cmd = "api callcenter_config agent set contact ".$agent_name."@".$_SESSION['domains'][$domain_uuid]['domain_name']." ".$tmp_agent_contact; + $response = event_socket_request($fp, $cmd); + usleep(200); + //agent set status + $cmd = "api callcenter_config agent set status ".$agent_name."@".$_SESSION['domains'][$domain_uuid]['domain_name']." '".$agent_status."'"; + $response = event_socket_request($fp, $cmd); + usleep(200); + //agent set reject_delay_time + $cmd = "api callcenter_config agent set reject_delay_time ".$agent_name."@".$_SESSION['domains'][$domain_uuid]['domain_name']." ".$agent_reject_delay_time; + $response = event_socket_request($fp, $cmd); + usleep(200); + //agent set busy_delay_time + $cmd = "api callcenter_config agent set busy_delay_time ".$agent_name."@".$_SESSION['domains'][$domain_uuid]['domain_name']." ".$agent_busy_delay_time; + $response = event_socket_request($fp, $cmd); + } + + //add or update the database + if ($_POST["persistformvar"] != "true") { + if ($action == "add") { + //add the agent to the database + $call_center_agent_uuid = uuid(); + $sql = "insert into v_call_center_agents "; + $sql .= "("; + $sql .= "domain_uuid, "; + $sql .= "call_center_agent_uuid, "; + $sql .= "agent_name, "; + $sql .= "agent_type, "; + $sql .= "agent_call_timeout, "; + $sql .= "agent_contact, "; + $sql .= "agent_status, "; + $sql .= "agent_logout, "; + $sql .= "agent_no_answer_delay_time, "; + $sql .= "agent_max_no_answer, "; + $sql .= "agent_wrap_up_time, "; + $sql .= "agent_reject_delay_time, "; + $sql .= "agent_busy_delay_time "; + $sql .= ")"; + $sql .= "values "; + $sql .= "("; + $sql .= "'$domain_uuid', "; + $sql .= "'$call_center_agent_uuid', "; + $sql .= "'$agent_name', "; + $sql .= "'$agent_type', "; + $sql .= "'$agent_call_timeout', "; + $sql .= "'$agent_contact', "; + $sql .= "'$agent_status', "; + $sql .= "'$agent_logout', "; + $sql .= "'$agent_no_answer_delay_time', "; + $sql .= "'$agent_max_no_answer', "; + $sql .= "'$agent_wrap_up_time', "; + $sql .= "'$agent_reject_delay_time', "; + $sql .= "'$agent_busy_delay_time' "; + $sql .= ")"; + $db->exec(check_sql($sql)); + unset($sql); + + //syncrhonize configuration + save_call_center_xml(); + + //redirect the user + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Add Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + } //if ($action == "add") + + if ($action == "update") { + $sql = "update v_call_center_agents set "; + $sql .= "agent_name = '$agent_name', "; + $sql .= "agent_type = '$agent_type', "; + $sql .= "agent_call_timeout = '$agent_call_timeout', "; + $sql .= "agent_contact = '$agent_contact', "; + $sql .= "agent_status = '$agent_status', "; + $sql .= "agent_logout = '$agent_logout', "; + $sql .= "agent_no_answer_delay_time = '$agent_no_answer_delay_time', "; + $sql .= "agent_max_no_answer = '$agent_max_no_answer', "; + $sql .= "agent_wrap_up_time = '$agent_wrap_up_time', "; + $sql .= "agent_reject_delay_time = '$agent_reject_delay_time', "; + $sql .= "agent_busy_delay_time = '$agent_busy_delay_time' "; + $sql .= "where domain_uuid = '$domain_uuid'"; + $sql .= "and call_center_agent_uuid = '$call_center_agent_uuid'"; + $db->exec(check_sql($sql)); + unset($sql); + + //syncrhonize configuration + save_call_center_xml(); + + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Update Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + } //if ($action == "update") + } //if ($_POST["persistformvar"] != "true") +} //(count($_POST)>0 && strlen($_POST["persistformvar"]) == 0) + +//pre-populate the form + if (count($_GET)>0 && $_POST["persistformvar"] != "true") { + $call_center_agent_uuid = $_GET["id"]; + $sql = ""; + $sql .= "select * from v_call_center_agents "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and call_center_agent_uuid = '$call_center_agent_uuid' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach ($result as &$row) { + $agent_name = $row["agent_name"]; + $agent_type = $row["agent_type"]; + $agent_call_timeout = $row["agent_call_timeout"]; + $agent_contact = $row["agent_contact"]; + $agent_status = $row["agent_status"]; + $agent_logout = $row["agent_logout"]; + $agent_no_answer_delay_time = $row["agent_no_answer_delay_time"]; + $agent_max_no_answer = $row["agent_max_no_answer"]; + $agent_wrap_up_time = $row["agent_wrap_up_time"]; + $agent_reject_delay_time = $row["agent_reject_delay_time"]; + $agent_busy_delay_time = $row["agent_busy_delay_time"]; + break; //limit to 1 row + } + unset ($prep_statement); + } + +//set default values + if (strlen($agent_type) == 0) { $agent_type = "callback"; } + if (strlen($agent_call_timeout) == 0) { $agent_call_timeout = 10; } + if (strlen($agent_max_no_answer) == 0) { $agent_max_no_answer = "3"; } + if (strlen($agent_wrap_up_time) == 0) { $agent_wrap_up_time = "10"; } + if (strlen($agent_no_answer_delay_time) == 0) { $agent_no_answer_delay_time = "10"; } + if (strlen($agent_reject_delay_time) == 0) { $agent_reject_delay_time = "10"; } + if (strlen($agent_busy_delay_time) == 0) { $agent_busy_delay_time = "60"; } + +//show the header + require_once "includes/header.php"; + +//show the content + echo "
"; + echo "\n"; + echo "\n"; + echo " "; + echo " "; + echo "
\n"; + echo "
"; + + echo "
\n"; + echo "
\n"; + echo "\n"; + echo "\n"; + if ($action == "add") { + echo "\n"; + } + if ($action == "update") { + echo "\n"; + } + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo " \n"; + echo " \n"; + echo " "; + echo "
Call Center Agent AddCall Center Agent Edit
\n"; + //echo "Call Center agents settings.

\n"; + echo "
\n"; + echo " Agent Name:\n"; + echo "\n"; + //---- Begin Select List -------------------- + $sql = "SELECT * FROM v_users "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "order by username asc "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + + echo ""; + unset($sql, $result); + //---- End Select List -------------------- + echo "
\n"; + echo "Select the agents name.\n"; + echo "
\n"; + echo " Type:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the agent type.\n"; + echo "
\n"; + echo " Call Timeout:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the call timeout.\n"; + echo "
\n"; + echo " Contact:\n"; + echo "\n"; + + //switch_select_destination(select_type, select_label, select_name, select_value, select_style, action); + switch_select_destination("call_center_contact", "", "agent_contact", $agent_contact, "", ""); + + echo "
\n"; + echo "Select the contact number.\n"; + echo "
\n"; + echo " Status:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Select the agent status.\n"; + echo "
\n"; + echo " No Answer Delay Time:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the agent no answer delay time in seconds.\n"; + echo "
\n"; + echo " Max No Answer:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter max no answer.\n"; + echo "
\n"; + echo " Wrap Up Time:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the wrap up time.\n"; + echo "
\n"; + echo " Reject Delay Time:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the reject delay time.\n"; + echo "
\n"; + echo " Busy Delay Time:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the agent busy delay time.\n"; + echo "
\n"; + echo " Agent Logout:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the auto agent logout time in 00:00 format. Requires a service to enforce the logout time.\n"; + echo "
\n"; + if ($action == "update") { + echo " \n"; + } + echo " \n"; + echo "
"; + echo ""; + + echo "
"; + echo "
"; + +//footer + require_once "includes/footer.php"; +?> diff --git a/app/call_center/v_call_center_agent_status.php b/app/call_center/v_call_center_agent_status.php new file mode 100644 index 0000000000..46a768d8f1 --- /dev/null +++ b/app/call_center/v_call_center_agent_status.php @@ -0,0 +1,235 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require_once "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('call_center_agents_edit')) { + //access granted +} +else { + echo "access denied"; + exit; +} +require_once "includes/header.php"; +require_once "includes/paging.php"; + +//setup the event socket connection + $fp = event_socket_create($_SESSION['event_socket_ip_address'], $_SESSION['event_socket_port'], $_SESSION['event_socket_password']); + +//get the http post values and set them as php variables + if (count($_POST)>0) { + //include the dnd php class + include "includes/classes/do_not_disturb.php"; + + foreach($_POST['agents'] as $row) { + if (strlen($row['status']) > 0) { + //agent set status + if ($fp) { + //set the user_status + $sql = "update v_users set "; + $sql .= "user_status = '".$row['status']."' "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and username = '".$row['name']."' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + //set the call center status + if ($row['status'] == "Do Not Disturb") { + //set the default dnd action + $dnd_action = "add"; + //set the call center status to Logged Out + $cmd = "api callcenter_config agent set status ".$row['name']."@".$_SESSION['domains'][$domain_uuid]['domain_name']." 'Logged Out'"; + } + else { + $cmd = "api callcenter_config agent set status ".$row['name']."@".$_SESSION['domains'][$domain_uuid]['domain_name']." '".$row['status']."'"; + } + //echo $cmd."
\n"; + $response = event_socket_request($fp, $cmd); + usleep(200); + } + + //loop through the list of assigned extensions + foreach ($_SESSION['user']['extension'] as &$sub_row) { + $extension = $sub_row["user"]; + //hunt_group information used to determine if this is an add or an update + $sql = "select * from v_hunt_groups "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and hunt_group_extension = '$extension' "; + $prep_statement_2 = $db->prepare(check_sql($sql)); + $prep_statement_2->execute(); + $result2 = $prep_statement_2->fetchAll(PDO::FETCH_NAMED); + foreach ($result2 as &$row2) { + if ($row2["hunt_group_type"] == 'dnd') { + $dnd_action = "update"; + $dnd_uuid = $row2["hunt_group_uuid"]; + } + } + unset ($prep_statement_2, $result2, $row2); + //add or update dnd + $dnd = new do_not_disturb; + //$dnd->debug = false; + $dnd->domain_uuid = $domain_uuid; + $dnd->dnd_uuid = $dnd_uuid; + $dnd->domain_name = $_SESSION['domain_name']; + $dnd->extension = $extension; + if ($row['status'] == "Do Not Disturb") { + $dnd->dnd_enabled = "true"; + if ($dnd_action == "add") { + $dnd->dnd_add(); + } + if ($dnd_action == "update") { + $dnd->dnd_update(); + } + } + else { + //for other status disable dnd + if ($dnd_action == "update") { + $dnd->dnd_enabled = "false"; + $dnd->dnd_update(); + } + } + unset($dnd); + } + unset ($prep_statement); + } + } + } + +//get the agent list from event socket + $switch_cmd = 'callcenter_config agent list'; + $event_socket_str = trim(event_socket_request($fp, 'api '.$switch_cmd)); + $agent_array = csv_to_named_array($event_socket_str, '|'); +//set the status on the user_array by using the extension as the key + foreach ($agent_array as $row) { + if (count($_SESSION['domains']) == 1) { + //get the extension status from the call center agent list + preg_match('/user\/(\d{2,7})/', $row['contact'], $matches); + $extension = $matches[1]; + $user_array[$extension]['username'] = $tmp[0]; + if ($user_array[$extension]['user_status'] != "Do Not Disturb") { + $user_array[$extension]['user_status'] = $row['status']; + } + } else { + $tmp = explode('@',$row["name"]); + if ($tmp[1] == $_SESSION['domain_name']) { + //get the extension status from the call center agent list + preg_match('/user\/(\d{2,7})/', $row['contact'], $matches); + $extension = $matches[1]; + $user_array[$extension]['username'] = $tmp[0]; + if ($user_array[$extension]['user_status'] != "Do Not Disturb") { + $user_array[$extension]['user_status'] = $row['status']; + } + } + } + } + +//show the content + echo "
"; + echo "\n"; + echo "\n"; + echo " "; + echo ""; + echo "
\n"; + echo "
"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "
Call Center Agent Status\n"; + echo " \n"; + echo " \n"; + echo "
\n"; + echo "List all the call center agents with the option to change the status of one or more agents.

\n"; + echo "
\n"; + + $c = 0; + $row_style["0"] = "row_style0"; + $row_style["1"] = "row_style1"; + + echo "
\n"; + echo "
\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + $x = 0; + foreach($agent_array as $row) { + $tmp = explode('@',$row["name"]); + $agent_name = $tmp[0]; + if ($tmp[1] == $_SESSION['domain_name']) { + echo "\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "\n"; + } + if ($c==0) { $c=1; } else { $c=0; } + $x++; + } //end foreach + unset($sql, $result, $row_count); + + echo "\n"; + echo "\n"; + echo "\n"; + + echo "
AgentStatusOptions
".$row['name']." ".$row['status']." "; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "
\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "
 $paging_controls\n"; + echo "
\n"; + echo " \n"; + echo "
\n"; + echo "
"; + echo "
"; + echo "

"; + echo "

"; + + echo "
"; + echo "
"; + echo "\n"; + echo "

"; + +//show the footer + require_once "includes/footer.php"; +?> diff --git a/app/call_center/v_call_center_queue.php b/app/call_center/v_call_center_queue.php new file mode 100644 index 0000000000..902b08d276 --- /dev/null +++ b/app/call_center/v_call_center_queue.php @@ -0,0 +1,194 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require_once "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('call_center_queues_view')) { + //access granted +} +else { + echo "access denied"; + exit; +} +require_once "includes/header.php"; +require_once "includes/paging.php"; + +//get http variables and set as php variables + $order_by = $_GET["order_by"]; + $order = $_GET["order"]; + +//show the content + echo "
"; + echo "\n"; + echo "\n"; + echo " "; + echo ""; + echo "
\n"; + echo "
"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "
Call Center Queue\n"; + echo " \n"; + echo " \n"; + echo "
\n"; + echo "List of queues for the call center.

\n"; + echo "
\n"; + + $sql = ""; + $sql .= "select * from v_call_center_queues "; + $sql .= "where domain_uuid = '$domain_uuid' "; + if (strlen($order_by) == 0) { + $order_by = 'queue_name'; + $order = 'asc'; + } + else { + $sql .= "order by $order_by $order "; + } + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + $num_rows = count($result); + unset ($prep_statement, $result, $sql); + $rows_per_page = 100; + $param = ""; + $page = $_GET['page']; + if (strlen($page) == 0) { $page = 0; $_GET['page'] = 0; } + list($paging_controls, $rows_per_page, $var_3) = paging($num_rows, $param, $rows_per_page); + $offset = $rows_per_page * $page; + + $sql = ""; + $sql .= "select * from v_call_center_queues "; + $sql .= "where domain_uuid = '$domain_uuid' "; + if (strlen($order_by) == 0) { + $order_by = 'queue_name'; + $order = 'asc'; + } + else { + $sql .= "order by $order_by $order "; + } + $sql .= " limit $rows_per_page offset $offset "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + $result_count = count($result); + unset ($prep_statement, $sql); + + $c = 0; + $row_style["0"] = "row_style0"; + $row_style["1"] = "row_style1"; + + echo "
\n"; + echo "\n"; + echo "\n"; + echo th_order_by('queue_name', 'Queue Name', $order_by, $order); + echo th_order_by('queue_extension', 'Extension', $order_by, $order); + echo th_order_by('queue_strategy', 'Strategy', $order_by, $order); + //echo th_order_by('queue_moh_sound', 'Music On Hold', $order_by, $order); + //echo th_order_by('queue_record_template', 'Record Template', $order_by, $order); + //echo th_order_by('queue_time_base_score', 'Time Base Score', $order_by, $order); + //echo th_order_by('queue_max_wait_time', 'Max Wait Time', $order_by, $order); + //echo th_order_by('queue_max_wait_time_with_no_agent', 'Max Wait Time With No Agent', $order_by, $order); + echo th_order_by('queue_tier_rules_apply', 'Tier Rules Apply', $order_by, $order); + //echo th_order_by('queue_tier_rule_wait_second', 'Tier Rule Wait Second', $order_by, $order); + //echo th_order_by('queue_tier_rule_no_agent_no_wait', 'Tier Rule No Agent No Wait', $order_by, $order); + //echo th_order_by('queue_discard_abandoned_after', 'Discard Abandoned After', $order_by, $order); + //echo th_order_by('queue_abandoned_resume_allowed', 'Abandoned Resume Allowed', $order_by, $order); + //echo th_order_by('queue_tier_rule_wait_multiply_level', 'Tier Rule Wait Multiply Level', $order_by, $order); + echo th_order_by('queue_description', 'Description', $order_by, $order); + echo "\n"; + echo "\n"; + + if ($result_count > 0) { + foreach($result as $row) { + echo "\n"; + echo " \n"; + echo " \n"; + echo " \n"; + //echo " \n"; + //echo " \n"; + //echo " \n"; + //echo " \n"; + //echo " \n"; + echo " \n"; + //echo " \n"; + //echo " \n"; + //echo " \n"; + //echo " \n"; + //echo " \n"; + echo " \n"; + echo " \n"; + echo "\n"; + if ($c==0) { $c=1; } else { $c=0; } + } //end foreach + unset($sql, $result, $row_count); + } //end if results + + echo "\n"; + echo "\n"; + echo "\n"; + + echo "
\n"; + if (permission_exists('call_center_queues_add')) { + echo " $v_link_label_add\n"; + } + echo "
".$row[queue_name]." ".$row[queue_extension]." ".$row[queue_strategy]." ".$row[queue_moh_sound]." ".$row[queue_record_template]." ".$row[queue_time_base_score]." ".$row[queue_max_wait_time]." ".$row[queue_max_wait_time_with_no_agent]." ".$row[queue_tier_rules_apply]." ".$row[queue_tier_rule_wait_second]." ".$row[queue_tier_rule_no_agent_no_wait]." ".$row[queue_discard_abandoned_after]." ".$row[queue_abandoned_resume_allowed]." ".$row[queue_tier_rule_wait_multiply_level]." ".$row[queue_description]." \n"; + if (permission_exists('call_center_queues_edit')) { + echo " $v_link_label_edit\n"; + } + if (permission_exists('call_center_queues_delete')) { + echo " $v_link_label_delete\n"; + } + echo "
\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "
 $paging_controls\n"; + if (permission_exists('call_center_queues_add')) { + echo " $v_link_label_add\n"; + } + echo "
\n"; + echo "
"; + echo "
"; + echo "

"; + echo "

"; + + echo "
"; + echo "
"; + echo "

"; + +//show the footer + require_once "includes/footer.php"; +?> diff --git a/app/call_center/v_call_center_queue_delete.php b/app/call_center/v_call_center_queue_delete.php new file mode 100644 index 0000000000..8e9b4a704f --- /dev/null +++ b/app/call_center/v_call_center_queue_delete.php @@ -0,0 +1,93 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require_once "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('call_center_queues_delete')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +if (count($_GET) > 0) { + $id = check_str($_GET["id"]); +} + +if (strlen($id) > 0) { + + //get the dialplan uuid + $sql = "select * from v_call_center_queues "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and call_center_queue_uuid = '$id' "; + $prep_statement = $db->prepare($sql); + $prep_statement->execute(); + while($row = $prep_statement->fetch(PDO::FETCH_ASSOC)) { + $dialplan_uuid = $row['dialplan_uuid']; + } + + //delete the call center queue + $sql = "delete from v_call_center_queues "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and dialplan_uuid = '$dialplan_uuid' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + unset($sql); + + //delete the dialplan entry + $sql = "delete from v_dialplans "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and dialplan_uuid = '$dialplan_uuid' "; + //echo $sql."
\n"; + $db->query($sql); + unset($sql); + + //delete the dialplan details + $sql = "delete from v_dialplan_details "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and dialplan_uuid = '$dialplan_uuid' "; + //echo $sql."
\n"; + $db->query($sql); + unset($sql); + + //syncrhonize configuration + save_dialplan_xml(); + + //apply settings reminder + $_SESSION["reload_xml"] = true; +} + +//redirect the browser + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Delete Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + +?> \ No newline at end of file diff --git a/app/call_center/v_call_center_queue_edit.php b/app/call_center/v_call_center_queue_edit.php new file mode 100644 index 0000000000..45ac396108 --- /dev/null +++ b/app/call_center/v_call_center_queue_edit.php @@ -0,0 +1,633 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require_once "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('call_center_queues_add') || permission_exists('call_center_queues_edit')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +//action add or update + if (isset($_REQUEST["id"])) { + $action = "update"; + $call_center_queue_uuid = check_str($_REQUEST["id"]); + } + else { + $action = "add"; + } + +//get http post variables and set them to php variables + if (count($_POST)>0) { + //$domain_uuid = check_str($_POST["domain_uuid"]); + $queue_name = check_str($_POST["queue_name"]); + $queue_extension = check_str($_POST["queue_extension"]); + $queue_strategy = check_str($_POST["queue_strategy"]); + $queue_moh_sound = check_str($_POST["queue_moh_sound"]); + $queue_record_template = check_str($_POST["queue_record_template"]); + $queue_time_base_score = check_str($_POST["queue_time_base_score"]); + $queue_max_wait_time = check_str($_POST["queue_max_wait_time"]); + $queue_max_wait_time_with_no_agent = check_str($_POST["queue_max_wait_time_with_no_agent"]); + $queue_tier_rules_apply = check_str($_POST["queue_tier_rules_apply"]); + $queue_tier_rule_wait_second = check_str($_POST["queue_tier_rule_wait_second"]); + $queue_tier_rule_wait_multiply_level = check_str($_POST["queue_tier_rule_wait_multiply_level"]); + $queue_tier_rule_no_agent_no_wait = check_str($_POST["queue_tier_rule_no_agent_no_wait"]); + $queue_timeout_action = check_str($_POST["queue_timeout_action"]); + $queue_discard_abandoned_after = check_str($_POST["queue_discard_abandoned_after"]); + $queue_abandoned_resume_allowed = check_str($_POST["queue_abandoned_resume_allowed"]); + $queue_cid_prefix = check_str($_POST["queue_cid_prefix"]); + $queue_description = check_str($_POST["queue_description"]); + + //remove invalid characters + $queue_cid_prefix = str_replace(":", "-", $queue_cid_prefix); + $queue_cid_prefix = str_replace("\"", "", $queue_cid_prefix); + $queue_cid_prefix = str_replace("@", "", $queue_cid_prefix); + $queue_cid_prefix = str_replace("\\", "", $queue_cid_prefix); + $queue_cid_prefix = str_replace("/", "", $queue_cid_prefix); + } + +if (count($_POST)>0 && strlen($_POST["persistformvar"]) == 0) { + + $msg = ''; + if ($action == "update") { + $call_center_queue_uuid = check_str($_POST["call_center_queue_uuid"]); + } + + //check for all required data + if (strlen($domain_uuid) == 0) { $msg .= "Please provide: domain_uuid
\n"; } + if (strlen($queue_name) == 0) { $msg .= "Please provide: Queue Name
\n"; } + if (strlen($queue_extension) == 0) { $msg .= "Please provide: Extension
\n"; } + if (strlen($queue_strategy) == 0) { $msg .= "Please provide: Strategy
\n"; } + if (strlen($queue_moh_sound) == 0) { $msg .= "Please provide: Music on Hold
\n"; } + //if (strlen($queue_record_template) == 0) { $msg .= "Please provide: Record Template
\n"; } + //if (strlen($queue_time_base_score) == 0) { $msg .= "Please provide: Time Base Score
\n"; } + //if (strlen($queue_max_wait_time) == 0) { $msg .= "Please provide: Max Wait Time
\n"; } + //if (strlen($queue_max_wait_time_with_no_agent) == 0) { $msg .= "Please provide: Max Wait Time with no Agent
\n"; } + //if (strlen($queue_tier_rules_apply) == 0) { $msg .= "Please provide: Tier Rules Apply
\n"; } + //if (strlen($queue_tier_rule_wait_second) == 0) { $msg .= "Please provide: Tier Rule Wait Second
\n"; } + //if (strlen($queue_tier_rule_wait_multiply_level) == 0) { $msg .= "Please provide: Tier Rule Wait Multiply Level
\n"; } + //if (strlen($queue_tier_rule_no_agent_no_wait) == 0) { $msg .= "Please provide: Tier Rule No Agent No Wait
\n"; } + //if (strlen($queue_timeout_action) == 0) { $msg .= "Please provide: Timeout Action
\n"; } + //if (strlen($queue_discard_abandoned_after) == 0) { $msg .= "Please provide: Discard Abandoned After
\n"; } + //if (strlen($queue_abandoned_resume_allowed) == 0) { $msg .= "Please provide: Abandoned Resume Allowed
\n"; } + //if (strlen($queue_cid_prefix) == 0) { $msg .= "Please provide: Caller ID Prefix
\n"; } + //if (strlen($queue_description) == 0) { $msg .= "Please provide: Description
\n"; } + if (strlen($msg) > 0 && strlen($_POST["persistformvar"]) == 0) { + require_once "includes/header.php"; + require_once "includes/persistformvar.php"; + echo "
\n"; + echo "
\n"; + echo $msg."
"; + echo "
\n"; + persistformvar($_POST); + echo "
\n"; + require_once "includes/footer.php"; + return; + } + + //add or update the database + if ($_POST["persistformvar"] != "true") { + if ($action == "add") { + //add the call center queue + $call_center_queue_uuid = uuid(); + $sql = "insert into v_call_center_queues "; + $sql .= "("; + $sql .= "domain_uuid, "; + $sql .= "call_center_queue_uuid, "; + $sql .= "queue_name, "; + $sql .= "queue_extension, "; + $sql .= "queue_strategy, "; + $sql .= "queue_moh_sound, "; + $sql .= "queue_record_template, "; + $sql .= "queue_time_base_score, "; + $sql .= "queue_max_wait_time, "; + $sql .= "queue_max_wait_time_with_no_agent, "; + $sql .= "queue_tier_rules_apply, "; + $sql .= "queue_tier_rule_wait_second, "; + $sql .= "queue_tier_rule_wait_multiply_level, "; + $sql .= "queue_tier_rule_no_agent_no_wait, "; + $sql .= "queue_timeout_action, "; + $sql .= "queue_discard_abandoned_after, "; + $sql .= "queue_abandoned_resume_allowed, "; + $sql .= "queue_cid_prefix, "; + $sql .= "queue_description "; + $sql .= ")"; + $sql .= "values "; + $sql .= "("; + $sql .= "'$domain_uuid', "; + $sql .= "'$call_center_queue_uuid', "; + $sql .= "'$queue_name', "; + $sql .= "'$queue_extension', "; + $sql .= "'$queue_strategy', "; + $sql .= "'$queue_moh_sound', "; + $sql .= "'$queue_record_template', "; + $sql .= "'$queue_time_base_score', "; + $sql .= "'$queue_max_wait_time', "; + $sql .= "'$queue_max_wait_time_with_no_agent', "; + $sql .= "'$queue_tier_rules_apply', "; + $sql .= "'$queue_tier_rule_wait_second', "; + $sql .= "'$queue_tier_rule_wait_multiply_level', "; + $sql .= "'$queue_tier_rule_no_agent_no_wait', "; + $sql .= "'$queue_timeout_action', "; + $sql .= "'$queue_discard_abandoned_after', "; + $sql .= "'$queue_abandoned_resume_allowed', "; + $sql .= "'$queue_cid_prefix', "; + $sql .= "'$queue_description' "; + $sql .= ")"; + $db->exec(check_sql($sql)); + unset($sql); + + //syncrhonize the configuration + save_call_center_xml(); + + //redirect the user + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Add Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + } //if ($action == "add") + + if ($action == "update") { + //update the call center queue + $sql = "update v_call_center_queues set "; + $sql .= "queue_name = '$queue_name', "; + $sql .= "queue_extension = '$queue_extension', "; + $sql .= "queue_strategy = '$queue_strategy', "; + $sql .= "queue_moh_sound = '$queue_moh_sound', "; + $sql .= "queue_record_template = '$queue_record_template', "; + $sql .= "queue_time_base_score = '$queue_time_base_score', "; + $sql .= "queue_max_wait_time = '$queue_max_wait_time', "; + $sql .= "queue_max_wait_time_with_no_agent = '$queue_max_wait_time_with_no_agent', "; + $sql .= "queue_tier_rules_apply = '$queue_tier_rules_apply', "; + $sql .= "queue_tier_rule_wait_second = '$queue_tier_rule_wait_second', "; + $sql .= "queue_tier_rule_wait_multiply_level = '$queue_tier_rule_wait_multiply_level', "; + $sql .= "queue_tier_rule_no_agent_no_wait = '$queue_tier_rule_no_agent_no_wait', "; + $sql .= "queue_timeout_action = '$queue_timeout_action', "; + $sql .= "queue_discard_abandoned_after = '$queue_discard_abandoned_after', "; + $sql .= "queue_abandoned_resume_allowed = '$queue_abandoned_resume_allowed', "; + $sql .= "queue_cid_prefix = '$queue_cid_prefix', "; + $sql .= "queue_description = '$queue_description' "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and call_center_queue_uuid = '$call_center_queue_uuid'"; + $db->exec(check_sql($sql)); + unset($sql); + + //syncrhonize the configuration + save_call_center_xml(); + + //redirect the user + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Update Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + } //if ($action == "update") + } //if ($_POST["persistformvar"] != "true") +} //(count($_POST)>0 && strlen($_POST["persistformvar"]) == 0) + +//pre-populate the form + if (count($_GET)>0 && $_POST["persistformvar"] != "true") { + $call_center_queue_uuid = $_GET["id"]; + $sql = ""; + $sql .= "select * from v_call_center_queues "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and call_center_queue_uuid = '$call_center_queue_uuid' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach ($result as &$row) { + $queue_name = $row["queue_name"]; + $queue_extension = $row["queue_extension"]; + $queue_strategy = $row["queue_strategy"]; + $queue_moh_sound = $row["queue_moh_sound"]; + $queue_record_template = $row["queue_record_template"]; + $queue_time_base_score = $row["queue_time_base_score"]; + $queue_max_wait_time = $row["queue_max_wait_time"]; + $queue_max_wait_time_with_no_agent = $row["queue_max_wait_time_with_no_agent"]; + $queue_timeout_action = $row["queue_timeout_action"]; + $queue_tier_rules_apply = $row["queue_tier_rules_apply"]; + $queue_tier_rule_wait_second = $row["queue_tier_rule_wait_second"]; + $queue_tier_rule_wait_multiply_level = $row["queue_tier_rule_wait_multiply_level"]; + $queue_tier_rule_no_agent_no_wait = $row["queue_tier_rule_no_agent_no_wait"]; + $queue_discard_abandoned_after = $row["queue_discard_abandoned_after"]; + $queue_abandoned_resume_allowed = $row["queue_abandoned_resume_allowed"]; + $queue_cid_prefix = $row["queue_cid_prefix"]; + $queue_description = $row["queue_description"]; + break; //limit to 1 row + } + unset ($prep_statement); + } + +//set default values + if (strlen($queue_strategy) == 0) { $queue_strategy = "longest-idle-agent"; } + if (strlen($queue_moh_sound) == 0) { $queue_moh_sound = "\$\${hold_music}"; } + if (strlen($queue_time_base_score) == 0) { $queue_time_base_score = "system"; } + if (strlen($queue_max_wait_time) == 0) { $queue_max_wait_time = "0"; } + if (strlen($queue_max_wait_time_with_no_agent) == 0) { $queue_max_wait_time_with_no_agent = "0"; } + if (strlen($queue_tier_rules_apply) == 0) { $queue_tier_rules_apply = "false"; } + if (strlen($queue_tier_rule_wait_second) == 0) { $queue_tier_rule_wait_second = "300"; } + if (strlen($queue_tier_rule_wait_multiply_level) == 0) { $queue_tier_rule_wait_multiply_level = "true"; } + if (strlen($queue_tier_rule_no_agent_no_wait) == 0) { $queue_tier_rule_no_agent_no_wait = "false"; } + if (strlen($queue_discard_abandoned_after) == 0) { $queue_discard_abandoned_after = "60"; } + if (strlen($queue_abandoned_resume_allowed) == 0) { $queue_abandoned_resume_allowed = "false"; } + +//show the header + require_once "includes/header.php"; + +//show the content + echo "
"; + echo "\n"; + echo "\n"; + echo " "; + echo " "; + echo "
\n"; + echo "
"; + + echo "
\n"; + echo "
\n"; + echo "\n"; + echo "\n"; + if ($action == "add") { + echo "\n"; + } + if ($action == "update") { + echo "\n"; + } + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo " \n"; + echo " \n"; + echo " "; + echo "
Call Center Queue AddCall Center Queue Edit\n"; + if ($action == "update") { + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + } + echo " \n"; + echo "
\n"; + //echo "Call Center queue settings.

\n"; + echo "
\n"; + echo " Queue Name:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the queue name.\n"; + echo "
\n"; + echo " Extension:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the extension number.\n"; + echo "
\n"; + echo " Strategy:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the queue strategy.\n"; + echo "
\n"; + echo " Music on Hold:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the music on hold information.\n"; + echo "
\n"; + echo " Record Template:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter a record template. \$\${base_dir}/recordings/archive/\${strftime(%Y)}/\${strftime(%b)}/\${strftime(%d)}/\${uuid}.wav\n"; + echo "
\n"; + echo " Time Base Score:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the time base score.\n"; + echo "
\n"; + echo " Max Wait Time:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the max wait time.\n"; + echo "
\n"; + echo " Max Wait Time with no Agent:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the max wait time with no agent.\n"; + echo "
\n"; + echo " Timeout Action:\n"; + echo "\n"; + //switch_select_destination(select_type, select_label, select_name, select_value, select_style, action); + switch_select_destination("dialplan", "", "queue_timeout_action", $queue_timeout_action, "", ""); + echo "
\n"; + echo "Set the action to perform when the max wait time is reached.\n"; + echo "
\n"; + echo " Tier Rules Apply:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Set the tier rule rules apply to true or false.\n"; + echo "
\n"; + echo " Tier Rule Wait Second:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the tier rule wait seconds.\n"; + echo "
\n"; + echo " Tier Rule Wait Multiply Level:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Set the tier rule wait multiply level to true or false.\n"; + echo "
\n"; + echo " Tier Rule No Agent No Wait:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the tier rule no agent no wait.\n"; + echo "
\n"; + echo " Discard Abandoned After:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Set the discard abandoned after seconds.\n"; + echo "
\n"; + echo " Abandoned Resume Allowed:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Set the abandoned resume allowed to true or false.\n"; + echo "
\n"; + echo " CID Prefix:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Set a prefix on the caller ID name.\n"; + echo "
\n"; + echo " Description:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the description.\n"; + echo "
\n"; + if ($action == "update") { + echo " \n"; + } + echo " \n"; + echo "
"; + echo ""; + + echo "
"; + echo "
"; + + +require_once "includes/footer.php"; +?> diff --git a/app/call_center/v_call_center_tier.php b/app/call_center/v_call_center_tier.php new file mode 100644 index 0000000000..a9bc27c086 --- /dev/null +++ b/app/call_center/v_call_center_tier.php @@ -0,0 +1,177 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require_once "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('call_center_tiers_view')) { + //access granted +} +else { + echo "access denied"; + exit; +} +require_once "includes/header.php"; +require_once "includes/paging.php"; + +//get http variables and set as php variables + $order_by = $_GET["order_by"]; + $order = $_GET["order"]; + +//show the content + echo "
"; + echo "\n"; + echo "\n"; + echo " "; + echo ""; + echo "
\n"; + echo "
"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "
Call Center Tier List\n"; + echo " \n"; + echo "
\n"; + echo "List all tiers. Tiers assign agents to queues.

\n"; + echo "
\n"; + + $sql = ""; + $sql .= "select * from v_call_center_tiers "; + $sql .= "where domain_uuid = '$domain_uuid' "; + if (strlen($order_by) == 0) { + $order_by = 'queue_name'; + $order = 'asc'; + } + else { + $sql .= "order by $order_by $order "; + } + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + $num_rows = count($result); + unset ($prep_statement, $result, $sql); + $rows_per_page = 100; + $param = ""; + $page = $_GET['page']; + if (strlen($page) == 0) { $page = 0; $_GET['page'] = 0; } + list($paging_controls, $rows_per_page, $var_3) = paging($num_rows, $param, $rows_per_page); + $offset = $rows_per_page * $page; + + $sql = ""; + $sql .= "select * from v_call_center_tiers "; + $sql .= "where domain_uuid = '$domain_uuid' "; + if (strlen($order_by) == 0) { + $order_by = 'queue_name'; + $order = 'asc'; + } + else { + $sql .= "order by $order_by $order "; + } + $sql .= " limit $rows_per_page offset $offset "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + $result_count = count($result); + unset ($prep_statement, $sql); + + $c = 0; + $row_style["0"] = "row_style0"; + $row_style["1"] = "row_style1"; + + echo "
\n"; + echo "\n"; + + echo "\n"; + echo th_order_by('agent_name', 'Agent Name', $order_by, $order); + echo th_order_by('queue_name', 'Queue Name', $order_by, $order); + echo th_order_by('tier_level', 'Tier Level', $order_by, $order); + echo th_order_by('tier_position', 'Tier Position', $order_by, $order); + echo "\n"; + echo "\n"; + + if ($result_count == 0) { //no results + } + else { //received results + foreach($result as $row) { + echo "\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "\n"; + if ($c==0) { $c=1; } else { $c=0; } + } //end foreach + unset($sql, $result, $row_count); + } //end if results + + + echo "\n"; + echo "\n"; + echo "\n"; + + + echo "
\n"; + if (permission_exists('call_center_tiers_add')) { + echo " $v_link_label_add\n"; + } + echo "
".$row[agent_name]." ".$row[queue_name]." ".$row[tier_level]." ".$row[tier_position]." \n"; + if (permission_exists('call_center_tiers_edit')) { + echo " $v_link_label_edit\n"; + } + if (permission_exists('call_center_tiers_delete')) { + echo " $v_link_label_delete\n"; + } + echo "
\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "
 $paging_controls\n"; + if (permission_exists('call_center_tiers_add')) { + echo " $v_link_label_add\n"; + } + echo "
\n"; + echo "
"; + echo "
"; + echo "

"; + echo "

"; + + + echo "
"; + echo "
"; + echo "

"; + +//show the footer + require_once "includes/footer.php"; +?> diff --git a/app/call_center/v_call_center_tier_delete.php b/app/call_center/v_call_center_tier_delete.php new file mode 100644 index 0000000000..246fee9af2 --- /dev/null +++ b/app/call_center/v_call_center_tier_delete.php @@ -0,0 +1,89 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require_once "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('call_center_tiers_delete')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +//get the id + if (count($_GET)>0) { + $id = check_str($_GET["id"]); + } + +//get the agent details + $sql = ""; + $sql .= "select * from v_call_center_tiers "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and call_center_tier_uuid = '$id' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach ($result as &$row) { + $agent_name = $row["agent_name"]; + $queue_name = $row["queue_name"]; + break; //limit to 1 row + } + unset ($prep_statement); + +//delete the agent from the freeswitch + //get the domain using the $domain_uuid + $tmp_domain = $_SESSION['domains'][$domain_uuid]['domain_name']; + //setup the event socket connection + $fp = event_socket_create($_SESSION['event_socket_ip_address'], $_SESSION['event_socket_port'], $_SESSION['event_socket_password']); + //delete the agent over event socket + if ($fp) { + //callcenter_config tier del [queue_name] [agent_name] + $cmd = "api callcenter_config tier del ".$queue_name."@".$tmp_domain." ".$agent_name."@".$_SESSION['domains'][$domain_uuid]['domain_name']; + $response = event_socket_request($fp, $cmd); + } + +//delete the tier from the database + if (strlen($id)>0) { + $sql = ""; + $sql .= "delete from v_call_center_tiers "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and call_center_tier_uuid = '$id' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + unset($sql); + } + +//redirect the user + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Delete Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + +?> diff --git a/app/call_center/v_call_center_tier_edit.php b/app/call_center/v_call_center_tier_edit.php new file mode 100644 index 0000000000..731a88eaef --- /dev/null +++ b/app/call_center/v_call_center_tier_edit.php @@ -0,0 +1,437 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require_once "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('call_center_tiers_add') || permission_exists('call_center_tiers_edit')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +//action add or update + if (isset($_REQUEST["id"])) { + $action = "update"; + $call_center_tier_uuid = check_str($_REQUEST["id"]); + } + else { + $action = "add"; + } + +//get http post variables and set them to php variables + if (count($_POST)>0) { + $agent_name = check_str($_POST["agent_name"]); + $queue_name = check_str($_POST["queue_name"]); + $tier_level = check_str($_POST["tier_level"]); + $tier_position = check_str($_POST["tier_position"]); + } + +if (count($_POST)>0 && strlen($_POST["persistformvar"]) == 0) { + + $msg = ''; + if ($action == "update") { + $call_center_tier_uuid = check_str($_POST["call_center_tier_uuid"]); + } + + //check for all required data + //if (strlen($domain_uuid) == 0) { $msg .= "Please provide: domain_uuid
\n"; } + //if (strlen($agent_name) == 0) { $msg .= "Please provide: Agent Name
\n"; } + //if (strlen($queue_name) == 0) { $msg .= "Please provide: Queue Name
\n"; } + //if (strlen($tier_level) == 0) { $msg .= "Please provide: Tier Level
\n"; } + //if (strlen($tier_position) == 0) { $msg .= "Please provide: Tier Position
\n"; } + if (strlen($msg) > 0 && strlen($_POST["persistformvar"]) == 0) { + require_once "includes/header.php"; + require_once "includes/persistformvar.php"; + echo "
\n"; + echo "
\n"; + echo $msg."
"; + echo "
\n"; + persistformvar($_POST); + echo "
\n"; + require_once "includes/footer.php"; + return; + } + + //add the agent + //setup the event socket connection + $fp = event_socket_create($_SESSION['event_socket_ip_address'], $_SESSION['event_socket_port'], $_SESSION['event_socket_password']); + //add the agent using event socket + if ($fp) { + //get the domain using the $domain_uuid + $tmp_domain = $_SESSION['domains'][$domain_uuid]['domain_name']; + //syntax + //callcenter_config tier add [queue_name] [agent_name] [level] [position] + //callcenter_config tier set state [queue_name] [agent_name] [state] + //callcenter_config tier set level [queue_name] [agent_name] [level] + //callcenter_config tier set position [queue_name] [agent_name] [position] + //add the agent + $cmd = "api callcenter_config tier add ".$queue_name."@".$tmp_domain." ".$agent_name."@".$tmp_domain." ".$tier_level." ".$tier_position; + $response = event_socket_request($fp, $cmd); + usleep(200); + //agent set level + $cmd = "api callcenter_config tier set level ".$queue_name."@".$tmp_domain." ".$agent_name."@".$tmp_domain." ".$tier_level; + $response = event_socket_request($fp, $cmd); + usleep(200); + //agent set position + $cmd = "api callcenter_config tier set position ".$queue_name."@".$tmp_domain." ".$agent_name."@".$tmp_domain." ".$tier_position; + $response = event_socket_request($fp, $cmd); + usleep(200); + } + + //add or update the database + if ($_POST["persistformvar"] != "true") { + if ($action == "add") { + $call_center_tier_uuid = uuid(); + $sql = "insert into v_call_center_tiers "; + $sql .= "("; + $sql .= "domain_uuid, "; + $sql .= "call_center_tier_uuid, "; + $sql .= "agent_name, "; + $sql .= "queue_name, "; + $sql .= "tier_level, "; + $sql .= "tier_position "; + $sql .= ")"; + $sql .= "values "; + $sql .= "("; + $sql .= "'$domain_uuid', "; + $sql .= "'$call_center_tier_uuid', "; + $sql .= "'$agent_name', "; + $sql .= "'$queue_name', "; + $sql .= "'$tier_level', "; + $sql .= "'$tier_position' "; + $sql .= ")"; + $db->exec(check_sql($sql)); + unset($sql); + + //syncrhonize configuration + save_call_center_xml(); + + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Add Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + } //if ($action == "add") + + if ($action == "update") { + $sql = "update v_call_center_tiers set "; + $sql .= "domain_uuid = '$domain_uuid', "; + $sql .= "agent_name = '$agent_name', "; + $sql .= "queue_name = '$queue_name', "; + $sql .= "tier_level = '$tier_level', "; + $sql .= "tier_position = '$tier_position' "; + $sql .= "where call_center_tier_uuid = '$call_center_tier_uuid'"; + $db->exec(check_sql($sql)); + unset($sql); + + //syncrhonize configuration + save_call_center_xml(); + + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Update Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + } //if ($action == "update") + } //if ($_POST["persistformvar"] != "true") +} //(count($_POST)>0 && strlen($_POST["persistformvar"]) == 0) + +//pre-populate the form + if (count($_GET)>0 && $_POST["persistformvar"] != "true") { + $call_center_tier_uuid = $_GET["id"]; + $sql = ""; + $sql .= "select * from v_call_center_tiers "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and call_center_tier_uuid = '$call_center_tier_uuid' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach ($result as &$row) { + $agent_name = $row["agent_name"]; + $queue_name = $row["queue_name"]; + $tier_level = $row["tier_level"]; + $tier_position = $row["tier_position"]; + break; //limit to 1 row + } + unset ($prep_statement); + } + + +//show the header + require_once "includes/header.php"; + +//show the content + echo "
"; + echo "\n"; + + echo "\n"; + echo " "; + echo " "; + echo "
\n"; + echo "
"; + + echo "
\n"; + echo "
\n"; + echo "\n"; + echo "\n"; + if ($action == "add") { + echo "\n"; + } + if ($action == "update") { + echo "\n"; + } + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo " \n"; + echo " \n"; + echo " "; + echo "
Call Center Tier AddCall Center Tier Edit
\n"; + echo "List all tiers. Tiers assign agents to queues.

\n"; + echo "
\n"; + echo " Agent Name:\n"; + echo "\n"; + + //---- Begin Select List -------------------- + $sql = "SELECT * FROM v_users "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "order by username asc "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + + echo ""; + unset($sql, $result); + //---- End Select List -------------------- + + echo "
\n"; + echo "Select the agent name.\n"; + echo "
\n"; + echo " Queue Name:\n"; + echo "\n"; + + //---- Begin Select List -------------------- + $sql = "SELECT * FROM v_call_center_queues "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "order by queue_name asc "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + + echo ""; + unset($sql, $result); + //---- End Select List -------------------- + + echo "
\n"; + echo "Select the queue name.\n"; + echo "
\n"; + echo " Tier Level:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Select the tier level.\n"; + echo "
\n"; + echo " Tier Position:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Select the tier position.\n"; + echo "
\n"; + if ($action == "update") { + echo " \n"; + } + echo " \n"; + echo "
"; + echo ""; + + echo "
"; + echo "
"; + + +require_once "includes/footer.php"; +?> diff --git a/app/call_center/v_cmd.php b/app/call_center/v_cmd.php new file mode 100644 index 0000000000..08cf654fb8 --- /dev/null +++ b/app/call_center/v_cmd.php @@ -0,0 +1,57 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('call_center_queues_add') || permission_exists('call_center_queues_edit')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +$cmd = $_GET['cmd']; +$rdr = $_GET['rdr']; + +//connect to event socket +$fp = event_socket_create($_SESSION['event_socket_ip_address'], $_SESSION['event_socket_port'], $_SESSION['event_socket_password']); +if ($fp) { + $response = event_socket_request($fp, 'api reloadxml'); + $response = event_socket_request($fp, $cmd); + fclose($fp); +} +else { + $response = ''; +} +if ($rdr == "false") { + //redirect false + echo $response; +} +else { + header("Location: v_call_center_queue.php?savemsg=".urlencode($response)); +} +?> \ No newline at end of file diff --git a/app/call_center_active/app_config.php b/app/call_center_active/app_config.php new file mode 100644 index 0000000000..6689d095c2 --- /dev/null +++ b/app/call_center_active/app_config.php @@ -0,0 +1,26 @@ + \ No newline at end of file diff --git a/app/call_center_active/root.php b/app/call_center_active/root.php new file mode 100644 index 0000000000..7b882438ea --- /dev/null +++ b/app/call_center_active/root.php @@ -0,0 +1,50 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ + +// make sure the PATH_SEPARATOR is defined + if (!defined("PATH_SEPARATOR")) { + if ( strpos( $_ENV[ "OS" ], "Win" ) !== false ) { define("PATH_SEPARATOR", ";"); } else { define("PATH_SEPARATOR", ":"); } + } + +// make sure the document_root is set + $_SERVER["SCRIPT_FILENAME"] = str_replace("\\", "/", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = str_replace($_SERVER["PHP_SELF"], "", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = realpath($_SERVER["DOCUMENT_ROOT"]); + //echo "DOCUMENT_ROOT: ".$_SERVER["DOCUMENT_ROOT"]."
\n"; + //echo "PHP_SELF: ".$_SERVER["PHP_SELF"]."
\n"; + //echo "SCRIPT_FILENAME: ".$_SERVER["SCRIPT_FILENAME"]."
\n"; + +// if the project directory exists then add it to the include path otherwise add the document root to the include path + if (is_dir($_SERVER["DOCUMENT_ROOT"].'/fusionpbx')){ + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', '/fusionpbx'); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER["DOCUMENT_ROOT"].'/fusionpbx' ); + } + else { + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', ''); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER['DOCUMENT_ROOT'] ); + } + +?> \ No newline at end of file diff --git a/app/call_center_active/v_call_center_active.php b/app/call_center_active/v_call_center_active.php new file mode 100644 index 0000000000..63946f2bfc --- /dev/null +++ b/app/call_center_active/v_call_center_active.php @@ -0,0 +1,122 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('call_center_active_view')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +//get the queue_name and set it as a variable + $queue_name = $_GET[queue_name]; + +//get the header + require_once "includes/header.php"; +?> + +"; +echo "\n"; +echo "\n"; +echo " "; +echo " "; +echo "
\n"; + +echo "
\n"; +echo "
\n"; + +echo "
"; +echo ""; + +require_once "includes/footer.php"; +?> diff --git a/app/call_center_active/v_call_center_active_inc.php b/app/call_center_active/v_call_center_active_inc.php new file mode 100644 index 0000000000..4d19b3e2d6 --- /dev/null +++ b/app/call_center_active/v_call_center_active_inc.php @@ -0,0 +1,302 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('call_center_active_view')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +//get the queue_name and set it as a variable + $queue_name = $_GET[queue_name].'@'. $_SESSION['domains'][$domain_uuid]['domain_name']; + +//convert the string to a named array + function str_to_named_array($tmp_str, $tmp_delimiter) { + $tmp_array = explode ("\n", $tmp_str); + $result = ''; + if (trim(strtoupper($tmp_array[0])) != "+OK") { + $tmp_field_name_array = explode ($tmp_delimiter, $tmp_array[0]); + $x = 0; + foreach ($tmp_array as $row) { + if ($x > 0) { + $tmp_field_value_array = explode ($tmp_delimiter, $tmp_array[$x]); + $y = 0; + foreach ($tmp_field_value_array as $tmp_value) { + $tmp_name = $tmp_field_name_array[$y]; + if (trim(strtoupper($tmp_value)) != "+OK") { + $result[$x][$tmp_name] = $tmp_value; + } + $y++; + } + } + $x++; + } + unset($row); + } + return $result; + } + +//alternate the color of the row + $c = 0; + $row_style["0"] = "row_style0"; + $row_style["1"] = "row_style1"; + +//create an event socket connection + $fp = event_socket_create($_SESSION['event_socket_ip_address'], $_SESSION['event_socket_port'], $_SESSION['event_socket_password']); + +//get the call center queue, agent and tiers list + if (!$fp) { + $msg = "
Connection to Event Socket failed.
"; + echo "
\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "
Message
$msg
\n"; + echo "
\n"; + } + else { + //get the queue list + //send the event socket command and get the response + //callcenter_config queue list members [queue_name] + $switch_cmd = 'callcenter_config queue list members '.$queue_name; + $event_socket_str = trim(event_socket_request($fp, 'api '.$switch_cmd)); + $result = str_to_named_array($event_socket_str, '|'); + + //show the title + echo "\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "
".ucfirst($_GET[queue_name])." Queue
\n"; + echo " Shows a list of callers in the queue.
\n"; + echo "
\n"; + echo "
\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + //echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + if (if_group("admin") || if_group("superadmin")) { + echo "\n"; + } + echo "\n"; + + foreach ($result as $row) { + $switch_cmd = 'uuid_exists '.$row['session_uuid']; + if (trim(event_socket_request($fp, 'api '.$switch_cmd)) == "true") { + $queue = $row['queue']; + $system = $row['system']; + $uuid = $row['uuid']; + $session_uuid = $row['session_uuid']; + $caller_number = $row['caller_number']; + $caller_name = $row['caller_name']; + $system_epoch = $row['system_epoch']; + $joined_epoch = $row['joined_epoch']; + $rejoined_epoch = $row['rejoined_epoch']; + $bridge_epoch = $row['bridge_epoch']; + $abandoned_epoch = $row['abandoned_epoch']; + $base_score = $row['base_score']; + $skill_score = $row['skill_score']; + $serving_agent = $row['serving_agent']; + $serving_system = $row['serving_system']; + $state = $row['state']; + + $joined_seconds = time() - $joined_epoch; + $joined_length_hour = floor($joined_seconds/3600); + $joined_length_min = floor($joined_seconds/60 - ($joined_length_hour * 60)); + $joined_length_sec = $joined_seconds - (($joined_length_hour * 3600) + ($joined_length_min * 60)); + $joined_length_min = sprintf("%02d", $joined_length_min); + $joined_length_sec = sprintf("%02d", $joined_length_sec); + $joined_length = $joined_length_hour.':'.$joined_length_min.':'.$joined_length_sec; + + //$system_seconds = time() - $system_epoch; + //$system_length_hour = floor($system_seconds/3600); + //$system_length_min = floor($system_seconds/60 - ($system_length_hour * 60)); + //$system_length_sec = $system_seconds - (($system_length_hour * 3600) + ($system_length_min * 60)); + //$system_length_min = sprintf("%02d", $system_length_min); + //$system_length_sec = sprintf("%02d", $system_length_sec); + //$system_length = $system_length_hour.':'.$system_length_min.':'.$system_length_sec; + + echo "\n"; + echo "\n"; + //echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + if (if_group("admin") || if_group("superadmin")) { + echo ""; + } + echo "\n"; + if ($c==0) { $c=1; } else { $c=0; } + } //end if uuid_exists + } + echo "
TimeSystemNameNumberStatusOptions
".$joined_length."".$system_length."".$caller_name." ".$caller_number." ".$state.""; + echo " eavesdrop \n"; + echo "
\n"; + + //add vertical spacing + echo "
\n"; + echo "
\n"; + echo "
\n"; + + //get the agent list + + //show the title + echo "\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "
Agents
\n"; + echo " List all the agents.
\n"; + echo "
\n"; + echo "
\n"; + + //send the event socket command and get the response + //callcenter_config queue list tiers [queue_name] | + $switch_cmd = 'callcenter_config queue list tiers '.$queue_name; + $event_socket_str = trim(event_socket_request($fp, 'api '.$switch_cmd)); + $result = str_to_named_array($event_socket_str, '|'); + + //prepare the result for array_multisort + $x = 0; + foreach ($result as $row) { + $tier_result[$x]['level'] = $row['level']; + $tier_result[$x]['position'] = $row['position']; + $tier_result[$x]['agent'] = $row['agent']; + $tier_result[$x]['state'] = trim($row['state']); + $tier_result[$x]['queue'] = $row['queue']; + $x++; + } + + //sort the array //SORT_ASC, SORT_DESC, SORT_REGULAR, SORT_NUMERIC, SORT_STRING + array_multisort($tier_result, SORT_ASC); + + //send the event socket command and get the response + //callcenter_config queue list agents [queue_name] [status] | + $switch_cmd = 'callcenter_config queue list agents '.$queue_name; + $event_socket_str = trim(event_socket_request($fp, 'api '.$switch_cmd)); + $agent_result = str_to_named_array($event_socket_str, '|'); + + //list the agents + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + //echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + foreach ($tier_result as $tier_row) { + //$queue = $tier_row['queue']; + //$queue = str_replace('@'.$_SESSION['domain_name'], '', $queue); + $agent = $tier_row['agent']; + //$agent = str_replace('@'.$_SESSION['domain_name'], '', $agent); + $tier_state = $tier_row['state']; + $tier_level = $tier_row['level']; + $tier_position = $tier_row['position']; + + foreach ($agent_result as $agent_row) { + if ($tier_row['agent'] == $agent_row['name']) { + $name = $agent_row['name']; + $name = str_replace('@'.$_SESSION['domain_name'], '', $name); + //$system = $agent_row['system']; + //$uuid = $agent_row['uuid']; + //$type = $agent_row['type']; + $contact = $agent_row['contact']; + $status = $agent_row['status']; + $state = $agent_row['state']; + $max_no_answer = $agent_row['max_no_answer']; + $wrap_up_time = $agent_row['wrap_up_time']; + $reject_delay_time = $agent_row['reject_delay_time']; + $busy_delay_time = $agent_row['busy_delay_time']; + $last_bridge_start = $agent_row['last_bridge_start']; + $last_bridge_end = $agent_row['last_bridge_end']; + //$last_offered_call = $agent_row['last_offered_call']; + $last_status_change = $agent_row['last_status_change']; + $no_answer_count = $agent_row['no_answer_count']; + $calls_answered = $agent_row['calls_answered']; + $talk_time = $agent_row['talk_time']; + $ready_time = $agent_row['ready_time']; + + $last_offered_call_seconds = time() - $last_offered_call; + $last_offered_call_length_hour = floor($last_offered_call_seconds/3600); + $last_offered_call_length_min = floor($last_offered_call_seconds/60 - ($last_offered_call_length_hour * 60)); + $last_offered_call_length_sec = $last_offered_call_seconds - (($last_offered_call_length_hour * 3600) + ($last_offered_call_length_min * 60)); + $last_offered_call_length_min = sprintf("%02d", $last_offered_call_length_min); + $last_offered_call_length_sec = sprintf("%02d", $last_offered_call_length_sec); + $last_offered_call_length = $last_offered_call_length_hour.':'.$last_offered_call_length_min.':'.$last_offered_call_length_sec; + + $last_status_change_seconds = time() - $last_status_change; + $last_status_change_length_hour = floor($last_status_change_seconds/3600); + $last_status_change_length_min = floor($last_status_change_seconds/60 - ($last_status_change_length_hour * 60)); + $last_status_change_length_sec = $last_status_change_seconds - (($last_status_change_length_hour * 3600) + ($last_status_change_length_min * 60)); + $last_status_change_length_min = sprintf("%02d", $last_status_change_length_min); + $last_status_change_length_sec = sprintf("%02d", $last_status_change_length_sec); + $last_status_change_length = $last_status_change_length_hour.':'.$last_status_change_length_min.':'.$last_status_change_length_sec; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + //echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + } + } + echo "\n"; + + if ($c==0) { $c=1; } else { $c=0; } + } + echo "
NameContactStatusStateOffered CallStatus ChangeMissedAnsweredTier StateTier LevelTier Position
".$name."".$contact."".$status."".$state."".$last_offered_call_length."".$last_status_change_length."".$no_answer_count."".$calls_answered."".$tier_state."".$tier_level."".$tier_position."
\n"; + + //add vertical spacing + echo "
\n"; + echo "
\n"; + echo "
\n"; + } +?> \ No newline at end of file diff --git a/app/call_center_active/v_call_center_exec.php b/app/call_center_active/v_call_center_exec.php new file mode 100644 index 0000000000..8ee480ce68 --- /dev/null +++ b/app/call_center_active/v_call_center_exec.php @@ -0,0 +1,96 @@ +0) { + $switch_cmd = trim($_GET["cmd"]); + $action = trim(check_str($_GET["action"])); + $data = trim(check_str($_GET["data"])); + $username = trim(check_str($_GET["username"])); + } + +//authorized commands + if (stristr($switch_cmd, 'user_status') == true) { + //authorized; + } elseif (stristr($switch_cmd, 'callcenter_config') == true) { + //authorized; + } elseif (stristr($switch_cmd, 'eavesdrop') == true) { + //authorized; + } else { + //not found. this command is not authorized + echo "access denied"; + exit; + } + +//set the username + if (if_group("admin") || if_group("superadmin")) { + //use the username that was provided + } + else { + $username = $_SESSION['username']; + } + +//get to php variables + if (count($_GET)>0) { + if ($action == "user_status") { + $user_status = $data; + $sql = "update v_users set "; + $sql .= "user_status = '".trim($user_status, "'")."' "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and username = '".$username."' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + } + + //fs cmd + if (strlen($switch_cmd) > 0) { + //setup the event socket connection + $fp = event_socket_create($_SESSION['event_socket_ip_address'], $_SESSION['event_socket_port'], $_SESSION['event_socket_password']); + //ensure the connection exists + if ($fp) { + //send the command + $switch_result = event_socket_request($fp, 'api '.$switch_cmd); + //set the user state + $cmd = "api callcenter_config agent set state ".$username."@".$_SESSION['domain_name']." Waiting"; + $response = event_socket_request($fp, $cmd); + } + } + } + +?> diff --git a/app/call_center_active/v_call_center_queue.php b/app/call_center_active/v_call_center_queue.php new file mode 100644 index 0000000000..16374189b9 --- /dev/null +++ b/app/call_center_active/v_call_center_queue.php @@ -0,0 +1,177 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require_once "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('call_center_active_view')) { + //access granted +} +else { + echo "access denied"; + exit; +} +require_once "includes/header.php"; +require_once "includes/paging.php"; + +$order_by = $_GET["order_by"]; +$order = $_GET["order"]; + +//show the content + echo "
"; + echo "\n"; + echo "\n"; + echo " "; + echo ""; + echo "
\n"; + echo "
"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "
Call Center Queue List\n"; + echo "
\n"; + echo "List of queues for the call center.

\n"; + echo "
\n"; + + $sql = ""; + $sql .= " select * from v_call_center_queues "; + $sql .= " where domain_uuid = '$domain_uuid' "; + if (strlen($order_by)> 0) { $sql .= "order by $order_by $order "; } + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + $num_rows = count($result); + unset ($prep_statement, $result, $sql); + $rows_per_page = 100; + $param = ""; + $page = $_GET['page']; + if (strlen($page) == 0) { $page = 0; $_GET['page'] = 0; } + list($paging_controls, $rows_per_page, $var_3) = paging($num_rows, $param, $rows_per_page); + $offset = $rows_per_page * $page; + + $sql = ""; + $sql .= " select * from v_call_center_queues "; + $sql .= " where domain_uuid = '$domain_uuid' "; + if (strlen($order_by)> 0) { $sql .= "order by $order_by $order "; } + $sql .= " limit $rows_per_page offset $offset "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + $result_count = count($result); + unset ($prep_statement, $sql); + + $c = 0; + $row_style["0"] = "row_style0"; + $row_style["1"] = "row_style1"; + + echo "
\n"; + echo "\n"; + + echo "\n"; + echo th_order_by('queue_name', 'Queue Name', $order_by, $order); + echo th_order_by('queue_extension', 'Extension', $order_by, $order); + echo th_order_by('queue_strategy', 'Strategy', $order_by, $order); + //echo th_order_by('queue_moh_sound', 'Music On Hold', $order_by, $order); + //echo th_order_by('queue_record_template', 'Record Template', $order_by, $order); + //echo th_order_by('queue_time_base_score', 'Time Base Score', $order_by, $order); + //echo th_order_by('queue_max_wait_time', 'Max Wait Time', $order_by, $order); + //echo th_order_by('queue_max_wait_time_with_no_agent', 'Max Wait Time With No Agent', $order_by, $order); + //echo th_order_by('queue_tier_rules_apply', 'Tier Rules Apply', $order_by, $order); + //echo th_order_by('queue_tier_rule_wait_second', 'Tier Rule Wait Second', $order_by, $order); + //echo th_order_by('queue_tier_rule_no_agent_no_wait', 'Tier Rule No Agent No Wait', $order_by, $order); + //echo th_order_by('queue_discard_abandoned_after', 'Discard Abandoned After', $order_by, $order); + //echo th_order_by('queue_abandoned_resume_allowed', 'Abandoned Resume Allowed', $order_by, $order); + //echo th_order_by('queue_tier_rule_wait_multiply_level', 'Tier Rule Wait Multiply Level', $order_by, $order); + echo th_order_by('queue_description', 'Description', $order_by, $order); + echo "\n"; + echo "\n"; + + if ($result_count == 0) { //no results + } + else { //received results + foreach($result as $row) { + echo "\n"; + echo " \n"; + echo " \n"; + echo " \n"; + //echo " \n"; + //echo " \n"; + //echo " \n"; + //echo " \n"; + //echo " \n"; + //echo " \n"; + //echo " \n"; + //echo " \n"; + //echo " \n"; + //echo " \n"; + //echo " \n"; + echo " \n"; + echo " \n"; + echo "\n"; + if ($c==0) { $c=1; } else { $c=0; } + } //end foreach + unset($sql, $result, $row_count); + } //end if results + + echo "\n"; + echo "\n"; + echo "\n"; + + echo "
\n"; + //echo " $v_link_label_add\n"; + echo "
".$row[queue_name]."".$row[queue_extension]."".$row[queue_strategy]."".$row[queue_moh_sound]."".$row[queue_record_template]."".$row[queue_time_base_score]."".$row[queue_max_wait_time]."".$row[queue_max_wait_time_with_no_agent]."".$row[queue_tier_rules_apply]."".$row[queue_tier_rule_wait_second]."".$row[queue_tier_rule_no_agent_no_wait]."".$row[queue_discard_abandoned_after]."".$row[queue_abandoned_resume_allowed]."".$row[queue_tier_rule_wait_multiply_level]."".$row[queue_description]." \n"; + echo " $v_link_label_edit\n"; + //echo " $v_link_label_delete\n"; + //echo " \n"; + //echo " \n"; + echo "
\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "
 $paging_controls\n"; + //echo " $v_link_label_add\n"; + echo "
\n"; + echo "
"; + echo "
"; + echo "

"; + echo "

"; + + echo "
"; + echo "
"; + echo "

"; + +//show the footer + require_once "includes/footer.php"; + +?> diff --git a/app/calls/app_config.php b/app/calls/app_config.php new file mode 100644 index 0000000000..734b4451d0 --- /dev/null +++ b/app/calls/app_config.php @@ -0,0 +1,37 @@ + \ No newline at end of file diff --git a/app/calls/root.php b/app/calls/root.php new file mode 100644 index 0000000000..7b882438ea --- /dev/null +++ b/app/calls/root.php @@ -0,0 +1,50 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ + +// make sure the PATH_SEPARATOR is defined + if (!defined("PATH_SEPARATOR")) { + if ( strpos( $_ENV[ "OS" ], "Win" ) !== false ) { define("PATH_SEPARATOR", ";"); } else { define("PATH_SEPARATOR", ":"); } + } + +// make sure the document_root is set + $_SERVER["SCRIPT_FILENAME"] = str_replace("\\", "/", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = str_replace($_SERVER["PHP_SELF"], "", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = realpath($_SERVER["DOCUMENT_ROOT"]); + //echo "DOCUMENT_ROOT: ".$_SERVER["DOCUMENT_ROOT"]."
\n"; + //echo "PHP_SELF: ".$_SERVER["PHP_SELF"]."
\n"; + //echo "SCRIPT_FILENAME: ".$_SERVER["SCRIPT_FILENAME"]."
\n"; + +// if the project directory exists then add it to the include path otherwise add the document root to the include path + if (is_dir($_SERVER["DOCUMENT_ROOT"].'/fusionpbx')){ + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', '/fusionpbx'); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER["DOCUMENT_ROOT"].'/fusionpbx' ); + } + else { + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', ''); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER['DOCUMENT_ROOT'] ); + } + +?> \ No newline at end of file diff --git a/app/calls/v_call_edit.php b/app/calls/v_call_edit.php new file mode 100644 index 0000000000..9bb526b7b4 --- /dev/null +++ b/app/calls/v_call_edit.php @@ -0,0 +1,751 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require_once "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('follow_me') || permission_exists('call_forward') || permission_exists('do_not_disturb')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +function destination_select($select_name, $select_value, $select_default) { + if (strlen($select_value) == 0) { $select_value = $select_default; } + echo " \n"; +} + +//get the extension_uuid + $extension_uuid = $_REQUEST["id"]; + +//get the extension number + $sql = ""; + $sql .= "select * from v_extensions "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and extension_uuid = '$extension_uuid' "; + if (!(if_group("admin") || if_group("superadmin"))) { + if (count($_SESSION['user']['extension']) > 0) { + $sql .= "and ("; + $x = 0; + foreach($_SESSION['user']['extension'] as $row) { + if ($x > 0) { $sql .= "or "; } + $sql .= "extension = '".$row['user']."' "; + $x++; + } + $sql .= ")"; + } + else { + //hide any results when a user has not been assigned an extension + $sql .= "and extension = 'disabled' "; + } + } + $sql .= "and enabled = 'true' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + if (count($result)== 0) { + echo "access denied"; + exit; + } + else { + foreach ($result as &$row) { + $extension = $row["extension"]; + $effective_caller_id_name = $row["effective_caller_id_name"]; + $effective_caller_id_number = $row["effective_caller_id_number"]; + $outbound_caller_id_name = $row["outbound_caller_id_name"]; + $outbound_caller_id_number = $row["outbound_caller_id_number"]; + $description = $row["description"]; + break; //limit to 1 row + } + } + unset ($prep_statement); + +if (count($_POST)>0 && strlen($_POST["persistformvar"]) == 0) { + + //get http post variables and set them to php variables + if (count($_POST)>0) { + $call_forward_enabled = check_str($_POST["call_forward_enabled"]); + $call_forward_number = check_str($_POST["call_forward_number"]); + $follow_me_enabled = check_str($_POST["follow_me_enabled"]); + $follow_me_type = check_str($_POST["follow_me_type"]); + $destination_data_1 = check_str($_POST["destination_data_1"]); + $destination_timeout_1 = check_str($_POST["destination_timeout_1"]); + $destination_data_2 = check_str($_POST["destination_data_2"]); + $destination_timeout_2 = check_str($_POST["destination_timeout_2"]); + $destination_data_3 = check_str($_POST["destination_data_3"]); + $destination_timeout_3 = check_str($_POST["destination_timeout_3"]); + $destination_data_4 = check_str($_POST["destination_data_4"]); + $destination_timeout_4 = check_str($_POST["destination_timeout_4"]); + $destination_data_5 = check_str($_POST["destination_data_5"]); + $destination_timeout_5 = check_str($_POST["destination_timeout_5"]); + $dnd_enabled = check_str($_POST["dnd_enabled"]); + $hunt_group_call_prompt = check_str($_POST["hunt_group_call_prompt"]); + + if (strlen($follow_me_type) == 0) { $follow_me_type = "follow_me_sequence"; } + + if (strlen($call_forward_number) > 0) { + $call_forward_number = preg_replace("~[^0-9]~", "",$call_forward_number); + } + if (strlen($destination_data_1) > 0) { + $destination_data_1 = preg_replace("~[^0-9]~", "",$destination_data_1); + } + if (strlen($destination_data_2) > 0) { + $destination_data_2 = preg_replace("~[^0-9]~", "",$destination_data_2); + } + if (strlen($destination_data_3) > 0) { + $destination_data_3 = preg_replace("~[^0-9]~", "",$destination_data_3); + } + if (strlen($destination_data_4) > 0) { + $destination_data_4 = preg_replace("~[^0-9]~", "",$destination_data_4); + } + if (strlen($destination_data_5) > 0) { + $destination_data_5 = preg_replace("~[^0-9]~", "",$destination_data_5); + } + + //set the default + if (strlen($hunt_group_call_prompt) == 0) { + $hunt_group_call_prompt = 'false'; + } + + //destination_1 + if (strlen($destination_data_1) > 0) { + if (extension_exists($destination_data_1)) { + $destination_type_1 = 'extension'; + } + else { + $destination_type_1 = 'sip uri'; + } + } + //destination_2 + if (extension_exists($destination_data_2)) { + $destination_type_2 = 'extension'; + } + else { + $destination_type_2 = 'sip uri'; + } + //destination_3 + if (extension_exists($destination_data_3)) { + $destination_type_3 = 'extension'; + } + else { + $destination_type_3 = 'sip uri'; + } + //destination_4 + if (extension_exists($destination_data_4)) { + $destination_type_4 = 'extension'; + } + else { + $destination_type_4 = 'sip uri'; + } + //destination_5 + if (extension_exists($destination_data_5)) { + $destination_type_5 = 'extension'; + } + else { + $destination_type_5 = 'sip uri'; + } + } + + //check for all required data + //if (strlen($call_forward_enabled) == 0) { $msg .= "Please provide: Call Forward
\n"; } + //if (strlen($call_forward_number) == 0) { $msg .= "Please provide: Number
\n"; } + //if (strlen($follow_me_enabled) == 0) { $msg .= "Please provide: Follow Me
\n"; } + //if (strlen($destination_data_1) == 0) { $msg .= "Please provide: 1st Number
\n"; } + //if (strlen($destination_timeout_1) == 0) { $msg .= "Please provide: sec
\n"; } + //if (strlen($destination_data_2) == 0) { $msg .= "Please provide: 2nd Number
\n"; } + //if (strlen($destination_timeout_2) == 0) { $msg .= "Please provide: sec
\n"; } + //if (strlen($destination_data_3) == 0) { $msg .= "Please provide: 3rd Number
\n"; } + //if (strlen($destination_timeout_3) == 0) { $msg .= "Please provide: sec
\n"; } + //if (strlen($destination_data_4) == 0) { $msg .= "Please provide: 4th Number
\n"; } + //if (strlen($destination_timeout_4) == 0) { $msg .= "Please provide: sec
\n"; } + //if (strlen($destination_data_5) == 0) { $msg .= "Please provide: 5th Number
\n"; } + //if (strlen($destination_timeout_5) == 0) { $msg .= "Please provide: sec
\n"; } + //if (strlen($destination_data_6) == 0) { $msg .= "Please provide: 6th Number
\n"; } + //if (strlen($destination_timeout_6) == 0) { $msg .= "Please provide: sec
\n"; } + //if (strlen($destination_data_7) == 0) { $msg .= "Please provide: 7th Number
\n"; } + //if (strlen($destination_timeout_7) == 0) { $msg .= "Please provide: sec
\n"; } + //if (strlen($hunt_group_call_prompt) == 0) { $msg .= "Please provide: call prompt
\n"; } + if (strlen($msg) > 0 && strlen($_POST["persistformvar"]) == 0) { + require_once "includes/header.php"; + require_once "includes/persistformvar.php"; + echo "
\n"; + echo "
\n"; + echo $msg."
"; + echo "
\n"; + persistformvar($_POST); + echo "
\n"; + require_once "includes/footer.php"; + return; + } + + //set the default action to add + $call_forward_action = "add"; + $dnd_action = "add"; + $follow_me_action = "add"; + + //get the hunt group timeout + //add the destination timeouts together to create the hunt group timeout + if ($follow_me_type == "follow_me_sequence") { + if (strlen($destination_data_1) > 0) { + $hunt_group_timeout = $destination_timeout_1; + } + if (strlen($destination_data_2) > 0) { + $hunt_group_timeout = $hunt_group_timeout + $destination_timeout_2; + } + if (strlen($destination_data_3) > 0) { + $hunt_group_timeout = $hunt_group_timeout + $destination_timeout_3; + } + if (strlen($destination_data_4) > 0) { + $hunt_group_timeout = $hunt_group_timeout + $destination_timeout_4; + } + if (strlen($destination_data_5) > 0) { + $hunt_group_timeout = $hunt_group_timeout + $destination_timeout_5; + } + } + //find the highest timeout and set that as the hunt_group_timeout + if ($follow_me_type == "follow_me_simultaneous") { + if (strlen($destination_data_1) > 0) { + $hunt_group_timeout = $destination_timeout_1; + } + if (strlen($destination_data_2) > 0 && $hunt_group_timeout < $destination_timeout_2) { + $hunt_group_timeout = $destination_timeout_2; + } + if (strlen($destination_data_3) > 0 && $hunt_group_timeout < $destination_timeout_3) { + $hunt_group_timeout = $destination_timeout_3; + } + if (strlen($destination_data_4) > 0 && $hunt_group_timeout < $destination_timeout_4) { + $hunt_group_timeout = $destination_timeout_4; + } + if (strlen($destination_data_5) > 0 && $hunt_group_timeout < $destination_timeout_5) { + $hunt_group_timeout = $destination_timeout_5; + } + } + + //hunt_group information used to determine if this is an add or an update + $sql = "select * from v_hunt_groups "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and hunt_group_extension = '$extension' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach ($result as &$row) { + if ($row["hunt_group_type"] == 'call_forward') { + $call_forward_action = "update"; + $call_forward_uuid = $row["hunt_group_uuid"]; + } + if ($row["hunt_group_type"] == 'follow_me_sequence') { + $follow_me_action = "update"; + $follow_me_uuid = $row["hunt_group_uuid"]; + } + if ($row["hunt_group_type"] == 'follow_me_simultaneous') { + $follow_me_action = "update"; + $follow_me_uuid = $row["hunt_group_uuid"]; + } + if ($row["hunt_group_type"] == 'dnd') { + $dnd_action = "update"; + $dnd_uuid = $row["hunt_group_uuid"]; + } + } + unset ($prep_statement); + + //include the classes + include "includes/classes/call_forward.php"; + include "includes/classes/follow_me.php"; + include "includes/classes/do_not_disturb.php"; + + //call forward config + if (permission_exists('call_forward')) { + $call_forward = new call_forward; + $call_forward->domain_uuid = $_SESSION['domain_uuid']; + $call_forward->db_type = $db_type; + $call_forward->extension = $extension; + $call_forward->call_forward_number = $call_forward_number; + $call_forward->call_forward_enabled = $call_forward_enabled; + if ($call_forward_enabled == "true") { + if ($call_forward_action == "add") { + $call_forward->call_forward_uuid = uuid(); + $call_forward->call_forward_add(); + } + } + if ($call_forward_action == "update") { + $call_forward->call_forward_uuid = $call_forward_uuid; + $call_forward->call_forward_update(); + } + unset($call_forward); + } + + //follow me config + if (permission_exists('follow_me')) { + $follow_me = new follow_me; + $follow_me->domain_uuid = $_SESSION['domain_uuid']; + $follow_me->db_type = $db_type; + $follow_me->extension = $extension; + $follow_me->follow_me_enabled = $follow_me_enabled; + $follow_me->follow_me_type = $follow_me_type; + $follow_me->hunt_group_call_prompt = $hunt_group_call_prompt; + $follow_me->hunt_group_timeout = $hunt_group_timeout; + + $follow_me->destination_data_1 = $destination_data_1; + $follow_me->destination_type_1 = $destination_type_1; + $follow_me->destination_timeout_1 = $destination_timeout_1; + + $follow_me->destination_data_2 = $destination_data_2; + $follow_me->destination_type_2 = $destination_type_2; + $follow_me->destination_timeout_2 = $destination_timeout_2; + + $follow_me->destination_data_3 = $destination_data_3; + $follow_me->destination_type_3 = $destination_type_3; + $follow_me->destination_timeout_3 = $destination_timeout_3; + + $follow_me->destination_data_4 = $destination_data_4; + $follow_me->destination_type_4 = $destination_type_4; + $follow_me->destination_timeout_4 = $destination_timeout_4; + + $follow_me->destination_data_5 = $destination_data_5; + $follow_me->destination_type_5 = $destination_type_5; + $follow_me->destination_timeout_5 = $destination_timeout_5; + + if ($follow_me_enabled == "true") { + if ($follow_me_action == "add") { + $follow_me->follow_me_uuid = uuid(); + $follow_me->follow_me_add(); + } + } + if ($follow_me_action == "update") { + $follow_me->follow_me_uuid = $follow_me_uuid; + $follow_me->follow_me_update(); + } + unset($follow_me); + } + + //do not disturb (dnd) config + if (permission_exists('do_not_disturb')) { + $dnd = new do_not_disturb; + $dnd->domain_uuid = $_SESSION['domain_uuid']; + $dnd->domain_name = $_SESSION['domain_name']; + $dnd->extension = $extension; + $dnd->dnd_enabled = $dnd_enabled; + if ($dnd_enabled == "true") { + if ($dnd_action == "add") { + $dnd->dnd_uuid = uuid(); + $dnd->dnd_add(); + } + } + if ($dnd_action == "update") { + $dnd->dnd_uuid = $dnd_uuid; + $dnd->dnd_update(); + } + $dnd->dnd_status(); + unset($dnd); + } + + //synchronize the xml config + save_hunt_group_xml(); + + //synchronize the xml config + save_dialplan_xml(); + + //redirect the user + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Update Complete
\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + +} //(count($_POST)>0 && strlen($_POST["persistformvar"]) == 0) + +//show the header + require_once "includes/header.php"; + +//pre-populate the form + $sql = "select * from v_hunt_groups "; + $sql .= "where hunt_group_extension = '$extension' "; + $sql .= "and domain_uuid = '$domain_uuid' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach ($result as &$row) { + $hunt_group_uuid = $row["hunt_group_uuid"]; + $hunt_group_extension = $row["hunt_group_extension"]; + $huntgroup_name = $row["hunt_group_name"]; + $hunt_group_type = $row["hunt_group_type"]; + $hunt_group_context = $row["hunt_group_context"]; + $hunt_group_timeout = $row["hunt_group_timeout"]; + $hunt_group_timeout_destination = $row["hunt_group_timeout_destination"]; + $hunt_group_timeout_type = $row["hunt_group_timeout_type"]; + $hunt_group_ring_back = $row["hunt_group_ringback"]; + $hunt_group_cid_name_prefix = $row["hunt_group_cid_name_prefix"]; + $hunt_group_pin = $row["hunt_group_pin"]; + $hunt_group_call_prompt = $row["hunt_group_call_prompt"]; + $huntgroup_caller_announce = $row["hunt_group_caller_announce"]; + $hunt_group_user_list = $row["hunt_group_user_list"]; + $hunt_group_enabled = $row["hunt_group_enabled"]; + $hunt_group_description = $row["hunt_group_description"]; + + if ($row["hunt_group_type"] == 'call_forward') { + $call_forward_enabled = $hunt_group_enabled; + } + if ($row["hunt_group_type"] == 'follow_me_simultaneous') { + $follow_me_enabled = $hunt_group_enabled; + $follow_me_type = 'follow_me_simultaneous'; + } + if ($row["hunt_group_type"] == 'follow_me_sequence') { + $follow_me_enabled = $hunt_group_enabled; + $follow_me_type = 'follow_me_sequence'; + } + if ($row["hunt_group_type"] == 'dnd') { + $dnd_enabled = $hunt_group_enabled; + } + + if ($row["hunt_group_type"] == 'call_forward' || $row["hunt_group_type"] == 'follow_me_sequence' || $row["hunt_group_type"] == 'follow_me_simultaneous') { + $sql = "select * from v_hunt_group_destinations "; + $sql .= "where hunt_group_uuid = '$hunt_group_uuid' "; + $prep_statement_2 = $db->prepare(check_sql($sql)); + $prep_statement_2->execute(); + $result2 = $prep_statement_2->fetchAll(PDO::FETCH_NAMED); + $x=1; + foreach ($result2 as &$row2) { + if ($row["hunt_group_type"] == 'call_forward') { + if (strlen($row2["destination_data"]) > 0) { + $call_forward_number = $row2["destination_data"]; + } + } + if ($row["hunt_group_type"] == 'follow_me_sequence' || $row["hunt_group_type"] == 'follow_me_simultaneous') { + if ($x == 1) { + $destination_data_1 = $row2["destination_data"]; + $destination_timeout_1 = $row2["destination_timeout"]; + } + if ($x == 2) { + $destination_data_2 = $row2["destination_data"]; + $destination_timeout_2 = $row2["destination_timeout"]; + } + if ($x == 3) { + $destination_data_3 = $row2["destination_data"]; + $destination_timeout_3 = $row2["destination_timeout"]; + } + if ($x == 4) { + $destination_data_4 = $row2["destination_data"]; + $destination_timeout_4 = $row2["destination_timeout"]; + } + if ($x == 5) { + $destination_data_5 = $row2["destination_data"]; + $destination_timeout_5 = $row2["destination_timeout"]; + } + $x++; + } + } + unset ($prep_statement_2); + } + } + unset ($prep_statement); + +//show the content + echo "
"; + echo "\n"; + echo "\n"; + echo " "; + echo " "; + echo "
\n"; + echo "
"; + + echo "
\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + + echo " \n"; + echo " \n"; + echo " "; + echo "
\n"; + echo " Calls\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo " Directs incoming calls for extension $extension.

\n"; + echo "
\n"; + echo " Call Forward:\n"; + echo "\n"; + $on_click = "document.getElementById('follow_me_enabled').checked=true;"; + $on_click .= "document.getElementById('follow_me_disabled').checked=true;"; + $on_click .= "document.getElementById('dnd_enabled').checked=false;"; + $on_click .= "document.getElementById('dnd_disabled').checked=true;"; + if ($call_forward_enabled == "true") { + echo " Enabled \n"; + } + else { + echo " Enable \n"; + } + if ($call_forward_enabled == "false" || $call_forward_enabled == "") { + echo " Disabled \n"; + } + else { + echo " Disable \n"; + } + unset($on_click); + echo "
\n"; + echo "
\n"; + //echo "Enable or disable call forward.\n"; + echo "
\n"; + echo " Number:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + //echo "Enter the call forward number.\n"; + echo "
\n"; + echo "
\n"; + echo "
\n"; + echo " Follow Me:\n"; + echo "\n"; + $on_click = "document.getElementById('call_forward_enabled').checked=true;"; + $on_click .= "document.getElementById('call_forward_disabled').checked=true;"; + $on_click .= "document.getElementById('dnd_enabled').checked=false;"; + $on_click .= "document.getElementById('dnd_disabled').checked=true;"; + if ($follow_me_enabled == "true") { + echo " Enabled \n"; + } + else { + echo " Enable \n"; + } + if ($follow_me_enabled == "false" || $follow_me_enabled == "") { + echo " Disabled \n"; + } + else { + echo " Disable \n"; + } + unset($on_click); + echo "
\n"; + echo "
\n"; + echo "
\n"; + echo " Ring 1st Number:\n"; + echo "\n"; + echo " \n"; + echo " Sec \n"; + destination_select('destination_timeout_1', $destination_timeout_1, '10'); + //echo "
\n"; + //echo "This number rings first.\n"; + echo "
\n"; + echo " Ring 2nd Number:\n"; + echo "\n"; + echo " \n"; + echo " Sec \n"; + destination_select('destination_timeout_2', $destination_timeout_2, '30'); + //echo "
\n"; + //echo "Enter the destination number.\n"; + echo "
\n"; + echo " Ring 3rd Number:\n"; + echo "\n"; + echo " \n"; + echo " Sec \n"; + destination_select('destination_timeout_3', $destination_timeout_3, '30'); + //echo "
\n"; + //echo "Enter the destination number.\n"; + echo "
\n"; + echo " Ring 4th Number:\n"; + echo "\n"; + echo " \n"; + echo " Sec \n"; + destination_select('destination_timeout_4', $destination_timeout_4, '30'); + //echo "
\n"; + //echo "Enter the destination number.\n"; + echo "
\n"; + echo " Ring 5th Number:\n"; + echo "\n"; + echo " \n"; + echo " Sec \n"; + destination_select('destination_timeout_5', $destination_timeout_5, '30'); + //echo "
\n"; + //echo "Enter the destination number.\n"; + echo "
\n"; + echo " Ring Order:\n"; + echo "\n"; + echo "\n"; + //echo "
\n"; + //echo "Enter the destination number.\n"; + echo "
\n"; + echo " Prompt to accept the call:\n"; + echo "\n"; + echo "\n"; + //echo "
\n"; + //echo "Enter the destination number.\n"; + echo "
\n"; + echo "
\n"; + echo "
\n"; + echo " Do Not Disturb:\n"; + echo "\n"; + $on_click = "document.getElementById('call_forward_enabled').checked=true;"; + $on_click .= "document.getElementById('call_forward_disabled').checked=true;"; + $on_click .= "document.getElementById('follow_me_enabled').checked=true;"; + $on_click .= "document.getElementById('follow_me_disabled').checked=true;"; + if ($dnd_enabled == "true") { + echo " Enabled \n"; + } + else { + echo " Enable \n"; + } + if ($dnd_enabled == "false" || $dnd_enabled == "") { + echo " Disabled \n"; + } + else { + echo " Disable \n"; + } + echo "
\n"; + echo "
\n"; + echo "
\n"; + echo "
\n"; + echo "
\n"; + echo "
\n"; + if ($action == "update") { + echo " \n"; + } + echo " \n"; + echo "
"; + echo "
"; + + echo "
"; + echo "
"; + +require_once "includes/footer.php"; +?> \ No newline at end of file diff --git a/app/calls/v_calls.php b/app/calls/v_calls.php new file mode 100644 index 0000000000..c4a329b6bf --- /dev/null +++ b/app/calls/v_calls.php @@ -0,0 +1,196 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('follow_me') || permission_exists('call_forward') || permission_exists('do_not_disturb')) { + //access granted +} +else { + echo "access denied"; + exit; +} +require_once "includes/header.php"; +require_once "includes/paging.php"; + +$order_by = $_GET["order_by"]; +$order = $_GET["order"]; + + echo "
"; + echo "\n"; + echo "\n"; + echo "
\n"; + echo "
"; + + if ($is_included != "true") { + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "
Calls
\n"; + echo " Use the links to configure call forward follow me, or do no disturb.\n"; + echo " The following list the extensions that have been assigned to this user account. \n"; + echo "
\n"; + echo "
"; + } + + $sql = ""; + $sql .= " select * from v_extensions "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and enabled = 'true' "; + if (!(if_group("admin") || if_group("superadmin"))) { + if (count($_SESSION['user']['extension']) > 0) { + $sql .= "and ("; + $x = 0; + foreach($_SESSION['user']['extension'] as $row) { + if ($x > 0) { $sql .= "or "; } + $sql .= "extension = '".$row['user']."' "; + $x++; + } + $sql .= ")"; + } + else { + //used to hide any results when a user has not been assigned an extension + $sql .= "and extension = 'disabled' "; + } + } + if (strlen($order_by)> 0) { + $sql .= "order by $order_by $order "; + } + else { + $sql .= "order by extension asc "; + } + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + $num_rows = count($result); + unset ($prep_statement, $result, $sql); + + $rows_per_page = 150; + $param = ""; + $page = $_GET['page']; + if (strlen($page) == 0) { $page = 0; $_GET['page'] = 0; } + list($paging_controls, $rows_per_page, $var_3) = paging($num_rows, $param, $rows_per_page); + $offset = $rows_per_page * $page; + + $sql = ""; + $sql .= " select * from v_extensions "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and enabled = 'true' "; + if (!(if_group("admin") || if_group("superadmin"))) { + if (count($_SESSION['user']['extension']) > 0) { + $sql .= "and ("; + $x = 0; + foreach($_SESSION['user']['extension'] as $row) { + if ($x > 0) { $sql .= "or "; } + $sql .= "extension = '".$row['user']."' "; + $x++; + } + $sql .= ")"; + } + else { + //hide any results when a user has not been assigned an extension + $sql .= "and extension = 'disabled' "; + } + } + if (strlen($order_by)> 0) { + $sql .= "order by $order_by $order "; + } + else { + $sql .= "order by extension asc "; + } + $sql .= " limit $rows_per_page offset $offset "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + $result_count = count($result); + unset ($prep_statement, $sql); + + + $c = 0; + $row_style["0"] = "row_style0"; + $row_style["1"] = "row_style1"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + if ($result_count == 0) { + //no results + } + else { //received results + foreach($result as $row) { + echo "\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "\n"; + if ($c==0) { $c=1; } else { $c=0; } + } //end foreach + unset($sql, $result, $row_count); + } //end if results + + if (strlen($paging_controls) > 0) { + echo "\n"; + echo "\n"; + echo "\n"; + } + echo "
ExtensionToolsDescription
".$row[extension]."\n"; + if (permission_exists('call_forward')) { + echo " Call Forward \n"; + echo "   \n"; + } + if (permission_exists('follow_me')) { + echo " Follow Me \n"; + echo "   \n"; + } + if (permission_exists('do_not_disturb')) { + echo " Do Not Disturb \n"; + } + echo " ".$row[description]." 
\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "
 $paging_controls
\n"; + echo "
"; + + echo "
"; + echo "
"; + echo "
"; + echo "
"; + echo "
"; + + if ($is_included != "true") { + require_once "includes/footer.php"; + } + + +?> diff --git a/app/calls_active/app_config.php b/app/calls_active/app_config.php new file mode 100644 index 0000000000..03a9e63696 --- /dev/null +++ b/app/calls_active/app_config.php @@ -0,0 +1,75 @@ + \ No newline at end of file diff --git a/app/calls_active/root.php b/app/calls_active/root.php new file mode 100644 index 0000000000..7b882438ea --- /dev/null +++ b/app/calls_active/root.php @@ -0,0 +1,50 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ + +// make sure the PATH_SEPARATOR is defined + if (!defined("PATH_SEPARATOR")) { + if ( strpos( $_ENV[ "OS" ], "Win" ) !== false ) { define("PATH_SEPARATOR", ";"); } else { define("PATH_SEPARATOR", ":"); } + } + +// make sure the document_root is set + $_SERVER["SCRIPT_FILENAME"] = str_replace("\\", "/", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = str_replace($_SERVER["PHP_SELF"], "", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = realpath($_SERVER["DOCUMENT_ROOT"]); + //echo "DOCUMENT_ROOT: ".$_SERVER["DOCUMENT_ROOT"]."
\n"; + //echo "PHP_SELF: ".$_SERVER["PHP_SELF"]."
\n"; + //echo "SCRIPT_FILENAME: ".$_SERVER["SCRIPT_FILENAME"]."
\n"; + +// if the project directory exists then add it to the include path otherwise add the document root to the include path + if (is_dir($_SERVER["DOCUMENT_ROOT"].'/fusionpbx')){ + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', '/fusionpbx'); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER["DOCUMENT_ROOT"].'/fusionpbx' ); + } + else { + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', ''); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER['DOCUMENT_ROOT'] ); + } + +?> \ No newline at end of file diff --git a/app/calls_active/v_calls_active.php b/app/calls_active/v_calls_active.php new file mode 100644 index 0000000000..0c6f988269 --- /dev/null +++ b/app/calls_active/v_calls_active.php @@ -0,0 +1,165 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('calls_active_view')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +$conference_name = trim($_REQUEST["c"]); +$tmp_conference_name = str_replace("_", " ", $conference_name); + +require_once "includes/header.php"; +?> + +"; + +echo "\n"; +echo " \n"; +echo " \n"; +echo " \n"; +echo " \n"; +echo "
Active Calls
\n"; +echo " Use this to monitor and interact with the active calls.\n"; +echo "
\n"; + +echo " \n"; +echo " \n"; +echo " \n"; +echo " \n"; +echo "
\n"; +echo "
\n"; +echo "
\n"; +echo "
\n"; +echo "
\n"; +echo "
\n"; + +echo "
\n"; + +echo "\n"; +echo " \n"; +echo " "; +echo " "; +echo "
\n"; +echo "
\n"; +echo "
".date('Y-m-d-s')."
\n"; +echo "
"; + +echo "\n"; + +echo "\n"; + +require_once "includes/footer.php"; +?> diff --git a/app/calls_active/v_calls_active_assigned_extensions_inc.php b/app/calls_active/v_calls_active_assigned_extensions_inc.php new file mode 100644 index 0000000000..05ed7522ad --- /dev/null +++ b/app/calls_active/v_calls_active_assigned_extensions_inc.php @@ -0,0 +1,231 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('extensions_active_assigned_view')) { + + //http get and set variables + if (strlen($_GET['url']) > 0) { + $url = $_GET['url']; + } + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "
\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + if ($_SESSION['user_status_display'] == "false") { + //hide the user_status when it is set to false + } + else { + echo "\n"; + } + echo "\n"; + //echo "\n"; + //echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + foreach ($_SESSION['extension_array'] as $row) { + $domain_uuid = $row['domain_uuid']; + $extension = $row['extension']; + $enabled = $row['enabled']; + $effective_caller_id_name = $row['effective_caller_id_name']; + + foreach ($_SESSION['user']['extension'] as &$user_row) { + if ($extension == $user_row['user']) { + $found_extension = false; + $x = 1; + + foreach ($channels_array as $row) { + //set the php variables + foreach ($row as $key => $value) { + $$key = $value; + } + //find the matching extensions + if ($number == $extension) { + //set the found extension to true + $found_extension = true; + break; + } + } //end foreach + + if ($number == $extension) { + if ($application == "conference") { + $alt_color = "background-image: url('".PROJECT_PATH."/images/background_cell_active.gif"; + } + switch ($application) { + case "conference": + $style_alternate = "style=\"color: #444444; background-image: url('".PROJECT_PATH."/images/background_cell_conference.gif');\""; + break; + case "fifo": + $style_alternate = "style=\"color: #444444; background-image: url('".PROJECT_PATH."/images/background_cell_fifo.gif');\""; + break; + case "valet_park": + $style_alternate = "style=\"color: #444444; background-image: url('".PROJECT_PATH."/images/background_cell_fifo.gif');\""; + break; + default: + $style_alternate = "style=\"color: #444444; background-image: url('".PROJECT_PATH."/images/background_cell_active.gif');\""; + } + echo "\n"; + echo "\n"; + if ($_SESSION['user_status_display'] == "false") { + //hide the user_status when it is set to false + } + else { + echo "\n"; + } + echo "\n"; + + if (strlen($url) == 0) { + $url = PROJECT_PATH."/app/contacts/contacts.php?search_all={cid_num}"; + } + $url = str_replace ("{cid_num}", $cid_num, $url); + $url = str_replace ("{cid_name}", $cid_name, $url); + echo "\n"; + echo "\n"; + + //get the active uuid list + if (strlen($uuid) > 1) { + if (strlen($uuid_1) == 0) { + $uuid_1 = $uuid; + //$direction_1 = $direction; + $cid_name_1 = $cid_name; + $cid_num_1 = $cid_num; + } + if (strlen($uuid_1) > 0 && $uuid != $uuid_1) { + $uuid_2 = $uuid; + //$direction_2 = $direction; + $cid_name_2 = $cid_name; + $cid_num_2 = $cid_num; + } + } + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + } + else { + $style_alternate = "style=\"color: #444444; background-image: url('".PROJECT_PATH."/images/background_cell_light.gif');\""; + echo "\n"; + echo "\n"; + if ($_SESSION['user_status_display'] == "false") { + //hide the user_status when it is set to false + } + else { + echo "\n"; + } + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + } + if ($c==0) { $c=1; } else { $c=0; } + } //end if + } //end foreach + } + echo "
ExtStatusTimeDirectionProfileCID NameCID NumberDestApplicationSecureNameOptions
$extension".$user_array[$extension]['user_status']." ".$call_length."".$cid_name."".$cid_num."\n"; + if ($application == "valet_park") { + echo $valet_array[trim($uuid)]['extension']."\n"; + } + else { + echo $dest." \n"; + } + echo "\n"; + if ($application == "fifo") { + echo "queue  \n"; + } + else { + echo $application." \n"; + } + echo "\n"; + echo "".$secure." \n"; + echo "\n"; + echo "".$effective_caller_id_name." \n"; + echo "\n"; + //transfer + echo " Transfer To';\" onclick=\"send_cmd('v_calls_exec.php?cmd='+get_transfer_cmd(escape('$uuid')));\">transfer \n"; + //park + echo " park \n"; + //hangup + echo " hangup \n"; + //record start/stop + $tmp_file = $_SESSION['switch']['recordings']['dir']."/archive/".date("Y")."/".date("M")."/".date("d")."/".$uuid.".wav"; + if (file_exists($tmp_file)) { + //stop + echo " stop record \n"; + } + else { + //start + echo " start record \n"; + } + echo "  "; + echo "
$extension".$user_array[$extension]['user_status']."    \n"; + echo "  "; + echo "\n"; + echo "  "; + echo "\n"; + echo "  "; + echo "\n"; + echo "  "; + echo "\n"; + echo "  "; + echo "
\n"; + + echo "
\n"; + + echo "\n"; + //echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + //echo "\n"; + echo "\n"; + echo "\n"; + + echo "
\n"; +} + +?> \ No newline at end of file diff --git a/app/calls_active/v_calls_active_extensions.php b/app/calls_active/v_calls_active_extensions.php new file mode 100644 index 0000000000..a2fa501fda --- /dev/null +++ b/app/calls_active/v_calls_active_extensions.php @@ -0,0 +1,337 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('extensions_active_view')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +//http get and set variables + $event_type = $_GET['event_type']; //open_window //iframe + if ($event_type=="iframe") { + $iframe_width = $_GET['iframe_width']; + $iframe_height = $_GET['iframe_height']; + $iframe_postition = $_GET['iframe_postition']; + if (strlen($iframe_postition) > 0) { $iframe_postition = 'right'; } + if (strlen($iframe_width) > 0) { $iframe_width = '25%'; } + if (strlen($iframe_height) > 0) { $iframe_height = '100%'; } + } + if (strlen($_GET['url']) > 0) { + $url = $_GET['url']; + } + if (strlen($_GET['rows']) > 0) { + $rows = $_GET['rows']; + } + else { + $rows = 0; + } + +$conference_name = trim($_REQUEST["c"]); +$tmp_conference_name = str_replace("_", " ", $conference_name); + +require_once "includes/header.php"; +?> + +"; + +echo "\n"; +echo " \n"; +echo " \n"; + +//get the user status when the page loads + $sql = ""; + $sql .= "select * from v_users "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and username = '".$_SESSION['username']."' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach ($result as &$row) { + $user_status = $row["user_status"]; + break; //limit to 1 row + } + +if ($_SESSION['user_status_display'] == "false") { + //hide the user_status when it is set to false +} +else { + echo " \n"; + echo " \n"; +} + +echo " \n"; +echo " \n"; +echo " \n"; +echo " \n"; +echo " \n"; +echo "
\n"; +echo " Active Extensions
\n"; +echo "
\n"; + echo "  "; + echo " \n"; + //status list + echo "  "; + echo " Status \n"; + $cmd = "'v_calls_exec.php?action=user_status&data='+this.value+'"; + $cmd .= "&cmd=callcenter_config+agent+set+status+".$_SESSION['username']."@".$_SESSION['domain_name']."+'+this.value"; + echo " \n"; + echo " \n"; +echo "  "; +echo " Transfer To\n"; +echo " \n"; +echo "
\n"; +echo " Use this to view all extensions and monitor and interact with active calls.\n"; +echo "
\n"; + +echo "
\n"; +echo "
\n"; + +echo "\n"; +echo " \n"; +if ($event_type=="iframe") { + echo " \n"; + +if ($event_type=="iframe") { + echo "\n"; + echo "\n"; +} + +echo " "; +echo "
\n"; +} +else { + echo " \n"; +} +echo "
\n"; +echo "
".date('Y-m-d-s')."
\n"; +echo "
\n"; + echo " \n"; + echo "
"; +echo "\n"; + +echo "\n"; + +require_once "includes/footer.php"; +?> diff --git a/app/calls_active/v_calls_active_extensions_inc.php b/app/calls_active/v_calls_active_extensions_inc.php new file mode 100644 index 0000000000..40ed9a7b5a --- /dev/null +++ b/app/calls_active/v_calls_active_extensions_inc.php @@ -0,0 +1,561 @@ + + Copyright (C) 2010 + All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('extensions_active_view')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +//set debug to true or false + $debug = false; + +//http get and set variables + if (strlen($_GET['url']) > 0) { + $url = $_GET['url']; + } + if (strlen($_GET['rows']) == 0) { + $_GET['rows'] = 0; + } + +//define variables + $c = 0; + $row_style["0"] = "row_style1"; + $row_style["1"] = "row_style1"; + +//get the user status + $sql = ""; + $sql .= "select e.extension, u.username, u.user_status "; + $sql .= "from v_users as u, v_extensions as e "; + $sql .= "where e.domain_uuid = '$domain_uuid' "; + $sql .= "and u.domain_uuid = '$domain_uuid' "; + if (!(if_group("admin") || if_group("superadmin"))) { + if (count($_SESSION['user']['extension']) > 0) { + $sql .= "and ("; + $x = 0; + foreach($_SESSION['user']['extension'] as $row) { + if ($x > 0) { $sql .= "or "; } + $sql .= "e.extension = '".$row['user']."' "; + $x++; + } + $sql .= ")"; + } + else { + //hide any results when a user has not been assigned an extension + $sql .= "and extension = 'disabled' "; + } + } + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $x = 0; + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach ($result as &$row) { + if (strlen($row["user_status"]) > 0) { + $user_array[$row["extension"]]['username'] = $row["username"]; + $user_array[$row["extension"]]['user_status'] = $row["user_status"]; + $username_array[$row["username"]]['user_status'] = $row["user_status"]; + if ($row["username"] == $_SESSION["username"]) { + $user_status = $row["user_status"]; + } + } + $x++; + } + unset ($prep_statement, $x); + +//create the event socket connection + $fp = event_socket_create($_SESSION['event_socket_ip_address'], $_SESSION['event_socket_port'], $_SESSION['event_socket_password']); + +//get information over event socket + if (!$fp) { + $msg = "
Connection to Event Socket failed.
"; + echo "
\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "
Message
$msg
\n"; + echo "
\n"; + } + else { + //get the agent list from event socket + $switch_cmd = 'callcenter_config agent list'; + $event_socket_str = trim(event_socket_request($fp, 'api '.$switch_cmd)); + $agent_array = csv_to_named_array($event_socket_str, '|'); + //set the status on the user_array by using the extension as the key + foreach ($agent_array as $row) { + if (count($_SESSION['domains']) == 1) { + //get the extension status from the call center agent list + preg_match('/user\/(\d{2,7})/', $row['contact'], $matches); + $extension = $matches[1]; + $user_array[$extension]['username'] = $tmp[0]; + if ($user_array[$extension]['user_status'] != "Do Not Disturb") { + $user_array[$extension]['user_status'] = $row['status']; + } + } else { + $tmp = explode('@',$row["name"]); + if ($tmp[1] == $_SESSION['domain_name']) { + //get the extension status from the call center agent list + preg_match('/user\/(\d{2,7})/', $row['contact'], $matches); + $extension = $matches[1]; + $user_array[$extension]['username'] = $tmp[0]; + if ($user_array[$extension]['user_status'] != "Do Not Disturb") { + $user_array[$extension]['user_status'] = $row['status']; + } + } + } + } + + //send the api command over event socket + $switch_cmd = 'valet_info'; + $valet_xml_str = trim(event_socket_request($fp, 'api '.$switch_cmd)); + + //parse the xml + try { + $valet_xml = new SimpleXMLElement($valet_xml_str); + } + catch(Exception $e) { + //echo $e->getMessage(); + } + $valet_xml = new SimpleXMLElement($valet_xml_str); + foreach ($valet_xml as $row) { + $valet_name = (string) $row->attributes()->name; + foreach ($row->extension as $row2) { + $extension = (string) $row2; + $uuid = (string) $row2->attributes()->uuid; + $uuid = trim($uuid); + $valet_array[$uuid]['name'] = $valet_name; + $valet_array[$uuid]['extension'] = $extension; + } + } + + //send the event socket command + $switch_cmd = 'show channels as xml'; + $xml_str = trim(event_socket_request($fp, 'api '.$switch_cmd)); + + //parse the xml + try { + $xml = new SimpleXMLElement($xml_str); + } + catch(Exception $e) { + //echo $e->getMessage(); + } + + //active channels array + $channels_array = ''; + $x = 1; + foreach ($xml as $row) { + //set the original array id + $channels_array[$x]['x'] = $x; + + //get the values from xml and set them to the channel array + $channels_array[$x]['uuid'] = $row->uuid; + $channels_array[$x]['direction'] = $row->direction; + $channels_array[$x]['created'] = $row->created; + $channels_array[$x]['created_epoch'] = $row->created_epoch; + $channels_array[$x]['name'] = $row->name; + $channels_array[$x]['state'] = $row->state; + $channels_array[$x]['cid_name'] = $row->cid_name; + $channels_array[$x]['cid_num'] = $row->cid_num; + $channels_array[$x]['ip_addr'] = $row->ip_addr; + $channels_array[$x]['dest'] = $row->dest; + $channels_array[$x]['application'] = $row->application; + $channels_array[$x]['application_data'] = $row->application_data; + $channels_array[$x]['dialplan'] = $row->dialplan; + $channels_array[$x]['context'] = $row->context; + $channels_array[$x]['read_codec'] = $row->read_codec; + $channels_array[$x]['read_rate'] = $row->read_rate; + $channels_array[$x]['read_bit_rate'] = $row->read_bit_rate; + $channels_array[$x]['write_codec'] = $row->write_codec; + $channels_array[$x]['write_rate'] = $row->write_rate; + $channels_array[$x]['write_bit_rate'] = $row->write_bit_rate; + $channels_array[$x]['secure'] = $row->secure; + $channels_array[$x]['hostname'] = $row->hostname; + $channels_array[$x]['presence_id'] = $row->presence_id; + $channels_array[$x]['presence_data'] = $row->presence_data; + $channels_array[$x]['callstate'] = $row->callstate; + $channels_array[$x]['callee_name'] = $row->callee_name; + $channels_array[$x]['callee_num'] = $row->callee_num; + $channels_array[$x]['callee_direction'] = $row->callee_direction; + $channels_array[$x]['call_uuid'] = $row->call_uuid; + + //remove other domains + if (count($_SESSION["domains"]) > 1) { + //unset domains that are not related to this tenant + $temp_array = explode("@", $channels_array[$x]['presence_id']); + if ($temp_array[1] != $_SESSION['domain_name']) { + unset($channels_array[$x]); + } + } + + //parse some of the php variables\ + $temp_array = explode("@", $channels_array[$x]['presence_id']); + $channels_array[$x]['number'] = $temp_array[0]; + + //remove the '+' because it breaks the call recording + $channels_array[$x]['cid_num'] = $temp_array[0] = str_replace("+", "", $channels_array[$x]['cid_num']); + + //calculate and set the call length + $call_length_seconds = time() - $channels_array[$x]['created_epoch']; + $call_length_hour = floor($call_length_seconds/3600); + $call_length_min = floor($call_length_seconds/60 - ($call_length_hour * 60)); + $call_length_sec = $call_length_seconds - (($call_length_hour * 3600) + ($call_length_min * 60)); + $call_length_min = sprintf("%02d", $call_length_min); + $call_length_sec = sprintf("%02d", $call_length_sec); + $call_length = $call_length_hour.':'.$call_length_min.':'.$call_length_sec; + $channels_array[$x]['call_length'] = $call_length; + + //valet park + if (is_array($valet_array[$uuid])) { + $valet_array[$uuid]['context'] = $channels_array[$x]['context']; + $valet_array[$uuid]['cid_name'] = $channels_array[$x]['cid_name']; + $valet_array[$uuid]['cid_num'] = $channels_array[$x]['cid_num']; + $valet_array[$uuid]['call_length'] = $call_length; + } + //increment the array index + $x++; + } + + //active extensions + //get the extension information + if ($debug) { + unset($_SESSION['extension_array']); + } + if (count($_SESSION['extension_array']) == 0) { + $sql = ""; + $sql .= "select * from v_extensions "; + $x = 0; + $range_array = $_GET['range']; + foreach($range_array as $tmp_range) { + $tmp_range = str_replace(":", "-", $tmp_range); + $tmp_array = explode("-", $tmp_range); + $tmp_min = $tmp_array[0]; + $tmp_max = $tmp_array[1]; + if ($x == 0) { + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and extension >= $tmp_min "; + $sql .= "and extension <= $tmp_max "; + $sql .= "and enabled = 'true' "; + } + else { + $sql .= "or domain_uuid = '$domain_uuid' "; + $sql .= "and extension >= $tmp_min "; + $sql .= "and extension <= $tmp_max "; + $sql .= "and enabled = 'true' "; + } + $x++; + } + if (count($range_array) == 0) { + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and enabled = 'true' "; + } + $sql .= "order by extension asc "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach ($result as &$row) { + if ($row["enabled"] == "true") { + $extension = $row["extension"]; + $extension_array[$extension]['domain_uuid'] = $row["domain_uuid"]; + $extension_array[$extension]['extension'] = $row["extension"]; + + //$extension_array[$extension]['password'] = $row["password"]; + $extension_array[$extension]['mailbox'] = $row["mailbox"]; + //$vm_password = $row["vm_password"]; + //$vm_password = str_replace("#", "", $vm_password); //preserves leading zeros + //$_SESSION['extension_array'][$extension]['vm_password'] = $vm_password; + $extension_array[$extension]['accountcode'] = $row["accountcode"]; + $extension_array[$extension]['effective_caller_id_name'] = $row["effective_caller_id_name"]; + $extension_array[$extension]['effective_caller_id_number'] = $row["effective_caller_id_number"]; + $extension_array[$extension]['outbound_caller_id_name'] = $row["outbound_caller_id_name"]; + $extension_array[$extension]['outbound_caller_id_number'] = $row["outbound_caller_id_number"]; + $extension_array[$extension]['vm_enabled'] = $row["vm_enabled"]; + $extension_array[$extension]['vm_mailto'] = $row["vm_mailto"]; + $extension_array[$extension]['vm_attach_file'] = $row["vm_attach_file"]; + $extension_array[$extension]['vm_keep_local_after_email'] = $row["vm_keep_local_after_email"]; + $extension_array[$extension]['user_context'] = $row["user_context"]; + $extension_array[$extension]['call_group'] = $row["call_group"]; + $extension_array[$extension]['auth_acl'] = $row["auth_acl"]; + $extension_array[$extension]['cidr'] = $row["cidr"]; + $extension_array[$extension]['sip_force_contact'] = $row["sip_force_contact"]; + //$extension_array[$extension]['enabled'] = $row["enabled"]; + $extension_array[$extension]['effective_caller_id_name'] = $row["effective_caller_id_name"]; + } + } + $_SESSION['extension_array'] = $extension_array; + } + + //get a list of assigned extensions for this user + include "v_calls_active_assigned_extensions_inc.php"; + + //list all extensions + if (permission_exists('extensions_active_list_view')) { + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + } //end if results + + echo "
\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + if ($_SESSION['user_status_display'] == "false") { + //hide the user_status when it is set to false + } + else { + echo "\n"; + } + echo "\n"; + if (if_group("admin") || if_group("superadmin")) { + if (strlen(($_GET['rows'])) == 0) { + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + } + } + echo "\n"; + if (if_group("admin") || if_group("superadmin")) { + if (strlen(($_GET['rows'])) == 0) { + echo "\n"; + } + } + echo "\n"; + $x = 1; + + foreach ($_SESSION['extension_array'] as $row) { + $domain_uuid = $row['domain_uuid']; + $extension = $row['extension']; + $enabled = $row['enabled']; + $effective_caller_id_name = $row['effective_caller_id_name']; + + $found_extension = false; + foreach ($channels_array as $row) { + //set the php variables + foreach ($row as $key => $value) { + $$key = $value; + } + //check to see if the extension is found in the channel array + if ($number == $extension) { + $found_extension = true; + break; + } + } + + if ($found_extension) { + if ($application == "conference") { + $alt_color = "background-image: url('".PROJECT_PATH."/images/background_cell_active.gif"; + } + switch ($application) { + case "conference": + $style_alternate = "style=\"color: #444444; background-image: url('".PROJECT_PATH."/images/background_cell_conference.gif');\""; + break; + case "fifo": + $style_alternate = "style=\"color: #444444; background-image: url('".PROJECT_PATH."/images/background_cell_fifo.gif');\""; + break; + case "valet_park": + $style_alternate = "style=\"color: #444444; background-image: url('".PROJECT_PATH."/images/background_cell_fifo.gif');\""; + break; + default: + $style_alternate = "style=\"color: #444444; background-image: url('".PROJECT_PATH."/images/background_cell_active.gif');\""; + } + echo "\n"; + echo "\n"; + if ($_SESSION['user_status_display'] == "false") { + //hide the user_status when it is set to false + } + else { + echo "\n"; + } + echo "\n"; + if (if_group("admin") || if_group("superadmin")) { + if (strlen(($_GET['rows'])) == 0) { + if (strlen($url) == 0) { + $url = PROJECT_PATH."/app/contacts/contacts.php?search_all={cid_num}"; + } + $url = str_replace ("{cid_num}", $cid_num, $url); + $url = str_replace ("{cid_name}", $cid_name, $url); + echo "\n"; + echo "\n"; + } + } + if (if_group("admin") || if_group("superadmin")) { + if (strlen(($_GET['rows'])) == 0) { + echo "\n"; + echo "\n"; + echo "\n"; + } + } + } + else { + $style_alternate = "style=\"color: #444444; background-image: url('".PROJECT_PATH."/images/background_cell_light.gif');\""; + echo "\n"; + echo "\n"; + if ($_SESSION['user_status_display'] == "false") { + //hide the user_status when it is set to false + } + else { + echo "\n"; + } + echo "\n"; + if (if_group("admin") || if_group("superadmin")) { + if (strlen(($_GET['rows'])) == 0) { + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + } + } + } + + echo "\n"; + + if (if_group("admin") || if_group("superadmin")) { + if (strlen(($_GET['rows'])) == 0) { + if ($found_extension) { + echo "\n"; + } + else { + echo "\n"; + } + } + } + echo "\n"; + + if ($y == $_GET['rows'] && $_GET['rows'] > 0) { + $y = 0; + echo "
ExtStatusTimeCID NameCID NumberDestAppSecureNameOptions
$extension".$user_array[$extension]['user_status']." ".$call_length."".$cid_name."".$cid_num."\n"; + echo "".$dest."
\n"; + echo "
\n"; + if ($application == "fifo") { + echo "queue  \n"; + } + else { + echo $application."  \n"; + } + echo "\n"; + echo "".$secure."
\n"; + echo "
$extension".$user_array[$extension]['user_status']."       \n"; + echo " ".$effective_caller_id_name." \n"; + echo "\n"; + //transfer + echo " transfer \n"; + //park + echo " park \n"; + //hangup + echo " hangup \n"; + //record start/stop + $tmp_file = $_SESSION['switch']['recordings']['dir']."/archive/".date("Y")."/".date("M")."/".date("d")."/".$uuid.".wav"; + if (file_exists($tmp_file)) { + //stop + echo " stop record \n"; + } + else { + //start + echo " start record \n"; + } + echo "  "; + echo "\n"; + echo "  "; + echo "
\n"; + + echo "
\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + if ($_SESSION['user_status_display'] == "false") { + //hide the user_status when it is set to false + } + else { + echo "\n"; + } + echo "\n"; + if (if_group("admin") || if_group("superadmin")) { + if ($_GET['rows'] == 0) { + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + } + } + echo "\n"; + if (if_group("admin") || if_group("superadmin")) { + if ($_GET['rows'] == 0) { + echo "\n"; + } + } + echo "\n"; + } + $y++; + if ($c==0) { $c=1; } else { $c=0; } + } + + echo "
ExtStatusTimeCID NameCID NumberDestAppSecureNameOptions
\n"; + echo "

\n"; + + //valet park + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + foreach ($valet_array as $row) { + if (strlen($row['extension']) > 0) { + if ($row['context'] == $_SESSION['domain_name'] || $row['context'] == "default") { + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + } + } + } + echo "
Park ExtensionTimeCID NameCID Number
*".$row['extension']."".$row['call_length']."".$row['cid_name']."".$row['cid_num']."
\n"; + } + + echo "

\n"; + + if ($user_status == "Available (On Demand)") { + $user_status = "Available_On_Demand"; + } + $user_status = str_replace(" ", "_", $user_status); + echo "\n"; + echo "
\n"; + echo "
\n"; + } +?> diff --git a/app/calls_active/v_calls_active_inc.php b/app/calls_active/v_calls_active_inc.php new file mode 100644 index 0000000000..65864277c0 --- /dev/null +++ b/app/calls_active/v_calls_active_inc.php @@ -0,0 +1,172 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('calls_active_view')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +//set the command + $switch_cmd = 'show channels'; +//create the event socket connection + $fp = event_socket_create($_SESSION['event_socket_ip_address'], $_SESSION['event_socket_port'], $_SESSION['event_socket_password']); +//if the connnection is available then run it and return the results + if (!$fp) { + $msg = "
Connection to Event Socket failed.
"; + echo "
\n"; + echo "
\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "
Message
$msg
\n"; + echo "\n"; + } + else { + //send the event socket command + $csv = trim(event_socket_request($fp, 'api '.$switch_cmd)); + //prepare the string + $result_array = explode("\n\n",$csv); + //get the named array + $result_array = csv_to_named_array($result_array[0], ","); + + //set the alternating color for each row + $c = 0; + $row_style["0"] = "row_style0"; + $row_style["1"] = "row_style1"; + + //show the results + echo "
\n"; + echo "
\n"; + + echo "\n"; + echo "\n"; + //echo "\n"; + //echo "\n"; + //echo "\n"; + echo "\n"; + echo "\n"; + //echo "\n"; + //echo "\n"; + echo "\n"; + //echo "\n"; + echo "\n"; + echo "\n"; + //echo "\n"; + echo "\n"; + echo "\n"; + //echo "\n"; + //echo "\n"; + echo "\n"; + //echo "\n"; + //echo "\n"; + //echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + foreach ($result_array as $row) { + //set the php variables + foreach ($row as $key => $value) { + $$key = $value; + } + + //get the sip profile + $name_array = explode("/", $name); + $sip_profile = $name_array[1]; + $sip_uri = $name_array[2]; + + //get the number + $temp_array = explode("@", $sip_uri); + $tmp_number = $temp_array[0]; + $tmp_number = str_replace("sip:", "", $tmp_number); + + //remove the '+' because it breaks the call recording + $cid_num = str_replace("+", "", $cid_num); + + echo "\n"; + //echo "\n"; + //echo "\n"; + //echo "\n"; + echo "\n"; + echo "\n"; + //echo "\n"; + //echo "\n"; + echo "\n"; + //echo "\n"; + echo "\n"; + echo "\n"; + //echo "\n"; + echo "\n"; + if (strlen($application) > 0) { + echo "\n"; + } + else { + echo "\n"; + } + //echo "\n"; + //echo "\n"; + echo "\n"; + //echo "\n"; + //echo "\n"; + //echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + if ($c==0) { $c=1; } else { $c=0; } + } + echo "\n"; + echo "\n"; + echo "
IDUUIDDirProfileCreatedCreated EpochNameNumberStateCID NameCID NumberIP AddrDestApplicationDialplanContextRead / Write CodecRead RateWrite CodecWrite RateSecureOptions
$id  $uuid  $direction  $sip_profile  $created  $created_epoch  $name  ".$tmp_number." $state  $cid_name  $cid_num  $ip_addr  $dest  ".$application.":".$application_data."   $dialplan  $context  $read_codec:$read_rate / $write_codec:$write_rate  $read_rate  $write_codec  $write_rate  $secure  \n"; + //transfer + echo " Transfer To';\" onclick=\"send_cmd('v_calls_exec.php?cmd='+get_transfer_cmd(escape('$uuid')));\">xfer \n"; + //park + echo " park \n"; + //hangup + echo " hangup \n"; + //record start/stop + $tmp_dir = $_SESSION['switch']['recordings']['dir']."/archive/".date("Y")."/".date("M")."/".date("d"); + mkdir($tmp_dir, 0777, true); + $tmp_file = $tmp_dir."/".$uuid.".wav"; + if (file_exists($tmp_file)) { + //stop + echo " stop rec \n"; + } + else { + //start + echo " rec \n"; + } + echo "  "; + echo "
\n"; + } +?> diff --git a/app/calls_active/v_calls_exec.php b/app/calls_active/v_calls_exec.php new file mode 100644 index 0000000000..0bdf087ab2 --- /dev/null +++ b/app/calls_active/v_calls_exec.php @@ -0,0 +1,259 @@ +0) { + $switch_cmd = trim($_GET["cmd"]); + $action = trim($_GET["action"]); + $data = trim($_GET["data"]); + $direction = trim($_GET["direction"]); + $username = $_SESSION['username']; + } + +//authorized commands + if (stristr($switch_cmd, '&uuid=') == true) { + //authorized; + } elseif (stristr($switch_cmd, 'uuid_kill') == true) { + //authorized; + } elseif (stristr($switch_cmd, 'uuid_transfer') == true) { + //authorized; + } elseif (stristr($switch_cmd, 'uuid_record') == true) { + //authorized; + } elseif (stristr($action, 'user_status') == true) { + //authorized; + } elseif (stristr($action, 'callcenter_config') == true) { + //authorized; + } else { + //not found. this command is not authorized + echo "access denied"; + exit; + } + + +if (count($_GET)>0) { + + //setup the event socket connection + $fp = event_socket_create($_SESSION['event_socket_ip_address'], $_SESSION['event_socket_port'], $_SESSION['event_socket_password']); + + if (stristr($action, 'user_status') == true) { + $user_status = $data; + switch ($user_status) { + case "Available": + $user_status = "Available"; + //update the user state + $cmd = "api callcenter_config agent set state ".$username."@".$_SESSION['domain_name']." Waiting"; + $response = event_socket_request($fp, $cmd); + break; + case "Available_On_Demand": + $user_status = "Available (On Demand)"; + //update the user state + $cmd = "api callcenter_config agent set state ".$username."@".$_SESSION['domain_name']." Waiting"; + $response = event_socket_request($fp, $cmd); + break; + case "Logged_Out": + $user_status = "Logged Out"; + //update the user state + $cmd = "api callcenter_config agent set state ".$username."@".$_SESSION['domain_name']." Waiting"; + $response = event_socket_request($fp, $cmd); + break; + case "On_Break": + $user_status = "On Break"; + //update the user state + $cmd = "api callcenter_config agent set state ".$username."@".$_SESSION['domain_name']." Waiting"; + $response = event_socket_request($fp, $cmd); + break; + case "Do_Not_Disturb": + $user_status = "Do Not Disturb"; + //update the user state + $cmd = "api callcenter_config agent set state ".$username."@".$_SESSION['domain_name']." Waiting"; + $response = event_socket_request($fp, $cmd); + break; + default: + $user_status = ""; + } + + //update the v_users table with the status + $sql = "update v_users set "; + $sql .= "user_status = '$user_status' "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and username = '".$username."' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + + if (strlen($user_status) > 0) { + //include the dnd class + include "includes/classes/do_not_disturb.php"; + //loop through the list of assigned extensions + foreach ($_SESSION['user']['extension'] as &$row) { + $extension = $row["user"]; + + //set the default action + if ($user_status == "Do Not Disturb") { + $dnd_action = "add"; + } + + //hunt_group information used to determine if this is an add or an update + $sql = "select * from v_hunt_groups "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and hunt_group_extension = '$extension' "; + $prep_statement_2 = $db->prepare(check_sql($sql)); + $prep_statement_2->execute(); + $result2 = $prep_statement_2->fetchAll(PDO::FETCH_NAMED); + foreach ($result2 as &$row2) { + if ($row2["hunt_group_type"] == 'dnd') { + $dnd_action = "update"; + $dnd_uuid = $row2["hunt_group_uuid"]; + } + } + unset ($prep_statement_2, $result, $row2); + + //add or update dnd + $dnd = new do_not_disturb; + $dnd->domain_uuid = $domain_uuid; + $dnd->dnd_uuid = $dnd_uuid; + $dnd->domain_name = $_SESSION['domain_name']; + $dnd->extension = $extension; + if ($user_status == "Do Not Disturb") { + $dnd->dnd_enabled = "true"; + if ($dnd_action == "add") { + $dnd->dnd_add(); + } + if ($dnd_action == "update") { + $dnd->dnd_update(); + } + } + else { + //for other status disable dnd + if ($dnd_action == "update") { + $dnd->dnd_enabled = "false"; + $dnd->dnd_update(); + } + } + $dnd->debug = false; + $dnd->dnd_status(); + unset($dnd); + } + unset ($prep_statement); + } + + //synchronize the xml config + save_hunt_group_xml(); + + //synchronize the xml config + save_dialplan_xml(); + + //reloadxml + $cmd = 'api reloadxml'; + $response = event_socket_request($fp, $cmd); + + //apply settings reminder + $_SESSION["reload_xml"] = false; + } + + //fs cmd + if (strlen($switch_cmd) > 0) { + + //set the status so they are compatible with mod_callcenter + $switch_cmd = str_replace("Available_On_Demand", "'Available (On Demand)'", $switch_cmd); + $switch_cmd = str_replace("Logged_Out", "'Logged Out'", $switch_cmd); + $switch_cmd = str_replace("On_Break", "'On Break'", $switch_cmd); + $switch_cmd = str_replace("Do_Not_Disturb", "'Logged Out'", $switch_cmd); + + /* + //if ($action == "energy") { + //conference 3001-example.org energy 103 + $switch_result = event_socket_request($fp, 'api '.$switch_cmd); + $result_array = explode("=",$switch_result); + $tmp_value = $result_array[1]; + //if ($direction == "up") { $tmp_value = $tmp_value + 100; } + //if ($direction == "down") { $tmp_value = $tmp_value - 100; } + //echo "energy $tmp_value
\n"; + $switch_result = event_socket_request($fp, 'api '.$switch_cmd.' '.$tmp_value); + //} + if ($action == "volume_in") { + $switch_result = event_socket_request($fp, 'api '.$switch_cmd); + $result_array = explode("=",$switch_result); + $tmp_value = $result_array[1]; + if ($direction == "up") { $tmp_value = $tmp_value + 1; } + if ($direction == "down") { $tmp_value = $tmp_value - 1; } + //echo "volume $tmp_value
\n"; + $switch_result = event_socket_request($fp, 'api '.$switch_cmd.' '.$tmp_value); + } + if ($action == "volume_out") { + $switch_result = event_socket_request($fp, 'api '.$switch_cmd); + $result_array = explode("=",$switch_result); + $tmp_value = $result_array[1]; + if ($direction == "up") { $tmp_value = $tmp_value + 1; } + if ($direction == "down") { $tmp_value = $tmp_value - 1; } + //echo "volume $tmp_value
\n"; + $switch_result = event_socket_request($fp, 'api '.$switch_cmd.' '.$tmp_value); + } + */ + + $switch_result = event_socket_request($fp, 'api '.$switch_cmd); + if ($action == "record") { + if (trim($_GET["action2"]) == "stop") { + $x=0; + while (true) { + if ($x > 0) { + $dest_file = $_SESSION['switch']['recordings']['dir']."/archive/".date("Y")."/".date("M")."/".date("d")."/".$_GET["uuid"]."_".$x.".wav"; + } + else { + $dest_file = $_SESSION['switch']['recordings']['dir']."/archive/".date("Y")."/".date("M")."/".date("d")."/".$_GET["uuid"].".wav"; + } + if (!file_exists($dest_file)) { + rename($_SESSION['switch']['recordings']['dir']."/archive/".date("Y")."/".date("M")."/".date("d")."/".$_GET["uuid"].".wav", $dest_file); + break; + } + $x++; + } + } + } + } +} + +?> diff --git a/app/click_to_call/app_config.php b/app/click_to_call/app_config.php new file mode 100644 index 0000000000..4df738cbfb --- /dev/null +++ b/app/click_to_call/app_config.php @@ -0,0 +1,30 @@ + \ No newline at end of file diff --git a/app/click_to_call/click_to_call.php b/app/click_to_call/click_to_call.php new file mode 100644 index 0000000000..a89608e38a --- /dev/null +++ b/app/click_to_call/click_to_call.php @@ -0,0 +1,331 @@ + 0) { + $context = $_SESSION['context']; + } + else { + $context = 'default'; + } + + //translate ringback + switch ($ringback) { + case "us-ring": + $ringback_value = "\'%(2000,4000,440.0,480.0)\'"; + break; + case "uk-ring": + $ringback_value = "\'%(400,200,400,450);%(400,2200,400,450)\'"; + break; + case "fr-ring": + $ringback_value = "\'%(1500,3500,440.0,0.0)\'"; + break; + case "rs-ring": + $ringback_value = "\'%(1000,4000,425.0,0.0)\'"; + break; + case "music": + $ringback_value = "\'local_stream://moh\'"; + break; + default: + $ringback = 'us-ring'; + $ringback_value = "\'%(2000,4000,440.0,480.0)\'"; + } + + //source should see the destination caller id + if (strlen($src) < 7) { + $source = "{origination_caller_id_name='$src_cid_name',origination_caller_id_number=$src_cid_number,instant_ringback=true,ringback=$ringback_value,presence_id=$src@".$_SESSION['domains'][$domain_uuid]['domain_name'].",call_direction=outbound}sofia/internal/$src%".$_SESSION['domains'][$domain_uuid]['domain_name']; + } + else { + $bridge_array = outbound_route_to_bridge ($src); + $source = "{origination_caller_id_name='$src_cid_name',origination_caller_id_number=$src_cid_number,instant_ringback=true,ringback=$ringback_value,presence_id=$src@".$_SESSION['domains'][$domain_uuid]['domain_name'].",call_direction=outbound}".$bridge_array[0]; + } + + //destination needs to see the source caller id + if (strlen($dest) < 7) { + $switch_cmd = "api originate $source &transfer('".$dest." XML ".$context."')"; + } + else { + if (strlen($src) < 7) { + if (strlen($dest_cid_number) == 0) { + //get the caller id from the extension caller id comes from the extension (the source number) + $sql = ""; + $sql .= "select * from v_extensions "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and extension = '$src' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach ($result as &$row) { + $dest_cid_name = $row["outbound_caller_id_name"]; + $dest_cid_number = $row["outbound_caller_id_number"]; + break; //limit to 1 row + } + unset ($prep_statement); + } + } + $bridge_array = outbound_route_to_bridge ($dest); + $destination = "{origination_caller_id_name='$dest_cid_name',origination_caller_id_number=$dest_cid_number}".$bridge_array[0]; + if (permission_exists('click_to_call_call')) { + $switch_cmd = "api originate $source &bridge($destination)"; + } + } + + //display the last command + echo "
\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "
Message
$switch_cmd $src has called $dest
\n"; + echo "
\n"; + + //create the even socket connection and send the event socket command + $fp = event_socket_create($_SESSION['event_socket_ip_address'], $_SESSION['event_socket_port'], $_SESSION['event_socket_password']); + if (!$fp) { + //show the error message + $msg = "
Connection to Event Socket failed.
"; + echo "
\n"; + echo "\n"; + echo "\n"; + echo " \n"; + echo "\n"; + echo "\n"; + echo " \n"; + echo "\n"; + echo "
Message
$msg
\n"; + echo "
\n"; + } + else { + //show the command result + $result = trim(event_socket_request($fp, $switch_cmd)); + if (substr($result, 0,3) == "+OK") { + $uuid = substr($result, 4); + if ($rec == "true") { + //use the server's time zone to ensure it matches the time zone used by freeswitch + date_default_timezone_set($_SESSION['time_zone']['system']); + //create the api record command and send it over event socket + $switch_cmd = "api uuid_record ".$uuid." start ".$_SESSION['switch']['recordings']['dir']."/archive/".date("Y")."/".date("M")."/".date("d")."/".$uuid.".wav"; + $result2 = trim(event_socket_request($fp, $switch_cmd)); + } + } + echo "
\n"; + echo "
\n"; + echo $result; + echo "
\n"; + echo "
\n"; + echo "
\n"; + } +} + +//show html form + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo " \n"; + echo " Click to Call\n"; + echo " \n"; + echo " \n"; + echo "  \n"; + echo "
\n"; + echo " \n"; + echo " Provide the following information to make a call from the source number to the destination number.\n"; + echo " \n"; + echo "
"; + + echo "
"; + + echo "
\n"; + echo "\n"; + echo " \n"; + echo " \n"; + echo "\n"; + + echo "\n"; + echo " \n"; + echo " \n"; + echo "\n"; + + echo "\n"; + echo " \n"; + echo " \n"; + echo "\n"; + + echo "\n"; + echo " \n"; + echo " \n"; + echo "\n"; + + echo "\n"; + echo " \n"; + echo " \n"; + echo "\n"; + + echo "\n"; + echo " \n"; + echo " \n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo " \n"; + echo "\n"; + echo "
Source Caller ID Name:\n"; + echo " \n"; + echo "
\n"; + echo " Enter the name to show to the source caller.\n"; + echo "
Source Caller ID Number:\n"; + echo " \n"; + echo "
\n"; + echo " Enter the number to show to the source caller.\n"; + echo "
Destination Caller ID Name:\n"; + echo " \n"; + echo "
\n"; + echo " Enter the name to send to the destination callee.\n"; + echo "
Destination Caller ID Number:\n"; + echo " \n"; + echo "
\n"; + echo " Enter the number to show to the destination callee.\n"; + echo "
Source Number:\n"; + echo " \n"; + echo "
\n"; + echo " Enter the number to call from.\n"; + echo "
Destination Number:\n"; + echo " \n"; + echo "
\n"; + echo " Enter the number to call.\n"; + echo "
\n"; + echo " Record:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Select whether to record the call.\n"; + echo "
\n"; + echo " Ring Back:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Defines what the caller will hear while destination is being called. The choices are music (music on hold) ring (ring tone.)\n"; + echo "
\n"; + echo " \n"; + echo "
\n"; + echo "
"; + +//show the footer + require_once "includes/footer.php"; +?> diff --git a/app/click_to_call/root.php b/app/click_to_call/root.php new file mode 100644 index 0000000000..7b882438ea --- /dev/null +++ b/app/click_to_call/root.php @@ -0,0 +1,50 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ + +// make sure the PATH_SEPARATOR is defined + if (!defined("PATH_SEPARATOR")) { + if ( strpos( $_ENV[ "OS" ], "Win" ) !== false ) { define("PATH_SEPARATOR", ";"); } else { define("PATH_SEPARATOR", ":"); } + } + +// make sure the document_root is set + $_SERVER["SCRIPT_FILENAME"] = str_replace("\\", "/", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = str_replace($_SERVER["PHP_SELF"], "", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = realpath($_SERVER["DOCUMENT_ROOT"]); + //echo "DOCUMENT_ROOT: ".$_SERVER["DOCUMENT_ROOT"]."
\n"; + //echo "PHP_SELF: ".$_SERVER["PHP_SELF"]."
\n"; + //echo "SCRIPT_FILENAME: ".$_SERVER["SCRIPT_FILENAME"]."
\n"; + +// if the project directory exists then add it to the include path otherwise add the document root to the include path + if (is_dir($_SERVER["DOCUMENT_ROOT"].'/fusionpbx')){ + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', '/fusionpbx'); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER["DOCUMENT_ROOT"].'/fusionpbx' ); + } + else { + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', ''); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER['DOCUMENT_ROOT'] ); + } + +?> \ No newline at end of file diff --git a/app/conferences/app_config.php b/app/conferences/app_config.php new file mode 100644 index 0000000000..0adabb693b --- /dev/null +++ b/app/conferences/app_config.php @@ -0,0 +1,140 @@ + \ No newline at end of file diff --git a/app/conferences/conferences.php b/app/conferences/conferences.php new file mode 100644 index 0000000000..a53688a6cc --- /dev/null +++ b/app/conferences/conferences.php @@ -0,0 +1,202 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require_once "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('conference_view')) { + //access granted +} +else { + echo "access denied"; + exit; +} +require_once "includes/header.php"; +require_once "includes/paging.php"; + +//get variables used to control the order + $order_by = $_GET["order_by"]; + $order = $_GET["order"]; + +//show the content + echo "
"; + echo "\n"; + echo "\n"; + echo " "; + echo ""; + echo "
\n"; + echo "
"; + + echo "\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "
Conferences 
\n"; + echo " Conferences is used to setup conference rooms with a name, description, and optional pin number. \n"; + if (permission_exists('conferences_active_advanced_view')) { + echo " Show Active Conferences and then select a conference to monitor and interact with it.

\n"; + } + echo "
\n"; + + //prepare to page the results + if (if_group("superadmin") || if_group("admin")) { + //show all extensions + $sql = "select count(*) as num_rows from v_conferences "; + $sql .= "where domain_uuid = '".$_SESSION['domain_uuid']."' "; + } + else { + //show only assigned extensions + $sql = "select count(*) as num_rows from v_conferences as c, v_conference_users as u "; + $sql .= "where c.conference_uuid = u.conference_uuid "; + $sql .= "and c.domain_uuid = '".$_SESSION['domain_uuid']."' "; + $sql .= "and u.user_uuid = '".$_SESSION['user_uuid']."' "; + } + if (strlen($order_by)> 0) { $sql .= "order by $order_by $order "; } + $prep_statement = $db->prepare($sql); + if ($prep_statement) { + $prep_statement->execute(); + $row = $prep_statement->fetch(PDO::FETCH_ASSOC); + if ($row['num_rows'] > 0) { + $num_rows = $row['num_rows']; + } + else { + $num_rows = '0'; + } + } + + //prepare to page the results + $rows_per_page = 10; + $param = ""; + $page = $_GET['page']; + if (strlen($page) == 0) { $page = 0; $_GET['page'] = 0; } + list($paging_controls, $rows_per_page, $var3) = paging($num_rows, $param, $rows_per_page); + $offset = $rows_per_page * $page; + + //get the list + if (if_group("superadmin") || if_group("admin")) { + //show all extensions + $sql = "select * from v_conferences "; + $sql .= "where domain_uuid = '".$_SESSION['domain_uuid']."' "; + } + else { + //show only assigned extensions + $sql = "select * from v_conferences as c, v_conference_users as u "; + $sql .= "where c.conference_uuid = u.conference_uuid "; + $sql .= "and c.domain_uuid = '".$_SESSION['domain_uuid']."' "; + $sql .= "and u.user_uuid = '".$_SESSION['user_uuid']."' "; + } + if (strlen($order_by)> 0) { $sql .= "order by $order_by $order "; } + $sql .= " limit $rows_per_page offset $offset "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(); + $result_count = count($result); + unset ($prep_statement, $sql); + + $c = 0; + $row_style["0"] = "row_style0"; + $row_style["1"] = "row_style1"; + + echo "
\n"; + echo "\n"; + echo "\n"; + echo th_order_by('conference_name', 'Name', $order_by, $order); + echo th_order_by('conference_extension', 'Extension', $order_by, $order); + echo th_order_by('conference_profile', 'Profile', $order_by, $order); + //echo th_order_by('conference_flags', 'Flags', $order_by, $order); + echo th_order_by('conference_order', 'Order', $order_by, $order); + echo th_order_by('conference_enabled', 'Enabled', $order_by, $order); + echo th_order_by('conference_description', 'Description', $order_by, $order); + echo "\n"; + echo "\n"; + + if ($result_count > 0) { + foreach($result as $row) { + $conference_name = $row['conference_name']; + $conference_name = str_replace("-", " ", $conference_name); + echo "\n"; + echo " \n"; + echo " \n"; + echo " \n"; + //echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "\n"; + if ($c==0) { $c=1; } else { $c=0; } + } //end foreach + unset($sql, $result, $row_count); + } //end if results + + echo "\n"; + echo "\n"; + echo "\n"; + + echo "
\n"; + if (permission_exists('conference_add')) { + echo " $v_link_label_add\n"; + } + else { + echo "  \n"; + } + echo "
".$conference_name." ".$row['conference_extension']." ".$row['conference_profile']." ".$row['conference_flags']." ".$row['conference_order']." ".$row['conference_enabled']." ".$row['conference_description']." \n"; + if (permission_exists('conference_edit')) { + echo " $v_link_label_edit\n"; + } + if (permission_exists('conference_delete')) { + echo " $v_link_label_delete\n"; + } + echo "
\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "
 $paging_controls\n"; + if (permission_exists('conference_add')) { + echo " $v_link_label_add\n"; + } + else { + echo "  \n"; + } + echo "
\n"; + echo "
"; + echo "
"; + echo "

"; + echo "

"; + + echo "
"; + echo "
"; + echo "

"; + +//include the footer + require_once "includes/footer.php"; +?> \ No newline at end of file diff --git a/app/conferences/conferences_delete.php b/app/conferences/conferences_delete.php new file mode 100644 index 0000000000..f80941b3a3 --- /dev/null +++ b/app/conferences/conferences_delete.php @@ -0,0 +1,91 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require_once "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('conference_delete')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +if (count($_GET)>0) { + $id = check_str($_GET["id"]); +} + +if (strlen($id)>0) { + + //get the dialplan uuid + $sql = "select * from v_conferences "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and conference_uuid = '$id' "; + $prep_statement = $db->prepare($sql); + $prep_statement->execute(); + while($row = $prep_statement->fetch(PDO::FETCH_ASSOC)) { + $dialplan_uuid = $row['dialplan_uuid']; + } + + //delete conference + $sql = "delete from v_conferences "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and conference_uuid = '$id' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + unset($sql); + + //delete the dialplan entry + $sql = "delete from v_dialplans "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and dialplan_uuid = '$dialplan_uuid' "; + $db->query($sql); + unset($sql); + + //delete the dialplan details + $sql = "delete from v_dialplan_details "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and dialplan_uuid = '$dialplan_uuid' "; + $db->query($sql); + unset($sql); + + //syncrhonize configuration + save_dialplan_xml(); + + //apply settings reminder + $_SESSION["reload_xml"] = true; +} + +//redirect the user + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Delete Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + +?> \ No newline at end of file diff --git a/app/conferences/conferences_edit.php b/app/conferences/conferences_edit.php new file mode 100644 index 0000000000..79013ff6a0 --- /dev/null +++ b/app/conferences/conferences_edit.php @@ -0,0 +1,541 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require_once "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('conference_add') || permission_exists('conference_edit')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +//action add or update + if (isset($_REQUEST["id"])) { + $action = "update"; + $conference_uuid = check_str($_REQUEST["id"]); + } + else { + $action = "add"; + } + +//get http post variables and set them to php variables + if (count($_POST)>0) { + $dialplan_uuid = check_str($_POST["dialplan_uuid"]); + $conference_name = check_str($_POST["conference_name"]); + $conference_extension = check_str($_POST["conference_extension"]); + $conference_pin_number = check_str($_POST["conference_pin_number"]); + $conference_profile = check_str($_POST["conference_profile"]); + $conference_flags = check_str($_POST["conference_flags"]); + $conference_order = check_str($_POST["conference_order"]); + $conference_description = check_str($_POST["conference_description"]); + $conference_enabled = check_str($_POST["conference_enabled"]); + + //sanitize the conference name + $conference_name = preg_replace("/[^A-Za-z0-9\- ]/", "", $conference_name); + $conference_name = str_replace(" ", "-", $conference_name); + } + +//delete the user from the v_conference_users + if ($_GET["a"] == "delete" && permission_exists("conference_delete")) { + //set the variables + $user_uuid = check_str($_REQUEST["user_uuid"]); + $conference_uuid = check_str($_REQUEST["id"]); + //delete the group from the users + $sql = "delete from v_conference_users "; + $sql .= "where domain_uuid = '".$_SESSION['domain_uuid']."' "; + $sql .= "and conference_uuid = '".$conference_uuid."' "; + $sql .= "and user_uuid = '".$user_uuid."' "; + $db->exec(check_sql($sql)); + //redirect the browser + require_once "includes/header.php"; + echo "\n"; + echo "
Delete Complete
"; + require_once "includes/footer.php"; + return; + } + +//add the user to the v_conference_users + if (strlen($_REQUEST["user_uuid"]) > 0 && strlen($_REQUEST["id"]) > 0 && $_GET["a"] != "delete") { + //set the variables + $user_uuid = check_str($_REQUEST["user_uuid"]); + $conference_uuid = check_str($_REQUEST["id"]); + //assign the user to the extension + $sql_insert = "insert into v_conference_users "; + $sql_insert .= "("; + $sql_insert .= "conference_user_uuid, "; + $sql_insert .= "domain_uuid, "; + $sql_insert .= "conference_uuid, "; + $sql_insert .= "user_uuid "; + $sql_insert .= ")"; + $sql_insert .= "values "; + $sql_insert .= "("; + $sql_insert .= "'".uuid()."', "; + $sql_insert .= "'".$_SESSION['domain_uuid']."', "; + $sql_insert .= "'".$conference_uuid."', "; + $sql_insert .= "'".$user_uuid."' "; + $sql_insert .= ")"; + $db->exec($sql_insert); + //redirect the browser + require_once "includes/header.php"; + echo "\n"; + echo "
Add Complete
"; + require_once "includes/footer.php"; + return; + } + +if (count($_POST)>0 && strlen($_POST["persistformvar"]) == 0) { + + $msg = ''; + if ($action == "update") { + $conference_uuid = check_str($_POST["conference_uuid"]); + } + + //check for all required data + //if (strlen($dialplan_uuid) == 0) { $msg .= "Please provide: Dialplan UUID
\n"; } + if (strlen($conference_name) == 0) { $msg .= "Please provide: Name
\n"; } + if (strlen($conference_extension) == 0) { $msg .= "Please provide: Extension
\n"; } + //if (strlen($conference_pin_number) == 0) { $msg .= "Please provide: Pin Number
\n"; } + if (strlen($conference_profile) == 0) { $msg .= "Please provide: Profile
\n"; } + //if (strlen($conference_flags) == 0) { $msg .= "Please provide: Flags
\n"; } + //if (strlen($conference_order) == 0) { $msg .= "Please provide: Order
\n"; } + //if (strlen($conference_description) == 0) { $msg .= "Please provide: Description
\n"; } + if (strlen($conference_enabled) == 0) { $msg .= "Please provide: Enabled
\n"; } + if (strlen($msg) > 0 && strlen($_POST["persistformvar"]) == 0) { + require_once "includes/header.php"; + require_once "includes/persistformvar.php"; + echo "
\n"; + echo "
\n"; + echo $msg."
"; + echo "
\n"; + persistformvar($_POST); + echo "
\n"; + require_once "includes/footer.php"; + return; + } + + //add or update the database + if ($_POST["persistformvar"] != "true") { + if ($action == "add") { + //prepare the uuids + $conference_uuid = uuid(); + $dialplan_uuid = uuid(); + //add the conference + $sql = "insert into v_conferences "; + $sql .= "("; + $sql .= "domain_uuid, "; + $sql .= "conference_uuid, "; + $sql .= "dialplan_uuid, "; + $sql .= "conference_name, "; + $sql .= "conference_extension, "; + $sql .= "conference_pin_number, "; + $sql .= "conference_profile, "; + $sql .= "conference_flags, "; + $sql .= "conference_order, "; + $sql .= "conference_description, "; + $sql .= "conference_enabled "; + $sql .= ")"; + $sql .= "values "; + $sql .= "("; + $sql .= "'$domain_uuid', "; + $sql .= "'$conference_uuid', "; + $sql .= "'$dialplan_uuid', "; + $sql .= "'$conference_name', "; + $sql .= "'$conference_extension', "; + $sql .= "'$conference_pin_number', "; + $sql .= "'$conference_profile', "; + $sql .= "'$conference_flags', "; + $sql .= "'$conference_order', "; + $sql .= "'$conference_description', "; + $sql .= "'$conference_enabled' "; + $sql .= ")"; + $db->exec(check_sql($sql)); + unset($sql); + + //create the dialplan entry + $dialplan_name = $conference_name; + $dialplan_order ='333'; + $dialplan_context = $_SESSION['context']; + $dialplan_enabled = 'true'; + $dialplan_description = $conference_description; + $app_uuid = 'b81412e8-7253-91f4-e48e-42fc2c9a38d9'; + dialplan_add($_SESSION['domain_uuid'], $dialplan_uuid, $dialplan_name, $dialplan_order, $dialplan_context, $dialplan_enabled, $dialplan_description, $app_uuid); + + // + $dialplan_detail_tag = 'condition'; //condition, action, antiaction + $dialplan_detail_type = 'destination_number'; + $dialplan_detail_data = '^'.$conference_extension.'$'; + $dialplan_detail_order = '000'; + $dialplan_detail_group = '2'; + dialplan_detail_add($_SESSION['domain_uuid'], $dialplan_uuid, $dialplan_detail_tag, $dialplan_detail_order, $dialplan_detail_group, $dialplan_detail_type, $dialplan_detail_data); + + // + $dialplan_detail_tag = 'action'; //condition, action, antiaction + $dialplan_detail_type = 'answer'; + $dialplan_detail_data = ''; + $dialplan_detail_order = '010'; + $dialplan_detail_group = '2'; + dialplan_detail_add($_SESSION['domain_uuid'], $dialplan_uuid, $dialplan_detail_tag, $dialplan_detail_order, $dialplan_detail_group, $dialplan_detail_type, $dialplan_detail_data); + + // + $dialplan_detail_tag = 'action'; //condition, action, antiaction + $dialplan_detail_type = 'conference'; + $pin_number = ''; if (strlen($conference_pin_number) > 0) { $pin_number = "+".$conference_pin_number; } + $flags = ''; if (strlen($conference_flags) > 0) { $flags = "+flags{".$conference_flags."}"; } + $dialplan_detail_data = $conference_name.'-'.$_SESSION['domain_name']."@".$conference_profile.$pin_number.$flags; + $dialplan_detail_order = '020'; + $dialplan_detail_group = '2'; + dialplan_detail_add($_SESSION['domain_uuid'], $dialplan_uuid, $dialplan_detail_tag, $dialplan_detail_order, $dialplan_detail_group, $dialplan_detail_type, $dialplan_detail_data); + + //save the xml + save_dialplan_xml(); + + //apply settings reminder + $_SESSION["reload_xml"] = true; + + //redirect the browser + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Add Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + } //if ($action == "add") + + if ($action == "update") { + //update the conference extension + $sql = "update v_conferences set "; + $sql .= "conference_name = '$conference_name', "; + $sql .= "conference_extension = '$conference_extension', "; + $sql .= "conference_pin_number = '$conference_pin_number', "; + $sql .= "conference_profile = '$conference_profile', "; + $sql .= "conference_flags = '$conference_flags', "; + $sql .= "conference_order = '$conference_order', "; + $sql .= "conference_description = '$conference_description', "; + $sql .= "conference_enabled = '$conference_enabled' "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and conference_uuid = '$conference_uuid'"; + $db->exec(check_sql($sql)); + unset($sql); + + //udpate the conference dialplan + $sql = "update v_dialplans set "; + $sql .= "dialplan_name = '$conference_name', "; + if (strlen($dialplan_order) > 0) { + $sql .= "dialplan_order = '333', "; + } + $sql .= "dialplan_context = '".$_SESSION['context']."', "; + $sql .= "dialplan_enabled = 'true', "; + $sql .= "dialplan_description = '$conference_description' "; + $sql .= "where domain_uuid = '".$_SESSION['domain_uuid']."' "; + $sql .= "and dialplan_uuid = '$dialplan_uuid' "; + $db->query($sql); + unset($sql); + + //update dialplan detail condition + $sql = ""; + $sql = "update v_dialplan_details set "; + $sql .= "dialplan_detail_data = '^".$conference_extension."$' "; + $sql .= "where domain_uuid = '".$_SESSION['domain_uuid']."' "; + $sql .= "and dialplan_detail_tag = 'condition' "; + $sql .= "and dialplan_detail_type = 'destination_number' "; + $sql .= "and dialplan_uuid = '$dialplan_uuid' "; + $db->query($sql); + unset($sql); + + //update dialplan detail action + $pin_number = ''; if (strlen($conference_pin_number) > 0) { $pin_number = "+".$conference_pin_number; } + $flags = ''; if (strlen($conference_flags) > 0) { $flags = "+flags{".$conference_flags."}"; } + $dialplan_detail_data = $conference_name.'-'.$_SESSION['domain_name']."@".$conference_profile.$pin_number.$flags; + $sql = "update v_dialplan_details set "; + $sql .= "dialplan_detail_data = '".$dialplan_detail_data."' "; + $sql .= "where domain_uuid = '".$_SESSION['domain_uuid']."' "; + $sql .= "and dialplan_detail_tag = 'action' "; + $sql .= "and dialplan_detail_type = 'conference' "; + $sql .= "and dialplan_uuid = '$dialplan_uuid' "; + $db->query($sql); + + //save the xml + save_dialplan_xml(); + + //apply settings reminder + $_SESSION["reload_xml"] = true; + + //redirect the browser + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Update Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + } //if ($action == "update") + } //if ($_POST["persistformvar"] != "true") +} //(count($_POST)>0 && strlen($_POST["persistformvar"]) == 0) + +//pre-populate the form + if (count($_GET)>0 && $_POST["persistformvar"] != "true") { + $conference_uuid = $_GET["id"]; + $sql = "select * from v_conferences "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and conference_uuid = '$conference_uuid' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(); + foreach ($result as &$row) { + $dialplan_uuid = $row["dialplan_uuid"]; + $conference_name = $row["conference_name"]; + $conference_extension = $row["conference_extension"]; + $conference_pin_number = $row["conference_pin_number"]; + $conference_profile = $row["conference_profile"]; + $conference_flags = $row["conference_flags"]; + $conference_order = $row["conference_order"]; + $conference_description = $row["conference_description"]; + $conference_enabled = $row["conference_enabled"]; + $conference_name = str_replace("-", " ", $conference_name); + } + unset ($prep_statement); + } + +//show the header + require_once "includes/header.php"; + +//show the content + echo "
"; + echo "\n"; + echo "\n"; + echo " "; + echo " "; + echo "
\n"; + echo "
"; + + echo "
\n"; + echo "
\n"; + echo "\n"; + echo "\n"; + if ($action == "add") { + echo "\n"; + } + if ($action == "update") { + echo "\n"; + } + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + if (if_group("admin") || if_group("superadmin")) { + if ($action == "update") { + echo " "; + echo " "; + echo " "; + echo " "; + } + } + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo " \n"; + echo " \n"; + echo " "; + echo "
Conference AddConference Edit
\n"; + echo "Conferences is used to setup conference rooms with a name, description, and optional pin number. \n"; + echo "Click on Active Conference \n"; + echo "to monitor and interact with the conference room.

\n"; + echo "
\n"; + echo " Name:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the conference name.\n"; + echo "
\n"; + echo " Extension:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the conference extension number.\n"; + echo "
\n"; + echo " Pin Number:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Optional pin number to secure access to the conference.\n"; + echo "
User List:"; + + echo " \n"; + $sql = "SELECT * FROM v_conference_users as e, v_users as u "; + $sql .= "where e.user_uuid = u.user_uuid "; + $sql .= "and e.domain_uuid = '".$_SESSION['domain_uuid']."' "; + $sql .= "and e.conference_uuid = '".$conference_uuid."' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_ASSOC); + $result_count = count($result); + foreach($result as $field) { + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + } + echo "
".$field['username']."\n"; + echo " $v_link_label_delete\n"; + echo "
\n"; + + echo "
\n"; + $sql = "SELECT * FROM v_users "; + $sql .= "where domain_uuid = '".$_SESSION['domain_uuid']."' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + echo " "; + echo " \n"; + unset($sql, $result); + echo "
\n"; + echo " Assign the users that are can manage this conference extension.\n"; + echo "
\n"; + echo "
\n"; + echo " Profile:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Conference Profile is a collection of settings for the conference.\n"; + echo "
\n"; + echo " Flags:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Optional conference flags. examples: mute|deaf|waste|moderator\n"; + echo "
\n"; + echo " Order:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the order number.\n"; + echo "
\n"; + echo " Enabled:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Select whether to enable or disable the conference.\n"; + echo "
\n"; + echo " Description:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the description.\n"; + echo "
\n"; + if ($action == "update") { + echo " \n"; + echo " \n"; + } + echo " \n"; + echo "
"; + echo ""; + + echo "
"; + echo "
"; + +//include the footer + require_once "includes/footer.php"; +?> \ No newline at end of file diff --git a/app/conferences/root.php b/app/conferences/root.php new file mode 100644 index 0000000000..7b882438ea --- /dev/null +++ b/app/conferences/root.php @@ -0,0 +1,50 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ + +// make sure the PATH_SEPARATOR is defined + if (!defined("PATH_SEPARATOR")) { + if ( strpos( $_ENV[ "OS" ], "Win" ) !== false ) { define("PATH_SEPARATOR", ";"); } else { define("PATH_SEPARATOR", ":"); } + } + +// make sure the document_root is set + $_SERVER["SCRIPT_FILENAME"] = str_replace("\\", "/", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = str_replace($_SERVER["PHP_SELF"], "", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = realpath($_SERVER["DOCUMENT_ROOT"]); + //echo "DOCUMENT_ROOT: ".$_SERVER["DOCUMENT_ROOT"]."
\n"; + //echo "PHP_SELF: ".$_SERVER["PHP_SELF"]."
\n"; + //echo "SCRIPT_FILENAME: ".$_SERVER["SCRIPT_FILENAME"]."
\n"; + +// if the project directory exists then add it to the include path otherwise add the document root to the include path + if (is_dir($_SERVER["DOCUMENT_ROOT"].'/fusionpbx')){ + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', '/fusionpbx'); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER["DOCUMENT_ROOT"].'/fusionpbx' ); + } + else { + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', ''); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER['DOCUMENT_ROOT'] ); + } + +?> \ No newline at end of file diff --git a/app/conferences_active/app_config.php b/app/conferences_active/app_config.php new file mode 100644 index 0000000000..20d9cb95b5 --- /dev/null +++ b/app/conferences_active/app_config.php @@ -0,0 +1,70 @@ + \ No newline at end of file diff --git a/app/conferences_active/root.php b/app/conferences_active/root.php new file mode 100644 index 0000000000..7b882438ea --- /dev/null +++ b/app/conferences_active/root.php @@ -0,0 +1,50 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ + +// make sure the PATH_SEPARATOR is defined + if (!defined("PATH_SEPARATOR")) { + if ( strpos( $_ENV[ "OS" ], "Win" ) !== false ) { define("PATH_SEPARATOR", ";"); } else { define("PATH_SEPARATOR", ":"); } + } + +// make sure the document_root is set + $_SERVER["SCRIPT_FILENAME"] = str_replace("\\", "/", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = str_replace($_SERVER["PHP_SELF"], "", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = realpath($_SERVER["DOCUMENT_ROOT"]); + //echo "DOCUMENT_ROOT: ".$_SERVER["DOCUMENT_ROOT"]."
\n"; + //echo "PHP_SELF: ".$_SERVER["PHP_SELF"]."
\n"; + //echo "SCRIPT_FILENAME: ".$_SERVER["SCRIPT_FILENAME"]."
\n"; + +// if the project directory exists then add it to the include path otherwise add the document root to the include path + if (is_dir($_SERVER["DOCUMENT_ROOT"].'/fusionpbx')){ + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', '/fusionpbx'); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER["DOCUMENT_ROOT"].'/fusionpbx' ); + } + else { + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', ''); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER['DOCUMENT_ROOT'] ); + } + +?> \ No newline at end of file diff --git a/app/conferences_active/v_conference_exec.php b/app/conferences_active/v_conference_exec.php new file mode 100644 index 0000000000..896f78bda6 --- /dev/null +++ b/app/conferences_active/v_conference_exec.php @@ -0,0 +1,126 @@ +0) { + $cmd = trim($_GET["cmd"]); + $name = trim($_GET["name"]); + $data = trim($_GET["data"]); + $id = trim($_GET["id"]); + $direction = trim($_GET["direction"]); + } + +//authorized commands + if ($cmd == "conference") { + //authorized; + } else { + //not found. this command is not authorized + echo "access denied"; + exit; + } + +//check if the domain is in the switch_cmd + if(stristr($name, $_SESSION['domain_name']) === FALSE) { + echo "access denied"; + exit; + } + +if (count($_GET)>0) { + if (strlen($cmd) > 0) { + //prepare the switch cmd + $switch_cmd = $cmd . " "; + $switch_cmd .= $name . " "; + $switch_cmd .= $data . " "; + if (strlen($id) > 0) { + $switch_cmd .= " ".$id; + } + + //connect to event socket + $fp = event_socket_create($_SESSION['event_socket_ip_address'], $_SESSION['event_socket_port'], $_SESSION['event_socket_password']); + if ($fp) { + if ($data == "energy") { + //conference 3001-example-domain.org energy 103 + $switch_result = event_socket_request($fp, 'api '.$switch_cmd); + $result_array = explode("=",$switch_result); + $tmp_value = $result_array[1]; + if ($direction == "up") { $tmp_value = $tmp_value + 100; } + if ($direction == "down") { $tmp_value = $tmp_value - 100; } + //echo "energy $tmp_value
\n"; + $switch_result = event_socket_request($fp, 'api '.$switch_cmd.' '.$tmp_value); + } + elseif ($data == "volume_in") { + $switch_result = event_socket_request($fp, 'api '.$switch_cmd); + $result_array = explode("=",$switch_result); + $tmp_value = $result_array[1]; + if ($direction == "up") { $tmp_value = $tmp_value + 1; } + if ($direction == "down") { $tmp_value = $tmp_value - 1; } + //echo "volume $tmp_value
\n"; + $switch_result = event_socket_request($fp, 'api '.$switch_cmd.' '.$tmp_value); + } + elseif ($data == "volume_out") { + $switch_result = event_socket_request($fp, 'api '.$switch_cmd); + $result_array = explode("=",$switch_result); + $tmp_value = $result_array[1]; + if ($direction == "up") { $tmp_value = $tmp_value + 1; } + if ($direction == "down") { $tmp_value = $tmp_value - 1; } + //echo "volume $tmp_value
\n"; + $switch_result = event_socket_request($fp, 'api '.$switch_cmd.' '.$tmp_value); + } + elseif ($data == "record") { + $switch_cmd .= $_SESSION['switch']['recordings']['dir']."/".$name."-tmp.wav"; + if (!file_exists($_SESSION['switch']['recordings']['dir']."/".$name."-tmp.wav")) { + $switch_result = event_socket_request($fp, "api ".$switch_cmd); + } + } + elseif ($data == "norecord") { + //stop recording and rename the file + if (file_exists($_SESSION['switch']['recordings']['dir']."/".$name."-tmp.wav")) { + rename($_SESSION['switch']['recordings']['dir']."/".$name."-tmp.wav", $_SESSION['switch']['recordings']['dir']."/".$name."-".date("Y").".".date("M").".".date("d")."-".uuid().".wav"); + } + $switch_cmd .= $_SESSION['switch']['recordings']['dir']."/".$name."-tmp.wav"; + $switch_result = event_socket_request($fp, 'api '.$switch_cmd); + } + else { + $switch_result = event_socket_request($fp, 'api '.$switch_cmd); + } + } + } +} + +?> \ No newline at end of file diff --git a/app/conferences_active/v_conference_interactive.php b/app/conferences_active/v_conference_interactive.php new file mode 100644 index 0000000000..273e548d79 --- /dev/null +++ b/app/conferences_active/v_conference_interactive.php @@ -0,0 +1,129 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('conferences_active_view')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +//get and prepare the conference name + $conference_name = check_str(trim($_REQUEST["c"])); + $conference_display_name = str_replace("-", " ", $conference_name); + $conference_display_name = str_replace("_", " ", $conference_display_name); + +//show the header + require_once "includes/header.php"; + +?> + +"; +echo "\n"; +echo " \n"; +echo " \n"; +echo " \n"; +echo "
Interactive Conference
\n"; +echo " Use this to monitor and interact with the members of the $conference_display_name conference.\n"; +echo "
\n"; +echo "\n"; +echo " \n"; +echo " "; +echo " "; +echo "
\n"; +echo "
\n"; +echo "
".date('Y-m-d-s')."
\n"; +echo "
"; +echo ""; + +//show the header + require_once "includes/footer.php"; +?> \ No newline at end of file diff --git a/app/conferences_active/v_conference_interactive_inc.php b/app/conferences_active/v_conference_interactive_inc.php new file mode 100644 index 0000000000..b9de5b2a46 --- /dev/null +++ b/app/conferences_active/v_conference_interactive_inc.php @@ -0,0 +1,263 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('conferences_active_view')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +//get the http get or post and set it as php variables + $conference_name = check_str($_REQUEST["c"]); + +//determine if the user should have access to the conference room + if (if_group("superadmin") || if_group("admin")) { + //access granted + } + else { + //get the conference_uuid from the coference_name + $sql = "select conference_uuid from v_conferences "; + $sql .= "where conference_name = '".$conference_name."' "; + $sql .= "and domain_uuid = '".$_SESSION['domain_uuid']."' "; + $prep_statement = $db->prepare($sql); + if ($prep_statement) { + $prep_statement->execute(); + $row = $prep_statement->fetch(PDO::FETCH_ASSOC); + $conference_uuid = $row['conference_uuid']; + } + + //show only assigned extensions + $sql = "select count(*) as num_rows from v_conferences as c, v_conference_users as u "; + $sql .= "where c.conference_uuid = u.conference_uuid "; + $sql .= "and c.conference_uuid = '".$conference_uuid."' "; + $sql .= "and c.domain_uuid = '".$_SESSION['domain_uuid']."' "; + $sql .= "and u.user_uuid = '".$_SESSION['user_uuid']."' "; + if (strlen($order_by)> 0) { $sql .= "order by $order_by $order "; } + $prep_statement = $db->prepare($sql); + if ($prep_statement) { + $prep_statement->execute(); + $row = $prep_statement->fetch(PDO::FETCH_ASSOC); + if ($row['num_rows'] == 0) { + echo "access denied"; + exit; + } + } + } + +//replace the space with underscore + $conference_name = $conference_name.'-'.$_SESSION['domain_name']; + +//create the conference list command + $switch_cmd = "conference '".$conference_name."' xml_list"; + +//connect to event socket, send the command and process the results + $fp = event_socket_create($_SESSION['event_socket_ip_address'], $_SESSION['event_socket_port'], $_SESSION['event_socket_password']); + if (!$fp) { + $msg = "
Connection to Event Socket failed.
"; + echo "
\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "
Message
$msg
\n"; + echo "
\n"; + } + else { + //show the content + $xml_str = trim(event_socket_request($fp, 'api '.$switch_cmd)); + try { + $xml = new SimpleXMLElement($xml_str); + } + catch(Exception $e) { + //echo $e->getMessage(); + } + //$name = $xml->conference['name']; + $member_count = $xml->conference['member-count']; + $locked = $xml->conference['locked']; + + $c = 0; + $row_style["0"] = "row_style0"; + $row_style["1"] = "row_style1"; + + echo "
\n"; + echo "
\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + //echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + foreach ($xml->conference->members->member as $row) { + $id = $row->id; + $record_path = $row->record_path; + $flag_can_hear = $row->flags->can_hear; + $flag_can_speak = $row->flags->can_speak; + $flag_talking = $row->flags->talking; + $last_talking = $row->last_talking; + $join_time = $row->join_time; + $flag_has_video = $row->flags->has_video; + $flag_has_floor = $row->flags->has_floor; + $uuid = $row->uuid; + $caller_id_name = $row->caller_id_name; + $caller_id_name = str_replace("%20", " ", $caller_id_name); + $caller_id_number = $row->caller_id_number; + + //format the seconds + $join_time_formatted = floor($join_time/60)."' ".($join_time - (floor($join_time/60))*60)."\""; + $last_talking_formatted = floor($last_talking/60)."' ".($last_talking - (floor($last_talking/60))*60)."\""; + + if (strlen($record_path) == 0) { + echo "\n"; + echo "\n"; + //echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + if ($flag_can_hear == "true") { + echo "\n"; + } + else { + echo "\n"; + } + if ($flag_can_speak == "true") { + echo "\n"; + } + else { + echo "\n"; + } + if ($flag_talking == "true") { + echo "\n"; + } + else { + echo "\n"; + } + echo "\n"; + if ($flag_has_video == "true") { + echo "\n"; + } + else { + echo "\n"; + } + if ($flag_has_floor == "true") { + echo "\n"; + } + else { + echo "\n"; + } + echo "\n"; + echo "\n"; + } + if ($c==0) { $c=1; } else { $c=0; } + } + echo "
\n"; + echo " Count: $member_count\n"; + echo "\n"; + echo "  \n"; + echo "\n"; + if (permission_exists('conferences_active_record') || permission_exists('conferences_active_lock')) { + echo " Conference Tools: \n"; + } + if (permission_exists('conferences_active_record')) { + if (file_exists($_SESSION['switch']['recordings']['dir']."/".$conference_name."-tmp.wav")) { + echo " Stop Record \n"; + } + else { + echo " Start Record \n"; + } + } + if (permission_exists('conferences_active_lock')) { + if ($locked == "true") { + echo " Unlock \n"; + } + else { + echo " Lock \n"; + } + } + echo "
IDUUIDCaller ID NameCaller ID NumberJoinedHearSpeakTalkingLast TalkedVideoHas FloorTools
$id$uuid$caller_id_name$caller_id_number".$join_time_formatted."yesnoyesnoyesno$last_talking_formattedyesnoyesno\n"; + //energy + if (permission_exists('conferences_active_energy')) { + echo " +energy \n"; + echo " -energy \n"; + } + //volume + if (permission_exists('conferences_active_volume')) { + echo " +vol \n"; + echo " -vol \n"; + } + if (permission_exists('conferences_active_gain')) { + echo " +gain \n"; + echo " -gain \n"; + } + //mute and unmute + if (permission_exists('conferences_active_mute')) { + if ($flag_can_speak == "true"){ + echo " mute \n"; + } + else { + echo " unmute \n"; + } + } + //deaf and undeaf + if (permission_exists('conferences_active_deaf')) { + if ($flag_can_hear == "true"){ + echo " deaf \n"; + } + else { + echo " undeaf \n"; + } + } + //kick someone from the conference + if (permission_exists('conferences_active_kick')) { + echo " kick \n"; + } + echo "  "; + echo "
\n"; + } +?> \ No newline at end of file diff --git a/app/conferences_active/v_conferences_active.php b/app/conferences_active/v_conferences_active.php new file mode 100644 index 0000000000..93361b185c --- /dev/null +++ b/app/conferences_active/v_conferences_active.php @@ -0,0 +1,112 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('conferences_active_advanced_view')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +require_once "includes/header.php"; +?> + +"; + +echo "\n"; +echo " \n"; +echo " \n"; +echo " \n"; +echo "
Active Conferences
\n"; +echo " List all the conferences that are currently active with one or more members.\n"; +echo "
\n"; + +echo "\n"; +echo "\n"; +echo " "; +echo " "; +echo "
\n"; + +echo "
\n"; +echo "
\n"; + +echo "
"; +echo ""; + +require_once "includes/footer.php"; +?> diff --git a/app/conferences_active/v_conferences_active_inc.php b/app/conferences_active/v_conferences_active_inc.php new file mode 100644 index 0000000000..911e62274a --- /dev/null +++ b/app/conferences_active/v_conferences_active_inc.php @@ -0,0 +1,107 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('conferences_active_advanced_view')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +$tmp_conference_name = str_replace("_", " ", $conference_name); + +$switch_cmd = 'conference xml_list'; +$fp = event_socket_create($_SESSION['event_socket_ip_address'], $_SESSION['event_socket_port'], $_SESSION['event_socket_password']); +if (!$fp) { + $msg = "
Connection to Event Socket failed.
"; + echo "
\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "
Message
$msg
\n"; + echo "
\n"; +} +else { + $xml_str = trim(event_socket_request($fp, 'api '.$switch_cmd)); + try { + $xml = new SimpleXMLElement($xml_str); + } + catch(Exception $e) { + //echo $e->getMessage(); + } + + $c = 0; + $row_style["0"] = "row_style0"; + $row_style["1"] = "row_style1"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + foreach ($xml->conference as $row) { + //set the variables + $name = $row['name']; + $member_count = $row['member-count']; + //show the conferences that have a matching domain + $tmp_domain = substr($name, -strlen($_SESSION['domain_name'])); + if ($tmp_domain == $_SESSION['domain_name']) { + $conference_name = substr($name, 0, strlen($name) - strlen('-'.$_SESSION['domain_name'])); + $conference_display_name = str_replace("-", " ", $conference_name); + $conference_display_name = str_replace("_", " ", $conference_display_name); + + //$id = $row->members->member->id; + //$flag_can_hear = $row->members->member->flags->can_hear; + //$flag_can_speak = $row->members->member->flags->can_speak; + //$flag_talking = $row->members->member->flags->talking; + //$flag_has_video = $row->members->member->flags->has_video; + //$flag_has_floor = $row->members->member->flags->has_floor; + //$uuid = $row->members->member->uuid; + //$caller_id_name = $row->members->member->caller_id_name; + //$caller_id_name = str_replace("%20", " ", $caller_id_name); + //$caller_id_number = $row->members->member->caller_id_number; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + if ($c==0) { $c=1; } else { $c=0; } + } + } + echo "
NameMember Count 
".$conference_display_name."".$member_count."view
\n"; +} +?> \ No newline at end of file diff --git a/app/contacts/app_config.php b/app/contacts/app_config.php new file mode 100644 index 0000000000..6fd3bd0a44 --- /dev/null +++ b/app/contacts/app_config.php @@ -0,0 +1,275 @@ + \ No newline at end of file diff --git a/app/contacts/contact_addresses.php b/app/contacts/contact_addresses.php new file mode 100644 index 0000000000..bd9d5cc610 --- /dev/null +++ b/app/contacts/contact_addresses.php @@ -0,0 +1,173 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require_once "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('contacts_view')) { + //access granted +} +else { + echo "access denied"; + exit; +} +require_once "includes/header.php"; +require_once "includes/paging.php"; + +//get variables used to control the order + $order_by = $_GET["order_by"]; + $order = $_GET["order"]; + +//show the content + //echo "
"; + //echo "\n"; + //echo "\n"; + //echo " "; + //echo ""; + //echo "
\n"; + //echo "
"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + //echo "\n"; + //echo "\n"; + //echo "\n"; + echo "
Addresses 
\n"; + //echo "List of addresses for the contact.

\n"; + //echo "
\n"; + + //prepare to page the results + $sql = " select count(*) as num_rows from v_contact_addresses "; + $sql .= " where domain_uuid = '".$_SESSION['domain_uuid']."' "; + $sql .= " and contact_uuid = '$contact_uuid' "; + if (strlen($order_by)> 0) { $sql .= "order by $order_by $order "; } + $prep_statement = $db->prepare($sql); + if ($prep_statement) { + $prep_statement->execute(); + $row = $prep_statement->fetch(PDO::FETCH_ASSOC); + if ($row['num_rows'] > 0) { + $num_rows = $row['num_rows']; + } + else { + $num_rows = '0'; + } + } + + //prepare to page the results + $rows_per_page = 10; + $param = ""; + $page = $_GET['page']; + if (strlen($page) == 0) { $page = 0; $_GET['page'] = 0; } + list($paging_controls, $rows_per_page, $var_3) = paging($num_rows, $param, $rows_per_page); + $offset = $rows_per_page * $page; + + //get the contact list + $sql = " select * from v_contact_addresses "; + $sql .= " where domain_uuid = '".$_SESSION['domain_uuid']."' "; + $sql .= " and contact_uuid = '$contact_uuid' "; + if (strlen($order_by)> 0) { $sql .= "order by $order_by $order "; } + $sql .= " limit $rows_per_page offset $offset "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + $result_count = count($result); + unset ($prep_statement, $sql); + + $c = 0; + $row_style["0"] = "row_style0"; + $row_style["1"] = "row_style1"; + + echo "
\n"; + echo "\n"; + + echo "\n"; + echo th_order_by('address_type', 'Type', $order_by, $order); + //echo th_order_by('address_street', 'Street Address', $order_by, $order); + //echo th_order_by('address_extended', 'Extended Address', $order_by, $order); + echo th_order_by('address_locality', 'City', $order_by, $order); + echo th_order_by('address_region', 'Region', $order_by, $order); + //echo th_order_by('address_postal_code', 'Postal Code', $order_by, $order); + echo th_order_by('address_country', 'Country', $order_by, $order); + //echo th_order_by('address_latitude', 'Latitude', $order_by, $order); + //echo th_order_by('address_longitude', 'Longitude', $order_by, $order); + echo "\n"; + echo "\n"; + echo "\n"; + + if ($result_count > 0) { + foreach($result as $row) { + $map_query = $row['address_street']." ".$row['address_extended'].", ".$row['address_locality'].", ".$row['address_region'].", ".$row['address_region'].", ".$row['address_postal_code']; + echo "\n"; + echo " \n"; + //echo " \n"; + //echo " \n"; + echo " \n"; + echo " \n"; + //echo " \n"; + echo " \n"; + //echo " \n"; + //echo " \n"; + echo " \n"; + echo " \n"; + echo "\n"; + if ($c==0) { $c=1; } else { $c=0; } + } //end foreach + unset($sql, $result, $row_count); + } //end if results + + echo "\n"; + echo "\n"; + echo "\n"; + + echo "
Tools\n"; + echo " $v_link_label_add\n"; + echo "
".$row['address_type']." ".$row['address_street']." ".$row['address_extended']." ".$row['address_locality']." ".$row['address_region']." ".$row['address_postal_code']." ".$row['address_country']." ".$row['address_latitude']." ".$row['address_longitude']." \n"; + echo " Map \n"; + echo " \n"; + echo " $v_link_label_edit\n"; + echo " $v_link_label_delete\n"; + echo "
\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "
 $paging_controls\n"; + echo " $v_link_label_add\n"; + echo "
\n"; + echo "
"; + echo "
"; + + //echo "
"; + //echo "
"; + //echo "

"; + +//include the footer + //require_once "includes/footer.php"; +?> \ No newline at end of file diff --git a/app/contacts/contact_addresses_delete.php b/app/contacts/contact_addresses_delete.php new file mode 100644 index 0000000000..5131a788f3 --- /dev/null +++ b/app/contacts/contact_addresses_delete.php @@ -0,0 +1,61 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require_once "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('contacts_delete')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +if (count($_GET)>0) { + $id = check_str($_GET["id"]); + $contact_uuid = check_str($_GET["contact_uuid"]); +} + +if (strlen($id)>0) { + $sql = ""; + $sql .= "delete from v_contact_addresses "; + $sql .= "where domain_uuid = '".$_SESSION['domain_uuid']."' "; + $sql .= "and contact_address_uuid = '$id' "; + + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + unset($sql); +} + +require_once "includes/header.php"; +echo "\n"; +echo "
\n"; +echo "Delete Complete\n"; +echo "
\n"; +require_once "includes/footer.php"; +return; + +?> \ No newline at end of file diff --git a/app/contacts/contact_addresses_edit.php b/app/contacts/contact_addresses_edit.php new file mode 100644 index 0000000000..c03bbc93ac --- /dev/null +++ b/app/contacts/contact_addresses_edit.php @@ -0,0 +1,352 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require_once "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('contacts_edit')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +//action add or update + if (isset($_REQUEST["id"])) { + $action = "update"; + $contact_address_uuid = check_str($_REQUEST["id"]); + } + else { + $action = "add"; + } + +if (strlen($_GET["contact_uuid"]) > 0) { + $contact_uuid = check_str($_GET["contact_uuid"]); +} + +//get http post variables and set them to php variables + if (count($_POST)>0) { + $address_type = check_str($_POST["address_type"]); + $address_street = check_str($_POST["address_street"]); + $address_extended = check_str($_POST["address_extended"]); + $address_locality = check_str($_POST["address_locality"]); + $address_region = check_str($_POST["address_region"]); + $address_postal_code = check_str($_POST["address_postal_code"]); + $address_country = check_str($_POST["address_country"]); + $address_latitude = check_str($_POST["address_latitude"]); + $address_longitude = check_str($_POST["address_longitude"]); + } + +if (count($_POST)>0 && strlen($_POST["persistformvar"]) == 0) { + + $msg = ''; + if ($action == "update") { + $contact_address_uuid = check_str($_POST["contact_address_uuid"]); + } + + //check for all required data + //if (strlen($domain_uuid) == 0) { $msg .= "Please provide: domain_uuid
\n"; } + //if (strlen($address_type) == 0) { $msg .= "Please provide: Address Type
\n"; } + //if (strlen($address_street) == 0) { $msg .= "Please provide: Street Address
\n"; } + //if (strlen($address_extended) == 0) { $msg .= "Please provide: Extended Address
\n"; } + //if (strlen($address_locality) == 0) { $msg .= "Please provide: City
\n"; } + //if (strlen($address_region) == 0) { $msg .= "Please provide: State / Province
\n"; } + //if (strlen($address_postal_code) == 0) { $msg .= "Please provide: Postal Code
\n"; } + //if (strlen($address_country) == 0) { $msg .= "Please provide: Country
\n"; } + //if (strlen($address_latitude) == 0) { $msg .= "Please provide: Latitude
\n"; } + //if (strlen($address_longitude) == 0) { $msg .= "Please provide: Longitude
\n"; } + if (strlen($msg) > 0 && strlen($_POST["persistformvar"]) == 0) { + require_once "includes/header.php"; + require_once "includes/persistformvar.php"; + echo "
\n"; + echo "
\n"; + echo $msg."
"; + echo "
\n"; + persistformvar($_POST); + echo "
\n"; + require_once "includes/footer.php"; + return; + } + + //add or update the database + if ($_POST["persistformvar"] != "true") { + if ($action == "add") { + $contact_address_uuid = uuid(); + $sql = "insert into v_contact_addresses "; + $sql .= "("; + $sql .= "domain_uuid, "; + $sql .= "contact_uuid, "; + $sql .= "contact_address_uuid, "; + $sql .= "address_type, "; + $sql .= "address_street, "; + $sql .= "address_extended, "; + $sql .= "address_locality, "; + $sql .= "address_region, "; + $sql .= "address_postal_code, "; + $sql .= "address_country, "; + $sql .= "address_latitude, "; + $sql .= "address_longitude "; + $sql .= ")"; + $sql .= "values "; + $sql .= "("; + $sql .= "'".$_SESSION['domain_uuid']."', "; + $sql .= "'$contact_uuid', "; + $sql .= "'$contact_address_uuid', "; + $sql .= "'$address_type', "; + $sql .= "'$address_street', "; + $sql .= "'$address_extended', "; + $sql .= "'$address_locality', "; + $sql .= "'$address_region', "; + $sql .= "'$address_postal_code', "; + $sql .= "'$address_country', "; + $sql .= "'$address_latitude', "; + $sql .= "'$address_longitude' "; + $sql .= ")"; + $db->exec(check_sql($sql)); + unset($sql); + + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Add Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + } //if ($action == "add") + + if ($action == "update") { + $sql = "update v_contact_addresses set "; + $sql .= "contact_uuid = '$contact_uuid', "; + $sql .= "address_type = '$address_type', "; + $sql .= "address_street = '$address_street', "; + $sql .= "address_extended = '$address_extended', "; + $sql .= "address_locality = '$address_locality', "; + $sql .= "address_region = '$address_region', "; + $sql .= "address_postal_code = '$address_postal_code', "; + $sql .= "address_country = '$address_country', "; + $sql .= "address_latitude = '$address_latitude', "; + $sql .= "address_longitude = '$address_longitude' "; + $sql .= "where domain_uuid = '".$_SESSION['domain_uuid']."'"; + $sql .= "and contact_address_uuid = '$contact_address_uuid'"; + $db->exec(check_sql($sql)); + unset($sql); + + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Update Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + } //if ($action == "update") + } //if ($_POST["persistformvar"] != "true") +} //(count($_POST)>0 && strlen($_POST["persistformvar"]) == 0) + +//pre-populate the form + if (count($_GET)>0 && $_POST["persistformvar"] != "true") { + $contact_address_uuid = $_GET["id"]; + $sql = ""; + $sql .= "select * from v_contact_addresses "; + $sql .= "where domain_uuid = '".$_SESSION['domain_uuid']."' "; + $sql .= "and contact_address_uuid = '$contact_address_uuid' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach ($result as &$row) { + $address_type = $row["address_type"]; + $address_street = $row["address_street"]; + $address_extended = $row["address_extended"]; + $address_locality = $row["address_locality"]; + $address_region = $row["address_region"]; + $address_postal_code = $row["address_postal_code"]; + $address_country = $row["address_country"]; + $address_latitude = $row["address_latitude"]; + $address_longitude = $row["address_longitude"]; + break; //limit to 1 row + } + unset ($prep_statement); + } + +//show the header + require_once "includes/header.php"; + +//show the content + echo "
"; + echo "\n"; + echo "\n"; + echo " "; + echo " "; + echo "
\n"; + echo "
"; + + echo "
\n"; + echo "
\n"; + echo "\n"; + echo "\n"; + if ($action == "add") { + echo "\n"; + } + if ($action == "update") { + echo "\n"; + } + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo " \n"; + echo " \n"; + echo " "; + echo "
Contacts Address AddContacts Address Edit
\n"; + echo "Contact address information.

\n"; + echo "
\n"; + echo " Address Type:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the address type.\n"; + echo "
\n"; + echo " Street Address:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the street address.\n"; + echo "
\n"; + echo " Extended Address:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the extended address.\n"; + echo "
\n"; + echo " City:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the city.\n"; + echo "
\n"; + echo " Region:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the state or province.\n"; + echo "
\n"; + echo " Postal Code:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the postal code.\n"; + echo "
\n"; + echo " Country:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the country.\n"; + echo "
\n"; + echo " Latitude:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the latitude\n"; + echo "
\n"; + echo " Longitude:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the longitude\n"; + echo "
\n"; + echo " \n"; + if ($action == "update") { + echo " \n"; + } + echo " \n"; + echo "
"; + echo ""; + + echo "
"; + echo "
"; + +//include the footer + require_once "includes/footer.php"; +?> \ No newline at end of file diff --git a/app/contacts/contact_notes.php b/app/contacts/contact_notes.php new file mode 100644 index 0000000000..d4a185f1ca --- /dev/null +++ b/app/contacts/contact_notes.php @@ -0,0 +1,179 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require_once "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('contacts_view')) { + //access granted +} +else { + echo "access denied"; + exit; +} +require_once "includes/header.php"; +require_once "includes/paging.php"; + +//get variables used to control the order + $order_by = $_GET["order_by"]; + $order = $_GET["order"]; + +//show the content + //echo "
"; + //echo "\n"; + //echo "\n"; + //echo " "; + //echo ""; + //echo "
\n"; + //echo "
"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + //echo "\n"; + //echo "\n"; + //echo "\n"; + echo "
Notes 
\n"; + //echo " List of notes for the contact.

\n"; + //echo "
\n"; + + //prepare to page the results + $sql = " select count(*) as num_rows from v_contact_notes "; + $sql .= " where domain_uuid = '".$_SESSION['domain_uuid']."' "; + $sql .= " and contact_uuid = '$contact_uuid' "; + if (strlen($order_by)> 0) { $sql .= "order by $order_by $order "; } + $prep_statement = $db->prepare($sql); + if ($prep_statement) { + $prep_statement->execute(); + $row = $prep_statement->fetch(PDO::FETCH_ASSOC); + if ($row['num_rows'] > 0) { + $num_rows = $row['num_rows']; + } + else { + $num_rows = '0'; + } + } + + //prepare to page the results + $rows_per_page = 10; + $param = ""; + $page = $_GET['page']; + if (strlen($page) == 0) { $page = 0; $_GET['page'] = 0; } + list($paging_controls, $rows_per_page, $var_3) = paging($num_rows, $param, $rows_per_page); + $offset = $rows_per_page * $page; + + //get the contact list + $sql = "select * from v_contact_notes "; + $sql .= "where domain_uuid = '".$_SESSION['domain_uuid']."' "; + $sql .= "and contact_uuid = '$contact_uuid' "; + if (strlen($order_by)> 0) { $sql .= "order by $order_by $order "; } + $sql .= " limit $rows_per_page offset $offset "; + $prep_statement = $db->prepare(check_sql($sql)); + if ($prep_statement) { + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + $result_count = count($result); + unset ($prep_statement, $sql); + } + + $c = 0; + $row_style["0"] = "row_style0"; + $row_style["1"] = "row_style1"; + + echo "
\n"; + echo "\n"; + + if ($result_count == 0) { + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + } + else { + foreach($result as $row) { + $contact_note = $row['contact_note']; + //$contact_note = str_replace("\n","
",$contact_note); + + echo "\n"; + echo "\n"; + //echo "\n"; + //echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo " \n"; + //echo " \n"; + //echo " \n"; + echo " \n"; + echo "\n"; + + echo "\n"; + echo " \n"; + echo "\n"; + + if ($c==0) { $c=1; } else { $c=0; } + } //end foreach + unset($sql, $result, $row_count); + } //end if results + + echo "\n"; + echo "\n"; + echo "\n"; + + echo "
\n"; + echo "   \n"; + echo "\n"; + echo " $v_link_label_add\n"; + echo "
\n"; + echo " ".$row['last_mod_date']."    \n"; + echo " ".$row['last_mod_user']."     \n"; + echo "Modified Date ".$row['last_mod_date']."Modified By ".$row['last_mod_user']."\n"; + echo " $v_link_label_add\n"; + echo "

".$contact_note." 

".$row['last_mod_date']." ".$row['last_mod_user']." \n"; + echo " $v_link_label_edit\n"; + echo " $v_link_label_delete\n"; + echo "
 
\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "
 $paging_controls\n"; + echo " $v_link_label_add\n"; + echo "
\n"; + echo "
"; + echo "
"; + + //echo "
"; + //echo "
"; + //echo "

"; + +//include the footer + //require_once "includes/footer.php"; +?> \ No newline at end of file diff --git a/app/contacts/contact_notes_delete.php b/app/contacts/contact_notes_delete.php new file mode 100644 index 0000000000..308731e642 --- /dev/null +++ b/app/contacts/contact_notes_delete.php @@ -0,0 +1,60 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require_once "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('contacts_delete')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +if (count($_GET)>0) { + $id = check_str($_GET["id"]); + $contact_uuid = check_str($_GET["contact_uuid"]); +} + +if (strlen($id)>0) { + $sql = ""; + $sql .= "delete from v_contact_notes "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and contact_note_uuid = '$id' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + unset($sql); +} + +require_once "includes/header.php"; +echo "\n"; +echo "
\n"; +echo "Delete Complete\n"; +echo "
\n"; +require_once "includes/footer.php"; +return; + +?> \ No newline at end of file diff --git a/app/contacts/contact_notes_edit.php b/app/contacts/contact_notes_edit.php new file mode 100644 index 0000000000..f155db0ac0 --- /dev/null +++ b/app/contacts/contact_notes_edit.php @@ -0,0 +1,210 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require_once "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('contacts_edit')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +//action add or update + if (isset($_REQUEST["id"])) { + $action = "update"; + $contact_note_uuid = check_str($_REQUEST["id"]); + } + else { + $action = "add"; + } + +if (strlen($_GET["contact_uuid"]) > 0) { + $contact_uuid = check_str($_GET["contact_uuid"]); +} + +//get http post variables and set them to php variables + if (count($_POST)>0) { + $contact_note = check_str($_POST["contact_note"]); + $last_mod_date = check_str($_POST["last_mod_date"]); + $last_mod_user = check_str($_POST["last_mod_user"]); + } + +if (count($_POST)>0 && strlen($_POST["persistformvar"]) == 0) { + + $msg = ''; + if ($action == "update") { + $contact_note_uuid = check_str($_POST["contact_note_uuid"]); + } + + //check for all required data + //if (strlen($contact_note) == 0) { $msg .= "Please provide: Notes
\n"; } + //if (strlen($domain_uuid) == 0) { $msg .= "Please provide: domain_uuid
\n"; } + //if (strlen($last_mod_date) == 0) { $msg .= "Please provide: Last Modified Date
\n"; } + //if (strlen($last_mod_user) == 0) { $msg .= "Please provide: Last Modified By
\n"; } + if (strlen($msg) > 0 && strlen($_POST["persistformvar"]) == 0) { + require_once "includes/header.php"; + require_once "includes/persistformvar.php"; + echo "
\n"; + echo "
\n"; + echo $msg."
"; + echo "
\n"; + persistformvar($_POST); + echo "
\n"; + require_once "includes/footer.php"; + return; + } + + //add or update the database + if ($_POST["persistformvar"] != "true") { + if ($action == "add") { + $contact_note_uuid = uuid(); + $sql = "insert into v_contact_notes "; + $sql .= "("; + $sql .= "contact_note_uuid, "; + $sql .= "contact_uuid, "; + $sql .= "contact_note, "; + $sql .= "domain_uuid, "; + $sql .= "last_mod_date, "; + $sql .= "last_mod_user "; + $sql .= ")"; + $sql .= "values "; + $sql .= "("; + $sql .= "'$contact_note_uuid', "; + $sql .= "'$contact_uuid', "; + $sql .= "'$contact_note', "; + $sql .= "'$domain_uuid', "; + $sql .= "now(), "; + $sql .= "'".$_SESSION['username']."' "; + $sql .= ")"; + $db->exec(check_sql($sql)); + unset($sql); + + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Add Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + } //if ($action == "add") + + if ($action == "update") { + $sql = "update v_contact_notes set "; + $sql .= "contact_uuid = '$contact_uuid', "; + $sql .= "contact_note = '$contact_note', "; + $sql .= "last_mod_date = now(), "; + $sql .= "last_mod_user = '".$_SESSION['username']."' "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and contact_note_uuid = '$contact_note_uuid'"; + $db->exec(check_sql($sql)); + unset($sql); + + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Update Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + } //if ($action == "update") + } //if ($_POST["persistformvar"] != "true") +} //(count($_POST)>0 && strlen($_POST["persistformvar"]) == 0) + +//pre-populate the form + if (count($_GET)>0 && $_POST["persistformvar"] != "true") { + $contact_note_uuid = $_GET["id"]; + $sql = ""; + $sql .= "select * from v_contact_notes "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and contact_note_uuid = '$contact_note_uuid' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach ($result as &$row) { + $contact_note = $row["contact_note"]; + $last_mod_date = $row["last_mod_date"]; + $last_mod_user = $row["last_mod_user"]; + break; //limit to 1 row + } + unset ($prep_statement); + } + +//show the header + require_once "includes/header.php"; + +//show the content + echo "
"; + echo "\n"; + + echo "\n"; + echo " "; + echo " "; + echo "
\n"; + echo "
"; + + echo "
\n"; + echo "
\n"; + echo "\n"; + echo "\n"; + if ($action == "add") { + echo "\n"; + } + if ($action == "update") { + echo "\n"; + } + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo " \n"; + echo " \n"; + echo " "; + echo "
Add NotesEdit Notes
\n"; + echo " Notes:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "\n"; + echo "
\n"; + echo " \n"; + if ($action == "update") { + echo " \n"; + } + echo " \n"; + echo "
"; + echo ""; + + echo "
"; + echo "
"; + +//include the footer + require_once "includes/footer.php"; +?> \ No newline at end of file diff --git a/app/contacts/contact_phones.php b/app/contacts/contact_phones.php new file mode 100644 index 0000000000..d754c53fcf --- /dev/null +++ b/app/contacts/contact_phones.php @@ -0,0 +1,154 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require_once "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('contacts_view')) { + //access granted +} +else { + echo "access denied"; + exit; +} +require_once "includes/header.php"; +require_once "includes/paging.php"; + +//get variables used to control the order + $order_by = $_GET["order_by"]; + $order = $_GET["order"]; + +//show the content + //echo "
"; + //echo "\n"; + //echo "\n"; + //echo " "; + //echo ""; + //echo "
\n"; + //echo "
"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + //echo "\n"; + //echo "\n"; + //echo "\n"; + echo "
Phone Numbers 
\n"; + //echo " List of phone numbers for the contact.

\n"; + //echo "
\n"; + + //prepare to page the results + $sql = " select count(*) as num_rows from v_contact_phones "; + $sql .= " where domain_uuid = '$domain_uuid' "; + $sql .= " and contact_uuid = '$contact_uuid' "; + if (strlen($order_by)> 0) { $sql .= "order by $order_by $order "; } + $prep_statement = $db->prepare($sql); + if ($prep_statement) { + $prep_statement->execute(); + $row = $prep_statement->fetch(PDO::FETCH_ASSOC); + if ($row['num_rows'] > 0) { + $num_rows = $row['num_rows']; + } + else { + $num_rows = '0'; + } + } + + //prepare to page the results + $rows_per_page = 10; + $param = ""; + $page = $_GET['page']; + if (strlen($page) == 0) { $page = 0; $_GET['page'] = 0; } + list($paging_controls, $rows_per_page, $var_3) = paging($num_rows, $param, $rows_per_page); + $offset = $rows_per_page * $page; + + //get the contact list + $sql = " select * from v_contact_phones "; + $sql .= " where domain_uuid = '$domain_uuid' "; + $sql .= " and contact_uuid = '$contact_uuid' "; + if (strlen($order_by)> 0) { $sql .= "order by $order_by $order "; } + $sql .= " limit $rows_per_page offset $offset "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + $result_count = count($result); + unset ($prep_statement, $sql); + + $c = 0; + $row_style["0"] = "row_style0"; + $row_style["1"] = "row_style1"; + + echo "
\n"; + echo "\n"; + echo "\n"; + echo th_order_by('phone_type', 'Type', $order_by, $order); + echo th_order_by('phone_number', 'Numbers', $order_by, $order); + echo "\n"; + echo "\n"; + echo "\n"; + if ($result_count > 0) { + foreach($result as $row) { + echo "\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "\n"; + if ($c==0) { $c=1; } else { $c=0; } + } //end foreach + unset($sql, $result, $row_count); + } //end if results + + echo "\n"; + echo "\n"; + echo "\n"; + + echo "
Tools\n"; + echo " $v_link_label_add\n"; + echo "
".$row['phone_type']." ".format_phone($row['phone_number'])." CDR \n"; + echo " $v_link_label_edit\n"; + echo " $v_link_label_delete\n"; + echo "
\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "
 $paging_controls\n"; + echo " $v_link_label_add\n"; + echo "
\n"; + echo "
"; + echo "
"; + + //echo "
"; + //echo "
"; + //echo "

"; + +//include the footer + //require_once "includes/footer.php"; +?> \ No newline at end of file diff --git a/app/contacts/contact_phones_delete.php b/app/contacts/contact_phones_delete.php new file mode 100644 index 0000000000..fe8dadf675 --- /dev/null +++ b/app/contacts/contact_phones_delete.php @@ -0,0 +1,61 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require_once "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('contacts_delete')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +if (count($_GET)>0) { + $id = check_str($_GET["id"]); + $contact_uuid = check_str($_GET["contact_uuid"]); +} + +if (strlen($id)>0) { + $sql = ""; + $sql .= "delete from v_contact_phones "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and contact_phone_uuid = '$id' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + unset($sql); +} + +require_once "includes/header.php"; +echo "\n"; +echo "
\n"; +echo "Delete Complete\n"; +echo "
\n"; + +require_once "includes/footer.php"; +return; + +?> \ No newline at end of file diff --git a/app/contacts/contact_phones_edit.php b/app/contacts/contact_phones_edit.php new file mode 100644 index 0000000000..8ea657b46b --- /dev/null +++ b/app/contacts/contact_phones_edit.php @@ -0,0 +1,320 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require_once "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('contacts_edit')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +//action add or update + if (isset($_REQUEST["id"])) { + $action = "update"; + $contact_phone_uuid = check_str($_REQUEST["id"]); + } + else { + $action = "add"; + } + +if (strlen($_GET["contact_uuid"]) > 0) { + $contact_uuid = check_str($_GET["contact_uuid"]); +} + +//get http post variables and set them to php variables + if (count($_POST)>0) { + $phone_type = check_str($_POST["phone_type"]); + $phone_number = check_str($_POST["phone_number"]); + + //remove any phone number formatting + $phone_number = preg_replace('{\D}', '', $phone_number); + } + +if (count($_POST)>0 && strlen($_POST["persistformvar"]) == 0) { + + $msg = ''; + if ($action == "update") { + $contact_phone_uuid = check_str($_POST["contact_phone_uuid"]); + } + + //check for all required data + //if (strlen($domain_uuid) == 0) { $msg .= "Please provide: domain_uuid
\n"; } + //if (strlen($phone_type) == 0) { $msg .= "Please provide: Telephone Type.
\n"; } + //if (strlen($phone_number) == 0) { $msg .= "Please provide: Telephone Number
\n"; } + if (strlen($msg) > 0 && strlen($_POST["persistformvar"]) == 0) { + require_once "includes/header.php"; + require_once "includes/persistformvar.php"; + echo "
\n"; + echo "
\n"; + echo $msg."
"; + echo "
\n"; + persistformvar($_POST); + echo "
\n"; + require_once "includes/footer.php"; + return; + } + + //add or update the database + if ($_POST["persistformvar"] != "true") { + if ($action == "add") { + $contact_phone_uuid = uuid(); + $sql = "insert into v_contact_phones "; + $sql .= "("; + $sql .= "domain_uuid, "; + $sql .= "contact_uuid, "; + $sql .= "contact_phone_uuid, "; + $sql .= "phone_type, "; + $sql .= "phone_number "; + $sql .= ")"; + $sql .= "values "; + $sql .= "("; + $sql .= "'$domain_uuid', "; + $sql .= "'$contact_uuid', "; + $sql .= "'$contact_phone_uuid', "; + $sql .= "'$phone_type', "; + $sql .= "'$phone_number' "; + $sql .= ")"; + $db->exec(check_sql($sql)); + unset($sql); + + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Add Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + } //if ($action == "add") + + if ($action == "update") { + $sql = "update v_contact_phones set "; + $sql .= "contact_uuid = '$contact_uuid', "; + $sql .= "phone_type = '$phone_type', "; + $sql .= "phone_number = '$phone_number' "; + $sql .= "where domain_uuid = '$domain_uuid'"; + $sql .= "and contact_phone_uuid = '$contact_phone_uuid'"; + $db->exec(check_sql($sql)); + unset($sql); + + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Update Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + } //if ($action == "update") + } //if ($_POST["persistformvar"] != "true") +} //(count($_POST)>0 && strlen($_POST["persistformvar"]) == 0) + +//pre-populate the form + if (count($_GET)>0 && $_POST["persistformvar"] != "true") { + $contact_phone_uuid = $_GET["id"]; + $sql = ""; + $sql .= "select * from v_contact_phones "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and contact_phone_uuid = '$contact_phone_uuid' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach ($result as &$row) { + $phone_type = $row["phone_type"]; + $phone_number = $row["phone_number"]; + break; //limit to 1 row + } + unset ($prep_statement); + } + +//show the header + require_once "includes/header.php"; + +//show the content + echo "
"; + echo "\n"; + echo "\n"; + echo " "; + echo " "; + echo "
\n"; + echo "
"; + + echo "
\n"; + echo "
\n"; + echo "\n"; + echo "\n"; + if ($action == "add") { + echo "\n"; + } + if ($action == "update") { + echo "\n"; + } + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo " \n"; + echo " \n"; + echo " "; + echo "
Contacts Phone AddContacts Phone Edit
\n"; + echo "Telephone Numbers

\n"; + echo "
\n"; + echo " Telephone Type.:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the telephone type.\n"; + echo "
\n"; + echo " Telephone Number:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the telephone number.\n"; + echo "
\n"; + echo " \n"; + if ($action == "update") { + echo " \n"; + } + echo " \n"; + echo "
"; + echo ""; + + echo "
"; + echo "
"; + +//include the footer + require_once "includes/footer.php"; +?> \ No newline at end of file diff --git a/app/contacts/contacts.php b/app/contacts/contacts.php new file mode 100644 index 0000000000..f7de7da1d5 --- /dev/null +++ b/app/contacts/contacts.php @@ -0,0 +1,224 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require_once "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('contacts_view')) { + //access granted +} +else { + echo "access denied"; + exit; +} +require_once "includes/header.php"; +require_once "includes/paging.php"; + +//get the search criteria + $search_all = $_GET["search_all"]; + +//get variables used to control the order + $order_by = $_GET["order_by"]; + $order = $_GET["order"]; + +//show the content + echo "
"; + echo "\n"; + echo "\n"; + echo " "; + echo ""; + echo "
\n"; + echo "
"; + + echo "\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "
Contacts
\n"; + echo " The contact is a list of individuals and organizations.\n"; + echo "
\n"; + echo "
\n"; + echo " \n"; + echo " \n"; + echo "
\n"; + echo "
\n"; + + //prepare to page the results + $sql = ""; + $sql .= " select count(*) as num_rows from v_contacts "; + $sql .= " where domain_uuid = '".$_SESSION['domain_uuid']."' "; + if (strlen($search_all) > 0) { + if (is_numeric($search_all)) { + $sql .= "and contact_uuid in (select contact_uuid from v_contact_phones where phone_number like '%".$search_all."%') \n"; + } + else { + $sql .= "and contact_uuid in (\n"; + $sql .= " select contact_uuid from v_contacts "; + $sql .= " where domain_uuid = '".$_SESSION['domain_uuid']."' \n"; + $sql .= " and (\n"; + $sql .= " contact_organization like '%".$search_all."%' or \n"; + $sql .= " contact_name_given like '%".$search_all."%' or \n"; + $sql .= " contact_name_family like '%".$search_all."%' or \n"; + $sql .= " contact_nickname like '%".$search_all."%' or \n"; + $sql .= " contact_title like '%".$search_all."%' or \n"; + $sql .= " contact_role like '%".$search_all."%' or \n"; + $sql .= " contact_email like '%".$search_all."%' or \n"; + $sql .= " contact_url like '%".$search_all."%' or \n"; + $sql .= " contact_time_zone like '%".$search_all."%' or \n"; + $sql .= " contact_note like '%".$search_all."%' or \n"; + $sql .= " contact_type like '%".$search_all."%'\n"; + $sql .= " )\n"; + $sql .= ")\n"; + } + } + if (strlen($order_by)> 0) { $sql .= "order by $order_by $order "; } + $prep_statement = $db->prepare($sql); + if ($prep_statement) { + $prep_statement->execute(); + $row = $prep_statement->fetch(PDO::FETCH_ASSOC); + if ($row['num_rows'] > 0) { + $num_rows = $row['num_rows']; + } + else { + $num_rows = '0'; + } + } + + //prepare to page the results + $rows_per_page = 30; + $param = ""; + $page = $_GET['page']; + if (strlen($page) == 0) { $page = 0; $_GET['page'] = 0; } + list($paging_controls, $rows_per_page, $var_3) = paging($num_rows, $param, $rows_per_page); + $offset = $rows_per_page * $page; + + //get the list + $sql = " select * from v_contacts "; + $sql .= " where domain_uuid = '".$_SESSION['domain_uuid']."' "; + if (strlen($search_all) > 0) { + if (is_numeric($search_all)) { + $sql .= "and contact_uuid in (select contact_uuid from v_contact_phones where phone_number like '%".$search_all."%') \n"; + } + else { + $sql .= "and contact_uuid in (\n"; + $sql .= " select contact_uuid from v_contacts where domain_uuid = '".$_SESSION['domain_uuid']."' \n"; + $sql .= " and (\n"; + $sql .= " contact_organization like '%".$search_all."%' or \n"; + $sql .= " contact_name_given like '%".$search_all."%' or \n"; + $sql .= " contact_name_family like '%".$search_all."%' or \n"; + $sql .= " contact_nickname like '%".$search_all."%' or \n"; + $sql .= " contact_title like '%".$search_all."%' or \n"; + $sql .= " contact_role like '%".$search_all."%' or \n"; + $sql .= " contact_email like '%".$search_all."%' or \n"; + $sql .= " contact_url like '%".$search_all."%' or \n"; + $sql .= " contact_time_zone like '%".$search_all."%' or \n"; + $sql .= " contact_note like '%".$search_all."%' or \n"; + $sql .= " contact_type like '%".$search_all."%'\n"; + $sql .= " )\n"; + $sql .= ")\n"; + } + } + if (strlen($order_by)> 0) { $sql .= "order by $order_by $order "; } + $sql .= " limit $rows_per_page offset $offset "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + $result_count = count($result); + unset ($prep_statement, $sql); + + $c = 0; + $row_style["0"] = "row_style0"; + $row_style["1"] = "row_style1"; + + echo "
\n"; + echo "\n"; + echo "\n"; + echo th_order_by('contact_type', 'Type', $order_by, $order); + echo th_order_by('contact_organization', 'Organization', $order_by, $order); + echo th_order_by('contact_name_given', 'First Name', $order_by, $order); + echo th_order_by('contact_name_family', 'Last Name', $order_by, $order); + echo th_order_by('contact_nickname', 'Nickname', $order_by, $order); + echo th_order_by('contact_title', 'Title', $order_by, $order); + echo th_order_by('contact_role', 'Role', $order_by, $order); + //echo th_order_by('contact_email', 'Email', $order_by, $order); + //echo th_order_by('contact_url', 'URL', $order_by, $order); + //echo th_order_by('contact_time_zone', 'Time Zone', $order_by, $order); + //echo th_order_by('contact_note', 'Notes', $order_by, $order); + echo "\n"; + echo "\n"; + + if ($result_count > 0) { + foreach($result as $row) { + echo "\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + //echo " \n"; + //echo " \n"; + //echo " \n"; + //echo " \n"; + echo " \n"; + echo "\n"; + if ($c==0) { $c=1; } else { $c=0; } + } //end foreach + unset($sql, $result, $row_count); + } //end if results + + echo "\n"; + echo "\n"; + echo "\n"; + + echo "
\n"; + echo " $v_link_label_add\n"; + echo "
".ucwords($row['contact_type'])." ".$row['contact_organization']." ".$row['contact_name_given']." ".$row['contact_name_family']." ".$row['contact_nickname']." ".$row['contact_title']." ".$row['contact_role']." ".$row['contact_email']." ".$row['contact_url']." ".$row['contact_time_zone']." ".$row['contact_note']." \n"; + echo " $v_link_label_edit\n"; + echo " $v_link_label_delete\n"; + echo "
\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "
 $paging_controls\n"; + echo " $v_link_label_add\n"; + echo "
\n"; + echo "
"; + echo "
"; + echo "

"; + echo "

"; + + echo "
"; + echo "
"; + echo "

"; + +//include the footer + require_once "includes/footer.php"; +?> \ No newline at end of file diff --git a/app/contacts/contacts_delete.php b/app/contacts/contacts_delete.php new file mode 100644 index 0000000000..560abdd98a --- /dev/null +++ b/app/contacts/contacts_delete.php @@ -0,0 +1,86 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require_once "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('contacts_delete')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +if (count($_GET)>0) { + $id = check_str($_GET["id"]); +} + +if (strlen($id)>0) { + //delete a contact + $sql = "delete from v_contacts "; + $sql .= "where domain_uuid = '".$_SESSION['domain_uuid']."' "; + $sql .= "and contact_uuid = '$id' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + unset($prep_statement, $sql); + + //delete addresses + $sql = "delete from v_contact_addresses "; + $sql .= "where domain_uuid = '".$_SESSION['domain_uuid']."' "; + $sql .= "and contact_uuid = '$id' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + unset($prep_statement, $sql); + + //delete phones + $sql = ""; + $sql .= "delete from v_contact_phones "; + $sql .= "where domain_uuid = '".$_SESSION['domain_uuid']."' "; + $sql .= "and contact_uuid = '$id' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + unset($prep_statement, $sql); + + //delete notes + $sql = ""; + $sql .= "delete from v_contact_notes "; + $sql .= "where domain_uuid = '".$_SESSION['domain_uuid']."' "; + $sql .= "and contact_uuid = '$id' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + unset($prep_statement, $sql); +} + +//redirect the browser + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Delete Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + +?> \ No newline at end of file diff --git a/app/contacts/contacts_edit.php b/app/contacts/contacts_edit.php new file mode 100644 index 0000000000..d32789a58b --- /dev/null +++ b/app/contacts/contacts_edit.php @@ -0,0 +1,481 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require_once "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('contacts_edit')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +//action add or update + if (isset($_REQUEST["id"])) { + $action = "update"; + $contact_uuid = check_str($_REQUEST["id"]); + } + else { + $action = "add"; + } + +//get http post variables and set them to php variables + if (count($_POST)>0) { + $contact_type = check_str($_POST["contact_type"]); + $contact_organization = check_str($_POST["contact_organization"]); + $contact_name_given = check_str($_POST["contact_name_given"]); + $contact_name_family = check_str($_POST["contact_name_family"]); + $contact_nickname = check_str($_POST["contact_nickname"]); + $contact_title = check_str($_POST["contact_title"]); + $contact_role = check_str($_POST["contact_role"]); + $contact_email = check_str($_POST["contact_email"]); + $contact_url = check_str($_POST["contact_url"]); + $contact_time_zone = check_str($_POST["contact_time_zone"]); + $contact_note = check_str($_POST["contact_note"]); + } + +if (count($_POST)>0 && strlen($_POST["persistformvar"]) == 0) { + + $msg = ''; + if ($action == "update") { + $contact_uuid = check_str($_POST["contact_uuid"]); + } + + //check for all required data + //if (strlen($domain_uuid) == 0) { $msg .= "Please provide: domain_uuid
\n"; } + //if (strlen($contact_type) == 0) { $msg .= "Please provide: Type
\n"; } + //if (strlen($contact_organization) == 0) { $msg .= "Please provide: Organization
\n"; } + //if (strlen($contact_name_given) == 0) { $msg .= "Please provide: First Name
\n"; } + //if (strlen($contact_name_family) == 0) { $msg .= "Please provide: Last Name
\n"; } + //if (strlen($contact_nickname) == 0) { $msg .= "Please provide: Nickname
\n"; } + //if (strlen($contact_title) == 0) { $msg .= "Please provide: Title
\n"; } + //if (strlen($contact_role) == 0) { $msg .= "Please provide: Role
\n"; } + //if (strlen($) == 0) { $msg .= "Please provide: Contact Information
\n"; } + //if (strlen($contact_email) == 0) { $msg .= "Please provide: Email
\n"; } + //if (strlen($contact_url) == 0) { $msg .= "Please provide: URL
\n"; } + //if (strlen($) == 0) { $msg .= "Please provide: Additional Information
\n"; } + //if (strlen($contact_time_zone) == 0) { $msg .= "Please provide: Time Zone
\n"; } + //if (strlen($contact_note) == 0) { $msg .= "Please provide: Notes
\n"; } + if (strlen($msg) > 0 && strlen($_POST["persistformvar"]) == 0) { + require_once "includes/header.php"; + require_once "includes/persistformvar.php"; + echo "
\n"; + echo "
\n"; + echo $msg."
"; + echo "
\n"; + persistformvar($_POST); + echo "
\n"; + require_once "includes/footer.php"; + return; + } + + //add or update the database + if ($_POST["persistformvar"] != "true") { + if ($action == "add") { + $contact_uuid = uuid(); + $sql = "insert into v_contacts "; + $sql .= "("; + $sql .= "domain_uuid, "; + $sql .= "contact_uuid, "; + $sql .= "contact_type, "; + $sql .= "contact_organization, "; + $sql .= "contact_name_given, "; + $sql .= "contact_name_family, "; + $sql .= "contact_nickname, "; + $sql .= "contact_title, "; + $sql .= "contact_role, "; + $sql .= "contact_email, "; + $sql .= "contact_url, "; + $sql .= "contact_time_zone, "; + $sql .= "contact_note "; + $sql .= ")"; + $sql .= "values "; + $sql .= "("; + $sql .= "'".$_SESSION['domain_uuid']."', "; + $sql .= "'$contact_uuid', "; + $sql .= "'$contact_type', "; + $sql .= "'$contact_organization', "; + $sql .= "'$contact_name_given', "; + $sql .= "'$contact_name_family', "; + $sql .= "'$contact_nickname', "; + $sql .= "'$contact_title', "; + $sql .= "'$contact_role', "; + $sql .= "'$contact_email', "; + $sql .= "'$contact_url', "; + $sql .= "'$contact_time_zone', "; + $sql .= "'$contact_note' "; + $sql .= ")"; + $db->exec(check_sql($sql)); + unset($sql); + + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Add Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + } //if ($action == "add") + + if ($action == "update") { + $sql = "update v_contacts set "; + $sql .= "contact_type = '$contact_type', "; + $sql .= "contact_organization = '$contact_organization', "; + $sql .= "contact_name_given = '$contact_name_given', "; + $sql .= "contact_name_family = '$contact_name_family', "; + $sql .= "contact_nickname = '$contact_nickname', "; + $sql .= "contact_title = '$contact_title', "; + $sql .= "contact_role = '$contact_role', "; + $sql .= "contact_email = '$contact_email', "; + $sql .= "contact_url = '$contact_url', "; + $sql .= "contact_time_zone = '$contact_time_zone', "; + $sql .= "contact_note = '$contact_note' "; + $sql .= "where domain_uuid = '".$_SESSION['domain_uuid']."' "; + $sql .= "and contact_uuid = '$contact_uuid' "; + $db->exec(check_sql($sql)); + unset($sql); + + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Update Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + } //if ($action == "update") + } //if ($_POST["persistformvar"] != "true") +} //(count($_POST)>0 && strlen($_POST["persistformvar"]) == 0) + +//pre-populate the form + if (count($_GET)>0 && $_POST["persistformvar"] != "true") { + $contact_uuid = $_GET["id"]; + $sql = ""; + $sql .= "select * from v_contacts "; + $sql .= "where domain_uuid = '".$_SESSION['domain_uuid']."' "; + $sql .= "and contact_uuid = '$contact_uuid' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach ($result as &$row) { + $contact_type = $row["contact_type"]; + $contact_organization = $row["contact_organization"]; + $contact_name_given = $row["contact_name_given"]; + $contact_name_family = $row["contact_name_family"]; + $contact_nickname = $row["contact_nickname"]; + $contact_title = $row["contact_title"]; + $contact_role = $row["contact_role"]; + $contact_email = $row["contact_email"]; + $contact_url = $row["contact_url"]; + $contact_time_zone = $row["contact_time_zone"]; + $contact_note = $row["contact_note"]; + break; //limit to 1 row + } + unset ($prep_statement); + } + +//show the header + require_once "includes/header.php"; + +//show the content + echo "
"; + echo "\n"; + echo "\n"; + echo " "; + echo " "; + echo "
\n"; + echo "
"; + + echo "
\n"; + echo "\n"; + echo "\n"; + if ($action == "add") { + echo "\n"; + } + if ($action == "update") { + echo "\n"; + } + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "
Contact AddContact Edit\n"; + echo " \n"; + echo " \n"; + if ($action == "update" && is_dir($_SERVER["DOCUMENT_ROOT"].PROJECT_PATH.'/app/invoices')) { + echo " \n"; + } + echo " \n"; + echo "
\n"; + echo "The contact is a list of individuals and organizations.

\n"; + echo "
\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "
\n"; + + echo "
\n"; + echo "\n"; + echo "\n"; + echo " \n"; + echo " \n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + //echo "\n"; + //echo "\n"; + //echo "\n"; + //echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + //echo "\n"; + //echo "\n"; + //echo "\n"; + //echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo " \n"; + echo " \n"; + echo " "; + echo "
User Information 
\n"; + echo " Type:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Select the contact type.\n"; + echo "
\n"; + echo " Organization:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the organization.\n"; + echo "
\n"; + echo " First Name:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the given name.\n"; + echo "
\n"; + echo " Last Name:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the family name.\n"; + echo "
\n"; + echo " Nickname:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the nickname.\n"; + echo "
\n"; + echo " Title:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the title.\n"; + echo "
\n"; + echo " Role:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the role.\n"; + echo "
Contact Information 
\n"; + echo " Email:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the email address.\n"; + echo "
\n"; + echo " URL:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the website address.\n"; + echo "
Additional Information 
\n"; + echo " Time Zone:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the time zone.\n"; + echo "
\n"; + echo " Notes:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the notes.\n"; + echo "
\n"; + if ($action == "update") { + echo " \n"; + } + echo " \n"; + echo "
"; + echo "
"; + + echo "
\n"; + //echo "

\n"; + if ($action == "update") { + require "contact_phones.php"; + require "contact_addresses.php"; + require "contact_notes.php"; + //echo "

\n"; + } + + echo "
\n"; + + if ($action == "update") { + echo "
\n"; + + } + + echo "
"; + echo "
"; + +//include the footer + require_once "includes/footer.php"; +?> \ No newline at end of file diff --git a/app/contacts/contacts_vcard.php b/app/contacts/contacts_vcard.php new file mode 100644 index 0000000000..a1838389b0 --- /dev/null +++ b/app/contacts/contacts_vcard.php @@ -0,0 +1,202 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('contacts_view')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +if (count($_GET)>0) { + //create the vcard object + require_once "includes/class_vcard.php"; + $vcard = new vcard(); + + //get the contact id + $contact_uuid = $_GET["id"]; + + //get the contact's information + $sql = ""; + $sql .= "select * from v_contacts "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and contact_uuid = '$contact_uuid' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach ($result as &$row) { + $contact_type = $row["contact_type"]; + $contact_organization = $row["contact_organization"]; + $contact_name_given = $row["contact_name_given"]; + $contact_name_family = $row["contact_name_family"]; + $contact_nickname = $row["contact_nickname"]; + $contact_title = $row["contact_title"]; + $contact_role = $row["contact_role"]; + $contact_email = $row["contact_email"]; + $contact_url = $row["contact_url"]; + $contact_time_zone = $row["contact_time_zone"]; + $contact_note = $row["contact_note"]; + break; //limit to 1 row + } + unset ($prep_statement); + + $vcard->data['company'] = $contact_organization; + $vcard->data['first_name'] = $contact_name_given; + $vcard->data['last_name'] = $contact_name_family; + $vcard->data['contact_email1'] = $contact_email; + $vcard->data['contact_url'] = $contact_url; + + if ($_GET['type'] == "image" || $_GET['type'] == "html") { + //don't add this to the QR code at this time + } + else { + $vcard->data['display_name'] = $contact_name_given." ".$contact_name_family; + $vcard->data['contact_nickname'] = $contact_nickname; + $vcard->data['contact_title'] = $contact_title; + $vcard->data['contact_role'] = $contact_role; + $vcard->data['timezone'] = $contact_time_zone; + $vcard->data['contact_note'] = $contact_note; + } + + //get the contact's telephone numbers + $sql = ""; + $sql .= "select * from v_contact_phones "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and contact_uuid = '$contact_uuid' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach ($result as &$row) { + $phone_type = $row["phone_type"]; + $phone_number = $row["phone_number"]; + $vcard->data[$phone_type.'_tel'] = $phone_number; + } + unset ($prep_statement); + + //get the contact's addresses + if ($_GET['type'] == "image" || $_GET['type'] == "html") { + //don't add this to the QR code at this time + } + else { + $sql = ""; + $sql .= "select * from v_contact_addresses "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and contact_uuid = '$contact_uuid' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach ($result as &$row) { + $address_type = $row["address_type"]; + $address_street = $row["address_street"]; + $address_extended = $row["address_extended"]; + $address_locality = $row["address_locality"]; + $address_region = $row["address_region"]; + $address_postal_code = $row["address_postal_code"]; + $address_country = $row["address_country"]; + $address_latitude = $row["address_latitude"]; + $address_longitude = $row["address_longitude"]; + $address_type = strtolower(trim($address_type)); + + $vcard->data[$address_type.'_address'] = $address_street; + $vcard->data[$address_type.'_extended_address'] = $address_extended; + $vcard->data[$address_type.'_city'] = $address_locality; + $vcard->data[$address_type.'_state'] = $address_region; + $vcard->data[$address_type.'_postal_code'] = $address_postal_code; + $vcard->data[$address_type.'_country'] = $address_country; + } + unset ($prep_statement); + } + + //download the vcard + if ($_GET['type'] == "download") { + $vcard->download(); + } + + //show the vcard in an text qr code + if ($_GET['type'] == "text") { + $vcard->build(); + $content = $vcard->card; + echo $content; + } + + //show the vcard in an image qr code + if ($_GET['type'] == "image" || $_GET['type'] == "html") { + $vcard->build(); + $content = $vcard->card; + + //include + require_once "includes/qr/qrcode.php"; + + //error correction level + //QR_ERROR_CORRECT_LEVEL_L : $e = 0; + //QR_ERROR_CORRECT_LEVEL_M : $e = 1; + //QR_ERROR_CORRECT_LEVEL_Q : $e = 2; + //QR_ERROR_CORRECT_LEVEL_H : $e = 3; + + //get the qr object + $qr = QRCode::getMinimumQRCode($content, QR_ERROR_CORRECT_LEVEL_L); + } + + //show the vcard as an png image + if ($_GET['type'] == "image") { + header("Content-type: image/png"); + $im = $qr->createImage(5, 10); + imagepng($im); + imagedestroy($im); + } + + //show the vcard in an html qr code + if ($_GET['type'] == "html") { + $qr->make(); + $qr->printHTML(); + } +} + +/* +//additional un accounted fields +additional_name +name_prefix +name_suffix +department +work_po_box +home_po_box +home_extended_address +home_address +home_city +home_state +home_postal_code +home_country +pager_tel +contact_email2 +photo +birthday +sort_string +*/ + +?> \ No newline at end of file diff --git a/app/contacts/root.php b/app/contacts/root.php new file mode 100644 index 0000000000..7b882438ea --- /dev/null +++ b/app/contacts/root.php @@ -0,0 +1,50 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ + +// make sure the PATH_SEPARATOR is defined + if (!defined("PATH_SEPARATOR")) { + if ( strpos( $_ENV[ "OS" ], "Win" ) !== false ) { define("PATH_SEPARATOR", ";"); } else { define("PATH_SEPARATOR", ":"); } + } + +// make sure the document_root is set + $_SERVER["SCRIPT_FILENAME"] = str_replace("\\", "/", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = str_replace($_SERVER["PHP_SELF"], "", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = realpath($_SERVER["DOCUMENT_ROOT"]); + //echo "DOCUMENT_ROOT: ".$_SERVER["DOCUMENT_ROOT"]."
\n"; + //echo "PHP_SELF: ".$_SERVER["PHP_SELF"]."
\n"; + //echo "SCRIPT_FILENAME: ".$_SERVER["SCRIPT_FILENAME"]."
\n"; + +// if the project directory exists then add it to the include path otherwise add the document root to the include path + if (is_dir($_SERVER["DOCUMENT_ROOT"].'/fusionpbx')){ + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', '/fusionpbx'); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER["DOCUMENT_ROOT"].'/fusionpbx' ); + } + else { + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', ''); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER['DOCUMENT_ROOT'] ); + } + +?> \ No newline at end of file diff --git a/app/content/app_config.php b/app/content/app_config.php new file mode 100644 index 0000000000..3cbe6cfd13 --- /dev/null +++ b/app/content/app_config.php @@ -0,0 +1,351 @@ + \ No newline at end of file diff --git a/app/content/config.php b/app/content/config.php new file mode 100644 index 0000000000..9a8794e676 --- /dev/null +++ b/app/content/config.php @@ -0,0 +1,32 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ + +$module_title = 'Content'; +$rss_category = 'content'; + +$rss_sub_show = 0; //1 = yes, 0 = no +$rss_sub_title = 'Content'; +?> \ No newline at end of file diff --git a/app/content/index.php b/app/content/index.php new file mode 100644 index 0000000000..5c6fdd0a2f --- /dev/null +++ b/app/content/index.php @@ -0,0 +1,50 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +return; //disable + +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('content_view')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +require_once "config.php"; +session_start(); + +require_once "includes/header.php"; +echo "\n"; + +$_GET["c"] = "html"; +require_once "rss.php"; +require_once "includes/footer.php"; + +return; +?> diff --git a/app/content/root.php b/app/content/root.php new file mode 100644 index 0000000000..7b882438ea --- /dev/null +++ b/app/content/root.php @@ -0,0 +1,50 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ + +// make sure the PATH_SEPARATOR is defined + if (!defined("PATH_SEPARATOR")) { + if ( strpos( $_ENV[ "OS" ], "Win" ) !== false ) { define("PATH_SEPARATOR", ";"); } else { define("PATH_SEPARATOR", ":"); } + } + +// make sure the document_root is set + $_SERVER["SCRIPT_FILENAME"] = str_replace("\\", "/", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = str_replace($_SERVER["PHP_SELF"], "", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = realpath($_SERVER["DOCUMENT_ROOT"]); + //echo "DOCUMENT_ROOT: ".$_SERVER["DOCUMENT_ROOT"]."
\n"; + //echo "PHP_SELF: ".$_SERVER["PHP_SELF"]."
\n"; + //echo "SCRIPT_FILENAME: ".$_SERVER["SCRIPT_FILENAME"]."
\n"; + +// if the project directory exists then add it to the include path otherwise add the document root to the include path + if (is_dir($_SERVER["DOCUMENT_ROOT"].'/fusionpbx')){ + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', '/fusionpbx'); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER["DOCUMENT_ROOT"].'/fusionpbx' ); + } + else { + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', ''); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER['DOCUMENT_ROOT'] ); + } + +?> \ No newline at end of file diff --git a/app/content/rss.css b/app/content/rss.css new file mode 100644 index 0000000000..cfe4385064 --- /dev/null +++ b/app/content/rss.css @@ -0,0 +1,44 @@ +rss { + display: block; + font-family: verdana, arial; +} + +title { + display: block; + margin: 5px; + padding: 2px; + color: #77A3EF; + border-bottom: 1px solid #77A3EF; +} + +link { + display: block; + font-size: small; + padding-left: 10px; +} + +description { + display: block; + font-size: small; + padding-left: 10px; +} + +item { + display: block; + padding: 2px 30px 2px 30px; +} + +description { + display: block; + background-color: #FCFCFC; + margin: 20px; + text-align: left; + padding: 5px; + color: #7f7f7f; + border: 1px solid #EEEEEE; +} + +/* all hidden elements */ +language, lastBuildDate, ttl, guid, category, pubDate, copyright, webmaster, comments { + display: none; +} diff --git a/app/content/rss.php b/app/content/rss.php new file mode 100644 index 0000000000..fff631d105 --- /dev/null +++ b/app/content/rss.php @@ -0,0 +1,244 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +return; //disable +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +require_once "config.php"; +if (permission_exists('content_view')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +//include module specific information +if (strlen($mod_config_path)==0) { + include "config.php"; +} +else { + //$mod_config_path = "/news"; //examples + //$mod_config_path = "/app/news"; //examples + include $mod_config_path.'/config.php'; +} + +$rss_css_url = 'http://'.$_SERVER["HTTP_HOST"].$_SERVER["PHP_SELF"]; +$rss_css_url = str_replace ("rss.php", "rss.css", $rss_css_url); +$content_type = $_GET["c"]; +//echo "contenttype $content_type"; +if (strlen($_GET["rss_category"]) > 0) { + $rss_category = $_GET["rss_category"]; +} +if (strlen($content_type) == 0) { + $content_type = "rss"; //define default contenttype +} +if ($content_type == "html") { + session_start(); +} +//echo $rss_css_url; +//exit; + +if ($content_type == "rss") { + header('Content-Type: text/xml'); + echo ''; + echo ''; + //echo ''; + //echo "\n"; + echo "\n"; + echo "\n"; + + echo "$module_title RSS Feed\n"; + //echo "http://www.xul.fr/\n"; + echo "Task List for RSS...\n"; + echo "en-US\n"; + //echo "\n"; + //echo "\n"; + //echo " http://www.xul.fr/xul-icon.gif\n"; + //echo " http://www.xul.fr/index.html\n"; + //echo ""; +} + +$sql = ""; +$sql .= "select * from v_rss "; +$sql .= "where rss_category = '$rss_category' "; +$sql .= "and length(rss_del_date) = 0 "; +$sql .= "or rss_category = '$rss_category' "; +$sql .= "and rss_del_date is null "; +$sql .= "order by rss_uuid asc "; +$prep_statement = $db->prepare(check_sql($sql)); +$prep_statement->execute(); + +$last_cat = ""; +$count = 0; +$result = $prep_statement->fetchAll(PDO::FETCH_NAMED); +foreach ($result as &$row) { + + $rss_uuid = $row["rss_uuid"]; + $rss_title = $row["rss_title"]; + $rss_description = $row["rss_description"]; + $rss_link = $row["rss_link"]; + + //$rss_description = $row[rss_sub_description]; + //$rss_description = str_replace ("\r\n", "
", $rss_description); + //$rss_description = str_replace ("\n", "
", $rss_description); + + if ($content_type == "rss") { + $rss_title = htmlentities($rss_title); + $rss_description = htmlentities($rss_description); + + echo "\n"; + echo "".$rss_title."\n"; + echo "".$rss_description."\n"; + echo "".$rss_link."\n"; + //echo "12 Mar 2007 19:38:06 GMT\n"; + //echo "http://www.google.com/log/123\n"; + //echo "http://www.google.com/log/121#comments\n"; + //echo "Web Design"; + echo "\n"; + echo "\n"; + + } + else { + if (strlen($rss_link) > 0) { + echo "".$rss_title."
\n"; + } + else { + echo "".$rss_title."
\n"; + } + echo "".$rss_description."\n"; + echo "

"; + + if ($rss_sub_show == 1) { + //--- Begin Sub List ------------------------------------------------------- + + echo "


"; + echo "$rss_sub_title
"; + + $sql = ""; + $sql .= "select * from v_rss_sub "; + $sql .= "where rss_uuid = '$rss_uuid' "; + $sql .= "and length(rss_sub_del_date) = 0 "; + $sql .= "or rss_uuid = '$rss_uuid' "; + $sql .= "and rss_sub_del_date is null "; + + if (strlen($order_by)> 0) { $sql .= "order by $order_by $order "; } + + $prep_statement_2 = $db->prepare($sql); + $prep_statement_2->execute(); + $result2 = $prep_statement->fetchAll(PDO::FETCH_NAMED); + $result_count2 = count($result2); + + $c2 = 0; + $row_style["0"] = "background-color: #F5F5DC;"; + $row_style["1"] = "background-color: #FFFFFF;"; + + echo "
\n"; + //echo " Notes"; + echo "\n"; + //echo ""; + if ($result_count == 0) { //no results + echo ""; + } + else { + echo "\n"; + + foreach($result2 as $row2) { + echo "\n"; + //echo ""; + //echo ""; + //echo ""; + echo ""; + + echo ""; + + //echo ""; + //echo ""; + //echo ""; + //echo ""; + //echo ""; + //echo ""; + echo ""; + + $rss_sub_description = $row2[rss_sub_description]; + //$rss_sub_description = str_replace ("\r\n", "
", $rss_sub_description); + //$rss_sub_description = str_replace ("\n", "
", $rss_sub_description); + + + echo ""; + echo "\n"; + echo ""; + + echo ""; + + echo "\n"; + if ($c2==0) { $c2=1; } else { $c2=0; } + } //end foreach + unset($sql, $result, $row_count); + + echo "
 
".$rss_uuid." ".$row2[rss_sub_title]."  ".$row2[rss_sub_link]." "; + echo " ".$row2[rss_sub_title].""; + echo "".$row2[rss_sub_add_date]."".$row2[rss_sub_optional_1]."".$row2[rss_sub_optional_2]."".$row2[rss_sub_optional_3]."".$row2[rss_sub_optional_4]."".$row2[rss_sub_optional_5]."".$row2[rss_sub_add_user].""; + echo "  "; + //echo " "; + echo "   \n"; + //echo " Update "; + echo "
"; + echo "".$rss_sub_description." "; + echo "
\n"; + echo "
\n"; + + + echo "

"; + echo "
\n"; + //--- End Sub List ------------------------------------------------------- + } + } + + + //echo "\n"; + //echo " ".$row["favname"]."\n"; + //echo "".$row["favdesc"]."\n"; + //echo "".$row["favurl"]."\n"; + //echo "\n"; + + //$last_cat = $row["favcat"]; + $count++; + +} + +if ($content_type == "rss") { + echo "\n"; + echo "\n"; + echo "\n"; +} + +?> \ No newline at end of file diff --git a/app/content/rssadd.php b/app/content/rssadd.php new file mode 100644 index 0000000000..0a831029ea --- /dev/null +++ b/app/content/rssadd.php @@ -0,0 +1,347 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +require_once "config.php"; +if (permission_exists('content_add')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +if (count($_POST)>0) { + + //get the http values and set them as variables + $rss_sub_category = check_str($_POST["rss_sub_category"]); + $rss_title = check_str($_POST["rss_title"]); + $rss_link = check_str($_POST["rss_link"]); + $rss_description = check_str($_POST["rss_description"]); + $rss_img = check_str($_POST["rss_img"]); + $rss_optional_1 = check_str($_POST["rss_optional_1"]); + $rss_optional_2 = check_str($_POST["rss_optional_2"]); + $rss_optional_3 = check_str($_POST["rss_optional_3"]); + $rss_optional_4 = check_str($_POST["rss_optional_4"]); + $rss_optional_5 = check_str($_POST["rss_optional_5"]); + $rss_group = check_str($_POST["rss_group"]); + $rss_order = check_str($_POST["rss_order"]); + + //insert the data into the database + $rss_uuid = uuid(); + $sql = "insert into v_rss "; + $sql .= "("; + $sql .= "domain_uuid, "; + $sql .= "rss_uuid, "; + $sql .= "rss_category, "; + $sql .= "rss_sub_category, "; + $sql .= "rss_title, "; + $sql .= "rss_link, "; + $sql .= "rss_description, "; + $sql .= "rss_img, "; + $sql .= "rss_optional_1, "; + $sql .= "rss_optional_2, "; + $sql .= "rss_optional_3, "; + $sql .= "rss_optional_4, "; + $sql .= "rss_optional_5, "; + $sql .= "rss_group, "; + $sql .= "rss_order, "; + $sql .= "rss_add_date, "; + $sql .= "rss_add_user "; + $sql .= ")"; + $sql .= "values "; + $sql .= "("; + $sql .= "'$domain_uuid', "; + $sql .= "'$rss_uuid', "; + $sql .= "'$rss_category', "; + $sql .= "'$rss_sub_category', "; + $sql .= "'$rss_title', "; + $sql .= "'$rss_link', "; + $sql .= "'$rss_description', "; + $sql .= "'$rss_img', "; + $sql .= "'$rss_optional_1', "; + $sql .= "'$rss_optional_2', "; + $sql .= "'$rss_optional_3', "; + $sql .= "'$rss_optional_4', "; + $sql .= "'$rss_optional_5', "; + $sql .= "'$rss_group', "; + $sql .= "'$rss_order', "; + $sql .= "now(), "; + $sql .= "'".$_SESSION["username"]."' "; + $sql .= ")"; + $db->exec(check_sql($sql)); + unset($sql); + + require_once "includes/header.php"; + echo "\n"; + echo "
"; + echo "Add Complete"; + echo "
"; + require_once "includes/footer.php"; + return; +} + + require_once "includes/header.php"; + if (is_dir($_SERVER["DOCUMENT_ROOT"].PROJECT_PATH.'/includes/tiny_mce')) { + if ($rss_optional_1 == "text/html") { + require_once "includes/wysiwyg.php"; + } + } + else { + //--- Begin: Edit Area ----------------------------------------------------- + echo " \n"; + echo " \n"; + + echo " "; + //--- End: Edit Area ------------------------------------------------------- + } + + echo "
"; + echo "\n"; + echo "\n"; + echo " "; + echo " "; + echo "
\n"; + + echo "
"; + echo ""; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + + echo " "; + echo " "; + echo " "; + echo " "; + + /* + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + */ + + echo " "; + echo " "; + echo " "; + echo " "; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo " "; + //echo " "; + echo " "; + echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + + echo " "; + echo " "; + echo " "; + echo "
Content Add

Category:
Sub Category:
Title:
Link:
Group:"; + //echo " "; + + //---- Begin Select List -------------------- + $sql = "SELECT * FROM v_groups "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + + echo ""; + unset($sql, $result); + //---- End Select List -------------------- + + echo "
\n"; + echo " Template: \n"; + echo " \n"; + echo "\n"; + echo "
\n"; + echo " Select a template to set as the default and then press save.
\n"; + echo "
Type:"; + echo " "; + echo "
\n"; + echo " Order:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "
"; + echo " Content: "; + if (is_dir($_SERVER["DOCUMENT_ROOT"].PROJECT_PATH.'/includes/tiny_mce')) { + echo "       editor   on/off
"; + } + else { + echo " "; + } + echo "
Image:
Priority:"; + //echo " "; + //echo " "; + //echo "
Status:"; + //echo " "; + //echo " "; + //echo "
Optional 3:
Optional 4:
rss_optional_5:
rss_add_date:
"; + echo " \n"; + echo "
"; + echo "
"; + + + echo "
"; + echo "
"; + + +require_once "includes/footer.php"; +?> diff --git a/app/content/rsscontent.php b/app/content/rsscontent.php new file mode 100644 index 0000000000..07cd5f98ac --- /dev/null +++ b/app/content/rsscontent.php @@ -0,0 +1,74 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +require_once "config.php"; +if (permission_exists('content_view')) { + //access granted +} +else { + echo "access denied"; + exit; +} + + +//get data from the db +$rss_uuid = $_REQUEST["rss_uuid"]; + +$sql = ""; +$sql .= "select * from v_rss "; +$sql .= "where domain_uuid = '$domain_uuid' "; +$sql .= "and rss_uuid = '$rss_uuid' "; +//echo $sql; +$prep_statement = $db->prepare(check_sql($sql)); +$prep_statement->execute(); +$result = $prep_statement->fetchAll(PDO::FETCH_NAMED); +foreach ($result as &$row) { + $rss_category = $row["rss_category"]; + $rss_sub_category = $row["rss_sub_category"]; + $rss_title = $row["rss_title"]; + $rss_link = $row["rss_link"]; + $rss_description = $row["rss_description"]; + $rss_img = $row["rss_img"]; + $rss_optional_1 = $row["rss_optional_1"]; + $rss_optional_2 = $row["rss_optional_2"]; + $rss_optional_3 = $row["rss_optional_3"]; + $rss_optional_4 = $row["rss_optional_4"]; + $rss_optional_5 = $row["rss_optional_5"]; + $rss_add_date = $row["rss_add_date"]; + $rss_add_user = $row["rss_add_user"]; + $rss_group = $row["rss_group"]; + $rss_order = $row["rss_order"]; + //$rss_description = str_replace ("\r\n", "
", $rss_description); + + echo $rss_description; + //return; + + break; //limit to 1 row +} + +?> diff --git a/app/content/rssdelete.php b/app/content/rssdelete.php new file mode 100644 index 0000000000..496e3cd954 --- /dev/null +++ b/app/content/rssdelete.php @@ -0,0 +1,62 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +require_once "config.php"; +if (permission_exists('content_delete')) { + //access granted +} +else { + echo "access denied"; + exit; +} + + +if (count($_GET)>0) { + $rss_uuid = check_str($_GET["rss_uuid"]); + + //mark the the item as deleted and who deleted it + $sql = "update v_rss set "; + $sql .= "rss_del_date = now(), "; + $sql .= "rss_del_user = '".$_SESSION["username"]."' "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and rss_uuid = '$rss_uuid' "; + $sql .= "and rss_category = '$rss_category' "; + $db->exec(check_sql($sql)); + unset($sql); + + require_once "includes/header.php"; + echo "\n"; + echo "
"; + echo "Delete Completed"; + echo "
"; + require_once "includes/footer.php"; + return; +} + + +?> diff --git a/app/content/rsslist.php b/app/content/rsslist.php new file mode 100644 index 0000000000..b28fd6131d --- /dev/null +++ b/app/content/rsslist.php @@ -0,0 +1,217 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +require_once "config.php"; +if (permission_exists('content_view')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +if (!function_exists('th_order_by')) { + //html table header order by + function th_order_by($field_name, $columntitle, $order_by, $order) { + + $html .= "    "; + if (strlen($order_by)==0) { + $html .= "$columntitle"; + } + else { + if ($order=="asc") { + $html .= "$columntitle"; + } + else { + $html .= "$columntitle"; + } + } + $html .= "    "; + + return $html; + } +} + +require_once "includes/header.php"; +echo "\n"; + +$order_by = $_GET["order_by"]; +$order = $_GET["order"]; + + + echo "
"; + echo "\n"; + echo "\n"; + echo " \n"; + echo "\n"; + echo "
\n"; + + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo "
"; + echo " $module_title List"; + echo ""; + //echo "    \n"; + echo "
"; + + $sql = ""; + $sql .= "select * from v_rss "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and rss_category = '$rss_category' "; + $sql .= "and length(rss_del_date) = 0 "; + $sql .= "or domain_uuid = '$domain_uuid' "; + $sql .= "and rss_category = '$rss_category' "; + $sql .= "and rss_del_date is null "; + if (strlen($order_by)> 0) { + $sql .= "order by $order_by $order "; + } + else { + $sql .= "order by rss_order asc "; + } + //echo $sql; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + $result_count = count($result); + + $c = 0; + $row_style["0"] = "row_style0"; + $row_style["1"] = "row_style1"; + + echo "
\n"; + echo "\n"; + echo ""; + echo th_order_by('rss_title', 'Title', $order_by, $order); + echo th_order_by('rss_link', 'Link', $order_by, $order); + //echo th_order_by('rss_sub_category', 'Template', $order_by, $order); + echo th_order_by('rss_group', 'Group', $order_by, $order); + echo th_order_by('rss_order', 'Order', $order_by, $order); + if ($result_count == 0) { //no results + echo "\n"; + echo ""; + + if ($result_count > 0) { + foreach($result as $row) { + //print_r( $row ); + echo "\n"; + //echo ""; + //echo ""; + + echo ""; + echo ""; + //echo ""; + if (strlen($row[rss_group]) > 0) { + echo ""; + } + else { + echo ""; + } + + //echo ""; + //echo ""; + //echo ""; //priority + + //echo ""; //completion status + + //echo ""; + //echo ""; + //echo ""; + echo ""; + + //echo ""; + + echo " \n"; + + //echo ""; + + echo ""; + + if ($c==0) { $c=1; } else { $c=0; } + } //end foreach + unset($sql, $result, $row_count); + + } //end if results + + echo "\n"; + echo "\n"; + echo "\n"; + echo "
\n"; + } + else { + echo "\n"; + } + echo " $v_link_label_add\n"; + echo "
".$row[rss_uuid]."".$row[rss_category]." ".$row[rss_title]."  ".$row[rss_link]." ".$row[rss_sub_category]." ".$row[rss_group]."public".$row[rss_description]."".$row[rss_img]." ".$row[rss_optional_1]."  "; + //sif ($row[rss_optional_2]=="100") { + // echo "Complete"; + //} + //else { + // echo $row[rss_optional_2]."%"; + //} + //echo " ".$row[rss_optional_3]."".$row[rss_optional_4]."".$row[rss_optional_5]."".$row[rss_order]." "; + //echo " "; + //echo " "; + //echo "\n"; + echo " $v_link_label_edit\n"; + echo " $v_link_label_delete\n"; + echo " "; + //echo " "; + //echo "
\n"; + + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "
 $paging_controls\n"; + echo " $v_link_label_add\n"; + echo "
\n"; + + echo "
\n"; + echo "
\n"; + + echo "
"; + echo "
\n"; + //echo "   \n"; + //echo "   \n"; + echo "
"; + + echo "

"; + require_once "includes/footer.php"; + + unset ($result_count); + unset ($result); + unset ($key); + unset ($val); + unset ($c); + +?> diff --git a/app/content/rssmovedown.php b/app/content/rssmovedown.php new file mode 100644 index 0000000000..05e91f8862 --- /dev/null +++ b/app/content/rssmovedown.php @@ -0,0 +1,92 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +require_once "config.php"; +if (permission_exists('content_edit')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +//move down more than one level at a time +//update v_rss set rss_order = (rss_order+1) where rss_order > 2 or rss_order = 2 + +if (count($_GET)>0) { + $rss_uuid = check_str($_GET["rss_uuid"]); + $rss_order = check_str($_GET["rss_order"]); + + $sql = "SELECT rss_order FROM v_rss "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and rss_category = '$rss_category' "; + $sql .= "order by rss_order desc "; + $sql .= "limit 1 "; + //echo $sql."

"; + //return; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach ($result as &$row) { + //print_r( $row ); + $highestrss_order = $row[rss_order]; + } + unset($prep_statement); + + if ($rss_order != $highestrss_order) { + //move the current item's order number up + $sql = "update v_rss set "; + $sql .= "rss_order = (rss_order-1) "; //move down + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and rss_order = ".($rss_order+1)." "; + $sql .= "and rss_category = '$rss_category' "; + //echo $sql."

"; + $db->exec(check_sql($sql)); + unset($sql); + + //move the selected item's order number down + $sql = "update v_rss set "; + $sql .= "rss_order = (rss_order+1) "; //move up + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and rss_uuid = '$rss_uuid' "; + $sql .= "and rss_category = '$rss_category' "; + //echo $sql."

"; + $db->exec(check_sql($sql)); + unset($sql); + } + require_once "includes/header.php"; + echo "\n"; + echo "
"; + echo "Item Moved Down"; + echo "
"; + require_once "includes/footer.php"; + return; +} + + +?> diff --git a/app/content/rssmoveup.php b/app/content/rssmoveup.php new file mode 100644 index 0000000000..e2a4032673 --- /dev/null +++ b/app/content/rssmoveup.php @@ -0,0 +1,76 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +require_once "config.php"; +if (permission_exists('content_view')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +//move down more than one level at a time +//update v_rss set rss_order = (rss_order+1) where rss_order > 2 or rss_order = 2 + +if (count($_GET)>0) { + $rss_uuid = check_str($_GET["rss_uuid"]); + $rss_order = check_str($_GET["rss_order"]); + if ($rss_order != 1) { + //move the current item's order number down + $sql = "update v_rss set "; + $sql .= "rss_order = (rss_order+1) "; //move down + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and rss_order = ".($rss_order-1)." "; + $sql .= "and rss_category = '$rss_category' "; + //echo $sql."

"; + $db->exec(check_sql($sql)); + unset($sql); + + + //move the selected item's order number up + $sql = "update v_rss set "; + $sql .= "rss_order = (rss_order-1) "; //move up + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and rss_uuid = '$rss_uuid' "; + $sql .= "and rss_category = '$rss_category' "; + //echo $sql."

"; + $db->exec(check_sql($sql)); + unset($sql); + } + require_once "includes/header.php"; + echo "\n"; + echo "
"; + echo "Item Moved Up"; + echo "
"; + require_once "includes/footer.php"; + return; +} + + +?> diff --git a/app/content/rsssearch.php b/app/content/rsssearch.php new file mode 100644 index 0000000000..b1c1dcdd40 --- /dev/null +++ b/app/content/rsssearch.php @@ -0,0 +1,277 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +return; //disabled + +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +require_once "config.php"; +if (permission_exists('content_view')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +if (count($_POST)>0) { + $rss_uuid = check_str($_POST["rss_uuid"]); + //$rss_category = check_str($_POST["rss_category"]); //defined in local config.php + $rss_sub_category = check_str($_POST["rss_sub_category"]); + $rss_title = check_str($_POST["rss_title"]); + $rss_link = check_str($_POST["rss_link"]); + $rss_description = check_str($_POST["rss_description"]); + $rss_img = check_str($_POST["rss_img"]); + $rss_optional_1 = check_str($_POST["rss_optional_1"]); + $rss_optional_2 = check_str($_POST["rss_optional_2"]); + $rss_optional_3 = check_str($_POST["rss_optional_3"]); + $rss_optional_4 = check_str($_POST["rss_optional_4"]); + $rss_optional_5 = check_str($_POST["rss_optional_5"]); + $rss_add_date = check_str($_POST["rss_add_date"]); + $rss_add_user = check_str($_POST["rss_add_user"]); + + require_once "includes/header.php"; + + + + echo "
"; + echo "\n"; + + echo "\n"; + echo " \n"; + echo "\n"; + + } //end if results + + echo "
\n"; + echo "
"; + + + $sql = ""; + $sql .= "select * from v_rss "; + $sql .= "where "; + if (strlen($rss_uuid) > 0) { $sql .= "and rss_uuid like '%$rss_uuid%' "; } + if (strlen($rss_category) > 0) { $sql .= "and rss_category like '%$rss_category%' "; } + if (strlen($rss_sub_category) > 0) { $sql .= "and rss_sub_category like '%$rss_sub_category%' "; } + if (strlen($rss_title) > 0) { $sql .= "and rss_title like '%$rss_title%' "; } + if (strlen($rss_link) > 0) { $sql .= "and rss_link like '%$rss_link%' "; } + if (strlen($rss_description) > 0) { $sql .= "and rss_description like '%$rss_description%' "; } + if (strlen($rss_img) > 0) { $sql .= "and rss_img like '%$rss_img%' "; } + if (strlen($rss_optional_1) > 0) { $sql .= "and rss_optional_1 like '%$rss_optional_1%' "; } + if (strlen($rss_optional_2) > 0) { $sql .= "and rss_optional_2 like '%$rss_optional_2%' "; } + if (strlen($rss_optional_3) > 0) { $sql .= "and rss_optional_3 like '%$rss_optional_3%' "; } + if (strlen($rss_optional_4) > 0) { $sql .= "and rss_optional_4 like '%$rss_optional_4%' "; } + if (strlen($rss_optional_5) > 0) { $sql .= "and rss_optional_5 like '%$rss_optional_5%' "; } + if (strlen($rss_add_date) > 0) { $sql .= "and rss_add_date like '%$rss_add_date%' "; } + if (strlen($rss_add_user) > 0) { $sql .= "and rss_add_user like '%$rss_add_user%' "; } + $sql .= "and length(rss_del_date) = 0 "; + $sql .= "or "; + if (strlen($rss_uuid) > 0) { $sql .= "and rss_uuid like '%$rss_uuid%' "; } + if (strlen($rss_category) > 0) { $sql .= "and rss_category like '%$rss_category%' "; } + if (strlen($rss_sub_category) > 0) { $sql .= "and rss_sub_category like '%$rss_sub_category%' "; } + if (strlen($rss_title) > 0) { $sql .= "and rss_title like '%$rss_title%' "; } + if (strlen($rss_link) > 0) { $sql .= "and rss_link like '%$rss_link%' "; } + if (strlen($rss_description) > 0) { $sql .= "and rss_description like '%$rss_description%' "; } + if (strlen($rss_img) > 0) { $sql .= "and rss_img like '%$rss_img%' "; } + if (strlen($rss_optional_1) > 0) { $sql .= "and rss_optional_1 like '%$rss_optional_1%' "; } + if (strlen($rss_optional_2) > 0) { $sql .= "and rss_optional_2 like '%$rss_optional_2%' "; } + if (strlen($rss_optional_3) > 0) { $sql .= "and rss_optional_3 like '%$rss_optional_3%' "; } + if (strlen($rss_optional_4) > 0) { $sql .= "and rss_optional_4 like '%$rss_optional_4%' "; } + if (strlen($rss_optional_5) > 0) { $sql .= "and rss_optional_5 like '%$rss_optional_5%' "; } + if (strlen($rss_add_date) > 0) { $sql .= "and rss_add_date like '%$rss_add_date%' "; } + if (strlen($rss_add_user) > 0) { $sql .= "and rss_add_user like '%$rss_add_user%' "; } + $sql .= "and rss_del_date is null "; + + $sql = trim($sql); + if (substr($sql, -5) == "where"){ $sql = substr($sql, 0, (strlen($sql)-5)); } + if (substr($sql, -3) == " or"){ $sql = substr($sql, 0, (strlen($sql)-5)); } + $sql = str_replace ("where and", "where", $sql); + $sql = str_replace ("or and", "or", $sql); + //echo $sql; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + $result_count = count($result); + + $c = 0; + $row_style["0"] = "background-color: #F5F5DC;"; + $row_style["1"] = "background-color: #FFFFFF;"; + + echo "Search Results
"; + echo "
\n"; + echo "\n"; + echo ""; + + if ($result_count == 0) { //no results + echo ""; + } + else { //received results + + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + //echo ""; + //echo ""; + //echo ""; + //echo ""; + //echo ""; + //echo ""; + //echo ""; + //echo ""; + //echo ""; + //echo ""; + echo ""; + echo "\n"; + + foreach($result as $row) { + //print_r( $row ); + echo "\n"; + echo ""; + echo ""; + echo ""; + echo ""; + //echo ""; + //echo ""; + //echo ""; + //echo ""; + //echo ""; + //echo ""; + //echo ""; + //echo ""; + //echo ""; + //echo ""; + echo ""; + + echo "\n"; + if ($c==0) { $c=1; } else { $c=0; } + } //end foreach unset($sql, $result, $row_count); + + echo "
 
    ID        Category        Sub Category        Title        rss_link        rss_description        rss_img        rss_optional_1        rss_optional_2        rss_optional_3        rss_optional_4        rss_optional_5        rss_add_date        rss_add_user   
".$row[rss_uuid]."".$row[rss_category]."".$row[rss_sub_category]."".$row[rss_title]."".$row[rss_link]."".$row[rss_description]."".$row[rss_img]."".$row[rss_optional_1]."".$row[rss_optional_2]."".$row[rss_optional_3]."".$row[rss_optional_4]."".$row[rss_optional_5]."".$row[rss_add_date]."".$row[rss_add_user]."
\n"; + echo "
\n"; + + + echo "

"; + echo "
\n"; + echo "
"; + + echo "

"; + require_once "includes/footer.php"; + + unset ($result_count); + unset ($result); + unset ($key); + unset ($val); + unset ($c); + + } + else { + + echo "\n"; require_once "includes/header.php"; + echo "
"; + echo "\n"; + + echo "\n"; + echo " "; + echo " "; + echo "
\n"; + echo "
"; + + + echo "
"; + echo ""; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + echo " "; + echo " "; + echo " "; + echo "
Id:
Category:
rss_sub_category:
Title:
Link:
Desc:
Image:
rss_optional_1:
rss_optional_2:
rss_optional_3:
rss_optional_4:
rss_optional_5:
rss_add_date:
rss_add_user:
"; + echo "
"; + + + echo "
"; + echo "
"; + + +require_once "includes/footer.php"; + +} //end if not post +?> diff --git a/app/content/rsssubadd.php b/app/content/rsssubadd.php new file mode 100644 index 0000000000..af92000410 --- /dev/null +++ b/app/content/rsssubadd.php @@ -0,0 +1,174 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +require_once "config.php"; +if (permission_exists('content_add')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +$rss_uuid = $_GET["rss_uuid"]; + +if (count($_POST)>0) { + $rss_uuid = check_str($_POST["rss_uuid"]); + $rss_sub_title = check_str($_POST["rss_sub_title"]); + $rss_sub_link = check_str($_POST["rss_sub_link"]); + $rss_sub_description = check_str($_POST["rss_sub_description"]); + $rss_sub_optional_1 = check_str($_POST["rss_sub_optional_1"]); + $rss_sub_optional_2 = check_str($_POST["rss_sub_optional_2"]); + $rss_sub_optional_3 = check_str($_POST["rss_sub_optional_3"]); + $rss_sub_optional_4 = check_str($_POST["rss_sub_optional_4"]); + $rss_sub_optional_5 = check_str($_POST["rss_sub_optional_5"]); + $rss_sub_add_date = check_str($_POST["rss_sub_add_date"]); + $rss_sub_add_user = check_str($_POST["rss_sub_add_user"]); + + $rss_sub_uuid = uuid(); + $sql = "insert into v_rss_sub "; + $sql .= "("; + $sql .= "domain_uuid, "; + $sql .= "rss_uuid, "; + $sql .= "rss_sub_uuid, "; + $sql .= "rss_sub_title, "; + $sql .= "rss_sub_link, "; + $sql .= "rss_sub_description, "; + $sql .= "rss_sub_optional_1, "; + $sql .= "rss_sub_optional_2, "; + $sql .= "rss_sub_optional_3, "; + $sql .= "rss_sub_optional_4, "; + $sql .= "rss_sub_optional_5, "; + $sql .= "rss_sub_add_date, "; + $sql .= "rss_sub_add_user "; + $sql .= ")"; + $sql .= "values "; + $sql .= "("; + $sql .= "'$domain_uuid', "; + $sql .= "'$rss_uuid', "; + $sql .= "'$rss_sub_uuid', "; + $sql .= "'$rss_sub_title', "; + $sql .= "'$rss_sub_link', "; + $sql .= "'$rss_sub_description', "; + $sql .= "'$rss_sub_optional_1', "; + $sql .= "'$rss_sub_optional_2', "; + $sql .= "'$rss_sub_optional_3', "; + $sql .= "'$rss_sub_optional_4', "; + $sql .= "'$rss_sub_optional_5', "; + $sql .= "now(), "; + $sql .= "'".$_SESSION["username"]."' "; + $sql .= ")"; + $db->exec(check_sql($sql)); + unset($sql); + + require_once "includes/header.php"; + echo "\n"; + echo "
"; + echo "Add Complete"; + echo "
"; + require_once "includes/footer.php"; + return; +} + +//show the header + require_once "includes/header.php"; + require_once "includes/wysiwyg.php"; + +//show the content + echo "
"; + echo "\n"; + echo "\n"; + echo " "; + echo " "; + echo "
\n"; + echo "
"; + + echo "
"; + echo ""; + echo " "; + echo " "; + echo " "; + echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + /* + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + */ + //echo " "; + //echo " "; + //echo " "; + //echo " "; echo " "; + echo " "; + echo " "; + echo "
Title:
Link:
Description:"; + echo " "; + echo "
rss_sub_optional_1:
rss_sub_optional_2:
rss_sub_optional_3:
rss_sub_optional_4:
rss_sub_optional_5:
rss_sub_add_date:
rss_sub_add_user:
example:
"; + echo " "; + echo " "; + echo "
"; + echo "
"; + + echo "
"; + echo "
"; + +//show the footer + require_once "includes/footer.php"; +?> \ No newline at end of file diff --git a/app/content/rsssubcategoryadd.php b/app/content/rsssubcategoryadd.php new file mode 100644 index 0000000000..49e1af97d1 --- /dev/null +++ b/app/content/rsssubcategoryadd.php @@ -0,0 +1,117 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +require_once "config.php"; +if (permission_exists('content_add')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +if (count($_POST)>0) { + $rss_sub_category_uuid = uuid(); + $rss_category = check_str($_POST["rss_category"]); + $rss_sub_category = check_str($_POST["rss_sub_category"]); + $rss_sub_category_description = check_str($_POST["rss_sub_category_description"]); + $rss_add_user = check_str($_POST["rss_add_user"]); + $rss_add_date = check_str($_POST["rss_add_date"]); + + $sql = "insert into v_rss_sub_category "; + $sql .= "("; + $sql .= "domain_uuid, "; + $sql .= "rss_sub_category_uuid, "; + $sql .= "rss_category, "; + $sql .= "rss_sub_category, "; + $sql .= "rss_sub_category_description, "; + $sql .= "rss_add_user, "; + $sql .= "rss_add_date "; + $sql .= ")"; + $sql .= "values "; + $sql .= "("; + $sql .= "'$domain_uuid', "; + $sql .= "'$rss_sub_category_uuid', "; + $sql .= "'$rss_category', "; + $sql .= "'$rss_sub_category', "; + $sql .= "'$rss_sub_category_description', "; + $sql .= "'$rss_add_user', "; + $sql .= "'$rss_add_date' "; + $sql .= ")"; + $db->exec(check_sql($sql)); + unset($sql); + + require_once "includes/header.php"; + echo "\n"; + echo "Add Complete"; + require_once "includes/footer.php"; + return; +} + +require_once "includes/header.php"; +echo "
"; +echo "\n"; +echo "\n"; +echo " "; +echo " "; +echo "
\n"; +echo "
"; + +echo "
"; +echo ""; +echo " "; +echo " "; +echo " "; +echo " "; +echo " "; +echo " "; +echo " "; +echo " "; +echo " "; +echo " "; +echo " "; +echo " "; +echo " "; +echo " "; +echo " "; +echo " "; +echo " "; +echo " "; +echo " "; +echo " \n"; +echo " "; +echo " "; +echo " "; +echo "
RSS Category:
rss_sub_category:
rss_sub_category_description:
rss_add_user:
rss_add_date:
"; +echo "
"; + +echo "
"; +echo "
"; + +require_once "includes/footer.php"; +?> \ No newline at end of file diff --git a/app/content/rsssubcategorylist.php b/app/content/rsssubcategorylist.php new file mode 100644 index 0000000000..b27b42622e --- /dev/null +++ b/app/content/rsssubcategorylist.php @@ -0,0 +1,204 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +require_once "config.php"; +if (permission_exists('content_view')) { + //access granted +} +else { + echo "access denied"; + exit; +} + + +require_once "includes/header.php"; + +$order_by = $_GET["order_by"]; +$order = $_GET["order"]; + + + +echo "
"; +echo "\n"; + +echo "\n"; +echo " \n"; + echo "\n"; + +} //end if results + +echo "
\n"; +echo "
"; + + +$sql = ""; +$sql .= "select * from v_rss_sub_category "; +$sql .= "where domain_uuid = '$domain_uuid' "; +if (strlen($order_by)> 0) { $sql .= "order by $order_by $order "; } + +$prep_statement = $db->prepare(check_sql($sql)); +$prep_statement->execute(); +$result = $prep_statement->fetchAll(PDO::FETCH_NAMED); +$result_count = count($result); + +$c = 0; +$row_style["0"] = "background-color: #F5F5DC;"; +$row_style["1"] = "background-color: #FFFFFF;"; + +echo "
\n"; +echo "\n"; +echo ""; + +if ($result_count == 0) { //no results + echo ""; +} +else { //received results + + echo ""; + echo ""; + + echo ""; + + echo ""; + + echo ""; + + echo ""; + + echo ""; + + echo ""; + echo "\n"; + + foreach($result as $row) { + //print_r( $row ); + echo "\n"; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + + echo "\n"; + if ($c==0) { $c=1; } else { $c=0; } + } //end foreach unset($sql, $result, $row_count); + + echo "
 
    "; + if (strlen($order_by)==0) { + echo "rss_sub_category_uuid"; + } + else { + if ($order=="asc") { + echo "rss_sub_category_uuid"; + } + else { + echo "rss_sub_category_uuid"; + } + } + echo "        "; + if (strlen($order_by)==0) { + echo "rss_category"; + } + else { + if ($order=="asc") { + echo "rss_category"; + } + else { + echo "rss_category"; + } + } + echo "        "; + if (strlen($order_by)==0) { + echo "rss_sub_category"; + } + else { + if ($order=="asc") { + echo "rss_sub_category"; + } + else { + echo "rss_sub_category"; + } + } + echo "        "; + if (strlen($order_by)==0) { + echo "rss_sub_category_description"; + } + else { + if ($order=="asc") { + echo "rss_sub_category_description"; + } + else { + echo "rss_sub_category_description"; + } + } + echo "        "; + if (strlen($order_by)==0) { + echo "rss_add_user"; + } + else { + if ($order=="asc") { + echo "rss_add_user"; + } + else { + echo "rss_add_user"; + } + } + echo "        "; + if (strlen($order_by)==0) { + echo "rss_add_date"; + } + else { + if ($order=="asc") { + echo "rss_add_date"; + } + else { + echo "rss_add_date"; + } + } + echo "   
".$row[rss_sub_category_uuid]."".$row[rss_category]."".$row[rss_sub_category]."".$row[rss_sub_category_description]."".$row[rss_add_user]."".$row[rss_add_date]."
\n"; + echo "
\n"; + + + echo "

"; + echo "
\n"; +echo "   \n"; +echo "   \n"; +echo "
"; + +echo "

"; +require_once "includes/footer.php"; + +unset ($result_count); +unset ($result); +unset ($key); +unset ($val); +unset ($c); + +?> diff --git a/app/content/rsssubcategoryupdate.php b/app/content/rsssubcategoryupdate.php new file mode 100644 index 0000000000..6dba2af02b --- /dev/null +++ b/app/content/rsssubcategoryupdate.php @@ -0,0 +1,134 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +require_once "config.php"; +if (permission_exists('content_edit')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +if (count($_POST)>0) { + $rss_sub_category_uuid = check_str($_POST["rss_sub_category_uuid"]); + $rss_category = check_str($_POST["rss_category"]); + $rss_sub_category = check_str($_POST["rss_sub_category"]); + $rss_sub_category_description = check_str($_POST["rss_sub_category_description"]); + $rss_add_user = check_str($_POST["rss_add_user"]); + $rss_add_date = check_str($_POST["rss_add_date"]); + + //sql update + $sql = "update v_rss_sub_category set "; + $sql .= "rss_category = '$rss_category', "; + $sql .= "rss_sub_category = '$rss_sub_category', "; + $sql .= "rss_sub_category_description = '$rss_sub_category_description', "; + $sql .= "rss_add_user = '$rss_add_user', "; + $sql .= "rss_add_date = '$rss_add_date' "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and rss_sub_category_uuid = '$rss_sub_category_uuid' "; + $count = $db->exec(check_sql($sql)); + //echo "Affected Rows: ".$count; + + //edit: make sure the meta redirect url is correct + require_once "includes/header.php"; + echo "\n"; + echo "Update Complete"; + require_once "includes/footer.php"; + return; +} +else { + //get data from the db + $rss_sub_category_uuid = $_GET["rss_sub_category_uuid"]; + + $sql = ""; + $sql .= "select * from v_rss_sub_category "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and rss_sub_category_uuid = '$rss_sub_category_uuid' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach ($result as &$row) { + $rss_category = $row["rss_category"]; + $rss_sub_category = $row["rss_sub_category"]; + $rss_sub_category_description = $row["rss_sub_category_description"]; + $rss_add_user = $row["rss_add_user"]; + $rss_add_date = $row["rss_add_date"]; + break; //limit to 1 row + } +} + +require_once "includes/header.php"; +echo "
"; +echo "\n"; + +echo "\n"; +echo " "; +echo " "; +echo "
\n"; +echo "
"; + + +echo "
"; +echo ""; +echo " "; +echo " "; +echo " "; +echo " "; +echo " "; +echo " "; +echo " "; +echo " "; +echo " "; +echo " "; +echo " "; +echo " "; +echo " "; +echo " "; +echo " "; +echo " "; +echo " "; +echo " "; +echo " "; +echo " "; +echo " "; +echo " "; +echo " "; +echo "
rss_category:
rss_sub_category:
rss_sub_category_description:
rss_add_user:
rss_add_date:
"; +echo " "; +echo " "; +echo "
"; +echo "
"; + + +echo "
"; +echo "
"; + + + require_once "includes/footer.php"; +?> diff --git a/app/content/rsssubdelete.php b/app/content/rsssubdelete.php new file mode 100644 index 0000000000..0dad197228 --- /dev/null +++ b/app/content/rsssubdelete.php @@ -0,0 +1,60 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +require_once "config.php"; +if (permission_exists('content_delete')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +if (count($_GET)>0) { + $rss_uuid = check_str($_GET["rss_uuid"]); + $rss_sub_uuid = check_str($_GET["rss_sub_uuid"]); + + //mark the the item as deleted and who deleted it + $sql = "update v_rss_sub set "; + $sql .= "rss_sub_del_date = now(), "; + $sql .= "rss_sub_del_user = '".$_SESSION["username"]."' "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and rss_sub_uuid = '$rss_sub_uuid' "; + $db->exec(check_sql($sql)); + unset($sql); + + require_once "includes/header.php"; + echo "\n"; + echo "
"; + echo "Delete Completed"; + echo "
"; + require_once "includes/footer.php"; + return; +} + +?> \ No newline at end of file diff --git a/app/content/rsssublist.php b/app/content/rsssublist.php new file mode 100644 index 0000000000..4828e81242 --- /dev/null +++ b/app/content/rsssublist.php @@ -0,0 +1,444 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +require_once "config.php"; +if (permission_exists('content_view')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +$rss_uuid = $_GET["rss_uuid"]; +$order_by = $_GET["order_by"]; +$order = $_GET["order"]; + +require_once "includes/header.php"; + + + echo "
"; + echo "\n"; + echo "\n"; + echo " \n"; + echo "\n"; + echo "
\n"; + + echo "
"; + echo " $module_title Details"; + $sql = ""; + $sql .= "select * from v_rss "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and rss_uuid = '$rss_uuid' "; + $sql .= "and rss_category = '$rss_category' "; + $sql .= "and length(rss_del_date) = 0 "; + $sql .= "or domain_uuid = '$domain_uuid' "; + $sql .= "and rss_uuid = '$rss_uuid' "; + $sql .= "and rss_category = '$rss_category' "; + $sql .= "and rss_del_date is null "; + $sql .= "order by rss_uuid asc "; + + //echo $sql; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + $result_count = count($result); + echo ""; + if ($result_count == 0) { //no results + echo ""; + } + else { //received results + foreach($result as $row) { + //print_r( $row ); + //echo "\n"; + //echo ""; + //echo " "; + //echo " "; + //echo ""; + //echo ""; + + echo ""; + echo " "; + echo " "; + echo " "; + $rss_description = $row[rss_description]; + //$rss_description = str_replace ("\r\n", "
", $rss_description); + //$rss_description = str_replace ("\n", "
", $rss_description); + echo ""; + + + echo ""; + echo " "; + echo " "; + echo ""; + + echo ""; + echo " "; + echo " "; + echo ""; + + if (strlen($row[rss_order]) > 0) { + echo ""; + echo " "; + echo " "; + echo ""; + } + + //echo ""; + echo " "; + echo " "; + //echo ""; + + //echo ""; + //echo " "; + //echo " "; //priority + //echo ""; + + //echo ""; + //echo " "; //completion status + //echo " "; //completion status + //echo ""; + //echo ""; + //echo ""; + //echo ""; + //echo ""; + //echo ""; + //echo " "; + //echo ""; + + echo ""; + + //echo "\n"; + if ($c==0) { $c=1; } else { $c=0; } + } //end foreach + } + echo "
 
Title".$row[rss_uuid]."
".$row[rss_category]."
Title:  ".$row[rss_title].""; + echo " "; + echo "
Template:  ".$row[rss_sub_category]."
Group:  ".$row[rss_group]."
Order:  ".$row[rss_order]."
".$row[rss_link]."Description:  ".$rss_description."".$row[rss_img]."
Priority:  ".$row[rss_optional_1]."
Status:  "; + //echo $row[rss_optional_2]; + //if ($row[rss_optional_2]=="100") { + // echo "Complete"; + //} + //else { + // echo $row[rss_optional_2]."%"; + //} + //echo "".$row[rss_optional_3]."".$row[rss_optional_4]."".$row[rss_optional_5]."".$row[rss_add_date]."".$row[rss_add_user]."
"; + //echo " Details"; + //echo " "; + //echo "
"; + unset($sql, $prep_statement, $result); + + + if ($rss_sub_show == 1) { + + echo "


"; + echo "$rss_sub_title
"; + + $sql = ""; + $sql .= "select * from v_rss_sub "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and rss_uuid = '$rss_uuid' "; + $sql .= "and length(rss_sub_del_date) = 0 "; + $sql .= "or domain_uuid = '$domain_uuid' "; + $sql .= "and rss_uuid = '$rss_uuid' "; + $sql .= "and rss_sub_del_date is null "; + if (strlen($order_by)> 0) { $sql .= "order by $order_by $order "; } + //echo $sql; + + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + $result_count = count($result); + + $c = 0; + $row_style["0"] = "background-color: #F5F5DC;"; + $row_style["1"] = "background-color: #FFFFFF;"; + + echo "
\n"; + echo "\n"; + //echo ""; + + if ($result_count == 0) { //no results + echo ""; + } + else { //received results + + echo ""; + /* + echo ""; + + echo ""; + + echo ""; + + echo ""; + + echo ""; + + echo ""; + + echo ""; + + echo ""; + + echo ""; + + echo ""; + + echo ""; + + echo ""; + */ + + echo ""; + echo "\n"; + + foreach($result as $row) { + //print_r( $row ); + echo "\n"; + //echo ""; + //echo ""; + //echo ""; + echo ""; + + echo ""; + + //echo ""; + //echo ""; + //echo ""; + //echo ""; + //echo ""; + //echo ""; + + echo ""; + + echo ""; + + + $rss_sub_description = $row[rss_sub_description]; + $rss_sub_description = str_replace ("\r\n", "
", $rss_sub_description); + $rss_sub_description = str_replace ("\n", "
", $rss_sub_description); + + echo ""; + echo "\n"; + echo ""; + + echo ""; + + + + echo ""; + + echo "\n"; + if ($c==0) { $c=1; } else { $c=0; } + } //end foreach unset($sql, $result, $row_count); + + + + } //end if results + + echo "
 
    "; + if (strlen($order_by)==0) { + echo "rss_sub_uuid"; + } + else { + if ($order=="asc") { + echo "rss_sub_uuid"; + } + else { + echo "rss_sub_uuid"; + } + } + echo "        "; + if (strlen($order_by)==0) { + echo "rss_uuid"; + } + else { + if ($order=="asc") { + echo "rss_uuid"; + } + else { + echo "rss_uuid"; + } + } + echo "        "; + if (strlen($order_by)==0) { + echo "rss_sub_title"; + } + else { + if ($order=="asc") { + echo "rss_sub_title"; + } + else { + echo "rss_sub_title"; + } + } + echo "        "; + if (strlen($order_by)==0) { + echo "rss_sub_link"; + } + else { + if ($order=="asc") { + echo "rss_sub_link"; + } + else { + echo "rss_sub_link"; + } + } + echo "        "; + if (strlen($order_by)==0) { + echo "rss_sub_description"; + } + else { + if ($order=="asc") { + echo "rss_sub_description"; + } + else { + echo "rss_sub_description"; + } + } + echo "        "; + if (strlen($order_by)==0) { + echo "rss_sub_optional_1"; + } + else { + if ($order=="asc") { + echo "rss_sub_optional_1"; + } + else { + echo "rss_sub_optional_1"; + } + } + echo "        "; + if (strlen($order_by)==0) { + echo "rss_sub_optional_2"; + } + else { + if ($order=="asc") { + echo "rss_sub_optional_2"; + } + else { + echo "rss_sub_optional_2"; + } + } + echo "        "; + if (strlen($order_by)==0) { + echo "rss_sub_optional_3"; + } + else { + if ($order=="asc") { + echo "rss_sub_optional_3"; + } + else { + echo "rss_sub_optional_3"; + } + } + echo "        "; + if (strlen($order_by)==0) { + echo "rss_sub_optional_4"; + } + else { + if ($order=="asc") { + echo "rss_sub_optional_4"; + } + else { + echo "rss_sub_optional_4"; + } + } + echo "        "; + if (strlen($order_by)==0) { + echo "rss_sub_optional_5"; + } + else { + if ($order=="asc") { + echo "rss_sub_optional_5"; + } + else { + echo "rss_sub_optional_5"; + } + } + echo "        "; + if (strlen($order_by)==0) { + echo "rss_sub_add_date"; + } + else { + if ($order=="asc") { + echo "rss_sub_add_date"; + } + else { + echo "rss_sub_add_date"; + } + } + echo "        "; + if (strlen($order_by)==0) { + echo "rss_sub_add_user"; + } + else { + if ($order=="asc") { + echo "rss_sub_add_user"; + } + else { + echo "rss_sub_add_user"; + } + } + echo "   
".$rss_uuid." ".$row[rss_sub_title]."  ".$row[rss_sub_link]." "; + echo " ".$row[rss_sub_title].""; + echo "".$row[rss_sub_add_date]."".$row[rss_sub_optional_1]."".$row[rss_sub_optional_2]."".$row[rss_sub_optional_3]."".$row[rss_sub_optional_4]."".$row[rss_sub_optional_5]."".$row[rss_sub_add_user].""; + echo " "; + echo ""; + echo "  "; + echo " "; + echo "   \n"; + //echo " Update "; + echo "
"; + echo "".$rss_sub_description." "; + echo "
\n"; + echo "
\n"; + + + } //if ($showrsssub == 1) { + + echo "

"; + echo "
\n"; + + //echo "   \n"; + if ($rss_sub_show == 1) { + echo "   \n"; + } + echo "
"; + + echo "

"; + require_once "includes/footer.php"; + + unset ($result_count); + unset ($result); + unset ($key); + unset ($val); + unset ($c); + +?> diff --git a/app/content/rsssubsearch.php b/app/content/rsssubsearch.php new file mode 100644 index 0000000000..c233dd2fe6 --- /dev/null +++ b/app/content/rsssubsearch.php @@ -0,0 +1,260 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +require_once "config.php"; +if (permission_exists('content_view')) { + //access granted +} +else { + echo "access denied"; + exit; +} + + +if (count($_POST)>0) { + $rss_sub_uuid = check_str($_POST["rss_sub_uuid"]); + $rss_uuid = check_str($_POST["rss_uuid"]); + $rss_sub_title = check_str($_POST["rss_sub_title"]); + $rss_sub_link = check_str($_POST["rss_sub_link"]); + $rss_sub_description = check_str($_POST["rss_sub_description"]); + $rss_sub_optional_1 = check_str($_POST["rss_sub_optional_1"]); + $rss_sub_optional_2 = check_str($_POST["rss_sub_optional_2"]); + $rss_sub_optional_3 = check_str($_POST["rss_sub_optional_3"]); + $rss_sub_optional_4 = check_str($_POST["rss_sub_optional_4"]); + $rss_sub_optional_5 = check_str($_POST["rss_sub_optional_5"]); + $rss_sub_add_date = check_str($_POST["rss_sub_add_date"]); + $rss_sub_add_user = check_str($_POST["rss_sub_add_user"]); + + + require_once "includes/header.php"; + + echo "
"; + echo "\n"; + + echo "\n"; + echo " \n"; + echo "\n"; + + } //end if results + + echo "
\n"; + echo "
"; + + + $sql = ""; + $sql .= "select * from v_rss_sub "; + $sql .= "where "; + if (strlen($domain_uuid) > 0) { $sql .= "and rss_sub_uuid = '$domain_uuid' "; } + if (strlen($rss_sub_uuid) > 0) { $sql .= "and rss_sub_uuid like '%$rss_sub_uuid%' "; } + if (strlen($rss_uuid) > 0) { $sql .= "and rss_uuid like '%$rss_uuid%' "; } + if (strlen($rss_sub_title) > 0) { $sql .= "and rss_sub_title like '%$rss_sub_title%' "; } + if (strlen($rss_sub_link) > 0) { $sql .= "and rss_sub_link like '%$rss_sub_link%' "; } + if (strlen($rss_sub_description) > 0) { $sql .= "and rss_sub_description like '%$rss_sub_description%' "; } + if (strlen($rss_sub_optional_1) > 0) { $sql .= "and rss_sub_optional_1 like '%$rss_sub_optional_1%' "; } + if (strlen($rss_sub_optional_2) > 0) { $sql .= "and rss_sub_optional_2 like '%$rss_sub_optional_2%' "; } + if (strlen($rss_sub_optional_3) > 0) { $sql .= "and rss_sub_optional_3 like '%$rss_sub_optional_3%' "; } + if (strlen($rss_sub_optional_4) > 0) { $sql .= "and rss_sub_optional_4 like '%$rss_sub_optional_4%' "; } + if (strlen($rss_sub_optional_5) > 0) { $sql .= "and rss_sub_optional_5 like '%$rss_sub_optional_5%' "; } + if (strlen($rss_sub_add_date) > 0) { $sql .= "and rss_sub_add_date like '%$rss_sub_add_date%' "; } + if (strlen($rss_sub_add_user) > 0) { $sql .= "and rss_sub_add_user like '%$rss_sub_add_user%' "; } + $sql .= "and length(rss_sub_del_date) = 0 "; + $sql .= "or "; + if (strlen($domain_uuid) > 0) { $sql .= "and rss_sub_uuid = '$domain_uuid' "; } + if (strlen($rss_sub_uuid) > 0) { $sql .= "and rss_sub_uuid like '%$rss_sub_uuid%' "; } + if (strlen($rss_uuid) > 0) { $sql .= "and rss_uuid like '%$rss_uuid%' "; } + if (strlen($rss_sub_title) > 0) { $sql .= "and rss_sub_title like '%$rss_sub_title%' "; } + if (strlen($rss_sub_link) > 0) { $sql .= "and rss_sub_link like '%$rss_sub_link%' "; } + if (strlen($rss_sub_description) > 0) { $sql .= "and rss_sub_description like '%$rss_sub_description%' "; } + if (strlen($rss_sub_optional_1) > 0) { $sql .= "and rss_sub_optional_1 like '%$rss_sub_optional_1%' "; } + if (strlen($rss_sub_optional_2) > 0) { $sql .= "and rss_sub_optional_2 like '%$rss_sub_optional_2%' "; } + if (strlen($rss_sub_optional_3) > 0) { $sql .= "and rss_sub_optional_3 like '%$rss_sub_optional_3%' "; } + if (strlen($rss_sub_optional_4) > 0) { $sql .= "and rss_sub_optional_4 like '%$rss_sub_optional_4%' "; } + if (strlen($rss_sub_optional_5) > 0) { $sql .= "and rss_sub_optional_5 like '%$rss_sub_optional_5%' "; } + if (strlen($rss_sub_add_date) > 0) { $sql .= "and rss_sub_add_date like '%$rss_sub_add_date%' "; } + if (strlen($rss_sub_add_user) > 0) { $sql .= "and rss_sub_add_user like '%$rss_sub_add_user%' "; } + $sql .= "and rss_sub_del_date is null "; + + $sql = trim($sql); + if (substr($sql, -5) == "where"){ $sql = substr($sql, 0, (strlen($sql)-5)); } + if (substr($sql, -3) == " or"){ $sql = substr($sql, 0, (strlen($sql)-5)); } + $sql = str_replace ("where and", "where", $sql); + $sql = str_replace ("or and", "or", $sql); + + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + $result_count = count($result); + + $c = 0; + $row_style["0"] = "background-color: #F5F5DC;"; + $row_style["1"] = "background-color: #FFFFFF;"; + + echo "Search Results
"; + echo "
\n"; + echo "\n"; + echo ""; + + if ($result_count == 0) { //no results + echo ""; + } + else { //received results + + echo ""; + echo ""; + echo ""; + echo ""; + //echo ""; + //echo ""; + //echo ""; + //echo ""; + //echo ""; + //echo ""; + //echo ""; + //echo ""; + //echo ""; + echo ""; + echo "\n"; + + foreach($result as $row) { + //print_r( $row ); + echo "\n"; + echo ""; + echo ""; + echo ""; + //echo ""; + //echo ""; + //echo ""; + //echo ""; + //echo ""; + //echo ""; + //echo ""; + //echo ""; + //echo ""; + echo ""; + + echo "\n"; + if ($c==0) { $c=1; } else { $c=0; } + } //end foreach + unset($sql, $result, $row_count); + + echo "
 
    Sub ID        Id        Title        Link        rss_sub_description        rss_sub_optional_1        rss_sub_optional_2        rss_sub_optional_3        rss_sub_optional_4        rss_sub_optional_5        rss_sub_add_date        rss_sub_add_user   
".$row[rss_sub_uuid]."".$row[rss_uuid]."".$row[rss_sub_title]."".$row[rss_sub_link]."".$row[rss_sub_description]."".$row[rss_sub_optional_1]."".$row[rss_sub_optional_2]."".$row[rss_sub_optional_3]."".$row[rss_sub_optional_4]."".$row[rss_sub_optional_5]."".$row[rss_sub_add_date]."".$row[rss_sub_add_user]."
\n"; + echo "
\n"; + + + echo "

"; + echo "
\n"; + echo "
"; + + echo "

"; + require_once "includes/footer.php"; + + unset ($result_count); + unset ($result); + unset ($key); + unset ($val); + unset ($c); + + } + else { + + echo "\n"; require_once "includes/header.php"; + echo "
"; + echo "\n"; + + echo "\n"; + echo " "; + echo " "; + echo "
\n"; + echo "
"; + + + echo "
"; + echo ""; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + echo " "; + echo " "; + echo " "; + echo "
Sub ID:
ID:
Sub Title:
Sub Link:
Sub Desc:
rss_sub_optional_1:
rss_sub_optional_2:
rss_sub_optional_3:
rss_sub_optional_4:
rss_sub_optional_5:
rss_sub_add_date:
rss_sub_add_user:
"; + echo "
"; + + + echo "
"; + echo "
"; + + +require_once "includes/footer.php"; + +} //end if not post +?> diff --git a/app/content/rsssubupdate.php b/app/content/rsssubupdate.php new file mode 100644 index 0000000000..80d472efa2 --- /dev/null +++ b/app/content/rsssubupdate.php @@ -0,0 +1,206 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +require_once "config.php"; +if (permission_exists('content_edit')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +$rss_uuid = $_GET["rss_uuid"]; + +if (count($_POST)>0 && $_POST["persistform"] == "0") { + $rss_sub_uuid = check_str($_POST["rss_sub_uuid"]); + $rss_uuid = check_str($_POST["rss_uuid"]); + $rss_sub_title = check_str($_POST["rss_sub_title"]); + $rss_sub_link = check_str($_POST["rss_sub_link"]); + $rss_sub_description = check_str($_POST["rss_sub_description"]); + $rss_sub_optional_1 = check_str($_POST["rss_sub_optional_1"]); + $rss_sub_optional_2 = check_str($_POST["rss_sub_optional_2"]); + $rss_sub_optional_3 = check_str($_POST["rss_sub_optional_3"]); + $rss_sub_optional_4 = check_str($_POST["rss_sub_optional_4"]); + $rss_sub_optional_5 = check_str($_POST["rss_sub_optional_5"]); + $rss_sub_add_date = check_str($_POST["rss_sub_add_date"]); + $rss_sub_add_user = check_str($_POST["rss_sub_add_user"]); + + $msg = ''; + if (strlen($rss_uuid) == 0) { $msg .= "Error missing rss_uuid.
\n"; } + if (strlen($rss_sub_uuid) == 0) { $msg .= "Error missing rss_sub_uuid.
\n"; } + //if (strlen($rss_sub_title) == 0) { $msg .= "Please provide a title.
\n"; } + if (strlen($rss_sub_description) == 0) { $msg .= "Please provide a description.
\n"; } + + if (strlen($msg) > 0) { + require_once "includes/persistform.php"; + require_once "includes/header.php"; + echo "
"; + echo ""; + echo ""; + echo ""; + echo ""; + echo "
"; + echo "
"; + echo " $msg"; + echo "
"; + echo "
".persistform($_POST)."
"; + echo "
"; + echo "
"; + echo "
"; + + require_once "includes/footer.php"; + return; + } + + //sql update + $sql = "update v_rss_sub set "; + //$sql .= "rss_uuid = '$rss_uuid', "; + $sql .= "rss_sub_title = '$rss_sub_title', "; + $sql .= "rss_sub_link = '$rss_sub_link', "; + $sql .= "rss_sub_description = '$rss_sub_description', "; + $sql .= "rss_sub_optional_1 = '$rss_sub_optional_1', "; + $sql .= "rss_sub_optional_2 = '$rss_sub_optional_2', "; + $sql .= "rss_sub_optional_3 = '$rss_sub_optional_3', "; + $sql .= "rss_sub_optional_4 = '$rss_sub_optional_4', "; + $sql .= "rss_sub_optional_5 = '$rss_sub_optional_5' "; + //$sql .= "rss_sub_add_date = now(), "; + //$sql .= "rss_sub_add_user = '".$_SESSION["username"]."' "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and rss_sub_uuid = '$rss_sub_uuid' "; + //$sql .= "and rss_uuid = '$rss_uuid' "; + $count = $db->exec(check_sql($sql)); + //echo "Affected Rows: ".$count; + + //edit: make sure the meta redirect url is correct + require_once "includes/header.php"; + echo "\n"; + echo "
"; + echo "Update Complete"; + echo "
"; + require_once "includes/footer.php"; + return; +} +else { + //get data from the db + $rss_sub_uuid = $_GET["rss_sub_uuid"]; + + $sql = ""; + $sql .= "select * from v_rss_sub "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and rss_sub_uuid = '$rss_sub_uuid' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach ($result as &$row) { + //$rss_uuid = $row["rss_uuid"]; + $rss_sub_title = $row["rss_sub_title"]; + $rss_sub_link = $row["rss_sub_link"]; + $rss_sub_description = $row["rss_sub_description"]; + $rss_sub_optional_1 = $row["rss_sub_optional_1"]; + $rss_sub_optional_2 = $row["rss_sub_optional_2"]; + $rss_sub_optional_3 = $row["rss_sub_optional_3"]; + $rss_sub_optional_4 = $row["rss_sub_optional_4"]; + $rss_sub_optional_5 = $row["rss_sub_optional_5"]; + $rss_sub_add_date = $row["rss_sub_add_date"]; + $rss_sub_add_user = $row["rss_sub_add_user"]; + break; //limit to 1 row + } +} + +//show the header + require_once "includes/header.php"; + require_once "includes/wysiwyg.php"; + +//show the content + echo "
"; + echo "\n"; + echo "\n"; + echo " "; + echo " "; + echo "
\n"; + echo "
"; + + echo "
"; + echo ""; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + + echo " "; + echo " "; + echo " "; + echo "
rss_uuid:
Sub Title:
Sub Link:
Description:"; + echo " "; + echo "
rss_sub_optional_1:
rss_sub_optional_2:
rss_sub_optional_3:
rss_sub_optional_4:
rss_sub_optional_5:
"; + echo " "; + echo " "; + echo " "; + echo " "; + echo "
"; + echo "
"; + + echo "
"; + echo "
"; + +//show the footer + require_once "includes/footer.php"; +?> diff --git a/app/content/rssupdate.php b/app/content/rssupdate.php new file mode 100644 index 0000000000..0f53de85d0 --- /dev/null +++ b/app/content/rssupdate.php @@ -0,0 +1,392 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +require_once "config.php"; +if (permission_exists('content_edit')) { + //access granted +} +else { + echo "access denied"; + exit; +} + + +if (count($_POST)>0) { + $rss_uuid = check_str($_POST["rss_uuid"]); + //$rss_category = check_str($_POST["rss_category"]); //defined in local config.php + $rss_sub_category = check_str($_POST["rss_sub_category"]); + $rss_title = check_str($_POST["rss_title"]); + $rss_link = check_str($_POST["rss_link"]); + $rss_description = check_str($_POST["rss_description"]); + $rss_group = check_str($_POST["rss_group"]); + $rss_order = check_str($_POST["rss_order"]); + + //$rss_description = str_replace ("
\r\n
", "
", $rss_description); + //$rss_description = str_replace ("
\n
", "
", $rss_description); + //$rss_description = str_replace ("

", "", $rss_description); + //$rss_description = str_replace ("

", "
", $rss_description); + + $rss_img = check_str($_POST["rss_img"]); + $rss_optional_1 = check_str($_POST["rss_optional_1"]); + $rss_optional_2 = check_str($_POST["rss_optional_2"]); + //$rss_optional_3 = check_str($_POST["rss_optional_3"]); + //$rss_optional_4 = check_str($_POST["rss_optional_4"]); + //$rss_optional_5 = check_str($_POST["rss_optional_5"]); + + //sql update + $sql = "update v_rss set "; + $sql .= "rss_sub_category = '$rss_sub_category', "; + $sql .= "rss_title = '$rss_title', "; + $sql .= "rss_link = '$rss_link', "; + $sql .= "rss_description = '$rss_description', "; + $sql .= "rss_img = '$rss_img', "; + $sql .= "rss_optional_1 = '$rss_optional_1', "; + $sql .= "rss_optional_2 = '$rss_optional_2', "; + //$sql .= "rss_optional_3 = '$rss_optional_3', "; + //$sql .= "rss_optional_4 = '$rss_optional_4', "; + //$sql .= "rss_optional_5 = '$rss_optional_5', "; + //$sql .= "rss_add_date = '$rss_add_date', "; + $sql .= "rss_group = '$rss_group', "; + $sql .= "rss_order = '$rss_order' "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and rss_uuid = '$rss_uuid' "; + $sql .= "and rss_category = '$rss_category' "; + //echo $sql; + //return; + $count = $db->exec(check_sql($sql)); + //echo $sql."
"; + //echo "Affected Rows: ".$count; + //exit; + + //edit: make sure the meta redirect url is correct + require_once "includes/header.php"; + echo "\n"; + echo "
"; + echo "Update Complete"; + echo "
"; + require_once "includes/footer.php"; + return; +} +else { + //get data from the db + $rss_uuid = $_GET["rss_uuid"]; + + $sql = ""; + $sql .= "select * from v_rss "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and rss_uuid = '$rss_uuid' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach ($result as &$row) { + $rss_category = $row["rss_category"]; + $rss_sub_category = $row["rss_sub_category"]; + $rss_optional_1 = $row["rss_optional_1"]; + $rss_title = $row["rss_title"]; + $rss_link = $row["rss_link"]; + $rss_description = $row["rss_description"]; + + if ($rss_optional_1 == "text/html") { //type + $rss_description = htmlentities($rss_description); + } + + $rss_img = $row["rss_img"]; + $rss_optional_2 = $row["rss_optional_2"]; + $rss_optional_3 = $row["rss_optional_3"]; + $rss_optional_4 = $row["rss_optional_4"]; + $rss_optional_5 = $row["rss_optional_5"]; + $rss_add_date = $row["rss_add_date"]; + $rss_add_user = $row["rss_add_user"]; + $rss_group = $row["rss_group"]; + $rss_order = $row["rss_order"]; + //$rss_description = str_replace ("\r\n", "
", $rss_description); + + //echo $rss_description; + //return; + + break; //limit to 1 row + } +} + + require_once "includes/header.php"; + if (is_dir($_SERVER["DOCUMENT_ROOT"].PROJECT_PATH.'/includes/tiny_mce')) { + if ($rss_optional_1 == "text/html") { + require_once "includes/wysiwyg.php"; + } + } + else { + //--- Begin: Edit Area ----------------------------------------------------- + echo " \n"; + echo " \n"; + + echo " "; + //--- End: Edit Area ------------------------------------------------------- + } + + echo "
"; + echo "\n"; + + echo "\n"; + echo " "; + echo " "; + echo "
\n"; + //echo "
"; + + + echo "
"; + echo ""; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + + echo " "; + echo " "; + echo " "; + echo " "; + + /* + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + */ + + echo " "; + echo " "; + echo " "; + echo " "; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo " "; + echo " "; + echo " "; + + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + + echo " "; + echo " "; + echo " "; + echo "
Content Edit

Category:
Sub Category:
Title:
Link:
Group:"; + //echo " "; + + //---- Begin Select List -------------------- + $sql = "SELECT * FROM v_groups "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + + echo ""; + unset($sql, $result); + //---- End Select List -------------------- + + echo "
\n"; + echo " Template: \n"; + echo " \n"; + echo "\n"; + echo "
\n"; + echo " Select a template to set as the default and then press save.
\n"; + echo "
Type:"; + echo " "; + echo "
\n"; + echo " Order:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "\n"; + echo "
"; + echo " Content: "; + if ($rss_optional_1 == "text/html") { + if (is_dir($_SERVER["DOCUMENT_ROOT"].PROJECT_PATH.'/includes/tiny_mce')) { + echo "       editor   on/off
"; + } + echo " "; + } + if ($rss_optional_1 == "text/javascript") { + echo " "; + } + echo "
Image:
Priority:"; + //echo " "; + //echo " "; + //echo "
Status:"; + //echo " "; + //echo " "; + //echo "
Optional 3:
Optional 4:
rss_optional_5:
rss_add_date:
"; + //echo ""; + //echo ""; + + echo " "; + echo " "; + echo "
"; + echo "
"; + + if ($rss_optional_1 == "text/javascript") { + echo "\n"; + } + + echo "
"; + echo "
"; + + + require_once "includes/footer.php"; +?> diff --git a/app/destinations/app_config.php b/app/destinations/app_config.php new file mode 100644 index 0000000000..7b7a3992ac --- /dev/null +++ b/app/destinations/app_config.php @@ -0,0 +1,75 @@ + \ No newline at end of file diff --git a/app/destinations/destinations.php b/app/destinations/destinations.php new file mode 100644 index 0000000000..77e611ad49 --- /dev/null +++ b/app/destinations/destinations.php @@ -0,0 +1,134 @@ +"; + echo "\n"; + echo "\n"; + echo " "; + echo ""; + echo "
\n"; + echo "
"; + + echo "\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "
Destinations 
\n"; + echo " Used to provide a simple way of directing a call through the dialplan to find its destination.

\n"; + echo "
\n"; + + //prepare to page the results + $sql = " select count(*) as num_rows from v_destinations "; + $sql .= " where domain_uuid = '$domain_uuid' "; + if (strlen($order_by)> 0) { $sql .= "order by $order_by $order "; } + $prep_statement = $db->prepare($sql); + if ($prep_statement) { + $prep_statement->execute(); + $row = $prep_statement->fetch(PDO::FETCH_ASSOC); + if ($row['num_rows'] > 0) { + $num_rows = $row['num_rows']; + } + else { + $num_rows = '0'; + } + } + + //prepare to page the results + $rows_per_page = 10; + $param = ""; + $page = $_GET['page']; + if (strlen($page) == 0) { $page = 0; $_GET['page'] = 0; } + list($paging_controls, $rows_per_page, $var3) = paging($num_rows, $param, $rows_per_page); + $offset = $rows_per_page * $page; + + //get the list + $sql = " select * from v_destinations "; + $sql .= " where domain_uuid = '$domain_uuid' "; + if (strlen($order_by)> 0) { $sql .= "order by $order_by $order "; } + $sql .= " limit $rows_per_page offset $offset "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(); + $result_count = count($result); + unset ($prep_statement, $sql); + + $c = 0; + $row_style["0"] = "row_style0"; + $row_style["1"] = "row_style1"; + + echo "
\n"; + echo "\n"; + echo "\n"; + echo th_order_by('destination_name', 'Name', $order_by, $order); + echo th_order_by('destination_context', 'Context', $order_by, $order); + echo th_order_by('destination_extension', 'Extension', $order_by, $order); + echo th_order_by('destination_enabled', 'Enabled', $order_by, $order); + echo th_order_by('destination_description', 'Description', $order_by, $order); + echo "\n"; + echo "\n"; + if ($result_count > 0) { + foreach($result as $row) { + echo "\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "\n"; + if ($c==0) { $c=1; } else { $c=0; } + } //end foreach + unset($sql, $result, $row_count); + } //end if results + + echo "\n"; + echo "\n"; + echo "\n"; + + echo "
\n"; + echo " $v_link_label_add\n"; + echo "
".$row['destination_name']." ".$row['destination_context']." ".$row['destination_extension']." ".$row['destination_enabled']." ".$row['destination_description']." \n"; + echo " $v_link_label_edit\n"; + echo " $v_link_label_delete\n"; + echo "
\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "
 $paging_controls\n"; + echo " $v_link_label_add\n"; + echo "
\n"; + echo "
"; + echo "
"; + echo "

"; + echo "

"; + + echo "
"; + echo ""; + echo "

"; + +//include the footer + require_once "includes/footer.php"; +?> \ No newline at end of file diff --git a/app/destinations/destinations_delete.php b/app/destinations/destinations_delete.php new file mode 100644 index 0000000000..b754506f70 --- /dev/null +++ b/app/destinations/destinations_delete.php @@ -0,0 +1,35 @@ +0) { + $id = check_str($_GET["id"]); +} + +if (strlen($id)>0) { + $sql = ""; + $sql .= "delete from v_destinations "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and destination_uuid = '$id' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + unset($sql); +} + +require_once "includes/header.php"; +echo "\n"; +echo "
\n"; +echo "Delete Complete\n"; +echo "
\n"; +require_once "includes/footer.php"; +return; + +?> \ No newline at end of file diff --git a/app/destinations/destinations_edit.php b/app/destinations/destinations_edit.php new file mode 100644 index 0000000000..c13a91aa93 --- /dev/null +++ b/app/destinations/destinations_edit.php @@ -0,0 +1,249 @@ +0) { + $destination_name = check_str($_POST["destination_name"]); + $destination_context = check_str($_POST["destination_context"]); + $destination_extension = check_str($_POST["destination_extension"]); + $destination_enabled = check_str($_POST["destination_enabled"]); + $destination_description = check_str($_POST["destination_description"]); + } + +if (count($_POST)>0 && strlen($_POST["persistformvar"]) == 0) { + + $msg = ''; + if ($action == "update") { + $destination_uuid = check_str($_POST["destination_uuid"]); + } + + //check for all required data + //if (strlen($destination_name) == 0) { $msg .= "Please provide: Name
\n"; } + //if (strlen($destination_context) == 0) { $msg .= "Please provide: Context
\n"; } + //if (strlen($destination_extension) == 0) { $msg .= "Please provide: Extension
\n"; } + //if (strlen($destination_enabled) == 0) { $msg .= "Please provide: Enabled
\n"; } + //if (strlen($destination_description) == 0) { $msg .= "Please provide: Description
\n"; } + if (strlen($msg) > 0 && strlen($_POST["persistformvar"]) == 0) { + require_once "includes/header.php"; + require_once "includes/persistformvar.php"; + echo "
\n"; + echo "
\n"; + echo $msg."
"; + echo "
\n"; + persistformvar($_POST); + echo "
\n"; + require_once "includes/footer.php"; + return; + } + + //add or update the database + if ($_POST["persistformvar"] != "true") { + if ($action == "add") { + $sql = "insert into v_destinations "; + $sql .= "("; + $sql .= "domain_uuid, "; + $sql .= "destination_uuid, "; + $sql .= "destination_name, "; + $sql .= "destination_context, "; + $sql .= "destination_extension, "; + $sql .= "destination_enabled, "; + $sql .= "destination_description "; + $sql .= ")"; + $sql .= "values "; + $sql .= "("; + $sql .= "'$domain_uuid', "; + $sql .= "'".uuid()."', "; + $sql .= "'$destination_name', "; + $sql .= "'$destination_context', "; + $sql .= "'$destination_extension', "; + $sql .= "'$destination_enabled', "; + $sql .= "'$destination_description' "; + $sql .= ")"; + $db->exec(check_sql($sql)); + unset($sql); + + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Add Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + } //if ($action == "add") + + if ($action == "update") { + $sql = "update v_destinations set "; + $sql .= "destination_name = '$destination_name', "; + $sql .= "destination_context = '$destination_context', "; + $sql .= "destination_extension = '$destination_extension', "; + $sql .= "destination_enabled = '$destination_enabled', "; + $sql .= "destination_description = '$destination_description' "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and destination_uuid = '$destination_uuid'"; + $db->exec(check_sql($sql)); + unset($sql); + + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Update Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + } //if ($action == "update") + } //if ($_POST["persistformvar"] != "true") +} //(count($_POST)>0 && strlen($_POST["persistformvar"]) == 0) + +//pre-populate the form + if (count($_GET)>0 && $_POST["persistformvar"] != "true") { + $destination_uuid = $_GET["id"]; + $sql = "select * from v_destinations "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and destination_uuid = '$destination_uuid' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(); + foreach ($result as &$row) { + $destination_name = $row["destination_name"]; + $destination_context = $row["destination_context"]; + $destination_extension = $row["destination_extension"]; + $destination_enabled = $row["destination_enabled"]; + $destination_description = $row["destination_description"]; + break; //limit to 1 row + } + unset ($prep_statement); + } + +//show the header + require_once "includes/header.php"; + +//show the content + echo "
"; + echo "\n"; + echo "\n"; + echo " "; + echo " "; + echo "
\n"; + echo "
"; + + echo "
\n"; + echo "
\n"; + echo "\n"; + echo "\n"; + if ($action == "add") { + echo "\n"; + } + if ($action == "update") { + echo "\n"; + } + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo " \n"; + echo " \n"; + echo " "; + echo "
Destination AddDestination Edit
\n"; + echo "An alias for a call destination. The destination will use the dialplan to find it its target.

\n"; + echo "
\n"; + echo " Name:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the name.\n"; + echo "
\n"; + echo " Context:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the context.\n"; + echo "
\n"; + echo " Extension:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the extension.\n"; + echo "
\n"; + echo " Enabled:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "\n"; + echo "
\n"; + echo " Description:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the description.\n"; + echo "
\n"; + if ($action == "update") { + echo " \n"; + } + echo " \n"; + echo "
"; + echo ""; + + echo "
"; + echo "
"; + +//include the footer + require_once "includes/footer.php"; +?> \ No newline at end of file diff --git a/app/destinations/root.php b/app/destinations/root.php new file mode 100644 index 0000000000..7b882438ea --- /dev/null +++ b/app/destinations/root.php @@ -0,0 +1,50 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ + +// make sure the PATH_SEPARATOR is defined + if (!defined("PATH_SEPARATOR")) { + if ( strpos( $_ENV[ "OS" ], "Win" ) !== false ) { define("PATH_SEPARATOR", ";"); } else { define("PATH_SEPARATOR", ":"); } + } + +// make sure the document_root is set + $_SERVER["SCRIPT_FILENAME"] = str_replace("\\", "/", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = str_replace($_SERVER["PHP_SELF"], "", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = realpath($_SERVER["DOCUMENT_ROOT"]); + //echo "DOCUMENT_ROOT: ".$_SERVER["DOCUMENT_ROOT"]."
\n"; + //echo "PHP_SELF: ".$_SERVER["PHP_SELF"]."
\n"; + //echo "SCRIPT_FILENAME: ".$_SERVER["SCRIPT_FILENAME"]."
\n"; + +// if the project directory exists then add it to the include path otherwise add the document root to the include path + if (is_dir($_SERVER["DOCUMENT_ROOT"].'/fusionpbx')){ + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', '/fusionpbx'); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER["DOCUMENT_ROOT"].'/fusionpbx' ); + } + else { + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', ''); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER['DOCUMENT_ROOT'] ); + } + +?> \ No newline at end of file diff --git a/app/dialplan/app_config.php b/app/dialplan/app_config.php new file mode 100644 index 0000000000..85b7ead19b --- /dev/null +++ b/app/dialplan/app_config.php @@ -0,0 +1,160 @@ + \ No newline at end of file diff --git a/app/dialplan/app_defaults.php b/app/dialplan/app_defaults.php new file mode 100644 index 0000000000..a96cab81ad --- /dev/null +++ b/app/dialplan/app_defaults.php @@ -0,0 +1,74 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ + +//only run the following code if the directory exists + if (is_dir($_SESSION['switch']['dialplan']['dir'])) { + //write the dialplan/default.xml if it does not exist + //get the contents of the dialplan/default.xml + $file_default_path = $_SERVER["DOCUMENT_ROOT"].PROJECT_PATH.'/includes/templates/conf/dialplan/default.xml'; + $file_default_contents = file_get_contents($file_default_path); + + //prepare the file contents and the path + //replace the variables in the template in the future loop through all the line numbers to do a replace for each possible line number + $file_default_contents = str_replace("{v_domain}", $context, $file_default_contents); + //set the file path + $file_path = $_SESSION['switch']['conf']['dir'].'/dialplan/'.$context.'.xml'; + + //write the default dialplan + if (!file_exists($file_path)) { + $fh = fopen($file_path,'w') or die('Unable to write to '.$file_path.'. Make sure the path exists and permissons are set correctly.'); + fwrite($fh, $file_default_contents); + fclose($fh); + } + + //get the $apps array from the installed apps from the core and mod directories + $xml_list = glob($_SERVER["DOCUMENT_ROOT"] . PROJECT_PATH . "/app/dialplan/resources/xml/dialplan/*.xml"); + foreach ($xml_list as &$xml_file) { + //get and parse the xml + $xml_string = file_get_contents($xml_file); + //get the order number prefix from the file name + $name_array = explode('_', basename($xml_file)); + if (is_numeric($name_array[0])) { + $dialplan_order = $name_array[0]; + } + else { + $dialplan_order = 0; + } + //dialplan class + require_once "includes/classes/dialplan.php"; + $dialplan = new dialplan; + $dialplan->domain_uuid = $domain_uuid; + $dialplan->dialplan_order = $dialplan_order; + $dialplan->dialplan_context = $context; + if ($display_type == "text") { + $dialplan->display_type = 'text'; + } + $dialplan->xml = $xml_string; + $dialplan->import(); + } + } + +?> \ No newline at end of file diff --git a/app/dialplan/dialplan_add.php b/app/dialplan/dialplan_add.php new file mode 100644 index 0000000000..a42c02aa57 --- /dev/null +++ b/app/dialplan/dialplan_add.php @@ -0,0 +1,734 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('dialplan_add')) { + //access granted +} +else { + echo "access denied"; + exit; +} +require_once "includes/header.php"; +require_once "includes/paging.php"; + +$order_by = $_GET["order_by"]; +$order = $_GET["order"]; + + +//POST to PHP variables + if (count($_POST)>0) { + $dialplan_name = check_str($_POST["dialplan_name"]); + $dialplan_order = check_str($_POST["dialplan_order"]); + $condition_field_1 = check_str($_POST["condition_field_1"]); + $condition_expression_1 = check_str($_POST["condition_expression_1"]); + $condition_field_2 = check_str($_POST["condition_field_2"]); + $condition_expression_2 = check_str($_POST["condition_expression_2"]); + + $action_1 = check_str($_POST["action_1"]); + //$action_1 = "transfer:1001 XML default"; + $action_1_array = explode(":", $action_1); + $action_application_1 = array_shift($action_1_array); + $action_data_1 = join(':', $action_1_array); + + $action_2 = check_str($_POST["action_2"]); + //$action_2 = "transfer:1001 XML default"; + $action_2_array = explode(":", $action_2); + $action_application_2 = array_shift($action_2_array); + $action_data_2 = join(':', $action_2_array); + + //$action_application_1 = check_str($_POST["action_application_1"]); + //$action_data_1 = check_str($_POST["action_data_1"]); + //$action_application_2 = check_str($_POST["action_application_2"]); + //$action_data_2 = check_str($_POST["action_data_2"]); + + $dialplan_enabled = check_str($_POST["dialplan_enabled"]); + $dialplan_description = check_str($_POST["dialplan_description"]); + if (strlen($dialplan_enabled) == 0) { $dialplan_enabled = "true"; } //set default to enabled + } + +if (count($_POST)>0 && strlen($_POST["persistformvar"]) == 0) { + //check for all required data + if (strlen($domain_uuid) == 0) { $msg .= "Please provide: domain_uuid
\n"; } + if (strlen($dialplan_name) == 0) { $msg .= "Please provide: Extension Name
\n"; } + if (strlen($condition_field_1) == 0) { $msg .= "Please provide: Condition Field
\n"; } + if (strlen($condition_expression_1) == 0) { $msg .= "Please provide: Condition Expression
\n"; } + if (strlen($action_application_1) == 0) { $msg .= "Please provide: Action Application
\n"; } + //if (strlen($dialplan_enabled) == 0) { $msg .= "Please provide: Enabled True or False
\n"; } + //if (strlen($dialplan_description) == 0) { $msg .= "Please provide: Description
\n"; } + if (strlen($msg) > 0 && strlen($_POST["persistformvar"]) == 0) { + require_once "includes/header.php"; + require_once "includes/persistformvar.php"; + echo "
\n"; + echo "
\n"; + echo $msg."
"; + echo "
\n"; + persistformvar($_POST); + echo "
\n"; + require_once "includes/footer.php"; + return; + } + + //remove the invalid characters from the extension name + $dialplan_name = str_replace(" ", "_", $dialplan_name); + $dialplan_name = str_replace("/", "", $dialplan_name); + + //start the atomic transaction + $db->exec("BEGIN;"); //returns affected rows + + //add the main dialplan include entry + $dialplan_context = $_SESSION['context']; + $dialplan_uuid = uuid(); + $sql = "insert into v_dialplans "; + $sql .= "("; + $sql .= "domain_uuid, "; + $sql .= "dialplan_uuid, "; + $sql .= "app_uuid, "; + $sql .= "dialplan_name, "; + $sql .= "dialplan_order, "; + $sql .= "dialplan_continue, "; + $sql .= "dialplan_context, "; + $sql .= "dialplan_enabled, "; + $sql .= "dialplan_description "; + $sql .= ") "; + $sql .= "values "; + $sql .= "("; + $sql .= "'$domain_uuid', "; + $sql .= "'$dialplan_uuid', "; + $sql .= "'742714e5-8cdf-32fd-462c-cbe7e3d655db', "; + $sql .= "'$dialplan_name', "; + $sql .= "'$dialplan_order', "; + $sql .= "'false', "; + $sql .= "'".$_SESSION['context']."', "; + $sql .= "'$dialplan_enabled', "; + $sql .= "'$dialplan_description' "; + $sql .= ")"; + $db->exec(check_sql($sql)); + unset($sql); + + //add condition 1 + $dialplan_detail_uuid = uuid(); + $sql = "insert into v_dialplan_details "; + $sql .= "("; + $sql .= "domain_uuid, "; + $sql .= "dialplan_uuid, "; + $sql .= "dialplan_detail_uuid, "; + $sql .= "dialplan_detail_tag, "; + $sql .= "dialplan_detail_type, "; + $sql .= "dialplan_detail_data, "; + $sql .= "dialplan_detail_order "; + $sql .= ") "; + $sql .= "values "; + $sql .= "("; + $sql .= "'$domain_uuid', "; + $sql .= "'$dialplan_uuid', "; + $sql .= "'$dialplan_detail_uuid', "; + $sql .= "'condition', "; + $sql .= "'$condition_field_1', "; + $sql .= "'$condition_expression_1', "; + $sql .= "'1' "; + $sql .= ")"; + $db->exec(check_sql($sql)); + unset($sql); + + //add condition 2 + if (strlen($condition_field_2) > 0) { + $dialplan_detail_uuid = uuid(); + $sql = "insert into v_dialplan_details "; + $sql .= "("; + $sql .= "domain_uuid, "; + $sql .= "dialplan_uuid, "; + $sql .= "dialplan_detail_uuid, "; + $sql .= "dialplan_detail_tag, "; + $sql .= "dialplan_detail_type, "; + $sql .= "dialplan_detail_data, "; + $sql .= "dialplan_detail_order "; + $sql .= ") "; + $sql .= "values "; + $sql .= "("; + $sql .= "'$domain_uuid', "; + $sql .= "'$dialplan_uuid', "; + $sql .= "'$dialplan_detail_uuid', "; + $sql .= "'condition', "; + $sql .= "'$condition_field_2', "; + $sql .= "'$condition_expression_2', "; + $sql .= "'2' "; + $sql .= ")"; + $db->exec(check_sql($sql)); + unset($sql); + } + + //add action 1 + $dialplan_detail_uuid = uuid(); + $sql = "insert into v_dialplan_details "; + $sql .= "("; + $sql .= "domain_uuid, "; + $sql .= "dialplan_uuid, "; + $sql .= "dialplan_detail_uuid, "; + $sql .= "dialplan_detail_tag, "; + $sql .= "dialplan_detail_type, "; + $sql .= "dialplan_detail_data, "; + $sql .= "dialplan_detail_order "; + $sql .= ") "; + $sql .= "values "; + $sql .= "("; + $sql .= "'$domain_uuid', "; + $sql .= "'$dialplan_uuid', "; + $sql .= "'$dialplan_detail_uuid', "; + $sql .= "'action', "; + $sql .= "'$action_application_1', "; + $sql .= "'$action_data_1', "; + $sql .= "'3' "; + $sql .= ")"; + $db->exec(check_sql($sql)); + unset($sql); + + //add action 2 + if (strlen($action_application_2) > 0) { + $dialplan_detail_uuid = uuid(); + $sql = "insert into v_dialplan_details "; + $sql .= "("; + $sql .= "domain_uuid, "; + $sql .= "dialplan_uuid, "; + $sql .= "dialplan_detail_uuid, "; + $sql .= "dialplan_detail_tag, "; + $sql .= "dialplan_detail_type, "; + $sql .= "dialplan_detail_data, "; + $sql .= "dialplan_detail_order "; + $sql .= ") "; + $sql .= "values "; + $sql .= "("; + $sql .= "'$domain_uuid', "; + $sql .= "'$dialplan_uuid', "; + $sql .= "'$dialplan_detail_uuid', "; + $sql .= "'action', "; + $sql .= "'$action_application_2', "; + $sql .= "'$action_data_2', "; + $sql .= "'4' "; + $sql .= ")"; + $db->exec(check_sql($sql)); + unset($sql); + } + + //commit the atomic transaction + $count = $db->exec("COMMIT;"); //returns affected rows + + //synchronize the xml config + save_dialplan_xml(); + + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Update Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; +} //end if (count($_POST)>0 && strlen($_POST["persistformvar"]) == 0) + +?> + +"; +echo "\n"; + +echo "\n"; +echo " \n"; +echo "\n"; + +echo "\n"; +echo "\n"; +echo "\n"; +echo "\n"; + +echo "\n"; +echo "\n"; +echo "\n"; +echo "\n"; + +echo "\n"; +echo "\n"; + +echo "\n"; +echo "\n"; +echo "\n"; +echo "\n"; + +echo "\n"; +echo "\n"; +echo "\n"; +echo "\n"; + +echo "\n"; +echo "\n"; +echo "\n"; +echo "\n"; + +echo "\n"; +echo "\n"; +echo "\n"; +echo "\n"; + +echo "\n"; +echo " \n"; +echo ""; + +echo "
\n"; +echo "
"; + +echo "
\n"; +echo "
\n"; + +echo " \n"; +echo " \n"; +echo " \n"; +echo " \n"; +echo " \n"; +echo " \n"; +echo " \n"; +echo " \n"; +echo "
Dialplan\n"; +echo " \n"; +echo " \n"; +echo " \n"; +echo "
\n"; +echo " \n"; +echo " The dialplan is used to setup call destinations based on conditions and context.\n"; +echo " You can use the dialplan to send calls to gateways, auto attendants, external numbers,\n"; +echo " to scripts, or any destination.\n"; +echo " \n"; +echo "
"; + +echo "
\n"; +echo "
\n"; + +echo "\n"; + +echo "\n"; +echo "\n"; +echo "\n"; +echo "\n"; + +//echo "\n"; +//echo "\n"; +//echo "\n"; +//echo "\n"; + +echo "\n"; +echo "\n"; +echo "\n"; +echo " \n"; +echo " \n"; +echo " \n"; +echo " \n"; +echo " \n"; +echo "
\n"; +echo " Name:\n"; +echo "\n"; +echo " \n"; +echo "
\n"; +echo "\n"; +echo "
\n"; +//echo " Continue:\n"; +//echo "\n"; +//echo " \n"; +//echo "
\n"; +//echo "Extension Continue in most cases this is false. default: false\n"; +//echo "
\n"; +echo " Condition 1:\n"; +echo "\n"; +?> + +\n"; +echo "
Field:\n"; +echo " \n"; +echo " \n"; +echo "
\n"; +echo "
  Expression:\n"; +echo " \n"; +echo "
\n"; +echo "
\n"; +echo "
\n"; +echo " Condition 2:\n"; +echo "\n"; + +echo " \n"; +echo " \n"; +echo " \n"; +echo " \n"; +echo " \n"; +echo " \n"; +echo " \n"; +echo "
\n"; +echo " Field:\n"; +echo " \n"; +?> + +\n"; +echo " \n"; +if (strlen($condition_field_2) > 0) { + echo " \n"; +} +echo " \n"; +echo " \n"; +echo " \n"; +echo " \n"; +echo " \n"; +echo " \n"; +echo " \n"; +echo " \n"; +echo " \n"; +echo " \n"; +echo " \n"; +echo " \n"; +echo " \n"; +echo " \n"; +echo " \n"; +echo " \n"; +echo " \n"; +echo " \n"; +echo " \n"; +echo " \n"; +echo " \n"; +echo " \n"; +echo " \n"; +echo " \n"; +echo " \n"; +echo " \n"; +echo " \n"; +echo " \n"; +echo " \n"; +echo "
\n"; +echo "
\n"; +echo "   Expression:\n"; +echo " \n"; +echo " \n"; +echo "
\n"; +echo "
\n"; +echo "
\n"; +echo " Action 1:\n"; +echo "\n"; + +//switch_select_destination(select_type, select_label, select_name, select_value, select_style, action); +switch_select_destination("dialplan", "", "action_1", $action_1, "width: 60%;", ""); + +/* +echo " \n"; +echo " \n"; +echo " \n"; +echo " \n"; +echo " \n"; +echo " \n"; +echo " \n"; +echo "
Application: \n"; +echo "
\n"; +echo "
\n"; +echo "   Data: \n"; +echo " \n"; +echo " \n"; +echo "
\n"; +echo "
\n"; +*/ +echo "
\n"; +echo " Action 2:\n"; +echo "\n"; + +//switch_select_destination(select_type, select_label, select_name, select_value, select_style, action); +switch_select_destination("dialplan", "", "action_2", $action_2, "width: 60%;", ""); + +/* +echo " \n"; +echo " \n"; +echo " \n"; +echo " \n"; +echo " \n"; +echo " \n"; +echo " \n"; +echo "
Application: \n"; +echo "
\n"; +echo "
\n"; +echo "   Data: \n"; +echo " \n"; +echo " \n"; +echo "
\n"; +echo "
\n"; +*/ +echo "
\n"; +echo " Order:\n"; +echo "\n"; +echo " \n"; +echo "
\n"; +echo "\n"; +echo "
\n"; +echo " Enabled:\n"; +echo "\n"; +echo " \n"; +echo "
\n"; +echo "\n"; +echo "
\n"; +echo " Description:\n"; +echo "\n"; +//echo " \n"; +echo " \n"; +echo "
\n"; +echo "\n"; +echo "
\n"; +if ($action == "update") { + echo " \n"; +} +echo " \n"; +echo "
"; +echo ""; +echo ""; + +echo "\n"; +echo ""; +echo ""; +echo ""; +echo "

"; + +require_once "includes/footer.php"; + +?> \ No newline at end of file diff --git a/app/dialplan/dialplan_advanced.php b/app/dialplan/dialplan_advanced.php new file mode 100644 index 0000000000..e039145e51 --- /dev/null +++ b/app/dialplan/dialplan_advanced.php @@ -0,0 +1,155 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('dialplan_advanced_view')) { + //access granted +} +else { + echo "access denied"; + exit; +} +require_once "includes/header.php"; + +if ($_GET['a'] == "default" && permission_exists('dialplan_advanced_edit')) { + //create the dialplan/default.xml for single tenant or dialplan/domain.xml + require_once "includes/classes/dialplan.php"; + $dialplan = new dialplan; + $dialplan->domain_uuid = $_SESSION['domain_uuid']; + $dialplan->switch_dialplan_dir = $_SESSION['switch']['dialplan']['dir']; + $dialplan->restore_advanced_xml(); + //print_r($dialplan->result); +} + +if ($_POST['a'] == "save" && permission_exists('dialplan_advanced_edit')) { + $v_content = str_replace("\r","",$_POST['code']); + if (file_exists($_SESSION['switch']['dialplan']['dir']."/".$_SESSION['domain_name'].".xml")) { + $fd = fopen($_SESSION['switch']['dialplan']['dir']."/".$_SESSION['domain_name'].".xml", "w"); + } + else { + $fd = fopen($_SESSION['switch']['dialplan']['dir']."/default.xml", "w"); + } + fwrite($fd, $v_content); + fclose($fd); + $savemsg = "Saved"; +} + +if (file_exists($_SESSION['switch']['dialplan']['dir']."/".$_SESSION['domain_name'].".xml")) { + $fd = fopen($_SESSION['switch']['dialplan']['dir']."/".$_SESSION['domain_name'].".xml", "r"); + $v_content = fread($fd, filesize($_SESSION['switch']['dialplan']['dir']."/".$_SESSION['domain_name'].".xml")); +} +else { + $fd = fopen($_SESSION['switch']['dialplan']['dir']."/default.xml", "r"); + $v_content = fread($fd, filesize($_SESSION['switch']['dialplan']['dir']."/default.xml")); +} +fclose($fd); + +?> + + + + + +
+ + + + +
+
+ + + + + + + + + + + + + + + +
Default Dialplan
+
+ The default dialplan is used to setup call destinations based on conditions and context. + You can use the dialplan to send calls to gateways, auto attendants, external numbers, to scripts, or any destination. +
+
+
+ +
+
+
+ location: ".$_SESSION['switch']['conf']['dir']."/dialplan/default.xml\n"; + } + ?> + + ' /> + + "; + } + ?> +
+


+


+


+


+


+


+


+


+


+


+
+
+
+
+ + \ No newline at end of file diff --git a/app/dialplan/dialplan_copy.php b/app/dialplan/dialplan_copy.php new file mode 100644 index 0000000000..7714dd9ffb --- /dev/null +++ b/app/dialplan/dialplan_copy.php @@ -0,0 +1,164 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +require_once "includes/paging.php"; +if (permission_exists('dialplan_add') + || permission_exists('inbound_route_add') + || permission_exists('outbound_route_add') + || permission_exists('time_conditions_add')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +//set the http get/post variable(s) to a php variable + if (isset($_REQUEST["id"])) { + $dialplan_uuid = check_str($_REQUEST["id"]); + } + +//get the dialplan data + $dialplan_uuid = $_GET["id"]; + $sql = "select * from v_dialplans "; + $sql .= "where domain_uuid = '".$_SESSION['domain_uuid']."' "; + $sql .= "and dialplan_uuid = '$dialplan_uuid' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach ($result as &$row) { + $database_dialplan_uuid = $row["dialplan_uuid"]; + $app_uuid = $row["app_uuid"]; + $dialplan_name = $row["dialplan_name"]; + $dialplan_order = $row["dialplan_order"]; + $dialplan_continue = $row["dialplan_continue"]; + $dialplan_context = $row["dialplan_context"]; + $dialplan_enabled = $row["dialplan_enabled"]; + $dialplan_description = "copy: ".$row["dialplan_description"]; + break; //limit to 1 row + } + unset ($prep_statement); + + //copy the dialplan + $dialplan_uuid = uuid(); + $sql = "insert into v_dialplans "; + $sql .= "("; + $sql .= "domain_uuid, "; + $sql .= "dialplan_uuid, "; + $sql .= "app_uuid, "; + $sql .= "dialplan_name, "; + $sql .= "dialplan_order, "; + $sql .= "dialplan_continue, "; + $sql .= "dialplan_context, "; + $sql .= "dialplan_enabled, "; + $sql .= "dialplan_description "; + $sql .= ")"; + $sql .= "values "; + $sql .= "("; + $sql .= "'".$_SESSION['domain_uuid']."', "; + $sql .= "'$dialplan_uuid', "; + $sql .= "'$app_uuid', "; + $sql .= "'".$dialplan_name."-copy', "; + $sql .= "'$dialplan_order', "; + $sql .= "'$dialplan_continue', "; + $sql .= "'$dialplan_context', "; + $sql .= "'$dialplan_enabled', "; + $sql .= "'$dialplan_description' "; + $sql .= ")"; + $db->exec(check_sql($sql)); + unset($sql); + + //get the the dialplan details + $sql = "select * from v_dialplan_details "; + $sql .= "where domain_uuid = '".$_SESSION['domain_uuid']."' "; + $sql .= "and dialplan_uuid = '$database_dialplan_uuid' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach ($result as &$row) { + $dialplan_detail_tag = $row["dialplan_detail_tag"]; + $dialplan_detail_order = $row["dialplan_detail_order"]; + $dialplan_detail_type = $row["dialplan_detail_type"]; + $dialplan_detail_data = $row["dialplan_detail_data"]; + + //copy the dialplan details + $dialplan_detail_uuid = uuid(); + $sql = "insert into v_dialplan_details "; + $sql .= "("; + $sql .= "domain_uuid, "; + $sql .= "dialplan_uuid, "; + $sql .= "dialplan_detail_uuid, "; + $sql .= "dialplan_detail_tag, "; + $sql .= "dialplan_detail_order, "; + $sql .= "dialplan_detail_type, "; + $sql .= "dialplan_detail_data "; + $sql .= ")"; + $sql .= "values "; + $sql .= "("; + $sql .= "'".$_SESSION['domain_uuid']."', "; + $sql .= "'".check_str($dialplan_uuid)."', "; + $sql .= "'".check_str($dialplan_detail_uuid)."', "; + $sql .= "'".check_str($dialplan_detail_tag)."', "; + $sql .= "'".check_str($dialplan_detail_order)."', "; + $sql .= "'".check_str($dialplan_detail_type)."', "; + $sql .= "'".check_str($dialplan_detail_data)."' "; + $sql .= ")"; + $db->exec(check_sql($sql)); + unset($sql); + } + unset ($prep_statement); + + //synchronize the xml config + save_dialplan_xml(); + + //redirect the user + require_once "includes/header.php"; + switch ($app_uuid) { + case "c03b422e-13a8-bd1b-e42b-b6b9b4d27ce4": + //inbound routes + echo "\n"; + break; + case "8c914ec3-9fc0-8ab5-4cda-6c9288bdc9a3": + //outbound routes + echo "\n"; + break; + case "4b821450-926b-175a-af93-a03c441818b1": + //time conditions + echo "\n"; + break; + default: + echo "\n"; + break; + } + echo "
\n"; + echo "Copy Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + +?> \ No newline at end of file diff --git a/app/dialplan/dialplan_delete.php b/app/dialplan/dialplan_delete.php new file mode 100644 index 0000000000..31b204342f --- /dev/null +++ b/app/dialplan/dialplan_delete.php @@ -0,0 +1,107 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('dialplan_delete') + || permission_exists('inbound_route_delete') + || permission_exists('outbound_route_delete') + || permission_exists('time_conditions_delete')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +if (count($_GET)>0) { + $dialplan_uuid = check_str($_GET["id"]); +} + +if (strlen($dialplan_uuid)>0) { + //get the dialplan data + $sql = "select * from v_dialplans "; + $sql .= "where domain_uuid = '".$_SESSION['domain_uuid']."' "; + $sql .= "and dialplan_uuid = '$dialplan_uuid' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach ($result as &$row) { + $database_dialplan_uuid = $row["dialplan_uuid"]; + $dialplan_context = $row["dialplan_context"]; + $app_uuid = $row["app_uuid"]; + } + unset ($prep_statement); + + //start the atomic transaction + $count = $db->exec("BEGIN;"); + + //delete child data + $sql = "delete from v_dialplan_details "; + $sql .= "where domain_uuid = '".$_SESSION['domain_uuid']."' "; + $sql .= "and dialplan_uuid = '$dialplan_uuid' "; + $db->query($sql); + unset($sql); + + //delete parent data + $sql = "delete from v_dialplans "; + $sql .= "where domain_uuid = '".$_SESSION['domain_uuid']."' "; + $sql .= "and dialplan_uuid = '$dialplan_uuid' "; + $db->query($sql); + unset($sql); + + //commit the atomic transaction + $count = $db->exec("COMMIT;"); + + //synchronize the xml config + save_dialplan_xml(); +} + +//redirect the user + require_once "includes/header.php"; + switch ($app_uuid) { + case "c03b422e-13a8-bd1b-e42b-b6b9b4d27ce4": + //inbound routes + echo "\n"; + break; + case "8c914ec3-9fc0-8ab5-4cda-6c9288bdc9a3": + //outbound routes + echo "\n"; + break; + case "4b821450-926b-175a-af93-a03c441818b1": + //time conditions + echo "\n"; + break; + default: + echo "\n"; + break; + } + echo "
\n"; + echo "Delete Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; +?> \ No newline at end of file diff --git a/app/dialplan/dialplan_details_delete.php b/app/dialplan/dialplan_details_delete.php new file mode 100644 index 0000000000..cb87b16409 --- /dev/null +++ b/app/dialplan/dialplan_details_delete.php @@ -0,0 +1,69 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('dialplan_delete') + || permission_exists('inbound_route_delete') + || permission_exists('outbound_route_delete') + || permission_exists('time_conditions_delete')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +if (count($_GET)>0) { + $id = $_GET["id"]; + $dialplan_uuid = check_str($_REQUEST["id2"]); +} + +if (strlen($id)>0) { + + //delete child data + $sql = ""; + $sql .= "delete from v_dialplan_details "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and dialplan_detail_uuid = '$id' "; + $sql .= "and dialplan_uuid = '$dialplan_uuid' "; + $db->query($sql); + unset($sql); + + //synchronize the xml config + save_dialplan_xml(); + +} + +//redirect the user + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Delete Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + +?> \ No newline at end of file diff --git a/app/dialplan/dialplan_details_edit.php b/app/dialplan/dialplan_details_edit.php new file mode 100644 index 0000000000..8127f6dfdc --- /dev/null +++ b/app/dialplan/dialplan_details_edit.php @@ -0,0 +1,561 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('dialplan_add') + || permission_exists('dialplan_edit') + || permission_exists('inbound_route_add') + || permission_exists('inbound_route_edit') + || permission_exists('outbound_route_add') + || permission_exists('outbound_route_edit') + || permission_exists('time_conditions_add') + || permission_exists('time_conditions_edit')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +//set the action as an add or update + if (isset($_REQUEST["id"])) { + $action = "update"; + $dialplan_detail_uuid = check_str($_REQUEST["id"]); + } + else { + $action = "add"; + $dialplan_uuid = check_str($_REQUEST["id2"]); + } + if (isset($_REQUEST["id2"])) { + $dialplan_uuid = check_str($_REQUEST["id2"]); + } + +//get the http values and set them as php variables + if (count($_POST)>0) { + if (isset($_REQUEST["dialplan_uuid"])) { + $dialplan_uuid = check_str($_POST["dialplan_uuid"]); + } + $dialplan_detail_tag = check_str($_POST["dialplan_detail_tag"]); + $dialplan_detail_order = check_str($_POST["dialplan_detail_order"]); + $dialplan_detail_type = check_str($_POST["dialplan_detail_type"]); + $dialplan_detail_data = check_str($_POST["dialplan_detail_data"]); + $dialplan_detail_break = check_str($_POST["dialplan_detail_break"]); + $dialplan_detail_inline = check_str($_POST["dialplan_detail_inline"]); + $dialplan_detail_group = check_str($_POST["dialplan_detail_group"]); + } + +if (count($_POST)>0 && strlen($_POST["persistformvar"]) == 0) { + + $msg = ''; + if ($action == "update") { + $dialplan_detail_uuid = check_str($_POST["dialplan_detail_uuid"]); + } + + //check for all required data + if (strlen($dialplan_detail_tag) == 0) { $msg .= "Please provide: Tag
\n"; } + if (strlen($dialplan_detail_order) == 0) { $msg .= "Please provide: Order
\n"; } + //if (strlen($dialplan_detail_type) == 0) { $msg .= "Please provide: Type
\n"; } + //if (strlen($dialplan_detail_data) == 0) { $msg .= "Please provide: Data
\n"; } + if (strlen($msg) > 0 && strlen($_POST["persistformvar"]) == 0) { + require_once "includes/header.php"; + require_once "includes/persistformvar.php"; + echo "
\n"; + echo "
\n"; + echo $msg."
"; + echo "
\n"; + persistformvar($_POST); + echo "
\n"; + require_once "includes/footer.php"; + return; + } + + //add or update the database + if ($_POST["persistformvar"] != "true") { + if ($action == "add" && permission_exists('dialplan_add')) { + $dialplan_detail_uuid = uuid(); + $sql = "insert into v_dialplan_details "; + $sql .= "("; + $sql .= "dialplan_uuid, "; + $sql .= "dialplan_detail_uuid, "; + $sql .= "dialplan_detail_tag, "; + $sql .= "dialplan_detail_order, "; + $sql .= "dialplan_detail_type, "; + $sql .= "dialplan_detail_data, "; + $sql .= "dialplan_detail_break, "; + $sql .= "dialplan_detail_inline, "; + $sql .= "dialplan_detail_group, "; + $sql .= "domain_uuid "; + $sql .= ")"; + $sql .= "values "; + $sql .= "("; + $sql .= "'$dialplan_uuid', "; + $sql .= "'$dialplan_detail_uuid', "; + $sql .= "'$dialplan_detail_tag', "; + $sql .= "'$dialplan_detail_order', "; + $sql .= "'$dialplan_detail_type', "; + $sql .= "'$dialplan_detail_data', "; + $sql .= "'$dialplan_detail_break', "; + $sql .= "'$dialplan_detail_inline', "; + if (strlen($dialplan_detail_group) == 0) { + $sql .= "null, "; + } + else { + $sql .= "'$dialplan_detail_group', "; + } + $sql .= "'".$_SESSION['domain_uuid']."' "; + $sql .= ")"; + $db->exec(check_sql($sql)); + unset($sql); + + //synchronize the xml config + save_dialplan_xml(); + + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Add Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + } //if ($action == "add") + + if ($action == "update" && permission_exists('dialplan_edit')) { + $sql = "update v_dialplan_details set "; + $sql .= "dialplan_uuid = '$dialplan_uuid', "; + $sql .= "dialplan_detail_tag = '$dialplan_detail_tag', "; + $sql .= "dialplan_detail_order = '$dialplan_detail_order', "; + $sql .= "dialplan_detail_type = '$dialplan_detail_type', "; + $sql .= "dialplan_detail_data = '$dialplan_detail_data', "; + $sql .= "dialplan_detail_break = '$dialplan_detail_break', "; + $sql .= "dialplan_detail_inline = '$dialplan_detail_inline', "; + if (strlen($dialplan_detail_group) == 0) { + $sql .= "dialplan_detail_group = null "; + } + else { + $sql .= "dialplan_detail_group = '$dialplan_detail_group' "; + } + $sql .= "where domain_uuid = '".$_SESSION['domain_uuid']."' "; + $sql .= "and dialplan_detail_uuid = '$dialplan_detail_uuid'"; + $db->exec(check_sql($sql)); + unset($sql); + + //synchronize the xml config + save_dialplan_xml(); + + require_once "includes/header.php"; + + echo "\n"; + echo "
\n"; + echo "Update Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + } //if ($action == "update") + } //if ($_POST["persistformvar"] != "true") { +} //(count($_POST)>0 && strlen($_POST["persistformvar"]) == 0) + +//pre-populate the form + if (count($_GET)>0 && $_POST["persistformvar"] != "true") { + $dialplan_detail_uuid = $_GET["id"]; + $sql = "select * from v_dialplan_details "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and dialplan_detail_uuid = '$dialplan_detail_uuid' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach ($result as &$row) { + $dialplan_uuid = $row["dialplan_uuid"]; + $dialplan_detail_tag = $row["dialplan_detail_tag"]; + $dialplan_detail_order = $row["dialplan_detail_order"]; + $dialplan_detail_type = $row["dialplan_detail_type"]; + $dialplan_detail_data = $row["dialplan_detail_data"]; + $dialplan_detail_break = $row["dialplan_detail_break"]; + $dialplan_detail_inline = $row["dialplan_detail_inline"]; + $dialplan_detail_group = $row["dialplan_detail_group"]; + break; //limit to 1 row + } + unset ($prep_statement); + } + +//show the header + require_once "includes/header.php"; + +//show the content + echo "
"; + echo "\n"; + echo "\n"; + echo " \n"; + echo ""; + echo "
\n"; + echo "
"; + + echo "
\n"; + echo "
\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + ?> + + \n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; +?> + +\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + if ($action == "update") { + if ($dialplan_detail_tag == "condition") { + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + } + + if ($dialplan_detail_tag == "action") { + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + } + } + + echo " \n"; + echo " \n"; + echo " "; + echo "
Dialplan Detail
\n"; + echo " Tag:\n"; + echo "\n"; + echo " \n"; + + //condition + //field expression + //action + //application + //data + //antiaction + //application + //data + //param + //name + //value + //echo " \n"; + echo "
\n"; + echo "\n"; + echo "
\n"; + echo " Order:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "\n"; + echo "
\n"; + echo " Type:\n"; + echo "\n"; + echo "\n"; + echo "
\n"; + echo " Data:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "\n"; + echo "
\n"; + echo " Group:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "\n"; + echo "
\n"; + echo " Break:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "\n"; + echo "
\n"; + echo " Inline:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "\n"; + echo "
\n"; + echo " \n"; + if ($action == "update") { + echo " \n"; + } + echo " \n"; + echo "
"; + echo "
\n"; + echo "
"; + echo ""; + +//include the footer + require_once "includes/footer.php"; +?> \ No newline at end of file diff --git a/app/dialplan/dialplan_edit.php b/app/dialplan/dialplan_edit.php new file mode 100644 index 0000000000..e6344481b8 --- /dev/null +++ b/app/dialplan/dialplan_edit.php @@ -0,0 +1,592 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +require_once "includes/paging.php"; +if (permission_exists('dialplan_add') + || permission_exists('dialplan_edit') + || permission_exists('inbound_route_add') + || permission_exists('inbound_route_edit') + || permission_exists('outbound_route_add') + || permission_exists('outbound_route_edit') + || permission_exists('time_conditions_add') + || permission_exists('time_conditions_edit')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +//set the action as an add or an update + if (isset($_REQUEST["id"])) { + $action = "update"; + $dialplan_uuid = check_str($_REQUEST["id"]); + } + else { + $action = "add"; + } + +//get the app uuid + $app_uuid = check_str($_REQUEST["app_uuid"]); + +//get the http post values and set them as php variables + if (count($_POST)>0) { + $dialplan_name = check_str($_POST["dialplan_name"]); + $dialplan_number = check_str($_POST["dialplan_number"]); + $dialplan_order = check_str($_POST["dialplan_order"]); + $dialplan_continue = check_str($_POST["dialplan_continue"]); + if (strlen($dialplan_continue) == 0) { $dialplan_continue = "false"; } + $dialplan_context = check_str($_POST["dialplan_context"]); + $dialplan_enabled = check_str($_POST["dialplan_enabled"]); + $dialplan_description = check_str($_POST["dialplan_description"]); + } + +if (count($_POST)>0 && strlen($_POST["persistformvar"]) == 0) { + + $msg = ''; + if ($action == "update") { + $dialplan_uuid = check_str($_POST["dialplan_uuid"]); + } + + //check for all required data + if (strlen($dialplan_name) == 0) { $msg .= "Please provide: Extension Name
\n"; } + if (strlen($dialplan_order) == 0) { $msg .= "Please provide: Order
\n"; } + if (strlen($dialplan_continue) == 0) { $msg .= "Please provide: Continue
\n"; } + if (strlen($dialplan_context) == 0) { $msg .= "Please provide: Context
\n"; } + if (strlen($dialplan_enabled) == 0) { $msg .= "Please provide: Enabled
\n"; } + //if (strlen($dialplan_description) == 0) { $msg .= "Please provide: Description
\n"; } + if (strlen($msg) > 0 && strlen($_POST["persistformvar"]) == 0) { + require_once "includes/header.php"; + require_once "includes/persistformvar.php"; + echo "
\n"; + echo "
\n"; + echo $msg."
"; + echo "
\n"; + persistformvar($_POST); + echo "
\n"; + require_once "includes/footer.php"; + return; + } + + //remove the invalid characters from the extension name + $dialplan_name = str_replace(" ", "_", $dialplan_name); + $dialplan_name = str_replace("/", "", $dialplan_name); + + //add or update the database + if ($_POST["persistformvar"] != "true") { + if ($action == "add" && permission_exists('dialplan_add')) { + //add the data into the database + $dialplan_context = $_SESSION['context']; + $dialplan_uuid = uuid(); + $sql = "insert into v_dialplans "; + $sql .= "("; + $sql .= "domain_uuid, "; + $sql .= "dialplan_uuid, "; + $sql .= "app_uuid, "; + $sql .= "dialplan_name, "; + $sql .= "dialplan_number, "; + $sql .= "dialplan_order, "; + $sql .= "dialplan_continue, "; + $sql .= "dialplan_context, "; + $sql .= "dialplan_enabled, "; + $sql .= "dialplan_description "; + $sql .= ")"; + $sql .= "values "; + $sql .= "("; + $sql .= "'".$_SESSION['domain_uuid']."', "; + $sql .= "'$dialplan_uuid', "; + $sql .= "'742714e5-8cdf-32fd-462c-cbe7e3d655db', "; + $sql .= "'$dialplan_name', "; + $sql .= "'$dialplan_number', "; + $sql .= "'$dialplan_order', "; + $sql .= "'$dialplan_continue', "; + $sql .= "'$dialplan_context', "; + $sql .= "'$dialplan_enabled', "; + $sql .= "'$dialplan_description' "; + $sql .= ")"; + $db->exec(check_sql($sql)); + unset($sql); + + //synchronize the xml config + save_dialplan_xml(); + + //redirect the user + require_once "includes/header.php"; + switch ($app_uuid) { + case "c03b422e-13a8-bd1b-e42b-b6b9b4d27ce4": + //inbound routes + echo "\n"; + break; + case "8c914ec3-9fc0-8ab5-4cda-6c9288bdc9a3": + //outbound routes + echo "\n"; + break; + case "4b821450-926b-175a-af93-a03c441818b1": + //time conditions + echo "\n"; + break; + default: + echo "\n"; + break; + } + echo "
\n"; + echo "Add Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + } //if ($action == "add") + + if ($action == "update" && permission_exists('dialplan_edit')) { + //update the database + $sql = "update v_dialplans set "; + $sql .= "dialplan_name = '$dialplan_name', "; + $sql .= "dialplan_number = '$dialplan_number', "; + $sql .= "dialplan_order = '$dialplan_order', "; + $sql .= "dialplan_continue = '$dialplan_continue', "; + $sql .= "dialplan_context = '$dialplan_context', "; + $sql .= "dialplan_enabled = '$dialplan_enabled', "; + $sql .= "dialplan_description = '$dialplan_description' "; + $sql .= "where domain_uuid = '".$_SESSION['domain_uuid']."' "; + $sql .= "and dialplan_uuid = '$dialplan_uuid'"; + $db->exec(check_sql($sql)); + unset($sql); + + //synchronize the xml config + save_dialplan_xml(); + + //redirect the user + require_once "includes/header.php"; + switch ($app_uuid) { + case "c03b422e-13a8-bd1b-e42b-b6b9b4d27ce4": + //inbound routes + echo "\n"; + break; + case "8c914ec3-9fc0-8ab5-4cda-6c9288bdc9a3": + //outbound routes + echo "\n"; + break; + case "4b821450-926b-175a-af93-a03c441818b1": + //time conditions + echo "\n"; + break; + default: + echo "\n"; + break; + } + echo "
\n"; + echo "Update Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + } //if ($action == "update") + } //if ($_POST["persistformvar"] != "true") +} //(count($_POST)>0 && strlen($_POST["persistformvar"]) == 0) + +//pre-populate the form + if (count($_GET)>0 && $_POST["persistformvar"] != "true") { + $dialplan_uuid = $_GET["id"]; + $sql = "select * from v_dialplans "; + $sql .= "where domain_uuid = '".$_SESSION['domain_uuid']."' "; + $sql .= "and dialplan_uuid = '$dialplan_uuid' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach ($result as &$row) { + $app_uuid = $row["app_uuid"]; + $dialplan_name = $row["dialplan_name"]; + $dialplan_number = $row["dialplan_number"]; + $dialplan_order = $row["dialplan_order"]; + $dialplan_continue = $row["dialplan_continue"]; + $dialplan_context = $row["dialplan_context"]; + $dialplan_enabled = $row["dialplan_enabled"]; + $dialplan_description = $row["dialplan_description"]; + } + unset ($prep_statement); + } + +//show the header + require_once "includes/header.php"; + +//show the content + echo "
"; + echo "\n"; + echo "\n"; + echo " "; + echo " "; + echo "
\n"; + echo "
"; + + echo "
\n"; + echo "
\n"; + + echo "\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "
\n"; + echo" Dialplan
\n"; + echo "
\n"; + echo " \n"; + switch ($app_uuid) { + case "c03b422e-13a8-bd1b-e42b-b6b9b4d27ce4": + //inbound routes + echo " \n"; + break; + case "8c914ec3-9fc0-8ab5-4cda-6c9288bdc9a3": + //outbound routes + echo " \n"; + break; + case "4b821450-926b-175a-af93-a03c441818b1": + //time conditions + echo " \n"; + break; + default: + echo " \n"; + break; + } + echo "
\n"; + echo " Dialplan Include general settings. \n"; + echo " \n"; + echo "
"; + echo "
\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo " \n"; + echo " \n"; + echo " "; + echo "
\n"; + echo " Name:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "\n"; + echo "
\n"; + echo " Number:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "\n"; + echo "
\n"; + echo " Context:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "\n"; + echo "
\n"; + echo " Continue:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "
\n"; + echo " Order:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "
\n"; + echo " Enabled:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "\n"; + echo "
\n"; + echo " Description:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "\n"; + echo "
\n"; + if ($action == "update") { + echo " \n"; + } + echo " \n"; + echo "
"; + echo ""; + + echo "
"; + echo "
"; + + //dialplan details + if ($action == "update") { + echo "
"; + echo "\n"; + echo "\n"; + echo " "; + echo ""; + echo "
\n"; + + echo "\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "

Conditions and Actions
\n"; + echo "
\n"; + echo " The following conditions, actions and anti-actions are used in the dialplan to direct \n"; + echo " call flow. Each is processed in order that it is given. \n"; + echo " Use as many conditions, actions or anti-actions as needed. \n"; + echo "

"; + echo "
\n"; + + $sql = " select * from v_dialplan_details "; + $sql .= " where domain_uuid = '".$_SESSION['domain_uuid']."' "; + $sql .= " and dialplan_uuid = '$dialplan_uuid' "; + $sql .= " order by dialplan_detail_group asc, dialplan_detail_order asc"; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + $result_count = count($result); + unset ($prep_statement, $sql); + + //create a new array that is sorted into groups and put the tags in order conditions, actions, anti-actions + $x = 0; + $details = ''; + //conditions + foreach($result as $row) { + if ($row['dialplan_detail_tag'] == "condition") { + $group = $row['dialplan_detail_group']; + foreach ($row as $key => $val) { + $details[$group][$x][$key] = $val; + } + } + $x++; + } + //regex + foreach($result as $row) { + if ($row['dialplan_detail_tag'] == "regex") { + $group = $row['dialplan_detail_group']; + foreach ($row as $key => $val) { + $details[$group][$x][$key] = $val; + } + } + $x++; + } + //actions + foreach($result as $row) { + if ($row['dialplan_detail_tag'] == "action") { + $group = $row['dialplan_detail_group']; + foreach ($row as $key => $val) { + $details[$group][$x][$key] = $val; + } + } + $x++; + } + //anti-actions + foreach($result as $row) { + if ($row['dialplan_detail_tag'] == "anti-action") { + $group = $row['dialplan_detail_group']; + foreach ($row as $key => $val) { + $details[$group][$x][$key] = $val; + } + } + $x++; + } + unset($result); + + //define the alternating row styles + $c = 0; + $row_style["0"] = "row_style0"; + $row_style["1"] = "row_style1"; + + //display the results + echo "
\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + //echo "\n"; + echo "\n"; + echo "\n"; + + if ($result_count > 0) { + $x = 0; + foreach($details as $group) { + if ($x > 0) { + echo "\n"; + echo "\n"; + echo "\n"; + echo "
TagTypeDataOrderGroup\n"; + echo " $v_link_label_add\n"; + echo "
\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "
 $paging_controls\n"; + echo " $v_link_label_add\n"; + echo "
\n"; + echo "
"; + echo "
"; + echo "

"; + + echo "
\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + //echo "\n"; + echo "\n"; + echo "\n"; + } + + foreach($group as $row) { + echo "\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + //echo " \n"; + echo " \n"; + echo "\n"; + } + if ($c==0) { $c=1; } else { $c=0; } + $x++; + } //end foreach + unset($sql, $result, $row_count); + + } //end if results + + echo "\n"; + echo "\n"; + echo "\n"; + echo "
TagTypeDataOrderGroup\n"; + echo " $v_link_label_add\n"; + echo "
  ".$row['dialplan_detail_tag']."  ".$row['dialplan_detail_type']."  ".wordwrap($row['dialplan_detail_data'],180,"
",1)."
  ".$row['dialplan_detail_order']."  ".$row['dialplan_detail_group']."\n"; + echo " $v_link_label_edit\n"; + echo " $v_link_label_delete\n"; + echo "
\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "
 $paging_controls\n"; + echo " $v_link_label_add\n"; + echo "
\n"; + echo "
"; + echo "
"; + echo "

"; + + echo "
"; + echo "
"; + echo "

"; + } //end if update + +//show the footer + require_once "includes/footer.php"; +?> \ No newline at end of file diff --git a/app/dialplan/dialplans.php b/app/dialplan/dialplans.php new file mode 100644 index 0000000000..0d62678662 --- /dev/null +++ b/app/dialplan/dialplans.php @@ -0,0 +1,348 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('dialplan_view')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +//includes + require_once "includes/header.php"; + require_once "includes/paging.php"; + +//set the http values as php variables + $order_by = $_GET["order_by"]; + $order = $_GET["order"]; + $dialplan_context = $_GET["dialplan_context"]; + $app_uuid = $_GET["app_uuid"]; + +//show the content + echo "
"; + echo "\n"; + echo "\n"; + echo ""; + echo ""; + echo "
\n"; + echo "
"; + + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "
\n"; + echo " \n"; + if ($app_uuid == "c03b422e-13a8-bd1b-e42b-b6b9b4d27ce4") { + echo " Inbound Routes\n"; + } + elseif ($app_uuid == "8c914ec3-9fc0-8ab5-4cda-6c9288bdc9a3") { + echo " Outbound Routes\n"; + } + elseif ($app_uuid == "4b821450-926b-175a-af93-a03c441818b1") { + echo " Time Conditions\n"; + } + else { + echo " Dialplan\n"; + } + + echo " \n"; + echo " \n"; + if (permission_exists('dialplan_advanced_view') && strlen($app_uuid) == 0) { + echo " \n"; + } + else { + echo " \n"; + } + echo "
\n"; + echo " \n"; + + if ($app_uuid == "c03b422e-13a8-bd1b-e42b-b6b9b4d27ce4") { + //inbound routes + echo " Route incoming calls to destinations based on one \n"; + echo " or more conditions. It can send incoming calls to an IVR Menu, \n"; + echo " Call Group, Extension, External Number, Script. Order is important when an \n"; + echo " anti-action is used or when there are multiple conditions that match. \n"; + } + elseif ($app_uuid == "8c914ec3-9fc0-8ab5-4cda-6c9288bdc9a3") { + //outbound routes + echo " Route outbound calls to gateways, tdm, enum and more. \n"; + echo " When a call matches the conditions the call to outbound routes . \n"; + } + elseif ($app_uuid == "4b821450-926b-175a-af93-a03c441818b1") { + //time conditions + echo " Time conditions route calls based on time conditions. You can \n"; + echo " use time conditions to send calls to an IVR Menu, External numbers, \n"; + echo " Scripts, or other destinations. \n"; + } + else { + //dialplan + if (if_group("superadmin")) { + echo " The dialplan is used to setup call destinations based on conditions and context.\n"; + echo " You can use the dialplan to send calls to gateways, auto attendants, external numbers,\n"; + echo " to scripts, or any destination.\n"; + } + else { + echo " The dialplan provides a view of some of the feature codes, as well as the IVR Menu, \n"; + echo " Conferences, Queues and other destinations.\n"; + } + } + echo " \n"; + echo "
"; + + echo "
"; + echo "
"; + + //get the number of rows in the dialplan + $sql = ""; + $sql .= " select count(*) as num_rows from v_dialplans "; + $sql .= "where domain_uuid = '$domain_uuid' "; + if (strlen($app_uuid) == 0) { + //hide inbound routes + $sql .= "and app_uuid <> 'c03b422e-13a8-bd1b-e42b-b6b9b4d27ce4' "; + //hide outbound routes + $sql .= "and app_uuid <> '8c914ec3-9fc0-8ab5-4cda-6c9288bdc9a3' "; + } + else { + $sql .= "and app_uuid = '".$app_uuid."' "; + } + $prep_statement = $db->prepare(check_sql($sql)); + if ($prep_statement) { + $prep_statement->execute(); + $row = $prep_statement->fetch(PDO::FETCH_ASSOC); + if ($row['num_rows'] > 0) { + $num_rows = $row['num_rows']; + } + else { + $num_rows = '0'; + } + } + unset($prep_statement, $result); + + $rows_per_page = 150; + $param = ""; + $page = $_GET['page']; + if (strlen($page) == 0) { $page = 0; $_GET['page'] = 0; } + list($paging_controls, $rows_per_page, $var_3) = paging($num_rows, $param, $rows_per_page); + $offset = $rows_per_page * $page; + + $sql = ""; + $sql .= " select * from v_dialplans "; + $sql .= " where domain_uuid = '$domain_uuid' "; + if (strlen($app_uuid) == 0) { + //hide inbound routes + $sql .= "and app_uuid <> 'c03b422e-13a8-bd1b-e42b-b6b9b4d27ce4' "; + //hide outbound routes + $sql .= "and app_uuid <> '8c914ec3-9fc0-8ab5-4cda-6c9288bdc9a3' "; + } + else { + $sql .= "and app_uuid = '".$app_uuid."' "; + } + if (strlen($order_by)> 0) { $sql .= "order by $order_by $order "; } else { $sql .= "order by dialplan_order asc, dialplan_name asc "; } + $sql .= " limit $rows_per_page offset $offset "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + $result_count = count($result); + unset ($prep_statement, $sql); + + $c = 0; + $row_style["0"] = "row_style0"; + $row_style["1"] = "row_style1"; + + echo "
\n"; + echo "\n"; + echo "\n"; + echo th_order_by('dialplan_name', 'Name', $order_by, $order); + echo th_order_by('dialplan_number', 'Number', $order_by, $order); + echo th_order_by('dialplan_order', 'Order', $order_by, $order); + echo th_order_by('dialplan_enabled', 'Enabled', $order_by, $order); + echo th_order_by('dialplan_description', 'Description', $order_by, $order); + echo "\n"; + echo "\n"; + + if ($result_count > 0) { + foreach($result as $row) { + $app_uuid = $row['app_uuid']; + if (strlen($row['dialplan_number']) == 0) { + $sql = ""; + $sql .= "select * from v_dialplan_details "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and dialplan_uuid = '".$row['dialplan_uuid']."' "; + $sql .= "and dialplan_detail_type = 'destination_number' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $tmp_result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach ($tmp_result as &$tmp) { + //prepare the extension number + preg_match_all('/[\|0-9\*]/',$tmp["dialplan_detail_data"], $tmp_match); + $dialplan_number = implode("",$tmp_match[0]); + $dialplan_number = str_replace("|", " ", $dialplan_number); + $row['dialplan_number'] = $dialplan_number; + //update the extension number + $sql = "update v_dialplans set "; + $sql .= "dialplan_number = '$dialplan_number', "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and dialplan_uuid = '".$row['dialplan_uuid']."'"; + $db->exec($sql); + unset($sql); + break; //limit to 1 row + } + unset ($prep_statement); + } + echo "\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "\n"; + if ($c==0) { $c=1; } else { $c=0; } + } //end foreach + unset($sql, $result, $row_count); + } //end if results + + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "
\n"; + if ($app_uuid == "c03b422e-13a8-bd1b-e42b-b6b9b4d27ce4") { + if (permission_exists('inbound_route_add')) { + echo " $v_link_label_add\n"; + } + } + elseif ($app_uuid == "8c914ec3-9fc0-8ab5-4cda-6c9288bdc9a3") { + if (permission_exists('outbound_route_add')) { + echo " $v_link_label_add\n"; + } + } + elseif ($app_uuid == "4b821450-926b-175a-af93-a03c441818b1") { + if (permission_exists('time_conditions_add')) { + echo " $v_link_label_add\n"; + } + } + else { + if (permission_exists('dialplan_add')) { + echo " $v_link_label_add\n"; + } + } + echo "
  ".$row['dialplan_name']."  ".$row['dialplan_number']."  ".$row['dialplan_order']."  ".$row['dialplan_enabled']."".$row['dialplan_description']." \n"; + if ($app_uuid == "c03b422e-13a8-bd1b-e42b-b6b9b4d27ce4") { + if (permission_exists('inbound_route_edit')) { + echo " $v_link_label_edit\n"; + } + if (permission_exists('inbound_route_delete')) { + echo " $v_link_label_delete\n"; + } + } + elseif ($app_uuid == "8c914ec3-9fc0-8ab5-4cda-6c9288bdc9a3") { + if (permission_exists('outbound_route_edit')) { + echo " $v_link_label_edit\n"; + } + if (permission_exists('outbound_route_delete')) { + echo " $v_link_label_delete\n"; + } + } + elseif ($app_uuid == "4b821450-926b-175a-af93-a03c441818b1") { + if (permission_exists('time_conditions_edit')) { + echo " $v_link_label_edit\n"; + } + if (permission_exists('time_conditions_delete')) { + echo " $v_link_label_delete\n"; + } + } + else { + if (permission_exists('dialplan_edit')) { + echo " $v_link_label_edit\n"; + } + if (permission_exists('dialplan_delete')) { + echo " $v_link_label_delete\n"; + } + } + echo "
\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "
 $paging_controls\n"; + echo "  "; + if ($app_uuid == "c03b422e-13a8-bd1b-e42b-b6b9b4d27ce4") { + if (permission_exists('inbound_route_add')) { + echo " $v_link_label_add\n"; + } + } + elseif ($app_uuid == "8c914ec3-9fc0-8ab5-4cda-6c9288bdc9a3") { + if (permission_exists('outbound_route_add')) { + echo " $v_link_label_add\n"; + } + } + elseif ($app_uuid == "4b821450-926b-175a-af93-a03c441818b1") { + if (permission_exists('time_conditions_add')) { + echo " $v_link_label_add\n"; + } + } + else { + if (permission_exists('dialplan_add')) { + echo " $v_link_label_add\n"; + } + } + + echo "
\n"; + echo "
\n"; + echo "
\n"; + if ($v_path_show) { + echo $_SESSION['switch']['dialplan']['dir']; + } + echo "
"; + echo "
"; + echo "

"; + echo "

"; + + echo "
"; + echo "
"; + echo "

"; + +require_once "includes/footer.php"; +unset ($result_count); +unset ($result); +unset ($key); +unset ($val); +unset ($c); +?> \ No newline at end of file diff --git a/app/dialplan/resources/xml/dialplan/100_call-direction.xml b/app/dialplan/resources/xml/dialplan/100_call-direction.xml new file mode 100644 index 0000000000..535496e549 --- /dev/null +++ b/app/dialplan/resources/xml/dialplan/100_call-direction.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/dialplan/resources/xml/dialplan/220_global-intercept.xml b/app/dialplan/resources/xml/dialplan/220_global-intercept.xml new file mode 100644 index 0000000000..13c622d4a2 --- /dev/null +++ b/app/dialplan/resources/xml/dialplan/220_global-intercept.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/app/dialplan/resources/xml/dialplan/230_group-intercept.xml b/app/dialplan/resources/xml/dialplan/230_group-intercept.xml new file mode 100644 index 0000000000..3fbc3e024e --- /dev/null +++ b/app/dialplan/resources/xml/dialplan/230_group-intercept.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/app/dialplan/resources/xml/dialplan/240_redial.xml b/app/dialplan/resources/xml/dialplan/240_redial.xml new file mode 100644 index 0000000000..eec6b5e93f --- /dev/null +++ b/app/dialplan/resources/xml/dialplan/240_redial.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/dialplan/resources/xml/dialplan/245_page.xml b/app/dialplan/resources/xml/dialplan/245_page.xml new file mode 100644 index 0000000000..7d7467c283 --- /dev/null +++ b/app/dialplan/resources/xml/dialplan/245_page.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/dialplan/resources/xml/dialplan/250_global.xml b/app/dialplan/resources/xml/dialplan/250_global.xml new file mode 100644 index 0000000000..df2810ec88 --- /dev/null +++ b/app/dialplan/resources/xml/dialplan/250_global.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/dialplan/resources/xml/dialplan/260_eavesdrop.xml b/app/dialplan/resources/xml/dialplan/260_eavesdrop.xml new file mode 100644 index 0000000000..51db9d1b73 --- /dev/null +++ b/app/dialplan/resources/xml/dialplan/260_eavesdrop.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/dialplan/resources/xml/dialplan/270_call_privacy.xml b/app/dialplan/resources/xml/dialplan/270_call_privacy.xml new file mode 100644 index 0000000000..66f101cbd8 --- /dev/null +++ b/app/dialplan/resources/xml/dialplan/270_call_privacy.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/app/dialplan/resources/xml/dialplan/280_call_return.xml b/app/dialplan/resources/xml/dialplan/280_call_return.xml new file mode 100644 index 0000000000..662d10c1c3 --- /dev/null +++ b/app/dialplan/resources/xml/dialplan/280_call_return.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/dialplan/resources/xml/dialplan/290_intercept-ext.xml b/app/dialplan/resources/xml/dialplan/290_intercept-ext.xml new file mode 100644 index 0000000000..e7e4976da8 --- /dev/null +++ b/app/dialplan/resources/xml/dialplan/290_intercept-ext.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/app/dialplan/resources/xml/dialplan/300_extension-intercom.xml b/app/dialplan/resources/xml/dialplan/300_extension-intercom.xml new file mode 100644 index 0000000000..2f26115c4e --- /dev/null +++ b/app/dialplan/resources/xml/dialplan/300_extension-intercom.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/app/dialplan/resources/xml/dialplan/310_send_to_voicemail.xml b/app/dialplan/resources/xml/dialplan/310_send_to_voicemail.xml new file mode 100644 index 0000000000..12a583b4e3 --- /dev/null +++ b/app/dialplan/resources/xml/dialplan/310_send_to_voicemail.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/dialplan/resources/xml/dialplan/320_vmain.xml b/app/dialplan/resources/xml/dialplan/320_vmain.xml new file mode 100644 index 0000000000..8d5c728882 --- /dev/null +++ b/app/dialplan/resources/xml/dialplan/320_vmain.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/app/dialplan/resources/xml/dialplan/330_vmain_user.xml b/app/dialplan/resources/xml/dialplan/330_vmain_user.xml new file mode 100644 index 0000000000..be6a457345 --- /dev/null +++ b/app/dialplan/resources/xml/dialplan/330_vmain_user.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/app/dialplan/resources/xml/dialplan/340_delay_echo.xml b/app/dialplan/resources/xml/dialplan/340_delay_echo.xml new file mode 100644 index 0000000000..5b8d201044 --- /dev/null +++ b/app/dialplan/resources/xml/dialplan/340_delay_echo.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/dialplan/resources/xml/dialplan/350_echo.xml b/app/dialplan/resources/xml/dialplan/350_echo.xml new file mode 100644 index 0000000000..9d365e512f --- /dev/null +++ b/app/dialplan/resources/xml/dialplan/350_echo.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/dialplan/resources/xml/dialplan/360_milliwatt.xml b/app/dialplan/resources/xml/dialplan/360_milliwatt.xml new file mode 100644 index 0000000000..ce1db8d4cc --- /dev/null +++ b/app/dialplan/resources/xml/dialplan/360_milliwatt.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/dialplan/resources/xml/dialplan/370_tone_stream.xml b/app/dialplan/resources/xml/dialplan/370_tone_stream.xml new file mode 100644 index 0000000000..b6573194fc --- /dev/null +++ b/app/dialplan/resources/xml/dialplan/370_tone_stream.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/dialplan/resources/xml/dialplan/380_hold_music.xml b/app/dialplan/resources/xml/dialplan/380_hold_music.xml new file mode 100644 index 0000000000..532b1ff4e9 --- /dev/null +++ b/app/dialplan/resources/xml/dialplan/380_hold_music.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/dialplan/resources/xml/dialplan/400_recordings.xml b/app/dialplan/resources/xml/dialplan/400_recordings.xml new file mode 100644 index 0000000000..6d2bcd199d --- /dev/null +++ b/app/dialplan/resources/xml/dialplan/400_recordings.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/dialplan/resources/xml/dialplan/410_freeswitch_conference.xml b/app/dialplan/resources/xml/dialplan/410_freeswitch_conference.xml new file mode 100644 index 0000000000..92932f8459 --- /dev/null +++ b/app/dialplan/resources/xml/dialplan/410_freeswitch_conference.xml @@ -0,0 +1,14 @@ + + + + + + + + \ No newline at end of file diff --git a/app/dialplan/resources/xml/dialplan/420_disa.xml b/app/dialplan/resources/xml/dialplan/420_disa.xml new file mode 100644 index 0000000000..a90c4a1cd4 --- /dev/null +++ b/app/dialplan/resources/xml/dialplan/420_disa.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/app/dialplan/resources/xml/dialplan/430_directory.xml b/app/dialplan/resources/xml/dialplan/430_directory.xml new file mode 100644 index 0000000000..c375b28198 --- /dev/null +++ b/app/dialplan/resources/xml/dialplan/430_directory.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/dialplan/resources/xml/dialplan/440_wake-up.xml b/app/dialplan/resources/xml/dialplan/440_wake-up.xml new file mode 100644 index 0000000000..8fccece90f --- /dev/null +++ b/app/dialplan/resources/xml/dialplan/440_wake-up.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/app/dialplan/resources/xml/dialplan/450_park_in.xml b/app/dialplan/resources/xml/dialplan/450_park_in.xml new file mode 100644 index 0000000000..8e3f309846 --- /dev/null +++ b/app/dialplan/resources/xml/dialplan/450_park_in.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/app/dialplan/resources/xml/dialplan/455_park_out.xml b/app/dialplan/resources/xml/dialplan/455_park_out.xml new file mode 100644 index 0000000000..f27b91e392 --- /dev/null +++ b/app/dialplan/resources/xml/dialplan/455_park_out.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/app/dialplan/resources/xml/dialplan/460_park_slots.xml b/app/dialplan/resources/xml/dialplan/460_park_slots.xml new file mode 100644 index 0000000000..0c2f17fcb8 --- /dev/null +++ b/app/dialplan/resources/xml/dialplan/460_park_slots.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/dialplan/resources/xml/dialplan/999_local_extension.xml b/app/dialplan/resources/xml/dialplan/999_local_extension.xml new file mode 100644 index 0000000000..3e6bedd90a --- /dev/null +++ b/app/dialplan/resources/xml/dialplan/999_local_extension.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/dialplan/root.php b/app/dialplan/root.php new file mode 100644 index 0000000000..7b882438ea --- /dev/null +++ b/app/dialplan/root.php @@ -0,0 +1,50 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ + +// make sure the PATH_SEPARATOR is defined + if (!defined("PATH_SEPARATOR")) { + if ( strpos( $_ENV[ "OS" ], "Win" ) !== false ) { define("PATH_SEPARATOR", ";"); } else { define("PATH_SEPARATOR", ":"); } + } + +// make sure the document_root is set + $_SERVER["SCRIPT_FILENAME"] = str_replace("\\", "/", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = str_replace($_SERVER["PHP_SELF"], "", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = realpath($_SERVER["DOCUMENT_ROOT"]); + //echo "DOCUMENT_ROOT: ".$_SERVER["DOCUMENT_ROOT"]."
\n"; + //echo "PHP_SELF: ".$_SERVER["PHP_SELF"]."
\n"; + //echo "SCRIPT_FILENAME: ".$_SERVER["SCRIPT_FILENAME"]."
\n"; + +// if the project directory exists then add it to the include path otherwise add the document root to the include path + if (is_dir($_SERVER["DOCUMENT_ROOT"].'/fusionpbx')){ + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', '/fusionpbx'); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER["DOCUMENT_ROOT"].'/fusionpbx' ); + } + else { + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', ''); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER['DOCUMENT_ROOT'] ); + } + +?> \ No newline at end of file diff --git a/app/dialplan_inbound/app_config.php b/app/dialplan_inbound/app_config.php new file mode 100644 index 0000000000..157a5f72cc --- /dev/null +++ b/app/dialplan_inbound/app_config.php @@ -0,0 +1,36 @@ + \ No newline at end of file diff --git a/app/dialplan_inbound/app_defaults.php b/app/dialplan_inbound/app_defaults.php new file mode 100644 index 0000000000..93c598d04a --- /dev/null +++ b/app/dialplan_inbound/app_defaults.php @@ -0,0 +1,71 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2010 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ + +//if there are multiple domains then update the public dir path to include the domain + if (count($_SESSION["domains"]) > 1) { + if (is_dir($_SESSION['switch']['dialplan']['dir'].'/public')) { + //clear out the old xml files + $v_needle = '_v_'; + if($dh = opendir($_SESSION['switch']['dialplan']['dir'].'/public')) { + $files = Array(); + while($file = readdir($dh)) { + if($file != "." && $file != ".." && $file[0] != '.') { + if(is_dir($dir . "/" . $file)) { + //this is a directory + } else { + if (strpos($file, $v_needle) !== false && substr($file,-4) == '.xml') { + unlink($_SESSION['switch']['dialplan']['dir'].'/public/'.$file); + } + } + } + } + closedir($dh); + } + } + } + +//if the public directory doesn't exist then create it + if (!is_dir($_SESSION['switch']['dialplan']['dir'].'/public')) { mkdir($_SESSION['switch']['dialplan']['dir'].'/public',0777,true); } + +//if multiple domains then make sure that the dialplan/public/domain_name.xml file exists + if (count($_SESSION["domains"]) > 1) { + //make sure the public directory and xml file exist + if (!is_dir($_SESSION['switch']['dialplan']['dir'].'/public'.$_SESSION['domains'][$domain_uuid]['domain_name'])) { + mkdir($_SESSION['switch']['dialplan']['dir'].'/public/'.$_SESSION['domains'][$domain_uuid]['domain_name'],0777,true); + } + $file = $_SESSION['switch']['dialplan']['dir']."/public/".$_SESSION['domains'][$domain_uuid]['domain_name'].".xml"; + if (!file_exists($file)) { + $fout = fopen($file,"w"); + $xml = "\n"; + $xml .= " \n"; + $xml .= "\n"; + fwrite($fout, $xml); + fclose($fout); + unset($xml,$file); + } + } + +?> \ No newline at end of file diff --git a/app/dialplan_inbound/dialplan_inbound_add.php b/app/dialplan_inbound/dialplan_inbound_add.php new file mode 100644 index 0000000000..a567206612 --- /dev/null +++ b/app/dialplan_inbound/dialplan_inbound_add.php @@ -0,0 +1,808 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('inbound_route_add')) { + //access granted +} +else { + echo "access denied"; + exit; +} +require_once "includes/header.php"; +require_once "includes/paging.php"; + +//get the http get values and set them as php variables + $order_by = $_GET["order_by"]; + $order = $_GET["order"]; + $action = $_GET["action"]; + +//get the http post values and set them as php variables + if (count($_POST)>0) { + $dialplan_name = check_str($_POST["dialplan_name"]); + $limit = check_str($_POST["limit"]); + $public_order = check_str($_POST["public_order"]); + $condition_field_1 = check_str($_POST["condition_field_1"]); + $condition_expression_1 = check_str($_POST["condition_expression_1"]); + $condition_field_2 = check_str($_POST["condition_field_2"]); + $condition_expression_2 = check_str($_POST["condition_expression_2"]); + + $action_1 = check_str($_POST["action_1"]); + //$action_1 = "transfer:1001 XML default"; + $action_1_array = explode(":", $action_1); + $action_application_1 = array_shift($action_1_array); + $action_data_1 = join(':', $action_1_array); + + $action_2 = check_str($_POST["action_2"]); + //$action_2 = "transfer:1001 XML default"; + $action_2_array = explode(":", $action_2); + $action_application_2 = array_shift($action_2_array); + $action_data_2 = join(':', $action_2_array); + + //$action_application_1 = check_str($_POST["action_application_1"]); + //$action_data_1 = check_str($_POST["action_data_1"]); + //$action_application_2 = check_str($_POST["action_application_2"]); + //$action_data_2 = check_str($_POST["action_data_2"]); + + if (if_group("superadmin") && $action == "advanced") { + //allow users in the superadmin group advanced control + } + else { + if (strlen($condition_field_1) == 0) { $condition_field_1 = "destination_number"; } + if (strlen($condition_expression_1) < 8) { $msg .= "The destination number must be 7 or more digits.
\n"; } + if (is_numeric($condition_expression_1)) { + //the number is numeric + $condition_expression_1 = '^'.$condition_expression_1.'$'; + } + else { + $msg .= "The destination number must be numeric.
\n"; + } + } + $dialplan_enabled = check_str($_POST["dialplan_enabled"]); + $dialplan_description = check_str($_POST["dialplan_description"]); + if (strlen($dialplan_enabled) == 0) { $dialplan_enabled = "true"; } //set default to enabled + } + +if (count($_POST)>0 && strlen($_POST["persistformvar"]) == 0) { + //check for all required data + if (strlen($domain_uuid) == 0) { $msg .= "Please provide: domain_uuid
\n"; } + if (strlen($dialplan_name) == 0) { $msg .= "Please provide: Extension Name
\n"; } + if (strlen($condition_field_1) == 0) { $msg .= "Please provide: Condition Field
\n"; } + if (strlen($condition_expression_1) == 0) { $msg .= "Please provide: Condition Expression
\n"; } + if (strlen($action_application_1) == 0) { $msg .= "Please provide: Action Application
\n"; } + //if (strlen($limit) == 0) { $msg .= "Please provide: Limit
\n"; } + //if (strlen($dialplan_enabled) == 0) { $msg .= "Please provide: Enabled True or False
\n"; } + //if (strlen($dialplan_description) == 0) { $msg .= "Please provide: Description
\n"; } + if (strlen($msg) > 0 && strlen($_POST["persistformvar"]) == 0) { + require_once "includes/header.php"; + require_once "includes/persistformvar.php"; + echo "
\n"; + echo "
\n"; + echo $msg."
"; + echo "
\n"; + persistformvar($_POST); + echo "
\n"; + require_once "includes/footer.php"; + return; + } + + //remove the invalid characters from the extension name + $dialplan_name = str_replace(" ", "_", $dialplan_name); + $dialplan_name = str_replace("/", "", $dialplan_name); + + //start the atomic transaction + $count = $db->exec("BEGIN;"); //returns affected rows + + //add the main dialplan entry + $dialplan_uuid = uuid(); + $sql = "insert into v_dialplans "; + $sql .= "("; + $sql .= "domain_uuid, "; + $sql .= "dialplan_uuid, "; + $sql .= "app_uuid, "; + $sql .= "dialplan_name, "; + $sql .= "dialplan_order , "; + $sql .= "dialplan_context, "; + $sql .= "dialplan_enabled, "; + $sql .= "dialplan_description "; + $sql .= ") "; + $sql .= "values "; + $sql .= "("; + $sql .= "'$domain_uuid', "; + $sql .= "'$dialplan_uuid', "; + $sql .= "'c03b422e-13a8-bd1b-e42b-b6b9b4d27ce4', "; + $sql .= "'$dialplan_name', "; + $sql .= "'$public_order', "; + $sql .= "'public', "; + $sql .= "'$dialplan_enabled', "; + $sql .= "'$dialplan_description' "; + $sql .= ")"; + $db->exec(check_sql($sql)); + unset($sql); + + //add condition public context + $dialplan_detail_uuid = uuid(); + $sql = "insert into v_dialplan_details "; + $sql .= "("; + $sql .= "domain_uuid, "; + $sql .= "dialplan_uuid, "; + $sql .= "dialplan_detail_uuid, "; + $sql .= "dialplan_detail_tag, "; + $sql .= "dialplan_detail_type, "; + $sql .= "dialplan_detail_data, "; + $sql .= "dialplan_detail_order "; + $sql .= ") "; + $sql .= "values "; + $sql .= "("; + $sql .= "'$domain_uuid', "; + $sql .= "'$dialplan_uuid', "; + $sql .= "'$dialplan_detail_uuid', "; + $sql .= "'condition', "; + $sql .= "'context', "; + $sql .= "'public', "; + $sql .= "'10' "; + $sql .= ")"; + $db->exec(check_sql($sql)); + unset($sql); + + //add condition 1 + $dialplan_detail_uuid = uuid(); + $sql = "insert into v_dialplan_details "; + $sql .= "("; + $sql .= "domain_uuid, "; + $sql .= "dialplan_uuid, "; + $sql .= "dialplan_detail_uuid, "; + $sql .= "dialplan_detail_tag, "; + $sql .= "dialplan_detail_type, "; + $sql .= "dialplan_detail_data, "; + $sql .= "dialplan_detail_order "; + $sql .= ") "; + $sql .= "values "; + $sql .= "("; + $sql .= "'$domain_uuid', "; + $sql .= "'$dialplan_uuid', "; + $sql .= "'$dialplan_detail_uuid', "; + $sql .= "'condition', "; + $sql .= "'$condition_field_1', "; + $sql .= "'$condition_expression_1', "; + $sql .= "'20' "; + $sql .= ")"; + $db->exec(check_sql($sql)); + unset($sql); + + //add condition 2 + if (strlen($condition_field_2) > 0) { + $dialplan_detail_uuid = uuid(); + $sql = "insert into v_dialplan_details "; + $sql .= "("; + $sql .= "domain_uuid, "; + $sql .= "dialplan_uuid, "; + $sql .= "dialplan_detail_uuid, "; + $sql .= "dialplan_detail_tag, "; + $sql .= "dialplan_detail_type, "; + $sql .= "dialplan_detail_data, "; + $sql .= "dialplan_detail_order "; + $sql .= ") "; + $sql .= "values "; + $sql .= "("; + $sql .= "'$domain_uuid', "; + $sql .= "'$dialplan_uuid', "; + $sql .= "'$dialplan_detail_uuid', "; + $sql .= "'condition', "; + $sql .= "'$condition_field_2', "; + $sql .= "'$condition_expression_2', "; + $sql .= "'30' "; + $sql .= ")"; + $db->exec(check_sql($sql)); + unset($sql); + } + + //set domain + if (count($_SESSION["domains"]) > 1) { + $dialplan_detail_uuid = uuid(); + $sql = "insert into v_dialplan_details "; + $sql .= "("; + $sql .= "domain_uuid, "; + $sql .= "dialplan_uuid, "; + $sql .= "dialplan_detail_uuid, "; + $sql .= "dialplan_detail_tag, "; + $sql .= "dialplan_detail_type, "; + $sql .= "dialplan_detail_data, "; + $sql .= "dialplan_detail_order "; + $sql .= ") "; + $sql .= "values "; + $sql .= "("; + $sql .= "'$domain_uuid', "; + $sql .= "'$dialplan_uuid', "; + $sql .= "'$dialplan_detail_uuid', "; + $sql .= "'action', "; + $sql .= "'set', "; + $sql .= "'domain=".$_SESSION['domain_name']."', "; + $sql .= "'40' "; + $sql .= ")"; + $db->exec(check_sql($sql)); + unset($sql); + } + + //set domain_name + if (count($_SESSION["domains"]) > 1) { + $dialplan_detail_uuid = uuid(); + $sql = "insert into v_dialplan_details "; + $sql .= "("; + $sql .= "domain_uuid, "; + $sql .= "dialplan_uuid, "; + $sql .= "dialplan_detail_uuid, "; + $sql .= "dialplan_detail_tag, "; + $sql .= "dialplan_detail_type, "; + $sql .= "dialplan_detail_data, "; + $sql .= "dialplan_detail_order "; + $sql .= ") "; + $sql .= "values "; + $sql .= "("; + $sql .= "'$domain_uuid', "; + $sql .= "'$dialplan_uuid', "; + $sql .= "'$dialplan_detail_uuid', "; + $sql .= "'action', "; + $sql .= "'set', "; + $sql .= "'domain_name=".$_SESSION['domain_name']."', "; + $sql .= "'50' "; + $sql .= ")"; + $db->exec(check_sql($sql)); + unset($sql); + } + + //set call_direction + if (count($_SESSION["domains"]) > 1) { + $dialplan_detail_uuid = uuid(); + $sql = "insert into v_dialplan_details "; + $sql .= "("; + $sql .= "domain_uuid, "; + $sql .= "dialplan_uuid, "; + $sql .= "dialplan_detail_uuid, "; + $sql .= "dialplan_detail_tag, "; + $sql .= "dialplan_detail_type, "; + $sql .= "dialplan_detail_data, "; + $sql .= "dialplan_detail_order "; + $sql .= ") "; + $sql .= "values "; + $sql .= "("; + $sql .= "'$domain_uuid', "; + $sql .= "'$dialplan_uuid', "; + $sql .= "'$dialplan_detail_uuid', "; + $sql .= "'action', "; + $sql .= "'set', "; + $sql .= "'call_direction=inbound', "; + $sql .= "'60' "; + $sql .= ")"; + $db->exec(check_sql($sql)); + unset($sql); + } + + //set limit + if (strlen($limit) > 0) { + $dialplan_detail_uuid = uuid(); + $sql = "insert into v_dialplan_details "; + $sql .= "("; + $sql .= "domain_uuid, "; + $sql .= "dialplan_uuid, "; + $sql .= "dialplan_detail_uuid, "; + $sql .= "dialplan_detail_tag, "; + $sql .= "dialplan_detail_type, "; + $sql .= "dialplan_detail_data, "; + $sql .= "dialplan_detail_order "; + $sql .= ") "; + $sql .= "values "; + $sql .= "("; + $sql .= "'$domain_uuid', "; + $sql .= "'$dialplan_uuid', "; + $sql .= "'$dialplan_detail_uuid', "; + $sql .= "'action', "; + $sql .= "'limit', "; + $sql .= "'db \${domain} inbound ".$limit." !USER_BUSY', "; + $sql .= "'70' "; + $sql .= ")"; + $db->exec(check_sql($sql)); + unset($sql); + } + + //set answer + $tmp_app = false; + if ($action_application_1 == "ivr") { $tmp_app = true; } + if ($action_application_2 == "ivr") { $tmp_app = true; } + if ($action_application_1 == "conference") { $tmp_app = true; } + if ($action_application_2 == "conference") { $tmp_app = true; } + if ($tmp_app) { + $dialplan_detail_uuid = uuid(); + $sql = "insert into v_dialplan_details "; + $sql .= "("; + $sql .= "domain_uuid, "; + $sql .= "dialplan_uuid, "; + $sql .= "dialplan_detail_uuid, "; + $sql .= "dialplan_detail_tag, "; + $sql .= "dialplan_detail_type, "; + $sql .= "dialplan_detail_data, "; + $sql .= "dialplan_detail_order "; + $sql .= ") "; + $sql .= "values "; + $sql .= "("; + $sql .= "'$domain_uuid', "; + $sql .= "'$dialplan_uuid', "; + $sql .= "'$dialplan_detail_uuid', "; + $sql .= "'action', "; + $sql .= "'answer', "; + $sql .= "'', "; + $sql .= "'80' "; + $sql .= ")"; + $db->exec(check_sql($sql)); + unset($sql); + } + unset($tmp_app); + + //add action 1 + $dialplan_detail_uuid = uuid(); + $sql = "insert into v_dialplan_details "; + $sql .= "("; + $sql .= "domain_uuid, "; + $sql .= "dialplan_uuid, "; + $sql .= "dialplan_detail_uuid, "; + $sql .= "dialplan_detail_tag, "; + $sql .= "dialplan_detail_type, "; + $sql .= "dialplan_detail_data, "; + $sql .= "dialplan_detail_order "; + $sql .= ") "; + $sql .= "values "; + $sql .= "("; + $sql .= "'$domain_uuid', "; + $sql .= "'$dialplan_uuid', "; + $sql .= "'$dialplan_detail_uuid', "; + $sql .= "'action', "; + $sql .= "'$action_application_1', "; + $sql .= "'$action_data_1', "; + $sql .= "'90' "; + $sql .= ")"; + $db->exec(check_sql($sql)); + unset($sql); + + //add action 2 + if (strlen($action_application_2) > 0) { + $dialplan_detail_uuid = uuid(); + $sql = "insert into v_dialplan_details "; + $sql .= "("; + $sql .= "domain_uuid, "; + $sql .= "dialplan_uuid, "; + $sql .= "dialplan_detail_uuid, "; + $sql .= "dialplan_detail_tag, "; + $sql .= "dialplan_detail_type, "; + $sql .= "dialplan_detail_data, "; + $sql .= "dialplan_detail_order "; + $sql .= ") "; + $sql .= "values "; + $sql .= "("; + $sql .= "'$domain_uuid', "; + $sql .= "'$dialplan_uuid', "; + $sql .= "'$dialplan_detail_uuid', "; + $sql .= "'action', "; + $sql .= "'$action_application_2', "; + $sql .= "'$action_data_2', "; + $sql .= "'100' "; + $sql .= ")"; + $db->exec(check_sql($sql)); + unset($sql); + } + + //commit the atomic transaction + $count = $db->exec("COMMIT;"); //returns affected rows + + //synchronize the xml config + save_dialplan_xml(); + + //redirect the user + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Update Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; +} //end if (count($_POST)>0 && strlen($_POST["persistformvar"]) == 0) + +?> + + + +"; + echo "\n"; + + echo "\n"; + echo " \n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + } + else { + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + } + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + + if (permission_exists("inbound_route_edit") && $action=="advanced") { + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + } + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo " \n"; + echo ""; + + echo "
\n"; + echo "
"; + + echo "
\n"; + echo "
\n"; + + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "
Inbound Call Routing\n"; + echo " \n"; + echo " \n"; + if (permission_exists("inbound_route_edit") && $action == "advanced") { + echo " \n"; + } + else { + echo " \n"; + } + echo " \n"; + echo "
\n"; + echo " \n"; + echo " The public dialplan is used to route incoming calls to destinations based on one or more conditions and context. It can send incoming calls to an auto attendant, huntgroup, extension, external number, or a script.\n"; + echo " \n"; + echo "
\n"; + echo " \n"; + echo "
"; + + echo "
\n"; + echo "
\n"; + + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + if (permission_exists("inbound_route_edit") && $action == "advanced") { + echo "\n"; + echo "\n"; + echo "\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "
\n"; + echo " Name:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Please enter an inbound route name.
\n"; + echo "
\n"; + echo " Condition 1:\n"; + echo "\n"; + ?> + + \n"; + echo "
Field:\n"; + + echo " \n"; + echo " \n"; + echo "
\n"; + echo "
  Expression:\n"; + echo " \n"; + echo "
\n"; + echo "
\n"; + echo "
\n"; + echo " Condition 2:\n"; + echo "\n"; + + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "
\n"; + echo " Field:\n"; + echo " \n"; + ?> + + \n"; + echo " \n"; + if (strlen($condition_field_2) > 0) { + echo " \n"; + } + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "
\n"; + echo "
\n"; + echo "   Expression:\n"; + echo " \n"; + echo " \n"; + echo "
\n"; + echo "
\n"; + echo "
\n"; + echo " Destination Number:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Please enter the destination number. In North America this is usually a 10 or 11 digit number.\n"; + echo "
\n"; + if (permission_exists("inbound_route_edit") && $action=="advanced") { + echo " Action 1:\n"; + } + else { + echo " Action:\n"; + } + echo "\n"; + + //switch_select_destination(select_type, select_label, select_name, select_value, select_style, action); + switch_select_destination("dialplan", "", "action_1", $action_1, "width: 60%;", ""); + + echo "
\n"; + echo " Action 2:\n"; + echo "\n"; + + //switch_select_destination(select_type, select_label, select_name, select_value, select_style, action); + switch_select_destination("dialplan", "", "action_2", $action_2, "width: 60%;", ""); + + echo "
\n"; + echo " Limit:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "\n"; + echo "
\n"; + echo " Order:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "\n"; + echo "
\n"; + echo " Enabled:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "\n"; + echo "
\n"; + echo " Description:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "\n"; + echo "
\n"; + if ($action == "update") { + echo " \n"; + } + echo " \n"; + echo "
"; + echo ""; + echo ""; + + echo "
"; + echo "
"; + + echo "

"; + +//include the footer + require_once "includes/footer.php"; +?> \ No newline at end of file diff --git a/app/dialplan_inbound/root.php b/app/dialplan_inbound/root.php new file mode 100644 index 0000000000..7b882438ea --- /dev/null +++ b/app/dialplan_inbound/root.php @@ -0,0 +1,50 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ + +// make sure the PATH_SEPARATOR is defined + if (!defined("PATH_SEPARATOR")) { + if ( strpos( $_ENV[ "OS" ], "Win" ) !== false ) { define("PATH_SEPARATOR", ";"); } else { define("PATH_SEPARATOR", ":"); } + } + +// make sure the document_root is set + $_SERVER["SCRIPT_FILENAME"] = str_replace("\\", "/", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = str_replace($_SERVER["PHP_SELF"], "", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = realpath($_SERVER["DOCUMENT_ROOT"]); + //echo "DOCUMENT_ROOT: ".$_SERVER["DOCUMENT_ROOT"]."
\n"; + //echo "PHP_SELF: ".$_SERVER["PHP_SELF"]."
\n"; + //echo "SCRIPT_FILENAME: ".$_SERVER["SCRIPT_FILENAME"]."
\n"; + +// if the project directory exists then add it to the include path otherwise add the document root to the include path + if (is_dir($_SERVER["DOCUMENT_ROOT"].'/fusionpbx')){ + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', '/fusionpbx'); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER["DOCUMENT_ROOT"].'/fusionpbx' ); + } + else { + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', ''); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER['DOCUMENT_ROOT'] ); + } + +?> \ No newline at end of file diff --git a/app/dialplan_outbound/app_config.php b/app/dialplan_outbound/app_config.php new file mode 100644 index 0000000000..ca4d7b669c --- /dev/null +++ b/app/dialplan_outbound/app_config.php @@ -0,0 +1,40 @@ + \ No newline at end of file diff --git a/app/dialplan_outbound/app_defaults.php b/app/dialplan_outbound/app_defaults.php new file mode 100644 index 0000000000..af8bd44d63 --- /dev/null +++ b/app/dialplan_outbound/app_defaults.php @@ -0,0 +1,39 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ + +//make sure that enum uses sofia internal in the enum.conf.xml file + $file_contents = file_get_contents($switch_conf_dir."/autoload_configs/enum.conf.xml"); + $file_contents_new = str_replace("service=\"E2U+SIP\" regex=\"sip:(.*)\" replace=\"sofia/\${use_profile}/\$1", "service=\"E2U+SIP\" regex=\"sip:(.*)\" replace=\"sofia/internal/\$1", $file_contents); + if ($file_contents != $file_contents_new) { + $fout = fopen($switch_conf_dir."/autoload_configs/enum.conf.xml","w"); + fwrite($fout, $file_contents_new); + fclose($fout); + if ($display_type == "text") { + echo " enum.conf.xml: updated\n"; + } + } + +?> \ No newline at end of file diff --git a/app/dialplan_outbound/dialplan_outbound_add.php b/app/dialplan_outbound/dialplan_outbound_add.php new file mode 100644 index 0000000000..0ba1b7722c --- /dev/null +++ b/app/dialplan_outbound/dialplan_outbound_add.php @@ -0,0 +1,987 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('outbound_route_add')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +//show the header + require_once "includes/header.php"; + require_once "includes/paging.php"; + +//get the http post values and set theme as php variables + if (count($_POST)>0) { + $dialplan_name = check_str($_POST["dialplan_name"]); + $dialplan_order = check_str($_POST["dialplan_order"]); + $dialplan_expression = check_str($_POST["dialplan_expression"]); + $prefix_number = check_str($_POST["prefix_number"]); + $condition_field_1 = check_str($_POST["condition_field_1"]); + $condition_expression_1 = check_str($_POST["condition_expression_1"]); + $condition_field_2 = check_str($_POST["condition_field_2"]); + $condition_expression_2 = check_str($_POST["condition_expression_2"]); + $gateway = check_str($_POST["gateway"]); + $limit = check_str($_POST["limit"]); + + //set the default type + $gateway_type = 'gateway'; + $gateway_2_type = 'gateway'; + $gateway_3_type = 'gateway'; + + //set the gateway type to enum + if (strtolower(substr($gateway, 0, 7)) == "enum") { + $gateway_type = 'enum'; + } + //set the gateway type to freetdm + if (strtolower(substr($gateway, 0, 7)) == "freetdm") { + $gateway_type = 'freetdm'; + } + //set the gateway type to dingaling + if (strtolower(substr($gateway, 0, 4)) == "xmpp") { + $gateway_type = 'xmpp'; + } + //set the gateway_uuid and gateway_name + if ($gateway_type == "gateway") { + $gateway_array = explode(":",$gateway); + $gateway_uuid = $gateway_array[0]; + $gateway_name = $gateway_array[1]; + } + else { + $gateway_name = ''; + $gateway_uuid = ''; + } + + //set the gateway_2 variable + $gateway_2 = check_str($_POST["gateway_2"]); + //set the gateway type to enum + if (strtolower(substr($gateway_2, 0, 4)) == "enum") { + $gateway_2_type = 'enum'; + } + //set the gateway type to freetdm + if (strtolower(substr($gateway_2, 0, 7)) == "freetdm") { + $gateway_2_type = 'freetdm'; + } + //set the gateway type to dingaling + if (strtolower(substr($gateway_2, 0, 4)) == "xmpp") { + $gateway_2_type = 'xmpp'; + } + //set the gateway_2_id and gateway_2_name + if ($gateway_2_type == "gateway" && strlen($_POST["gateway_2"]) > 0) { + $gateway_2_array = explode(":",$gateway_2); + $gateway_2_id = $gateway_2_array[0]; + $gateway_2_name = $gateway_2_array[1]; + } + else { + $gateway_2_id = ''; + $gateway_2_name = ''; + } + + //set the gateway_3 variable + $gateway_3 = check_str($_POST["gateway_3"]); + //set the gateway type to enum + if (strtolower(substr($gateway_3, 0, 4)) == "enum") { + $gateway_3_type = 'enum'; + } + //set the gateway type to freetdm + if (strtolower(substr($gateway_3, 0, 7)) == "freetdm") { + $gateway_3_type = 'freetdm'; + } + //set the gateway type to dingaling + if (strtolower(substr($gateway_3, 0, 4)) == "xmpp") { + $gateway_3_type = 'xmpp'; + } + //set the gateway_3_id and gateway_3_name + if ($gateway_3_type == "gateway" && strlen($_POST["gateway_3"]) > 0) { + $gateway_3_array = explode(":",$gateway_3); + $gateway_3_id = $gateway_3_array[0]; + $gateway_3_name = $gateway_3_array[1]; + } + else { + $gateway_3_id = ''; + $gateway_3_name = ''; + } + + if (permission_exists('outbound_route_any_gateway')) { + //get the domain_uuid for gateway + $sql = ""; + $sql .= "select * from v_gateways "; + $sql .= "where gateway_uuid = '$gateway_uuid' "; + $sql .= "and gateway = '$gateway_name' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach ($result as &$row) { + $gateway_domain_uuid = $row["domain_uuid"]; + break; + } + unset ($prep_statement); + //get the domain_uuid for gateway_2 + $sql = ""; + $sql .= "select * from v_gateways "; + $sql .= "where gateway_uuid = '$gateway_2_id' "; + $sql .= "and gateway = '$gateway_2_name' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach ($result as &$row) { + $gateway_2_domain_uuid = $row["domain_uuid"]; + break; + } + unset ($prep_statement); + //get the domain_uuid for gateway_3 + $sql = ""; + $sql .= "select * from v_gateways "; + $sql .= "where gateway_uuid = '$gateway_3_id' "; + $sql .= "and gateway = '$gateway_3_name' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach ($result as &$row) { + $gateway_3_domain_uuid = $row["domain_uuid"]; + break; + } + unset ($prep_statement); + } + + $dialplan_enabled = check_str($_POST["dialplan_enabled"]); + $dialplan_description = check_str($_POST["dialplan_description"]); + if (strlen($dialplan_enabled) == 0) { $dialplan_enabled = "true"; } //set default to enabled + } + +//process the http form values + if (count($_POST)>0 && strlen($_POST["persistformvar"]) == 0) { + //check for all required data + if (strlen($gateway) == 0) { $msg .= "Please provide: Gateway Name
\n"; } + //if (strlen($gateway_2) == 0) { $msg .= "Please provide: Alternat 1
\n"; } + //if (strlen($gateway_3) == 0) { $msg .= "Please provide: Alternat 2
\n"; } + if (strlen($dialplan_expression) == 0) { $msg .= "Please provide: Dialplan Expression
\n"; } + //if (strlen($dialplan_name) == 0) { $msg .= "Please provide: Extension Name
\n"; } + //if (strlen($condition_field_1) == 0) { $msg .= "Please provide: Condition Field
\n"; } + //if (strlen($condition_expression_1) == 0) { $msg .= "Please provide: Condition Expression
\n"; } + //if (strlen($limit) == 0) { $msg .= "Please provide: Limit
\n"; } + //if (strlen($dialplan_enabled) == 0) { $msg .= "Please provide: Enabled True or False
\n"; } + //if (strlen($description) == 0) { $msg .= "Please provide: Description
\n"; } + if (strlen($msg) > 0 && strlen($_POST["persistformvar"]) == 0) { + require_once "includes/header.php"; + require_once "includes/persistformvar.php"; + echo "
\n"; + echo "
\n"; + echo $msg."
"; + echo "
\n"; + persistformvar($_POST); + echo "
\n"; + require_once "includes/footer.php"; + return; + } + + if (strlen(trim($_POST['dialplan_expression']))> 0) { + + $tmp_array = explode("\n", $_POST['dialplan_expression']); + + foreach($tmp_array as $dialplan_expression) { + $dialplan_expression = trim($dialplan_expression); + if (strlen($dialplan_expression)>0) { + if (count($_SESSION["domains"]) > 1) { + if (permission_exists('outbound_route_any_gateway')) { + $tmp_gateway_name = $_SESSION['domains'][$gateway_domain_uuid]['domain_name'] .'-'.$gateway_name; + } + else { + $tmp_gateway_name = $_SESSION['domains'][$_SESSION['domain_uuid']]['domain_name'] .'-'.$gateway_name; + } + if (strlen($gateway_2_name) > 0) { + if (permission_exists('outbound_route_any_gateway')) { + $tmp_gateway_2_name = $_SESSION['domains'][$gateway_2_domain_uuid]['domain_name'] .'-'.$gateway_2_name; + } + else { + $tmp_gateway_2_name = $_SESSION['domains'][$_SESSION['domain_uuid']]['domain_name'] .'-'.$gateway_2_name; + } + } + if (strlen($gateway_3_name) > 0) { + if (permission_exists('outbound_route_any_gateway')) { + $tmp_gateway_3_name = $_SESSION['domains'][$gateway_3_domain_uuid]['domain_name'] .'-'.$gateway_3_name; + } + else { + $tmp_gateway_3_name = $_SESSION['domains'][$_SESSION['domain_uuid']]['domain_name'] .'-'.$gateway_3_name; + } + } + } + else { + $tmp_gateway_name = $gateway_name; + if (strlen($gateway_2_name) > 0) { + $tmp_gateway_2_name = $gateway_2_name; + } + if (strlen($gateway_3_name) > 0) { + $tmp_gateway_3_name = $gateway_3_name; + } + } + switch ($dialplan_expression) { + case "^(\d{7})$": + $label = "7 digits"; + $abbrv = "7d"; + break; + case "^(\d{8})$": + $label = "8 digits"; + $abbrv = "8d"; + break; + case "^(\d{9})$": + $label = "9 digits"; + $abbrv = "9d"; + break; + case "^(\d{10})$": + $label = "10 digits"; + $abbrv = "10d"; + break; + case "^\+?(\d{11})$": + $label = "11 digits"; + $abbrv = "11d"; + break; + case "^(\d{12})$": + $label = "12 digits"; + $abbrv = "12d"; + break; + case "^(\d{13})$": + $label = "13 digits"; + $abbrv = "13d"; + break; + case "^(\d{14})$": + $label = "14 digits"; + $abbrv = "14d"; + break; + case "^(\d{12,15})$": + $label = "International"; + $abbrv = "Intl"; + break; + case "^(311)$": + $label = "311"; + $abbrv = "311"; + break; + case "^(411)$": + $label = "411"; + $abbrv = "411"; + break; + case "^(911)$": + $label = "911"; + $abbrv = "911"; + break; + case "^9(\d{3})$": + $label = "dial 9, 3 digits"; + $abbrv = "9.3d"; + break; + case "^9(\d{4})$": + $label = "dial 9, 4 digits"; + $abbrv = "9.4d"; + break; + case "^9(\d{7})$": + $label = "dial 9, 7 digits"; + $abbrv = "9.7d"; + break; + case "^9(\d{10})$": + $label = "dial 9, 10 digits"; + $abbrv = "9.10d"; + break; + case "^9(\d{11})$": + $label = "dial 9, 11 digits"; + $abbrv = "9.11d"; + break; + case "^9(\d{12})$": + $label = "dial 9, 12 digits"; + $abbrv = "9.Intl"; + break; + case "^9(\d{13})$": + $label = "dial 9, 13 digits"; + $abbrv = "9.13d"; + break; + case "^9(\d{14})$": + $label = "dial 9, 14 digits"; + break; + case "^9(\d{12,15})$": + $label = "dial 9, International"; + $abbrv = "9.Intl"; + break; + case "^1?(8(00|55|66|77|88)[2-9]\d{6})$": + $label = "toll free"; + $abbrv = "tollfree"; + break; + default: + $label = $dialplan_expression; + $abbrv = filename_safe($dialplan_expression); + } + + if ($gateway_type == "gateway") { + $dialplan_name = $gateway_name.".".$abbrv; + $action_data = "sofia/gateway/".$tmp_gateway_name."/".$prefix_number."\$1"; + } + if (strlen($gateway_2_name) > 0 && $gateway_2_type == "gateway") { + $extension_2_name = $gateway_2_name.".".$abbrv; + $bridge_2_data .= "sofia/gateway/".$tmp_gateway_2_name."/".$prefix_number."\$1"; + } + if (strlen($gateway_3_name) > 0 && $gateway_3_type == "gateway") { + $extension_3_name = $gateway_3_name.".".$abbrv; + $bridge_3_data .= "sofia/gateway/".$tmp_gateway_3_name."/".$prefix_number."\$1"; + } + if ($gateway_type == "freetdm") { + $dialplan_name = "freetdm.".$abbrv; + $action_data = $gateway."/1/a/".$prefix_number."\$1"; + } + if ($gateway_2_type == "freetdm") { + $extension_2_name = "freetdm.".$abbrv; + $bridge_2_data .= $gateway_2."/1/a/".$prefix_number."\$1"; + } + if ($gateway_3_type == "freetdm") { + $extension_3_name = "freetdm.".$abbrv; + $bridge_3_data .= $gateway_3."/1/a/".$prefix_number."\$1"; + } + if ($gateway_type == "xmpp") { + $dialplan_name = "xmpp.".$abbrv; + $action_data = "dingaling/gtalk/+".$prefix_number."\$1@voice.google.com"; + } + if ($gateway_2_type == "xmpp") { + $extension_2_name = "xmpp.".$abbrv; + $bridge_2_data .= "dingaling/gtalk/+".$prefix_number."\$1@voice.google.com"; + } + if ($gateway_3_type == "xmpp") { + $extension_3_name = "xmpp.".$abbrv; + $bridge_3_data .= "dingaling/gtalk/+".$prefix_number."\$1@voice.google.com"; + } + if ($gateway_type == "enum") { + if (strlen($bridge_2_data) == 0) { + $dialplan_name = "enum.".$abbrv; + } + else { + $dialplan_name = $extension_2_name; + } + $action_data = "\${enum_auto_route}"; + } + if ($gateway_2_type == "enum") { + $bridge_2_data .= "\${enum_auto_route}"; + } + if ($gateway_3_type == "enum") { + $bridge_3_data .= "\${enum_auto_route}"; + } + if (strlen($dialplan_order) == 0) { + $dialplan_order ='333'; + } + $dialplan_context = $_SESSION['context']; + $dialplan_continue = 'false'; + $app_uuid = '8c914ec3-9fc0-8ab5-4cda-6c9288bdc9a3'; + + //add the main dialplan include entry + $dialplan_uuid = uuid(); + $sql = "insert into v_dialplans "; + $sql .= "("; + $sql .= "domain_uuid, "; + $sql .= "dialplan_uuid, "; + $sql .= "app_uuid, "; + $sql .= "dialplan_name, "; + $sql .= "dialplan_order, "; + $sql .= "dialplan_continue, "; + $sql .= "dialplan_context, "; + $sql .= "dialplan_enabled, "; + $sql .= "dialplan_description "; + $sql .= ") "; + $sql .= "values "; + $sql .= "("; + $sql .= "'".$_SESSION['domain_uuid']."', "; + $sql .= "'$dialplan_uuid', "; + $sql .= "'$app_uuid', "; + $sql .= "'$dialplan_name', "; + $sql .= "'$dialplan_order', "; + $sql .= "'$dialplan_continue', "; + $sql .= "'$dialplan_context', "; + $sql .= "'$dialplan_enabled', "; + $sql .= "'$dialplan_description' "; + $sql .= ")"; + if ($v_debug) { + echo $sql."
"; + } + $db->exec(check_sql($sql)); + unset($sql); + + $dialplan_detail_tag = 'condition'; //condition, action, antiaction + $dialplan_detail_type = 'destination_number'; + $dialplan_detail_data = $dialplan_expression; + $dialplan_detail_order = '005'; + $dialplan_detail_group = ''; + dialplan_detail_add($_SESSION['domain_uuid'], $dialplan_uuid, $dialplan_detail_tag, $dialplan_detail_order, $dialplan_detail_group, $dialplan_detail_type, $dialplan_detail_data); + + $dialplan_detail_tag = 'action'; //condition, action, antiaction + $dialplan_detail_type = 'set'; + $dialplan_detail_data = 'sip_h_X-accountcode=${accountcode}'; + $dialplan_detail_order = '010'; + $dialplan_detail_group = ''; + dialplan_detail_add($_SESSION['domain_uuid'], $dialplan_uuid, $dialplan_detail_tag, $dialplan_detail_order, $dialplan_detail_group, $dialplan_detail_type, $dialplan_detail_data); + + $dialplan_detail_tag = 'action'; //condition, action, antiaction + $dialplan_detail_type = 'set'; + $dialplan_detail_data = 'call_direction=outbound'; + $dialplan_detail_order = '015'; + $dialplan_detail_group = ''; + dialplan_detail_add($_SESSION['domain_uuid'], $dialplan_uuid, $dialplan_detail_tag, $dialplan_detail_order, $dialplan_detail_group, $dialplan_detail_type, $dialplan_detail_data); + + $dialplan_detail_tag = 'action'; //condition, action, antiaction + $dialplan_detail_type = 'set'; + $dialplan_detail_data = 'hangup_after_bridge=true'; + $dialplan_detail_order = '020'; + $dialplan_detail_group = ''; + dialplan_detail_add($_SESSION['domain_uuid'], $dialplan_uuid, $dialplan_detail_tag, $dialplan_detail_order, $dialplan_detail_group, $dialplan_detail_type, $dialplan_detail_data); + + $dialplan_detail_tag = 'action'; //condition, action, antiaction + $dialplan_detail_type = 'set'; + $dialplan_detail_data = 'effective_caller_id_name=${outbound_caller_id_name}'; + $dialplan_detail_order = '025'; + $dialplan_detail_group = ''; + dialplan_detail_add($_SESSION['domain_uuid'], $dialplan_uuid, $dialplan_detail_tag, $dialplan_detail_order, $dialplan_detail_group, $dialplan_detail_type, $dialplan_detail_data); + + $dialplan_detail_tag = 'action'; //condition, action, antiaction + $dialplan_detail_type = 'set'; + if ($dialplan_expression == '^(911)$') { + $dialplan_detail_data = 'effective_caller_id_number=${emergency_caller_id_number}'; + } + else { + $dialplan_detail_data = 'effective_caller_id_number=${outbound_caller_id_number}'; + } + $dialplan_detail_order = '030'; + $dialplan_detail_group = ''; + dialplan_detail_add($_SESSION['domain_uuid'], $dialplan_uuid, $dialplan_detail_tag, $dialplan_detail_order, $dialplan_detail_group, $dialplan_detail_type, $dialplan_detail_data); + + $dialplan_detail_tag = 'action'; //condition, action, antiaction + $dialplan_detail_type = 'set'; + $dialplan_detail_data = 'inherit_codec=true'; + $dialplan_detail_order = '035'; + $dialplan_detail_group = ''; + dialplan_detail_add($_SESSION['domain_uuid'], $dialplan_uuid, $dialplan_detail_tag, $dialplan_detail_order, $dialplan_detail_group, $dialplan_detail_type, $dialplan_detail_data); + + if (strlen($bridge_2_data) > 0) { + $dialplan_detail_tag = 'action'; //condition, action, antiaction + $dialplan_detail_type = 'set'; + $dialplan_detail_data = 'continue_on_fail=true'; + $dialplan_detail_order = '040'; + $dialplan_detail_group = ''; + dialplan_detail_add($_SESSION['domain_uuid'], $dialplan_uuid, $dialplan_detail_tag, $dialplan_detail_order, $dialplan_detail_group, $dialplan_detail_type, $dialplan_detail_data); + } + + if ($gateway_type == "enum" || $gateway_2_type == "enum") { + $dialplan_detail_tag = 'action'; //condition, action, antiaction + $dialplan_detail_type = 'enum'; + $dialplan_detail_data = $prefix_number."$1 e164.org"; + $dialplan_detail_order = '045'; + $dialplan_detail_group = ''; + dialplan_detail_add($_SESSION['domain_uuid'], $dialplan_uuid, $dialplan_detail_tag, $dialplan_detail_order, $dialplan_detail_group, $dialplan_detail_type, $dialplan_detail_data); + } + + if (strlen($limit) > 0) { + $dialplan_detail_tag = 'action'; //condition, action, antiaction + $dialplan_detail_type = 'limit'; + $dialplan_detail_data = "db \${domain} outbound ".$limit." !USER_BUSY"; + $dialplan_detail_order = '050'; + $dialplan_detail_group = ''; + dialplan_detail_add($_SESSION['domain_uuid'], $dialplan_uuid, $dialplan_detail_tag, $dialplan_detail_order, $dialplan_detail_group, $dialplan_detail_type, $dialplan_detail_data); + } + + $dialplan_detail_tag = 'action'; //condition, action, antiaction + $dialplan_detail_type = 'bridge'; + $dialplan_detail_data = $action_data; + $dialplan_detail_order = '055'; + $dialplan_detail_group = ''; + dialplan_detail_add($_SESSION['domain_uuid'], $dialplan_uuid, $dialplan_detail_tag, $dialplan_detail_order, $dialplan_detail_group, $dialplan_detail_type, $dialplan_detail_data); + + if (strlen($bridge_2_data) > 0) { + $dialplan_detail_tag = 'action'; //condition, action, antiaction + $dialplan_detail_type = 'bridge'; + $dialplan_detail_data = $bridge_2_data; + $dialplan_detail_order = '060'; + $dialplan_detail_group = ''; + dialplan_detail_add($_SESSION['domain_uuid'], $dialplan_uuid, $dialplan_detail_tag, $dialplan_detail_order, $dialplan_detail_group, $dialplan_detail_type, $dialplan_detail_data); + } + + if (strlen($bridge_3_data) > 0) { + $dialplan_detail_tag = 'action'; //condition, action, antiaction + $dialplan_detail_type = 'bridge'; + $dialplan_detail_data = $bridge_3_data; + $dialplan_detail_order = '065'; + $dialplan_detail_group = ''; + dialplan_detail_add($_SESSION['domain_uuid'], $dialplan_uuid, $dialplan_detail_tag, $dialplan_detail_order, $dialplan_detail_group, $dialplan_detail_type, $dialplan_detail_data); + } + + unset($bridge_2_data); + unset($bridge_3_data); + unset($label); + unset($abbrv); + unset($dialplan_expression); + unset($action_data); + } //if strlen + } //end for each + + //synchronize the xml config + save_dialplan_xml(); + + //changes in the dialplan may affect routes in the hunt groups + save_hunt_group_xml(); + } + + //synchronize the xml config + save_dialplan_xml(); + + //redirect the user + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Update Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + } //end if (count($_POST)>0 && strlen($_POST["persistformvar"]) == 0) +?> + + + +"; + echo "\n"; + + echo "\n"; + echo " \n"; + echo ""; + echo "
\n"; + echo "
"; + + echo "
\n"; + echo "
\n"; + + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "
Outbound Routes\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "
\n"; + echo " \n"; + echo " Outbound dialplans have one or more conditions that are matched to attributes of a call. \n"; + echo " When a call matches the conditions the call is then routed to the gateway.\n"; + echo " \n"; + echo "
"; + + echo "
\n"; + echo "
\n"; + + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + + echo "\n"; + echo " \n"; + echo " \n"; + echo ""; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo " \n"; + echo ""; + + echo "
\n"; + echo " Gateway:\n"; + echo "\n"; + + if (if_group("superadmin")) { + echo "\n"; + echo "\n"; + } + + //set the onchange + if (if_group("superadmin")) { $onchange = "onchange='changeToInput(this);'"; } else { $onchange = ''; } + + $sql = ""; + $sql .= " select * from v_gateways "; + if (permission_exists('outbound_route_any_gateway')) { + $sql .= " order by domain_uuid = '$domain_uuid' "; + } + else { + $sql .= " where domain_uuid = '$domain_uuid' "; + } + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + unset ($prep_statement, $sql); + echo "\n"; + echo "
\n"; + echo "Select the gateway to use with this outbound route.\n"; + echo "
\n"; + echo " Alternate 1:\n"; + echo "\n"; + $sql = ""; + $sql .= " select * from v_gateways "; + if (permission_exists('outbound_route_any_gateway')) { + $sql .= " order by domain_uuid = '$domain_uuid' "; + } + else { + $sql .= " where domain_uuid = '$domain_uuid' "; + } + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + unset ($prep_statement, $sql); + echo "\n"; + echo "
\n"; + echo "Select another gateway as an alternative to use if the first one fails.\n"; + echo "
\n"; + echo " Alternate 2:\n"; + echo "\n"; + $sql = ""; + $sql .= " select * from v_gateways "; + if (permission_exists('outbound_route_any_gateway')) { + $sql .= " order by domain_uuid = '$domain_uuid' "; + } + else { + $sql .= " where domain_uuid = '$domain_uuid' "; + } + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + unset ($prep_statement, $sql); + echo "\n"; + echo "
\n"; + echo "Select another gateway as an alternative to use if the second one fails.\n"; + echo "
Dialplan Expression:"; + echo " \n"; + echo "
\n"; + echo " \n"; + echo " \n"; + echo "
\n"; + echo " Shortcut to create the outbound dialplan entries for this Gateway. \n"; + echo "
\n"; + echo " Prefix:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter a prefix number to add to the beginning of the destination number.\n"; + echo "
\n"; + echo " Limit:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter limit to restrict the number of outbound calls.\n"; + echo "
\n"; + echo " Order:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Select the order number. The order number determines the order of the outbound routes when there is more than one.\n"; + echo "
\n"; + echo " Enabled:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Choose to enable or disable the outbound route.\n"; + echo "
\n"; + echo " Description:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter a description for the outbound route.\n"; + echo "
\n"; + if ($action == "update") { + echo " \n"; + } + echo " \n"; + echo "
"; + echo "
"; + echo "
"; + + echo "
"; + echo ""; + + echo "

"; + +//show the footer + require_once "includes/footer.php"; +?> \ No newline at end of file diff --git a/app/dialplan_outbound/root.php b/app/dialplan_outbound/root.php new file mode 100644 index 0000000000..7b882438ea --- /dev/null +++ b/app/dialplan_outbound/root.php @@ -0,0 +1,50 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ + +// make sure the PATH_SEPARATOR is defined + if (!defined("PATH_SEPARATOR")) { + if ( strpos( $_ENV[ "OS" ], "Win" ) !== false ) { define("PATH_SEPARATOR", ";"); } else { define("PATH_SEPARATOR", ":"); } + } + +// make sure the document_root is set + $_SERVER["SCRIPT_FILENAME"] = str_replace("\\", "/", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = str_replace($_SERVER["PHP_SELF"], "", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = realpath($_SERVER["DOCUMENT_ROOT"]); + //echo "DOCUMENT_ROOT: ".$_SERVER["DOCUMENT_ROOT"]."
\n"; + //echo "PHP_SELF: ".$_SERVER["PHP_SELF"]."
\n"; + //echo "SCRIPT_FILENAME: ".$_SERVER["SCRIPT_FILENAME"]."
\n"; + +// if the project directory exists then add it to the include path otherwise add the document root to the include path + if (is_dir($_SERVER["DOCUMENT_ROOT"].'/fusionpbx')){ + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', '/fusionpbx'); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER["DOCUMENT_ROOT"].'/fusionpbx' ); + } + else { + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', ''); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER['DOCUMENT_ROOT'] ); + } + +?> \ No newline at end of file diff --git a/app/exec/app_config.php b/app/exec/app_config.php new file mode 100644 index 0000000000..3a0e8c97e9 --- /dev/null +++ b/app/exec/app_config.php @@ -0,0 +1,29 @@ + \ No newline at end of file diff --git a/app/exec/root.php b/app/exec/root.php new file mode 100644 index 0000000000..7b882438ea --- /dev/null +++ b/app/exec/root.php @@ -0,0 +1,50 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ + +// make sure the PATH_SEPARATOR is defined + if (!defined("PATH_SEPARATOR")) { + if ( strpos( $_ENV[ "OS" ], "Win" ) !== false ) { define("PATH_SEPARATOR", ";"); } else { define("PATH_SEPARATOR", ":"); } + } + +// make sure the document_root is set + $_SERVER["SCRIPT_FILENAME"] = str_replace("\\", "/", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = str_replace($_SERVER["PHP_SELF"], "", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = realpath($_SERVER["DOCUMENT_ROOT"]); + //echo "DOCUMENT_ROOT: ".$_SERVER["DOCUMENT_ROOT"]."
\n"; + //echo "PHP_SELF: ".$_SERVER["PHP_SELF"]."
\n"; + //echo "SCRIPT_FILENAME: ".$_SERVER["SCRIPT_FILENAME"]."
\n"; + +// if the project directory exists then add it to the include path otherwise add the document root to the include path + if (is_dir($_SERVER["DOCUMENT_ROOT"].'/fusionpbx')){ + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', '/fusionpbx'); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER["DOCUMENT_ROOT"].'/fusionpbx' ); + } + else { + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', ''); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER['DOCUMENT_ROOT'] ); + } + +?> \ No newline at end of file diff --git a/app/exec/v_exec.php b/app/exec/v_exec.php new file mode 100644 index 0000000000..e67237910d --- /dev/null +++ b/app/exec/v_exec.php @@ -0,0 +1,204 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('exec_command_line') || permission_exists('exec_php_command') || permission_exists('exec_switch')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +//get the html values and set them as variables + if (count($_POST)>0) { + $shell_cmd = trim($_POST["shell_cmd"]); + $php_cmd = trim($_POST["php_cmd"]); + $switch_cmd = trim($_POST["switch_cmd"]); + } + +//show the header + require_once "includes/header.php"; + +//edit area + echo " \n"; + echo " \n"; + + echo " "; + +//show the header + echo "
"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo " \n"; + echo "\n"; + +//show the result + if (count($_POST)>0) { + echo " \n"; + echo " \n"; + echo " "; + } + +//html form + echo "\n"; + + if (permission_exists('exec_command_line')) { + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + if (if_group("superadmin")) { + if (strlen($user_context) == 0) { + if (count($_SESSION["domains"]) > 1) { + $user_context = $_SESSION['domain_name']; + } + else { + $user_context = "default"; + } + } + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + } + + //--- begin: show_advanced ----------------------- + echo "\n"; + echo "\n"; + echo "\n"; + //--- end: show_advanced ----------------------- + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo " \n"; + echo " \n"; + echo " "; + echo "
Execute Command
\n"; + echo " Provides a conventient way to execute system, PHP, and switch commands.\n"; + echo "
\n"; + echo "
\n"; + echo "
\n"; + + //shell_cmd + if (strlen($shell_cmd) > 0 && permission_exists('exec_command_line')) { + echo "$shell_cmd\n"; + echo "\n"; + echo "
";
+			echo htmlentities($shell_result);
+			echo "
\n"; + } + + //php_cmd + if (strlen($php_cmd) > 0 && permission_exists('exec_php_command')) { + //echo "\n"; + echo "
";
+			$php_result = eval($php_cmd);
+			echo htmlentities($php_result);
+			echo "
\n"; + } + + //fs cmd + if (strlen($switch_cmd) > 0 && permission_exists('exec_switch')) { + echo "$switch_cmd\n"; + echo "
";
+			$fp = event_socket_create($_SESSION['event_socket_ip_address'], $_SESSION['event_socket_port'], $_SESSION['event_socket_password']);
+			if ($fp) {
+				$switch_result = event_socket_request($fp, 'api '.$switch_cmd);
+				//$switch_result = eval($switch_cmd);
+				echo htmlentities($switch_result);
+			}
+			echo "
\n"; + } + echo "
\n"; + echo "
\n"; + echo " Shell command:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "If a MAC address is not in the select list it can be added manually.
MAC Address:Line Number\n"; + echo "
\n"; + echo "
\n"; + echo " Voicemail Enabled:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enable/disable voicemail for this extension.\n"; + echo "
\n"; + echo " Voicemail Mail To:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Optional: Enter the email address to send voicemail to.\n"; + echo "
\n"; + echo " Voicemail Attach File:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Choose whether to attach the file to the email.\n"; + echo "
\n"; + echo " VM Keep Local After Email:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Keep local file after sending the email. \n"; + echo "
\n"; + echo " Toll Allow:\n"; + echo "\n"; + if (permission_exists('extension_toll')) { + echo " \n"; + echo "
\n"; + echo "Enter the toll allow value here. example: domestic,international,local\n"; + } + echo "
\n"; + echo " Call Group:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the user call group here. Groups available by default: sales, support, billing\n"; + echo "
\n"; + echo " User Context:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the user context here.\n"; + echo "
\n"; + + echo "
\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "
Show Advanced\n"; + echo " \n"; + echo "
\n"; + echo "
\n"; + + echo "
\n"; + echo " \n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "
\n"; + echo " Hold Music:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the hold music here.\n"; + echo "
\n"; + echo " Auth ACL:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the Auth ACL here.\n"; + echo "
\n"; + echo " CIDR:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the cidr here.\n"; + echo "
\n"; + echo " SIP Force Contact:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Choose whether to rewrite the contact port, or rewrite both the contact IP and port.\n"; + echo "
\n"; + echo " SIP Force Expires:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the sip force expire seconds.\n"; + echo "
\n"; + echo " Nibblebill Account:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the account number for nibblebill to use.\n"; + echo "
\n"; + echo " MWI Account:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "MWI Account with user@domain of the voicemail to monitor.\n"; + echo "
\n"; + echo " SIP Bypass Media:\n"; echo "\n"; + echo " \n"; + echo "
\n"; + echo "Choose whether to send the media stream point to point or in transparent proxy mode.\n"; + echo "
\n"; + echo "
"; + + echo "
\n"; + echo " Enabled:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "\n"; + echo "
\n"; + echo " Description:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "\n"; + echo "
\n"; + if ($action == "update") { + echo " \n"; + } + echo " \n"; + echo "
"; + echo ""; + + echo " "; + echo " "; + echo ""; + echo "
"; + +require_once "includes/footer.php"; +?> \ No newline at end of file diff --git a/app/fax/app_config.php b/app/fax/app_config.php new file mode 100644 index 0000000000..4e282a4b13 --- /dev/null +++ b/app/fax/app_config.php @@ -0,0 +1,190 @@ + \ No newline at end of file diff --git a/app/fax/root.php b/app/fax/root.php new file mode 100644 index 0000000000..7b882438ea --- /dev/null +++ b/app/fax/root.php @@ -0,0 +1,50 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ + +// make sure the PATH_SEPARATOR is defined + if (!defined("PATH_SEPARATOR")) { + if ( strpos( $_ENV[ "OS" ], "Win" ) !== false ) { define("PATH_SEPARATOR", ";"); } else { define("PATH_SEPARATOR", ":"); } + } + +// make sure the document_root is set + $_SERVER["SCRIPT_FILENAME"] = str_replace("\\", "/", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = str_replace($_SERVER["PHP_SELF"], "", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = realpath($_SERVER["DOCUMENT_ROOT"]); + //echo "DOCUMENT_ROOT: ".$_SERVER["DOCUMENT_ROOT"]."
\n"; + //echo "PHP_SELF: ".$_SERVER["PHP_SELF"]."
\n"; + //echo "SCRIPT_FILENAME: ".$_SERVER["SCRIPT_FILENAME"]."
\n"; + +// if the project directory exists then add it to the include path otherwise add the document root to the include path + if (is_dir($_SERVER["DOCUMENT_ROOT"].'/fusionpbx')){ + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', '/fusionpbx'); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER["DOCUMENT_ROOT"].'/fusionpbx' ); + } + else { + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', ''); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER['DOCUMENT_ROOT'] ); + } + +?> \ No newline at end of file diff --git a/app/fax/v_fax.php b/app/fax/v_fax.php new file mode 100644 index 0000000000..bb0aebdae9 --- /dev/null +++ b/app/fax/v_fax.php @@ -0,0 +1,180 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('fax_extension_view')) { + //access granted +} +else { + echo "access denied"; + exit; +} +require_once "includes/header.php"; +require_once "includes/paging.php"; + +//get the http get values and set them as php variables + $order_by = check_str($_GET["order_by"]); + $order = check_str($_GET["order"]); + +//show the content + echo "
"; + echo "\n"; + echo "\n"; + echo " "; + echo ""; + echo "
\n"; + echo "
"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "
\n"; + echo "

FAX
\n"; + echo " To receive a FAX setup a fax extension and then direct the incoming to it.\n"; + echo "

\n"; + echo "
\n"; + echo "
"; + + if (if_group("superadmin") || if_group("admin")) { + //show all fax extensions + $sql = "select count(*) as num_rows from v_fax "; + $sql .= "where domain_uuid = '".$_SESSION['domain_uuid']."' "; + } + else { + //show only assigned fax extensions + $sql = "select count(*) as num_rows from v_fax as f, v_fax_users as u "; + $sql .= "where f.fax_uuid = u.fax_uuid "; + $sql .= "and f.domain_uuid = '".$_SESSION['domain_uuid']."' "; + $sql .= "and u.user_uuid = '".$_SESSION['user_uuid']."' "; + } + if ($prep_statement) { + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $row = $prep_statement->fetch(PDO::FETCH_ASSOC); + if ($row['num_rows'] > 0) { + $num_rows = $row['num_rows']; + } + else { + $num_rows = '0'; + } + } + unset($prep_statement, $result); + + $rows_per_page = 150; + $param = ""; + $page = check_str($_GET['page']); + if (strlen($page) == 0) { $page = 0; $_GET['page'] = 0; } + list($paging_controls, $rows_per_page, $var_3) = paging($num_rows, $param, $rows_per_page); + $offset = $rows_per_page * $page; + + if (if_group("superadmin") || if_group("admin")) { + //show all fax extensions + $sql = "select * from v_fax "; + $sql .= "where domain_uuid = '$domain_uuid' "; + } + else { + //show only assigned fax extensions + $sql = "select * from v_fax as f, v_fax_users as u "; + $sql .= "where f.fax_uuid = u.fax_uuid "; + $sql .= "and f.domain_uuid = '".$_SESSION['domain_uuid']."' "; + $sql .= "and u.user_uuid = '".$_SESSION['user_uuid']."' "; + } + if (strlen($order_by)> 0) { $sql .= "order by $order_by $order "; } + $sql .= " limit $rows_per_page offset $offset "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_ASSOC); + $result_count = count($result); + unset ($prep_statement, $sql); + + $c = 0; + $row_style["0"] = "row_style0"; + $row_style["1"] = "row_style1"; + + echo "
\n"; + echo "\n"; + echo "\n"; + echo th_order_by('fax_extension', 'Extension', $order_by, $order); + echo th_order_by('fax_name', 'Name', $order_by, $order); + echo th_order_by('fax_email', 'Email', $order_by, $order); + echo th_order_by('fax_description', 'Description', $order_by, $order); + echo "\n"; + echo "\n"; + + if ($result_count > 0) { + foreach($result as $row) { + echo "\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "\n"; + if ($c==0) { $c=1; } else { $c=0; } + } //end foreach + unset($sql, $result, $row_count); + } //end if results + + echo "\n"; + echo "\n"; + echo "\n"; + + echo "
\n"; + if (permission_exists('fax_extension_add')) { + echo " $v_link_label_add\n"; + } + echo "
".$row['fax_extension']."".$row['fax_name']."".$row['fax_email']." ".$row['fax_description']." \n"; + if (permission_exists('fax_extension_edit')) { + echo " $v_link_label_edit\n"; + } + if (permission_exists('fax_extension_delete')) { + echo " $v_link_label_delete\n"; + } + echo "
\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "
 $paging_controls\n"; + if (permission_exists('fax_extension_add')) { + echo " $v_link_label_add\n"; + } + echo "
\n"; + echo "
"; + echo "
"; + echo "

"; + echo "

"; + + echo "
"; + echo "
"; + echo "

"; + +//show the footer + require_once "includes/footer.php"; +?> diff --git a/app/fax/v_fax_delete.php b/app/fax/v_fax_delete.php new file mode 100644 index 0000000000..1cf8a126cc --- /dev/null +++ b/app/fax/v_fax_delete.php @@ -0,0 +1,97 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('fax_extension_delete')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +//get the http get value and set it as a php variable + if (count($_GET)>0) { + $fax_uuid = check_str($_GET["id"]); + } + +//delete the fax extension + if (strlen($fax_uuid)>0) { + + //get the dialplan uuid + $sql = "select * from v_fax "; + $sql .= "where domain_uuid = '".$_SESSION['domain_uuid']."' "; + $sql .= "and fax_uuid = '$fax_uuid' "; + $prep_statement = $db->prepare($sql); + $prep_statement->execute(); + while($row = $prep_statement->fetch(PDO::FETCH_ASSOC)) { + $dialplan_uuid = $row['dialplan_uuid']; + } + + //delete the fax entry + $sql = ""; + $sql .= "delete from v_fax "; + $sql .= "where domain_uuid = '".$_SESSION['domain_uuid']."' "; + $sql .= "and fax_uuid = '$fax_uuid' "; + $db->query($sql); + unset($sql); + + //delete the dialplan entry + $sql = ""; + $sql .= "delete from v_dialplans "; + $sql .= "where domain_uuid = '".$_SESSION['domain_uuid']."' "; + $sql .= "and dialplan_uuid = '$dialplan_uuid' "; + //echo $sql."
\n"; + $db->query($sql); + unset($sql); + + //delete the dialplan details + $sql = ""; + $sql .= "delete from v_dialplan_details "; + $sql .= "where domain_uuid = '".$_SESSION['domain_uuid']."' "; + $sql .= "and dialplan_uuid = '$dialplan_uuid' "; + //echo $sql."
\n"; + $db->query($sql); + unset($sql); + + //syncrhonize configuration + save_dialplan_xml(); + + //apply settings reminder + $_SESSION["reload_xml"] = true; + } + +//redirect the user + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Delete Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + +?> \ No newline at end of file diff --git a/app/fax/v_fax_edit.php b/app/fax/v_fax_edit.php new file mode 100644 index 0000000000..4b19a438df --- /dev/null +++ b/app/fax/v_fax_edit.php @@ -0,0 +1,631 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('fax_extension_add') || permission_exists('fax_extension_edit') || permission_exists('fax_extension_delete')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +//get the fax_extension and save it as a variable + if (strlen($_REQUEST["fax_extension"]) > 0) { + $fax_extension = check_str($_REQUEST["fax_extension"]); + } + +//set the fax directory + if (count($_SESSION["domains"]) > 1) { + $v_fax_dir = $_SESSION['switch']['storage']['dir'].'/fax/'.$_SESSION['domain_name']; + } + else { + $v_fax_dir = $_SESSION['switch']['storage']['dir'].'/fax'; + } + +//get the fax extension + if (strlen($fax_extension) > 0) { + //set the fax directories. example /usr/local/freeswitch/storage/fax/329/inbox + $dir_fax_inbox = $v_fax_dir.'/'.$fax_extension.'/inbox'; + $dir_fax_sent = $v_fax_dir.'/'.$fax_extension.'/sent'; + $dir_fax_temp = $v_fax_dir.'/'.$fax_extension.'/temp'; + + //make sure the directories exist + if (!is_dir($_SESSION['switch']['storage']['dir'])) { + mkdir($_SESSION['switch']['storage']['dir']); + chmod($dir_fax_sent,0774); + } + if (!is_dir($v_fax_dir.'/'.$fax_extension)) { + mkdir($v_fax_dir.'/'.$fax_extension,0774,true); + chmod($v_fax_dir.'/'.$fax_extension,0774); + } + if (!is_dir($dir_fax_inbox)) { + mkdir($dir_fax_inbox,0774,true); + chmod($dir_fax_inbox,0774); + } + if (!is_dir($dir_fax_sent)) { + mkdir($dir_fax_sent,0774,true); + chmod($dir_fax_sent,0774); + } + if (!is_dir($dir_fax_temp)) { + mkdir($dir_fax_temp,0774,true); + chmod($dir_fax_temp,0774); + } + } + +//set the action as an add or an update + if (isset($_REQUEST["id"])) { + $action = "update"; + $fax_uuid = check_str($_REQUEST["id"]); + $dialplan_uuid = check_str($_REQUEST["dialplan_uuid"]); + } + else { + $action = "add"; + } + +//get the http post values and set them as php variables + if (count($_POST)>0) { + $fax_name = check_str($_POST["fax_name"]); + $fax_email = check_str($_POST["fax_email"]); + $fax_pin_number = check_str($_POST["fax_pin_number"]); + $fax_caller_id_name = check_str($_POST["fax_caller_id_name"]); + $fax_caller_id_number = check_str($_POST["fax_caller_id_number"]); + $fax_forward_number = check_str($_POST["fax_forward_number"]); + if (strlen($fax_forward_number) > 0) { + $fax_forward_number = preg_replace("~[^0-9]~", "",$fax_forward_number); + } + $fax_description = check_str($_POST["fax_description"]); + } + +//delete the user from the v_fax_users + if ($_GET["a"] == "delete" && permission_exists("fax_extension_delete")) { + //set the variables + $user_uuid = check_str($_REQUEST["user_uuid"]); + $fax_uuid = check_str($_REQUEST["id"]); + //delete the group from the users + $sql = "delete from v_fax_users "; + $sql .= "where domain_uuid = '".$_SESSION['domain_uuid']."' "; + $sql .= "and fax_uuid = '".$fax_uuid."' "; + $sql .= "and user_uuid = '".$user_uuid."' "; + $db->exec(check_sql($sql)); + //redirect the browser + require_once "includes/header.php"; + echo "\n"; + echo "
Delete Complete
"; + require_once "includes/footer.php"; + return; + } + +//add the user to the v_fax_users + if (strlen($_REQUEST["user_uuid"]) > 0 && strlen($_REQUEST["id"]) > 0 && $_GET["a"] != "delete") { + //set the variables + $user_uuid = check_str($_REQUEST["user_uuid"]); + $fax_uuid = check_str($_REQUEST["id"]); + //assign the user to the fax extension + $sql_insert = "insert into v_fax_users "; + $sql_insert .= "("; + $sql_insert .= "fax_user_uuid, "; + $sql_insert .= "domain_uuid, "; + $sql_insert .= "fax_uuid, "; + $sql_insert .= "user_uuid "; + $sql_insert .= ")"; + $sql_insert .= "values "; + $sql_insert .= "("; + $sql_insert .= "'".uuid()."', "; + $sql_insert .= "'".$_SESSION['domain_uuid']."', "; + $sql_insert .= "'".$fax_uuid."', "; + $sql_insert .= "'".$user_uuid."' "; + $sql_insert .= ")"; + $db->exec($sql_insert); + //redirect the browser + require_once "includes/header.php"; + echo "\n"; + echo "
Add Complete
"; + require_once "includes/footer.php"; + return; + } + +//clear file status cache + clearstatcache(); + +if (count($_POST)>0 && strlen($_POST["persistformvar"]) == 0) { + + $msg = ''; + if ($action == "update" && permission_exists('fax_extension_edit')) { + $fax_uuid = check_str($_POST["fax_uuid"]); + } + + //check for all required data + if (strlen($fax_extension) == 0) { $msg .= "Please provide: Extension
\n"; } + if (strlen($fax_name) == 0) { $msg .= "Please provide: A file to Fax
\n"; } + //if (strlen($fax_email) == 0) { $msg .= "Please provide: Email
\n"; } + //if (strlen($fax_pin_number) == 0) { $msg .= "Please provide: Pin Number
\n"; } + //if (strlen($fax_caller_id_name) == 0) { $msg .= "Please provide: Caller ID Name
\n"; } + //if (strlen($fax_caller_id_number) == 0) { $msg .= "Please provide: Caller ID Number
\n"; } + //if (strlen($fax_forward_number) == 0) { $msg .= "Please provide: Forward Number
\n"; } + //if (strlen($fax_description) == 0) { $msg .= "Please provide: Description
\n"; } + if (strlen($msg) > 0 && strlen($_POST["persistformvar"]) == 0) { + require_once "includes/header.php"; + require_once "includes/persistformvar.php"; + echo "
\n"; + echo "
\n"; + echo $msg."
"; + echo "
\n"; + persistformvar($_POST); + echo "
\n"; + require_once "includes/footer.php"; + return; + } + + //set the PHP_BIN + if (file_exists(PHP_BINDIR."/php")) { define(PHP_BIN, 'php'); } + if (file_exists(PHP_BINDIR."/php.exe")) { define(PHP_BIN, 'php.exe'); } + + //add or update the database + if ($_POST["persistformvar"] != "true") { + if ($action == "add" && permission_exists('fax_extension_add')) { + //prepare the unique identifiers + $fax_uuid = uuid(); + $dialplan_uuid = uuid(); + + //add the fax extension to the database + $sql = "insert into v_fax "; + $sql .= "("; + $sql .= "domain_uuid, "; + $sql .= "fax_uuid, "; + $sql .= "dialplan_uuid, "; + $sql .= "fax_extension, "; + $sql .= "fax_name, "; + $sql .= "fax_email, "; + $sql .= "fax_pin_number, "; + $sql .= "fax_caller_id_name, "; + $sql .= "fax_caller_id_number, "; + if (strlen($fax_forward_number) > 0) { + $sql .= "fax_forward_number, "; + } + $sql .= "fax_description "; + $sql .= ")"; + $sql .= "values "; + $sql .= "("; + $sql .= "'".$_SESSION['domain_uuid']."', "; + $sql .= "'$fax_uuid', "; + $sql .= "'$dialplan_uuid', "; + $sql .= "'$fax_extension', "; + $sql .= "'$fax_name', "; + $sql .= "'$fax_email', "; + $sql .= "'$fax_pin_number', "; + $sql .= "'$fax_caller_id_name', "; + $sql .= "'$fax_caller_id_number', "; + if (strlen($fax_forward_number) > 0) { + $sql .= "'$fax_forward_number', "; + } + $sql .= "'$fax_description' "; + $sql .= ")"; + $db->exec(check_sql($sql)); + unset($sql); + + //create the dialplan entry for fax + $dialplan_name = $fax_name; + $dialplan_order ='333'; + $dialplan_context = $_SESSION['context']; + $dialplan_enabled = 'true'; + $dialplan_description = $fax_description; + $app_uuid = '24108154-4ac3-1db6-1551-4731703a4440'; + dialplan_add($_SESSION['domain_uuid'], $dialplan_uuid, $dialplan_name, $dialplan_order, $dialplan_context, $dialplan_enabled, $dialplan_description, $app_uuid); + + // + // + $dialplan_detail_tag = 'condition'; //condition, action, antiaction + $dialplan_detail_type = 'destination_number'; + $dialplan_detail_data = '^'.$fax_extension.'$'; + $dialplan_detail_order = '000'; + $dialplan_detail_group = ''; + dialplan_detail_add($_SESSION['domain_uuid'], $dialplan_uuid, $dialplan_detail_tag, $dialplan_detail_order, $dialplan_detail_group, $dialplan_detail_type, $dialplan_detail_data); + + // + $dialplan_detail_tag = 'action'; //condition, action, antiaction + $dialplan_detail_type = 'set'; + $dialplan_detail_data = "api_hangup_hook=system ".PHP_BINDIR."/".PHP_BIN." ".$_SERVER["DOCUMENT_ROOT"].PROJECT_PATH."/secure/fax_to_email.php "; + $dialplan_detail_data .= "email=".$fax_email." "; + $dialplan_detail_data .= "extension=".$fax_extension." "; + $dialplan_detail_data .= "name=\\\\\\\${last_fax} "; + $dialplan_detail_data .= "messages='result: \\\\\\\${fax_result_text} sender:\\\\\\\${fax_remote_station_id} pages:\\\\\\\${fax_document_total_pages}' "; + $dialplan_detail_data .= "domain=".$_SESSION['domain_name']." "; + $dialplan_detail_data .= "caller_id_name='\\\\\\\${caller_id_name}' "; + $dialplan_detail_data .= "caller_id_number=\\\\\\\${caller_id_number} "; + + $dialplan_detail_order = '010'; + dialplan_detail_add($_SESSION['domain_uuid'], $dialplan_uuid, $dialplan_detail_tag, $dialplan_detail_order, $dialplan_detail_group, $dialplan_detail_type, $dialplan_detail_data); + + // + $dialplan_detail_tag = 'action'; //condition, action, antiaction + $dialplan_detail_type = 'answer'; + $dialplan_detail_data = ''; + $dialplan_detail_order = '010'; + dialplan_detail_add($_SESSION['domain_uuid'], $dialplan_uuid, $dialplan_detail_tag, $dialplan_detail_order, $dialplan_detail_group, $dialplan_detail_type, $dialplan_detail_data); + + //// + $dialplan_detail_tag = 'action'; //condition, action, antiaction + $dialplan_detail_type = 'set'; + $dialplan_detail_data = 'fax_enable_t38=true'; + $dialplan_detail_order = '015'; + dialplan_detail_add($_SESSION['domain_uuid'], $dialplan_uuid, $dialplan_detail_tag, $dialplan_detail_order, $dialplan_detail_group, $dialplan_detail_type, $dialplan_detail_data); + + //// + $dialplan_detail_tag = 'action'; //condition, action, antiaction + $dialplan_detail_type = 'set'; + $dialplan_detail_data = 'fax_enable_t38_request=true'; + $dialplan_detail_order = '020'; + dialplan_detail_add($_SESSION['domain_uuid'], $dialplan_uuid, $dialplan_detail_tag, $dialplan_detail_order, $dialplan_detail_group, $dialplan_detail_type, $dialplan_detail_data); + + // + $dialplan_detail_tag = 'action'; //condition, action, antiaction + $dialplan_detail_type = 'set'; + $dialplan_detail_data = 'last_fax=${caller_id_number}-${strftime(%Y-%m-%d-%H-%M-%S)}'; + $dialplan_detail_order = '025'; + dialplan_detail_add($_SESSION['domain_uuid'], $dialplan_uuid, $dialplan_detail_tag, $dialplan_detail_order, $dialplan_detail_group, $dialplan_detail_type, $dialplan_detail_data); + + // + $dialplan_detail_tag = 'action'; //condition, action, antiaction + $dialplan_detail_type = 'playback'; + $dialplan_detail_data = 'silence_stream://2000'; + $dialplan_detail_order = '030'; + dialplan_detail_add($_SESSION['domain_uuid'], $dialplan_uuid, $dialplan_detail_tag, $dialplan_detail_order, $dialplan_detail_group, $dialplan_detail_type, $dialplan_detail_data); + + // + $dialplan_detail_tag = 'action'; //condition, action, antiaction + $dialplan_detail_type = 'rxfax'; + if (count($_SESSION["domains"]) > 1) { + $dialplan_detail_data = $_SESSION['switch']['storage']['dir'].'/fax/'.$_SESSION['domain_name'].'/'.$fax_extension.'/inbox/${last_fax}.tif'; + } + else { + $dialplan_detail_data = $_SESSION['switch']['storage']['dir'].'/fax/'.$fax_extension.'/inbox/${last_fax}.tif'; + } + $dialplan_detail_order = '035'; + dialplan_detail_add($_SESSION['domain_uuid'], $dialplan_uuid, $dialplan_detail_tag, $dialplan_detail_order, $dialplan_detail_group, $dialplan_detail_type, $dialplan_detail_data); + + // + $dialplan_detail_tag = 'action'; //condition, action, antiaction + $dialplan_detail_type = 'hangup'; + $dialplan_detail_data = ''; + $dialplan_detail_order = '040'; + dialplan_detail_add($_SESSION['domain_uuid'], $dialplan_uuid, $dialplan_detail_tag, $dialplan_detail_order, $dialplan_detail_group, $dialplan_detail_type, $dialplan_detail_data); + + //save the xml + save_dialplan_xml(); + + //apply settings reminder + $_SESSION["reload_xml"] = true; + + //redirect the browser + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Add Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + } //if ($action == "add") + + if ($action == "update" && permission_exists('fax_extension_edit')) { + //update the fax extension in the database + $sql = "update v_fax set "; + $sql .= "fax_extension = '$fax_extension', "; + $sql .= "fax_name = '$fax_name', "; + $sql .= "fax_email = '$fax_email', "; + $sql .= "fax_pin_number = '$fax_pin_number', "; + $sql .= "fax_caller_id_name = '$fax_caller_id_name', "; + $sql .= "fax_caller_id_number = '$fax_caller_id_number', "; + if (strlen($fax_forward_number) > 0) { + $sql .= "fax_forward_number = '$fax_forward_number', "; + } + else { + $sql .= "fax_forward_number = null, "; + } + $sql .= "fax_description = '$fax_description' "; + $sql .= "where domain_uuid = '".$_SESSION['domain_uuid']."' "; + $sql .= "and fax_uuid = '$fax_uuid' "; + $db->exec(check_sql($sql)); + unset($sql); + + //udpate the fax dialplan + $sql = "update v_dialplans set "; + $sql .= "dialplan_name = '$fax_name', "; + if (strlen($dialplan_order) > 0) { + $sql .= "dialplan_order = '333', "; + } + $sql .= "dialplan_context = '".$_SESSION['context']."', "; + $sql .= "dialplan_enabled = 'true', "; + $sql .= "dialplan_description = '$fax_description' "; + $sql .= "where domain_uuid = '".$_SESSION['domain_uuid']."' "; + $sql .= "and dialplan_uuid = '$dialplan_uuid' "; + $db->query($sql); + unset($sql); + + //update dialplan detail condition + $sql = ""; + $sql = "update v_dialplan_details set "; + $sql .= "dialplan_detail_data = '^".$fax_extension."$' "; + $sql .= "where domain_uuid = '".$_SESSION['domain_uuid']."' "; + $sql .= "and dialplan_detail_tag = 'condition' "; + $sql .= "and dialplan_detail_type = 'destination_number' "; + $sql .= "and dialplan_uuid = '$dialplan_uuid' "; + $db->query($sql); + unset($sql); + + //update dialplan detail action + if (count($_SESSION["domains"]) > 1) { + $dialplan_detail_data = $_SESSION['switch']['storage']['dir'].'/fax/'.$_SESSION['domain_name'].'/'.$fax_extension.'/inbox/${last_fax}.tif'; + } + else { + $dialplan_detail_data = $_SESSION['switch']['storage']['dir'].'/fax/'.$fax_extension.'/inbox/${last_fax}.tif'; + } + $sql = ""; + $sql = "update v_dialplan_details set "; + $sql .= "dialplan_detail_data = '".$dialplan_detail_data."' "; + $sql .= "where domain_uuid = '".$_SESSION['domain_uuid']."' "; + $sql .= "and dialplan_detail_tag = 'action' "; + $sql .= "and dialplan_detail_type = 'rxfax' "; + $sql .= "and dialplan_uuid = '$dialplan_uuid' "; + $db->query($sql); + + //update dialplan detail action + $dialplan_detail_tag = 'action'; //condition, action, antiaction + $dialplan_detail_type = 'set'; + $dialplan_detail_data = "api_hangup_hook=system ".PHP_BINDIR."/".PHP_BIN." ".$_SERVER["DOCUMENT_ROOT"].PROJECT_PATH."/secure/fax_to_email.php "; + $dialplan_detail_data .= "email=".$fax_email." "; + $dialplan_detail_data .= "extension=".$fax_extension." "; + $dialplan_detail_data .= "name=\\\\\\\${last_fax} "; + $dialplan_detail_data .= "messages='result: \\\\\\\${fax_result_text} sender:\\\\\\\${fax_remote_station_id} pages:\\\\\\\${fax_document_total_pages}' "; + $dialplan_detail_data .= "domain=".$_SESSION['domain_name']." "; + $dialplan_detail_data .= "caller_id_name='\\\\\\\${caller_id_name}' "; + $dialplan_detail_data .= "caller_id_number=\\\\\\\${caller_id_number} "; + $sql = "update v_dialplan_details set "; + $sql .= "dialplan_detail_data = '".check_str($dialplan_detail_data)."' "; + $sql .= "where domain_uuid = '".$_SESSION['domain_uuid']."' "; + $sql .= "and dialplan_detail_tag = 'action' "; + $sql .= "and dialplan_detail_type = 'set' "; + $sql .= "and dialplan_uuid = '$dialplan_uuid' "; + $sql .= "and dialplan_detail_data like 'api_hangup_hook=%' "; + $db->query(check_sql($sql)); + + //save the xml + save_dialplan_xml(); + + //apply settings reminder + $_SESSION["reload_xml"] = true; + + //redirect the browser + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Update Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + } //if ($action == "update") + } //if ($_POST["persistformvar"] != "true") +} //(count($_POST)>0 && strlen($_POST["persistformvar"]) == 0) + +//pre-populate the form + if (strlen($_GET['id']) > 0 && $_POST["persistformvar"] != "true") { + $fax_uuid = check_str($_GET["id"]); + $sql = ""; + $sql .= "select * from v_fax "; + $sql .= "where domain_uuid = '".$_SESSION['domain_uuid']."' "; + $sql .= "and fax_uuid = '$fax_uuid' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + if (count($result) == 0) { + echo "access denied"; + exit; + } + foreach ($result as &$row) { + $dialplan_uuid = $row["dialplan_uuid"]; + $fax_extension = $row["fax_extension"]; + $fax_name = $row["fax_name"]; + $fax_email = $row["fax_email"]; + $fax_pin_number = $row["fax_pin_number"]; + $fax_caller_id_name = $row["fax_caller_id_name"]; + $fax_caller_id_number = $row["fax_caller_id_number"]; + $fax_forward_number = $row["fax_forward_number"]; + $fax_description = $row["fax_description"]; + } + unset ($prep_statement); + } + +//show the header + require_once "includes/header.php"; + +//fax extension form + echo "
"; + echo "
\n"; + echo "\n"; + echo "\n"; + if ($action == "add") { + echo "\n"; + } + if ($action == "update") { + echo "\n"; + } + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + if (if_group("admin") || if_group("superadmin")) { + if ($action == "update") { + echo " "; + echo " "; + echo " "; + echo " "; + } + } + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo " \n"; + echo " \n"; + echo " "; + echo "
Fax AddFax Edit
\n"; + echo " Name:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the name here.\n"; + echo "
\n"; + echo " Extension:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the fax extension here.\n"; + echo "
\n"; + echo " Email:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo " Enter the email address to send the FAX to.\n"; + echo "
\n"; + echo " PIN Number:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the PIN number here.\n"; + echo "
\n"; + echo " Caller ID Name:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the Caller ID name here.\n"; + echo "
\n"; + echo " Caller ID Number:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the Caller ID number here.\n"; + echo "
\n"; + echo " Forward Number:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the forward number here. Used to forward the fax to a registered extension or external number.\n"; + echo "
User List:"; + + echo " \n"; + $sql = "SELECT * FROM v_fax_users as e, v_users as u "; + $sql .= "where e.user_uuid = u.user_uuid "; + $sql .= "and e.domain_uuid = '".$_SESSION['domain_uuid']."' "; + $sql .= "and e.fax_uuid = '".$fax_uuid."' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_ASSOC); + $result_count = count($result); + foreach($result as $field) { + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + } + echo "
".$field['username']."\n"; + echo " $v_link_label_delete\n"; + echo "
\n"; + + echo "
\n"; + $sql = "SELECT * FROM v_users "; + $sql .= "where domain_uuid = '".$_SESSION['domain_uuid']."' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + echo " "; + echo " \n"; + unset($sql, $result); + echo "
\n"; + echo " Assign the users that are can manage this fax extension.\n"; + echo "
\n"; + echo "
\n"; + echo " Description:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the description here.\n"; + echo "
\n"; + if ($action == "update") { + echo " \n"; + echo " \n"; + } + echo " \n"; + echo "
"; + echo "
"; + echo "
"; + + echo "
\n"; + echo "
\n"; + +//show the footer + require_once "includes/footer.php"; +?> \ No newline at end of file diff --git a/app/fax/v_fax_view.php b/app/fax/v_fax_view.php new file mode 100644 index 0000000000..2bc36fa9f9 --- /dev/null +++ b/app/fax/v_fax_view.php @@ -0,0 +1,725 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('fax_extension_view')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +//get the fax_extension and save it as a variable + if (strlen($_REQUEST["fax_extension"]) > 0) { + $fax_extension = check_str($_REQUEST["fax_extension"]); + } + +//pre-populate the form + if (strlen($_GET['id']) > 0 && $_POST["persistformvar"] != "true") { + $fax_uuid = check_str($_GET["id"]); + if (if_group("superadmin") || if_group("admin")) { + //show all fax extensions + $sql = "select * from v_fax "; + $sql .= "where domain_uuid = '".$_SESSION['domain_uuid']."' "; + $sql .= "and fax_uuid = '$fax_uuid' "; + } + else { + //show only assigned fax extensions + $sql = "select * from v_fax as f, v_fax_users as u "; + $sql .= "where f.fax_uuid = u.fax_uuid "; + $sql .= "and f.domain_uuid = '".$_SESSION['domain_uuid']."' "; + $sql .= "and f.fax_uuid = '$fax_uuid' "; + $sql .= "and u.user_uuid = '".$_SESSION['user_uuid']."' "; + } + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + if (count($result) == 0) { + if (if_group("superadmin") || if_group("admin")) { + //allow access + } + else { + echo "access denied"; + exit; + } + } + foreach ($result as &$row) { + //set database fields as variables + $fax_extension = $row["fax_extension"]; + $fax_name = $row["fax_name"]; + $fax_email = $row["fax_email"]; + $fax_pin_number = $row["fax_pin_number"]; + $fax_caller_id_name = $row["fax_caller_id_name"]; + $fax_caller_id_number = $row["fax_caller_id_number"]; + $fax_forward_number = $row["fax_forward_number"]; + $fax_description = $row["fax_description"]; + //limit to one row + break; + } + unset ($prep_statement); + } + +//set the fax directory + if (count($_SESSION["domains"]) > 1) { + $v_fax_dir = $_SESSION['switch']['storage']['dir'].'/fax/'.$_SESSION['domain_name']; + } + else { + $v_fax_dir = $_SESSION['switch']['storage']['dir'].'/fax'; + } + +//delete a fax + if ($_GET['a'] == "del" && permission_exists('fax_inbox_delete')) { + $file_name = substr(check_str($_GET['filename']), 0, -4); + $file_ext = substr(check_str($_GET['filename']), -3); + if ($_GET['type'] == "fax_inbox") { + unlink($v_fax_dir.'/'.$fax_extension.'/inbox/'.$file_name.".tif"); + unlink($v_fax_dir.'/'.$fax_extension.'/inbox/'.$file_name.".pdf"); + } + if ($_GET['type'] == "fax_sent") { + unlink($v_fax_dir.'/'.$fax_extension.'/sent/'.$file_name.".tif"); + unlink($v_fax_dir.'/'.$fax_extension.'/sent/'.$file_name.".pdf"); + } + unset($file_name); + unset($file_ext); + } + +//download a fax + if ($_GET['a'] == "download") { + session_cache_limiter('public'); + //test to see if it is in the inbox or sent directory. + if ($_GET['type'] == "fax_inbox") { + if (file_exists($v_fax_dir.'/'.check_str($_GET['ext']).'/inbox/'.check_str($_GET['filename']))) { + $tmp_faxdownload_file = "".$v_fax_dir.'/'.check_str($_GET['ext']).'/inbox/'.check_str($_GET['filename']); + } + } + else if ($_GET['type'] == "fax_sent") { + if (file_exists($v_fax_dir.'/'.check_str($_GET['ext']).'/sent/'.check_str($_GET['filename']))) { + $tmp_faxdownload_file = "".$v_fax_dir.'/'.check_str($_GET['ext']).'/sent/'.check_str($_GET['filename']); + } + } + //let's see if we found it. + if (strlen($tmp_faxdownload_file) > 0) { + $fd = fopen($tmp_faxdownload_file, "rb"); + if ($_GET['t'] == "bin") { + header("Content-Type: application/force-download"); + header("Content-Type: application/octet-stream"); + header("Content-Type: application/download"); + header("Content-Description: File Transfer"); + header('Content-Disposition: attachment; filename="'.check_str($_GET['filename']).'"'); + } + else { + $file_ext = substr(check_str($_GET['filename']), -3); + if ($file_ext == "tif") { + header("Content-Type: image/tiff"); + } + else if ($file_ext == "png") { + header("Content-Type: image/png"); + } + else if ($file_ext == "jpg") { + header('Content-Type: image/jpeg'); + } + else if ($file_ext == "pdf") { + header("Content-Type: application/pdf"); + } + } + header('Accept-Ranges: bytes'); + header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1 + header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // date in the past + header("Content-Length: " . filesize($tmp_faxdownload_file)); + fpassthru($fd); + } + else { + echo "File not found."; + } + exit; + } + +//get the fax extension + if (strlen($fax_extension) > 0) { + //set the fax directories. example /usr/local/freeswitch/storage/fax/329/inbox + $dir_fax_inbox = $v_fax_dir.'/'.$fax_extension.'/inbox'; + $dir_fax_sent = $v_fax_dir.'/'.$fax_extension.'/sent'; + $dir_fax_temp = $v_fax_dir.'/'.$fax_extension.'/temp'; + + //make sure the directories exist + if (!is_dir($_SESSION['switch']['storage']['dir'])) { + mkdir($_SESSION['switch']['storage']['dir']); + chmod($dir_fax_sent,0774); + } + if (!is_dir($v_fax_dir.'/'.$fax_extension)) { + mkdir($v_fax_dir.'/'.$fax_extension,0774,true); + chmod($v_fax_dir.'/'.$fax_extension,0774); + } + if (!is_dir($dir_fax_inbox)) { + mkdir($dir_fax_inbox,0774,true); + chmod($dir_fax_inbox,0774); + } + if (!is_dir($dir_fax_sent)) { + mkdir($dir_fax_sent,0774,true); + chmod($dir_fax_sent,0774); + } + if (!is_dir($dir_fax_temp)) { + mkdir($dir_fax_temp,0774,true); + chmod($dir_fax_temp,0774); + } + } + +//set the action as an add or an update + if (isset($_REQUEST["id"])) { + $action = "update"; + $fax_uuid = check_str($_REQUEST["id"]); + } + else { + $action = "add"; + } + +//get the http post values and set them as php variables + if (count($_POST)>0) { + $fax_name = check_str($_POST["fax_name"]); + $fax_email = check_str($_POST["fax_email"]); + $fax_pin_number = check_str($_POST["fax_pin_number"]); + $fax_caller_id_name = check_str($_POST["fax_caller_id_name"]); + $fax_caller_id_number = check_str($_POST["fax_caller_id_number"]); + $fax_forward_number = check_str($_POST["fax_forward_number"]); + if (strlen($fax_forward_number) > 0) { + $fax_forward_number = preg_replace("~[^0-9]~", "",$fax_forward_number); + } + $fax_description = check_str($_POST["fax_description"]); + } + +//clear file status cache + clearstatcache(); + +//upload and send the fax + if (($_POST['type'] == "fax_send") && is_uploaded_file($_FILES['fax_file']['tmp_name'])) { + + $fax_number = check_str($_POST['fax_number']); + if (strlen($fax_number) > 0) { + $fax_number = preg_replace("~[^0-9]~", "",$fax_number); + } + $fax_name = $_FILES['fax_file']['name']; + $fax_name = str_replace(" ", "_", $fax_name); + $fax_name = str_replace(".tif", "", $fax_name); + $fax_name = str_replace(".tiff", "", $fax_name); + $fax_name = str_replace(".pdf", "", $fax_name); + $provider_type = check_str($_POST['provider_type']); + $fax_uuid = check_str($_POST["id"]); + + $fax_caller_id_name = check_str($_POST['fax_caller_id_name']); + $fax_caller_id_number = check_str($_POST['fax_caller_id_number']); + $fax_forward_number = check_str($_POST['fax_forward_number']); + if (strlen($fax_forward_number) > 0) { + $fax_forward_number = preg_replace("~[^0-9]~", "",$fax_forward_number); + } + + //get the fax file extension + $fax_file_extension = substr($dir_fax_temp.'/'.$_FILES['fax_file']['name'], -4); + if ($fax_file_extension == "tiff") { $fax_file_extension = ".tif"; } + + //upload the file + move_uploaded_file($_FILES['fax_file']['tmp_name'], $dir_fax_temp.'/'.$fax_name.$fax_file_extension); + + if ($fax_file_extension == ".pdf") { + chdir($dir_fax_temp); + exec("gs -q -sDEVICE=tiffg3 -r204x98 -dNOPAUSE -sOutputFile=".$fax_name.".tif -- ".$fax_name.".pdf -c quit"); + //exec("rm ".$dir_fax_temp.'/'.$fax_name.".pdf"); + } + + //send the fax + $fp = event_socket_create($_SESSION['event_socket_ip_address'], $_SESSION['event_socket_port'], $_SESSION['event_socket_password']); + if ($fp) { + //prepare the fax originate command + $route_array = outbound_route_to_bridge($fax_number); + $fax_file = $dir_fax_temp."/".$fax_name.".tif"; + if (count($route_array) == 0) { + //send the internal call to the registered extension + $fax_uri = "user/".$fax_number."@".$_SESSION['domain_name']; + $t38 = ""; + } + else { + //send the external call + $fax_uri = $route_array[0]; + $t38 = "fax_enable_t38=true,fax_enable_t38_request=true,"; + } + $cmd = "api originate {origination_caller_id_name='".$fax_caller_id_name."',origination_caller_id_number='".$fax_caller_id_number."',fax_ident='".$fax_caller_id_number."',fax_header='".$fax_caller_id_name."',fax_uri=".$fax_uri.",fax_file='".$fax_file."',fax_retry_attempts=1,fax_retry_limit=20,fax_retry_sleep=180,fax_verbose=true,fax_use_ecm=off,".$t38."api_hangup_hook='lua fax_retry.lua'}".$fax_uri." &txfax('".$fax_file."')"; + //send the command to event socket + $response = event_socket_request($fp, $cmd); + $response = str_replace("\n", "", $response); + $uuid = str_replace("+OK ", "", $response); + fclose($fp); + } + + //wait for a few seconds + sleep(5); + + //copy the .tif to the sent directory + exec("cp ".$dir_fax_temp.'/'.$fax_name.".tif ".$dir_fax_sent.'/'.$fax_name.".tif"); + + //convert the tif to pdf + chdir($dir_fax_sent); + exec("gs -q -sDEVICE=tiffg3 -g1728x1078 -dNOPAUSE -sOutputFile=".$fax_name.".pdf -- ".$fax_name.".tif -c quit"); + + //delete the .tif from the temp directory + //exec("rm ".$dir_fax_temp.'/'.$fax_name.".tif"); + + //convert the tif to pdf and png + chdir($dir_fax_sent); + //which tiff2pdf + if (is_file("/usr/local/bin/tiff2png")) { + exec($_SESSION['switch']['bin']['dir']."/tiff2png ".$dir_fax_sent.$fax_name.".tif"); + exec($_SESSION['switch']['bin']['dir']."/tiff2pdf -f -o ".$fax_name.".pdf ".$dir_fax_sent.$fax_name.".tif"); + } + + header("Location: v_fax_view.php?id=".$fax_uuid."&msg=".$response); + exit; + } //end upload and send fax + +//delete the fax + if ($_GET['a'] == "del") { + $fax_extension = check_str($_GET["fax_extension"]); + if ($_GET['type'] == "fax_inbox" && permission_exists('fax_inbox_delete')) { + unlink($v_fax_dir.'/'.$fax_extension.'/inbox/'.check_str($_GET['filename'])); + } + if ($_GET['type'] == "fax_sent" && permission_exists('fax_sent_delete')) { + unlink($v_fax_dir.'/'.$fax_extension.'/sent/'.check_str($_GET['filename'])); + } + } + +//download the fax + if ($_GET['a'] == "download") { + session_cache_limiter('public'); + //test to see if it is in the inbox or sent directory. + if ($_GET['type'] == "fax_inbox" && permission_exists('fax_inbox_view')) { + if (file_exists($v_fax_dir.'/'.check_str($_GET['ext']).'/inbox/'.check_str($_GET['filename']))) { + $tmp_faxdownload_file = "".$v_fax_dir.'/'.check_str($_GET['ext']).'/inbox/'.check_str($_GET['filename']); + } + }else if ($_GET['type'] == "fax_sent" && permission_exists('fax_sent_view')) { + if (file_exists($v_fax_dir.'/'.check_str($_GET['ext']).'/sent/'.check_str($_GET['filename']))) { + $tmp_faxdownload_file = "".$v_fax_dir.'/'.check_str($_GET['ext']).'/sent/'.check_str($_GET['filename']); + } + } + //check to see if it was found. + if (strlen($tmp_faxdownload_file) > 0) { + $fd = fopen($tmp_faxdownload_file, "rb"); + if ($_GET['t'] == "bin") { + header("Content-Type: application/force-download"); + header("Content-Type: application/octet-stream"); + header("Content-Type: application/download"); + header("Content-Description: File Transfer"); + header('Content-Disposition: attachment; filename="'.check_str($_GET['filename']).'"'); + } + else { + $file_ext = substr(check_str($_GET['filename']), -3); + if ($file_ext == "tif") { + header("Content-Type: image/tiff"); + } else if ($file_ext == "png") { + header("Content-Type: image/png"); + } else if ($file_ext == "jpg") { + header('Content-Type: image/jpeg'); + } else if ($file_ext == "pdf") { + header("Content-Type: application/pdf"); + } + } + header('Accept-Ranges: bytes'); + header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1 + header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date in the past + header("Content-Length: " . filesize($tmp_faxdownload_file)); + fpassthru($fd); + } + else { + echo "File not found."; + } + //exit the code execution + exit; + } + +//show the header + require_once "includes/header.php"; + +//fax extension form + echo "
"; + echo "\n"; + echo "\n"; + echo " "; + echo " "; + echo "
\n"; + echo "
"; + + echo "
\n"; + echo "\n"; + echo "\n"; + echo " \n"; + echo " \n"; + echo "\n"; + echo "
\n"; + echo " Fax Server\n"; + echo " \n"; + if (permission_exists('fax_extension_add') || permission_exists('fax_extension_edit')) { + echo " \n"; + } + echo " \n"; + echo "
\n"; + echo "
\n"; + + echo "
\n"; + echo "
\n"; + echo "\n"; + echo " \n"; + echo " \n"; + echo " \n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo " \n"; + echo " \n"; + echo " "; + echo "
\n"; + //pkg_add -r ghostscript8-nox11; rehash + echo " To send a fax you can upload a .tif file or if ghost script has been installed then you can also send a fax by uploading a PDF. \n"; + echo " When sending a fax you can view status of the transmission by viewing the logs from the Status tab or by watching the response from the console.\n"; + echo "

\n"; + echo "
\n"; + echo " Fax Number:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the Number here.\n"; + echo "
\n"; + echo " Upload:\n"; + echo "\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "
\n"; + echo " Select the file to upload and send as a fax.\n"; + echo "
\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "
"; + echo "
\n"; + echo "
\n"; + +//show the inbox + if (permission_exists('fax_inbox_view')) { + echo "\n"; + echo "\n"; + echo "
\n"; + echo "\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "
\n"; + echo " Inbox $fax_extension\n"; + echo " "; + if ($v_path_show) { + echo "location: "; + echo $dir_fax_inbox."     "; + } + echo "
\n"; + echo "\n"; + + $c = 0; + $row_style["0"] = "row_style0"; + $row_style["1"] = "row_style1"; + + echo "
\n"; + echo " \n"; + echo " \n"; + echo " "; + + + if ($handle = opendir($dir_fax_inbox)) { + //build an array of the files in the inbox + $i = 0; + $files = array(); + while (false !== ($file = readdir($handle))) { + if ($file != "." && $file != ".." && is_file($dir_fax_inbox.'/'.$file)) { + $file_path = $dir_fax_inbox.'/'.$file; + $modified = filemtime($file_path); + $index = $modified.$file; + $files[$index]['file'] = $file; + $files[$index]['name'] = substr($file, 0, -4); + $files[$index]['ext'] = substr($file, -3); + //$files[$index]['path'] = $file_path; + $files[$index]['size'] = filesize($file_path); + $files[$index]['size_bytes'] = byte_convert(filesize($file_path)); + $files[$index]['modified'] = filemtime($file_path); + $file_name_array[$i++] = $index; + } + } + closedir($handle); + //order the index array + sort($file_name_array,SORT_STRING); + + //loop through the file array + foreach($file_name_array as $i) { + if (strtolower($files[$i]['ext']) == "tif") { + $file = $files[$i]['file']; + $file_name = $files[$i]['name']; + $file_ext = $files[$i]['ext']; + $file_modified = $files[$i]['modified']; + $file_size_bytes = byte_convert($files[$i]['size']); + if (!file_exists($dir_fax_inbox.'/'.$file_name.".pdf")) { + //convert the tif to pdf + chdir($dir_fax_inbox); + if (is_file("/usr/local/bin/tiff2pdf")) { + exec("/usr/local/bin/tiff2pdf -f -o ".$file_name.".pdf ".$dir_fax_inbox.'/'.$file_name.".tif"); + } + if (is_file("/usr/bin/tiff2pdf")) { + exec("/usr/bin/tiff2pdf -f -o ".$file_name.".pdf ".$dir_fax_inbox.'/'.$file_name.".tif"); + } + } + //if (!file_exists($dir_fax_inbox.'/'.$file_name.".jpg")) { + // //convert the tif to jpg + // chdir($dir_fax_inbox); + // if (is_file("/usr/local/bin/tiff2rgba")) { + // exec("/usr/local/bin/tiff2rgba ".$file_name.".tif ".$dir_fax_inbox.'/'.$file_name.".jpg"); + // } + // if (is_file("/usr/bin/tiff2rgba")) { + // exec("/usr/bin/tiff2rgba ".$file_name.".tif ".$dir_fax_inbox.'/'.$file_name.".jpg"); + // } + //} + echo "\n"; + echo " \n"; + + echo " \n"; + + //echo " \n"; + + echo " \n"; + + echo " \n"; + + echo " \n"; + echo "\n"; + } + } + } + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "
File Name (download)\n"; + echo " View\n"; + echo " Last Modified\n"; + echo " Size\n"; + echo "
\n"; + echo " \n"; + echo " $file_name"; + echo " "; + echo " \n"; + if (file_exists($dir_fax_inbox.'/'.$file_name.".pdf")) { + echo " \n"; + echo " PDF"; + echo " "; + } + else { + echo " \n"; + } + echo " \n"; + //if (file_exists($dir_fax_inbox.'/'.$file_name.".jpg")) { + // echo " \n"; + // echo " jpg"; + // echo " "; + //} + //else { + // echo " \n"; + //} + //echo "  \n"; + echo " ".date("F d Y H:i:s", $file_modified); + echo " \n"; + echo " ".$file_size_bytes; + echo " \n"; + echo " \n"; + echo " \n"; + if (permission_exists('fax_inbox_delete')) { + echo " \n"; + } + echo " \n"; + echo "
$v_link_label_delete
\n"; + echo "
\n"; + echo "\n"; + echo "
\n"; + echo "
\n"; + echo "\n"; + } + +//show the sent box + if (permission_exists('fax_sent_view')) { + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "
\n"; + echo " Sent\n"; + echo " \n"; + if ($v_path_show) { + echo "location: \n"; + echo $dir_fax_sent."     \n"; + } + echo "
\n"; + echo "\n"; + echo " \n"; + echo " \n"; + echo " "; + + if ($handle = opendir($dir_fax_sent)) { + //build an array of the files in the inbox + $i = 0; + $files = array(); + while (false !== ($file = readdir($handle))) { + if ($file != "." && $file != ".." && is_file($dir_fax_sent.'/'.$file)) { + $file_path = $dir_fax_sent.'/'.$file; + $modified = filemtime($file_path); + $index = $modified.$file; + $files[$index]['file'] = $file; + $files[$index]['name'] = substr($file, 0, -4); + $files[$index]['ext'] = substr($file, -3); + //$files[$index]['path'] = $file_path; + $files[$index]['size'] = filesize($file_path); + $files[$index]['size_bytes'] = byte_convert(filesize($file_path)); + $files[$index]['modified'] = filemtime($file_path); + $file_name_array[$i++] = $index; + } + } + closedir($handle); + //order the index array + sort($file_name_array,SORT_STRING); + + //loop through the file array + foreach($file_name_array as $i) { + if (strtolower($files[$i]['ext']) == "tif") { + $file = $files[$i]['file']; + $file_name = $files[$i]['name']; + $file_ext = $files[$i]['ext']; + $file_modified = $files[$i]['modified']; + $file_size_bytes = byte_convert($files[$i]['size']); + + if (!file_exists($dir_fax_sent.'/'.$file_name.".pdf")) { + //convert the tif to pdf + chdir($dir_fax_sent); + if (is_file("/usr/local/bin/tiff2pdf")) { + exec("/usr/local/bin/tiff2pdf -f -o ".$file_name.".pdf ".$dir_fax_sent.'/'.$file_name.".tif"); + } + if (is_file("/usr/bin/tiff2pdf")) { + exec("/usr/bin/tiff2pdf -f -o ".$file_name.".pdf ".$dir_fax_sent.'/'.$file_name.".tif"); + } + } + if (!file_exists($dir_fax_sent.'/'.$file_name.".jpg")) { + //convert the tif to jpg + //chdir($dir_fax_sent); + //if (is_file("/usr/local/bin/tiff2rgba")) { + // exec("/usr/local/bin/tiff2rgba -c jpeg -n ".$file_name.".tif ".$dir_fax_sent.'/'.$file_name.".jpg"); + //} + //if (is_file("/usr/bin/tiff2rgba")) { + // exec("/usr/bin/tiff2rgba -c lzw -n ".$file_name.".tif ".$dir_fax_sent.'/'.$file_name.".jpg"); + //} + } + echo "\n"; + echo " \n"; + echo " \n"; + //echo " \n"; + echo " \n"; + + echo " \n"; + + echo " \n"; + echo "\n"; + if ($c==0) { $c=1; } else { $c=0; } + } //check if the file is a .tif file + } + } + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "
File Name (download)\n"; + echo " View\n"; + echo " Last Modified\n"; + echo " Size\n"; + echo "
\n"; + echo " \n"; + echo " $file"; + echo " "; + echo " \n"; + if (file_exists($dir_fax_sent.'/'.$file_name.".pdf")) { + echo " \n"; + echo " PDF"; + echo " "; + } + else { + echo " \n"; + } + echo " \n"; + //if (file_exists($dir_fax_sent.'/'.$file_name.".jpg")) { + // echo " \n"; + // echo " jpg"; + // echo " "; + //} + //else { + // echo " \n"; + //} + //echo " \n"; + echo " ".date("F d Y H:i:s", $file_modified); + echo " \n"; + echo " ".$file_size_bytes; + echo " \n"; + echo " \n"; + echo " \n"; + if (permission_exists('fax_sent_delete')) { + echo " \n"; + } + echo " \n"; + echo "
$v_link_label_delete
\n"; + echo "
\n"; + echo "\n"; + echo "
\n"; + echo "
\n"; + echo "
\n"; + echo "
\n"; + } + echo "
"; + echo "
"; + +//show the footer + require_once "includes/footer.php"; +?> diff --git a/app/fifo/app_config.php b/app/fifo/app_config.php new file mode 100644 index 0000000000..08856e556e --- /dev/null +++ b/app/fifo/app_config.php @@ -0,0 +1,36 @@ + \ No newline at end of file diff --git a/app/fifo/root.php b/app/fifo/root.php new file mode 100644 index 0000000000..7b882438ea --- /dev/null +++ b/app/fifo/root.php @@ -0,0 +1,50 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ + +// make sure the PATH_SEPARATOR is defined + if (!defined("PATH_SEPARATOR")) { + if ( strpos( $_ENV[ "OS" ], "Win" ) !== false ) { define("PATH_SEPARATOR", ";"); } else { define("PATH_SEPARATOR", ":"); } + } + +// make sure the document_root is set + $_SERVER["SCRIPT_FILENAME"] = str_replace("\\", "/", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = str_replace($_SERVER["PHP_SELF"], "", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = realpath($_SERVER["DOCUMENT_ROOT"]); + //echo "DOCUMENT_ROOT: ".$_SERVER["DOCUMENT_ROOT"]."
\n"; + //echo "PHP_SELF: ".$_SERVER["PHP_SELF"]."
\n"; + //echo "SCRIPT_FILENAME: ".$_SERVER["SCRIPT_FILENAME"]."
\n"; + +// if the project directory exists then add it to the include path otherwise add the document root to the include path + if (is_dir($_SERVER["DOCUMENT_ROOT"].'/fusionpbx')){ + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', '/fusionpbx'); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER["DOCUMENT_ROOT"].'/fusionpbx' ); + } + else { + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', ''); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER['DOCUMENT_ROOT'] ); + } + +?> \ No newline at end of file diff --git a/app/fifo/v_fifo.php b/app/fifo/v_fifo.php new file mode 100644 index 0000000000..bfbf07ef41 --- /dev/null +++ b/app/fifo/v_fifo.php @@ -0,0 +1,194 @@ + + Copyright (C) 2010 + All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('fifo_view')) { + //access granted +} +else { + echo "access denied"; + exit; +} +require_once "includes/header.php"; +require_once "includes/paging.php"; + +//get http values and set them as variables + $order_by = $_GET["order_by"]; + $order = $_GET["order"]; + +//show the content + echo "
"; + echo "\n"; + echo "\n"; + echo ""; + echo ""; + echo "
\n"; + echo "
"; + + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "\n"; + echo " \n"; + echo "
Queues\n"; + echo " \n"; + echo " \n"; + //echo " \n"; + echo "
\n"; + echo " \n"; + echo " Queues are used to setup waiting lines for callers. Also known as FIFO Queues.\n"; + echo " \n"; + echo "
"; + + echo "
"; + echo "
"; + +//get the number of rows in the dialplan + $sql = ""; + $sql .= " select count(*) as num_rows from v_dialplans "; + $sql .= " where domain_uuid = '$domain_uuid' "; + $sql .= " and app_uuid = '16589224-c876-aeb3-f59f-523a1c0801f7' "; + if (strlen($order_by)> 0) { $sql .= "order by $order_by $order "; } else { $sql .= "order by dialplan_order, dialplan_name asc "; } + $prep_statement = $db->prepare(check_sql($sql)); + if ($prep_statement) { + $prep_statement->execute(); + $row = $prep_statement->fetch(PDO::FETCH_ASSOC); + if ($row['num_rows'] > 0) { + $num_rows = $row['num_rows']; + } + else { + $num_rows = '0'; + } + } + unset($prep_statement, $result); + +//paging prep + $rows_per_page = 20; + $param = ""; + $page = $_GET['page']; + if (strlen($page) == 0) { $page = 0; $_GET['page'] = 0; } + list($paging_controls, $rows_per_page, $var_3) = paging($num_rows, $param, $rows_per_page); + $offset = $rows_per_page * $page; + +//get the dialplans + $sql = ""; + $sql .= " select * from v_dialplans "; + $sql .= " where domain_uuid = '$domain_uuid' "; + $sql .= " and app_uuid = '16589224-c876-aeb3-f59f-523a1c0801f7' "; + if (strlen($order_by)> 0) { $sql .= "order by $order_by $order "; } else { $sql .= "order by dialplan_order, dialplan_name asc "; } + $sql .= " limit $rows_per_page offset $offset "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + $result_count = count($result); + unset ($prep_statement, $sql); + + $c = 0; + $row_style["0"] = "row_style0"; + $row_style["1"] = "row_style1"; + + echo "
\n"; + echo "\n"; + echo "\n"; + echo th_order_by('dialplan_name', 'Extension Name', $order_by, $order); + echo th_order_by('dialplan_order', 'Order', $order_by, $order); + echo th_order_by('dialplan_enabled', 'Enabled', $order_by, $order); + echo th_order_by('dialplan_description', 'Description', $order_by, $order); + echo "\n"; + echo "\n"; + + if ($result_count > 0) { + foreach($result as $row) { + echo "\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "\n"; + if ($c==0) { $c=1; } else { $c=0; } + } //end foreach + unset($sql, $result, $row_count); + } //end if results + + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + + echo "
\n"; + if (permission_exists('fifo_add')) { + echo " $v_link_label_add\n"; + } + echo "
  ".$row['dialplan_name']."  ".$row['dialplan_order']."  ".$row['dialplan_enabled']."".$row['dialplan_description']." \n"; + if (permission_exists('fifo_edit')) { + echo " $v_link_label_edit\n"; + } + if (permission_exists('fifo_delete')) { + echo " $v_link_label_delete\n"; + } + echo "
\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "
 $paging_controls\n"; + if (permission_exists('fifo_add')) { + echo " $v_link_label_add\n"; + } + echo "
\n"; + echo "
\n"; + echo "
\n"; + if ($v_path_show) { + echo $_SESSION['switch']['conf']['dir']."/dialplan/default/"; + } + echo "
"; + echo "
"; + echo "

"; + echo "

"; + + echo "
"; + echo "
"; + echo "

"; + +//show the footer + require_once "includes/footer.php"; + unset ($result_count); + unset ($result); + unset ($key); + unset ($val); + unset ($c); +?> \ No newline at end of file diff --git a/app/fifo/v_fifo_add.php b/app/fifo/v_fifo_add.php new file mode 100644 index 0000000000..6443332208 --- /dev/null +++ b/app/fifo/v_fifo_add.php @@ -0,0 +1,426 @@ + + Copyright (C) 2010 + All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('fifo_add')) { + //access granted +} +else { + echo "access denied"; + exit; +} +require_once "includes/header.php"; +require_once "includes/paging.php"; + +//get http values and set them as variables + if (count($_POST)>0) { + $order_by = $_GET["order_by"]; + $order = $_GET["order"]; + $extension_name = check_str($_POST["extension_name"]); + $queue_extension_number = check_str($_POST["queue_extension_number"]); + $agent_queue_extension_number = check_str($_POST["agent_queue_extension_number"]); + $agent_login_logout_extension_number = check_str($_POST["agent_login_logout_extension_number"]); + $dialplan_order = check_str($_POST["dialplan_order"]); + $pin_number = check_str($_POST["pin_number"]); + $profile = check_str($_POST["profile"]); + $flags = check_str($_POST["flags"]); + $dialplan_enabled = check_str($_POST["dialplan_enabled"]); + $dialplan_description = check_str($_POST["dialplan_description"]); + if (strlen($dialplan_enabled) == 0) { $dialplan_enabled = "true"; } //set default to enabled + } + +if (count($_POST)>0 && strlen($_POST["persistformvar"]) == 0) { + //check for all required data + if (strlen($domain_uuid) == 0) { $msg .= "Please provide: domain_uuid
\n"; } + if (strlen($extension_name) == 0) { $msg .= "Please provide: Extension Name
\n"; } + if (strlen($queue_extension_number) == 0) { $msg .= "Please provide: Extension Number 1
\n"; } + //if (strlen($agent_queue_extension_number) == 0) { $msg .= "Please provide: Queue Extension Number
\n"; } + //if (strlen($agent_queue_extension_number) == 0) { $msg .= "Please provide: Agent Login Logout Extension Number
\n"; } + //if (strlen($pin_number) == 0) { $msg .= "Please provide: PIN Number
\n"; } + //if (strlen($profile) == 0) { $msg .= "Please provide: profile
\n"; } + //if (strlen($flags) == 0) { $msg .= "Please provide: Flags
\n"; } + //if (strlen($dialplan_enabled) == 0) { $msg .= "Please provide: Enabled True or False
\n"; } + //if (strlen($dialplan_description) == 0) { $msg .= "Please provide: Description
\n"; } + if (strlen($msg) > 0 && strlen($_POST["persistformvar"]) == 0) { + require_once "includes/header.php"; + require_once "includes/persistformvar.php"; + echo "
\n"; + echo "
\n"; + echo $msg."
"; + echo "
\n"; + persistformvar($_POST); + echo "
\n"; + require_once "includes/footer.php"; + return; + } + + if (strlen($queue_extension_number) > 0) { + //-------------------------------------------------------- + //Caller Queue [FIFO in] + // + // + // + // + // + // + // + //-------------------------------------------------------- + $extension_name = $extension_name."_call_queue"; + $dialplan_context = $_SESSION['context']; + $app_uuid = '16589224-c876-aeb3-f59f-523a1c0801f7'; + $dialplan_uuid = uuid(); + dialplan_add($domain_uuid, $dialplan_uuid, $extension_name, $dialplan_order, $dialplan_context, $dialplan_enabled, $dialplan_description, $app_uuid); + if (strlen($dialplan_uuid) > 0) { + //set the destination number + $dialplan_detail_tag = 'condition'; //condition, action, antiaction + $dialplan_detail_type = 'destination_number'; + $dialplan_detail_data = '^'.$queue_extension_number.'$'; + $dialplan_detail_order = '000'; + $dialplan_detail_group = ''; + dialplan_detail_add($_SESSION['domain_uuid'], $dialplan_uuid, $dialplan_detail_tag, $dialplan_detail_order, $dialplan_detail_group, $dialplan_detail_type, $dialplan_detail_data); + //set the hold music + //if (strlen($hold_music) > 0) { + $dialplan_detail_tag = 'action'; //condition, action, antiaction + $dialplan_detail_type = 'set'; + $dialplan_detail_data = 'fifo_music=$${hold_music}'; + $dialplan_detail_order = '001'; + dialplan_detail_add($_SESSION['domain_uuid'], $dialplan_uuid, $dialplan_detail_tag, $dialplan_detail_order, $dialplan_detail_group, $dialplan_detail_type, $dialplan_detail_data); + //} + //action answer + $dialplan_detail_tag = 'action'; //condition, action, antiaction + $dialplan_detail_type = 'answer'; + $dialplan_detail_data = ''; + $dialplan_detail_order = '002'; + dialplan_detail_add($_SESSION['domain_uuid'], $dialplan_uuid, $dialplan_detail_tag, $dialplan_detail_order, $dialplan_detail_group, $dialplan_detail_type, $dialplan_detail_data); + //action fifo + //if (strlen($pin_number) > 0) { $pin_number = "+".$pin_number; } + //if (strlen($flags) > 0) { $flags = "+{".$flags."}"; } + //$queue_action_data = $extension_name."@\${domain_name}".$profile.$flags.$pin_number; + $queue_action_data = $extension_name."@\${domain_name} in"; + $dialplan_detail_tag = 'action'; //condition, action, antiaction + $dialplan_detail_type = 'fifo'; + $dialplan_detail_data = $queue_action_data; + $dialplan_detail_order = '003'; + dialplan_detail_add($_SESSION['domain_uuid'], $dialplan_uuid, $dialplan_detail_tag, $dialplan_detail_order, $dialplan_detail_group, $dialplan_detail_type, $dialplan_detail_data); + } + } //end if queue_extension_number + + + // Caller Queue / Agent Queue + if (strlen($agent_queue_extension_number) > 0) { + //-------------------------------------------------------- + // Agent Queue [FIFO out] + // + // + // + // + // + // + // + //-------------------------------------------------------- + $extension_name = $extension_name."_agent_queue"; + $dialplan_context = $_SESSION['context']; + $app_uuid = '16589224-c876-aeb3-f59f-523a1c0801f7'; + $dialplan_uuid = uuid(); + dialplan_add($domain_uuid, $dialplan_uuid, $extension_name, $dialplan_order, $dialplan_context, $dialplan_enabled, $dialplan_description, $app_uuid); + if (strlen($dialplan_uuid) > 0) { + //set the destination number + $dialplan_detail_tag = 'condition'; //condition, action, antiaction + $dialplan_detail_type = 'destination_number'; + $dialplan_detail_data = '^'.$agent_queue_extension_number.'$'; + $dialplan_detail_order = '000'; + dialplan_detail_add($_SESSION['domain_uuid'], $dialplan_uuid, $dialplan_detail_tag, $dialplan_detail_order, $dialplan_detail_group, $dialplan_detail_type, $dialplan_detail_data); + //set the hold music + //if (strlen($hold_music) > 0) { + $dialplan_detail_tag = 'action'; //condition, action, antiaction + $dialplan_detail_type = 'set'; + $dialplan_detail_data = 'fifo_music=$${hold_music}'; + $dialplan_detail_order = '001'; + dialplan_detail_add($_SESSION['domain_uuid'], $dialplan_uuid, $dialplan_detail_tag, $dialplan_detail_order, $dialplan_detail_group, $dialplan_detail_type, $dialplan_detail_data); + //} + //action answer + $dialplan_detail_tag = 'action'; //condition, action, antiaction + $dialplan_detail_type = 'answer'; + $dialplan_detail_data = ''; + $dialplan_detail_order = '002'; + dialplan_detail_add($_SESSION['domain_uuid'], $dialplan_uuid, $dialplan_detail_tag, $dialplan_detail_order, $dialplan_detail_group, $dialplan_detail_type, $dialplan_detail_data); + //action fifo + //if (strlen($pin_number) > 0) { $pin_number = "+".$pin_number; } + //if (strlen($flags) > 0) { $flags = "+{".$flags."}"; } + //$queue_action_data = $extension_name."@\${domain_name}".$profile.$flags.$pin_number; + $queue_action_data = $extension_name."@\${domain_name} out wait"; + $dialplan_detail_tag = 'action'; //condition, action, antiaction + $dialplan_detail_type = 'fifo'; + $dialplan_detail_data = $queue_action_data; + $dialplan_detail_order = '003'; + dialplan_detail_add($_SESSION['domain_uuid'], $dialplan_uuid, $dialplan_detail_tag, $dialplan_detail_order, $dialplan_detail_group, $dialplan_detail_type, $dialplan_detail_data); + } + } + + // agent or member login / logout + if (strlen($agent_login_logout_extension_number) > 0) { + //-------------------------------------------------------- + // Agent Queue [FIFO out] + // + // + // + // + // + // + // + //-------------------------------------------------------- + $extension_name = $extension_name."_agent_login_logout"; + $dialplan_context = $_SESSION['context']; + $app_uuid = '16589224-c876-aeb3-f59f-523a1c0801f7'; + $dialplan_uuid = uuid(); + $dialplan_uuid = dialplan_add($domain_uuid, $dialplan_uuid, $extension_name, $dialplan_order, $dialplan_context, $dialplan_enabled, $dialplan_description, $app_uuid); + if (strlen($dialplan_uuid) > 0) { + //set the destination number + $dialplan_detail_tag = 'condition'; //condition, action, antiaction + $dialplan_detail_type = 'destination_number'; + $dialplan_detail_data = '^'.$agent_login_logout_extension_number.'$'; + $dialplan_detail_order = '000'; + dialplan_detail_add($_SESSION['domain_uuid'], $dialplan_uuid, $dialplan_detail_tag, $dialplan_detail_order, $dialplan_detail_group, $dialplan_detail_type, $dialplan_detail_data); + //set the queue_name + $dialplan_detail_tag = 'action'; //condition, action, antiaction + $dialplan_detail_type = 'set'; + $dialplan_detail_data = 'queue_name='.$extension_name.'@\${domain_name}'; + $dialplan_detail_order = '001'; + dialplan_detail_add($_SESSION['domain_uuid'], $dialplan_uuid, $dialplan_detail_tag, $dialplan_detail_order, $dialplan_detail_group, $dialplan_detail_type, $dialplan_detail_data); + //set the fifo_simo + $dialplan_detail_tag = 'action'; //condition, action, antiaction + $dialplan_detail_type = 'set'; + $dialplan_detail_data = 'fifo_simo=1'; + $dialplan_detail_order = '002'; + dialplan_detail_add($_SESSION['domain_uuid'], $dialplan_uuid, $dialplan_detail_tag, $dialplan_detail_order, $dialplan_detail_group, $dialplan_detail_type, $dialplan_detail_data); + //set the fifo_timeout + $dialplan_detail_tag = 'action'; //condition, action, antiaction + $dialplan_detail_type = 'set'; + $dialplan_detail_data = 'fifo_timeout=10'; + $dialplan_detail_order = '003'; + dialplan_detail_add($_SESSION['domain_uuid'], $dialplan_uuid, $dialplan_detail_tag, $dialplan_detail_order, $dialplan_detail_group, $dialplan_detail_type, $dialplan_detail_data); + //set the fifo_lag + $dialplan_detail_tag = 'action'; //condition, action, antiaction + $dialplan_detail_type = 'set'; + $dialplan_detail_data = 'fifo_lag=10'; + $dialplan_detail_order = '004'; + dialplan_detail_add($_SESSION['domain_uuid'], $dialplan_uuid, $dialplan_detail_tag, $dialplan_detail_order, $dialplan_detail_group, $dialplan_detail_type, $dialplan_detail_data); + //set the pin_number + $dialplan_detail_tag = 'action'; //condition, action, antiaction + $dialplan_detail_type = 'set'; + $dialplan_detail_data = 'pin_number='; + $dialplan_detail_order = '005'; + dialplan_detail_add($_SESSION['domain_uuid'], $dialplan_uuid, $dialplan_detail_tag, $dialplan_detail_order, $dialplan_detail_group, $dialplan_detail_type, $dialplan_detail_data); + //action lua + $dialplan_detail_tag = 'action'; //condition, action, antiaction + $dialplan_detail_type = 'lua'; + $dialplan_detail_data = 'fifo_member.lua'; + $dialplan_detail_order = '006'; + dialplan_detail_add($_SESSION['domain_uuid'], $dialplan_uuid, $dialplan_detail_tag, $dialplan_detail_order, $dialplan_detail_group, $dialplan_detail_type, $dialplan_detail_data); + } + } + + //synchronize the xml config + save_dialplan_xml(); + + //redirect the user + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Update Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + +} //end if (count($_POST)>0 && strlen($_POST["persistformvar"]) == 0) + +//show the content + echo "
"; + echo "\n"; + echo "\n"; + echo " \n"; + echo "\n"; + echo "
\n"; + echo "
"; + + echo "
\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "
\n"; + echo " Queues\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "
\n"; + echo " \n"; + echo " In simple terms queues are holding patterns for callers to wait until someone is available to take the call. Also known as FIFO Queues.\n"; + echo " \n"; + echo "
"; + + echo "
\n"; + echo "
\n"; + + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "
\n"; + echo " Queue Name:\n"; + echo " \n"; + echo " \n"; + echo "
\n"; + echo " The name the queue will be assigned.\n"; + echo "
\n"; + echo " Extension Number:\n"; + echo " \n"; + echo " \n"; + echo "
\n"; + echo " The number that will be assigned to the queue.\n"; + echo "
\n"; + echo " Order:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "\n"; + echo "
\n"; + echo " Enabled:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "\n"; + echo "
\n"; + echo " Description:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "\n"; + echo "
\n"; + echo "

\n"; + echo " Agent Details\n"; + echo "
\n"; + echo "  \n"; + echo "
\n"; + echo " Queue Extension Number:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "The extension number for the Agent FIFO Queue. This is the holding pattern for agents wating to service calls in the caller FIFO queue.\n"; + echo "
\n"; + echo " Login/Logout Extension Number:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Agents use this extension number to login or logout of the Queue. After logging into the agent will be ready to receive calls from the Queue. \n"; + echo "
\n"; + + + echo "\n"; + echo "\n"; + echo " \n"; + echo ""; + echo "
\n"; + if ($action == "update") { + echo " \n"; + } + echo " \n"; + echo "
"; + + echo "
"; + + echo "
\n"; + echo "
"; + echo "

"; + +//show the footer + require_once "includes/footer.php"; +?> \ No newline at end of file diff --git a/app/fifo/v_fifo_delete.php b/app/fifo/v_fifo_delete.php new file mode 100644 index 0000000000..9b374e91a4 --- /dev/null +++ b/app/fifo/v_fifo_delete.php @@ -0,0 +1,81 @@ + + Copyright (C) 2010 + All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('fifo_delete')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +//get the id + if (count($_GET)>0) { + $id = $_GET["id"]; + } + +if (strlen($id)>0) { + + //start the atomic transaction + $count = $db->exec("BEGIN;"); + + //delete child data + $sql = ""; + $sql .= "delete from v_dialplan_details "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and dialplan_uuid = '$id' "; + //echo $sql; + $db->query($sql); + unset($sql); + + //delete parent data + $sql = ""; + $sql .= "delete from v_dialplans "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and dialplan_uuid = '$id' "; + //echo $sql; + $db->query($sql); + unset($sql); + + //commit the atomic transaction + $count = $db->exec("COMMIT;"); + + //synchronize the xml config + save_dialplan_xml(); +} + +//redirect the user + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Delete Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + +?> \ No newline at end of file diff --git a/app/fifo/v_fifo_details_delete.php b/app/fifo/v_fifo_details_delete.php new file mode 100644 index 0000000000..5c9dc1118e --- /dev/null +++ b/app/fifo/v_fifo_details_delete.php @@ -0,0 +1,66 @@ + + Copyright (C) 2010 + All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (if_group("fifo_delete")) { + //access granted +} +else { + echo "access denied"; + exit; +} + +if (count($_GET)>0) { + $id = $_GET["id"]; + $dialplan_uuid = check_str($_REQUEST["id2"]); +} + +if (strlen($id)>0) { + //delete the data + $sql = ""; + $sql .= "delete from v_dialplan_details "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and dialplan_detail_uuid = '$id' "; + $sql .= "and dialplan_uuid = '$dialplan_uuid' "; + $db->query($sql); + unset($sql); + //synchronize the xml config + save_dialplan_xml(); +} + +//redirect the user + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Delete Complete\n"; + echo "
\n"; + +//show the footer + require_once "includes/footer.php"; + return; + +?> \ No newline at end of file diff --git a/app/fifo/v_fifo_details_edit.php b/app/fifo/v_fifo_details_edit.php new file mode 100644 index 0000000000..7282da61b6 --- /dev/null +++ b/app/fifo/v_fifo_details_edit.php @@ -0,0 +1,456 @@ + + Copyright (C) 2010 + All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('fifo_add') || permission_exists('fifo_edit')) { + //access granted +} +else { + echo "access denied"; + exit; +} +//if (permission_exists('fifo_add')) { + +//set the action as an add or an update + if (isset($_REQUEST["id"])) { + $action = "update"; + $dialplan_detail_uuid = check_str($_REQUEST["id"]); + } + else { + $action = "add"; + $dialplan_uuid = check_str($_REQUEST["id2"]); + } + if (isset($_REQUEST["id2"])) { + $dialplan_uuid = check_str($_REQUEST["id2"]); + } + +//get http values and set them as php variables + if (count($_POST)>0) { + if (isset($_REQUEST["dialplan_uuid"])) { + $dialplan_uuid = check_str($_POST["dialplan_uuid"]); + } + $dialplan_detail_tag = check_str($_POST["dialplan_detail_tag"]); + $dialplan_detail_order = check_str($_POST["dialplan_detail_order"]); + $dialplan_detail_type = check_str($_POST["dialplan_detail_type"]); + $dialplan_detail_data = check_str($_POST["dialplan_detail_data"]); + } + +if (count($_POST)>0 && strlen($_POST["persistformvar"]) == 0) { + + $msg = ''; + if ($action == "update") { + $dialplan_detail_uuid = check_str($_POST["dialplan_detail_uuid"]); + } + + //check for all required data + if (strlen($domain_uuid) == 0) { $msg .= "Please provide: domain_uuid
\n"; } + if (strlen($dialplan_detail_tag) == 0) { $msg .= "Please provide: Tag
\n"; } + if (strlen($dialplan_detail_order) == 0) { $msg .= "Please provide: Order
\n"; } + //if (strlen($dialplan_detail_type) == 0) { $msg .= "Please provide: Type
\n"; } + //if (strlen($dialplan_detail_data) == 0) { $msg .= "Please provide: Data
\n"; } + if (strlen($msg) > 0 && strlen($_POST["persistformvar"]) == 0) { + require_once "includes/header.php"; + require_once "includes/persistformvar.php"; + echo "
\n"; + echo "
\n"; + echo $msg."
"; + echo "
\n"; + persistformvar($_POST); + echo "
\n"; + require_once "includes/footer.php"; + return; + } + + //add or update the database + if ($_POST["persistformvar"] != "true") { + if ($action == "add" && permission_exists('fifo_add')) { + $dialplan_detail_uuid = uuid(); + $sql = "insert into v_dialplan_details "; + $sql .= "("; + $sql .= "domain_uuid, "; + $sql .= "dialplan_uuid, "; + $sql .= "dialplan_detail_uuid, "; + $sql .= "dialplan_detail_tag, "; + $sql .= "dialplan_detail_order, "; + $sql .= "dialplan_detail_type, "; + $sql .= "dialplan_detail_data "; + $sql .= ")"; + $sql .= "values "; + $sql .= "("; + $sql .= "'$domain_uuid', "; + $sql .= "'$dialplan_uuid', "; + $sql .= "'$dialplan_detail_uuid', "; + $sql .= "'$dialplan_detail_tag', "; + $sql .= "'$dialplan_detail_order', "; + $sql .= "'$dialplan_detail_type', "; + $sql .= "'$dialplan_detail_data' "; + $sql .= ")"; + $db->exec(check_sql($sql)); + unset($sql); + + //synchronize the xml config + save_dialplan_xml(); + + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Add Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + } //if ($action == "add") + + if ($action == "update" && permission_exists('fifo_edit')) { + $sql = "update v_dialplan_details set "; + $sql .= "domain_uuid = '$domain_uuid', "; + $sql .= "dialplan_uuid = '$dialplan_uuid', "; + $sql .= "dialplan_detail_tag = '$dialplan_detail_tag', "; + $sql .= "dialplan_detail_order = '$dialplan_detail_order', "; + $sql .= "dialplan_detail_type = '$dialplan_detail_type', "; + $sql .= "dialplan_detail_data = '$dialplan_detail_data' "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and dialplan_detail_uuid = '$dialplan_detail_uuid'"; + $db->exec(check_sql($sql)); + unset($sql); + + //synchronize the xml config + save_dialplan_xml(); + + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Update Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + } //if ($action == "update") + } //if ($_POST["persistformvar"] != "true") +} //(count($_POST)>0 && strlen($_POST["persistformvar"]) == 0) + +//pre-populate the form + if (count($_GET)>0 && $_POST["persistformvar"] != "true") { + $dialplan_detail_uuid = $_GET["id"]; + $sql = ""; + $sql .= "select * from v_dialplan_details "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and dialplan_detail_uuid = '$dialplan_detail_uuid' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach ($result as &$row) { + $dialplan_uuid = $row["dialplan_uuid"]; + $dialplan_detail_tag = $row["dialplan_detail_tag"]; + $dialplan_detail_order = $row["dialplan_detail_order"]; + $dialplan_detail_type = $row["dialplan_detail_type"]; + $dialplan_detail_data = $row["dialplan_detail_data"]; + break; //limit to 1 row + } + unset ($prep_statement); + } + +//show the header + require_once "includes/header.php"; + +//show the content + echo "
"; + echo "\n"; + echo "\n"; + echo " "; + echo "
\n"; + echo "
"; + + echo "
\n"; + //echo "
\n"; + echo "\n"; + echo "\n"; + if ($action == "add") { + echo "\n"; + } + if ($action == "update") { + echo "\n"; + } + echo "\n"; + echo "\n"; + + ?> + + \n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo " \n"; + echo " \n"; + echo " "; + echo "
Queue Detail AddQueue Detail Update
\n"; + echo " Tag:\n"; + echo "\n"; + echo " \n"; + + //condition + //field expression + //action + //application + //data + //antiaction + //application + //data + //param + //name + //value + //echo " \n"; + echo "
\n"; + echo "\n"; + echo "
\n"; + echo " Order:\n"; + echo "\n"; + echo " \n"; + + echo "
\n"; + echo "\n"; + echo "
\n"; + echo " Type:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "\n"; + echo "
\n"; + echo " Data:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "\n"; + echo "
\n"; + echo " \n"; + if ($action == "update") { + echo " \n"; + } + echo " \n"; + echo "
"; + //echo "
\n"; + echo "
"; + + echo " \n"; + echo " \n"; + echo " + +
\n"; + + if ($v_path_show) { + echo "
\n"; + echo "
\n"; + echo "Additional Information\n"; + echo "
\n"; + echo "
\n"; + + } + ?> + Conditions +
+
+ Conditions are pattern matching tags that help decide if the current call should be processed in this extension or not. When matching conditions against the current call you have several fields that you can compare against. +
    +
  • context
  • +
  • rdnis Redirected Number, the directory number to which the call was last presented.
  • +
  • destination_number Called Number, the number this call is trying to reach (within a given context)
  • +
  • dialplan Name of the dialplan module that are used, the name is provided by each dialplan module. Example: XML
  • +
  • caller_id_name Name of the caller (provided by the User Agent that has called us).
  • +
  • caller_id_number Directory Number of the party who called (callee) -- can be masked (hidden)
  • +
  • ani Automatic Number Identification, the number of the calling party (callee) -- cannot be masked
  • +
  • ani2 The type of device placing the call [1]
  • +
  • uuid Unique identifier of the current call? (looks like a GUID)
  • +
  • source Name of the module that received the call (e.g. PortAudio)
  • +
  • chan_name Name of the current channel (Example: PortAudio/1234). Give us examples when this one can be used.
  • +
  • network_addr IP address of the signalling source for a VoIP call.
  • +
+ In addition to the above you can also do variables using the syntax ${variable} or api functions using the syntax %{api} {args} +
+
+ Variables may be used in either the field or the expression, as follows + +
+
+
+
+ + Action and Anti-Actions +
+
+ Actions are executed when the condition matches. Anti-Actions are executed when the condition does NOT match. +
+
+
+ The following is a partial list of applications. +
    +
  • answer answer the call
  • +
  • bridge bridge the call
  • +
  • cond
  • +
  • db is a a runtime database either sqlite by default or odbc
  • +
  • global_set allows setting of global vars similar to the ones found in vars.xml
  • +
  • group allows grouping of several extensions for things like ring groups
  • +
  • expr
  • +
  • hangup hangs up the call
  • +
  • info sends call info to the console
  • +
  • javascript run javascript .js files
  • +
  • playback
  • +
  • reject reject the call
  • +
  • respond
  • +
  • ring_ready
  • +
  • set set a variable
  • +
  • set_user
  • +
  • sleep
  • +
  • sofia_contact
  • +
  • transfer transfer the call to another extension or number
  • +
  • voicemail send the call to voicemail
  • +
+ +
+
+ + +
+ +
+
+
+
+
+ +"; + echo "
"; + echo "
"; + +//show the footer + require_once "includes/footer.php"; +?> diff --git a/app/fifo/v_fifo_edit.php b/app/fifo/v_fifo_edit.php new file mode 100644 index 0000000000..ef51907d1b --- /dev/null +++ b/app/fifo/v_fifo_edit.php @@ -0,0 +1,515 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +require_once "includes/paging.php"; +if (permission_exists('fifo_add') || permission_exists('fifo_edit')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +//set the action to an add or an update + if (isset($_REQUEST["id"])) { + $action = "update"; + $dialplan_uuid = check_str($_REQUEST["id"]); + } + else { + $action = "add"; + } + +//get http values and set them as variables + if (count($_POST)>0) { + //$domain_uuid = check_str($_POST["domain_uuid"]); + $dialplan_name = check_str($_POST["dialplan_name"]); + $dialplan_order = check_str($_POST["dialplan_order"]); + $dialplan_continue = check_str($_POST["dialplan_continue"]); + $dialplan_context = check_str($_POST["dialplan_context"]); + $dialplan_enabled = check_str($_POST["dialplan_enabled"]); + $dialplan_description = check_str($_POST["dialplan_description"]); + } + +if (count($_POST)>0 && strlen($_POST["persistformvar"]) == 0) { + + $msg = ''; + if ($action == "update") { + $dialplan_uuid = check_str($_POST["dialplan_uuid"]); + } + + //check for all required data + if (strlen($domain_uuid) == 0) { $msg .= "Please provide: domain_uuid
\n"; } + if (strlen($dialplan_name) == 0) { $msg .= "Please provide: Extension Name
\n"; } + if (strlen($dialplan_order) == 0) { $msg .= "Please provide: Order
\n"; } + //if (strlen($dialplan_context) == 0) { $msg .= "Please provide: Context
\n"; } + if (strlen($dialplan_enabled) == 0) { $msg .= "Please provide: Enabled
\n"; } + //if (strlen($dialplan_description) == 0) { $msg .= "Please provide: Description
\n"; } + if (strlen($msg) > 0 && strlen($_POST["persistformvar"]) == 0) { + require_once "includes/header.php"; + require_once "includes/persistformvar.php"; + echo "
\n"; + echo "
\n"; + echo $msg."
"; + echo "
\n"; + persistformvar($_POST); + echo "
\n"; + require_once "includes/footer.php"; + return; + } + + //set the default dialplan_continue to false + if (strlen($dialplan_continue) == 0) { $dialplan_continue = 'false'; } + + //add or update the database + if ($_POST["persistformvar"] != "true") { + if ($action == "add" && permission_exists('fifo_add')) { + $dialplan_context = $_SESSION['context']; + $dialplan_uuid = uuid(); + $sql = "insert into v_dialplans "; + $sql .= "("; + $sql .= "domain_uuid, "; + $sql .= "dialplan_uuid, "; + $sql .= "app_uuid, "; + $sql .= "dialplan_name, "; + $sql .= "dialplan_order, "; + $sql .= "dialplan_continue, "; + $sql .= "dialplan_context, "; + $sql .= "dialplan_enabled, "; + $sql .= "dialplan_description "; + $sql .= ")"; + $sql .= "values "; + $sql .= "("; + $sql .= "'$domain_uuid', "; + $sql .= "'$dialplan_uuid', "; + $sql .= "'16589224-c876-aeb3-f59f-523a1c0801f7', "; + $sql .= "'$dialplan_name', "; + $sql .= "'$dialplan_order', "; + $sql .= "'$dialplan_continue', "; + $sql .= "'$dialplan_context', "; + $sql .= "'$dialplan_enabled', "; + $sql .= "'$dialplan_description' "; + $sql .= ")"; + $db->exec(check_sql($sql)); + unset($sql); + + //synchronize the xml config + save_dialplan_xml(); + + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Add Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + } //if ($action == "add") + + if ($action == "update" && permission_exists('fifo_edit')) { + $sql = "update v_dialplans set "; + $sql .= "domain_uuid = '$domain_uuid', "; + $sql .= "dialplan_name = '$dialplan_name', "; + $sql .= "dialplan_order = '$dialplan_order', "; + $sql .= "dialplan_continue = '$dialplan_continue', "; + $sql .= "dialplan_context = '$dialplan_context', "; + $sql .= "dialplan_enabled = '$dialplan_enabled', "; + $sql .= "dialplan_description = '$dialplan_description' "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and dialplan_uuid = '$dialplan_uuid'"; + $db->exec(check_sql($sql)); + unset($sql); + + //synchronize the xml config + save_dialplan_xml(); + + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Update Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + } //if ($action == "update") + } //if ($_POST["persistformvar"] != "true") +} //(count($_POST)>0 && strlen($_POST["persistformvar"]) == 0) + +//pre-populate the form + if (count($_GET)>0 && $_POST["persistformvar"] != "true") { + $dialplan_uuid = $_GET["id"]; + $sql = ""; + $sql .= "select * from v_dialplans "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and dialplan_uuid = '$dialplan_uuid' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach ($result as &$row) { + $dialplan_name = $row["dialplan_name"]; + $dialplan_order = $row["dialplan_order"]; + $dialplan_continue = $row["dialplan_continue"]; + $dialplan_context = $row["dialplan_context"]; + $dialplan_enabled = $row["dialplan_enabled"]; + $dialplan_description = $row["dialplan_description"]; + break; //limit to 1 row + } + unset ($prep_statement); + } + +//show the header + require_once "includes/header.php"; + +//show the content + echo "
"; + echo "\n"; + echo "\n"; + echo " "; + echo " "; + echo "
\n"; + echo "
"; + + echo "
\n"; + echo "
\n"; + + echo "\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "

\n"; + echo " Queues
\n"; + echo "
\n"; + echo "

\n"; + echo " Queues are used to setup waiting lines for callers. Also known as FIFO Queues.\n"; + echo "

\n"; + echo "
"; + echo "
\n"; + + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + //echo "\n"; + //echo "\n"; + //echo "\n"; + //echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo " \n"; + echo " \n"; + echo " "; + echo "
\n"; + echo " Name:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "\n"; + echo "
\n"; + echo " Order:\n"; + echo "\n"; + echo " \n"; + //echo " \n"; + echo "
\n"; + echo "\n"; + echo "
\n"; + //echo " Context:\n"; + //echo "\n"; + //echo " \n"; + //echo "
\n"; + //echo "\n"; + //echo "
\n"; + echo " Continue:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Extension Continue in most cases is false.\n"; + echo "
\n"; + echo " Enabled:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "\n"; + echo "
\n"; + echo " Description:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "\n"; + echo "
\n"; + if ($action == "update") { + echo " \n"; + } + echo " \n"; + echo "
"; + echo ""; + + echo "
"; + echo "
"; + + //v_dialplan_details + if ($action == "update" && permission_exists('fifo_edit')) { + echo "
"; + echo "\n"; + + echo "\n"; + echo " "; + echo ""; + echo "
\n"; + echo "
"; + + echo "\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "

Conditions and Actions
\n"; + echo "
\n"; + echo " The following conditions, actions and anti-actions are used in the dialplan to direct \n"; + echo " call flow. Each is processed in order until you reach the action dialplan_detail_tag which tells what action to perform. \n"; + echo " You are not limited to only one condition or action dialplan_detail_tag for a given extension.\n"; + echo "

"; + echo "
\n"; + + $sql = ""; + $sql .= " select * from v_dialplan_details "; + $sql .= " where domain_uuid = '$domain_uuid' "; + $sql .= " and dialplan_uuid = '$dialplan_uuid' "; + $sql .= " and dialplan_detail_tag = 'condition' "; + $sql .= " order by dialplan_detail_order asc"; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + $result_count = count($result); + unset ($prep_statement, $sql); + + $c = 0; + $row_style["0"] = "row_style0"; + $row_style["1"] = "row_style1"; + + echo "
\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + if ($result_count > 0) { + foreach($result as $row) { + echo "\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "\n"; + if ($c==0) { $c=1; } else { $c=0; } + } //end foreach + unset($sql, $result, $row_count); + } //end if results + + //v_dialplan_details dialplan_detail_tag: action + $sql = ""; + $sql .= " select * from v_dialplan_details "; + $sql .= " where domain_uuid = '$domain_uuid' "; + $sql .= " and dialplan_uuid = '$dialplan_uuid' "; + $sql .= " and dialplan_detail_tag = 'action' "; + $sql .= " order by dialplan_detail_order asc"; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + $result_count = count($result); + unset ($prep_statement, $sql); + if ($result_count > 0) { + foreach($result as $row) { + echo "\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "\n"; + if ($c==0) { $c=1; } else { $c=0; } + } //end foreach + unset($sql, $result, $row_count); + } //end if results + + //v_dialplan_details dialplan_detail_tag: anti-action + $sql = ""; + $sql .= " select * from v_dialplan_details "; + $sql .= " where domain_uuid = '$domain_uuid' "; + $sql .= " and dialplan_uuid = '$dialplan_uuid' "; + $sql .= " and dialplan_detail_tag = 'anti-action' "; + $sql .= " order by dialplan_detail_order asc"; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + $result_count = count($result); + unset ($prep_statement, $sql); + if ($result_count == 0) { + //no results + } + else { //received results + foreach($result as $row) { + echo "\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "\n"; + if ($c==0) { $c=1; } else { $c=0; } + } //end foreach + unset($sql, $result, $row_count); + } //end if results + + echo "\n"; + echo "\n"; + echo "\n"; + + echo "
TagTypeDataOrder\n"; + if (permission_exists('fifo_add')) { + echo " $v_link_label_add\n"; + } + echo "
  ".$row[dialplan_detail_tag]."  ".$row[dialplan_detail_type]."  ".$row[dialplan_detail_data]."  ".$row[dialplan_detail_order]."\n"; + if (permission_exists('fifo_edit')) { + echo " $v_link_label_edit\n"; + } + if (permission_exists('fifo_delete')) { + echo " $v_link_label_delete\n"; + } + echo "
  ".$row[dialplan_detail_tag]."  ".$row[dialplan_detail_type]."  ".$row[dialplan_detail_data]."  ".$row[dialplan_detail_order]."\n"; + if (permission_exists('fifo_edit')) { + echo " $v_link_label_edit\n"; + } + if (permission_exists('fifo_delete')) { + echo " $v_link_label_delete\n"; + } + echo "
  ".$row[dialplan_detail_tag]."  ".$row[dialplan_detail_type]."  ".$row[dialplan_detail_data]."  ".$row[dialplan_detail_order]."\n"; + if (permission_exists('fifo_edit')) { + echo " $v_link_label_edit\n"; + } + if (permission_exists('fifo_delete')) { + echo " $v_link_label_delete\n"; + } + echo "
\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "
 $paging_controls\n"; + if (permission_exists('fifo_add')) { + echo " $v_link_label_add\n"; + } + echo "
\n"; + echo "
"; + echo "
"; + echo "

"; + echo "

"; + + echo "
"; + echo "
"; + echo "

"; + } //end if update + +//show the footer + require_once "includes/footer.php"; +?> diff --git a/app/fifo_agents/app_config.php b/app/fifo_agents/app_config.php new file mode 100644 index 0000000000..f070c44b99 --- /dev/null +++ b/app/fifo_agents/app_config.php @@ -0,0 +1,39 @@ + \ No newline at end of file diff --git a/app/fifo_agents/fifo_agent/root.php b/app/fifo_agents/fifo_agent/root.php new file mode 100644 index 0000000000..7b882438ea --- /dev/null +++ b/app/fifo_agents/fifo_agent/root.php @@ -0,0 +1,50 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ + +// make sure the PATH_SEPARATOR is defined + if (!defined("PATH_SEPARATOR")) { + if ( strpos( $_ENV[ "OS" ], "Win" ) !== false ) { define("PATH_SEPARATOR", ";"); } else { define("PATH_SEPARATOR", ":"); } + } + +// make sure the document_root is set + $_SERVER["SCRIPT_FILENAME"] = str_replace("\\", "/", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = str_replace($_SERVER["PHP_SELF"], "", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = realpath($_SERVER["DOCUMENT_ROOT"]); + //echo "DOCUMENT_ROOT: ".$_SERVER["DOCUMENT_ROOT"]."
\n"; + //echo "PHP_SELF: ".$_SERVER["PHP_SELF"]."
\n"; + //echo "SCRIPT_FILENAME: ".$_SERVER["SCRIPT_FILENAME"]."
\n"; + +// if the project directory exists then add it to the include path otherwise add the document root to the include path + if (is_dir($_SERVER["DOCUMENT_ROOT"].'/fusionpbx')){ + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', '/fusionpbx'); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER["DOCUMENT_ROOT"].'/fusionpbx' ); + } + else { + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', ''); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER['DOCUMENT_ROOT'] ); + } + +?> \ No newline at end of file diff --git a/app/fifo_agents/fifo_agent/v_fifo_agent.php b/app/fifo_agents/fifo_agent/v_fifo_agent.php new file mode 100644 index 0000000000..cc0923651d --- /dev/null +++ b/app/fifo_agents/fifo_agent/v_fifo_agent.php @@ -0,0 +1,186 @@ + + Copyright (C) 2010 + All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require_once "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (if_group("agent") || if_group("admin") || if_group("superadmin")) { + //access granted +} +else { + echo "access denied"; + exit; +} +require_once "includes/header.php"; +require_once "includes/paging.php"; + + +$order_by = $_GET["order_by"]; +$order = $_GET["order"]; + echo "
"; + echo "\n"; + echo "\n"; + echo " "; + echo ""; + echo "
\n"; + echo "
"; + + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "
Active Agents 
\n"; + echo "Shows the agents that are currently logged into the queues.

\n"; + echo "
\n"; + echo " login"; + echo " logout"; + echo "
\n"; + + + $sql = ""; + $sql .= " select * from v_fifo_agents "; + $sql .= " where agent_username = '".$_SESSION["username"]."' "; + if (strlen($order_by)> 0) { $sql .= "order by $order_by $order "; } + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + $num_rows = count($result); + unset ($prep_statement, $result, $sql); + $rows_per_page = 10; + $param = ""; + $page = $_GET['page']; + if (strlen($page) == 0) { $page = 0; $_GET['page'] = 0; } + list($paging_controls, $rows_per_page, $var_3) = paging($num_rows, $param, $rows_per_page); + $offset = $rows_per_page * $page; + + $sql = ""; + $sql .= " select * from v_fifo_agents "; + $sql .= " where agent_username = '".$_SESSION["username"]."' "; + if (strlen($order_by)> 0) { $sql .= "order by $order_by $order "; } + //$sql .= " limit $rows_per_page offset $offset "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + $result_count = count($result); + unset ($prep_statement, $sql); + + + + $c = 0; + $row_style["0"] = "row_style0"; + $row_style["1"] = "row_style1"; + + echo "
\n"; + echo "\n"; + + echo "\n"; + echo th_order_by('fifo_name', 'Queue Name', $order_by, $order); + echo th_order_by('agent_username', 'Username', $order_by, $order); + echo th_order_by('agent_priority', 'Agent Priority', $order_by, $order); + echo th_order_by('agent_status', 'Status', $order_by, $order); + echo th_order_by('agent_last_call', 'Last Call', $order_by, $order); + echo th_order_by('agent_contact_number', 'Contact Number', $order_by, $order); + echo "\n"; + echo "\n"; + + if ($result_count == 0) { //no results + } + else { //received results + foreach($result as $row) { + //set the php variables + $agent_last_call = $row[agent_last_call]; + date_default_timezone_set('America/Boise'); + + //format the last call time + $agent_last_call_desc = date("g:i:s a j M Y",$agent_last_call); + + //get the agent status description + $x=1; + $agent_status_desc = ''; + foreach($_SESSION["array_agent_status"] as $value) { + if ($row[agent_status] == $x) { + $agent_status_desc = $value; + } + $x++; + } + echo "\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "\n"; + if ($c==0) { $c=1; } else { $c=0; } + } //end foreach + unset($sql, $result, $row_count); + } //end if results + + + echo "\n"; + echo "\n"; + echo "\n"; + + + echo "
\n"; + //echo " $v_link_label_add\n"; + echo "
".$row[fifo_name]."".$row[agent_username]."".$row[agent_priority]."".$agent_status_desc."".$agent_last_call_desc."".$row[agent_contact_number]."\n"; + echo " $v_link_label_edit\n"; + //echo " $v_link_label_delete\n"; + echo "
\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "
 $paging_controls\n"; + //echo " $v_link_label_add\n"; + echo "
\n"; + echo "
"; + echo "
"; + echo "

"; + echo "

"; + + + echo "
"; + echo "
"; + echo "

"; + + +require_once "includes/footer.php"; +unset ($result_count); +unset ($result); +unset ($key); +unset ($val); +unset ($c); +?> diff --git a/app/fifo_agents/fifo_agent/v_fifo_agent_edit.php b/app/fifo_agents/fifo_agent/v_fifo_agent_edit.php new file mode 100644 index 0000000000..e4b16dfc39 --- /dev/null +++ b/app/fifo_agents/fifo_agent/v_fifo_agent_edit.php @@ -0,0 +1,412 @@ + + Copyright (C) 2010 + All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require_once "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (if_group("agent") || if_group("admin") || if_group("superadmin")) { + //access granted +} +else { + echo "access denied"; + exit; +} + +//save the uuid to a variable from the http GET + $uuid = check_str($_GET["uuid"]); + +//POST to PHP variables + if (count($_POST)>0) { + //$domain_uuid = check_str($_POST["domain_uuid"]); + $resolution_code = check_str($_POST["resolution_code"]); + $transaction_id = check_str($_POST["transaction_id"]); + $action_item = check_str($_POST["action_item"]); + $uuid = check_str($_POST["uuid"]); + $notes = check_str($_POST["notes"]); + //$fifo_name = check_str($_POST["fifo_name"]); + //$agent_username = check_str($_POST["agent_username"]); + //$agent_priority = check_str($_POST["agent_priority"]); + $agent_status = check_str($_POST["agent_status"]); + //$agent_last_call = check_str($_POST["agent_last_call"]); + //$agent_contact_number = check_str($_POST["agent_contact_number"]); + } + +if (count($_POST)>0 && strlen($_POST["persistformvar"]) == 0) { + + $msg = ''; + //check for all required data + if (strlen($domain_uuid) == 0) { $msg .= "Please provide: domain_uuid
\n"; } + //if (strlen($domain_uuid) == 0) { $msg .= "Please provide: domain_uuid
\n"; } + //if (strlen($resolution_code) == 0) { $msg .= "Please provide: Resolution Code
\n"; } + //if (strlen($transaction_id) == 0) { $msg .= "Please provide: Transaction ID
\n"; } + //if (strlen($action_item) == 0) { $msg .= "Please provide: Action Item
\n"; } + //if (strlen($uuid) == 0) { $msg .= "Please provide: UUID
\n"; } + //if (strlen($notes) == 0) { $msg .= "Please provide: Notes
\n"; } + //if (strlen($fifo_name) == 0) { $msg .= "Please provide: Queue Name
\n"; } + //if (strlen($agent_username) == 0) { $msg .= "Please provide: Username
\n"; } + //if (strlen($agent_priority) == 0) { $msg .= "Please provide: Agent Priority
\n"; } + if (strlen($agent_status) == 0) { $msg .= "Please provide: Status
\n"; } + //if (strlen($agent_last_call) == 0) { $msg .= "Please provide: Last Call
\n"; } + //if (strlen($agent_contact_number) == 0) { $msg .= "Please provide: Contact Number
\n"; } + if (strlen($msg) > 0 && strlen($_POST["persistformvar"]) == 0) { + require_once "includes/header.php"; + require_once "includes/persistformvar.php"; + echo "
\n"; + echo "
\n"; + echo $msg."
"; + echo "
\n"; + persistformvar($_POST); + echo "
\n"; + require_once "includes/footer.php"; + return; + } + + //update the database + if ($_POST["persistformvar"] != "true") { + //do not insert {uuid} into the database + if ($uuid == "{uuid}") { $uuid = ''; } + + //add to the agent call logs + if (strlen($uuid) > 0) { + $sql = "insert into v_fifo_agent_call_logs "; + $sql .= "("; + $sql .= "domain_uuid, "; + $sql .= "resolution_code, "; + $sql .= "transaction_id, "; + $sql .= "action_item, "; + $sql .= "uuid, "; + $sql .= "notes, "; + $sql .= "add_user, "; + $sql .= "add_date "; + $sql .= ")"; + $sql .= "values "; + $sql .= "("; + $sql .= "'$domain_uuid', "; + $sql .= "'$resolution_code', "; + $sql .= "'$transaction_id', "; + $sql .= "'$action_item', "; + $sql .= "'$uuid', "; + $sql .= "'$notes', "; + $sql .= "'".$_SESSION["username"]."', "; + $sql .= "now() "; + $sql .= ")"; + $db->exec(check_sql($sql)); + unset($sql); + } + + //update the status + $sql = "update v_fifo_agents set "; + $sql .= "domain_uuid = '$domain_uuid', "; + //$sql .= "fifo_name = '$fifo_name', "; + //$sql .= "agent_username = '$agent_username', "; + //$sql .= "agent_priority = '$agent_priority', "; + $sql .= "agent_status = '$agent_status', "; + $sql .= "agent_status_epoch = ".time()." "; + //$sql .= "agent_last_call = '$agent_last_call', "; + //$sql .= "agent_contact_number = '$agent_contact_number' "; + $sql .= " where agent_username = '".$_SESSION["username"]."' "; + $db->exec(check_sql($sql)); + unset($sql); + + //agent status log + if (strlen($agent_status) > 0) { + $sql = "insert into v_fifo_agent_status_logs "; + $sql .= "("; + $sql .= "domain_uuid, "; + $sql .= "username, "; + $sql .= "agent_status, "; + $sql .= "uuid, "; + $sql .= "add_date "; + $sql .= ")"; + $sql .= "values "; + $sql .= "("; + $sql .= "'$domain_uuid', "; + $sql .= "'".$_SESSION["username"]."', "; + $sql .= "'$agent_status', "; + $sql .= "'$uuid', "; + $sql .= "now() "; + $sql .= ")"; + $db->exec(check_sql($sql)); + unset($sql); + } + + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Update Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + } //if ($_POST["persistformvar"] != "true") { + +} //(count($_POST)>0 && strlen($_POST["persistformvar"]) == 0) + +//pre-populate the form + if ($_POST["persistformvar"] != "true") { + $login_status = false; + $sql = ""; + $sql .= "select * from v_fifo_agents "; + $sql .= " where agent_username = '".$_SESSION["username"]."' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach ($result as &$row) { + $domain_uuid = $row["domain_uuid"]; + //$fifo_name = $row["fifo_name"]; + //$agent_username = $row["agent_username"]; + //$agent_priority = $row["agent_priority"]; + $agent_status = $row["agent_status"]; + $agent_last_call = $row["agent_last_call"]; + $agent_last_uuid = $row["agent_last_uuid"]; + //$agent_contact_number = $row["agent_contact_number"]; + $login_status = true; + break; //limit to 1 row + } + unset ($prep_statement); + } + +//format the last call time + if ($agent_last_call == 0) { + $agent_last_call_desc = ''; + } + else { + $agent_last_call_desc = date("g:i:s a j M Y",$agent_last_call); + } + +//show the content + require_once "includes/header.php"; + +//if the agent_status is available and the uuid has been supplied then refrsh the page + //until the status changes or until a time out has been reached + if ($agent_status == '2' && strlen($uuid) > 0 && $uuid != "{uuid}") { + if (count($_GET["refresh"]) < 10) { + if (substr($_SERVER["SERVER_PROTOCOL"], 0,5) == "HTTP/") { + $meta_refresh_url = "http://".$_SERVER["HTTP_HOST"].$_SERVER["REQUEST_URI"]."&refresh[]=".count($_SERVER["refresh"]); + } + else { + $meta_refresh_url = "https://".$_SERVER["HTTP_HOST"].$_SERVER["REQUEST_URI"]."&refresh[]=".count($_SERVER["refresh"]); + } + echo "\n"; + } + } + + echo "
"; + echo "\n"; + + echo "\n"; + echo " "; + echo " "; + echo "
\n"; + //echo "
"; + + + echo "
\n"; + + echo "
\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + //echo "\n"; + //echo "\n"; + //echo "\n"; + //echo "\n"; + + if ($login_status) { + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + } + + /* + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + */ + + if ($login_status && $agent_status == '9') { + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + } + if ($login_status) { + echo " \n"; + echo " \n"; + echo " "; + } + + + echo "
Agent\n"; + if (!$login_status) { + echo " \n"; + } + if ($login_status) { + echo " \n"; + } + + //echo " \n"; + echo "
\n"; + echo "Enables the agent to set their status.

\n"; + echo "
\n"; + echo " Username:\n"; + echo "\n"; + echo " ".$_SESSION["username"].""; + echo "
\n"; + echo "\n"; + echo "
\n"; + //echo " Last Call:\n"; + //echo "\n"; + //echo $agent_last_call_desc; + //echo " \n"; + //echo "
\n"; + //echo "\n"; + //echo "
\n"; + echo " Status:\n"; + echo "\n"; + //generate the agent status select list + $sql = "SELECT var_name, var_value FROM v_vars "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and var_cat = 'Queues Agent Status' "; + $sql .= "and var_name not like 'system%' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + echo ""; + $_SESSION["array_agent_status"] = ""; + if (!is_array($_SESSION["array_agent_status"])) { + foreach($result as $field) { + $_SESSION["array_agent_status"][$field[var_value]] = $field[var_name]; + } + } + /* + foreach($result as $field) { + $_SESSION["array_agent_status"][$field[var_value]] = $field[var_name]; + } + + $x=1; + foreach($_SESSION["array_agent_status"] as $value) { + echo "$x $value
\n"; + $x++; + } + */ + unset($sql, $result); + + echo "
\n"; + echo "Enter the status of the Agent.\n"; + echo "
\n"; + echo "  \n"; + echo "\n"; + echo "
\n"; + echo "
\n"; + echo " Contact Number:\n"; + echo "\n"; + echo $agent_contact_number; + //echo " \n"; + echo "
\n"; + //echo "Enter the agent contact number.\n"; + echo "
\n"; + echo " Resolution Code:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the resolution code.\n"; + echo "
\n"; + echo " Transaction ID:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the Transaction ID.\n"; + echo "
\n"; + echo " Action Item:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the Action Item.\n"; + echo "
\n"; + echo " Notes:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the notes.\n"; + echo "
\n"; + if (strlen($uuid) == 0) { + $uuid = $agent_last_uuid; + } + echo " \n"; + echo " \n"; + echo "
"; + echo ""; + + echo "
"; + echo "
"; + + +require_once "includes/footer.php"; +?> diff --git a/app/fifo_agents/fifo_agent/v_fifo_agent_login.php b/app/fifo_agents/fifo_agent/v_fifo_agent_login.php new file mode 100644 index 0000000000..270261dd17 --- /dev/null +++ b/app/fifo_agents/fifo_agent/v_fifo_agent_login.php @@ -0,0 +1,297 @@ + + Copyright (C) 2010 + All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require_once "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (if_group("agent") || if_group("admin") || if_group("superadmin")) { + //access granted +} +else { + echo "access denied"; + exit; +} + +//Action add or update +if (isset($_REQUEST["id"])) { + $action = "update"; + $fifo_agent_id = check_str($_REQUEST["id"]); +} +else { + $action = "add"; +} + +//POST to PHP variables +if (count($_POST)>0) { + //$fifo_name = check_str($_POST["fifo_name"]); + $fifo_agent_profile_id = check_str($_POST["fifo_agent_profile_id"]); + $agent_username = $_SESSION["username"]; + $agent_contact_number = check_str($_POST["agent_contact_number"]); +} + +if (count($_POST)>0 && strlen($_POST["persistformvar"]) == 0) { + + $msg = ''; + + ////recommend moving this to the config.php file + $uploadtempdir = $_ENV["TEMP"]."\\"; + ini_set('upload_tmp_dir', $uploadtempdir); + ////$imagedir = $_ENV["TEMP"]."\\"; + ////$filedir = $_ENV["TEMP"]."\\"; + + if ($action == "update") { + $fifo_agent_id = check_str($_POST["fifo_agent_id"]); + } + + //check for all required data + if (strlen($domain_uuid) == 0) { $msg .= "Please provide: domain_uuid
\n"; } + if (strlen($fifo_agent_profile_id) == 0) { $msg .= "Please provide: profile
\n"; } + //if (strlen($fifo_name) == 0) { $msg .= "Please provide: Queue Name
\n"; } + //if (strlen($agent_username) == 0) { $msg .= "Please provide: Username
\n"; } + //if (strlen($agent_priority) == 0) { $msg .= "Please provide: Agent Priority
\n"; } + if (strlen($agent_contact_number) == 0) { $msg .= "Please provide: Contact Number
\n"; } + if (strlen($msg) > 0 && strlen($_POST["persistformvar"]) == 0) { + require_once "includes/header.php"; + require_once "includes/persistformvar.php"; + echo "
\n"; + echo "
\n"; + echo $msg."
"; + echo "
\n"; + persistformvar($_POST); + echo "
\n"; + require_once "includes/footer.php"; + return; + } + + //add or update the database + if ($_POST["persistformvar"] != "true") { + if ($action == "add") { + + $fifo_agent_profile_member_id = $_GET["id"]; + $sql = ""; + $sql .= "select * from v_fifo_agent_profile_members "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and fifo_agent_profile_id = '$fifo_agent_profile_id' "; + $sql .= "and agent_username = '$agent_username' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach ($result as &$row) { + $fifo_agent_profile_member_id = $row["fifo_agent_profile_member_id"]; + $fifo_agent_profile_id = $row["fifo_agent_profile_id"]; + $fifo_name = $row["fifo_name"]; + $agent_priority = $row["agent_priority"]; + $agent_status = '2'; //available + $agent_last_call = 0; + + $sql = "insert into v_fifo_agents "; + $sql .= "("; + $sql .= "domain_uuid, "; + $sql .= "fifo_name, "; + $sql .= "agent_username, "; + $sql .= "agent_priority, "; + $sql .= "agent_status, "; + $sql .= "agent_status_epoch, "; + $sql .= "agent_last_call, "; + $sql .= "agent_contact_number "; + $sql .= ")"; + $sql .= "values "; + $sql .= "("; + $sql .= "'$domain_uuid', "; + $sql .= "'$fifo_name', "; + $sql .= "'$agent_username', "; + $sql .= "'$agent_priority', "; + $sql .= "'$agent_status', "; + $sql .= "'".time()."', "; + $sql .= "'$agent_last_call', "; + $sql .= "'$agent_contact_number' "; + $sql .= ")"; + $db->exec(check_sql($sql)); + unset($sql); + + //agent status log login + $agent_status = '1'; //login + $sql = "insert into v_fifo_agent_status_logs "; + $sql .= "("; + $sql .= "domain_uuid, "; + $sql .= "username, "; + $sql .= "agent_status, "; + $sql .= "add_date "; + $sql .= ")"; + $sql .= "values "; + $sql .= "("; + $sql .= "'$domain_uuid', "; + $sql .= "'".$_SESSION["username"]."', "; + $sql .= "'$agent_status', "; + $sql .= "now() "; + $sql .= ")"; + $db->exec(check_sql($sql)); + unset($sql); + + } + unset ($prep_statement); + + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Login Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + } //if ($action == "add") + /* + if ($action == "update") { + $sql = "update v_fifo_agents set "; + $sql .= "domain_uuid = '$domain_uuid', "; + $sql .= "fifo_name = '$fifo_name', "; + $sql .= "agent_username = '$agent_username', "; + $sql .= "agent_priority = '$agent_priority', "; + $sql .= "agent_contact_number = '$agent_contact_number' "; + $sql .= "where fifo_agent_id = '$fifo_agent_id'"; + $db->exec(check_sql($sql)); + unset($sql); + + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Update Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + } //if ($action == "update") + */ + } //if ($_POST["persistformvar"] != "true") + +} //(count($_POST)>0 && strlen($_POST["persistformvar"]) == 0) + +//pre-populate the form + /* + if (count($_GET)>0 && $_POST["persistformvar"] != "true") { + $fifo_agent_id = $_GET["id"]; + $sql = ""; + $sql .= "select * from v_fifo_agents "; + $sql .= "where fifo_agent_id = '$fifo_agent_id' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach ($result as &$row) { + $domain_uuid = $row["domain_uuid"]; + $fifo_name = $row["fifo_name"]; + $agent_username = $row["agent_username"]; + $agent_priority = $row["agent_priority"]; + $agent_contact_number = $row["agent_contact_number"]; + break; //limit to 1 row + } + unset ($prep_statement); + } + */ + +//begin the content + require_once "includes/header.php"; + + echo "
"; + echo "\n"; + + echo "\n"; + echo " "; + echo " "; + echo "
\n"; + echo "
"; + + echo "
\n"; + + echo "
\n"; + echo "\n"; + + echo "\n"; + if ($action == "add") { + echo "\n"; + } + //if ($action == "update") { + // echo "\n"; + //} + echo "\n"; + echo "\n"; + + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo " \n"; + echo " \n"; + echo " "; + echo "
Agent LoginAgent Login
\n"; + echo " Profile Name:\n"; + echo "\n"; + + $sql = ""; + $sql .= "select * from v_fifo_agent_profiles "; + $sql .= "where domain_uuid = '$domain_uuid' "; + //$sql .= "and fifo_agent_profile_id = '$fifo_agent_profile_id' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $x = 0; + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + echo "\n"; + unset ($prep_statement); + + + echo "
\n"; + echo " Contact Number:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the agent contact number.\n"; + echo "
\n"; + //if ($action == "update") { + // echo " \n"; + //} + echo " \n"; + echo "
"; + echo ""; + + echo "
"; + echo "
"; + + +require_once "includes/footer.php"; +?> diff --git a/app/fifo_agents/fifo_agent/v_fifo_agent_logout.php b/app/fifo_agents/fifo_agent/v_fifo_agent_logout.php new file mode 100644 index 0000000000..1847a73a59 --- /dev/null +++ b/app/fifo_agents/fifo_agent/v_fifo_agent_logout.php @@ -0,0 +1,74 @@ + + Copyright (C) 2010 + All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require_once "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (if_group("agent") || if_group("admin") || if_group("superadmin")) { + //access granted +} +else { + echo "access denied"; + exit; +} + +//agent logout + $sql = ""; + $sql .= "delete from v_fifo_agents "; + $sql .= "where agent_username = '".$_SESSION["username"]."' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + unset($sql); + +//agent status log login + $agent_status = '0'; //login + $sql = "insert into v_fifo_agent_status_logs "; + $sql .= "("; + $sql .= "domain_uuid, "; + $sql .= "username, "; + $sql .= "agent_status, "; + $sql .= "add_date "; + $sql .= ")"; + $sql .= "values "; + $sql .= "("; + $sql .= "'$domain_uuid', "; + $sql .= "'".$_SESSION["username"]."', "; + $sql .= "'$agent_status', "; + $sql .= "now() "; + $sql .= ")"; + $db->exec(check_sql($sql)); + unset($sql); + +//redirect + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Logout Complete\n"; + echo "
\n"; + +require_once "includes/footer.php"; +return; + +?> \ No newline at end of file diff --git a/app/fifo_agents/fifo_agent/v_fifo_agent_remote.php b/app/fifo_agents/fifo_agent/v_fifo_agent_remote.php new file mode 100644 index 0000000000..26227d3097 --- /dev/null +++ b/app/fifo_agents/fifo_agent/v_fifo_agent_remote.php @@ -0,0 +1,52 @@ + + Copyright (C) 2010 + All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require_once "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (if_group("agent") || if_group("admin") || if_group("superadmin")) { + //access granted +} +else { + echo "access denied"; + exit; +} + +//show the header + require_once "includes/header.php"; + +echo "
\n"; +echo " \n"; +echo "   \n"; +echo "
\n"; + +//show the iframe + echo "\n"; + +//show the footer + require_once "includes/footer.php"; +?> diff --git a/app/fifo_agents/fifo_agent_call_logs/root.php b/app/fifo_agents/fifo_agent_call_logs/root.php new file mode 100644 index 0000000000..7b882438ea --- /dev/null +++ b/app/fifo_agents/fifo_agent_call_logs/root.php @@ -0,0 +1,50 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ + +// make sure the PATH_SEPARATOR is defined + if (!defined("PATH_SEPARATOR")) { + if ( strpos( $_ENV[ "OS" ], "Win" ) !== false ) { define("PATH_SEPARATOR", ";"); } else { define("PATH_SEPARATOR", ":"); } + } + +// make sure the document_root is set + $_SERVER["SCRIPT_FILENAME"] = str_replace("\\", "/", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = str_replace($_SERVER["PHP_SELF"], "", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = realpath($_SERVER["DOCUMENT_ROOT"]); + //echo "DOCUMENT_ROOT: ".$_SERVER["DOCUMENT_ROOT"]."
\n"; + //echo "PHP_SELF: ".$_SERVER["PHP_SELF"]."
\n"; + //echo "SCRIPT_FILENAME: ".$_SERVER["SCRIPT_FILENAME"]."
\n"; + +// if the project directory exists then add it to the include path otherwise add the document root to the include path + if (is_dir($_SERVER["DOCUMENT_ROOT"].'/fusionpbx')){ + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', '/fusionpbx'); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER["DOCUMENT_ROOT"].'/fusionpbx' ); + } + else { + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', ''); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER['DOCUMENT_ROOT'] ); + } + +?> \ No newline at end of file diff --git a/app/fifo_agents/fifo_agent_call_logs/v_fifo_agent_call_logs.php b/app/fifo_agents/fifo_agent_call_logs/v_fifo_agent_call_logs.php new file mode 100644 index 0000000000..825f985a6e --- /dev/null +++ b/app/fifo_agents/fifo_agent_call_logs/v_fifo_agent_call_logs.php @@ -0,0 +1,170 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require_once "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (if_group("admin") || if_group("superadmin")) { + //access granted +} +else { + echo "access denied"; + exit; +} +require_once "includes/header.php"; +require_once "includes/paging.php"; + +$order_by = $_GET["order_by"]; +$order = $_GET["order"]; + echo "
"; + echo "\n"; + echo "\n"; + echo " "; + echo ""; + echo "
\n"; + echo "
"; + + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "
Fifo Agent Call Data 
\n"; + echo "The agent call data show a list of call calls agents have received.

\n"; + echo "
\n"; + + + $sql = ""; + $sql .= " select * from v_fifo_agent_call_logs "; + if (strlen($order_by)> 0) { $sql .= "order by $order_by $order "; } + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + $num_rows = count($result); + unset ($prep_statement, $result, $sql); + $rows_per_page = 10; + $param = ""; + $page = $_GET['page']; + if (strlen($page) == 0) { $page = 0; $_GET['page'] = 0; } + list($paging_controls, $rows_per_page, $var_3) = paging($num_rows, $param, $rows_per_page); + $offset = $rows_per_page * $page; + + $sql = ""; + //$sql .= " select * from v_fifo_agent_call_logs "; + $sql .= " select * from v_fifo_agent_call_data "; + if (strlen($order_by)> 0) { $sql .= "order by $order_by $order "; } + $sql .= " limit $rows_per_page offset $offset "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + $result_count = count($result); + unset ($prep_statement, $sql); + + + $c = 0; + $row_style["0"] = "row_style0"; + $row_style["1"] = "row_style1"; + + echo "
\n"; + echo "\n"; + + echo "\n"; + echo th_order_by('call_uuid', 'Call UUID', $order_by, $order); + echo th_order_by('resolution_code', 'Resolution Code', $order_by, $order); + echo th_order_by('transaction_id', 'Transaction ID', $order_by, $order); + echo th_order_by('action_item', 'Action Item', $order_by, $order); + echo th_order_by('notes', 'Notes', $order_by, $order); + echo th_order_by('add_user', 'Add User', $order_by, $order); + echo th_order_by('add_date', 'Add Date', $order_by, $order); + echo "\n"; + echo "\n"; + + if ($result_count == 0) { //no results + } + else { //received results + foreach($result as $row) { + //print_r( $row ); + echo "\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "\n"; + if ($c==0) { $c=1; } else { $c=0; } + } //end foreach + unset($sql, $result, $row_count); + } //end if results + + + echo "\n"; + echo "\n"; + echo "\n"; + + + echo "
\n"; + echo " $v_link_label_add\n"; + //echo " \n"; + echo "
".$row[call_uuid]."".$row[resolution_code]."".$row[transaction_id]."".$row[action_item]."".$row[notes]."".$row[add_user]."".$row[add_date]."\n"; + echo " $v_link_label_edit\n"; + echo " $v_link_label_delete\n"; + //echo " \n"; + //echo " \n"; + echo "
\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "
 $paging_controls\n"; + echo " $v_link_label_add\n"; + //echo " \n"; + echo "
\n"; + echo "
"; + echo "
"; + echo "

"; + echo "

"; + + + echo "
"; + echo "
"; + echo "

"; + + +require_once "includes/footer.php"; +unset ($result_count); +unset ($result); +unset ($key); +unset ($val); +unset ($c); +?> diff --git a/app/fifo_agents/fifo_agent_call_logs/v_fifo_agent_call_logs.sql b/app/fifo_agents/fifo_agent_call_logs/v_fifo_agent_call_logs.sql new file mode 100644 index 0000000000..dcad41b95a --- /dev/null +++ b/app/fifo_agents/fifo_agent_call_logs/v_fifo_agent_call_logs.sql @@ -0,0 +1 @@ +CREATE TABLE v_fifo_agent_call_logs ( fifo_agent_call_log_id INTEGER PRIMARY KEY, v_id TEXT, resolution_code TEXT, transaction_id TEXT, action_item TEXT, uuid TEXT, notes TEXT, add_user TEXT, add_date TEXT ); diff --git a/app/fifo_agents/fifo_agent_call_logs/v_fifo_agent_call_logs_delete.php b/app/fifo_agents/fifo_agent_call_logs/v_fifo_agent_call_logs_delete.php new file mode 100644 index 0000000000..1b88a20292 --- /dev/null +++ b/app/fifo_agents/fifo_agent_call_logs/v_fifo_agent_call_logs_delete.php @@ -0,0 +1,61 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require_once "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (if_group("admin") || if_group("superadmin")) { + //access granted +} +else { + echo "access denied"; + exit; +} + +if (count($_GET)>0) { + $id = check_str($_GET["id"]); +} + +if (strlen($id)>0) { + $sql = ""; + $sql .= "delete from v_fifo_agent_call_logs "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and fifo_agent_call_log_id = '$id' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + unset($sql); +} + +require_once "includes/header.php"; +echo "\n"; +echo "
\n"; +echo "Delete Complete\n"; +echo "
\n"; + +require_once "includes/footer.php"; +return; + +?> + diff --git a/app/fifo_agents/fifo_agent_call_logs/v_fifo_agent_call_logs_edit.php b/app/fifo_agents/fifo_agent_call_logs/v_fifo_agent_call_logs_edit.php new file mode 100644 index 0000000000..39b2927552 --- /dev/null +++ b/app/fifo_agents/fifo_agent_call_logs/v_fifo_agent_call_logs_edit.php @@ -0,0 +1,299 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require_once "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (if_group("admin") || if_group("superadmin")) { + //access granted +} +else { + echo "access denied"; + exit; +} + +//Action add or update +if (isset($_REQUEST["id"])) { + $action = "update"; + $fifo_agent_call_log_id = check_str($_REQUEST["id"]); +} +else { + $action = "add"; +} + +//POST to PHP variables +if (count($_POST)>0) { + $resolution_code = check_str($_POST["resolution_code"]); + $transaction_id = check_str($_POST["transaction_id"]); + $action_item = check_str($_POST["action_item"]); + $uuid = check_str($_POST["uuid"]); + $notes = check_str($_POST["notes"]); + $add_user = check_str($_POST["add_user"]); + $add_date = check_str($_POST["add_date"]); +} + +if (count($_POST)>0 && strlen($_POST["persistformvar"]) == 0) { + + $msg = ''; + + if ($action == "update") { + $fifo_agent_call_log_id = check_str($_POST["fifo_agent_call_log_id"]); + } + + //check for all required data + //if (strlen($domain_uuid) == 0) { $msg .= "Please provide: domain_uuid
\n"; } + //if (strlen($resolution_code) == 0) { $msg .= "Please provide: Resolution Code
\n"; } + //if (strlen($transaction_id) == 0) { $msg .= "Please provide: Transaction ID
\n"; } + //if (strlen($action_item) == 0) { $msg .= "Please provide: Action Item
\n"; } + //if (strlen($uuid) == 0) { $msg .= "Please provide: UUID
\n"; } + //if (strlen($notes) == 0) { $msg .= "Please provide: Notes
\n"; } + //if (strlen($add_user) == 0) { $msg .= "Please provide: Add User
\n"; } + //if (strlen($add_date) == 0) { $msg .= "Please provide: Add Date
\n"; } + if (strlen($msg) > 0 && strlen($_POST["persistformvar"]) == 0) { + require_once "includes/header.php"; + require_once "includes/persistformvar.php"; + echo "
\n"; + echo "
\n"; + echo $msg."
"; + echo "
\n"; + persistformvar($_POST); + echo "
\n"; + require_once "includes/footer.php"; + return; + } + + //add or update the database + if ($_POST["persistformvar"] != "true") { + if ($action == "add") { + $sql = "insert into v_fifo_agent_call_logs "; + $sql .= "("; + $sql .= "domain_uuid, "; + $sql .= "resolution_code, "; + $sql .= "transaction_id, "; + $sql .= "action_item, "; + $sql .= "uuid, "; + $sql .= "notes, "; + $sql .= "add_user, "; + $sql .= "add_date "; + $sql .= ")"; + $sql .= "values "; + $sql .= "("; + $sql .= "'$domain_uuid', "; + $sql .= "'$resolution_code', "; + $sql .= "'$transaction_id', "; + $sql .= "'$action_item', "; + $sql .= "'$uuid', "; + $sql .= "'$notes', "; + $sql .= "'$add_user', "; + $sql .= "'$add_date' "; + $sql .= ")"; + $db->exec(check_sql($sql)); + unset($sql); + + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Add Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + } //if ($action == "add") + + if ($action == "update") { + $sql = "update v_fifo_agent_call_logs set "; + $sql .= "resolution_code = '$resolution_code', "; + $sql .= "transaction_id = '$transaction_id', "; + $sql .= "action_item = '$action_item', "; + $sql .= "uuid = '$uuid', "; + $sql .= "notes = '$notes', "; + $sql .= "add_user = '$add_user', "; + $sql .= "add_date = '$add_date' "; + $sql .= "where domain_uuid = '$domain_uuid'"; + $sql .= "and fifo_agent_call_log_id = '$fifo_agent_call_log_id'"; + $db->exec(check_sql($sql)); + unset($sql); + + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Update Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + } //if ($action == "update") + } //if ($_POST["persistformvar"] != "true") + +} //(count($_POST)>0 && strlen($_POST["persistformvar"]) == 0) + +//pre-populate the form +if (count($_GET)>0 && $_POST["persistformvar"] != "true") { + $fifo_agent_call_log_id = $_GET["id"]; + $sql = ""; + $sql .= "select * from v_fifo_agent_call_logs "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and fifo_agent_call_log_id = '$fifo_agent_call_log_id' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach ($result as &$row) { + $resolution_code = $row["resolution_code"]; + $transaction_id = $row["transaction_id"]; + $action_item = $row["action_item"]; + $uuid = $row["uuid"]; + $notes = $row["notes"]; + $add_user = $row["add_user"]; + $add_date = $row["add_date"]; + break; //limit to 1 row + } + unset ($prep_statement); +} + +//begin the content + require_once "includes/header.php"; + + + echo "
"; + echo "\n"; + + echo "\n"; + echo " "; + echo " "; + echo "
\n"; + echo "
"; + + + echo "
\n"; + + echo "
\n"; + echo "\n"; + + echo "\n"; + if ($action == "add") { + echo "\n"; + } + if ($action == "update") { + echo "\n"; + } + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo " \n"; + echo " \n"; + echo " "; + echo "
Fifo Agent Call Log AddFifo Agent Call Log Edit
\n"; + echo "The agent call logs show a list of call calls agents have received.

\n"; + echo "
\n"; + echo " Resolution Code:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the resolution code.\n"; + echo "
\n"; + echo " Transaction ID:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the Transaction ID.\n"; + echo "
\n"; + echo " Action Item:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the Action Item.\n"; + echo "
\n"; + echo " UUID:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the UUID.\n"; + echo "
\n"; + echo " Notes:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the notes.\n"; + echo "
\n"; + echo " Add User:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "\n"; + echo "
\n"; + echo " Add Date:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "\n"; + echo "
\n"; + if ($action == "update") { + echo " \n"; + } + echo " \n"; + echo "
"; + echo ""; + + echo "
"; + echo "
"; + + +require_once "includes/footer.php"; +?> diff --git a/app/fifo_agents/fifo_agent_profiles/root.php b/app/fifo_agents/fifo_agent_profiles/root.php new file mode 100644 index 0000000000..7b882438ea --- /dev/null +++ b/app/fifo_agents/fifo_agent_profiles/root.php @@ -0,0 +1,50 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ + +// make sure the PATH_SEPARATOR is defined + if (!defined("PATH_SEPARATOR")) { + if ( strpos( $_ENV[ "OS" ], "Win" ) !== false ) { define("PATH_SEPARATOR", ";"); } else { define("PATH_SEPARATOR", ":"); } + } + +// make sure the document_root is set + $_SERVER["SCRIPT_FILENAME"] = str_replace("\\", "/", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = str_replace($_SERVER["PHP_SELF"], "", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = realpath($_SERVER["DOCUMENT_ROOT"]); + //echo "DOCUMENT_ROOT: ".$_SERVER["DOCUMENT_ROOT"]."
\n"; + //echo "PHP_SELF: ".$_SERVER["PHP_SELF"]."
\n"; + //echo "SCRIPT_FILENAME: ".$_SERVER["SCRIPT_FILENAME"]."
\n"; + +// if the project directory exists then add it to the include path otherwise add the document root to the include path + if (is_dir($_SERVER["DOCUMENT_ROOT"].'/fusionpbx')){ + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', '/fusionpbx'); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER["DOCUMENT_ROOT"].'/fusionpbx' ); + } + else { + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', ''); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER['DOCUMENT_ROOT'] ); + } + +?> \ No newline at end of file diff --git a/app/fifo_agents/fifo_agent_profiles/v_fifo_agent_profile_members.php b/app/fifo_agents/fifo_agent_profiles/v_fifo_agent_profile_members.php new file mode 100644 index 0000000000..689e8013cb --- /dev/null +++ b/app/fifo_agents/fifo_agent_profiles/v_fifo_agent_profile_members.php @@ -0,0 +1,161 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require_once "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (if_group("admin") || if_group("superadmin")) { + //access granted +} +else { + echo "access denied"; + exit; +} +require_once "includes/header.php"; +require_once "includes/paging.php"; + +$order_by = $_GET["order_by"]; +$order = $_GET["order"]; + + echo "
"; + echo "\n"; + echo "\n"; + echo " "; + echo ""; + echo "
\n"; + echo "
"; + + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "
Agent Member List 
\n"; + + + $sql = ""; + $sql .= " select * from v_fifo_agent_profile_members "; + $sql .= " where domain_uuid = '$domain_uuid' "; + $sql .= " and fifo_agent_profile_id = '$fifo_agent_profile_id' "; + if (strlen($order_by)> 0) { $sql .= "order by $order_by $order "; } + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + $num_rows = count($result); + unset ($prep_statement, $result, $sql); + $rows_per_page = 100; + $param = "&id=".$_GET['id']; + $page = $_GET['page']; + if (strlen($page) == 0) { $page = 0; $_GET['page'] = 0; } + list($paging_controls, $rows_per_page, $var_3) = paging($num_rows, $param, $rows_per_page); + $offset = $rows_per_page * $page; + + $sql = ""; + $sql .= " select * from v_fifo_agent_profile_members "; + $sql .= " where domain_uuid = '$domain_uuid' "; + $sql .= " and fifo_agent_profile_id = '$fifo_agent_profile_id' "; + if (strlen($order_by)> 0) { $sql .= "order by $order_by $order "; } + $sql .= " limit $rows_per_page offset $offset "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + $result_count = count($result); + unset ($prep_statement, $sql); + + + $c = 0; + $row_style["0"] = "row_style0"; + $row_style["1"] = "row_style1"; + + echo "
\n"; + echo "\n"; + + echo "\n"; + echo th_order_by('fifo_name', 'FIFO Name', $order_by, $order); + echo th_order_by('agent_username', 'Agent', $order_by, $order); + echo th_order_by('agent_priority', 'Agent Priority', $order_by, $order); + echo "\n"; + echo "\n"; + + if ($result_count == 0) { //no results + } + else { //received results + foreach($result as $row) { + //print_r( $row ); + echo "\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "\n"; + if ($c==0) { $c=1; } else { $c=0; } + } //end foreach + unset($sql, $result, $row_count); + } //end if results + + + echo "\n"; + echo "\n"; + echo "\n"; + + + echo "
\n"; + echo " $v_link_label_add\n"; + //echo " \n"; + echo "
".$row[fifo_name]."".$row[agent_username]."".$row[agent_priority]."\n"; + echo " $v_link_label_edit\n"; + echo " $v_link_label_delete\n"; + //echo " \n"; + //echo " \n"; + echo "
\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "
 $paging_controls\n"; + echo " $v_link_label_add\n"; + //echo " \n"; + echo "
\n"; + echo "
"; + echo "
"; + echo "

"; + echo "

"; + + + echo "
"; + echo "
"; + echo "

"; + + +require_once "includes/footer.php"; +unset ($result_count); +unset ($result); +unset ($key); +unset ($val); +unset ($c); +?> diff --git a/app/fifo_agents/fifo_agent_profiles/v_fifo_agent_profile_members.sql b/app/fifo_agents/fifo_agent_profiles/v_fifo_agent_profile_members.sql new file mode 100644 index 0000000000..8d5c990d3e --- /dev/null +++ b/app/fifo_agents/fifo_agent_profiles/v_fifo_agent_profile_members.sql @@ -0,0 +1 @@ +CREATE TABLE v_fifo_agent_profile_members (fifo_agent_profile_member_id INTEGER PRIMARY KEY, v_id NUMBER, fifo_agent_profile_id NUMBER, fifo_name TEXT, agent_priority TEXT, agent_username TEXT); diff --git a/app/fifo_agents/fifo_agent_profiles/v_fifo_agent_profile_members_delete.php b/app/fifo_agents/fifo_agent_profiles/v_fifo_agent_profile_members_delete.php new file mode 100644 index 0000000000..2de2f84828 --- /dev/null +++ b/app/fifo_agents/fifo_agent_profiles/v_fifo_agent_profile_members_delete.php @@ -0,0 +1,62 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require_once "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (if_group("admin") || if_group("superadmin")) { + //access granted +} +else { + echo "access denied"; + exit; +} + +if (count($_GET)>0) { + $id = check_str($_GET["id"]); + $fifo_agent_profile_id = check_str($_GET["fifo_agent_profile_id"]); +} + +if (strlen($id)>0) { + $sql = ""; + $sql .= "delete from v_fifo_agent_profile_members "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and fifo_agent_profile_member_id = '$id' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + unset($sql); +} + +require_once "includes/header.php"; +echo "\n"; +echo "
\n"; +echo "Delete Complete\n"; +echo "
\n"; + +require_once "includes/footer.php"; +return; + +?> + diff --git a/app/fifo_agents/fifo_agent_profiles/v_fifo_agent_profile_members_edit.php b/app/fifo_agents/fifo_agent_profiles/v_fifo_agent_profile_members_edit.php new file mode 100644 index 0000000000..5d8738660a --- /dev/null +++ b/app/fifo_agents/fifo_agent_profiles/v_fifo_agent_profile_members_edit.php @@ -0,0 +1,358 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require_once "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (if_group("admin") || if_group("superadmin")) { + //access granted +} +else { + echo "access denied"; + exit; +} + +//Action add or update +if (isset($_REQUEST["id"])) { + $action = "update"; + $fifo_agent_profile_member_id = check_str($_REQUEST["id"]); +} +else { + $action = "add"; +} + +if (strlen($_GET["fifo_agent_profile_id"]) > 0) { + $fifo_agent_profile_id = check_str($_GET["fifo_agent_profile_id"]); +} + +//POST to PHP variables +if (count($_POST)>0) { + //$domain_uuid = check_str($_POST["domain_uuid"]); + $fifo_agent_profile_id = check_str($_POST["fifo_agent_profile_id"]); + $fifo_name = check_str($_POST["fifo_name"]); + $agent_priority = check_str($_POST["agent_priority"]); + $agent_username = check_str($_POST["agent_username"]); +} + +if (count($_POST)>0 && strlen($_POST["persistformvar"]) == 0) { + + $msg = ''; + + ////recommend moving this to the config.php file + $uploadtempdir = $_ENV["TEMP"]."\\"; + ini_set('upload_tmp_dir', $uploadtempdir); + ////$imagedir = $_ENV["TEMP"]."\\"; + ////$filedir = $_ENV["TEMP"]."\\"; + + if ($action == "update") { + $fifo_agent_profile_member_id = check_str($_POST["fifo_agent_profile_member_id"]); + } + + //check for all required data + if (strlen($domain_uuid) == 0) { $msg .= "Please provide: domain_uuid
\n"; } + if (strlen($fifo_agent_profile_id) == 0) { $msg .= "Please provide: fifo_agent_profile_id
\n"; } + //if (strlen($fifo_name) == 0) { $msg .= "Please provide: FIFO Name
\n"; } + //if (strlen($agent_priority) == 0) { $msg .= "Please provide: Agent Priority
\n"; } + //if (strlen($agent_username) == 0) { $msg .= "Please provide: Agent
\n"; } + if (strlen($msg) > 0 && strlen($_POST["persistformvar"]) == 0) { + require_once "includes/header.php"; + require_once "includes/persistformvar.php"; + echo "
\n"; + echo "
\n"; + echo $msg."
"; + echo "
\n"; + persistformvar($_POST); + echo "
\n"; + require_once "includes/footer.php"; + return; + } + +//add or update the database +if ($_POST["persistformvar"] != "true") { + if ($action == "add") { + $sql = "insert into v_fifo_agent_profile_members "; + $sql .= "("; + $sql .= "domain_uuid, "; + $sql .= "fifo_agent_profile_id, "; + $sql .= "fifo_name, "; + $sql .= "agent_priority, "; + $sql .= "agent_username "; + $sql .= ")"; + $sql .= "values "; + $sql .= "("; + $sql .= "'$domain_uuid', "; + $sql .= "'$fifo_agent_profile_id', "; + $sql .= "'$fifo_name', "; + $sql .= "'$agent_priority', "; + $sql .= "'$agent_username' "; + $sql .= ")"; + $db->exec(check_sql($sql)); + unset($sql); + + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Add Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + } //if ($action == "add") + + if ($action == "update") { + $sql = "update v_fifo_agent_profile_members set "; + $sql .= "fifo_agent_profile_id = '$fifo_agent_profile_id', "; + $sql .= "fifo_name = '$fifo_name', "; + $sql .= "agent_priority = '$agent_priority', "; + $sql .= "agent_username = '$agent_username' "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and fifo_agent_profile_member_id = '$fifo_agent_profile_member_id'"; + $db->exec(check_sql($sql)); + unset($sql); + + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Update Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + } //if ($action == "update") +} //if ($_POST["persistformvar"] != "true") { + +} //(count($_POST)>0 && strlen($_POST["persistformvar"]) == 0) + +//pre-populate the form +if (count($_GET)>0 && $_POST["persistformvar"] != "true") { + $fifo_agent_profile_member_id = $_GET["id"]; + $sql = ""; + $sql .= "select * from v_fifo_agent_profile_members "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and fifo_agent_profile_member_id = '$fifo_agent_profile_member_id' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach ($result as &$row) { + $fifo_agent_profile_id = $row["fifo_agent_profile_id"]; + $fifo_name = $row["fifo_name"]; + $agent_priority = $row["agent_priority"]; + $agent_username = $row["agent_username"]; + break; //limit to 1 row + } + unset ($prep_statement); +} + + + require_once "includes/header.php"; + + + echo "
"; + echo "\n"; + + echo "\n"; + echo " "; + echo " "; + echo "
\n"; + echo "
"; + + + + + echo "
\n"; + + echo "
\n"; + echo "\n"; + + echo "\n"; + if ($action == "add") { + echo "\n"; + } + if ($action == "update") { + echo "\n"; + } + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo " \n"; + echo " \n"; + echo " "; + echo "
Agent Member List AddAgent Member List Edit
\n"; + echo " Queue Name:\n"; + echo "\n"; + //echo " \n"; + + //generate the fifo name select list + $sql = ""; + $sql .= "select * from v_dialplan_details "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $x = 0; + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + echo "\n"; + unset ($prep_statement); + + + echo "
\n"; + echo "Select the queue name.\n"; + echo "
\n"; + echo " Agent:\n"; + echo "\n"; + //echo " \n"; + + //generate the user list + $sql = "SELECT * FROM v_users "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + + echo ""; + unset($sql, $result); + + echo "
\n"; + echo "Select the agent.\n"; + echo "
\n"; + echo " Agent Priority:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Select the agent priority.\n"; + echo "
\n"; + echo " \n"; + if ($action == "update") { + echo " \n"; + } + echo " \n"; + echo "
"; + echo ""; + + echo "
"; + echo "
"; + + +require_once "includes/footer.php"; +?> diff --git a/app/fifo_agents/fifo_agent_profiles/v_fifo_agent_profiles.php b/app/fifo_agents/fifo_agent_profiles/v_fifo_agent_profiles.php new file mode 100644 index 0000000000..569b20430c --- /dev/null +++ b/app/fifo_agents/fifo_agent_profiles/v_fifo_agent_profiles.php @@ -0,0 +1,156 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require_once "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (if_group("admin") || if_group("superadmin")) { + //access granted +} +else { + echo "access denied"; + exit; +} +require_once "includes/header.php"; +require_once "includes/paging.php"; + +$order_by = $_GET["order_by"]; +$order = $_GET["order"]; + echo "
"; + echo "\n"; + echo "\n"; + echo " "; + echo ""; + echo "
\n"; + echo "
"; + + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "
Agent Profile List 
\n"; + + + $sql = ""; + $sql .= "select * from v_fifo_agent_profiles "; + $sql .= "where domain_uuid = '$domain_uuid' "; + if (strlen($order_by)> 0) { $sql .= "order by $order_by $order "; } + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + $num_rows = count($result); + unset ($prep_statement, $result, $sql); + $rows_per_page = 10; + $param = ""; + $page = $_GET['page']; + if (strlen($page) == 0) { $page = 0; $_GET['page'] = 0; } + list($paging_controls, $rows_per_page, $var_3) = paging($num_rows, $param, $rows_per_page); + $offset = $rows_per_page * $page; + + $sql = ""; + $sql .= "select * from v_fifo_agent_profiles "; + $sql .= "where domain_uuid = '$domain_uuid' "; + if (strlen($order_by)> 0) { $sql .= "order by $order_by $order "; } + $sql .= " limit $rows_per_page offset $offset "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + $result_count = count($result); + unset ($prep_statement, $sql); + + + $c = 0; + $row_style["0"] = "row_style0"; + $row_style["1"] = "row_style1"; + + echo "
\n"; + echo "\n"; + + echo "\n"; + echo th_order_by('profile_name', 'Profile Name', $order_by, $order); + echo th_order_by('profile_desc', 'Description', $order_by, $order); + echo "\n"; + echo "\n"; + + if ($result_count == 0) { //no results + } + else { //received results + foreach($result as $row) { + //print_r( $row ); + echo "\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "\n"; + if ($c==0) { $c=1; } else { $c=0; } + } //end foreach + unset($sql, $result, $row_count); + } //end if results + + + echo "\n"; + echo "\n"; + echo "\n"; + + + echo "
\n"; + echo " $v_link_label_add\n"; + //echo " \n"; + echo "
".$row[profile_name]."".$row[profile_desc]."\n"; + echo " $v_link_label_edit\n"; + echo " $v_link_label_delete\n"; + //echo " \n"; + //echo " \n"; + echo "
\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "
 $paging_controls\n"; + echo " $v_link_label_add\n"; + //echo " \n"; + echo "
\n"; + echo "
"; + echo "
"; + echo "

"; + echo "

"; + + + echo "
"; + echo "
"; + echo "

"; + + +require_once "includes/footer.php"; +unset ($result_count); +unset ($result); +unset ($key); +unset ($val); +unset ($c); +?> diff --git a/app/fifo_agents/fifo_agent_profiles/v_fifo_agent_profiles.sql b/app/fifo_agents/fifo_agent_profiles/v_fifo_agent_profiles.sql new file mode 100644 index 0000000000..07ab882606 --- /dev/null +++ b/app/fifo_agents/fifo_agent_profiles/v_fifo_agent_profiles.sql @@ -0,0 +1 @@ +CREATE TABLE v_fifo_agent_profiles (fifo_agent_profile_id INTEGER PRIMARY KEY, v_id NUMBER, profile_name TEXT, profile_desc TEXT); diff --git a/app/fifo_agents/fifo_agent_profiles/v_fifo_agent_profiles_delete.php b/app/fifo_agents/fifo_agent_profiles/v_fifo_agent_profiles_delete.php new file mode 100644 index 0000000000..b02c5e21eb --- /dev/null +++ b/app/fifo_agents/fifo_agent_profiles/v_fifo_agent_profiles_delete.php @@ -0,0 +1,72 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require_once "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (if_group("admin") || if_group("superadmin")) { + //access granted +} +else { + echo "access denied"; + exit; +} + +if (count($_GET)>0) { + $id = check_str($_GET["id"]); +} + +if (strlen($id)>0) { + + //delete child data + $sql = ""; + $sql .= "delete from v_fifo_agent_profile_members "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and fifo_agent_profile_id = '$id' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + unset($sql, $prep_statement); + + //delete parent data + $sql = ""; + $sql .= "delete from v_fifo_agent_profiles "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and fifo_agent_profile_id = '$id' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + unset($sql, $prep_statement); +} + +require_once "includes/header.php"; +echo "\n"; +echo "
\n"; +echo "Delete Complete\n"; +echo "
\n"; + +require_once "includes/footer.php"; +return; + +?> + diff --git a/app/fifo_agents/fifo_agent_profiles/v_fifo_agent_profiles_edit.php b/app/fifo_agents/fifo_agent_profiles/v_fifo_agent_profiles_edit.php new file mode 100644 index 0000000000..89381c9159 --- /dev/null +++ b/app/fifo_agents/fifo_agent_profiles/v_fifo_agent_profiles_edit.php @@ -0,0 +1,222 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require_once "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (if_group("admin") || if_group("superadmin")) { + //access granted +} +else { + echo "access denied"; + exit; +} + +//Action add or update +if (isset($_REQUEST["id"])) { + $action = "update"; + $fifo_agent_profile_id = check_str($_REQUEST["id"]); +} +else { + $action = "add"; +} + +//POST to PHP variables +if (count($_POST)>0) { + //$domain_uuid = check_str($_POST["domain_uuid"]); + $profile_name = check_str($_POST["profile_name"]); + $profile_desc = check_str($_POST["profile_desc"]); +} + +if (count($_POST)>0 && strlen($_POST["persistformvar"]) == 0) { + + $msg = ''; + + ////recommend moving this to the config.php file + $uploadtempdir = $_ENV["TEMP"]."\\"; + ini_set('upload_tmp_dir', $uploadtempdir); + ////$imagedir = $_ENV["TEMP"]."\\"; + ////$filedir = $_ENV["TEMP"]."\\"; + + if ($action == "update") { + $fifo_agent_profile_id = check_str($_POST["fifo_agent_profile_id"]); + } + + //check for all required data + if (strlen($domain_uuid) == 0) { $msg .= "Please provide: domain_uuid
\n"; } + if (strlen($profile_name) == 0) { $msg .= "Please provide: Profile Name
\n"; } + if (strlen($profile_desc) == 0) { $msg .= "Please provide: Description
\n"; } + if (strlen($msg) > 0 && strlen($_POST["persistformvar"]) == 0) { + require_once "includes/header.php"; + require_once "includes/persistformvar.php"; + echo "
\n"; + echo "
\n"; + echo $msg."
"; + echo "
\n"; + persistformvar($_POST); + echo "
\n"; + require_once "includes/footer.php"; + return; + } + + + //add or update the database + if ($_POST["persistformvar"] != "true") { + if ($action == "add") { + $sql = "insert into v_fifo_agent_profiles "; + $sql .= "("; + $sql .= "domain_uuid, "; + $sql .= "profile_name, "; + $sql .= "profile_desc "; + $sql .= ")"; + $sql .= "values "; + $sql .= "("; + $sql .= "'$domain_uuid', "; + $sql .= "'$profile_name', "; + $sql .= "'$profile_desc' "; + $sql .= ")"; + $db->exec(check_sql($sql)); + unset($sql); + + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Add Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + } //if ($action == "add") + + if ($action == "update") { + $sql = "update v_fifo_agent_profiles set "; + $sql .= "domain_uuid = '$domain_uuid', "; + $sql .= "profile_name = '$profile_name', "; + $sql .= "profile_desc = '$profile_desc' "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and fifo_agent_profile_id = '$fifo_agent_profile_id'"; + $db->exec(check_sql($sql)); + unset($sql); + + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Update Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + } //if ($action == "update") + } //if ($_POST["persistformvar"] != "true") + +} //(count($_POST)>0 && strlen($_POST["persistformvar"]) == 0) + +//pre-populate the form +if (count($_GET)>0 && $_POST["persistformvar"] != "true") { + $fifo_agent_profile_id = $_GET["id"]; + $sql = ""; + $sql .= "select * from v_fifo_agent_profiles "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and fifo_agent_profile_id = '$fifo_agent_profile_id' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach ($result as &$row) { + $domain_uuid = $row["domain_uuid"]; + $profile_name = $row["profile_name"]; + $profile_desc = $row["profile_desc"]; + break; //limit to 1 row + } + unset ($prep_statement); +} + + + require_once "includes/header.php"; + + echo "
"; + echo "\n"; + + echo "\n"; + echo " "; + echo " "; + echo "
\n"; + echo "
"; + + + echo "
\n"; + + echo "
\n"; + echo "\n"; + + echo "\n"; + if ($action == "add") { + echo "\n"; + } + if ($action == "update") { + echo "\n"; + } + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo " \n"; + echo " \n"; + echo " "; + echo "
Agent Profile AddAgent Profile Edit
\n"; + echo " Profile Name:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the profile name.\n"; + echo "
\n"; + echo " Description:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the description.\n"; + echo "
\n"; + if ($action == "update") { + echo " \n"; + } + echo " \n"; + echo "
"; + echo ""; + + if ($action == "update") { + require "v_fifo_agent_profile_members.php"; + } + + echo "
"; + echo "
"; + + +require_once "includes/footer.php"; +?> diff --git a/app/fifo_agents/fifo_agent_status_logs/root.php b/app/fifo_agents/fifo_agent_status_logs/root.php new file mode 100644 index 0000000000..7b882438ea --- /dev/null +++ b/app/fifo_agents/fifo_agent_status_logs/root.php @@ -0,0 +1,50 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ + +// make sure the PATH_SEPARATOR is defined + if (!defined("PATH_SEPARATOR")) { + if ( strpos( $_ENV[ "OS" ], "Win" ) !== false ) { define("PATH_SEPARATOR", ";"); } else { define("PATH_SEPARATOR", ":"); } + } + +// make sure the document_root is set + $_SERVER["SCRIPT_FILENAME"] = str_replace("\\", "/", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = str_replace($_SERVER["PHP_SELF"], "", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = realpath($_SERVER["DOCUMENT_ROOT"]); + //echo "DOCUMENT_ROOT: ".$_SERVER["DOCUMENT_ROOT"]."
\n"; + //echo "PHP_SELF: ".$_SERVER["PHP_SELF"]."
\n"; + //echo "SCRIPT_FILENAME: ".$_SERVER["SCRIPT_FILENAME"]."
\n"; + +// if the project directory exists then add it to the include path otherwise add the document root to the include path + if (is_dir($_SERVER["DOCUMENT_ROOT"].'/fusionpbx')){ + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', '/fusionpbx'); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER["DOCUMENT_ROOT"].'/fusionpbx' ); + } + else { + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', ''); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER['DOCUMENT_ROOT'] ); + } + +?> \ No newline at end of file diff --git a/app/fifo_agents/fifo_agent_status_logs/v_fifo_agent_status_logs.php b/app/fifo_agents/fifo_agent_status_logs/v_fifo_agent_status_logs.php new file mode 100644 index 0000000000..e26d8177dc --- /dev/null +++ b/app/fifo_agents/fifo_agent_status_logs/v_fifo_agent_status_logs.php @@ -0,0 +1,185 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require_once "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (if_group("admin") || if_group("superadmin")) { + //access granted +} +else { + echo "access denied"; + exit; +} +require_once "includes/header.php"; +require_once "includes/paging.php"; + +$order_by = $_GET["order_by"]; +$order = $_GET["order"]; + +//get the agent status session array + //unset($_SESSION["array_agent_status"]); + if (!is_array($_SESSION["array_agent_status"])) { + $sql = "SELECT var_name, var_value FROM v_vars "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and var_cat = 'Queues Agent Status' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach($result as $field) { + $_SESSION["array_agent_status"][$field[var_value]] = $field[var_name]; + } + } + +//send the content to the browser + echo "
"; + echo "\n"; + echo "\n"; + echo " "; + echo ""; + echo "
\n"; + echo "
"; + + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "
Fifo Agent Status Log List 
\n"; + echo "Agent Status History

\n"; + echo "
\n"; + + + $sql = ""; + $sql .= " select * from v_fifo_agent_status_logs "; + if (strlen($order_by)> 0) { $sql .= "order by $order_by $order "; } + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + $num_rows = count($result); + unset ($prep_statement, $result, $sql); + $rows_per_page = 100; + $param = ""; + $page = $_GET['page']; + if (strlen($page) == 0) { $page = 0; $_GET['page'] = 0; } + list($paging_controls, $rows_per_page, $var_3) = paging($num_rows, $param, $rows_per_page); + $offset = $rows_per_page * $page; + + $sql = ""; + $sql .= " select * from v_fifo_agent_status_logs "; + if (strlen($order_by)> 0) { $sql .= "order by $order_by $order "; } + $sql .= " limit $rows_per_page offset $offset "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + $result_count = count($result); + unset ($prep_statement, $sql); + + + $c = 0; + $row_style["0"] = "row_style0"; + $row_style["1"] = "row_style1"; + + echo "
\n"; + echo "\n"; + + echo "\n"; + echo th_order_by('username', 'Username', $order_by, $order); + echo th_order_by('agent_status', 'Status', $order_by, $order); + echo th_order_by('uuid', 'UUID', $order_by, $order); + echo th_order_by('add_date', 'Add Date', $order_by, $order); + echo "\n"; + echo "\n"; + + if ($result_count == 0) { //no results + } + else { //received results + foreach($result as $row) { + //print_r( $row ); + //set the php variables + $agent_status = $row[agent_status]; + + //get the agent description + $agent_status_desc = $_SESSION["array_agent_status"][$agent_status]; + + echo "\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "\n"; + if ($c==0) { $c=1; } else { $c=0; } + } //end foreach + unset($sql, $result, $row_count); + } //end if results + + + echo "\n"; + echo "\n"; + echo "\n"; + + + echo "
\n"; + echo " $v_link_label_add\n"; + //echo " \n"; + echo "
".$row[username]."".$agent_status_desc."".$row[uuid]." ".$row[add_date]."\n"; + echo " $v_link_label_edit\n"; + echo " $v_link_label_delete\n"; + //echo " \n"; + //echo " \n"; + echo "
\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "
 $paging_controls\n"; + echo " $v_link_label_add\n"; + //echo " \n"; + echo "
\n"; + echo "
"; + echo "
"; + echo "

"; + echo "

"; + + + echo "
"; + echo "
"; + echo "

"; + + +require_once "includes/footer.php"; +unset ($result_count); +unset ($result); +unset ($key); +unset ($val); +unset ($c); +?> diff --git a/app/fifo_agents/fifo_agent_status_logs/v_fifo_agent_status_logs.sql b/app/fifo_agents/fifo_agent_status_logs/v_fifo_agent_status_logs.sql new file mode 100644 index 0000000000..5d8c919e35 --- /dev/null +++ b/app/fifo_agents/fifo_agent_status_logs/v_fifo_agent_status_logs.sql @@ -0,0 +1 @@ +CREATE TABLE v_fifo_agent_status_logs (fifo_agent_status_log_id INTEGER PRIMARY KEY, v_id NUMBER, username TEXT, agent_status TEXT, uuid TEXT, add_date TEXT) diff --git a/app/fifo_agents/fifo_agent_status_logs/v_fifo_agent_status_logs_delete.php b/app/fifo_agents/fifo_agent_status_logs/v_fifo_agent_status_logs_delete.php new file mode 100644 index 0000000000..2ab49480f8 --- /dev/null +++ b/app/fifo_agents/fifo_agent_status_logs/v_fifo_agent_status_logs_delete.php @@ -0,0 +1,60 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require_once "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (if_group("admin") || if_group("superadmin")) { + //access granted +} +else { + echo "access denied"; + exit; +} + +if (count($_GET)>0) { + $id = check_str($_GET["id"]); +} + +if (strlen($id)>0) { + $sql = ""; + $sql .= "delete from v_fifo_agent_status_logs "; + $sql .= "where fifo_agent_status_log_id = '$id' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + unset($sql); +} + +require_once "includes/header.php"; +echo "\n"; +echo "
\n"; +echo "Delete Complete\n"; +echo "
\n"; + +require_once "includes/footer.php"; +return; + +?> + diff --git a/app/fifo_agents/fifo_agent_status_logs/v_fifo_agent_status_logs_edit.php b/app/fifo_agents/fifo_agent_status_logs/v_fifo_agent_status_logs_edit.php new file mode 100644 index 0000000000..93fe33aa9f --- /dev/null +++ b/app/fifo_agents/fifo_agent_status_logs/v_fifo_agent_status_logs_edit.php @@ -0,0 +1,262 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require_once "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (if_group("admin") || if_group("superadmin")) { + //access granted +} +else { + echo "access denied"; + exit; +} + +//action add or update + if (isset($_REQUEST["id"])) { + $action = "update"; + $fifo_agent_status_log_id = check_str($_REQUEST["id"]); + } + else { + $action = "add"; + } + +//POST to PHP variables + if (count($_POST)>0) { + $username = check_str($_POST["username"]); + $agent_status = check_str($_POST["agent_status"]); + $uuid = check_str($_POST["uuid"]); + $add_date = check_str($_POST["add_date"]); + } + +if (count($_POST)>0 && strlen($_POST["persistformvar"]) == 0) { + + $msg = ''; + if ($action == "update") { + $fifo_agent_status_log_id = check_str($_POST["fifo_agent_status_log_id"]); + } + + //check for all required data + //if (strlen($domain_uuid) == 0) { $msg .= "Please provide: domain_uuid
\n"; } + //if (strlen($username) == 0) { $msg .= "Please provide: Username
\n"; } + //if (strlen($agent_status) == 0) { $msg .= "Please provide: Status
\n"; } + //if (strlen($uuid) == 0) { $msg .= "Please provide: UUID
\n"; } + //if (strlen($add_date) == 0) { $msg .= "Please provide: Add Date
\n"; } + if (strlen($msg) > 0 && strlen($_POST["persistformvar"]) == 0) { + require_once "includes/header.php"; + require_once "includes/persistformvar.php"; + echo "
\n"; + echo "
\n"; + echo $msg."
"; + echo "
\n"; + persistformvar($_POST); + echo "
\n"; + require_once "includes/footer.php"; + return; + } + + + //add or update the database + if ($_POST["persistformvar"] != "true") { + if ($action == "add") { + $sql = "insert into v_fifo_agent_status_logs "; + $sql .= "("; + $sql .= "domain_uuid, "; + $sql .= "username, "; + $sql .= "agent_status, "; + $sql .= "uuid, "; + $sql .= "add_date "; + $sql .= ")"; + $sql .= "values "; + $sql .= "("; + $sql .= "'$domain_uuid', "; + $sql .= "'$username', "; + $sql .= "'$agent_status', "; + $sql .= "'$uuid', "; + $sql .= "now() "; + $sql .= ")"; + $db->exec(check_sql($sql)); + unset($sql); + + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Add Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + } //if ($action == "add") + + if ($action == "update") { + $sql = "update v_fifo_agent_status_logs set "; + $sql .= "domain_uuid = '$domain_uuid', "; + $sql .= "username = '$username', "; + $sql .= "agent_status = '$agent_status', "; + $sql .= "uuid = '$uuid', "; + $sql .= "add_date = '$add_date' "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and fifo_agent_status_log_id = '$fifo_agent_status_log_id'"; + $db->exec(check_sql($sql)); + unset($sql); + + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Update Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + } //if ($action == "update") + } //if ($_POST["persistformvar"] != "true") + +} //(count($_POST)>0 && strlen($_POST["persistformvar"]) == 0) + + +//pre-populate the form + if (count($_GET)>0 && $_POST["persistformvar"] != "true") { + $fifo_agent_status_log_id = $_GET["id"]; + $sql = ""; + $sql .= "select * from v_fifo_agent_status_logs "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and fifo_agent_status_log_id = '$fifo_agent_status_log_id' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach ($result as &$row) { + $domain_uuid = $row["domain_uuid"]; + $username = $row["username"]; + $agent_status = $row["agent_status"]; + $uuid = $row["uuid"]; + $add_date = $row["add_date"]; + break; //limit to 1 row + } + unset ($prep_statement); + } + + +//send the content + require_once "includes/header.php"; + + echo "
"; + echo "\n"; + + echo "\n"; + echo " "; + echo " "; + echo "
\n"; + echo "
"; + + + echo "
\n"; + + echo "
\n"; + echo "\n"; + + echo "\n"; + if ($action == "add") { + echo "\n"; + } + if ($action == "update") { + echo "\n"; + } + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo " \n"; + echo " \n"; + echo " "; + echo "
Fifo Agent Status Log AddFifo Agent Status Log Edit
\n"; + echo "Agent Status History

\n"; + echo "
\n"; + echo " domain_uuid:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "\n"; + echo "
\n"; + echo " Username:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the Username.\n"; + echo "
\n"; + echo " Status:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the agent status.\n"; + echo "
\n"; + echo " UUID:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the UUID.\n"; + echo "
\n"; + echo " Add Date:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo " Enter the date.\n"; + echo "
\n"; + if ($action == "update") { + echo " \n"; + } + echo " \n"; + echo "
"; + echo ""; + + echo "
"; + echo "
"; + + +require_once "includes/footer.php"; +?> diff --git a/app/fifo_agents/fifo_languages/root.php b/app/fifo_agents/fifo_languages/root.php new file mode 100644 index 0000000000..7b882438ea --- /dev/null +++ b/app/fifo_agents/fifo_languages/root.php @@ -0,0 +1,50 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ + +// make sure the PATH_SEPARATOR is defined + if (!defined("PATH_SEPARATOR")) { + if ( strpos( $_ENV[ "OS" ], "Win" ) !== false ) { define("PATH_SEPARATOR", ";"); } else { define("PATH_SEPARATOR", ":"); } + } + +// make sure the document_root is set + $_SERVER["SCRIPT_FILENAME"] = str_replace("\\", "/", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = str_replace($_SERVER["PHP_SELF"], "", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = realpath($_SERVER["DOCUMENT_ROOT"]); + //echo "DOCUMENT_ROOT: ".$_SERVER["DOCUMENT_ROOT"]."
\n"; + //echo "PHP_SELF: ".$_SERVER["PHP_SELF"]."
\n"; + //echo "SCRIPT_FILENAME: ".$_SERVER["SCRIPT_FILENAME"]."
\n"; + +// if the project directory exists then add it to the include path otherwise add the document root to the include path + if (is_dir($_SERVER["DOCUMENT_ROOT"].'/fusionpbx')){ + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', '/fusionpbx'); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER["DOCUMENT_ROOT"].'/fusionpbx' ); + } + else { + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', ''); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER['DOCUMENT_ROOT'] ); + } + +?> \ No newline at end of file diff --git a/app/fifo_agents/fifo_languages/v_fifo_agent_languages.php b/app/fifo_agents/fifo_languages/v_fifo_agent_languages.php new file mode 100644 index 0000000000..68c4d6fded --- /dev/null +++ b/app/fifo_agents/fifo_languages/v_fifo_agent_languages.php @@ -0,0 +1,161 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require_once "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (if_group("admin") || if_group("superadmin")) { + //access granted +} +else { + echo "access denied"; + exit; +} +require_once "includes/header.php"; +require_once "includes/paging.php"; + +$order_by = $_GET["order_by"]; +$order = $_GET["order"]; + echo "
"; + echo "\n"; + echo "\n"; + echo " "; + echo ""; + echo "
\n"; + echo "
"; + + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "
Fifo Agent Language List 
\n"; + echo "Matches the Agent with languages they can speak with their proficiency level.

\n"; + echo "
\n"; + + + $sql = ""; + $sql .= " select * from v_fifo_agent_languages "; + if (strlen($order_by)> 0) { $sql .= "order by $order_by $order "; } + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + $num_rows = count($result); + unset ($prep_statement, $result, $sql); + $rows_per_page = 10; + $param = ""; + $page = $_GET['page']; + if (strlen($page) == 0) { $page = 0; $_GET['page'] = 0; } + list($paging_controls, $rows_per_page, $var_3) = paging($num_rows, $param, $rows_per_page); + $offset = $rows_per_page * $page; + + $sql = ""; + $sql .= " select * from v_fifo_agent_languages "; + if (strlen($order_by)> 0) { $sql .= "order by $order_by $order "; } + $sql .= " limit $rows_per_page offset $offset "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + $result_count = count($result); + unset ($prep_statement, $sql); + + + $c = 0; + $row_style["0"] = "row_style0"; + $row_style["1"] = "row_style1"; + + echo "
\n"; + echo "\n"; + + echo "\n"; + echo th_order_by('username', 'Username', $order_by, $order); + echo th_order_by('language', 'Language', $order_by, $order); + echo th_order_by('proficiency', 'Proficiency', $order_by, $order); + echo "\n"; + echo "\n"; + + if ($result_count == 0) { //no results + } + else { //received results + foreach($result as $row) { + //print_r( $row ); + echo "\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "\n"; + if ($c==0) { $c=1; } else { $c=0; } + } //end foreach + unset($sql, $result, $row_count); + } //end if results + + + echo "\n"; + echo "\n"; + echo "\n"; + + + echo "
\n"; + echo " $v_link_label_add\n"; + //echo " \n"; + echo "
".$row[username]."".$row[language]."".$row[proficiency]."\n"; + echo " $v_link_label_edit\n"; + echo " $v_link_label_delete\n"; + //echo " \n"; + //echo " \n"; + echo "
\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "
 $paging_controls\n"; + echo " $v_link_label_add\n"; + //echo " \n"; + echo "
\n"; + echo "
"; + echo "
"; + echo "

"; + echo "

"; + + + echo "
"; + echo "
"; + echo "

"; + + +require_once "includes/footer.php"; +unset ($result_count); +unset ($result); +unset ($key); +unset ($val); +unset ($c); +?> diff --git a/app/fifo_agents/fifo_languages/v_fifo_agent_languages.sql b/app/fifo_agents/fifo_languages/v_fifo_agent_languages.sql new file mode 100644 index 0000000000..70e91ae3a3 --- /dev/null +++ b/app/fifo_agents/fifo_languages/v_fifo_agent_languages.sql @@ -0,0 +1 @@ +CREATE TABLE v_fifo_agent_languages (fifo_agent_language_id INTEGER PRIMARY KEY, v_id TEXT, username TEXT, language TEXT, proficiency TEXT); diff --git a/app/fifo_agents/fifo_languages/v_fifo_agent_languages_delete.php b/app/fifo_agents/fifo_languages/v_fifo_agent_languages_delete.php new file mode 100644 index 0000000000..20010421c2 --- /dev/null +++ b/app/fifo_agents/fifo_languages/v_fifo_agent_languages_delete.php @@ -0,0 +1,60 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require_once "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (if_group("admin") || if_group("superadmin")) { + //access granted +} +else { + echo "access denied"; + exit; +} + +if (count($_GET)>0) { + $id = check_str($_GET["id"]); +} + +if (strlen($id)>0) { + $sql = ""; + $sql .= "delete from v_fifo_agent_languages "; + $sql .= "where fifo_agent_language_id = '$id' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + unset($sql); +} + +require_once "includes/header.php"; +echo "\n"; +echo "
\n"; +echo "Delete Complete\n"; +echo "
\n"; + +require_once "includes/footer.php"; +return; + +?> + diff --git a/app/fifo_agents/fifo_languages/v_fifo_agent_languages_edit.php b/app/fifo_agents/fifo_languages/v_fifo_agent_languages_edit.php new file mode 100644 index 0000000000..6ddcfcf3fc --- /dev/null +++ b/app/fifo_agents/fifo_languages/v_fifo_agent_languages_edit.php @@ -0,0 +1,336 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require_once "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (if_group("admin") || if_group("superadmin")) { + //access granted +} +else { + echo "access denied"; + exit; +} + +//Action add or update +if (isset($_REQUEST["id"])) { + $action = "update"; + $fifo_agent_language_id = check_str($_REQUEST["id"]); +} +else { + $action = "add"; +} + +//POST to PHP variables + if (count($_POST)>0) { + $username = check_str($_POST["username"]); + $language = check_str($_POST["language"]); + $proficiency = check_str($_POST["proficiency"]); + } + +if (count($_POST)>0 && strlen($_POST["persistformvar"]) == 0) { + + $msg = ''; + + if ($action == "update") { + $fifo_agent_language_id = check_str($_POST["fifo_agent_language_id"]); + } + + //check for all required data + //if (strlen($domain_uuid) == 0) { $msg .= "Please provide: domain_uuid
\n"; } + //if (strlen($username) == 0) { $msg .= "Please provide: Username
\n"; } + //if (strlen($language) == 0) { $msg .= "Please provide: Language
\n"; } + //if (strlen($proficiency) == 0) { $msg .= "Please provide: Proficiency
\n"; } + if (strlen($msg) > 0 && strlen($_POST["persistformvar"]) == 0) { + require_once "includes/header.php"; + require_once "includes/persistformvar.php"; + echo "
\n"; + echo "
\n"; + echo $msg."
"; + echo "
\n"; + persistformvar($_POST); + echo "
\n"; + require_once "includes/footer.php"; + return; + } + + + //Add or update the database + if ($_POST["persistformvar"] != "true") { + if ($action == "add") { + $sql = "insert into v_fifo_agent_languages "; + $sql .= "("; + $sql .= "domain_uuid, "; + $sql .= "username, "; + $sql .= "language, "; + $sql .= "proficiency "; + $sql .= ")"; + $sql .= "values "; + $sql .= "("; + $sql .= "'$domain_uuid', "; + $sql .= "'$username', "; + $sql .= "'$language', "; + $sql .= "'$proficiency' "; + $sql .= ")"; + $db->exec(check_sql($sql)); + unset($sql); + + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Add Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + } //if ($action == "add") + + if ($action == "update") { + $sql = "update v_fifo_agent_languages set "; + $sql .= "domain_uuid = '$domain_uuid', "; + $sql .= "username = '$username', "; + $sql .= "language = '$language', "; + $sql .= "proficiency = '$proficiency' "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and fifo_agent_language_id = '$fifo_agent_language_id'"; + $db->exec(check_sql($sql)); + unset($sql); + + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Update Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + } //if ($action == "update") + } //if ($_POST["persistformvar"] != "true") + +} //(count($_POST)>0 && strlen($_POST["persistformvar"]) == 0) + +//pre-populate the form + if (count($_GET)>0 && $_POST["persistformvar"] != "true") { + $fifo_agent_language_id = $_GET["id"]; + $sql = ""; + $sql .= "select * from v_fifo_agent_languages "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and fifo_agent_language_id = '$fifo_agent_language_id' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach ($result as &$row) { + $domain_uuid = $row["domain_uuid"]; + $username = $row["username"]; + $language = $row["language"]; + $proficiency = $row["proficiency"]; + break; //limit to 1 row + } + unset ($prep_statement); + } + +//begin the content + require_once "includes/header.php"; + + + echo "
"; + echo "\n"; + + echo "\n"; + echo " "; + echo " "; + echo "
\n"; + echo "
"; + + + echo "
\n"; + + echo "
\n"; + echo "\n"; + + echo "\n"; + if ($action == "add") { + echo "\n"; + } + if ($action == "update") { + echo "\n"; + } + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo " \n"; + echo " \n"; + echo " "; + echo "
Fifo Agent Language AddFifo Agent Language Edit
\n"; + echo "Matches the Agent with languages they can speak with their proficiency level.

\n"; + echo "
\n"; + echo " Username:\n"; + echo "\n"; + + //generate the user list + $sql = "SELECT * FROM v_users "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + + echo ""; + unset($sql, $result); + + echo "
\n"; + echo "Select the Username from the list.\n"; + echo "
\n"; + echo " Language:\n"; + echo "\n"; + + //generate the language select list + $sql = "SELECT var_name, var_value FROM v_vars "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and var_cat = 'Languages' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + echo ""; + + echo "
\n"; + echo "Enter the two letter language code.\n"; + echo "
\n"; + echo " Proficiency:\n"; + echo "\n"; + + echo " \n"; + echo "
\n"; + echo "Select the language proficiency level.\n"; + echo "
\n"; + if ($action == "update") { + echo " \n"; + } + echo " \n"; + echo "
"; + echo ""; + + echo "
"; + echo "
"; + + +require_once "includes/footer.php"; +?> diff --git a/app/fifo_agents/root.php b/app/fifo_agents/root.php new file mode 100644 index 0000000000..7b882438ea --- /dev/null +++ b/app/fifo_agents/root.php @@ -0,0 +1,50 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ + +// make sure the PATH_SEPARATOR is defined + if (!defined("PATH_SEPARATOR")) { + if ( strpos( $_ENV[ "OS" ], "Win" ) !== false ) { define("PATH_SEPARATOR", ";"); } else { define("PATH_SEPARATOR", ":"); } + } + +// make sure the document_root is set + $_SERVER["SCRIPT_FILENAME"] = str_replace("\\", "/", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = str_replace($_SERVER["PHP_SELF"], "", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = realpath($_SERVER["DOCUMENT_ROOT"]); + //echo "DOCUMENT_ROOT: ".$_SERVER["DOCUMENT_ROOT"]."
\n"; + //echo "PHP_SELF: ".$_SERVER["PHP_SELF"]."
\n"; + //echo "SCRIPT_FILENAME: ".$_SERVER["SCRIPT_FILENAME"]."
\n"; + +// if the project directory exists then add it to the include path otherwise add the document root to the include path + if (is_dir($_SERVER["DOCUMENT_ROOT"].'/fusionpbx')){ + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', '/fusionpbx'); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER["DOCUMENT_ROOT"].'/fusionpbx' ); + } + else { + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', ''); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER['DOCUMENT_ROOT'] ); + } + +?> \ No newline at end of file diff --git a/app/fifo_agents/v_fifo_agents.php b/app/fifo_agents/v_fifo_agents.php new file mode 100644 index 0000000000..b4f0038b2d --- /dev/null +++ b/app/fifo_agents/v_fifo_agents.php @@ -0,0 +1,206 @@ + + Copyright (C) 2010 + All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require_once "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (if_group("admin") || if_group("superadmin")) { + //access granted +} +else { + echo "access denied"; + exit; +} +require_once "includes/header.php"; +require_once "includes/paging.php"; + + +//$time_start = microtime(true); +//sleep for a while +//usleep(1000000); + + +$order_by = $_GET["order_by"]; +$order = $_GET["order"]; + + + echo "
"; + echo "\n"; + echo "\n"; + echo " "; + echo ""; + echo "
\n"; + echo "
"; + + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "
Active Agents 
\n"; + echo "Shows the agents that are currently logged into the queues.

\n"; + echo "
\n"; + + //set the default order by and order asc, desc + if (strlen($order_by) == 0) { + $order_by = 'fifo_name'; + $order = 'asc'; + } + + //run the sql queries + $sql = ""; + $sql .= " select * from v_fifo_agents "; + if (strlen($order_by)> 0) { $sql .= "order by $order_by $order "; } + //$sql .= " limit $rows_per_page offset $offset "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + $result_count = count($result); + unset ($prep_statement, $sql); + + + $c = 0; + $row_style["0"] = "row_style0"; + $row_style["1"] = "row_style1"; + + echo "
\n"; + echo "\n"; + + echo "\n"; + echo th_order_by('fifo_name', 'Queue Name', $order_by, $order); + echo th_order_by('agent_username', 'Username', $order_by, $order); + echo th_order_by('agent_priority', 'Agent Priority', $order_by, $order); + echo th_order_by('agent_status', 'Status', $order_by, $order); + echo th_order_by('agent_last_call', 'Last Call', $order_by, $order); + echo th_order_by('agent_last_uuid', 'Last UUID', $order_by, $order); + echo th_order_by('agent_contact_number', 'Contact Number', $order_by, $order); + echo "\n"; + echo "\n"; + + if ($result_count == 0) { //no results + } + else { //received results + foreach($result as $row) { + //set the php variables + $agent_last_call = $row[agent_last_call]; + $agent_status = $row[agent_status]; + + //format the last call time + if ($agent_last_call == 0) { + $agent_last_call_desc = ''; + } + else { + $agent_last_call_desc = date("g:i:s a j M Y",$agent_last_call); + } + + //get the agent status session array + //unset($_SESSION["array_agent_status"]); + if (!is_array($_SESSION["array_agent_status"])) { + $sql = "SELECT var_name, var_value FROM v_vars "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and var_cat = 'Queues Agent Status' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach($result as $field) { + $_SESSION["array_agent_status"][$field[var_value]] = $field[var_name]; + } + } + + //get the agent description + $agent_status_desc = $_SESSION["array_agent_status"][$agent_status]; + + echo "\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "\n"; + if ($c==0) { $c=1; } else { $c=0; } + } //end foreach + unset($sql, $result, $row_count); + } //end if results + + + echo "\n"; + echo "\n"; + echo "\n"; + + + echo "
\n"; + echo " $v_link_label_add\n"; + //echo " \n"; + echo "
".$row[fifo_name]."".$row[agent_username]."".$row[agent_priority]."".$agent_status_desc."".$agent_last_call_desc." ".$row[agent_last_uuid]." ".$row[agent_contact_number]."\n"; + echo " $v_link_label_edit\n"; + echo " $v_link_label_delete\n"; + //echo " \n"; + //echo " \n"; + echo "
\n"; + echo " \n"; + echo " \n"; + echo " \n"; + //echo " \n"; + echo " \n"; + echo " \n"; + echo "
 $paging_controls\n"; + echo " $v_link_label_add\n"; + //echo " \n"; + echo "
\n"; + echo "
"; + echo "
"; + echo "

"; + echo "

"; + +//sleep(1); +//$time_end = microtime(true); +//$time = $time_end - $time_start; +//if ($time < 2) { +// echo "use cache "; +//} +//else { +// echo "expired the cache "; +//} +//echo "load time $time seconds\n"; + + echo "
"; + echo "
"; + echo "

"; + + +require_once "includes/footer.php"; +unset ($result_count); +unset ($result); +unset ($key); +unset ($val); +unset ($c); +?> diff --git a/app/fifo_agents/v_fifo_agents.sql b/app/fifo_agents/v_fifo_agents.sql new file mode 100644 index 0000000000..39e9bc5aa7 --- /dev/null +++ b/app/fifo_agents/v_fifo_agents.sql @@ -0,0 +1 @@ +CREATE TABLE v_fifo_agents (fifo_agent_id INTEGER PRIMARY KEY, v_id NUMBER, fifo_name TEXT, agent_username TEXT, agent_priority TEXT, agent_status TEXT, agent_status_epoch NUMBER, agent_last_call NUMBER, agent_last_uuid TEXT, agent_contact_number NUMBER) diff --git a/app/fifo_agents/v_fifo_agents_delete.php b/app/fifo_agents/v_fifo_agents_delete.php new file mode 100644 index 0000000000..ea3778c349 --- /dev/null +++ b/app/fifo_agents/v_fifo_agents_delete.php @@ -0,0 +1,60 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require_once "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (if_group("admin") || if_group("superadmin")) { + //access granted +} +else { + echo "access denied"; + exit; +} + +if (count($_GET)>0) { + $id = check_str($_GET["id"]); +} + +if (strlen($id)>0) { + $sql = ""; + $sql .= "delete from v_fifo_agents "; + $sql .= "where fifo_agent_id = '$id' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + unset($sql); +} + +require_once "includes/header.php"; +echo "\n"; +echo "
\n"; +echo "Delete Complete\n"; +echo "
\n"; + +require_once "includes/footer.php"; +return; + +?> + diff --git a/app/fifo_agents/v_fifo_agents_edit.php b/app/fifo_agents/v_fifo_agents_edit.php new file mode 100644 index 0000000000..d6ebd799ac --- /dev/null +++ b/app/fifo_agents/v_fifo_agents_edit.php @@ -0,0 +1,479 @@ + + Copyright (C) 2010 + All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require_once "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (if_group("admin") || if_group("superadmin")) { + //access granted +} +else { + echo "access denied"; + exit; +} + +//action add or update + if (isset($_REQUEST["id"])) { + $action = "update"; + $fifo_agent_id = check_str($_REQUEST["id"]); + } + else { + $action = "add"; + } + +//get http post variables and set them to php variables + if (count($_POST)>0) { + $fifo_name = check_str($_POST["fifo_name"]); + $agent_username = check_str($_POST["agent_username"]); + $agent_priority = check_str($_POST["agent_priority"]); + $agent_status = check_str($_POST["agent_status"]); + $agent_last_call = check_str($_POST["agent_last_call"]); + $agent_last_uuid = check_str($_POST["agent_last_uuid"]); + $agent_contact_number = check_str($_POST["agent_contact_number"]); + } + +if (count($_POST)>0 && strlen($_POST["persistformvar"]) == 0) { + + $msg = ''; + + ////recommend moving this to the config.php file + $uploadtempdir = $_ENV["TEMP"]."\\"; + ini_set('upload_tmp_dir', $uploadtempdir); + ////$imagedir = $_ENV["TEMP"]."\\"; + ////$filedir = $_ENV["TEMP"]."\\"; + + if ($action == "update") { + $fifo_agent_id = check_str($_POST["fifo_agent_id"]); + } + + //check for all required data + if (strlen($domain_uuid) == 0) { $msg .= "Please provide: domain_uuid
\n"; } + if (strlen($fifo_name) == 0) { $msg .= "Please provide: Queue Name
\n"; } + if (strlen($agent_username) == 0) { $msg .= "Please provide: Username
\n"; } + if (strlen($agent_priority) == 0) { $msg .= "Please provide: Agent Priority
\n"; } + if (strlen($agent_status) == 0) { $msg .= "Please provide: Status
\n"; } + //if (strlen($agent_last_call) == 0) { $msg .= "Please provide: Last Call
\n"; } + //if (strlen($agent_last_uuid) == 0) { $msg .= "Please provide: Last UUID
\n"; } + //if (strlen($agent_contact_number) == 0) { $msg .= "Please provide: Contact Number
\n"; } + if (strlen($msg) > 0 && strlen($_POST["persistformvar"]) == 0) { + require_once "includes/header.php"; + require_once "includes/persistformvar.php"; + echo "
\n"; + echo "
\n"; + echo $msg."
"; + echo "
\n"; + persistformvar($_POST); + echo "
\n"; + require_once "includes/footer.php"; + return; + } + + //Add or update the database + if ($_POST["persistformvar"] != "true") { + if ($action == "add") { + $sql = "insert into v_fifo_agents "; + $sql .= "("; + $sql .= "domain_uuid, "; + $sql .= "fifo_name, "; + $sql .= "agent_username, "; + $sql .= "agent_priority, "; + $sql .= "agent_status, "; + $sql .= "agent_last_call, "; + $sql .= "agent_last_uuid, "; + $sql .= "agent_contact_number "; + $sql .= ")"; + $sql .= "values "; + $sql .= "("; + $sql .= "'$domain_uuid', "; + $sql .= "'$fifo_name', "; + $sql .= "'$agent_username', "; + $sql .= "'$agent_priority', "; + $sql .= "'$agent_status', "; + $sql .= "'$agent_last_call', "; + $sql .= "'$agent_last_uuid', "; + $sql .= "'$agent_contact_number' "; + $sql .= ")"; + $db->exec(check_sql($sql)); + unset($sql); + + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Add Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + } //if ($action == "add") + + if ($action == "update") { + $sql = "update v_fifo_agents set "; + $sql .= "domain_uuid = '$domain_uuid', "; + $sql .= "fifo_name = '$fifo_name', "; + $sql .= "agent_username = '$agent_username', "; + $sql .= "agent_priority = '$agent_priority', "; + $sql .= "agent_status = '$agent_status', "; + $sql .= "agent_status_epoch = ".time()." "; + $sql .= "agent_last_call = '$agent_last_call', "; + $sql .= "agent_last_uuid = '$agent_last_uuid', "; + $sql .= "agent_contact_number = '$agent_contact_number' "; + $sql .= "where fifo_agent_id = '$fifo_agent_id'"; + $db->exec(check_sql($sql)); + unset($sql); + + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Update Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + } //if ($action == "update") + } //if ($_POST["persistformvar"] != "true") + +} //(count($_POST)>0 && strlen($_POST["persistformvar"]) == 0) + +//pre-populate the form + if (count($_GET)>0 && $_POST["persistformvar"] != "true") { + $fifo_agent_id = $_GET["id"]; + $sql = ""; + $sql .= "select * from v_fifo_agents "; + $sql .= "where fifo_agent_id = '$fifo_agent_id' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach ($result as &$row) { + $fifo_name = $row["fifo_name"]; + $agent_username = $row["agent_username"]; + $agent_priority = $row["agent_priority"]; + $agent_status = $row["agent_status"]; + $agent_last_call = $row["agent_last_call"]; + $agent_last_uuid = $row["agent_last_uuid"]; + $agent_contact_number = $row["agent_contact_number"]; + break; //limit to 1 row + } + unset ($prep_statement); + } + +//send the content to the browser + require_once "includes/header.php"; + + + echo "
"; + echo "\n"; + + echo "\n"; + echo " "; + echo " "; + echo "
\n"; + echo "
"; + + + echo "
\n"; + + echo "
\n"; + echo "\n"; + + echo "\n"; + if ($action == "add") { + echo "\n"; + } + if ($action == "update") { + echo "\n"; + } + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo " \n"; + echo " \n"; + echo " "; + echo "
Agent LoginFifo Agent Edit
\n"; + echo "List the agents assigned to a Queue.

\n"; + echo "
\n"; + echo " Queue Name:\n"; + echo "\n"; + //echo " \n"; + + //generate the fifo name select list + $sql = ""; + $sql .= "select * from v_dialplan_details "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $x = 0; + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + echo "\n"; + unset ($prep_statement); + + echo "
\n"; + echo "Select the queue name.\n"; + echo "
\n"; + echo " Username:\n"; + echo "\n"; + //echo " \n"; + + //generate the user list + $sql = "SELECT * FROM v_users "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + + echo ""; + unset($sql, $result); + + echo "
\n"; + echo "Select the username.\n"; + echo "
\n"; + echo " Agent Priority:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Select a priority.\n"; + echo "
\n"; + echo " Status:\n"; + echo "\n"; + //generate the agent status select list + $sql = "SELECT var_name, var_value FROM v_vars "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and var_cat = 'Queues Agent Status' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + echo ""; + /* + foreach($result as $field) { + $_SESSION["array_agent_status"][$field[var_value]] = $field[var_name]; + } + + $x=1; + foreach($_SESSION["array_agent_status"] as $value) { + echo "$x $value
\n"; + $x++; + } + */ + + if (!is_array($_SESSION["array_agent_status"])) { + echo "not an array"; + foreach($result as $field) { + $_SESSION["array_agent_status"][$field[var_value]] = $field[var_name]; + } + } + else { + //echo "is an array"; + //unset($_SESSION["array_agent_status"]); + } + unset($sql, $result); + + /* + echo " \n"; + */ + echo "
\n"; + echo "Enter the status of the Agent.\n"; + echo "
\n"; + echo " Last Call:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "\n"; + echo "
\n"; + echo " Last UUID:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the UUID for the last call.\n"; + echo "
\n"; + echo " Contact Number:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the agent contact number.\n"; + echo "
\n"; + if ($action == "update") { + echo " \n"; + } + echo " \n"; + echo "
"; + echo ""; + + echo "
"; + echo "
"; + + +require_once "includes/footer.php"; +?> diff --git a/app/fifo_list/app_config.php b/app/fifo_list/app_config.php new file mode 100644 index 0000000000..4ce044124f --- /dev/null +++ b/app/fifo_list/app_config.php @@ -0,0 +1,37 @@ + \ No newline at end of file diff --git a/app/fifo_list/root.php b/app/fifo_list/root.php new file mode 100644 index 0000000000..7b882438ea --- /dev/null +++ b/app/fifo_list/root.php @@ -0,0 +1,50 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ + +// make sure the PATH_SEPARATOR is defined + if (!defined("PATH_SEPARATOR")) { + if ( strpos( $_ENV[ "OS" ], "Win" ) !== false ) { define("PATH_SEPARATOR", ";"); } else { define("PATH_SEPARATOR", ":"); } + } + +// make sure the document_root is set + $_SERVER["SCRIPT_FILENAME"] = str_replace("\\", "/", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = str_replace($_SERVER["PHP_SELF"], "", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = realpath($_SERVER["DOCUMENT_ROOT"]); + //echo "DOCUMENT_ROOT: ".$_SERVER["DOCUMENT_ROOT"]."
\n"; + //echo "PHP_SELF: ".$_SERVER["PHP_SELF"]."
\n"; + //echo "SCRIPT_FILENAME: ".$_SERVER["SCRIPT_FILENAME"]."
\n"; + +// if the project directory exists then add it to the include path otherwise add the document root to the include path + if (is_dir($_SERVER["DOCUMENT_ROOT"].'/fusionpbx')){ + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', '/fusionpbx'); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER["DOCUMENT_ROOT"].'/fusionpbx' ); + } + else { + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', ''); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER['DOCUMENT_ROOT'] ); + } + +?> \ No newline at end of file diff --git a/app/fifo_list/v_fifo_exec.php b/app/fifo_list/v_fifo_exec.php new file mode 100644 index 0000000000..cebb25d850 --- /dev/null +++ b/app/fifo_list/v_fifo_exec.php @@ -0,0 +1,89 @@ + + Copyright (C) 2010 + All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('active_queues_edit')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +if (count($_GET)>0) { + $switch_cmd = trim($_GET["cmd"]); + $action = trim($_GET["action"]); + $direction = trim($_GET["direction"]); +} + + +//GET to PHP variables +if (count($_GET)>0) { + + //fs cmd + if (strlen($switch_cmd) > 0) { + /* + if ($action == "energy") { + //conference 3001-example.dyndns.org energy 103 + $switch_result = event_socket_request($fp, 'api '.$switch_cmd); + $result_array = explode("=",$switch_result); + $tmp_value = $result_array[1]; + if ($direction == "up") { $tmp_value = $tmp_value + 100; } + if ($direction == "down") { $tmp_value = $tmp_value - 100; } + //echo "energy $tmp_value
\n"; + $switch_result = event_socket_request($fp, 'api '.$switch_cmd.' '.$tmp_value); + } + if ($action == "volume_in") { + $switch_result = event_socket_request($fp, 'api '.$switch_cmd); + $result_array = explode("=",$switch_result); + $tmp_value = $result_array[1]; + if ($direction == "up") { $tmp_value = $tmp_value + 1; } + if ($direction == "down") { $tmp_value = $tmp_value - 1; } + //echo "volume $tmp_value
\n"; + $switch_result = event_socket_request($fp, 'api '.$switch_cmd.' '.$tmp_value); + } + if ($action == "volume_out") { + $switch_result = event_socket_request($fp, 'api '.$switch_cmd); + $result_array = explode("=",$switch_result); + $tmp_value = $result_array[1]; + if ($direction == "up") { $tmp_value = $tmp_value + 1; } + if ($direction == "down") { $tmp_value = $tmp_value - 1; } + //echo "volume $tmp_value
\n"; + $switch_result = event_socket_request($fp, 'api '.$switch_cmd.' '.$tmp_value); + } + */ + //connect to the event socket + $fp = event_socket_create($_SESSION['event_socket_ip_address'], $_SESSION['event_socket_port'], $_SESSION['event_socket_password']); + //send the command over event socket + if ($fp) { + $switch_result = event_socket_request($fp, 'api '.$switch_cmd); + } + } + +} + +?> diff --git a/app/fifo_list/v_fifo_interactive.php b/app/fifo_list/v_fifo_interactive.php new file mode 100644 index 0000000000..cd1313ec01 --- /dev/null +++ b/app/fifo_list/v_fifo_interactive.php @@ -0,0 +1,143 @@ + + Copyright (C) 2010 + All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('active_queues_view')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +//get the fifo_name from http and set it to a php variable + $fifo_name = trim($_REQUEST["c"]); + +//if not the user is not a member of the superadmin then restrict to viewing their own domain + if (!if_group("superadmin")) { + if (stripos($fifo_name, $_SESSION['domain_name']) === false) { + echo "access denied"; + exit; + } + } + +//remove the domain from fifo name + $tmp_fifo_name = str_replace('_', ' ', $fifo_name); + $tmp_fifo_array = explode('@', $tmp_fifo_name); + $tmp_fifo_name = $tmp_fifo_array[0]; + +//show the header + require_once "includes/header.php"; + +?> + + +"; + +echo "\n"; +echo " \n"; +echo " \n"; +echo " \n"; +echo "
Queues
\n"; +echo " Use this to monitor queue activty for the $tmp_fifo_name queue.\n"; +echo "
\n"; + +echo "\n"; +echo " \n"; +echo " "; +echo " "; +echo "
\n"; +echo "
\n"; +echo "
".date('Y-m-d-s')."
\n"; +echo "
"; + +echo ""; + +require_once "includes/footer.php"; +?> diff --git a/app/fifo_list/v_fifo_interactive_inc.php b/app/fifo_list/v_fifo_interactive_inc.php new file mode 100644 index 0000000000..1cefa7adf5 --- /dev/null +++ b/app/fifo_list/v_fifo_interactive_inc.php @@ -0,0 +1,206 @@ + + Copyright (C) 2010 + All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('active_queues_view')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +//set variables + $fifo_name = trim($_REQUEST["c"]); + +//if not the user is not a member of the superadmin then restrict to viewing their own domain + if (!if_group("superadmin")) { + if (stripos($fifo_name, $_SESSION['domain_name']) === false) { + echo "access denied"; + exit; + } + } + +//prepare and send the api command over event socket + $switch_cmd = 'fifo list_verbose '.$fifo_name.''; + $fp = event_socket_create($_SESSION['event_socket_ip_address'], $_SESSION['event_socket_port'], $_SESSION['event_socket_password']); + if (!$fp) { + $msg = "
Connection to Event Socket failed.
"; + echo "
\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "
Message
$msg
\n"; + echo "
\n"; + } + else { + //send the api command over event socket + $xml_str = trim(event_socket_request($fp, 'api '.$switch_cmd)); + + //parse the response as xml + try { + $xml = new SimpleXMLElement($xml_str); + } + catch(Exception $e) { + //echo $e->getMessage(); + } + + //set variables from the xml + //$name = $xml->conference['name']; + //$member_count = $xml->conference['member-count']; + //$locked = $xml->conference['locked']; + + //set the alternating row styles + $c = 0; + $row_style["0"] = "row_style0"; + $row_style["1"] = "row_style1"; + + //response div tag + echo "
\n"; + echo "
\n"; + + //show the content + echo "\n"; + /* + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + */ + + echo "\n"; + echo "\n"; + //echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + //echo "\n"; + //echo "\n"; + //echo "\n"; + echo "\n"; + //echo "\n"; + //echo "\n"; + //echo "\n"; + //echo "\n"; + //echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + foreach ($xml->fifo->callers->caller as $row) { + /* + $username = $row->caller_profile->username; + $dialplan = $row->caller_profile->dialplan; + $caller_id_name = urldecode($row->caller_profile->caller_id_name); + $caller_id_number = $row->caller_profile->caller_id_number; + $ani = $row->caller_profile->ani; + $aniii = $row->caller_profile->aniii; + $network_addr = $row->caller_profile->network_addr; + $destination_number = $row->destination_number->rdnis; + $rdnis = $row->caller_profile->rdnis; + $uuid = $row->caller_profile->uuid; + $source = $row->caller_profile->source; + $context = $row->caller_profile->context; + $chan_name = $row->caller_profile->chan_name; + $default_language = $row->variables->default_language; + $fifo_position = $row->variables->fifo_position; + $fifo_priority = $row->variables->fifo_priority; + $fifo_status = $row->variables->fifo_status; + $fifo_timestamp = urldecode($row->variables->fifo_timestamp); + $fifo_time = strtotime($fifo_timestamp); + $fifo_duration = time() - $fifo_time; + $fifo_duration_formatted = str_pad(intval(intval($fifo_duration/3600)),2,"0",STR_PAD_LEFT).":" . str_pad(intval(($fifo_duration / 60) % 60),2,"0",STR_PAD_LEFT).":" . str_pad(intval($fifo_duration % 60),2,"0",STR_PAD_LEFT) ; + */ + + $username = $row->cdr->callflow->caller_profile->username; + $dialplan = $row->cdr->callflow->caller_profile->dialplan; + $caller_id_name = urldecode($row->cdr->callflow->caller_profile->caller_id_name); + $caller_id_number = $row->cdr->callflow->caller_profile->caller_id_number; + $ani = $row->cdr->callflow->caller_profile->ani; + $aniii = $row->cdr->callflow->caller_profile->aniii; + $network_addr = $row->cdr->callflow->caller_profile->network_addr; + $destination_number = $row->cdr->callflow->caller_profile->destination_number; + $rdnis = $row->cdr->callflow->caller_profile->rdnis; + $uuid = $row->cdr->callflow->caller_profile->uuid; + $source = $row->cdr->callflow->caller_profile->source; + $context = $row->cdr->callflow->caller_profile->context; + $chan_name = $row->cdr->callflow->caller_profile->chan_name; + $default_language = $row->cdr->variables->default_language; + $fifo_position = $row->cdr->variables->fifo_position; + $fifo_priority = $row->cdr->variables->fifo_priority; + $fifo_status = $row->cdr->variables->fifo_status; + $fifo_timestamp = urldecode($row->cdr->variables->fifo_timestamp); + $fifo_time = strtotime($fifo_timestamp); + $fifo_duration = time() - $fifo_time; + $fifo_duration_formatted = str_pad(intval(intval($fifo_duration/3600)),2,"0",STR_PAD_LEFT).":" . str_pad(intval(($fifo_duration / 60) % 60),2,"0",STR_PAD_LEFT).":" . str_pad(intval($fifo_duration % 60),2,"0",STR_PAD_LEFT) ; + + echo "\n"; + echo "\n"; + //echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + //echo "\n"; + //echo "\n"; + //echo "\n"; + echo "\n"; + //echo "\n"; + //echo "\n"; + //echo "\n"; + //echo "\n"; + //echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + if ($c==0) { $c=1; } else { $c=0; } + } + echo "
\n"; + //echo " Count: $member_count\n"; + echo "\n"; + echo "  \n"; + echo "\n"; + echo " Queues Tools: \n"; + echo " Start Record \n"; + echo " Stop Record \n"; + if ($locked == "true") { + echo " Unlock \n"; + } + else { + echo " Lock \n"; + } + echo "
UsernameDialplanCaller ID NameCaller ID NumberLanguageANIANIIINetwork AddrDestination NumberRDNISUUIDSourceContextChan NamePositionPriorityStatusDuration
$username  $dialplan  $caller_id_name  $caller_id_number  $default_language  $ani  $aniii  $network_addr  $destination_number  $rdnis  $uuid  $source  $context  $chan_name  $fifo_position  $fifo_priority  $fifo_status  $fifo_duration_formatted  
\n"; + } +?> diff --git a/app/fifo_list/v_fifo_list.php b/app/fifo_list/v_fifo_list.php new file mode 100644 index 0000000000..2badb68042 --- /dev/null +++ b/app/fifo_list/v_fifo_list.php @@ -0,0 +1,112 @@ + + Copyright (C) 2010 + All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('active_queues_view')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +require_once "includes/header.php"; +?> + +"; + +echo "\n"; +echo " \n"; +echo " \n"; +echo " \n"; +echo "
Active Queues
\n"; +echo " List all the queues that are currently active with one or more callers.\n"; +echo "
\n"; + +echo "\n"; +echo "\n"; +echo " "; +echo " "; +echo "
\n"; + +echo "
\n"; +echo "
\n"; + +echo "
"; +echo ""; + +require_once "includes/footer.php"; +?> diff --git a/app/fifo_list/v_fifo_list_inc.php b/app/fifo_list/v_fifo_list_inc.php new file mode 100644 index 0000000000..5768a081a0 --- /dev/null +++ b/app/fifo_list/v_fifo_list_inc.php @@ -0,0 +1,121 @@ + + Copyright (C) 2010 + All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('active_queues_view')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +$switch_cmd = 'fifo list'; +$fp = event_socket_create($_SESSION['event_socket_ip_address'], $_SESSION['event_socket_port'], $_SESSION['event_socket_password']); +if ($fp) { + $xml_str = trim(event_socket_request($fp, 'api '.$switch_cmd)); + try { + $xml = new SimpleXMLElement($xml_str); + } + catch(Exception $e) { + //echo $e->getMessage(); + } + + /* + + + + + + + + + + + + + + + */ + + $c = 0; + $row_style["0"] = "row_style0"; + $row_style["1"] = "row_style1"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + foreach ($xml->fifo as $row) { + + foreach($row->attributes() as $tmp_name => $tmp_value) { + $$tmp_name = $tmp_value; + } + unset($tmp_name, $tmp_value); + + //remove the domain from name + $tmp_name = str_replace('_', ' ', $name); + $tmp_name_array = explode('@', $name); + $tmp_name = $tmp_name_array[0]; + + if (if_group("superadmin")) { + //show all fifo queues + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + } + else { + //show only the fifo queues that match the domain_name + if (stripos($name, $_SESSION['domain_name']) !== false) { + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + } + } + + if ($c==0) { $c=1; } else { $c=0; } + } + echo "
NameConsumer CountCaller CountWaiting CountImportance 
".$tmp_name."".$consumer_count."".$caller_count."".$waiting_count."".$importance."view
".$tmp_name."".$consumer_count."".$caller_count."".$waiting_count."".$importance."view
\n"; +} + +?> \ No newline at end of file diff --git a/app/gateways/app_config.php b/app/gateways/app_config.php new file mode 100644 index 0000000000..ed02fb416f --- /dev/null +++ b/app/gateways/app_config.php @@ -0,0 +1,166 @@ + \ No newline at end of file diff --git a/app/gateways/root.php b/app/gateways/root.php new file mode 100644 index 0000000000..7b882438ea --- /dev/null +++ b/app/gateways/root.php @@ -0,0 +1,50 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ + +// make sure the PATH_SEPARATOR is defined + if (!defined("PATH_SEPARATOR")) { + if ( strpos( $_ENV[ "OS" ], "Win" ) !== false ) { define("PATH_SEPARATOR", ";"); } else { define("PATH_SEPARATOR", ":"); } + } + +// make sure the document_root is set + $_SERVER["SCRIPT_FILENAME"] = str_replace("\\", "/", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = str_replace($_SERVER["PHP_SELF"], "", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = realpath($_SERVER["DOCUMENT_ROOT"]); + //echo "DOCUMENT_ROOT: ".$_SERVER["DOCUMENT_ROOT"]."
\n"; + //echo "PHP_SELF: ".$_SERVER["PHP_SELF"]."
\n"; + //echo "SCRIPT_FILENAME: ".$_SERVER["SCRIPT_FILENAME"]."
\n"; + +// if the project directory exists then add it to the include path otherwise add the document root to the include path + if (is_dir($_SERVER["DOCUMENT_ROOT"].'/fusionpbx')){ + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', '/fusionpbx'); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER["DOCUMENT_ROOT"].'/fusionpbx' ); + } + else { + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', ''); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER['DOCUMENT_ROOT'] ); + } + +?> \ No newline at end of file diff --git a/app/gateways/v_gateways.php b/app/gateways/v_gateways.php new file mode 100644 index 0000000000..86e701ded0 --- /dev/null +++ b/app/gateways/v_gateways.php @@ -0,0 +1,252 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('gateways_view')) { + //access granted +} +else { + echo "access denied"; + exit; +} +require_once "includes/header.php"; +require_once "includes/paging.php"; + +$order_by = $_GET["order_by"]; +$order = $_GET["order"]; + +//connect to event socket +$fp = event_socket_create($_SESSION['event_socket_ip_address'], $_SESSION['event_socket_port'], $_SESSION['event_socket_password']); +if ($fp) { + if (strlen($_GET["a"]) > 0) { + $profile = $_GET["profile"]; + if (strlen($profile) == 0) { + $profile = 'external'; + } + if ($_GET["a"] == "stop") { + $gateway_name = $_GET["gateway"]; + if (count($_SESSION["domains"]) > 1) { + $cmd = 'api sofia profile '.$profile.' killgw '.$_SESSION['domain_name'].'-'.$gateway_name; + } + else { + $cmd = 'api sofia profile '.$profile.' killgw '.$gateway_name; + } + $response = trim(event_socket_request($fp, $cmd)); + $msg = 'Stop Gateway:
'.$response.'
'; + } + if ($_GET["a"] == "start") { + $gateway_name = $_GET["gateway"]; + $cmd = 'api sofia profile '.$profile.' rescan'; + $response = trim(event_socket_request($fp, $cmd)); + $msg = 'Start Gateway:
'.$response.'
'; + } + } + + if (!function_exists('switch_gateway_status')) { + function switch_gateway_status($gateway_name, $result_type = 'xml') { + $fp = event_socket_create($_SESSION['event_socket_ip_address'], $_SESSION['event_socket_port'], $_SESSION['event_socket_password']); + if (count($_SESSION["domains"]) > 1) { + $cmd = 'api sofia xmlstatus gateway '.$_SESSION['domain_name'].'-'.$gateway_name; + } + else { + $cmd = 'api sofia xmlstatus gateway '.$gateway_name; + } + return trim(event_socket_request($fp, $cmd)); + } + } +} + +echo "
"; +echo "\n"; +echo "\n"; +echo " "; +echo ""; +echo "
\n"; +echo "
"; + +echo "\n"; +echo " \n"; +echo " \n"; +echo " \n"; +echo " \n"; +echo " \n"; +echo " \n"; +echo " \n"; +echo "
Gateways\n"; +echo " \n"; +echo " "; +echo "
\n"; +echo " \n"; +echo " Gateways provide access into other voice networks. These can be voice providers or other systems that require SIP registration.\n"; +echo " \n"; +echo "
"; + +echo "
\n"; +echo "
\n"; + +$sql = ""; +$sql .= " select * from v_gateways "; +$sql .= "where domain_uuid = '$domain_uuid' "; +if (strlen($order_by)> 0) { $sql .= "order by $order_by $order "; } +$prep_statement = $db->prepare(check_sql($sql)); +$prep_statement->execute(); +$result = $prep_statement->fetchAll(PDO::FETCH_NAMED); +$num_rows = count($result); +unset ($prep_statement, $result, $sql); + +$rows_per_page = 10; +$param = ""; +$page = $_GET['page']; +if (strlen($page) == 0) { $page = 0; $_GET['page'] = 0; } +list($paging_controls, $rows_per_page, $var_3) = paging($num_rows, $param, $rows_per_page); +$offset = $rows_per_page * $page; + +$sql = ""; +$sql .= " select * from v_gateways "; +$sql .= "where domain_uuid = '$domain_uuid' "; +if (strlen($order_by)> 0) { $sql .= "order by $order_by $order "; } +$sql .= " limit $rows_per_page offset $offset "; +$prep_statement = $db->prepare(check_sql($sql)); +$prep_statement->execute(); +$result = $prep_statement->fetchAll(PDO::FETCH_NAMED); +$result_count = count($result); +unset ($prep_statement, $sql); + +$c = 0; +$row_style["0"] = "row_style0"; +$row_style["1"] = "row_style1"; + +echo "
\n"; +echo "\n"; +echo "\n"; +echo th_order_by('gateway', 'Gateway', $order_by, $order); +echo th_order_by('context', 'Context', $order_by, $order); +if ($fp) { + echo "\n"; + echo "\n"; + echo "\n"; +} +echo th_order_by('enabled', 'Enabled', $order_by, $order); +echo th_order_by('description', 'Gateway Description', $order_by, $order); +echo "\n"; +echo "\n"; + +if ($result_count == 0) { + //no results +} +else { //received results + foreach($result as $row) { + echo "\n"; + echo " \n"; + echo " \n"; + + if ($fp) { + if ($row["enabled"] == "true") { + $response = switch_gateway_status($row["gateway"]); + if ($response == "Invalid Gateway!") { + //not running + echo " \n"; + echo " \n"; + echo " \n"; + } + else { + //running + try { + $xml = new SimpleXMLElement($response); + $state = $xml->state; + echo " \n"; + echo " \n"; + echo " \n"; + } + catch(Exception $e) { + //echo $e->getMessage(); + } + } + } + else { + echo " \n"; + echo " \n"; + echo " \n"; + } + } + + echo " \n"; + echo " \n"; + echo " \n"; + echo "\n"; + if ($c==0) { $c=1; } else { $c=0; } + } //end foreach + unset($sql, $result, $row_count); +} //end if results + +echo "\n"; +echo "\n"; +echo "\n"; + +echo "\n"; +echo "\n"; +echo "\n"; + +echo "
StatusActionState\n"; +if (permission_exists('gateways_add')) { + echo " $v_link_label_add\n"; +} +echo "
".$row["gateway"]."".$row["context"]."StoppedStart RunningStop".$state."   ".$row["enabled"]."".$row["description"]."\n"; + if (permission_exists('gateways_edit')) { + echo " $v_link_label_edit\n"; + } + if (permission_exists('gateways_delete')) { + echo " $v_link_label_delete\n"; + } + echo "
\n"; +echo " \n"; +echo " \n"; +echo " \n"; +echo " \n"; +echo " \n"; +echo " \n"; +echo "
 $paging_controls\n"; +if (permission_exists('gateways_add')) { + echo " $v_link_label_add\n"; +} +echo "
\n"; +echo "
\n"; +echo "
\n"; +if ($v_path_show) { + echo $_SESSION['switch']['gateways']['dir']."/sip_profiles\n"; +} +echo "
"; +echo "
"; +echo "

"; +echo "

"; + +echo "
"; +echo "
"; +echo "

"; + +require_once "includes/footer.php"; +?> diff --git a/app/gateways/v_gateways_copy.php b/app/gateways/v_gateways_copy.php new file mode 100644 index 0000000000..e9328c2a91 --- /dev/null +++ b/app/gateways/v_gateways_copy.php @@ -0,0 +1,161 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +require_once "includes/paging.php"; +if (permission_exists('gateways_add')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +//set the http get/post variable(s) to a php variable + if (isset($_REQUEST["id"])) { + $gateway_uuid = check_str($_REQUEST["id"]); + } + +//get the data + $sql = ""; + $sql .= "select * from v_gateways "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and gateway_uuid = '$gateway_uuid' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach ($result as &$row) { + $gateway = $row["gateway"]; + $username = $row["username"]; + $password = $row["password"]; + $auth_username = $row["auth_username"]; + $realm = $row["realm"]; + $from_user = $row["from_user"]; + $from_domain = $row["from_domain"]; + $proxy = $row["proxy"]; + $register_proxy = $row["register_proxy"]; + $outbound_proxy = $row["outbound_proxy"]; + $expire_seconds = $row["expire_seconds"]; + $register = $row["register"]; + $register_transport = $row["register_transport"]; + $retry_seconds = $row["retry_seconds"]; + $extension = $row["extension"]; + $ping = $row["ping"]; + $caller_id_in_from = $row["caller_id_in_from"]; + $supress_cng = $row["supress_cng"]; + $extension_in_contact = $row["extension_in_contact"]; + $effective_caller_id_name = $row["effective_caller_id_name"]; + $effective_caller_id_number = $row["effective_caller_id_number"]; + $outbound_caller_id_name = $row["outbound_caller_id_name"]; + $outbound_caller_id_number = $row["outbound_caller_id_number"]; + $context = $row["context"]; + $enabled = $row["enabled"]; + $description = 'copy: '.$row["description"]; + break; //limit to 1 row + } + unset ($prep_statement); + +//copy the gateways + $gateway_uuid = uuid(); + $sql = "insert into v_gateways "; + $sql .= "("; + $sql .= "domain_uuid, "; + $sql .= "gateway_uuid, "; + $sql .= "gateway, "; + $sql .= "username, "; + $sql .= "password, "; + $sql .= "auth_username, "; + $sql .= "realm, "; + $sql .= "from_user, "; + $sql .= "from_domain, "; + $sql .= "proxy, "; + $sql .= "register_proxy, "; + $sql .= "outbound_proxy, "; + $sql .= "expire_seconds, "; + $sql .= "register, "; + $sql .= "register_transport, "; + $sql .= "retry_seconds, "; + $sql .= "extension, "; + $sql .= "ping, "; + $sql .= "caller_id_in_from, "; + $sql .= "supress_cng, "; + $sql .= "extension_in_contact, "; + $sql .= "effective_caller_id_name, "; + $sql .= "effective_caller_id_number, "; + $sql .= "outbound_caller_id_name, "; + $sql .= "outbound_caller_id_number, "; + $sql .= "context, "; + $sql .= "enabled, "; + $sql .= "description "; + $sql .= ")"; + $sql .= "values "; + $sql .= "("; + $sql .= "'$domain_uuid', "; + $sql .= "'$gateway_uuid', "; + $sql .= "'$gateway', "; + $sql .= "'$username', "; + $sql .= "'$password', "; + $sql .= "'$auth_username', "; + $sql .= "'$realm', "; + $sql .= "'$from_user', "; + $sql .= "'$from_domain', "; + $sql .= "'$proxy', "; + $sql .= "'$register_proxy', "; + $sql .= "'$outbound_proxy', "; + $sql .= "'$expire_seconds', "; + $sql .= "'$register', "; + $sql .= "'$register_transport', "; + $sql .= "'$retry_seconds', "; + $sql .= "'$extension', "; + $sql .= "'$ping', "; + $sql .= "'$caller_id_in_from', "; + $sql .= "'$supress_cng', "; + $sql .= "'$extension_in_contact', "; + $sql .= "'$effective_caller_id_name', "; + $sql .= "'$effective_caller_id_number', "; + $sql .= "'$outbound_caller_id_name', "; + $sql .= "'$outbound_caller_id_number', "; + $sql .= "'$context', "; + $sql .= "'$enabled', "; + $sql .= "'$description' "; + $sql .= ")"; + $db->exec(check_sql($sql)); + unset($sql); + +//synchronize the xml config + save_gateway_xml(); + +//redirect the user + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Copy Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + +?> \ No newline at end of file diff --git a/app/gateways/v_gateways_delete.php b/app/gateways/v_gateways_delete.php new file mode 100644 index 0000000000..9c965156cf --- /dev/null +++ b/app/gateways/v_gateways_delete.php @@ -0,0 +1,122 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('gateways_delete')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +if (strlen($_GET["id"])>0) { + //set the variable + $id = $_GET["id"]; + + //get the gateway name + $sql = ""; + $sql .= "select * from v_gateways "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and gateway_uuid = '$id' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach ($result as &$row) { + $gateway = $row["gateway"]; + $profile = $row["profile"]; + break; //limit to 1 row + } + unset ($prep_statement); + + //delete the xml file + if (count($_SESSION["domains"]) > 1) { + $gateway_xml_file = $_SESSION['switch']['gateways']['dir']."/".$profile."/v_".$_SESSION['domain_name'].'-'.$gateway.".xml"; + } + else { + $gateway_xml_file = $_SESSION['switch']['gateways']['dir']."/".$profile."/v_".$gateway.".xml"; + } + unlink($gateway_xml_file); + + //create the event socket connection and stop the gateway + if (!$fp) { + $fp = event_socket_create($_SESSION['event_socket_ip_address'], $_SESSION['event_socket_port'], $_SESSION['event_socket_password']); + } + if ($fp) { + //send the api gateway stop command over event socket + if (count($_SESSION["domains"]) > 1) { + $tmp_cmd = 'api sofia profile '.$profile.' killgw '.$_SESSION['domain_name'].'-'.$gateway; + } + else { + $tmp_cmd = 'api sofia profile '.$profile.' killgw '.$gateway; + } + $response = event_socket_request($fp, $tmp_cmd); + unset($tmp_cmd); + } + + //delete gateway + $sql = "delete from v_gateways "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and gateway_uuid = '$id' "; + $db->query($sql); + unset($sql); + + //syncrhonize configuration + save_gateway_xml(); + + //synchronize the xml config + save_dialplan_xml(); + + //rescan the sip profile to look for new or stopped gateways + //create the event socket connection and send a command + if (!$fp) { + $fp = event_socket_create($_SESSION['event_socket_ip_address'], $_SESSION['event_socket_port'], $_SESSION['event_socket_password']); + } + if ($fp) { + //send the api commandover event socket + $tmp_cmd = 'api sofia profile '.$profile.' rescan'; + $response = event_socket_request($fp, $tmp_cmd); + unset($tmp_cmd); + //close the connection + fclose($fp); + } + usleep(1000); + + //clear the apply settings reminder + $_SESSION["reload_xml"] = false; +} + +//redirect the users + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Delete Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + +?> \ No newline at end of file diff --git a/app/gateways/v_gateways_edit.php b/app/gateways/v_gateways_edit.php new file mode 100644 index 0000000000..70893d3a38 --- /dev/null +++ b/app/gateways/v_gateways_edit.php @@ -0,0 +1,797 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('gateways_add') || permission_exists('gateways_edit')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +//add or update the database + if (isset($_REQUEST["id"])) { + $action = "update"; + $gateway_uuid = check_str($_REQUEST["id"]); + } + else { + $action = "add"; + } + +//get the http values and set them as php variables + if (count($_POST)>0) { + //$domain_uuid = check_str($_POST["domain_uuid"]); + $gateway = check_str($_POST["gateway"]); + $username = check_str($_POST["username"]); + $password = check_str($_POST["password"]); + $distinct_to = check_str($_POST["distinct_to"]); + $auth_username = check_str($_POST["auth_username"]); + $realm = check_str($_POST["realm"]); + $from_user = check_str($_POST["from_user"]); + $from_domain = check_str($_POST["from_domain"]); + $proxy = check_str($_POST["proxy"]); + $register_proxy = check_str($_POST["register_proxy"]); + $outbound_proxy = check_str($_POST["outbound_proxy"]); + $expire_seconds = check_str($_POST["expire_seconds"]); + $register = check_str($_POST["register"]); + $register_transport = check_str($_POST["register_transport"]); + $retry_seconds = check_str($_POST["retry_seconds"]); + $extension = check_str($_POST["extension"]); + $ping = check_str($_POST["ping"]); + $caller_id_in_from = check_str($_POST["caller_id_in_from"]); + $supress_cng = check_str($_POST["supress_cng"]); + $sip_cid_type = check_str($_POST["sip_cid_type"]); + $extension_in_contact = check_str($_POST["extension_in_contact"]); + $context = check_str($_POST["context"]); + $profile = check_str($_POST["profile"]); + $enabled = check_str($_POST["enabled"]); + $description = check_str($_POST["description"]); + } + +if (count($_POST)>0 && strlen($_POST["persistformvar"]) == 0) { + + $msg = ''; + if ($action == "update") { + $gateway_uuid = check_str($_POST["gateway_uuid"]); + } + + //check for all required data + //if (strlen($domain_uuid) == 0) { $msg .= "Please provide: domain_uuid
\n"; } + if (strlen($gateway) == 0) { $msg .= "Please provide: Gateway
\n"; } + if ($register == "true") { + if (strlen($username) == 0) { $msg .= "Please provide: Username
\n"; } + if (strlen($password) == 0) { $msg .= "Please provide: Password
\n"; } + } + //if (strlen($distinct_to) == 0) { $msg .= "Please provide: Distinct To
\n"; } + //if (strlen($auth_username) == 0) { $msg .= "Please provide: Auth username
\n"; } + //if (strlen($realm) == 0) { $msg .= "Please provide: Realm
\n"; } + //if (strlen($from_user) == 0) { $msg .= "Please provide: From user
\n"; } + //if (strlen($from_domain) == 0) { $msg .= "Please provide: From domain
\n"; } + //if (strlen($proxy) == 0) { $msg .= "Please provide: Proxy
\n"; } + if (strlen($expire_seconds) == 0) { $msg .= "Please provide: Expire seconds
\n"; } + if (strlen($register) == 0) { $msg .= "Please provide: Register
\n"; } + //if (strlen($register_transport) == 0) { $msg .= "Please provide: Register transport
\n"; } + if (strlen($retry_seconds) == 0) { $msg .= "Please provide: Retry seconds
\n"; } + //if (strlen($extension) == 0) { $msg .= "Please provide: Extension
\n"; } + //if (strlen($ping) == 0) { $msg .= "Please provide: Ping
\n"; } + //if (strlen($caller_id_in_from) == 0) { $msg .= "Please provide: Caller ID in from
\n"; } + //if (strlen($supress_cng) == 0) { $msg .= "Please provide: Supress CNG
\n"; } + //if (strlen($sip_cid_type) == 0) { $msg .= "Please provide: SIP CID Type
\n"; } + //if (strlen($extension_in_contact) == 0) { $msg .= "Please provide: Extension in Contact
\n"; } + if (strlen($context) == 0) { $msg .= "Please provide: Context
\n"; } + //if (strlen($profile) == 0) { $msg .= "Please provide: Profile
\n"; } + if (strlen($enabled) == 0) { $msg .= "Please provide: Enabled
\n"; } + //if (strlen($description) == 0) { $msg .= "Please provide: Gateway Description
\n"; } + if (strlen($msg) > 0 && strlen($_POST["persistformvar"]) == 0) { + require_once "includes/header.php"; + require_once "includes/persistformvar.php"; + echo "
\n"; + echo "
\n"; + echo $msg."
"; + echo "
\n"; + persistformvar($_POST); + echo "
\n"; + require_once "includes/footer.php"; + return; + } + + //remove the invalid characters from the gateway name + $gateway = str_replace(" ", "_", $gateway); + $gateway = str_replace("/", "", $gateway); + + //add or update the database + if ($_POST["persistformvar"] != "true") { + if ($action == "add" && permission_exists('gateways_add')) { + $gateway_uuid = uuid(); + $sql = "insert into v_gateways "; + $sql .= "("; + $sql .= "domain_uuid, "; + $sql .= "gateway_uuid, "; + $sql .= "gateway, "; + $sql .= "username, "; + $sql .= "password, "; + $sql .= "distinct_to, "; + $sql .= "auth_username, "; + $sql .= "realm, "; + $sql .= "from_user, "; + $sql .= "from_domain, "; + $sql .= "proxy, "; + $sql .= "register_proxy, "; + $sql .= "outbound_proxy, "; + $sql .= "expire_seconds, "; + $sql .= "register, "; + $sql .= "register_transport, "; + $sql .= "retry_seconds, "; + $sql .= "extension, "; + $sql .= "ping, "; + $sql .= "caller_id_in_from, "; + $sql .= "supress_cng, "; + $sql .= "sip_cid_type, "; + $sql .= "extension_in_contact, "; + $sql .= "context, "; + $sql .= "profile, "; + $sql .= "enabled, "; + $sql .= "description "; + $sql .= ")"; + $sql .= "values "; + $sql .= "("; + $sql .= "'$domain_uuid', "; + $sql .= "'$gateway_uuid', "; + $sql .= "'$gateway', "; + $sql .= "'$username', "; + $sql .= "'$password', "; + $sql .= "'$distinct_to', "; + $sql .= "'$auth_username', "; + $sql .= "'$realm', "; + $sql .= "'$from_user', "; + $sql .= "'$from_domain', "; + $sql .= "'$proxy', "; + $sql .= "'$register_proxy', "; + $sql .= "'$outbound_proxy', "; + $sql .= "'$expire_seconds', "; + $sql .= "'$register', "; + $sql .= "'$register_transport', "; + $sql .= "'$retry_seconds', "; + $sql .= "'$extension', "; + $sql .= "'$ping', "; + $sql .= "'$caller_id_in_from', "; + $sql .= "'$supress_cng', "; + $sql .= "'$sip_cid_type', "; + $sql .= "'$extension_in_contact', "; + $sql .= "'$context', "; + $sql .= "'$profile', "; + $sql .= "'$enabled', "; + $sql .= "'$description' "; + $sql .= ")"; + $db->exec(check_sql($sql)); + unset($sql); + + //syncrhonize configuration + save_gateway_xml(); + + } //if ($action == "add") + + if ($action == "update" && permission_exists('gateways_edit')) { + $sql = "update v_gateways set "; + //$sql .= "domain_uuid = '$domain_uuid', "; + $sql .= "gateway = '$gateway', "; + $sql .= "username = '$username', "; + $sql .= "password = '$password', "; + $sql .= "distinct_to = '$distinct_to', "; + $sql .= "auth_username = '$auth_username', "; + $sql .= "realm = '$realm', "; + $sql .= "from_user = '$from_user', "; + $sql .= "from_domain = '$from_domain', "; + $sql .= "proxy = '$proxy', "; + $sql .= "register_proxy = '$register_proxy', "; + $sql .= "outbound_proxy = '$outbound_proxy', "; + $sql .= "expire_seconds = '$expire_seconds', "; + $sql .= "register = '$register', "; + $sql .= "register_transport = '$register_transport', "; + $sql .= "retry_seconds = '$retry_seconds', "; + $sql .= "extension = '$extension', "; + $sql .= "ping = '$ping', "; + $sql .= "caller_id_in_from = '$caller_id_in_from', "; + $sql .= "supress_cng = '$supress_cng', "; + $sql .= "sip_cid_type = '$sip_cid_type', "; + $sql .= "extension_in_contact = '$extension_in_contact', "; + $sql .= "context = '$context', "; + $sql .= "profile = '$profile', "; + $sql .= "enabled = '$enabled', "; + $sql .= "description = '$description' "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and gateway_uuid = '$gateway_uuid'"; + $db->exec(check_sql($sql)); + unset($sql); + + //syncrhonize configuration + save_gateway_xml(); + + //synchronize the xml config + save_dialplan_xml(); + + } //if ($action == "update") + + //rescan the external profile to look for new or stopped gateways + //create the event socket connection + $fp = event_socket_create($_SESSION['event_socket_ip_address'], $_SESSION['event_socket_port'], $_SESSION['event_socket_password']); + $tmp_cmd = 'api sofia profile external rescan'; + $response = event_socket_request($fp, $tmp_cmd); + unset($tmp_cmd); + usleep(1000); + //close the connection + fclose($fp); + //clear the apply settings reminder + $_SESSION["reload_xml"] = false; + } //if ($_POST["persistformvar"] != "true") + + //redirect the user + if (isset($action)) { + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + if ($action == "add") { + echo "Add Complete\n"; + } + if ($action == "update") { + echo "Edit Complete\n"; + } + echo "
\n"; + require_once "includes/footer.php"; + return; + } +} //(count($_POST)>0 && strlen($_POST["persistformvar"]) == 0) + +//pre-populate the form + if (count($_GET)>0 && $_POST["persistformvar"] != "true") { + $gateway_uuid = $_GET["id"]; + $sql = "select * from v_gateways "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and gateway_uuid = '$gateway_uuid' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach ($result as &$row) { + $domain_uuid = $row["domain_uuid"]; + $gateway = $row["gateway"]; + $username = $row["username"]; + $password = $row["password"]; + $distinct_to = $row["distinct_to"]; + $auth_username = $row["auth_username"]; + $realm = $row["realm"]; + $from_user = $row["from_user"]; + $from_domain = $row["from_domain"]; + $proxy = $row["proxy"]; + $register_proxy = $row["register_proxy"]; + $outbound_proxy = $row["outbound_proxy"]; + $expire_seconds = $row["expire_seconds"]; + $register = $row["register"]; + $register_transport = $row["register_transport"]; + $retry_seconds = $row["retry_seconds"]; + $extension = $row["extension"]; + $ping = $row["ping"]; + $caller_id_in_from = $row["caller_id_in_from"]; + $supress_cng = $row["supress_cng"]; + $sip_cid_type = $row["sip_cid_type"]; + $extension_in_contact = $row["extension_in_contact"]; + $context = $row["context"]; + $profile = $row["profile"]; + $enabled = $row["enabled"]; + $description = $row["description"]; + break; //limit to 1 row + } + unset ($prep_statement); + } + +//show the header + require_once "includes/header.php"; + +//show the content + echo ""; + + echo "
"; + echo "\n"; + + echo "\n"; + echo " "; + echo " "; + echo "
\n"; + echo "
"; + + echo "
\n"; + echo "
\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + //--- begin: show_advanced ----------------------- + echo "\n"; + echo "\n"; + echo "\n"; + //--- end: show_advanced ----------------------- + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo " \n"; + echo " \n"; + echo " "; + echo "
\n"; + + echo "\n"; + echo " \n"; + echo " "; + echo " \n"; + echo " "; + echo " "; + echo " \n"; + echo " \n"; + echo "
\n"; + echo " Gateway Edit
\n"; + echo "
\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "
\n"; + echo " Defines a connections to a SIP Provider or another SIP server.
\n"; + echo "
\n"; + echo "
\n"; + + echo "
\n"; + echo " Gateway:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the gateway name here.\n"; + echo "
\n"; + echo " Username:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the username here.\n"; + echo "
\n"; + echo " Password:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the password here. \n"; + echo "
\n"; + echo " From user:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the from-user here.\n"; + echo "
\n"; + echo " From domain:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the from-domain here.\n"; + echo "
\n"; + echo " Proxy:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the domain or IP address of the proxy.\n"; + echo "
\n"; + echo " Realm:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the realm here.\n"; + echo "
\n"; + echo " Expire seconds:\n"; + echo "\n"; + if (strlen($expire_seconds) == 0) { $expire_seconds = "800"; } + echo " \n"; + echo "
\n"; + echo "Enter the expire-seconds here.\n"; + echo "
\n"; + echo " Register:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Choose whether to register. \n"; + echo "
\n"; + echo " Retry seconds:\n"; + echo "\n"; + if (strlen($retry_seconds) == 0) { $retry_seconds = "60"; } + echo " \n"; + echo "
\n"; + echo "Enter the retry-seconds here.\n"; + echo "
\n"; + + echo "
\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "
Show Advanced\n"; + echo " \n"; + echo "
\n"; + echo "
\n"; + + echo "
\n"; + echo " \n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo " \n"; + echo " \n"; + echo " \n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "
\n"; + echo " Distinct To:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the distinct_to here.\n"; + echo "
\n"; + echo " Auth username:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the auth-username here.\n"; + echo "
\n"; + echo " Extension:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the extension here.\n"; + echo "
\n"; + echo " Register transport:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Choose whether to register-transport. \n"; + echo "
\n"; + echo " Register Proxy:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the register proxy here.\n"; + echo "
\n"; + echo " Outbound Proxy:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the outbound proxy here.\n"; + echo "
\n"; + echo " Caller ID in from:\n"; + echo " \n"; + echo " \n"; + echo "
\n"; + echo "Enter the caller-id-in-from.\n"; + echo "
\n"; + echo " Supress CNG:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the supress-cng.\n"; + echo "
\n"; + echo " SIP CID Type:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the sip_cid_type: none, pid, and rpid.\n"; + echo "
\n"; + echo " Extension in Contact:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the extension_in_contact.\n"; + echo "
\n"; + echo " Ping:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the ping interval here in seconds.\n"; + echo "
\n"; + echo "
"; + + echo "
\n"; + echo " Context:\n"; + echo "\n"; + if (strlen($context) == 0) { $context = "public"; } + echo " \n"; + echo "
\n"; + echo "Enter the context here.\n"; + echo "
\n"; + echo " Profile:\n"; + echo "\n"; + if (strlen($profile) == 0) { $profile = "external"; } + echo " \n"; + echo "
\n"; + echo "Enter the profile here.\n"; + echo "
\n"; + echo " Enabled:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "\n"; + echo "
\n"; + echo " Gateway Description:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the description of the gateway here.\n"; + echo "
\n"; + if ($action == "update") { + echo " \n"; + } + echo " \n"; + echo "
"; + echo ""; + + echo "
"; + echo "
"; + +//show footer + require_once "includes/footer.php"; +?> \ No newline at end of file diff --git a/app/grammar_edit/app_config.php b/app/grammar_edit/app_config.php new file mode 100644 index 0000000000..4649825910 --- /dev/null +++ b/app/grammar_edit/app_config.php @@ -0,0 +1,28 @@ + \ No newline at end of file diff --git a/app/grammar_edit/clipadd.php b/app/grammar_edit/clipadd.php new file mode 100644 index 0000000000..044f922b9b --- /dev/null +++ b/app/grammar_edit/clipadd.php @@ -0,0 +1,126 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('grammar_save')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +if (count($_POST)>0) { + $clip_name = check_str($_POST["clip_name"]); + $clip_folder = check_str($_POST["clip_folder"]); + $clip_text_start = check_str($_POST["clip_text_start"]); + $clip_text_end = check_str($_POST["clip_text_end"]); + $clip_desc = check_str($_POST["clip_desc"]); + $clip_order = check_str($_POST["clip_order"]); + if (strlen($clip_order) == 0) { $clip_order = 0; } + + $sql = "insert into v_clips "; + $sql .= "("; + $sql .= "clip_uuid, "; + $sql .= "clip_name, "; + $sql .= "clip_folder, "; + $sql .= "clip_text_start, "; + $sql .= "clip_text_end, "; + $sql .= "clip_desc, "; + $sql .= "clip_order "; + $sql .= ")"; + $sql .= "values "; + $sql .= "("; + $sql .= "'".uuid()."', "; + $sql .= "'$clip_name', "; + $sql .= "'$clip_folder', "; + $sql .= "'$clip_text_start', "; + $sql .= "'$clip_text_end', "; + $sql .= "'$clip_desc', "; + $sql .= "'$clip_order' "; + $sql .= ")"; + $db->exec(check_sql($sql)); + unset($sql,$db); + + require_once "header.php"; + echo "\n"; + echo "Add Complete"; + require_once "footer.php"; + return; +} + +//show the content + require_once "header.php"; + echo "
"; + echo "\n"; + echo "\n"; + echo " "; + echo " "; + echo "
\n"; + + //echo "Clip Library"; + //echo "
"; + echo "
"; + echo ""; + echo " "; + echo " "; + echo " "; + echo " "; + + echo " "; + echo " "; + echo " "; + echo " "; + + echo " "; + echo " "; + echo " "; + + echo " "; + echo " "; + echo " "; + + echo " "; + echo " "; + echo " "; + + echo " "; + echo " "; + echo "
Name:
Folder:
Before Selection:
"; + echo " "; + echo "
After Selection:
"; + echo " "; + echo "
Notes:
"; + echo " "; + echo "
"; + echo "
"; + + echo "
"; + echo "
"; + + require_once "footer.php"; +?> \ No newline at end of file diff --git a/app/grammar_edit/clipdelete.php b/app/grammar_edit/clipdelete.php new file mode 100644 index 0000000000..63951df09a --- /dev/null +++ b/app/grammar_edit/clipdelete.php @@ -0,0 +1,56 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('grammar_save')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +//get the uuid from http values + $clip_uuid = check_str($_GET["id"]); + +//delete the clip + if (strlen($_GET["id"])>0) { + $sql = "delete from v_clips "; + $sql .= "where clip_uuid = '".$clip_uuid."' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + unset($sql,$db); + } + +//redirect the browser + require_once "header.php"; + echo "\n"; + echo "Delete Complete"; + require_once "footer.php"; + return; + +?> diff --git a/app/grammar_edit/cliplist.php b/app/grammar_edit/cliplist.php new file mode 100644 index 0000000000..2f7c8d97f5 --- /dev/null +++ b/app/grammar_edit/cliplist.php @@ -0,0 +1,235 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +require_once "includes/checkauth.php"; +if (permission_exists('grammar_view')) { + //access granted +} +else { + echo "access denied"; + exit; +} +//require_once "edit/header.php"; + +echo ""; +echo ""; +echo ""; + +function isfile($filename) { + if (@filesize($filename) > 0) { return true; } else { return false; } +} + +function space($count) { + $r=''; $i=0; + while($i < $count) { + $r .= ' '; + $i++; + } + return $r; +} + +echo ""; + +echo ""; + +echo ""; +echo ""; +echo "
"; +echo "\n"; +echo "\n"; +echo "
\n"; +echo "
Clip Library
\n"; //display:none + +$sql = "select * from v_clips "; +$sql .= "order by clip_folder "; +$prep_statement = $db->prepare(check_sql($sql)); +$prep_statement->execute(); +$result = $prep_statement->fetchAll(PDO::FETCH_NAMED); +$result_count = count($result); + +if ($result_count > 0) { //no results + $last_folder = ''; + $tag_open = ''; + $x = 0; + $current_depth = 0; + $previous_depth = 0; + foreach($result as $row) { + $current_depth = count(explode ("/", $row['clip_folder'])); + if ($current_depth < $previous_depth) { + $count = ($previous_depth - $current_depth); + $i=0; + while($i < $count){ + echo "
\n"; + $i++; + } + echo "
\n"; + } + + if ($last_folder != $row['clip_folder']) { + $clip_folder_name = str_replace ($previous_folder_name, "", $row['clip_folder']); + $clip_folder_name = str_replace ("/", "", $clip_folder_name); + echo "
 ".$clip_folder_name."  
\n\n"; + $tag_open = 1; + } + + $previous_depth = $current_depth; + $previous_folder_name = $row['clip_folder']; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "
\n"; + echo "".$row['clip_name']."\n"; + echo "
\n"; + echo "\n\n"; + + $last_folder = $row['clip_folder']; + + if ($c==0) { $c=1; } else { $c=0; } + } //end foreach + unset($sql, $result, $row_count); + +} //end if results + +echo "\n"; +echo "
\n"; + +echo "\n"; +echo "\n"; +echo "\n"; +echo "
"; + +echo "

"; +//require_once "includes/footer.php"; + +unset ($result_count); +unset ($result); +unset ($key); +unset ($val); +unset ($c); + +echo ""; +echo ""; + +?> diff --git a/app/grammar_edit/clipoptions.php b/app/grammar_edit/clipoptions.php new file mode 100644 index 0000000000..8be0d61402 --- /dev/null +++ b/app/grammar_edit/clipoptions.php @@ -0,0 +1,71 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('grammar_view')) { + //access granted +} +else { + echo "access denied"; + exit; +} +require_once "header.php"; + +echo "
"; +echo "\n"; +echo ""; +echo "\n"; +echo ""; +echo "\n"; +echo "\n"; +echo "\n"; +echo "\n"; +echo "
Selected Clip:
"; +echo " "; +echo ""; + +echo " "; +//echo " \n"; +//echo " \n"; +//echo " \n"; + +echo " \n"; +echo " \n"; +//echo " \n"; +echo " \n"; +echo " \n"; + +echo " \n"; +echo "
Options











"; + +echo "
"; +echo "
"; + +require_once "footer.php"; +?> diff --git a/app/grammar_edit/clipoptionslist.php b/app/grammar_edit/clipoptionslist.php new file mode 100644 index 0000000000..5a5dc5b127 --- /dev/null +++ b/app/grammar_edit/clipoptionslist.php @@ -0,0 +1,228 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('grammar_view')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +echo ""; +echo ""; + +echo ""; + +function isfile($filename) { + if (@filesize($filename) > 0) { return true; } else { return false; } +} + +function space($count) { + $r=''; $i=0; + while($i < $count) { + $r .= ' '; + $i++; + } + return $r; +} + +//show the content + echo ""; + + echo ""; + +echo ""; +echo ""; + + echo "
"; + echo "\n"; + + echo "\n"; + echo "
\n"; + echo "
Clip Library
\n"; //display:none + + $sql = "select * from v_clips "; + $sql .= "order by clip_folder "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + $result_count = count($result); + + if ($result_count > 0) { //no results + $last_folder = ''; + $tag_open = ''; + $x = 0; + $current_depth = 0; + $previous_depth = 0; + foreach($result as $row) { + $current_depth = count(explode("/", $row[clip_folder])); + if ($current_depth < $previous_depth) { + $count = ($previous_depth - $current_depth); + $i=0; + while($i < $count){ + echo "
\n"; + $i++; + } + echo "
\n"; + + } + + if ($last_folder != $row['clip_folder']) { + $clip_folder_name = str_replace ($previous_folder_name, "", $row['clip_folder']); + $clip_folder_name = str_replace ("/", "", $clip_folder_name); + echo "
 ".$clip_folder_name."  
\n\n"; + $tag_open = 1; + } + + $previous_depth = $current_depth; + $previous_folder_name = $row['clip_folder']; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "
\n"; + echo "".$row['clip_name']."\n"; + + echo "
\n"; + echo "\n\n"; + + $last_folder = $row['clip_folder']; + if ($c==0) { $c=1; } else { $c=0; } + } //end foreach + unset($sql, $result, $row_count); + } //end if results + + echo "\n"; + echo "
\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "
"; + + echo "

"; + + unset ($result_count); + unset ($result); + unset ($key); + unset ($val); + unset ($c); + + echo ""; + echo ""; + +?> diff --git a/app/grammar_edit/clipsearch.php b/app/grammar_edit/clipsearch.php new file mode 100644 index 0000000000..cf19239107 --- /dev/null +++ b/app/grammar_edit/clipsearch.php @@ -0,0 +1,180 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/checkauth.php"; +if (permission_exists('grammar_view')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +if (count($_POST)>0) { + $clip_uuid = $_POST["id"]; + $clip_name = $_POST["clip_name"]; + $clip_folder = $_POST["clip_folder"]; + $clip_text_start = $_POST["clip_text_start"]; + $clip_text_end = $_POST["clip_text_end"]; + $clip_desc = $_POST["clip_desc"]; + $clip_order = $_POST["clip_order"]; + + require_once "header.php"; + echo "
"; + echo "\n"; + echo "\n"; + echo " \n"; + echo "\n"; + + } //end if results + + echo "
\n"; + echo "
"; + + $sql .= "select * from v_clips "; + $sql .= "where "; + if (strlen($clip_uuid) > 0) { $sql .= "and id = '$clip_uuid' "; } + if (strlen($clip_name) > 0) { $sql .= "and clip_name like '%$clip_name%' "; } + if (strlen($clip_folder) > 0) { $sql .= "and clip_folder like '%$clip_folder%' "; } + if (strlen($clip_text_start) > 0) { $sql .= "and clip_text_start like '%$clip_text_start%' "; } + if (strlen($clip_text_end) > 0) { $sql .= "and clip_text_end like '%$clip_text_end%' "; } + if (strlen($clip_desc) > 0) { $sql .= "and clip_desc like '%$clip_desc%' "; } + if (strlen($clip_order) > 0) { $sql .= "and clip_order like '%$clip_order%' "; } + + $sql = trim($sql); + if (substr($sql, -5) == "where"){ $sql = substr($sql, 0, (strlen($sql)-5)); } + $sql = str_replace ("where and", "where", $sql); + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + $result_count = count($result); + + $c = 0; + $row_style["0"] = "background-color: #F5F5DC;"; + $row_style["1"] = "background-color: #FFFFFF;"; + + echo "
\n"; + echo "\n"; + echo ""; + + if ($result_count == 0) { + //no results + echo ""; + } + else { //received results + echo ""; + //echo ""; + echo ""; + //echo ""; + //echo ""; + //echo ""; + //echo ""; + //echo ""; + echo ""; + echo "\n"; + + foreach($result as $row) { + //print_r( $row ); + echo "\n"; + //echo ""; + echo ""; + //echo ""; + //echo ""; + //echo ""; + //echo ""; + //echo ""; + echo ""; + + echo "\n"; + if ($c==0) { $c=1; } else { $c=0; } + } //end foreach unset($sql, $result, $row_count); + echo "
 
    Id        clip_name Search         clip_folder        clip_text_start        clip_text_end        clip_desc        clip_order   
".$row[id]."".$row[clip_name]."".$row[clip_folder]."".$row[clip_text_start]."".$row[clip_text_end]."".$row[clip_desc]."".$row[clip_order]."
\n"; + echo "
\n"; + + echo "

"; + echo "
\n"; + echo "
"; + echo "

"; + require_once "footer.php"; + + unset ($result_count); + unset ($result); + unset ($key); + unset ($val); + unset ($c); + +} +else { + + //show the content + require_once "header.php"; + echo "
"; + echo "\n"; + echo "\n"; + echo " "; + echo " "; + echo "
\n"; + echo "
"; + + echo "
"; + echo ""; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + echo " "; + echo " "; + echo " "; + echo "
Name:
Folder:
Start:
End:
Desc:
clip_order:
"; + echo "
"; + + echo "
"; + echo "
"; + + require_once "footer.php"; + +} //end if not post +?> diff --git a/app/grammar_edit/clipupdate.php b/app/grammar_edit/clipupdate.php new file mode 100644 index 0000000000..c69ca0af1c --- /dev/null +++ b/app/grammar_edit/clipupdate.php @@ -0,0 +1,138 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('grammar_save')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +if (count($_POST)>0) { + $clip_uuid = check_str($_POST["id"]); + $clip_name = check_str($_POST["clip_name"]); + $clip_folder = check_str($_POST["clip_folder"]); + $clip_text_start = check_str($_POST["clip_text_start"]); + $clip_text_end = check_str($_POST["clip_text_end"]); + $clip_desc = check_str($_POST["clip_desc"]); + $clip_order = check_str($_POST["clip_order"]); + + //sql update + $sql = "update v_clips set "; + $sql .= "clip_name = '$clip_name', "; + $sql .= "clip_folder = '$clip_folder', "; + $sql .= "clip_text_start = '$clip_text_start', "; + $sql .= "clip_text_end = '$clip_text_end', "; + $sql .= "clip_desc = '$clip_desc', "; + $sql .= "clip_order = '$clip_order' "; + $sql .= "where clip_uuid = '$clip_uuid' "; + $count = $db->exec(check_sql($sql)); + //echo "affected rows: ".$count; + + //redirect the browser + require_once "header.php"; + echo "\n"; + echo "Update Complete"; + require_once "footer.php"; + return; +} +else { + //get the uuid from http values + $clip_uuid = check_str($_GET["id"]); + + //get the clip + $sql = "select * from v_clips "; + $sql .= "where clip_uuid = '$clip_uuid' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach ($result as &$row) { + $clip_name = $row["clip_name"]; + $clip_folder = $row["clip_folder"]; + $clip_text_start = $row["clip_text_start"]; + $clip_text_end = $row["clip_text_end"]; + $clip_desc = $row["clip_desc"]; + $clip_order = $row["clip_order"]; + break; //limit to 1 row + } +} + +//show the content + require_once "header.php"; + echo "
"; + echo "\n"; + echo "\n"; + echo " "; + echo " "; + echo "
\n"; + + echo "
"; + echo ""; + echo " "; + echo " "; + echo " "; + echo " "; + + echo " "; + echo " "; + echo " "; + echo " "; + + echo " "; + echo " "; + echo " "; + + echo " "; + echo " "; + echo " "; + + echo " "; + echo " "; + echo " "; + + echo " "; + echo " "; + echo " "; + echo "
Name:
Folder:
Before Selection:
"; + echo " "; + echo "
After Selection:
"; + echo " "; + echo "
Notes:
"; + echo " "; + echo "
"; + echo " "; + echo " "; + echo "
"; + echo "
"; + + echo "
"; + echo "
"; + + require_once "footer.php"; +?> diff --git a/app/grammar_edit/filedelete.php b/app/grammar_edit/filedelete.php new file mode 100644 index 0000000000..1f6522c8b5 --- /dev/null +++ b/app/grammar_edit/filedelete.php @@ -0,0 +1,84 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('grammar_save')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +$folder = $_GET["folder"]; +$folder = str_replace ("\\", "/", $folder); +if (substr($folder, -1) != "/") { $folder = $folder.'/'; } +$file = $_GET["file"]; + +if (strlen($folder) > 0 && strlen($file) > 0) { + unlink($folder.$file); + header("Location: fileoptions.php"); +} +else { + //display form + require_once "header.php"; + echo "
"; + echo "
"; + echo "
"; + echo ""; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo "
Path:
".$folder.$file."
"; + + echo "
"; + + echo ""; + echo " "; + echo " "; + echo " "; + + echo " "; + echo " "; + echo " "; + + echo " "; + echo " "; + echo " "; + echo "
File Name:
"; + echo " "; + echo " "; + echo "
"; + echo "
"; + echo "
"; + + require_once "footer.php"; +} +?> diff --git a/app/grammar_edit/filelist.php b/app/grammar_edit/filelist.php new file mode 100644 index 0000000000..546d762ac2 --- /dev/null +++ b/app/grammar_edit/filelist.php @@ -0,0 +1,252 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('grammar_view')) { + //access granted +} +else { + echo "access denied"; + exit; +} +require_once "header.php"; + +function isfile($filename) { + //if (@filesize($filename) > 0) { return true; } else { return false; } +} + +function space($count) { + $r=''; $i=0; + while($i < $count) { + $r .= ' '; + $i++; + } + return $r; +} + +function recur_dir($dir) { + clearstatcache(); + $htmldirlist = ''; + $htmlfilelist = ''; + $dirlist = opendir($dir); + $dir_array = array(); + while (false !== ($file = readdir($dirlist))) { + if ($file != "." AND $file != ".."){ + $newpath = $dir.'/'.$file; + $level = explode('/',$newpath); + if (substr($newpath, -4) == ".svn") { + //ignore .svn dir and subdir + } + elseif (substr($newpath, -3) == ".db") { + //ignore .db files + } + else { + $dir_array[] = $newpath; + } + if ($x > 1000) { break; }; + $x++; + } + } + + asort($dir_array); + foreach ($dir_array as $newpath){ + $level = explode('/',$newpath); + + if (is_dir($newpath)) { + /*$mod_array[] = array( + 'level'=>count($level)-1, + 'path'=>$newpath, + 'name'=>end($level), + 'type'=>'dir', + 'mod_time'=>filemtime($newpath), + 'size'=>''); + $mod_array[] = recur_dir($newpath); + */ + $dirname = end($level); + $htmldirlist .= space(count($level))."
$dirname
\n"; + //$htmldirlist .= space(count($level))."
Tools
\n"; + //$htmldirlist .= space(count($level))."
New Folder
\n"; //parent.document.getElementById('file').value='".urlencode($newpath)."' + //$htmldirlist .= space(count($level))."
\n"; + //$htmldirlist .= space(count($level))."
New File
\n"; //parent.document.getElementById('file').value='".urlencode($newpath)."' + //$htmldirlist .= space(count($level))."
\n"; + //$htmldirlist .= space(count($level))."
\n"; + //$htmldirlist .= space(count($level))."
Options
\n"; //parent.document.getElementById('file').value='".urlencode($newpath)."' + //$htmldirlist .= space(count($level))."
\n"; + $htmldirlist .= recur_dir($newpath); + $htmldirlist .= space(count($level))."
\n"; + } + else { + /*$mod_array[] = array( + 'level'=>count($level)-1, + 'path'=>$newpath, + 'name'=>end($level), + 'type'=>'file', + 'mod_time'=>filemtime($newpath), + 'size'=>filesize($newpath)); + */ + $filename = end($level); + $filesize = round(filesize($newpath)/1024, 2); + $htmlfilelist .= space(count($level))."
$filename
\n"; + $htmlfilelist .= space(count($level))."
\n"; + } + } + closedir($dirlist); + return $htmldirlist ."\n". $htmlfilelist; +} + +echo ""; + + +echo ""; + +echo "
"; +echo "\n"; +echo "\n"; +echo " \n"; + echo "\n"; + echo "
\n"; +//echo "
"; + +echo "\n"; +echo " \n"; +echo "\n"; +echo "
Files
\n"; //display:none +//echo "
Files
\n"; //display:none +echo recur_dir($_SESSION['switch']['grammar']['dir']); +echo "
\n"; + +echo "
\n"; +echo ""; + +echo "

"; +require_once "footer.php"; + +unset ($result_count); +unset ($result); +unset ($key); +unset ($val); +unset ($c); + +echo ""; +echo ""; + +?> diff --git a/app/grammar_edit/filenew.php b/app/grammar_edit/filenew.php new file mode 100644 index 0000000000..63ced8c921 --- /dev/null +++ b/app/grammar_edit/filenew.php @@ -0,0 +1,88 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('grammar_save')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +$folder = $_GET["folder"]; +$folder = str_replace ("\\", "/", $folder); +if (substr($folder, -1) != "/") { $folder = $folder.'/'; } +$file = $_GET["file"]; + +if (strlen($folder) > 0 && strlen($file) > 0) { + //create new file + $handle = fopen($folder.$file, 'wb') or die("Error!!"); + $content = ""; + fwrite($handle, $content); + fclose($handle); + header("Location: fileoptions.php"); +} +else { + require_once "header.php"; + echo "
"; + echo "
"; + echo "
"; + echo ""; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo "
Path:
".$folder.$file."
"; + + echo "
"; + + echo ""; + echo " "; + echo " "; + echo " "; + + echo " "; + echo " "; + echo " "; + + echo " "; + echo " "; + echo " "; + echo "
File Name:
"; + echo " "; + echo " "; + echo "
"; + echo "
"; + echo "
"; + + require_once "footer.php"; +} + +?> diff --git a/app/grammar_edit/fileoptions.php b/app/grammar_edit/fileoptions.php new file mode 100644 index 0000000000..6780000b20 --- /dev/null +++ b/app/grammar_edit/fileoptions.php @@ -0,0 +1,85 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('grammar_view')) { + //access granted +} +else { + echo "access denied"; + exit; +} +require_once "header.php"; + +$file = $_GET["file"]; +$file = str_replace ("\\", "/", $file); +$folder = $_GET["folder"]; +$folder = str_replace ($file, "", $folder); +$urlpath = str_replace ($_SERVER["DOCUMENT_ROOT"], "", $folder); + +echo "
"; +echo "\n"; +echo ""; +echo "\n"; +echo "\n"; + +echo "\n"; +echo "\n"; +echo "\n"; +echo "\n"; +echo "
"; + +echo ""; +echo ""; +echo "\n"; +echo "\n"; +echo ""; +echo "
Path:
File:
"; + +echo "
"; +echo " "; +echo ""; + +echo "
"; +echo ""; +echo " \n"; +echo " \n"; +echo " \n"; +echo " \n"; +echo " \n"; +echo " \n"; +echo " \n"; +echo "





"; +echo "
"; + +echo "
"; +echo "
"; + +require_once "footer.php"; +?> diff --git a/app/grammar_edit/fileoptionslist.php b/app/grammar_edit/fileoptionslist.php new file mode 100644 index 0000000000..27a7420c65 --- /dev/null +++ b/app/grammar_edit/fileoptionslist.php @@ -0,0 +1,246 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('grammar_view')) { + //access granted +} +else { + echo "access denied"; + exit; +} +require_once "header.php"; + +function isfile($filename) { + if (@filesize($filename) > 0) { return true; } else { return false; } +} + +function space($count) { + $r=''; $i=0; + while($i < $count) { + $r .= ' '; + $i++; + } + return $r; +} + +function recur_dir($dir) { + clearstatcache(); + $htmldirlist = ''; + $htmlfilelist = ''; + $dirlist = opendir($dir); + while ($file = readdir ($dirlist)) { + if ($file != '.' && $file != '..') { + $newpath = $dir.'/'.$file; + $level = explode('/',$newpath); + + if (is_dir($newpath)) { + /*$mod_array[] = array( + 'level'=>count($level)-1, + 'path'=>$newpath, + 'name'=>end($level), + 'type'=>'dir', + 'mod_time'=>filemtime($newpath), + 'size'=>''); + $mod_array[] = recur_dir($newpath); + */ + $dirname = end($level); + $htmldirlist .= space(count($level))."
$dirname
\n"; + //$htmldirlist .= space(count($level))."
Tools
\n"; + //$htmldirlist .= space(count($level))."
New Folder
\n"; //parent.document.getElementById('file').value='".urlencode($newpath)."' + //$htmldirlist .= space(count($level))."
\n"; + //$htmldirlist .= space(count($level))."
New File
\n"; //parent.document.getElementById('file').value='".urlencode($newpath)."' + //$htmldirlist .= space(count($level))."
\n"; + //$htmldirlist .= space(count($level))."
\n"; + //$htmldirlist .= space(count($level))."
Options
\n"; //parent.document.getElementById('file').value='".urlencode($newpath)."' + //$htmldirlist .= space(count($level))."
\n"; + $htmldirlist .= recur_dir($newpath); + $htmldirlist .= space(count($level))."
\n"; + } + else { + /*$mod_array[] = array( + 'level'=>count($level)-1, + 'path'=>$newpath, + 'name'=>end($level), + 'type'=>'file', + 'mod_time'=>filemtime($newpath), + 'size'=>filesize($newpath)); + */ + $filename = end($level); + $filesize = round(filesize($newpath)/1024, 2); + $newpath = str_replace ($filename, "", $newpath); + $htmlfilelist .= space(count($level))."
$filename
\n"; + $htmlfilelist .= space(count($level))."
\n"; + } + } + } + + closedir($dirlist); + return $htmldirlist ."\n". $htmlfilelist; +} + +echo "\n"; + +echo "\n"; + +echo "
"; +echo "\n"; + +echo "\n"; +echo "
\n"; +echo "\n"; +echo " \n"; +echo "\n"; +echo "
Files
\n"; //display:none +//echo "
Files
\n"; //display:none + +//echo "
Tools
\n"; +//echo "
New Folder
\n"; //parent.document.getElementById('file').value='".urlencode($newpath)."' +//echo "
\n"; +//echo "
New File
\n"; //parent.document.getElementById('file').value='".urlencode($newpath)."' +//echo "
\n"; +//echo "
\n"; + +echo recur_dir($_SESSION['switch']['grammar']['dir']); + +echo "
\n"; + + +echo "
\n"; +echo ""; + +echo "

"; +require_once "footer.php"; + +unset ($result_count); +unset ($result); +unset ($key); +unset ($val); +unset ($c); + +echo ""; +echo ""; + +?> \ No newline at end of file diff --git a/app/grammar_edit/fileread.php b/app/grammar_edit/fileread.php new file mode 100644 index 0000000000..273bda234c --- /dev/null +++ b/app/grammar_edit/fileread.php @@ -0,0 +1,49 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('grammar_view')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +$filename = $_POST["file"]; +$filename = str_replace ("\\", "/", $filename); + +$handle = fopen($filename, "r"); +if ($handle) { + while (!feof($handle)) { + $buffer = fgets($handle, 4096); + echo $buffer; + } + fclose($handle); +} + +?> diff --git a/app/grammar_edit/filerename.php b/app/grammar_edit/filerename.php new file mode 100644 index 0000000000..e65f7eb19a --- /dev/null +++ b/app/grammar_edit/filerename.php @@ -0,0 +1,102 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('grammar_save')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +$folder = $_GET["folder"]; +//$folder = str_replace ("\\", "/", $folder); +//if (substr($folder, -1) != "/") { $folder = $folder.'/'; } +$newfilename = $_GET["newfilename"]; +$filename = $_GET["filename"]; +//echo $folder.$file; + + +if (strlen($folder) > 0 && strlen($newfilename) > 0) { + //echo "new file: ".$newfilename."
"; + //echo "folder: ".$folder."
"; + //echo "orig filename: ".$filename."
";; + rename($folder.$filename, $folder.$newfilename); + header("Location: fileoptions.php"); +} +else { //display form + + require_once "header.php"; + echo "
"; + echo "
"; + echo "
"; + echo ""; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo "
Path:
".$folder.$filename."

Original file name:
".$filename."
"; + + echo "
"; + + echo ""; + echo " "; + echo " "; + echo " "; + + echo " "; + echo " "; + echo " "; + + echo " "; + echo " "; + echo " "; + echo "
Rename file to:
"; + echo " "; + echo " "; + echo " "; + echo "
"; + echo "
"; + echo "
"; + + require_once "footer.php"; + +} + +?> diff --git a/app/grammar_edit/filesave.php b/app/grammar_edit/filesave.php new file mode 100644 index 0000000000..f3ccabc8d3 --- /dev/null +++ b/app/grammar_edit/filesave.php @@ -0,0 +1,50 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('grammar_save')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +$filename = $_POST["file"]; //filename with the path +$filename = str_replace ("\\", "/", $filename); +$content = $_POST["content"]; + +$handle = fopen($filename, 'wb') or die("Error!!"); +fwrite($handle, $content); +fclose($handle); + +//set the reload_xml value to true + $_SESSION["reload_xml"] = true; + +echo $content; + +?> diff --git a/app/grammar_edit/folderdelete.php b/app/grammar_edit/folderdelete.php new file mode 100644 index 0000000000..763f22bd5d --- /dev/null +++ b/app/grammar_edit/folderdelete.php @@ -0,0 +1,46 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('grammar_save')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +$folder = $_GET["folder"]; +$folder = str_replace ("\\", "/", $folder); + +if (strlen($folder) > 0) { + //delete the folder + rmdir($folder); //, 0700 + header("Location: fileoptions.php"); +} + +?> \ No newline at end of file diff --git a/app/grammar_edit/foldernew.php b/app/grammar_edit/foldernew.php new file mode 100644 index 0000000000..35f2aff035 --- /dev/null +++ b/app/grammar_edit/foldernew.php @@ -0,0 +1,83 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('grammar_save')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +$folder = $_GET["folder"]; +$folder = str_replace ("\\", "/", $folder); +$foldername = $_GET["foldername"]; + +if (strlen($folder) > 0 && strlen($foldername) > 0) { + //create new folder + mkdir($folder.'/'.$foldername); //, 0700 + header("Location: fileoptions.php"); +} +else { //display form + require_once "header.php"; + echo "
"; + echo "
"; + echo "
"; + echo ""; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo "
Path:
".$folder."
"; + + echo "
"; + + echo ""; + echo " "; + echo " "; + echo " "; + + echo " "; + echo " "; + echo " "; + + echo " "; + echo " "; + echo " "; + echo "
Folder Name:
"; + echo " "; + echo " "; + echo "
"; + echo "
"; + echo "
"; + + require_once "footer.php"; +} +?> diff --git a/app/grammar_edit/footer.php b/app/grammar_edit/footer.php new file mode 100644 index 0000000000..3e7b9037ab --- /dev/null +++ b/app/grammar_edit/footer.php @@ -0,0 +1,43 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +/* +echo "

"; +echo "
"; + +echo ""; +echo "fusionpbx "; +echo "        "; +echo "http://fusionpbx.com"; +echo "        "; +echo "Author: Mark J. Crane "; + +echo ""; +*/ +echo "
"; +echo ""; +echo ""; + +?> diff --git a/app/grammar_edit/header.php b/app/grammar_edit/header.php new file mode 100644 index 0000000000..b07b45c390 --- /dev/null +++ b/app/grammar_edit/header.php @@ -0,0 +1,83 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ + +echo ""; +echo ""; +echo ""; +//echo ""; +echo ""; + + +echo ""; +echo ""; +echo ""; +echo "
"; + +?> diff --git a/app/grammar_edit/images/Thumbs.db b/app/grammar_edit/images/Thumbs.db new file mode 100644 index 0000000000000000000000000000000000000000..46593a8c2e513a420f7803451a0bd7d6795fb2c2 GIT binary patch literal 20992 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 literal 0 HcmV?d00001 diff --git a/app/grammar_edit/images/file.png b/app/grammar_edit/images/file.png new file mode 100644 index 0000000000000000000000000000000000000000..33b5f5f37461bbc6045d4cef96ba2125c4e9b256 GIT binary patch literal 434 zcmV;j0ZsmiP)uaf2v`Q{?Wj` zolMeZbD4;Gy{&Gi?KsW?6A=+P>>rC&Ve~E{qfvNqd3|^Pkfv!4vHfruMrKEGOhj6{ zn_bUwmWIQdEXxds>m6(DZmh382QNVo6a+P$Ywe0qk|c$u$H}zBJ2^ckA^;3LKKZ*l z+XX@VQ5JOCErwY*ySgpM8jjO~jnx&U*c5>2SLGkxECHC6Vpc|?m|>$c!E5q4r=u}r zE2R`O04&g4@I8-NF$0|2VP+ex`~v`h82}qY)s(ryH%a1`;Ul8G{e!$y4XKR!PG|DpT-{reY}_-t#}`2YX^``4}iKh2doeVSihwfuk8^5y;O**UyG^BIO3Q2fclD#GBxpaXI^C{7sImo>OF zHMg|3wRd#3DhUeev+}5P2+FHWljakc)G8>WAthy_VybSmj8oQ3Mo>X_ovxa}v}q#F z!pwq<3QYEz`}Rq&8HtN4YqDGDZ9c6c#_c4hsU_&J;Mz4SULgki%jQzL){h=D8sEOF zX|C&N_4XadGX^6qHdQP3A3r6vO@wql8+oM!IBrPjWBVJ?B2l=o-C15hyJE%(B{oJr Sel>v`CpJEIV{K$$um%8JN5t*` literal 0 HcmV?d00001 diff --git a/app/grammar_edit/images/gear.png b/app/grammar_edit/images/gear.png new file mode 100644 index 0000000000000000000000000000000000000000..1adf1e778f6316dd9c926465783631b6222f9bc6 GIT binary patch literal 822 zcmV-61Ihe}P)eo} zK~#9!)so9=6j>O>&#kJis;+*et4$>x6Dtvwi6-j82co!91Q*$)vk`ftifVKj7JYhr@yM@dJK) zv0se~7yeYbw|1p;L$^w$(!8o_a9!7qIj@hr8(HeV_?KLr*H$08VKBFST}Ml?<& z2ZE*gIRf$4wXGMUC>pBPs<#q)Vw^{u{`V?`*6Mhs{v77x=(lo(?yozAr1zyF}u_x-oS z!$adYu3wWH0PNep-)eN6BW}BUCTS*N8fFU*IpR1b0+_0*OxKOJjT<(dT@FJSoGXW2BC+Oau#;gW$(}rOcxczVAPonw+WufC>Pf=ZS1K_wD=l z`S*UM^2uplyVB^xn;&Len@O6Cbt`LH6+_d>5=dqefrRVz2pLI4W)`pa1{>07*qoM6N<$f$y4XKR!PG|DpT-{reY}_-t#}`2YX^``4}iKh2doeVSihwfuk8^5y;O**UyG^BIO3Q2fclD#GBxpaXI^C{7sImo>OF zHMg|3wRd#3DhUeev+}5P2+FHWljakc)G8>WAthy_VybSmj8oQ3Mo>X_ovxa}v}q#F z!pwq<3QYEz`}Rq&8HtN4YqDGDZ9c6c#_c4hsU_&J;Mz4SULgki%jQzL){h=D8sEOF zX|C&N_4XadGX^6qHdQP3A3r6vO@wql8+oM!IBrPjWBVJ?B2l=o-C15hyJE%(B{oJr Sel>v`CpJEIV{K$$um%8JN5t*` literal 0 HcmV?d00001 diff --git a/app/grammar_edit/images/minus.gif b/app/grammar_edit/images/minus.gif new file mode 100644 index 0000000000000000000000000000000000000000..1094ab912b8bb9b8e457364e0a200b2364ab03fb GIT binary patch literal 124 zcmV-?0E7QWNk%w1VF>^U0J8u9!nvt_oVfS)^njkZ?Ca(K|Nqa(yZ!z9+SSVd008mv z?6}C+OEI5}ij{m|i2qdX6 eqL8fXBPt3ZGliKs5{uIv@gM1_O&;L91u8iN$P#Df)7TJT8#}oW??~ hx9yTADX<=5Q2xxo`aq_+!TExQ8Ot=TR6#}tYXC82HyZ!| literal 0 HcmV?d00001 diff --git a/app/grammar_edit/images/program.gif b/app/grammar_edit/images/program.gif new file mode 100644 index 0000000000000000000000000000000000000000..dc3dfa11044671bd33ce9778d7a10254fe748f00 GIT binary patch literal 61 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 literal 0 HcmV?d00001 diff --git a/app/grammar_edit/images/thumbnails/cliplibrary.png b/app/grammar_edit/images/thumbnails/cliplibrary.png new file mode 100644 index 0000000000000000000000000000000000000000..bc70f332fd4c8d15111d9a5fc1d66d0ea165b724 GIT binary patch literal 20544 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

$J8swmWDRg_n-OvxL>-lX%W==<7{8 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%0D7Ft}=jT|(_b=-2O+!;TxGQVlvad4Znn2q2 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 + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('grammar_view')) { + //access granted +} +else { + echo "access denied"; + exit; +} +echo "\n"; +echo "\n"; +echo " \n"; +echo " "; + + echo "\n"; + + echo ""; + ?> + + + + + + + + +
+ + + + \n"; + echo "\n"; + } + else { + echo "\n"; + } + ?> + +
+ + diff --git a/app/grammar_edit/list.php b/app/grammar_edit/list.php new file mode 100644 index 0000000000..aa5bb86c81 --- /dev/null +++ b/app/grammar_edit/list.php @@ -0,0 +1,107 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/checkauth.php"; +if (permission_exists('grammar_view')) { + //access granted +} +else { + echo "access denied"; + exit; +} +require_once "admin/edit/header.php"; +echo "

"; +echo "\n"; +echo "\n"; +echo " \n"; + echo "\n"; +} //end if results +echo "
\n"; +echo "
"; + +$sql = "select * from v_clips "; +$prep_statement = $db->prepare(check_sql($sql)); +$prep_statement->execute(); +$result = $prep_statement->fetchAll(PDO::FETCH_NAMED); +$result_count = count($result); + +$c = 0; +$row_style["0"] = "background-color: #F5F5DC;"; +$row_style["1"] = "background-color: #FFFFFF;"; + +echo "
\n"; +echo "\n"; +echo ""; + +if ($result_count == 0) { //no results + echo ""; +} +else { //received results + echo ""; + echo ""; + //echo ""; + //echo ""; + //echo ""; + //echo ""; + //echo ""; + echo ""; + echo "\n"; + + foreach($result as $row) { + echo "\n"; + //echo ""; + echo ""; + //echo ""; + //echo ""; + //echo ""; + //echo ""; + //echo ""; + echo ""; + + echo "\n"; + if ($c==0) { $c=1; } else { $c=0; } + } //end foreach unset($sql, $result, $row_count); + echo "
 
    clip name      clip_folder        clip_text_start        clip_text_end        clip_desc        clip_order   
".$row['clip_uuid']."".$row['clip_name']."".$row[clip_folder]."".$row[clip_text_start]."".$row[clip_text_end]."".$row[clip_desc]."".$row[clip_order]."
\n"; + echo "
\n"; + + echo "
\n"; + +echo "
\n"; +echo "   \n"; +echo "   \n"; +echo "
\n"; +echo ""; + +echo "

"; +require_once "admin/edit/footer.php"; + +unset ($result_count); +unset ($result); +unset ($key); +unset ($val); +unset ($c); + +?> diff --git a/app/grammar_edit/readme.txt b/app/grammar_edit/readme.txt new file mode 100644 index 0000000000..cafc4144ae --- /dev/null +++ b/app/grammar_edit/readme.txt @@ -0,0 +1,7 @@ +Notes + +IFrame +http://www.quirksmode.org/js/iframe.html + +Tree View +http://www.dddekerf.dds.nl/DHTML_Treeview/DHTML_Treeview.htm \ No newline at end of file diff --git a/app/grammar_edit/root.php b/app/grammar_edit/root.php new file mode 100644 index 0000000000..7b882438ea --- /dev/null +++ b/app/grammar_edit/root.php @@ -0,0 +1,50 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ + +// make sure the PATH_SEPARATOR is defined + if (!defined("PATH_SEPARATOR")) { + if ( strpos( $_ENV[ "OS" ], "Win" ) !== false ) { define("PATH_SEPARATOR", ";"); } else { define("PATH_SEPARATOR", ":"); } + } + +// make sure the document_root is set + $_SERVER["SCRIPT_FILENAME"] = str_replace("\\", "/", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = str_replace($_SERVER["PHP_SELF"], "", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = realpath($_SERVER["DOCUMENT_ROOT"]); + //echo "DOCUMENT_ROOT: ".$_SERVER["DOCUMENT_ROOT"]."
\n"; + //echo "PHP_SELF: ".$_SERVER["PHP_SELF"]."
\n"; + //echo "SCRIPT_FILENAME: ".$_SERVER["SCRIPT_FILENAME"]."
\n"; + +// if the project directory exists then add it to the include path otherwise add the document root to the include path + if (is_dir($_SERVER["DOCUMENT_ROOT"].'/fusionpbx')){ + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', '/fusionpbx'); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER["DOCUMENT_ROOT"].'/fusionpbx' ); + } + else { + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', ''); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER['DOCUMENT_ROOT'] ); + } + +?> \ No newline at end of file diff --git a/app/hardware_phones/app_config.php b/app/hardware_phones/app_config.php new file mode 100644 index 0000000000..363fbaafe4 --- /dev/null +++ b/app/hardware_phones/app_config.php @@ -0,0 +1,115 @@ + \ No newline at end of file diff --git a/app/hardware_phones/root.php b/app/hardware_phones/root.php new file mode 100644 index 0000000000..7b882438ea --- /dev/null +++ b/app/hardware_phones/root.php @@ -0,0 +1,50 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ + +// make sure the PATH_SEPARATOR is defined + if (!defined("PATH_SEPARATOR")) { + if ( strpos( $_ENV[ "OS" ], "Win" ) !== false ) { define("PATH_SEPARATOR", ";"); } else { define("PATH_SEPARATOR", ":"); } + } + +// make sure the document_root is set + $_SERVER["SCRIPT_FILENAME"] = str_replace("\\", "/", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = str_replace($_SERVER["PHP_SELF"], "", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = realpath($_SERVER["DOCUMENT_ROOT"]); + //echo "DOCUMENT_ROOT: ".$_SERVER["DOCUMENT_ROOT"]."
\n"; + //echo "PHP_SELF: ".$_SERVER["PHP_SELF"]."
\n"; + //echo "SCRIPT_FILENAME: ".$_SERVER["SCRIPT_FILENAME"]."
\n"; + +// if the project directory exists then add it to the include path otherwise add the document root to the include path + if (is_dir($_SERVER["DOCUMENT_ROOT"].'/fusionpbx')){ + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', '/fusionpbx'); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER["DOCUMENT_ROOT"].'/fusionpbx' ); + } + else { + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', ''); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER['DOCUMENT_ROOT'] ); + } + +?> \ No newline at end of file diff --git a/app/hardware_phones/v_hardware_phones.php b/app/hardware_phones/v_hardware_phones.php new file mode 100644 index 0000000000..8618990478 --- /dev/null +++ b/app/hardware_phones/v_hardware_phones.php @@ -0,0 +1,162 @@ + + Copyright (C) 2008-2012 All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require_once "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('phone_view')) { + //access granted +} +else { + echo "access denied"; + exit; +} +require_once "includes/header.php"; +require_once "includes/paging.php"; + +$order_by = $_GET["order_by"]; +$order = $_GET["order"]; + +echo "
"; +echo "
\n"; +echo "\n"; +echo " "; +echo ""; +echo "
\n"; +echo "
"; + +echo "\n"; +echo "\n"; +echo "\n"; +echo "\n"; +echo "\n"; +echo "\n"; +echo "\n"; +echo "\n"; +echo "
Hardware Phone List 
\n"; + +echo "Phones in this list are automatically added to the list when they contact the provisioning \n"; +echo "server or added manually by an administrator. \n"; +echo "Items in this list can be assigned from the extensions page.

\n"; +echo "
\n"; + +$sql = ""; +$sql .= " select * from v_hardware_phones "; +$sql .= " where domain_uuid = '$domain_uuid' "; +if (strlen($order_by)> 0) { $sql .= "order by $order_by $order "; } +$prep_statement = $db->prepare(check_sql($sql)); +$prep_statement->execute(); +$result = $prep_statement->fetchAll(PDO::FETCH_NAMED); +$num_rows = count($result); +unset ($prep_statement, $result, $sql); +$rows_per_page = 10; +$param = ""; +$page = $_GET['page']; +if (strlen($page) == 0) { $page = 0; $_GET['page'] = 0; } +list($paging_controls, $rows_per_page, $var_3) = paging($num_rows, $param, $rows_per_page); +$offset = $rows_per_page * $page; + +$sql = ""; +$sql .= " select * from v_hardware_phones "; +$sql .= " where domain_uuid = '$domain_uuid' "; +if (strlen($order_by)> 0) { $sql .= "order by $order_by $order "; } +$sql .= " limit $rows_per_page offset $offset "; +$prep_statement = $db->prepare(check_sql($sql)); +$prep_statement->execute(); +$result = $prep_statement->fetchAll(PDO::FETCH_NAMED); +$result_count = count($result); +unset ($prep_statement, $sql); + +$c = 0; +$row_style["0"] = "row_style0"; +$row_style["1"] = "row_style1"; + +echo "
\n"; +echo "\n"; +echo "\n"; +echo th_order_by('phone_mac_address', 'MAC Address', $order_by, $order); +echo th_order_by('phone_template', 'Template', $order_by, $order); +echo th_order_by('phone_vendor', 'Vendor', $order_by, $order); +//echo th_order_by('phone_model', 'Model', $order_by, $order); +echo th_order_by('phone_provision_enable', 'Enabled', $order_by, $order); +echo th_order_by('phone_description', 'Description', $order_by, $order); +echo "\n"; +echo "\n"; + +if ($result_count == 0) { //no results +} +else { //received results + foreach($result as $row) { + echo "\n"; + echo " \n"; + echo " \n"; + echo " \n"; + //echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "\n"; + if ($c==0) { $c=1; } else { $c=0; } + } //end foreach + unset($sql, $result, $row_count); +} //end if results + +echo "\n"; +echo "\n"; +echo "\n"; + +echo "
\n"; +if (permission_exists('phone_add')) { + echo " $v_link_label_add\n"; +} +echo "
".$row[phone_mac_address]." ".$row[phone_template]." ".$row[phone_vendor]." ".$row[phone_model]." ".$row[phone_provision_enable]." ".$row[phone_description]." \n"; + if (permission_exists('phone_edit')) { + echo " $v_link_label_edit\n"; + } + if (permission_exists('phone_delete')) { + echo " $v_link_label_delete\n"; + } + echo "
\n"; +echo " \n"; +echo " \n"; +echo " \n"; +echo " \n"; +echo " \n"; +echo " \n"; +echo "
 $paging_controls\n"; +if (permission_exists('phone_add')) { + echo " $v_link_label_add\n"; +} +echo "
\n"; +echo "
"; +echo "
"; +echo "

"; +echo "

"; + +echo "
"; +echo "
"; +echo "

"; + +require_once "includes/footer.php"; +?> diff --git a/app/hardware_phones/v_hardware_phones_delete.php b/app/hardware_phones/v_hardware_phones_delete.php new file mode 100644 index 0000000000..202290790d --- /dev/null +++ b/app/hardware_phones/v_hardware_phones_delete.php @@ -0,0 +1,64 @@ + + Copyright (C) 2008-2012 All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require_once "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('phone_delete')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +if (count($_GET)>0) { + $id = check_str($_GET["id"]); +} + +//delete the data + if (strlen($id)>0) { + $sql = ""; + $sql .= "delete from v_hardware_phones "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and hardware_phone_uuid = '$id' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + unset($sql); + } + +//write the provision files + require_once "app/provision/provision_write.php"; + +//redirect the user + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Delete Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + +?> + diff --git a/app/hardware_phones/v_hardware_phones_edit.php b/app/hardware_phones/v_hardware_phones_edit.php new file mode 100644 index 0000000000..7644e2be42 --- /dev/null +++ b/app/hardware_phones/v_hardware_phones_edit.php @@ -0,0 +1,426 @@ + + Copyright (C) 2008-2012 All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require_once "root.php"; +require_once "includes/require.php"; + +//check permissions + require_once "includes/checkauth.php"; + if (permission_exists('phone_add') || permission_exists('phone_edit')) { + //access granted + } + else { + echo "access denied"; + exit; + } + +//action add or update + if (isset($_REQUEST["id"])) { + $action = "update"; + $hardware_phone_uuid = check_str($_REQUEST["id"]); + } + else { + $action = "add"; + } + +//get the http post values and set them to php variables + if (count($_POST)>0) { + $phone_mac_address = check_str($_POST["phone_mac_address"]); + $phone_mac_address = strtolower($phone_mac_address); + $phone_label = check_str($_POST["phone_label"]); + $phone_vendor = check_str($_POST["phone_vendor"]); + $phone_model = check_str($_POST["phone_model"]); + $phone_firmware_version = check_str($_POST["phone_firmware_version"]); + $phone_provision_enable = check_str($_POST["phone_provision_enable"]); + $phone_template = check_str($_POST["phone_template"]); + $phone_username = check_str($_POST["phone_username"]); + $phone_password = check_str($_POST["phone_password"]); + $phone_time_zone = check_str($_POST["phone_time_zone"]); + $phone_description = check_str($_POST["phone_description"]); + } + +//add or update the database + if (count($_POST)>0 && strlen($_POST["persistformvar"]) == 0) { + + $msg = ''; + if ($action == "update") { + $hardware_phone_uuid = check_str($_POST["hardware_phone_uuid"]); + } + + //check for all required data + if (strlen($phone_mac_address) == 0) { $msg .= "Please provide: MAC Address
\n"; } + //if (strlen($phone_label) == 0) { $msg .= "Please provide: Label
\n"; } + //if (strlen($phone_vendor) == 0) { $msg .= "Please provide: Vendor
\n"; } + //if (strlen($phone_model) == 0) { $msg .= "Please provide: Model
\n"; } + //if (strlen($phone_firmware_version) == 0) { $msg .= "Please provide: Firmware Version
\n"; } + //if (strlen($phone_provision_enable) == 0) { $msg .= "Please provide: Enabled
\n"; } + //if (strlen($phone_template) == 0) { $msg .= "Please provide: Template
\n"; } + //if (strlen($phone_username) == 0) { $msg .= "Please provide: Username
\n"; } + //if (strlen($phone_password) == 0) { $msg .= "Please provide: Password
\n"; } + //if (strlen($phone_time_zone) == 0) { $msg .= "Please provide: Time Zone
\n"; } + //if (strlen($phone_description) == 0) { $msg .= "Please provide: Description
\n"; } + if (strlen($msg) > 0 && strlen($_POST["persistformvar"]) == 0) { + require_once "includes/header.php"; + require_once "includes/persistformvar.php"; + echo "
\n"; + echo "
\n"; + echo $msg."
"; + echo "
\n"; + persistformvar($_POST); + echo "
\n"; + require_once "includes/footer.php"; + return; + } + + //add or update the database + if ($_POST["persistformvar"] != "true") { + if ($action == "add" && permission_exists('phone_add')) { + //sql add + $hardware_phone_uuid = uuid(); + $sql = "insert into v_hardware_phones "; + $sql .= "("; + $sql .= "domain_uuid, "; + $sql .= "hardware_phone_uuid, "; + $sql .= "phone_mac_address, "; + $sql .= "phone_label, "; + $sql .= "phone_vendor, "; + $sql .= "phone_model, "; + $sql .= "phone_firmware_version, "; + $sql .= "phone_provision_enable, "; + $sql .= "phone_template, "; + $sql .= "phone_username, "; + $sql .= "phone_password, "; + $sql .= "phone_time_zone, "; + $sql .= "phone_description "; + $sql .= ")"; + $sql .= "values "; + $sql .= "("; + $sql .= "'$domain_uuid', "; + $sql .= "'$hardware_phone_uuid', "; + $sql .= "'$phone_mac_address', "; + $sql .= "'$phone_label', "; + $sql .= "'$phone_vendor', "; + $sql .= "'$phone_model', "; + $sql .= "'$phone_firmware_version', "; + $sql .= "'$phone_provision_enable', "; + $sql .= "'$phone_template', "; + $sql .= "'$phone_username', "; + $sql .= "'$phone_password', "; + $sql .= "'$phone_time_zone', "; + $sql .= "'$phone_description' "; + $sql .= ")"; + $db->exec(check_sql($sql)); + unset($sql); + + //write the provision files + require_once "app/provision/provision_write.php"; + + //redirect the user + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Add Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + } //if ($action == "add") + + if ($action == "update" && permission_exists('phone_edit')) { + //sql update + $sql = "update v_hardware_phones set "; + $sql .= "phone_mac_address = '$phone_mac_address', "; + $sql .= "phone_label = '$phone_label', "; + $sql .= "phone_vendor = '$phone_vendor', "; + $sql .= "phone_model = '$phone_model', "; + $sql .= "phone_firmware_version = '$phone_firmware_version', "; + $sql .= "phone_provision_enable = '$phone_provision_enable', "; + $sql .= "phone_template = '$phone_template', "; + $sql .= "phone_username = '$phone_username', "; + $sql .= "phone_password = '$phone_password', "; + $sql .= "phone_time_zone = '$phone_time_zone', "; + $sql .= "phone_description = '$phone_description' "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and hardware_phone_uuid = '$hardware_phone_uuid'"; + $db->exec(check_sql($sql)); + unset($sql); + + //write the provision files + require_once "app/provision/provision_write.php"; + + //redirect the user + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Update Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + } + } //if ($_POST["persistformvar"] != "true") + } //(count($_POST)>0 && strlen($_POST["persistformvar"]) == 0) + +//pre-populate the form + if (count($_GET)>0 && $_POST["persistformvar"] != "true") { + $hardware_phone_uuid = $_GET["id"]; + $sql = ""; + $sql .= "select * from v_hardware_phones "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and hardware_phone_uuid = '$hardware_phone_uuid' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach ($result as &$row) { + $phone_mac_address = $row["phone_mac_address"]; + $phone_mac_address = strtolower($phone_mac_address); + $phone_label = $row["phone_label"]; + $phone_vendor = $row["phone_vendor"]; + $phone_model = $row["phone_model"]; + $phone_firmware_version = $row["phone_firmware_version"]; + $phone_provision_enable = $row["phone_provision_enable"]; + $phone_template = $row["phone_template"]; + $phone_username = $row["phone_username"]; + $phone_password = $row["phone_password"]; + $phone_time_zone = $row["phone_time_zone"]; + $phone_description = $row["phone_description"]; + break; //limit to 1 row + } + unset ($prep_statement); + } + +//begin the content + require_once "includes/header.php"; + + echo "
"; + echo "\n"; + + echo "\n"; + echo " "; + echo " "; + echo "
\n"; + echo "
"; + + + echo "
\n"; + + echo "
\n"; + echo "\n"; + + echo "\n"; + if ($action == "add") { + echo "\n"; + } + if ($action == "update") { + echo "\n"; + } + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + /* + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + */ + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo " \n"; + echo " \n"; + echo " "; + echo "
Hardware Phone AddHardware Phone Edit
\n"; + echo "The following information is used to provision phones.

\n"; + echo "
\n"; + echo " MAC Address:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the MAC address.\n"; + echo "
\n"; + echo " Label:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the phone label.\n"; + echo "
\n"; + echo " Template:\n"; + echo "\n"; + + echo "\n"; + echo "
\n"; + echo "Select a template.\n"; + echo "
\n"; + echo " Vendor:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the vendor name.\n"; + echo "
\n"; + echo " Model:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the model number.\n"; + echo "
\n"; + echo " Firmware Version:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the firmware version.\n"; + echo "
\n"; + echo " Username:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the username.\n"; + echo "
\n"; + echo " Password:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the password.\n"; + echo "
\n"; + echo " Enabled:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enable or disable provisioning for this phone.\n"; + echo "
\n"; + echo " Time Zone:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the time zone.\n"; + echo "
\n"; + echo " Description:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the description.\n"; + echo "
\n"; + if ($action == "update") { + echo " \n"; + } + echo " \n"; + echo "
"; + echo ""; + + echo "
"; + echo "
"; + +//show the footer + require_once "includes/footer.php"; +?> diff --git a/app/hunt_group/app_config.php b/app/hunt_group/app_config.php new file mode 100644 index 0000000000..0ce8eec2db --- /dev/null +++ b/app/hunt_group/app_config.php @@ -0,0 +1,263 @@ + \ No newline at end of file diff --git a/app/hunt_group/root.php b/app/hunt_group/root.php new file mode 100644 index 0000000000..7b882438ea --- /dev/null +++ b/app/hunt_group/root.php @@ -0,0 +1,50 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ + +// make sure the PATH_SEPARATOR is defined + if (!defined("PATH_SEPARATOR")) { + if ( strpos( $_ENV[ "OS" ], "Win" ) !== false ) { define("PATH_SEPARATOR", ";"); } else { define("PATH_SEPARATOR", ":"); } + } + +// make sure the document_root is set + $_SERVER["SCRIPT_FILENAME"] = str_replace("\\", "/", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = str_replace($_SERVER["PHP_SELF"], "", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = realpath($_SERVER["DOCUMENT_ROOT"]); + //echo "DOCUMENT_ROOT: ".$_SERVER["DOCUMENT_ROOT"]."
\n"; + //echo "PHP_SELF: ".$_SERVER["PHP_SELF"]."
\n"; + //echo "SCRIPT_FILENAME: ".$_SERVER["SCRIPT_FILENAME"]."
\n"; + +// if the project directory exists then add it to the include path otherwise add the document root to the include path + if (is_dir($_SERVER["DOCUMENT_ROOT"].'/fusionpbx')){ + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', '/fusionpbx'); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER["DOCUMENT_ROOT"].'/fusionpbx' ); + } + else { + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', ''); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER['DOCUMENT_ROOT'] ); + } + +?> \ No newline at end of file diff --git a/app/hunt_group/v_hunt_group.php b/app/hunt_group/v_hunt_group.php new file mode 100644 index 0000000000..5140675e3c --- /dev/null +++ b/app/hunt_group/v_hunt_group.php @@ -0,0 +1,182 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; + +//check permissions + if (permission_exists('hunt_group_view')) { + //access granted + } + else { + echo "access denied"; + exit; + } + +require_once "includes/header.php"; +require_once "includes/paging.php"; + +$order_by = $_GET["order_by"]; +$order = $_GET["order"]; + +echo "
"; +echo "\n"; +echo "\n"; +echo " "; +echo ""; +echo "
\n"; +echo "
"; + +echo "\n"; +echo "\n"; +echo " \n"; +echo "\n"; +echo "

Hunt Group
\n"; +echo "
\n"; +echo " A Hunt Group is a list of destinations that can be called in sequence or simultaneously.\n"; +echo "

\n"; +echo "
\n"; + +//get the number of rows in v_hunt_groups +$sql = "select count(*) as num_rows from v_hunt_groups "; +$sql .= "where domain_uuid = '$domain_uuid' "; +$prep_statement = $db->prepare(check_sql($sql)); +if ($prep_statement) { + $prep_statement->execute(); + $row = $prep_statement->fetch(PDO::FETCH_ASSOC); + if ($row['num_rows'] > 0) { + $num_rows = $row['num_rows']; + } + else { + $num_rows = '0'; + } +} +unset($prep_statement, $result); + +//prepare to page the results +$rows_per_page = 150; +$param = ""; +$page = $_GET['page']; +if (strlen($page) == 0) { $page = 0; $_GET['page'] = 0; } +list($paging_controls, $rows_per_page, $var_3) = paging($num_rows, $param, $rows_per_page); +$offset = $rows_per_page * $page; + +//get the hunt group list +$sql = "select * from v_hunt_groups "; +$sql .= "where domain_uuid = '$domain_uuid' "; +if (strlen($order_by)> 0) { + $sql .= "order by $order_by $order "; +} +else { + $sql .= "order by hunt_group_extension asc "; +} +$sql .= " limit $rows_per_page offset $offset "; +$prep_statement = $db->prepare(check_sql($sql)); +$prep_statement->execute(); +$result = $prep_statement->fetchAll(PDO::FETCH_NAMED); +$result_count = count($result); +unset ($prep_statement, $sql); + +$c = 0; +$row_style["0"] = "row_style0"; +$row_style["1"] = "row_style1"; + +echo "
\n"; +echo "\n"; +echo "\n"; +echo th_order_by('hunt_group_extension', 'Extension', $order_by, $order); +echo th_order_by('hunt_group_name', 'Hunt Group Name', $order_by, $order); +echo th_order_by('hunt_group_name', 'Enabled', $order_by, $order); +echo th_order_by('hunt_group_description', 'Description', $order_by, $order); +echo "\n"; +echo "\n"; + +if ($result_count > 0) { + foreach($result as $row) { + echo "\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "\n"; + if ($c==0) { $c=1; } else { $c=0; } + } //end foreach + unset($sql, $result, $row_count); +} //end if results + +echo "\n"; +echo "\n"; +echo "\n"; + +if ($v_path_show) { + echo "\n"; + echo "\n"; + echo "\n"; +} + +echo "
\n"; +if (permission_exists('hunt_group_add')) { + echo " $v_link_label_add\n"; +} +echo "
".$row['hunt_group_extension']."".$row['hunt_group_name']."".$row['hunt_group_enabled']."".$row['hunt_group_description']." \n"; + if (permission_exists('hunt_group_edit')) { + echo " $v_link_label_edit\n"; + } + if (permission_exists('hunt_group_delete')) { + echo " $v_link_label_delete\n"; + } + echo "
\n"; +echo " \n"; +echo " \n"; +echo " \n"; +echo " \n"; +echo " \n"; +echo " \n"; +echo "
 $paging_controls\n"; +if (permission_exists('hunt_group_add')) { + echo " $v_link_label_add\n"; +} +echo "
\n"; +echo "
\n"; + echo "
\n"; + echo $_SESSION['switch']['scripts']['dir']."\n"; + echo "
"; +echo "
"; +echo "

"; +echo "

"; + +echo "
"; +echo "
"; +echo "

"; + +require_once "includes/footer.php"; +unset ($result_count); +unset ($result); +unset ($key); +unset ($val); +unset ($c); +?> diff --git a/app/hunt_group/v_hunt_group_call_forward.php b/app/hunt_group/v_hunt_group_call_forward.php new file mode 100644 index 0000000000..7e1dae82c1 --- /dev/null +++ b/app/hunt_group/v_hunt_group_call_forward.php @@ -0,0 +1,130 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +require_once "includes/header.php"; +require_once "includes/paging.php"; + +//check permissions +if (permission_exists('hunt_group_call_forward')) { + $order_by = $_GET["order_by"]; + $order = $_GET["order"]; + + echo "
"; + echo "\n"; + echo "\n"; + echo "
\n"; + + if ($is_included != "true") { + echo "
"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "
Hunt Group Call Forward
\n"; + echo " Use the links to configure hunt group call forward.\n"; + echo " The following hunt groups have been assigned to this user account. \n"; + echo "
\n"; + echo "
"; + } + + $sql = ""; + $sql .= "select * from v_hunt_groups "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and hunt_group_type <> 'dnd' "; + $sql .= "and hunt_group_type <> 'call_forward' "; + $sql .= "and hunt_group_type <> 'follow_me_simultaneous' "; + $sql .= "and hunt_group_type <> 'follow_me_sequence' "; + if (!(permission_exists('hunt_group_add') || permission_exists('hunt_group_edit'))) { + $sql .= "and hunt_group_user_list like '%|".$_SESSION["username"]."|%' "; + } + if (strlen($order_by)> 0) { + $sql .= "order by $order_by $order "; + } + else { + $sql .= "order by hunt_group_extension asc "; + } + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + $result_count = count($result); + unset ($prep_statement, $sql); + + $c = 0; + $row_style["0"] = "row_style0"; + $row_style["1"] = "row_style1"; + + if ($is_included == "true" && $result_count == 0) { + //hide this when there is no result + } + else { + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + } + + if ($result_count == 0) { + //no results + } + else { //received results + foreach($result as $row) { + echo "\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "\n"; + if ($c==0) { $c=1; } else { $c=0; } + } //end foreach + unset($sql, $result, $row_count); + + } //end if results + + if ($is_included == "true" && $result_count == 0) { + //hide this when there is no result + } + else { + echo "
Hunt Group ExtensionToolsDescription
".$row['hunt_group_extension']."\n"; + echo " Call Forward \n"; + echo " ".$row['hunt_group_description']." 
"; + + echo "
"; + echo "
"; + echo "
"; + } + + echo "
"; + echo "
"; + + if ($is_included != "true") { + require_once "includes/footer.php"; + } +} + +?> diff --git a/app/hunt_group/v_hunt_group_call_forward_edit.php b/app/hunt_group/v_hunt_group_call_forward_edit.php new file mode 100644 index 0000000000..004d92edd7 --- /dev/null +++ b/app/hunt_group/v_hunt_group_call_forward_edit.php @@ -0,0 +1,491 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require_once "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; + +//check permissions + if (permission_exists('hunt_group_add') || permission_exists('hunt_group_edit') || permission_exists('hunt_group_call_forward')) { + //access granted + } + else { + echo "access denied"; + exit; + } + +function destination_select($select_name, $select_value, $select_default) { + if (strlen($select_value) == 0) { $select_value = $select_default; } + echo " \n"; +} + +//show the header + require_once "includes/header.php"; + +//get the hunt_group_uuid + $hunt_group_uuid = $_REQUEST["id"]; + +//hunt_group information used to determine if this is an add or an update + $sql = ""; + $sql .= "select * from v_hunt_groups "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and hunt_group_uuid = '$hunt_group_uuid' "; + if (!(permission_exists('hunt_group_add') || permission_exists('hunt_group_edit'))) { + $sql .= "and hunt_group_user_list like '%|".$_SESSION["username"]."|%' "; + } + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach ($result as &$row) { + $hunt_group_uuid = $row["hunt_group_uuid"]; + $hunt_group_extension = $row["hunt_group_extension"]; + } + unset ($prep_statement); + +if (count($_POST)>0 && strlen($_POST["persistformvar"]) == 0) { + + //get http post variables and set them to php variables + if (count($_POST)>0) { + $call_forward_enabled = check_str($_POST["call_forward_enabled"]); + $call_forward_number = check_str($_POST["call_forward_number"]); + $hunt_group_call_prompt = check_str($_POST["hunt_group_call_prompt"]); + + if (strlen($call_forward_number) > 0) { + $call_forward_number = preg_replace("~[^0-9]~", "",$call_forward_number); + } + + //set the default + if (strlen($hunt_group_call_prompt) == 0) { + $hunt_group_call_prompt = 'false'; + } + } + + //check for all required data + //if (strlen($call_forward_enabled) == 0) { $msg .= "Please provide: Call Forward
\n"; } + //if (strlen($call_forward_number) == 0) { $msg .= "Please provide: Number
\n"; } + //if (strlen($hunt_group_call_prompt) == 0) { $msg .= "Please provide: call prompt
\n"; } + if (strlen($msg) > 0 && strlen($_POST["persistformvar"]) == 0) { + require_once "includes/header.php"; + require_once "includes/persistformvar.php"; + echo "
\n"; + echo "
\n"; + echo $msg."
"; + echo "
\n"; + persistformvar($_POST); + echo "
\n"; + require_once "includes/footer.php"; + return; + } + + //call forward is enabled so disable the hunt group + if ($call_forward_enabled == "true") { + $sql = "update v_hunt_groups set hunt_group_enabled = 'false' "; + $sql .= "where hunt_group_extension = '$hunt_group_extension' "; + $sql .= "and (hunt_group_type = 'simultaneous' or hunt_group_type = 'sequentially') "; + $db->exec(check_sql($sql)); + } + + //call forward is disabled so enable the hunt group + if ($call_forward_enabled == "false" || $call_forward_enabled == "") { + $sql = "update v_hunt_groups set hunt_group_enabled = 'true' "; + $sql .= "where hunt_group_extension = '$hunt_group_extension' "; + $sql .= "and (hunt_group_type = 'simultaneous' or hunt_group_type = 'sequentially') "; + $db->exec(check_sql($sql)); + } + + //set the default action to add + $call_forward_action = "add"; + + //hunt_group information used to determine if this is an add or an update + $sql = "select * from v_hunt_groups "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and hunt_group_type = 'call_forward' "; + $sql .= "and hunt_group_extension in ( "; + $sql .= "select hunt_group_extension from v_hunt_groups "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and hunt_group_uuid = '$hunt_group_uuid' "; + if (!(permission_exists('hunt_group_add') || permission_exists('hunt_group_edit'))) { + $sql .= "and hunt_group_user_list like '%|".$_SESSION["username"]."|%' "; + } + $sql .= ") "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach ($result as &$row) { + if ($row["hunt_group_type"] == 'call_forward') { + $call_forward_action = "update"; + $call_forward_uuid = $row["hunt_group_uuid"]; + } + } + unset ($prep_statement); + + //call forward config + $huntgroup_name = 'call_forward_'.$hunt_group_extension; + $hunt_group_type = 'call_forward'; + $hunt_group_context = $_SESSION['context']; + $hunt_group_timeout = '3600'; + $hunt_group_timeout_destination = $hunt_group_extension; + $hunt_group_timeout_type = 'voicemail'; + $hunt_group_ring_back = 'us-ring'; + $hunt_group_cid_name_prefix = ''; + $hunt_group_pin = ''; + $huntgroup_caller_announce = 'false'; + $hunt_group_user_list = ''; + $hunt_group_enabled = $call_forward_enabled; + $hunt_group_description = 'call forward '.$hunt_group_extension; + + if ($call_forward_action == "add" && permission_exists('hunt_group_add')) { + $call_forward_uuid = uuid(); + $sql = "insert into v_hunt_groups "; + $sql .= "("; + $sql .= "domain_uuid, "; + $sql .= "hunt_group_uuid, "; + $sql .= "hunt_group_extension, "; + $sql .= "hunt_group_name, "; + $sql .= "hunt_group_type, "; + $sql .= "hunt_group_context, "; + $sql .= "hunt_group_timeout, "; + $sql .= "hunt_group_timeout_destination, "; + $sql .= "hunt_group_timeout_type, "; + $sql .= "hunt_group_ringback, "; + $sql .= "hunt_group_cid_name_prefix, "; + $sql .= "hunt_group_pin, "; + $sql .= "hunt_group_call_prompt, "; + $sql .= "hunt_group_caller_announce, "; + $sql .= "hunt_group_user_list, "; + $sql .= "hunt_group_enabled, "; + $sql .= "hunt_group_description "; + $sql .= ")"; + $sql .= "values "; + $sql .= "("; + $sql .= "'$domain_uuid', "; + $sql .= "'$call_forward_uuid', "; + $sql .= "'$hunt_group_extension', "; + $sql .= "'$huntgroup_name', "; + $sql .= "'$hunt_group_type', "; + $sql .= "'$hunt_group_context', "; + $sql .= "'$hunt_group_timeout', "; + $sql .= "'$hunt_group_timeout_destination', "; + $sql .= "'$hunt_group_timeout_type', "; + $sql .= "'$hunt_group_ring_back', "; + $sql .= "'$hunt_group_cid_name_prefix', "; + $sql .= "'$hunt_group_pin', "; + $sql .= "'$hunt_group_call_prompt', "; + $sql .= "'$huntgroup_caller_announce', "; + $sql .= "'$hunt_group_user_list', "; + $sql .= "'$hunt_group_enabled', "; + $sql .= "'$hunt_group_description' "; + $sql .= ")"; + if ($v_debug) { + echo $sql."
"; + } + $db->exec(check_sql($sql)); + unset($sql); + + //delete related v_hunt_group_destinations + $sql = "delete from v_hunt_group_destinations where hunt_group_uuid = '$call_forward_uuid' "; + $db->exec(check_sql($sql)); + + if (extension_exists($call_forward_number)) { + $destination_data = $call_forward_number; + $destination_type = 'extension'; + } + $destination_profile = 'internal'; + $destination_timeout = ''; + $destination_order = '1'; + $destination_enabled = 'true'; + $destination_description = 'call forward'; + + $hunt_group_destination_uuid = uuid(); + $sql = "insert into v_hunt_group_destinations "; + $sql .= "("; + $sql .= "domain_uuid, "; + $sql .= "hunt_group_uuid, "; + $sql .= "hunt_group_destination_uuid, "; + $sql .= "destination_data, "; + $sql .= "destination_type, "; + $sql .= "destination_profile, "; + $sql .= "destination_timeout, "; + $sql .= "destination_order, "; + $sql .= "destination_enabled, "; + $sql .= "destination_description "; + $sql .= ")"; + $sql .= "values "; + $sql .= "("; + $sql .= "'$domain_uuid', "; + $sql .= "'$call_forward_uuid', "; + $sql .= "'$hunt_group_destination_uuid', "; + $sql .= "'$destination_data', "; + $sql .= "'$destination_type', "; + $sql .= "'$destination_profile', "; + $sql .= "'$destination_timeout', "; + $sql .= "'$destination_order', "; + $sql .= "'$destination_enabled', "; + $sql .= "'$destination_description' "; + $sql .= ")"; + $db->exec(check_sql($sql)); + unset($sql); + } //if ($call_forward_action == "add") + + if ($call_forward_action == "update" && permission_exists('hunt_group_call_forward')) { + $sql = "update v_hunt_groups set "; + $sql .= "hunt_group_extension = '$hunt_group_extension', "; + $sql .= "hunt_group_name = '$huntgroup_name', "; + $sql .= "hunt_group_type = '$hunt_group_type', "; + $sql .= "hunt_group_context = '$hunt_group_context', "; + $sql .= "hunt_group_timeout = '$hunt_group_timeout', "; + $sql .= "hunt_group_timeout_destination = '$hunt_group_timeout_destination', "; + $sql .= "hunt_group_timeout_type = '$hunt_group_timeout_type', "; + $sql .= "hunt_group_ringback = '$hunt_group_ring_back', "; + $sql .= "hunt_group_cid_name_prefix = '$hunt_group_cid_name_prefix', "; + $sql .= "hunt_group_pin = '$hunt_group_pin', "; + $sql .= "hunt_group_call_prompt = '$hunt_group_call_prompt', "; + $sql .= "hunt_group_caller_announce = '$huntgroup_caller_announce', "; + $sql .= "hunt_group_user_list = '$hunt_group_user_list', "; + $sql .= "hunt_group_enabled = '$hunt_group_enabled', "; + $sql .= "hunt_group_description = '$hunt_group_description' "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and hunt_group_uuid = '$call_forward_uuid'"; + $db->exec(check_sql($sql)); + unset($sql); + + //set the variables + $destination_data = $call_forward_number; + if (extension_exists($call_forward_number)) { + $destination_type = 'extension'; + } + else { + $destination_type = 'sip uri'; + } + $destination_profile = 'internal'; + $destination_timeout = ''; + $destination_order = '1'; + $destination_enabled = 'true'; + $destination_description = 'call forward'; + + //delete related v_hunt_group_destinations + $sql = "delete from v_hunt_group_destinations where hunt_group_uuid = '$call_forward_uuid' "; + $db->exec(check_sql($sql)); + + //insert the v_hunt_group_destinations + $sql = "insert into v_hunt_group_destinations "; + $sql .= "("; + $sql .= "domain_uuid, "; + $sql .= "hunt_group_uuid, "; + $sql .= "destination_data, "; + $sql .= "destination_type, "; + $sql .= "destination_profile, "; + $sql .= "destination_timeout, "; + $sql .= "destination_order, "; + $sql .= "destination_enabled, "; + $sql .= "destination_description "; + $sql .= ")"; + $sql .= "values "; + $sql .= "("; + $sql .= "'$domain_uuid', "; + $sql .= "'$call_forward_uuid', "; + $sql .= "'$destination_data', "; + $sql .= "'$destination_type', "; + $sql .= "'$destination_profile', "; + $sql .= "'$destination_timeout', "; + $sql .= "'$destination_order', "; + $sql .= "'$destination_enabled', "; + $sql .= "'$destination_description' "; + $sql .= ")"; + $db->exec(check_sql($sql)); + unset($sql); + } //if ($call_forward_action == "update") + + //synchronize the xml config + save_hunt_group_xml(); + + //synchronize the xml config + save_dialplan_xml(); + + //redirect the user + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Update Complete
\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; +} //(count($_POST)>0 && strlen($_POST["persistformvar"]) == 0) + +//show the header + require_once "includes/header.php"; + +//pre-populate the form + $sql = ""; + $sql .= "select * from v_hunt_groups "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and hunt_group_type = 'call_forward' "; + $sql .= "and hunt_group_extension = '$hunt_group_extension' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach ($result as &$row) { + $hunt_group_uuid = $row["hunt_group_uuid"]; + $hunt_group_extension = $row["hunt_group_extension"]; + $huntgroup_name = $row["hunt_group_name"]; + $hunt_group_type = $row["hunt_group_type"]; + $hunt_group_context = $row["hunt_group_context"]; + $hunt_group_timeout = $row["hunt_group_timeout"]; + $hunt_group_timeout_destination = $row["hunt_group_timeout_destination"]; + $hunt_group_timeout_type = $row["hunt_group_timeout_type"]; + $hunt_group_ring_back = $row["hunt_group_ringback"]; + $hunt_group_cid_name_prefix = $row["hunt_group_cid_name_prefix"]; + $hunt_group_pin = $row["hunt_group_pin"]; + $hunt_group_call_prompt = $row["hunt_group_call_prompt"]; + $huntgroup_caller_announce = $row["hunt_group_caller_announce"]; + $hunt_group_user_list = $row["hunt_group_user_list"]; + $hunt_group_enabled = $row["hunt_group_enabled"]; + $hunt_group_description = $row["hunt_group_description"]; + + if ($row["hunt_group_type"] == 'call_forward') { + $call_forward_enabled = $hunt_group_enabled; + } + + if ($row["hunt_group_type"] == 'call_forward') { + $sql = ""; + $sql .= "select * from v_hunt_group_destinations "; + $sql .= "where hunt_group_uuid = '$hunt_group_uuid' "; + $prep_statement_2 = $db->prepare(check_sql($sql)); + $prep_statement_2->execute(); + $result2 = $prep_statement_2->fetchAll(PDO::FETCH_NAMED); + $x=1; + foreach ($result2 as &$row2) { + if ($row["hunt_group_type"] == 'call_forward') { + if (strlen($row2["destination_data"]) > 0) { + $call_forward_number = $row2["destination_data"]; + } + } + } + unset ($prep_statement_2); + } + } + unset ($prep_statement); + +//show the content + echo "
"; + echo "\n"; + echo "\n"; + echo " "; + echo " "; + echo "
\n"; + echo "
"; + + echo "
\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + + echo " \n"; + echo " \n"; + echo " "; + echo "
\n"; + echo " Hunt Group Call Forward\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo " Directs incoming calls for extension $hunt_group_extension.

\n"; + echo "
\n"; + echo " Call Forward:\n"; + echo "\n"; + if ($call_forward_enabled == "true") { + echo " Enabled \n"; + } + else { + echo " Enable \n"; + } + if ($call_forward_enabled == "false" || $call_forward_enabled == "") { + echo " Disabled \n"; + } + else { + echo " Disable \n"; + } + echo "
\n"; + echo "
\n"; + //echo "Enable or disable call forward.\n"; + echo "
\n"; + echo " Number:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + //echo "Enter the call forward number.\n"; + echo "
\n"; + echo "
\n"; + echo "
\n"; + echo "
\n"; + echo "
\n"; + if ($action == "update") { + echo " \n"; + } + echo " \n"; + echo "
"; + echo "
"; + + echo "
"; + echo "
"; + +//show the footer + require_once "includes/footer.php"; +?> diff --git a/app/hunt_group/v_hunt_group_copy.php b/app/hunt_group/v_hunt_group_copy.php new file mode 100644 index 0000000000..11b0c1457d --- /dev/null +++ b/app/hunt_group/v_hunt_group_copy.php @@ -0,0 +1,168 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +require_once "includes/paging.php"; + +//check permissions + if (permission_exists('hunt_group_add')) { + //access granted + } + else { + echo "access denied"; + exit; + } + +//set the http get/post variable(s) to a php variable + if (isset($_REQUEST["id"])) { + $hunt_group_uuid = check_str($_REQUEST["id"]); + } + +//get the v_hunt_group data + $sql = ""; + $sql .= "select * from v_hunt_groups "; + $sql .= "where hunt_group_uuid = '$hunt_group_uuid' "; + $sql .= "and domain_uuid = '$domain_uuid' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach ($result as &$row) { + $hunt_group_extension = $row["hunt_group_extension"]; + $hunt_group_name = $row["hunt_group_name"]; + $hunt_group_type = $row["hunt_group_type"]; + $hunt_group_context = $row["hunt_group_context"]; + $hunt_group_timeout = $row["hunt_group_timeout"]; + $hunt_group_timeout_destination = $row["hunt_group_timeout_destination"]; + $hunt_group_timeout_type = $row["hunt_group_timeout_type"]; + $hunt_group_ringback = $row["hunt_group_ringback"]; + $hunt_group_cid_name_prefix = $row["hunt_group_cid_name_prefix"]; + $hunt_group_pin = $row["hunt_group_pin"]; + $hunt_group_caller_announce = $row["hunt_group_caller_announce"]; + $hunt_group_enabled = $row["hunt_group_enabled"]; + $hunt_group_description = "copy: ".$row["hunt_group_description"]; + break; //limit to 1 row + } + unset ($prep_statement); + + //copy the hunt group + $sql = "insert into v_hunt_groups "; + $sql .= "("; + $sql .= "domain_uuid, "; + $sql .= "hunt_group_uuid, "; + $sql .= "hunt_group_extension, "; + $sql .= "hunt_group_name, "; + $sql .= "hunt_group_type, "; + $sql .= "hunt_group_context, "; + $sql .= "hunt_group_timeout, "; + $sql .= "hunt_group_timeout_destination, "; + $sql .= "hunt_group_timeout_type, "; + $sql .= "hunt_group_ringback, "; + $sql .= "hunt_group_cid_name_prefix, "; + $sql .= "hunt_group_pin, "; + $sql .= "hunt_group_caller_announce, "; + $sql .= "hunt_group_enabled, "; + $sql .= "hunt_group_description "; + $sql .= ")"; + $sql .= "values "; + $sql .= "("; + $sql .= "'$domain_uuid', "; + $sql .= "'$hunt_group_uuid', "; + $sql .= "'$hunt_group_extension', "; + $sql .= "'$hunt_group_name', "; + $sql .= "'$hunt_group_type', "; + $sql .= "'$hunt_group_context', "; + $sql .= "'$hunt_group_timeout', "; + $sql .= "'$hunt_group_timeout_destination', "; + $sql .= "'$hunt_group_timeout_type', "; + $sql .= "'$hunt_group_ringback', "; + $sql .= "'$hunt_group_cid_name_prefix', "; + $sql .= "'$hunt_group_pin', "; + $sql .= "'$hunt_group_caller_announce', "; + $sql .= "'$hunt_group_enabled', "; + $sql .= "'$hunt_group_description' "; + $sql .= ")"; + $db->exec(check_sql($sql)); + unset($sql); + + //get the the hunt group destinations + $sql = ""; + $sql .= "select * from v_hunt_group_destinations "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and hunt_group_uuid = '$hunt_group_uuid' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach ($result as &$row) { + $hunt_group_uuid = $row["hunt_group_uuid"]; + $destination_data = $row["destination_data"]; + $destination_type = $row["destination_type"]; + $destination_profile = $row["destination_profile"]; + $destination_order = $row["destination_order"]; + $destination_description = $row["destination_description"]; + + //copy the hunt group destinations + $hunt_group_destination_uuid = uuid(); + $sql = "insert into v_hunt_group_destinations "; + $sql .= "("; + $sql .= "domain_uuid, "; + $sql .= "hunt_group_uuid, "; + $sql .= "hunt_group_destination_uuid, "; + $sql .= "destination_data, "; + $sql .= "destination_type, "; + $sql .= "destination_profile, "; + $sql .= "destination_order, "; + $sql .= "destination_description "; + $sql .= ")"; + $sql .= "values "; + $sql .= "("; + $sql .= "'$domain_uuid', "; + $sql .= "'$db_hunt_group_uuid', "; + $sql .= "'$hunt_group_destination_uuid', "; + $sql .= "'$destination_data', "; + $sql .= "'$destination_type', "; + $sql .= "'$destination_profile', "; + $sql .= "'$destination_order', "; + $sql .= "'$destination_description' "; + $sql .= ")"; + $db->exec(check_sql($sql)); + unset($sql); + } + unset ($prep_statement); + + //synchronize the xml config + save_hunt_group_xml(); + + //redirect the user + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Copy Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + +?> \ No newline at end of file diff --git a/app/hunt_group/v_hunt_group_delete.php b/app/hunt_group/v_hunt_group_delete.php new file mode 100644 index 0000000000..9b4d295815 --- /dev/null +++ b/app/hunt_group/v_hunt_group_delete.php @@ -0,0 +1,105 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; + +//check permissions + if (permission_exists('hunt_group_delete')) { + //access granted + } + else { + echo "access denied"; + exit; + } + +if (count($_GET)>0) { + $id = $_GET["id"]; +} + +if (strlen($id)>0) { + + //start the atomic transaction + $count = $db->exec("BEGIN;"); + + //get the dialplan uuid + $sql = "select * from v_hunt_groups "; + $sql .= "where domain_uuid = '".$_SESSION['domain_uuid']."' "; + $sql .= "and hunt_group_uuid = '$id' "; + $prep_statement = $db->prepare($sql); + $prep_statement->execute(); + while($row = $prep_statement->fetch(PDO::FETCH_ASSOC)) { + $dialplan_uuid = $row['dialplan_uuid']; + } + + //delete child data + $sql = "delete from v_hunt_group_destinations "; + $sql .= "where domain_uuid = '".$_SESSION['domain_uuid']."' "; + $sql .= "and hunt_group_uuid = '$id' "; + $db->query($sql); + unset($sql); + + //delete parent data + $sql = "delete from v_hunt_groups "; + $sql .= "where domain_uuid = '".$_SESSION['domain_uuid']."' "; + $sql .= "and hunt_group_uuid = '$id' "; + $db->query($sql); + unset($sql); + + //delete the dialplan entry + $sql = "delete from v_dialplans "; + $sql .= "where domain_uuid = '".$_SESSION['domain_uuid']."' "; + $sql .= "and dialplan_uuid = '$dialplan_uuid' "; + //echo $sql."
\n"; + $db->query($sql); + unset($sql); + + //delete the dialplan details + $sql = "delete from v_dialplan_details "; + $sql .= "where domain_uuid = '".$_SESSION['domain_uuid']."' "; + $sql .= "and dialplan_uuid = '$dialplan_uuid' "; + //echo $sql."
\n"; + $db->query($sql); + unset($sql); + + //commit the atomic transaction + $count = $db->exec("COMMIT;"); + + //synchronize the xml config + save_hunt_group_xml(); + +} + +//redirect the user + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Delete Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + +?> \ No newline at end of file diff --git a/app/hunt_group/v_hunt_group_destinations_delete.php b/app/hunt_group/v_hunt_group_destinations_delete.php new file mode 100644 index 0000000000..4f2923e36d --- /dev/null +++ b/app/hunt_group/v_hunt_group_destinations_delete.php @@ -0,0 +1,67 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; + +//check permissions + if (permission_exists('hunt_group_delete')) { + //access granted + } + else { + echo "access denied"; + exit; + } + +if (count($_GET)>0) { + $id = $_GET["id"]; + $hunt_group_uuid = check_str($_REQUEST["id2"]); +} + +if (strlen($id)>0) { + //delete the data + $sql = ""; + $sql .= "delete from v_hunt_group_destinations "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and hunt_group_destination_uuid = '$id' "; + $sql .= "and hunt_group_uuid = '$hunt_group_uuid' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + unset($sql); + //synchronize the xml config + save_hunt_group_xml(); +} + +//redirect the user + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Delete Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + +?> \ No newline at end of file diff --git a/app/hunt_group/v_hunt_group_destinations_edit.php b/app/hunt_group/v_hunt_group_destinations_edit.php new file mode 100644 index 0000000000..4147f7c9a2 --- /dev/null +++ b/app/hunt_group/v_hunt_group_destinations_edit.php @@ -0,0 +1,365 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; + +//check permissions + if (permission_exists('hunt_group_add') || permission_exists('hunt_group_edit')) { + //access granted + } + else { + echo "access denied"; + exit; + } + +//set the action as an add or an update + if (isset($_REQUEST["id"])) { + $action = "update"; + $hunt_group_destination_uuid = check_str($_REQUEST["id"]); + } + else { + $action = "add"; + } + + if (isset($_REQUEST["id2"])) { + $hunt_group_uuid = check_str($_REQUEST["id2"]); + } + +//get the http values and set them as variables + if (count($_POST)>0) { + if (isset($_POST["hunt_group_uuid"])) { + $hunt_group_uuid = check_str($_POST["hunt_group_uuid"]); + } + $destination_data = check_str($_POST["destination_data"]); + $destination_type = check_str($_POST["destination_type"]); + $destination_timeout = check_str($_POST["destination_timeout"]); + $destination_order = check_str($_POST["destination_order"]); + $destination_enabled = check_str($_POST["destination_enabled"]); + $destination_description = check_str($_POST["destination_description"]); + } + +if (count($_POST)>0 && strlen($_POST["persistformvar"]) == 0) { + + $msg = ''; + if ($action == "update") { + $hunt_group_destination_uuid = check_str($_POST["hunt_group_destination_uuid"]); + } + + //check for all required data + if (strlen($domain_uuid) == 0) { $msg .= "Please provide: domain_uuid
\n"; } + if (strlen($destination_data) == 0) { $msg .= "Please provide: Destination
\n"; } + if (strlen($destination_type) == 0) { $msg .= "Please provide: Type
\n"; } + //if (strlen($destination_timeout) == 0) { $msg .= "Please provide: Timeout
\n"; } + //if (strlen($destination_order) == 0) { $msg .= "Please provide: Order
\n"; } + //if (strlen($destination_enabled) == 0) { $msg .= "Please provide: Enabled
\n"; } + //if (strlen($destination_description) == 0) { $msg .= "Please provide: Description
\n"; } + if (strlen($msg) > 0 && strlen($_POST["persistformvar"]) == 0) { + require_once "includes/header.php"; + require_once "includes/persistformvar.php"; + echo "
\n"; + echo "
\n"; + echo $msg."
"; + echo "
\n"; + persistformvar($_POST); + echo "
\n"; + require_once "includes/footer.php"; + return; + } + + //add or update the database + if ($_POST["persistformvar"] != "true") { + if ($action == "add" && permission_exists('hunt_group_add')) { + $hunt_group_destination_uuid = uuid(); + $sql = "insert into v_hunt_group_destinations "; + $sql .= "("; + $sql .= "domain_uuid, "; + $sql .= "hunt_group_uuid, "; + $sql .= "hunt_group_destination_uuid, "; + $sql .= "destination_data, "; + $sql .= "destination_type, "; + $sql .= "destination_timeout, "; + $sql .= "destination_order, "; + $sql .= "destination_enabled, "; + $sql .= "destination_description "; + $sql .= ")"; + $sql .= "values "; + $sql .= "("; + $sql .= "'$domain_uuid', "; + $sql .= "'$hunt_group_uuid', "; + $sql .= "'$hunt_group_destination_uuid', "; + $sql .= "'$destination_data', "; + $sql .= "'$destination_type', "; + $sql .= "'$destination_timeout', "; + $sql .= "'$destination_order', "; + $sql .= "'$destination_enabled', "; + $sql .= "'$destination_description' "; + $sql .= ")"; + $db->exec(check_sql($sql)); + unset($sql); + + //synchronize the xml config + save_hunt_group_xml(); + + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Add Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + } //if ($action == "add") + + if ($action == "update" && permission_exists('hunt_group_edit')) { + $sql = "update v_hunt_group_destinations set "; + $sql .= "domain_uuid = '$domain_uuid', "; + $sql .= "hunt_group_uuid = '$hunt_group_uuid', "; + $sql .= "destination_data = '$destination_data', "; + $sql .= "destination_type = '$destination_type', "; + $sql .= "destination_timeout = '$destination_timeout', "; + $sql .= "destination_order = '$destination_order', "; + $sql .= "destination_enabled = '$destination_enabled', "; + $sql .= "destination_description = '$destination_description' "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and hunt_group_destination_uuid = '$hunt_group_destination_uuid'"; + $db->exec(check_sql($sql)); + + //synchronize the xml config + save_hunt_group_xml(); + + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Update Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + } //if ($action == "update") + } //if ($_POST["persistformvar"] != "true") +} //(count($_POST)>0 && strlen($_POST["persistformvar"]) == 0) + +//pre-populate the form + if (count($_GET)>0 && $_POST["persistformvar"] != "true") { + $hunt_group_destination_uuid = $_GET["id"]; + $sql = ""; + $sql .= "select * from v_hunt_group_destinations "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and hunt_group_destination_uuid = '$hunt_group_destination_uuid' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach ($result as &$row) { + $hunt_group_uuid = $row["hunt_group_uuid"]; + $destination_data = $row["destination_data"]; + $destination_type = $row["destination_type"]; + $destination_timeout = $row["destination_timeout"]; + $destination_order = $row["destination_order"]; + $destination_enabled = $row["destination_enabled"]; + $destination_description = $row["destination_description"]; + break; //limit to 1 row + } + unset ($prep_statement); + } + +//show the header + require_once "includes/header.php"; + +//show the content + echo "
"; + echo "\n"; + + echo "\n"; + echo " "; + echo " "; + echo "
\n"; + echo "
"; + + echo "
\n"; + + echo "
\n"; + echo "\n"; + + echo "\n"; + if ($action == "add") { + echo "\n"; + } + if ($action == "update") { + echo "\n"; + } + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo " \n"; + echo " \n"; + echo " "; + echo "
Destination AddDestination Edit
\n"; + echo " Destination:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "extension: 1001
\n"; + echo "voicemail: 1001
\n"; + echo "sip uri (voicemail): sofia/internal/*98@\${domain}
\n"; + echo "sip uri (external number): sofia/gateway/gatewayname/12081231234
\n"; + echo "sip uri (auto attendant): sofia/internal/5002@\${domain}
\n"; + echo "sip uri (user): /user/1001@\${domain}\n"; + echo "
\n"; + echo " Type:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "\n"; + echo "
\n"; + echo " Timeout:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Select the destination timeout in seconds. \n"; + echo "
\n"; + echo " Order:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Processing of each destination is determined by this order. \n"; + echo "
\n"; + echo " Enabled:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "\n"; + echo "
\n"; + echo " Description:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "You may enter a description here for your reference (not parsed).\n"; + echo "
\n"; + echo " \n"; + if ($action == "update") { + echo " \n"; + } + echo " \n"; + echo "
"; + echo ""; + + echo "
"; + echo "
"; + +//show the footer + require_once "includes/footer.php"; +?> \ No newline at end of file diff --git a/app/hunt_group/v_hunt_group_edit.php b/app/hunt_group/v_hunt_group_edit.php new file mode 100644 index 0000000000..f63656e51e --- /dev/null +++ b/app/hunt_group/v_hunt_group_edit.php @@ -0,0 +1,752 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +require_once "includes/paging.php"; + +//check permissions + if (permission_exists('hunt_group_add') || permission_exists('hunt_group_edit')) { + //access granted + } + else { + echo "access denied"; + exit; + } + +//action add or update + if (isset($_REQUEST["id"])) { + $action = "update"; + $hunt_group_uuid = check_str($_REQUEST["id"]); + $dialplan_uuid = check_str($_REQUEST["dialplan_uuid"]); + } + else { + $action = "add"; + } + +//get the http values and set them as variables + if (count($_POST)>0) { + $hunt_group_extension = check_str($_POST["hunt_group_extension"]); + $hunt_group_name = check_str($_POST["hunt_group_name"]); + $hunt_group_type = check_str($_POST["hunt_group_type"]); + //$hunt_group_context = check_str($_POST["hunt_group_context"]); + $hunt_group_timeout = check_str($_POST["hunt_group_timeout"]); + $hunt_group_timeout_destination = check_str($_POST["hunt_group_timeout_destination"]); + $hunt_group_timeout_type = check_str($_POST["hunt_group_timeout_type"]); + $hunt_group_ringback = check_str($_POST["hunt_group_ringback"]); + $hunt_group_cid_name_prefix = check_str($_POST["hunt_group_cid_name_prefix"]); + $hunt_group_pin = check_str($_POST["hunt_group_pin"]); + $hunt_group_caller_announce = check_str($_POST["hunt_group_caller_announce"]); + + //prepare the user list for the database + $hunt_group_user_list = $_POST["hunt_group_user_list"]; + if (strlen($hunt_group_user_list) > 0) { + $hunt_group_user_list_array = explode("\n", $hunt_group_user_list); + if (count($hunt_group_user_list_array) == 0) { + $hunt_group_user_list = ''; + } + else { + $hunt_group_user_list = '|'; + foreach($hunt_group_user_list_array as $user){ + if(strlen(trim($user)) > 0) { + $hunt_group_user_list .= check_str(trim($user))."|"; + } + } + } + } + + $hunt_group_enabled = check_str($_POST["hunt_group_enabled"]); + $hunt_group_description = check_str($_POST["hunt_group_description"]); + + //remove invalid characters + $hunt_group_cid_name_prefix = str_replace(":", "-", $hunt_group_cid_name_prefix); + $hunt_group_cid_name_prefix = str_replace("\"", "", $hunt_group_cid_name_prefix); + $hunt_group_cid_name_prefix = str_replace("@", "", $hunt_group_cid_name_prefix); + $hunt_group_cid_name_prefix = str_replace("\\", "", $hunt_group_cid_name_prefix); + $hunt_group_cid_name_prefix = str_replace("/", "", $hunt_group_cid_name_prefix); + + //set default + if (strlen($hunt_group_caller_announce) == 0) { $hunt_group_caller_announce = "false"; } + } + +if (count($_POST)>0 && strlen($_POST["persistformvar"]) == 0) { + + $msg = ''; + if ($action == "update") { + $hunt_group_uuid = check_str($_POST["hunt_group_uuid"]); + } + + //check for all required data + if (strlen($domain_uuid) == 0) { $msg .= "Please provide: domain_uuid
\n"; } + if (strlen($hunt_group_extension) == 0) { $msg .= "Please provide: Extension
\n"; } + if (strlen($hunt_group_name) == 0) { $msg .= "Please provide: Hunt Group Name
\n"; } + if (strlen($hunt_group_type) == 0) { $msg .= "Please provide: Type
\n"; } + //if (strlen($hunt_group_context) == 0) { $msg .= "Please provide: Context
\n"; } + if (strlen($hunt_group_timeout) == 0) { $msg .= "Please provide: Timeout
\n"; } + if (strlen($hunt_group_timeout_destination) == 0) { $msg .= "Please provide: Timeout Destination
\n"; } + if (strlen($hunt_group_timeout_type) == 0) { $msg .= "Please provide: Timeout Type
\n"; } + if (strlen($hunt_group_ringback) == 0) { $msg .= "Please provide: Ring Back
\n"; } + //if (strlen($hunt_group_cid_name_prefix) == 0) { $msg .= "Please provide: CID Prefix
\n"; } + //if (strlen($hunt_group_pin) == 0) { $msg .= "Please provide: PIN
\n"; } + if (strlen($hunt_group_caller_announce) == 0) { $msg .= "Please provide: Caller Announce
\n"; } + //if (strlen($hunt_group_user_list) == 0) { $msg .= "Please provide: User List
\n"; } + //if (strlen($hunt_group_enabled) == 0) { $msg .= "Please provide: Enabled
\n"; } + //if (strlen($hunt_group_description) == 0) { $msg .= "Please provide: Description
\n"; } + if (strlen($msg) > 0 && strlen($_POST["persistformvar"]) == 0) { + require_once "includes/header.php"; + require_once "includes/persistformvar.php"; + echo "
\n"; + echo "
\n"; + echo $msg."
"; + echo "
\n"; + persistformvar($_POST); + echo "
\n"; + require_once "includes/footer.php"; + return; + } + + //add or update the database + if ($_POST["persistformvar"] != "true") { + if ($action == "add" && permission_exists('hunt_group_add')) { + //add to the table + $dialplan_uuid = uuid(); + $hunt_group_uuid = uuid(); + $sql = "insert into v_hunt_groups "; + $sql .= "("; + $sql .= "domain_uuid, "; + $sql .= "dialplan_uuid, "; + $sql .= "hunt_group_uuid, "; + $sql .= "hunt_group_extension, "; + $sql .= "hunt_group_name, "; + $sql .= "hunt_group_type, "; + $sql .= "hunt_group_context, "; + $sql .= "hunt_group_timeout, "; + $sql .= "hunt_group_timeout_destination, "; + $sql .= "hunt_group_timeout_type, "; + $sql .= "hunt_group_ringback, "; + $sql .= "hunt_group_cid_name_prefix, "; + $sql .= "hunt_group_pin, "; + $sql .= "hunt_group_caller_announce, "; + $sql .= "hunt_group_user_list, "; + $sql .= "hunt_group_enabled, "; + $sql .= "hunt_group_description "; + $sql .= ")"; + $sql .= "values "; + $sql .= "("; + $sql .= "'$domain_uuid', "; + $sql .= "'$dialplan_uuid', "; + $sql .= "'$hunt_group_uuid', "; + $sql .= "'$hunt_group_extension', "; + $sql .= "'$hunt_group_name', "; + $sql .= "'$hunt_group_type', "; + $sql .= "'".$_SESSION['context']."', "; + $sql .= "'$hunt_group_timeout', "; + $sql .= "'$hunt_group_timeout_destination', "; + $sql .= "'$hunt_group_timeout_type', "; + $sql .= "'$hunt_group_ringback', "; + $sql .= "'$hunt_group_cid_name_prefix', "; + $sql .= "'$hunt_group_pin', "; + $sql .= "'$hunt_group_caller_announce', "; + $sql .= "'$hunt_group_user_list', "; + $sql .= "'$hunt_group_enabled', "; + $sql .= "'$hunt_group_description' "; + $sql .= ")"; + $db->exec(check_sql($sql)); + unset($sql); + + //synchronize the xml config + save_hunt_group_xml(); + + //redirect the user + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Add Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + } //if ($action == "add") + + if ($action == "update" && permission_exists('hunt_group_edit')) { + //update the table + $sql = "update v_hunt_groups set "; + $sql .= "hunt_group_extension = '$hunt_group_extension', "; + $sql .= "hunt_group_name = '$hunt_group_name', "; + $sql .= "hunt_group_type = '$hunt_group_type', "; + $sql .= "hunt_group_context = '".$_SESSION['context']."', "; + $sql .= "hunt_group_timeout = '$hunt_group_timeout', "; + $sql .= "hunt_group_timeout_destination = '$hunt_group_timeout_destination', "; + $sql .= "hunt_group_timeout_type = '$hunt_group_timeout_type', "; + $sql .= "hunt_group_ringback = '$hunt_group_ringback', "; + $sql .= "hunt_group_cid_name_prefix = '$hunt_group_cid_name_prefix', "; + $sql .= "hunt_group_pin = '$hunt_group_pin', "; + $sql .= "hunt_group_caller_announce = '$hunt_group_caller_announce', "; + if (if_group("admin") || if_group("superadmin")) { + $sql .= "hunt_group_user_list = '$hunt_group_user_list', "; + } + $sql .= "hunt_group_enabled = '$hunt_group_enabled', "; + $sql .= "hunt_group_description = '$hunt_group_description' "; + $sql .= "where domain_uuid = '".$_SESSION['domain_uuid']."' "; + $sql .= "and hunt_group_uuid = '$hunt_group_uuid'"; + $db->exec(check_sql($sql)); + unset($sql); + + //update the dialplan entry + require_once "includes/classes/dialplan.php"; + $dialplan = new dialplan; + $dialplan->domain_uuid = $_SESSION['domain_uuid']; + $dialplan->app_uuid = $app_uuid; + $dialplan->dialplan_uuid = $dialplan_uuid; + $dialplan->dialplan_name = $hunt_group_name; + //$dialplan->dialplan_continue = $dialplan_continue; + //$dialplan->dialplan_order = '330'; + $dialplan->dialplan_context = $_SESSION['context']; + $dialplan->dialplan_enabled = $hunt_group_enabled; + $dialplan->dialplan_description = $hunt_group_description; + $dialplan->dialplan_update(); + unset($dialplan); + + //update the condition + $sql = "update v_dialplan_details set "; + $sql .= "dialplan_detail_data = '^".$hunt_group_extension."$' "; + $sql .= "where domain_uuid = '".$_SESSION['domain_uuid']."' "; + $sql .= "and dialplan_detail_tag = 'condition' "; + $sql .= "and dialplan_detail_type = 'destination_number' "; + $sql .= "and dialplan_uuid = '$dialplan_uuid' "; + $sql .= "and dialplan_detail_group = '1' "; + $db->query($sql); + unset($sql); + + //update the action + $sql = "update v_dialplan_details set "; + $sql .= "dialplan_detail_data = 'v_huntgroup_".$_SESSION['domain_name']."_".$hunt_group_extension.".lua', "; + $sql .= "dialplan_detail_type = 'lua' "; + $sql .= "where domain_uuid = '".$_SESSION['domain_uuid']."' "; + $sql .= "and dialplan_detail_tag = 'action' "; + $sql .= "and dialplan_uuid = '$dialplan_uuid' "; + $sql .= "and dialplan_detail_type = 'lua' "; + $sql .= "and dialplan_detail_group = '1' "; + $db->query($sql); + + //synchronize the xml config + save_hunt_group_xml(); + + //rediret the user + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Update Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + } //if ($action == "update") + } //if ($_POST["persistformvar"] != "true") +} //(count($_POST)>0 && strlen($_POST["persistformvar"]) == 0) + +//pre-populate the form + if (count($_GET)>0 && $_POST["persistformvar"] != "true") { + $hunt_group_uuid = $_GET["id"]; + $sql = "select * from v_hunt_groups "; + $sql .= "where hunt_group_uuid = '$hunt_group_uuid' "; + $sql .= "and domain_uuid = '$domain_uuid' "; + $sql .- "hunt_group_enabled = 'true' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach ($result as &$row) { + $dialplan_uuid = $row["dialplan_uuid"]; + $hunt_group_extension = $row["hunt_group_extension"]; + $hunt_group_name = $row["hunt_group_name"]; + $hunt_group_type = $row["hunt_group_type"]; + //$hunt_group_context = $row["hunt_group_context"]; + $hunt_group_timeout = $row["hunt_group_timeout"]; + $hunt_group_timeout_destination = $row["hunt_group_timeout_destination"]; + $hunt_group_timeout_type = $row["hunt_group_timeout_type"]; + $hunt_group_ringback = $row["hunt_group_ringback"]; + $hunt_group_cid_name_prefix = $row["hunt_group_cid_name_prefix"]; + $hunt_group_pin = $row["hunt_group_pin"]; + $hunt_group_caller_announce = $row["hunt_group_caller_announce"]; + $hunt_group_user_list = $row["hunt_group_user_list"]; + $hunt_group_enabled = $row["hunt_group_enabled"]; + $hunt_group_description = $row["hunt_group_description"]; + break; //limit to 1 row + } + unset ($prep_statement); + } + +//show the header + require_once "includes/header.php"; + +//show the content + echo "
"; + echo "\n"; + echo "\n"; + echo ""; + echo " "; + echo "
\n"; + echo "
"; + + echo "
\n"; + echo "
\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + if (!$fp) { + $fp = event_socket_create($_SESSION['event_socket_ip_address'], $_SESSION['event_socket_port'], $_SESSION['event_socket_password']); + } + if (switch_module_is_running($fp, 'mod_spidermonkey')) { + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + } + + if (if_group("admin") || if_group("superadmin")) { + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + } + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo " \n"; + echo " \n"; + echo " "; + echo "
\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "
\n"; + echo " \n"; + echo " Hunt Group
\n"; + echo "
\n"; + echo "
\n"; + echo " \n"; + echo " \n"; + echo "
\n"; + echo " A Hunt Group is a list of destinations that can be called in sequence or simultaneously. \n"; + echo "
\n"; + echo "
\n"; + echo "
\n"; + + echo "
\n"; + echo " Hunt Group Name:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "\n"; + echo "
\n"; + echo " Extension:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "example: 7002\n"; + echo "
\n"; + echo " Type:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "\n"; + echo "
\n"; + echo " Timeout:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "The timeout sets the time in seconds to continue to call before timing out. \n"; + echo "
\n"; + echo " Timeout Destination:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Destination. example: 1001\n"; + echo "
\n"; + echo " Timeout Type:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "\n"; + echo "
\n"; + echo " Ring Back:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Defines what the caller will hear while destination is being called. The choices are music (music on hold) ring (ring tone.) default: music \n"; + echo "
\n"; + echo " CID Prefix:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Set a prefix on the caller ID name.\n"; + echo "
\n"; + echo " PIN:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "If this is provided then the caller will be required to enter the PIN number.\n"; + echo "
\n"; + echo " Caller Announce:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "\n"; + echo "
\n"; + echo " User List:\n"; + echo "\n"; + $onchange = "document.getElementById('hunt_group_user_list').value += document.getElementById('username').value + '\\n';"; + $table_name = 'v_users'; $field_name = 'username'; $field_current_value = ''; $sql_where_optional = "where domain_uuid = '$domain_uuid' "; + echo html_select_on_change($db, $table_name, $field_name, $sql_where_optional, $field_current_value, $onchange); + echo "
\n"; + echo "Use the select list to add users to the user list. This will assign users to this extension.\n"; + echo "
\n"; + echo "
\n"; + //replace the vertical bar with a line feed to display in the textarea + $hunt_group_user_list = trim($hunt_group_user_list, "|"); + $hunt_group_user_list_array = explode("|", $hunt_group_user_list); + $hunt_group_user_list = ''; + foreach($hunt_group_user_list_array as $user){ + $hunt_group_user_list .= trim($user)."\n"; + } + echo " \n"; + echo "
\n"; + echo "Assign the users that are can manage this hunt group extension.\n"; + echo "
\n"; + echo "
\n"; + echo " Enabled:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "\n"; + echo "
\n"; + echo " Description:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "You may enter a description here for your reference (not parsed). \n"; + echo "
\n"; + if ($action == "update") { + echo " \n"; + echo " \n"; + } + echo " \n"; + echo "
"; + echo ""; + + echo "
"; + echo "
"; + +//list hunt group destinations + if ($action == "update") { + + echo "
"; + echo "\n"; + + echo "\n"; + echo " "; + echo ""; + echo "
\n"; + echo "
"; + + echo "\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "

\n"; + echo " \n"; + echo " Destinations
\n"; + echo "
\n"; + echo " The following destinations will be called.\n"; + echo "

\n"; + echo "
\n"; + + $sql = ""; + $sql .= " select * from v_hunt_group_destinations "; + $sql .= " where domain_uuid = '$domain_uuid' "; + $sql .= " and hunt_group_uuid = '$hunt_group_uuid' "; + $sql .= " order by destination_order, destination_data asc"; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + $result_count = count($result); + unset ($prep_statement, $sql); + + + $c = 0; + $row_style["0"] = "row_style0"; + $row_style["1"] = "row_style1"; + + echo "
\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + if ($result_count > 0) { + foreach($result as $row) { + echo "\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "\n"; + if ($c==0) { $c=1; } else { $c=0; } + } //end foreach + unset($sql, $result, $row_count); + } //end if results + + echo "\n"; + echo "\n"; + echo "\n"; + + echo "
DestinationTypeProfileOrderDescription\n"; + if (permission_exists('hunt_group_add')) { + echo " $v_link_label_add\n"; + } + echo "
  ".$row['destination_data']."  ".$row['destination_type']."  ".$row['destination_profile']."  ".$row['destination_order']."".$row['destination_description']." \n"; + if (permission_exists('hunt_group_edit')) { + echo " $v_link_label_edit\n"; + } + if (permission_exists('hunt_group_delete')) { + echo " $v_link_label_delete\n"; + } + echo "
\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "
 $paging_controls\n"; + if (permission_exists('hunt_group_add')) { + echo " $v_link_label_add\n"; + } + echo "
\n"; + echo "
"; + echo "
"; + echo "

"; + echo "

"; + + echo "
"; + echo "
"; + echo "

"; + } //end if update + +//show the footer + require_once "includes/footer.php"; +?> diff --git a/app/ivr_menu/app_config.php b/app/ivr_menu/app_config.php new file mode 100644 index 0000000000..5e8f0adb8a --- /dev/null +++ b/app/ivr_menu/app_config.php @@ -0,0 +1,239 @@ + \ No newline at end of file diff --git a/app/ivr_menu/root.php b/app/ivr_menu/root.php new file mode 100644 index 0000000000..7b882438ea --- /dev/null +++ b/app/ivr_menu/root.php @@ -0,0 +1,50 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ + +// make sure the PATH_SEPARATOR is defined + if (!defined("PATH_SEPARATOR")) { + if ( strpos( $_ENV[ "OS" ], "Win" ) !== false ) { define("PATH_SEPARATOR", ";"); } else { define("PATH_SEPARATOR", ":"); } + } + +// make sure the document_root is set + $_SERVER["SCRIPT_FILENAME"] = str_replace("\\", "/", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = str_replace($_SERVER["PHP_SELF"], "", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = realpath($_SERVER["DOCUMENT_ROOT"]); + //echo "DOCUMENT_ROOT: ".$_SERVER["DOCUMENT_ROOT"]."
\n"; + //echo "PHP_SELF: ".$_SERVER["PHP_SELF"]."
\n"; + //echo "SCRIPT_FILENAME: ".$_SERVER["SCRIPT_FILENAME"]."
\n"; + +// if the project directory exists then add it to the include path otherwise add the document root to the include path + if (is_dir($_SERVER["DOCUMENT_ROOT"].'/fusionpbx')){ + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', '/fusionpbx'); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER["DOCUMENT_ROOT"].'/fusionpbx' ); + } + else { + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', ''); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER['DOCUMENT_ROOT'] ); + } + +?> \ No newline at end of file diff --git a/app/ivr_menu/v_ivr_menu.php b/app/ivr_menu/v_ivr_menu.php new file mode 100644 index 0000000000..fc6b0138fa --- /dev/null +++ b/app/ivr_menu/v_ivr_menu.php @@ -0,0 +1,173 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require_once "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('ivr_menu_view')) { + //access granted +} +else { + echo "access denied"; + exit; +} +require_once "includes/header.php"; +require_once "includes/paging.php"; + +//get the http values and set them as variables + if (isset($_GET["order_by"])) { + $order_by = check_str($_GET["order_by"]); + $order = check_str($_GET["order"]); + } + else { + $order_by = ''; + $order = ''; + } + +//show the content + echo "
"; + echo "\n"; + echo "\n"; + echo " "; + echo ""; + echo "
\n"; + echo "
"; + + //show the content header + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "
IVR Menu 
\n"; + echo "The IVR Menu plays a recording or a pre-defined phrase that presents the caller with options to choose from. \n"; + echo "Each option has a corresponding destination. The destinations can be extensions, voicemail, other IVR menus, call groups, FAX extensions, and more.

\n"; + echo "
\n"; + + //get the count + require_once "includes/classes/database.php"; + require_once "includes/classes/switch_ivr_menu.php"; + $ivr = new switch_ivr_menu; + $ivr->domain_uuid = $_SESSION["domain_uuid"]; + $ivr->table = "v_ivr_menus"; + $where[0]['name'] = 'domain_uuid'; + $where[0]['value'] = $_SESSION["domain_uuid"]; + $where[0]['operator'] = '='; + $ivr->where = $where; + $num_rows = $ivr->count(); + + //prepare to page the results + $rows_per_page = 150; + $param = ""; + if (!isset($_GET['page'])) { $_GET['page'] = 0; } + $_GET['page'] = check_str($_GET['page']); + list($paging_controls, $rows_per_page, $var_3) = paging($num_rows, $param, $rows_per_page); + $offset = $rows_per_page * $_GET['page']; + + //get the list from the db + if (isset($order_by)) { + if (strlen($order_by) > 0) { + $ivr->order_by = $order_by; + $ivr->order_type = $order; + } + } + $result = $ivr->find(); + $result_count = count($result); + unset ($prep_statement, $sql); + + $c = 0; + $row_style["0"] = "row_style0"; + $row_style["1"] = "row_style1"; + + echo "
\n"; + echo "\n"; + echo "\n"; + echo th_order_by('ivr_menu_name', 'Name', $order_by, $order); + echo th_order_by('ivr_menu_extension', 'Extension', $order_by, $order); + echo th_order_by('ivr_menu_direct_dial', 'Direct Dial', $order_by, $order); + echo th_order_by('ivr_menu_enabled', 'Enabled', $order_by, $order); + echo th_order_by('ivr_menu_description', 'Description', $order_by, $order); + echo "\n"; + echo "\n"; + + if ($result_count > 0) { + foreach($result as $row) { + echo "\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "\n"; + if ($c==0) { $c=1; } else { $c=0; } + } //end foreach + unset($sql, $result, $row_count); + } //end if results + + + echo "\n"; + echo "\n"; + echo "\n"; + + echo "
\n"; + if (permission_exists('ivr_menu_add')) { + echo " $v_link_label_add\n"; + } + echo "
".$row['ivr_menu_name']."".$row['ivr_menu_extension']." ".$row['ivr_menu_direct_dial']."".$row['ivr_menu_enabled']."".$row['ivr_menu_description']." \n"; + if (permission_exists('ivr_menu_edit')) { + echo " $v_link_label_edit\n"; + } + if (permission_exists('ivr_menu_delete')) { + echo " $v_link_label_delete\n"; + } + echo "
\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "
 $paging_controls\n"; + if (permission_exists('ivr_menu_add')) { + echo " $v_link_label_add\n"; + } + echo "
\n"; + echo "
"; + echo "
"; + echo "

"; + echo "

"; + + echo "
"; + echo "
"; + echo "

"; + +//show the footer + require_once "includes/footer.php"; +?> diff --git a/app/ivr_menu/v_ivr_menu_copy.php b/app/ivr_menu/v_ivr_menu_copy.php new file mode 100644 index 0000000000..45f2be4c42 --- /dev/null +++ b/app/ivr_menu/v_ivr_menu_copy.php @@ -0,0 +1,184 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +require_once "includes/paging.php"; +if (permission_exists('ivr_menu_edit')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +//set the http get/post variable(s) to a php variable + if (isset($_REQUEST["id"])) { + $ivr_menu_uuid = $_GET["id"]; + } + +//get the v_ivr_menus data + $sql = "select * from v_ivr_menus "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and ivr_menu_uuid = '$ivr_menu_uuid' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach ($result as &$row) { + $ivr_menu_name = 'copy-'.$row["ivr_menu_name"]; + $ivr_menu_extension = $row["ivr_menu_extension"]; + $ivr_menu_greet_long = $row["ivr_menu_greet_long"]; + $ivr_menu_greet_short = $row["ivr_menu_greet_short"]; + $ivr_menu_invalid_sound = $row["ivr_menu_invalid_sound"]; + $ivr_menu_exit_sound = $row["ivr_menu_exit_sound"]; + $ivr_menu_confirm_macro = $row["ivr_menu_confirm_macro"]; + $ivr_menu_confirm_key = $row["ivr_menu_confirm_key"]; + $ivr_menu_tts_engine = $row["ivr_menu_tts_engine"]; + $ivr_menu_tts_voice = $row["ivr_menu_tts_voice"]; + $ivr_menu_confirm_attempts = $row["ivr_menu_confirm_attempts"]; + $ivr_menu_timeout = $row["ivr_menu_timeout"]; + $ivr_menu_inter_digit_timeout = $row["ivr_menu_inter_digit_timeout"]; + $ivr_menu_max_failures = $row["ivr_menu_max_failures"]; + $ivr_menu_max_timeouts = $row["ivr_menu_max_timeouts"]; + $ivr_menu_digit_len = $row["ivr_menu_digit_len"]; + $ivr_menu_direct_dial = $row["ivr_menu_direct_dial"]; + $ivr_menu_enabled = $row["ivr_menu_enabled"]; + $ivr_menu_description = 'copy: '.$row["ivr_menu_description"]; + break; //limit to 1 row + } + unset ($prep_statement); + +//get the the ivr menu options + $sql = "select * from v_ivr_menu_options "; + $sql .= "where ivr_menu_uuid = '$ivr_menu_uuid' "; + $sql .= "and domain_uuid = '$domain_uuid' "; + $sql .= "order by ivr_menu_uuid asc "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result_options = $prep_statement->fetchAll(PDO::FETCH_NAMED); + +//copy the v_ivr_menus + $ivr_menu_uuid = uuid(); + $sql = "insert into v_ivr_menus "; + $sql .= "("; + $sql .= "domain_uuid, "; + $sql .= "ivr_menu_uuid, "; + $sql .= "ivr_menu_name, "; + $sql .= "ivr_menu_extension, "; + $sql .= "ivr_menu_greet_long, "; + $sql .= "ivr_menu_greet_short, "; + $sql .= "ivr_menu_invalid_sound, "; + $sql .= "ivr_menu_exit_sound, "; + $sql .= "ivr_menu_confirm_macro, "; + $sql .= "ivr_menu_confirm_key, "; + $sql .= "ivr_menu_tts_engine, "; + $sql .= "ivr_menu_tts_voice, "; + $sql .= "ivr_menu_confirm_attempts, "; + $sql .= "ivr_menu_timeout, "; + $sql .= "ivr_menu_inter_digit_timeout, "; + $sql .= "ivr_menu_max_failures, "; + $sql .= "ivr_menu_max_timeouts, "; + $sql .= "ivr_menu_digit_len, "; + $sql .= "ivr_menu_direct_dial, "; + $sql .= "ivr_menu_enabled, "; + $sql .= "ivr_menu_description "; + $sql .= ")"; + $sql .= "values "; + $sql .= "("; + $sql .= "'$domain_uuid', "; + $sql .= "'$ivr_menu_uuid', "; + $sql .= "'$ivr_menu_name', "; + $sql .= "'$ivr_menu_extension', "; + $sql .= "'$ivr_menu_greet_long', "; + $sql .= "'$ivr_menu_greet_short', "; + $sql .= "'$ivr_menu_invalid_sound', "; + $sql .= "'$ivr_menu_exit_sound', "; + $sql .= "'$ivr_menu_confirm_macro', "; + $sql .= "'$ivr_menu_confirm_key', "; + $sql .= "'$ivr_menu_tts_engine', "; + $sql .= "'$ivr_menu_tts_voice', "; + $sql .= "'$ivr_menu_confirm_attempts', "; + $sql .= "'$ivr_menu_timeout', "; + $sql .= "'$ivr_menu_inter_digit_timeout', "; + $sql .= "'$ivr_menu_max_failures', "; + $sql .= "'$ivr_menu_max_timeouts', "; + $sql .= "'$ivr_menu_digit_len', "; + $sql .= "'$ivr_menu_direct_dial', "; + $sql .= "'$ivr_menu_enabled', "; + $sql .= "'$ivr_menu_description' "; + $sql .= ")"; + $db->exec(check_sql($sql)); + unset($sql); + +//get the the ivr menu options + foreach ($result_options as &$row) { + $ivr_menu_option_digits = $row["ivr_menu_option_digits"]; + $ivr_menu_option_action = $row["ivr_menu_option_action"]; + $ivr_menu_option_param = $row["ivr_menu_option_param"]; + $ivr_menu_option_order = $row["ivr_menu_option_order"]; + $ivr_menu_option_description = $row["ivr_menu_option_description"]; + + //copy the ivr menu options + $ivr_menu_option_uuid = uuid(); + $sql = "insert into v_ivr_menu_options "; + $sql .= "("; + $sql .= "domain_uuid, "; + $sql .= "ivr_menu_uuid, "; + $sql .= "ivr_menu_option_uuid, "; + $sql .= "ivr_menu_option_digits, "; + $sql .= "ivr_menu_option_action, "; + $sql .= "ivr_menu_option_param, "; + $sql .= "ivr_menu_option_order, "; + $sql .= "ivr_menu_option_description "; + $sql .= ")"; + $sql .= "values "; + $sql .= "("; + $sql .= "'$domain_uuid', "; + $sql .= "'$ivr_menu_uuid', "; + $sql .= "'$ivr_menu_option_uuid', "; + $sql .= "'$ivr_menu_option_digits', "; + $sql .= "'$ivr_menu_option_action', "; + $sql .= "'$ivr_menu_option_param', "; + $sql .= "'$ivr_menu_option_order', "; + $sql .= "'$ivr_menu_option_description' "; + $sql .= ")"; + $db->exec(check_sql($sql)); + unset($sql); + } + +//synchronize the xml config + save_ivr_menu_xml(); + +//redirect the user + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Copy Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + +?> \ No newline at end of file diff --git a/app/ivr_menu/v_ivr_menu_delete.php b/app/ivr_menu/v_ivr_menu_delete.php new file mode 100644 index 0000000000..d00b9f3abe --- /dev/null +++ b/app/ivr_menu/v_ivr_menu_delete.php @@ -0,0 +1,67 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require_once "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('ivr_menu_delete')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +if (count($_GET)>0) { + $id = check_str($_GET["id"]); +} + +if (strlen($id)>0) { + + //include the ivr menu class + require_once "includes/classes/database.php"; + require_once "includes/classes/switch_ivr_menu.php"; + $ivr = new switch_ivr_menu; + $ivr->domain_uuid = $_SESSION["domain_uuid"]; + $ivr->ivr_menu_uuid = $id; + $ivr->delete(); + + //synchronize the xml config + save_ivr_menu_xml(); + + //synchronize the xml config + save_dialplan_xml(); +} + +//redirect the user + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Delete Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + +?> \ No newline at end of file diff --git a/app/ivr_menu/v_ivr_menu_edit.php b/app/ivr_menu/v_ivr_menu_edit.php new file mode 100644 index 0000000000..7b77ab72be --- /dev/null +++ b/app/ivr_menu/v_ivr_menu_edit.php @@ -0,0 +1,817 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require_once "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('ivr_menu_add') || permission_exists('ivr_menu_edit')) { + //access granted +} +else { + echo "access denied"; + exit; +} +/* +function recur_sounds_dir($dir) { + global $dir_array; + global $dir_path; + $dir_list = opendir($dir); + while ($file = readdir ($dir_list)) { + if ($file != '.' && $file != '..') { + $newpath = $dir.'/'.$file; + $level = explode('/',$newpath); + if (substr($newpath, -4) == ".svn") { + //ignore .svn dir and subdir + } + else { + if (is_dir($newpath)) { //directories + recur_sounds_dir($newpath); + } + else { //files + if (strlen($newpath) > 0) { + //make the path relative + $relative_path = substr($newpath, strlen($dir_path), strlen($newpath)); + //remove the 8000-48000 khz from the path + $relative_path = str_replace("/8000/", "/", $relative_path); + $relative_path = str_replace("/16000/", "/", $relative_path); + $relative_path = str_replace("/32000/", "/", $relative_path); + $relative_path = str_replace("/48000/", "/", $relative_path); + //remove the default_language, default_dialect, and default_voice (en/us/callie) from the path + $file_array = explode( "/", $relative_path ); + $x = 1; + $relative_path = ''; + foreach( $file_array as $tmp) { + if ($x == 5) { $relative_path .= $tmp; } + if ($x > 5) { $relative_path .= '/'.$tmp; } + $x++; + } + //add the file if it does not exist in the array + if (isset($dir_array[$relative_path])) { + //already exists + } + else { + //add the new path + if (strlen($relative_path) > 0) { $dir_array[$relative_path] = '0'; } + } + } + } + } + } + } + closedir($dir_list); +} +*/ + +//action add or update +if (isset($_REQUEST["id"])) { + $action = "update"; + $ivr_menu_uuid = check_str($_REQUEST["id"]); +} +else { + $action = "add"; +} + +//get http post values and set them to php variables +if (count($_POST)>0) { + $ivr_menu_name = check_str($_POST["ivr_menu_name"]); + $ivr_menu_extension = check_str($_POST["ivr_menu_extension"]); + $ivr_menu_greet_long = check_str($_POST["ivr_menu_greet_long"]); + $ivr_menu_greet_short = check_str($_POST["ivr_menu_greet_short"]); + $ivr_menu_invalid_sound = check_str($_POST["ivr_menu_invalid_sound"]); + $ivr_menu_exit_sound = check_str($_POST["ivr_menu_exit_sound"]); + $ivr_menu_confirm_macro = check_str($_POST["ivr_menu_confirm_macro"]); + $ivr_menu_confirm_key = check_str($_POST["ivr_menu_confirm_key"]); + $ivr_menu_tts_engine = check_str($_POST["ivr_menu_tts_engine"]); + $ivr_menu_tts_voice = check_str($_POST["ivr_menu_tts_voice"]); + $ivr_menu_confirm_attempts = check_str($_POST["ivr_menu_confirm_attempts"]); + $ivr_menu_timeout = check_str($_POST["ivr_menu_timeout"]); + $ivr_menu_inter_digit_timeout = check_str($_POST["ivr_menu_inter_digit_timeout"]); + $ivr_menu_max_failures = check_str($_POST["ivr_menu_max_failures"]); + $ivr_menu_max_timeouts = check_str($_POST["ivr_menu_max_timeouts"]); + $ivr_menu_digit_len = check_str($_POST["ivr_menu_digit_len"]); + $ivr_menu_direct_dial = check_str($_POST["ivr_menu_direct_dial"]); + $ivr_menu_enabled = check_str($_POST["ivr_menu_enabled"]); + $ivr_menu_description = check_str($_POST["ivr_menu_description"]); + + $ivr_menu_exit_action = check_str($_POST["ivr_menu_exit_action"]); + //$ivr_menu_exit_action = "transfer:1001 XML default"; + $timeout_action_array = explode(":", $ivr_menu_exit_action); + $ivr_menu_exit_app = array_shift($timeout_action_array); + $ivr_menu_exit_data = join(':', $timeout_action_array); +} + +if (count($_POST)>0 && strlen($_POST["persistformvar"]) == 0) { + + $msg = ''; + if ($action == "update") { + $ivr_menu_uuid = check_str($_POST["ivr_menu_uuid"]); + } + + //check for all required data + //if (strlen($domain_uuid) == 0) { $msg .= "Please provide: domain_uuid
\n"; } + if (strlen($ivr_menu_name) == 0) { $msg .= "Please provide: Name
\n"; } + if (strlen($ivr_menu_extension) == 0) { $msg .= "Please provide: Extension
\n"; } + if (strlen($ivr_menu_greet_long) == 0) { $msg .= "Please provide: Greet Long
\n"; } + //if (strlen($ivr_menu_greet_short) == 0) { $msg .= "Please provide: Greet Short
\n"; } + if (strlen($ivr_menu_invalid_sound) == 0) { $msg .= "Please provide: Invalid Sound
\n"; } + //if (strlen($ivr_menu_exit_sound) == 0) { $msg .= "Please provide: Exit Sound
\n"; } + //if (strlen($ivr_menu_confirm_macro) == 0) { $msg .= "Please provide: Confirm Macro
\n"; } + //if (strlen($ivr_menu_confirm_key) == 0) { $msg .= "Please provide: Confirm Key
\n"; } + //if (strlen($ivr_menu_tts_engine) == 0) { $msg .= "Please provide: TTS Engine
\n"; } + //if (strlen($ivr_menu_tts_voice) == 0) { $msg .= "Please provide: TTS Voice
\n"; } + if (strlen($ivr_menu_confirm_attempts) == 0) { $msg .= "Please provide: Confirm Attempts
\n"; } + if (strlen($ivr_menu_timeout) == 0) { $msg .= "Please provide: Timeout
\n"; } + //if (strlen($ivr_menu_exit_app) == 0) { $msg .= "Please provide: Exit Action
\n"; } + //if (strlen($ivr_menu_exit_data) == 0) { $msg .= "Please provide: Timeout Data
\n"; } + if (strlen($ivr_menu_inter_digit_timeout) == 0) { $msg .= "Please provide: Inter Digit Timeout
\n"; } + if (strlen($ivr_menu_max_failures) == 0) { $msg .= "Please provide: Max Failures
\n"; } + if (strlen($ivr_menu_max_timeouts) == 0) { $msg .= "Please provide: Max Timeouts
\n"; } + if (strlen($ivr_menu_digit_len) == 0) { $msg .= "Please provide: Digit Length
\n"; } + if (strlen($ivr_menu_direct_dial) == 0) { $msg .= "Please provide: Direct Dial
\n"; } + if (strlen($ivr_menu_enabled) == 0) { $msg .= "Please provide: Enabled
\n"; } + //if (strlen($ivr_menu_description) == 0) { $msg .= "Please provide: Description
\n"; } + if (strlen($msg) > 0 && strlen($_POST["persistformvar"]) == 0) { + require_once "includes/header.php"; + require_once "includes/persistformvar.php"; + echo "
\n"; + echo "
\n"; + echo $msg."
"; + echo "
\n"; + persistformvar($_POST); + echo "
\n"; + require_once "includes/footer.php"; + return; + } + + //add or update the database + if ($_POST["persistformvar"] != "true") { + //prepare the object + require_once "includes/classes/database.php"; + require_once "includes/classes/switch_ivr_menu.php"; + $ivr = new switch_ivr_menu; + $ivr->domain_uuid = $_SESSION["domain_uuid"]; + $ivr->ivr_menu_name = $ivr_menu_name; + $ivr->ivr_menu_extension = $ivr_menu_extension; + $ivr->ivr_menu_greet_long = $ivr_menu_greet_long; + $ivr->ivr_menu_greet_short = $ivr_menu_greet_short; + $ivr->ivr_menu_invalid_sound = $ivr_menu_invalid_sound; + $ivr->ivr_menu_exit_sound = $ivr_menu_exit_sound; + $ivr->ivr_menu_confirm_macro = $ivr_menu_confirm_macro; + $ivr->ivr_menu_confirm_key = $ivr_menu_confirm_key; + $ivr->ivr_menu_tts_engine = $ivr_menu_tts_engine; + $ivr->ivr_menu_tts_voice = $ivr_menu_tts_voice; + $ivr->ivr_menu_confirm_attempts = $ivr_menu_confirm_attempts; + $ivr->ivr_menu_timeout = $ivr_menu_timeout; + $ivr->ivr_menu_exit_app = $ivr_menu_exit_app; + $ivr->ivr_menu_exit_data = $ivr_menu_exit_data; + $ivr->ivr_menu_inter_digit_timeout = $ivr_menu_inter_digit_timeout; + $ivr->ivr_menu_max_failures = $ivr_menu_max_failures; + $ivr->ivr_menu_max_timeouts = $ivr_menu_max_timeouts; + $ivr->ivr_menu_max_timeouts = $ivr_menu_max_timeouts; + $ivr->ivr_menu_digit_len = $ivr_menu_digit_len; + $ivr->ivr_menu_digit_len = $ivr_menu_digit_len; + $ivr->ivr_menu_direct_dial = $ivr_menu_direct_dial; + $ivr->ivr_menu_direct_dial = $ivr_menu_direct_dial; + $ivr->ivr_menu_enabled = $ivr_menu_enabled; + $ivr->ivr_menu_description = $ivr_menu_description; + + //add the data + if ($action == "add" && permission_exists('ivr_menu_add')) { + $ivr->ivr_menu_uuid = uuid(); + $ivr->dialplan_uuid = uuid(); + $ivr->add(); + + //synchronize the xml config + save_ivr_menu_xml(); + + //synchronize the xml config + save_dialplan_xml(); + + //redirect the user + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Add Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + } + //update the data + if ($action == "update" && permission_exists('ivr_menu_edit')) { + $ivr->ivr_menu_uuid = $ivr_menu_uuid; + $ivr->update(); + + //synchronize the xml config + save_ivr_menu_xml(); + + //synchronize the xml config + save_dialplan_xml(); + + //redirect the user + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Update Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + } + } //if ($_POST["persistformvar"] != "true") +} //(count($_POST)>0 && strlen($_POST["persistformvar"]) == 0) + +//pre-populate the form + if (count($_GET)>0 && $_POST["persistformvar"] != "true") { + $ivr_menu_uuid = $_GET["id"]; + require_once "includes/classes/switch_ivr_menu.php"; + $ivr = new switch_ivr_menu; + $ivr->domain_uuid = $_SESSION["domain_uuid"]; + $ivr->ivr_menu_uuid = $ivr_menu_uuid; + $result = $ivr->find(); + $result_count = count($result); + foreach ($result as &$row) { + $ivr_menu_name = $row["ivr_menu_name"]; + $ivr_menu_extension = $row["ivr_menu_extension"]; + $ivr_menu_greet_long = $row["ivr_menu_greet_long"]; + $ivr_menu_greet_short = $row["ivr_menu_greet_short"]; + $ivr_menu_invalid_sound = $row["ivr_menu_invalid_sound"]; + $ivr_menu_exit_sound = $row["ivr_menu_exit_sound"]; + $ivr_menu_confirm_macro = $row["ivr_menu_confirm_macro"]; + $ivr_menu_confirm_key = $row["ivr_menu_confirm_key"]; + $ivr_menu_tts_engine = $row["ivr_menu_tts_engine"]; + $ivr_menu_tts_voice = $row["ivr_menu_tts_voice"]; + $ivr_menu_confirm_attempts = $row["ivr_menu_confirm_attempts"]; + $ivr_menu_timeout = $row["ivr_menu_timeout"]; + $ivr_menu_exit_app = $row["ivr_menu_exit_app"]; + $ivr_menu_exit_data = $row["ivr_menu_exit_data"]; + $ivr_menu_inter_digit_timeout = $row["ivr_menu_inter_digit_timeout"]; + $ivr_menu_max_failures = $row["ivr_menu_max_failures"]; + $ivr_menu_max_timeouts = $row["ivr_menu_max_timeouts"]; + $ivr_menu_digit_len = $row["ivr_menu_digit_len"]; + $ivr_menu_direct_dial = $row["ivr_menu_direct_dial"]; + $ivr_menu_enabled = $row["ivr_menu_enabled"]; + $ivr_menu_description = $row["ivr_menu_description"]; + + if (strlen($ivr_menu_exit_app) > 0) { + $ivr_menu_exit_action = $ivr_menu_exit_app.":".$ivr_menu_exit_data; + } + break; //limit to 1 row + } + unset ($prep_statement); + } + +//set defaults + if (strlen($ivr_menu_timeout) == 0) { $ivr_menu_timeout = '3000'; } + if (strlen($ivr_menu_invalid_sound) == 0) { $ivr_menu_invalid_sound = 'ivr/ivr-that_was_an_invalid_entry.wav'; } + if (strlen($ivr_menu_tts_engine) == 0) { $ivr_menu_tts_engine = 'flite'; } + if (strlen($ivr_menu_tts_voice) == 0) { $ivr_menu_tts_voice = 'rms'; } + if (strlen($ivr_menu_confirm_attempts) == 0) { $ivr_menu_confirm_attempts = '3'; } + if (strlen($ivr_menu_inter_digit_timeout) == 0) { $ivr_menu_inter_digit_timeout = '2000'; } + if (strlen($ivr_menu_max_failures) == 0) { $ivr_menu_max_failures = '3'; } + if (strlen($ivr_menu_max_timeouts) == 0) { $ivr_menu_max_timeouts = '3'; } + if (strlen($ivr_menu_digit_len) == 0) { $ivr_menu_digit_len = '5'; } + if (strlen($ivr_menu_direct_dial) == 0) { $ivr_menu_direct_dial = 'false'; } + if (strlen($ivr_menu_enabled) == 0) { $ivr_menu_enabled = 'true'; } + +//content + require_once "includes/header.php"; + + echo ""; + + echo "
"; + echo "\n"; + echo "\n"; + echo " "; + echo " "; + echo "
\n"; + echo "
"; + + echo "
\n"; + echo "
\n"; + echo "\n"; + echo "\n"; + if ($action == "add") { + echo "\n"; + } + if ($action == "update") { + echo "\n"; + } + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + //--- begin: show_advanced ----------------------- + echo "\n"; + echo "\n"; + echo "\n"; + //--- end: show_advanced ----------------------- + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo " \n"; + echo " \n"; + echo " "; + echo "
IVR Menu AddIVR Menu Edit\n"; + echo " \n"; + echo " \n"; + echo "
\n"; + echo "The IVR Menu plays a recording or a pre-defined phrase that presents the caller with options to choose from. Each option has a corresponding destination. The destinations can be extensions, voicemail, IVR menus, hunt groups, FAX extensions, and more.

\n"; + echo "
\n"; + echo " Name:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter a name for the IVR menu.\n"; + echo "
\n"; + echo " Extension:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the extension number. \n"; + echo "
\n"; + echo " Greet Long:\n"; + echo "\n"; + + if (if_group("superadmin")) { + echo "\n"; + echo "\n"; + } + if (if_group("superadmin")) { + echo " \n"; + } + echo " \n"; + //misc optgroup + if (if_group("superadmin")) { + echo "\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "\n"; + } + //recordings + if($dh = opendir($_SESSION['switch']['recordings']['dir']."/")) { + $tmp_selected = false; + $files = Array(); + echo "\n"; + while($file = readdir($dh)) { + if($file != "." && $file != ".." && $file[0] != '.') { + if(is_dir($_SESSION['switch']['recordings']['dir'] . "/" . $file)) { + //this is a directory + } + else { + if ($ivr_menu_greet_long == $_SESSION['switch']['recordings']['dir']."/".$file && strlen($ivr_menu_greet_long) > 0) { + $tmp_selected = true; + echo " \n"; + } + else { + echo " \n"; + } + } + } + } + closedir($dh); + echo "\n"; + } + //sounds + //$dir_path = $_SESSION['switch']['sounds']['dir']; + //recur_sounds_dir($_SESSION['switch']['sounds']['dir']); + //echo "\n"; + //foreach ($dir_array as $key => $value) { + // if (strlen($value) > 0) { + // $tmp_dir = "\$\${sounds_dir}/\${default_language}/\${default_dialect}/\${default_voice}"; + // if ($ivr_menu_greet_long == $tmp_dir.'/'.$key) { + // $tmp_selected = true; + // echo " \n"; + // } + // else { + // echo " \n"; + // } + // } + //} + //echo "\n"; + //select + if (if_group("superadmin")) { + if (!$tmp_selected) { + echo "\n"; + if (file_exists($_SESSION['switch']['recordings']['dir']."/".$ivr_menu_greet_long)) { + echo " \n"; + } elseif (substr($ivr_menu_greet_long, -3) == "wav" || substr($ivr_menu_greet_long, -3) == "mp3") { + $tmp_dir = "\$\${sounds_dir}/\${default_language}/\${default_dialect}/\${default_voice}"; + echo " \n"; + } else { + echo " \n"; + } + + echo "\n"; + } + unset($tmp_selected); + } + echo " \n"; + + echo "
\n"; + echo "The long greeting is played when entering the menu.\n"; + echo "
\n"; + echo " Greet Short:\n"; + echo "\n"; + + echo "\n"; + echo " \n"; + + echo "
\n"; + echo "The short greeting is played when returning to the menu.\n"; + echo "
\n"; + echo " Timeout:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "The number of milliseconds to wait after playing the greeting or the confirm macro.\n"; + echo "
\n"; + echo " Exit Action:\n"; + echo "\n"; + //switch_select_destination(select_type, select_label, select_name, select_value, select_style, action); + switch_select_destination("dialplan", "", "ivr_menu_exit_action", $ivr_menu_exit_action, "", ""); + echo "
\n"; + echo " Select the exit action to be performed if the IVR exits.\n"; + echo "
\n"; + echo " Direct Dial:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Define whether callers can dial directly to extensions and feature codes.\n"; + echo "
\n"; + + echo "
\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "
Show Advanced\n"; + echo " \n"; + echo "
\n"; + echo "
\n"; + + echo "
\n"; + echo " \n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "
\n"; + echo " Invalid Sound:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Played when and invalid option is chosen.\n"; + echo "
\n"; + echo " Exit Sound:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Played when leaving the menu.\n"; + echo "
\n"; + echo " Confirm Macro:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the confirm macro.\n"; + echo "
\n"; + echo " Confirm Key:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the confirm key.\n"; + echo "
\n"; + echo " TTS Engine:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Text to speech engine.\n"; + echo "
\n"; + echo " TTS Voice:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Text to speech voice.\n"; + echo "
\n"; + echo " Confirm Attempts:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "The maximum number of confirm attempts allowed.\n"; + echo "
\n"; + echo " Inter Digit Timeout:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "The number of milliseconds to wait between digits.\n"; + echo "
\n"; + echo " Max Failures:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Maximum number of retries before exit.\n"; + echo "
\n"; + echo " Max Timeouts:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Maximum number of timeouts before exit.\n"; + echo "
\n"; + echo " Digit Length:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Maximum number of digits allowed.\n"; + echo "
\n"; + echo "
"; + + echo "
\n"; + echo " Enabled:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Define whether the IVR Menu is enabled or disabled.\n"; + echo "
\n"; + echo " Description:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter a description.\n"; + echo "
\n"; + if ($action == "update") { + echo " \n"; + } + echo " \n"; + echo "
"; + echo ""; + + if ($action == "update") { + require "v_ivr_menu_options.php"; + } + + echo "
"; + echo "
"; + +require_once "includes/footer.php"; +?> \ No newline at end of file diff --git a/app/ivr_menu/v_ivr_menu_options.php b/app/ivr_menu/v_ivr_menu_options.php new file mode 100644 index 0000000000..2ee3a80e88 --- /dev/null +++ b/app/ivr_menu/v_ivr_menu_options.php @@ -0,0 +1,181 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require_once "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('ivr_menu_view')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +require_once "includes/paging.php"; + +//get the http values and set them as variables + if (isset($_GET["order_by"])) { + $order_by = check_str($_GET["order_by"]); + $order = check_str($_GET["order"]); + } + +//begin content + echo "
"; + echo "\n"; + echo "\n"; + echo " "; + echo ""; + echo "
\n"; + echo "
"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "
IVR Menu Option List 
\n"; + echo "The recording presents options to the caller. Options match key presses (DTMF digits) from the caller which directs the call to the destinations.

\n"; + echo "
\n"; + +//get the number of rows in v_ivr_menu_options + $sql = ""; + $sql .= " select count(*) as num_rows from v_ivr_menu_options "; + $sql .= " where domain_uuid = '$domain_uuid' "; + $sql .= " and ivr_menu_uuid = '$ivr_menu_uuid' "; + $prep_statement = $db->prepare(check_sql($sql)); + if ($prep_statement) { + $prep_statement->execute(); + $row = $prep_statement->fetch(PDO::FETCH_ASSOC); + if ($row['num_rows'] > 0) { + $num_rows = $row['num_rows']; + } + else { + $num_rows = '0'; + } + } + unset($prep_statement, $result); + +//prepare to page the results + $rows_per_page = 150; + $param = $_SERVER["QUERY_STRING"]; + if (!isset($_GET['page'])) { $_GET['page'] = 0; } + $_GET['page'] = check_str($_GET['page']); + list($paging_controls, $rows_per_page, $var_3) = paging($num_rows, $param, $rows_per_page); + $offset = $rows_per_page * $_GET['page']; + +//get the menu options + $sql = ""; + $sql .= "select * from v_ivr_menu_options "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and ivr_menu_uuid = '$ivr_menu_uuid' "; + $sql .= "order by ivr_menu_option_digits, ivr_menu_option_order asc "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + $result_count = count($result); + unset ($prep_statement, $sql); + + $c = 0; + $row_style["0"] = "row_style0"; + $row_style["1"] = "row_style1"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + if ($result_count == 0) { + //no results + } + else { //received results + foreach($result as $row) { + $ivr_menu_option_param = $row['ivr_menu_option_param']; + if (strlen(trim($ivr_menu_option_param)) == 0) { + $ivr_menu_option_param = $row['ivr_menu_option_action']; + } + $ivr_menu_option_param = str_replace("menu-", "", $ivr_menu_option_param); + $ivr_menu_option_param = str_replace("XML", "", $ivr_menu_option_param); + $ivr_menu_option_param = str_replace("\${domain_name}", "", $ivr_menu_option_param); + $ivr_menu_option_param = str_replace("\${domain}", "", $ivr_menu_option_param); + $ivr_menu_option_param = ucfirst(trim($ivr_menu_option_param)); + + echo "\n"; + echo " \n"; + //echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "\n"; + if ($c==0) { $c=1; } else { $c=0; } + } //end foreach + unset($sql, $result, $row_count); + } //end if results + + echo "\n"; + echo "\n"; + echo "\n"; + echo "
OptionDestinationOrderDescription\n"; + if (permission_exists('ivr_menu_add')) { + echo " $v_link_label_add\n"; + } + echo "
".$row['ivr_menu_option_digits']."".$row['ivr_menu_option_action']."".$ivr_menu_option_param."".$row['ivr_menu_option_order']." ".$row['ivr_menu_option_description']." \n"; + if (permission_exists('ivr_menu_edit')) { + echo " $v_link_label_edit\n"; + } + if (permission_exists('ivr_menu_delete')) { + echo " $v_link_label_delete\n"; + } + echo "
\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "
 $paging_controls\n"; + if (permission_exists('ivr_menu_add')) { + echo " $v_link_label_add\n"; + } + echo "
\n"; + echo "
"; + + echo "

"; + echo "

"; + + echo "
"; + echo "
"; + echo "

"; + +?> diff --git a/app/ivr_menu/v_ivr_menu_options_delete.php b/app/ivr_menu/v_ivr_menu_options_delete.php new file mode 100644 index 0000000000..c4d23d073b --- /dev/null +++ b/app/ivr_menu/v_ivr_menu_options_delete.php @@ -0,0 +1,66 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require_once "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('ivr_menu_delete')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +//set the http values as variables + if (count($_GET)>0) { + $id = check_str($_GET["id"]); + $ivr_menu_uuid = check_str($_GET["ivr_menu_uuid"]); + } + +//delete the ivr menu option + if (strlen($id)>0) { + //include the ivr menu class + require_once "includes/classes/database.php"; + require_once "includes/classes/switch_ivr_menu.php"; + $ivr = new switch_ivr_menu; + $ivr->domain_uuid = $_SESSION["domain_uuid"]; + $ivr->ivr_menu_option_uuid = $id; + $ivr->delete(); + + //synchronize the xml config + save_ivr_menu_xml(); + } + +//redirect the user + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Delete Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + +?> \ No newline at end of file diff --git a/app/ivr_menu/v_ivr_menu_options_edit.php b/app/ivr_menu/v_ivr_menu_options_edit.php new file mode 100644 index 0000000000..62a5466984 --- /dev/null +++ b/app/ivr_menu/v_ivr_menu_options_edit.php @@ -0,0 +1,361 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require_once "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('ivr_menu_add') || permission_exists('ivr_menu_edit')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +//action add or update + if (isset($_REQUEST["id"])) { + $action = "update"; + $ivr_menu_option_uuid = check_str($_REQUEST["id"]); + } + else { + $action = "add"; + } + +//get the menu id + if (strlen($_GET["ivr_menu_uuid"]) > 0) { + $ivr_menu_uuid = check_str($_GET["ivr_menu_uuid"]); + } + +//get the http post variables and set them to php variables + if (count($_POST)>0) { + //$domain_uuid = check_str($_POST["domain_uuid"]); + $ivr_menu_uuid = check_str($_POST["ivr_menu_uuid"]); + $ivr_menu_option_digits = check_str($_POST["ivr_menu_option_digits"]); + $ivr_menu_option_action = check_str($_POST["ivr_menu_option_action"]); + $ivr_menu_option_param = check_str($_POST["ivr_menu_option_param"]); + $ivr_menu_option_order = check_str($_POST["ivr_menu_option_order"]); + $ivr_menu_option_description = check_str($_POST["ivr_menu_option_description"]); + + //set the default ivr_menu_option_action + if (strlen($ivr_menu_option_action) == 0) { + $ivr_menu_option_action = "menu-exec-app"; + } + + //seperate the action and the param + $options_array = explode(":", $ivr_menu_option_param); + $ivr_menu_option_action = array_shift($options_array); + $ivr_menu_option_param = join(':', $options_array); + } + +if (count($_POST)>0 && strlen($_POST["persistformvar"]) == 0) { + + $msg = ''; + if ($action == "update") { + $ivr_menu_option_uuid = check_str($_POST["ivr_menu_option_uuid"]); + } + + //check for all required data + //if (strlen($domain_uuid) == 0) { $msg .= "Please provide: domain_uuid
\n"; } + //if (strlen($ivr_menu_uuid) == 0) { $msg .= "Please provide: ivr_menu_uuid
\n"; } + if (strlen($ivr_menu_option_digits) == 0) { $msg .= "Please provide: Option
\n"; } + //if (strlen($ivr_menu_option_action) == 0) { $msg .= "Please provide: Type
\n"; } + //if (strlen($ivr_menu_option_param) == 0) { $msg .= "Please provide: Destination
\n"; } + if (strlen($ivr_menu_option_order) == 0) { $msg .= "Please provide: Order
\n"; } + //if (strlen($ivr_menu_option_description) == 0) { $msg .= "Please provide: Description
\n"; } + if (strlen($msg) > 0 && strlen($_POST["persistformvar"]) == 0) { + require_once "includes/header.php"; + require_once "includes/persistformvar.php"; + echo "
\n"; + echo "
\n"; + echo $msg."
"; + echo "
\n"; + persistformvar($_POST); + echo "
\n"; + require_once "includes/footer.php"; + return; + } + + //add or update the database + if ($_POST["persistformvar"] != "true") { + //create the object + require_once "includes/classes/database.php"; + require_once "includes/classes/switch_ivr_menu.php"; + $ivr = new switch_ivr_menu; + $ivr->domain_uuid = $_SESSION["domain_uuid"]; + $ivr->ivr_menu_uuid = $ivr_menu_uuid; + $ivr->ivr_menu_option_uuid = $ivr_menu_option_uuid; + $ivr->ivr_menu_option_digits = $ivr_menu_option_digits; + $ivr->ivr_menu_option_action = $ivr_menu_option_action; + $ivr->ivr_menu_option_param = $ivr_menu_option_param; + $ivr->ivr_menu_option_order = $ivr_menu_option_order; + $ivr->ivr_menu_option_description = $ivr_menu_option_description; + + if ($action == "add" && permission_exists('ivr_menu_add')) { + $ivr_menu_option_uuid = uuid(); + $ivr->ivr_menu_option_uuid = $ivr_menu_option_uuid; + $ivr->add(); + + //synchronize the xml config + save_ivr_menu_xml(); + + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Add Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + } //if ($action == "add") + + if ($action == "update" && permission_exists('ivr_menu_edit')) { + $ivr->ivr_menu_option_uuid = $ivr_menu_option_uuid; + $ivr->update(); + + //synchronize the xml config + save_ivr_menu_xml(); + + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Update Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + } //if ($action == "update") + } //if ($_POST["persistformvar"] != "true") +} //(count($_POST)>0 && strlen($_POST["persistformvar"]) == 0) + +//pre-populate the form + if (count($_GET)>0 && $_POST["persistformvar"] != "true") { + $ivr_menu_option_uuid = $_GET["id"]; + $sql = ""; + $sql .= "select * from v_ivr_menu_options "; + $sql .= "where ivr_menu_option_uuid = '$ivr_menu_option_uuid' "; + $sql .= "and domain_uuid = '$domain_uuid' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach ($result as &$row) { + $domain_uuid = $row["domain_uuid"]; + $ivr_menu_uuid = $row["ivr_menu_uuid"]; + $ivr_menu_option_digits = $row["ivr_menu_option_digits"]; + $ivr_menu_option_action = $row["ivr_menu_option_action"]; + $ivr_menu_option_param = $row["ivr_menu_option_param"]; + + //if admin show only the param + if (if_group("admin")) { + $ivr_menu_options_label = $ivr_menu_option_param; + } + + //if superadmin show both the action and param + if (if_group("superadmin")) { + $ivr_menu_options_label = $ivr_menu_option_action.':'.$ivr_menu_option_param; + } + + $ivr_menu_option_order = $row["ivr_menu_option_order"]; + $ivr_menu_option_description = $row["ivr_menu_option_description"]; + break; //limit to 1 row + } + unset ($prep_statement); + } + +//send the content to the browser + require_once "includes/header.php"; + + echo "
"; + echo "\n"; + echo "\n"; + echo " \n"; + echo " \n"; + echo "
\n"; + echo "
"; + + echo "
\n"; + echo "
\n"; + echo "\n"; + + echo "\n"; + if ($action == "add") { + echo "\n"; + } + if ($action == "update") { + echo "\n"; + } + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + /* + if (if_group("superadmin")) { + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + } + */ + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo " \n"; + echo " \n"; + echo " "; + + echo "
IVR Menu Option AddIVR Menu Option Edit
\n"; + echo "The recording presents options to the caller. Options match key presses (DTMF digits) from the caller which directs the call to the destinations.

\n"; + echo "
\n"; + echo " Option:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Any number between 1-5 digits or regular expressions.\n"; + echo "
\n"; + echo " Type:\n"; + echo "\n"; + + echo " \n"; + + echo "
\n"; + echo "The type is required when a custom destination is defined. \n"; + echo "
\n"; + echo " Destination:\n"; + echo "\n"; + + //switch_select_destination($select_type, $select_label, $select_name, $select_value, $select_style, $action='') + $tmp_select_value = ''; + if (strlen($ivr_menu_option_action.$ivr_menu_option_param) > 0) { + $tmp_select_value = $ivr_menu_option_action.':'.$ivr_menu_option_param; + } + switch_select_destination("ivr", $ivr_menu_options_label, "ivr_menu_option_param", $tmp_select_value, "", $ivr_menu_option_action); + unset($tmp_select_value); + + echo "
\n"; + echo "Select the destination.\n"; + echo "
\n"; + echo " Order:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Select the order.\n"; + echo "
\n"; + echo " Description:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter a description here for your reference.\n"; + echo "
\n"; + echo " \n"; + if ($action == "update") { + echo " \n"; + } + echo " \n"; + echo "
\n"; + echo "
\n"; + echo "
\n"; + + echo "
\n"; + echo "
\n"; + +require_once "includes/footer.php"; +?> \ No newline at end of file diff --git a/app/log_viewer/app_config.php b/app/log_viewer/app_config.php new file mode 100644 index 0000000000..e049d7a3d6 --- /dev/null +++ b/app/log_viewer/app_config.php @@ -0,0 +1,27 @@ + \ No newline at end of file diff --git a/app/log_viewer/log_viewer.php b/app/log_viewer/log_viewer.php new file mode 100644 index 0000000000..2259b5ea8b --- /dev/null +++ b/app/log_viewer/log_viewer.php @@ -0,0 +1,250 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane + James Rose +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('log_view')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +//define variables + $c = 0; + $row_style["0"] = "row_style0"; + $row_style["1"] = "row_style1"; + +//set a default file size + if (strlen($_POST['fs']) == 0) { $_POST['fs'] = "32"; } + +if (permission_exists('log_download')) { + if ($_GET['a'] == "download") { + if ($_GET['t'] == "logs") { + $tmp = $_SESSION['switch']['log']['dir'].'/'; + $filename = 'freeswitch.log'; + } + session_cache_limiter('public'); + $fd = fopen($tmp.$filename, "rb"); + header("Content-Type: binary/octet-stream"); + header("Content-Length: " . filesize($tmp.$filename)); + header('Content-Disposition: attachment; filename="'.$filename.'"'); + fpassthru($fd); + exit; + } +} + +require_once "includes/header.php"; + +echo "
\n"; +echo "
\n"; + +echo "\n"; +echo " \n"; +echo " \n"; +echo " \n"; +echo " \n"; +echo " \n"; +echo " \n"; +echo " \n"; +echo " \n"; +echo " \n"; +echo "\n"; +echo "
\n"; +echo " Log Viewer
\n"; +echo "
\n"; +echo " \n"; +echo " \n"; +echo " \n"; +if (permission_exists('log_download')) { + echo " \n"; +} +echo "
"; + +if (permission_exists('log_view')) { + + $MAXEL = 3; //pattern2, pattern3|color2, color3 etc... + + $user_filesize = '0'; + $default_color = 'white'; + $default_type = 'normal'; + $default_font = 'monospace'; + $background_color = 'black'; + $default_fsize = '512000'; + $log_file = $_SESSION['switch']['log']['dir']."/freeswitch.log"; + + //put the color matches here... + $arr_filter[0]['pattern'] = '[NOTICE]'; + $arr_filter[0]['color'] = 'cyan'; + $arr_filter[0]['type'] = 'normal'; + $arr_filter[0]['font'] = 'monospace'; + + $arr_filter[1]['pattern'] = '[INFO]'; + $arr_filter[1]['color'] = 'chartreuse'; + $arr_filter[1]['type'] = 'normal'; + $arr_filter[1]['font'] = 'monospace'; + + $arr_filter[2]['pattern'] = 'Dialplan:'; + $arr_filter[2]['color'] = 'burlywood'; + $arr_filter[2]['type'] = 'normal'; + $arr_filter[2]['font'] = 'monospace'; + $arr_filter[2]['pattern2'] = 'Regex (PASS)'; + $arr_filter[2]['color2'] = 'chartreuse'; + $arr_filter[2]['pattern3'] = 'Regex (FAIL)'; + $arr_filter[2]['color3'] = 'red'; + + $arr_filter[3]['pattern'] = '[WARNING]'; + $arr_filter[3]['color'] = 'fuchsia'; + $arr_filter[3]['type'] = 'normal'; + $arr_filter[3]['font'] = 'monospace'; + + $arr_filter[4]['pattern'] = '[ERR]'; + $arr_filter[4]['color'] = 'red'; + $arr_filter[4]['type'] = 'bold'; + $arr_filter[4]['font'] = 'monospace'; + + $arr_filter[5]['pattern'] = '[DEBUG]'; + $arr_filter[5]['color'] = 'gold'; + $arr_filter[5]['type'] = 'bold'; + $arr_filter[5]['font'] = 'monospace'; + + $file_size = filesize($log_file); + + if (isset($_POST['submit'])) { + if (strlen($_POST['fs']) == 0) { $_POST['fs'] = "32"; } + } + + echo ""; + echo ""; + echo ""; +} + +echo "
Syntax Highlighted
"; + + $user_filesize = '32000'; + if (isset($_POST['submit'])) { + if (!is_numeric($_POST['fs'])){ + echo ""; + echo "Just what do you think you're doing, Dave?
"; + echo "
"; + //should generate log warning here... + $user_filesize='1000'; + } + else { + $user_filesize = $_POST['fs'] * 1000; + } + } + + //echo "Log File Size: " . $file_size . " bytes.
"; + echo "Viewing the last " . $user_filesize . " of " . $file_size . " bytes.

"; + + $file = fopen($log_file, "r") or exit("Unable to open file!"); + + //set pointer in file + if ($user_filesize >= '0') { + if ($user_filesize == '0'){ + $user_filesize = $default_fsize; + } + if ( $file_size >= $user_filesize ){ + //set an offset on fopen + $bytecount=$file_size-$user_filesize; + fseek($file, $bytecount); + //echo "opening at " . $bytecount . " bytes
"; + } + else { + if ( $file_size >= $default_fsize ){ + //set an offset on fopen + $bytecount=$file_size-$default_fsize; + fseek($file, $bytecount); + echo "opening at " . $bytecount . " bytes
"; + } + else { + //open the file + $bytecount='0'; + fseek($file, 0); + echo "
opening entire file
"; + } + } + } + else { + if ( $file_size >= $default_fsize ){ + //set an offset on fopen + $bytecount=$file_size-$default_fsize; + fseek($file, $bytecount); + echo "opening at " . $bytecount . " bytes
"; + } + else { + //open the file + $bytecount='0'; + fseek($file, 0); + echo "
opening entire file
"; + } + } + + //start processing + while(!feof($file)) + { + $log_line = fgets($file); + $byte_count++; + $noprint = false; + foreach ($arr_filter as $v1) { + $pos = strpos($log_line, $v1['pattern']); + //echo "
POS is: '$pos'
"; + if ($pos !== false){ + //color adjustments on words in log line + for ($i=2; $i<=$MAXEL; $i++){ + if (isset ($v1["pattern".$i])){ + $log_line = str_replace($v1["pattern".$i], "{$v1["pattern".$i]}", $log_line); + } + } + + echo "" ; + /* testing to see if style is what crashes firefox on large logfiles... + echo "

";*/ + echo $log_line; + echo "
"; + $noprint = true; + } + } + if ($noprint !== true){ + //more firefox workaround... + //echo "

"; + echo "" ; + echo $log_line; + //echo "

"; + echo "
"; + } + } + + fclose($file); + echo "
\n"; +echo "\n"; + +require_once "includes/footer.php"; + +?> diff --git a/app/log_viewer/root.php b/app/log_viewer/root.php new file mode 100644 index 0000000000..7b882438ea --- /dev/null +++ b/app/log_viewer/root.php @@ -0,0 +1,50 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ + +// make sure the PATH_SEPARATOR is defined + if (!defined("PATH_SEPARATOR")) { + if ( strpos( $_ENV[ "OS" ], "Win" ) !== false ) { define("PATH_SEPARATOR", ";"); } else { define("PATH_SEPARATOR", ":"); } + } + +// make sure the document_root is set + $_SERVER["SCRIPT_FILENAME"] = str_replace("\\", "/", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = str_replace($_SERVER["PHP_SELF"], "", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = realpath($_SERVER["DOCUMENT_ROOT"]); + //echo "DOCUMENT_ROOT: ".$_SERVER["DOCUMENT_ROOT"]."
\n"; + //echo "PHP_SELF: ".$_SERVER["PHP_SELF"]."
\n"; + //echo "SCRIPT_FILENAME: ".$_SERVER["SCRIPT_FILENAME"]."
\n"; + +// if the project directory exists then add it to the include path otherwise add the document root to the include path + if (is_dir($_SERVER["DOCUMENT_ROOT"].'/fusionpbx')){ + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', '/fusionpbx'); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER["DOCUMENT_ROOT"].'/fusionpbx' ); + } + else { + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', ''); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER['DOCUMENT_ROOT'] ); + } + +?> \ No newline at end of file diff --git a/app/modules/app_config.php b/app/modules/app_config.php new file mode 100644 index 0000000000..e17f943224 --- /dev/null +++ b/app/modules/app_config.php @@ -0,0 +1,87 @@ + \ No newline at end of file diff --git a/app/modules/app_defaults.php b/app/modules/app_defaults.php new file mode 100644 index 0000000000..e8ee87f902 --- /dev/null +++ b/app/modules/app_defaults.php @@ -0,0 +1,39 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ + +//use the module class to get the list of modules from the db and add any missing modules + require_once "includes/classes/switch_modules.php"; + $mod = new switch_modules; + $mod->db = $db; + $mod->dir = $_SESSION['switch']['mod']['dir']; + $mod->get_modules(); + $mod->synch(); + $msg = $mod->msg; + +// synchronize the modules + save_module_xml(); + +?> \ No newline at end of file diff --git a/app/modules/root.php b/app/modules/root.php new file mode 100644 index 0000000000..7b882438ea --- /dev/null +++ b/app/modules/root.php @@ -0,0 +1,50 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ + +// make sure the PATH_SEPARATOR is defined + if (!defined("PATH_SEPARATOR")) { + if ( strpos( $_ENV[ "OS" ], "Win" ) !== false ) { define("PATH_SEPARATOR", ";"); } else { define("PATH_SEPARATOR", ":"); } + } + +// make sure the document_root is set + $_SERVER["SCRIPT_FILENAME"] = str_replace("\\", "/", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = str_replace($_SERVER["PHP_SELF"], "", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = realpath($_SERVER["DOCUMENT_ROOT"]); + //echo "DOCUMENT_ROOT: ".$_SERVER["DOCUMENT_ROOT"]."
\n"; + //echo "PHP_SELF: ".$_SERVER["PHP_SELF"]."
\n"; + //echo "SCRIPT_FILENAME: ".$_SERVER["SCRIPT_FILENAME"]."
\n"; + +// if the project directory exists then add it to the include path otherwise add the document root to the include path + if (is_dir($_SERVER["DOCUMENT_ROOT"].'/fusionpbx')){ + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', '/fusionpbx'); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER["DOCUMENT_ROOT"].'/fusionpbx' ); + } + else { + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', ''); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER['DOCUMENT_ROOT'] ); + } + +?> \ No newline at end of file diff --git a/app/modules/v_modules.php b/app/modules/v_modules.php new file mode 100644 index 0000000000..206a0ebf70 --- /dev/null +++ b/app/modules/v_modules.php @@ -0,0 +1,221 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('modules_view')) { + //access granted +} +else { + echo "access denied"; + exit; +} +require_once "includes/header.php"; +require_once "includes/paging.php"; + +$order_by = $_GET["order_by"]; +$order = $_GET["order"]; + +$fp = event_socket_create($_SESSION['event_socket_ip_address'], $_SESSION['event_socket_port'], $_SESSION['event_socket_password']); +if (strlen($_GET["a"]) > 0) { + if ($_GET["a"] == "stop") { + $module_name = $_GET["m"]; + if ($fp) { + $cmd = "api unload $module_name"; + $response = trim(event_socket_request($fp, $cmd)); + $msg = 'Unload Module:
'.$response.'
'; + } + } + if ($_GET["a"] == "start") { + $module_name = $_GET["m"]; + if ($fp) { + $cmd = "api load $module_name"; + $response = trim(event_socket_request($fp, $cmd)); + $msg = 'Load Module:
'.$response.'
'; + } + } +} + +//use the module class to get the list of modules from the db and add any missing modules + require_once "includes/classes/switch_modules.php"; + $mod = new switch_modules; + $mod->db = $db; + $mod->dir = $_SESSION['switch']['mod']['dir']; + $mod->get_modules(); + $result = $mod->modules; + $module_count = count($result); + $mod->synch(); + $msg = $mod->msg; + +//show the msg + if ($msg) { + save_module_xml(); + echo "
\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "
Message
$msg
\n"; + echo "
\n"; + } + +//show the content + echo "
"; + echo "\n"; + echo "\n"; + echo " "; + echo ""; + echo "
\n"; + echo "
"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "
Module List 
\n"; + echo "Modules extend the features of the system. Use this page to enable or disable modules. "; + echo "
\n"; + + $c = 0; + $row_style["0"] = "row_style0"; + $row_style["1"] = "row_style1"; + + echo "
\n"; + echo "\n"; + $tmp_module_header = "\n"; + $tmp_module_header .= "\n"; + //$tmp_module_header .= "\n"; + $tmp_module_header .= "\n"; + //$tmp_module_header .= "\n"; + $tmp_module_header .= "\n"; + $tmp_module_header .= "\n"; + $tmp_module_header .= "\n"; + $tmp_module_header .= "\n"; + //$tmp_module_header .= "\n"; + $tmp_module_header .= "\n"; + $tmp_module_header .= "\n"; + + if ($module_count > 0) { + $prev_module_category = ''; + foreach($result as $row) { + if ($prev_module_category != $row["module_category"]) { + $c=0; + if (strlen($prev_module_category) > 0) { + echo "\n"; + echo "\n"; + echo "\n"; + } + echo "\n"; + echo $tmp_module_header; + } + + echo "\n"; + //echo " \n"; + echo " \n"; + //echo " \n"; + echo " \n"; + if ($mod->active($row["module_name"])) { + echo " \n"; + echo " \n"; + } + else { + if ($row['module_enabled']=="true") { + echo " \n"; + } + else { + echo " \n"; + } + echo " \n"; + } + echo " \n"; + //echo " \n"; + echo " \n"; + echo "\n"; + + $prev_module_category = $row["module_category"]; + if ($c==0) { $c=1; } else { $c=0; } + } //end foreach + unset($sql, $modules, $row_count); + } //end if results + + echo "\n"; + echo "\n"; + echo "\n"; + + echo "
Module CategoryLabelModule NameDescriptionStatusActionEnabledDefault Enabled\n"; + $tmp_module_header .= " $v_link_label_add\n"; + $tmp_module_header .= "
\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "
  \n"; + if (permission_exists('modules_add')) { + echo " $v_link_label_add\n"; + } + echo "
\n"; + echo "
\n"; + echo "
\n"; + echo "
\n"; + echo " ".$row["module_category"]." 
".$row["module_category"]."".$row["module_label"]."".$row["module_name"]."".$row["module_description"]." RunningStopStoppedStopped $noticeStart".$row["module_enabled"]."".$row["module_default_enabled"]."\n"; + if (permission_exists('modules_edit')) { + echo " $v_link_label_edit\n"; + } + if (permission_exists('modules_delete')) { + echo " $v_link_label_delete\n"; + } + echo "
\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "
 $paging_controls\n"; + if (permission_exists('modules_add')) { + echo " $v_link_label_add\n"; + } + echo "
\n"; + echo "
"; + echo "
"; + echo "

"; + echo "

"; + + echo "
"; + echo "
"; + echo "

"; + +//show the footer + require_once "includes/footer.php"; +?> \ No newline at end of file diff --git a/app/modules/v_modules_delete.php b/app/modules/v_modules_delete.php new file mode 100644 index 0000000000..7da66272ec --- /dev/null +++ b/app/modules/v_modules_delete.php @@ -0,0 +1,58 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('modules_delete')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +if (count($_GET)>0) { + $id = $_GET["id"]; +} + +if (strlen($id)>0) { + $sql = ""; + $sql .= "delete from v_modules "; + $sql .= "where module_uuid = '$id' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + unset($sql); +} + +require_once "includes/header.php"; +echo "\n"; +echo "
\n"; +echo "Delete Complete\n"; +echo "
\n"; +require_once "includes/footer.php"; +return; + +?> \ No newline at end of file diff --git a/app/modules/v_modules_edit.php b/app/modules/v_modules_edit.php new file mode 100644 index 0000000000..f56396c548 --- /dev/null +++ b/app/modules/v_modules_edit.php @@ -0,0 +1,304 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('modules_add') || permission_exists('modules_edit')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +//determin the action add or update + if (isset($_REQUEST["id"])) { + $action = "update"; + $module_uuid = check_str($_REQUEST["id"]); + } + else { + $action = "add"; + } + +//set the http post variables to php variables + if (count($_POST)>0) { + $module_label = check_str($_POST["module_label"]); + $module_name = check_str($_POST["module_name"]); + $module_description = check_str($_POST["module_description"]); + $module_category = check_str($_POST["module_category"]); + $module_enabled = check_str($_POST["module_enabled"]); + $module_default_enabled = check_str($_POST["module_default_enabled"]); + } + +if (count($_POST)>0 && strlen($_POST["persistformvar"]) == 0) { + + $msg = ''; + if ($action == "update") { + $module_uuid = check_str($_POST["module_uuid"]); + } + + //check for all required data + if (strlen($module_label) == 0) { $msg .= "Please provide: Label
\n"; } + if (strlen($module_name) == 0) { $msg .= "Please provide: Module Name
\n"; } + //if (strlen($module_description) == 0) { $msg .= "Please provide: Description
\n"; } + if (strlen($module_category) == 0) { $msg .= "Please provide: Module Category
\n"; } + if (strlen($module_enabled) == 0) { $msg .= "Please provide: Enabled
\n"; } + if (strlen($module_default_enabled) == 0) { $msg .= "Please provide: Default Enabled
\n"; } + if (strlen($msg) > 0 && strlen($_POST["persistformvar"]) == 0) { + require_once "includes/header.php"; + require_once "includes/persistformvar.php"; + echo "
\n"; + echo "
\n"; + echo $msg."
"; + echo "
\n"; + persistformvar($_POST); + echo "
\n"; + require_once "includes/footer.php"; + return; + } + + //add or update the database + if ($_POST["persistformvar"] != "true") { + if ($action == "add" && permission_exists('modules_add')) { + $module_uuid = uuid(); + $sql = "insert into v_modules "; + $sql .= "("; + $sql .= "module_uuid, "; + $sql .= "module_label, "; + $sql .= "module_name, "; + $sql .= "module_description, "; + $sql .= "module_category, "; + $sql .= "module_enabled, "; + $sql .= "module_default_enabled "; + $sql .= ")"; + $sql .= "values "; + $sql .= "("; + $sql .= "'$module_uuid', "; + $sql .= "'$module_label', "; + $sql .= "'$module_name', "; + $sql .= "'$module_description', "; + $sql .= "'$module_category', "; + $sql .= "'$module_enabled', "; + $sql .= "'$module_default_enabled' "; + $sql .= ")"; + $db->exec(check_sql($sql)); + unset($sql); + + save_module_xml(); + + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Add Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + } //if ($action == "add") + + if ($action == "update" && permission_exists('modules_edit')) { + $sql = "update v_modules set "; + $sql .= "module_label = '$module_label', "; + $sql .= "module_name = '$module_name', "; + $sql .= "module_description = '$module_description', "; + $sql .= "module_category = '$module_category', "; + $sql .= "module_enabled = '$module_enabled', "; + $sql .= "module_default_enabled = '$module_default_enabled' "; + $sql .= "where module_uuid = '$module_uuid' "; + $db->exec(check_sql($sql)); + unset($sql); + + save_module_xml(); + + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Update Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + } //if ($action == "update") + } //if ($_POST["persistformvar"] != "true") +} //(count($_POST)>0 && strlen($_POST["persistformvar"]) == 0) + +//pre-populate the form + if (count($_GET)>0 && $_POST["persistformvar"] != "true") { + $module_uuid = $_GET["id"]; + $sql = ""; + $sql .= "select * from v_modules "; + $sql .= "where module_uuid = '$module_uuid' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach ($result as &$row) { + $module_label = $row["module_label"]; + $module_name = $row["module_name"]; + $module_description = $row["module_description"]; + $module_category = $row["module_category"]; + $module_enabled = $row["module_enabled"]; + $module_default_enabled = $row["module_default_enabled"]; + break; //limit to 1 row + } + unset ($prep_statement); + } + +//show the header + require_once "includes/header.php"; + +//show the content + echo "
"; + echo "\n"; + echo "\n"; + echo " "; + echo " "; + echo "
\n"; + echo "
"; + + echo "
\n"; + + echo "
\n"; + echo "\n"; + + echo "\n"; + if ($action == "add") { + echo "\n"; + } + if ($action == "update") { + echo "\n"; + } + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo " \n"; + echo " \n"; + echo " "; + echo "
Module AddModule Update
\n"; + echo " Label:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "\n"; + echo "
\n"; + echo " Module Name:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "\n"; + echo "
\n"; + echo " Description:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "\n"; + echo "
\n"; + echo " Module Category:\n"; + echo "\n"; + $table_name = 'v_modules';$field_name = 'module_category';$sql_where_optional = "";$field_current_value = $module_category; + echo html_select_other($db, $table_name, $field_name, $sql_where_optional, $field_current_value); + echo "
\n"; + echo "\n"; + echo "
\n"; + echo " Enabled:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "\n"; + echo "
\n"; + echo " Default Enabled:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "\n"; + echo "
\n"; + if ($action == "update") { + echo " \n"; + } + echo " \n"; + echo "
"; + echo ""; + + + echo "
"; + echo "
"; + + require_once "includes/footer.php"; +?> \ No newline at end of file diff --git a/app/music_on_hold/app_config.php b/app/music_on_hold/app_config.php new file mode 100644 index 0000000000..386febf7c1 --- /dev/null +++ b/app/music_on_hold/app_config.php @@ -0,0 +1,29 @@ + \ No newline at end of file diff --git a/app/music_on_hold/root.php b/app/music_on_hold/root.php new file mode 100644 index 0000000000..7b882438ea --- /dev/null +++ b/app/music_on_hold/root.php @@ -0,0 +1,50 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ + +// make sure the PATH_SEPARATOR is defined + if (!defined("PATH_SEPARATOR")) { + if ( strpos( $_ENV[ "OS" ], "Win" ) !== false ) { define("PATH_SEPARATOR", ";"); } else { define("PATH_SEPARATOR", ":"); } + } + +// make sure the document_root is set + $_SERVER["SCRIPT_FILENAME"] = str_replace("\\", "/", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = str_replace($_SERVER["PHP_SELF"], "", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = realpath($_SERVER["DOCUMENT_ROOT"]); + //echo "DOCUMENT_ROOT: ".$_SERVER["DOCUMENT_ROOT"]."
\n"; + //echo "PHP_SELF: ".$_SERVER["PHP_SELF"]."
\n"; + //echo "SCRIPT_FILENAME: ".$_SERVER["SCRIPT_FILENAME"]."
\n"; + +// if the project directory exists then add it to the include path otherwise add the document root to the include path + if (is_dir($_SERVER["DOCUMENT_ROOT"].'/fusionpbx')){ + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', '/fusionpbx'); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER["DOCUMENT_ROOT"].'/fusionpbx' ); + } + else { + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', ''); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER['DOCUMENT_ROOT'] ); + } + +?> \ No newline at end of file diff --git a/app/music_on_hold/slim.swf b/app/music_on_hold/slim.swf new file mode 100644 index 0000000000000000000000000000000000000000..24b36c9daf922a26fc1515e5dcbebc748221b787 GIT binary patch literal 56327 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 bv1&Uai_97hg==H1k`i$-0X6>v59T9DW8k4| literal 0 HcmV?d00001 diff --git a/app/music_on_hold/v_music_on_hold.php b/app/music_on_hold/v_music_on_hold.php new file mode 100644 index 0000000000..1b186c2f55 --- /dev/null +++ b/app/music_on_hold/v_music_on_hold.php @@ -0,0 +1,228 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('music_on_hold_view')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +require_once "includes/paging.php"; + +$dir_music_on_hold_8000 = $_SESSION['switch']['sounds']['dir'].'/music/8000'; +ini_set(max_execution_time,7200); + +$order_by = $_GET["order_by"]; +$order = $_GET["order"]; + +if ($_GET['a'] == "download") { + session_cache_limiter('public'); + if ($_GET['type'] = "moh") { + if (file_exists($dir_music_on_hold_8000."/".base64_decode($_GET['filename']))) { + $fd = fopen($dir_music_on_hold_8000."/".base64_decode($_GET['filename']), "rb"); + if ($_GET['t'] == "bin") { + header("Content-Type: application/force-download"); + header("Content-Type: application/octet-stream"); + header("Content-Type: application/download"); + header("Content-Description: File Transfer"); + header('Content-Disposition: attachment; filename="'.base64_decode($_GET['filename']).'"'); + } + else { + $file_ext = substr(base64_decode($_GET['filename']), -3); + if ($file_ext == "wav") { + header("Content-Type: audio/x-wav"); + } + if ($file_ext == "mp3") { + header("Content-Type: audio/mp3"); + } + } + header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1 + header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date in the past + header("Content-Length: " . filesize($dir_music_on_hold_8000."/".base64_decode($_GET['filename']))); + fpassthru($fd); + } + } + exit; +} + + +if (($_POST['submit'] == "Upload") && is_uploaded_file($_FILES['ulfile']['tmp_name'])) { + if ($_POST['type'] == 'moh' && permission_exists('music_on_hold_add')) { + move_uploaded_file($_FILES['ulfile']['tmp_name'], $dir_music_on_hold_8000."/".$_FILES['ulfile']['name']); + $savemsg = "Uploaded file to ".$dir_music_on_hold_8000."/".htmlentities($_FILES['ulfile']['name']); + //system('chmod -R 744 $dir_music_on_hold_8000*'); + unset($_POST['txtCommand']); + } +} + + +if ($_GET['act'] == "del" && permission_exists('music_on_hold_delete')) { + if ($_GET['type'] == 'moh') { + unlink($dir_music_on_hold_8000."/".base64_decode($_GET['filename'])); + header("Location: v_music_on_hold.php"); + exit; + } +} + +//include the header + require_once "includes/header.php"; + +//begin the content + echo ""; + + echo "
"; + echo "\n"; + echo "\n"; + echo ""; + echo ""; + echo "
\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "
\n"; + echo "

\n"; + echo " Music on Hold
\n"; + echo " Music on hold can be in WAV or MP3 format. To play an MP3 file you must have\n"; + echo " mod_shout enabled on the 'Modules' tab. You can adjust the volume of the MP3\n"; + echo " audio from the 'Settings' tab. For best performance upload 16bit 8khz/16khz Mono WAV files.\n"; + echo "

\n"; + echo "
\n"; + echo "\n"; + echo "
\n"; + echo "\n"; + if (permission_exists('music_on_hold_add')) { + echo "
\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "
"; + + if ($v_path_show) { + echo "location: "; + echo $dir_music_on_hold_8000; + } + + echo " \n"; + echo " \n"; + echo " \n"; + echo " File to upload:\n"; + echo " \n"; + echo " \n"; + echo "
\n"; + echo "
\n"; + echo "\n"; + echo "\n"; + } + + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " "; + + $c = 0; + $row_style["0"] = "row_style0"; + $row_style["1"] = "row_style1"; + + if ($handle = opendir($dir_music_on_hold_8000)) { + while (false !== ($file = readdir($handle))) { + if ($file != "." && $file != ".." && is_file($dir_music_on_hold_8000."/".$file)) { + + $tmp_filesize = filesize($dir_music_on_hold_8000."/".$file); + $tmp_filesize = byte_convert($tmp_filesize); + + echo "\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "\n"; + if ($c==0) { $c=1; } else { $c=0; } + + } + } + closedir($handle); + } + + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "
File Name (download)Name (play)Last ModifiedSize 
\n"; + echo " \n"; + echo " $file"; + echo " "; + echo " \n"; + echo " \n"; + $tmp_file_array = explode("\.",$file); + echo " ".$tmp_file_array[0]; + echo " "; + echo " \n"; + echo date ("F d Y H:i:s", filemtime($dir_music_on_hold_8000."/".$file)); + echo " \n"; + echo " ".$tmp_filesize; + echo " \n"; + echo " \n"; + echo " \n"; + //echo " \n"; + if (permission_exists('music_on_hold_delete')) { + echo " \n"; + } + echo " \n"; + echo "
$v_link_label_delete
\n"; + echo "
\n"; + + echo "\n"; + echo "
\n"; + echo "
\n"; + echo "
\n"; + echo "
\n"; + + echo "
"; + echo "
"; + echo "

"; + +//include the footer + require_once "includes/footer.php"; + +?> \ No newline at end of file diff --git a/app/music_on_hold/v_music_on_hold_play.php b/app/music_on_hold/v_music_on_hold_play.php new file mode 100644 index 0000000000..9993a9d537 --- /dev/null +++ b/app/music_on_hold/v_music_on_hold_play.php @@ -0,0 +1,78 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ + +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('music_on_hold_view')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +$filename = base64_decode($_GET['filename']); +$type = $_GET['type']; //moh //rec + +?> + + + + + + + + + + + + +
+ file: +
+ "; + echo ""; + + echo "\n"; + + } + if ($file_ext == "mp3") { + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + } + ?> +
+ + + diff --git a/app/php_edit/app_config.php b/app/php_edit/app_config.php new file mode 100644 index 0000000000..9b1681973f --- /dev/null +++ b/app/php_edit/app_config.php @@ -0,0 +1,61 @@ + \ No newline at end of file diff --git a/app/php_edit/app_defaults.php b/app/php_edit/app_defaults.php new file mode 100644 index 0000000000..0fac72d90f --- /dev/null +++ b/app/php_edit/app_defaults.php @@ -0,0 +1,66 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ + +//if the number of rows is 0 then add example clips + $sql = "select count(*) as num_rows from v_clips "; + $prep_statement = $db->prepare(check_sql($sql)); + if ($prep_statement) { + $prep_statement->execute(); + $row = $prep_statement->fetch(PDO::FETCH_ASSOC); + if ($row['num_rows'] == 0) { + $clip_name = "\$_POST"; + $clip_folder = "PHP"; + $clip_text_start = "\$zzz = \$_POST[\""; + $clip_text_end = "\"];"; + $clip_desc = "Set HTTP POST value as a PHP variable."; + $clip_order = 0; + + $sql = "insert into v_clips "; + $sql .= "("; + $sql .= "clip_uuid, "; + $sql .= "clip_name, "; + $sql .= "clip_folder, "; + $sql .= "clip_text_start, "; + $sql .= "clip_text_end, "; + $sql .= "clip_desc, "; + $sql .= "clip_order "; + $sql .= ")"; + $sql .= "values "; + $sql .= "("; + $sql .= "'".uuid()."', "; + $sql .= "'$clip_name', "; + $sql .= "'$clip_folder', "; + $sql .= "'$clip_text_start', "; + $sql .= "'$clip_text_end', "; + $sql .= "'$clip_desc', "; + $sql .= "'$clip_order' "; + $sql .= ")"; + $db->exec(check_sql($sql)); + unset($sql); + } + } + +?> \ No newline at end of file diff --git a/app/php_edit/clipadd.php b/app/php_edit/clipadd.php new file mode 100644 index 0000000000..f060f81805 --- /dev/null +++ b/app/php_edit/clipadd.php @@ -0,0 +1,126 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('php_editor_save')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +if (count($_POST)>0) { + $clip_name = check_str($_POST["clip_name"]); + $clip_folder = check_str($_POST["clip_folder"]); + $clip_text_start = check_str($_POST["clip_text_start"]); + $clip_text_end = check_str($_POST["clip_text_end"]); + $clip_desc = check_str($_POST["clip_desc"]); + $clip_order = check_str($_POST["clip_order"]); + if (strlen($clip_order) == 0) { $clip_order = 0; } + + $sql = "insert into v_clips "; + $sql .= "("; + $sql .= "clip_uuid, "; + $sql .= "clip_name, "; + $sql .= "clip_folder, "; + $sql .= "clip_text_start, "; + $sql .= "clip_text_end, "; + $sql .= "clip_desc, "; + $sql .= "clip_order "; + $sql .= ")"; + $sql .= "values "; + $sql .= "("; + $sql .= "'".uuid()."', "; + $sql .= "'$clip_name', "; + $sql .= "'$clip_folder', "; + $sql .= "'$clip_text_start', "; + $sql .= "'$clip_text_end', "; + $sql .= "'$clip_desc', "; + $sql .= "'$clip_order' "; + $sql .= ")"; + $db->exec(check_sql($sql)); + unset($sql,$db); + + require_once "header.php"; + echo "\n"; + echo "Add Complete"; + require_once "footer.php"; + return; +} + +//show the content + require_once "header.php"; + echo "
"; + echo "\n"; + echo "\n"; + echo " "; + echo " "; + echo "
\n"; + + //echo "Clip Library"; + //echo "
"; + echo "
"; + echo ""; + echo " "; + echo " "; + echo " "; + echo " "; + + echo " "; + echo " "; + echo " "; + echo " "; + + echo " "; + echo " "; + echo " "; + + echo " "; + echo " "; + echo " "; + + echo " "; + echo " "; + echo " "; + + echo " "; + echo " "; + echo "
Name:
Folder:
Before Selection:
"; + echo " "; + echo "
After Selection:
"; + echo " "; + echo "
Notes:
"; + echo " "; + echo "
"; + echo "
"; + + echo "
"; + echo "
"; + + require_once "footer.php"; +?> \ No newline at end of file diff --git a/app/php_edit/clipdelete.php b/app/php_edit/clipdelete.php new file mode 100644 index 0000000000..2cb82b9666 --- /dev/null +++ b/app/php_edit/clipdelete.php @@ -0,0 +1,56 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('php_editor_save')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +//get the uuid from http values + $clip_uuid = check_str($_GET["id"]); + +//delete the clip + if (strlen($_GET["id"])>0) { + $sql = "delete from v_clips "; + $sql .= "where clip_uuid = '".$clip_uuid."' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + unset($sql,$db); + } + +//redirect the browser + require_once "header.php"; + echo "\n"; + echo "Delete Complete"; + require_once "footer.php"; + return; + +?> \ No newline at end of file diff --git a/app/php_edit/cliplist.php b/app/php_edit/cliplist.php new file mode 100644 index 0000000000..39db5bcf52 --- /dev/null +++ b/app/php_edit/cliplist.php @@ -0,0 +1,235 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +require_once "includes/checkauth.php"; +if (permission_exists('php_editor_view')) { + //access granted +} +else { + echo "access denied"; + exit; +} +//require_once "edit/header.php"; + +echo ""; +echo ""; +echo ""; + +function isfile($filename) { + if (@filesize($filename) > 0) { return true; } else { return false; } +} + +function space($count) { + $r=''; $i=0; + while($i < $count) { + $r .= ' '; + $i++; + } + return $r; +} + +echo ""; + +echo ""; + +echo ""; +echo ""; +echo "
"; +echo "\n"; +echo "\n"; +echo "
\n"; +echo "
Clip Library
\n"; //display:none + +$sql = "select * from v_clips "; +$sql .= "order by clip_folder "; +$prep_statement = $db->prepare(check_sql($sql)); +$prep_statement->execute(); +$result = $prep_statement->fetchAll(PDO::FETCH_NAMED); +$result_count = count($result); + +if ($result_count > 0) { //no results + $last_folder = ''; + $tag_open = ''; + $x = 0; + $current_depth = 0; + $previous_depth = 0; + foreach($result as $row) { + $current_depth = count(explode ("/", $row['clip_folder'])); + if ($current_depth < $previous_depth) { + $count = ($previous_depth - $current_depth); + $i=0; + while($i < $count){ + echo "
\n"; + $i++; + } + echo "
\n"; + } + + if ($last_folder != $row['clip_folder']) { + $clip_folder_name = str_replace ($previous_folder_name, "", $row['clip_folder']); + $clip_folder_name = str_replace ("/", "", $clip_folder_name); + echo "
 ".$clip_folder_name."  
\n\n"; + $tag_open = 1; + } + + $previous_depth = $current_depth; + $previous_folder_name = $row['clip_folder']; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "
\n"; + echo "".$row['clip_name']."\n"; + echo "
\n"; + echo "\n\n"; + + $last_folder = $row['clip_folder']; + + if ($c==0) { $c=1; } else { $c=0; } + } //end foreach + unset($sql, $result, $row_count); + +} //end if results + +echo "\n"; +echo "
\n"; + +echo "
\n"; +echo "
"; + +echo "

"; +//require_once "includes/footer.php"; + +unset ($result_count); +unset ($result); +unset ($key); +unset ($val); +unset ($c); + +echo ""; +echo ""; + +?> \ No newline at end of file diff --git a/app/php_edit/clipoptions.php b/app/php_edit/clipoptions.php new file mode 100644 index 0000000000..b137b3b280 --- /dev/null +++ b/app/php_edit/clipoptions.php @@ -0,0 +1,71 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('php_editor_view')) { + //access granted +} +else { + echo "access denied"; + exit; +} +require_once "header.php"; + +echo "
"; +echo "\n"; +echo ""; +echo "\n"; +echo ""; +echo "\n"; +echo "\n"; +echo "\n"; +echo "\n"; +echo "
Selected Clip:
"; +echo " "; +echo ""; + +echo " "; +//echo " \n"; +//echo " \n"; +//echo " \n"; + +echo " \n"; +echo " \n"; +//echo " \n"; +echo " \n"; +echo " \n"; + +echo " \n"; +echo "
Options











"; + +echo "
"; +echo "
"; + +require_once "footer.php"; +?> \ No newline at end of file diff --git a/app/php_edit/clipoptionslist.php b/app/php_edit/clipoptionslist.php new file mode 100644 index 0000000000..ba406f8114 --- /dev/null +++ b/app/php_edit/clipoptionslist.php @@ -0,0 +1,228 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('php_editor_view')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +echo ""; +echo ""; + +echo ""; + +function isfile($filename) { + if (@filesize($filename) > 0) { return true; } else { return false; } +} + +function space($count) { + $r=''; $i=0; + while($i < $count) { + $r .= ' '; + $i++; + } + return $r; +} + +//show the content + echo ""; + + echo ""; + +echo ""; +echo ""; + + echo "
"; + echo "\n"; + + echo "\n"; + echo "
\n"; + echo "
Clip Library
\n"; //display:none + + $sql = "select * from v_clips "; + $sql .= "order by clip_folder "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + $result_count = count($result); + + if ($result_count > 0) { //no results + $last_folder = ''; + $tag_open = ''; + $x = 0; + $current_depth = 0; + $previous_depth = 0; + foreach($result as $row) { + $current_depth = count(explode("/", $row[clip_folder])); + if ($current_depth < $previous_depth) { + $count = ($previous_depth - $current_depth); + $i=0; + while($i < $count){ + echo "
\n"; + $i++; + } + echo "
\n"; + + } + + if ($last_folder != $row['clip_folder']) { + $clip_folder_name = str_replace ($previous_folder_name, "", $row['clip_folder']); + $clip_folder_name = str_replace ("/", "", $clip_folder_name); + echo "
 ".$clip_folder_name."  
\n\n"; + $tag_open = 1; + } + + $previous_depth = $current_depth; + $previous_folder_name = $row['clip_folder']; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "
\n"; + echo "".$row['clip_name']."\n"; + + echo "
\n"; + echo "\n\n"; + + $last_folder = $row['clip_folder']; + if ($c==0) { $c=1; } else { $c=0; } + } //end foreach + unset($sql, $result, $row_count); + } //end if results + + echo "\n"; + echo "
\n"; + + echo "
\n"; + echo "
"; + + echo "

"; + + unset ($result_count); + unset ($result); + unset ($key); + unset ($val); + unset ($c); + + echo ""; + echo ""; + +?> \ No newline at end of file diff --git a/app/php_edit/clipsearch.php b/app/php_edit/clipsearch.php new file mode 100644 index 0000000000..5db024d25b --- /dev/null +++ b/app/php_edit/clipsearch.php @@ -0,0 +1,180 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/checkauth.php"; +if (permission_exists('php_editor_view')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +if (count($_POST)>0) { + $clip_uuid = $_POST["id"]; + $clip_name = $_POST["clip_name"]; + $clip_folder = $_POST["clip_folder"]; + $clip_text_start = $_POST["clip_text_start"]; + $clip_text_end = $_POST["clip_text_end"]; + $clip_desc = $_POST["clip_desc"]; + $clip_order = $_POST["clip_order"]; + + require_once "header.php"; + echo "
"; + echo "\n"; + echo "\n"; + echo " \n"; + echo "\n"; + + } //end if results + + echo "
\n"; + echo "
"; + + $sql .= "select * from v_clips "; + $sql .= "where "; + if (strlen($clip_uuid) > 0) { $sql .= "and id = '$clip_uuid' "; } + if (strlen($clip_name) > 0) { $sql .= "and clip_name like '%$clip_name%' "; } + if (strlen($clip_folder) > 0) { $sql .= "and clip_folder like '%$clip_folder%' "; } + if (strlen($clip_text_start) > 0) { $sql .= "and clip_text_start like '%$clip_text_start%' "; } + if (strlen($clip_text_end) > 0) { $sql .= "and clip_text_end like '%$clip_text_end%' "; } + if (strlen($clip_desc) > 0) { $sql .= "and clip_desc like '%$clip_desc%' "; } + if (strlen($clip_order) > 0) { $sql .= "and clip_order like '%$clip_order%' "; } + + $sql = trim($sql); + if (substr($sql, -5) == "where"){ $sql = substr($sql, 0, (strlen($sql)-5)); } + $sql = str_replace ("where and", "where", $sql); + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + $result_count = count($result); + + $c = 0; + $row_style["0"] = "background-color: #F5F5DC;"; + $row_style["1"] = "background-color: #FFFFFF;"; + + echo "
\n"; + echo "\n"; + echo ""; + + if ($result_count == 0) { + //no results + echo ""; + } + else { //received results + echo ""; + //echo ""; + echo ""; + //echo ""; + //echo ""; + //echo ""; + //echo ""; + //echo ""; + echo ""; + echo "\n"; + + foreach($result as $row) { + //print_r( $row ); + echo "\n"; + //echo ""; + echo ""; + //echo ""; + //echo ""; + //echo ""; + //echo ""; + //echo ""; + echo ""; + + echo "\n"; + if ($c==0) { $c=1; } else { $c=0; } + } //end foreach unset($sql, $result, $row_count); + echo "
 
    Id        clip_name Search         clip_folder        clip_text_start        clip_text_end        clip_desc        clip_order   
".$row[id]."".$row[clip_name]."".$row[clip_folder]."".$row[clip_text_start]."".$row[clip_text_end]."".$row[clip_desc]."".$row[clip_order]."
\n"; + echo "
\n"; + + echo "

"; + echo "
\n"; + echo "
"; + echo "

"; + require_once "footer.php"; + + unset ($result_count); + unset ($result); + unset ($key); + unset ($val); + unset ($c); + +} +else { + + //show the content + require_once "header.php"; + echo "
"; + echo "\n"; + echo "\n"; + echo " "; + echo " "; + echo "
\n"; + echo "
"; + + echo "
"; + echo ""; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + echo " "; + echo " "; + echo " "; + echo "
Name:
Folder:
Start:
End:
Desc:
clip_order:
"; + echo "
"; + + echo "
"; + echo "
"; + + require_once "footer.php"; + +} //end if not post +?> diff --git a/app/php_edit/clipupdate.php b/app/php_edit/clipupdate.php new file mode 100644 index 0000000000..a93c10bdfe --- /dev/null +++ b/app/php_edit/clipupdate.php @@ -0,0 +1,138 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('php_editor_save')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +if (count($_POST)>0) { + $clip_uuid = check_str($_POST["id"]); + $clip_name = check_str($_POST["clip_name"]); + $clip_folder = check_str($_POST["clip_folder"]); + $clip_text_start = check_str($_POST["clip_text_start"]); + $clip_text_end = check_str($_POST["clip_text_end"]); + $clip_desc = check_str($_POST["clip_desc"]); + $clip_order = check_str($_POST["clip_order"]); + + //sql update + $sql = "update v_clips set "; + $sql .= "clip_name = '$clip_name', "; + $sql .= "clip_folder = '$clip_folder', "; + $sql .= "clip_text_start = '$clip_text_start', "; + $sql .= "clip_text_end = '$clip_text_end', "; + $sql .= "clip_desc = '$clip_desc', "; + $sql .= "clip_order = '$clip_order' "; + $sql .= "where clip_uuid = '$clip_uuid' "; + $count = $db->exec(check_sql($sql)); + //echo "affected rows: ".$count; + + //redirect the browser + require_once "header.php"; + echo "\n"; + echo "Update Complete"; + require_once "footer.php"; + return; +} +else { + //get the uuid from http values + $clip_uuid = check_str($_GET["id"]); + + //get the clip + $sql = "select * from v_clips "; + $sql .= "where clip_uuid = '$clip_uuid' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach ($result as &$row) { + $clip_name = $row["clip_name"]; + $clip_folder = $row["clip_folder"]; + $clip_text_start = $row["clip_text_start"]; + $clip_text_end = $row["clip_text_end"]; + $clip_desc = $row["clip_desc"]; + $clip_order = $row["clip_order"]; + break; //limit to 1 row + } +} + +//show the content + require_once "header.php"; + echo "
"; + echo "\n"; + echo "\n"; + echo " "; + echo " "; + echo "
\n"; + + echo "
"; + echo ""; + echo " "; + echo " "; + echo " "; + echo " "; + + echo " "; + echo " "; + echo " "; + echo " "; + + echo " "; + echo " "; + echo " "; + + echo " "; + echo " "; + echo " "; + + echo " "; + echo " "; + echo " "; + + echo " "; + echo " "; + echo " "; + echo "
Name:
Folder:
Before Selection:
"; + echo " "; + echo "
After Selection:
"; + echo " "; + echo "
Notes:
"; + echo " "; + echo "
"; + echo " "; + echo " "; + echo "
"; + echo "
"; + + echo "
"; + echo "
"; + + require_once "footer.php"; +?> \ No newline at end of file diff --git a/app/php_edit/filedelete.php b/app/php_edit/filedelete.php new file mode 100644 index 0000000000..3808663da2 --- /dev/null +++ b/app/php_edit/filedelete.php @@ -0,0 +1,84 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('php_editor_save')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +$folder = $_GET["folder"]; +$folder = str_replace ("\\", "/", $folder); +if (substr($folder, -1) != "/") { $folder = $folder.'/'; } +$file = $_GET["file"]; + +if (strlen($folder) > 0 && strlen($file) > 0) { + unlink($folder.$file); + header("Location: fileoptions.php"); +} +else { + //display form + require_once "header.php"; + echo "
"; + echo "
"; + echo "
"; + echo ""; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo "
Path:
".$folder.$file."
"; + + echo "
"; + + echo ""; + echo " "; + echo " "; + echo " "; + + echo " "; + echo " "; + echo " "; + + echo " "; + echo " "; + echo " "; + echo "
File Name:
"; + echo " "; + echo " "; + echo "
"; + echo "
"; + echo "
"; + + require_once "footer.php"; +} +?> diff --git a/app/php_edit/filelist.php b/app/php_edit/filelist.php new file mode 100644 index 0000000000..cec466e2cb --- /dev/null +++ b/app/php_edit/filelist.php @@ -0,0 +1,287 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('php_editor_view')) { + //access granted +} +else { + echo "access denied"; + exit; +} +require_once "header.php"; + +function isfile($filename) { + //if (@filesize($filename) > 0) { return true; } else { return false; } +} + +function space($count) { + $r=''; $i=0; + while($i < $count) { + $r .= ' '; + $i++; + } + return $r; +} + +function recur_dir($dir) { + clearstatcache(); + $htmldirlist = ''; + $htmlfilelist = ''; + $dirlist = opendir($dir); + $dir_array = array(); + while (false !== ($file = readdir($dirlist))) { + if ($file != "." AND $file != ".."){ + $newpath = $dir.'/'.$file; + $level = explode('/',$newpath); + if (substr($newpath, -4) == ".svn") { + //ignore .svn dir and subdir + } + elseif (substr($newpath, -3) == ".db") { + //ignore .db files + } + else { + $dir_array[] = $newpath; + } + if ($x > 1000) { break; }; + $x++; + } + } + + asort($dir_array); + foreach ($dir_array as $newpath){ + $level = explode('/',$newpath); + + if (is_dir($newpath)) { + /*$mod_array[] = array( + 'level'=>count($level)-1, + 'path'=>$newpath, + 'name'=>end($level), + 'type'=>'dir', + 'mod_time'=>filemtime($newpath), + 'size'=>''); + $mod_array[] = recur_dir($newpath); + */ + $dirname = end($level); + $htmldirlist .= space(count($level))."
$dirname
\n"; + //$htmldirlist .= space(count($level))."
Tools
\n"; + //$htmldirlist .= space(count($level))."
New Folder
\n"; //parent.document.getElementById('file').value='".urlencode($newpath)."' + //$htmldirlist .= space(count($level))."
\n"; + //$htmldirlist .= space(count($level))."
New File
\n"; //parent.document.getElementById('file').value='".urlencode($newpath)."' + //$htmldirlist .= space(count($level))."
\n"; + //$htmldirlist .= space(count($level))."
\n"; + //$htmldirlist .= space(count($level))."
Options
\n"; //parent.document.getElementById('file').value='".urlencode($newpath)."' + //$htmldirlist .= space(count($level))."
\n"; + $htmldirlist .= recur_dir($newpath); + $htmldirlist .= space(count($level))."
\n"; + } + else { + /*$mod_array[] = array( + 'level'=>count($level)-1, + 'path'=>$newpath, + 'name'=>end($level), + 'type'=>'file', + 'mod_time'=>filemtime($newpath), + 'size'=>filesize($newpath)); + */ + $filename = end($level); + $filesize = round(filesize($newpath)/1024, 2); + $htmlfilelist .= space(count($level))."
$filename
\n"; + $htmlfilelist .= space(count($level))."
\n"; + } + } + closedir($dirlist); + return $htmldirlist ."\n". $htmlfilelist; +} + +echo ""; + + +echo ""; + +echo "
"; +echo "\n"; +echo "\n"; +echo " \n"; + echo "\n"; + echo "
\n"; +//echo "
"; + +echo "\n"; +echo " \n"; +echo "\n"; +echo "
Files
\n"; //display:none +//echo "
Files
\n"; //display:none + +//echo "
Tools
\n"; +//echo "
New Folder
\n"; //parent.document.getElementById('file').value='".urlencode($newpath)."' +//echo "
\n"; +//echo "
New File
\n"; //parent.document.getElementById('file').value='".urlencode($newpath)."' +//echo "
\n"; +//echo "
\n"; + +echo recur_dir($_SERVER["DOCUMENT_ROOT"]); + +echo "
\n"; + +/* +echo "
Files
\n"; +echo "\n"; +echo "
Folder 1
\n"; +echo "\n"; +echo "
demo1.php
\n"; +echo "
\n"; +echo "\n"; +echo "
demo2.php
\n"; +echo "
\n"; +echo "\n"; +echo "
\n"; +echo "\n"; +echo "
Folder 2
\n"; +echo "\n"; +echo "
demo3.php
\n"; +echo "
\n"; +echo "\n"; +echo "
demo4.php
\n"; +echo "
\n"; +echo "\n"; +echo "
\n"; +echo "\n"; +echo "
\n"; +*/ + +echo "
\n"; +echo ""; + +echo "

"; +require_once "footer.php"; + +unset ($result_count); +unset ($result); +unset ($key); +unset ($val); +unset ($c); + +echo ""; +echo ""; + +?> diff --git a/app/php_edit/filenew.php b/app/php_edit/filenew.php new file mode 100644 index 0000000000..1c17d5d164 --- /dev/null +++ b/app/php_edit/filenew.php @@ -0,0 +1,88 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('php_editor_save')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +$folder = $_GET["folder"]; +$folder = str_replace ("\\", "/", $folder); +if (substr($folder, -1) != "/") { $folder = $folder.'/'; } +$file = $_GET["file"]; + +if (strlen($folder) > 0 && strlen($file) > 0) { + //create new file + $handle = fopen($folder.$file, 'wb') or die("Error!!"); + $content = ""; + fwrite($handle, $content); + fclose($handle); + header("Location: fileoptions.php"); +} +else { + require_once "header.php"; + echo "
"; + echo "
"; + echo "
"; + echo ""; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo "
Path:
".$folder.$file."
"; + + echo "
"; + + echo ""; + echo " "; + echo " "; + echo " "; + + echo " "; + echo " "; + echo " "; + + echo " "; + echo " "; + echo " "; + echo "
File Name:
"; + echo " "; + echo " "; + echo "
"; + echo "
"; + echo "
"; + + require_once "footer.php"; +} + +?> diff --git a/app/php_edit/fileoptions.php b/app/php_edit/fileoptions.php new file mode 100644 index 0000000000..1c3adc1459 --- /dev/null +++ b/app/php_edit/fileoptions.php @@ -0,0 +1,85 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('php_editor_view')) { + //access granted +} +else { + echo "access denied"; + exit; +} +require_once "header.php"; + +$file = $_GET["file"]; +$file = str_replace ("\\", "/", $file); +$folder = $_GET["folder"]; +$folder = str_replace ($file, "", $folder); +$urlpath = str_replace ($_SERVER["DOCUMENT_ROOT"], "", $folder); + +echo "
"; +echo "\n"; +echo ""; +echo "\n"; +echo "\n"; + +echo "\n"; +echo "\n"; +echo "\n"; +echo "\n"; +echo "
"; + +echo ""; +echo ""; +echo "\n"; +echo "\n"; +echo ""; +echo "
Path:
File:
"; + +echo "
"; +echo " "; +echo ""; + +echo "
"; +echo ""; +echo " \n"; +echo " \n"; +echo " \n"; +echo " \n"; +echo " \n"; +echo " \n"; +echo " \n"; +echo "





"; +echo "
"; + +echo "
"; +echo "
"; + +require_once "footer.php"; +?> diff --git a/app/php_edit/fileoptionslist.php b/app/php_edit/fileoptionslist.php new file mode 100644 index 0000000000..87197513ba --- /dev/null +++ b/app/php_edit/fileoptionslist.php @@ -0,0 +1,270 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('php_editor_view')) { + //access granted +} +else { + echo "access denied"; + exit; +} +require_once "header.php"; + +function isfile($filename) { + if (@filesize($filename) > 0) { return true; } else { return false; } +} + +function space($count) { + $r=''; $i=0; + while($i < $count) { + $r .= ' '; + $i++; + } + return $r; +} + +function recur_dir($dir) { + clearstatcache(); + $htmldirlist = ''; + $htmlfilelist = ''; + $dirlist = opendir($dir); + while ($file = readdir ($dirlist)) { + if ($file != '.' && $file != '..') { + $newpath = $dir.'/'.$file; + $level = explode('/',$newpath); + + if (is_dir($newpath)) { + /*$mod_array[] = array( + 'level'=>count($level)-1, + 'path'=>$newpath, + 'name'=>end($level), + 'type'=>'dir', + 'mod_time'=>filemtime($newpath), + 'size'=>''); + $mod_array[] = recur_dir($newpath); + */ + $dirname = end($level); + $htmldirlist .= space(count($level))."
$dirname
\n"; + //$htmldirlist .= space(count($level))."
Tools
\n"; + //$htmldirlist .= space(count($level))."
New Folder
\n"; //parent.document.getElementById('file').value='".urlencode($newpath)."' + //$htmldirlist .= space(count($level))."
\n"; + //$htmldirlist .= space(count($level))."
New File
\n"; //parent.document.getElementById('file').value='".urlencode($newpath)."' + //$htmldirlist .= space(count($level))."
\n"; + //$htmldirlist .= space(count($level))."
\n"; + //$htmldirlist .= space(count($level))."
Options
\n"; //parent.document.getElementById('file').value='".urlencode($newpath)."' + //$htmldirlist .= space(count($level))."
\n"; + $htmldirlist .= recur_dir($newpath); + $htmldirlist .= space(count($level))."
\n"; + } + else { + /*$mod_array[] = array( + 'level'=>count($level)-1, + 'path'=>$newpath, + 'name'=>end($level), + 'type'=>'file', + 'mod_time'=>filemtime($newpath), + 'size'=>filesize($newpath)); + */ + $filename = end($level); + $filesize = round(filesize($newpath)/1024, 2); + $newpath = str_replace ($filename, "", $newpath); + $htmlfilelist .= space(count($level))."
$filename
\n"; + $htmlfilelist .= space(count($level))."
\n"; + } + } + } + + closedir($dirlist); + return $htmldirlist ."\n". $htmlfilelist; +} + +echo "\n"; + +echo "\n"; + +echo "
"; +echo "\n"; + +echo "\n"; +echo "
\n"; +echo "\n"; +echo " \n"; +echo "\n"; +echo "
Files
\n"; //display:none +//echo "
Files
\n"; //display:none + +//echo "
Tools
\n"; +//echo "
New Folder
\n"; //parent.document.getElementById('file').value='".urlencode($newpath)."' +//echo "
\n"; +//echo "
New File
\n"; //parent.document.getElementById('file').value='".urlencode($newpath)."' +//echo "
\n"; +//echo "
\n"; +echo recur_dir($_SERVER["DOCUMENT_ROOT"]); + +echo "
\n"; + +/* +echo "
Files
\n"; +echo "\n"; +echo "
Folder 1
\n"; +echo "\n"; +echo "
demo1.php
\n"; +echo "
\n"; +echo "\n"; +echo "
demo2.php
\n"; +echo "
\n"; +echo "\n"; +echo "
\n"; +echo "\n"; +echo "
Folder 2
\n"; +echo "\n"; +echo "
demo3.php
\n"; +echo "
\n"; +echo "\n"; +echo "
demo4.php
\n"; +echo "
\n"; +echo "\n"; +echo "
\n"; +echo "\n"; +echo "
\n"; +*/ + +echo "
\n"; +echo ""; + +echo "

"; +require_once "footer.php"; + +unset ($result_count); +unset ($result); +unset ($key); +unset ($val); +unset ($c); + +echo ""; +echo ""; + +?> \ No newline at end of file diff --git a/app/php_edit/fileread.php b/app/php_edit/fileread.php new file mode 100644 index 0000000000..463f9d2dc1 --- /dev/null +++ b/app/php_edit/fileread.php @@ -0,0 +1,49 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('php_editor_view')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +$filename = $_POST["file"]; +$filename = str_replace ("\\", "/", $filename); + +$handle = fopen($filename, "r"); +if ($handle) { + while (!feof($handle)) { + $buffer = fgets($handle, 4096); + echo $buffer; + } + fclose($handle); +} + +?> \ No newline at end of file diff --git a/app/php_edit/filerename.php b/app/php_edit/filerename.php new file mode 100644 index 0000000000..a27aa6e2b2 --- /dev/null +++ b/app/php_edit/filerename.php @@ -0,0 +1,102 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('php_editor_save')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +$folder = $_GET["folder"]; +//$folder = str_replace ("\\", "/", $folder); +//if (substr($folder, -1) != "/") { $folder = $folder.'/'; } +$newfilename = $_GET["newfilename"]; +$filename = $_GET["filename"]; +//echo $folder.$file; + + +if (strlen($folder) > 0 && strlen($newfilename) > 0) { + //echo "new file: ".$newfilename."
"; + //echo "folder: ".$folder."
"; + //echo "orig filename: ".$filename."
";; + rename($folder.$filename, $folder.$newfilename); + header("Location: fileoptions.php"); +} +else { //display form + + require_once "header.php"; + echo "
"; + echo "
"; + echo "
"; + echo ""; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo "
Path:
".$folder.$filename."

Original file name:
".$filename."
"; + + echo "
"; + + echo ""; + echo " "; + echo " "; + echo " "; + + echo " "; + echo " "; + echo " "; + + echo " "; + echo " "; + echo " "; + echo "
Rename file to:
"; + echo " "; + echo " "; + echo " "; + echo "
"; + echo "
"; + echo "
"; + + require_once "footer.php"; + +} + +?> \ No newline at end of file diff --git a/app/php_edit/filesave.php b/app/php_edit/filesave.php new file mode 100644 index 0000000000..51a650fb42 --- /dev/null +++ b/app/php_edit/filesave.php @@ -0,0 +1,50 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('php_editor_save')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +$filename = $_POST["file"]; //filename with the path +$filename = str_replace ("\\", "/", $filename); +$content = $_POST["content"]; + +$handle = fopen($filename, 'wb') or die("Error!!"); +fwrite($handle, $content); +fclose($handle); + +//set the reload_xml value to true + $_SESSION["reload_xml"] = true; + +echo $content; + +?> diff --git a/app/php_edit/folderdelete.php b/app/php_edit/folderdelete.php new file mode 100644 index 0000000000..67e1e7f1ec --- /dev/null +++ b/app/php_edit/folderdelete.php @@ -0,0 +1,46 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('php_editor_save')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +$folder = $_GET["folder"]; +$folder = str_replace ("\\", "/", $folder); + +if (strlen($folder) > 0) { + //delete the folder + rmdir($folder); //, 0700 + header("Location: fileoptions.php"); +} + +?> \ No newline at end of file diff --git a/app/php_edit/foldernew.php b/app/php_edit/foldernew.php new file mode 100644 index 0000000000..5328bd23c6 --- /dev/null +++ b/app/php_edit/foldernew.php @@ -0,0 +1,83 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('php_editor_save')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +$folder = $_GET["folder"]; +$folder = str_replace ("\\", "/", $folder); +$foldername = $_GET["foldername"]; + +if (strlen($folder) > 0 && strlen($foldername) > 0) { + //create new folder + mkdir($folder.'/'.$foldername); //, 0700 + header("Location: fileoptions.php"); +} +else { //display form + require_once "header.php"; + echo "
"; + echo "
"; + echo "
"; + echo ""; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo "
Path:
".$folder."
"; + + echo "
"; + + echo ""; + echo " "; + echo " "; + echo " "; + + echo " "; + echo " "; + echo " "; + + echo " "; + echo " "; + echo " "; + echo "
Folder Name:
"; + echo " "; + echo " "; + echo "
"; + echo "
"; + echo "
"; + + require_once "footer.php"; +} +?> diff --git a/app/php_edit/footer.php b/app/php_edit/footer.php new file mode 100644 index 0000000000..3e7b9037ab --- /dev/null +++ b/app/php_edit/footer.php @@ -0,0 +1,43 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +/* +echo "

"; +echo "
"; + +echo ""; +echo "fusionpbx "; +echo "        "; +echo "http://fusionpbx.com"; +echo "        "; +echo "Author: Mark J. Crane "; + +echo ""; +*/ +echo "
"; +echo ""; +echo ""; + +?> diff --git a/app/php_edit/header.php b/app/php_edit/header.php new file mode 100644 index 0000000000..b07b45c390 --- /dev/null +++ b/app/php_edit/header.php @@ -0,0 +1,83 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ + +echo ""; +echo ""; +echo ""; +//echo ""; +echo ""; + + +echo ""; +echo ""; +echo ""; +echo "
"; + +?> diff --git a/app/php_edit/images/Thumbs.db b/app/php_edit/images/Thumbs.db new file mode 100644 index 0000000000000000000000000000000000000000..46593a8c2e513a420f7803451a0bd7d6795fb2c2 GIT binary patch literal 20992 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 literal 0 HcmV?d00001 diff --git a/app/php_edit/images/file.png b/app/php_edit/images/file.png new file mode 100644 index 0000000000000000000000000000000000000000..33b5f5f37461bbc6045d4cef96ba2125c4e9b256 GIT binary patch literal 434 zcmV;j0ZsmiP)uaf2v`Q{?Wj` zolMeZbD4;Gy{&Gi?KsW?6A=+P>>rC&Ve~E{qfvNqd3|^Pkfv!4vHfruMrKEGOhj6{ zn_bUwmWIQdEXxds>m6(DZmh382QNVo6a+P$Ywe0qk|c$u$H}zBJ2^ckA^;3LKKZ*l z+XX@VQ5JOCErwY*ySgpM8jjO~jnx&U*c5>2SLGkxECHC6Vpc|?m|>$c!E5q4r=u}r zE2R`O04&g4@I8-NF$0|2VP+ex`~v`h82}qY)s(ryH%a1`;Ul8G{e!$y4XKR!PG|DpT-{reY}_-t#}`2YX^``4}iKh2doeVSihwfuk8^5y;O**UyG^BIO3Q2fclD#GBxpaXI^C{7sImo>OF zHMg|3wRd#3DhUeev+}5P2+FHWljakc)G8>WAthy_VybSmj8oQ3Mo>X_ovxa}v}q#F z!pwq<3QYEz`}Rq&8HtN4YqDGDZ9c6c#_c4hsU_&J;Mz4SULgki%jQzL){h=D8sEOF zX|C&N_4XadGX^6qHdQP3A3r6vO@wql8+oM!IBrPjWBVJ?B2l=o-C15hyJE%(B{oJr Sel>v`CpJEIV{K$$um%8JN5t*` literal 0 HcmV?d00001 diff --git a/app/php_edit/images/gear.png b/app/php_edit/images/gear.png new file mode 100644 index 0000000000000000000000000000000000000000..1adf1e778f6316dd9c926465783631b6222f9bc6 GIT binary patch literal 822 zcmV-61Ihe}P)eo} zK~#9!)so9=6j>O>&#kJis;+*et4$>x6Dtvwi6-j82co!91Q*$)vk`ftifVKj7JYhr@yM@dJK) zv0se~7yeYbw|1p;L$^w$(!8o_a9!7qIj@hr8(HeV_?KLr*H$08VKBFST}Ml?<& z2ZE*gIRf$4wXGMUC>pBPs<#q)Vw^{u{`V?`*6Mhs{v77x=(lo(?yozAr1zyF}u_x-oS z!$adYu3wWH0PNep-)eN6BW}BUCTS*N8fFU*IpR1b0+_0*OxKOJjT<(dT@FJSoGXW2BC+Oau#;gW$(}rOcxczVAPonw+WufC>Pf=ZS1K_wD=l z`S*UM^2uplyVB^xn;&Len@O6Cbt`LH6+_d>5=dqefrRVz2pLI4W)`pa1{>07*qoM6N<$f$y4XKR!PG|DpT-{reY}_-t#}`2YX^``4}iKh2doeVSihwfuk8^5y;O**UyG^BIO3Q2fclD#GBxpaXI^C{7sImo>OF zHMg|3wRd#3DhUeev+}5P2+FHWljakc)G8>WAthy_VybSmj8oQ3Mo>X_ovxa}v}q#F z!pwq<3QYEz`}Rq&8HtN4YqDGDZ9c6c#_c4hsU_&J;Mz4SULgki%jQzL){h=D8sEOF zX|C&N_4XadGX^6qHdQP3A3r6vO@wql8+oM!IBrPjWBVJ?B2l=o-C15hyJE%(B{oJr Sel>v`CpJEIV{K$$um%8JN5t*` literal 0 HcmV?d00001 diff --git a/app/php_edit/images/minus.gif b/app/php_edit/images/minus.gif new file mode 100644 index 0000000000000000000000000000000000000000..1094ab912b8bb9b8e457364e0a200b2364ab03fb GIT binary patch literal 124 zcmV-?0E7QWNk%w1VF>^U0J8u9!nvt_oVfS)^njkZ?Ca(K|Nqa(yZ!z9+SSVd008mv z?6}C+OEI5}ij{m|i2qdX6 eqL8fXBPt3ZGliKs5{uIv@gM1_O&;L91u8iN$P#Df)7TJT8#}oW??~ hx9yTADX<=5Q2xxo`aq_+!TExQ8Ot=TR6#}tYXC82HyZ!| literal 0 HcmV?d00001 diff --git a/app/php_edit/images/program.gif b/app/php_edit/images/program.gif new file mode 100644 index 0000000000000000000000000000000000000000..dc3dfa11044671bd33ce9778d7a10254fe748f00 GIT binary patch literal 61 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 literal 0 HcmV?d00001 diff --git a/app/php_edit/images/thumbnails/cliplibrary.png b/app/php_edit/images/thumbnails/cliplibrary.png new file mode 100644 index 0000000000000000000000000000000000000000..bc70f332fd4c8d15111d9a5fc1d66d0ea165b724 GIT binary patch literal 20544 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

$J8swmWDRg_n-OvxL>-lX%W==<7{8 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%0D7Ft}=jT|(_b=-2O+!;TxGQVlvad4Znn2q2 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 + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('php_editor_view')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +echo "\n"; +echo "\n"; +echo " \n"; +echo " "; + + echo "\n"; + + echo ""; + ?> + + + + + + + + +
+ + + + \n"; + echo "\n"; + } + else { + echo "\n"; + } + ?> + +
+ + \ No newline at end of file diff --git a/app/php_edit/list.php b/app/php_edit/list.php new file mode 100644 index 0000000000..c1d3843ebb --- /dev/null +++ b/app/php_edit/list.php @@ -0,0 +1,107 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/checkauth.php"; +if (permission_exists('php_editor_view')) { + //access granted +} +else { + echo "access denied"; + exit; +} +require_once "admin/edit/header.php"; +echo "

"; +echo "\n"; +echo "\n"; +echo " \n"; + echo "\n"; +} //end if results +echo "
\n"; +echo "
"; + +$sql = "select * from v_clips "; +$prep_statement = $db->prepare(check_sql($sql)); +$prep_statement->execute(); +$result = $prep_statement->fetchAll(PDO::FETCH_NAMED); +$result_count = count($result); + +$c = 0; +$row_style["0"] = "background-color: #F5F5DC;"; +$row_style["1"] = "background-color: #FFFFFF;"; + +echo "
\n"; +echo "\n"; +echo ""; + +if ($result_count == 0) { //no results + echo ""; +} +else { //received results + echo ""; + echo ""; + //echo ""; + //echo ""; + //echo ""; + //echo ""; + //echo ""; + echo ""; + echo "\n"; + + foreach($result as $row) { + echo "\n"; + //echo ""; + echo ""; + //echo ""; + //echo ""; + //echo ""; + //echo ""; + //echo ""; + echo ""; + + echo "\n"; + if ($c==0) { $c=1; } else { $c=0; } + } //end foreach unset($sql, $result, $row_count); + echo "
 
    clip name      clip_folder        clip_text_start        clip_text_end        clip_desc        clip_order   
".$row['clip_uuid']."".$row['clip_name']."".$row[clip_folder]."".$row[clip_text_start]."".$row[clip_text_end]."".$row[clip_desc]."".$row[clip_order]."
\n"; + echo "
\n"; + + echo "
\n"; + +echo "
\n"; +echo "   \n"; +echo "   \n"; +echo "
\n"; +echo ""; + +echo "

"; +require_once "admin/edit/footer.php"; + +unset ($result_count); +unset ($result); +unset ($key); +unset ($val); +unset ($c); + +?> \ No newline at end of file diff --git a/app/php_edit/readme.txt b/app/php_edit/readme.txt new file mode 100644 index 0000000000..cafc4144ae --- /dev/null +++ b/app/php_edit/readme.txt @@ -0,0 +1,7 @@ +Notes + +IFrame +http://www.quirksmode.org/js/iframe.html + +Tree View +http://www.dddekerf.dds.nl/DHTML_Treeview/DHTML_Treeview.htm \ No newline at end of file diff --git a/app/php_edit/root.php b/app/php_edit/root.php new file mode 100644 index 0000000000..7b882438ea --- /dev/null +++ b/app/php_edit/root.php @@ -0,0 +1,50 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ + +// make sure the PATH_SEPARATOR is defined + if (!defined("PATH_SEPARATOR")) { + if ( strpos( $_ENV[ "OS" ], "Win" ) !== false ) { define("PATH_SEPARATOR", ";"); } else { define("PATH_SEPARATOR", ":"); } + } + +// make sure the document_root is set + $_SERVER["SCRIPT_FILENAME"] = str_replace("\\", "/", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = str_replace($_SERVER["PHP_SELF"], "", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = realpath($_SERVER["DOCUMENT_ROOT"]); + //echo "DOCUMENT_ROOT: ".$_SERVER["DOCUMENT_ROOT"]."
\n"; + //echo "PHP_SELF: ".$_SERVER["PHP_SELF"]."
\n"; + //echo "SCRIPT_FILENAME: ".$_SERVER["SCRIPT_FILENAME"]."
\n"; + +// if the project directory exists then add it to the include path otherwise add the document root to the include path + if (is_dir($_SERVER["DOCUMENT_ROOT"].'/fusionpbx')){ + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', '/fusionpbx'); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER["DOCUMENT_ROOT"].'/fusionpbx' ); + } + else { + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', ''); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER['DOCUMENT_ROOT'] ); + } + +?> \ No newline at end of file diff --git a/app/php_service/app_config.php b/app/php_service/app_config.php new file mode 100644 index 0000000000..1c47bbc137 --- /dev/null +++ b/app/php_service/app_config.php @@ -0,0 +1,82 @@ + \ No newline at end of file diff --git a/app/php_service/root.php b/app/php_service/root.php new file mode 100644 index 0000000000..7b882438ea --- /dev/null +++ b/app/php_service/root.php @@ -0,0 +1,50 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ + +// make sure the PATH_SEPARATOR is defined + if (!defined("PATH_SEPARATOR")) { + if ( strpos( $_ENV[ "OS" ], "Win" ) !== false ) { define("PATH_SEPARATOR", ";"); } else { define("PATH_SEPARATOR", ":"); } + } + +// make sure the document_root is set + $_SERVER["SCRIPT_FILENAME"] = str_replace("\\", "/", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = str_replace($_SERVER["PHP_SELF"], "", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = realpath($_SERVER["DOCUMENT_ROOT"]); + //echo "DOCUMENT_ROOT: ".$_SERVER["DOCUMENT_ROOT"]."
\n"; + //echo "PHP_SELF: ".$_SERVER["PHP_SELF"]."
\n"; + //echo "SCRIPT_FILENAME: ".$_SERVER["SCRIPT_FILENAME"]."
\n"; + +// if the project directory exists then add it to the include path otherwise add the document root to the include path + if (is_dir($_SERVER["DOCUMENT_ROOT"].'/fusionpbx')){ + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', '/fusionpbx'); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER["DOCUMENT_ROOT"].'/fusionpbx' ); + } + else { + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', ''); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER['DOCUMENT_ROOT'] ); + } + +?> \ No newline at end of file diff --git a/app/php_service/v_php_service.php b/app/php_service/v_php_service.php new file mode 100644 index 0000000000..4f71f9a274 --- /dev/null +++ b/app/php_service/v_php_service.php @@ -0,0 +1,176 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require_once "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('php_service_view')) { + //access granted +} +else { + echo "access denied"; + exit; +} +require_once "includes/header.php"; +require_once "includes/paging.php"; + +/* +function pkg_is_service_running($servicename) +{ + exec("/bin/ps ax | awk '{ print $5 }'", $psout); + array_shift($psout); + foreach($psout as $line) { + $ps[] = trim(array_pop(explode(' ', array_pop(explode('/', $line))))); + } + if(is_service_running($servicename, $ps) or is_process_running($servicename) ) { + return true; + } + else { + return false; + } +} +*/ + +$order_by = $_GET["order_by"]; +$order = $_GET["order"]; + +//show the content + echo "
"; + echo "
\n"; + echo "\n"; + echo " "; + echo ""; + echo "
\n"; + echo "
"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "
PHP Service 
\n"; + echo "Manages multiple dynamic and customizable services. There are many possible uses including alerts, ssh access control, scheduling commands to run, and many others uses that are yet to be discovered.

\n"; + echo "
\n"; + + $sql = ""; + $sql .= " select * from v_php_services "; + $sql .= " where domain_uuid = '$domain_uuid' "; + if (strlen($order_by)> 0) { $sql .= "order by $order_by $order "; } + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + $num_rows = count($result); + unset ($prep_statement, $result, $sql); + $rows_per_page = 10; + $param = ""; + $page = $_GET['page']; + if (strlen($page) == 0) { $page = 0; $_GET['page'] = 0; } + list($paging_controls, $rows_per_page, $var_3) = paging($num_rows, $param, $rows_per_page); + $offset = $rows_per_page * $page; + + $sql = ""; + $sql .= " select * from v_php_services "; + $sql .= " where domain_uuid = '$domain_uuid' "; + if (strlen($order_by)> 0) { $sql .= "order by $order_by $order "; } + $sql .= " limit $rows_per_page offset $offset "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + $result_count = count($result); + unset ($prep_statement, $sql); + + $c = 0; + $row_style["0"] = "row_style0"; + $row_style["1"] = "row_style1"; + + echo "
\n"; + echo "\n"; + echo "\n"; + echo th_order_by('service_name', 'Name', $order_by, $order); + //echo th_order_by('service_group', 'Group', $order_by, $order); + echo th_order_by('service_enabled', 'Enabled', $order_by, $order); + echo th_order_by('service_description', 'Description', $order_by, $order); + echo "\n"; + echo "\n"; + + if ($result_count == 0) { + //no results + } + else { //received results + foreach($result as $row) { + echo "\n"; + echo " \n"; + //echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "\n"; + if ($c==0) { $c=1; } else { $c=0; } + } //end foreach + unset($sql, $result, $row_count); + } //end if results + + echo "\n"; + echo "\n"; + echo "\n"; + + echo "
\n"; + if (permission_exists('php_service_add')) { + echo " $v_link_label_add\n"; + } + echo "
".$row[service_name]."".$row[service_group]."".$row[service_enabled]."".$row[service_description]." \n"; + if (permission_exists('php_service_edit')) { + echo " $v_link_label_edit\n"; + } + if (permission_exists('php_service_delete')) { + echo " $v_link_label_delete\n"; + } + echo "
\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "
 $paging_controls\n"; + if (permission_exists('php_service_add')) { + echo " $v_link_label_add\n"; + } + echo "
\n"; + echo "
"; + echo "
"; + echo "

"; + echo "

"; + + echo "
"; + echo "
"; + echo "

"; + +//show the footer + require_once "includes/footer.php"; +?> diff --git a/app/php_service/v_php_service_delete.php b/app/php_service/v_php_service_delete.php new file mode 100644 index 0000000000..7e718f5f34 --- /dev/null +++ b/app/php_service/v_php_service_delete.php @@ -0,0 +1,82 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require_once "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('php_service_delete')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +if (count($_GET)>0) { + $id = check_str($_GET["id"]); +} + +if (strlen($id)>0) { + $sql = ""; + $sql .= "select * from v_php_services "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and php_service_uuid = '$id' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach ($result as &$row) { + $service_name = $row["service_name"]; + $tmp_service_name = str_replace(" ", "_", $service_name); + break; //limit to 1 row + } + unset ($prep_statement, $result, $row); + + //delete the php service file + unlink($_SERVER["DOCUMENT_ROOT"].PROJECT_PATH.'/secure/php_service_'.$tmp_service_name.'.php'); + //delete the start up script + unlink($startup_script_dir.'/php_service_'.$tmp_service_name.'.sh'); + //delete the pid file + unlink($tmp_dir.'/php_service_'.$tmp_service_name.'.pid'); + + $sql = ""; + $sql .= "delete from v_php_services "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and php_service_uuid = '$id' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + unset($sql); +} + +require_once "includes/header.php"; +echo "\n"; +echo "
\n"; +echo "Delete Complete\n"; +echo "
\n"; + +require_once "includes/footer.php"; +return; + +?> + diff --git a/app/php_service/v_php_service_edit.php b/app/php_service/v_php_service_edit.php new file mode 100644 index 0000000000..6534bd2161 --- /dev/null +++ b/app/php_service/v_php_service_edit.php @@ -0,0 +1,556 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require_once "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('php_service_add') || permission_exists('php_service_edit')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +/* +function pkg_is_service_running($servicename) { + exec("/bin/ps ax | awk '{ print $5 }'", $psout); + array_shift($psout); + foreach($psout as $line) { + $ps[] = trim(array_pop(explode(' ', array_pop(explode('/', $line))))); + } + if(is_service_running($servicename, $ps) or is_process_running($servicename) ) { + return true; + } + else { + return false; + } +} + +function byte_convert( $bytes ) { + if ($bytes<=0) + return '0 Byte'; + + $convention=1000; //[1000->10^x|1024->2^x] + $s=array('B', 'kB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB'); + $e=floor(log($bytes,$convention)); + return round($bytes/pow($convention,$e),2).' '.$s[$e]; +} +*/ + +function php_services_sync_package_php() { + global $db, $domain_uuid, $startup_script_dir, $tmp_dir; + $sql = ""; + $sql .= "select * from v_php_services "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $tmp_prep_statement = $db->prepare(check_sql($sql)); + $tmp_prep_statement->execute(); + $tmp_result = $tmp_prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach ($tmp_result as &$row) { + $service_name = $row["service_name"]; + $tmp_service_name = str_replace(" ", "_", $service_name); + $service_script = base64_decode($row["service_script"]); + //$service_enabled = $row["service_enabled"]; + $service_description = $row["service_description"]; + $php_service_file = "php_service_".$tmp_service_name.".php"; + + if ($row['service_enabled'] == "false") { + //delete the php service file + unlink($_SERVER["DOCUMENT_ROOT"].PROJECT_PATH.'/secure/php_service_'.$tmp_service_name.'.php'); + //delete the start up script + unlink($startup_script_dir.'/php_service_'.$tmp_service_name.'.sh'); + //delete the pid file + unlink($tmp_dir.'/php_service_'.$tmp_service_name.'.pid'); + } + else { + //write the php service + $tmp = "\\n\";\n"; + //$tmp .= " } else {\n"; + //$tmp .= " fwrite(\$fp, \$syslogmsg);\n"; + //$tmp .= " fclose(\$fp);\n"; + //$tmp .= " }\n"; + //$tmp .= "\n"; + //$tmp .= "}\n"; + //$tmp .= "\n"; + //$tmp .= "\n"; + //$tmp .= "//\$msg = \"1.begin loop. \".date('r').\"\\n\";\n"; + //$tmp .= "//\$fp = fopen('/tmp/".$tmp_service_name.".txt', 'a');\n"; + //$tmp .= "//fwrite(\$fp, \$msg.\"\\n\");\n"; + //$tmp .= "//fclose(\$fp);\n"; + + //$tmp .= "\n"; + $tmp .= $service_script; + $tmp .= "\n"; + $tmp .= "?>"; + + $fout = fopen($_SERVER["DOCUMENT_ROOT"].PROJECT_PATH.'/secure/'.$php_service_file,"w"); + fwrite($fout, $tmp); + unset($tmp); + fclose($fout); + + //add execute permissions to the php service script + chmod($_SERVER["DOCUMENT_ROOT"].PROJECT_PATH.'/secure/'.$php_service_file, 0776); + + //write the start up script + // CYGWIN_NT-5.1 + // Darwin + // FreeBSD + // HP-UX + // IRIX64 + // Linux + // NetBSD + // OpenBSD + // SunOS + // Unix + // WIN32 + // WINNT + // Windows + switch (PHP_OS) { + case "FreeBSD": + // make sure the start up directory i set + if (strlen($startup_script_dir) > 0) { + $startup_script_dir = "/usr/local/etc/rc.d"; + } + $tmp = ""; + $tmp = "#!/bin/sh\n"; + $tmp .= "# This file was automatically generated\n"; + $tmp .= "# by the PHP Service handler.\n"; + $tmp .= "# \n"; + $tmp .= "# Copy this script to the startup directory.\n"; + $tmp .= "# cp -a ".$_SERVER["DOCUMENT_ROOT"].PROJECT_PATH."/secure/php_service_".$tmp_service_name.".sh ".$startup_script_dir."/php_service_".$tmp_service_name.".sh"; + $tmp .= "# \n"; + $tmp .= "# Usage: ./php_service_".$tmp_service_name.".sh {start|stop|restart}\n"; + $tmp .= "# ".$startup_script_dir."/./php_service_".$tmp_service_name.".sh start"; + $tmp .= "\n"; + $tmp .= "\n"; + $tmp .= "rc_start() {\n"; + $tmp .= " ".PHP_BINDIR."/php ".$_SERVER["DOCUMENT_ROOT"].PROJECT_PATH."/secure/".$php_service_file." >> /var/log/php_service_".$tmp_service_name.".log &\n"; + $tmp .= "}\n"; + $tmp .= "\n"; + $tmp .= "rc_stop() {\n"; + $tmp .= " rm ".$tmp_dir."/php_service_".$tmp_service_name.".pid\n"; + $tmp .= "}\n"; + $tmp .= "\n"; + $tmp .= "case \"\$1\" in\n"; + $tmp .= " start)\n"; + $tmp .= " echo \"Starting the service. \"\n"; + $tmp .= " rc_start\n"; + $tmp .= " ;;\n"; + $tmp .= " stop)\n"; + $tmp .= " echo \"Stopping the service. \"\n"; + $tmp .= " rc_stop\n"; + $tmp .= " ;;\n"; + $tmp .= " restart)\n"; + $tmp .= " echo \"Restarting the service. \"\n"; + $tmp .= " rc_stop\n"; + $tmp .= " rc_start\n"; + $tmp .= " ;;\n"; + $tmp .= " *)\n"; + $tmp .= " echo \"Usage: ".$startup_script_dir."/php_service_".$tmp_service_name.".sh {start|stop|restart}\"\n"; + $tmp .= " exit 1\n"; + $tmp .= " ;;\n"; + $tmp .= "esac\n"; + $fout = fopen($_SERVER["DOCUMENT_ROOT"].PROJECT_PATH."/secure/php_service_".$tmp_service_name.".sh","w"); + fwrite($fout, $tmp); + unset($tmp); + fclose($fout); + + //add execute permissions to the start script + chmod($_SERVER["DOCUMENT_ROOT"].PROJECT_PATH."/secure/php_service_".$tmp_service_name.".sh", 0755); + + break; + default: + // make sure the start up directory i set + if (strlen($startup_script_dir) > 0) { + $startup_script_dir = "/etc/init.d"; + } + $tmp = ""; + $tmp .= "#!/bin/sh\n"; + $tmp .= "# /etc/init.d/".$tmp_service_name."\n"; + $tmp .= "# This file was automatically generated\n"; + $tmp .= "# by the PHP Service handler.\n"; + $tmp .= "# \n"; + $tmp .= "# Copy this script to the startup directory.\n"; + $tmp .= "# cp -a ".$_SERVER["DOCUMENT_ROOT"].PROJECT_PATH."/secure/php_service_".$tmp_service_name.".sh ".$startup_script_dir."/php_service_".$tmp_service_name.".sh"; + $tmp .= "# \n"; + $tmp .= "# Usage: ./php_service_".$tmp_service_name.".sh {start|stop|restart}\n"; + $tmp .= "# ".$startup_script_dir."/./php_service_".$tmp_service_name.".sh start"; + $tmp .= "\n"; + $tmp .= "\n"; + $tmp .= "rc_start() {\n"; + $tmp .= " ".PHP_BINDIR."/php ".$_SERVER["DOCUMENT_ROOT"].PROJECT_PATH."/secure/".$php_service_file." >> /var/log/".tmp_service_name.".log &\n"; + $tmp .= "}\n"; + $tmp .= "\n"; + $tmp .= "rc_stop() {\n"; + $tmp .= " rm ".$tmp_dir."/php_service_".$tmp_service_name.".pid\n"; + $tmp .= "}\n"; + $tmp .= "\n"; + $tmp .= "case \"\$1\" in\n"; + $tmp .= " start)\n"; + $tmp .= " echo \"Starting the service. \"\n"; + $tmp .= " rc_start\n"; + $tmp .= " ;;\n"; + $tmp .= " stop)\n"; + $tmp .= " echo \"Stopping the service. \"\n"; + $tmp .= " rc_stop\n"; + $tmp .= " ;;\n"; + $tmp .= " restart)\n"; + $tmp .= " echo \"Restarting the service. \"\n"; + $tmp .= " rc_stop\n"; + $tmp .= " rc_start\n"; + $tmp .= " ;;\n"; + $tmp .= " *)\n"; + $tmp .= " echo \"Usage: ".$startup_script_dir."/".$tmp_service_name.".sh {start|stop|restart}\"\n"; + $tmp .= " exit 1\n"; + $tmp .= " ;;\n"; + $tmp .= "esac\n"; + $tmp .= "\n"; + $tmp .= "exit 0"; + $fout = fopen($_SERVER["DOCUMENT_ROOT"].PROJECT_PATH."/secure/php_service_".$tmp_service_name.".sh","w"); + fwrite($fout, $tmp); + unset($tmp); + fclose($fout); + + //add execute permissions to the start script + chmod($_SERVER["DOCUMENT_ROOT"].PROJECT_PATH."/secure/php_service_".$tmp_service_name.".sh", 0755); + } + } //end if enabled + } +} + +//set the action as an add or an update + if (isset($_REQUEST["id"])) { + $action = "update"; + $php_service_uuid = check_str($_REQUEST["id"]); + } + else { + $action = "add"; + } + +//set the http values to variabless +if (count($_POST)>0) { + $service_name = check_str($_POST["service_name"]); + $service_script = $_POST["service_script"]; + $service_enabled = check_str($_POST["service_enabled"]); + $service_description = check_str($_POST["service_description"]); + + //set defaults + $service_type = "php"; + + //setup the default script + $tmp_service_name = str_replace(" ", "_", $service_name); + if (strlen($service_script) == 0) { + $tmp = "\n"; + $tmp .= "\n"; + $tmp .= "\$x = 0;\n"; + $tmp .= "while(\$x == 0) {\n"; + $tmp .= "\n"; + $tmp .= "\n"; + $tmp .= "\n"; + $tmp .= "\n"; + $tmp .= "\n"; + $tmp .= "\n"; + $tmp .= "\n"; + $tmp .= "\n"; + $tmp .= "\n"; + $tmp .= " if(!file_exists('".$tmp_dir."/php_service_".$tmp_service_name.".pid')) { return; }\n"; + $tmp .= " usleep(1000000); //1 000 000 microseconds = 1 second\n"; + //$tmp .= " //if (\$x > 60){ exit; } //exit after 60 loops for testing\n"; + $tmp .= "} //end while\n"; + $service_script = $tmp; + } +} + +if (count($_POST)>0 && strlen($_POST["persistformvar"]) == 0) { + + $msg = ''; + if ($action == "update") { + $php_service_uuid = check_str($_POST["php_service_uuid"]); + } + + //check for all required data + if (strlen($service_name) == 0) { $msg .= "Please provide: Name
\n"; } + //if (strlen($service_script) == 0) { $msg .= "Please provide: Script
\n"; } + if (strlen($service_enabled) == 0) { $msg .= "Please provide: Enabled
\n"; } + //if (strlen($service_description) == 0) { $msg .= "Please provide: Description
\n"; } + if (strlen($msg) > 0 && strlen($_POST["persistformvar"]) == 0) { + require_once "includes/header.php"; + require_once "includes/persistformvar.php"; + echo "
\n"; + echo "
\n"; + echo $msg."
"; + echo "
\n"; + persistformvar($_POST); + echo "
\n"; + require_once "includes/footer.php"; + return; + } + + //add or update the database + if ($_POST["persistformvar"] != "true") { + if ($action == "add" && permission_exists('php_service_add')) { + $php_service_uuid = uuid(); + $sql = "insert into v_php_services "; + $sql .= "("; + $sql .= "domain_uuid, "; + $sql .= "php_service_uuid, "; + $sql .= "service_name, "; + $sql .= "service_script, "; + $sql .= "service_enabled, "; + $sql .= "service_description "; + $sql .= ")"; + $sql .= "values "; + $sql .= "("; + $sql .= "'$domain_uuid', "; + $sql .= "'$php_service_uuid', "; + $sql .= "'$service_name', "; + $sql .= "'".base64_encode($service_script)."', "; + $sql .= "'$service_enabled', "; + $sql .= "'$service_description' "; + $sql .= ")"; + $db->exec(check_sql($sql)); + unset($sql); + + //create the php service files + php_services_sync_package_php(); + + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Add Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + } //if ($action == "add") + + if ($action == "update" && permission_exists('php_service_edit')) { + $sql = "update v_php_services set "; + $sql .= "service_name = '$service_name', "; + $sql .= "service_script = '".base64_encode($service_script)."', "; + $sql .= "service_enabled = '$service_enabled', "; + $sql .= "service_description = '$service_description' "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and php_service_uuid = '$php_service_uuid' "; + $db->exec(check_sql($sql)); + unset($sql); + + //create the php service files + php_services_sync_package_php(); + + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Update Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + } //if ($action == "update") + } //if ($_POST["persistformvar"] != "true") +} //(count($_POST)>0 && strlen($_POST["persistformvar"]) == 0) + +//pre-populate the form + if (count($_GET)>0 && $_POST["persistformvar"] != "true") { + $php_service_uuid = $_GET["id"]; + $sql = ""; + $sql .= "select * from v_php_services "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and php_service_uuid = '$php_service_uuid' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach ($result as &$row) { + $service_name = $row["service_name"]; + $tmp_service_name = str_replace(" ", "_", $service_name); + $service_script = base64_decode($row["service_script"]); + $service_enabled = $row["service_enabled"]; + $service_description = $row["service_description"]; + break; //limit to 1 row + } + unset ($prep_statement); + } + +//include the header + require_once "includes/header.php"; + +// edit area + echo " \n"; + echo " \n"; + + echo " "; + +//show the form + echo "
"; + echo "\n"; + + echo "\n"; + echo " "; + echo " "; + echo "
\n"; + echo "
"; + + echo "
\n"; + + echo "
\n"; + echo "\n"; + + echo "\n"; + if ($action == "add") { + echo "\n"; + } + if ($action == "update") { + echo "\n"; + } + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo " \n"; + echo " \n"; + echo " "; + echo "
PHP Service AddPHP Service Edit
\n"; + echo "Manages multiple dynamic and customizable services. There are many possible uses including alerts, ssh access control, scheduling commands to run, and many others uses that are yet to be discovered.

\n"; + echo "
\n"; + echo " Name:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter a name.\n"; + echo "
\n"; + echo " Script:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the PHP script here.\n"; + echo "
\n"; + echo " Enabled:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "\n"; + echo "
\n"; + echo " Description:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "\n"; + echo "
\n"; + if ($action == "update") { + echo " \n"; + } + echo " \n"; + echo "
"; + echo ""; + + echo "
"; + echo "
"; + +//include the footer + require_once "includes/footer.php"; +?> \ No newline at end of file diff --git a/app/provision/app_config.php b/app/provision/app_config.php new file mode 100644 index 0000000000..6a2ff46ea3 --- /dev/null +++ b/app/provision/app_config.php @@ -0,0 +1,25 @@ + \ No newline at end of file diff --git a/app/provision/index.php b/app/provision/index.php new file mode 100644 index 0000000000..1c93a279c0 --- /dev/null +++ b/app/provision/index.php @@ -0,0 +1,400 @@ + + Copyright (C) 2008-2012 All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; + +//set default variables + $dir_count = 0; + $file_count = 0; + $row_count = 0; + $tmp_array = ''; + $phone_template = ''; + +//get any system -> variables defined in the 'provision; + $sql .= "select * from v_vars "; + $sql .= "where var_enabled = 'true' "; + $sql .= "and var_cat = 'Provision' "; + $prep_statement = $db->prepare(check_sql($sql)); + if ($prep_statement) { + $prep_statement->execute(); + $provision_variables_array = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach ($provision_variables_array as &$row) { + if ($row['var_name'] == "password") { + $var_name = $row['var_name']; + $var_value = $row['var_value']; + $$var_name = $var_value; + } + } + } + +//if password was defined in the system -> variables page then require the password. + if (strlen($password) > 0) { + //deny access if the password doesn't match + if ($password != $_REQUEST['password']) { + //Log the failed auth attempt to the system, to be available for fail2ban. + openlog('FusionPBX', LOG_NDELAY, LOG_AUTH); + syslog(LOG_WARNING, '['.$_SERVER['REMOTE_ADDR']."] provision attempt bad password for ".$_REQUEST['mac']); + closelog(); + + usleep(rand(1000000,3500000));//1-3.5 seconds. + echo "access denied"; + return; + } + } + +//send a request to a remote server to validate the MAC address and secret + if (strlen($_SERVER['auth_server']) > 0) { + $result = send_http_request($_SERVER['auth_server'], 'mac='.$_REQUEST['mac'].'&secret='.$_REQUEST['secret']); + if ($result == "false") { + echo "access denied"; + exit; + } + } + +//define variables from HTTP GET + $mac = $_REQUEST['mac']; + if (strlen($_REQUEST['template']) > 0) { + $phone_template = $_REQUEST['template']; + } + + if(empty($mac)){//check alternate MAC source + if($_SERVER['HTTP_USER_AGENT'][strlen($_SERVER['HTTP_USER_AGENT'])-17-1]==" ") { + $mac= substr($_SERVER['HTTP_USER_AGENT'],-17); + }//Yealink: 17 digit mac appended to the user agent, so check for a space exactly 17 digits before the end. + }//check alternates + + $mac = strtolower($mac); + $mac = str_replace(":", "-", $mac); + if (strlen($mac) == 12) { + $mac = substr($mac, 0,2).'-'.substr($mac, 2,2).'-'.substr($mac, 4,2).'-'.substr($mac, 6,2).'-'.substr($mac, 8,2).'-'.substr($mac, 10,2); + } + $file = $_REQUEST['file']; + +//check to see if the mac_address exists in v_hardware_phones + if (mac_exists_in_v_hardware_phones($db, $mac)) { + //get the phone_template + if (strlen($phone_template) == 0) { + $sql = "SELECT * FROM v_hardware_phones "; + $sql .= "where domain_uuid=:domain_uuid "; + $sql .= "and phone_mac_address=:mac "; + $prep_statement_2 = $db->prepare(check_sql($sql)); + if ($prep_statement_2) { + $prep_statement_2->bindParam(':domain_uuid', $domain_uuid); + $prep_statement_2->bindParam(':mac', $mac); + $prep_statement_2->execute(); + $row = $prep_statement_2->fetch(); + $phone_label = $row["phone_label"]; + $phone_vendor = $row["phone_vendor"]; + $phone_model = $row["phone_model"]; + $phone_firmware_version = $row["phone_firmware_version"]; + $phone_provision_enable = $row["phone_provision_enable"]; + $phone_template = $row["phone_template"]; + $phone_username = $row["phone_username"]; + $phone_password = $row["phone_password"]; + $phone_time_zone = $row["phone_time_zone"]; + $phone_description = $row["phone_description"]; + } + } + //find a template that was defined on another phone and use that as the default. + if (strlen($phone_template) == 0) { + $sql = "SELECT * FROM v_hardware_phones "; + $sql .= "where domain_uuid=:domain_uuid "; + $sql .= "and phone_template like '%/%' "; + $prep_statement3 = $db->prepare(check_sql($sql)); + if ($prep_statement3) { + $prep_statement3->bindParam(':domain_uuid', $domain_uuid); + $prep_statement3->bindParam(':mac', $mac); + $prep_statement3->execute(); + $row = $prep_statement3->fetch(); + $phone_label = $row["phone_label"]; + $phone_vendor = $row["phone_vendor"]; + $phone_model = $row["phone_model"]; + $phone_firmware_version = $row["phone_firmware_version"]; + $phone_provision_enable = $row["phone_provision_enable"]; + $phone_template = $row["phone_template"]; + $phone_username = $row["phone_username"]; + $phone_password = $row["phone_password"]; + $phone_time_zone = $row["phone_time_zone"]; + $phone_description = $row["phone_description"]; + } + } + } + else { + //mac does not exist in v_hardware_phones add it to the table + //use the mac address to find the vendor + switch (substr($mac, 0, 8)) { + case "00-08-5d": + $phone_vendor = "aastra"; + break; + case "00-0e-08": + $phone_vendor = "linksys"; + break; + case "00-04-f2": + $phone_vendor = "polycom"; + break; + case "00-90-7a": + $phone_vendor = "polycom"; + break; + case "00-18-73": + $phone_vendor = "cisco"; + break; + case "00-04-5a": + $phone_vendor = "linksys"; + break; + case "00-06-25": + $phone_vendor = "linksys"; + break; + case "00-15-65": + $phone_vendor = "yealink"; + break; + default: + $phone_vendor = ""; + } + + //use the user_agent to pre-assign a template for 1-hit provisioning. Enter the a unique string to match in the user agent, and the template it should match. + $template_list=array( + "Linksys/SPA-2102"=>"linksys/spa2102", + "Linksys/SPA-3102"=>"linksys/spa3102" + ); + + foreach ($template_list as $key=>$val){ + if(stripos($_SERVER['HTTP_USER_AGENT'],$key)!== false) { + $phone_template=$val; + break; + } + } + unset($template_list); + + //the mac address does not exist in the table so add it + $hardware_phone_uuid = uuid(); + $sql = "insert into v_hardware_phones "; + $sql .= "("; + $sql .= "domain_uuid, "; + $sql .= "hardware_phone_uuid, "; + $sql .= "phone_mac_address, "; + $sql .= "phone_vendor, "; + $sql .= "phone_model, "; + $sql .= "phone_provision_enable, "; + $sql .= "phone_template, "; + $sql .= "phone_username, "; + $sql .= "phone_password, "; + $sql .= "phone_description "; + $sql .= ")"; + $sql .= "values "; + $sql .= "("; + $sql .= "'$domain_uuid', "; + $sql .= "'$hardware_phone_uuid', "; + $sql .= "'$mac', "; + $sql .= "'$phone_vendor', "; + $sql .= "'', "; + $sql .= "'true', "; + $sql .= "'$phone_template', "; + $sql .= "'', "; + $sql .= "'', "; + $sql .= "'auto {$_SERVER['HTTP_USER_AGENT']}' "; + $sql .= ")"; + $db->exec(check_sql($sql)); + unset($sql); + } + +//if $file is not provided then look for a default file that exists + if (strlen($file) == 0) { + if (file_exists($_SERVER["DOCUMENT_ROOT"].PROJECT_PATH."/includes/templates/provision/".$phone_template ."/{v_mac}")) { + $file = "{v_mac}"; + } + elseif (file_exists($_SERVER["DOCUMENT_ROOT"].PROJECT_PATH."/includes/templates/provision/".$phone_template ."/{v_mac}.xml")) { + $file = "{v_mac}.xml"; + } + elseif (file_exists($_SERVER["DOCUMENT_ROOT"].PROJECT_PATH."/includes/templates/provision/".$phone_template ."/{v_mac}.cfg")) { + $file = "{v_mac}.cfg"; + } + else { + echo "file not found"; + exit; + } + } + else { + //make sure the file exists + if (!file_exists($_SERVER["DOCUMENT_ROOT"].PROJECT_PATH."/includes/templates/provision/".$phone_template ."/".$file)) { + echo "file not found"; + exit; + } + } + +//log file for testing + //$tmp_file = "/tmp/provisioning_log.txt"; + //$fh = fopen($tmp_file, 'w') or die("can't open file"); + //$tmp_string = $mac."\n"; + //fwrite($fh, $tmp_string); + //fclose($fh); + + //set variables for testing + //$line1_displayname= "1001"; + //$line1_shortname= "1001"; + //$line1_user_id= "1001"; + //$line1_user_password= "1234."; + //$line1_server_address= "10.2.0.2"; + //$line2_server_address= ""; + //$line2_displayname= ""; + //$line2_shortname= ""; + //$line2_user_uuid= ""; + //$line2_user_password= ""; + //$line2_server_address= ""; + //$server1_address= "10.2.0.2"; + //$server2_address= ""; + //$server3_address= ""; + //$proxy1_address= "10.2.0.2"; + //$proxy2_address= ""; + //$proxy3_address= ""; + +//get the contents of the template + $file_contents = file_get_contents($_SERVER["DOCUMENT_ROOT"].PROJECT_PATH."/includes/templates/provision/".$phone_template ."/".$file); + +//replace the variables in the template in the future loop through all the line numbers to do a replace for each possible line number + + //get the time zone + $time_zone_name = $_SESSION['domain']['time_zone']['name']; + if (strlen($time_zone_name) > 0) { + $time_zone_offset_raw = get_time_zone_offset($time_zone_name)/3600; + $time_zone_offset_hours = floor($time_zone_offset_raw); + $time_zone_offset_minutes = ($time_zone_offset_raw - $time_zone_offset_hours) * 60; + $time_zone_offset_minutes = number_pad($time_zone_offset_minutes, 2); + if ($time_zone_offset_raw > 0) { + $time_zone_offset_hours = number_pad($time_zone_offset_hours, 2); + $time_zone_offset_hours = "+".$time_zone_offset_hours; + } + else { + $time_zone_offset_hours = str_replace("-", "", $time_zone_offset_hours); + $time_zone_offset_hours = "-".number_pad($time_zone_offset_hours, 2); + } + $time_zone_offset = $time_zone_offset_hours.":".$time_zone_offset_minutes; + $file_contents = str_replace("{v_time_zone_offset}", $time_zone_offset, $file_contents); + } + + //lookup the provisioning information for this MAC address. + $sql = "select * from v_extensions "; + $sql .= "where provisioning_list like '%|".$mac.":%' "; + $sql .= "and domain_uuid = '$domain_uuid' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach ($result as &$row) { + $provisioning_list = $row["provisioning_list"]; + $provisioning_list_array = explode("|", $provisioning_list); + foreach ($provisioning_list_array as &$prov_row) { + $prov_row_array = explode(":", $prov_row); + if ($prov_row_array[0] == $mac) { + $line_number = $prov_row_array[1]; + $file_contents = str_replace("{v_line".$line_number."_server_address}", $_SESSION['domain_name'], $file_contents); + $file_contents = str_replace("{v_line".$line_number."_displayname}", $row["effective_caller_id_name"], $file_contents); + $file_contents = str_replace("{v_line".$line_number."_shortname}", $row["extension"], $file_contents); + $file_contents = str_replace("{v_line".$line_number."_user_id}", $row["extension"], $file_contents); + $file_contents = str_replace("{v_line".$line_number."_user_password}", $row["password"], $file_contents); + } + } + //$vm_password = $row["vm_password"]; + //$vm_password = str_replace("#", "", $vm_password); //preserves leading zeros + //$accountcode = $row["accountcode"]; + //$effective_caller_id_name = $row["effective_caller_id_name"]; + //$effective_caller_id_number = $row["effective_caller_id_number"]; + //$outbound_caller_id_name = $row["outbound_caller_id_name"]; + //$outbound_caller_id_number = $row["outbound_caller_id_number"]; + //$vm_mailto = $row["vm_mailto"]; + //$vm_attach_file = $row["vm_attach_file"]; + //$vm_keep_local_after_email = $row["vm_keep_local_after_email"]; + //$user_context = $row["user_context"]; + //$call_group = $row["call_group"]; + //$auth_acl = $row["auth_acl"]; + //$cidr = $row["cidr"]; + //$sip_force_contact = $row["sip_force_contact"]; + //$enabled = $row["enabled"]; + //$description = $row["description"]; + } + unset ($prep_statement); + + //replace the variables in the template in the future loop through all the line numbers to do a replace for each possible line number + $file_contents = str_replace("{v_mac}", $mac, $file_contents); + $file_contents = str_replace("{v_label}", $phone_label, $file_contents); + $file_contents = str_replace("{v_firmware_version}", $phone_firmware_version, $file_contents); + $file_contents = str_replace("{domain_time_zone}", $phone_time_zone, $file_contents); + $file_contents = str_replace("{domain_name}", $_SESSION['domain_name'], $file_contents); + $file_contents = str_replace("{v_project_path}", PROJECT_PATH, $file_contents); + $file_contents = str_replace("{v_server1_address}", $server1_address, $file_contents); + $file_contents = str_replace("{v_proxy1_address}", $proxy1_address, $file_contents); + $file_contents = str_replace("{v_password}", $password, $file_contents); + $file_contents = str_replace("{v_time_zone_offset}", $password, $file_contents); + + //cleanup any remaining variables + for ($i = 1; $i <= 100; $i++) { + $file_contents = str_replace("{v_line".$i."_server_address}", "", $file_contents); + $file_contents = str_replace("{v_line".$i."_displayname}", "", $file_contents); + $file_contents = str_replace("{v_line".$i."_shortname}", "", $file_contents); + $file_contents = str_replace("{v_line".$i."_user_id}", "", $file_contents); + $file_contents = str_replace("{v_line".$i."_user_password}", "", $file_contents); + } + + //replace the dynamic provision variables that are defined in the system -> variables page + foreach ($provision_variables_array as &$row) { + if (substr($var_name, 0, 2) == "v_") { + $file_contents = str_replace('{'.$row[var_name].'}', $row[var_value], $file_contents); + } + } + +//deliver the customized config over HTTP/HTTPS + + //need to make sure content-type is correct + $cfg_ext = ".cfg"; + if ($phone_vendor === "aastra" && strrpos($file, $cfg_ext, 0) === strlen($file) - strlen($cfg_ext)) { + header ("content-type: text/plain"); + } else { + header ("content-type: text/xml"); + } + echo $file_contents; + +function mac_exists_in_v_hardware_phones($db, $mac) { + global $domain_uuid; + $sql = "SELECT count(*) as count FROM v_hardware_phones "; + $sql .= "where domain_uuid=:domain_uuid "; + $sql .= "and phone_mac_address=:mac "; + $prep_statement = $db->prepare(check_sql($sql)); + if ($prep_statement) { + $prep_statement->bindParam(':domain_uuid', $domain_uuid); + $prep_statement->bindParam(':mac', $mac); + $prep_statement->execute(); + $row = $prep_statement->fetch(); + $count = $row['count']; + if ($row['count'] > 0) { + return true; + } + else { + return false; + } + } + else { + return false; + } +} + +?> \ No newline at end of file diff --git a/app/provision/provision_write.php b/app/provision/provision_write.php new file mode 100644 index 0000000000..688a19d6ce --- /dev/null +++ b/app/provision/provision_write.php @@ -0,0 +1,237 @@ + + Copyright (C) 2008-2012 All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (if_group("admin") || if_group("superadmin")) { + //access granted +} +else { + echo "access denied"; + exit; +} + +//set default variables + $dir_count = 0; + $file_count = 0; + $row_count = 0; + $tmp_array = ''; + +//get any system -> variables defined in the 'provision; + $sql = "select * from v_vars "; + $sql .= "where var_enabled = 'true' "; + $sql .= "and var_cat = 'Provision' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $provision_variables_array = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach ($provision_variables_array as &$row) { + if ($row[var_name] == "password") { + $var_name = $row[var_name]; + $var_value = $row[var_value]; + $$var_name = $var_value; + } + } + +//get the hardware phone list + $sql = "select * from v_hardware_phones "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach ($result as &$row) { + $phone_mac_address = $row["phone_mac_address"]; + $phone_mac_address = strtolower($phone_mac_address); + $phone_label = $row["phone_label"]; + $phone_vendor = $row["phone_vendor"]; + $phone_model = $row["phone_model"]; + $phone_firmware_version = $row["phone_firmware_version"]; + $phone_provision_enable = $row["phone_provision_enable"]; + $phone_template = $row["phone_template"]; + $phone_username = $row["phone_username"]; + $phone_password = $row["phone_password"]; + $phone_time_zone = $row["phone_time_zone"]; + $phone_description = $row["phone_description"]; + + //loop through the provision template directory + $provision_template_dir = $_SERVER["DOCUMENT_ROOT"].PROJECT_PATH."/includes/templates/provision/".$phone_template; + + clearstatcache(); + $dir_list = ''; + $file_list = ''; + $dir_list = opendir($provision_template_dir); + $dir_array = array(); + while (false !== ($file = readdir($dir_list))) { + if ($file != "." AND $file != ".."){ + $new_path = $dir.'/'.$file; + $level = explode('/',$new_path); + if (substr($new_path, -4) == ".svn") { + //ignore .svn dir and subdir + } + elseif (substr($new_path, -3) == ".db") { + //ignore .db files + } + else { + $dir_array[] = $new_path; + } + if ($x > 1000) { break; }; + $x++; + } + } + //asort($dir_array); + foreach ($dir_array as $new_path){ + $level = explode('/',$new_path); + if (is_dir($new_path)) { + //$mod_array[] = array( + //'level'=>count($level)-1, + //'path'=>$new_path, + //'name'=>end($level), + //'type'=>'dir', + //'mod_time'=>filemtime($new_path), + //'size'=>''); + //$mod_array[] = recur_dir($new_path); + $dir_name = end($level); + //$file_list .= "$dir_name\n"; + //$dir_list .= recur_dir($new_path); + } + else { + //$mod_array[] = array( + //'level'=>count($level)-1, + //'path'=>$new_path, + //'name'=>end($level), + //'type'=>'dir', + //'mod_time'=>filemtime($new_path), + //'size'=>''); + //$mod_array[] = recur_dir($new_path); + $file_name = end($level); + $file_size = round(filesize($new_path)/1024, 2); + + //get the contents of the template + $file_contents = file_get_contents($_SERVER["DOCUMENT_ROOT"].PROJECT_PATH."/includes/templates/provision/".$phone_template ."/".$file_name); + + //prepare the files + //replace the variables in the template in the future loop through all the line numbers to do a replace for each possible line number + $file_contents = str_replace("{v_mac}", $phone_mac_address, $file_contents); + $file_contents = str_replace("{v_label}", $phone_label, $file_contents); + $file_contents = str_replace("{v_firmware_version}", $phone_firmware_version, $file_contents); + $file_contents = str_replace("{domain_time_zone}", $phone_time_zone, $file_contents); + $file_contents = str_replace("{domain_name}", $_SESSION['domain_name'], $file_contents); + $file_contents = str_replace("{v_server1_address}", $server1_address, $file_contents); + $file_contents = str_replace("{v_proxy1_address}", $proxy1_address, $file_contents); + + //replace the dynamic provision variables that are defined in the system -> variables page + foreach ($provision_variables_array as &$row) { + if (substr($var_name, 0, 2) == "v_") { + $file_contents = str_replace('{'.$row[var_name].'}', $row[var_value], $file_contents); + } + } + + //lookup the provisioning information for this MAC address. + $sql2 = "select * from v_extensions "; + $sql2 .= "where provisioning_list like '%$phone_mac_address%' "; + $sql2 .= "and domain_uuid = '$domain_uuid' "; + $prep_statement_2 = $db->prepare(check_sql($sql2)); + $prep_statement_2->execute(); + $result2 = $prep_statement_2->fetchAll(PDO::FETCH_NAMED); + foreach ($result2 as &$row2) { + $provisioning_list = $row2["provisioning_list"]; + if (strlen($provisioning_list) > 1) { + $provisioning_list_array = explode("|", $provisioning_list); + foreach ($provisioning_list_array as $prov_row) { + $prov_row_array = explode(":", $prov_row); + if (strlen($prov_row_array[0]) > 0) { + //echo "mac address: ".$prov_row_array[0]."
"; + //echo "line_number: ".$prov_row_array[1]."
"; + if ($prov_row_array[0] == $phone_mac_address) { + $line_number = $prov_row_array[1]; + //echo "prov_row: ".$prov_row."
"; + //echo "line_number: ".$line_number."
"; + //echo "

\n"; + } + $file_contents = str_replace("{v_line".$line_number."_server_address}", $_SESSION['domain_name'], $file_contents); + $file_contents = str_replace("{v_line".$line_number."_displayname}", $row2["effective_caller_id_name"], $file_contents); + $file_contents = str_replace("{v_line".$line_number."_shortname}", $row2["extension"], $file_contents); + $file_contents = str_replace("{v_line".$line_number."_user_id}", $row2["extension"], $file_contents); + $file_contents = str_replace("{v_line".$line_number."_user_password}", $row2["password"], $file_contents); + } + } + //$vm_password = $row["vm_password"]; + //$vm_password = str_replace("#", "", $vm_password); //preserves leading zeros + //$accountcode = $row["accountcode"]; + //$effective_caller_id_name = $row["effective_caller_id_name"]; + //$effective_caller_id_number = $row["effective_caller_id_number"]; + //$outbound_caller_id_name = $row["outbound_caller_id_name"]; + //$outbound_caller_id_number = $row["outbound_caller_id_number"]; + //$vm_enabled = $row["vm_enabled"]; + //$vm_mailto = $row["vm_mailto"]; + //$vm_attach_file = $row["vm_attach_file"]; + //$vm_keep_local_after_email = $row["vm_keep_local_after_email"]; + //$user_context = $row["user_context"]; + //$call_group = $row["call_group"]; + //$auth_acl = $row["auth_acl"]; + //$cidr = $row["cidr"]; + //$sip_force_contact = $row["sip_force_contact"]; + //$enabled = $row["enabled"]; + //$description = $row["description"] + } + } + unset ($prep_statement_2); + + //cleanup any remaining variables + for ($i = 1; $i <= 100; $i++) { + $file_contents = str_replace("{v_line".$i."_server_address}", "", $file_contents); + $file_contents = str_replace("{v_line".$i."_displayname}", "", $file_contents); + $file_contents = str_replace("{v_line".$i."_shortname}", "", $file_contents); + $file_contents = str_replace("{v_line".$i."_user_id}", "", $file_contents); + $file_contents = str_replace("{v_line".$i."_user_password}", "", $file_contents); + } + + //replace {v_mac} in the file name + if (substr($phone_mac_address, 0, 6) == "00085d") { + //upper case the mac address for aastra phones + $file_name = str_replace("{v_mac}", strtoupper($phone_mac_address), $file_name); + } + else { + //all other phones + $file_name = str_replace("{v_mac}", $phone_mac_address, $file_name); + } + + //write the configuration to the directory + if (strlen($_SESSION['switch']['provision']['dir']) > 0) { + $dir_array = explode(";", $_SESSION['switch']['provision']['dir']); + foreach($dir_array as $directory) { + //echo $directory.'/'.$file_name."\n"; + $fh = fopen($directory.'/'.$file_name,"w") or die("Unable to write to $directory for provisioning. Make sure the path exists and permissons are set correctly."); + fwrite($fh, $file_contents); + fclose($fh); + } + unset($file_name); + } + } + } //end for each + closedir($dir_list); + } + unset ($prep_statement); + +?> \ No newline at end of file diff --git a/app/provision/root.php b/app/provision/root.php new file mode 100644 index 0000000000..7b882438ea --- /dev/null +++ b/app/provision/root.php @@ -0,0 +1,50 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ + +// make sure the PATH_SEPARATOR is defined + if (!defined("PATH_SEPARATOR")) { + if ( strpos( $_ENV[ "OS" ], "Win" ) !== false ) { define("PATH_SEPARATOR", ";"); } else { define("PATH_SEPARATOR", ":"); } + } + +// make sure the document_root is set + $_SERVER["SCRIPT_FILENAME"] = str_replace("\\", "/", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = str_replace($_SERVER["PHP_SELF"], "", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = realpath($_SERVER["DOCUMENT_ROOT"]); + //echo "DOCUMENT_ROOT: ".$_SERVER["DOCUMENT_ROOT"]."
\n"; + //echo "PHP_SELF: ".$_SERVER["PHP_SELF"]."
\n"; + //echo "SCRIPT_FILENAME: ".$_SERVER["SCRIPT_FILENAME"]."
\n"; + +// if the project directory exists then add it to the include path otherwise add the document root to the include path + if (is_dir($_SERVER["DOCUMENT_ROOT"].'/fusionpbx')){ + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', '/fusionpbx'); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER["DOCUMENT_ROOT"].'/fusionpbx' ); + } + else { + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', ''); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER['DOCUMENT_ROOT'] ); + } + +?> \ No newline at end of file diff --git a/app/provision_editor/app_config.php b/app/provision_editor/app_config.php new file mode 100644 index 0000000000..9aa7b9165a --- /dev/null +++ b/app/provision_editor/app_config.php @@ -0,0 +1,26 @@ + \ No newline at end of file diff --git a/app/provision_editor/clip.db b/app/provision_editor/clip.db new file mode 100644 index 0000000000000000000000000000000000000000..5f15c2fb9e6b01f81d6fbfa9df77d259a1ae0126 GIT binary patch literal 2056 zcmeHIQES^U5SHq|vJSHcGeX}EH_)1G$-@{7nq>1@(S|u)=6J9&LQrF+^{}lVYps*F zcBN1Ib^Aq=>^``JjXjQ%!|(;pvaffgh4>Q1b2AG6x1yUc|!%jlbV1dP>%5m;9>2?)`aB=l^^3TG1{$(mN1*4hQ@)1ux2^zDz+k ztYy^Emi64)Hk*^-$5Eg<-&93|E|mDIZIAc#u@q6!IB%nl8rzOFQu;%pncD literal 0 HcmV?d00001 diff --git a/app/provision_editor/clipadd.php b/app/provision_editor/clipadd.php new file mode 100644 index 0000000000..7498d77045 --- /dev/null +++ b/app/provision_editor/clipadd.php @@ -0,0 +1,122 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('xml_editor_save')) { + //access granted +} +else { + echo "access denied"; + exit; +} +require_once "config.php"; + +if (count($_POST)>0) { + $clip_name = check_str($_POST["clip_name"]); + $clip_folder = check_str($_POST["clip_folder"]); + $clip_text_start = check_str($_POST["clip_text_start"]); + $clip_text_end = check_str($_POST["clip_text_end"]); + $clip_desc = check_str($_POST["clip_desc"]); + $clip_order = check_str($_POST["clip_order"]); + + $sql = "insert into v_clip_library "; + $sql .= "("; + $sql .= "clip_name, "; + $sql .= "clip_folder, "; + $sql .= "clip_text_start, "; + $sql .= "clip_text_end, "; + $sql .= "clip_desc, "; + $sql .= "clip_order "; + $sql .= ")"; + $sql .= "values "; + $sql .= "("; + $sql .= "'$clip_name', "; + $sql .= "'$clip_folder', "; + $sql .= "'$clip_text_start', "; + $sql .= "'$clip_text_end', "; + $sql .= "'$clip_desc', "; + $sql .= "'$clip_order' "; + $sql .= ")"; + $db->exec(check_sql($sql)); + unset($sql,$db); + + require_once "header.php"; + echo "\n"; + echo "Add Complete"; + require_once "footer.php"; + return; +} + + require_once "header.php"; + echo "
"; + echo "\n"; + + echo "\n"; + echo " "; + echo " "; + echo "
\n"; + + echo "
"; + echo ""; + echo " "; + echo " "; + echo " "; + echo " "; + + echo " "; + echo " "; + echo " "; + echo " "; + + echo " "; + echo " "; + echo " "; + + echo " "; + echo " "; + echo " "; + + echo " "; + echo " "; + echo " "; + + echo " "; + echo " "; + echo "
Name:
Folder:
Before Selection:
"; + echo " "; + echo "
After Selection:
"; + echo " "; + echo "
Notes:
"; + echo " "; + echo "
"; + echo "
"; + + echo "
"; + echo "
"; + +require_once "footer.php"; +?> \ No newline at end of file diff --git a/app/provision_editor/clipdelete.php b/app/provision_editor/clipdelete.php new file mode 100644 index 0000000000..bdc059d619 --- /dev/null +++ b/app/provision_editor/clipdelete.php @@ -0,0 +1,54 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('xml_editor_save')) { + //access granted +} +else { + echo "access denied"; + exit; +} +require_once "config.php"; + +$id = $_GET["id"]; +if (strlen($id)>0) { + $sql = ""; + $sql .= "delete from v_clip_library "; + $sql .= "where id = '$id' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + unset($sql,$db); +} + +require_once "header.php"; +echo "\n"; +echo "Delete Complete"; +require_once "footer.php"; +return; + +?> diff --git a/app/provision_editor/cliplist.php b/app/provision_editor/cliplist.php new file mode 100644 index 0000000000..7235d6289f --- /dev/null +++ b/app/provision_editor/cliplist.php @@ -0,0 +1,221 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('xml_editor_view')) { + //access granted +} +else { + echo "access denied"; + exit; +} +require_once "config.php"; + +echo ""; +echo ""; +echo ""; + +function isfile($filename) { + if (@filesize($filename) > 0) { return true; } else { return false; } +} + +function space($count) { + $r=''; $i=0; + while($i < $count) { + $r .= ' '; + $i++; + } + return $r; +} + +//show the content + echo ""; + + echo ""; + +echo ""; +echo ""; + + echo "
"; + echo "\n"; + echo "\n"; + echo "
\n"; + echo "
Clip Library
\n"; //display:none + + $sql = ""; + $sql .= "select * from v_clip_library "; + $sql .= "order by clip_folder "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + $result_count = count($result); + + if ($result_count > 0) { + $last_folder = ''; + $tag_open = ''; + $x = 0; + $current_depth = 0; + $previous_depth = 0; + foreach($result as $row) { + $current_depth = count(explode ("/", $row[clip_folder])); + if ($current_depth < $previous_depth) { + $count = ($previous_depth - $current_depth); + $i=0; + while($i < $count){ + echo "
\n"; + $i++; + } + echo "
\n"; + } + + if ($last_folder != $row[clip_folder]) { + $clip_folder_name = str_replace ($previous_folder_name, "", $row[clip_folder]); + $clip_folder_name = str_replace ("/", "", $clip_folder_name); + echo "
 ".$clip_folder_name."  
\n\n"; + $tag_open = 1; + } + + $previous_depth = $current_depth; + $previous_folder_name = $row[clip_folder]; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "
\n"; + echo "".$row[clip_name]."\n"; + echo "
\n"; + echo "\n\n"; + + $last_folder = $row[clip_folder]; + + if ($c==0) { $c=1; } else { $c=0; } + } //end foreach + unset($sql, $result, $row_count); + } //end if results + + echo "\n"; + echo "
\n"; + + echo "
\n"; + echo "
"; + echo "

"; + + echo ""; + echo ""; + +?> \ No newline at end of file diff --git a/app/provision_editor/clipoptions.php b/app/provision_editor/clipoptions.php new file mode 100644 index 0000000000..fec1ac5e80 --- /dev/null +++ b/app/provision_editor/clipoptions.php @@ -0,0 +1,73 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('xml_editor_view')) { + //access granted +} +else { + echo "access denied"; + exit; +} +require_once "config.php"; +require_once "header.php"; + +echo "
"; +echo "\n"; +echo ""; +echo "\n"; +echo ""; +echo "\n"; +echo "\n"; +echo "\n"; +echo "\n"; +echo "
Selected Clip:
"; + +echo " "; + +echo ""; + +echo " "; +//echo " \n"; +//echo " \n"; +//echo " \n"; + +echo " \n"; +echo " \n"; +//echo " \n"; +echo " \n"; +echo " \n"; +echo " \n"; +echo "
Options











"; + +echo "
"; +echo "
"; + +require_once "footer.php"; +?> diff --git a/app/provision_editor/clipoptionslist.php b/app/provision_editor/clipoptionslist.php new file mode 100644 index 0000000000..e6c7ff579a --- /dev/null +++ b/app/provision_editor/clipoptionslist.php @@ -0,0 +1,247 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('xml_editor_view')) { + //access granted +} +else { + echo "access denied"; + exit; +} +require_once "config.php"; + +echo ""; +echo ""; + +echo ""; + +function isfile($filename) { + if (@filesize($filename) > 0) { return true; } else { return false; } +} + +function space($count) { + $r=''; $i=0; + while($i < $count) { + $r .= ' '; + $i++; + } + return $r; +} + +//show the content + echo ""; + + echo ""; + +echo ""; +echo ""; + + echo "
"; + echo "\n"; + + echo "\n"; + echo "
\n"; + echo "
Clip Library
\n"; //display:none + + $sql = ""; + $sql .= "select * from v_clip_library "; + $sql .= "order by clip_folder "; + //$sql .= "and clip_name asc "; + + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + $result_count = count($result); + + if ($result_count == 0) { + //no results + } + else { //received results + $last_folder = ''; + $tag_open = ''; + $x = 0; + $current_depth = 0; + $previous_depth = 0; + foreach($result as $row) { + $current_depth = count(explode("/", $row[clip_folder])); + if ($current_depth < $previous_depth) { + $count = ($previous_depth - $current_depth); + $i=0; + while($i < $count){ + echo "
\n"; + $i++; + } + echo "
\n"; + + } + + if ($last_folder != $row[clip_folder]) { + $clip_folder_name = str_replace ($previous_folder_name, "", $row[clip_folder]); + $clip_folder_name = str_replace ("/", "", $clip_folder_name); + echo "
 ".$clip_folder_name."  
\n\n"; + $tag_open = 1; + } + + $previous_depth = $current_depth; + $previous_folder_name = $row[clip_folder]; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "
\n"; + echo "".$row[clip_name]."\n"; + echo "
\n"; + echo "\n\n"; + + $last_folder = $row[clip_folder]; + + if ($c==0) { $c=1; } else { $c=0; } + } //end foreach + unset($sql, $result, $row_count); + + } //end if results + + echo "\n"; + echo "
\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "
"; + + echo "

"; + echo ""; + echo ""; + +?> diff --git a/app/provision_editor/clipsearch.php b/app/provision_editor/clipsearch.php new file mode 100644 index 0000000000..c405fca466 --- /dev/null +++ b/app/provision_editor/clipsearch.php @@ -0,0 +1,187 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "config.php"; +require_once "includes/checkauth.php"; +if (permission_exists('xml_editor_view')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +if (count($_POST)>0) { + $id = $_POST["id"]; + $clip_name = $_POST["clip_name"]; + $clip_folder = $_POST["clip_folder"]; + $clip_text_start = $_POST["clip_text_start"]; + $clip_text_end = $_POST["clip_text_end"]; + $clip_desc = $_POST["clip_desc"]; + $clip_order = $_POST["clip_order"]; + + require_once "header.php"; + echo "
"; + echo "\n"; + + echo "\n"; + echo " \n"; + echo "\n"; + + } //end if results + + echo "
\n"; + echo "
"; + + $sql = ""; + $sql .= "select * from v_clip_library "; + $sql .= "where "; + if (strlen($id) > 0) { $sql .= "and id like '%$id%' "; } + if (strlen($clip_name) > 0) { $sql .= "and clip_name like '%$clip_name%' "; } + if (strlen($clip_folder) > 0) { $sql .= "and clip_folder like '%$clip_folder%' "; } + if (strlen($clip_text_start) > 0) { $sql .= "and clip_text_start like '%$clip_text_start%' "; } + if (strlen($clip_text_end) > 0) { $sql .= "and clip_text_end like '%$clip_text_end%' "; } + if (strlen($clip_desc) > 0) { $sql .= "and clip_desc like '%$clip_desc%' "; } + if (strlen($clip_order) > 0) { $sql .= "and clip_order like '%$clip_order%' "; } + + + $sql = trim($sql); + if (substr($sql, -5) == "where"){ $sql = substr($sql, 0, (strlen($sql)-5)); } + $sql = str_replace ("where and", "where", $sql); + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + $result_count = count($result); + + $c = 0; + $row_style["0"] = "background-color: #F5F5DC;"; + $row_style["1"] = "background-color: #FFFFFF;"; + + echo "
\n"; + echo "\n"; + echo ""; + + if ($result_count == 0) { //no results + echo ""; + } + else { //received results + + echo ""; + //echo ""; + echo ""; + //echo ""; + //echo ""; + //echo ""; + //echo ""; + //echo ""; + echo ""; + echo "\n"; + + foreach($result as $row) { + //print_r( $row ); + echo "\n"; + //echo ""; + echo ""; + //echo ""; + //echo ""; + //echo ""; + //echo ""; + //echo ""; + echo ""; + + echo "\n"; + if ($c==0) { $c=1; } else { $c=0; } + } //end foreach unset($sql, $result, $row_count); + + echo "
 
    Id        clip_name Search         clip_folder        clip_text_start        clip_text_end        clip_desc        clip_order   
".$row[id]."".$row[clip_name]."".$row[clip_folder]."".$row[clip_text_start]."".$row[clip_text_end]."".$row[clip_desc]."".$row[clip_order]."
\n"; + echo "
\n"; + + + echo "

"; + echo "
\n"; + echo "
"; + + echo "

"; + require_once "footer.php"; + + unset ($result_count); + unset ($result); + unset ($key); + unset ($val); + unset ($c); + +} +else { + + require_once "header.php"; + echo "
"; + echo "\n"; + + echo "\n"; + echo " "; + echo " "; + echo "
\n"; + echo "
"; + + echo "
"; + echo ""; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + echo " "; + echo " "; + echo " "; + echo "
Name:
Folder:
Start:
End:
Desc:
clip_order:
"; + echo "
"; + + echo "
"; + echo "
"; + + require_once "footer.php"; + +} //end if not post +?> diff --git a/app/provision_editor/clipupdate.php b/app/provision_editor/clipupdate.php new file mode 100644 index 0000000000..674d4cc7d1 --- /dev/null +++ b/app/provision_editor/clipupdate.php @@ -0,0 +1,142 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('xml_editor_save')) { + //access granted +} +else { + echo "access denied"; + exit; +} +require_once "config.php"; + +if (count($_POST)>0) { + $id = check_str($_POST["id"]); + $clip_name = check_str($_POST["clip_name"]); + $clip_folder = check_str($_POST["clip_folder"]); + $clip_text_start = check_str($_POST["clip_text_start"]); + $clip_text_end = check_str($_POST["clip_text_end"]); + $clip_desc = check_str($_POST["clip_desc"]); + $clip_order = check_str($_POST["clip_order"]); + + //sql update + $sql = "update v_clip_library set "; + $sql .= "clip_name = '$clip_name', "; + $sql .= "clip_folder = '$clip_folder', "; + $sql .= "clip_text_start = '$clip_text_start', "; + $sql .= "clip_text_end = '$clip_text_end', "; + $sql .= "clip_desc = '$clip_desc', "; + $sql .= "clip_order = '$clip_order' "; + $sql .= "where id = '$id' "; + $count = $db->exec(check_sql($sql)); + //echo "Affected Rows: ".$count; + + + //edit: make sure the meta redirect url is correct + require_once "header.php"; + echo "\n"; + echo "Update Complete"; + require_once "footer.php"; + return; +} +else { + //get data from the db + $id = $_GET["id"]; + + $sql = ""; + $sql .= "select * from v_clip_library "; + $sql .= "where id = '$id' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach ($result as &$row) { + $clip_name = $row["clip_name"]; + $clip_folder = $row["clip_folder"]; + $clip_text_start = $row["clip_text_start"]; + $clip_text_end = $row["clip_text_end"]; + $clip_desc = $row["clip_desc"]; + $clip_order = $row["clip_order"]; + break; //limit to 1 row + } + echo ""; + echo "
";} + + require_once "header.php"; + echo "
"; + echo "\n"; + + echo "\n"; + echo " "; + echo " "; + echo "
\n"; + + echo "
"; + echo ""; + echo " "; + echo " "; + echo " "; + echo " "; + + echo " "; + echo " "; + echo " "; + echo " "; + + echo " "; + echo " "; + echo " "; + + echo " "; + echo " "; + echo " "; + + echo " "; + echo " "; + echo " "; + + echo " "; + echo " "; + echo " "; + echo "
Name:
Folder:
Before Selection:
"; + echo " "; + echo "
After Selection:
"; + echo " "; + echo "
Notes:
"; + echo " "; + echo "
"; + echo " "; + echo " "; + echo "
"; + echo "
"; + + echo "
"; + echo "
"; + + require_once "footer.php"; +?> diff --git a/app/provision_editor/config.php b/app/provision_editor/config.php new file mode 100644 index 0000000000..9806b236e7 --- /dev/null +++ b/app/provision_editor/config.php @@ -0,0 +1,176 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ + +include "root.php"; + +error_reporting (E_ALL ^ E_NOTICE); + +$applicationname = 'Edit'; +$bodyoptions = ""; + +$dbfilename = "clip.db"; +$db_file_path = PROJECT_PATH."/xml_edit/"; + +//$temp = $_ENV["TEMP"]."\\"; +if (is_writable($db_file_path.$dbfilename)) { //is writable + //use database in current location + echo "yes"; +} +else { //not writable + /* + //running from a non writable location so copy to temp directory + if (file_exists($temp.$dbfilename)) { + $db_file_path = $temp; //file already exists use existing file + } + else { //file doese not exist + //copy the file to the temp dir + if (copy($db_file_path.$dbfilename, $temp.$dbfilename)) { + //echo "copy succeeded.\n"; + $db_file_path = $temp; + } + else { + echo "Copy Failed "; + exit; + } + } + */ +} + +function get_string_between($string, $start, $end){ + $string = " ".$string; + $ini = strpos($string,$start); + if ($ini == 0) return ""; + $ini += strlen($start); + $len = strpos($string,$end,$ini) - $ini; + return substr($string,$ini,$len); +} + +//$fullstring = "this is my [tag]dog[/tag]"; +//$parsed = get_string_between($fullstring, "[tag]", "[/tag]"); + +//database connection +try { + //$db = new PDO('sqlite2:example.db'); //sqlite 2 + //$db = new PDO('sqlite::memory:'); //sqlite 3 + if (!function_exists('phpmd5')) { + function phpmd5($string) { + return md5($string); + } + } + if (!function_exists('phpmd5')) { + function phpunix_timestamp($string) { + return strtotime($string); + } + } + if (!function_exists('phpnow')) { + function phpnow() { + return date('r'); + } + } + + if (!function_exists('phpleft')) { + function phpleft($string, $num) { + return substr($string, 0, $num); + } + } + + if (!function_exists('phpright')) { + function phpright($string, $num) { + return substr($string, (strlen($string)-$num), strlen($string)); + } + } + + if (!function_exists('phpsqlitedatatype')) { + function phpsqlitedatatype($string, $field) { + + //--- Begin: Get String Between start and end characters ----- + $start = '('; + $end = ')'; + $ini = stripos($string,$start); + if ($ini == 0) return ""; + $ini += strlen($start); + $len = stripos($string,$end,$ini) - $ini; + $string = substr($string,$ini,$len); + //--- End: Get String Between start and end characters ----- + + $strdatatype = ''; + $stringarray = split (',', $string); + foreach($stringarray as $lnvalue) { + + //$strdatatype .= "-- ".$lnvalue ." ".strlen($lnvalue)." delim ".strrchr($lnvalue, " ")."---
"; + //$delimpos = stripos($lnvalue, " "); + //$strdatatype .= substr($value,$delimpos,strlen($value))." --
"; + + $fieldlistarray = split (" ", $value); + //$strdatatype .= $value ."
"; + //$strdatatype .= $fieldlistarray[0] ."
"; + //echo $fieldarray[0]."
\n"; + if ($fieldarray[0] == $field) { + //$strdatatype = $fieldarray[1]." ".$fieldarray[2]." ".$fieldarray[3]." ".$fieldarray[4]; //strdatatype + } + unset($fieldarray, $string, $field); + } + + //$strdatatype = $string; + return $strdatatype; + } + } //end function + +/* + $db = new PDO('sqlite:'.$db_file_path.$dbfilename); //sqlite 3 + //bool PDO::sqliteCreateFunction ( string function_name, callback callback [, int num_args] ) + $db->sqliteCreateFunction('md5', 'phpmd5', 1); + //$db->sqliteCreateFunction('unix_timestamp', 'phpunix_timestamp', 1); + $db->sqliteCreateFunction('now', 'phpnow', 0); + $db->sqliteCreateFunction('sqlitedatatype', 'phpsqlitedatatype', 2); + $db->sqliteCreateFunction('strleft', 'phpleft', 2); + $db->sqliteCreateFunction('strright', 'phpright', 2); +*/ +} +catch (PDOException $error) { + print "error: " . $error->getMessage() . "
"; + die(); +} + +if(!function_exists('escapejs')){ + function escapejs($strtemp) { + $strtemp = str_replace ("\"", "\\\"", $strtemp); //escape the single quote + //$strtemp = str_replace ("'", "''", $strtemp); //escape the single quote + return $strtemp; + } +} + +if(!function_exists('check_str')){ + function check_str($strtemp) { + //$strtemp = str_replace ("\$", "\\\$", $strtemp); //escape the single quote + //$strtemp = str_replace ("\'", "''", $strtemp); //escape the single quote + $strtemp = str_replace ("'", "''", $strtemp); //escape the single quote + //echo "strtemp $strtemp"; + return $strtemp; + } +} + +?> diff --git a/app/provision_editor/filedelete.php b/app/provision_editor/filedelete.php new file mode 100644 index 0000000000..a45796b4d4 --- /dev/null +++ b/app/provision_editor/filedelete.php @@ -0,0 +1,87 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('xml_editor_save')) { + //access granted +} +else { + echo "access denied"; + exit; +} +require_once "config.php"; + +$folder = $_GET["folder"]; +$folder = str_replace ("\\", "/", $folder); +if (substr($folder, -1) != "/") { $folder = $folder.'/'; } +$file = $_GET["file"]; + +//echo $folder.$file; + +if (strlen($folder) > 0 && strlen($file) > 0) { + unlink($folder.$file); + header("Location: fileoptions.php"); +} +else { + //display form + require_once "header.php"; + echo "
"; + echo "
"; + echo "
"; + echo ""; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo "
Path:
".$folder.$file."
"; + + echo "
"; + + echo ""; + echo " "; + echo " "; + echo " "; + + echo " "; + echo " "; + echo " "; + + echo " "; + echo " "; + echo " "; + echo "
File Name:
"; + echo " "; + echo " "; + echo "
"; + echo "
"; + echo "
"; + + require_once "footer.php"; +} +?> diff --git a/app/provision_editor/filelist.php b/app/provision_editor/filelist.php new file mode 100644 index 0000000000..613ec9524a --- /dev/null +++ b/app/provision_editor/filelist.php @@ -0,0 +1,239 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('xml_editor_view')) { + //access granted +} +else { + echo "access denied"; + exit; +} +require_once "app/xml_edit/config.php"; +require_once "app/xml_edit/header.php"; + +function isfile($filename) { + //if (@filesize($filename) > 0) { return true; } else { return false; } +} + +function space($count) { + $r=''; $i=0; + while($i < $count) { + $r .= ' '; + $i++; + } + return $r; +} + +function recur_dir($dir) { + clearstatcache(); + $htmldirlist = ''; + $htmlfilelist = ''; + $dirlist = opendir($dir); + $dir_array = array(); + while (false !== ($file = readdir($dirlist))) { + if ($file != "." AND $file != ".."){ + $newpath = $dir.'/'.$file; + $level = explode('/',$newpath); + if (substr($newpath, -4) == ".svn") { + //ignore .svn dir and subdir + } + elseif (substr($newpath, -3) == ".db") { + //ignore .db files + } + else { + $dir_array[] = $newpath; + } + if ($x > 1000) { break; }; + $x++; + } + } + + asort($dir_array); + foreach ($dir_array as $newpath){ + $level = explode('/',$newpath); + + if (is_dir($newpath)) { + /*$mod_array[] = array( + 'level'=>count($level)-1, + 'path'=>$newpath, + 'name'=>end($level), + 'type'=>'dir', + 'mod_time'=>filemtime($newpath), + 'size'=>''); + $mod_array[] = recur_dir($newpath); + */ + $dirname = end($level); + $htmldirlist .= space(count($level))."
$dirname
\n"; + $htmldirlist .= recur_dir($newpath); + $htmldirlist .= space(count($level))."
\n"; + } + else { + /*$mod_array[] = array( + 'level'=>count($level)-1, + 'path'=>$newpath, + 'name'=>end($level), + 'type'=>'file', + 'mod_time'=>filemtime($newpath), + 'size'=>filesize($newpath)); + */ + $filename = end($level); + $filesize = round(filesize($newpath)/1024, 2); + $htmlfilelist .= space(count($level))."
$filename
\n"; + $htmlfilelist .= space(count($level))."
\n"; + } + } + closedir($dirlist); + return $htmldirlist ."\n". $htmlfilelist; +} + +//begin the content + echo ""; + + echo ""; + + echo "
"; + echo "\n"; + + echo "\n"; + echo " \n"; + echo "\n"; + echo "
\n"; + echo "\n"; + echo "
Files
\n"; //display:none + + echo recur_dir($_SERVER["DOCUMENT_ROOT"].PROJECT_PATH."/includes/templates/provision/"); + + echo "
\n"; + + echo "
\n"; + echo "
"; + + echo "

"; + require_once "footer.php"; + + echo ""; + echo ""; + +?> diff --git a/app/provision_editor/filenew.php b/app/provision_editor/filenew.php new file mode 100644 index 0000000000..c6d49568af --- /dev/null +++ b/app/provision_editor/filenew.php @@ -0,0 +1,90 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('xml_editor_save')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +$folder = $_GET["folder"]; +$folder = str_replace ("\\", "/", $folder); +if (substr($folder, -1) != "/") { $folder = $folder.'/'; } +$file = $_GET["file"]; + +if (strlen($folder) > 0 && strlen($file) > 0) { + //create new file + $handle = fopen($folder.$file, 'wb') or die("Error!!"); + $content = ""; + fwrite($handle, $content); + fclose($handle); + + header("Location: fileoptions.php"); +} +else { + require_once "header.php"; + echo "
"; + echo "
"; + echo "
"; + echo ""; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo "
Path:
".$folder.$file."
"; + + echo "
"; + + echo ""; + echo " "; + echo " "; + echo " "; + + echo " "; + echo " "; + echo " "; + + echo " "; + echo " "; + echo " "; + echo "
File Name:
"; + echo " "; + echo " "; + echo "
"; + echo "
"; + echo "
"; + + require_once "footer.php"; + +} + +?> diff --git a/app/provision_editor/fileoptions.php b/app/provision_editor/fileoptions.php new file mode 100644 index 0000000000..208cff3600 --- /dev/null +++ b/app/provision_editor/fileoptions.php @@ -0,0 +1,89 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('xml_editor_view')) { + //access granted +} +else { + echo "access denied"; + exit; +} +require_once "config.php"; +require_once "header.php"; + +$file = $_GET["file"]; +$file = str_replace ("\\", "/", $file); +$folder = $_GET["folder"]; +$folder = str_replace ($file, "", $folder); + +$urlpath = str_replace ($_SERVER["DOCUMENT_ROOT"], "", $folder); + +echo "
"; +echo "\n"; +echo ""; +echo "\n"; +echo "\n"; + +echo "\n"; +echo "\n"; +echo "\n"; +echo "\n"; +echo "
"; + +echo ""; +echo ""; +echo "\n"; +echo "\n"; +echo ""; +echo "
Path:
File:
"; + +echo "
"; + +echo " "; + +echo ""; + +echo "
"; +echo ""; +echo " \n"; +echo " \n"; +echo " \n"; +echo " \n"; +echo " \n"; +echo " \n"; +echo " \n"; +echo "





"; +echo "
"; + +echo "
"; +echo "
"; + +require_once "footer.php"; +?> diff --git a/app/provision_editor/fileoptionslist.php b/app/provision_editor/fileoptionslist.php new file mode 100644 index 0000000000..46994251ef --- /dev/null +++ b/app/provision_editor/fileoptionslist.php @@ -0,0 +1,270 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('xml_editor_view')) { + //access granted +} +else { + echo "access denied"; + exit; +} +require_once "config.php"; +require_once "header.php"; + +function isfile($filename) { + if (@filesize($filename) > 0) { return true; } else { return false; } +} + +function space($count) { + $r=''; $i=0; + while($i < $count) { + $r .= ' '; + $i++; + } + return $r; +} + +function recur_dir($dir) { + clearstatcache(); + $htmldirlist = ''; + $htmlfilelist = ''; + $dirlist = opendir($dir); + while ($file = readdir ($dirlist)) { + if ($file != '.' && $file != '..') { + $newpath = $dir.'/'.$file; + $level = explode('/',$newpath); + + if (is_dir($newpath)) { + /*$mod_array[] = array( + 'level'=>count($level)-1, + 'path'=>$newpath, + 'name'=>end($level), + 'type'=>'dir', + 'mod_time'=>filemtime($newpath), + 'size'=>''); + $mod_array[] = recur_dir($newpath); + */ + $dirname = end($level); + $htmldirlist .= space(count($level))."
$dirname
\n"; + //$htmldirlist .= space(count($level))."
Tools
\n"; + //$htmldirlist .= space(count($level))."
New Folder
\n"; //parent.document.getElementById('file').value='".urlencode($newpath)."' + //$htmldirlist .= space(count($level))."
\n"; + //$htmldirlist .= space(count($level))."
New File
\n"; //parent.document.getElementById('file').value='".urlencode($newpath)."' + //$htmldirlist .= space(count($level))."
\n"; + //$htmldirlist .= space(count($level))."
\n"; + //$htmldirlist .= space(count($level))."
Options
\n"; //parent.document.getElementById('file').value='".urlencode($newpath)."' + //$htmldirlist .= space(count($level))."
\n"; + $htmldirlist .= recur_dir($newpath); + $htmldirlist .= space(count($level))."
\n"; + + } + else { + /*$mod_array[] = array( + 'level'=>count($level)-1, + 'path'=>$newpath, + 'name'=>end($level), + 'type'=>'file', + 'mod_time'=>filemtime($newpath), + 'size'=>filesize($newpath)); + */ + $filename = end($level); + $filesize = round(filesize($newpath)/1024, 2); + $newpath = str_replace ($filename, "", $newpath); + $htmlfilelist .= space(count($level))."
$filename
\n"; + $htmlfilelist .= space(count($level))."
\n"; + } + + + } + } + + closedir($dirlist); + return $htmldirlist ."\n". $htmlfilelist; +} + +//show the content + echo "\n"; + + echo "\n"; + + echo "
"; + echo "\n"; + echo "\n"; + echo "
\n"; + //echo "
"; + + echo "\n"; + echo " \n"; + echo "\n"; + echo "
Files
\n"; //display:none + //echo "
Files
\n"; //display:none + + //echo "
Tools
\n"; + //echo "
New Folder
\n"; //parent.document.getElementById('file').value='".urlencode($newpath)."' + //echo "
\n"; + //echo "
New File
\n"; //parent.document.getElementById('file').value='".urlencode($newpath)."' + //echo "
\n"; + //echo "
\n"; + echo recur_dir($_SESSION['switch']['conf']['dir']); + + echo "
\n"; + + /* + echo "
Files
\n"; + echo "\n"; + echo "
Folder 1
\n"; + echo "\n"; + echo "
demo1.php
\n"; + echo "
\n"; + echo "\n"; + echo "
demo2.php
\n"; + echo "
\n"; + echo "\n"; + echo "
\n"; + echo "\n"; + echo "
Folder 2
\n"; + echo "\n"; + echo "
demo3.php
\n"; + echo "
\n"; + echo "\n"; + echo "
demo4.php
\n"; + echo "
\n"; + echo "\n"; + echo "
\n"; + echo "\n"; + echo "
\n"; + */ + + echo "
\n"; + echo ""; + + echo "

"; + require_once "footer.php"; + + echo ""; + echo ""; + +?> diff --git a/app/provision_editor/fileread.php b/app/provision_editor/fileread.php new file mode 100644 index 0000000000..3885abaded --- /dev/null +++ b/app/provision_editor/fileread.php @@ -0,0 +1,48 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +if (permission_exists('xml_editor_view')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +$filename = $_POST["file"]; +$filename = str_replace ("\\", "/", $filename); + +$handle = fopen($filename, "r"); +if ($handle) { + while (!feof($handle)) { + $buffer = fgets($handle, 4096); + echo $buffer; + } + fclose($handle); +} + +?> diff --git a/app/provision_editor/filerename.php b/app/provision_editor/filerename.php new file mode 100644 index 0000000000..9df4307c57 --- /dev/null +++ b/app/provision_editor/filerename.php @@ -0,0 +1,102 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('xml_editor_save')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +$folder = $_GET["folder"]; +//$folder = str_replace ("\\", "/", $folder); +//if (substr($folder, -1) != "/") { $folder = $folder.'/'; } +$newfilename = $_GET["newfilename"]; +$filename = $_GET["filename"]; +//echo $folder.$file; + + +if (strlen($folder) > 0 && strlen($newfilename) > 0) { + //echo "new file: ".$newfilename."
"; + //echo "folder: ".$folder."
"; + //echo "orig filename: ".$filename."
";; + rename($folder.$filename, $folder.$newfilename); + header("Location: fileoptions.php"); +} +else { //display form + + require_once "header.php"; + echo "
"; + echo "
"; + echo "
"; + echo ""; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo "
Path:
".$folder.$filename."

Original file name:
".$filename."
"; + + echo "
"; + + echo ""; + echo " "; + echo " "; + echo " "; + + echo " "; + echo " "; + echo " "; + + echo " "; + echo " "; + echo " "; + echo "
Rename file to:
"; + echo " "; + echo " "; + echo " "; + echo "
"; + echo "
"; + echo "
"; + + require_once "footer.php"; + +} + +?> diff --git a/app/provision_editor/filesave.php b/app/provision_editor/filesave.php new file mode 100644 index 0000000000..0d19eaab53 --- /dev/null +++ b/app/provision_editor/filesave.php @@ -0,0 +1,50 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('xml_editor_save')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +$filename = $_POST["file"]; //filename with the path +$filename = str_replace ("\\", "/", $filename); +$content = $_POST["content"]; + +$handle = fopen($filename, 'wb') or die("Error!!"); +fwrite($handle, $content); +fclose($handle); + +//set the reload_xml value to true + $_SESSION["reload_xml"] = true; + +echo $content; + +?> diff --git a/app/provision_editor/folderdelete.php b/app/provision_editor/folderdelete.php new file mode 100644 index 0000000000..97c2592ea8 --- /dev/null +++ b/app/provision_editor/folderdelete.php @@ -0,0 +1,46 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('xml_editor_save')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +$folder = $_GET["folder"]; +$folder = str_replace ("\\", "/", $folder); + +if (strlen($folder) > 0) { + //delete the folder + rmdir($folder); //, 0700 + header("Location: fileoptions.php"); +} + +?> \ No newline at end of file diff --git a/app/provision_editor/foldernew.php b/app/provision_editor/foldernew.php new file mode 100644 index 0000000000..922d8eb5a2 --- /dev/null +++ b/app/provision_editor/foldernew.php @@ -0,0 +1,86 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('xml_editor_save')) { + //access granted +} +else { + echo "access denied"; + exit; +} +require_once "config.php"; + +$folder = $_GET["folder"]; +$folder = str_replace ("\\", "/", $folder); +$foldername = $_GET["foldername"]; + +if (strlen($folder) > 0 && strlen($foldername) > 0) { + //create new folder + mkdir($folder.'/'.$foldername); //, 0700 + header("Location: fileoptions.php"); +} +else { //display form + + require_once "header.php"; + echo "
"; + echo "
"; + echo "
"; + echo ""; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo "
Path:
".$folder."
"; + + echo "
"; + + echo ""; + echo " "; + echo " "; + echo " "; + + echo " "; + echo " "; + echo " "; + + echo " "; + echo " "; + echo " "; + echo "
Folder Name:
"; + echo " "; + echo " "; + echo "
"; + echo "
"; + echo "
"; + + require_once "footer.php"; +} + +?> diff --git a/app/provision_editor/footer.php b/app/provision_editor/footer.php new file mode 100644 index 0000000000..b11f46e5d4 --- /dev/null +++ b/app/provision_editor/footer.php @@ -0,0 +1,43 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +/* +echo "

"; +echo "
"; + +echo ""; +echo "fusionpbx "; +echo "        "; +echo "http://fusionpbx.com"; +echo "        "; +echo "Author: Mark J. Crane "; + +echo ""; +*/ +echo "
"; +echo ""; +echo ""; + +?> \ No newline at end of file diff --git a/app/provision_editor/header.php b/app/provision_editor/header.php new file mode 100644 index 0000000000..bd10f557d3 --- /dev/null +++ b/app/provision_editor/header.php @@ -0,0 +1,83 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ + +echo ""; +echo ""; +echo ""; +//echo ""; +echo ""; + + +echo ""; +echo ""; +echo ""; +echo "
"; + +?> \ No newline at end of file diff --git a/app/provision_editor/images/file.gif b/app/provision_editor/images/file.gif new file mode 100644 index 0000000000000000000000000000000000000000..a6cf9845fc08946fec699ebd53e5ddab17a54b55 GIT binary patch literal 96 zcmZ?wbhEHb$ vYvT)M8Jjhc5mRKHo@+i;pCsDVl=ga7fjYm=-g)K|Zf~tJ>2z)dYPALcomU^m literal 0 HcmV?d00001 diff --git a/app/provision_editor/images/file.png b/app/provision_editor/images/file.png new file mode 100644 index 0000000000000000000000000000000000000000..33b5f5f37461bbc6045d4cef96ba2125c4e9b256 GIT binary patch literal 434 zcmV;j0ZsmiP)uaf2v`Q{?Wj` zolMeZbD4;Gy{&Gi?KsW?6A=+P>>rC&Ve~E{qfvNqd3|^Pkfv!4vHfruMrKEGOhj6{ zn_bUwmWIQdEXxds>m6(DZmh382QNVo6a+P$Ywe0qk|c$u$H}zBJ2^ckA^;3LKKZ*l z+XX@VQ5JOCErwY*ySgpM8jjO~jnx&U*c5>2SLGkxECHC6Vpc|?m|>$c!E5q4r=u}r zE2R`O04&g4@I8-NF$0|2VP+ex`~v`h82}qY)s(ryH%a1`;Ul8G{e!$y4XKR!PG|DpT-{reY}_-t#}`2YX^``4}iKh2doeVSihwfuk8^5y;O**UyG^BIO3Q2fclD#GBxpaXI^C{7sImo>OF zHMg|3wRd#3DhUeev+}5P2+FHWljakc)G8>WAthy_VybSmj8oQ3Mo>X_ovxa}v}q#F z!pwq<3QYEz`}Rq&8HtN4YqDGDZ9c6c#_c4hsU_&J;Mz4SULgki%jQzL){h=D8sEOF zX|C&N_4XadGX^6qHdQP3A3r6vO@wql8+oM!IBrPjWBVJ?B2l=o-C15hyJE%(B{oJr Sel>v`CpJEIV{K$$um%8JN5t*` literal 0 HcmV?d00001 diff --git a/app/provision_editor/images/gear.png b/app/provision_editor/images/gear.png new file mode 100644 index 0000000000000000000000000000000000000000..1adf1e778f6316dd9c926465783631b6222f9bc6 GIT binary patch literal 822 zcmV-61Ihe}P)eo} zK~#9!)so9=6j>O>&#kJis;+*et4$>x6Dtvwi6-j82co!91Q*$)vk`ftifVKj7JYhr@yM@dJK) zv0se~7yeYbw|1p;L$^w$(!8o_a9!7qIj@hr8(HeV_?KLr*H$08VKBFST}Ml?<& z2ZE*gIRf$4wXGMUC>pBPs<#q)Vw^{u{`V?`*6Mhs{v77x=(lo(?yozAr1zyF}u_x-oS z!$adYu3wWH0PNep-)eN6BW}BUCTS*N8fFU*IpR1b0+_0*OxKOJjT<(dT@FJSoGXW2BC+Oau#;gW$(}rOcxczVAPonw+WufC>Pf=ZS1K_wD=l z`S*UM^2uplyVB^xn;&Len@O6Cbt`LH6+_d>5=dqefrRVz2pLI4W)`pa1{>07*qoM6N<$f$y4XKR!PG|DpT-{reY}_-t#}`2YX^``4}iKh2doeVSihwfuk8^5y;O**UyG^BIO3Q2fclD#GBxpaXI^C{7sImo>OF zHMg|3wRd#3DhUeev+}5P2+FHWljakc)G8>WAthy_VybSmj8oQ3Mo>X_ovxa}v}q#F z!pwq<3QYEz`}Rq&8HtN4YqDGDZ9c6c#_c4hsU_&J;Mz4SULgki%jQzL){h=D8sEOF zX|C&N_4XadGX^6qHdQP3A3r6vO@wql8+oM!IBrPjWBVJ?B2l=o-C15hyJE%(B{oJr Sel>v`CpJEIV{K$$um%8JN5t*` literal 0 HcmV?d00001 diff --git a/app/provision_editor/images/minus.gif b/app/provision_editor/images/minus.gif new file mode 100644 index 0000000000000000000000000000000000000000..1094ab912b8bb9b8e457364e0a200b2364ab03fb GIT binary patch literal 124 zcmV-?0E7QWNk%w1VF>^U0J8u9!nvt_oVfS)^njkZ?Ca(K|Nqa(yZ!z9+SSVd008mv z?6}C+OEI5}ij{m|i2qdX6 eqL8fXBPt3ZGliKs5{uIv@gM1_O&;L91u8iN$P#Df)7TJT8#}oW??~ hx9yTADX<=5Q2xxo`aq_+!TExQ8Ot=TR6#}tYXC82HyZ!| literal 0 HcmV?d00001 diff --git a/app/provision_editor/images/program.gif b/app/provision_editor/images/program.gif new file mode 100644 index 0000000000000000000000000000000000000000..dc3dfa11044671bd33ce9778d7a10254fe748f00 GIT binary patch literal 61 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 literal 0 HcmV?d00001 diff --git a/app/provision_editor/images/thumbnails/cliplibrary.png b/app/provision_editor/images/thumbnails/cliplibrary.png new file mode 100644 index 0000000000000000000000000000000000000000..bc70f332fd4c8d15111d9a5fc1d66d0ea165b724 GIT binary patch literal 20544 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

$J8swmWDRg_n-OvxL>-lX%W==<7{8 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%0D7Ft}=jT|(_b=-2O+!;TxGQVlvad4Znn2q2 zH&@F8h?C|1=dPJ)?Wz1rOywAFtS~)0Wzh>q>jmx|R4;+6elqe?l)-=k z4aJ$h)W@ZNv3yy7wN&1=W`|PecWOq-gDAgMd1KA1R=oL?tjq_Eo{jaNZz&CW)6J=g z$?hL`?$i2YJlN^{%dw&qW2}>GQqo(tR?3r$K)3D%>x+eC z_tj{fXw_CCR#z#5RK)OAll<*D=hWLFlXJamapNg9!T~YLbFyvTdRuSj^UTi0hn^L= z^G7QR)TATp72;HlE`!30Ez9{y>pnqcoo^s|7f;U9cZQuh`x0z^I9Ak6;C`6<9iBzC zK{d7xbZ|Xhf{lTfVOj{zS`0l83(IkVIj8N3h;+VrZcS>t>GQ+i;|{gDxlPSOVwBD( z=h>eytO=OU3~t0+Rn1(*Y>r(`bJLrbPRdM7bXuMB$A=dl zy6^4RiT@4?$U?`nAe!Z}CW^m8d-$U6pmHAE3^u26ZW5chE!%I6UjZ96U8lbmnTQp| z4XkPX@y)1fCAr0pIIAdccg7k=fSCw50|w2*wo+t@N&sf1%xRh<3(BcWz(n`9DEuB>bA zN~~l$imfU9qGfhh85M}4pz-q!WNtYKXsdKldSQZTnwEE6+EyxCJb3oOf7GvId4I~z zirBbv<+kd%`ZCm1R;3)v+P5jKoQ0r#v@dR6p^3AKaC2%~wQ>C^Q0Y>s$2y)Fza=Ya zKYsj4v&&>{C7Yj*lf6GPZA;d>Ih=>_KX&7Qv(ak3%lP>XB31F3ZJSp6p&kEHYxq(R zEg5SWmdXshm4@F>0(k>>=K{)38zF0c1N-+U>GvS-{d&^otF^5`i=)M|yakkUg>Nmjz}3Su8ZL4B`tkY26OYAS zM@>oIch0VoD?wuUuEX2B{ss9DId^0rWPv89mJFL$+SaD2oTS%{wXG(vPSk8$oy%XX zU?-L5c1zm|PqP#MJQUrSajlNpCl4LcDs8*!mE%iB2BEWi67`pvU|K-Q(#6acJlHs? z-a)9Q@&;V4>*M-S{#Jg{KkrsIW?ri!&tpzRMR2xP3@Lohlec}X!ysAK+JSP;ecs2G zOJ0L@k4A3bNlb1`8~JtbGTejgevXrmq-tRMwwy`x0iOQ~2`$N!r(H_wvvB1A&-jv- zLXDfyB+tKYp!=>qj~118w3!zqc6<}IlXl$uQA53cZF=+eL`MNAJ-7vF=Oc+3xK^Fy z{-EQ&&gH5;FGJH=rHIz?u<@D|jVdQ0aht)3LwIvKe8eKx=<2q_JICO0^pqWE@$bDC zA@o<_`LnIlXU|(lm(_=iBt^omQUS#Ps>*rONQeSxxXW4u+tb{x+l*8QC@M8xoyEU_ z8{@CUTK@45*1n5fP|w%z5icV>DwQf@5eRRzz=fy>Z<3luEuUqUBgU z>cp9;GSV}Ce-Ig;inpWWbM83KrOh!qobsVQefq*~Ji?3lt@z|mQ`u3>j8kwHuea=C zf~}hK?z_@_+ieahcXG~%PuKkPTCUz~7ZZ%UZ#|sc*pz8x#CciyOMMynfd*{O&XQQk z_n&wF*&#&Og3cF+wxsoJ)y!tOd*tubOVVx*%T(=jJC7@svBesv4^!2V@1V zQ*>WI6P1^Fw6*HHo!xNH5|$pJ;v~u)>k+?VWLNcaUZ>*ka{sp$z`A()G~6}LWym=q z+pDeg=#&aK`JSc9@j9aXJyxO7YZcL(;Eul3ynkh@!LhW1BxYWzuAROpb{B)3LJIP; z$tz&w)P?_M5uBeyf9uAVb%kQ%8s7G<%9+ftUN(;Bxx~x&t|Z)n^q*iPW8UC(CluxA zukLGxcd4 z85(teon%)>x6JMz)U4e~t)#O^ww?hJub_s+h!H7=>j+w0KCRiq+LHD_82y%}&P$xi zY^}+O-YM+`D<)GSW5=H%j$k*4Q~4}45T#1)Xsh*%)8=!Q=CLM!DKEw^G4y5aXxErs z;s{0cYP6hlpjy}Lfznk}VfU|qG7G9|(_z%G*zR=jF0Klr*PSoT*ZEJp%RcN|E-dAfRGRNwE6 zIg(_edO3Eic)}M}TW{X8W$BbPU>y4?>1v;zfoX4=Qn$5BLi!tzi{VxSDsk128q!=q z#g4x@w`TPneiOfZofj*+KI!sbQz!4^*1TSJb!U!4pS+d)BQNEUsWKIJI-FGo6pFkj z3SgH(JWibho8}lhuUGFVb?v2Ha7px#8-mDh_qm0+^nCh;w42n+yGQ#uQ%jwQupyun zf7A!dZWG;6P^!XZ*txgS97;-8@uU9~mcQ!}f z^tfG#&UFbGqoQe$v6E5gIb#{AaayKRGj0 zF`b9yP81R~veFwO;>!?!R?<$m65Q8&Rc70kpR;}U6sf)C4k>0>ZE`qUFlu`HV`Y5H zjaOdT-n8IuyB|`!`@E*zY7pRQbtRl*b%~ZoN#bbxyt%b=oGJIaVx{Sh=x#pgHxqPa zgd%k@zha$(ZXC;7)85`*{wGJDY$P&HQn?C-h2<`|7{}`x{c=wz!0(C@jdY}qIZ{R! zopY~RE90>xZ@Rr`=N2gaOCH;gM=>{UUQZdd-=qcRxl|abT^Iz_-zr+Vr;e~4BYMd@ zcNw5AevE~?i&bK+_D^Gn#1|f~yI_xLwd3Jo(&;p<>79`5Ya&3Vn)j_vSiSYkTJ5qO zdn5t}t2mG~_vzMWa5G-QB59n?p%~De*ThEwNK$3W);e*4>CSV``ZPm2o2X7tlw2#1 z=5c=fs?|%lxK^v#fOQ9--TRwXnwUa%XUsDe<~9>p6_hs-v)`aWc^?DV~xUj%)fU zKU<$!5;vx`%!7LOlErhq*}1vU3)qp2d(N(Y-6#6E*`bQLmb~6Bjl|^AnL3Ma^F$w$ zYODGp;ceh#Q39|WO@(8j!8~8y$6`opH8F^pm z7?#O6eFMS`D$$oYiocZ5Fo{P?;&GDVXOE#PlNO0+($zTr?dcn%K8!#|tlg!Y>UhBR zjGk1;0|Me=)W!3U?!1~6T5j&IacrL^Nx#}9+~=ect$AWcU+b8B*RG94!+9c-I=5Ua z{^GUmaV{Yis&QoWJms!&AU6sM;p=pn30WFu_`0{^8Gd%#c(3}m0$FVPWJ$(xK+EDGzYP7rXGDFBgAX_o?vVD%&K|b3`VM zj;z7hKDnIDe6n-88^~h8 z`Cpccjw=wy4^q=gq2MsgZ~yYYg!V_PeLLoq*1}A{FSjGcx^iAgqMQi(()|Q$1tzm|gd+Oqp zaWDLsF#FER&o{g*_CE~f(m)lf~w2wg-A?6_H&k5>XM(g%9~V^EVMMu zZ3vxr5Nc-W3Hzfb?L_6-*gk5o%~~f zChk^uvSp}NT&jlcPl9R^`08!g0q42Hwo!Yo{+&gOkiay{F_`N(Ea+7&Y4|UmH;JC; z_9_@y7{E~h6Izzlm+o@ywb#)}A~TR$%?vtFk}~e-EH3{Ylvr3{B4%LBh2G#Z^VhD| ztG_a9*!sq;Jo^d#rgK+@d9p5VrQ$@n zdLl_91BTs%qncUk-fG3?a|%{4PWU4=L*f62N|+HH!|S^CWm1U#KQ01YkG6Hp#Bmto z|ERF7h$>{lxmt-aJWsEz6f{v=l;dK4kV!F@#)6)Oc}z`M>h0SS42Z!>m3jSL-(WmU zGBWi8_a!NwA^97hOLNlQXU)aZ>12Koa~YMriil+t)zRVu8Ufe6SG5D5Ur_avL%gN{ z@vmuHDiyJz!(Ni@Ya+Qie$bxxpP;AS(L1z(rU97-w4^t;U=v8g*Rp71~=l!~UU|}jQRrN^DH&OIl;;Ek(EGlry zvgf@393Af^0ZwCqJhu$mJtGZv2WuXdZr#^`R#VaRr!0-J?}F!^k04#X@>X9mI{ZN>H9)Cx*-QTra|+&;mbr-!W6X>A+=-s&Wl1S!(I_o@?5z<5s!uU2 zr`MXwQ#DN?Mw{@AV$t*e#7mVD1QgriZw*UT8Rk;s1$Cu`rSs`i3UodZo#*M0oMZ5| z-*-}!wr}YqoA`h!*Wkx*OTcVo2F&)oB(&JoPL3cZyp6JW?9TuP-j}ku2A3udL_2xl#^Mvue1*V&>RE6oW2Dk{s%%W@f9ann_;m!R3M^~X)B1W?pc+dG1;y3d$3 z5?cGCDpZ6qx^)XJ*)y~q)hv?G+C zQM!NFsmloDWY8-K;`tUf)mv8`*RccmB%*KfRq02DH+lkIeSFE#5rTx{ztV)~Q6u`* z*Rx5+L*_CWqj`B2Q-%~FF56!E)pem;~*~8sN%GpMWy}|UqRs#I%njKhf*^hsC zs8{_mJUVE_JzWbC#z)+p_DlPit74d6zUgdc<29(@Sh8yLy62Vyqi|57U!E~#1SfW( z3D0xI$`{R=@qJ*VJ@|tVpqtw?(mah4L0D5$Q%g&$Yn0Gd`}G+zI57)lmHw77s>ELk zwPc@mB0V>$b6-3!7-j(z_tdoVviIl@1R{qVkJv55yePtf$zT;E0ZG zb?Z}fa7ARR3EcjU9_3otxh|`YSaA8t?NZP4r$H89nTyhIhZi$%caRz1Iu0ZUHD`UMNIp|LSMZ;+jVj#o?JcVi<50zCsmVM7D9d_MA_M$MpU z^SW}))x?_|Jn{%Ww~g?eA96D9?EbB6^H!-`^(o|n#MlGDzGl67|ANX8-r37zlM?5@ zQa@2Wx2Ho$HB#?PGl~0SL&bW_pT1E)n|f?lB_(i!v&^z95x`CNOfcaWR%Mrs@Td^U z7J(Cp;M3b~A_H6W=kMuvx2J?vd{QbwK^9tSz8=qD5y1G!*f-DCY|}{Yeb0MUDsH01 z#l@$ent(4?;(@b&!CW(QbGi@4vB}BvV}&&}H0TJ-AUq&y2yi^B17r08dUJdG*J0|` zri-4x%!0S#Pl2bm+A1ScW1QED*2j5x?R-bY+63$T=}$`yKFgtW2*T7@iYn|B6dwc) z4Gld!JiNWV-$K2F(5*NikkPX6Nc*0;lI#cBG|Ah7f~nO$V>9&#PT7bReyd6LqS){} z@4auzGUs#ejqwp$h5wgOvibe>owX~>f4(EDhM)ney$5>C`XP0yBvBNcNZogtA-Cz* zm3YURHNBfZJE9bN=tBa zY|71rE7bnnn;ZI9oOTa%z3!#7Z$gH*V9GGj6nBWCUGUb-{JdXq=|k_Nvu$l|J~TRL z$3+AY&1eeChP=vce$4lu($ZEoHZDAwrKNW|bYMDaA}%uC#obz}ufgpkzdlMv7c_#l zflR3f*0#?(*`#&G@9gJ2?|C4(e|&pivSG7;SN9z;e8mINOTx?|=gQizxxQ|BhTJh* zSChdgp)n{e4?3ROK6$^EQwPsXGr3tSz*@V*2V*At9*2h?`2)pYzqVMpXic2sy4#H& z^tiO0p0r*|7s=wm*rvLn?11w%wP zldLy|YU!w_FZ%mb{sJkhMwTRczqwA2)xa&kb-oKbS&)#s1tR)4Gjn?tuuNv|jt(OJ z*wo+@+eJSGf@GGO_Vq9aP}<0_wns-t|Nixd$d8$ffk8$At83l1Y5CN}(3;xw=bEF1}w?1$TT>PXPQqzd}WY^^;87Kzh=V ztehO77T4ZGSi*9XFPHVwjL#6~zd#n6l5yAg-f-6&{zU}|vD4+&@2^inx*Hi3P%HQJ zmWtuEKjeLBrqQvNNDT)LAR~C{vvP4B(}l^`;Jp2KLJ_hxOgUEZmM1mv$lGA3 z_XBmfl$u#%Hsj2xOW=2gS9C*DcF03&YU+m%z_j%A<)tOA{U=dNGCZzXx1*gu2|Oq$ zD8B?ZpvNx-$?T41{xmj1-k!LNj*gx#mh3(LsFL|1;2#8e>l z%Ou~zLve5Z=N*(NEPz*Efj0IXKoSN2Ef;@6&S8Efgpr{jGXF$LjVc@vYO zBJ3`&Jj)dD+;eZF_V>$v3jbmKm@aC1{n&K)3^ z!RLInBgrbjYFb%(IzVQr=KQf-hdqJC#pcSHTihI%0M}vVpKNjKdZV&t-k0BX_{ux+ z-nZFgKDE^+?htuMuntqw*JG=D^ZxtVeb2nO5wX<1H9+wf9pYt^z^YEoUSpsW)2DW; ziT!%fN}$^AavPsAOlX}M={F;l4>`ZGE$$mW2uHHC$;@!cjSX6v-)7bAQ1`2|{++F) z8(y`;&&25bR`*Rjiez?XX6M!e^Ajel!Uh3pE^F=amUe`;!Z(BFyv`$!?$Aj&&TdBZ$(#36Dqe*4mZpms^gk1QiKT9htm zIRnN`i-dCQ->MU+WE&fr&KKL}cU_S34sIX8^^HEYrZHnS`)PA-N55B1ra4Urhx5wH z^9w$M3e^;74z67Tv9|?9t_$>VVG!KB$!(jF8j{`(2C_~!>67ZFr>D6>#`k$$cR5II ztL|3S?6)J^2VdhUc5$PJOX-eAOUiA1m`|=YOw?TuvlRb<`NLH=Z&Zp4^eeRdIe+5u zs4kz++2G8|`>lMx!PF>X&z=s^oTFz|JCb*CR) z0I8|?evhf1q*qIX35JzOnqSc&c#2uE3P+Y}cJ1)|Qr*9v)Artfq=eO1HCnPpH@B z<@8{8;P#)uz`&Omp9ybh;?peF&7sW#gT*!^a4Fo*$w2ZRP@ zE0ear&|wOE$#fF1(T<&W7AU)z?ZExPP^QEFK1&#Lb?e@}2fz5D!aBFE@Vwz|Ylbu@$fI&G>--9ugR_2-4WgouT|qt#J0 zRvYknDDB)@o5l3Oc%4}3=;sffChEnd6#ZWOBrCP+0Th`H1Spy?@(@lITtKs21FzVF z=nr8tzq#L^))6e$Ezf6S+VA!VR{#@@zMd8E2`kEIq1WAEplRe$rjgpx7NUbT}-*It#P- z3Uj$gn|a2I1G?yZUUS?x=g$Gg;d;3qZX#jESxSB6cteA+!Ig#@k8}q26h` zUM;LA3u+91Bl#9)i4MDCUl}Kfj<1Be$jZwcaNC4|b%p6bQOY#BdHR96`ca7El_f9} zhv@8uWOtlc$2Y|M#xV5Af!g=%;0gcSrT_h(llTBSAXZJCBzp4`f1^9A4ZZKJ9fN*P zAzPK_&wsMbtcNQQzYUJ3FuvvAb2qV(9^g-O%E|Mw=6x*2md%0%5Vz6JpIgEEDX6V_$;dJ>3NB&K z>tcs_^zqlZ?V$wGD0hX*o_^8ba(OBE!Y+fJ(rY6nThEPoD*2Jam+WD)GEK@h%b|w` z1W;5|3?IN&Ij;z7F=^;}=y|;tbK1Tx#)i3Y@8}WCanqi3p9+V1*?9W^NeD8gw;Wpb z#%LJ^%NB1YpFIT>WPe&j$ncrqMg+HX@=$tvO_q#~M!vBllT1d9XK(|(xC1>m|53Kh z*F5a^_2Ku(71MS3qV;mUTXlh=!dc9QXMTQmF|1yyC>D^v={iNnCiqog&kG;2Om_#R z9|~PpE^i#Gzys5*jNJLxoi4MZ7*#kVyL@tL=A;?eseDlrh34XCXac3j-Cxd#n!>8i z(_F{2*jf2735%Tg=NmT1&}y;M&(-yDI^yVB!!+&Od={Y6NxiCZCNHZ_r-IMb-?!m= zol9O?@{g~p7jtN1h?+JlG$ZRb{M&74DE^hS;``qClr7tKdG8J<0z?(sH-ib;9wWOP z$>M%vt@RKh2fGzptF5)vD;^_QltNcm47i419hNwi&wA!@Ip=&qzu{leWiZV0<@%pXFRlHl{V+yO2^@gN6@l}pvj=Z>?nKSD;Rh1a8N&R>2`Vk zIO`kqCPP2Lw~<&HtXYL0Y~Y$n5oEfG>~(=#3{sI-hdoTTQZpCej= zmt9a=qW7}9PGAGbJHWoTwJ*u*i;8azmPC!BMdr{UgDnHwzQ(KK@2Q~7_wp=e8|8W) zXmE>uZp{MN5*lJKnOdBt9>J74oNo|FY z+{7#7i#Ieim4*L>g`^e5)2V4`@v*UX-=jw$%t!3kTjfYd)S+G3DJxGG9{=6Fks2@A z*O4`wW4UGi2q(aB6!NbRLNh8r1$6a@{c`c`;cTrO%i>MqZ_P&s!OYghYOj2~{?=Xuwc+H)>c0(E%wDB{fZa@wos=sozw7}D8MU1d!d z`jQhFk8{fi3>R9cTmM0iYvqEM1nG_DR0KqgLz$3Q#nriC681*3UiZ>%*O+Z}AtoEA z5pUVqJ!F(C+Cy$Q&9+&D@Ic6gC@r&BpH!iy6YVT%To?=HXKhcJ<=#|`5 zbHXNXJj0)crK~ehYKZMa7ec&FB^2b&g8ms~nUbwmL`(gvf8ZVmj$KiPGM(Ce)NFq> zp87uT9yMO9*h(y6tD$}X+{ecK$tL1f_-&7qOwF^zV`sLkhvw`US*Oul<>8&`H6V-GvD1tBFFxUId^{B5L>Vg^! z6|ls-gWTqu_LG--Jx7pmZ`zx#N;dqi~Ke)5+{ zI&XQ0$IPUWMCeI9fFz+i{nr9KdmjraTHapYcfE{PsHq577{CKZF3um8zpVUj>>c2x z#4akp)^$}gm{~d3IOLi}P3W>(kzffd&X4NGB5{YeW&sh{e!;qK5?w3LN}q;Z5Vb zv&^+n-Nmuj0p4pOnKq5FR2z#_cRRC*UDB`Rw%ut)f#8tn&7?P8qY&aDNe_nn+h z+p281r20Iyr5H=1c-$%9~?_ z{;6r)LgKKC>Dd`U^5h{HcoO%Vi5mgAIVwrbKA$p3DBhqsF8hUfz7~eA@-WM1(%4Fey8HT-LZ9^L^PaYMkZ`*)0()o5JDc z=2t{FIe}HSjreXtL%~pJz26B0Y;gNDd%O9_$|dJM_Aa54o*!TU1LXXfE%gH63Sx*; zl~M$_Y|S|Ky+HL+5fY|VKCh<=U#?ZY&dzb(Dq4D?^8-g!dc8-Nse7lymAdJF8Z+}5 zXsiC^_JVgk`TOt(81H^^C^lU!y&}V(`oOY$Ze{GwA`qhQ4Y>?@paI6qWbLVbw!Q#T zXamgLE{jOFnyOafEy)>lvI%rs4?`YK>DKY*SUGSg&G4H(CH2GJ+yRn~!1=*H@dP0WVb2*XfPS&>{GbSLuJf7J#tTvq#Q*;& zd&{V}wx(OSfndRdJAniU?ykW?u;8vuXx!Z;NN@?R!QI{6-QC@xas4_u=XvG(aqqZ2 z_KzNH#+J2KRn0l8Ry82QeqmzID14l7CR(N$tDRU*LaW>m^Ywx&7m4v~=SLo1rZtF5 z=V4aA9sL!bnUwAis!#w7akTVgipFYKA4Ku|!RGb#@TWHSb8IroHT@)8{p*wyqp!^` z9#$c*ahr)-0ox#>98h*1)HmfCP3ur*nJIwv7J&1i7`4Y$tlG=7U zEto5N7e{EKI^3LT`&?B9)t+BuISPZ`_5CnvZdOpUL@>@#%n;%Gxnxz}8$g&{tl4ro z6`QzSlWix03~%#84NBc;)9LsIg~N5&Lz3xeLvO;W^cA>|j=J|^legYZN@g2u8| z3$4DqYTC(qFU})CF+DK6?WXcLq)3IW*?FrQe)U92K5hAV(kam6X5sE&wB+&H+&(PH zQ>+!KRnF-YGQC+bkMDgZ1{)emJzo&gYlnW+-vG-Z)VxQVfX@#>?*{HG_a7IPS#JgA zMjESZ;H^$xP_~SA9NHrKLs!Fyx^k*%yGMf@p81QYfrf58_FwR{eoH9>hFNx`L&(eN^ z$}QL3?FDP~orvp7*Hk*~*J7p)YxR3=0(0j;{M848&jEFRNV`HPkh=F({pNLYY7!2O zWd2jkEi=~&$TOLK1?iNhm&yLiyO+y(WIh~+;}~7xN)!Yr0bN^Pf-(bl%ar+-<653) z4!%HX^xd$Ye6-}*t|H1E5#Fmcxso&%PiGaQuMzNL=>|j{a~lpQl5kHF92UIU>EdxL zwue`IxZW`{R%cwW06exva9(zz@;Qd#NL>e!O*uQ~e@+x^4@AwGQGY=JA@d z^Mc=7d5sZ=NWUQ#Z+;zGe^Y7hd?dgX$+yEY7bUZV>L41;O$6^Gp4JFiS`3NaX2EEJ>d4@xeHPx{Nrr`dp8qz&I~rz>LNT1E;pSj&d>T@K{Vs%lVOoNa|n5fVE|(6xxRq4yPt}OEN~zu%&sUi4)sw z#cojKK{bpGyvo{`N*QokVM;ti)z2X~VqciF9UX`d9sKGPHb{t7iw8RC5TNZ{O**lf z0{|2xWQmcV?r(8eJWw*@oyijS&S{`fL zs>;A!;}>(gY!)kfDQu5}Q0Jrz)h97Atm4qC9>9Rt#4;;!SK0q?ZJ+p&5tl}P|0D-&vZV^E)yGv|sk(Z5- zoVFPc_jB-1G_2?6?IOjA^S(3byL?DGAe9u0oYky_!7e$ua|Uj)$}w}ZzkGKLL}5dhdE)PL;_5cAGn=OgPTfU zu3S_?v*H!d5adc7E%_W9o&~HZf_u?|6lCfw@OfSq%iIMXqnhY*Zix8~33x35fDdRy zn>_ZJCfS6g6%?IOgem;SZENt(ij@+L5hMbLd3}4fR50hn%M!S})2^u@*0j?r<~EWnK*sM{qu#By4wF6 zDVN^-0J!7ii#w|=^{`a_4Z=BTK$5`X-Dn`(HCKvbS&_9nm!KUFn3YO1U7sY96&?Ob zVEuULjS*ifuWJM|!6A7Rk;=n0e#qL&!?S$C#r32H64wlaTeq;yVp9WQ8xBym&k5sSjW{kOgpM;%9Nz8a^U}mt7_I7?dD>912|eu$%_pwJ@3&E8(CDx}Fz&s`PBSwM%GU*jMXmBj zr#A4@*L|&fzSPj@qJGrR{bHyQ<3abTvL0Ta9Pght_~Gbc#zEiBhjz{qzbCobAqZ{z zHr%%FlfNb3TF`guwa+gxwNc@5+7{E0PP z+vMl@1qL@j80!rf3J?XePR<#}^nr>YxYr^gVJ4a>SNIZ*@@?i!XhO@+OllSgd58)j z7mW(3DD$k_J6O#`_ZRl$v}(RsyUO@G(FQ-O$j|TC zkb6dL(Cn$J8_^l@anfs|lRJ~zKw2fIHhbrg9WCM`fbXe!1xjeeR?L5C{d6zn5=<|= zfrB%R4}~V4vglRJyqo6zQ>SiVWlG!O$zAH(9bdj?Y2hyXz0i!I%SsjzhDoaD9$b8qG=BBiXf}34WR$rZgNU#Iw<9jn=M3cVX^k2_A=DUFF8` z1y}GHDA-lz|Jc)&{;TC~QzvCCJQlg6-uW(uh0j+^s&nYY^KNrWP}k5FpXho47)Ej{ zIt&A-`AV{R#aMQRY}nxlWWL_Rp+XPMjSpxx1JmSqrB{)I}4n z;^j(t8sTJ3dKOLo!5hAiVnNM>FePikpGQ+J7PO4Rvvy+-W1VS~T_<-g*I|R?5pf3_ zB2HVpizMQcn+tfawh1FnL;0kf)9Fq;nA|f<*K?$izHCJT zb-xa1qF0y-OoJW^wDQ-FwxHTQ;7ZxumXA=$`q#E%$^@&1jn5hDT|hi>HZ*tQDww_=hn@f#-$q5jkk3cQ*YOj3Glgm+sCa z(=_>}IhD{jqI^VL#UDGop8BkGJvK{wRsoTXWhZ_0&YsrkxtaTB{Qp%ChS!|+yXCnO zCCUm&T|=+<%Y(;jJ{8s4p1MZ61$Q|d6&C){>3F}!wi?*8QCUgh?q&dV++JxcYTUT{ z^kWS)+vTW6_>kS3_UUH0@U?;(vl1`j2_%dIlt>#lWKJ75tyWhsWG1=7m&E}#Ey1XV zN@V?x>2Y>n{eHs-62CO23b_dKPw85_r*LkQa|mIcOGfj+T?Puo$*=u)t2!InEom{K zQ2J9JT4T4r5atiKrerq!A3NkMO&-)j8>mrT{C2D@Et${Lf8v0x%|}u2T%#kk6+hEq zl;n-fKEX@m33a9w^wsYAFQzQ5_Y=X5rFY0#qx%wg5m)K$^&1LsygxEKX zjf=}_yn|cTW3o%)9i>w~aw0z%c)$O&O25}+YuQ)zD@>uAqFrUdmX~}t>q^?&PjErt zn%%dB)Iu=5ftXR-XzL!Bg?y3_I7Y0K+}`Up63*R~!h7SmN#Xp$JROs@~dH$s+JMy8%0r89hO8ewzi#@%Vbxp&bRW_h=J|92a$xtuz7 z;7e=eN8S1HvxO*jWr;akf{v=835Q=?=I&L@gz1Sl&D+N=aww^Z0-b8;_F1oZX=tK-Z)m#qhfnJoyrD=RC_)#a;+fN^1T%L$h_LbW9J5C{{BzAqWPp!z zy+p&q`)ypr+Q<4|TSNQUbvY-X^;+_DBYISa*@&QmeG$IPr_ap0DJJ%OzHeyZ*wd^fzbpwIue zzm1&S+`c`tIUtPjl>WN#Fq53wN1?{)0`gk~% zRhEfc;BT=oBEw4$hl!rP5lTi$t7VZQ#Y`zFfq_r*ylE|=TlbbVGvE;kT2{^?>~Or5 z^l)IsE%hbp;V~rh;8~pl)bI zB`?`;b1>X~k>KNs1RklN>#sD3+WBvhW;eZ9n=I+!1Vmf;v-lxLE*|k**>KVcMNGr| znb+tt?5^Ts>Cb;pBKRg;_8T&&^8SdE-LLkQr6LeTAQxqTME;bJOzG`R;q4(9E$C-0 z-Wj+dH_898`;-%gKK0x--ekp)r-jTWkcOBGQB z30O7y-cmS#nden&OBrl32#!$1|C7Ix-sR~;ug}jiAWF9t(DtzT;UoHkKC_Vw!Qg4Y z>nO{Ufya+}As7Xk69Lc;TROwqQSHSBjI==&n#rn@!o#d%p}8K>d4t2Dh%a8>i6cHE0L>XW- zp9O{pw~!i>Yx8M(Js{RGeQfRPpvRGlWn!BGpWpy(2;@qg8|1j6-gcuMhR3nQynv^Z zniIyBYV|iU>c^Jm=nn`${8(ar>{OL;0zIPCvcS>yE9g1G`V5dS)BL_WWC9IX)?3br ztzKU*ZoJ0aCU}(yIH5FapW@#7K+b)+g1jTTXs@19&%3g=7aEY(8yGTMIFr^2Scuaz zM*vEQ?~Nr1!$Nj=8!IR;-BuWUgZ_5Y?v*BSN8ThJ=J_g8ey_HG3?PuPtE!w6S^Bs& z&`Zy$Nm}8wFQI>1_N_U((RqR>stPIo7jwa$td~vkiT&nCR7d<&t@OdwSklhUxs-ZQ z65oN9i88K-Eq?ppCS&$^`UP?%c-zzs*dEon0?}$3DF6?=)S()YCwUJL3 zqWgN-hfqY#&iSZ`d&n1GJPQ&Rz27|xp8;o{&L5s{7Z$u8N>Uf`+MU)+CMWX}M|U-K z9^%v48xTtX-slojv!$00o6s=UwW+DB((vaLduiXN%ErKsZBt%%(7P>T)2bQ_q-8Ca ztE9jW@nhjmDaB?r_W04?BW8~K-9Bx2I>FiBwv%-p2;5T5(Q`RprJZL7v-(Skt1;r1 zHKkiH3tYuNI5H+>Iqu(#TH*p+p%`Qn*hRdCIL?ZQKOdpw&fwX*$}=(nGW#L@2^vD} zP&3wSNn)sWK!r=;o(`$3ucWftrB-+AjAc)Qql9He`~r`=Jl<8fNxRNm{P*X?cFW3F z859Tx(-@+Z*0uaY#aa zn_4LO6rpKVzQCF=J0nJr0_%;Wg{7TS!xu{Gh%@9ek4YJmTE_?3JBvl!GQL?OFf0%i zr*fTmXnHU|*Vm?s{c3FqA(WSRZfQ0oO2Nsm`8LNX}e8&aq{eI3ByVTx>8j1#w zK6?3sET20sU*6WB0~v@jFQ)9){qp+Nz4X`e z38F+Lwyr5|S+%2%$;om3Zw0gOC8mknsOxtN8%|ZDY5Woo$ut(~Ma*gp+Y?^&Xkc3s zCWbv`4K3r-hVf;)o6mV7gFo?(L)EezyJI}UwS@-jYk)&=XJh9+jgPa zrpo@0+1mE{Lv^7+;)yuY_XzC1c+Z#qHi756Hi46Nql4X_-OoxD3Y^1pYfWpT`3<%} zv3$Gk$`_GR4#9wr;1z)TwRRuVX8{kLBDEE)DlxFDq9o$zBU>hRok?&ao_R zH$*v?jaQu69BCgm)$?#2T;*w*{MxUf=a5qDMj`PcOLMI8dbl}1aQIZ!!mOyY@>1dZ zPR^`K7Jlv8f&VT^sw`)h_U_@~!}V>L2%K}K?OM)*w$qQdpu!>%7@WGA>;5ej2YV8m zWF7K?O}zVH{d|M(@f!*uG%U-nu4cUaM-W>^!Um%2p_AE8=y`Vl{1ANnLQ+DA$hr2) zjpixzrPU+|QmxXeS{*c_ z4OddYQZp>BLtY>$VF>ceC1Z|NtE%UDRhc`V(bE;$4zA{}r5By6UALXrvU2x+w-%Ax zWj9@GJ6=~El$5r3{sxv7GXW%2` zt8sprz3cCWJ};lSW*31yg0g&NKbg~(MeFV5L@!Up>)jT#VK+VHVP8NQ?`MB6&nv;z z)v2|Wn#a>7t1=TFkF(&9T`D~QoCnvZoQ&*}nnV(_H^QMjkn;7+4BUp*c1YFfn+`p| zoQ)q;CM4$@Wg|byh#dNZSwE18BWx7DoE;d#=BPoCini__&q*lCb=3)>Le_w=$)sw9 zPbWGDk{aHN3J*8(J&>+g8C6F~A_uOcsbOi}hvF>-_@WLbf zvAVgcI(dNUTS&t85FPT_LiT=T)4%XNK=r@3*s>R1Le1DrmSRV-SRu9ma8OF57Mrz9 zPC8r!9Bb1U@VV~2hv!{SY{E{}7d%Xn zKV!cB0TUJmru{oQS=eYF*Kl&$(sfjQQ&JMULOw?Br@oO?e#itQ zj~Ci7RX30jx48~#M&;4+O;;K9unkFl1l1oG9BnPp<--}6eVtcF zzta_XCvd+y(1UGh$&*O2k~G)E?S0c*wnzxI-UEym7!8KDzG&nHaIAoGtF&3gw6i^3 z@^oZ8pXhK=hyi5#0VToo*j8;@1EC%DwK(wQ5cg`LiBUx(yH>AW1P@wn=RRJ2c+WOH zNB1+wr6)Ev-e~OdX<~9obht(l`w>=Pe8RT6;lcJB-Uo~28CR$W96;4~ncFh^$MqO6 z&sFo&&?~#M!LfV~^DW(P5HVz+rS8Zh_yZZM?M;5jt;Ckz+ubEhkjzRV|aU&Pj zZV$hgGTH=6JMSK~kFE}j0Botapj9ww$f=8dEpHZ2^3#_rFn7$)%n2>JU={{j7&6EP zoX*)lv7iEXGVnjO073G4?cYqZ8q|uaS-oqezV1BT10ZuG5&l{m5q^1Nsn}PKSaM>D zyIg;0Jb8Mh`n=tms5@&a_o~NawtkkxH_BO8cB3FpmwaICJxQ*qs?j*Ab69L*ymaq) zQL)l1ll^iM7O;XJ0mbE306yo8NAHD3T0^sKxAF&vUv6jIk{S%s3UbS_rLhbsVd6%9JM691#C3Zy_~p> z2o$Weo8Ut$td$(q_F(`qn%4Kfi8L&$f~gS-N=GV3e3vT0^(BI`6z^;ODVMbyCeP@r?=H zQ+}Jy&NBkmpVC_2>>f)gtNYf_mA5Umv)q7DB%tv~Nqf$H?f%cmwzb2TYMC(7 zmufee20%bZa%`Db#=}At;faRh(L>MKVII^u*fwqNgnwx&Q3P_n{) zV!rLe=}BZCt67$cgni*e2`t_!_j?3r#-{yk*7yuwAe{nPawdxX^b=u7AM_0E)3EC~cG3HYz$xA-`0L|oGS{q@jWA8tnrLRK_ z)jI@07OX|NNE_NPU&OJrc(nJp3fJxt@F0PN%+9{XXZ`w&`jL_4fmv_O3!CV9z*Mbp zlj?Yh(PAW`YxVIC!8_-@Q>Mxe?+Fb+p$8HL|Cjm#_lITSLr`Q`_|cU?mzYIHx*0IU zG35s{fOEtQeOSI;=+5KYF;KXog%o9u5bf1&uQ6$*Dg9wULr_q#uwSzCi})U7&tND{ zS=-~l7fUPCS-{}aSgV~v+Wf_!E)*NPHuSg>82`NcKdT_@q>T+<$)@f8Yjjq7 zBHMRF0B!@dZLgR~iIl`d;k?VtOn9j!U~rT{Lb<}9qj$|ol`c6@j)v%44*=TT;Wf?H z>b?R@>ZL-{(EM0e0!X8KmU!K@zefIxz{N^yP1*TNBcaGc36HEPuenV{@gNPRQw#y$ z+zQ;Veq8uuu`B0|q1i_St5q6(&%akHQ)#GoOL@B6BDAnz*^*8|3yZ&U?I7DnaTO$$ ztA4#{s?)t*(xCSk!0Lw2{&j=sXyFNzv{i&#!dO&`KGwD5$#5m56=&f|hbT8nY8PJy zzgX(twI6SZ&1iEn(A&W;bGBZK7rB5ayTW*PvsS6o@*H@ujsufdyfb`GA72h(ol$se z1jn3J3r-HqD=JTKc85Ix*&pjO2wj~=OO-Buzk1mB41Sb~A59eOgAFxdd&qU&smR(x zd(y{AL&0~MS!Nn`H$G^1j33cv191&W1i7o6nx2>>#6Do>2KAl{+NGj^X6f zrZw7VbPfO~lq)rw<0aioMRaA)s*Q#N({Aitm51}56-iDX!5>Q}WAS07GPy$G0^pPN zyOs^s+XOiX27C%Fl1+aFUMBgRdQo%f;q(%O&8p|U7BX2a#60rt`D>zm(L__OSUgBv zX=7!?-ALE!gke>aCm#!Crr8M<0T{5jAbVei&eIi->7yS zC>CP-Y(o6U=;9M9d|WY({)ah8E60gtZ1_Q;p3>2M5D%^h4Wi=W^%180YzQ5rgdATB zL{F$fz{iWJkjLz0!Dl@yUOzrIVA_Y;chFF8<5Hr*ty5=N2yDkVf^w)?$uG4D!@A~K zin^x)QQoHY7;@~UuL>y(%yO~uti=xgQ3RuH=s>F@Ni_#kxwReYdCKyS5V1DFyg$Gr zPbV+-B^y}NSk-b}nFBA+G*T69l;h|ml67#KH+Nvj;Mcl3i1aooR05xF)gHMD6F9uR ztb{&>2gHZn*^yDIqS!Glx-m_*eh$b`uyf#?UfG{yiVY}Y(<<1Y;h(dCGy7Mu#Ly2R z@5GUb)w8Opwph5-G)<4Gt^A`EGf-%_n>`?-4f)wQP{BV;7*~rc7pwT8l&jy)YqhY_ z#(jrsUwrB{R3jGFPOG4(jbnYlY>sKFL8*iz{|)d8cAQWFL-G1sX9{&3%PS9Egm@4H9E8QMM|6x=Gnhb zPvJ5SCibE1o$MUEn#k=O4i3KQwAy}LzkzH3Xe&w{bT&f%rt=NZzKC#`8!(mg2})Wc z<+~#0=4TAT_M2VKxL=VpB>r*C%M5Xu7^0*?^hjT}+DkW2QV`a&z4IcCPOoAZ~Il6;HL+ ze1W9`Q7;t5$`0v2Dm!Ix_>rp7$W7FM*75D@?(4G`CS9mll&)3FVvad0-c_K~T9e~F z5dZ|jl|Np=VYy1YoV?u<6ZX2Rnfnk=5`)Zvhs@JrbHd;!`*@$HJ1aeA&4%*ggP|_A zlgP|00VpzsIGBNt7;;44%jmh z19BS@WZZK-LaXKvo>o_alizY=|B5pZ5nji1%kis^97Aq ze?}nalX%;RO?IjcGNlV00+UsERtj>b^T^;guxC%LwVho^DCA>5ZMp|B^%!_N84lf> zv2DJoZ3@bU50r@-@BS-;0jb;mKjsB68AA~bHm&&^`<|ig<&S2N@|ph0bRcXRz3YXO zuf!&NV~Gxc1jQndud&u`Jaa!6e8%BKgh4Y4jjMsF&3!&^CJ(uhjMm#j)PaT4%};9f z4&3UY-*=`{70Q)z@!~DGgPpEJ^3|dW6O_Jl`Yu+t@r7U)gyvKxmo6+P)kywXOWk-# zKqDq0bh4mOh;;J=$q^9j;o1F>GqM6sCc<}pn?8j8{M73kOH4~#jWxGp7?w+k7+$nK z_F*0zX1TXl^DH2da84%J&PeU-qQ;ilI!=Fj$Xr$5aS{THmf)m09eq zljFhfF&*mr33Vor5k+!gjrKmj&18JY`=}zaA%ws3Lmn0U=En^q8(uTm% zZ@tF8ko@Uv(9M;JTQ3ZWJ8(CH;lxI_bGlx!tPH+T=-hs6YtC00+`T`-N(n|A`Wr$; z-Xv7u`b$zg;&W|52Vzp5Id*iIB;z58U&W+Y9cGC;dL}C+t70Hyokh<{Ri6AJ@7`8( z`a*Ike3u1?REfgP{vsoNOS|b}vGyI6sbn+9^v2cTPAY{lzO@Hi7&1{~ z=Zp83sjb)^CpjwRhpb!-f{#n7!Zy)?nbSqrgjE{`nx`pzFrZBb$$xV(5pS5(balS^$grZ> zER|+Q|K399v!xD36p67Fhf)Ci+A`RrA_rG)17o)3_ybVvd^mqw9-d)b792`%U^3g?XXFt4NhXDKIa8jyIeW` zNe%{GM802-hP0T?4NIZ-5r|a4Nd>W(l)af9LuT&!D|!YGe!;`O z&k9pefQbb(7$NPU#A)`1j@$?!2?#^_n_~$v1#6fFEMT&BaOZl?JIa$EKCi^*3H{yX zw`N)lGw1S>pd?y(`2m_?#Lv4 z24sm9q8bvSoFO(a<|MI~r|N68JRjq+B`4Q$*lp*ozWwXQdP#&0p+QSkp|zVO$+ZYV z54|G`lorL#pSsAP0ev!@zaAhwUADPlvpbo#wLitF@JS{oNzsqYT;5~cY>cFADz#ME zt@-BIrj74M^RiO%6@3++S?~`K*I3L;^jksNIIJ(Lw-iY}TK7IK(`KVL!K?B$APs;C zUA~D>C4KRoRx9&?rkKr|Nh1t}29F@mgQQ(J*V-=}^OT9jJu7RMDMm*#{jVMpfI_O|!^`xjeOrmh;%uius{sd1R^T(a{5s2FldoN!Fyf<;x=5C;_!Jxyaw!%Ya`-Vi*3v=36?ps ze1=#*{0>case6j9&0d#ND&)`90opH@Gtcm)*xkO;4-RR&{;{=>-p$kY3DO`3N(n$Q zG{Ru%$}b#bQTX@Fv58&MOb1ZeEH^$_8QJs}A0`^d)~ng|3jBLTzy3xG?KkdWzmLRS zsJa_Ruh2xqd^?b`uNta26PsWB#9!q3bC01e>8>#ahI*0Bp5>jToQ!+w_1BiSVv#n? zdDSI)bnJ^MPDcV%-z`wPO+{yIulD;24r0CC1LC(}@e4VvKBeAJ!_-Jb9!Z0?J1Nz4qGs5}VT%PZSX~K@`YgvRe za8>E%S}`M}*a0^4`-bS`vcCXQxNOK-SZq_2F6?yc8%|(;0la0&vRdi#Zl+2`PkTvR zW#sm%8-`AwdW0F}s30vQOlg5Keb=-)c9yjKvnM+nZ}G`K|Byax-XMq1z|cqM;z|)6 zIm9M;r531hPm?ue;&nWpuk0~1m>N@~*>ed^UFWmaBInDAOg54Y=it877REN}VF|zp zqjU(|{*+&yI4YSIGLYK*e$X-0DsS;`@qmH(_kM~$H!MC*J2>4venW+i%LNezwcvZj zEYaU1punZjtunm8R0HR(=o33FfwL?i-ql_4$b|CJZNp{{Hiu4D19lA-GY| zlS1rM$m3nRZ=USVQ+ZO?B=54@>k2z@Ha1P1_?E80_XwQ#>$=XqoKYUgr9DmL*sZm- zx!qnL%@s7D$Al5xAGySmhCVdbOcu5s#9}YWbcD-`X31HnU?0ph)t(>C6F3#k>{27} z6FhH&WNX56&ce>l$^0qJPhhBs8B z6z{lfR_*y3USx{;rC6Kv^6kS(DTti zDD&3|ipS7Ocp7`^Ej;BQ1*Qo;Zs4jK#Elg`n$jQu6Cs)U4!p3ckd6%aj5(9YL+F603!6a6TK1XHK7Fjcw;wiJnUng-S zqQXohlK01_0n!{~=&8d!J*IboENWkI$_qk4y%_~$0%SQ@e+Wvnp;rch z++vNHl$2BjmuCg*=Vix;vl^ji60GLf zJOToDIvN^dV4jWHG_q(^iaOw=f1e&ykl34i9l;r8O@6xx!!mdug5nmn)*mB}-nQ{g z(RTUw9r5q5l*f3;T`q_5Vpwj_+&e!w53#CYxR#8`z+P0S3#rKC?UXpA&RYPSMf&*MZW|s< zyWr{1nmod!rx>ZP(a9_chV0^sC}}}pc=Q+(oVq-xZdMg6<1XambS;Hi#N@#bYcB&< z+hzPKUn4?PBNkdNp(A?5rZqFu}!ZFR!TrTIf<^S1}Zc; zA-E9iP-d};R1%qfyF*G<&3m>Yf!ob<7Aw$89s=$X$l4r z+%RM`W}nDE)MHj#G-p27P^Gmyn!@3UmO^f(>ak}!`qj!8i(}$@wXRgXpU{*+N-*wHl)?Tp~tg1-L=OK_*nR_NG~T5 zdAT4p>~1f)4osVu9WixEGe*E&VCe`AO*|hK))x&fawhI7I`Z!#!h$BtN{Sju?;_<< zGgLVV{c>`-B^%uB(7=Pg(3P&c?!{;exhpj!!?F4c^P0ap zI!yrm{!YL^#2*nW2+-caU5`w}^2G}pNVH5A?%53F>f@p@7+5_Ug&~1i8R_%%^gJnA zEqOY840tf573NAr&4p=a!wn&Je%eYC5&}p;K^zg)W7a2o3rO#@=u%5+V>%ZKK>=^( zFGa?&pf`q4>i9qTY!uDS0a6P}y{wp=J-wB5dM6ME1zzh96?Vb+s+cWga#A8Gt$N)t zIaQS@ox63h-H`2o=4rQ0s)J^Z#Kg^C%}}%Tfehbyr4G9gitlc`aXS1t5Za(9ns0pK z{CE!q0pU$j-AOCK?R2A4vv+s^$SM6^9)NBwF{4N_=6UooDgvgba6SL+pp3S0@;QY2 zo)~3}q+J*Lh~$m;u0?~ys^_84Ua@_P%N%o-{oCPx6*SdHz7{aJ~=xH9>hF$><+L zI}`XwvLolv-pOB#c4lknKzJAJ_BA0U;KTOiBGdh7#@kQ+9^6hCKJrE*qa~tmvX#%t zV5OwdIK?>$=F??qE2yxPtGY#FM8Z=(`8uB}gg^^d_zu{a(oXsk(?yC|cHmZfQ}Ofv z4KoSbT)Z6%h{!A$;WzO=D%(@U`r8viWj^XRL*!hSHUrK2h6XWl$OjcjD*3wo zE{(6Bd%W*`3|RVry4T%s!#H>B-E8-V?1%NVsUWpB&r8Op8ZLDLdxD^4nOQ_)^f zERLoA#F1|Lz|dgtgs=9>y2o#L_N-)>5;9dv$rFHp!jSCC^&V(E{DC_HL?rQa0$!iHw0Lx4k^ zI^tHqlpL4C-CMH&dY7Z$s^Y-ipKk>l@(hUn0R_Ew`XY$I^a!U3 zCG}2h_3;LN%R|EjBBVk%swOIk1{yQ>BxzH`1esmh?=e*r)!R=hmD;!XwlFjV$XxG* zz}KZBmtS%RaaArQfE&^`>zF#RSP1JKfG6|Y7e0W1PLbxAsK@DxD$$S`>|6fAXy`Qt zKF4xwctNK!SL2sj_PI>k+hh^V7NeC~KszlH>SLDe*cXPeL^ut?o^PkH?X=eg@M++; z(!DSFT2mt(w@NM>=X;MO;?sgF4&0aB&0n`6s}=9^-Hv{ZOnP+=~Bd@-C{|?&ARmS>+7Xt#nH52g58Jf(9 zpEjPFRQbb2hSMe{3StkWF}m$aR>BQnrH_U{mOvad}*LM;Z1v_AS1;2#~U|$@)CS|=0 ztC8hE_x1;g(sBV-XC(+MXx%8t(5I8Okh(CSR_A+L(SKz3D6>k!4FL&DC$&~FshFWn zEIPABlZDfN!JBj>^8cb9CZxb1Ks7YxoBsC1eC?Xf=YL2FM^S|S^2=WeVnWRh$zFV^ z@MVtENu1;T;x?>SV^Xce{O!p`$Nol5>Ym8OKbh$gOC&Re^194T$G$Sl}r_tL66((q_~WE(KYV*FPw&I z!2L%YeZ!0@-OTj=XWr#7rSJYz3-I48yfE;Ojr=|82mZ}!-})yn2?!wq_Wy6$R*>j* z2Y((f6kWJRn=KUfKOGPuL#?QR2V*_e4A+r@jEm5Q7VJSsUE6oO;kvcqb*iOW<#wwm zsD8A!C*dGoc(<8ZbEN9Fc{#x^!5G6v66C>q`p$2>nf`Vj(!+Do4Y<~@^spb>m45ar zL+st-rM!GW7K{JSn<4^>h`2Nq9Uh*9Zu5ganyCaN$z7YqhBWmJLFEetdxTo-v!XsG?sL_+z#Jrp54(usu37KxUO0Bn+1D z?DnhkREBg;VbXgnl1YqC(q>gvbxloy;d*EGEUSR_jvSLR^4T~S%Rd^4T)wz|x39I4 z`cPCSH{;GMhwZQcZ`DIZG`_v>ms-VoKVAIdnf{qe<{JMB>0U^+U1;w@ zkKQ=U_)&GGr;+%7)5ZW~(ec_7GMWKuE2Sp#}9H11@*`t2Vyv(!vXy{ev|G(_v` zW8mNH3G@x?*0f@3h>B{sneB%>1!Re%R-~s7cGYZCBguWI)cG+eiQjZ0V(8wU_;qS~w&qGp#bX}ju z^zdO}FD6~msUIFcQ2Lf0`niP@ER7E*R`FPAr9HT~o-?$GtZ|4Cbhyy*N9~dhH-`S6VZk3o4?Gil=^7gTymhB)dcJ zs+s;(>U%`lqW=|m=6g`huEbVYu{VE=~X(MmY>S?P$ zY++UXIpM(#gdf!Ecr^KW4*W9;bWYRj5Z_Uds*ZHgU8?fqK=ZdIE3A+oHg| z?#KMo(@N;1$^OMH&VJzN?OXx*t7}PmkncINCb54Zq<`=6LRH=s#D{VAOls=**bvX5 z!UPiX13%J!-x^q3PowE+gdBzJArh>mtdvD`F?-Vsj>XcdScHtb=3_``wuTvJljZyS z=BrX-8cgME$OpV(!Z@_q?;$_Se)RwG^%YQYZ0(j!NYEe&?gV#e+)2>j?(XhRumpE^ z4{jm2OK^gFaCdiyDaifryqS6PYBjx9(^7Tx+h_0noyzI0-9oVAB3Ubn%Hfxnsj-_V zn_L$bK5g-0?UtRB=?Yg6X~PrF2zIm$LkNHvxK!Civ2rSrJ4ei=Q(`dU`sbDmops=v zV!6HZqtP_K*P&Rgzj(n!qCQzZf88f%(|SncOMIT>G#jSLOp>i~dZz zjv6%%FPC;vlv_rggdn{7W_oIKWH%M5R0Xw+cAf7{EL(3ZF|?`ryNh7!11DF;=07(r zo?m|^4}OfBkx<(L^g&vU2*WnC+xUwhT=Y1tp;4k9`c=}fS$G+cusbC5fSM7)vVI%3 z#NdMJb4L>R?wyTD+$v(o+07j4Ud_c7>UB8LNP63?ghuJIDSE=#ZThT}#P1C>0clT! z8tilg;}C<5UNj|-&Do}fO#_WRN=#95p|OUo+r}AfJSC6zr$gwXL;OEqPXIW=O0N2M z8+ovs%|E&pNp|R42?J1D8$imYw)H6fB?qd-XN(xOkrG;*4^BBiLql``Ghik8%nTg$ zgnWBEHZK#U;~~ScU;vU=)@C)K(k{=WTT7DCNAI$*FryR|(y>q=V~q_6nZVzfFON3* zqC;sVVS8cL>1T68LMm9}PB58S-rmO_;0O^}+>!*Q1mX7e4vh5}R2x+8DB~Mx_}s>m zen=RX8vi?TV|>8>f5};WF7wYnlCuiMT_T_?o9b-lF{ZiXH)QE84&4feaN}Oj6<#9RY1~9fck` z+TUsep0mA~&>+CKqk`Apn zY@k!28v2Z#AVCTQ+?+Ab*1x|+kk`b_aIqKa{8!!>8tH*c{cR_;d40dkD}9>1vjb3g zGij~t+Z#LUo14Opth_KpDD3v{>(N4NvkO>0b_;d*4zjd7Gfi(m(8fQs@r2`q{=rd+EnEM*zM~f;EI?kdCQWqJ4uD%91%m{<(^$Cxk;i*#>cERw)e&- zlWqIKoqP0g?r70-(%QUwrv)&*5LcCx%w$m6T9h09m;7Q~?$>~6>T83HMLmqHB-5 zW=8Am!HC7^Wa?IN|0M6~e**d#vu?(Dz+)V07z-J_O7o0iQH) z7)V&?5a3K?=~vI6e0!cfY7$nYQtB@@`Batr)pd0Gdio`R(jPVSh8JSfEdBLIVDqf*pkV!WDq-2e>_ug&DsFg&yRe zML=MP#x%qDces*-iulnPHcAyom2?8Uv%@U@uS|k%NqUZ52bscKZF}2tGjL4^P|qQZ ziK9nkA{ zxI`eB0af3(p%*E1ymStV1T;Jgu%JY=awo?`@`vDmrlfC)CG9GxHy2aIn!j0nK6%xh zHv>#DgpHHaJ0YaXj1lAC;!6=2Z=MO_7!5ZG#y>g?+vnY+>2Em?wlX|bnRq(Dni{dy zg`qu}eeBF?*fg4}^l3NH!Ukw@#@(Hu4J@o)2@8s2X(=hXm9K!!OET~zzZ-0-id*fu z@hyc~JdK0?sMzy%X1;*;N0;gm2|g6)^}Oa?ZQ$~+j_a2-Jz>}PPdt+Vj4rA@oqv5d zrue*2C=_zKs}%}Q%~dAiY^))o{o|6F9Ng6Od)q=QY6=HUuCj7CCtq32If*#_2SlL| zu(iQp0I@_Yr3{FH%<_GeZ-`~Yfzw=V-{NDsbfpvp9gXRAO08y#`PESY{9*;2fr&`a zC2&4!b@%LAZUV#8+fgiEKC6XV%h}?^-_{Wob>eU^9zGSj?0OPe?bFj3A0l`OSf=rZ zkHe&}=8Jh|{-#m`W?DfZnwh%=*Eapk#+yIG!(|?mjd9u@OETJ)q%dcP_2Upa$?$C2 zQJd)c|3s!xKxE2`eT4(}D&tRz99$;hNl>+FIgNOOuE3{xoUA~W@HDNIC6(w@Ri#c$ z9|I0y*N#O5np{+2A4b5_Q#tl{xep3*aO2Xuc@(+?3^HJ^rO0%jajH7V9kJex8Dmu9 zVQsZH0UGZB!JLqnvVnoJm53HIg1@C%Mm9A*#k(Q(z!kt#gOc#VYHH>DS{df31I>Lf zMZJ=s_b%_&FY2SI01o{qHuWy}>1+7ZsZxqZ_jb9;FFCt08a-U3l05sUEAfKi=Iz3t z#fy!Ivt_|wi>SCC-2-{Tg*SzHo?PzK6|3*ev#0zrn~Qeex@XJdVtCqTr!S55d@xvu zr`?men0owxC-QkxonYmJR-K<@QjIJ2XDOo_K0ai{i;e0vtUgEuP+Oa{%W3E5=ZT1) z4?KiEU}~O>OHe*J_rUD+EJRQ>FFjrm1UoY7JpDcy}vaWZ_l0qb8_MAzvI}*3w3?MEm$M1B@nI40{v31qsgG?}GF1n}4f3LfM`!BgysLE|!hTHQKA%ffPp=Mq!(o>P zv&)6ts1k+$NO6=f*nnGaAY5Zp^4yI1=qFXLbFeITewm_ifBsMwP&)T@^$FM>56OIY z=t}76ku11|DloIUTBU^a-R{77c-nzIqhwKF(YnC1ua{H2nGoZk+xFUu1rmB=HLC z!6YN}cni8&!luqY<>d@9o1VH2^BVR=)!O&-)8ddsSmFj7E_2JwjNPG9Ri6m14pjvT zZB(M-AVJ5qt_Zn#<-Mv1pt=#b{zsX&`3u&c_WUSWNnVE`ZZl663?+-%XGYYY%$QE7 zJn-}3X)H5H=u1q*+fZ0g0rw5RUolAmcRSd?h|pIx2$)KkIyIV?J{H(3Cu*#Ee~zX> zG;!WcjN=!$Y-H_E)1+U&J5h!`$UeMuX_%lgd=(TurcmTS(L>bz!zvU_p=e_J@cp+A zo+4&#P1kzqdi$cQt?m{JsaSX-^z3{>NuVZ`JRWbz7yrW88Nz9g~W zCIm~jyAk1(Vi3LhXut=~^-mQxEL}7nH?!pRpk?ADMl`i#s;{5MQ7bacf>C1}wM48n zrLEjD2zu9qYP#8}->L&MI*o7F zedN9s>GcrZC(TX#(9HS9b1tq8^M?D-Ve(o=kr9k;_?RBpe7|F=M}Z3$({=E>rQ!4x z#iiUJf@;vdYKZNue^%M~6}|tfxl~Gwqf1;`Bxix78lzyxp`VWYKqb&ngqXnezCx)_ zxaA!&_c-9OZ#=%im%2Im=H_~*e#-nWVa9bgu zx^{?zZe^jU?*5}hU|=7Ld1l_Q!py;mZNHnws`6%*IW)A zN0GbL;FmbfC%5-Oh#ZovmL8=zR%~ZQlUB7jPE)(ftfe-MjQhgA>0*``T%c;h*74o} zEAL;wEG_jPCir#7d|)+M*y}L;#K?*!M}iiV)!pf6mzk+L;*vEGiS@DJos){rSL_2^ zn5y~N2lye0@cYLF3Jr`vX4StejerY_q2fKcnGRf#UVd2Pac!(TTqT{Ny>Kr*bU|7O zhM|#mDf^|q_@F1+BG&{zt)8G1UB>U~>Pn$L6hdmskGu0`nde=DBu3Vj8vM-f=2b0o zlGFl)^;G0y6wfG`1awzEdm^@Tw~meJf{;s4pseu(Pj|ad9jSd@!0isLGjSE4`YH2x z-o)@Raa(q}f0_#s&=dKMD0X?OQbUG|fqVBPbwif-K4fimPZt*B-#p|y%PEt9e-eKC z<^A>}VIbi*kpC+hWFV*PO+dPr+YERs>4=+|MuTBvV}q3R>iSnnX!&v6eQET_UUExr zH{YfkSqZlOtKp{fABD|73R|zMvx2Xsa}O_Zd4hPpD8!J{kpNu=MFlimuSW4e0$j_c zEaup8z+7Q}3?bw<7=9?iwqHKDZ92%=5QvDbHa0!u{Sh3)?)KeS;kaK1s z=O{1q{3`F5dl!vs%B%XMx~{QsT;V;$PlHwd;E;z!mfbhVmUOY6?}3hLkp8+``(E6$ zUtPMk>EgTx4JpmkZEq9gr|vuNtfqE2nL&mDAk^O+&OGCM*|SxwS@@3;!vjjz`S){? zv_Y*s*N<5P^s2~TANY63pKE-xLuog@HhuA4nLM6^kIJ3rNoz$}^E9=UJ@#b8E;;>+ z9(D?{2{p^}XMxj)cSJVU#oglbxfgGg=CeJmuaSx`LR!57xv@3N&{|hLjyBxRR|NQS z`#8HLHNao@<`R+Pu)!W8s826cRD=VYlAvNAamkjEb5iSmU}; z&)X;7Sg*(HlZ7Ys!ww`q347sxzGa~My1Uhy_lVZ^K40`1dU zUyO&QCSyG==(ub(D=MnZM908kePxn*<9gMuc#VRq^uN`yFBVlS{F6CCO-G0oe``*WM=E`ugti zMvhvY9yn}xQ7Pi_89%n|=r7VPLY2p2#wV4(K#dEfH8v**a_u4E2=OCasqfq%?XEF( zY>v~&I|z)~Yf%mSYpz4kZ?;G7J`y(oHes%=Bm zcD*z8WiaKTat8EvN&Rra3EK=>e*HM84J3APho0VN1o&Z8>+?9VDl^P+m9(tYlcfjqNrrA_rD9umbrf-t z3CvO7QA%G?VB+Zi3Pc`PfP^o2_l>HLDf-?pxIEWS=m|5oEOne^;Kn+{CYQv)zUQ-ZrHQbI13oHKWnj}FbY zQul@uwD03JvAz<*+xQcLY-|weAOqgEOM8P6d9jPYHmd!#!WdR+K`lXtAB+H0{Ytj9%F65WyXx|x&%fd3;%T{Wd&rvCmS?t3 z5sK+`JDeiGOO;$({lj#xJ`Q&!ctvPqp7C_M4<82bT^|#9XK*K+`L04AxqESV4;=BG z!3!0w)Q5osM9tR_w;gN(zvRDhy}PK!mc$a1j2X(q6!d5NxYRY{fIY~;Rh>wWa%D)) zY9x5YpdYk47TFouo#yb;3a+S_ND*%@FP$7UTi<5x-EQ!CY~WyEBF(oT=o}9%!+6it z-n3bIniHNvcXT+rSvh$=uz>ut0vVJ84VmEgaFCWi>UXgc+RM{{98!CJ5E#N`*>u&o zEbLt`YbrcEu!55KW=Uh4U23vSAoVT2kYW!x6WXH$v;J(_9e{JAn|3d!GqxAoKFh|U zWF`b-;jTiv?Wmy~>mGsU74KwbJh7DZ@}(SotXR0wg_``Kf8{sIN`eBPNHR{x>{4e?MO2|r=C0d7}vAdpL zZJ^CXs;UgT-u-Z96SVFpyBZ7Le~KKXw8*vEmdN`Omft-`)@>TqC__%xFu3931kI8b_X$%S1sOjtKg~4T;gSAUn^ouH9pmFRDCn4-@8$YB0{w8Pt(DgTTOES1OrZ*{I8A zWSfEx7lR)Pu0%!+vJEl#u7;3iv&1)noN8$N54zI3v*8FB;kiG;6!R6cDRqwPzRUvJsstn0?tkpNxN~WK5CDX4EKTU;@zYU`Wthf!GDX zkw~Xy_YuKS-&`8YAvT|Bz^t4QS0U_km#h`!AxyTXb2l+HovASFe_JfI&eJU*AON_$ z9KBAvx@x9GsWloBl@$~Mvn(AK{l7!4D=AviQ5C&LWUjHM!jPNY^E&^Oe#}rBNMEmb zaN&p71&mVf`FV|fPC4zwATsb95F+zwu;ofDWLT4)y1b*7tE_;)^>Qu$a9EkVGS8|> zOH2ci=n%WNw@sQ2OoSNDTRjuh3IJ0I%<`#w4!CY|AtAtHNB}rnRJ4z$B@YW;yU!pw zsyfe7m^vw@+$>a;&Mjr4J!P;ysjg3ZdY!qV!h$y?f#MmnpbKK24q_Rz-y#RI-LE+9 zo|5!>6Ml?% zH89!QXfXKs1rYcj13pygNxZ--;AtKYSa1cN$9?D_;=nZc^jg&$0_OFvcdxxc>ZkyF z+lPsO`uBUjuk`sh$2K;xhjWi>FN(gE?wQE^^CL{3)C>FgV=C%DMmBQz2@{8F?U^58 z@~p|H#U1^;cUF1i+OMvB6y0-atr(nw1xXR>4{YbiHY)?sC-fwOjip_Fyc<7eler>r zpnNa2iGK8OC~kD-g5S_ebMc9EjVC^x!KX) zJ3UoUPqo%jq~^HrNji-(V$9Aqb%`+1^QJMxJ9oZz0XN*Xk#;k z2UYE7e;6`zk7}6H8eH5?ulIh$Yj;c^!z)S3YxJde0~0Q-HBadPU&RKWR|D{O+p%hm ze#Of6G&OQFNSloFe%jF57|Jp`yz8v|Ck<}3p8Nc-$3v#89pNB>XgW7H)FQMfO7gH# zYF{a0`Q!yB&Fu%tN0lHY1byt{@!s!t-Go2v)WX*0l2tgrcL$P%N=c~D#L@89oSRO- zjQ(85>S9#N|04?iq>p!{TH)9?9xLI1O*&;re0vzXD<`;g;TEe3v6ZFP+`&MnzrG6| zHz7(vnqv5rK zRiVMM+Qp%j6y|oe0lzF+L+ZOSsWtxOm(f-Pmupar=9jTFA|NK1THGk;+MUQ?QmASK zqIx`IU~kV>)+sE};F1`w%yE^6k=eSA%o>Fx;1q~Hv+bIBDy8D7MxlZ$3&XN|6;jz1 zN(5GO`{B;X9~V76N`>Y9$I6{WBFf}-?Ks|AZF4xUCl1=!WV|WGSe@Yb+OA+Ii{ne? z8&k$8I{YP-lL=tVMqAIGd+N>Qn{H72Tm0^WGTS>=tEKLPuI(p!)wztDkS8bdD`UL& zh`i&@jF$V=+MbA|I$IyIP{GbFY7^Ye_+KAhn+2Don#L-rx8FHQ=0aJgcty{*1Shwwk z3a{1ug3fs3ICCAHnj?>Tv`2aWMpKsOXu8Cfah3XDrq^J0rtj6_D1W`z+g94uAOCc+ z-q-SjE=dCsbgg_c()(G5nSqh>^mrEyNcg`sAUmblG|lScMIup)lOUd&Q{`!~vrS#{S2qfow) zfb-{)F;nKo6&UAUBnn@3vx}O{Z1Zm`XpWninx#!2PMe2H$va`;{*bZYv0Yr7n0bK` zr%sGxOU3GP_i7jls5mdnC-mb;X}*Wp;Xhu5W{J!X#Cw}McTXort?u8CcIy+-5N=%) zHk5`hc9j!I7Twk$KtP;Im6!}W>`y(reR5t#IqD_f65%}wcWHu%U|Z(Jut~#mOvB>2 z=#kwrCLW59T6)ULu=kue5xV|HNlo3j^$^h%-I{BqcG(=(ig_pdbV;_A`gFNO^!{m( z(Um9R$5F{P%GF+QN;E?F@#EZx=i0HHCB-MkQC*p0fvZ}6%abk(hxzPO{*COI9y5ge z0s)-N9y>T%Y+P_~1RDM{X&=*jv%mp#MP9~YU|z@<+>6dn`m9&58ff67hVYpix_=qQ zi;bOVh?$1}p$h#lo zeAB>a=zYNOzn>$o<>O_$4RT%w%HFd$8qu6hkb&cv_Wa;+G^#p$!f~v6%az>4K*D&N zD2$47vm{`lp+oa8O6b^U3s1idNXS6J$itw;$HRkQVB}VKoQps@ocWOBb>DwfkpAV6 zX}Bi^*i0~?REt(qR#{nl?fYDo```!W@+dJ7h$Ak4Z zSvbOyS?4r0S@3#_z()0XH=%}%<|yDe*Q0&6mFws$M3OqRoM)N~&W-Asy|G*J`w+g# zRY)DZ9tsHqvqB{TLT-=DlI{KWDHPH4$>IiJ(5#2pJ4Sn$zbEoE9QmtfEPM$S`M+1{ zAK8;3fOQU-o&C_*z(u9TrCedYA5*_;Qc@D{-O^c6N>Opjb_LP8mCIwBW>By$z;0Td ztq;4VTa652GBqA>hQ;OWr~7wGBnDQD&`4V@GL4~x2Sb$nDSxB}Za(n>9O6~IuBRZ8 z=)9JHZL|l(#-6Wy2qInj_3Hze3LmqrRDI3sa6YP__P?xFUymp>eY*C1y&<$^ss)>* zEJ4Tn$T6&6h7-)t+^gi$&bZ~ys+>bwRW*_k<&~_F>UB%GHGd)DRTAssC3REFs=m$B z{SxTa(Fe^AI*5Imn>C3$1a^w2fu$a|%iUCIOG*?Ll+_XxgNw1v>$ZbA_vOnvY?ZN9 zE*>^|uZIi&BP*jomoSk{GK;0Q#Zt4fvLz_yhoaMuu*0t->us4R7|0A3)`+ECMW&-n|b9umx83`XLzNWthh3 zQ)lhKk{zLB`y=u6sKm>6f%!hk`l~HNueC<&m{+B_gTuN*hjmN+J*l@)2s*S+e}^mU zgQR?i_1U+tQR4wf@RZK{y2snw+sC~H*RC$x9am2e_mExs)ohB&#^~t4DZ;v3F}NN* z<*f`|FP5yc$t~YKU*q$6*uItnQ|^)HBic`QJ-6#KfSj9uxaVu+yIIvsnSc-8$U;H_ ztjb-o5!jy2^wee`o6IOh`QOWpzun z!k`Z@#OIxv6`t*3`s{g?TjVQ~A%Bm8)2-WP4zuLx+6dW5~d8 zB5{>5)a!MogY$(cHW&(IsZ%4D)QkdVSK%j78iz!&0Cp|lljTb4ogOP6ZJMUFp5=si z`xJK_BBlAXV2(zs(xuhXc}k#q(=WevO5rY0`fT;ZF^;;UIXQ0PpPSHgW!uRq(Wipv zx<0c26S^1>&3E~a*Ts3Zv}EKK9jN}b3P!mUr?AoMroFcv2?`?`q}4I(Qq z#9E>0_CRme#wv&77)6VcXee%)a2|8xLBmL6{C)ZRQfz=u%a0P;2>n&08){mjw02!X z79U;!{tlask~RIwZ|R9d)qOusRyYh9K|EcSM&B_w4HboX$~J>kJ%L-YPtf@Mv&43z ze3AG&kLf*Gqc^DmW*3MZb)i}9p2hy)FtUmp83dGFg+z_0ld5YLySB7$*qHYVdvan@d|Gd3b~3AMi}SL1#`8vEuf=EZ4v{q>4IfvW?@!Z_&RL7k7S0cm9Nc=S zb3Cq>|CHO8hXhdFa2p@U2g=@`S6BE98j1`ZasAP7x}7cWtxp|T{C)0dOq!ANhhPC> zAY_)1`9rFEoT%I4+SJW6c@|pCc@x+B&?jw#@9EglaAZK>slT_vRuj+Lhzk0lO?`(4 zxAe#DI;=E6Tl3YUC>>adeCeygNL*4oZ{|zQ(-s+yFZL$rZMWY0p35 z2{n)V92(8&Pu7wSTW_$$Q4{>TjVETw>ertq55^SqQRK*=$AGg{uQ4n4)lt%z%@SMf zN9_!W#|jUfL(YU~8akA+%+d+_fo0@ZEJ8|%vw0e7mas>2EOFS(mYyHq(bv-JDW38d z<2bQZ21KYmkd6B(sa%>1=%(dPVOBEst-=9nECVT1$iYFz?2cd+qREx|Z$wQH>Ii_~ zo<+RUB{hFJ<XyA@ zuaqRFZi2FGDVdc_ByF%ADK>&t&UpPeQ5+904c+BEj#G~LP!Oi4*MC4MmAR5`-M9E0 z?4{pn?HJTjX!AT=Om2PmQ7K&Avy1+kYd+0ebt$^c{80H3s1F&P)I{y4JhIchgE?n> z_hSf93fq>2oDnH0=_u}iz^yUmYilucu%cD@j*_^DiVaw}K)A2e?5hyVwJ;=T(bWS8LU7VcLFe3HX+E6C4iyG68bRPKqrCh`8@WswP-V3a22M( zo5}ymwb*G32#w&7xhk2&bDhv62uxg!duz8o!D?*Ilkc*CXsjaseMJO+PGG}QjY2}v z4FLtiS)lNFti9C?07y1vn{<3JT|AXi*1Exg#4by@t}YSg5P+e>Y7^3> z61t{`07N4hsg;ige(y`g(~a&0K?8K>6FJp4v+a)96K0K4F@u^Y*r$dGJNy3-YDx%9 zjS!9C{sc|dA5sA=tjxtTKLM4RxA~Zlt}qJ+hl`6zgg06ZGj8^{UVON5-64?muK*r= zH?lctp3V=hQR;I-YI zvXimA-i_5^a`dablE&FDSWCF#OAY8t3Iwjl#vCR$3pdsDrMLIa2df@<(5(=14thUn z5B{pt-46&{FI=ANOEZ-T@^A;)+gkq2%{AmKlZigvTbj7PE`tY}3r_pXoweZ)FVv6H z!-M_W+B*%4xuf?oWZ41w!^8mk)@m~8Q@Q4H)p0-Qzoc$|Bd?{UB`0SWQD)lRuFRMu z0e>s<-o_ zd&Pfvr6X$WoMOC})%eV6?E}^VCG6cVoc;g6YU{-eK89LZFpvVZNkIh_8AW&UUcWT# zyB-j;))$j6+SrH2G|hI!hQJIAAICrTJ`Ap}u4SBYUp8dHjE7kGk<-}oPG<>;!#`l% z?FsfUbV~N(MXbioY|2Ya{ zik@p&*d+XjDNths@{P@d=yt;lQ6WfAB*LaMf|OhxO>f$5`}6LDYzdPSYlTj`9+JYF=Yz^6 znSR`R9ujaFaBA}ht=YqbZ4?P-N2h!NxHH=e(OSYVyGnsU@@P?C6r0>V)aIdK9_yIGUz<2w{6W4#Cpf(OV|nZ8RYSHv5!wtfec49~Vv6LRzL1IBWl&7#(Apek#@14qGo;k}@jqI$K20L)K zUMc$AW$dh9t&OOQ8Ll|re>TC^nH%kmVcQr@2@{V3l{0^uni&n>Rkx3gAU)er79&6; zmFRjm+^IOP;h3v@sBg<-Z06Y(15;1_)wbp2La>5`!ykz`&q`pK2t;U~-K2Y`BfkPP zC^E$?!^j_YUPEFGUieoSTt8`1+K$VDe->*ZeqQ9~2IHtk-l|KdNxD{eL+K$pe&N>K zO}l|55yMocxSWiez7ac((_ENd=8-)_*ic#9Q7R-s(T7^#SS_!ra&UnBsLVF8vMpXH z2Yk=l;DnN;N*GV;wPK-NxRWy^EJnh9G$Ul{e4Aoe_Kr1rV-hHTg2K$kGy~WFT-{fZaQQ3TWb%)ZIR4=Mk-<&UZUEzEz za?y{CbZ%k18ovV>)?Z`UaUC1}s|lf_aW)2?$xo&}9|p9pc+lqu>{5eY@R}+Fqt+Um z#tcU1XgOln5T!E8kMv%`EXRWG&nKkZbaCDYE{|2aa)s}LpFOII)JcWyepj)0f<8;D zR|+>9-~UcG&}$zXUnYQuZfuCk3x$#CO23W;ntey!bUV3mDF40N(TU5r;?3u#I){YV z;PVDfuY`u}uEQ7+kDc=A5D&+w{x*@uHAl+sdS^#xNYm|0mnNA_;%@KGq>fH|F~RN| zQc}H?^z0S7CCeSA#+Q;aTH6e{M%rVEAR{~B^tXL`3&LbygFxiCZif$rpg;}weYMtZ zpoN(x7xkO^yIf6}w5r;0f;ZBB=>W(s&uo;#new8oGf?o{C@pjA5(oq zJ)3S860jWtW=stYN#D8-HAY!Z9U5nC$nd<_Cv~M1EVsox&R+4S`s_bDqj^Z1JuIgWn!#Quju{DZ0Q}UGV`AVxs=j|)G zahsM0$Q1T+yemhAv({7#YNuZy?emWnQ-C$EF`ru3uuquIja#SAg(C5X<>-o{?+GEj zSy+iub`($h(kVH-;u>*N90S|+Au4e*D*fuUam;fd5qyt>kp@qorltn$WLl9aWl)zG zwoMk{f--PfI%U7M*A)`a0Af_#UbLwX1vAu3bo-hMvlFei&e;EV*rGl}_hd8%vz3TE z>GR(JQ`H_hp%}sZf6H~y449oJ-aZ2Oxbr9Hr}{%oOR2X0*%79wOWAi;b&fM0VE?Qu z20v|Y?raO+NZ7F#v)GG)4(0>=;P<;#nsvX6LO*9(od3i_>t{~l-xrmt+Th0vYcpV% zoEDF*U(f`gpRV>pWQIy|a_cv2>O)uh@gO~VB{!bJ)tuuaSYPS2^F@pR4BCc5ZhennuA^0VvrpSMPf2S_( zXta)wii%pWY}z7`O;TF9=XW2E5soza`2_|b+Z{o!vD3#&N^16T0A4&3?7$pHby6kY zr-`IfgG)G&%GLJmA}=BgI?u>W`guy&3f#`U*x^P&h}uERjCvL&v;OUFjzcOeqr zt2WFS@MRar6H@vkz9eK)-eOBX=pc{m?FzEK}yfTwj?5B&z3F3@v=h zMwK_7PLa{L-+;r0{oBNcwmS1H$Zm9W`hS5C@QdA;I9zbgXrm(y3RI6&HBEm&aX6!u zG|`)286u{A|4B<*77|f`$EIc*u_$^Eek1F&qsu~YI`CjF0AgJj-wcS40e)soYX-z; z5|`oM_Jazkb7EekV?Zr-GxDImFp+WhsQ912jzzJG(?=prEtS@NP_%Tu#sN}hL0O&X+r(Nfbo-Y5j~&O*c(xV)lA0K(dmAZJm6CfiF%jj1I0h+f z16JD&CgD;c;O<0;Zp;{1oI-M=J{pN1JvLyR0^cSoEjKx#H5h&3Fm6hsg#QV#RGCN| z(gS|&`vv9T46Cevx)OZUliV_~myU+s(CrM|{3Zp15fPR?jZt16L=9dTx2ybOo59ZM z{5;pjq;lN;Qv12 zF&3VGJ;Sv6)ASaP_=xp2_9f!uHq50J=HeusVDH!O2s}a{!ZI^yx&cA?laHh_s!eqs z<2teegbD}O7Jo+qU;qGg`8Vt_(Dj|cwqI;aP#N)Y5$M|5FunP+K2tEzNo@K>!FGVh z5)?t8-5WVUFHki0O@-w<)mp`zQ@9hEg6Nf?nU`V%PXh$e)ZM>(jHtaenaiMwmD5F) zJ8NfOTmd6Ep=)IS@ZpC9&T?-JYI0|B@z>)56oc%iZnO<(#5FQyc z3#lY-Tiv~Vw-2owerp2b)CV_-8?7CuOJKJ{t1`FJGSP{h5_b`k@Mb5cQ+1NXGK)$_ zsrWwYNrr5u6;F;ZU}K~w5*DC~bnj+Z;mPm2Cn_>c*{mC1`&sM5KFj6isrGf$`d}wY zrAzYkhlk(sVP%e_$#creT3g~2;L}rHHThn%*J^_x+Cg%-(XQaRk{=>|1>0~dUob+nwVD~)3r2<%j}X+ya|!Hku2?o6xsm zGFjEd0ew&k zmtC-c^G{erOjg(cTw6TSgSUUgYoB2y;qdkLd%j4P+6VV=4b+Q(79ERGCyPmW733-3 zc*zdvZY4Ql<Hg}sI2tO6V!6KC3U{sLenJ67*+il>SpLbcMmu?=N^4Wkzwr^y(jj zg7eeZ#pF#a6;N2%y-VEEvrlMlJdR4yHF+0?jX=*RP7ATm)l8_bjYbt7Ov@Jx6APU$0+iwl^yo znvIXAJzkoT33vCU>X636uF%lXrid_~gl~(FrR^Gxw9UEpTan}4mzZjur@K`z6ibJ1 zwypqg4^8VRZ`i7H1`&179C{019fF&DQ(C{j+{#ZPYLUR}*(QHEdBOF!f75bClynX} z;nnCRN&b9=yA&|w=TD|jN2tzIE;Wem$cEuC8t%s~Dkti$k8dLNX;2LTn@QNGZ-L;Cy z7w7RbRAB_`?(BY#Cc41BP4IaxGd$%#XsCW>4xW(3(eRQ?NNy}zn)gP40W-&xFj`G| za$;g4^`LqES!pqC!R5031x!*X!J<~v5<`oTMujNx?%JD<^o>qEuCG-6X;aSvwDC?Q zs;?K0U7+Z~d0fT+-wYj93O5JrF0{4dZ)OUpNiG6IF6Z5k>73GR z5Bkr`_ZK&uFob zzfjZuGCWU5(xeYP;dS@T+&Q@N6mMZirUhZ?>VZ+ow$DFjuhSO#Zp#X^&+N@Co;HNq z+KQuC__+1}vjEVbHPc$fTX3b?+D;VW)cyuy;NCZtkbs#z&M`1)!J90lQ35E|q5lHF zt+HyT_=B^~psHtoj2qY|6ruuVa9EByB4Ghcb4kE>5K*tk$)z*x4SeN=I-LeA^0?&0 zRDM8Sj@rlPq#QiJTPgZs!BtmRX*(Wp(EIUkPBU)Mr{T4I$nVQ5EpzNRFtV{p zncA#0iRC}j^OMRR`k{p5pqBxVy5cxYWEp=V(PssRVL-=^C+STKs?H}B2k~w#N>@2Z z3veg6v>473317aZVu+uP^N1ABPcL5v`$VvqHS{GucQmGMqE;I^UhQgt8|{y$bld=bYGX5zm<2LG5=7@IL(LcdJZk^CH?Nn^{0W=#r(C~$#>GX-V$WI6(av|+KD!U zFe1M9Y+rtO%yHO~R7Z(#dJYgABxfau6;B3@lZ&`1Kq&}=P-+B056Vg~2igjLV zcF7L-5&(ZJ{f~~v)oFjKRcrh0f0Jxp!gPBij&}YJx6V;_az~-)R9g_l2aPaKs%jd{ z&h5y{;dlc3^qb94CR`7R>}&i5=Z?~0fQ5T%yKW4W_PCBhZtlgrTTOieu0De9)oCd( z^xBs^a<6yd?~Vr2`64g42ahZQRmxb|4;Rb60&$Wn(&Z3Hthr-r@pq{O^2L|XFV?S)_Ol)uUV0iBi+^2ReSI16CSUQ4?GK@DjxD8RwJrl8)HuV$vJ}- z?^2g|sq8{ND%GP$gl{I%q^US0+k4RW#iz_h@^wkZP;){;z@6zcE5q;$Mrw_+n9GxY z9u@^DwRstg4NXFv>x<=(hveiRsR_wHz%&$Ill|4ov~ZtE4OWm`@UjLt-k~T_PJH?0 zehi=u?1Cg4-sB5R!ag>$!qd=@sIO%ch=rY8MD+%ZSn9PXV+S^YXdWOP)H=sK`HNk-Xlek=^%6idJDaC~5dBwy`Fm1|xQYf_VFOW^?B1 zgU3cKLpND)4O!}?+Khm|0hNzrIQ~)Ubgq56mXq_ZI%?8|$Nz>UBZZungeU_4I}Atr z_;ss0r|?Qirm43v802o~WgZ^TEXH6A~(iFtLz=;V1O>%W?R_ z?>>y|>m#e{n;1pJB>4^IelBch|2&0CgN02?Ssn<#9|F^gbepM zUNLmjQY@?06`y*JEbVn&2Au7P_(8v%Q{9Kp_!~@*f^Ncz8$^5fl?IunGzM z6o+an)HkV}Gw5SZIRqgh+jz7?G}{(H`Cq3(yD4DifE9dTY6;u3D!YGt@~<>uSPE!C zIzaXXQigz}o!>+sAW)UwI)mHh718OWvQrn%x=WDMkvU0ke-EIR{ zwIM(k2>KJgdniaqXEI$Yk-Fs#O=TeQsZol1B#Bm7*&8gfHge##JD}*+SB}l zj{=!4m_F+P9I7PH5(uOay?hhygjcXkr0< zfMn{pMd2ZC$xZU5!;Tt#Qv-bm_i^g5L2?f8KyBDeLuqSG6?WTfa&i?&fn)pV*L=9) zDHsZl&K)QGI`jmpvY*4I3nhU)By(^z9{Jwobi%w`llJ^!$NI=ZpU}Qznb- zlE4*mzPTxx1C2+IztieFbaT;f?KyCUgNSV_E0h7KBq zdqvJv4%D9CHUINS{tKoiUR^iStpy{{{<1dsTc}= zAH9K3c?6`Dodco@${l=@G=>xwoF)yp-brM@otU#8Yi6b#aQs-mhM$ zr!a>nV!lWIWLR`Ex+@{&@>?y|tn9Vn@P%)LwEsg2x1$D@1*P|kt6wi%OSl+IT(MryN(U|XE>${rta1W` zo|#6i%A4L;U9`v}39N5RU$-*&f1*eFQ;}1)p6vxXE%yn~Ile0q&R!3ai3T#=(m9@8 zT~VNSuQUJeoaB1@n%|jpUuwR6dcT{!K4o$!9L=$UY;x#*C?5Ko^y?+_U;75$`?mbb zii(QsexV6r+f(9X7{T%(|5>DH;m=7TNuj|G=%wfxG*)6F@a_!6K} z(W9B)@z-ONaA^P4*gQYz#MwHnU*-DDv=-#(c@@*Il3y5cZBu+VmzoAn1IAAt&2Wb; zLM&no_dGmxESonWt0MBAj@vO$VJC5H7oreq|5mfCu~nlKVmS?Dpv+hmvZ>c!8OeB= zW(lP2#lD5569v$$VVhbKY1Ll+$?yJV1QHsisVjx@LRwM|Scczh@-8`m2(bWVmUA58 z?hQd3Ahm-_xhDL7X|l$r`vKV&A$RMsp2O^}We+mPF|TXOs(bORxHm<$`-74*81)*c zu4Ml$FmrlaADQ8y8ZUrfn-QXZe~|ZegW!oKiA$h;#CykLT5m8D=B2LEvpx5SP3G=8 z8So#sV7Tu87fGyEZ8nw#V5Ify26|ej5SF;!C7&upnS!xc*V(r;?AH1dfKz_^2K|mN zU&EYjEBb$z4gk{s`nqgYnz0Rgpw^MFQ`D=3WjL$2uZs}2c9w1nY!20`jKOd)K8>Z` z6-^ztGd`WX2pcrO2Cgh&s&_T3SE%G#;ltEebp+i#&Z(J_yP?g2tyaebId&ruM+AP_ zs(HcVgFV7;(-*mQy`9lO?hGvt9uMt_$IM$E&Vmnrg0P_;HtJKUFa=$=?+2iayq}YF zKPVuLSch{?pHQg9G(hP8+<4DxIZwB~i4y3p;F$ z${x!J8Lb~@9qQbzD_c2Vd}TMeTlyg11A3uPQ2TGfY4peN)f5Zn!l)TcetOkL*e)hD z_Z{DGicm?B^)Pem)8`h*`htm*ZTbG<`BykSdX_f1=ppf(7&TY7}yto4}?;_G6#{qmsnZLj>_t*;tzjFJ-__7z3G83^bM z2Io}8a8E6}7v|ko-VjIhQ8#=2G?&_n{6li!scf_dQs^-x> zF|!c4|51$jLG8bbG5c@~*A5#L8_+Rym|;Q1j1N!tAfWWJF8b^F)N8G~f^wir$7A&_ zzSaX$r+JO|hPJP)HX8;703b~whDA&o)u~gXA9FB357s(%->XhM{HSe}rjDkkiO>_~ z2jnb5Sse`s_I(+eC{aX*b^}y^Ejj|+ep;Dzn_>>knG&mqDaV{HDb7j~+5&THhHmK{ zL1>X~Uws82lHBHAMljX+8H-3>rhPxEC`*ZInl8|K?2`CEv;|16yo1_*%6V;QJa|VU z)Qj*|6Qf^Q5qpz)3|xq9{HNsdc>%wX8xk5ouP5OkHRq`@#4-a3%quC%SmtgqG980d z^~41oijfkDtxHK>%A;S%hm|%9o~E{!UtjWtXuG>TqfV1D za-h{3`7fvT4<7>;1=~!Cy?l);26$!Ndxm@cVr5pbu?&J!X9%Qon0A|~(%LDlty42G zuvR8Y&S6jd=9P-@j8_d{Tn7OvmZSo%e zG0NW^L}gv-(A(escErG?$YWA{*vq z1w_a_F%8koI0l@-2SF#j`!6*I6d^HUw#6(^#2n_biTqiKnh}$x;0v@bB-;wS)=hKbA7)lQaFz9cXbUKXVEBAD}8rNaL&!CZtK391C3cts||C}R69Lfh@;{vm!4 zQRu$~b3H@{1bgTPF5a**K5C||$P*0LJDe@r_d$x&c6%Mh>DwGn(@4YxR!efFm#s|R z$LcE;@sIg)#8)|`hcjPS)%NCQsxqr!oRR7V$oa7GoXfhlE4gI?VT}&>D2B}rPRBr1 zp9SUs{J2|f!%T{xfg@rVc_n(>XnbnAVbz(Ht4`YTT%AoK)2%`{U*1%;2q|Q+aRXE2 z{<+HKSYKKDy5*$Rkp5K@h~)I!N5lzVU!xw*oZQ^ke^S*L*wbqz4y>t;zTcNyv7c-N z5S||$C8jQ>>#c71nUP(zr3}nBYgSd4G+?8iQNAZvau%^5wP(d7{U|TLK^f+Re@yI9 z(gi)Wmi6n`vaH+LAo~`M;V|&vzdKFCVdgydPaKw6UYf|)WOH3VF;y8%TRjReeqL$8 z^Og^3CPCww&OIKSbJO}5atJiI7=cYk#&`DjgiWVSJ@7mq8r^yAc1v>Qz3Y@b&Bg?S zvX2%iTl0?vA8k@DcjLW&f-*K1GvVtz8xVx%)4i;xc&r&wT+*!WHiMe4;wnWVoIo;H z6jtW~i=$zsOZ=+EaCi>snXfnpLxO|1^5rpBjd`kk5#4LtAP5(oIJJs(#$*V$rY{md(jU)3Tw zlR>Js;XD1fTsG~x-8oCkVFYhjsYL)+jUBb5%>7|ao`hf1`gPCbZVq}-c8Yb#)q_mc zVvV2ONDTtQ0^ci8d_T{AghUBCv~Y<6{ARlR)rZ@%Ypo~E`A?gHv#mbQ2#if%gO1Hf zHeL;wj;Dnd8;-oIQv;idZS+`tE2>MzJPwr~U>`$tXwXs&5iprOTB}tk}9E|lyV?GCMv{n&6 zI)~%fPBnS%$G<9--`+#ywmb4Ap+(^4W^keCh*n?4hjS>hwpDLxVNr&+9OC^BJ3S+; z1@f)0A++-YA+|1sSX*1P?b3FxSD}qfWKV6hTVRHUYpOZ9WS#W$T;LD*q>aEKuTPpc zBt0YV_YJO4&GuH2>+M#YRw+`x`{GUZNmTTFxwzHPGizn@`SKx(@&>n0gZsBsOT3zu z4I|Nly2(<#q^|kAS(K(0l<^&{p?#!>@su6|;%WbeTDHsUz(R-h_yVxiYgVLFa9=G8 zEmlv>KE`L0E0$wKg#_uTAn+`9FiWQ??!orx5gk67beb2|TFmddF8w|t=1QrNp$Quw z<(u@-(EYuweV_YQMT*>q4Ge1IKcTpVvCZ67&lIGj4GuYRVI({x|EUG|OIniM)W2Rx z^X3f{6clw1Zgk@9@s#PK{9e8F1nb}0)I)|pp9=tE3l8473L*i>*p12|MPNE>TD&_NEj-e;Qq$=i}^CHm4j+g#J- z^AqkQc4;N~VNBoS4+Rcu+`sM4zT`~cm8K$vGy^>;7ezI#?>ljCh^ct{d7x8sVzobC zCk#1hBBLxnk^KaqfaD+M3GRZ|S|59iRO99a)86h+@l6lm`#~->&tU4O<=yqNIicWE z9WxO13WLzlRx>TXFD@?5!fk~5D1{1+x=xul5lpG-3{cur1Ea`UzF7`+l32l`d1k1a z;#shg1D!PeE6E1O2i3a=nzBA?kxO-SmA&TD{C;3WaN_PxVd)LzhS=WK8g|}%7L=-Z zwwk~4dD;o04uO|NMns&-upZsNJb+0~7@oru{d`+RV#2ggQxcyu)=4AMOo4X~Edj1r zMvqWSk=IVN(o`uh{9gm!+L8Y*Mo(Lv>FL_H!@B0 zZ#O6Jg(=-eILNu0PHtv`(j?igNHhy1@oS1!34ZYj5T-1zW!+qO(Su5^l4^;N!$SIE z$*jJQgLncpRb*G=cYSkvWc*jIQ{BQ|%*JAhYI%>C;2z8FHi#GsRrt66&4bmzG_gd_ZU8upbqxHJqCuLi!6zbE&i^+&~( z0AHYPcV+M}uoOZ;rO|O=r)a5JGamm4?)bj8j{Lnp_E>qkzvyPxKV5l}v!(XRy@>zI%Z?ha{=L4oQF^eeF|gm& zarina;L;xzPbr5aasdKvC9241C7% z9?}m5NtbBrM<3_UXoTz3vkhuA4)b31ka_rBt+o70+p0|SB9&i87D?ElwINnkHdcv3 z<%hfh+FI)*B5|(_MT$QZY7~&4xz=zAq5DohueUj~<{U`JtftQWK@|9MNEdQU{SULD zV;=k$cZJ5xlt8BSsIKp zr)(vb`_#(;^i^!iMTyWo94w}rF6vp2{`lW;_JEW zn6Lv~7on-WjOT?94h9OVVFyneUMnyR)3JJv3Vh@M?iy&x%L_K+b^zS?TS@p$Jc|mS z9ptRFwaEj{S0QO2Un$mfIkFa60`(b{JwmwmlZ}|bT_qwop@HhCOp%WmufipjRl#c^ zT-82I4O|lv)unvwX{qbTAiwmWP{c-!pHH-Ssnro*!E-7dj>gzV#;L4~ zjOt6H-&>V`F4jg>D%$4{#Zyx@_lcb8ud%7L0VA>U5p-byv$-4#(h2!0f zF+VrqJFXhsW12mS9A=4{hHeLTmb&{bl(f})?Xb_bO>E)iMV;~uGNF%#+ipbv4A9fl zEB0$}<5Z6$UQo2(qr$o*BvnYZnxuT3b7Ee zpe!EN$ASW52qGaNQS8UARqO8pqb#u~&z@9Uzh~-E-I`(bNa%Kpj0059E~q<6>(Myd zYJ8(rN^@b2s=ZxyUz5idRZ8?dIT{p)r_DxSR;ngyfv}1k8yYnLgc>`o6;A~HUQoqI zsb^y|z|;s6`pbCVx1e*wX%pa`zCuS!YU310mzkB?8)A$;ti1zMQw%mNs_D$*cIOw` zhUGxd5^#8Tay3i9T8i3>)yYWAM_yz#WtY9qr_FUVN7_y|Rg!`jl0)*|Qj6z2kCY)c zXG^`6BfjI5#Q^?&$-GyyRdoG($}%^lI)Wc9*t54Fxh(PSr3-i>+})j}%KF!WD-IKo zBREnmu9J1|O(-l+;0}nf7FTFlruk@iEOBfm_$UeMx+Q^$K;=9<0Ucen${pMwv%V;8 z567ZQeT)1b>C1RU)Z!=ufu$DhE;- zoy1fL=0kPvoLHpD-)rIEY_}n0D^7^z8t6S7w~q68H`y5i=ve@W zl(b!B8n&^qu?i)4E9`owM z>H87V^p~di?H$7W{QR>>qAsxyYBBOiAm-Z^pB1b+VM z_=u$^zkAOnPp@MH1f<=jucs3Qt)1Q8nz;%URKZ7h7~y2RmqsQ=w3-nw=AO!n6?1pD zwEeu&kAU6CpwrZA197B)D{bUpO0dtGQIkMKMy|w%d>IJnWRfmF7u>^L8Y=V)KD+@+ zlqov5O*LDdZn6(xUw%f~U=0k|~O zAj)CZBxf&!=-b!zT#=80(@s+smcyE=OhjERofWZOkTC`9f`;j6m)QPcXMep!r3h2_ zP4k#tzDH!L(PdtLaZ8%2TmYG>`Epg-{jKg^ZN+9jNfz;?u*IbgNPs*=)CxV z?K!M(oGftO>9Q0#0!}kNp6e+14TjmFX_-sp#c}BlM#aj~L|1Y%Qqt2un3)eq z>&Sm`pOg;B-Bo5`q_nnmf8*O(!VDg560N%0nKGfyjT_R8DvcPj{pcRgVBKz6*Z14? zo50?Vz#Bmd8rYTE35=5q&8@?2xM$-dHL&OLIPHVoVM&$5jAtgYKwqPE%t_^@$FZ7H zcxf#5iQ|NyY8G-6x^YBknbxqtUrzHs{@U_=-n8f(uFz`4N9(PpW6kr>X*wqDfuk^G z{-5q%6S{Wcy@OF}rKg#dy|rlb2&!~RsYSn-V|_jsBlaNYV;J-3IeP#6xjl|m_EWa~ zXa#-Q8?^>}?bn14-z5P15@0$aA^-<;wM&PDDqGadN#k-7%_4vT>BdwSO05u8RFL0} zk)dB6_RDN$@64;43~47#8V=|&$Q+<$Q5C6Wd~in(8_M3VR%SPu{(Yxy+DJvOvDQ3u z@7E>iiA~>PyGlwdJ3?_p6t=j?zqr5$Y*D_ru%KM{TDXo{u=er5^F+B`rD)QkW;5dP zfiV3z($c>jFFww!b1rC+6O%AbYoDj9s7fXFY?ivbN+rmLrhPKY`dL;KJ2jYr z>(oBQ`t!W0goNXt&$ic~w)vM2T(^KN(hoDdF}1&v-tCB58pabL`4p}coMh)_lZwq7 zTd-9mqyJP@Vrg*ttYC27W5sLTaMAn)EBOcd&|J1=Jk)-|!$DvZ>Hdt<7x#D@as%S! zcVek6!j%2+$lb!Fr9Hx8K zcwE(FI2RxFZytC_xQ}aoPL7K%JCFlDkv689zdk5htSVCx?^NIKiHVc%ny*5cwQx?T z0=~c~cu?Xoy-F|)KIWd8a?6wNOY%|>l(!-XTk|^19|1pCu0F+Nnwb9N{^X4>d>B*p zm_6RfJQY;3vp3af<+jpy*peI6^OzTBMhR33i;8aisJ`8ZmEAzR)tM8Z-mJ0YZ*KO2 zf%)#}FeGVgiAKLGrft;36&bl|RQ$o<7HhZ&&A7MK+&}xA%$ryD&=aqd} zMwa2e?AZstKFd|r<+(IzcIwfs$#-tuh&~72`796_hgZK5>D{ zJnv*maf|f?b$!#|66bOqTb|i2KJY7}d)%67aTBT#UqpKwH8@%a)@^Xz{r^j@FYt8YNt1J zcHB#!F2DC@4@xf9W_99XcEA^UoCeR(XcEI8h@6=%3^cd4+L5iw@c7*zODRjuaV2OUjixWEr9&Q=Qk$1t%C{tP4h%t78lJN2aTHIgsxG+M>) zaHrP!1xt!{rzdJKBhAyJd!bcrk&0!!tl&X63{QBlP%C$B*j&#Bf7~=-muo$y`1Tub zEcw5i-P7GQpQp4ma=)R?xO8%ZrYJMU#4^F8G0jj>h>r75a6mHmKsYc2vv@UV$6Y*3 z%}h)DMfjm{R#j1J@hwk8(%Xu~k%zozYhIVc=Ig;YBOY498&Bp*Zx{FX3w!VCiO{@8 z%RaUm63TEk3_E^WzU=+Zn*b%3Ua50*LpRt9GXr8+ZW9xn|9tEpf!)slGf*xt=rHm} zBkio`YxeRhZrjQDf!SlyOLI)(1}l#;*SA02!2FH#w#TrtGs~4?%bGzKoDR^Yc-N`& z$heMr*w0GnXk*2Si|HLRL?(*xBqoK!gKu?TGGYlK1SjEd`p^8&m={vah$%tR<%#qr zRZRH$Oz_$2c+!8ZFilvcOoW7gzxK6+shZr1*wiRd(OmXu5d)S6OWt^;vU1zkjvt~F zemc3HYp*vdc5n;1ZA`AJ_nwAK;$G#OoL3=qe9vdqpXkuf?xrzTc7Jp76^BKqN<}?O zp3(~se$*H6&F%1^B5v~27W-q<5|k}jV@+>K$u@T~zU?k7U(>s}s=G#*R2^>fj@&_? zgk2N5)|Uuc-%p?JekRtd*gvD_!51t260}aykBt@3Bbm4Kc|9P<)|yKvi!UdQ?c+Fg z83r~v#XB}z{z5(^!XGW1e1;`8VE`%?iw~v@l*(RCBQm>Fy{G|I%j~{WIVNmOko{qt zl)s#0nV+vPd-kc$pxkG#0a`Hk$jPrir4~*nL}Pi>$^Bbu>30Xqg~qaigU})=FI&PU zu(!*~os-`)fw%R@@97`;Uz1qduOd(V#8IZ17b@or4;BZh0O-*y*`_BLf@0UIi2%vt z3x2Dv*Vn{qR-PrCR>Zo|Sq~FfOtxeI*PHH54Kut{2u&Kes;w=D`!JoBMb!0l?BqFwi{eUl};+ z%kct|_0*&Nqc2KOg^fU8#>MYx^JLHs4Wg|cE9oiA>iZ{)C9jeq5Ue*5exUx)sb*JE zgLAPi0KhMvh{OBFYMl86y%5a`6g6RN!bU#W%g3!(hd4`?0OBfwf)U^)**R zj>&#@8jPnYrUgw=XJYF&%j zlgQy9sK=KMB1E(YHf}EsB?{L*P-RZm`A<#7R98U|AW_Wd? zA@2TBVRy_zNflwo=%d0%2b}|r&6BCOl5Bke%*^JByDs_K;W-65F+=|Vt6=9-iY~}R z(%I|G1jd7d+ejO*p`4 zO3OVmv8R{f?>2k(YT{^i8coM(b;)xLEumkwl#9F9@4!QiQR7{duzN z?y}D6x;Whu+w<6`e64ErzIlNTl@bFe#;+{WE&HJ$@dXM>h$1LGSj+zAnfJcDOs8J| z>UjCN9l^zwf{w)hQ6{gEuQHNfRW4q@1Fkn}@|CI`JN44L>;%iK`mSAjX$rg;LQ2!~ zC>S)fAsw8v|F4WnkV4Y|Bd6!jI+53EdVX(x)rB?4LCvoztNi`vvX(Dye$+|~KZu+y z&qjIkiiOA5xhVJ*K%j~XsUdle1#9XzgQxM_*=If6Ii2x$G`NzvPI(gduq!$w@tIqv zuMaQryG$L7S~5UmD_AdxB-6&qstIk!u|&Z zqw`-BOxT5y$w{o$Mm+?)KSf}IP%xPQ1v8#wfDx@IR>hWddRBA~^j}THTqKD7VF7uq(uici!|M{&?zt>Ph zv*n23EU~a_V~&797ZY*rOG=-mi70Y3kv-vZ9bCavGodP>%Pn5V+hui)RrM(`mr1gM zbKJcsA~X~V-n>$1R?h)~BA|^ubbT)9`=m#w4+cS_&ZMxjym^Qkd5jfrBiE~JBXxUz z;aSF-IQL_1AMcN=BZ+Mna5SpTNPL5XPeyD09334Ue6Q~_s%+t-d!Hj=V%!oP+vqd$ zeEChi-N>)6n6JbtX|rmlcycPWXKyF&!?Qd!N2JF;bYROw4{-%TYuM@@AGVJ46y8%gM^hI(HC|=Q`aQ)bty0z=Lo{o?|}>Yvfdeu)a_;4~*M5O-;S$p;)sz z{H>G`94D<08eLXfYKv@$;AyCRxR87xUz>4`n)lp*Wc1YxoV-r4j1}vSnLk5lipNuZ zeqUbZx-@-+T#1>p^sdt2F#dQvly{hAW|}^nl<{y_9Ye`E4Ir3{Ki~< zi2-;r%-58UPx9+M-ygH%e&g&s7j~Gw3ktK%2H^iC*EfWLNySwZf+~tE=A{7XgUx!# z^z{CLQr(q9Z`a20ougDm_mh3kZ`TAof5-(Lt+l!G=`PjlD+_G0FajgG5s`He@B26s}*i2y$gqSq{NCu-bXEVmRS2(OW5A zffvDkMn5)#Ems-PPJvg!k=?*F3ocd|c+~|(Fda@U7&Dce9&Hwsx$?iMARL^LQuwK% z)5~Vrf2ht@a@4Rhe^Wo%s^-%2W8ie2EuFk~%RN%r@hAE_or$a=`LK+;sUP&qS8vs8 zfXqWT*rRh>rn5`;61Lbtc1ZmHccv)IV*#K;7X*J3$0|Ineg^rY(vS!U&YxZO5F2w2 zvado(R#T1W9!;VwM2l68>7fg2(4k87P`hE(6&&fVoqmr%X?Hyw?(ACCIVhN?2L@xJ z#Leacqsy>5)$+@{=C4-}W{G7n*_%(DT$9uAEIq^7E@wARHC*Idhns(a z6@*R1Nc{zmU0x-G5|@WMHttZZrwzPH0IJ^TDdlgdsi#>qKi$380QK{Nj7M))%M%lu z3JV=gRoNCQ-QOyjzNX`MZYSHXw-IGbbN&vQ-eV6);UPzL<d#;TA$dR0zXel-Mfs1C7;` zbG4ga1>>f}MgE3?yJa|3{2>6Ixx=!`xDN&l-(#NkyFTa?3OOr6MEB-?s6m1LG<6X&MOwf$W*Q$N?@)O;Z; z%nS&a^XiK#w2Gtzkq+JN2_}k~c&q2!DLVFcFu^}02^Zne{@yiU|NHh1GF*4Y^SsIW z$|um>67q4`vt`@#^Jz=hw?i34GyuG}(#rZduJm#{S@pO$(~n!H!Nd=J9Uk##6}xH{ zhsT2O&r6ohRNw6WQwsn^n^3;{LiGplFrb9*d!M^@RuOx+62O$gfZRoDF^g!=1P64T zoloCVM0x+7KKFCle{KPuA9lF9`se9=GA`kwruUt3Z&=K~Zp`Av#eq2)CH9^54t~wl zib>E)!R6hXzN#_bC)fn8-#uA9T$WXF1akM^XgkdcUzw-QD@P?X$(^l2}jS zTo}f8=LD!PA1rwNb$w1mWi0fJ6K06#RQAf5|8VoDtR#-BV0DEwel=U;f!I9I{3;aL zFLhgf+${pLGjzEMuG{^wJmrt;p4n8(kG{N>!7Po4YIy zbv!equksUt{lzz0pqDGDeb8kA`CIZ}$1 z>*$%1!a?DI`tcSQ;o~qc2z;JOg@Vw;+-1L88_O#C`2QNPagl?uk4L0GSX6aa`4!|^ z_uhem2h3>;m)S+I1+wE`rU=?tQ*OiV53!E&vurCASH%Z?rbL_kZNZRhGQr{Z1Jn zXKf4xGUiPI-m(64d8!^iH5a)O9hWOxP4rPd1$d9^>|^6P1ND3;y6<3UDi_GFASje2 zY|ehom3BztKNTV&|E6+1ukbqH;8XU&1VkoLFNDufRojf-#PyZ4i|+2LQLo(dBF2=S zSKZ$^Z9t z(yM876u*)q`Ob8FfuQANz!P0i?c!lXLU!w4i<&7}0kp@HYlEVH zp<{5u`Bs$1pdosPYLO`y6IgAdh8Fw2%q2ytJJz_hapIN}WMhLsmq2mFmnm3Eckh+e zWyR;V;`@We2;sXlW$Yibw8jA=oTrmVK~DNX`*2>}-UZy&q8oT)f!(XM&d1Ck3GFmV zuNU%G>B*f6T=Tl2e_AK?W}iKGILp%G&s7Y$wv9Jb3$A!b|`TCzKTz82U&#qF|h zStaAH=~62@mgaz}9u>rg9nRBLN1z@<@vT!v&xmmCYE7GWpufDxbqGw>-;I%L>06m* zcoy-h{Uh%HXkQ1E^v*u#2bDy|OyGNCQI!Ztz-G+tg@_{{_1aQK0!xE zgOq&L*(+5k=qU#_y3)dNYSja!zbY?8Nc+Un_$gkF;<8T@rmjl?PQ>NS4gErT&MewRBY%e5RB%q7{m zO#?I8Wc$xAm<-|xPGS>&7p8wDmZfXFGxK2*E9{eo(Ts= ze^;I33D-7D^Y4qgB(Mpm?`4(E@|b;QFn{dHVMi%DOJvIjH=MT?pFcg2{lq;gKr_s0 z6mI)#NX4~{1#yOp`(SU=uCnKezpQ3VH~}mYe1Q_VXL22;A=@axBgNNiLM-o9g7HCL zKAcu8edA>{_`mVG>;JC*%WC8*AwIFM1O+Bdjl`QbH4+pcD7EVkNoCiA8=0mq5YZQb zy41G2?X#DF4#3vpr)cbraQFuWxVyVo9{)SY&alGJ71aM#u*C}`YLIqR%zF}9QFiPF z5_oQUTI&jXdU`s5vF~d!sgM=z&x?sqvD(MiROR>=5H-B3;xeGy6s@R;!yzCrf*Tcm zAxnWB>lCuQ_5iXye&VV7EYjCM4rpc*6V8=MFK5}o8d?jsd;aAuCGmgin+SzUZ$Ia% z0U46&r;cUG*(V@HTBKy8aJrlo@HOmyS-{v-|2G+2^iA8g^>N|Z>vh}olc@#l(}TF@ z-)j{g`ID8NA{qXDV8M-P{or~cOZ+zI6>iJ5@Lxl+43DSv`<@uiuDKlUxHq?-_#ED5JUz$~ z8_cqTPRh61J7NiM^@jo`l&3~jL#izq!+AtcdGoucrY@cPs7}ShqqmcRE~#`U{&|dk z@5)N^A2~T&*fEZ-)0^-BK%Z2kWD$^(k}?mdl&U6g=UkpMj7K&;-9mvL(!H)ORewUc z9$*)Yc%E;KbRN%s2wFARuF>Xl32^Dq8doc&-+%K3m+)QLTcM1z20I_!vM5f?e->af zMi+_Wf`UBXZm^ms+65@0N>s3niDvhI6=m((E+Y=99pa2rdf6&r^_UiFww!txJ(okh zbmmo6i;Qgc{^1`VqV*mapoEnK-`vqQluxTM=EPU?d zRyxj}?`%xbho_GoP3%67CMI6>^Dg&$!TBOC-_wCsJP((M^^OAudtSZ}D`LI#7SWAz zFZ6NDG8v-@(Ej;LlK~JK(01~En>@Y&Y9f?qNc<(-dTvx`s`y_Y-Zu+AOh>Q)ObQXK z@1#6#8H1(mK5m-JEUVA3XD#dbr7E$UfQvHQ>ZC0{te#V^OUter{)38Oo90VM2t;V7 z2VGtLZ>0_X4tk$v>hexr^tlD)6#n>DsLA8U%!u>iwb0PG?NcV_I4yP3b^IpfWuI&J z4#MYpo>4d9Ah*y2$MUp7a~+SceL7V zkM`KJYU2;W@*3ekeH0M8fm1)Y)&pA(G~^Q9f7)8g*cRB|Sdi@@Y4bc$)taGMyH#)V zgbuk(Ag61nddRjiY=0`snhtP_kZw-7$!UF(`goBjS1N#ide+Gbd0htg=}aF(vEq@<<(CgUWZvQ6U<@Ha zZo2GfZNKPN4Ht`u-M~|g%KOgzvhOWbW2!~TE_}#U@`YLt`&2+zNsM8LSn<$r1}PPE z!*fk7imjfvXeqh|v^GP#!T@Pc$|0!BdZo55$vd(0^^J50I*?=o#QByZUFil;yDwdg zj>Ovx6p#Fq>YiV}Onn@jalY|o05SNp_{d{-QM(ypx*h9k{)*t%P3+|4GugLlV zLG4eKv>5#%?dVqkvM`6hY0KZhx{Nn9hn`YPH1u0$Tsb!?+zNQSxwv*RKZr<|;Dg)Y zKamHI-u}6GY3UcV6*PPA#8yR!YiHYrULSe3c389}D!U(AC*CgRQoK#s|NcW;*g0Zz zt}@aWQ>M}>wu!GtfHy6V7N~lOUO7qm%}6Or)8%*345+^}DEk(z29Q?5x-Dh`?Eq1k zD)EplREwGD(z!VJ!^~~$5(XyRkMy@AYJfDBwEk;%a!Izwz!uhn?}$8P<}x$2(C>Ml z-^>jKkv`v3#XLX8+L~%>jB0A$-&aRU!W_JV_I>J()cIAb1JPJ$+;3?9AJp2c9LTrq z^)IIdglfqm6*uYJuMldDZgzES{e@bSUjulvla<|Kg{QA-Qc~#z@_-_ak03C7x>z~E zjHQrJ=JzLVSLam#c_V)}6ALEtDluB4-NUg_KV-fwfCbW1(pRn9gPM^3x{l@rYbgS~ z73F$mh!SPk<^&S5-AOQT`t)RaJ21?klesa5a_KHmZu7YO^WMFHpO0@w^BSuR0^+R4 zrsWUo0+Wewz)TUmO#RBhyE50J5e0d_)3yv6l?sY4+J%(cYt3Rx^d3xb6tr&HO`$tU zp{tP@rWK#_DxEYN4|TNfn?prkz~qM)y|I6eZ2&4Mj8L+S28>L82s85+EaBNf%Tft@ zI~w}i3P4;9g*n%cO-@4IY-U-kK%ys!BwqH{+`pzD;G}}>)>MkMX<0y>ojJ;;Z=}oV zzN!#V;0493B{pr*)Cst)Ja+Jh%zwWP1F&^KWdm$^xRNOds(O5d)%Kw9^&w&9hQuS# z(wge|WNs_3BdFF#P=B*O{(!y#;TD+J;jzD5JSrCiO5C9nj=Jl=A(zF36vV20>Q}yc z6o0LNH6x%T-XoG1^|ZrdXX#f=lXxK|oI15lI=fnZX2>q%fK^8)u$N59eGA04C%jl~ z_>qt`#zs}|LC0EA`tj%bcs3c)osH7($85W=dVkg^G62c{^kRuZ5fsR$`iKQ@h_Y(T zNUMGjLDk3m?ohX6Vg3!sj8O)0PJK(x+$3NSzM6^>vnD!epkRlJ$k~2@^Xmz8`4fd$yF$=MoAaBDCBjvkdEg>NIOi~;?(&=UvCMFowJs72ZU|r{U?&9y9vH9u%GxFr z>M136ei+N7qEq%z1%l&wD534RE9u$nu#tfagXZpAKhK8+BFensKAhsm81v7}Zk!mi z4Fq@1-tVAg>5C95DP>5~f%7-gTIk^vbKh|66r4hT!&vUw=ktU7hOxYM^(;^Q)l zh$cirsxRc@)cL@OMph*}mmWqW{t85nDgEO=erN`UHUv&JKX1*3$f&&qY<8pQW2pD* zxWO>+4?ZVoC+I>9#A(y}2j9>F^#~!*z0^gg4)wwX4Z6ediYHBYfVrZX%Wm4}*1QxF zO{T&D%42|Vz@YfIEDqJQ)ji)Sca$$N6~m1#UdHRY_FAz-j+iK+Bf%mfhA-CY{dq;! z?I`Qt#r^`?@mK;9t|E>AxB4$R)D=UI#dOeo9ZMtp(+&KtMisxS4n3BdF>f6wBAvi- zv_Gp*z)sL@p&Jo*rMa0?+CYUFaZ}8R#LAs`6!T@OL)$KywD$i)*;jx?)wS&oqJX4= zgrtHDDE@a)$-&*ZG1u-b<)!iI6b?}2C{I3qmF`6rvD_7;$tclZV4N?^A`lvnv zk|zwS=Hyfl{?}C~&xQ!E*NqPWnsjU7&KyQKfoOL*4SX;XLQ0L)!0DT0wzffM&}Hs`u>tlZ<6U>7|javwJM zc4`^odw2iLJ=O4bu*11niW#A+mNk;i;tz=mAq#cXmMsenDHH zmHeMWH>R{q;&;>o0F&XypXdew){jqdxepti-ZmSIcQHY|w3PQ_ott%hH+_#v{O7-V zb#m_jA1!>n^ZY7Yrxz;69m^-tnu*&8-ooA}*SP>hW1AEww3jBw$4x0=g2!splaw2` zLjZs1F%B8u6?LhhN4=*z5Yp7rF0GF82DApa`13@qrq$6vsTkkk6;@=6+6sDxdQN7R z8Ni>P+5M~z-^;z^ECGDa7LTk#0%)XPkX*F3L`UF67?NpZ@c!F`J@F;sW8X`3Ns|Yl zTTdNo#I;&e4zRw*R^2Ib@BM)`X0j$Rd)-2U6P`$J|6w3}_JF;1IE0}ojo&}(Yiq6x3P-cI1x&WTgW zXRaq7L3@RX4+^kAF80u!A8l7jYo%@g+6YxgKnC%w;6O5FxJV*Ne(Rs zy*BrqCijg3x))P?bKNJ5DRL&$(jnaz&NHz9j;ioB?GN#V8#w5`dpGwM%S>8qE8SID zL2{XoDWG58QJ9c{M6Za{zN+Rhth$-svg_RmAj+ecxM$w?nz&~9DM8;*g3W0+IR{!kDERI%)6+DTyv~ul7qMIS9h^a z&m50lc}m-|OvzNSsc2?M1E)RQdo*?GD(X$I0D0GZOmb>NbS9K`yMa1q<{9&7O&I^# zd9@lt0JAE0)49YV(PnTiK?scKkW|_U-!P6|f`9*P&b<;()M@j}?<2%7|jqEYt+Z zG9!SWSur%Rq7y$t7 zzz%yWAxcHX)|ay1%fe|w3^$G6%^fgTcn+zDwVErKUXVt^qO3_~gSstJ%hV#T;@mRa z4?%yr+*21j#<*wFJj+==LcrtQ7=bCaGx!X+F^{{9QoRO|Tb4;C)^bAYieLl;u5U%I z9I(nGSZRJ1cR367@K9l~Z)e-g927eZdoRsz*v0crRw2(lBw+zoD2kIkODg3_r)oZ&-7 z*f?*!m_W;9E%$ARilMNb_Y~YN#V`V=4_a(N! zJ6Oxcw?WX10;XcMW~Hd~QtgNN;3s(}kr@WHMpd1)&2K!Sl7Lyv(F!uC3=!Y{aoreh z4nCQ*Nw~T=Y2F2VE~lvktzI-RXk^(Hu%UO4Oe@Z6XK`OHxm3lqUzL%veUco(i!eER z4=FwoRa$|Lrdq+zW@fSDc2>Ry2tPmBoTV~vLyt?f=KwTbLRZQuZg^*@i=?Y3xozy( z&ui=NY4R_&Ve{t{Csa90t9X;6S|@KOe63tI2Ol^d(MLao9SU?PC1G~&Wfaa2uepZ$ z0v7)<9{##t%AEX-&H>}nlAjI71fv@xH&27hxeoS+m~09hlx;KvR8o=~jxIjiNrF{p z#0>?iQ0$03__wR9FV0TEN6z|=3u_vAA2-ka8PXN$(6EvvBYWb;0-`9+HokV7i zp6>vs+q<(R0Vr1A*&nkk3cvxsHdR7LZai*KSZdN~wrrC&-q7ri^%MPDH&M0)u&)M0K8xPMNvip#GCc+Yf7wsmn}#EBew_oY5O6d^BRTA zyrcgrWl0PS6Xcl@TctOzjC{ot9)Kzy;1YmXF?cYPfe9!bgvw>`z_sm##>LoNW9#nPYN|e_`})?YCJX92v*&JJEN&0;N}v>O@hjDZ}7y~#rsMRx#>FMgo$7a zA5iv@dIVlOtTqE51-P4rdYB;jo}Y-TONpW|H!KQ+2G;)r zpdK#)VbhbvXLN{8;rj11IX~Y$_bORHiVT;J2zOb7Do}A$5u>6KFzW74?k#%G&eB&A zgLWl1nKOqh*-2zOVtX5Gk5+SF*P}g+VPpF6_Mq3YEM3X9W@&17l4lZemsc9i9Y1{O z+plTmx|k14%ac}~dHnTjc{c{Ykxa>b={S%c?|tA+hYAwB3_AsrJ6!+%*^MLLFmdn0 zt?96|4}tJaQ&Bqpe^k;R>xY%Vv^f(M!Vv%4aHSx${R$R zAMmoO=J`)rmXo(w`F0!L|GTS6nU3G zWb$@p|JuRA=vZYsD*AM>{t_*7gXf{xJU)n~2kFAJ)XJ6!0E8!%!Vb0b7$EhlUH0$R zo{q>q)dLwY0UXe-?DTbtiKkVf3@2qBD_}0A7xL!;Tzr7ak=UaC(2uMJOTzQ!s380) zqj80k3>v8R-?dpXMLIj6#87_AE#l-VWoHns!K};36J5DaK(pP7F&+MMhw+W5!Ze2L z>to9;xN9yTT@}um{DS^0W@NYc>jlv5$+ZKTreSDr)}VYkl@S?uNH5~+1rByisf|AG z;(KEe0EOWh(=5bChV+1@+CS_mTljVLWw#R`%p>?b+v4ryUVh{y`QnfW3UlE|(u|QH zA4j#E!>zGC65*>gCfH8H7Oy_(;ZahU7ijQ!k|Pb<(&g83=poIG+g=bH0^55qCG4JU z(uYE=?1fWe4rtmUmY&X=#1`A%@6lnnkldPM$go3^7_}>Z+AZ2J$&rVSYz7o5?EOjS z5_RU}T*}yW&JlqLI^PS z;^P2~){@kb>yqEl_KCd9U1)MLaQnysGzhtwDa(YZl9x%mk!1Pf7k<7KJ(0vGlQVKW z8FK0t*1@em!|`z?UDARxf*t~l$*m=W2=_tY~5 z_TVp0zncg>fu5ycYGqdvrqKnW{E5D{LZkM4)1ch(HIt%MJ|YNq&*hnM+h}MX1!`I# zFHci{QbapIq}7+=b*~3Fb<>nAEOq{%(f+l_wL!LM1gwTV{>-#J`{WvTR)4_$+6dOi z0yFWBC!*!Gad&kwFp z&A&N^4#Wp!XZ(^$XG4>xJ_}1@RL7UTTdo;U6-D27`V63ifB@_5KI1yd9 z$GR$cJe5(nlTx-O9x^=0?zr(dOj(Qj0_85fM#cuq{%flFoies|W3scI38~-qnD?&1 z^rZ=caDSlMb9fqG!$`I%cn2ZtTQ9&wZf2{%UDHDnWxoUORPq zZsMW51o}J58pGGaa~jm2oRGbic>9Md)$^=p{={K+1Yo%<1@`bEr4c zaft`BYyYI8A+)mUWYT1(g8J}aZj}@;Z6RJR0Id#w=@Y&`-!MBk9RR)BM%U7qDT1IN zGxd?x8Eet)7~Fk~Cy=8frsHE7g)yYhxFXR(K=Yp8lvoGhlt;baTX zZ&xz`uKiu*J#peAW_3ed>z;6oghiUKIW?^hP<0zAeryUZ-F`7HM9g&0lYCD+AXlgigv{$8OX@Y&xaPb37 zj!3>Ks;})B=FjaS5*wf>BO&AFd+OOlJ#V42(*-)?{7t{Wg5+&&p)#?!!6A|>LGnPQ?khKv&i za?DCjFy<@S(Yfh65!h6b*WjHQDZ$0Z>Pbs(2wzPmH7k+l$Fd~zUjN+MZf5^do;}k8 zTEi|hzLPiL%*k0(XCC3b3kIID)az*ZS`mIngJ~D=g&ml6|HVX&^~E2to@y4)Y@2da z$NUJhn%;bC6?GkE=;&z5O6H5H1CA?X+fSKtIj2*{PVNDxPvrpAn82>}ICeyjO_8k zRjdvm`atPV)Ocn#PFBQ1EZn@Zy+Lx8BhTwjebsg(cln!{9|443cH+03zQr3ch;7G? zf>};vPLWvrwfHN{^QdhRmA z^gEAMWx8{XzhIX9f-;3y^pIY9RHm%Z87kBy-ziA!cYN&p_{Ko~Ec;^ex}*6_$GcZx zBXmzPz~{}*XNvTjCA@8kgX`$P7s6#Cf@PO&N=Zb#g437RI578{fE*tsio_G=)U|8Y zkLc%v?q&4)a-N3HomL!1fRQu$`r027AkyG9H|?IYPbCf>35(@&=5_p1b4}CsLvEEh z;4$cfW2N+DzVOr43)7iJ2mSVF7<-<(*Gq5EMnwI~i;1*o1FW1wJ>FMhF=K{5=i36P zhib)9-vRdD5$iMiRRNo(vmZ2cx^NH4RciR#RDxuJ^d5$+7#+Eg_NQ`id(9CsrW7$7 ze9HDLN6oL=v_{rWenUA!Q(QqhWhv1~^^Gc0d{qKFMdiFuT=Fba1$H=hRt@?*7B5qz z;66C2tV}_^5N^Hri0p+njh#eAfaW1)P~M zfzj=PD+BGGR8L7SJg-wTcoSaaPe1QzVcM*ic)3d}-o4?eaSwOqZrcS5)VAq5#|0bj zqdaS!B&Gs!PJD6hEHwr7UYXgF6sgOG$@2A9UXjF(XeDpf7flce0n(s0EgMEBKBk8x zX}cGu4T}yl?MjVChi+aS-k@;rk##|s!@7P1_j#>jnWXgOvYvVy36R2b%^#$!tf zT3y-ix*RsO5OxYdUXF-SCd7E|pPO)+FDDCsb!JR+kEXS;QY8gdW-H6C60PNjt)^pq zeFRw5%E`ZAsBo2&zdD0i&_LVQHU-aAK~WrUjo&GaQ^`B>%X-+OtKcX%so}I`Yn#!v zMn?mV4!p9{iw)6DSFq5dROai;hz=uf9vq+gcW!W;_;-fxX*xf6;v`g6S4GaSlFu2% z#d(;4NMyxBPSMG~LGl!{zD+CQy0gO{Cb>A1wTGWJ5daba*}R(n6tATo@!Hcc{`CM=;J6^W-Vb`*wDv zOUsW1ZD@=f-_DoU*#DTP83)vl_G}VM(1mxI#Q?#D;iP$n(=8;*neH54_sY#i^9zZU zLUiLjU3hZjId#J~=4x`q;a~fGu@`Vz+tD8+SLj0h1nVl_)0Ds>VdB(SsGUyO%e45^ zCnig#;huk@454a8QF|iWL8)*NmwF12+|9LEFKyk*?9rUA*c0+hJ96x+GUe;HQb$Tt z_=BoyCx}*hnud2?Dt#0;1V2l>M9Ssacv<>{f1(Dj!+&_T4&ahZ(QWCtvZfU`q*^L9 zrOD1(wU@(mBP1&rAK5*u51OM7p+3*jG7&eL$#{*`ckflo$i&GheTXdp zq;x>2yLb!H0Mmx;3lpE5CcoW_u}Sn#T}4fw%au93Ok7jk2zo+8xu9r{75Rv$0B34? zTCGU4z4^%?FA(NDJw0V*`{1)rpNl!Z7y!vSZ`y$i7FSgMluw0dcB=nMbY-s?on_us zGHp!EG;(tVU+hJ1hO`o9V;>hy3#_)p+4TqD2w(gfl!>mV=b}Eoe0L2RA#;*-RxpWL zv{c?Fc&VHmNZWU)$1mVMMvBz(0WB@uu!|iHDbk1)jmuF*PvO9O40aI>__&BY5ue&g zy_n{yC>?K;g1OtMSnsI`XWmCUdTF7pm7G?ZU z^Q-`t<(~ZfXte1|@EWzciC8>()u>Zq1umQY@(hqXp{GuKEAvd^Q`1~w0>H+=I@PE0 zf@KcoZnt?Lyx#uge#QdDCEYwO438E-J9~gpMAjgD?7I@k0E|AAFhdAkOSG>!wNQ1x zu)2hwj<;>BBNbsU!e^uNE<8)Lq+L%-V~WCmC^-DSFA7yLfOYb|=@@u&wSxMmFR*|_ zt zVWig#k;%J*#epp?cMvEL4P;z~LF;)0z(NzyGw|o4U*A2c2N%|fKtAopS`x6{yU$tk z_XAKWpxrCMiW|VA{czKVnC7iU@};(606Lw__EerRBov*1xK!H2TgP*W-$Xc@j$mB= zEMCjhJ?4wzJL2w~i+52HV4s`ynjsqz6mfP_vYJjcr~wvbOPQz z6y;m#@L)&090jzbF9J3|n!bX>WD9bd)7iv6xEMuof^HChuyYo#j&_3>U3J=n3Ox!dDZN|Ut5k(m z>kS}?TT`z6K-J%V#dmA2^ktKk5waq`p-Eb;JN@3ixaT5B-p9Fr=sZX+@@B%2upQBr zx{4&~m8k0rMb&j8r$@r=I0kkZb9z(N)$Gms2)I-xAYVB(^0frHkIZWFhf1wO6oafd z8lva#7ck71S;Oo5Mr19^H-Gh-A2&+b#B*NgY6S5U4j%4bOWUZ3O2D_uN;RuSC9A(y z%4TM&kjMw5nF};@r#il0IFSO2Ac1JEu7XYkba;6v91aL2Qpp7x%~tbLGks;NtN>T= z2DVN})_6WgB?XV(;P-|x4DC6kX@b=6vMPe*kyO-Y3|tQ*HDF!$ZS40j8l9@FoJu?! z@~Vrr-|vvavA;(R0=A^K&DF+6@OyBm2FI%ED5A{C`X3QcQjEN?%RwKQf3!1Yr(xKY zuPo5{g*=9wj7!FQXFetZ6W*#`GX=aVN8Co0z$fv)&0gDoi>Ygijsiree}N$Y+MTzL z#{X9&WLnKB0q5^~mqG+9w*4G*=EShCs*$XN09g8Y`yE`I?c9wjuVQ(AW95N`$6htI zk>|bLsg0Bs< zs-Xb*M)&+u`i3yg+xckY&tMh9n>T6!0VP;CIKcT?bR6GE{i+UtH6)(e^%GQC9v9#= z??JxHADzG=%-9zKZ?5~l?x^P;t-akGij0epNb(Yy84*f1l@rnM1h~EFRK#YI9rVU1GntE>{*(6qXoYXa9?Nim(lW z7lk9O!qs*Ng?Ml3`3)Klln3f$=J}>SyUNFDPbp73e_yhYXQnV9S;bBfs^Pb;C#qG` zQ4Ra-a3IN~^*#!DX=xP(wdWIg3^eZAOQ7;yH)nlB3PRz>Rg*P=G-(hi<3arR677r2 zQu`Nu>Z4REmN@u^)W~!WHuEiL>DcAcgN?FJUE5Uy9;+LR9`(-4a!(d`CXsEZGL%>l zWz`ZZN%*%-Drm-3%FMs##eE5h`<&U<)9)wSGJPS_I&YLeW#dzp`yGHV(tRO6xnVt0sbDFLeXB7Bu9%4iif};(3Nj>iyH(f3p|XxBaJR{qQq(l$NZ3K zZA{W{E4rf>A2gY=!jmDI%dwGXQhn#@KdIMVx)m_Sb)6LjYV{XXh-tj3SW>0oa_eEt zXC#1^n^zIb%+N3XTqtXO2>m`y>4Y(5X}4UZ(Wvr}&&hn;YQ+VYie&7Cng*j!zf);` z!_caVt}K*ueaOnqKyuU!iLt+USL9r%#LE4$+{Q*ld-^B>dOf6^Qn%YB6W>Yt6){9Q zRz)UGJuH0>bDAIK(vbjz0hS|q*5tsMpw#kab-7LEB_@jZqUmHVA`J7diqOzu@M6)W`n=aih z7(3zo{5&ZsX&TBQ8o2g06)9%Inul~v}d@RrP|G8>o4ID)J|$k!7s zu#IC=R|V|I@!7S8gC6C5?K3vu=eF_fYIhI+!iQlggBp_G3EGAvLMo>Ol8@o=%c3i| zY3%;)M>?a;8dRmM&|?9t+0bwV{ZWskEiJ3G&lLYp$~WBy`VN9v0R~O=$G=n*#}uP8 zQdUVScf<`QXsNg~HgO>u1PbY^{(bNGmNrI^0GL=ISFF>P4_?Vba;Qslf5ngyzQ94z zf^21EeCuIw75T39VlPg-Q_jZi;4*(FPPk6n)5}%f>X|cLPDz5ZU>q`t&~4K> zbpy#~CO8bISR>&pU(GWL1`2muqt#9kFPm3dI+ndb__Gc3_n)Om#B5_BUVY$i%y>nm zDSFzlcc_Gn>?~@T`cGoMFvG60^nVfQ@9W_3e)+cRIGMk_? z7d&d+u%E=+lx8lP%*aM}$D^$A3!b}?s&UzhQ*bUI#@ei=jh*0b6G$vil&UJYFste~ zG5IOw-8@7p;#6mAExfYAG6IW?&2}F+(h&f!ZPkr>6Qok>Ce$239U>fck$p_lp{zEW z)u`i)V%KkQ%xU}=Q^Pff)Kk6$g< z4&Vwu0wgB6h-3eY?K8u4TZQb(@^47GbXi;W&SQ0;^cf~-avZ(Qj8O0qE?LnWy`Iy9 z)}Yvn5XpyMNsE4KEf*AHuR6yg&oWz7+Nv#I=V;HDaz{<5)HP43En7MLG_DQ{S6wd( zMrrA8_sxz!QFE4}%R0Ol3+Yv=dK>Qy`5l5@P#_@Aab(T{^olGb^P{2b&{Km)G8lLp zy{`7tX+`hKSXR%Amst`pUR{yJfoYhvQA=0K+{3plrImEiqi_1GZ zmlxiXz;_iSS1?3T<5erj6`tLju?BS2GV*!o<>!ju*_bHcN2a}%h;Vz zK~T_Ou5Q3c|6}iAd^K;TLZpF3?2!x42T~?*{L3%=k9WWQpdrpEsjnvs$3x=fiI>!8 zTlI4930o)N$+(QfRbb3-JF-euci^l-UWTMNv7~`Q0nAuJmOGXIMJsw!9wdnj3BL#0 zkKb}3Ud5i*hH*W^B{}i({mkdXuTUuWRBukn{k-e@!W;>nH>XX8tI8%oD6VM;L+$UG zTz8W-a?UlR9kEYKX?`t$&b=qj#AM=fJ z2|_RIhu4^-r>O7CnYI}Ymp|!yr{Zpo^JHPkMb0@a*`Q%@T@ZAJGaG+1CpphI55#mE zT`diELLj=B%Tqig?CKt9?tb(9+p10K^#GDnnB$E7+S1ADx)+G|>H?3+yfuDXx4Kj; z#p)RGPGRBV?LWS4w>#kWI8bu|>~R)8Q0CP4aL2Cq;Uk04rF+?z4i{cRbB~ek>8=Y~ z7nuTYLHEV%GAlnY@gx`J{c`O5S9zWx{nwu#ZM-p2v&et=(>lJYb_zB9x#FA-cBX+^ zmWn?Om?}>~vS6IK6;fC(R=jkWBK@S`poKstwnTFxd%*~xb)Q{RqrMqg-=FoE;H*WB=-9YWDsv;1gtkM-h2f?dyIvP-pcuS;;hYuhTo1}ef&rzNc zk9a8xI5iN80G+pF$kZ8pkM@Ga;>MbM(0f0qF@*-?$iod{z0UG>67~s*`(ty=%?(oL zE!h&yIctPo7Q|n}WaiX*?|}%KKj6r-H$!V~1U5r(le|ii2v(VkzXKvd2IuoiV2P6r zfVMqWDNro~nd&pmIeqE!T>GYLW4j+(TqaF;_+UyT6UObP?(q_0g zpLI_Px6VB^uXJY4dYROrJr<0jchsjDJq6UX$^g$@SR87$(x&zM1wBdFHhxX&%=BLwsT1sVx6>&(v6I>Egcl&10^JvG-1v#u&S?}RQ}|bRw-L=>`J~4KC}u@|l|6e(9w8a_RjrWD z;N*5HFR-|6kKygNYs2e)`Wnn1jS^v2Ivywd#TJNbqgT4{m$n*nv}diX_`jLA1ez3) z9}o%R2O?g8$jIeUM~sHE4Tsu{{(1o{K_T{^%+UePf#l+jq5v-S1sI6bzwjgC?i4Xj zDHLaItCOcQRBPY0@~yG zo$9x@ic1(XWtj!?c_pKTecPLE7oSeI zkU<0xtE>l^FYkQsve+h}bVZp9ALfYxQi!7sHkSDk8$~k;FQ*Y{oWo|~Dkx8O8urNI z_8f3@jHn9(*HC~_b2OlkEyR{ajqBOt_6`Mu_8QT|_z1Gc_EO6Q?0)gvd@uULwmnzbhoJ@E-lxAuv^yE(Yy0-heuVR1##(xaatlA#)A&egfbpX# zrK^T8JSk_|sF7=azLtR=4D3uWZ0}&f0+x5e&s1${E|&rLpWMK034jOZ<=Ga|!mLiN zyIEqu`1hBB5LhOnb1^^zJapKyjG4fGe50B|5DsCR+r$?+ZQL0wank+m^c!ZwY0}wl zLMdotrqcHFC6u=Km`gb~PgTtYeaZ+Q;ChNDMv8jr{YUW=d&8DP<#sw`zl1|G9tNsB zVJ?z8(=3vzl607Y&uh$&R8drhu;t{S!r^er>rUZZNP;x-T+&6Wtc^sdeev zSYq6fGcqWn{*?`NXfQnL9yTOYRZ}ZyhD9}<;sOdeA=^fgj1)t>rx|!)2<<^-|dz41z2Gdu<2*$~5wp9vdy1VOx7XM&yBF$gXCL0KH+&4Us zMQj-m^99gifl7XGAt?Dxa&$CFBB`!&VDHAy=|9W9Go;7S#ru-d`5~Vli7Io3QbB<< zNg?^g?;Xh2vS>qaE(`&QB=>I_3VmGsu(lu{oXCf;1@kl;Z^Pd;^n!R6jPyZEq1%de z(^^~|&H&a5$!K>%oy8g;>O3hhYxO2UJ1)|i4(qH7zpavhAmU@Gl=##O=mL8Py~v`~ zBCmpQ`96dyh`NE+X#x-x@`OIC2)U|B(-|#a#~WA#jJ7ud zWg?Y&*ywDYYi}I|>uKMAhK-c4V_9e$+LV~J;yUY&`dGNHw!1j7rHU7-IVve3N$vk= z6qMia`{Vt3ov{UT3ZE};^ZAR+%hE*yP510U;YE+;UvTBvQR07YQ?szE8d%suM}-be zAqAp1A>W}JCX&2vECfJOjka{EEyTwX<^(X!^w36Cz)81$P#+P^=-hV#!d>Z;J@vhP zh@D^KJPuSGPMz6{o-#ws%j{n2P=B9ebe!z2j; zU{+JI9l!tx&i+et5e+WF>rm8Xbn;Gp3BCU~8&bM=8<4pM02Ur7f>tN`Y*g&U0e)l} z)wT9E5d*;Do>F4buNaqT$S1}AC-PBl4@`25%9o)!W6Eq!r8YGCi`E3OU=t+!g9B@? zf+z-hg!y10!x3>4847lQTvqktm5f6tsC2^8fKw0&&~t{;g$wtk!DqGQn#nrz5c0ah zj42a4ewq9Nl2*toUWjSn06K_weTOG0WPuxcSMOqq2$Yw=k1|gPmeO|kP(cMvTIWml zpq8>>$eduwiUM9|Bu9<@BEYL{sC{>HxoSvpM}PK zyh(c`pU~(Ah@vb0mB}0DGm{)TVS zGm^_|pJLwPfYQKSRs7Q3k(db3@AgLc;u9GOOe_iv8nm_ru|Ys}zIQF%7qx_nK7@N8 zou)R;6-;SMmQWxp07g2argI=zVwpTYtd-Zm#&%*!jUHjpmb%>$20&9&bhK5I(s;i| zszy1J_9gS_>Gg+OOiKx+PS_DOQ_jo4FI{G>;X1LZ&-1DH3L1Xv%#n3ZKFj~cCpEd2 z>;EW{)5@i8M6kqt=h?5xyyLa5Chi@+KUD%?!Ibe!&GakMsgu6hJ@q-_N~`=Z!}DOX z&ej;dG{!R*C3xQ3G56+X_<(Bmwh#E^*xSTYK~&r0woJLR+{L^zO?yi>ipaeMszv%c z|Dk7Ekq?WCNwUwf-;s%tjjUMC)PTsolZ@Q0HkZ%Qy*ChsXwspg(SH$$uN!-FS^pm; z$y{~8LHSM>F7B(hVb0W|Ab>yoBJtt5_oI$rN3%A!}`(b21h%bXC8g zj)NNUMcg8=^+nJB(f;)BK*52*(j;!iWIwLocNOeDC3wvN`U-7T?GU(&EJI-np=?=B z%A}0i1{IT*#;4P6t^d_`ww1-^$Th~}oF%_d8t!nf|Ln9&ff!_}hvi}oNbn(ZE zk&2OMALBl0JgUGF&3Sea{(JI6dRCnQA_U_9Y#an4AQf9At|ON-K7=PUc4AijMwJE> zBdA$XO|*tCQnGX3N3d6kVB>#~oxUqz1Kwsm}fz!)zd^P^0 z1e3BB!n};7p`@yI!Ye5F%H&0l~9Z64*5XhQ^9 zV|%ea=5)t@L%C;e5_^cJqT+ELW6MGhfqkkozE%%PNpY#n&L#qG2IpMCQetl^DQ9Kp zcmS4;ReXrsM?&7Helwwshvwl8j9@OnuLO{8%R<~e9H z_hIa%?%~edGJ|Vnhc;$KR>@<~3WR6mm(7ePn~`05FHGf9x$n!_E49V#kd=ie0%_&r zQ6ZZu%D}t(twzyL46iTl(9vn<;v#ANW@^)&nZ$IW^Yd~+9sH7zMOQ0x_*YPpi1%wf z#UBe*TwE4sw=3-cJ!7~Jc&f8~d#>}o?ryT$8RRFq@r$kKkg)h!;x_T-=7IgLsWLp7 zR*Rz50X?4}NqyHiQ(8;z_^l?F#|a{u+c}(NX0Uc$$EGZ~#e1((Z!#ulz>f(kl1!Rh z{jv(!mOC6n1|-YuUSAcv>D4v`4b;9QlvjBC9#@x$Y`s2&@Iv~R1=ly5#atC?g4=um zB-y=kStEdo=tKr}>6B#`f?7U2;{^ef);e0wKBs}Fju-6H(z<@*&zO%n#8NwRqbj62 zzL4aJO^eXN>7xq)!UP(2rn(Pax~WEQ7R=|*To}rq)D{elhe&1$I6h8@2=Vf!2_Da8 zBfXxzVsT59ArgZV?a;ddX(WB!tA z!z|(H*@*M1JCkePRGNp41;=J|ya0zu-ilVP?#;ZCjR4j1IDtXaS>(d((fs7(+YOI{ zFOnpiZ4k!p5N+-JS|aF3&`d)^l&+rV;$>2mTRWEtasc=tAeffxxvlb81aHD=MvA9} znvMM?DK_h?`)If2ZiezgaVK?_@?Vvw@y+5BGS;J`BQ7qk8rOFikIA|@ zxEbd>9|dtF*9YM3IftaYn@)Scza=V$~XKBKKac!MROVy~rZtbgORMsl6Cg@eIK(4FT z)?xNkwNU5p`sb3zRaW^{)5-wh`^4sSKULGI*UBlNc=k_qlAgu%q2^B5w!;2AP!UZF zcl|)zAA$>Ejh*ayH@PVFqR76+QS(rD%~>OQ(P;MP`a;}JgB%Ry!kH4Ln=93QtGu|H z%{nkpFwB+}0mg~oH=7Ot{R_~nI}xV-=vy66ZL~!ycTxRb_DhQJ)(0eZ%-c3k5omq! zzv4v(BB4lJ(#nuv6i_Yz82JXDcrg=$S{AmjfYhLx3ImTDAf8dF^SSb7uXXGSj)= zs$bYZXBBN#uNJq?AJhkrA1i1A&I%LT^qrnpu-G3mX?p873kL(mx@4sF&PJwd8@szz z^Yh<;^ZiW(43%{T>5w$3w?^T|2_qp1XUcH|ky9j7tK<{Em*NgG2Li zR8%%K5e>t_GyC)Sbj#K|-nJbH*}aB)0ES<#vbVQKWj+Bts1Mp=AOma|#lz~#pBC|$ zt?a(!NF#NQ(QocqxA1Ci7r(Uz(cBZ}JRLF929?(Sqwy5DhK8&DA4DEgKgZylTr@!0 zkt33*FTQXw8C3{sg12KcXR~!uV)%MHj>$B#E7sz}64+>@rfWk6}l1^-UHnGb2nrMH313 z(g*{W=@WpG)Bz~TUseFCeANWim(_TkFGk#qFln&6cpEvko7!iTOwBF5_tR0+c_a0L zku=`uWk~yEK67w5+qZ?~-ItK9QDK)%fe|dCA$Y#Ut1JNks?0DMx$tO@0ke%wBjpT} zl?7GAr9uG*sS`8U)g`gUcopf7uW03c-`0oZfd)Bx0cM@mq(^o-dK<~E;M-!w@sh4L zA~wG_6p!hbmh1fC|#MmkFK?^vkqZioXHdF+#eAi>ML43DDvk1L6G%`bVFB==6Tp{ zJ_ka2R@Ns)NRgv<(36|1rYTf3m#mB0s*E22C;-nE--al5GKgQrs(op`+I*?WnEOc7 zb8X9k1SEv zjSEQ?zHLzd5dn%x7GV1nuJ)s2Jo9l4+49l(V5b!5rVFP@Z2Rx`AGx~UiZ%XITG6qf zferP5$g?|@B9Pi|;l(uQg$=)0*>>4VRk1feg1f2bc1rL-d$aF{(PXs%ZAY!b}Nc#tK(ax?}P#BciU4nJG#Zex(y zT}-jk1)bFu^ruW!+H8k+?mJrOoef5<0D=|>1o!QgXC8Rn%Ga?$*Mo5|mTskF_5Bdg z^9k+^%8tP6U%7j2=kv7T;}>2}jV*&DtcHfTSy~TPGaDr5W~Xmbj>I4CK>V;udBJRm z1^JQ^{f~nHqo&XQs7EEfe5wKHQJrkD{ASDrjk%*bsdQII+sBJEKvA7J&3 z4%jdBTnm_wPq2aTT7QI4nS?CDK_6JrVxRXuyDt{^WSWV{7 z{YOVVIX+oG7pp4y*1FM?K<@5>k-1=&W&2uR88dyRFBf2#OkWxRwhlYeqIrgkD)ac4 zAupmsEPH2%iYf{?WZf^8yb;i1Ru!1;6WE~-_#->YI0=sKCwE^V*thy307M`-2t=;G z<$Zvvgq}Go`#<<4a~lmoB2%;NF4?z;qyjYN{r`<%Iu@1JawxSGx6ZEQKp4?4>Koq( zF8sajLPC$FQTBIeJ|L*zI3&_JOlj2qX(>3Na!HXy#0bEe@(18HE$#%a4`q|8=?_D! z9<&%8W8bP22uUUWKl$!^wyq$PewY4SmKvr7jXTW@U{Tmd{wXtd|CSjb^Y56?27kvz zvnkjCq`#@&`L8P)J&hJBdBnXTR0hyjD|(I^S3z=MN)|A8Dd|})F!eV4ggVOG_vkQ@V03m{b~H%8pn zg9acUHwObe7LD6W0I!P9?^b=$(%=SEKP#cgL3KQ86XqM6b_^OM<*Q*l>w_5UvspO& znByeP<8%DQ?bXp2fkxKLW}gmCd5lmBgr5Uhp@&Csq7~7P0t0Eu5wearfgB6>w7$bn zlgm^N5W6vx(_qu_I2H)hdoos4JRqCm&~o(4cS8yEzRFOTyu=nl1Guvh2clew{?E4* zoCN~iW3m#;Hfzdv1AeJwPhS3Q#rdh{_&K^{e#3S66-<*xulvELV-pl^2#xx`FT)P> zx26VdAqX!G4fu~e&U--U7${5L6|@^zMp}AzVyuguEZT-)gCN9?v3V8y&XWk^3x%F} z0qW>JA%sSg^ll2-UYe?%EuxJTB!DeX#HIcG@1cQwkVGGYo;~}FDP{PYoi%%%3Lplp z4_pL6BjUpkK=0qzuh`2}08`mo?`@jVcUBrU9mLwn9S{Js3v3H;PTb(v_|^wMgIWGp zTWj&ozfsVfJk>5gbXDujWp6AATS6>cS-jU^WDMU z|NYjx*2`tFX3Y$9?m4s1e)ieV4v}9X8`Cxjvvtvb@(0+;FTp5JmnZuA=F4q@gq^o% zfjfVMiyw`Y+-~94i+XYK9z2s@U0o{Jb=ISeS~Wg;U{aCCHk^2ub`Hp*Ee-3d(LW8$ zye|XSB3GX;9&u{+ajvl5CC(|_@0bBhT&}%taoDD_Pnah00Ok zqLDGHf*L$nfMv7Byz^6MCWugpU{`C1#TLzS=BH>3S`Kii^HAL?IUzQwMH9ANGaTUA%x8aw7 zPLn>NjxM=od7l-Ey;A16C$UY;p#P}7x%H<4;iz5o24cqX>=_9jQyxx{a*;Al z=m>9GREkdG64lvuf~A=nzhYexM{`Oe%a?*zt^VsjWpWzh8hI|-sA+cmy4dwi;jv_= zo`5$S$7Z*97MY@|?p34WoLbQ+cAeBj3-%u5D$HlgsGoQZf3qGh%Q2z$K)9v3t&07X zIGZq#V|%z7MSB;cwdGVoSC$eTkVWws2mgEd zB^MFm@v2Be@;j@qsH6c^gC+tTtIV3ujJ%xQfEUg{0!iB)#7*_GrCPSWlaOQzWXS<| zpI?bG3-yF8>po727o|$;=xZ~XyMHA-W8N}dN1b8en4=)043n~d+*`!9@-SP4N4mF? zn-K7r21G@dO2V8}K$w$$7bv7~A+YkK$r^nUI40-_uyl3bduZmmx2%H742B7i>L@7VfsE_naHop+o*sKW0vWkDaJyc3 zFQ7j7c=)_jw=~oMJ3`6Lz{0IcTiRwoU8ZII7|4d5G5t{N)w0aWUhFYwa6Y9@&yil&JFi*uCHxyEUN8Bx+dCYQ&4Tf@ImT4fseFV6z3$AR?`o6R8(Eg9h z8+g3WAb!5Pb~#8nM9sf}MC?u@Pf}<1hye)wN%B8pujrh24;BBT0Ev5Y=N=jrFw}Wl zzwztie6WLIYeHwv(#|6}WyN5SdHr67Q> zl!IeP_&VTn4C+^M)jx53d9y)@i8by1W@jd?H>Tj#K4^W;it3X^gH&l~UIJ4QSWYgC zJV%)&FG34vGCVc8BPSoyx>7x&1XCv2tjS^yG zAzRA#vaT*H(I&xif@~kP{&?oXISKtUa}) z6I2c{EGK5y0-EA#V(W@L0}m;I7v7D>ySf^jf7Cj1j?;`#=xG1&rpHevCPqekgh4BXq3s0r>Go$qnT`rBE2E|5 z^MMH_Tr=P+#KV%4i_$89o*d+QeoF2;i6m;hS6F!7B;V8h0=KQrE~6VYJz^aqZKBcV z1lqf@McS$m7103OTh7qdWk$u~EWr{52Az zLiKVNHjxpJn9A8vHZbhOiX=q({>^h7JUD!Fdz4OmXPgs^N^xmfN}$D+l>yd8Lw&mH zQWTU;tb}3nI!G@s$k!h2ORJ5X4pop=5BKoWLhf78_``*F)QWB?ZYfm(v@nU#WIM>L zEO`cRYt9#$O#e2q(pg^PH`CX%XXy~kgY97igJUT$BoKRM9YC0@!=@wmY*N(`df5$V zhHgF_>ZHCge~4}#3@pdSXBqVKWZWS1M=gB(dPk!G`f$L>mwoRM@)jVgx)J0?{Lt#ohl4bs$UdWl$nJ*Qb43LMAuN@v^>1)Gyz98 zl(A0AIQNMdB+&IYowQ zegz#XN-g?B3V)Bl>9c1)9GEae1^R62;a~TI>5!T?#6puXU@F|A`uFiSyn=ZVq*#-1 zOw)>x&9h}c7aB2toyZ$0imL$iCGZ-U;6`$Y@AG#lq4X{+Hbhj^&9_DR^IGREkWNge90OOwu1QQR{S-s!4My;b|mk z9wWj00XI~DlgF(@S=%KReSCQHA3kW@ySTroIdXaY&;aB<%Ii)@y-*O@N0 zV`HPn4DS1AtL5V7{Q*c`tjumba~|!j4xTP@H%0Rb_(_BkG?<46{YCuwG@-89OH3@3 zZkMcG()L2%`cr$wNkqJS033Z`tk<_Z`k(o}3IB5%{BuH}CZO<^e`+(*L^f6ae zs0;@}e?MD-qncbXa$fXue)j(yW5BuBHCw9->D+W9L&=h@S->=vKL2o!+4_yQS3P&N z7;-S8+lCX@1YfxdxiHxU{#F)_=e69QpIDffzgl)y8vJz}-P;*pdv%_5IKj6rRJaeO zvEop~{t2f||LnK<4tcBBz&R6`&bAhIPoBg5T4*IqDax1M0SB0e_LJi4vlir;!Fl|x zP4BT^+zrG}ED37AuzAgZtUg{Kx^_JsxWu&r2&4L0$jv5kn|~=u5V9LFCja=p{eHmm!U1GZXX9eGu1)HouL2SH0(4z|Hvb1=*rLv72664 z#BiO7VW5|t^W}f@@5T{hbMCiG+AAXb=a4AB0cwlJ*rg#1D8+5-t=?=(`t9SX=-QFn z!3yXNH}v+R)yz_ZqteVJ+i51c)-~B=OL!>1I$0Yvp0L%%!bP}t?rfSN(!o=N{JKXs z961vHV+%TadXZQEk!iVCeuNu_@kHHPR+juhEGT$H2~bs^x_F`2fi(T#z zU|n{Dl>#RUpQC{!4&bWNh>}gmYExOzTMDZU={<2|k90HQ^8$Lia9t*J&v@(iL04uB z+r>P0@1L2)kHc-gX08Ho*6U|Ef9TrwxP0xZW_~6trSQ<>wLYNZS$gqn_4fN(=cDc% zY4__JvTNthLe^aVKaa_T765tlb2uC;->1;%H;Yh&1BrA-H^NxJbZs=PhwrAlRpAXf z-sAIUwK+?7vl+P>qdRuD85#NLr#YPABkB!2@3lAQUWJSo*TAm8xQGenowIJcO_w%o z^Fktb=K?(R)-vxM?7MGpa?8jO5Cmg(hhQ7cv7rh4dJq3?y^W}$L^Uniyucw1#zLN(fZ#ZIGAZB`gST*gSpLzx(^m6JK=Y@gC z;_0ap(vp*qKFH7t_wXX=n*KyHk%`Ws-W%-++QO2$!r!jH{~l;XbaeLY-_$(0*t$*H zOjw^@czN^2>Rcdf5y5(Q8v$*sIZqs=0QKj=f@Pr^t~O`RK1ewZG!HUHRj@|WVs9gp)je&=gRuirK1 z@M2DCvKD{Roit_BD8)5K^)E8f?l5{m>G-hD0H#z1$j;@~_uC({-n{sgxux8$$D7yj zt#3Q_UUQ2Xm(!m0=6A~+hSZ0LM{EA5m~V#u>J|=j;+8gzOMiN~VpF&C?FkA^42ed~ z9U?e2Z!dZWv<9>Yhr%d16ZA{6$RZds!a2pcs7e}IlrNf0n!I9Z1f$YZ#aREC8I&6F z9)C{uk!>8U%h!B;sLyvg`pIzK{MgLG>=*@JZ?11%Fa3BwyrKIv{%nZ4!N*2-VSe6< z-9UtWW5@)w*c|yF%WvStao;0+z>Vsrz0NIsyMW<6M?Od47Zd4Q^+_{KeKoYbs|OXT z4yR^jen~k5S>(9w<<~?jE4s*0dN3tZGcH2;j#pb#$aee2;w?o)EUMScSANGbNA0?= z`@_ampJOwDqcvk1HrX=oJKj5FBsHPvFfwzHLBm_fY~yLXh1hU^Bj>o5zYXm{5d~JJ2M3-F&J;UvRi?T&F}?0%w>fu=>B^jmO@t*TDz6)j1Fl1rwIvJ z1m$Q@SVTMaJ6;nv2Oy;QLGYAB#Lzq7uDGPjYRjCo!+xVj$kYfaL}S^O)rOJnN|=-` zFZ}8+R|hr+DX3$?|)eZqxx$t zl2AHnxAtHDkZ|KSQ(hj+>MscX%Wd({r`GUp??Gcrab(;y4Z3y_ zS%d8@<3Ic5>m%139cEDjR;n<2!k#zv+?;Q^JYVq)4{tkJ=S_PxeETg{^@z~5%Hcwb zt)G07?AX~M#YyC55;ij+Mf5ict`-f(SdyR{YI%;xS8N~tS7QyPAwKESxLH@#o)tyk zP(Mf-t(X#}nyA7`y6dm?>}}V{^tjFKZJM|a_DW5SM>e;*!yJvezT@9mdYMAy)ufBv zXo&P#~TBv&^q;h6X%)-;cV&zNl zq^Zn%`?$X&eai7g8K48-xm^Pql|LS`4(;7{xyXQ&=ZE67@5Dwo)Rxc>4cn(wl$qWf zPii{7K=wHijtFt?B&WWZ`$clSn7d&^6~MO>SiSc#l9=Pbr-g2>tal6sdMp8R=naG5 zo)4<{bx`qc>D6Qkbku3GvM`hRv>Qdc^(ZTyCtHRu<-p5sde{O5>d36`;-Q&g!(HZR zUp!xhjS0#=s`s92=3a9a6?F(}Gw{m`9Et5dKT&lSLfUJX)NW)d=2Rf7Z<;14<1){Z zH!+8c&VF|~<0))^^8ZkMpX+}1s-Rf1=Zq~hK+fK#lm)Ob00xYf>^S|qpS-(nH80~3 zGL{r_b4&QF?Wepx=ln0+(b$`#d&Pfu&}|UuT!Rvo=PONnXU@=yBe%Tof7IRA-xPb^ zYP?$LU!L<#)oJZ*C@Nw__#7^GkB+FObHxVEH+njp9EalGhhgQ)7tQ1y8+1$-&LZ~L z67yd?B;um$75YcMc_jW>uh_1wIN5SCdOFg+cf9UtG=xKkeG~{ID3Y zqJP>H*l@m=6J1}4b>~JR_2l<%6b|@ykI6Vw@+oJ5lq=%E$6>yMn^w|iFZY@F6ddj% za&XnFaZ2Oke%v4Sw^Xa1uEFb^G9@L)TxmDeB~`3i+mYL~)Rx=TPmDI+)CH(qz+*N4 zxx-Z#FT`1cy7ntA$l6h)&dlHCCg7OI?gAz{g3(?|7z}89mzxw=?;x7l^+2XW0p+)% ze|N+(0?E3){6@s89cK3;Ezm_ZuzQQPUt)br`U_%ny196u;QlH1_1S8%U7=b%9o}~d z6BYN})#U*^wGV>jzI!F9p2<%y(Y|<%XHYwwi$We~V1Q_SEcS$jutENNIq6v+W?zal zTJ;~r@<)RfJCPj5m82l8v&EVN>!#oSYe1w*%SqR2b99ReowNl9?jOj)S;R~4S7iX` z4U`mXe}4;ykv=@j7CAe-8VU42Poe{9wQjbjW1uVvLckOlKb6(v;sP)iWvjsVIRgA{ z5saUu?o_6B)V1ePGk!rBP|?7tF+5+Gifb~ebVzp_vVXOqF37gv=qTlpC(D{=l`jYv z_7WXpF|4;>e-d~2fFk|xOk>mU=XLzQiG1AV)?;^s+60^$s`bAh{#@<|IlnrOzIXUz ze6%;rxc<8P-9&WO70FjWhdn$IE8+61;Sb7hZ>7?l|N63Nc$udAA8`)Wi5WL7F14@> z+QeZ5g+MQQlQ!yG?|ren{AvDF0s=v2G-`Rkt$Fld9YFJFdT#EDV(Xc^a7kvB#5O5D ze4hkR6TYeM#NP)qc?`9r1=^5zY(6ncIB~u z=8Ux@govpG3plhYb1A<{BAzeRTs`Y{HZTI71|9W~6BE-G;ifyy@j0s<9xNE{mCm(b z9a>>HFnn;ev~S@5{;*u9FihuZrX_yS)3qq8m)1|2T~Ftec5J+k9;>A7-VU|U%G^<{ z3h>vrY*Ya|Sr{|Y-g!O3Ji0awWonZQx3kyJzU`mYNcA-jdoF6;CW}KQtDTWKSO|rQ z3i~&guMNjvjlFvHqLSNXGq|dDc==$UvEQQcR06+{Gh3^2^Ev)UFopR3P;K-ne(I1*k!VZWrl+f8up?cCVbWceeeQnvUl2A}MexyLyz_#Z>?zZ(}7&|rdzF5+6@rPSRz=J)LR?n@c$RYF{e zo1S5DoA{_w1|G(U-VDJ}J<)>_)ig=rU2*3d%eB1Q=j=I(1Qc;eAd*{-(PI_5m|D7< zjI_PzKn=lugE72|8$@z-NNS`7jVVI`P1v` zoxNMw`)a~>6`7gOUwA_R=HO)YXvJ$r3^kcz1^p0i5CAk?adf1SxWL|8#?MUE znFv3(w9E^C$D6mk*qiIjT_PRG^HLs!GbvAIZ=u8|0UP1)zPY_)YDq_JMxW}3D=nBB zKiS^#n={ui1AaRDm#vq#bKUbcJV)^&S>oFTtA^AXa;))sq=?^6nz z61?o-!s31TG(*pYDFC{8+5bQYFs7U zKX57zdHF@crD6T8MPG_T)mYWNSI6DBkDNIhbG{w;#!rqHm=(8p+RpgRpv63d8vk9+ zH@l*^v!#f_SP+>`RvLZml2_j{~%5~Tuvk1CL|`N2Kc@9hb|iy*m-$6OD04`#*Yra z#F}XQuq->*pcFyu|7v=4?%s1(-5+}g1&RZbBD}`b&mYzE{43~9s@+>;#8R+qIW0iT z<4k+my}8{$Z&5#k0nXP`GfT7FGK%qvE7X~2pDvusU(7u6zf&&}5n^9fFp9>$rKSlz z=jWnYIIJ$jz953=Da6x$J7weo3xik&KK@X}t>FW4;)TgXQw14tCK__HZ&YmBx>(Vq z88?B9p3UU!zR|qaa`^xljemS)xT8f+^s z&yK^v4xgp9FFo2=Ej4$zlL5qM9D$4##V^qsMcU|8kq^7?4OXk$e;XL?A3n13c|{K@ zaO(N1VSc{r<+DsonZ=$KOCnb4tZ z;m?FosHNFFVxOvMKJ4Xw!L?}ymU{B_q9&OjJUj5W$NE!xI}!CA9ZU<&?33nOAJG=K z@-0tw4Qq`8Vg4#-EE$0=7o7rI7Ot|I5Hgl9>@QBrZ?WyLIC;7#%M=NwNa_ukVFVFi zQseKb;LiM%5NrY~u+vMLfia#G8EO~@M%eKu3wd_e$T5}g6pyV3{wC15G1oEKj>VD% z+}vmUh80Fx_Jt9~r@61%=fqH~?KtZNd2?S2Xvq^jkn6&?qVvKw7dvtYos& z5%yql(>2>3&$_@*e0FRs-9Ak)!0y&YKz+u(Qtw&YwJbfzE1H(y|U!mx! z^i?&dvNB3le^I-DcK)@GM`}I=61rKeBQ?guCx)EwK<&z+(wei}$jnXZmV?F7{LI2B z5h1H7njt38+po^*^{*Ncx}3uzT01fM>h1RD`9cQ%5@Td^y}qRB&smHe+fo`MFmkR2 zRGOrJbP?)pr|y=v1#Q + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('xml_editor_view')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +require_once "app/xml_edit/config.php"; +echo "\n"; +echo "\n"; +echo " \n"; +echo " "; + + echo "\n"; + + echo ""; + ?> + + + + + + + + + + +
+ + + +\n"; + echo "\n"; + } + else { + echo "\n"; + } +?> + +
+ + \ No newline at end of file diff --git a/app/provision_editor/list.php b/app/provision_editor/list.php new file mode 100644 index 0000000000..87a80f3128 --- /dev/null +++ b/app/provision_editor/list.php @@ -0,0 +1,113 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/checkauth.php"; +if (permission_exists('xml_editor_view')) { + //access granted +} +else { + echo "access denied"; + exit; +} +require_once "header.php"; + +//show the content + echo "

"; + echo "\n"; + + echo "\n"; + echo " \n"; + echo "\n"; + + } //end if results + + echo "
\n"; + echo "
"; + + $sql = ""; + $sql .= "select * from v_clip_library "; + + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + $result_count = count($result); + + $c = 0; + $row_style["0"] = "background-color: #F5F5DC;"; + $row_style["1"] = "background-color: #FFFFFF;"; + + echo "
\n"; + echo "\n"; + echo ""; + + if ($result_count == 0) { //no results + echo ""; + } + else { //received results + + echo ""; + //echo ""; + echo ""; + //echo ""; + //echo ""; + //echo ""; + //echo ""; + //echo ""; + echo ""; + echo "\n"; + + foreach($result as $row) { + //print_r( $row ); + echo "\n"; + //echo ""; + echo ""; + //echo ""; + //echo ""; + //echo ""; + //echo ""; + //echo ""; + echo ""; + + echo "\n"; + if ($c==0) { $c=1; } else { $c=0; } + } //end foreach + unset($sql, $result, $row_count); + + echo "
 
    Id      clip_name      clip_folder        clip_text_start        clip_text_end        clip_desc        clip_order   
".$row[id]."".$row[clip_name]."".$row[clip_folder]."".$row[clip_text_start]."".$row[clip_text_end]."".$row[clip_desc]."".$row[clip_order]."
\n"; + echo "
\n"; + + echo "
\n"; + + echo "
\n"; + echo "   \n"; + echo "   \n"; + echo "
\n"; + echo ""; + + echo "

"; + require_once "footer.php"; + +?> diff --git a/app/provision_editor/readme.txt b/app/provision_editor/readme.txt new file mode 100644 index 0000000000..cafc4144ae --- /dev/null +++ b/app/provision_editor/readme.txt @@ -0,0 +1,7 @@ +Notes + +IFrame +http://www.quirksmode.org/js/iframe.html + +Tree View +http://www.dddekerf.dds.nl/DHTML_Treeview/DHTML_Treeview.htm \ No newline at end of file diff --git a/app/provision_editor/root.php b/app/provision_editor/root.php new file mode 100644 index 0000000000..7b882438ea --- /dev/null +++ b/app/provision_editor/root.php @@ -0,0 +1,50 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ + +// make sure the PATH_SEPARATOR is defined + if (!defined("PATH_SEPARATOR")) { + if ( strpos( $_ENV[ "OS" ], "Win" ) !== false ) { define("PATH_SEPARATOR", ";"); } else { define("PATH_SEPARATOR", ":"); } + } + +// make sure the document_root is set + $_SERVER["SCRIPT_FILENAME"] = str_replace("\\", "/", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = str_replace($_SERVER["PHP_SELF"], "", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = realpath($_SERVER["DOCUMENT_ROOT"]); + //echo "DOCUMENT_ROOT: ".$_SERVER["DOCUMENT_ROOT"]."
\n"; + //echo "PHP_SELF: ".$_SERVER["PHP_SELF"]."
\n"; + //echo "SCRIPT_FILENAME: ".$_SERVER["SCRIPT_FILENAME"]."
\n"; + +// if the project directory exists then add it to the include path otherwise add the document root to the include path + if (is_dir($_SERVER["DOCUMENT_ROOT"].'/fusionpbx')){ + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', '/fusionpbx'); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER["DOCUMENT_ROOT"].'/fusionpbx' ); + } + else { + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', ''); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER['DOCUMENT_ROOT'] ); + } + +?> \ No newline at end of file diff --git a/app/recordings/app_config.php b/app/recordings/app_config.php new file mode 100644 index 0000000000..fdd5653a2c --- /dev/null +++ b/app/recordings/app_config.php @@ -0,0 +1,100 @@ + \ No newline at end of file diff --git a/app/recordings/app_defaults.php b/app/recordings/app_defaults.php new file mode 100644 index 0000000000..36abb0f07b --- /dev/null +++ b/app/recordings/app_defaults.php @@ -0,0 +1,30 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ + +//if the recordings directory doesn't exist then create it + if (!is_readable($_SESSION['switch']['recordings']['dir'])) { mkdir($_SESSION['switch']['recordings']['dir'],0777,true); } + +?> \ No newline at end of file diff --git a/app/recordings/root.php b/app/recordings/root.php new file mode 100644 index 0000000000..7b882438ea --- /dev/null +++ b/app/recordings/root.php @@ -0,0 +1,50 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ + +// make sure the PATH_SEPARATOR is defined + if (!defined("PATH_SEPARATOR")) { + if ( strpos( $_ENV[ "OS" ], "Win" ) !== false ) { define("PATH_SEPARATOR", ";"); } else { define("PATH_SEPARATOR", ":"); } + } + +// make sure the document_root is set + $_SERVER["SCRIPT_FILENAME"] = str_replace("\\", "/", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = str_replace($_SERVER["PHP_SELF"], "", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = realpath($_SERVER["DOCUMENT_ROOT"]); + //echo "DOCUMENT_ROOT: ".$_SERVER["DOCUMENT_ROOT"]."
\n"; + //echo "PHP_SELF: ".$_SERVER["PHP_SELF"]."
\n"; + //echo "SCRIPT_FILENAME: ".$_SERVER["SCRIPT_FILENAME"]."
\n"; + +// if the project directory exists then add it to the include path otherwise add the document root to the include path + if (is_dir($_SERVER["DOCUMENT_ROOT"].'/fusionpbx')){ + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', '/fusionpbx'); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER["DOCUMENT_ROOT"].'/fusionpbx' ); + } + else { + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', ''); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER['DOCUMENT_ROOT'] ); + } + +?> \ No newline at end of file diff --git a/app/recordings/slim.swf b/app/recordings/slim.swf new file mode 100644 index 0000000000000000000000000000000000000000..24b36c9daf922a26fc1515e5dcbebc748221b787 GIT binary patch literal 56327 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 bv1&Uai_97hg==H1k`i$-0X6>v59T9DW8k4| literal 0 HcmV?d00001 diff --git a/app/recordings/v_recordings.php b/app/recordings/v_recordings.php new file mode 100644 index 0000000000..54c8d653b9 --- /dev/null +++ b/app/recordings/v_recordings.php @@ -0,0 +1,294 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('recordings_view')) { + //access granted +} +else { + echo "access denied"; + exit; +} +require_once "includes/paging.php"; + +//set the max php execution time + ini_set(max_execution_time,7200); + +//get the http get values and set them as php variables + $order_by = $_GET["order_by"]; + $order = $_GET["order"]; + +//download the recordings + if ($_GET['a'] == "download" && permission_exists('recordings_download')) { + session_cache_limiter('public'); + if ($_GET['type'] = "rec") { + if (file_exists($_SESSION['switch']['recordings']['dir'].'/'.base64_decode($_GET['filename']))) { + $fd = fopen($_SESSION['switch']['recordings']['dir'].'/'.base64_decode($_GET['filename']), "rb"); + if ($_GET['t'] == "bin") { + header("Content-Type: application/force-download"); + header("Content-Type: application/octet-stream"); + header("Content-Type: application/download"); + header("Content-Description: File Transfer"); + header('Content-Disposition: attachment; filename="'.base64_decode($_GET['filename']).'"'); + } + else { + $file_ext = substr(base64_decode($_GET['filename']), -3); + if ($file_ext == "wav") { + header("Content-Type: audio/x-wav"); + } + if ($file_ext == "mp3") { + header("Content-Type: audio/mp3"); + } + } + header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1 + header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date in the past + header("Content-Length: " . filesize($_SESSION['switch']['recordings']['dir'].'/'.base64_decode($_GET['filename']))); + fpassthru($fd); + } + } + exit; + } + +//upload the recording + if (($_POST['submit'] == "Upload") && is_uploaded_file($_FILES['ulfile']['tmp_name']) && permission_exists('recordings_upload')) { + if ($_POST['type'] == 'rec') { + move_uploaded_file($_FILES['ulfile']['tmp_name'], $_SESSION['switch']['recordings']['dir'].'/'.$_FILES['ulfile']['name']); + $savemsg = "Uploaded file to ".$_SESSION['switch']['recordings']['dir']."/". htmlentities($_FILES['ulfile']['name']); + //system('chmod -R 744 '.$_SESSION['switch']['recordings']['dir'].'*'); + unset($_POST['txtCommand']); + } + } + +//build a list of recordings + $config_recording_list = '|'; + $i = 0; + $sql = ""; + $sql .= "select * from v_recordings "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach ($result as &$row) { + $config_recording_list .= $row['recording_filename']."|"; + } + unset ($prep_statement); + +//add recordings to the database + if (is_dir($_SESSION['switch']['recordings']['dir'].'/')) { + if ($dh = opendir($_SESSION['switch']['recordings']['dir'].'/')) { + while (($file = readdir($dh)) !== false) { + if (filetype($_SESSION['switch']['recordings']['dir']."/".$file) == "file") { + if (strpos($config_recording_list, "|".$file) === false) { + //echo "The $file was not found
"; + //file not found add it to the database + $a_file = explode("\.", $file); + $recording_uuid = uuid(); + $sql = "insert into v_recordings "; + $sql .= "("; + $sql .= "domain_uuid, "; + $sql .= "recording_uuid, "; + $sql .= "recording_filename, "; + $sql .= "recording_name, "; + $sql .= "recording_description "; + $sql .= ")"; + $sql .= "values "; + $sql .= "("; + $sql .= "'$domain_uuid', "; + $sql .= "'$recording_uuid', "; + $sql .= "'$file', "; + $sql .= "'".$a_file[0]."', "; + $sql .= "'auto' "; + $sql .= ")"; + $db->exec(check_sql($sql)); + unset($sql); + } + } + } + closedir($dh); + } + } + +//include the header + require_once "includes/header.php"; + +//begin the content + echo ""; + + echo "
"; + echo "
\n"; + echo "\n"; + echo " \n"; + echo "\n"; + echo "
\n"; + echo "
"; + + echo "\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "

Recordings:
\n"; + echo "
\n"; + echo " To make a recording dial *732 or you can make a\n"; + echo " 16bit 8khz/16khz Mono WAV file then copy it to the\n"; + echo " following directory then refresh the page to play it back.\n"; + echo " Click on the 'Filename' to download it or the 'Recording Name' to\n"; + echo " play the audio.\n"; + echo "

"; + + echo "
\n"; + + echo "
\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "
\n"; + if ($v_path_show) { + echo "location: \n"; + echo $_SESSION['switch']['recordings']['dir']; + } + echo " \n"; + echo " \n"; + echo " \n"; + echo " File to upload:\n"; + echo " \n"; + echo " \n"; + echo "
\n"; + echo "
"; + + $sql = ""; + $sql .= "select * from v_recordings "; + $sql .= "where domain_uuid = '$domain_uuid' "; + if (strlen($order_by)> 0) { $sql .= "order by $order_by $order "; } + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + $num_rows = count($result); + unset ($prep_statement, $result, $sql); + + $rows_per_page = 100; + $param = ""; + $page = $_GET['page']; + if (strlen($page) == 0) { $page = 0; $_GET['page'] = 0; } + list($paging_controls, $rows_per_page, $var_3) = paging($num_rows, $param, $rows_per_page); + $offset = $rows_per_page * $page; + + $sql = ""; + $sql .= "select * from v_recordings "; + $sql .= "where domain_uuid = '$domain_uuid' "; + if (strlen($order_by)> 0) { $sql .= "order by $order_by $order "; } + $sql .= " limit $rows_per_page offset $offset "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + $result_count = count($result); + unset ($prep_statement, $sql); + + $c = 0; + $row_style["0"] = "row_style0"; + $row_style["1"] = "row_style1"; + + echo "\n"; + echo "\n"; + echo th_order_by('recording_filename', 'Filename (download)', $order_by, $order); + echo th_order_by('recording_name', 'Recording Name (play)', $order_by, $order); + echo "\n"; + echo th_order_by('recording_description', 'Description', $order_by, $order); + echo "\n"; + echo "\n"; + + if ($result_count > 0) { + foreach($result as $row) { + $tmp_filesize = filesize($_SESSION['switch']['recordings']['dir'].'/'.$row['recording_filename']); + $tmp_filesize = byte_convert($tmp_filesize); + + echo "\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "\n"; + + if ($c==0) { $c=1; } else { $c=0; } + } //end foreach + unset($sql, $result, $row_count); + } //end if results + echo "
Size\n"; + if (permission_exists('recordings_add')) { + echo " $v_link_label_add\n"; + } + echo "
"; + echo " \n"; + echo $row['recording_filename']; + echo " "; + echo " "; + echo " \n"; + echo $row['recording_name']; + echo " "; + echo "\n"; + echo " ".$tmp_filesize; + echo " ".$row['recording_description']."\n"; + if (permission_exists('recordings_edit')) { + echo " $v_link_label_edit\n"; + } + if (permission_exists('recordings_delete')) { + echo " $v_link_label_delete\n"; + } + echo "
\n"; + + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "
 $paging_controls\n"; + if (permission_exists('recordings_add')) { + echo " $v_link_label_add\n"; + } + echo "
\n"; + + echo "
"; + echo "
"; + + echo "
\n"; + echo "
\n"; + echo "
\n"; + echo "
\n"; + +//include the footer + require_once "includes/footer.php"; + +?> \ No newline at end of file diff --git a/app/recordings/v_recordings_delete.php b/app/recordings/v_recordings_delete.php new file mode 100644 index 0000000000..d0ec21f93b --- /dev/null +++ b/app/recordings/v_recordings_delete.php @@ -0,0 +1,75 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('recordings_delete')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +if (count($_GET)>0) { + $id = $_GET["id"]; +} + +if (strlen($id)>0) { + //get filename + $sql = "select * from v_recordings "; + $sql .= "where recording_uuid = '$id' "; + $sql .= "and domain_uuid = '$domain_uuid' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach ($result as &$row) { + $filename = $row["recording_filename"]; + break; //limit to 1 row + } + unset ($prep_statement); + + //delete recording from the database + $sql = "delete from v_recordings "; + $sql .= "where recording_uuid = '$id' "; + $sql .= "and domain_uuid = '$domain_uuid' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + unset($sql); + + //delete the recording + unlink($_SESSION['switch']['recordings']['dir']."/".$filename); +} + +//redirect the user + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Delete Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; +?> \ No newline at end of file diff --git a/app/recordings/v_recordings_edit.php b/app/recordings/v_recordings_edit.php new file mode 100644 index 0000000000..9ce07f37c6 --- /dev/null +++ b/app/recordings/v_recordings_edit.php @@ -0,0 +1,271 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('recordings_add') || permission_exists('recordings_edit')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +//set the action as an add or an update + if (isset($_REQUEST["id"])) { + $action = "update"; + $recording_uuid = check_str($_REQUEST["id"]); + } + else { + $action = "add"; + } + +//get the form value and set to php variables + if (count($_POST)>0) { + $recording_filename = check_str($_POST["recording_filename"]); + $recording_name = check_str($_POST["recording_name"]); + //$recording_uuid = check_str($_POST["recording_uuid"]); + $recording_description = check_str($_POST["recording_description"]); + + //clean the recording filename and name + $recording_filename = str_replace(" ", "_", $recording_filename); + $recording_filename = str_replace("'", "", $recording_filename); + $recording_name = str_replace(" ", "_", $recording_name); + $recording_name = str_replace("'", "", $recording_name); + } + +if (count($_POST)>0 && strlen($_POST["persistformvar"]) == 0) { + + $msg = ''; + if ($action == "update") { + $recording_uuid = check_str($_POST["recording_uuid"]); + } + + //check for all required data + //if (strlen($domain_uuid) == 0) { $msg .= "Please provide: domain_uuid
\n"; } + if (strlen($recording_filename) == 0) { $msg .= "Please provide: Filename (download)
\n"; } + if (strlen($recording_name) == 0) { $msg .= "Please provide: Recording Name (play)
\n"; } + //if (strlen($recording_uuid) == 0) { $msg .= "Please provide: recording_uuid
\n"; } + //if (strlen($recording_description) == 0) { $msg .= "Please provide: Description
\n"; } + if (strlen($msg) > 0 && strlen($_POST["persistformvar"]) == 0) { + require_once "includes/header.php"; + require_once "includes/persistformvar.php"; + echo "
\n"; + echo "
\n"; + echo $msg."
"; + echo "
\n"; + persistformvar($_POST); + echo "
\n"; + require_once "includes/footer.php"; + return; + } + + //add or update the database + if ($_POST["persistformvar"] != "true") { + if ($action == "add" && permission_exists('recordings_add')) { + $recording_uuid = uuid(); + $sql = "insert into v_recordings "; + $sql .= "("; + $sql .= "domain_uuid, "; + $sql .= "recording_uuid, "; + $sql .= "recording_filename, "; + $sql .= "recording_name, "; + $sql .= "recording_description "; + $sql .= ")"; + $sql .= "values "; + $sql .= "("; + $sql .= "'$domain_uuid', "; + $sql .= "'$recording_uuid', "; + $sql .= "'$recording_filename', "; + $sql .= "'$recording_name', "; + $sql .= "'$recording_description' "; + $sql .= ")"; + $db->exec(check_sql($sql)); + unset($sql); + + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Add Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + } //if ($action == "add") + + if ($action == "update" && permission_exists('recordings_edit')) { + //get the original filename + $sql = ""; + $sql .= "select * from v_recordings "; + $sql .= "where recording_uuid = '$recording_uuid' "; + $sql .= "and domain_uuid = '$domain_uuid' "; + //echo "sql: ".$sql."
\n"; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach ($result as &$row) { + $recording_filename_orig = $row["recording_filename"]; + break; //limit to 1 row + } + unset ($prep_statement); + + //if file name is not the same then rename the file + if ($recording_filename != $recording_filename_orig) { + //echo "orig: ".$_SESSION['switch']['recordings']['dir'].'/'.$recording_filename_orig."
\n"; + //echo "new: ".$_SESSION['switch']['recordings']['dir'].'/'.$recording_filename."
\n"; + rename($_SESSION['switch']['recordings']['dir'].'/'.$recording_filename_orig, $_SESSION['switch']['recordings']['dir'].'/'.$recording_filename); + } + + //update the database with the new data + $sql = "update v_recordings set "; + $sql .= "domain_uuid = '$domain_uuid', "; + $sql .= "recording_filename = '$recording_filename', "; + $sql .= "recording_name = '$recording_name', "; + //$sql .= "recording_uuid = '$recording_uuid', "; + $sql .= "recording_description = '$recording_description' "; + $sql .= "where domain_uuid = '$domain_uuid'"; + $sql .= "and recording_uuid = '$recording_uuid'"; + $db->exec(check_sql($sql)); + unset($sql); + + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Update Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + } //if ($action == "update") + } //if ($_POST["persistformvar"] != "true") +} //(count($_POST)>0 && strlen($_POST["persistformvar"]) == 0) + +//pre-populate the form + if (count($_GET)>0 && $_POST["persistformvar"] != "true") { + $recording_uuid = $_GET["id"]; + $sql = ""; + $sql .= "select * from v_recordings "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and recording_uuid = '$recording_uuid' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach ($result as &$row) { + $domain_uuid = $row["domain_uuid"]; + $recording_filename = $row["recording_filename"]; + $recording_name = $row["recording_name"]; + //$recording_uuid = $row["recording_uuid"]; + $recording_description = $row["recording_description"]; + break; //limit to 1 row + } + unset ($prep_statement); + } + +//show the header + require_once "includes/header.php"; + +//show the content + echo "
"; + echo "\n"; + echo "\n"; + echo " "; + echo " "; + echo "
\n"; + echo "
"; + + echo "
\n"; + + echo "
\n"; + echo "\n"; + + echo "\n"; + if ($action == "add") { + echo "\n"; + } + if ($action == "update") { + echo "\n"; + } + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + //echo "\n"; + //echo "\n"; + //echo "\n"; + //echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo " \n"; + echo " \n"; + echo " "; + echo "
Add RecordingEdit Recording
\n"; + echo " Filename (download):\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Name of the file. example.wav\n"; + echo "
\n"; + echo " Recording Name (play):\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Recording Name. example: recordingx\n"; + echo "
\n"; + //echo " recording_uuid:\n"; + //echo "\n"; + //echo " \n"; + //echo "
\n"; + //echo "\n"; + //echo "
\n"; + echo " Description:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "You may enter a description here for your reference (not parsed).\n"; + echo "
\n"; + if ($action == "update") { + echo " \n"; + } + echo " \n"; + echo "
"; + echo ""; + + echo "
"; + echo "
"; + +//include the footer + require_once "includes/footer.php"; +?> \ No newline at end of file diff --git a/app/recordings/v_recordings_play.php b/app/recordings/v_recordings_play.php new file mode 100644 index 0000000000..ccbcccb8c3 --- /dev/null +++ b/app/recordings/v_recordings_play.php @@ -0,0 +1,78 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ + +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('recordings_play')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +$filename = base64_decode($_GET['filename']); +$type = $_GET['type']; //moh //rec + +?> + + + + + + + + + + + + +
+ file: +
+ "; + echo ""; + + echo "\n"; + + } + if ($file_ext == "mp3") { + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + } + ?> +
+ + + diff --git a/app/registrations/app_config.php b/app/registrations/app_config.php new file mode 100644 index 0000000000..0b088ef4ca --- /dev/null +++ b/app/registrations/app_config.php @@ -0,0 +1,29 @@ + \ No newline at end of file diff --git a/app/registrations/root.php b/app/registrations/root.php new file mode 100644 index 0000000000..7b882438ea --- /dev/null +++ b/app/registrations/root.php @@ -0,0 +1,50 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ + +// make sure the PATH_SEPARATOR is defined + if (!defined("PATH_SEPARATOR")) { + if ( strpos( $_ENV[ "OS" ], "Win" ) !== false ) { define("PATH_SEPARATOR", ";"); } else { define("PATH_SEPARATOR", ":"); } + } + +// make sure the document_root is set + $_SERVER["SCRIPT_FILENAME"] = str_replace("\\", "/", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = str_replace($_SERVER["PHP_SELF"], "", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = realpath($_SERVER["DOCUMENT_ROOT"]); + //echo "DOCUMENT_ROOT: ".$_SERVER["DOCUMENT_ROOT"]."
\n"; + //echo "PHP_SELF: ".$_SERVER["PHP_SELF"]."
\n"; + //echo "SCRIPT_FILENAME: ".$_SERVER["SCRIPT_FILENAME"]."
\n"; + +// if the project directory exists then add it to the include path otherwise add the document root to the include path + if (is_dir($_SERVER["DOCUMENT_ROOT"].'/fusionpbx')){ + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', '/fusionpbx'); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER["DOCUMENT_ROOT"].'/fusionpbx' ); + } + else { + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', ''); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER['DOCUMENT_ROOT'] ); + } + +?> \ No newline at end of file diff --git a/app/registrations/v_status_registrations.php b/app/registrations/v_status_registrations.php new file mode 100644 index 0000000000..bb8114bb57 --- /dev/null +++ b/app/registrations/v_status_registrations.php @@ -0,0 +1,189 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; + +//check permissions + if (permission_exists("registrations_domain") || permission_exists("registrations_all") || if_group("superadmin")) { + //access granted + } + else { + echo "access denied"; + exit; + } + +//request form values and set them as variables + $sip_profile_name = trim($_REQUEST["profile"]); + +//define variables + $c = 0; + $row_style["0"] = "row_style0"; + $row_style["1"] = "row_style1"; + +//create the event socket connection + $fp = event_socket_create($_SESSION['event_socket_ip_address'], $_SESSION['event_socket_port'], $_SESSION['event_socket_password']); + if (!$fp) { + $msg = "
Connection to Event Socket failed.
"; + } + +//show the error message or show the content + if (strlen($msg) > 0) { + echo "
\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "
Message
$msg
\n"; + echo "
\n"; + } + else { + //get sofia status profile information including registrations + $cmd = "api sofia xmlstatus profile ".$sip_profile_name." reg"; + $xml_response = trim(event_socket_request($fp, $cmd)); + if ($xml_response == "Invalid Profile!") { $xml_response = "Invalid Profile!"; } + $xml_response = str_replace("", "", $xml_response); + $xml_response = str_replace("", "", $xml_response); + try { + $xml = new SimpleXMLElement($xml_response); + } + catch(Exception $e) { + echo $e->getMessage(); + exit; + } + + //build the registration array + if (count($xml->registrations->registration) > 0) { + $registrations = ''; + $x = 0; + foreach ($xml->registrations->registration as $row) { + //get the values from xml and set them to the channel array + $registrations[$x]['user'] = $row->{'user'}; + $user_array = explode('@', $row->{'user'}); + $registrations[$x]['call-id'] = $row->{'call-id'}; + $registrations[$x]['contact'] = $row->{'contact'}; + $registrations[$x]['sip-auth-user'] = $row->{'sip-auth-user'}; + $registrations[$x]['agent'] = $row->{'agent'}; + $registrations[$x]['host'] = $row->{'host'}; + $registrations[$x]['network-ip'] = $row->{'network-ip'}; + $registrations[$x]['network-port'] = $row->{'network-port'}; + $registrations[$x]['sip-auth-realm'] = $row->{'sip-auth-realm'}; + $registrations[$x]['mwi-account'] = $row->{'mwi-account'}; + $registrations[$x]['status'] = $row->{'status'}; + + //remove unrelated domains + if (count($_SESSION["domains"]) > 1 && !permission_exists('registrations_all')) { + if ($registrations[$x]['sip-auth-realm'] != $_SESSION['domain_name']) { + unset($registrations[$x]); + } + } + else { + if ($registrations[$x]['sip-auth-realm'] != $_SESSION['domain_name']) { + unset($registrations[$x]); + } + } + //increment the array id + $x++; + } + } + + //show the header + require_once "includes/header.php"; + + //show the registrations + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "
\n"; + echo " Registrations: ".count($registrations)."\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + + echo "\n"; + echo "\n"; + if (count($_SESSION["domains"]) > 1) { + echo " \n"; + } + //echo " \n"; + //echo " \n"; + echo " \n"; + //echo " \n"; + //echo " \n"; + echo " \n"; + //echo " \n"; + echo " \n"; + echo " \n"; + //echo " \n"; + echo " \n"; + echo "\n"; + + //order the array + require_once "includes/classes/array_order.php"; + $order = new array_order(); + $registrations = $order->sort($registrations, 'domain', 'user'); + + //display the array + if (count($registrations) > 0) { + foreach ($registrations as $row) { + echo "\n"; + if (count($_SESSION["domains"]) > 1) { + echo "\n"; + } + //\n"; + //echo " \n"; + //echo " \n"; + echo " \n"; + echo " \n"; + //echo " \n"; + echo " \n"; + echo " \n"; + //echo " \n"; + echo " \n"; + echo "\n"; + if ($c==0) { $c=1; } else { $c=0; } + } + } + echo "
DomainUserCaller IDUserContactsip-auth-userAgentHostIPPortmwi-accountStatus
 ".$row['sip-auth-realm']."  ".$row['call-id']."  ".$row['user']."  ".$row['contact']."  ".$row['sip-auth-user']."  ".$row['agent']."  ".$row['host']."  ".$row['network-ip']."  ".$row['network-port']."  ".$row['mwi-account']."  ".$row['status']." 
\n"; + + fclose($fp); + unset($xml); + } + +//add some space at the bottom of the page + echo "
\n"; + echo "
\n"; + echo "
\n"; + +//get the footer + require_once "includes/footer.php"; + +?> \ No newline at end of file diff --git a/app/ring_groups/app_config.php b/app/ring_groups/app_config.php new file mode 100644 index 0000000000..ee0c1de965 --- /dev/null +++ b/app/ring_groups/app_config.php @@ -0,0 +1,127 @@ + \ No newline at end of file diff --git a/app/ring_groups/ring_groups.php b/app/ring_groups/ring_groups.php new file mode 100644 index 0000000000..e3e5ffaa5c --- /dev/null +++ b/app/ring_groups/ring_groups.php @@ -0,0 +1,167 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require_once "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (if_group("admin") || if_group("superadmin")) { + //access granted +} +else { + echo "access denied"; + exit; +} +require_once "includes/header.php"; +require_once "includes/paging.php"; + +//get variables used to control the order + $order_by = $_GET["order_by"]; + $order = $_GET["order"]; + +//show the content + echo "
"; + echo "\n"; + echo "\n"; + echo " "; + echo ""; + echo "
\n"; + echo "
"; + + echo "\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "
Ring Groups 
\n"; + echo " A ring group is a set of extensions that can be called with a ring strategy.

\n"; + echo "
\n"; + + //prepare to page the results + $sql = "select count(*) as num_rows from v_ring_groups "; + $sql .= "where domain_uuid = '$domain_uuid' "; + if (strlen($order_by)> 0) { $sql .= "order by $order_by $order "; } + $prep_statement = $db->prepare($sql); + if ($prep_statement) { + $prep_statement->execute(); + $row = $prep_statement->fetch(PDO::FETCH_ASSOC); + if ($row['num_rows'] > 0) { + $num_rows = $row['num_rows']; + } + else { + $num_rows = '0'; + } + } + + //prepare to page the results + $rows_per_page = 10; + $param = ""; + $page = $_GET['page']; + if (strlen($page) == 0) { $page = 0; $_GET['page'] = 0; } + list($paging_controls, $rows_per_page, $var3) = paging($num_rows, $param, $rows_per_page); + $offset = $rows_per_page * $page; + + //get the list + $sql = " select * from v_ring_groups "; + $sql .= " where domain_uuid = '$domain_uuid' "; + if (strlen($order_by)> 0) { $sql .= "order by $order_by $order "; } + $sql .= " limit $rows_per_page offset $offset "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(); + $result_count = count($result); + unset ($prep_statement, $sql); + + $c = 0; + $row_style["0"] = "row_style0"; + $row_style["1"] = "row_style1"; + + echo "
\n"; + echo "\n"; + echo "\n"; + echo th_order_by('ring_group_name', 'Name', $order_by, $order); + echo th_order_by('ring_group_extension', 'Extension', $order_by, $order); + //echo th_order_by('ring_group_context', 'Context', $order_by, $order); + //echo th_order_by('ring_group_strategy', 'Strategy', $order_by, $order); + //echo th_order_by('ring_group_timeout_sec', 'Timeout', $order_by, $order); + //echo th_order_by('ring_group_timeout_app', 'Timeout App', $order_by, $order); + //echo th_order_by('ring_group_timeout_data', 'Timeout Data', $order_by, $order); + echo th_order_by('ring_group_enabled', 'Enabled', $order_by, $order); + echo th_order_by('ring_group_description', 'Description', $order_by, $order); + echo "\n"; + echo "\n"; + + if ($result_count > 0) { + foreach($result as $row) { + echo "\n"; + echo " \n"; + echo " \n"; + //echo " \n"; + //echo " \n"; + //echo " \n"; + //echo " \n"; + //echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "\n"; + if ($c==0) { $c=1; } else { $c=0; } + } //end foreach + unset($sql, $result, $row_count); + } //end if results + + echo "\n"; + echo "\n"; + echo "\n"; + + echo "
\n"; + echo " $v_link_label_add\n"; + echo "
".$row['ring_group_name']." ".$row['ring_group_extension']." ".$row['ring_group_context']." ".$row['ring_group_strategy']." ".$row['ring_group_timeout_sec']." ".$row['ring_group_timeout_app']." ".$row['ring_group_timeout_data']." ".$row['ring_group_enabled']." ".$row['ring_group_description']." \n"; + echo " $v_link_label_edit\n"; + echo " $v_link_label_delete\n"; + echo "
\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "
 $paging_controls\n"; + echo " $v_link_label_add\n"; + echo "
\n"; + echo "
"; + echo "
"; + echo "

"; + echo "

"; + + echo "
"; + echo "
"; + echo "

"; + +//include the footer + require_once "includes/footer.php"; +?> \ No newline at end of file diff --git a/app/ring_groups/ring_groups_delete.php b/app/ring_groups/ring_groups_delete.php new file mode 100644 index 0000000000..5669bbe6f8 --- /dev/null +++ b/app/ring_groups/ring_groups_delete.php @@ -0,0 +1,88 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require_once "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (if_group("admin") || if_group("superadmin")) { + //access granted +} +else { + echo "access denied"; + exit; +} + +//get the http value and set it as a php variable + if (count($_GET)>0) { + $id = check_str($_GET["id"]); + } + +//delete the user data + if (strlen($id)>0) { + //get the dialplan + $sql = "select dialplan_uuid from v_ring_groups "; + $sql .= "where domain_uuid = '".$_SESSION['domain_uuid']."' "; + $sql .= "and ring_group_uuid = '".$id."' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(); + foreach ($result as &$row) { + $dialplan_uuid = $row["dialplan_uuid"]; + } + unset ($prep_statement); + //delete from the ring groups table + $sql = "delete from v_ring_groups "; + $sql .= "where domain_uuid = '".$_SESSION['domain_uuid']."' "; + $sql .= "and ring_group_uuid = '".$id."' "; + $db->exec(check_sql($sql)); + unset($sql); + //delete from the ring group extensions table + $sql = "delete from v_ring_group_extensions "; + $sql .= "where domain_uuid = '".$_SESSION['domain_uuid']."' "; + $sql .= "and ring_group_uuid = '".$id."' "; + $db->exec(check_sql($sql)); + unset($sql); + //delete from the dialplan + $sql = "delete from v_dialplans "; + $sql .= "where domain_uuid = '".$_SESSION['domain_uuid']."' "; + $sql .= "and dialplan_uuid = '".$dialplan_uuid."' "; + $db->exec(check_sql($sql)); + unset($sql); + //save the xml + save_dialplan_xml(); + //apply settings reminder + $_SESSION["reload_xml"] = true; + } + +//redirect the user + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Delete Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + +?> \ No newline at end of file diff --git a/app/ring_groups/ring_groups_edit.php b/app/ring_groups/ring_groups_edit.php new file mode 100644 index 0000000000..c208a3b81c --- /dev/null +++ b/app/ring_groups/ring_groups_edit.php @@ -0,0 +1,529 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require_once "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (if_group("admin") || if_group("superadmin")) { + //access granted +} +else { + echo "access denied"; + exit; +} + +//delete the user from the v_extension_users + if ($_GET["a"] == "delete" && permission_exists("user_delete")) { + //set the variables + $ring_group_extension_uuid = check_str($_REQUEST["id"]); + $ring_group_uuid = check_str($_REQUEST["ring_group_uuid"]); + //delete the extension from the ring_group + $sql = "delete from v_ring_group_extensions "; + $sql .= "where domain_uuid = '".$_SESSION['domain_uuid']."' "; + $sql .= "and ring_group_extension_uuid = '$ring_group_extension_uuid' "; + $db->exec(check_sql($sql)); + unset($sql); + //redirect the browser + require_once "includes/header.php"; + echo "\n"; + echo "
Delete Complete
"; + require_once "includes/footer.php"; + return; + } + +//action add or update + if (isset($_REQUEST["id"])) { + $action = "update"; + $ring_group_uuid = check_str($_REQUEST["id"]); + } + else { + $action = "add"; + } + +//get http post variables and set them to php variables + if (count($_POST)>0) { + $ring_group_name = check_str($_POST["ring_group_name"]); + $ring_group_extension = check_str($_POST["ring_group_extension"]); + $ring_group_context = check_str($_POST["ring_group_context"]); + $ring_group_strategy = check_str($_POST["ring_group_strategy"]); + $ring_group_timeout_sec = check_str($_POST["ring_group_timeout_sec"]); + $ring_group_timeout_action = check_str($_POST["ring_group_timeout_action"]); + $ring_group_enabled = check_str($_POST["ring_group_enabled"]); + $ring_group_description = check_str($_POST["ring_group_description"]); + $dialplan_uuid = check_str($_POST["dialplan_uuid"]); + //$ring_group_timeout_action = "transfer:1001 XML default"; + $ring_group_timeout_array = explode(":", $ring_group_timeout_action); + $ring_group_timeout_app = array_shift($ring_group_timeout_array); + $ring_group_timeout_data = join(':', $ring_group_timeout_array); + $extension_uuid = check_str($_POST["extension_uuid"]); + } + +if (count($_POST)>0 && strlen($_POST["persistformvar"]) == 0) { + + $msg = ''; + if ($action == "update") { + $ring_group_uuid = check_str($_POST["ring_group_uuid"]); + } + + //check for all required data + if (strlen($ring_group_name) == 0) { $msg .= "Please provide: Name
\n"; } + if (strlen($ring_group_extension) == 0) { $msg .= "Please provide: Extension
\n"; } + if (strlen($ring_group_strategy) == 0) { $msg .= "Please provide: Strategy
\n"; } + if (strlen($ring_group_timeout_sec) == 0) { $msg .= "Please provide: Timeout
\n"; } + if (strlen($ring_group_timeout_app) == 0) { $msg .= "Please provide: Timeout Action
\n"; } + if (strlen($ring_group_enabled) == 0) { $msg .= "Please provide: Enabled
\n"; } + //if (strlen($ring_group_description) == 0) { $msg .= "Please provide: Description
\n"; } + if (strlen($msg) > 0 && strlen($_POST["persistformvar"]) == 0) { + require_once "includes/header.php"; + require_once "includes/persistformvar.php"; + echo "
\n"; + echo "
\n"; + echo $msg."
"; + echo "
\n"; + persistformvar($_POST); + echo "
\n"; + require_once "includes/footer.php"; + return; + } + + //set the context for users that are not in the superadmin group + if (!if_group("superadmin")) { + if (count($_SESSION["domains"]) > 1) { + $ring_group_context = $_SESSION['domain_name']; + } + else { + $ring_group_context = "default"; + } + } + + //add or update the database + if ($_POST["persistformvar"] != "true") { + if ($action == "add") { + //prepare the uuids + $ring_group_uuid = uuid(); + $dialplan_uuid = uuid(); + //add the ring group + $sql = "insert into v_ring_groups "; + $sql .= "("; + $sql .= "domain_uuid, "; + $sql .= "ring_group_uuid, "; + $sql .= "ring_group_name, "; + $sql .= "ring_group_extension, "; + $sql .= "ring_group_context, "; + $sql .= "ring_group_strategy, "; + $sql .= "ring_group_timeout_sec, "; + $sql .= "ring_group_timeout_app, "; + $sql .= "ring_group_timeout_data, "; + $sql .= "ring_group_enabled, "; + $sql .= "ring_group_description, "; + $sql .= "dialplan_uuid "; + $sql .= ")"; + $sql .= "values "; + $sql .= "("; + $sql .= "'".$_SESSION['domain_uuid']."', "; + $sql .= "'".$ring_group_uuid."', "; + $sql .= "'$ring_group_name', "; + $sql .= "'$ring_group_extension', "; + $sql .= "'$ring_group_context', "; + $sql .= "'$ring_group_strategy', "; + $sql .= "'$ring_group_timeout_sec', "; + $sql .= "'$ring_group_timeout_app', "; + $sql .= "'$ring_group_timeout_data', "; + $sql .= "'$ring_group_enabled', "; + $sql .= "'$ring_group_description', "; + $sql .= "'$dialplan_uuid' "; + $sql .= ")"; + $db->exec(check_sql($sql)); + unset($sql); + } //if ($action == "add") + + if ($action == "update") { + $sql = "update v_ring_groups set "; + $sql .= "ring_group_name = '$ring_group_name', "; + $sql .= "ring_group_extension = '$ring_group_extension', "; + if (if_group("superadmin")) { + $sql .= "ring_group_context = '$ring_group_context', "; + } + $sql .= "ring_group_strategy = '$ring_group_strategy', "; + $sql .= "ring_group_timeout_sec = '$ring_group_timeout_sec', "; + $sql .= "ring_group_timeout_app = '$ring_group_timeout_app', "; + $sql .= "ring_group_timeout_data = '$ring_group_timeout_data', "; + $sql .= "ring_group_enabled = '$ring_group_enabled', "; + $sql .= "ring_group_description = '$ring_group_description' "; + //$sql .= "dialplan_uuid = '$dialplan_uuid' "; + $sql .= "where domain_uuid = '".$_SESSION['domain_uuid']."' "; + $sql .= "and ring_group_uuid = '$ring_group_uuid'"; + $db->exec(check_sql($sql)); + unset($sql); + } + + if ($action == "update" || $action == "add") { + //if extension_uuid then add it to ring group extensions + if (strlen($extension_uuid) > 0) { + $ring_group_extension_uuid = uuid(); + $sql = "insert into v_ring_group_extensions "; + $sql .= "("; + $sql .= "domain_uuid, "; + $sql .= "ring_group_uuid, "; + $sql .= "ring_group_extension_uuid, "; + $sql .= "extension_uuid "; + $sql .= ")"; + $sql .= "values "; + $sql .= "("; + $sql .= "'".$_SESSION['domain_uuid']."', "; + $sql .= "'$ring_group_uuid', "; + $sql .= "'$ring_group_extension_uuid', "; + $sql .= "'$extension_uuid' "; + $sql .= ")"; + $db->exec(check_sql($sql)); + unset($sql); + } + + //if it does not exist in the dialplan then add it + $sql = "select count(*) as num_rows from v_dialplans "; + $sql .= "where domain_uuid = '".$_SESSION['domain_uuid']."' "; + $sql .= "and dialplan_uuid = '".$dialplan_uuid."' "; + $prep_statement = $db->prepare(check_sql($sql)); + if ($prep_statement) { + $prep_statement->execute(); + $row = $prep_statement->fetch(PDO::FETCH_ASSOC); + if ($row['num_rows'] == 0) { + //create the dialplan entry for fax + $dialplan_name = $ring_group_name; + $dialplan_order ='333'; + $dialplan_context = $ring_group_context; + $dialplan_enabled = 'true'; + $dialplan_description = $ring_group_description; + $app_uuid = '1d61fb65-1eec-bc73-a6ee-a6203b4fe6f2'; + dialplan_add($_SESSION['domain_uuid'], $dialplan_uuid, $dialplan_name, $dialplan_order, $dialplan_context, $dialplan_enabled, $dialplan_description, $app_uuid); + + // + $dialplan_detail_tag = 'condition'; //condition, action, antiaction + $dialplan_detail_type = 'destination_number'; + $dialplan_detail_data = '^'.$ring_group_extension.'$'; + $dialplan_detail_order = '000'; + $dialplan_detail_group = '1'; + dialplan_detail_add($_SESSION['domain_uuid'], $dialplan_uuid, $dialplan_detail_tag, $dialplan_detail_order, $dialplan_detail_group, $dialplan_detail_type, $dialplan_detail_data); + + // + $dialplan_detail_tag = 'action'; //condition, action, antiaction + $dialplan_detail_type = 'set'; + $dialplan_detail_data = 'ring_group_uuid='.$ring_group_uuid; + $dialplan_detail_order = '010'; + $dialplan_detail_group = '1'; + dialplan_detail_add($_SESSION['domain_uuid'], $dialplan_uuid, $dialplan_detail_tag, $dialplan_detail_order, $dialplan_detail_group, $dialplan_detail_type, $dialplan_detail_data); + + // + $dialplan_detail_tag = 'action'; //condition, action, antiaction + //$dialplan_detail_type = 'transfer'; + //$dialplan_detail_data = $ring_group_extension . ' LUA ring_group.lua'; + $dialplan_detail_type = 'lua'; + $dialplan_detail_data = 'ring_group.lua'; + $dialplan_detail_order = '020'; + $dialplan_detail_group = '1'; + dialplan_detail_add($_SESSION['domain_uuid'], $dialplan_uuid, $dialplan_detail_tag, $dialplan_detail_order, $dialplan_detail_group, $dialplan_detail_type, $dialplan_detail_data); + + //save the xml + save_dialplan_xml(); + + //apply settings reminder + $_SESSION["reload_xml"] = true; + } + } + + //redirect the browser + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + if ($action == "add") { + echo "Add Complete\n"; + } + if ($action == "update") { + echo "Update Complete\n"; + } + echo "
\n"; + require_once "includes/footer.php"; + exit; + } + } //if ($_POST["persistformvar"] != "true") +} //(count($_POST)>0 && strlen($_POST["persistformvar"]) == 0) + +//pre-populate the form + if (count($_GET)>0 && $_POST["persistformvar"] != "true") { + $ring_group_uuid = $_GET["id"]; + $sql = "select * from v_ring_groups "; + $sql .= "where domain_uuid = '".$_SESSION['domain_uuid']."' "; + $sql .= "and ring_group_uuid = '$ring_group_uuid' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(); + foreach ($result as &$row) { + $ring_group_name = $row["ring_group_name"]; + $ring_group_extension = $row["ring_group_extension"]; + $ring_group_context = $row["ring_group_context"]; + $ring_group_strategy = $row["ring_group_strategy"]; + $ring_group_timeout_sec = $row["ring_group_timeout_sec"]; + $ring_group_timeout_app = $row["ring_group_timeout_app"]; + $ring_group_timeout_data = $row["ring_group_timeout_data"]; + $ring_group_enabled = $row["ring_group_enabled"]; + $ring_group_description = $row["ring_group_description"]; + $dialplan_uuid = $row["dialplan_uuid"]; + } + unset ($prep_statement); + if (strlen($ring_group_timeout_app) > 0) { + $ring_group_timeout_action = $ring_group_timeout_app.":".$ring_group_timeout_data; + } + } + +//set defaults + if (strlen($ring_group_timeout_sec) == 0) { $ring_group_timeout_sec = '30'; } + if (strlen($ring_group_enabled) == 0) { $ring_group_enabled = 'true'; } + if (if_group("superadmin")) { + if (strlen($ring_group_context) == 0) { + if (count($_SESSION["domains"]) > 1) { + $ring_group_context = $_SESSION['domain_name']; + } + else { + $ring_group_context = "default"; + } + } + } + +//show the header + require_once "includes/header.php"; + +//show the content + echo "
"; + echo "\n"; + echo "\n"; + echo " "; + echo " "; + echo "
\n"; + echo "
"; + + echo "
\n"; + echo "
\n"; + echo "\n"; + echo "\n"; + if ($action == "add") { + echo "\n"; + } + if ($action == "update") { + echo "\n"; + } + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + if (if_group("superadmin")) { + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + } + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo " "; + echo " "; + echo " "; + echo " "; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo " \n"; + echo " \n"; + echo " "; + echo "
Ring Group AddRing Group Edit
\n"; + echo "A ring group is a set of extensions that can be called with a ring strategy.

\n"; + echo "
\n"; + echo " Name:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the name.\n"; + echo "
\n"; + echo " Extension:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the extension.\n"; + echo "
\n"; + echo " Context:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the context.\n"; + echo "
\n"; + echo " Strategy:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Select the strategy.\n"; + echo "
Extensions:"; + if ($action == "update") { + echo " \n"; + $sql = "SELECT g.ring_group_extension_uuid, e.extension_uuid, e.extension "; + $sql .= "FROM v_ring_groups as r, v_ring_group_extensions as g, v_extensions as e "; + $sql .= "where g.ring_group_uuid = r.ring_group_uuid "; + $sql .= "and g.domain_uuid = '".$_SESSION['domain_uuid']."' "; + $sql .= "and g.ring_group_uuid = '".$ring_group_uuid."' "; + $sql .= "and e.extension_uuid = g.extension_uuid "; + $sql .= "order by e.extension asc "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + $result_count = count($result); + foreach($result as $field) { + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + } + echo "
".$field['extension']."\n"; + echo " $v_link_label_delete\n"; + echo "
\n"; + } + echo "
\n"; + $sql = "SELECT * FROM v_extensions "; + $sql .= "where domain_uuid = '".$_SESSION['domain_uuid']."' "; + $sql .= "order by extension asc "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + echo " "; + if ($action == "update") { + echo " \n"; + } + unset($sql, $result); + echo "
\n"; + echo " Add the extensions to the ring group.\n"; + echo "
\n"; + echo "
\n"; + echo " Timeout:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the timeout in seconds.\n"; + echo "
\n"; + echo " Destination:\n"; + echo "\n"; + //switch_select_destination(select_type, select_label, select_name, select_value, select_style, action); + switch_select_destination("dialplan", "", "ring_group_timeout_action", $ring_group_timeout_action, "", ""); + echo "
\n"; + echo " Select the timeout destination.\n"; + echo "
\n"; + echo " Enabled:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Select enable or disable the ring group.\n"; + echo "
\n"; + echo " Description:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the description.\n"; + echo "
\n"; + if ($action == "update") { + echo " \n"; + echo " \n"; + } + echo " \n"; + echo "
"; + echo ""; + + echo "
"; + echo "
"; + +//include the footer + require_once "includes/footer.php"; +?> \ No newline at end of file diff --git a/app/ring_groups/root.php b/app/ring_groups/root.php new file mode 100644 index 0000000000..7b882438ea --- /dev/null +++ b/app/ring_groups/root.php @@ -0,0 +1,50 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ + +// make sure the PATH_SEPARATOR is defined + if (!defined("PATH_SEPARATOR")) { + if ( strpos( $_ENV[ "OS" ], "Win" ) !== false ) { define("PATH_SEPARATOR", ";"); } else { define("PATH_SEPARATOR", ":"); } + } + +// make sure the document_root is set + $_SERVER["SCRIPT_FILENAME"] = str_replace("\\", "/", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = str_replace($_SERVER["PHP_SELF"], "", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = realpath($_SERVER["DOCUMENT_ROOT"]); + //echo "DOCUMENT_ROOT: ".$_SERVER["DOCUMENT_ROOT"]."
\n"; + //echo "PHP_SELF: ".$_SERVER["PHP_SELF"]."
\n"; + //echo "SCRIPT_FILENAME: ".$_SERVER["SCRIPT_FILENAME"]."
\n"; + +// if the project directory exists then add it to the include path otherwise add the document root to the include path + if (is_dir($_SERVER["DOCUMENT_ROOT"].'/fusionpbx')){ + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', '/fusionpbx'); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER["DOCUMENT_ROOT"].'/fusionpbx' ); + } + else { + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', ''); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER['DOCUMENT_ROOT'] ); + } + +?> \ No newline at end of file diff --git a/app/script_edit/app_config.php b/app/script_edit/app_config.php new file mode 100644 index 0000000000..032ef17928 --- /dev/null +++ b/app/script_edit/app_config.php @@ -0,0 +1,26 @@ + \ No newline at end of file diff --git a/app/script_edit/clipadd.php b/app/script_edit/clipadd.php new file mode 100644 index 0000000000..0b9b326d8a --- /dev/null +++ b/app/script_edit/clipadd.php @@ -0,0 +1,126 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('script_editor_save')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +if (count($_POST)>0) { + $clip_name = check_str($_POST["clip_name"]); + $clip_folder = check_str($_POST["clip_folder"]); + $clip_text_start = check_str($_POST["clip_text_start"]); + $clip_text_end = check_str($_POST["clip_text_end"]); + $clip_desc = check_str($_POST["clip_desc"]); + $clip_order = check_str($_POST["clip_order"]); + if (strlen($clip_order) == 0) { $clip_order = 0; } + + $sql = "insert into v_clips "; + $sql .= "("; + $sql .= "clip_uuid, "; + $sql .= "clip_name, "; + $sql .= "clip_folder, "; + $sql .= "clip_text_start, "; + $sql .= "clip_text_end, "; + $sql .= "clip_desc, "; + $sql .= "clip_order "; + $sql .= ")"; + $sql .= "values "; + $sql .= "("; + $sql .= "'".uuid()."', "; + $sql .= "'$clip_name', "; + $sql .= "'$clip_folder', "; + $sql .= "'$clip_text_start', "; + $sql .= "'$clip_text_end', "; + $sql .= "'$clip_desc', "; + $sql .= "'$clip_order' "; + $sql .= ")"; + $db->exec(check_sql($sql)); + unset($sql,$db); + + require_once "header.php"; + echo "\n"; + echo "Add Complete"; + require_once "footer.php"; + return; +} + +//show the content + require_once "header.php"; + echo "
"; + echo "\n"; + echo "\n"; + echo " "; + echo " "; + echo "
\n"; + + //echo "Clip Library"; + //echo "
"; + echo "
"; + echo ""; + echo " "; + echo " "; + echo " "; + echo " "; + + echo " "; + echo " "; + echo " "; + echo " "; + + echo " "; + echo " "; + echo " "; + + echo " "; + echo " "; + echo " "; + + echo " "; + echo " "; + echo " "; + + echo " "; + echo " "; + echo "
Name:
Folder:
Before Selection:
"; + echo " "; + echo "
After Selection:
"; + echo " "; + echo "
Notes:
"; + echo " "; + echo "
"; + echo "
"; + + echo "
"; + echo "
"; + + require_once "footer.php"; +?> \ No newline at end of file diff --git a/app/script_edit/clipdelete.php b/app/script_edit/clipdelete.php new file mode 100644 index 0000000000..043332a193 --- /dev/null +++ b/app/script_edit/clipdelete.php @@ -0,0 +1,56 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('script_editor_save')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +//get the uuid from http values + $clip_uuid = check_str($_GET["id"]); + +//delete the clip + if (strlen($_GET["id"])>0) { + $sql = "delete from v_clips "; + $sql .= "where clip_uuid = '".$clip_uuid."' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + unset($sql,$db); + } + +//redirect the browser + require_once "header.php"; + echo "\n"; + echo "Delete Complete"; + require_once "footer.php"; + return; + +?> \ No newline at end of file diff --git a/app/script_edit/cliplist.php b/app/script_edit/cliplist.php new file mode 100644 index 0000000000..94750847ad --- /dev/null +++ b/app/script_edit/cliplist.php @@ -0,0 +1,235 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +require_once "includes/checkauth.php"; +if (permission_exists('script_editor_view')) { + //access granted +} +else { + echo "access denied"; + exit; +} +//require_once "edit/header.php"; + +echo ""; +echo ""; +echo ""; + +function isfile($filename) { + if (@filesize($filename) > 0) { return true; } else { return false; } +} + +function space($count) { + $r=''; $i=0; + while($i < $count) { + $r .= ' '; + $i++; + } + return $r; +} + +echo ""; + +echo ""; + +echo ""; +echo ""; +echo "
"; +echo "\n"; +echo "\n"; +echo "
\n"; +echo "
Clip Library
\n"; //display:none + +$sql = "select * from v_clips "; +$sql .= "order by clip_folder "; +$prep_statement = $db->prepare(check_sql($sql)); +$prep_statement->execute(); +$result = $prep_statement->fetchAll(PDO::FETCH_NAMED); +$result_count = count($result); + +if ($result_count > 0) { //no results + $last_folder = ''; + $tag_open = ''; + $x = 0; + $current_depth = 0; + $previous_depth = 0; + foreach($result as $row) { + $current_depth = count(explode ("/", $row['clip_folder'])); + if ($current_depth < $previous_depth) { + $count = ($previous_depth - $current_depth); + $i=0; + while($i < $count){ + echo "
\n"; + $i++; + } + echo "
\n"; + } + + if ($last_folder != $row['clip_folder']) { + $clip_folder_name = str_replace ($previous_folder_name, "", $row['clip_folder']); + $clip_folder_name = str_replace ("/", "", $clip_folder_name); + echo "
 ".$clip_folder_name."  
\n\n"; + $tag_open = 1; + } + + $previous_depth = $current_depth; + $previous_folder_name = $row['clip_folder']; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "
\n"; + echo "".$row['clip_name']."\n"; + echo "
\n"; + echo "\n\n"; + + $last_folder = $row['clip_folder']; + + if ($c==0) { $c=1; } else { $c=0; } + } //end foreach + unset($sql, $result, $row_count); + +} //end if results + +echo "\n"; +echo "
\n"; + +echo "\n"; +echo "\n"; +echo "\n"; +echo "
"; + +echo "

"; +//require_once "includes/footer.php"; + +unset ($result_count); +unset ($result); +unset ($key); +unset ($val); +unset ($c); + +echo ""; +echo ""; + +?> \ No newline at end of file diff --git a/app/script_edit/clipoptions.php b/app/script_edit/clipoptions.php new file mode 100644 index 0000000000..ce27c640dd --- /dev/null +++ b/app/script_edit/clipoptions.php @@ -0,0 +1,71 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('script_editor_view')) { + //access granted +} +else { + echo "access denied"; + exit; +} +require_once "header.php"; + +echo "
"; +echo "\n"; +echo ""; +echo "\n"; +echo ""; +echo "\n"; +echo "\n"; +echo "\n"; +echo "\n"; +echo "
Selected Clip:
"; +echo " "; +echo ""; + +echo " "; +//echo " \n"; +//echo " \n"; +//echo " \n"; + +echo " \n"; +echo " \n"; +//echo " \n"; +echo " \n"; +echo " \n"; + +echo " \n"; +echo "
Options











"; + +echo "
"; +echo "
"; + +require_once "footer.php"; +?> \ No newline at end of file diff --git a/app/script_edit/clipoptionslist.php b/app/script_edit/clipoptionslist.php new file mode 100644 index 0000000000..ba406f8114 --- /dev/null +++ b/app/script_edit/clipoptionslist.php @@ -0,0 +1,228 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('php_editor_view')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +echo ""; +echo ""; + +echo ""; + +function isfile($filename) { + if (@filesize($filename) > 0) { return true; } else { return false; } +} + +function space($count) { + $r=''; $i=0; + while($i < $count) { + $r .= ' '; + $i++; + } + return $r; +} + +//show the content + echo ""; + + echo ""; + +echo ""; +echo ""; + + echo "
"; + echo "\n"; + + echo "\n"; + echo "
\n"; + echo "
Clip Library
\n"; //display:none + + $sql = "select * from v_clips "; + $sql .= "order by clip_folder "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + $result_count = count($result); + + if ($result_count > 0) { //no results + $last_folder = ''; + $tag_open = ''; + $x = 0; + $current_depth = 0; + $previous_depth = 0; + foreach($result as $row) { + $current_depth = count(explode("/", $row[clip_folder])); + if ($current_depth < $previous_depth) { + $count = ($previous_depth - $current_depth); + $i=0; + while($i < $count){ + echo "
\n"; + $i++; + } + echo "
\n"; + + } + + if ($last_folder != $row['clip_folder']) { + $clip_folder_name = str_replace ($previous_folder_name, "", $row['clip_folder']); + $clip_folder_name = str_replace ("/", "", $clip_folder_name); + echo "
 ".$clip_folder_name."  
\n\n"; + $tag_open = 1; + } + + $previous_depth = $current_depth; + $previous_folder_name = $row['clip_folder']; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "
\n"; + echo "".$row['clip_name']."\n"; + + echo "
\n"; + echo "\n\n"; + + $last_folder = $row['clip_folder']; + if ($c==0) { $c=1; } else { $c=0; } + } //end foreach + unset($sql, $result, $row_count); + } //end if results + + echo "\n"; + echo "
\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "
"; + + echo "

"; + + unset ($result_count); + unset ($result); + unset ($key); + unset ($val); + unset ($c); + + echo ""; + echo ""; + +?> \ No newline at end of file diff --git a/app/script_edit/clipsearch.php b/app/script_edit/clipsearch.php new file mode 100644 index 0000000000..69e3b9a487 --- /dev/null +++ b/app/script_edit/clipsearch.php @@ -0,0 +1,180 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/checkauth.php"; +if (permission_exists('script_editor_view')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +if (count($_POST)>0) { + $clip_uuid = $_POST["id"]; + $clip_name = $_POST["clip_name"]; + $clip_folder = $_POST["clip_folder"]; + $clip_text_start = $_POST["clip_text_start"]; + $clip_text_end = $_POST["clip_text_end"]; + $clip_desc = $_POST["clip_desc"]; + $clip_order = $_POST["clip_order"]; + + require_once "header.php"; + echo "
"; + echo "\n"; + echo "\n"; + echo " \n"; + echo "\n"; + + } //end if results + + echo "
\n"; + echo "
"; + + $sql .= "select * from v_clips "; + $sql .= "where "; + if (strlen($clip_uuid) > 0) { $sql .= "and id = '$clip_uuid' "; } + if (strlen($clip_name) > 0) { $sql .= "and clip_name like '%$clip_name%' "; } + if (strlen($clip_folder) > 0) { $sql .= "and clip_folder like '%$clip_folder%' "; } + if (strlen($clip_text_start) > 0) { $sql .= "and clip_text_start like '%$clip_text_start%' "; } + if (strlen($clip_text_end) > 0) { $sql .= "and clip_text_end like '%$clip_text_end%' "; } + if (strlen($clip_desc) > 0) { $sql .= "and clip_desc like '%$clip_desc%' "; } + if (strlen($clip_order) > 0) { $sql .= "and clip_order like '%$clip_order%' "; } + + $sql = trim($sql); + if (substr($sql, -5) == "where"){ $sql = substr($sql, 0, (strlen($sql)-5)); } + $sql = str_replace ("where and", "where", $sql); + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + $result_count = count($result); + + $c = 0; + $row_style["0"] = "background-color: #F5F5DC;"; + $row_style["1"] = "background-color: #FFFFFF;"; + + echo "
\n"; + echo "\n"; + echo ""; + + if ($result_count == 0) { + //no results + echo ""; + } + else { //received results + echo ""; + //echo ""; + echo ""; + //echo ""; + //echo ""; + //echo ""; + //echo ""; + //echo ""; + echo ""; + echo "\n"; + + foreach($result as $row) { + //print_r( $row ); + echo "\n"; + //echo ""; + echo ""; + //echo ""; + //echo ""; + //echo ""; + //echo ""; + //echo ""; + echo ""; + + echo "\n"; + if ($c==0) { $c=1; } else { $c=0; } + } //end foreach unset($sql, $result, $row_count); + echo "
 
    Id        clip_name Search         clip_folder        clip_text_start        clip_text_end        clip_desc        clip_order   
".$row[id]."".$row[clip_name]."".$row[clip_folder]."".$row[clip_text_start]."".$row[clip_text_end]."".$row[clip_desc]."".$row[clip_order]."
\n"; + echo "
\n"; + + echo "

"; + echo "
\n"; + echo "
"; + echo "

"; + require_once "footer.php"; + + unset ($result_count); + unset ($result); + unset ($key); + unset ($val); + unset ($c); + +} +else { + + //show the content + require_once "header.php"; + echo "
"; + echo "\n"; + echo "\n"; + echo " "; + echo " "; + echo "
\n"; + echo "
"; + + echo "
"; + echo ""; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + echo " "; + echo " "; + echo " "; + echo "
Name:
Folder:
Start:
End:
Desc:
clip_order:
"; + echo "
"; + + echo "
"; + echo "
"; + + require_once "footer.php"; + +} //end if not post +?> \ No newline at end of file diff --git a/app/script_edit/clipupdate.php b/app/script_edit/clipupdate.php new file mode 100644 index 0000000000..692eb5f78d --- /dev/null +++ b/app/script_edit/clipupdate.php @@ -0,0 +1,138 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('script_editor_save')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +if (count($_POST)>0) { + $clip_uuid = check_str($_POST["id"]); + $clip_name = check_str($_POST["clip_name"]); + $clip_folder = check_str($_POST["clip_folder"]); + $clip_text_start = check_str($_POST["clip_text_start"]); + $clip_text_end = check_str($_POST["clip_text_end"]); + $clip_desc = check_str($_POST["clip_desc"]); + $clip_order = check_str($_POST["clip_order"]); + + //sql update + $sql = "update v_clips set "; + $sql .= "clip_name = '$clip_name', "; + $sql .= "clip_folder = '$clip_folder', "; + $sql .= "clip_text_start = '$clip_text_start', "; + $sql .= "clip_text_end = '$clip_text_end', "; + $sql .= "clip_desc = '$clip_desc', "; + $sql .= "clip_order = '$clip_order' "; + $sql .= "where clip_uuid = '$clip_uuid' "; + $count = $db->exec(check_sql($sql)); + //echo "affected rows: ".$count; + + //redirect the browser + require_once "header.php"; + echo "\n"; + echo "Update Complete"; + require_once "footer.php"; + return; +} +else { + //get the uuid from http values + $clip_uuid = check_str($_GET["id"]); + + //get the clip + $sql = "select * from v_clips "; + $sql .= "where clip_uuid = '$clip_uuid' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach ($result as &$row) { + $clip_name = $row["clip_name"]; + $clip_folder = $row["clip_folder"]; + $clip_text_start = $row["clip_text_start"]; + $clip_text_end = $row["clip_text_end"]; + $clip_desc = $row["clip_desc"]; + $clip_order = $row["clip_order"]; + break; //limit to 1 row + } +} + +//show the content + require_once "header.php"; + echo "
"; + echo "\n"; + echo "\n"; + echo " "; + echo " "; + echo "
\n"; + + echo "
"; + echo ""; + echo " "; + echo " "; + echo " "; + echo " "; + + echo " "; + echo " "; + echo " "; + echo " "; + + echo " "; + echo " "; + echo " "; + + echo " "; + echo " "; + echo " "; + + echo " "; + echo " "; + echo " "; + + echo " "; + echo " "; + echo " "; + echo "
Name:
Folder:
Before Selection:
"; + echo " "; + echo "
After Selection:
"; + echo " "; + echo "
Notes:
"; + echo " "; + echo "
"; + echo " "; + echo " "; + echo "
"; + echo "
"; + + echo "
"; + echo "
"; + + require_once "footer.php"; +?> \ No newline at end of file diff --git a/app/script_edit/filedelete.php b/app/script_edit/filedelete.php new file mode 100644 index 0000000000..0607661bb7 --- /dev/null +++ b/app/script_edit/filedelete.php @@ -0,0 +1,84 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('script_editor_save')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +$folder = $_GET["folder"]; +$folder = str_replace ("\\", "/", $folder); +if (substr($folder, -1) != "/") { $folder = $folder.'/'; } +$file = $_GET["file"]; + +if (strlen($folder) > 0 && strlen($file) > 0) { + unlink($folder.$file); + header("Location: fileoptions.php"); +} +else { + //display form + require_once "header.php"; + echo "
"; + echo "
"; + echo "
"; + echo ""; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo "
Path:
".$folder.$file."
"; + + echo "
"; + + echo ""; + echo " "; + echo " "; + echo " "; + + echo " "; + echo " "; + echo " "; + + echo " "; + echo " "; + echo " "; + echo "
File Name:
"; + echo " "; + echo " "; + echo "
"; + echo "
"; + echo "
"; + + require_once "footer.php"; +} +?> \ No newline at end of file diff --git a/app/script_edit/filelist.php b/app/script_edit/filelist.php new file mode 100644 index 0000000000..e924ea2bc5 --- /dev/null +++ b/app/script_edit/filelist.php @@ -0,0 +1,254 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('script_editor_view')) { + //access granted +} +else { + echo "access denied"; + exit; +} +require_once "header.php"; + +function isfile($filename) { + //if (@filesize($filename) > 0) { return true; } else { return false; } +} + +function space($count) { + $r=''; $i=0; + while($i < $count) { + $r .= ' '; + $i++; + } + return $r; +} + +function recur_dir($dir) { + clearstatcache(); + $htmldirlist = ''; + $htmlfilelist = ''; + $dirlist = opendir($dir); + $dir_array = array(); + while (false !== ($file = readdir($dirlist))) { + if ($file != "." AND $file != ".."){ + $newpath = $dir.'/'.$file; + $level = explode('/',$newpath); + if (substr($newpath, -4) == ".svn") { + //ignore .svn dir and subdir + } + elseif (substr($newpath, -3) == ".db") { + //ignore .db files + } + else { + $dir_array[] = $newpath; + } + if ($x > 1000) { break; }; + $x++; + } + } + + asort($dir_array); + foreach ($dir_array as $newpath){ + $level = explode('/',$newpath); + + if (is_dir($newpath)) { + /*$mod_array[] = array( + 'level'=>count($level)-1, + 'path'=>$newpath, + 'name'=>end($level), + 'type'=>'dir', + 'mod_time'=>filemtime($newpath), + 'size'=>''); + $mod_array[] = recur_dir($newpath); + */ + $dirname = end($level); + $htmldirlist .= space(count($level))."
$dirname
\n"; + //$htmldirlist .= space(count($level))."
Tools
\n"; + //$htmldirlist .= space(count($level))."
New Folder
\n"; //parent.document.getElementById('file').value='".urlencode($newpath)."' + //$htmldirlist .= space(count($level))."
\n"; + //$htmldirlist .= space(count($level))."
New File
\n"; //parent.document.getElementById('file').value='".urlencode($newpath)."' + //$htmldirlist .= space(count($level))."
\n"; + //$htmldirlist .= space(count($level))."
\n"; + //$htmldirlist .= space(count($level))."
Options
\n"; //parent.document.getElementById('file').value='".urlencode($newpath)."' + //$htmldirlist .= space(count($level))."
\n"; + $htmldirlist .= recur_dir($newpath); + $htmldirlist .= space(count($level))."
\n"; + } + else { + /*$mod_array[] = array( + 'level'=>count($level)-1, + 'path'=>$newpath, + 'name'=>end($level), + 'type'=>'file', + 'mod_time'=>filemtime($newpath), + 'size'=>filesize($newpath)); + */ + $filename = end($level); + $filesize = round(filesize($newpath)/1024, 2); + $htmlfilelist .= space(count($level))."
$filename
\n"; + $htmlfilelist .= space(count($level))."
\n"; + } + } + closedir($dirlist); + return $htmldirlist ."\n". $htmlfilelist; +} + +echo ""; + + +echo ""; + +echo "
"; +echo "\n"; +echo "\n"; +echo " \n"; + $sql = "select * from v_virtual_table_fields "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and virtual_table_uuid = '$virtual_table_uuid' "; + $sql .= "order by virtual_field_order asc "; + $prep_statement = $db->prepare($sql); + $prep_statement->execute(); + $result_names = $prep_statement->fetchAll(PDO::FETCH_ASSOC); + $result_count = count($result); + foreach($result_names as $row) { + $virtual_field_label = $row["virtual_field_label"]; + $virtual_field_name = $row["virtual_field_name"]; + $virtual_field_type = $row["virtual_field_type"]; + $virtual_field_value = $row["virtual_field_value"]; + $virtual_field_list_hidden = $row["virtual_field_list_hidden"]; + $virtual_field_column = $row["virtual_field_column"]; + $virtual_field_required = $row["virtual_field_required"]; + $virtual_field_order = $row["virtual_field_order"]; + $virtual_field_order_tab = $row["virtual_field_order_tab"]; + $virtual_field_description = $row["virtual_field_description"]; + + $name_array[$virtual_field_name]['virtual_field_label'] = $row["virtual_field_label"]; + $name_array[$virtual_field_name]['virtual_field_type'] = $row["virtual_field_type"]; + $name_array[$virtual_field_name]['virtual_field_list_hidden'] = $row["virtual_field_list_hidden"]; + $name_array[$virtual_field_name]['virtual_field_column'] = $row["virtual_field_column"]; + $name_array[$virtual_field_name]['virtual_field_required'] = $row["virtual_field_required"]; + $name_array[$virtual_field_name]['virtual_field_order'] = $row["virtual_field_order"]; + $name_array[$virtual_field_name]['virtual_field_order_tab'] = $row["virtual_field_order_tab"]; + $name_array[$virtual_field_name]['virtual_field_description'] = $row["virtual_field_description"]; + } + unset($sql, $prep_statement, $row); + $fieldcount = count($name_array); + + $i = 1; + while($i <= $rcount){ + $virtual_field_name = check_str($_POST[$i."field_name"]); + $virtual_data_field_value = check_str($_POST[$i."field_value"]); + if ($i==1) { + $unique_temp_id = md5('7k3j2m'.date('r')); //used to find the first item + $virtual_data_row_uuid = $unique_temp_id; + } + $sql = "select virtual_field_type, virtual_field_name from v_virtual_table_fields "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and virtual_table_uuid = '$virtual_table_uuid' "; + $sql .= "and virtual_field_name = '$virtual_field_name' "; + $prep_statement = $db->prepare($sql); + $prep_statement->execute(); + while($row = $prep_statement->fetch()){ + $virtual_field_type = $row['virtual_field_type']; + } + + if ($virtual_field_type == "upload_file" || $virtual_field_type == "uploadimage") { + //print_r($_FILES); + $upload_temp_dir = $_ENV["TEMP"]."\\"; + ini_set('upload_tmp_dir', $upload_temp_dir); + //$uploaddir = ""; + if ($virtual_field_type == "upload_file") { + $upload_file = $filedir . $_FILES[$i.'field_value']['name']; + } + if ($virtual_field_type == "uploadimage") { + $upload_file = $imagedir . $_FILES[$i.'field_value']['name']; + } + // $_POST[$i."field_name"] + //print_r($_FILES); + //echo "upload_file $upload_file
\n"; + //echo "upload_temp_dir $upload_temp_dir
\n"; + + $virtual_data_field_value = $_FILES[$i.'field_value']['name']; + //echo "name $virtual_data_field_value
\n"; + //echo "virtual_field_name $virtual_field_name
\n"; + //$i."field_value" + //echo "if (move_uploaded_file(\$_FILES[$i.'field_value']['tmp_name'], $upload_file)) "; + //if (strlen($_FILES[$i.'field_value']['name'])>0) { //only do the following if there is a file name + //foreach($_FILES as $file) + //{ + //[$i.'field_value'] + //print_r($file); + if($_FILES[$i.'field_value']['error'] == 0 && $_FILES[$i.'field_value']['size'] > 0) { + if (move_uploaded_file($_FILES[$i.'field_value']['tmp_name'], $upload_file)) { + //echo $_FILES['userfile']['name'] ."
"; + //echo "was successfully uploaded. "; + //echo "

"; + //print "
";
+									//print_r($_FILES);
+									//print "
"; + } + else { + //echo "Upload Error. Here's some debugging info:\n"; + //print "
\n";
+									//print_r($_FILES);
+									//print "
\n"; + //exit; + } + } + //} + //} + } //end if file or image + + if ($action == "add" && permission_exists('virtual_tables_data_add')) { + //get a unique id for the virtual_data_row_uuid + if ($i==1) { + $virtual_data_row_uuid = uuid(); + } + + //insert the field data + $sql = "insert into v_virtual_table_data "; + $sql .= "("; + $sql .= "virtual_table_data_uuid, "; + $sql .= "domain_uuid, "; + $sql .= "virtual_data_row_uuid, "; + if(strlen($virtual_data_parent_row_uuid)>0) { + $sql .= "virtual_data_parent_row_uuid, "; + } + $sql .= "virtual_table_uuid, "; + if (strlen($virtual_table_parent_id) > 0) { + $sql .= "virtual_table_parent_id, "; + } + $sql .= "virtual_field_name, "; + $sql .= "virtual_data_field_value, "; + $sql .= "virtual_data_add_user, "; + $sql .= "virtual_data_add_date "; + $sql .= ")"; + $sql .= "values "; + $sql .= "("; + $sql .= "'".uuid()."', "; + $sql .= "'$domain_uuid', "; + $sql .= "'$virtual_data_row_uuid', "; + if(strlen($virtual_data_parent_row_uuid)>0) { + $sql .= "'$virtual_data_parent_row_uuid', "; + } + $sql .= "'$virtual_table_uuid', "; + if (strlen($virtual_table_parent_id) > 0) { + $sql .= "'$virtual_table_parent_id', "; + } + $sql .= "'$virtual_field_name', "; + switch ($name_array[$virtual_field_name]['virtual_field_type']) { + case "phone": + $tmp_phone = preg_replace('{\D}', '', $virtual_data_field_value); + $sql .= "'$tmp_phone', "; + break; + case "add_user": + $sql .= "'".$_SESSION["username"]."', "; + break; + case "add_date": + $sql .= "now(), "; + break; + case "mod_user": + $sql .= "'".$_SESSION["username"]."', "; + break; + case "mod_date": + $sql .= "now(), "; + break; + default: + $sql .= "'$virtual_data_field_value', "; + } + $sql .= "'".$_SESSION["username"]."', "; + $sql .= "now() "; + $sql .= ")"; + $db->exec(check_sql($sql)); + $lastinsertid = $db->lastInsertId($id); + unset($sql); + } //end action add + + if ($action == "update" && permission_exists('virtual_tables_data_edit')) { + $virtual_data_row_uuid = $_POST["virtual_data_row_uuid"]; + + $sql_update = "update v_virtual_table_data set "; + switch ($name_array[$virtual_field_name]['virtual_field_type']) { + case "phone": + $tmp_phone = preg_replace('{\D}', '', $virtual_data_field_value); + $sql_update .= "virtual_data_field_value = '$tmp_phone' "; + break; + case "add_user": + $sql_update .= "virtual_data_field_value = '".$_SESSION["username"]."' "; + break; + case "add_date": + $sql_update .= "virtual_data_field_value = now() "; + break; + case "mod_user": + $sql_update .= "virtual_data_field_value = '".$_SESSION["username"]."' "; + break; + case "mod_date": + $sql_update .= "virtual_data_field_value = now() "; + break; + default: + $sql_update .= "virtual_data_field_value = '$virtual_data_field_value' "; + } + $sql_update .= "where domain_uuid = '$domain_uuid' "; + $sql_update .= "and virtual_table_uuid = '$virtual_table_uuid' "; + if (strlen($virtual_table_parent_id) > 0) { + $sql_update .= "and virtual_table_parent_id = '$virtual_table_parent_id' "; + } + $sql_update .= "and virtual_data_row_uuid = '$virtual_data_row_uuid' "; + if(strlen($virtual_data_parent_row_uuid)>0) { + $sql_update .= "and virtual_data_parent_row_uuid = '$virtual_data_parent_row_uuid' "; + } + $sql_update .= "and virtual_field_name = '$virtual_field_name' "; + $count = $db->exec(check_sql($sql_update)); + unset ($sql_update); + if ($count > 0) { + //do nothing the update was successfull + } + else { + //no value to update so insert new value + $sql = "insert into v_virtual_table_data "; + $sql .= "("; + $sql .= "domain_uuid, "; + $sql .= "virtual_data_row_uuid, "; + if(strlen($virtual_data_parent_row_uuid)>0) { + $sql .= "virtual_data_parent_row_uuid, "; + } + $sql .= "virtual_table_uuid, "; + $sql .= "virtual_table_parent_id, "; + $sql .= "virtual_field_name, "; + $sql .= "virtual_data_field_value, "; + $sql .= "virtual_data_add_user, "; + $sql .= "virtual_data_add_date "; + $sql .= ")"; + $sql .= "values "; + $sql .= "("; + $sql .= "'$domain_uuid', "; + $sql .= "'$virtual_data_row_uuid', "; + if(strlen($virtual_data_parent_row_uuid)>0) { + $sql .= "'$virtual_data_parent_row_uuid', "; + } + $sql .= "'$virtual_table_uuid', "; + $sql .= "'$virtual_table_parent_id', "; + $sql .= "'$virtual_field_name', "; + switch ($name_array[$virtual_field_name]['virtual_field_type']) { + case "phone": + $tmp_phone = preg_replace('{\D}', '', $virtual_data_field_value); + $sql .= "'$tmp_phone', "; + break; + case "add_user": + $sql .= "'".$_SESSION["username"]."', "; + break; + case "add_date": + $sql .= "now(), "; + break; + case "mod_user": + $sql .= "'".$_SESSION["username"]."', "; + break; + case "mod_date": + $sql .= "now(), "; + break; + default: + $sql .= "'$virtual_data_field_value', "; + } + $sql .= "'".$_SESSION["username"]."', "; + $sql .= "now() "; + $sql .= ")"; + + $db->exec(check_sql($sql)); + $lastinsertid = $db->lastInsertId($id); + unset($sql); + } + } + $i++; + } + + //show the header + require_once "includes/header.php"; + + //set the meta redirect + if (strlen($virtual_data_parent_row_uuid) == 0) { + echo "\n"; + } + else { + echo "\n"; + } + + //show a message to the user before the redirect + echo "
\n"; + if ($action == "add") { echo "Add Complete\n"; } + if ($action == "update") { echo "Update Complete\n"; } + echo "
\n"; + require_once "includes/footer.php"; + return; + } + +//show the header + require_once "includes/header.php"; + +//pre-populate the form + if ($action == "update") { + //get the field values + $sql = ""; + $sql .= "select * from v_virtual_table_data "; + $sql .= "where domain_uuid = '".$domain_uuid."' "; + if (strlen($search_all) == 0) { + $sql .= "and virtual_table_uuid = '$virtual_table_uuid' "; + if (strlen($virtual_data_parent_row_uuid) > 0) { + $sql .= " and virtual_data_parent_row_uuid = '$virtual_data_parent_row_uuid' "; + } + } + else { + $sql .= "and virtual_data_row_uuid in ("; + $sql .= "select virtual_data_row_uuid from v_virtual_table_data \n"; + $sql .= "where domain_uuid = '".$domain_uuid."' "; + $sql .= "and virtual_table_uuid = '$virtual_table_uuid' "; + if (strlen($virtual_data_parent_row_uuid) > 0) { + $sql .= " and virtual_data_parent_row_uuid = '$virtual_data_parent_row_uuid' "; + } + else { + //$sql .= "and virtual_data_field_value like '%$search_all%' )\n"; + $tmp_digits = preg_replace('{\D}', '', $search_all); + if (is_numeric($tmp_digits) && strlen($tmp_digits) > 5) { + if (strlen($tmp_digits) == '11' ) { + $sql .= "and virtual_data_field_value like '%".substr($tmp_digits, -10)."%' )\n"; + } + else { + $sql .= "and virtual_data_field_value like '%$tmp_digits%' )\n"; + } + } + else { + $sql .= "and virtual_data_field_value like '%$search_all%' )\n"; + } + } + } + $sql .= "order by virtual_data_row_uuid asc "; + + $row_id = ''; + $row_id_found = false; + $next_row_id_found = false; + $prep_statement = $db->prepare($sql); + $prep_statement->execute(); + $x=0; + while($row = $prep_statement->fetch()) { + //set the last last row id + if ($x==0) { + if (strlen($virtual_data_row_uuid) == 0) { + $virtual_data_row_uuid = $row['virtual_data_row_uuid']; + } + $first_virtual_data_row_uuid = $row['virtual_data_row_uuid']; + } + //get the data for the specific row id + if ($virtual_data_row_uuid == $row['virtual_data_row_uuid']) { + //set the data and save it to an array + $data_row[$row['virtual_field_name']] = $row['virtual_data_field_value']; + //set the previous row id + if ($previous_row_id != $row['virtual_data_row_uuid']) { + $previous_virtual_data_row_uuid = $previous_row_id; + $row_id_found = true; + } + } + //detect a new row id + if ($previous_row_id != $row['virtual_data_row_uuid']) { + if ($row_id_found) { + if (!$next_row_id_found) { + //make sure it is not the current row id + if ($virtual_data_row_uuid != $row['virtual_data_row_uuid']) { + $next_virtual_data_row_uuid = $row['virtual_data_row_uuid']; + $next_row_id_found = true; + } + } + } + + //set the last last row id + $last_virtual_data_row_uuid = $row['virtual_data_row_uuid']; + + //set the temporary previous row id + $previous_row_id = $row['virtual_data_row_uuid']; + + //set the record number array + $record_number_array[$row['virtual_data_row_uuid']] = $x+1; + + $x++; + } + } + + //save the total number of records + $total_records = $x; + + //set record number + if (strlen($_GET["n"]) == 0) { + $n = 1; + } + else { + $n = $_GET["n"]; + } + unset($sql, $prep_statement, $row); + } + +//use this when the calendar is needed + //echo "\n"; + //echo "\n"; + //echo ""; + +//begin creating the content + echo "
"; + +//get the title and description of the virtual table + echo "
\n"; +//echo "
"; + +echo "\n"; +echo " \n"; +echo "\n"; +echo "
Files
\n"; //display:none +//echo "
Files
\n"; //display:none + +echo recur_dir($_SESSION['switch']['scripts']['dir']); + +echo "
\n"; + +echo "
\n"; +echo ""; + +echo "

"; +require_once "footer.php"; + +unset ($result_count); +unset ($result); +unset ($key); +unset ($val); +unset ($c); + +echo ""; +echo ""; + +?> \ No newline at end of file diff --git a/app/script_edit/filenew.php b/app/script_edit/filenew.php new file mode 100644 index 0000000000..3dfd2a69fc --- /dev/null +++ b/app/script_edit/filenew.php @@ -0,0 +1,88 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('script_editor_save')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +$folder = $_GET["folder"]; +$folder = str_replace ("\\", "/", $folder); +if (substr($folder, -1) != "/") { $folder = $folder.'/'; } +$file = $_GET["file"]; + +if (strlen($folder) > 0 && strlen($file) > 0) { + //create new file + $handle = fopen($folder.$file, 'wb') or die("Error!!"); + $content = ""; + fwrite($handle, $content); + fclose($handle); + header("Location: fileoptions.php"); +} +else { + require_once "header.php"; + echo "
"; + echo "
"; + echo "
"; + echo ""; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo "
Path:
".$folder.$file."
"; + + echo "
"; + + echo ""; + echo " "; + echo " "; + echo " "; + + echo " "; + echo " "; + echo " "; + + echo " "; + echo " "; + echo " "; + echo "
File Name:
"; + echo " "; + echo " "; + echo "
"; + echo "
"; + echo "
"; + + require_once "footer.php"; +} + +?> \ No newline at end of file diff --git a/app/script_edit/fileoptions.php b/app/script_edit/fileoptions.php new file mode 100644 index 0000000000..78b54ec3a5 --- /dev/null +++ b/app/script_edit/fileoptions.php @@ -0,0 +1,85 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('script_editor_view')) { + //access granted +} +else { + echo "access denied"; + exit; +} +require_once "header.php"; + +$file = $_GET["file"]; +$file = str_replace ("\\", "/", $file); +$folder = $_GET["folder"]; +$folder = str_replace ($file, "", $folder); +$urlpath = str_replace ($_SERVER["DOCUMENT_ROOT"], "", $folder); + +echo "
"; +echo "\n"; +echo ""; +echo "\n"; +echo "\n"; + +echo "\n"; +echo "\n"; +echo "\n"; +echo "\n"; +echo "
"; + +echo ""; +echo ""; +echo "\n"; +echo "\n"; +echo ""; +echo "
Path:
File:
"; + +echo "
"; +echo " "; +echo ""; + +echo "
"; +echo ""; +echo " \n"; +echo " \n"; +echo " \n"; +echo " \n"; +echo " \n"; +echo " \n"; +echo " \n"; +echo "





"; +echo "
"; + +echo "
"; +echo "
"; + +require_once "footer.php"; +?> \ No newline at end of file diff --git a/app/script_edit/fileoptionslist.php b/app/script_edit/fileoptionslist.php new file mode 100644 index 0000000000..7f4938d8c5 --- /dev/null +++ b/app/script_edit/fileoptionslist.php @@ -0,0 +1,246 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('script_editor_view')) { + //access granted +} +else { + echo "access denied"; + exit; +} +require_once "header.php"; + +function isfile($filename) { + if (@filesize($filename) > 0) { return true; } else { return false; } +} + +function space($count) { + $r=''; $i=0; + while($i < $count) { + $r .= ' '; + $i++; + } + return $r; +} + +function recur_dir($dir) { + clearstatcache(); + $htmldirlist = ''; + $htmlfilelist = ''; + $dirlist = opendir($dir); + while ($file = readdir ($dirlist)) { + if ($file != '.' && $file != '..') { + $newpath = $dir.'/'.$file; + $level = explode('/',$newpath); + + if (is_dir($newpath)) { + /*$mod_array[] = array( + 'level'=>count($level)-1, + 'path'=>$newpath, + 'name'=>end($level), + 'type'=>'dir', + 'mod_time'=>filemtime($newpath), + 'size'=>''); + $mod_array[] = recur_dir($newpath); + */ + $dirname = end($level); + $htmldirlist .= space(count($level))."
$dirname
\n"; + //$htmldirlist .= space(count($level))."
Tools
\n"; + //$htmldirlist .= space(count($level))."
New Folder
\n"; //parent.document.getElementById('file').value='".urlencode($newpath)."' + //$htmldirlist .= space(count($level))."
\n"; + //$htmldirlist .= space(count($level))."
New File
\n"; //parent.document.getElementById('file').value='".urlencode($newpath)."' + //$htmldirlist .= space(count($level))."
\n"; + //$htmldirlist .= space(count($level))."
\n"; + //$htmldirlist .= space(count($level))."
Options
\n"; //parent.document.getElementById('file').value='".urlencode($newpath)."' + //$htmldirlist .= space(count($level))."
\n"; + $htmldirlist .= recur_dir($newpath); + $htmldirlist .= space(count($level))."
\n"; + } + else { + /*$mod_array[] = array( + 'level'=>count($level)-1, + 'path'=>$newpath, + 'name'=>end($level), + 'type'=>'file', + 'mod_time'=>filemtime($newpath), + 'size'=>filesize($newpath)); + */ + $filename = end($level); + $filesize = round(filesize($newpath)/1024, 2); + $newpath = str_replace ($filename, "", $newpath); + $htmlfilelist .= space(count($level))."
$filename
\n"; + $htmlfilelist .= space(count($level))."
\n"; + } + } + } + + closedir($dirlist); + return $htmldirlist ."\n". $htmlfilelist; +} + +echo "\n"; + +echo "\n"; + +echo "
"; +echo "\n"; + +echo "\n"; +echo "
\n"; +echo "\n"; +echo " \n"; +echo "\n"; +echo "
Files
\n"; //display:none +//echo "
Files
\n"; //display:none + +//echo "
Tools
\n"; +//echo "
New Folder
\n"; //parent.document.getElementById('file').value='".urlencode($newpath)."' +//echo "
\n"; +//echo "
New File
\n"; //parent.document.getElementById('file').value='".urlencode($newpath)."' +//echo "
\n"; +//echo "
\n"; + +echo recur_dir($_SESSION['switch']['scripts']['dir']); + +echo "
\n"; + + +echo "
\n"; +echo ""; + +echo "

"; +require_once "footer.php"; + +unset ($result_count); +unset ($result); +unset ($key); +unset ($val); +unset ($c); + +echo ""; +echo ""; + +?> \ No newline at end of file diff --git a/app/script_edit/fileread.php b/app/script_edit/fileread.php new file mode 100644 index 0000000000..907c9ec087 --- /dev/null +++ b/app/script_edit/fileread.php @@ -0,0 +1,49 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('script_editor_view')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +$filename = $_POST["file"]; +$filename = str_replace ("\\", "/", $filename); + +$handle = fopen($filename, "r"); +if ($handle) { + while (!feof($handle)) { + $buffer = fgets($handle, 4096); + echo $buffer; + } + fclose($handle); +} + +?> \ No newline at end of file diff --git a/app/script_edit/filerename.php b/app/script_edit/filerename.php new file mode 100644 index 0000000000..8a6bc58ddf --- /dev/null +++ b/app/script_edit/filerename.php @@ -0,0 +1,102 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('script_editor_save')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +$folder = $_GET["folder"]; +//$folder = str_replace ("\\", "/", $folder); +//if (substr($folder, -1) != "/") { $folder = $folder.'/'; } +$newfilename = $_GET["newfilename"]; +$filename = $_GET["filename"]; +//echo $folder.$file; + + +if (strlen($folder) > 0 && strlen($newfilename) > 0) { + //echo "new file: ".$newfilename."
"; + //echo "folder: ".$folder."
"; + //echo "orig filename: ".$filename."
";; + rename($folder.$filename, $folder.$newfilename); + header("Location: fileoptions.php"); +} +else { //display form + + require_once "header.php"; + echo "
"; + echo "
"; + echo "
"; + echo ""; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo "
Path:
".$folder.$filename."

Original file name:
".$filename."
"; + + echo "
"; + + echo ""; + echo " "; + echo " "; + echo " "; + + echo " "; + echo " "; + echo " "; + + echo " "; + echo " "; + echo " "; + echo "
Rename file to:
"; + echo " "; + echo " "; + echo " "; + echo "
"; + echo "
"; + echo "
"; + + require_once "footer.php"; + +} + +?> \ No newline at end of file diff --git a/app/script_edit/filesave.php b/app/script_edit/filesave.php new file mode 100644 index 0000000000..4d1c007bd2 --- /dev/null +++ b/app/script_edit/filesave.php @@ -0,0 +1,50 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('script_editor_save')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +$filename = $_POST["file"]; //filename with the path +$filename = str_replace ("\\", "/", $filename); +$content = $_POST["content"]; + +$handle = fopen($filename, 'wb') or die("Error!!"); +fwrite($handle, $content); +fclose($handle); + +//set the reload_xml value to true + $_SESSION["reload_xml"] = true; + +echo $content; + +?> \ No newline at end of file diff --git a/app/script_edit/folderdelete.php b/app/script_edit/folderdelete.php new file mode 100644 index 0000000000..62c669cddd --- /dev/null +++ b/app/script_edit/folderdelete.php @@ -0,0 +1,46 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('script_editor_save')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +$folder = $_GET["folder"]; +$folder = str_replace ("\\", "/", $folder); + +if (strlen($folder) > 0) { + //delete the folder + rmdir($folder); //, 0700 + header("Location: fileoptions.php"); +} + +?> \ No newline at end of file diff --git a/app/script_edit/foldernew.php b/app/script_edit/foldernew.php new file mode 100644 index 0000000000..336b9d3633 --- /dev/null +++ b/app/script_edit/foldernew.php @@ -0,0 +1,83 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('script_editor_save')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +$folder = $_GET["folder"]; +$folder = str_replace ("\\", "/", $folder); +$foldername = $_GET["foldername"]; + +if (strlen($folder) > 0 && strlen($foldername) > 0) { + //create new folder + mkdir($folder.'/'.$foldername); //, 0700 + header("Location: fileoptions.php"); +} +else { //display form + require_once "header.php"; + echo "
"; + echo "
"; + echo "
"; + echo ""; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo "
Path:
".$folder."
"; + + echo "
"; + + echo ""; + echo " "; + echo " "; + echo " "; + + echo " "; + echo " "; + echo " "; + + echo " "; + echo " "; + echo " "; + echo "
Folder Name:
"; + echo " "; + echo " "; + echo "
"; + echo "
"; + echo "
"; + + require_once "footer.php"; +} +?> \ No newline at end of file diff --git a/app/script_edit/footer.php b/app/script_edit/footer.php new file mode 100644 index 0000000000..b11f46e5d4 --- /dev/null +++ b/app/script_edit/footer.php @@ -0,0 +1,43 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +/* +echo "

"; +echo "
"; + +echo ""; +echo "fusionpbx "; +echo "        "; +echo "http://fusionpbx.com"; +echo "        "; +echo "Author: Mark J. Crane "; + +echo ""; +*/ +echo "
"; +echo ""; +echo ""; + +?> \ No newline at end of file diff --git a/app/script_edit/header.php b/app/script_edit/header.php new file mode 100644 index 0000000000..bd10f557d3 --- /dev/null +++ b/app/script_edit/header.php @@ -0,0 +1,83 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ + +echo ""; +echo ""; +echo ""; +//echo ""; +echo ""; + + +echo ""; +echo ""; +echo ""; +echo "
"; + +?> \ No newline at end of file diff --git a/app/script_edit/images/Thumbs.db b/app/script_edit/images/Thumbs.db new file mode 100644 index 0000000000000000000000000000000000000000..46593a8c2e513a420f7803451a0bd7d6795fb2c2 GIT binary patch literal 20992 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 literal 0 HcmV?d00001 diff --git a/app/script_edit/images/file.png b/app/script_edit/images/file.png new file mode 100644 index 0000000000000000000000000000000000000000..33b5f5f37461bbc6045d4cef96ba2125c4e9b256 GIT binary patch literal 434 zcmV;j0ZsmiP)uaf2v`Q{?Wj` zolMeZbD4;Gy{&Gi?KsW?6A=+P>>rC&Ve~E{qfvNqd3|^Pkfv!4vHfruMrKEGOhj6{ zn_bUwmWIQdEXxds>m6(DZmh382QNVo6a+P$Ywe0qk|c$u$H}zBJ2^ckA^;3LKKZ*l z+XX@VQ5JOCErwY*ySgpM8jjO~jnx&U*c5>2SLGkxECHC6Vpc|?m|>$c!E5q4r=u}r zE2R`O04&g4@I8-NF$0|2VP+ex`~v`h82}qY)s(ryH%a1`;Ul8G{e!$y4XKR!PG|DpT-{reY}_-t#}`2YX^``4}iKh2doeVSihwfuk8^5y;O**UyG^BIO3Q2fclD#GBxpaXI^C{7sImo>OF zHMg|3wRd#3DhUeev+}5P2+FHWljakc)G8>WAthy_VybSmj8oQ3Mo>X_ovxa}v}q#F z!pwq<3QYEz`}Rq&8HtN4YqDGDZ9c6c#_c4hsU_&J;Mz4SULgki%jQzL){h=D8sEOF zX|C&N_4XadGX^6qHdQP3A3r6vO@wql8+oM!IBrPjWBVJ?B2l=o-C15hyJE%(B{oJr Sel>v`CpJEIV{K$$um%8JN5t*` literal 0 HcmV?d00001 diff --git a/app/script_edit/images/gear.png b/app/script_edit/images/gear.png new file mode 100644 index 0000000000000000000000000000000000000000..1adf1e778f6316dd9c926465783631b6222f9bc6 GIT binary patch literal 822 zcmV-61Ihe}P)eo} zK~#9!)so9=6j>O>&#kJis;+*et4$>x6Dtvwi6-j82co!91Q*$)vk`ftifVKj7JYhr@yM@dJK) zv0se~7yeYbw|1p;L$^w$(!8o_a9!7qIj@hr8(HeV_?KLr*H$08VKBFST}Ml?<& z2ZE*gIRf$4wXGMUC>pBPs<#q)Vw^{u{`V?`*6Mhs{v77x=(lo(?yozAr1zyF}u_x-oS z!$adYu3wWH0PNep-)eN6BW}BUCTS*N8fFU*IpR1b0+_0*OxKOJjT<(dT@FJSoGXW2BC+Oau#;gW$(}rOcxczVAPonw+WufC>Pf=ZS1K_wD=l z`S*UM^2uplyVB^xn;&Len@O6Cbt`LH6+_d>5=dqefrRVz2pLI4W)`pa1{>07*qoM6N<$f$y4XKR!PG|DpT-{reY}_-t#}`2YX^``4}iKh2doeVSihwfuk8^5y;O**UyG^BIO3Q2fclD#GBxpaXI^C{7sImo>OF zHMg|3wRd#3DhUeev+}5P2+FHWljakc)G8>WAthy_VybSmj8oQ3Mo>X_ovxa}v}q#F z!pwq<3QYEz`}Rq&8HtN4YqDGDZ9c6c#_c4hsU_&J;Mz4SULgki%jQzL){h=D8sEOF zX|C&N_4XadGX^6qHdQP3A3r6vO@wql8+oM!IBrPjWBVJ?B2l=o-C15hyJE%(B{oJr Sel>v`CpJEIV{K$$um%8JN5t*` literal 0 HcmV?d00001 diff --git a/app/script_edit/images/minus.gif b/app/script_edit/images/minus.gif new file mode 100644 index 0000000000000000000000000000000000000000..1094ab912b8bb9b8e457364e0a200b2364ab03fb GIT binary patch literal 124 zcmV-?0E7QWNk%w1VF>^U0J8u9!nvt_oVfS)^njkZ?Ca(K|Nqa(yZ!z9+SSVd008mv z?6}C+OEI5}ij{m|i2qdX6 eqL8fXBPt3ZGliKs5{uIv@gM1_O&;L91u8iN$P#Df)7TJT8#}oW??~ hx9yTADX<=5Q2xxo`aq_+!TExQ8Ot=TR6#}tYXC82HyZ!| literal 0 HcmV?d00001 diff --git a/app/script_edit/images/program.gif b/app/script_edit/images/program.gif new file mode 100644 index 0000000000000000000000000000000000000000..dc3dfa11044671bd33ce9778d7a10254fe748f00 GIT binary patch literal 61 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 literal 0 HcmV?d00001 diff --git a/app/script_edit/images/thumbnails/cliplibrary.png b/app/script_edit/images/thumbnails/cliplibrary.png new file mode 100644 index 0000000000000000000000000000000000000000..bc70f332fd4c8d15111d9a5fc1d66d0ea165b724 GIT binary patch literal 20544 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

$J8swmWDRg_n-OvxL>-lX%W==<7{8 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%0D7Ft}=jT|(_b=-2O+!;TxGQVlvad4Znn2q2 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 + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('script_editor_view')) { + //access granted +} +else { + echo "access denied"; + exit; +} +echo "\n"; +echo "\n"; +echo " \n"; +echo " "; + + echo "\n"; + + echo ""; + ?> + + + + + + + + +
+ + + + \n"; + echo "\n"; + } + else { + echo "\n"; + } + ?> + +
+ + \ No newline at end of file diff --git a/app/script_edit/list.php b/app/script_edit/list.php new file mode 100644 index 0000000000..5eb76b8cfe --- /dev/null +++ b/app/script_edit/list.php @@ -0,0 +1,107 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/checkauth.php"; +if (permission_exists('script_editor_view')) { + //access granted +} +else { + echo "access denied"; + exit; +} +require_once "admin/edit/header.php"; +echo "

"; +echo "\n"; +echo "\n"; +echo " \n"; + echo "\n"; +} //end if results +echo "
\n"; +echo "
"; + +$sql = "select * from v_clips "; +$prep_statement = $db->prepare(check_sql($sql)); +$prep_statement->execute(); +$result = $prep_statement->fetchAll(PDO::FETCH_NAMED); +$result_count = count($result); + +$c = 0; +$row_style["0"] = "background-color: #F5F5DC;"; +$row_style["1"] = "background-color: #FFFFFF;"; + +echo "
\n"; +echo "\n"; +echo ""; + +if ($result_count == 0) { //no results + echo ""; +} +else { //received results + echo ""; + echo ""; + //echo ""; + //echo ""; + //echo ""; + //echo ""; + //echo ""; + echo ""; + echo "\n"; + + foreach($result as $row) { + echo "\n"; + //echo ""; + echo ""; + //echo ""; + //echo ""; + //echo ""; + //echo ""; + //echo ""; + echo ""; + + echo "\n"; + if ($c==0) { $c=1; } else { $c=0; } + } //end foreach unset($sql, $result, $row_count); + echo "
 
    clip name      clip_folder        clip_text_start        clip_text_end        clip_desc        clip_order   
".$row['clip_uuid']."".$row['clip_name']."".$row[clip_folder]."".$row[clip_text_start]."".$row[clip_text_end]."".$row[clip_desc]."".$row[clip_order]."
\n"; + echo "
\n"; + + echo "
\n"; + +echo "
\n"; +echo "   \n"; +echo "   \n"; +echo "
\n"; +echo ""; + +echo "

"; +require_once "admin/edit/footer.php"; + +unset ($result_count); +unset ($result); +unset ($key); +unset ($val); +unset ($c); + +?> \ No newline at end of file diff --git a/app/script_edit/readme.txt b/app/script_edit/readme.txt new file mode 100644 index 0000000000..cafc4144ae --- /dev/null +++ b/app/script_edit/readme.txt @@ -0,0 +1,7 @@ +Notes + +IFrame +http://www.quirksmode.org/js/iframe.html + +Tree View +http://www.dddekerf.dds.nl/DHTML_Treeview/DHTML_Treeview.htm \ No newline at end of file diff --git a/app/script_edit/root.php b/app/script_edit/root.php new file mode 100644 index 0000000000..7b882438ea --- /dev/null +++ b/app/script_edit/root.php @@ -0,0 +1,50 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ + +// make sure the PATH_SEPARATOR is defined + if (!defined("PATH_SEPARATOR")) { + if ( strpos( $_ENV[ "OS" ], "Win" ) !== false ) { define("PATH_SEPARATOR", ";"); } else { define("PATH_SEPARATOR", ":"); } + } + +// make sure the document_root is set + $_SERVER["SCRIPT_FILENAME"] = str_replace("\\", "/", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = str_replace($_SERVER["PHP_SELF"], "", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = realpath($_SERVER["DOCUMENT_ROOT"]); + //echo "DOCUMENT_ROOT: ".$_SERVER["DOCUMENT_ROOT"]."
\n"; + //echo "PHP_SELF: ".$_SERVER["PHP_SELF"]."
\n"; + //echo "SCRIPT_FILENAME: ".$_SERVER["SCRIPT_FILENAME"]."
\n"; + +// if the project directory exists then add it to the include path otherwise add the document root to the include path + if (is_dir($_SERVER["DOCUMENT_ROOT"].'/fusionpbx')){ + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', '/fusionpbx'); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER["DOCUMENT_ROOT"].'/fusionpbx' ); + } + else { + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', ''); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER['DOCUMENT_ROOT'] ); + } + +?> \ No newline at end of file diff --git a/app/services/app_config.php b/app/services/app_config.php new file mode 100644 index 0000000000..119fe75702 --- /dev/null +++ b/app/services/app_config.php @@ -0,0 +1,101 @@ + \ No newline at end of file diff --git a/app/services/root.php b/app/services/root.php new file mode 100644 index 0000000000..7b882438ea --- /dev/null +++ b/app/services/root.php @@ -0,0 +1,50 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ + +// make sure the PATH_SEPARATOR is defined + if (!defined("PATH_SEPARATOR")) { + if ( strpos( $_ENV[ "OS" ], "Win" ) !== false ) { define("PATH_SEPARATOR", ";"); } else { define("PATH_SEPARATOR", ":"); } + } + +// make sure the document_root is set + $_SERVER["SCRIPT_FILENAME"] = str_replace("\\", "/", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = str_replace($_SERVER["PHP_SELF"], "", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = realpath($_SERVER["DOCUMENT_ROOT"]); + //echo "DOCUMENT_ROOT: ".$_SERVER["DOCUMENT_ROOT"]."
\n"; + //echo "PHP_SELF: ".$_SERVER["PHP_SELF"]."
\n"; + //echo "SCRIPT_FILENAME: ".$_SERVER["SCRIPT_FILENAME"]."
\n"; + +// if the project directory exists then add it to the include path otherwise add the document root to the include path + if (is_dir($_SERVER["DOCUMENT_ROOT"].'/fusionpbx')){ + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', '/fusionpbx'); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER["DOCUMENT_ROOT"].'/fusionpbx' ); + } + else { + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', ''); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER['DOCUMENT_ROOT'] ); + } + +?> \ No newline at end of file diff --git a/app/services/v_services.php b/app/services/v_services.php new file mode 100644 index 0000000000..08f2f0cdf2 --- /dev/null +++ b/app/services/v_services.php @@ -0,0 +1,222 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require_once "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('services_view')) { + //access granted +} +else { + echo "access denied"; + exit; +} +require_once "includes/header.php"; +require_once "includes/paging.php"; + +$order_by = $_GET["order_by"]; +$order = $_GET["order"]; + +if (strlen($_GET["a"]) > 0) { + $service_uuid = $_GET["id"]; + $sql = ""; + $sql .= "select * from v_services "; + $sql .= "where service_uuid = '$service_uuid' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach ($result as &$row) { + $domain_uuid = $row["domain_uuid"]; + $service_name = $row["service_name"]; + $service_type = $row["service_type"]; + $service_data = $row["service_data"]; + $service_cmd_start = $row["service_cmd_start"]; + $service_cmd_stop = $row["service_cmd_stop"]; + $service_description = $row["service_description"]; + break; //limit to 1 row + } + unset ($prep_statement); + + if ($_GET["a"] == "stop") { + $msg = 'Service: '.$service_name. ' stopping. '; + shell_exec($service_cmd_stop); + } + if ($_GET["a"] == "start") { + $msg = 'Service: '.$service_name. ' starting. '; + shell_exec($service_cmd_start); + } + + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo $msg."\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; +} + +//check if a process is running + function is_process_running($pid) { + $status = shell_exec( 'ps -p ' . $pid ); + $status_array = explode ("\n", $status); + if (strlen(trim($status_array[1])) > 0) { + return true; + } + else { + return false; + } + } + + echo "
"; + echo "
\n"; + echo "\n"; + echo " "; + echo ""; + echo "
\n"; + echo "
"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "
Services 
\n"; + echo "Shows a list of processes, the status of the process and provides control to start and stop the process.

\n"; + echo "
\n"; + + $sql = ""; + $sql .= " select * from v_services "; + if (strlen($order_by)> 0) { $sql .= "order by $order_by $order "; } + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + $num_rows = count($result); + unset ($prep_statement, $result, $sql); + $rows_per_page = 10; + $param = ""; + $page = $_GET['page']; + if (strlen($page) == 0) { $page = 0; $_GET['page'] = 0; } + list($paging_controls, $rows_per_page, $var_3) = paging($num_rows, $param, $rows_per_page); + $offset = $rows_per_page * $page; + + $sql = ""; + $sql .= " select * from v_services "; + if (strlen($order_by)> 0) { $sql .= "order by $order_by $order "; } + $sql .= " limit $rows_per_page offset $offset "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + $result_count = count($result); + unset ($prep_statement, $sql); + + $c = 0; + $row_style["0"] = "row_style0"; + $row_style["1"] = "row_style1"; + + echo "
\n"; + echo "\n"; + echo "\n"; + echo th_order_by('service_name', 'Name', $order_by, $order); + echo th_order_by('service_description', 'Description', $order_by, $order); + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + if ($result_count == 0) { + //no results + } + else { //received results + foreach($result as $row) { + echo "\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "\n"; + if ($c==0) { $c=1; } else { $c=0; } + } //end foreach + unset($sql, $result, $row_count); + } //end if results + + echo "\n"; + echo "\n"; + echo "\n"; + + echo "
StatusAction\n"; + if (permission_exists('services_add')) { + echo " $v_link_label_add\n"; + } + echo "
".$row[service_name]."".$row[service_description]."\n"; + $pid = file_get_contents($row[service_data]); + if (is_process_running($pid)) { + echo "Running"; + } + else { + echo "Stopped"; + } + echo "\n"; + if (is_process_running($pid)) { + echo " Stop"; + } + else { + echo " Start"; + } + echo "\n"; + if (permission_exists('services_edit')) { + echo " $v_link_label_edit\n"; + } + if (permission_exists('services_delete')) { + echo " $v_link_label_delete\n"; + } + echo "
\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "
 $paging_controls\n"; + if (permission_exists('services_add')) { + echo " $v_link_label_add\n"; + } + echo "
\n"; + echo "
"; + echo "
"; + echo "

"; + echo "

"; + + echo "
"; + echo "
"; + echo "

"; + +//include the footer + require_once "includes/footer.php"; + +?> \ No newline at end of file diff --git a/app/services/v_services_delete.php b/app/services/v_services_delete.php new file mode 100644 index 0000000000..6ca5d4ff20 --- /dev/null +++ b/app/services/v_services_delete.php @@ -0,0 +1,60 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require_once "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('services_delete')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +if (count($_GET)>0) { + $id = check_str($_GET["id"]); +} + +//delete the data + if (strlen($id)>0) { + $sql = ""; + $sql .= "delete from v_services "; + $sql .= "where service_uuid = '$id' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + unset($sql); + } + +//redirect the user + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Delete Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + +?> \ No newline at end of file diff --git a/app/services/v_services_edit.php b/app/services/v_services_edit.php new file mode 100644 index 0000000000..ae44238da8 --- /dev/null +++ b/app/services/v_services_edit.php @@ -0,0 +1,294 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require_once "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('services_add') || permission_exists('services_edit')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +//action add or update + if (isset($_REQUEST["id"])) { + $action = "update"; + $service_uuid = check_str($_REQUEST["id"]); + } + else { + $action = "add"; + } + +//get http post and set it to php variables + if (count($_POST)>0) { + $service_name = check_str($_POST["service_name"]); + $service_type = check_str($_POST["service_type"]); + $service_data = check_str($_POST["service_data"]); + $service_cmd_start = check_str($_POST["service_cmd_start"]); + $service_cmd_stop = check_str($_POST["service_cmd_stop"]); + $service_description = check_str($_POST["service_description"]); + } + +if (count($_POST)>0 && strlen($_POST["persistformvar"]) == 0) { + + $msg = ''; + if ($action == "update") { + $service_uuid = check_str($_POST["service_uuid"]); + } + + //check for all required data + //if (strlen($domain_uuid) == 0) { $msg .= "Please provide: domain_uuid
\n"; } + if (strlen($service_name) == 0) { $msg .= "Please provide: Name
\n"; } + //if (strlen($service_type) == 0) { $msg .= "Please provide: Type
\n"; } + //if (strlen($service_data) == 0) { $msg .= "Please provide: Data
\n"; } + //if (strlen($service_cmd_start) == 0) { $msg .= "Please provide: Start Command
\n"; } + //if (strlen($service_cmd_stop) == 0) { $msg .= "Please provide: Stop Command
\n"; } + //if (strlen($service_description) == 0) { $msg .= "Please provide: Description
\n"; } + if (strlen($msg) > 0 && strlen($_POST["persistformvar"]) == 0) { + require_once "includes/header.php"; + require_once "includes/persistformvar.php"; + echo "
\n"; + echo "
\n"; + echo $msg."
"; + echo "
\n"; + persistformvar($_POST); + echo "
\n"; + require_once "includes/footer.php"; + return; + } + + //add or update the database + if ($_POST["persistformvar"] != "true") { + if ($action == "add" && permission_exists('services_add')) { + $service_uuid = uuid(); + $sql = "insert into v_services "; + $sql .= "("; + $sql .= "domain_uuid, "; + $sql .= "service_uuid, "; + $sql .= "service_name, "; + $sql .= "service_type, "; + $sql .= "service_data, "; + $sql .= "service_cmd_start, "; + $sql .= "service_cmd_stop, "; + $sql .= "service_description "; + $sql .= ")"; + $sql .= "values "; + $sql .= "("; + $sql .= "'$domain_uuid', "; + $sql .= "'$service_uuid', "; + $sql .= "'$service_name', "; + $sql .= "'$service_type', "; + $sql .= "'$service_data', "; + $sql .= "'$service_cmd_start', "; + $sql .= "'$service_cmd_stop', "; + $sql .= "'$service_description' "; + $sql .= ")"; + $db->exec(check_sql($sql)); + unset($sql); + + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Add Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + } //if ($action == "add") + + if ($action == "update" && permission_exists('services_edit')) { + $sql = "update v_services set "; + $sql .= "service_name = '$service_name', "; + $sql .= "service_type = '$service_type', "; + $sql .= "service_data = '$service_data', "; + $sql .= "service_cmd_start = '$service_cmd_start', "; + $sql .= "service_cmd_stop = '$service_cmd_stop', "; + $sql .= "service_description = '$service_description' "; + $sql .= "where domain_uuid = '$domain_uuid'"; + $sql .= "and service_uuid = '$service_uuid'"; + $db->exec(check_sql($sql)); + unset($sql); + + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Update Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + } //if ($action == "update") + } //if ($_POST["persistformvar"] != "true") +} //(count($_POST)>0 && strlen($_POST["persistformvar"]) == 0) + +//pre-populate the form + if (count($_GET)>0 && $_POST["persistformvar"] != "true") { + $service_uuid = $_GET["id"]; + $sql = ""; + $sql .= "select * from v_services "; + $sql .= "where service_uuid = '$service_uuid' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach ($result as &$row) { + $domain_uuid = $row["domain_uuid"]; + $service_name = $row["service_name"]; + $service_type = $row["service_type"]; + $service_data = $row["service_data"]; + $service_cmd_start = $row["service_cmd_start"]; + $service_cmd_stop = $row["service_cmd_stop"]; + $service_description = $row["service_description"]; + break; //limit to 1 row + } + unset ($prep_statement); + } + +//show the header + require_once "includes/header.php"; + +//begin the content + echo "
"; + echo "\n"; + echo "\n"; + echo " "; + echo " "; + echo "
\n"; + echo "
"; + + echo "
\n"; + echo "
\n"; + echo "\n"; + echo "\n"; + if ($action == "add") { + echo "\n"; + } + if ($action == "update") { + echo "\n"; + } + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo " \n"; + echo " \n"; + echo " "; + echo "
Service AddService Edit
\n"; + echo "Shows a list of processes and provides ability to start and stop them.

\n"; + echo "
\n"; + echo " Name:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the service name.\n"; + echo "
\n"; + echo " Type:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Select the service type.\n"; + echo "
\n"; + echo " Data:\n"; + echo "\n"; + echo " \n"; + //echo " \n"; + echo "
\n"; + echo "Enter the service data.\n"; + echo "
\n"; + echo " Start Command:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the command to start the service.\n"; + echo "
\n"; + echo " Stop Command:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the command to stop the service.\n"; + echo "
\n"; + echo " Description:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the service description.\n"; + echo "
\n"; + if ($action == "update") { + echo " \n"; + } + echo " \n"; + echo "
"; + echo ""; + + echo "
"; + echo "
"; + +//show the footer + require_once "includes/footer.php"; +?> \ No newline at end of file diff --git a/app/settings/app_config.php b/app/settings/app_config.php new file mode 100644 index 0000000000..f224a83909 --- /dev/null +++ b/app/settings/app_config.php @@ -0,0 +1,123 @@ + \ No newline at end of file diff --git a/app/settings/root.php b/app/settings/root.php new file mode 100644 index 0000000000..7b882438ea --- /dev/null +++ b/app/settings/root.php @@ -0,0 +1,50 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ + +// make sure the PATH_SEPARATOR is defined + if (!defined("PATH_SEPARATOR")) { + if ( strpos( $_ENV[ "OS" ], "Win" ) !== false ) { define("PATH_SEPARATOR", ";"); } else { define("PATH_SEPARATOR", ":"); } + } + +// make sure the document_root is set + $_SERVER["SCRIPT_FILENAME"] = str_replace("\\", "/", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = str_replace($_SERVER["PHP_SELF"], "", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = realpath($_SERVER["DOCUMENT_ROOT"]); + //echo "DOCUMENT_ROOT: ".$_SERVER["DOCUMENT_ROOT"]."
\n"; + //echo "PHP_SELF: ".$_SERVER["PHP_SELF"]."
\n"; + //echo "SCRIPT_FILENAME: ".$_SERVER["SCRIPT_FILENAME"]."
\n"; + +// if the project directory exists then add it to the include path otherwise add the document root to the include path + if (is_dir($_SERVER["DOCUMENT_ROOT"].'/fusionpbx')){ + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', '/fusionpbx'); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER["DOCUMENT_ROOT"].'/fusionpbx' ); + } + else { + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', ''); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER['DOCUMENT_ROOT'] ); + } + +?> \ No newline at end of file diff --git a/app/settings/v_settings_edit.php b/app/settings/v_settings_edit.php new file mode 100644 index 0000000000..311d77950b --- /dev/null +++ b/app/settings/v_settings_edit.php @@ -0,0 +1,523 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('settings_view') || if_group("superadmin")) { + //access granted +} +else { + echo "access denied"; + exit; +} + +//get the number of rows in v_extensions + $sql = ""; + $sql .= " select count(*) as num_rows from v_settings "; + $prep_statement = $db->prepare(check_sql($sql)); + $num_rows = 0; + if ($prep_statement) { + $prep_statement->execute(); + $row = $prep_statement->fetch(PDO::FETCH_ASSOC); + if ($row['num_rows'] > 0) { + $num_rows = $row['num_rows']; + } + else { + $num_rows = 0; + } + } + unset($prep_statement, $result); + +//set the action + if ($num_rows == 0) { + $action = "add"; + } + else { + $action = "update"; + } + +//get the http values and set them as php variables + if (count($_POST)>0) { + $numbering_plan = check_str($_POST["numbering_plan"]); + $default_gateway = check_str($_POST["default_gateway"]); + $event_socket_ip_address = check_str($_POST["event_socket_ip_address"]); + if (strlen($event_socket_ip_address) == 0) { $event_socket_ip_address = '127.0.0.1'; } + $event_socket_port = check_str($_POST["event_socket_port"]); + $event_socket_password = check_str($_POST["event_socket_password"]); + $xml_rpc_http_port = check_str($_POST["xml_rpc_http_port"]); + $xml_rpc_auth_realm = check_str($_POST["xml_rpc_auth_realm"]); + $xml_rpc_auth_user = check_str($_POST["xml_rpc_auth_user"]); + $xml_rpc_auth_pass = check_str($_POST["xml_rpc_auth_pass"]); + $admin_pin = check_str($_POST["admin_pin"]); + $smtp_host = check_str($_POST["smtp_host"]); + $smtp_secure = check_str($_POST["smtp_secure"]); + $smtp_auth = check_str($_POST["smtp_auth"]); + $smtp_username = check_str($_POST["smtp_username"]); + $smtp_password = check_str($_POST["smtp_password"]); + $smtp_from = check_str($_POST["smtp_from"]); + $smtp_from_name = check_str($_POST["smtp_from_name"]); + $mod_shout_decoder = check_str($_POST["mod_shout_decoder"]); + $mod_shout_volume = check_str($_POST["mod_shout_volume"]); + } + +if (count($_POST)>0 && strlen($_POST["persistformvar"]) == 0) { + + //check for all required data + $msg = ''; + //if (strlen($numbering_plan) == 0) { $msg .= "Please provide: Numbering Plan
\n"; } + //if (strlen($default_gateway) == 0) { $msg .= "Please provide: Default Gateway
\n"; } + if (strlen($event_socket_port) == 0) { $msg .= "Please provide: Event Socket Port
\n"; } + if (strlen($event_socket_password) == 0) { $msg .= "Please provide: Event Socket Password
\n"; } + //if (strlen($xml_rpc_http_port) == 0) { $msg .= "Please provide: XML RPC HTTP Port
\n"; } + //if (strlen($xml_rpc_auth_realm) == 0) { $msg .= "Please provide: XML RPC Auth Realm
\n"; } + //if (strlen($xml_rpc_auth_user) == 0) { $msg .= "Please provide: XML RPC Auth User
\n"; } + //if (strlen($xml_rpc_auth_pass) == 0) { $msg .= "Please provide: XML RPC Auth Password
\n"; } + //if (strlen($admin_pin) == 0) { $msg .= "Please provide: Admin PIN Number
\n"; } + //if (strlen($smtp_host) == 0) { $msg .= "Please provide: SMTP Host
\n"; } + //if (strlen($smtp_secure) == 0) { $msg .= "Please provide: SMTP Secure
\n"; } + //if (strlen($smtp_auth) == 0) { $msg .= "Please provide: SMTP Auth
\n"; } + //if (strlen($smtp_username) == 0) { $msg .= "Please provide: SMTP Username
\n"; } + //if (strlen($smtp_password) == 0) { $msg .= "Please provide: SMTP Password
\n"; } + //if (strlen($smtp_from) == 0) { $msg .= "Please provide: SMTP From
\n"; } + //if (strlen($smtp_from_name) == 0) { $msg .= "Please provide: SMTP From Name
\n"; } + //if (strlen($mod_shout_decoder) == 0) { $msg .= "Please provide: Mod Shout Decoder
\n"; } + //if (strlen($mod_shout_volume) == 0) { $msg .= "Please provide: Mod Shout Volume
\n"; } + if (strlen($msg) > 0 && strlen($_POST["persistformvar"]) == 0) { + require_once "includes/header.php"; + require_once "includes/persistformvar.php"; + echo "
\n"; + echo "
\n"; + echo $msg."
"; + echo "
\n"; + persistformvar($_POST); + echo "
\n"; + require_once "includes/footer.php"; + return; + } + + //add or update the database + if ($_POST["persistformvar"] != "true") { + if ($action == "add" && permission_exists('settings_edit')) { + $sql = "insert into v_settings "; + $sql .= "("; + $sql .= "numbering_plan, "; + $sql .= "event_socket_ip_address, "; + $sql .= "event_socket_port, "; + $sql .= "event_socket_password, "; + $sql .= "xml_rpc_http_port, "; + $sql .= "xml_rpc_auth_realm, "; + $sql .= "xml_rpc_auth_user, "; + $sql .= "xml_rpc_auth_pass, "; + $sql .= "admin_pin, "; + $sql .= "smtp_host, "; + $sql .= "smtp_secure, "; + $sql .= "smtp_auth, "; + $sql .= "smtp_username, "; + $sql .= "smtp_password, "; + $sql .= "smtp_from, "; + $sql .= "smtp_from_name, "; + $sql .= "mod_shout_decoder, "; + $sql .= "mod_shout_volume "; + $sql .= ")"; + $sql .= "values "; + $sql .= "("; + $sql .= "'$numbering_plan', "; + $sql .= "'$event_socket_ip_address', "; + $sql .= "'$event_socket_port', "; + $sql .= "'$event_socket_password', "; + $sql .= "'$xml_rpc_http_port', "; + $sql .= "'$xml_rpc_auth_realm', "; + $sql .= "'$xml_rpc_auth_user', "; + $sql .= "'$xml_rpc_auth_pass', "; + $sql .= "'$admin_pin', "; + $sql .= "'$smtp_host', "; + $sql .= "'$smtp_secure', "; + $sql .= "'$smtp_auth', "; + $sql .= "'$smtp_username', "; + $sql .= "'$smtp_password', "; + $sql .= "'$smtp_from', "; + $sql .= "'$smtp_from_name', "; + $sql .= "'$mod_shout_decoder', "; + $sql .= "'$mod_shout_volume' "; + $sql .= ")"; + $db->exec(check_sql($sql)); + unset($sql); + + //synchronize settings + save_setting_xml(); + + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Add Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + } //if ($action == "add") + + if ($action == "update" && permission_exists('settings_edit')) { + $sql = "update v_settings set "; + $sql .= "numbering_plan = '$numbering_plan', "; + $sql .= "event_socket_ip_address = '$event_socket_ip_address', "; + $sql .= "event_socket_port = '$event_socket_port', "; + $sql .= "event_socket_password = '$event_socket_password', "; + $sql .= "xml_rpc_http_port = '$xml_rpc_http_port', "; + $sql .= "xml_rpc_auth_realm = '$xml_rpc_auth_realm', "; + $sql .= "xml_rpc_auth_user = '$xml_rpc_auth_user', "; + $sql .= "xml_rpc_auth_pass = '$xml_rpc_auth_pass', "; + $sql .= "admin_pin = '$admin_pin', "; + $sql .= "smtp_host = '$smtp_host', "; + $sql .= "smtp_secure = '$smtp_secure', "; + $sql .= "smtp_auth = '$smtp_auth', "; + $sql .= "smtp_username = '$smtp_username', "; + $sql .= "smtp_password = '$smtp_password', "; + $sql .= "smtp_from = '$smtp_from', "; + $sql .= "smtp_from_name = '$smtp_from_name', "; + $sql .= "mod_shout_decoder = '$mod_shout_decoder', "; + $sql .= "mod_shout_volume = '$mod_shout_volume' "; + $db->exec(check_sql($sql)); + unset($sql); + + //synchronize settings + save_setting_xml(); + + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Update Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + } //if ($action == "update") + } //if ($_POST["persistformvar"] != "true") + } //(count($_POST)>0 && strlen($_POST["persistformvar"]) == 0) + +//pre-populate the form + if ($_POST["persistformvar"] != "true") { + $sql = ""; + $sql .= "select * from v_settings "; + $prep_statement = $db->prepare($sql); + if ($prep_statement) { + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach ($result as &$row) { + $numbering_plan = $row["numbering_plan"]; + $event_socket_ip_address = $row["event_socket_ip_address"]; + $event_socket_port = $row["event_socket_port"]; + $event_socket_password = $row["event_socket_password"]; + $xml_rpc_http_port = $row["xml_rpc_http_port"]; + $xml_rpc_auth_realm = $row["xml_rpc_auth_realm"]; + $xml_rpc_auth_user = $row["xml_rpc_auth_user"]; + $xml_rpc_auth_pass = $row["xml_rpc_auth_pass"]; + $admin_pin = $row["admin_pin"]; + $smtp_host = $row["smtp_host"]; + $smtp_secure = $row["smtp_secure"]; + $smtp_auth = $row["smtp_auth"]; + $smtp_username = $row["smtp_username"]; + $smtp_password = $row["smtp_password"]; + $smtp_from = $row["smtp_from"]; + $smtp_from_name = $row["smtp_from_name"]; + $mod_shout_decoder = $row["mod_shout_decoder"]; + $mod_shout_volume = $row["mod_shout_volume"]; + break; //limit to 1 row + } + unset ($prep_statement); + } + } + +//show the header + require_once "includes/header.php"; + +//show the content + echo "
"; + echo "\n"; + echo "\n"; + echo " "; + echo " "; + echo "
\n"; + echo "
"; + + echo "
\n"; + echo "
\n"; + echo "\n"; + + echo "\n"; + if ($action == "add") { + echo "\n"; + } + if ($action == "update") { + echo "\n"; + } + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + if (permission_exists('settings_edit')) { + echo " \n"; + echo " \n"; + echo " "; + } + echo "
Setting AddSetting Update
\n"; + echo " Numbering Plan:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the numbering plan. example: US\n"; + echo "
\n"; + echo " Event Socket IP Address:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the event socket IP address. default: 127.0.0.1\n"; + echo "
\n"; + echo " Event Socket Port:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the event socket port. default: 8021\n"; + echo "
\n"; + echo " Event Socket Password:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the event socket password. \n"; + echo "
\n"; + echo " XML RPC HTTP Port:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the XML RPC HTTP Port. default: 8787\n"; + echo "
\n"; + echo " XML RPC Auth Realm:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the XML RPC Auth Realm. default: freeswitch\n"; + echo "
\n"; + echo " XML RPC Auth User:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the XML RPC Auth User. default: xmlrpc\n"; + echo "
\n"; + echo " XML RPC Auth Password:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the XML RPC Auth Password. \n"; + echo "
\n"; + echo " Admin PIN Number:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "\n"; + echo "
\n"; + echo " SMTP Host:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the SMTP host address. TLS example: smtp.gmail.com:587\n"; + echo "
\n"; + echo " SMTP Secure:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Select the SMTP security. None, TLS, SSL\n"; + echo "
\n"; + echo " SMTP Auth:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Use SMTP Authentication true or false.\n"; + echo "
\n"; + echo " SMTP Username:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the SMTP authentication username.\n"; + echo "
\n"; + echo " SMTP Password:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the SMTP authentication password. \n"; + echo "
\n"; + echo " SMTP From:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the SMTP From email address.\n"; + echo "
\n"; + echo " SMTP From Name:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the SMTP From Name.\n"; + echo "
\n"; + echo " Mod Shout Decoder:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the Decoder. default: i386\n"; + echo "
\n"; + echo " Mod Shout Volume:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter Mod Shout Volume.\n"; + echo "
\n"; + echo " \n"; + echo "
"; + echo ""; + + echo "
"; + echo "
"; + +//show the footer + require_once "includes/footer.php"; +?> \ No newline at end of file diff --git a/app/signup/app_config.php b/app/signup/app_config.php new file mode 100644 index 0000000000..7c3c2db782 --- /dev/null +++ b/app/signup/app_config.php @@ -0,0 +1,22 @@ + diff --git a/app/signup/config.php.dist b/app/signup/config.php.dist new file mode 100644 index 0000000000..4dd534ce04 --- /dev/null +++ b/app/signup/config.php.dist @@ -0,0 +1,8 @@ + diff --git a/app/signup/root.php b/app/signup/root.php new file mode 100644 index 0000000000..c7906e24a5 --- /dev/null +++ b/app/signup/root.php @@ -0,0 +1,50 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ + +// make sure the PATH_SEPARATOR is defined + if (!defined("PATH_SEPARATOR")) { + if ( strpos( $_ENV[ "OS" ], "Win" ) !== false ) { define("PATH_SEPARATOR", ";"); } else { define("PATH_SEPARATOR", ":"); } + } + +// make sure the document_root is set + $_SERVER["SCRIPT_FILENAME"] = str_replace("\\", "/", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = str_replace($_SERVER["PHP_SELF"], "", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = realpath($_SERVER["DOCUMENT_ROOT"]); + //echo "DOCUMENT_ROOT: ".$_SERVER["DOCUMENT_ROOT"]."
\n"; + //echo "PHP_SELF: ".$_SERVER["PHP_SELF"]."
\n"; + //echo "SCRIPT_FILENAME: ".$_SERVER["SCRIPT_FILENAME"]."
\n"; + +// if the project directory exists then add it to the include path otherwise add the document root to the include path + if (is_dir($_SERVER["DOCUMENT_ROOT"].'/fusionpbx')){ + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', '/fusionpbx'); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER["DOCUMENT_ROOT"].'/fusionpbx' ); + } + else { + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', ''); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER['DOCUMENT_ROOT'] ); + } + +?> diff --git a/app/signup/signup.php b/app/signup/signup.php new file mode 100644 index 0000000000..f7db863a67 --- /dev/null +++ b/app/signup/signup.php @@ -0,0 +1,177 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/recaptchalib.php"; +//require_once "includes/email_address_validator.php"; +include "config.php"; +include "v_fields.php"; + +# the response from reCAPTCHA +$resp = null; +# the error code from reCAPTCHA, if any +$error = null; + +if (count($_POST)>0 && $_POST["persistform"] != "1") { + + $msgerror = ''; + + $required[] = array('username', "Please provid a Username.
\n"); + $required[] = array('user_first_name', "Please provide a first name.
\n"); + $required[] = array('user_last_name', "Please provide a last name.
\n"); + $required[] = array('user_billing_address_1', "Please provide a street address.
\n"); + $required[] = array('user_billing_city', "Please provide a city.
\n"); + $required[] = array('user_billing_state_province', "Please provide a state.
\n"); + $required[] = array('user_billing_country', "Please provide a country.
\n"); + $required[] = array('user_billing_postal_code',"Please provide a postal code.
\n"); + $required[] = array('user_phone_1', "Please provide a phone number.
\n"); + $required[] = array('user_email', "Please provide an email address.
\n"); + + foreach($required as $x) { + if (strlen($_REQUEST[$x[0]]) < 1) { + $msgerror .= $x[1]; + $error_fields[] = $x[0]; + } + } + + //sanitize the http request array + foreach ($_REQUEST as $field => $data){ + $request[$field] = check_str($data); + } + + //username is already used. + if (strlen($request['username']) != 0) { + $sql = "SELECT * FROM v_users "; + $sql .= " where domain_uuid = '$domain_uuid' "; + $sql .= " and username = '" . $request['username'] . "' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + if (count($prep_statement->fetchAll(PDO::FETCH_NAMED)) > 0) { + $msgerror .= "Please choose a different Username.
\n"; + } + } + + // make sure password fields match + if ($request['password'] != $request['confirmpassword']) { + $msgerror .= "Passwords did not match.
\n"; + } + + // email address atleast looks valid + //if (!in_array('user_email', $error_fields)) { + // $validator = new EmailAddressValidator; + // if (!$validator->check_email_address($request['user_email'])) { + // $msgerror .= "Please provide a VALID email address.
\n"; + // } + //} + + if ($_POST["recaptcha_response_field"]) { + $resp = recaptcha_check_answer ($privatekey, + $_SERVER["REMOTE_ADDR"], + $_POST["recaptcha_challenge_field"], + $_POST["recaptcha_response_field"]); + + if (!$resp->is_valid) { + # set the error code so that we can display it + $msgerror .= "Captcha Verification Failed
\n"; + $error = $resp->error; + } + } else { + $msgerror .= "Captcha Verification Failed
\n"; + } + + if (strlen($msgerror) > 0) { + goto showform; + } + + //salt used with the password to create a one way hash + $salt = generate_password('20', '4'); + $user_uuid = uuid(); + $sql = "insert into v_users "; + $sql .= "("; + $sql .= "domain_uuid, "; + $sql .= "user_uuid, "; + $sql .= "username, "; + $sql .= "password, "; + $sql .= "salt, "; + $sql .= "user_email, "; + $sql .= "user_add_date, "; + $sql .= "user_add_user "; + $sql .= ")"; + $sql .= "values "; + $sql .= "("; + $sql .= "'$domain_uuid', "; + $sql .= "'$user_uuid', "; + $sql .= "'" . $request['username'] . "', "; + $sql .= "'".md5($salt.$request['password'])."', "; + $sql .= "'" . $salt . "', "; + $sql .= "'" . $request['user_email'] . "', "; + $sql .= "now(), "; + $sql .= "'".$_SESSION["username"]."' "; + $sql .= ") "; + if ($db_type == "pgsql") { + + } + $db->exec(check_sql($sql)); + unset($sql); + + //log the success + //$log_type = 'user'; $log_status='add'; $log_add_user=$_SESSION["username"]; $log_desc= "username: ".$username." user added."; + //log_add($db, $log_type, $log_status, $log_desc, $log_add_user, $_SERVER["REMOTE_ADDR"]); + + $group_name = 'user'; + $sql = "insert into v_group_users "; + $sql .= "("; + $sql .= "group_user_uuid, "; + $sql .= "domain_uuid, "; + $sql .= "group_name, "; + $sql .= "user_uuid "; + $sql .= ")"; + $sql .= "values "; + $sql .= "("; + $sql .= "'".uuid()."', "; + $sql .= "'" . $domain_uuid . "', "; + $sql .= "'" . $group_name . "', "; + $sql .= "'" . $user_uuid . "' "; + $sql .= ")"; + $db->exec(check_sql($sql)); + unset($sql); + + require_once "includes/header.php"; + echo "\n"; + echo "
Add Complete
"; + require_once "includes/footer.php"; + // This should probably be an exit or die() call; + return; +} + +showform: + +require_once "includes/header.php"; + +include "user_template.php"; + +require_once "includes/footer.php"; +?> \ No newline at end of file diff --git a/app/signup/user_template.php b/app/signup/user_template.php new file mode 100644 index 0000000000..e0a8f61132 --- /dev/null +++ b/app/signup/user_template.php @@ -0,0 +1,61 @@ +
+ + 0) { ?> + + + + + +
+ +
+
+ +
+ + + +
+
+ + + +
"); +} +?> + +
+
+ + + + + + + +
+ +
+ + +
+
diff --git a/app/signup/v_fields.php b/app/signup/v_fields.php new file mode 100644 index 0000000000..68ee6a1f6c --- /dev/null +++ b/app/signup/v_fields.php @@ -0,0 +1,30 @@ +\n"); + $forms[1]['fields'][2] = array('password', "Password:", "password", TRUE, "Please provid a Username.
\n"); + $forms[1]['fields'][3] = array('confirmpassword', "Confirm Password:", "password", FALSE, ""); + $forms[1]['fields'][4] = array('user_company_name', "Company Name:", "text", FALSE, ""); + $forms[1]['fields'][5] = array('user_first_name', "First Name:", "text", TRUE, "Please provide a first name.
\n"); + $forms[1]['fields'][6] = array('user_last_name', "Last Name:", "text", TRUE, "Please provide a last name.
\n"); + $forms[1]['fields'][7] = array('user_email', "Email:", "text", TRUE, "Please provide an email address.
\n"); + $forms[1]['fields'][8] = array('user_phone_1', "Phone Number:", "text", TRUE, "Please provide a phone number.
\n"); + $forms[1]['fields'][9] = array('user_phone_1_ext', "Extension:", "text", FALSE, ""); + + $forms[2]['header'] = "Billing Address"; + $forms[2]['fields'][1] = array('user_billing_address_1', "Address 1:", "text", TRUE, "Please provide a street address.
\n"); + $forms[2]['fields'][2] = array('user_billing_address_2', "Address 2:", "text", FALSE, ""); + $forms[2]['fields'][3] = array('user_billing_city', "City:", "text", TRUE, "Please provide a city.
\n"); + $forms[2]['fields'][4] = array('user_billing_state_province', "State/Province:", "text", TRUE, "Please provide a state or province.
\n"); + $forms[2]['fields'][5] = array('user_billing_country', "Country:", "text", TRUE, "Please provide a country.
\n"); + $forms[2]['fields'][6] = array('user_billing_postal_code', "ZIP/Postal Code:", "text", TRUE, "Please provide a postal code.
\n"); + + $forms[3]['header'] = "Shipping Address"; + $forms[3]['fields'][1] = array('user_shipping_address_1', "Address 1:", "text", TRUE, "Please provide a street address.
\n"); + $forms[3]['fields'][2] = array('user_shipping_address_2', "Address 2:", "text", FALSE, ""); + $forms[3]['fields'][3] = array('user_shipping_city', "City:", "text", TRUE, "Please provide a city.
\n"); + $forms[3]['fields'][4] = array('user_shipping_state_province', "State/Province:", "text", TRUE, "Please provide a state or province.
\n"); + $forms[3]['fields'][5] = array('user_shipping_country', "Country:", "text", TRUE, "Please provide a country.
\n"); + $forms[3]['fields'][6] = array('user_shipping_postal_code', "ZIP/Postal Code:", "text", TRUE, "Please provide a postal code.
\n"); + +?> diff --git a/app/sip_profiles/app_config.php b/app/sip_profiles/app_config.php new file mode 100644 index 0000000000..c5200b3774 --- /dev/null +++ b/app/sip_profiles/app_config.php @@ -0,0 +1,84 @@ + \ No newline at end of file diff --git a/app/sip_profiles/app_defaults.php b/app/sip_profiles/app_defaults.php new file mode 100644 index 0000000000..1d781df7eb --- /dev/null +++ b/app/sip_profiles/app_defaults.php @@ -0,0 +1,134 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ + +//if the number of rows is 0 then read the sip profile xml into the database + $sql = "select count(*) as num_rows from v_sip_profiles "; + $prep_statement = $db->prepare(check_sql($sql)); + if ($prep_statement) { + $prep_statement->execute(); + $row = $prep_statement->fetch(PDO::FETCH_ASSOC); + if ($row['num_rows'] == 0) { + $xml_list = glob($_SESSION['switch']['conf']['dir']."/sip_profiles/*.xml"); + foreach ($xml_list as &$xml_file) { + //load the sip profile xml and save it into an array + $sip_profile_xml = file_get_contents($xml_file); + $xml = simplexml_load_string($sip_profile_xml); + $json = json_encode($xml); + $sip_profile = json_decode($json, true); + $sip_profile_name = $sip_profile['@attributes']['name']; + //echo "sip profile name: ".$sip_profile_name."\n"; + + if ($sip_profile_name != "{v_sip_profile_name}") { + //prepare the description + switch ($sip_profile_name) { + case "internal": + $sip_profile_description = "The Internal profile by default requires registration which is used by the endpoints. "; + $sip_profile_description .= "By default the Internal profile binds to port 5060. "; + break; + case "internal-ipv6": + $sip_profile_description = "The Internal IPV6 profile binds to the IP version 6 address and is similar to the Internal profile.\n"; + break; + case "external": + $sip_profile_description .= "The External profile external provides anonymous calling in the public context. "; + $sip_profile_description .= "By default the External profile binds to port 5080. "; + $sip_profile_description .= "Calls can be sent using a SIP URL \"voip.domain.com:5080\" "; + break; + case "lan": + $sip_profile_description = "The LAN profile is the same as the Internal profile except that it is bound to the LAN IP.\n"; + break; + default: + $sip_profile_description .= ''; + } + + //add the sip profile + $sip_profile_uuid = uuid(); + $sql = "insert into v_sip_profiles"; + $sql .= "("; + $sql .= "sip_profile_uuid, "; + $sql .= "sip_profile_name, "; + $sql .= "sip_profile_description "; + $sql .= ") "; + $sql .= "values "; + $sql .= "( "; + $sql .= "'".check_str($sip_profile_uuid)."', "; + $sql .= "'".check_str($sip_profile_name)."', "; + $sql .= "'".check_str($sip_profile_description)."' "; + $sql .= ")"; + //echo $sql."\n\n"; + $db->exec(check_sql($sql)); + unset($sql); + + //add the sip profile settings + foreach ($sip_profile['settings']['param'] as $row) { + //get the name and value pair + $sip_profile_setting_name = $row['@attributes']['name']; + $sip_profile_setting_value = $row['@attributes']['value']; + //echo "name: $name value: $value\n"; + //add the profile settings into the database + $sip_profile_setting_uuid = uuid(); + $sql = "insert into v_sip_profile_settings "; + $sql .= "("; + $sql .= "sip_profile_setting_uuid, "; + $sql .= "sip_profile_uuid, "; + $sql .= "sip_profile_setting_name, "; + $sql .= "sip_profile_setting_value, "; + $sql .= "sip_profile_setting_enabled "; + $sql .= ") "; + $sql .= "values "; + $sql .= "( "; + $sql .= "'".check_str($sip_profile_setting_uuid)."', "; + $sql .= "'".check_str($sip_profile_uuid)."', "; + $sql .= "'".check_str($sip_profile_setting_name)."', "; + $sql .= "'".check_str($sip_profile_setting_value)."', "; + $sql .= "'true' "; + $sql .= ")"; + //echo $sql."\n\n"; + $db->exec(check_sql($sql)); + } + } + } + } + } + +//if there is more than one domain then disable the force domains sip profile settings + if (count($_SESSION['domains']) > 1) { + //disable force domains + $sql = "update v_sip_profile_settings set "; + $sql .= "sip_profile_setting_enabled = 'false' "; + $sql .= "where sip_profile_setting_name = 'force-register-domain'"; + $sql .= "or sip_profile_setting_name = 'force-subscription-domain'"; + $sql .= "or sip_profile_setting_name = 'force-register-db-domain'"; + $db->exec(check_sql($sql)); + unset($sql); + + //save the sip profile xml + save_sip_profile_xml(); + + //apply settings reminder + $_SESSION["reload_xml"] = true; + } + +?> \ No newline at end of file diff --git a/app/sip_profiles/resources/xml/sip_profiles/default.xml b/app/sip_profiles/resources/xml/sip_profiles/default.xml new file mode 100644 index 0000000000..6b29308ec4 --- /dev/null +++ b/app/sip_profiles/resources/xml/sip_profiles/default.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + +{v_sip_profile_settings} + + diff --git a/app/sip_profiles/resources/xml/sip_profiles/external.xml b/app/sip_profiles/resources/xml/sip_profiles/external.xml new file mode 100644 index 0000000000..f48bc7ed0e --- /dev/null +++ b/app/sip_profiles/resources/xml/sip_profiles/external.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + +{v_sip_profile_settings} + + diff --git a/app/sip_profiles/resources/xml/sip_profiles/internal-ipv6.xml b/app/sip_profiles/resources/xml/sip_profiles/internal-ipv6.xml new file mode 100644 index 0000000000..e35b3c515e --- /dev/null +++ b/app/sip_profiles/resources/xml/sip_profiles/internal-ipv6.xml @@ -0,0 +1,6 @@ + + + +{v_sip_profile_settings} + + diff --git a/app/sip_profiles/resources/xml/sip_profiles/internal.xml b/app/sip_profiles/resources/xml/sip_profiles/internal.xml new file mode 100644 index 0000000000..3df6f585b3 --- /dev/null +++ b/app/sip_profiles/resources/xml/sip_profiles/internal.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + +{v_sip_profile_settings} + + diff --git a/app/sip_profiles/root.php b/app/sip_profiles/root.php new file mode 100644 index 0000000000..7b882438ea --- /dev/null +++ b/app/sip_profiles/root.php @@ -0,0 +1,50 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ + +// make sure the PATH_SEPARATOR is defined + if (!defined("PATH_SEPARATOR")) { + if ( strpos( $_ENV[ "OS" ], "Win" ) !== false ) { define("PATH_SEPARATOR", ";"); } else { define("PATH_SEPARATOR", ":"); } + } + +// make sure the document_root is set + $_SERVER["SCRIPT_FILENAME"] = str_replace("\\", "/", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = str_replace($_SERVER["PHP_SELF"], "", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = realpath($_SERVER["DOCUMENT_ROOT"]); + //echo "DOCUMENT_ROOT: ".$_SERVER["DOCUMENT_ROOT"]."
\n"; + //echo "PHP_SELF: ".$_SERVER["PHP_SELF"]."
\n"; + //echo "SCRIPT_FILENAME: ".$_SERVER["SCRIPT_FILENAME"]."
\n"; + +// if the project directory exists then add it to the include path otherwise add the document root to the include path + if (is_dir($_SERVER["DOCUMENT_ROOT"].'/fusionpbx')){ + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', '/fusionpbx'); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER["DOCUMENT_ROOT"].'/fusionpbx' ); + } + else { + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', ''); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER['DOCUMENT_ROOT'] ); + } + +?> \ No newline at end of file diff --git a/app/sip_profiles/sip_profile_copy.php b/app/sip_profiles/sip_profile_copy.php new file mode 100644 index 0000000000..f43f252865 --- /dev/null +++ b/app/sip_profiles/sip_profile_copy.php @@ -0,0 +1,128 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +require_once "includes/paging.php"; +if (permission_exists('dialplan_add') + || permission_exists('inbound_route_add') + || permission_exists('outbound_route_add') + || permission_exists('time_conditions_add')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +//set the http get/post variable(s) to a php variable + if (isset($_REQUEST["id"])) { + $sip_profile_uuid = check_str($_REQUEST["id"]); + } + +//get the sip profile data + if (count($_GET)>0 && $_POST["persistformvar"] != "true") { + $sql = "select * from v_sip_profiles "; + $sql .= "where sip_profile_uuid = '$sip_profile_uuid' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(); + foreach ($result as &$row) { + $sip_profile_name = $row["sip_profile_name"]; + $sip_profile_description = $row["sip_profile_description"]; + } + unset ($prep_statement); + } + + //copy the v_sip_profiles + $sip_profile_uuid_new = uuid(); + $sql = "insert into v_sip_profiles "; + $sql .= "("; + $sql .= "sip_profile_uuid, "; + $sql .= "sip_profile_name, "; + $sql .= "sip_profile_description "; + $sql .= ")"; + $sql .= "values "; + $sql .= "("; + $sql .= "'".$sip_profile_uuid_new."', "; + $sql .= "'".$sip_profile_name."-copy', "; + $sql .= "'".$sip_profile_description."' "; + $sql .= ")"; + $db->exec(check_sql($sql)); + unset($sql); + + //get the the sip profile settings + $sql = "select * from v_sip_profile_settings "; + $sql .= "where sip_profile_uuid = '$sip_profile_uuid' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(); + foreach ($result as &$row) { + $sip_profile_setting_name = $row["sip_profile_setting_name"]; + $sip_profile_setting_value = $row["sip_profile_setting_value"]; + $sip_profile_setting_enabled = $row["sip_profile_setting_enabled"]; + $sip_profile_setting_description = $row["sip_profile_setting_description"]; + + //add the sip profile setting + $sql = "insert into v_sip_profile_settings "; + $sql .= "("; + $sql .= "sip_profile_setting_uuid, "; + $sql .= "sip_profile_uuid, "; + $sql .= "sip_profile_setting_name, "; + $sql .= "sip_profile_setting_value, "; + $sql .= "sip_profile_setting_enabled, "; + $sql .= "sip_profile_setting_description "; + $sql .= ")"; + $sql .= "values "; + $sql .= "("; + $sql .= "'".uuid()."', "; + $sql .= "'$sip_profile_uuid_new', "; + $sql .= "'$sip_profile_setting_name', "; + $sql .= "'$sip_profile_setting_value', "; + $sql .= "'$sip_profile_setting_enabled', "; + $sql .= "'$sip_profile_setting_description' "; + $sql .= ")"; + $db->exec(check_sql($sql)); + unset($sql); + } + unset ($prep_statement); + + //save the sip profile xml + save_sip_profile_xml(); + + //apply settings reminder + $_SESSION["reload_xml"] = true; + + //redirect the user + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Copy Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + +?> \ No newline at end of file diff --git a/app/sip_profiles/sip_profile_settings.php b/app/sip_profiles/sip_profile_settings.php new file mode 100644 index 0000000000..07a2d0adee --- /dev/null +++ b/app/sip_profiles/sip_profile_settings.php @@ -0,0 +1,163 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require_once "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('sip_profile_view')) { + //access granted +} +else { + echo "access denied"; + exit; +} +require_once "includes/header.php"; +require_once "includes/paging.php"; + +//get variables used to control the order + $order_by = $_GET["order_by"]; + $order = $_GET["order"]; + +//show the content + echo "
"; + echo "\n"; + echo "\n"; + echo " "; + echo ""; + echo "
\n"; + echo "
"; + + echo "\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + //echo " \n"; + //echo " \n"; + //echo " \n"; + echo "
Settings 
\n"; + //echo " Settings.

\n"; + //echo "
\n"; + + //prepare to page the results + $sql = "select count(*) as num_rows from v_sip_profile_settings "; + $sql .= "where sip_profile_uuid = '$sip_profile_uuid' "; + if (strlen($order_by)> 0) { $sql .= "order by $order_by $order "; } + $prep_statement = $db->prepare($sql); + if ($prep_statement) { + $prep_statement->execute(); + $row = $prep_statement->fetch(PDO::FETCH_ASSOC); + if ($row['num_rows'] > 0) { + $num_rows = $row['num_rows']; + } + else { + $num_rows = '0'; + } + } + + //prepare to page the results + $rows_per_page = 200; + $param = ""; + $page = $_GET['page']; + if (strlen($page) == 0) { $page = 0; $_GET['page'] = 0; } + list($paging_controls, $rows_per_page, $var3) = paging($num_rows, $param, $rows_per_page); + $offset = $rows_per_page * $page; + + //get the sip_profile list + $sql = "select * from v_sip_profile_settings "; + $sql .= "where sip_profile_uuid = '$sip_profile_uuid' "; + if (isset($order_by)) { $sql .= "order by $order_by $order "; } + $sql .= " limit $rows_per_page offset $offset "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + unset ($prep_statement, $sql); + + $c = 0; + $row_style["0"] = "row_style0"; + $row_style["1"] = "row_style1"; + + echo "
\n"; + echo "\n"; + echo "\n"; + echo th_order_by('sip_profile_setting_name', 'Name', $order_by, $order); + echo th_order_by('sip_profile_setting_value', 'Value', $order_by, $order); + echo th_order_by('sip_profile_setting_enabled', 'Enabled', $order_by, $order); + echo th_order_by('sip_profile_setting_description', 'Description', $order_by, $order); + echo "\n"; + echo "\n"; + if ($num_rows > 0) { + foreach($result as $row) { + echo "\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "\n"; + if ($c==0) { $c=1; } else { $c=0; } + } //end foreach + unset($sql, $result, $row_count); + } //end if results + + echo "\n"; + echo "\n"; + echo "\n"; + + echo "
\n"; + if (permission_exists('sip_profile_add')) { + echo " $v_link_label_add\n"; + } + echo "
".$row['sip_profile_setting_name']." ".$row['sip_profile_setting_value']." ".$row['sip_profile_setting_enabled']." ".$row['sip_profile_setting_description']." \n"; + if (permission_exists('sip_profile_edit')) { + echo " $v_link_label_edit\n"; + } + if (permission_exists('sip_profile_delete')) { + echo " $v_link_label_delete\n"; + } + echo "
\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "
 $paging_controls\n"; + if (permission_exists('sip_profile_add')) { + echo " $v_link_label_add\n"; + } + echo "
\n"; + echo "
"; + echo "
"; + echo "

"; + echo "

"; + + echo "
"; + echo "
"; + echo "

"; + +//include the footer + require_once "includes/footer.php"; +?> \ No newline at end of file diff --git a/app/sip_profiles/sip_profile_settings_delete.php b/app/sip_profiles/sip_profile_settings_delete.php new file mode 100644 index 0000000000..507e27bfda --- /dev/null +++ b/app/sip_profiles/sip_profile_settings_delete.php @@ -0,0 +1,66 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require_once "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('sip_profile_delete')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +if (count($_GET)>0) { + $id = check_str($_GET["id"]); + $sip_profile_uuid = check_str($_GET["sip_profile_uuid"]); +} + +if (strlen($id)>0) { + //delete the sip profile setting + $sql = "delete from v_sip_profile_settings "; + $sql .= "where sip_profile_setting_uuid = '$id' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + unset($sql); + + //save the sip profile xml + save_sip_profile_xml(); + + //apply settings reminder + $_SESSION["reload_xml"] = true; +} + +//redirect the browser + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Delete Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + +?> \ No newline at end of file diff --git a/app/sip_profiles/sip_profile_settings_edit.php b/app/sip_profiles/sip_profile_settings_edit.php new file mode 100644 index 0000000000..be5b79d333 --- /dev/null +++ b/app/sip_profiles/sip_profile_settings_edit.php @@ -0,0 +1,271 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require_once "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('sip_profile_add') || permission_exists('sip_profile_edit')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +//action add or update + if (isset($_REQUEST["id"])) { + $action = "update"; + $sip_profile_setting_uuid = check_str($_REQUEST["id"]); + } + else { + $action = "add"; + } + +if (strlen($_GET["sip_profile_uuid"]) > 0) { + $sip_profile_uuid = check_str($_GET["sip_profile_uuid"]); +} + +//get http post variables and set them to php variables + if (count($_POST)>0) { + $sip_profile_setting_name = check_str($_POST["sip_profile_setting_name"]); + $sip_profile_setting_value = check_str($_POST["sip_profile_setting_value"]); + $sip_profile_setting_enabled = check_str($_POST["sip_profile_setting_enabled"]); + $sip_profile_setting_description = check_str($_POST["sip_profile_setting_description"]); + } + +if (count($_POST)>0 && strlen($_POST["persistformvar"]) == 0) { + + $msg = ''; + if ($action == "update") { + $sip_profile_setting_uuid = check_str($_POST["sip_profile_setting_uuid"]); + } + + //check for all required data + //if (strlen($sip_profile_setting_name) == 0) { $msg .= "Please provide: Name
\n"; } + //if (strlen($sip_profile_setting_value) == 0) { $msg .= "Please provide: Value
\n"; } + //if (strlen($sip_profile_setting_enabled) == 0) { $msg .= "Please provide: Enabled
\n"; } + //if (strlen($sip_profile_setting_description) == 0) { $msg .= "Please provide: Description
\n"; } + if (strlen($msg) > 0 && strlen($_POST["persistformvar"]) == 0) { + require_once "includes/header.php"; + require_once "includes/persistformvar.php"; + echo "
\n"; + echo "
\n"; + echo $msg."
"; + echo "
\n"; + persistformvar($_POST); + echo "
\n"; + require_once "includes/footer.php"; + return; + } + + //add or update the database + if ($_POST["persistformvar"] != "true") { + if ($action == "add") { + //add the sip profile setting + $sql = "insert into v_sip_profile_settings "; + $sql .= "("; + $sql .= "sip_profile_setting_uuid, "; + $sql .= "sip_profile_uuid, "; + $sql .= "sip_profile_setting_name, "; + $sql .= "sip_profile_setting_value, "; + $sql .= "sip_profile_setting_enabled, "; + $sql .= "sip_profile_setting_description "; + $sql .= ")"; + $sql .= "values "; + $sql .= "("; + $sql .= "'".uuid()."', "; + $sql .= "'$sip_profile_uuid', "; + $sql .= "'$sip_profile_setting_name', "; + $sql .= "'$sip_profile_setting_value', "; + $sql .= "'$sip_profile_setting_enabled', "; + $sql .= "'$sip_profile_setting_description' "; + $sql .= ")"; + $db->exec(check_sql($sql)); + unset($sql); + + //save the sip profile xml + save_sip_profile_xml(); + + //apply settings reminder + $_SESSION["reload_xml"] = true; + + //redirect the browser + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Add Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + } //if ($action == "add") + + if ($action == "update") { + //update the sip profile setting + $sql = "update v_sip_profile_settings set "; + $sql .= "sip_profile_uuid = '$sip_profile_uuid', "; + $sql .= "sip_profile_setting_name = '$sip_profile_setting_name', "; + $sql .= "sip_profile_setting_value = '$sip_profile_setting_value', "; + $sql .= "sip_profile_setting_enabled = '$sip_profile_setting_enabled', "; + $sql .= "sip_profile_setting_description = '$sip_profile_setting_description' "; + $sql .= "where sip_profile_setting_uuid = '$sip_profile_setting_uuid'"; + $db->exec(check_sql($sql)); + unset($sql); + + //save the sip profile xml + save_sip_profile_xml(); + + //apply settings reminder + $_SESSION["reload_xml"] = true; + + //redirect the browser + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Update Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + } //if ($action == "update") + } //if ($_POST["persistformvar"] != "true") +} //(count($_POST)>0 && strlen($_POST["persistformvar"]) == 0) + +//pre-populate the form + if (count($_GET)>0 && $_POST["persistformvar"] != "true") { + $sip_profile_setting_uuid = $_GET["id"]; + $sql = "select * from v_sip_profile_settings "; + $sql .= "where sip_profile_setting_uuid = '$sip_profile_setting_uuid' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(); + foreach ($result as &$row) { + $sip_profile_setting_name = $row["sip_profile_setting_name"]; + $sip_profile_setting_value = $row["sip_profile_setting_value"]; + $sip_profile_setting_enabled = $row["sip_profile_setting_enabled"]; + $sip_profile_setting_description = $row["sip_profile_setting_description"]; + break; //limit to 1 row + } + unset ($prep_statement); + } + +//show the header + require_once "includes/header.php"; + +//show the content + echo "
"; + echo "\n"; + echo "\n"; + echo " "; + echo " "; + echo "
\n"; + echo "
"; + + echo "
\n"; + echo "
\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo " \n"; + echo " \n"; + echo " "; + echo "
Setting
\n"; + //echo "Settings.

\n"; + echo "
\n"; + echo " Name:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the name.\n"; + echo "
\n"; + echo " Value:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the value.\n"; + echo "
\n"; + echo " Enabled:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Choose to enable or disable this.\n"; + echo "
\n"; + echo " Description:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the description.\n"; + echo "
\n"; + echo " \n"; + if ($action == "update") { + echo " \n"; + } + echo " \n"; + echo "
"; + echo ""; + + echo "
"; + echo "
"; + +//include the footer + require_once "includes/footer.php"; +?> \ No newline at end of file diff --git a/app/sip_profiles/sip_profiles.php b/app/sip_profiles/sip_profiles.php new file mode 100644 index 0000000000..55939be4f8 --- /dev/null +++ b/app/sip_profiles/sip_profiles.php @@ -0,0 +1,159 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('sip_profile_view')) { + //access granted +} +else { + echo "access denied"; + exit; +} +require_once "includes/header.php"; +require_once "includes/paging.php"; + +//get variables used to control the order + $order_by = $_GET["order_by"]; + $order = $_GET["order"]; + +//show the content + echo "
"; + echo "\n"; + echo "\n"; + echo " "; + echo ""; + echo "
\n"; + echo "
"; + + echo "\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "
Sip Profiles 
\n"; + echo " Manage settings for SIP profiles.

\n"; + echo "
\n"; + + //prepare to page the results + $sql = "select count(*) as num_rows from v_sip_profiles "; + if (strlen($order_by)> 0) { $sql .= "order by $order_by $order "; } + $prep_statement = $db->prepare($sql); + if ($prep_statement) { + $prep_statement->execute(); + $row = $prep_statement->fetch(PDO::FETCH_ASSOC); + if ($row['num_rows'] > 0) { + $num_rows = $row['num_rows']; + } + else { + $num_rows = '0'; + } + } + + //prepare to page the results + $rows_per_page = 10; + $param = ""; + $page = $_GET['page']; + if (strlen($page) == 0) { $page = 0; $_GET['page'] = 0; } + list($paging_controls, $rows_per_page, $var3) = paging($num_rows, $param, $rows_per_page); + $offset = $rows_per_page * $page; + + //get the list + $sql = "select * from v_sip_profiles "; + if (strlen($order_by)> 0) { $sql .= "order by $order_by $order "; } + $sql .= "limit $rows_per_page offset $offset "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(); + $result_count = count($result); + unset ($prep_statement, $sql); + + $c = 0; + $row_style["0"] = "row_style0"; + $row_style["1"] = "row_style1"; + + echo "
\n"; + echo "\n"; + echo "\n"; + echo th_order_by('sip_profile_name', 'Name', $order_by, $order); + echo "\n"; + echo "\n"; + echo "\n"; + + if ($result_count > 0) { + foreach($result as $row) { + echo "\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "\n"; + if ($c==0) { $c=1; } else { $c=0; } + } //end foreach + unset($sql, $result, $row_count); + } //end if results + + echo "\n"; + echo "\n"; + echo "\n"; + + echo "
Description\n"; + if (permission_exists('sip_profile_add')) { + echo " $v_link_label_add\n"; + } + echo "
".$row['sip_profile_name']." ".$row['sip_profile_description']." \n"; + if (permission_exists('sip_profile_edit')) { + echo " $v_link_label_edit\n"; + } + if (permission_exists('sip_profile_delete')) { + echo " $v_link_label_delete\n"; + } + echo "
\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "
 $paging_controls\n"; + if (permission_exists('sip_profile_add')) { + echo " $v_link_label_add\n"; + } + echo "
\n"; + echo "
"; + echo "
"; + echo "

"; + echo "

"; + + echo "
"; + echo "
"; + echo "

"; + +//include the footer + require_once "includes/footer.php"; +?> \ No newline at end of file diff --git a/app/sip_profiles/sip_profiles_delete.php b/app/sip_profiles/sip_profiles_delete.php new file mode 100644 index 0000000000..c1387183bc --- /dev/null +++ b/app/sip_profiles/sip_profiles_delete.php @@ -0,0 +1,77 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require_once "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('sip_profile_delete')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +if (count($_GET)>0) { + $id = check_str($_GET["id"]); +} + +if (strlen($id)>0) { + //delete the sip profile settings + $sql = "delete from v_sip_profile_settings "; + $sql .= "where sip_profile_uuid = '$id' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + unset($sql); + + //delete the sip profile + $sql = "delete from v_sip_profiles "; + $sql .= "where sip_profile_uuid = '$id' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + unset($sql); + + //delete the xml sip profile and directory + unlink($_SESSION['switch']['conf']['dir']."/sip_profiles/".$sip_profile_name.".xml"); + unlink($_SESSION['switch']['conf']['dir']."/sip_profiles/".$sip_profile_name); + + //save the sip profile xml + save_sip_profile_xml(); + + //apply settings reminder + $_SESSION["reload_xml"] = true; + +} + +//redirect the browser + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Delete Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + +?> \ No newline at end of file diff --git a/app/sip_profiles/sip_profiles_edit.php b/app/sip_profiles/sip_profiles_edit.php new file mode 100644 index 0000000000..438bbd1a2f --- /dev/null +++ b/app/sip_profiles/sip_profiles_edit.php @@ -0,0 +1,206 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require_once "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('sip_profile_add') || permission_exists('sip_profile_edit')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +//action add or update + if (isset($_REQUEST["id"])) { + $action = "update"; + $sip_profile_uuid = check_str($_REQUEST["id"]); + } + else { + $action = "add"; + } + +//get http post variables and set them to php variables + if (count($_POST)>0) { + $sip_profile_name = check_str($_POST["sip_profile_name"]); + $sip_profile_description = check_str($_POST["sip_profile_description"]); + } + +if (count($_POST)>0 && strlen($_POST["persistformvar"]) == 0) { + + $msg = ''; + if ($action == "update") { + $sip_profile_uuid = check_str($_POST["sip_profile_uuid"]); + } + + //check for all required data + //if (strlen($sip_profile_name) == 0) { $msg .= "Please provide: Name
\n"; } + //if (strlen($sip_profile_description) == 0) { $msg .= "Please provide: Description
\n"; } + if (strlen($msg) > 0 && strlen($_POST["persistformvar"]) == 0) { + require_once "includes/header.php"; + require_once "includes/persistformvar.php"; + echo "
\n"; + echo "
\n"; + echo $msg."
"; + echo "
\n"; + persistformvar($_POST); + echo "
\n"; + require_once "includes/footer.php"; + return; + } + + //add or update the database + if ($_POST["persistformvar"] != "true") { + if ($action == "add") { + $sql = "insert into v_sip_profiles "; + $sql .= "("; + $sql .= "sip_profile_uuid, "; + $sql .= "sip_profile_name, "; + $sql .= "sip_profile_description "; + $sql .= ")"; + $sql .= "values "; + $sql .= "("; + $sql .= "'".uuid()."', "; + $sql .= "'$sip_profile_name', "; + $sql .= "'$sip_profile_description' "; + $sql .= ")"; + $db->exec(check_sql($sql)); + unset($sql); + + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Add Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + } //if ($action == "add") + + if ($action == "update") { + $sql = "update v_sip_profiles set "; + $sql .= "sip_profile_name = '$sip_profile_name', "; + $sql .= "sip_profile_description = '$sip_profile_description' "; + $sql .= "where sip_profile_uuid = '$sip_profile_uuid'"; + $db->exec(check_sql($sql)); + unset($sql); + + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Update Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + } //if ($action == "update") + } //if ($_POST["persistformvar"] != "true") +} //(count($_POST)>0 && strlen($_POST["persistformvar"]) == 0) + +//pre-populate the form + if (count($_GET)>0 && $_POST["persistformvar"] != "true") { + $sip_profile_uuid = $_GET["id"]; + $sql = "select * from v_sip_profiles "; + $sql .= "where sip_profile_uuid = '$sip_profile_uuid' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(); + foreach ($result as &$row) { + $sip_profile_name = $row["sip_profile_name"]; + $sip_profile_description = $row["sip_profile_description"]; + break; //limit to 1 row + } + unset ($prep_statement); + } + +//show the header + require_once "includes/header.php"; + +//show the content + echo "
"; + echo "\n"; + echo "\n"; + echo " "; + echo " "; + echo "
\n"; + echo "
"; + + echo "
\n"; + echo "
\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo " \n"; + echo " \n"; + echo " "; + echo "
Sip Profile\n"; + echo " \n"; + echo " \n"; + echo "
\n"; + echo "Manage settings for the SIP profile.

\n"; + echo "
\n"; + echo " Name:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the SIP Profile name.\n"; + echo "
\n"; + echo " Description:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the description.\n"; + echo "
\n"; + if ($action == "update") { + echo " \n"; + } + echo " \n"; + echo "
"; + echo ""; + + if ($action == "update") { + require "sip_profile_settings.php"; + } + + echo "
"; + echo "
"; + +//include the footer + require_once "includes/footer.php"; +?> \ No newline at end of file diff --git a/app/sip_status/app_config.php b/app/sip_status/app_config.php new file mode 100644 index 0000000000..7cb6ffe0c2 --- /dev/null +++ b/app/sip_status/app_config.php @@ -0,0 +1,29 @@ + \ No newline at end of file diff --git a/app/sip_status/cmd.php b/app/sip_status/cmd.php new file mode 100644 index 0000000000..9abe45a5fa --- /dev/null +++ b/app/sip_status/cmd.php @@ -0,0 +1,68 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (if_group("superadmin")) { + //access granted +} +else { + echo "access denied"; + exit; +} + +$cmd = $_GET['cmd']; +$rdr = $_GET['rdr']; + +//create the event socket connection + $fp = event_socket_create($_SESSION['event_socket_ip_address'], $_SESSION['event_socket_port'], $_SESSION['event_socket_password']); + if ($fp) { + //if reloadxml then run reloadacl, reloadxml and rescan the external profile for new gateways + if ($cmd == "api reloadxml") { + //clear the apply settings reminder + $_SESSION["reload_xml"] = false; + + //rescan the external profile to look for new or stopped gateways + $tmp_cmd = 'api sofia profile external rescan'; + $response = event_socket_request($fp, $tmp_cmd); + unset($tmp_cmd); + } + + //run the requested command + $response = event_socket_request($fp, $cmd); + + //close the connection + fclose($fp); + } + +if ($rdr == "false") { + //redirect false + echo $response; +} +else { + header("Location: sip_status.php?savemsg=".urlencode($response)); +} +?> \ No newline at end of file diff --git a/app/sip_status/root.php b/app/sip_status/root.php new file mode 100644 index 0000000000..7b882438ea --- /dev/null +++ b/app/sip_status/root.php @@ -0,0 +1,50 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ + +// make sure the PATH_SEPARATOR is defined + if (!defined("PATH_SEPARATOR")) { + if ( strpos( $_ENV[ "OS" ], "Win" ) !== false ) { define("PATH_SEPARATOR", ";"); } else { define("PATH_SEPARATOR", ":"); } + } + +// make sure the document_root is set + $_SERVER["SCRIPT_FILENAME"] = str_replace("\\", "/", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = str_replace($_SERVER["PHP_SELF"], "", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = realpath($_SERVER["DOCUMENT_ROOT"]); + //echo "DOCUMENT_ROOT: ".$_SERVER["DOCUMENT_ROOT"]."
\n"; + //echo "PHP_SELF: ".$_SERVER["PHP_SELF"]."
\n"; + //echo "SCRIPT_FILENAME: ".$_SERVER["SCRIPT_FILENAME"]."
\n"; + +// if the project directory exists then add it to the include path otherwise add the document root to the include path + if (is_dir($_SERVER["DOCUMENT_ROOT"].'/fusionpbx')){ + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', '/fusionpbx'); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER["DOCUMENT_ROOT"].'/fusionpbx' ); + } + else { + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', ''); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER['DOCUMENT_ROOT'] ); + } + +?> \ No newline at end of file diff --git a/app/sip_status/sip_status.php b/app/sip_status/sip_status.php new file mode 100644 index 0000000000..b2f8f1f6d4 --- /dev/null +++ b/app/sip_status/sip_status.php @@ -0,0 +1,260 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; + +if (permission_exists('system_status_sofia_status') + || permission_exists('system_status_sofia_status_profile') + || if_group("superadmin")) { + //access granted +} +else { + echo "access denied"; + exit; +} + +//define variables + $c = 0; + $row_style["0"] = "row_style0"; + $row_style["1"] = "row_style1"; + +if ($_GET['a'] == "download") { + if ($_GET['t'] == "cdrcsv") { + $tmp = $_SESSION['switch']['log']['dir'].'/cdr-csv/'; + $filename = 'Master.csv'; + } + if ($_GET['t'] == "backup") { + $tmp = $backup_dir.'/'; + $filename = 'backup.tgz'; + if (!is_dir($backup_dir.'/')) { + exec("mkdir ".$backup_dir."/"); + } + $parent_dir = realpath($_SESSION['switch']['base']['dir']."/.."); + chdir($parent_dir); + shell_exec('tar cvzf freeswitch '.$backup_dir.'/backup.tgz'); + } + session_cache_limiter('public'); + $fd = fopen($tmp.$filename, "rb"); + header("Content-Type: binary/octet-stream"); + header("Content-Length: " . filesize($tmp.$filename)); + header('Content-Disposition: attachment; filename="'.$filename.'"'); + fpassthru($fd); + exit; +} + +require_once "includes/header.php"; + +$msg = $_GET["savemsg"]; +$fp = event_socket_create($_SESSION['event_socket_ip_address'], $_SESSION['event_socket_port'], $_SESSION['event_socket_password']); +if (!$fp) { + $msg = "
Connection to Event Socket failed.
"; +} +if (strlen($msg) > 0) { + echo "
\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "
Message
$msg
\n"; + echo "
\n"; +} + +//sofia status + if ($fp && permission_exists('system_status_sofia_status')) { + $cmd = "api sofia xmlstatus"; + $xml_response = trim(event_socket_request($fp, $cmd)); + try { + $xml = new SimpleXMLElement($xml_response); + } + catch(Exception $e) { + echo $e->getMessage(); + } + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "
\n"; + echo " sofia status \n"; + echo "\n"; + echo " \n"; + echo " \n"; + echo "
\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + foreach ($xml->profile as $row) { + //print_r($row); + echo "\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "\n"; + if ($c==0) { $c=1; } else { $c=0; } + } + foreach ($xml->gateway as $row) { + //print_r($row); + echo "\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "\n"; + if ($c==0) { $c=1; } else { $c=0; } + } + foreach ($xml->alias as $row) { + //print_r($row); + echo "\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "\n"; + if ($c==0) { $c=1; } else { $c=0; } + } + echo "
NameTypeDataState
".$row->name."".$row->type."".$row->data."".$row->state."
".$row->name."".$row->type."".$row->data."".$row->state."
".$row->name."".$row->type."".$row->data."".$row->state."
\n"; + unset($xml); + echo "

\n\n"; + } + +//sofia status profile + if (permission_exists('system_status_sofia_status_profile')) { + foreach (ListFiles($_SESSION['switch']['conf']['dir'].'/sip_profiles') as $key=>$sip_profile_file){ + if (substr($sip_profile_file, -4) == ".xml") { + $sip_profile_name = str_replace(".xml", "", $sip_profile_file); + if ($fp) { + $cmd = "api sofia xmlstatus profile ".$sip_profile_name.""; + $xml_response = trim(event_socket_request($fp, $cmd)); + if ($xml_response == "Invalid Profile!") { $xml_response = "Invalid Profile!"; } + $xml_response = str_replace("", "", $xml_response); + $xml_response = str_replace("", "", $xml_response); + try { + $xml = new SimpleXMLElement($xml_response); + } + catch(Exception $e) { + echo $e->getMessage(); + exit; + } + echo "
\n"; + echo "
\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "
\n"; + echo " sofia status profile $sip_profile_name \n"; + echo "\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + if ($sip_profile_name != "external") { + echo " \n"; + } + echo "
\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + foreach ($xml->profile_info as $row) { + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + } + echo "
  
name   ".$row->name." 
domain-name   ".$row->{'domain-name'}." 
auto-nat ".$row->{'auto-nat'}." 
db-name ".$row->{'db-name'}." 
pres-hosts ".$row->{'pres-hosts'}." 
dialplan ".$row->dialplan." 
context ".$row->context." 
challenge-realm ".$row->{'challenge-realm'}." 
rtp-ip ".$row->{'rtp-ip'}." 
ext-rtp-ip ".$row->{'ext-rtp-ip'}." 
sip-ip ".$row->{'sip-ip'}." 
ext-sip-ip ".$row->{'ext-sip-ip'}." 
url ".$row->url." 
bind-url ".$row->{'bind-url'}." 
tls-url ".$row->{'tls-url'}." 
tls-bind-url ".$row->{'tls-bind-url'}." 
hold-music ".$row->{'hold-music'}." 
outbound-proxy ".$row->{'outbound-proxy'}." 
inbound-codecs ".$row->{'inbound-codecs'}." 
outbound-codecs ".$row->{'outbound-codecs'}." 
tel-event ".$row->{'tel-event'}." 
dtmf-mode ".$row->{'dtmf-mode'}." 
cng ".$row->cng." 
session-to ".$row->{'session-to'}." 
max-dialog ".$row->{'max-dialog'}." 
nomedia ".$row->nomedia." 
late-neg ".$row->{'late-neg'}." 
proxy-media ".$row->{'proxy-media'}." 
aggressive-nat ".$row->{'aggressive-nat'}." 
stun-enabled ".$row->{'stun-enabled'}." 
stun-auto-disable ".$row->{'stun-auto-disable'}." 
user-agent-filter ".$row->{'user-agent-filter'}." 
max-registrations-per-extension ".$row->{'max-registrations-per-extension'}." 
calls-in ".$row->{'calls-in'}." 
calls-out ".$row->{'calls-out'}." 
failed-calls-in ".$row->{'failed-calls-in'}." 
failed-calls-out ".$row->{'failed-calls-out'}." 
\n"; + unset($xml); + echo "

\n\n"; + } + } + } + } + +//status + if ($fp && permission_exists('sip_status_switch_status')) { + $cmd = "api status"; + $response = event_socket_request($fp, $cmd); + echo "status
\n"; + echo "
";
+		echo trim($response);
+		echo "
\n"; + fclose($fp); + echo "

\n\n"; + } + +//include the footer + require_once "includes/footer.php"; + +?> \ No newline at end of file diff --git a/app/sql_query/app_config.php b/app/sql_query/app_config.php new file mode 100644 index 0000000000..bd9ad6aeb8 --- /dev/null +++ b/app/sql_query/app_config.php @@ -0,0 +1,26 @@ + \ No newline at end of file diff --git a/app/sql_query/root.php b/app/sql_query/root.php new file mode 100644 index 0000000000..7b882438ea --- /dev/null +++ b/app/sql_query/root.php @@ -0,0 +1,50 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ + +// make sure the PATH_SEPARATOR is defined + if (!defined("PATH_SEPARATOR")) { + if ( strpos( $_ENV[ "OS" ], "Win" ) !== false ) { define("PATH_SEPARATOR", ";"); } else { define("PATH_SEPARATOR", ":"); } + } + +// make sure the document_root is set + $_SERVER["SCRIPT_FILENAME"] = str_replace("\\", "/", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = str_replace($_SERVER["PHP_SELF"], "", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = realpath($_SERVER["DOCUMENT_ROOT"]); + //echo "DOCUMENT_ROOT: ".$_SERVER["DOCUMENT_ROOT"]."
\n"; + //echo "PHP_SELF: ".$_SERVER["PHP_SELF"]."
\n"; + //echo "SCRIPT_FILENAME: ".$_SERVER["SCRIPT_FILENAME"]."
\n"; + +// if the project directory exists then add it to the include path otherwise add the document root to the include path + if (is_dir($_SERVER["DOCUMENT_ROOT"].'/fusionpbx')){ + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', '/fusionpbx'); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER["DOCUMENT_ROOT"].'/fusionpbx' ); + } + else { + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', ''); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER['DOCUMENT_ROOT'] ); + } + +?> \ No newline at end of file diff --git a/app/sql_query/v_sql_backup.php b/app/sql_query/v_sql_backup.php new file mode 100644 index 0000000000..dd16c54efa --- /dev/null +++ b/app/sql_query/v_sql_backup.php @@ -0,0 +1,133 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('sql_query_backup')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +//pdo database connection + if (strlen($_REQUEST['id']) > 0) { + require_once "v_sql_query_pdo.php"; + } + +//set the headers + header('Content-type: application/octet-binary'); + header('Content-Disposition: attachment; filename=database_backup.sql'); + +//get the list of tables + if ($db_type == "sqlite") { + $sql = "SELECT name FROM sqlite_master "; + $sql .= "WHERE type='table' "; + $sql .= "order by name;"; + } + if ($db_type == "pgsql") { + $sql = "select table_name as name "; + $sql .= "from information_schema.tables "; + $sql .= "where table_schema='public' "; + $sql .= "and table_type='BASE TABLE' "; + $sql .= "order by table_name "; + } + if ($db_type == "mysql") { + $sql = "show tables"; + } + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach ($result as &$row) { + $table_name = $row[0]; + + //get the table data + $sql = "select * from $table_name"; + if (strlen($sql) > 0) { + $prep_statement_2 = $db->prepare(check_sql($sql)); + if ($prep_statement_2) { + $prep_statement_2->execute(); + $result2 = $prep_statement_2->fetchAll(PDO::FETCH_ASSOC); + } + else { + echo "Error:\n"; + echo "
\n";
+					print_r($db->errorInfo());
+					echo "
\n"; + } + + $x = 0; + foreach ($result2[0] as $key => $value) { + if ($row[$column] != "db") { + $column_array[$x] = $key; + $x++; + } + } + + $column_array_count = count($column_array); + + foreach ($result2 as &$row) { + $sql = "INSERT INTO $table_name ("; + $x = 1; + foreach ($column_array as $column) { + if ($x < $column_array_count) { + if (strlen($row[$column]) > 0) { + $sql .= ''.$column.','; + } + } + else { + if (strlen($row[$column]) > 0) { + $sql .= ''.$column.''; + } + } + $x++; + } + $sql .= ") "; + $sql .= "VALUES( "; + $x = 1; + foreach ($column_array as $column) { + if ($x < $column_array_count) { + if (strlen($row[$column])> 0) { + $sql .= "'".check_str($row[$column])."',"; + } + } + else { + if (strlen($row[$column])> 0) { + $sql .= "'".check_str($row[$column])."'"; + } + } + $x++; + } + $sql .= ");\n"; + echo str_replace(",)", ")", $sql); + } + } + + unset($column_array); + } + +?> diff --git a/app/sql_query/v_sql_db_conversion.php b/app/sql_query/v_sql_db_conversion.php new file mode 100644 index 0000000000..0a9830cbc0 --- /dev/null +++ b/app/sql_query/v_sql_db_conversion.php @@ -0,0 +1,495 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +require_once "includes/lib_schema.php"; + +if (if_group("superadmin")) { + //access granted +} +else { + echo "access denied"; + exit; + +//show errors + ini_set('display_errors', '1'); + //error_reporting (E_ALL); // Report everything + error_reporting(E_ALL ^ E_NOTICE ^ E_WARNING ); //hide notices and warnings + +//define the db file exists function + function db_field_exists ($tmp_array, $column) { + $result = false; + foreach ($tmp_array as &$row) { + if ($row[0] == $column) { + $result = true; + } + return $result; + } + } + //db_field_exists ($result_dest, $column) + +//destination info + //set the domain_uuid + $dest_domain_uuid = '1'; + + //set the database type + $db_dest_type = 'mysql'; //sqlite, mysql, pgsql, others with a manually created PDO connection + + //sqlite: the dbfilename and db_file_path are automatically assigned however the values can be overidden by setting the values here. + //$dbfilename = 'fusionpbx.db'; //host name/ip address + '.db' is the default database filename + //$db_file_path = $_SERVER["DOCUMENT_ROOT"].PROJECT_PATH.'/secure'; //the path is determined by a php variable + + //mysql: database connection information + $db_host = '127.0.0.1'; //set the host only if the database is not local + $db_port = '3306'; + $db_name = 'fusionpbx'; + $db_username = 'fusionpbx'; + $db_password = ''; + $db_create_username = 'root'; + $db_create_password = ''; + + //pgsql: database connection information + //$db_host = ''; //set the host only if the database is not local + //$db_port = ''; + //$db_name = ''; + //$db_username = ''; + //$db_password = ''; + //$db_create_username = ''; + //$db_create_password = ''; + + //load data into the database + + //create the sqlite database + if ($db_dest_type == "sqlite") { + //sqlite database will be created when the config.php is loaded and only if the database file does not exist + $filename = $_SERVER["DOCUMENT_ROOT"].PROJECT_PATH.'/includes/install/sql/sqlite.sql'; + $file_contents = file_get_contents($filename); + unset($filename); + try { + $db_dest = new PDO('sqlite:'.$db_filepath.'/'.$db_filename); //sqlite 3 + //$db_dest = new PDO('sqlite::memory:'); //sqlite 3 + $db_dest->beginTransaction(); + } + catch (PDOException $error) { + print "error: " . $error->getMessage() . "
"; + die(); + } + + //replace \r\n with \n then explode on \n + $file_contents = str_replace("\r\n", "\n", $file_contents); + + //loop line by line through all the lines of sql code + $stringarray = explode("\n", $file_contents); + $x = 0; + foreach($stringarray as $sql) { + try { + if(stristr($sql, 'CREATE TABLE') === FALSE) { + //not found do not execute + } + else { + //execute create table sql strings + $db_dest->query($sql); + } + } + catch (PDOException $error) { + echo "error: " . $error->getMessage() . " sql: $sql
"; + } + $x++; + } + unset ($file_contents, $sql); + $db_dest->commit(); + } + + //create the postgres database + if ($db_dest_type == "pgsql") { + $filename = $_SERVER["DOCUMENT_ROOT"].PROJECT_PATH.'/includes/install/sql/pgsql.sql'; + $file_contents = file_get_contents($filename); + + //if $db_create_username provided, attempt to create new PG role and database + if (strlen($db_create_username) > 0) { + //create the database connection + try { + if (strlen($db_port) == 0) { $db_port = "5432"; } + if (strlen($db_host) > 0) { + $db_dest = new PDO("pgsql:host={$db_host} port={$db_port} user={$db_create_username} password={$db_create_password} dbname=template1"); + } else { + $db_dest = new PDO("pgsql:host=localhost port={$db_port} user={$db_create_username} password={$db_create_password} dbname=template1"); + } + } catch (PDOException $error) { + print "error: " . $error->getMessage() . "
"; + die(); + } + //create the database, user, grant perms + $db_dest->exec("CREATE DATABASE {$db_name}"); + $db_dest->exec("CREATE USER {$db_username} WITH PASSWORD '{$db_password}'"); + $db_dest->exec("GRANT ALL ON {$db_name} TO {$db_username}"); + //close database connection_aborted + $db_dest = null; + } + + //open database connection with $db_name + try { + if (strlen($db_port) == 0) { $db_port = "5432"; } + if (strlen($db_host) > 0) { + $db_dest = new PDO("pgsql:host={$db_host} port={$db_port} dbname={$db_name} user={$db_username} password={$db_password}"); + } else { + $db_dest = new PDO("pgsql:host=localhost port={$db_port} user={$db_username} password={$db_password} dbname={$db_name}"); + } + } + catch (PDOException $error) { + print "error: " . $error->getMessage() . "
"; + die(); + } + + //replace \r\n with \n then explode on \n + $file_contents = str_replace("\r\n", "\n", $file_contents); + + //loop line by line through all the lines of sql code + $stringarray = explode("\n", $file_contents); + $x = 0; + foreach($stringarray as $sql) { + if (strlen($sql) > 3) { + try { + if(stristr($sql, 'CREATE TABLE') === FALSE) { + //not found do not execute + } + else { + //execute create table sql strings + $db_dest->query($sql); + } + } + catch (PDOException $error) { + echo "error: " . $error->getMessage() . " sql: $sql
"; + die(); + } + } + $x++; + } + unset ($file_contents, $sql); + } + + //create the mysql database + if ($db_dest_type == "mysql") { + $filename = $_SERVER["DOCUMENT_ROOT"].PROJECT_PATH.'/includes/install/sql/mysql.sql'; + $file_contents = file_get_contents($filename); + + //database connection + try { + if (strlen($db_host) == 0 && strlen($db_port) == 0) { + //if both host and port are empty use the unix socket + if (strlen($db_create_username) == 0) { + $db_dest = new PDO("mysql:host=$db_host;unix_socket=/var/run/mysqld/mysqld.sock;", $db_username, $db_password); + } + else { + $db_dest = new PDO("mysql:host=$db_host;unix_socket=/var/run/mysqld/mysqld.sock;", $db_create_username, $db_create_password); + } + } + else { + if (strlen($db_port) == 0) { + //leave out port if it is empty + if (strlen($db_create_username) == 0) { + $db_dest = new PDO("mysql:host=$db_host;", $db_username, $db_password); + } + else { + $db_dest = new PDO("mysql:host=$db_host;", $db_create_username, $db_create_password); + } + } + else { + if (strlen($db_create_username) == 0) { + $db_dest = new PDO("mysql:host=$db_host;port=$db_port;", $db_username, $db_password); + } + else { + $db_dest = new PDO("mysql:host=$db_host;port=$db_port;", $db_create_username, $db_create_password); + } + } + } + $db_dest->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); + $db_dest->setAttribute(PDO::ATTR_EMULATE_PREPARES, true); + } + catch (PDOException $error) { + if ($v_debug) { + print "error: " . $error->getMessage() . "
"; + } + } + + //create the table, user and set the permissions only if the db_create_username was provided + if (strlen($db_create_username) > 0) { + //select the mysql database + try { + $db_dest->query("USE mysql;"); + } + catch (PDOException $error) { + if ($v_debug) { + print "error: " . $error->getMessage() . "
"; + } + } + //create user and set the permissions + try { + $tmp_sql = "CREATE USER '".$db_username."'@'%' IDENTIFIED BY '".$db_password."'; "; + $db_dest->query($tmp_sql); + } + catch (PDOException $error) { + if ($v_debug) { + print "error: " . $error->getMessage() . "
"; + } + } + //set account to unlimitted use + try { + $tmp_sql = "GRANT USAGE ON * . * TO '".$db_username."'@'localhost' "; + $tmp_sql .= "IDENTIFIED BY '".$db_password."' "; + $tmp_sql .= "WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0; "; + $db_dest->query($tmp_sql); + } + catch (PDOException $error) { + if ($v_debug) { + print "error: " . $error->getMessage() . "
"; + } + } + //create the database and set the create user with permissions + try { + $tmp_sql = "CREATE DATABASE IF NOT EXISTS ".$db_name."; "; + $db_dest->query($tmp_sql); + } + catch (PDOException $error) { + if ($v_debug) { + print "error: " . $error->getMessage() . "
"; + } + } + //set user permissions + try { + $db_dest->query("GRANT ALL PRIVILEGES ON ".$db_name.".* TO '".$db_username."'@'%'; "); + } + catch (PDOException $error) { + if ($v_debug) { + print "error: " . $error->getMessage() . "
"; + } + } + //make the changes active + try { + $tmp_sql = "FLUSH PRIVILEGES; "; + $db_dest->query($tmp_sql); + } + catch (PDOException $error) { + if ($v_debug) { + print "error: " . $error->getMessage() . "
"; + } + } + } //if (strlen($db_create_username) > 0) + //select the database + try { + $db_dest->query("USE ".$db_name.";"); + } + catch (PDOException $error) { + if ($v_debug) { + print "error: " . $error->getMessage() . "
"; + } + } + + //add the defaults data into the database + //replace \r\n with \n then explode on \n + $file_contents = str_replace("\r\n", "\n", $file_contents); + + //loop line by line through all the lines of sql code + $stringarray = explode("\n", $file_contents); + $x = 0; + foreach($stringarray as $sql) { + if (strlen($sql) > 3) { + try { + if(stristr($sql, 'CREATE TABLE') === FALSE) { + //not found do not execute + } + else { + //execute create table sql strings + $db_dest->query($sql); + } + } + catch (PDOException $error) { + //echo "error on line $x: " . $error->getMessage() . " sql: $sql
"; + //die(); + } + } + $x++; + } + unset ($file_contents, $sql); + } + +//get the list of tables + if ($db_dest_type == "sqlite") { + $sql = "SELECT name FROM sqlite_master "; + $sql .= "WHERE type='table' "; + $sql .= "order by name;"; + } + if ($db_dest_type == "pgsql") { + $sql = "select table_name as name "; + $sql .= "from information_schema.tables "; + $sql .= "where table_schema='public' "; + $sql .= "and table_type='BASE TABLE' "; + $sql .= "order by table_name "; + } + if ($db_dest_type == "mysql") { + $sql = "show tables"; + } + //get the default schema structure + $prep_statement = $db_dest->prepare(check_sql($sql)); + $prep_statement->execute(); + $result_dest = $prep_statement->fetchAll(PDO::FETCH_NAMED); + //clean the content from the table + foreach ($result_dest as &$row) { + $table_name = $row[0]; + $sql = 'delete from '.$table_name; + //$db_dest->query($sql); + } + + //add data into each table + foreach ($result_dest as &$row) { + //get the table name + $table_name = $row[0]; + + //$table_name = 'v_extensions'; + //$db_dest_type = "sqlite"; + + //get the table source data + $destination_column_array=''; + unset($destination_column_array); + if ($db_dest_type == "sqlite") { + $tmp_sql = "PRAGMA table_info($table_name);"; + } + if ($db_dest_type == "pgsql") { + + } + if ($db_dest_type == "mysql") { + $tmp_sql = "show columns from $table_name;"; + } + if (strlen($tmp_sql) > 0) { + $prep_statement_2 = $db_dest->prepare(check_sql($tmp_sql)); + //$prep_statement_2 = $db->prepare(check_sql($tmp_sql)); + if ($prep_statement_2) { + $prep_statement_2->execute(); + $result2 = $prep_statement_2->fetchAll(PDO::FETCH_ASSOC); + } + else { + echo "Error:\n"; + echo "
\n";
+						print_r($db_dest->errorInfo());
+						echo "
\n"; + } + $x = 0; + foreach ($result2 as $row2) { + if ($db_dest_type == "sqlite") { + $destination_column_array[$x] = $row2['name']; + } + if ($db_dest_type == "mysql") { + $destination_column_array[$x] = $row2['Field']; + } + if ($db_dest_type == "pgsql") { + + } + $x++; + } + /* + $x = 0; + foreach ($result2[0] as $key => $value) { + if ($db_dest_type == "sqlite" && $key == "name") { + $destination_column_array[$x] = $key; + } + $x++; + } + */ + $destination_column_array_count = count($destination_column_array); + } + unset($prep_statement_2, $result2); + //echo "
\n";
+				//print_r($destination_column_array);
+				//echo "
\n"; + + //get the table source data + $tmp_sql = "select * from $table_name"; + if (strlen($tmp_sql) > 0) { + $prep_statement_2 = $db->prepare(check_sql($tmp_sql)); + if ($prep_statement_2) { + $prep_statement_2->execute(); + $result2 = $prep_statement_2->fetchAll(PDO::FETCH_ASSOC); + } + else { + echo "Error:\n"; + echo "
\n";
+						print_r($db->errorInfo());
+						echo "
\n"; + } + + $x = 0; + foreach ($result2[0] as $key => $value) { + $column_array[$x] = $key; + $x++; + } + + foreach ($result2 as &$row) { + //build the sql query string + if (substr($table_name, 0, 2) == 'v_') { + $sql = "INSERT INTO $table_name ("; + $x = 1; + foreach ($destination_column_array as $column) { + if ($x < $destination_column_array_count) { + $sql .= "".$column.", "; + } + else { + $sql .= "".$column.""; + } + $x++; + } + $sql .= ") "; + $sql .= "VALUES( "; + $x = 1; + foreach ($destination_column_array as $column) { + if ($x < $destination_column_array_count) { + //if ($column == "domain_uuid") { + // $sql .= "'".$dest_domain_uuid."',"; + //} + //else { + $sql .= "'".check_str($row[$column])."', "; + //} + } + else { + //if ($column == "domain_uuid") { + // $sql .= "'".$dest_domain_uuid."'"; + //} + //else { + $sql .= "'".check_str($row[$column])."'"; + //} + } + $x++; + } + $sql .= ");\n"; + } + //add the sql into the destination database + echo $sql."
\n"; + $db_dest->query($sql); + } + } + } + +?> \ No newline at end of file diff --git a/app/sql_query/v_sql_query.php b/app/sql_query/v_sql_query.php new file mode 100644 index 0000000000..1d0af0ec2a --- /dev/null +++ b/app/sql_query/v_sql_query.php @@ -0,0 +1,171 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('sql_query_execute')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +//show the header + require_once "includes/header.php"; + +//pdo voicemail database connection + require_once "v_sql_query_pdo.php"; + +//show the content + //edit area + echo " \n"; + echo " "; + + echo "
"; + echo "\n"; + + echo "\n"; + echo " + +
\n"; + echo "
"; + + echo "
"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo " + + + + + + + + + + + +
SQL Query\n"; + if (strlen($_REQUEST['id']) > 0) { + echo " \n"; + } + else { + echo " \n"; + } + echo " \n"; + echo " \n"; + echo "
\n"; + echo " +
+
+
+ location: ".$_SESSION['switch']['conf']['dir']."/vars.xml\n"; + } + ?> + + + + "; + } + ?> +
+


+


+


+


+


+


+


+


+


+


+
+
+ +
+
+ + \ No newline at end of file diff --git a/app/vars/v_vars_delete.php b/app/vars/v_vars_delete.php new file mode 100644 index 0000000000..126d03ac14 --- /dev/null +++ b/app/vars/v_vars_delete.php @@ -0,0 +1,62 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('variables_delete')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +if (count($_GET)>0) { + $id = $_GET["id"]; +} + +//delete the data + if (strlen($id)>0) { + $sql = ""; + $sql .= "delete from v_vars "; + $sql .= "where var_uuid = '$id' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + unset($sql); + + save_var_xml(); + } + +//redirect the user + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Delete Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + +?> \ No newline at end of file diff --git a/app/vars/v_vars_edit.php b/app/vars/v_vars_edit.php new file mode 100644 index 0000000000..6465cea1d0 --- /dev/null +++ b/app/vars/v_vars_edit.php @@ -0,0 +1,384 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('variables_add') || permission_exists('variables_edit')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +//set the action as an add or an update + if (isset($_REQUEST["id"])) { + $action = "update"; + $var_uuid = check_str($_REQUEST["id"]); + } + else { + $action = "add"; + } + +//set http values as php variables + if (count($_POST)>0) { + $var_name = check_str($_POST["var_name"]); + $var_value = check_str($_POST["var_value"]); + $var_cat = check_str($_POST["var_cat"]); + if (strlen($_POST["var_cat_other"]) > 0) { + $var_cat = check_str($_POST["var_cat_other"]); + } + $var_enabled = check_str($_POST["var_enabled"]); + $var_order = check_str($_POST["var_order"]); + $var_description = $_POST["var_description"]; + $var_description = str_replace("''", "'", $var_description); + } + +if (count($_POST)>0 && strlen($_POST["persistformvar"]) == 0) { + + $msg = ''; + if ($action == "update") { + $var_uuid = check_str($_POST["var_uuid"]); + } + + //check for all required data + if (strlen($var_name) == 0) { $msg .= "Please provide: Name
\n"; } + if (strlen($var_value) == 0) { $msg .= "Please provide: Value
\n"; } + //if (strlen($var_cat) == 0) { $msg .= "Please provide: Category
\n"; } + if (strlen($var_enabled) == 0) { $msg .= "Please provide: Enabled
\n"; } + if (strlen($var_order) == 0) { $msg .= "Please provide: Order
\n"; } + //if (strlen($var_description) == 0) { $msg .= "Please provide: Description
\n"; } + if (strlen($msg) > 0 && strlen($_POST["persistformvar"]) == 0) { + require_once "includes/header.php"; + require_once "includes/persistformvar.php"; + echo "
\n"; + echo "
\n"; + echo $msg."
"; + echo "
\n"; + persistformvar($_POST); + echo "
\n"; + require_once "includes/footer.php"; + return; + } + + //add or update the database + if ($_POST["persistformvar"] != "true") { + if ($action == "add" && permission_exists('variables_add')) { + $var_uuid = uuid(); + $sql = "insert into v_vars "; + $sql .= "("; + $sql .= "var_uuid, "; + $sql .= "var_name, "; + $sql .= "var_value, "; + $sql .= "var_cat, "; + $sql .= "var_enabled, "; + $sql .= "var_order, "; + $sql .= "var_description "; + $sql .= ")"; + $sql .= "values "; + $sql .= "("; + $sql .= "'$var_uuid', "; + $sql .= "'$var_name', "; + $sql .= "'$var_value', "; + $sql .= "'$var_cat', "; + $sql .= "'$var_enabled', "; + $sql .= "'$var_order', "; + $sql .= "'".base64_encode($var_description)."' "; + $sql .= ")"; + $db->exec(check_sql($sql)); + unset($sql); + + //unset the user defined variables + $_SESSION["user_defined_variables"] = ""; + + //synchronize the configuration + save_var_xml(); + + //redirect the user + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Add Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + } //if ($action == "add") + + if ($action == "update" && permission_exists('variables_edit')) { + $sql = "update v_vars set "; + $sql .= "var_name = '$var_name', "; + $sql .= "var_value = '$var_value', "; + $sql .= "var_cat = '$var_cat', "; + $sql .= "var_enabled = '$var_enabled', "; + $sql .= "var_order = '$var_order', "; + $sql .= "var_description = '".base64_encode($var_description)."' "; + $sql .= "where var_uuid = '$var_uuid' "; + $db->exec(check_sql($sql)); + unset($sql); + + //unset the user defined variables + $_SESSION["user_defined_variables"] = ""; + + //synchronize the configuration + save_var_xml(); + + //redirect the user + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Update Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + } //if ($action == "update") + } //if ($_POST["persistformvar"] != "true") +} //(count($_POST)>0 && strlen($_POST["persistformvar"]) == 0) + +//pre-populate the form + if (count($_GET)>0 && $_POST["persistformvar"] != "true") { + $var_uuid = $_GET["id"]; + $sql = ""; + $sql .= "select * from v_vars "; + $sql .= "where var_uuid = '$var_uuid' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach ($result as &$row) { + $var_name = $row["var_name"]; + $var_value = $row["var_value"]; + $var_cat = $row["var_cat"]; + $var_enabled = $row["var_enabled"]; + $var_order = $row["var_order"]; + $var_description = base64_decode($row["var_description"]); + break; //limit to 1 row + } + unset ($prep_statement); + } + +//include header + require_once "includes/header.php"; + +//show contents + echo "
"; + echo "\n"; + echo "\n"; + echo " "; + echo " "; + echo "
\n"; + echo "
"; + + echo "
\n"; + echo "
\n"; + echo "\n"; + + echo "\n"; + if ($action == "add") { + echo "\n"; + } + if ($action == "update") { + echo "\n"; + } + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo " \n"; + echo " \n"; + echo " "; + + //if variable is a code then show the codec info + if ($var_name == "global_codec_prefs" || $var_name == "outbound_codec_prefs") { + echo "\n"; + echo ""; + echo ""; + } + + echo "
Variable AddVariable Edit
\n"; + echo " Name:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the variable name here. \n"; + echo "
\n"; + echo " Value:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the variable value here. \n"; + echo "
\n"; + echo " Category:\n"; + echo "\n"; + $table_name = 'v_vars';$field_name = 'var_cat';$sql_where_optional = "";$field_current_value = $var_cat; + echo html_select_other($db, $table_name, $field_name, $sql_where_optional, $field_current_value); + //echo " \n"; + echo "
\n"; + echo "Enter the category here.\n"; + echo "
\n"; + echo " Enabled:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "\n"; + echo "
\n"; + echo " Order:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "\n"; + echo "
\n"; + echo " Description:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "\n"; + echo "
\n"; + if ($action == "update") { + echo " \n"; + } + echo " \n"; + echo "
\n"; + echo "
\n"; + echo "Codec Information:
\n"; + echo "Module must be compiled and loaded.     codecname[@8000h|16000h|32000h[@XXi]]
\n"; + echo "
\n"; + echo "XX is the frame size must be multples allowed for the codec
\n"; + echo "10-120ms is supported on some codecs.
\n"; + echo "We do not support exceeding the MTU of the RTP packet.
\n"; + echo "
\n"; + + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " "; + echo " \n"; + echo " \n"; + echo "
iLBC@30iiLBC using mode=30 which will win in all cases.
DVI4@8000h@20iIMA ADPCM 8kHz using 20ms ptime. (multiples of 10)
DVI4@16000h@40iIMA ADPCM 16kHz using 40ms ptime. (multiples of 10)
speex@8000h@20iSpeex 8kHz using 20ms ptime.
speex@16000h@20iSpeex 16kHz using 20ms ptime.
speex@32000h@20iSpeex 32kHz using 20ms ptime.
G7221@16000hG722.1 16kHz (aka Siren 7)
G7221@32000hG722.1C 32kHz (aka Siren 14)
CELT@32000hCELT 32kHz, only 10ms supported
CELT@48000hCELT 48kHz, only 10ms supported
GSM@40iGSM 8kHz using 40ms ptime. (GSM is done in multiples of 20, Default is 20ms)
G722G722 16kHz using default 20ms ptime. (multiples of 10)
PCMUG711 8kHz ulaw using default 20ms ptime. (multiples of 10)
PCMAG711 8kHz alaw using default 20ms ptime. (multiples of 10)
G726-16G726 16kbit adpcm using default 20ms ptime. (multiples of 10)
G726-24G726 24kbit adpcm using default 20ms ptime. (multiples of 10)
G726-32G726 32kbit adpcm using default 20ms ptime. (multiples of 10)
G726-40G726 40kbit adpcm using default 20ms ptime. (multiples of 10)
AAL2-G726-16Same as G726-16 but using AAL2 packing. (multiples of 10)
AAL2-G726-24Same as G726-24 but using AAL2 packing. (multiples of 10)
AAL2-G726-32Same as G726-32 but using AAL2 packing. (multiples of 10)
AAL2-G726-40Same as G726-40 but using AAL2 packing. (multiples of 10)
LPCLPC10 using 90ms ptime (only supports 90ms at this time)
L16L16 isn't recommended for VoIP but you can do it. L16 can exceed the MTU rather quickly.

These are the passthru audio codecs:
G729G729 in passthru mode. (mod_g729)
G723G723.1 in passthru mode. (mod_g723_1)
AMRAMR in passthru mode. (mod_amr)

These are the passthru video codecs: (mod_h26x)
H261H.261 Video
H263H.263 Video
H263-1998H.263-1998 Video
H263-2000H.263-2000 Video
H264H.264 Video
\n"; + echo "
"; + echo ""; + + echo "
"; + echo "
"; + +//include header + require_once "includes/footer.php"; +?> diff --git a/app/virtual_tables/app_config.php b/app/virtual_tables/app_config.php new file mode 100644 index 0000000000..8f2fa04c97 --- /dev/null +++ b/app/virtual_tables/app_config.php @@ -0,0 +1,369 @@ + \ No newline at end of file diff --git a/app/virtual_tables/root.php b/app/virtual_tables/root.php new file mode 100644 index 0000000000..7b882438ea --- /dev/null +++ b/app/virtual_tables/root.php @@ -0,0 +1,50 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ + +// make sure the PATH_SEPARATOR is defined + if (!defined("PATH_SEPARATOR")) { + if ( strpos( $_ENV[ "OS" ], "Win" ) !== false ) { define("PATH_SEPARATOR", ";"); } else { define("PATH_SEPARATOR", ":"); } + } + +// make sure the document_root is set + $_SERVER["SCRIPT_FILENAME"] = str_replace("\\", "/", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = str_replace($_SERVER["PHP_SELF"], "", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = realpath($_SERVER["DOCUMENT_ROOT"]); + //echo "DOCUMENT_ROOT: ".$_SERVER["DOCUMENT_ROOT"]."
\n"; + //echo "PHP_SELF: ".$_SERVER["PHP_SELF"]."
\n"; + //echo "SCRIPT_FILENAME: ".$_SERVER["SCRIPT_FILENAME"]."
\n"; + +// if the project directory exists then add it to the include path otherwise add the document root to the include path + if (is_dir($_SERVER["DOCUMENT_ROOT"].'/fusionpbx')){ + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', '/fusionpbx'); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER["DOCUMENT_ROOT"].'/fusionpbx' ); + } + else { + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', ''); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER['DOCUMENT_ROOT'] ); + } + +?> \ No newline at end of file diff --git a/app/virtual_tables/v_virtual_table_data_delete.php b/app/virtual_tables/v_virtual_table_data_delete.php new file mode 100644 index 0000000000..bcab3314de --- /dev/null +++ b/app/virtual_tables/v_virtual_table_data_delete.php @@ -0,0 +1,103 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require_once "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('virtual_tables_data_delete')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +if (count($_GET)>0) { + + //declare variable(s) + $virtual_table_parent_id = ''; + + //get the http get and set them as php variables + $virtual_data_row_uuid = check_str($_GET["virtual_data_row_uuid"]); + $virtual_data_parent_row_uuid = check_str($_GET["virtual_data_parent_row_uuid"]); + $virtual_table_uuid = check_str($_GET["virtual_table_uuid"]); + + //show the results and redirect + require_once "includes/header.php"; + + //get the virtual_table_parent_id from the child table + if (strlen($virtual_table_parent_id) == 0) { + $sql = "select * from v_virtual_tables "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and virtual_table_uuid = '$virtual_table_uuid' "; + $prep_statement = $db->prepare($sql); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach ($result as &$row) { + $virtual_table_parent_id = $row["virtual_table_parent_id"]; + } + } + + //delete the child data + $sql = "delete from v_virtual_table_data "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and virtual_data_parent_row_uuid = '$virtual_data_row_uuid' "; + $db->exec(check_sql($sql)); + unset($sql); + + //delete the data + $sql = "delete from v_virtual_table_data "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and virtual_data_row_uuid = '$virtual_data_row_uuid' "; + $db->exec(check_sql($sql)); + unset($sql); + + //mark the the item as deleted and who deleted it + //$sql = "update v_virtual_table_data set "; + //$sql .= "virtual_data_del_date = now(), "; + //$sql .= "virtual_data_del_user = '".$_SESSION["username"]."' "; + //$sql .= "where domain_uuid = '$domain_uuid' "; + //$sql .= "and virtual_data_row_uuid = '$virtual_data_row_uuid' "; + //$db->exec(check_sql($sql)); + //$lastinsertid = $db->lastInsertId($id); + //unset($sql); + + //set the meta redirect + if (strlen($virtual_data_parent_row_uuid) == 0) { + echo "\n"; + } + else { + echo "\n"; + } + + //show a message to the user before the redirect + echo "
\n"; + echo "Delete Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; +} + +?> \ No newline at end of file diff --git a/app/virtual_tables/v_virtual_table_data_edit.php b/app/virtual_tables/v_virtual_table_data_edit.php new file mode 100644 index 0000000000..493ff7bf5a --- /dev/null +++ b/app/virtual_tables/v_virtual_table_data_edit.php @@ -0,0 +1,982 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('virtual_tables_data_add') || permission_exists('virtual_tables_data_edit')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +//set http get variables to php variables + $search_all = check_str($_GET["search_all"]); + $virtual_table_uuid = check_str($_GET["virtual_table_uuid"]); + if (strlen($_GET["virtual_data_row_uuid"])>0) { //update + $virtual_data_row_uuid = check_str($_GET["virtual_data_row_uuid"]); + $action = "update"; + } + else { + if (strlen($search_all) > 0) { + $action = "update"; + } + else { + $action = "add"; + } + } + if (strlen($_GET["id"]) > 0) { + $virtual_table_uuid = check_str($_GET["id"]); + } + if (strlen($_GET["virtual_data_parent_row_uuid"])>0) { + $virtual_data_parent_row_uuid = check_str($_GET["virtual_data_parent_row_uuid"]); + } + +//get virtual table information + $sql = ""; + $sql .= "select * from v_virtual_tables "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and virtual_table_uuid = '$virtual_table_uuid' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach ($result as &$row) { + $virtual_table_category = $row["virtual_table_category"]; + $virtual_table_label = $row["virtual_table_label"]; + $virtual_table_name = $row["virtual_table_name"]; + $virtual_table_auth = $row["virtual_table_auth"]; + $virtual_table_captcha = $row["virtual_table_captcha"]; + $virtual_table_parent_id = $row["virtual_table_parent_id"]; + $virtual_table_description = $row["virtual_table_description"]; + break; //limit to 1 row + } + unset ($prep_statement); + +//process the data submitted to by the html form + if (count($_POST)>0) { //add + $virtual_table_uuid = check_str($_POST["virtual_table_uuid"]); + $virtual_table_name = check_str($_POST["virtual_table_name"]); + $rcount = check_str($_POST["rcount"]); + + //get the field information + $db_field_name_array = array(); + $db_value_array = array(); + $db_names .= "
\n"; + echo " \n"; + echo " \n"; + + if (strlen($virtual_data_parent_row_uuid) == 0) { + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + } + else { + echo " \n"; + } + echo " \n"; + echo "
\n"; + echo " $virtual_table_label \n"; + if ($action == "add") { + echo " Add\n"; + } + else { + echo "Edit\n"; + } + echo " \n"; + echo "      \n"; + if ($action == "update" && permission_exists('virtual_tables_data_edit')) { + echo " \n"; + //echo " \n"; + } + echo "
\n"; + echo " $virtual_table_description\n"; + echo "
\n"; + echo "
\n"; + echo "
\n"; + + if ($action == "update" && permission_exists('virtual_tables_data_edit')) { + //echo " \n"; + if (strlen($previous_virtual_data_row_uuid) == 0) { + echo " \n"; + } + else { + echo " \n"; + } + echo " \n"; + if (strlen($next_virtual_data_row_uuid) == 0) { + echo " \n"; + } + else { + echo " \n"; + } + //echo " \n"; + } + echo "    "; + echo "    "; + echo "    "; + echo "
\n"; + echo " \n"; + //echo " \n"; + //echo " \n"; + //echo " \n"; + echo " \n"; + echo " \n"; + echo "\n"; + echo " \n"; + echo "\n"; + //echo " \n"; + //echo " \n"; + echo " \n"; + echo "
\n"; + +//begin the div and table that will hold the html form + echo "
"; + echo "\n"; + +//determine if a file should be uploaded + $sql = "SELECT * FROM v_virtual_table_fields "; + $sql .= "where domain_uuid = '$domain_uuid ' "; + $sql .= "and virtual_table_uuid = '$virtual_table_uuid ' "; + $sql .= "and virtual_field_type = 'uploadimage' "; + $sql .= "or domain_uuid = '$domain_uuid ' "; + $sql .= "and virtual_table_uuid = '$virtual_table_uuid ' "; + $sql .= "and virtual_field_type = 'upload_file' "; + $prep_statement = $db->prepare($sql); + $prep_statement->execute(); + if (count($prep_statement->fetchAll(PDO::FETCH_NAMED)) > 0) { + echo "\n"; + echo "\n"; + } + else { + echo "\n"; + } + +//get the table fields and then display them + $sql = ""; + $sql .= "select * from v_virtual_table_fields "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and virtual_table_uuid = '$virtual_table_uuid' "; + $sql .= "order by virtual_field_column asc, virtual_field_order asc "; + $prep_statement = $db->prepare($sql); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + $result_count = count($result); + + echo "\n"; + echo "\n"; + + if ($result_count == 0) { //no results + echo "\n"; + } + else { //received results + $x=1; + $virtual_field_column_previous = ''; + $column_table_cell_status = ''; + foreach($result as $row) { + //handle more than one column + $virtual_field_column = $row[virtual_field_column]; + //echo "\n"; + if ($virtual_field_column != $virtual_field_column_previous) { + $column_table_cell_status = 'open'; + //do the following except for the first time through the loop + if ($x != 1) { + //close the table + echo "\n"; + echo "\n"; + echo "
 
\n"; + //close the row + echo "\n"; + } + //open a new row + echo "\n"; + //start a table in the new row + echo "\n"; + } + + //display the fields + if ($row['virtual_field_type'] != "hidden"){ + switch ($row['virtual_field_type']) { + case "add_user": + break; + case "add_date": + break; + case "mod_user": + break; + case "mod_date": + break; + default: + echo "\n"; + if ($row['virtual_field_type'] == "label") { + echo "\n"; + } + else { + if ($row['virtual_field_required'] == "yes") { + echo "\n"; + } + } + } + switch ($row['virtual_field_type']) { + case "checkbox": + echo "\n"; + break; + case "text": + echo "\n"; + break; + case "email": + echo "\n"; + break; + case "label": + break; + case "password": + echo "\n"; + break; + case "pin_number": + echo "\n"; + break; + case "hidden": + echo "\n"; + echo "\n"; + break; + case "url": + echo "\n"; + break; + case "date": + echo "\n"; + break; + case "truefalse": + //checkbox + echo "\n"; + break; + case "textarea": + echo "\n"; + break; + case "radiobutton": + echo "\n"; + break; + case "select": + echo "\n"; + break; + case "ipv4": + //max 15 + echo "\n"; + break; + case "ipv6": + //maximum number of characters 39 + echo "\n"; + break; + case "phone": + $tmp_phone = $data_row[$row['virtual_field_name']]; + $tmp_phone = format_phone($tmp_phone); + echo "\n"; + break; + case "money": + echo "\n"; + break; + case "add_user": + //echo "\n"; + break; + case "add_date": + //echo "\n"; + break; + case "mod_user": + //echo "\n"; + break; + case "mod_date": + //echo "\n"; + break; + case "uploadimage": + if (strlen($data_row[$row['virtual_field_name']]) > 0) { + echo "\n"; + } + else { + echo "\n"; + } + break; + case "upload_file": + if (strlen($data_row[$row['virtual_field_name']]) > 0) { + echo "\n"; + } + else { + echo "\n"; + } + + break; + default: + echo "\n"; + } + if ($row['virtual_field_type'] != "hidden"){ + echo "\n"; + } + + //set the current value to the previous value + $virtual_field_column_previous = $virtual_field_column; + + $x++; + + } //end foreach + unset($sql, $result, $row_count); + + if ($column_table_cell_status == 'open') { + $column_table_cell_status = 'closed'; + } + } //end if results + + echo " \n"; + echo " \n"; + echo " \n"; + echo "
\n"; + echo " ".$row['virtual_field_label']."\n"; + echo "\n"; + } + else { + echo "\n"; + } + echo "".$row['virtual_field_label'].": \n"; + echo "\n"; + echo "\n"; + if (strlen($data_row[$row['virtual_field_name']])>0) { + echo "\n"; + } + else { + echo "\n"; + } + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + //echo "\n"; + //echo ""; + //echo ""; + //echo "\n"; + //echo " \n"; + //echo ""; + //echo "
"; + //echo "\n"; + echo "
\n"; + echo "\n"; + echo "\n"; + echo "\n"; + switch ($row['virtual_field_name']) { + case "true": + echo "\n"; + echo "\n"; + break; + case "false": + echo "\n"; + echo "\n"; + break; + default: + echo "\n"; + echo "\n"; + } + + echo "\n"; + echo "
TrueFalseTrueFalseTrueFalse
\n"; + echo "
\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + $sqlselect = "SELECT virtual_data_types_name, virtual_data_types_value "; + $sqlselect .= "FROM v_virtual_table_data_types_name_value "; + $sqlselect .= "where domain_uuid = '".$domain_uuid."' "; + $sqlselect .= "and virtual_table_field_uuid = '".$row[virtual_table_field_uuid]."' "; + $prep_statement_2 = $db->prepare($sqlselect); + $prep_statement_2->execute(); + $result2 = $prep_statement_2->fetchAll(PDO::FETCH_NAMED); + $result_count2 = count($result2); + + echo ""; + if ($result_count > 0) { + foreach($result2 as $row2) { + echo ""; + } //end foreach + } //end if results + unset($sqlselect, $result2, $result_count2); + echo "
".$row2["virtual_data_types_name"].""; } else { echo ">"; } + echo "
"; + //echo "\n"; + echo "
\n"; + echo "\n"; + + $sqlselect = "SELECT virtual_data_types_name, virtual_data_types_value "; + $sqlselect .= "FROM v_virtual_table_data_types_name_value "; + $sqlselect .= "where domain_uuid = '".$domain_uuid."' "; + $sqlselect .= "and virtual_table_field_uuid = '".$row[virtual_table_field_uuid]."' "; + $prep_statement_2 = $db->prepare($sqlselect); + $prep_statement_2->execute(); + $result2 = $prep_statement_2->fetchAll(PDO::FETCH_NAMED); + $result_count2 = count($result2); + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + //echo "\n"; + echo "\n"; + echo "\n"; + //echo "\n"; + echo "\n"; + echo "\n"; + //echo "\n"; + echo "\n"; + echo "\n"; + //echo "\n"; + echo "\n"; + + echo "
"; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + + echo "
"; + echo "".$data_row[$row['virtual_field_name']].""; + echo ""; + echo "\n"; + //echo "\n"; + echo "
"; + if (file_exists($imagetempdir.$data_row[$row['virtual_field_name']])) { + echo ""; + } + else { + echo ""; + } + echo "
"; + echo "
"; + echo "
\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo "
"; + echo "".$data_row[$row['virtual_field_name']].""; + echo ""; + echo "\n"; + echo "
"; + echo ""; + echo "
\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "
\n"; + if ($action == "add" && permission_exists('virtual_tables_data_add')) { + echo " \n"; + } + if ($action == "update" && permission_exists('virtual_tables_data_edit')) { + echo " \n"; + echo " \n"; + } + echo "
\n"; + + echo " \n"; + echo " \n"; + echo "\n"; + + if ($action == "update" && permission_exists('virtual_tables_data_edit')) { + //get the child virtual_table_uuid and use it to show the list of data + $sql = "select * from v_virtual_tables "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and virtual_table_parent_id = '$virtual_table_uuid' "; + $prep_statement = $db->prepare($sql); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach ($result as &$row) { + echo "\n"; + echo " \n"; + echo "
"; + $_GET["id"] = $row["virtual_table_uuid"]; + $virtual_table_label = $row["virtual_table_label"]; + $_GET["virtual_data_parent_row_uuid"] = $virtual_data_row_uuid; + + //show button + //echo "\n"; + + //show list + require_once "v_virtual_table_data_view.php"; + echo " "; + echo " "; + } + } + echo "\n"; + echo "
\n"; + +require_once "includes/footer.php"; +?> diff --git a/app/virtual_tables/v_virtual_table_data_types_name_value.php b/app/virtual_tables/v_virtual_table_data_types_name_value.php new file mode 100644 index 0000000000..b039b61a85 --- /dev/null +++ b/app/virtual_tables/v_virtual_table_data_types_name_value.php @@ -0,0 +1,151 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require_once "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('virtual_tables_edit')) { + //access granted +} +else { + echo "access denied"; + exit; +} +require_once "includes/header.php"; +require_once "includes/paging.php"; + +//get the http values + $order_by = $_GET["order_by"]; + $order = $_GET["order"]; + +//show the content + echo "
"; + echo "\n"; + echo "\n"; + echo " "; + echo ""; + echo "
\n"; + echo "
"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "
Virtual Table Data Types Name Value List 
\n"; + echo "Stores the name and value pairs.

\n"; + echo "
\n"; + + //$sql = ""; + //$sql .= " select * from v_virtual_table_data_types_name_value "; + //$sql .= " where domain_uuid = '$domain_uuid' "; + //$sql .= " and virtual_table_field_uuid = '$virtual_table_field_uuid' "; + //if (strlen($order_by)> 0) { $sql .= "order by $order_by $order "; } + //$prep_statement = $db->prepare(check_sql($sql)); + //$prep_statement->execute(); + //$result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + //$num_rows = count($result); + //unset ($prep_statement, $result, $sql); + //$rows_per_page = 10; + //$param = ""; + //$page = $_GET['page']; + //if (strlen($page) == 0) { $page = 0; $_GET['page'] = 0; } + //list($paging_controls, $rows_per_page, $var_3) = paging($num_rows, $param, $rows_per_page); + //$offset = $rows_per_page * $page; + + $sql = ""; + $sql .= " select * from v_virtual_table_data_types_name_value "; + $sql .= " where domain_uuid = '$domain_uuid' "; + $sql .= " and virtual_table_field_uuid = '$virtual_table_field_uuid' "; + if (strlen($order_by)> 0) { $sql .= "order by $order_by $order "; } + //$sql .= " limit $rows_per_page offset $offset "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + $result_count = count($result); + unset ($prep_statement, $sql); + + $c = 0; + $row_style["0"] = "row_style0"; + $row_style["1"] = "row_style1"; + + echo "
\n"; + echo "\n"; + echo "\n"; + echo th_order_by('virtual_data_types_name', 'Name', $order_by, $order); + echo th_order_by('virtual_data_types_value', 'Value', $order_by, $order); + echo "\n"; + echo "\n"; + + if ($result_count > 0) { + foreach($result as $row) { + echo "\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "\n"; + if ($c==0) { $c=1; } else { $c=0; } + } //end foreach + unset($sql, $result, $row_count); + } //end if results + + echo "\n"; + echo "\n"; + echo "\n"; + + echo "
\n"; + echo " $v_link_label_add\n"; + echo "
".$row[virtual_data_types_name]."".$row[virtual_data_types_value]."\n"; + echo " $v_link_label_edit\n"; + echo " $v_link_label_delete\n"; + //echo " \n"; + //echo " \n"; + echo "
\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + //echo " \n"; + echo " \n"; + echo " \n"; + echo "
  $paging_controls\n"; + echo " $v_link_label_add\n"; + echo "
\n"; + echo "
"; + echo "
"; + echo "

"; + echo "

"; + + echo "
"; + echo "
"; + echo "

"; + +//show the footer + require_once "includes/footer.php"; + +?> diff --git a/app/virtual_tables/v_virtual_table_data_types_name_value_delete.php b/app/virtual_tables/v_virtual_table_data_types_name_value_delete.php new file mode 100644 index 0000000000..58cf226c33 --- /dev/null +++ b/app/virtual_tables/v_virtual_table_data_types_name_value_delete.php @@ -0,0 +1,64 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require_once "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('virtual_tables_delete')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +//get the http values + if (count($_GET)>0) { + $id = check_str($_GET["id"]); + $virtual_table_uuid = check_str($_GET["virtual_table_uuid"]); + $virtual_table_field_uuid = check_str($_GET["virtual_table_field_uuid"]); + } + +//delete the data + if (strlen($id)>0) { + $sql = ""; + $sql .= "delete from v_virtual_table_data_types_name_value "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and virtual_table_data_types_name_value_uuid = '$id' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + unset($sql); + } + +//redirect the user + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Delete Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + +?> \ No newline at end of file diff --git a/app/virtual_tables/v_virtual_table_data_types_name_value_edit.php b/app/virtual_tables/v_virtual_table_data_types_name_value_edit.php new file mode 100644 index 0000000000..411b9473f5 --- /dev/null +++ b/app/virtual_tables/v_virtual_table_data_types_name_value_edit.php @@ -0,0 +1,232 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require_once "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('virtual_tables_edit')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +//action add or update + if (isset($_REQUEST["id"])) { + $action = "update"; + $virtual_table_data_types_name_value_uuid = check_str($_REQUEST["id"]); + } + else { + $action = "add"; + } + +if (strlen($_GET["virtual_table_field_uuid"]) > 0) { + $virtual_table_field_uuid = check_str($_GET["virtual_table_field_uuid"]); +} + +//POST to PHP variables + if (count($_POST)>0) { + //$domain_uuid = check_str($_POST["domain_uuid"]); + $virtual_data_types_name = check_str($_POST["virtual_data_types_name"]); + $virtual_data_types_value = check_str($_POST["virtual_data_types_value"]); + $virtual_table_uuid = $_REQUEST["virtual_table_uuid"]; + $virtual_table_field_uuid = $_REQUEST["virtual_table_field_uuid"]; + } + +if (count($_POST)>0 && strlen($_POST["persistformvar"]) == 0) { + + $msg = ''; + if ($action == "update") { + $virtual_table_data_types_name_value_uuid = check_str($_POST["virtual_table_data_types_name_value_uuid"]); + } + + //check for all required data + if (strlen($domain_uuid) == 0) { $msg .= "Please provide: domain_uuid
\n"; } + if (strlen($virtual_table_uuid) == 0) { $msg .= "Please provide: virtual_table_uuid
\n"; } + if (strlen($virtual_table_field_uuid) == 0) { $msg .= "Please provide: virtual_table_field_uuid
\n"; } + if (strlen($virtual_data_types_name) == 0) { $msg .= "Please provide: Name
\n"; } + if (strlen($virtual_data_types_value) == 0) { $msg .= "Please provide: Value
\n"; } + if (strlen($msg) > 0 && strlen($_POST["persistformvar"]) == 0) { + require_once "includes/header.php"; + require_once "includes/persistformvar.php"; + echo "
\n"; + echo "
\n"; + echo $msg."
"; + echo "
\n"; + persistformvar($_POST); + echo "
\n"; + require_once "includes/footer.php"; + return; + } + + //add or update the database + if ($_POST["persistformvar"] != "true") { + if ($action == "add") { + $sql = "insert into v_virtual_table_data_types_name_value "; + $sql .= "("; + $sql .= "virtual_table_data_types_name_value_uuid, "; + $sql .= "domain_uuid, "; + $sql .= "virtual_table_uuid, "; + $sql .= "virtual_table_field_uuid, "; + $sql .= "virtual_data_types_name, "; + $sql .= "virtual_data_types_value "; + $sql .= ") "; + $sql .= "values "; + $sql .= "("; + $sql .= "'".uuid()."', "; + $sql .= "'".$_SESSION['domain_uuid']."', "; + $sql .= "'$virtual_table_uuid', "; + $sql .= "'$virtual_table_field_uuid', "; + $sql .= "'$virtual_data_types_name', "; + $sql .= "'$virtual_data_types_value' "; + $sql .= ")"; + $db->exec(check_sql($sql)); + unset($sql); + + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Add Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + } //if ($action == "add") + + if ($action == "update") { + $sql = "update v_virtual_table_data_types_name_value set "; + $sql .= "virtual_data_types_name = '$virtual_data_types_name', "; + $sql .= "virtual_data_types_value = '$virtual_data_types_value' "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and virtual_table_uuid = '$virtual_table_uuid' "; + $sql .= "and virtual_table_field_uuid = '$virtual_table_field_uuid' "; + $sql .= "and virtual_table_data_types_name_value_uuid = '$virtual_table_data_types_name_value_uuid' "; + $db->exec(check_sql($sql)); + unset($sql); + + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Update Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + } //if ($action == "update") + } //if ($_POST["persistformvar"] != "true") +} //(count($_POST)>0 && strlen($_POST["persistformvar"]) == 0) + +//pre-populate the form + if (count($_GET)>0 && $_POST["persistformvar"] != "true") { + $virtual_table_uuid = $_GET["virtual_table_uuid"]; + $virtual_table_field_uuid = $_GET["virtual_table_field_uuid"]; + $virtual_table_data_types_name_value_uuid = $_GET["id"]; + $sql = ""; + $sql .= "select * from v_virtual_table_data_types_name_value "; + $sql .= "where domain_uuid = '$domain_uuid' "; + //$sql .= "and virtual_table_uuid = '$virtual_table_uuid' "; + $sql .= "and virtual_table_field_uuid = '$virtual_table_field_uuid' "; + $sql .= "and virtual_table_data_types_name_value_uuid = '$virtual_table_data_types_name_value_uuid' "; + + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach ($result as &$row) { + $virtual_data_types_name = $row["virtual_data_types_name"]; + $virtual_data_types_value = $row["virtual_data_types_value"]; + break; //limit to 1 row + } + unset ($prep_statement); + } + +//show the header + require_once "includes/header.php"; + +//show the content + echo "
"; + echo "\n"; + echo "\n"; + echo " "; + echo " "; + echo "
\n"; + echo "
"; + + echo "
\n"; + echo "
\n"; + echo "\n"; + + echo "\n"; + if ($action == "add") { + echo "\n"; + } + if ($action == "update") { + echo "\n"; + } + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo " \n"; + echo " \n"; + echo " "; + echo "
Virtual Table Data Types Name Value AddVirtual Table Data Types Name Value Edit
\n"; + echo "Stores the name and value pairs.

\n"; + echo "
\n"; + echo " Name:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the name.\n"; + echo "
\n"; + echo " Value:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the value.\n"; + echo "
\n"; + echo " \n"; + echo " \n"; + if ($action == "update") { + echo " \n"; + } + echo " \n"; + echo "
"; + echo ""; + + echo "
"; + echo "
"; + +require_once "includes/footer.php"; +?> diff --git a/app/virtual_tables/v_virtual_table_data_view.php b/app/virtual_tables/v_virtual_table_data_view.php new file mode 100644 index 0000000000..ac68a3a5c8 --- /dev/null +++ b/app/virtual_tables/v_virtual_table_data_view.php @@ -0,0 +1,399 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require_once "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('virtual_tables_data_view')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +if (strlen($_GET["id"]) > 0) { + $virtual_table_uuid = check_str($_GET["id"]); + if (strlen($_GET["virtual_data_parent_row_uuid"])>0) { + $virtual_data_parent_row_uuid = $_GET["virtual_data_parent_row_uuid"]; + } + $search_all = check_str($_GET["search_all"]); +} + +//used for changing the order + $order_by = $_GET["order_by"]; + $order = $_GET["order"]; + +//used to alternate colors when paging + $c = 0; + $row_style["0"] = "row_style0"; + $row_style["1"] = "row_style1"; + +//show the header + require_once "includes/header.php"; + +//get the information about the virtual table by using the id + $sql = ""; + $sql .= "select * from v_virtual_tables "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and virtual_table_uuid = '$virtual_table_uuid' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_ASSOC); + foreach ($result as &$row) { + $virtual_table_category = $row["virtual_table_category"]; + $virtual_table_label = $row["virtual_table_label"]; + $virtual_table_name = $row["virtual_table_name"]; + $virtual_table_auth = $row["virtual_table_auth"]; + $virtual_table_captcha = $row["virtual_table_captcha"]; + $virtual_table_parent_uuid = $row["virtual_table_parent_uuid"]; + $virtual_table_description = $row["virtual_table_description"]; + break; //limit to 1 row + } + unset ($prep_statement); + +//get the field information + $db_field_name_array = array(); + $db_value_array = array(); + $db_names .= "\n"; + $sql = "select * from v_virtual_table_fields "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and virtual_table_uuid = '$virtual_table_uuid' "; + $sql .= "order by virtual_field_order asc "; + $prep_statement = $db->prepare($sql); + $prep_statement->execute(); + $result_names = $prep_statement->fetchAll(PDO::FETCH_ASSOC); + $result_count = count($result); + foreach($result_names as $row) { + $virtual_field_label = $row["virtual_field_label"]; + $virtual_field_name = $row["virtual_field_name"]; + $virtual_field_type = $row["virtual_field_type"]; + $virtual_field_value = $row["virtual_field_value"]; + $virtual_field_list_hidden = $row["virtual_field_list_hidden"]; + $virtual_field_column = $row["virtual_field_column"]; + $virtual_field_required = $row["virtual_field_required"]; + $virtual_field_order = $row["virtual_field_order"]; + $virtual_field_order_tab = $row["virtual_field_order_tab"]; + $virtual_field_description = $row["virtual_field_description"]; + + $name_array[$virtual_field_name]['virtual_field_label'] = $row["virtual_field_label"]; + $name_array[$virtual_field_name]['virtual_field_type'] = $row["virtual_field_type"]; + $name_array[$virtual_field_name]['virtual_field_list_hidden'] = $row["virtual_field_list_hidden"]; + $name_array[$virtual_field_name]['virtual_field_column'] = $row["virtual_field_column"]; + $name_array[$virtual_field_name]['virtual_field_required'] = $row["virtual_field_required"]; + $name_array[$virtual_field_name]['virtual_field_order'] = $row["virtual_field_order"]; + $name_array[$virtual_field_name]['virtual_field_order_tab'] = $row["virtual_field_order_tab"]; + $name_array[$virtual_field_name]['virtual_field_description'] = $row["virtual_field_description"]; + } + unset($sql, $prep_statement, $row); + $fieldcount = count($name_array); + +//get the data + $sql = ""; + $sql .= "select * from v_virtual_table_data "; + $sql .= "where domain_uuid = '".$domain_uuid."' "; + if (strlen($search_all) == 0) { + $sql .= "and virtual_table_uuid = '$virtual_table_uuid' "; + if (strlen($virtual_data_parent_row_uuid) > 0) { + $sql .= " and virtual_data_parent_row_uuid = '$virtual_data_parent_row_uuid' "; + } + } + else { + $sql .= "and virtual_data_row_uuid in ("; + $sql .= "select virtual_data_row_uuid from v_virtual_table_data \n"; + $sql .= "where domain_uuid = '".$domain_uuid."' "; + $sql .= "and virtual_table_uuid = '$virtual_table_uuid' "; + if (strlen($virtual_data_parent_row_uuid) == 0) { + $tmp_digits = preg_replace('{\D}', '', $search_all); + if (is_numeric($tmp_digits) && strlen($tmp_digits) > 5) { + if (strlen($tmp_digits) == '11' ) { + $sql .= "and virtual_data_field_value like '%".substr($tmp_digits, -10)."%' \n"; + } + else { + $sql .= "and virtual_data_field_value like '%$tmp_digits%' \n"; + } + } + else { + $sql .= "and virtual_data_field_value like '%$search_all%' \n"; + } + } + else { + $sql .= "and virtual_data_parent_row_uuid = '$virtual_data_parent_row_uuid' "; + } + $sql .= ")\n"; + } + $sql .= "limit 20000\n"; + $prep_statement = $db->prepare($sql); + $prep_statement->execute(); + $result_values = $prep_statement->fetchAll(PDO::FETCH_ASSOC); + foreach($result_values as $row) { + //set a php variable + $virtual_field_name = $row[virtual_field_name]; + $virtual_data_row_uuid = $row[virtual_data_row_uuid]; + + //restructure the data by setting it the value_array + $value_array[$virtual_data_row_uuid][$virtual_field_name] = $row[virtual_data_field_value]; + $value_array[$virtual_data_row_uuid]['virtual_table_uuid'] = $row[virtual_table_uuid]; + $value_array[$virtual_data_row_uuid]['virtual_data_row_uuid'] = $row[virtual_data_row_uuid]; + $value_array[$virtual_data_row_uuid]['virtual_table_parent_uuid'] = $row[virtual_table_parent_uuid]; + $value_array[$virtual_data_row_uuid]['virtual_data_parent_row_uuid'] = $row[virtual_data_parent_row_uuid]; + } + $num_rows = count($value_array); + +//create the connection to the memory dbase_add_record + try { + $db_memory = new PDO('sqlite::memory:'); //sqlite 3 + } + catch (PDOException $error) { + print "error: " . $error->getMessage() . "
"; + die(); + } + +//create a memory database and add the fields to the table + $sql = "CREATE TABLE memory_table "; + $sql .= "("; + $sql .= "'id' INTEGER PRIMARY KEY, "; + $sql .= "'virtual_table_uuid' TEXT, "; + $sql .= "'virtual_data_row_uuid' TEXT, "; + $sql .= "'virtual_table_parent_uuid' TEXT, "; + $sql .= "'virtual_data_parent_row_uuid' TEXT, "; + foreach($result_names as $row) { + if ($row["virtual_field_type"] != "label") { + if ($row["virtual_field_name"] != "domain_uuid") { + //$row["virtual_field_label"]; + //$row["virtual_field_name"] + //$row["virtual_field_type"]; + if ($row["virtual_field_name"] == "number") { + $sql .= "'".$row["virtual_field_name"]."' NUMERIC, "; + } + else { + $sql .= "'".$row["virtual_field_name"]."' TEXT, "; + } + } + } + } + $sql .= "'domain_uuid' TEXT "; + $sql .= ");"; + //echo "$sql

\n"; + $prep_statement = $db_memory->prepare($sql); + $prep_statement->execute(); + unset ($prep_statement, $sql); + +//list the values from the array + $x = 0; + foreach($value_array as $array) { + //insert the data into the memory table + $sql = "insert into memory_table "; + $sql .= "("; + $sql .= "'virtual_table_uuid', "; + $sql .= "'virtual_data_row_uuid', "; + $sql .= "'virtual_table_parent_uuid', "; + $sql .= "'virtual_data_parent_row_uuid', "; + //foreach($array as $key => $value) { + // $sql .= "'$key', "; + foreach($result_names as $row) { + $virtual_field_name = $row["virtual_field_name"]; + $sql .= "'$virtual_field_name', "; + } + $sql .= "'domain_uuid' "; + $sql .= ")"; + $sql .= "values "; + $sql .= "("; + $sql .= "'".$array['virtual_table_uuid']."', "; + $sql .= "'".$array['virtual_data_row_uuid']."', "; + $sql .= "'".$array['virtual_table_parent_uuid']."', "; + $sql .= "'".$array['virtual_data_parent_row_uuid']."', "; + //foreach($array as $key => $value) { + // $sql .= "'$value', "; + foreach($result_names as $row) { + $virtual_field_name = $row["virtual_field_name"]; + $sql .= "'".check_str($array[$virtual_field_name])."', "; + } + $sql .= "'$domain_uuid' "; + $sql .= ");"; + //echo "$sql

\n"; + $db_memory->exec(check_sql($sql)); + unset($sql); + unset($array); + //unset the row of data + unset($value_array[$x]); + //increment the value + $x++; + } + +//set the title and description of the virtual table + echo "
\n"; + echo "\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "
$virtual_table_label
\n"; + echo " $virtual_table_description\n"; + echo "
\n"; + if (strlen($virtual_data_parent_row_uuid) == 0) { + $search_all = str_replace("''", "'", $search_all); + echo "
\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "
\n"; + } + echo "
\n"; + echo "
"; + +//prepare for paging the results + require_once "includes/paging.php"; + $rows_per_page = 100; + $param = ""; + $page = $_GET['page']; + if (strlen($page) == 0) { $page = 0; $_GET['page'] = 0; } + if (strlen($virtual_table_parent_uuid) > 0) { + $param = "&id=$virtual_table_parent_uuid&virtual_data_row_uuid=$virtual_data_row_uuid"; + } + else { + $param = "&id=$virtual_table_uuid&virtual_data_row_uuid=$virtual_data_row_uuid"; + } + list($paging_controls, $rows_per_page, $var_3) = paging($num_rows, $param, $rows_per_page); + $offset = $rows_per_page * $page; + +//list the data in the database + $sql = "select * from memory_table \n"; + $sql .= "where domain_uuid = '$domain_uuid' \n"; + $sql .= "limit $rows_per_page offset $offset \n"; + //$sql .= "order by virtual_field_order asc \n"; + //echo "
\n";
+	//echo $sql;
+	//echo "
\n"; + $prep_statement = $db_memory->prepare($sql); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_ASSOC); + +//begin the list + echo "\n"; + echo "\n"; + foreach($result_names as $row) { + if ($row['virtual_field_list_hidden'] != "hide") { + echo "\n"; + } + } + echo "\n"; + echo "\n"; + + $db_values = ''; + $x = 0; + foreach ($result as &$row) { + echo "\n"; + foreach($result_names as $row2) { + $virtual_field_name = $row2[virtual_field_name]; + + //get the values from the array and set as php variables + $virtual_field_label = $name_array[$virtual_field_name]['virtual_field_label']; + $virtual_field_type = $name_array[$virtual_field_name]['virtual_field_type']; + $virtual_field_list_hidden = $name_array[$virtual_field_name]['virtual_field_list_hidden']; + $virtual_field_column = $name_array[$virtual_field_name]['virtual_field_column']; + $virtual_field_required = $name_array[$virtual_field_name]['virtual_field_required']; + $virtual_field_order = $name_array[$virtual_field_name]['virtual_field_order']; + $virtual_field_order_tab = $name_array[$virtual_field_name]['virtual_field_order_tab']; + $virtual_field_description = $name_array[$virtual_field_name]['virtual_field_description']; + + if ($virtual_field_list_hidden != "hide") { + switch ($virtual_field_type) { + case "textarea": + $tmp_value = str_replace("\n", "
\n", $row[$virtual_field_name]); + echo "\n"; + unset($tmp_value); + break; + case "email": + echo "\n"; + break; + case "phone": + $tmp_phone = $row[$virtual_field_name]; + $tmp_phone = format_phone($tmp_phone); + echo "\n"; + break; + case "url": + $url = $row[$virtual_field_name]; + if (substr($url,0,4) != "http") { + $url = 'http://'.$url; + } + echo "\n"; + break; + default: + echo "\n"; + break; + } + } + } + + echo "\n"; + + echo "\n"; + if ($c==0) { $c=1; } else { $c=0; } + } + +//show the paging tools and final add button + echo "\n"; + echo "\n"; + echo "\n"; + + echo "
  ".$row['virtual_field_label']."  \n"; + if (permission_exists('virtual_tables_data_add')) { + echo " $v_link_label_add\n"; + } + echo "
".$tmp_value." ".$row[$virtual_field_name]." ".$tmp_phone." ".$row[$virtual_field_name]." ".$row[$virtual_field_name]." \n"; + if (permission_exists('virtual_tables_data_edit')) { + if (strlen($virtual_data_parent_row_uuid) == 0) { + echo " $v_link_label_edit\n"; + } + else { + echo " $v_link_label_edit\n"; + } + } + if (permission_exists('virtual_tables_data_delete')) { + echo" $v_link_label_delete\n"; + } + echo "
\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "
 $paging_controls\n"; + if (permission_exists('virtual_tables_data_add')) { + echo " $v_link_label_add\n"; + } + echo "
\n"; + echo "
\n"; + echo "

\n"; + echo "
"; + +//show the header + echo "

"; + require_once "includes/footer.php"; + +?> diff --git a/app/virtual_tables/v_virtual_table_fields.php b/app/virtual_tables/v_virtual_table_fields.php new file mode 100644 index 0000000000..ef7a8745ec --- /dev/null +++ b/app/virtual_tables/v_virtual_table_fields.php @@ -0,0 +1,158 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require_once "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('virtual_tables_view')) { + //access granted +} +else { + echo "access denied"; + exit; +} +require_once "includes/header.php"; +require_once "includes/paging.php"; + +$order_by = $_GET["order_by"]; +$order = $_GET["order"]; + +//show the content + echo "
"; + echo "\n"; + echo "\n"; + echo " "; + echo ""; + echo "
\n"; + echo "
"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "
Virtual Table Field List 
\n"; + echo "Lists the fields in the virtual database.

\n"; + echo "
\n"; + + if (strlen($order_by) == 0) { + $order_by = 'virtual_field_order'; + $order = 'asc'; + } + + $sql = ""; + $sql .= " select * from v_virtual_table_fields "; + $sql .= " where domain_uuid = '$domain_uuid' "; + $sql .= " and virtual_table_uuid = '$virtual_table_uuid' "; + if (strlen($order_by)> 0) { $sql .= "order by $order_by $order "; } + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + $result_count = count($result); + unset ($prep_statement, $sql); + + $c = 0; + $row_style["0"] = "row_style0"; + $row_style["1"] = "row_style1"; + + echo "
\n"; + echo "\n"; + + echo "\n"; + echo th_order_by('virtual_field_label', 'Label', $order_by, $order); + echo th_order_by('virtual_field_name', 'Name', $order_by, $order); + echo th_order_by('virtual_field_type', 'Type', $order_by, $order); + echo th_order_by('virtual_field_column', 'Column', $order_by, $order); + echo th_order_by('virtual_field_required', 'Required', $order_by, $order); + echo th_order_by('virtual_field_order', 'Field Order', $order_by, $order); + echo th_order_by('virtual_field_order_tab', 'Tab Order', $order_by, $order); + echo th_order_by('virtual_field_description', 'Description', $order_by, $order); + echo "\n"; + echo "\n"; + + if ($result_count == 0) { + //no results + } + else { //received results + foreach($result as $row) { + echo "\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "\n"; + if ($c==0) { $c=1; } else { $c=0; } + } //end foreach + unset($sql, $result, $row_count); + } //end if results + + echo "\n"; + echo "\n"; + echo "\n"; + + echo "
\n"; + if (permission_exists('virtual_tables_view')) { + echo " $v_link_label_add\n"; + } + echo "
".$row['virtual_field_label']."".$row['virtual_field_name']." ".$row['virtual_field_type']."".$row['virtual_field_column']."".$row['virtual_field_required']."".$row['virtual_field_order']."".$row['virtual_field_order_tab']."".$row['virtual_field_description']." \n"; + if (permission_exists('virtual_tables_edit')) { + echo " $v_link_label_edit\n"; + } + if (permission_exists('virtual_tables_delete')) { + echo " $v_link_label_delete\n"; + } + echo "
\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "
  \n"; + if (permission_exists('virtual_tables_add')) { + echo " $v_link_label_add\n"; + } + echo "
\n"; + echo "
"; + echo "
"; + echo "

"; + echo "

"; + + echo "
"; + echo "
"; + echo "

"; + +//include the footer + require_once "includes/footer.php"; + +?> diff --git a/app/virtual_tables/v_virtual_table_fields_delete.php b/app/virtual_tables/v_virtual_table_fields_delete.php new file mode 100644 index 0000000000..c94cbb6e1f --- /dev/null +++ b/app/virtual_tables/v_virtual_table_fields_delete.php @@ -0,0 +1,63 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require_once "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('virtual_tables_delete')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +//get the http values + if (count($_GET)>0) { + $id = check_str($_GET["id"]); + $virtual_table_uuid = check_str($_GET["virtual_table_uuid"]); + } + +//delete the data + if (strlen($id)>0) { + $sql = ""; + $sql .= "delete from v_virtual_table_fields "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and virtual_table_field_uuid = '$id' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + unset($sql); + } + +//redirect the user + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Delete Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + +?> diff --git a/app/virtual_tables/v_virtual_table_fields_edit.php b/app/virtual_tables/v_virtual_table_fields_edit.php new file mode 100644 index 0000000000..b3bacd6fab --- /dev/null +++ b/app/virtual_tables/v_virtual_table_fields_edit.php @@ -0,0 +1,545 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require_once "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('virtual_tables_add') || permission_exists('virtual_tables_edit')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +//set the action as an add or update +if (isset($_REQUEST["id"])) { + $action = "update"; + $virtual_table_field_uuid = check_str($_REQUEST["id"]); +} +else { + $action = "add"; +} + +//get the http variables + if (strlen($_GET["virtual_table_uuid"]) > 0) { + $virtual_table_uuid = check_str($_GET["virtual_table_uuid"]); + } + +//get the http post variables +if (count($_POST)>0) { + $virtual_field_label = check_str($_POST["virtual_field_label"]); + $virtual_field_name = check_str($_POST["virtual_field_name"]); + $virtual_field_type = check_str($_POST["virtual_field_type"]); + $virtual_field_value = check_str($_POST["virtual_field_value"]); + $virtual_field_list_hidden = check_str($_POST["virtual_field_list_hidden"]); + $virtual_field_column = check_str($_POST["virtual_field_column"]); + $virtual_field_required = check_str($_POST["virtual_field_required"]); + $virtual_field_order = check_str($_POST["virtual_field_order"]); + $virtual_field_order_tab = check_str($_POST["virtual_field_order_tab"]); + $virtual_field_description = check_str($_POST["virtual_field_description"]); +} + +if (count($_POST)>0 && strlen($_POST["persistformvar"]) == 0) { + + $msg = ''; + if ($action == "update") { + $virtual_table_field_uuid = check_str($_POST["virtual_table_field_uuid"]); + } + + //check for all required data + if (strlen($domain_uuid) == 0) { $msg .= "Please provide: domain_uuid
\n"; } + //if (strlen($virtual_field_label) == 0) { $msg .= "Please provide: Label
\n"; } + if (strlen($virtual_field_name) == 0 && $virtual_field_type != "label") { $msg .= "Please provide: Name
\n"; } + if (strlen($virtual_field_type) == 0) { $msg .= "Please provide: Type
\n"; } + //if (strlen($virtual_field_value) == 0) { $msg .= "Please provide: Value
\n"; } + if (strlen($virtual_field_list_hidden) == 0) { $msg .= "Please provide: List Visibility
\n"; } + if (strlen($virtual_field_column) == 0) { $msg .= "Please provide: Column
\n"; } + if (strlen($virtual_field_required) == 0) { $msg .= "Please provide: Required
\n"; } + if (strlen($virtual_field_order) == 0) { $msg .= "Please provide: Field Order
\n"; } + if (strlen($virtual_field_order_tab) == 0) { $msg .= "Please provide: Tab Order
\n"; } + //if (strlen($virtual_field_description) == 0) { $msg .= "Please provide: Description
\n"; } + if (strlen($msg) > 0 && strlen($_POST["persistformvar"]) == 0) { + require_once "includes/header.php"; + require_once "includes/persistformvar.php"; + echo "
\n"; + echo "
\n"; + echo $msg."
"; + echo "
\n"; + persistformvar($_POST); + echo "
\n"; + require_once "includes/footer.php"; + return; + } + + //add or update the database + if ($_POST["persistformvar"] != "true") { + if ($action == "add" && permission_exists('virtual_tables_add')) { + $virtual_table_field_uuid = uuid(); + $sql = "insert into v_virtual_table_fields "; + $sql .= "("; + $sql .= "domain_uuid, "; + $sql .= "virtual_table_uuid, "; + $sql .= "virtual_table_field_uuid, "; + $sql .= "virtual_field_label, "; + $sql .= "virtual_field_name, "; + $sql .= "virtual_field_type, "; + $sql .= "virtual_field_value, "; + $sql .= "virtual_field_list_hidden, "; + $sql .= "virtual_field_column, "; + $sql .= "virtual_field_required, "; + $sql .= "virtual_field_order, "; + $sql .= "virtual_field_order_tab, "; + $sql .= "virtual_field_description "; + $sql .= ")"; + $sql .= "values "; + $sql .= "("; + $sql .= "'$domain_uuid', "; + $sql .= "'$virtual_table_uuid', "; + $sql .= "'$virtual_table_field_uuid', "; + $sql .= "'$virtual_field_label', "; + $sql .= "'$virtual_field_name', "; + $sql .= "'$virtual_field_type', "; + $sql .= "'$virtual_field_value', "; + $sql .= "'$virtual_field_list_hidden', "; + $sql .= "'$virtual_field_column', "; + $sql .= "'$virtual_field_required', "; + $sql .= "'$virtual_field_order', "; + $sql .= "'$virtual_field_order_tab', "; + $sql .= "'$virtual_field_description' "; + $sql .= ")"; + $db->exec(check_sql($sql)); + unset($sql); + + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Add Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + } //if ($action == "add") + + if ($action == "update" && permission_exists('virtual_tables_edit')) { + $sql = "update v_virtual_table_fields set "; + $sql .= "virtual_field_label = '$virtual_field_label', "; + $sql .= "virtual_field_name = '$virtual_field_name', "; + $sql .= "virtual_field_type = '$virtual_field_type', "; + $sql .= "virtual_field_value = '$virtual_field_value', "; + $sql .= "virtual_field_list_hidden = '$virtual_field_list_hidden', "; + $sql .= "virtual_field_column = '$virtual_field_column', "; + $sql .= "virtual_field_required = '$virtual_field_required', "; + $sql .= "virtual_field_order = '$virtual_field_order', "; + $sql .= "virtual_field_order_tab = '$virtual_field_order_tab', "; + $sql .= "virtual_field_description = '$virtual_field_description' "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and virtual_table_uuid = '$virtual_table_uuid'"; + $sql .= "and virtual_table_field_uuid = '$virtual_table_field_uuid' "; + $db->exec(check_sql($sql)); + unset($sql); + + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Update Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + } //if ($action == "update") + } //if ($_POST["persistformvar"] != "true") +} //(count($_POST)>0 && strlen($_POST["persistformvar"]) == 0) + +//pre-populate the form + if (count($_GET)>0 && $_POST["persistformvar"] != "true") { + $virtual_table_uuid = $_GET["virtual_table_uuid"]; + $virtual_table_field_uuid = $_GET["id"]; + + $sql = ""; + $sql .= "select * from v_virtual_table_fields "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and virtual_table_uuid = '$virtual_table_uuid' "; + $sql .= "and virtual_table_field_uuid = '$virtual_table_field_uuid' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach ($result as &$row) { + $virtual_field_label = $row["virtual_field_label"]; + $virtual_field_name = $row["virtual_field_name"]; + $virtual_field_type = $row["virtual_field_type"]; + $virtual_field_value = $row["virtual_field_value"]; + $virtual_field_list_hidden = $row["virtual_field_list_hidden"]; + $virtual_field_column = $row["virtual_field_column"]; + $virtual_field_required = $row["virtual_field_required"]; + $virtual_field_order = $row["virtual_field_order"]; + $virtual_field_order_tab = $row["virtual_field_order_tab"]; + $virtual_field_description = $row["virtual_field_description"]; + break; //limit to 1 row + } + unset ($prep_statement); + } + +//show the header + require_once "includes/header.php"; + +//begin the content + echo "
"; + echo "\n"; + echo "\n"; + echo " "; + echo " "; + echo "
\n"; + echo "
"; + + echo "
\n"; + echo "
\n"; + echo "\n"; + echo "\n"; + if ($action == "add") { + echo "\n"; + } + if ($action == "update") { + echo "\n"; + } + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo " \n"; + echo " \n"; + echo " "; + echo "
Virtual Table Field AddVirtual Table Field Edit
\n"; + echo "Lists the fields in the virtual database.

\n"; + echo "
\n"; + echo " Label:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the field label.\n"; + echo "
\n"; + echo " Name:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter field name.\n"; + echo "
\n"; + echo " Type:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Select the field type.\n"; + echo "
\n"; + echo " Value:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the default value.\n"; + echo "
\n"; + echo " List Visibility:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Choose whether the field is hidden from the list.\n"; + echo "
\n"; + echo " Column:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Determines which column to show the field in.\n"; + echo "
\n"; + echo " Required:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Choose whether the field is required.\n"; + echo "
\n"; + echo " Field Order:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the order of the field.\n"; + echo "
\n"; + echo " Tab Order:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the HTML Tab Order.\n"; + echo "
\n"; + echo " Description:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the description.\n"; + echo "
\n"; + echo " \n"; + if ($action == "update") { + echo " \n"; + } + echo " \n"; + echo "
"; + echo ""; + + if ($action == "update") { + if ($virtual_field_type == "select") { + require "v_virtual_table_data_types_name_value.php"; + } + } + + echo "
"; + echo "
"; + +//show the footer + require_once "includes/footer.php"; +?> \ No newline at end of file diff --git a/app/virtual_tables/v_virtual_tables.php b/app/virtual_tables/v_virtual_tables.php new file mode 100644 index 0000000000..d12bca7c84 --- /dev/null +++ b/app/virtual_tables/v_virtual_tables.php @@ -0,0 +1,161 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require_once "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('virtual_tables_view')) { + //access granted +} +else { + echo "access denied"; + exit; +} +require_once "includes/header.php"; +require_once "includes/paging.php"; + +//get the http get variables + $order_by = $_GET["order_by"]; + $order = $_GET["order"]; + +//show the content + echo "
"; + echo "\n"; + echo "\n"; + echo " "; + echo ""; + echo "
\n"; + echo "
"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "
Virtual Tables 
\n"; + echo "Provides the ability to quickly define information to store and dynamically makes tools available to view, add, edit, delete, and search.\n"; + echo "

\n"; + echo "
\n"; + + $sql = " select * from v_virtual_tables "; + $sql .= " where domain_uuid = '$domain_uuid' "; + if (strlen($order_by)> 0) { $sql .= "order by $order_by $order "; } + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + $num_rows = count($result); + unset ($prep_statement, $result, $sql); + $rows_per_page = 100; + $param = ""; + $page = $_GET['page']; + if (strlen($page) == 0) { $page = 0; $_GET['page'] = 0; } + list($paging_controls, $rows_per_page, $var_3) = paging($num_rows, $param, $rows_per_page); + $offset = $rows_per_page * $page; + + $sql = " select * from v_virtual_tables "; + $sql .= " where domain_uuid = '$domain_uuid' "; + if (strlen($order_by)> 0) { $sql .= "order by $order_by $order "; } + $sql .= " limit $rows_per_page offset $offset "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + $result_count = count($result); + unset ($prep_statement, $sql); + + $c = 0; + $row_style["0"] = "row_style0"; + $row_style["1"] = "row_style1"; + + echo "
\n"; + echo "\n"; + echo "\n"; + echo th_order_by('virtual_table_label', 'Label', $order_by, $order); + echo th_order_by('virtual_table_name', 'Table Name', $order_by, $order); + echo th_order_by('virtual_table_auth', 'Authentication', $order_by, $order); + echo th_order_by('virtual_table_description', 'Description', $order_by, $order); + //echo "\n"; + echo "\n"; + echo "\n"; + + if ($result_count == 0) { + //no results + } + else { //received results + foreach($result as $row) { + echo "\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "\n"; + if ($c==0) { $c=1; } else { $c=0; } + } //end foreach + unset($sql, $result, $row_count); + } //end if results + + echo "\n"; + echo "\n"; + echo "\n"; + + echo "
View\n"; + if (permission_exists('virtual_tables_add')) { + echo " $v_link_label_add\n"; + } + echo "
".$row['virtual_table_label']." ".$row['virtual_table_name']."".$row['virtual_table_auth']."".$row['virtual_table_description']." \n"; + if (permission_exists('virtual_tables_edit')) { + echo " $v_link_label_edit\n"; + } + if (permission_exists('virtual_tables_delete')) { + echo " $v_link_label_delete\n"; + } + echo "
\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "
 $paging_controls\n"; + if (permission_exists('virtual_tables_add')) { + echo " $v_link_label_add\n"; + } + echo "
\n"; + echo "
"; + echo "
"; + echo "

"; + echo "

"; + + echo "
"; + echo "
"; + echo "

"; + +//show the footer + require_once "includes/footer.php"; + +?> diff --git a/app/virtual_tables/v_virtual_tables_delete.php b/app/virtual_tables/v_virtual_tables_delete.php new file mode 100644 index 0000000000..1f1992c01f --- /dev/null +++ b/app/virtual_tables/v_virtual_tables_delete.php @@ -0,0 +1,65 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require_once "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('virtual_tables_delete')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +//get the http get variable + if (count($_GET)>0) { + $id = check_str($_GET["id"]); + } + +//show the header + require_once "includes/header.php"; + +if (strlen($id)>0) { + $sql = ""; + $sql .= "delete from v_virtual_tables "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and virtual_table_uuid = '$id' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + unset($sql); +} + +//redirect the user + echo "\n"; + echo "
\n"; + echo "Delete Complete\n"; + echo "
\n"; + +//show the footer + require_once "includes/footer.php"; + return; + +?> diff --git a/app/virtual_tables/v_virtual_tables_edit.php b/app/virtual_tables/v_virtual_tables_edit.php new file mode 100644 index 0000000000..bdb18acc47 --- /dev/null +++ b/app/virtual_tables/v_virtual_tables_edit.php @@ -0,0 +1,355 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require_once "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('virtual_tables_add') || permission_exists('virtual_tables_edit')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +//action add or update + if (isset($_REQUEST["id"])) { + $action = "update"; + $virtual_table_uuid = check_str($_REQUEST["id"]); + } + else { + $action = "add"; + } + +//get the http post variables + if (count($_POST)>0) { + $virtual_table_category = check_str($_POST["virtual_table_category"]); + $virtual_table_label = check_str($_POST["virtual_table_label"]); + $virtual_table_name = check_str($_POST["virtual_table_name"]); + $virtual_table_auth = check_str($_POST["virtual_table_auth"]); + $virtual_table_captcha = check_str($_POST["virtual_table_captcha"]); + $virtual_table_parent_id = check_str($_POST["virtual_table_parent_id"]); + $virtual_table_description = check_str($_POST["virtual_table_description"]); + } + +if (count($_POST)>0 && strlen($_POST["persistformvar"]) == 0) { + + $msg = ''; + if ($action == "update") { + $virtual_table_uuid = check_str($_POST["virtual_table_uuid"]); + } + + //check for all required data + if (strlen($domain_uuid) == 0) { $msg .= "Please provide: domain_uuid
\n"; } + //if (strlen($virtual_table_category) == 0) { $msg .= "Please provide: Table Category
\n"; } + //if (strlen($virtual_table_label) == 0) { $msg .= "Please provide: Label
\n"; } + if (strlen($virtual_table_name) == 0) { $msg .= "Please provide: Table Name
\n"; } + //if (strlen($virtual_table_auth) == 0) { $msg .= "Please provide: Authentication
\n"; } + //if (strlen($virtual_table_captcha) == 0) { $msg .= "Please provide: Captcha
\n"; } + //if (strlen($virtual_table_parent_id) == 0) { $msg .= "Please provide: Parent Table
\n"; } + //if (strlen($virtual_table_description) == 0) { $msg .= "Please provide: Description
\n"; } + if (strlen($msg) > 0 && strlen($_POST["persistformvar"]) == 0) { + require_once "includes/header.php"; + require_once "includes/persistformvar.php"; + echo "
\n"; + echo "
\n"; + echo $msg."
"; + echo "
\n"; + persistformvar($_POST); + echo "
\n"; + require_once "includes/footer.php"; + return; + } + + //add or update the database + if ($_POST["persistformvar"] != "true") { + if ($action == "add") { + $virtual_table_uuid = uuid(); + $sql = "insert into v_virtual_tables "; + $sql .= "("; + $sql .= "domain_uuid, "; + $sql .= "virtual_table_uuid, "; + $sql .= "virtual_table_category, "; + $sql .= "virtual_table_label, "; + $sql .= "virtual_table_name, "; + $sql .= "virtual_table_auth, "; + $sql .= "virtual_table_captcha, "; + $sql .= "virtual_table_parent_id, "; + $sql .= "virtual_table_description "; + $sql .= ")"; + $sql .= "values "; + $sql .= "("; + $sql .= "'$domain_uuid', "; + $sql .= "'$virtual_table_uuid', "; + $sql .= "'$virtual_table_category', "; + $sql .= "'$virtual_table_label', "; + $sql .= "'$virtual_table_name', "; + $sql .= "'$virtual_table_auth', "; + $sql .= "'$virtual_table_captcha', "; + $sql .= "'$virtual_table_parent_id', "; + $sql .= "'$virtual_table_description' "; + $sql .= ")"; + $db->exec(check_sql($sql)); + unset($sql); + + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Add Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + } //if ($action == "add") + + if ($action == "update") { + $sql = "update v_virtual_tables set "; + $sql .= "domain_uuid = '$domain_uuid', "; + $sql .= "virtual_table_category = '$virtual_table_category', "; + $sql .= "virtual_table_label = '$virtual_table_label', "; + $sql .= "virtual_table_name = '$virtual_table_name', "; + $sql .= "virtual_table_auth = '$virtual_table_auth', "; + $sql .= "virtual_table_captcha = '$virtual_table_captcha', "; + $sql .= "virtual_table_parent_id = '$virtual_table_parent_id', "; + $sql .= "virtual_table_description = '$virtual_table_description' "; + $sql .= "where virtual_table_uuid = '$virtual_table_uuid'"; + $db->exec(check_sql($sql)); + unset($sql); + + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Update Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + } //if ($action == "update") + } //if ($_POST["persistformvar"] != "true") +} //(count($_POST)>0 && strlen($_POST["persistformvar"]) == 0) + +//pre-populate the form + if (count($_GET)>0 && $_POST["persistformvar"] != "true") { + $virtual_table_uuid = $_GET["id"]; + $sql = ""; + $sql .= "select * from v_virtual_tables "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and virtual_table_uuid = '$virtual_table_uuid' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach ($result as &$row) { + $virtual_table_category = $row["virtual_table_category"]; + $virtual_table_label = $row["virtual_table_label"]; + $virtual_table_name = $row["virtual_table_name"]; + $virtual_table_auth = $row["virtual_table_auth"]; + $virtual_table_captcha = $row["virtual_table_captcha"]; + $virtual_table_parent_id = $row["virtual_table_parent_id"]; + $virtual_table_description = $row["virtual_table_description"]; + break; //limit to 1 row + } + unset ($prep_statement); + } + +//show the header + require_once "includes/header.php"; + +//show the content + echo "
"; + echo "\n"; + echo "\n"; + echo " "; + echo " "; + echo "
\n"; + echo "
"; + + echo "
\n"; + echo "
\n"; + echo "\n"; + + echo "\n"; + if ($action == "add") { + echo "\n"; + } + if ($action == "update") { + echo "\n"; + } + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo " \n"; + echo " \n"; + echo " "; + echo "
Virtual Table AddVirtual Table Edit\n"; + if (strlen($row[virtual_table_uuid]) > 0) { + echo "   \n"; + echo "   \n"; + } + include "export/index.php"; + echo " \n"; + echo "
\n"; + echo "Provides the ability to quickly define information to store and dynamically makes tools available to view, add, edit, delete, and search.

\n"; + echo "
\n"; + echo " Table Category:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the category.\n"; + echo "
\n"; + echo " Label:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the label.\n"; + echo "
\n"; + echo " Table Name:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the table name.\n"; + echo "
\n"; + echo " Authentication:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Choose whether to require authentication.\n"; + echo "
\n"; + echo " Captcha:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Choose whether to require captcha.\n"; + echo "
\n"; + echo " Parent Table:\n"; + echo "\n"; + + echo " \n"; + + echo "
\n"; + echo "Select a parent table.\n"; + echo "
\n"; + echo " Description:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter a description.\n"; + echo "
\n"; + if ($action == "update") { + echo " \n"; + } + echo " \n"; + echo "
"; + echo ""; + + if ($action == "update") { + require "v_virtual_table_fields.php"; + } + + echo "
"; + echo "
"; + +//show the footer + require_once "includes/footer.php"; +?> \ No newline at end of file diff --git a/app/virtual_tables/v_virtual_tables_import.php b/app/virtual_tables/v_virtual_tables_import.php new file mode 100644 index 0000000000..5fc202560c --- /dev/null +++ b/app/virtual_tables/v_virtual_tables_import.php @@ -0,0 +1,373 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('virtual_tables_edit')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +if (count($_POST)>0) { + $virtual_table_uuid = trim($_REQUEST["id"]); + $data = trim($_POST["data"]); + $data_delimiter = trim($_POST["data_delimiter"]); + $data_enclosure = trim($_POST["data_enclosure"]); +} + +//define the php class + class v_virtual_table_fields { + var $domain_uuid; + var $virtual_table_uuid; + var $virtual_field_label; + var $virtual_field_name; + var $virtual_field_type; + var $virtual_field_value; + var $virtual_field_list_hidden; + var $virtual_field_column; + var $virtual_field_required; + var $virtual_field_order; + var $virtual_field_order_tab; + var $virtual_field_description; + + function db_field_exists() { + global $db; + $sql = "select * from v_virtual_table_fields "; + $sql .= "where domain_uuid = '$this->domain_uuid' "; + $sql .= "and virtual_table_uuid ='$this->virtual_table_uuid' "; + $sql .= "and virtual_field_name = '$this->virtual_field_name' "; + $row = $db->query($sql)->fetch(PDO::FETCH_ASSOC); + if (is_array($row)) { + return true; + } + else { + return false; + } + } + + function db_insert() { + global $db; + $sql = "insert into v_virtual_table_fields "; + $sql .= "("; + $sql .= "domain_uuid, "; + $sql .= "virtual_table_uuid, "; + $sql .= "virtual_field_label, "; + $sql .= "virtual_field_name, "; + $sql .= "virtual_field_type, "; + $sql .= "virtual_field_value, "; + $sql .= "virtual_field_list_hidden, "; + $sql .= "virtual_field_column, "; + $sql .= "virtual_field_required, "; + $sql .= "virtual_field_order, "; + $sql .= "virtual_field_order_tab, "; + $sql .= "virtual_field_description "; + $sql .= ")"; + $sql .= "values "; + $sql .= "("; + $sql .= "'$this->domain_uuid', "; + $sql .= "'$this->virtual_table_uuid', "; + $sql .= "'$this->virtual_field_label', "; + $sql .= "'$this->virtual_field_name', "; + $sql .= "'$this->virtual_field_type', "; + $sql .= "'$this->virtual_field_value', "; + $sql .= "'$this->virtual_field_list_hidden', "; + $sql .= "'$this->virtual_field_column', "; + $sql .= "'$this->virtual_field_required', "; + $sql .= "'$this->virtual_field_order', "; + $sql .= "'$this->virtual_field_order_tab', "; + $sql .= "'$this->virtual_field_description' "; + $sql .= ")"; + if (!$this->db_field_exists()) { + $db->exec(check_sql($sql)); + } + unset($sql); + } + } + + class v_virtual_table_data { + var $domain_uuid; + var $virtual_table_uuid; + var $virtual_data_row_id; + var $virtual_field_name; + var $virtual_data_field_value; + var $last_insert_id; + var $virtual_table_data_uuid; + + function db_unique_id() { + global $db; + $sql = "insert into v_virtual_table_data_row_id "; + $sql .= "("; + $sql .= "domain_uuid "; + $sql .= ")"; + $sql .= "values "; + $sql .= "("; + $sql .= "'$this->domain_uuid' "; + $sql .= ")"; + $db->exec($sql); + unset($sql); + return $db->lastInsertId($id); + } + + function db_insert() { + global $db; + $sql = "insert into v_virtual_table_data "; + $sql .= "("; + $sql .= "domain_uuid, "; + $sql .= "virtual_data_row_id, "; + $sql .= "virtual_table_uuid, "; + $sql .= "virtual_field_name, "; + $sql .= "virtual_data_field_value, "; + $sql .= "virtual_data_add_user, "; + $sql .= "virtual_data_add_date "; + $sql .= ")"; + $sql .= "values "; + $sql .= "("; + $sql .= "'$this->domain_uuid', "; + $sql .= "'$this->virtual_data_row_id', "; + $sql .= "'$this->virtual_table_uuid', "; + $sql .= "'$this->virtual_field_name', "; + $sql .= "'$this->virtual_data_field_value', "; + $sql .= "'".$_SESSION["username"]."', "; + $sql .= "now() "; + $sql .= ")"; + $db->exec($sql); + $this->last_insert_id = $db->lastInsertId($id); + unset($sql); + } + + function db_update() { + global $db; + $sql = "update v_virtual_table_data set "; + $sql .= "virtual_data_row_id = '$this->virtual_data_row_id', "; + $sql .= "virtual_field_name = '$this->virtual_field_name', "; + $sql .= "virtual_data_field_value = '$this->virtual_data_field_value', "; + $sql .= "virtual_data_add_user = '".$_SESSION["username"]."', "; + $sql .= "virtual_data_add_date = now() "; + $sql .= "where domain_uuid = '$this->domain_uuid' "; + $sql .= "and virtual_table_data_uuid = '$this->virtual_table_data_uuid' "; + $db->exec($sql); + $this->last_insert_id = $db->lastInsertId($id); + unset($sql); + } + } + +//built in str_getcsv requires PHP 5.3 or higher, this function can be used to reproduct the functionality but requirs PHP 5.1.0 or higher + if(!function_exists('str_getcsv')) { + function str_getcsv($input, $delimiter = ",", $enclosure = '"', $escape = "\\") { + $fp = fopen("php://memory", 'r+'); + fputs($fp, $input); + rewind($fp); + $data = fgetcsv($fp, null, $delimiter, $enclosure); // $escape only got added in 5.3.0 + fclose($fp); + return $data; + } + } + + //POST to PHP variables + if (count($_POST)>0) { + + //show the header + require_once "includes/header.php"; + + echo "
\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo " \n"; + echo " \n"; + echo " "; + echo "
Import Results\n"; + echo " \n"; + echo "

\n"; + echo "
\n"; + + //import data + if (strlen($data) > 0) { + $line_array = explode("\n",$data); + $name_array = explode(",",$line_array[0]); + $x = 0; + $db->beginTransaction(); + foreach($name_array as $key => $val) { + $virtual_field_label = trim($val); + $virtual_field_name = trim($val); + $virtual_field_name = str_replace(" ", "_", $virtual_field_name); + $virtual_field_name = str_replace("-", "_", $virtual_field_name); + $virtual_field_name = strtolower($virtual_field_name); + + $fields = new v_virtual_table_fields; + $fields->domain_uuid = $domain_uuid; + $fields->virtual_table_uuid = $virtual_table_uuid; + $fields->virtual_field_label = $virtual_field_label; + $fields->virtual_field_name = $virtual_field_name; + $fields->virtual_field_type = 'text'; + $fields->virtual_field_value = ''; + $fields->virtual_field_list_hidden = 'show'; + $fields->virtual_field_column = '1'; + $fields->virtual_field_required = 'yes'; + $fields->virtual_field_order = $x; + $fields->virtual_field_order_tab = $x; + $fields->virtual_field_description = $virtual_field_label; + $fields->db_insert(); + unset($fields); + $x++; + } + + foreach($line_array as $key => $line) { + if ($key > 0) { + $value_array = str_getcsv($line, $data_delimiter, $data_enclosure); + $x=0; + foreach($value_array as $key => $val) { + + $virtual_field_label = trim($name_array[$x]); + $virtual_field_name = trim($name_array[$x]); + $virtual_field_name = str_replace(" ", "_", $virtual_field_name); + $virtual_field_name = str_replace("-", "_", $virtual_field_name); + $virtual_field_name = strtolower($virtual_field_name); + + $virtual_field_value = $val; + + $data = new v_virtual_table_data; + $data->domain_uuid = $domain_uuid; + $data->virtual_table_uuid = $virtual_table_uuid; + if ($x == 0) { + $virtual_data_row_id = $data->db_unique_id(); +// echo "id: ".$virtual_data_row_id."
\n"; + } + $data->virtual_data_row_id = $virtual_data_row_id; + $data->virtual_field_name = $virtual_field_name; + $data->virtual_data_field_value = $virtual_field_value; + $data->db_insert(); + unset($data); + + echo "$virtual_field_name: $virtual_field_value
\n"; + $x++; + } + echo "
\n"; + } + } + $db->commit(); + } //if (strlen($data) > 0) + + echo "
"; + echo "
\n"; + + //show the footer + require_once "includes/footer.php"; + + exit; + } + + +//show the header + require_once "includes/header.php"; + +//show the content + echo "
"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "
Import\n"; + //echo " \n"; + echo "

\n"; + echo "
\n"; + + echo "\n"; + echo "\n"; + echo " "; + echo " "; + echo "
\n"; + echo "
"; + + echo "
\n"; + + echo "
\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + //echo "\n"; + + echo " \n"; + echo " \n"; + echo " "; + echo "
\n"; + echo " Data:\n"; + echo "\n"; + echo " \n"; + //echo "
\n"; + //echo "\n"; + //echo "
\n"; + if ($action == "update") { + echo " \n"; + } + echo " \n"; + echo "
"; + echo ""; + + echo "
"; + echo "
"; + +//show the footer + require_once "includes/footer.php"; + +?> diff --git a/app/voicemail_msgs/v_voicemail_msgs_play.php b/app/voicemail_msgs/v_voicemail_msgs_play.php new file mode 100644 index 0000000000..7370713f3a --- /dev/null +++ b/app/voicemail_msgs/v_voicemail_msgs_play.php @@ -0,0 +1,112 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ + +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('voicemail_view')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +//get the http get values + $uuid = $_GET['uuid']; + $file_ext = $_GET['ext']; + $type = $_GET['type']; //vm + $desc = $_GET['desc']; + $id = $_GET['id']; + +//get the domain from the domains array + $domain_name = $_SESSION['domains'][$domain_uuid]['domain_name']; + +//create the event socket connection + $fp = event_socket_create($_SESSION['event_socket_ip_address'], $_SESSION['event_socket_port'], $_SESSION['event_socket_password']); + if (!$fp) { + $msg = "
Connection to Event Socket failed.
"; + } + +//show the error message or show the content + if (strlen($msg) > 0) { + require_once "includes/header.php"; + echo "
\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "
Message
$msg
\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + } + +?> + + + + + + + + + + + + +
+ voicemail: +
+ \n"; + } + //object html tag to add flash player that can play the mp3 file + if ($file_ext == "mp3") { + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + } + ?> +
+ + \ No newline at end of file diff --git a/app/voicemail_status/app_config.php b/app/voicemail_status/app_config.php new file mode 100644 index 0000000000..2eed674a7d --- /dev/null +++ b/app/voicemail_status/app_config.php @@ -0,0 +1,30 @@ + \ No newline at end of file diff --git a/app/voicemail_status/root.php b/app/voicemail_status/root.php new file mode 100644 index 0000000000..7b882438ea --- /dev/null +++ b/app/voicemail_status/root.php @@ -0,0 +1,50 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ + +// make sure the PATH_SEPARATOR is defined + if (!defined("PATH_SEPARATOR")) { + if ( strpos( $_ENV[ "OS" ], "Win" ) !== false ) { define("PATH_SEPARATOR", ";"); } else { define("PATH_SEPARATOR", ":"); } + } + +// make sure the document_root is set + $_SERVER["SCRIPT_FILENAME"] = str_replace("\\", "/", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = str_replace($_SERVER["PHP_SELF"], "", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = realpath($_SERVER["DOCUMENT_ROOT"]); + //echo "DOCUMENT_ROOT: ".$_SERVER["DOCUMENT_ROOT"]."
\n"; + //echo "PHP_SELF: ".$_SERVER["PHP_SELF"]."
\n"; + //echo "SCRIPT_FILENAME: ".$_SERVER["SCRIPT_FILENAME"]."
\n"; + +// if the project directory exists then add it to the include path otherwise add the document root to the include path + if (is_dir($_SERVER["DOCUMENT_ROOT"].'/fusionpbx')){ + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', '/fusionpbx'); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER["DOCUMENT_ROOT"].'/fusionpbx' ); + } + else { + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', ''); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER['DOCUMENT_ROOT'] ); + } + +?> \ No newline at end of file diff --git a/app/voicemail_status/v_voicemail.php b/app/voicemail_status/v_voicemail.php new file mode 100644 index 0000000000..3761a2c488 --- /dev/null +++ b/app/voicemail_status/v_voicemail.php @@ -0,0 +1,198 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('voicemail_status_view')) { + //access granted +} +else { + echo "access denied"; + exit; +} +require_once "includes/header.php"; +require_once "includes/paging.php"; + +$order_by = $_GET["order_by"]; +$order = $_GET["order"]; + +//show the content + echo "
"; + echo "\n"; + + echo "\n"; + echo " "; +echo ""; +echo "
\n"; + echo "
"; + + echo "\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "
Voicemail
\n"; + echo " Show details about the voicemail settings including the voicemail count, and voicemail to email address.\n"; + echo "
\n"; + echo "
"; + + $c = 0; + $row_style["0"] = "row_style0"; + $row_style["1"] = "row_style1"; + + echo "
\n"; + echo "\n"; + + echo "\n"; + echo th_order_by('extension', 'Extension', $order_by, $order); + echo th_order_by('vm_mailto', 'Voicemail Mail To', $order_by, $order); + echo "\n"; + echo th_order_by('enabled', 'Enabled', $order_by, $order); + echo th_order_by('description', 'Description', $order_by, $order); + echo "\n"; + + $sql = ""; + $sql .= "select * from v_extensions "; + $sql .= "where domain_uuid = '$domain_uuid' "; + if (!(if_group("admin") || if_group("superadmin"))) { + if (count($_SESSION['user']['extension']) > 0) { + $sql .= "and ("; + $x = 0; + foreach($_SESSION['user']['extension'] as $row) { + if ($x > 0) { $sql .= "or "; } + $sql .= "extension = '".$row['user']."' "; + $x++; + } + $sql .= ")"; + } + else { + //hide any results when a user has not been assigned an extension + $sql .= "and extension = 'disabled' "; + } + } + if (strlen($order_by)> 0) { + $sql .= "order by $order_by $order "; + } + else { + $sql .= "order by extension asc "; + } + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + $num_rows = count($result); + unset ($prep_statement, $result, $sql); + + $rows_per_page = 100; + $param = ""; + $page = $_GET['page']; + if (strlen($page) == 0) { $page = 0; $_GET['page'] = 0; } + list($paging_controls, $rows_per_page, $var_3) = paging($num_rows, $param, $rows_per_page); + $offset = $rows_per_page * $page; + + $sql = ""; + $sql .= "select * from v_extensions "; + $sql .= "where domain_uuid = '$domain_uuid' "; + if (!(if_group("admin") || if_group("superadmin"))) { + if (count($_SESSION['user']['extension']) > 0) { + $sql .= "and ("; + $x = 0; + foreach($_SESSION['user']['extension'] as $row) { + if ($x > 0) { $sql .= "or "; } + $sql .= "extension = '".$row['user']."' "; + $x++; + } + $sql .= ")"; + } + else { + //hide any results when a user has not been assigned an extension + $sql .= "and extension = 'disabled' "; + } + } + if (strlen($order_by)> 0) { + $sql .= "order by $order_by $order "; + } + else { + $sql .= "order by extension asc "; + } + $sql .= " limit $rows_per_page offset $offset "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + $result_count = count($result); + unset ($prep_statement, $sql); + + //pdo voicemail database connection +// include "includes/lib_pdo_vm.php"; + + if ($result_count > 0) { + foreach($result as $row) { +// echo "
\n";
+//		print_r($row);
+//		echo "
\n"; + $sql = ""; + $sql .= "select count(*) as count from voicemail_msgs "; + $sql .= "where domain = '".$_SESSION['domains'][$domain_uuid]['domain_name']."' "; + $sql .= "and username = '".$row['extension']."' "; +// $prep_statement = $db->prepare(check_sql($sql)); +// $prep_statement->execute(); +// $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); +// foreach ($result as &$row2) { +// $count = $row2["count"]; +// break; //limit to 1 row +// } +// unset ($prep_statement); + + echo "\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "\n"; + + unset($count); + if ($c==0) { $c=1; } else { $c=0; } + } //end foreach + unset($sql, $result, $row_count); + } //end if results + +echo "
Messages
".$row['extension']."".$row['vm_mailto']." ".$count." ".($row['vm_enabled']?"true":"false")."".$row['description']." \n"; + if (permission_exists('voicemail_status_delete')) { + echo " $v_link_label_delete\n"; + } + echo "
"; +echo "
"; +echo "

"; +echo "

"; + +echo "
"; +echo "
"; +echo "

"; + +//show the footer + require "includes/require.php"; + require_once "includes/footer.php"; +?> diff --git a/app/voicemail_status/v_voicemail_prefs_delete.php b/app/voicemail_status/v_voicemail_prefs_delete.php new file mode 100644 index 0000000000..79078a4516 --- /dev/null +++ b/app/voicemail_status/v_voicemail_prefs_delete.php @@ -0,0 +1,66 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('voicemail_status_delete')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +if (count($_GET)>0) { + $id = $_GET["id"]; +} + +//pdo voicemail database connection + include "includes/lib_pdo_vm.php"; + +//delete the data + if (strlen($id)>0) { + $sql = ""; + $sql .= "delete from voicemail_prefs "; + $sql .= "where domain = '".$_SESSION['domains'][$domain_uuid]['domain_name']."' "; + $sql .= "and username = '$domain_uuid' "; + $count = $db->exec(check_sql($sql)); + unset($sql); + } + +//redirect the user + require "includes/require.php"; + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Voicemail Preferences set to default\n"; + echo "
\n"; + require "includes/require.php"; + require_once "includes/footer.php"; + return; + +?> + diff --git a/app/xml_cdr/app_config.php b/app/xml_cdr/app_config.php new file mode 100644 index 0000000000..27607155da --- /dev/null +++ b/app/xml_cdr/app_config.php @@ -0,0 +1,275 @@ + \ No newline at end of file diff --git a/app/xml_cdr/app_defaults.php b/app/xml_cdr/app_defaults.php new file mode 100644 index 0000000000..6140274772 --- /dev/null +++ b/app/xml_cdr/app_defaults.php @@ -0,0 +1,39 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ + +//make sure that prefix-a-leg is set to true in the xml_cdr.conf.xml file + $file_contents = file_get_contents($_SESSION['switch']['conf']['dir']."/autoload_configs/xml_cdr.conf.xml"); + $file_contents_new = str_replace("param name=\"prefix-a-leg\" value=\"false\"/", "param name=\"prefix-a-leg\" value=\"true\"/", $file_contents); + if ($file_contents != $file_contents_new) { + $fout = fopen($_SESSION['switch']['conf']['dir']."/autoload_configs/xml_cdr.conf.xml","w"); + fwrite($fout, $file_contents_new); + fclose($fout); + if ($display_type == "text") { + echo " xml_cdr.conf.xml: updated\n"; + } + } + +?> \ No newline at end of file diff --git a/app/xml_cdr/root.php b/app/xml_cdr/root.php new file mode 100644 index 0000000000..7b882438ea --- /dev/null +++ b/app/xml_cdr/root.php @@ -0,0 +1,50 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ + +// make sure the PATH_SEPARATOR is defined + if (!defined("PATH_SEPARATOR")) { + if ( strpos( $_ENV[ "OS" ], "Win" ) !== false ) { define("PATH_SEPARATOR", ";"); } else { define("PATH_SEPARATOR", ":"); } + } + +// make sure the document_root is set + $_SERVER["SCRIPT_FILENAME"] = str_replace("\\", "/", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = str_replace($_SERVER["PHP_SELF"], "", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = realpath($_SERVER["DOCUMENT_ROOT"]); + //echo "DOCUMENT_ROOT: ".$_SERVER["DOCUMENT_ROOT"]."
\n"; + //echo "PHP_SELF: ".$_SERVER["PHP_SELF"]."
\n"; + //echo "SCRIPT_FILENAME: ".$_SERVER["SCRIPT_FILENAME"]."
\n"; + +// if the project directory exists then add it to the include path otherwise add the document root to the include path + if (is_dir($_SERVER["DOCUMENT_ROOT"].'/fusionpbx')){ + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', '/fusionpbx'); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER["DOCUMENT_ROOT"].'/fusionpbx' ); + } + else { + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', ''); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER['DOCUMENT_ROOT'] ); + } + +?> \ No newline at end of file diff --git a/app/xml_cdr/v_xml_cdr_import.php b/app/xml_cdr/v_xml_cdr_import.php new file mode 100644 index 0000000000..45af23d93a --- /dev/null +++ b/app/xml_cdr/v_xml_cdr_import.php @@ -0,0 +1,359 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ + +//check the permission + if(defined('STDIN')) { + $document_root = str_replace("\\", "/", $_SERVER["PHP_SELF"]); + preg_match("/^(.*)\/mod\/.*$/", $document_root, $matches); + $document_root = $matches[1]; + set_include_path($document_root); + $_SERVER["DOCUMENT_ROOT"] = $document_root; + require_once "includes/require.php"; + $display_type = 'text'; //html, text + } + else { + include "root.php"; + require_once "includes/require.php"; + } + +//set debug + $debug = false; //true //false + if($debug){ + $time5 = microtime(true); + $insert_time=$insert_count=0; + } + +//increase limits + set_time_limit(3600); + ini_set('memory_limit', '256M'); + +//set pdo attribute that enables exception handling + $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); + +function process_xml_cdr($db, $leg, $xml_string) { + //set global variable + global $debug; + + //parse the xml to get the call detail record info + try { + $xml = simplexml_load_string($xml_string); + } + catch(Exception $e) { + echo $e->getMessage(); + } + + //prepare the database object + require_once "includes/classes/database.php"; + $database = new database; + $database->table = "v_xml_cdr"; + + //misc + $uuid = check_str(urldecode($xml->variables->uuid)); + $database->fields['uuid'] = $uuid; + $database->fields['accountcode'] = check_str(urldecode($xml->variables->accountcode)); + $database->fields['default_language'] = check_str(urldecode($xml->variables->default_language)); + $database->fields['bridge_uuid'] = check_str(urldecode($xml->variables->bridge_uuid)); + $database->fields['digits_dialed'] = check_str(urldecode($xml->variables->digits_dialed)); + $database->fields['sip_hangup_disposition'] = check_str(urldecode($xml->variables->sip_hangup_disposition)); + //time + $database->fields['start_epoch'] = check_str(urldecode($xml->variables->start_epoch)); + $start_stamp = check_str(urldecode($xml->variables->start_stamp)); + $database->fields['start_stamp'] = $start_stamp; + $database->fields['answer_stamp'] = check_str(urldecode($xml->variables->answer_stamp)); + $database->fields['answer_epoch'] = check_str(urldecode($xml->variables->answer_epoch)); + $database->fields['end_epoch'] = check_str(urldecode($xml->variables->end_epoch)); + $database->fields['end_stamp'] = check_str(urldecode($xml->variables->end_stamp)); + $database->fields['duration'] = check_str(urldecode($xml->variables->duration)); + $database->fields['mduration'] = check_str(urldecode($xml->variables->mduration)); + $database->fields['billsec'] = check_str(urldecode($xml->variables->billsec)); + $database->fields['billmsec'] = check_str(urldecode($xml->variables->billmsec)); + //codecs + $database->fields['read_codec'] = check_str(urldecode($xml->variables->read_codec)); + $database->fields['read_rate'] = check_str(urldecode($xml->variables->read_rate)); + $database->fields['write_codec'] = check_str(urldecode($xml->variables->write_codec)); + $database->fields['write_rate'] = check_str(urldecode($xml->variables->write_rate)); + $database->fields['remote_media_ip'] = check_str(urldecode($xml->variables->remote_media_ip)); + $database->fields['hangup_cause'] = check_str(urldecode($xml->variables->hangup_cause)); + $database->fields['hangup_cause_q850'] = check_str(urldecode($xml->variables->hangup_cause_q850)); + //call center + $database->fields['cc_side'] = check_str(urldecode($xml->variables->cc_side)); + $database->fields['cc_member_uuid'] = check_str(urldecode($xml->variables->cc_member_uuid)); + $database->fields['cc_queue_joined_epoch'] = check_str(urldecode($xml->variables->cc_queue_joined_epoch)); + $database->fields['cc_queue'] = check_str(urldecode($xml->variables->cc_queue)); + $database->fields['cc_member_session_uuid'] = check_str(urldecode($xml->variables->cc_member_session_uuid)); + $database->fields['cc_agent'] = check_str(urldecode($xml->variables->cc_agent)); + $database->fields['cc_agent_type'] = check_str(urldecode($xml->variables->cc_agent_type)); + $database->fields['waitsec'] = check_str(urldecode($xml->variables->waitsec)); + //app info + $database->fields['last_app'] = check_str(urldecode($xml->variables->last_app)); + $database->fields['last_arg'] = check_str(urldecode($xml->variables->last_arg)); + //conference + $database->fields['conference_name'] = check_str(urldecode($xml->variables->conference_name)); + $database->fields['conference_uuid'] = check_str(urldecode($xml->variables->conference_uuid)); + $database->fields['conference_member_id'] = check_str(urldecode($xml->variables->conference_member_id)); + + //get the values from the callflow. + $x = 0; + foreach ($xml->callflow as $row) { + if ($x == 0) { + $context = check_str(urldecode($row->caller_profile->context)); + $database->fields['destination_number'] = check_str(urldecode($row->caller_profile->destination_number)); + $database->fields['context'] = $context; + $database->fields['network_addr'] = check_str(urldecode($row->caller_profile->network_addr)); + } + $database->fields['caller_id_name'] = check_str(urldecode($row->caller_profile->caller_id_name)); + $database->fields['caller_id_number'] = check_str(urldecode($row->caller_profile->caller_id_number)); + $x++; + } + unset($x); + + //store the call leg + $database->fields['leg'] = $leg; + + //store the call direction. + $database->fields['direction'] = check_str(urldecode($xml->variables->call_direction)); + + //store post dial delay, in milliseconds. + $database->fields['pdd_ms'] = check_str(urldecode($xml->variables->progress_mediamsec) + urldecode($xml->variables->progressmsec)); + + //get break down the date to year, month and day + $tmp_time = strtotime($start_stamp); + $tmp_year = date("Y", $tmp_time); + $tmp_month = date("M", $tmp_time); + $tmp_day = date("d", $tmp_time); + + //find the domain_uuid by using the domain_name + $domain_name = check_str(urldecode($xml->variables->domain_name)); + $sql = "select domain_uuid from v_domains "; + if (strlen($domain_name) == 0 && $context != 'public' && $context != 'default') { + $sql .= "where domain_name = '".$context."' "; + } + else { + $sql .= "where domain_name = '".$domain_name."' "; + } + $row = $db->query($sql)->fetch(); + $domain_uuid = $row['domain_uuid']; + if (strlen($domain_uuid) == 0) { + $sql = "select domain_name, domain_uuid from v_domains "; + $row = $db->query($sql)->fetch(); + $domain_uuid = $row['domain_uuid']; + if (strlen($domain_name) == 0) { $domain_name = $row['domain_name']; } + } + $database->domain_uuid = $domain_uuid; + $database->fields['domain_uuid'] = $domain_uuid; + $database->fields['domain_name'] = $domain_name; + + //check whether a recording exists + $recording_relative_path = '/archive/'.$tmp_year.'/'.$tmp_month.'/'.$tmp_day; + if (file_exists($_SESSION['switch']['recordings']['dir'].$recording_relative_path.'/'.$uuid.'.wav')) { + $recording_file = $recording_relative_path.'/'.$uuid.'.wav'; + } + elseif (file_exists($_SESSION['switch']['recordings']['dir'].$recording_relative_path.'/'.$uuid.'.mp3')) { + $recording_file = $recording_relative_path.'/'.$uuid.'.mp3'; + } + if(isset($recording_file) && !empty($recording_file)) { + $database->fields['recording_file'] = $recording_file; + } + + //determine where the xml cdr will be archived + $sql = "select * from v_vars "; + $sql .= "where var_name = 'xml_cdr_archive' "; + $row = $db->query($sql)->fetch(); + $var_value = trim($row["var_value"]); + switch ($var_value) { + case "dir": + $xml_cdr_archive = 'dir'; + break; + case "db": + $xml_cdr_archive = 'db'; + break; + case "none": + $xml_cdr_archive = 'none'; + break; + default: + $xml_cdr_archive = 'dir'; + break; + } + + //if xml_cdr_archive is set to db then insert it. + if ($xml_cdr_archive == "db") { + $database->fields['xml_cdr'] = check_str($xml_string); + } + + //insert xml_cdr into the db + $database->add(); + if ($debug) { + echo $database->sql."\n"; + } + + //insert the values + if (strlen($uuid) > 0) { + if ($debug) { + $time5_insert = microtime(true); + //echo $sql."
\n"; + } + try { + $error = "false"; + //$db->exec(check_sql($sql)); + } + catch(PDOException $e) { + $tmp_dir = $_SESSION['switch']['log']['dir'].'/xml_cdr/failed/'; + if(!file_exists($tmp_dir)) { + mkdir($tmp_dir, 0777, true); + } + $tmp_file = $uuid.'.xml'; + $fh = fopen($tmp_dir.'/'.$tmp_file, 'w'); + fwrite($fh, $xml_string); + fclose($fh); + if ($debug) { + echo $e->getMessage(); + } + $error = "true"; + } + //if xml_cdr_archive is set to dir, then store it. + if ($xml_cdr_archive == "dir" && $error != "true") { + if (strlen($uuid) > 0) { + $tmp_time = strtotime($start_stamp); + $tmp_year = date("Y", $tmp_time); + $tmp_month = date("M", $tmp_time); + $tmp_day = date("d", $tmp_time); + $tmp_dir = $_SESSION['switch']['log']['dir'].'/xml_cdr/archive/'.$tmp_year.'/'.$tmp_month.'/'.$tmp_day; + if(!file_exists($tmp_dir)) { + mkdir($tmp_dir, 0777, true); + } + $tmp_file = $uuid.'.xml'; + $fh = fopen($tmp_dir.'/'.$tmp_file, 'w'); + fwrite($fh, $xml_string); + fclose($fh); + } + } + unset($error); + + if ($debug) { + GLOBAL $insert_time,$insert_count; + $insert_time+=microtime(true)-$time5_insert;//add this current query. + $insert_count++; + } + } + unset($sql); +} + +//get cdr details from the http post + if (strlen($_POST["cdr"]) > 0) { + + //authentication for xml cdr http post + if (strlen($_SESSION["xml_cdr_username"]) == 0) { + //get the contents of xml_cdr.conf.xml + $conf_xml_string = file_get_contents($_SESSION['switch']['conf']['dir'].'/autoload_configs/xml_cdr.conf.xml'); + + //parse the xml to get the call detail record info + try { + $conf_xml = simplexml_load_string($conf_xml_string); + } + catch(Exception $e) { + echo $e->getMessage(); + } + foreach ($conf_xml->settings->param as $row) { + if ($row->attributes()->name == "cred") { + $auth_array = explode(":", $row->attributes()->value); + $_SESSION["xml_cdr_username"] = $auth_array[0]; + $_SESSION["xml_cdr_password"] = $auth_array[1]; + //echo "username: ".$_SESSION["xml_cdr_username"]."
\n"; + //echo "password: ".$_SESSION["xml_cdr_password"]."
\n"; + } + } + } + + //check for the correct username and password + if ($_SESSION["xml_cdr_username"] == $_SERVER["PHP_AUTH_USER"] && $_SESSION["xml_cdr_password"] == $_SERVER["PHP_AUTH_PW"]) { + //echo "access granted
\n"; + } + else { + echo "access denied
\n"; + return; + } + //loop through all attribues + //foreach($xml->settings->param[1]->attributes() as $a => $b) { + // echo $a,'="',$b,"\"
\n"; + //} + + //get the http post variable + $xml_string = trim($_POST["cdr"]); + + //get the leg of the call + if (substr($_REQUEST['uuid'], 0, 2) == "a_") { + $leg = "a"; + } + else { + $leg = "b"; + } + + //parse the xml and insert the data into the db + process_xml_cdr($db, $leg, $xml_string); + } + +//check the filesystem for xml cdr records that were missed + $xml_cdr_dir = $_SESSION['switch']['log']['dir'].'/xml_cdr'; + $dir_handle = opendir($xml_cdr_dir); + $x = 0; + while($file=readdir($dir_handle)) { + if ($file != '.' && $file != '..') { + if ( !is_dir($xml_cdr_dir . '/' . $file) ) { + //get the leg of the call + if (substr($file, 0, 2) == "a_") { + $leg = "a"; + } + else { + $leg = "b"; + } + + //get the xml cdr string + $xml_string = file_get_contents($xml_cdr_dir.'/'.$file); + + //parse the xml and insert the data into the db + process_xml_cdr($db, $leg, $xml_string); + + //delete the file after it has been imported + unlink($xml_cdr_dir.'/'.$file); + + $x++; + } + } + } + closedir($dir_handle); + +//debug true + if ($debug) { + $content = ob_get_contents(); //get the output from the buffer + ob_end_clean(); //clean the buffer + $time = "\n\n$insert_count inserts in: ".number_format($insert_time,5). " seconds.\n"; + $time .= "Other processing time: ".number_format((microtime(true)-$time5-$insert_time),5). " seconds.\n"; + $fp = fopen(sys_get_temp_dir().'/xml_cdr_post.log', 'w'); + fwrite($fp, $content.$time); + fclose($fp); + } + +?> \ No newline at end of file diff --git a/app/xml_cdr/xml_cdr.php b/app/xml_cdr/xml_cdr.php new file mode 100644 index 0000000000..c2ee2c1255 --- /dev/null +++ b/app/xml_cdr/xml_cdr.php @@ -0,0 +1,427 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require_once "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('xml_cdr_view')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +//import xml_cdr files + require_once "v_xml_cdr_import.php"; + +//additional includes + require_once "includes/header.php"; + require_once "includes/paging.php"; + +//xml cdr include + require_once "xml_cdr_inc.php"; + +//page title and description + echo "
"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "
Call Detail Records\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo ""; + echo "\n"; + echo " \n"; + echo "\n"; + echo "
\n"; + echo " \n"; + echo "
\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "
\n"; + echo "
\n"; + + echo "Call Detail Records (CDRs) are detailed information on the calls. \n"; + echo "The information contains source, destination, duration, and other useful call details. \n"; + echo "Use the fields to filter the information for the specific call records that are desired. \n"; + echo "Then view the calls in the list or download them as comma seperated file by using the 'csv' button. \n"; + //To do an advanced search of the call detail records click on the following advanced button. + + echo "
\n"; + echo "
\n"; + + echo "
\n"; + + //search the call detail records + if (if_group("admin") || if_group("superadmin")) { + echo "
\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo ""; + echo ""; + echo "\n"; + echo "\n"; + echo "\n"; + echo ""; + echo "
\n"; + echo "\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + + echo "
Direction:\n"; + echo " \n"; + echo "
CID Name:
\n"; + + echo "
\n"; + + echo "\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "
Source:
Destination:
\n"; + + echo "
\n"; + + echo "\n"; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + + echo " "; + echo "
Context:
Answer:
End:
Start:
Status:\n"; + echo " \n"; + echo "
Duration:
Bill:
UUID:
Bridge UUID:
Account Code:
Read Codec:
Write Codec:
Remote Media IP:
Network Address:
"; + + echo "
\n"; + //echo " \n"; + echo "\n"; + echo "  \n"; + echo " \n"; + echo "
"; + echo "
"; + } + +//show the results + echo "\n"; + echo "\n"; + //echo th_order_by('direction', 'Direction', $order_by, $order); + //echo th_order_by('default_language', 'Language', $order_by, $order); + //echo th_order_by('context', 'Context', $order_by, $order); + //echo th_order_by('leg', 'Leg', $order_by, $order); + echo th_order_by('caller_id_name', 'Name', $order_by, $order); + echo th_order_by('caller_id_number', 'Number', $order_by, $order); + echo th_order_by('destination_number', 'Destination', $order_by, $order); + echo th_order_by('start_stamp', 'Start', $order_by, $order); + //echo th_order_by('end_stamp', 'End', $order_by, $order); + echo th_order_by('duration', 'Length', $order_by, $order); + if (if_group("admin") || if_group("superadmin")) { + echo th_order_by('pdd_ms', 'PDD', $order_by, $order); + } + echo th_order_by('hangup_cause', 'Status', $order_by, $order); + echo "\n"; + + if ($result_count > 0) { + foreach($result as $row) { + $tmp_year = date("Y", strtotime($row['start_stamp'])); + $tmp_month = date("M", strtotime($row['start_stamp'])); + $tmp_day = date("d", strtotime($row['start_stamp'])); + + if (defined('TIME_24HR') && TIME_24HR == 1) { + $tmp_start_epoch = date("j M Y H:i:s", $row['start_epoch']); + } else { + $tmp_start_epoch = date("j M Y h:i:sa", $row['start_epoch']); + } + + $hangup_cause = $row['hangup_cause']; + $hangup_cause = str_replace("_", " ", $hangup_cause); + $hangup_cause = strtolower($hangup_cause); + $hangup_cause = ucwords($hangup_cause); + + echo "\n"; + //echo " \n"; + //echo " \n"; + //echo " \n"; + //echo " \n"; + echo " \n"; + echo " \n"; + if (is_numeric($row['destination_number'])) { + echo " \n"; + } + else { + echo " \n"; + } + echo " \n"; + //echo " \n"; + + //If they cancelled, show the ring time, not the bill time. + $seconds = ($row['hangup_cause']=="ORIGINATOR_CANCEL") ? $row['duration'] : $row['billsec']; + + echo " \n"; + if (if_group("admin") || if_group("superadmin")) { + echo " \n"; + echo " \n"; + } + else { + echo " \n"; + } + echo "\n"; + if ($c==0) { $c=1; } else { $c=0; } + } //end foreach + unset($sql, $result, $row_count); + } //end if results + + echo "\n"; + echo "\n"; + echo "\n"; + + echo "
".$row['direction']."".$row['default_language']."".$row['context']."".$row['leg'].""; + + $tmp_dir = $_SESSION['switch']['recordings']['dir'].'/archive/'.$tmp_year.'/'.$tmp_month.'/'.$tmp_day; + $tmp_name = ''; + if(!empty($row['recording_file']) && file_exists($row['recording_file'])){ + $tmp_name=$row['recording_file']; + } + elseif (file_exists($tmp_dir.'/'.$row['uuid'].'.wav')) { + $tmp_name = $row['uuid'].".wav"; + } + elseif (file_exists($tmp_dir.'/'.$row['uuid'].'_1.wav')) { + $tmp_name = $row['uuid']."_1.wav"; + } + elseif (file_exists($tmp_dir.'/'.$row['uuid'].'.mp3')) { + $tmp_name = $row['uuid'].".mp3"; + } + elseif (file_exists($tmp_dir.'/'.$row['uuid'].'_1.mp3')) { + $tmp_name = $row['uuid']."_1.mp3"; + } + if (strlen($tmp_name) > 0 && file_exists($_SESSION['switch']['recordings']['dir'].'/archive/'.$tmp_year.'/'.$tmp_month.'/'.$tmp_day.'/'.$tmp_name)) { + echo " \n"; + echo $row['caller_id_name'].' '; + echo " "; + } + else { + echo $row['caller_id_name'].' '; + } + echo " "; + if (strlen($tmp_name) > 0 && file_exists($_SESSION['switch']['recordings']['dir'].'/archive/'.$tmp_year.'/'.$tmp_month.'/'.$tmp_day.'/'.$tmp_name)) { + echo " \n"; + if (is_numeric($row['caller_id_number'])) { + echo format_phone($row['caller_id_number']).' '; + } + else { + echo $row['caller_id_number'].' '; + } + echo " "; + } + else { + if (is_numeric($row['caller_id_number'])) { + echo format_phone($row['caller_id_number']).' '; + } + else { + echo $row['caller_id_number'].' '; + } + } + echo " ".format_phone($row['destination_number'])."".$row['destination_number']."".$tmp_start_epoch."".$row['end_stamp']."".gmdate("G:i:s", $seconds)."".number_format($row['pdd_ms']/1000,2)."s".$hangup_cause."".$hangup_cause."
\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "
 $paging_controls 
\n"; + echo "
"; + echo "
"; + echo "

"; + echo "

"; + +//show the footer + require_once "includes/footer.php"; +?> diff --git a/app/xml_cdr/xml_cdr_csv.php b/app/xml_cdr/xml_cdr_csv.php new file mode 100644 index 0000000000..adf95cbb99 --- /dev/null +++ b/app/xml_cdr/xml_cdr_csv.php @@ -0,0 +1,82 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('xml_cdr_view')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +//additional includes + require_once "xml_cdr_inc.php"; + +//set the http headers + header('Content-type: application/octet-binary'); + header('Content-Disposition: attachment; filename=cdr.csv'); + +//set the csv headers + $z = 0; + foreach($result[0] as $key => $val) { + if ($key != "xml_cdr") { + if ($z == 0) { + echo '"'.$key.'"'; + } + else { + echo ',"'.$key.'"'; + } + } + $z++; + } + echo "\n"; + +//show the csv data + $x=0; + while(true) { + $z = 0; + foreach($result[0] as $key => $val) { + if ($key != "xml_cdr") { + if ($z == 0) { + echo '"'.$result[$x][$key].'"'; + } + else { + echo ',"'.$result[$x][$key].'"'; + } + } + $z++; + } + echo "\n"; + ++$x; + if ($x > ($result_count-1)) { + break; + } + //$row++; + } + +?> \ No newline at end of file diff --git a/app/xml_cdr/xml_cdr_details.php b/app/xml_cdr/xml_cdr_details.php new file mode 100644 index 0000000000..59906e0e2e --- /dev/null +++ b/app/xml_cdr/xml_cdr_details.php @@ -0,0 +1,508 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('xml_cdr_view')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +//get the http values and set them to a variable + if (strlen($_REQUEST["uuid"]) > 0) { + $uuid = trim($_REQUEST["uuid"]); + } + +//get the xml cdr string from the database + $sql = "select * from v_xml_cdr "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and uuid = '$uuid' "; + $row = $db->query($sql)->fetch(); + $start_stamp = trim($row["start_stamp"]); + $xml_string = trim($row["xml_cdr"]); + //print_r($row); + +//get cdr from the file system + if (strlen($xml_string) == 0) { + $tmp_time = strtotime($start_stamp); + $tmp_year = date("Y", $tmp_time); + $tmp_month = date("M", $tmp_time); + $tmp_day = date("d", $tmp_time); + $tmp_dir = $_SESSION['switch']['log']['dir'].'/xml_cdr/archive/'.$tmp_year.'/'.$tmp_month.'/'.$tmp_day; + $tmp_file = $uuid.'.xml'; + $xml_string = file_get_contents($tmp_dir.'/'.$tmp_file); + } + +//parse the xml to get the call detail record info + try { + $xml = simplexml_load_string($xml_string); + } + catch(Exception $e) { + echo $e->getMessage(); + } + +//get the header + require_once "includes/header.php"; + +//page title and description + echo "
"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "
Call Details\n"; + echo " \n"; + echo "
\n"; + echo "A detailed view of the call and all information regarding it. \n"; + echo "The information contains caller id name and number, channel data, \n"; + echo "call variables, call flow, timing information, and other useful call details. \n"; + echo "
\n"; + echo "
\n"; + echo "
\n"; + +//detail summary + //get the variables from the xml + $uuid = check_str(urldecode($xml->variables->uuid)); + $direction = check_str(urldecode($xml->channel_data->direction)); + $language = check_str(urldecode($xml->variables->language)); + $xml_string = check_str($xml_string); + $start_epoch = check_str(urldecode($xml->variables->start_epoch)); + $start_stamp = check_str(urldecode($xml->variables->start_stamp)); + $start_uepoch = check_str(urldecode($xml->variables->start_uepoch)); + $answer_stamp = check_str(urldecode($xml->variables->answer_stamp)); + $answer_epoch = check_str(urldecode($xml->variables->answer_epoch)); + $answer_uepoch = check_str(urldecode($xml->variables->answer_uepoch)); + $end_epoch = check_str(urldecode($xml->variables->end_epoch)); + $end_uepoch = check_str(urldecode($xml->variables->end_uepoch)); + $end_stamp = check_str(urldecode($xml->variables->end_stamp)); + $duration = check_str(urldecode($xml->variables->duration)); + $mduration = check_str(urldecode($xml->variables->mduration)); + $billsec = check_str(urldecode($xml->variables->billsec)); + $billmsec = check_str(urldecode($xml->variables->billmsec)); + $bridge_uuid = check_str(urldecode($xml->variables->bridge_uuid)); + $read_codec = check_str(urldecode($xml->variables->read_codec)); + $write_codec = check_str(urldecode($xml->variables->write_codec)); + $remote_media_ip = check_str(urldecode($xml->variables->remote_media_ip)); + $hangup_cause = check_str(urldecode($xml->variables->hangup_cause)); + $hangup_cause_q850 = check_str(urldecode($xml->variables->hangup_cause_q850)); + $x = 0; + foreach ($xml->callflow as $row) { + if ($x == 0) { + $destination_number = check_str(urldecode($row->caller_profile->destination_number)); + $context = check_str(urldecode($row->caller_profile->context)); + $network_addr = check_str(urldecode($row->caller_profile->network_addr)); + } + $caller_id_name = check_str(urldecode($row->caller_profile->caller_id_name)); + $caller_id_number = check_str(urldecode($row->caller_profile->caller_id_number)); + $x++; + } + unset($x); + + $tmp_year = date("Y", strtotime($start_stamp)); + $tmp_month = date("M", strtotime($start_stamp)); + $tmp_day = date("d", strtotime($start_stamp)); + + $c = 0; + $row_style["0"] = "row_style0"; + $row_style["1"] = "row_style1"; + + echo "
\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "
Summary 
\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + //echo "\n"; + //echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo " \n"; + //echo " \n"; + //echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "
DirectionLanguageContextName (play)Number (download)DestinationStartEndLengthStatus
".$direction."".$language."".$context.""; + if (file_exists($_SESSION['switch']['recordings']['dir'].'/archive/'.$tmp_year.'/'.$tmp_month.'/'.$tmp_day.'/'.$uuid.'.wav')) { + //echo " \n"; + //echo " "; + + echo " \n"; + //$tmp_file_array = explode("\.",$file); + echo $caller_id_name.' '; + echo " "; + + } + else { + echo $caller_id_name.' '; + } + echo " "; + if (file_exists($_SESSION['switch']['recordings']['dir'].'/archive/'.$tmp_year.'/'.$tmp_month.'/'.$tmp_day.'/'.$uuid.'.wav')) { + echo " \n"; + echo $caller_id_number.' '; + echo " "; + } + else { + echo $caller_id_number.' '; + } + echo " ".$destination_number."".$start_stamp."".$end_stamp."".$duration."".$hangup_cause."
"; + echo "
"; + +//breaking space + echo "

\n"; + +//channel data loop + $c = 0; + $row_style["0"] = "row_style0"; + $row_style["1"] = "row_style1"; + echo "
\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "
Channel Data 
\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + foreach($xml->channel_data->children() as $child) { + $key = $child->getName(); + $value = urldecode($child); + echo "\n"; + echo " \n"; + echo " \n"; + echo "\n"; + if ($c==0) { $c=1; } else { $c=0; } + } + echo "
NameValue
".$key." ".wordwrap($value,75,"
\n", TRUE)." 
"; + echo "
"; + +//breaking space + echo "

\n"; + +//variable loop + $c = 0; + $row_style["0"] = "row_style0"; + $row_style["1"] = "row_style1"; + echo "
\n"; + echo "\n"; + echo "\n"; + echo " \n"; + echo "\n"; + echo "\n"; + echo "
Variables 
\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + foreach($xml->variables->children() as $child) { + $key = $child->getName(); + $value = urldecode($child); + echo "\n"; + echo " \n"; + if ($key == "bridge_uuid" || $key == "signal_bond") { + echo " \n"; + } + else { + echo " \n"; + } + echo "\n"; + if ($c==0) { $c=1; } else { $c=0; } + } + echo "
NameValue
".$key."\n"; + echo " ".$value." \n"; + $tmp_dir = $_SESSION['switch']['recordings']['dir'].'/archive/'.$tmp_year.'/'.$tmp_month.'/'.$tmp_day; + $tmp_name = ''; + if (file_exists($tmp_dir.'/'.$value.'.wav')) { + $tmp_name = $value.".wav"; + } + elseif (file_exists($tmp_dir.'/'.$value.'_1.wav')) { + $tmp_name = $value."_1.wav"; + } + elseif (file_exists($tmp_dir.'/'.$value.'.mp3')) { + $tmp_name = $value.".mp3"; + } + elseif (file_exists($tmp_dir.'/'.$value.'_1.mp3')) { + $tmp_name = $value."_1.mp3"; + } + if (strlen($tmp_name) > 0 && file_exists($_SESSION['switch']['recordings']['dir'].'/archive/'.$tmp_year.'/'.$tmp_month.'/'.$tmp_day.'/'.$tmp_name)) { + echo " \n"; + echo " play"; + echo "  "; + } + if (strlen($tmp_name) > 0 && file_exists($_SESSION['switch']['recordings']['dir'].'/archive/'.$tmp_year.'/'.$tmp_month.'/'.$tmp_day.'/'.$tmp_name)) { + echo " \n"; + echo " download"; + echo " "; + } + echo "".wordwrap($value,75,"
\n", TRUE)." 
"; + echo "
"; + +//breaking space + echo "

\n"; + +//app_log + $c = 0; + $row_style["0"] = "row_style0"; + $row_style["1"] = "row_style1"; + echo "
\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "
Application Log 
\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + foreach ($xml->app_log->application as $row) { + $app_name = $row->attributes()->app_name; + $app_data = $row->attributes()->app_data; + echo "\n"; + echo " \n"; + echo " \n"; + echo "\n"; + if ($c==0) { $c=1; } else { $c=0; } + } + echo "
NameData
".$app_name." ".wordwrap($app_data,75,"
\n", TRUE)." 
"; + echo "
"; + +//breaking space + echo "

\n"; + +//callflow + $c = 0; + $row_style["0"] = "row_style0"; + $row_style["1"] = "row_style1"; + + foreach ($xml->callflow as $row) { + + echo "\n"; + echo "\n"; + echo " \n"; + echo "\n"; + echo "
\n"; + + //attributes + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "
Call Flow: Attributes 
\n"; + + echo "\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + foreach($row->attributes() as $key => $value) { + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + if ($c==0) { $c=1; } else { $c=0; } + } + echo " \n"; + echo " \n"; + echo " \n"; + echo "
NameValue
".$key." ".wordwrap($value,75,"
\n", TRUE)." 


\n"; + + //extension->attributes + echo "\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "
Call Flow: Extension: Attributes 
\n"; + + echo "\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + foreach($row->extension->attributes() as $key => $value) { + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + if ($c==0) { $c=1; } else { $c=0; } + } + echo " \n"; + echo " \n"; + echo " \n"; + echo "
NameValue
".$key." ".wordwrap($value,75,"
\n", TRUE)." 


\n"; + + //extension->application + echo "\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "
Call Flow: Extension: Application 
\n"; + + echo "\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + foreach ($row->extension->application as $tmp_row) { + $app_name = $tmp_row->attributes()->app_name; + $app_data = $tmp_row->attributes()->app_data; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + if ($c==0) { $c=1; } else { $c=0; } + } + echo " \n"; + echo " \n"; + echo " \n"; + echo "
NameData
".$app_name." ".wordwrap($app_data,75,"
\n", TRUE)." 


\n"; + + //caller_profile + echo "\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "
Call Flow: Caller Profile 
\n"; + + echo "\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + foreach($row->caller_profile->children() as $child) { + $key = $child->getName(); + echo " \n"; + if ($key != "originatee") { + $value = urldecode($child); + echo " \n"; + echo " \n"; + } + else { + echo " \n"; + echo " \n"; + } + echo "\n"; + if ($c==0) { $c=1; } else { $c=0; } + } + echo " \n"; + echo " \n"; + echo " \n"; + echo "
NameValue
".$key." ".wordwrap($value,75,"
\n", TRUE)." 
".$key."\n"; + echo " \n"; + foreach($child->originatee_caller_profile->children() as $tmp_child) { + //print_r($tmp_child); + $key = $tmp_child->getName(); + $value = urldecode($tmp_child); + echo " \n"; + echo " \n"; + if ($key != "uuid") { + echo " \n"; + } + else { + echo " \n"; + } + echo " \n"; + } + echo "
".$key." ".wordwrap($value,75,"
\n", TRUE)." 
".$value." 
\n"; + echo "


\n"; + + //times + echo "\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + foreach($row->times->children() as $child) { + $key = $child->getName(); + $value = urldecode($child); + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + if ($c==0) { $c=1; } else { $c=0; } + } + + echo " \n"; + echo " \n"; + echo " \n"; + + echo "
Call Flow: Times 
NameValue
".$key." ".wordwrap($value,75,"
\n", TRUE)." 


"; + echo "

\n"; + } + + echo "
"; + +//testing + //echo "
\n";
+	//echo htmlentities($xml_string);
+	//print_r($xml);
+	//echo "
\n"; + +//get the footer + require_once "includes/footer.php"; +?> \ No newline at end of file diff --git a/app/xml_cdr/xml_cdr_import_update.php b/app/xml_cdr/xml_cdr_import_update.php new file mode 100644 index 0000000000..4a0aa19c39 --- /dev/null +++ b/app/xml_cdr/xml_cdr_import_update.php @@ -0,0 +1,159 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ + +//check the permission + if(defined('STDIN')) { + $document_root = str_replace("\\", "/", $_SERVER["PHP_SELF"]); + preg_match("/^(.*)\/mod\/.*$/", $document_root, $matches); + $document_root = $matches[1]; + set_include_path($document_root); + require_once "includes/require.php"; + $_SERVER["DOCUMENT_ROOT"] = $document_root; + $display_type = 'text'; //html, text + } + else { + echo "access denied"; + exit; + } + +//determine where the xml cdr will be archived + $sql = "select * from v_vars "; + $sql .= "where domain_uuid = '1' "; + $sql .= "and var_name = 'xml_cdr_archive' "; + $row = $db->query($sql)->fetch(); + $var_value = trim($row["var_value"]); + switch ($var_value) { + case "dir": + $xml_cdr_archive = 'dir'; + break; + case "db": + $xml_cdr_archive = 'db'; + break; + case "none": + $xml_cdr_archive = 'none'; + break; + default: + $xml_cdr_archive = 'dir'; + break; + } + +//get the list of installed apps from the core and mod directories + if ($xml_cdr_archive == "db") { + //get the xml cdr list + $sql = ""; + $sql .= "select xml_cdr, uuid from v_xml_cdr "; + $sql .= "where waitsec is null "; + //$sql .= "limit 5000 "; + //start the transaction + $db->beginTransaction(); + //loop through the results + $x = 0; + foreach ($db->query($sql,PDO::FETCH_ASSOC) as $row) { + //get the values from the db + $uuid = $row['uuid']; + $xml_string = $row['xml_cdr']; + //save each set of records and begin a new transaction + if ($x > 5000) { + //save the transaction + $db->commit(); + //start the transaction + $db->beginTransaction(); + //reset the count + $x = 0; + } + //parse the xml to get the call detail record info + try { + $xml = simplexml_load_string($xml_string); + } + catch(Exception $e) { + echo $e->getMessage(); + } + //get the values from the xml and set at variables + $uuid = urldecode($xml->variables->uuid); + $waitsec = urldecode($xml->variables->waitsec); + //update the database + if (strlen($waitsec) > 0) { + $sql = ""; + $sql .= "update v_xml_cdr "; + $sql .= "set waitsec = '$waitsec' "; + $sql .= "where uuid = '$uuid' "; + echo $sql."\n"; + $db->exec($sql); + $x++; + } + } + //save the transaction + $db->commit(); + //echo finished + echo "completed\n"; + } + if ($xml_cdr_archive == "dir") { + $xml_cdr_list = glob($_SESSION['switch']['log']['dir']."/xml_cdr/archive/*/*/*/*.xml"); + echo "count: ".count($xml_cdr_list)."\n"; + //print_r($xml_cdr_list); + $x = 0; + //start the transaction + $db->beginTransaction(); + //loop through the xml cdr records + foreach ($xml_cdr_list as $xml_cdr) { + //save each set of records and begin a new transaction + if ($x > 5000) { + //save the transaction + $db->commit(); + //start the transaction + $db->beginTransaction(); + //reset the count + $x = 0; + } + //get the xml cdr string + $xml_string = file_get_contents($xml_cdr); + //parse the xml to get the call detail record info + try { + $xml = simplexml_load_string($xml_string); + } + catch(Exception $e) { + echo $e->getMessage(); + } + //get the values from the xml and set at variables + $uuid = urldecode($xml->variables->uuid); + $waitsec = urldecode($xml->variables->waitsec); + //update the database + //if ($num_rows == "0" && strlen($waitsec) > 0) { + if (strlen($waitsec) > 0) { + $sql = ""; + $sql .= "update v_xml_cdr "; + $sql .= "set waitsec = '$waitsec' "; + $sql .= "where uuid = '$uuid' "; + echo $sql."\n"; + $db->exec($sql); + $x++; + } + } + //save the transaction + $db->commit(); + //echo finished + echo "completed\n"; + } \ No newline at end of file diff --git a/app/xml_cdr/xml_cdr_inc.php b/app/xml_cdr/xml_cdr_inc.php new file mode 100644 index 0000000000..99f1431d66 --- /dev/null +++ b/app/xml_cdr/xml_cdr_inc.php @@ -0,0 +1,203 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require_once "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('xml_cdr_view')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +//import xml_cdr files + require_once "v_xml_cdr_import.php"; + +//additional includes + require_once "includes/paging.php"; + +//set 24hr or 12hr clock + define('TIME_24HR', 1); + +//get post or get variables from http + if (count($_REQUEST)>0) { + $order_by = $_REQUEST["order_by"]; + $order = $_REQUEST["order"]; + $cdr_id = $_REQUEST["cdr_id"]; + $direction = $_REQUEST["direction"]; + $caller_id_name = $_REQUEST["caller_id_name"]; + $caller_id_number = $_REQUEST["caller_id_number"]; + $destination_number = $_REQUEST["destination_number"]; + $context = $_REQUEST["context"]; + $start_stamp = $_REQUEST["start_stamp"]; + $answer_stamp = $_REQUEST["answer_stamp"]; + $end_stamp = $_REQUEST["end_stamp"]; + $duration = $_REQUEST["duration"]; + $billsec = $_REQUEST["billsec"]; + $hangup_cause = $_REQUEST["hangup_cause"]; + $uuid = $_REQUEST["uuid"]; + $bleg_uuid = $_REQUEST["bleg_uuid"]; + $accountcode = $_REQUEST["accountcode"]; + $read_codec = $_REQUEST["read_codec"]; + $write_codec = $_REQUEST["write_codec"]; + $remote_media_ip = $_REQUEST["remote_media_ip"]; + $network_addr = $_REQUEST["network_addr"]; + } + +//build the sql where string + if (strlen($cdr_id) > 0) { $sql_where .= "and cdr_id like '%$cdr_id%' "; } + if (strlen($direction) > 0) { $sql_where .= "and direction like '%$direction%' "; } + if (strlen($caller_id_name) > 0) { $sql_where .= "and caller_id_name like '%$caller_id_name%' "; } + if (strlen($caller_id_number) > 0 && strlen($destination_number) > 0) { + $sql_where .= "and ("; + $sql_where .= "caller_id_number = '$caller_id_number' "; + $sql_where .= "or destination_number = '$destination_number'"; + $sql_where .= ") "; + } + else { + if (strlen($caller_id_number) > 0) { $sql_where .= "and caller_id_number like '%$caller_id_number%' "; } + if (strlen($destination_number) > 0) { $sql_where .= "and destination_number like '%$destination_number%' "; } + } + if (strlen($context) > 0) { $sql_where .= "and context like '%$context%' "; } + if ($db_type == "sqlite") { + if (strlen($start_stamp) > 0) { $sql_where .= "and start_stamp like '%$start_stamp%' "; } + if (strlen($end_stamp) > 0) { $sql_where .= "and end_stamp like '%$end_stamp%' "; } + } + if ($db_type == "pgsql" || $db_type == "mysql") { + if (strlen($start_stamp) > 0 && strlen($end_stamp) == 0) { $sql_where .= "and start_stamp between '$start_stamp 00:00:00' and '$start_stamp 23:59:59' "; } + if (strlen($start_stamp) > 0 && strlen($end_stamp) > 0) { $sql_where .= "and start_stamp between '$start_stamp 00:00:00' and '$end_stamp 23:59:59' "; } + } + if (strlen($answer_stamp) > 0) { $sql_where .= "and answer_stamp like '%$answer_stamp%' "; } + if (strlen($duration) > 0) { $sql_where .= "and duration like '%$duration%' "; } + if (strlen($billsec) > 0) { $sql_where .= "and billsec like '%$billsec%' "; } + if (strlen($hangup_cause) > 0) { $sql_where .= "and hangup_cause like '%$hangup_cause%' "; } + if (strlen($uuid) > 0) { $sql_where .= "and uuid = '$uuid' "; } + if (strlen($bleg_uuid) > 0) { $sql_where .= "and bleg_uuid = '$bleg_uuid' "; } + if (strlen($accountcode) > 0) { $sql_where .= "and accountcode = '$accountcode' "; } + if (strlen($read_codec) > 0) { $sql_where .= "and read_codec like '%$read_codec%' "; } + if (strlen($write_codec) > 0) { $sql_where .= "and write_codec like '%$write_codec%' "; } + if (strlen($remote_media_ip) > 0) { $sql_where .= "and remote_media_ip like '%$remote_media_ip%' "; } + if (strlen($network_addr) > 0) { $sql_where .= "and network_addr like '%$network_addr%' "; } + + //example sql + // select caller_id_number, destination_number from v_xml_cdr where domain_uuid = '' + // and (caller_id_number = '1001' or destination_number = '1001' or destination_number = '*991001') + if (!if_group("admin") && !if_group("superadmin")) { + $sql_where = "where domain_uuid = '$domain_uuid' "; + $sql_where .= "and ( "; + if (count($_SESSION['user']['extension']) > 0) { + $x = 0; + foreach($_SESSION['user']['extension'] as $row) { + if ($x==0) { + if ($row['user'] > 0) { $sql_where .= "caller_id_number = '".$row['user']."' \n"; } //source + } + else { + if ($row['user'] > 0) { $sql_where .= "or caller_id_number = '".$row['user']."' \n"; } //source + } + if ($row['user'] > 0) { $sql_where .= "or destination_number = '".$row['user']."' \n"; } //destination + if ($row['user'] > 0) { $sql_where .= "or destination_number = '*99".$row['user']."' \n"; } //destination + $x++; + } + } + else { + $sql_where .= "destination_number = 'no extension assigned' \n"; //destination + } + $sql_where .= ") "; + } + else { + //superadmin or admin + $sql_where = "where domain_uuid = '$domain_uuid' ".$sql_where; + } + //$sql_where = str_replace ("where or", "where", $sql_where); + //$sql_where = str_replace ("where and", " and", $sql_where); + +//set the param variable which is used with paging + $param = ""; + $param .= "&caller_id_name=$caller_id_name"; + $param .= "&start_stamp=$start_stamp"; + $param .= "&hangup_cause=$hangup_cause"; + $param .= "&caller_id_number=$caller_id_number"; + $param .= "&destination_number=$destination_number"; + $param .= "&context=$context"; + $param .= "&answer_stamp=$answer_stamp"; + $param .= "&end_stamp=$end_stamp"; + $param .= "&duration=$duration"; + $param .= "&billsec=$billsec"; + $param .= "&uuid=$uuid"; + $param .= "&bridge_uuid=$bridge_uuid"; + $param .= "&accountcode=$accountcode"; + $param .= "&read_codec=$read_codec"; + $param .= "&write_codec=$write_codec"; + $param .= "&remote_media_ip=$remote_media_ip"; + $param .= "&network_addr=$network_addr"; + +//create the sql query to get the xml cdr records + if (strlen($order_by) == 0) { $order_by = "start_epoch"; } + if (strlen($order) == 0) { $order = "desc"; } + +//set the default + $num_rows = '0'; + +//get the number of rows in the v_xml_cdr + $sql = "select count(*) as num_rows from v_xml_cdr "; + $sql .= $sql_where; + $prep_statement = $db->prepare(check_sql($sql)); + if ($prep_statement) { + $prep_statement->execute(); + $row = $prep_statement->fetch(PDO::FETCH_ASSOC); + if ($row['num_rows'] > 0) { + $num_rows = $row['num_rows']; + } + else { + $num_rows = '0'; + } + } + unset($prep_statement, $result); + +//prepare to page the results + $rows_per_page = 150; + $page = $_GET['page']; + if (strlen($page) == 0) { $page = 0; $_GET['page'] = 0; } + list($paging_controls, $rows_per_page, $var_3) = paging($num_rows, $param, $rows_per_page); + $offset = $rows_per_page * $page; + +//get the results from the db + $sql = "select * from v_xml_cdr "; + $sql .= $sql_where; + if (strlen($order_by)> 0) { $sql .= "order by $order_by $order "; } + $sql .= " limit $rows_per_page offset $offset "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_ASSOC); + $result_count = count($result); + unset ($prep_statement, $sql); + + $c = 0; + $row_style["0"] = "row_style0"; + $row_style["1"] = "row_style1"; + +?> \ No newline at end of file diff --git a/app/xml_cdr/xml_cdr_search.php b/app/xml_cdr/xml_cdr_search.php new file mode 100644 index 0000000000..22358e6316 --- /dev/null +++ b/app/xml_cdr/xml_cdr_search.php @@ -0,0 +1,157 @@ + + Copyright (C) 2008-2012 + All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('xml_cdr_view')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +if (count($_POST)>0) { + $cdr_id = $_POST["cdr_id"]; + $caller_id_name = $_POST["caller_id_name"]; + $caller_id_number = $_POST["caller_id_number"]; + $destination_number = $_POST["destination_number"]; + $context = $_POST["context"]; + $start_stamp = $_POST["start_stamp"]; + $answer_stamp = $_POST["answer_stamp"]; + $end_stamp = $_POST["end_stamp"]; + $duration = $_POST["duration"]; + $billsec = $_POST["billsec"]; + $hangup_cause = $_POST["hangup_cause"]; + $uuid = $_POST["uuid"]; + $bleg_uuid = $_POST["bleg_uuid"]; + $accountcode = $_POST["accountcode"]; + $read_codec = $_POST["read_codec"]; + $write_codec = $_POST["write_codec"]; + $remote_media_ip = $_POST["remote_media_ip"]; + $network_addr = $_POST["network_addr"]; +} +else { + + require_once "includes/header.php"; + echo "
"; + echo "\n"; + + echo "\n"; + echo " "; + echo " "; + echo "
\n"; + echo "
"; + + echo "
\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo "
Advanced Search

Source Name:
Source Number:
Destination Number:
Context:
Start:
Answer:
End:
Duration:
Bill Sec:
Status:
UUID:
Bridge UUID:
Account Code:
Read Codec:
Write Codec:
Remote Media IP:
Network Address:
"; + echo "
"; + + echo "
"; + echo "
"; + + require_once "includes/footer.php"; + +} //end if not post +?> diff --git a/app/xml_cdr/xml_cdr_statistics.php b/app/xml_cdr/xml_cdr_statistics.php new file mode 100644 index 0000000000..dfcb141c81 --- /dev/null +++ b/app/xml_cdr/xml_cdr_statistics.php @@ -0,0 +1,219 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require_once "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('xml_cdr_view')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +//additional includes + require_once "xml_cdr_statistics_inc.php"; + require_once "includes/header.php"; + +//page title and description + echo "
"; + echo "\n"; + echo "\n"; + echo " \n"; + echo " \n"; + echo "\n"; + echo "\n"; + echo " \n"; + echo "\n"; + echo "
Call Detail Record Statistics\n"; + echo " \n"; + echo " \n"; + echo "
\n"; + echo " Call Detail Records Statics summarize the call information. \n"; + echo "
\n"; + echo "
\n"; + echo "
\n"; + +//set the style + $c = 0; + $row_style["0"] = "row_style0"; + $row_style["1"] = "row_style1"; + + ?> + + + + + + + + +
+
+
+

+
+ + \n"; + echo "\n"; + echo " Hours\n"; + echo " Date\n"; + echo " Time\n"; + echo " Volume\n"; + echo " Minutes\n"; + echo " Calls Per Min\n"; + echo " Missed\n"; + echo " ASR\n"; + echo " ALOC\n"; + echo "\n"; + + $i = 0; + foreach ($stats as $row) { + echo "\n"; + if ($i < 24) { + echo " ".($i+1)."\n"; + } + elseif ($i == 24) { + echo "

\n"; + echo "\n"; + echo "\n"; + echo " \n"; + echo "

\n"; + echo " \n"; + echo "\n"; + echo "\n"; + echo " Days\n"; + echo " Date\n"; + echo " Time\n"; + echo " Volume\n"; + echo " Minutes\n"; + echo " Calls Per Min\n"; + echo " Missed\n"; + echo " ASR\n"; + echo " ALOC\n"; + echo "\n"; + echo "\n"; + echo " 1\n"; + } + elseif ($i == 25) { + echo "\n"; + echo " 7\n"; + } + elseif ($i == 26) { + echo " 30\n"; + } + if ($i < 24) { + echo " ".date('j M', $row['start_epoch'])."\n"; + echo " ".date('H:i', $row['start_epoch'])." - ".date('H:i', $row['stop_epoch'])." \n"; + } + else { + echo " ".date('j M', $row['start_epoch'])." \n"; + echo " ".date('H:i', $row['start_epoch'])." - ".date('j M H:i', $row['stop_epoch'])." \n"; + } + echo " ".$row['volume']." \n"; + echo " ".(round($row['minutes'],2))." \n"; + echo " ".(round($row['avg_min'],2))." \n"; + echo " ".$row['missed']." \n"; + echo " ".(round($row['asr'],2))." \n"; + echo " ".(round($row['aloc'],2))." \n"; + echo "\n"; + if ($c==0) { $c=1; } else { $c=0; } + $i++; + } + echo "\n"; + +//show the footer + require_once "includes/footer.php"; +?> \ No newline at end of file diff --git a/app/xml_cdr/xml_cdr_statistics_csv.php b/app/xml_cdr/xml_cdr_statistics_csv.php new file mode 100644 index 0000000000..5275f431a4 --- /dev/null +++ b/app/xml_cdr/xml_cdr_statistics_csv.php @@ -0,0 +1,73 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('xml_cdr_view')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +//include the xml cdr statistics backend + require_once "xml_cdr_statistics_inc.php"; + +//set the http header + header('Content-type: application/octet-binary'); + header('Content-Disposition: attachment; filename=cdr-statistics.csv'); + +//show the column names on the first line + $z = 0; + foreach($stats[1] as $key => $val) { + if ($z == 0) { + echo '"'.$key.'"'; + } + else { + echo ',"'.$key.'"'; + } + $z++; + } + echo "\n"; + +//add the values to the csv + $x = 0; + foreach($stats as $row) { + $z = 0; + foreach($row as $key => $val) { + if ($z == 0) { + echo '"'.$stats[$x][$key].'"'; + } + else { + echo ',"'.$stats[$x][$key].'"'; + } + $z++; + } + echo "\n"; + $x++; + } +?> \ No newline at end of file diff --git a/app/xml_cdr/xml_cdr_statistics_inc.php b/app/xml_cdr/xml_cdr_statistics_inc.php new file mode 100644 index 0000000000..75bf5bedeb --- /dev/null +++ b/app/xml_cdr/xml_cdr_statistics_inc.php @@ -0,0 +1,246 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require_once "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('xml_cdr_view')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +//show all call detail records to admin and superadmin. for everyone else show only the call details for extensions assigned to them + if (!if_group("admin") && !if_group("superadmin")) { + // select caller_id_number, destination_number from v_xml_cdr where domain_uuid = '' + // and (caller_id_number = '1001' or destination_number = '1001' or destination_number = '*991001') + $sql_where = "where domain_uuid = '$domain_uuid' and ( "; + if (count($_SESSION['user']['extension']) > 0) { + $x = 0; + foreach($_SESSION['user']['extension'] as $row) { + if ($x==0) { + if ($row['user'] > 0) { $sql_where .= "caller_id_number = '".$row['user']."' \n"; } //source + } + else { + if ($row['user'] > 0) { $sql_where .= "or caller_id_number = '".$row['user']."' \n"; } //source + } + if ($row['user'] > 0) { $sql_where .= "or destination_number = '".$row['user']."' \n"; } //destination + if ($row['user'] > 0) { $sql_where .= "or destination_number = '*99".$row['user']."' \n"; } //destination + $x++; + } + } + $sql_where .= ") "; + } + else { + //superadmin or admin + $sql_where = "where domain_uuid = '$domain_uuid' "; + } + +//create the sql query to get the xml cdr records + if (strlen($order_by) == 0) { $order_by = "start_epoch"; } + if (strlen($order) == 0) { $order = "desc"; } + +//calculate the seconds in different time frames + $seconds_hour = 3600; + $seconds_day = $seconds_hour * 24; + $seconds_week = $seconds_day * 7; + $seconds_month = $seconds_day * 30; + +//get the call volume between a start end end time in seconds + function get_call_volume_between($start, $end, $where) { + global $db; + if (strlen($where) == 0) { + $where = "where domain_uuid = '".$_SESSION['domain_uuid']."' "; + } + $sql = " select count(*) as count from v_xml_cdr "; + $sql .= $where; + $sql .= "and start_epoch BETWEEN ".$start." AND ".$end." "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_ASSOC); + unset ($prep_statement, $sql); + if (count($result) > 0) { + foreach($result as $row) { + return $row['count']; + } + } + else { + return false; + } + unset($prep_statement, $result, $sql); + } + +//get the call time in seconds between the start and end time in seconds + function get_call_seconds_between($start, $end, $where) { + global $db; + if (strlen($where) == 0) { + $where = "where domain_uuid = '".$_SESSION['domain_uuid']."' "; + } + $sql = " select sum(billsec) as seconds from v_xml_cdr "; + $sql .= $where; + $sql .= "and start_epoch BETWEEN ".$start." AND ".$end." "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_ASSOC); + unset ($prep_statement, $sql); + if (count($result) > 0) { + foreach($result as $row) { + $result = $row['seconds']; + if (strlen($result) == 0) { + return 0; + } + else { + return $row['seconds']; + } + } + } + else { + return false; + } + unset($prep_statement, $result, $sql); + } + //$call_seconds_1st_hour = get_call_seconds_between(3600, 0); + //if (strlen($call_seconds_1st_hour) == 0) { $call_seconds_1st_hour = 0; } + +//round down to the nearest hour + $time = time() - time() % 3600; + +//call info hour by hour + for ($i = 0; $i <= 23; $i++) { + $stats[$i]['start_epoch'] = $time - 3600*$i; + $stats[$i]['stop_epoch'] = $stats[$i]['start_epoch'] + 3600; + $stats[$i]['volume'] = get_call_volume_between($stats[$i]['start_epoch'], $stats[$i]['stop_epoch'], ''); + $stats[$i]['seconds'] = get_call_seconds_between($stats[$i]['start_epoch'], $stats[$i]['stop_epoch'], ''); + $stats[$i]['minutes'] = $stats[$i]['seconds'] / 60; + $stats[$i]['avg_sec'] = $stats[$i]['seconds'] / $stats[$i]['volume']; + $stats[$i]['avg_min'] = ($stats[$i]['volume'] - $stats[$i]['missed']) / 60; + + //answer / seizure ratio + $where = "where domain_uuid = '".$_SESSION['domain_uuid']."' "; + $where .= "and billsec = '0' "; + $where .= "and direction = 'inbound' "; + $stats[$i]['missed'] = get_call_volume_between($stats[$i]['start_epoch'], $stats[$i]['stop_epoch'], $where); + $stats[$i]['asr'] = (($stats[$i]['volume'] - $stats[$i]['missed']) / ($stats[$i]['volume']) * 100); + + //average length of call + $stats[$i]['aloc'] = $stats[$i]['minutes'] / ($stats[$i]['volume'] - $stats[$i]['missed']); + } + +//call info for a day + $i = 24; + $stats[$i]['start_epoch'] = time() - $seconds_day; + $stats[$i]['stop_epoch'] = time(); + $stats[$i]['volume'] = get_call_volume_between($stats[$i]['start_epoch'], $stats[$i]['stop_epoch'], ''); + $stats[$i]['seconds'] = get_call_seconds_between($stats[$i]['start_epoch'], $stats[$i]['stop_epoch'], ''); + $stats[$i]['minutes'] = $stats[$i]['seconds'] / 60; + $stats[$i]['avg_sec'] = $stats[$i]['seconds'] / $stats[$i]['volume']; + $stats[$i]['avg_min'] = ($stats[$i]['volume'] - $stats[$i]['missed']) / (60*24); + $where = "where domain_uuid = '".$_SESSION['domain_uuid']."' "; + $where .= "and billsec = '0' "; + $where .= "and direction = 'inbound' "; + $stats[$i]['missed'] = get_call_volume_between($stats[$i]['start_epoch'], $stats[$i]['stop_epoch'], $where); + $stats[$i]['asr'] = (($stats[$i]['volume'] - $stats[$i]['missed']) / ($stats[$i]['volume']) * 100); + $stats[$i]['aloc'] = $stats[$i]['minutes'] / ($stats[$i]['volume'] - $stats[$i]['missed']); + $i++; + +//call info for a week + $stats[$i]['start_epoch'] = time() - $seconds_week; + $stats[$i]['stop_epoch'] = time(); + $stats[$i]['volume'] = get_call_volume_between($stats[$i]['start_epoch'], $stats[$i]['stop_epoch'], ''); + $stats[$i]['seconds'] = get_call_seconds_between($stats[$i]['start_epoch'], $stats[$i]['stop_epoch'], ''); + $stats[$i]['minutes'] = $stats[$i]['seconds'] / 60; + $stats[$i]['avg_sec'] = $stats[$i]['seconds'] / $stats[$i]['volume']; + $stats[$i]['avg_min'] = ($stats[$i]['volume'] - $stats[$i]['missed']) / (60*24*7); + $where = "where domain_uuid = '".$_SESSION['domain_uuid']."' "; + $where .= "and billsec = '0' "; + $where .= "and direction = 'inbound' "; + $stats[$i]['missed'] = get_call_volume_between($stats[$i]['start_epoch'], $stats[$i]['stop_epoch'], $where); + $stats[$i]['asr'] = (($stats[$i]['volume'] - $stats[$i]['missed']) / ($stats[$i]['volume']) * 100); + $stats[$i]['aloc'] = $stats[$i]['minutes'] / ($stats[$i]['volume'] - $stats[$i]['missed']); + $i++; + +//call info for a month + $stats[$i]['start_epoch'] = time() - $seconds_month; + $stats[$i]['stop_epoch'] = time(); + $stats[$i]['volume'] = get_call_volume_between($stats[$i]['start_epoch'], $stats[$i]['stop_epoch'], ''); + $stats[$i]['seconds'] = get_call_seconds_between($stats[$i]['start_epoch'], $stats[$i]['stop_epoch'], ''); + $stats[$i]['minutes'] = $stats[$i]['seconds'] / 60; + $stats[$i]['avg_sec'] = $stats[$i]['seconds'] / $stats[$i]['volume']; + $stats[$i]['avg_min'] = ($stats[$i]['volume'] - $stats[$i]['missed']) / (60*24*30); + $where = "where domain_uuid = '".$_SESSION['domain_uuid']."' "; + $where .= "and billsec = '0' "; + $where .= "and direction = 'inbound' "; + $stats[$i]['missed'] = get_call_volume_between($stats[$i]['start_epoch'], $stats[$i]['stop_epoch'], $where); + $stats[$i]['asr'] = (($stats[$i]['volume'] - $stats[$i]['missed']) / ($stats[$i]['volume']) * 100); + $stats[$i]['aloc'] = $stats[$i]['minutes'] / ($stats[$i]['volume'] - $stats[$i]['missed']); + $i++; + +//show the graph + $x = 0; + foreach ($stats as $row) { + $graph['volume'][$x][] = date('H', $row['start_epoch']); + $graph['volume'][$x][] = $row['volume']/1; + if ($x == 23) { break; } + $x++; + } + $x = 0; + foreach ($stats as $row) { + $graph['minutes'][$x][] = date('H', $row['start_epoch']); + $graph['minutes'][$x][] = round($row['minutes'],2); + if ($x == 23) { break; } + $x++; + } + $x = 0; + foreach ($stats as $row) { + $graph['call_per_min'][$x][] = date('H', $row['start_epoch']); + $graph['call_per_min'][$x][] = round($row['avg_min'],2); + if ($x == 23) { break; } + $x++; + } + $x = 0; + foreach ($stats as $row) { + $graph['missed'][$x][] = date('H', $row['start_epoch']); + $graph['missed'][$x][] = $row['missed']/1; + if ($x == 23) { break; } + $x++; + } + $x = 0; + foreach ($stats as $row) { + $graph['asr'][$x][] = date('H', $row['start_epoch']); + $graph['asr'][$x][] = round($row['asr'],2)/100; + if ($x == 23) { break; } + $x++; + } + $x = 0; + foreach ($stats as $row) { + $graph['aloc'][$x][] = date('H', $row['start_epoch']); + $graph['aloc'][$x][] = round($row['aloc'],2); + if ($x == 23) { break; } + $x++; + } + +?> \ No newline at end of file diff --git a/app/xml_edit/app_config.php b/app/xml_edit/app_config.php new file mode 100644 index 0000000000..a0c0eee327 --- /dev/null +++ b/app/xml_edit/app_config.php @@ -0,0 +1,26 @@ + \ No newline at end of file diff --git a/app/xml_edit/clip.db b/app/xml_edit/clip.db new file mode 100644 index 0000000000000000000000000000000000000000..5f15c2fb9e6b01f81d6fbfa9df77d259a1ae0126 GIT binary patch literal 2056 zcmeHIQES^U5SHq|vJSHcGeX}EH_)1G$-@{7nq>1@(S|u)=6J9&LQrF+^{}lVYps*F zcBN1Ib^Aq=>^``JjXjQ%!|(;pvaffgh4>Q1b2AG6x1yUc|!%jlbV1dP>%5m;9>2?)`aB=l^^3TG1{$(mN1*4hQ@)1ux2^zDz+k ztYy^Emi64)Hk*^-$5Eg<-&93|E|mDIZIAc#u@q6!IB%nl8rzOFQu;%pncD literal 0 HcmV?d00001 diff --git a/app/xml_edit/clipadd.php b/app/xml_edit/clipadd.php new file mode 100644 index 0000000000..fed2365c17 --- /dev/null +++ b/app/xml_edit/clipadd.php @@ -0,0 +1,123 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('xml_editor_save')) { + //access granted +} +else { + echo "access denied"; + exit; +} +require_once "config.php"; + +if (count($_POST)>0) { + $clip_name = check_str($_POST["clip_name"]); + $clip_folder = check_str($_POST["clip_folder"]); + $clip_text_start = check_str($_POST["clip_text_start"]); + $clip_text_end = check_str($_POST["clip_text_end"]); + $clip_desc = check_str($_POST["clip_desc"]); + $clip_order = check_str($_POST["clip_order"]); + + $sql = "insert into v_clip_library "; + $sql .= "("; + $sql .= "clip_name, "; + $sql .= "clip_folder, "; + $sql .= "clip_text_start, "; + $sql .= "clip_text_end, "; + $sql .= "clip_desc, "; + $sql .= "clip_order "; + $sql .= ")"; + $sql .= "values "; + $sql .= "("; + $sql .= "'$clip_name', "; + $sql .= "'$clip_folder', "; + $sql .= "'$clip_text_start', "; + $sql .= "'$clip_text_end', "; + $sql .= "'$clip_desc', "; + $sql .= "'$clip_order' "; + $sql .= ")"; + $db->exec(check_sql($sql)); + unset($sql,$db); + + require_once "header.php"; + echo "\n"; + echo "Add Complete"; + require_once "footer.php"; + return; +} + + require_once "header.php"; + echo "
"; + echo "\n"; + + echo "\n"; + echo " "; + echo " "; + echo "
\n"; + + echo "
"; + echo ""; + echo " "; + echo " "; + echo " "; + echo " "; + + echo " "; + echo " "; + echo " "; + echo " "; + + echo " "; + echo " "; + echo " "; + + echo " "; + echo " "; + echo " "; + + echo " "; + echo " "; + echo " "; + + echo " "; + echo " "; + echo " "; + echo "
Name:
Folder:
Before Selection:
"; + echo " "; + echo "
After Selection:
"; + echo " "; + echo "
Notes:
"; + echo " "; + echo "
"; + echo "
"; + + echo "
"; + echo "
"; + +require_once "footer.php"; +?> \ No newline at end of file diff --git a/app/xml_edit/clipdelete.php b/app/xml_edit/clipdelete.php new file mode 100644 index 0000000000..bdc059d619 --- /dev/null +++ b/app/xml_edit/clipdelete.php @@ -0,0 +1,54 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('xml_editor_save')) { + //access granted +} +else { + echo "access denied"; + exit; +} +require_once "config.php"; + +$id = $_GET["id"]; +if (strlen($id)>0) { + $sql = ""; + $sql .= "delete from v_clip_library "; + $sql .= "where id = '$id' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + unset($sql,$db); +} + +require_once "header.php"; +echo "\n"; +echo "Delete Complete"; +require_once "footer.php"; +return; + +?> diff --git a/app/xml_edit/cliplist.php b/app/xml_edit/cliplist.php new file mode 100644 index 0000000000..3f19d4c222 --- /dev/null +++ b/app/xml_edit/cliplist.php @@ -0,0 +1,224 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('xml_editor_view')) { + //access granted +} +else { + echo "access denied"; + exit; +} +require_once "config.php"; + +echo ""; +echo ""; +echo ""; + +function isfile($filename) { + if (@filesize($filename) > 0) { return true; } else { return false; } +} + +function space($count) { + $r=''; $i=0; + while($i < $count) { + $r .= ' '; + $i++; + } + return $r; +} + +//show the content + echo ""; + + echo ""; + +echo ""; +echo ""; + + echo "
"; + echo "\n"; + + echo "\n"; + echo "
\n"; + echo "
Clip Library
\n"; //display:none + + $sql = ""; + $sql .= "select * from v_clip_library "; + $sql .= "order by clip_folder "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + $result_count = count($result); + if ($result_count > 0) { + $last_folder = ''; + $tag_open = ''; + $x = 0; + $current_depth = 0; + $previous_depth = 0; + foreach($result as $row) { + $current_depth = count(explode ("/", $row[clip_folder])); + if ($current_depth < $previous_depth) { + $count = ($previous_depth - $current_depth); + $i=0; + while($i < $count){ + echo "
\n"; + $i++; + } + echo "
\n"; + } + + if ($last_folder != $row[clip_folder]) { + $clip_folder_name = str_replace ($previous_folder_name, "", $row[clip_folder]); + $clip_folder_name = str_replace ("/", "", $clip_folder_name); + echo "
 ".$clip_folder_name."  
\n\n"; + $tag_open = 1; + } + + $previous_depth = $current_depth; + $previous_folder_name = $row[clip_folder]; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "
\n"; + echo "".$row[clip_name]."\n"; + echo "
\n"; + echo "\n\n"; + + $last_folder = $row[clip_folder]; + + if ($c==0) { $c=1; } else { $c=0; } + } //end foreach + unset($sql, $result, $row_count); + + } //end if results + + echo "\n"; + echo "
\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "
"; + echo "

"; + + echo ""; + echo ""; + +?> \ No newline at end of file diff --git a/app/xml_edit/clipoptions.php b/app/xml_edit/clipoptions.php new file mode 100644 index 0000000000..fec1ac5e80 --- /dev/null +++ b/app/xml_edit/clipoptions.php @@ -0,0 +1,73 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('xml_editor_view')) { + //access granted +} +else { + echo "access denied"; + exit; +} +require_once "config.php"; +require_once "header.php"; + +echo "
"; +echo "\n"; +echo ""; +echo "\n"; +echo ""; +echo "\n"; +echo "\n"; +echo "\n"; +echo "\n"; +echo "
Selected Clip:
"; + +echo " "; + +echo ""; + +echo " "; +//echo " \n"; +//echo " \n"; +//echo " \n"; + +echo " \n"; +echo " \n"; +//echo " \n"; +echo " \n"; +echo " \n"; +echo " \n"; +echo "
Options











"; + +echo "
"; +echo "
"; + +require_once "footer.php"; +?> diff --git a/app/xml_edit/clipoptionslist.php b/app/xml_edit/clipoptionslist.php new file mode 100644 index 0000000000..e6c7ff579a --- /dev/null +++ b/app/xml_edit/clipoptionslist.php @@ -0,0 +1,247 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('xml_editor_view')) { + //access granted +} +else { + echo "access denied"; + exit; +} +require_once "config.php"; + +echo ""; +echo ""; + +echo ""; + +function isfile($filename) { + if (@filesize($filename) > 0) { return true; } else { return false; } +} + +function space($count) { + $r=''; $i=0; + while($i < $count) { + $r .= ' '; + $i++; + } + return $r; +} + +//show the content + echo ""; + + echo ""; + +echo ""; +echo ""; + + echo "
"; + echo "\n"; + + echo "\n"; + echo "
\n"; + echo "
Clip Library
\n"; //display:none + + $sql = ""; + $sql .= "select * from v_clip_library "; + $sql .= "order by clip_folder "; + //$sql .= "and clip_name asc "; + + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + $result_count = count($result); + + if ($result_count == 0) { + //no results + } + else { //received results + $last_folder = ''; + $tag_open = ''; + $x = 0; + $current_depth = 0; + $previous_depth = 0; + foreach($result as $row) { + $current_depth = count(explode("/", $row[clip_folder])); + if ($current_depth < $previous_depth) { + $count = ($previous_depth - $current_depth); + $i=0; + while($i < $count){ + echo "
\n"; + $i++; + } + echo "
\n"; + + } + + if ($last_folder != $row[clip_folder]) { + $clip_folder_name = str_replace ($previous_folder_name, "", $row[clip_folder]); + $clip_folder_name = str_replace ("/", "", $clip_folder_name); + echo "
 ".$clip_folder_name."  
\n\n"; + $tag_open = 1; + } + + $previous_depth = $current_depth; + $previous_folder_name = $row[clip_folder]; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "
\n"; + echo "".$row[clip_name]."\n"; + echo "
\n"; + echo "\n\n"; + + $last_folder = $row[clip_folder]; + + if ($c==0) { $c=1; } else { $c=0; } + } //end foreach + unset($sql, $result, $row_count); + + } //end if results + + echo "\n"; + echo "
\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "
"; + + echo "

"; + echo ""; + echo ""; + +?> diff --git a/app/xml_edit/clipsearch.php b/app/xml_edit/clipsearch.php new file mode 100644 index 0000000000..c405fca466 --- /dev/null +++ b/app/xml_edit/clipsearch.php @@ -0,0 +1,187 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "config.php"; +require_once "includes/checkauth.php"; +if (permission_exists('xml_editor_view')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +if (count($_POST)>0) { + $id = $_POST["id"]; + $clip_name = $_POST["clip_name"]; + $clip_folder = $_POST["clip_folder"]; + $clip_text_start = $_POST["clip_text_start"]; + $clip_text_end = $_POST["clip_text_end"]; + $clip_desc = $_POST["clip_desc"]; + $clip_order = $_POST["clip_order"]; + + require_once "header.php"; + echo "
"; + echo "\n"; + + echo "\n"; + echo " \n"; + echo "\n"; + + } //end if results + + echo "
\n"; + echo "
"; + + $sql = ""; + $sql .= "select * from v_clip_library "; + $sql .= "where "; + if (strlen($id) > 0) { $sql .= "and id like '%$id%' "; } + if (strlen($clip_name) > 0) { $sql .= "and clip_name like '%$clip_name%' "; } + if (strlen($clip_folder) > 0) { $sql .= "and clip_folder like '%$clip_folder%' "; } + if (strlen($clip_text_start) > 0) { $sql .= "and clip_text_start like '%$clip_text_start%' "; } + if (strlen($clip_text_end) > 0) { $sql .= "and clip_text_end like '%$clip_text_end%' "; } + if (strlen($clip_desc) > 0) { $sql .= "and clip_desc like '%$clip_desc%' "; } + if (strlen($clip_order) > 0) { $sql .= "and clip_order like '%$clip_order%' "; } + + + $sql = trim($sql); + if (substr($sql, -5) == "where"){ $sql = substr($sql, 0, (strlen($sql)-5)); } + $sql = str_replace ("where and", "where", $sql); + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + $result_count = count($result); + + $c = 0; + $row_style["0"] = "background-color: #F5F5DC;"; + $row_style["1"] = "background-color: #FFFFFF;"; + + echo "
\n"; + echo "\n"; + echo ""; + + if ($result_count == 0) { //no results + echo ""; + } + else { //received results + + echo ""; + //echo ""; + echo ""; + //echo ""; + //echo ""; + //echo ""; + //echo ""; + //echo ""; + echo ""; + echo "\n"; + + foreach($result as $row) { + //print_r( $row ); + echo "\n"; + //echo ""; + echo ""; + //echo ""; + //echo ""; + //echo ""; + //echo ""; + //echo ""; + echo ""; + + echo "\n"; + if ($c==0) { $c=1; } else { $c=0; } + } //end foreach unset($sql, $result, $row_count); + + echo "
 
    Id        clip_name Search         clip_folder        clip_text_start        clip_text_end        clip_desc        clip_order   
".$row[id]."".$row[clip_name]."".$row[clip_folder]."".$row[clip_text_start]."".$row[clip_text_end]."".$row[clip_desc]."".$row[clip_order]."
\n"; + echo "
\n"; + + + echo "

"; + echo "
\n"; + echo "
"; + + echo "

"; + require_once "footer.php"; + + unset ($result_count); + unset ($result); + unset ($key); + unset ($val); + unset ($c); + +} +else { + + require_once "header.php"; + echo "
"; + echo "\n"; + + echo "\n"; + echo " "; + echo " "; + echo "
\n"; + echo "
"; + + echo "
"; + echo ""; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + echo " "; + echo " "; + echo " "; + echo "
Name:
Folder:
Start:
End:
Desc:
clip_order:
"; + echo "
"; + + echo "
"; + echo "
"; + + require_once "footer.php"; + +} //end if not post +?> diff --git a/app/xml_edit/clipupdate.php b/app/xml_edit/clipupdate.php new file mode 100644 index 0000000000..674d4cc7d1 --- /dev/null +++ b/app/xml_edit/clipupdate.php @@ -0,0 +1,142 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('xml_editor_save')) { + //access granted +} +else { + echo "access denied"; + exit; +} +require_once "config.php"; + +if (count($_POST)>0) { + $id = check_str($_POST["id"]); + $clip_name = check_str($_POST["clip_name"]); + $clip_folder = check_str($_POST["clip_folder"]); + $clip_text_start = check_str($_POST["clip_text_start"]); + $clip_text_end = check_str($_POST["clip_text_end"]); + $clip_desc = check_str($_POST["clip_desc"]); + $clip_order = check_str($_POST["clip_order"]); + + //sql update + $sql = "update v_clip_library set "; + $sql .= "clip_name = '$clip_name', "; + $sql .= "clip_folder = '$clip_folder', "; + $sql .= "clip_text_start = '$clip_text_start', "; + $sql .= "clip_text_end = '$clip_text_end', "; + $sql .= "clip_desc = '$clip_desc', "; + $sql .= "clip_order = '$clip_order' "; + $sql .= "where id = '$id' "; + $count = $db->exec(check_sql($sql)); + //echo "Affected Rows: ".$count; + + + //edit: make sure the meta redirect url is correct + require_once "header.php"; + echo "\n"; + echo "Update Complete"; + require_once "footer.php"; + return; +} +else { + //get data from the db + $id = $_GET["id"]; + + $sql = ""; + $sql .= "select * from v_clip_library "; + $sql .= "where id = '$id' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach ($result as &$row) { + $clip_name = $row["clip_name"]; + $clip_folder = $row["clip_folder"]; + $clip_text_start = $row["clip_text_start"]; + $clip_text_end = $row["clip_text_end"]; + $clip_desc = $row["clip_desc"]; + $clip_order = $row["clip_order"]; + break; //limit to 1 row + } + echo ""; + echo "
";} + + require_once "header.php"; + echo "
"; + echo "\n"; + + echo "\n"; + echo " "; + echo " "; + echo "
\n"; + + echo "
"; + echo ""; + echo " "; + echo " "; + echo " "; + echo " "; + + echo " "; + echo " "; + echo " "; + echo " "; + + echo " "; + echo " "; + echo " "; + + echo " "; + echo " "; + echo " "; + + echo " "; + echo " "; + echo " "; + + echo " "; + echo " "; + echo " "; + echo "
Name:
Folder:
Before Selection:
"; + echo " "; + echo "
After Selection:
"; + echo " "; + echo "
Notes:
"; + echo " "; + echo "
"; + echo " "; + echo " "; + echo "
"; + echo "
"; + + echo "
"; + echo "
"; + + require_once "footer.php"; +?> diff --git a/app/xml_edit/config.php b/app/xml_edit/config.php new file mode 100644 index 0000000000..9806b236e7 --- /dev/null +++ b/app/xml_edit/config.php @@ -0,0 +1,176 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ + +include "root.php"; + +error_reporting (E_ALL ^ E_NOTICE); + +$applicationname = 'Edit'; +$bodyoptions = ""; + +$dbfilename = "clip.db"; +$db_file_path = PROJECT_PATH."/xml_edit/"; + +//$temp = $_ENV["TEMP"]."\\"; +if (is_writable($db_file_path.$dbfilename)) { //is writable + //use database in current location + echo "yes"; +} +else { //not writable + /* + //running from a non writable location so copy to temp directory + if (file_exists($temp.$dbfilename)) { + $db_file_path = $temp; //file already exists use existing file + } + else { //file doese not exist + //copy the file to the temp dir + if (copy($db_file_path.$dbfilename, $temp.$dbfilename)) { + //echo "copy succeeded.\n"; + $db_file_path = $temp; + } + else { + echo "Copy Failed "; + exit; + } + } + */ +} + +function get_string_between($string, $start, $end){ + $string = " ".$string; + $ini = strpos($string,$start); + if ($ini == 0) return ""; + $ini += strlen($start); + $len = strpos($string,$end,$ini) - $ini; + return substr($string,$ini,$len); +} + +//$fullstring = "this is my [tag]dog[/tag]"; +//$parsed = get_string_between($fullstring, "[tag]", "[/tag]"); + +//database connection +try { + //$db = new PDO('sqlite2:example.db'); //sqlite 2 + //$db = new PDO('sqlite::memory:'); //sqlite 3 + if (!function_exists('phpmd5')) { + function phpmd5($string) { + return md5($string); + } + } + if (!function_exists('phpmd5')) { + function phpunix_timestamp($string) { + return strtotime($string); + } + } + if (!function_exists('phpnow')) { + function phpnow() { + return date('r'); + } + } + + if (!function_exists('phpleft')) { + function phpleft($string, $num) { + return substr($string, 0, $num); + } + } + + if (!function_exists('phpright')) { + function phpright($string, $num) { + return substr($string, (strlen($string)-$num), strlen($string)); + } + } + + if (!function_exists('phpsqlitedatatype')) { + function phpsqlitedatatype($string, $field) { + + //--- Begin: Get String Between start and end characters ----- + $start = '('; + $end = ')'; + $ini = stripos($string,$start); + if ($ini == 0) return ""; + $ini += strlen($start); + $len = stripos($string,$end,$ini) - $ini; + $string = substr($string,$ini,$len); + //--- End: Get String Between start and end characters ----- + + $strdatatype = ''; + $stringarray = split (',', $string); + foreach($stringarray as $lnvalue) { + + //$strdatatype .= "-- ".$lnvalue ." ".strlen($lnvalue)." delim ".strrchr($lnvalue, " ")."---
"; + //$delimpos = stripos($lnvalue, " "); + //$strdatatype .= substr($value,$delimpos,strlen($value))." --
"; + + $fieldlistarray = split (" ", $value); + //$strdatatype .= $value ."
"; + //$strdatatype .= $fieldlistarray[0] ."
"; + //echo $fieldarray[0]."
\n"; + if ($fieldarray[0] == $field) { + //$strdatatype = $fieldarray[1]." ".$fieldarray[2]." ".$fieldarray[3]." ".$fieldarray[4]; //strdatatype + } + unset($fieldarray, $string, $field); + } + + //$strdatatype = $string; + return $strdatatype; + } + } //end function + +/* + $db = new PDO('sqlite:'.$db_file_path.$dbfilename); //sqlite 3 + //bool PDO::sqliteCreateFunction ( string function_name, callback callback [, int num_args] ) + $db->sqliteCreateFunction('md5', 'phpmd5', 1); + //$db->sqliteCreateFunction('unix_timestamp', 'phpunix_timestamp', 1); + $db->sqliteCreateFunction('now', 'phpnow', 0); + $db->sqliteCreateFunction('sqlitedatatype', 'phpsqlitedatatype', 2); + $db->sqliteCreateFunction('strleft', 'phpleft', 2); + $db->sqliteCreateFunction('strright', 'phpright', 2); +*/ +} +catch (PDOException $error) { + print "error: " . $error->getMessage() . "
"; + die(); +} + +if(!function_exists('escapejs')){ + function escapejs($strtemp) { + $strtemp = str_replace ("\"", "\\\"", $strtemp); //escape the single quote + //$strtemp = str_replace ("'", "''", $strtemp); //escape the single quote + return $strtemp; + } +} + +if(!function_exists('check_str')){ + function check_str($strtemp) { + //$strtemp = str_replace ("\$", "\\\$", $strtemp); //escape the single quote + //$strtemp = str_replace ("\'", "''", $strtemp); //escape the single quote + $strtemp = str_replace ("'", "''", $strtemp); //escape the single quote + //echo "strtemp $strtemp"; + return $strtemp; + } +} + +?> diff --git a/app/xml_edit/filedelete.php b/app/xml_edit/filedelete.php new file mode 100644 index 0000000000..a45796b4d4 --- /dev/null +++ b/app/xml_edit/filedelete.php @@ -0,0 +1,87 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('xml_editor_save')) { + //access granted +} +else { + echo "access denied"; + exit; +} +require_once "config.php"; + +$folder = $_GET["folder"]; +$folder = str_replace ("\\", "/", $folder); +if (substr($folder, -1) != "/") { $folder = $folder.'/'; } +$file = $_GET["file"]; + +//echo $folder.$file; + +if (strlen($folder) > 0 && strlen($file) > 0) { + unlink($folder.$file); + header("Location: fileoptions.php"); +} +else { + //display form + require_once "header.php"; + echo "
"; + echo "
"; + echo "
"; + echo ""; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo "
Path:
".$folder.$file."
"; + + echo "
"; + + echo ""; + echo " "; + echo " "; + echo " "; + + echo " "; + echo " "; + echo " "; + + echo " "; + echo " "; + echo " "; + echo "
File Name:
"; + echo " "; + echo " "; + echo "
"; + echo "
"; + echo "
"; + + require_once "footer.php"; +} +?> diff --git a/app/xml_edit/filelist.php b/app/xml_edit/filelist.php new file mode 100644 index 0000000000..79290797e4 --- /dev/null +++ b/app/xml_edit/filelist.php @@ -0,0 +1,281 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('xml_editor_view')) { + //access granted +} +else { + echo "access denied"; + exit; +} +require_once "app/xml_edit/config.php"; +require_once "app/xml_edit/header.php"; + +function isfile($filename) { + //if (@filesize($filename) > 0) { return true; } else { return false; } +} + +function space($count) { + $r=''; $i=0; + while($i < $count) { + $r .= ' '; + $i++; + } + return $r; +} + +function recur_dir($dir) { + clearstatcache(); + $htmldirlist = ''; + $htmlfilelist = ''; + $dirlist = opendir($dir); + $dir_array = array(); + while (false !== ($file = readdir($dirlist))) { + if ($file != "." AND $file != ".."){ + $newpath = $dir.'/'.$file; + $level = explode('/',$newpath); + if (substr($newpath, -4) == ".svn") { + //ignore .svn dir and subdir + } + elseif (substr($newpath, -3) == ".db") { + //ignore .db files + } + else { + $dir_array[] = $newpath; + } + if ($x > 1000) { break; }; + $x++; + } + } + + asort($dir_array); + foreach ($dir_array as $newpath){ + $level = explode('/',$newpath); + + if (is_dir($newpath)) { + /*$mod_array[] = array( + 'level'=>count($level)-1, + 'path'=>$newpath, + 'name'=>end($level), + 'type'=>'dir', + 'mod_time'=>filemtime($newpath), + 'size'=>''); + $mod_array[] = recur_dir($newpath); + */ + $dirname = end($level); + $htmldirlist .= space(count($level))."
$dirname
\n"; + //$htmldirlist .= space(count($level))."
Tools
\n"; + //$htmldirlist .= space(count($level))."
New Folder
\n"; //parent.document.getElementById('file').value='".urlencode($newpath)."' + //$htmldirlist .= space(count($level))."
\n"; + //$htmldirlist .= space(count($level))."
New File
\n"; //parent.document.getElementById('file').value='".urlencode($newpath)."' + //$htmldirlist .= space(count($level))."
\n"; + //$htmldirlist .= space(count($level))."
\n"; + //$htmldirlist .= space(count($level))."
Options
\n"; //parent.document.getElementById('file').value='".urlencode($newpath)."' + //$htmldirlist .= space(count($level))."
\n"; + $htmldirlist .= recur_dir($newpath); + $htmldirlist .= space(count($level))."
\n"; + } + else { + /*$mod_array[] = array( + 'level'=>count($level)-1, + 'path'=>$newpath, + 'name'=>end($level), + 'type'=>'file', + 'mod_time'=>filemtime($newpath), + 'size'=>filesize($newpath)); + */ + $filename = end($level); + $filesize = round(filesize($newpath)/1024, 2); + $htmlfilelist .= space(count($level))."
$filename
\n"; + $htmlfilelist .= space(count($level))."
\n"; + } + } + closedir($dirlist); + return $htmldirlist ."\n". $htmlfilelist; +} + +//begin the content + echo ""; + + echo ""; + + echo "
"; + echo "\n"; + + echo "\n"; + echo " "; + //echo ""; + echo ""; + echo ""; + //echo ""; + //echo ""; + if ($menu_item_protected == "true") { + echo ""; + } + else { + echo ""; + } + echo ""; + + //echo ""; + + echo " \n"; + echo ""; + + //update the menu order + if ($row2[menu_item_order] != $tmp_menu_item_order) { + $sql = "update v_menu_items set "; + $sql .= "menu_item_title = '".$row2[menu_item_title]."', "; + $sql .= "menu_item_order = '".$tmp_menu_item_order."' "; + $sql .= "where menu_uuid = '".$menu_uuid."' "; + $sql .= "and menu_item_uuid = '".$row2[menu_item_uuid]."' "; + $count = $db->exec(check_sql($sql)); + } + $tmp_menu_item_order++; + + //check for additional sub menus + if (strlen($menu_item_uuid)> 0) { + $c = build_db_child_menu_list($db, $menu_item_level, $menu_item_uuid, $c); + } + + if ($c==0) { $c=1; } else { $c=0; } + } //end foreach + unset($sql, $result2, $row2); + } + return $c; + //end check for children +} + +require_once "includes/header.php"; +$order_by = $_GET["order_by"]; +$order = $_GET["order"]; + + echo "
"; + echo "
\n"; + echo "\n"; + echo " \n"; + echo "\n"; + echo "
Files
\n"; //display:none + //echo "
Files
\n"; //display:none + + //echo "
Tools
\n"; + //echo "
New Folder
\n"; //parent.document.getElementById('file').value='".urlencode($newpath)."' + //echo "
\n"; + //echo "
New File
\n"; //parent.document.getElementById('file').value='".urlencode($newpath)."' + //echo "
\n"; + //echo "
\n"; + + echo recur_dir($_SESSION['switch']['conf']['dir']); + + echo "
\n"; + + /* + echo "
Files
\n"; + echo "\n"; + echo "
Folder 1
\n"; + echo "\n"; + echo "
demo1.php
\n"; + echo "
\n"; + echo "\n"; + echo "
demo2.php
\n"; + echo "
\n"; + echo "\n"; + echo "
\n"; + echo "\n"; + echo "
Folder 2
\n"; + echo "\n"; + echo "
demo3.php
\n"; + echo "
\n"; + echo "\n"; + echo "
demo4.php
\n"; + echo "
\n"; + echo "\n"; + echo "
\n"; + echo "\n"; + echo "
\n"; + */ + + echo "
\n"; + echo ""; + + echo "

"; + require_once "footer.php"; + + echo ""; + echo ""; + +?> diff --git a/app/xml_edit/filenew.php b/app/xml_edit/filenew.php new file mode 100644 index 0000000000..c6d49568af --- /dev/null +++ b/app/xml_edit/filenew.php @@ -0,0 +1,90 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('xml_editor_save')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +$folder = $_GET["folder"]; +$folder = str_replace ("\\", "/", $folder); +if (substr($folder, -1) != "/") { $folder = $folder.'/'; } +$file = $_GET["file"]; + +if (strlen($folder) > 0 && strlen($file) > 0) { + //create new file + $handle = fopen($folder.$file, 'wb') or die("Error!!"); + $content = ""; + fwrite($handle, $content); + fclose($handle); + + header("Location: fileoptions.php"); +} +else { + require_once "header.php"; + echo "
"; + echo "
"; + echo "
"; + echo ""; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo "
Path:
".$folder.$file."
"; + + echo "
"; + + echo ""; + echo " "; + echo " "; + echo " "; + + echo " "; + echo " "; + echo " "; + + echo " "; + echo " "; + echo " "; + echo "
File Name:
"; + echo " "; + echo " "; + echo "
"; + echo "
"; + echo "
"; + + require_once "footer.php"; + +} + +?> diff --git a/app/xml_edit/fileoptions.php b/app/xml_edit/fileoptions.php new file mode 100644 index 0000000000..208cff3600 --- /dev/null +++ b/app/xml_edit/fileoptions.php @@ -0,0 +1,89 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('xml_editor_view')) { + //access granted +} +else { + echo "access denied"; + exit; +} +require_once "config.php"; +require_once "header.php"; + +$file = $_GET["file"]; +$file = str_replace ("\\", "/", $file); +$folder = $_GET["folder"]; +$folder = str_replace ($file, "", $folder); + +$urlpath = str_replace ($_SERVER["DOCUMENT_ROOT"], "", $folder); + +echo "
"; +echo "\n"; +echo ""; +echo "\n"; +echo "\n"; + +echo "\n"; +echo "\n"; +echo "\n"; +echo "\n"; +echo "
"; + +echo ""; +echo ""; +echo "\n"; +echo "\n"; +echo ""; +echo "
Path:
File:
"; + +echo "
"; + +echo " "; + +echo ""; + +echo "
"; +echo ""; +echo " \n"; +echo " \n"; +echo " \n"; +echo " \n"; +echo " \n"; +echo " \n"; +echo " \n"; +echo "





"; +echo "
"; + +echo "
"; +echo "
"; + +require_once "footer.php"; +?> diff --git a/app/xml_edit/fileoptionslist.php b/app/xml_edit/fileoptionslist.php new file mode 100644 index 0000000000..46994251ef --- /dev/null +++ b/app/xml_edit/fileoptionslist.php @@ -0,0 +1,270 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('xml_editor_view')) { + //access granted +} +else { + echo "access denied"; + exit; +} +require_once "config.php"; +require_once "header.php"; + +function isfile($filename) { + if (@filesize($filename) > 0) { return true; } else { return false; } +} + +function space($count) { + $r=''; $i=0; + while($i < $count) { + $r .= ' '; + $i++; + } + return $r; +} + +function recur_dir($dir) { + clearstatcache(); + $htmldirlist = ''; + $htmlfilelist = ''; + $dirlist = opendir($dir); + while ($file = readdir ($dirlist)) { + if ($file != '.' && $file != '..') { + $newpath = $dir.'/'.$file; + $level = explode('/',$newpath); + + if (is_dir($newpath)) { + /*$mod_array[] = array( + 'level'=>count($level)-1, + 'path'=>$newpath, + 'name'=>end($level), + 'type'=>'dir', + 'mod_time'=>filemtime($newpath), + 'size'=>''); + $mod_array[] = recur_dir($newpath); + */ + $dirname = end($level); + $htmldirlist .= space(count($level))."
$dirname
\n"; + //$htmldirlist .= space(count($level))."
Tools
\n"; + //$htmldirlist .= space(count($level))."
New Folder
\n"; //parent.document.getElementById('file').value='".urlencode($newpath)."' + //$htmldirlist .= space(count($level))."
\n"; + //$htmldirlist .= space(count($level))."
New File
\n"; //parent.document.getElementById('file').value='".urlencode($newpath)."' + //$htmldirlist .= space(count($level))."
\n"; + //$htmldirlist .= space(count($level))."
\n"; + //$htmldirlist .= space(count($level))."
Options
\n"; //parent.document.getElementById('file').value='".urlencode($newpath)."' + //$htmldirlist .= space(count($level))."
\n"; + $htmldirlist .= recur_dir($newpath); + $htmldirlist .= space(count($level))."
\n"; + + } + else { + /*$mod_array[] = array( + 'level'=>count($level)-1, + 'path'=>$newpath, + 'name'=>end($level), + 'type'=>'file', + 'mod_time'=>filemtime($newpath), + 'size'=>filesize($newpath)); + */ + $filename = end($level); + $filesize = round(filesize($newpath)/1024, 2); + $newpath = str_replace ($filename, "", $newpath); + $htmlfilelist .= space(count($level))."
$filename
\n"; + $htmlfilelist .= space(count($level))."
\n"; + } + + + } + } + + closedir($dirlist); + return $htmldirlist ."\n". $htmlfilelist; +} + +//show the content + echo "\n"; + + echo "\n"; + + echo "
"; + echo "\n"; + echo "\n"; + echo "
\n"; + //echo "
"; + + echo "\n"; + echo " \n"; + echo "\n"; + echo "
Files
\n"; //display:none + //echo "
Files
\n"; //display:none + + //echo "
Tools
\n"; + //echo "
New Folder
\n"; //parent.document.getElementById('file').value='".urlencode($newpath)."' + //echo "
\n"; + //echo "
New File
\n"; //parent.document.getElementById('file').value='".urlencode($newpath)."' + //echo "
\n"; + //echo "
\n"; + echo recur_dir($_SESSION['switch']['conf']['dir']); + + echo "
\n"; + + /* + echo "
Files
\n"; + echo "\n"; + echo "
Folder 1
\n"; + echo "\n"; + echo "
demo1.php
\n"; + echo "
\n"; + echo "\n"; + echo "
demo2.php
\n"; + echo "
\n"; + echo "\n"; + echo "
\n"; + echo "\n"; + echo "
Folder 2
\n"; + echo "\n"; + echo "
demo3.php
\n"; + echo "
\n"; + echo "\n"; + echo "
demo4.php
\n"; + echo "
\n"; + echo "\n"; + echo "
\n"; + echo "\n"; + echo "
\n"; + */ + + echo "
\n"; + echo ""; + + echo "

"; + require_once "footer.php"; + + echo ""; + echo ""; + +?> diff --git a/app/xml_edit/fileread.php b/app/xml_edit/fileread.php new file mode 100644 index 0000000000..3885abaded --- /dev/null +++ b/app/xml_edit/fileread.php @@ -0,0 +1,48 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +if (permission_exists('xml_editor_view')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +$filename = $_POST["file"]; +$filename = str_replace ("\\", "/", $filename); + +$handle = fopen($filename, "r"); +if ($handle) { + while (!feof($handle)) { + $buffer = fgets($handle, 4096); + echo $buffer; + } + fclose($handle); +} + +?> diff --git a/app/xml_edit/filerename.php b/app/xml_edit/filerename.php new file mode 100644 index 0000000000..9df4307c57 --- /dev/null +++ b/app/xml_edit/filerename.php @@ -0,0 +1,102 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('xml_editor_save')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +$folder = $_GET["folder"]; +//$folder = str_replace ("\\", "/", $folder); +//if (substr($folder, -1) != "/") { $folder = $folder.'/'; } +$newfilename = $_GET["newfilename"]; +$filename = $_GET["filename"]; +//echo $folder.$file; + + +if (strlen($folder) > 0 && strlen($newfilename) > 0) { + //echo "new file: ".$newfilename."
"; + //echo "folder: ".$folder."
"; + //echo "orig filename: ".$filename."
";; + rename($folder.$filename, $folder.$newfilename); + header("Location: fileoptions.php"); +} +else { //display form + + require_once "header.php"; + echo "
"; + echo "
"; + echo "
"; + echo ""; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo "
Path:
".$folder.$filename."

Original file name:
".$filename."
"; + + echo "
"; + + echo ""; + echo " "; + echo " "; + echo " "; + + echo " "; + echo " "; + echo " "; + + echo " "; + echo " "; + echo " "; + echo "
Rename file to:
"; + echo " "; + echo " "; + echo " "; + echo "
"; + echo "
"; + echo "
"; + + require_once "footer.php"; + +} + +?> diff --git a/app/xml_edit/filesave.php b/app/xml_edit/filesave.php new file mode 100644 index 0000000000..0d19eaab53 --- /dev/null +++ b/app/xml_edit/filesave.php @@ -0,0 +1,50 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('xml_editor_save')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +$filename = $_POST["file"]; //filename with the path +$filename = str_replace ("\\", "/", $filename); +$content = $_POST["content"]; + +$handle = fopen($filename, 'wb') or die("Error!!"); +fwrite($handle, $content); +fclose($handle); + +//set the reload_xml value to true + $_SESSION["reload_xml"] = true; + +echo $content; + +?> diff --git a/app/xml_edit/folderdelete.php b/app/xml_edit/folderdelete.php new file mode 100644 index 0000000000..97c2592ea8 --- /dev/null +++ b/app/xml_edit/folderdelete.php @@ -0,0 +1,46 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('xml_editor_save')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +$folder = $_GET["folder"]; +$folder = str_replace ("\\", "/", $folder); + +if (strlen($folder) > 0) { + //delete the folder + rmdir($folder); //, 0700 + header("Location: fileoptions.php"); +} + +?> \ No newline at end of file diff --git a/app/xml_edit/foldernew.php b/app/xml_edit/foldernew.php new file mode 100644 index 0000000000..922d8eb5a2 --- /dev/null +++ b/app/xml_edit/foldernew.php @@ -0,0 +1,86 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('xml_editor_save')) { + //access granted +} +else { + echo "access denied"; + exit; +} +require_once "config.php"; + +$folder = $_GET["folder"]; +$folder = str_replace ("\\", "/", $folder); +$foldername = $_GET["foldername"]; + +if (strlen($folder) > 0 && strlen($foldername) > 0) { + //create new folder + mkdir($folder.'/'.$foldername); //, 0700 + header("Location: fileoptions.php"); +} +else { //display form + + require_once "header.php"; + echo "
"; + echo "
"; + echo "
"; + echo ""; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo "
Path:
".$folder."
"; + + echo "
"; + + echo ""; + echo " "; + echo " "; + echo " "; + + echo " "; + echo " "; + echo " "; + + echo " "; + echo " "; + echo " "; + echo "
Folder Name:
"; + echo " "; + echo " "; + echo "
"; + echo "
"; + echo "
"; + + require_once "footer.php"; +} + +?> diff --git a/app/xml_edit/footer.php b/app/xml_edit/footer.php new file mode 100644 index 0000000000..b11f46e5d4 --- /dev/null +++ b/app/xml_edit/footer.php @@ -0,0 +1,43 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +/* +echo "

"; +echo "
"; + +echo ""; +echo "fusionpbx "; +echo "        "; +echo "http://fusionpbx.com"; +echo "        "; +echo "Author: Mark J. Crane "; + +echo ""; +*/ +echo "
"; +echo ""; +echo ""; + +?> \ No newline at end of file diff --git a/app/xml_edit/header.php b/app/xml_edit/header.php new file mode 100644 index 0000000000..bd10f557d3 --- /dev/null +++ b/app/xml_edit/header.php @@ -0,0 +1,83 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ + +echo ""; +echo ""; +echo ""; +//echo ""; +echo ""; + + +echo ""; +echo ""; +echo ""; +echo "
"; + +?> \ No newline at end of file diff --git a/app/xml_edit/images/Thumbs.db b/app/xml_edit/images/Thumbs.db new file mode 100644 index 0000000000000000000000000000000000000000..46593a8c2e513a420f7803451a0bd7d6795fb2c2 GIT binary patch literal 20992 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 literal 0 HcmV?d00001 diff --git a/app/xml_edit/images/file.png b/app/xml_edit/images/file.png new file mode 100644 index 0000000000000000000000000000000000000000..33b5f5f37461bbc6045d4cef96ba2125c4e9b256 GIT binary patch literal 434 zcmV;j0ZsmiP)uaf2v`Q{?Wj` zolMeZbD4;Gy{&Gi?KsW?6A=+P>>rC&Ve~E{qfvNqd3|^Pkfv!4vHfruMrKEGOhj6{ zn_bUwmWIQdEXxds>m6(DZmh382QNVo6a+P$Ywe0qk|c$u$H}zBJ2^ckA^;3LKKZ*l z+XX@VQ5JOCErwY*ySgpM8jjO~jnx&U*c5>2SLGkxECHC6Vpc|?m|>$c!E5q4r=u}r zE2R`O04&g4@I8-NF$0|2VP+ex`~v`h82}qY)s(ryH%a1`;Ul8G{e!$y4XKR!PG|DpT-{reY}_-t#}`2YX^``4}iKh2doeVSihwfuk8^5y;O**UyG^BIO3Q2fclD#GBxpaXI^C{7sImo>OF zHMg|3wRd#3DhUeev+}5P2+FHWljakc)G8>WAthy_VybSmj8oQ3Mo>X_ovxa}v}q#F z!pwq<3QYEz`}Rq&8HtN4YqDGDZ9c6c#_c4hsU_&J;Mz4SULgki%jQzL){h=D8sEOF zX|C&N_4XadGX^6qHdQP3A3r6vO@wql8+oM!IBrPjWBVJ?B2l=o-C15hyJE%(B{oJr Sel>v`CpJEIV{K$$um%8JN5t*` literal 0 HcmV?d00001 diff --git a/app/xml_edit/images/gear.png b/app/xml_edit/images/gear.png new file mode 100644 index 0000000000000000000000000000000000000000..1adf1e778f6316dd9c926465783631b6222f9bc6 GIT binary patch literal 822 zcmV-61Ihe}P)eo} zK~#9!)so9=6j>O>&#kJis;+*et4$>x6Dtvwi6-j82co!91Q*$)vk`ftifVKj7JYhr@yM@dJK) zv0se~7yeYbw|1p;L$^w$(!8o_a9!7qIj@hr8(HeV_?KLr*H$08VKBFST}Ml?<& z2ZE*gIRf$4wXGMUC>pBPs<#q)Vw^{u{`V?`*6Mhs{v77x=(lo(?yozAr1zyF}u_x-oS z!$adYu3wWH0PNep-)eN6BW}BUCTS*N8fFU*IpR1b0+_0*OxKOJjT<(dT@FJSoGXW2BC+Oau#;gW$(}rOcxczVAPonw+WufC>Pf=ZS1K_wD=l z`S*UM^2uplyVB^xn;&Len@O6Cbt`LH6+_d>5=dqefrRVz2pLI4W)`pa1{>07*qoM6N<$f$y4XKR!PG|DpT-{reY}_-t#}`2YX^``4}iKh2doeVSihwfuk8^5y;O**UyG^BIO3Q2fclD#GBxpaXI^C{7sImo>OF zHMg|3wRd#3DhUeev+}5P2+FHWljakc)G8>WAthy_VybSmj8oQ3Mo>X_ovxa}v}q#F z!pwq<3QYEz`}Rq&8HtN4YqDGDZ9c6c#_c4hsU_&J;Mz4SULgki%jQzL){h=D8sEOF zX|C&N_4XadGX^6qHdQP3A3r6vO@wql8+oM!IBrPjWBVJ?B2l=o-C15hyJE%(B{oJr Sel>v`CpJEIV{K$$um%8JN5t*` literal 0 HcmV?d00001 diff --git a/app/xml_edit/images/minus.gif b/app/xml_edit/images/minus.gif new file mode 100644 index 0000000000000000000000000000000000000000..1094ab912b8bb9b8e457364e0a200b2364ab03fb GIT binary patch literal 124 zcmV-?0E7QWNk%w1VF>^U0J8u9!nvt_oVfS)^njkZ?Ca(K|Nqa(yZ!z9+SSVd008mv z?6}C+OEI5}ij{m|i2qdX6 eqL8fXBPt3ZGliKs5{uIv@gM1_O&;L91u8iN$P#Df)7TJT8#}oW??~ hx9yTADX<=5Q2xxo`aq_+!TExQ8Ot=TR6#}tYXC82HyZ!| literal 0 HcmV?d00001 diff --git a/app/xml_edit/images/program.gif b/app/xml_edit/images/program.gif new file mode 100644 index 0000000000000000000000000000000000000000..dc3dfa11044671bd33ce9778d7a10254fe748f00 GIT binary patch literal 61 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 literal 0 HcmV?d00001 diff --git a/app/xml_edit/images/thumbnails/cliplibrary.png b/app/xml_edit/images/thumbnails/cliplibrary.png new file mode 100644 index 0000000000000000000000000000000000000000..bc70f332fd4c8d15111d9a5fc1d66d0ea165b724 GIT binary patch literal 20544 zcma&Ob97`u_b%MACKKDXHL08= zt4?*FI{VrC+0W{*?+TKL@VM{*002>1N=z950AmH6MzG+Zo)_9aQ_u^Xy_BXC0Dyq@ z?*s#+WnhCkVVtGq#bFi@U;*rCL82ex001#ST1;5gedR3E%K&}9<+JN@?Ce0omKYYc zmW3E>SJ$e;(8yX|E~vErCx1h7L51qiRVUQzx9Ez8xh%|te6i|#s;t_GO&^9nA6p_mGvx%`+fi6Kax4IVL05HrOZ~VS7-ph8U<>!gp_GAwUWRx9b z{Z~N}XMhO>m_H*a-P-UJRJ=1bk2RbqR;xn10i6XdyO4N9HAkexos!#NFTP8$oad#! z&Vv@7>jw)MmmHog6rc#Y2@K62aj6;-&uyax#u_S7~*}7wjg$7Bw3U9AFJPvY9GqHFPY66Wa`E zAX$;04`n|6RU9qhbws!>H}abm?uCs`KAtNyhX2(C}KHEt?>bS>lXfib@fu zkcQ5`5pa~$OPZ@4tE>qf7g*RwVJO<{3=l&lrPb8#nG%9-6^WC{BLNW4MJ4@6p}G5M zt2(+sSP)%kU>Lt7x&76@kdXiT+&<;i}^@0?lrUpnd6~EH&(QUgH-N-RtyK zG-82-tTVqBAQT5qA_kD6r3UwB1Q((dQUc>;iwD43CO{hSModBVV)BSu{DgFbn$U^} zqY|no;pVS(h^H%(1BfgdJ)ou0U05#f(jyf9o$(@s&PVY@B>>aG^||!kjkYtBC**CX zY$AHEd9LBIk>zGca~>gow=!?7Q|7pH2h80j!$SHC`I91pL55N-x^#WE0N|t?;qE&k z*4=ajU2nb_yGtt1-z_1GCy}Q>mLULKpAZ30XDTK|u+!qwB@nhWc@16x^HgyKsN_

AS5iwh#Q1TI1(Gn8irYlH`jJ<$qg(`KtnuYyYMqr5=6N-c?y8 ztiVRd3(;=?jAhZwC`>QfFt@cDYMHE(V-%2+WQ?s~@FBs7x_z zey&0Nxx}D+H?);pHFopcSSfD}K>r$N6K5(iYmg3*k^z_mQ~T*lq@_HwbSAxfpE~$y zyX>_ygyu&c$eSl2mbsEbynmEHK_jqFW)DlJptFalNJ#aCz()8dBB^yxy%fz7yz(#D zByt)RG8d6fw?&gu{4|!Q*`M<(4?G(VlLk1mTgt}bx}Z4) zS{xUUW34e79`%}bPi@Zx6~XBWE#_D;v*%h(K|0H0B3>hVb%q|`vg$xIaC<4Qt)3H7#b6jFH`hdBufNIO-EQ-x&h|R1s#XjSl zdnz)Uiz6~i!fw%;AjzhaneD^l(T)cgE6`Bl_pP3Z$5-))Z}8Fi@$#8^*fCvir?-6F z28?*Ho#@&+*^L)nFh6i3tk3#Hy8T$)y9@Dqo1G*CtM4SxFjD30t7VNrCeWSRfD$dP zWOfNb;RJ24m1=7ZPHCuFN^m*6q(BO3S_|B}rw_>hOHykQG?NvRJUtq5t(;VZbwoj6 zk!9;wfGrk1Tq0ZrH?6Fru#+fO>_zc}=EnUGsq}9jPk3gN9Zycm@fi|_)fi}vJ+QQs6T;c2_Ittl=2PqVWbkjB>Xv_@W{9Tj$^Z=AD?@5IC(7-8n z-3Wd0q!J$O+~YX{e5YfzVRQYr^k&WUiS@?c|S_tH=Q33mc%Asuum|9Njo#D4kaY*jbU{m{Rs zd1$?qZtDukE3kb3vIgU+9l000pK#m=6n$Y+U0blinjQfD>-f0aL0J;@R-y@cii}Kq zrJB7Np1a(lv&BojBgwuAOiO^)#)oXXRIRaKWtgn22IDO>d^Txi>S(@vlT!3ICBqgm zhc!e?!bp`vD?*$VSqd&ej)#>^QC^avhJ~FzMJEQL7culERoggpM-+m#q(wAk!#7Q> zIgEk}1^AGJ$xiI<{?Cs(&|Q?*pjTa>)qep{Ik_Bx0oI!pAqhko%b!f2AG zPPY*7T-P3Asi%HYS`{FZxCexW_tY&F&|Nyss4_1V_;lrs}DA{`7fXzEc# z5>L4-YwRV#m-o!cJoyZ+hN&&a1Gq zS2!uU@*Q<1tM!b4%3-LTkD5jb48BJAn3a1%>%mdDfgnX936-2sNpXj3yFGk9}sM>MLV1nSJ^$ZXt|-@5Q0|^b2CYYtL7BNkzSb^0XfxbdU z?3yik*m@?9CcIbyf+Y@{G7r11e#Y|-*8}6IZ}Ei+%fJb|&1-=uEV((Q+u3=zZTaJu z%51i(+x1(^XA>=f+yio~SY;y4y&FNZG*BR5PjJO=#QEr8_R6b>C+ zO-LOKeVLw5TMuM56W45U{)Nh#43jvPI&yP&&Wo=I~A` zfuc>EFpN)T7MBAKsM&oQ<8aFS=3$FOsu(da)uEZjriikq!#`X%m4yrNE~8<0)#>Y8Uuu-f|Ae-(jbk->cUt^jD*zP z>=W=bf5yL-Ui0{xB5=9He=TpOoe%NV{veoPCqZe)E0bFs_IfB7s$_Zhr9R)C@X3>r z0R7QT5KM=lp@?-wWmqHG0k~_%IW5}?!BZqrSgu|I-Zd&NDgH_E)}J?{=bzf`=O+l! zZ9W^SinnbSjqB@`HQCmdKW&SE&WnfHVlQ+qVA$Z%5Y;}q$Ng=Ca^8E>=Mu}8Jam1v zZ|2z*QANdx8@ID`oP!J-*^OlwLbJOu1@f(QHZ!^rdK@FZhc^lsQ$bE){m~)u+EC75 z3?+B;PkJ6u2~HIP5n5~ccAjaUZY3J`W+VM=GDLQa&6e$#-XJSO4_6$m%5Tq=_0nz( zD>Lti=eo(1rDYGTli}x0b*%Kr`arhL$4KZksBk+uH@=yFW}e>fuT`D(TS=3ina4>& z1#1LI6ioo3_0RhCmxty{LAKp}yMmpn(;HgX(Q9sTmAprXpFd*w(+$zTviTe}GWym2 zQq)ejzriRZYEzJ*O|z)<$;WXrTSv7Xkhc8TECdbRnXJF?(^|t~luzH&K?7(fB{4ns zDW&!NQ^(4^2TG2RKtBDx)-`pLvi-FDXk=08s&dOZ<2e7;`K^;Q+g%Nr|Ph1*%p-TmKa4W0;N7H^|Y*1w3iw z^Y)TrftuS^l^_X`SW4i*-*{_kH~=FGONuLUW#k4#kaG>g>1b7br@(8%`7l*MiE5w1 ztiC5zy|?6p_Arjr?UA-Vzwf4C7UN_Vvrp;IkEfU9i6Lt&z;V0y0lu!mbeR7NR;kgy||mR$$YP5qj01b@t49zp^itiX#qf6?ZZh;Hp=8}+x>C=(z$z=}xY zhIXQfk^A(b(B5XbNRfYtR+=rllfTtw&*D|!_%&1MI!OI-b)a?Up2Gk2b@EMiw|%Tl zKhVmPtNu>Uoc6me1}_-|53TKZri6jL~q{#J4TE8B9AQD^O8zf2p-S1f~5-f z{<{kW{A7;6N&HY6zIxQG;L{M4*aURaid1_gd9+0Kj1412u) z6uL7kSTh*`Zc?GO%B%}4su(gcVnXuVz*mE65iXbzofdBn z-ojb7E5>k=TPq^-H`;FtFdtn_B%uC~V`qWa0 z>wAiVqWSFX@}0A%IQ?|$7xfD<_Gdx;+D4ZZ(_;FTZUT3!(=uOn5<0gBV)KP! zvdJaEnWE8Y}3&`qXG4j9sMX?`vXJ+hJyxf~1vuglMv2V|mJR0dFS1EZydw2QZP)*e7^1LuU z09&rvz-P>}1og}w3aakYg(NP{uAii^ri+L6sZNB3(mp-3_kG+RQg{6qenq?bv#qdC zF#>LPQ{VVWIXGEs=yIs$f&Be5xWwjDK0RXW@QrVvZb9<-gZ7>7j1=`Ke zwyjr{R>Jp-RmY)aUt;s%PD|eHv%A#8m}DA z5(0y7r$y;k=W>r58;t6;{H-z=%W#yb1afr;@I#;XlV-i zL$fG$<)88FRAUnL6>3f^&O(q;VgQ(L@^!xTo2*u z0t)Nj?auW!3BN#!63A$lmRZ`V&u+vJd7SPS3x50%-KY#(tRE%MMPPMibuK*RZ-nBx z_jC=nX)~Tw$lo-wru)5B+A_S~vq8~x4jt+Ds#)qu?=mh9-P0{D0k)#wjO5rm28QVc zKYg$ZoK61I>NFd_ zPyDAOw5zWMk6mVprwer>8A^xk#WyYzU%eQ;tKp$T`EWgZ^~=#6fo`KJ8Z!n4jRj&+ zO-LyrVQN^}9$>X~Z6N@eMhvad@ohFHw6 zr-_kIz3&BysGr6W74pii0}HId69QhLZEFEf&&wm^j&Dvxuyv4T%54&@shwLGQ=a;* zhpJPO(S7?8fb8yYS$-n8vnReWt7F>rY{<3cRa19-!;*yqp1u>&+ihO&lcNh%yveAX zHJ(6o9KvWim*`wS?BAWF=KD3`H_h`NmvCv@y$+c2J=OHnPxlEM6T1KXV}oG&4l%o6 zOuJaIZG|&9QvgW2x~~$ryFq4beg9b!RFb}EHW`mI*Nm6KcA7MDo)toQ$34rv;XnvT zFt7ZeSC;)USCV1c5j;@tiv(4yZ-3gf;m$q9_L*q9$1g9&=&q}-;!tWH-0c;&D&g(z zc9Z3YB;MBg(1k5HLS@oBMbn8;^VrR{T@OJc6kknY4Ts|~EDZx7phb7# zzt@JB=bmx-nIF9UG+~koV#W*sN1pdVbKL4@FWaX6q_siu-{XO6w-q?MpY0rXJD)<* zwKj)vV1QnzK$3*axEkG=LZ`0V2&d=d29l_)SV zS9>$c9;;agi$f=NbdRPhRcIT|5KzeFZrP5}ibzlneZ;kYkw3U|sL2xf zGVFq=@H}BDbI0${PhgTQ8ZLPK1cAoQU(CIBmpgS>5YNlVS{xIhvmJ9gZgrsfKB4;g zXRyK0tty@4v*`QRc>UM>jd;6>Oe?U;$B)qlf|JotCUyZ|U;P^^zd5Z;dH9+du;LB$ z5gfd1oQ|gRt|b*DcMUv08}kQj7D}jLTkO_Z2~im#I1P~$WWxYyW}853!!(oNf-{Ta zNxb>8pq&u-Zadk1T|Z8hH4ve4Q~+1Zf~jB^5g3b%S`DWh&k$5Ey;2}T;_UmOzn|q- z#Q~T~xQJmQtTH!?0J3N)*G?hA`UCA>RQ{rlpu1{Fp*6y>i4|Ffj6X0w8^ZX!i&BJZ z3uCVQx{`d_BLYwO49jqcrWbdNr-a05oq}>cdJvdim&sixU1J2wGjdUw8joF*n)2yb z7C-`U1fywOYt9TKBh^%bJ~=~&h=#phXb)`-QbM>v1qBryvzhvxk0^ z%GHLH?p2P?g-GQTv6+oNeeTc_{VN3rBT5XVjpj*?3PzkqkSh}L1&>r&h8j)-l{JHd z@7dw;47RZ9EG%2Z{u)Mqqq%be}UyYy;^fJ{cwC- zs8BpWidq+?-lEI5UN`2CB;R|*zP;Ud9RI_%)A&=@UFV(jbR5jj=fx|wrkIY42gK}) z3uYZ@5o$ykl)x#nj<_lEKvH>W8Vq#j+6v3v@~#b^3;7rqh+)7-C(fdN+RL46c7t0m zhrAnfzml^mA$R^cF*=;G0#&4hvRUC@yoh3f=dL)i=lPq;&G$z(yA4O()k?*6#@~V8 zMSd%{QbH0-osb8`Pz0OzDr@MY|^PWfODGUA=#3fj&TJ@NxJNOcx{UB zCoNOPm(A!X{^PvDGw)T4UZm5WM!Jq2pDwlzVyBrE!Y`|BC+}w4UuHedTnK=#Q=>#* zE~V1;&;8&97Kja&bDBf>Qr;BzOvvaEwP2;EVN>jTkQJ8r*5&!v-yO&-)Vew;Yn_ET z0k}~;#*(@8lKQGFcyU$mQUS5w;R__S{KIn4&ze_s+Npl7R>Lxa_4y-y^Wpv>nEB0R zwCFR+b_G`qv)YSktrfXEdX^15ds#?{{WJip{y{ znAbtzQ7TR%a#X9>-fHG2J;Nuszb^mh$b6loP8pQK87`?T|E7X|JZvKe zme&)Nk6d5fIs^; zhYS}iIS>Vp*xY{OMZF_J%QI;^JGg!}sl|R~`lj1OxPmAQCy|Gs)K=t-I2g*ROAg@t(N|JGv{2gvF3xjEm~abu8mt!W zJd0=jsfbFD{v6}?;1|D*2=UWGvC{gkg~Cf3%>5&C>6^!k6(_?3Gyr|^n`?9^wVw6w zLZmYSB>p-ouIz@vYWiuF)zcEng{nWJllSi72l?J%OsxV3{a<4*hR3V4m57d#U2;Hk zL)_Dyya=Gn(3N66s^Sg+EWZ|H3h` z9Nc|+v@)9SjeYRP)hGs&&$OZ8ZIo4##hL*pxWbfl-s9=eTq7y0K-xCY0ChQx0$Cp_ zSQ;I2kpYL2rGi2qJeWKDH0gA)>hN>`pL9at)w&ZFhD^58b&Mn+`{}Hob*#pe0q5X~ zxRBuDB7TMxcRLH5ZS8#k!GWsq8=D9$3A_Akg0iy9x`8I^5bO2@qotcVgZ|@K+GCUN zN?P?0Hwo{3T7+U{>#-xnI=$=xwj_;agSYN3Rc6eZ>pO)x`9+)jC5-Fl^O3BZ;QI^H zXy>4d?7`AuD#zvLQz^nhMwTetSh?k{pZEN;V%0KVKv8@JMM4g8Nkw+!1oygVL8!kN zL4<_ZVW#(6Xxp+iL#mhFi?gisqCZWy`8j^UkLsu3QqAOrb4HnR}Y@TM@!^ z>7##b?rsirvG|`-uf4UaFGp1A(o~Z*?4ti`KrbD_tumW3*{t7_$<}lbf_c}}%=Glkb+00Tq7c03 zbF1@}sqO4zoX+kWiLdq_F!)I8yaH8s)7!gOEgl{%&QC+9Ya6TmkMH!dW~#%E_EJjI zms|}TP2xqoOx9X;@xGsZ2#LxvnJL<0;XB0ws}Is)6oW;1bO=S%g>%3Fx`+!uhjU+T z-{^qW{ovxt`hYe-;EJnB#_MUx;Ri9D{1w3`M8KvhRD`<~x$% z@w6;jg@R(EUsp=V@9~nzUT8q*doxSbB#Eit#(&$qx_CDd`BDKEj>+M*0{n#}EFMGt zt788pWODd(0#91H3{dRWz+ji9Zr6O-@j7Uyz`HSwc48|_=r)40=}W__t0*J0!yB{Q zMgM3XapLFub79h0R{XKb@8R)L&*|ie9v~jXpRJy8lB(-BU!tk~x#4*zUQ>^kY}4OR zGwyfuIO)fKUSjoQ07LKYqeFAI3p(d$BWhCbo0JuEoN{2Gn^A%YlF;CYv+#$b#CAJQ z5Wn%msr-N7>kDRl1FbE1l2NTn@`@{z1GC zXYCOF^JO6pGxv(;9i8SXc#Di)l&!C-_3{wu3D$BLwS!txet9 z3KVlQw_5aNXaQZmyno9b!UUjz={Ct8FuB^^*jSWVSF=iO`M=R3BL$3$bNjFR3V`XD)9 ztF4aD^sw6KX6MIFMxEk_z*-xT)A7vfug0W_cMceoP=S|nW6Sd-JIp*jQ$XQqdk>R5|UWIu0!^Dj!8m)@k-vjHePwI~dc-2K=W1+Tt5 zmrZ`9pOdDSluxfoix?B7df&JlOiKzPTZp5n02Ow!Rivs}zNt+Rn1Y4?xKGS$$NgiGLpu~$IZ?K(su!IW{7eVGtGl&Sx^&1v zhx@0Lc!x%^(fn&7JtEeZMFP{?3+i+(ctyXx5VSy%?NG|!!p^P_nXO2aCcmp{t9g{Y z=*uNswojBvN&OHhg9xZM5kU_>0R=HQo1A0QWTVmvlpKEhid7vAhN}xm&>9tz=E?x#W$_MO z`JaE#x%2QH7`Q>f&`m23{nf#Q{`MI9`~kSjzR%75U*_WWuc75GxR##qG^Gq_G5F@D z;t+`*r1KLe@qC~liK?o(^}E>5T!i+&OqZG%{Qbe)iY zX1)c@xes$bZ3-wRbBCsql{#9OjF9nDn8!v64 z$>Y02eA;BU>OQ(Z>6duWiTX6*rf{~e`GBCl%teuFtW25Luy!?7<#Pn>8PJDAO#4g-t=!e zJ1W=M*8Q)W`ih$K4{Jday`MVoRfxYlew!459iZ`2?r$gTN7!*yuFlN~z6ZQnCTB0A zIc-OXL4+e5q7~--D&?yYGe@qdQWn$ep|AWS%S+x8-s;ZT~|eTu9KV`@m9XW<=?1B8DH@5c#HlOLn10QYw+P4(>$ zFR*Xiq5dy1;9@HN1Xe%hCp%3?goYeKjg)ai7;L9o<>k9*+uHqJ2sW^cYu`wx{Q=*0 z5gm>5%^)`7GkX7RRd3So-^D-LHO8__XFi@i)~vvX9lLoyqC)I?+M`sAtco!w21=N+ z>#sM|I>40`T59Y?Aq+4CPPXO};f-2tn+$Gc8~Pf+_2^ z56r)^{DvvuyNu>n1ZyOSfa1PhG4%rEs0+!AHoo>(@W~h{6E3tC;#^?Fb=Qj!RE&3& zKEdE2S|EFufe?YsISP?W(CN>&UN9PmJ&oYIM6Pet_`Q~rot*I^)!0&aUGZ4jO05B$c?LW5LB&#RR_ZcmMW65g6`Xo<81 zd<=)4gGoN!GCE|DOr@7}6B_BGk}b5@%+jqGZ+k5?A3Q)3z(ww>rbh}uxGAo1Z-V=K zmQ9%c3HsslCM*>^2);9L-uFKrr(>TtjiJ!xy(e|tu#KS{{E67_!~cC%fuXdUVFTM9 zUD@&0Nzq51hc>GJ-5fOD77J0NhKi}e9&_vIXj-2nd#EIC(Y~T(`dEG*y#{s z6O0=>6UL5%NQ)Cj$F0$52$Rld#6r^$=>2e}m?{Pf{TrmTjK@9rMOAW@2$SzXfoHy! zS^vi{*4jrzm1owzSCOzW1sHbJ?+W=U;I5~2%L5<@r0fqK*Ph@%bnY~j45QD4x%bW9 zxsIb$e42ppOKH2B?jGpaRWZszPJC4)iiY9c0lATBtwxuJ#QiZG?mC5uOb#};g|Rgt z%Q1|0^<7fEWS5@Nk8n&9tw7k9rw7F?Exce{IM!BoBZUt-ZSd<{YLzNaZ!eujy<_

$J8swmWDRg_n-OvxL>-lX%W==<7{8 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%0D7Ft}=jT|(_b=-2O+!;TxGQVlvad4Znn2q2 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 + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('xml_editor_view')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +require_once "app/xml_edit/config.php"; +echo "\n"; +echo "\n"; +echo " \n"; +echo " "; + + echo "\n"; + + echo ""; + ?> + + + + + + + + + +
+ + + \n"; + echo "\n"; + } + else { + echo "\n"; + } + ?> + +
+ + + \ No newline at end of file diff --git a/app/xml_edit/list.php b/app/xml_edit/list.php new file mode 100644 index 0000000000..87a80f3128 --- /dev/null +++ b/app/xml_edit/list.php @@ -0,0 +1,113 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/checkauth.php"; +if (permission_exists('xml_editor_view')) { + //access granted +} +else { + echo "access denied"; + exit; +} +require_once "header.php"; + +//show the content + echo "

"; + echo "\n"; + + echo "\n"; + echo " \n"; + echo "\n"; + + } //end if results + + echo "
\n"; + echo "
"; + + $sql = ""; + $sql .= "select * from v_clip_library "; + + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + $result_count = count($result); + + $c = 0; + $row_style["0"] = "background-color: #F5F5DC;"; + $row_style["1"] = "background-color: #FFFFFF;"; + + echo "
\n"; + echo "\n"; + echo ""; + + if ($result_count == 0) { //no results + echo ""; + } + else { //received results + + echo ""; + //echo ""; + echo ""; + //echo ""; + //echo ""; + //echo ""; + //echo ""; + //echo ""; + echo ""; + echo "\n"; + + foreach($result as $row) { + //print_r( $row ); + echo "\n"; + //echo ""; + echo ""; + //echo ""; + //echo ""; + //echo ""; + //echo ""; + //echo ""; + echo ""; + + echo "\n"; + if ($c==0) { $c=1; } else { $c=0; } + } //end foreach + unset($sql, $result, $row_count); + + echo "
 
    Id      clip_name      clip_folder        clip_text_start        clip_text_end        clip_desc        clip_order   
".$row[id]."".$row[clip_name]."".$row[clip_folder]."".$row[clip_text_start]."".$row[clip_text_end]."".$row[clip_desc]."".$row[clip_order]."
\n"; + echo "
\n"; + + echo "
\n"; + + echo "
\n"; + echo "   \n"; + echo "   \n"; + echo "
\n"; + echo ""; + + echo "

"; + require_once "footer.php"; + +?> diff --git a/app/xml_edit/readme.txt b/app/xml_edit/readme.txt new file mode 100644 index 0000000000..cafc4144ae --- /dev/null +++ b/app/xml_edit/readme.txt @@ -0,0 +1,7 @@ +Notes + +IFrame +http://www.quirksmode.org/js/iframe.html + +Tree View +http://www.dddekerf.dds.nl/DHTML_Treeview/DHTML_Treeview.htm \ No newline at end of file diff --git a/app/xml_edit/root.php b/app/xml_edit/root.php new file mode 100644 index 0000000000..7b882438ea --- /dev/null +++ b/app/xml_edit/root.php @@ -0,0 +1,50 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ + +// make sure the PATH_SEPARATOR is defined + if (!defined("PATH_SEPARATOR")) { + if ( strpos( $_ENV[ "OS" ], "Win" ) !== false ) { define("PATH_SEPARATOR", ";"); } else { define("PATH_SEPARATOR", ":"); } + } + +// make sure the document_root is set + $_SERVER["SCRIPT_FILENAME"] = str_replace("\\", "/", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = str_replace($_SERVER["PHP_SELF"], "", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = realpath($_SERVER["DOCUMENT_ROOT"]); + //echo "DOCUMENT_ROOT: ".$_SERVER["DOCUMENT_ROOT"]."
\n"; + //echo "PHP_SELF: ".$_SERVER["PHP_SELF"]."
\n"; + //echo "SCRIPT_FILENAME: ".$_SERVER["SCRIPT_FILENAME"]."
\n"; + +// if the project directory exists then add it to the include path otherwise add the document root to the include path + if (is_dir($_SERVER["DOCUMENT_ROOT"].'/fusionpbx')){ + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', '/fusionpbx'); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER["DOCUMENT_ROOT"].'/fusionpbx' ); + } + else { + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', ''); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER['DOCUMENT_ROOT'] ); + } + +?> \ No newline at end of file diff --git a/app/xmpp/README b/app/xmpp/README new file mode 100644 index 0000000000..c8629b0513 --- /dev/null +++ b/app/xmpp/README @@ -0,0 +1,3 @@ +This Module brought to you by the Letters Ken Rice + +See the Wiki for more information. diff --git a/app/xmpp/app_config.php b/app/xmpp/app_config.php new file mode 100644 index 0000000000..f87d8c434a --- /dev/null +++ b/app/xmpp/app_config.php @@ -0,0 +1,142 @@ + \ No newline at end of file diff --git a/app/xmpp/client_template.php b/app/xmpp/client_template.php new file mode 100644 index 0000000000..1e5427938a --- /dev/null +++ b/app/xmpp/client_template.php @@ -0,0 +1,53 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Ken Rice + Mark J Crane +*/ +function make_xmpp_xml($input) { + $xml_out .= "\n"; + $xml_out .= " \n"; + $xml_out .= sprintf(" \n", $input['profile_name']); + $xml_out .= sprintf(" \n", $input['profile_username']); + $xml_out .= sprintf(" \n", $input['profile_password']); + $xml_out .= sprintf(" \n", $input['dialplan']); + $xml_out .= sprintf(" \n", $input['context']); + $xml_out .= " \n"; + $xml_out .= sprintf(" \n", $input['rtp_ip']); + $xml_out .= sprintf(" \n", $input['ext_rtp_ip']); + $xml_out .= sprintf(" \n", $input['auto_login']); + $xml_out .= sprintf(" \n", $input['sasl_type']); + $xml_out .= sprintf(" \n", $input['xmpp_server']); + $xml_out .= sprintf(" \n", $input['tls_enable']); + $xml_out .= sprintf(" \n", $input['use_rtp_timer']); + $xml_out .= sprintf(" \n", $input['default_exten']); + $xml_out .= sprintf(" \n", $input['vad']); + $xml_out .= sprintf(" \n", $input['candidate_acl']); + $xml_out .= sprintf(" \n", $input['local_network_acl']); + $xml_out .= " \n"; + $xml_out .= "\n"; + + return $xml_out; +} + +?> \ No newline at end of file diff --git a/app/xmpp/db_create.php b/app/xmpp/db_create.php new file mode 100644 index 0000000000..d2bb5f24ff --- /dev/null +++ b/app/xmpp/db_create.php @@ -0,0 +1,51 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Ken Rice + Mark J Crane +*/ +function sql_tables($db_type) { + $x = 0; + + include "app_config.php"; + $sql = ""; + + foreach ($apps[$x]['db'] as $new_db) { + $sql .= "CREATE TABLE " . $new_db['table'] . " (\n"; + $fcount = 0; + foreach ($new_db['fields'] as $field) { + if ($fcount > 0 ) { $sql .= ",\n"; } + $sql .= $field['name'] . " "; + if (is_array($field['type'])) { + $sql .= $field['type'][$db_type]; + } else { + $sql .= $field['type']; + } + $fcount++; + } + $sql .= ");\n\n"; + } + + return $sql; +} +?> diff --git a/app/xmpp/errors.php b/app/xmpp/errors.php new file mode 100644 index 0000000000..95bc3d96c2 --- /dev/null +++ b/app/xmpp/errors.php @@ -0,0 +1,31 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Ken Rice + Mark J Crane +*/ +echo "
\n"; +echo "
\n"; +echo $error . "\n"; +echo "
\n"; +?> diff --git a/app/xmpp/profile_edit.php b/app/xmpp/profile_edit.php new file mode 100644 index 0000000000..c3057ee3d9 --- /dev/null +++ b/app/xmpp/profile_edit.php @@ -0,0 +1,286 @@ + + +
+ + + + +
+
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + +
+ Profile Edit
+
+ + + +
+ Defines a connections to a Jabber, GTalk, or other XMPP Provider server.
+
+
+
+ Profile Name: + + +
+ Enter the profile name here. +
+ Username: + + +
+ Enter the XMPP username here. +
+ Password: + + +
+ Enter the password here. +
+ Auto-Login: + + +
+ Choose whether to automatically login. +
+ XMPP Server: + + +
+ Enter alternate XMPP server if the server is not the same as the one in the Username
+ Example GoogleTalk is: xmpp-server1.l.google.com +
+ Default Extension: + + +
+ Default extension (if one cannot be determined) +
+
+ + + + + +
Show Advanced + +
+
+ +
+ Enabled: + + +
+
+ Profile Description: + + '> +
+ Enter the description of the Profile here. +
+ '> + +
+ + +
+
diff --git a/app/xmpp/profile_list.php b/app/xmpp/profile_list.php new file mode 100644 index 0000000000..b576cf9afe --- /dev/null +++ b/app/xmpp/profile_list.php @@ -0,0 +1,61 @@ +
+ + + + + +
XMPP Manager
+ Utilizes the Jingle protocol. Jingle is an extension to the Jabber/XMPP protocol. +
+
+ + + + + + + + + + + + + + + + + + + + + + + +
ProfileContextStatusEnabledDescription + + + +
      + + ' alt='edit'> + + + ' onclick="return confirm('Do you really want to delete this?')" + alt='delete'> + +
+ + + +
+
diff --git a/app/xmpp/root.php b/app/xmpp/root.php new file mode 100644 index 0000000000..3d662fd043 --- /dev/null +++ b/app/xmpp/root.php @@ -0,0 +1,50 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ + +// make sure the PATH_SEPARATOR is defined + if (!defined("PATH_SEPARATOR")) { + if ( strpos( $_ENV[ "OS" ], "Win" ) !== false ) { define("PATH_SEPARATOR", ";"); } else { define("PATH_SEPARATOR", ":"); } + } + +// make sure the document_root is set + $_SERVER["SCRIPT_FILENAME"] = str_replace("\\", "/", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = str_replace($_SERVER["PHP_SELF"], "", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = realpath($_SERVER["DOCUMENT_ROOT"]); + //echo "DOCUMENT_ROOT: ".$_SERVER["DOCUMENT_ROOT"]."
\n"; + //echo "PHP_SELF: ".$_SERVER["PHP_SELF"]."
\n"; + //echo "SCRIPT_FILENAME: ".$_SERVER["SCRIPT_FILENAME"]."
\n"; + +// if the project directory exists then add it to the include path otherwise add the document root to the include path + if (is_dir($_SERVER["DOCUMENT_ROOT"].'/fusionpbx')){ + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', '/fusionpbx'); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER["DOCUMENT_ROOT"].'/fusionpbx' ); + } + else { + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', ''); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER['DOCUMENT_ROOT'] ); + } + +?> diff --git a/app/xmpp/update_complete.php b/app/xmpp/update_complete.php new file mode 100644 index 0000000000..525d591aa4 --- /dev/null +++ b/app/xmpp/update_complete.php @@ -0,0 +1,11 @@ + +
+ +
diff --git a/app/xmpp/v_profile_delete.php b/app/xmpp/v_profile_delete.php new file mode 100644 index 0000000000..5de0fc7d33 --- /dev/null +++ b/app/xmpp/v_profile_delete.php @@ -0,0 +1,95 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Ken Rice + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('xmpp_delete')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +require_once "includes/header.php"; + +$domain_name = $_SESSION['domains'][$domain_uuid]['domain_name']; + +$profile_id = $_REQUEST['id']; + +$sql = ""; +$sql .= "select * from v_xmpp "; +$sql .= "where domain_uuid = '$domain_uuid' "; +$sql .= "and xmpp_profile_uuid = '$profile_id' "; +$prep_statement = $db->prepare(check_sql($sql)); +$prep_statement->execute(); + +$x = 0; +$result = $prep_statement->fetchAll(PDO::FETCH_NAMED); +foreach ($result as &$row) { + $profiles_array[$x] = $row; + $x++; +} + +$profile = $profiles_array[0]; +unset ($prep_statement); + +$sql = ""; +$sql .= "delete from v_xmpp "; +$sql .= "where domain_uuid = '$domain_uuid' "; +$sql .= "and xmpp_profile_uuid = '$profile_id' "; +$db->exec(check_sql($sql)); + +$filename = $_SESSION['switch']['conf']['dir'] . "/jingle_profiles/" . "v_" . $domain_name . "_" . + preg_replace("/[^A-Za-z0-9]/", "", $profile['profile_name']) . "_" . $profile_id . ".xml"; + +unlink($filename); + +$fp = event_socket_create($_SESSION['event_socket_ip_address'], $_SESSION['event_socket_port'], $_SESSION['event_socket_password']); +if ($fp) { + //reload the XML Configs + $tmp_cmd = 'api reloadxml'; + $response = event_socket_request($fp, $tmp_cmd); + unset($tmp_cmd); + + //tell mod_dingaling to reload is config + $tmp_cmd = 'api dingaling reload'; + $response = event_socket_request($fp, $tmp_cmd); + unset($tmp_cmd); + + //close the connection + fclose($fp); +} + +include "update_complete.php"; + +end: +//show the footer +require_once "includes/footer.php"; + +?> diff --git a/app/xmpp/v_profile_edit.php b/app/xmpp/v_profile_edit.php new file mode 100644 index 0000000000..1b4a478fcc --- /dev/null +++ b/app/xmpp/v_profile_edit.php @@ -0,0 +1,245 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Ken Rice + Mark J Crane +*/ + +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; + +if (permission_exists('xmpp_add') || permission_exists('xmpp_edit')) { + //access granted +} +else { + echo "access denied"; + exit; +} + +require_once "includes/header.php"; + +$domain_name = $_SESSION['domains'][$_SESSION['domain_uuid']]['domain_name']; + +//add or update the database +if (isset($_REQUEST["id"])) { + $action = "update"; + $profile_id = check_str($_REQUEST["id"]); +} else { + $action = "add"; +} + +if ($action == "update") { + $sql = ""; + $sql .= "select * from v_xmpp "; + $sql .= "where domain_uuid = '".$_SESSION['domain_uuid']."' "; + $sql .= "and xmpp_profile_uuid = '$profile_id' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + + $x = 0; + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach ($result as &$row) { + $profiles_array[$x] = $row; + $x++; + } + + $profile = $profiles_array[0]; + unset ($prep_statement); + $profile['profile_username'] = $profile['username']; + $profile['profile_password'] = $profile['password']; +} else { + $profile['dialplan'] = "XML"; + $profile['context'] = $_SESSION['domain_name']; + $profile['rtp_ip'] = '$${local_ip_v4}'; + $profile['ext_rtp_ip'] = '$${external_rtp_ip}'; + $profile['auto_login'] = "true"; + $profile['sasl_type'] = "md5"; + $profile['tls_enable'] = "true"; + $profile['usr_rtp_timer'] = "true"; + $profile['vad'] = "none"; + $profile['candidate_acl'] = "wan.auto"; + $profile['local_network_acl'] = "localnet.auto"; +} + +if ((!isset($_REQUEST['submit'])) || ($_REQUEST['submit'] != 'Save')) { + // If we arent saving a Profile Display the form. + include "profile_edit.php"; + goto end; +} + +foreach ($_REQUEST as $field => $data){ + $request[$field] = check_str($data); +} + +// check the data +$error = ""; +if (strlen($request['profile_name']) < 1) $error .= "Profile name is a Required Field
\n"; +if (strlen($request['profile_username']) < 1) $error .= "Username is a Required Field
\n"; +if (strlen($request['profile_password']) < 1) $error .= "Password is a Required Field
\n"; +if (strlen($request['default_exten']) < 1) $error .= "Default Extension is a Required Field
\n"; +if (strlen($error) > 0) { + include "errors.php"; + $profile = $request; + include "profile_edit.php"; + goto end; +} + +// Save New Entry +if ($action == "add" && permission_exists('xmpp_add')) { + $xmpp_profile_uuid = uuid(); + $sql = ""; + $sql .= "insert into v_xmpp ("; + $sql .= "domain_uuid, "; + $sql .= "xmpp_profile_uuid, "; + $sql .= "profile_name, "; + $sql .= "username, "; + $sql .= "password, "; + $sql .= "dialplan, "; + $sql .= "context, "; + $sql .= "rtp_ip, "; + $sql .= "ext_rtp_ip, "; + $sql .= "auto_login, "; + $sql .= "sasl_type, "; + $sql .= "xmpp_server, "; + $sql .= "tls_enable, "; + $sql .= "usr_rtp_timer, "; + $sql .= "default_exten, "; + $sql .= "vad, "; + $sql .= "avatar, "; + $sql .= "candidate_acl, "; + $sql .= "local_network_acl, "; + $sql .= "description, "; + $sql .= "enabled "; + $sql .= ") values ("; + $sql .= "'" . $_SESSION['domain_uuid'] . "', "; + $sql .= "'" . $xmpp_profile_uuid . "', "; + $sql .= "'" . $request['profile_name'] . "', "; + $sql .= "'" . $request['profile_username'] . "', "; + $sql .= "'" . $request['profile_password'] . "', "; + $sql .= "'" . $request['dialplan'] . "', "; + if (if_group("superadmin") && $request['context']) { + $sql .= "'" . $request['context'] . "', "; + } + else { + $sql .= "'" . $_SESSION['context'] . "', "; + } + $sql .= "'" . $request['rtp_ip'] . "', "; + $sql .= "'" . $request['ext_rtp_ip'] . "', "; + $sql .= "'" . $request['auto_login'] . "', "; + $sql .= "'" . $request['sasl_type'] . "', "; + $sql .= "'" . $request['xmpp_server'] . "', "; + $sql .= "'" . $request['tls_enable'] . "', "; + $sql .= "'" . $request['usr_rtp_timer'] . "', "; + $sql .= "'" . $request['default_exten'] . "', "; + $sql .= "'" . $request['vad'] . "', "; + $sql .= "'" . $request['avatar'] . "', "; + $sql .= "'" . $request['candidate_acl'] . "', "; + $sql .= "'" . $request['local_network_acl'] . "', "; + $sql .= "'" . $request['description'] . "', "; + $sql .= "'" . $request['enabled'] . "' "; + $sql .= ") "; + $db->exec(check_sql($sql)); + + goto writeout; +} +elseif ($action == "update" && permission_exists('xmpp_edit')) { + $sql = ""; + $sql .= "UPDATE v_xmpp SET "; + $sql .= "profile_name = '" . $request['profile_name'] . "', "; + $sql .= "username = '" . $request['profile_username'] . "', "; + $sql .= "password = '" . $request['profile_password'] . "', "; + $sql .= "dialplan = '" . $request['dialplan'] . "', "; + if (if_group("superadmin") && $request['context']) { + $sql .= "context = '" . $request['context'] . "', "; + } + else { + $sql .= "context = '" . $_SESSION["context"] . "', "; + } + $sql .= "rtp_ip = '" . $request['rtp_ip'] . "', "; + $sql .= "ext_rtp_ip = '" . $request['ext_rtp_ip'] . "', "; + $sql .= "auto_login = '" . $request['auto_login'] . "', "; + $sql .= "sasl_type = '" . $request['sasl_type'] . "', "; + $sql .= "xmpp_server = '" . $request['xmpp_server'] . "', "; + $sql .= "tls_enable = '" . $request['tls_enable'] . "', "; + $sql .= "usr_rtp_timer = '" . $request['usr_rtp_timer'] . "', "; + $sql .= "default_exten = '" . $request['default_exten'] . "', "; + $sql .= "vad = '" . $request['vad'] . "', "; + $sql .= "avatar = '" . $request['avatar'] . "', "; + $sql .= "candidate_acl = '" . $request['candidate_acl'] . "', "; + $sql .= "local_network_acl = '" . $request['local_network_acl'] . "', "; + $sql .= "description = '" . $request['description'] . "', "; + $sql .= "enabled = '" . $request['enabled'] . "' "; + $sql .= "where xmpp_profile_uuid = '" . $request['id'] . "' "; + $db->exec(check_sql($sql)); + $xmpp_profile_uuid = $request['id']; + + goto writeout; +} + +writeout: + +//prepare the xmpp files to be written. delete all jingle files that are prefixed with v_ and have a file extension of .xml +$jingle_list = glob($_SESSION['switch']['conf']['dir'] . "/jingle_profiles/*v_*.xml"); +foreach($jingle_list as $name => $value) { + unlink($value); +} + + +if ($request['enabled'] == "true") { + //prepare the xml + include "client_template.php"; + $xml = make_xmpp_xml($request); + + //write the xml + $filename = $_SESSION['switch']['conf']['dir'] . "/jingle_profiles/" . "v_" . $_SESSION['domain_name'] . "_" . preg_replace("/[^A-Za-z0-9]/", "", $request['profile_name']) . "_" . $xmpp_profile_uuid . ".xml"; + $fh = fopen($filename,"w") or die("Unable to open the file"); + fwrite($fh, $xml); + unset($file_name); + fclose($fh); +} + +$fp = event_socket_create($_SESSION['event_socket_ip_address'], $_SESSION['event_socket_port'], $_SESSION['event_socket_password']); +if ($fp) { + //reload the XML Configs + $tmp_cmd = 'api reloadxml'; + $response = event_socket_request($fp, $tmp_cmd); + unset($tmp_cmd); + + //Tell mod_dingaling to reload is config + $tmp_cmd = 'api dingaling reload'; + $response = event_socket_request($fp, $tmp_cmd); + unset($tmp_cmd); + + //close the connection + fclose($fp); +} + +include "update_complete.php"; + +end: +//show the footer +require_once "includes/footer.php"; + +?> \ No newline at end of file diff --git a/app/xmpp/v_xmpp.php b/app/xmpp/v_xmpp.php new file mode 100644 index 0000000000..6f384fde3e --- /dev/null +++ b/app/xmpp/v_xmpp.php @@ -0,0 +1,95 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Ken Rice + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('xmpp_view')) { + //access granted +} +else { + echo "access denied"; + exit; +} +require_once "includes/header.php"; +require_once "includes/paging.php"; + +//connect to event socket +$fp = event_socket_create($_SESSION['event_socket_ip_address'], $_SESSION['event_socket_port'], $_SESSION['event_socket_password']); + +if ($fp) { + if (strlen($_GET["a"]) > 0) { + if ($_GET["a"] == "reload") { + $cmd = 'api dingaling reload'; + $response = trim(event_socket_request($fp, $cmd)); + $msg = 'Reload:
'.$response.'
'; + } + } + + if (!function_exists('switch_dingaling_status')) { + function switch_dingaling_status($profile_username, $result_type = 'xml') { + $fp = event_socket_create($_SESSION['event_socket_ip_address'], $_SESSION['event_socket_port'], $_SESSION['event_socket_password']); + $cmd = 'api dingaling status'; + $response = trim(event_socket_request($fp, $cmd)); + $response = explode("\n", $response); + + $x = 0; + foreach ($response as $row) { + if ($x > 1) { + $dingaling = explode("|", $row); + if ($profile_username == trim($dingaling[0])) { + return trim($dingaling[1]); + } + } + $x++; + } + } + } +} + +//get a list of assigned extensions for this user +$sql = ""; +$sql .= "select * from v_xmpp "; +$sql .= "where domain_uuid = '$domain_uuid' "; +$prep_statement = $db->prepare(check_sql($sql)); +$prep_statement->execute(); +$x = 0; +$result = $prep_statement->fetchAll(PDO::FETCH_NAMED); +foreach ($result as &$row) { + $profiles_array[$x] = $row; + $profiles_array[$x]['status'] = switch_dingaling_status($row['username'].'/talk'); + $x++; +} +unset ($prep_statement); + +//include the view +include "profile_list.php"; + +//include the footer +require_once "includes/footer.php"; + +?> \ No newline at end of file diff --git a/core/apps/app_config.php b/core/apps/app_config.php new file mode 100644 index 0000000000..6a0c15ce04 --- /dev/null +++ b/core/apps/app_config.php @@ -0,0 +1,46 @@ + \ No newline at end of file diff --git a/core/apps/apps.php b/core/apps/apps.php new file mode 100644 index 0000000000..53cd7137d7 --- /dev/null +++ b/core/apps/apps.php @@ -0,0 +1,118 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require_once "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (if_group("admin") || if_group("superadmin")) { + //access granted +} +else { + echo "access denied"; + exit; +} +require_once "includes/header.php"; +require_once "includes/paging.php"; + +//get variables used to control the order + $order_by = $_GET["order_by"]; + $order = $_GET["order"]; + +//get the list of installed apps from the core and mod directories + $config_list = glob($_SERVER["DOCUMENT_ROOT"] . PROJECT_PATH . "/*/*/app_config.php"); + $x=0; + foreach ($config_list as $config_path) { + include($config_path); + $x++; + } + +//show the content + echo "
"; + echo "\n"; + echo "\n"; + echo " "; + echo ""; + echo "
\n"; + echo "
"; + + echo "\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "
App Manager 
\n"; + echo " Manage the applications that are installed.

\n"; + echo "
\n"; + + $c = 0; + $row_style["0"] = "row_style0"; + $row_style["1"] = "row_style1"; + + echo "
\n"; + echo "\n"; + echo "\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + //echo "\n"; + echo "\n"; + + foreach($apps as $row) { + if ($row['uuid'] != "d8704214-75a0-e52f-1336-f0780e29fef8") { + echo "\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "\n"; + } + if ($c==0) { $c=1; } else { $c=0; } + } //end foreach + unset($sql, $result, $row_count); + + echo "
NameCategorySubcategoryVersionDescription\n"; + //echo " $v_link_label_add\n"; + //echo "
".$row['name']." ".$row['category']." ".$row['subcategory']." ".$row['version']." ".$row['description']['en']." \n"; + echo "  $v_link_label_edit\n"; + echo " $v_link_label_delete\n"; + echo "
"; + echo "
"; + echo "

"; + echo "

"; + + echo "
"; + echo "
"; + echo "

"; + +//include the footer + require_once "includes/footer.php"; +?> \ No newline at end of file diff --git a/core/apps/apps_delete.php b/core/apps/apps_delete.php new file mode 100644 index 0000000000..b70ddce40d --- /dev/null +++ b/core/apps/apps_delete.php @@ -0,0 +1,95 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require_once "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (if_group("superadmin")) { + //access granted +} +else { + echo "access denied"; + exit; +} + +if (count($_GET) > 0) { + $id = check_str($_GET["id"]); +} + +if (strlen($id)>0) { + + if (count($_GET)>0 && $_POST["persistformvar"] != "true") { + $app_uuid = $_GET["id"]; + //get the list of installed apps from the core and mod directories + $config_list = glob($_SERVER["DOCUMENT_ROOT"] . PROJECT_PATH . "/*/*/app_config.php"); + $x=0; + foreach ($config_list as $config_path) { + include($config_path); + $x++; + } + //find the app using the $app_uuid + foreach ($apps as &$row) { + if ($row["uuid"] == $app_uuid) { + $name = $row['name']; + if ($row["uuid"] == $app_uuid && $row['category'] != "Core") { + //delete the app from the menu + foreach ($row['menu'] as &$menu) { + //delete menu groups and permissions from the database + $sql = "delete from v_menu_item_groups "; + $sql .= "where menu_item_uuid = '".$menu['uuid']."' "; + $db->query($sql); + + $sql = "delete from v_menu_items "; + $sql .= "where menu_item_uuid = '".$menu['uuid']."' "; + $db->query($sql); + + //delete the app from the file system + if (strlen($menu['path']) > 0) { + system('rm -rf '.dirname($_SERVER["DOCUMENT_ROOT"].PROJECT_PATH.$menu['path'])); + } + } + + //delete the group permissions for the app + foreach ($row['permissions'] as &$permission) { + $sql = "delete from v_group_permissions "; + $sql .= "where permission_name = '".$permission['name']."' "; + $db->query($sql); + } + } + } + } + } +} + +//redirect the browser + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Delete Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + +?> \ No newline at end of file diff --git a/core/apps/apps_edit.php b/core/apps/apps_edit.php new file mode 100644 index 0000000000..78fecf64a7 --- /dev/null +++ b/core/apps/apps_edit.php @@ -0,0 +1,215 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require_once "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (if_group("superadmin")) { + //access granted +} +else { + echo "access denied"; + exit; +} + +//action add or update + if (isset($_REQUEST["id"])) { + $action = "update"; + $app_uuid = check_str($_REQUEST["id"]); + } + else { + $action = "add"; + } + +//get http post variables and set them to php variables + if (count($_POST)>0) { + $app_enabled = check_str($_POST["app_enabled"]); + } + +if (count($_POST)>0 && strlen($_POST["persistformvar"]) == 0) { + + $msg = ''; + if ($action == "update") { + $app_uuid = check_str($_POST["app_uuid"]); + } + + //check for all required data + //if (strlen($app_enabled) == 0) { $msg .= "Please provide: Enabled
\n"; } + if (strlen($msg) > 0 && strlen($_POST["persistformvar"]) == 0) { + require_once "includes/header.php"; + require_once "includes/persistformvar.php"; + echo "
\n"; + echo "
\n"; + echo $msg."
"; + echo "
\n"; + persistformvar($_POST); + echo "
\n"; + require_once "includes/footer.php"; + return; + } + + //add or update the database + if ($_POST["persistformvar"] != "true") { + if ($action == "add") { + $sql = "insert into v_apps "; + $sql .= "("; + $sql .= "app_uuid "; + $sql .= ")"; + $sql .= "values "; + $sql .= "("; + $sql .= "'".uuid()."' "; + $sql .= ")"; + //$db->exec(check_sql($sql)); + unset($sql); + + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Add Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + } //if ($action == "add") + + if ($action == "update") { + $sql = "update v_apps set "; + $sql .= "app_uuid = '$app_uuid' "; + $sql .= "where app_uuid = '$app_uuid'"; + //$db->exec(check_sql($sql)); + unset($sql); + + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Update Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + } //if ($action == "update") + } //if ($_POST["persistformvar"] != "true") +} //(count($_POST)>0 && strlen($_POST["persistformvar"]) == 0) + +//show the header + require_once "includes/header.php"; + +//pre-populate the form + if (count($_GET)>0 && $_POST["persistformvar"] != "true") { + $app_uuid = $_GET["id"]; + //get the list of installed apps from the core and mod directories + $config_list = glob($_SERVER["DOCUMENT_ROOT"] . PROJECT_PATH . "/*/*/app_config.php"); + $x=0; + foreach ($config_list as $config_path) { + include($config_path); + $x++; + } + foreach ($apps as &$row) { + if ($row["uuid"] == $app_uuid) { + $name = $row['name']; + $category = $row['category']; + $subcategory = $row['subcategory']; + $version = $row['version']; + $description = $row['description']['en']; + } + } + } + +//show the header + require_once "includes/header.php"; + +//show the content + echo "
"; + echo "\n"; + echo "\n"; + echo " "; + echo " "; + echo "
\n"; + echo "
"; + + echo "
\n"; + echo "
\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo " \n"; + echo " \n"; + echo " \n"; + echo " "; + + echo " \n"; + echo " \n"; + echo " \n"; + echo " "; + + echo " \n"; + echo " \n"; + echo " \n"; + echo " "; + + echo " \n"; + echo " \n"; + echo " \n"; + echo " "; + + echo " \n"; + echo " \n"; + echo " "; + echo "
$name
\n"; + echo "Manage the applications that are installed.

\n"; + echo "
\n"; + echo " Category:\n"; + echo " \n"; + echo " $category  \n"; + echo "
\n"; + echo " Subcategory:\n"; + echo " \n"; + echo " $subcategory  \n"; + echo "
\n"; + echo " Version:\n"; + echo " \n"; + echo " $version  \n"; + echo "
\n"; + echo " Description:\n"; + echo " \n"; + echo " $description  \n"; + echo "
\n"; + if ($action == "update") { + echo " \n"; + } + echo " \n"; + echo "
"; + echo ""; + + echo "
"; + echo "
"; + +//include the footer + require_once "includes/footer.php"; +?> \ No newline at end of file diff --git a/core/apps/root.php b/core/apps/root.php new file mode 100644 index 0000000000..7b882438ea --- /dev/null +++ b/core/apps/root.php @@ -0,0 +1,50 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ + +// make sure the PATH_SEPARATOR is defined + if (!defined("PATH_SEPARATOR")) { + if ( strpos( $_ENV[ "OS" ], "Win" ) !== false ) { define("PATH_SEPARATOR", ";"); } else { define("PATH_SEPARATOR", ":"); } + } + +// make sure the document_root is set + $_SERVER["SCRIPT_FILENAME"] = str_replace("\\", "/", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = str_replace($_SERVER["PHP_SELF"], "", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = realpath($_SERVER["DOCUMENT_ROOT"]); + //echo "DOCUMENT_ROOT: ".$_SERVER["DOCUMENT_ROOT"]."
\n"; + //echo "PHP_SELF: ".$_SERVER["PHP_SELF"]."
\n"; + //echo "SCRIPT_FILENAME: ".$_SERVER["SCRIPT_FILENAME"]."
\n"; + +// if the project directory exists then add it to the include path otherwise add the document root to the include path + if (is_dir($_SERVER["DOCUMENT_ROOT"].'/fusionpbx')){ + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', '/fusionpbx'); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER["DOCUMENT_ROOT"].'/fusionpbx' ); + } + else { + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', ''); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER['DOCUMENT_ROOT'] ); + } + +?> \ No newline at end of file diff --git a/core/backup/backup.php b/core/backup/backup.php new file mode 100644 index 0000000000..541e9b35be --- /dev/null +++ b/core/backup/backup.php @@ -0,0 +1,45 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; + +if (if_group("superadmin")) { + + $fh = fopen($db_file_path.'/'.$dbfilename, 'r+b'); + $contents = fread($fh, filesize($db_file_path.'/'.$dbfilename)); + + header("Content-disposition: attachment; filename=$dbfilename"); + header("Content-Type: application/force-download"); + header("Content-Transfer-Encoding: binary"); + header("Content-Length: ".strlen($contents)); + header("Pragma: no-cache"); + header("Expires: 0"); + + echo $contents; +} + +?> diff --git a/core/backup/backupandrestore.php b/core/backup/backupandrestore.php new file mode 100644 index 0000000000..d9e8f4e320 --- /dev/null +++ b/core/backup/backupandrestore.php @@ -0,0 +1,87 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; + +if (if_group("superadmin")) { + + echo "\n"; + echo "\n"; + echo " \n"; + echo "\n"; + echo "\n"; + echo " \n"; + echo " \n"; + echo "\n"; + echo "
Backup
\n"; + echo " download \n"; + echo " \n"; + echo "
\n"; + echo "To backup your application click on the download link and then choose \n"; + echo "a safe location on your computer to save the file. You may want to \n"; + echo "save the backup to more than one computer to prevent the backup from being lost. \n"; + echo "
\n"; + echo "
\n"; + echo "
\n"; + echo "\n"; + + echo "
\n"; + echo "
"; + echo "

"; + + /* + echo "Restore Application
\n"; + echo "
\n"; + //Browse to Backup File + echo "Click on 'Browse' then locate and select the application backup file named '.bak'. \n"; + echo "Then click on 'Restore.' \n"; + echo "

"; + + echo "
"; + echo "
"; + echo " "; + echo " \n"; + echo " \n"; + echo " \n"; + echo "
\n"; + echo " "; + echo " "; + echo " "; + echo "
"; + echo " \n"; + echo " \n"; + echo "
"; + echo "
\n"; + echo "
\n"; + echo "
"; + + echo "
"; + */ + + } + +?> diff --git a/core/backup/root.php b/core/backup/root.php new file mode 100644 index 0000000000..7b882438ea --- /dev/null +++ b/core/backup/root.php @@ -0,0 +1,50 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ + +// make sure the PATH_SEPARATOR is defined + if (!defined("PATH_SEPARATOR")) { + if ( strpos( $_ENV[ "OS" ], "Win" ) !== false ) { define("PATH_SEPARATOR", ";"); } else { define("PATH_SEPARATOR", ":"); } + } + +// make sure the document_root is set + $_SERVER["SCRIPT_FILENAME"] = str_replace("\\", "/", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = str_replace($_SERVER["PHP_SELF"], "", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = realpath($_SERVER["DOCUMENT_ROOT"]); + //echo "DOCUMENT_ROOT: ".$_SERVER["DOCUMENT_ROOT"]."
\n"; + //echo "PHP_SELF: ".$_SERVER["PHP_SELF"]."
\n"; + //echo "SCRIPT_FILENAME: ".$_SERVER["SCRIPT_FILENAME"]."
\n"; + +// if the project directory exists then add it to the include path otherwise add the document root to the include path + if (is_dir($_SERVER["DOCUMENT_ROOT"].'/fusionpbx')){ + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', '/fusionpbx'); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER["DOCUMENT_ROOT"].'/fusionpbx' ); + } + else { + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', ''); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER['DOCUMENT_ROOT'] ); + } + +?> \ No newline at end of file diff --git a/core/databases/app_config.php b/core/databases/app_config.php new file mode 100644 index 0000000000..71da3e3035 --- /dev/null +++ b/core/databases/app_config.php @@ -0,0 +1,97 @@ + \ No newline at end of file diff --git a/core/databases/database_delete.php b/core/databases/database_delete.php new file mode 100644 index 0000000000..d1c14d54ea --- /dev/null +++ b/core/databases/database_delete.php @@ -0,0 +1,58 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require_once "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (if_group("superadmin")) { + //access granted +} +else { + echo "access denied"; + exit; +} + +if (count($_GET)>0) { + $id = check_str($_GET["id"]); +} + +if (strlen($id)>0) { + $sql = ""; + $sql .= "delete from v_databases "; + $sql .= "where database_uuid = '$id' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + unset($sql); +} + +require_once "includes/header.php"; +echo "\n"; +echo "
\n"; +echo "Delete Complete\n"; +echo "
\n"; +require_once "includes/footer.php"; +return; + +?> \ No newline at end of file diff --git a/core/databases/database_edit.php b/core/databases/database_edit.php new file mode 100644 index 0000000000..6499ef7844 --- /dev/null +++ b/core/databases/database_edit.php @@ -0,0 +1,346 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require_once "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (if_group("superadmin")) { + //access granted +} +else { + echo "access denied"; + exit; +} + +//action add or update + if (isset($_REQUEST["id"])) { + $action = "update"; + $database_uuid = check_str($_REQUEST["id"]); + } + else { + $action = "add"; + } + +//clear the values + $database_type = ''; + $database_host = ''; + $database_port = ''; + $database_name = ''; + $database_username = ''; + $database_password = ''; + $database_path = ''; + $database_description = ''; + +//get http post variables and set them to php variables + if (count($_POST)>0) { + $database_type = check_str($_POST["database_type"]); + $database_host = check_str($_POST["database_host"]); + $database_port = check_str($_POST["database_port"]); + $database_name = check_str($_POST["database_name"]); + $database_username = check_str($_POST["database_username"]); + $database_password = check_str($_POST["database_password"]); + $database_path = check_str($_POST["database_path"]); + $database_description = check_str($_POST["database_description"]); + } + +if (count($_POST)>0 && strlen($_POST["persistformvar"]) == 0) { + + $msg = ''; + if ($action == "update") { + $database_uuid = check_str($_POST["database_uuid"]); + } + + //check for all required data + //if (strlen($database_type) == 0) { $msg .= "Please provide: Type
\n"; } + //if (strlen($database_host) == 0) { $msg .= "Please provide: Host
\n"; } + //if (strlen($database_port) == 0) { $msg .= "Please provide: Port
\n"; } + //if (strlen($database_name) == 0) { $msg .= "Please provide: Name
\n"; } + //if (strlen($database_username) == 0) { $msg .= "Please provide: Username
\n"; } + //if (strlen($database_password) == 0) { $msg .= "Please provide: Password
\n"; } + //if (strlen($database_path) == 0) { $msg .= "Please provide: Path
\n"; } + //if (strlen($database_description) == 0) { $msg .= "Please provide: Description
\n"; } + if (strlen($msg) > 0 && strlen($_POST["persistformvar"]) == 0) { + require_once "includes/header.php"; + require_once "includes/persistformvar.php"; + echo "
\n"; + echo "
\n"; + echo $msg."
"; + echo "
\n"; + persistformvar($_POST); + echo "
\n"; + require_once "includes/footer.php"; + return; + } + + //add or update the database + if ($_POST["persistformvar"] != "true") { + if ($action == "add") { + $database_uuid = uuid(); + $sql = "insert into v_databases "; + $sql .= "("; + //$sql .= "domain_uuid, "; + $sql .= "database_uuid, "; + $sql .= "database_type, "; + $sql .= "database_host, "; + $sql .= "database_port, "; + $sql .= "database_name, "; + $sql .= "database_username, "; + $sql .= "database_password, "; + $sql .= "database_path, "; + $sql .= "database_description "; + $sql .= ")"; + $sql .= "values "; + $sql .= "("; + //$sql .= "'$domain_uuid', "; + $sql .= "'$database_uuid', "; + $sql .= "'$database_type', "; + $sql .= "'$database_host', "; + $sql .= "'$database_port', "; + $sql .= "'$database_name', "; + $sql .= "'$database_username', "; + $sql .= "'$database_password', "; + $sql .= "'$database_path', "; + $sql .= "'$database_description' "; + $sql .= ")"; + $db->exec(check_sql($sql)); + unset($sql); + + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Add Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + } //if ($action == "add") + + if ($action == "update") { + $sql = "update v_databases set "; + $sql .= "database_type = '$database_type', "; + $sql .= "database_host = '$database_host', "; + $sql .= "database_port = '$database_port', "; + $sql .= "database_name = '$database_name', "; + $sql .= "database_username = '$database_username', "; + $sql .= "database_password = '$database_password', "; + $sql .= "database_path = '$database_path', "; + $sql .= "database_description = '$database_description' "; + $sql .= "where database_uuid = '$database_uuid' "; + $db->exec(check_sql($sql)); + unset($sql); + + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Update Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + } //if ($action == "update") + } //if ($_POST["persistformvar"] != "true") +} //(count($_POST)>0 && strlen($_POST["persistformvar"]) == 0) + +//pre-populate the form + if (count($_GET)>0 && $_POST["persistformvar"] != "true") { + $database_uuid = $_GET["id"]; + $sql = "select * from v_databases "; + $sql .= "where database_uuid = '$database_uuid' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach ($result as &$row) { + $database_type = $row["database_type"]; + $database_host = $row["database_host"]; + $database_port = $row["database_port"]; + $database_name = $row["database_name"]; + $database_username = $row["database_username"]; + $database_password = $row["database_password"]; + $database_path = $row["database_path"]; + $database_description = $row["database_description"]; + break; //limit to 1 row + } + unset ($prep_statement); + } + +//show the header + require_once "includes/header.php"; + +//show the content + echo "
"; + echo "\n"; + echo "\n"; + echo " "; + echo " "; + echo "
\n"; + echo "
"; + + echo "
\n"; + echo "
\n"; + echo "\n"; + echo "\n"; + if ($action == "add") { + echo "\n"; + } + if ($action == "update") { + echo "\n"; + } + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo " \n"; + echo " \n"; + echo " "; + echo "
Database AddDatabase Edit
\n"; + echo "Database connection information.

\n"; + echo "
\n"; + echo " Type:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Select the database type.\n"; + echo "
\n"; + echo " Host:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the host name.\n"; + echo "
\n"; + echo " Port:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the port number.\n"; + echo "
\n"; + echo " Name:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the database name.\n"; + echo "
\n"; + echo " Username:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the database username.\n"; + echo "
\n"; + echo " Password:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the database password.\n"; + echo "
\n"; + echo " Path:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the database file path.\n"; + echo "
\n"; + echo " Description:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the description.\n"; + echo "
\n"; + if ($action == "update") { + echo " \n"; + } + echo " \n"; + echo "
"; + echo ""; + + echo "
"; + echo "
"; + +//include the footer + require_once "includes/footer.php"; +?> \ No newline at end of file diff --git a/core/databases/databases.php b/core/databases/databases.php new file mode 100644 index 0000000000..2f21ab9988 --- /dev/null +++ b/core/databases/databases.php @@ -0,0 +1,162 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require_once "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (if_group("superadmin")) { + //access granted +} +else { + echo "access denied"; + exit; +} +require_once "includes/header.php"; +require_once "includes/paging.php"; + +//get variables used to control the order + $order_by = $_GET["order_by"]; + $order = $_GET["order"]; + +//show the content + echo "
"; + echo "\n"; + echo "\n"; + echo " "; + echo ""; + echo "
\n"; + echo "
"; + + echo "\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "
Databases 
\n"; + echo " Database information.

\n"; + echo "
\n"; + + //prepare to page the results + $sql = " select count(*) as num_rows from v_databases "; + if (strlen($order_by)> 0) { $sql .= "order by $order_by $order "; } + $prep_statement = $db->prepare($sql); + if ($prep_statement) { + $prep_statement->execute(); + $row = $prep_statement->fetch(PDO::FETCH_ASSOC); + if ($row['num_rows'] > 0) { + $num_rows = $row['num_rows']; + } + else { + $num_rows = '0'; + } + } + + //prepare to page the results + $rows_per_page = 150; + $param = ""; + $page = $_GET['page']; + if (strlen($page) == 0) { $page = 0; $_GET['page'] = 0; } + list($paging_controls, $rows_per_page, $var_3) = paging($num_rows, $param, $rows_per_page); + $offset = $rows_per_page * $page; + + //get the list + $sql = " select * from v_databases "; + if (strlen($order_by)> 0) { $sql .= "order by $order_by $order "; } + $sql .= " limit $rows_per_page offset $offset "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + $result_count = count($result); + unset ($prep_statement, $sql); + + $c = 0; + $row_style["0"] = "row_style0"; + $row_style["1"] = "row_style1"; + + echo "
\n"; + echo "\n"; + + echo "\n"; + echo th_order_by('database_type', 'Type', $order_by, $order); + echo th_order_by('database_host', 'Host', $order_by, $order); + //echo th_order_by('database_port', 'Port', $order_by, $order); + echo th_order_by('database_name', 'Name', $order_by, $order); + //echo th_order_by('database_username', 'Username', $order_by, $order); + //echo th_order_by('database_path', 'Path', $order_by, $order); + echo th_order_by('database_description', 'Description', $order_by, $order); + echo "\n"; + echo "\n"; + + if ($result_count > 0) { + foreach($result as $row) { + echo "\n"; + echo " \n"; + echo " \n"; + //echo " \n"; + echo " \n"; + //echo " \n"; + //echo " \n"; + echo " \n"; + echo " \n"; + echo "\n"; + if ($c==0) { $c=1; } else { $c=0; } + } //end foreach + unset($sql, $result, $row_count); + } //end if results + + echo "\n"; + echo "\n"; + echo "\n"; + + echo "
\n"; + echo " $v_link_label_add\n"; + echo "
".$row['database_type']." ".$row['database_host']." ".$row['database_port']." ".$row['database_name']." ".$row['database_username']." ".$row['database_path']." ".$row['database_description']." \n"; + echo " $v_link_label_edit\n"; + echo " $v_link_label_delete\n"; + echo "
\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "
 $paging_controls\n"; + echo " $v_link_label_add\n"; + echo "
\n"; + echo "
"; + echo "
"; + echo "

"; + echo "

"; + + echo "
"; + echo "
"; + echo "

"; + +//include the footer + require_once "includes/footer.php"; +?> \ No newline at end of file diff --git a/core/databases/root.php b/core/databases/root.php new file mode 100644 index 0000000000..7b882438ea --- /dev/null +++ b/core/databases/root.php @@ -0,0 +1,50 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ + +// make sure the PATH_SEPARATOR is defined + if (!defined("PATH_SEPARATOR")) { + if ( strpos( $_ENV[ "OS" ], "Win" ) !== false ) { define("PATH_SEPARATOR", ";"); } else { define("PATH_SEPARATOR", ":"); } + } + +// make sure the document_root is set + $_SERVER["SCRIPT_FILENAME"] = str_replace("\\", "/", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = str_replace($_SERVER["PHP_SELF"], "", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = realpath($_SERVER["DOCUMENT_ROOT"]); + //echo "DOCUMENT_ROOT: ".$_SERVER["DOCUMENT_ROOT"]."
\n"; + //echo "PHP_SELF: ".$_SERVER["PHP_SELF"]."
\n"; + //echo "SCRIPT_FILENAME: ".$_SERVER["SCRIPT_FILENAME"]."
\n"; + +// if the project directory exists then add it to the include path otherwise add the document root to the include path + if (is_dir($_SERVER["DOCUMENT_ROOT"].'/fusionpbx')){ + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', '/fusionpbx'); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER["DOCUMENT_ROOT"].'/fusionpbx' ); + } + else { + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', ''); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER['DOCUMENT_ROOT'] ); + } + +?> \ No newline at end of file diff --git a/core/default_settings/app_config.php b/core/default_settings/app_config.php new file mode 100644 index 0000000000..dc3e5a76fd --- /dev/null +++ b/core/default_settings/app_config.php @@ -0,0 +1,65 @@ + \ No newline at end of file diff --git a/core/default_settings/app_defaults.php b/core/default_settings/app_defaults.php new file mode 100644 index 0000000000..a05620f994 --- /dev/null +++ b/core/default_settings/app_defaults.php @@ -0,0 +1,29 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2010 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ + + + +?> \ No newline at end of file diff --git a/core/default_settings/default_settings.php b/core/default_settings/default_settings.php new file mode 100644 index 0000000000..d934cd8165 --- /dev/null +++ b/core/default_settings/default_settings.php @@ -0,0 +1,190 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require_once "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (if_group("admin") || if_group("superadmin")) { + //access granted +} +else { + echo "access denied"; + exit; +} +require_once "includes/header.php"; +require_once "includes/paging.php"; + +//get variables used to control the order + $order_by = $_GET["order_by"]; + $order = $_GET["order"]; + +//show the content + echo "
"; + echo "\n"; + echo "\n"; + echo " "; + echo ""; + echo "
\n"; + echo "
"; + + echo "\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "
Default Settings 
\n"; + echo " Settings used for all domains.

\n"; + echo "
\n"; + + //prepare to page the results + $sql = ""; + $sql .= " select count(*) as num_rows from v_default_settings "; + if (strlen($order_by)> 0) { $sql .= "order by $order_by $order "; } + $prep_statement = $db->prepare($sql); + if ($prep_statement) { + $prep_statement->execute(); + $row = $prep_statement->fetch(PDO::FETCH_ASSOC); + if ($row['num_rows'] > 0) { + $num_rows = $row['num_rows']; + } + else { + $num_rows = '0'; + } + } + + //prepare to page the results + $rows_per_page = 100; + $param = ""; + $page = $_GET['page']; + if (strlen($page) == 0) { $page = 0; $_GET['page'] = 0; } + list($paging_controls, $rows_per_page, $var3) = paging($num_rows, $param, $rows_per_page); + $offset = $rows_per_page * $page; + + //get the domain list + $sql = ""; + $sql .= " select * from v_default_settings "; + if (strlen($order_by) == 0) { + $sql .= "order by default_setting_category, default_setting_subcategory asc "; + } + else { + $sql .= "order by $order_by $order "; + } + $sql .= " limit $rows_per_page offset $offset "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + $result_count = count($result); + unset ($prep_statement, $sql); + + $c = 0; + $row_style["0"] = "row_style0"; + $row_style["1"] = "row_style1"; + + echo "
\n"; + echo "\n"; + + if ($result_count > 0) { + $previous_category = ''; + foreach($result as $row) { + if ($previous_category != $row['default_setting_category']) { + echo "\n"; + echo "\n"; + echo th_order_by('default_setting_subcategory', 'Category', $order_by, $order); + echo th_order_by('default_setting_name', 'Name', $order_by, $order); + echo th_order_by('default_setting_value', 'Value', $order_by, $order); + echo th_order_by('default_setting_enabled', 'Enabled', $order_by, $order); + echo th_order_by('default_setting_description', 'Description', $order_by, $order); + echo "\n"; + echo "\n"; + } + echo "\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "\n"; + $previous_category = $row['default_setting_category']; + if ($c==0) { $c=1; } else { $c=0; } + } //end foreach + unset($sql, $result, $row_count); + } //end if results + + echo "\n"; + echo "\n"; + echo "\n"; + + echo "
\n"; + echo "
\n"; + echo " ".ucfirst($row['default_setting_category'])." 
\n"; + echo " $v_link_label_add\n"; + echo "
".$row['default_setting_subcategory']." ".$row['default_setting_name']." \n"; + + $category = $row['default_setting_category']; + $subcategory = $row['default_setting_subcategory']; + $name = $row['default_setting_name']; + if ($category == "domain" && $subcategory == "menu" && $name == "uuid" ) { + $sql = ""; + $sql .= "select * from v_menus "; + $sql .= "where menu_uuid = '".$row['default_setting_value']."' "; + $sub_prep_statement = $db->prepare(check_sql($sql)); + $sub_prep_statement->execute(); + $sub_result = $sub_prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach ($sub_result as &$sub_row) { + echo $sub_row["menu_language"]." - ".$sub_row["menu_name"]."\n"; + } + } else { + echo $row['default_setting_value']; + } + echo "  \n"; + echo " ".$row['default_setting_enabled']." ".$row['default_setting_description']." \n"; + echo " $v_link_label_edit\n"; + echo " $v_link_label_delete\n"; + echo "
\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "
 $paging_controls\n"; + echo " $v_link_label_add\n"; + echo "
\n"; + echo "
"; + echo "
"; + echo "

"; + echo "

"; + + echo "
"; + echo "
"; + echo "

"; + +//include the footer + require_once "includes/footer.php"; +?> \ No newline at end of file diff --git a/core/default_settings/default_settings_delete.php b/core/default_settings/default_settings_delete.php new file mode 100644 index 0000000000..0d66603d95 --- /dev/null +++ b/core/default_settings/default_settings_delete.php @@ -0,0 +1,58 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require_once "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (if_group("admin") || if_group("superadmin")) { + //access granted +} +else { + echo "access denied"; + exit; +} + +if (count($_GET)>0) { + $id = check_str($_GET["id"]); +} + +if (strlen($id)>0) { + $sql = ""; + $sql .= "delete from v_default_settings "; + $sql .= "where default_setting_uuid = '$id' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + unset($sql); +} + +require_once "includes/header.php"; +echo "\n"; +echo "
\n"; +echo "Delete Complete\n"; +echo "
\n"; +require_once "includes/footer.php"; +return; + +?> \ No newline at end of file diff --git a/core/default_settings/default_settings_edit.php b/core/default_settings/default_settings_edit.php new file mode 100644 index 0000000000..9423013a49 --- /dev/null +++ b/core/default_settings/default_settings_edit.php @@ -0,0 +1,372 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require_once "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (if_group("admin") || if_group("superadmin")) { + //access granted +} +else { + echo "access denied"; + exit; +} + +//action add or update + if (isset($_REQUEST["id"])) { + $action = "update"; + $default_setting_uuid = check_str($_REQUEST["id"]); + } + else { + $action = "add"; + } + +//get http post variables and set them to php variables + if (count($_POST)>0) { + $default_setting_category = check_str($_POST["default_setting_category"]); + $default_setting_subcategory = check_str($_POST["default_setting_subcategory"]); + $default_setting_name = check_str($_POST["default_setting_name"]); + $default_setting_value = check_str($_POST["default_setting_value"]); + $default_setting_enabled = check_str($_POST["default_setting_enabled"]); + $default_setting_description = check_str($_POST["default_setting_description"]); + } + +if (count($_POST)>0 && strlen($_POST["persistformvar"]) == 0) { + + $msg = ''; + if ($action == "update") { + $default_setting_uuid = check_str($_POST["default_setting_uuid"]); + } + + //check for all required data + //if (strlen($default_setting_category) == 0) { $msg .= "Please provide: Category
\n"; } + //if (strlen($default_setting_subcategory) == 0) { $msg .= "Please provide: Subcategory
\n"; } + //if (strlen($default_setting_name) == 0) { $msg .= "Please provide: Name
\n"; } + //if (strlen($default_setting_value) == 0) { $msg .= "Please provide: Value
\n"; } + //if (strlen($default_setting_enabled) == 0) { $msg .= "Please provide: Enabled
\n"; } + //if (strlen($default_setting_description) == 0) { $msg .= "Please provide: Description
\n"; } + if (strlen($msg) > 0 && strlen($_POST["persistformvar"]) == 0) { + require_once "includes/header.php"; + require_once "includes/persistformvar.php"; + echo "
\n"; + echo "
\n"; + echo $msg."
"; + echo "
\n"; + persistformvar($_POST); + echo "
\n"; + require_once "includes/footer.php"; + return; + } + + //add or update the database + if ($_POST["persistformvar"] != "true") { + if ($action == "add") { + $sql = "insert into v_default_settings "; + $sql .= "("; + $sql .= "default_setting_uuid, "; + $sql .= "default_setting_category, "; + $sql .= "default_setting_subcategory, "; + $sql .= "default_setting_name, "; + $sql .= "default_setting_value, "; + $sql .= "default_setting_enabled, "; + $sql .= "default_setting_description "; + $sql .= ")"; + $sql .= "values "; + $sql .= "("; + $sql .= "'".uuid()."', "; + $sql .= "'$default_setting_category', "; + $sql .= "'$default_setting_subcategory', "; + $sql .= "'$default_setting_name', "; + $sql .= "'$default_setting_value', "; + $sql .= "'$default_setting_enabled', "; + $sql .= "'$default_setting_description' "; + $sql .= ")"; + $db->exec(check_sql($sql)); + unset($sql); + + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Add Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + } //if ($action == "add") + + if ($action == "update") { + $sql = "update v_default_settings set "; + $sql .= "default_setting_category = '$default_setting_category', "; + $sql .= "default_setting_subcategory = '$default_setting_subcategory', "; + $sql .= "default_setting_name = '$default_setting_name', "; + $sql .= "default_setting_value = '$default_setting_value', "; + $sql .= "default_setting_enabled = '$default_setting_enabled', "; + $sql .= "default_setting_description = '$default_setting_description' "; + $sql .= "where default_setting_uuid = '$default_setting_uuid'"; + $db->exec(check_sql($sql)); + unset($sql); + + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Update Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + } //if ($action == "update") + } //if ($_POST["persistformvar"] != "true") +} //(count($_POST)>0 && strlen($_POST["persistformvar"]) == 0) + +//pre-populate the form + if (count($_GET)>0 && $_POST["persistformvar"] != "true") { + $default_setting_uuid = $_GET["id"]; + $sql = "select * from v_default_settings "; + $sql .= "where default_setting_uuid = '$default_setting_uuid' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach ($result as &$row) { + $default_setting_category = $row["default_setting_category"]; + $default_setting_subcategory = $row["default_setting_subcategory"]; + $default_setting_name = $row["default_setting_name"]; + $default_setting_value = $row["default_setting_value"]; + $default_setting_enabled = $row["default_setting_enabled"]; + $default_setting_description = $row["default_setting_description"]; + break; //limit to 1 row + } + unset ($prep_statement); + } + +//show the header + require_once "includes/header.php"; + +//show the content + echo "
"; + echo "\n"; + echo "\n"; + echo " "; + echo " "; + echo "
\n"; + echo "
"; + + echo "
\n"; + echo "
\n"; + echo "\n"; + echo "\n"; + if ($action == "add") { + echo "\n"; + } + if ($action == "update") { + echo "\n"; + } + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo " \n"; + echo " \n"; + echo " "; + echo "
Default Setting AddDefault Setting Edit
\n"; + echo "Settings used for all domains.

\n"; + echo "
\n"; + echo " Category:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the category.\n"; + echo "
\n"; + echo " Subcategory:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the category.\n"; + echo "
\n"; + echo " Name:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the name.\n"; + echo "
\n"; + echo " Value:\n"; + echo "\n"; + $category = $row['default_setting_category']; + $subcategory = $row['default_setting_subcategory']; + $name = $row['default_setting_name']; + if ($category == "domain" && $subcategory == "menu" && $name == "uuid" ) { + echo " \n"; + } elseif ($category == "domain" && $subcategory == "template" && $name == "name" ) { + echo " \n"; + } elseif ($category == "domain" && $subcategory == "time_zone" && $name == "name" ) { + echo " \n"; + } else { + echo " \n"; + } + echo "
\n"; + echo "Enter the value.\n"; + echo "
\n"; + echo " Enabled:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Choose to enable or disable the value.\n"; + echo "
\n"; + echo " Description:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the description.\n"; + echo "
\n"; + if ($action == "update") { + echo " \n"; + } + echo " \n"; + echo "
"; + echo ""; + + echo "
"; + echo "
"; + +//include the footer + require_once "includes/footer.php"; +?> \ No newline at end of file diff --git a/core/default_settings/root.php b/core/default_settings/root.php new file mode 100644 index 0000000000..7b882438ea --- /dev/null +++ b/core/default_settings/root.php @@ -0,0 +1,50 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ + +// make sure the PATH_SEPARATOR is defined + if (!defined("PATH_SEPARATOR")) { + if ( strpos( $_ENV[ "OS" ], "Win" ) !== false ) { define("PATH_SEPARATOR", ";"); } else { define("PATH_SEPARATOR", ":"); } + } + +// make sure the document_root is set + $_SERVER["SCRIPT_FILENAME"] = str_replace("\\", "/", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = str_replace($_SERVER["PHP_SELF"], "", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = realpath($_SERVER["DOCUMENT_ROOT"]); + //echo "DOCUMENT_ROOT: ".$_SERVER["DOCUMENT_ROOT"]."
\n"; + //echo "PHP_SELF: ".$_SERVER["PHP_SELF"]."
\n"; + //echo "SCRIPT_FILENAME: ".$_SERVER["SCRIPT_FILENAME"]."
\n"; + +// if the project directory exists then add it to the include path otherwise add the document root to the include path + if (is_dir($_SERVER["DOCUMENT_ROOT"].'/fusionpbx')){ + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', '/fusionpbx'); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER["DOCUMENT_ROOT"].'/fusionpbx' ); + } + else { + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', ''); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER['DOCUMENT_ROOT'] ); + } + +?> \ No newline at end of file diff --git a/core/domains/app_config.php b/core/domains/app_config.php new file mode 100644 index 0000000000..addaeb44c2 --- /dev/null +++ b/core/domains/app_config.php @@ -0,0 +1,115 @@ + \ No newline at end of file diff --git a/core/domains/app_defaults.php b/core/domains/app_defaults.php new file mode 100644 index 0000000000..bddc363f9c --- /dev/null +++ b/core/domains/app_defaults.php @@ -0,0 +1,37 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2010 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ + +//remove external from the end of the gateway path + if (substr($v_gateways_dir, -8) == "external") { + //$v_gateways_dir = substr($v_gateways_dir, 0, (strlen($v_gateways_dir)-9)); + //$sql = "update v_domain_settings set "; + //$sql .= "v_gateways_dir = '$v_gateways_dir' "; + //$sql .= "where domain_uuid = '$domain_uuid'"; + //$db->exec($sql); + //unset($sql); + } + +?> \ No newline at end of file diff --git a/core/domains/domain_settings.php b/core/domains/domain_settings.php new file mode 100644 index 0000000000..4249062dd6 --- /dev/null +++ b/core/domains/domain_settings.php @@ -0,0 +1,189 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require_once "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (if_group("admin") || if_group("superadmin")) { + //access granted +} +else { + echo "access denied"; + exit; +} +require_once "includes/header.php"; +require_once "includes/paging.php"; + +//get variables used to control the order + $order_by = $_GET["order_by"]; + $order = $_GET["order"]; + +//show the content + echo "
"; + echo "\n"; + echo "\n"; + echo " "; + echo ""; + echo "
\n"; + echo "
"; + + //echo "\n"; + //echo " \n"; + //echo " \n"; + //echo " \n"; + //echo " \n"; + //echo " \n"; + //echo " \n"; + //echo " \n"; + //echo "
Domain Settings 
\n"; + //echo " Settings used for each domain.

\n"; + //echo "
\n"; + + //prepare to page the results + $sql = " select count(*) as num_rows from v_domain_settings "; + $sql .= " where domain_uuid = '$domain_uuid' "; + $sql .= " and domain_uuid = '$domain_uuid' "; + if (strlen($order_by)> 0) { $sql .= "order by $order_by $order "; } + $prep_statement = $db->prepare($sql); + if ($prep_statement) { + $prep_statement->execute(); + $row = $prep_statement->fetch(PDO::FETCH_ASSOC); + if ($row['num_rows'] > 0) { + $num_rows = $row['num_rows']; + } + else { + $num_rows = '0'; + } + } + + //prepare to page the results + $rows_per_page = 100; + $param = ""; + $page = $_GET['page']; + if (strlen($page) == 0) { $page = 0; $_GET['page'] = 0; } + list($paging_controls, $rows_per_page, $var3) = paging($num_rows, $param, $rows_per_page); + $offset = $rows_per_page * $page; + + //get the domain list + $sql = ""; + $sql .= " select * from v_domain_settings "; + $sql .= " where domain_uuid = '$domain_uuid' "; + $sql .= " and domain_uuid = '$domain_uuid' "; + if (strlen($order_by)> 0) { $sql .= "order by $order_by $order "; } + $sql .= " limit $rows_per_page offset $offset "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + $result_count = count($result); + unset ($prep_statement, $sql); + + $c = 0; + $row_style["0"] = "row_style0"; + $row_style["1"] = "row_style1"; + + echo "
\n"; + echo "\n"; + + if ($result_count > 0) { + $previous_category = ''; + foreach($result as $row) { + if ($previous_category != $row['domain_setting_category']) { + echo "\n"; + echo "\n"; + echo th_order_by('domain_setting_subcategory', 'Category', $order_by, $order); + echo th_order_by('domain_setting_name', 'Name', $order_by, $order); + echo th_order_by('domain_setting_value', 'Value', $order_by, $order); + echo th_order_by('domain_setting_enabled', 'Enabled', $order_by, $order); + echo th_order_by('domain_setting_description', 'Description', $order_by, $order); + echo "\n"; + echo "\n"; + } + echo "\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "\n"; + $previous_category = $row['domain_setting_category']; + if ($c==0) { $c=1; } else { $c=0; } + } //end foreach + unset($sql, $result, $row_count); + } //end if results + + echo "\n"; + echo "\n"; + echo "\n"; + + echo "
\n"; + echo "
\n"; + echo "
\n"; + echo " ".ucfirst($row['domain_setting_category'])." 
\n"; + echo " $v_link_label_add\n"; + echo "
".$row['domain_setting_subcategory']." ".$row['domain_setting_name']." \n"; + + $category = $row['domain_setting_category']; + $subcategory = $row['domain_setting_subcategory']; + $name = $row['domain_setting_name']; + if ($category == "domain" && $subcategory == "menu" && $name == "uuid" ) { + $sql = ""; + $sql .= "select * from v_menus "; + $sql .= "where menu_uuid = '".$row['domain_setting_value']."' "; + $sub_prep_statement = $db->prepare(check_sql($sql)); + $sub_prep_statement->execute(); + $sub_result = $sub_prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach ($sub_result as &$sub_row) { + echo $sub_row["menu_language"]." - ".$sub_row["menu_name"]."\n"; + } + } else { + echo $row['domain_setting_value']; + } + echo "  \n"; + echo " ".$row['domain_setting_enabled']." ".$row['domain_setting_description']." \n"; + echo " $v_link_label_edit\n"; + echo " $v_link_label_delete\n"; + echo "
\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "
 $paging_controls\n"; + echo " $v_link_label_add\n"; + echo "
\n"; + echo "
"; + echo "
"; + echo "

"; + echo "

"; + + echo "
"; + echo "
"; + echo "

"; + +//include the footer + require_once "includes/footer.php"; +?> \ No newline at end of file diff --git a/core/domains/domain_settings_delete.php b/core/domains/domain_settings_delete.php new file mode 100644 index 0000000000..eeee263f8d --- /dev/null +++ b/core/domains/domain_settings_delete.php @@ -0,0 +1,60 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require_once "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (if_group("admin") || if_group("superadmin")) { + //access granted +} +else { + echo "access denied"; + exit; +} + +if (count($_GET)>0) { + $id = check_str($_GET["id"]); + $domain_uuid = check_str($_GET["domain_uuid"]); +} + +if (strlen($id)>0) { + $sql = ""; + $sql .= "delete from v_domain_settings "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and domain_setting_uuid = '$id' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + unset($sql); +} + +require_once "includes/header.php"; +echo "\n"; +echo "
\n"; +echo "Delete Complete\n"; +echo "
\n"; +require_once "includes/footer.php"; +return; + +?> \ No newline at end of file diff --git a/core/domains/domain_settings_edit.php b/core/domains/domain_settings_edit.php new file mode 100644 index 0000000000..990d15cb19 --- /dev/null +++ b/core/domains/domain_settings_edit.php @@ -0,0 +1,369 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require_once "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (if_group("admin") || if_group("superadmin")) { + //access granted +} +else { + echo "access denied"; + exit; +} + +//action add or update + if (isset($_REQUEST["id"])) { + $action = "update"; + $domain_setting_uuid = check_str($_REQUEST["id"]); + } + else { + $action = "add"; + } + +if (strlen($_GET["domain_uuid"]) > 0) { + $domain_uuid = check_str($_GET["domain_uuid"]); +} + +//get http post variables and set them to php variables + if (count($_POST)>0) { + $domain_setting_category = check_str($_POST["domain_setting_category"]); + $domain_setting_subcategory = check_str($_POST["domain_setting_subcategory"]); + $domain_setting_name = check_str($_POST["domain_setting_name"]); + $domain_setting_value = check_str($_POST["domain_setting_value"]); + $domain_setting_enabled = check_str($_POST["domain_setting_enabled"]); + $domain_setting_description = check_str($_POST["domain_setting_description"]); + } + +if (count($_POST)>0 && strlen($_POST["persistformvar"]) == 0) { + + $msg = ''; + if ($action == "update") { + $domain_setting_uuid = check_str($_POST["domain_setting_uuid"]); + } + + //check for all required data + //if (strlen($domain_uuid) == 0) { $msg .= "Please provide: domain_uuid
\n"; } + //if (strlen($domain_setting_category) == 0) { $msg .= "Please provide: Category
\n"; } + //if (strlen($domain_setting_subcategory) == 0) { $msg .= "Please provide: Subcategory
\n"; } + //if (strlen($domain_setting_name) == 0) { $msg .= "Please provide: Name
\n"; } + //if (strlen($domain_setting_value) == 0) { $msg .= "Please provide: Value
\n"; } + //if (strlen($domain_setting_enabled) == 0) { $msg .= "Please provide: Enabled
\n"; } + //if (strlen($domain_setting_description) == 0) { $msg .= "Please provide: Description
\n"; } + if (strlen($msg) > 0 && strlen($_POST["persistformvar"]) == 0) { + require_once "includes/header.php"; + require_once "includes/persistformvar.php"; + echo "
\n"; + echo "
\n"; + echo $msg."
"; + echo "
\n"; + persistformvar($_POST); + echo "
\n"; + require_once "includes/footer.php"; + return; + } + + //add or update the database + if ($_POST["persistformvar"] != "true") { + if ($action == "add") { + $sql = "insert into v_domain_settings "; + $sql .= "("; + $sql .= "domain_uuid, "; + $sql .= "domain_setting_uuid, "; + $sql .= "domain_setting_category, "; + $sql .= "domain_setting_subcategory, "; + $sql .= "domain_setting_name, "; + $sql .= "domain_setting_value, "; + $sql .= "domain_setting_enabled, "; + $sql .= "domain_setting_description "; + $sql .= ")"; + $sql .= "values "; + $sql .= "("; + $sql .= "'$domain_uuid', "; + $sql .= "'".uuid()."', "; + $sql .= "'$domain_setting_category', "; + $sql .= "'$domain_setting_subcategory', "; + $sql .= "'$domain_setting_name', "; + $sql .= "'$domain_setting_value', "; + $sql .= "'$domain_setting_enabled', "; + $sql .= "'$domain_setting_description' "; + $sql .= ")"; + $db->exec(check_sql($sql)); + unset($sql); + + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Add Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + } //if ($action == "add") + + if ($action == "update") { + $sql = "update v_domain_settings set "; + $sql .= "domain_setting_category = '$domain_setting_category', "; + $sql .= "domain_setting_subcategory = '$domain_setting_subcategory', "; + $sql .= "domain_setting_name = '$domain_setting_name', "; + $sql .= "domain_setting_value = '$domain_setting_value', "; + $sql .= "domain_setting_enabled = '$domain_setting_enabled', "; + $sql .= "domain_setting_description = '$domain_setting_description' "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and domain_setting_uuid = '$domain_setting_uuid'"; + $db->exec(check_sql($sql)); + unset($sql); + + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Update Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + } //if ($action == "update") + } //if ($_POST["persistformvar"] != "true") +} //(count($_POST)>0 && strlen($_POST["persistformvar"]) == 0) + +//pre-populate the form + if (count($_GET)>0 && $_POST["persistformvar"] != "true") { + $domain_setting_uuid = $_GET["id"]; + $sql = "select * from v_domain_settings "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and domain_setting_uuid = '$domain_setting_uuid' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach ($result as &$row) { + $domain_setting_category = $row["domain_setting_category"]; + $domain_setting_subcategory = $row["domain_setting_subcategory"]; + $domain_setting_name = $row["domain_setting_name"]; + $domain_setting_value = $row["domain_setting_value"]; + $domain_setting_enabled = $row["domain_setting_enabled"]; + $domain_setting_description = $row["domain_setting_description"]; + break; //limit to 1 row + } + unset ($prep_statement); + } + +//show the header + require_once "includes/header.php"; + +//show the content + echo "
"; + echo "\n"; + echo "\n"; + echo " "; + echo " "; + echo "
\n"; + echo "
"; + + echo "
\n"; + echo "
\n"; + echo "\n"; + echo "\n"; + if ($action == "add") { + echo "\n"; + } + if ($action == "update") { + echo "\n"; + } + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo " \n"; + echo " \n"; + echo " "; + echo "
Domain Setting AddDomain Setting Edit
\n"; + echo "Settings used for each domain.

\n"; + echo "
\n"; + echo " Category:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the category.\n"; + echo "
\n"; + echo " Subcategory:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the category.\n"; + echo "
\n"; + echo " Name:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the name.\n"; + echo "
\n"; + echo " Value:\n"; + echo "\n"; + $category = $row['domain_setting_category']; + $subcategory = $row['domain_setting_subcategory']; + $name = $row['domain_setting_name']; + if ($category == "domain" && $subcategory == "menu" && $name == "uuid" ) { + echo " \n"; + } elseif ($category == "domain" && $subcategory == "template" && $name == "name" ) { + echo " \n"; + } elseif ($category == "domain" && $subcategory == "time" && $name == "zone" ) { + echo " \n"; + break; + } else { + echo " \n"; + } + echo "
\n"; + echo "Enter the value.\n"; + echo "
\n"; + echo " Enabled:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Choose to enable or disable the value.\n"; + echo "
\n"; + echo " Description:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the description.\n"; + echo "
\n"; + echo " \n"; + if ($action == "update") { + echo " \n"; + } + echo " \n"; + echo "
"; + echo ""; + + echo "
"; + echo "
"; + +//include the footer + require_once "includes/footer.php"; +?> \ No newline at end of file diff --git a/core/domains/domains.php b/core/domains/domains.php new file mode 100644 index 0000000000..37326b5be0 --- /dev/null +++ b/core/domains/domains.php @@ -0,0 +1,197 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require_once "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (if_group("admin") || if_group("superadmin")) { + //access granted +} +else { + echo "access denied"; + exit; +} + +//change the tenant + if (strlen($_GET["domain_uuid"]) > 0 && $_GET["domain_change"] == "true") { + //get the domain_uuid + $sql = "select * from v_domains "; + $sql .= "order by domain_name asc "; + $prep_statement = $db->prepare($sql); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach($result as $row) { + if (count($result) == 0) { + $_SESSION["domain_uuid"] = $row["domain_uuid"]; + $_SESSION["domain_name"] = $row['domain_name']; + } + else { + if ($row['domain_name'] == $domain_array[0] || $row['domain_name'] == 'www.'.$domain_array[0]) { + $_SESSION["domain_uuid"] = $row["domain_uuid"]; + $_SESSION["domain_name"] = $row['domain_name']; + } + $_SESSION['domains'][$row['domain_uuid']]['domain_uuid'] = $row['domain_uuid']; + $_SESSION['domains'][$row['domain_uuid']]['domain_name'] = $row['domain_name']; + } + } + unset($result, $prep_statement); + + //update the domain session variables + $domain_uuid = check_str($_GET["domain_uuid"]); + $_SESSION['domain_uuid'] = $domain_uuid; + $_SESSION["domain_name"] = $_SESSION['domains'][$domain_uuid]['domain_name']; + $_SESSION['domain']['template']['name'] = $_SESSION['domains'][$domain_uuid]['template_name']; + //clear the menu session so that it is regenerated for the selected domain + $_SESSION["menu"] = ''; + //clear the extension array so that it is regenerated for the selected domain + unset($_SESSION['extension_array']); + //set the context + if (count($_SESSION["domains"]) > 1) { + $_SESSION["context"] = $_SESSION["domain_name"]; + } + else { + $_SESSION["context"] = 'default'; + } + } + +//includes + require_once "includes/header.php"; + require_once "includes/paging.php"; + +//get variables used to control the order + $order_by = $_GET["order_by"]; + $order = $_GET["order"]; + +//show the content + echo "
"; + echo "\n"; + echo "\n"; + echo " "; + echo ""; + echo "
\n"; + echo "
"; + + echo "\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "
Domains 
\n"; + echo " Control the list of domains to manage.

\n"; + echo "
\n"; + + //prepare to page the results + $sql = "select count(*) as num_rows from v_domains "; + if (strlen($order_by)> 0) { $sql .= "order by $order_by $order "; } + $prep_statement = $db->prepare($sql); + if ($prep_statement) { + $prep_statement->execute(); + $row = $prep_statement->fetch(PDO::FETCH_ASSOC); + if ($row['num_rows'] > 0) { + $num_rows = $row['num_rows']; + } + else { + $num_rows = '0'; + } + } + + //prepare to page the results + $rows_per_page = 100; + $param = ""; + $page = $_GET['page']; + if (strlen($page) == 0) { $page = 0; $_GET['page'] = 0; } + list($paging_controls, $rows_per_page, $var3) = paging($num_rows, $param, $rows_per_page); + $offset = $rows_per_page * $page; + + //get the list + $sql = "select * from v_domains "; + $sql .= "order by domain_name asc "; + if (strlen($order_by)> 0) { $sql .= "order by $order_by $order "; } + $sql .= " limit $rows_per_page offset $offset "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + $result_count = count($result); + unset ($prep_statement, $sql); + + $c = 0; + $row_style["0"] = "row_style0"; + $row_style["1"] = "row_style1"; + + echo "
\n"; + echo "\n"; + echo "\n"; + echo th_order_by('domain_name', 'Domain', $order_by, $order); + echo th_order_by('domain_description', 'Description', $order_by, $order); + echo "\n"; + echo "\n"; + + if ($result_count > 0) { + foreach($result as $row) { + echo "\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "\n"; + if ($c==0) { $c=1; } else { $c=0; } + } //end foreach + unset($sql, $result, $row_count); + } //end if results + + + echo "\n"; + echo "\n"; + echo "\n"; + + echo "
\n"; + echo " $v_link_label_add\n"; + echo "
".$row['domain_name']." ".$row['domain_description']." \n"; + echo " $v_link_label_edit\n"; + echo " $v_link_label_delete\n"; + echo "
\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "
 $paging_controls\n"; + echo " $v_link_label_add\n"; + echo "
\n"; + echo "
"; + echo "
"; + echo "

"; + echo "

"; + + echo "
"; + echo "
"; + echo "

"; + +//include the footer + require_once "includes/footer.php"; +?> \ No newline at end of file diff --git a/core/domains/domains_delete.php b/core/domains/domains_delete.php new file mode 100644 index 0000000000..16cecb8a35 --- /dev/null +++ b/core/domains/domains_delete.php @@ -0,0 +1,195 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require_once "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (if_group("admin") || if_group("superadmin")) { + //access granted +} +else { + echo "access denied"; + exit; +} + +if (count($_GET)>0) { + $id = check_str($_GET["id"]); +} + +if (strlen($id) > 0) { + //get the domain using the id + $sql = "select * from v_domains "; + $sql .= "where domain_uuid = '$id' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach ($result as &$row) { + $domain_name = $row["domain_name"]; + } + unset ($prep_statement); + + //get the domain settings + $sql = "select * from v_domain_settings "; + $sql .= "where domain_uuid = '".$id."' "; + $sql .= "and domain_setting_enabled = 'true' "; + $prep_statement = $db->prepare($sql); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach($result as $row) { + $name = $row['domain_setting_name']; + $category = $row['domain_setting_category']; + $subcategory = $row['domain_setting_subcategory']; + if (strlen($subcategory) == 0) { + //$$category[$name] = $row['domain_setting_value']; + $_SESSION[$category][$name] = $row['domain_setting_value']; + } + else { + //$$category[$subcategory][$name] = $row['domain_setting_value']; + $_SESSION[$category][$subcategory][$name] = $row['domain_setting_value']; + } + } + + //get the $apps array from the installed apps from the core and mod directories + $config_list = glob($_SERVER["DOCUMENT_ROOT"] . PROJECT_PATH . "/*/*/app_config.php"); + $x=0; + foreach ($config_list as &$config_path) { + include($config_path); + $x++; + } + + //delete the domain data from all tables in the database + $db->beginTransaction(); + foreach ($apps as &$app) { + foreach ($app['db'] as $row) { + $table_name = $row['table']; + foreach ($row['fields'] as $field) { + if ($field['name'] == "domain_uuid") { + $sql = "delete from $table_name where domain_uuid = '$id' "; + $db->query($sql); + } + } + } + } + $db->commit(); + + if (strlen($domain_name) > 0) { + //set the needle + if (count($_SESSION["domains"]) > 1) { + $v_needle = 'v_'.$domain_name.'_'; + } + else { + $v_needle = 'v_'; + } + + //delete the dialplan + unlink($_SESSION['switch']['dialplan']['dir'].'/'.$domain_name.'.xml'); + if (strlen($_SESSION['switch']['dialplan']['dir']) > 0) { + system('rm -rf '.$_SESSION['switch']['dialplan']['dir'].'/'.$domain_name); + } + + //delete the dialplan public + unlink($_SESSION['switch']['dialplan']['dir'].'/public/'.$domain_name.'.xml'); + if (strlen($_SESSION['switch']['dialplan']['dir']) > 0) { + system('rm -rf '.$_SESSION['switch']['dialplan']['dir'].'/public/'.$domain_name); + } + + //delete the extension + unlink($_SESSION['switch']['extensions']['dir'].'/'.$domain_name.'.xml'); + if (strlen($_SESSION['switch']['extensions']['dir']) > 0) { + system('rm -rf '.$_SESSION['switch']['extensions']['dir'].'/'.$domain_name); + } + + //delete fax + if (strlen($_SESSION['switch']['storage']['dir']) > 0) { + system('rm -rf '.$_SESSION['switch']['storage']['dir'].'/fax/'.$domain_name); + } + + //delete the gateways + if($dh = opendir($_SESSION['switch']['gateways']['dir'])) { + $files = Array(); + while($file = readdir($dh)) { + if($file != "." && $file != ".." && $file[0] != '.') { + if(is_dir($dir . "/" . $file)) { + //this is a directory do nothing + } else { + //check if file extension is xml + if (strpos($file, $v_needle) !== false && substr($file,-4) == '.xml') { + unlink($_SESSION['switch']['gateways']['dir']."/".$file); + } + } + } + } + closedir($dh); + } + + //delete the ivr menu + if($dh = opendir($_SESSION['switch']['conf']['dir']."/ivr_menus/")) { + $files = Array(); + while($file = readdir($dh)) { + if($file != "." && $file != ".." && $file[0] != '.') { + if(is_dir($dir . "/" . $file)) { + //this is a directory + } else { + if (strpos($file, $v_needle) !== false && substr($file,-4) == '.xml') { + unlink($_SESSION['switch']['conf']['dir']."/ivr_menus/".$file); + } + } + } + } + closedir($dh); + } + + //delete the recordings + if (strlen($_SESSION['switch'][recordings]['dir']) > 0) { + system('rm -rf '.$_SESSION['switch']['recordings']['dir'].'/'.$domain_name); + } + + //delete voicemail + if (strlen($_SESSION['switch']['voicemail']['dir']) > 0) { + system('rm -rf '.$_SESSION['switch']['voicemail']['dir'].'/'.$domain_name); + } + } + + //apply settings reminder + $_SESSION["reload_xml"] = true; + + //clear the domains session array to update it + unset($_SESSION["domains"]); + unset($_SESSION["domain_uuid"]); + unset($_SESSION["domain_name"]); + unset($_SESSION['domain']); + unset($_SESSION['switch']); +} + +//redirect the browser + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Delete Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + +?> \ No newline at end of file diff --git a/core/domains/domains_edit.php b/core/domains/domains_edit.php new file mode 100644 index 0000000000..caa2e34c9a --- /dev/null +++ b/core/domains/domains_edit.php @@ -0,0 +1,216 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require_once "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (if_group("admin") || if_group("superadmin")) { + //access granted +} +else { + echo "access denied"; + exit; +} + +//action add or update + if (isset($_REQUEST["id"])) { + $action = "update"; + $domain_uuid = check_str($_REQUEST["id"]); + } + else { + $action = "add"; + } + +//get http post variables and set them to php variables + if (count($_POST)>0) { + $domain_name = check_str($_POST["domain_name"]); + $domain_description = check_str($_POST["domain_description"]); + } + +if (count($_POST)>0 && strlen($_POST["persistformvar"]) == 0) { + + $msg = ''; + if ($action == "update") { + $domain_uuid = check_str($_POST["domain_uuid"]); + } + + //check for all required data + //if (strlen($domain_name) == 0) { $msg .= "Please provide: Domain
\n"; } + //if (strlen($domain_description) == 0) { $msg .= "Please provide: Description
\n"; } + if (strlen($msg) > 0 && strlen($_POST["persistformvar"]) == 0) { + require_once "includes/header.php"; + require_once "includes/persistformvar.php"; + echo "
\n"; + echo "
\n"; + echo $msg."
"; + echo "
\n"; + persistformvar($_POST); + echo "
\n"; + require_once "includes/footer.php"; + return; + } + + //add or update the database + if ($_POST["persistformvar"] != "true") { + if ($action == "add") { + $sql = "insert into v_domains "; + $sql .= "("; + $sql .= "domain_uuid, "; + $sql .= "domain_name, "; + $sql .= "domain_description "; + $sql .= ")"; + $sql .= "values "; + $sql .= "("; + $sql .= "'".uuid()."', "; + $sql .= "'$domain_name', "; + $sql .= "'$domain_description' "; + $sql .= ")"; + $db->exec(check_sql($sql)); + unset($sql); + } + + if ($action == "update") { + $sql = "update v_domains set "; + $sql .= "domain_name = '$domain_name', "; + $sql .= "domain_description = '$domain_description' "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $db->exec(check_sql($sql)); + unset($sql); + } + + //upgrade the domains + require_once "core/upgrade/upgrade_domains.php"; + + //clear the domains session array to update it + unset($_SESSION["domains"]); + unset($_SESSION["domain_uuid"]); + unset($_SESSION["domain_name"]); + unset($_SESSION['domain']); + unset($_SESSION['switch']); + + //redirect the browser + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + if ($action == "update") { + echo "Update Complete\n"; + } + if ($action == "add") { + echo "Add Complete\n"; + } + echo "
\n"; + require_once "includes/footer.php"; + return; + } //if ($_POST["persistformvar"] != "true") +} //(count($_POST)>0 && strlen($_POST["persistformvar"]) == 0) + +//pre-populate the form + if (count($_GET)>0 && $_POST["persistformvar"] != "true") { + $domain_uuid = $_GET["id"]; + $sql = "select * from v_domains "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach ($result as &$row) { + $domain_name = $row["domain_name"]; + $domain_description = $row["domain_description"]; + break; //limit to 1 row + } + unset ($prep_statement); + } + +//show the header + require_once "includes/header.php"; + +//show the content + echo "
"; + echo "\n"; + echo "\n"; + echo " "; + echo " "; + echo "
\n"; + echo "
"; + + echo "
\n"; + echo "
\n"; + echo "\n"; + echo "\n"; + if ($action == "add") { + echo "\n"; + } + if ($action == "update") { + echo "\n"; + } + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo " \n"; + echo " \n"; + echo " "; + echo "
Domain AddDomain Edit
\n"; + echo "Control the list of domains to manage.

\n"; + echo "
\n"; + echo " Domain:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the domain name.\n"; + echo "
\n"; + echo " Description:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the description.\n"; + echo "
\n"; + if ($action == "update") { + echo " \n"; + } + echo " \n"; + echo "
"; + echo ""; + + if ($action == "update") { + require "domain_settings.php"; + } + + echo "
"; + echo "
"; + +//include the footer + require_once "includes/footer.php"; +?> \ No newline at end of file diff --git a/core/domains/root.php b/core/domains/root.php new file mode 100644 index 0000000000..7b882438ea --- /dev/null +++ b/core/domains/root.php @@ -0,0 +1,50 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ + +// make sure the PATH_SEPARATOR is defined + if (!defined("PATH_SEPARATOR")) { + if ( strpos( $_ENV[ "OS" ], "Win" ) !== false ) { define("PATH_SEPARATOR", ";"); } else { define("PATH_SEPARATOR", ":"); } + } + +// make sure the document_root is set + $_SERVER["SCRIPT_FILENAME"] = str_replace("\\", "/", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = str_replace($_SERVER["PHP_SELF"], "", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = realpath($_SERVER["DOCUMENT_ROOT"]); + //echo "DOCUMENT_ROOT: ".$_SERVER["DOCUMENT_ROOT"]."
\n"; + //echo "PHP_SELF: ".$_SERVER["PHP_SELF"]."
\n"; + //echo "SCRIPT_FILENAME: ".$_SERVER["SCRIPT_FILENAME"]."
\n"; + +// if the project directory exists then add it to the include path otherwise add the document root to the include path + if (is_dir($_SERVER["DOCUMENT_ROOT"].'/fusionpbx')){ + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', '/fusionpbx'); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER["DOCUMENT_ROOT"].'/fusionpbx' ); + } + else { + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', ''); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER['DOCUMENT_ROOT'] ); + } + +?> \ No newline at end of file diff --git a/core/menu/app_config.php b/core/menu/app_config.php new file mode 100644 index 0000000000..e56d01953f --- /dev/null +++ b/core/menu/app_config.php @@ -0,0 +1,232 @@ + \ No newline at end of file diff --git a/core/menu/app_defaults.php b/core/menu/app_defaults.php new file mode 100644 index 0000000000..57a9ad23ec --- /dev/null +++ b/core/menu/app_defaults.php @@ -0,0 +1,118 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ + +//if there are no items in the menu then add the default menu + $sql = "SELECT count(*) as count FROM v_menus "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $sub_result = $prep_statement->fetch(PDO::FETCH_ASSOC); + unset ($prep_statement); + if ($sub_result['count'] > 0) { + if ($display_type == "text") { + echo " Menu: no change\n"; + } + } + else { + //create the uuid + $menu_uuid = 'b4750c3f-2a86-b00d-b7d0-345c14eca286'; + //set the defaults + $menu_name = 'default'; + $menu_language = 'en'; + $menu_description = ''; + //add the menu + $sql = "insert into v_menus "; + $sql .= "("; + $sql .= "menu_uuid, "; + $sql .= "menu_name, "; + $sql .= "menu_language, "; + $sql .= "menu_description "; + $sql .= ")"; + $sql .= "values "; + $sql .= "("; + $sql .= "'".$menu_uuid."', "; + $sql .= "'$menu_name', "; + $sql .= "'$menu_language', "; + $sql .= "'$menu_description' "; + $sql .= ")"; + $db->exec(check_sql($sql)); + unset($sql); + //add the menu items + require_once "includes/classes/menu.php"; + $menu = new menu; + $menu->db = $db; + $menu->menu_uuid = $menu_uuid; + $menu->restore(); + unset($menu); + if ($display_type == "text") { + echo " Menu: added\n"; + } + } + unset($prep_statement, $sub_result); + +//if there are no groups listed in v_menu_item_groups then add the default groups + $sql = "SELECT * FROM v_menus "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + $result_count = count($result); + foreach($result as $field) { + //get the menu_uuid + $menu_uuid = $field['menu_uuid']; + //check each menu to see if there are items in the menu assigned to it + $sql = ""; + $sql .= "select count(*) as count from v_menu_item_groups "; + $sql .= "where menu_uuid = '$menu_uuid' "; + $prep_statement = $db->prepare($sql); + $prep_statement->execute(); + $sub_result = $prep_statement->fetch(PDO::FETCH_ASSOC); + unset ($prep_statement); + if ($sub_result['count'] == 0) { + //no menu item groups found add the defaults + foreach($apps as $app) { + foreach ($app['menu'] as $sub_row) { + foreach ($sub_row['groups'] as $group) { + //add the record + $sql = "insert into v_menu_item_groups "; + $sql .= "("; + $sql .= "menu_uuid, "; + $sql .= "menu_item_uuid, "; + $sql .= "group_name "; + $sql .= ")"; + $sql .= "values "; + $sql .= "("; + $sql .= "'$menu_uuid', "; + $sql .= "'".$sub_row['uuid']."', "; + $sql .= "'".$group."' "; + $sql .= ")"; + $db->exec($sql); + unset($sql); + } + } + } + } + } + +?> \ No newline at end of file diff --git a/core/menu/menu.php b/core/menu/menu.php new file mode 100644 index 0000000000..dad8cbfb57 --- /dev/null +++ b/core/menu/menu.php @@ -0,0 +1,152 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require_once "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (if_group("admin") || if_group("superadmin")) { + //access granted +} +else { + echo "access denied"; + exit; +} +require_once "includes/header.php"; +require_once "includes/paging.php"; + +//get variables used to control the order + $order_by = $_GET["order_by"]; + $order = $_GET["order"]; + +//show the content + echo "
"; + echo "\n"; + echo "\n"; + echo " "; + echo ""; + echo "
\n"; + echo "
"; + + echo "\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "
Menu Manager 
\n"; + echo " Used to customize one or more menus.

\n"; + echo "
\n"; + + //prepare to page the results + $sql = " select count(*) as num_rows from v_menus "; + $prep_statement = $db->prepare($sql); + if ($prep_statement) { + $prep_statement->execute(); + $row = $prep_statement->fetch(PDO::FETCH_ASSOC); + if ($row['num_rows'] > 0) { + $num_rows = $row['num_rows']; + } + else { + $num_rows = '0'; + } + } + + //prepare to page the results + $rows_per_page = 150; + $param = ""; + $page = $_GET['page']; + if (strlen($page) == 0) { $page = 0; $_GET['page'] = 0; } + list($paging_controls, $rows_per_page, $var_3) = paging($num_rows, $param, $rows_per_page); + $offset = $rows_per_page * $page; + + //get the list + $sql = " select * from v_menus "; + if (strlen($order_by)> 0) { $sql .= "order by $order_by $order "; } + $sql .= " limit $rows_per_page offset $offset "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + $result_count = count($result); + unset ($prep_statement, $sql); + + $c = 0; + $row_style["0"] = "row_style0"; + $row_style["1"] = "row_style1"; + + echo "
\n"; + echo "\n"; + echo "\n"; + echo th_order_by('menu_name', 'Name', $order_by, $order); + echo th_order_by('menu_language', 'Language', $order_by, $order); + echo th_order_by('menu_description', 'Description', $order_by, $order); + echo "\n"; + echo "\n"; + + if ($result_count > 0) { + foreach($result as $row) { + echo "\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "\n"; + if ($c==0) { $c=1; } else { $c=0; } + } //end foreach + unset($sql, $result, $row_count); + } //end if results + + echo "\n"; + echo "\n"; + echo "\n"; + + echo "
\n"; + echo " $v_link_label_add\n"; + echo "
".$row['menu_name']." ".$row['menu_language']." ".$row['menu_description']." \n"; + echo " $v_link_label_edit\n"; + echo " $v_link_label_delete\n"; + echo "
\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "
 $paging_controls\n"; + echo " $v_link_label_add\n"; + echo "
\n"; + echo "
"; + echo "
"; + echo "

"; + echo "

"; + + echo "
"; + echo "
"; + echo "

"; + +//include the footer + require_once "includes/footer.php"; +?> \ No newline at end of file diff --git a/core/menu/menu_delete.php b/core/menu/menu_delete.php new file mode 100644 index 0000000000..2612db755a --- /dev/null +++ b/core/menu/menu_delete.php @@ -0,0 +1,83 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require_once "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (if_group("admin") || if_group("superadmin")) { + //access granted +} +else { + echo "access denied"; + exit; +} + +if (count($_GET)>0) { + $id = check_str($_GET["id"]); + $menu_uuid = check_str($_GET["menu_uuid"]); +} + +if (strlen($id)>0) { + //start the database transaction + $db->beginTransaction(); + + //delete the menu + $sql = ""; + $sql .= "delete from v_menus "; + $sql .= "where menu_uuid = '$menu_uuid' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + unset($sql); + + //delete the items in the menu + $sql = ""; + $sql .= "delete from v_menu_items "; + $sql .= "where menu_uuid = '$menu_uuid' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + unset($sql); + + //delete the menu permissions + $sql = ""; + $sql .= "delete from v_menu_item_groups "; + $sql .= "where menu_uuid = '$menu_uuid' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + unset($sql); + + //save the changes to the database + $db->commit(); +} + +//redirect the user + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Delete Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + +?> \ No newline at end of file diff --git a/core/menu/menu_edit.php b/core/menu/menu_edit.php new file mode 100644 index 0000000000..02608984fc --- /dev/null +++ b/core/menu/menu_edit.php @@ -0,0 +1,245 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require_once "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (if_group("admin") || if_group("superadmin")) { + //access granted +} +else { + echo "access denied"; + exit; +} + +//action add or update + if (isset($_REQUEST["id"])) { + $action = "update"; + $menu_uuid = check_str($_REQUEST["id"]); + } + else { + $action = "add"; + } + +//get http post variables and set them to php variables + if (count($_POST)>0) { + $menu_uuid = check_str($_POST["menu_uuid"]); + $menu_name = check_str($_POST["menu_name"]); + $menu_language = check_str($_POST["menu_language"]); + $menu_description = check_str($_POST["menu_description"]); + } + +if (count($_POST)>0 && strlen($_POST["persistformvar"]) == 0) { + + $msg = ''; + if ($action == "update") { + $menu_uuid = check_str($_POST["menu_uuid"]); + } + + //check for all required data + //if (strlen($menu_uuid) == 0) { $msg .= "Please provide: Menu UUID
\n"; } + //if (strlen($menu_name) == 0) { $msg .= "Please provide: Name
\n"; } + //if (strlen($menu_language) == 0) { $msg .= "Please provide: Language
\n"; } + //if (strlen($menu_description) == 0) { $msg .= "Please provide: Description
\n"; } + if (strlen($msg) > 0 && strlen($_POST["persistformvar"]) == 0) { + require_once "includes/header.php"; + require_once "includes/persistformvar.php"; + echo "
\n"; + echo "
\n"; + echo $msg."
"; + echo "
\n"; + persistformvar($_POST); + echo "
\n"; + require_once "includes/footer.php"; + return; + } + + //add or update the database + if ($_POST["persistformvar"] != "true") { + if ($action == "add") { + //create a new unique id + $menu_uuid = uuid(); + + //start a new menu + $sql = "insert into v_menus "; + $sql .= "("; + $sql .= "menu_uuid, "; + $sql .= "menu_name, "; + $sql .= "menu_language, "; + $sql .= "menu_description "; + $sql .= ")"; + $sql .= "values "; + $sql .= "("; + $sql .= "'".$menu_uuid."', "; + $sql .= "'$menu_name', "; + $sql .= "'$menu_language', "; + $sql .= "'$menu_description' "; + $sql .= ")"; + $db->exec(check_sql($sql)); + unset($sql); + + //add the default items in the menu + require_once "includes/classes/menu.php"; + $menu = new menu; + $menu->db = $db; + $menu->menu_uuid = $menu_uuid; + $menu->restore(); + + //redirect the user back to the main menu + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Add Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + } //if ($action == "add") + + if ($action == "update") { + //update the menu + $sql = "update v_menus set "; + $sql .= "menu_name = '$menu_name', "; + $sql .= "menu_language = '$menu_language', "; + $sql .= "menu_description = '$menu_description' "; + $sql .= "where menu_uuid = '$menu_uuid'"; + $db->exec(check_sql($sql)); + unset($sql); + + //redirect the user back to the main menu + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Update Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + } //if ($action == "update") + } //if ($_POST["persistformvar"] != "true") +} //(count($_POST)>0 && strlen($_POST["persistformvar"]) == 0) + +//pre-populate the form + if (count($_GET)>0 && $_POST["persistformvar"] != "true") { + $menu_uuid = $_GET["id"]; + $sql = "select * from v_menus "; + $sql .= "where menu_uuid = '$menu_uuid' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach ($result as &$row) { + $menu_uuid = $row["menu_uuid"]; + $menu_name = $row["menu_name"]; + $menu_language = $row["menu_language"]; + $menu_description = $row["menu_description"]; + break; //limit to 1 row + } + unset ($prep_statement); + } + +//show the header + require_once "includes/header.php"; + +//show the content + echo "
"; + echo "\n"; + echo "\n"; + echo " "; + echo " "; + echo "
\n"; + echo "
"; + + echo "
\n"; + echo "
\n"; + echo "\n"; + echo "\n"; + if ($action == "add") { + echo "\n"; + } + if ($action == "update") { + echo "\n"; + } + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo " \n"; + echo " \n"; + echo " "; + echo "
Menu AddMenu Edit\n"; + if (permission_exists('menu_restore')) { + echo " "; + } + echo "
\n"; + echo "Used to customize one or more menus.

\n"; + echo "
\n"; + echo " Name:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the name of the menu.\n"; + echo "
\n"; + echo " Language:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the language.\n"; + echo "
\n"; + echo " Description:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the description.\n"; + echo "
\n"; + if ($action == "update") { + echo " \n"; + } + echo " \n"; + echo "
"; + echo ""; + + echo "
"; + echo "
"; + +//show the menu items + require_once "core/menu/menu_item_list.php"; + +//include the footer + require_once "includes/footer.php"; +?> \ No newline at end of file diff --git a/core/menu/menu_item_delete.php b/core/menu/menu_item_delete.php new file mode 100644 index 0000000000..dfc84964cc --- /dev/null +++ b/core/menu/menu_item_delete.php @@ -0,0 +1,62 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('menu_delete')) { + //access granted +} +else { + echo "access denied"; + return; +} + +if (count($_GET)>0) { + //clear the menu session so it will rebuild with the update + $_SESSION["menu"] = ""; + + //get the menu uuid + $menu_uuid = check_str($_GET["id"]); + $menu_item_id = check_str($_GET["menu_item_id"]); + + //delete the item in the menu + $sql = "delete from v_menu_items "; + $sql .= "where menu_item_id = '$menu_item_id' "; + $sql .= "and menu_uuid = '$menu_uuid' "; + $db->exec(check_sql($sql)); + unset($sql); + + //redirect the user + require_once "includes/header.php"; + echo "\n"; + echo "
"; + echo "Delete Completed"; + echo "
"; + require_once "includes/footer.php"; + return; +} + +?> \ No newline at end of file diff --git a/core/menu/menu_item_edit.php b/core/menu/menu_item_edit.php new file mode 100644 index 0000000000..40e92d4a4f --- /dev/null +++ b/core/menu/menu_item_edit.php @@ -0,0 +1,464 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('menu_add') || permission_exists('menu_edit') || permission_exists('menu_delete')) { + //access granted +} +else { + echo "access denied"; + return; +} + +//include the header + require_once "includes/header.php"; + +//get the menu_uuid + $menu_uuid = check_str($_REQUEST["id"]); + $menu_item_uuid = check_str($_REQUEST['menu_item_uuid']); + $group_name = check_str($_REQUEST['group_name']); + +//delete the group from the user + if ($_REQUEST["a"] == "delete" && permission_exists("menu_delete")) { + //delete the group from the users + $sql = "delete from v_menu_item_groups "; + $sql .= "where menu_uuid = '".$menu_uuid."' "; + $sql .= "and menu_item_uuid = '".$menu_item_uuid."' "; + $sql .= "and group_name = '".$group_name."' "; + $db->exec(check_sql($sql)); + //redirect the browser + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Delete Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + } + +//add a group to the menu + if ($_REQUEST["a"] != "delete" && strlen($group_name) > 0 && permission_exists('menu_add')) { + //add the group to the menu + if (strlen($menu_item_uuid) > 0) { + $sql_insert = "insert into v_menu_item_groups "; + $sql_insert .= "("; + $sql_insert .= "menu_uuid, "; + $sql_insert .= "menu_item_uuid, "; + $sql_insert .= "group_name "; + $sql_insert .= ")"; + $sql_insert .= "values "; + $sql_insert .= "("; + $sql_insert .= "'".$menu_uuid."', "; + $sql_insert .= "'".$menu_item_uuid."', "; + $sql_insert .= "'".$group_name."' "; + $sql_insert .= ")"; + $db->exec($sql_insert); + } + } + +//action add or update + if (isset($_REQUEST["menu_item_uuid"])) { + if (strlen($_REQUEST["menu_item_uuid"]) > 0) { + $action = "update"; + $menu_item_uuid = check_str($_REQUEST["menu_item_uuid"]); + } + else { + $action = "add"; + } + } + else { + $action = "add"; + } + +//clear the menu session so it will rebuild with the update + $_SESSION["menu"] = ""; + +//get the HTTP POST variables and set them as PHP variables + if (count($_POST)>0) { + $menu_uuid = check_str($_POST["menu_uuid"]); + $menu_item_uuid = check_str($_POST["menu_item_uuid"]); + $menu_item_title = check_str($_POST["menu_item_title"]); + $menu_item_link = check_str($_POST["menu_item_link"]); + $menu_item_category = check_str($_POST["menu_item_category"]); + $menu_item_description = check_str($_POST["menu_item_description"]); + $menu_item_protected = check_str($_POST["menu_item_protected"]); + //$menu_item_uuid = check_str($_POST["menu_item_uuid"]); + $menu_item_parent_uuid = check_str($_POST["menu_item_parent_uuid"]); + $menu_item_order = check_str($_POST["menu_item_order"]); + } + +//when a HTTP POST is available then process it + if (count($_POST)>0 && strlen($_POST["persistformvar"]) == 0) { + + if ($action == "update") { + $menu_item_uuid = check_str($_POST["menu_item_uuid"]); + } + + //check for all required data + $msg = ''; + if (strlen($menu_item_title) == 0) { $msg .= "Please provide: title
\n"; } + if (strlen($menu_item_category) == 0) { $msg .= "Please provide: category
\n"; } + //if (strlen($menu_item_link) == 0) { $msg .= "Please provide: menu_item_link
\n"; } + if (strlen($msg) > 0 && strlen($_POST["persistformvar"]) == 0) { + require_once "includes/header.php"; + require_once "includes/persistformvar.php"; + echo "
\n"; + echo "
\n"; + echo $msg."
"; + echo "
\n"; + persistformvar($_POST); + echo "
\n"; + require_once "includes/footer.php"; + return; + } + + //add or update the database + if ($_POST["persistformvar"] != "true") { + if ($action == "add" && permission_exists('menu_add')) { + $sql = "SELECT menu_item_order FROM v_menu_items "; + $sql .= "where menu_uuid = '$menu_uuid' "; + $sql .= "and menu_item_parent_uuid = '$menu_item_parent_uuid' "; + $sql .= "order by menu_item_order desc "; + $sql .= "limit 1 "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach ($result as &$row) { + $highest_menu_item_order = $row[menu_item_order]; + } + unset($prep_statement); + + $sql = "insert into v_menu_items "; + $sql .= "("; + $sql .= "menu_uuid, "; + $sql .= "menu_item_title, "; + $sql .= "menu_item_link, "; + $sql .= "menu_item_category, "; + $sql .= "menu_item_description, "; + $sql .= "menu_item_protected, "; + $sql .= "menu_item_uuid, "; + $sql .= "menu_item_parent_uuid, "; + $sql .= "menu_item_order, "; + $sql .= "menu_item_add_user, "; + $sql .= "menu_item_add_date "; + $sql .= ")"; + $sql .= "values "; + $sql .= "("; + $sql .= "'$menu_uuid', "; + $sql .= "'$menu_item_title', "; + $sql .= "'$menu_item_link', "; + $sql .= "'$menu_item_category', "; + $sql .= "'$menu_item_description', "; + $sql .= "'$menu_item_protected', "; + $sql .= "'".uuid()."', "; + if (strlen($menu_item_parent_uuid) == 0) { + $sql .= "null, "; + } + else { + $sql .= "'$menu_item_parent_uuid', "; + } + $sql .= "'".($highest_menu_item_order+1)."', "; + $sql .= "'".$_SESSION["username"]."', "; + $sql .= "now() "; + $sql .= ")"; + $db->exec(check_sql($sql)); + unset($sql); + + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Add Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + } + + if ($action == "update" && permission_exists('menu_edit')) { + $sql = "update v_menu_items set "; + $sql .= "menu_item_title = '$menu_item_title', "; + $sql .= "menu_item_link = '$menu_item_link', "; + $sql .= "menu_item_category = '$menu_item_category', "; + $sql .= "menu_item_description = '$menu_item_description', "; + $sql .= "menu_item_protected = '$menu_item_protected', "; + if (strlen($menu_item_parent_uuid) == 0) { + $sql .= "menu_item_parent_uuid = null, "; + } + else { + $sql .= "menu_item_parent_uuid = '$menu_item_parent_uuid', "; + } + $sql .= "menu_item_order = '$menu_item_order', "; + $sql .= "menu_item_mod_user = '".$_SESSION["username"]."', "; + $sql .= "menu_item_mod_date = now() "; + $sql .= "where menu_uuid = '$menu_uuid' "; + $sql .= "and menu_item_uuid = '$menu_item_uuid' "; + $count = $db->exec(check_sql($sql)); + + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Edit Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + } + } //if ($_POST["persistformvar"] != "true") + } //(count($_POST)>0 && strlen($_POST["persistformvar"]) == 0) + +//pre-populate the form + if (count($_GET)>0 && $_POST["persistformvar"] != "true") { + $menu_item_uuid = $_GET["menu_item_uuid"]; + + $sql = "select * from v_menu_items "; + $sql .= "where menu_uuid = '$menu_uuid' "; + $sql .= "and menu_item_uuid = '$menu_item_uuid' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach ($result as &$row) { + $menu_item_uuid = $row["menu_item_uuid"]; + $menu_item_title = $row["menu_item_title"]; + $menu_item_link = $row["menu_item_link"]; + $menu_item_category = $row["menu_item_category"]; + $menu_item_description = $row["menu_item_description"]; + $menu_item_protected = $row["menu_item_protected"]; + $menu_item_parent_uuid = $row["menu_item_parent_uuid"]; + $menu_item_order = $row["menu_item_order"]; + $menu_item_add_user = $row["menu_item_add_user"]; + $menu_item_add_date = $row["menu_item_add_date"]; + //$menu_item_del_user = $row["menu_item_del_user"]; + //$menu_item_del_date = $row["menu_item_del_date"]; + $menu_item_mod_user = $row["menu_item_mod_user"]; + $menu_item_mod_date = $row["menu_item_mod_date"]; + break; //limit to 1 row + } + } + +//show the content + require_once "includes/header.php"; + echo "
"; + echo "\n"; + echo "\n"; + echo " "; + echo " "; + echo "
\n"; + echo "
"; + + echo "
"; + echo ""; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + + echo " "; + echo " "; + echo " "; + echo " "; + + echo " "; + echo " "; + echo " "; + echo " "; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + if ($action == "update") { + echo " "; + echo " "; + echo " "; + echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + //echo " "; + } + + echo " "; + echo " "; + echo " "; + echo " "; + + if (permission_exists('menu_add') || permission_exists('menu_edit')) { + echo " \n"; + echo " "; + echo " "; + } + echo "
Menu Item Edit

Title:
Link:
Category:"; + echo " "; + echo "
Parent Menu:"; + $sql = "SELECT * FROM v_menu_items "; + $sql .= "where menu_uuid = '$menu_uuid' "; + $sql .= "order by menu_item_title asc "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + echo ""; + unset($sql, $result); + echo "
Groups:"; + + echo "\n"; + $sql = "SELECT * FROM v_menu_item_groups "; + $sql .= "where menu_uuid=:menu_uuid "; + $sql .= "and menu_item_uuid=:menu_item_uuid "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->bindParam(':menu_uuid', $menu_uuid); + $prep_statement->bindParam(':menu_item_uuid', $menu_item_uuid); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + $result_count = count($result); + foreach($result as $field) { + if (strlen($field['group_name']) > 0) { + echo "\n"; + echo " \n"; + echo " \n"; + echo "\n"; + } + } + echo "
".$field['group_name']."\n"; + if (permission_exists('group_member_delete') || if_group("superadmin")) { + echo " $v_link_label_delete\n"; + } + echo "
\n"; + + echo "
\n"; + $sql = "SELECT * FROM v_groups "; + $sql .= "where domain_uuid = '".$domain_uuid."' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + echo ""; + echo "\n"; + unset($sql, $result); + echo "
\n"; + echo " Protected:\n"; + echo "\n"; + echo "
\n"; + echo "Protect this item in the menu so that is is not removed by 'Restore Default.'
\n"; + echo "\n"; + echo "
Menu Order:
Added By:$menu_item_add_user  
Add Date:$menu_item_add_date  
menu_item_del_user:
menu_item_del_date:
Modified By:$menu_item_mod_user  
Modified Date:$menu_item_mod_date  
Description:
\n"; + echo " "; + echo " "; + echo " \n"; + echo " "; + echo " "; + echo "
"; + echo " "; + if ($action == "update") { + echo " "; + } + echo " "; + echo " "; + echo " \n"; + echo "
"; + echo "
"; + echo "
"; + + echo "
"; + echo "
"; + +//include the footer + require_once "includes/footer.php"; +?> \ No newline at end of file diff --git a/core/menu/menu_item_list.php b/core/menu/menu_item_list.php new file mode 100644 index 0000000000..06f13ef936 --- /dev/null +++ b/core/menu/menu_item_list.php @@ -0,0 +1,371 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('menu_add') || permission_exists('menu_edit')) { + //access granted +} +else { + echo "access denied"; + return; +} + +$tmp_menu_item_order = 0; + +function build_db_child_menu_list ($db, $menu_item_level, $menu_item_uuid, $c) { + global $menu_uuid, $tmp_menu_item_order, $v_link_label_edit, $v_link_label_delete; + + //check for sub menus + $menu_item_level = $menu_item_level+1; + $sql = "select * from v_menu_items "; + $sql .= "where menu_uuid = '".$menu_uuid."' "; + $sql .= "and menu_item_parent_uuid = '".$menu_item_uuid."' "; + $sql .= "order by menu_item_order, menu_item_title asc "; + $prep_statement_2 = $db->prepare($sql); + $prep_statement_2->execute(); + $result2 = $prep_statement_2->fetchAll(PDO::FETCH_NAMED); + + $row_style["0"] = "row_style1"; + $row_style["1"] = "row_style1"; + + if (count($result2) > 0) { + if ($c == 0) { $c2 = 1; } else { $c2 = 0; } + foreach($result2 as $row2) { + //set the db values as php variables + $menu_item_uuid = $row2['menu_item_uuid']; + $menu_item_category = $row2['menu_item_category']; + $menu_item_protected = $row2['menu_item_protected']; + $menu_item_parent_uuid = $row2['menu_item_parent_uuid']; + $menu_item_order = $row2['menu_item_order']; + $menu_item_language = $row2['menu_item_language']; + $menu_item_title = $row2[menu_item_title]; + $menu_item_link = $row2[menu_item_link]; + //get the groups that have been assigned to the menu + $sql = ""; + $sql .= "select group_name from v_menu_item_groups "; + $sql .= "where menu_uuid = '$menu_uuid' "; + $sql .= "and menu_item_uuid = '".$menu_item_uuid."' "; + $sub_prep_statement = $db->prepare(check_sql($sql)); + $sub_prep_statement->execute(); + $sub_result = $sub_prep_statement->fetchAll(PDO::FETCH_NAMED); + $group_list = ""; + $x = 0; + foreach ($sub_result as &$sub_row) { + if ($x == 0) { + $group_list = $sub_row["group_name"]; + } + else { + $group_list .= ", ".$sub_row["group_name"]; + } + $x++; + } + unset ($sub_prep_statement); + //display the main body of the list + switch ($menu_item_category) { + case "internal": + $menu_item_title = "$menu_item_title"; + break; + case "external": + if (substr($menu_item_link, 0,1) == "/") { + $menu_item_link = PROJECT_PATH . $menu_item_link; + } + $menu_item_title = "$menu_item_title"; + break; + case "email": + $menu_item_title = "$menu_item_title"; + break; + } + + //display the content of the list + echo "\n"; + echo "
"; + echo " "; + echo " "; + echo " "; + echo " "; + echo "
"; + $i=0; + while($i < $menu_item_level){ + echo "         "; + $i++; + } + echo " ".$menu_item_title." "; + + echo "
"; + echo "
 ".$menu_item_link."  ".$group_list."  ".$menu_item_category." ".$row[menu_item_description]." ".$row[menu_item_order]."   yes    no  "; + echo "  "; + //echo " ".$row2[menu_item_order]." "; + echo ""; + //if (permission_exists('menu_edit')) { + // echo " "; + // echo " "; + //} + //echo "\n"; + if (permission_exists('menu_edit')) { + echo " $v_link_label_edit\n"; + } + if (permission_exists('menu_delete')) { + echo " $v_link_label_delete\n"; + } + echo "
\n"; + + echo "\n"; + echo " \n"; + echo "\n"; + echo "
\n"; + + echo ""; + //echo ""; + echo "\n"; + echo "\n"; + echo "
Menu Manager\n"; + //if (permission_exists('menu_restore')) { + // echo " "; + //} + echo "
"; + + $sql = "select * from v_menu_items "; + $sql .= "where menu_uuid = '".$menu_uuid."' "; + $sql .= "and menu_item_parent_uuid is null "; + if (strlen($order_by)> 0) { + $sql .= "order by $order_by $order "; + } + else { + $sql .= "order by menu_item_order asc "; + } + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + $result_count = count($result); + + $c = 0; + $row_style["0"] = "row_style0"; + $row_style["1"] = "row_style0"; + + echo "
\n"; + echo "\n"; + + if ($result_count == 0) { + //no results + echo ""; + } + else { + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + //echo ""; + echo ""; + echo "\n"; + echo ""; + + foreach($result as $row) { + //set the db values as php variables + $menu_item_uuid = $row['menu_item_uuid']; + $menu_item_category = $row['menu_item_category']; + $menu_item_title = $row['menu_item_title']; + $menu_item_link = $row['menu_item_link']; + $menu_item_protected = $row['menu_item_protected']; + + //get the groups that have been assigned to the menu + $sql = ""; + $sql .= "select group_name from v_menu_item_groups "; + $sql .= "where menu_uuid = '$menu_uuid' "; + $sql .= "and menu_item_uuid = '$menu_item_uuid' "; + $sub_prep_statement = $db->prepare(check_sql($sql)); + $sub_prep_statement->execute(); + $sub_result = $sub_prep_statement->fetchAll(PDO::FETCH_NAMED); + $group_list = ""; + $x = 0; + foreach ($sub_result as &$sub_row) { + if ($x == 0) { + $group_list = $sub_row["group_name"]; + } + else { + $group_list .= ", ".$sub_row["group_name"]; + } + $x++; + } + unset ($sub_prep_statement); + + //add the type link based on the typd of the menu + switch ($menu_item_category) { + case "internal": + $menu_item_title = "$menu_item_title"; + break; + case "external": + if (substr($menu_item_link, 0,1) == "/") { + $menu_item_link = PROJECT_PATH . $menu_item_link; + } + $menu_item_title = "$menu_item_title"; + break; + case "email": + $menu_item_title = "$menu_item_title"; + break; + } + + //display the content of the list + echo "\n"; + echo ""; + echo ""; + //echo ""; + echo ""; + //echo ""; + //echo ""; + //echo ""; + + if ($menu_item_protected == "true") { + echo ""; + } + else { + echo ""; + } + + echo ""; + + //echo ""; + + echo " \n"; + echo ""; + + //update the menu order + if ($row[menu_item_order] != $tmp_menu_item_order) { + $sql = "update v_menu_items set "; + $sql .= "menu_item_title = '".$row['menu_item_title']."', "; + $sql .= "menu_item_order = '".$tmp_menu_item_order."' "; + $sql .= "where menu_uuid = '".$menu_uuid."' "; + $sql .= "and menu_item_uuid = '".$row[menu_item_uuid]."' "; + //$db->exec(check_sql($sql)); + } + $tmp_menu_item_order++; + + //check for sub menus + $menu_item_level = 0; + if (strlen($row['menu_item_uuid']) > 0) { + $c = build_db_child_menu_list($db, $menu_item_level, $row['menu_item_uuid'], $c); + } + + if ($c==0) { $c=1; } else { $c=0; } + } //end foreach + unset($sql, $result, $row_count); + + } //end if results + + echo "\n"; + echo "\n"; + echo "\n"; + echo "
 
  Title     Groups     Category     Protected     Order  Order   \n"; + if (permission_exists('menu_add')) { + echo " $v_link_label_add\n"; + } + echo "
  ".$menu_item_title."   ".$group_list."  ".$menu_item_link."  ".$menu_item_category." ".$row[menu_item_description]." ".$row['menu_item_parent_uuid']."  ".$row['menu_item_order']."   yes    no  "; + echo " ".$row[menu_item_order]." "; + echo ""; + //if (permission_exists('menu_edit')) { + // echo " "; + // echo " "; + //} + //echo "\n"; + if (permission_exists('menu_edit')) { + echo " $v_link_label_edit\n"; + } + if (permission_exists('menu_delete')) { + echo " $v_link_label_delete\n"; + } + echo "
\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "
  \n"; + if (permission_exists('menu_add')) { + echo " $v_link_label_add\n"; + } + echo "
\n"; + + echo "
\n"; + echo "
\n"; + echo "

"; + + echo "
\n"; + echo "
"; + + echo "

"; + require_once "includes/footer.php"; + +?> \ No newline at end of file diff --git a/core/menu/menu_item_move_down.php b/core/menu/menu_item_move_down.php new file mode 100644 index 0000000000..22cb10f07e --- /dev/null +++ b/core/menu/menu_item_move_down.php @@ -0,0 +1,88 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('menu_edit')) { + //access granted +} +else { + echo "access denied"; + return; +} + +//move down more than one level at a time +//update v_menu_items set menu_item_order = (menu_item_order+1) where menu_item_order > 2 or menu_item_order = 2 + +if (count($_GET)>0) { + $menu_item_id = check_str($_GET["menu_item_id"]); + $menu_item_order = check_str($_GET["menu_item_order"]); + $menu_parent_guid = check_str($_GET["menu_parent_guid"]); + + $sql = "SELECT menu_item_order FROM v_menu_items "; + $sql .= "where domain_uuid = '".$domain_uuid."' "; + $sql .= "order by menu_item_order desc "; + $sql .= "limit 1 "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach ($result as &$row) { + $highestmenu_item_order = $row[menu_item_order]; + } + unset($prep_statement); + + if ($menu_item_order != $highestmenu_item_order) { + //clear the menu session so it will rebuild with the update + $_SESSION["menu"] = ""; + + //move the current item's order number up + $sql = "update v_menu_items set "; + $sql .= "menu_item_order = (menu_item_order-1) "; //move down + $sql .= "where domain_uuid = '".$domain_uuid."' "; + $sql .= "and menu_item_order = ".($menu_item_order+1)." "; + $db->exec(check_sql($sql)); + unset($sql); + + //move the selected item's order number down + $sql = "update v_menu_items set "; + $sql .= "menu_item_order = (menu_item_order+1) "; //move up + $sql .= "where domain_uuid = '".$domain_uuid."' "; + $sql .= "and menu_item_id = '$menu_item_id' "; + $db->exec(check_sql($sql)); + unset($sql); + } + + //redirect the user + require_once "includes/header.php"; + echo "\n"; + echo "
"; + echo "Item Moved Down"; + echo "
"; + require_once "includes/footer.php"; + return; +} + +?> \ No newline at end of file diff --git a/core/menu/menu_item_move_up.php b/core/menu/menu_item_move_up.php new file mode 100644 index 0000000000..b645f38209 --- /dev/null +++ b/core/menu/menu_item_move_up.php @@ -0,0 +1,75 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('menu_edit')) { + //access granted +} +else { + echo "access denied"; + return; +} + +//move down more than one level at a time +//update v_menu_items set menu_order = (menu_order+1) where menu_order > 2 or menu_order = 2 + +if (count($_GET)>0) { + $menu_item_id = check_str($_GET["menu_item_id"]); + $menu_order = check_str($_GET["menu_order"]); + + if ($menu_order != 1) { + //clear the menu session so it will rebuild with the update + $_SESSION["menu"] = ""; + + //move the current item's order number down + $sql = "update v_menu_items set "; + $sql .= "menu_order = (menu_order+1) "; //move down + $sql .= "where domain_uuid = '".$domain_uuid."' "; + $sql .= "and menu_order = ".($menu_order-1)." "; + $db->exec(check_sql($sql)); + unset($sql); + + //move the selected item's order number up + $sql = "update v_menu_items set "; + $sql .= "menu_order = (menu_order-1) "; //move up + $sql .= "where domain_uuid = '".$domain_uuid."' "; + $sql .= "and menu_item_id = '$menu_item_id' "; + $db->exec(check_sql($sql)); + unset($sql); + } + + //redirect the user + require_once "includes/header.php"; + echo "\n"; + echo "
"; + echo "Item Moved Up"; + echo "
"; + require_once "includes/footer.php"; + return; +} + +?> \ No newline at end of file diff --git a/core/menu/menu_restore_default.php b/core/menu/menu_restore_default.php new file mode 100644 index 0000000000..0f9f529614 --- /dev/null +++ b/core/menu/menu_restore_default.php @@ -0,0 +1,63 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('menu_restore')) { + //access granted +} +else { + echo "access denied"; + return; +} + +//get the http value and set as a php variable + $menu_uuid = check_str($_REQUEST["menu_uuid"]); + +//menu restore default + require_once "includes/classes/menu.php"; + $menu = new menu; + $menu->db = $db; + $menu->menu_uuid = $menu_uuid; + $menu->delete(); + $menu->restore(); + +//unset the menu session variable + $_SESSION["menu"] = ""; + +//unset the default template + $_SESSION["template_content"] = ''; + +//show a message to the user + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Restore Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + +?> diff --git a/core/menu/root.php b/core/menu/root.php new file mode 100644 index 0000000000..7b882438ea --- /dev/null +++ b/core/menu/root.php @@ -0,0 +1,50 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ + +// make sure the PATH_SEPARATOR is defined + if (!defined("PATH_SEPARATOR")) { + if ( strpos( $_ENV[ "OS" ], "Win" ) !== false ) { define("PATH_SEPARATOR", ";"); } else { define("PATH_SEPARATOR", ":"); } + } + +// make sure the document_root is set + $_SERVER["SCRIPT_FILENAME"] = str_replace("\\", "/", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = str_replace($_SERVER["PHP_SELF"], "", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = realpath($_SERVER["DOCUMENT_ROOT"]); + //echo "DOCUMENT_ROOT: ".$_SERVER["DOCUMENT_ROOT"]."
\n"; + //echo "PHP_SELF: ".$_SERVER["PHP_SELF"]."
\n"; + //echo "SCRIPT_FILENAME: ".$_SERVER["SCRIPT_FILENAME"]."
\n"; + +// if the project directory exists then add it to the include path otherwise add the document root to the include path + if (is_dir($_SERVER["DOCUMENT_ROOT"].'/fusionpbx')){ + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', '/fusionpbx'); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER["DOCUMENT_ROOT"].'/fusionpbx' ); + } + else { + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', ''); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER['DOCUMENT_ROOT'] ); + } + +?> \ No newline at end of file diff --git a/core/servers/app_config.php b/core/servers/app_config.php new file mode 100644 index 0000000000..769adfeec2 --- /dev/null +++ b/core/servers/app_config.php @@ -0,0 +1,98 @@ + \ No newline at end of file diff --git a/core/servers/root.php b/core/servers/root.php new file mode 100644 index 0000000000..7b882438ea --- /dev/null +++ b/core/servers/root.php @@ -0,0 +1,50 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ + +// make sure the PATH_SEPARATOR is defined + if (!defined("PATH_SEPARATOR")) { + if ( strpos( $_ENV[ "OS" ], "Win" ) !== false ) { define("PATH_SEPARATOR", ";"); } else { define("PATH_SEPARATOR", ":"); } + } + +// make sure the document_root is set + $_SERVER["SCRIPT_FILENAME"] = str_replace("\\", "/", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = str_replace($_SERVER["PHP_SELF"], "", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = realpath($_SERVER["DOCUMENT_ROOT"]); + //echo "DOCUMENT_ROOT: ".$_SERVER["DOCUMENT_ROOT"]."
\n"; + //echo "PHP_SELF: ".$_SERVER["PHP_SELF"]."
\n"; + //echo "SCRIPT_FILENAME: ".$_SERVER["SCRIPT_FILENAME"]."
\n"; + +// if the project directory exists then add it to the include path otherwise add the document root to the include path + if (is_dir($_SERVER["DOCUMENT_ROOT"].'/fusionpbx')){ + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', '/fusionpbx'); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER["DOCUMENT_ROOT"].'/fusionpbx' ); + } + else { + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', ''); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER['DOCUMENT_ROOT'] ); + } + +?> \ No newline at end of file diff --git a/core/servers/v_server_settings.php b/core/servers/v_server_settings.php new file mode 100644 index 0000000000..d78f4db2f8 --- /dev/null +++ b/core/servers/v_server_settings.php @@ -0,0 +1,161 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require_once "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (if_group("admin") || if_group("superadmin")) { + //access granted +} +else { + echo "access denied"; + exit; +} +require_once "includes/header.php"; +require_once "includes/paging.php"; + +//get variables used to control the order + $order_by = $_GET["order_by"]; + $order = $_GET["order"]; + +//show the content + echo "
"; + echo "\n"; + echo "\n"; + echo " "; + echo ""; + echo "
\n"; + echo "
"; + + echo "\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "
Server Setting List 
\n"; + echo " Server settings are assigned to Domains.

\n"; + echo "
\n"; + + //prepare to page the results + $sql = ""; + $sql .= " select count(*) as num_rows from v_server_settings "; + $sql .= " where domain_uuid = '$domain_uuid' "; + $sql .= " and server_uuid = '$server_uuid' "; + if (strlen($order_by)> 0) { $sql .= "order by $order_by $order "; } + $prep_statement = $db->prepare($sql); + if ($prep_statement) { + $prep_statement->execute(); + $row = $prep_statement->fetch(PDO::FETCH_ASSOC); + if ($row['num_rows'] > 0) { + $num_rows = $row['num_rows']; + } + else { + $num_rows = '0'; + } + } + + //prepare to page the results + $rows_per_page = 100; + $param = ""; + $page = $_GET['page']; + if (strlen($page) == 0) { $page = 0; $_GET['page'] = 0; } + list($paging_controls, $rows_per_page, $var3) = paging($num_rows, $param, $rows_per_page); + $offset = $rows_per_page * $page; + + //get the server list + $sql = ""; + $sql .= " select * from v_server_settings "; + $sql .= " where domain_uuid = '$domain_uuid' "; + $sql .= " and server_uuid = '$server_uuid' "; + if (strlen($order_by)> 0) { $sql .= "order by $order_by $order "; } + $sql .= " limit $rows_per_page offset $offset "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + $result_count = count($result); + unset ($prep_statement, $sql); + + $c = 0; + $row_style["0"] = "row_style0"; + $row_style["1"] = "row_style1"; + + echo "
\n"; + echo "\n"; + + echo "\n"; + echo th_order_by('server_setting_category', 'Category', $order_by, $order); + echo th_order_by('server_setting_name', 'Name', $order_by, $order); + echo th_order_by('server_setting_value', 'Value', $order_by, $order); + echo "\n"; + echo "\n"; + + if ($result_count > 0) { + foreach($result as $row) { + echo "\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "\n"; + if ($c==0) { $c=1; } else { $c=0; } + } //end foreach + unset($sql, $result, $row_count); + } //end if results + + + echo "\n"; + echo "\n"; + echo "\n"; + + echo "
\n"; + echo " $v_link_label_add\n"; + echo "
".$row['server_setting_category']." ".$row['server_setting_name']." ".$row['server_setting_value']." \n"; + echo " $v_link_label_edit\n"; + echo " $v_link_label_delete\n"; + echo "
\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "
 $paging_controls\n"; + echo " $v_link_label_add\n"; + echo "
\n"; + echo "
"; + echo "
"; + echo "

"; + echo "

"; + + echo "
"; + echo "
"; + echo "

"; + +//include the footer + require_once "includes/footer.php"; +?> \ No newline at end of file diff --git a/core/servers/v_server_settings_delete.php b/core/servers/v_server_settings_delete.php new file mode 100644 index 0000000000..7396ff13b0 --- /dev/null +++ b/core/servers/v_server_settings_delete.php @@ -0,0 +1,60 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require_once "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (if_group("admin") || if_group("superadmin")) { + //access granted +} +else { + echo "access denied"; + exit; +} + +if (count($_GET)>0) { + $id = check_str($_GET["id"]); + $server_uuid = check_str($_GET["server_uuid"]); +} + +if (strlen($id)>0) { + $sql = ""; + $sql .= "delete from v_server_settings "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and server_setting_uuid = '$id' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + unset($sql); +} + +require_once "includes/header.php"; +echo "\n"; +echo "
\n"; +echo "Delete Complete\n"; +echo "
\n"; +require_once "includes/footer.php"; +return; + +?> \ No newline at end of file diff --git a/core/servers/v_server_settings_edit.php b/core/servers/v_server_settings_edit.php new file mode 100644 index 0000000000..c89903b331 --- /dev/null +++ b/core/servers/v_server_settings_edit.php @@ -0,0 +1,244 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require_once "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (if_group("admin") || if_group("superadmin")) { + //access granted +} +else { + echo "access denied"; + exit; +} + +//action add or update + if (isset($_REQUEST["id"])) { + $action = "update"; + $server_setting_uuid = check_str($_REQUEST["id"]); + } + else { + $action = "add"; + } + +if (strlen($_GET["server_uuid"]) > 0) { + $server_uuid = check_str($_GET["server_uuid"]); +} + +//get http post variables and set them to php variables + if (count($_POST)>0) { + $server_uuid = check_str($_POST["server_uuid"]); + $server_setting_category = check_str($_POST["server_setting_category"]); + $server_setting_value = check_str($_POST["server_setting_value"]); + $server_setting_name = check_str($_POST["server_setting_name"]); + } + +if (count($_POST)>0 && strlen($_POST["persistformvar"]) == 0) { + + $msg = ''; + if ($action == "update") { + $server_setting_uuid = check_str($_POST["server_setting_uuid"]); + } + + //check for all required data + //if (strlen($server_uuid) == 0) { $msg .= "Please provide: server_uuid
\n"; } + //if (strlen($domain_uuid) == 0) { $msg .= "Please provide: domain_uuid
\n"; } + //if (strlen($server_setting_category) == 0) { $msg .= "Please provide: Category
\n"; } + //if (strlen($server_setting_value) == 0) { $msg .= "Please provide: Value
\n"; } + //if (strlen($server_setting_name) == 0) { $msg .= "Please provide: Name
\n"; } + if (strlen($msg) > 0 && strlen($_POST["persistformvar"]) == 0) { + require_once "includes/header.php"; + require_once "includes/persistformvar.php"; + echo "
\n"; + echo "
\n"; + echo $msg."
"; + echo "
\n"; + persistformvar($_POST); + echo "
\n"; + require_once "includes/footer.php"; + return; + } + + //add or update the database + if ($_POST["persistformvar"] != "true") { + if ($action == "add") { + $sql = "insert into v_server_settings "; + $sql .= "("; + $sql .= "domain_uuid, "; + $sql .= "server_uuid, "; + $sql .= "server_uuid, "; + $sql .= "domain_uuid, "; + $sql .= "server_setting_category, "; + $sql .= "server_setting_value, "; + $sql .= "server_setting_name "; + $sql .= ")"; + $sql .= "values "; + $sql .= "("; + $sql .= "'$domain_uuid', "; + $sql .= "'$server_uuid', "; + $sql .= "'$server_uuid', "; + $sql .= "'$domain_uuid', "; + $sql .= "'$server_setting_category', "; + $sql .= "'$server_setting_value', "; + $sql .= "'$server_setting_name' "; + $sql .= ")"; + $db->exec(check_sql($sql)); + unset($sql); + + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Add Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + } //if ($action == "add") + + if ($action == "update") { + $sql = "update v_server_settings set "; + $sql .= "server_uuid = '$server_uuid', "; + $sql .= "server_uuid = '$server_uuid', "; + $sql .= "domain_uuid = '$domain_uuid', "; + $sql .= "server_setting_category = '$server_setting_category', "; + $sql .= "server_setting_value = '$server_setting_value', "; + $sql .= "server_setting_name = '$server_setting_name' "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and server_setting_uuid = '$server_setting_uuid'"; + $db->exec(check_sql($sql)); + unset($sql); + + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Update Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + } //if ($action == "update") + } //if ($_POST["persistformvar"] != "true") +} //(count($_POST)>0 && strlen($_POST["persistformvar"]) == 0) + +//pre-populate the form + if (count($_GET)>0 && $_POST["persistformvar"] != "true") { + $server_setting_uuid = $_GET["id"]; + $sql = ""; + $sql .= "select * from v_server_settings "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and server_setting_uuid = '$server_setting_uuid' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach ($result as &$row) { + $server_uuid = $row["server_uuid"]; + $server_setting_category = $row["server_setting_category"]; + $server_setting_value = $row["server_setting_value"]; + $server_setting_name = $row["server_setting_name"]; + break; //limit to 1 row + } + unset ($prep_statement); + } + +//show the header + require_once "includes/header.php"; + +//show the content + echo "
"; + echo "\n"; + + echo "\n"; + echo " "; + echo " "; + echo "
\n"; + echo "
"; + + echo "
\n"; + echo "
\n"; + echo "\n"; + echo "\n"; + if ($action == "add") { + echo "\n"; + } + if ($action == "update") { + echo "\n"; + } + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo " \n"; + echo " \n"; + echo " "; + echo "
Server Setting AddServer Setting Edit
\n"; + echo "Server settings are assigned to Domains.

\n"; + echo "
\n"; + echo " Category:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the category.\n"; + echo "
\n"; + echo " Name:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the name.\n"; + echo "
\n"; + echo " Value:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the value.\n"; + echo "
\n"; + echo " \n"; + if ($action == "update") { + echo " \n"; + } + echo " \n"; + echo "
"; + echo ""; + + echo "
"; + echo "
"; + +//include the footer + require_once "includes/footer.php"; +?> \ No newline at end of file diff --git a/core/servers/v_servers.php b/core/servers/v_servers.php new file mode 100644 index 0000000000..d968c18fdc --- /dev/null +++ b/core/servers/v_servers.php @@ -0,0 +1,158 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require_once "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (if_group("admin") || if_group("superadmin")) { + //access granted +} +else { + echo "access denied"; + exit; +} +require_once "includes/header.php"; +require_once "includes/paging.php"; + +//get variables used to control the order + $order_by = $_GET["order_by"]; + $order = $_GET["order"]; + +//show the content + echo "
"; + echo "\n"; + echo "\n"; + echo " "; + echo ""; + echo "
\n"; + echo "
"; + + echo "\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "
Servers 
\n"; + echo " Servers Settings

\n"; + echo "
\n"; + + //prepare to page the results + $sql = ""; + $sql .= " select count(*) as num_rows from v_servers "; + $sql .= " where domain_uuid = '$domain_uuid' "; + if (strlen($order_by)> 0) { $sql .= "order by $order_by $order "; } + $prep_statement = $db->prepare($sql); + if ($prep_statement) { + $prep_statement->execute(); + $row = $prep_statement->fetch(PDO::FETCH_ASSOC); + if ($row['num_rows'] > 0) { + $num_rows = $row['num_rows']; + } + else { + $num_rows = '0'; + } + } + + //prepare to page the results + $rows_per_page = 10; + $param = ""; + $page = $_GET['page']; + if (strlen($page) == 0) { $page = 0; $_GET['page'] = 0; } + list($paging_controls, $rows_per_page, $var3) = paging($num_rows, $param, $rows_per_page); + $offset = $rows_per_page * $page; + + //get the list + $sql = ""; + $sql .= " select * from v_servers "; + $sql .= " where domain_uuid = '$domain_uuid' "; + if (strlen($order_by)> 0) { $sql .= "order by $order_by $order "; } + $sql .= " limit $rows_per_page offset $offset "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + $result_count = count($result); + unset ($prep_statement, $sql); + + $c = 0; + $row_style["0"] = "row_style0"; + $row_style["1"] = "row_style1"; + + echo "
\n"; + echo "\n"; + + echo "\n"; + echo th_order_by('server_name', 'Server Name', $order_by, $order); + echo th_order_by('server_description', 'Description', $order_by, $order); + echo "\n"; + echo "\n"; + + if ($result_count > 0) { + foreach($result as $row) { + //print_r( $row ); + echo "\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "\n"; + if ($c==0) { $c=1; } else { $c=0; } + } //end foreach + unset($sql, $result, $row_count); + } //end if results + + + echo "\n"; + echo "\n"; + echo "\n"; + + echo "
\n"; + echo " $v_link_label_add\n"; + echo "
".$row['server_name']." ".$row['server_description']." \n"; + echo " $v_link_label_edit\n"; + echo " $v_link_label_delete\n"; + echo "
\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "
 $paging_controls\n"; + echo " $v_link_label_add\n"; + echo "
\n"; + echo "
"; + echo "
"; + echo "

"; + echo "

"; + + echo "
"; + echo "
"; + echo "

"; + +//include the footer + require_once "includes/footer.php"; +?> \ No newline at end of file diff --git a/core/servers/v_servers_delete.php b/core/servers/v_servers_delete.php new file mode 100644 index 0000000000..8a6b69ee1f --- /dev/null +++ b/core/servers/v_servers_delete.php @@ -0,0 +1,59 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require_once "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (if_group("admin") || if_group("superadmin")) { + //access granted +} +else { + echo "access denied"; + exit; +} + +if (count($_GET)>0) { + $id = check_str($_GET["id"]); +} + +if (strlen($id)>0) { + $sql = ""; + $sql .= "delete from v_servers "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and server_uuid = '$id' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + unset($sql); +} + +require_once "includes/header.php"; +echo "\n"; +echo "
\n"; +echo "Delete Complete\n"; +echo "
\n"; +require_once "includes/footer.php"; +return; + +?> \ No newline at end of file diff --git a/core/servers/v_servers_edit.php b/core/servers/v_servers_edit.php new file mode 100644 index 0000000000..85fd3db499 --- /dev/null +++ b/core/servers/v_servers_edit.php @@ -0,0 +1,212 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require_once "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (if_group("admin") || if_group("superadmin")) { + //access granted +} +else { + echo "access denied"; + exit; +} + +//action add or update + if (isset($_REQUEST["id"])) { + $action = "update"; + $server_uuid = check_str($_REQUEST["id"]); + } + else { + $action = "add"; + } + +//get http post variables and set them to php variables + if (count($_POST)>0) { + $server_name = check_str($_POST["server_name"]); + $server_description = check_str($_POST["server_description"]); + } + +if (count($_POST)>0 && strlen($_POST["persistformvar"]) == 0) { + + $msg = ''; + if ($action == "update") { + $server_uuid = check_str($_POST["server_uuid"]); + } + + //check for all required data + //if (strlen($server_name) == 0) { $msg .= "Please provide: Server Name
\n"; } + //if (strlen($server_description) == 0) { $msg .= "Please provide: Description
\n"; } + if (strlen($msg) > 0 && strlen($_POST["persistformvar"]) == 0) { + require_once "includes/header.php"; + require_once "includes/persistformvar.php"; + echo "
\n"; + echo "
\n"; + echo $msg."
"; + echo "
\n"; + persistformvar($_POST); + echo "
\n"; + require_once "includes/footer.php"; + return; + } + + //add or update the database + if ($_POST["persistformvar"] != "true") { + if ($action == "add") { + $sql = "insert into v_servers "; + $sql .= "("; + $sql .= "domain_uuid, "; + $sql .= "server_name, "; + $sql .= "server_description "; + $sql .= ")"; + $sql .= "values "; + $sql .= "("; + $sql .= "'$domain_uuid', "; + $sql .= "'$server_name', "; + $sql .= "'$server_description' "; + $sql .= ")"; + $db->exec(check_sql($sql)); + unset($sql); + + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Add Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + } //if ($action == "add") + + if ($action == "update") { + $sql = "update v_servers set "; + $sql .= "server_name = '$server_name', "; + $sql .= "server_description = '$server_description' "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and server_uuid = '$server_uuid'"; + $db->exec(check_sql($sql)); + unset($sql); + + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Update Complete\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; + } //if ($action == "update") + } //if ($_POST["persistformvar"] != "true") +} //(count($_POST)>0 && strlen($_POST["persistformvar"]) == 0) + +//pre-populate the form + if (count($_GET)>0 && $_POST["persistformvar"] != "true") { + $server_uuid = $_GET["id"]; + $sql = ""; + $sql .= "select * from v_servers "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and server_uuid = '$server_uuid' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach ($result as &$row) { + $server_name = $row["server_name"]; + $server_description = $row["server_description"]; + break; //limit to 1 row + } + unset ($prep_statement); + } + +//show the header + require_once "includes/header.php"; + +//show the content + echo "
"; + echo "\n"; + + echo "\n"; + echo " "; + echo " "; + echo "
\n"; + echo "
"; + + echo "
\n"; + echo "
\n"; + echo "\n"; + echo "\n"; + if ($action == "add") { + echo "\n"; + } + if ($action == "update") { + echo "\n"; + } + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo " \n"; + echo " \n"; + echo " "; + echo "
Server AddServer Edit
\n"; + echo "Servers Settings

\n"; + echo "
\n"; + echo " Server Name:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the name.\n"; + echo "
\n"; + echo " Description:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Enter the description.\n"; + echo "
\n"; + if ($action == "update") { + echo " \n"; + } + echo " \n"; + echo "
"; + echo ""; + + if ($action == "update") { + require "v_server_settings.php"; + } + + echo "
"; + echo "
"; + +//include the footer + require_once "includes/footer.php"; +?> \ No newline at end of file diff --git a/core/upgrade/app_config.php b/core/upgrade/app_config.php new file mode 100644 index 0000000000..0e83ad3d90 --- /dev/null +++ b/core/upgrade/app_config.php @@ -0,0 +1,71 @@ + \ No newline at end of file diff --git a/core/upgrade/app_defaults.php b/core/upgrade/app_defaults.php new file mode 100644 index 0000000000..04559932e8 --- /dev/null +++ b/core/upgrade/app_defaults.php @@ -0,0 +1,132 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ + +if (strlen($_SESSION['switch']['scripts']['dir']) > 0) { + + //if the resource scripts resource directory does not exist then create it + if (!is_dir($_SESSION['switch']['scripts']['dir']."/resources")) { mkdir($_SESSION['switch']['scripts']['dir']."/resources",0755,true); } + + //get odbc information + $sql = "select count(*) as num_rows from v_databases "; + $sql .= "where database_type = 'odbc' "; + if (strlen($order_by)> 0) { $sql .= "order by $order_by $order "; } + $prep_statement = $db->prepare($sql); + if ($prep_statement) { + $prep_statement->execute(); + $row = $prep_statement->fetch(PDO::FETCH_ASSOC); + if ($row['num_rows'] > 0) { + $odbc_num_rows = $row['num_rows']; + + $sql = "select * from v_databases "; + $sql .= "where database_type = 'odbc' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach ($result as &$row) { + $dsn_name = $row["database_name"]; + $dsn_username = $row["database_username"]; + $dsn_password = $row["database_password"]; + break; //limit to 1 row + } + unset ($prep_statement); + } + else { + $odbc_num_rows = '0'; + } + } + + //config.lua + $fout = fopen($_SESSION['switch']['scripts']['dir']."/resources/config.lua","w"); + $tmp = "\n"; + $tmp .= "--switch directories\n"; + if (strlen($_SESSION['switch']['sounds']['dir']) > 0) { + $tmp .= " sounds_dir = \"".$_SESSION['switch']['sounds']['dir']."\";\n"; + } + if (strlen($_SESSION['switch']['recordings']['dir']) > 0) { + $tmp .= " recordings_dir = \"".$_SESSION['switch']['recordings']['dir']."\";\n"; + } + $tmp .= "\n"; + $tmp .= "--database connection info\n"; + if (strlen($db_type) > 0) { + $tmp .= " db_type = \"".$db_type."\";\n"; + } + if (strlen($db_name) > 0) { + $tmp .= " db_name = \"".$db_name."\";\n"; + } + if (strlen($db_path) > 0) { + $tmp .= " db_path = \"".$db_path."\";\n"; + } + if (strlen($dsn_name) > 0) { + $tmp .= " dsn_name = \"".$dsn_name."\";\n"; + } + if (strlen($dsn_username) > 0) { + $tmp .= " dsn_username = \"".$dsn_username."\";\n"; + } + if (strlen($dsn_password) > 0) { + $tmp .= " dsn_password = \"".$dsn_password."\";\n"; + } + $tmp .= "\n"; + $tmp .= "--additional info\n"; + $tmp .= " tmp_dir = \"".$tmp_dir."\";\n"; + fwrite($fout, $tmp); + unset($tmp); + fclose($fout); + + //config.js + $fout = fopen($_SESSION['switch']['scripts']['dir']."/resources/config.js","w"); + $tmp = "\n"; + $tmp .= "//switch directories\n"; + $tmp .= " var admin_pin = \"".$row["admin_pin"]."\";\n"; + $tmp .= " var sounds_dir = \"".$_SESSION['switch']['sounds']['dir']."\";\n"; + $tmp .= " var recordings_dir = \"".$_SESSION['switch']['recordings']['dir']."\";\n"; + $tmp .= "\n"; + $tmp = "//database connection info\n"; + if (strlen($db_type) > 0) { + $tmp .= " var db_type = \"".$db_type."\";\n"; + } + if (strlen($db_name) > 0) { + $tmp .= " var db_name = \"".$db_name."\";\n"; + } + if (strlen($db_path) > 0) { + $tmp .= " var db_path = \"".$db_path."\";\n"; + } + if (strlen($dsn_name) > 0) { + $tmp .= " var dsn_name = \"".$dsn_name."\";\n"; + } + if (strlen($dsn_username) > 0) { + $tmp .= " var dsn_username = \"".$dsn_username."\";\n"; + } + if (strlen($dsn_password) > 0) { + $tmp .= " var dsn_password = \"".$dsn_password."\";\n"; + } + $tmp .= "\n"; + $tmp .= "//additional info\n"; + $tmp .= " var tmp_dir = \"".$tmp_dir."\";\n"; + fwrite($fout, $tmp); + unset($tmp); + fclose($fout); +} +?> \ No newline at end of file diff --git a/core/upgrade/root.php b/core/upgrade/root.php new file mode 100644 index 0000000000..7b882438ea --- /dev/null +++ b/core/upgrade/root.php @@ -0,0 +1,50 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ + +// make sure the PATH_SEPARATOR is defined + if (!defined("PATH_SEPARATOR")) { + if ( strpos( $_ENV[ "OS" ], "Win" ) !== false ) { define("PATH_SEPARATOR", ";"); } else { define("PATH_SEPARATOR", ":"); } + } + +// make sure the document_root is set + $_SERVER["SCRIPT_FILENAME"] = str_replace("\\", "/", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = str_replace($_SERVER["PHP_SELF"], "", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = realpath($_SERVER["DOCUMENT_ROOT"]); + //echo "DOCUMENT_ROOT: ".$_SERVER["DOCUMENT_ROOT"]."
\n"; + //echo "PHP_SELF: ".$_SERVER["PHP_SELF"]."
\n"; + //echo "SCRIPT_FILENAME: ".$_SERVER["SCRIPT_FILENAME"]."
\n"; + +// if the project directory exists then add it to the include path otherwise add the document root to the include path + if (is_dir($_SERVER["DOCUMENT_ROOT"].'/fusionpbx')){ + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', '/fusionpbx'); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER["DOCUMENT_ROOT"].'/fusionpbx' ); + } + else { + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', ''); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER['DOCUMENT_ROOT'] ); + } + +?> \ No newline at end of file diff --git a/core/upgrade/upgrade.php b/core/upgrade/upgrade.php new file mode 100644 index 0000000000..8e447677ff --- /dev/null +++ b/core/upgrade/upgrade.php @@ -0,0 +1,101 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ + +//check the permission + if(defined('STDIN')) { + $document_root = str_replace("\\", "/", $_SERVER["PHP_SELF"]); + preg_match("/^(.*)\/core\/.*$/", $document_root, $matches); + $document_root = $matches[1]; + set_include_path($document_root); + require_once "includes/require.php"; + $_SERVER["DOCUMENT_ROOT"] = $document_root; + $display_type = 'text'; //html, text + } + else { + include "root.php"; + require_once "includes/require.php"; + require_once "includes/checkauth.php"; + if (permission_exists('upgrade_schema') || permission_exists('upgrade_svn') || if_group("superadmin")) { + //echo "access granted"; + } + else { + echo "access denied"; + exit; + } + } + +//set the default + if (!isset($display_results)) { + $display_results = false; + } + +//include the header + if ($display_results) { + require_once "includes/header.php"; + } + +if ($display_type == 'text') { + echo "\n"; + echo "Upgrade\n"; + echo "-----------------------------------------\n"; + echo "\n"; + echo "Database\n"; +} + +//upgrade the database schema + require_once "core/upgrade/upgrade_schema.php"; + +//show the content + if ($display_type == 'html') { + echo "
\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "
Message
Upgrade Completed
\n"; + echo "
\n"; + + echo "
\n"; + echo "
\n"; + echo "
\n"; + echo "
\n"; + echo "
\n"; + echo "
\n"; + echo "
\n"; + } + +if ($display_type == 'text') { + echo "\n"; +} + +//include the footer + if ($display_results) { + require_once "includes/footer.php"; + } +?> \ No newline at end of file diff --git a/core/upgrade/upgrade_domains.php b/core/upgrade/upgrade_domains.php new file mode 100644 index 0000000000..9897d28ec5 --- /dev/null +++ b/core/upgrade/upgrade_domains.php @@ -0,0 +1,188 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ + +//check the permission + if(defined('STDIN')) { + $document_root = str_replace("\\", "/", $_SERVER["PHP_SELF"]); + preg_match("/^(.*)\/core\/.*$/", $document_root, $matches); + $document_root = $matches[1]; + set_include_path($document_root); + require_once "includes/require.php"; + $_SERVER["DOCUMENT_ROOT"] = $document_root; + $display_type = 'text'; //html, text + } + else { + include "root.php"; + require_once "includes/require.php"; + require_once "includes/checkauth.php"; + if (permission_exists('upgrade_schema') || permission_exists('upgrade_svn') || if_group("superadmin")) { + //echo "access granted"; + } + else { + echo "access denied"; + exit; + } + } + +//copy the files and directories from includes/install + require_once "includes/classes/install.php"; + $install = new install; + $install->domain_uuid = $domain_uuid; + $install->domain_name = $domain; + $install->switch_conf_dir = $_SESSION['switch']['conf']['dir']; + $install->switch_scripts_dir = $_SESSION['switch']['scripts']['dir']; + $install->switch_sounds_dir = $_SESSION['switch']['sounds']['dir']; + $install->copy(); + //print_r($install->result); + +//get the list of installed apps from the core and mod directories + $config_list = glob($_SERVER["DOCUMENT_ROOT"] . PROJECT_PATH . "/*/*/app_config.php"); + $x=0; + foreach ($config_list as &$config_path) { + include($config_path); + $x++; + } + +//get the domain_uuid + $sql = "select * from v_domains "; + $prep_statement = $db->prepare($sql); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach($result as $row) { + if (count($result) == 0) { + $_SESSION["domain_uuid"] = $row["domain_uuid"]; + $_SESSION["domain_name"] = $row['domain_name']; + } + else { + if ($row['domain_name'] == $domain_array[0] || $row['domain_name'] == 'www.'.$domain_array[0]) { + $_SESSION["domain_uuid"] = $row["domain_uuid"]; + $_SESSION["domain_name"] = $row['domain_name']; + } + $_SESSION['domains'][$row['domain_uuid']]['domain_uuid'] = $row['domain_uuid']; + $_SESSION['domains'][$row['domain_uuid']]['domain_name'] = $row['domain_name']; + } + } + unset($result, $prep_statement); + +//get the default settings + $sql = "select * from v_default_settings "; + $sql .= "where default_setting_enabled = 'true' "; + $prep_statement = $db->prepare($sql); + $prep_statement->execute(); + $result_default_settings = $prep_statement->fetchAll(PDO::FETCH_NAMED); + +//get the default recordings directory + foreach($result_default_settings as $row) { + $name = $row['default_setting_name']; + $category = $row['default_setting_category']; + $subcategory = $row['default_setting_subcategory']; + if ($category == 'switch' && $subcategory == 'recordings' && $name == 'dir') { + $switch_recordings_dir = $row['default_setting_value']; + } + } + +//loop through all domains + $sql = "select * from v_domains "; + $v_prep_statement = $db->prepare(check_sql($sql)); + $v_prep_statement->execute(); + $main_result = $v_prep_statement->fetchAll(PDO::FETCH_ASSOC); + $domain_count = count($main_result); + foreach ($main_result as &$row) { + //get the values from database and set them as php variables + $domain_uuid = $row["domain_uuid"]; + $domain_name = $row["domain_name"]; + + //get the context + if ($domain_count == 1) { + $context = "default"; + } + else { + $context = $domain_name; + } + + //show the domain when display_type is set to text + if ($display_type == "text") { + echo "\n"; + echo $domain_name; + echo "\n"; + } + + //get the default settings - this needs to be done to reset the session values back to the defaults for each domain in the loop + foreach($result_defaults_settings as $row) { + $name = $row['default_setting_name']; + $category = $row['default_setting_category']; + $subcategory = $row['default_setting_subcategory']; + if (strlen($subcategory) == 0) { + $_SESSION[$category][$name] = $row['default_setting_value']; + } + else { + $_SESSION[$category][$subcategory][$name] = $row['default_setting_value']; + } + } + + //get the domains settings + $sql = "select * from v_domain_settings "; + $sql .= "where domain_uuid = '".$domain_uuid."' "; + $sql .= "and domain_setting_enabled = 'true' "; + $prep_statement = $db->prepare($sql); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach($result as $row) { + $name = $row['domain_setting_name']; + $category = $row['domain_setting_category']; + $subcategory = $row['domain_setting_subcategory']; + if (strlen($subcategory) == 0) { + //$$category[$name] = $row['domain_setting_value']; + $_SESSION[$category][$name] = $row['domain_setting_value']; + } + else { + //$$category[$subcategory][$name] = $row['domain_setting_value']; + $_SESSION[$category][$subcategory][$name] = $row['domain_setting_value']; + } + } + + //set the recordings directory + if (strlen($switch_recordings_dir) > 1 && count($_SESSION["domains"]) > 1) { + $_SESSION['switch']['recordings']['dir'] = $switch_recordings_dir."/".$domain_name; + } + + //get the list of installed apps from the core and mod directories and execute the php code in app_defaults.php + $default_list = glob($_SERVER["DOCUMENT_ROOT"] . PROJECT_PATH . "/*/*/app_defaults.php"); + foreach ($default_list as &$default_path) { + include($default_path); + } + // synchronize the dialplan + if (function_exists('save_dialplan_xml')) { + save_dialplan_xml(); + } + } + unset ($v_prep_statement); + +//clear the session variables + unset($_SESSION['domain']); + unset($_SESSION['switch']); + +?> \ No newline at end of file diff --git a/core/upgrade/upgrade_schema.php b/core/upgrade/upgrade_schema.php new file mode 100644 index 0000000000..c330294ab7 --- /dev/null +++ b/core/upgrade/upgrade_schema.php @@ -0,0 +1,71 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ + +//check the permission + if(defined('STDIN')) { + $document_root = str_replace("\\", "/", $_SERVER["PHP_SELF"]); + preg_match("/^(.*)\/core\/.*$/", $document_root, $matches); + $document_root = $matches[1]; + set_include_path($document_root); + require_once "includes/require.php"; + $_SERVER["DOCUMENT_ROOT"] = $document_root; + $display_type = 'text'; //html, text + } + else { + include "root.php"; + require_once "includes/require.php"; + require_once "includes/checkauth.php"; + if (permission_exists('upgrade_schema') || if_group("superadmin")) { + //echo "access granted"; + } + else { + echo "access denied"; + exit; + } + require_once "includes/header.php"; + $display_type = 'html'; //html, text + } + +//set the default + if (!isset($display_results)) { + $display_results = true; + } + +//load the default database into memory and compare it with the active database + require_once "includes/lib_schema.php"; + db_upgrade_schema ($db, $db_type, $db_name, $display_results); + unset($apps); + +//upgrade the domains + require_once "core/upgrade/upgrade_domains.php"; + +if ($display_results && $display_type == "html") { + echo "
\n"; + echo "
\n"; + require_once "includes/footer.php"; +} + +?> \ No newline at end of file diff --git a/core/upgrade/upgrade_svn.php b/core/upgrade/upgrade_svn.php new file mode 100644 index 0000000000..bde426585a --- /dev/null +++ b/core/upgrade/upgrade_svn.php @@ -0,0 +1,296 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +/* + $mtime = microtime(); + $mtime = explode(" ",$mtime); + $mtime = $mtime[1] + $mtime[0]; + $start_time = $mtime; +*/ + +include "root.php"; +require_once "includes/require.php"; +require_once "includes/phpsvnclient/phpsvnclient.php"; + +if (!isset($display_results)) { + $display_results = true; +} + +if (strlen($_SERVER['HTTP_USER_AGENT']) > 0) { + require_once "includes/checkauth.php"; + if (permission_exists('upgrade_svn') || if_group("superadmin")) { + //echo "access granted"; + } + else { + echo "access denied"; + exit; + } +} +else { + $display_results = false; //true false + //$display_type = 'csv'; //html, csv +} + +ini_set('display_errors', '0'); +ini_set(max_execution_time,3600); +clearstatcache(); + +if ($display_results) { + require_once "includes/header.php"; +} + +$svn_url = 'http://fusionpbx.googlecode.com/svn/'; +$svn_path = '/trunk/fusionpbx/'; + +//set path_array + $sql = ""; + $sql .= "select * from v_src "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach ($result as &$row) { + $path = trim($row["path"]); + $path_array[$path][type] = $row["type"]; + $path_array[$path][last_mod] = $row["last_mod"]; + } + unset ($prep_statement); + +$svn = new phpsvnclient($svn_url); +//$svn_version = $svn->getVersion(); +$svn_directory_tree = $svn->getDirectoryTree($svn_path); + +if ($display_results) { + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; +} + +//$db->beginTransaction(); +foreach ($svn_directory_tree as &$row) { + $md5_match = false; + $xml_type = $row[type]; + $xml_relative_path = trim(str_replace(trim($svn_path,'/'),"",$row[path])); + $xml_last_mod = $row[last_mod]; + $new_path = $_SERVER["DOCUMENT_ROOT"].PROJECT_PATH . $xml_relative_path; + + if (file_exists($new_path)) { + $exists = true; + } + else { + $exists = false; + } + + if ( $xml_type == 'file' ) { + $xml_file_path = trim($row[path]); //we need this to download the file from svn + $md5_xml = $row[md5]; + if ($exists) { + $md5_file = md5_file($new_path); + if ($md5_xml == $md5_file){ + $md5_match = true; + } + } + else { + $md5_match = false;//??? + $md5_file = ''; + } + } + else { + $md5_xml = '';//directory has no md5 + } + + if (strlen($xml_relative_path) > 0) { + if ($display_results) { + if ($xml_type == 'file' && !$md5_match) { + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + //echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + //file_get_contents($svn_url.$svn_path.$xml_relative_path);\n"; + echo "\n"; + echo "\n"; + } + } + //update the database + if (strlen($sql) > 0) { + $db->exec(check_sql($sql)); + //echo "$sql
\n"; + } + unset($sql); + } +} +//$db->commit(); +//clearstatcache(); +if ($display_results) { + echo "
TypeLast ModifiedPathStatus/SizeMD5 fileMD5 xmlAction
$xml_type$xml_last_mod$xml_relative_path$exists$xml_size$md5_file$md5_xml$md5_match \n"; + } + } + + //update the v_scr data + if ($xml_type=='file' && strlen($path_array[$xml_relative_path]['type']) == 0) { + //insert a new record into the src table + $sql =""; + $sql .= "insert into v_src "; + $sql .= "("; + $sql .= "domain_uuid, "; + $sql .= "type, "; + $sql .= "last_mod, "; + $sql .= "path "; + $sql .= ")"; + $sql .= "values "; + $sql .= "("; + $sql .= "'$domain_uuid', "; + $sql .= "'$xml_type', "; + $sql .= "'$xml_last_mod', "; + $sql .= "'$xml_relative_path' "; + $sql .= ")"; + //echo "$sql
\n"; + } + else { + if ($xml_type=='file' && !$md5_match) {//update changed files + //update the src table + $sql =""; + $sql .= "update v_src set "; + $sql .= "type = '$xml_type', "; + $sql .= "last_mod = '$xml_last_mod' "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and path = '$xml_relative_path' "; + } + } + //if the path exists and is a file + if ($exists && $xml_type == 'file') { + //the md5 of the xml file and the local file do not match + if ($md5_match) { + if ($display_results) { + //echo "current "; //the file is up to date + } + } + else { +/* if ($xml_file_path == '/core/upgrade/upgrade_svn.php' ) { + if ($display_results) { + echo "white list"; //the file is up to date + } + continue; + } +*/ //get the remote file contents + $file_content = $svn->getFile($xml_file_path); + + //the md5 of the local file and the remote content match + if (md5_file($new_path) == md5($file_content)) { + if ($display_results) { + //echo "current 2 "; //the file is up to date + } + } + else { + //make sure the string matches the file md5 that was recorded. + if (strlen($file_content) > 0) { + $tmp_fh = fopen($new_path, 'w'); + fwrite($tmp_fh, $file_content); + fclose($tmp_fh); + } + + //display the results + if ($display_results) { + echo " "; + if (is_writable($new_path)) { + echo "updated "; + } + else { + echo "not writable "; + } + echo ""; + } + } + } + //unset the variable + unset($file_content); + } + else { + + //if the path does not exist create it and then add it to the database + //echo "file is missing |"; + if ($xml_type == 'directory' && !$exists) { + //make sure the directory exists + mkdir (dirname($new_path), 0755, true); + } + if ($xml_type == 'file') { + //make sure the directory exists + if (!is_dir(dirname($new_path))){ + mkdir (dirname($new_path), 0755, true); + } + + //get the remote file contents + $file_content = $svn->getFile($xml_file_path); + + //make sure we got some data. + if (strlen($file_content) > 0) { + $tmp_fh = fopen($new_path, 'w'); + fwrite($tmp_fh, $file_content); + fclose($tmp_fh); + } + + if ($display_results) { + echo " "; + if (is_writable($new_path)) { + echo "added/restored"; + } + else { + echo "not writable "; + } + echo ""; + //echo "
\n"; + } + //unset the variable + unset($file_content); + } + } + + if ($display_results) { + if ($xml_type == 'file' && !$md5_match) { + echo " "; + echo "
\n"; + require_once "includes/footer.php"; +} +/* + $mtime = microtime(); + $mtime = explode(" ",$mtime); + $mtime = $mtime[1] + $mtime[0]; + $end_time = $mtime; + $total_time = ($end_time - $start_time); + echo "This page was created in ".$total_time." seconds"; +*/ +?> \ No newline at end of file diff --git a/core/users/app_config.php b/core/users/app_config.php new file mode 100644 index 0000000000..f72aa9d339 --- /dev/null +++ b/core/users/app_config.php @@ -0,0 +1,356 @@ + \ No newline at end of file diff --git a/core/users/app_defaults.php b/core/users/app_defaults.php new file mode 100644 index 0000000000..46ca4e85ab --- /dev/null +++ b/core/users/app_defaults.php @@ -0,0 +1,169 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ + +//if the are no groups add the default groups + $sql = "SELECT * FROM v_groups "; + $sql .= "WHERE domain_uuid = '$domain_uuid' "; + $sub_result = $db->query($sql)->fetch(); + $prep_statement = $db->prepare(check_sql($sql)); + if ($prep_statement) { + $prep_statement->execute(); + $sub_result = $prep_statement->fetchAll(PDO::FETCH_ASSOC); + if (count($sub_result) == 0) { + $x = 0; + $tmp[$x]['group_name'] = 'superadmin'; + $tmp[$x]['group_description'] = 'Super Administrator Group'; + $x++; + $tmp[$x]['group_name'] = 'admin'; + $tmp[$x]['group_description'] = 'Administrator Group'; + $x++; + $tmp[$x]['group_name'] = 'user'; + $tmp[$x]['group_description'] = 'User Group'; + $x++; + $tmp[$x]['group_name'] = 'public'; + $tmp[$x]['group_description'] = 'Public Group'; + $x++; + $tmp[$x]['group_name'] = 'agent'; + $tmp[$x]['group_description'] = 'Call Center Agent Group'; + foreach($tmp as $row) { + if (strlen($row['group_name']) > 0) { + $sql = "insert into v_groups "; + $sql .= "("; + $sql .= "domain_uuid, "; + $sql .= "group_uuid, "; + $sql .= "group_name, "; + $sql .= "group_description "; + $sql .= ")"; + $sql .= "values "; + $sql .= "("; + $sql .= "'$domain_uuid', "; + $sql .= "'".uuid()."', "; + $sql .= "'".$row['group_name']."', "; + $sql .= "'".$row['group_description']."' "; + $sql .= ")"; + $db->exec(check_sql($sql)); + unset($sql); + } + } + } + } + unset($prep_statement, $sub_result); + +//if there are no permissions listed in v_group_permissions then set the default permissions + $sql = "select count(*) as count from v_group_permissions "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $prep_statement = $db->prepare($sql); + $prep_statement->execute(); + $sub_result = $prep_statement->fetch(PDO::FETCH_ASSOC); + unset ($prep_statement); + if ($sub_result['count'] > 0) { + if ($display_type == "text") { + echo " Group Permissions: no change\n"; + } + } + else { + if ($display_type == "text") { + echo " Group Permissions: added\n"; + } + //no permissions found add the defaults + $db->beginTransaction(); + foreach($apps as $app) { + foreach ($app['permissions'] as $sub_row) { + foreach ($sub_row['groups'] as $group) { + //add the record + $sql = "insert into v_group_permissions "; + $sql .= "("; + $sql .= "group_permission_uuid, "; + $sql .= "domain_uuid, "; + $sql .= "permission_name, "; + $sql .= "group_name "; + $sql .= ")"; + $sql .= "values "; + $sql .= "("; + $sql .= "'".uuid()."', "; + $sql .= "'$domain_uuid', "; + $sql .= "'".$sub_row['name']."', "; + $sql .= "'".$group."' "; + $sql .= ")"; + $db->exec($sql); + unset($sql); + } + } + } + $db->commit(); + } + +//find rows that have a null user_uuid and set the correct user_uuid + $sql = "select * from v_group_users "; + $sql .= "where domain_uuid = '".$_SESSION['domain_uuid']."' "; + $sql .= "and user_uuid is null; "; + $prep_statement = $db->prepare(check_sql($sql)); + if ($prep_statement) { + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach($result as $row) { + if (strlen($row['username']) > 0) { + //get the user_uuid + $sql = "select user_uuid from v_users "; + $sql .= "where username = '".$row['username']."' "; + $prep_statement_sub = $db->prepare($sql); + $prep_statement_sub->execute(); + $sub_result = $prep_statement_sub->fetch(PDO::FETCH_ASSOC); + unset ($prep_statement_sub); + $user_uuid = $sub_result['user_uuid']; + //set the user uuid + $sql = "update v_group_users set "; + $sql .= "user_uuid = '".$user_uuid."' "; + $sql .= "where username = '".$row['username']."'; "; + $db->exec($sql); + unset($sql); + } + else { + //get the number of users + $sql = "select count(*) as num_rows from v_users "; + $prep_statement_sub = $db->prepare($sql); + $prep_statement_sub->execute(); + $sub_result = $prep_statement_sub->fetch(PDO::FETCH_ASSOC); + unset ($prep_statement_sub); + $num_rows = $sub_result['num_rows']; + if ($num_rows == 1) { + //get the user_uuid + $sql = "select user_uuid from v_users "; + $prep_statement_sub = $db->prepare($sql); + $prep_statement_sub->execute(); + $sub_result = $prep_statement_sub->fetch(PDO::FETCH_ASSOC); + unset ($prep_statement_sub); + $user_uuid = $sub_result['user_uuid']; + //set the user uuid + $sql = "update v_group_users set "; + $sql .= "user_uuid = '".$user_uuid."' "; + $db->exec($sql); + unset($sql); + } + } + } + } +?> \ No newline at end of file diff --git a/core/users/group_permissions.php b/core/users/group_permissions.php new file mode 100644 index 0000000000..2dbfd0bab2 --- /dev/null +++ b/core/users/group_permissions.php @@ -0,0 +1,275 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require_once "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('group_permissions') || if_group("superadmin")) { + //access granted +} +else { + echo "access denied"; + exit; +} +require_once "includes/header.php"; +require_once "includes/paging.php"; + +//get the list of installed apps from the core and mod directories + $config_list = glob($_SERVER["DOCUMENT_ROOT"] . PROJECT_PATH . "/*/*/app_config.php"); + $x=0; + foreach ($config_list as &$config_path) { + include($config_path); + $x++; + } + +//if there are no permissions listed in v_group_permissions then set the default permissions + $sql = ""; + $sql .= "select count(*) as count from v_group_permissions "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach ($result as &$row) { + $group_permission_count = $row["count"]; + break; //limit to 1 row + } + unset ($prep_statement); + if ($group_permission_count == 0) { + //no permissions found add the defaults + foreach($apps as $app) { + foreach ($app['permissions'] as $row) { + foreach ($row['groups'] as $group) { + //add the record + $sql = "insert into v_group_permissions "; + $sql .= "("; + $sql .= "group_permission_uuid, "; + $sql .= "domain_uuid, "; + $sql .= "permission_name, "; + $sql .= "group_name "; + $sql .= ")"; + $sql .= "values "; + $sql .= "("; + $sql .= "'".uuid()."', "; + $sql .= "'$domain_uuid', "; + $sql .= "'".$row['name']."', "; + $sql .= "'".$group."' "; + $sql .= ")"; + $db->exec(check_sql($sql)); + unset($sql); + } + } + } + } + +//get the http values and set them as php variables + $group_name = $_REQUEST['group_name']; + +//get the permissions assigned to this group + $sql = ""; + $sql .= " select * from v_group_permissions "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and group_name = '$group_name' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach ($result as &$row) { + $permission_name = $row["permission_name"]; + $permissions_db[$permission_name] = "true"; + } +//show the db checklist + //echo "
";
+	//print_r($permissions_db);
+	//echo "
"; + +//list all the permissions in the database + foreach($apps as $app) { + foreach ($app['permissions'] as $row) { + if ($permissions_db[$row['name']] == "true") { + $permissions_db_checklist[$row['name']] = "true"; + } + else { + $permissions_db_checklist[$row['name']] = "false"; + } + } + } +//show the db checklist + //echo "
";
+	//print_r($permissions_db_checklist);
+	//echo "
"; + +//process the http post + if (count($_POST)>0) { + foreach($_POST['permissions_form'] as $permission) { + $permissions_form[$permission] = "true"; + } + + //list all the permissions + foreach($apps as $app) { + foreach ($app['permissions'] as $row) { + if ($permissions_form[$row['name']] == "true") { + $permissions_form_checklist[$row['name']] = "true"; + } + else { + $permissions_form_checklist[$row['name']] = "false"; + } + } + } + //show the form db checklist + //echo "
";
+			//print_r($permissions_form_checklist);
+			//echo "
"; + + //list all the permissions + foreach($apps as $app) { + foreach ($app['permissions'] as $row) { + $permission = $row['name']; + if ($permissions_db_checklist[$permission] == "true" && $permissions_form_checklist[$permission] == "true") { + //matched do nothing + } + if ($permissions_db_checklist[$permission] == "false" && $permissions_form_checklist[$permission] == "false") { + //matched do nothing + } + if ($permissions_db_checklist[$permission] == "true" && $permissions_form_checklist[$permission] == "false") { + //delete the record + $sql = "delete from v_group_permissions "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and group_name = '$group_name' "; + $sql .= "and permission_name = '$permission' "; + $db->exec(check_sql($sql)); + unset($sql); + //set the permission to false in the permissions_db_checklist + $permissions_db_checklist[$permission] = "false"; + } + if ($permissions_db_checklist[$permission] == "false" && $permissions_form_checklist[$permission] == "true") { + //add the record + $sql = "insert into v_group_permissions "; + $sql .= "("; + $sql .= "group_permission_uuid, "; + $sql .= "domain_uuid, "; + $sql .= "permission_name, "; + $sql .= "group_name "; + $sql .= ")"; + $sql .= "values "; + $sql .= "("; + $sql .= "'".uuid()."', "; + $sql .= "'$domain_uuid', "; + $sql .= "'$permission', "; + $sql .= "'$group_name' "; + $sql .= ")"; + $db->exec(check_sql($sql)); + unset($sql); + //set the permission to true in the permissions_db_checklist + $permissions_db_checklist[$permission] = "true"; + } + } + } + } + +//show the content + echo "
\n"; + echo "
"; + echo "\n"; + echo "\n"; + echo " "; + echo ""; + echo "
\n"; + echo "
"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "
Group Permission List for $group_name\n"; + echo " "; + echo "
\n"; + echo " Assign permissions to groups.

\n"; + echo "
\n"; + + echo "
\n"; + + $c = 0; + $row_style["0"] = "row_style0"; + $row_style["1"] = "row_style1"; + + echo "
\n"; + + //list all the permissions + foreach($apps as $app) { + $app_name = $app['name']; + $description = $app['description']['en']; + + echo "".$app_name."
\n"; + echo "".$description."

"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + foreach ($app['permissions'] as $row) { + echo "\n"; + echo " \n"; + echo " \n"; + echo "\n"; + if ($c==0) { $c=1; } else { $c=0; } + } + + echo "\n"; + echo " \n"; + echo "\n"; + echo "
PermissionsDescription
\n"; + if ($permissions_db_checklist[$row['name']] == "true") { + echo " \n"; + } + else { + echo " \n"; + } + echo "   ".$row['name']."\n"; + echo " \n"; + echo "   ".$row['description']."\n"; + echo "
\n"; + echo " \n"; + echo "
"; + echo "
\n"; + } //end foreach + unset($sql, $result, $row_count); + + echo "
"; + echo "

"; + echo "

"; + + echo "
"; + echo "
"; + echo "\n"; + + echo "

"; + +//show the footer + require_once "includes/footer.php"; + +?> diff --git a/core/users/groupadd.php b/core/users/groupadd.php new file mode 100644 index 0000000000..8d7ffbe054 --- /dev/null +++ b/core/users/groupadd.php @@ -0,0 +1,134 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('group_add')) { + //access allowed +} +else { + echo "access denied"; + return; +} + +//get the http values and set them as variables + $path = check_str($_GET["path"]); + $msg = check_str($_GET["msg"]); + $group_name = check_str($_POST["group_name"]); + $group_description = check_str($_POST["group_description"]); + +if (strlen($group_name) > 0) { + $sql_insert = "insert into v_groups "; + $sql_insert .= "("; + $sql_insert .= "domain_uuid, "; + $sql_insert .= "group_uuid, "; + $sql_insert .= "group_name, "; + $sql_insert .= "group_description "; + $sql_insert .= ")"; + $sql_insert .= "values "; + $sql_insert .= "("; + $sql_insert .= "'$domain_uuid', "; + $sql_insert .= "'".uuid()."', "; + $sql_insert .= "'$group_name', "; + $sql_insert .= "'$group_description' "; + $sql_insert .= ")"; + if (!$db->exec($sql_insert)) { + //echo $db->errorCode() . "
"; + $info = $db->errorInfo(); + print_r($info); + // $info[0] == $db->errorCode() unified error code + // $info[1] is the driver specific error code + // $info[2] is the driver specific error string + } + + //redirect the user + require_once "includes/header.php"; + echo "\n"; + echo "
\n"; + echo "Group Added\n"; + echo "
\n"; + require_once "includes/footer.php"; + return; +} + +//include the header + include "includes/header.php"; + +//show the content + echo "

"; + echo "
"; + + echo "\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "
\n"; + echo " Please choose a group name. "; + echo " \n"; + echo " "; + echo "
\n"; + echo "
"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "
\n"; + echo "Group Name:\n"; + echo "\n"; + echo " \n"; + echo "
\n"; + echo "Description:\n"; + echo "\n"; + echo "\n"; + echo "
\n"; + echo "\n"; + echo " \n"; + echo " \n"; + echo "
\n"; + echo ""; + echo "
"; + + echo "

"; + echo "

"; + +//include the footer + include "includes/footer.php"; + +?> diff --git a/core/users/groupdelete.php b/core/users/groupdelete.php new file mode 100644 index 0000000000..b0c6c40568 --- /dev/null +++ b/core/users/groupdelete.php @@ -0,0 +1,56 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('group_delete') || if_group("superadmin")) { + //access allowed +} +else { + echo "access denied"; + return; +} + +//get the http value and set as a variable + $id = check_str($_GET["id"]); + +//delete the group + $sqldelete = "delete from v_groups "; + $sqldelete .= "where domain_uuid = '$domain_uuid' "; + $sqldelete .= "and group_uuid = '$id' "; + if (!$db->exec($sqldelete)) { + //echo $db->errorCode() . "
"; + $info = $db->errorInfo(); + print_r($info); + // $info[0] == $db->errorCode() unified error code + // $info[1] is the driver specific error code + // $info[2] is the driver specific error string + } + +//redirect the user + header("Location: grouplist.php"); + +?> diff --git a/core/users/grouplist.php b/core/users/grouplist.php new file mode 100644 index 0000000000..1978710cc0 --- /dev/null +++ b/core/users/grouplist.php @@ -0,0 +1,137 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; + +//check the permissions + require_once "includes/checkauth.php"; + if (if_group("admin") || if_group("superadmin")) { + //access allowed + } + else { + echo "access denied"; + return; + } + +//show the header + require_once "includes/header.php"; + +//show the content + echo "
\n"; + echo ""; + echo ""; + echo ""; + echo "
"; + + echo ""; + echo ""; + echo "\n"; + echo "
Group List"; + if (permission_exists('user_view')) { + echo " "; + } + echo "
"; + + $sql = "SELECT * FROM v_groups "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + + $c = 0; + $row_style["0"] = "row_style0"; + $row_style["1"] = "row_style1"; + + $strlist = "\n"; + $strlist .= "\n"; + $strlist .= " \n"; + $strlist .= " \n"; + $strlist .= " \n"; + + $strlist .= " \n"; + $strlist .= "\n"; + + $count = 0; + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach ($result as &$row) { + $group_name = $row["group_name"]; + $group_uuid = $row["group_uuid"]; + $group_description = $row["group_description"]; + if (strlen($group_name) == 0) { $group_name = " "; } + if (strlen($group_description) == 0) { $group_description = " "; } + $group_description = wordwrap($group_description, 50, "
\n"); + + if (!if_group("superadmin") && $group_name == "superadmin") { + //hide the superadmin group from non superadmin's + } + else { + $strlist .= ""; + $strlist .= "\n"; + $strlist .= "\n"; + + $strlist .= "\n"; + + $strlist .= "\n"; + $strlist .= "\n"; + } + if ($c==0) { $c=1; } else { $c=0; } + $count++; + } + + $strlist .= "\n"; + $strlist .= "\n"; + $strlist .= "\n"; + + $strlist .= "
  Group Name     Group Description    \n"; + if (permission_exists('group_add')) { + $strlist .= " $v_link_label_add\n"; + } + $strlist .= "
  $group_name     $group_description   \n"; + if (permission_exists('group_add') || if_group("superadmin")) { + $strlist .= " Permissions  "; + } + if (permission_exists('group_member_view') || if_group("superadmin")) { + $strlist .= " Members "; + } + $strlist .= "\n"; + $strlist .= "$v_link_label_delete\n"; + + $strlist .= "
\n"; + if (permission_exists('group_add')) { + $strlist .= " $v_link_label_add\n"; + } + $strlist .= "
\n"; + if ($count > 0) { + echo $strlist; + } + + echo "
"; + echo "
"; + echo "
"; + +//show the footer + require_once "includes/footer.php"; + +?> \ No newline at end of file diff --git a/core/users/groupmemberadd.php b/core/users/groupmemberadd.php new file mode 100644 index 0000000000..c93bb456ab --- /dev/null +++ b/core/users/groupmemberadd.php @@ -0,0 +1,80 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('group_member_add') || if_group("superadmin")) { + //access allowed +} +else { + echo "access denied"; + return; +} + +//requires a superadmin to add a user to the superadmin group + if (!if_group("superadmin") && $_GET["group_name"] == "superadmin") { + echo "access denied"; + return; + } + +//get the http values and set them as variables + $group_name = check_str($_POST["group_name"]); + $user_uuid = check_str($_POST["user_uuid"]); + +if (strlen($user_uuid) > 0 && strlen($group_name) > 0) { + $sql_insert = "insert into v_group_users "; + $sql_insert .= "("; + $sql_insert .= "group_user_uuid, "; + $sql_insert .= "domain_uuid, "; + $sql_insert .= "group_name, "; + $sql_insert .= "user_uuid "; + $sql_insert .= ")"; + $sql_insert .= "values "; + $sql_insert .= "("; + $sql_insert .= "'".uuid()."', "; + $sql_insert .= "'$domain_uuid', "; + $sql_insert .= "'$group_name', "; + $sql_insert .= "'$user_uuid' "; + $sql_insert .= ")"; + if (!$db->exec($sql_insert)) { + //echo $db->errorCode() . "
"; + $info = $db->errorInfo(); + print_r($info); + // $info[0] == $db->errorCode() unified error code + // $info[1] is the driver specific error code + // $info[2] is the driver specific error string + } + else { + //log the success + //$log_type = 'group'; $log_status='add'; $log_add_user=$_SESSION["username"]; $log_desc= "username: ".$username." added to group: ".$group_name; + //log_add($db, $log_type, $log_status, $log_desc, $log_add_user, $_SERVER["REMOTE_ADDR"]); + } +} + +//redirect the user + header("Location: groupmembers.php?group_name=$group_name"); + +?> \ No newline at end of file diff --git a/core/users/groupmemberdelete.php b/core/users/groupmemberdelete.php new file mode 100644 index 0000000000..e9019f6983 --- /dev/null +++ b/core/users/groupmemberdelete.php @@ -0,0 +1,68 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('group_member_delete') || if_group("superadmin")) { + //access allowed +} +else { + echo "access denied"; + return; +} + +//requires a superadmin to delete superadmin group + if (!if_group("superadmin") && $_GET["group_name"] == "superadmin") { + echo "access denied"; + return; + } + +//get the http values and set them as variables + $group_name = check_str($_GET["group_name"]); + $user_uuid = check_str($_GET["user_uuid"]); + +//delete the group membership + $sql_delete = "delete from v_group_users "; + $sql_delete .= "where domain_uuid = '$domain_uuid' "; + $sql_delete .= "and user_uuid = '$user_uuid' "; + $sql_delete .= "and group_name = '$group_name' "; + if (!$db->exec($sql_delete)) { + //echo $db->errorCode() . "
"; + $info = $db->errorInfo(); + print_r($info); + // $info[0] == $db->errorCode() unified error code + // $info[1] is the driver specific error code + // $info[2] is the driver specific error string + } + else { + //$log_type = 'group'; $log_status='remove'; $log_add_user=$_SESSION["username"]; $log_desc= "username: ".$username." removed from group: ".$group_name; + //log_add($db, $log_type, $log_status, $log_desc, $log_add_user, $_SERVER["REMOTE_ADDR"]); + } + +//redirect the user + header("Location: groupmembers.php?group_name=$group_name"); + +?> \ No newline at end of file diff --git a/core/users/groupmembers.php b/core/users/groupmembers.php new file mode 100644 index 0000000000..2ee1ae6589 --- /dev/null +++ b/core/users/groupmembers.php @@ -0,0 +1,166 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('group_members_view') || if_group("superadmin")) { + //access allowed +} +else { + echo "access denied"; + return; +} + +//requires a superadmin to view members of the superadmin group + if (!if_group("superadmin") && $_GET["group_name"] == "superadmin") { + echo "access denied"; + return; + } + +//get the http value and set as a variable + $group_name = $_GET["group_name"]; + +//define the if group members function + function if_group_members($db, $group_name, $user_uuid) { + $sql = "select * from v_group_users "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and group_name = '$group_name' "; + $sql .= "and user_uuid = '$user_uuid' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + if (count($prep_statement->fetchAll(PDO::FETCH_NAMED)) == 0) { return true; } else { return false; } + unset ($sql, $prep_statement); + } + //$exampledatareturned = example("apples", 1); + +//include the header + require_once "includes/header.php"; + +//show the content + $c = 0; + $row_style["0"] = "row_style0"; + $row_style["1"] = "row_style1"; + + echo "
\n"; + echo ""; + echo ""; + echo "
\n"; + echo "\n"; + + echo "\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "
\n"; + echo " Member list for $group_name"; + echo " \n"; + echo " "; + echo "    \n"; + echo "
\n"; + + $sql = "SELECT u.user_uuid, u.username, g.group_user_uuid FROM v_group_users as g, v_users as u "; + $sql .= "where g.user_uuid = u.user_uuid "; + $sql .= "and g.domain_uuid = '$domain_uuid' "; + $sql .= "and g.group_name = '$group_name' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + + $strlist = "\n"; + $strlist .= "\n"; + $strlist .= " \n"; + $strlist .= " \n"; + $strlist .= " \n"; + $strlist .= "\n"; + + $count = 0; + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach ($result as &$row) { + $group_user_uuid = $row["group_user_uuid"]; + $username = $row["username"]; + $user_uuid = $row["user_uuid"]; + $strlist .= ""; + $strlist .= "\n"; + $strlist .= "\n"; + $strlist .= "\n"; + $strlist .= "\n"; + + if ($c==0) { $c=1; } else { $c=0; } + $count++; + } + + $strlist .= "
  Username       \n"; + $strlist .= "  \n"; + $strlist .= "
  $username     \n"; + if (permission_exists('group_member_delete')) { + $strlist .= " $v_link_label_delete\n"; + } + $strlist .= "
\n"; + echo $strlist; + + echo "
"; + echo "
"; + + echo "
"; + echo "
"; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo "
"; + + $sql = "SELECT * FROM v_users "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "order by username "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + + echo ""; + unset($sql, $result); + + echo " "; + if (permission_exists('group_member_add')) { + echo " "; + echo " "; + } + echo "
"; + echo "
"; + echo "
"; + echo "

"; + +//include the footer + require_once "includes/footer.php"; +?> \ No newline at end of file diff --git a/core/users/index.php b/core/users/index.php new file mode 100644 index 0000000000..b4fb355ab6 --- /dev/null +++ b/core/users/index.php @@ -0,0 +1,57 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('user_view') || if_group("superadmin")) { + //access allowed +} +else { + echo "access denied"; + return; +} + +//include the header + require_once "includes/header.php"; + +//show the user list + echo "
"; + echo " "; + echo " "; + echo " "; + echo " "; + echo "
"; + require_once "userlist.php"; + echo "
"; + echo "
"; + echo "
"; + echo "
"; + echo "
"; + +//include the footer + include "includes/footer.php"; + +?> diff --git a/core/users/root.php b/core/users/root.php new file mode 100644 index 0000000000..7b882438ea --- /dev/null +++ b/core/users/root.php @@ -0,0 +1,50 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ + +// make sure the PATH_SEPARATOR is defined + if (!defined("PATH_SEPARATOR")) { + if ( strpos( $_ENV[ "OS" ], "Win" ) !== false ) { define("PATH_SEPARATOR", ";"); } else { define("PATH_SEPARATOR", ":"); } + } + +// make sure the document_root is set + $_SERVER["SCRIPT_FILENAME"] = str_replace("\\", "/", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = str_replace($_SERVER["PHP_SELF"], "", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = realpath($_SERVER["DOCUMENT_ROOT"]); + //echo "DOCUMENT_ROOT: ".$_SERVER["DOCUMENT_ROOT"]."
\n"; + //echo "PHP_SELF: ".$_SERVER["PHP_SELF"]."
\n"; + //echo "SCRIPT_FILENAME: ".$_SERVER["SCRIPT_FILENAME"]."
\n"; + +// if the project directory exists then add it to the include path otherwise add the document root to the include path + if (is_dir($_SERVER["DOCUMENT_ROOT"].'/fusionpbx')){ + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', '/fusionpbx'); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER["DOCUMENT_ROOT"].'/fusionpbx' ); + } + else { + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', ''); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER['DOCUMENT_ROOT'] ); + } + +?> \ No newline at end of file diff --git a/core/users/signup.php b/core/users/signup.php new file mode 100644 index 0000000000..c67892b240 --- /dev/null +++ b/core/users/signup.php @@ -0,0 +1,258 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; + +if (if_group("admin") || if_group("superadmin")) { + //access allowed +} +else { + echo "access denied"; + return; +} + +$username = check_str($_POST["username"]); +$password = check_str($_POST["password"]); +$confirmpassword = check_str($_POST["confirmpassword"]); +$contact_organization = check_str($_POST["contact_organization"]); +$contact_name_given = check_str($_POST["contact_name_given"]); +$contact_name_family = check_str($_POST["contact_name_family"]); +$user_email = check_str($_POST["user_email"]); + +if (count($_POST)>0 && check_str($_POST["persistform"]) != "1") { + + $msgerror = ''; + + //--- begin captcha verification --------------------- + //session_start(); //make sure sessions are started + if (strtolower($_SESSION["captcha"]) != strtolower($_REQUEST["captcha"]) || strlen($_SESSION["captcha"]) == 0) { + //$msgerror .= "Captcha Verification Failed
\n"; + } + else { + //echo "verified"; + } + //--- end captcha verification ----------------------- + + //username is already used. + if (strlen($username) == 0) { + $msgerror .= "Please provide a Username.
\n"; + } + else { + $sql = "SELECT * FROM v_users "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and username = '$username' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + if (count($prep_statement->fetchAll(PDO::FETCH_NAMED)) > 0) { + $msgerror .= "Please choose a different Username.
\n"; + } + } + + if (strlen($password) == 0) { $msgerror .= "Password cannot be blank.
\n"; } + if ($password != $confirmpassword) { $msgerror .= "Passwords did not match.
\n"; } + //if (strlen($contact_organization) == 0) { $msgerror .= "Please provide a organization name.
\n"; } + //if (strlen($contact_name_given) == 0) { $msgerror .= "Please provide a first name.
\n"; } + //if (strlen($contact_name_family) == 0) { $msgerror .= "Please provide a last name $user_last_name.
\n"; } + if (strlen($user_email) == 0) { $msgerror .= "Please provide an email.
\n"; } + + if (strlen($msgerror) > 0) { + require_once "includes/header.php"; + echo "
"; + echo "
"; + echo $msgerror; + echo "
"; + require_once "includes/persistform.php"; + echo persistform($_POST); + echo "
"; + require_once "includes/footer.php"; + return; + } + + //salt used with the password to create a one way hash + $salt = generate_password('20', '4'); + + //prepare the uuids + $user_uuid = uuid(); + $contact_uuid = uuid(); + + //add the user + $sql = "insert into v_users "; + $sql .= "("; + $sql .= "domain_uuid, "; + $sql .= "user_uuid, "; + $sql .= "contact_uuid, "; + $sql .= "username, "; + $sql .= "password, "; + $sql .= "salt, "; + $sql .= "user_add_date, "; + $sql .= "user_add_user "; + $sql .= ") "; + $sql .= "values "; + $sql .= "("; + $sql .= "'$domain_uuid', "; + $sql .= "'$user_uuid', "; + $sql .= "'$contact_uuid', "; + $sql .= "'$username', "; + $sql .= "'".md5($salt.$password)."', "; + $sql .= "'".$salt."', "; + $sql .= "now(), "; + $sql .= "'".$_SESSION["username"]."' "; + $sql .= ")"; + $db->exec(check_sql($sql)); + unset($sql); + + //add to contacts + $sql = "insert into v_contacts "; + $sql .= "("; + $sql .= "domain_uuid, "; + $sql .= "contact_uuid, "; + $sql .= "contact_type, "; + $sql .= "contact_organization, "; + $sql .= "contact_name_given, "; + $sql .= "contact_name_family, "; + $sql .= "contact_nickname, "; + $sql .= "contact_email "; + $sql .= ") "; + $sql .= "values "; + $sql .= "("; + $sql .= "'$domain_uuid', "; + $sql .= "'$contact_uuid', "; + $sql .= "'user', "; + $sql .= "'$contact_organization', "; + $sql .= "'$contact_name_given', "; + $sql .= "'$contact_name_family', "; + $sql .= "'$username', "; + $sql .= "'$user_email' "; + $sql .= ")"; + $db->exec(check_sql($sql)); + unset($sql); + + //log the success + //$log_type = 'user'; $log_status='add'; $log_add_user=$_SESSION["username"]; $log_desc= "username: ".$username." user added."; + //log_add($db, $log_type, $log_status, $log_desc, $log_add_user, $_SERVER["REMOTE_ADDR"]); + + $group_name = 'user'; + $sql = "insert into v_group_users "; + $sql .= "("; + $sql .= "group_user_uuid, "; + $sql .= "domain_uuid, "; + $sql .= "group_name, "; + $sql .= "user_uuid "; + $sql .= ")"; + $sql .= "values "; + $sql .= "("; + $sql .= "'".uuid()."', "; + $sql .= "'$domain_uuid', "; + $sql .= "'$group_name', "; + $sql .= "'$user_uuid' "; + $sql .= ")"; + $db->exec(check_sql($sql)); + unset($sql); + + require_once "includes/header.php"; + echo "\n"; + echo "
Add Complete
"; + require_once "includes/footer.php"; + return; +} + +//show the header + require_once "includes/header.php"; + +//show the content + echo "
"; + echo "\n"; + echo "\n"; + echo " "; + echo " "; + echo "
\n"; + echo "
"; + + $tablewidth ='width="100%"'; + echo "
"; + echo "
\n"; + + echo ""; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "
\n"; + echo " To add a user, please fill out this form completely. All fields are required.
"; + echo "
\n"; + echo " \n"; + echo "
\n"; + + echo ""; + echo " "; + echo " "; + echo " "; + echo " "; + + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo "
Username:
Password:
Confirm Password:
Email:
First Name:
Last Name:
Company Name:
"; + echo "
"; + + echo "
\n"; + echo ""; + echo " "; + echo " "; + echo " "; + echo "
"; + echo " "; + echo "
"; + echo ""; + + echo "
"; + echo "
"; + +//show the footer + require_once "includes/footer.php"; +?> \ No newline at end of file diff --git a/core/users/userdelete.php b/core/users/userdelete.php new file mode 100644 index 0000000000..492abcc9fc --- /dev/null +++ b/core/users/userdelete.php @@ -0,0 +1,87 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists('user_delete')) { + //access allowed +} +else { + echo "access denied"; + return; +} + +//get the id + $user_uuid = check_str($_GET["id"]); + +//get the username from v_users + $sql = ""; + $sql .= "select * from v_users "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and user_uuid = '$user_uuid' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach ($result as &$row) { + $username = $row["username"]; + break; //limit to 1 row + } + unset ($prep_statement); + +//required to be a superadmin to delete a member of the superadmin group + $superadmin_list = superadmin_list($db); + if (if_superadmin($superadmin_list, $_SESSION['user_uuid'])) { + if (!if_group("superadmin")) { + echo "access denied"; + return; + } + } +//delete the user + $sql_delete = "delete from v_users "; + $sql_delete .= "where domain_uuid = '$domain_uuid' "; + $sql_delete .= "and user_uuid = '$user_uuid' "; + if (!$db->exec($sql_delete)) { + //echo $db->errorCode() . "
"; + $info = $db->errorInfo(); + print_r($info); + // $info[0] == $db->errorCode() unified error code + // $info[1] is the driver specific error code + // $info[2] is the driver specific error string + } + +//delete the groups the user is assigned to + $sql_delete = "delete from v_group_users "; + $sql_delete .= "where domain_uuid = '$domain_uuid' "; + $sql_delete .= "and user_uuid = '$user_uuid' "; + if (!$db->exec($sql_delete)) { + $info = $db->errorInfo(); + print_r($info); + } + +//redirect the user + header("Location: index.php"); + +?> \ No newline at end of file diff --git a/core/users/userlist.php b/core/users/userlist.php new file mode 100644 index 0000000000..8afe8d49be --- /dev/null +++ b/core/users/userlist.php @@ -0,0 +1,192 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require_once "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists("user_view") || if_group("superadmin")) { + //access granted +} +else { + echo "access denied"; + exit; +} +//require_once "includes/header.php"; + require_once "includes/paging.php"; + +$order_by = $_GET["order_by"]; +$order = $_GET["order"]; +$field_name = $_REQUEST["field_name"]; +$field_value = $_REQUEST["field_value"]; + +echo "
"; +echo "\n"; +echo "\n"; +echo " "; +echo ""; +echo "
\n"; + +//page title and description + echo "\n"; + echo ""; + echo "\n"; + echo "\n"; + echo ""; + echo "\n"; + echo ""; + echo ""; + echo ""; + //echo "  \n"; + echo "\n"; + echo ""; + + echo "\n"; + echo "\n"; + echo "\n"; + +//get the user list from the database + $sql = ""; + $sql .= " select * from v_users "; + $sql .= " where domain_uuid = '$domain_uuid' "; + if (strlen($field_name) > 0 && strlen($field_value) > 0) { + $sql .= " and $field_name = '$field_value' "; + } + if (strlen($order_by)> 0) { $sql .= "order by $order_by $order "; } + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + $num_rows = count($result); + unset ($prep_statement, $result, $sql); + $rows_per_page = 200; + $param = ""; + $page = $_GET['page']; + if (strlen($page) == 0) { $page = 0; $_GET['page'] = 0; } + list($paging_controls, $rows_per_page, $var_3) = paging($num_rows, $param, $rows_per_page); + $offset = $rows_per_page * $page; + + $sql = ""; + $sql .= " select * from v_users "; + $sql .= " where domain_uuid = '".$_SESSION['domain_uuid']."' "; + if (strlen($field_name) > 0 && strlen($field_value) > 0) { + $sql .= " and $field_name like '%$field_value%' "; + } + if (strlen($order_by)> 0) { + $sql .= "order by $order_by $order "; + } + else { + $sql .= "order by username "; + } + $sql .= " limit $rows_per_page offset $offset "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + $result_count = count($result); + unset ($prep_statement, $sql); + +//alternate the row style + $c = 0; + $row_style["0"] = "row_style0"; + $row_style["1"] = "row_style1"; + +//show the data + echo "
\n"; + echo "
User ManagerSearch by: \n"; + echo " \n"; + echo " 
\n"; + echo "Add, edit, delete, and search for users. \n"; + echo "
\n"; + echo "
\n"; + echo "
\n"; + + echo "\n"; + echo th_order_by('username', 'Username', $order_by, $order); + //echo th_order_by('user_email', 'Email', $order_by, $order); + //echo th_order_by('user_template_name', 'Template', $order_by, $order); + echo "\n"; + echo "\n"; + + if ($result_count > 0) { + foreach($result as $row) { + echo "\n"; + echo " \n"; + //echo " \n"; + echo " \n"; + echo "\n"; + if ($c==0) { $c=1; } else { $c=0; } + } //end foreach + unset($sql, $result, $row_count); + } //end if results + + echo "\n"; + echo "\n"; + echo "\n"; + + echo "
\n"; + if (permission_exists('user_add')) { + echo " $v_link_label_add\n"; + } + echo "
".$row['username']." ".$row['user_email']." \n"; + if (permission_exists('user_edit')) { + echo " $v_link_label_edit\n"; + } + if (permission_exists('user_delete')) { + echo " $v_link_label_delete\n"; + } + echo "
\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "
 $paging_controls\n"; + if (permission_exists('user_add')) { + echo " $v_link_label_add\n"; + } + echo "
\n"; + echo "
"; + echo ""; + echo "

"; + echo "

"; + +echo "
"; +echo "
"; +echo "

"; + +?> diff --git a/core/users/usersupdate.php b/core/users/usersupdate.php new file mode 100644 index 0000000000..5404f652da --- /dev/null +++ b/core/users/usersupdate.php @@ -0,0 +1,612 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (permission_exists("user_add") || + permission_exists("user_edit") || + permission_exists("user_delete") || + if_group("superadmin")) { + //access allowed +} +else { + echo "access denied"; + return; +} + +//get data from the db + if (strlen($_REQUEST["id"])> 0) { + $user_uuid = $_REQUEST["id"]; + } + else { + if (strlen($_SESSION["username"]) > 0) { + $username = $_SESSION["username"]; + } + } + +//get the username from v_users + $sql = "select * from v_users "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and user_uuid = '$user_uuid' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach ($result as &$row) { + $username = $row["username"]; + break; //limit to 1 row + } + unset ($prep_statement); + +//required to be a superadmin to update an account that is a member of the superadmin group + $superadmin_list = superadmin_list($db); + if (if_superadmin($superadmin_list, $_SESSION['user_uuid'])) { + if (!if_group("superadmin")) { + echo "access denied"; + return; + } + } + +//delete the group from the user + if ($_GET["a"] == "delete" && permission_exists("user_delete")) { + //set the variables + $group_name = check_str($_GET["group_name"]); + //delete the group from the users + $sql = "delete from v_group_users "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and group_name = '$group_name' "; + $sql .= "and user_uuid = '$user_uuid' "; + $db->exec(check_sql($sql)); + //redirect the user + require_once "includes/header.php"; + echo "\n"; + echo "
Update Complete
"; + require_once "includes/footer.php"; + return; + } + +//get the user settings + $sql = "select * from v_user_settings "; + $sql .= "where user_uuid = '".$_SESSION["user_uuid"]."' "; + $sql .= "and user_setting_enabled = 'true' "; + $prep_statement = $db->prepare($sql); + if ($prep_statement) { + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach($result as $row) { + $name = $row['user_setting_name']; + $category = $row['user_setting_category']; + $subcategory = $row['user_setting_subcategory']; + if (strlen($subcategory) == 0) { + //$$category[$name] = $row['domain_setting_value']; + $user_settings[$category][$name] = $row['user_setting_value']; + } + else { + $user_settings[$category][$subcategory][$name] = $row['user_setting_value']; + } + } + } + +if (count($_POST)>0 && $_POST["persistform"] != "1") { + $user_uuid = $_REQUEST["id"]; + $password = check_str($_POST["password"]); + $confirm_password = check_str($_POST["confirm_password"]); + $user_status = check_str($_POST["user_status"]); + //$user_template_name = check_str($_POST["user_template_name"]); + $user_time_zone = check_str($_POST["user_time_zone"]); + $contact_uuid = check_str($_POST["contact_uuid"]); + $group_member = check_str($_POST["group_member"]); + + //if (strlen($password) == 0) { $msg_error .= "Password cannot be blank.
\n"; } + //if (strlen($username) == 0) { $msg_error .= "Please provide the username.
\n"; } + if ($password != $confirm_password) { $msg_error .= "Passwords did not match.
\n"; } + //if (strlen($contact_uuid) == 0) { $msg_error .= "Please provide an email.
\n"; } + //if (strlen($user_time_zone) == 0) { $msg_error .= "Please provide an time zone.
\n"; } + if ($msg_error) { + require_once "includes/header.php"; + echo "
"; + echo "
"; + echo $msg_error; + echo "
"; + echo "
\n"; + require_once "includes/persistform.php"; + echo persistform($_POST); + echo "
"; + require_once "includes/footer.php"; + return; + } + + //get the number of rows in v_user_settings + $sql = "select count(*) as num_rows from v_user_settings "; + $sql .= "where user_setting_category = 'domain' "; + $sql .= "and user_setting_subcategory = 'time_zone' "; + $sql .= "and user_uuid = '".$user_uuid."' "; + $prep_statement = $db->prepare(check_sql($sql)); + if ($prep_statement) { + $prep_statement->execute(); + $row = $prep_statement->fetch(PDO::FETCH_ASSOC); + if ($row['num_rows'] == 0) { + $user_setting_uuid = uuid(); + $sql = "insert into v_user_settings "; + $sql .= "("; + $sql .= "user_setting_uuid, "; + $sql .= "user_setting_category, "; + $sql .= "user_setting_subcategory, "; + $sql .= "user_setting_name, "; + $sql .= "user_setting_value, "; + $sql .= "user_setting_enabled, "; + $sql .= "user_uuid "; + $sql .= ") "; + $sql .= "values "; + $sql .= "("; + $sql .= "'".$user_setting_uuid."', "; + $sql .= "'domain', "; + $sql .= "'time_zone', "; + $sql .= "'name', "; + $sql .= "'".$user_time_zone."', "; + $sql .= "'true', "; + $sql .= "'".$user_uuid."' "; + $sql .= ")"; + $db->exec(check_sql($sql)); + } + else { + if (strlen($user_time_zone) == 0) { + $sql = "delete from v_user_settings "; + $sql .= "where user_setting_category = 'domain' "; + $sql .= "and user_setting_subcategory = 'time_zone' "; + $sql .= "and user_uuid = '".$user_uuid."' "; + $db->exec(check_sql($sql)); + unset($sql); + } + else { + $sql = "update v_user_settings set "; + $sql .= "user_setting_value = '".$user_time_zone."', "; + $sql .= "user_setting_enabled = 'true' "; + $sql .= "where user_setting_category = 'domain' "; + $sql .= "and user_setting_subcategory = 'time_zone' "; + $sql .= "and user_uuid = '".$user_uuid."' "; + $db->exec(check_sql($sql)); + } + } + } + + //assign the user to the group + if (strlen($_REQUEST["group_name"]) > 0) { + $sql_insert = "insert into v_group_users "; + $sql_insert .= "("; + $sql_insert .= "group_user_uuid, "; + $sql_insert .= "domain_uuid, "; + $sql_insert .= "group_name, "; + $sql_insert .= "user_uuid "; + $sql_insert .= ")"; + $sql_insert .= "values "; + $sql_insert .= "("; + $sql_insert .= "'".uuid()."', "; + $sql_insert .= "'$domain_uuid', "; + $sql_insert .= "'".$_REQUEST["group_name"]."', "; + $sql_insert .= "'$user_uuid' "; + $sql_insert .= ")"; + if ($_REQUEST["group_name"] == "superadmin") { + //only a user in the superadmin group can add other users to that group + if (if_group("superadmin")) { + $db->exec($sql_insert); + } + } + else { + $db->exec($sql_insert); + } + } + + //if the template has not been assigned by the superadmin + //if (strlen($_SESSION['domain']['template']['name']) == 0) { + //set the session theme for the active user + // if ($_SESSION["username"] == $username) { + // $_SESSION['domain']['template']['name'] = $user_template_name; + // } + //} + + //sql update + $sql = "update v_users set "; + if (if_group("admin") && strlen($_POST["username"])> 0) { + $sql .= "username = '$username', "; + } + if (strlen($password) > 0 && $confirm_password == $password) { + //salt used with the password to create a one way hash + $salt = generate_password('20', '4'); + //set the password + $sql .= "password = '".md5($salt.$password)."', "; + $sql .= "salt = '".$salt."', "; + } + $sql .= "user_status = '$user_status', "; + if (strlen($contact_uuid) == 0) { + $sql .= "contact_uuid = null "; + } + else { + $sql .= "contact_uuid = '$contact_uuid' "; + } + if (strlen($user_uuid)> 0) { + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and user_uuid = '$user_uuid' "; + } + else { + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and username = '$username' "; + } + $db->exec(check_sql($sql)); + + //update the user_status + $fp = event_socket_create($_SESSION['event_socket_ip_address'], $_SESSION['event_socket_port'], $_SESSION['event_socket_password']); + $switch_cmd .= "callcenter_config agent set status ".$username."@".$_SESSION['domain_name']." '".$user_status."'"; + $switch_result = event_socket_request($fp, 'api '.$switch_cmd); + + //update the user state + $cmd = "api callcenter_config agent set state ".$username."@".$_SESSION['domain_name']." Waiting"; + $response = event_socket_request($fp, $cmd); + + //clear the template so it will rebuild in case the template was changed + //$_SESSION["template_content"] = ''; + + //redirect the browser + require_once "includes/header.php"; + if (if_group("admin")) { + echo "\n"; + } + else { + echo "\n"; + } + echo "
Update Complete
"; + require_once "includes/footer.php"; + return; +} +else { + $sql = "select * from v_users "; + //allow admin access + if (if_group("admin") || if_group("superadmin")) { + if (strlen($user_uuid)> 0) { + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and user_uuid = '$user_uuid' "; + } + else { + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and username = '$username' "; + } + } + else { + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and username = '$username' "; + } + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach ($result as &$row) { + $user_uuid = $row["user_uuid"]; + if (if_group("admin")) { + $username = $row["username"]; + } + $password = $row["password"]; + $contact_uuid = $row["contact_uuid"]; + $user_status = $row["user_status"]; + break; //limit to 1 row + } + + //get the groups the user is a member of + //group_members function defined in config.php + $group_members = group_members($db, $user_uuid); +} + +//include the header + require_once "includes/header.php"; + +//show the content + $table_width ='width="100%"'; + echo "
"; + echo "
\n"; + + echo "
"; + echo "\n"; + echo "\n"; + echo ""; + echo " "; + echo "
\n"; + + echo ""; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "
User Manager\n"; + echo " "; + echo " "; + echo "
\n"; + echo " Edit user information and group membership. \n"; + echo "
\n"; + + echo "
\n"; + + echo ""; + echo "\n"; + echo " \n"; + echo "\n"; + + echo " "; + echo " "; + echo " "; + echo " "; + + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + + echo " "; + echo " "; + echo " "; + echo " "; + echo "
User Info
Username:$username
Password:
Confirm Password:
Groups:"; + + echo "\n"; + $sql = "SELECT * FROM v_group_users "; + $sql .= "where domain_uuid=:domain_uuid "; + $sql .= "and user_uuid=:user_uuid "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->bindParam(':domain_uuid', $domain_uuid); + $prep_statement->bindParam(':user_uuid', $user_uuid); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + $result_count = count($result); + foreach($result as $field) { + if (strlen($field['group_name']) > 0) { + echo "\n"; + echo " \n"; + echo " \n"; + echo "\n"; + } + } + echo "
".$field['group_name']."\n"; + if (permission_exists('group_member_delete') || if_group("superadmin")) { + echo " $v_link_label_delete\n"; + } + echo "
\n"; + + echo "
\n"; + $sql = "SELECT * FROM v_groups "; + $sql .= "where domain_uuid = '".$domain_uuid."' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + echo ""; + echo "\n"; + unset($sql, $result); + echo "
"; + + echo "
"; + echo "
"; + + echo ""; + echo " \n"; + echo " \n"; + echo " \n"; + + echo " "; + echo " "; + echo " "; + echo " "; + + if ($_SESSION['user_status_display'] == "false") { + //hide the user_status when it is set to false + } + else { + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + } + + //if the template has not been assigned by the superadmin + /* + if (strlen($_SESSION['domain']['template']['name']) == 0) { + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + } + */ + + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + + echo "
Additional Info
Contact:\n"; + $sql = " select contact_uuid, contact_organization, contact_name_given, contact_name_family from v_contacts "; + $sql .= " where domain_uuid = '".$_SESSION['domain_uuid']."' "; + $sql .= " order by contact_organization asc "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + unset ($prep_statement, $sql); + echo "\n"; + echo "
\n"; + echo "Assign a contact to this user account.\n"; + if (strlen($contact_uuid) > 0) { + echo " View\n"; + } + echo "
\n"; + echo " Status:\n"; + echo " \n"; + $cmd = "'".PROJECT_PATH."/app/calls_active/v_calls_exec.php?cmd=callcenter_config+agent+set+status+".$_SESSION['username']."@".$_SESSION['domain_name']."+'+this.value"; + echo " \n"; + echo "
\n"; + echo " Select a the user status.
\n"; + echo "
\n"; + echo " Template: \n"; + echo " \n"; + echo " \n"; + echo "
\n"; + echo " Select a template to set as the default and then press save.
\n"; + echo "
\n"; + echo " Time Zone: \n"; + echo " \n"; + echo " \n"; + echo "
\n"; + echo " Select the default time zone.
\n"; + echo "
"; + echo "
"; + + echo "
\n"; + echo ""; + echo " "; + echo " "; + echo " "; + echo "
"; + echo " "; + echo " "; + echo " "; + echo "
"; + + echo "
"; + echo "
"; + echo "
"; + +//include the footer + require_once "includes/footer.php"; + +?> \ No newline at end of file diff --git a/favicon.ico b/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..e0c7a830015a7132c130aea5933254cc1c15ccfa GIT binary patch literal 930 zcmV;T16}-yP)FMcty>MHm7yd4vC;xx)B)^An z&H(_NbAb@zDQs*E#;#rK*^ES5%Y}lG69S!Hzg53|d&J@M1q~L_2tljKgpAt_b6=k_Ky<7pOCW(;Co5&ts#bjR4MiU~NyOF2yOak##5xrej4E}Q-9HXNs1Omt>5+HWFsw9KjTC?3q*VMbo0r4&s*9}2M;a`8BH4jWZdi&SHEhMCjZxcckm z+o-TAlJ{hEb~!Ncj2>-vBNB%vp@<^f!^4PQxq@=JjI1bP=e7z>t3~MC{XxPx-}S}k zvsbeUVQHBoBvCBqIW&ekd_8P}tFj7<_X*659E1|OgQvzP)DHJDO7WD^ICid!0$A2J z=vTrC5!a(R{IOQRmY_wHY2nWr(EQk^V9_z`+_w)oL4fC#0kw4VJ1V#a7CGl(MhKB_ zuO`2m{_)n46w@Mb^m%0m4KoQIbK{=?$UZEfl%ivY z<=DFie81e74^e-j4ce~P)xu^y*8S7SE=6!JV?Z&dhxw)V&I=aDX-X*`s0;uggcMb^ zIu=?@&VGFOf~))3guIQbOx{dU&N&2YHw@j+t~5OT+BhLZdYHo_aL!T4m-|0_|J>Qj zKi{&QJU${dCoVBnmRXJ77%{(a;ME$9b`k#v=NytG@18pJ{huAq3GP2Tw<%t~Fn|G^!OqE5kqoiVRU6=Aa`kWXdp*PO;7+V00000 zC;%t`00Lixj~2`Ao}vV=)`^wfD`U=i6S#>IX_*mvsR;YHFWkrnUE37i>3nbd1#}u5 zac3m{j!Pwv`E(|IQR*~U#a?AiD-F7Jb+un<*$V@o$!YUiJceiGVUy6^X6LzaLjeFg DC%!(F literal 0 HcmV?d00001 diff --git a/images/blank.gif b/images/blank.gif new file mode 100644 index 0000000000000000000000000000000000000000..75b945d2553848b8b6f41fe5e24599c0687b8472 GIT binary patch literal 49 zcmZ?wbhEHbWMp7unE0RJ|Ns9C3=9Vj8~~DvKUo+V7?>DzfNY>Fh|Ltj$Y2csQN9XW literal 0 HcmV?d00001 diff --git a/images/icon_cal.gif b/images/icon_cal.gif new file mode 100644 index 0000000000000000000000000000000000000000..a9c7c87632beb35a723f4b8d34491b0f41892bcd GIT binary patch literal 646 zcmV;10(t#MNk%w1VGsZi0OolB9$6Tjb>ACnqNu7#P{v+57wZs;a8U$jH09yHZk8i;IhWeSP8K z;o92TMMXu!!^37~X4cl$?(XhtYHDI)Vmv%Nqobn^4i3D$ytcNspP!#_aBv|ZA+xiy z>+9>awYBo{^1Z#iQBhH@uCCqP-KnXm{r&xScX!dz(R6flN=iy&V`GhtjnL50US3`( zC@7ein00k^0|NtqfPnS&^@N0k?d|P&cz9`PX;f5HFfcGCCMG*OJL&1^;^N{-MV>$aJHk#FI{*Lx literal 0 HcmV?d00001 diff --git a/images/icon_e.gif b/images/icon_e.gif new file mode 100644 index 0000000000000000000000000000000000000000..29508006ff906ce7e78a10d35e8714935a207dd8 GIT binary patch literal 1106 zcmZ?wbhEHb6l4%&_`aFp+O=yJE?k&4ZQ7M9SN84Ock|}W7cXA;`};q5@Zk3C+xPF^ zfAZwX#*G^nE?g)rEzQTr_xbbZ>({SqYHI%f|KG>Q=luEe4<9~!`}S=|N5_E!8!leF zc=__>t5>hSeEBjXBjeVsTg#U(fAi+e`}gnn@88$m-I$P&ux;D&%a>1-mq*Q+)6CA! ze(c!JfB*jZ`+MHGb9>REMeEnk%gxQWbm@|wp02aA5f>NxxpU_>Y?%G--MiDLk7Z}a zmXs9t^%d^jyZ79=qcSq0PoF-~&`|pQ`N4e1_o~0G&d?L%E7^*uCDa#*|X8nUXhVbbLRB_`t>s+BBH!JQcO(j z!iA%Y7A>4VzwgSG%TZBoUS3}R|9`)6<3?3g)x?SU4Gj(V?_aRDw`XBtPEJlbbZ8S3 z6JtX|`Lt=1GBV;?TGG#+J@fwkJ3c1_KlO1)5yqBS6B1LkMA}%*4wu) z-LPT9rcHCMUA-zJBfE6TqQb)L1q-Hq`0)Pk-@pC+6%i337cXA8c=5#JM~{+{;x1e` z{_NSao}M0OXXl+eckbQ0rna_r^XAP#K|#H}`O3;t>FK`x{r$qi!XY6+K0e+_Nikcu zZoYEmLT+yE;>C;4oH@h5zyOS2AUW)T;!hSv28PWHIv}5d@&p6Ne};5Njth$gIU@9> zG>$ZRg^00kc4_!kpy)Lqs5L3kJ_hBb*cKa#M8k2aG;U2hGY>dYu{vhL$=zV z3GAc!c+&ZiwB5bbWBdZZ$HjT|uxTPTJ!z)o8d9{o)y3!2CSxj;aY$hE25xOk6 z`MyE`%R>)7_Dud`ROFZO+pa6q40H#{2-v9sr literal 0 HcmV?d00001 diff --git a/images/icon_e.png b/images/icon_e.png new file mode 100644 index 0000000000000000000000000000000000000000..5496ed3a23082bef867991fea3ef2a60578a3191 GIT binary patch literal 1009 zcmVPx#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2ipM& z3K9n&LO{>}00VJJL_t(I%Vm*INLvRS$3HK5c`qg!lSO(nArY*u#)^j={h|p{KwOy-8rg4x*=8c+F*?;?fE2VuT>;G&a_nyqFi4yyU&S z9mZt3FZ^!b?+3o$p8%li`h&f_y(fi2LDF@dYPE`Kn%K6DZQJ~-dc97iQlVHZBFi$9 zlat?v!{Kj5P1C+uUtfO`4u_>+Fo%f;bgj^E$BCKij$XR}#^ z)z#J4p-^Zz6bfOQCXGhpe-PWYDV0h%ole5xFsan9EG_*+y>6mu8jkJl?ctuD9;($U zXJ=>Vx=y81xp38Lm0T`II-RCmKIP@hB&pOZy1TnjRTc5*=m^6wFijJ~FsRq-G@DHT z1OeRc79`0KgZ6_4vj_)P17)p8e*wb!Zb}R%fhm({{RFeNkUP2ktCT~ z?Tm6cPpx)LG&+bNNVr@Q9*>M@7zVa&(`+^`>>$fBilX52wPV{h#o|8E=qKF1{TZg& z;N81CCnq|AfFJR47{KLnp(wrh{eDcdK|1{kO|wzeO#ntlMunqaGMNlh zQ&X4Q<8U|-i^U?QX|lcj8*6JX*x&z?laoB-) zmk`tGG^eMhJbLsEwr$bX)y1t_pArc4qU$=t!#9aUB4jcd78e&$6ot9DIeb1JD=RDL zdJX63=;(L(e4dGk3A|n}PN#?{ipa7|Ypa()pp!@>%GTBvs;Z)@Dn6f&>FH?(2D&K} z3J9rG>fzYf*wa`nhR5T1;EhI5DrI~=g)uU z{{62X3jo<{_TlX8?9+{n4GM(<4u^o-Ez#NOLs7cv@Bf%ksE2FUZs2f$rkxQtc@!0MH7heSbA4^CwY8DMDZ706Qv^XENCCr7>2$h8@(UJ= zU0U)Q48Kbx{FWB3!(rEGG}4})(9lq))9H5Wl*+EYKE>+lA2yqlZha<@$u2AsVNqVvbwrjRaIp& z>7G9qO-?$LO6B?UL^Ao@%F0S)WTeez>g|KzViULO6ygZo8AMY*{&m&+v-3Z>HS zl9Cb{jRrw#9*@`C+pEn>EJUKZT6&3Y*cek%k z>2f)_T<+bw6+=Tq)z!gn*P5G~mX>@blTj=dd%YI9Tr@DikBvR5)9F%DQam2FDd-u+ zI-Ojldb+&)XF|eBzu!-#Qa3j?9FE|y29IZAdU{%|R+p6(%z3Bze7;B|>gf@(*{tpD z?fLn67OQY`b8~ifHZ?W1rKKeh2w1IF004p_$p2Hszeb|~00Pdw&Hwfj044zZI75?P zM?LxC+e3-%HH3SF1JI@6_XsF-_1DMG85mq|eKYO|8Ut)d8SlI+NIWZN3P=YJHDVI8 zYYv8;z^adG8oI98YqCnuY~=W)V%h0ug+wyySIVjM!~Wq!uawNYSbwLuvJ)=+@G$4I zmrK7JD6G*OhkPJm9P;OZFU%smR1Uz=+)b5!IV&l??I=(i>`4V%l zpzppv=1pZ~65;dr+i&T0Jp74{Y|fikLME2@12YSeqny!c^zNHPaAE$dpD6_g{)QSq j_z4rD3r{Z7ojx8%x_UC5ux+v&!{GE+YQwY9XdwMR4>RzF literal 0 HcmV?d00001 diff --git a/images/icon_plus.png b/images/icon_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..1a3f39522fe6b8d8331dff7dd7d430bbe473da50 GIT binary patch literal 915 zcmV;E18n?>P)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2ipM& z3Jy6qQ~)Lb00R?AL_t(I%Waa+OIukK$3ORZO-x>+rfREB#HMW)GDNM2VHP6oBJ?ll zMrWoB6b2Vv1ZF+!?z*XE=*n>x-3mijLRTs11SDgHfD;^aQEh!m>Pz0w``(*P4HoAM zhjZ_N@0ai4dgOw+`+ZIn_(QA89)T)^`@+U+)tMuT`f&hql|AK7g7 zd)aI@H_GMm%H-rEQ&Up}LC_WWKSWW4Wm#-(ZBZx`Rt^ph5SyEuQ6`finM?xUI1WJ& z5Qbs5F8~Q)3n=dve_)I>wZO6N)d(uN(GFJ4D<5k z3-b9qLI~#O<|vg)$di*3Y}>|h9CTer*Y&P-r4*KBK@{Qn9`E1pA!UeZwg`d<$Fb>j zI>=V5h41?)r2r_G%b2G5#YqT+^k^_Kks+CkaqHGi5{X`H+eIm#o*oV9x-L-^5r!cE z>2w+)1VRXUdNhOpDFuCrJ|YB<9{oUXujJ#$PuRB2wQC7v7=~Y+a&K=B!#E=r>m`wh zGdQS|PV2;Cah^Q+8Gu)>UU1`v!gU?S#)gm=`v*Y)!0hY{mSrQQMl2@L^*G67jKjlE z?Ck6S;QNB{@gaQQC71i=s>tEtA-3Hio$jZjce{yyjD=NN`Ty-e+Lo zTjuBI0jN|eSk?jW-c|Vg*+x_WOOvm?c3wryZ0T{ z>OTO?%-rSe+dnCn|Kj=c-`)s-TCKKGDwS5Yx3@720{|feeSI;mUr&+AjBw}9IQjf6 p0LRDwGB7a8)2F|@86BPY@jpP;sNM;WIHUjo002ovPDHLkV1h|btLFd! literal 0 HcmV?d00001 diff --git a/images/icon_restart.gif b/images/icon_restart.gif new file mode 100644 index 0000000000000000000000000000000000000000..e49fbd73c29915da23e6af95042be61c76d005e2 GIT binary patch literal 1120 zcmcJO=}+1R06>34QM5RZs-=ltXWNw&0fYbvpkDj*(c z72|~jH?6g)%Z@A!YyXJ75AW;y^wQC&tFeSYAQ1R# z6M(^B2n1q%eO)9HIh{@t39HpAaX6gWY+hbo*6Vdfqmf7?R#a5*csve=6A=-yv$NaO z)TC0)=j7z*_4?xC;?U60{r!W~)KsU_m6@3t6BC0*qqnzrz+iBEe0+X>espv+gF$O- zEMHr*4h{~wTzf9p&dSQl>(@tWwOXsy9vvN_P$({!E0sz~q{{B@hOn>@0wKd-(AjLu z-Q5p49C~76Vqsw+5{Vic>pgq+RBUW)Qc@C$RE0z$`}+D!Cav9W-QISTmlr&EK+ew2 zG#Csd5`oKQ#l%FC$<;dDFH1`%HoJ#Tr}y;q3=MT-FxRM53J#Zi^JX3flaY{+AP@*7 z5;2)fcDvube7SDsj8}KcJ>(>oiRNvHyHF&Q`7tVzb!1x=jCM&4-4+zEps?_OG@&U$|dA;D(yF!6i8%DYb&jxp#X_Y(dl%#xw&$=?D+WD;cyfc6+s|gFxV*u zqt#?G*4Nhx1bmrHR$Yyoot+&R7>J9DW3!vzv$yxVPB$l$egEp!p~0{~CYRc5iy#mP z3WWjy;C8#;`~N2VA5RbfYyy`*gg!h0K-|D=VCoxa06aB(2GXHQ?_{Lk{&kXak_oi? zo%Vv-3E>5_VE@k{&72F({g1+)#WwQ4rcjhNR zurn8R6iV_X?#GBg`}Gp%$a>3_Agh^3D-9JP$~>!1gGiPsC@qTrnOfT}E2x52*ll~A zPi~#LR%lh|PxAAGO!ix$!N&RYi=Wl#H<2sB9-p|{DJlZ+aM@tX_sNbDx zUT;fQ2E?u_wo!tT9|PK5KXiRNT@&E-w=x8P3=+DZ>!08L_fPL{&V|+{zxDPXUGwcM zq7V$m&N4;si>Kg?FI#gl)OQILBjB$?!a6TwAuWD1pZu|!KJmyRva9qCg(1G@dU!rh i#5SJ@+=Q@CM2r7Wc!t1(vB~Fn*ExQ^H#|Loxc>ll+5?yX literal 0 HcmV?d00001 diff --git a/images/icon_start.gif b/images/icon_start.gif new file mode 100644 index 0000000000000000000000000000000000000000..09bb58fd43f6d5fce323eea6198e167f1bcef4f3 GIT binary patch literal 1119 zcmcJO?K9g40LOo+G#2#cd0AH*d9fMOa~4H{R6@j6^ekMLvW1d_qUxboJM$B%21y7* z9}@Lc4=LAKMa0mFj3AMpr!-kgBDT2FdN{l7cDG%|AFq6ckidRZ=MN^Yin2d;2ES zror%1uh-dZ|3*ee-n^MlrBd~JeMLnn2v*kCa!4dnNJvP1ef`nVkxXn1{z7 zceqsAClub1$@+G8-+~}064m1Ic%2Taso@d`gvrTCEY=?mw-X4s6B841`HvnR9u*Z8 zZEbA<0cZw;!RMEV#ckKGr%)&qoldu~F#i0x7zFdu($ccBu30Qw27~e5y?ab1V{mY= ztSq~)udlni)?_jXg~Eh{1dT>>c(~Wu*)=dA$<58(+WNh&u1>3+O-V^otCc}PLBqqt zznx&s$;rKSE3fK!b|w4rW!&Q8qD1mkEEaP(cgbWj4u=y6>W7AgAV`&&$)HfekVs@v zQI6GW-PkbA&CR_!VFQD~L`6l##E{0u#-vi2Ml;>f(Xq6&%;VjC_>k-A>AAVNrBY3k z$s`DZ&}cLWe$(9CTvvBnt9_A?K~t$Fc|6|uco&_1WoBktuV0|iXfm1H!NEbH7*Z;g zy}iBe?(dq-n=LIZI-Q!uV(stmL(p7wbaZQLD}#|~wQi@U)2&tujYidIe%juC-QO?r z^70ai!~_C9KR=(#y|cUf8jB4?AmA)k+Un|(P{=7Q&3^Odt=YWs=#dD8a^2W4tJN>; z?d?}r*HTkcJ32b)bo$7MjL#S3t1GRTKJA90+ zUQ+=5d~a6qci&6g06@y{Ddeh(6!x7LlP|3Iw|I*XH{d9j+ZVe&IP2Ml;2$1L5k`>( zh@Tb7TgJy}zb+rtCS|wS)7^bJer`n9W^{zW+xyQs;SWADnSm*wj|&*W0xKP%DOkYy z5w@>)#x`oi&hLirsrSym8gw+ayQ?6x0ps6G?w%)&6_1{wISsp-tLstDpn}(zm$Hfu zE=omRt$gAlh*0Je0~>g&XAusCjH}lMFFbJ^AVr05!GM|v_Cwg16^uNn$M=ijq=OYg tbK{lIOAHMF{QX`p${!Yf=(%sxqeBVz8>2sJB~!t3FaJSbLc(AG?mw0!{x|>t literal 0 HcmV?d00001 diff --git a/images/icon_stop.gif b/images/icon_stop.gif new file mode 100644 index 0000000000000000000000000000000000000000..922addc5ca6c5a27f4c6776448947662861f2191 GIT binary patch literal 1106 zcmchWTThw?06;%)^}e7^hjeLc)^1@lTeTW=1w{l3sW(uz;HV-ZmnhY^`Cv92DDyIH zkx|7)VO~15n5F8thznB@>(mbf0*bW?DwS5PZu+n;*}~dCvGZ_V&(pa<#HXc~MFCO3 zUrzu6fdGfY$z(DV3gz?psi~=piyFQDH;2P<=g!@&Ef)xa91e%e>=kb_8(0Fw8vc0`MAi&>Xm^^nb z&}=rx#>TSQY%)3D<#M4=NDKy}R4P#@l*KY1A0OlK?9*tJ?(Xi5jrE?M&XJK3nM{U6 zUVjZ5jY>&LVKOT^I_j)etI=q*Sj=&8agB|&4u?H6GgB-U+wBgi^lPnlQmGvC`OdPk zvZPWe7K@&qR#GUGnwrASPH|IH)1yanqfw*LXuV#qTCLsP_1Nv!wY9Z{1%pnfo0`%E z2M33ShR)1P@_5|7J~@p>TUweqJbbBAsqlFG#f$IM*O%<=Jp;ktOG`_;y1Lx%9kY3P zbaYfC`c@*5P^nal#i-Lg*xA|Z@0S!6JwZ zs>*DBoR;>X(`jB^wQ4luZEX!_XJ;Odr>>4iAmHV4xlq`s*XvhSi~s=me7@KIKS}sI z&<_Bf0Eus+Z=L``e1IC)Ui-88$G3m&v)fc7Q9@X)N_gp~?BbxX_!<-tlK}B2O-J8) zg?<187RP~UpY~_XU%e0%m*TWA3R*AUv*k$KALX~@NuIxYsA=+>q+Bk3NEr8I!Grpf z7fAj?rskW0ntytL=RxDNp=I>J-m`E;#9CrULFx@l5+|_({UYJY<0#f!@Ah|6M6fP4 zb(}(FRz$!)qa8uBFYUxgxhoh-2>O2Q-CXFsD_;z_XJg}kImbMYf&u5lBBRsh8SVMk zu!BT)09}yn2NO;A{9&IfsIsYgrzVo%t&pVd+y8#do3$r=4!K%{A-6hDH!eVvLWWrW z5Y+btxKAKx1yWcNo~LiTwuelp{j%00ECUuxhkkK`DwwMFjzm0rj9kolrZKc(D3k?DygM{Cs$x1} zIq~u10fRwBqhqny6p=`%*J~w`7jQV-Vp*xItmN~-t}b4C`%ATYxTmLQadDPJBHg)j zV`sBdT?;yayfK5Eua6AOeWdwdkF~%uU?5D5J+BLnq1zyzyHtX=4N_& z`ttI!TCJX*o;Dg6O{Tw#i;K}{wAE_W>-BUxU8~jVbUG@9GBGj1VzIWiw!AOE3Y<@N5JX>6>Y$K#EUciU{X?rs4H zg7fo}6bgA^VZmmzj*X3da5zd!aXULZ2E#%~Nbu~ennt6>#KcIY5*Q4&wzjNLD4LpB z7R#*FYN@FBRjC}*XyiuYti@s$i;0DW1yU&+fk1e8xR;caaJj6G4#MuPEg&EuH#Y|a zaU2f2uI~5sb;H}Y%Duh4x;nf@GfpBAIGjHQ1_roX?%?2HQBe^dkFTx83j_iH06xv& zQ~u9|J3Sx(paP;UdR}}2fVzN&N(jA8QIqfEdHdQgx6@=-RB+6(1_^>+c>%u1KUHM_ z@%>*HAi)>kUGl#ctijbpCV~Kz5KZe#s;!QuWC;V6?VpDS!cv~SzxqQGK0Y)QH{(m7 zd~tUmT_LI3^(6QtU(b1j1d*XP^Qt%Pr>K zQaI@kTL|^F-a+*b8zcx^rkA`X>u%05{7^Umz0#>JaF(}x20pC@pCo1uA5tT!jZwk= z+DF2~U=;TLU(pc%rkHSqf%Ya}-{t5}29TRKwY(tlYv7)8JmJr8+9Ng~Aw0x0{0(A? S1%D|(Jy9PS1^W2{@&5rL=>t;$ literal 0 HcmV?d00001 diff --git a/images/icon_view.gif b/images/icon_view.gif new file mode 100644 index 0000000000000000000000000000000000000000..d11a5f00c8529612a30e845c663880f122917c85 GIT binary patch literal 1109 zcmdUuTThw?0ERz=mV$)Tx-eNZ%S=^fjXLJ$I!&ajh04r4lnWPYCn;U&>XL3Y%VKH- zDju8QqzVH^Kr%ou2nyn~U=jJi1JzGKtX7SOsFW%K#ifxjFgm=%+Jq{kB_&twOOrJCX-2{(eU_Kx7$@# zRtAH?G@3ul%fD4B6?8har>9A+mSeHllamvvRJydZq*N+*b~aHcl*a>sAh_~k!EDw) zd*&)EEF=<%!^5VoF5%R#baZ%lh(@D59w!7r4Gr9tl@*;%Ad#@TySptG zwMwPR&(BX!Ppqx2t*)*X3Wect*yEWV8hTqK2f?RQDpjd$_WO52p&+0Cptbd9JU%Wb zC);Gw2n2$T4*o%4AA`a8{Vy{!Gkv~YE|=@``JO+Y>+I|#5Tcv7z^r$5#hbWPV7Z(@BVlkiJURTE)7#Q&T z{bOTe8yg#Lx7%zs-@Z-n=xAdw7=wd@y}i8)3kx_LPOH`GbbS!ya5|j_fq=td@9!Tl z8jV)#U$0(y*4JI(P;g>mf=0VqQ9<6?THf8=m~c9fNF)LQhoCVMiKI|S1A%=G=e}OA zpPHI-I2^01t8%$~dU`q%i2wlbAK%LVdLO+(zyQDkq`j+n_X*%k1gO2(TzrQeT|quW zsA5#2K7d(Xl29xXk99rnQ!G@;x^}7@6@>tF(NP5ak6)%0Ka3VMV(JmhgY}eicmy9o zlit5{O_}vwZq=||L&zX;zG}wb0}Er}=6roG7nAdT{a?@>EKCC9!6J@>^FaeR%X2mVYumuAf?_=6)^s h=lCe;kC2^7#hrc7%efNMl=&1u)6UYV@h}*W^DiFE;70%e literal 0 HcmV?d00001 diff --git a/images/icon_x.gif b/images/icon_x.gif new file mode 100644 index 0000000000000000000000000000000000000000..24e4d492978b7ac24bd3819106c3d7055e43601c GIT binary patch literal 1111 zcmdUu?^BWo0LLGkJEZd$mFQ;MMK4;YTg&rUR*r5mnA6iVo^s|&Pd)WEJS5jPQhS)p zTj?fDGj) z@lUB#+SJqpf?!=;9fld&+uJKEZt=QODq42Avr6m-d zTUl8)o6RQESX2~6AP~6SZX6B=K_wE2M6FiC@Xsoh3WjTKHe`HUSzKJay1H`Z%0&!w z*4NjgsG+g3kPfVOUwHDdSPMV_V(7)l%7B!n9a`@7oR00 z#D|52xm?z)tPHEw0zpt$S64|%$==>xRn<2jNP}VCrArsY;>Ni-qevvm%*>=xsc~`d z9UL5FXJ=U~78G5$aU*GDWQ51#`FuVA0RH2@^8X$Al|K#uG(gPjgx8+{0(`(73M6w1 z{DG!Jr|2y@=7SJT)=#Az7eopOKeX`|r$Y#QaVy}0n3DsZriyrE&KQOxWFIlnFM@3k z!pXAiF;V(X z_yrti24(KV<>5{;I7j)pU^E{}Isd*bfKJf%P+Oh@TKL%qN2I@$wc%uBZO^GU;s7M~ zs-K_#ZIamGnz{<%B;VhEMLvGNA;_OQqa9WEpT2(WhtIfL86QuBs~hfp`nbRO%bIRh zJcmD8bMB$M7uZD4ocNe}xXbC+d6)PWd@bZdR_iC?kCGS(aoi`-fPzT*F1~sOIQnDi rJ0-uFtDI>eQ9Z$TBl=gvamj7vB0k}!Zs+sph#Xn+yTVXnC~*ECrpxAC literal 0 HcmV?d00001 diff --git a/images/icon_x.png b/images/icon_x.png new file mode 100644 index 0000000000000000000000000000000000000000..eb08bf4a4f774db9fbe05296f10bd62ca5275e4e GIT binary patch literal 1045 zcmV+w1nT>VP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2ipM& z3JWL^3-QC@VN~MBf7?`Gs>$(I%KoA5Rk8RsDn@y_KDs63T%+JsN zmP)0rhikRk!>z5Yh2Gv?`uh54wORy0fbaVhi$%)iGRb6;o}L~wO+yGlv)N>QeVys) z>4id}fO78KxwW329srWbB=LBhM~@z1nkHASTp=Ehv$?s+yLa!fZ5ts3ilUH6Brr{r z$B!RRD5ImJ%jeIZXJBA}N~OZa#s-_4o9ylFk;!CGRh9Aaar*oFIXF1r*|R?oLc#Za zqR}X;tE-5^!$YK$0Gv5aomA=y^iBJNGXxh z!nQ4>G|A=i=(>)s>%4zo=ksTuJ9mCT*L6O9YB4eK72#t<2tmDG2S7>--*>TX$K~8Cxp?s+;c$SeDu`;e zitD;`c6O4@W?5bRnO3WXloH#vF${~_w|^p^&z~U0Vi8@}DV1CzkuOlH)#~!KYu9ib zhohq-UcA`g$&)n{#ban_jQjV0<-vmoClS)=G%sJiq+Bjz7zXL|w|T) z;<_#Xp6BxM;{l~oflOwOd_K?O;v$zWeZ$B|lJ4#l<#L&ol@;pseL}BazrLGJr*Eax zX;P^ap66m&CcbZ>X$sTRlMD`iO|AAXwb~wv5+)WKCK^q$yZbj6F3jEw0Tc>_yGu(; zw{p20<#L%*r^0l0YIJp-rn~zzkw^!ss&M>TG_8Y?kx_2m{NY|KHvHp%?DWcoc;N~6 P00000NkvXXu0mjf^-1@D literal 0 HcmV?d00001 diff --git a/includes/calendar_lw_layers.js b/includes/calendar_lw_layers.js new file mode 100644 index 0000000000..6154cc9190 --- /dev/null +++ b/includes/calendar_lw_layers.js @@ -0,0 +1,189 @@ +// written by Tan Ling Wee +// last updated 20 June 2003 +// email : fuushikaden@yahoo.com + +////////////////////////////////////////////////////////////////////////////////// +// Layers +////////////////////////////////////////////////////////////////////////////////// + +var layerQueue=new Array() +var layerIndex=-1 + +/* hides and objects (for IE only) +*/ +function showElement( elmID ) +{ + if( ie ) + { + for( i = 0; i < document.getElementsByTagName( elmID ).length; i++ ) + { + obj = document.getElementsByTagName( elmID )[i]; + + if( !obj || !obj.offsetParent ) + { + continue; + } + + obj.style.visibility = ""; + } + } +} + +function lw_createLayer (layerName, top_pos, left_pos, width, height, bgcolor, bordercolor, z_index) { + document.write("") +} + +function lw_getObj (objName) { + return (dom)?document.getElementById(objName).style:ie?eval("document.all."+objName) :eval("document."+objName) +} + +function lw_showLayer (layerName) { + + found=false + for (i=0;i<=layerIndex;i++) + { + if (layerQueue[i]==layerName) + { + found=true + } + } + + if ((lw_getObj(layerName).visibility!="visible")&&(lw_getObj(layerName).visibility!="show")) + { + lw_getObj(layerName).visibility = (dom||ie)?"visible":"show" + layerQueue[++layerIndex] = layerName + + hideElement( 'SELECT', document.getElementById(layerName) ); + hideElement( 'APPLET', document.getElementById(layerName) ); + } +} + +function lw_hideLayer () { + showElement( 'SELECT', document.getElementById(layerQueue[layerIndex]) ); + showElement( 'APPLET', document.getElementById(layerQueue[layerIndex]) ); + + lw_getObj(layerQueue[layerIndex--]).visibility = "hidden" +} + +function lw_hideLayerName (layerName) { + var i + var tmpQueue=new Array() + var newIndex=-1 + + showElement( 'SELECT', document.getElementById(layerName) ); + showElement( 'APPLET', document.getElementById(layerName) ); + + lw_getObj(layerName).visibility = "hidden" + + for (i=0;i<=layerIndex;i++) + { + if ((layerQueue[i]!="")&&(layerQueue[i]!=layerName)) + { + tmpQueue [++newIndex] = layerQueue[i] + hideElement( 'SELECT', document.getElementById(layerQueue[i]) ); + hideElement( 'APPLET', document.getElementById(layerQueue[i]) ); + } + + } + + layerQueue = tmpQueue + layerIndex = newIndex +} + +function lw_closeAllLayers() { + while (layerIndex >= 0) + { + lw_hideLayer() + } +} + +function lw_closeLastLayer() { + if (layerIndex >= 0) + { + while ((lw_getObj(layerQueue[layerIndex]).visibility!="visible") && (layerIndex>0)) + { + layerIndex--; + } + lw_hideLayer() + } +} + +function lw_escLayer (e) { + if (navigator.appName=="Netscape") + { + var keyCode = e.keyCode?e.keyCode:e.which?e.which:e.charCode; + if ((keyCode==27)||(keyCode==1)) + { + lw_closeLastLayer() + } + } + else + if ((event.keyCode==0)||(event.keyCode==27)) + { + lw_closeLastLayer() + } +} + + +var lw_leftpos = 0 +var lw_toppos = 0 +var lw_width = 0 +var lw_height = 0 + +function lw_calcpos(obj) { + lw_leftpos=0 + lw_toppos=0 + lw_width = obj.offsetWidth + lw_height = obj.offsetHeight + + var aTag = obj + do { + lw_leftpos += aTag.offsetLeft; + lw_toppos += aTag.offsetTop; + aTag = aTag.offsetParent; + } while(aTag.tagName!="BODY"); +} + +document.onkeypress = lw_escLayer; +document.onclick = lw_closeAllLayers; diff --git a/includes/calendar_lw_menu.js b/includes/calendar_lw_menu.js new file mode 100644 index 0000000000..91ff20331a --- /dev/null +++ b/includes/calendar_lw_menu.js @@ -0,0 +1,376 @@ +// written by Tan Ling Wee +// last updated 20 June 2003 +// email : fuushikaden@yahoo.com + +var orientation=0 // 0-horizontal 1-vertical +var imgPath = "js/" + +var mainItemForeground = "#000000" +var mainItemBorder = "#f0f0f0" +var mainItemBackground = "#f0f0f0" + +var mainItemHoverForeground = "#000000" +var mainItemHoverBorder = "#a0a0a0" +var mainItemHoverBackground = "#d0d0d0" + +var subItemForeground = "#000000" +var subItemBorder = "#ffffff" +var subItemBackground = "#ffffff" + +var subItemHoverForeground = "#000000" +var subItemHoverBorder = "#a0a0a0" +var subItemHoverBackground = "#d0d0d0" + +var menuFont = "verdana" +var menuSize = "11px" + + +///////////////////////////////////////////////////////////////////////////// + +var ie=(navigator.appName=='Microsoft Internet Explorer') +var ns=(navigator.appName=='Netscape') +var dom=document.getElementById +var lw_menuId, lw_trigger, to1 +var s1 + +///////////////////////////////////////////////////////////////////////////// + +function Tmenu (id, parentId, url, description, img) { + this.id = id + this.parentId = parentId + this.url = url + this.description = description + this.numChild = 0 + this.levelId = 0 + this.img = img +} + +///////////////////////////////////////////////////////////////////////////// + +var menu = new Array() +var menuCounter = 0 +var numLevel = 0 +var prevMenuId = -1 +var nNowAt = 0 + +function displayMenuItem(menuId) { + var sHTML + + if (menu[menuId].parentId>0) + { + ItemForeground = subItemForeground + Border = subItemBorder + Background = subItemBackground + + HoverForeground = subItemHoverForeground + HoverBorder = subItemHoverBorder + HoverBackground = subItemHoverBackground + } + else + { + ItemForeground = mainItemForeground + Border = mainItemBorder + Background = mainItemBackground + + HoverForeground = mainItemHoverForeground + HoverBorder = mainItemHoverBorder + HoverBackground = mainItemHoverBackground + } + + if ((orientation==1)||(menu[menuId].levelId>0)) + { + sHTML += "" + } + + if (menu[menuId].description!='-') + { + sHTML = "" + + if (menu[menuId].levelId>0) + { + sHTML += "" + } + + if ((orientation==0) && (menu[menuId].levelId==0)) + { + nArrowWidth = 0 + } + else + { + nArrowWidth = 25 + } + + sHTML += "
" + menu[menuId].description.replace(" "," ") + "" + if (menu[menuId].numChild>0) + { + if ((orientation==0)&&(menu[menuId].levelId==0)) + { + sHTML += "" + } + else + { + sHTML += "" + } + } + else + { + sHTML += " " + } + sHTML += "
" + } + else + { + sHTML = "" + } + + if ((orientation==1)||(menu[menuId].levelId>0)) + { + sHTML += "" + } + return sHTML +} + +function clearAll(levelId, parentId) { + + if (levelId>0) + { + Border = subItemBorder + Background = subItemBackground + } + else + { + Border = mainItemBorder + Background = mainItemBackground + } + + for (i=0;i0) + { + lw_calcpos(trigger) + + for (var i=0;i0)) + { + lw_getObj("menu_level_"+nLevel).top=lw_toppos + leftpos = lw_leftpos + lw_width + 5 + + if (nLevel==0) { + leftpos -= 3 + } + } + else { + lw_getObj("menu_level_"+nLevel).top = lw_toppos + lw_height + 2 + leftpos = lw_leftpos + } + + lw_getObj("menu_level_"+nLevel).left=leftpos + + sHTML = "" + for (var i=0;i" + } + } + sHTML += "
" + menu[i].description + "
" + + document.writeln(sHTML) + +} + +function getLevel (menuId) { + var pId=menuId + var nLevel=0 + + while (pId!=0) + { + nLevel++ + for (var i=0;i0) + { + for (i=0;i and objects (for IE only) */ + function hideElement( elmID, overDiv ) + { + if( ie ) + { + for( i = 0; i < document.all.tags( elmID ).length; i++ ) + { + obj = document.all.tags( elmID )[i]; + if( !obj || !obj.offsetParent ) + { + continue; + } + + // Find the element's offsetTop and offsetLeft relative to the BODY tag. + objLeft = obj.offsetLeft; + objTop = obj.offsetTop; + objParent = obj.offsetParent; + + while( objParent.tagName.toUpperCase() != "BODY" ) + { + objLeft += objParent.offsetLeft; + objTop += objParent.offsetTop; + objParent = objParent.offsetParent; + } + + objHeight = obj.offsetHeight; + objWidth = obj.offsetWidth; + + if(( overDiv.offsetLeft + overDiv.offsetWidth ) <= objLeft ); + else if(( overDiv.offsetTop + overDiv.offsetHeight ) <= objTop ); + else if( overDiv.offsetTop >= ( objTop + objHeight )); + else if( overDiv.offsetLeft >= ( objLeft + objWidth )); + else + { + obj.style.visibility = "hidden"; + } + } + } + } + + /* + * unhides ") + //document.write (""); + } + + var monthName = new Array("January","February","March","April","May","June","July","August","September","October","November","December") + var monthName2 = new Array("JAN","FEB","MAR","APR","MAY","JUN","JUL","AUG","SEP","OCT","NOV","DEC") + if (startAt==0) + { + dayName = new Array ("Sun","Mon","Tue","Wed","Thu","Fri","Sat") + } + else + { + dayName = new Array ("Mon","Tue","Wed","Thu","Fri","Sat","Sun") + } + var styleAnchor="text-decoration:none;color:black;" + var styleLightBorder="border-style:solid;border-width:1px;border-color:#a0a0a0;" + + function swapImage(srcImg, destImg){ + if (ie) { document.getElementById(srcImg).setAttribute("src",imgDir + destImg) } + } + + function init() { + if (!ns4) + { + if (!ie) { yearNow += 1900 } + + crossobj=(dom)?document.getElementById("calendar").style : ie? document.all.calendar : document.calendar + hideCalendar() + + crossMonthObj=(dom)?document.getElementById("selectMonth").style : ie? document.all.selectMonth : document.selectMonth + + crossYearObj=(dom)?document.getElementById("selectYear").style : ie? document.all.selectYear : document.selectYear + + monthConstructed=false; + yearConstructed=false; + + if (showToday==1) + { + document.getElementById("lblToday").innerHTML = todayString + " "+dayName[(today.getDay()-startAt==-1)?6:(today.getDay()-startAt)]+", " + dateNow + " " + monthName[monthNow].substring(0,3) + " " + yearNow + "" + } + + sHTML1="   " + sHTML1+="   " + sHTML1+=" " + sHTML1+=" " + + document.getElementById("caption").innerHTML = sHTML1 + + bPageLoaded=true + } + } + + function hideCalendar() { + crossobj.visibility="hidden" + if (crossMonthObj != null){crossMonthObj.visibility="hidden"} + if (crossYearObj != null){crossYearObj.visibility="hidden"} + + showElement( 'SELECT' ); + showElement( 'APPLET' ); + } + + function padZero(num) { + return (num < 10)? '0' + num : num ; + } + + function constructDate(d,m,y) + { + sTmp = dateFormat + sTmp = sTmp.replace ("dd","") + sTmp = sTmp.replace ("d","") + sTmp = sTmp.replace ("",padZero(d)) + sTmp = sTmp.replace ("",d) + sTmp = sTmp.replace ("mmmm","

") + sTmp = sTmp.replace ("mmm","") + sTmp = sTmp.replace ("mm","") + sTmp = sTmp.replace ("m","") + sTmp = sTmp.replace ("",m+1) + sTmp = sTmp.replace ("",padZero(m+1)) + sTmp = sTmp.replace ("",monthName[m]) + sTmp = sTmp.replace ("

",monthName2[m]) + sTmp = sTmp.replace ("yyyy",y) + return sTmp.replace ("yy",padZero(y%100)) + } + + function closeCalendar() { + var sTmp + + hideCalendar(); + ctlToPlaceValue.value = constructDate(dateSelected,monthSelected,yearSelected) + } + + /*** Month Pulldown ***/ + + function StartDecMonth() + { + intervalID1=setInterval("decMonth()",80) + } + + function StartIncMonth() + { + intervalID1=setInterval("incMonth()",80) + } + + function incMonth () { + monthSelected++ + if (monthSelected>11) { + monthSelected=0 + yearSelected++ + } + constructCalendar() + } + + function decMonth () { + monthSelected-- + if (monthSelected<0) { + monthSelected=11 + yearSelected-- + } + constructCalendar() + } + + function constructMonth() { + popDownYear() + if (!monthConstructed) { + sHTML = "" + for (i=0; i<12; i++) { + sName = monthName[i]; + if (i==monthSelected){ + sName = "" + sName + "" + } + sHTML += " " + sName + " " + } + + document.getElementById("selectMonth").innerHTML = "" + sHTML + "
" + + monthConstructed=true + } + } + + function popUpMonth() { + constructMonth() + crossMonthObj.visibility = (dom||ie)? "visible" : "show" + crossMonthObj.left = parseInt(crossobj.left) + 50 + crossMonthObj.top = parseInt(crossobj.top) + 26 + + hideElement( 'SELECT', document.getElementById("selectMonth") ); + hideElement( 'APPLET', document.getElementById("selectMonth") ); + } + + function popDownMonth() { + crossMonthObj.visibility= "hidden" + } + + /*** Year Pulldown ***/ + + function incYear() { + for (i=0; i<7; i++){ + newYear = (i+nStartingYear)+1 + if (newYear==yearSelected) + { txtYear = " " + newYear + " " } + else + { txtYear = " " + newYear + " " } + document.getElementById("y"+i).innerHTML = txtYear + } + nStartingYear ++; + bShow=true + } + + function decYear() { + for (i=0; i<7; i++){ + newYear = (i+nStartingYear)-1 + if (newYear==yearSelected) + { txtYear = " " + newYear + " " } + else + { txtYear = " " + newYear + " " } + document.getElementById("y"+i).innerHTML = txtYear + } + nStartingYear --; + bShow=true + } + + function selectYear(nYear) { + yearSelected=parseInt(nYear+nStartingYear); + yearConstructed=false; + constructCalendar(); + popDownYear(); + } + + function constructYear() { + popDownMonth() + sHTML = "" + if (!yearConstructed) { + + sHTML = "-" + + j = 0 + nStartingYear = yearSelected-3 + for (i=(yearSelected-3); i<=(yearSelected+3); i++) { + sName = i; + if (i==yearSelected){ + sName = "" + sName + "" + } + + sHTML += " " + sName + " " + j ++; + } + + sHTML += "+" + + document.getElementById("selectYear").innerHTML = "" + sHTML + "
" + + yearConstructed = true + } + } + + function popDownYear() { + clearInterval(intervalID1) + clearTimeout(timeoutID1) + clearInterval(intervalID2) + clearTimeout(timeoutID2) + crossYearObj.visibility= "hidden" + } + + function popUpYear() { + var leftOffset + + constructYear() + crossYearObj.visibility = (dom||ie)? "visible" : "show" + leftOffset = parseInt(crossobj.left) + document.getElementById("spanYear").offsetLeft + if (ie) + { + leftOffset += 6 + } + crossYearObj.left = leftOffset + crossYearObj.top = parseInt(crossobj.top) + 26 + } + + /*** calendar ***/ + function WeekNbr(n) { + // Algorithm used: + // From Klaus Tondering's Calendar document (The Authority/Guru) + // hhtp://www.tondering.dk/claus/calendar.html + // a = (14-month) / 12 + // y = year + 4800 - a + // m = month + 12a - 3 + // J = day + (153m + 2) / 5 + 365y + y / 4 - y / 100 + y / 400 - 32045 + // d4 = (J + 31741 - (J mod 7)) mod 146097 mod 36524 mod 1461 + // L = d4 / 1460 + // d1 = ((d4 - L) mod 365) + L + // WeekNumber = d1 / 7 + 1 + + year = n.getFullYear(); + month = n.getMonth() + 1; + if (startAt == 0) { + day = n.getDate() + 1; + } + else { + day = n.getDate(); + } + + a = Math.floor((14-month) / 12); + y = year + 4800 - a; + m = month + 12 * a - 3; + b = Math.floor(y/4) - Math.floor(y/100) + Math.floor(y/400); + J = day + Math.floor((153 * m + 2) / 5) + 365 * y + b - 32045; + d4 = (((J + 31741 - (J % 7)) % 146097) % 36524) % 1461; + L = Math.floor(d4 / 1460); + d1 = ((d4 - L) % 365) + L; + week = Math.floor(d1/7) + 1; + + return week; + } + + function constructCalendar () { + var aNumDays = Array (31,0,31,30,31,30,31,31,30,31,30,31) + + var dateMessage + var startDate = new Date (yearSelected,monthSelected,1) + var endDate + + if (monthSelected==1) + { + endDate = new Date (yearSelected,monthSelected+1,1); + endDate = new Date (endDate - (24*60*60*1000)); + numDaysInMonth = endDate.getDate() + } + else + { + numDaysInMonth = aNumDays[monthSelected]; + } + + datePointer = 0 + dayPointer = startDate.getDay() - startAt + + if (dayPointer<0) + { + dayPointer = 6 + } + + sHTML = "" + + if (showWeekNumber==1) + { + sHTML += "" + } + + for (i=0; i<7; i++) { + sHTML += "" + } + sHTML +="" + + if (showWeekNumber==1) + { + sHTML += "" + } + + for ( var i=1; i<=dayPointer;i++ ) + { + sHTML += "" + } + + for ( datePointer=1; datePointer<=numDaysInMonth; datePointer++ ) + { + dayPointer++; + sHTML += "" + if ((showWeekNumber==1)&&(datePointer" + } + } + } + + document.getElementById("content").innerHTML = sHTML + document.getElementById("spanMonth").innerHTML = " " + monthName[monthSelected] + " " + document.getElementById("spanYear").innerHTML = " " + yearSelected + " " + } + + function popUpCalendar(ctl, ctl2, format) { + var leftpos=0 + var toppos=0 + + if (bPageLoaded) + { + if ( crossobj.visibility == "hidden" ) { + ctlToPlaceValue = ctl2 + dateFormat=format; + + formatChar = " " + aFormat = dateFormat.split(formatChar) + if (aFormat.length<3) + { + formatChar = "/" + aFormat = dateFormat.split(formatChar) + if (aFormat.length<3) + { + formatChar = "." + aFormat = dateFormat.split(formatChar) + if (aFormat.length<3) + { + formatChar = "-" + aFormat = dateFormat.split(formatChar) + if (aFormat.length<3) + { + // invalid date format + formatChar="" + } + } + } + } + + tokensChanged = 0 + if ( formatChar != "" ) + { + // use user's date + aData = ctl2.value.split(formatChar) + + for (i=0;i<3;i++) + { + if ((aFormat[i]=="d") || (aFormat[i]=="dd")) + { + dateSelected = parseInt(aData[i], 10) + tokensChanged ++ + } + else if ((aFormat[i]=="m") || (aFormat[i]=="mm")) + { + monthSelected = parseInt(aData[i], 10) - 1 + tokensChanged ++ + } + else if (aFormat[i]=="yyyy") + { + yearSelected = parseInt(aData[i], 10) + tokensChanged ++ + } + else if (aFormat[i]=="mmm") + { + for (j=0; j<12; j++) + { + if (aData[i]==monthName[j]) + { + monthSelected=j + tokensChanged ++ + } + } + } + else if (aFormat[i]=="mmmm") + { + for (j=0; j<12; j++) + { + if (aData[i]==monthName2[j]) + { + monthSelected=j + tokensChanged ++ + } + } + } + } + } + + if ((tokensChanged!=3)||isNaN(dateSelected)||isNaN(monthSelected)||isNaN(yearSelected)) + { + dateSelected = dateNow + monthSelected = monthNow + yearSelected = yearNow + } + + odateSelected=dateSelected + omonthSelected=monthSelected + oyearSelected=yearSelected + + aTag = ctl + do { + aTag = aTag.offsetParent; + leftpos += aTag.offsetLeft; + toppos += aTag.offsetTop; + } while(aTag.tagName!="BODY"); + + crossobj.left = fixedX==-1 ? ctl.offsetLeft + leftpos : fixedX + crossobj.top = fixedY==-1 ? ctl.offsetTop + toppos + ctl.offsetHeight + 2 : fixedY + constructCalendar (1, monthSelected, yearSelected); + crossobj.visibility=(dom||ie)? "visible" : "show" + + hideElement( 'SELECT', document.getElementById("calendar") ); + hideElement( 'APPLET', document.getElementById("calendar") ); + + bShow = true; + } + else + { + hideCalendar() + if (ctlNow!=ctl) {popUpCalendar(ctl, ctl2, format)} + } + ctlNow = ctl + } + } + + document.onkeypress = function hidecal1 () { + if (event.keyCode==27) + { + hideCalendar() + } + } + document.onclick = function hidecal2 () { + if (!bShow) + { + hideCalendar() + } + bShow = false + } + + if(ie) + { + init() + } + else + { + window.onload=init + } diff --git a/includes/captcha/config.php b/includes/captcha/config.php new file mode 100644 index 0000000000..cef6fe3f95 --- /dev/null +++ b/includes/captcha/config.php @@ -0,0 +1,108 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +$pathtofonts = "/captcha/fonts/"; //path from the root of the website + +/* +//How to use this Captcha + + //Option1: add this to the html form +
" + weekString + ""+ dayName[i]+"
" + WeekNbr(startDate) + "  " + sStyle=styleAnchor + if ((datePointer==odateSelected) && (monthSelected==omonthSelected) && (yearSelected==oyearSelected)) + { sStyle+=styleLightBorder } + + sHint = "" + for (k=0;k " + datePointer + " "} + else if (dayPointer % 7 == (startAt * -1)+1) + { sHTML += " " + datePointer + " " } + else + { sHTML += " " + datePointer + " " } + + sHTML += "" + if ((dayPointer+startAt) % 7 == startAt) { + sHTML += "
+ + + + + + + +
Please type the code you see from the image into the text box below.
+ + //Option2: or add this to the html form +
+ + + + + + + + + + + +
Please enter the text you see from the image below...
Click for a new image.

Can't read the image text? Click the image for a new one.
+
+ + //add this to the top of the page where the form is submitted to + + //--- begin captcha verification --------------------- + //session_start(); //make sure sessions are started + if (strtolower($_SESSION["captcha"]) != strtolower($_REQUEST["captcha"]) || strlen($_SESSION["captcha"]) == 0) { + + echo " Sorry!\n"; + //echo "

\n"; + //echo "\n"; + //echo " Your e-mail was NOT sent.\n"; + echo "

\n"; + echo " Error: Captcha Image Verification Failed
\n"; + echo " \n"; + echo "

\n"; + echo " Try Again?"; + + exit; + } + else { + //echo "verified"; + } + //--- end captcha verification ----------------------- + +//notes + A diverse collection of unique fonts can improve the captcha. + If bots get past the captcha try changing fonts. + + Ideas that may be implemented in the future... + 1. randomize the background with texture, color and/or gradient + 2. distort the image + 3. rotate the characters with different rotations. + 4. use audio, svg, or flash + +//additional fonts can be obtained from + http://simplythebest.net/fonts/ + http://www.1001freefonts.com/afonts.htm + +//Usefull Links + http://sam.zoy.org/pwntcha/ + http://en.wikipedia.org/wiki/Captcha + +*/ + + + +?> diff --git a/includes/captcha/fonts/ROUGD.TTF b/includes/captcha/fonts/ROUGD.TTF new file mode 100644 index 0000000000000000000000000000000000000000..81cb3086c5c26d84cd41481290a341f15ad84927 GIT binary patch literal 65036 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 ky|QuLM4JD$n=9LM)9LYfgs&@`UZ?T&Io8- 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

u;b9RYSmCl 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 literal 0 HcmV?d00001 diff --git a/includes/captcha/img.php b/includes/captcha/img.php new file mode 100644 index 0000000000..f92bda8f57 --- /dev/null +++ b/includes/captcha/img.php @@ -0,0 +1,123 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "config.php"; +error_reporting(E_ALL ^ E_NOTICE ^ E_WARNING ); //hide notices and warnings +session_start(); + + +// Captcha verification image ----------------------- +// Description this page is used to verify the captcha + +$_SESSION["captcha"] = substr(md5(date('r')), 0, 6); +$text = $_SESSION["captcha"]; +//echo $text; +exit; + + +function isfile($filename) { + if (@filesize($filename) > 0) { return true; } else { return false; } +} + +function dircontents($dir) { + clearstatcache(); + $htmldirlist = ''; + $htmlfilelist = ''; + $dirlist = opendir($dir); + while ($file = readdir ($dirlist)) { + if ($file != '.' && $file != '..') { + $newpath = $dir.'/'.$file; + $level = explode('/',$newpath); + + if (is_dir($newpath)) { + //do nothing + } + else { + $mod_array[] = end($level); + } + } + } + + closedir($dirlist); + return $mod_array; +} + +$fontarray = dircontents($pathtofonts); +//print_r($fontarray); + +function make_seed() +{ + list($usec, $sec) = explode(' ', microtime()); + return (float) $sec + ((float) $usec * 100000); +} +srand(make_seed()); +$random = (rand()%count($fontarray)); +$font = $pathtofonts.$fontarray[$random]; +//echo $font; + +//echo phpinfo(); +//exit; + +$fontsize = 16; +if(@$_GET['fontsize']) { + $fontsize = $_GET['fontsize']; +} + +//picked up from a note at http://www.php.net/imagettfbbox +function imagettfbbox_custom($size, $angle, $font, $text) { + $dummy = imagecreate(1, 1); + $black = imagecolorallocate($dummy, 0, 0, 0); + $bbox = imagettftext($dummy, $size, $angle, 0, 0, $black, $font, $text); + imagedestroy($dummy); + return $bbox; +} + + +// Create the image +$size = imagettfbbox_custom($fontsize, 0, $font, $text); +$width = $size[2] + $size[0] + 8; +$height = abs($size[1]) + abs($size[7]); +//$width = 200; +//$height = 200; + +$im = imagecreate($width, $height); + +$colourBlack = imagecolorallocate($im, 255, 255, 255); +imagecolortransparent($im, $colourBlack); + +// Create some colors +$white = imagecolorallocate($im, 255, 255, 255); +$black = imagecolorallocate($im, 0, 0, 0); + +// Add the text +imagefttext($im, $fontsize, 0, 0, abs($size[5]), $black, $font, $text); + +// Set the content-type +header("Content-type: image/png"); +// Using imagepng() results in clearer text compared with +imagepng($im); +imagedestroy($im); +?> diff --git a/includes/captcha/root.php b/includes/captcha/root.php new file mode 100644 index 0000000000..cf38657a09 --- /dev/null +++ b/includes/captcha/root.php @@ -0,0 +1,48 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +// make sure the PATH_SEPARATOR is defined + if (!defined("PATH_SEPARATOR")) { + if ( strpos( $_ENV[ "OS" ], "Win" ) !== false ) { define("PATH_SEPARATOR", ";"); } else { define("PATH_SEPARATOR", ":"); } + } + +// make sure the document_root is set + $_SERVER["SCRIPT_FILENAME"] = str_replace("\\", "/", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = str_replace($_SERVER["PHP_SELF"], "", $_SERVER["SCRIPT_FILENAME"]); + //echo "DOCUMENT_ROOT: ".$_SERVER["DOCUMENT_ROOT"]."
\n"; + //echo "PHP_SELF: ".$_SERVER["PHP_SELF"]."
\n"; + //echo "SCRIPT_FILENAME: ".$_SERVER["SCRIPT_FILENAME"]."
\n"; + +// if the project directory exists then add it to the include path otherwise add the document root to the include path + if (is_dir($_SERVER["DOCUMENT_ROOT"].'/fusionpbx')){ + define('PROJECT_PATH', '/fusionpbx'); + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER["DOCUMENT_ROOT"].'/fusionpbx' ); + } + else { + define('PROJECT_PATH', ''); + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER['DOCUMENT_ROOT'] ); + } + +?> \ No newline at end of file diff --git a/includes/checkauth.php b/includes/checkauth.php new file mode 100644 index 0000000000..01013ad670 --- /dev/null +++ b/includes/checkauth.php @@ -0,0 +1,159 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require_once "includes/require.php"; +session_start(); + +//if the username session is not set the check username and password + if (strlen($_SESSION["username"]) == 0) { + //clear the menu + $_SESSION["menu"] = ""; + + //clear the template only if the template has not been assigned by the superadmin + if (strlen($_SESSION['domain']['template']['name']) == 0) { + $_SESSION["template_content"] = ''; + } + + //if the username from the form is not provided then send to login.php + if (strlen(check_str($_REQUEST["username"])) == 0) { + $php_self = $_SERVER["PHP_SELF"]; + $msg = "username required"; + header("Location: ".PROJECT_PATH."/login.php?path=".urlencode($php_self)."&msg=".urlencode($msg)); + exit; + } + + //check the username and password if they don't match then redirect to the login + $sql = "select * from v_users "; + $sql .= "where domain_uuid=:domain_uuid "; + $sql .= "and username=:username "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->bindParam(':domain_uuid', $domain_uuid); + $prep_statement->bindParam(':username', check_str($_REQUEST["username"])); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + if (count($result) == 0) { + $auth_failed = true; + } + else { + foreach ($result as &$row) { + //get the salt from the database + $salt = $row["salt"]; + //if salt is not defined then use the default salt for backwards compatibility + if (strlen($salt) == 0) { + $salt = 'e3.7d.12'; + } + //compare the password provided by the user with the one in the database + if (md5($salt.check_str($_REQUEST["password"])) != $row["password"]) { + $auth_failed = true; + } + //end the loop + break; + } + } + if ($auth_failed) { + //log the failed auth attempt to the system, to be available for fail2ban. + openlog('FusionPBX', LOG_NDELAY, LOG_AUTH); + syslog(LOG_WARNING, '['.$_SERVER['REMOTE_ADDR']."] authentication failed for ".$_REQUEST["username"]); + closelog(); + //redirect the user to the login page + $php_self = $_SERVER["PHP_SELF"]; + $msg = "incorrect account information"; + header("Location: ".PROJECT_PATH."/login.php?path=".urlencode($php_self)."&msg=".urlencode($msg)); + exit; + } + $_SESSION["username"] = check_str($_REQUEST["username"]); + foreach ($result as &$row) { + //allow the user to choose a template only if the template has not been assigned by the superadmin + if (strlen($_SESSION['domain']['template']['name']) == 0) { + $_SESSION['domain']['template']['name'] = $row["user_template_name"]; + } + $_SESSION["time_zone"]["user"] = ''; + if (strlen($row["user_time_zone"]) > 0) { + //user defined time zone + $_SESSION["time_zone"]["user"] = $row["user_time_zone"]; + } + // add the user_uuid to the session + $_SESSION['user_uuid'] = $row['user_uuid']; + break; + } + //echo "username: ".$_SESSION["username"]." and password are correct"; + + //get the groups assigned to the user and then set the groups in $_SESSION["groups"] + $sql = "SELECT * FROM v_group_users "; + $sql .= "where domain_uuid=:domain_uuid "; + $sql .= "and user_uuid=:user_uuid "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->bindParam(':domain_uuid', $domain_uuid); + $prep_statement->bindParam(':user_uuid', $_SESSION["user_uuid"]); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + $_SESSION["groups"] = $result; + unset($sql, $row_count, $prep_statement); + + //get the permissions assigned to the groups that the user is a member of set the permissions in $_SESSION['permissions'] + $x = 0; + $sql = "select distinct(permission_name) from v_group_permissions "; + foreach($_SESSION["groups"] as $field) { + if (strlen($field['group_name']) > 0) { + if ($x == 0) { + $sql .= "where (domain_uuid = '".$domain_uuid."' and group_name = '".$field['group_name']."') "; + } + else { + $sql .= "or (domain_uuid = '".$domain_uuid."' and group_name = '".$field['group_name']."') "; + } + $x++; + } + } + $prep_statement_sub = $db->prepare($sql); + $prep_statement_sub->execute(); + $_SESSION['permissions'] = $prep_statement_sub->fetchAll(PDO::FETCH_NAMED); + unset($sql, $prep_statement_sub); + + //redirect the user + if (check_str($_REQUEST["rdr"]) !== 'n'){ + $path = check_str($_POST["path"]); + if(isset($path) && !empty($path) && $path!="index2.php" && $path!="/install.php") { + header("Location: ".$path); + exit(); + } + } + } + +//set the time zone + if (strlen($_SESSION["time_zone"]["user"]) == 0) { + //set the domain time zone as the default time zone + date_default_timezone_set($_SESSION['domain']['time_zone']['name']); + } + else { + //set the user defined time zone + date_default_timezone_set($_SESSION["time_zone"]["user"]); + } + +//hide the path unless logged in as a superadmin. + if (!if_group("superadmin")) { + $v_path_show = false; + } + +?> \ No newline at end of file diff --git a/includes/checkstring.php b/includes/checkstring.php new file mode 100644 index 0000000000..e5cf5abe7a --- /dev/null +++ b/includes/checkstring.php @@ -0,0 +1,30 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +function check_string($str) { + $str = str_replace ("\'", "''", $str); //escape the single quote + return $str; +} +?> diff --git a/includes/class.phpmailer.php b/includes/class.phpmailer.php new file mode 100644 index 0000000000..2ddc30fd27 --- /dev/null +++ b/includes/class.phpmailer.php @@ -0,0 +1,1896 @@ +ContentType = 'text/html'; + } else { + $this->ContentType = 'text/plain'; + } + } + + /** + * Sets Mailer to send message using SMTP. + * @return void + */ + function IsSMTP() { + $this->Mailer = 'smtp'; + } + + /** + * Sets Mailer to send message using PHP mail() function. + * @return void + */ + function IsMail() { + $this->Mailer = 'mail'; + } + + /** + * Sets Mailer to send message using the $Sendmail program. + * @return void + */ + function IsSendmail() { + $this->Mailer = 'sendmail'; + } + + /** + * Sets Mailer to send message using the qmail MTA. + * @return void + */ + function IsQmail() { + $this->Sendmail = '/var/qmail/bin/sendmail'; + $this->Mailer = 'sendmail'; + } + + ///////////////////////////////////////////////// + // METHODS, RECIPIENTS + ///////////////////////////////////////////////// + + /** + * Adds a "To" address. + * @param string $address + * @param string $name + * @return void + */ + function AddAddress($address, $name = '') { + $cur = count($this->to); + $this->to[$cur][0] = trim($address); + $this->to[$cur][1] = $name; + } + + /** + * Adds a "Cc" address. Note: this function works + * with the SMTP mailer on win32, not with the "mail" + * mailer. + * @param string $address + * @param string $name + * @return void + */ + function AddCC($address, $name = '') { + $cur = count($this->cc); + $this->cc[$cur][0] = trim($address); + $this->cc[$cur][1] = $name; + } + + /** + * Adds a "Bcc" address. Note: this function works + * with the SMTP mailer on win32, not with the "mail" + * mailer. + * @param string $address + * @param string $name + * @return void + */ + function AddBCC($address, $name = '') { + $cur = count($this->bcc); + $this->bcc[$cur][0] = trim($address); + $this->bcc[$cur][1] = $name; + } + + /** + * Adds a "Reply-To" address. + * @param string $address + * @param string $name + * @return void + */ + function AddReplyTo($address, $name = '') { + $cur = count($this->ReplyTo); + $this->ReplyTo[$cur][0] = trim($address); + $this->ReplyTo[$cur][1] = $name; + } + + ///////////////////////////////////////////////// + // METHODS, MAIL SENDING + ///////////////////////////////////////////////// + + /** + * Creates message and assigns Mailer. If the message is + * not sent successfully then it returns false. Use the ErrorInfo + * variable to view description of the error. + * @return bool + */ + function Send() { + $header = ''; + $body = ''; + $result = true; + + if((count($this->to) + count($this->cc) + count($this->bcc)) < 1) { + $this->SetError($this->Lang('provide_address')); + return false; + } + + /* Set whether the message is multipart/alternative */ + if(!empty($this->AltBody)) { + $this->ContentType = 'multipart/alternative'; + } + + $this->error_count = 0; // reset errors + $this->SetMessageType(); + $header .= $this->CreateHeader(); + $body = $this->CreateBody(); + + if($body == '') { + return false; + } + + /* Choose the mailer */ + switch($this->Mailer) { + case 'sendmail': + $result = $this->SendmailSend($header, $body); + break; + case 'smtp': + $result = $this->SmtpSend($header, $body); + break; + case 'mail': + $result = $this->MailSend($header, $body); + break; + default: + $result = $this->MailSend($header, $body); + break; + //$this->SetError($this->Mailer . $this->Lang('mailer_not_supported')); + //$result = false; + //break; + } + + return $result; + } + + /** + * Sends mail using the $Sendmail program. + * @access private + * @return bool + */ + function SendmailSend($header, $body) { + if ($this->Sender != '') { + $sendmail = sprintf("%s -oi -f %s -t", escapeshellcmd($this->Sendmail), escapeshellarg($this->Sender)); + } else { + $sendmail = sprintf("%s -oi -t", escapeshellcmd($this->Sendmail)); + } + + if(!@$mail = popen($sendmail, 'w')) { + $this->SetError($this->Lang('execute') . $this->Sendmail); + return false; + } + + fputs($mail, $header); + fputs($mail, $body); + + $result = pclose($mail); + if (version_compare(phpversion(), '4.2.3') == -1) { + $result = $result >> 8 & 0xFF; + } + if($result != 0) { + $this->SetError($this->Lang('execute') . $this->Sendmail); + return false; + } + return true; + } + + /** + * Sends mail using the PHP mail() function. + * @access private + * @return bool + */ + function MailSend($header, $body) { + + $to = ''; + for($i = 0; $i < count($this->to); $i++) { + if($i != 0) { $to .= ', '; } + $to .= $this->AddrFormat($this->to[$i]); + } + + $toArr = split(',', $to); + + $params = sprintf("-oi -f %s", $this->Sender); + if ($this->Sender != '' && strlen(ini_get('safe_mode')) < 1) { + $old_from = ini_get('sendmail_from'); + ini_set('sendmail_from', $this->Sender); + if ($this->SingleTo === true && count($toArr) > 1) { + foreach ($toArr as $key => $val) { + $rt = @mail($val, $this->EncodeHeader($this->SecureHeader($this->Subject)), $body, $header, $params); + } + } else { + $rt = @mail($to, $this->EncodeHeader($this->SecureHeader($this->Subject)), $body, $header, $params); + } + } else { + if ($this->SingleTo === true && count($toArr) > 1) { + foreach ($toArr as $key => $val) { + $rt = @mail($val, $this->EncodeHeader($this->SecureHeader($this->Subject)), $body, $header, $params); + } + } else { + $rt = @mail($to, $this->EncodeHeader($this->SecureHeader($this->Subject)), $body, $header); + } + } + + if (isset($old_from)) { + ini_set('sendmail_from', $old_from); + } + + if(!$rt) { + $this->SetError($this->Lang('instantiate')); + return false; + } + + return true; + } + + /** + * Sends mail via SMTP using PhpSMTP (Author: + * Chris Ryan). Returns bool. Returns false if there is a + * bad MAIL FROM, RCPT, or DATA input. + * @access private + * @return bool + */ + function SmtpSend($header, $body) { + include_once($this->PluginDir . 'class.smtp.php'); + $error = ''; + $bad_rcpt = array(); + + if(!$this->SmtpConnect()) { + return false; + } + + $smtp_from = ($this->Sender == '') ? $this->From : $this->Sender; + if(!$this->smtp->Mail($smtp_from)) { + $error = $this->Lang('from_failed') . $smtp_from; + $this->SetError($error); + $this->smtp->Reset(); + return false; + } + + /* Attempt to send attach all recipients */ + for($i = 0; $i < count($this->to); $i++) { + if(!$this->smtp->Recipient($this->to[$i][0])) { + $bad_rcpt[] = $this->to[$i][0]; + } + } + for($i = 0; $i < count($this->cc); $i++) { + if(!$this->smtp->Recipient($this->cc[$i][0])) { + $bad_rcpt[] = $this->cc[$i][0]; + } + } + for($i = 0; $i < count($this->bcc); $i++) { + if(!$this->smtp->Recipient($this->bcc[$i][0])) { + $bad_rcpt[] = $this->bcc[$i][0]; + } + } + + if(count($bad_rcpt) > 0) { // Create error message + for($i = 0; $i < count($bad_rcpt); $i++) { + if($i != 0) { + $error .= ', '; + } + $error .= $bad_rcpt[$i]; + } + $error = $this->Lang('recipients_failed') . $error; + $this->SetError($error); + $this->smtp->Reset(); + return false; + } + + if(!$this->smtp->Data($header . $body)) { + $this->SetError($this->Lang('data_not_accepted')); + $this->smtp->Reset(); + return false; + } + if($this->SMTPKeepAlive == true) { + $this->smtp->Reset(); + } else { + $this->SmtpClose(); + } + + return true; + } + + /** + * Initiates a connection to an SMTP server. Returns false if the + * operation failed. + * @access private + * @return bool + */ + function SmtpConnect() { + if($this->smtp == NULL) { + $this->smtp = new SMTP(); + } + + $this->smtp->do_debug = $this->SMTPDebug; + $hosts = explode(';', $this->Host); + $index = 0; + $connection = ($this->smtp->Connected()); + + /* Retry while there is no connection */ + while($index < count($hosts) && $connection == false) { + $hostinfo = array(); + if(eregi('^(.+):([0-9]+)$', $hosts[$index], $hostinfo)) { + $host = $hostinfo[1]; + $port = $hostinfo[2]; + } else { + $host = $hosts[$index]; + $port = $this->Port; + } + + if($this->smtp->Connect(((!empty($this->SMTPSecure))?$this->SMTPSecure.'://':'').$host, $port, $this->Timeout)) { + if ($this->Helo != '') { + $this->smtp->Hello($this->Helo); + } else { + $this->smtp->Hello($this->ServerHostname()); + } + + $connection = true; + if($this->SMTPAuth) { + if(!$this->smtp->Authenticate($this->Username, $this->Password)) { + $this->SetError($this->Lang('authenticate')); + $this->smtp->Reset(); + $connection = false; + } + } + } + $index++; + } + if(!$connection) { + $this->SetError($this->Lang('connect_host')); + } + + return $connection; + } + + /** + * Closes the active SMTP session if one exists. + * @return void + */ + function SmtpClose() { + if($this->smtp != NULL) { + if($this->smtp->Connected()) { + $this->smtp->Quit(); + $this->smtp->Close(); + } + } + } + + /** + * Sets the language for all class error messages. Returns false + * if it cannot load the language file. The default language type + * is English. + * @param string $lang_type Type of language (e.g. Portuguese: "br") + * @param string $lang_path Path to the language file directory + * @access public + * @return bool + */ + function SetLanguage($lang_type, $lang_path = 'language/') { + if(file_exists($lang_path.'phpmailer.lang-'.$lang_type.'.php')) { + include($lang_path.'phpmailer.lang-'.$lang_type.'.php'); + } elseif (file_exists($lang_path.'phpmailer.lang-en.php')) { + include($lang_path.'phpmailer.lang-en.php'); + } else { + $this->SetError('Could not load language file'); + return false; + } + $this->language = $PHPMAILER_LANG; + + return true; + } + + ///////////////////////////////////////////////// + // METHODS, MESSAGE CREATION + ///////////////////////////////////////////////// + + /** + * Creates recipient headers. + * @access private + * @return string + */ + function AddrAppend($type, $addr) { + $addr_str = $type . ': '; + $addr_str .= $this->AddrFormat($addr[0]); + if(count($addr) > 1) { + for($i = 1; $i < count($addr); $i++) { + $addr_str .= ', ' . $this->AddrFormat($addr[$i]); + } + } + $addr_str .= $this->LE; + + return $addr_str; + } + + /** + * Formats an address correctly. + * @access private + * @return string + */ + function AddrFormat($addr) { + if(empty($addr[1])) { + $formatted = $this->SecureHeader($addr[0]); + } else { + $formatted = $this->EncodeHeader($this->SecureHeader($addr[1]), 'phrase') . " <" . $this->SecureHeader($addr[0]) . ">"; + } + + return $formatted; + } + + /** + * Wraps message for use with mailers that do not + * automatically perform wrapping and for quoted-printable. + * Original written by philippe. + * @access private + * @return string + */ + function WrapText($message, $length, $qp_mode = false) { + $soft_break = ($qp_mode) ? sprintf(" =%s", $this->LE) : $this->LE; + // If utf-8 encoding is used, we will need to make sure we don't + // split multibyte characters when we wrap + $is_utf8 = (strtolower($this->CharSet) == "utf-8"); + + $message = $this->FixEOL($message); + if (substr($message, -1) == $this->LE) { + $message = substr($message, 0, -1); + } + + $line = explode($this->LE, $message); + $message = ''; + for ($i=0 ;$i < count($line); $i++) { + $line_part = explode(' ', $line[$i]); + $buf = ''; + for ($e = 0; $e $length)) { + $space_left = $length - strlen($buf) - 1; + if ($e != 0) { + if ($space_left > 20) { + $len = $space_left; + if ($is_utf8) { + $len = $this->UTF8CharBoundary($word, $len); + } elseif (substr($word, $len - 1, 1) == "=") { + $len--; + } elseif (substr($word, $len - 2, 1) == "=") { + $len -= 2; + } + $part = substr($word, 0, $len); + $word = substr($word, $len); + $buf .= ' ' . $part; + $message .= $buf . sprintf("=%s", $this->LE); + } else { + $message .= $buf . $soft_break; + } + $buf = ''; + } + while (strlen($word) > 0) { + $len = $length; + if ($is_utf8) { + $len = $this->UTF8CharBoundary($word, $len); + } elseif (substr($word, $len - 1, 1) == "=") { + $len--; + } elseif (substr($word, $len - 2, 1) == "=") { + $len -= 2; + } + $part = substr($word, 0, $len); + $word = substr($word, $len); + + if (strlen($word) > 0) { + $message .= $part . sprintf("=%s", $this->LE); + } else { + $buf = $part; + } + } + } else { + $buf_o = $buf; + $buf .= ($e == 0) ? $word : (' ' . $word); + + if (strlen($buf) > $length and $buf_o != '') { + $message .= $buf_o . $soft_break; + $buf = $word; + } + } + } + $message .= $buf . $this->LE; + } + + return $message; + } + + /** + * Finds last character boundary prior to maxLength in a utf-8 + * quoted (printable) encoded string. + * Original written by Colin Brown. + * @access private + * @param string $encodedText utf-8 QP text + * @param int $maxLength find last character boundary prior to this length + * @return int + */ + function UTF8CharBoundary($encodedText, $maxLength) { + $foundSplitPos = false; + $lookBack = 3; + while (!$foundSplitPos) { + $lastChunk = substr($encodedText, $maxLength - $lookBack, $lookBack); + $encodedCharPos = strpos($lastChunk, "="); + if ($encodedCharPos !== false) { + // Found start of encoded character byte within $lookBack block. + // Check the encoded byte value (the 2 chars after the '=') + $hex = substr($encodedText, $maxLength - $lookBack + $encodedCharPos + 1, 2); + $dec = hexdec($hex); + if ($dec < 128) { // Single byte character. + // If the encoded char was found at pos 0, it will fit + // otherwise reduce maxLength to start of the encoded char + $maxLength = ($encodedCharPos == 0) ? $maxLength : + $maxLength - ($lookBack - $encodedCharPos); + $foundSplitPos = true; + } elseif ($dec >= 192) { // First byte of a multi byte character + // Reduce maxLength to split at start of character + $maxLength = $maxLength - ($lookBack - $encodedCharPos); + $foundSplitPos = true; + } elseif ($dec < 192) { // Middle byte of a multi byte character, look further back + $lookBack += 3; + } + } else { + // No encoded character found + $foundSplitPos = true; + } + } + return $maxLength; + } + + /** + * Set the body wrapping. + * @access private + * @return void + */ + function SetWordWrap() { + if($this->WordWrap < 1) { + return; + } + + switch($this->message_type) { + case 'alt': + /* fall through */ + case 'alt_attachments': + $this->AltBody = $this->WrapText($this->AltBody, $this->WordWrap); + break; + default: + $this->Body = $this->WrapText($this->Body, $this->WordWrap); + break; + } + } + + /** + * Assembles message header. + * @access private + * @return string + */ + function CreateHeader() { + $result = ''; + + /* Set the boundaries */ + $uniq_id = md5(uniqid(time())); + $this->boundary[1] = 'b1_' . $uniq_id; + $this->boundary[2] = 'b2_' . $uniq_id; + + $result .= $this->HeaderLine('Date', $this->RFCDate()); + if($this->Sender == '') { + $result .= $this->HeaderLine('Return-Path', trim($this->From)); + } else { + $result .= $this->HeaderLine('Return-Path', trim($this->Sender)); + } + + /* To be created automatically by mail() */ + if($this->Mailer != 'mail') { + if(count($this->to) > 0) { + $result .= $this->AddrAppend('To', $this->to); + } elseif (count($this->cc) == 0) { + $result .= $this->HeaderLine('To', 'undisclosed-recipients:;'); + } + if(count($this->cc) > 0) { + $result .= $this->AddrAppend('Cc', $this->cc); + } + } + + $from = array(); + $from[0][0] = trim($this->From); + $from[0][1] = $this->FromName; + $result .= $this->AddrAppend('From', $from); + + /* sendmail and mail() extract Cc from the header before sending */ + if((($this->Mailer == 'sendmail') || ($this->Mailer == 'mail')) && (count($this->cc) > 0)) { + $result .= $this->AddrAppend('Cc', $this->cc); + } + + /* sendmail and mail() extract Bcc from the header before sending */ + if((($this->Mailer == 'sendmail') || ($this->Mailer == 'mail')) && (count($this->bcc) > 0)) { + $result .= $this->AddrAppend('Bcc', $this->bcc); + } + + if(count($this->ReplyTo) > 0) { + $result .= $this->AddrAppend('Reply-To', $this->ReplyTo); + } + + /* mail() sets the subject itself */ + if($this->Mailer != 'mail') { + $result .= $this->HeaderLine('Subject', $this->EncodeHeader($this->SecureHeader($this->Subject))); + } + + if($this->MessageID != '') { + $result .= $this->HeaderLine('Message-ID',$this->MessageID); + } else { + $result .= sprintf("Message-ID: <%s@%s>%s", $uniq_id, $this->ServerHostname(), $this->LE); + } + $result .= $this->HeaderLine('X-Priority', $this->Priority); + $result .= $this->HeaderLine('X-Mailer', 'PHPMailer (phpmailer.sourceforge.net) [version ' . $this->Version . ']'); + + if($this->ConfirmReadingTo != '') { + $result .= $this->HeaderLine('Disposition-Notification-To', '<' . trim($this->ConfirmReadingTo) . '>'); + } + + // Add custom headers + for($index = 0; $index < count($this->CustomHeader); $index++) { + $result .= $this->HeaderLine(trim($this->CustomHeader[$index][0]), $this->EncodeHeader(trim($this->CustomHeader[$index][1]))); + } + if (!$this->sign_key_file) { + $result .= $this->HeaderLine('MIME-Version', '1.0'); + $result .= $this->GetMailMIME(); + } + + return $result; + } + + /** + * Returns the message MIME. + * @access private + * @return string + */ + function GetMailMIME() { + $result = ''; + switch($this->message_type) { + case 'plain': + $result .= $this->HeaderLine('Content-Transfer-Encoding', $this->Encoding); + $result .= sprintf("Content-Type: %s; charset=\"%s\"", $this->ContentType, $this->CharSet); + break; + case 'attachments': + /* fall through */ + case 'alt_attachments': + if($this->InlineImageExists()){ + $result .= sprintf("Content-Type: %s;%s\ttype=\"text/html\";%s\tboundary=\"%s\"%s", 'multipart/related', $this->LE, $this->LE, $this->boundary[1], $this->LE); + } else { + $result .= $this->HeaderLine('Content-Type', 'multipart/mixed;'); + $result .= $this->TextLine("\tboundary=\"" . $this->boundary[1] . '"'); + } + break; + case 'alt': + $result .= $this->HeaderLine('Content-Type', 'multipart/alternative;'); + $result .= $this->TextLine("\tboundary=\"" . $this->boundary[1] . '"'); + break; + } + + if($this->Mailer != 'mail') { + $result .= $this->LE.$this->LE; + } + + return $result; + } + + /** + * Assembles the message body. Returns an empty string on failure. + * @access private + * @return string + */ + function CreateBody() { + $result = ''; + if ($this->sign_key_file) { + $result .= $this->GetMailMIME(); + } + + $this->SetWordWrap(); + + switch($this->message_type) { + case 'alt': + $result .= $this->GetBoundary($this->boundary[1], '', 'text/plain', ''); + $result .= $this->EncodeString($this->AltBody, $this->Encoding); + $result .= $this->LE.$this->LE; + $result .= $this->GetBoundary($this->boundary[1], '', 'text/html', ''); + $result .= $this->EncodeString($this->Body, $this->Encoding); + $result .= $this->LE.$this->LE; + $result .= $this->EndBoundary($this->boundary[1]); + break; + case 'plain': + $result .= $this->EncodeString($this->Body, $this->Encoding); + break; + case 'attachments': + $result .= $this->GetBoundary($this->boundary[1], '', '', ''); + $result .= $this->EncodeString($this->Body, $this->Encoding); + $result .= $this->LE; + $result .= $this->AttachAll(); + break; + case 'alt_attachments': + $result .= sprintf("--%s%s", $this->boundary[1], $this->LE); + $result .= sprintf("Content-Type: %s;%s" . "\tboundary=\"%s\"%s", 'multipart/alternative', $this->LE, $this->boundary[2], $this->LE.$this->LE); + $result .= $this->GetBoundary($this->boundary[2], '', 'text/plain', '') . $this->LE; // Create text body + $result .= $this->EncodeString($this->AltBody, $this->Encoding); + $result .= $this->LE.$this->LE; + $result .= $this->GetBoundary($this->boundary[2], '', 'text/html', '') . $this->LE; // Create the HTML body + $result .= $this->EncodeString($this->Body, $this->Encoding); + $result .= $this->LE.$this->LE; + $result .= $this->EndBoundary($this->boundary[2]); + $result .= $this->AttachAll(); + break; + } + + if($this->IsError()) { + $result = ''; + } else if ($this->sign_key_file) { + $file = tempnam("", "mail"); + $fp = fopen($file, "w"); + fwrite($fp, $result); + fclose($fp); + $signed = tempnam("", "signed"); + + if (@openssl_pkcs7_sign($file, $signed, "file://".$this->sign_key_file, array("file://".$this->sign_key_file, $this->sign_key_pass), null)) { + $fp = fopen($signed, "r"); + $result = fread($fp, filesize($this->sign_key_file)); + fclose($fp); + } else { + $this->SetError($this->Lang("signing").openssl_error_string()); + $result = ''; + } + + unlink($file); + unlink($signed); + } + + return $result; + } + + /** + * Returns the start of a message boundary. + * @access private + */ + function GetBoundary($boundary, $charSet, $contentType, $encoding) { + $result = ''; + if($charSet == '') { + $charSet = $this->CharSet; + } + if($contentType == '') { + $contentType = $this->ContentType; + } + if($encoding == '') { + $encoding = $this->Encoding; + } + $result .= $this->TextLine('--' . $boundary); + $result .= sprintf("Content-Type: %s; charset = \"%s\"", $contentType, $charSet); + $result .= $this->LE; + $result .= $this->HeaderLine('Content-Transfer-Encoding', $encoding); + $result .= $this->LE; + + return $result; + } + + /** + * Returns the end of a message boundary. + * @access private + */ + function EndBoundary($boundary) { + return $this->LE . '--' . $boundary . '--' . $this->LE; + } + + /** + * Sets the message type. + * @access private + * @return void + */ + function SetMessageType() { + if(count($this->attachment) < 1 && strlen($this->AltBody) < 1) { + $this->message_type = 'plain'; + } else { + if(count($this->attachment) > 0) { + $this->message_type = 'attachments'; + } + if(strlen($this->AltBody) > 0 && count($this->attachment) < 1) { + $this->message_type = 'alt'; + } + if(strlen($this->AltBody) > 0 && count($this->attachment) > 0) { + $this->message_type = 'alt_attachments'; + } + } + } + + /* Returns a formatted header line. + * @access private + * @return string + */ + function HeaderLine($name, $value) { + return $name . ': ' . $value . $this->LE; + } + + /** + * Returns a formatted mail line. + * @access private + * @return string + */ + function TextLine($value) { + return $value . $this->LE; + } + + ///////////////////////////////////////////////// + // CLASS METHODS, ATTACHMENTS + ///////////////////////////////////////////////// + + /** + * Adds an attachment from a path on the filesystem. + * Returns false if the file could not be found + * or accessed. + * @param string $path Path to the attachment. + * @param string $name Overrides the attachment name. + * @param string $encoding File encoding (see $Encoding). + * @param string $type File extension (MIME) type. + * @return bool + */ + function AddAttachment($path, $name = '', $encoding = 'base64', $type = 'application/octet-stream') { + if(!@is_file($path)) { + $this->SetError($this->Lang('file_access') . $path); + return false; + } + + $filename = basename($path); + if($name == '') { + $name = $filename; + } + + $cur = count($this->attachment); + $this->attachment[$cur][0] = $path; + $this->attachment[$cur][1] = $filename; + $this->attachment[$cur][2] = $name; + $this->attachment[$cur][3] = $encoding; + $this->attachment[$cur][4] = $type; + $this->attachment[$cur][5] = false; // isStringAttachment + $this->attachment[$cur][6] = 'attachment'; + $this->attachment[$cur][7] = 0; + + return true; + } + + /** + * Attaches all fs, string, and binary attachments to the message. + * Returns an empty string on failure. + * @access private + * @return string + */ + function AttachAll() { + /* Return text of body */ + $mime = array(); + + /* Add all attachments */ + for($i = 0; $i < count($this->attachment); $i++) { + /* Check for string attachment */ + $bString = $this->attachment[$i][5]; + if ($bString) { + $string = $this->attachment[$i][0]; + } else { + $path = $this->attachment[$i][0]; + } + + $filename = $this->attachment[$i][1]; + $name = $this->attachment[$i][2]; + $encoding = $this->attachment[$i][3]; + $type = $this->attachment[$i][4]; + $disposition = $this->attachment[$i][6]; + $cid = $this->attachment[$i][7]; + + $mime[] = sprintf("--%s%s", $this->boundary[1], $this->LE); + $mime[] = sprintf("Content-Type: %s; name=\"%s\"%s", $type, $name, $this->LE); + $mime[] = sprintf("Content-Transfer-Encoding: %s%s", $encoding, $this->LE); + + if($disposition == 'inline') { + $mime[] = sprintf("Content-ID: <%s>%s", $cid, $this->LE); + } + + $mime[] = sprintf("Content-Disposition: %s; filename=\"%s\"%s", $disposition, $name, $this->LE.$this->LE); + + /* Encode as string attachment */ + if($bString) { + $mime[] = $this->EncodeString($string, $encoding); + if($this->IsError()) { + return ''; + } + $mime[] = $this->LE.$this->LE; + } else { + $mime[] = $this->EncodeFile($path, $encoding); + if($this->IsError()) { + return ''; + } + $mime[] = $this->LE.$this->LE; + } + } + + $mime[] = sprintf("--%s--%s", $this->boundary[1], $this->LE); + + return join('', $mime); + } + + /** + * Encodes attachment in requested format. Returns an + * empty string on failure. + * @access private + * @return string + */ + function EncodeFile ($path, $encoding = 'base64') { + if(!@$fd = fopen($path, 'rb')) { + $this->SetError($this->Lang('file_open') . $path); + return ''; + } + $magic_quotes = get_magic_quotes_runtime(); + set_magic_quotes_runtime(0); + $file_buffer = fread($fd, filesize($path)); + $file_buffer = $this->EncodeString($file_buffer, $encoding); + fclose($fd); + set_magic_quotes_runtime($magic_quotes); + + return $file_buffer; + } + + /** + * Encodes string to requested format. Returns an + * empty string on failure. + * @access private + * @return string + */ + function EncodeString ($str, $encoding = 'base64') { + $encoded = ''; + switch(strtolower($encoding)) { + case 'base64': + /* chunk_split is found in PHP >= 3.0.6 */ + $encoded = chunk_split(base64_encode($str), 76, $this->LE); + break; + case '7bit': + case '8bit': + $encoded = $this->FixEOL($str); + if (substr($encoded, -(strlen($this->LE))) != $this->LE) + $encoded .= $this->LE; + break; + case 'binary': + $encoded = $str; + break; + case 'quoted-printable': + $encoded = $this->EncodeQP($str); + break; + default: + $this->SetError($this->Lang('encoding') . $encoding); + break; + } + return $encoded; + } + + /** + * Encode a header string to best of Q, B, quoted or none. + * @access private + * @return string + */ + function EncodeHeader ($str, $position = 'text') { + $x = 0; + + switch (strtolower($position)) { + case 'phrase': + if (!preg_match('/[\200-\377]/', $str)) { + /* Can't use addslashes as we don't know what value has magic_quotes_sybase. */ + $encoded = addcslashes($str, "\0..\37\177\\\""); + if (($str == $encoded) && !preg_match('/[^A-Za-z0-9!#$%&\'*+\/=?^_`{|}~ -]/', $str)) { + return ($encoded); + } else { + return ("\"$encoded\""); + } + } + $x = preg_match_all('/[^\040\041\043-\133\135-\176]/', $str, $matches); + break; + case 'comment': + $x = preg_match_all('/[()"]/', $str, $matches); + /* Fall-through */ + case 'text': + default: + $x += preg_match_all('/[\000-\010\013\014\016-\037\177-\377]/', $str, $matches); + break; + } + + if ($x == 0) { + return ($str); + } + + $maxlen = 75 - 7 - strlen($this->CharSet); + /* Try to select the encoding which should produce the shortest output */ + if (strlen($str)/3 < $x) { + $encoding = 'B'; + if (function_exists('mb_strlen') && $this->HasMultiBytes($str)) { + // Use a custom function which correctly encodes and wraps long + // multibyte strings without breaking lines within a character + $encoded = $this->Base64EncodeWrapMB($str); + } else { + $encoded = base64_encode($str); + $maxlen -= $maxlen % 4; + $encoded = trim(chunk_split($encoded, $maxlen, "\n")); + } + } else { + $encoding = 'Q'; + $encoded = $this->EncodeQ($str, $position); + $encoded = $this->WrapText($encoded, $maxlen, true); + $encoded = str_replace('='.$this->LE, "\n", trim($encoded)); + } + + $encoded = preg_replace('/^(.*)$/m', " =?".$this->CharSet."?$encoding?\\1?=", $encoded); + $encoded = trim(str_replace("\n", $this->LE, $encoded)); + + return $encoded; + } + + /** + * Checks if a string contains multibyte characters. + * @access private + * @param string $str multi-byte text to wrap encode + * @return bool + */ + function HasMultiBytes($str) { + if (function_exists('mb_strlen')) { + return (strlen($str) > mb_strlen($str, $this->CharSet)); + } else { // Assume no multibytes (we can't handle without mbstring functions anyway) + return False; + } + } + + /** + * Correctly encodes and wraps long multibyte strings for mail headers + * without breaking lines within a character. + * Adapted from a function by paravoid at http://uk.php.net/manual/en/function.mb-encode-mimeheader.php + * @access private + * @param string $str multi-byte text to wrap encode + * @return string + */ + function Base64EncodeWrapMB($str) { + $start = "=?".$this->CharSet."?B?"; + $end = "?="; + $encoded = ""; + + $mb_length = mb_strlen($str, $this->CharSet); + // Each line must have length <= 75, including $start and $end + $length = 75 - strlen($start) - strlen($end); + // Average multi-byte ratio + $ratio = $mb_length / strlen($str); + // Base64 has a 4:3 ratio + $offset = $avgLength = floor($length * $ratio * .75); + + for ($i = 0; $i < $mb_length; $i += $offset) { + $lookBack = 0; + + do { + $offset = $avgLength - $lookBack; + $chunk = mb_substr($str, $i, $offset, $this->CharSet); + $chunk = base64_encode($chunk); + $lookBack++; + } + while (strlen($chunk) > $length); + + $encoded .= $chunk . $this->LE; + } + + // Chomp the last linefeed + $encoded = substr($encoded, 0, -strlen($this->LE)); + return $encoded; + } + + /** + * Encode string to quoted-printable. + * @access private + * @return string + */ + function EncodeQP( $input = '', $line_max = 76, $space_conv = false ) { + $hex = array('0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'); + $lines = preg_split('/(?:\r\n|\r|\n)/', $input); + $eol = "\r\n"; + $escape = '='; + $output = ''; + while( list(, $line) = each($lines) ) { + $linlen = strlen($line); + $newline = ''; + for($i = 0; $i < $linlen; $i++) { + $c = substr( $line, $i, 1 ); + $dec = ord( $c ); + if ( ( $i == 0 ) && ( $dec == 46 ) ) { // convert first point in the line into =2E + $c = '=2E'; + } + if ( $dec == 32 ) { + if ( $i == ( $linlen - 1 ) ) { // convert space at eol only + $c = '=20'; + } else if ( $space_conv ) { + $c = '=20'; + } + } elseif ( ($dec == 61) || ($dec < 32 ) || ($dec > 126) ) { // always encode "\t", which is *not* required + $h2 = floor($dec/16); + $h1 = floor($dec%16); + $c = $escape.$hex[$h2].$hex[$h1]; + } + if ( (strlen($newline) + strlen($c)) >= $line_max ) { // CRLF is not counted + $output .= $newline.$escape.$eol; // soft line break; " =\r\n" is okay + $newline = ''; + // check if newline first character will be point or not + if ( $dec == 46 ) { + $c = '=2E'; + } + } + $newline .= $c; + } // end of for + $output .= $newline.$eol; + } // end of while + return trim($output); + } + + /** + * Encode string to q encoding. + * @access private + * @return string + */ + function EncodeQ ($str, $position = 'text') { + /* There should not be any EOL in the string */ + $encoded = preg_replace("[\r\n]", '', $str); + + switch (strtolower($position)) { + case 'phrase': + $encoded = preg_replace("/([^A-Za-z0-9!*+\/ -])/e", "'='.sprintf('%02X', ord('\\1'))", $encoded); + break; + case 'comment': + $encoded = preg_replace("/([\(\)\"])/e", "'='.sprintf('%02X', ord('\\1'))", $encoded); + case 'text': + default: + /* Replace every high ascii, control =, ? and _ characters */ + $encoded = preg_replace('/([\000-\011\013\014\016-\037\075\077\137\177-\377])/e', + "'='.sprintf('%02X', ord('\\1'))", $encoded); + break; + } + + /* Replace every spaces to _ (more readable than =20) */ + $encoded = str_replace(' ', '_', $encoded); + + return $encoded; + } + + /** + * Adds a string or binary attachment (non-filesystem) to the list. + * This method can be used to attach ascii or binary data, + * such as a BLOB record from a database. + * @param string $string String attachment data. + * @param string $filename Name of the attachment. + * @param string $encoding File encoding (see $Encoding). + * @param string $type File extension (MIME) type. + * @return void + */ + function AddStringAttachment($string, $filename, $encoding = 'base64', $type = 'application/octet-stream') { + /* Append to $attachment array */ + $cur = count($this->attachment); + $this->attachment[$cur][0] = $string; + $this->attachment[$cur][1] = $filename; + $this->attachment[$cur][2] = $filename; + $this->attachment[$cur][3] = $encoding; + $this->attachment[$cur][4] = $type; + $this->attachment[$cur][5] = true; // isString + $this->attachment[$cur][6] = 'attachment'; + $this->attachment[$cur][7] = 0; + } + + /** + * Adds an embedded attachment. This can include images, sounds, and + * just about any other document. Make sure to set the $type to an + * image type. For JPEG images use "image/jpeg" and for GIF images + * use "image/gif". + * @param string $path Path to the attachment. + * @param string $cid Content ID of the attachment. Use this to identify + * the Id for accessing the image in an HTML form. + * @param string $name Overrides the attachment name. + * @param string $encoding File encoding (see $Encoding). + * @param string $type File extension (MIME) type. + * @return bool + */ + function AddEmbeddedImage($path, $cid, $name = '', $encoding = 'base64', $type = 'application/octet-stream') { + + if(!@is_file($path)) { + $this->SetError($this->Lang('file_access') . $path); + return false; + } + + $filename = basename($path); + if($name == '') { + $name = $filename; + } + + /* Append to $attachment array */ + $cur = count($this->attachment); + $this->attachment[$cur][0] = $path; + $this->attachment[$cur][1] = $filename; + $this->attachment[$cur][2] = $name; + $this->attachment[$cur][3] = $encoding; + $this->attachment[$cur][4] = $type; + $this->attachment[$cur][5] = false; + $this->attachment[$cur][6] = 'inline'; + $this->attachment[$cur][7] = $cid; + + return true; + } + + /** + * Returns true if an inline attachment is present. + * @access private + * @return bool + */ + function InlineImageExists() { + $result = false; + for($i = 0; $i < count($this->attachment); $i++) { + if($this->attachment[$i][6] == 'inline') { + $result = true; + break; + } + } + + return $result; + } + + ///////////////////////////////////////////////// + // CLASS METHODS, MESSAGE RESET + ///////////////////////////////////////////////// + + /** + * Clears all recipients assigned in the TO array. Returns void. + * @return void + */ + function ClearAddresses() { + $this->to = array(); + } + + /** + * Clears all recipients assigned in the CC array. Returns void. + * @return void + */ + function ClearCCs() { + $this->cc = array(); + } + + /** + * Clears all recipients assigned in the BCC array. Returns void. + * @return void + */ + function ClearBCCs() { + $this->bcc = array(); + } + + /** + * Clears all recipients assigned in the ReplyTo array. Returns void. + * @return void + */ + function ClearReplyTos() { + $this->ReplyTo = array(); + } + + /** + * Clears all recipients assigned in the TO, CC and BCC + * array. Returns void. + * @return void + */ + function ClearAllRecipients() { + $this->to = array(); + $this->cc = array(); + $this->bcc = array(); + } + + /** + * Clears all previously set filesystem, string, and binary + * attachments. Returns void. + * @return void + */ + function ClearAttachments() { + $this->attachment = array(); + } + + /** + * Clears all custom headers. Returns void. + * @return void + */ + function ClearCustomHeaders() { + $this->CustomHeader = array(); + } + + ///////////////////////////////////////////////// + // CLASS METHODS, MISCELLANEOUS + ///////////////////////////////////////////////// + + /** + * Adds the error message to the error container. + * Returns void. + * @access private + * @return void + */ + function SetError($msg) { + $this->error_count++; + $this->ErrorInfo = $msg; + } + + /** + * Returns the proper RFC 822 formatted date. + * @access private + * @return string + */ + function RFCDate() { + $tz = date('Z'); + $tzs = ($tz < 0) ? '-' : '+'; + $tz = abs($tz); + $tz = (int)($tz/3600)*100 + ($tz%3600)/60; + $result = sprintf("%s %s%04d", date('D, j M Y H:i:s'), $tzs, $tz); + + return $result; + } + + /** + * Returns the appropriate server variable. Should work with both + * PHP 4.1.0+ as well as older versions. Returns an empty string + * if nothing is found. + * @access private + * @return mixed + */ + function ServerVar($varName) { + global $HTTP_SERVER_VARS; + global $HTTP_ENV_VARS; + + if(!isset($_SERVER)) { + $_SERVER = $HTTP_SERVER_VARS; + if(!isset($_SERVER['REMOTE_ADDR'])) { + $_SERVER = $HTTP_ENV_VARS; // must be Apache + } + } + + if(isset($_SERVER[$varName])) { + return $_SERVER[$varName]; + } else { + return ''; + } + } + + /** + * Returns the server hostname or 'localhost.localdomain' if unknown. + * @access private + * @return string + */ + function ServerHostname() { + if ($this->Hostname != '') { + $result = $this->Hostname; + } elseif ($this->ServerVar('SERVER_NAME') != '') { + $result = $this->ServerVar('SERVER_NAME'); + } else { + $result = 'localhost.localdomain'; + } + + return $result; + } + + /** + * Returns a message in the appropriate language. + * @access private + * @return string + */ + function Lang($key) { + if(count($this->language) < 1) { + $this->SetLanguage('en'); // set the default language + } + + if(isset($this->language[$key])) { + return $this->language[$key]; + } else { + return 'Language string failed to load: ' . $key; + } + } + + /** + * Returns true if an error occurred. + * @return bool + */ + function IsError() { + return ($this->error_count > 0); + } + + /** + * Changes every end of line from CR or LF to CRLF. + * @access private + * @return string + */ + function FixEOL($str) { + $str = str_replace("\r\n", "\n", $str); + $str = str_replace("\r", "\n", $str); + $str = str_replace("\n", $this->LE, $str); + return $str; + } + + /** + * Adds a custom header. + * @return void + */ + function AddCustomHeader($custom_header) { + $this->CustomHeader[] = explode(':', $custom_header, 2); + } + + /** + * Evaluates the message and returns modifications for inline images and backgrounds + * @access public + * @return $message + */ + function MsgHTML($message,$basedir='') { + preg_match_all("/(src|background)=\"(.*)\"/Ui", $message, $images); + if(isset($images[2])) { + foreach($images[2] as $i => $url) { + // do not change urls for absolute images (thanks to corvuscorax) + if (!preg_match('/^[A-z][A-z]*:\/\//',$url)) { + $filename = basename($url); + $directory = dirname($url); + ($directory == '.')?$directory='':''; + $cid = 'cid:' . md5($filename); + $fileParts = split("\.", $filename); + $ext = $fileParts[1]; + $mimeType = $this->_mime_types($ext); + if ( strlen($basedir) > 1 && substr($basedir,-1) != '/') { $basedir .= '/'; } + if ( strlen($directory) > 1 && substr($basedir,-1) != '/') { $directory .= '/'; } + $this->AddEmbeddedImage($basedir.$directory.$filename, md5($filename), $filename, 'base64', $mimeType); + if ( $this->AddEmbeddedImage($basedir.$directory.$filename, md5($filename), $filename, 'base64',$mimeType) ) { + $message = preg_replace("/".$images[1][$i]."=\"".preg_quote($url, '/')."\"/Ui", $images[1][$i]."=\"".$cid."\"", $message); + } + } + } + } + $this->IsHTML(true); + $this->Body = $message; + $textMsg = trim(strip_tags(preg_replace('/<(head|title|style|script)[^>]*>.*?<\/\\1>/s','',$message))); + if ( !empty($textMsg) && empty($this->AltBody) ) { + $this->AltBody = $textMsg; + } + if ( empty($this->AltBody) ) { + $this->AltBody = 'To view this email message, open the email in with HTML compatibility!' . "\n\n"; + } + } + + /** + * Gets the mime type of the embedded or inline image + * @access private + * @return mime type of ext + */ + function _mime_types($ext = '') { + $mimes = array( + 'hqx' => 'application/mac-binhex40', + 'cpt' => 'application/mac-compactpro', + 'doc' => 'application/msword', + 'bin' => 'application/macbinary', + 'dms' => 'application/octet-stream', + 'lha' => 'application/octet-stream', + 'lzh' => 'application/octet-stream', + 'exe' => 'application/octet-stream', + 'class' => 'application/octet-stream', + 'psd' => 'application/octet-stream', + 'so' => 'application/octet-stream', + 'sea' => 'application/octet-stream', + 'dll' => 'application/octet-stream', + 'oda' => 'application/oda', + 'pdf' => 'application/pdf', + 'ai' => 'application/postscript', + 'eps' => 'application/postscript', + 'ps' => 'application/postscript', + 'smi' => 'application/smil', + 'smil' => 'application/smil', + 'mif' => 'application/vnd.mif', + 'xls' => 'application/vnd.ms-excel', + 'ppt' => 'application/vnd.ms-powerpoint', + 'wbxml' => 'application/vnd.wap.wbxml', + 'wmlc' => 'application/vnd.wap.wmlc', + 'dcr' => 'application/x-director', + 'dir' => 'application/x-director', + 'dxr' => 'application/x-director', + 'dvi' => 'application/x-dvi', + 'gtar' => 'application/x-gtar', + 'php' => 'application/x-httpd-php', + 'php4' => 'application/x-httpd-php', + 'php3' => 'application/x-httpd-php', + 'phtml' => 'application/x-httpd-php', + 'phps' => 'application/x-httpd-php-source', + 'js' => 'application/x-javascript', + 'swf' => 'application/x-shockwave-flash', + 'sit' => 'application/x-stuffit', + 'tar' => 'application/x-tar', + 'tgz' => 'application/x-tar', + 'xhtml' => 'application/xhtml+xml', + 'xht' => 'application/xhtml+xml', + 'zip' => 'application/zip', + 'mid' => 'audio/midi', + 'midi' => 'audio/midi', + 'mpga' => 'audio/mpeg', + 'mp2' => 'audio/mpeg', + 'mp3' => 'audio/mpeg', + 'aif' => 'audio/x-aiff', + 'aiff' => 'audio/x-aiff', + 'aifc' => 'audio/x-aiff', + 'ram' => 'audio/x-pn-realaudio', + 'rm' => 'audio/x-pn-realaudio', + 'rpm' => 'audio/x-pn-realaudio-plugin', + 'ra' => 'audio/x-realaudio', + 'rv' => 'video/vnd.rn-realvideo', + 'wav' => 'audio/x-wav', + 'bmp' => 'image/bmp', + 'gif' => 'image/gif', + 'jpeg' => 'image/jpeg', + 'jpg' => 'image/jpeg', + 'jpe' => 'image/jpeg', + 'png' => 'image/png', + 'tiff' => 'image/tiff', + 'tif' => 'image/tiff', + 'css' => 'text/css', + 'html' => 'text/html', + 'htm' => 'text/html', + 'shtml' => 'text/html', + 'txt' => 'text/plain', + 'text' => 'text/plain', + 'log' => 'text/plain', + 'rtx' => 'text/richtext', + 'rtf' => 'text/rtf', + 'xml' => 'text/xml', + 'xsl' => 'text/xml', + 'mpeg' => 'video/mpeg', + 'mpg' => 'video/mpeg', + 'mpe' => 'video/mpeg', + 'qt' => 'video/quicktime', + 'mov' => 'video/quicktime', + 'avi' => 'video/x-msvideo', + 'movie' => 'video/x-sgi-movie', + 'doc' => 'application/msword', + 'word' => 'application/msword', + 'xl' => 'application/excel', + 'eml' => 'message/rfc822' + ); + return ( ! isset($mimes[strtolower($ext)])) ? 'application/octet-stream' : $mimes[strtolower($ext)]; + } + + /** + * Set (or reset) Class Objects (variables) + * + * Usage Example: + * $page->set('X-Priority', '3'); + * + * @access public + * @param string $name Parameter Name + * @param mixed $value Parameter Value + * NOTE: will not work with arrays, there are no arrays to set/reset + */ + function set ( $name, $value = '' ) { + if ( isset($this->$name) ) { + $this->$name = $value; + } else { + $this->SetError('Cannot set or reset variable ' . $name); + return false; + } + } + + /** + * Read a file from a supplied filename and return it. + * + * @access public + * @param string $filename Parameter File Name + */ + function getFile($filename) { + $return = ''; + if ($fp = fopen($filename, 'rb')) { + while (!feof($fp)) { + $return .= fread($fp, 1024); + } + fclose($fp); + return $return; + } else { + return false; + } + } + + /** + * Strips newlines to prevent header injection. + * @access private + * @param string $str String + * @return string + */ + function SecureHeader($str) { + $str = trim($str); + $str = str_replace("\r", "", $str); + $str = str_replace("\n", "", $str); + return $str; + } + + /** + * Set the private key file and password to sign the message. + * + * @access public + * @param string $key_filename Parameter File Name + * @param string $key_pass Password for private key + */ + function Sign($key_filename, $key_pass) { + $this->sign_key_file = $key_filename; + $this->sign_key_pass = $key_pass; + } + +} + +?> diff --git a/includes/class.smtp.php b/includes/class.smtp.php new file mode 100644 index 0000000000..398c3ffbac --- /dev/null +++ b/includes/class.smtp.php @@ -0,0 +1,1062 @@ +smtp_conn = 0; + $this->error = null; + $this->helo_rply = null; + + $this->do_debug = 0; + } + + /************************************************************* + * CONNECTION FUNCTIONS * + ***********************************************************/ + + /** + * Connect to the server specified on the port specified. + * If the port is not specified use the default SMTP_PORT. + * If tval is specified then a connection will try and be + * established with the server for that number of seconds. + * If tval is not specified the default is 30 seconds to + * try on the connection. + * + * SMTP CODE SUCCESS: 220 + * SMTP CODE FAILURE: 421 + * @access public + * @return bool + */ + function Connect($host,$port=0,$tval=30) { + # set the error val to null so there is no confusion + $this->error = null; + + # make sure we are __not__ connected + if($this->connected()) { + # ok we are connected! what should we do? + # for now we will just give an error saying we + # are already connected + $this->error = array("error" => "Already connected to a server"); + return false; + } + + if(empty($port)) { + $port = $this->SMTP_PORT; + } + + #connect to the smtp server + $this->smtp_conn = fsockopen($host, # the host of the server + $port, # the port to use + $errno, # error number if any + $errstr, # error message if any + $tval); # give up after ? secs + # verify we connected properly + if(empty($this->smtp_conn)) { + $this->error = array("error" => "Failed to connect to server", + "errno" => $errno, + "errstr" => $errstr); + if($this->do_debug >= 1) { + echo "SMTP -> ERROR: " . $this->error["error"] . + ": $errstr ($errno)" . $this->CRLF; + } + return false; + } + + # sometimes the SMTP server takes a little longer to respond + # so we will give it a longer timeout for the first read + // Windows still does not have support for this timeout function + if(substr(PHP_OS, 0, 3) != "WIN") + socket_set_timeout($this->smtp_conn, $tval, 0); + + # get any announcement stuff + $announce = $this->get_lines(); + + # set the timeout of any socket functions at 1/10 of a second + //if(function_exists("socket_set_timeout")) + // socket_set_timeout($this->smtp_conn, 0, 100000); + + if($this->do_debug >= 2) { + echo "SMTP -> FROM SERVER:" . $this->CRLF . $announce; + } + + return true; + } + + /** + * Performs SMTP authentication. Must be run after running the + * Hello() method. Returns true if successfully authenticated. + * @access public + * @return bool + */ + function Authenticate($username, $password) { + // Start authentication + fputs($this->smtp_conn,"AUTH LOGIN" . $this->CRLF); + + $rply = $this->get_lines(); + $code = substr($rply,0,3); + + if($code != 334) { + $this->error = + array("error" => "AUTH not accepted from server", + "smtp_code" => $code, + "smtp_msg" => substr($rply,4)); + if($this->do_debug >= 1) { + echo "SMTP -> ERROR: " . $this->error["error"] . + ": " . $rply . $this->CRLF; + } + return false; + } + + // Send encoded username + fputs($this->smtp_conn, base64_encode($username) . $this->CRLF); + + $rply = $this->get_lines(); + $code = substr($rply,0,3); + + if($code != 334) { + $this->error = + array("error" => "Username not accepted from server", + "smtp_code" => $code, + "smtp_msg" => substr($rply,4)); + if($this->do_debug >= 1) { + echo "SMTP -> ERROR: " . $this->error["error"] . + ": " . $rply . $this->CRLF; + } + return false; + } + + // Send encoded password + fputs($this->smtp_conn, base64_encode($password) . $this->CRLF); + + $rply = $this->get_lines(); + $code = substr($rply,0,3); + + if($code != 235) { + $this->error = + array("error" => "Password not accepted from server", + "smtp_code" => $code, + "smtp_msg" => substr($rply,4)); + if($this->do_debug >= 1) { + echo "SMTP -> ERROR: " . $this->error["error"] . + ": " . $rply . $this->CRLF; + } + return false; + } + + return true; + } + + /** + * Returns true if connected to a server otherwise false + * @access private + * @return bool + */ + function Connected() { + if(!empty($this->smtp_conn)) { + $sock_status = socket_get_status($this->smtp_conn); + if($sock_status["eof"]) { + # hmm this is an odd situation... the socket is + # valid but we are not connected anymore + if($this->do_debug >= 1) { + echo "SMTP -> NOTICE:" . $this->CRLF . + "EOF caught while checking if connected"; + } + $this->Close(); + return false; + } + return true; # everything looks good + } + return false; + } + + /** + * Closes the socket and cleans up the state of the class. + * It is not considered good to use this function without + * first trying to use QUIT. + * @access public + * @return void + */ + function Close() { + $this->error = null; # so there is no confusion + $this->helo_rply = null; + if(!empty($this->smtp_conn)) { + # close the connection and cleanup + fclose($this->smtp_conn); + $this->smtp_conn = 0; + } + } + + /*************************************************************** + * SMTP COMMANDS * + *************************************************************/ + + /** + * Issues a data command and sends the msg_data to the server + * finializing the mail transaction. $msg_data is the message + * that is to be send with the headers. Each header needs to be + * on a single line followed by a with the message headers + * and the message body being seperated by and additional . + * + * Implements rfc 821: DATA + * + * SMTP CODE INTERMEDIATE: 354 + * [data] + * . + * SMTP CODE SUCCESS: 250 + * SMTP CODE FAILURE: 552,554,451,452 + * SMTP CODE FAILURE: 451,554 + * SMTP CODE ERROR : 500,501,503,421 + * @access public + * @return bool + */ + function Data($msg_data) { + $this->error = null; # so no confusion is caused + + if(!$this->connected()) { + $this->error = array( + "error" => "Called Data() without being connected"); + return false; + } + + fputs($this->smtp_conn,"DATA" . $this->CRLF); + + $rply = $this->get_lines(); + $code = substr($rply,0,3); + + if($this->do_debug >= 2) { + echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply; + } + + if($code != 354) { + $this->error = + array("error" => "DATA command not accepted from server", + "smtp_code" => $code, + "smtp_msg" => substr($rply,4)); + if($this->do_debug >= 1) { + echo "SMTP -> ERROR: " . $this->error["error"] . + ": " . $rply . $this->CRLF; + } + return false; + } + + # the server is ready to accept data! + # according to rfc 821 we should not send more than 1000 + # including the CRLF + # characters on a single line so we will break the data up + # into lines by \r and/or \n then if needed we will break + # each of those into smaller lines to fit within the limit. + # in addition we will be looking for lines that start with + # a period '.' and append and additional period '.' to that + # line. NOTE: this does not count towards are limit. + + # normalize the line breaks so we know the explode works + $msg_data = str_replace("\r\n","\n",$msg_data); + $msg_data = str_replace("\r","\n",$msg_data); + $lines = explode("\n",$msg_data); + + # we need to find a good way to determine is headers are + # in the msg_data or if it is a straight msg body + # currently I am assuming rfc 822 definitions of msg headers + # and if the first field of the first line (':' sperated) + # does not contain a space then it _should_ be a header + # and we can process all lines before a blank "" line as + # headers. + $field = substr($lines[0],0,strpos($lines[0],":")); + $in_headers = false; + if(!empty($field) && !strstr($field," ")) { + $in_headers = true; + } + + $max_line_length = 998; # used below; set here for ease in change + + while(list(,$line) = @each($lines)) { + $lines_out = null; + if($line == "" && $in_headers) { + $in_headers = false; + } + # ok we need to break this line up into several + # smaller lines + while(strlen($line) > $max_line_length) { + $pos = strrpos(substr($line,0,$max_line_length)," "); + + # Patch to fix DOS attack + if(!$pos) { + $pos = $max_line_length - 1; + } + + $lines_out[] = substr($line,0,$pos); + $line = substr($line,$pos + 1); + # if we are processing headers we need to + # add a LWSP-char to the front of the new line + # rfc 822 on long msg headers + if($in_headers) { + $line = "\t" . $line; + } + } + $lines_out[] = $line; + + # now send the lines to the server + while(list(,$line_out) = @each($lines_out)) { + if(strlen($line_out) > 0) + { + if(substr($line_out, 0, 1) == ".") { + $line_out = "." . $line_out; + } + } + fputs($this->smtp_conn,$line_out . $this->CRLF); + } + } + + # ok all the message data has been sent so lets get this + # over with aleady + fputs($this->smtp_conn, $this->CRLF . "." . $this->CRLF); + + $rply = $this->get_lines(); + $code = substr($rply,0,3); + + if($this->do_debug >= 2) { + echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply; + } + + if($code != 250) { + $this->error = + array("error" => "DATA not accepted from server", + "smtp_code" => $code, + "smtp_msg" => substr($rply,4)); + if($this->do_debug >= 1) { + echo "SMTP -> ERROR: " . $this->error["error"] . + ": " . $rply . $this->CRLF; + } + return false; + } + return true; + } + + /** + * Expand takes the name and asks the server to list all the + * people who are members of the _list_. Expand will return + * back and array of the result or false if an error occurs. + * Each value in the array returned has the format of: + * [ ] + * The definition of is defined in rfc 821 + * + * Implements rfc 821: EXPN + * + * SMTP CODE SUCCESS: 250 + * SMTP CODE FAILURE: 550 + * SMTP CODE ERROR : 500,501,502,504,421 + * @access public + * @return string array + */ + function Expand($name) { + $this->error = null; # so no confusion is caused + + if(!$this->connected()) { + $this->error = array( + "error" => "Called Expand() without being connected"); + return false; + } + + fputs($this->smtp_conn,"EXPN " . $name . $this->CRLF); + + $rply = $this->get_lines(); + $code = substr($rply,0,3); + + if($this->do_debug >= 2) { + echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply; + } + + if($code != 250) { + $this->error = + array("error" => "EXPN not accepted from server", + "smtp_code" => $code, + "smtp_msg" => substr($rply,4)); + if($this->do_debug >= 1) { + echo "SMTP -> ERROR: " . $this->error["error"] . + ": " . $rply . $this->CRLF; + } + return false; + } + + # parse the reply and place in our array to return to user + $entries = explode($this->CRLF,$rply); + while(list(,$l) = @each($entries)) { + $list[] = substr($l,4); + } + + return $list; + } + + /** + * Sends the HELO command to the smtp server. + * This makes sure that we and the server are in + * the same known state. + * + * Implements from rfc 821: HELO + * + * SMTP CODE SUCCESS: 250 + * SMTP CODE ERROR : 500, 501, 504, 421 + * @access public + * @return bool + */ + function Hello($host="") { + $this->error = null; # so no confusion is caused + + if(!$this->connected()) { + $this->error = array( + "error" => "Called Hello() without being connected"); + return false; + } + + # if a hostname for the HELO was not specified determine + # a suitable one to send + if(empty($host)) { + # we need to determine some sort of appopiate default + # to send to the server + $host = "localhost"; + } + + // Send extended hello first (RFC 2821) + if(!$this->SendHello("EHLO", $host)) + { + if(!$this->SendHello("HELO", $host)) + return false; + } + + return true; + } + + /** + * Sends a HELO/EHLO command. + * @access private + * @return bool + */ + function SendHello($hello, $host) { + fputs($this->smtp_conn, $hello . " " . $host . $this->CRLF); + + $rply = $this->get_lines(); + $code = substr($rply,0,3); + + if($this->do_debug >= 2) { + echo "SMTP -> FROM SERVER: " . $this->CRLF . $rply; + } + + if($code != 250) { + $this->error = + array("error" => $hello . " not accepted from server", + "smtp_code" => $code, + "smtp_msg" => substr($rply,4)); + if($this->do_debug >= 1) { + echo "SMTP -> ERROR: " . $this->error["error"] . + ": " . $rply . $this->CRLF; + } + return false; + } + + $this->helo_rply = $rply; + + return true; + } + + /** + * Gets help information on the keyword specified. If the keyword + * is not specified then returns generic help, ussually contianing + * A list of keywords that help is available on. This function + * returns the results back to the user. It is up to the user to + * handle the returned data. If an error occurs then false is + * returned with $this->error set appropiately. + * + * Implements rfc 821: HELP [ ] + * + * SMTP CODE SUCCESS: 211,214 + * SMTP CODE ERROR : 500,501,502,504,421 + * @access public + * @return string + */ + function Help($keyword="") { + $this->error = null; # to avoid confusion + + if(!$this->connected()) { + $this->error = array( + "error" => "Called Help() without being connected"); + return false; + } + + $extra = ""; + if(!empty($keyword)) { + $extra = " " . $keyword; + } + + fputs($this->smtp_conn,"HELP" . $extra . $this->CRLF); + + $rply = $this->get_lines(); + $code = substr($rply,0,3); + + if($this->do_debug >= 2) { + echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply; + } + + if($code != 211 && $code != 214) { + $this->error = + array("error" => "HELP not accepted from server", + "smtp_code" => $code, + "smtp_msg" => substr($rply,4)); + if($this->do_debug >= 1) { + echo "SMTP -> ERROR: " . $this->error["error"] . + ": " . $rply . $this->CRLF; + } + return false; + } + + return $rply; + } + + /** + * Starts a mail transaction from the email address specified in + * $from. Returns true if successful or false otherwise. If True + * the mail transaction is started and then one or more Recipient + * commands may be called followed by a Data command. + * + * Implements rfc 821: MAIL FROM: + * + * SMTP CODE SUCCESS: 250 + * SMTP CODE SUCCESS: 552,451,452 + * SMTP CODE SUCCESS: 500,501,421 + * @access public + * @return bool + */ + function Mail($from) { + $this->error = null; # so no confusion is caused + + if(!$this->connected()) { + $this->error = array( + "error" => "Called Mail() without being connected"); + return false; + } + + $useVerp = ($this->do_verp ? "XVERP" : ""); + fputs($this->smtp_conn,"MAIL FROM:<" . $from . ">" . $useVerp . $this->CRLF); + + $rply = $this->get_lines(); + $code = substr($rply,0,3); + + if($this->do_debug >= 2) { + echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply; + } + + if($code != 250) { + $this->error = + array("error" => "MAIL not accepted from server", + "smtp_code" => $code, + "smtp_msg" => substr($rply,4)); + if($this->do_debug >= 1) { + echo "SMTP -> ERROR: " . $this->error["error"] . + ": " . $rply . $this->CRLF; + } + return false; + } + return true; + } + + /** + * Sends the command NOOP to the SMTP server. + * + * Implements from rfc 821: NOOP + * + * SMTP CODE SUCCESS: 250 + * SMTP CODE ERROR : 500, 421 + * @access public + * @return bool + */ + function Noop() { + $this->error = null; # so no confusion is caused + + if(!$this->connected()) { + $this->error = array( + "error" => "Called Noop() without being connected"); + return false; + } + + fputs($this->smtp_conn,"NOOP" . $this->CRLF); + + $rply = $this->get_lines(); + $code = substr($rply,0,3); + + if($this->do_debug >= 2) { + echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply; + } + + if($code != 250) { + $this->error = + array("error" => "NOOP not accepted from server", + "smtp_code" => $code, + "smtp_msg" => substr($rply,4)); + if($this->do_debug >= 1) { + echo "SMTP -> ERROR: " . $this->error["error"] . + ": " . $rply . $this->CRLF; + } + return false; + } + return true; + } + + /** + * Sends the quit command to the server and then closes the socket + * if there is no error or the $close_on_error argument is true. + * + * Implements from rfc 821: QUIT + * + * SMTP CODE SUCCESS: 221 + * SMTP CODE ERROR : 500 + * @access public + * @return bool + */ + function Quit($close_on_error=true) { + $this->error = null; # so there is no confusion + + if(!$this->connected()) { + $this->error = array( + "error" => "Called Quit() without being connected"); + return false; + } + + # send the quit command to the server + fputs($this->smtp_conn,"quit" . $this->CRLF); + + # get any good-bye messages + $byemsg = $this->get_lines(); + + if($this->do_debug >= 2) { + echo "SMTP -> FROM SERVER:" . $this->CRLF . $byemsg; + } + + $rval = true; + $e = null; + + $code = substr($byemsg,0,3); + if($code != 221) { + # use e as a tmp var cause Close will overwrite $this->error + $e = array("error" => "SMTP server rejected quit command", + "smtp_code" => $code, + "smtp_rply" => substr($byemsg,4)); + $rval = false; + if($this->do_debug >= 1) { + echo "SMTP -> ERROR: " . $e["error"] . ": " . + $byemsg . $this->CRLF; + } + } + + if(empty($e) || $close_on_error) { + $this->Close(); + } + + return $rval; + } + + /** + * Sends the command RCPT to the SMTP server with the TO: argument of $to. + * Returns true if the recipient was accepted false if it was rejected. + * + * Implements from rfc 821: RCPT TO: + * + * SMTP CODE SUCCESS: 250,251 + * SMTP CODE FAILURE: 550,551,552,553,450,451,452 + * SMTP CODE ERROR : 500,501,503,421 + * @access public + * @return bool + */ + function Recipient($to) { + $this->error = null; # so no confusion is caused + + if(!$this->connected()) { + $this->error = array( + "error" => "Called Recipient() without being connected"); + return false; + } + + fputs($this->smtp_conn,"RCPT TO:<" . $to . ">" . $this->CRLF); + + $rply = $this->get_lines(); + $code = substr($rply,0,3); + + if($this->do_debug >= 2) { + echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply; + } + + if($code != 250 && $code != 251) { + $this->error = + array("error" => "RCPT not accepted from server", + "smtp_code" => $code, + "smtp_msg" => substr($rply,4)); + if($this->do_debug >= 1) { + echo "SMTP -> ERROR: " . $this->error["error"] . + ": " . $rply . $this->CRLF; + } + return false; + } + return true; + } + + /** + * Sends the RSET command to abort and transaction that is + * currently in progress. Returns true if successful false + * otherwise. + * + * Implements rfc 821: RSET + * + * SMTP CODE SUCCESS: 250 + * SMTP CODE ERROR : 500,501,504,421 + * @access public + * @return bool + */ + function Reset() { + $this->error = null; # so no confusion is caused + + if(!$this->connected()) { + $this->error = array( + "error" => "Called Reset() without being connected"); + return false; + } + + fputs($this->smtp_conn,"RSET" . $this->CRLF); + + $rply = $this->get_lines(); + $code = substr($rply,0,3); + + if($this->do_debug >= 2) { + echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply; + } + + if($code != 250) { + $this->error = + array("error" => "RSET failed", + "smtp_code" => $code, + "smtp_msg" => substr($rply,4)); + if($this->do_debug >= 1) { + echo "SMTP -> ERROR: " . $this->error["error"] . + ": " . $rply . $this->CRLF; + } + return false; + } + + return true; + } + + /** + * Starts a mail transaction from the email address specified in + * $from. Returns true if successful or false otherwise. If True + * the mail transaction is started and then one or more Recipient + * commands may be called followed by a Data command. This command + * will send the message to the users terminal if they are logged + * in. + * + * Implements rfc 821: SEND FROM: + * + * SMTP CODE SUCCESS: 250 + * SMTP CODE SUCCESS: 552,451,452 + * SMTP CODE SUCCESS: 500,501,502,421 + * @access public + * @return bool + */ + function Send($from) { + $this->error = null; # so no confusion is caused + + if(!$this->connected()) { + $this->error = array( + "error" => "Called Send() without being connected"); + return false; + } + + fputs($this->smtp_conn,"SEND FROM:" . $from . $this->CRLF); + + $rply = $this->get_lines(); + $code = substr($rply,0,3); + + if($this->do_debug >= 2) { + echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply; + } + + if($code != 250) { + $this->error = + array("error" => "SEND not accepted from server", + "smtp_code" => $code, + "smtp_msg" => substr($rply,4)); + if($this->do_debug >= 1) { + echo "SMTP -> ERROR: " . $this->error["error"] . + ": " . $rply . $this->CRLF; + } + return false; + } + return true; + } + + /** + * Starts a mail transaction from the email address specified in + * $from. Returns true if successful or false otherwise. If True + * the mail transaction is started and then one or more Recipient + * commands may be called followed by a Data command. This command + * will send the message to the users terminal if they are logged + * in and send them an email. + * + * Implements rfc 821: SAML FROM: + * + * SMTP CODE SUCCESS: 250 + * SMTP CODE SUCCESS: 552,451,452 + * SMTP CODE SUCCESS: 500,501,502,421 + * @access public + * @return bool + */ + function SendAndMail($from) { + $this->error = null; # so no confusion is caused + + if(!$this->connected()) { + $this->error = array( + "error" => "Called SendAndMail() without being connected"); + return false; + } + + fputs($this->smtp_conn,"SAML FROM:" . $from . $this->CRLF); + + $rply = $this->get_lines(); + $code = substr($rply,0,3); + + if($this->do_debug >= 2) { + echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply; + } + + if($code != 250) { + $this->error = + array("error" => "SAML not accepted from server", + "smtp_code" => $code, + "smtp_msg" => substr($rply,4)); + if($this->do_debug >= 1) { + echo "SMTP -> ERROR: " . $this->error["error"] . + ": " . $rply . $this->CRLF; + } + return false; + } + return true; + } + + /** + * Starts a mail transaction from the email address specified in + * $from. Returns true if successful or false otherwise. If True + * the mail transaction is started and then one or more Recipient + * commands may be called followed by a Data command. This command + * will send the message to the users terminal if they are logged + * in or mail it to them if they are not. + * + * Implements rfc 821: SOML FROM: + * + * SMTP CODE SUCCESS: 250 + * SMTP CODE SUCCESS: 552,451,452 + * SMTP CODE SUCCESS: 500,501,502,421 + * @access public + * @return bool + */ + function SendOrMail($from) { + $this->error = null; # so no confusion is caused + + if(!$this->connected()) { + $this->error = array( + "error" => "Called SendOrMail() without being connected"); + return false; + } + + fputs($this->smtp_conn,"SOML FROM:" . $from . $this->CRLF); + + $rply = $this->get_lines(); + $code = substr($rply,0,3); + + if($this->do_debug >= 2) { + echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply; + } + + if($code != 250) { + $this->error = + array("error" => "SOML not accepted from server", + "smtp_code" => $code, + "smtp_msg" => substr($rply,4)); + if($this->do_debug >= 1) { + echo "SMTP -> ERROR: " . $this->error["error"] . + ": " . $rply . $this->CRLF; + } + return false; + } + return true; + } + + /** + * This is an optional command for SMTP that this class does not + * support. This method is here to make the RFC821 Definition + * complete for this class and __may__ be implimented in the future + * + * Implements from rfc 821: TURN + * + * SMTP CODE SUCCESS: 250 + * SMTP CODE FAILURE: 502 + * SMTP CODE ERROR : 500, 503 + * @access public + * @return bool + */ + function Turn() { + $this->error = array("error" => "This method, TURN, of the SMTP ". + "is not implemented"); + if($this->do_debug >= 1) { + echo "SMTP -> NOTICE: " . $this->error["error"] . $this->CRLF; + } + return false; + } + + /** + * Verifies that the name is recognized by the server. + * Returns false if the name could not be verified otherwise + * the response from the server is returned. + * + * Implements rfc 821: VRFY + * + * SMTP CODE SUCCESS: 250,251 + * SMTP CODE FAILURE: 550,551,553 + * SMTP CODE ERROR : 500,501,502,421 + * @access public + * @return int + */ + function Verify($name) { + $this->error = null; # so no confusion is caused + + if(!$this->connected()) { + $this->error = array( + "error" => "Called Verify() without being connected"); + return false; + } + + fputs($this->smtp_conn,"VRFY " . $name . $this->CRLF); + + $rply = $this->get_lines(); + $code = substr($rply,0,3); + + if($this->do_debug >= 2) { + echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply; + } + + if($code != 250 && $code != 251) { + $this->error = + array("error" => "VRFY failed on name '$name'", + "smtp_code" => $code, + "smtp_msg" => substr($rply,4)); + if($this->do_debug >= 1) { + echo "SMTP -> ERROR: " . $this->error["error"] . + ": " . $rply . $this->CRLF; + } + return false; + } + return $rply; + } + + /******************************************************************* + * INTERNAL FUNCTIONS * + ******************************************************************/ + + /** + * Read in as many lines as possible + * either before eof or socket timeout occurs on the operation. + * With SMTP we can tell if we have more lines to read if the + * 4th character is '-' symbol. If it is a space then we don't + * need to read anything else. + * @access private + * @return string + */ + function get_lines() { + $data = ""; + while($str = @fgets($this->smtp_conn,515)) { + if($this->do_debug >= 4) { + echo "SMTP -> get_lines(): \$data was \"$data\"" . + $this->CRLF; + echo "SMTP -> get_lines(): \$str is \"$str\"" . + $this->CRLF; + } + $data .= $str; + if($this->do_debug >= 4) { + echo "SMTP -> get_lines(): \$data is \"$data\"" . $this->CRLF; + } + # if the 4th character is a space then we are done reading + # so just break the loop + if(substr($str,3,1) == " ") { break; } + } + return $data; + } + +} + + + ?> diff --git a/includes/class_vcard.php b/includes/class_vcard.php new file mode 100644 index 0000000000..6e211218e7 --- /dev/null +++ b/includes/class_vcard.php @@ -0,0 +1,198 @@ +log = "New vcard() called
"; + $this->data = array( + "display_name"=>null + ,"first_name"=>null + ,"last_name"=>null + ,"additional_name"=>null + ,"name_prefix"=>null + ,"name_suffix"=>null + ,"nickname"=>null + ,"title"=>null + ,"role"=>null + ,"department"=>null + ,"company"=>null + ,"work_po_box"=>null + ,"work_extended_address"=>null + ,"work_address"=>null + ,"work_city"=>null + ,"work_state"=>null + ,"work_postal_code"=>null + ,"work_country"=>null + ,"home_po_box"=>null + ,"home_extended_address"=>null + ,"home_address"=>null + ,"home_city"=>null + ,"home_state"=>null + ,"home_postal_code"=>null + ,"home_country"=>null + ,"office_tel"=>null + ,"home_tel"=>null + ,"cell_tel"=>null + ,"fax_tel"=>null + ,"pager_tel"=>null + ,"email1"=>null + ,"email2"=>null + ,"url"=>null + ,"photo"=>null + ,"birthday"=>null + ,"timezone"=>null + ,"sort_string"=>null + ,"note"=>null + ); + return true; + } + + /* + build() method checks all the values, builds appropriate defaults for + missing values, generates the vcard data string. + */ + function build() { + $this->log .= "vcard build() called
"; + /* + For many of the values, if they are not passed in, we set defaults or + build them based on other values. + */ + if (!$this->class) { $this->class = "PUBLIC"; } + if (!$this->data['display_name']) { + $this->data['display_name'] = trim($this->data['first_name']." ".$this->data['last_name']); + } + if (!$this->data['sort_string']) { $this->data['sort_string'] = $this->data['last_name']; } + if (!$this->data['sort_string']) { $this->data['sort_string'] = $this->data['company']; } + if (!$this->data['timezone']) { $this->data['timezone'] = date("O"); } + if (!$this->revision_date) { $this->revision_date = date('Y-m-d H:i:s'); } + + $this->card = "BEGIN:VCARD\r\n"; + $this->card .= "VERSION:3.0\r\n"; + //$this->card .= "CLASS:".$this->class."\r\n"; + //$this->card .= "PRODID:-//class_vcard from TroyWolf.com//NONSGML Version 1//EN\r\n"; + $this->card .= "REV:".$this->revision_date."\r\n"; + $this->card .= "FN:".$this->data['display_name']."\r\n"; + $this->card .= "N:"; + $this->card .= $this->data['last_name'].";"; + $this->card .= $this->data['first_name'].";"; + if (strlen($this->data['additional_name']) > 0) { + $this->card .= $this->data['additional_name'].";"; + } + if (strlen($this->data['name_prefix']) > 0) { + $this->card .= $this->data['name_prefix'].";"; + } + if (strlen($this->data['name_suffix']) > 0) { + $this->card .= $this->data['name_suffix']."\r\n"; + } + if ($this->data['nickname']) { $this->card .= "NICKNAME:".$this->data['contact_nickname']."\r\n"; } + if ($this->data['title']) { $this->card .= "TITLE:".$this->data['title']."\r\n"; } + if ($this->data['company']) { $this->card .= "ORG:".$this->data['company']; } + if ($this->data['department']) { $this->card .= ";".$this->data['department']; } + $this->card .= "\r\n"; + + if ($this->data['work_po_box'] + || $this->data['work_extended_address'] + || $this->data['work_address'] + || $this->data['work_city'] + || $this->data['work_state'] + || $this->data['work_postal_code'] + || $this->data['work_country']) { + $this->card .= "ADR;TYPE=work:"; + if (strlen($this->data['work_po_box']) > 0) { + $this->card .= $this->data['work_po_box'].";"; + } + if (strlen($this->data['work_extended_address']) > 0) { + $this->card .= $this->data['work_extended_address'].";"; + } + if (strlen($this->data['work_address']) > 0) { + $this->card .= $this->data['work_address'].";"; + } + if (strlen($this->data['work_city']) > 0) { + $this->card .= $this->data['work_city'].";"; + } + if (strlen($this->data['work_state']) > 0) { + $this->card .= $this->data['work_state'].";"; + } + if (strlen($this->data['work_postal_code']) > 0) { + $this->card .= $this->data['work_postal_code'].";"; + } + if (strlen($this->data['work_country']) > 0) { + $this->card .= $this->data['work_country'].""; + } + $this->card .= "\r\n"; + } + if ($this->data['home_po_box'] + || $this->data['home_extended_address'] + || $this->data['home_address'] + || $this->data['home_city'] + || $this->data['home_state'] + || $this->data['home_postal_code'] + || $this->data['home_country']) { + $this->card .= "ADR;TYPE=home:"; + if (strlen($this->data['home_po_box']) > 0) { + $this->card .= $this->data['home_po_box'].";"; + } + if (strlen($this->data['home_extended_address']) > 0) { + $this->card .= $this->data['home_extended_address'].";"; + } + if (strlen($this->data['home_address']) > 0) { + $this->card .= $this->data['home_address'].";"; + } + if (strlen($this->data['home_city']) > 0) { + $this->card .= $this->data['home_city'].";"; + } + if (strlen($this->data['home_state']) > 0) { + $this->card .= $this->data['home_state'].""; + } + if (strlen($this->data['home_postal_code']) > 0) { + $this->card .= $this->data['home_postal_code'].";"; + } + if (strlen($this->data['home_country']) > 0) { + $this->card .= $this->data['home_country']; + } + $this->card .= "\r\n"; + } + if ($this->data['email1']) { $this->card .= "EMAIL;TYPE=internet,pref:".$this->data['email1']."\r\n"; } + if ($this->data['email2']) { $this->card .= "EMAIL;TYPE=internet:".$this->data['email2']."\r\n"; } + if ($this->data['office_tel']) { $this->card .= "TEL;TYPE=work,voice:".$this->data['office_tel']."\r\n"; } + if ($this->data['home_tel']) { $this->card .= "TEL;TYPE=home,voice:".$this->data['home_tel']."\r\n"; } + if ($this->data['cell_tel']) { $this->card .= "TEL;TYPE=cell,voice:".$this->data['cell_tel']."\r\n"; } + if ($this->data['fax_tel']) { $this->card .= "TEL;TYPE=work,fax:".$this->data['fax_tel']."\r\n"; } + if ($this->data['pager_tel']) { $this->card .= "TEL;TYPE=work,pager:".$this->data['pager_tel']."\r\n"; } + if ($this->data['url']) { $this->card .= "URL;TYPE=work:".$this->data['url']."\r\n"; } + if ($this->data['birthday']) { $this->card .= "BDAY:".$this->data['birthday']."\r\n"; } + if ($this->data['role']) { $this->card .= "ROLE:".$this->data['role']."\r\n"; } + if ($this->data['note']) { $this->card .= "NOTE:".$this->data['note']."\r\n"; } + $this->card .= "TZ:".$this->data['timezone']."\r\n"; + $this->card .= "END:VCARD\r\n"; + } + + /* + download() method streams the vcard to the browser client. + */ + function download() { + $this->log .= "vcard download() called
"; + if (!$this->card) { $this->build(); } + if (!$this->filename) { $this->filename = trim($this->data['display_name']); } + $this->filename = str_replace(" ", "_", $this->filename); + header("Content-type: text/directory"); + header("Content-Disposition: attachment; filename=".$this->filename.".vcf"); + header("Pragma: public"); + echo $this->card; + return true; + } +} diff --git a/includes/classes/array_order.php b/includes/classes/array_order.php new file mode 100644 index 0000000000..e4e72c1a80 --- /dev/null +++ b/includes/classes/array_order.php @@ -0,0 +1,45 @@ +sort_fields = array_slice($args, 1); + if (!$this->sort_fields) return $array(); + + if ($this->numeric) { + usort($array, array($this, 'numericCompare')); + } else { + usort($array, array($this, 'stringCompare')); + } + return $array; + } + + function numericCompare($a, $b) { + foreach($this->sort_fields as $sort_field) { + if ($a[$sort_field] == $b[$sort_field]) { + continue; + } + return ($a[$sort_field] < $b[$sort_field]) ? ($this->backwards ? 1 : -1) : ($this->backwards ? -1 : 1); + } + return 0; + } + + function stringCompare($a, $b) { + foreach($this->sort_fields as $sort_field) { + $cmp_result = strcasecmp($a[$sort_field], $b[$sort_field]); + if ($cmp_result == 0) continue; + return ($this->backwards ? -$cmp_result : $cmp_result); + } + return 0; + } +} +//$order = new array_order(); +//$registrations = $order->sort($registrations, 'domain', 'user'); + +?> \ No newline at end of file diff --git a/includes/classes/call_forward.php b/includes/classes/call_forward.php new file mode 100644 index 0000000000..b681c56e9f --- /dev/null +++ b/includes/classes/call_forward.php @@ -0,0 +1,195 @@ + + Copyright (C) 2010 + All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; + +//define the call_forward class + class call_forward { + public $domain_uuid; + public $db_type; + public $call_forward_uuid; + public $extension; + public $call_forward_enabled; + public $call_forward_number; + + public function call_forward_add() { + global $db; + $hunt_group_extension = $this->extension; + $huntgroup_name = 'call_forward_'.$this->extension; + $hunt_group_type = 'call_forward'; + $hunt_group_context = $_SESSION['context']; + $hunt_group_timeout_destination = $this->extension; + $hunt_group_timeout_type = 'voicemail'; + $hunt_group_ring_back = 'us-ring'; + $hunt_group_cid_name_prefix = ''; + $hunt_group_pin = ''; + $huntgroup_caller_announce = 'false'; + $hunt_group_user_list = ''; + $hunt_group_enabled = $this->call_forward_enabled; + $hunt_group_description = 'call forward '.$this->extension; + + $sql = "insert into v_hunt_groups "; + $sql .= "("; + $sql .= "domain_uuid, "; + $sql .= "hunt_group_uuid, "; + $sql .= "hunt_group_extension, "; + $sql .= "hunt_group_name, "; + $sql .= "hunt_group_type, "; + $sql .= "hunt_group_context, "; + $sql .= "hunt_group_timeout, "; + $sql .= "hunt_group_timeout_destination, "; + $sql .= "hunt_group_timeout_type, "; + $sql .= "hunt_group_ringback, "; + $sql .= "hunt_group_cid_name_prefix, "; + $sql .= "hunt_group_pin, "; + $sql .= "hunt_group_call_prompt, "; + $sql .= "hunt_group_caller_announce, "; + $sql .= "hunt_group_user_list, "; + $sql .= "hunt_group_enabled, "; + $sql .= "hunt_group_description "; + $sql .= ")"; + $sql .= "values "; + $sql .= "("; + $sql .= "'$this->domain_uuid', "; + $sql .= "'".$this->call_forward_uuid."', "; + $sql .= "'$hunt_group_extension', "; + $sql .= "'$huntgroup_name', "; + $sql .= "'$hunt_group_type', "; + $sql .= "'$hunt_group_context', "; + $sql .= "'$hunt_group_timeout', "; + $sql .= "'$hunt_group_timeout_destination', "; + $sql .= "'$hunt_group_timeout_type', "; + $sql .= "'$hunt_group_ring_back', "; + $sql .= "'$hunt_group_cid_name_prefix', "; + $sql .= "'$hunt_group_pin', "; + $sql .= "'$hunt_group_call_prompt', "; + $sql .= "'$huntgroup_caller_announce', "; + $sql .= "'$hunt_group_user_list', "; + $sql .= "'$hunt_group_enabled', "; + $sql .= "'$hunt_group_description' "; + $sql .= ")"; + if ($v_debug) { + echo "add: ".$sql."
"; + } + $db->exec(check_sql($sql)); + unset($sql); + $this->call_forward_destination(); + } + + public function call_forward_update() { + global $db; + $hunt_group_extension = $this->extension; + $huntgroup_name = 'call_forward_'.$this->extension; + $hunt_group_type = 'call_forward'; + $hunt_group_context = $_SESSION['context']; + $hunt_group_timeout_destination = $this->extension; + $hunt_group_timeout_type = 'voicemail'; + $hunt_group_ring_back = 'us-ring'; + $hunt_group_cid_name_prefix = ''; + $hunt_group_pin = ''; + $huntgroup_caller_announce = 'false'; + $hunt_group_user_list = ''; + $hunt_group_enabled = $this->call_forward_enabled; + $hunt_group_description = 'call forward '.$this->extension; + + $sql = "update v_hunt_groups set "; + $sql .= "hunt_group_extension = '$hunt_group_extension', "; + $sql .= "hunt_group_name = '$huntgroup_name', "; + $sql .= "hunt_group_type = '$hunt_group_type', "; + $sql .= "hunt_group_context = '$hunt_group_context', "; + $sql .= "hunt_group_timeout = '$hunt_group_timeout', "; + $sql .= "hunt_group_timeout_destination = '$hunt_group_timeout_destination', "; + $sql .= "hunt_group_timeout_type = '$hunt_group_timeout_type', "; + $sql .= "hunt_group_ringback = '$hunt_group_ring_back', "; + $sql .= "hunt_group_cid_name_prefix = '$hunt_group_cid_name_prefix', "; + $sql .= "hunt_group_pin = '$hunt_group_pin', "; + $sql .= "hunt_group_call_prompt = '$hunt_group_call_prompt', "; + $sql .= "hunt_group_caller_announce = '$huntgroup_caller_announce', "; + $sql .= "hunt_group_user_list = '$hunt_group_user_list', "; + $sql .= "hunt_group_enabled = '$hunt_group_enabled', "; + $sql .= "hunt_group_description = '$hunt_group_description' "; + $sql .= "where domain_uuid = '$this->domain_uuid' "; + $sql .= "and hunt_group_uuid = '$this->call_forward_uuid' "; + $db->exec(check_sql($sql)); + unset($sql); + $this->call_forward_destination(); + } //end function + + public function call_forward_destination() { + global $db; + //delete related v_hunt_group_destinations + $sql = "delete from v_hunt_group_destinations where hunt_group_uuid = '$this->call_forward_uuid' "; + $db->exec(check_sql($sql)); + //check whether the number is an extension or external number + if (strlen($this->call_forward_number) > 7) { + $destination_type = 'sip uri'; + $destination_profile = ''; + } + else { + $destination_type = 'extension'; + $destination_profile = 'internal'; + } + //prepare the variables + $destination_data = $this->call_forward_number; + $destination_timeout = ''; + $destination_order = '1'; + $destination_enabled = 'true'; + $destination_description = 'call forward'; + //add the hunt group destination + if ($this->call_forward_uuid) { + $sql = "insert into v_hunt_group_destinations "; + $sql .= "("; + $sql .= "hunt_group_destination_uuid, "; + $sql .= "domain_uuid, "; + $sql .= "hunt_group_uuid, "; + $sql .= "destination_data, "; + $sql .= "destination_type, "; + $sql .= "destination_profile, "; + $sql .= "destination_timeout, "; + $sql .= "destination_order, "; + $sql .= "destination_enabled, "; + $sql .= "destination_description "; + $sql .= ") "; + $sql .= "values "; + $sql .= "("; + $sql .= "'".uuid()."', "; + $sql .= "'$this->domain_uuid', "; + $sql .= "'$this->call_forward_uuid', "; + $sql .= "'$destination_data', "; + $sql .= "'$destination_type', "; + $sql .= "'$destination_profile', "; + $sql .= "'$destination_timeout', "; + $sql .= "'$destination_order', "; + $sql .= "'$destination_enabled', "; + $sql .= "'$destination_description' "; + $sql .= ")"; + + $db->exec(check_sql($sql)); + unset($sql); + } + } //end function + } + +?> \ No newline at end of file diff --git a/includes/classes/database.php b/includes/classes/database.php new file mode 100644 index 0000000000..078ab4788d --- /dev/null +++ b/includes/classes/database.php @@ -0,0 +1,469 @@ + + Copyright (C) 2010 + All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; + +//define the database class + if (!class_exists('database')) { + class database { + public $db; + public $result; + public $type; + public $table; + public $where; //array + public $order_by; //array + public $order_type; + public $limit; + public $offset; + public $fields; + public $count; + public $sql; + + public function connect() { + //include config.php + include "root.php"; + include "includes/config.php"; + + //set defaults + if (isset($db_type) > 0) { $this->db_type = $db_type; } + if (isset($db_host) > 0) { $this->db_host = $db_host; } + if (isset($db_port) > 0) { $this->db_port = $db_port; } + if (isset($db_name) > 0) { $this->db_name = $db_name; } + if (isset($db_username) > 0) { $this->db_username = $db_username; } + if (isset($db_password) > 0) { $this->db_password = $db_password; } + if (isset($db_path) > 0) { $this->db_path = $db_path; } + if (isset($db_name) > 0) { $this->db_name = $db_name; } + + //backwards compatibility + if (isset($dbtype) > 0) { $db_type = $dbtype; } + if (isset($dbhost) > 0) { $db_host = $dbhost; } + if (isset($dbport) > 0) { $db_port = $dbport; } + if (isset($dbname) > 0) { $db_name = $dbname; } + if (isset($dbusername) > 0) { $db_username = $dbusername; } + if (isset($dbpassword) > 0) { $db_password = $dbpassword; } + if (isset($dbfilepath) > 0) { $db_path = $db_file_path; } + if (isset($dbfilename) > 0) { $db_name = $dbfilename; } + + if ($this->db_type == "sqlite") { + if (strlen($this->db_name) == 0) { + $server_name = $_SERVER["SERVER_NAME"]; + $server_name = str_replace ("www.", "", $server_name); + $db_name_short = $server_name; + $this->db_name = $server_name.'.db'; + } + else { + $db_name_short = $this->db_name; + } + $this->db_path = $_SERVER["DOCUMENT_ROOT"].PROJECT_PATH.'/secure'; + $this->db_path = realpath($this->db_path); + if (file_exists($this->db_path.'/'.$this->db_name)) { + //echo "main file exists
"; + } + else { + $file_name = $_SERVER["DOCUMENT_ROOT"].PROJECT_PATH.'/includes/install/sql/sqlite.sql'; + $file_contents = file_get_contents($file_name); + try { + //$db = new PDO('sqlite2:example.db'); //sqlite 2 + //$db = new PDO('sqlite::memory:'); //sqlite 3 + $db = new PDO('sqlite:'.$this->db_path.'/'.$this->db_name); //sqlite 3 + $db->beginTransaction(); + } + catch (PDOException $error) { + print "error: " . $error->getMessage() . "
"; + die(); + } + + //replace \r\n with \n then explode on \n + $file_contents = str_replace("\r\n", "\n", $file_contents); + + //loop line by line through all the lines of sql code + $stringarray = explode("\n", $file_contents); + $x = 0; + foreach($stringarray as $sql) { + try { + $db->query($sql); + } + catch (PDOException $error) { + echo "error: " . $error->getMessage() . " sql: $sql
"; + } + $x++; + } + unset ($file_contents, $sql); + $db->commit(); + + if (is_writable($this->db_path.'/'.$this->db_name)) { + //is writable - use database in current location + } + else { + //not writable + echo "The database ".$this->db_path."/".$this->db_name." is not writeable."; + exit; + } + } + try { + //$db = new PDO('sqlite2:example.db'); //sqlite 2 + //$db = new PDO('sqlite::memory:'); //sqlite 3 + $this->db = new PDO('sqlite:'.$this->db_path.'/'.$this->db_name); //sqlite 3 + + //add additional functions to SQLite so that they are accessible inside SQL + //bool PDO::sqliteCreateFunction ( string function_name, callback callback [, int num_args] ) + $this->db->sqliteCreateFunction('md5', 'php_md5', 1); + $this->db->sqliteCreateFunction('unix_timestamp', 'php_unix_time_stamp', 1); + $this->db->sqliteCreateFunction('now', 'php_now', 0); + $this->db->sqliteCreateFunction('str_left', 'php_left', 2); + $this->db->sqliteCreateFunction('str_right', 'php_right', 2); + } + catch (PDOException $error) { + print "error: " . $error->getMessage() . "
"; + die(); + } + } + + if ($this->db_type == "mysql") { + try { + //required for mysql_real_escape_string + if (function_exists(mysql_connect)) { + $mysql_connection = mysql_connect($this->db_host, $this->db_username, $this->db_password); + } + //mysql pdo connection + if (strlen($this->db_host) == 0 && strlen($this->db_port) == 0) { + //if both host and port are empty use the unix socket + $this->db = new PDO("mysql:host=$this->db_host;unix_socket=/var/run/mysqld/mysqld.sock;dbname=$this->db_name", $this->db_username, $this->db_password); + } + else { + if (strlen($this->db_port) == 0) { + //leave out port if it is empty + $this->db = new PDO("mysql:host=$this->db_host;dbname=$this->db_name;", $this->db_username, $this->db_password, array( + PDO::ATTR_ERRMODE, + PDO::ERRMODE_EXCEPTION + )); + } + else { + $this->db = new PDO("mysql:host=$this->db_host;port=$this->db_port;dbname=$this->db_name;", $this->db_username, $this->db_password, array( + PDO::ATTR_ERRMODE, + PDO::ERRMODE_EXCEPTION + )); + } + } + } + catch (PDOException $error) { + print "error: " . $error->getMessage() . "
"; + die(); + } + } + + if ($this->db_type == "pgsql") { + //database connection + try { + if (strlen($this->db_host) > 0) { + if (strlen($this->db_port) == 0) { $this->db_port = "5432"; } + $this->db = new PDO("pgsql:host=$this->db_host port=$this->db_port dbname=$this->db_name user=$this->db_username password=$this->db_password"); + } + else { + $this->db = new PDO("pgsql:dbname=$this->db_name user=$this->db_username password=$this->db_password"); + } + } + catch (PDOException $error) { + print "error: " . $error->getMessage() . "
"; + die(); + } + } + } + + //public function disconnect() { + // return null; + //} + + public function find() { + //connect; + //table; + //where; + //order_by; + //limit; + //offset; + + //connect to the database if needed + if (!$this->db) { + $this->connect(); + } + //get data from the database + $sql = ""; + $sql .= " select * from ".$this->table." "; + if ($this->where) { + $i = 0; + foreach($this->where as $row) { + if ($i == 0) { + $sql .= 'where '.$row['name']." ".$row['operator']." '".$row['value']."' "; + } + else { + $sql .= "and ".$row['name']." ".$row['operator']." '".$row['value']."' "; + } + $i++; + } + } + if ($this->order_by) { + $sql .= "order by "; + $i = 1; + foreach($this->order_by as $row) { + if (count($this->order_by) == $i) { + $sql .= $row['name']." "; + } + else { + $sql .= $row['name'].", "; + } + $i++; + } + if ($this->order_type) { + $sql .= $this->order_type." "; + } + } + if ($this->limit) { + $sql .= " limit ".$this->limit." offset ".$this->offset." "; + } + //echo $sql; + $prep_statement = $this->db->prepare($sql); + if ($prep_statement) { + $prep_statement->execute(); + return $prep_statement->fetchAll(PDO::FETCH_ASSOC); + } + else { + return false; + } + } + + public function add(){ + //connect to the database if needed + if (!$this->db) { + $this->connect(); + } + //add data to the database + $sql = "insert into ".$this->table; + $sql .= "("; + $i = 1; + foreach($this->fields as $name => $value) { + if (count($this->fields) == $i) { + $sql .= $name." "; + } + else { + $sql .= $name.", "; + } + $i++; + } + $sql .= ") "; + $sql .= "values "; + $sql .= "("; + $i = 1; + foreach($this->fields as $name => $value) { + if (count($this->fields) == $i) { + if (strlen($value) > 0) { + $sql .= "'".$value."' "; + } + else { + $sql .= "'".$value."' "; + } + } + else { + if (strlen($value) > 0) { + $sql .= "'".$value."', "; + } + else { + $sql .= "null, "; + } + } + $i++; + } + $sql .= ")"; + $this->sql = $sql; + $this->db->exec($sql); + unset($this->fields); + unset($sql); + } + + public function update() { + //connect to the database if needed + if (!$this->db) { + $this->connect(); + } + //udate the database + $sql = "update ".$this->table." set "; + $i = 1; + foreach($this->fields as $name => $value) { + if (count($this->fields) == $i) { + if (strlen($name) > 0 && $value == null) { + $sql .= $name." = null "; + } + else { + $sql .= $name." = '".$value."' "; + } + } + else { + if (strlen($name) > 0 && $value == null) { + $sql .= $name." = null, "; + } + else { + $sql .= $name." = '".$value."', "; + } + } + $i++; + } + $i = 0; + foreach($this->where as $row) { + if ($i == 0) { + $sql .= 'where '.$row['name']." ".$row['operator']." '".$row['value']."' "; + } + else { + $sql .= "and ".$row['name']." ".$row['operator']." '".$row['value']."' "; + } + $i++; + } + $this->db->exec(check_sql($sql)); + unset($this->fields); + unset($this->where); + unset($sql); + } + + public function delete(){ + //connect to the database if needed + if (!$this->db) { + $this->connect(); + } + //delete from the database + $sql = "delete from ".$this->table." "; + if ($this->where) { + $i = 0; + foreach($this->where as $row) { + if ($i == 0) { + $sql .= "where ".$row['name']." ".$row['operator']." '".$row['value']."' "; + } + else { + $sql .= "and ".$row['name']." ".$row['operator']." '".$row['value']."' "; + } + $i++; + } + } + //echo $sql."
\n"; + $prep_statement = $this->db->prepare($sql); + $prep_statement->execute(); + unset($sql); + unset($this->where); + } + + public function count() { + //connect to the database if needed + if (!$this->db) { + $this->connect(); + } + //get the number of rows + $sql = " select count(*) as num_rows from ".$this->table; + if ($this->where) { + $i = 0; + foreach($this->where as $row) { + if ($i == 0) { + $sql .= "where ".$row['name']." ".$row['operator']." '".$row['value']."' "; + } + else { + $sql .= "and ".$row['name']." ".$row['operator']." '".$row['value']."' "; + } + $i++; + } + } + unset($this->where); + $prep_statement = $this->db->prepare(check_sql($sql)); + if ($prep_statement) { + $prep_statement->execute(); + $row = $prep_statement->fetch(PDO::FETCH_ASSOC); + if ($row['num_rows'] > 0) { + $this->result = $row['num_rows']; + } + else { + $this->result = 0; + } + } + unset($prep_statement); + } + } + } + +if (!function_exists('php_md5')) { + function php_md5($string) { + return md5($string); + } +} + +if (!function_exists('php_unix_time_stamp')) { + function php_unix_time_stamp($string) { + return strtotime($string); + } +} + +if (!function_exists('php_now')) { + function php_now() { + return date("Y-m-d H:i:s"); + } +} + +if (!function_exists('php_left')) { + function php_left($string, $num) { + return substr($string, 0, $num); + } +} + +if (!function_exists('php_right')) { + function php_right($string, $num) { + return substr($string, (strlen($string)-$num), strlen($string)); + } +} + +//example usage +/* +//find + require_once "includes/classes/database.php"; + $database = new database; + $database->domain_uuid = $_SESSION["domain_uuid"]; + $database->type = $db_type; + $database->table = "v_extensions"; + $where[0]['name'] = 'domain_uuid'; + $where[0]['value'] = $_SESSION["domain_uuid"]; + $where[0]['operator'] = '='; + $database->where = $where; + $order_by[0]['name'] = 'extension'; + $database->order_by = $order_by; + $database->order_type = 'desc'; + $database->limit = '2'; + $database->offset = '0'; + $database->find(); + print_r($database->result); +//insert + require_once "includes/classes/database.php"; + $database = new database; + $database->domain_uuid = $_SESSION["domain_uuid"]; + $database->type = $db_type; + $database->table = "v_ivr_menus"; + $fields[0]['name'] = 'domain_uuid'; + $fields[0]['value'] = $_SESSION["domain_uuid"]; + $database->add(); + print_r($database->result); +*/ +?> \ No newline at end of file diff --git a/includes/classes/dialplan.php b/includes/classes/dialplan.php new file mode 100644 index 0000000000..f59ef5bca9 --- /dev/null +++ b/includes/classes/dialplan.php @@ -0,0 +1,343 @@ + + Copyright (C) 2010 + All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; + +//define the dialplan class + if (!class_exists('dialplan')) { + class dialplan { + //variables + public $result; + public $domain_uuid; + public $dialplan_uuid; + public $xml; + public $json; + public $display_type; + + //dialplans + public $dialplan_name; + public $dialplan_continue; + public $dialplan_order; + public $dialplan_context; + public $dialplan_enabled; + public $dialplan_description; + + //dialplan_details + public $dialplan_detail_tag; + public $dialplan_detail_order; + public $dialplan_detail_type; + public $dialplan_detail_data; + public $dialplan_detail_break; + public $dialplan_detail_inline; + public $dialplan_detail_group; + + public function dialplan_add() { + global $db; + $sql = "insert into v_dialplans "; + $sql .= "("; + $sql .= "domain_uuid, "; + $sql .= "app_uuid, "; + $sql .= "dialplan_uuid, "; + $sql .= "dialplan_name, "; + $sql .= "dialplan_continue, "; + $sql .= "dialplan_order, "; + $sql .= "dialplan_context, "; + $sql .= "dialplan_enabled, "; + $sql .= "dialplan_description "; + $sql .= ")"; + $sql .= "values "; + $sql .= "("; + $sql .= "'".check_str($this->domain_uuid)."', "; + $sql .= "'".check_str($this->app_uuid)."', "; + $sql .= "'".check_str($this->dialplan_uuid)."', "; + $sql .= "'".check_str($this->dialplan_name)."', "; + $sql .= "'".check_str($this->dialplan_continue)."', "; + $sql .= "'".check_str($this->dialplan_order)."', "; + $sql .= "'".check_str($this->dialplan_context)."', "; + $sql .= "'".check_str($this->dialplan_enabled)."', "; + $sql .= "'".check_str($this->dialplan_description)."' "; + $sql .= ")"; + $db->exec(check_sql($sql)); + unset($sql); + } //end function + + public function dialplan_update() { + global $db; + $sql = "update v_dialplans set "; + $sql .= "dialplan_name = '".check_str($this->dialplan_name)."', "; + if (strlen($this->dialplan_continue) > 0) { + $sql .= "dialplan_continue = '".check_str($this->dialplan_continue)."', "; + } + $sql .= "dialplan_order = '".check_str($this->dialplan_order)."', "; + $sql .= "dialplan_context = '".check_str($this->dialplan_context)."', "; + $sql .= "dialplan_enabled = '".check_str($this->dialplan_enabled)."', "; + $sql .= "dialplan_description = '".check_str($this->dialplan_description)."' "; + $sql .= "where domain_uuid = '".check_str($this->domain_uuid)."' "; + $sql .= "and dialplan_uuid = '".check_str($this->dialplan_uuid)."' "; + //echo "sql: ".$sql."
"; + $db->query($sql); + unset($sql); + } + + public function dialplan_detail_add() { + global $db; + $dialplan_detail_uuid = uuid(); + $sql = "insert into v_dialplan_details "; + $sql .= "("; + $sql .= "dialplan_detail_uuid, "; + $sql .= "domain_uuid, "; + $sql .= "dialplan_uuid, "; + $sql .= "dialplan_detail_tag, "; + $sql .= "dialplan_detail_order, "; + $sql .= "dialplan_detail_type, "; + $sql .= "dialplan_detail_data, "; + $sql .= "dialplan_detail_break, "; + $sql .= "dialplan_detail_inline, "; + $sql .= "dialplan_detail_group "; + $sql .= ") "; + $sql .= "values "; + $sql .= "( "; + $sql .= "'".$dialplan_detail_uuid."', "; + $sql .= "'".check_str($this->domain_uuid)."', "; + $sql .= "'".check_str($this->dialplan_uuid)."', "; + $sql .= "'".check_str($this->dialplan_detail_tag)."', "; + $sql .= "'".check_str($this->dialplan_detail_order)."', "; + $sql .= "'".check_str($this->dialplan_detail_type)."', "; + $sql .= "'".check_str($this->dialplan_detail_data)."', "; + if (strlen($this->dialplan_detail_break) == 0) { + $sql .= "null, "; + } + else { + $sql .= "'".check_str($this->dialplan_detail_break)."', "; + } + if (strlen($this->dialplan_detail_inline) == 0) { + $sql .= "null, "; + } + else { + $sql .= "'".check_str($this->dialplan_detail_inline)."', "; + } + if (strlen($this->dialplan_detail_group) == 0) { + $sql .= "null "; + } + else { + $sql .= "'".check_str($this->dialplan_detail_group)."' "; + } + $sql .= ")"; + //echo $sql."\n\n"; + $db->exec(check_sql($sql)); + unset($sql); + } //end function + + public function dialplan_detail_update() { + global $db; + $sql = "update v_dialplans set "; + $sql .= "dialplan_detail_order = '".check_str($this->dialplan_detail_order)."', "; + $sql .= "dialplan_detail_type = '".check_str($this->dialplan_detail_type)."', "; + $sql .= "dialplan_detail_data = '".check_str($this->dialplan_detail_data)."', "; + if (strlen($this->dialplan_detail_break) > 0) { + $sql .= "dialplan_detail_break = '".check_str($this->dialplan_detail_break)."', "; + } + if (strlen($this->dialplan_detail_inline) > 0) { + $sql .= "dialplan_detail_inline = '".check_str($this->dialplan_detail_inline)."', "; + } + if (strlen($this->dialplan_detail_group) > 0) { + $sql .= "dialplan_detail_group = '".check_str($this->dialplan_detail_group)."', "; + } + $sql .= "dialplan_detail_tag = '".check_str($this->dialplan_detail_tag)."' "; + $sql .= "where domain_uuid = '".check_str($this->domain_uuid)."' "; + $sql .= "and dialplan_uuid = '".check_str($this->dialplan_uuid)."' "; + //echo "sql: ".$sql."
"; + $db->query($sql); + unset($sql); + } //end function + + public function restore_advanced_xml() { + $switch_dialplan_dir = $this->switch_dialplan_dir; + if (is_dir($switch_dialplan_dir)) { + //get the contents of the dialplan/default.xml + $file_default_path = $_SERVER["DOCUMENT_ROOT"].PROJECT_PATH.'/includes/templates/conf/dialplan/default.xml'; + $file_default_contents = file_get_contents($file_default_path); + //prepare the file contents and the path + if (count($_SESSION['domains']) < 2) { + //replace the variables in the template in the future loop through all the line numbers to do a replace for each possible line number + $file_default_contents = str_replace("{v_domain}", 'default', $file_default_contents); + //set the file path + $file_path = $switch_dialplan_dir.'/default.xml'; + } + else { + //replace the variables in the template in the future loop through all the line numbers to do a replace for each possible line number + $file_default_contents = str_replace("{v_domain}", $_SESSION['domain_name'], $file_default_contents); + //set the file path + $file_path = $switch_dialplan_dir.'/'.$_SESSION['domain_name'].'.xml'; + } + //write the default dialplan + $fh = fopen($file_path,'w') or die('Unable to write to '.$file_path.'. Make sure the path exists and permissons are set correctly.'); + fwrite($fh, $file_default_contents); + fclose($fh); + //set the message + $this->result['dialplan']['restore']['msg'] = "Default Restored"; + } + } + + private function app_uuid_exists() { + global $db; + $sql = "select count(*) as num_rows from v_dialplans "; + $sql .= "where domain_uuid = '".$this->domain_uuid."' "; + $sql .= "and app_uuid = '".$this->app_uuid."' "; + $prep_statement = $db->prepare(check_sql($sql)); + if ($prep_statement) { + $prep_statement->execute(); + $row = $prep_statement->fetch(PDO::FETCH_ASSOC); + if ($row['num_rows'] > 0) { + return true; + } + else { + return false; + } + } + unset($prep_statement, $result); + } + + public function import() { + if (strlen($this->xml) > 0) { + //convert the xml string to an xml object + $xml = simplexml_load_string($this->xml); + //convert to json + $json = json_encode($xml); + //convert to an array + $dialplan = json_decode($json, true); + } + if (strlen($this->json) > 0) { + //convert to an array + $dialplan = json_decode($json, true); + } + //ensure the condition array uniform + if (!is_array($dialplan['condition'][0])) { + $tmp = $dialplan['condition']; + unset($dialplan['condition']); + $dialplan['condition'][0] = $tmp; + } + //check if the dialplan app uuid exists + $this->app_uuid = $dialplan['@attributes']['app_uuid']; + if ($this->app_uuid_exists()) { + //dialplan entry already exists do nothing + } + else { + //get the attributes + $this->dialplan_uuid = uuid(); + $this->dialplan_name = $dialplan['@attributes']['name']; + if ($this->display_type == "text") { + echo " ".$this->dialplan_name.": added\n"; + } + if (strlen($dialplan['@attributes']['continue']) > 0) { + $this->dialplan_continue = $dialplan['@attributes']['continue']; + } + if (strlen($dialplan['@attributes']['enabled']) > 0) { + $this->dialplan_enabled = $dialplan['@attributes']['enabled']; + } + else { + $this->dialplan_enabled = "true"; + } + $this->dialplan_description = ''; + $this->dialplan_add(); + //loop through the condition array + $x = 0; + $group = 0; + $order = 5; + foreach ($dialplan['condition'] as &$row) { + unset($this->dialplan_detail_break); + unset($this->dialplan_detail_inline); + $this->dialplan_detail_tag = 'condition'; + $this->dialplan_detail_type = $row['@attributes']['field']; + $this->dialplan_detail_data = $row['@attributes']['expression']; + $this->dialplan_detail_group = $group; + $this->dialplan_detail_order = $order; + if (strlen($row['@attributes']['break']) > 0) { + $this->dialplan_detail_break = $row['@attributes']['break']; + } + $this->dialplan_detail_add(); + if (is_array($row['action']) || is_array($row['anti-action'])) { + $condition_self_closing_tag = false; + if (!is_array($row['action'][0])) { + if ($row['action']['@attributes']['application']) { + $tmp = $row['action']; + unset($row['action']); + $row['action'][0] = $tmp; + } + } + if (!is_array($row['anti-action'][0])) { + if ($row['anti-action']['@attributes']['application']) { + $tmp = $row['anti-action']; + unset($row['anti-action']); + $row['anti-action'][0] = $tmp; + } + } + $order = $order + 5; + unset($this->dialplan_detail_break); + unset($this->dialplan_detail_inline); + foreach ($row['action'] as &$row2) { + $this->dialplan_detail_tag = 'action'; + $this->dialplan_detail_type = $row2['@attributes']['application']; + $this->dialplan_detail_data = $row2['@attributes']['data']; + $this->dialplan_detail_data = str_replace("{v_pin_number}", generate_password(8, 1), $this->dialplan_detail_data); + $this->dialplan_detail_data = str_replace("{v_context}", $this->dialplan_context, $this->dialplan_detail_data); + $this->dialplan_detail_data = str_replace("{v_switch_recordings_dir}", $_SESSION['switch']['recordings']['dir'], $this->dialplan_detail_data); + if (strlen($row2['@attributes']['inline']) > 0) { + $this->dialplan_detail_inline = $row2['@attributes']['inline']; + } + $this->dialplan_detail_group = $group; + $this->dialplan_detail_order = $order; + $this->dialplan_detail_add(); + $order = $order + 5; + } + foreach ($row['anti-action'] as &$row2) { + $this->dialplan_detail_tag = 'anti-action'; + $this->dialplan_detail_type = $row2['@attributes']['application']; + $this->dialplan_detail_data = $row2['@attributes']['data']; + $this->dialplan_detail_data = str_replace("{v_pin_number}", generate_password(8, 1), $this->dialplan_detail_data); + $this->dialplan_detail_data = str_replace("{v_context}", $this->dialplan_context, $this->dialplan_detail_data); + $this->dialplan_detail_data = str_replace("{v_switch_recordings_dir}", $_SESSION['switch']['recordings']['dir'], $this->dialplan_detail_data); + $this->dialplan_detail_group = $group; + $this->dialplan_detail_order = $order; + $this->dialplan_detail_add(); + $order = $order + 5; + } + } + else { + $condition_self_closing_tag = true; + } + //if not a self closing tag then increment the group + if (!$condition_self_closing_tag) { + $group++; + } + $row['group'] = $group; + $order = $order + 5; + $x++; + } + } + } + } + } +?> \ No newline at end of file diff --git a/includes/classes/do_not_disturb.php b/includes/classes/do_not_disturb.php new file mode 100644 index 0000000000..f046cd09ee --- /dev/null +++ b/includes/classes/do_not_disturb.php @@ -0,0 +1,169 @@ + + Copyright (C) 2010 + All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; + +//define the dnd class + class do_not_disturb { + public $domain_uuid; + public $dnd_uuid; + public $domain_name; + public $extension; + public $dnd_enabled; + + //update the user_status + public function dnd_status() { + global $db; + if ($this->dnd_enabled == "true") { + //update the call center status + $user_status = "Logged Out"; + $fp = event_socket_create($_SESSION['event_socket_ip_address'], $_SESSION['event_socket_port'], $_SESSION['event_socket_password']); + if ($fp) { + $switch_cmd .= "callcenter_config agent set status ".$_SESSION['username']."@".$domain_name." '".$user_status."'"; + $switch_result = event_socket_request($fp, 'api '.$switch_cmd); + } + + //update the database user_status + $user_status = "Do Not Disturb"; + $sql = "update v_users set "; + $sql .= "user_status = '$user_status' "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and username = '".$_SESSION['username']."' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + } + } //function + + public function dnd_add() { + global $db; + $hunt_group_extension = $this->extension; + $huntgroup_name = 'dnd_'.$this->extension; + $hunt_group_type = 'dnd'; + $hunt_group_context = $_SESSION['context']; + $hunt_group_timeout = '1'; + $hunt_group_timeout_destination = $this->extension; + $hunt_group_timeout_type = 'voicemail'; + $hunt_group_ring_back = 'us-ring'; + //$hunt_group_cid_name_prefix = ''; + //$hunt_group_pin = ''; + //$hunt_group_call_prompt = 'false'; + $huntgroup_caller_announce = 'false'; + //$hunt_group_user_list = ''; + $hunt_group_enabled = $this->dnd_enabled; + $hunt_group_description = 'dnd '.$this->extension; + + $sql = "insert into v_hunt_groups "; + $sql .= "("; + $sql .= "domain_uuid, "; + $sql .= "hunt_group_uuid, "; + $sql .= "hunt_group_extension, "; + $sql .= "hunt_group_name, "; + $sql .= "hunt_group_type, "; + $sql .= "hunt_group_context, "; + $sql .= "hunt_group_timeout, "; + $sql .= "hunt_group_timeout_destination, "; + $sql .= "hunt_group_timeout_type, "; + $sql .= "hunt_group_ringback, "; + //$sql .= "hunt_group_cid_name_prefix, "; + //$sql .= "hunt_group_pin, "; + $sql .= "hunt_group_call_prompt, "; + $sql .= "hunt_group_caller_announce, "; + //$sql .= "hunt_group_user_list, "; + $sql .= "hunt_group_enabled, "; + $sql .= "hunt_group_description "; + $sql .= ")"; + $sql .= "values "; + $sql .= "("; + $sql .= "'$this->domain_uuid', "; + $sql .= "'$this->dnd_uuid', "; + $sql .= "'$hunt_group_extension', "; + $sql .= "'$huntgroup_name', "; + $sql .= "'$hunt_group_type', "; + $sql .= "'$hunt_group_context', "; + $sql .= "'$hunt_group_timeout', "; + $sql .= "'$hunt_group_timeout_destination', "; + $sql .= "'$hunt_group_timeout_type', "; + $sql .= "'$hunt_group_ring_back', "; + //$sql .= "'$hunt_group_cid_name_prefix', "; + //$sql .= "'$hunt_group_pin', "; + $sql .= "'$hunt_group_call_prompt', "; + $sql .= "'$huntgroup_caller_announce', "; + //$sql .= "'$hunt_group_user_list', "; + $sql .= "'$hunt_group_enabled', "; + $sql .= "'$hunt_group_description' "; + $sql .= ")"; + if ($this->debug) { + echo $sql."
"; + } + $db->exec(check_sql($sql)); + unset($sql); + } //function + + public function dnd_update() { + global $db; + + $hunt_group_extension = $this->extension; + $huntgroup_name = 'dnd_'.$this->extension; + $hunt_group_type = 'dnd'; + $hunt_group_context = $_SESSION['context']; + $hunt_group_timeout = '1'; + $hunt_group_timeout_destination = $this->extension; + $hunt_group_timeout_type = 'voicemail'; + $hunt_group_ring_back = 'us-ring'; + //$hunt_group_cid_name_prefix = ''; + //$hunt_group_pin = ''; + //$hunt_group_call_prompt = 'false'; + $huntgroup_caller_announce = 'false'; + //$hunt_group_user_list = ''; + $hunt_group_enabled = $this->dnd_enabled; + $hunt_group_description = 'dnd '.$this->extension; + + $sql = "update v_hunt_groups set "; + $sql .= "hunt_group_extension = '$hunt_group_extension', "; + $sql .= "hunt_group_name = '$huntgroup_name', "; + $sql .= "hunt_group_type = '$hunt_group_type', "; + $sql .= "hunt_group_context = '$hunt_group_context', "; + $sql .= "hunt_group_timeout = '$hunt_group_timeout', "; + $sql .= "hunt_group_timeout_destination = '$hunt_group_timeout_destination', "; + $sql .= "hunt_group_timeout_type = '$hunt_group_timeout_type', "; + $sql .= "hunt_group_ringback = '$hunt_group_ring_back', "; + //$sql .= "hunt_group_cid_name_prefix = '$hunt_group_cid_name_prefix', "; + //$sql .= "hunt_group_pin = '$hunt_group_pin', "; + $sql .= "hunt_group_call_prompt = '$hunt_group_call_prompt', "; + $sql .= "hunt_group_caller_announce = 'false', "; + //$sql .= "hunt_group_user_list = '$hunt_group_user_list', "; + $sql .= "hunt_group_enabled = '$hunt_group_enabled', "; + $sql .= "hunt_group_description = '$hunt_group_description' "; + $sql .= "where domain_uuid = '$this->domain_uuid' "; + $sql .= "and hunt_group_uuid = '$this->dnd_uuid' "; + if ($this->debug) { + echo $sql."
"; + } + $db->exec(check_sql($sql)); + unset($sql); + } //function + } //class + +?> \ No newline at end of file diff --git a/includes/classes/follow_me.php b/includes/classes/follow_me.php new file mode 100644 index 0000000000..bc4a0b924b --- /dev/null +++ b/includes/classes/follow_me.php @@ -0,0 +1,338 @@ + + Copyright (C) 2010 + All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; + +//define the follow me class + class follow_me { + public $domain_uuid; + public $db_type; + public $follow_me_uuid; + public $extension; + public $follow_me_enabled; + public $follow_me_type; + public $hunt_group_call_prompt; + public $hunt_group_timeout; + + public $destination_data_1; + public $destination_type_1; + public $destination_timeout_1; + + public $destination_data_2; + public $destination_type_2; + public $destination_timeout_2; + + public $destination_data_3; + public $destination_type_3; + public $destination_timeout_3; + + public $destination_data_4; + public $destination_type_4; + public $destination_timeout_4; + + public $destination_data_5; + public $destination_type_5; + public $destination_timeout_5; + + public $destination_profile = 'internal'; + public $destination_timeout = ''; + public $destination_order = 1; + public $destination_enabled = 'true'; + public $destination_description = 'follow me'; + + public function follow_me_add() { + global $db; + + $hunt_group_extension = $this->extension; + $hunt_group_name = 'follow_me_'.$this->extension; + $hunt_group_type = $this->follow_me_type; + $hunt_group_context = $_SESSION['context']; + $hunt_group_timeout = $this->hunt_group_timeout; + $hunt_group_timeout_destination = $this->extension; + $hunt_group_timeout_type = 'voicemail'; + $hunt_group_ring_back = 'us-ring'; + //$hunt_group_cid_name_prefix = ''; + //$hunt_group_pin = ''; + $huntgroup_caller_announce = 'false'; + //$hunt_group_user_list = ''; + $hunt_group_enabled = $this->follow_me_enabled; + $hunt_group_description = 'follow me '.$this->extension; + + $sql = "insert into v_hunt_groups "; + $sql .= "("; + $sql .= "domain_uuid, "; + $sql .= "hunt_group_uuid, "; + $sql .= "hunt_group_extension, "; + $sql .= "hunt_group_name, "; + $sql .= "hunt_group_type, "; + $sql .= "hunt_group_context, "; + $sql .= "hunt_group_timeout, "; + $sql .= "hunt_group_timeout_destination, "; + $sql .= "hunt_group_timeout_type, "; + $sql .= "hunt_group_ringback, "; + $sql .= "hunt_group_cid_name_prefix, "; + $sql .= "hunt_group_pin, "; + $sql .= "hunt_group_call_prompt, "; + $sql .= "hunt_group_caller_announce, "; + $sql .= "hunt_group_user_list, "; + $sql .= "hunt_group_enabled, "; + $sql .= "hunt_group_description "; + $sql .= ")"; + $sql .= "values "; + $sql .= "("; + $sql .= "'$this->domain_uuid', "; + $sql .= "'$this->follow_me_uuid', "; + $sql .= "'$hunt_group_extension', "; + $sql .= "'$hunt_group_name', "; + $sql .= "'$hunt_group_type', "; + $sql .= "'$hunt_group_context', "; + $sql .= "'$hunt_group_timeout', "; + $sql .= "'$hunt_group_timeout_destination', "; + $sql .= "'$hunt_group_timeout_type', "; + $sql .= "'$hunt_group_ring_back', "; + $sql .= "'$hunt_group_cid_name_prefix', "; + $sql .= "'$hunt_group_pin', "; + $sql .= "'$hunt_group_call_prompt', "; + $sql .= "'$huntgroup_caller_announce', "; + $sql .= "'$hunt_group_user_list', "; + $sql .= "'$hunt_group_enabled', "; + $sql .= "'$hunt_group_description' "; + $sql .= ")"; + if ($v_debug) { + echo $sql."
"; + } + $db->exec(check_sql($sql)); + unset($sql); + $this->follow_me_destinations(); + } //end function + + public function follow_me_update() { + global $db; + + $hunt_group_extension = $this->extension; + $hunt_group_name = 'follow_me_'.$this->extension; + $hunt_group_type = $this->follow_me_type; + $hunt_group_context = $_SESSION['context']; + $hunt_group_timeout = $this->hunt_group_timeout; + $hunt_group_timeout_destination = $this->extension; + $hunt_group_timeout_type = 'voicemail'; + $hunt_group_ring_back = 'us-ring'; + //$hunt_group_cid_name_prefix = ''; + //$hunt_group_pin = ''; + $huntgroup_caller_announce = 'false'; + //$hunt_group_user_list = ''; + $hunt_group_enabled = $this->follow_me_enabled; + $hunt_group_description = 'follow me '.$this->extension; + + $sql = "update v_hunt_groups set "; + $sql .= "hunt_group_extension = '$hunt_group_extension', "; + $sql .= "hunt_group_name = '$hunt_group_name', "; + $sql .= "hunt_group_type = '$hunt_group_type', "; + $sql .= "hunt_group_context = '$hunt_group_context', "; + $sql .= "hunt_group_timeout = '$hunt_group_timeout', "; + $sql .= "hunt_group_timeout_destination = '$hunt_group_timeout_destination', "; + $sql .= "hunt_group_timeout_type = '$hunt_group_timeout_type', "; + $sql .= "hunt_group_ringback = '$hunt_group_ring_back', "; + $sql .= "hunt_group_cid_name_prefix = '$hunt_group_cid_name_prefix', "; + $sql .= "hunt_group_pin = '$hunt_group_pin', "; + $sql .= "hunt_group_call_prompt = '$this->hunt_group_call_prompt', "; + $sql .= "hunt_group_caller_announce = '$huntgroup_caller_announce', "; + $sql .= "hunt_group_user_list = '$hunt_group_user_list', "; + $sql .= "hunt_group_enabled = '$hunt_group_enabled', "; + $sql .= "hunt_group_description = '$hunt_group_description' "; + $sql .= "where domain_uuid = '$this->domain_uuid' "; + $sql .= "and hunt_group_uuid = '$this->follow_me_uuid' "; + $db->exec(check_sql($sql)); + unset($sql); + $this->follow_me_destinations(); + } //end function + + public function follow_me_destinations() { + global $db; + + //delete related v_hunt_group_destinations + $sql = "delete from v_hunt_group_destinations where hunt_group_uuid = '$this->follow_me_uuid' "; + $db->exec(check_sql($sql)); + + //insert the v_hunt_group_destinations set destination_data_1 + if (strlen($this->destination_data_1) > 0) { + $sql = "insert into v_hunt_group_destinations "; + $sql .= "("; + $sql .= "hunt_group_destination_uuid, "; + $sql .= "domain_uuid, "; + $sql .= "hunt_group_uuid, "; + $sql .= "destination_data, "; + $sql .= "destination_type, "; + $sql .= "destination_profile, "; + $sql .= "destination_timeout, "; + $sql .= "destination_order, "; + $sql .= "destination_enabled, "; + $sql .= "destination_description "; + $sql .= ") "; + $sql .= "values "; + $sql .= "("; + $sql .= "'".uuid()."', "; + $sql .= "'$this->domain_uuid', "; + $sql .= "'$this->follow_me_uuid', "; + $sql .= "'$this->destination_data_1', "; + $sql .= "'$this->destination_type_1', "; + $sql .= "'$this->destination_profile', "; + $sql .= "'$this->destination_timeout_1', "; + $sql .= "'$this->destination_order', "; + $sql .= "'$this->destination_enabled', "; + $sql .= "'$this->destination_description' "; + $sql .= ")"; + $db->exec(check_sql($sql)); + $this->destination_order++; + unset($sql); + } + if (strlen($this->destination_data_2) > 0) { + $sql = "insert into v_hunt_group_destinations "; + $sql .= "("; + $sql .= "hunt_group_destination_uuid, "; + $sql .= "domain_uuid, "; + $sql .= "hunt_group_uuid, "; + $sql .= "destination_data, "; + $sql .= "destination_type, "; + $sql .= "destination_profile, "; + $sql .= "destination_timeout, "; + $sql .= "destination_order, "; + $sql .= "destination_enabled, "; + $sql .= "destination_description "; + $sql .= ") "; + $sql .= "values "; + $sql .= "("; + $sql .= "'".uuid()."', "; + $sql .= "'$this->domain_uuid', "; + $sql .= "'$this->follow_me_uuid', "; + $sql .= "'$this->destination_data_2', "; + $sql .= "'$this->destination_type_2', "; + $sql .= "'$this->destination_profile', "; + $sql .= "'$this->destination_timeout_2', "; + $sql .= "'$this->destination_order', "; + $sql .= "'$this->destination_enabled', "; + $sql .= "'$this->destination_description' "; + $sql .= ")"; + $db->exec(check_sql($sql)); + $this->destination_order++; + unset($sql); + } + if (strlen($this->destination_data_3) > 0) { + $sql = "insert into v_hunt_group_destinations "; + $sql .= "("; + $sql .= "hunt_group_destination_uuid, "; + $sql .= "domain_uuid, "; + $sql .= "hunt_group_uuid, "; + $sql .= "destination_data, "; + $sql .= "destination_type, "; + $sql .= "destination_profile, "; + $sql .= "destination_timeout, "; + $sql .= "destination_order, "; + $sql .= "destination_enabled, "; + $sql .= "destination_description "; + $sql .= ") "; + $sql .= "values "; + $sql .= "("; + $sql .= "'".uuid()."', "; + $sql .= "'$this->domain_uuid', "; + $sql .= "'$this->follow_me_uuid', "; + $sql .= "'$this->destination_data_3', "; + $sql .= "'$this->destination_type_3', "; + $sql .= "'$this->destination_profile', "; + $sql .= "'$this->destination_timeout_3', "; + $sql .= "'$this->destination_order', "; + $sql .= "'$this->destination_enabled', "; + $sql .= "'$this->destination_description' "; + $sql .= ")"; + $db->exec(check_sql($sql)); + $this->destination_order++; + unset($sql); + } + if (strlen($this->destination_data_4) > 0) { + $sql = "insert into v_hunt_group_destinations "; + $sql .= "("; + $sql .= "hunt_group_destination_uuid, "; + $sql .= "domain_uuid, "; + $sql .= "hunt_group_uuid, "; + $sql .= "destination_data, "; + $sql .= "destination_type, "; + $sql .= "destination_profile, "; + $sql .= "destination_timeout, "; + $sql .= "destination_order, "; + $sql .= "destination_enabled, "; + $sql .= "destination_description "; + $sql .= ") "; + $sql .= "values "; + $sql .= "("; + $sql .= "'".uuid()."', "; + $sql .= "'$this->domain_uuid', "; + $sql .= "'$this->follow_me_uuid', "; + $sql .= "'$this->destination_data_4', "; + $sql .= "'$this->destination_type_4', "; + $sql .= "'$this->destination_profile', "; + $sql .= "'$this->destination_timeout_4', "; + $sql .= "'$this->destination_order', "; + $sql .= "'$this->destination_enabled', "; + $sql .= "'$this->destination_description' "; + $sql .= ")"; + $db->exec(check_sql($sql)); + $this->destination_order++; + unset($sql); + } + if (strlen($this->destination_data_5) > 0) { + $sql = "insert into v_hunt_group_destinations "; + $sql .= "("; + $sql .= "hunt_group_destination_uuid, "; + $sql .= "domain_uuid, "; + $sql .= "hunt_group_uuid, "; + $sql .= "destination_data, "; + $sql .= "destination_type, "; + $sql .= "destination_profile, "; + $sql .= "destination_timeout, "; + $sql .= "destination_order, "; + $sql .= "destination_enabled, "; + $sql .= "destination_description "; + $sql .= ") "; + $sql .= "values "; + $sql .= "("; + $sql .= "'".uuid()."', "; + $sql .= "'$this->domain_uuid', "; + $sql .= "'$this->follow_me_uuid', "; + $sql .= "'$this->destination_data_5', "; + $sql .= "'$this->destination_type_5', "; + $sql .= "'$this->destination_profile', "; + $sql .= "'$this->destination_timeout_5', "; + $sql .= "'$this->destination_order', "; + $sql .= "'$this->destination_enabled', "; + $sql .= "'$this->destination_description' "; + $sql .= ")"; + $db->exec(check_sql($sql)); + $this->destination_order++; + unset($sql); + } + } //function + } //class + +?> \ No newline at end of file diff --git a/includes/classes/install.php b/includes/classes/install.php new file mode 100644 index 0000000000..5ce3d3459e --- /dev/null +++ b/includes/classes/install.php @@ -0,0 +1,217 @@ + + Copyright (C) 2010 + All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; + +//define the install class + class install { + + var $result; + var $domain_uuid; + var $domain; + var $switch_conf_dir; + var $switch_scripts_dir; + var $switch_sounds_dir; + + function recursive_copy($src, $dst) { + $dir = opendir($src); + if (!$dir) { + if (!mkdir($src, 0755, true)) { + throw new Exception("recursive_copy() source directory '".$src."' does not exist."); + } + } + if (!is_dir($dst)) { + if (!mkdir($dst, 0755, true)) { + //throw new Exception("recursive_copy() failed to create destination directory '".$dst."'"); + } + } + while(false !== ($file = readdir($dir))) { + if (($file != '.') && ($file != '..')) { + if (is_dir($src.'/'.$file)) { + $this->recursive_copy($src.'/'.$file, $dst.'/'.$file); + } + else { + if (!file_exists($dst.'/'.$file)) { + //echo "copy(".$src."/".$file.", ".$dst."/".$file.");
\n"; + copy($src.'/'.$file, $dst.'/'.$file); + } + } + } + } + closedir($dir); + } + + function recursive_delete($dir) { + if (strlen($dir) > 0) { + foreach (glob($dir) as $file) { + if (is_dir($file)) { + $this->recursive_delete("$file/*"); + rmdir($file); + //echo "rm dir: ".$file."\n"; + } else { + //echo "delete file: ".$file."\n"; + unlink($file); + } + } + } + clearstatcache(); + } + + function copy() { + $this->copy_scripts(); + $this->copy_sounds(); + $this->copy_swf(); + $this->copy_phrases(); + } + + function copy_conf() { + clearstatcache(); + $src_dir = $this->switch_conf_dir; + $dst_dir = $this->switch_conf_dir.'.orig'; + if ($src_dir != "/conf") { + mkdir($src_dir, 0755, true); + } + if (is_readable($src_dir)) { + //make a backup copy of the conf directory + if (substr(strtoupper(PHP_OS), 0, 3) == "WIN") { + $this->recursive_copy($src_dir, $dst_dir); + $this->recursive_delete($this->switch_conf_dir); + } + else { + exec ('mv '.$src_dir.' '.$dst_dir); + //exec ('cp -RLp '.$src_dir.' '.$dst_dir); + } + //make sure the conf directory exists + if (!mkdir($this->switch_conf_dir, 0755, true)) { + //throw new Exception("Failed to create the switch conf directory '".$this->switch_conf_dir."'. "); + } + } + } + + function copy_scripts() { + clearstatcache(); + $src_dir = $_SERVER["DOCUMENT_ROOT"].PROJECT_PATH.'/includes/install/scripts'; + $dst_dir = $this->switch_scripts_dir; + if (is_readable($this->switch_scripts_dir)) { + if ($handle = opendir($src_dir)) { + $i = 0; + $files = array(); + while (false !== ($file = readdir($handle))) { + if ($file != "." && $file != ".." && is_file($src_dir.'/'.$file)) { + if (!file_exists($dst_dir.'/'.$file) ) { + //copy the file if it does not exist in the destination directory + if (copy($src_dir.'/'.$file, $dst_dir.'/'.$file)) { + $this->result['copy']['scripts'][] = "copied from ".$src_dir."/".$file." to ".$dst_dir."/".$file."
\n"; + } + else { + $this->result['copy']['scripts'][] = "copy failed from ".$src_dir."/".$file." to ".$dst_dir."/".$file."
\n"; + } + } + } + } + } + unset($src_dir, $dst_dir); + } + } + + function copy_sounds() { + clearstatcache(); + $src_dir = $_SERVER["DOCUMENT_ROOT"].PROJECT_PATH.'/includes/install/sounds/en/us/callie/custom/8000'; + $dst_dir = $this->switch_sounds_dir.'/en/us/callie/custom/8000'; + if (is_readable($this->switch_sounds_dir)) { + if ($handle = opendir($src_dir)) { + $i = 0; + $files = array(); + while (false !== ($file = readdir($handle))) { + if ($file != "." && $file != ".." && is_file($src_dir.'/'.$file)) { + if (!file_exists($dst_dir.'/'.$file) ) { + //copy the file if it does not exist in the destination directory + if (copy($src_dir.'/'.$file, $dst_dir.'/'.$file)) { + $this->result['copy']['sounds']['8000'][] = "copied from ".$src_dir."/".$file." to ".$dst_dir."/".$file."
\n"; + } + else { + $this->result['copy']['sounds']['8000'][] = "copy failed from ".$src_dir."/".$file." to ".$dst_dir."/".$file."
\n"; + } + } + } + } + } + + $src_dir = $_SERVER["DOCUMENT_ROOT"].PROJECT_PATH.'/includes/install/sounds/en/us/callie/custom/16000'; + $dst_dir = $this->switch_sounds_dir.'/en/us/callie/custom/16000'; + if ($handle = opendir($src_dir)) { + $i = 0; + $files = array(); + while (false !== ($file = readdir($handle))) { + if ($file != "." && $file != ".." && is_file($src_dir.'/'.$file)) { + if (!file_exists($dst_dir.'/'.$file) ) { + //copy the file if it does not exist in the destination directory + if (copy($src_dir.'/'.$file, $dst_dir.'/'.$file)) { + $this->result['copy']['sounds']['16000'][] = "copied from ".$src_dir."/".$file." to ".$dst_dir."/".$file."
\n"; + } + else { + $this->result['copy']['sounds']['16000'][] = "copy failed from ".$src_dir."/".$file." to ".$dst_dir."/".$file."
\n"; + } + } + } + } + } + } + } + + function copy_swf() { + clearstatcache(); + $file = "slim.swf"; + $src_dir = $_SERVER["DOCUMENT_ROOT"].PROJECT_PATH.'/includes/install/htdocs'; + $dst_dir = $_SERVER["DOCUMENT_ROOT"].PROJECT_PATH.'/app/recordings'; + if (copy($src_dir.'/'.$file, $dst_dir.'/'.$file)) { + $this->result['copy']['swf'][] = "copied from ".$src_dir."/".$file." to ".$dst_dir."/".$file."
\n"; + } + else { + $this->result['copy']['swf'][] = "copy failed from ".$src_dir."/".$file." to ".$dst_dir."/".$file."
\n"; + } + } + + function copy_phrases() { + clearstatcache(); + $src_dir = $_SERVER["DOCUMENT_ROOT"].PROJECT_PATH."/includes/templates/conf/lang"; + $dst_dir = $this->switch_conf_dir."/lang"; + if (is_readable($this->switch_conf_dir)) { + $this->recursive_copy($src_dir, $dst_dir); + } + } + + } + +//how to use the class + //include "includes/classes/install.php"; + //$install = new install; + //$install->domain_uuid = $domain_uuid; + //$install->switch_conf_dir = $switch_conf_dir; + //$install->switch_scripts_dir = $switch_scripts_dir; + //$install->switch_sounds_dir = $switch_sounds_dir; + //$install->copy(); + //print_r($install->result); +?> \ No newline at end of file diff --git a/includes/classes/menu.php b/includes/classes/menu.php new file mode 100644 index 0000000000..dcaac5651a --- /dev/null +++ b/includes/classes/menu.php @@ -0,0 +1,340 @@ + + Copyright (C) 2010 + All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ + +//define the follow me class + class menu { + public $menu_uuid; + + //delete items in the menu that are not protected + function delete() { + //set the variable + $db = $this->db; + //remove the old menu + $sql = "delete from v_menu_items "; + $sql .= "where menu_uuid = '".$this->menu_uuid."' "; + $sql .= "and (menu_item_protected <> 'true' "; + $sql .= "or menu_item_protected is null); "; + $db->exec(check_sql($sql)); + } + + //restore the menu + function restore() { + //set the variables + $db = $this->db; + + //get the $apps array from the installed apps from the core and mod directories + $config_list = glob($_SERVER["DOCUMENT_ROOT"] . PROJECT_PATH . "/*/*/app_config.php"); + $x=0; + foreach ($config_list as &$config_path) { + include($config_path); + $x++; + } + + //use the app array to restore the default menu + //$db->beginTransaction(); + foreach ($apps as $row) { + foreach ($row['menu'] as $menu) { + //set the variables + $menu_item_title = $menu['title']['en']; + $menu_item_language = 'en'; + $menu_item_uuid = $menu['uuid']; + $menu_item_parent_uuid = $menu['parent_uuid']; + $menu_item_category = $menu['category']; + $menu_item_path = $menu['path']; + $menu_item_order = $menu['order']; + $menu_item_description = $menu['desc']; + + //if the item uuid is not currently in the db then add it + $sql = "select * from v_menu_items "; + $sql .= "where menu_uuid = '".$this->menu_uuid."' "; + $sql .= "and menu_item_uuid = '$menu_item_uuid' "; + $prep_statement = $db->prepare(check_sql($sql)); + if ($prep_statement) { + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_ASSOC); + if (count($result) == 0) { + //insert the default menu into the database + $sql = "insert into v_menu_items "; + $sql .= "("; + $sql .= "menu_item_uuid, "; + $sql .= "menu_uuid, "; + //$sql .= "menu_item_language, "; + $sql .= "menu_item_title, "; + $sql .= "menu_item_link, "; + $sql .= "menu_item_category, "; + if (strlen($menu_item_order) > 0) { + $sql .= "menu_item_order, "; + } + if (strlen($menu_item_parent_uuid) > 0) { + $sql .= "menu_item_parent_uuid, "; + } + $sql .= "menu_item_description "; + $sql .= ") "; + $sql .= "values "; + $sql .= "("; + $sql .= "'".$menu_item_uuid."', "; + $sql .= "'".$this->menu_uuid."', "; + //$sql .= "'$menu_item_language', "; + $sql .= "'$menu_item_title', "; + $sql .= "'$menu_item_path', "; + $sql .= "'$menu_item_category', "; + if (strlen($menu_item_order) > 0) { + $sql .= "'$menu_item_order', "; + } + if (strlen($menu_item_parent_uuid) > 0) { + $sql .= "'$menu_item_parent_uuid', "; + } + $sql .= "'$menu_item_description' "; + $sql .= ")"; + if ($menu_item_uuid == $menu_item_parent_uuid) { + //echo $sql."
\n"; + } + else { + $db->exec(check_sql($sql)); + } + unset($sql); + } + } + } + } + + //if there are no groups listed in v_menu_item_groups under menu_uuid then add the default groups + $sql = "select count(*) as count from v_menu_item_groups "; + $sql .= "where menu_uuid = '".$this->menu_uuid."' "; + $prep_statement = $db->prepare($sql); + $prep_statement->execute(); + $sub_result = $prep_statement->fetch(PDO::FETCH_ASSOC); + unset ($prep_statement); + if ($sub_result['count'] == 0) { + //no menu item groups found add the defaults + foreach($apps as $app) { + foreach ($app['menu'] as $sub_row) { + foreach ($sub_row['groups'] as $group) { + //add the record + $sql = "insert into v_menu_item_groups "; + $sql .= "("; + $sql .= "menu_uuid, "; + $sql .= "menu_item_uuid, "; + $sql .= "group_name "; + $sql .= ")"; + $sql .= "values "; + $sql .= "("; + $sql .= "'".$this->menu_uuid."', "; + $sql .= "'".$sub_row['uuid']."', "; + $sql .= "'".$group."' "; + $sql .= ")"; + $db->exec($sql); + unset($sql); + } + } + } + } + + //save the changes to the database + //$db->commit(); + } //end function + + //create the menu + function build_html($sql, $menu_item_level) { + + $db = $this->db; + $db_menu_full = ''; + + if (!isset($_SESSION['groups'])) { + $_SESSION['groups'][0]['group_name'] = 'public'; + } + + if (strlen($sql) == 0) { //default sql for base of the menu + $sql = "select * from v_menu_items "; + $sql .= "where menu_uuid = '".$this->menu_uuid."' "; + $sql .= "and menu_item_parent_uuid is null "; + $sql .= "and menu_item_uuid in "; + $sql .= "(select menu_item_uuid from v_menu_item_groups where menu_uuid = '".$this->menu_uuid."' "; + $sql .= "and ( "; + if (!isset($_SESSION['groups'])) { + $sql .= "group_name = 'public' "; + } + else { + $x = 0; + foreach($_SESSION['groups'] as $row) { + if ($x == 0) { + $sql .= "group_name = '".$row['group_name']."' "; + } + else { + $sql .= "or group_name = '".$row['group_name']."' "; + } + $x++; + } + } + $sql .= ") "; + $sql .= "and menu_item_uuid is not null "; + $sql .= ") "; + $sql .= "order by menu_item_order asc "; + } + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach($result as $field) { + $menu_tags = ''; + switch ($field['menu_item_category']) { + case "internal": + $menu_tags = "href='".PROJECT_PATH.$field['menu_item_link']."'"; + break; + case "external": + if (substr($field['menu_item_link'], 0,1) == "/") { + $field['menu_item_link'] = PROJECT_PATH . $field['menu_item_link']; + } + $menu_tags = "href='".$field['menu_item_link']."' target='_blank'"; + break; + case "email": + $menu_tags = "href='mailto:".$field['menu_item_link']."'"; + break; + } + + if ($menu_item_level == "main") { + $db_menu = "

\n\n"; + } + + $db_menu_full .= $db_menu; + } //end for each + + unset($prep_statement, $sql, $result); + return $db_menu_full; + } + + //create the sub menus + function build_child_html($menu_item_level, $menu_item_uuid) { + + $db = $this->db; + $menu_item_level = $menu_item_level+1; + + if (count($_SESSION['groups']) == 0) { + $_SESSION['groups'][0]['group_name'] = 'public'; + } + + $sql = "select * from v_menu_items "; + $sql .= "where menu_uuid = '".$this->menu_uuid."' "; + $sql .= "and menu_item_parent_uuid = '$menu_item_uuid' "; + $sql .= "and menu_item_uuid in "; + $sql .= "(select menu_item_uuid from v_menu_item_groups where menu_uuid = '".$this->menu_uuid."' "; + $sql .= "and ( "; + if (count($_SESSION['groups']) == 0) { + $sql .= "group_name = 'public' "; + } + else { + $x = 0; + foreach($_SESSION['groups'] as $row) { + if ($x == 0) { + $sql .= "group_name = '".$row['group_name']."' "; + } + else { + $sql .= "or group_name = '".$row['group_name']."' "; + } + $x++; + } + } + $sql .= ") "; + $sql .= ") "; + $sql .= "order by menu_item_order, menu_item_title asc "; + $prep_statement_2 = $db->prepare($sql); + $prep_statement_2->execute(); + $result_2 = $prep_statement_2->fetchAll(PDO::FETCH_NAMED); + if (count($result_2) > 0) { + //child menu found + $db_menu_sub = "\n"; + return $db_menu_sub; + } + unset($prep_statement_2, $sql); + } + } + +?> \ No newline at end of file diff --git a/includes/classes/root.php b/includes/classes/root.php new file mode 100644 index 0000000000..7b882438ea --- /dev/null +++ b/includes/classes/root.php @@ -0,0 +1,50 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ + +// make sure the PATH_SEPARATOR is defined + if (!defined("PATH_SEPARATOR")) { + if ( strpos( $_ENV[ "OS" ], "Win" ) !== false ) { define("PATH_SEPARATOR", ";"); } else { define("PATH_SEPARATOR", ":"); } + } + +// make sure the document_root is set + $_SERVER["SCRIPT_FILENAME"] = str_replace("\\", "/", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = str_replace($_SERVER["PHP_SELF"], "", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = realpath($_SERVER["DOCUMENT_ROOT"]); + //echo "DOCUMENT_ROOT: ".$_SERVER["DOCUMENT_ROOT"]."
\n"; + //echo "PHP_SELF: ".$_SERVER["PHP_SELF"]."
\n"; + //echo "SCRIPT_FILENAME: ".$_SERVER["SCRIPT_FILENAME"]."
\n"; + +// if the project directory exists then add it to the include path otherwise add the document root to the include path + if (is_dir($_SERVER["DOCUMENT_ROOT"].'/fusionpbx')){ + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', '/fusionpbx'); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER["DOCUMENT_ROOT"].'/fusionpbx' ); + } + else { + if(!defined('PROJECT_PATH')) { define('PROJECT_PATH', ''); } + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER['DOCUMENT_ROOT'] ); + } + +?> \ No newline at end of file diff --git a/includes/classes/schema.php b/includes/classes/schema.php new file mode 100644 index 0000000000..668eba1303 --- /dev/null +++ b/includes/classes/schema.php @@ -0,0 +1,121 @@ + + Copyright (C) 2010 + All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; + +//define the follow me class + class schema { + public $db; + public $apps; + public $db_type; + public $result; + + //get the list of installed apps from the core and mod directories + public function __construct() { + $config_list = glob($_SERVER["DOCUMENT_ROOT"] . PROJECT_PATH . "/*/*/app_config.php"); + $x=0; + foreach ($config_list as &$config_path) { + include($config_path); + $x++; + } + $this->apps = $apps; + } + + //create the database schema + public function sql() { + $sql = ''; + $sql_schema = ''; + foreach ($this->apps as $app) { + if (count($app['db'])) { + foreach ($app['db'] as $row) { + //create the sql string + $table_name = $row['table']; + $sql = "CREATE TABLE " . $row['table'] . " (\n"; + $field_count = 0; + foreach ($row['fields'] as $field) { + if ($field['deprecated'] == "true") { + //skip this field + } + else { + if ($field_count > 0 ) { $sql .= ",\n"; } + if (is_array($field['name'])) { + $sql .= $field['name']['text']." "; + } + else { + $sql .= $field['name']." "; + } + if (is_array($field['type'])) { + $sql .= $field['type'][$this->db_type]; + } + else { + $sql .= $field['type']; + } + if ($field['key']['type'] == "primary") { + $sql .= " PRIMARY KEY"; + } + if ($field['key']['type'] == "foreign") { + if ($this->db_type == "pgsql") { + //$sql .= " references ".$field['key']['reference']['table']."(".$field['key']['reference']['field'].")"; + } + if ($this->db_type == "sqlite") { + //$sql .= " references ".$field['key']['reference']['table']."(".$field['key']['reference']['field'].")"; + } + if ($this->db_type == "mysql") { + //$sql .= " references ".$field['key']['reference']['table']."(".$field['key']['reference']['field'].")"; + } + } + $field_count++; + } + } + if ($this->db_type == "mysql") { + $sql .= ") ENGINE=INNODB;"; + } + else { + $sql .= ");"; + } + $this->result['sql'][] = $sql; + unset($sql); + } + } + } + } + + //create the database schema + public function exec() { + foreach ($this->result['sql'] as $sql) { + //start the sql transaction + $this->db->beginTransaction(); + //execute the sql query + try { + $this->db->query($sql); + } + catch (PDOException $error) { + echo "error: " . $error->getMessage() . " sql: $sql
"; + } + //complete the transaction + $this->db->commit(); + } + } + } \ No newline at end of file diff --git a/includes/classes/switch_directory.php b/includes/classes/switch_directory.php new file mode 100644 index 0000000000..2ab3fc1740 --- /dev/null +++ b/includes/classes/switch_directory.php @@ -0,0 +1,694 @@ + + Copyright (C) 2010 + All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; + +//define the directory class + class switch_directory { + public $domain_uuid; + public $domain_name; + public $db_type; + public $extension; + public $number_alias; + public $password; + public $vm_password; + public $accountcode; + public $effective_caller_id_name; + public $effective_caller_id_number; + public $outbound_caller_id_name; + public $outbound_caller_id_number; + public $limit_max=5; + public $limit_destination; + public $vm_enabled=1; + public $vm_mailto; + public $vm_attach_file; + public $vm_keep_local_after_email; + public $user_context; + public $range; + public $autogen_users; + public $toll_allow; + public $call_group; + public $hold_music; + public $auth_acl; + public $cidr; + public $sip_force_contact; + public $sip_force_expires; + public $nibble_account; + public $mwi_account; + public $sip_bypass_media; + public $enabled; + public $description; + public $cidr; + public $number_alias; + + // get domain_uuid + public function get_domain_uuid() { + return $this->domain_uuid; + } + // set domain_uuid + public function set_domain_uuid($domain_uuid){ + $this->domain_uuid = $domain_uuid; + } + + // get domain_name + public function get_domain_name() { + return $this->domain_name; + } + // set domain_name + public function set_domain_name($domain_name){ + $this->domain_name = $domain_name; + } + + // get db_type + public function get_db_type() { + return $this->db_type; + } + // set db_type + public function set_db_type($db_type){ + $this->db_type = $db_type; + } + + // get extension + public function get_extension() { + return $this->extension; + } + // set extension + public function set_extension($extension){ + $this->extension = $extension; + } + + public function add() { + global $db; + $domain_uuid = $this->domain_uuid; + $domain_name = $this->domain_name; + $extension = $this->extension; + $number_alias = $this->number_alias; + $password = $this->password; + $autogen_users = $this->autogen_users; + $provisioning_list = $this->provisioning_list; + $vm_password = $this->vm_password; + $accountcode = $this->accountcode; + $effective_caller_id_name = $this->effective_caller_id_name; + $effective_caller_id_number = $this->effective_caller_id_number; + $outbound_caller_id_name = $this->outbound_caller_id_name; + $outbound_caller_id_number = $this->outbound_caller_id_number; + $limit_max = $this->limit_max; + $limit_destination = $this->limit_destination; + $vm_enabled = $this->vm_enabled; + $vm_mailto = $this->vm_mailto; + $vm_attach_file = $this->vm_attach_file; + $vm_keep_local_after_email = $this->vm_keep_local_after_email; + $user_context = $this->user_context; + $toll_allow = $this->toll_allow; + $call_group = $this->call_group; + $hold_music = $this->hold_music; + $auth_acl = $this->auth_acl; + $cidr = $this->cidr; + $sip_force_contact = $this->sip_force_contact; + $sip_force_expires = $this->sip_force_expires; + $nibble_account = $this->nibble_account; + $mwi_account = $this->mwi_account; + $sip_bypass_media = $this->sip_bypass_media; + $enabled = $this->enabled; + $description = $this->description; + + $db->beginTransaction(); + for ($i=1; $i<=$range; $i++) { + if (extension_exists($extension)) { + //extension exists + } + else { + //extension does not exist add it + $password = generate_password(); + $sql = "insert into v_extensions "; + $sql .= "("; + $sql .= "domain_uuid, "; + $sql .= "extension_uuid, "; + $sql .= "extension, "; + $sql .= "number_alias, "; + $sql .= "password, "; + $sql .= "provisioning_list, "; + $sql .= "vm_password, "; + $sql .= "accountcode, "; + $sql .= "effective_caller_id_name, "; + $sql .= "effective_caller_id_number, "; + $sql .= "outbound_caller_id_name, "; + $sql .= "outbound_caller_id_number, "; + $sql .= "limit_max, "; + $sql .= "limit_destination, "; + $sql .= "vm_enabled, "; + $sql .= "vm_mailto, "; + $sql .= "vm_attach_file, "; + $sql .= "vm_keep_local_after_email, "; + $sql .= "user_context, "; + $sql .= "toll_allow, "; + $sql .= "call_group, "; + $sql .= "hold_music, "; + $sql .= "auth_acl, "; + $sql .= "cidr, "; + $sql .= "sip_force_contact, "; + if (strlen($sip_force_expires) > 0) { + $sql .= "sip_force_expires, "; + } + if (strlen($nibble_account) > 0) { + $sql .= "nibble_account, "; + } + if (strlen($mwi_account) > 0) { + $sql .= "mwi_account, "; + } + $sql .= "sip_bypass_media, "; + $sql .= "enabled, "; + $sql .= "description "; + $sql .= ")"; + $sql .= "values "; + $sql .= "("; + $sql .= "'$domain_uuid', "; + $sql .= "'$extension_uuid', "; + $sql .= "'$extension', "; + $sql .= "'$number_alias', "; + $sql .= "'$password', "; + $sql .= "'$provisioning_list', "; + $sql .= "'user-choose', "; + $sql .= "'$accountcode', "; + $sql .= "'$effective_caller_id_name', "; + $sql .= "'$effective_caller_id_number', "; + $sql .= "'$outbound_caller_id_name', "; + $sql .= "'$outbound_caller_id_number', "; + $sql .= "'$limit_max', "; + $sql .= "'$limit_destination', "; + $sql .= "'$vm_enabled', "; + $sql .= "'$vm_mailto', "; + $sql .= "'$vm_attach_file', "; + $sql .= "'$vm_keep_local_after_email', "; + $sql .= "'$user_context', "; + $sql .= "'$toll_allow', "; + $sql .= "'$call_group', "; + $sql .= "'$hold_music', "; + $sql .= "'$auth_acl', "; + $sql .= "'$cidr', "; + $sql .= "'$sip_force_contact', "; + if (strlen($sip_force_expires) > 0) { + $sql .= "'$sip_force_expires', "; + } + if (strlen($nibble_account) > 0) { + $sql .= "'$nibble_account', "; + } + if (strlen($mwi_account) > 0) { + if (strpos($mwi_account, '@') === false) { + if (count($_SESSION["domains"]) > 1) { + $mwi_account .= "@".$domain_name; + } + else { + $mwi_account .= "@\$\${domain}"; + } + } + $sql .= "'$mwi_account', "; + } + $sql .= "'$sip_bypass_media', "; + $sql .= "'$enabled', "; + $sql .= "'$description' "; + $sql .= ")"; + $db->exec(check_sql($sql)); + unset($sql); + } + $extension++; + } + $db->commit(); + } + + public function update() { + global $db; + + $domain_uuid = $this->domain_uuid; + $domain_name = $this->domain_name; + $extension = $this->extension; + $number_alias = $this->number_alias; + $password = $this->password; + $autogen_users = $this->autogen_users; + $provisioning_list = $this->provisioning_list; + $vm_password = $this->vm_password; + $accountcode = $this->accountcode; + $effective_caller_id_name = $this->effective_caller_id_name; + $effective_caller_id_number = $this->effective_caller_id_number; + $outbound_caller_id_name = $this->outbound_caller_id_name; + $outbound_caller_id_number = $this->outbound_caller_id_number; + $limit_max = $this->limit_max; + $limit_destination = $this->limit_destination; + $vm_enabled = $this->vm_enabled; + $vm_mailto = $this->vm_mailto; + $vm_attach_file = $this->vm_attach_file; + $vm_keep_local_after_email = $this->vm_keep_local_after_email; + $user_context = $this->user_context; + $toll_allow = $this->toll_allow; + $call_group = $this->call_group; + $hold_music = $this->hold_music; + $auth_acl = $this->auth_acl; + $cidr = $this->cidr; + $sip_force_contact = $this->sip_force_contact; + $sip_force_expires = $this->sip_force_expires; + $nibble_account = $this->nibble_account; + $mwi_account = $this->mwi_account; + $sip_bypass_media = $this->sip_bypass_media; + $enabled = $this->enabled; + $description = $this->description; + + //$user_list_array = explode("|", $user_list); + //foreach($user_list_array as $tmp_user){ + // $user_password = generate_password(); + // if (strlen($tmp_user) > 0) { + // user_add($tmp_user, $user_password, $user_email); + // } + //} + //unset($tmp_user); + + if (strlen($password) == 0) { + $password = generate_password(); + } + + $sql = "update v_extensions set "; + $sql .= "extension = '$extension', "; + $sql .= "number_alias = '$number_alias', "; + $sql .= "password = '$password', "; + $sql .= "provisioning_list = '$provisioning_list', "; + if (strlen($vm_password) > 0) { + $sql .= "vm_password = '$vm_password', "; + } + else { + $sql .= "vm_password = 'user-choose', "; + } + $sql .= "accountcode = '$accountcode', "; + $sql .= "effective_caller_id_name = '$effective_caller_id_name', "; + $sql .= "effective_caller_id_number = '$effective_caller_id_number', "; + $sql .= "outbound_caller_id_name = '$outbound_caller_id_name', "; + $sql .= "outbound_caller_id_number = '$outbound_caller_id_number', "; + $sql .= "limit_max = '$limit_max', "; + $sql .= "limit_destination = '$limit_destination', "; + $sql .= "vm_enabled = '$vm_enabled', "; + $sql .= "vm_mailto = '$vm_mailto', "; + $sql .= "vm_attach_file = '$vm_attach_file', "; + $sql .= "vm_keep_local_after_email = '$vm_keep_local_after_email', "; + $sql .= "user_context = '$user_context', "; + $sql .= "toll_allow = '$toll_allow', "; + $sql .= "call_group = '$call_group', "; + $sql .= "hold_music = '$hold_music', "; + $sql .= "auth_acl = '$auth_acl', "; + $sql .= "cidr = '$cidr', "; + $sql .= "sip_force_contact = '$sip_force_contact', "; + if (strlen($sip_force_expires) == 0) { + $sql .= "sip_force_expires = null, "; + } + else { + $sql .= "sip_force_expires = '$sip_force_expires', "; + } + if (strlen($nibble_account) == 0) { + $sql .= "nibble_account = null, "; + } + else { + $sql .= "nibble_account = '$nibble_account', "; + } + if (strlen($mwi_account) > 0) { + if (strpos($mwi_account, '@') === false) { + if (count($_SESSION["domains"]) > 1) { + $mwi_account .= "@".$domain_name; + } + else { + $mwi_account .= "@\$\${domain}"; + } + } + } + $sql .= "mwi_account = '$mwi_account', "; + $sql .= "sip_bypass_media = '$sip_bypass_media', "; + $sql .= "enabled = '$enabled', "; + $sql .= "description = '$description' "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and extension_uuid = '$extension_uuid'"; + $db->exec(check_sql($sql)); + unset($sql); + } + + function delete() { + global $db; + $domain_uuid = $this->domain_uuid; + $extension_uuid = $this->extension_uuid; + if (strlen($extension_uuid)>0) { + $sql = ""; + $sql .= "delete from v_extensions "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and extension_uuid = '$extension_uuid' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + unset($sql); + } + } + + function import_sql($data){ + $count=count($data); + $keys=$values=SplFixedArray($count); + $keys=array_keys($data); + $values=array_values($data); + for($i=0;$i<$count;$i++){ + $keys[$i]= str_replace("-", "_", $keys[$i]); + $this->{$keys[$i]}=$values[$i]; + } + } + + function set_bool(&$var,$default=null){ + $var=strtolower($var); + if ($var==="true") return; + elseif ($var==="false") return; + elseif ($var==true) $var="true"; + elseif ($var==false) $var="false"; + elseif(!is_null($default)) { + $var=$default; + $this->set_bool($var); + } + } + + function generate_xml($single=1){ + //switch_account_code!! How should we be passing this?? + + if ($this->enabled== "false" || !$this->enabled) { + return false;//This the best way?? + } + + $this->vm_password = str_replace("#", "", $this->vm_password); //preserves leading zeros//**Generic Validation! + + /*if(!in_array($this->vm_enabled,array("false","true"))) {//**Generic Validation! + $this->vm_enabled = "true"; + } + if(!in_array($this->vm_attach_file,array("false","true"))) {//**Generic Validation! + $this->vm_attach_file = "true"; + } + if(!in_array($this->vm_keep_local_after_email,array("false","true"))) {//**Generic Validation! + $this->vm_keep_local_after_email = "true"; + } + */ + $this->set_bool($this->vm_enabled,1); + $this->set_bool($this->vm_attach_file,1); + $this->set_bool($this->vm_keep_local_after_email,1); + + //remove invalid characters from the file names //**Generic Validation! + $this->extension = str_replace(" ", "_", $this->extension); + $this->extension = preg_replace("/[\*\:\\/\<\>\|\'\"\?]/", "", $this->extension); + + /*if (!$extension_xml_condensed) { <--- what do I do with this?? + $fout = fopen($_SESSION['switch']['extensions']['dir']."/v_".$extension.".xml","w"); + $tmp_xml .= "\n"; + }*/ + if (strlen($this->cidr)) { + $this->cidr = " cidr=\"" . $this->cidr . "\""; + } + if (strlen($this->number_alias)) { + $this->number_alias = " number-alias=\"".$this->number_alias."\""; + } + if($single) $tmp_xml = "\n"; + else $tmp_xml = ""; + $tmp_xml .= " extension."\"".$this->cidr."".$this->number_alias.">\n"; + $tmp_xml .= " \n"; + $tmp_xml .= " password . "\"/>\n"; + $tmp_xml .= " vm_enabled."\"/>\n"; + + if ($this->vm_enabled=="true"){ + $tmp_xml .= " vm_password . "\"/>\n"; + if(strlen($this->vm_mailto)) { + $tmp_xml .= " \n"; + $tmp_xml .= " vm_attach_file."\"/>\n"; + $tmp_xml .= " vm_keep_local_after_email."\"/>\n"; + $tmp_xml .= " vm_mailto . "\"/>\n"; + } + } + if (strlen($this->mwi_account)) { + $tmp_xml .= " mwi_account . "\"/>\n"; + } + if (strlen($this->auth_acl)) { + $tmp_xml .= " auth_acl . "\"/>\n"; + } + $tmp_xml .= " \n"; + + $tmp_xml .= " \n"; + if (strlen($this->hold_music)) { + $tmp_xml .= " hold_music . "\"/>\n"; + } + if (strlen($this->toll_allow)){ + $tmp_xml .= " toll_allow . "\"/>\n"; + } + if (strlen($this->accountcode)){ + $tmp_xml .= " accountcode . "\"/>\n"; + } + $tmp_xml .= " user_context . "\"/>\n"; + if (strlen($this->effective_caller_id_name)) { + $tmp_xml .= " effective_caller_id_name . "\"/>\n"; + } + if (strlen($this->outbound_caller_id_number)) { + $tmp_xml .= " effective_caller_id_number . "\"/>\n"; + } + if (strlen($this->outbound_caller_id_name)) { + $tmp_xml .= " outbound_caller_id_name . "\"/>\n"; + } + if (strlen($this->outbound_caller_id_number)) { + $tmp_xml .= " outbound_caller_id_number . "\"/>\n"; + } + if (!strlen($this->limit_max)) {//**validation + $this->limit_max=5; + } + $tmp_xml .= " limit_max . "\"/>\n"; + if (strlen($this->limit_destination)) { + $tmp_xml .= " limit_destination . "\"/>\n"; + } + if (strlen($this->sip_force_contact)) { + $tmp_xml .= " sip_force_contact . "\"/>\n"; + } + if (strlen($this->sip_force_expires)) { + $tmp_xml .= " sip_force_expires . "\"/>\n"; + } + if (strlen($this->nibble_account)) { + $tmp_xml .= " nibble_account . "\"/>\n"; + } + switch ($this->sip_bypass_media) { + case "bypass-media": + $tmp_xml .= " \n"; + break; + case "bypass-media-after-bridge": + $tmp_xml .= " \n"; + break; + case "proxy-media": + $tmp_xml .= " \n"; + break; + } + $tmp_xml .= " \n"; + $tmp_xml .= " \n"; + if($single) { $tmp_xml .= "\n"; } + + return $tmp_xml; + } + + function xml_save_all() { + global $db, $config; + $domain_uuid = $this->domain_uuid; + $domain_name = $this->domain_name; + + //get the system settings paths and set them as variables + $settings_array = v_settings(); + foreach($settings_array as $name => $value) { + $$name = $value; + } + + //determine the extensions parent directory + $extension_parent_dir = realpath($_SESSION['switch']['extensions']['dir']."/.."); + + // delete all old extensions to prepare for new ones + if($dh = opendir($_SESSION['switch']['extensions']['dir'])) { + $files = Array(); + while($file = readdir($dh)) { + if($file != "." && $file != ".." && $file[0] != '.') { + if(is_dir($dir . "/" . $file)) { + //this is a directory do nothing + } else { + //check if file is an extension; verify the file numeric and the extension is xml + if (substr($file,0,2) == 'v_' && substr($file,-4) == '.xml') { + unlink($_SESSION['switch']['extensions']['dir']."/".$file); + } + } + } + } + closedir($dh); + } + + $sql = ""; + $sql .= "select * from v_extensions "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "order by call_group asc "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $i = 0; + $extension_xml_condensed = false; + if ($extension_xml_condensed) { + $fout = fopen($_SESSION['switch']['extensions']['dir']."/v_extensions.xml","w"); + $tmp_xml = "\n"; + } + while($row = $prep_statement->fetch(PDO::FETCH_ASSOC)) { + $call_group = $row['call_group']; + $call_group = str_replace(";", ",", $call_group); + $tmp_array = explode(",", $call_group); + foreach ($tmp_array as &$tmp_call_group) { + if (strlen($tmp_call_group) > 0) { + if (strlen($call_group_array[$tmp_call_group]) == 0) { + $call_group_array[$tmp_call_group] = $row['extension']; + } + else { + $call_group_array[$tmp_call_group] = $call_group_array[$tmp_call_group].','.$row['extension']; + } + } + $i++; + } + + if ($row['enabled'] != "false") { + //$this->import_sql($row);//Do I need to be worried about ghost values? Maybe I should make a new object? + //if (strlen($switch_account_code)) $this->accountcode=$switch_account_code; + //$tmp_xml.=$this->generate_xml(1); + + $one_row=new fs_directory; + $one_row->import_sql($row);//make a new object to flush ghost rows. And we can call this as static. + if (strlen($switch_account_code)) $one_row->accountcode=$switch_account_code; + $tmp_xml.=$one_row->generate_xml(false); + + if (!$extension_xml_condensed) { + $tmp_xml .= "\n"; + fwrite($fout, $tmp_xml); + unset($tmp_xml); + fclose($fout); + } + } + } + unset ($prep_statement); + if ($extension_xml_condensed) { + $tmp_xml .= "\n"; + fwrite($fout, $tmp_xml); + unset($tmp_xml); + fclose($fout); + } + + //define the group members + $tmp_xml = "\n"; + $tmp_xml .= "\n"; + $tmp_xml .= "\n"; + $tmp_xml .= " \n"; + if ($extension_dir_name == "default") { + $tmp_xml .= " \n"; + } + else { + $tmp_xml .= " \n"; + } + $tmp_xml .= " \n"; + $tmp_xml .= " \n"; + $tmp_xml .= " \n"; + $tmp_xml .= "\n"; + $tmp_xml .= " \n"; + $tmp_xml .= " \n"; + $tmp_xml .= " \n"; + $tmp_xml .= " \n"; + $tmp_xml .= " \n"; + $tmp_xml .= " \n"; + $tmp_xml .= " \n"; + $tmp_xml .= "\n"; + $tmp_xml .= " \n"; + $tmp_xml .= " \n"; + $tmp_xml .= " \n"; + $tmp_xml .= " \n"; + $tmp_xml .= " \n"; + $tmp_xml .= " \n"; + $tmp_xml .= "\n"; + $previous_call_group = ""; + foreach ($call_group_array as $key => $value) { + $call_group = $key; + $extension_list = $value; + if (strlen($call_group) > 0) { + if ($previous_call_group != $call_group) { + $tmp_xml .= " \n"; + $tmp_xml .= " \n"; + $tmp_xml .= " \n"; + $extension_array = explode(",", $extension_list); + foreach ($extension_array as &$tmp_extension) { + $tmp_xml .= " \n"; + } + $tmp_xml .= " \n"; + $tmp_xml .= " \n"; + $tmp_xml .= "\n"; + } + $previous_call_group = $call_group; + } + unset($call_group); + } + $tmp_xml .= " \n"; + $tmp_xml .= "\n"; + $tmp_xml .= " \n"; + $tmp_xml .= ""; + + //remove invalid characters from the file names + $extension_dir_name = str_replace(" ", "_", $extension_dir_name); + $extension_dir_name = preg_replace("/[\*\:\\/\<\>\|\'\"\?]/", "", $extension_dir_name); + + //write the xml file + $fout = fopen($extension_parent_dir."/".$extension_dir_name.".xml","w"); + fwrite($fout, $tmp_xml); + unset($tmp_xml); + fclose($fout); + + //syncrhonize the phone directory + sync_directory(); + + //apply settings reminder + $_SESSION["reload_xml"] = true; + + //call reloadxml direct + //$cmd = "api reloadxml"; + //event_socket_request_cmd($cmd); + //unset($cmd); + + } //end function + } //class + +?> \ No newline at end of file diff --git a/includes/classes/switch_fax.php b/includes/classes/switch_fax.php new file mode 100644 index 0000000000..ea86ad48d8 --- /dev/null +++ b/includes/classes/switch_fax.php @@ -0,0 +1,530 @@ + + Copyright (C) 2010 + All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; + +//define the directory class + class switch_fax { + + public $db; + public $domain_uuid; + public $domain_name; + public $dialplan_uuid; + public $context; + public $fax_uuid; + public $fax_name; + public $fax_extension; + public $fax_email; + public $fax_pin_number; + public $fax_caller_id_name; + public $fax_caller_id_number; + public $fax_forward_number; + public $fax_user_list; + public $fax_description; + + public function __construct() { + require_once "includes/classes/database.php"; + $this->app_uuid = '24108154-4ac3-1db6-1551-4731703a4440'; + } + + public function __destruct() { + foreach ($this as $key => $value) { + unset($this->$key); + } + } + + public function count() { + $database = new database; + $database->domain_uuid = $this->domain_uuid; + $database->table = "v_fax"; + $database->where[0]['name'] = 'domain_uuid'; + $database->where[0]['value'] = $this->domain_uuid; + $database->where[0]['operator'] = '='; + return $database->count(); + } + + public function find() { + $database = new database; + $database->table = "v_fax"; + $database->where[0]['name'] = 'domain_uuid'; + $database->where[0]['value'] = $this->domain_uuid; + $database->where[0]['operator'] = '='; + if ($this->fax_uuid) { + $database->where[1]['name'] = 'fax_uuid'; + $database->where[1]['value'] = $this->fax_uuid; + $database->where[1]['operator'] = '='; + } + if ($this->order_by) { + $database->order_by = $this->order_by; + } + if ($this->order_type) { + $database->order_type = $this->order_type; + } + return $database->find(); + } + + public function add() { + + //add the fax + if (strlen($this->fax_extension) > 0) { + //add the dialplan + $database = new database; + $database->table = "v_dialplans"; + $database->fields['domain_uuid'] = $this->domain_uuid; + $database->fields['dialplan_uuid'] = $this->dialplan_uuid; + $database->fields['dialplan_name'] = $this->fax_name; + $database->fields['dialplan_order'] = '333'; + $database->fields['dialplan_context'] = $this->context; + $database->fields['dialplan_enabled'] = $this->fax_enabled; + $database->fields['dialplan_description'] = $this->fax_description; + $database->fields['app_uuid'] = $this->app_uuid; + $database->add(); + + //add the dialplan details + $detail_data = '^'.$this->fax_extension.'$'; + $database->table = "v_dialplan_details"; + $database->fields['domain_uuid'] = $this->domain_uuid; + $database->fields['dialplan_uuid'] = $this->dialplan_uuid; + $database->fields['dialplan_detail_uuid'] = uuid(); + $database->fields['dialplan_detail_tag'] = 'condition'; //condition, action, antiaction + $database->fields['dialplan_detail_type'] = 'destination_number'; + $database->fields['dialplan_detail_data'] = $detail_data; + $database->fields['dialplan_detail_order'] = '005'; + $database->add(); + + if (file_exists(PHP_BINDIR."/php")) { define(PHP_BIN, 'php'); } + if (file_exists(PHP_BINDIR."/php.exe")) { define(PHP_BIN, 'php.exe'); } + $dialplan_detail_data = "api_hangup_hook=system ".PHP_BINDIR."/".PHP_BIN." ".$_SERVER["DOCUMENT_ROOT"].PROJECT_PATH."/secure/fax_to_email.php "; + $dialplan_detail_data .= "email=".$this->fax_email." "; + $dialplan_detail_data .= "extension=".$this->fax_extension." "; + $dialplan_detail_data .= "name=\\\\\\\${last_fax} "; + $dialplan_detail_data .= "messages='result: \\\\\\\${fax_result_text} sender:\\\\\\\${fax_remote_station_id} pages:\\\\\\\${fax_document_total_pages}' "; + $dialplan_detail_data .= "domain=".$domain_name." "; + $dialplan_detail_data .= "caller_id_name='\\\\\\\${caller_id_name}' "; + $dialplan_detail_data .= "caller_id_number=\\\\\\\${caller_id_number} "; + $database->table = "v_dialplan_details"; + $database->fields['domain_uuid'] = $this->domain_uuid; + $database->fields['dialplan_uuid'] = $this->dialplan_uuid; + $database->fields['dialplan_detail_uuid'] = uuid(); + $database->fields['dialplan_detail_tag'] = 'action'; //condition, action, antiaction + $database->fields['dialplan_detail_type'] = 'set'; + $database->fields['dialplan_detail_data'] = $dialplan_detail_data; + $database->fields['dialplan_detail_order'] = '010'; + $database->add(); + + $database->table = "v_dialplan_details"; + $database->fields['domain_uuid'] = $this->domain_uuid; + $database->fields['dialplan_uuid'] = $this->dialplan_uuid; + $database->fields['dialplan_detail_uuid'] = uuid(); + $database->fields['dialplan_detail_tag'] = 'action'; //condition, action, antiaction + $database->fields['dialplan_detail_type'] = 'answer'; + $database->fields['dialplan_detail_data'] = ''; + $database->fields['dialplan_detail_order'] = '015'; + $database->add(); + + $database->table = "v_dialplan_details"; + $database->fields['domain_uuid'] = $this->domain_uuid; + $database->fields['dialplan_uuid'] = $this->dialplan_uuid; + $database->fields['dialplan_detail_uuid'] = uuid(); + $database->fields['dialplan_detail_tag'] = 'action'; //condition, action, antiaction + $database->fields['dialplan_detail_type'] = 'set'; + $database->fields['dialplan_detail_data'] = 'fax_enable_t38=true'; + $database->fields['dialplan_detail_order'] = '020'; + $database->add(); + + $database->table = "v_dialplan_details"; + $database->fields['domain_uuid'] = $this->domain_uuid; + $database->fields['dialplan_uuid'] = $this->dialplan_uuid; + $database->fields['dialplan_detail_uuid'] = uuid(); + $database->fields['dialplan_detail_tag'] = 'action'; //condition, action, antiaction + $database->fields['dialplan_detail_type'] = 'set'; + $database->fields['dialplan_detail_data'] = 'fax_enable_t38_request=true'; + $database->fields['dialplan_detail_order'] = '025'; + $database->add(); + + $database->table = "v_dialplan_details"; + $database->fields['domain_uuid'] = $this->domain_uuid; + $database->fields['dialplan_uuid'] = $this->dialplan_uuid; + $database->fields['dialplan_detail_uuid'] = uuid(); + $database->fields['dialplan_detail_tag'] = 'action'; //condition, action, antiaction + $database->fields['dialplan_detail_type'] = 'playback'; + $database->fields['dialplan_detail_data'] = 'silence_stream://2000'; + $database->fields['dialplan_detail_order'] = '030'; + $database->add(); + + $database->table = "v_dialplan_details"; + $database->fields['domain_uuid'] = $this->domain_uuid; + $database->fields['dialplan_uuid'] = $this->dialplan_uuid; + $database->fields['dialplan_detail_uuid'] = uuid(); + $database->fields['dialplan_detail_tag'] = 'action'; //condition, action, antiaction + $database->fields['dialplan_detail_type'] = 'set'; + $database->fields['dialplan_detail_data'] = 'last_fax=${caller_id_number}-${strftime(%Y-%m-%d-%H-%M-%S)}'; + $database->fields['dialplan_detail_order'] = '035'; + $database->add(); + + $database->table = "v_dialplan_details"; + $database->fields['domain_uuid'] = $this->domain_uuid; + $database->fields['dialplan_uuid'] = $this->dialplan_uuid; + $database->fields['dialplan_detail_uuid'] = uuid(); + $database->fields['dialplan_detail_tag'] = 'action'; //condition, action, antiaction + $database->fields['dialplan_detail_type'] = 'rxfax'; + if (count($_SESSION["domains"]) > 1) { + $dialplan_detail_data = $_SESSION['switch']['storage']['dir'].'/fax/'.$_SESSION['domains'][$row['domain_uuid']]['domain_name'].'/'.$this->fax_extension.'/inbox/${last_fax}.tif'; + } + else { + $dialplan_detail_data = $_SESSION['switch']['storage']['dir'].'/fax/'.$this->fax_extension.'/inbox/${last_fax}.tif'; + } + $database->fields['dialplan_detail_data'] = $dialplan_detail_data; + $database->fields['dialplan_detail_order'] = '040'; + $database->add(); + + $database->table = "v_dialplan_details"; + $database->fields['domain_uuid'] = $this->domain_uuid; + $database->fields['dialplan_uuid'] = $this->dialplan_uuid; + $database->fields['dialplan_detail_uuid'] = uuid(); + $database->fields['dialplan_detail_tag'] = 'action'; //condition, action, antiaction + $database->fields['dialplan_detail_type'] = 'hangup'; + $database->fields['dialplan_detail_data'] = ''; + $database->fields['dialplan_detail_order'] = '045'; + $database->add(); + } + + //add the fax + $fax_uuid = uuid(); + $database = new database; + $database->table = "v_fax"; + $database->fields['domain_uuid'] = $this->domain_uuid; + if (strlen($this->fax_extension) > 0) { + $database->fields['fax_extension'] = $this->fax_extension; + $database->fields['dialplan_uuid'] = $this->dialplan_uuid; + } + $database->fields['fax_uuid'] = $this->fax_uuid; + $database->fields['fax_name'] = $this->fax_name; + $database->fields['fax_email'] = $this->fax_email; + $database->fields['fax_pin_number'] = $this->fax_pin_number; + $database->fields['fax_caller_id_name'] = $this->fax_caller_id_name; + $database->fields['fax_caller_id_number'] = $this->fax_caller_id_number; + $database->fields['fax_forward_number'] = $this->fax_forward_number; + $database->fields['fax_user_list'] = $this->fax_user_list; + $database->fields['fax_description'] = $this->fax_description; + $database->add(); + } + + public function update() { + + //udate the fax + //get the dialplan uuid + $database = new database; + $database->table = "v_fax"; + $database->where[0]['name'] = 'domain_uuid'; + $database->where[0]['value'] = $this->domain_uuid; + $database->where[0]['operator'] = '='; + $database->where[1]['name'] = 'fax_uuid'; + $database->where[1]['value'] = $this->fax_uuid; + $database->where[1]['operator'] = '='; + $result = $database->find(); + foreach($result as $row) { + $this->dialplan_uuid = $row['dialplan_uuid']; + } + + //if the extension number is empty and the dialplan exists then delete the dialplan + if (strlen($this->fax_extension) == 0) { + if (strlen($this->dialplan_uuid) > 0) { + //delete dialplan entry + $database = new database; + $database->table = "v_dialplan_details"; + $database->where[0]['name'] = 'domain_uuid'; + $database->where[0]['value'] = $this->domain_uuid; + $database->where[0]['operator'] = '='; + $database->where[1]['name'] = 'dialplan_uuid'; + $database->where[1]['value'] = $this->dialplan_uuid; + $database->where[1]['operator'] = '='; + $database->delete(); + + //delete the child dialplan information + $database = new database; + $database->table = "v_dialplans"; + $database->where[0]['name'] = 'domain_uuid'; + $database->where[0]['value'] = $this->domain_uuid; + $database->where[0]['operator'] = '='; + $database->where[1]['name'] = 'dialplan_uuid'; + $database->where[1]['value'] = $this->dialplan_uuid; + $database->where[1]['operator'] = '='; + $database->delete(); + //update the table to remove the dialplan_uuid + $this->dialplan_uuid = ''; + } + } + + //update the fax + $fax_uuid = uuid(); + $database = new database; + $database->table = "v_fax"; + $database->fields['fax_uuid'] = $this->fax_uuid; + $database->fields['dialplan_uuid'] = $this->dialplan_uuid; + $database->fields['domain_uuid'] = $this->domain_uuid; + $database->fields['fax_name'] = $this->fax_name; + $database->fields['fax_extension'] = $this->fax_extension; + $database->fields['fax_email'] = $this->fax_email; + $database->fields['fax_pin_number'] = $this->fax_pin_number; + $database->fields['fax_caller_id_name'] = $this->fax_caller_id_name; + $database->fields['fax_caller_id_number'] = $this->fax_caller_id_number; + $database->fields['fax_forward_number'] = $this->fax_forward_number; + $database->fields['fax_user_list'] = $this->fax_user_list; + $database->fields['fax_description'] = $this->fax_description; + $database->where[0]['name'] = 'domain_uuid'; + $database->where[0]['value'] = $this->domain_uuid; + $database->where[0]['operator'] = '='; + $database->where[1]['name'] = 'fax_uuid'; + $database->where[1]['value'] = $this->fax_uuid; + $database->where[1]['operator'] = '='; + $database->update(); + + if (strlen($this->fax_extension) > 0) { + //update the dialplan + $database = new database; + $database->table = "v_dialplans"; + $database->fields['dialplan_name'] = $this->fax_name; + $database->fields['dialplan_order'] = '333'; + $database->fields['dialplan_context'] = $this->context; + $database->fields['dialplan_enabled'] = $this->fax_enabled; + $database->fields['dialplan_description'] = $this->dialplan_description; + $database->fields['app_uuid'] = $this->app_uuid; + if ($this->dialplan_uuid) { + $database->where[0]['name'] = 'domain_uuid'; + $database->where[0]['value'] = $this->domain_uuid; + $database->where[0]['operator'] = '='; + $database->where[1]['name'] = 'dialplan_uuid'; + $database->where[1]['value'] = $this->dialplan_uuid; + $database->where[1]['operator'] = '='; + $database->update(); + } + else { +// $this->dialplan_uuid = uuid(); + $database->fields['domain_uuid'] = $this->domain_uuid; + $database->fields['dialplan_uuid'] = $this->dialplan_uuid; + $database->add(); + } + + //delete the old dialplan details to prepare for new details + $database = new database; + $database->table = "v_dialplan_details"; + $database->where[0]['name'] = 'domain_uuid'; + $database->where[0]['value'] = $this->domain_uuid; + $database->where[0]['operator'] = '='; + $database->where[1]['name'] = 'dialplan_uuid'; + $database->where[1]['value'] = $this->dialplan_uuid; + $database->where[1]['operator'] = '='; + $database->delete(); + + //add the dialplan details + $detail_data = '^'.$this->fax_extension.'$'; + $database->table = "v_dialplan_details"; + $database->fields['domain_uuid'] = $this->domain_uuid; + $database->fields['dialplan_uuid'] = $this->dialplan_uuid; + $database->fields['dialplan_detail_uuid'] = uuid(); + $database->fields['dialplan_detail_tag'] = 'condition'; //condition, action, antiaction + $database->fields['dialplan_detail_type'] = 'destination_number'; + $database->fields['dialplan_detail_data'] = $detail_data; + $database->fields['dialplan_detail_order'] = '005'; + $database->add(); + + if (file_exists(PHP_BINDIR."/php")) { define(PHP_BIN, 'php'); } + if (file_exists(PHP_BINDIR."/php.exe")) { define(PHP_BIN, 'php.exe'); } + $dialplan_detail_data = "api_hangup_hook=system ".PHP_BINDIR."/".PHP_BIN." ".$_SERVER["DOCUMENT_ROOT"].PROJECT_PATH."/secure/fax_to_email.php "; + $dialplan_detail_data .= "email=".$this->fax_email." "; + $dialplan_detail_data .= "extension=".$this->fax_extension." "; + $dialplan_detail_data .= "name=\\\\\\\${last_fax} "; + $dialplan_detail_data .= "messages='result: \\\\\\\${fax_result_text} sender:\\\\\\\${fax_remote_station_id} pages:\\\\\\\${fax_document_total_pages}' "; + $dialplan_detail_data .= "domain=".$domain_name." "; + $dialplan_detail_data .= "caller_id_name='\\\\\\\${caller_id_name}' "; + $dialplan_detail_data .= "caller_id_number=\\\\\\\${caller_id_number} "; + $database->table = "v_dialplan_details"; + $database->fields['domain_uuid'] = $this->domain_uuid; + $database->fields['dialplan_uuid'] = $this->dialplan_uuid; + $database->fields['dialplan_detail_uuid'] = uuid(); + $database->fields['dialplan_detail_tag'] = 'action'; //condition, action, antiaction + $database->fields['dialplan_detail_type'] = 'set'; + $database->fields['dialplan_detail_data'] = $dialplan_detail_data; + $database->fields['dialplan_detail_order'] = '010'; + $database->add(); + + $database->table = "v_dialplan_details"; + $database->fields['domain_uuid'] = $this->domain_uuid; + $database->fields['dialplan_uuid'] = $this->dialplan_uuid; + $database->fields['dialplan_detail_uuid'] = uuid(); + $database->fields['dialplan_detail_tag'] = 'action'; //condition, action, antiaction + $database->fields['dialplan_detail_type'] = 'answer'; + $database->fields['dialplan_detail_data'] = ''; + $database->fields['dialplan_detail_order'] = '015'; + $database->add(); + + $database->table = "v_dialplan_details"; + $database->fields['domain_uuid'] = $this->domain_uuid; + $database->fields['dialplan_uuid'] = $this->dialplan_uuid; + $database->fields['dialplan_detail_uuid'] = uuid(); + $database->fields['dialplan_detail_tag'] = 'action'; //condition, action, antiaction + $database->fields['dialplan_detail_type'] = 'set'; + $database->fields['dialplan_detail_data'] = 'fax_enable_t38=true'; + $database->fields['dialplan_detail_order'] = '020'; + $database->add(); + + $database->table = "v_dialplan_details"; + $database->fields['domain_uuid'] = $this->domain_uuid; + $database->fields['dialplan_uuid'] = $this->dialplan_uuid; + $database->fields['dialplan_detail_uuid'] = uuid(); + $database->fields['dialplan_detail_tag'] = 'action'; //condition, action, antiaction + $database->fields['dialplan_detail_type'] = 'set'; + $database->fields['dialplan_detail_data'] = 'fax_enable_t38_request=true'; + $database->fields['dialplan_detail_order'] = '025'; + $database->add(); + + $database->table = "v_dialplan_details"; + $database->fields['domain_uuid'] = $this->domain_uuid; + $database->fields['dialplan_uuid'] = $this->dialplan_uuid; + $database->fields['dialplan_detail_uuid'] = uuid(); + $database->fields['dialplan_detail_tag'] = 'action'; //condition, action, antiaction + $database->fields['dialplan_detail_type'] = 'playback'; + $database->fields['dialplan_detail_data'] = 'silence_stream://2000'; + $database->fields['dialplan_detail_order'] = '030'; + $database->add(); + + $database->table = "v_dialplan_details"; + $database->fields['domain_uuid'] = $this->domain_uuid; + $database->fields['dialplan_uuid'] = $this->dialplan_uuid; + $database->fields['dialplan_detail_uuid'] = uuid(); + $database->fields['dialplan_detail_tag'] = 'action'; //condition, action, antiaction + $database->fields['dialplan_detail_type'] = 'set'; + $database->fields['dialplan_detail_data'] = 'last_fax=${caller_id_number}-${strftime(%Y-%m-%d-%H-%M-%S)}'; + $database->fields['dialplan_detail_order'] = '035'; + $database->add(); + + $database->table = "v_dialplan_details"; + $database->fields['domain_uuid'] = $this->domain_uuid; + $database->fields['dialplan_uuid'] = $this->dialplan_uuid; + $database->fields['dialplan_detail_uuid'] = uuid(); + $database->fields['dialplan_detail_tag'] = 'action'; //condition, action, antiaction + $database->fields['dialplan_detail_type'] = 'rxfax'; + if (count($_SESSION["domains"]) > 1) { + $dialplan_detail_data = $_SESSION['switch']['storage']['dir'].'/fax/'.$_SESSION['domains'][$row['domain_uuid']]['domain_name'].'/'.$this->fax_extension.'/inbox/${last_fax}.tif'; + } + else { + $dialplan_detail_data = $_SESSION['switch']['storage']['dir'].'/fax/'.$this->fax_extension.'/inbox/${last_fax}.tif'; + } + $database->fields['dialplan_detail_data'] = $dialplan_detail_data; + $database->fields['dialplan_detail_order'] = '040'; + $database->add(); + + $database->table = "v_dialplan_details"; + $database->fields['domain_uuid'] = $this->domain_uuid; + $database->fields['dialplan_uuid'] = $this->dialplan_uuid; + $database->fields['dialplan_detail_uuid'] = uuid(); + $database->fields['dialplan_detail_tag'] = 'action'; //condition, action, antiaction + $database->fields['dialplan_detail_type'] = 'hangup'; + $database->fields['dialplan_detail_data'] = ''; + $database->fields['dialplan_detail_order'] = '045'; + $database->add(); + } + } + + function delete() { + //create the database object + $database = new database; + + //start the transaction + //$count = $database->db->exec("BEGIN;"); + + //delete the fax + if (strlen($this->fax_uuid) > 0) { + $database->table = "v_fax"; + $database->where[0]['name'] = 'domain_uuid'; + $database->where[0]['value'] = $this->domain_uuid; + $database->where[0]['operator'] = '='; + $database->where[1]['name'] = 'fax_uuid'; + $database->where[1]['value'] = $this->fax_uuid; + $database->where[1]['operator'] = '='; + $database->delete(); + unset($this->fax_uuid); + } + + //delete the fax + if (strlen($this->fax_uuid) == 0) { + //select the dialplan entries + $database->table = "v_fax"; + $database->where[0]['name'] = 'domain_uuid'; + $database->where[0]['value'] = $this->domain_uuid; + $database->where[0]['operator'] = '='; + $database->where[1]['name'] = 'fax_uuid'; + $database->where[1]['value'] = $this->fax_uuid; + $database->where[1]['operator'] = '='; + $result = $database->find(); + foreach($result as $row) { + $this->dialplan_uuid = $row['dialplan_uuid']; + //delete the child dialplan information + $database->table = "v_dialplan_details"; + $database->where[0]['name'] = 'domain_uuid'; + $database->where[0]['value'] = $this->domain_uuid; + $database->where[0]['operator'] = '='; + $database->where[1]['name'] = 'dialplan_uuid'; + $database->where[1]['value'] = $this->dialplan_uuid; + $database->where[1]['operator'] = '='; + $database->delete(); + //delete the dialplan information + $database->table = "v_dialplans"; + $database->where[0]['name'] = 'domain_uuid'; + $database->where[0]['value'] = $this->domain_uuid; + $database->where[0]['operator'] = '='; + $database->where[1]['name'] = 'dialplan_uuid'; + $database->where[1]['value'] = $this->dialplan_uuid; + $database->where[1]['operator'] = '='; + $database->delete(); + } + + //delete the fax + if (strlen($this->fax_uuid) > 0) { + $database->table = "v_fax"; + $database->where[0]['name'] = 'domain_uuid'; + $database->where[0]['value'] = $this->domain_uuid; + $database->where[0]['operator'] = '='; + $database->where[1]['name'] = 'fax_uuid'; + $database->where[1]['value'] = $this->fax_uuid; + $database->where[1]['operator'] = '='; + $database->delete(); + unset($this->fax_uuid); + } + + //commit the transaction + //$count = $database->db->exec("COMMIT;"); + } + } + } +/* +require_once "includes/classes/database.php"; +require_once "includes/classes/switch_fax.php"; +$fax = new switch_fax; +$fax->domain_uuid = $_SESSION["domain_uuid"]; +print_r($fax->find()); +*/ +?> \ No newline at end of file diff --git a/includes/classes/switch_ivr_menu.php b/includes/classes/switch_ivr_menu.php new file mode 100644 index 0000000000..adddbad415 --- /dev/null +++ b/includes/classes/switch_ivr_menu.php @@ -0,0 +1,621 @@ + + Copyright (C) 2010 + All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; + +//define the directory class + class switch_ivr_menu { + public $db; + public $domain_uuid; + public $domain_name; + public $dialplan_uuid; + public $ivr_menu_uuid; + public $ivr_menu_name; + public $ivr_menu_extension; + public $ivr_menu_greet_long; + public $ivr_menu_greet_short; + public $ivr_menu_invalid_sound; + public $ivr_menu_exit_sound; + public $ivr_menu_confirm_macro; + public $ivr_menu_confirm_key; + public $ivr_menu_tts_engine; + public $ivr_menu_tts_voice; + public $ivr_menu_confirm_attempts; + public $ivr_menu_timeout; + public $ivr_menu_exit_app; + public $ivr_menu_exit_data; + public $ivr_menu_inter_digit_timeout; + public $ivr_menu_max_failures; + public $ivr_menu_max_timeouts; + public $ivr_menu_digit_len; + public $ivr_menu_direct_dial; + public $ivr_menu_enabled; + public $ivr_menu_description; + public $ivr_menu_option_uuid; + public $ivr_menu_option_digits; + public $ivr_menu_option_action; + public $ivr_menu_option_param; + public $ivr_menu_option_order; + public $ivr_menu_option_description; + + public function __construct() { + require_once "includes/classes/database.php"; + $this->app_uuid = 'a5788e9b-58bc-bd1b-df59-fff5d51253ab'; + } + + public function __destruct() { + foreach ($this as $key => $value) { + unset($this->$key); + } + } + + public function get_domain_uuid() { + return $this->domain_uuid; + } + public function set_domain_uuid($domain_uuid){ + $this->domain_uuid = $domain_uuid; + } + + public function get_fields($table) { + //get the $apps array from the installed apps from the core and mod directories + $config_list = glob($_SERVER["DOCUMENT_ROOT"] . PROJECT_PATH . "/*/*/app_config.php"); + $x=0; + foreach ($config_list as &$config_path) { + include($config_path); + $x++; + } + + //update the app db array add exists true or false + $sql = ''; + foreach ($apps as $x => &$app) { + foreach ($app['db'] as $y => &$row) { + if ($row['table'] == $table) { + //check if the column exists + foreach ($row['fields'] as $z => $field) { + if ($field['deprecated'] == "true") { + //skip this field + } + else { + if (is_array($field['name'])) { + $field_name = $field['name']['text']; + } + else { + $field_name = $field['name']; + } + if (strlen(field_name) > 0) { + $fields[$z]['name'] = $field_name; + } + unset($field_name); + } + } + } + } + } + return $fields; + } + + public function count() { + $database = new database; + if ($this->db) { + $database->db = $this->db; + } + $database->domain_uuid = $this->domain_uuid; + $database->table = "v_ivr_menus"; + $database->where[0]['name'] = 'domain_uuid'; + $database->where[0]['value'] = $this->domain_uuid; + $database->where[0]['operator'] = '='; + return $database->count(); + } + + public function find() { + $database = new database; + if ($this->db) { + $database->db = $this->db; + } + $database->table = "v_ivr_menus"; + $database->where[0]['name'] = 'domain_uuid'; + $database->where[0]['value'] = $this->domain_uuid; + $database->where[0]['operator'] = '='; + if (isset($this->ivr_menu_uuid)) { + $database->where[1]['name'] = 'ivr_menu_uuid'; + $database->where[1]['value'] = $this->ivr_menu_uuid; + $database->where[1]['operator'] = '='; + } + if (isset($this->ivr_menu_option_uuid)) { + $database->where[2]['name'] = 'ivr_menu_uuid'; + $database->where[2]['value'] = $this->ivr_menu_uuid; + $database->where[2]['operator'] = '='; + } + if (isset($this->order_by)) { + $database->order_by = $this->order_by; + } + if (isset($this->order_type)) { + $database->order_type = $this->order_type; + } + return $database->find(); + } + + public function add() { + + //add the ivr menu + if (strlen($this->ivr_menu_option_action) == 0) { + + if (strlen($this->ivr_menu_extension) > 0) { + //add the dialplan + $database = new database; + if ($this->db) { + $database->db = $this->db; + } + $database->table = "v_dialplans"; + $database->fields['domain_uuid'] = $this->domain_uuid; + $database->fields['dialplan_uuid'] = $this->dialplan_uuid; + $database->fields['dialplan_name'] = $this->ivr_menu_name; + $database->fields['dialplan_order'] = '333'; + $database->fields['dialplan_context'] = $_SESSION['context']; + $database->fields['dialplan_enabled'] = $this->ivr_menu_enabled; + $database->fields['dialplan_description'] = $this->ivr_menu_description; + $database->fields['app_uuid'] = $this->app_uuid; + $database->add(); + + //add the dialplan details + $detail_data = '^'.$this->ivr_menu_extension.'$'; + $database->table = "v_dialplan_details"; + $database->fields['domain_uuid'] = $this->domain_uuid; + $database->fields['dialplan_uuid'] = $this->dialplan_uuid; + $database->fields['dialplan_detail_uuid'] = uuid(); + $database->fields['dialplan_detail_tag'] = 'condition'; //condition, action, antiaction + $database->fields['dialplan_detail_type'] = 'destination_number'; + $database->fields['dialplan_detail_data'] = $detail_data; + $database->fields['dialplan_detail_order'] = '005'; + $database->add(); + + $database->table = "v_dialplan_details"; + $database->fields['domain_uuid'] = $this->domain_uuid; + $database->fields['dialplan_uuid'] = $this->dialplan_uuid; + $database->fields['dialplan_detail_uuid'] = uuid(); + $database->fields['dialplan_detail_tag'] = 'action'; //condition, action, antiaction + $database->fields['dialplan_detail_type'] = 'answer'; + $database->fields['dialplan_detail_data'] = ''; + $database->fields['dialplan_detail_order'] = '010'; + $database->add(); + + $database->table = "v_dialplan_details"; + $database->fields['domain_uuid'] = $this->domain_uuid; + $database->fields['dialplan_uuid'] = $this->dialplan_uuid; + $database->fields['dialplan_detail_uuid'] = uuid(); + $database->fields['dialplan_detail_tag'] = 'action'; //condition, action, antiaction + $database->fields['dialplan_detail_type'] = 'sleep'; + $database->fields['dialplan_detail_data'] = '1000'; + $database->fields['dialplan_detail_order'] = '015'; + $database->add(); + + $database->table = "v_dialplan_details"; + $database->fields['domain_uuid'] = $this->domain_uuid; + $database->fields['dialplan_uuid'] = $this->dialplan_uuid; + $database->fields['dialplan_detail_uuid'] = uuid(); + $database->fields['dialplan_detail_tag'] = 'action'; //condition, action, antiaction + $database->fields['dialplan_detail_type'] = 'set'; + $database->fields['dialplan_detail_data'] = 'hangup_after_bridge=true'; + $database->fields['dialplan_detail_order'] = '020'; + $database->add(); + + $database->table = "v_dialplan_details"; + $database->fields['domain_uuid'] = $this->domain_uuid; + $database->fields['dialplan_uuid'] = $this->dialplan_uuid; + $database->fields['dialplan_detail_uuid'] = uuid(); + $database->fields['dialplan_detail_tag'] = 'action'; //condition, action, antiaction + $database->fields['dialplan_detail_type'] = 'ivr'; + if (count($_SESSION["domains"]) > 1) { + $database->fields['dialplan_detail_data'] = $_SESSION['domain_name'].'-'.$this->ivr_menu_name; + } + else { + $database->fields['dialplan_detail_data'] = $this->ivr_menu_name; + } + $database->fields['dialplan_detail_order'] = '025'; + $database->add(); + + if (strlen($this->ivr_menu_exit_app) > 0) { + $database->table = "v_dialplan_details"; + $database->fields['domain_uuid'] = $this->domain_uuid; + $database->fields['dialplan_uuid'] = $this->dialplan_uuid; + $database->fields['dialplan_detail_uuid'] = uuid(); + $database->fields['dialplan_detail_tag'] = 'action'; //condition, action, antiaction + $database->fields['dialplan_detail_type'] = $this->ivr_menu_exit_app; + $database->fields['dialplan_detail_data'] = $this->ivr_menu_exit_data; + $database->fields['dialplan_detail_order'] = '030'; + $database->add(); + } + } + + //add the ivr menu + $ivr_menu_uuid = uuid(); + $database = new database; + if ($this->db) { + $database->db = $this->db; + } + $database->table = "v_ivr_menus"; + $database->fields['domain_uuid'] = $this->domain_uuid; + if (strlen($this->ivr_menu_extension) > 0) { + $database->fields['ivr_menu_extension'] = $this->ivr_menu_extension; + $database->fields['dialplan_uuid'] = $this->dialplan_uuid; + } + $database->fields['ivr_menu_uuid'] = $this->ivr_menu_uuid; + $database->fields['ivr_menu_name'] = $this->ivr_menu_name; + $database->fields['ivr_menu_greet_long'] = $this->ivr_menu_greet_long; + $database->fields['ivr_menu_greet_short'] = $this->ivr_menu_greet_short; + $database->fields['ivr_menu_invalid_sound'] = $this->ivr_menu_invalid_sound; + $database->fields['ivr_menu_exit_sound'] = $this->ivr_menu_exit_sound; + $database->fields['ivr_menu_confirm_macro'] = $this->ivr_menu_confirm_macro; + $database->fields['ivr_menu_confirm_key'] = $this->ivr_menu_confirm_key; + $database->fields['ivr_menu_tts_engine'] = $this->ivr_menu_tts_engine; + $database->fields['ivr_menu_tts_voice'] = $this->ivr_menu_tts_voice; + $database->fields['ivr_menu_confirm_attempts'] = $this->ivr_menu_confirm_attempts; + $database->fields['ivr_menu_timeout'] = $this->ivr_menu_timeout; + $database->fields['ivr_menu_exit_app'] = $this->ivr_menu_exit_app; + $database->fields['ivr_menu_exit_data'] = $this->ivr_menu_exit_data; + $database->fields['ivr_menu_inter_digit_timeout'] = $this->ivr_menu_inter_digit_timeout; + $database->fields['ivr_menu_max_failures'] = $this->ivr_menu_max_failures; + $database->fields['ivr_menu_max_timeouts'] = $this->ivr_menu_max_timeouts; + $database->fields['ivr_menu_max_timeouts'] = $this->ivr_menu_max_timeouts; + $database->fields['ivr_menu_digit_len'] = $this->ivr_menu_digit_len; + $database->fields['ivr_menu_digit_len'] = $this->ivr_menu_digit_len; + $database->fields['ivr_menu_direct_dial'] = $this->ivr_menu_direct_dial; + $database->fields['ivr_menu_direct_dial'] = $this->ivr_menu_direct_dial; + $database->fields['ivr_menu_enabled'] = $this->ivr_menu_enabled; + $database->fields['ivr_menu_description'] = $this->ivr_menu_description; + $database->add(); + } + + //add the ivr menu option + if (strlen($this->ivr_menu_option_action) > 0) { + $ivr_menu_uuid = uuid(); + $database = new database; + if ($this->db) { + $database->db = $this->db; + } + $database->table = "v_ivr_menu_options"; + $database->fields['domain_uuid'] = $this->domain_uuid; + $database->fields['ivr_menu_uuid'] = $this->ivr_menu_uuid; + $database->fields['ivr_menu_option_uuid'] = $this->ivr_menu_option_uuid; + $database->fields['ivr_menu_option_digits'] = $this->ivr_menu_option_digits; + $database->fields['ivr_menu_option_action'] = $this->ivr_menu_option_action; + $database->fields['ivr_menu_option_param'] = $this->ivr_menu_option_param; + $database->fields['ivr_menu_option_order'] = $this->ivr_menu_option_order; + $database->fields['ivr_menu_option_description'] = $this->ivr_menu_option_description; + $database->add(); + } + } + + public function update() { + + //udate the ivr menu + if (strlen($this->ivr_menu_option_action) == 0) { + //get the dialplan uuid + $database = new database; + if ($this->db) { + $database->db = $this->db; + } + $database->table = "v_ivr_menus"; + $database->where[0]['name'] = 'domain_uuid'; + $database->where[0]['value'] = $this->domain_uuid; + $database->where[0]['operator'] = '='; + $database->where[1]['name'] = 'ivr_menu_uuid'; + $database->where[1]['value'] = $this->ivr_menu_uuid; + $database->where[1]['operator'] = '='; + $result = $database->find(); + foreach($result as $row) { + $this->dialplan_uuid = $row['dialplan_uuid']; + } + + //if the extension number is empty and the dialplan exists then delete the dialplan + if (strlen($this->ivr_menu_extension) == 0) { + if (strlen($this->dialplan_uuid) > 0) { + //delete dialplan entry + $database = new database; + $database->table = "v_dialplan_details"; + $database->where[0]['name'] = 'domain_uuid'; + $database->where[0]['value'] = $this->domain_uuid; + $database->where[0]['operator'] = '='; + $database->where[1]['name'] = 'dialplan_uuid'; + $database->where[1]['value'] = $this->dialplan_uuid; + $database->where[1]['operator'] = '='; + $database->delete(); + + //delete the child dialplan information + $database = new database; + $database->table = "v_dialplans"; + $database->where[0]['name'] = 'domain_uuid'; + $database->where[0]['value'] = $this->domain_uuid; + $database->where[0]['operator'] = '='; + $database->where[1]['name'] = 'dialplan_uuid'; + $database->where[1]['value'] = $this->dialplan_uuid; + $database->where[1]['operator'] = '='; + $database->delete(); + //update the table to remove the dialplan_uuid + $this->dialplan_uuid = ''; + } + } + + //update the ivr menu + $ivr_menu_uuid = uuid(); + $database = new database; + $database->table = "v_ivr_menus"; + $database->fields['ivr_menu_uuid'] = $this->ivr_menu_uuid; + $database->fields['dialplan_uuid'] = $this->dialplan_uuid; + $database->fields['ivr_menu_name'] = $this->ivr_menu_name; + $database->fields['ivr_menu_extension'] = $this->ivr_menu_extension; + $database->fields['ivr_menu_greet_long'] = $this->ivr_menu_greet_long; + $database->fields['ivr_menu_greet_short'] = $this->ivr_menu_greet_short; + $database->fields['ivr_menu_invalid_sound'] = $this->ivr_menu_invalid_sound; + $database->fields['ivr_menu_exit_sound'] = $this->ivr_menu_exit_sound; + $database->fields['ivr_menu_confirm_macro'] = $this->ivr_menu_confirm_macro; + $database->fields['ivr_menu_confirm_key'] = $this->ivr_menu_confirm_key; + $database->fields['ivr_menu_tts_engine'] = $this->ivr_menu_tts_engine; + $database->fields['ivr_menu_tts_voice'] = $this->ivr_menu_tts_voice; + $database->fields['ivr_menu_confirm_attempts'] = $this->ivr_menu_confirm_attempts; + $database->fields['ivr_menu_timeout'] = $this->ivr_menu_timeout; + $database->fields['ivr_menu_exit_app'] = $this->ivr_menu_exit_app; + $database->fields['ivr_menu_exit_data'] = $this->ivr_menu_exit_data; + $database->fields['ivr_menu_inter_digit_timeout'] = $this->ivr_menu_inter_digit_timeout; + $database->fields['ivr_menu_max_failures'] = $this->ivr_menu_max_failures; + $database->fields['ivr_menu_max_timeouts'] = $this->ivr_menu_max_timeouts; + $database->fields['ivr_menu_max_timeouts'] = $this->ivr_menu_max_timeouts; + $database->fields['ivr_menu_digit_len'] = $this->ivr_menu_digit_len; + $database->fields['ivr_menu_digit_len'] = $this->ivr_menu_digit_len; + $database->fields['ivr_menu_direct_dial'] = $this->ivr_menu_direct_dial; + $database->fields['ivr_menu_direct_dial'] = $this->ivr_menu_direct_dial; + $database->fields['ivr_menu_enabled'] = $this->ivr_menu_enabled; + $database->fields['ivr_menu_description'] = $this->ivr_menu_description; + $database->where[0]['name'] = 'domain_uuid'; + $database->where[0]['value'] = $this->domain_uuid; + $database->where[0]['operator'] = '='; + $database->where[1]['name'] = 'ivr_menu_uuid'; + $database->where[1]['value'] = $this->ivr_menu_uuid; + $database->where[1]['operator'] = '='; + $database->update(); + + if (strlen($this->ivr_menu_extension) > 0) { + //update the dialplan + $database = new database; + $database->table = "v_dialplans"; + $database->fields['dialplan_name'] = $this->ivr_menu_name; + $database->fields['dialplan_order'] = '333'; + $database->fields['dialplan_context'] = $_SESSION['context']; + $database->fields['dialplan_enabled'] = $this->ivr_menu_enabled; + $database->fields['dialplan_description'] = $this->ivr_menu_description; + $database->fields['app_uuid'] = $this->app_uuid; + if ($this->dialplan_uuid) { + $database->where[0]['name'] = 'domain_uuid'; + $database->where[0]['value'] = $this->domain_uuid; + $database->where[0]['operator'] = '='; + $database->where[1]['name'] = 'dialplan_uuid'; + $database->where[1]['value'] = $this->dialplan_uuid; + $database->where[1]['operator'] = '='; + $database->update(); + } + else { + $this->dialplan_uuid = uuid(); + $database->fields['domain_uuid'] = $this->domain_uuid; + $database->fields['dialplan_uuid'] = $this->dialplan_uuid; + $database->add(); + } + + //delete the old dialplan details to prepare for new details + $database = new database; + $database->table = "v_dialplan_details"; + $database->where[0]['name'] = 'domain_uuid'; + $database->where[0]['value'] = $this->domain_uuid; + $database->where[0]['operator'] = '='; + $database->where[1]['name'] = 'dialplan_uuid'; + $database->where[1]['value'] = $this->dialplan_uuid; + $database->where[1]['operator'] = '='; + $database->delete(); + + //add the dialplan details + $detail_data = '^'.$this->ivr_menu_extension.'$'; + $database->table = "v_dialplan_details"; + $database->fields['domain_uuid'] = $this->domain_uuid; + $database->fields['dialplan_uuid'] = $this->dialplan_uuid; + $database->fields['dialplan_detail_uuid'] = uuid(); + $database->fields['dialplan_detail_tag'] = 'condition'; //condition, action, antiaction + $database->fields['dialplan_detail_type'] = 'destination_number'; + $database->fields['dialplan_detail_data'] = $detail_data; + $database->fields['dialplan_detail_order'] = '005'; + $database->add(); + + $database->table = "v_dialplan_details"; + $database->fields['domain_uuid'] = $this->domain_uuid; + $database->fields['dialplan_uuid'] = $this->dialplan_uuid; + $database->fields['dialplan_detail_uuid'] = uuid(); + $database->fields['dialplan_detail_tag'] = 'action'; //condition, action, antiaction + $database->fields['dialplan_detail_type'] = 'answer'; + $database->fields['dialplan_detail_data'] = ''; + $database->fields['dialplan_detail_order'] = '010'; + $database->add(); + + $database->table = "v_dialplan_details"; + $database->fields['domain_uuid'] = $this->domain_uuid; + $database->fields['dialplan_uuid'] = $this->dialplan_uuid; + $database->fields['dialplan_detail_uuid'] = uuid(); + $database->fields['dialplan_detail_tag'] = 'action'; //condition, action, antiaction + $database->fields['dialplan_detail_type'] = 'sleep'; + $database->fields['dialplan_detail_data'] = '1000'; + $database->fields['dialplan_detail_order'] = '015'; + $database->add(); + + $database->table = "v_dialplan_details"; + $database->fields['domain_uuid'] = $this->domain_uuid; + $database->fields['dialplan_uuid'] = $this->dialplan_uuid; + $database->fields['dialplan_detail_uuid'] = uuid(); + $database->fields['dialplan_detail_tag'] = 'action'; //condition, action, antiaction + $database->fields['dialplan_detail_type'] = 'set'; + $database->fields['dialplan_detail_data'] = 'hangup_after_bridge=true'; + $database->fields['dialplan_detail_order'] = '020'; + $database->add(); + + $database->table = "v_dialplan_details"; + $database->fields['domain_uuid'] = $this->domain_uuid; + $database->fields['dialplan_uuid'] = $this->dialplan_uuid; + $database->fields['dialplan_detail_uuid'] = uuid(); + $database->fields['dialplan_detail_tag'] = 'action'; //condition, action, antiaction + $database->fields['dialplan_detail_type'] = 'ivr'; + if (count($_SESSION["domains"]) > 1) { + $database->fields['dialplan_detail_data'] = $_SESSION['domain_name'].'-'.$this->ivr_menu_name; + } + else { + $database->fields['dialplan_detail_data'] = $this->ivr_menu_name; + } + $database->fields['dialplan_detail_order'] = '025'; + $database->add(); + + if (strlen($this->ivr_menu_exit_app) > 0) { + $database->table = "v_dialplan_details"; + $database->fields['domain_uuid'] = $this->domain_uuid; + $database->fields['dialplan_uuid'] = $this->dialplan_uuid; + $database->fields['dialplan_detail_uuid'] = uuid(); + $database->fields['dialplan_detail_tag'] = 'action'; //condition, action, antiaction + $database->fields['dialplan_detail_type'] = $this->ivr_menu_exit_app; + $database->fields['dialplan_detail_data'] = $this->ivr_menu_exit_data; + $database->fields['dialplan_detail_order'] = '030'; + $database->add(); + } + } + } + + //update the ivr menu option + if (strlen($this->ivr_menu_option_action) > 0) { + $database = new database; + $database->table = "v_ivr_menu_options"; + $database->fields['ivr_menu_option_digits'] = $this->ivr_menu_option_digits; + $database->fields['ivr_menu_option_action'] = $this->ivr_menu_option_action; + $database->fields['ivr_menu_option_param'] = $this->ivr_menu_option_param; + $database->fields['ivr_menu_option_order'] = $this->ivr_menu_option_order; + $database->fields['ivr_menu_option_description'] = $this->ivr_menu_option_description; + $database->where[0]['name'] = 'domain_uuid'; + $database->where[0]['value'] = $this->domain_uuid; + $database->where[0]['operator'] = '='; + $database->where[1]['name'] = 'ivr_menu_uuid'; + $database->where[1]['value'] = $this->ivr_menu_uuid; + $database->where[1]['operator'] = '='; + $database->where[2]['name'] = 'ivr_menu_option_uuid'; + $database->where[2]['value'] = $this->ivr_menu_option_uuid; + $database->where[2]['operator'] = '='; + $database->update(); + } + } + + function delete() { + //create the database object + $database = new database; + if ($this->db) { + $database->db = $this->db; + } + //start the transaction + //$count = $database->db->exec("BEGIN;"); + + //delete the ivr menu option + if (strlen($this->ivr_menu_option_uuid) > 0) { + $database->table = "v_ivr_menu_options"; + $database->where[0]['name'] = 'domain_uuid'; + $database->where[0]['value'] = $this->domain_uuid; + $database->where[0]['operator'] = '='; + $database->where[1]['name'] = 'ivr_menu_option_uuid'; + $database->where[1]['value'] = $this->ivr_menu_option_uuid; + $database->where[1]['operator'] = '='; + $database->delete(); + unset($this->ivr_menu_option_uuid); + } + + //delete the ivr menu + if (strlen($this->ivr_menu_option_uuid) == 0) { + //select the dialplan entries + $database->table = "v_ivr_menus"; + $database->where[0]['name'] = 'domain_uuid'; + $database->where[0]['value'] = $this->domain_uuid; + $database->where[0]['operator'] = '='; + $database->where[1]['name'] = 'ivr_menu_uuid'; + $database->where[1]['value'] = $this->ivr_menu_uuid; + $database->where[1]['operator'] = '='; + $result = $database->find(); + foreach($result as $row) { + $this->dialplan_uuid = $row['dialplan_uuid']; + //delete the child dialplan information + $database->table = "v_dialplan_details"; + $database->where[0]['name'] = 'domain_uuid'; + $database->where[0]['value'] = $this->domain_uuid; + $database->where[0]['operator'] = '='; + $database->where[1]['name'] = 'dialplan_uuid'; + $database->where[1]['value'] = $this->dialplan_uuid; + $database->where[1]['operator'] = '='; + $database->delete(); + //delete the dialplan information + $database->table = "v_dialplans"; + $database->where[0]['name'] = 'domain_uuid'; + $database->where[0]['value'] = $this->domain_uuid; + $database->where[0]['operator'] = '='; + $database->where[1]['name'] = 'dialplan_uuid'; + $database->where[1]['value'] = $this->dialplan_uuid; + $database->where[1]['operator'] = '='; + $database->delete(); + } + + //delete child data + $database->table = "v_ivr_menu_options"; + $database->where[0]['name'] = 'domain_uuid'; + $database->where[0]['value'] = $this->domain_uuid; + $database->where[0]['operator'] = '='; + $database->where[1]['name'] = 'ivr_menu_uuid'; + $database->where[1]['value'] = $this->ivr_menu_uuid; + $database->where[1]['operator'] = '='; + $database->delete(); + + //delete parent data + $database->table = "v_ivr_menus"; + $database->where[0]['name'] = 'domain_uuid'; + $database->where[0]['value'] = $this->domain_uuid; + $database->where[0]['operator'] = '='; + $database->where[1]['name'] = 'ivr_menu_uuid'; + $database->where[1]['value'] = $this->ivr_menu_uuid; + $database->where[1]['operator'] = '='; + $database->delete(); + + //commit the transaction + //$count = $database->db->exec("COMMIT;"); + } + } + + function get_xml(){ + return $xml; + } + + function save_xml($xml){ + return $xml; + } + + function xml_save_all() { + } + } + +?> \ No newline at end of file diff --git a/includes/classes/switch_modules.php b/includes/classes/switch_modules.php new file mode 100644 index 0000000000..0396740487 --- /dev/null +++ b/includes/classes/switch_modules.php @@ -0,0 +1,766 @@ + + Copyright (C) 2010 + All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; + +//add the database structure +/* +require_once "includes/classes/modules.php"; +$mod = new switch_modules; +$mod->dir = $_SESSION['switch']['mod']['dir']; +echo $mod->dir."\n"; +//database connection object + $mod->db = $db; +//get modules from the database + $mod->get_modules(); +//module exists + if ($mod->exists("mod_lua")) { + echo "exists true\n"; + } + else { + echo "exists false\n"; + } +//module active + if ($mod->active("mod_lua")) { + echo "active true\n"; + } + else { + echo "active false\n"; + } +//synch + $mod->synch(); + echo $mod->msg; +//show module info + $result = $mod->info("mod_lua"); + echo "
\n";
+	print_r($result);
+	echo "
\n"; +//list modules + //$result = $mod->modules + //echo "
\n";
+	//print_r($result);
+	//echo "
\n"; +*/ + +//define the directory class + class switch_modules { + public $db; + public $dir; + public $fp; + public $modules; + public $msg; + + // get the additional information about a specific module + public function info($name) { + $module_label = substr($name, 4); + $module_label = ucwords(str_replace("_", " ", $module_label)); + $mod['module_label'] = $module_label; + $mod['module_name'] = $name; + $mod['module_enabled'] = 'false'; + $mod['module_default_enabled'] = 'false'; + $mod['module_description'] = ''; + switch ($name) { + case "mod_amr": + $mod['module_label'] = 'AMR'; + $mod['module_category'] = 'Codecs'; + $mod['module_description'] = 'AMR codec.'; + $mod['module_enabled'] = 'true'; + $mod['module_default_enabled'] = 'true'; + break; + case "mod_avmd": + $mod['module_label'] = 'AVMD'; + $mod['module_category'] = 'Applications'; + $mod['module_description'] = 'Advanced voicemail beep detection.'; + $mod['module_enabled'] = 'true'; + $mod['module_default_enabled'] = 'true'; + break; + case "mod_blacklist": + $mod['module_label'] = 'Blacklist'; + $mod['module_category'] = 'Applications'; + $mod['module_description'] = 'Blacklist.'; + $mod['module_enabled'] = 'true'; + $mod['module_default_enabled'] = 'true'; + break; + case "mod_bv": + $mod['module_label'] = 'BV'; + $mod['module_category'] = 'Codecs'; + $mod['module_description'] = 'BroadVoice16 and BroadVoice32 audio codecs.'; + $mod['module_enabled'] = 'true'; + $mod['module_default_enabled'] = 'true'; + break; + case "mod_cdr_csv": + $mod['module_label'] = 'CDR CSV'; + $mod['module_category'] = 'Event Handlers'; + $mod['module_description'] = 'CSV call detail record handler.'; + $mod['module_enabled'] = 'false'; + $mod['module_default_enabled'] = 'false'; + break; + case "mod_cdr_sqlite": + $mod['module_label'] = 'CDR SQLite'; + $mod['module_category'] = 'Event Handlers'; + $mod['module_description'] = 'SQLite call detail record handler.'; + $mod['module_enabled'] = 'false'; + $mod['module_default_enabled'] = 'false'; + break; + case "mod_callcenter": + $mod['module_label'] = 'Call Center'; + $mod['module_category'] = 'Applications'; + $mod['module_description'] = 'Call queuing with agents and tiers for call centers.'; + $mod['module_enabled'] = 'true'; + $mod['module_default_enabled'] = 'true'; + break; + case "mod_cepstral": + $mod['module_label'] = 'Cepstral'; + $mod['module_category'] = 'Speech Recognition / Text to Speech'; + $mod['module_description'] = 'Text to Speech engine.'; + $mod['module_enabled'] = 'false'; + $mod['module_default_enabled'] = 'false'; + break; + case "mod_cidlookup": + $mod['module_label'] = 'CID Lookup'; + $mod['module_category'] = 'Applications'; + $mod['module_description'] = 'Lookup caller id info.'; + $mod['module_enabled'] = 'true'; + $mod['module_default_enabled'] = 'true'; + break; + case "mod_cluechoo": + $mod['module_label'] = 'Cluechoo'; + $mod['module_category'] = 'Applications'; + $mod['module_description'] = 'A framework demo module.'; + $mod['module_enabled'] = 'false'; + $mod['module_default_enabled'] = 'false'; + break; + case "mod_commands": + $mod['module_label'] = 'Commands'; + $mod['module_category'] = 'Applications'; + $mod['module_description'] = 'API interface commands.'; + $mod['module_enabled'] = 'true'; + $mod['module_default_enabled'] = 'true'; + break; + case "mod_conference": + $mod['module_label'] = 'Conference'; + $mod['module_category'] = 'Applications'; + $mod['module_description'] = 'Conference room module.'; + $mod['module_enabled'] = 'true'; + $mod['module_default_enabled'] = 'true'; + break; + case "mod_console": + $mod['module_label'] = 'Console'; + $mod['module_category'] = 'Loggers'; + $mod['module_description'] = 'Send logs to the console.'; + $mod['module_enabled'] = 'true'; + $mod['module_default_enabled'] = 'true'; + break; + case "mod_curl": + $mod['module_label'] = 'CURL'; + $mod['module_category'] = 'Applications'; + $mod['module_description'] = 'Allows scripts to make HTTP requests and return responses in plain text or JSON.'; + $mod['module_enabled'] = 'true'; + $mod['module_default_enabled'] = 'true'; + break; + case "mod_db": + $mod['module_label'] = 'DB'; + $mod['module_category'] = 'Applications'; + $mod['module_description'] = 'Database key / value storage functionality, dialing and limit backend.'; + $mod['module_enabled'] = 'true'; + $mod['module_default_enabled'] = 'true'; + break; + case "mod_dialplan_asterisk": + $mod['module_label'] = 'Dialplan Asterisk'; + $mod['module_category'] = 'Dialplan Interfaces'; + $mod['module_description'] = 'Allows Asterisk dialplans.'; + $mod['module_enabled'] = 'false'; + $mod['module_default_enabled'] = 'false'; + break; + case "mod_dialplan_xml": + $mod['module_label'] = 'Dialplan XML'; + $mod['module_category'] = 'Dialplan Interfaces'; + $mod['module_description'] = 'Provides dialplan functionality in XML.'; + $mod['module_enabled'] = 'true'; + $mod['module_default_enabled'] = 'true'; + break; + case "mod_directory": + $mod['module_label'] = 'Directory'; + $mod['module_category'] = 'Applications'; + $mod['module_description'] = 'Dial by name directory.'; + $mod['module_enabled'] = 'true'; + $mod['module_default_enabled'] = 'true'; + break; + case "mod_distributor": + $mod['module_label'] = 'Distributor'; + $mod['module_category'] = 'Applications'; + $mod['module_description'] = 'Round robin call distribution.'; + $mod['module_enabled'] = 'false'; + $mod['module_default_enabled'] = 'false'; + break; + case "mod_dptools": + $mod['module_label'] = 'Dialplan Plan Tools'; + $mod['module_category'] = 'Applications'; + $mod['module_description'] = 'Provides a number of apps and utilities for the dialplan.'; + $mod['module_enabled'] = 'true'; + $mod['module_default_enabled'] = 'true'; + break; + case "mod_enum": + $mod['module_label'] = 'ENUM'; + $mod['module_category'] = 'Applications'; + $mod['module_description'] = 'Route PSTN numbers over internet according to ENUM servers, such as e164.org.'; + $mod['module_enabled'] = 'true'; + $mod['module_default_enabled'] = 'true'; + break; + case "mod_esf": + $mod['module_label'] = 'ESF'; + $mod['module_category'] = 'Applications'; + $mod['module_description'] = 'Holds the multi cast paging application for SIP.'; + $mod['module_enabled'] = 'true'; + $mod['module_default_enabled'] = 'true'; + break; + case "mod_event_socket": + $mod['module_label'] = 'Event Socket'; + $mod['module_category'] = 'Event Handlers'; + $mod['module_description'] = 'Sends events via a single socket.'; + $mod['module_enabled'] = 'true'; + $mod['module_default_enabled'] = 'true'; + break; + case "mod_expr": + $mod['module_label'] = 'Expr'; + $mod['module_category'] = 'Applications'; + $mod['module_description'] = 'Expression evaluation library.'; + $mod['module_enabled'] = 'true'; + $mod['module_default_enabled'] = 'true'; + break; + case "mod_fifo": + $mod['module_label'] = 'FIFO'; + $mod['module_category'] = 'Applications'; + $mod['module_description'] = 'FIFO provides custom call queues including call park.'; + $mod['module_enabled'] = 'true'; + $mod['module_default_enabled'] = 'true'; + break; + case "mod_flite": + $mod['module_label'] = 'Flite'; + $mod['module_category'] = 'Speech Recognition / Text to Speech'; + $mod['module_description'] = 'Text to Speech engine.'; + $mod['module_enabled'] = 'true'; + $mod['module_default_enabled'] = 'true'; + break; + case "mod_fsv": + $mod['module_label'] = 'FSV'; + $mod['module_category'] = 'Applications'; + $mod['module_description'] = 'Video application (Recording and playback).'; + $mod['module_enabled'] = 'true'; + $mod['module_default_enabled'] = 'true'; + break; + case "mod_g723_1": + $mod['module_label'] = 'G.723.1'; + $mod['module_category'] = 'Codecs'; + $mod['module_description'] = 'G.723.1 codec.'; + $mod['module_enabled'] = 'true'; + $mod['module_default_enabled'] = 'true'; + break; + case "mod_g729": + $mod['module_label'] = 'G.729'; + $mod['module_category'] = 'Codecs'; + $mod['module_description'] = 'G729 codec supports passthrough mode'; + $mod['module_enabled'] = 'true'; + $mod['module_default_enabled'] = 'true'; + break; + case "mod_h26x": + $mod['module_label'] = 'H26x'; + $mod['module_category'] = 'Codecs'; + $mod['module_description'] = 'Video codecs'; + $mod['module_enabled'] = 'true'; + $mod['module_default_enabled'] = 'true'; + break; + case "mod_hash": + $mod['module_label'] = 'Hash'; + $mod['module_category'] = 'Applications'; + $mod['module_description'] = 'Resource limitation.'; + $mod['module_enabled'] = 'true'; + $mod['module_default_enabled'] = 'true'; + break; + case "mod_httapi": + $mod['module_label'] = 'HT-TAPI'; + $mod['module_category'] = 'Applications'; + $mod['module_description'] = 'HT-TAPI Hypertext Telephony API'; + $mod['module_enabled'] = 'false'; + $mod['module_default_enabled'] = 'false'; + break; + case "mod_http_cache": + $mod['module_label'] = 'HTTP Cache'; + $mod['module_category'] = 'Applications'; + $mod['module_description'] = 'HTTP GET with caching'; + $mod['module_enabled'] = 'false'; + $mod['module_default_enabled'] = 'false'; + break; + case "mod_ilbc": + $mod['module_label'] = 'iLBC'; + $mod['module_category'] = 'Codecs'; + $mod['module_description'] = 'iLBC codec.'; + $mod['module_enabled'] = 'true'; + $mod['module_default_enabled'] = 'true'; + break; + case "mod_ladspa": + $mod['module_label'] = 'Ladspa'; + $mod['module_category'] = 'Applications'; + $mod['module_description'] = 'Auto-tune calls.'; + $mod['module_enabled'] = 'false'; + $mod['module_default_enabled'] = 'false'; + break; + case "mod_lcr": + $mod['module_label'] = 'LCR'; + $mod['module_category'] = 'Applications'; + $mod['module_description'] = 'Least cost routing.'; + $mod['module_enabled'] = 'true'; + $mod['module_default_enabled'] = 'true'; + break; + case "mod_local_stream": + $mod['module_label'] = 'Local Stream'; + $mod['module_category'] = 'Streams / Files'; + $mod['module_description'] = 'For local streams (play all the files in a directory).'; + $mod['module_enabled'] = 'true'; + $mod['module_default_enabled'] = 'true'; + break; + case "mod_logfile": + $mod['module_label'] = 'Log File'; + $mod['module_category'] = 'Loggers'; + $mod['module_description'] = 'Send logs to the local file system.'; + $mod['module_enabled'] = 'true'; + $mod['module_default_enabled'] = 'true'; + break; + case "mod_loopback": + $mod['module_label'] = 'Loopback'; + $mod['module_category'] = 'Endpoints'; + $mod['module_description'] = 'A loopback channel driver to make an outbound call as an inbound call.'; + $mod['module_enabled'] = 'true'; + $mod['module_default_enabled'] = 'true'; + break; + case "mod_lua": + $mod['module_label'] = 'Lua'; + $mod['module_category'] = 'Languages'; + $mod['module_description'] = 'Lua script.'; + $mod['module_enabled'] = 'true'; + $mod['module_default_enabled'] = 'true'; + break; + case "mod_memcache": + $mod['module_label'] = 'Memcached'; + $mod['module_category'] = 'Applications'; + $mod['module_description'] = 'API for memcached.'; + $mod['module_enabled'] = 'false'; + $mod['module_default_enabled'] = 'false'; + break; + case "mod_native_file": + $mod['module_label'] = 'Native File'; + $mod['module_category'] = 'File Format Interfaces'; + $mod['module_description'] = 'File interface for codec specific file formats.'; + $mod['module_enabled'] = 'true'; + $mod['module_default_enabled'] = 'true'; + break; + case "mod_nibblebill": + $mod['module_label'] = 'Nibblebill'; + $mod['module_category'] = 'Applications'; + $mod['module_description'] = 'Billing module.'; + $mod['module_enabled'] = 'false'; + $mod['module_default_enabled'] = 'false'; + break; + case "mod_opus": + $mod['module_label'] = 'Opus'; + $mod['module_category'] = 'Codecs'; + $mod['module_description'] = 'OPUS ultra-low delay audio codec'; + $mod['module_enabled'] = 'false'; + $mod['module_default_enabled'] = 'false'; + break; + case "mod_park": + $mod['module_label'] = 'Park'; + $mod['module_category'] = 'Applications'; + $mod['module_description'] = 'Park Calls.'; + $mod['module_enabled'] = 'true'; + $mod['module_default_enabled'] = 'true'; + break; + case "mod_pocketsphinx": + $mod['module_label'] = 'PocketSphinx'; + $mod['module_category'] = 'Speech Recognition / Text to Speech'; + $mod['module_description'] = 'Speech Recognition.'; + $mod['module_enabled'] = 'true'; + $mod['module_default_enabled'] = 'true'; + break; + case "mod_rtmp": + $mod['module_label'] = 'RTMP'; + $mod['module_category'] = 'Applications'; + $mod['module_description'] = 'Real Time Media Protocol'; + $mod['module_enabled'] = 'true'; + $mod['module_default_enabled'] = 'true'; + break; + case "mod_say_de": + $mod['module_label'] = 'German'; + $mod['module_category'] = 'Say'; + $mod['module_description'] = ''; + $mod['module_enabled'] = 'true'; + $mod['module_default_enabled'] = 'true'; + break; + case "mod_say_en": + $mod['module_label'] = 'English'; + $mod['module_category'] = 'Say'; + $mod['module_description'] = ''; + $mod['module_enabled'] = 'true'; + $mod['module_default_enabled'] = 'true'; + break; + case "mod_say_es": + $mod['module_label'] = 'Spanish'; + $mod['module_category'] = 'Say'; + $mod['module_description'] = ''; + $mod['module_enabled'] = 'true'; + $mod['module_default_enabled'] = 'true'; + break; + case "mod_say_fr": + $mod['module_label'] = 'French'; + $mod['module_category'] = 'Say'; + $mod['module_description'] = ''; + $mod['module_enabled'] = 'true'; + $mod['module_default_enabled'] = 'true'; + break; + case "mod_say_he": + $mod['module_label'] = 'Hebrew'; + $mod['module_category'] = 'Say'; + $mod['module_description'] = ''; + $mod['module_enabled'] = 'true'; + $mod['module_default_enabled'] = 'true'; + break; + case "mod_say_hu": + $mod['module_label'] = 'Hungarian'; + $mod['module_category'] = 'Say'; + $mod['module_description'] = ''; + $mod['module_enabled'] = 'true'; + $mod['module_default_enabled'] = 'true'; + break; + case "mod_say_it": + $mod['module_label'] = 'Italian'; + $mod['module_category'] = 'Say'; + $mod['module_description'] = ''; + $mod['module_enabled'] = 'true'; + $mod['module_default_enabled'] = 'true'; + break; + case "mod_say_nl": + $mod['module_label'] = 'Dutch'; + $mod['module_category'] = 'Say'; + $mod['module_description'] = ''; + $mod['module_enabled'] = 'true'; + $mod['module_default_enabled'] = 'true'; + break; + case "mod_say_pt": + $mod['module_label'] = 'Portuguese'; + $mod['module_category'] = 'Say'; + $mod['module_description'] = ''; + $mod['module_enabled'] = 'true'; + $mod['module_default_enabled'] = 'true'; + break; + case "mod_say_ru": + $mod['module_label'] = 'Russian'; + $mod['module_category'] = 'Say'; + $mod['module_enabled'] = 'true'; + $mod['module_default_enabled'] = 'true'; + break; + case "mod_say_th": + $mod['module_label'] = 'Thai'; + $mod['module_category'] = 'Say'; + $mod['module_description'] = ''; + $mod['module_enabled'] = 'true'; + $mod['module_default_enabled'] = 'true'; + break; + case "mod_say_zh": + $mod['module_label'] = 'Chinese'; + $mod['module_category'] = 'Say'; + $mod['module_description'] = ''; + $mod['module_enabled'] = 'true'; + $mod['module_default_enabled'] = 'true'; + break; + case "mod_shout": + $mod['module_label'] = 'Shout'; + $mod['module_category'] = 'Streams / Files'; + $mod['module_description'] = 'MP3 files and shoutcast streams.'; + $mod['module_enabled'] = 'true'; + $mod['module_default_enabled'] = 'true'; + break; + case "mod_siren": + $mod['module_label'] = 'Siren'; + $mod['module_category'] = 'Codecs'; + $mod['module_description'] = 'Siren codec'; + $mod['module_enabled'] = 'true'; + $mod['module_default_enabled'] = 'true'; + break; + case "mod_sms": + $mod['module_label'] = 'SMS'; + $mod['module_category'] = 'Applications'; + $mod['module_description'] = 'Chat messages'; + $mod['module_enabled'] = 'true'; + $mod['module_default_enabled'] = 'true'; + break; + case "mod_sndfile": + $mod['module_label'] = 'Sound File'; + $mod['module_category'] = 'File Format Interfaces'; + $mod['module_description'] = 'Multi-format file format transcoder (WAV, etc).'; + $mod['module_enabled'] = 'true'; + $mod['module_default_enabled'] = 'true'; + break; + case "mod_sofia": + $mod['module_label'] = 'Sofia'; + $mod['module_category'] = 'Endpoints'; + $mod['module_description'] = 'SIP module.'; + $mod['module_enabled'] = 'true'; + $mod['module_default_enabled'] = 'true'; + break; + case "mod_spandsp": + $mod['module_label'] = 'SpanDSP'; + $mod['module_category'] = 'Applications'; + $mod['module_description'] = 'FAX provides fax send and receive.'; + $mod['module_enabled'] = 'true'; + $mod['module_default_enabled'] = 'true'; + break; + case "mod_speex": + $mod['module_label'] = 'Speex'; + $mod['module_category'] = 'Codecs'; + $mod['module_description'] = 'Speex codec.'; + $mod['module_enabled'] = 'true'; + $mod['module_default_enabled'] = 'true'; + break; + case "mod_spidermonkey": + $mod['module_label'] = 'SpiderMonkey'; + $mod['module_category'] = 'Languages'; + $mod['module_description'] = 'JavaScript support.'; + $mod['module_enabled'] = 'false'; + $mod['module_default_enabled'] = 'false'; + break; + case "mod_spidermonkey_core_db": + $mod['module_label'] = 'SpiderMonkey Core DB'; + $mod['module_category'] = 'Languages'; + $mod['module_description'] = 'Javascript support for SQLite.'; + $mod['module_enabled'] = 'false'; + $mod['module_default_enabled'] = 'false'; + break; + case "mod_spidermonkey_curl": + $mod['module_label'] = 'SpiderMonkey Curl'; + $mod['module_category'] = 'Languages'; + $mod['module_description'] = 'Javascript curl support.'; + $mod['module_enabled'] = 'false'; + $mod['module_default_enabled'] = 'false'; + break; + case "mod_spidermonkey_socket": + $mod['module_label'] = 'SpiderMonkey Socket'; + $mod['module_category'] = 'Languages'; + $mod['module_description'] = 'Javascript socket support.'; + $mod['module_enabled'] = 'false'; + $mod['module_default_enabled'] = 'false'; + break; + case "mod_spidermonkey_teletone": + $mod['module_label'] = 'SpiderMonkey Teletone'; + $mod['module_category'] = 'Languages'; + $mod['module_description'] = 'Javascript teletone support.'; + $mod['module_enabled'] = 'false'; + $mod['module_default_enabled'] = 'false'; + break; + case "mod_syslog": + $mod['module_label'] = 'Syslog'; + $mod['module_category'] = 'Loggers'; + $mod['module_description'] = 'Send logs to a remote syslog server.'; + $mod['module_enabled'] = 'true'; + $mod['module_default_enabled'] = 'true'; + break; + case "mod_tone_stream": + $mod['module_label'] = 'Tone Stream'; + $mod['module_category'] = 'Streams / Files'; + $mod['module_description'] = 'Generate tone streams.'; + $mod['module_enabled'] = 'true'; + $mod['module_default_enabled'] = 'true'; + break; + case "mod_tts_commandline": + $mod['module_label'] = 'TTS Commandline'; + $mod['module_category'] = 'Speech Recognition / Text to Speech'; + $mod['module_description'] = 'Commandline text to speech engine.'; + $mod['module_enabled'] = 'true'; + $mod['module_default_enabled'] = 'true'; + break; + case "mod_unimrcp": + $mod['module_label'] = 'MRCP'; + $mod['module_category'] = 'Speech Recognition / Text to Speech'; + $mod['module_description'] = 'Media Resource Control Protocol.'; + $mod['module_enabled'] = 'false'; + $mod['module_default_enabled'] = 'false'; + break; + case "mod_valet_parking": + $mod['module_label'] = 'Valet Parking'; + $mod['module_category'] = 'Applications'; + $mod['module_description'] = 'Call parking'; + $mod['module_enabled'] = 'true'; + $mod['module_default_enabled'] = 'true'; + break; + case "mod_voicemail": + $mod['module_label'] = 'Voicemail'; + $mod['module_category'] = 'Applications'; + $mod['module_description'] = 'Full featured voicemail module.'; + $mod['module_enabled'] = 'true'; + $mod['module_default_enabled'] = 'true'; + break; + case "mod_voicemail_ivr": + $mod['module_label'] = 'Voicemail IVR'; + $mod['module_category'] = 'Applications'; + $mod['module_description'] = 'Voicemail IVR interface.'; + $mod['module_enabled'] = 'true'; + $mod['module_default_enabled'] = 'true'; + break; + case "mod_xml_cdr": + $mod['module_label'] = 'XML CDR'; + $mod['module_category'] = 'XML Interfaces'; + $mod['module_description'] = 'XML based call detail record handler.'; + $mod['module_enabled'] = 'true'; + $mod['module_default_enabled'] = 'true'; + break; + case "mod_xml_curl": + $mod['module_label'] = 'XML Curl'; + $mod['module_category'] = 'XML Interfaces'; + $mod['module_description'] = 'Request XML config files dynamically.'; + $mod['module_enabled'] = 'false'; + $mod['module_default_enabled'] = 'false'; + break; + case "mod_xml_rpc": + $mod['module_label'] = 'XML RPC'; + $mod['module_category'] = 'XML Interfaces'; + $mod['module_description'] = 'XML Remote Procedure Calls. Issue commands from your web application.'; + $mod['module_enabled'] = 'true'; + $mod['module_default_enabled'] = 'true'; + break; + default: + $mod['module_category'] = 'Auto'; + $mod['module_enabled'] = 'false'; + $mod['module_default_enabled'] = 'false'; + } + return $mod; + } + + //check to see if the module exists in the array + public function exists($name) { + //set the default + $result = false; + //look for the module + foreach ($this->modules as &$row) { + if ($row['module_name'] == $name) { + $result = true; + break; + } + } + //return the result + return $result; + } + + //check the status of the module + public function active($name) { + if (!$this->fp) { + $this->fp = event_socket_create($_SESSION['event_socket_ip_address'], $_SESSION['event_socket_port'], $_SESSION['event_socket_password']); + } + if ($this->fp) { + $cmd = "api module_exists ".$name; + $response = trim(event_socket_request($this->fp, $cmd)); + if ($response == "true") { + return true; + } + else { + return false; + } + } + else { + return false; + } + } + + //get the list of modules + public function get_modules() { + $sql = " select * from v_modules "; + $sql .= "order by module_category, module_label"; + $prep_statement = $this->db->prepare($sql); + $prep_statement->execute(); + $this->modules = $prep_statement->fetchAll(PDO::FETCH_ASSOC); + unset ($prep_statement, $sql); + } + + //add missing modules for more module info see http://wiki.freeswitch.com/wiki/Modules + public function synch() { + if ($handle = opendir($this->dir)) { + $modules_new = ''; + $module_found = false; + while (false !== ($file = readdir($handle))) { + if ($file != "." && $file != "..") { + if (substr($file, -3) == ".so" || substr($file, -4) == ".dll") { + if (substr($file, -3) == ".so") { + $name = substr($file, 0, -3); + } + if (substr($file, -4) == ".dll") { + $name = substr($file, 0, -4); + } + if (!$this->exists($name)) { + //set module found to true + $module_found = true; + //get the module array + $mod = $this->info($name); + //append the module label + $modules_new .= "
  • ".$mod['module_label']."
  • \n"; + //insert the data + $module_uuid = uuid(); + $sql = "insert into v_modules "; + $sql .= "("; + $sql .= "module_uuid, "; + $sql .= "module_label, "; + $sql .= "module_name, "; + $sql .= "module_description, "; + $sql .= "module_category, "; + $sql .= "module_enabled, "; + $sql .= "module_default_enabled "; + $sql .= ")"; + $sql .= "values "; + $sql .= "("; + $sql .= "'".$module_uuid."', "; + $sql .= "'".$mod['module_label']."', "; + $sql .= "'".$mod['module_name']."', "; + $sql .= "'".$mod['module_description']."', "; + $sql .= "'".$mod['module_category']."', "; + $sql .= "'".$mod['module_enabled']."', "; + $sql .= "'".$mod['module_default_enabled']."' "; + $sql .= ")"; + $this->db->exec($sql); + unset($sql); + } + } + } + } + closedir($handle); + if ($module_found) { + //save_module_xml(); + $msg = "Added New Modules:
    \n"; + $msg .= "
      \n"; + $msg .= $modules_new; + $msg .= "
    \n"; + $this->msg = $msg; + } + } + } + } //class + +?> \ No newline at end of file diff --git a/includes/cmd.php b/includes/cmd.php new file mode 100644 index 0000000000..b02e3fba9f --- /dev/null +++ b/includes/cmd.php @@ -0,0 +1,53 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; +if (if_group("admin") || if_group("superadmin")) { + //access granted +} +else { + echo "access denied"; + exit; +} + +$cmd = $_GET['cmd']; +$rdr = $_GET['rdr']; + +$fp = event_socket_create($_SESSION['event_socket_ip_address'], $_SESSION['event_socket_port'], $_SESSION['event_socket_password']); +if ($fp) { + $response = event_socket_request($fp, $cmd); + fclose($fp); +} + +if ($rdr == "false") { + //redirect false + echo $response; +} +else { + header("Location: v_status.php?savemsg=".urlencode($response)); +} +?> \ No newline at end of file diff --git a/includes/config.php.dist b/includes/config.php.dist new file mode 100644 index 0000000000..748d2be866 --- /dev/null +++ b/includes/config.php.dist @@ -0,0 +1,62 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ + +//----------------------------------------------------- +// settings: +//----------------------------------------------------- + + //set the database type + $db_type = 'sqlite'; //sqlite, mysql, pgsql, others with a manually created PDO connection + + //sqlite: the dbfilename and db_file_path are automatically assigned however the values can be overidden by setting the values here. + $dbfilename = 'fusionpbx.db'; //host name/ip address + '.db' is the default database filename + $db_file_path = '\fusionpbx\Program\www\localhost\fusionpbx\secure'; //the path is determined by a php variable + + //mysql: database connection information + //$db_host = ''; + //$db_port = ''; + //$db_name = ''; + //$db_username = ''; + //$db_password = ''; + + //pgsql: database connection information + //$db_host = ''; //set the host only if the database is not local + //$db_port = ''; + //$db_name = ''; + //$db_username = ''; + //$db_password = ''; + + //set the host ip or name that the will be used to communicate with the phone system + $host = '127.0.0.1'; + + //show errors + ini_set('display_errors', '1'); + //error_reporting (E_ALL); // Report everything + //error_reporting (E_ALL ^ E_NOTICE); // Report everything + error_reporting(E_ALL ^ E_NOTICE ^ E_WARNING ); //hide notices and warnings + + +?> diff --git a/includes/directory.php b/includes/directory.php new file mode 100644 index 0000000000..aa5d4992ba --- /dev/null +++ b/includes/directory.php @@ -0,0 +1,278 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; + +if (!function_exists('phone_letter_to_number')) { + function phone_letter_to_number($tmp) { + if ($tmp == "a" | $tmp == "b" | $tmp == "c") { return 2; } + if ($tmp == "d" | $tmp == "e" | $tmp == "f") { return 3; } + if ($tmp == "g" | $tmp == "h" | $tmp == "i") { return 4; } + if ($tmp == "j" | $tmp == "k" | $tmp == "l") { return 5; } + if ($tmp == "m" | $tmp == "n" | $tmp == "o") { return 6; } + if ($tmp == "p" | $tmp == "q" | $tmp == "r" | $tmp == "s") { return 7; } + if ($tmp == "t" | $tmp == "u" | $tmp == "v") { return 8; } + if ($tmp == "w" | $tmp == "x" | $tmp == "y" | $tmp == "z") { return 9; } + } +} + +if (!function_exists('sync_directory')) { + function sync_directory() { + + global $domain_uuid, $db; + $settings_array = v_settings(); + foreach($settings_array as $name => $value) { + $$name = $value; + } + + $tmp = "include(\"config.js\");\n"; + $tmp .= "//var sounds_dir\n"; + $tmp .= "var admin_pin = \"\";\n"; + $tmp .= "var search_type = \"\";\n"; + $tmp .= "//var tmp_dir\n"; + $tmp .= "var digitmaxlength = 0;\n"; + $tmp .= "var timeoutpin = 5000;\n"; + $tmp .= "var timeouttransfer = 5000;\n"; + $tmp .= "\n"; + $tmp .= "var dtmf = new Object( );\n"; + $tmp .= "dtmf.digits = \"\";\n"; + $tmp .= "\n"; + $tmp .= "function mycb( session, type, obj, arg ) {\n"; + $tmp .= " try {\n"; + $tmp .= " if ( type == \"dtmf\" ) {\n"; + $tmp .= " console_log( \"info\", \"digit: \"+obj.digit+\"\\n\" );\n"; + $tmp .= " if ( obj.digit == \"#\" ) {\n"; + $tmp .= " //console_log( \"info\", \"detected pound sign.\\n\" );\n"; + $tmp .= " exit = true;\n"; + $tmp .= " return( false );\n"; + $tmp .= " }\n"; + $tmp .= " if ( obj.digit == \"*\" ) {\n"; + $tmp .= " //console_log( \"info\", \"detected pound sign.\\n\" );\n"; + $tmp .= " exit = true;\n"; + $tmp .= " return( false );\n"; + $tmp .= " }\n"; + $tmp .= " dtmf.digits += obj.digit;\n"; + $tmp .= " if ( dtmf.digits.length >= digitmaxlength ) {\n"; + $tmp .= " exit = true;\n"; + $tmp .= " return( false );\n"; + $tmp .= " }\n"; + $tmp .= " }\n"; + $tmp .= " } catch (e) {\n"; + $tmp .= " console_log( \"err\", e+\"\\n\" );\n"; + $tmp .= " }\n"; + $tmp .= " return( true );\n"; + $tmp .= "} //end function mycb\n"; + $tmp .= "\n"; + $tmp .= "function directory_search(search_type) {\n"; + $tmp .= "\n"; + $tmp .= " digitmaxlength = 3;\n"; + $tmp .= " session.streamFile( sounds_dir+\"/en/us/callie/directory/48000/dir-enter_person.wav\");\n"; + $tmp .= " if (search_type == \"last_name\") {\n"; + $tmp .= " session.streamFile( sounds_dir+\"/en/us/callie/directory/48000/dir-last_name.wav\", mycb, \"dtmf\");\n"; + $tmp .= " session.streamFile( sounds_dir+\"/en/us/callie/directory/48000/dir-to_search_by.wav\", mycb, \"dtmf\");\n"; + $tmp .= " session.streamFile( sounds_dir+\"/en/us/callie/directory/48000/dir-first_name.wav\", mycb, \"dtmf\");\n"; + $tmp .= " }\n"; + $tmp .= " if (search_type == \"first_name\") {\n"; + $tmp .= " session.streamFile( sounds_dir+\"/en/us/callie/directory/48000/dir-first_name.wav\", mycb, \"dtmf\");\n"; + $tmp .= " session.streamFile( sounds_dir+\"/en/us/callie/directory/48000/dir-to_search_by.wav\", mycb, \"dtmf\");\n"; + $tmp .= " session.streamFile( sounds_dir+\"/en/us/callie/directory/48000/dir-last_name.wav\", mycb, \"dtmf\");\n"; + $tmp .= " }\n"; + $tmp .= " session.streamFile( sounds_dir+\"/en/us/callie/directory/48000/dir-press.wav\", mycb, \"dtmf\");\n"; + $tmp .= " session.execute(\"say\", \"en name_spelled iterated 1\");\n"; + $tmp .= " session.collectInput( mycb, dtmf, timeoutpin );\n"; + $tmp .= " var dtmf_search = dtmf.digits;\n"; + $tmp .= " //console_log( \"info\", \"--\" + dtmf.digits + \"--\\n\" );\n"; + $tmp .= " if (dtmf_search == \"1\") {\n"; + $tmp .= " //console_log( \"info\", \"press 1 detected: \" + dtmf.digits + \"\\n\" );\n"; + $tmp .= " //console_log( \"info\", \"press 1 detected: \" + search_type + \"\\n\" );\n"; + $tmp .= " if (search_type == \"last_name\") {\n"; + $tmp .= " //console_log( \"info\", \"press 1 detected last_name: \" + search_type + \"\\n\" );\n"; + $tmp .= " search_type = \"first_name\";\n"; + $tmp .= " }\n"; + $tmp .= " else {\n"; + $tmp .= " //console_log( \"info\", \"press 1 detected first_name: \" + search_type + \"\\n\" );\n"; + $tmp .= " search_type = \"last_name\";\n"; + $tmp .= " }\n"; + $tmp .= " dtmf_search = \"\";\n"; + $tmp .= " dtmf.digits = \"\";\n"; + $tmp .= " directory_search(search_type);\n"; + $tmp .= " return;\n"; + $tmp .= " }\n"; + $tmp .= " console_log( \"info\", \"first 3 letters of first or last name: \" + dtmf.digits + \"\\n\" );\n"; + $tmp .= "\n"; + $tmp .= " //session.execute(\"say\", \"en name_spelled pronounced mark\");\n"; + $tmp .= " //\n"; + $tmp .= " //session.execute(\"say\", \"en number iterated 12345\");\n"; + $tmp .= " //session.execute(\"say\", \"en number pronounced 1001\");\n"; + $tmp .= " //session.execute(\"say\", \"en short_date_time pronounced [timestamp]\");\n"; + $tmp .= " //session.execute(\"say\", \"en CURRENT_TIME pronounced CURRENT_TIME\");\n"; + $tmp .= " //session.execute(\"say\", \"en CURRENT_DATE pronounced CURRENT_DATE\");\n"; + $tmp .= " //session.execute(\"say\", \"en CURRENT_DATE_TIME pronounced CURRENT_DATE_TIME\");\n"; + $tmp .= "\n"; + $tmp .= "\n"; + $tmp .= " //take each name and convert it to the equivalent number in php when this file is generated\n"; + $tmp .= " //then test each number see if it matches the user dtmf search keys\n"; + $tmp .= "\n"; + $tmp .= " var result_array = new Array();\n"; + $tmp .= " var x = 0;\n"; + + //get a list of extensions and the users assigned to them + $sql = ""; + $sql .= " select * from v_extensions "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $x = 0; + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach ($result as &$row) { + //print_r($row); + $extension = $row["extension"]; + $effective_caller_id_name = $row["effective_caller_id_name"]; + //$user_list = $row["user_list"]; + //$user_list = trim($user_list, "|"); + //echo $user_list."
    \n"; + //$username_array = explode ("|", $user_list); + //print_r($username_array); + foreach ($username_array as &$username) { + if (strlen($username) > 0) { + $sql = ""; + $sql .= "select * from v_users "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and username = '$username' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $tmp_result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach ($tmp_result as &$row_tmp) { + $user_first_name = $row_tmp["user_first_name"]; + $user_last_name = $row_tmp["user_last_name"]; + if ($user_first_name == "na") { $user_first_name = ""; } + if ($user_last_name == "na") { $user_last_name = ""; } + if (strlen($user_first_name.$user_last_name) == 0) { + $name_array = explode (" ", $effective_caller_id_name); + $user_first_name = $name_array[0]; + if (count($name_array) > 1) { + $user_last_name = $name_array[1]; + } + } + + break; //limit to 1 row + } + $f1 = phone_letter_to_number(substr($user_first_name, 0,1)); + $f2 = phone_letter_to_number(substr($user_first_name, 1,1)); + $f3 = phone_letter_to_number(substr($user_first_name, 2,1)); + + $l1 = phone_letter_to_number(substr($user_last_name, 0,1)); + $l2 = phone_letter_to_number(substr($user_last_name, 1,1)); + $l3 = phone_letter_to_number(substr($user_last_name, 2,1)); + + //echo $sql." extension: $extension firstname $user_first_name lastname $user_last_name $tmp
    "; + + $tmp .= " if (search_type == \"first_name\" && dtmf_search == \"".$f1.$f2.$f3."\" || search_type == \"last_name\" && dtmf_search == \"".$l1.$l2.$l3."\") {\n"; + $tmp .= " result_array[x]=new Array()\n"; + $tmp .= " result_array[x]['first_name'] =\"".$user_first_name."\";\n"; + $tmp .= " result_array[x]['last_name'] =\"".$user_last_name."\";\n"; + $tmp .= " result_array[x]['extension'] = \"".$extension."\";\n"; + $tmp .= " //console_log( \"info\", \"found: ".$user_first_name." ".$user_last_name."\\n\" );\n"; + $tmp .= " x++;\n"; + $tmp .= " }\n"; + } + } + } + unset ($prep_statement); + + $tmp .= "\n"; + $tmp .= "\n"; + $tmp .= " //say the number of results that matched\n"; + $tmp .= " \$result_count = result_array.length;\n"; + $tmp .= " session.execute(\"say\", \"en number iterated \"+\$result_count);\n"; + $tmp .= " session.streamFile( sounds_dir+\"/en/us/callie/directory/48000/dir-result_match.wav\", mycb, \"dtmf\");\n"; + $tmp .= "\n"; + $tmp .= " //clear values\n"; + $tmp .= " dtmf_search = 0;\n"; + $tmp .= " dtmf.digits = '';\n"; + $tmp .= "\n"; + $tmp .= " if (\$result_count == 0) {\n"; + $tmp .= " //session.execute(\"transfer\", \"*347 XML default\");\n"; + $tmp .= " directory_search(search_type);\n"; + $tmp .= " return;\n"; + $tmp .= " }\n"; + $tmp .= "\n"; + $tmp .= " session.execute(\"set\", \"tts_engine=flite\");\n"; + $tmp .= " session.execute(\"set\", \"tts_voice=rms\"); //rms //kal //awb //slt\n"; + $tmp .= " session.execute(\"set\", \"playback_terminators=#\");\n"; + $tmp .= " //session.speak(\"flite\",\"kal\",\"Thanks for.. calling\");\n"; + $tmp .= "\n"; + $tmp .= " i=1;\n"; + $tmp .= " for ( i in result_array ) {\n"; + $tmp .= "\n"; + $tmp .= " //say first name and last name is at extension 1001\n"; + $tmp .= " //session.execute(\"speak\", result_array[i]['first_name']);\n"; + $tmp .= " //session.execute(\"speak\", result_array[i]['last_name']);\n"; + $tmp .= " session.execute(\"say\", \"en name_spelled pronounced \"+result_array[i]['first_name']);\n"; + $tmp .= " session.execute(\"sleep\", \"500\");\n"; + $tmp .= " session.execute(\"say\", \"en name_spelled pronounced \"+result_array[i]['last_name']);\n"; + $tmp .= " session.streamFile( sounds_dir+\"/en/us/callie/directory/48000/dir-at_extension.wav\", mycb, \"dtmf\");\n"; + $tmp .= " session.execute(\"say\", \"en number pronounced \"+result_array[i]['extension']);\n"; + $tmp .= "\n"; + $tmp .= " //to select this entry press 1\n"; + $tmp .= " session.streamFile( sounds_dir+\"/en/us/callie/directory/48000/dir-to_select_entry.wav\", mycb, \"dtmf\");\n"; + $tmp .= " session.streamFile( sounds_dir+\"/en/us/callie/directory/48000/dir-press.wav\", mycb, \"dtmf\");\n"; + $tmp .= " session.execute(\"say\", \"en number iterated 1\");\n"; + $tmp .= "\n"; + $tmp .= " //console_log( \"info\", \"first name: \" + result_array[i]['first_name'] + \"\\n\" );\n"; + $tmp .= " //console_log( \"info\", \"last name: \" + result_array[i]['last_name'] + \"\\n\" );\n"; + $tmp .= " //console_log( \"info\", \"extension: \" + result_array[i]['extension'] + \"\\n\" );\n"; + $tmp .= "\n"; + $tmp .= " //if 1 is pressed then transfer the call\n"; + $tmp .= " dtmf.digits = session.getDigits(1, \"#\", 3000);\n"; + $tmp .= " if (dtmf.digits == \"1\") {\n"; + $tmp .= " console_log( \"info\", \"directory: call transfered to: \" + result_array[i]['extension'] + \"\\n\" );\n"; + $tmp .= " session.execute(\"transfer\", result_array[i]['extension']+\" XML default\");\n"; + $tmp .= " }\n"; + $tmp .= "\n"; + $tmp .= " }\n"; + $tmp .= "}\n"; + $tmp .= "\n"; + $tmp .= "\n"; + $tmp .= "if ( session.ready() ) {\n"; + $tmp .= " session.answer();\n"; + $tmp .= " search_type = \"last_name\";\n"; + $tmp .= " directory_search(search_type);\n"; + $tmp .= " session.hangup(\"NORMAL_CLEARING\");\n"; + $tmp .= "}\n"; + $tmp .= ""; + + //write the file + $fout = fopen($_SESSION['switch']['scripts']['dir']."/directory.js","w"); + fwrite($fout, $tmp); + fclose($fout); + + } //end sync_directory +} //end if function exists + +sync_directory(); +?> \ No newline at end of file diff --git a/includes/download.php b/includes/download.php new file mode 100644 index 0000000000..9b4a0e9630 --- /dev/null +++ b/includes/download.php @@ -0,0 +1,36 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +//require_once "includes/checkauth.php"; + +$file = $_GET["f"]; +require_once "includes/securedownload.php"; +//echo $file; +DownloadFile($file_dir.$file); + +?> + diff --git a/includes/edit_area/edit_area_full.gz b/includes/edit_area/edit_area_full.gz new file mode 100644 index 0000000000000000000000000000000000000000..8cfc846f1649c8de8bc1f12dc660d90d717e67ca GIT binary patch literal 29125 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.isGecko||(t.isWebKit&&!t.isSafari<3)||t.isOpera>=9||t.isCamino)t.isValidBrowser=true; +else t.isValidBrowser=false;t.set_base_url();for(var i=0;i0)s["toolbar"]=s["begin_toolbar"]+","+s["toolbar"];if(s["end_toolbar"].length>0)s["toolbar"]=s["toolbar"]+","+s["end_toolbar"];s["tab_toolbar"]=s["toolbar"].replace(/ /g,"").split(",");s["plugins"]=s["plugins"].replace(/ /g,"").split(",");for(i=0;i0){s["syntax"]=s["syntax"].toLowerCase();t.load_script(t.baseURL+"reg_syntax/"+s["syntax"]+".js");}eAs[s["id"]]={"settings":s};eAs[s["id"]]["displayed"]=false;eAs[s["id"]]["hidden"]=false;t.start(s["id"]);},delete_instance:function(id){var d=document,fs=window.frames,span,iframe;eAL.execCommand(id,"EA_delete");if(fs["frame_"+id]&&fs["frame_"+id].editArea){if(eAs[id]["displayed"])eAL.toggle(id,"off");fs["frame_"+id].editArea.execCommand("EA_unload");}span=d.getElementById("EditAreaArroundInfos_"+id);if(span)span.parentNode.removeChild(span);iframe=d.getElementById("frame_"+id);if(iframe){iframe.parentNode.removeChild(iframe);try{delete fs["frame_"+id];}catch(e){}}delete eAs[id];},start:function(id){var t=this,d=document,f,span,father,next,html='',html_toolbar_content='',template,content,i;if(t.win!="loaded"){setTimeout("eAL.start('"+id+"');",50);return;}for(i in t.waiting_loading){if(t.waiting_loading[i]!="loaded"&&typeof(t.waiting_loading[i])!="function"){setTimeout("eAL.start('"+id+"');",50);return;}}if(!t.lang[eAs[id]["settings"]["language"]]||(eAs[id]["settings"]["syntax"].length>0&&!t.load_syntax[eAs[id]["settings"]["syntax"]])){setTimeout("eAL.start('"+id+"');",50);return;}if(eAs[id]["settings"]["syntax"].length>0)t.init_syntax_regexp();if(!d.getElementById("EditAreaArroundInfos_"+id)&&(eAs[id]["settings"]["debug"]||eAs[id]["settings"]["allow_toggle"])){span=d.createElement("span");span.id="EditAreaArroundInfos_"+id;if(eAs[id]["settings"]["allow_toggle"]){checked=(eAs[id]["settings"]["display"]=="onload")?"checked='checked'":"";html+="
    ";html+="";html+="
    ";}if(eAs[id]["settings"]["debug"])html+="
    ";html=t.translate(html,eAs[id]["settings"]["language"]);span.innerHTML=html;father=d.getElementById(id).parentNode;next=d.getElementById(id).nextSibling;if(next==null)father.appendChild(span); +else father.insertBefore(span,next);}if(!eAs[id]["initialized"]){t.execCommand(id,"EA_init");if(eAs[id]["settings"]["display"]=="later"){eAs[id]["initialized"]=true;return;}}if(t.isIE){t.init_ie_textarea(id);}area=eAs[id];for(i=0;i';}for(i=0;i';t.iframe_script+='';}if(!t.iframe_css){t.iframe_css="";}template=t.template.replace(/\[__BASEURL__\]/g,t.baseURL);template=template.replace("[__TOOLBAR__]",html_toolbar_content);template=t.translate(template,area["settings"]["language"],"template");template=template.replace("[__CSSRULES__]",t.iframe_css);template=template.replace("[__JSCODE__]",t.iframe_script);template=template.replace("[__EA_VERSION__]",t.version);area.textarea=d.getElementById(area["settings"]["id"]);eAs[area["settings"]["id"]]["textarea"]=area.textarea;if(typeof(window.frames["frame_"+area["settings"]["id"]])!='undefined')delete window.frames["frame_"+area["settings"]["id"]];father=area.textarea.parentNode;content=d.createElement("iframe");content.name="frame_"+area["settings"]["id"];content.id="frame_"+area["settings"]["id"];content.style.borderWidth="0px";setAttribute(content,"frameBorder","0");content.style.overflow="hidden";content.style.display="none";next=area.textarea.nextSibling;if(next==null)father.appendChild(content); +else father.insertBefore(content,next);f=window.frames["frame_"+area["settings"]["id"]];f.document.open();f.eAs=eAs;f.area_id=area["settings"]["id"];f.document.area_id=area["settings"]["id"];f.document.write(template);f.document.close();},toggle:function(id,toggle_to){if(!toggle_to)toggle_to=(eAs[id]["displayed"]==true)?"off":"on";if(eAs[id]["displayed"]==true&&toggle_to=="off"){this.toggle_off(id);} +else if(eAs[id]["displayed"]==false&&toggle_to=="on"){this.toggle_on(id);}return false;},toggle_off:function(id){var fs=window.frames,f,t,parNod,nxtSib,selStart,selEnd,scrollTop,scrollLeft;if(fs["frame_"+id]){f=fs["frame_"+id];t=eAs[id]["textarea"];if(f.editArea.fullscreen['isFull'])f.editArea.toggle_full_screen(false);eAs[id]["displayed"]=false;t.wrap="off";setAttribute(t,"wrap","off");parNod=t.parentNode;nxtSib=t.nextSibling;parNod.removeChild(t);parNod.insertBefore(t,nxtSib);t.value=f.editArea.textarea.value;selStart=f.editArea.last_selection["selectionStart"];selEnd=f.editArea.last_selection["selectionEnd"];scrollTop=f.document.getElementById("result").scrollTop;scrollLeft=f.document.getElementById("result").scrollLeft;document.getElementById("frame_"+id).style.display='none';t.style.display="inline";try{t.focus();}catch(e){};if(this.isIE){t.selectionStart=selStart;t.selectionEnd=selEnd;t.focused=true;set_IE_selection(t);} +else{if(this.isOpera&&this.isOpera < 9.6){t.setSelectionRange(0,0);}try{t.setSelectionRange(selStart,selEnd);}catch(e){};}t.scrollTop=scrollTop;t.scrollLeft=scrollLeft;f.editArea.execCommand("toggle_off");}},toggle_on:function(id){var fs=window.frames,f,t,selStart=0,selEnd=0,scrollTop=0,scrollLeft=0,curPos,elem;if(fs["frame_"+id]){f=fs["frame_"+id];t=eAs[id]["textarea"];area=f.editArea;area.textarea.value=t.value;curPos=eAs[id]["settings"]["cursor_position"];if(t.use_last==true){selStart=t.last_selectionStart;selEnd=t.last_selectionEnd;scrollTop=t.last_scrollTop;scrollLeft=t.last_scrollLeft;t.use_last=false;} +else if(curPos=="auto"){try{selStart=t.selectionStart;selEnd=t.selectionEnd;scrollTop=t.scrollTop;scrollLeft=t.scrollLeft;}catch(ex){}}this.set_editarea_size_from_textarea(id,document.getElementById("frame_"+id));t.style.display="none";document.getElementById("frame_"+id).style.display="inline";area.execCommand("focus");eAs[id]["displayed"]=true;area.execCommand("update_size");f.document.getElementById("result").scrollTop=scrollTop;f.document.getElementById("result").scrollLeft=scrollLeft;area.area_select(selStart,selEnd-selStart);area.execCommand("toggle_on");} +else{elem=document.getElementById(id);elem.last_selectionStart=elem.selectionStart;elem.last_selectionEnd=elem.selectionEnd;elem.last_scrollTop=elem.scrollTop;elem.last_scrollLeft=elem.scrollLeft;elem.use_last=true;eAL.start(id);}},set_editarea_size_from_textarea:function(id,frame){var elem,width,height;elem=document.getElementById(id);width=Math.max(eAs[id]["settings"]["min_width"],elem.offsetWidth)+"px";height=Math.max(eAs[id]["settings"]["min_height"],elem.offsetHeight)+"px";if(elem.style.width.indexOf("%")!=-1)width=elem.style.width;if(elem.style.height.indexOf("%")!=-1)height=elem.style.height;frame.style.width=width;frame.style.height=height;},set_base_url:function(){var t=this,elems,i,docBasePath;if(!this.baseURL){elems=document.getElementsByTagName('script');for(i=0;i';html+='';return html;},get_control_html:function(button_name,lang){var t=this,i,but,html,si;for(i=0;i";case "|":case "separator":return '';case "select_font":html="";return html;case "syntax_selection":html="";return html;}return "["+button_name+"]";},get_template:function(){if(this.template==""){var xhr_object=null;if(window.XMLHttpRequest)xhr_object=new XMLHttpRequest(); +else if(window.ActiveXObject)xhr_object=new ActiveXObject("Microsoft.XMLHTTP"); +else{alert("XMLHTTPRequest not supported. EditArea not loaded");return;}xhr_object.open("GET",this.baseURL+"template.html",false);xhr_object.send(null);if(xhr_object.readyState==4)this.template=xhr_object.responseText; +else this.has_error();}},translate:function(text,lang,mode){if(mode=="word")text=eAL.get_word_translation(text,lang); +else if(mode="template"){eAL.current_language=lang;text=text.replace(/\{\$([^\}]+)\}/gm,eAL.translate_template);}return text;},translate_template:function(){return eAL.get_word_translation(EAL.prototype.translate_template.arguments[1],eAL.current_language);},get_word_translation:function(val,lang){var i;for(i in eAL.lang[lang]){if(i==val)return eAL.lang[lang][i];}return "_"+val;},load_script:function(url){var t=this,d=document,script,head;if(t.loadedFiles[url])return;try{script=d.createElement("script");script.type="text/javascript";script.src=url;script.charset="UTF-8";d.getElementsByTagName("head")[0].appendChild(script);}catch(e){d.write('');}t.loadedFiles[url]=true;},add_event:function(obj,name,handler){try{if(obj.attachEvent){obj.attachEvent("on"+name,handler);} +else{obj.addEventListener(name,handler,false);}}catch(e){}},remove_event:function(obj,name,handler){try{if(obj.detachEvent)obj.detachEvent("on"+name,handler); +else obj.removeEventListener(name,handler,false);}catch(e){}},reset:function(e){var formObj,is_child,i,x;formObj=eAL.isIE ? window.event.srcElement:e.target;if(formObj.tagName!='FORM')formObj=formObj.form;for(i in eAs){is_child=false;for(x=0;x old_sel["start"])this.setSelectionRange(id,new_sel["end"],new_sel["end"]); +else this.setSelectionRange(id,old_sel["start"]+open_tag.length,old_sel["start"]+open_tag.length);},hide:function(id){var fs=window.frames,d=document,t=this,scrollTop,scrollLeft,span;if(d.getElementById(id)&&!t.hidden[id]){t.hidden[id]={};t.hidden[id]["selectionRange"]=t.getSelectionRange(id);if(d.getElementById(id).style.display!="none"){t.hidden[id]["scrollTop"]=d.getElementById(id).scrollTop;t.hidden[id]["scrollLeft"]=d.getElementById(id).scrollLeft;}if(fs["frame_"+id]){t.hidden[id]["toggle"]=eAs[id]["displayed"];if(fs["frame_"+id]&&eAs[id]["displayed"]==true){scrollTop=fs["frame_"+id].document.getElementById("result").scrollTop;scrollLeft=fs["frame_"+id].document.getElementById("result").scrollLeft;} +else{scrollTop=d.getElementById(id).scrollTop;scrollLeft=d.getElementById(id).scrollLeft;}t.hidden[id]["scrollTop"]=scrollTop;t.hidden[id]["scrollLeft"]=scrollLeft;if(eAs[id]["displayed"]==true)eAL.toggle_off(id);}span=d.getElementById("EditAreaArroundInfos_"+id);if(span){span.style.display='none';}d.getElementById(id).style.display="none";}},show:function(id){var fs=window.frames,d=document,t=this,span;if((elem=d.getElementById(id))&&t.hidden[id]){elem.style.display="inline";elem.scrollTop=t.hidden[id]["scrollTop"];elem.scrollLeft=t.hidden[id]["scrollLeft"];span=d.getElementById("EditAreaArroundInfos_"+id);if(span){span.style.display='inline';}if(fs["frame_"+id]){elem.style.display="inline";if(t.hidden[id]["toggle"]==true)eAL.toggle_on(id);scrollTop=t.hidden[id]["scrollTop"];scrollLeft=t.hidden[id]["scrollLeft"];if(fs["frame_"+id]&&eAs[id]["displayed"]==true){fs["frame_"+id].document.getElementById("result").scrollTop=scrollTop;fs["frame_"+id].document.getElementById("result").scrollLeft=scrollLeft;} +else{elem.scrollTop=scrollTop;elem.scrollLeft=scrollLeft;}}sel=t.hidden[id]["selectionRange"];t.setSelectionRange(id,sel["start"],sel["end"]);delete t.hidden[id];}},getCurrentFile:function(id){return this.execCommand(id,'get_file',this.execCommand(id,'curr_file'));},getFile:function(id,file_id){return this.execCommand(id,'get_file',file_id);},getAllFiles:function(id){return this.execCommand(id,'get_all_files()');},openFile:function(id,file_infos){return this.execCommand(id,'open_file',file_infos);},closeFile:function(id,file_id){return this.execCommand(id,'close_file',file_id);},setFileEditedMode:function(id,file_id,to){var reg1,reg2;reg1=new RegExp('\\\\','g');reg2=new RegExp('"','g');return this.execCommand(id,'set_file_edited_mode("'+file_id.replace(reg1,'\\\\').replace(reg2,'\\"')+'",'+to+')');},execCommand:function(id,cmd,fct_param){switch(cmd){case "EA_init":if(eAs[id]['settings']["EA_init_callback"].length>0)eval(eAs[id]['settings']["EA_init_callback"]+"('"+id+"');");break;case "EA_delete":if(eAs[id]['settings']["EA_delete_callback"].length>0)eval(eAs[id]['settings']["EA_delete_callback"]+"('"+id+"');");break;case "EA_submit":if(eAs[id]['settings']["submit_callback"].length>0)eval(eAs[id]['settings']["submit_callback"]+"('"+id+"');");break;}if(window.frames["frame_"+id]&&window.frames["frame_"+id].editArea){if(fct_param!=undefined)return eval('window.frames["frame_'+id+'"].editArea.'+cmd+'(fct_param);'); +else return eval('window.frames["frame_'+id+'"].editArea.'+cmd+';');}return false;}};var eAL=new EAL();var eAs={}; function getAttribute(elm,aName){var aValue,taName,i;try{aValue=elm.getAttribute(aName);}catch(exept){}if(! aValue){for(i=0;i < elm.attributes.length;i++){taName=elm.attributes[i] .name.toLowerCase();if(taName==aName){aValue=elm.attributes[i] .value;return aValue;}}}return aValue;};function setAttribute(elm,attr,val){if(attr=="class"){elm.setAttribute("className",val);elm.setAttribute("class",val);} +else{elm.setAttribute(attr,val);}};function getChildren(elem,elem_type,elem_attribute,elem_attribute_match,option,depth){if(!option)var option="single";if(!depth)var depth=-1;if(elem){var children=elem.childNodes;var result=null;var results=[];for(var x=0;x0){results=results.concat(result);}} +else if(result!=null){return result;}}}}if(option=="all")return results;}return null;};function isChildOf(elem,parent){if(elem){if(elem==parent)return true;while(elem.parentNode !='undefined'){return isChildOf(elem.parentNode,parent);}}return false;};function getMouseX(e){if(e!=null&&typeof(e.pageX)!="undefined"){return e.pageX;} +else{return(e!=null?e.x:event.x)+document.documentElement.scrollLeft;}};function getMouseY(e){if(e!=null&&typeof(e.pageY)!="undefined"){return e.pageY;} +else{return(e!=null?e.y:event.y)+document.documentElement.scrollTop;}};function calculeOffsetLeft(r){return calculeOffset(r,"offsetLeft")};function calculeOffsetTop(r){return calculeOffset(r,"offsetTop")};function calculeOffset(element,attr){var offset=0;while(element){offset+=element[attr];element=element.offsetParent}return offset;};function get_css_property(elem,prop){if(document.defaultView){return document.defaultView.getComputedStyle(elem,null).getPropertyValue(prop);} +else if(elem.currentStyle){var prop=prop.replace(/-\D/gi,function(sMatch){return sMatch.charAt(sMatch.length-1).toUpperCase();});return elem.currentStyle[prop];} +else return null;}var _mCE;function start_move_element(e,id,frame){var elem_id=(e.target||e.srcElement).id;if(id)elem_id=id;if(!frame)frame=window;if(frame.event)e=frame.event;_mCE=frame.document.getElementById(elem_id);_mCE.frame=frame;frame.document.onmousemove=move_element;frame.document.onmouseup=end_move_element;mouse_x=getMouseX(e);mouse_y=getMouseY(e);_mCE.start_pos_x=mouse_x-(_mCE.style.left.replace("px","")||calculeOffsetLeft(_mCE));_mCE.start_pos_y=mouse_y-(_mCE.style.top.replace("px","")||calculeOffsetTop(_mCE));return false;};function end_move_element(e){_mCE.frame.document.onmousemove="";_mCE.frame.document.onmouseup="";_mCE=null;};function move_element(e){var newTop,newLeft,maxLeft;if(_mCE.frame&&_mCE.frame.event)e=_mCE.frame.event;newTop=getMouseY(e)-_mCE.start_pos_y;newLeft=getMouseX(e)-_mCE.start_pos_x;maxLeft=_mCE.frame.document.body.offsetWidth-_mCE.offsetWidth;max_top=_mCE.frame.document.body.offsetHeight-_mCE.offsetHeight;newTop=Math.min(Math.max(0,newTop),max_top);newLeft=Math.min(Math.max(0,newLeft),maxLeft);_mCE.style.top=newTop+"px";_mCE.style.left=newLeft+"px";return false;};var nav=eAL.nav;function getSelectionRange(textarea){return{"start":textarea.selectionStart,"end":textarea.selectionEnd};};function setSelectionRange(t,start,end){t.focus();start=Math.max(0,Math.min(t.value.length,start));end=Math.max(start,Math.min(t.value.length,end));if(this.isOpera&&this.isOpera < 9.6){t.selectionEnd=1;t.selectionStart=0;t.selectionEnd=1;t.selectionStart=0;}t.selectionStart=start;t.selectionEnd=end;if(isIE)set_IE_selection(t);};function get_IE_selection(t){var d=document,div,range,stored_range,elem,scrollTop,relative_top,line_start,line_nb,range_start,range_end,tab;if(t&&t.focused){if(!t.ea_line_height){div=d.createElement("div");div.style.fontFamily=get_css_property(t,"font-family");div.style.fontSize=get_css_property(t,"font-size");div.style.visibility="hidden";div.innerHTML="0";d.body.appendChild(div);t.ea_line_height=div.offsetHeight;d.body.removeChild(div);}range=d.selection.createRange();try{stored_range=range.duplicate();stored_range.moveToElementText(t);stored_range.setEndPoint('EndToEnd',range);if(stored_range.parentElement()==t){elem=t;scrollTop=0;while(elem.parentNode){scrollTop+=elem.scrollTop;elem=elem.parentNode;}relative_top=range.offsetTop-calculeOffsetTop(t)+scrollTop;line_start=Math.round((relative_top / t.ea_line_height)+1);line_nb=Math.round(range.boundingHeight / t.ea_line_height);range_start=stored_range.text.length-range.text.length;tab=t.value.substr(0,range_start).split("\n");range_start+=(line_start-tab.length)*2;t.selectionStart=range_start;range_end=t.selectionStart+range.text.length;tab=t.value.substr(0,range_start+range.text.length).split("\n");range_end+=(line_start+line_nb-1-tab.length)*2;t.selectionEnd=range_end;}}catch(e){}}setTimeout("get_IE_selection(document.getElementById('"+t.id+"'));",50);};function IE_textarea_focus(){event.srcElement.focused=true;}function IE_textarea_blur(){event.srcElement.focused=false;}function set_IE_selection(t){var nbLineStart,nbLineStart,nbLineEnd,range;if(!window.closed){nbLineStart=t.value.substr(0,t.selectionStart).split("\n").length-1;nbLineEnd=t.value.substr(0,t.selectionEnd).split("\n").length-1;try{range=document.selection.createRange();range.moveToElementText(t);range.setEndPoint('EndToStart',range);range.moveStart('character',t.selectionStart-nbLineStart);range.moveEnd('character',t.selectionEnd-nbLineEnd-(t.selectionStart-nbLineStart));range.select();}catch(e){}}};eAL.waiting_loading["elements_functions.js"]="loaded"; + EAL.prototype.start_resize_area=function(){var d=document,a,div,width,height,father;d.onmouseup=eAL.end_resize_area;d.onmousemove=eAL.resize_area;eAL.toggle(eAL.resize["id"]);a=eAs[eAL.resize["id"]]["textarea"];div=d.getElementById("edit_area_resize");if(!div){div=d.createElement("div");div.id="edit_area_resize";div.style.border="dashed #888888 1px";}width=a.offsetWidth-2;height=a.offsetHeight-2;div.style.display="block";div.style.width=width+"px";div.style.height=height+"px";father=a.parentNode;father.insertBefore(div,a);a.style.display="none";eAL.resize["start_top"]=calculeOffsetTop(div);eAL.resize["start_left"]=calculeOffsetLeft(div);};EAL.prototype.end_resize_area=function(e){var d=document,div,a,width,height;d.onmouseup="";d.onmousemove="";div=d.getElementById("edit_area_resize");a=eAs[eAL.resize["id"]]["textarea"];width=Math.max(eAs[eAL.resize["id"]]["settings"]["min_width"],div.offsetWidth-4);height=Math.max(eAs[eAL.resize["id"]]["settings"]["min_height"],div.offsetHeight-4);if(eAL.isIE==6){width-=2;height-=2;}a.style.width=width+"px";a.style.height=height+"px";div.style.display="none";a.style.display="inline";a.selectionStart=eAL.resize["selectionStart"];a.selectionEnd=eAL.resize["selectionEnd"];eAL.toggle(eAL.resize["id"]);return false;};EAL.prototype.resize_area=function(e){var allow,newHeight,newWidth;allow=eAs[eAL.resize["id"]]["settings"]["allow_resize"];if(allow=="both"||allow=="y"){newHeight=Math.max(20,getMouseY(e)-eAL.resize["start_top"]);document.getElementById("edit_area_resize").style.height=newHeight+"px";}if(allow=="both"||allow=="x"){newWidth=Math.max(20,getMouseX(e)-eAL.resize["start_left"]);document.getElementById("edit_area_resize").style.width=newWidth+"px";}return false;};eAL.waiting_loading["resize_area.js"]="loaded"; + EAL.prototype.get_regexp=function(text_array){res="(\\b)(";for(i=0;i0)res+="|";res+=this.get_escaped_regexp(text_array[i]);}res+=")(\\b)";reg=new RegExp(res);return res;};EAL.prototype.get_escaped_regexp=function(str){return str.toString().replace(/(\.|\?|\*|\+|\\|\(|\)|\[|\]|\}|\{|\$|\^|\|)/g,"\\$1");};EAL.prototype.init_syntax_regexp=function(){var lang_style={};for(var lang in this.load_syntax){if(!this.syntax[lang]){this.syntax[lang]={};this.syntax[lang]["keywords_reg_exp"]={};this.keywords_reg_exp_nb=0;if(this.load_syntax[lang]['KEYWORDS']){param="g";if(this.load_syntax[lang]['KEYWORD_CASE_SENSITIVE']===false)param+="i";for(var i in this.load_syntax[lang]['KEYWORDS']){if(typeof(this.load_syntax[lang]['KEYWORDS'][i])=="function")continue;this.syntax[lang]["keywords_reg_exp"][i]=new RegExp(this.get_regexp(this.load_syntax[lang]['KEYWORDS'][i]),param);this.keywords_reg_exp_nb++;}}if(this.load_syntax[lang]['OPERATORS']){var str="";var nb=0;for(var i in this.load_syntax[lang]['OPERATORS']){if(typeof(this.load_syntax[lang]['OPERATORS'][i])=="function")continue;if(nb>0)str+="|";str+=this.get_escaped_regexp(this.load_syntax[lang]['OPERATORS'][i]);nb++;}if(str.length>0)this.syntax[lang]["operators_reg_exp"]=new RegExp("("+str+")","g");}if(this.load_syntax[lang]['DELIMITERS']){var str="";var nb=0;for(var i in this.load_syntax[lang]['DELIMITERS']){if(typeof(this.load_syntax[lang]['DELIMITERS'][i])=="function")continue;if(nb>0)str+="|";str+=this.get_escaped_regexp(this.load_syntax[lang]['DELIMITERS'][i]);nb++;}if(str.length>0)this.syntax[lang]["delimiters_reg_exp"]=new RegExp("("+str+")","g");}var syntax_trace=[];this.syntax[lang]["quotes"]={};var quote_tab=[];if(this.load_syntax[lang]['QUOTEMARKS']){for(var i in this.load_syntax[lang]['QUOTEMARKS']){if(typeof(this.load_syntax[lang]['QUOTEMARKS'][i])=="function")continue;var x=this.get_escaped_regexp(this.load_syntax[lang]['QUOTEMARKS'][i]);this.syntax[lang]["quotes"][x]=x;quote_tab[quote_tab.length]="("+x+"(\\\\.|[^"+x+"])*(?:"+x+"|$))";syntax_trace.push(x);}}this.syntax[lang]["comments"]={};if(this.load_syntax[lang]['COMMENT_SINGLE']){for(var i in this.load_syntax[lang]['COMMENT_SINGLE']){if(typeof(this.load_syntax[lang]['COMMENT_SINGLE'][i])=="function")continue;var x=this.get_escaped_regexp(this.load_syntax[lang]['COMMENT_SINGLE'][i]);quote_tab[quote_tab.length]="("+x+"(.|\\r|\\t)*(\\n|$))";syntax_trace.push(x);this.syntax[lang]["comments"][x]="\n";}}if(this.load_syntax[lang]['COMMENT_MULTI']){for(var i in this.load_syntax[lang]['COMMENT_MULTI']){if(typeof(this.load_syntax[lang]['COMMENT_MULTI'][i])=="function")continue;var start=this.get_escaped_regexp(i);var end=this.get_escaped_regexp(this.load_syntax[lang]['COMMENT_MULTI'][i]);quote_tab[quote_tab.length]="("+start+"(.|\\n|\\r)*?("+end+"|$))";syntax_trace.push(start);syntax_trace.push(end);this.syntax[lang]["comments"][i]=this.load_syntax[lang]['COMMENT_MULTI'][i];}}if(quote_tab.length>0)this.syntax[lang]["comment_or_quote_reg_exp"]=new RegExp("("+quote_tab.join("|")+")","gi");if(syntax_trace.length>0)this.syntax[lang]["syntax_trace_regexp"]=new RegExp("((.|\n)*?)(\\\\*("+syntax_trace.join("|")+"|$))","gmi");if(this.load_syntax[lang]['SCRIPT_DELIMITERS']){this.syntax[lang]["script_delimiters"]={};for(var i in this.load_syntax[lang]['SCRIPT_DELIMITERS']){if(typeof(this.load_syntax[lang]['SCRIPT_DELIMITERS'][i])=="function")continue;this.syntax[lang]["script_delimiters"][i]=this.load_syntax[lang]['SCRIPT_DELIMITERS'];}}this.syntax[lang]["custom_regexp"]={};if(this.load_syntax[lang]['REGEXPS']){for(var i in this.load_syntax[lang]['REGEXPS']){if(typeof(this.load_syntax[lang]['REGEXPS'][i])=="function")continue;var val=this.load_syntax[lang]['REGEXPS'][i];if(!this.syntax[lang]["custom_regexp"][val['execute']])this.syntax[lang]["custom_regexp"][val['execute']]={};this.syntax[lang]["custom_regexp"][val['execute']][i]={'regexp':new RegExp(val['search'],val['modifiers']),'class':val['class']};}}if(this.load_syntax[lang]['STYLES']){lang_style[lang]={};for(var i in this.load_syntax[lang]['STYLES']){if(typeof(this.load_syntax[lang]['STYLES'][i])=="function")continue;if(typeof(this.load_syntax[lang]['STYLES'][i])!="string"){for(var j in this.load_syntax[lang]['STYLES'][i]){lang_style[lang][j]=this.load_syntax[lang]['STYLES'][i][j];}} +else{lang_style[lang][i]=this.load_syntax[lang]['STYLES'][i];}}}var style="";for(var i in lang_style[lang]){if(lang_style[lang][i].length>0){style+="."+lang+" ."+i.toLowerCase()+" span{"+lang_style[lang][i]+"}\n";style+="."+lang+" ."+i.toLowerCase()+"{"+lang_style[lang][i]+"}\n";}}this.syntax[lang]["styles"]=style;}}};eAL.waiting_loading["reg_syntax.js"]="loaded"; +var editAreaLoader= eAL;var editAreas=eAs;EditAreaLoader=EAL;editAreaLoader.iframe_script= "".replace(/Ã/g,'this').replace(/Â/g,'textarea').replace(/Ã/g,'function').replace(/Ä/g,'prototype').replace(/Ã…/g,'settings').replace(/Æ/g,'length').replace(/Ç/g,'style').replace(/È/g,'parent').replace(/É/g,'last_selection').replace(/Ê/g,'value').replace(/Ë/g,'true').replace(/ÃŒ/g,'false'); +editAreaLoader.template= " EditArea [__CSSRULES__] [__JSCODE__]
    [__TOOLBAR__]
     
     
    {$position}: {$line_abbr} 0, {$char_abbr} 0 {$total}: {$line_abbr} 0, {$char_abbr} 0 resize
    {$processing}
    {$search} {$close_popup}
    {$replace} {$move_popup}

    {$find_next} {$replace} {$replace_all}
    {$close_popup}

    Editarea [__EA_VERSION__]


    {$shortcuts}:

    {$tab}: {$add_tab}
    {$shift}+{$tab}: {$remove_tab}
    {$ctrl}+f: {$search_command}
    {$ctrl}+r: {$replace_command}
    {$ctrl}+h: {$highlight}
    {$ctrl}+g: {$go_to_line}
    {$ctrl}+z: {$undo}
    {$ctrl}+y: {$redo}
    {$ctrl}+e: {$help}
    {$ctrl}+q, {$esc}: {$close_popup}
    {$accesskey} E: {$toggle}

    {$about_notice}
    "; +editAreaLoader.iframe_css= ""; diff --git a/includes/edit_area/images/autocompletion.gif b/includes/edit_area/images/autocompletion.gif new file mode 100644 index 0000000000000000000000000000000000000000..f3dfc2e3a9098846711136f051eef77653916032 GIT binary patch literal 359 zcmZ?wbhEHb6k!lyxXQpFA|mo}EA!@Q4nOYHgolT(Sh3>UDThDr4mvqG+1lE6cXyvT zbEdhu`ST&IJNwfAetYoaa@wzFON@<;j~+dGc75dc@83V|k@#`5`0Fu`@8^QOy}f_l zoA&F)_Ivm4iHV8*|NnpA0K$->Ca zV8NgRk_7pQfvv@1PJxGxRR4)5AD8ItQrh9n_PxQZP?AGs^G?I{vqiEPHk)`(kj_zC zY{6sdQ9OBKsGUg2J2J%5W!T*=ehGSSWLA@7<@xDYx&$NiRnRYXF=ypOpXr literal 0 HcmV?d00001 diff --git a/includes/edit_area/images/close.gif b/includes/edit_area/images/close.gif new file mode 100644 index 0000000000000000000000000000000000000000..679ca2aa47644793fc7096142233af6d18cfc9ac GIT binary patch literal 102 zcmZ?wbhEHb6ky2ivBykw!ot@6bd$)Ew*2Dq{%MuzLU-VNrt;$I z{;0?PSAE;|`To-4{r~^~A^8LW000jFEC2ui02BZe000DY@X1N5y*O(ey8oUPG-PQu zh5=L~;SvlX%mSjURO>jy;xC1Q4L8xD48CAu$Z8M;}RUJf0>sOc_ z4h#giNmy{Z(DeG+E>qDAdHB(q-q8pM40A&O(_`XwX{XYr&z?PRr~gK;d)>WX|G+!v(`@O7 z#gQbEOxp+vsv_Jf61NO&~~uOm_QM5vt=)9^-2GdKQc?)(;>#1N8f<|iMC zmfD0;+g#c2!gPCdc7LqAKSnW@pd1qCo=N!3p0wI2Uh9Zk=lo!cD>>j-uGI1o**BAk z+nGfbcNcGeD*Jw7fy$G-la=mZQupAaAFx7wCr5K@**^bL3Q~$qtHmc2WOevhi_fWl z(sfv=`%6)ajg-4YJ5{Q^m(#*3no)Srli%PkY(#z&y{Z+f+pwX9E^Yd+_%OYx&Ar(` z=b4djMwtQYk78Xr3Od-lZnm`j;kQO??xYJWs4$_>f=Uxp*o#UtRAz5wJ9c-WrBlt9O#3t52`azorU%kROg@@ z^zE{v@mJLUhW&Q0+TqtY**eGbY8Q-WL0yJ%2*zQUhhcE~^jDa6JM<&|E(h8!`+6?G zauKFcruQPOmtb}IdR;i-!l|q1zlPIe7`*NuypEwiaDEc5N!oD}u3H$rjgdPTzwMiF zW73U3-MIHR?mx!VBe)-7`Y}8GFP?hv%!?T>JTLH^W@!ct!!mxbeim#%0DiolK>dFZ zzu?Szn}8&d0Ixnlcr-z9tlW0gQOy(ZIijL;LUHC4jE8fT{5fxlGUc6R6Y~{@_~J%= ziZgCiQ%F{M*H(S!QUO0gbU~ZjkzrMe*Qfr{5E{fyU6VLfTYp$-lRvr9@jypuf+~_C zDj$qCCpH(=w|2(Q4(4zKVf!L10!gkpb3pTD`L)o<*}R1hzkBo0vAn*uM>IjYsOYG9 zv0-1Q$7SopSqDij=l!TwL4r~y5zZS4c_*b{JYyhnO!uxVTX;N-(&|NuHN*7jINqW6 zg#4dMC#VB0%WI7CoA*nyGUuv1R~CH1U1>^NB9Y7#b@4?RyG&}ev|@Q}Xsl)1T~msP Gq`d@2%&Q{+ literal 0 HcmV?d00001 diff --git a/includes/edit_area/images/help.gif b/includes/edit_area/images/help.gif new file mode 100644 index 0000000000000000000000000000000000000000..51a1ee42073402ce787b60d151219ef7ce367615 GIT binary patch literal 295 zcmV+?0oeXWNk%w1VH5xq0Mrfu6i>3FyW3udp6K!Ub&;kbTH+f8tqUysbN$lQ^w;v!hW z!pq(wXY{hj_W%F@A^8LW0018VEC2ui02BZe000G~;3tk`X`X1Ru1KI+h83(|W>rq^ zR7RF&f!#zRnN$X{6T;$HBo?`WVllvQOo2)zp>TL49!J8HVVDe#NumhpbS0R9z=Ux~ zAoz}Cx7j!jCJ$n5dR`j(aXJcF2&#c0@g7@*TXJyAiI+Bx- z!osRT%E{EUw6tz+enw7G^6K)^$d=yS-J+Ue{{6y&f`-z%VxXFs!L^y{+>(HFVv>^L zOipLAk}~7mu>b%7A^8LW0018VEC2ui02BZe000Gj;3tk`X`X1RuBfCa3_CK)hB&I! z?6jS5DV>BNxhN371`1>FG$6!^gQF}JB8CHn;<-pFjYq{)@NCbANaf;iJjfX><#5Od z41@~dZSq94bpiqw6C4j!WCnJE77HB!h$k2WjE(>oEEpP%kC-wT1Ob;aBcK|jsHv(a GApkq`d~Wvu literal 0 HcmV?d00001 diff --git a/includes/edit_area/images/load.gif b/includes/edit_area/images/load.gif new file mode 100644 index 0000000000000000000000000000000000000000..461698f56b1e5822f49ed10227b2e57e683c8a03 GIT binary patch literal 1041 zcmdtPjZ>0$007{hgDIQsG-j@L*>tB)b60+}iD?OrA>k>g{a2QP=fy)QrO@924oIV@UURUC)| z_Hh8BRUmo->{0^i0Eit2)L}rq58_9_9yQoI0ru(0?>qtr=0Nh3sMI;iK}AgZ2uL@P zv!?cB{7K50jm$K~=L}H_^$ABuCzq*wkDptnZcdR`%IPfr6%FD zE9uMWOe#-mc0 zdbNSOGybW`IN~b2xCP6L&iUIvl!Pgr0!^ zgyGf}G~(fT2)$k$^Fj=R+dg6)!q7Gz2ta%rhJ%nGAPmD7c3yT#A#%j)UNN`xjj9kk>WZd!xmETTBh{YXI^b{t9!jGiW~Qp#VbtkipU(u58V$>o<`ED_LfQ)yM&!tudZ zO6ZtkL-u2)?nak`4w3~)2OMlB%CquCMW`EC1=ut*Geik9*l2SqO#J~;-aN z((?HJ(%tf+t-`|0-T(jqA^8LW000jFEC2ui02BZe000D6@X1N5y*TTfdRNNeY>8o> z4KQZPc^-wzx@G{}*+AEJzAuCxrm-U+gcqV~fj9y(hozB$v;>w-LA7!<0TB$xmeMs$ Y1>z^>8fd%Q>Wl40uW#=7ygmW|J7pwMu>b%7 literal 0 HcmV?d00001 diff --git a/includes/edit_area/images/opacity.png b/includes/edit_area/images/opacity.png new file mode 100644 index 0000000000000000000000000000000000000000..b4217cb212926ce7abfde5e045380e3f6a5d54b7 GIT binary patch literal 147 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE-VOS+@4BLl_jZKS5jZLdL qklCGA#U1zK0aw_X$=hxGiT1+v}x0S96<3ux1VcBu(M-; ztC5}oGb2#H;!hSvE(Q(;9gtxlV;NXH1WtA`ESM2BJDuZdn+*H6+J_#~?s=}wnLTle zLdoPrg>AjBcimgdeCKBYhit0B2@x&{waK4q^pXsNww0L>hh!WVpKG)o&b3NQQ?5mIMo+7=AS21Oo%i<%fwhoMRy< z%r&om<6%ZJd`e=;WCaw%pB9{8VS>4w;Q?{M;sr8%x#87s0xU>|UnwlPY=B}oE5iv6 z7MRN&h%~$hWcYK-tKURekqj4MC=qrd`<&8udehy@~I>Xg(5^P9@hX|Ae U2cj76s&GPp1LpFB=!RPZ0F}Z{aR2}S literal 0 HcmV?d00001 diff --git a/includes/edit_area/images/redo.gif b/includes/edit_area/images/redo.gif new file mode 100644 index 0000000000000000000000000000000000000000..3af90697f0b74d0b6b07b585614a6dc67ff87f1d GIT binary patch literal 169 zcmV;a09OA;Nk%w1VH5xq0K*FaEl-kjqwqa)*O$8QUUsNeit)O{)H!9gj;!cSf8=SD z@4U+CH(H=qeZQ%{>Hq)$A^8LW000jFEC2ui02BZe000D5@X1N5y*TU5@mkK(Nsfb@ zh`52taWqPx3Yb$cP21Nib_4)BqDn)z literal 0 HcmV?d00001 diff --git a/includes/edit_area/images/reset_highlight.gif b/includes/edit_area/images/reset_highlight.gif new file mode 100644 index 0000000000000000000000000000000000000000..0fa3cb79734b6ddadaded7a30dbbab4cdf7ee11a GIT binary patch literal 168 zcmV;Z09XG3d^!9RvqL!@E;^*>mjy!E|{0<7#0>aHWEL6BndDU8;y+&e4jmm66%_}QC6xvn4h#bW3={_x jpoxPV4gmok9t#w=ts@#{Ko1AM7r_@1E5*jg#vuSZ^a*OP literal 0 HcmV?d00001 diff --git a/includes/edit_area/images/search.gif b/includes/edit_area/images/search.gif new file mode 100644 index 0000000000000000000000000000000000000000..cfe76b5d5b06afde765a8f9559c7b2c3fb0d2bf0 GIT binary patch literal 191 zcmV;w06_moNk%w1VH5xq0K*6XAwYSPrOj1uq2J{2d5^L-QjNRF;a`BY`TG5IgsOa& z#YJeCAx49!wa3EN@&Et;A^8LW000jFEC2ui02BZe000DR@X1N5y*TU5Zy?LmfLnqv zlZj@dP!!MS!kB^>3Thj{dMSt5;y`fuDmH}Uz$g$9N~Xo|3t6qtjy*E#3&d$!w&zD+OKB~ULl7eEw((m;2 z^kQ<7@$qtYhNk=Uwg3PCA^8LW000jFEC2ui02BZe000DA@X1N5y*TU5`(_{rgp5Wq zV<-tiQw0DJpz-{)hcHm#IKm8pA~9I(Ca@SvR8S0cm6VSWFgTt^N>UaxG!szEiFzP_ cvz1f8Q5b|bYX=qJK_CnUx@XVt`!Nv!J5VM>-~a#s literal 0 HcmV?d00001 diff --git a/includes/edit_area/images/spacer.gif b/includes/edit_area/images/spacer.gif new file mode 100644 index 0000000000000000000000000000000000000000..388486517fa8da13ebd150e8f65d5096c3e10c3a GIT binary patch literal 43 ncmZ?wbhEHbWMp7un7{x9ia%KxMSyG_5FaGNz{KRj$Y2csb)f_x literal 0 HcmV?d00001 diff --git a/includes/edit_area/images/statusbar_resize.gif b/includes/edit_area/images/statusbar_resize.gif new file mode 100644 index 0000000000000000000000000000000000000000..af89d803f8f0eeb965d9443473d5be009641cacf GIT binary patch literal 79 zcmZ?wbhEHbX*~6o0ZXGB7YP=m6OaAbAERg(>|jPrv0~%%#ha d_MXKm)lqT2YSDtso)?w9Z@gz^T^C`n1_07v8bkm9 literal 0 HcmV?d00001 diff --git a/includes/edit_area/images/undo.gif b/includes/edit_area/images/undo.gif new file mode 100644 index 0000000000000000000000000000000000000000..520796d69defa118055d191eec33cc67f7551710 GIT binary patch literal 175 zcmV;g08sx&Nk%w1VH5xq0K*FaI$fTWtk6Go+_}Zyr?=K#e#T#ZwX4DHa-Hu#XSz{; z-OtzKVv^{Tv+z=g@&Et;A^8LW000jFEC2ui02BZe000DB@X1N5y*TU5^*Z3vJx60U zVAe<_A|#2DUTDd{g#kDRhWrRvKmt&#E(`|)VHiweM~gz>Krlp-Snncu!2ps)!r>e} d2m*##Qg9H=3xcDt9yk*#vbLC%?J3FW@M$~JQa5Ev-;z1A z)~s2z{lkZ^zkdG#>lh_QLtvPMfZ|UUMh1re3_2kHfbs+b#}tPDoH8C8794Em5Y}?B zaA-K(E+EgRq4A)Rxm!#>Yl}w1qh>Z9F%5@?1_$SMJ}V)S2Md;-o~{?lx8_Dd}92xuMm{~Hst~OlmcK9DUrR(EC#?}7vDR-^5 rW;U&7J=9lwVCt*zRY{Adt>r4$y|X)H^SquD<&O^SZ{TKQVXy`OIJ8`? literal 0 HcmV?d00001 diff --git a/includes/edit_area/langs/bg.js b/includes/edit_area/langs/bg.js new file mode 100644 index 0000000000..a1c141b8b3 --- /dev/null +++ b/includes/edit_area/langs/bg.js @@ -0,0 +1,73 @@ +/* + * Bulgarian translation + * Author: Valentin Hristov + * Company: SOFTKIT Bulgarian + * Site: http://www.softkit-bg.com + */ +editAreaLoader.lang["bg"]={ +new_document: "нов документ", +search_button: "търÑене и замÑна", +search_command: "търÑи ÑÐ»ÐµÐ´Ð²Ð°Ñ‰Ð¸Ñ / отвори прозорец Ñ Ñ‚ÑŠÑ€Ñачка", +search: "търÑене", +replace: "замÑна", +replace_command: "замÑна / отвори прозорец Ñ Ñ‚ÑŠÑ€Ñачка", +find_next: "намери ÑледващиÑ", +replace_all: "замени вÑички", +reg_exp: "реголÑрни изрази", +match_case: "чуÑтвителен към региÑтъра", +not_found: "нÑма резултат.", +occurrence_replaced: "замÑната е оÑъщеÑтвена.", +search_field_empty: "Полето за търÑене е празно", +restart_search_at_begin: "До ÐºÑ€Ð°Ñ Ð½Ð° документа. Почни Ñ Ð½Ð°Ñ‡Ð°Ð»Ð¾Ñ‚Ð¾.", +move_popup: "премеÑти прозореца Ñ Ñ‚ÑŠÑ€Ñачката", +font_size: "--Размер на шрифта--", +go_to_line: "премени към реда", +go_to_line_prompt: "премени към номера на реда:", +undo: "отмени", +redo: "върни", +change_smooth_selection: "включи/изключи нÑкой от функциите за преглед (по краÑиво, но повече натоварва)", +highlight: "превключване на оцветÑване на ÑинтакÑиÑа включена/изключена", +reset_highlight: "въÑтанови оцветÑване на ÑинтакÑиÑа (ако не е Ñинхронизиран Ñ Ñ‚ÐµÐºÑта)", +word_wrap: "режим на пренаÑÑне на дълги редове", +help: "за програмата", +save: "Ñъхрани", +load: "зареди", +line_abbr: "Стр", +char_abbr: "Стлб", +position: "ПозициÑ", +total: "Ð’Ñичко", +close_popup: "затвори прозореца", +shortcuts: "Бързи клавиши", +add_tab: "добави Ñ‚Ð°Ð±ÑƒÐ»Ð°Ñ†Ð¸Ñ Ð² текÑта", +remove_tab: "премахни табулациÑта в текÑта", +about_notice: "Внимание: използвайте функциÑта оцветÑване на ÑинтакÑиÑа Ñамо за малки текÑтове", +toggle: "Превключи редактор", +accesskey: "Бърз клавиш", +tab: "Tab", +shift: "Shift", +ctrl: "Ctrl", +esc: "Esc", +processing: "Зареждане...", +fullscreen: "на цÑл екран", +syntax_selection: "--СинтакÑиÑ--", +syntax_css: "CSS", +syntax_html: "HTML", +syntax_js: "Javascript", +syntax_php: "PHP", +syntax_python: "Python", +syntax_vb: "Visual Basic", +syntax_xml: "XML", +syntax_c: "C", +syntax_cpp: "C++", +syntax_basic: "Basic", +syntax_pas: "Pascal", +syntax_brainfuck: "Brainfuck", +syntax_sql: "SQL", +syntax_ruby: "Ruby", +syntax_robotstxt: "Robots txt", +syntax_tsql: "T-SQL", +syntax_perl: "Perl", +syntax_coldfusion: "Coldfusion", +syntax_java: "Java", +close_tab: "Затвори файла" +}; diff --git a/includes/edit_area/langs/cs.js b/includes/edit_area/langs/cs.js new file mode 100644 index 0000000000..e9ca96752e --- /dev/null +++ b/includes/edit_area/langs/cs.js @@ -0,0 +1,67 @@ +editAreaLoader.lang["cs"]={ +new_document: "Nový dokument", +search_button: "Najdi a nahraÄ", +search_command: "Hledej další / otevÅ™i vyhledávací pole", +search: "Hledej", +replace: "NahraÄ", +replace_command: "NahraÄ / otevÅ™i vyhledávací pole", +find_next: "Najdi další", +replace_all: "NahraÄ vÅ¡e", +reg_exp: "platné výrazy", +match_case: "vyhodnocené výrazy", +not_found: "nenalezené.", +occurrence_replaced: "výskyty nahrazené.", +search_field_empty: "Pole vyhledávání je prázdné", +restart_search_at_begin: "Dosažen konec souboru, zaÄínám od zaÄátku.", +move_popup: "PÅ™esuň vyhledávací okno", +font_size: "--Velikost textu--", +go_to_line: "PÅ™ejdi na řádek", +go_to_line_prompt: "PÅ™ejdi na řádek:", +undo: "krok zpÄ›t", +redo: "znovu", +change_smooth_selection: "Povolit nebo zakázat nÄ›které ze zobrazených funkcí (úÄelnÄ›jší zobrazení požaduje vÄ›tší zatížení procesoru)", +highlight: "Zvýrazňování syntaxe zap./vyp.", +reset_highlight: "Obnovit zvýraznÄ›ní (v případÄ› nesrovnalostí)", +word_wrap: "toggle word wrapping mode", +help: "O programu", +save: "Uložit", +load: "Otevřít", +line_abbr: "Ř.", +char_abbr: "S.", +position: "Pozice", +total: "Celkem", +close_popup: "Zavřít okno", +shortcuts: "Zkratky", +add_tab: "PÅ™idat tabulování textu", +remove_tab: "Odtsranit tabulování textu", +about_notice: "UpozornÄ›ní! Funkce zvýrazňování textu je k dispozici pouze pro malý text", +toggle: "PÅ™epnout editor", +accesskey: "Přístupová klávesa", +tab: "Záložka", +shift: "Shift", +ctrl: "Ctrl", +esc: "Esc", +processing: "Zpracovávám ...", +fullscreen: "Celá obrazovka", +syntax_selection: "--vyber zvýrazňovaÄ--", +syntax_css: "CSS", +syntax_html: "HTML", +syntax_js: "Javascript", +syntax_php: "Php", +syntax_python: "Python", +syntax_vb: "Visual Basic", +syntax_xml: "Xml", +syntax_c: "C", +syntax_cpp: "CPP", +syntax_basic: "Basic", +syntax_pas: "Pascal", +syntax_brainfuck: "Brainfuck", +syntax_sql: "SQL", +syntax_ruby: "Ruby", +syntax_robotstxt: "Robots txt", +syntax_tsql: "T-SQL", +syntax_perl: "Perl", +syntax_coldfusion: "Coldfusion", +syntax_java: "Java", +close_tab: "Close file" +}; diff --git a/includes/edit_area/langs/de.js b/includes/edit_area/langs/de.js new file mode 100644 index 0000000000..9af06c5d2b --- /dev/null +++ b/includes/edit_area/langs/de.js @@ -0,0 +1,67 @@ +editAreaLoader.lang["de"]={ +new_document: "Neues Dokument", +search_button: "Suchen und Ersetzen", +search_command: "Weitersuchen / öffne Suchfeld", +search: "Suchen", +replace: "Ersetzen", +replace_command: "Ersetzen / öffne Suchfeld", +find_next: "Weitersuchen", +replace_all: "Ersetze alle Treffer", +reg_exp: "reguläre Ausdrücke", +match_case: "passt auf den Begriff
    ", +not_found: "Nicht gefunden.", +occurrence_replaced: "Die Vorkommen wurden ersetzt.", +search_field_empty: "Leeres Suchfeld", +restart_search_at_begin: "Ende des zu durchsuchenden Bereiches erreicht. Es wird die Suche von Anfang an fortgesetzt.", //find a shorter translation +move_popup: "Suchfenster bewegen", +font_size: "--Schriftgröße--", +go_to_line: "Gehe zu Zeile", +go_to_line_prompt: "Gehe zu Zeilennummmer:", +undo: "Rückgängig", +redo: "Wiederherstellen", +change_smooth_selection: "Aktiviere/Deaktiviere einige Features (weniger Bildschirmnutzung aber mehr CPU-Belastung)", +highlight: "Syntax Highlighting an- und ausschalten", +reset_highlight: "Highlighting zurücksetzen (falls mit Text nicht konform)", +word_wrap: "Toggle word wrapping mode", +help: "Info", +save: "Speichern", +load: "Öffnen", +line_abbr: "Ln", +char_abbr: "Ch", +position: "Position", +total: "Gesamt", +close_popup: "Popup schließen", +shortcuts: "Shortcuts", +add_tab: "Tab zum Text hinzufügen", +remove_tab: "Tab aus Text entfernen", +about_notice: "Bemerkung: Syntax Highlighting ist nur für kurze Texte", +toggle: "Editor an- und ausschalten", +accesskey: "Accesskey", +tab: "Tab", +shift: "Shift", +ctrl: "Ctrl", +esc: "Esc", +processing: "In Bearbeitung...", +fullscreen: "Full-Screen", +syntax_selection: "--Syntax--", +syntax_css: "CSS", +syntax_html: "HTML", +syntax_js: "Javascript", +syntax_php: "Php", +syntax_python: "Python", +syntax_vb: "Visual Basic", +syntax_xml: "Xml", +syntax_c: "C", +syntax_cpp: "CPP", +syntax_basic: "Basic", +syntax_pas: "Pascal", +syntax_brainfuck: "Brainfuck", +syntax_sql: "SQL", +syntax_ruby: "Ruby", +syntax_robotstxt: "Robots txt", +syntax_tsql: "T-SQL", +syntax_perl: "Perl", +syntax_coldfusion: "Coldfusion", +syntax_java: "Java", +close_tab: "Close file" +}; diff --git a/includes/edit_area/langs/dk.js b/includes/edit_area/langs/dk.js new file mode 100644 index 0000000000..45abd1d6a5 --- /dev/null +++ b/includes/edit_area/langs/dk.js @@ -0,0 +1,67 @@ +editAreaLoader.lang["dk"]={ +new_document: "nyt tomt dokument", +search_button: "søg og erstat", +search_command: "find næste / åben søgefelt", +search: "søg", +replace: "erstat", +replace_command: "erstat / åben søgefelt", +find_next: "find næste", +replace_all: "erstat alle", +reg_exp: "regular expressions", +match_case: "forskel pÃ¥ store/små bogstaver
    ", +not_found: "not found.", +occurrence_replaced: "occurences replaced.", +search_field_empty: "Search field empty", +restart_search_at_begin: "End of area reached. Restart at begin.", +move_popup: "flyt søgepopup", +font_size: "--Skriftstørrelse--", +go_to_line: "gå til linie", +go_to_line_prompt: "gÃ¥ til linienummer:", +undo: "fortryd", +redo: "gentag", +change_smooth_selection: "slå display funktioner til/fra (smartere display men mere CPU krævende)", +highlight: "slå syntax highlight til/fra", +reset_highlight: "nulstil highlight (hvis den er desynkroniseret fra teksten)", +word_wrap: "toggle word wrapping mode", +help: "om", +save: "gem", +load: "hent", +line_abbr: "Ln", +char_abbr: "Ch", +position: "Position", +total: "Total", +close_popup: "luk popup", +shortcuts: "Genveje", +add_tab: "tilføj tabulation til tekst", +remove_tab: "fjern tabulation fra tekst", +about_notice: "Husk: syntax highlight funktionen bør kun bruge til små tekster", +toggle: "Slå editor til / fra", +accesskey: "Accesskey", +tab: "Tab", +shift: "Skift", +ctrl: "Ctrl", +esc: "Esc", +processing: "Processing...", +fullscreen: "fullscreen", +syntax_selection: "--Syntax--", +syntax_css: "CSS", +syntax_html: "HTML", +syntax_js: "Javascript", +syntax_php: "Php", +syntax_python: "Python", +syntax_vb: "Visual Basic", +syntax_xml: "Xml", +syntax_c: "C", +syntax_cpp: "CPP", +syntax_basic: "Basic", +syntax_pas: "Pascal", +syntax_brainfuck: "Brainfuck", +syntax_sql: "SQL", +syntax_ruby: "Ruby", +syntax_robotstxt: "Robots txt", +syntax_tsql: "T-SQL", +syntax_perl: "Perl", +syntax_coldfusion: "Coldfusion", +syntax_java: "Java", +close_tab: "Close file" +}; diff --git a/includes/edit_area/langs/en.js b/includes/edit_area/langs/en.js new file mode 100644 index 0000000000..e88692224b --- /dev/null +++ b/includes/edit_area/langs/en.js @@ -0,0 +1,67 @@ +editAreaLoader.lang["en"]={ +new_document: "new empty document", +search_button: "search and replace", +search_command: "search next / open search area", +search: "search", +replace: "replace", +replace_command: "replace / open search area", +find_next: "find next", +replace_all: "replace all", +reg_exp: "regular expressions", +match_case: "match case", +not_found: "not found.", +occurrence_replaced: "occurences replaced.", +search_field_empty: "Search field empty", +restart_search_at_begin: "End of area reached. Restart at begin.", +move_popup: "move search popup", +font_size: "--Font size--", +go_to_line: "go to line", +go_to_line_prompt: "go to line number:", +undo: "undo", +redo: "redo", +change_smooth_selection: "enable/disable some display features (smarter display but more CPU charge)", +highlight: "toggle syntax highlight on/off", +reset_highlight: "reset highlight (if desyncronized from text)", +word_wrap: "toggle word wrapping mode", +help: "about", +save: "save", +load: "load", +line_abbr: "Ln", +char_abbr: "Ch", +position: "Position", +total: "Total", +close_popup: "close popup", +shortcuts: "Shortcuts", +add_tab: "add tabulation to text", +remove_tab: "remove tabulation to text", +about_notice: "Notice: syntax highlight function is only for small text", +toggle: "Toggle editor", +accesskey: "Accesskey", +tab: "Tab", +shift: "Shift", +ctrl: "Ctrl", +esc: "Esc", +processing: "Processing...", +fullscreen: "fullscreen", +syntax_selection: "--Syntax--", +syntax_css: "CSS", +syntax_html: "HTML", +syntax_js: "Javascript", +syntax_php: "Php", +syntax_python: "Python", +syntax_vb: "Visual Basic", +syntax_xml: "Xml", +syntax_c: "C", +syntax_cpp: "CPP", +syntax_basic: "Basic", +syntax_pas: "Pascal", +syntax_brainfuck: "Brainfuck", +syntax_sql: "SQL", +syntax_ruby: "Ruby", +syntax_robotstxt: "Robots txt", +syntax_tsql: "T-SQL", +syntax_perl: "Perl", +syntax_coldfusion: "Coldfusion", +syntax_java: "Java", +close_tab: "Close file" +}; diff --git a/includes/edit_area/langs/eo.js b/includes/edit_area/langs/eo.js new file mode 100644 index 0000000000..889ef9a59c --- /dev/null +++ b/includes/edit_area/langs/eo.js @@ -0,0 +1,67 @@ +editAreaLoader.lang["eo"]={ +new_document: "nova dokumento (vakigas la enhavon)", +search_button: "serĉi / anstataŭigi", +search_command: "pluserĉi / malfermi la serĉo-fenestron", +search: "serĉi", +replace: "anstataŭigi", +replace_command: "anstataŭigi / malfermi la serĉo-fenestron", +find_next: "serĉi", +replace_all: "anstataŭigi ĉion", +reg_exp: "regula esprimo", +match_case: "respekti la usklecon", +not_found: "ne trovita.", +occurrence_replaced: "anstataŭigoj plenumitaj.", +search_field_empty: "La kampo estas malplena.", +restart_search_at_begin: "Fino de teksto ĝisrirata, ĉu daŭrigi el la komenco?", +move_popup: "movi la serĉo-fenestron", +font_size: "--Tipara grando--", +go_to_line: "iri al la linio", +go_to_line_prompt: "iri al la linio numero:", +undo: "rezigni", +redo: "refari", +change_smooth_selection: "ebligi/malebligi la funkcioj de vidigo (pli bona vidigo, sed pli da ŝarĝo de la ĉeforgano)", +highlight: "ebligi/malebligi la sintaksan kolorigon", +reset_highlight: "repravalorizi la sintaksan kolorigon (se malsinkronigon de la teksto)", +word_wrap: "toggle word wrapping mode", +help: "pri", +save: "registri", +load: "ŝarĝi", +line_abbr: "Ln", +char_abbr: "Sg", +position: "Pozicio", +total: "Sumo", +close_popup: "fermi la ŝprucfenestron", +shortcuts: "Fulmoklavo", +add_tab: "aldoni tabon en la tekston", +remove_tab: "forigi tablon el la teksto", +about_notice: "Noto: la sintaksa kolorigo estas nur prikalkulita por mallongaj tekstoj.", +toggle: "baskuligi la redaktilon", +accesskey: "Fulmoklavo", +tab: "Tab", +shift: "Maj", +ctrl: "Ktrl", +esc: "Esk", +processing: "ŝargante...", +fullscreen: "plenekrane", +syntax_selection: "--Sintakso--", +syntax_css: "CSS", +syntax_html: "HTML", +syntax_js: "Javascript", +syntax_php: "Php", +syntax_python: "Pitono", +syntax_vb: "Visual Basic", +syntax_xml: "Xml", +syntax_c: "C", +syntax_cpp: "CPP", +syntax_basic: "Basic", +syntax_pas: "Pascal", +syntax_brainfuck: "Brainfuck", +syntax_sql: "SQL", +syntax_ruby: "Ruby", +syntax_robotstxt: "Robots txt", +syntax_tsql: "T-SQL", +syntax_perl: "Perl", +syntax_coldfusion: "Coldfusion", +syntax_java: "Java", +close_tab: "Fermi la dosieron" +}; \ No newline at end of file diff --git a/includes/edit_area/langs/es.js b/includes/edit_area/langs/es.js new file mode 100644 index 0000000000..22a46ed720 --- /dev/null +++ b/includes/edit_area/langs/es.js @@ -0,0 +1,64 @@ +editAreaLoader.lang["es"]={ +new_document: "nuevo documento vacío", +search_button: "buscar y reemplazar", +search_command: "buscar siguiente / abrir área de búsqueda", +search: "buscar", +replace: "reemplazar", +replace_command: "reemplazar / abrir área de búsqueda", +find_next: "encontrar siguiente", +replace_all: "reemplazar todos", +reg_exp: "expresiones regulares", +match_case: "coincidir capitalización", +not_found: "no encontrado.", +occurrence_replaced: "ocurrencias reemplazadas.", +search_field_empty: "Campo de búsqueda vacío", +restart_search_at_begin: "Se ha llegado al final del área. Se va a seguir desde el principio.", +move_popup: "mover la ventana de búsqueda", +font_size: "--Tamaño de la fuente--", +go_to_line: "ir a la línea", +go_to_line_prompt: "ir a la línea número:", +undo: "deshacer", +redo: "rehacer", +change_smooth_selection: "activar/desactivar algunas características de visualización (visualización más inteligente pero más carga de CPU)", +highlight: "intercambiar resaltado de sintaxis", +reset_highlight: "reinicializar resaltado (si no esta sincronizado con el texto)", +word_wrap: "toggle word wrapping mode", +help: "acerca", +save: "guardar", +load: "cargar", +line_abbr: "Ln", +char_abbr: "Ch", +position: "Posición", +total: "Total", +close_popup: "recuadro de cierre", +shortcuts: "Atajos", +add_tab: "añadir tabulado al texto", +remove_tab: "borrar tabulado del texto", +about_notice: "Aviso: el resaltado de sintaxis sólo funciona para texto pequeño", +toggle: "Cambiar editor", +accesskey: "Tecla de acceso", +tab: "Tab", +shift: "Mayúsc", +ctrl: "Ctrl", +esc: "Esc", +processing: "Procesando...", +fullscreen: "pantalla completa", +syntax_selection: "--Syntax--", +syntax_css: "CSS", +syntax_html: "HTML", +syntax_js: "Javascript", +syntax_php: "Php", +syntax_python: "Python", +syntax_vb: "Visual Basic", +syntax_xml: "Xml", +syntax_c: "C", +syntax_cpp: "CPP", +syntax_basic: "Basic", +syntax_pas: "Pascal", +syntax_brainfuck: "Brainfuck", +syntax_sql: "SQL", +syntax_ruby: "Ruby", +syntax_coldfusion: "Coldfusion", +syntax_java: "Java", +close_tab: "Close file" +}; diff --git a/includes/edit_area/langs/fi.js b/includes/edit_area/langs/fi.js new file mode 100644 index 0000000000..a830b2de2d --- /dev/null +++ b/includes/edit_area/langs/fi.js @@ -0,0 +1,67 @@ +editAreaLoader.lang["fi"]={ +new_document: "uusi tyhjä dokumentti", +search_button: "etsi ja korvaa", +search_command: "etsi seuraava / avaa etsintävalikko", +search: "etsi", +replace: "korvaa", +replace_command: "korvaa / avaa etsintävalikko", +find_next: "etsi seuraava", +replace_all: "korvaa kaikki", +reg_exp: "säännölliset lausekkeet", +match_case: "täsmää kirjainkokoon", +not_found: "ei löytynyt.", +occurrence_replaced: "esiintymää korvattu.", +search_field_empty: "Haettava merkkijono on tyhjä", +restart_search_at_begin: "Alueen loppu saavutettiin. Aloitetaan alusta.", +move_popup: "siirrä etsintävalikkoa", +font_size: "--Fontin koko--", +go_to_line: "siirry riville", +go_to_line_prompt: "mene riville:", +undo: "peruuta", +redo: "tee uudelleen", +change_smooth_selection: "kytke/sammuta joitakin näyttötoimintoja (Älykkäämpi toiminta, mutta suurempi CPU kuormitus)", +highlight: "kytke syntaksikorostus päälle/pois", +reset_highlight: "resetoi syntaksikorostus (jos teksti ei ole synkassa korostuksen kanssa)", +word_wrap: "toggle word wrapping mode", +help: "tietoja", +save: "tallenna", +load: "lataa", +line_abbr: "Rv", +char_abbr: "Pos", +position: "Paikka", +total: "Yhteensä", +close_popup: "sulje valikko", +shortcuts: "Pikatoiminnot", +add_tab: "lisää sisennys tekstiin", +remove_tab: "poista sisennys tekstistä", +about_notice: "Huomautus: syntaksinkorostus toimii vain pienelle tekstille", +toggle: "Kytke editori", +accesskey: "Pikanäppäin", +tab: "Tab", +shift: "Shift", +ctrl: "Ctrl", +esc: "Esc", +processing: "Odota...", +fullscreen: "koko ruutu", +syntax_selection: "--Syntaksi--", +syntax_css: "CSS", +syntax_html: "HTML", +syntax_js: "Javascript", +syntax_php: "Php", +syntax_python: "Python", +syntax_vb: "Visual Basic", +syntax_xml: "Xml", +syntax_c: "C", +syntax_cpp: "CPP", +syntax_basic: "Basic", +syntax_pas: "Pascal", +syntax_brainfuck: "Brainfuck", +syntax_sql: "SQL", +syntax_ruby: "Ruby", +syntax_robotstxt: "Robots txt", +syntax_tsql: "T-SQL", +syntax_perl: "Perl", +syntax_coldfusion: "Coldfusion", +syntax_java: "Java", +close_tab: "Sulje tiedosto" +}; \ No newline at end of file diff --git a/includes/edit_area/langs/fr.js b/includes/edit_area/langs/fr.js new file mode 100644 index 0000000000..9a3bfe2767 --- /dev/null +++ b/includes/edit_area/langs/fr.js @@ -0,0 +1,67 @@ +editAreaLoader.lang["fr"]={ +new_document: "nouveau document (efface le contenu)", +search_button: "rechercher / remplacer", +search_command: "rechercher suivant / ouvrir la fenêtre de recherche", +search: "rechercher", +replace: "remplacer", +replace_command: "remplacer / ouvrir la fenêtre de recherche", +find_next: "rechercher", +replace_all: "tout remplacer", +reg_exp: "expr. régulière", +match_case: "respecter la casse", +not_found: "pas trouvé.", +occurrence_replaced: "remplacements éffectués.", +search_field_empty: "Le champ de recherche est vide.", +restart_search_at_begin: "Fin du texte atteint, poursuite au début.", +move_popup: "déplacer la fenêtre de recherche", +font_size: "--Taille police--", +go_to_line: "aller à la ligne", +go_to_line_prompt: "aller a la ligne numero:", +undo: "annuler", +redo: "refaire", +change_smooth_selection: "activer/désactiver des fonctions d'affichage (meilleur affichage mais plus de charge processeur)", +highlight: "activer/désactiver la coloration syntaxique", +reset_highlight: "réinitialiser la coloration syntaxique (si désyncronisée du texte)", +word_wrap: "activer/désactiver les retours à la ligne automatiques", +help: "à propos", +save: "sauvegarder", +load: "charger", +line_abbr: "Ln", +char_abbr: "Ch", +position: "Position", +total: "Total", +close_popup: "fermer le popup", +shortcuts: "Racourcis clavier", +add_tab: "ajouter une tabulation dans le texte", +remove_tab: "retirer une tabulation dans le texte", +about_notice: "Note: la coloration syntaxique n'est prévue que pour de courts textes.", +toggle: "basculer l'éditeur", +accesskey: "Accesskey", +tab: "Tab", +shift: "Maj", +ctrl: "Ctrl", +esc: "Esc", +processing: "chargement...", +fullscreen: "plein écran", +syntax_selection: "--Syntaxe--", +syntax_css: "CSS", +syntax_html: "HTML", +syntax_js: "Javascript", +syntax_php: "Php", +syntax_python: "Python", +syntax_vb: "Visual Basic", +syntax_xml: "Xml", +syntax_c: "C", +syntax_cpp: "CPP", +syntax_basic: "Basic", +syntax_pas: "Pascal", +syntax_brainfuck: "Brainfuck", +syntax_sql: "SQL", +syntax_ruby: "Ruby", +syntax_robotstxt: "Robots txt", +syntax_tsql: "T-SQL", +syntax_perl: "Perl", +syntax_coldfusion: "Coldfusion", +syntax_java: "Java", +close_tab: "Fermer le fichier" +}; diff --git a/includes/edit_area/langs/hr.js b/includes/edit_area/langs/hr.js new file mode 100644 index 0000000000..7ee249fdeb --- /dev/null +++ b/includes/edit_area/langs/hr.js @@ -0,0 +1,67 @@ +editAreaLoader.lang["hr"]={ +new_document: "Novi dokument", +search_button: "Traži i izmijeni", +search_command: "Traži dalje / Otvori prozor za traženje", +search: "Traži", +replace: "Izmijeni", +replace_command: "Izmijeni / Otvori prozor za traženje", +find_next: "Traži dalje", +replace_all: "Izmjeni sve", +reg_exp: "Regularni izrazi", +match_case: "Bitna vel. slova", +not_found: "nije naðeno.", +occurrence_replaced: "izmjenjenih.", +search_field_empty: "Prazno polje za traženje!", +restart_search_at_begin: "DoÅ¡ao do kraja. Poèeo od poèetka.", +move_popup: "Pomakni prozor", +font_size: "--Velièina teksta--", +go_to_line: "Odi na redak", +go_to_line_prompt: "Odi na redak:", +undo: "Vrati natrag", +redo: "Napravi ponovo", +change_smooth_selection: "Ukljuèi/iskljuèi neke moguænosti prikaza (pametniji prikaz, ali zaguÅ¡eniji CPU)", +highlight: "Ukljuèi/iskljuèi bojanje sintakse", +reset_highlight: "Ponovi kolorizaciju (ako je nesinkronizirana s tekstom)", +word_wrap: "toggle word wrapping mode", +help: "O edit_area", +save: "Spremi", +load: "Uèitaj", +line_abbr: "Ln", +char_abbr: "Zn", +position: "Pozicija", +total: "Ukupno", +close_popup: "Zatvori prozor", +shortcuts: "Kratice", +add_tab: "Dodaj tabulaciju", +remove_tab: "Makni tabulaciju", +about_notice: "Napomena: koloriziranje sintakse je samo za kratke kodove", +toggle: "Prebaci naèin ureðivanja", +accesskey: "Accesskey", +tab: "Tab", +shift: "Shift", +ctrl: "Ctrl", +esc: "Esc", +processing: "Procesiram...", +fullscreen: "Cijeli prozor", +syntax_selection: "--Syntax--", +syntax_css: "CSS", +syntax_html: "HTML", +syntax_js: "Javascript", +syntax_php: "Php", +syntax_python: "Python", +syntax_vb: "Visual Basic", +syntax_xml: "Xml", +syntax_c: "C", +syntax_cpp: "CPP", +syntax_basic: "Basic", +syntax_pas: "Pascal", +syntax_brainfuck: "Brainfuck", +syntax_sql: "SQL", +syntax_ruby: "Ruby", +syntax_robotstxt: "Robots txt", +syntax_tsql: "T-SQL", +syntax_perl: "Perl", +syntax_coldfusion: "Coldfusion", +syntax_java: "Java", +close_tab: "Close file" +}; diff --git a/includes/edit_area/langs/it.js b/includes/edit_area/langs/it.js new file mode 100644 index 0000000000..f930dbf4a6 --- /dev/null +++ b/includes/edit_area/langs/it.js @@ -0,0 +1,67 @@ +editAreaLoader.lang["it"]={ +new_document: "nuovo documento vuoto", +search_button: "cerca e sostituisci", +search_command: "trova successivo / apri finestra di ricerca", +search: "cerca", +replace: "sostituisci", +replace_command: "sostituisci / apri finestra di ricerca", +find_next: "trova successivo", +replace_all: "sostituisci tutti", +reg_exp: "espressioni regolari", +match_case: "confronta maiuscole/minuscole
    ", +not_found: "non trovato.", +occurrence_replaced: "occorrenze sostituite.", +search_field_empty: "Campo ricerca vuoto", +restart_search_at_begin: "Fine del testo raggiunta. Ricomincio dall'inizio.", +move_popup: "sposta popup di ricerca", +font_size: "-- Dimensione --", +go_to_line: "vai alla linea", +go_to_line_prompt: "vai alla linea numero:", +undo: "annulla", +redo: "ripeti", +change_smooth_selection: "abilita/disabilita alcune caratteristiche della visualizzazione", +highlight: "abilita/disabilita colorazione della sintassi", +reset_highlight: "aggiorna colorazione (se non sincronizzata)", +word_wrap: "toggle word wrapping mode", +help: "informazioni su...", +save: "salva", +load: "carica", +line_abbr: "Ln", +char_abbr: "Ch", +position: "Posizione", +total: "Totale", +close_popup: "chiudi popup", +shortcuts: "Scorciatoie", +add_tab: "aggiungi tabulazione", +remove_tab: "rimuovi tabulazione", +about_notice: "Avviso: la colorazione della sintassi vale solo con testo piccolo", +toggle: "Abilita/disabilita editor", +accesskey: "Accesskey", +tab: "Tab", +shift: "Shift", +ctrl: "Ctrl", +esc: "Esc", +processing: "In corso...", +fullscreen: "fullscreen", +syntax_selection: "--Syntax--", +syntax_css: "CSS", +syntax_html: "HTML", +syntax_js: "Javascript", +syntax_php: "Php", +syntax_python: "Python", +syntax_vb: "Visual Basic", +syntax_xml: "Xml", +syntax_c: "C", +syntax_cpp: "CPP", +syntax_basic: "Basic", +syntax_pas: "Pascal", +syntax_brainfuck: "Brainfuck", +syntax_sql: "SQL", +syntax_ruby: "Ruby", +syntax_robotstxt: "Robots txt", +syntax_tsql: "T-SQL", +syntax_perl: "Perl", +syntax_coldfusion: "Coldfusion", +syntax_java: "Java", +close_tab: "Close file" +}; diff --git a/includes/edit_area/langs/ja.js b/includes/edit_area/langs/ja.js new file mode 100644 index 0000000000..c061b4b639 --- /dev/null +++ b/includes/edit_area/langs/ja.js @@ -0,0 +1,67 @@ +editAreaLoader.lang["ja"]={ +new_document: "æ–°è¦ä½œæˆ", +search_button: "検索・置æ›", +search_command: "次を検索 / 検索窓を表示", +search: "検索", +replace: "ç½®æ›", +replace_command: "ç½®æ› / ç½®æ›çª“を表示", +find_next: "次を検索", +replace_all: "全置æ›", +reg_exp: "æ­£è¦è¡¨ç¾", +match_case: "å¤§æ–‡å­—å°æ–‡å­—ã®åŒºåˆ¥", +not_found: "見ã¤ã‹ã‚Šã¾ã›ã‚“。", +occurrence_replaced: "ç½®æ›ã—ã¾ã—ãŸã€‚", +search_field_empty: "検索対象文字列ãŒç©ºã§ã™ã€‚", +restart_search_at_begin: "終端ã«é”ã—ã¾ã—ãŸã€å§‹ã‚ã«æˆ»ã‚Šã¾ã™", +move_popup: "検索窓を移動", +font_size: "--フォントサイズ--", +go_to_line: "指定行ã¸ç§»å‹•", +go_to_line_prompt: "指定行ã¸ç§»å‹•ã—ã¾ã™:", +undo: "å…ƒã«æˆ»ã™", +redo: "やり直ã—", +change_smooth_selection: "スムース表示ã®åˆ‡ã‚Šæ›¿ãˆï¼ˆCPUを使ã„ã¾ã™ï¼‰", +highlight: "構文強調表示ã®åˆ‡ã‚Šæ›¿ãˆ", +reset_highlight: "構文強調表示ã®ãƒªã‚»ãƒƒãƒˆ", +word_wrap: "toggle word wrapping mode", +help: "ヘルプを表示", +save: "ä¿å­˜", +load: "読ã¿è¾¼ã¿", +line_abbr: "行", +char_abbr: "文字", +position: "ä½ç½®", +total: "åˆè¨ˆ", +close_popup: "ãƒãƒƒãƒ—アップを閉ã˜ã‚‹", +shortcuts: "ショートカット", +add_tab: "タブを挿入ã™ã‚‹", +remove_tab: "タブを削除ã™ã‚‹", +about_notice: "注æ„:構文強調表示ã¯çŸ­ã„テキストã§ã—ã‹æœ‰åŠ¹ã«æ©Ÿèƒ½ã—ã¾ã›ã‚“。", +toggle: "テキストエリアã¨editAreaã®åˆ‡ã‚Šæ›¿ãˆ", +accesskey: "アクセスキー", +tab: "Tab", +shift: "Shift", +ctrl: "Ctrl", +esc: "Esc", +processing: "処ç†ä¸­ã§ã™...", +fullscreen: "fullscreen", +syntax_selection: "--Syntax--", +syntax_css: "CSS", +syntax_html: "HTML", +syntax_js: "Javascript", +syntax_php: "Php", +syntax_python: "Python", +syntax_vb: "Visual Basic", +syntax_xml: "Xml", +syntax_c: "C", +syntax_cpp: "CPP", +syntax_basic: "Basic", +syntax_pas: "Pascal", +syntax_brainfuck: "Brainfuck", +syntax_sql: "SQL", +syntax_ruby: "Ruby", +syntax_robotstxt: "Robots txt", +syntax_tsql: "T-SQL", +syntax_perl: "Perl", +syntax_coldfusion: "Coldfusion", +syntax_java: "Java", +close_tab: "Close file" +}; diff --git a/includes/edit_area/langs/mk.js b/includes/edit_area/langs/mk.js new file mode 100644 index 0000000000..a2d9d215ca --- /dev/null +++ b/includes/edit_area/langs/mk.js @@ -0,0 +1,67 @@ +editAreaLoader.lang["mk"]={ +new_document: "Ðов документ", +search_button: "Ðајди и замени", +search_command: "Барај Ñледно / Отвори нов прозорец за пребарување", +search: "Барај", +replace: "Замени", +replace_command: "Замени / Отвори прозорец за пребарување", +find_next: "најди Ñледно", +replace_all: "Замени ги Ñите", +reg_exp: "Регуларни изрази", +match_case: "Битна е големината на буквите", +not_found: "не е пронајдено.", +occurrence_replaced: "замени.", +search_field_empty: "Полето за пребарување е празно", +restart_search_at_begin: "Крај на облаÑта. Стартувај од почеток.", +move_popup: "ПомеÑти го прозорецот", +font_size: "--Големина на текÑтот--", +go_to_line: "Оди на линија", +go_to_line_prompt: "Оди на линија Ñо број:", +undo: "Врати", +redo: "Повтори", +change_smooth_selection: "Вклучи/иÑклучи некои карактериÑтики за приказ (попаметен приказ, но поголемо оптеретување за процеÑорот)", +highlight: "Вклучи/иÑклучи оÑветлување на ÑинтакÑа", +reset_highlight: "РеÑетирај го оÑветлувањето на ÑинтакÑа (доколку е деÑинхронизиранo Ñо текÑтот)", +word_wrap: "toggle word wrapping mode", +help: "За", +save: "Зачувај", +load: "Вчитај", +line_abbr: "Лн", +char_abbr: "Зн", +position: "Позиција", +total: "Вкупно", +close_popup: "Затвори го прозорецот", +shortcuts: "Кратенки", +add_tab: "Додај табулација на текÑтот", +remove_tab: "ОтÑтрани ја табулацијата", +about_notice: "Ðапомена: ОÑветлувањето на ÑинтанÑа е Ñамо за краток текÑÑ‚", +toggle: "Смени начин на уредување", +accesskey: "Accesskey", +tab: "Tab", +shift: "Shift", +ctrl: "Ctrl", +esc: "Esc", +processing: "Обработувам...", +fullscreen: "Цел прозорец", +syntax_selection: "--СинтакÑа--", +syntax_css: "CSS", +syntax_html: "HTML", +syntax_js: "Javascript", +syntax_php: "Php", +syntax_python: "Python", +syntax_vb: "Visual Basic", +syntax_xml: "Xml", +syntax_c: "C", +syntax_cpp: "CPP", +syntax_basic: "Basic", +syntax_pas: "Pascal", +syntax_brainfuck: "Brainfuck", +syntax_sql: "SQL", +syntax_ruby: "Ruby", +syntax_robotstxt: "Robots txt", +syntax_tsql: "T-SQL", +syntax_perl: "Perl", +syntax_coldfusion: "Coldfusion", +syntax_java: "Java", +close_tab: "Избери датотека" +}; diff --git a/includes/edit_area/langs/nl.js b/includes/edit_area/langs/nl.js new file mode 100644 index 0000000000..28ec3bfe8c --- /dev/null +++ b/includes/edit_area/langs/nl.js @@ -0,0 +1,67 @@ +editAreaLoader.lang["nl"]={ +new_document: "nieuw leeg document", +search_button: "zoek en vervang", +search_command: "zoek volgende / zoekscherm openen", +search: "zoek", +replace: "vervang", +replace_command: "vervang / zoekscherm openen", +find_next: "volgende vinden", +replace_all: "alles vervangen", +reg_exp: "reguliere expressies", +match_case: "hoofdletter gevoelig", +not_found: "niet gevonden.", +occurrence_replaced: "object vervangen.", +search_field_empty: "Zoek veld leeg", +restart_search_at_begin: "Niet meer instanties gevonden, begin opnieuw", +move_popup: "versleep zoek scherm", +font_size: "--Letter grootte--", +go_to_line: "Ga naar regel", +go_to_line_prompt: "Ga naar regel nummer:", +undo: "Ongedaan maken", +redo: "Opnieuw doen", +change_smooth_selection: "zet wat schermopties aan/uit (kan langzamer zijn)", +highlight: "zet syntax highlight aan/uit", +reset_highlight: "reset highlight (indien gedesynchronizeerd)", +word_wrap: "toggle word wrapping mode", +help: "informatie", +save: "opslaan", +load: "laden", +line_abbr: "Ln", +char_abbr: "Ch", +position: "Positie", +total: "Totaal", +close_popup: "Popup sluiten", +shortcuts: "Snelkoppelingen", +add_tab: "voeg tabs toe in tekst", +remove_tab: "verwijder tabs uit tekst", +about_notice: "Notitie: syntax highlight functie is alleen voor kleine tekst", +toggle: "geavanceerde bewerkingsopties", +accesskey: "Accessknop", +tab: "Tab", +shift: "Shift", +ctrl: "Ctrl", +esc: "Esc", +processing: "Verwerken...", +fullscreen: "fullscreen", +syntax_selection: "--Syntax--", +syntax_css: "CSS", +syntax_html: "HTML", +syntax_js: "Javascript", +syntax_php: "Php", +syntax_python: "Python", +syntax_vb: "Visual Basic", +syntax_xml: "Xml", +syntax_c: "C", +syntax_cpp: "CPP", +syntax_basic: "Basic", +syntax_pas: "Pascal", +syntax_brainfuck: "Brainfuck", +syntax_sql: "SQL", +syntax_ruby: "Ruby", +syntax_robotstxt: "Robots txt", +syntax_tsql: "T-SQL", +syntax_perl: "Perl", +syntax_coldfusion: "Coldfusion", +syntax_java: "Java", +close_tab: "Close file" +}; diff --git a/includes/edit_area/langs/pl.js b/includes/edit_area/langs/pl.js new file mode 100644 index 0000000000..358af92db3 --- /dev/null +++ b/includes/edit_area/langs/pl.js @@ -0,0 +1,67 @@ +editAreaLoader.lang["pl"]={ +new_document: "nowy dokument", +search_button: "znajdź i zamieÅ„", +search_command: "znajdź nastÄ™pny", +search: "znajdź", +replace: "zamieÅ„", +replace_command: "zamieÅ„", +find_next: "nastÄ™pny", +replace_all: "zamieÅ„ wszystko", +reg_exp: "wyrażenie regularne", +match_case: "uwzglÄ™dnij wielkość liter
    ", +not_found: "nie znaleziono.", +occurrence_replaced: "wystÄ…pieÅ„ zamieniono.", +search_field_empty: "Nie wprowadzono tekstu", +restart_search_at_begin: "Koniec dokumentu. Wyszukiwanie od poczÄ…tku.", +move_popup: "przesuÅ„ okienko wyszukiwania", +font_size: "Rozmiar", +go_to_line: "idź do linii", +go_to_line_prompt: "numer linii:", +undo: "cofnij", +redo: "przywróć", +change_smooth_selection: "włącz/wyłącz niektóre opcje wyglÄ…du (zaawansowane opcje wyglÄ…du obciążajÄ… procesor)", +highlight: "włącz/wyłącz podÅ›wietlanie skÅ‚adni", +reset_highlight: "odÅ›wież podÅ›wietlanie skÅ‚adni (jeÅ›li rozsynchronizowaÅ‚o siÄ™ z tekstem)", +word_wrap: "toggle word wrapping mode", +help: "o programie", +save: "zapisz", +load: "otwórz", +line_abbr: "Ln", +char_abbr: "Zn", +position: "Pozycja", +total: "W sumie", +close_popup: "zamknij okienko", +shortcuts: "Skróty klawiaturowe", +add_tab: "dodaj wciÄ™cie do zaznaczonego tekstu", +remove_tab: "usuÅ„ wciÄ™cie", +about_notice: "Uwaga: podÅ›wietlanie skÅ‚adni nie jest zalecane dla dÅ‚ugich tekstów", +toggle: "Włącz/wyłącz edytor", +accesskey: "Alt+", +tab: "Tab", +shift: "Shift", +ctrl: "Ctrl", +esc: "Esc", +processing: "Przetwarzanie...", +fullscreen: "fullscreen", +syntax_selection: "--Syntax--", +syntax_css: "CSS", +syntax_html: "HTML", +syntax_js: "Javascript", +syntax_php: "Php", +syntax_python: "Python", +syntax_vb: "Visual Basic", +syntax_xml: "Xml", +syntax_c: "C", +syntax_cpp: "CPP", +syntax_basic: "Basic", +syntax_pas: "Pascal", +syntax_brainfuck: "Brainfuck", +syntax_sql: "SQL", +syntax_ruby: "Ruby", +syntax_robotstxt: "Robots txt", +syntax_tsql: "T-SQL", +syntax_perl: "Perl", +syntax_coldfusion: "Coldfusion", +syntax_java: "Java", +close_tab: "Close file" +}; diff --git a/includes/edit_area/langs/pt.js b/includes/edit_area/langs/pt.js new file mode 100644 index 0000000000..baa839d922 --- /dev/null +++ b/includes/edit_area/langs/pt.js @@ -0,0 +1,67 @@ +editAreaLoader.lang["pt"]={ +new_document: "Novo documento", +search_button: "Localizar e substituir", +search_command: "Localizar próximo", +search: "Localizar", +replace: "Substituir", +replace_command: "Substituir", +find_next: "Localizar", +replace_all: "Subst. tudo", +reg_exp: "Expressões regulares", +match_case: "Diferenciar maiúsculas e minúsculas", +not_found: "Não encontrado.", +occurrence_replaced: "Ocorrências substituidas", +search_field_empty: "Campo localizar vazio.", +restart_search_at_begin: "Fim das ocorrências. Recomeçar do inicio.", +move_popup: "Mover janela", +font_size: "--Tamanho da fonte--", +go_to_line: "Ir para linha", +go_to_line_prompt: "Ir para a linha:", +undo: "Desfazer", +redo: "Refazer", +change_smooth_selection: "Opções visuais", +highlight: "Cores de sintaxe", +reset_highlight: "Resetar cores (se não sincronizado)", +word_wrap: "toggle word wrapping mode", +help: "Sobre", +save: "Salvar", +load: "Carregar", +line_abbr: "Ln", +char_abbr: "Ch", +position: "Posição", +total: "Total", +close_popup: "Fechar", +shortcuts: "Shortcuts", +add_tab: "Adicionar tabulação", +remove_tab: "Remover tabulação", +about_notice: "Atenção: Cores de sintaxe são indicados somente para textos pequenos", +toggle: "Exibir editor", +accesskey: "Accesskey", +tab: "Tab", +shift: "Shift", +ctrl: "Ctrl", +esc: "Esc", +processing: "Processando...", +fullscreen: "fullscreen", +syntax_selection: "--Syntax--", +syntax_css: "CSS", +syntax_html: "HTML", +syntax_js: "Javascript", +syntax_php: "Php", +syntax_python: "Python", +syntax_vb: "Visual Basic", +syntax_xml: "Xml", +syntax_c: "C", +syntax_cpp: "CPP", +syntax_basic: "Basic", +syntax_pas: "Pascal", +syntax_brainfuck: "Brainfuck", +syntax_sql: "SQL", +syntax_ruby: "Ruby", +syntax_robotstxt: "Robots txt", +syntax_tsql: "T-SQL", +syntax_perl: "Perl", +syntax_coldfusion: "Coldfusion", +syntax_java: "Java", +close_tab: "Close file" +}; diff --git a/includes/edit_area/langs/ru.js b/includes/edit_area/langs/ru.js new file mode 100644 index 0000000000..89b47452a6 --- /dev/null +++ b/includes/edit_area/langs/ru.js @@ -0,0 +1,67 @@ +editAreaLoader.lang["ru"]={ +new_document: "новый пуÑтой документ", +search_button: "поиÑк и замена", +search_command: "иÑкать Ñледующий / открыть панель поиÑка", +search: "поиÑк", +replace: "замена", +replace_command: "заменить / открыть панель поиÑка", +find_next: "найти Ñледующее", +replace_all: "заменить вÑе", +reg_exp: "регулÑрное выражение", +match_case: "учитывать региÑтр", +not_found: "не найдено.", +occurrence_replaced: "вхождение заменено.", +search_field_empty: "Поле поиÑка пуÑтое", +restart_search_at_begin: "ДоÑтигнут конец документа. Ðачинаю Ñ Ð½Ð°Ñ‡Ð°Ð»Ð°.", +move_popup: "перемеÑтить окно поиÑка", +font_size: "--Размер шрифта--", +go_to_line: "перейти к Ñтроке", +go_to_line_prompt: "перейти к Ñтроке номер:", +undo: "отменить", +redo: "вернуть", +change_smooth_selection: "включить/отключить некоторые функции проÑмотра (более краÑиво, но больше иÑпользует процеÑÑор)", +highlight: "переключить подÑветку ÑинтакÑиÑа включена/выключена", +reset_highlight: "воÑÑтановить подÑветку (еÑли разÑинхронизирована от текÑта)", +word_wrap: "toggle word wrapping mode", +help: "о программе", +save: "Ñохранить", +load: "загрузить", +line_abbr: "Стр", +char_abbr: "Стлб", +position: "ПозициÑ", +total: "Ð’Ñего", +close_popup: "закрыть вÑплывающее окно", +shortcuts: "ГорÑчие клавиши", +add_tab: "добавить табулÑцию в текÑÑ‚", +remove_tab: "убрать табулÑцию из текÑта", +about_notice: "Внимание: Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð¿Ð¾Ð´Ñветки ÑинтакÑиÑа только Ð´Ð»Ñ Ð½ÐµÐ±Ð¾Ð»ÑŒÑˆÐ¸Ñ… текÑтов", +toggle: "Переключить редактор", +accesskey: "ГорÑÑ‡Ð°Ñ ÐºÐ»Ð°Ð²Ð¸ÑˆÐ°", +tab: "Tab", +shift: "Shift", +ctrl: "Ctrl", +esc: "Esc", +processing: "Обработка...", +fullscreen: "полный Ñкран", +syntax_selection: "--СинтакÑ--", +syntax_css: "CSS", +syntax_html: "HTML", +syntax_js: "Javascript", +syntax_php: "Php", +syntax_python: "Python", +syntax_vb: "Visual Basic", +syntax_xml: "Xml", +syntax_c: "C", +syntax_cpp: "CPP", +syntax_basic: "Basic", +syntax_pas: "Pascal", +syntax_brainfuck: "Brainfuck", +syntax_sql: "SQL", +syntax_ruby: "Ruby", +syntax_robotstxt: "Robots txt", +syntax_tsql: "T-SQL", +syntax_perl: "Perl", +syntax_coldfusion: "Coldfusion", +syntax_java: "Java", +close_tab: "Закрыть файл" +}; diff --git a/includes/edit_area/langs/sk.js b/includes/edit_area/langs/sk.js new file mode 100644 index 0000000000..4340646dc7 --- /dev/null +++ b/includes/edit_area/langs/sk.js @@ -0,0 +1,67 @@ +editAreaLoader.lang["sk"]={ +new_document: "nový prázdy dokument", +search_button: "vyhľadaj a nahraÄ", +search_command: "hľadaj ÄalsÅ¡ie / otvor vyhľadávacie pole", +search: "hľadaj", +replace: "nahraÄ", +replace_command: "nahraÄ / otvor vyhľadávacie pole", +find_next: "nájdi ÄalÅ¡ie", +replace_all: "nahraÄ vÅ¡etko", +reg_exp: "platné výrazy", +match_case: "zhodujúce sa výrazy", +not_found: "nenájdené.", +occurrence_replaced: "výskyty nahradené.", +search_field_empty: "Pole vyhľadávanie je prádzne", +restart_search_at_begin: "End of area reached. Restart at begin.", +move_popup: "presuň vyhľadávacie okno", +font_size: "--VeľkosÅ¥ textu--", +go_to_line: "prejdi na riadok", +go_to_line_prompt: "prejdi na riadok:", +undo: "krok späť", +redo: "prepracovaÅ¥", +change_smooth_selection: "povoliÅ¥/zamietnúť niektoré zo zobrazených funkcií (úÄelnejÅ¡ie zobrazenie vyžaduje väÄÅ¡ie zaÅ¥aženie procesora CPU)", +highlight: "prepnúť zvýrazňovanie syntaxe zap/vyp", +reset_highlight: "zruÅ¡iÅ¥ zvýrazňovanie (ak je nesynchronizované s textom)", +word_wrap: "toggle word wrapping mode", +help: "o programe", +save: "uložiÅ¥", +load: "naÄítaÅ¥", +line_abbr: "Ln", +char_abbr: "Ch", +position: "Pozícia", +total: "Spolu", +close_popup: "zavrieÅ¥ okno", +shortcuts: "Skratky", +add_tab: "pridaÅ¥ tabulovanie textu", +remove_tab: "odstrániÅ¥ tabulovanie textu", +about_notice: "Upozornenie: funkcia zvýrazňovania syntaxe je dostupná iba pre malý text", +toggle: "Prepnúť editor", +accesskey: "Accesskey", +tab: "Záložka", +shift: "Shift", +ctrl: "Ctrl", +esc: "Esc", +processing: "Spracúvam...", +fullscreen: "cel=a obrazovka", +syntax_selection: "--Vyber Syntax--", +syntax_css: "CSS", +syntax_html: "HTML", +syntax_js: "Javascript", +syntax_php: "Php", +syntax_python: "Python", +syntax_vb: "Visual Basic", +syntax_xml: "Xml", +syntax_c: "C", +syntax_cpp: "CPP", +syntax_basic: "Basic", +syntax_pas: "Pascal", +syntax_brainfuck: "Brainfuck", +syntax_sql: "SQL", +syntax_ruby: "Ruby", +syntax_robotstxt: "Robots txt", +syntax_tsql: "T-SQL", +syntax_perl: "Perl", +syntax_coldfusion: "Coldfusion", +syntax_java: "Java", +close_tab: "Close file" +}; diff --git a/includes/edit_area/langs/zh.js b/includes/edit_area/langs/zh.js new file mode 100644 index 0000000000..baecca7871 --- /dev/null +++ b/includes/edit_area/langs/zh.js @@ -0,0 +1,67 @@ +editAreaLoader.lang["zh"]={ +new_document: "新建空白文档", +search_button: "查找与替æ¢", +search_command: "查找下一个 / 打开查找框", +search: "查找", +replace: "替æ¢", +replace_command: "æ›¿æ¢ / 打开查找框", +find_next: "查找下一个", +replace_all: "全部替æ¢", +reg_exp: "正则表达å¼", +match_case: "匹é…大å°å†™", +not_found: "未找到.", +occurrence_replaced: "处被替æ¢.", +search_field_empty: "查找框没有内容", +restart_search_at_begin: "已到到文档末尾. ä»Žå¤´é‡æ–°æŸ¥æ‰¾.", +move_popup: "ç§»åŠ¨æŸ¥æ‰¾å¯¹è¯æ¡†", +font_size: "--字体大å°--", +go_to_line: "转到行", +go_to_line_prompt: "转到行:", +undo: "æ¢å¤", +redo: "é‡åš", +change_smooth_selection: "å¯ç”¨/ç¦æ­¢ä¸€äº›æ˜¾ç¤ºç‰¹æ€§(更好看但更耗费资æº)", +highlight: "å¯ç”¨/ç¦æ­¢è¯­æ³•高亮", +reset_highlight: "é‡ç½®è¯­æ³•高亮(当文本显示ä¸åŒæ­¥æ—¶)", +word_wrap: "toggle word wrapping mode", +help: "关于", +save: "ä¿å­˜", +load: "加载", +line_abbr: "行", +char_abbr: "字符", +position: "ä½ç½®", +total: "总计", +close_popup: "å…³é—­å¯¹è¯æ¡†", +shortcuts: "å¿«æ·é”®", +add_tab: "添加制表符(Tab)", +remove_tab: "移除制表符(Tab)", +about_notice: "注æ„:语法高亮功能仅用于较少内容的文本(文件内容太大会导致æµè§ˆå™¨å应慢)", +toggle: "切æ¢ç¼–辑器", +accesskey: "å¿«æ·é”®", +tab: "Tab", +shift: "Shift", +ctrl: "Ctrl", +esc: "Esc", +processing: "正在处ç†ä¸­...", +fullscreen: "å…¨å±ç¼–辑", +syntax_selection: "--语法--", +syntax_css: "CSS", +syntax_html: "HTML", +syntax_js: "Javascript", +syntax_php: "Php", +syntax_python: "Python", +syntax_vb: "Visual Basic", +syntax_xml: "Xml", +syntax_c: "C", +syntax_cpp: "CPP", +syntax_basic: "Basic", +syntax_pas: "Pascal", +syntax_brainfuck: "Brainfuck", +syntax_sql: "SQL", +syntax_ruby: "Ruby", +syntax_robotstxt: "Robots txt", +syntax_tsql: "T-SQL", +syntax_perl: "Perl", +syntax_coldfusion: "Coldfusion", +syntax_java: "Java", +close_tab: "关闭文件" +}; diff --git a/includes/edit_area/plugins/charmap/charmap.js b/includes/edit_area/plugins/charmap/charmap.js new file mode 100644 index 0000000000..631e92ed3e --- /dev/null +++ b/includes/edit_area/plugins/charmap/charmap.js @@ -0,0 +1,90 @@ +/** + * Charmap plugin + * by Christophe Dolivet + * v0.1 (2006/09/22) + * + * + * This plugin allow to use a visual keyboard allowing to insert any UTF-8 characters in the text. + * + * - plugin name to add to the plugin list: "charmap" + * - plugin name to add to the toolbar list: "charmap" + * - possible parameters to add to EditAreaLoader.init(): + * "charmap_default": (String) define the name of the default character range displayed on popup display + * (default: "arrows") + * + * + */ + +var EditArea_charmap= { + /** + * Get called once this file is loaded (editArea still not initialized) + * + * @return nothing + */ + init: function(){ + this.default_language="Arrows"; + } + + /** + * Returns the HTML code for a specific control string or false if this plugin doesn't have that control. + * A control can be a button, select list or any other HTML item to present in the EditArea user interface. + * Language variables such as {$lang_somekey} will also be replaced with contents from + * the language packs. + * + * @param {string} ctrl_name: the name of the control to add + * @return HTML code for a specific control or false. + * @type string or boolean + */ + ,get_control_html: function(ctrl_name){ + switch(ctrl_name){ + case "charmap": + // Control id, button img, command + return parent.editAreaLoader.get_button_html('charmap_but', 'charmap.gif', 'charmap_press', false, this.baseURL); + } + return false; + } + /** + * Get called once EditArea is fully loaded and initialised + * + * @return nothing + */ + ,onload: function(){ + if(editArea.settings["charmap_default"] && editArea.settings["charmap_default"].length>0) + this.default_language= editArea.settings["charmap_default"]; + } + + /** + * Is called each time the user touch a keyboard key. + * + * @param (event) e: the keydown event + * @return true - pass to next handler in chain, false - stop chain execution + * @type boolean + */ + ,onkeydown: function(e){ + + } + + /** + * Executes a specific command, this function handles plugin commands. + * + * @param {string} cmd: the name of the command being executed + * @param {unknown} param: the parameter of the command + * @return true - pass to next handler in chain, false - stop chain execution + * @type boolean + */ + ,execCommand: function(cmd, param){ + // Handle commands + switch(cmd){ + case "charmap_press": + win= window.open(this.baseURL+"popup.html", "charmap", "width=500,height=270,scrollbars=yes,resizable=yes"); + win.focus(); + return false; + } + // Pass to next handler in chain + return true; + } + +}; + +// Adds the plugin class to the list of available EditArea plugins +editArea.add_plugin("charmap", EditArea_charmap); diff --git a/includes/edit_area/plugins/charmap/css/charmap.css b/includes/edit_area/plugins/charmap/css/charmap.css new file mode 100644 index 0000000000..c447509184 --- /dev/null +++ b/includes/edit_area/plugins/charmap/css/charmap.css @@ -0,0 +1,64 @@ +body{ + background-color: #F0F0EE; + font: 12px monospace, sans-serif; +} + +select{ + background-color: #F9F9F9; + border: solid 1px #888888; +} + +h1, h2, h3, h4, h5, h6{ + margin: 0; + padding: 0; + color: #2B6FB6; +} + +h1{ + font-size: 1.5em; +} + +div#char_list{ + height: 200px; + overflow: auto; + padding: 1px; + border: 1px solid #0A246A; + background-color: #F9F9F9; + clear: both; + margin-top: 5px; +} + +a.char{ + display: block; + float: left; + width: 20px; + height: 20px; + line-height: 20px; + margin: 1px; + border: solid 1px #888888; + text-align: center; + cursor: pointer; +} + +a.char:hover{ + background-color: #CCCCCC; +} + +.preview{ + border: solid 1px #888888; + width: 50px; + padding: 2px 5px; + height: 35px; + line-height: 35px; + text-align:center; + background-color: #CCCCCC; + font-size: 2em; + float: right; + font-weight: bold; + margin: 0 0 5px 5px; +} + +#preview_code{ + font-size: 1.1em; + width: 70px; +} diff --git a/includes/edit_area/plugins/charmap/images/charmap.gif b/includes/edit_area/plugins/charmap/images/charmap.gif new file mode 100644 index 0000000000000000000000000000000000000000..3cdc4ac9134258a9a1a83b6afd5c7055bebbcbf9 GIT binary patch literal 245 zcmVJ7UM8qsvB8x<;Dr zSg7=Nn%Hi7)&KwiA^8LW0018VEC2ui02BZe000GY;3tk`X`X1RuI#x~)x&X5LaDKL zBuP+gmjjC8P!LL;h9PruTqdW2VQ_jhm?kOJM8RlI0sywOkQfrBgdlP}Q6Q310n$b# v>y*a!grF>@BLxiv8314c77P(14Hy;xh9(V(3=AWV77>droSmMZC?Nnljc8>f literal 0 HcmV?d00001 diff --git a/includes/edit_area/plugins/charmap/jscripts/map.js b/includes/edit_area/plugins/charmap/jscripts/map.js new file mode 100644 index 0000000000..e6008473f8 --- /dev/null +++ b/includes/edit_area/plugins/charmap/jscripts/map.js @@ -0,0 +1,373 @@ +var editArea; + + +/** + * UTF-8 list taken from http://www.utf8-chartable.de/unicode-utf8-table.pl?utf8=dec + */ + + +/* +var char_range_list={ +"Basic Latin":"0021,007F", +"Latin-1 Supplement":"0080,00FF", +"Latin Extended-A":"0100,017F", +"Latin Extended-B":"0180,024F", +"IPA Extensions":"0250,02AF", +"Spacing Modifier Letters":"02B0,02FF", + +"Combining Diacritical Marks":"0300,036F", +"Greek and Coptic":"0370,03FF", +"Cyrillic":"0400,04FF", +"Cyrillic Supplement":"0500,052F", +"Armenian":"0530,058F", +"Hebrew":"0590,05FF", +"Arabic":"0600,06FF", +"Syriac":"0700,074F", +"Arabic Supplement":"0750,077F", + +"Thaana":"0780,07BF", +"Devanagari":"0900,097F", +"Bengali":"0980,09FF", +"Gurmukhi":"0A00,0A7F", +"Gujarati":"0A80,0AFF", +"Oriya":"0B00,0B7F", +"Tamil":"0B80,0BFF", +"Telugu":"0C00,0C7F", +"Kannada":"0C80,0CFF", + +"Malayalam":"0D00,0D7F", +"Sinhala":"0D80,0DFF", +"Thai":"0E00,0E7F", +"Lao":"0E80,0EFF", +"Tibetan":"0F00,0FFF", +"Myanmar":"1000,109F", +"Georgian":"10A0,10FF", +"Hangul Jamo":"1100,11FF", +"Ethiopic":"1200,137F", + +"Ethiopic Supplement":"1380,139F", +"Cherokee":"13A0,13FF", +"Unified Canadian Aboriginal Syllabics":"1400,167F", +"Ogham":"1680,169F", +"Runic":"16A0,16FF", +"Tagalog":"1700,171F", +"Hanunoo":"1720,173F", +"Buhid":"1740,175F", +"Tagbanwa":"1760,177F", + +"Khmer":"1780,17FF", +"Mongolian":"1800,18AF", +"Limbu":"1900,194F", +"Tai Le":"1950,197F", +"New Tai Lue":"1980,19DF", +"Khmer Symbols":"19E0,19FF", +"Buginese":"1A00,1A1F", +"Phonetic Extensions":"1D00,1D7F", +"Phonetic Extensions Supplement":"1D80,1DBF", + +"Combining Diacritical Marks Supplement":"1DC0,1DFF", +"Latin Extended Additional":"1E00,1EFF", +"Greek Extended":"1F00,1FFF", +"General Punctuation":"2000,206F", +"Superscripts and Subscripts":"2070,209F", +"Currency Symbols":"20A0,20CF", +"Combining Diacritical Marks for Symbols":"20D0,20FF", +"Letterlike Symbols":"2100,214F", +"Number Forms":"2150,218F", + +"Arrows":"2190,21FF", +"Mathematical Operators":"2200,22FF", +"Miscellaneous Technical":"2300,23FF", +"Control Pictures":"2400,243F", +"Optical Character Recognition":"2440,245F", +"Enclosed Alphanumerics":"2460,24FF", +"Box Drawing":"2500,257F", +"Block Elements":"2580,259F", +"Geometric Shapes":"25A0,25FF", + +"Miscellaneous Symbols":"2600,26FF", +"Dingbats":"2700,27BF", +"Miscellaneous Mathematical Symbols-A":"27C0,27EF", +"Supplemental Arrows-A":"27F0,27FF", +"Braille Patterns":"2800,28FF", +"Supplemental Arrows-B":"2900,297F", +"Miscellaneous Mathematical Symbols-B":"2980,29FF", +"Supplemental Mathematical Operators":"2A00,2AFF", +"Miscellaneous Symbols and Arrows":"2B00,2BFF", + +"Glagolitic":"2C00,2C5F", +"Coptic":"2C80,2CFF", +"Georgian Supplement":"2D00,2D2F", +"Tifinagh":"2D30,2D7F", +"Ethiopic Extended":"2D80,2DDF", +"Supplemental Punctuation":"2E00,2E7F", +"CJK Radicals Supplement":"2E80,2EFF", +"Kangxi Radicals":"2F00,2FDF", +"Ideographic Description Characters":"2FF0,2FFF", + +"CJK Symbols and Punctuation":"3000,303F", +"Hiragana":"3040,309F", +"Katakana":"30A0,30FF", +"Bopomofo":"3100,312F", +"Hangul Compatibility Jamo":"3130,318F", +"Kanbun":"3190,319F", +"Bopomofo Extended":"31A0,31BF", +"CJK Strokes":"31C0,31EF", +"Katakana Phonetic Extensions":"31F0,31FF", + +"Enclosed CJK Letters and Months":"3200,32FF", +"CJK Compatibility":"3300,33FF", +"CJK Unified Ideographs Extension A":"3400,4DBF", +"Yijing Hexagram Symbols":"4DC0,4DFF", +"CJK Unified Ideographs":"4E00,9FFF", +"Yi Syllables":"A000,A48F", +"Yi Radicals":"A490,A4CF", +"Modifier Tone Letters":"A700,A71F", +"Syloti Nagri":"A800,A82F", + +"Hangul Syllables":"AC00,D7AF", +"High Surrogates":"D800,DB7F", +"High Private Use Surrogates":"DB80,DBFF", +"Low Surrogates":"DC00,DFFF", +"Private Use Area":"E000,F8FF", +"CJK Compatibility Ideographs":"F900,FAFF", +"Alphabetic Presentation Forms":"FB00,FB4F", +"Arabic Presentation Forms-A":"FB50,FDFF", +"Variation Selectors":"FE00,FE0F", + +"Vertical Forms":"FE10,FE1F", +"Combining Half Marks":"FE20,FE2F", +"CJK Compatibility Forms":"FE30,FE4F", +"Small Form Variants":"FE50,FE6F", +"Arabic Presentation Forms-B":"FE70,FEFF", +"Halfwidth and Fullwidth Forms":"FF00,FFEF", +"Specials":"FFF0,FFFF", +"Linear B Syllabary":"10000,1007F", +"Linear B Ideograms":"10080,100FF", + +"Aegean Numbers":"10100,1013F", +"Ancient Greek Numbers":"10140,1018F", +"Old Italic":"10300,1032F", +"Gothic":"10330,1034F", +"Ugaritic":"10380,1039F", +"Old Persian":"103A0,103DF", +"Deseret":"10400,1044F", +"Shavian":"10450,1047F", +"Osmanya":"10480,104AF", + +"Cypriot Syllabary":"10800,1083F", +"Kharoshthi":"10A00,10A5F", +"Byzantine Musical Symbols":"1D000,1D0FF", +"Musical Symbols":"1D100,1D1FF", +"Ancient Greek Musical Notation":"1D200,1D24F", +"Tai Xuan Jing Symbols":"1D300,1D35F", +"Mathematical Alphanumeric Symbols":"1D400,1D7FF", +"CJK Unified Ideographs Extension B":"20000,2A6DF", +"CJK Compatibility Ideographs Supplement":"2F800,2FA1F", +"Tags":"E0000,E007F", +"Variation Selectors Supplement":"E0100,E01EF" +}; +*/ +var char_range_list={ +"Aegean Numbers":"10100,1013F", +"Alphabetic Presentation Forms":"FB00,FB4F", +"Ancient Greek Musical Notation":"1D200,1D24F", +"Ancient Greek Numbers":"10140,1018F", +"Arabic":"0600,06FF", +"Arabic Presentation Forms-A":"FB50,FDFF", +"Arabic Presentation Forms-B":"FE70,FEFF", +"Arabic Supplement":"0750,077F", +"Armenian":"0530,058F", +"Arrows":"2190,21FF", +"Basic Latin":"0020,007F", +"Bengali":"0980,09FF", +"Block Elements":"2580,259F", +"Bopomofo Extended":"31A0,31BF", +"Bopomofo":"3100,312F", +"Box Drawing":"2500,257F", +"Braille Patterns":"2800,28FF", +"Buginese":"1A00,1A1F", +"Buhid":"1740,175F", +"Byzantine Musical Symbols":"1D000,1D0FF", +"CJK Compatibility Forms":"FE30,FE4F", +"CJK Compatibility Ideographs Supplement":"2F800,2FA1F", +"CJK Compatibility Ideographs":"F900,FAFF", +"CJK Compatibility":"3300,33FF", +"CJK Radicals Supplement":"2E80,2EFF", +"CJK Strokes":"31C0,31EF", +"CJK Symbols and Punctuation":"3000,303F", +"CJK Unified Ideographs Extension A":"3400,4DBF", +"CJK Unified Ideographs Extension B":"20000,2A6DF", +"CJK Unified Ideographs":"4E00,9FFF", +"Cherokee":"13A0,13FF", +"Combining Diacritical Marks Supplement":"1DC0,1DFF", +"Combining Diacritical Marks for Symbols":"20D0,20FF", +"Combining Diacritical Marks":"0300,036F", +"Combining Half Marks":"FE20,FE2F", +"Control Pictures":"2400,243F", +"Coptic":"2C80,2CFF", +"Currency Symbols":"20A0,20CF", +"Cypriot Syllabary":"10800,1083F", +"Cyrillic Supplement":"0500,052F", +"Cyrillic":"0400,04FF", +"Deseret":"10400,1044F", +"Devanagari":"0900,097F", +"Dingbats":"2700,27BF", +"Enclosed Alphanumerics":"2460,24FF", +"Enclosed CJK Letters and Months":"3200,32FF", +"Ethiopic Extended":"2D80,2DDF", +"Ethiopic Supplement":"1380,139F", +"Ethiopic":"1200,137F", +"General Punctuation":"2000,206F", +"Geometric Shapes":"25A0,25FF", +"Georgian Supplement":"2D00,2D2F", +"Georgian":"10A0,10FF", +"Glagolitic":"2C00,2C5F", +"Gothic":"10330,1034F", +"Greek Extended":"1F00,1FFF", +"Greek and Coptic":"0370,03FF", +"Gujarati":"0A80,0AFF", +"Gurmukhi":"0A00,0A7F", +"Halfwidth and Fullwidth Forms":"FF00,FFEF", +"Hangul Compatibility Jamo":"3130,318F", +"Hangul Jamo":"1100,11FF", +"Hangul Syllables":"AC00,D7AF", +"Hanunoo":"1720,173F", +"Hebrew":"0590,05FF", +"High Private Use Surrogates":"DB80,DBFF", +"High Surrogates":"D800,DB7F", +"Hiragana":"3040,309F", +"IPA Extensions":"0250,02AF", +"Ideographic Description Characters":"2FF0,2FFF", +"Kanbun":"3190,319F", +"Kangxi Radicals":"2F00,2FDF", +"Kannada":"0C80,0CFF", +"Katakana Phonetic Extensions":"31F0,31FF", +"Katakana":"30A0,30FF", +"Kharoshthi":"10A00,10A5F", +"Khmer Symbols":"19E0,19FF", +"Khmer":"1780,17FF", +"Lao":"0E80,0EFF", +"Latin Extended Additional":"1E00,1EFF", +"Latin Extended-A":"0100,017F", +"Latin Extended-B":"0180,024F", +"Latin-1 Supplement":"0080,00FF", +"Letterlike Symbols":"2100,214F", +"Limbu":"1900,194F", +"Linear B Ideograms":"10080,100FF", +"Linear B Syllabary":"10000,1007F", +"Low Surrogates":"DC00,DFFF", +"Malayalam":"0D00,0D7F", +"Mathematical Alphanumeric Symbols":"1D400,1D7FF", +"Mathematical Operators":"2200,22FF", +"Miscellaneous Mathematical Symbols-A":"27C0,27EF", +"Miscellaneous Mathematical Symbols-B":"2980,29FF", +"Miscellaneous Symbols and Arrows":"2B00,2BFF", +"Miscellaneous Symbols":"2600,26FF", +"Miscellaneous Technical":"2300,23FF", +"Modifier Tone Letters":"A700,A71F", +"Mongolian":"1800,18AF", +"Musical Symbols":"1D100,1D1FF", +"Myanmar":"1000,109F", +"New Tai Lue":"1980,19DF", +"Number Forms":"2150,218F", +"Ogham":"1680,169F", +"Old Italic":"10300,1032F", +"Old Persian":"103A0,103DF", +"Optical Character Recognition":"2440,245F", +"Oriya":"0B00,0B7F", +"Osmanya":"10480,104AF", +"Phonetic Extensions Supplement":"1D80,1DBF", +"Phonetic Extensions":"1D00,1D7F", +"Private Use Area":"E000,F8FF", +"Runic":"16A0,16FF", +"Shavian":"10450,1047F", +"Sinhala":"0D80,0DFF", +"Small Form Variants":"FE50,FE6F", +"Spacing Modifier Letters":"02B0,02FF", +"Specials":"FFF0,FFFF", +"Superscripts and Subscripts":"2070,209F", +"Supplemental Arrows-A":"27F0,27FF", +"Supplemental Arrows-B":"2900,297F", +"Supplemental Mathematical Operators":"2A00,2AFF", +"Supplemental Punctuation":"2E00,2E7F", +"Syloti Nagri":"A800,A82F", +"Syriac":"0700,074F", +"Tagalog":"1700,171F", +"Tagbanwa":"1760,177F", +"Tags":"E0000,E007F", +"Tai Le":"1950,197F", +"Tai Xuan Jing Symbols":"1D300,1D35F", +"Tamil":"0B80,0BFF", +"Telugu":"0C00,0C7F", +"Thaana":"0780,07BF", +"Thai":"0E00,0E7F", +"Tibetan":"0F00,0FFF", +"Tifinagh":"2D30,2D7F", +"Ugaritic":"10380,1039F", +"Unified Canadian Aboriginal Syllabics":"1400,167F", +"Variation Selectors Supplement":"E0100,E01EF", +"Variation Selectors":"FE00,FE0F", +"Vertical Forms":"FE10,FE1F", +"Yi Radicals":"A490,A4CF", +"Yi Syllables":"A000,A48F", +"Yijing Hexagram Symbols":"4DC0,4DFF" +}; + +var insert="charmap_insert"; + +function map_load(){ + editArea=opener.editArea; + // translate the document + insert= editArea.get_translation(insert, "word"); + //alert(document.title); + document.title= editArea.get_translation(document.title, "template"); + document.body.innerHTML= editArea.get_translation(document.body.innerHTML, "template"); + //document.title= editArea.get_translation(document.getElementBytitle, "template"); + + var selected_lang=opener.EditArea_charmap.default_language.toLowerCase(); + var selected=0; + + var select= document.getElementById("select_range") + for(var i in char_range_list){ + if(i.toLowerCase()==selected_lang) + selected=select.options.length; + select.options[select.options.length]=new Option(i, char_range_list[i]); + } + select.options[selected].selected=true; +/* start=0; + end=127; + content=""; + for(var i=start; i"+ String.fromCharCode(i) +""; + } + document.getElementById("char_list").innerHTML= html; + document.getElementById("preview_char").innerHTML=""; +} + +function previewChar(i){ + document.getElementById("preview_char").innerHTML= String.fromCharCode(i); + document.getElementById("preview_code").innerHTML= "&#"+ i +";"; +} + +function insertChar(i){ + opener.parent.editAreaLoader.setSelectedText(editArea.id, String.fromCharCode( i)); + range= opener.parent.editAreaLoader.getSelectionRange(editArea.id); + opener.parent.editAreaLoader.setSelectionRange(editArea.id, range["end"], range["end"]); + window.focus(); +} diff --git a/includes/edit_area/plugins/charmap/langs/bg.js b/includes/edit_area/plugins/charmap/langs/bg.js new file mode 100644 index 0000000000..1755beb0ef --- /dev/null +++ b/includes/edit_area/plugins/charmap/langs/bg.js @@ -0,0 +1,12 @@ +/* + * Bulgarian translation + * Author: Valentin Hristov + * Company: SOFTKIT Bulgarian + * Site: http://www.softkit-bg.com + */ +editArea.add_lang("bg",{ +charmap_but: "Виртуална клавиатура", +charmap_title: "Виртуална клавиатура", +charmap_choose_block: "избери езиков блок", +charmap_insert:"поÑтави този Ñимвол" +}); diff --git a/includes/edit_area/plugins/charmap/langs/cs.js b/includes/edit_area/plugins/charmap/langs/cs.js new file mode 100644 index 0000000000..ff1a566d96 --- /dev/null +++ b/includes/edit_area/plugins/charmap/langs/cs.js @@ -0,0 +1,6 @@ +editArea.add_lang("cs",{ +charmap_but: "Visual keyboard", +charmap_title: "Visual keyboard", +charmap_choose_block: "select language block", +charmap_insert:"insert this character" +}); diff --git a/includes/edit_area/plugins/charmap/langs/de.js b/includes/edit_area/plugins/charmap/langs/de.js new file mode 100644 index 0000000000..8c420d1db7 --- /dev/null +++ b/includes/edit_area/plugins/charmap/langs/de.js @@ -0,0 +1,6 @@ +editArea.add_lang("de",{ +charmap_but: "Sonderzeichen", +charmap_title: "Sonderzeichen", +charmap_choose_block: "Bereich auswählen", +charmap_insert: "dieses Zeichen einfügen" +}); diff --git a/includes/edit_area/plugins/charmap/langs/dk.js b/includes/edit_area/plugins/charmap/langs/dk.js new file mode 100644 index 0000000000..c25fd987c7 --- /dev/null +++ b/includes/edit_area/plugins/charmap/langs/dk.js @@ -0,0 +1,6 @@ +editArea.add_lang("dk",{ +charmap_but: "Visual keyboard", +charmap_title: "Visual keyboard", +charmap_choose_block: "select language block", +charmap_insert:"insert this character" +}); diff --git a/includes/edit_area/plugins/charmap/langs/en.js b/includes/edit_area/plugins/charmap/langs/en.js new file mode 100644 index 0000000000..b9defcef86 --- /dev/null +++ b/includes/edit_area/plugins/charmap/langs/en.js @@ -0,0 +1,6 @@ +editArea.add_lang("en",{ +charmap_but: "Visual keyboard", +charmap_title: "Visual keyboard", +charmap_choose_block: "select language block", +charmap_insert:"insert this character" +}); diff --git a/includes/edit_area/plugins/charmap/langs/eo.js b/includes/edit_area/plugins/charmap/langs/eo.js new file mode 100644 index 0000000000..d7a5d26694 --- /dev/null +++ b/includes/edit_area/plugins/charmap/langs/eo.js @@ -0,0 +1,6 @@ +editArea.add_lang("eo",{ +charmap_but: "Ekranklavaro", +charmap_title: "Ekranklavaro", +charmap_choose_block: "Elekto de lingvo", +charmap_insert:"enmeti tiun signaron" +}); diff --git a/includes/edit_area/plugins/charmap/langs/es.js b/includes/edit_area/plugins/charmap/langs/es.js new file mode 100644 index 0000000000..42fd0bd9db --- /dev/null +++ b/includes/edit_area/plugins/charmap/langs/es.js @@ -0,0 +1,6 @@ +editArea.add_lang("es",{ +charmap_but: "Visual keyboard", +charmap_title: "Visual keyboard", +charmap_choose_block: "select language block", +charmap_insert:"insert this character" +}); diff --git a/includes/edit_area/plugins/charmap/langs/fr.js b/includes/edit_area/plugins/charmap/langs/fr.js new file mode 100644 index 0000000000..f8f1100f5f --- /dev/null +++ b/includes/edit_area/plugins/charmap/langs/fr.js @@ -0,0 +1,6 @@ +editArea.add_lang("fr",{ +charmap_but: "Clavier visuel", +charmap_title: "Clavier visuel", +charmap_choose_block: "choix du language", +charmap_insert:"insérer ce caractère" +}); diff --git a/includes/edit_area/plugins/charmap/langs/hr.js b/includes/edit_area/plugins/charmap/langs/hr.js new file mode 100644 index 0000000000..ff73127ece --- /dev/null +++ b/includes/edit_area/plugins/charmap/langs/hr.js @@ -0,0 +1,6 @@ +editArea.add_lang("hr",{ +charmap_but: "Virtualna tipkovnica", +charmap_title: "Virtualna tipkovnica", +charmap_choose_block: "Odaberi blok s jezikom", +charmap_insert:"Ubaci taj znak" +}); diff --git a/includes/edit_area/plugins/charmap/langs/it.js b/includes/edit_area/plugins/charmap/langs/it.js new file mode 100644 index 0000000000..b55d777e4e --- /dev/null +++ b/includes/edit_area/plugins/charmap/langs/it.js @@ -0,0 +1,6 @@ +editArea.add_lang("it",{ +charmap_but: "Tastiera visuale", +charmap_title: "Tastiera visuale", +charmap_choose_block: "seleziona blocco", +charmap_insert:"inserisci questo carattere" +}); diff --git a/includes/edit_area/plugins/charmap/langs/ja.js b/includes/edit_area/plugins/charmap/langs/ja.js new file mode 100644 index 0000000000..9d7dd17330 --- /dev/null +++ b/includes/edit_area/plugins/charmap/langs/ja.js @@ -0,0 +1,6 @@ +editArea.add_lang("ja",{ +charmap_but: "Visual keyboard", +charmap_title: "Visual keyboard", +charmap_choose_block: "select language block", +charmap_insert:"insert this character" +}); diff --git a/includes/edit_area/plugins/charmap/langs/mk.js b/includes/edit_area/plugins/charmap/langs/mk.js new file mode 100644 index 0000000000..2896b0bdc8 --- /dev/null +++ b/includes/edit_area/plugins/charmap/langs/mk.js @@ -0,0 +1,6 @@ +editArea.add_lang("mkn",{ +charmap_but: "Visual keyboard", +charmap_title: "Visual keyboard", +charmap_choose_block: "select language block", +charmap_insert:"insert this character" +}); diff --git a/includes/edit_area/plugins/charmap/langs/nl.js b/includes/edit_area/plugins/charmap/langs/nl.js new file mode 100644 index 0000000000..fb2ed44af0 --- /dev/null +++ b/includes/edit_area/plugins/charmap/langs/nl.js @@ -0,0 +1,6 @@ +editArea.add_lang("nl",{ +charmap_but: "Visueel toetsenbord", +charmap_title: "Visueel toetsenbord", +charmap_choose_block: "Kies een taal blok", +charmap_insert:"Voeg dit symbool in" +}); diff --git a/includes/edit_area/plugins/charmap/langs/pl.js b/includes/edit_area/plugins/charmap/langs/pl.js new file mode 100644 index 0000000000..a4237b4fa5 --- /dev/null +++ b/includes/edit_area/plugins/charmap/langs/pl.js @@ -0,0 +1,6 @@ +editArea.add_lang("pl",{ +charmap_but: "Klawiatura ekranowa", +charmap_title: "Klawiatura ekranowa", +charmap_choose_block: "wybierz grupÄ™ znaków", +charmap_insert:"wstaw ten znak" +}); diff --git a/includes/edit_area/plugins/charmap/langs/pt.js b/includes/edit_area/plugins/charmap/langs/pt.js new file mode 100644 index 0000000000..8e04d5e827 --- /dev/null +++ b/includes/edit_area/plugins/charmap/langs/pt.js @@ -0,0 +1,6 @@ +editArea.add_lang("pt",{ +charmap_but: "Visual keyboard", +charmap_title: "Visual keyboard", +charmap_choose_block: "select language block", +charmap_insert:"insert this character" +}); diff --git a/includes/edit_area/plugins/charmap/langs/ru.js b/includes/edit_area/plugins/charmap/langs/ru.js new file mode 100644 index 0000000000..8da6bbb6ce --- /dev/null +++ b/includes/edit_area/plugins/charmap/langs/ru.js @@ -0,0 +1,6 @@ +editArea.add_lang("ru",{ +charmap_but: "Ð’Ð¸Ð·ÑƒÐ°Ð»ÑŒÐ½Ð°Ñ ÐºÐ»Ð°Ð²Ð¸Ð°Ñ‚ÑƒÑ€Ð°", +charmap_title: "Ð’Ð¸Ð·ÑƒÐ°Ð»ÑŒÐ½Ð°Ñ ÐºÐ»Ð°Ð²Ð¸Ð°Ñ‚ÑƒÑ€Ð°", +charmap_choose_block: "выбрать Ñзыковой блок", +charmap_insert:"вÑтавить Ñтот Ñимвол" +}); diff --git a/includes/edit_area/plugins/charmap/langs/sk.js b/includes/edit_area/plugins/charmap/langs/sk.js new file mode 100644 index 0000000000..5ead132664 --- /dev/null +++ b/includes/edit_area/plugins/charmap/langs/sk.js @@ -0,0 +1,6 @@ +editArea.add_lang("sk",{ +charmap_but: "Vizuálna klávesnica", +charmap_title: "Vizuálna klávesnica", +charmap_choose_block: "vyber jazykový blok", +charmap_insert: "vlož tento znak" +}); diff --git a/includes/edit_area/plugins/charmap/langs/zh.js b/includes/edit_area/plugins/charmap/langs/zh.js new file mode 100644 index 0000000000..8f593518c9 --- /dev/null +++ b/includes/edit_area/plugins/charmap/langs/zh.js @@ -0,0 +1,6 @@ +editArea.add_lang("zh",{ +charmap_but: "软键盘", +charmap_title: "软键盘", +charmap_choose_block: "选择一个语言å—", +charmap_insert:"æ’入此字符" +}); diff --git a/includes/edit_area/plugins/charmap/popup.html b/includes/edit_area/plugins/charmap/popup.html new file mode 100644 index 0000000000..4b549db8b0 --- /dev/null +++ b/includes/edit_area/plugins/charmap/popup.html @@ -0,0 +1,24 @@ + + + + +{$charmap_title} + + + + + +
    +
    +

    {$charmap_title}:

    + +
    + +
    + + + + + diff --git a/includes/edit_area/plugins/test/css/test.css b/includes/edit_area/plugins/test/css/test.css new file mode 100644 index 0000000000..1c206591a8 --- /dev/null +++ b/includes/edit_area/plugins/test/css/test.css @@ -0,0 +1,3 @@ +select#test_select{ + background-color: #FF0000; +} diff --git a/includes/edit_area/plugins/test/images/Thumbs.db b/includes/edit_area/plugins/test/images/Thumbs.db new file mode 100644 index 0000000000000000000000000000000000000000..863ae4136373453becc31bbf4c9ba8b353a59985 GIT binary patch literal 3584 zcmca`Uhu)fjZzO8(10BSGsD0CoD6J8;*3Bx2!nwD0|OI~0pkDr|NlQkkbwcn90fxt z1pWfu3W`4vW&uVbD>OcbkQYXsN;Sr0E8 zaOhkxxl#G`%M*;uKzRpHVgmw02t_u@!ob7`vL93yfoNh4dI)j^5I8d=0)3sxkOK^b zbchg1qyVrK1lbD%#ApTu+ez{tqRkN|`X z|8E1c2s0BC2mt{L5V3Nwva+zSa@^NzuhzSS^i-?Mf z^6-mGh>1uDiHM4T3}Ivj>S1B!WM$8aRU`>1?EsjW@aW9W{|6as%wGr3@n1ILW+itY{G$w z>`H|qMvW5}awt1(JSZA;@q>zSQc)8pmzcPOq?D?fx`w8fiK&^ng{76Vi>sTvho@I? zNN8AiL}XNQN@`kqMrKxVNoiSmMP*fUOKV$uM`zch$y26In?7UatVN5LEM2yI#mZHi zHgDOwZTpU$yAB;ba`f2o6DLnyx_ss8wd*%--g@}x@sp>|p1*kc>f@)+U%r0({^RE_ zkiQrim?7SR`wY!rf#!>{Gvs{YQ~ z$5DS+r^e)?edj-^8vFkY6ODbYZ1qhJyO2}={FtTMj(M5N{~0Q8-uN{sd%=hB!}o9M zKMGr|H}fGs&mZxRVM|5So_X5}9roNaQ;BC)il)>?F3Agd$BYh?i{AQo^8Tl6dA9!y zZ+tH9|I#LP^6!j)T-ozk_dm?3&%K-ZJ^sVA8i%WU!ju2bSKdE8yYy*grrwtrFPqIf z^qxveBs<7YvHuXB-@Z@uNA_>eihQ3B?QJFXTrW5M@VW)E^N_YhTySN@GN*~FnvMpt zy-DX{PjoGj{}8qRr&T?7{f(K~{~4BEzY@T1|Ka;TuD2iCAFgk(F@4Bue7KH%zV8K- z)45vLqIYv2oB60owNvuc-4!~aj4BMqa~Ln};{Q<_f9yZQFVTJS{}~?a`u(3_vc{qY zyZFB=?6deq>#o(=U;Y#S=&!x|<*nMfMz&fOTRc*`goV6y7IsXEMB;+(?)nNpQS zT@3$k!g2);S^!wmgK|y+6srJfa8AnA?#sP;jIo3vm7y3|L+Sx*$4rJapzJ6ZP9XpQ D30)$f literal 0 HcmV?d00001 diff --git a/includes/edit_area/plugins/test/images/test.gif b/includes/edit_area/plugins/test/images/test.gif new file mode 100644 index 0000000000000000000000000000000000000000..1ab5da4461113d2af579898528246fdbe52ecd00 GIT binary patch literal 87 zcmZ?wbhEHb6k!lyn83&Y1dNP~ia%L^OhyJB5FaGNz@*pGzw+SQ`#f{}FJ-?!v#V)e mtsGNfpJeCKSAiOz**>0`XR2{OVa>-G_df0vaY" + +" " + +" " + +" " + +" " + +" " + +" " + +" " + +" "; + return html; + } + return false; + } + /** + * Get called once EditArea is fully loaded and initialised + * + * @return nothing + */ + ,onload: function(){ + alert("test load"); + } + + /** + * Is called each time the user touch a keyboard key. + * + * @param (event) e: the keydown event + * @return true - pass to next handler in chain, false - stop chain execution + * @type boolean + */ + ,onkeydown: function(e){ + var str= String.fromCharCode(e.keyCode); + // desactivate the "f" character + if(str.toLowerCase()=="f"){ + return true; + } + return false; + } + + /** + * Executes a specific command, this function handles plugin commands. + * + * @param {string} cmd: the name of the command being executed + * @param {unknown} param: the parameter of the command + * @return true - pass to next handler in chain, false - stop chain execution + * @type boolean + */ + ,execCommand: function(cmd, param){ + // Handle commands + switch(cmd){ + case "test_select_change": + var val= document.getElementById("test_select").value; + if(val!=-1) + parent.editAreaLoader.insertTags(editArea.id, "<"+val+">", ""); + document.getElementById("test_select").options[0].selected=true; + return false; + case "test_cmd": + alert("user clicked on test_cmd"); + return false; + } + // Pass to next handler in chain + return true; + } + + /** + * This is just an internal plugin method, prefix all internal methods with a _ character. + * The prefix is needed so they doesn't collide with future EditArea callback functions. + * + * @param {string} a Some arg1. + * @param {string} b Some arg2. + * @return Some return. + * @type unknown + */ + ,_someInternalFunction : function(a, b) { + return a+b; + } +}; + +// Adds the plugin class to the list of available EditArea plugins +editArea.add_plugin("test", EditArea_test); diff --git a/includes/edit_area/plugins/test/test2.js b/includes/edit_area/plugins/test/test2.js new file mode 100644 index 0000000000..44a01b61cc --- /dev/null +++ b/includes/edit_area/plugins/test/test2.js @@ -0,0 +1 @@ +alert("test2.js is loaded from test plugin"); diff --git a/includes/edit_area/reg_syntax/basic.js b/includes/edit_area/reg_syntax/basic.js new file mode 100644 index 0000000000..8a5849cd45 --- /dev/null +++ b/includes/edit_area/reg_syntax/basic.js @@ -0,0 +1,69 @@ +editAreaLoader.load_syntax["basic"] = { + 'COMMENT_SINGLE' : {1 : "'", 2 : 'rem'} + ,'COMMENT_MULTI' : { } + ,'QUOTEMARKS' : {1: '"'} + ,'KEYWORD_CASE_SENSITIVE' : false + ,'KEYWORDS' : { + 'statements' : [ + 'if','then','for','wend','while', + 'else','elseif','select','case','end select', + 'until','next','step','to','end if', 'call' + ] + ,'keywords' : [ + 'sub', 'end sub', 'function', 'end function', 'exit', + 'exit function', 'dim', 'redim', 'shared', 'const', + 'is', 'absolute', 'access', 'any', 'append', 'as', + 'base', 'beep', 'binary', 'bload', 'bsave', 'chain', + 'chdir', 'circle', 'clear', 'close', 'cls', 'color', + 'com', 'common', 'data', 'date', 'declare', 'def', + 'defdbl', 'defint', 'deflng', 'defsng', 'defstr', + 'double', 'draw', 'environ', 'erase', 'error', 'field', + 'files', 'fn', 'get', 'gosub', 'goto', 'integer', 'key', + 'kill', 'let', 'line', 'list', 'locate', 'lock', 'long', + 'lprint', 'lset', 'mkdir', 'name', 'off', 'on', 'open', + 'option', 'out', 'output', 'paint', 'palette', 'pcopy', + 'poke', 'preset', 'print', 'pset', 'put', 'random', + 'randomize', 'read', 'reset', 'restore', 'resume', + 'return', 'rmdir', 'rset', 'run', 'screen', 'seg', + 'shell', 'single', 'sleep', 'sound', 'static', 'stop', + 'strig', 'string', 'swap', 'system', 'time', 'timer', + 'troff', 'tron', 'type', 'unlock', 'using', 'view', + 'wait', 'width', 'window', 'write' + ] + ,'functions' : [ + 'abs', 'asc', 'atn', 'cdbl', 'chr', 'cint', 'clng', + 'cos', 'csng', 'csrlin', 'cvd', 'cvdmbf', 'cvi', 'cvl', + 'cvs', 'cvsmbf', 'eof', 'erdev', 'erl', 'err', 'exp', + 'fileattr', 'fix', 'fre', 'freefile', 'hex', 'inkey', + 'inp', 'input', 'instr', 'int', 'ioctl', 'lbound', + 'lcase', 'left', 'len', 'loc', 'lof', 'log', 'lpos', + 'ltrim', 'mid', 'mkd', 'mkdmbf', 'mki', 'mkl', 'mks', + 'mksmbf', 'oct', 'peek', 'pen', 'play', 'pmap', 'point', + 'pos', 'right', 'rnd', 'rtrim', 'seek', 'sgn', 'sin', + 'space', 'spc', 'sqr', 'stick', 'str', 'tab', 'tan', + 'ubound', 'ucase', 'val', 'varptr', 'varseg' + ] + ,'operators' : [ + 'and', 'eqv', 'imp', 'mod', 'not', 'or', 'xor' + ] + } + ,'OPERATORS' :[ + '+', '-', '/', '*', '=', '<', '>', '!', '&' + ] + ,'DELIMITERS' :[ + '(', ')', '[', ']', '{', '}' + ] + ,'STYLES' : { + 'COMMENTS': 'color: #99CC00;' + ,'QUOTESMARKS': 'color: #333399;' + ,'KEYWORDS' : { + 'keywords' : 'color: #3366FF;' + ,'functions' : 'color: #0000FF;' + ,'statements' : 'color: #3366FF;' + ,'operators' : 'color: #FF0000;' + } + ,'OPERATORS' : 'color: #FF0000;' + ,'DELIMITERS' : 'color: #0000FF;' + + } +}; diff --git a/includes/edit_area/reg_syntax/brainfuck.js b/includes/edit_area/reg_syntax/brainfuck.js new file mode 100644 index 0000000000..3625f701ed --- /dev/null +++ b/includes/edit_area/reg_syntax/brainfuck.js @@ -0,0 +1,44 @@ +editAreaLoader.load_syntax["brainfuck"] = { + 'COMMENT_SINGLE' : {} + ,'COMMENT_MULTI' : {} + ,'QUOTEMARKS' : {} + ,'KEYWORD_CASE_SENSITIVE' : true + ,'OPERATORS' :[ + '+', '-' + ] + ,'DELIMITERS' :[ + '[', ']' + ] + ,'REGEXPS' : { + 'bfispis' : { + 'search' : '()(\\.)()' + ,'class' : 'bfispis' + ,'modifiers' : 'g' + ,'execute' : 'before' + } + ,'bfupis' : { + 'search' : '()(\\,)()' + ,'class' : 'bfupis' + ,'modifiers' : 'g' + ,'execute' : 'before' + } + ,'bfmemory' : { + 'search' : '()([<>])()' + ,'class' : 'bfmemory' + ,'modifiers' : 'g' + ,'execute' : 'before' + } + } + ,'STYLES' : { + 'COMMENTS': 'color: #AAAAAA;' + ,'QUOTESMARKS': 'color: #6381F8;' + ,'OPERATORS' : 'color: #88AA00;' + ,'DELIMITERS' : 'color: #00C138;' + ,'REGEXPS' : { + 'bfispis' : 'color: #EE0000;' + ,'bfupis' : 'color: #4455ee;' + ,'bfmemory' : 'color: #DD00DD;' + } + } +}; + diff --git a/includes/edit_area/reg_syntax/c.js b/includes/edit_area/reg_syntax/c.js new file mode 100644 index 0000000000..d4e5771222 --- /dev/null +++ b/includes/edit_area/reg_syntax/c.js @@ -0,0 +1,62 @@ +editAreaLoader.load_syntax["c"] = { + 'COMMENT_SINGLE' : {1 : '//'} + ,'COMMENT_MULTI' : {'/*' : '*/'} + ,'QUOTEMARKS' : {1: "'", 2: '"'} + ,'KEYWORD_CASE_SENSITIVE' : true + ,'KEYWORDS' : { + 'constants' : [ + 'NULL', 'false', 'stdin', 'stdout', 'stderr', 'true' + ] + ,'types' : [ + 'FILE', 'auto', 'char', 'const', 'double', + 'extern', 'float', 'inline', 'int', 'long', 'register', + 'short', 'signed', 'size_t', 'static', 'struct', + 'time_t', 'typedef', 'union', 'unsigned', 'void', + 'volatile' + ] + ,'statements' : [ + 'do', 'else', 'enum', 'for', 'goto', 'if', 'sizeof', + 'switch', 'while' + ] + ,'keywords' : [ + 'break', 'case', 'continue', 'default', 'delete', + 'return' + ] + } + ,'OPERATORS' :[ + '+', '-', '/', '*', '=', '<', '>', '%', '!', '?', ':', '&' + ] + ,'DELIMITERS' :[ + '(', ')', '[', ']', '{', '}' + ] + ,'REGEXPS' : { + 'precompiler' : { + 'search' : '()(#[^\r\n]*)()' + ,'class' : 'precompiler' + ,'modifiers' : 'g' + ,'execute' : 'before' + } +/* ,'precompilerstring' : { + 'search' : '(#[\t ]*include[\t ]*)([^\r\n]*)([^\r\n]*[\r\n])' + ,'class' : 'precompilerstring' + ,'modifiers' : 'g' + ,'execute' : 'before' + }*/ + } + ,'STYLES' : { + 'COMMENTS': 'color: #AAAAAA;' + ,'QUOTESMARKS': 'color: #6381F8;' + ,'KEYWORDS' : { + 'constants' : 'color: #EE0000;' + ,'types' : 'color: #0000EE;' + ,'statements' : 'color: #60CA00;' + ,'keywords' : 'color: #48BDDF;' + } + ,'OPERATORS' : 'color: #FF00FF;' + ,'DELIMITERS' : 'color: #0038E1;' + ,'REGEXPS' : { + 'precompiler' : 'color: #009900;' + ,'precompilerstring' : 'color: #994400;' + } + } +}; diff --git a/includes/edit_area/reg_syntax/coldfusion.js b/includes/edit_area/reg_syntax/coldfusion.js new file mode 100644 index 0000000000..2092f50674 --- /dev/null +++ b/includes/edit_area/reg_syntax/coldfusion.js @@ -0,0 +1,119 @@ +editAreaLoader.load_syntax["coldfusion"] = { + 'COMMENT_SINGLE' : {1 : '//', 2 : '#'} + ,'COMMENT_MULTI' : {''} + ,'COMMENT_MULTI2' : {''} + ,'QUOTEMARKS' : {1: "'", 2: '"'} + ,'KEYWORD_CASE_SENSITIVE' : false + ,'KEYWORDS' : { + 'statements' : [ + 'include', 'require', 'include_once', 'require_once', + 'for', 'foreach', 'as', 'if', 'elseif', 'else', 'while', 'do', 'endwhile', + 'endif', 'switch', 'case', 'endswitch', + 'return', 'break', 'continue' + ] + ,'reserved' : [ + 'AND', 'break', 'case', 'CONTAIN', 'CONTAINS', 'continue', 'default', 'do', + 'DOES', 'else', 'EQ', 'EQUAL', 'EQUALTO', 'EQV', 'FALSE', 'for', 'GE', + 'GREATER', 'GT', 'GTE', 'if', 'IMP', 'in', 'IS', 'LE', 'LESS', 'LT', 'LTE', + 'MOD', 'NEQ', 'NOT', 'OR', 'return', 'switch', 'THAN', 'TO', 'TRUE', 'var', + 'while', 'XOR' + ] + ,'functions' : [ + 'Abs', 'ACos', 'ArrayAppend', 'ArrayAvg', 'ArrayClear', 'ArrayDeleteAt', 'ArrayInsertAt', + 'ArrayIsEmpty', 'ArrayLen', 'ArrayMax', 'ArrayMin', 'ArrayNew', 'ArrayPrepend', 'ArrayResize', + 'ArraySet', 'ArraySort', 'ArraySum', 'ArraySwap', 'ArrayToList', 'Asc', 'ASin', 'Atn', 'AuthenticatedContext', + 'AuthenticatedUser', 'BitAnd', 'BitMaskClear', 'BitMaskRead', 'BitMaskSet', 'BitNot', 'BitOr', + 'BitSHLN', 'BitSHRN', 'BitXor', 'Ceiling', 'Chr', 'CJustify', 'Compare', 'CompareNoCase', 'Cos', + 'CreateDate', 'CreateDateTime', 'CreateODBCDate', 'CreateODBCDateTime', 'CreateODBCTime', + 'CreateTime', 'CreateTimeSpan', 'DateAdd', 'DateCompare', 'DateConvert', 'DateDiff', + 'DateFormat', 'DatePart', 'Day', 'DayOfWeek', 'DayOfWeekAsString', 'DayOfYear', 'DaysInMonth', + 'DaysInYear', 'DE', 'DecimalFormat', 'DecrementValue', 'Decrypt', 'DeleteClientVariable', + 'DirectoryExists', 'DollarFormat', 'Duplicate', 'Encrypt', 'Evaluate', 'Exp', 'ExpandPath', + 'FileExists', 'Find', 'FindNoCase', 'FindOneOf', 'FirstDayOfMonth', 'Fix', 'FormatBaseN', + 'GetBaseTagData', 'GetBaseTagList', 'GetBaseTemplatePath', 'GetClientVariablesList', + 'GetCurrentTemplatePath', 'GetDirectoryFromPath', 'GetException', 'GetFileFromPath', + 'GetFunctionList', 'GetHttpTimeString', 'GetHttpRequestData', 'GetLocale', 'GetMetricData', + 'GetProfileString', 'GetTempDirectory', 'GetTempFile', 'GetTemplatePath', 'GetTickCount', + 'GetTimeZoneInfo', 'GetToken', 'Hash', 'Hour', 'HTMLCodeFormat', 'HTMLEditFormat', 'IIf', + 'IncrementValue', 'InputBaseN', 'Insert', 'Int', 'IsArray', 'IsAuthenticated', 'IsAuthorized', + 'IsBoolean', 'IsBinary', 'IsCustomFunction', 'IsDate', 'IsDebugMode', 'IsDefined', 'IsLeapYear', + 'IsNumeric', 'IsNumericDate', 'IsProtected', 'IsQuery', 'IsSimpleValue', 'IsStruct', 'IsWDDX', + 'JavaCast', 'JSStringFormat', 'LCase', 'Left', 'Len', 'ListAppend', 'ListChangeDelims', + 'ListContains', 'ListContainsNoCase', 'ListDeleteAt', 'ListFind', 'ListFindNoCase', 'ListFirst', + 'ListGetAt', 'ListInsertAt', 'ListLast', 'ListLen', 'ListPrepend', 'ListQualify', 'ListRest', + 'ListSetAt', 'ListSort', 'ListToArray', 'ListValueCount', 'ListValueCountNoCase', 'LJustify', + 'Log', 'Log10', 'LSCurrencyFormat', 'LSDateFormat', 'LSEuroCurrencyFormat', 'LSIsCurrency', + 'LSIsDate', 'LSIsNumeric', 'LSNumberFormat', 'LSParseCurrency', 'LSParseDateTime', 'LSParseNumber', + 'LSTimeFormat', 'LTrim', 'Max', 'Mid', 'Min', 'Minute', 'Month', 'MonthAsString', 'Now', 'NumberFormat', + 'ParagraphFormat', 'ParameterExists', 'ParseDateTime', 'Pi', 'PreserveSingleQuotes', 'Quarter', + 'QueryAddRow', 'QueryNew', 'QuerySetCell', 'QuotedValueList', 'Rand', 'Randomize', 'RandRange', + 'REFind', 'REFindNoCase', 'RemoveChars', 'RepeatString', 'Replace', 'ReplaceList', 'ReplaceNoCase', + 'REReplace', 'REReplaceNoCase', 'Reverse', 'Right', 'RJustify', 'Round', 'RTrim', 'Second', 'SetLocale', + 'SetProfileString', 'SetVariable', 'Sgn', 'Sin', 'SpanExcluding', 'SpanIncluding', 'Sqr', 'StripCR', + 'StructAppend', 'StructClear', 'StructCopy', 'StructCount', 'StructDelete', 'StructFind', 'StructFindKey', + 'StructFindValue', 'StructGet', 'StructInsert', 'StructIsEmpty', 'StructKeyArray', 'StructKeyExists', + 'StructKeyList', 'StructNew', 'StructSort', 'StructUpdate', 'Tan', 'TimeFormat', 'ToBase64', 'ToBinary', + 'ToString', 'Trim', 'UCase', 'URLDecode', 'URLEncodedFormat', 'Val', 'ValueList', 'Week', 'WriteOutput', + 'XMLFormat', 'Year', 'YesNoFormat' + ] + } + ,'OPERATORS' :[ + '+', '-', '/', '*', '%', '!', '&&', '||' + ] + ,'DELIMITERS' :[ + '(', ')', '[', ']', '{', '}' + ] + ,'REGEXPS' : { + 'doctype' : { + 'search' : '()(]*>)()' + ,'class' : 'doctype' + ,'modifiers' : '' + ,'execute' : 'before' // before or after + } + ,'cftags' : { + 'search' : '(<)(/cf[a-z][^ \r\n\t>]*)([^>]*>)' + ,'class' : 'cftags' + ,'modifiers' : 'gi' + ,'execute' : 'before' // before or after + } + ,'cftags2' : { + 'search' : '(<)(cf[a-z][^ \r\n\t>]*)([^>]*>)' + ,'class' : 'cftags2' + ,'modifiers' : 'gi' + ,'execute' : 'before' // before or after + } + ,'tags' : { + 'search' : '(<)(/?[a-z][^ \r\n\t>]*)([^>]*>)' + ,'class' : 'tags' + ,'modifiers' : 'gi' + ,'execute' : 'before' // before or after + } + ,'attributes' : { + 'search' : '( |\n|\r|\t)([^ \r\n\t=]+)(=)' + ,'class' : 'attributes' + ,'modifiers' : 'g' + ,'execute' : 'before' // before or after + } + } + ,'STYLES' : { + 'COMMENTS': 'color: #AAAAAA;' + ,'QUOTESMARKS': 'color: #6381F8;' + ,'KEYWORDS' : { + 'reserved' : 'color: #48BDDF;' + ,'functions' : 'color: #0000FF;' + ,'statements' : 'color: #60CA00;' + } + ,'OPERATORS' : 'color: #E775F0;' + ,'DELIMITERS' : '' + ,'REGEXPS' : { + 'attributes': 'color: #990033;' + ,'cftags': 'color: #990033;' + ,'cftags2': 'color: #990033;' + ,'tags': 'color: #000099;' + ,'doctype': 'color: #8DCFB5;' + ,'test': 'color: #00FF00;' + } + } +}; + + diff --git a/includes/edit_area/reg_syntax/cpp.js b/includes/edit_area/reg_syntax/cpp.js new file mode 100644 index 0000000000..e5e2be0619 --- /dev/null +++ b/includes/edit_area/reg_syntax/cpp.js @@ -0,0 +1,65 @@ +editAreaLoader.load_syntax["cpp"] = { + 'COMMENT_SINGLE' : {1 : '//'} + ,'COMMENT_MULTI' : {'/*' : '*/'} + ,'QUOTEMARKS' : {1: "'", 2: '"'} + ,'KEYWORD_CASE_SENSITIVE' : true + ,'KEYWORDS' : { + 'constants' : [ + 'NULL', 'false', 'std', 'stdin', 'stdout', 'stderr', + 'true' + ] + ,'types' : [ + 'FILE', 'auto', 'char', 'class', 'const', 'double', + 'extern', 'float', 'friend', 'inline', 'int', + 'iterator', 'long', 'map', 'operator', 'queue', + 'register', 'short', 'signed', 'size_t', 'stack', + 'static', 'string', 'struct', 'time_t', 'typedef', + 'union', 'unsigned', 'vector', 'void', 'volatile' + ] + ,'statements' : [ + 'catch', 'do', 'else', 'enum', 'for', 'goto', 'if', + 'sizeof', 'switch', 'this', 'throw', 'try', 'while' + ] + ,'keywords' : [ + 'break', 'case', 'continue', 'default', 'delete', + 'namespace', 'new', 'private', 'protected', 'public', + 'return', 'using' + ] + } + ,'OPERATORS' :[ + '+', '-', '/', '*', '=', '<', '>', '%', '!', '?', ':', '&' + ] + ,'DELIMITERS' :[ + '(', ')', '[', ']', '{', '}' + ] + ,'REGEXPS' : { + 'precompiler' : { + 'search' : '()(#[^\r\n]*)()' + ,'class' : 'precompiler' + ,'modifiers' : 'g' + ,'execute' : 'before' + } +/* ,'precompilerstring' : { + 'search' : '(#[\t ]*include[\t ]*)([^\r\n]*)([^\r\n]*[\r\n])' + ,'class' : 'precompilerstring' + ,'modifiers' : 'g' + ,'execute' : 'before' + }*/ + } + ,'STYLES' : { + 'COMMENTS': 'color: #AAAAAA;' + ,'QUOTESMARKS': 'color: #6381F8;' + ,'KEYWORDS' : { + 'constants' : 'color: #EE0000;' + ,'types' : 'color: #0000EE;' + ,'statements' : 'color: #60CA00;' + ,'keywords' : 'color: #48BDDF;' + } + ,'OPERATORS' : 'color: #FF00FF;' + ,'DELIMITERS' : 'color: #0038E1;' + ,'REGEXPS' : { + 'precompiler' : 'color: #009900;' + ,'precompilerstring' : 'color: #994400;' + } + } +}; diff --git a/includes/edit_area/reg_syntax/css.js b/includes/edit_area/reg_syntax/css.js new file mode 100644 index 0000000000..b8131ccdd5 --- /dev/null +++ b/includes/edit_area/reg_syntax/css.js @@ -0,0 +1,84 @@ +editAreaLoader.load_syntax["css"] = { + 'COMMENT_SINGLE' : {1 : '@'} + ,'COMMENT_MULTI' : {'/*' : '*/'} + ,'QUOTEMARKS' : ['"', "'"] + ,'KEYWORD_CASE_SENSITIVE' : false + ,'KEYWORDS' : { + 'attributes' : [ + 'aqua', 'azimuth', 'background-attachment', 'background-color', + 'background-image', 'background-position', 'background-repeat', + 'background', 'border-bottom-color', 'border-bottom-style', + 'border-bottom-width', 'border-left-color', 'border-left-style', + 'border-left-width', 'border-right', 'border-right-color', + 'border-right-style', 'border-right-width', 'border-top-color', + 'border-top-style', 'border-top-width','border-bottom', 'border-collapse', + 'border-left', 'border-width', 'border-color', 'border-spacing', + 'border-style', 'border-top', 'border', 'caption-side', + 'clear', 'clip', 'color', 'content', 'counter-increment', 'counter-reset', + 'cue-after', 'cue-before', 'cue', 'cursor', 'direction', 'display', + 'elevation', 'empty-cells', 'float', 'font-family', 'font-size', + 'font-size-adjust', 'font-stretch', 'font-style', 'font-variant', + 'font-weight', 'font', 'height', 'letter-spacing', 'line-height', + 'list-style', 'list-style-image', 'list-style-position', 'list-style-type', + 'margin-bottom', 'margin-left', 'margin-right', 'margin-top', 'margin', + 'marker-offset', 'marks', 'max-height', 'max-width', 'min-height', + 'min-width', 'opacity', 'orphans', 'outline', 'outline-color', 'outline-style', + 'outline-width', 'overflow', 'padding-bottom', 'padding-left', + 'padding-right', 'padding-top', 'padding', 'page', 'page-break-after', + 'page-break-before', 'page-break-inside', 'pause-after', 'pause-before', + 'pause', 'pitch', 'pitch-range', 'play-during', 'position', 'quotes', + 'richness', 'right', 'size', 'speak-header', 'speak-numeral', 'speak-punctuation', + 'speak', 'speech-rate', 'stress', 'table-layout', 'text-align', 'text-decoration', + 'text-indent', 'text-shadow', 'text-transform', 'top', 'unicode-bidi', + 'vertical-align', 'visibility', 'voice-family', 'volume', 'white-space', 'widows', + 'width', 'word-spacing', 'z-index', 'bottom', 'left' + ] + ,'values' : [ + 'above', 'absolute', 'always', 'armenian', 'aural', 'auto', 'avoid', + 'baseline', 'behind', 'below', 'bidi-override', 'black', 'blue', 'blink', 'block', 'bold', 'bolder', 'both', + 'capitalize', 'center-left', 'center-right', 'center', 'circle', 'cjk-ideographic', + 'close-quote', 'collapse', 'condensed', 'continuous', 'crop', 'crosshair', 'cross', 'cursive', + 'dashed', 'decimal-leading-zero', 'decimal', 'default', 'digits', 'disc', 'dotted', 'double', + 'e-resize', 'embed', 'extra-condensed', 'extra-expanded', 'expanded', + 'fantasy', 'far-left', 'far-right', 'faster', 'fast', 'fixed', 'fuchsia', + 'georgian', 'gray', 'green', 'groove', 'hebrew', 'help', 'hidden', 'hide', 'higher', + 'high', 'hiragana-iroha', 'hiragana', 'icon', 'inherit', 'inline-table', 'inline', + 'inset', 'inside', 'invert', 'italic', 'justify', 'katakana-iroha', 'katakana', + 'landscape', 'larger', 'large', 'left-side', 'leftwards', 'level', 'lighter', 'lime', 'line-through', 'list-item', 'loud', 'lower-alpha', 'lower-greek', 'lower-roman', 'lowercase', 'ltr', 'lower', 'low', + 'maroon', 'medium', 'message-box', 'middle', 'mix', 'monospace', + 'n-resize', 'narrower', 'navy', 'ne-resize', 'no-close-quote', 'no-open-quote', 'no-repeat', 'none', 'normal', 'nowrap', 'nw-resize', + 'oblique', 'olive', 'once', 'open-quote', 'outset', 'outside', 'overline', + 'pointer', 'portrait', 'purple', 'px', + 'red', 'relative', 'repeat-x', 'repeat-y', 'repeat', 'rgb', 'ridge', 'right-side', 'rightwards', + 's-resize', 'sans-serif', 'scroll', 'se-resize', 'semi-condensed', 'semi-expanded', 'separate', 'serif', 'show', 'silent', 'silver', 'slow', 'slower', 'small-caps', 'small-caption', 'smaller', 'soft', 'solid', 'spell-out', 'square', + 'static', 'status-bar', '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', 'text-bottom', 'text-top', 'thick', 'thin', 'transparent', + 'ultra-condensed', 'ultra-expanded', 'underline', 'upper-alpha', 'upper-latin', 'upper-roman', 'uppercase', 'url', + 'visible', + 'w-resize', 'wait', 'white', 'wider', + 'x-fast', 'x-high', 'x-large', 'x-loud', 'x-low', 'x-small', 'x-soft', 'xx-large', 'xx-small', + 'yellow', 'yes' + ] + ,'specials' : [ + 'important' + ] + } + ,'OPERATORS' :[ + ':', ';', '!', '.', '#' + ] + ,'DELIMITERS' :[ + '{', '}' + ] + ,'STYLES' : { + 'COMMENTS': 'color: #AAAAAA;' + ,'QUOTESMARKS': 'color: #6381F8;' + ,'KEYWORDS' : { + 'attributes' : 'color: #48BDDF;' + ,'values' : 'color: #2B60FF;' + ,'specials' : 'color: #FF0000;' + } + ,'OPERATORS' : 'color: #FF00FF;' + ,'DELIMITERS' : 'color: #60CA00;' + + } +}; diff --git a/includes/edit_area/reg_syntax/html.js b/includes/edit_area/reg_syntax/html.js new file mode 100644 index 0000000000..cc2a90e6ec --- /dev/null +++ b/includes/edit_area/reg_syntax/html.js @@ -0,0 +1,50 @@ +/* +* last update: 2006-08-24 +*/ + +editAreaLoader.load_syntax["html"] = { + 'COMMENT_SINGLE' : {} + ,'COMMENT_MULTI' : {''} + ,'QUOTEMARKS' : {1: "'", 2: '"'} + ,'KEYWORD_CASE_SENSITIVE' : false + ,'KEYWORDS' : { + } + ,'OPERATORS' :[ + ] + ,'DELIMITERS' :[ + ] + ,'REGEXPS' : { + 'doctype' : { + 'search' : '()(]*>)()' + ,'class' : 'doctype' + ,'modifiers' : '' + ,'execute' : 'before' // before or after + } + ,'tags' : { + 'search' : '(<)(/?[a-z][^ \r\n\t>]*)([^>]*>)' + ,'class' : 'tags' + ,'modifiers' : 'gi' + ,'execute' : 'before' // before or after + } + ,'attributes' : { + 'search' : '( |\n|\r|\t)([^ \r\n\t=]+)(=)' + ,'class' : 'attributes' + ,'modifiers' : 'g' + ,'execute' : 'before' // before or after + } + } + ,'STYLES' : { + 'COMMENTS': 'color: #AAAAAA;' + ,'QUOTESMARKS': 'color: #6381F8;' + ,'KEYWORDS' : { + } + ,'OPERATORS' : 'color: #E775F0;' + ,'DELIMITERS' : '' + ,'REGEXPS' : { + 'attributes': 'color: #B1AC41;' + ,'tags': 'color: #E62253;' + ,'doctype': 'color: #8DCFB5;' + ,'test': 'color: #00FF00;' + } + } +}; diff --git a/includes/edit_area/reg_syntax/java.js b/includes/edit_area/reg_syntax/java.js new file mode 100644 index 0000000000..2018c66722 --- /dev/null +++ b/includes/edit_area/reg_syntax/java.js @@ -0,0 +1,56 @@ +editAreaLoader.load_syntax["java"] = { +'COMMENT_SINGLE': { 1: '//', 2: '@' } + , 'COMMENT_MULTI': { '/*': '*/' } + , 'QUOTEMARKS': { 1: "'", 2: '"' } + , 'KEYWORD_CASE_SENSITIVE': true + , 'KEYWORDS': { + 'constants': [ + 'null', 'false', 'true' + ] + , 'types': [ + 'String', 'int', 'short', 'long', 'char', 'double', 'byte', + 'float', 'static', 'void', 'private', 'boolean', 'protected', + 'public', 'const', 'class', 'final', 'abstract', 'volatile', + 'enum', 'transient', 'interface' + ] + , 'statements': [ + 'this', 'extends', 'if', 'do', 'while', 'try', 'catch', 'finally', + 'throw', 'throws', 'else', 'for', 'switch', 'continue', 'implements', + 'break', 'case', 'default', 'goto' + ] + , 'keywords': [ + 'new', 'return', 'import', 'native', 'super', 'package', 'assert', 'synchronized', + 'instanceof', 'strictfp' + ] + } + , 'OPERATORS': [ + '+', '-', '/', '*', '=', '<', '>', '%', '!', '?', ':', '&' + ] + , 'DELIMITERS': [ + '(', ')', '[', ']', '{', '}' + ] + , 'REGEXPS': { + 'precompiler': { + 'search': '()(#[^\r\n]*)()' + , 'class': 'precompiler' + , 'modifiers': 'g' + , 'execute': 'before' + } + } + , 'STYLES': { + 'COMMENTS': 'color: #AAAAAA;' + , 'QUOTESMARKS': 'color: #6381F8;' + , 'KEYWORDS': { + 'constants': 'color: #EE0000;' + , 'types': 'color: #0000EE;' + , 'statements': 'color: #60CA00;' + , 'keywords': 'color: #48BDDF;' + } + , 'OPERATORS': 'color: #FF00FF;' + , 'DELIMITERS': 'color: #0038E1;' + , 'REGEXPS': { + 'precompiler': 'color: #009900;' + , 'precompilerstring': 'color: #994400;' + } + } +}; diff --git a/includes/edit_area/reg_syntax/js.js b/includes/edit_area/reg_syntax/js.js new file mode 100644 index 0000000000..eaa7a036cc --- /dev/null +++ b/includes/edit_area/reg_syntax/js.js @@ -0,0 +1,93 @@ +editAreaLoader.load_syntax["js"] = { + 'COMMENT_SINGLE' : {1 : '//'} + ,'COMMENT_MULTI' : {'/*' : '*/'} + ,'QUOTEMARKS' : {1: "'", 2: '"'} + ,'KEYWORD_CASE_SENSITIVE' : false + ,'KEYWORDS' : { + 'statements' : [ + 'as', 'break', 'case', 'catch', 'continue', 'decodeURI', 'delete', 'do', + 'else', 'encodeURI', 'eval', 'finally', 'for', 'if', 'in', 'is', 'item', + 'instanceof', 'return', 'switch', 'this', 'throw', 'try', 'typeof', 'void', + 'while', 'write', 'with' + ] + ,'keywords' : [ + 'class', 'const', 'default', 'debugger', 'export', 'extends', 'false', + 'function', 'import', 'namespace', 'new', 'null', 'package', 'private', + 'protected', 'public', 'super', 'true', 'use', 'var', 'window', 'document', + // the list below must be sorted and checked (if it is a keywords or a function and if it is not present twice + 'Link ', 'outerHeight ', 'Anchor', 'FileUpload', + 'location', 'outerWidth', 'Select', 'Area', 'find', 'Location', 'Packages', 'self', + 'arguments', 'locationbar', 'pageXoffset', 'Form', + 'Math', 'pageYoffset', 'setTimeout', 'assign', 'Frame', 'menubar', 'parent', 'status', + 'blur', 'frames', 'MimeType', 'parseFloat', 'statusbar', 'Boolean', 'Function', 'moveBy', + 'parseInt', 'stop', 'Button', 'getClass', 'moveTo', 'Password', 'String', 'callee', 'Hidden', + 'name', 'personalbar', 'Submit', 'caller', 'history', 'NaN', 'Plugin', 'sun', 'captureEvents', + 'History', 'navigate', 'print', 'taint', 'Checkbox', 'home', 'navigator', 'prompt', 'Text', + 'Image', 'Navigator', 'prototype', 'Textarea', 'clearTimeout', 'Infinity', + 'netscape', 'Radio', 'toolbar', 'close', 'innerHeight', 'Number', 'ref', 'top', 'closed', + 'innerWidth', 'Object', 'RegExp', 'toString', 'confirm', 'isFinite', 'onBlur', 'releaseEvents', + 'unescape', 'constructor', 'isNan', 'onError', 'Reset', 'untaint', 'Date', 'java', 'onFocus', + 'resizeBy', 'unwatch', 'defaultStatus', 'JavaArray', 'onLoad', 'resizeTo', 'valueOf', 'document', + 'JavaClass', 'onUnload', 'routeEvent', 'watch', 'Document', 'JavaObject', 'open', 'scroll', 'window', + 'Element', 'JavaPackage', 'opener', 'scrollbars', 'Window', 'escape', 'length', 'Option', 'scrollBy' + ] + ,'functions' : [ + // common functions for Window object + 'alert', 'Array', 'back', 'blur', 'clearInterval', 'close', 'confirm', 'eval ', 'focus', 'forward', 'home', + 'name', 'navigate', 'onblur', 'onerror', 'onfocus', 'onload', 'onmove', + 'onresize', 'onunload', 'open', 'print', 'prompt', 'scroll', 'scrollTo', 'setInterval', 'status', + 'stop' + ] + } + ,'OPERATORS' :[ + '+', '-', '/', '*', '=', '<', '>', '%', '!' + ] + ,'DELIMITERS' :[ + '(', ')', '[', ']', '{', '}' + ] + ,'STYLES' : { + 'COMMENTS': 'color: #AAAAAA;' + ,'QUOTESMARKS': 'color: #6381F8;' + ,'KEYWORDS' : { + 'statements' : 'color: #60CA00;' + ,'keywords' : 'color: #48BDDF;' + ,'functions' : 'color: #2B60FF;' + } + ,'OPERATORS' : 'color: #FF00FF;' + ,'DELIMITERS' : 'color: #0038E1;' + + } + ,'AUTO_COMPLETION' : { + "default": { // the name of this definition group. It's posisble to have different rules inside the same definition file + "REGEXP": { "before_word": "[^a-zA-Z0-9_]|^" // \\s|\\.| + ,"possible_words_letters": "[a-zA-Z0-9_]+" + ,"letter_after_word_must_match": "[^a-zA-Z0-9_]|$" + ,"prefix_separator": "\\." + } + ,"CASE_SENSITIVE": true + ,"MAX_TEXT_LENGTH": 100 // the maximum length of the text being analyzed before the cursor position + ,"KEYWORDS": { + '': [ // the prefix of thoses items + /** + * 0 : the keyword the user is typing + * 1 : (optionnal) the string inserted in code ("{@}" being the new position of the cursor, "§" beeing the equivalent to the value the typed string indicated if the previous ) + * If empty the keyword will be displayed + * 2 : (optionnal) the text that appear in the suggestion box (if empty, the string to insert will be displayed) + */ + ['Array', '§()', ''] + ,['alert', '§({@})', 'alert(String message)'] + ,['document'] + ,['window'] + ] + ,'window' : [ + ['location'] + ,['document'] + ,['scrollTo', 'scrollTo({@})', 'scrollTo(Int x,Int y)'] + ] + ,'location' : [ + ['href'] + ] + } + } + } +}; diff --git a/includes/edit_area/reg_syntax/pas.js b/includes/edit_area/reg_syntax/pas.js new file mode 100644 index 0000000000..2038539f54 --- /dev/null +++ b/includes/edit_area/reg_syntax/pas.js @@ -0,0 +1,82 @@ +editAreaLoader.load_syntax["pas"] = { + 'COMMENT_SINGLE' : {} + ,'COMMENT_MULTI' : {'{' : '}', '(*':'*)'} + ,'QUOTEMARKS' : {1: '"', 2: "'"} + ,'KEYWORD_CASE_SENSITIVE' : false + ,'KEYWORDS' : { + 'constants' : [ + 'Blink', 'Black', 'Blue', 'Green', 'Cyan', 'Red', + 'Magenta', 'Brown', 'LightGray', 'DarkGray', + 'LightBlue', 'LightGreen', 'LightCyan', 'LightRed', + 'LightMagenta', 'Yellow', 'White', 'MaxSIntValue', + 'MaxUIntValue', 'maxint', 'maxLongint', 'maxSmallint', + 'erroraddr', 'errorcode', 'LineEnding' + ] + ,'keywords' : [ + 'in', 'or', 'div', 'mod', 'and', 'shl', 'shr', 'xor', + 'pow', 'is', 'not','Absolute', 'And_then', 'Array', + 'Begin', 'Bindable', 'Case', 'Const', 'Do', 'Downto', + 'Else', 'End', 'Export', 'File', 'For', 'Function', + 'Goto', 'If', 'Import', 'Implementation', 'Inherited', + 'Inline', 'Interface', 'Label', 'Module', 'Nil', + 'Object', 'Of', 'Only', 'Operator', 'Or_else', + 'Otherwise', 'Packed', 'Procedure', 'Program', + 'Protected', 'Qualified', 'Record', 'Repeat', + 'Restricted', 'Set', 'Then', 'To', 'Type', 'Unit', + 'Until', 'Uses', 'Value', 'Var', 'Virtual', 'While', + 'With' + ] + ,'functions' : [ + 'Abs', 'Addr', 'Append', 'Arctan', 'Assert', 'Assign', + 'Assigned', 'BinStr', 'Blockread', 'Blockwrite', + 'Break', 'Chdir', 'Chr', 'Close', 'CompareByte', + 'CompareChar', 'CompareDWord', 'CompareWord', 'Concat', + 'Continue', 'Copy', 'Cos', 'CSeg', 'Dec', 'Delete', + 'Dispose', 'DSeg', 'Eof', 'Eoln', 'Erase', 'Exclude', + 'Exit', 'Exp', 'Filepos', 'Filesize', 'FillByte', + 'Fillchar', 'FillDWord', 'Fillword', 'Flush', 'Frac', + 'Freemem', 'Getdir', 'Getmem', 'GetMemoryManager', + 'Halt', 'HexStr', 'Hi', 'High', 'Inc', 'Include', + 'IndexByte', 'IndexChar', 'IndexDWord', 'IndexWord', + 'Insert', 'IsMemoryManagerSet', 'Int', 'IOresult', + 'Length', 'Ln', 'Lo', 'LongJmp', 'Low', 'Lowercase', + 'Mark', 'Maxavail', 'Memavail', 'Mkdir', 'Move', + 'MoveChar0', 'New', 'Odd', 'OctStr', 'Ofs', 'Ord', + 'Paramcount', 'Paramstr', 'Pi', 'Pos', 'Power', 'Pred', + 'Ptr', 'Random', 'Randomize', 'Read', 'Readln', + 'Real2Double', 'Release', 'Rename', 'Reset', 'Rewrite', + 'Rmdir', 'Round', 'Runerror', 'Seek', 'SeekEof', + 'SeekEoln', 'Seg', 'SetMemoryManager', 'SetJmp', + 'SetLength', 'SetString', 'SetTextBuf', 'Sin', 'SizeOf', + 'Sptr', 'Sqr', 'Sqrt', 'SSeg', 'Str', 'StringOfChar', + 'Succ', 'Swap', 'Trunc', 'Truncate', 'Upcase', 'Val', + 'Write', 'WriteLn' + ] + ,'types' : [ + 'Integer', 'Shortint', 'SmallInt', 'Longint', + 'Longword', 'Int64', 'Byte', 'Word', 'Cardinal', + 'QWord', 'Boolean', 'ByteBool', 'LongBool', 'Char', + 'Real', 'Single', 'Double', 'Extended', 'Comp', + 'String', 'ShortString', 'AnsiString', 'PChar' + ] + } + ,'OPERATORS' :[ + '@', '*', '+', '-', '/', '^', ':=', '<', '=', '>' + ] + ,'DELIMITERS' :[ + '(', ')', '[', ']' + ] + ,'STYLES' : { + 'COMMENTS': 'color: #AAAAAA;' + ,'QUOTESMARKS': 'color: #6381F8;' + ,'KEYWORDS' : { + 'specials' : 'color: #EE0000;' + ,'constants' : 'color: #654321;' + ,'keywords' : 'color: #48BDDF;' + ,'functions' : 'color: #449922;' + ,'types' : 'color: #2B60FF;' + } + ,'OPERATORS' : 'color: #FF00FF;' + ,'DELIMITERS' : 'color: #60CA00;' + } +}; diff --git a/includes/edit_area/reg_syntax/perl.js b/includes/edit_area/reg_syntax/perl.js new file mode 100644 index 0000000000..fca542811f --- /dev/null +++ b/includes/edit_area/reg_syntax/perl.js @@ -0,0 +1,88 @@ +/*************************************************************************** + * (c) 2008 - file created by Christoph Pinkel, MTC Infomedia OHG. + * + * You may choose any license of the current release or any future release + * of editarea to use, modify and/or redistribute this file. + * + * This language specification file supports for syntax checking on + * a large subset of Perl 5.x. + * The basic common syntax of Perl is fully supported, but as for + * the highlighting of built-in operations, it's mainly designed + * to support for hightlighting Perl code in a Safe environment (compartment) + * as used by CoMaNet for evaluation of administrative scripts. This Safe + * compartment basically allows for all of Opcode's :default operations, + * but little others. See http://perldoc.perl.org/Opcode.html to learn + * more. + ***************************************************************************/ + +editAreaLoader.load_syntax["perl"] = { + + 'COMMENT_SINGLE' : {1 : '#'}, + 'QUOTEMARKS' : {1: "'", 2: '"'}, + 'KEYWORD_CASE_SENSITIVE' : true, + 'KEYWORDS' : + { + 'core' : + [ "if", "else", "elsif", "while", "for", "each", "foreach", + "next", "last", "goto", "exists", "delete", "undef", + "my", "our", "local", "use", "require", "package", "keys", "values", + "sub", "bless", "ref", "return" ], + 'functions' : + [ + //from :base_core + "int", "hex", "oct", "abs", "substr", "vec", "study", "pos", + "length", "index", "rindex", "ord", "chr", "ucfirst", "lcfirst", + "uc", "lc", "quotemeta", "chop", "chomp", "split", "list", "splice", + "push", "pop", "shift", "unshift", "reverse", "and", "or", "dor", + "xor", "warn", "die", "prototype", + //from :base_mem + "concat", "repeat", "join", "range", + //none from :base_loop, as we'll see them as basic statements... + //from :base_orig + "sprintf", "crypt", "tie", "untie", "select", "localtime", "gmtime", + //others + "print", "open", "close" + ] + }, + 'OPERATORS' : + [ '+', '-', '/', '*', '=', '<', '>', '!', '||', '.', '&&', + ' eq ', ' ne ', '=~' ], + 'DELIMITERS' : + [ '(', ')', '[', ']', '{', '}' ], + 'REGEXPS' : + { + 'packagedecl' : { 'search': '(package )([^ \r\n\t#;]*)()', + 'class' : 'scopingnames', + 'modifiers' : 'g', 'execute' : 'before' }, + 'subdecl' : { 'search': '(sub )([^ \r\n\t#]*)()', + 'class' : 'scopingnames', + 'modifiers' : 'g', 'execute' : 'before' }, + 'scalars' : { 'search': '()(\\\$[a-zA-Z0-9_:]*)()', + 'class' : 'vars', + 'modifiers' : 'g', 'execute' : 'after' }, + 'arrays' : { 'search': '()(@[a-zA-Z0-9_:]*)()', + 'class' : 'vars', + 'modifiers' : 'g', 'execute' : 'after' }, + 'hashs' : { 'search': '()(%[a-zA-Z0-9_:]*)()', + 'class' : 'vars', + 'modifiers' : 'g', 'execute' : 'after' }, + }, + + 'STYLES' : + { + 'COMMENTS': 'color: #AAAAAA;', + 'QUOTESMARKS': 'color: #DC0000;', + 'KEYWORDS' : + { + 'core' : 'color: #8aca00;', + 'functions' : 'color: #2B60FF;' + }, + 'OPERATORS' : 'color: #8aca00;', + 'DELIMITERS' : 'color: #0038E1;', + 'REGEXPS': + { + 'scopingnames' : 'color: #ff0000;', + 'vars' : 'color: #00aaaa;', + } + } //'STYLES' +}; diff --git a/includes/edit_area/reg_syntax/php.js b/includes/edit_area/reg_syntax/php.js new file mode 100644 index 0000000000..a1c5883afa --- /dev/null +++ b/includes/edit_area/reg_syntax/php.js @@ -0,0 +1,156 @@ +editAreaLoader.load_syntax["php"] = { + 'COMMENT_SINGLE' : {1 : '//', 2 : '#'} + ,'COMMENT_MULTI' : {'/*' : '*/'} + ,'QUOTEMARKS' : {1: "'", 2: '"'} + ,'KEYWORD_CASE_SENSITIVE' : false + ,'KEYWORDS' : { + 'statements' : [ + 'include', 'require', 'include_once', 'require_once', + 'for', 'foreach', 'as', 'if', 'elseif', 'else', 'while', 'do', 'endwhile', + 'endif', 'switch', 'case', 'endswitch', + 'return', 'break', 'continue' + ] + ,'reserved' : [ + '_GET', '_POST', '_SESSION', '_SERVER', '_FILES', '_ENV', '_COOKIE', '_REQUEST', + 'null', '__LINE__', '__FILE__', + 'false', '<?php', '?>', '<?', + '<script language', '</script>', + 'true', 'var', 'default', + 'function', 'class', 'new', '&new', 'this', + '__FUNCTION__', '__CLASS__', '__METHOD__', 'PHP_VERSION', + 'PHP_OS', 'DEFAULT_INCLUDE_PATH', 'PEAR_INSTALL_DIR', 'PEAR_EXTENSION_DIR', + 'PHP_EXTENSION_DIR', 'PHP_BINDIR', 'PHP_LIBDIR', 'PHP_DATADIR', 'PHP_SYSCONFDIR', + 'PHP_LOCALSTATEDIR', 'PHP_CONFIG_FILE_PATH', 'PHP_OUTPUT_HANDLER_START', 'PHP_OUTPUT_HANDLER_CONT', + 'PHP_OUTPUT_HANDLER_END', 'E_ERROR', 'E_WARNING', 'E_PARSE', 'E_NOTICE', + 'E_CORE_ERROR', 'E_CORE_WARNING', 'E_COMPILE_ERROR', 'E_COMPILE_WARNING', 'E_USER_ERROR', + 'E_USER_WARNING', 'E_USER_NOTICE', 'E_ALL' + + ] + ,'functions' : [ + 'func_num_args', 'func_get_arg', 'func_get_args', 'strlen', 'strcmp', 'strncmp', 'strcasecmp', 'strncasecmp', 'each', 'error_reporting', 'define', 'defined', + 'trigger_error', 'user_error', 'set_error_handler', 'restore_error_handler', 'get_declared_classes', 'get_loaded_extensions', + 'extension_loaded', 'get_extension_funcs', 'debug_backtrace', + 'constant', 'bin2hex', 'sleep', 'usleep', 'time', 'mktime', 'gmmktime', 'strftime', 'gmstrftime', 'strtotime', 'date', 'gmdate', 'getdate', 'localtime', 'checkdate', 'flush', 'wordwrap', 'htmlspecialchars', 'htmlentities', 'html_entity_decode', 'md5', 'md5_file', 'crc32', 'getimagesize', 'image_type_to_mime_type', 'phpinfo', 'phpversion', 'phpcredits', 'strnatcmp', 'strnatcasecmp', 'substr_count', 'strspn', 'strcspn', 'strtok', 'strtoupper', 'strtolower', 'strpos', 'strrpos', 'strrev', 'hebrev', 'hebrevc', 'nl2br', 'basename', 'dirname', 'pathinfo', 'stripslashes', 'stripcslashes', 'strstr', 'stristr', 'strrchr', 'str_shuffle', 'str_word_count', 'strcoll', 'substr', 'substr_replace', 'quotemeta', 'ucfirst', 'ucwords', 'strtr', 'addslashes', 'addcslashes', 'rtrim', 'str_replace', 'str_repeat', 'count_chars', 'chunk_split', 'trim', 'ltrim', 'strip_tags', 'similar_text', 'explode', 'implode', 'setlocale', 'localeconv', + 'parse_str', 'str_pad', 'chop', 'strchr', 'sprintf', 'printf', 'vprintf', 'vsprintf', 'sscanf', 'fscanf', 'parse_url', 'urlencode', 'urldecode', 'rawurlencode', 'rawurldecode', 'readlink', 'linkinfo', 'link', 'unlink', 'exec', 'system', 'escapeshellcmd', 'escapeshellarg', 'passthru', 'shell_exec', 'proc_open', 'proc_close', 'rand', 'srand', 'getrandmax', 'mt_rand', 'mt_srand', 'mt_getrandmax', 'base64_decode', 'base64_encode', 'abs', 'ceil', 'floor', 'round', 'is_finite', 'is_nan', 'is_infinite', 'bindec', 'hexdec', 'octdec', 'decbin', 'decoct', 'dechex', 'base_convert', 'number_format', 'fmod', 'ip2long', 'long2ip', 'getenv', 'putenv', 'getopt', 'microtime', 'gettimeofday', 'getrusage', 'uniqid', 'quoted_printable_decode', 'set_time_limit', 'get_cfg_var', 'magic_quotes_runtime', 'set_magic_quotes_runtime', 'get_magic_quotes_gpc', 'get_magic_quotes_runtime', + 'import_request_variables', 'error_log', 'serialize', 'unserialize', 'memory_get_usage', 'var_dump', 'var_export', 'debug_zval_dump', 'print_r','highlight_file', 'show_source', 'highlight_string', 'ini_get', 'ini_get_all', 'ini_set', 'ini_alter', 'ini_restore', 'get_include_path', 'set_include_path', 'restore_include_path', 'setcookie', 'header', 'headers_sent', 'connection_aborted', 'connection_status', 'ignore_user_abort', 'parse_ini_file', 'is_uploaded_file', 'move_uploaded_file', 'intval', 'floatval', 'doubleval', 'strval', 'gettype', 'settype', 'is_null', 'is_resource', 'is_bool', 'is_long', 'is_float', 'is_int', 'is_integer', 'is_double', 'is_real', 'is_numeric', 'is_string', 'is_array', 'is_object', 'is_scalar', + 'ereg', 'ereg_replace', 'eregi', 'eregi_replace', 'split', 'spliti', 'join', 'sql_regcase', 'dl', 'pclose', 'popen', 'readfile', 'rewind', 'rmdir', 'umask', 'fclose', 'feof', 'fgetc', 'fgets', 'fgetss', 'fread', 'fopen', 'fpassthru', 'ftruncate', 'fstat', 'fseek', 'ftell', 'fflush', 'fwrite', 'fputs', 'mkdir', 'rename', 'copy', 'tempnam', 'tmpfile', 'file', 'file_get_contents', 'stream_select', 'stream_context_create', 'stream_context_set_params', 'stream_context_set_option', 'stream_context_get_options', 'stream_filter_prepend', 'stream_filter_append', 'fgetcsv', 'flock', 'get_meta_tags', 'stream_set_write_buffer', 'set_file_buffer', 'set_socket_blocking', 'stream_set_blocking', 'socket_set_blocking', 'stream_get_meta_data', 'stream_register_wrapper', 'stream_wrapper_register', 'stream_set_timeout', 'socket_set_timeout', 'socket_get_status', 'realpath', 'fnmatch', 'fsockopen', 'pfsockopen', 'pack', 'unpack', 'get_browser', 'crypt', 'opendir', 'closedir', 'chdir', 'getcwd', 'rewinddir', 'readdir', 'dir', 'glob', 'fileatime', 'filectime', 'filegroup', 'fileinode', 'filemtime', 'fileowner', 'fileperms', 'filesize', 'filetype', 'file_exists', 'is_writable', 'is_writeable', 'is_readable', 'is_executable', 'is_file', 'is_dir', 'is_link', 'stat', 'lstat', 'chown', + 'touch', 'clearstatcache', 'mail', 'ob_start', 'ob_flush', 'ob_clean', 'ob_end_flush', 'ob_end_clean', 'ob_get_flush', 'ob_get_clean', 'ob_get_length', 'ob_get_level', 'ob_get_status', 'ob_get_contents', 'ob_implicit_flush', 'ob_list_handlers', 'ksort', 'krsort', 'natsort', 'natcasesort', 'asort', 'arsort', 'sort', 'rsort', 'usort', 'uasort', 'uksort', 'shuffle', 'array_walk', 'count', 'end', 'prev', 'next', 'reset', 'current', 'key', 'min', 'max', 'in_array', 'array_search', 'extract', 'compact', 'array_fill', 'range', 'array_multisort', 'array_push', 'array_pop', 'array_shift', 'array_unshift', 'array_splice', 'array_slice', 'array_merge', 'array_merge_recursive', 'array_keys', 'array_values', 'array_count_values', 'array_reverse', 'array_reduce', 'array_pad', 'array_flip', 'array_change_key_case', 'array_rand', 'array_unique', 'array_intersect', 'array_intersect_assoc', 'array_diff', 'array_diff_assoc', 'array_sum', 'array_filter', 'array_map', 'array_chunk', 'array_key_exists', 'pos', 'sizeof', 'key_exists', 'assert', 'assert_options', 'version_compare', 'ftok', 'str_rot13', 'aggregate', + 'session_name', 'session_module_name', 'session_save_path', 'session_id', 'session_regenerate_id', 'session_decode', 'session_register', 'session_unregister', 'session_is_registered', 'session_encode', + 'session_start', 'session_destroy', 'session_unset', 'session_set_save_handler', 'session_cache_limiter', 'session_cache_expire', 'session_set_cookie_params', 'session_get_cookie_params', 'session_write_close', 'preg_match', 'preg_match_all', 'preg_replace', 'preg_replace_callback', 'preg_split', 'preg_quote', 'preg_grep', 'overload', 'ctype_alnum', 'ctype_alpha', 'ctype_cntrl', 'ctype_digit', 'ctype_lower', 'ctype_graph', 'ctype_print', 'ctype_punct', 'ctype_space', 'ctype_upper', 'ctype_xdigit', 'virtual', 'apache_request_headers', 'apache_note', 'apache_lookup_uri', 'apache_child_terminate', 'apache_setenv', 'apache_response_headers', 'apache_get_version', 'getallheaders', 'mysql_connect', 'mysql_pconnect', 'mysql_close', 'mysql_select_db', 'mysql_create_db', 'mysql_drop_db', 'mysql_query', 'mysql_unbuffered_query', 'mysql_db_query', 'mysql_list_dbs', 'mysql_list_tables', 'mysql_list_fields', 'mysql_list_processes', 'mysql_error', 'mysql_errno', 'mysql_affected_rows', 'mysql_insert_id', 'mysql_result', 'mysql_num_rows', 'mysql_num_fields', 'mysql_fetch_row', 'mysql_fetch_array', 'mysql_fetch_assoc', 'mysql_fetch_object', 'mysql_data_seek', 'mysql_fetch_lengths', 'mysql_fetch_field', 'mysql_field_seek', 'mysql_free_result', 'mysql_field_name', 'mysql_field_table', 'mysql_field_len', 'mysql_field_type', 'mysql_field_flags', 'mysql_escape_string', 'mysql_real_escape_string', 'mysql_stat', + 'mysql_thread_id', 'mysql_client_encoding', 'mysql_get_client_info', 'mysql_get_host_info', 'mysql_get_proto_info', 'mysql_get_server_info', 'mysql_info', 'mysql', 'mysql_fieldname', 'mysql_fieldtable', 'mysql_fieldlen', 'mysql_fieldtype', 'mysql_fieldflags', 'mysql_selectdb', 'mysql_createdb', 'mysql_dropdb', 'mysql_freeresult', 'mysql_numfields', 'mysql_numrows', 'mysql_listdbs', 'mysql_listtables', 'mysql_listfields', 'mysql_db_name', 'mysql_dbname', 'mysql_tablename', 'mysql_table_name', 'pg_connect', 'pg_pconnect', 'pg_close', 'pg_connection_status', 'pg_connection_busy', 'pg_connection_reset', 'pg_host', 'pg_dbname', 'pg_port', 'pg_tty', 'pg_options', 'pg_ping', 'pg_query', 'pg_send_query', 'pg_cancel_query', 'pg_fetch_result', 'pg_fetch_row', 'pg_fetch_assoc', 'pg_fetch_array', 'pg_fetch_object', 'pg_fetch_all', 'pg_affected_rows', 'pg_get_result', 'pg_result_seek', 'pg_result_status', 'pg_free_result', 'pg_last_oid', 'pg_num_rows', 'pg_num_fields', 'pg_field_name', 'pg_field_num', 'pg_field_size', 'pg_field_type', 'pg_field_prtlen', 'pg_field_is_null', 'pg_get_notify', 'pg_get_pid', 'pg_result_error', 'pg_last_error', 'pg_last_notice', 'pg_put_line', 'pg_end_copy', 'pg_copy_to', 'pg_copy_from', + 'pg_trace', 'pg_untrace', 'pg_lo_create', 'pg_lo_unlink', 'pg_lo_open', 'pg_lo_close', 'pg_lo_read', 'pg_lo_write', 'pg_lo_read_all', 'pg_lo_import', 'pg_lo_export', 'pg_lo_seek', 'pg_lo_tell', 'pg_escape_string', 'pg_escape_bytea', 'pg_unescape_bytea', 'pg_client_encoding', 'pg_set_client_encoding', 'pg_meta_data', 'pg_convert', 'pg_insert', 'pg_update', 'pg_delete', 'pg_select', 'pg_exec', 'pg_getlastoid', 'pg_cmdtuples', 'pg_errormessage', 'pg_numrows', 'pg_numfields', 'pg_fieldname', 'pg_fieldsize', 'pg_fieldtype', 'pg_fieldnum', 'pg_fieldprtlen', 'pg_fieldisnull', 'pg_freeresult', 'pg_result', 'pg_loreadall', 'pg_locreate', 'pg_lounlink', 'pg_loopen', 'pg_loclose', 'pg_loread', 'pg_lowrite', 'pg_loimport', 'pg_loexport', + 'echo', 'print', 'global', 'static', 'exit', 'array', 'empty', 'eval', 'isset', 'unset', 'die' + + ] + } + ,'OPERATORS' :[ + '+', '-', '/', '*', '=', '<', '>', '%', '!', '&&', '||' + ] + ,'DELIMITERS' :[ + '(', ')', '[', ']', '{', '}' + ] + ,'REGEXPS' : { + // highlight all variables ($...) + 'variables' : { + 'search' : '()(\\$\\w+)()' + ,'class' : 'variables' + ,'modifiers' : 'g' + ,'execute' : 'before' // before or after + } + } + ,'STYLES' : { + 'COMMENTS': 'color: #AAAAAA;' + ,'QUOTESMARKS': 'color: #879EFA;' + ,'KEYWORDS' : { + 'reserved' : 'color: #48BDDF;' + ,'functions' : 'color: #0040FD;' + ,'statements' : 'color: #60CA00;' + } + ,'OPERATORS' : 'color: #FF00FF;' + ,'DELIMITERS' : 'color: #2B60FF;' + ,'REGEXPS' : { + 'variables' : 'color: #E0BD54;' + } + } + ,'AUTO_COMPLETION' : { + "default": { // the name of this definition group. It's posisble to have different rules inside the same definition file + "REGEXP": { "before_word": "[^a-zA-Z0-9_]|^" // \\s|\\.| + ,"possible_words_letters": "[a-zA-Z0-9_\$]+" + ,"letter_after_word_must_match": "[^a-zA-Z0-9_]|$" + ,"prefix_separator": "\\-\\>|\\:\\:" + } + ,"CASE_SENSITIVE": true + ,"MAX_TEXT_LENGTH": 100 // the maximum length of the text being analyzed before the cursor position + ,"KEYWORDS": { + '': [ // the prefix of thoses items + /** + * 0 : the keyword the user is typing + * 1 : (optionnal) the string inserted in code ("{@}" being the new position of the cursor, "§" beeing the equivalent to the value the typed string indicated if the previous ) + * If empty the keyword will be displayed + * 2 : (optionnal) the text that appear in the suggestion box (if empty, the string to insert will be displayed) + */ + ['$_POST'] + ,['$_GET'] + ,['$_SESSION'] + ,['$_SERVER'] + ,['$_FILES'] + ,['$_ENV'] + ,['$_COOKIE'] + ,['$_REQUEST'] + // magic methods + ,['__construct', '§( {@} )'] + ,['__destruct', '§( {@} )'] + ,['__sleep', '§( {@} )'] + ,['__wakeup', '§( {@} )'] + ,['__toString', '§( {@} )'] + // include + ,['include', '§ "{@}";'] + ,['include_once', '§ "{@}";'] + ,['require', '§ "{@}";'] + ,['require_once', '§ "{@}";'] + // statements + ,['for', '§( {@} )'] + ,['foreach', '§( {@} )'] + ,['if', '§( {@} )'] + ,['elseif', '§( {@} )'] + ,['while', '§( {@} )'] + ,['switch', '§( {@} )'] + ,['break'] + ,['case'] + ,['continue'] + ,['do'] + ,['else'] + ,['endif'] + ,['endswitch'] + ,['endwhile'] + ,['return'] + // function + ,['unset', '§( {@} )'] + ] + } + } + ,"live": { + + // class NAME: /class\W+([a-z]+)\W+/gi + // method: /^(public|private|protected)?\s*function\s+([a-z][a-z0-9\_]*)\s*(\([^\{]*\))/gmi + // static: /^(public|private|protected)?\s+static\s+(public|private|protected)?\s*function\s+([a-z][a-z0-9\_]*)\s*(\([^\{]*\))/gmi + // attributes: /(\$this\-\>|(?:var|public|protected|private)\W+\$)([a-z0-9\_]+)(?!\()\b/gi + // v1 : /(\$this\-\>|var\W+|public\W+|protected\W+|private\W+)([a-z0-9\_]+)\W*(=|;)/gi + // var type: /(\$(this\-\>)?[a-z0-9\_]+)\s*\=\s*new\s+([a-z0-9\_])+/gi + + + "REGEXP": { "before_word": "[^a-zA-Z0-9_]|^" // \\s|\\.| + ,"possible_words_letters": "[a-zA-Z0-9_\$]+" + ,"letter_after_word_must_match": "[^a-zA-Z0-9_]|$" + ,"prefix_separator": "\\-\\>" + } + ,"CASE_SENSITIVE": true + ,"MAX_TEXT_LENGTH": 100 // the maximum length of the text being analyzed before the cursor position + ,"KEYWORDS": { + '$this': [ // the prefix of thoses items + ['test'] + ] + } + } + } +}; diff --git a/includes/edit_area/reg_syntax/python.js b/includes/edit_area/reg_syntax/python.js new file mode 100644 index 0000000000..456b27e976 --- /dev/null +++ b/includes/edit_area/reg_syntax/python.js @@ -0,0 +1,144 @@ +/** + * Python syntax v 1.1 + * + * v1.1 by Andre Roberge (2006/12/27) + * +**/ +editAreaLoader.load_syntax["python"] = { + 'COMMENT_SINGLE' : {1 : '#'} + ,'COMMENT_MULTI' : {} + ,'QUOTEMARKS' : {1: "'", 2: '"'} + ,'KEYWORD_CASE_SENSITIVE' : true + ,'KEYWORDS' : { + /* + ** Set 1: reserved words + ** http://python.org/doc/current/ref/keywords.html + ** Note: 'as' and 'with' have been added starting with Python 2.5 + */ + 'reserved' : [ + 'and', 'as', 'assert', 'break', 'class', 'continue', 'def', 'del', 'elif', + 'else', 'except', 'exec', 'finally', 'for', 'from', 'global', 'if', + 'import', 'is', 'in', 'lambda', 'not', 'or', 'pass', 'print', 'raise', + 'return', 'try', 'while', 'with', 'yield' + //the following are *almost* reserved; we'll treat them as such + , 'False', 'True', 'None' + ] + /* + ** Set 2: builtins + ** http://python.org/doc/current/lib/built-in-funcs.html + */ + ,'builtins' : [ + '__import__', 'abs', 'basestring', 'bool', 'callable', 'chr', 'classmethod', 'cmp', + 'compile', 'complex', 'delattr', 'dict', 'dir', 'divmod', 'enumerate', 'eval', 'execfile', + 'file', 'filter', 'float', 'frozenset', 'getattr', 'globals', 'hasattr', 'hash', 'help', + 'hex', 'id', 'input', 'int', 'isinstance', 'issubclass', 'iter', 'len', 'list', 'locals', + 'long', 'map', 'max', 'min', 'object', 'oct', 'open', 'ord', 'pow', 'property', 'range', + 'raw_input', 'reduce', 'reload', 'repr', 'reversed', 'round', 'set', 'setattr', 'slice', + 'sorted', 'staticmethod', 'str', 'sum', 'super', 'tuple', 'type', 'unichr', 'unicode', + 'vars', 'xrange', 'zip', + // Built-in constants: http://www.python.org/doc/2.4.1/lib/node35.html + //'False', 'True', 'None' have been included in 'reserved' + 'NotImplemented', 'Ellipsis', + // Built-in Exceptions: http://python.org/doc/current/lib/module-exceptions.html + 'Exception', 'StandardError', 'ArithmeticError', 'LookupError', 'EnvironmentError', + 'AssertionError', 'AttributeError', 'EOFError', 'FloatingPointError', 'IOError', + 'ImportError', 'IndexError', 'KeyError', 'KeyboardInterrupt', 'MemoryError', 'NameError', + 'NotImplementedError', 'OSError', 'OverflowError', 'ReferenceError', 'RuntimeError', + 'StopIteration', 'SyntaxError', 'SystemError', 'SystemExit', 'TypeError', + 'UnboundlocalError', 'UnicodeError', 'UnicodeEncodeError', 'UnicodeDecodeError', + 'UnicodeTranslateError', 'ValueError', 'WindowsError', 'ZeroDivisionError', 'Warning', + 'UserWarning', 'DeprecationWarning', 'PendingDeprecationWarning', 'SyntaxWarning', + 'RuntimeWarning', 'FutureWarning', + // we will include the string methods as well + // http://python.org/doc/current/lib/string-methods.html + 'capitalize', 'center', 'count', 'decode', 'encode', 'endswith', 'expandtabs', + 'find', 'index', 'isalnum', 'isaplpha', 'isdigit', 'islower', 'isspace', 'istitle', + 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'replace', 'rfind', 'rindex', 'rjust', + 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', + 'translate', 'upper', 'zfill' + ] + /* + ** Set 3: standard library + ** http://python.org/doc/current/lib/modindex.html + */ + ,'stdlib' : [ + '__builtin__', '__future__', '__main__', '_winreg', 'aifc', 'AL', 'al', 'anydbm', + 'array', 'asynchat', 'asyncore', 'atexit', 'audioop', 'base64', 'BaseHTTPServer', + 'Bastion', 'binascii', 'binhex', 'bisect', 'bsddb', 'bz2', 'calendar', 'cd', 'cgi', + 'CGIHTTPServer', 'cgitb', 'chunk', 'cmath', 'cmd', 'code', 'codecs', 'codeop', + 'collections', 'colorsys', 'commands', 'compileall', 'compiler', 'compiler', + 'ConfigParser', 'Cookie', 'cookielib', 'copy', 'copy_reg', 'cPickle', 'crypt', + 'cStringIO', 'csv', 'curses', 'datetime', 'dbhash', 'dbm', 'decimal', 'DEVICE', + 'difflib', 'dircache', 'dis', 'distutils', 'dl', 'doctest', 'DocXMLRPCServer', 'dumbdbm', + 'dummy_thread', 'dummy_threading', 'email', 'encodings', 'errno', 'exceptions', 'fcntl', + 'filecmp', 'fileinput', 'FL', 'fl', 'flp', 'fm', 'fnmatch', 'formatter', 'fpectl', + 'fpformat', 'ftplib', 'gc', 'gdbm', 'getopt', 'getpass', 'gettext', 'GL', 'gl', 'glob', + 'gopherlib', 'grp', 'gzip', 'heapq', 'hmac', 'hotshot', 'htmlentitydefs', 'htmllib', + 'HTMLParser', 'httplib', 'imageop', 'imaplib', 'imgfile', 'imghdr', 'imp', 'inspect', + 'itertools', 'jpeg', 'keyword', 'linecache', 'locale', 'logging', 'mailbox', 'mailcap', + 'marshal', 'math', 'md5', 'mhlib', 'mimetools', 'mimetypes', 'MimeWriter', 'mimify', + 'mmap', 'msvcrt', 'multifile', 'mutex', 'netrc', 'new', 'nis', 'nntplib', 'operator', + 'optparse', 'os', 'ossaudiodev', 'parser', 'pdb', 'pickle', 'pickletools', 'pipes', + 'pkgutil', 'platform', 'popen2', 'poplib', 'posix', 'posixfile', 'pprint', 'profile', + 'pstats', 'pty', 'pwd', 'py_compile', 'pyclbr', 'pydoc', 'Queue', 'quopri', 'random', + 're', 'readline', 'repr', 'resource', 'rexec', 'rfc822', 'rgbimg', 'rlcompleter', + 'robotparser', 'sched', 'ScrolledText', 'select', 'sets', 'sgmllib', 'sha', 'shelve', + 'shlex', 'shutil', 'signal', 'SimpleHTTPServer', 'SimpleXMLRPCServer', 'site', 'smtpd', + 'smtplib', 'sndhdr', 'socket', 'SocketServer', 'stat', 'statcache', 'statvfs', 'string', + 'StringIO', 'stringprep', 'struct', 'subprocess', 'sunau', 'SUNAUDIODEV', 'sunaudiodev', + 'symbol', 'sys', 'syslog', 'tabnanny', 'tarfile', 'telnetlib', 'tempfile', 'termios', + 'test', 'textwrap', 'thread', 'threading', 'time', 'timeit', 'Tix', 'Tkinter', 'token', + 'tokenize', 'traceback', 'tty', 'turtle', 'types', 'unicodedata', 'unittest', 'urllib2', + 'urllib', 'urlparse', 'user', 'UserDict', 'UserList', 'UserString', 'uu', 'warnings', + 'wave', 'weakref', 'webbrowser', 'whichdb', 'whrandom', 'winsound', 'xdrlib', 'xml', + 'xmllib', 'xmlrpclib', 'zipfile', 'zipimport', 'zlib' + + ] + /* + ** Set 4: special methods + ** http://python.org/doc/current/ref/specialnames.html + */ + ,'special' : [ + // Basic customization: http://python.org/doc/current/ref/customization.html + '__new__', '__init__', '__del__', '__repr__', '__str__', + '__lt__', '__le__', '__eq__', '__ne__', '__gt__', '__ge__', '__cmp__', '__rcmp__', + '__hash__', '__nonzero__', '__unicode__', '__dict__', + // Attribute access: http://python.org/doc/current/ref/attribute-access.html + '__setattr__', '__delattr__', '__getattr__', '__getattribute__', '__get__', '__set__', + '__delete__', '__slots__', + // Class creation, callable objects + '__metaclass__', '__call__', + // Container types: http://python.org/doc/current/ref/sequence-types.html + '__len__', '__getitem__', '__setitem__', '__delitem__', '__iter__', '__contains__', + '__getslice__', '__setslice__', '__delslice__', + // Numeric types: http://python.org/doc/current/ref/numeric-types.html + '__abs__','__add__','__and__','__coerce__','__div__','__divmod__','__float__', + '__hex__','__iadd__','__isub__','__imod__','__idiv__','__ipow__','__iand__', + '__ior__','__ixor__', '__ilshift__','__irshift__','__invert__','__int__', + '__long__','__lshift__', + '__mod__','__mul__','__neg__','__oct__','__or__','__pos__','__pow__', + '__radd__','__rdiv__','__rdivmod__','__rmod__','__rpow__','__rlshift__','__rrshift__', + '__rshift__','__rsub__','__rmul__','__repr__','__rand__','__rxor__','__ror__', + '__sub__','__xor__' + ] + } + ,'OPERATORS' :[ + '+', '-', '/', '*', '=', '<', '>', '%', '!', '&', ';', '?', '`', ':', ',' + ] + ,'DELIMITERS' :[ + '(', ')', '[', ']', '{', '}' + ] + ,'STYLES' : { + 'COMMENTS': 'color: #AAAAAA;' + ,'QUOTESMARKS': 'color: #660066;' + ,'KEYWORDS' : { + 'reserved' : 'color: #0000FF;' + ,'builtins' : 'color: #009900;' + ,'stdlib' : 'color: #009900;' + ,'special': 'color: #006666;' + } + ,'OPERATORS' : 'color: #993300;' + ,'DELIMITERS' : 'color: #993300;' + + } +}; diff --git a/includes/edit_area/reg_syntax/robotstxt.js b/includes/edit_area/reg_syntax/robotstxt.js new file mode 100644 index 0000000000..eab451d039 --- /dev/null +++ b/includes/edit_area/reg_syntax/robotstxt.js @@ -0,0 +1,24 @@ +editAreaLoader.load_syntax["robotstxt"] = { + 'COMMENT_SINGLE' : {1 : '#'}, + 'COMMENT_MULTI' : {}, + 'QUOTEMARKS' : [], + 'KEYWORD_CASE_SENSITIVE' : false, + 'KEYWORDS' : { + 'attributes' : ['User-agent', 'Disallow', 'Allow', 'Crawl-delay'], + 'values' : ['*'], + 'specials' : ['*'] + }, + 'OPERATORS' :[':'], + 'DELIMITERS' :[], + 'STYLES' : { + 'COMMENTS': 'color: #AAAAAA;', + 'QUOTESMARKS': 'color: #6381F8;', + 'KEYWORDS' : { + 'attributes' : 'color: #48BDDF;', + 'values' : 'color: #2B60FF;', + 'specials' : 'color: #FF0000;' + }, + 'OPERATORS' : 'color: #FF00FF;', + 'DELIMITERS' : 'color: #60CA00;' + } +}; diff --git a/includes/edit_area/reg_syntax/ruby.js b/includes/edit_area/reg_syntax/ruby.js new file mode 100644 index 0000000000..1f94ecc9ef --- /dev/null +++ b/includes/edit_area/reg_syntax/ruby.js @@ -0,0 +1,67 @@ +/** + * Ruby syntax v 1.0 + * + * v1.0 by Patrice De Saint Steban (2007/01/03) + * +**/ +editAreaLoader.load_syntax["ruby"] = { + 'COMMENT_SINGLE' : {1 : '#'} + ,'COMMENT_MULTI' : {} + ,'QUOTEMARKS' : {1: "'", 2: '"'} + ,'KEYWORD_CASE_SENSITIVE' : true + ,'KEYWORDS' : { + 'reserved' : [ + 'alias', 'and', 'BEGIN', 'begin', 'break', 'case', 'class', 'def', 'defined', 'do', 'else', + 'elsif', 'END', 'end', 'ensure', 'false', 'for', 'if', + 'in', 'module', 'next', 'not', 'or', 'redo', 'rescue', 'retry', + 'return', 'self', 'super', 'then', 'true', 'undef', 'unless', 'until', 'when', 'while', 'yield' + ] + } + ,'OPERATORS' :[ + '+', '-', '/', '*', '=', '<', '>', '%', '!', '&', ';', '?', '`', ':', ',' + ] + ,'DELIMITERS' :[ + '(', ')', '[', ']', '{', '}' + ] + ,'REGEXPS' : { + 'constants' : { + 'search' : '()([A-Z]\\w*)()' + ,'class' : 'constants' + ,'modifiers' : 'g' + ,'execute' : 'before' + } + ,'variables' : { + 'search' : '()([\$\@\%]+\\w+)()' + ,'class' : 'variables' + ,'modifiers' : 'g' + ,'execute' : 'before' + } + ,'numbers' : { + 'search' : '()(-?[0-9]+)()' + ,'class' : 'numbers' + ,'modifiers' : 'g' + ,'execute' : 'before' + } + ,'symbols' : { + 'search' : '()(:\\w+)()' + ,'class' : 'symbols' + ,'modifiers' : 'g' + ,'execute' : 'before' + } + } + ,'STYLES' : { + 'COMMENTS': 'color: #AAAAAA;' + ,'QUOTESMARKS': 'color: #660066;' + ,'KEYWORDS' : { + 'reserved' : 'font-weight: bold; color: #0000FF;' + } + ,'OPERATORS' : 'color: #993300;' + ,'DELIMITERS' : 'color: #993300;' + ,'REGEXPS' : { + 'variables' : 'color: #E0BD54;' + ,'numbers' : 'color: green;' + ,'constants' : 'color: #00AA00;' + ,'symbols' : 'color: #879EFA;' + } + } +}; diff --git a/includes/edit_area/reg_syntax/sql.js b/includes/edit_area/reg_syntax/sql.js new file mode 100644 index 0000000000..f4530a99c7 --- /dev/null +++ b/includes/edit_area/reg_syntax/sql.js @@ -0,0 +1,55 @@ +editAreaLoader.load_syntax["sql"] = { + 'COMMENT_SINGLE' : {1 : '--'} + ,'COMMENT_MULTI' : {'/*' : '*/'} + ,'QUOTEMARKS' : {1: "'", 2: '"', 3: '`'} + ,'KEYWORD_CASE_SENSITIVE' : false + ,'KEYWORDS' : { + 'statements' : [ + 'select', 'SELECT', 'where', 'order', 'by', + 'insert', 'from', 'update', 'grant', 'left join', 'right join', + 'union', 'group', 'having', 'limit', 'alter', 'LIKE','IN','CASE' + ] + ,'reserved' : [ + 'null', 'enum', 'int', 'boolean', 'add', 'varchar' + + ] + ,'functions' : [ + 'ABS','ACOS','ADDDATE','ADDTIME','AES_DECRYPT','AES_ENCRYPT','ASCII','ASIN','ATAN2 ATAN','ATAN','AVG','BENCHMARK','DISTINCT','BIN','BIT_AND','BIT_COUNT','BIT_LENGTH','BIT_OR','BIT_XOR','CAST','CEILING CEIL','CHAR_LENGTH','CHAR', +'CHARACTER_LENGTH','CHARSET','COALESCE','COERCIBILITY','COLLATION','COMPRESS','CONCAT_WS','CONCAT','CONNECTION_ID','CONV','CONVERT_TZ','COS','COT','COUNT','CRC32','CURDATE','CURRENT_DATE','CURRENT_TIME','CURRENT_TIMESTAMP','CURRENT_USER','CURTIME','DATABASE','DATE_ADD','DATE_FORMAT','DATE_SUB','DATE','DATEDIFF','DAY','DAYNAME','DAYOFMONTH', +'DAYOFWEEK','DAYOFYEAR','DECODE','DEFAULT','DEGREES','DES_DECRYPT','DES_ENCRYPT','ELT','ENCODE','ENCRYPT','EXP','EXPORT_SET','EXTRACT','FIELD','FIND_IN_SET','FLOOR','FORMAT','FOUND_ROWS','FROM_DAYS','FROM_UNIXTIME','GET_FORMAT','GET_LOCK','GREATEST','GROUP_CONCAT','HEX','HOUR','IF','IFNULL','INET_ATON','INET_NTOA', +'INSERT','INSTR','INTERVAL','IS_FREE_LOCK','IS_USED_LOCK','ISNULL','LAST_DAY','LAST_INSERT_ID','LCASE','LEAST','LEFT','LENGTH','LN','LOAD_FILE','LOCALTIME','LOCALTIMESTAMP','LOCATE','LOG10','LOG2','LOG','LOWER','LPAD','LTRIM','MAKE_SET','MAKEDATE','MAKETIME','MASTER_POS_WAIT','MAX','MD5','MICROSECOND', +'MID','MIN','MINUTE','MOD','MONTH','MONTHNAME','NOW','NULLIF','OCT','OCTET_LENGTH','OLD_PASSWORD','ORD','PASSWORD','PERIOD_ADD','PERIOD_DIFF','PI','POSITION','POW','POWER','PROCEDURE ANALYSE','QUARTER','QUOTE','RADIANS','RAND','RELEASE_LOCK','REPEAT','REPLACE','REVERSE','RIGHT','ROUND', +'RPAD','RTRIM','SEC_TO_TIME','SECOND','SESSION_USER','SHA1','SHA','SIGN','SIN','SOUNDEX','SOUNDS LIKE','SPACE','SQRT','STD','STDDEV','STR_TO_DATE','STRCMP','SUBDATE','SUBSTRING_INDEX','SUBSTRING','SUBSTR','SUBTIME','SUM','SYSDATE','SYSTEM_USER','TAN','TIME_FORMAT','TIME_TO_SEC','TIME','TIMEDIFF', +'TIMESTAMP','TO_DAYS','TRIM','TRUNCATE','UCASE','UNCOMPRESS','UNCOMPRESSED_LENGTH','UNHEX','UNIX_TIMESTAMP','UPPER','USER','UTC_DATE','UTC_TIME','UTC_TIMESTAMP','UUID','VALUES','VARIANCE','WEEK','WEEKDAY','WEEKOFYEAR','YEAR','YEARWEEK' + ] + } + ,'OPERATORS' :[ + 'AND','&&','BETWEEN','BINARY','&','|','^','/','DIV','<=>','=','>=','>','<<','>>','IS','NULL','<=','<','-','%','!=','<>','!','||','OR','+','REGEXP','RLIKE','XOR','~','*' + ] + ,'DELIMITERS' :[ + '(', ')', '[', ']', '{', '}' + ] + ,'REGEXPS' : { + // highlight all variables (@...) + 'variables' : { + 'search' : '()(\\@\\w+)()' + ,'class' : 'variables' + ,'modifiers' : 'g' + ,'execute' : 'before' // before or after + } + } + ,'STYLES' : { + 'COMMENTS': 'color: #AAAAAA;' + ,'QUOTESMARKS': 'color: #879EFA;' + ,'KEYWORDS' : { + 'reserved' : 'color: #48BDDF;' + ,'functions' : 'color: #0040FD;' + ,'statements' : 'color: #60CA00;' + } + ,'OPERATORS' : 'color: #FF00FF;' + ,'DELIMITERS' : 'color: #2B60FF;' + ,'REGEXPS' : { + 'variables' : 'color: #E0BD54;' + } + } +}; diff --git a/includes/edit_area/reg_syntax/tsql.js b/includes/edit_area/reg_syntax/tsql.js new file mode 100644 index 0000000000..0c5c9ee8ac --- /dev/null +++ b/includes/edit_area/reg_syntax/tsql.js @@ -0,0 +1,87 @@ +editAreaLoader.load_syntax["tsql"] = { + 'COMMENT_SINGLE' : {1 : '--'} + ,'COMMENT_MULTI' : {'/*' : '*/'} + ,'QUOTEMARKS' : {1: "'" } + ,'KEYWORD_CASE_SENSITIVE' : false + ,'KEYWORDS' : { + 'statements': [ + 'ADD', 'EXCEPT', 'PERCENT', 'EXEC', 'PLAN', 'ALTER', 'EXECUTE', 'PRECISION', + 'PRIMARY', 'EXIT', 'PRINT', 'AS', 'FETCH', 'PROC', 'ASC', + 'FILE', 'PROCEDURE', 'AUTHORIZATION', 'FILLFACTOR', 'PUBLIC', 'BACKUP', 'FOR', 'RAISERROR', + 'BEGIN', 'FOREIGN', 'READ', 'FREETEXT', 'READTEXT', 'BREAK', 'FREETEXTTABLE', + 'RECONFIGURE', 'BROWSE', 'FROM', 'REFERENCES', 'BULK', 'FULL', 'REPLICATION', 'BY', + 'FUNCTION', 'RESTORE', 'CASCADE', 'GOTO', 'RESTRICT', 'CASE', 'GRANT', 'RETURN', + 'CHECK', 'GROUP', 'REVOKE', 'CHECKPOINT', 'HAVING', 'RIGHT', 'CLOSE', 'HOLDLOCK', 'ROLLBACK', + 'CLUSTERED', 'IDENTITY', 'ROWCOUNT', 'IDENTITY_INSERT', 'ROWGUIDCOL', 'COLLATE', + 'IDENTITYCOL', 'RULE', 'COLUMN', 'IF', 'SAVE', 'COMMIT', 'SCHEMA', 'COMPUTE', 'INDEX', + 'SELECT', 'CONSTRAINT', 'CONTAINS', 'INSERT', 'SET', + 'CONTAINSTABLE', 'INTERSECT', 'SETUSER', 'CONTINUE', 'INTO', 'SHUTDOWN', 'SOME', + 'CREATE', 'STATISTICS', 'KEY', 'CURRENT', 'KILL', 'TABLE', + 'CURRENT_DATE', 'TEXTSIZE', 'CURRENT_TIME', 'THEN', 'LINENO', + 'TO', 'LOAD', 'TOP', 'CURSOR', 'NATIONAL', 'TRAN', 'DATABASE', 'NOCHECK', + 'TRANSACTION', 'DBCC', 'NONCLUSTERED', 'TRIGGER', 'DEALLOCATE', 'TRUNCATE', + 'DECLARE', 'TSEQUAL', 'DEFAULT', 'UNION', 'DELETE', 'OF', 'UNIQUE', + 'DENY', 'OFF', 'UPDATE', 'DESC', 'OFFSETS', 'UPDATETEXT', 'DISK', 'ON', 'USE', 'DISTINCT', 'OPEN', + 'DISTRIBUTED', 'OPENDATASOURCE', 'VALUES', 'DOUBLE', 'OPENQUERY', 'VARYING', 'DROP', + 'OPENROWSET', 'VIEW', 'DUMMY', 'OPENXML', 'WAITFOR', 'DUMP', 'OPTION', 'WHEN', 'ELSE', 'WHERE', + 'END', 'ORDER', 'WHILE', 'ERRLVL', 'WITH', 'ESCAPE', 'OVER', 'WRITETEXT' + ], + 'functions': [ + 'COALESCE', 'SESSION_USER', 'CONVERT', 'SYSTEM_USER', 'CURRENT_TIMESTAMP', 'CURRENT_USER', 'NULLIF', 'USER', + 'AVG', 'MIN', 'CHECKSUM', 'SUM', 'CHECKSUM_AGG', 'STDEV', 'COUNT', 'STDEVP', 'COUNT_BIG', 'VAR', 'GROUPING', 'VARP', 'MAX', + '@@DATEFIRST', '@@OPTIONS', '@@DBTS', '@@REMSERVER', '@@LANGID', '@@SERVERNAME', '@@LANGUAGE', '@@SERVICENAME', '@@LOCK_TIMEOUT', + '@@SPID', '@@MAX_CONNECTIONS', '@@TEXTSIZE', '@@MAX_PRECISION', '@@VERSION', '@@NESTLEVEL', + '@@CURSOR_ROWS', 'CURSOR_STATUS', '@@FETCH_STATUS', + 'DATEADD', 'DATEDIFF', 'DATENAME', 'DATEPART', 'DAY', 'GETDATE', 'GETUTCDATE', 'MONTH', 'YEAR', + 'ABS', 'DEGREES', 'RAND', 'ACOS', 'EXP', 'ROUND', 'ASIN', 'FLOOR', 'SIGN', 'ATAN', 'LOG', 'SIN', 'ATN2', 'LOG10', 'SQRT', + 'CEILING', 'PI ', 'SQUARE', 'COS', 'POWER', 'TAN', 'COT', 'RADIANS', + '@@PROCID', 'COL_LENGTH', 'FULLTEXTCATALOGPROPERTY', 'COL_NAME', 'FULLTEXTSERVICEPROPERTY', 'COLUMNPROPERTY', 'INDEX_COL', + 'DATABASEPROPERTY', 'INDEXKEY_PROPERTY', 'DATABASEPROPERTYEX', 'INDEXPROPERTY', 'DB_ID', 'OBJECT_ID', 'DB_NAME', 'OBJECT_NAME', + 'FILE_ID', 'OBJECTPROPERTY', 'OBJECTPROPERTYEX', 'FILE_NAME', 'SQL_VARIANT_PROPERTY', 'FILEGROUP_ID', 'FILEGROUP_NAME', + 'FILEGROUPPROPERTY', 'TYPEPROPERTY', 'FILEPROPERTY', + 'CURRENT_USER', 'SUSER_ID', 'SUSER_SID', 'IS_MEMBER', 'SUSER_SNAME', 'IS_SRVROLEMEMBER', 'PERMISSIONS', 'SYSTEM_USER', + 'SUSER_NAME', 'USER_ID', 'SESSION_USER', 'USER_NAME', 'ASCII', 'SOUNDEX', 'PATINDEX', 'SPACE', 'CHARINDEX', 'QUOTENAME', + 'STR', 'DIFFERENCE', 'REPLACE', 'STUFF', 'REPLICATE', 'SUBSTRING', 'LEN', 'REVERSE', 'UNICODE', 'LOWER', + 'UPPER', 'LTRIM', 'RTRIM', 'APP_NAME', 'CAST', 'CONVERT', 'COALESCE', 'COLLATIONPROPERTY', 'COLUMNS_UPDATED', 'CURRENT_TIMESTAMP', + 'CURRENT_USER', 'DATALENGTH', '@@ERROR', 'FORMATMESSAGE', 'GETANSINULL', 'HOST_ID', 'HOST_NAME', 'IDENT_CURRENT', 'IDENT_INCR', + 'IDENT_SEED', '@@IDENTITY', 'ISDATE', 'ISNULL', 'ISNUMERIC', 'NEWID', 'NULLIF', 'PARSENAME', '@@ROWCOUNT', + 'SCOPE_IDENTITY', 'SERVERPROPERTY', 'SESSIONPROPERTY', 'SESSION_USER', 'STATS_DATE', 'SYSTEM_USER', '@@TRANCOUNT', 'USER_NAME', + '@@CONNECTIONS', '@@PACK_RECEIVED', '@@CPU_BUSY', '@@PACK_SENT', '@@TIMETICKS', '@@IDLE', '@@TOTAL_ERRORS', '@@IO_BUSY', '@@TOTAL_READ', + '@@PACKET_ERRORS', '@@TOTAL_WRITE', 'PATINDEX', 'TEXTVALID', 'TEXTPTR' + ], + 'reserved': [ + 'RIGHT', 'INNER', 'IS', 'JOIN', 'CROSS', 'LEFT', 'NULL', 'OUTER' + ] + } + ,'OPERATORS' :[ + '+', '-', '*', '/', '%', '=', '&' ,'|', '^', '>', '<', '>=', '<=', '<>', '!=', '!<', '!>', 'ALL', 'AND', 'ANY', 'BETWEEN', 'EXISTS', 'IN', 'LIKE', 'NOT', 'OR', '~' + ] + ,'DELIMITERS' :[ + '(', ')', '[', ']', '{', '}' + ] + ,'REGEXPS' : { + // highlight all variables (@...) + 'variables' : { + 'search' : '()(\\@\\w+)()' + ,'class' : 'variables' + ,'modifiers' : 'g' + ,'execute' : 'before' // before or after + } + } + ,'STYLES' : { + 'COMMENTS': 'color: #008000;' + ,'QUOTESMARKS': 'color: #FF0000;' + ,'KEYWORDS' : { + 'reserved' : 'color: #808080;' + ,'functions' : 'color: #FF00FF;' + ,'statements' : 'color: #0000FF;' + } + ,'OPERATORS' : 'color: #808080;' + ,'DELIMITERS' : 'color: #FF8000;' + ,'REGEXPS' : { + 'variables' : 'color: #E0BD54;' + } + } +}; + + diff --git a/includes/edit_area/reg_syntax/vb.js b/includes/edit_area/reg_syntax/vb.js new file mode 100644 index 0000000000..18cc87cf78 --- /dev/null +++ b/includes/edit_area/reg_syntax/vb.js @@ -0,0 +1,52 @@ +editAreaLoader.load_syntax["vb"] = { + 'COMMENT_SINGLE' : {1 : "'"} + ,'COMMENT_MULTI' : { } + ,'QUOTEMARKS' : {1: '"'} + ,'KEYWORD_CASE_SENSITIVE' : false + ,'KEYWORDS' : { + 'statements' : [ + 'if','then','for','each','while','do','loop', + 'else','elseif','select','case','end select', + 'until','next','step','to','in','end if' + ] + ,'keywords' : [ + 'empty','isempty','nothing','null','isnull','true','false', + 'set','call', + 'sub','end sub','function','end function','exit','exit function', + 'dim','Mod','In','private','public','shared','const' + ] + + ,'functions' : [ + 'CDate','Date','DateAdd','DateDiff','DatePart','DateSerial','DateValue','Day','FormatDateTime', + 'Hour','IsDate','Minute','Month', + 'MonthName','Now','Second','Time','Timer','TimeSerial','TimeValue','Weekday','WeekdayName ','Year', + 'Asc','CBool','CByte','CCur','CDate','CDbl','Chr','CInt','CLng','CSng','CStr','Hex','Oct','FormatCurrency', + 'FormatDateTime','FormatNumber','FormatPercent','Abs','Atn','Cos','Exp','Hex','Int','Fix','Log','Oct', + 'Rnd','Sgn','Sin','Sqr','Tan', + 'Array','Filter','IsArray','Join','LBound','Split','UBound', + 'InStr','InStrRev','LCase','Left','Len','LTrim','RTrim','Trim','Mid','Replace','Right','Space','StrComp', + 'String','StrReverse','UCase', + 'CreateObject','Eval','GetLocale','GetObject','GetRef','InputBox','IsEmpty','IsNull','IsNumeric', + 'IsObject','LoadPicture','MsgBox','RGB','Round','ScriptEngine','ScriptEngineBuildVersion','ScriptEngineMajorVersion', + 'ScriptEngineMinorVersion','SetLocale','TypeName','VarType' + ] + } + ,'OPERATORS' :[ + '+', '-', '/', '*', '=', '<', '>', '!', '&' + ] + ,'DELIMITERS' :[ + '(', ')', '[', ']', '{', '}' + ] + ,'STYLES' : { + 'COMMENTS': 'color: #99CC00;' + ,'QUOTESMARKS': 'color: #333399;' + ,'KEYWORDS' : { + 'keywords' : 'color: #3366FF;' + ,'functions' : 'color: #0000FF;' + ,'statements' : 'color: #3366FF;' + } + ,'OPERATORS' : 'color: #FF0000;' + ,'DELIMITERS' : 'color: #0000FF;' + + } +}; diff --git a/includes/edit_area/reg_syntax/xml.js b/includes/edit_area/reg_syntax/xml.js new file mode 100644 index 0000000000..a043dd63ad --- /dev/null +++ b/includes/edit_area/reg_syntax/xml.js @@ -0,0 +1,56 @@ +/* +* last update: 2006-08-24 +*/ + +editAreaLoader.load_syntax["xml"] = { + 'COMMENT_SINGLE' : {} + ,'COMMENT_MULTI' : {''} + ,'QUOTEMARKS' : {1: "'", 2: '"'} + ,'KEYWORD_CASE_SENSITIVE' : false + ,'KEYWORDS' : { + } + ,'OPERATORS' :[ + ] + ,'DELIMITERS' :[ + ] + ,'REGEXPS' : { + 'xml' : { + 'search' : '()(<\\?[^>]*?\\?>)()' + ,'class' : 'xml' + ,'modifiers' : 'g' + ,'execute' : 'before' // before or after + } + ,'cdatas' : { + 'search' : '()()()' + ,'class' : 'cdata' + ,'modifiers' : 'g' + ,'execute' : 'before' // before or after + } + ,'tags' : { + 'search' : '(<)(/?[a-z][^ \r\n\t>]*)([^>]*>)' + ,'class' : 'tags' + ,'modifiers' : 'gi' + ,'execute' : 'before' // before or after + } + ,'attributes' : { + 'search' : '( |\n|\r|\t)([^ \r\n\t=]+)(=)' + ,'class' : 'attributes' + ,'modifiers' : 'g' + ,'execute' : 'before' // before or after + } + } + ,'STYLES' : { + 'COMMENTS': 'color: #AAAAAA;' + ,'QUOTESMARKS': 'color: #6381F8;' + ,'KEYWORDS' : { + } + ,'OPERATORS' : 'color: #E775F0;' + ,'DELIMITERS' : '' + ,'REGEXPS' : { + 'attributes': 'color: #B1AC41;' + ,'tags': 'color: #E62253;' + ,'xml': 'color: #8DCFB5;' + ,'cdata': 'color: #50B020;' + } + } +}; diff --git a/includes/email_address_validator.php b/includes/email_address_validator.php new file mode 100644 index 0000000000..40b3f02a77 --- /dev/null +++ b/includes/email_address_validator.php @@ -0,0 +1,181 @@ +check_email_address('test@example.org')) { + // Email address is technically valid + } + +*/ + +class EmailAddressValidator { + + /** + * Check email address validity + * @param strEmailAddress Email address to be checked + * @return True if email is valid, false if not + */ + public function check_email_address($strEmailAddress) { + + // If magic quotes is "on", email addresses with quote marks will + // fail validation because of added escape characters. Uncommenting + // the next three lines will allow for this issue. + //if (get_magic_quotes_gpc()) { + // $strEmailAddress = stripslashes($strEmailAddress); + //} + + // Control characters are not allowed + if (preg_match('/[\x00-\x1F\x7F-\xFF]/', $strEmailAddress)) { + return false; + } + + // Check email length - min 3 (a@a), max 256 + if (!$this->check_text_length($strEmailAddress, 3, 256)) { + return false; + } + + // Split it into sections using last instance of "@" + $intAtSymbol = strrpos($strEmailAddress, '@'); + if ($intAtSymbol === false) { + // No "@" symbol in email. + return false; + } + $arrEmailAddress[0] = substr($strEmailAddress, 0, $intAtSymbol); + $arrEmailAddress[1] = substr($strEmailAddress, $intAtSymbol + 1); + + // Count the "@" symbols. Only one is allowed, except where + // contained in quote marks in the local part. Quickest way to + // check this is to remove anything in quotes. We also remove + // characters escaped with backslash, and the backslash + // character. + $arrTempAddress[0] = preg_replace('/\./' + ,'' + ,$arrEmailAddress[0]); + $arrTempAddress[0] = preg_replace('/"[^"]+"/' + ,'' + ,$arrTempAddress[0]); + $arrTempAddress[1] = $arrEmailAddress[1]; + $strTempAddress = $arrTempAddress[0] . $arrTempAddress[1]; + // Then check - should be no "@" symbols. + if (strrpos($strTempAddress, '@') !== false) { + // "@" symbol found + return false; + } + + // Check local portion + if (!$this->check_local_portion($arrEmailAddress[0])) { + return false; + } + + // Check domain portion + if (!$this->check_domain_portion($arrEmailAddress[1])) { + return false; + } + + // If we're still here, all checks above passed. Email is valid. + return true; + + } + + /** + * Checks email section before "@" symbol for validity + * @param strLocalPortion Text to be checked + * @return True if local portion is valid, false if not + */ + protected function check_local_portion($strLocalPortion) { + // Local portion can only be from 1 to 64 characters, inclusive. + // Please note that servers are encouraged to accept longer local + // parts than 64 characters. + if (!$this->check_text_length($strLocalPortion, 1, 64)) { + return false; + } + // Local portion must be: + // 1) a dot-atom (strings separated by periods) + // 2) a quoted string + // 3) an obsolete format string (combination of the above) + $arrLocalPortion = explode('.', $strLocalPortion); + for ($i = 0, $max = sizeof($arrLocalPortion); $i < $max; $i++) { + if (!preg_match('.^(' + . '([A-Za-z0-9!#$%&\'*+/=?^_`{|}~-]' + . '[A-Za-z0-9!#$%&\'*+/=?^_`{|}~-]{0,63})' + .'|' + . '("[^\\\"]{0,62}")' + .')$.' + ,$arrLocalPortion[$i])) { + return false; + } + } + return true; + } + + /** + * Checks email section after "@" symbol for validity + * @param strDomainPortion Text to be checked + * @return True if domain portion is valid, false if not + */ + protected function check_domain_portion($strDomainPortion) { + // Total domain can only be from 1 to 255 characters, inclusive + if (!$this->check_text_length($strDomainPortion, 1, 255)) { + return false; + } + // Check if domain is IP, possibly enclosed in square brackets. + if (preg_match('/^(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])' + .'(\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])){3}$/' + ,$strDomainPortion) || + preg_match('/^\[(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])' + .'(\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])){3}\]$/' + ,$strDomainPortion)) { + return true; + } else { + $arrDomainPortion = explode('.', $strDomainPortion); + if (sizeof($arrDomainPortion) < 2) { + return false; // Not enough parts to domain + } + for ($i = 0, $max = sizeof($arrDomainPortion); $i < $max; $i++) { + // Each portion must be between 1 and 63 characters, inclusive + if (!$this->check_text_length($arrDomainPortion[$i], 1, 63)) { + return false; + } + if (!preg_match('/^(([A-Za-z0-9][A-Za-z0-9-]{0,61}[A-Za-z0-9])|' + .'([A-Za-z0-9]+))$/', $arrDomainPortion[$i])) { + return false; + } + if ($i == $max - 1) { // TLD cannot be only numbers + if (strlen(preg_replace('/[0-9]/', '', $arrDomainPortion[$i])) <= 0) { + return false; + } + } + } + } + return true; + } + + /** + * Check given text length is between defined bounds + * @param strText Text to be checked + * @param intMinimum Minimum acceptable length + * @param intMaximum Maximum acceptable length + * @return True if string is within bounds (inclusive), false if not + */ + protected function check_text_length($strText, $intMinimum, $intMaximum) { + // Minimum and maximum are both inclusive + $intTextLength = strlen($strText); + if (($intTextLength < $intMinimum) || ($intTextLength > $intMaximum)) { + return false; + } else { + return true; + } + } + +} + +?> \ No newline at end of file diff --git a/includes/footer.php b/includes/footer.php new file mode 100644 index 0000000000..d06821ad38 --- /dev/null +++ b/includes/footer.php @@ -0,0 +1,101 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; + +//get the output from the buffer + $body = $content_from_db.ob_get_contents(); + ob_end_clean(); //clean the buffer + +//set a default template + if (strlen($_SESSION['domain']['template']['name']) == 0) { $_SESSION['domain']['template']['name'] = 'default'; } + +//set a default template + if (strlen($_SESSION["template_content"])==0) { //build template if session template has no length + $v_template_path = $_SERVER["DOCUMENT_ROOT"].PROJECT_PATH.'/themes'; + if (strlen($template_rss_sub_category) > 0) { + //this template was assigned by the content manager + //get the contents of the template and save it to the template variable + $template_full_path = $v_template_path.'/'.$template_rss_sub_category.'/template.php'; + if (!file_exists($template_full_path)) { + $_SESSION['domain']['template']['name'] = 'default'; + $template_full_path = $v_template_path.'/default/template.php'; + } + $template = file_get_contents($template_full_path); + $_SESSION["template_content"] = $template; + } + else { + //get the contents of the template and save it to the template variable + $template_full_path = $v_template_path.'/'.$_SESSION['domain']['template']['name'].'/template.php'; + if (!file_exists($template_full_path)) { + $_SESSION['domain']['template']['name'] = 'default'; + $template_full_path = $v_template_path.'/default/template.php'; + } + $template = file_get_contents($template_full_path); + $_SESSION["template_content"] = $template; + } + } + +//start the output buffer + ob_start(); + $template = $_SESSION["template_content"]; + eval('?>' . $template . '", $custom_title, $template); // defined in each individual page + $output = str_replace ("", $custom_head, $output); // defined in each individual page + if (strlen($v_menu) > 0) { + $output = str_replace ("", $v_menu, $output); //defined in /includes/menu.php + } + else { + $output = str_replace ("", $_SESSION["menu"], $output); //defined in /includes/menu.php + } + $output = str_replace ("", PROJECT_PATH, $output); //defined in /includes/menu.php + + $pos = strrpos($output, ""); + if ($pos === false) { + $output = $body; //if tag not found just show the body + } + else { + //replace the body + $output = str_replace ("", $body, $output); + } + +//send the output to the browser + echo $output; + unset($output); + +//$statsauth = "a3az349x2bf3fdfa8dbt7x34fas5X"; +//require_once "stats/stat_sadd.php"; + +?> \ No newline at end of file diff --git a/includes/fpdf/font/courier.php b/includes/fpdf/font/courier.php new file mode 100644 index 0000000000..02525f589f --- /dev/null +++ b/includes/fpdf/font/courier.php @@ -0,0 +1,8 @@ + diff --git a/includes/fpdf/font/courierb.php b/includes/fpdf/font/courierb.php new file mode 100644 index 0000000000..f472063cca --- /dev/null +++ b/includes/fpdf/font/courierb.php @@ -0,0 +1,8 @@ + diff --git a/includes/fpdf/font/courierbi.php b/includes/fpdf/font/courierbi.php new file mode 100644 index 0000000000..6ce8501a66 --- /dev/null +++ b/includes/fpdf/font/courierbi.php @@ -0,0 +1,8 @@ + diff --git a/includes/fpdf/font/courieri.php b/includes/fpdf/font/courieri.php new file mode 100644 index 0000000000..320150a061 --- /dev/null +++ b/includes/fpdf/font/courieri.php @@ -0,0 +1,8 @@ + diff --git a/includes/fpdf/font/helvetica.php b/includes/fpdf/font/helvetica.php new file mode 100644 index 0000000000..891ea2511b --- /dev/null +++ b/includes/fpdf/font/helvetica.php @@ -0,0 +1,19 @@ +278,chr(1)=>278,chr(2)=>278,chr(3)=>278,chr(4)=>278,chr(5)=>278,chr(6)=>278,chr(7)=>278,chr(8)=>278,chr(9)=>278,chr(10)=>278,chr(11)=>278,chr(12)=>278,chr(13)=>278,chr(14)=>278,chr(15)=>278,chr(16)=>278,chr(17)=>278,chr(18)=>278,chr(19)=>278,chr(20)=>278,chr(21)=>278, + chr(22)=>278,chr(23)=>278,chr(24)=>278,chr(25)=>278,chr(26)=>278,chr(27)=>278,chr(28)=>278,chr(29)=>278,chr(30)=>278,chr(31)=>278,' '=>278,'!'=>278,'"'=>355,'#'=>556,'$'=>556,'%'=>889,'&'=>667,'\''=>191,'('=>333,')'=>333,'*'=>389,'+'=>584, + ','=>278,'-'=>333,'.'=>278,'/'=>278,'0'=>556,'1'=>556,'2'=>556,'3'=>556,'4'=>556,'5'=>556,'6'=>556,'7'=>556,'8'=>556,'9'=>556,':'=>278,';'=>278,'<'=>584,'='=>584,'>'=>584,'?'=>556,'@'=>1015,'A'=>667, + 'B'=>667,'C'=>722,'D'=>722,'E'=>667,'F'=>611,'G'=>778,'H'=>722,'I'=>278,'J'=>500,'K'=>667,'L'=>556,'M'=>833,'N'=>722,'O'=>778,'P'=>667,'Q'=>778,'R'=>722,'S'=>667,'T'=>611,'U'=>722,'V'=>667,'W'=>944, + 'X'=>667,'Y'=>667,'Z'=>611,'['=>278,'\\'=>278,']'=>278,'^'=>469,'_'=>556,'`'=>333,'a'=>556,'b'=>556,'c'=>500,'d'=>556,'e'=>556,'f'=>278,'g'=>556,'h'=>556,'i'=>222,'j'=>222,'k'=>500,'l'=>222,'m'=>833, + 'n'=>556,'o'=>556,'p'=>556,'q'=>556,'r'=>333,'s'=>500,'t'=>278,'u'=>556,'v'=>500,'w'=>722,'x'=>500,'y'=>500,'z'=>500,'{'=>334,'|'=>260,'}'=>334,'~'=>584,chr(127)=>350,chr(128)=>556,chr(129)=>350,chr(130)=>222,chr(131)=>556, + chr(132)=>333,chr(133)=>1000,chr(134)=>556,chr(135)=>556,chr(136)=>333,chr(137)=>1000,chr(138)=>667,chr(139)=>333,chr(140)=>1000,chr(141)=>350,chr(142)=>611,chr(143)=>350,chr(144)=>350,chr(145)=>222,chr(146)=>222,chr(147)=>333,chr(148)=>333,chr(149)=>350,chr(150)=>556,chr(151)=>1000,chr(152)=>333,chr(153)=>1000, + chr(154)=>500,chr(155)=>333,chr(156)=>944,chr(157)=>350,chr(158)=>500,chr(159)=>667,chr(160)=>278,chr(161)=>333,chr(162)=>556,chr(163)=>556,chr(164)=>556,chr(165)=>556,chr(166)=>260,chr(167)=>556,chr(168)=>333,chr(169)=>737,chr(170)=>370,chr(171)=>556,chr(172)=>584,chr(173)=>333,chr(174)=>737,chr(175)=>333, + chr(176)=>400,chr(177)=>584,chr(178)=>333,chr(179)=>333,chr(180)=>333,chr(181)=>556,chr(182)=>537,chr(183)=>278,chr(184)=>333,chr(185)=>333,chr(186)=>365,chr(187)=>556,chr(188)=>834,chr(189)=>834,chr(190)=>834,chr(191)=>611,chr(192)=>667,chr(193)=>667,chr(194)=>667,chr(195)=>667,chr(196)=>667,chr(197)=>667, + chr(198)=>1000,chr(199)=>722,chr(200)=>667,chr(201)=>667,chr(202)=>667,chr(203)=>667,chr(204)=>278,chr(205)=>278,chr(206)=>278,chr(207)=>278,chr(208)=>722,chr(209)=>722,chr(210)=>778,chr(211)=>778,chr(212)=>778,chr(213)=>778,chr(214)=>778,chr(215)=>584,chr(216)=>778,chr(217)=>722,chr(218)=>722,chr(219)=>722, + chr(220)=>722,chr(221)=>667,chr(222)=>667,chr(223)=>611,chr(224)=>556,chr(225)=>556,chr(226)=>556,chr(227)=>556,chr(228)=>556,chr(229)=>556,chr(230)=>889,chr(231)=>500,chr(232)=>556,chr(233)=>556,chr(234)=>556,chr(235)=>556,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>556,chr(241)=>556, + chr(242)=>556,chr(243)=>556,chr(244)=>556,chr(245)=>556,chr(246)=>556,chr(247)=>584,chr(248)=>611,chr(249)=>556,chr(250)=>556,chr(251)=>556,chr(252)=>556,chr(253)=>500,chr(254)=>556,chr(255)=>500); +?> diff --git a/includes/fpdf/font/helveticab.php b/includes/fpdf/font/helveticab.php new file mode 100644 index 0000000000..6c9b972bee --- /dev/null +++ b/includes/fpdf/font/helveticab.php @@ -0,0 +1,19 @@ +278,chr(1)=>278,chr(2)=>278,chr(3)=>278,chr(4)=>278,chr(5)=>278,chr(6)=>278,chr(7)=>278,chr(8)=>278,chr(9)=>278,chr(10)=>278,chr(11)=>278,chr(12)=>278,chr(13)=>278,chr(14)=>278,chr(15)=>278,chr(16)=>278,chr(17)=>278,chr(18)=>278,chr(19)=>278,chr(20)=>278,chr(21)=>278, + chr(22)=>278,chr(23)=>278,chr(24)=>278,chr(25)=>278,chr(26)=>278,chr(27)=>278,chr(28)=>278,chr(29)=>278,chr(30)=>278,chr(31)=>278,' '=>278,'!'=>333,'"'=>474,'#'=>556,'$'=>556,'%'=>889,'&'=>722,'\''=>238,'('=>333,')'=>333,'*'=>389,'+'=>584, + ','=>278,'-'=>333,'.'=>278,'/'=>278,'0'=>556,'1'=>556,'2'=>556,'3'=>556,'4'=>556,'5'=>556,'6'=>556,'7'=>556,'8'=>556,'9'=>556,':'=>333,';'=>333,'<'=>584,'='=>584,'>'=>584,'?'=>611,'@'=>975,'A'=>722, + 'B'=>722,'C'=>722,'D'=>722,'E'=>667,'F'=>611,'G'=>778,'H'=>722,'I'=>278,'J'=>556,'K'=>722,'L'=>611,'M'=>833,'N'=>722,'O'=>778,'P'=>667,'Q'=>778,'R'=>722,'S'=>667,'T'=>611,'U'=>722,'V'=>667,'W'=>944, + 'X'=>667,'Y'=>667,'Z'=>611,'['=>333,'\\'=>278,']'=>333,'^'=>584,'_'=>556,'`'=>333,'a'=>556,'b'=>611,'c'=>556,'d'=>611,'e'=>556,'f'=>333,'g'=>611,'h'=>611,'i'=>278,'j'=>278,'k'=>556,'l'=>278,'m'=>889, + 'n'=>611,'o'=>611,'p'=>611,'q'=>611,'r'=>389,'s'=>556,'t'=>333,'u'=>611,'v'=>556,'w'=>778,'x'=>556,'y'=>556,'z'=>500,'{'=>389,'|'=>280,'}'=>389,'~'=>584,chr(127)=>350,chr(128)=>556,chr(129)=>350,chr(130)=>278,chr(131)=>556, + chr(132)=>500,chr(133)=>1000,chr(134)=>556,chr(135)=>556,chr(136)=>333,chr(137)=>1000,chr(138)=>667,chr(139)=>333,chr(140)=>1000,chr(141)=>350,chr(142)=>611,chr(143)=>350,chr(144)=>350,chr(145)=>278,chr(146)=>278,chr(147)=>500,chr(148)=>500,chr(149)=>350,chr(150)=>556,chr(151)=>1000,chr(152)=>333,chr(153)=>1000, + chr(154)=>556,chr(155)=>333,chr(156)=>944,chr(157)=>350,chr(158)=>500,chr(159)=>667,chr(160)=>278,chr(161)=>333,chr(162)=>556,chr(163)=>556,chr(164)=>556,chr(165)=>556,chr(166)=>280,chr(167)=>556,chr(168)=>333,chr(169)=>737,chr(170)=>370,chr(171)=>556,chr(172)=>584,chr(173)=>333,chr(174)=>737,chr(175)=>333, + chr(176)=>400,chr(177)=>584,chr(178)=>333,chr(179)=>333,chr(180)=>333,chr(181)=>611,chr(182)=>556,chr(183)=>278,chr(184)=>333,chr(185)=>333,chr(186)=>365,chr(187)=>556,chr(188)=>834,chr(189)=>834,chr(190)=>834,chr(191)=>611,chr(192)=>722,chr(193)=>722,chr(194)=>722,chr(195)=>722,chr(196)=>722,chr(197)=>722, + chr(198)=>1000,chr(199)=>722,chr(200)=>667,chr(201)=>667,chr(202)=>667,chr(203)=>667,chr(204)=>278,chr(205)=>278,chr(206)=>278,chr(207)=>278,chr(208)=>722,chr(209)=>722,chr(210)=>778,chr(211)=>778,chr(212)=>778,chr(213)=>778,chr(214)=>778,chr(215)=>584,chr(216)=>778,chr(217)=>722,chr(218)=>722,chr(219)=>722, + chr(220)=>722,chr(221)=>667,chr(222)=>667,chr(223)=>611,chr(224)=>556,chr(225)=>556,chr(226)=>556,chr(227)=>556,chr(228)=>556,chr(229)=>556,chr(230)=>889,chr(231)=>556,chr(232)=>556,chr(233)=>556,chr(234)=>556,chr(235)=>556,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>611,chr(241)=>611, + chr(242)=>611,chr(243)=>611,chr(244)=>611,chr(245)=>611,chr(246)=>611,chr(247)=>584,chr(248)=>611,chr(249)=>611,chr(250)=>611,chr(251)=>611,chr(252)=>611,chr(253)=>556,chr(254)=>611,chr(255)=>556); +?> diff --git a/includes/fpdf/font/helveticabi.php b/includes/fpdf/font/helveticabi.php new file mode 100644 index 0000000000..47203119be --- /dev/null +++ b/includes/fpdf/font/helveticabi.php @@ -0,0 +1,19 @@ +278,chr(1)=>278,chr(2)=>278,chr(3)=>278,chr(4)=>278,chr(5)=>278,chr(6)=>278,chr(7)=>278,chr(8)=>278,chr(9)=>278,chr(10)=>278,chr(11)=>278,chr(12)=>278,chr(13)=>278,chr(14)=>278,chr(15)=>278,chr(16)=>278,chr(17)=>278,chr(18)=>278,chr(19)=>278,chr(20)=>278,chr(21)=>278, + chr(22)=>278,chr(23)=>278,chr(24)=>278,chr(25)=>278,chr(26)=>278,chr(27)=>278,chr(28)=>278,chr(29)=>278,chr(30)=>278,chr(31)=>278,' '=>278,'!'=>333,'"'=>474,'#'=>556,'$'=>556,'%'=>889,'&'=>722,'\''=>238,'('=>333,')'=>333,'*'=>389,'+'=>584, + ','=>278,'-'=>333,'.'=>278,'/'=>278,'0'=>556,'1'=>556,'2'=>556,'3'=>556,'4'=>556,'5'=>556,'6'=>556,'7'=>556,'8'=>556,'9'=>556,':'=>333,';'=>333,'<'=>584,'='=>584,'>'=>584,'?'=>611,'@'=>975,'A'=>722, + 'B'=>722,'C'=>722,'D'=>722,'E'=>667,'F'=>611,'G'=>778,'H'=>722,'I'=>278,'J'=>556,'K'=>722,'L'=>611,'M'=>833,'N'=>722,'O'=>778,'P'=>667,'Q'=>778,'R'=>722,'S'=>667,'T'=>611,'U'=>722,'V'=>667,'W'=>944, + 'X'=>667,'Y'=>667,'Z'=>611,'['=>333,'\\'=>278,']'=>333,'^'=>584,'_'=>556,'`'=>333,'a'=>556,'b'=>611,'c'=>556,'d'=>611,'e'=>556,'f'=>333,'g'=>611,'h'=>611,'i'=>278,'j'=>278,'k'=>556,'l'=>278,'m'=>889, + 'n'=>611,'o'=>611,'p'=>611,'q'=>611,'r'=>389,'s'=>556,'t'=>333,'u'=>611,'v'=>556,'w'=>778,'x'=>556,'y'=>556,'z'=>500,'{'=>389,'|'=>280,'}'=>389,'~'=>584,chr(127)=>350,chr(128)=>556,chr(129)=>350,chr(130)=>278,chr(131)=>556, + chr(132)=>500,chr(133)=>1000,chr(134)=>556,chr(135)=>556,chr(136)=>333,chr(137)=>1000,chr(138)=>667,chr(139)=>333,chr(140)=>1000,chr(141)=>350,chr(142)=>611,chr(143)=>350,chr(144)=>350,chr(145)=>278,chr(146)=>278,chr(147)=>500,chr(148)=>500,chr(149)=>350,chr(150)=>556,chr(151)=>1000,chr(152)=>333,chr(153)=>1000, + chr(154)=>556,chr(155)=>333,chr(156)=>944,chr(157)=>350,chr(158)=>500,chr(159)=>667,chr(160)=>278,chr(161)=>333,chr(162)=>556,chr(163)=>556,chr(164)=>556,chr(165)=>556,chr(166)=>280,chr(167)=>556,chr(168)=>333,chr(169)=>737,chr(170)=>370,chr(171)=>556,chr(172)=>584,chr(173)=>333,chr(174)=>737,chr(175)=>333, + chr(176)=>400,chr(177)=>584,chr(178)=>333,chr(179)=>333,chr(180)=>333,chr(181)=>611,chr(182)=>556,chr(183)=>278,chr(184)=>333,chr(185)=>333,chr(186)=>365,chr(187)=>556,chr(188)=>834,chr(189)=>834,chr(190)=>834,chr(191)=>611,chr(192)=>722,chr(193)=>722,chr(194)=>722,chr(195)=>722,chr(196)=>722,chr(197)=>722, + chr(198)=>1000,chr(199)=>722,chr(200)=>667,chr(201)=>667,chr(202)=>667,chr(203)=>667,chr(204)=>278,chr(205)=>278,chr(206)=>278,chr(207)=>278,chr(208)=>722,chr(209)=>722,chr(210)=>778,chr(211)=>778,chr(212)=>778,chr(213)=>778,chr(214)=>778,chr(215)=>584,chr(216)=>778,chr(217)=>722,chr(218)=>722,chr(219)=>722, + chr(220)=>722,chr(221)=>667,chr(222)=>667,chr(223)=>611,chr(224)=>556,chr(225)=>556,chr(226)=>556,chr(227)=>556,chr(228)=>556,chr(229)=>556,chr(230)=>889,chr(231)=>556,chr(232)=>556,chr(233)=>556,chr(234)=>556,chr(235)=>556,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>611,chr(241)=>611, + chr(242)=>611,chr(243)=>611,chr(244)=>611,chr(245)=>611,chr(246)=>611,chr(247)=>584,chr(248)=>611,chr(249)=>611,chr(250)=>611,chr(251)=>611,chr(252)=>611,chr(253)=>556,chr(254)=>611,chr(255)=>556); +?> diff --git a/includes/fpdf/font/helveticai.php b/includes/fpdf/font/helveticai.php new file mode 100644 index 0000000000..25fb7949cd --- /dev/null +++ b/includes/fpdf/font/helveticai.php @@ -0,0 +1,19 @@ +278,chr(1)=>278,chr(2)=>278,chr(3)=>278,chr(4)=>278,chr(5)=>278,chr(6)=>278,chr(7)=>278,chr(8)=>278,chr(9)=>278,chr(10)=>278,chr(11)=>278,chr(12)=>278,chr(13)=>278,chr(14)=>278,chr(15)=>278,chr(16)=>278,chr(17)=>278,chr(18)=>278,chr(19)=>278,chr(20)=>278,chr(21)=>278, + chr(22)=>278,chr(23)=>278,chr(24)=>278,chr(25)=>278,chr(26)=>278,chr(27)=>278,chr(28)=>278,chr(29)=>278,chr(30)=>278,chr(31)=>278,' '=>278,'!'=>278,'"'=>355,'#'=>556,'$'=>556,'%'=>889,'&'=>667,'\''=>191,'('=>333,')'=>333,'*'=>389,'+'=>584, + ','=>278,'-'=>333,'.'=>278,'/'=>278,'0'=>556,'1'=>556,'2'=>556,'3'=>556,'4'=>556,'5'=>556,'6'=>556,'7'=>556,'8'=>556,'9'=>556,':'=>278,';'=>278,'<'=>584,'='=>584,'>'=>584,'?'=>556,'@'=>1015,'A'=>667, + 'B'=>667,'C'=>722,'D'=>722,'E'=>667,'F'=>611,'G'=>778,'H'=>722,'I'=>278,'J'=>500,'K'=>667,'L'=>556,'M'=>833,'N'=>722,'O'=>778,'P'=>667,'Q'=>778,'R'=>722,'S'=>667,'T'=>611,'U'=>722,'V'=>667,'W'=>944, + 'X'=>667,'Y'=>667,'Z'=>611,'['=>278,'\\'=>278,']'=>278,'^'=>469,'_'=>556,'`'=>333,'a'=>556,'b'=>556,'c'=>500,'d'=>556,'e'=>556,'f'=>278,'g'=>556,'h'=>556,'i'=>222,'j'=>222,'k'=>500,'l'=>222,'m'=>833, + 'n'=>556,'o'=>556,'p'=>556,'q'=>556,'r'=>333,'s'=>500,'t'=>278,'u'=>556,'v'=>500,'w'=>722,'x'=>500,'y'=>500,'z'=>500,'{'=>334,'|'=>260,'}'=>334,'~'=>584,chr(127)=>350,chr(128)=>556,chr(129)=>350,chr(130)=>222,chr(131)=>556, + chr(132)=>333,chr(133)=>1000,chr(134)=>556,chr(135)=>556,chr(136)=>333,chr(137)=>1000,chr(138)=>667,chr(139)=>333,chr(140)=>1000,chr(141)=>350,chr(142)=>611,chr(143)=>350,chr(144)=>350,chr(145)=>222,chr(146)=>222,chr(147)=>333,chr(148)=>333,chr(149)=>350,chr(150)=>556,chr(151)=>1000,chr(152)=>333,chr(153)=>1000, + chr(154)=>500,chr(155)=>333,chr(156)=>944,chr(157)=>350,chr(158)=>500,chr(159)=>667,chr(160)=>278,chr(161)=>333,chr(162)=>556,chr(163)=>556,chr(164)=>556,chr(165)=>556,chr(166)=>260,chr(167)=>556,chr(168)=>333,chr(169)=>737,chr(170)=>370,chr(171)=>556,chr(172)=>584,chr(173)=>333,chr(174)=>737,chr(175)=>333, + chr(176)=>400,chr(177)=>584,chr(178)=>333,chr(179)=>333,chr(180)=>333,chr(181)=>556,chr(182)=>537,chr(183)=>278,chr(184)=>333,chr(185)=>333,chr(186)=>365,chr(187)=>556,chr(188)=>834,chr(189)=>834,chr(190)=>834,chr(191)=>611,chr(192)=>667,chr(193)=>667,chr(194)=>667,chr(195)=>667,chr(196)=>667,chr(197)=>667, + chr(198)=>1000,chr(199)=>722,chr(200)=>667,chr(201)=>667,chr(202)=>667,chr(203)=>667,chr(204)=>278,chr(205)=>278,chr(206)=>278,chr(207)=>278,chr(208)=>722,chr(209)=>722,chr(210)=>778,chr(211)=>778,chr(212)=>778,chr(213)=>778,chr(214)=>778,chr(215)=>584,chr(216)=>778,chr(217)=>722,chr(218)=>722,chr(219)=>722, + chr(220)=>722,chr(221)=>667,chr(222)=>667,chr(223)=>611,chr(224)=>556,chr(225)=>556,chr(226)=>556,chr(227)=>556,chr(228)=>556,chr(229)=>556,chr(230)=>889,chr(231)=>500,chr(232)=>556,chr(233)=>556,chr(234)=>556,chr(235)=>556,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>556,chr(241)=>556, + chr(242)=>556,chr(243)=>556,chr(244)=>556,chr(245)=>556,chr(246)=>556,chr(247)=>584,chr(248)=>611,chr(249)=>556,chr(250)=>556,chr(251)=>556,chr(252)=>556,chr(253)=>500,chr(254)=>556,chr(255)=>500); +?> diff --git a/includes/fpdf/font/symbol.php b/includes/fpdf/font/symbol.php new file mode 100644 index 0000000000..a89f2954a9 --- /dev/null +++ b/includes/fpdf/font/symbol.php @@ -0,0 +1,19 @@ +250,chr(1)=>250,chr(2)=>250,chr(3)=>250,chr(4)=>250,chr(5)=>250,chr(6)=>250,chr(7)=>250,chr(8)=>250,chr(9)=>250,chr(10)=>250,chr(11)=>250,chr(12)=>250,chr(13)=>250,chr(14)=>250,chr(15)=>250,chr(16)=>250,chr(17)=>250,chr(18)=>250,chr(19)=>250,chr(20)=>250,chr(21)=>250, + chr(22)=>250,chr(23)=>250,chr(24)=>250,chr(25)=>250,chr(26)=>250,chr(27)=>250,chr(28)=>250,chr(29)=>250,chr(30)=>250,chr(31)=>250,' '=>250,'!'=>333,'"'=>713,'#'=>500,'$'=>549,'%'=>833,'&'=>778,'\''=>439,'('=>333,')'=>333,'*'=>500,'+'=>549, + ','=>250,'-'=>549,'.'=>250,'/'=>278,'0'=>500,'1'=>500,'2'=>500,'3'=>500,'4'=>500,'5'=>500,'6'=>500,'7'=>500,'8'=>500,'9'=>500,':'=>278,';'=>278,'<'=>549,'='=>549,'>'=>549,'?'=>444,'@'=>549,'A'=>722, + 'B'=>667,'C'=>722,'D'=>612,'E'=>611,'F'=>763,'G'=>603,'H'=>722,'I'=>333,'J'=>631,'K'=>722,'L'=>686,'M'=>889,'N'=>722,'O'=>722,'P'=>768,'Q'=>741,'R'=>556,'S'=>592,'T'=>611,'U'=>690,'V'=>439,'W'=>768, + 'X'=>645,'Y'=>795,'Z'=>611,'['=>333,'\\'=>863,']'=>333,'^'=>658,'_'=>500,'`'=>500,'a'=>631,'b'=>549,'c'=>549,'d'=>494,'e'=>439,'f'=>521,'g'=>411,'h'=>603,'i'=>329,'j'=>603,'k'=>549,'l'=>549,'m'=>576, + 'n'=>521,'o'=>549,'p'=>549,'q'=>521,'r'=>549,'s'=>603,'t'=>439,'u'=>576,'v'=>713,'w'=>686,'x'=>493,'y'=>686,'z'=>494,'{'=>480,'|'=>200,'}'=>480,'~'=>549,chr(127)=>0,chr(128)=>0,chr(129)=>0,chr(130)=>0,chr(131)=>0, + chr(132)=>0,chr(133)=>0,chr(134)=>0,chr(135)=>0,chr(136)=>0,chr(137)=>0,chr(138)=>0,chr(139)=>0,chr(140)=>0,chr(141)=>0,chr(142)=>0,chr(143)=>0,chr(144)=>0,chr(145)=>0,chr(146)=>0,chr(147)=>0,chr(148)=>0,chr(149)=>0,chr(150)=>0,chr(151)=>0,chr(152)=>0,chr(153)=>0, + chr(154)=>0,chr(155)=>0,chr(156)=>0,chr(157)=>0,chr(158)=>0,chr(159)=>0,chr(160)=>750,chr(161)=>620,chr(162)=>247,chr(163)=>549,chr(164)=>167,chr(165)=>713,chr(166)=>500,chr(167)=>753,chr(168)=>753,chr(169)=>753,chr(170)=>753,chr(171)=>1042,chr(172)=>987,chr(173)=>603,chr(174)=>987,chr(175)=>603, + chr(176)=>400,chr(177)=>549,chr(178)=>411,chr(179)=>549,chr(180)=>549,chr(181)=>713,chr(182)=>494,chr(183)=>460,chr(184)=>549,chr(185)=>549,chr(186)=>549,chr(187)=>549,chr(188)=>1000,chr(189)=>603,chr(190)=>1000,chr(191)=>658,chr(192)=>823,chr(193)=>686,chr(194)=>795,chr(195)=>987,chr(196)=>768,chr(197)=>768, + chr(198)=>823,chr(199)=>768,chr(200)=>768,chr(201)=>713,chr(202)=>713,chr(203)=>713,chr(204)=>713,chr(205)=>713,chr(206)=>713,chr(207)=>713,chr(208)=>768,chr(209)=>713,chr(210)=>790,chr(211)=>790,chr(212)=>890,chr(213)=>823,chr(214)=>549,chr(215)=>250,chr(216)=>713,chr(217)=>603,chr(218)=>603,chr(219)=>1042, + chr(220)=>987,chr(221)=>603,chr(222)=>987,chr(223)=>603,chr(224)=>494,chr(225)=>329,chr(226)=>790,chr(227)=>790,chr(228)=>786,chr(229)=>713,chr(230)=>384,chr(231)=>384,chr(232)=>384,chr(233)=>384,chr(234)=>384,chr(235)=>384,chr(236)=>494,chr(237)=>494,chr(238)=>494,chr(239)=>494,chr(240)=>0,chr(241)=>329, + chr(242)=>274,chr(243)=>686,chr(244)=>686,chr(245)=>686,chr(246)=>384,chr(247)=>384,chr(248)=>384,chr(249)=>384,chr(250)=>384,chr(251)=>384,chr(252)=>494,chr(253)=>494,chr(254)=>494,chr(255)=>0); +?> diff --git a/includes/fpdf/font/times.php b/includes/fpdf/font/times.php new file mode 100644 index 0000000000..57b9bce881 --- /dev/null +++ b/includes/fpdf/font/times.php @@ -0,0 +1,19 @@ +250,chr(1)=>250,chr(2)=>250,chr(3)=>250,chr(4)=>250,chr(5)=>250,chr(6)=>250,chr(7)=>250,chr(8)=>250,chr(9)=>250,chr(10)=>250,chr(11)=>250,chr(12)=>250,chr(13)=>250,chr(14)=>250,chr(15)=>250,chr(16)=>250,chr(17)=>250,chr(18)=>250,chr(19)=>250,chr(20)=>250,chr(21)=>250, + chr(22)=>250,chr(23)=>250,chr(24)=>250,chr(25)=>250,chr(26)=>250,chr(27)=>250,chr(28)=>250,chr(29)=>250,chr(30)=>250,chr(31)=>250,' '=>250,'!'=>333,'"'=>408,'#'=>500,'$'=>500,'%'=>833,'&'=>778,'\''=>180,'('=>333,')'=>333,'*'=>500,'+'=>564, + ','=>250,'-'=>333,'.'=>250,'/'=>278,'0'=>500,'1'=>500,'2'=>500,'3'=>500,'4'=>500,'5'=>500,'6'=>500,'7'=>500,'8'=>500,'9'=>500,':'=>278,';'=>278,'<'=>564,'='=>564,'>'=>564,'?'=>444,'@'=>921,'A'=>722, + 'B'=>667,'C'=>667,'D'=>722,'E'=>611,'F'=>556,'G'=>722,'H'=>722,'I'=>333,'J'=>389,'K'=>722,'L'=>611,'M'=>889,'N'=>722,'O'=>722,'P'=>556,'Q'=>722,'R'=>667,'S'=>556,'T'=>611,'U'=>722,'V'=>722,'W'=>944, + 'X'=>722,'Y'=>722,'Z'=>611,'['=>333,'\\'=>278,']'=>333,'^'=>469,'_'=>500,'`'=>333,'a'=>444,'b'=>500,'c'=>444,'d'=>500,'e'=>444,'f'=>333,'g'=>500,'h'=>500,'i'=>278,'j'=>278,'k'=>500,'l'=>278,'m'=>778, + 'n'=>500,'o'=>500,'p'=>500,'q'=>500,'r'=>333,'s'=>389,'t'=>278,'u'=>500,'v'=>500,'w'=>722,'x'=>500,'y'=>500,'z'=>444,'{'=>480,'|'=>200,'}'=>480,'~'=>541,chr(127)=>350,chr(128)=>500,chr(129)=>350,chr(130)=>333,chr(131)=>500, + chr(132)=>444,chr(133)=>1000,chr(134)=>500,chr(135)=>500,chr(136)=>333,chr(137)=>1000,chr(138)=>556,chr(139)=>333,chr(140)=>889,chr(141)=>350,chr(142)=>611,chr(143)=>350,chr(144)=>350,chr(145)=>333,chr(146)=>333,chr(147)=>444,chr(148)=>444,chr(149)=>350,chr(150)=>500,chr(151)=>1000,chr(152)=>333,chr(153)=>980, + chr(154)=>389,chr(155)=>333,chr(156)=>722,chr(157)=>350,chr(158)=>444,chr(159)=>722,chr(160)=>250,chr(161)=>333,chr(162)=>500,chr(163)=>500,chr(164)=>500,chr(165)=>500,chr(166)=>200,chr(167)=>500,chr(168)=>333,chr(169)=>760,chr(170)=>276,chr(171)=>500,chr(172)=>564,chr(173)=>333,chr(174)=>760,chr(175)=>333, + chr(176)=>400,chr(177)=>564,chr(178)=>300,chr(179)=>300,chr(180)=>333,chr(181)=>500,chr(182)=>453,chr(183)=>250,chr(184)=>333,chr(185)=>300,chr(186)=>310,chr(187)=>500,chr(188)=>750,chr(189)=>750,chr(190)=>750,chr(191)=>444,chr(192)=>722,chr(193)=>722,chr(194)=>722,chr(195)=>722,chr(196)=>722,chr(197)=>722, + chr(198)=>889,chr(199)=>667,chr(200)=>611,chr(201)=>611,chr(202)=>611,chr(203)=>611,chr(204)=>333,chr(205)=>333,chr(206)=>333,chr(207)=>333,chr(208)=>722,chr(209)=>722,chr(210)=>722,chr(211)=>722,chr(212)=>722,chr(213)=>722,chr(214)=>722,chr(215)=>564,chr(216)=>722,chr(217)=>722,chr(218)=>722,chr(219)=>722, + chr(220)=>722,chr(221)=>722,chr(222)=>556,chr(223)=>500,chr(224)=>444,chr(225)=>444,chr(226)=>444,chr(227)=>444,chr(228)=>444,chr(229)=>444,chr(230)=>667,chr(231)=>444,chr(232)=>444,chr(233)=>444,chr(234)=>444,chr(235)=>444,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>500,chr(241)=>500, + chr(242)=>500,chr(243)=>500,chr(244)=>500,chr(245)=>500,chr(246)=>500,chr(247)=>564,chr(248)=>500,chr(249)=>500,chr(250)=>500,chr(251)=>500,chr(252)=>500,chr(253)=>500,chr(254)=>500,chr(255)=>500); +?> diff --git a/includes/fpdf/font/timesb.php b/includes/fpdf/font/timesb.php new file mode 100644 index 0000000000..6946b9ea4a --- /dev/null +++ b/includes/fpdf/font/timesb.php @@ -0,0 +1,19 @@ +250,chr(1)=>250,chr(2)=>250,chr(3)=>250,chr(4)=>250,chr(5)=>250,chr(6)=>250,chr(7)=>250,chr(8)=>250,chr(9)=>250,chr(10)=>250,chr(11)=>250,chr(12)=>250,chr(13)=>250,chr(14)=>250,chr(15)=>250,chr(16)=>250,chr(17)=>250,chr(18)=>250,chr(19)=>250,chr(20)=>250,chr(21)=>250, + chr(22)=>250,chr(23)=>250,chr(24)=>250,chr(25)=>250,chr(26)=>250,chr(27)=>250,chr(28)=>250,chr(29)=>250,chr(30)=>250,chr(31)=>250,' '=>250,'!'=>333,'"'=>555,'#'=>500,'$'=>500,'%'=>1000,'&'=>833,'\''=>278,'('=>333,')'=>333,'*'=>500,'+'=>570, + ','=>250,'-'=>333,'.'=>250,'/'=>278,'0'=>500,'1'=>500,'2'=>500,'3'=>500,'4'=>500,'5'=>500,'6'=>500,'7'=>500,'8'=>500,'9'=>500,':'=>333,';'=>333,'<'=>570,'='=>570,'>'=>570,'?'=>500,'@'=>930,'A'=>722, + 'B'=>667,'C'=>722,'D'=>722,'E'=>667,'F'=>611,'G'=>778,'H'=>778,'I'=>389,'J'=>500,'K'=>778,'L'=>667,'M'=>944,'N'=>722,'O'=>778,'P'=>611,'Q'=>778,'R'=>722,'S'=>556,'T'=>667,'U'=>722,'V'=>722,'W'=>1000, + 'X'=>722,'Y'=>722,'Z'=>667,'['=>333,'\\'=>278,']'=>333,'^'=>581,'_'=>500,'`'=>333,'a'=>500,'b'=>556,'c'=>444,'d'=>556,'e'=>444,'f'=>333,'g'=>500,'h'=>556,'i'=>278,'j'=>333,'k'=>556,'l'=>278,'m'=>833, + 'n'=>556,'o'=>500,'p'=>556,'q'=>556,'r'=>444,'s'=>389,'t'=>333,'u'=>556,'v'=>500,'w'=>722,'x'=>500,'y'=>500,'z'=>444,'{'=>394,'|'=>220,'}'=>394,'~'=>520,chr(127)=>350,chr(128)=>500,chr(129)=>350,chr(130)=>333,chr(131)=>500, + chr(132)=>500,chr(133)=>1000,chr(134)=>500,chr(135)=>500,chr(136)=>333,chr(137)=>1000,chr(138)=>556,chr(139)=>333,chr(140)=>1000,chr(141)=>350,chr(142)=>667,chr(143)=>350,chr(144)=>350,chr(145)=>333,chr(146)=>333,chr(147)=>500,chr(148)=>500,chr(149)=>350,chr(150)=>500,chr(151)=>1000,chr(152)=>333,chr(153)=>1000, + chr(154)=>389,chr(155)=>333,chr(156)=>722,chr(157)=>350,chr(158)=>444,chr(159)=>722,chr(160)=>250,chr(161)=>333,chr(162)=>500,chr(163)=>500,chr(164)=>500,chr(165)=>500,chr(166)=>220,chr(167)=>500,chr(168)=>333,chr(169)=>747,chr(170)=>300,chr(171)=>500,chr(172)=>570,chr(173)=>333,chr(174)=>747,chr(175)=>333, + chr(176)=>400,chr(177)=>570,chr(178)=>300,chr(179)=>300,chr(180)=>333,chr(181)=>556,chr(182)=>540,chr(183)=>250,chr(184)=>333,chr(185)=>300,chr(186)=>330,chr(187)=>500,chr(188)=>750,chr(189)=>750,chr(190)=>750,chr(191)=>500,chr(192)=>722,chr(193)=>722,chr(194)=>722,chr(195)=>722,chr(196)=>722,chr(197)=>722, + chr(198)=>1000,chr(199)=>722,chr(200)=>667,chr(201)=>667,chr(202)=>667,chr(203)=>667,chr(204)=>389,chr(205)=>389,chr(206)=>389,chr(207)=>389,chr(208)=>722,chr(209)=>722,chr(210)=>778,chr(211)=>778,chr(212)=>778,chr(213)=>778,chr(214)=>778,chr(215)=>570,chr(216)=>778,chr(217)=>722,chr(218)=>722,chr(219)=>722, + chr(220)=>722,chr(221)=>722,chr(222)=>611,chr(223)=>556,chr(224)=>500,chr(225)=>500,chr(226)=>500,chr(227)=>500,chr(228)=>500,chr(229)=>500,chr(230)=>722,chr(231)=>444,chr(232)=>444,chr(233)=>444,chr(234)=>444,chr(235)=>444,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>500,chr(241)=>556, + chr(242)=>500,chr(243)=>500,chr(244)=>500,chr(245)=>500,chr(246)=>500,chr(247)=>570,chr(248)=>500,chr(249)=>556,chr(250)=>556,chr(251)=>556,chr(252)=>556,chr(253)=>500,chr(254)=>556,chr(255)=>500); +?> diff --git a/includes/fpdf/font/timesbi.php b/includes/fpdf/font/timesbi.php new file mode 100644 index 0000000000..cd5e5f1272 --- /dev/null +++ b/includes/fpdf/font/timesbi.php @@ -0,0 +1,19 @@ +250,chr(1)=>250,chr(2)=>250,chr(3)=>250,chr(4)=>250,chr(5)=>250,chr(6)=>250,chr(7)=>250,chr(8)=>250,chr(9)=>250,chr(10)=>250,chr(11)=>250,chr(12)=>250,chr(13)=>250,chr(14)=>250,chr(15)=>250,chr(16)=>250,chr(17)=>250,chr(18)=>250,chr(19)=>250,chr(20)=>250,chr(21)=>250, + chr(22)=>250,chr(23)=>250,chr(24)=>250,chr(25)=>250,chr(26)=>250,chr(27)=>250,chr(28)=>250,chr(29)=>250,chr(30)=>250,chr(31)=>250,' '=>250,'!'=>389,'"'=>555,'#'=>500,'$'=>500,'%'=>833,'&'=>778,'\''=>278,'('=>333,')'=>333,'*'=>500,'+'=>570, + ','=>250,'-'=>333,'.'=>250,'/'=>278,'0'=>500,'1'=>500,'2'=>500,'3'=>500,'4'=>500,'5'=>500,'6'=>500,'7'=>500,'8'=>500,'9'=>500,':'=>333,';'=>333,'<'=>570,'='=>570,'>'=>570,'?'=>500,'@'=>832,'A'=>667, + 'B'=>667,'C'=>667,'D'=>722,'E'=>667,'F'=>667,'G'=>722,'H'=>778,'I'=>389,'J'=>500,'K'=>667,'L'=>611,'M'=>889,'N'=>722,'O'=>722,'P'=>611,'Q'=>722,'R'=>667,'S'=>556,'T'=>611,'U'=>722,'V'=>667,'W'=>889, + 'X'=>667,'Y'=>611,'Z'=>611,'['=>333,'\\'=>278,']'=>333,'^'=>570,'_'=>500,'`'=>333,'a'=>500,'b'=>500,'c'=>444,'d'=>500,'e'=>444,'f'=>333,'g'=>500,'h'=>556,'i'=>278,'j'=>278,'k'=>500,'l'=>278,'m'=>778, + 'n'=>556,'o'=>500,'p'=>500,'q'=>500,'r'=>389,'s'=>389,'t'=>278,'u'=>556,'v'=>444,'w'=>667,'x'=>500,'y'=>444,'z'=>389,'{'=>348,'|'=>220,'}'=>348,'~'=>570,chr(127)=>350,chr(128)=>500,chr(129)=>350,chr(130)=>333,chr(131)=>500, + chr(132)=>500,chr(133)=>1000,chr(134)=>500,chr(135)=>500,chr(136)=>333,chr(137)=>1000,chr(138)=>556,chr(139)=>333,chr(140)=>944,chr(141)=>350,chr(142)=>611,chr(143)=>350,chr(144)=>350,chr(145)=>333,chr(146)=>333,chr(147)=>500,chr(148)=>500,chr(149)=>350,chr(150)=>500,chr(151)=>1000,chr(152)=>333,chr(153)=>1000, + chr(154)=>389,chr(155)=>333,chr(156)=>722,chr(157)=>350,chr(158)=>389,chr(159)=>611,chr(160)=>250,chr(161)=>389,chr(162)=>500,chr(163)=>500,chr(164)=>500,chr(165)=>500,chr(166)=>220,chr(167)=>500,chr(168)=>333,chr(169)=>747,chr(170)=>266,chr(171)=>500,chr(172)=>606,chr(173)=>333,chr(174)=>747,chr(175)=>333, + chr(176)=>400,chr(177)=>570,chr(178)=>300,chr(179)=>300,chr(180)=>333,chr(181)=>576,chr(182)=>500,chr(183)=>250,chr(184)=>333,chr(185)=>300,chr(186)=>300,chr(187)=>500,chr(188)=>750,chr(189)=>750,chr(190)=>750,chr(191)=>500,chr(192)=>667,chr(193)=>667,chr(194)=>667,chr(195)=>667,chr(196)=>667,chr(197)=>667, + chr(198)=>944,chr(199)=>667,chr(200)=>667,chr(201)=>667,chr(202)=>667,chr(203)=>667,chr(204)=>389,chr(205)=>389,chr(206)=>389,chr(207)=>389,chr(208)=>722,chr(209)=>722,chr(210)=>722,chr(211)=>722,chr(212)=>722,chr(213)=>722,chr(214)=>722,chr(215)=>570,chr(216)=>722,chr(217)=>722,chr(218)=>722,chr(219)=>722, + chr(220)=>722,chr(221)=>611,chr(222)=>611,chr(223)=>500,chr(224)=>500,chr(225)=>500,chr(226)=>500,chr(227)=>500,chr(228)=>500,chr(229)=>500,chr(230)=>722,chr(231)=>444,chr(232)=>444,chr(233)=>444,chr(234)=>444,chr(235)=>444,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>500,chr(241)=>556, + chr(242)=>500,chr(243)=>500,chr(244)=>500,chr(245)=>500,chr(246)=>500,chr(247)=>570,chr(248)=>500,chr(249)=>556,chr(250)=>556,chr(251)=>556,chr(252)=>556,chr(253)=>444,chr(254)=>500,chr(255)=>444); +?> diff --git a/includes/fpdf/font/timesi.php b/includes/fpdf/font/timesi.php new file mode 100644 index 0000000000..d6da2a99c7 --- /dev/null +++ b/includes/fpdf/font/timesi.php @@ -0,0 +1,19 @@ +250,chr(1)=>250,chr(2)=>250,chr(3)=>250,chr(4)=>250,chr(5)=>250,chr(6)=>250,chr(7)=>250,chr(8)=>250,chr(9)=>250,chr(10)=>250,chr(11)=>250,chr(12)=>250,chr(13)=>250,chr(14)=>250,chr(15)=>250,chr(16)=>250,chr(17)=>250,chr(18)=>250,chr(19)=>250,chr(20)=>250,chr(21)=>250, + chr(22)=>250,chr(23)=>250,chr(24)=>250,chr(25)=>250,chr(26)=>250,chr(27)=>250,chr(28)=>250,chr(29)=>250,chr(30)=>250,chr(31)=>250,' '=>250,'!'=>333,'"'=>420,'#'=>500,'$'=>500,'%'=>833,'&'=>778,'\''=>214,'('=>333,')'=>333,'*'=>500,'+'=>675, + ','=>250,'-'=>333,'.'=>250,'/'=>278,'0'=>500,'1'=>500,'2'=>500,'3'=>500,'4'=>500,'5'=>500,'6'=>500,'7'=>500,'8'=>500,'9'=>500,':'=>333,';'=>333,'<'=>675,'='=>675,'>'=>675,'?'=>500,'@'=>920,'A'=>611, + 'B'=>611,'C'=>667,'D'=>722,'E'=>611,'F'=>611,'G'=>722,'H'=>722,'I'=>333,'J'=>444,'K'=>667,'L'=>556,'M'=>833,'N'=>667,'O'=>722,'P'=>611,'Q'=>722,'R'=>611,'S'=>500,'T'=>556,'U'=>722,'V'=>611,'W'=>833, + 'X'=>611,'Y'=>556,'Z'=>556,'['=>389,'\\'=>278,']'=>389,'^'=>422,'_'=>500,'`'=>333,'a'=>500,'b'=>500,'c'=>444,'d'=>500,'e'=>444,'f'=>278,'g'=>500,'h'=>500,'i'=>278,'j'=>278,'k'=>444,'l'=>278,'m'=>722, + 'n'=>500,'o'=>500,'p'=>500,'q'=>500,'r'=>389,'s'=>389,'t'=>278,'u'=>500,'v'=>444,'w'=>667,'x'=>444,'y'=>444,'z'=>389,'{'=>400,'|'=>275,'}'=>400,'~'=>541,chr(127)=>350,chr(128)=>500,chr(129)=>350,chr(130)=>333,chr(131)=>500, + chr(132)=>556,chr(133)=>889,chr(134)=>500,chr(135)=>500,chr(136)=>333,chr(137)=>1000,chr(138)=>500,chr(139)=>333,chr(140)=>944,chr(141)=>350,chr(142)=>556,chr(143)=>350,chr(144)=>350,chr(145)=>333,chr(146)=>333,chr(147)=>556,chr(148)=>556,chr(149)=>350,chr(150)=>500,chr(151)=>889,chr(152)=>333,chr(153)=>980, + chr(154)=>389,chr(155)=>333,chr(156)=>667,chr(157)=>350,chr(158)=>389,chr(159)=>556,chr(160)=>250,chr(161)=>389,chr(162)=>500,chr(163)=>500,chr(164)=>500,chr(165)=>500,chr(166)=>275,chr(167)=>500,chr(168)=>333,chr(169)=>760,chr(170)=>276,chr(171)=>500,chr(172)=>675,chr(173)=>333,chr(174)=>760,chr(175)=>333, + chr(176)=>400,chr(177)=>675,chr(178)=>300,chr(179)=>300,chr(180)=>333,chr(181)=>500,chr(182)=>523,chr(183)=>250,chr(184)=>333,chr(185)=>300,chr(186)=>310,chr(187)=>500,chr(188)=>750,chr(189)=>750,chr(190)=>750,chr(191)=>500,chr(192)=>611,chr(193)=>611,chr(194)=>611,chr(195)=>611,chr(196)=>611,chr(197)=>611, + chr(198)=>889,chr(199)=>667,chr(200)=>611,chr(201)=>611,chr(202)=>611,chr(203)=>611,chr(204)=>333,chr(205)=>333,chr(206)=>333,chr(207)=>333,chr(208)=>722,chr(209)=>667,chr(210)=>722,chr(211)=>722,chr(212)=>722,chr(213)=>722,chr(214)=>722,chr(215)=>675,chr(216)=>722,chr(217)=>722,chr(218)=>722,chr(219)=>722, + chr(220)=>722,chr(221)=>556,chr(222)=>611,chr(223)=>500,chr(224)=>500,chr(225)=>500,chr(226)=>500,chr(227)=>500,chr(228)=>500,chr(229)=>500,chr(230)=>667,chr(231)=>444,chr(232)=>444,chr(233)=>444,chr(234)=>444,chr(235)=>444,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>500,chr(241)=>500, + chr(242)=>500,chr(243)=>500,chr(244)=>500,chr(245)=>500,chr(246)=>500,chr(247)=>675,chr(248)=>500,chr(249)=>500,chr(250)=>500,chr(251)=>500,chr(252)=>500,chr(253)=>444,chr(254)=>500,chr(255)=>444); +?> diff --git a/includes/fpdf/font/zapfdingbats.php b/includes/fpdf/font/zapfdingbats.php new file mode 100644 index 0000000000..8f7d49064d --- /dev/null +++ b/includes/fpdf/font/zapfdingbats.php @@ -0,0 +1,19 @@ +0,chr(1)=>0,chr(2)=>0,chr(3)=>0,chr(4)=>0,chr(5)=>0,chr(6)=>0,chr(7)=>0,chr(8)=>0,chr(9)=>0,chr(10)=>0,chr(11)=>0,chr(12)=>0,chr(13)=>0,chr(14)=>0,chr(15)=>0,chr(16)=>0,chr(17)=>0,chr(18)=>0,chr(19)=>0,chr(20)=>0,chr(21)=>0, + chr(22)=>0,chr(23)=>0,chr(24)=>0,chr(25)=>0,chr(26)=>0,chr(27)=>0,chr(28)=>0,chr(29)=>0,chr(30)=>0,chr(31)=>0,' '=>278,'!'=>974,'"'=>961,'#'=>974,'$'=>980,'%'=>719,'&'=>789,'\''=>790,'('=>791,')'=>690,'*'=>960,'+'=>939, + ','=>549,'-'=>855,'.'=>911,'/'=>933,'0'=>911,'1'=>945,'2'=>974,'3'=>755,'4'=>846,'5'=>762,'6'=>761,'7'=>571,'8'=>677,'9'=>763,':'=>760,';'=>759,'<'=>754,'='=>494,'>'=>552,'?'=>537,'@'=>577,'A'=>692, + 'B'=>786,'C'=>788,'D'=>788,'E'=>790,'F'=>793,'G'=>794,'H'=>816,'I'=>823,'J'=>789,'K'=>841,'L'=>823,'M'=>833,'N'=>816,'O'=>831,'P'=>923,'Q'=>744,'R'=>723,'S'=>749,'T'=>790,'U'=>792,'V'=>695,'W'=>776, + 'X'=>768,'Y'=>792,'Z'=>759,'['=>707,'\\'=>708,']'=>682,'^'=>701,'_'=>826,'`'=>815,'a'=>789,'b'=>789,'c'=>707,'d'=>687,'e'=>696,'f'=>689,'g'=>786,'h'=>787,'i'=>713,'j'=>791,'k'=>785,'l'=>791,'m'=>873, + 'n'=>761,'o'=>762,'p'=>762,'q'=>759,'r'=>759,'s'=>892,'t'=>892,'u'=>788,'v'=>784,'w'=>438,'x'=>138,'y'=>277,'z'=>415,'{'=>392,'|'=>392,'}'=>668,'~'=>668,chr(127)=>0,chr(128)=>390,chr(129)=>390,chr(130)=>317,chr(131)=>317, + chr(132)=>276,chr(133)=>276,chr(134)=>509,chr(135)=>509,chr(136)=>410,chr(137)=>410,chr(138)=>234,chr(139)=>234,chr(140)=>334,chr(141)=>334,chr(142)=>0,chr(143)=>0,chr(144)=>0,chr(145)=>0,chr(146)=>0,chr(147)=>0,chr(148)=>0,chr(149)=>0,chr(150)=>0,chr(151)=>0,chr(152)=>0,chr(153)=>0, + chr(154)=>0,chr(155)=>0,chr(156)=>0,chr(157)=>0,chr(158)=>0,chr(159)=>0,chr(160)=>0,chr(161)=>732,chr(162)=>544,chr(163)=>544,chr(164)=>910,chr(165)=>667,chr(166)=>760,chr(167)=>760,chr(168)=>776,chr(169)=>595,chr(170)=>694,chr(171)=>626,chr(172)=>788,chr(173)=>788,chr(174)=>788,chr(175)=>788, + chr(176)=>788,chr(177)=>788,chr(178)=>788,chr(179)=>788,chr(180)=>788,chr(181)=>788,chr(182)=>788,chr(183)=>788,chr(184)=>788,chr(185)=>788,chr(186)=>788,chr(187)=>788,chr(188)=>788,chr(189)=>788,chr(190)=>788,chr(191)=>788,chr(192)=>788,chr(193)=>788,chr(194)=>788,chr(195)=>788,chr(196)=>788,chr(197)=>788, + chr(198)=>788,chr(199)=>788,chr(200)=>788,chr(201)=>788,chr(202)=>788,chr(203)=>788,chr(204)=>788,chr(205)=>788,chr(206)=>788,chr(207)=>788,chr(208)=>788,chr(209)=>788,chr(210)=>788,chr(211)=>788,chr(212)=>894,chr(213)=>838,chr(214)=>1016,chr(215)=>458,chr(216)=>748,chr(217)=>924,chr(218)=>748,chr(219)=>918, + chr(220)=>927,chr(221)=>928,chr(222)=>928,chr(223)=>834,chr(224)=>873,chr(225)=>828,chr(226)=>924,chr(227)=>924,chr(228)=>917,chr(229)=>930,chr(230)=>931,chr(231)=>463,chr(232)=>883,chr(233)=>836,chr(234)=>836,chr(235)=>867,chr(236)=>867,chr(237)=>696,chr(238)=>696,chr(239)=>874,chr(240)=>0,chr(241)=>874, + chr(242)=>760,chr(243)=>946,chr(244)=>771,chr(245)=>865,chr(246)=>771,chr(247)=>888,chr(248)=>967,chr(249)=>888,chr(250)=>831,chr(251)=>873,chr(252)=>927,chr(253)=>970,chr(254)=>918,chr(255)=>0); +?> diff --git a/includes/fpdf/fpdf.php b/includes/fpdf/fpdf.php new file mode 100644 index 0000000000..308406ba64 --- /dev/null +++ b/includes/fpdf/fpdf.php @@ -0,0 +1,1804 @@ +_dochecks(); + // Initialization of properties + $this->page = 0; + $this->n = 2; + $this->buffer = ''; + $this->pages = array(); + $this->PageSizes = array(); + $this->state = 0; + $this->fonts = array(); + $this->FontFiles = array(); + $this->diffs = array(); + $this->images = array(); + $this->links = array(); + $this->InHeader = false; + $this->InFooter = false; + $this->lasth = 0; + $this->FontFamily = ''; + $this->FontStyle = ''; + $this->FontSizePt = 12; + $this->underline = false; + $this->DrawColor = '0 G'; + $this->FillColor = '0 g'; + $this->TextColor = '0 g'; + $this->ColorFlag = false; + $this->ws = 0; + // Font path + if(defined('FPDF_FONTPATH')) + { + $this->fontpath = FPDF_FONTPATH; + if(substr($this->fontpath,-1)!='/' && substr($this->fontpath,-1)!='\\') + $this->fontpath .= '/'; + } + elseif(is_dir(dirname(__FILE__).'/font')) + $this->fontpath = dirname(__FILE__).'/font/'; + else + $this->fontpath = ''; + // Core fonts + $this->CoreFonts = array('courier', 'helvetica', 'times', 'symbol', 'zapfdingbats'); + // Scale factor + if($unit=='pt') + $this->k = 1; + elseif($unit=='mm') + $this->k = 72/25.4; + elseif($unit=='cm') + $this->k = 72/2.54; + elseif($unit=='in') + $this->k = 72; + else + $this->Error('Incorrect unit: '.$unit); + // Page sizes + $this->StdPageSizes = array('a3'=>array(841.89,1190.55), 'a4'=>array(595.28,841.89), 'a5'=>array(420.94,595.28), + 'letter'=>array(612,792), 'legal'=>array(612,1008)); + $size = $this->_getpagesize($size); + $this->DefPageSize = $size; + $this->CurPageSize = $size; + // Page orientation + $orientation = strtolower($orientation); + if($orientation=='p' || $orientation=='portrait') + { + $this->DefOrientation = 'P'; + $this->w = $size[0]; + $this->h = $size[1]; + } + elseif($orientation=='l' || $orientation=='landscape') + { + $this->DefOrientation = 'L'; + $this->w = $size[1]; + $this->h = $size[0]; + } + else + $this->Error('Incorrect orientation: '.$orientation); + $this->CurOrientation = $this->DefOrientation; + $this->wPt = $this->w*$this->k; + $this->hPt = $this->h*$this->k; + // Page margins (1 cm) + $margin = 28.35/$this->k; + $this->SetMargins($margin,$margin); + // Interior cell margin (1 mm) + $this->cMargin = $margin/10; + // Line width (0.2 mm) + $this->LineWidth = .567/$this->k; + // Automatic page break + $this->SetAutoPageBreak(true,2*$margin); + // Default display mode + $this->SetDisplayMode('default'); + // Enable compression + $this->SetCompression(true); + // Set default PDF version number + $this->PDFVersion = '1.3'; +} + +function SetMargins($left, $top, $right=null) +{ + // Set left, top and right margins + $this->lMargin = $left; + $this->tMargin = $top; + if($right===null) + $right = $left; + $this->rMargin = $right; +} + +function SetLeftMargin($margin) +{ + // Set left margin + $this->lMargin = $margin; + if($this->page>0 && $this->x<$margin) + $this->x = $margin; +} + +function SetTopMargin($margin) +{ + // Set top margin + $this->tMargin = $margin; +} + +function SetRightMargin($margin) +{ + // Set right margin + $this->rMargin = $margin; +} + +function SetAutoPageBreak($auto, $margin=0) +{ + // Set auto page break mode and triggering margin + $this->AutoPageBreak = $auto; + $this->bMargin = $margin; + $this->PageBreakTrigger = $this->h-$margin; +} + +function SetDisplayMode($zoom, $layout='default') +{ + // Set display mode in viewer + if($zoom=='fullpage' || $zoom=='fullwidth' || $zoom=='real' || $zoom=='default' || !is_string($zoom)) + $this->ZoomMode = $zoom; + else + $this->Error('Incorrect zoom display mode: '.$zoom); + if($layout=='single' || $layout=='continuous' || $layout=='two' || $layout=='default') + $this->LayoutMode = $layout; + else + $this->Error('Incorrect layout display mode: '.$layout); +} + +function SetCompression($compress) +{ + // Set page compression + if(function_exists('gzcompress')) + $this->compress = $compress; + else + $this->compress = false; +} + +function SetTitle($title, $isUTF8=false) +{ + // Title of document + if($isUTF8) + $title = $this->_UTF8toUTF16($title); + $this->title = $title; +} + +function SetSubject($subject, $isUTF8=false) +{ + // Subject of document + if($isUTF8) + $subject = $this->_UTF8toUTF16($subject); + $this->subject = $subject; +} + +function SetAuthor($author, $isUTF8=false) +{ + // Author of document + if($isUTF8) + $author = $this->_UTF8toUTF16($author); + $this->author = $author; +} + +function SetKeywords($keywords, $isUTF8=false) +{ + // Keywords of document + if($isUTF8) + $keywords = $this->_UTF8toUTF16($keywords); + $this->keywords = $keywords; +} + +function SetCreator($creator, $isUTF8=false) +{ + // Creator of document + if($isUTF8) + $creator = $this->_UTF8toUTF16($creator); + $this->creator = $creator; +} + +function AliasNbPages($alias='{nb}') +{ + // Define an alias for total number of pages + $this->AliasNbPages = $alias; +} + +function Error($msg) +{ + // Fatal error + die('FPDF error: '.$msg); +} + +function Open() +{ + // Begin document + $this->state = 1; +} + +function Close() +{ + // Terminate document + if($this->state==3) + return; + if($this->page==0) + $this->AddPage(); + // Page footer + $this->InFooter = true; + $this->Footer(); + $this->InFooter = false; + // Close page + $this->_endpage(); + // Close document + $this->_enddoc(); +} + +function AddPage($orientation='', $size='') +{ + // Start a new page + if($this->state==0) + $this->Open(); + $family = $this->FontFamily; + $style = $this->FontStyle.($this->underline ? 'U' : ''); + $fontsize = $this->FontSizePt; + $lw = $this->LineWidth; + $dc = $this->DrawColor; + $fc = $this->FillColor; + $tc = $this->TextColor; + $cf = $this->ColorFlag; + if($this->page>0) + { + // Page footer + $this->InFooter = true; + $this->Footer(); + $this->InFooter = false; + // Close page + $this->_endpage(); + } + // Start new page + $this->_beginpage($orientation,$size); + // Set line cap style to square + $this->_out('2 J'); + // Set line width + $this->LineWidth = $lw; + $this->_out(sprintf('%.2F w',$lw*$this->k)); + // Set font + if($family) + $this->SetFont($family,$style,$fontsize); + // Set colors + $this->DrawColor = $dc; + if($dc!='0 G') + $this->_out($dc); + $this->FillColor = $fc; + if($fc!='0 g') + $this->_out($fc); + $this->TextColor = $tc; + $this->ColorFlag = $cf; + // Page header + $this->InHeader = true; + $this->Header(); + $this->InHeader = false; + // Restore line width + if($this->LineWidth!=$lw) + { + $this->LineWidth = $lw; + $this->_out(sprintf('%.2F w',$lw*$this->k)); + } + // Restore font + if($family) + $this->SetFont($family,$style,$fontsize); + // Restore colors + if($this->DrawColor!=$dc) + { + $this->DrawColor = $dc; + $this->_out($dc); + } + if($this->FillColor!=$fc) + { + $this->FillColor = $fc; + $this->_out($fc); + } + $this->TextColor = $tc; + $this->ColorFlag = $cf; +} + +function Header() +{ + // To be implemented in your own inherited class +} + +function Footer() +{ + // To be implemented in your own inherited class +} + +function PageNo() +{ + // Get current page number + return $this->page; +} + +function SetDrawColor($r, $g=null, $b=null) +{ + // Set color for all stroking operations + if(($r==0 && $g==0 && $b==0) || $g===null) + $this->DrawColor = sprintf('%.3F G',$r/255); + else + $this->DrawColor = sprintf('%.3F %.3F %.3F RG',$r/255,$g/255,$b/255); + if($this->page>0) + $this->_out($this->DrawColor); +} + +function SetFillColor($r, $g=null, $b=null) +{ + // Set color for all filling operations + if(($r==0 && $g==0 && $b==0) || $g===null) + $this->FillColor = sprintf('%.3F g',$r/255); + else + $this->FillColor = sprintf('%.3F %.3F %.3F rg',$r/255,$g/255,$b/255); + $this->ColorFlag = ($this->FillColor!=$this->TextColor); + if($this->page>0) + $this->_out($this->FillColor); +} + +function SetTextColor($r, $g=null, $b=null) +{ + // Set color for text + if(($r==0 && $g==0 && $b==0) || $g===null) + $this->TextColor = sprintf('%.3F g',$r/255); + else + $this->TextColor = sprintf('%.3F %.3F %.3F rg',$r/255,$g/255,$b/255); + $this->ColorFlag = ($this->FillColor!=$this->TextColor); +} + +function GetStringWidth($s) +{ + // Get width of a string in the current font + $s = (string)$s; + $cw = &$this->CurrentFont['cw']; + $w = 0; + $l = strlen($s); + for($i=0;$i<$l;$i++) + $w += $cw[$s[$i]]; + return $w*$this->FontSize/1000; +} + +function SetLineWidth($width) +{ + // Set line width + $this->LineWidth = $width; + if($this->page>0) + $this->_out(sprintf('%.2F w',$width*$this->k)); +} + +function Line($x1, $y1, $x2, $y2) +{ + // Draw a line + $this->_out(sprintf('%.2F %.2F m %.2F %.2F l S',$x1*$this->k,($this->h-$y1)*$this->k,$x2*$this->k,($this->h-$y2)*$this->k)); +} + +function Rect($x, $y, $w, $h, $style='') +{ + // Draw a rectangle + if($style=='F') + $op = 'f'; + elseif($style=='FD' || $style=='DF') + $op = 'B'; + else + $op = 'S'; + $this->_out(sprintf('%.2F %.2F %.2F %.2F re %s',$x*$this->k,($this->h-$y)*$this->k,$w*$this->k,-$h*$this->k,$op)); +} + +function AddFont($family, $style='', $file='') +{ + // Add a TrueType, OpenType or Type1 font + $family = strtolower($family); + if($file=='') + $file = str_replace(' ','',$family).strtolower($style).'.php'; + $style = strtoupper($style); + if($style=='IB') + $style = 'BI'; + $fontkey = $family.$style; + if(isset($this->fonts[$fontkey])) + return; + $info = $this->_loadfont($file); + $info['i'] = count($this->fonts)+1; + if(!empty($info['diff'])) + { + // Search existing encodings + $n = array_search($info['diff'],$this->diffs); + if(!$n) + { + $n = count($this->diffs)+1; + $this->diffs[$n] = $info['diff']; + } + $info['diffn'] = $n; + } + if(!empty($info['file'])) + { + // Embedded font + if($info['type']=='TrueType') + $this->FontFiles[$info['file']] = array('length1'=>$info['originalsize']); + else + $this->FontFiles[$info['file']] = array('length1'=>$info['size1'], 'length2'=>$info['size2']); + } + $this->fonts[$fontkey] = $info; +} + +function SetFont($family, $style='', $size=0) +{ + // Select a font; size given in points + if($family=='') + $family = $this->FontFamily; + else + $family = strtolower($family); + $style = strtoupper($style); + if(strpos($style,'U')!==false) + { + $this->underline = true; + $style = str_replace('U','',$style); + } + else + $this->underline = false; + if($style=='IB') + $style = 'BI'; + if($size==0) + $size = $this->FontSizePt; + // Test if font is already selected + if($this->FontFamily==$family && $this->FontStyle==$style && $this->FontSizePt==$size) + return; + // Test if font is already loaded + $fontkey = $family.$style; + if(!isset($this->fonts[$fontkey])) + { + // Test if one of the core fonts + if($family=='arial') + $family = 'helvetica'; + if(in_array($family,$this->CoreFonts)) + { + if($family=='symbol' || $family=='zapfdingbats') + $style = ''; + $fontkey = $family.$style; + if(!isset($this->fonts[$fontkey])) + $this->AddFont($family,$style); + } + else + $this->Error('Undefined font: '.$family.' '.$style); + } + // Select it + $this->FontFamily = $family; + $this->FontStyle = $style; + $this->FontSizePt = $size; + $this->FontSize = $size/$this->k; + $this->CurrentFont = &$this->fonts[$fontkey]; + if($this->page>0) + $this->_out(sprintf('BT /F%d %.2F Tf ET',$this->CurrentFont['i'],$this->FontSizePt)); +} + +function SetFontSize($size) +{ + // Set font size in points + if($this->FontSizePt==$size) + return; + $this->FontSizePt = $size; + $this->FontSize = $size/$this->k; + if($this->page>0) + $this->_out(sprintf('BT /F%d %.2F Tf ET',$this->CurrentFont['i'],$this->FontSizePt)); +} + +function AddLink() +{ + // Create a new internal link + $n = count($this->links)+1; + $this->links[$n] = array(0, 0); + return $n; +} + +function SetLink($link, $y=0, $page=-1) +{ + // Set destination of internal link + if($y==-1) + $y = $this->y; + if($page==-1) + $page = $this->page; + $this->links[$link] = array($page, $y); +} + +function Link($x, $y, $w, $h, $link) +{ + // Put a link on the page + $this->PageLinks[$this->page][] = array($x*$this->k, $this->hPt-$y*$this->k, $w*$this->k, $h*$this->k, $link); +} + +function Text($x, $y, $txt) +{ + // Output a string + $s = sprintf('BT %.2F %.2F Td (%s) Tj ET',$x*$this->k,($this->h-$y)*$this->k,$this->_escape($txt)); + if($this->underline && $txt!='') + $s .= ' '.$this->_dounderline($x,$y,$txt); + if($this->ColorFlag) + $s = 'q '.$this->TextColor.' '.$s.' Q'; + $this->_out($s); +} + +function AcceptPageBreak() +{ + // Accept automatic page break or not + return $this->AutoPageBreak; +} + +function Cell($w, $h=0, $txt='', $border=0, $ln=0, $align='', $fill=false, $link='') +{ + // Output a cell + $k = $this->k; + if($this->y+$h>$this->PageBreakTrigger && !$this->InHeader && !$this->InFooter && $this->AcceptPageBreak()) + { + // Automatic page break + $x = $this->x; + $ws = $this->ws; + if($ws>0) + { + $this->ws = 0; + $this->_out('0 Tw'); + } + $this->AddPage($this->CurOrientation,$this->CurPageSize); + $this->x = $x; + if($ws>0) + { + $this->ws = $ws; + $this->_out(sprintf('%.3F Tw',$ws*$k)); + } + } + if($w==0) + $w = $this->w-$this->rMargin-$this->x; + $s = ''; + if($fill || $border==1) + { + if($fill) + $op = ($border==1) ? 'B' : 'f'; + else + $op = 'S'; + $s = sprintf('%.2F %.2F %.2F %.2F re %s ',$this->x*$k,($this->h-$this->y)*$k,$w*$k,-$h*$k,$op); + } + if(is_string($border)) + { + $x = $this->x; + $y = $this->y; + if(strpos($border,'L')!==false) + $s .= sprintf('%.2F %.2F m %.2F %.2F l S ',$x*$k,($this->h-$y)*$k,$x*$k,($this->h-($y+$h))*$k); + if(strpos($border,'T')!==false) + $s .= sprintf('%.2F %.2F m %.2F %.2F l S ',$x*$k,($this->h-$y)*$k,($x+$w)*$k,($this->h-$y)*$k); + if(strpos($border,'R')!==false) + $s .= sprintf('%.2F %.2F m %.2F %.2F l S ',($x+$w)*$k,($this->h-$y)*$k,($x+$w)*$k,($this->h-($y+$h))*$k); + if(strpos($border,'B')!==false) + $s .= sprintf('%.2F %.2F m %.2F %.2F l S ',$x*$k,($this->h-($y+$h))*$k,($x+$w)*$k,($this->h-($y+$h))*$k); + } + if($txt!=='') + { + if($align=='R') + $dx = $w-$this->cMargin-$this->GetStringWidth($txt); + elseif($align=='C') + $dx = ($w-$this->GetStringWidth($txt))/2; + else + $dx = $this->cMargin; + if($this->ColorFlag) + $s .= 'q '.$this->TextColor.' '; + $txt2 = str_replace(')','\\)',str_replace('(','\\(',str_replace('\\','\\\\',$txt))); + $s .= sprintf('BT %.2F %.2F Td (%s) Tj ET',($this->x+$dx)*$k,($this->h-($this->y+.5*$h+.3*$this->FontSize))*$k,$txt2); + if($this->underline) + $s .= ' '.$this->_dounderline($this->x+$dx,$this->y+.5*$h+.3*$this->FontSize,$txt); + if($this->ColorFlag) + $s .= ' Q'; + if($link) + $this->Link($this->x+$dx,$this->y+.5*$h-.5*$this->FontSize,$this->GetStringWidth($txt),$this->FontSize,$link); + } + if($s) + $this->_out($s); + $this->lasth = $h; + if($ln>0) + { + // Go to next line + $this->y += $h; + if($ln==1) + $this->x = $this->lMargin; + } + else + $this->x += $w; +} + +function MultiCell($w, $h, $txt, $border=0, $align='J', $fill=false) +{ + // Output text with automatic or explicit line breaks + $cw = &$this->CurrentFont['cw']; + if($w==0) + $w = $this->w-$this->rMargin-$this->x; + $wmax = ($w-2*$this->cMargin)*1000/$this->FontSize; + $s = str_replace("\r",'',$txt); + $nb = strlen($s); + if($nb>0 && $s[$nb-1]=="\n") + $nb--; + $b = 0; + if($border) + { + if($border==1) + { + $border = 'LTRB'; + $b = 'LRT'; + $b2 = 'LR'; + } + else + { + $b2 = ''; + if(strpos($border,'L')!==false) + $b2 .= 'L'; + if(strpos($border,'R')!==false) + $b2 .= 'R'; + $b = (strpos($border,'T')!==false) ? $b2.'T' : $b2; + } + } + $sep = -1; + $i = 0; + $j = 0; + $l = 0; + $ns = 0; + $nl = 1; + while($i<$nb) + { + // Get next character + $c = $s[$i]; + if($c=="\n") + { + // Explicit line break + if($this->ws>0) + { + $this->ws = 0; + $this->_out('0 Tw'); + } + $this->Cell($w,$h,substr($s,$j,$i-$j),$b,2,$align,$fill); + $i++; + $sep = -1; + $j = $i; + $l = 0; + $ns = 0; + $nl++; + if($border && $nl==2) + $b = $b2; + continue; + } + if($c==' ') + { + $sep = $i; + $ls = $l; + $ns++; + } + $l += $cw[$c]; + if($l>$wmax) + { + // Automatic line break + if($sep==-1) + { + if($i==$j) + $i++; + if($this->ws>0) + { + $this->ws = 0; + $this->_out('0 Tw'); + } + $this->Cell($w,$h,substr($s,$j,$i-$j),$b,2,$align,$fill); + } + else + { + if($align=='J') + { + $this->ws = ($ns>1) ? ($wmax-$ls)/1000*$this->FontSize/($ns-1) : 0; + $this->_out(sprintf('%.3F Tw',$this->ws*$this->k)); + } + $this->Cell($w,$h,substr($s,$j,$sep-$j),$b,2,$align,$fill); + $i = $sep+1; + } + $sep = -1; + $j = $i; + $l = 0; + $ns = 0; + $nl++; + if($border && $nl==2) + $b = $b2; + } + else + $i++; + } + // Last chunk + if($this->ws>0) + { + $this->ws = 0; + $this->_out('0 Tw'); + } + if($border && strpos($border,'B')!==false) + $b .= 'B'; + $this->Cell($w,$h,substr($s,$j,$i-$j),$b,2,$align,$fill); + $this->x = $this->lMargin; +} + +function Write($h, $txt, $link='') +{ + // Output text in flowing mode + $cw = &$this->CurrentFont['cw']; + $w = $this->w-$this->rMargin-$this->x; + $wmax = ($w-2*$this->cMargin)*1000/$this->FontSize; + $s = str_replace("\r",'',$txt); + $nb = strlen($s); + $sep = -1; + $i = 0; + $j = 0; + $l = 0; + $nl = 1; + while($i<$nb) + { + // Get next character + $c = $s[$i]; + if($c=="\n") + { + // Explicit line break + $this->Cell($w,$h,substr($s,$j,$i-$j),0,2,'',0,$link); + $i++; + $sep = -1; + $j = $i; + $l = 0; + if($nl==1) + { + $this->x = $this->lMargin; + $w = $this->w-$this->rMargin-$this->x; + $wmax = ($w-2*$this->cMargin)*1000/$this->FontSize; + } + $nl++; + continue; + } + if($c==' ') + $sep = $i; + $l += $cw[$c]; + if($l>$wmax) + { + // Automatic line break + if($sep==-1) + { + if($this->x>$this->lMargin) + { + // Move to next line + $this->x = $this->lMargin; + $this->y += $h; + $w = $this->w-$this->rMargin-$this->x; + $wmax = ($w-2*$this->cMargin)*1000/$this->FontSize; + $i++; + $nl++; + continue; + } + if($i==$j) + $i++; + $this->Cell($w,$h,substr($s,$j,$i-$j),0,2,'',0,$link); + } + else + { + $this->Cell($w,$h,substr($s,$j,$sep-$j),0,2,'',0,$link); + $i = $sep+1; + } + $sep = -1; + $j = $i; + $l = 0; + if($nl==1) + { + $this->x = $this->lMargin; + $w = $this->w-$this->rMargin-$this->x; + $wmax = ($w-2*$this->cMargin)*1000/$this->FontSize; + } + $nl++; + } + else + $i++; + } + // Last chunk + if($i!=$j) + $this->Cell($l/1000*$this->FontSize,$h,substr($s,$j),0,0,'',0,$link); +} + +function Ln($h=null) +{ + // Line feed; default value is last cell height + $this->x = $this->lMargin; + if($h===null) + $this->y += $this->lasth; + else + $this->y += $h; +} + +function Image($file, $x=null, $y=null, $w=0, $h=0, $type='', $link='') +{ + // Put an image on the page + if(!isset($this->images[$file])) + { + // First use of this image, get info + if($type=='') + { + $pos = strrpos($file,'.'); + if(!$pos) + $this->Error('Image file has no extension and no type was specified: '.$file); + $type = substr($file,$pos+1); + } + $type = strtolower($type); + if($type=='jpeg') + $type = 'jpg'; + $mtd = '_parse'.$type; + if(!method_exists($this,$mtd)) + $this->Error('Unsupported image type: '.$type); + $info = $this->$mtd($file); + $info['i'] = count($this->images)+1; + $this->images[$file] = $info; + } + else + $info = $this->images[$file]; + + // Automatic width and height calculation if needed + if($w==0 && $h==0) + { + // Put image at 96 dpi + $w = -96; + $h = -96; + } + if($w<0) + $w = -$info['w']*72/$w/$this->k; + if($h<0) + $h = -$info['h']*72/$h/$this->k; + if($w==0) + $w = $h*$info['w']/$info['h']; + if($h==0) + $h = $w*$info['h']/$info['w']; + + // Flowing mode + if($y===null) + { + if($this->y+$h>$this->PageBreakTrigger && !$this->InHeader && !$this->InFooter && $this->AcceptPageBreak()) + { + // Automatic page break + $x2 = $this->x; + $this->AddPage($this->CurOrientation,$this->CurPageSize); + $this->x = $x2; + } + $y = $this->y; + $this->y += $h; + } + + if($x===null) + $x = $this->x; + $this->_out(sprintf('q %.2F 0 0 %.2F %.2F %.2F cm /I%d Do Q',$w*$this->k,$h*$this->k,$x*$this->k,($this->h-($y+$h))*$this->k,$info['i'])); + if($link) + $this->Link($x,$y,$w,$h,$link); +} + +function GetX() +{ + // Get x position + return $this->x; +} + +function SetX($x) +{ + // Set x position + if($x>=0) + $this->x = $x; + else + $this->x = $this->w+$x; +} + +function GetY() +{ + // Get y position + return $this->y; +} + +function SetY($y) +{ + // Set y position and reset x + $this->x = $this->lMargin; + if($y>=0) + $this->y = $y; + else + $this->y = $this->h+$y; +} + +function SetXY($x, $y) +{ + // Set x and y positions + $this->SetY($y); + $this->SetX($x); +} + +function Output($name='', $dest='') +{ + // Output PDF to some destination + if($this->state<3) + $this->Close(); + $dest = strtoupper($dest); + if($dest=='') + { + if($name=='') + { + $name = 'doc.pdf'; + $dest = 'I'; + } + else + $dest = 'F'; + } + switch($dest) + { + case 'I': + // Send to standard output + $this->_checkoutput(); + if(PHP_SAPI!='cli') + { + // We send to a browser + header('Content-Type: application/pdf'); + header('Content-Disposition: inline; filename="'.$name.'"'); + header('Cache-Control: private, max-age=0, must-revalidate'); + header('Pragma: public'); + } + echo $this->buffer; + break; + case 'D': + // Download file + $this->_checkoutput(); + header('Content-Type: application/x-download'); + header('Content-Disposition: attachment; filename="'.$name.'"'); + header('Cache-Control: private, max-age=0, must-revalidate'); + header('Pragma: public'); + echo $this->buffer; + break; + case 'F': + // Save to local file + $f = fopen($name,'wb'); + if(!$f) + $this->Error('Unable to create output file: '.$name); + fwrite($f,$this->buffer,strlen($this->buffer)); + fclose($f); + break; + case 'S': + // Return as a string + return $this->buffer; + default: + $this->Error('Incorrect output destination: '.$dest); + } + return ''; +} + +/******************************************************************************* +* * +* Protected methods * +* * +*******************************************************************************/ +function _dochecks() +{ + // Check availability of %F + if(sprintf('%.1F',1.0)!='1.0') + $this->Error('This version of PHP is not supported'); + // Check mbstring overloading + if(ini_get('mbstring.func_overload') & 2) + $this->Error('mbstring overloading must be disabled'); + // Ensure runtime magic quotes are disabled + if(get_magic_quotes_runtime()) + @set_magic_quotes_runtime(0); +} + +function _checkoutput() +{ + if(PHP_SAPI!='cli') + { + if(headers_sent($file,$line)) + $this->Error("Some data has already been output, can't send PDF file (output started at $file:$line)"); + } + if(ob_get_length()) + { + // The output buffer is not empty + if(preg_match('/^(\xEF\xBB\xBF)?\s*$/',ob_get_contents())) + { + // It contains only a UTF-8 BOM and/or whitespace, let's clean it + ob_clean(); + } + else + $this->Error("Some data has already been output, can't send PDF file"); + } +} + +function _getpagesize($size) +{ + if(is_string($size)) + { + $size = strtolower($size); + if(!isset($this->StdPageSizes[$size])) + $this->Error('Unknown page size: '.$size); + $a = $this->StdPageSizes[$size]; + return array($a[0]/$this->k, $a[1]/$this->k); + } + else + { + if($size[0]>$size[1]) + return array($size[1], $size[0]); + else + return $size; + } +} + +function _beginpage($orientation, $size) +{ + $this->page++; + $this->pages[$this->page] = ''; + $this->state = 2; + $this->x = $this->lMargin; + $this->y = $this->tMargin; + $this->FontFamily = ''; + // Check page size and orientation + if($orientation=='') + $orientation = $this->DefOrientation; + else + $orientation = strtoupper($orientation[0]); + if($size=='') + $size = $this->DefPageSize; + else + $size = $this->_getpagesize($size); + if($orientation!=$this->CurOrientation || $size[0]!=$this->CurPageSize[0] || $size[1]!=$this->CurPageSize[1]) + { + // New size or orientation + if($orientation=='P') + { + $this->w = $size[0]; + $this->h = $size[1]; + } + else + { + $this->w = $size[1]; + $this->h = $size[0]; + } + $this->wPt = $this->w*$this->k; + $this->hPt = $this->h*$this->k; + $this->PageBreakTrigger = $this->h-$this->bMargin; + $this->CurOrientation = $orientation; + $this->CurPageSize = $size; + } + if($orientation!=$this->DefOrientation || $size[0]!=$this->DefPageSize[0] || $size[1]!=$this->DefPageSize[1]) + $this->PageSizes[$this->page] = array($this->wPt, $this->hPt); +} + +function _endpage() +{ + $this->state = 1; +} + +function _loadfont($font) +{ + // Load a font definition file from the font directory + include($this->fontpath.$font); + $a = get_defined_vars(); + if(!isset($a['name'])) + $this->Error('Could not include font definition file'); + return $a; +} + +function _escape($s) +{ + // Escape special characters in strings + $s = str_replace('\\','\\\\',$s); + $s = str_replace('(','\\(',$s); + $s = str_replace(')','\\)',$s); + $s = str_replace("\r",'\\r',$s); + return $s; +} + +function _textstring($s) +{ + // Format a text string + return '('.$this->_escape($s).')'; +} + +function _UTF8toUTF16($s) +{ + // Convert UTF-8 to UTF-16BE with BOM + $res = "\xFE\xFF"; + $nb = strlen($s); + $i = 0; + while($i<$nb) + { + $c1 = ord($s[$i++]); + if($c1>=224) + { + // 3-byte character + $c2 = ord($s[$i++]); + $c3 = ord($s[$i++]); + $res .= chr((($c1 & 0x0F)<<4) + (($c2 & 0x3C)>>2)); + $res .= chr((($c2 & 0x03)<<6) + ($c3 & 0x3F)); + } + elseif($c1>=192) + { + // 2-byte character + $c2 = ord($s[$i++]); + $res .= chr(($c1 & 0x1C)>>2); + $res .= chr((($c1 & 0x03)<<6) + ($c2 & 0x3F)); + } + else + { + // Single-byte character + $res .= "\0".chr($c1); + } + } + return $res; +} + +function _dounderline($x, $y, $txt) +{ + // Underline text + $up = $this->CurrentFont['up']; + $ut = $this->CurrentFont['ut']; + $w = $this->GetStringWidth($txt)+$this->ws*substr_count($txt,' '); + return sprintf('%.2F %.2F %.2F %.2F re f',$x*$this->k,($this->h-($y-$up/1000*$this->FontSize))*$this->k,$w*$this->k,-$ut/1000*$this->FontSizePt); +} + +function _parsejpg($file) +{ + // Extract info from a JPEG file + $a = getimagesize($file); + if(!$a) + $this->Error('Missing or incorrect image file: '.$file); + if($a[2]!=2) + $this->Error('Not a JPEG file: '.$file); + if(!isset($a['channels']) || $a['channels']==3) + $colspace = 'DeviceRGB'; + elseif($a['channels']==4) + $colspace = 'DeviceCMYK'; + else + $colspace = 'DeviceGray'; + $bpc = isset($a['bits']) ? $a['bits'] : 8; + $data = file_get_contents($file); + return array('w'=>$a[0], 'h'=>$a[1], 'cs'=>$colspace, 'bpc'=>$bpc, 'f'=>'DCTDecode', 'data'=>$data); +} + +function _parsepng($file) +{ + // Extract info from a PNG file + $f = fopen($file,'rb'); + if(!$f) + $this->Error('Can\'t open image file: '.$file); + $info = $this->_parsepngstream($f,$file); + fclose($f); + return $info; +} + +function _parsepngstream($f, $file) +{ + // Check signature + if($this->_readstream($f,8)!=chr(137).'PNG'.chr(13).chr(10).chr(26).chr(10)) + $this->Error('Not a PNG file: '.$file); + + // Read header chunk + $this->_readstream($f,4); + if($this->_readstream($f,4)!='IHDR') + $this->Error('Incorrect PNG file: '.$file); + $w = $this->_readint($f); + $h = $this->_readint($f); + $bpc = ord($this->_readstream($f,1)); + if($bpc>8) + $this->Error('16-bit depth not supported: '.$file); + $ct = ord($this->_readstream($f,1)); + if($ct==0 || $ct==4) + $colspace = 'DeviceGray'; + elseif($ct==2 || $ct==6) + $colspace = 'DeviceRGB'; + elseif($ct==3) + $colspace = 'Indexed'; + else + $this->Error('Unknown color type: '.$file); + if(ord($this->_readstream($f,1))!=0) + $this->Error('Unknown compression method: '.$file); + if(ord($this->_readstream($f,1))!=0) + $this->Error('Unknown filter method: '.$file); + if(ord($this->_readstream($f,1))!=0) + $this->Error('Interlacing not supported: '.$file); + $this->_readstream($f,4); + $dp = '/Predictor 15 /Colors '.($colspace=='DeviceRGB' ? 3 : 1).' /BitsPerComponent '.$bpc.' /Columns '.$w; + + // Scan chunks looking for palette, transparency and image data + $pal = ''; + $trns = ''; + $data = ''; + do + { + $n = $this->_readint($f); + $type = $this->_readstream($f,4); + if($type=='PLTE') + { + // Read palette + $pal = $this->_readstream($f,$n); + $this->_readstream($f,4); + } + elseif($type=='tRNS') + { + // Read transparency info + $t = $this->_readstream($f,$n); + if($ct==0) + $trns = array(ord(substr($t,1,1))); + elseif($ct==2) + $trns = array(ord(substr($t,1,1)), ord(substr($t,3,1)), ord(substr($t,5,1))); + else + { + $pos = strpos($t,chr(0)); + if($pos!==false) + $trns = array($pos); + } + $this->_readstream($f,4); + } + elseif($type=='IDAT') + { + // Read image data block + $data .= $this->_readstream($f,$n); + $this->_readstream($f,4); + } + elseif($type=='IEND') + break; + else + $this->_readstream($f,$n+4); + } + while($n); + + if($colspace=='Indexed' && empty($pal)) + $this->Error('Missing palette in '.$file); + $info = array('w'=>$w, 'h'=>$h, 'cs'=>$colspace, 'bpc'=>$bpc, 'f'=>'FlateDecode', 'dp'=>$dp, 'pal'=>$pal, 'trns'=>$trns); + if($ct>=4) + { + // Extract alpha channel + if(!function_exists('gzuncompress')) + $this->Error('Zlib not available, can\'t handle alpha channel: '.$file); + $data = gzuncompress($data); + $color = ''; + $alpha = ''; + if($ct==4) + { + // Gray image + $len = 2*$w; + for($i=0;$i<$h;$i++) + { + $pos = (1+$len)*$i; + $color .= $data[$pos]; + $alpha .= $data[$pos]; + $line = substr($data,$pos+1,$len); + $color .= preg_replace('/(.)./s','$1',$line); + $alpha .= preg_replace('/.(.)/s','$1',$line); + } + } + else + { + // RGB image + $len = 4*$w; + for($i=0;$i<$h;$i++) + { + $pos = (1+$len)*$i; + $color .= $data[$pos]; + $alpha .= $data[$pos]; + $line = substr($data,$pos+1,$len); + $color .= preg_replace('/(.{3})./s','$1',$line); + $alpha .= preg_replace('/.{3}(.)/s','$1',$line); + } + } + unset($data); + $data = gzcompress($color); + $info['smask'] = gzcompress($alpha); + if($this->PDFVersion<'1.4') + $this->PDFVersion = '1.4'; + } + $info['data'] = $data; + return $info; +} + +function _readstream($f, $n) +{ + // Read n bytes from stream + $res = ''; + while($n>0 && !feof($f)) + { + $s = fread($f,$n); + if($s===false) + $this->Error('Error while reading stream'); + $n -= strlen($s); + $res .= $s; + } + if($n>0) + $this->Error('Unexpected end of stream'); + return $res; +} + +function _readint($f) +{ + // Read a 4-byte integer from stream + $a = unpack('Ni',$this->_readstream($f,4)); + return $a['i']; +} + +function _parsegif($file) +{ + // Extract info from a GIF file (via PNG conversion) + if(!function_exists('imagepng')) + $this->Error('GD extension is required for GIF support'); + if(!function_exists('imagecreatefromgif')) + $this->Error('GD has no GIF read support'); + $im = imagecreatefromgif($file); + if(!$im) + $this->Error('Missing or incorrect image file: '.$file); + imageinterlace($im,0); + $f = @fopen('php://temp','rb+'); + if($f) + { + // Perform conversion in memory + ob_start(); + imagepng($im); + $data = ob_get_clean(); + imagedestroy($im); + fwrite($f,$data); + rewind($f); + $info = $this->_parsepngstream($f,$file); + fclose($f); + } + else + { + // Use temporary file + $tmp = tempnam('.','gif'); + if(!$tmp) + $this->Error('Unable to create a temporary file'); + if(!imagepng($im,$tmp)) + $this->Error('Error while saving to temporary file'); + imagedestroy($im); + $info = $this->_parsepng($tmp); + unlink($tmp); + } + return $info; +} + +function _newobj() +{ + // Begin a new object + $this->n++; + $this->offsets[$this->n] = strlen($this->buffer); + $this->_out($this->n.' 0 obj'); +} + +function _putstream($s) +{ + $this->_out('stream'); + $this->_out($s); + $this->_out('endstream'); +} + +function _out($s) +{ + // Add a line to the document + if($this->state==2) + $this->pages[$this->page] .= $s."\n"; + else + $this->buffer .= $s."\n"; +} + +function _putpages() +{ + $nb = $this->page; + if(!empty($this->AliasNbPages)) + { + // Replace number of pages + for($n=1;$n<=$nb;$n++) + $this->pages[$n] = str_replace($this->AliasNbPages,$nb,$this->pages[$n]); + } + if($this->DefOrientation=='P') + { + $wPt = $this->DefPageSize[0]*$this->k; + $hPt = $this->DefPageSize[1]*$this->k; + } + else + { + $wPt = $this->DefPageSize[1]*$this->k; + $hPt = $this->DefPageSize[0]*$this->k; + } + $filter = ($this->compress) ? '/Filter /FlateDecode ' : ''; + for($n=1;$n<=$nb;$n++) + { + // Page + $this->_newobj(); + $this->_out('<_out('/Parent 1 0 R'); + if(isset($this->PageSizes[$n])) + $this->_out(sprintf('/MediaBox [0 0 %.2F %.2F]',$this->PageSizes[$n][0],$this->PageSizes[$n][1])); + $this->_out('/Resources 2 0 R'); + if(isset($this->PageLinks[$n])) + { + // Links + $annots = '/Annots ['; + foreach($this->PageLinks[$n] as $pl) + { + $rect = sprintf('%.2F %.2F %.2F %.2F',$pl[0],$pl[1],$pl[0]+$pl[2],$pl[1]-$pl[3]); + $annots .= '<_textstring($pl[4]).'>>>>'; + else + { + $l = $this->links[$pl[4]]; + $h = isset($this->PageSizes[$l[0]]) ? $this->PageSizes[$l[0]][1] : $hPt; + $annots .= sprintf('/Dest [%d 0 R /XYZ 0 %.2F null]>>',1+2*$l[0],$h-$l[1]*$this->k); + } + } + $this->_out($annots.']'); + } + if($this->PDFVersion>'1.3') + $this->_out('/Group <>'); + $this->_out('/Contents '.($this->n+1).' 0 R>>'); + $this->_out('endobj'); + // Page content + $p = ($this->compress) ? gzcompress($this->pages[$n]) : $this->pages[$n]; + $this->_newobj(); + $this->_out('<<'.$filter.'/Length '.strlen($p).'>>'); + $this->_putstream($p); + $this->_out('endobj'); + } + // Pages root + $this->offsets[1] = strlen($this->buffer); + $this->_out('1 0 obj'); + $this->_out('<_out($kids.']'); + $this->_out('/Count '.$nb); + $this->_out(sprintf('/MediaBox [0 0 %.2F %.2F]',$wPt,$hPt)); + $this->_out('>>'); + $this->_out('endobj'); +} + +function _putfonts() +{ + $nf = $this->n; + foreach($this->diffs as $diff) + { + // Encodings + $this->_newobj(); + $this->_out('<>'); + $this->_out('endobj'); + } + foreach($this->FontFiles as $file=>$info) + { + // Font file embedding + $this->_newobj(); + $this->FontFiles[$file]['n'] = $this->n; + $font = file_get_contents($this->fontpath.$file,true); + if(!$font) + $this->Error('Font file not found: '.$file); + $compressed = (substr($file,-2)=='.z'); + if(!$compressed && isset($info['length2'])) + $font = substr($font,6,$info['length1']).substr($font,6+$info['length1']+6,$info['length2']); + $this->_out('<_out('/Filter /FlateDecode'); + $this->_out('/Length1 '.$info['length1']); + if(isset($info['length2'])) + $this->_out('/Length2 '.$info['length2'].' /Length3 0'); + $this->_out('>>'); + $this->_putstream($font); + $this->_out('endobj'); + } + foreach($this->fonts as $k=>$font) + { + // Font objects + $this->fonts[$k]['n'] = $this->n+1; + $type = $font['type']; + $name = $font['name']; + if($type=='Core') + { + // Core font + $this->_newobj(); + $this->_out('<_out('/BaseFont /'.$name); + $this->_out('/Subtype /Type1'); + if($name!='Symbol' && $name!='ZapfDingbats') + $this->_out('/Encoding /WinAnsiEncoding'); + $this->_out('>>'); + $this->_out('endobj'); + } + elseif($type=='Type1' || $type=='TrueType') + { + // Additional Type1 or TrueType/OpenType font + $this->_newobj(); + $this->_out('<_out('/BaseFont /'.$name); + $this->_out('/Subtype /'.$type); + $this->_out('/FirstChar 32 /LastChar 255'); + $this->_out('/Widths '.($this->n+1).' 0 R'); + $this->_out('/FontDescriptor '.($this->n+2).' 0 R'); + if(isset($font['diffn'])) + $this->_out('/Encoding '.($nf+$font['diffn']).' 0 R'); + else + $this->_out('/Encoding /WinAnsiEncoding'); + $this->_out('>>'); + $this->_out('endobj'); + // Widths + $this->_newobj(); + $cw = &$font['cw']; + $s = '['; + for($i=32;$i<=255;$i++) + $s .= $cw[chr($i)].' '; + $this->_out($s.']'); + $this->_out('endobj'); + // Descriptor + $this->_newobj(); + $s = '<$v) + $s .= ' /'.$k.' '.$v; + if(!empty($font['file'])) + $s .= ' /FontFile'.($type=='Type1' ? '' : '2').' '.$this->FontFiles[$font['file']]['n'].' 0 R'; + $this->_out($s.'>>'); + $this->_out('endobj'); + } + else + { + // Allow for additional types + $mtd = '_put'.strtolower($type); + if(!method_exists($this,$mtd)) + $this->Error('Unsupported font type: '.$type); + $this->$mtd($font); + } + } +} + +function _putimages() +{ + foreach(array_keys($this->images) as $file) + { + $this->_putimage($this->images[$file]); + unset($this->images[$file]['data']); + unset($this->images[$file]['smask']); + } +} + +function _putimage(&$info) +{ + $this->_newobj(); + $info['n'] = $this->n; + $this->_out('<_out('/Subtype /Image'); + $this->_out('/Width '.$info['w']); + $this->_out('/Height '.$info['h']); + if($info['cs']=='Indexed') + $this->_out('/ColorSpace [/Indexed /DeviceRGB '.(strlen($info['pal'])/3-1).' '.($this->n+1).' 0 R]'); + else + { + $this->_out('/ColorSpace /'.$info['cs']); + if($info['cs']=='DeviceCMYK') + $this->_out('/Decode [1 0 1 0 1 0 1 0]'); + } + $this->_out('/BitsPerComponent '.$info['bpc']); + if(isset($info['f'])) + $this->_out('/Filter /'.$info['f']); + if(isset($info['dp'])) + $this->_out('/DecodeParms <<'.$info['dp'].'>>'); + if(isset($info['trns']) && is_array($info['trns'])) + { + $trns = ''; + for($i=0;$i_out('/Mask ['.$trns.']'); + } + if(isset($info['smask'])) + $this->_out('/SMask '.($this->n+1).' 0 R'); + $this->_out('/Length '.strlen($info['data']).'>>'); + $this->_putstream($info['data']); + $this->_out('endobj'); + // Soft mask + if(isset($info['smask'])) + { + $dp = '/Predictor 15 /Colors 1 /BitsPerComponent 8 /Columns '.$info['w']; + $smask = array('w'=>$info['w'], 'h'=>$info['h'], 'cs'=>'DeviceGray', 'bpc'=>8, 'f'=>$info['f'], 'dp'=>$dp, 'data'=>$info['smask']); + $this->_putimage($smask); + } + // Palette + if($info['cs']=='Indexed') + { + $filter = ($this->compress) ? '/Filter /FlateDecode ' : ''; + $pal = ($this->compress) ? gzcompress($info['pal']) : $info['pal']; + $this->_newobj(); + $this->_out('<<'.$filter.'/Length '.strlen($pal).'>>'); + $this->_putstream($pal); + $this->_out('endobj'); + } +} + +function _putxobjectdict() +{ + foreach($this->images as $image) + $this->_out('/I'.$image['i'].' '.$image['n'].' 0 R'); +} + +function _putresourcedict() +{ + $this->_out('/ProcSet [/PDF /Text /ImageB /ImageC /ImageI]'); + $this->_out('/Font <<'); + foreach($this->fonts as $font) + $this->_out('/F'.$font['i'].' '.$font['n'].' 0 R'); + $this->_out('>>'); + $this->_out('/XObject <<'); + $this->_putxobjectdict(); + $this->_out('>>'); +} + +function _putresources() +{ + $this->_putfonts(); + $this->_putimages(); + // Resource dictionary + $this->offsets[2] = strlen($this->buffer); + $this->_out('2 0 obj'); + $this->_out('<<'); + $this->_putresourcedict(); + $this->_out('>>'); + $this->_out('endobj'); +} + +function _putinfo() +{ + $this->_out('/Producer '.$this->_textstring('FPDF '.FPDF_VERSION)); + if(!empty($this->title)) + $this->_out('/Title '.$this->_textstring($this->title)); + if(!empty($this->subject)) + $this->_out('/Subject '.$this->_textstring($this->subject)); + if(!empty($this->author)) + $this->_out('/Author '.$this->_textstring($this->author)); + if(!empty($this->keywords)) + $this->_out('/Keywords '.$this->_textstring($this->keywords)); + if(!empty($this->creator)) + $this->_out('/Creator '.$this->_textstring($this->creator)); + $this->_out('/CreationDate '.$this->_textstring('D:'.@date('YmdHis'))); +} + +function _putcatalog() +{ + $this->_out('/Type /Catalog'); + $this->_out('/Pages 1 0 R'); + if($this->ZoomMode=='fullpage') + $this->_out('/OpenAction [3 0 R /Fit]'); + elseif($this->ZoomMode=='fullwidth') + $this->_out('/OpenAction [3 0 R /FitH null]'); + elseif($this->ZoomMode=='real') + $this->_out('/OpenAction [3 0 R /XYZ null null 1]'); + elseif(!is_string($this->ZoomMode)) + $this->_out('/OpenAction [3 0 R /XYZ null null '.sprintf('%.2F',$this->ZoomMode/100).']'); + if($this->LayoutMode=='single') + $this->_out('/PageLayout /SinglePage'); + elseif($this->LayoutMode=='continuous') + $this->_out('/PageLayout /OneColumn'); + elseif($this->LayoutMode=='two') + $this->_out('/PageLayout /TwoColumnLeft'); +} + +function _putheader() +{ + $this->_out('%PDF-'.$this->PDFVersion); +} + +function _puttrailer() +{ + $this->_out('/Size '.($this->n+1)); + $this->_out('/Root '.$this->n.' 0 R'); + $this->_out('/Info '.($this->n-1).' 0 R'); +} + +function _enddoc() +{ + $this->_putheader(); + $this->_putpages(); + $this->_putresources(); + // Info + $this->_newobj(); + $this->_out('<<'); + $this->_putinfo(); + $this->_out('>>'); + $this->_out('endobj'); + // Catalog + $this->_newobj(); + $this->_out('<<'); + $this->_putcatalog(); + $this->_out('>>'); + $this->_out('endobj'); + // Cross-ref + $o = strlen($this->buffer); + $this->_out('xref'); + $this->_out('0 '.($this->n+1)); + $this->_out('0000000000 65535 f '); + for($i=1;$i<=$this->n;$i++) + $this->_out(sprintf('%010d 00000 n ',$this->offsets[$i])); + // Trailer + $this->_out('trailer'); + $this->_out('<<'); + $this->_puttrailer(); + $this->_out('>>'); + $this->_out('startxref'); + $this->_out($o); + $this->_out('%%EOF'); + $this->state = 3; +} +// End of class +} + +// Handle special IE contype request +if(isset($_SERVER['HTTP_USER_AGENT']) && $_SERVER['HTTP_USER_AGENT']=='contype') +{ + header('Content-Type: application/pdf'); + exit; +} + +?> diff --git a/includes/header.php b/includes/header.php new file mode 100644 index 0000000000..57df501098 --- /dev/null +++ b/includes/header.php @@ -0,0 +1,137 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; + +//if reloadxml then run the command + if (isset($_SESSION["reload_xml"])) { + if (strlen($_SESSION["reload_xml"]) > 0) { + if ($_SESSION['apply_settings'] == "true") { + //show the apply settings prompt + } + else { + //create the event socket connection + $fp = event_socket_create($_SESSION['event_socket_ip_address'], $_SESSION['event_socket_port'], $_SESSION['event_socket_password']); + //reload the access control list this also runs reloadxml + $response = event_socket_request($fp, 'api reloadxml'); + $_SESSION["reload_xml"] = ''; + unset($_SESSION["reload_xml"]); + usleep(500); + //clear the apply settings reminder + $_SESSION["reload_xml"] = false; + } + } + } + +//set a default template + if (!isset($_SESSION['domain']['template']['name'])) { $_SESSION['domain']['template']['name'] = 'default'; } + +//set a default template + $v_template_path = $_SERVER["DOCUMENT_ROOT"].PROJECT_PATH.'/themes'; + if (!isset($_SESSION['domain']['template']['name'])) { + //get the contents of the template and save it to the template variable + $template_full_path = $v_template_path.'/'.$_SESSION['domain']['template']['name'].'/template.php'; + if (!file_exists($template_full_path)) { + $_SESSION['domain']['template']['name'] = 'default'; + } + } + +//start the output buffer + include $v_template_path.'/'.$_SESSION['domain']['template']['name'].'/config.php'; + +//start the output buffer + ob_start(); + +// get the content + if (isset($content)) { + $content = $_GET["c"]; //link + } + else { + $content = ''; + } + +//get the parent id + $sql = ""; + $sql .= "select * from v_menu_items "; + $sql .= "where menu_uuid = '".$_SESSION['domain']['menu']['uuid']."' "; + $sql .= "and menu_item_link = '".$_SERVER["SCRIPT_NAME"]."' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach ($result as &$row) { + $_SESSION["menu_item_parent_uuid"] = $row["menu_item_parent_uuid"]; + break; + } + unset($result); + +//get the content + $sql = ""; + $sql .= "select * from v_rss "; + $sql .= "where domain_uuid = '".$_SESSION['domain_uuid']."' "; + $sql .= "and rss_category = 'content' "; + if (strlen($content) == 0) { + $sql .= "and rss_link = '".$_SERVER["PHP_SELF"]."' "; + } + else { + $sql .= "and rss_link = '".$content."' "; + } + $sql .= "and length(rss_del_date) = 0 "; + $sql .= "or domain_uuid = '$domain_uuid' "; + $sql .= "and rss_category = 'content' "; + if (strlen($content) == 0) { + $sql .= "and rss_link = '".$_SERVER["PHP_SELF"]."' "; + } + else { + $sql .= "and rss_link = '".$content."' "; + } + $sql .= "and rss_del_date is null "; + $sql .= "order by rss_order asc "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + $result_count = count($result); + + $customtitle = ''; + foreach($result as $row) { + $template_rss_sub_category = $row[rss_sub_category]; + if (strlen($row[rss_group]) == 0) { + //content is public + $content_from_db = &$row[rss_description]; + $customtitle = $row[rss_title]; + } + else { + if (if_group($row[rss_group])) { //viewable only to designated group + $content_from_db = &$row[rss_description]; + $customtitle = $row[rss_title]; + } + } + } //end foreach + unset($sql, $result, $row_count); + +//start the output buffer + ob_start(); + +?> \ No newline at end of file diff --git a/includes/install/autoload_configs/cdr_csv.conf.xml b/includes/install/autoload_configs/cdr_csv.conf.xml new file mode 100644 index 0000000000..a44f21b1cd --- /dev/null +++ b/includes/install/autoload_configs/cdr_csv.conf.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/includes/install/dialplan/default.xml b/includes/install/dialplan/default.xml new file mode 100644 index 0000000000..eb5ed17267 --- /dev/null +++ b/includes/install/dialplan/default.xml @@ -0,0 +1,832 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/includes/install/htdocs/license.txt b/includes/install/htdocs/license.txt new file mode 100644 index 0000000000..2111a50a1f --- /dev/null +++ b/includes/install/htdocs/license.txt @@ -0,0 +1,10 @@ +Copyright (c) 2005, Fabricio Zuardi +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + * Neither the name of the author nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/includes/install/htdocs/slim.swf b/includes/install/htdocs/slim.swf new file mode 100644 index 0000000000000000000000000000000000000000..24b36c9daf922a26fc1515e5dcbebc748221b787 GIT binary patch literal 56327 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 bv1&Uai_97hg==H1k`i$-0X6>v59T9DW8k4| literal 0 HcmV?d00001 diff --git a/includes/install/htdocs/slimtest.htm b/includes/install/htdocs/slimtest.htm new file mode 100644 index 0000000000..f1536d7ca0 --- /dev/null +++ b/includes/install/htdocs/slimtest.htm @@ -0,0 +1,23 @@ +

    + You can find more infos about slim.swf here: +

    +

    + http://musicplayer.sourceforge.net/#documentation +

    +

    +
    + Please remember that you should record your MP3s at 11Khz for slim.swf to play correctly + + A quick example follows: +

    + + + + + + + +

    + Remember that if this is not working for you, you should most probably point the song_url GET parameter to a real MP3 file that should be reachable through the web server. +

    diff --git a/includes/install/lang/en/en.xml b/includes/install/lang/en/en.xml new file mode 100644 index 0000000000..0b12c7b698 --- /dev/null +++ b/includes/install/lang/en/en.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/includes/install/lang/en/wakeup/sounds.xml b/includes/install/lang/en/wakeup/sounds.xml new file mode 100644 index 0000000000..8c41736405 --- /dev/null +++ b/includes/install/lang/en/wakeup/sounds.xml @@ -0,0 +1,129 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/includes/install/scripts/call_broadcast_originate.js b/includes/install/scripts/call_broadcast_originate.js new file mode 100644 index 0000000000..a87f7115c4 --- /dev/null +++ b/includes/install/scripts/call_broadcast_originate.js @@ -0,0 +1,80 @@ +include("config.js"); + //var sounds_dir + //var admin_pin + //var tmp_dir + //var recordings_dir + +var sipuri = argv[0]; +var recording = argv[1]; +var caller_id_name = argv[2]; +var caller_id_number = argv[3]; +var call_timeout = argv[4]; +var call_count_var_name = argv[5]; +var tmp_sipuri; + +caller_id_name = caller_id_name.replace("+", " "); +console_log( "info", "sipuri: "+sipuri+"\n" ); +console_log( "info", "recording: "+recording+"\n" ); +console_log( "info", "caller_id_name: "+caller_id_name+"\n" ); +console_log( "info", "caller_id_number: "+caller_id_number+"\n" ); +console_log( "info", "call_timeout: "+call_timeout+"\n" ); +console_log( "info", "call_count_var_name: "+call_count_var_name+"\n" ); + + + +//function on_hangup(hup_session, how) +//{ +// console_log("err", how + " HOOK" + " name: " + hup_session.name + " cause: " + hup_session.cause + "\n"); +// //exit here would end the script so you could cleanup and just be done +// exit(); +//} + +function originate (sipuri, recording, caller_id_name, caller_id_number, call_timeout, count_var_name) { + + var dtmf = new Object(); + var cid; + dtmf.digits = ""; + cid = ",origination_caller_id_name="+caller_id_name+",origination_caller_id_number="+caller_id_number; + + new_session = new Session("{ignore_early_media=true,hangup_after_bridge=false,call_timeout="+call_timeout+""+cid+"}"+sipuri); + //new_session = new Session(sipuri); + +//new_session.execute("set", "api_after_bridge=reloadxml"); +//set the on_hangup function to be called when this session is hungup +//new_session.setHangupHook(on_hangup); +//result = new_session.setAutoHangup(true); + + //console_log( "info", "followme: new_session uuid "+new_session.uuid+"\n" ); + //console_log( "info", "followme: no dtmf detected\n" ); + + digitmaxlength = 1; + while (new_session.ready()) { + if (recording.length > 0) { + //new_session.streamFile( recordings_dir+"/"+recording); + new_session.execute("playback",recordings_dir+"/"+recording); + //new_session.hangup("NORMAL_CLEARING"); + } + break; + } + + var hangup_cause = new_session.getVariable("bridge_hangup_cause"); + console_log( "info", "hangup cause: "+hangup_cause+"\n" ); + var count = getGlobalVariable(call_count_var_name); + setGlobalVariable(call_count_var_name, (parseInt(count)-1)); + console_log( "info", "action: hangup, count: "+count+"\n" ); + +} + +sipuri_array = sipuri.split(","); +for (i = 0; i < sipuri_array.length; i++){ + //var count = getGlobalVariable(call_count_var_name); + //setGlobalVariable(call_count_var_name, (parseInt(count)+1)); + + tmp_sipuri = sipuri_array[i]; + console_log("info", "tmp_sipuri: "+tmp_sipuri); + result = originate (tmp_sipuri, recording, caller_id_name, caller_id_number, call_timeout, call_count_var_name); + if (result) { + break; + } +} +exit(); diff --git a/includes/install/scripts/call_forward.lua b/includes/install/scripts/call_forward.lua new file mode 100644 index 0000000000..b39fc28306 --- /dev/null +++ b/includes/install/scripts/call_forward.lua @@ -0,0 +1,127 @@ +-- +-- FusionPBX +-- Version: MPL 1.1 +-- +-- The contents of this file are subject to the Mozilla Public License Version +-- 1.1 (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.mozilla.org/MPL/ +-- +-- Software distributed under the License is distributed on an "AS IS" basis, +-- WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +-- for the specific language governing rights and limitations under the +-- License. +-- +-- The Original Code is FusionPBX +-- +-- The Initial Developer of the Original Code is +-- Mark J Crane +-- Copyright (C) 2010 +-- the Initial Developer. All Rights Reserved. +-- +-- Contributor(s): +-- Mark J Crane + +pin_number = ""; +max_tries = "3"; +digit_timeout = "3000"; + +function file_exists(fname) + local f = io.open(fname, "r") + if (f and f:read()) then return true end +end + +if ( session:ready() ) then + session:answer(); + --session:execute("info", ""); + extension = session:getVariable("user_name"); + pin_number = session:getVariable("pin_number"); + sounds_dir = session:getVariable("sounds_dir"); + dialplan_default_dir = session:getVariable("dialplan_default_dir"); + call_forward_number = session:getVariable("call_forward_number"); + extension_required = session:getVariable("extension_required"); + context = session:getVariable("context"); + if (not context ) then context = 'default'; end + + --set the sounds path for the language, dialect and voice + default_language = session:getVariable("default_language"); + default_dialect = session:getVariable("default_dialect"); + default_voice = session:getVariable("default_voice"); + if (not default_language) then default_language = 'en'; end + if (not default_dialect) then default_dialect = 'us'; end + if (not default_voice) then default_voice = 'callie'; end + + --if the pin number is provided then require it + if (pin_number) then + min_digits = string.len(pin_number); + max_digits = string.len(pin_number)+1; + digits = session:playAndGetDigits(min_digits, max_digits, max_tries, digit_timeout, "#", sounds_dir.."/"..default_language.."/"..default_dialect.."/"..default_voice.."/custom/please_enter_the_pin_number.wav", "", "\\d+"); + if (digits == pin_number) then + --pin is correct + else + session:streamFile(sounds_dir.."/"..default_language.."/"..default_dialect.."/"..default_voice.."/custom/your_pin_number_is_incorect_goodbye.wav"); + session:hangup("NORMAL_CLEARING"); + return; + end + end + + --if extension_requires is true then get the extension number + if (extension_required) then + if (extension_required == "true") then + extension = session:playAndGetDigits(3, 6, max_tries, digit_timeout, "#", sounds_dir.."/"..default_language.."/"..default_dialect.."/"..default_voice.."/custom/please_enter_the_extension_number.wav", "", "\\d+"); + end + end + + + if (file_exists(dialplan_default_dir.."/000_call_forward_"..extension..".xml")) then + --file exists + + --remove the call forward dialplan entry + os.remove (dialplan_default_dir.."/000_call_forward_"..extension..".xml"); + + --stream file + session:streamFile(sounds_dir.."/"..default_language.."/"..default_dialect.."/"..default_voice.."/custom/call_forward_has_been_deleted.wav"); + + --wait for the file to be written before proceeding + session:sleep(1000); + + else + --file does not exist + + dtmf = ""; --clear dtmf digits to prepare for next dtmf request + if (call_forward_number) then + -- do nothing + else + -- get the call forward number + call_forward_number = session:playAndGetDigits(3, 15, max_tries, digit_timeout, "#", sounds_dir.."/"..default_language.."/"..default_dialect.."/"..default_voice.."/custom/please_enter_the_phone_number.wav", "", "\\d+"); + end + if (string.len(call_forward_number) > 0) then + --write the xml file + xml = "\n"; + xml = xml .. " \n"; + xml = xml .. " \n"; + xml = xml .. " \n"; + xml = xml .. "\n"; + session:execute("log", xml); + local file = assert(io.open(dialplan_default_dir.."/000_call_forward_"..extension..".xml", "w")); + file:write(xml); + file:close(); + + --wait for the file to be written before proceeding + --session:sleep(20000); + + --stream file + session:streamFile(sounds_dir.."/"..default_language.."/"..default_dialect.."/"..default_voice.."/custom/call_forward_has_been_set.wav"); + end + end + + --reloadxml + api = freeswitch.API(); + reply = api:executeString("reloadxml"); + + --wait for the file to be written before proceeding + session:sleep(1000); + + session:hangup(); + +end \ No newline at end of file diff --git a/includes/install/scripts/disa.lua b/includes/install/scripts/disa.lua new file mode 100644 index 0000000000..85fe8e8e31 --- /dev/null +++ b/includes/install/scripts/disa.lua @@ -0,0 +1,156 @@ +-- +-- FusionPBX +-- Version: MPL 1.1 +-- +-- The contents of this file are subject to the Mozilla Public License Version +-- 1.1 (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.mozilla.org/MPL/ +-- +-- Software distributed under the License is distributed on an "AS IS" basis, +-- WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +-- for the specific language governing rights and limitations under the +-- License. +-- +-- The Original Code is FusionPBX +-- +-- The Initial Developer of the Original Code is +-- Mark J Crane +-- Copyright (C) 2010 +-- the Initial Developer. All Rights Reserved. +-- +-- Contributor(s): +-- Mark J Crane + +predefined_destination = ""; +max_tries = "3"; +digit_timeout = "5000"; + +function trim (s) + return (string.gsub(s, "^%s*(.-)%s*$", "%1")) +end + +function explode ( seperator, str ) + local pos, arr = 0, {} + for st, sp in function() return string.find( str, seperator, pos, true ) end do -- for each divider found + table.insert( arr, string.sub( str, pos, st-1 ) ) -- attach chars left of current divider + pos = sp + 1 -- jump past current divider + end + table.insert( arr, string.sub( str, pos ) ) -- attach chars right of last divider + return arr +end + +if ( session:ready() ) then + session:answer( ); + pin_number = session:getVariable("pin_number"); + sounds_dir = session:getVariable("sounds_dir"); + caller_id_name = session:getVariable("caller_id_name"); + caller_id_number = session:getVariable("caller_id_number"); + predefined_destination = session:getVariable("predefined_destination"); + digit_min_length = session:getVariable("digit_min_length"); + digit_max_length = session:getVariable("digit_max_length"); + gateway = session:getVariable("gateway"); + context = session:getVariable("context"); + + --set the sounds path for the language, dialect and voice + default_language = session:getVariable("default_language"); + default_dialect = session:getVariable("default_dialect"); + default_voice = session:getVariable("default_voice"); + if (not default_language) then default_language = 'en'; end + if (not default_dialect) then default_dialect = 'us'; end + if (not default_voice) then default_voice = 'callie'; end + + --set defaults + if (digit_min_length) then + --do nothing + else + digit_min_length = "2"; + end + + if (digit_max_length) then + --do nothing + else + digit_max_length = "11"; + end + + --if the pin number is provided then require it + if (pin_number) then + min_digits = string.len(pin_number); + max_digits = string.len(pin_number)+1; + digits = session:playAndGetDigits(min_digits, max_digits, max_tries, digit_timeout, "#", sounds_dir.."/"..default_language.."/"..default_dialect.."/"..default_voice.."/ivr/ivr-please_enter_pin_followed_by_pound.wav", "", "\\d+"); + if (digits == pin_number) then + --pin is correct + else + session:streamFile(sounds_dir.."/"..default_language.."/"..default_dialect.."/"..default_voice.."/ivr/ivr-pin_or_extension_is-invalid.wav"); + session:streamFile(sounds_dir.."/"..default_language.."/"..default_dialect.."/"..default_voice.."/ivr/ivr-im_sorry.wav"); + session:streamFile(sounds_dir.."/"..default_language.."/"..default_dialect.."/"..default_voice.."/voicemail/vm-goodbye.wav"); + + session:hangup("NORMAL_CLEARING"); + return; + end + end + + --if a predefined_destination is provided then set the number to the predefined_destination + if (predefined_destination) then + destination_number = predefined_destination; + else + dtmf = ""; --clear dtmf digits to prepare for next dtmf request + destination_number = session:playAndGetDigits(digit_min_length, digit_max_length, max_tries, digit_timeout, "#", sounds_dir.."/"..default_language.."/"..default_dialect.."/"..default_voice.."/ivr/ivr-enter_destination_telephone_number.wav", "", "\\d+"); + --if (string.len(destination_number) == 10) then destination_number = "1"..destination_number; end + end + + --set the caller id anme and number + if (string.len(destination_number) < 7) then + if (caller_id_name) then + --caller id name provided do nothing + else + caller_id_number = session:getVariable("effective_caller_id_name"); + end + if (caller_id_number) then + --caller id number provided do nothing + else + caller_id_number = session:getVariable("effective_caller_id_number"); + end + else + if (caller_id_name) then + --caller id name provided do nothing + else + caller_id_number = session:getVariable("outbound_caller_id_name"); + end + if (caller_id_number) then + --caller id number provided do nothing + else + caller_id_number = session:getVariable("outbound_caller_id_number"); + end + end + + --transfer or bridge the call + if (string.len(destination_number) < 7) then + --local call + session:execute("transfer", destination_number .. " XML " .. context); + else + --remote call + if (gateway) then + gateway_table = explode(",",gateway); + for index,value in pairs(gateway_table) do + session:execute("bridge", "{continue_on_fail=true,hangup_after_bridge=true,origination_caller_id_name="..caller_id_name..",origination_caller_id_number="..caller_id_number.."}sofia/gateway/"..value.."/"..destination_number); + end + else + session:execute("set", "effective_caller_id_name="..caller_id_name); + session:execute("set", "effective_caller_id_number="..caller_id_number); + session:execute("transfer", destination_number .. " XML " .. context); + end + end + + --alternate method + --local session2 = freeswitch.Session("{ignore_early_media=true}sofia/gateway/flowroute.com/"..destination_number); + --t1 = os.date('*t'); + --call_start_time = os.time(t1); + --freeswitch.bridge(session, session2); +end + +--function HangupHook(s, status, arg) + --session:execute("info", ""); + --freeswitch.consoleLog("NOTICE", "HangupHook: " .. status .. "\n"); +--end +--session:setHangupHook("HangupHook", ""); diff --git a/includes/install/scripts/eavesdrop.lua b/includes/install/scripts/eavesdrop.lua new file mode 100644 index 0000000000..1cb5535c1f --- /dev/null +++ b/includes/install/scripts/eavesdrop.lua @@ -0,0 +1,101 @@ +-- +-- FusionPBX +-- Version: MPL 1.1 +-- +-- The contents of this file are subject to the Mozilla Public License Version +-- 1.1 (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.mozilla.org/MPL/ +-- +-- Software distributed under the License is distributed on an "AS IS" basis, +-- WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +-- for the specific language governing rights and limitations under the +-- License. +-- +-- The Original Code is FusionPBX +-- +-- The Initial Developer of the Original Code is +-- Mark J Crane +-- Copyright (C) 2010 +-- the Initial Developer. All Rights Reserved. +-- +-- Contributor(s): +-- Mark J Crane + +max_tries = "3"; +digit_timeout = "5000"; + +extension = argv[1]; + +--database + --connect to the database + --local dbh = freeswitch.Dbh("dsn","user","pass"); -- when using ODBC + local dbh = freeswitch.Dbh("core:core"); -- when using sqlite + + --exits the script if we didn't connect properly + assert(dbh:connected()); + +if ( session:ready() ) then + session:answer( ); + pin_number = session:getVariable("pin_number"); + sounds_dir = session:getVariable("sounds_dir"); + domain_name = session:getVariable("domain_name"); + + --set the sounds path for the language, dialect and voice + default_language = session:getVariable("default_language"); + default_dialect = session:getVariable("default_dialect"); + default_voice = session:getVariable("default_voice"); + if (not default_language) then default_language = 'en'; end + if (not default_dialect) then default_dialect = 'us'; end + if (not default_voice) then default_voice = 'callie'; end + + --set defaults + if (digit_min_length) then + --do nothing + else + digit_min_length = "2"; + end + + if (digit_max_length) then + --do nothing + else + digit_max_length = "11"; + end + + --if the pin number is provided then require it + if (pin_number) then + min_digits = string.len(pin_number); + max_digits = string.len(pin_number)+1; + digits = session:playAndGetDigits(min_digits, max_digits, max_tries, digit_timeout, "#", sounds_dir.."/"..default_language.."/"..default_dialect.."/"..default_voice.."/custom/please_enter_the_pin_number.wav", "", "\\d+"); + if (digits == pin_number) then + --pin is correct + else + session:streamFile(sounds_dir.."/"..default_language.."/"..default_dialect.."/"..default_voice.."/custom/your_pin_number_is_incorect_goodbye.wav"); + session:hangup("NORMAL_CLEARING"); + return; + end + end + + --check the database to get the uuid + --eavesdrop + sql = "select uuid from channels where presence_id = '"..extension.."@"..domain_name.."' "; + dbh:query(sql, function(result) + for key, val in pairs(result) do + freeswitch.consoleLog("NOTICE", "result "..key.." "..val.."\n"); + end + uuid = result.uuid; + end); + +end + +--eavesdrop + if (uuid) then + session:execute("eavesdrop", uuid); --call barge + end + +--notes + --originate a call + --cmd = "originate user/1007@voip.example.com &eavesdrop("..uuid..")"; + --cmd = "uuid_bridge "..caller_uuid.." "..uuid; + --api = freeswitch.API(); + --result = api:executeString(cmd); diff --git a/includes/install/scripts/fax_retry.lua b/includes/install/scripts/fax_retry.lua new file mode 100644 index 0000000000..578d74e281 --- /dev/null +++ b/includes/install/scripts/fax_retry.lua @@ -0,0 +1,70 @@ +--set default variables + fax_retry_sleep = 10; + fax_retry_limit = 3; + +-- show all channel variables + --dat = env:serialize() + --freeswitch.consoleLog("INFO","info:\n" .. dat .. "\n") + +-- example channel variables relating to fax + --variable_fax_success: 0 + --variable_fax_result_code: 49 + --variable_fax_result_text: The%20call%20dropped%20prematurely + --variable_fax_ecm_used: off + --variable_fax_local_station_id: SpanDSP%20Fax%20Ident + --variable_fax_document_transferred_pages: 0 + --variable_fax_document_total_pages: 0 + --variable_fax_image_resolution: 0x0 + --variable_fax_image_size: 0 + --variable_fax_bad_rows: 0 + --variable_fax_transfer_rate: 14400 + +-- set channel variables to lua variables + uuid = env:getHeader("uuid"); + fax_success = env:getHeader("fax_success"); + fax_result_text = env:getHeader("fax_result_text"); + fax_ecm_used = env:getHeader("fax_ecm_used"); + fax_retry_attempts = tonumber(env:getHeader("fax_retry_attempts")); + fax_retry_limit = tonumber(env:getHeader("fax_retry_limit")); + fax_retry_sleep = tonumber(env:getHeader("fax_retry_sleep")); + fax_uri = env:getHeader("fax_uri"); + fax_file = env:getHeader("fax_file"); + fax_extension_number = env:getHeader("fax_extension_number"); + origination_caller_id_name = env:getHeader("origination_caller_id_name"); + origination_caller_id_number = env:getHeader("origination_caller_id_number"); + +--set default values + if (not origination_caller_id_name) then + origination_caller_id_name = '000000000000000'; + end + if (not origination_caller_id_number) then + origination_caller_id_number = '000000000000000'; + end + +-- send the selected variables to the console + freeswitch.consoleLog("INFO","fax_success: '" .. fax_success .. "'\n"); + freeswitch.consoleLog("INFO","fax_result_text: '" .. fax_result_text .. "'\n"); + freeswitch.consoleLog("INFO","fax_file: '" .. fax_file .. "'\n"); + freeswitch.consoleLog("INFO","uuid: '" .. uuid .. "'\n"); + freeswitch.consoleLog("INFO","fax_ecm_used: '" .. fax_ecm_used .. "'\n"); + freeswitch.consoleLog("INFO","fax_retry_attempts: " .. fax_retry_attempts.. "\n"); + freeswitch.consoleLog("INFO","fax_retry_limit: " .. fax_retry_limit.. "\n"); + freeswitch.consoleLog("INFO","fax_retry_sleep: " .. fax_retry_sleep.. "\n"); + freeswitch.consoleLog("INFO","fax_uri: '" .. fax_uri.. "'\n"); + freeswitch.consoleLog("INFO","origination_caller_id_name: " .. origination_caller_id_name .. "\n"); + freeswitch.consoleLog("INFO","origination_caller_id_number: " .. origination_caller_id_number .. "\n"); + +-- if the fax failed then try again + if (fax_success == "0") then + if (fax_retry_attempts < fax_retry_limit) then + -- sleep + freeswitch.msleep(fax_retry_sleep * 1000); + --increment the retry attempts + fax_retry_attempts = fax_retry_attempts + 1; + cmd = "originate {origination_caller_id_name='"..origination_caller_id_name.. "',origination_caller_id_number="..origination_caller_id_number..",fax_uri="..fax_uri..",fax_retry_attempts="..fax_retry_attempts..",fax_retry_limit="..fax_retry_limit..",fax_retry_sleep="..fax_retry_sleep..",fax_verbose=true,fax_file='"..fax_file.."',fax_use_ecm=off,api_hangup_hook='lua fax_retry.lua'}"..fax_uri.." &txfax('"..fax_file.."')"; + --cmd = "sofia/internal/"..fax_number.."@"..domain_name.." &txfax('"..fax_file.."') XML default "; + freeswitch.consoleLog("INFO","retry cmd: " .. cmd .. "\n"); + api = freeswitch.API(); + reply = api:executeString(cmd); + end + end diff --git a/includes/install/scripts/fifo_member.lua b/includes/install/scripts/fifo_member.lua new file mode 100644 index 0000000000..69b5847498 --- /dev/null +++ b/includes/install/scripts/fifo_member.lua @@ -0,0 +1,99 @@ +-- +-- FusionPBX +-- Version: MPL 1.1 +-- +-- The contents of this file are subject to the Mozilla Public License Version +-- 1.1 (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.mozilla.org/MPL/ +-- +-- Software distributed under the License is distributed on an "AS IS" basis, +-- WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +-- for the specific language governing rights and limitations under the +-- License. +-- +-- The Original Code is FusionPBX +-- +-- The Initial Developer of the Original Code is +-- Mark J Crane +-- Copyright (C) 2010 +-- All Rights Reserved. +-- +-- Contributor(s): +-- Mark J Crane + +sounds_dir = ""; +recordings_dir = ""; +pin_number = ""; +max_tries = "3"; +digit_timeout = "3000"; + + +if ( session:ready() ) then + session:answer(); + --session:execute("info", ""); + user_name = session:getVariable("user_name"); + pin_number = session:getVariable("pin_number"); + sounds_dir = session:getVariable("sounds_dir"); + queue_name = session:getVariable("queue_name"); + fifo_simo = session:getVariable("fifo_simo"); + fifo_timeout = session:getVariable("fifo_timeout"); + fifo_lag = session:getVariable("fifo_lag"); + + --pin_number = "1234"; --for testing + --queue_name = "5900@voip.fusionpbx.com"; + --fifo_simo = 1; + --fifo_timeout = 10; + --fifo_lag = 10; + + if (pin_number) then + digits = session:playAndGetDigits(3, 8, 3, digit_timeout, "#", sounds_dir.."/custom/please_enter_the_pin_number.wav", "", "\\d+"); + if (digits == pin_number) then + --pin is correct + + --press 1 to login and 2 to logout + menu_selection = session:playAndGetDigits(1, 1, max_tries, digit_timeout, "#", sounds_dir.."/custom/please_enter_the_phone_number.wav", "", "\\d+"); + freeswitch.consoleLog("NOTICE", "menu_selection: "..menu_selection.."\n"); + if (menu_selection == "1") then + session:execute("set", "fifo_member_add_result=${fifo_member(add "..queue_name.." {fifo_member_wait=nowait}user/"..user_name.." "..fifo_simo.." "..fifo_timeout.." "..fifo_lag.."} )"); --simo timeout lag + fifo_member_add_result = session:getVariable("fifo_member_add_result"); + freeswitch.consoleLog("NOTICE", "fifo_member_add_result: "..fifo_member_add_result.."\n"); + session:streamFile("ivr/ivr-you_are_now_logged_in.wav"); + end + if (menu_selection == "2") then + session:execute("set", "fifo_member_del_result=${fifo_member(del "..queue_name.." {fifo_member_wait=nowait}user/"..user_name.."} )"); + session:streamFile("ivr/ivr-you_are_now_logged_out.wav"); + end + + --wait for the file to be written before proceeding + -- session:sleep(1000); + + session:hangup(); + + else + session:streamFile(sounds_dir.."/custom/your_pin_number_is_incorect_goodbye.wav"); + end + else + + --pin number is not required + + --press 1 to login and 2 to logout + menu_selection = session:playAndGetDigits(1, 1, max_tries, digit_timeout, "#", sounds_dir.."/custom/please_enter_the_phone_number.wav", "", "\\d+"); + freeswitch.consoleLog("NOTICE", "menu_selection: "..menu_selection.."\n"); + if (menu_selection == "1") then + session:execute("set", "fifo_member_add_result=${fifo_member(add "..queue_name.." {fifo_member_wait=nowait}user/"..user_name.." "..fifo_simo.." "..fifo_timeout.." "..fifo_lag.."} )"); --simo timeout lag + fifo_member_add_result = session:getVariable("fifo_member_add_result"); + freeswitch.consoleLog("NOTICE", "fifo_member_add_result: "..fifo_member_add_result.."\n"); + session:streamFile("ivr/ivr-you_are_now_logged_in.wav"); + end + if (menu_selection == "2") then + session:execute("set", "fifo_member_del_result=${fifo_member(del "..queue_name.." {fifo_member_wait=nowait}user/"..user_name.."} )"); + session:streamFile("ivr/ivr-you_are_now_logged_out.wav"); + end + + --wait for the file to be written before proceeding + -- session:sleep(1000); + + session:hangup(); + end +end \ No newline at end of file diff --git a/includes/install/scripts/huntgroup_originate.lua b/includes/install/scripts/huntgroup_originate.lua new file mode 100644 index 0000000000..74d375107a --- /dev/null +++ b/includes/install/scripts/huntgroup_originate.lua @@ -0,0 +1,108 @@ +--get the argv values + domain_name = argv[1]; + uuid = argv[2]; + sipuri = argv[3]; + extension = argv[4]; + caller_id_name = argv[5]; + caller_id_number = argv[6]; + caller_announce = argv[7]; + +--variable preparation + tmp_sipuri = ''; + caller_id_name = string.gsub(caller_id_name, "+", " "); + +function explode ( seperator, str ) + local pos, arr = 0, {} + for st, sp in function() return string.find( str, seperator, pos, true ) end do -- for each divider found + table.insert( arr, string.sub( str, pos, st-1 ) ) -- attach chars left of current divider + pos = sp + 1 -- jump past current divider + end + table.insert( arr, string.sub( str, pos ) ) -- attach chars right of last divider + return arr +end + +function originate (domain_name, session, sipuri, extension, caller_announce, caller_id_name, caller_id_number) + + cid = ",origination_caller_id_name="..caller_id_name..",origination_caller_id_number="..caller_id_number; + local new_session = freeswitch.Session("{ignore_early_media=true"..cid.."}"..sipuri); + new_session:execute("set", "call_timeout=60"); + new_session:execute("sleep", "1000"); + + --if the session is not ready wait longer + if ( new_session:ready() ) then + --do nothing + else + new_session:execute("sleep", "1000"); + end + + if ( new_session:ready() ) then + --get the session id + uuid = new_session:getVariable("uuid"); + --set the sounds path for the language, dialect and voice + default_language = new_session:getVariable("default_language"); + default_dialect = new_session:getVariable("default_dialect"); + default_voice = new_session:getVariable("default_voice"); + if (not default_language) then default_language = 'en'; end + if (not default_dialect) then default_dialect = 'us'; end + if (not default_voice) then default_voice = 'callie'; end + + --caller announce + if (caller_announce) then + new_session:streamFile(caller_announce); + end + + --set the sounds directory + sounds_dir = new_session:getVariable("sounds_dir"); + + --check the fifo status if it is empty hangup the call + api = freeswitch.API(); + cmd = "fifo count "..extension.."@"..domain_name; + result = api:executeString(cmd); + --freeswitch.consoleLog("notice", "result " .. result .. "\n"); + result_table = explode(":",result); + if (result_table[3] == "0") then + --session:streamFile(sounds_dir.."/"..default_language.."/"..default_dialect.."/"..default_voice.."/custom/your_pin_number_is_incorect_goodbye.wav"); + new_session:hangup("NORMAL_CLEARING"); + return; + end + + --prompt user for action + dtmf_digits = new_session:playAndGetDigits(1, 1, 2, 3000, "#", sounds_dir.."/"..default_language.."/"..default_dialect.."/"..default_voice.."/custom/8000/press_1_to_accept_2_to_reject_or_3_for_voicemail.wav", "", "\\d+"); + freeswitch.consoleLog("NOTICE", "followme: "..dtmf_digits.."\n"); + + if ( dtmf_digits == "1" ) then + freeswitch.consoleLog("NOTICE", "followme: call accepted\n"); + freeswitch.consoleLog("NOTICE", extension.."@"..domain_name.." out nowait\n"); + new_session:execute("fifo", extension.."@"..domain_name.." out nowait"); + return true; + end + if ( dtmf_digits == "2" ) then + freeswitch.consoleLog("NOTICE", "followme: call rejected\n"); + new_session:hangup(); + return false; + end + if ( dtmf_digits == "3" ) then + freeswitch.consoleLog("NOTICE", "followme: call sent to voicemail\n"); + cmd = "uuid_transfer "..uuid.." *99"..extension; + api = freeswitch.API(); + reply = api:executeString(cmd); + return true; + end + if ( dtmf_digits == "" ) then + freeswitch.consoleLog("NOTICE", "followme: no dtmf detected\n"); + return false; + end + else + freeswitch.consoleLog("err", "followme: session not ready\n"); + end +end + +sipuri_table = explode(",",sipuri); +for index,tmp_sip_uri in pairs(sipuri_table) do + freeswitch.consoleLog("NOTICE", "sip_uri: "..tmp_sip_uri.."\n"); + result = originate (domain_name, session, tmp_sip_uri, extension, caller_announce, caller_id_name, caller_id_number); + if (result) then + break; + --exit; + end +end diff --git a/includes/install/scripts/intercept.lua b/includes/install/scripts/intercept.lua new file mode 100644 index 0000000000..a3e9479338 --- /dev/null +++ b/includes/install/scripts/intercept.lua @@ -0,0 +1,100 @@ +-- +-- FusionPBX +-- Version: MPL 1.1 +-- +-- The contents of this file are subject to the Mozilla Public License Version +-- 1.1 (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.mozilla.org/MPL/ +-- +-- Software distributed under the License is distributed on an "AS IS" basis, +-- WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +-- for the specific language governing rights and limitations under the +-- License. +-- +-- The Original Code is FusionPBX +-- +-- The Initial Developer of the Original Code is +-- Mark J Crane +-- Copyright (C) 2010 +-- the Initial Developer. All Rights Reserved. +-- +-- Contributor(s): +-- Mark J Crane + +max_tries = "3"; +digit_timeout = "5000"; + +extension = argv[1]; + +--database + --connect to the database + --local dbh = freeswitch.Dbh("dsn","user","pass"); -- when using ODBC + local dbh = freeswitch.Dbh("core:core"); -- when using sqlite + + --exits the script if we didn't connect properly + assert(dbh:connected()); + +if ( session:ready() ) then + session:answer( ); + pin_number = session:getVariable("pin_number"); + sounds_dir = session:getVariable("sounds_dir"); + domain_name = session:getVariable("domain_name"); + + --set the sounds path for the language, dialect and voice + default_language = session:getVariable("default_language"); + default_dialect = session:getVariable("default_dialect"); + default_voice = session:getVariable("default_voice"); + if (not default_language) then default_language = 'en'; end + if (not default_dialect) then default_dialect = 'us'; end + if (not default_voice) then default_voice = 'callie'; end + + --set defaults + if (digit_min_length) then + --do nothing + else + digit_min_length = "2"; + end + + if (digit_max_length) then + --do nothing + else + digit_max_length = "11"; + end + + --if the pin number is provided then require it + if (pin_number) then + min_digits = string.len(pin_number); + max_digits = string.len(pin_number)+1; + digits = session:playAndGetDigits(min_digits, max_digits, max_tries, digit_timeout, "#", sounds_dir.."/"..default_language.."/"..default_dialect.."/"..default_voice.."/custom/please_enter_the_pin_number.wav", "", "\\d+"); + if (digits == pin_number) then + --pin is correct + else + session:streamFile(sounds_dir.."/"..default_language.."/"..default_dialect.."/"..default_voice.."/custom/your_pin_number_is_incorect_goodbye.wav"); + session:hangup("NORMAL_CLEARING"); + return; + end + end + + --check the database to get the uuid + --intercept + sql = "select call_uuid as uuid from channels where presence_id = '"..extension.."@"..domain_name.."' and callstate = 'RINGING' "; + dbh:query(sql, function(result) + for key, val in pairs(result) do + freeswitch.consoleLog("NOTICE", "result "..key.." "..val.."\n"); + end + uuid = result.uuid; + end); + +end + +--intercept a call that is ringing + if (uuid) then + session:execute("intercept", uuid); + end + +--notes + --originate a call + --cmd = "originate user/1007@voip.example.com &intercept("..uuid..")"; + --api = freeswitch.API(); + --result = api:executeString(cmd); diff --git a/includes/install/scripts/originate.js b/includes/install/scripts/originate.js new file mode 100644 index 0000000000..85b1bfa276 --- /dev/null +++ b/includes/install/scripts/originate.js @@ -0,0 +1,43 @@ +include("config.js"); + //var sounds_dir + //var admin_pin + //var tmp_dir + +var sipuri = argv[0]; +var caller_id_name = argv[1]; +var caller_id_number = argv[2]; +var tmp_sipuri; + +caller_id_name = caller_id_name.replace("+", " "); +//console_log( "info", "caller_announce: "+caller_announce+"\n" ); + +function originate (sipuri, caller_id_name, caller_id_number) { + + var dtmf = new Object(); + var cid; + dtmf.digits = ""; + cid = ",origination_caller_id_name="+caller_id_name+",origination_caller_id_number="+caller_id_number; + + new_session = new Session("{ignore_early_media=true"+cid+"}"+sipuri); + new_session.execute("set", "call_timeout=30"); + + if ( new_session.ready() ) { + new_session.streamFile( sounds_dir+"/custom/press_1_to_accept_2_to_reject_or_3_for_voicemail.wav"); + digitmaxlength = 1; + while (new_session.ready()) { + //console_log( "info", "originate succeeded\n" ); + } + + } +} + +sipuri_array = sipuri.split(","); +for (i = 0; i < sipuri_array.length; i++){ + tmp_sipuri = sipuri_array[i]; + console_log("info", "tmp_sipuri: "+tmp_sipuri); + result = originate (tmp_sipuri, caller_id_name, caller_id_number); + if (result) { + break; + exit; + } +} \ No newline at end of file diff --git a/includes/install/scripts/page.lua b/includes/install/scripts/page.lua new file mode 100644 index 0000000000..f12aade889 --- /dev/null +++ b/includes/install/scripts/page.lua @@ -0,0 +1,138 @@ +-- page.lua +-- Part of FusionPBX +-- Copyright (C) 2010 Mark J Crane +-- 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. + +pin_number = ""; +max_tries = "3"; +digit_timeout = "3000"; + +function trim (s) + return (string.gsub(s, "^%s*(.-)%s*$", "%1")) +end + +function explode ( seperator, str ) + local pos, arr = 0, {} + for st, sp in function() return string.find( str, seperator, pos, true ) end do -- for each divider found + table.insert( arr, string.sub( str, pos, st-1 ) ) -- attach chars left of current divider + pos = sp + 1 -- jump past current divider + end + table.insert( arr, string.sub( str, pos ) ) -- attach chars right of last divider + return arr +end + +if ( session:ready() ) then + session:answer(); + --get the dialplan variables and set them as local variables + destination_number = session:getVariable("destination_number"); + pin_number = session:getVariable("pin_number"); + domain_name = session:getVariable("domain_name"); + sounds_dir = session:getVariable("sounds_dir"); + extension_list = session:getVariable("extension_list"); + caller_id_name = session:getVariable("caller_id_name"); + caller_id_number = session:getVariable("caller_id_number"); + extension_table = explode(",",extension_list); + sip_from_user = session:getVariable("sip_from_user"); + + --set the sounds path for the language, dialect and voice + default_language = session:getVariable("default_language"); + default_dialect = session:getVariable("default_dialect"); + default_voice = session:getVariable("default_voice"); + if (not default_language) then default_language = 'en'; end + if (not default_dialect) then default_dialect = 'us'; end + if (not default_voice) then default_voice = 'callie'; end + + if (caller_id_name) then + --caller id name provided do nothing + else + effective_caller_id_name = session:getVariable("effective_caller_id_name"); + caller_id_number = effective_caller_id_name; + end + + if (caller_id_number) then + --caller id number provided do nothing + else + effective_caller_id_number = session:getVariable("effective_caller_id_number"); + caller_id_number = effective_caller_id_number; + end + + --if the pin number is provided then require it + if (pin_number) then + min_digits = string.len(pin_number); + max_digits = string.len(pin_number)+1; + digits = session:playAndGetDigits(min_digits, max_digits, max_tries, digit_timeout, "#", sounds_dir.."/"..default_language.."/"..default_dialect.."/"..default_voice.."/custom/please_enter_the_pin_number.wav", "", "\\d+"); + if (digits == pin_number) then + --pin is correct + else + session:streamFile(sounds_dir.."/"..default_language.."/"..default_dialect.."/"..default_voice.."/custom/your_pin_number_is_incorect_goodbye.wav"); + session:hangup("NORMAL_CLEARING"); + return; + end + end + + api = freeswitch.API(); + for index,value in pairs(extension_table) do + if (string.find(value, "-") == nill) then + value = value..'-'..value; + end + sub_table = explode("-",value); + for extension=sub_table[1],sub_table[2] do + --extension_exists = "username_exists id "..extension.."@"..domain_name; + --reply = trim(api:executeString(extension_exists)); + --if (reply == "true") then + extension_status = "show channels like "..extension.."@"; + reply = trim(api:executeString(extension_status)); + if (reply == "0 total.") then + --freeswitch.consoleLog("NOTICE", "extension "..extension.." available\n"); + if (extension == tonumber(sip_from_user)) then + --this extension is the caller that initated the page + else + --originate the call + cmd_string = "bgapi originate {sip_auto_answer=true,hangup_after_bridge=false,origination_caller_id_name='"..caller_id_name.."',origination_caller_id_number="..caller_id_number.."}user/"..extension.."@"..domain_name.." conference:page-"..destination_number.."@page+flags{mute} inline"; + api:executeString(cmd_string); + end + --freeswitch.consoleLog("NOTICE", "cmd_string "..cmd_string.."\n"); + else + --look inside the reply to check for the correct domain_name + if string.find(reply, domain_name) then + --found: extension number is busy + else + --not found + if (extension == tonumber(sip_from_user)) then + --this extension is the caller that initated the page + else + --originate the call + cmd_string = "bgapi originate {sip_auto_answer=true,hangup_after_bridge=false,origination_caller_id_name='"..caller_id_name.."',origination_caller_id_number="..caller_id_number.."}user/"..extension.."@"..domain_name.." conference:page-"..destination_number.."@page+flags{mute} inline"; + api:executeString(cmd_string); + end + end + end + --end + end + end + + --send main call to the conference room + session:execute("conference", "page-"..destination_number.."@page+flags{endconf}"); + +end \ No newline at end of file diff --git a/includes/install/scripts/park.lua b/includes/install/scripts/park.lua new file mode 100644 index 0000000000..61fba64800 --- /dev/null +++ b/includes/install/scripts/park.lua @@ -0,0 +1,229 @@ +--example usage + --basic + --condition destination_number 5900 + --action set park_extension=5901 + --advanced + --condition destination_number ^59(\d{2})$ + --action set park_extension=$1 + --additional settings + --action set park_range=5 + --action set park_direction=in (in/out/both) + --action set park_announce=true (not implemented yet) + --action set park_timeout_seconds=30 (not implemented yet) + --action set park_timeout_extension=1001 (not implemented yet) + --action set park_music=$${hold_music} + --action lua park.lua + +--connect to the database + --ODBC - data source name + --local dbh = freeswitch.Dbh("name","user","pass"); + --FreeSWITCH core db + local dbh = freeswitch.Dbh("core:park"); + +--get the session variables + sounds_dir = session:getVariable("sounds_dir"); + park_direction = session:getVariable("park_direction"); + uuid = session:getVariable("uuid"); + domain_name = session:getVariable("domain_name"); + park_extension = session:getVariable("park_extension"); + park_range = session:getVariable("park_range"); + park_announce = session:getVariable("park_announce"); + park_timeout_type = session:getVariable("park_timeout_type"); + park_timeout_destination = session:getVariable("park_timeout_destination"); + park_timeout_seconds = session:getVariable("park_timeout_seconds"); + park_music = session:getVariable("park_music"); + +--add the explode function + function explode ( seperator, str ) + local pos, arr = 0, {} + for st, sp in function() return string.find( str, seperator, pos, true ) end do -- for each divider found + table.insert( arr, string.sub( str, pos, st-1 ) ) -- attach chars left of current divider + pos = sp + 1 -- jump past current divider + end + table.insert( arr, string.sub( str, pos ) ) -- attach chars right of last divider + return arr + end + +--add the trim function + function trim(s) + return s:gsub("^%s+", ""):gsub("%s+$", "") + end + +--if park_timeout_seconds is not defined set the timeout to 5 minutes + if (not park_timeout_seconds) then + park_timeout_seconds = 300; + end + +--if park_timeout_type is not defined set to transfer + if (not park_timeout_type) then + park_timeout_type = "transfer"; + end + +--prepare the api + api = freeswitch.API(); + +--answer the call + session:answer(); + +--database + --exits the script if we didn't connect properly + assert(dbh:connected()); + + --create the table if it doesn't exist + --pgsql + dbh:test_reactive("SELECT * FROM park", "", "CREATE TABLE park (id SERIAL, lot TEXT, domain TEXT, uuid TEXT, CONSTRAINT park_pk PRIMARY KEY(id))"); + --sqlite + dbh:test_reactive("SELECT * FROM park", "", "CREATE TABLE park (id INTEGER PRIMARY KEY, lot TEXT, domain TEXT, uuid TEXT)"); + --mysql + dbh:test_reactive("SELECT * FROM park", "", "CREATE TABLE park (id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, lot TEXT, domain TEXT, uuid TEXT)"); + + --if park_range is defined then loop through the range to find an available parking lot + if (park_range) then + park_extension_start = park_extension; + park_extension_end = ((park_extension+park_range)-1); + extension = park_extension_start; + while true do + --exit the loop at the end of the range + if (tonumber(extension) > park_extension_end) then + break; + end + --check the database for an available slot + lot_status = "available"; + sql = "SELECT count(*) as count FROM park WHERE lot = '"..extension.."' and domain = '"..domain_name.."' "; + dbh:query(sql, function(result) + --for key, val in pairs(result) do + -- freeswitch.consoleLog("NOTICE", "parking result "..key.." "..val.."\n"); + --end + count = result.count; + end); + --if count is 0 then the parking lot is available end the loop + if (count == "0") then + lot_status = "available"; + park_extension = ""..extension; + break; + end + --increment the value + extension = extension + 1; + end + end + + --check the database to see if the slot is available or unavailable + lot_status = "available"; + sql = "SELECT id, lot, uuid FROM park WHERE lot = '"..park_extension.."' and domain = '"..domain_name.."' "; + dbh:query(sql, function(row) + lot_uuid = row.uuid; + lot_status = "unavailable"; + end); + + --if park direction is set to out then unpark by bridging it to the caller + if (park_direction == "out") then + if (lot_uuid) then + --set the park status + cmd = "uuid_setvar "..lot_uuid.." park_status unparked"; + result = trim(api:executeString(cmd)); + freeswitch.consoleLog("NOTICE", "Park Status: unparked "..park_extension.."\n"); + --unpark the call with bridge + cmd = "uuid_bridge "..uuid.." "..lot_uuid; + result = trim(api:executeString(cmd)); + end + else + --check if the uuid_exists, if it does not exist then delete the uuid from the db and set presence to terminated + if (lot_uuid) then + cmd = "uuid_exists "..lot_uuid; + result = trim(api:executeString(cmd)); + if (result == "false") then + --set presence out + event = freeswitch.Event("PRESENCE_IN"); + event:addHeader("proto", "sip"); + event:addHeader("event_type", "presence"); + event:addHeader("alt_event_type", "dialog"); + event:addHeader("Presence-Call-Direction", "outbound"); + event:addHeader("state", "Active (1 waiting)"); + event:addHeader("from", park_extension.."@"..domain_name); + event:addHeader("login", park_extension.."@"..domain_name); + event:addHeader("unique-id", lot_uuid); + event:addHeader("answer-state", "terminated"); + event:fire(); + + --delete from the database + dbh:query("DELETE from park WHERE lot = '"..park_extension.."' and domain = '"..domain_name.."' "); + --freeswitch.consoleLog("NOTICE", "Park - Affected rows: " .. dbh:affected_rows() .. "\n"); + + --set the status to available + lot_status = "available"; + end + end + + --check if the parking lot is available, if it is then add it to the db, set presenence to confirmed and park the call + if (lot_status == "available") then + --park the call + cmd = "uuid_park "..uuid; + result = trim(api:executeString(cmd)); + if (park_music) then + cmd = "uuid_broadcast "..uuid.." "..park_music.." aleg"; + result = trim(api:executeString(cmd)); + end + + --set the park status + cmd = "uuid_setvar "..uuid.." park_status parked"; + result = trim(api:executeString(cmd)); + freeswitch.consoleLog("NOTICE", "Park Status: parked "..park_extension.."\n"); + + --add to the database + dbh:query("INSERT INTO park (lot, domain, uuid) VALUES('"..park_extension.."', '"..domain_name.."', '"..uuid.."')"); + + --set presence in + event = freeswitch.Event("PRESENCE_IN"); + event:addHeader("proto", "sip"); --park + event:addHeader("login", park_extension.."@"..domain_name); + event:addHeader("from", park_extension.."@"..domain_name); + event:addHeader("status", "Active (1 waiting)"); + event:addHeader("rpid", "unknown"); + event:addHeader("event_type", "presence"); + event:addHeader("alt_event_type", "dialog"); + event:addHeader("event_count", "1"); + event:addHeader("unique-id", uuid); + --event:addHeader("Presence-Call-Direction", "outbound") + event:addHeader("answer-state", "confirmed"); + event:fire(); + + else + --bridge the current call to the call that is parked + --set the presence to terminated + event = freeswitch.Event("PRESENCE_IN"); + event:addHeader("proto", "sip"); + event:addHeader("event_type", "presence"); + event:addHeader("alt_event_type", "dialog"); + event:addHeader("Presence-Call-Direction", "outbound"); + --event:addHeader("state", "Active (1 waiting)"); + event:addHeader("from", park_extension.."@"..domain_name); + event:addHeader("login", park_extension.."@"..domain_name); + event:addHeader("unique-id", uuid); + event:addHeader("answer-state", "terminated"); + event:fire(); + + --delete the lot from the database + dbh:query("DELETE from park WHERE lot = '"..park_extension.."' and domain = '"..domain_name.."' "); + --freeswitch.consoleLog("NOTICE", "Park 200- Affected rows: " .. dbh:affected_rows() .. "\n"); + + --set the park status + cmd = "uuid_setvar "..lot_uuid.." park_status unparked"; + result = trim(api:executeString(cmd)); + freeswitch.consoleLog("NOTICE", "Park Status: unparked "..park_extension.."\n"); + + --connect the calls + cmd = "uuid_bridge "..uuid.." "..lot_uuid; + result = trim(api:executeString(cmd)); + end + + --continue running when the session ends + session:setAutoHangup(false); + + --start the fifo monitor on its own so that it doesn't block the script execution + api = freeswitch.API(); + cmd = "luarun park_monitor.lua "..uuid.." "..domain_name.." "..park_extension.." "..park_timeout_type.." "..park_timeout_seconds.." "..park_timeout_destination; + result = api:executeString(cmd); + end + +--close the database connection + dbh:release(); diff --git a/includes/install/scripts/park_monitor.lua b/includes/install/scripts/park_monitor.lua new file mode 100644 index 0000000000..bac696c243 --- /dev/null +++ b/includes/install/scripts/park_monitor.lua @@ -0,0 +1,149 @@ +--park_monitor.lua + --Date: 4 Oct. 2011 + --Description: + --if the call has been answered + --then send presence terminate, and delete from the database + +--connect to the database + --ODBC - data source name + --local dbh = freeswitch.Dbh("name","user","pass"); + --FreeSWITCH core db + local dbh = freeswitch.Dbh("core:park"); + +--get the argv values + script_name = argv[0]; + uuid = argv[1]; + domain_name = argv[2]; + park_extension = argv[3]; + park_timeout_type = argv[4]; + park_timeout_seconds = argv[5]; + park_timeout_destination = argv[6]; + +--prepare the api + api = freeswitch.API(); + +--add a trim function + function trim (s) + return (string.gsub(s, "^%s*(.-)%s*$", "%1")) + end + +--monitor the parking lot if the call has hungup send a terminated event, and delete from the db + x = 0 + while true do + --sleep a moment to prevent using unecessary resources + freeswitch.msleep(1000); + + if (api:executeString("uuid_exists "..uuid) == "false") then + --set the presence to terminated + event = freeswitch.Event("PRESENCE_IN"); + event:addHeader("proto", "sip"); + event:addHeader("event_type", "presence"); + event:addHeader("alt_event_type", "dialog"); + event:addHeader("Presence-Call-Direction", "outbound"); + event:addHeader("state", "Active (1 waiting)"); + event:addHeader("from", park_extension.."@"..domain_name); + event:addHeader("login", park_extension.."@"..domain_name); + event:addHeader("unique-id", uuid); + event:addHeader("answer-state", "terminated"); + event:fire(); + + --set the park status + cmd = "uuid_setvar "..uuid.." park_status cancelled"; + result = trim(api:executeString(cmd)); + freeswitch.consoleLog("NOTICE", "Park Status: cancelled\n"); + + --delete the lot from the database + dbh:query("DELETE from park WHERE lot = '"..park_extension.."' and domain = '"..domain_name.."' "); + + + --end the loop + break; + else + cmd = "uuid_getvar "..uuid.." park_status"; + result = trim(api:executeString(cmd)); + --freeswitch.consoleLog("notice", "" .. result .. "\n"); + if (result == "parked") then --_undef_ + --set presence in + event = freeswitch.Event("PRESENCE_IN"); + event:addHeader("proto", "sip"); --park + event:addHeader("login", park_extension.."@"..domain_name); + event:addHeader("from", park_extension.."@"..domain_name); + event:addHeader("status", "Active (1 waiting)"); + event:addHeader("rpid", "unknown"); + event:addHeader("event_type", "presence"); + event:addHeader("alt_event_type", "dialog"); + event:addHeader("event_count", "1"); + event:addHeader("unique-id", uuid); + --event:addHeader("Presence-Call-Direction", "outbound") + event:addHeader("answer-state", "confirmed"); + event:fire(); + else + --set the presence to terminated + event = freeswitch.Event("PRESENCE_IN"); + event:addHeader("proto", "sip"); + event:addHeader("event_type", "presence"); + event:addHeader("alt_event_type", "dialog"); + event:addHeader("Presence-Call-Direction", "outbound"); + event:addHeader("state", "Active (1 waiting)"); + event:addHeader("from", park_extension.."@"..domain_name); + event:addHeader("login", park_extension.."@"..domain_name); + event:addHeader("unique-id", uuid); + event:addHeader("answer-state", "terminated"); + event:fire(); + + --delete the lot from the database + dbh:query("DELETE from park WHERE lot = '"..park_extension.."' and domain = '"..domain_name.."' "); + --freeswitch.consoleLog("NOTICE", "Affected rows: park ext "..park_extension.." " .. dbh:affected_rows() .. "\n"); + + --set the park status + cmd = "uuid_setvar "..uuid.." park_status unparked"; + result = trim(api:executeString(cmd)); + freeswitch.consoleLog("NOTICE", "Park Status: unparked "..park_extension.."\n"); + + --end the loop + break; + end + end + + --limit the monitor to watching 60 seconds + x = x + 1; + if (x > tonumber(park_timeout_seconds)) then + --set the presence to terminated + event = freeswitch.Event("PRESENCE_IN"); + event:addHeader("proto", "sip"); + event:addHeader("event_type", "presence"); + event:addHeader("alt_event_type", "dialog"); + event:addHeader("Presence-Call-Direction", "outbound"); + event:addHeader("state", "Active (1 waiting)"); + event:addHeader("from", park_extension.."@"..domain_name); + event:addHeader("login", park_extension.."@"..domain_name); + event:addHeader("unique-id", uuid); + event:addHeader("answer-state", "terminated"); + event:fire(); + + --delete the lot from the database + dbh:query("DELETE from park WHERE lot = '"..park_extension.."' and domain = '"..domain_name.."' "); + + --set the park status + cmd = "uuid_setvar "..uuid.." park_status timeout"; + result = trim(api:executeString(cmd)); + freeswitch.consoleLog("NOTICE", "Park Status: timeout\n"); + + --end the loop + break; + end + + end + + --if the timeout was reached transfer the call + cmd = "uuid_getvar "..uuid.." park_status"; + park_status = trim(api:executeString(cmd)); + if (park_timeout_type == "transfer" and park_status == "timeout") then + --set the park status + cmd = "uuid_setvar "..uuid.." park_status unparked"; + result = trim(api:executeString(cmd)); + freeswitch.consoleLog("NOTICE", "Park Status: unparked\n"); + --transfer the call when it has timed out + cmd = "uuid_transfer "..uuid.." "..park_timeout_destination; + result = trim(api:executeString(cmd)); + end diff --git a/includes/install/scripts/pin_number.lua b/includes/install/scripts/pin_number.lua new file mode 100644 index 0000000000..d28f51b745 --- /dev/null +++ b/includes/install/scripts/pin_number.lua @@ -0,0 +1,54 @@ +-- +-- FusionPBX +-- Version: MPL 1.1 +-- +-- The contents of this file are subject to the Mozilla Public License Version +-- 1.1 (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.mozilla.org/MPL/ +-- +-- Software distributed under the License is distributed on an "AS IS" basis, +-- WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +-- for the specific language governing rights and limitations under the +-- License. +-- +-- The Original Code is FusionPBX +-- +-- The Initial Developer of the Original Code is +-- Mark J Crane +-- Copyright (C) 2010 +-- the Initial Developer. All Rights Reserved. +-- +-- Contributor(s): +-- Mark J Crane + +max_tries = "3"; +digit_timeout = "5000"; + +if ( session:ready() ) then + session:answer( ); + pin_number = session:getVariable("pin_number"); + sounds_dir = session:getVariable("sounds_dir"); + + --set the sounds path for the language, dialect and voice + default_language = session:getVariable("default_language"); + default_dialect = session:getVariable("default_dialect"); + default_voice = session:getVariable("default_voice"); + if (not default_language) then default_language = 'en'; end + if (not default_dialect) then default_dialect = 'us'; end + if (not default_voice) then default_voice = 'callie'; end + + --if the pin number is provided then require it + if (pin_number) then + min_digits = string.len(pin_number); + max_digits = string.len(pin_number)+1; + digits = session:playAndGetDigits(min_digits, max_digits, max_tries, digit_timeout, "#", sounds_dir.."/"..default_language.."/"..default_dialect.."/"..default_voice.."/custom/please_enter_the_pin_number.wav", "", "\\d+"); + if (digits == pin_number) then + --pin is correct + else + session:streamFile(sounds_dir.."/"..default_language.."/"..default_dialect.."/"..default_voice.."/custom/your_pin_number_is_incorect_goodbye.wav"); + session:hangup("NORMAL_CLEARING"); + return; + end + end +end diff --git a/includes/install/scripts/recordings.lua b/includes/install/scripts/recordings.lua new file mode 100644 index 0000000000..c678139e3a --- /dev/null +++ b/includes/install/scripts/recordings.lua @@ -0,0 +1,162 @@ +-- +-- FusionPBX +-- Version: MPL 1.1 +-- +-- The contents of this file are subject to the Mozilla Public License Version +-- 1.1 (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.mozilla.org/MPL/ +-- +-- Software distributed under the License is distributed on an "AS IS" basis, +-- WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +-- for the specific language governing rights and limitations under the +-- License. +-- +-- The Original Code is FusionPBX +-- +-- The Initial Developer of the Original Code is +-- Mark J Crane +-- Copyright (C) 2010 +-- the Initial Developer. All Rights Reserved. +-- +-- Contributor(s): +-- Mark J Crane + +pin_number = ""; +max_tries = "3"; +digit_timeout = "3000"; +sounds_dir = ""; +recordings_dir = ""; +file_name = ""; +recording_number = ""; +recording_slots = ""; +recording_prefix = ""; + +--dtmf call back function detects the "#" and ends the call + function onInput(s, type, obj) + if (type == "dtmf" and obj['digit'] == '#') then + return "break"; + end + end + +--start the recording + function begin_record(session, sounds_dir, recordings_dir) + + --set the sounds path for the language, dialect and voice + default_language = session:getVariable("default_language"); + default_dialect = session:getVariable("default_dialect"); + default_voice = session:getVariable("default_voice"); + if (not default_language) then default_language = 'en'; end + if (not default_dialect) then default_dialect = 'us'; end + if (not default_voice) then default_voice = 'callie'; end + recording_slots = session:getVariable("recording_slots"); + recording_prefix = session:getVariable("recording_prefix"); + recording_name = session:getVariable("recording_name"); + + --select the recording number + if (recording_slots) then + min_digits = 1; + max_digits = 20; + recording_number = session:playAndGetDigits(min_digits, max_digits, max_tries, digit_timeout, "#", sounds_dir.."/"..default_language.."/"..default_dialect.."/"..default_voice.."/custom/please_enter_the_recording_number.wav", "", "\\d+"); + recording_name = recording_prefix..recording_number..".wav"; + end + + --set the default recording name if one was not provided + if (recording_name) then + --recording name is provided do nothing + else + --set a default recording_name + recording_name = "temp_"..session:get_uuid()..".wav"; + end + + --prompt for the recording + session:streamFile(sounds_dir.."/"..default_language.."/"..default_dialect.."/"..default_voice.."/custom/begin_recording.wav"); + session:execute("set", "playback_terminators=#"); + + --begin recording + session:execute("record", recordings_dir.."/"..recording_name.." 180 200"); + + --preview the recording + session:streamFile(recordings_dir.."/"..recording_name); + + --approve the recording, to save the recording press 1 to re-record press 2 + min_digits="0" max_digits="1" max_tries = "1"; digit_timeout = "100"; + digits = session:playAndGetDigits(min_digits, max_digits, max_tries, digit_timeout, "#", "voicemail/vm-save_recording.wav", "", "\\d+"); + + if (string.len(digits) == 0) then + min_digits="0" max_digits="1" max_tries = "1"; digit_timeout = "100"; + digits = session:playAndGetDigits(min_digits, max_digits, max_tries, digit_timeout, "#", "voicemail/vm-press.wav", "", "\\d+"); + end + + if (string.len(digits) == 0) then + min_digits="0" max_digits="1" max_tries = "1"; digit_timeout = "100"; + digits = session:playAndGetDigits(min_digits, max_digits, max_tries, digit_timeout, "#", "digits/1.wav", "", "\\d+"); + end + + if (string.len(digits) == 0) then + min_digits="0" max_digits="1" max_tries = "1"; digit_timeout = "100"; + digits = session:playAndGetDigits(min_digits, max_digits, max_tries, digit_timeout, "#", "voicemail/vm-rerecord.wav", "", "\\d+"); + end + + if (string.len(digits) == 0) then + min_digits="0" max_digits="1" max_tries = "1"; digit_timeout = "100"; + digits = session:playAndGetDigits(min_digits, max_digits, max_tries, digit_timeout, "#", "voicemail/vm-press.wav", "", "\\d+"); + end + + if (string.len(digits) == 0) then + min_digits="1" max_digits="1" max_tries = "1"; digit_timeout = "5000"; + digits = session:playAndGetDigits(min_digits, max_digits, max_tries, digit_timeout, "#", "digits/2.wav", "", "\\d+"); + end + + if (digits == "1") then + --recording saved, hangup + session:streamFile("voicemail/vm-saved.wav"); + return; + elseif (digits == "2") then + --delete the old recording + os.remove (recordings_dir.."/"..recording_name); + --session:execute("system", "rm "..); + --make a new recording + begin_record(session, sounds_dir, recordings_dir); + else + --recording saved, hangup + session:streamFile("voicemail/vm-saved.wav"); + return; + end + end + +if ( session:ready() ) then + session:answer(); + + --get the dialplan variables and set them as local variables + pin_number = session:getVariable("pin_number"); + sounds_dir = session:getVariable("sounds_dir"); + recordings_dir = session:getVariable("recordings_dir"); + + --set the sounds path for the language, dialect and voice + default_language = session:getVariable("default_language"); + default_dialect = session:getVariable("default_dialect"); + default_voice = session:getVariable("default_voice"); + if (not default_language) then default_language = 'en'; end + if (not default_dialect) then default_dialect = 'us'; end + if (not default_voice) then default_voice = 'callie'; end + + --if the pin number is provided then require it + if (pin_number) then + min_digits = string.len(pin_number); + max_digits = string.len(pin_number)+1; + digits = session:playAndGetDigits(min_digits, max_digits, max_tries, digit_timeout, "#", sounds_dir.."/"..default_language.."/"..default_dialect.."/"..default_voice.."/custom/please_enter_the_pin_number.wav", "", "\\d+"); + if (digits == pin_number) then + --pin is correct + else + session:streamFile(sounds_dir.."/"..default_language.."/"..default_dialect.."/"..default_voice.."/custom/your_pin_number_is_incorect_goodbye.wav"); + session:hangup("NORMAL_CLEARING"); + return; + end + end + + --start recording + begin_record(session, sounds_dir, recordings_dir); + + session:hangup(); +end diff --git a/includes/install/scripts/ring_group.lua b/includes/install/scripts/ring_group.lua new file mode 100644 index 0000000000..09109eb41e --- /dev/null +++ b/includes/install/scripts/ring_group.lua @@ -0,0 +1,98 @@ +-- intercom.lua +-- Part of FusionPBX +-- Copyright (C) 2010 Mark J Crane +-- 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. + +--include the lua script + scripts_dir = string.sub(debug.getinfo(1).source,2,string.len(debug.getinfo(1).source)-(string.len(argv[0])+1)); + include = assert(loadfile(scripts_dir .. "/resources/config.lua")); + include(); + +--connect to the database + --ODBC - data source name + if (dsn_name) then + dbh = freeswitch.Dbh(dsn_name,dsn_username,dsn_password); + end + --FreeSWITCH core db handler + if (db_type == "sqlite") then + dbh = freeswitch.Dbh("core:"..db_path.."/"..db_name); + end + +--get the variables + domain_name = session:getVariable("domain_name"); + ring_group_uuid = session:getVariable("ring_group_uuid"); + +--get the extension list + sql = + [[ SELECT g.ring_group_extension_uuid, e.extension_uuid, e.extension, + r.ring_group_strategy, r.ring_group_timeout_sec, r.ring_group_timeout_app, r.ring_group_timeout_data + FROM v_ring_groups as r, v_ring_group_extensions as g, v_extensions as e + where g.ring_group_uuid = r.ring_group_uuid + and g.ring_group_uuid = ']]..ring_group_uuid..[[' + and e.extension_uuid = g.extension_uuid + and r.ring_group_enabled = 'true' + order by e.extension asc ]] + --freeswitch.consoleLog("notice", "SQL:" .. sql .. "\n"); + app_data = ""; + + x = 0; + dbh:query(sql, function(row) + ring_group_timeout_sec = row.ring_group_timeout_sec; + ring_group_timeout_app = row.ring_group_timeout_app; + ring_group_timeout_data = row.ring_group_timeout_data; + if (row.ring_group_strategy == "sequence") then + delimiter = "|"; + end + if (row.ring_group_strategy == "simultaneous") then + delimiter = ","; + end + if (x == 0) then + app_data = "[leg_timeout="..ring_group_timeout_sec.."]user/" .. row.extension .. "@" .. domain_name; + else + app_data = app_data .. delimiter .. "[leg_timeout="..ring_group_timeout_sec.."]user/" .. row.extension .. "@" .. domain_name; + end + x = x + 1; + end); + +--close the database connection + dbh:release(); + +--app_data + --freeswitch.consoleLog("notice", "Debug:\n" .. app_data .. "\n"); + +--session actions + if (session:ready()) then + session:answer(); + session:execute("set", "hangup_after_bridge=true"); + session:execute("set", "continue_on_fail=true"); + session:execute("bridge", app_data); + session:execute(ring_group_timeout_app, ring_group_timeout_data); + end + +--actions + --ACTIONS = {} + --table.insert(ACTIONS, {"set", "hangup_after_bridge=true"}); + --table.insert(ACTIONS, {"set", "continue_on_fail=true"}); + --table.insert(ACTIONS, {"bridge", app_data}); + --table.insert(ACTIONS, {ring_group_timeout_app, ring_group_timeout_data}); diff --git a/includes/install/scripts/roku.lua b/includes/install/scripts/roku.lua new file mode 100644 index 0000000000..310fbf3f3a --- /dev/null +++ b/includes/install/scripts/roku.lua @@ -0,0 +1,91 @@ +-- +-- FusionPBX +-- Version: MPL 1.1 +-- +-- The contents of this file are subject to the Mozilla Public License Version +-- 1.1 (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.mozilla.org/MPL/ +-- +-- Software distributed under the License is distributed on an "AS IS" basis, +-- WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +-- for the specific language governing rights and limitations under the +-- License. +-- +-- The Original Code is FusionPBX +-- +-- The Initial Developer of the Original Code is +-- Mark J Crane +-- Copyright (C) 2010 +-- the Initial Developer. All Rights Reserved. +-- +-- Contributor(s): +-- Mark J Crane + +predefined_destination = ""; +max_tries = "3"; +digit_timeout = "5000"; +port = "8080"; + +if ( session:ready() ) then + session:answer( ); + pin_number = session:getVariable("pin_number"); + sounds_dir = session:getVariable("sounds_dir"); + host = session:getVariable("host"); + + --set the sounds path for the language, dialect and voice + default_language = session:getVariable("default_language"); + default_dialect = session:getVariable("default_dialect"); + default_voice = session:getVariable("default_voice"); + if (default_language) then else default_language = 'en'; end + if (default_dialect) then else default_dialect = 'us'; end + if (default_voice) then else default_voice = 'callie'; end + + digitmaxlength = 0; + timeoutpin = 7500; + timeouttransfer = 7500; + + --if the pin number is provided then require it + if (pin_number) then + min_digits = string.len(pin_number); + max_digits = string.len(pin_number)+1; + digits = session:playAndGetDigits(min_digits, max_digits, max_tries, digit_timeout, "#", sounds_dir.."/"..default_language.."/"..default_dialect.."/"..default_voice.."/custom/please_enter_the_pin_number.wav", "", "\\d+"); + if (digits == pin_number) then + --pin is correct + digits = ""; + else + session:streamFile(sounds_dir.."/"..default_language.."/"..default_dialect.."/"..default_voice.."/custom/your_pin_number_is_incorect_goodbye.wav"); + session:hangup("NORMAL_CLEARING"); + return; + end + end + + if (session:ready()) then + session:answer(); + min_digits = 1; + max_digits = 1; + digitmaxlength = 1; + digits = session:playAndGetDigits(min_digits, max_digits, max_tries, digit_timeout, "#", sounds_dir.."/"..default_language.."/"..default_dialect.."/"..default_voice.."/custom/please_enter_the_phone_number.wav", "", "\\d+"); + + x = 0; + while (session:ready() == true) do + if (string.len(digits) == 0) then + --getDigits(length, terminators, timeout, digit_timeout, abs_timeout) + digits = session:getDigits(1, "#", 40000); + end + if (string.len(digits) > 0) then + --press star to exit + if (digits == "*") then + break; + end + --send the command to php + session:execute("system","/usr/local/bin/php /usr/local/www/fusionpbx/mod/roku/roku.php "..digits.." "..host.." "..port); + end + digits = ""; + if (x > 17500) then + break; + end + end + session:hangup("NORMAL_CLEARING"); + end +end \ No newline at end of file diff --git a/includes/install/scripts/wakeup.lua b/includes/install/scripts/wakeup.lua new file mode 100644 index 0000000000..ec14e7cf89 --- /dev/null +++ b/includes/install/scripts/wakeup.lua @@ -0,0 +1,203 @@ +-- +-- FusionPBX +-- Version: MPL 1.1 +-- +-- The contents of this file are subject to the Mozilla Public License Version +-- 1.1 (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.mozilla.org/MPL/ +-- +-- Software distributed under the License is distributed on an "AS IS" basis, +-- WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +-- for the specific language governing rights and limitations under the +-- License. +-- +-- The Original Code is FusionPBX +-- +-- The Initial Developer of the Original Code is +-- Mark J Crane +-- Copyright (C) 2010 +-- the Initial Developer. All Rights Reserved. +-- +-- Contributor(s): +-- Mark J Crane + +--get the argv values + script_name = argv[0]; + domain_name = argv[1]; + wakeup_number = argv[2]; + +--add the trim function + function trim(s) + return s:gsub("^%s+", ""):gsub("%s+$", "") + end + +--add is_numeric + function is_numeric(text) + if type(text)~="string" and type(text)~="number" then return false end + return tonumber(text) and true or false + end + +--set the default values for the variables + pin_number = ""; + max_tries = "3"; + digit_timeout = "3000"; + sounds_dir = ""; + extension_type = ""; --number,caller_id_number,prompt + extension_number = ""; + +if (wakeup_number) then + --begin the wakeup call + if ( session:ready() ) then + --prepare the api object + api = freeswitch.API(); + + --set session settings + session:answer(); + session:setAutoHangup(false); + + --wakeup confirm press 1 to 3 + min_digits = 1; + max_digits = 1; + digits = session:playAndGetDigits(min_digits, max_digits, max_tries, digit_timeout, "#", "phrase:wakeup-call", "", "\\d+"); + + --reschedule the call for snooze + if (digits == "2") then + freeswitch.consoleLog("NOTICE", "wakeup call: snooze selected - rescheduled the call\n"); + api = freeswitch.API(); + caller_id_name = "wakeup call"; + caller_id_number = wakeup_number; + sched_api_time = "600"; + cmd_string = "sched_api +"..sched_api_time.." wakeup-call-"..wakeup_number.." originate {hangup_after_bridge=false,origination_caller_id_name='"..caller_id_name.."',origination_caller_id_number="..caller_id_number.."}user/"..wakeup_number.."@"..domain_name.." &lua('wakeup.lua "..domain_name.." "..wakeup_number.."') "; + freeswitch.consoleLog("NOTICE", "wakeup: "..cmd_string.."\n"); + reply = api:executeString(cmd_string); + end + end +else + --prompt for the wakeup call information + + if ( session:ready() ) then + session:answer(); + session:setAutoHangup(false); + + --get the dialplan variables and set them as local variables + sounds_dir = session:getVariable("sounds_dir"); + domain_name = session:getVariable("domain_name"); + extension_number = session:getVariable("extension_number"); + extension_type = session:getVariable("extension_type"); + time_zone_offset = session:getVariable("time_zone_offset"); + sip_number_alias = session:getVariable("sip_number_alias"); + sip_from_user = session:getVariable("sip_from_user"); + if (is_numeric(sip_number_alias)) then + wakeup_number = sip_number_alias; + else + wakeup_number = sip_from_user; + end + + --get the extension number + if (extension_type == "prompt") then + min_digits = 1; + max_digits = 11; + wakeup_time = session:playAndGetDigits(min_digits, max_digits, max_tries, digit_timeout, "#", "phrase:wakeup-get-extension", "", "\\d+"); + end + + --get the wakeup time + min_digits = 4; + max_digits = 4; + wakeup_time = session:playAndGetDigits(min_digits, max_digits, max_tries, digit_timeout, "#", "phrase:wakeup-greeting", "", "\\d+"); + freeswitch.consoleLog("NOTICE", "wakeup time: "..wakeup_time.."\n"); + + --get the current time + current_hours = tonumber(os.date("%H")); + current_minutes = tonumber(os.date("%M")); + current_seconds = tonumber(os.date("%S")); + + --adjust the time zone offset + if (time_zone_offset) then + current_hours = time_zone_offset + current_hours; + if (current_hours < 0) then + current_hours = current_hours + 24; + end + if (current_hours > 23) then + current_hours = current_hours - 24; + end + end + + --show the current hours minutes and seconds to the log + --freeswitch.consoleLog("NOTICE", "Hours: " .. current_hours .. "\n"); + --freeswitch.consoleLog("NOTICE", "Mins: " .. current_minutes .. "\n"); + --freeswitch.consoleLog("NOTICE", "Seconds: " .. current_seconds .. "\n"); + + --prepare the current time + current_time = (current_hours * 100) + current_minutes; + + --get the wakeup hours and minutes + wakeup_hours = string.sub(wakeup_time, 1, 2); + wakeup_minutes = string.sub(wakeup_time, 3); + + --show the wakeup time, hours, and minutes to the log + --freeswitch.consoleLog("NOTICE", "wakeup_time "..wakeup_time.."\n"); + --freeswitch.consoleLog("NOTICE", "wakeup_hours "..wakeup_hours.."\n"); + --freeswitch.consoleLog("NOTICE", "wakeup_minutes "..wakeup_minutes.."\n"); + + --convert the time, hours and minutes to numbers + wakeup_time = tonumber(wakeup_time); + wakeup_hours = tonumber(wakeup_hours); + wakeup_minutes = tonumber(wakeup_minutes); + if (current_time > wakeup_time) then + --get the current_time_in_seconds + current_time_in_seconds = (current_hours * 3600) + (current_minutes * 60); + --freeswitch.consoleLog("NOTICE", "sched_api_time = ("..current_hours.." * 3600) + ("..current_minutes.." * 60)\n"); + --get the seconds until midnight + seconds_until_midnight = (24 * 3600) - current_time_in_seconds; + --freeswitch.consoleLog("NOTICE", "sched_api_time = (24 * 3600) - "..current_time_in_seconds.."\n"); + --get the wakeup_time_in_seconds + wakeup_time_in_seconds = (wakeup_hours * 3600) + (wakeup_minutes * 60); + --freeswitch.consoleLog("NOTICE", "sched_api_time = ("..wakeup_hours.." * 3600) + ("..wakeup_minutes.." * 60)\n"); + --add the seconds_until_midnight to the wakeup_time_in_seconds + sched_api_time = wakeup_time_in_seconds + seconds_until_midnight; + --freeswitch.consoleLog("NOTICE", "sched_api_time = "..wakeup_time_in_seconds.." + "..seconds_until_midnight.."\n"); + else + --get the current_time_in_seconds + current_time_in_seconds = (current_hours * 3600) + (current_minutes * 60); + --freeswitch.consoleLog("NOTICE", "current_time_in_seconds = ("..current_hours.." * 3600) + ("..current_minutes.." * 60);\n"); + --get the wakeup_time_in_seconds + wakeup_time_in_seconds = (wakeup_hours * 3600) + (wakeup_minutes * 60); + --freeswitch.consoleLog("NOTICE", "wakeup_time_in_seconds = ("..wakeup_hours.." * 3600) + ("..wakeup_minutes.." * 60);\n"); + --subtract the current time from wakeup_time_in_seconds + sched_api_time = wakeup_time_in_seconds - current_time_in_seconds; + --freeswitch.consoleLog("NOTICE", "sched_api_time = "..wakeup_time_in_seconds.." - "..current_time_in_seconds.."\n"); + end + --freeswitch.consoleLog("NOTICE", "sched_api_time "..sched_api_time.."\n"); + + --wakeup call has been scheduled + session:streamFile("phrase:wakeup-scheduled"); + session:say(wakeup_time, "en", "number", "ITERATED"); + + --wakeup confirm press 1 to 3 + min_digits = 1; + max_digits = 1; + wakeup_accept = session:playAndGetDigits(min_digits, max_digits, max_tries, digit_timeout, "#", "phrase:wakeup-accept", "", "\\d+"); + --accept + if (wakeup_accept == "1") then + --send a message to the console + freeswitch.consoleLog("NOTICE", "wakeup: accepted\n"); + --schedule the wakeup call + caller_id_name = "wakeup call"; + caller_id_number = wakeup_number; + cmd_string = "sched_api +"..sched_api_time.." wakeup-call-"..wakeup_number.." originate {hangup_after_bridge=false,origination_caller_id_name='"..caller_id_name.."',origination_caller_id_number="..caller_id_number.."}user/"..wakeup_number.."@"..domain_name.." &lua('wakeup.lua "..domain_name.." "..wakeup_number.."') "; + freeswitch.consoleLog("NOTICE", "wakeup: "..cmd_string.."\n"); + api = freeswitch.API(); + reply = api:executeString(cmd_string); + --hangup + session:hangup(); + end + --cancel + if (wakeup_accept == "2") then + --send a message to the console + freeswitch.consoleLog("NOTICE", "wakeup: cancelled\n"); + --hangup + session:hangup(); + end + end +end \ No newline at end of file diff --git a/includes/install/sounds/en/us/callie/custom/16000/4.wav b/includes/install/sounds/en/us/callie/custom/16000/4.wav new file mode 100644 index 0000000000000000000000000000000000000000..696b20ec98d3a207a0dc8f3ea3e2aefc20ae1098 GIT binary patch literal 13752 zcmW+-1(*{_)9#sx%eq@OSz&Q^cR1YL-EDzG7C7A9T@E?iT@E>14m)&Njb}HW@#(+5 z|H;F%A(_l{SH1OCb@kglJGN_gu`WXWTJ~)_c1mt~1VV^_*OF%NCJ!MJMWE3ma!0I( zYsTaL=sZeBy>S+vkN?G&@NYOAXW~_u#f?!F^bP-kTjA=sCq9o;QA6|?SHfngF5Zk+ z;BL4no{UG}R2-1{;(YAKtMLH*2_HnaQ9eE?Wk{=~8CZ=fASDv93>D#>crJc}>!SMT zG(4jQK7wg1;t*W(4mZGuq-)YZY=+kfyaApt3-`c7;Q4*w2@~-a^cQiM7>K;m9LX## z!WZxsycZ`TD_TKxCmNvFk|<_L<M#{wZum%;w9Mt%&Ow0znHKQ55+6NMlZl8TQMiSmt?pF zrll>?X-Nt5UM97ZzDxVzid3w^Kky#37@dOWO~S9S3;zRXuwn|vv8LYCxIcag zSCiN(?Z#cvL{xy!VF5h(#I5iXDIWigvk;GOlMjgzC=wr#65(kA z+D)t=R>OGqNm%0WWpopDL|#A*19w)UMraNijiSKz4bUdk7Inm1rJvGeK-mnK^CCP9 z?Lazo5m!Y{6hsx#BJhPCuJhsF@o-Fn_w$G)Bse_qB2EYcmX$0aboFnnK{gts9R zaUF2;5Vu5sqxMLH^TlE@3qL^f2@DwT0I^dU^+T_5MX=bi|HnUrowyCUiteHoXfzr|)-*ro^Si?Wd%wM2ixySli!v|hRd zKA3|)NQ3bP6i*yO82r=_hah^c5cR2Jfh^dYEl0&XYcY9be*fd>!!m z0`QTCN5iNGVFE|M-;aR4cK8^cg!Z84_>`0+^J9s1qa5GohE**n7Uxcp1T~4CQ#BSmsN<`z)bF>j9!Ml#A70jaz`V*}| zH-MLR0)I5c(UK${!2OBK5Eu7gM4fRP7<)N-K(rx>APTPI^Wdqw_#f%5^bupUg=j@g zK)EoFzJN0$*!v#-3*UjbxsPiiFB(I9gAtTSlC%#8A$E@8gZMPqU^9M%ZGiu1V8C{O z+)_aQQs9(l_#MP&dz^x6;x%|1ZU!;GAMZpG8iCH?0=x{6{R6P|7C6L*C27CZ0b{I1 zSAfBe17mU$EsX-yB;fZ_8r-!33PW440a)siGz)J;;lwQ9%QJwKE69ZU0B`OB4w?pR zG8;>{H()me|L+dt!qRAng8ry7nuRw>HKb+I@3;%ilEL-RK-34Kyc49d^Kb_r zaQabTmdW^|vjeEfi?f`yYqn)T3 z20eiLXTWo8;0+BjpcGUGK6wXMzCt0il87MJ5qdORa)`N7Ysg^rA)5>WPYytrFd_XW zT;WFwJ;Zk64S^H3O5M>Tq((;|N8bWw&&OwhMFW7GN77cvk*%bU;!1I%I7GZJ){(}D zFdHHZj3kxKR?FB3;$9FuW#WFQT)40(wxL*}RU%GS!ODuycBDO~c(@=RG(>Ku8R zd`;dW$C0JPYN8j>j~GD=BpQH!{{gR51(fHasziubK|0B4ltwmQ=A&+r)d&l2iDgik z3DPrZv_wfC#FwI7jFNgt=cS5}XGg&}9uv#RsnmSgZuvQdN4Z2jUz?}z9eyF=W#r+g z8PWY>I>gqCyAyXI&JfozwqHz-=$xq65zWI_>i27RtCuJT$TO+GQFCb@&ocu;Fa3?Y z@5;x!syk9_tt=-?JCyV({#o?A=yB1qqV%Fyg{KSG6izJcUAV2VN>Ot0;*!DU3)XrL zd08LN>_7%vTbf2SS6>OA689kGjqzI6?wrb%f3G^a`q>)0YwoC3Ub}nUuJxSt`q!Ub zzj?ifweDBZX6;WgN8iv?BHq#K+%kK^Qo7LltLCr2ezh(i3Q?R<5jW^S$fwJ+9gTC+x#s#*F} z937#ViCux2&c8}t2{V(%rYuY|8AoN_s*qAiQ+Z3JP)=s{24i$`d~}{B zpP0qY@n$$0l_nGl`D^k!{?ZoiD~_``?Wf8fdb0g&pk>G#N~f#R+vtVN4|Wm1P`rbU zWRh%ve5>3n>q1%4YB87n6sY3)?o`?ylqMGUD!g9MvhY?>LCHQ#ghN+8-{%VT=kMTT z*&@{?-Jyt9F*o8Ple5!G(tBlm00Ifa>Rhf$TPBAbl|Shd<7{sr;ie#eUp!w6s&n@#0^_n$j#ws@?6H?p+f4%(o#PE2`=G zMVe#(O5Bq2E-g2Gmodc@X|fojOs`B|G7e_OWVOy3l=UsMRYvRd)Rg4-&XI>T9jT}M z9UYEG&p!5aN57z*TP%k?o+KL$yPZtA-#3v?6OxH+MNMsf zI1#fvzFX4Dl;pHphTDdxhRcT6hR*4}^l`?c#&<@WajCIp`peWgNps@%L?YdNd2d{q z-Qj;#p6_s3WtPrnyZNNmT56#a@+m((it!FN@jIp10o$+J^Gq{%ckxHQzFCBhTydS!JYaqT{)(wKd5y++5Fm-2BV($#%^-+5O93#MF?! zQ`^Ue1rMs{mVJW(zV!7P$_@o&mH+}L6?#=>r7`o&!Av+uDvvkD50*&|5p5~_$BWu zn@r}RIZ`K~CfA1vhL~VZa7^I1Kf=G*cf-5dLznj|yW*_nxMs_!3g`T)^lNAVRlM7L!LBVo=bJ>o=ZE7`Vgoft zb_}x0G;%tsATj($_A4C`+7sC6kM#fJJK!7UtL-cI&hu{f^m2bG8|f-{oVTC0RkuyE zEwRsYwkiMN%?T0wZ|Io3So0*@5c59%VNyX#jkHr~%hNomBU0a_bW7orRVg=8UZ*QcT9h0=$&>g*%DtZ`lkN8vKeuZiwU6eH?|w4--}WU4;Kt9oKig2tg)B7V!f?{ zP1w`I0Njz-KvtqMs7>T5qA~g^EfAXuDSQ%Fn_bG3(mm-Dp%20T0!RH#dz)Yu@SRi-5~IqOE|m<(Hbz0~~)Y0+`|X^ORY3sdARbiT0MEWTavF~326asIJ_ zO2zHWKW$%Kg`Nw62!`cGi_M`ruSoPI!in|h1!Px+#0drb3+^U+h1o`r2^oVA{M~(T zJT2U}%i6ejhr%(+Uei9$-ox?T8CL$ECo}MfKF5E?NLE?JX!F7kMGcKT9N$0jdeYD2 z&nY`ne@p9NxSzhxl$iNjR#f(i?A+|ZS-Ol(1}gbn?9%WHswo7^zV%gci^BB_1<@{FP~60({<6=(K+0STy4tK?xEiFKvz1SJ0dM28!LXO8|(W- za8b#z<#7WOHYRpWB9ooTol`w&W7GE-_m~!CBxeRPKAJA1Ur7xn&W)`S(Ng1~&WhLR z`o5g9qc*N|R&o6zx^QDrelapztzDg8%e(n@1}`$}`A8`ats)kam8rv20riv`O}WXb zWRR#s)Ic6-t5{iB&0S)Sgq8%B`VM>S<=x8MPUPI+IPIwEtm@iVw%x7r6$czN$wx?4 ziQi=1lyc2{-J!565fh^P(T!s_#(j#HC$>o{N>-&!OrK#Y%=nr)C2K}jx6EJ0th5!0 zu`!~)n$nMVFzdX{oR7>Ei>Bn~f4}oB<@>208Nb>UwK4nbN_SY`4D+9`6BScy6=PKc z)mPMe)GgH;R8y28d9F-NT_h@_F;bpzg!_+?)BeCS80)k0DrIk+TO3#HL+!`ya~zkP zoy$hM9o~|Fis{PFk^UrZ$^KEU(C+j!lZA;yv-N5>6$4N?Mn)HEl@x z0pkGEebaH%L1Qn&!{m1H+Nk!rZ*sp>N~d{EPQUqbQLkU|KRf<#|9FOT1}k2v25aK9YVBIhBlT%jE#+8wE_IdQa0h9KFoc`VTn@>DJ^X)o-?|5s zw=Emty6J4}tm!=9T<7{&Ho@KAJKbL#+{*L>Kix+oC_*tyby~Ak*E#HII1}+Ja%WWk zXd!xcOoQ0^ao6G(B^r`9r94cvryVz3FkDIdH$|VcBd%Li2mMjy1>yl;F+_NKxVqSC zm>ZSMF1}X$y5ymGy6vm;qWgjWEq#)2k5`g&<*$@0)hje=Z3XQ+O_=5%RU74I`D5xO zaTpI4WBKpQ&CtQXKHp=H!Tq!Btt-~G!R{VG{rz=s_K!dms(Wc((KZX(=E`y4x1H` z8RdwMirbSgIQe2~cSFzgJL&V%>lm)4BqeT%85n+1eT~{C&Zh5qKe{|N(h^asD`{17 zzBI+!*P$t|?3)`Zd2^PIjgZHZ99~T;W@eJ%`LOW_wIy)Ba7E z8Ffy3UiP<$=trI&PRgn*ZC1Rhh$~uOQpd8xzPRkV*ASYU!2e043fT8 z;l7)`@IYMX2@@tf#2=})s*k$mk&3ugN#E1Hn}%jjtf;G!S#5mv z9o4T@GgnEkG%$Oq@o93O*d<|8mDA8|cAno`HpE_NzErZk_ChD?76$p8}wHQ)n;%Z)=8;XSJWKQ z%+~Bv*Hw*F^peGs2e4e6%*8X>P=mlJUpsFD&wO``JKWvQea4;R`RsY*{p_>*zXh%Z zmxOB4kLhTpB2!3rqw_*bg98JfeBs_4_mHyl&Wes(w!f^BrQ9;pdcZc`@yhkoJ-|PT ze!{mxUfBut76FUG6L?8|tNkTNn>-z_H|FS*GH>B406E@m5|Y zJ3(cTlhH?Mp*UMu!*Au*LDllVvF@aE=zF1Q@H!ldpqJ5c%u!|ryMWum4;A(aBZYiE zhJVjG=;6Uhz8>xluBrB$mP)08qJD+D3yu^tE9_kKu~;a*XGPBC<<)#R=wZ{PcH~$^ zbC;}d)V{V326YN@K8sh&~Z_r6_$^`V2zUT(N>Q#>R^Ll;p4y`iPBE73&i z06pp-&|CVByP)-GD;ft|S3~hEX}DNd(C~%qPe#YAfwirYmeJMd+4OdLGu?+S2pK|r zV6Fd$*X@2>Hr^R!FSn$bFP5At&M1y8-d}vEq?TE0t!|&?bd@dlRPnzJPG`~~;y$8x z)O*Dz^;g~7@XJv>Vo%5alXxw8RjS-DFnykJt7%6@pUe-LMAoa!Zkc;CzMI^}p6QQL ze@p5XXN)?gzo;5YMM#a=nn8u{j=M$quCjM!q?_~1_Pc}qm~Gr+;f<7sZWA-f7i5TR zM%|%0$u7xCWRk3-e2Tn*yq0Vixg52Ve()1nI&?qq(AUAc&2z%j)7#9~#lI_1A#|3u zG6&dq>~i)vGoAh%j11Vkxo+BZ-SNxT->S4EnCF-FF5OyM-(1bo-a6WL%wEw+mc_c8 zdAIo!LlToEY{ePWO+`J;M*W?LqtTV)x+O#;%}d^yvOINM+HZ!$^q1+QjG}P?tomM= z=9xYiucr4fyht^qu!%%`x9E1^{j>{|w<(1F63W>mraIk#w$n;>CKoO6q8YCw4v|Sz z4pm6bCVj*h;yvty<-zX4R4E`%5_b!W_{!W`W`AgYppDPyNiHAk%5mOsBstSvC(72l zPkM{|UxMrCD@-GnWFwjLA!k7JefHcef9J|{{y- zvmJ+Bqun=rn?g6ZTKEMuNcE@gkBHCF$KtFBSChh0qEhdtc1*jM*2VD6FehDZ++Z|A zS0K_vnr;~j(`y<2Oj(lXi;asa&@WQgmX9U+Nlk@BzK|Qjj}i*Sy?8pIpps?#WYeJA zS4Mh?Lga_tu|mlNdsCm$8KN%PiF6Y@T8Jlz0@srHJ;?e9?-O@|+f&}hJ;M{{iw<~# zXK5K5V%u;^t}ct1W}&J9+WX5bmGySfjxTm>t6-aGJ!c^-t<8f=|0sD`*{)Vtm{9URE zdt6752)*#9c$DN6Uhxh1s{9Q2ej(&arF0YeTWh4=;tIYY`#p3ZaLgz7-gO(@-P}Vx z@xIhRrI3g2$yVg%b6tRcnlZnJrUhpBu6llR*Ds$^cGsnKb#=~klEY*sw8w4L?5V_x|}-{_E^)rd#&cj67TQQk`FR^8HE)cpz@85tR4ja!}Q zO7^5KHk?f#2Hg_Mq%zS)t!bvIa>hrP^N@@p;}OHGl$i+H; zX&zLpFYNbgcK+P_zQ240)r;Sh?z47vl)1*Zzk90(=7vr%rCby7C%#XX$?K_S>e_{$ zk6awBfR%zXu4nvT@tFy1Ldzs;^4CHRG&YC!vpY7TKX*z9N4kPnX}Po8kY$0^r)_dtIHy@Puq zPC>iLYO>$uBNc6w>8f_>pPFyF=HX8wXT+q%pG{Pz=+eF$`WiQxCTFB(uE_j1vph31 z>p)hm>;>8OEMun8s7tM%fTJGi|5jC%RYfsk0zZJ;#!cbJ2o=Ny;vn&h5HA?{a8AS4 zVan-F%zU;Ve@Y}!IU%QNQFBQ-5syC!8@UCHEu;vs!3Uu<<~&RC1$>SWE$rlJE{$u& z_FyK{&qE7ByF>XQioOX>D#( z*gf`|&c9u|%HMdJ`86Rk^OBz?Jw~U<4B2$~Sw)oU0z~Uy`e68^C~M64_}7Vi^5fJr zLs~==UF!U6r6PwF@;X8@{NXe)=@fWaeQ#4%~D$L=s*{#e?rZbz!J>WX? zyZAHwY~Ih+;@Yykp{LP-UPRYqSmqG>fbGdvXSRga21fYeJuk~vICJe!ts5-`=D*B$ z&9phqQrFVil4r44wp+K`y!JEBTV+rm`CbJ7W_I(jQVhC4*h!g84tpFcm9^B>wR82d zh+|P%u|wi(B|c3urA$jbp7z<`On+lsWGXkc$rzZ?7Ru;#kUzQfTtl_g_DT2SUPqk> z+oLH`+@o@cUN{nVf+XRQ@Q2V%NE4Joh%e-?@e}!I{u}p-Blx*|vXC!q71dINv_)Jk zWbkWQfqoRCgBOFZgQ=kdp;&q&{fYL|U+CZI|3cxRzClOeMSu%53$6@K3z`Fu{gr&3 zJ?+bzy9PMU+J;z%T0WZho4=atSdLf-YY*!yYp!jxy_$1q8S>bCg~6xHVqO$$p;YoN zl_8&~*sFA@25Dk+RG2m*B}x%3=h(q8k-pJrQb4) zOH-uYOWvKdEAec?#rWQFwPUJA_Rt4Zvt->6Ej;DUvzu5sSHk_|p9yos7vc#~gbvg} z?ikyF{mO>(UxZE4C)^%A#D7RHg>o*2oljQ?bqRU{F~LW{TcLaOP-Yl&0jg6)@Rq;O zci-34pBYFAQlTxOd!hcJMZvm({k|KXH|0@fznqnwHiyl@I9!ecj&#Qv`#O8E{gb1s zt8Muz&wsw0;4pdtyO3`pnx#h9W9{e`foi0+XaqTWVpV{6BCjqje& zC9!2v&Ez&Itx~hn&ZNCco0)bvb$QCL0AxgOm7HH3rd03!66Wxb-7l;IkB1aUi=Fxy@{-xsYSmJ z6^F8+%DWGqeM0Bbu23_W*T+DgK%KyBu)~kwn$RzpZFoouT=K8=9q}f3UwdwN&U)5) zs(E&}f0f6Uw=P@b5}co$de;(L;dT6RW(YltUc)H3e!NOB^Cq5W&oi6pe?qH5 zuR?R_iOf={&rN(Y{tHKN62sAz=&PX>p`D?Vq06CTp}CSVACKGEDAURHG{W< z3qw6=6|;a@&s1V&f(tgg234T4)h523bKI~fhzt8AL(7>S?j6hZSULSX9BH5 zW9SLYbap9sf&U@Ifnwl2>P9lu0eNHPe${q$hNi2gvu1?mf@Yrfm@YAFZ@4+)L*)D@ zbJVbCfAsa3O|Xl&D{ezvn>a`8q1c_V_hMCXad97GtHcy0Y@^>TSj z;!u!3v=y@T?ZtX=SK-P!Z_w zujyawm;BQMD*}T8PX9jtD!LhC~Ike;qjkD}kxTbPq<48KCKi4iy!sR;?PM3$_%yrF_t zj8vXf{!rFd{i8alKC5}GJ)^6pAEO_q->=UIs}_DPVgU4L95J0@wXs8D_D18VXHl-G z8qt%Z=R}W;HbkF@Vj{JXpTi}64{d?cL8YQ%;RBb#o#uY^`0k`tbL9uDiFX7qZf&ucJUnI237CYuRoIxruY zcQE%wf>W#o>WAA%PIMt|5M9X}s3{H1a{j*ocu4`yqhR2s1t6{nbngN56Hgw zoKS;*zzN(!$g^d9Z@wYtU}$(=N;gf$3%7akem3f~Z(68hr4h%4oTkJSR=(zcK0b=1>KCBw%hJ*PlDePJ*2|I(R8K zEVPr(V7GDC`PM?Zu#PVUd(`CyZ~^Wie@tjBZV*?AEyO=zPjmvzsuh2f?*#c<_x zRkXUcx>WVMs)=eYbjttJtkvnmJYh-U%fj;XJ#@>pgS6+gJ#^1?GW`}^Uu~SauEI}# zz;R+cAH{`nx466f4k1$fBryCXZaVuHvzp0<_0T^4l#nU@gbe>D*OeX5v||$39o%5y zr+7@7CG`=H@V@}h)tL88OD;-yDte$B5P=&*2jISNS%?w8iU(oj^*}S_6C*?u*yv24p1Fc|Ij?pHr4glb<|bY_0;Xxne?mm`FdI(6BZp- zDXeMO^sv0J+F=9qK5bo16IE?R8`%kR6712u2OU}v^Z`4iDN-GY6%UC`#c#r4u>3LM zwGa@DVg(ra6JeS_3FrAK{O|mAJ_9PBlfpV7TR6bi;8lD-p62gCh5kUiDy|i4iSc5l zI2qoX#RBn$I1PGhO3@>f3V#Vh1v|flH}J1vC6>nRV`JD&Oh& zb+E-Q<^vnctA$0vTA`tk0+@*r8-h}7IVjC4!7BG4x`etDe~>)2Q2tbLM47D`t~#Tt zsAko?My30q>!$ClmvlFE=X9k0ivDES!SG%Yxe>;QMd9be9_Tme+G$^@6I5Eo3+e>n z1AMNRK11njk;kMiVz#i4f5Gn)4vD=$%koaVDeU1NbBDS5d|P20Xn}I23eq5P zl(2%=^GbdMUkcU!8$fH0SRLY`yEs9dE-n(+i+4niSYH|=&6YYz#o|!$wJ=_&Ei{D) zI4GPGMhIW{M7|ey8dhyJ*#Yc$b{MN=S20ey7tMwg^c1=wqhpKMalp~L06F8iyW9-^ z58;`p!Aa;IDh7>IA5;s}X30bY@;VhO&rw`dd{I15Tvten+e%jTyQV-J)a}r})<4v* z(0A82&{xz~)f@Dp?wxL>ZlJEAuD*`Y;fBLv9BR&;;@z(F}K~E!Ym+UjDss0u)9E#3b;~e?p!(M;Z@$ ztf`=>Jpo#ye+h!BD{BW)GC}cL(Oa3IBGe`7xtc@JX|1A3(G1nln%mlTx=}h#+f+MW zQ=~ouulwqa>QAb*N}qg+tPQo798b<8=a7+PGtk@iz@Ma#&|BFBYRaRSl>|{Gb{2fR zht~=@fKms4j$h3$0*ue&Tk-<80~oUlWW;*>6Fy9c5^Vf4{y)C5@UQTPNImJWwhQm&Qqz@KH3LbW#Uoqhv=Zj*OvFWeP=0RV__rEvI>< z9-ykDELUt+=Bv8G4%JbZe?Lus_3tXL@}}~N@_=%@GDi7Gu~^Yi@l8HZen}Rjx==;r zGtx}5%X zATV1~ehts?ogq86hR@#fZ+TMaC~O8snJ2^wyZMfM7T=lQ#Q)-1{t;xBeNdZyWQ*B4 z+(FL8Ik{6@S5C`CalNtR9U}tkJ_yQqepRw4;KvLCox)biPwQ)6F}Sl6Q4pxB7rCd zJ?RJ3iHIh@lEbJuR0HZ0d5H{=yQvwnZ221ba(OLzk?b+7hqud96blt&6)MFJc~|)y zxktWD5u?mfeo)j=T$Zntf0vI{6f4T$niKM;pcLe(ak8p%4!R^Q6j$VO`65{j8K?zi zCfOIN6Lp46A%74Th~va?!U5Xefp|Zh1n4DQkzzq1KUzu_k3v`EI`oI90ULY;?>6VF za|$*UD#>SbTgJi6V?VI@>`itE%RrUfj%my+Wir_$E*7rF{4D+tZYdiEJUN#$3Y0Vq zRK+Ji#s69CAm+ht*+X1|=ucWmAGwK)B6kzH#10~sJWmdwoK#QQB3Vya3Dut}C7+O5 z>KHXlW|gVsS7cr)iJC+Vr6S7fm}j1C+kDx^W;vdBE(P~`1CmW zjA%qOB)$QgKcP5eZ2i5=v9YO-voYzb9|{ESLqbR5KB4$+%X5o6Id z{9WoU$)tQ(J->py7zOxf1N<=*x+nV}gD9aooFU|hvqYJgDA1gdbFjm?{`??83HW&o zk+A|SHjyvqSArUCIP{e!iKE3~;y6&Jt`M(@Nzw_aA86^h5+K$BmGxd?0?`Cc1iS>kJOSCHA#sTKn>a<(C+?yya89Bz zXpaj(q3Q>{vJ8P<98|Z}ET5zo(lm*X4vF)`9U?C-l}e>>ICC;X zDiP;{jrNJvrGKSfaK2*;=>HLZBi#oTcWcmjr-Od~2Ap)b4BRjQbknUs4Y>}Kz=((? z;t4A{25RM6s2&=MP9YbHAp+<$ssxq6TsWVx9!|z&!Wo5eU>z3p)ZK6noD=E}s`_Wx z0SfZ>_yA~{HTVaNCLZ|UC9LAAz{vnRX!IxJwzw;t@Aw3Y=f&ta+{=uksV9cy)$?2%sWr__HEk0H2~<{;;+^t$4`ql0{|fTSkzQLnGXOA%wYJCX+sLL z0mzr?f*GJE(0~F7lj1-+K*1;JymVALEM1gdN`w@YDy7HLeF*{GzzQ%1Gz7U|I(Pwi z@DXeU-N6KK0U(ePDwW@D1SfzKBtV^@zEE>0Nj_#mFQKo{d`JtG12fbHN`tXeD$MS_ajJ3{V7=CI9^io`CoA-3efU zGNC$9YiKT11ZBYKa2y;3*N1c9Kj1O&a<~C}7HSXu0i{EskO*o)E}#WHrOi?fsE`yA zDvv2wY#*qGn|!Ot6MW~4m&WI9rz<~g$qb);ho4PbhH9d&~Pa@0}yxt zYzKhv$~xFi{5T<=*9On9ySY(fbubsif>po|T|s7}R&+jc2uVUeBg^29(4P}a9iTo40iD27FcCBZsbC<;1NEWn&_}2xR2__xo=YWQBD4TJ z6qCiCQUmBRG!Mi}lO-LL3qOJGfwAC=e8m+hPvpcOvdu4wYlM$NCuyL3uSL?o(kJi% z`VMu2nn4zrffJDpa5Ov({u}v;Y(W^9g0~_O=s9Eu905OrZRi&CKC%=}hMn+dmzb45hV5+$)Ym3ajEQnxMcGt(AKe3(*5eb0idb z0oR5*LrI{f^i6yz4i+Z~NB9YRW4=CjmK_kd>Mvl%)8EN8gaZH1E4pk|i=3;SL!2)h zVr4;Py7P@|vnRqm*O6S=&()1s!SrGlGN-va=n4HjONQ-ITwdCM>O-=kGFoLur!+D3aMr)IFXRk}um$Qk0Ew%V zdW=r^*6YRXFV%b}z+qruhWZle<*3S9J-Rq*et4-Vs6D6g=zbYaXd;Alo@b>+rH32} zXISy?FWK+cd`5onuf!dy^1UU~DwMuXOnji2zD262P4poq-meOzug1h>B~RC?<|fcBXbuf1UZM23o6D_TuRKXh&vXaHION;f>g^eDN3c zuc5deS&w?zNc<4>4t{50BhO&dquZTRmuPDvsKh8FL3U0cXM!s`@ea= zHT!+9GS{`r@uu{6Nkv7z=N!?3#4*g<)|W>7!`uzN7L?K_@u0{{<;Z)DWD2!b59=OQ zVVfO0Ds@=qiOk9AgVPqIkI%GbwaVC*oECXn-xKO9i~xB^3iwFnJ3f@%b9D)vg4)94 z`S<=*&Z=B(`5G2&>7yP5yP$CNDxwq1s2T2Ol@lvom47XLTGXfTMnTB$E5*;s8dMH) z>~b`BYF*7dOTF8?7rZF;5Alua$F%mJ2~6ecO0jSyd>qb4tLqkp_OdsL+7~?}VPm>4 zC%*QET17QC=csDb%i3G*NBkn&TK!yD$9G{r`=3$IePOQ0&KjO~WS!t zqyaOHG4k5as*{Q%$Wfr=?aV!&$Jx6aDf#xhUtxLy`Lp%U%wIXbyOkcQFgZ>*npJ)9 zv?2=ViT-u|fBiYEgX=DaNk_z=;s88w6FV|Z_L|b0;4>%`?a4bgxC#im4^$ z@7B%_{kLWGvI*Ym1?ABk#3ElmhqkblIF7F zHZ)k=#cd4Cr{a9qo!830m2N3rRrot)v~qc=9TBgG#09(DT_n(lsQZa@%(CvKA4{)S?5rB*S?CqLi?NMlrr#Vq!mZ%n3ZdX6ydK@A zz?J7U8w^Iv>d+Hmvm%(d%ZbglbWsgK!eE#17v0(Y zu#$2F-8QTh1&{>3;rm=OLtVZtqQmrdtl!I{1Mg9zdCRw(3lP7oWeeE3no!URjBit z#)ozYe;3gu`f$RGwDH-hn#nnnv*%~8uQ5FPTADxZxb36`HY`<@f=R(LdMMeO$RrFT zOh5CV4UQD*f)Pl8a=qq~)~@}bey{qVe1%ql``lJ0l}Pa3aQez-6b&fY_w&XNU;g0y zL;2x9#}z#O{ie9QbWerP*~sJfH6a#IG5*i2mX8x!3*&@a;xK3q`b(Lmj?%Q(PSU?L z&9$zxpNJVBKR#)4+V|{cweoT`+0WBHrA$rUlh7w>bVwu3WvClJGti#yOziR9_q6up zc-vtbQp0Qs%nUZ>pNXyEX^KK+j`AeB8u@bmAZ#luT2<-aQejvQAv&r+WgKOxWELv{yOUC>F-pyrCt>g&2^hAyUnIW9CJ zoU(t3$&0U<*f8mzl*4I;%tsl?X+rYwM0?zRd!3M6T`T1`m=k}qAE`WiFg};qPS&Gz zG|60Mhx7l4wZSA9RvcAMP<};+A$MR3Iwl?Ea{VXBAXdx!r7E^Es!Un3r>O03sh~zd zYQg=2jfLZXA1mrxGNdfNqNEb4YVV1|^QcMwIqVlsC&eH^WtMii{$JxO^WBhH)`IY* zkso5q5(XzVNx7A-%yHIQn)|YPw~U|ZZ_=(NdTcigoz?S{HIX#_0a@&Q?{#1&@Y&cc z-&TAE-HJWUbr9A{-QkYt8uU4`1bKw8@GprD9%90%lf+c)j(de;Zn>uHaB0)hUnQ?f znwEmHCuJq&rz(q_s`dy~EA!Pp1aeaDN6gz_P!F(tQ(LrdC} zG%A^2l3yBA(Zf;Z z@6dc()0oojQ+?VMjVG?{NxIwv(vTp4>He6FFLDj!Wi5UD(nN5&Id$eZ*& z<_|{4)bVd;`|>lz$I@`HSI#)SU@Ei}vVcqcqChgel-xtG*ip|OXHLbgvVLW2%VNv^ zDBWN3wZvaKwft=bFK0uys{VC<^Ws=BaZP?kZD0W_1xem0q0mY=9&Movs^9B!j9*Lz zW=qIHtJ&T-_D4cak}6q9Ez9gvqjUD~^hL=v5}PK}i@k2!Z|belDF>lnpc8_D)iJ~A zznO`Czdt%KB2X4M&wdZi;RC`{@whNS&I3>I48NaS5TK~-#9e$0UJEtnp3j1Ss&9@Bz=kg5I!knlCeyE209UJ z#gtRms0HL}Y=(ED_ao*ZwM?eJWk4nSQ@r?I`WyNOUJ7@E7D#16qHu`s#~lyUr_T@- zcqGvUAM0IH^|*3Ggt5@lE&P1+>7+eri_`IH$E)qgaAx1l>5)yP zNr|6g4%&lZqNSUDDjMWo)4NERqRBP*ThA-kFi!zKgt;DQ!Nvy_!VIXlqND1fDo@p1 zy-@vKMJp~K%b|JFSH3&DjJ{0t!_Q(CpWn6FalWEsWwvuc6Xj2rk`HtiR&jWWy59vDPm{-x<(Z+L?2x0R5 z+F-0W2&tnUsAKfc4MUCp83!26hH~vkl^HFN-f+DGO=v*u^zL=#JF}cm9gQ8n%HOw-eR^kC5YIV>v#K z@aOw;0_s3de-+)5T16P~X}*6w+g%r&-5fhA`&W*yd|uhn5$2p$1$ho&yQsK8YfdXc z=ta$D;|PqHTErj(@J&DfcioBT7rPaGd@w0$=wt0NVg5i=-Z zyHlHq_0$cylAK8WAa^j=xePD}HX+^6aMfgOss4?DHv|p)4DtG%8cF#XT?2m;mBG98 z5V9w69lPauT(#cWyXvH?lY6VXji=oE9@|9#N>9J1Yci9ViA)SLm~KwJBQVVE)p<_1 z=2ay)Z&&73{9Dnha-#pJ{-NZg*< zL*AABDI1g4Ce2Hpoir$pu=fqyZOJwWDi5+5J_x5lorF{DF1DILfDO=MsjfH+Oj3N- zBAR*v$V27#kjK9CF+u)CDTebmu)NWQ8~Tp zmA4M5^{))h5l11%)qM@9CDdxNowp}PU5^?b^CO|O+Q!UI8P?P%NzYThr*Fxem|mFt zA+B%aAJ$5vQ@24|q$-6D1^;C7nfvVf;NOAo)Nk@JGoOPbHMk|^g2nK^3Z43ZI!rxX zrBm6JnP?GIChx(*oOLiAOEeiae`1{)LUd2dRcqQj7ba%v-P;J?+Vhm4pK+4P5DK!3YiI=0^y*mIGj5j zu=uai`^YKyX>1YRjktkt!Y*QOh--AdzaY?ry}_;x{@_Huy)cM(2M@6^fyHz&e#Cpz z-P85X@un=ic;WAuqS)g6q7}cv?@vW9%IwZ8cL(onY#BA0Z6~gW897hAs_S9O3k}+y zMZStcqYp=SjqQ@qBIS5mtMsX`UI1_9J~Zkogpj{B<#s=fq8i56V3)6>;!d`f0xV5h3juz$j zOFYF>N))BnN{Hgfk~U>Fhv+)&?S*|LQvAR8YtTRFemNr>qzjmShcph=hF-9)iZDhu ziJq_H05l{@bp{N`&JJm{~3{M<}K~*aZz6L4e2piKrI&6qh;cs z_>g z4ZZF0NyHc5Syz>Fr27HZPmT<$eG%SUJ|A(8YDAv(iEh+W;4Sy{^SY|cj?|RXXQ;0< z=5G)z;@0u=cnv>=yB9pn-t((y8!^NuxyM&6seD`Zz2t3icJb|^y+tF6YnEOvU*;I= z`qw+1c)|4L9!M7vPFbia(T_IASwn0aBmS};HliL;L1a)D=snCP zCWP_Pvlt(4M9&T6 zaj(TS&~Zz2P$rt6A@G7})!rjP9 zYgQ;^Js8qb{}34^Yo?#1OX7R>3DuoEOpgrA35;U&^e#ppoXbDu`|(SKMqn7+A8rb% zp=NTFcnFy!tMHbO7jpUQEG6$JZRp$dLb?@og{V*TBM~}}7O6yPHC0M~V7fC&^jNAk zRX~0u#^VTf)jQOa=GM7NoaY@Sl}{?`IF37%PTYCWRpd#USF{6W4p&&f}iMjxkB{jdE2rWVu6|Bhw2EPf>y&CeD;0VOm?>Mts!rr@bG zT!6S1!A(JBFf5SEoRVYpAf^|sr1Ho-ik9=13v@B{m|92oVj42_=o(ZdSwiNL+i|6A zr)b}3?@#wg*Y~P4*Amx6S5MbNm%{VRdl2hOq*GlPN8kxJPmG54A#LSK=!h=Yc*y)S z+fm$EjOb_2vzsHIM*fa!7~Ls~vxi5ni8>u6*s3h3(P6w}IcrvGr^5X~Lo`k;DNc#^ z0~1(MJPA(#XM!{Quh?JW66le1oA1iEmiE9i5ER}gkLwWh8p6OM>4A7e(DAE-yI3Z0 z(|>`^C##c_$tL7S{G;!acZTl~7LBX0-QG*y8Q3J^0uh7X^3}mQ61U|{zcp^ewqV8h zLgE>|6VqbHv0r!v(U+V}7LujZPG)7GX>bYm5C2Ap1a;+#=#}b`I!k*&|JHOmE96z=!ppH9a?bC<5PTsPf=$M@;4_GIL|vjfafYyxFu8=F@r`&hyb4>5IegW9 zyS?kZU%gSja9@3&4x54N$oAAMTIWw^XK>>LpEw1qgS#sltA}fM=?3T@7zoo}As<82 ztUBv_>$$MI;cWQ!@E75nt%JR{JtZRBHrl3-h_IQgSIudrnWlxN&W0A6dy2(qjG~WX zE|LHy3K_z7alJHB6uAY#C{E)47H5e8!6{4-+es<1PfmfNARTBeZIF%t2s$7E!N3VY zJ0HRCWUtV%?^rjIwQFy1xW zL(f_Fhk3*6*r!IVi=Gr+8NDsGdwfXzr-!VzvN*GyO~&6m5NrJ_-)0aVaf@SoU1@bPIv zQ{Kal^p9gcGp`soMd1LehFS63*fy`#-On|`ecsd7v)BbyjjKv?PxP2QtgFb?)noBp z^7Zod@b$r-;p2%B!~-IhDx^QkcPVBP1EYi6`F+A0IRY#P-H@e<4$51~IJHZAzz||; zX*z4_VJQlAge?uP9zG_#YeZJmv*?>q5%!z54EyA$oT$FGqL6kLP3T7J^^og^VVZgB zuG$v5`)U(<4zQpRLLpNjRLtiui4O1^*d&keQXC0Lxr5kR8YWpm6R=5Eq^)9!utGS; zci_rcM_^LmxBn3%Qme@;#3I6jU&pHZlDywNF3(ZV7k7zknak@s;jVDcb0@mbxhp+R zZ=rXE_qVq>whxaZIJ`5lj!dRIGq+^r?4)1IB3!JnPwXrCq^Xb@eWR3BK=mKsX*PFwSorPmpAmZ_Cr6I77e>^vdm~ob3d3rI{j~lUTGR5zc-64X z@SlF1c7^J&qPe24ViszH|C1=u0J7ySXD1QoDIpiwpa)WgkS`pT!l89wtN6F@Loi99 zQhR|2o?}0-mY|uv#EhlJkQ2yE@*uv?*Vp@(cZXN){p9wzAol|I0e5ZpZ0ngD$j1`Exl+2E4cfcuaA$kmZd;FoZio5in`_CUA5 zO!2%>O%eePZiuz{y4*bu=H~>5`tztV(n$3s-PjQCFi)vR?Y-qTxlUG{c5QdBbX(oC z-77q!=rg4i>Kf z0;+-%-a*%qddX)OLX0JYA9ANrlTw&6LT(C|G`(XWOT^W8RqN9CW#5voa5$o-R z_G1yDwt3-1IBM$_mK(Cd^wyYb8g7i!rKn&<2gM@AY{Vt)72XN2#02pccb|R7MsX{+ zw!zbZ(XwLNk_+L+vvmT&!24i(E}QMc?4mpQ4+kWsADN1$5G|=>st(@A+tB-$?2XN_ z)t)}?2cCDnSZtt|aPyv1SZ`uIo`~JS=8{+GzVsFHDp^dI`=`hi(j5Ar|2zAG?G{i5 z5@pp>EA|m$1gH2BI*jZ?CL*Qib5)e~gm$rZk*q7P&+q>EmBYKAySo>M0Tb-d^i``VE@2fwmf23QcZjQc&cEJPC-bkgm zIyfQdlk>AuK?;;HtJ#A>8_^r=?{DvK8a&BA)Fx^S*IDp{%9t&5*kVi|`G;z8wYK5JTwT&`Z`<;h)3%g|lJz!rMov>`(*~_St$OEYW7P zt+GzEOfmnov<#&!jg6xAl6IILHLTK(Q+`4+(VYsj!VC2fY5uM-PwXUI59S9}1S$f( z0w0(j^kZs2Wv4R9M?^hxFX-jeRBTB*6XN&c31e6vB?%eTClR zSS>lz>nnFnzGKVfJYlvRpYwDj3BN6>5t|#R<}Rup4>| zd7%VZ8+f98rEI0Vt$eC3({9rhYKLl<=?V;jX`T6psgEhe93OHy^j_$}5G159q_y>c zbzx{+$P-I)h$$r7(!$J`JfMN@I%AtxF6h#`qv!T=A zw6sZ_EcD|0b1Q;Z*mZ#trUBiK%BHMTE;%1h#|mWybR4$Gm*(x`IpNvoZQu)d8+n7C zOJ3afR917JVh!gnZOBQ)2K+u&|2;J^B+}M^^dnGF$!rz<{8M zOXt>cANgfso|GUnKrmDj?j=ia)6oxTM}<>yOgUbasy?emG`%(D@_w^RC+QyRrs`hk zO7#^6#?Zxp8crD=8#|j?nHrkznI@XQn9I#>bFyWj<(Y-I{Io2$w6XkY8DhcBYI8l) z2V*Cr+R##0ris(!sQW9E(G~DrC?DiV)rD_dXYO%uG&|3aFyrV{I)q9l#$rnB9QFy@ z?UOuTJ^g+6u@=}`?|V;UUkKg>zwBG*?dnUG>tr<^l+}PYxQ8evo)I(1FVs^yL5@gQ z{U-Jj`-N>CoX+j%Kk#$;v%FHaXCl}uWy(C%2M9*q%F0#)_ztp8k)yn%7^di{Oi+)} z%+u7>T-NAyo#dFhTz^f!+|b6j%DCKk#OO4Z7*7~a8Z%61OiN8?WZO9ny^N=g`;489 zxZ$Ru!0?xGmhrs7rvI+Js8#6}X?LrKC^HonMJc)&sS6>}ec>O0lIzQkYzO~gM&obh z4`G62ccQku?^h>DT=aeQPVq(JW}*eY+n3_2!g9&yWDaow>xB0uhf+=CigG=kK#rj5 zQLE(t*yxtb6DG#*^j8F)vWtQTWd(1$oR@SF$4K|Ud}s^wFVqcghp5q(XlHaT3M)=3 zP^D9`S+P%%seGioqim~8QNC6lQdO!>sLreUsk1cOHQVGa{Wxufmef{hGjwNkPjy># z?Q}DBH+1K89d(%YyY`-Twzi(Ok+!WC(+twI*WB0GwS6=tD!m-*4yh(74QMSmN$zR( zfc2n4*eN^~>q(P^hr!OQlRX!_$l}aZYA!XA-bTAgAKn~C{%1R44z7_qbRPUGz8T+x zYlu+d06q_IPW&T}G>s&Q#?)WTQh$#BB_sI<1VyfttI1vGHVIkM2dpua-_1I@|kkB>XvGvDn`{# zRjTTv9;U9V9;|k%M`=cBP|b5S(EOuWu1VD#mb1$>>b2?`>UXM#s%NV0DvJtJc2#Xt zy-^NUOh#{`af+sBQ+OSS1KDyGJV|)OF~Rl053GW{7Pu1_8F=V_?*AGnWH+!)0^9vN z0vKD&CIq%Kml<>5Qs99BE;(AUU4k&K|3K0XeD(AFQE!(IhZMxNev+fv=3?`Gk$yF-pE1ZJJJNr zLwQ*Xou?obxk^#-P*JFusVrAMRwgK)DJ*jA{-$i9oTTWaxUN8y^A$(YM6?^a2OWVv zK?WgXkpsvoBnJ5je}tdF<6)0{_oL842!*-=J!mPDipgMx6ei7<{L)?NsfdbE;sJ4- zI9%w=cj9Tjjc}Mh%Z=b%+(^DXU&&Q*ZRMIhk4xj)aZZlos&Vy$OM^i!S195Safw_{ zUMG$b4Z;aI-|Qu<63yMg^1EdpTLX#DP6#LNgNMGbGl7WVyU6GkG zdDsWO0`Gy9@FHk5bQLO-ceh~>4bFkZGNC#Vuu@HFlGs_CD?iyO;Q>FLFXIOYxxz+1 zjPK1C@vQ}|aGamUzvMdzyM_5eM`5zS2}{K5;yQ7$_(HC3FG)Y8k5ZoWSqcL)!Di3~ zJd?>tNMK%1cfP^3(Io{>q{?J}|17#ac%mq}Iy#DH*_ zU5$kV;E}n`dQdd<6zrDSP6MQYcF6SWW)LN>f*4r?sSDkcc}pc+3Gq-1cr4siW?Fej z4clNZbQYQ{6R``R{!joMleyV#;4g4rsx4`xILR-L7C#AxkZ2`NGW zzms1jN79e{Eq*OOj$h4RlVj^M{uS@$?Lr-)tuS2JFWeE{%hw@dU9p4MSDYbU5Q{}f zp1m!ycQgf~Wa753%-EV>HQW(?3@0HRyh`?|JUAPPkS*06-VJ9V3y~&Bo=j;n@NlG? z9H~3Qxo|JIi%gdsfM!FpWR;+|JR57Fz4Cc?XasZ`%9FX?XsAlwsUzf(uaQ|;Bgg?Q zKqPoAZI!l5XQXvfONkXfiVtLqv=D7#s9X#9h3mp*;i6C`E44dhg0#PEyW8?7O=X>; zmvBIygSo;GVUt|!zLnfa8mdCq7j&HM}uJTp=WZR8_+CetRBI_mfpbW?d{sRZW zRhgR}1t{5$;$S%j23UCW-kw-O2KDvM!a{sBFOn3i}8P@|lXe4JZ zE# zwjx9%5?2w%6)q5k>xdoSWV|?+IWPU?f4_Oo%A67%u6J?9LrEA3B#C4^`9R`mGL5E@ zG=c`vyEx-Tg2@P?r9EjF9Z&A@0o;#oU>V9VWwo-1edaevZ?cR1E?eALZoRxnxyoAd z1U{NgR36Hg*T(43k^S zzso!2Ve$jX?C#`l?mp*kCta6xa;jV;4UvMRJ<>|~w!BI@=NjmI;ppqQW?yL^>F{yw zac`FVEE*S^*r*T41h^}X-EA#h)iwM=fv{Lo%ui^2~?&WNrX z-7s=R`1-J4%kBzn>65E#qiITZ+IkoMk@u}Q$e!;`kY_1xNRik?WfrE0XEew3n{?jd zeksxRv+;1zg?v};!rXsy_vB8>NzM+<*5`@^3yM-omKgpu>P=~eWhK6bvnD^=4aXhV zR;jDtzqM#X7R&d|FrBEN<8C^IulhRd#WJL;JHZh8*H;m0))jXD#PL#{+8z zBP$LwKC||7I-EBhbM1nylbIN#;%cVH_TKIQm%mkKxKXsM_=NGCwUsm7mF#lan_1hM z7ME-&K5dv{IcOVX-D?_e^flME{pEZjtz<*UVVW*Ps#dF#)Pr@h-{KG&)+4lfSnsHy zxX-bhV^YdxCq*XiDQgtZItJVOxYj!hEPG95Z8P2F<$JC|=UDbgS1)i!kgs39?oZ8r z)gwOGInd&5-QqAhf-Jujw=HU7%(JexC)-ckw>te?4{Vi;yNe9P>&yxEb+!+t!zE2h zE*li1U|wj=bgq@3$kA@2Bf~jYeoA(zZfco+s`q@~H-UeK#l>z+2ukXi7!m(>Y}eS_ zat)JOC#{Sd7cP|9;Imv@<2-2WV9d4+k+#TM>7)C#QbG7zeN0!|$L+r>ko%q19iV^7 zHQgbu>yFJfv$>jaR`I#Q+l6&XvQ357)3(9ZTIS=%A;$Wq8Rqqt0oJ$HE!H-cWYY{o zC&LS4l4Z5+S4W!TiQQ?fXbrSovs)Z?XNdF@Gn382OVtAX#(-9#T_btq$cQdsO~al? z=9GI`eoFF`#0znW(aS^E`KswH`&RQ~OCq?gX?k5~&L3J*;@Co4Yp8lR9ZwTAJ$&Z) zMR=W{I=9Q#*~(0ni}&Ruq`&rp z%=s%fvM}9{X?|c{Z<=bJWFIRBikI}g{qF~*1}_g$gt+SJq6|;y|RvF4oTnhb@Z2vFPUE|eAcCHPuu?Wc4n>YTUoj3d()TvXj2ecqADpW zG!e3d>hy*PbpMxBh`(jR_rnSLi@VAl8_HL}O# z49=E!fpdx+`yCUcxg?u~#kMj(&3jP6z)N{v*13TyD8%2`kI@Nd3J^ zQuP;<~VmbAGmtR z7nz;ym#4VeI*!__+pAdvjS+=)a#v=r$=;IP;m5xj{k|{wHuZaKMoeav%;y;y8Pziv zW;!x^{CJf!JpXk;<-)2(rwl>1H?CRIU+$IeKz2~o*Q>A3Jnuie@A>rz?i5}*>V5Q^ z*t79+QkxWgrBRhXR|=^(H>E;_#z}o+>x3;UlUOD-_*vjuuQI}Ar4}DA9#m(EOZYNr zk!!wdr~AERk_ugyZPiRV!wln4OL^-b#@+=lvS()(%8yez<}Vi z;J~tm@TalU5^I(}S-w>TM{1KwEH$k{xe601lu!N^-#&UoxIV0M=$_!J0Xg37^hT|( z=9=KgZSrfmP;M(Jj!rgen{D6hxNU!GO|g7754VKE|Atsjn?CS#(aqi3U3VW#Fo&=;4Xn_ z{)_zc{7wFQ{l-O@z)yt0CK zqKU#ax)G~(2;Cw!)Ev+zXt$`hs9LMnX??u;KX| z*HB#(ue;v8ym#q8YrARhX)o*Q=mmXQ-8M~k^$1nG%18B4>@Ln0M$_J83!lQ@^2)@? zf3UsEd%25phS_-xA$+S6q2w#acvt$f5Gedh+^h`CV+Ev{(37raHfg#PqKLdL-=G9a zyIrztwscSaE^FmL>AAa-q?Xg=g~})8t0J&9>>3I~N$o@(=k}WsUNOGEkYO+)za3&j`x`_l3%P#TW3kd>_BXzwp=mBY)06@Lc3|IuZn(N0SuNf(#@}$Z7JD6d@t3 zLi^AabT8dT_s|pc9d%KO{-8JM1$qg`D%yfN$X&9N%mn9dzMD7ac6JRjj%5v*Rk@-p z2Zw(u%akMdd|SDt{D)kvG2;3zc9h*``K%_N!_V_HUWm-H3h6`El1t<k0i8_{lb2>qRQqOmle+y^~xNFMn}&XIAX z18GWHk|rdAGF+Jw!8T8KJo_R#+~a6rKp_f=!TxATdOY63dE_VvJZpEH9?uRaLAZ))gD$Xf1ZY z@w3=j>?IBpCx{EgCE`4BnmAsZD9#pV;L|X1px909C^i+F;8j-)6-~l(;f`=sxG9_y zP6-Qz-a@qCBS=&w7-<^)8yYxF4}hATbS0fahe0>pXj^2wy|9vxgEYqA+$4NnL)X(| zxauI?LC@3c^cnp~(`hdKPBUo{bm${^!@r`0NcS#MK}Ij>73?jF z$$89wmz=`b$t0HU7RsuQi?L*$yQ@9G(O8+Q{>y8bK03+dqXiR=# zCzQkN5xFdM5eEp1NEWNjj<8dFANfj#As#JYVQdg<&g;U;w~$kO23w(YRGumq*+%}A zZ{^?FPb^yrWV4u!#c;y+vo&Xi8CuHnTzVJIdpI0Y~p_`k~$pBKD)Pyc-Le{VO zpS&9P;nBPfe53|v>?~`E$kdcQW$ke1qx=EC#OL9fC?3S`v#x9)d&jD>g>KP0wYYzQ zt1#cV!(LTNU@LesWImNv7CH-0Xe-(tHmnw3iCWcbFDcR56i!YF zn}pr;C03InQcP>9W@wLi{pvHyC)C@dyR6x#KBdXfozyqb))jupo1AXz71LeA1LG@e zU-uqXn>bl(+3M=#+U2&$6?j+dlNT^94^cjl`kGx{>%CL-W7V~Uc4Qtu$0s4G{>)Fw z9o>svZ{78k)%+N-@(d+YnkLm&1ae$hr+Tg4t@*0CqPeIsX@1dG(hks+RX;^UY9TgP z)l?5uPf=8^4^nEnhS<(qosQ|sN@1{ixB9Bs zopvK>w3d2;u0-ENpRGwzO-4*Or|PY_tQo0^(2Q35iTC*pWe&1UYwCcih;l(G32@$LY z`H8F~dYU4v6RW8zi#pny>v=hHk?O@p;&kf8wz&_uj8Zu=OZ*{*)6KHMxxkq#wWcG~ zcJ)2snPPXHbd6V-utk%l_7?^+KV>`eiqZT!sgKp=9o@~FDJzhbxa8kSEwR6luMBqm z=e#2?r)$M>!ZqHW-BHrzeCZeY8Cy?ZQHhO_2Dm55v$+c^-W@hm@lwht?-Vn80uuz6? za=&y=l%Dbs;Vp?}b>wVm5-K-Y%)p=VO^h-T^87*uabNa@eIr}xd7df%kWMKR$bPz& zJV7K3=ihiBk5&@pDT+UKhif%xBg40pt;rIOS*9ZWhE( zpenVIuV+tTMcw#Pa+N&eci8XjHCxInA-jmCmrx}NW9Lyvnnt!`&9d>0tQNb;4)A*9 zcQP8;$Wd-$E7(q^f(?yFOs&Pgz(mv|&mll{oF z<{^)G&ad$&+{#P%Cf=W*+=PpR0F`v(8@o;{cO~VY?tP8)& zA0w(0rdDDUFGhGgKg%Yut?UDPj0{%G5Aq!TkoSSlRY9ybAe(y1nsE*3Pm;+}UK7#p z4L9)&o`rhcS$>7RQSK?r*sqwUA}?Ss*)2r&2h0a^)C6S%!C_ghu$jCf8BCI}7Q83z z=rr<$JyWW%pAbhA`BJtJJaz@gaeOxWPkE_qVpI4u{*@hK19%s#F)3KLH=?3w? z9D3@FWswIYk?P0|s*~$jlhk}aUrx$XN{5km(E4+%a2>#RHykZcv&`dV$Qja=PN$WS zn}#A+G-2#3ZsC2Ae+)MR$ z{s^+bJ!BKs$sJfh=aT)%EdL|Eq&D*0B|MO5L9>fLB-7{!)C6|I&J5%ScsY+ztB}ja zARnquuVDOL#JlB~Lrc0K|EWXth=Bbdn@XsHs_9fZ8g)^E8fh0?A4pSZUwrxjN+!WW zhSKBo9Nhrgh9S!xjQqQz&;xnlFZ3Iv6-~Dzqx(rHK}Jle72l^LH&3Id=+C&rZIVV* zG>O*09jDRZ$eV(ZHI1fQks~fc=Gc^0M)q`yexvv4Z&XFUBTG6;%VD)Gq!VarX`Us6 zvnhytCuk+XS6D>LqKf+~?v_H|Lq?B~={+PT@bbmoIv_)@k4(Ke#s*PeS_Zkho#YcE zLCFamO2iAJwa|*4RE2bgms0Q(GPh(Jiu!P4aDSEbLKGWA=8>V$&mibC6Bc?{_m?{|I}8P|UPj^|+)WPtw!V1-HJdU(NKhyrEEN9>R8@*~K74r0_Pc)~V}=*4At zZw0=Sr^Eh^^9iux1l;=ruMb;O;T~bIC@uM$FXzknUhK3)WVC7UmSmoS>&EfX$l4mg z@B8tw{1?RMo-71AHE;Yf5xJKe9(sjkuvYvszt3mD)=nV~-A9JkkFVyV5IuIWIqU#( zuRI(SQQ#NeiYLLxy28VM=Z~=eJgvl`3Urvi!ftO0pN_lqPNA~q}|b+H5b0#6OYZs{_-DU)m^uVGIv#HV7mm;Xxs zKrER=0_jHVaNE!uh*mD%iTKk6bR;!kPii1l;7N5ceg$@3J27Jfym&WuBt>|2hQ_yJ z4S0c!qZT}=54nT5u0~9}hkaW$8b#;Qv$Qom4!=Hx*wTpHhV?yz-BlnRfp=6QnOHZB zh{7qTCvezpqtcyF3$mA7#+aI4^*tgT^-QEYaWI8_zJu4O^8V2G2XLd zSd55%8rkk*NTwt9VsCL>9L8M2nRcW**^cN|&bMH_ z*v=ymHy^^2Pr(E3!P7ePmh7E!nT138zmOI1;v~?$8Iidy=GzJGSHe4n^PAkx9q{kb z;9?w~%g94{sJ_3=rF>{dqG}@ zuyd&a4~|C!Zi-6H3)G<;s6E``BVoHQcr$3s8*7D=_eAub0GYLgg^+7x16Hj&@ZMq`j$PL-tnUB7@1|pH z0LDgx8ZEht2yz*#^k;ZyFuZL$pGqRI{=}0)Rt>ePom`}k=q~!4nD`;k+8^@rMKs-w zE8gJF(?}h}@j0lFoP#wTgOyuwk3)!O-;sM<=FvFIVSRc;_`m5LtcYXaHI)&|mt!y5 z4l7Y-#H;r3lR!EM>w^FvTSV>vtJ^@I(5t8&yrLn3412Fm7V%xY3TD0n&ZYxdn+)qo z!m2S=m?jWm0alV-G(or~s6?aiv#^E6VI{E9Q-V%RL#3fJeT6;yTe?(uBb*hk2uv6( zHWUX7F|-N1m(YcnKM*n;D2U=_;R32Xe#j$YfZu(@9->%!@2Fyvt($B=tUp;IEq!eR zoTpr(`<%3c2cY88k4%KjT|mKBtJ{k^g~qBBO+(FE;A=;Pc=5Z?n@-`o5ef3hRWclMB!MXlwgkSlCJ?K2Ej11dxas40*lXyy_kTpGK|p0i9u#9v`g zTJi+>Tq^9VEj=zY6w`$cLPyj{9$+ufNYz)>L6s}Iai*h?A=DRd2p>_QSVMKfYdW1= zWv`WC>_swR9}Uo^dEXq zXd-S9BUG|#lX{|>;o4*BP|XarRXi%J5~_>C#V*1s(u+61$})kik*~SGxc0gVoT(1Q zy3tbG5@H!+Ze_Y|EN^;fs$i;OXi#h@>RNKlaMR!{>2CPfRM$4!amW$tDCe9k&F3|R zW?~K1CrzQ(LBG2Jd4ZqHGzw)A!=fw4OpSRK8x`Lu@nfPYF*Ckhyt!Oa+^v}UQTFf; zp*w@W`uFmhrM^PTvOBJ)){(~e;?)Jl+@9HIvwq1so3$ouRc7CePwAsG+GeI_KFu7K zX~-CsaWMVZcjq_Tw{71?rhiHg$mo!9Hba}aCi899iky)Jn@gISJKNeiuSzN8nR>a; zyfSCQ6Juz(!gzDyg5*C_Q!7VSty-;LwKY{ASGH7aQSnm64izJlx5Xp}@9^HG30J+M zN7ys>MtgwyVDW{5y9I^CE6tJiI*x|+kJfS4A+|P-A+CwiE&00q)&0%kwobJ8Te#U~ zI%k+))Fb~*PT%a^KU)0A&+3;oHB$xTq}R85-^}T8KN{y=&i}KpMsa<^E7MnNCuf@U zg^fq0sy=_nl1Q+)L^D_aoA*$kcRv66ssh|)euO=Yj*I`0w5!6Clm;p9lV_CAOFUTa zQDi{yK%Z32YMQTHbKiAnY>UkQ7^fQbW}U68^Od`?oTLP?e*7?5N5h4lLLcD}eaw%_ zADr!Nv(3|u$4U+q{ZX(YuS@Q^obEZkIYQ2&oQ}DMTx0IJ+*i42dHW026eX5SFnlro z4ixZ+wX?03y}o0WW0C!vHNfg^8}4wp!sP%cvqm7Hqzgpkec00Dao=P{_QSrIg z&Y;4u`BCbaMzL4QiRBY24zGHy`sEr=Yu>9>x2B`gHojRI@>e%1F^$C7Q*0H@JL ztcjL-Rv*VXx0;G|z5~C_tZQuT?KSPS>~{MZM?J?|+cxX3)?U_I zmU`xX#%?9mihK%Y<~_~*kvk!e<`2jpnm;2yzF=eFvf^!qjizABREynw$K1-=)v?yy zNHOvOBGs1lBEFG(>PEhq!9aQaCpVa)Jy{DTG+~|wfD{YvnFSVm4|5CXmMb{}$f zu`jYdu>5Sb*{CzwwcNSZe%`9Kj2hhZY4CT`f9LJgN9hVR2q@ z&WIc>`X_?(67%Bo;_@2i<>t*U@GgF72r?&G)>tB~XKb$>ms|~`D@q+9MOV|e*gq?v zT+oByl&}{O&m$j4PK>G-dop2AvXuNJsei(W_^$EyV>?7_3tk)0#Dx;X9E~o9PlXXY*5A}Y!?y6u?9u=`;@*G8097?K^E5*8lobPR6);E@Bwz-Z% z=NV^zN22|b?Ub#ft+I8Kxs7R#v9a-sp_XAp$>-wj#aD{QmPm$^rhBGvL;Zq{+2yku zXC3$voKrWqRobdtv zzv@BOvfraZ_+NZ80>o2@d(A`E^?i6MYujXHrgdyWqU_^x^1HE zsO`A@yu-)&!7WB45 z`)p0lpxpBLX$4V5zQwgm-W&Fq-kFSx+<`o3PjdC&4K z2zVRp3cV09B<6U+i3(>@!&2raO^+AKbuH(JUzb=bp>5RJ0Dtu&wvvq&CTgDOZs_0Y zSX# zsq2yRXJ-^-yU97wx!tkSKE}4n`oc2P($I3oJkxaDU@9J4G_SC6;nKo!@cezbh9Bdz zzGNN9PRrF7R4l4gvfN-dFvBWiEpr*G0p3>2a=~2D($nf|KjZ8qS0&5E?dmIG@mtExjmwLz8h54Kn1l`qr(%B#{}5Em@0|B8uRpwq z_Z{yw-rin5x=M&wAHD28BYY!#Ht0KO#t27Qvb&R)S8?ON<;V&%pj21f}oTq)6&u%fwz zC-W=isq@z5rx$iFep>Xb;5EGJT3$(hmBN8VD~lJG_!t_XS0&rf-{i1(J3b*UcUS6j zJ5^Luwa;{Y^@aLH=(#u=a5HFl@RG8X(INF9Dj<4o^n;k|vD0G{VopZ&i@X=UCA4Ko zYMDy`+kBgOwbLc&bov?k`g)gcygtG!$SYCLw6nECpvQLV=Hh<(5B3>N`8sxqZQw(( z_xlf+a40HKiL3&u`X{Bm?ypXZJ=Xr(KH9m~wH*CIot&a`lH)J?QCkJu9>h?ysj)Gm z$I#R;!qCV#(`YR5D|(Q>H-ACl_u_GeNaF_MJkuw0xHZI< zV@q(Hbr!kmxC7j8+BrGL-V|b5sj_~nRos_yc4}1dwugh;XT9ay56dv=(Wo0nAc?Q@jl&s+IdNuP}LJ5 zRPL{&xQsfySU2!D%7ALw&;=My!lj6R|RKY4r1$e$f@flY)N@XzG{bJHn^B z&vKsx-yXiA?^2(!K5u;f@~!O`@Au9p#%q9Pk?_!arj4D>G3I9M0bCL}r}H+XHx{m|Nx z?P5m7UW^$Zy(Ma3chOacPjQ1}IVGX<57hwPBjQXxu)ROD*w?CH#M{UfcHd!cW!k+j`C z-eq?b+UM9i*k{`wS<+2gjZ2MM(_+&e({W_=Gfj<*4NCeHEh)TH*r#ZJ(bA&kMX^Qk zMIDOLio}u|hAF0H=9A`*W~-@!`K_5+2iWZPVb1febMBSWbopQ96<;89Qt#46=u7l7 zy>zh9g+AkakN717SOU+N(T8je86EN{xJmGc;ME~Nh3*a87Je|IVbp}^vr!$wj|RUA zIN|q~?`oeT-c`JbcPptLB?s$_g? z=wcjVYHB`i?qJ?z`qwzwxXmaV1=C-~?}iqJqv+4MSlp_F8t0gwSyS!n?Gx6&wz>)JBOO^Gu_q1^^0qrYoKeB zbFRZ-@8?+HoZ#B&(z?bve|6q+_Huo3Ep`u(YRa?a5IIDObPsZcxN5jQx)P)uc@&G{ zdx1vXlJCn)m36E)YLjQtW&DcuV4YbKze2iVckVAX7nYz)Vy4xdz^pEvN^iOrEy1BYL`tsi0e0urXd>i@x z=JioMn}z{D-$Zo6dEnK#sP-L3MR*^oHKBC1kRnD4yZKdljr$~G*JO7`siFJ=^oL0? zu7{5D&QSLbxe;RQV5Lx63*^_}%y#Z`<-2Rh59Q{vTDt6Ni@HaeMA>6L5AhsruKjI;% zu^R|_d4vRXt>g>cg$Jm`RHfml!OTR}VxMq92p7C*B6*Jr;R$H4IgO!DNMBU9T&yCy z1azSc_UqI*2;I$Fh;uh5TWgwV(o&mJ-HBd6O2LVMzy%!&Z zI%RX9XYqLNg{tX1z7X~PH9&apqvmHqCA=M~ma9;oU5fa+8CBOSKus>A6Y4g)J+1>= z+d$Too<9J5V=n5v?SYa6k`h#ExAEDqiq^=ZOza_0f}?B)TMEo^4C})>vUqf-y#*(i zQQthEY*A(@Q0_{?M)& zxJU`mSu@K8eqzA?LVS0is>|@64=YY%A5ka#53kR_N-gNlaYL6HjIMy%bw}P8KKCbZ zjTPw8*^0{bE!3QI(T(E->cQ~bgbxWP3D8I@@-xuP-atP_0-;3UN)GoULary~} zaWd-GG0?OZ>gg67HgMnuPY!&Nm&p zX{)er+zy*Pihadp;OtM4spLa{DqszvK-X%Odfi~4Rr3)&_X7>Q4&Q%=PD&^E3xe*F zfu+;~g473y$ZS;7w*ZGa4{n~}`ImIWLKzrnSy*00+7Ml8Kf@0DBG!(EjnAgD=n_=& z{{*T!1#x!@taK!hs-EcZYl$AjdO%f^XgQ#%{;1NsfyHLxj&ESWPk=061je-+$41z~ zN_hC6sLu}r9yScP=U`wRy@1dB3Y@AtKKCX=@a;Ez8-ia)pht2P5U)w_gIU0E)*(9V zf<|@&IXDH2^Bh+ZJ3O!Jz;NDxmo&U*lUyLWMZ^JQP5?z3>IIxP2ncT=u-!l!fNue% z=XCf@OLh3JqBe9?zC%~wYux1@c>M+R&K`z#*8rQFPiDZ{e*>K!M7}af1;XbA+#{X8 z#Bl>?#t!(*Tv+mOAep})QZ)yfQxm$5ho$Pd$a$Q-uxfQl9&8W+L~jj-u_#Gqo> zwa3amR|aB4nbMKffkZZeW&eVB`a4jiiHL#oVA(5hYysMH77_k7|A+qvv^f)KsTrD9 z0S)pXILYV{X^Otr&alb8kmgAE;1uw&ptQ@;)9bhv7O)K%<9cXiIsAA5q&x{y9|J`GAXqIY){XqyWhY!dLIKM=2{ z;k6J5^LAihH-N0YfGy^6&vRTMz^;?wYwZye29(;tbRc-MpzRUB2M57E`@$+Zm&&>s zB2Hb%yB1K@O27^iAo&E~n&t7o40NCcWj^@tRf>W6;+zk91GS?jp*3gse=!_*9@X8j+zkFf9)b z-vZM0^prLLe^tO=7=Cv_hhJe&_Ytf1V%F7|bq1pR5a|C`%-IVw_rhxKnQuIfg?tI@ z;2<>Mndu8O<3?^14%yU%_PRilW8rP{p!HQaw!?S!isE!FsFSalbyF_j=O zPjA3`99J;^R?I#R9F4|YzhU;i;PhA6_8`RAi9qa^gTDQ^?l$6hHaPT#-6cbIEg-|e zu%tP-|4zvG0^;Uv#DS;qt2gj3Pv7ke`04}1(vzU$FHkWJ{@w$!r~^wY0~<3#YHwj( z_kgjUMI<|d)#w=Vh?D#bqS_t)6syN~bVOLux!?<%s0s`5;JqGxXJO{$n0qs3--ngy z5NPmly$fjnR?M~v-aH4fdK@y#-(Ve`Ft!#Ve>Cxf)?Lt42D*FhW1btB{VKG08na#i zrx)>l88kh>?{DA(Iq02oU|sY>wvY^+)&;)O3D!0gb~Fywv=BbE4N-4zsoal(j!Re@ zZz8h%3;rJ?GTuPcx`F6*73a@`#sj!|9lUWm@XHbK!{LxiFCg1(VJppGDNWHER3Ezf z3I7`bV{Zbk+v0c6(H%&zNA4akp8`K#0IhrSsckrRl}h3m=C}y#_X_fv+gP3NBFg=X z<1V^%?tqf(h<3*ywe6r_5p*&M^63d1ZHIXq!bUxw7Xk!Yj~Btaj2-}lH5>~5d%E;p zSVtK;oIE-y3x7=jR-RfKLw*AFbwP7oP~N2UXoOEq!HI{PCZ+GSp~tGQ!*a010N4S+ z4B5yOzTx-}EA}0r#utz=9E9C%hmUQ7g?c=56C%%Fc;AXRbFfrbm$1S=fCYIXPF87L zbRaUSK^wXqaPP7>!a!d|*lQ(lRtYrz@BJs(LPc0%D6a6qwH_WF+=l3y37dRXO2sYM zz*W$42DWh$_Ia?>J`aPkfCebHRrJ8IS@_t>Daoo(%)|bKsmuw>rqV z0CU{IOz$u@3sOo0hZ`Z;&v=3+5?zB~SnsQ1_4^2l-eZopm^rOfi(cq5Qj;8v_vro~ z{FVzneL(cM2;E$R-R6OYH_*yO=;m*X|AhO00=@r$kH?_=6{!4xacMaF75_8wdvU3b zET9(PBx3Ua>_vf=oS>M(V*KHUzF6;M@Z<((1eT%#C!VL9UEnYuRODj38wW?1qQ}-e z<9%_rAXrxz-ox=8iMSO9KL~-nN8no|&Q(AcV0Ek@70|_zieD=tGJ5`};JPGubTnS^ zc*T{{5Dae$hy9j?-3FFYriG+D5kZA{w4hNaT~%D5gTUG;&ica218}Wpt@guMKio4M zbBAK)SiJo3DH!ww;!ZxLS9yHG5B)(Ln&YrokBxdPSHgD_`1Sl*@W~7bnc-=9kU%kh z%fTxj`p$+_3m_{euJs%OD3tNvpv5^6FBN$3!QtTxMW@p5 z9{<#qUZVA37R|^na9^X@y9cR=NgL98XO|-?1%d>(7|!F zfU7*bc(f?vyJsDga1YNJkA^)_Ljr|%aBe7-uvaNHA&`C?Bo+*fc;uFXSlbYhHn8;W z<)F#RcvV2GtBMu2I)15#m|Gv;8{yp(k89#p2cK(|zI(F9<~ZLLvA+w}w5G^eJS$FH zWAIsPss9$j(=%Y-1<era4NfCZUx-s3$UO{?KmVUS~4*k&*& zjle1t151yCWrmb`i^nrk@I9{7T0OscR*D3Sio(@p@g50F4#u54cCW_a08bw8_0X<> zDg);8&{B*~p6ta43Q9_;wc%Vbygvu;o~*`!arRQ_cz8DBv$J$uEZFJQw{L6i7%rG;WrDC;awb>DT*mMbYwr3>!sQZn0xOdy8;#|E<+ ztO~D5hoK&M2D0jlJ$5E`Dj6i77LiM=KPqzE79aaFJiTF4_j z9T;d#&>O@cXDAdTh(lM~@n&2)1cK#K%^Az>TK1e?2BEz_d)%!iNjcpwJRP+Xl z!WUH2cA&3q7j@HaLSMm#Cl9NjGVvJl{|@WY(rJj_S?Ct64WF)#{qZc=b|vK5n<15A z;tl~Wg!O}fXcczo|ssM*yxWtPDNeM zi7xQz@PnJk*CwMvREU~W3i6I#uoM*;k4jr*?CaJblY4;q>hKeIj&C7qx_wYZYKp$@ zOQ<$og^b&x8+s4CwH0cO<*@@ijLiBavcM&%`2K<&;ugf3Z@BMX?0-FV$*HJ8U4%xm zkg1(R9(WGfj*0&So0^5%VQs|823Sk_q0-X}D~%62;r~JY=0ugs53A`X#H}mHvYhCP KZ4QkGlm7!$vitD> literal 0 HcmV?d00001 diff --git a/includes/install/sounds/en/us/callie/custom/16000/and.wav b/includes/install/sounds/en/us/callie/custom/16000/and.wav new file mode 100644 index 0000000000000000000000000000000000000000..3245d35cabfb3bd4376994f0cb7f37d99bd469ca GIT binary patch literal 10902 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
    3?&-tE8#Fs)N){Y86#cE-K5FW=fGfQ})Ss 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 G>Hh~{`N&QH literal 0 HcmV?d00001 diff --git a/includes/install/sounds/en/us/callie/custom/16000/been.wav b/includes/install/sounds/en/us/callie/custom/16000/been.wav new file mode 100644 index 0000000000000000000000000000000000000000..1e5d709dd01ea762e810f2f03eff582460bce7ee GIT binary patch literal 14146 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 literal 0 HcmV?d00001 diff --git a/includes/install/sounds/en/us/callie/custom/16000/call_forward_has_been_deleted.wav b/includes/install/sounds/en/us/callie/custom/16000/call_forward_has_been_deleted.wav new file mode 100644 index 0000000000000000000000000000000000000000..7833436289b55d9082529e0e0ebbf932093e6ca3 GIT binary patch literal 114092 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 literal 0 HcmV?d00001 diff --git a/includes/install/sounds/en/us/callie/custom/16000/call_forward_has_been_set.wav b/includes/install/sounds/en/us/callie/custom/16000/call_forward_has_been_set.wav new file mode 100644 index 0000000000000000000000000000000000000000..f6477e1f82c4688798612eeefe2912d0a259c597 GIT binary patch literal 123164 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 z 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 P>Z=#mUG+Nu)#v;#CSKS= literal 0 HcmV?d00001 diff --git a/includes/install/sounds/en/us/callie/custom/16000/calling.wav b/includes/install/sounds/en/us/callie/custom/16000/calling.wav new file mode 100644 index 0000000000000000000000000000000000000000..4970bbd267e31b7ddcf799dec13d2ad76c1919cd GIT binary patch literal 15016 zcmW+-1$0wc*M0t?P0}<{Nd=b{r??F6R@^CcaCdjNp;&P*4DN%wySqbyQpt0d|9=0< zDl1(n?YsA$d(J+4@6(}qlP241LQt2#Iye4%__#zj1VJ!(&8iFDOot!@azg|9jq5iJ z{LEfxIW!NN2&F?AP*7l) zZ@~ofO6RZUPMcxNqKIj(%Jxt2SfORX;@oF>Z5gX_#asbDGka(?q{i&+g0g=acxWj0gPd$FZkda%huWE?U@PXpXQCINnubODDdW-*@uY-m zBcWKVIM&FlCBCCtQ*naT#K|W17WOk_DdeKoNIoFlR(=~^Y`dkT%}+ixr;3~D{?tU4 zls_5C=swJeHZpld5Qm5pFbquau5Aqbg`wJ^$PI_eF9z7T1h2^ zL1Kn{Tl&EFXa8ZI(yzkD3*S?iP*Uw`q(ifj*4Sz62Kokhh#WmUMD3 z(H}p9)TYwiC7` zws+QE)|1v>wiEWZw)&PH_)>HTx(w?^l(xiM=UG+|ld)}R2Mi-*lCtL8+dIcNzu3E2 zlgQGz7wGOvbCu@?~mX@~vY&WdUE&a&X#1z6uR3Xk2B}ti>L?jR~ zgpTLnDTJ2{Sk_u*TS{8ika@%yf+vbvaO)q-UlxX3K}HhO(Q5EqXa^L6&KbY-gT_?o zHQWzbh%m@-^a^Un&SPKkNOBH&negISXnAxM`UQotuUHTAFWY9j&vt-dkxkGr=nnFn z7-B18Z(xZ-OBmVeZtX6#6CYwZMQ*@w_<}xHDJ^Z1PHK~ou|#|FAEE?NlqkS7IMcYJ z_0coUe7GaJ28~6#AYI_Y=3%{$mZyovY3LcW(_CrPGM?*iG+4{kZkk0=5$lYtgfXL( zdQIuBzlRUwtB69>ZPrlsi#x&J$bfY;0exW7sv-3gXNqIw{n})65p>gRZrsxPsSTC= z%1HeJdLS zr?es3F@2R;72boqMB}hm$abi>xz20~e?fB4Fjk$IKup0hp--A$?W;c0wi~mc5Aa(! z1-hqK(pqS*^|$6+cph>G`3uQ{Y{nAxZ$(zBYL7LKe%e@vd?A`!w&PLoX+2F#R2iwX zh)d7Zbf^g01Qnsu`e&)3@KRW&tTN-UUgQnS2yy}%YxdS#m;;auG!@>a2i1R-JL(MG zZ`OuzkWCDzztK|u%7*Dad~>ZQ(hna?G$517ir6w^r#xQTuPoKOo2@`jn`mn4HnBZ- zfxW}?@+qSpyvrojkZ2K>2ycb5Qb^aa4)$S=&emD@J!A;9#F%Q7fKOu)2E>~6XOU0G>8Sd55kMVbG4^x z1>=gbUQL#ENa1Xv`#u1~b`3~BKSkcl*S2zvc2K6vjt7*z1 z#Z;Cn8x=^Kpi^2&wS`hcjnTTPbCq9eJ#!~K9BvQIfmXp5c$^Wf6{?)JMQfonk>*J! zm516bJ;~HTVM*tW1kR*c}|_9)Ka|~sx47FX~WGyXaW8kKaIs>-_hPk zeY3JwMb*`MdMjgz$w2Gi4bZ>Fcg?A7R-3A2)UsNdu>@)i7lYaxc0E>mqV$(jOs#!st!<$x>JqQ zHt1<4WoDWs%@XE!i0Ci(o@QkomzzcLR+oRF#AKP<|#c@ zAElL3z;9RDnmf>G*n4y~b_3sx?S*J958Ul*>Ih|#U}ex2a2fNRK1*K(@)rwo**$1K{0U9~ zSn@rLLaU6~<^g0QotJ)xDadQ6zIn{3X10U|!<&(O)QY#k=VHatT1abTGtwQo z2wRZt=p$@D+7;@qFVX(dFBr?r50HjH_%V>pJ z6FZB(Mre2*z`iI_3|RqoZyUM{*#-?UrY}Hxcsz)=#@piauo`GN^;5$hw(ymDpCdB1D%H= z;ofi_`~bO)*1+u8Bve9rBWu8Id24Pmv&{KsHB$iR*WNsD{x)+>-uws30_V{IZegbD zBeXB-ekBMn?BB{Mjnb{??sLy4-wHs7_Wg}MKh7LNDDLxy$6?qs+nVr zSK3fzh_pxEO8>m(E|}$MRMAbbcM5!uQ}fHkG5ewS1b;PkbZwQEsRqy_^A? zoy@&vGL#ElhHoPsuqnh{3vYYnI2Wt=L7>=>lsW|9j)Fi$Cd{AvxP~w*1`s z>(sATKX2yj{PF1<{w3$bt#=>Zu6cXmE&hJr$0uLrd{6q>Ket@LF6t0_M4X|oz~gYceWm%y)rxfUKeOzSZvOiDZrsa@uZRz! zAHBo1^cl9z-lRZf|Aff?4nH0n41(R~= zU&*=c^V?DL0kVlw^VIiBU+FBjj(VBD;?LFGnt#arN#S4YL$S9~Su10#F}IjkjRQtG zs0T6#dr17U)^)yic_RBnb@4j_r2{R36JmD9#>NUUB|{krEkj>?ZJkZXwa68_bLFv-QsESY?rX zTWkUlv9U|1LdIUjTF} z!cWj&*irlvk!;yyt!-BwCnA#Ek|#Zi^3M;Bj6M@HCayvVk1G~aBD!sGn(v$IU#kjm ze3m|2ZY{QwDyvDxawro`B%Le|L#S;P~eB&0fDNJ?x167K?NcUv^Fx%LwTxD)5JCV6e!*p)= zdEunOTHzK{5BfS&gbzqZmDgIF`4L`#tpz>wzgE(o;J}=&2)8TORnc?O8ySd*VPg-5 z&Lk8h&QF*fd)nVVa)`4Sxf?33jZs=FTa_2;6XPaQl6X#zw`5t0TV@l_P#o5cYoK3v ztOaya|I2hjrdi9ZY*_Sxpd*?JuvebYPTVMlq&QiT56DSUn7_v!qL+lT3%2JU&fifG z3~#1fOntTlm%*K2YcrRr1L0SNmcqjY8w%%A|1jma2w}ODqCVHY>0Qk=@LO~P-i4fG zJ#O#lydSaBJv8!?_i5A~f01Y@W@RiM_g6>`S>hT7et1%xwJh)99%>D-hHya`E868* zT3Prjc92LVr<0Ay|8O3W%%A#0t(;b%R?yn$myA8;Ky#SUUat-A!E9-Z5G!04vP6qC zOPVSVRcuPCw2g1X#?W61pXG1M`!DZL{-(m-R32TD{mzD2i5Ws)2rn1aH$g}4dM;4IM++X7wFXK6*XgK9PP0qEW1%pPX4aYH+)_EJ!(GC!4_&h`cMcoKhJ z_##bGrYR}%Ua^(1l(R4y;T;9B1!)Dx3*rm4!iH2Poy7bA87PW&(pRWn)LiN(U7A}V zyqB`nE5=7S9y@|7M0LQTy|8B5_Sj21J+8H$;Zb!1d!h?t@%U~DbrO=|*|>wT6{DX; z9d&iGeor%-O@(so483R%m2d)bZ^QR{=0B-VM6$RxH}c3 zUCaq)6+_YE>5<^omwrrFW&88b#AZsOUK1(?;{G7H#ah$8%5lr-byaiM^86PWGWa62y06HnA74 zgognV#ZVWbz-^HdpzE9n1)+7O!+5R=a#4A$lr3%(rV0&3S>(jk;!1J9SXO+-x92Le ze>2M^Mw~NOmv3K?w)bmR@$f`2gPo} z8U7>RP+F^YhN6@>@D>!7RVVDpHPsV$RBiXmYY zznweFMswM`L#!>n6`l*UKng$Db#z&(S9o~g?1J6}bqafjajFruj>@6FQq8D|;ZKFv z3S+~M!_TRK%mr?{I6?WWwJ;rsfK?{nSPt6)&WWxV&y2`fQMvx3!R+W~F&E<6#7~O9 z7MdR#9$Fk*=&$DqI+~L8;X#Uzzs-zd#xf?eogbwPFwY^Uu%pBo%P4EKW@-v)AVFq$Zhq>;isPUJp|q&5NYDjqD4 zC}-VZ9cO7s-X&Ut-ewN^5J^T?qF(eBEJ1d_Ewoo_Nacl+d;vR|`9jCD$^00hm!R{0 zp_#Ch|H_tSBI!)378OBN0+BO@j%U^}2bpP1h*?0Np`L}igy)9KQWfYEjLe+`QGZBl zWY$E!Vc&@Z7TI>mS0YmYiVCQdZ-OUg16fB3}z|(hhzIRoQ>>qW>-#U7HY++nXd}_j*g!BY4 z)FmhmzJO)l7^Doe8Ezop6<~ zoktJp&E!;JH#?7hOnsz3vh(;q!bT}y;k8PD6LCV1;5FzsOu_#FsJn-)x~;X<3DDaE zv@Wzn>n~puDsfNgjsOYUsH)&T)}bdbV_6n(ukW};JSxNpU4%ITt856zo@S3IQrgU4TF6R<5#D~&0rJ>eRf2rRy zrbE*}=ZX?;OEudad(bh!9y=_KNNK z?rcM55p#z9$(`VL3USg$xwSe>%h9dSBIG4@ow#7xY?JM^9JB33Y|Slq@hqgSSw-6< zr-`k>^CYsDnej|>rZ1?ar5+B zr4v%J+(8~Ff0e%}U)0XpAZ?-cN9zvQ!d7|%eXCy4*lOG`&Kp<3S1)6!-cL(Y2Phll zi;^L(6}O9D#W<<9)D7T?2ht;Hj?_#_mbyw)q-_%5EMy#@^#UbXoe22WHrjrG%`fVk zjDO8z&?Wc+;L8xaJkf;gZrNciWq;uq6QQ`~dYH&EQLr!5=kRy*&+L~T2IzkI;$$AkzR~xT=Q2pwBr4qnrAr;X$&0-Wc zF{l~z!X!<*A!^gr9C@kqPTU|a1d7%hai-KtzAi&bd1a(>LiwZ=RS&3Rv<`Z*5jIu> zJ^8yi$-HTN1`OoC>Kf&$948-?I)OFTl6nFjdY&{xnhJKYmsCxvETw_(FH4-%Le7#O z%6H@kU{^~jE5MWdkGn2nbTJn~%i*y|P1J`KV(;+}gx50D`qJieG<9Z2n4q5fA}e{b zqVD;Q`$q*91;<3si!K|~ePg}D-9sI#Ng3H;F4U8?dTK+pq4rpRW}xOCqpERC|D@%r z9o1QCH?51_&WJN#0QLJi;1y=-4sA2gboxsHsipKv%8+vb_Ff2fr-ZUct|r%z56VlG zDe7!(u0GocnPtt#MhAn^7w9&9ww9{dw1zNEN`!t4o}?320VT#a`kOv5Is+Lcpp?u(K!S^~x=^ zk6yt<;f;XtM{pgtk(EKDC)=+(Dn_(%VeaPcEO#YOwaAX%VNt7m$NW75bp!MLjBkc- zXVkjLgRT{hN7f?bAk2;IhmxRcreZ)wcRfWfu1D*Y^~d^I5K#@yO~y;m_YTnJs5g`m zV8!c|426<=$zQ=OtRSUG)1^`%8mlX{6J{!>S*W!3M> zNoBJ#USVX5EQpEXPGPCAQz#Ish#keCxLK$sLQHVPu~e@f~P2i{Rhz5@Zaz4x{l6 zWC!aJ+ah}h#}a2%7wg^^nH4qPPXtc{z0upEQ)BAH%!}R-+!yfsL!PE!Tjhx_#u=GXCN~G&K-^Hg*F-48l%wid0CY$%3!&z1c{&cihM_YyZ}jd`JVKT zI8j(Bd=!Vu@ycF#qBIXw`orROX|wEB^5lu~e))_tQ2PoLZ`vp{%9xD#7d!>I3j8Kj zp}R&=dM_3P#`MgOe8yx^qhIWb(UJN{cj@5F`)S3`** zCGJ9Om*9EtL)R_mQ%6tx3`-WKLMx0B`gg!1+*ir~)+`OgSiV?BLZw6E0KgwaNH3+P za)jJOS}SIVGr(;uC;lhQ7sdldbES|CwE42)F0rZfTN)zM@--!2b?6864|;?#7bpNM zsA3cKOTY*4U9F;8m6cKnP=81ATe*>J1*RH(i&{ZtQ1z&G)H`YqJ%w?w$Jo7GjIddJ zCB2nJWv*7u$T#=HE799{A^FqV)xN=z=S1BPBML%5PUch{2b?zF! zUU(;NlMktr^mj(CSqwIicK88uidC~^J6=ST^EC4oMs@a|4>XGQ#!_*kM8wfC|Q4KxatjhPX*EWTRei=>W4 z7ZlA%S`!)_b20is%*PmeP>k#qG0<_}G0@r1vDLbg7=ragw;~5X@4w$XWi;1&s<-4h z@^B?ybu0D6dE6-$l1m^_A*XYXU?vN_NSurI4rs&A2~zgDuUDWA4&*X^3X1NV*0+lXf!# zW8)Bh8(&F~g}#y>pjx*cZTQWBkOzsw>Jeou_pEK~#hrazmpwncJABqam*9)&=dmgA z(TU;2-HB}yHzazK(h{$QYQ_u?VEz)m!QS5Pca9X>N5EyyA|K)N(OvK+pf}tC=*p|F zRA(!!yhbhs?$ISt7nTd%g<8TLz7)TbtHI^7GgyY%!ps3(>_Dam=xmF#57;@NOZmgE z6DElRq&f0n;6i8)961@=`DT{z`qIYSSC& z%XB`yg}KXmc$S|F^!3S7W2KljRUcwZG~?lZ=rMdgdC8JzU1q=GQ`igKW!@(=257@8Pf|zgyNxun3se<3j|D;Wt+sBk^>$#c?VdT_Zc(42 z-uo^F8pL#o>m6zoiVqcpmM8p3T$H#jzGa*olO0nureCm|uW@9gTZsrptOVz}mD~if z&{#ATnFlQd&b3~kgV`njl3?kFaGeixySY=`Q*I|0$xUM&Y>-W7|6!W}?&TuAmafkf zVK=dTS%ryb}}T0<*_a{j=4|wW75HQDO@6#%{}LPiqoX(@-Lup4bl&q>F_S35Eb!BmIt=Zj{43q z5v|<2Bj-o0^CkOJ0xyFPV!FoF2we`9i9Z^TCD;?D#g7b`vHfCh2LplHz7k&E{UL&I zHn*>{?jiT$CxMUUG}PI=siWE)r7MWrf5oLjQ@$Cb+H19~x?3TX zGS2z z2gtRSsy5Mn#W~jX*c~02?!6LK$v-D>DR?(}bxhIN8L=;7x!CO3hcSzydj|&vR{1l0 zcf7AW3GRy#tDUKi0k$rH^$24Z(RAb@^vZ|;j*?}{LV1XkERsSpzlCeWy=0rP$C>&} z3_~(`fX``7$I=x5KQ@paLeHnK13mC6(}>;A`nYXeQ*hT72|t7yfMce_Hc}7JF~v#* zc&XwOaj=Mq>xH30IYHrf@M)kTH|D4F`}xm&ys#NKr~J|fDO;YWY*uA$i1E>^4DUor zVju9Sq-?2YTV?;@NRK$=`sS8BCA_1fPW$foHw9`0KLnRYH;#E21IJ#9sT;E*`eP6d zKJ_>CZSnde@4J_}JQ4LAX|}1BKSTz89sLDdxSfqc?XcQi`6De92MCM#?_5Q0Hv1T4 zo@lVf-}E867hRN&p)1iX=z4T2U5lPY|Dd}vI~kbm#LDbOt~q~;uLabk!D40b%)R6z zGNN=-{!_jwZ-{S37XKDg080@oHWe3%_r+MyQF!FX;BIeM zHv%W7YK(wncq~vOI}o49q1Jp`bH_aA*$B>6*3&Gqi8mBQM;-M|@s|zU4%7*@4b~3c z3$zVv^6&O#L~)TTJ!$SZ*F$FmN4Bk)^*V6OdGW1i0J#j!FuNKF`Wtn#GEtr`?Gqmf z4xtHun5)3OVP~>s*bB@=rUE$G0{Rj-**WyT^at9{v;vIHcfcM#V{3wYX6G029$|xE z6GwwSrKmIxFh<`c3+T~80725yEorATR~ilweHAHDijsXZ!*GOy9MrkKR|2mpt3ulU!vY4mtexIaY(rBqH#6zKi5E;p6Z zK<0SLmjWr2^keogI+MYEW!rI&xm5l- zUsJdtq<}s*7q~fROGl*VpkrYqha4}L1a`7_) zsyqj{#=2;o^?t@Yu-aH;Jo*`HP8=lTtb=VA?U1u|#4^`C_fL-&NdruO!?(jfArK1g z4AQ|O(J9fn!FIt;ftvo}zKE!AkrO<$Yg|OE^QyhMZL=jzbOlbGS%?k|G(YGwwZDKH z?y@vX>?{lfx3qw5&7KEL_G@|xV1Pq(n7U3Kq>fORsP~ja6{CmKH|T22HYR~x!WQ8U za6NdH-z<~|eR&sfPQ&C+ayey=a$V5?cax$fs~(kC9)K>mrSeB!FZY!P%M;|4@_c!L zyi3lPn=5+&Bh^NItS-{}>J^p3!)>C9Mk&QJ* zKf;rtfVoHSskzmB`Kfe9JTKhfHLeSH8)T)2%uuE@12Yfk72u{u0e6B%@zh7^E_H=^ z3EtW00PUme(939(p3eMcda^&+EnHU+&0B;D;yrOH=n*c-HGzMlyn0M+s@>Ik>a@Pu zXa>AZTcH+Ue&HUn2JM6;;D7L2z@L$6nQfhIn_&OjQQpZpPetr@?Q-w-Oo^=Qee9hR zRm^wV=k_=7xAWKb8@|cDw^3MB5pPta;J)SB95L8g*HK_QWbJH8Bx(FE_AfdE=?*u7 zDw(N9L%o|e7xXSRWrl1>tE3p|fY?&hgyTYQ!Q}Vy1Na)e2l$C^b7ug)|Hb+Ew)_VE z7vEYqEhLEl0EfwZ$u0jQTa~|+TS}ZdOg*f=RV9@JUk}w2>KL_zdJkl!fN~G`RI13I zKoobEYJi&>0NJ?|;Nn&T=BWYTTjG@?N>lLvPH02)+J*zTMslE!@Ll8#nvHG1R})Lg z36}2Gsy5XA%%17!;Eag49Wm0SyJouI0$zrl$fpjJ`isXkyDqbb##YESj0W>c4eVmX?A3o>&qvyN@WMei@}i}$6}7FhRj_{rDr|k{2j{Ga>aIe- zq$PR&@hF~Nk!K>=NRJoyUWlw8xxjP9ZMdp}8#&*(!ZFo8-ZsoS+A@$FL5u({!&T^Z zWCwf^`fMheLyRkW75%iC)EIQ)Z-92NT3i6M z*gc>&S^@UoDCJ4@!G{lCw&=P1Bv@-DQSy2Z0 z1?B~|0{>=9qy?A^s)?xZ0k|hz8cYyf0#h4K=pk?!4hNp~$Hsi4t&wby#(h0g@1mE{ z73~V}h}P0D?VWl`U8W9F8>y9n^QRPWpO;aS)Swy#y1Y6d@>i+XfNQ_JHbT3kS@j|M zJw4SpVU#sbnpMGH=>!+TOOX(|15L#)U~Pf7vpI2%C`v9QUyvm%LoMelu(h(atF^Z^ z!1tNe`p9zFvcs~}(%)jWTp)XqWyvqZI-u3P#+Tw5cuD*-)&qNtb^;3UIOGeQ z0?&cIn+?o=0E?OjPHmlvtK*axaxHM~oh7ey5+DImyd*3VIt%5&?al=~!bkoq|BZhS z^srC7#5;sIApjJnGT*+t=Ek+ntUSM`=flg97ij+XvcV`$C&y9cuk< zX=C}9q=|AwKYRn2qcV{cWE6Z9Qp}d%oW27dc#~!U+^=2DQfdH)_H?x4pZP2x*0sQoaKLymYWq?&04$$i%us)AaTNnpe?b5&-<&Z`JMA$;UCjSNM zX%qF4+FRqb6?%ek5IB9Wn_Z!A&>;9OTmg82adaH|39XDR$MQfdp2A(kIN~u;i`+yi zWK&C~<%6ZFb&2&k$WqZjp=@mHVryUv+48KXtaGfXU{zx+q-7mhk~~AC5~uMJ;Iyh> zchLIiC8QE^0&W1`fx1B-%nZQkuP{m(*Y!sFM=c$!bUR?~-++2w0-W9sxwjmUA4{14 z*VG3U0Rd;2E7GDzDk;?jm0>!V$@?bx1b}l_D6bW#ny&6sajhrlW&*&a zouhXK`c@TlzZnay10#oH;T*U%auc`;)}djv4mKBijQQ{$cqV=uH}S^AT;ekEiVz6` z%qi6++ml_%E@X4E4q1dG$WO!xVmi^5h$24WYw?aahF`%(gL%ALzg%gB4d+Qo*|t zN-?F1@|V(G>GS^__7UZSLIMWAo;p}vp*{y0x2`r4u-t`OC4I7fQm6DP#th@R5pDJ} zcboZUGiW?-yN zOsY{JkJ^FPJPKEVbKx`g9=ne1!KPvLF)#4l|A&r7>!O9oEo1}8s5KED-VNq0dl*E0;7{J4pFkHr4@Pu>0TtXGyuD{d%1KzQTS{l${%4o@2 zdGK!v@Wj;tY;7m4k2Vy{A!Grz{+ae$!}NH)rrr~*aGm}im~N2tB%`L$&lqoPF!mcS zjRGUqOf~zOvw>UszFA=UpufPR$R?0S^B^}|4ekL?fj7Yy;MXt*yO2br3Q`TJk2FJC kf&EAWuKO-XN8lju1oC|iq$CnVJctYzz%SwZ@KyN#05V7}!2kdN literal 0 HcmV?d00001 diff --git a/includes/install/sounds/en/us/callie/custom/16000/cancel.wav b/includes/install/sounds/en/us/callie/custom/16000/cancel.wav new file mode 100644 index 0000000000000000000000000000000000000000..ee465f99c9637bde2e99409644ce88645f9b594d GIT binary patch literal 16972 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 literal 0 HcmV?d00001 diff --git a/includes/install/sounds/en/us/callie/custom/16000/delete.wav b/includes/install/sounds/en/us/callie/custom/16000/delete.wav new file mode 100644 index 0000000000000000000000000000000000000000..0484d530a5404b746fa96946bc51e30310bd567f GIT binary patch literal 15550 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 G=>Gs|g~kQ| literal 0 HcmV?d00001 diff --git a/includes/install/sounds/en/us/callie/custom/16000/digit.wav b/includes/install/sounds/en/us/callie/custom/16000/digit.wav new file mode 100644 index 0000000000000000000000000000000000000000..720f5d4494c15225c7a641a98008f8be2fe65b46 GIT binary patch literal 11708 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 xYJIV&tg)yqK{|81_s3ZUY literal 0 HcmV?d00001 diff --git a/includes/install/sounds/en/us/callie/custom/16000/digits.wav b/includes/install/sounds/en/us/callie/custom/16000/digits.wav new file mode 100644 index 0000000000000000000000000000000000000000..6cd7a654f7ee43536f8ebe71715c28d7b568140f GIT binary patch literal 12620 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 Ueu0U5J?P{(WV!0V+Lb~72PXTQ@&Et; literal 0 HcmV?d00001 diff --git a/includes/install/sounds/en/us/callie/custom/16000/enter.wav b/includes/install/sounds/en/us/callie/custom/16000/enter.wav new file mode 100644 index 0000000000000000000000000000000000000000..3e7022b94e5453d85d82d14ef16512aa284c2ac8 GIT binary patch literal 14202 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 literal 0 HcmV?d00001 diff --git a/includes/install/sounds/en/us/callie/custom/16000/exit.wav b/includes/install/sounds/en/us/callie/custom/16000/exit.wav new file mode 100644 index 0000000000000000000000000000000000000000..7175ab8a3b78006790a7afda2ed7af2d16b531eb GIT binary patch literal 22404 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

      D9DsEJo0&uWQ^FBVyD1*wwMMd}7m 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
      fC_VA`Vp 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 literal 0 HcmV?d00001 diff --git a/includes/install/sounds/en/us/callie/custom/16000/followme_menu.wav b/includes/install/sounds/en/us/callie/custom/16000/followme_menu.wav new file mode 100644 index 0000000000000000000000000000000000000000..1414b2c8628404071463f2d5d8c8502671b1a8da GIT binary patch literal 248228 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 I|K&aZ15{Ag2mk;8 literal 0 HcmV?d00001 diff --git a/includes/install/sounds/en/us/callie/custom/16000/for.wav b/includes/install/sounds/en/us/callie/custom/16000/for.wav new file mode 100644 index 0000000000000000000000000000000000000000..696b20ec98d3a207a0dc8f3ea3e2aefc20ae1098 GIT binary patch literal 13752 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 literal 0 HcmV?d00001 diff --git a/includes/install/sounds/en/us/callie/custom/16000/goodbye.wav b/includes/install/sounds/en/us/callie/custom/16000/goodbye.wav new file mode 100644 index 0000000000000000000000000000000000000000..8370de1f1ef1cfee107f398bbd7eabf25ef1f1cb GIT binary patch literal 17898 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 Y;)I%Z5AwAi~4Zbs)d~4_U#*LI3~& literal 0 HcmV?d00001 diff --git a/includes/install/sounds/en/us/callie/custom/16000/incorrect.wav b/includes/install/sounds/en/us/callie/custom/16000/incorrect.wav new file mode 100644 index 0000000000000000000000000000000000000000..fa6c360c23df395b181126e4c93daa85f45a54b8 GIT binary patch literal 22596 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 literal 0 HcmV?d00001 diff --git a/includes/install/sounds/en/us/callie/custom/16000/is.wav b/includes/install/sounds/en/us/callie/custom/16000/is.wav new file mode 100644 index 0000000000000000000000000000000000000000..724bc65412c1557c67ae3ce8d9e8cc37b9641a15 GIT binary patch literal 8304 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 E52{M1r2qf` literal 0 HcmV?d00001 diff --git a/includes/install/sounds/en/us/callie/custom/16000/m.wav b/includes/install/sounds/en/us/callie/custom/16000/m.wav new file mode 100644 index 0000000000000000000000000000000000000000..80679aefbb98f4f329e6bc0f3ea530ba7377439c GIT binary patch literal 9704 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 hc85BG@ppjw0Dt`dXQ?|lW;m!Zf zoYjtw_N?Zcd*|})-Kl;1esv+Jf2)4&#!a1_qJ|&{2IKeUV6p^)5J(M;8994o9q`Nm zXc<%norEqzFQNaSAQXa>uokWZw}Sh?!{LeWGHfpTEQ(;y3cs_(6ONz5yS{>v)J4@E*>{-QzBD z2f^6Ft>ETyQ@NSk3~(J>YTh2KWU046cSfFox)n#z;40EHVa}3&v7pCNdCwFGk`JCwvdy4o`wR!Eta6 zbQ~H2r9j`n>IQ;Uz2N3^S=={v3)_^d8y^Gh_1v zLg98{qUf@yvG|3!x#Wr@MY=+2mgdN2%J#~x$^Mo7En6q+Ci6>|N~_o_k%oT{mx21CwS?ar*FD=OGn=q;R5IHllxK9XONyFR;T2Az_Sv^0K#VQtI+^;kJ0 zUM4sQFJ#Y$ej}#^oB7->k>i;)XfCPUXS!ruYAiE0G2W^^Q9a2x#bh@fGmSM>nZh+6 zYQ43GYH!zWH2-1gYJFy1X}e`tI#XN%cai6ncfS8g;8yS*-h~WNqeAn-=OfM8X#NW1 zg0s=j7%fbbe3wp;Cn(#fS83M94AYG?{1Nve;aSpyl!~zwTB^|x)@o2oKy+ghGJW`L^)7q2mIqUA~?&eQ!Beaqd*WAiNYUhsbQ z=J~Gsy8EyAqXWAG-GYJO4BUm^Agp8_-7VBU+%e2;jQ zpaj{%k>RgY2Z9c8zCqrRo^tmvchGg;WpTB1|K@Jt{^>g7y6&oUopPnR<~j+-en%t6 zUVF&4#WvTr*f!DD-8Rh@0=xd3quil$Zg7rq{q8>F`Rq;cmjw*?IifWc8`4KwvqShE za65FU;GU?y^o%^9{58rLeOfmoHY(wI(vH-<8FjPKTt4?=Uhn(|`BU?IhCLE2Ot;>x*pz_E@iK7I2;A`yK&{1M`z~No%);oXNa;$dq_u6MQjOmDJhpC_G zsxegkXZ4}#H`NcT_f?lwKd45Hjf@M7S*AKQ{cG!(pPA=dHd|lVB6gnxb@g|@^|bUI z_V*30BGmNmaER&8ix5Z5Z@tbQtI=Jyc}gdULYu%S5#BfrTBKS zr}%uarD#s!ANfOak?a*2r&HG?h2w_nPe*%H0ogH80(y>{93DhA4~+H1I?vmFT7EH4 zsrhK!SpB1_U)ATz{*{r6uN7A+HdPF*7*sK@;zY&26_JW*l`X3ZtLqu-n|9Tx&D$+^ zte0)y?L(Y#?sCsy9~$6;Ey$g8B)pLA0<}Y%3$rC*nNrnDb6oqM;bZ*gBx7oA#<6TB zH>Dt}=u5Guqdre!Ao6K^o=j}b+6P;`0hPEL^0g(i)?Ysa{syvpTQ3sJc(}AJsRiUsqeI^~R3I ziN^WH<;L@1_5Dmi)2AA?Hp`M`t+bx9ov_o6zOJk8Oz$V(t-yQSN45@?N7iy9;MQ1k z(J<+81+K0W(?`D`?pmTSwOdB(Y(d_Mg1q9!rDN-?t)r+jzSLXNuViF#MWH4COm0DT zzl@U9`-%1AR_XrL*p;!ewxTTb1ZNBlB*yuD?kA3i))I58no8r%>Kj#>s_&KF$~TpZ zDutEi3Vr3Q%4d~qWlB}2szp_At436JGtMyWuGvuA)tqTbwzjZ!xA%99bgpxqaDVmW z_)LBn??wJg$3_mbouPVYOW{Dt4EcUlNV7txid&gzNtu}8$yVl%EvzoG6~8IjRhn5R zuFj6qbtO5)V+)(*FVE?cc_S50>KHdiSEgC494bu}2I1T6s!(%+^u@Zr*k@R$o3GbM zOna)ARXwZRTxqYoSoLRhk#UM~zp=*H!L-eE&-B_J0kXU!u#avwD_zY zxrRc%_*`jXohzk-N{5%eDizn+TH2sQQ?w!fTF!yY*tCvGZQ|96G{` zqU+<)KGe0)7BcUseNjW2o*VB}M^$rGO{;fS6V-K%ZH<{mwwkYwF*Y-{GWIkMHvVb+ z&p6hUP}8!u%>2x9#Hz8avURrq?g%*hxQ}^I-!lI%!Mem+DmP3s-}t|gKLsnq=Vf8# zc+Gt+ZIC6%lYKxIoXf7x;|o`o+$y~c&ey7v6(yHTR+h{z9$EMxFOuCVb4FUbZ& zMW%AoA=57=rD?M12asDwY7W(=TGm^K+g93c+IHHt&ONT(?uH(ZhxWGcUk&WQo#d?0 z>qwBT4}Cyx2wdV4`C8TQnkm}RhO_bEq=K}4nNxBT3I`S6C@w0lS3I`lSm}+@MkQon zWqzx?e{*WG`ed|7eU_+-%hIK2x+;H4Pl-BX1E4FBGIG4X$og;~oJ7>IC z<-6ut?w;!*eN%(+gp*|H-@>iK$3y4C9(F6-0DXicA~@1mut(HdGC;an)5%1@62{*4oB*T z*U>8|6O|lNh1-PNg;OGLnP0de+$lDZZNSE}?<31XQPe8p37(7}2)yvNai!SXTYFhb z%uQ;1)#+6YD*vl+RE)2jQ+1>Iq4AArbZuknGe@O+xmW9J>o3MT(gJ2UmjKmAS_*cH z_sZ@l>Z#7CdqnrtFNhzR)F9<)+LtUWzfWOKQIF#OrQ_bb?tlg zcIAB8TEQc3QFv%*a_AJjfoe%6Ln?c-}gHvnJGNjU$Z1OeLmc)tahvmA9+r8-K0IHdk8u+ol6~yU8u^-wXD~2M3|x z8@!rI2ww?v;XBMbK7iC0kivM$N10tI*Ff5f`WbO(Qvb9eS+{b2}mn|4XRTTw0!iYJO^BTYi?02W+I?xM|ZFc2bbe{G{QE8cEA|=LC{4qQGP*H5k1`SFkX=KI)%+xlG~@C zq;OoJx=2*KuJ~qAB>zy>wq!x9C1#N3U*$t_BSg;OjD(%Y42YyhikOis!tLPFpaF;g zi^Zm*d1x4|!nR{(6cqJiA=`9nWo6Yn<&*+d|u3>n2Mt z3t@>^kJ3HHC?=JOpbd%1@uG?O5@CrVTSWG>OoP~-pt6+jCPr5=m zGkTl8TioV^%#>M~*YdU$mKMDz+EH@7bb3jT!hiDCW=~8RAH#}YU`<7n#Vrvjy)*ET zIK%XUy73p;Q`{f$Ozg3+M*Od&oA@6=7wj>14toptWo^K__>+tej`Ch`pLc(BeYan= zd@)1Tl~$c4P}97|U30zmO6{WB)3sXj6!SOpQj6N!(mKhC*`C{C?H%mH9s67#Jso@z z|G&i4$U!Iz-Gv^-7K&#o??o$hGF_V99iN^)B&S|(a!!73py0pac|fZr6imy@$$XhG zOy`dI7Sli-Eei7%{uLU*TENxJ0EXjw!%yJ1a6e=kG78=Yt%W&c7BYZu&UB2-jI;?C zQLXTsfnol89;wUb%<@Ee1+FyfYV%xMwez#1*6cLiH*K(J>@r(-v$4ir+t!NMTiMUq zW&_>4(DAD?)dhQ+`KRH1$aPdzXc+ez#l%j@I%xyBO&!oHlJZj8ByUW%q^t8D6}k$S z7Y;0%0XV~x(>iBk_Sck!(K_*W;Zk{&;snx($nx)_D!9j7a`+s*k$Dc;VI8s&s}c?sb?qk0ZQDghfj!Us+VsAro+aDb&oaS0 z*PLPbYT0HzV|#4>#qpoLkNvj2le3Mxx2LmbuIHfd8Qwp%nTg~2@Xg?7*mg;ovLZ?z zJs@VUVP0}l=EJO^S%RF-1%DQ=E|wPA3MUsP=1xw%5`Q$VCiY_VXvuZt5;{`UTUZA= z9cjkCg}0-t;0wGP8iqR2#mIg5F0vaPi#+AS>~S`Z4TW*)Ct)CxakD?uJH`EE8FAqwWsQC$=`$3ziL*=9d0uK`m|?Qq$A?tM#OHtYxuzt3_vzcb<0ka*CW$ zz!$vby5t$-JLu~OY>UH0VPpXR4B7(KgGXUkCD)ZE^*Hrib$4yE#Oic&CX%@(GbZ;; z;e(Pu>93_Tir(Zl%-WRsHsfB>Jta)p!F#b`y z&g!x@v?Q26TXG!RUEf?5XEWz?=RVhMPfLG!;C5h4U=e;UWae+996AnJh|CanSG>_A zMITWeQD$lrQ;M_2S^HDt(uBD+#V<>`6s*f0mMP7=n~|7alw^xZmJY_=2{*_u%NJww z!>y53{%KyQy-7`rCUpR^*QAm?T-omW~ARRHI=$ge6`lm9CH zzQGt3qp?S~RKFA^a0enyI1voPcethu8RjB8cpLgz@Gr{qx3~g$8a4{+21P{(YB<%C z(v$xLbNyoPPJ4Urtg zfwaWhV3T1DJ2E^xyfnO*k_5K7g>K3-)GKy5E#GRo*N(TKR$Hybc)$8TQ@Le{U2Gq3 zDX$%1(K%R`$#vV2XV*B?ZrtneJ@pRo{Peu`ZzMiYsdR*D5bDI#fmWk+1giwigq^WzEldo%J#Emz=!?P|49!dFkDP)QsuzOAYDqGvW_wwqiq>3A|Qx zP7EQd!zV%#-ifsp?H7{R1JsJDgp|0Cq`ROWUxyjTPUUZ~DRemS!GAY+6jui}x|cip zIhHvKoHuQk&7*7c%`+_1EPAt|c4KWl%OvY&Yh&v^>m^$Pkkeyamt6r6&A8;$dRqo3 z5!HA{{1BPS9D~bI17hMwz&Avd%1=>`R96&7)lc=6iODIBl&$IgvZv&}&rQgGTKJ%7 zRl)V#q+ChPx74$GMO0nQA?+Z|S5YSaFMm=vSh`hsioePX;8}FJ@T6cKV&xXI6Zubw z7@fv8BTD^)aWd3A914^;j$4Ph9{H2}haB^2@6;T$)^mCteXPrYHybj|H(#<=Sv}@q zHOVz)mJ7~Y&kSdpCAW6Et*Q5ff4KXR)n>ir5tE;(`}oCxjd;WiLf)b0k#a;X%$CKg zuBm^Cdat>mtuh>mU!2r1^-|iqG*|lh>@)cv^IPT=W&M_8$-S2Tx4yZ0RP>Bkk5(w& zz%=8c#Tt1z)+ACloC2Q|HWuuI)^Hp7HqZsWAD_eTV&+rdf(?ib^ezhZL(VVG_5O)? zGv8P{ZW-nn>ml9q?6b`eYS&pRt=p`9ExXKL&0j1jwqf=Lj$RJGowE;gPI8a)l(@S% zhd76M?)v`@boWdAyYR9w#Fz31n28aB%M^~0Pgb;$t`k3$XK1I#$0VGHT^_qGacz3f zoT9wM+_J2ktSNbYOD+_D%E;Cu(QD%_rCyFtmet`ik(r7)nqe}MZyCAI_Yr-RqT=!J zyGZ>=H6JUOiT%SI2Uv5yv~rG}|%Hm0&RV%J;%!_x(-&#T@1< zxJ-5=_Y&PB9iTj|@Jf3~?TU*rZ{yY_+>dRoZxS~&O_tj>cTVQajFcQfekdDBosrN! zp+&+1!z#@LWtw8R{153h@eNVAu#Mms%zEzJ4I zk?>iXAU*`sgENB-g7f_cJat{IoX?zkm&;M#cHP|E{EsEo_RtzK2Wr)pQMSuK?{5J% z)-}7-alyXE-pujSanCW$(ZM;xeaQRGcgSxDej~IYN8}4Tm>&xF#mc@kgf9ghq%rdL z;$BD=-w_&w{wmmp-Gkj+1~-Qn!`Gm7ToywC%fEBDM@T?lBL@;9JS(_5aNXa>ch}Rw z{mz;1xM)kW@z#9nSaWf0rg?~Ux6N4N@=T^7Co$JEfi#^GnyH46}akO*id)~T6 zI>)(QcpC%{;~nre_%O15crRPURd9Fsi^y-nrjo1Dr?PsAajO3``}D$ugrtERk2}g;_1ui(wr!O?(LKeN?6-Tzcn$uq_*+^L zp~KU{ix@dFS$s(rCA%RREqke^bpzuL#!l0BGK@-^nKdx)uk3GWhtpDX_(DPP%KXgi zkLl^D;^c`*sY!3+wnguiOJwzxGWB$Mg`f$t9{nNA6Q338F$vNWw!rn!P3Qo4G}|v+ z8h#upkL;v_z~7MjvjT7Yv%F7TYn>+NA=gb8?le0n`#Sq(J7eGIh<2ts%N0ON^qQhTAef*@IATY`&&D8u-K;^d7fw$!qWjoG#wQ_kMph51DVzTC4}gENyev(n|4$4Jc=o92I6vr>;Qur@?68}4MEp(Xn)5GZ(#G}CP zet94-u-(_$qj8UNo81T8TU@K0m~)JCAh0Soxq3LCJMK7>+~eFwTzy?(S3@`Joa`9s zIOg;^bq;~8#CFW_()HYR*C}#c_p}bIzyo+9;URwwuVP7%v0#g&PmOS;X~}u&^9V2WQcSP_a<8fqW$Xv`+_BbJg>xU zch$PPdbYV!T!iDJ$UTxYk*f4_&c}^KTh1GW`sX5hqzQI2HA?W7VVX6mZc~TC^xI8Mpx_B$8L=q z82=`bN^PH+oRyp9%=YFrD!7nG=OpLW%RQUfC;4Vvahxpfwzj>}AW4&akdBvp#*$z= zv>2&Gw!;LE@jbbV>;iTPyO-%3meX~qCDbJn!ZH6>?*LzC-+E6Q*D$BYxyV)QI_A9Z z?BsgnYVJ<==)B`Vlp)Eh@X7s*FWa}ld(`{D+Xv)Sg6<@MyO(pJGvuss(vC96Y3CdF zIPYVx&^OoL3=fd|>E$6?csko3+Ks5OJAxGPcd1n2R|=wLN1xFCuKz1GC82XtS@O!1 zgfw@0{mk^NJJ}6#&TnsZJ%!Jy6`-OLh<^%n>hq_BOp@gJ@C?w7kBMCfsDsVl32Pyn1{$H?vP>Js$ zWYl^}Ni8H_lUekt(7{kI`X$+xd_a~^i%ApSI5<4eDKIdg4h->M@U8Ye_qFsd@Za}0 z38;cK!JYUZVh7on{uW9GF@%lmWWEpl0jWg4V>ZEVkR_ZU>@V6Vc_+Im?<-#|-=$P& zzQ*{q3f(N-8vRT|nZd00>%M4L$GA1kqfV>Rlt<+0vb&Pm;whq)!V7}i*lmV89kLALeHlc(KzKHzY%?irbIHa9^VkW3Q$@CzXkUPI|uPV za`0R5EX_#7@3Cl$65$dghjwVTP-;* zJuiDA|D=$p8mSjXZP%1V4~r?*y0xoyXLSp85$#rO3oReBCFXkcUz(9o?bK~mS;}Yf zIZ7Dm6;kT40j1Vr)SUtdI)uqY)E1xO}r`z4zUT(#_hqQ!QMef z;6z|yU@qXj1%b(dnSnn76@gyCb3pB7V>?W2Gzk{b%g54QKEF^9dI&v0S4y4m_YA3xhv?{zbvW~gQ8u%3;Le&H5et_$la!?)P3aUEgA{=2XThbxdcpgF?7$I! z2Y(%ZwqN59`o03WQP01{@AuaUObxsUbO_?XRk#mtPwXH>VAZckH|YgjUGe|-8uBK& zja*F50iz$8PdbRFKt|sq%!GvOP5wn@QP-()v^?}VbSwNRqG5-FoO=WsiabF(3qA@v zh_6dzvI+9niYBT{YPqIY^t_mT+Vi?S`j&>3hLeUJhV_OXK)!a+Ptq;XPL1gkE!1pQ zTb0cf=Vh&=Z^S)C*9BSFDWofG;g@j{W=~{Hcv0vE%~N%$nE+)!fO9_X1v z>9vBKNp>UkP%c$p?1~DtN|LE@N?-@?U4vVwIHHhyVUoYMqH#_cYtSUCkpwm;@i!nW; zKSVWE|E*Lhrptava>VO}Cag7j4c0hAB4-jTz7mhaPY2rs zeSs^16@ig~)`1p*{(*UcivcPyDEKb;EB*%W4^C_^@*K&Ng+P<6qApWUsL#}Q>L>Vo zMV+FSQSCs?|2?^mY)3N0V`2}nn3x85bsce&h!C^MWXeK)q(6n^k;%a3Y{9RD9>NNA z0R{=ziv*H6Qj@Hk;*Qdw?iaO4vpM>onD<(*&a6LU=o3rCj)^-E*Cp;&Y{1an@K9f0 zKS9?^OGj_kq(z-mX_TGhlcgubaiaZ#6l@N14x+hnteSZfUKeUhr&C?XTSN&_hCd1l zg3AI00UFeFjP>jN9$$@*@M-)d{$c*V{BD0YQ0Gw@$O>)(r*bXs0Fr1R0ir2HEIEK& zO718B1zejBIzvE9Jzz1geEhun9@T z1_=HUR)|!RH0dw0Uh;X0)5_N>uUe$Zif$N_ueAbO+ov0$KcK&@-=goOCw1F(dfgoD z-k6=yi!^+8SePY6s1+z7~mql5qRn^W;_ z_)PpfZpAZ+F~kAlGa)4l0JqL1uagRDA;^<;q7TqKJtLF|s-_-A_Ao2h(cENyIbVAI4mZUZUw9B~xEh7AiK%JdzFK-XeqWHdcWC0jr?v++4N=;|<>oouf@uHr18v zOmxM!2ARP4z*WD%ztcC`*VHHUUG~oPw(}Nw8+zw^UxN%>J>M)}rEix1t>5KW1||mZ zz<}T~p!44cv+)u54*U@=AUYCriMxaxoY-?@kQ@l;xrkPTPJ{-Avm&0zO=c^*id)Gq z2X$ZDk!z?EixIXE4Hi$5jFOI$EtTI_gp`olss0%CQ}Z@@YfO&zrFN!{)AiHu(7)6_ z()ZMt>8#qRT3?JR#-+I(bx1u}Qj5`1is2s{8d-}_7bW`O3gugurX7w=Q}q`qR`dLIv@Y=%G6zs{c-SQ?lW z7!Gtyr{Ke22#k1q68;d_ee;M%M40#mNLVp7fx1n>bT9fJIwM4fQX@T?H1-PHpPR<- zh05V~hzy%3_)n-8_mwOGnbncyH=$g5c4tG5Y0qAQ{Pd2Q{GV&$!AEvif4!lg=TCkS_ioaHRIp0%b5C+aL7Tc z=>gOc5^xyN0bdua239rezv-XoSNN~{mioH-Qhh=18}A3N(HrG!>s#e}+{lop6 z{2%<;ft7)GfkdEp5d2SoZxvBPG$S9ALnxj)K-US~3$+d32{(_th)iOl+2`y=ZWvz= zBA|=#AS4;}pdYZuf{VfzoV#7Lh=*T`DQb&4;Fzm+RgW7LhK?nkLKbu^EnXHRf&MQESpA#*2H->d<{R&u;G6Fo=^No2>pSW5 z`P%sx`>*=-fo*{%fQmivfAM|tzN^mt(LT@6o-gd)E&pP3nKAqVsS@Ws#u zAZLcdL3j^R4}F04!C=8{!C2u>VUnn~=%T2DSSmRsDUhy{>SYgQGv!9PT2ZK&r$Cg) zl$okgs*%7V@2={rYN_%nXDda@*NPX4vx=^Y`SL}wmC{ENv7|&CD*`2ySP9k*Ek*7_ zoq0Kzz;1- zG2Ut3SKh(CG=ECK5X5i-SCPG_ZSMm!6ZJ2e`&dM@i>P=YZ%QB{?pcAsH;`BdI4b zikFC0;#;D5qF7*i#|du=RtV+_`UnVYCKg2hLZ_ff=s6?}IR*a;i{Yb?7@ER=;#PBc zAeY{kea18d7I~e>p)ecj5jskz(dVd6)MH?s>>)CU5BM^?3C;waK`I!B7vpt-t=$b@ z2V_brkSKEU61jpZrC-uLL*GMd!!09X<^{8c?Z*}Ja_9<_3MyRJ!8CjxS&Wuqr!kda zw!kcCC~PZ?7czok;b~!0(IU}eQ3p|Ta7_|T5seqk5*-#1q9n0Fd|xzF6fF`1R52o_ z@QiSlu(J>oZW0IudqI}^8fL@}V`>h@U^ol$PHxC~Q)zU@u2kIlp)*I+I)CdYEe*!x?LPC@Z)?%0G34gU zKy`$QtHW+%8ZoxWsK~LfB{VLS1U#mNv={gZ^{5U2?+_}Qss%P%XX*i!KsTbB0l$%^ zPlg(Y4~Bn+yGLpx7nq)GIh)Sy;u`W4e*n^eYUvZO0ojFU(cb7JbP0MMm0`WHW!Olp zDHe^Xu|%-?Tucl6Sr7UXy^8*hHU+pzM23n`HR=I7aU9u%%m!l$vJu&bJVL%A)kp>M z5kzJfBp)4)EI((< z=>Y8*j$${lC2TqK8^c77MA}A#k@E0{@W60FSQ>T#zwtjXDnfWDHryq=Dts|)4QEE? zMxIBs%n0T*1F`+tORSI^#_i{7xpaOG|B6?Ex0it$^1ARMP;qU6#h@a4EQm*xBX$sP zjYC_bqrqyI{{OWJJ&ImOZ=*NBTDPF<(1qvtbf#@)FFxnUFLKdn=V^A%c243TmWzU16dFDV+fLgAV@iU6kZ7TgR|iX^e?m#Y6C_1qx?udhPQCXKwWuz zPRiA=N7>)Od2Ix0c0!Du`M}&@4loOtzDzr&h$&=JL3AXYDFCAZ)0pYT38I97H}^(lyA#V;5YFXc{8634Tb)M-a=x))$0L% zD-0vq$gjvsf4sd28F8Cq571ZNr0PXQNG#RP~P`>1M0Gti^C_vB0+-9yXh}B2fuk3Ah zH@ghfvuCp;^Om{9>}S?6OTk#fY-Khv8$i|iHs%y_hI!09VT_EA5wfXl9^086!p>v& zu{T%;E8*&KUAW(Xoco)5&iOe#-<}`JZ{YXxclocpisKvhvnIHy=hnvFP z;mPnkcsG0*{tRTZ7|{W#S%fr4x+4<+_ijSUkR!-J68H-c-*890`G z!(L`rvs2k#Y+XQInDsLi%sb{D^PDLMGb5n(|LS()0K)og8+I7G3e@X=WPPlfD*_nj za%VXoSHh14R6Gm13^+a!Y6}g7);3>yZ!o$b9gt2)36ce#kRdcoz(3%p@HxO23*iw!t~Ugo2oP+7 zUO^|I?a)-vkN(>jT!^ zjqAYm1XXAw0F`Ef%C0}Szqni6TdoH5A&B_|z7F4%?+)^Rv-tV^PJSQY&~so9Pl0_&xkWz)em03?AWq+;_0*N8EWJN6NTG;8cwQGNlK=*Ara70<=8<-tOFRfOHzS z5Fp*do#1YAFF}V$Ek^*`CW+7HTk@Ux5&Uv~3x5*4eLvvS^ZXtD8IVbzK(@!lI{;b_ zPXd|D^PmF;^uGup1sG9~99&8$8eAGMQ$boV(}M1p|IO9liu(WO6yP}}Bn6*xfa3oE DbFHjE literal 0 HcmV?d00001 diff --git a/includes/install/sounds/en/us/callie/custom/16000/new.wav b/includes/install/sounds/en/us/callie/custom/16000/new.wav new file mode 100644 index 0000000000000000000000000000000000000000..26857c8dc2972b4dd4d73da6433056f88fca461e GIT binary patch literal 15330 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 literal 0 HcmV?d00001 diff --git a/includes/install/sounds/en/us/callie/custom/16000/now.wav b/includes/install/sounds/en/us/callie/custom/16000/now.wav new file mode 100644 index 0000000000000000000000000000000000000000..8309ab1e67068f1e27f94d371c46dd5a3340ac7a GIT binary patch literal 11934 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 literal 0 HcmV?d00001 diff --git a/includes/install/sounds/en/us/callie/custom/16000/please.wav b/includes/install/sounds/en/us/callie/custom/16000/please.wav new file mode 100644 index 0000000000000000000000000000000000000000..493c2c61e2f5acc45e36446dc28105c63411857d GIT binary patch literal 12246 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 TuCxIwR0ph24`ncTs=o4nRghXo literal 0 HcmV?d00001 diff --git a/includes/install/sounds/en/us/callie/custom/16000/please_enter_the_extension_number.wav b/includes/install/sounds/en/us/callie/custom/16000/please_enter_the_extension_number.wav new file mode 100644 index 0000000000000000000000000000000000000000..f8cfe9f7ae35efc9ad32ed5a31411be8e6d84ac6 GIT binary patch literal 128996 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 Mb?tk7onl!31M67=hyVZp literal 0 HcmV?d00001 diff --git a/includes/install/sounds/en/us/callie/custom/16000/please_enter_the_phone_number.wav b/includes/install/sounds/en/us/callie/custom/16000/please_enter_the_phone_number.wav new file mode 100644 index 0000000000000000000000000000000000000000..cb9f087422ca49631992e8ec8a09d35bd6f89107 GIT binary patch literal 105668 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

      BT6|iZ_nn<0rzl;LF2Qm|I$b_p*f;f3 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 U^)XJ1?>>_ja`;`PW1AWGpIx3#_y7O^ literal 0 HcmV?d00001 diff --git a/includes/install/sounds/en/us/callie/custom/16000/please_enter_the_pin_number.wav b/includes/install/sounds/en/us/callie/custom/16000/please_enter_the_pin_number.wav new file mode 100644 index 0000000000000000000000000000000000000000..8c47cb4f53d76eb8d7108100b5cce427c0d8f2db GIT binary patch literal 109556 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 T__L4i|9bWD$jAME^^^YvddmSV literal 0 HcmV?d00001 diff --git a/includes/install/sounds/en/us/callie/custom/16000/please_enter_your_pin_number.wav b/includes/install/sounds/en/us/callie/custom/16000/please_enter_your_pin_number.wav new file mode 100644 index 0000000000000000000000000000000000000000..24a881c9eed9ae44b0417890058375d138f48586 GIT binary patch literal 112148 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 z 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 literal 0 HcmV?d00001 diff --git a/includes/install/sounds/en/us/callie/custom/16000/press.wav b/includes/install/sounds/en/us/callie/custom/16000/press.wav new file mode 100644 index 0000000000000000000000000000000000000000..f67b0818be9875e6e74a331f44ab90d3fa707425 GIT binary patch literal 4840 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

      EX-6}eu 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 E7uhfa_W%F@ literal 0 HcmV?d00001 diff --git a/includes/install/sounds/en/us/callie/custom/16000/reason.wav b/includes/install/sounds/en/us/callie/custom/16000/reason.wav new file mode 100644 index 0000000000000000000000000000000000000000..717136a58d458552e0ef156b17e8e29e2407b066 GIT binary patch literal 16480 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 literal 0 HcmV?d00001 diff --git a/includes/install/sounds/en/us/callie/custom/16000/recording.wav b/includes/install/sounds/en/us/callie/custom/16000/recording.wav new file mode 100644 index 0000000000000000000000000000000000000000..bd64c72daef75bcd98712a7d83c754ee95e13891 GIT binary patch literal 19640 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

      xGv=(K6jGpw$j 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 literal 0 HcmV?d00001 diff --git a/includes/install/sounds/en/us/callie/custom/16000/reject.wav b/includes/install/sounds/en/us/callie/custom/16000/reject.wav new file mode 100644 index 0000000000000000000000000000000000000000..40e1a562aa3da109cd679909378e3ab02afa239f GIT binary patch literal 10288 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 W^!x=hu?aH$i;$20j{n=hAO0Veer;<2 literal 0 HcmV?d00001 diff --git a/includes/install/sounds/en/us/callie/custom/16000/say.wav b/includes/install/sounds/en/us/callie/custom/16000/say.wav new file mode 100644 index 0000000000000000000000000000000000000000..1f02f44d006ad6f84c70fe896bcc4f6220003f4f GIT binary patch literal 15008 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 literal 0 HcmV?d00001 diff --git a/includes/install/sounds/en/us/callie/custom/16000/scheduled.wav b/includes/install/sounds/en/us/callie/custom/16000/scheduled.wav new file mode 100644 index 0000000000000000000000000000000000000000..b84ea80a7ba1fcfde91772f4766e3767b317e5a1 GIT binary patch literal 20662 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 HApZG3zP%}+ literal 0 HcmV?d00001 diff --git a/includes/install/sounds/en/us/callie/custom/16000/snooze.wav b/includes/install/sounds/en/us/callie/custom/16000/snooze.wav new file mode 100644 index 0000000000000000000000000000000000000000..19ad1c21a75d6dc560169a9b50b6a27d9879dc16 GIT binary patch literal 41224 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°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 sxBv<5Aigt`{;}cmPqK<@67hZ5 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 JTHS28{(s0s%SHeI literal 0 HcmV?d00001 diff --git a/includes/install/sounds/en/us/callie/custom/16000/this.wav b/includes/install/sounds/en/us/callie/custom/16000/this.wav new file mode 100644 index 0000000000000000000000000000000000000000..16571aa861db86cdbc01c4f7f02c9980a458ca88 GIT binary patch literal 8160 zcmWkz1$Y$4+n?Dz*SHfU?zl8qi(8;rfdYZzP69>8 z;D>^ug3IL0BrqSW1*<>__yz0+C&3-?52yllfCn0w0z1M%a6DW9*TWKc6kdRj$hZ%$ z!&k5Y`XEI6Di8!di0nD%=2j!VqW#*T5_g z243J@_*)!|U!$XFJ(`WaN8Qj@s2%Eu=AhF^ibvozcndy?YjGPw-F9#Zd?EB85DNRk zO>i$f0dGPl^rzyfUes3VIrV{RpyKJ-^lo}Hy@$R;pQV@3{pn2FO_fl?sgYEBYAxIk zbl@8H!@W@=nu-EMJ6q23){XHXr8RMx>^U?jeRo{A|#0k^?NaUQNaf1G>Z`-wd3DSuNe!4jB8 z4W>6qUQ0z;vSOTay6U-ViR!+xuQE!>D2f!TAV!0R~ z4&+byf_$TW<9(aivCL|(!rR*uC%<%;vH@gh$jm(RAz>Sx!wC=YTkaUb!lXTRsy z3NjI5Gv$ySS1eH6RP0kLD3(y8$51JnOV|dGm+L_%3mCV)w@IE#5_(4tX5#PCrwduae6K!!*(6tMsP0YON29hni+L+^DnGL{u-T zn)}&Qd9$*(a(Ly|%5k43R;j*p_)_wvw0ceL+)f9mUfU7NG-Gq)vAUnDgFpZA;bq0dxBcJJ74IvG-;H=5^>Og$lQm-+ zt;R04-L5e9tsuf<^2yp60gr-DhHArqjI>6Ni67Upb7I$|=#-bWSNveU%!M zsEf)A?4x(+clzaOb7eXBHMgAQJs+G8?Y$h`T<2Wa{*5Kiyuo(e?Z>WRJFpvl9)79# zKhY!(10Cp5bQX^B@$PZ%Y)>!uLVG_`ZR7E}G1dJmSG}*OIQEWz|I7PP701de-&#K$ zsS2-MS)bqZjcJ~3zcbr&k!8hFdY?Q~sZk|sZs{imriZKw3yFN)A}h92{I!;UCqGLI z$-J6Xl6@y@aC&9pp4h+^&ms ze{BBP@6*W2VO7!^ReeO$SfkAP!m-X{Vhe;I5F|0kv(;tVr}`)UAZTPr&#;T(0gL|F#4nX)0$67mCrxls-9i1X-+jcEf4KAuJ+6kE*_nPanjC;7phe4pZawH zX~AtnBf>96&W*`Wn3i-YrAvCxtZg}0b8cj1X9T6aNoEtik6s-1XP{N@QafbZV5}(R z)-h*^&1vlh+g$q?`wH6>+YCpp=NWsMTf)y0`XVVf3%Y=3_#qyNw~I5mNakO6hAZCj z(sIj?*?6a}W$pIrwqKT3)m44^^1AwXO;FvDhB(7kbAQ`1M}#ElGTFuX9 zQm-TgME4IL6*NxQS$+VwWuH0Tn_nA#YEEnBnr1h>Z5-M3+>m4K>^jGM&96WhE|T_C z=u|dUFEvs%Dl6m$$u@|^;oMAbinGe{!tj0L`nsMqyT5F!8dJqp&8l8s+gxAVlxLi7 zxoLmun&~ZLDZWb3qx~omzrv%z7H|&Cf{&;|NrJ3}V!!H~Hr)S8(2}tDC|gWW%eN^5 zGTY?D=f29BkTWOyTE_C^r?G!Tya>MT|4`Fc)_@wAkv@{Dhi)s2&l#7q*vc3e zG%sqbsXttIwzfrWY;Anq@P@c%Xj*8wXuCt=Nq}dMw=28Fr{IqJ>ew#qNv1Uen0yAZ zf3mZDTeuS8dwhZFK&bZDzVPcF+$zEoElIeSG$-wJ=FaSIbL=^LbAQhHKD|$TVOXZW zM0-SeQDP9+ddqDqjLt@`VQJGsW4*b`5^CK_V)$_%gBv816n^TFTABW-UgFozFVU}2 zw@tlU_7$uZ_WCY+JG)|ojHCCf}i8 znH$_iu>`cE-$;?7lh)%O5mF!Ki|E**B4%NHP@+2JUfQ1Y6{!~ze~k}{D~@>;851(Z z?+5h)*+DRjSNU?e=lniym$$3yy6Z9%D6B`z@$X<2RZGhyhv>PIgR(J-<#G#Mg;$FX zVYJYe%s%r5>jRtBmTQ}9U2OGO zMXT8|!(2jW&oq5B3~yf9e92g7@wXkcne4Q?H;ec+=rSqL| zqTzG>nueUF&&{t4LB_GhkH+z))22N04vX5hz~*laHY-hqrti$}%_eh!CC?gedtys; zu&zi}BdkQnun4^LR7JgJlHXT>3qm3yqFdBPca8lezAEuR%BIwsl=|d#$^RuUPT7}o zIVmIVT3E4P2aTYIU*{fMvaPpmfwjn-WbD`cy0N}N-nhEyq#@DN&h)dfqmeP5FmJVH z*=_be?I&y-tyPvMmH_K2>q6^~mi4C7hOZ5$jTx3Xwg!8>BhIDvY-N^mJ4G3MCYi42 zsh*{Mr#~9FFw7do$8?H6(sEStsMO4~b!qA8AsOd0?q`VU9aFm|G)626Jf#oRt90?I z-jd~bmgo|e3qZIbxRD-?fjQs`J_kEVLltKfZ{&XRW?6yEC|O32r?VxC=_B}(Pv+_E z8tKi*Z_c9H&2n5E?o8fejgWm9)xp`a%E{2`p-e(_ZZ7{1$o0^|B zzH2OPn%;D{p>w^beqPfZ!xdwWDc{UnVr?^Q$8DqSxsF&zwq0pkW-YLewRW&3TSr?z zSxartNM;Ci5A~Yat$amx4HvQVW$Q?L8gzd5jVh$MVj)Yh2XxPZ6?u{&eu$Dz1s zaWJ+adPDU3=nF08MC!w;gUSO=`A7Q|X(y`ID+VaGDaz%8WhKuoL!7If zRn9HWjgHgy-|V9t)10NwQpZ4Bjk&;-VH#rc7=iIfbIYcl4fpHL)D<=0rW1zGhR22v z#;+~;_Bhu|&pKAdzY&l)13TalX`y1aYM5HC3DaKHUH0n`=m_o+HZ(jdye{nL@ZiYf zQSDnii;_g`iJTtUGO{?LF8o6H|H4DVb_W^tlQoOf12vO1Lsg6{STcp05B~yE*om4# zf1-|oou~^Mf?3=duM@xU0bDh+)pOXr(o^BR=w0I$9G~n3jzXu^DRI4Xc64sEcd_0y zCtA$bJo{1GD$7ArZ&Pn`CrhEFv*jC02TLdOPsU=yZR5|D?Y2T&p0%BIq`kjum8aRe ziLK{2K|X@q95tk(GUB*54aKZCiq#%{IGzC!4YS}%0fnj zTn~*3cZPixIxBc%P;Stkz!L#&0`dbs`mfQSSFcxGl5bVKS7ghFNZha#lw&P^kIv(Z zpf3nUJNXCPW`2Y)i67*9z}#TIVVjtJ-f~YnZz5y!9`&4bhk25`+1^9$a%ZZu*jeNp z;J9SttzB))Y)`C1Ez8U=%vUV2)?=1*%RG`*ezW$scCmhM8|!d7XSf!*rnu*Nce0;- zYq>%`OYDgM1Lbf!^@g%g*>nTFRk~dstt?ZXQU0eaQ5n@kw8M1`y7~ICemnh_1iT4& z8;~A&E>H|K2Qq=(gVKZQ0`B^;x=3At_L920a=3hf>@|tTrzi}oNQUW8yTC~#L3*4( z`XCk*fUwvC{VHw|{Deco46(l`70z+PxtClk{uS5c>*#ySu4OMU+q@e*YEQF!nmgIG z!ZE_$-F}z!4Eos**pAp*+JCV7+0WZlcA4Xy!|XUnzRx>LT<=`>T>0+1o@LA$_7l6% zCvs36iw>c!XeegDT~cfHm6#-0+9>-@en|dEaY409Gfex9c7Qfom#AN=Z>x9d#_Qke zf7c(=*|g(yd-c=(?(2E&49zFCRP$PGQt`^u$`a)>MW(z)iloW%I(e*oxb!VOg+5Fh z>1O&peVq=VPr({2!RPUIc!yF@J8+O##?RwZ`1#y_zAe6R-$ACoXQykq>z4b4=eTFJ zyOXQP*~&S}sdQ=F*WE4LdCtD})3!(Ujn0RzB=-dOTX&+z;=b(O=J|v9$#==Ol)ngT^Ke&ImP26_h9cGDVlB8|U>>n7-8_2>21bcveNq^pCJ@oI(o zq_UNwwS0%{v~(Sbl(giAE5BX9X@GBo$q zTT~`hgtk_cnn&7k`W||+&5eiZnY=X)7M?%3U!b5FrIOq-`$~}J6;uQW?1ii?=vRIH_~^D zUBnLY9p!TQBb=IB&xHxϛE;f|n0Ie05d6aL^t{vq~J8|Z5!_Pmt-ptz>^PM#ni zt!!48s>ds4Nm=PEWlPN?b(yk@l2IKd7CKxtQ03CB(g*0v)gn1>S6)zlC)Y?PNH@xt zDzq{!<;GDkf)=S=U=QhP4#RmUm4D6J*&Upo-{q@f-ZJ^V`5dXkSPOHM{o;$^f_;B8 zJDDBqbf1~@?gn@-cp-a(aQho`m*LpfTx+g|{g%1u?ZJqQhTX&LV>Ywrd^TTe-$Qn{ zZz$<%BnbulEPjWuMC>f43Ybq7k0B$8c7KU^_y+7o+o>>WHYJrLNHfXg_TRLz4xH(ZL;cq3-e&tgxZyWk`pr7q$oK_kSFx^%f<S^WP%9I7Ij;d?e=;V!AL*7%JWu+lspclMsdeK^>64 z_)s`1{z~o{F1{3|i<^-HjYS8<)8db)GwzP>qu)>l2Bh1)2e-qI@net<|0cLaHXKBK zq?S_+&;a*R%jx!##gaafXY`MBDXox5B^&54x)Xhheojv#c)&XN4r@ z52uRYZBPb!!dw@@zZ5atL=h2KaWu|()4WD)LX3S)$HQdzVYiiK0cW#O!Fi|`pHW{C-+N(>hV ziK~gGcZ$bEuQ&+(fi9xURU1_)DnVrC~1LOPfH|kX*s=&T1CB}j#7TqURVx`DUrHHSzsW^ND|A+(8d31tEZZ0ZC2GYZ;MsHCKvEmVUAAW+b z;=geS;cGoXbqc{nAb=>C48MZ2;byoS?j!ipM<}PVsX^2*Y8JJdx=y(0N^ww4O(j?J zsXhc@I!c`--yO)AZPa#Z8bOd9tPpyF?QfSU+JZ>17-Yawc#&v}0nJ46 z6A6DcP)YeyP4EWUDT7|vj+#q&SVZu%6vA~s!q-BgtB=$_#VhGxcvWd4}M4yQ_zZ91c`N(if zVjKmaKHlAfDxomJskW5-hlRSAsh`O;2ZFS zNFV_&C%D~NxEN+Y74(PSkl9waldKMhF;E0Dmc1`(>`2!@z}=i_;#f4>mrq9N!o`VW03Jl;Yh2>r*zNOIjBC*eov z0=i9PvH&e5Ryh^-$G;(nM8e%WWJ7KgN>=)kr~OUp^iqV;IAX7hNJi_7cavI3z#oVu z4f}s@1Sd!b{wVRz1K=(wCHfu?q`-&AfDa%MYRG5<2g7t&1u8)cIE!$%mgJ~nmQ)FpyxR!+}3A5~;qz?{O9W7r!8L zGk!;O+z$KWOgxQ5ihe{ZS-200jcH`9CGLTHlig(8f$U`B8sd{>BtP}Vsl*|IiH!cl z#pJ30mtzs%Ag3bnIDCt6R*9R)+p877!T*qddP;os6OIN$!C256dv!G$}KjPQtHv!Sp7oFZ{E5zdE8;Q$y2Z-HfC9@%R{EWZcQcMXZM z8wsDUNW^XnJ>Upf308vzU@7>6oH_*t13i!so2np^KTKq<0dMeH{1ego4m^=idWg_> z9nZj%i44x*B_vMf5uSd;bMYKpLO4sq<*1HiipfNi>3BHai;oZ~4J3E`ino$yyu<0B zGjI`$t;V4wHc%v!%mOn2OLkA;R4|5gUUY=(<75mZdOir$q#tvSP`QG1WXgaSv?JO} zBTUL6o`O5!wm6?~IGfBe$@qWE%qOEC(ODZ}k-hQ% E0Yh0 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

      ur=IU{DYK?hv8T0C-Rw? zj_isb7Qgcg;I|H9wK10E(P2n05$;35N9=~gf){i&_9wlrJGuaYc0N#FXz_vkR-pvj zgKdCbk`NgtN!)krjl_%7kwIJ&EChMQ{6GgIH8>4&T=+*kf;8Z6OM}rQ;e$8=D+JZk z2xOu332_K(#WiR*aSiPB93#FB^V$jK;vKruzy@fUdbW;X%+8NnMtU2-xZ-$*miZQ#GjC6%7 zl_exgDdH-=n-DLmkptpkX*RYTRB}_$jhGT!jI2f%p|#;Y{tEBNyYLx%1N(%pkOj)y z$?qx-$+Yq(at7}VpQEXO|70M&#TYEE8uj_sBX zrt!uVm7ObHRn=8D4gZ*CTU0jDxyqZ)IK*(=s_f{W9db1?IH_Ic$yzh(RMs!cKbAeL z=FXI1VZZ(KiZfI<>!6Ae#lOChAGM$Qf6w_z7H_M%Xl`RQ+b=tE91pG0=1t~-mTYsi zJ%U=#{X#9iY-p``UDmMt<&AbXsFk-MZ*f~}DxwLsis{0}&|%&r=X`65d8jeah?#FXMw3^hYR!V+8nJ^iZ|9@+J2u+d@I;-+ zT0c`P;qP>J(0iUb=Fa6~e{$bm{+L<(Z|P6NOWRTJPdbN-g~XR?W+d^`ljCe-J#IN? z8|B=i7_53iAu z_)o+yeSN$((b3k=z!YEmzVGMBUn5G?mD|iyoT~uYUqugx_2D&7vD@r4+vK(#jzR7U za=S1<(b(^C$e`$gjKA|OIg@IP%~j?6PB<0e7gD7?D(>~pv%fTTt9V%wQqj&>Y3OLO zIwQy<-p`(qq@46Rw^*lJe_Q0{B(uwY!22KD2Yc<)D0Fw6F|D$8!v>`VWwmzK`jj~# zYQ0|%B_<$_uNB8i#{RDUG4}i8-wH#$YLBJNQ_l2b4pA)`GmUwSR@&;ZHZxy0v5t6Z zy$~+f`D-GtCby^=lq=NH*L|ML)i|2^HL9zAx#Aty&N;@gp)}z4r=l}O%96s$!_|ka zRn9lw?WB$915;*{Tj3aOFSU1bJa_t&clb0}bD#X+J~1H~?eb)`Z`Vk#eZSVzL^|x4 zex4c^bDZ-H8!8LRoImRo*~=VNE1@y%0Hnjsr2c|+wVgQRUhTMSt7q@y2!lM{4V<40 z^Jy4#JNj5kY_0co>gE<^Z_Ad_4n@B8UnOVQ^Uj$ScYj{^dG-7FFFU?BFL_fLZSH07 z3MsbTp#QN8HHw_$wmahO&1@^|9bGrPMsB05tBZ2_p4WFkIHj~I-tLq=eq1Z>006nbZ>EGJF@Jj9EV&d+>vB! zzO!tU&*^}`@CS*YE${n^7RJ9y3N+Y zcG0oiJ;5F9d<402{cL$w((JKv&b8h%ObcYDs#$KhfPA) zs`l%zMeIvBli4-*eC@S0r`EWVaU@}8*e9P9d^_9A*}}M|d{4=R-z6ow@l2Z`Vd*3BzKZ40QW2%NljF-U8$44o~*m zCb#jeJuA(pE1#79TSAp6%Jx^}S7%w5Il|qqJOhYiGK!o;sENnkRiMPKO@CrXNGD}F z?N{`pv3M=tQ=*=aTiNp%dudLk;r{+0}oWYuXv- zF4t?zQPGZunSn7!oZT8ipFfO-HS<&at2%ig&m3On@BrmEIqa5}3){<{C%^_*<3Q zuR-vxh!642)2C)MNuyJYNlg5Z=$(N@>V4Q??y`5Loi-k_BqrH;|4f%wqO z48NJ=9LG%;3`WCAV|aB#Q?c1@>j+-$9iBX|jyOkjCe>sDnMrZ)T_O`#7wU*`SDxF~ z^T$d5!TZ&#Ckn{3R3KyK;-okDTD4i16jVPVIPP@9`owmL7voiN3DNaK1N2KZyK$Cp z0(&^$QdHf`c-2tD_`+Cdx@jS7{*Jef_0AaAeYevy2XMhqc)cK=6sxdjN~ce$zHR8D zsMI(^LUv+F{K>e*F|vr$LC<_YE1n}W*(|T#G2Jr7L{}G@I+!|}GpwX7({bIQbFOke zcCB|;x#xR$ub12i-LNO5hO*sixt}`dzp&de2a@V1*Gn9hppECE72(hQ4Jt1-jPFVC z_OmA3XfQl57^?0WaMN*1nthU^!jbP9;Ti0eyjO^4o)vLNR!D?jJq@P#A)X@pxtiK%Tb7#g zsykH|n|E2qK=%DrXQBIqyOA4#JExQ9gXgw)E1AL6;J=D3Wn(nAbjm<6>_$vNoH2HK z?6H`#s19Lw^#Q&eRA!W5^N2aF(e|&F#^#l#edfECdRC`(tetSIbDjj%(!@up2czdkHHq>IKOMNzFI7`hMu-l2h}Z6XY>&0g zwKN5!yP18iopZEsSzUA8pWMSd4?P!%S)jK{We7e;nvGV;T4}O$4!^>{&0+l`hlC}B z4TxwTwltu>&gFw>{=z=-v$(y~6Qa_2)v?v})w#xb-uB3S9X>^(+%`D}g@ z;66izrI7mfS@I&6A&L7mX2<3M>a_)OtyIuyHXSC__kdJwgxOjJ&XCbC)qaE=0Sx^O zb7f~xaF2%6wlUz^*$kLb7hwcAZwO(GNQ>(r-Dek)k1j-Spe!1WQD`wBDrX?cuNm4B zZ47RJ0${RdqU(SKehTQyV{|+4^0|NJ48RGju*FF*DaA>3p)qa-cxAQVuUHAZDFUvG zp3w4L7hDIyfN6b&Jvsx(+$EUrAHdHEILj$$DzLj*Xap$AAH%t64*aeWCg*+d=K##r zF95rU0*A;{n9c7(ngIu#c?R&vslW@T!{0K2WzGYxy*(g7CdBk~CB>mqQmtb+OcIN%X9s013rnOX^`!$ZKcO^|4)1ZRF0T!nUU zj5C2Vev9scT*C@b2fT;Z-3#050Jx7A&e%@S7Bm2q?knIn(5VOL3<-D1pA4=6aK78Y zwBHS;{S3Hod;nvM0Tdw>dM<0j-&(=XyTLJy1hkU2w+;Y5F z(4b=>`{^ol0@fr~NY98G%mU?8;)kXiyQK0r%l z_n1NIZh~F;H{7Gwmn?~ zZRk2ky&H!d#%ls96oO?zHe6q^9BU+;Lf#3{&<*-WPgBjC@P8qrPlle6CZN1P!*zZm zeiftfo$L?rY208x;Ikn)q&KQT28!9T|AcMg1zCG(idoGAv7A8%J1TO z@Y;M7y9i}~T-@U#044eX`iHjSK>VOImTd$*0FQ(M)Fix}P}MggiY|Ej|&~VAqj&{ubaZ zn*h=KPfS9WVDpjw(pt152AL#MU(n_l0D(74w-E-mbP>A4e_*eqY*B}d{C_e=kl2Br zDixv^1(SFSFvD$tj{cBx;0YZLtxHkR5Zf0Ju0+U}jmCPwy;~3XgXidEeXb^RuWG?@8AI=b8!_W*lI!Edh5O0SPI8i3y@!h=VNFd!YUB3TH(lvI)Hcot3_z z6KshM1O)y(whViNIzWkNg>1-p^dq>fzM_Tbbz~Z#-Yn#m))PkXXTeX|j(2mr`0hem z=-||e4&f@K(QN<}@H?7;H^k#`1Ab3dU*1<O0@*MdD+yPFhJeQ3OD>(2Ci^cIn3W)EM86yunBi?31NEZ7^qGA2CXYoaD8 zH>pn2--&VI3w)O28?Z!vljCbSUe=)eQpvpUKfbz)D$AZ!)iXs}OKqQ=*NMr@9jXph z%np(5Q-x_C`O3o1#*Ivyou$ry+VEJ;_Gnc=W$<4AN!<3znq|3$c9r9QUicnT5$pIu z77I;edsMSkH?+mt@rp!xxV@WosO551>tAP!AC!ffuh>6$mvbzRYU#kR$TP7Su?-Rq zr)1Xnk~ul{x<1NR?>|)=DA?`8Y=;~&dzDczsBL4st>`Jh4CYARgq`3AyT|@;r`jG{ zZdt}!icQ&;XSTK8d0ZVVUtR#K=l-FeBG1Q6j;&0s%+5_;6na;^Oq=9)Q?b%xG~P81 zwpgp1LMP*D^FdcED@qaQB5}QR4Wsde{5f}#^@O#JZN6D=@|w;#s=S@~&)8g0Y@Q5U z61gg|LvnehCGTiXm$;F>-87Mb3S|*aDM#x{f_6t>3AIxmX2s^pb4rsw1ugP@==;$J zMW4AsjMuCD4HF@2x}NEUwG*hb4?&_-PuXp>5As$#!*8VZgwlNmT3wQDOI$OER!lGc zB#J1*d@t)ihA`p&G4JF2(zevB%=|BAxqrHLjP|9fgRsD9GQ>mn*p$lG)#GhX9I5WR zWOp%Mma1rpzmbOWCCoi?xu?Igjm==0Vx8v9CNQ?HP=vgdeb+V$TpN)Z(?db0OT4jBWme^j>OjX`kCN=nG!ZA^9p!gr-B7jgfXegufWG*Q z^|?9H^3`_MGnDBqR-ieG`%NIu-VkCD3ambr$ z7W>@{S|71BhDz+5o|w@racO9X&I!uaBphK$$05_zs%xOa*=MTlYDh_plUoZo=?&!t zA7wEpSAnut=!@UBS6i_45?5-9oh z*Rsk+n2z=LoU|=9mzkbfgWXN3NcI`06%#O({JOjiwnDf{J#$;_TH93XXUkyAJWCUM zmHRkT2N@!FC~s-D>sANN2+xmR8#5q&W>P^?Qp}Rzrhb>Tp{gh}liA=(vc9a|P<_WD zb3Gz{LYJmmI1aAB%jgX07fTYIT^aT_)=}0g)(Y!M`$ty{wV(fuzLvYx8r_9}jv=?g zeWO;#7p8ql-<9w*WU20_wo21W-jrYBes57$i-xJD)pp9WlR8glv0a3>=q0=mlL-t- zyUOk7Y#wVzYl7tl^wy)^CyZKZg1=JE_3;Tv4&5FZ7_&MtGxI^#(xfFJFMPUbKB_n1 zb7_Cu--gze_bQJW+gmeTZHRYNTh1aalMR#q#JUM(R9{b-gR<((`;DQ7%?6q2spB!- z3>~Kk(N5Q&4&NSIl%P!-oiRN3d(M%Bmj1!2R_brc7W_)v2V0=fMWv8;kY*^Z_;=Ce zNdLOm+bpJC6EWmxWstHo_wJHpSj(2WffVjPM~TcQd}H6enskKjj6aRcMy+ zDflz_RI-tw(iBRqWk0x{Sl-$%dKY>hTBXW*RexIpoHfjoE7zHqKu8qnQlxOztSV|yR^WO;MYvx%YEh4n!{Q6qbYtskw{@iH+wUJg zn^&40PR|t2An{#5$D}ps4>K0kI?!Nk)4Mez0-9pikk0Iy>dd0srFo8t=id~UVBeIIcFd#isKJuG>AjW+pT z>T2t(%reFX1nj||(WBh6tjDS^ST1^2lQYN`kX+%SpSz5fcBZ*iS4+42TK(Hl_Nxl9 z)N#)eS7?WZO;7w?BQ3v9z2kMua=&Iai8RVzFzYyaJU+2BS~ zI0U=Oy0|K|d|qW;@^ce;q$8Q_2%c23B;hnhmeB*n1x%e3`H})ur;+W@`vfeP9IkfZyW2!^3@dsjiah+Rcr$u zJ_o~Hsqb>7f|R;*>TR#!q=ww*1l1vOWo*(JL+Yng@iZI_r;$$(~S9sGgSx58&s86 zZ**+)TynQ_4oQp?Ky;n+o5d{aXv{^<6!Q!f*N@r(>}vO^DM^?=TT=fZzXZt-QKyuHpAjHo;5^Ot*O3kZAZ)!+*&m>)mEn0 z&(+s`m_IIeb^5c|alzF}Kki@mC%en^tun7_zVU5!Q&Tg`I_pAfx=mx1na5Y}FxRkH zEd`EnrVwkaZ5+}eZe4okTFdejwSU)apSChOE8v#$ggA?MZVNVlGww8AFoYU=T0Ywt z>sD(4R3=}r4l<`%A3=9koTD8z4fU!w1rCdhOg7eNSc|CHswSPuCf*2p=ciT<;&-|k z^YSXOOjmllq*J-p_@KJl+!g#$O})E_{!}KYA3xDyJS2z9yz17vtAY2z{iB=2{hRnU z{(4ORC}rqV&2$b~NnRtr6F;CmC4-XFeVK`j#BG5r z@Y9G4>xxg6&sDrv&Q`~$o2qGbxoV8ngX4lOIw< zD1OLkxk2_;RsszOZLx{a8h;n^zyB3>2`l+{{*T^A#sf>ppXcuLKlln>Azc*?z?{4l zX^nqIAL4s)77vtP#iv8F_(!}qu#cNDC+O&BfKnkDSWp|x6G~yW*n@vBgbPdf)j}dn zE@PnAyqg$=Je2I9%~3;3`$J5^VYZabz#icV(A^%7pFsv;<9TJicNc+T|$R+*| zk_jG$AV_z}g`9tb@JeWkqzg4*!uat2l<*bkc7($}iPd-v`bF}=--!X}7VrtY6QWRq z@LhT@Zi7a))iBXq=cl31L=z;nA3_?4@1bRWGhZZo&2^BS6E~sb(MAXc4Y4-NS4@&! zVXrB!GWRg(`4Q@1&)9|dT3~)9;R`yHYlvq8qO%7(2|ZoBm<98h4!bOFgSjveaiGV9 zhuA-$NteNd+XFo%Dj>mqGGyRChjgY`aTR)*{|jp?JOT`-A@WuH1zw7=(l*ezzeih& zY1k9MyhfmJ07d8r7>ZV$0xfWI-XFU!ZWgPgM3|`CL%wyQ;70fId*$uvrSksb2T-o0 zqc6nGNExaVvShD?1oW%;1e+*41=hL$oS!jy|h#btxkRBmz5V~VCg%Oa*{TE^q z8p28-S+N!SHe9-EoL4XfEzd+vRd)h z8>HFBt!FunoKm9WWnt_Wc^e^3x+J?PJ>!BDp^(vVAAiGl#s~1Jvd!F4JWo6Z=+7m{ zswfwZU{S&pyo75e-_2R^xnc@Z8}kv~;WQS&_EK;#(P!bCMHRLL+7B`@uee>RgS`_* zBZFmUxJmdetcN%TKP`Pk%fvcZGjKIHMG`U@DER^ib>$*`*WtcF1>0&%5z0+zIgoK8Y^CYRN{CBa}GOiq2D)@N>A+ z>ai@O%PD@d&#@K?f3{HB9h<_T>Ux4hx-S3CJ0KBD0hm)$P_>N}6R`~bCg7B1EG?S{ z&D-5%f$Us#3Eq8;E1r7|1MJ2Y7^D3WMzbyP_HL6;i~B`~pBd_wlcU zNkXtt0GN%xv=1idI6%&hpp9g;@UO^1nFCj#QHmRQ0p?U>;xV`&e~QJ(0_2(KXsibG zx~+uniLv~2?gaaj!st$Pe=?9tpm$J<=`<#a>jfB z@_V{YVMpTLWTod_soTB&owThHt->9e{q8~LmWFBN56kY9zqZWd9>_myR_RN^0>eY} z>y@t%mR@fAw_97_fJvXp4EO0C_BGIi*Npy_8YvtKr zAAb+19AG-=s9?>Qzv`=eBrcbfRHFHF$+X`!idz-cEUB;_V)B(9{ebvxS(kFvxn1(! zYN{jjmBl zr2tvn$|_Ii%SzXeTGuI^5 zk@umW$=itvhrf3XuU1%9>GB-K6@8BG0Xm1xX1!#NLtlN!^u|%_tZ>z*Hv3u zdc=s^gC$Yj1Z~MS(G3q(soJt@z=O$oea$th+?Jc}>y8HY5zH0*GnNhQ9Qk56v(etB z;&j>9ieIH8DyCYBJ++yB3PM*DP%HRE{O#mxDMd-U(>A0J3csknEe>I-Srt2uUWo9T zOS(vPTeYOxstl9v)3ty>84t?nTb5=n&NGVeU`;9qeVZVb6 zd+htYy{QuPnR~U5>^IG~tFM=vev=h{TYTO7y!*Hp z*dd?Uen*0m!k#5!=~6nGTCdit{4IV;o8C21TE{(fjiOuo5W&6tJW^Zny*OeSVN5eRi3UEZS$-lrZVRjwg_!MH zLg>-R8?n*J8`C?d)y;C|bP1g3Xzm^_t!HX^YYCUsRr*xjZfO$V6(>ZiGuFD%5$GX3 zq3&z$Ym5_`fSN$plCLn6S>rZYkC_@)Z?5`W5n*cWYEO=(^QAClE!}f}G6;{j6*D#_ zKjA^@z|4~w&GpOO8gDPmB>qbU2@^E61B!gY#e6$`lion|H(ngkt3pW6aUWGm$5nd zUhp{C0qK_59T=-zWQVebnwAZgD#a49fScgy>)h`g=2SS$jt}l*;6*wII{tRRRL!9` zcvrew*jriJn#PV#FO@FpN6>`jC!@oai<+P)+*q@H{ix*O5c z@np5|pX`JD6kZdJkiEusav`1}=?l*^Jkh zUqb#vui}%1o0OjUPTqATI@dbuxkkEoyQg~>!pgKhd5e5Y&U6>sK3nHmvn&ehZ9DHB z$vVaQGKbFv{lcK^u$nQlxW0-0sl$?b#61g}tZS#@@IIoKPZDY9&}s_2%ok*|IF6sd z{ia)aXSkO-e^@WuC%Ht&1Xn(_kCq6GUQ74%2D*AW3mr1sJlhaQ7BP!?!au+$4XQ)* zheF~avm)=u?oK)wS3l--SPlPOzBM#;kd=_gbXGV>>jbB`n{CB6McmvbCYSw4{&bgt z7NnJ9mNU(*_4FcI(d(IQ%nLS?o6W4FhtUYFp_1SesS$X*&R`d0=ar#aneSL#p}u3l z@__e&mx4lrF8djMuj^iE*2s4#o-0;iAH{TFbO!T*Y&KuO1yVPuz048viWj;W=zio} zx+zzOH8BgJjdv2emVLplX0-H6rY}2;(Qrzkrtkv1KyLIk_DuFo-d531iK_fmcBQ{+ zv~s`VF9iX4nFnRdW!Lafj6vg2Unv7r^%&$~-KO_a8%Zy5h1^Frr()*x$f} zeF5*M4*oMiwxCPoA=RrlO!ZxF~AbV{L_%tQy7Vv)Gq*usdbTP~aGth%b zd(h0A$5A{6ACq36#I5KvCWo{F@r^;9h|=u4B-?^i%8uYVvQuhK7N*Sr7cu zU1=OLA2OkufOEDI5(>|VY2YA81{di9(70>CO}h_x1}*X%7{5lq>1_lT^a@xx4TWQ^ z4clrC3g~H|CBFvwbU#6_9F8^s)^{$ju*1>iuy)S_73oz_AdiAG;0IGwDY${}ibasi zrjphH_j3+dhp+IoQAt0S#`=8VMRVbN*+D;k z98~c`pzkIXxaC0bC!nx}2vFs>2QR=>U_P!vhIj?!2CE<~F!BE><$Zy99u6IKqv5O# z1=e>CFr+>I&%^eHtI!Hq;8bAW{b2u%pdEhzSS9ZrC%{iM_b&Qbt) z(2t{Uz&);obV?Rx**`9VgOJF02V56BkP2{zkB9GdhO_n??y@1!;_D-zkf-~IZz=Ua zw<13wNpA}z_V+~c;0{%ZKlpvZLB5IT4?6QpShAdue^7u9NI6#ZOK}cTL?7Uvkv-CO zk%L}FoSVunXHPSM49g6J%(qU=F6I_fi>Xi7ruTq9l&4zL-{>^(8J*<{g^S?9(Lm}z zj{KHlhI)o}wC_XR8^59Yrvc6YEU-1?Fx>U+s%|cOf)yY=;W^}luIKI4Px1$~kNw3m zY!!TtOy>G<|3GpJNxz~#P}TG`CV^YT_Yq>j5q@77B5dNrxm2bFc>dlH551GTJ0L?N zo8g$+q8+^fiL10GPG|A2*7pe-6k0d5Psskz=&&97KAJnK=L$7az_x*BU30o0ah%-9 zzGa&;+u1h4CElM6V16;Zn49EQ5@%A`xA6V1e6ir*k8!s+o*hUZCuVtfc^OZ#C(OHm z6sSEcG}9qb7%xvy*Yv^s7V49N)S>ZVo5SZvZj17dUKvu`Z=}{0Fv#-bK%$GKqo2QgRJdOrK!7af2ZP@fPQ1GubWlVIs}*-Zj=a z)^W;l+2!@rCoCki_DRQ)U~G!=wsxnl%5Qc+r(jL!sL*BMyCbhfY9f0Fhxi@V4pL+w zyZBE`8BIds@oQ>7bB6iMcHw29r6i5y$ZOau;cBYBf5qF1mP+<0*0GVDBdDU(IFrzVp_$-|IeqGrSR0_dyj zD=gs7GpEQ+Zs;tvT&iwpTw-W#j5kGF1;=N?%RNJfD4XaO1x1JNh{}w6oNzE{XmZQM zf8v58J%OG5W@uW-E=WK5Qf>+)jnrqa@Td8Q(Ax2nYr(B$Hc@LxKXMmwn%qh!a-wiq z8V1g!NoYs09Xp0pxUJT?)iVt@tDaO`EFWC;tNMoJjy=tr#U@DQ*al^s&mKJyEJWOj zGba9(yg6fV_K>vqF(acUhcD1A#^hp=5W@s|=6ffzN4R9b0$YR2s#;tl+!4bCe|jW& zkS<{y^fu`TMLdhXoUlD*K-%$)9$7xgiYP3!q5l$vM;J~s#B5K#E6LN6>cAud(svb}28EzF zBH)N6az5z$w6I?2%_mAqq^ILntq&AS-$?n8;VmdjU@@G47=eb%!4!@G!OO5xi&WpAurl!^Rs~?-fEXlTP zSB3Wiutc05x+Zv>Q7 zMzWq!o^nXH+wDyvm2^#(=O%!Yl!3-S9sU?!C6_Cc)a|sxb#wGhgPw*Q4nGx{9~~2O zJo0ncG`&ilC{IR~)8XDZ?na(#klo`)E@G8j6kkhRB6StRxSPxidM|OwodNpAmEIuY z0acd+rzoUT`h#xe9zT)a!8eEI#<_eWQ3)CZ7cv#l#Z=iF+)uUz_ru#| zUoG~A#(F!r7rJVn`PTI>4;T_e2c`z@fg*+Onhe~Fz7jdR!Fvo0UHdP2paVjeh4wh5`=AlwaJ!FPZk&H^1xOY}Q>6VzWTuKu{4w5UZj{+V0-#?=JDP-!w5x!xnD4d(WAfGiT=9|9|F$DkQUws4i74 zK5egJ^?Q2t%+eL6K?T=|!5{Dm=&KvXP}Pxh#Z7T+mVJI0yfc6%H2bR6&U8xM@ti^oHn&oA`rwEEla+c;7u3j}tN4mOH2EC5T zF-jj)lc!cR+EQFqCSF`5My=C-ZVzCs9~CoZ-W4^DQhy*fVuxdg2;)j{cMpB*V+a*#p>F91pL;3_NVk zSK?4j6UXfmp*4{0`7*U!eI?EfTEj^mG1Jd<3tDYF^Td+((d?b+&K_NLx;Tu7SdW7k zsBgPb9QdYer+|ff)=c9EDNb?8rifetZyz%UIYo*n|G}a_UDYxS{?Mx z>Zwz7x#wN)TUB>P^MWO^*csWCS#{ZMvx~5*w**@g%Y)~Qr>m+?bAu#?br;@kpC?)a znu7cFpmi8v>3{@g?dxhTE#Krlv5;gQLB#IG z@y(S@EtPdmqRV`KV;0LBmw1}AihO@3QKPEYtDYQHgh%zO9+w#G4B-CYm=*AnKB)78 z%G5dG*dRZ8CN({*@yz8=>Y^|VMkhLi6;YoU$%}K|D`<#H!bbSUBYK@a5akB1sZ-Tf zCO8_W{U_ahpLGT>9^Up~R21Au!_|EKVg74Vl#hLVJAICqssDh}J;r(-$1aZORl1v> z?QEqz7PWLrv5!?%u%B|7Y@xhtEgNscj*HmEF8uJ{bspI3SzoTszk7I#mC@^R;lb=a z?gv~0HGDw6xs_dZfX|z4J?F`qyL)moQn#?D@O}@-;ud%wvNXCeF`s=-HvTfW;1POa z|7=WmSxMVzvp#%N=DjnV&XO0B(;RmDDO6}5OzF+MSd;1st@M3=QLTa&P7d11u&1!O z4^!G=5{9vsVIbA+;1)3&#FCT zVilYCpQZM-w~gs}GP%@RthBNRyT`*k+bKEjbM}&Nc&s+Od$U#Z9c=R=mfk43{KQXA zxthdOW{;K}x~o=V=QiFZ4sGTR`Tf0CpN z(^-GqBe@<6KJH@{_d0maNz_O@@mY3>UcBi5r$CqSUuFJ3j0DD*af#m>?j-4YKfT6% zE_a>~_l=0Vqs5)x+VQ%vSIp6oA#lo+aF6(pP4mn@(y!?sWL`27_zxt|ihU{>!$w_U8x9|FY`>nqK`4`2B literal 0 HcmV?d00001 diff --git a/includes/install/sounds/en/us/callie/custom/8000/for.wav b/includes/install/sounds/en/us/callie/custom/8000/for.wav new file mode 100644 index 0000000000000000000000000000000000000000..5560e354765f03e0feb3dc345073ce71d9d3e8c0 GIT binary patch literal 5978 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 AiU0rr literal 0 HcmV?d00001 diff --git a/includes/install/sounds/en/us/callie/custom/8000/forward.wav b/includes/install/sounds/en/us/callie/custom/8000/forward.wav new file mode 100644 index 0000000000000000000000000000000000000000..b62b2d9614a3a012d3e3ddd5e6f7c15dff3e66f5 GIT binary patch literal 9538 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 literal 0 HcmV?d00001 diff --git a/includes/install/sounds/en/us/callie/custom/8000/goodbye.wav b/includes/install/sounds/en/us/callie/custom/8000/goodbye.wav new file mode 100644 index 0000000000000000000000000000000000000000..70a62f8fc1240694e96e00bea60eeea0a6718639 GIT binary patch literal 8970 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%0Dt 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 b{)lvda~;G-2(5(we_VxU#1>>G*-icr*~xYW literal 0 HcmV?d00001 diff --git a/includes/install/sounds/en/us/callie/custom/8000/is.wav b/includes/install/sounds/en/us/callie/custom/8000/is.wav new file mode 100644 index 0000000000000000000000000000000000000000..23a03929c89400ba6440d093a1f3c6c8e8812a1b GIT binary patch literal 4582 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 literal 0 HcmV?d00001 diff --git a/includes/install/sounds/en/us/callie/custom/8000/minutes.wav b/includes/install/sounds/en/us/callie/custom/8000/minutes.wav new file mode 100644 index 0000000000000000000000000000000000000000..6d12402c561c00f09bfc510fc592d02ebb063e5c GIT binary patch literal 5362 zcmX9?cUTnH*S@o}gsNc$?MZq+Ng&OvBENgbulnFuSSh{l6E&We)yb0oiR;eX1@a0hfb6ETKk2MAyr#S7d$ild+J~MY1q@W zf4!csEq(B=xTd5@+Es~6b<7eemHYj%@Y^xF2gD>#ProuEd&I%?dBb-Mw#1*;jt!mQ z8|IqFmsqzLUbh!D#nt&$hP?Z_?CzT_rTa<)-!6PtUiGDZTFa6zx#mSw9^X%X(aRoO zqb*E$I3z9gYI?&XkWTTmP1N z`>A|N zNex`T@}s`xhmMAxZ&28t#}AM>+(!l!hmGsIHvaFVfFXm2E*oMRc%?radpqiU$W5OG zt`O8ib(q_`vRcbNgw>9y@_T>govgg(ZC%-cim$6(8p@h4cNh(A#0h7A$v)Ls|MIX2 z(Qb+Thn^i?mRg!RZTPmK1p|i1zK-}gaKHM5WCr~Snb191_}1o{YwxGMn^=CPEV4{f ze!t>FwY8zW_dU>c!M`sole;4tq2}6*D_*uK#*> zojAiGwbXXnTb6!ouC-Mv-v__wxhgKbbhO`gp-fc`mA6k|41OB$`Pxl00G-yxMvVK1fOi7-dQjvT)Wofc%U_z`a z;(EY!b*7ZG_p@kqmd}HlKQ^4Mt*W7GZq$U;c-81@chxWZc)j_4+xK7A>mw{niShPq zu*PM*`XB#&VL8#oNxO$@QVl7eQ@#vy4Ed0>EAnTbyKW~%r9I>8e`pxoIR5?Bvi#}; zEsHyLcHZoaF}||o>#IA9JGbbbb#Kr|qvxGpTyR ziWW&X$xllUOXFl7N?K`Ci~Lsg{ySz?Om3n~^U0I)d>~D7AhwsJp2$YN!Jg5zj<3kw zG*7P~ADKE02YXJp#x{zZqnlrRC~ErL-mc$Z+K&4>CqNp}V>hkOYu`@)m0Dx`p`X*@n`vX$E~CGJY+2Nj+7;RHL(|RAcMT);55L%uc87`_NsNMrx#qh)^c)*G zyWjN$|Dj9M!cu3&t&FS-hTL$r*+J2?-BlN+&%ye28#>l^mFm-lTp|rOEVB*SrfZfl z#MkHy(=faSX)%5=O*2igsEsczUDh?$8;<{YnPjz_OdaoE5Yia_rf*>1pxEs($9wl^ zCxx%_d+(8FxN9rg(|d?i}0@^D>(1mNnfY?*^0%8+p0pr995l*FQOgj!f0IMtj8^iLTck ziMSaQ;+yPItJvj|FWCx@gd5oo=SZ5Sj#FJkmbHW!g9j0<_#0xlwbVMEdQN>Hmy-{y zkBQ@`(z40C);L*zO1E7%OSfA$zh|-O6Jo;lktltdKPpa;|LU>O|DRwc;!vL{akt{= zIC)&J=qC~Pg8~CE&sS=t>XN+21%Yos$?O|@qWzrJgm+@~=zeS!>WNk0i-_;7L&?2l zC%J=w@CoQVv)Q;qe_5B-J-SQXW&E?h| z=ve$2eiDnvHlqJnl1#<=!kz=&Sm&;e&z-}*$hr>dCKv;eW;D|pO-ttkI77n&wtMHPOI^3hH;e0`OfH)~VV_0LCoW*aP#@H6 z$wZvUJ+u$uMTS$DE!wWKhug#?iT{S|Gq)IC>EQ0PFLOH+J6Cpo__CwBw&#dZismBKyDvuJ|xm5aR zssc|$V=YfiPfRt&gN9PWX~S~E3&U}Pi}9(c(Y)27M{b}4u*X;srosNfHe!2(+ z-FZ4hKgUpLJc9&N9*#Fm4>%(WcP&y?doB*x5o`_4)0~YOsa+m;)B8fNIez1n6^dL{ z9}mjKEc#tGN}d39Gb@=J&Rh0(=w7UeTtTEGZ?H|&RNED60WsO$Nai97kt}qhWvsEL zds9z8V|~}J$yGM*96S4j1IqNLyymcV4m7Hh`Bc`Ht z_*=Zo7_84XdKl;R{G#(P_Og^Buh8e@UPm%(;3kSbNLmzKuF<|@gDt&Qg|3Qmi7N}f z7El+GRvKr-Up_l5#9|Pr_);1h(qnhoJm>;@{dSyFKP9P84+-MhS z172XY6SQTpxy|^(P^8b*UD3Zb?KSyXeDQMP7?o{b!j6ZZiesg?s@!X9022CpSXpFe zpI@}O!E=2k`=olgs1lUlyGM9dE3@UtT#S-G!7etEK4PCuUc$QZ0BZtH;djVg)N|6G z97heZ-60yWOZY5oFw$sQY+7x!8Mhh6n2If{ENZlhxM&@1+wIuOUlac(>rl+`cZjG$$hNX*b8}dasPI1|Re}>U~nJaPxBC=C;9A?ph!{4u1l{%v^etZLKwsB#Djq zR6-{F>k%@aJYXa2uc_129_xJkHFgkrZVEE}X&hy`YXP*^{tI&2G}5@+P;NMA+-r)o>_R4^6Y)Ai zX>&L}a35h(>Z>@b7Wp6nw?bA#*7dy=;}cgL-s~S9FvI(%+Z{!XVzir5UMIOC>yl=I z8fP2R>L7^{ODdt2*}R%4gxiRCNP1;fAQ@6lXj zi{&h4vx>=M*4vId+$T^g3Xvzeuke!lz6vZ0ogHy6vbQ!d`dP%1po~CY-wW<96h>LR z3n>{bx-M#hZ}I(|2kBvsWt2C52z!LDLgNt;7K3Yv#l%tT7~67+vAS40u?n=%Vm3-m zI@1f&BFiyUY5mG}&OV*_iSy&t@Nwx=naFjV`y@{{zaImS2SsaMX^v~MG;Sdy{lmN@ zYT9+O><{r=_=%_z+~Q5VKmXY2%@jJ?Y%9qUydLX?bt6}i)#wiF3ciY9tW{Jhb(|ba z))HIr8)yguAxkZ|c|YpFH;}y@_ZgI%B-#v1r7K*TbEqBD?dxnf`Pte;48|MLv*hsJ z@3@z%daKmRQrB||t(=lwlJeqj;dZDuSi$|}gqRDCRQpG&hx8=Bv6d0Dh-_jjag1;h zJFQ{l8*&9T+BV)E?uepCF?*bkS&CZ*cxX0!Uz{WLa9J%cS2$dIDPvWyRUcG#)gu*9 z`6&t4zZKKvmt{)nVKD^Hh4lP6?prp=8NeK*!{}3v#g1i;jgCJYWsX34H+_|UOf$3} z$1*>uhAs zFf*AD2B)j(`vUeg`WF2!-A1dJBqpDE&m=g{JN?;HYy?-#jpZfaHs}XcLrVnYT(}vI z7M~Uui|t}w>>>dYv-p~Lt=L~&0%yT(qS>NuXff0cegFz^ho8+mgxSyMytxkcCcB7D zW;tht^QH5Y^Qd#1^PuyL^RlxEnpY08EiT` zkd0_C8z|x0E}|{m1FJzWj9lAper5_!y82PJ#-+fM#wB^ zOhE>y19}PFgmytQq2Z7eDhCAuRv*CfZ-w}!{6OA=Zx+-!&u!tp=az8exXIiIZWK3* zo5Ov_Z5LQC<61cdpTLjiH}eI2C9mWAf~nvrcnCUx8#G8zX$w>U9f!_B_n=qMb?79t z7uqeXY5)`jxkELeP|$D@2p3M#Uh)_Dd_IRy<^y?xtL9#EH@KVJ3GM=SggeaTa|PTb z?wX+71Htp2`@oR`u7;1{r|`=KZlCiFyo2`v$zUGX08W7$;3@b|;JQmtm;#J27bDPt zYET7EgY94%NCP1PCc-!IclclVP5ig~M1BAt&dd4DqGzI|U<@b)AHfpP7i57UpoCY0 z2!Qk50;9gdX<%xLB@E@Qdt)Hg|!6XZ&$K790RR(AUr- z(GzG8cmyi>oxF)_;ok92`AGuqYVfTvmn^VR;9w=#0tmjGe+uda^mt+PJFrSnqgAL# zly~ycAX2Dop0D96_{Zq z2p-vFH|wr5vo^Cc|NW}I>UyhsYP$M)=jo}pyPs#&z#o5XiUNS~eaHPU_t)j|!2ke& z{#FqO05!b<00M%6*;UJ{YW-t;H0%!qAZVsPApfZU_eB2xSWSo>R&iiHrc7eM#PB&Z7>YwaqBg z?a@3^EmP_hPZT$lvFbFf&|oo7bnJ4?^__?L+^@k)BL%VhlUHN}WV`Ym#Se-P6%Nav zm)X$m_t@ECB|I34au2p;=Y;7YcbZSz zG-#8n&f7v&Lp!+%gW}~)TAE1{Rij8~p-}Ev1dR>@4S%1mUU@SBpH6O8vZM*GhXp!@q`zdjh zPDW}tEkPS1H^tpbeU#aeGqoVSU}Y|xwJ)tCp+!gq%9;7pd;F2L$kk~^K7vpzqk zaB$&=+=`z3G)}xLQX4pindl2Zl}4%B))geZBPo+4wcl$6+a9)}ty|izwg1vtA)6~- zqoOst3@nS$QSQm3E0}J6b9j$fNjD<1xnO-sUFo^9<7KVI*Yi$hic|8$+R)vc36vIv z49$w2(vtQMExW$2|CaKt>1+Gf+;3suOIp9RPmo@b4^_?9EjCfMN6t<%5~=2W5QIj* zPn?voBPXNiec7R256g#@#uXgz=}L)<9UflKBf)*{FP6#LEpnn`pag6;wry#j)jm)n zmslhlJDNLFx)K!v6<2#$f5J4>)`{Km&H`333H~qPOtC6?Q;+EU;Ns0C_e!UhY%bWH zeKEZwp+lG)G>q||_lfPec8L6Q=eYKBtwpWXt-98@wv%n|+7jC3?X4Z>WeT}KwNPs} zR9kOg_q_jtEKYbxVU##wK)N{RUD2*y-TS=mwXl3_NqGL^%$#l+F((D#oFUY8$0B`` zJfuU{`uY2X??KwTkFL2sb)R zvX_$mE$douwN$vD^hfdAB5v?28F#(c%zvvplxrmD*SOZ-z6O4J_VM1w znm5y*&VB#OyLlg1%LaG#H*WCFL2~$J;e+I<>F;~YF32u^UzAsLq$sO+VD9B)Fn(Rc zVR(`^#8GFVbf2UTR65NNd6nv_ey`PG9%`v@Eka8z7IQDt2E!m_n}#xyx@7ZaM-P|D zUFqRKGvF8S3XUt_M6fY}6Z;@_V^40*j>7otv#H92Ug6e&1;_^SxObbA#8-QA#35-l z*{_SivaCLDOXz$}@=xL6f!C=TSD;IdO>zP5CelFvNQ)>bu^Nvze=t1PI3<_cKDGbv z`|B2F$J4I!%0&HU+jLv2{iXY~M@j#}T+BNns1S)0x-y_VwBTcDVDYoujpA6|B<=;* z5o?F@Jl5!*LX3nzBL{)$@Bp#|S6S=zOSBg{@s35(>uphz$L)zSovc&t)4$Q)Hf*pj zx6dQnz?rO-L2}`>L~oiZZ&C62lA&cmMH5m>L}LU>D2zNseDt)Faa1_WW{43x;{lBO z61)e{@#am2XIe@Ts%TWib+vRgDrTyf8oheE?t|`>7PReiD7*s3G)|D|7^LMPlzY_5^k%~TDQO_K+8zUYXS z?&%cDUdk59Ps?8^YgHygf~C%T6^5CHkaN*pG3xI7^JeDZWe1Ck3qB-G7KMc60y~jc zU@p-Ka-a%$H-N(cJ-~a`y~=*joUX0c!&;N{fo7vDM{+zb(EBR$;_C*L8(WvTN0Dy#AjRh};2@T3V?H&_$+%&_GqoKRB(c9sr&;oKAv=wqetKl__ zGBVh+5J&Xa3~cS!4!f*U`d@2f7hhQ^9i>{Si%{OyJv5Cs$jqtEllXa}8xqR;o!4DB zA$nu#?cDGzwCH88++s4JGSMFKo>;@~g08!^Fy*WeMjne7@P!ik+DNB$t?izLsjku( z6;+*mx}v0k()O<1^2v%fnm*b|nk>W5=tJ98Vi1x8Oy~R@5gl?;JSr`_M`HfE0#oVb zyxqBCacN{t#5mf>+QvRWlrp5uuT(s3g%>*hv_EveR4vucG9T|;Du1mm?9lqF-A&nc z30vEyzSz0XkfUED_o6%O_t10DA^2C8Td+4gF#3Mtp!6@@D|3>HCS<+KPZeJf0?|V9 zHfJhxuKNsoA#jtPK=+_y@ym`exK91eJkxZs%cnOf+dEl`CfR=3S9y{eQZ;C{>uWWu z^e?R%(>~8l>JRUBmLm8hce0(@CkLCH>v+v}SWrt#RB>a>(m0lYBS74K8Bj*Yy zjMzzQ7)7?NSUEXOFEXX!+m)A;%T2dBk9AJemUdl`_BT|kzsN_KW^0u4arTj>kLFw= zf&R_6kN-Is;&~-x_>G z*gJMW^8R#Rc4fic!iQy=ZbZ_nI5%rcz%YAW$sBw#V9XGP{5o8=5n{edC)3W16)T_@H0=VGaGL+%`@)R%M|g74AnU4 zS@~L(Q=X~*O*=?arCO~Wsu`?IH4ipY=Ecrl-c+KCdyqdX@K%f~Zd>fvthO9uhN;9> zP?2?RcU@#S(JHdO6^eH z)&8u@Q+H_ht9L3sY9^~r>4VK;l<&Fe3t>oj{{*px5izTi{!81QIX$l_Z)XvZ{l4e# z3AZAjM6PFlV*kZ?K#xHp;a>C(s+4YaZE!gp8J4w{K*M%j4}GO(tfokpq&Rz1e@|lqLNa zmm1wKpdw^H?+iGa(*U{1w_u@f0uFfJq07t*Z5*ReXVoWb|4>)!)S4>)9vH42qgkqX ztRAYmq%6}-)*LbRuq{MyxOY=ipmNTrz>$Ix!Vhud6H78|S^wnJ70Gg&^CT%`JSsZG zo5oLLvcapckv92S$j1cNISD6it;R8?+1ggkFm0WNsXMB#G-?c$=6wd%>{Q_iSWhRz{TsFb%fv{l(Xz?n zHmOXM`HF?G9dyiezVmQ=|A1O#467eImGe4qX;7I!EZPvgPFxrJB4&5g`S61waNrhh z3A=;w6pn_!ferLz8l;{OAQ9_5=ep=LV}~7)=p4r#`vTO5mE+0IL$3efCowLz+kVX2 zXwjK-%=zX&&8T&Xy&2u;>h!MmwF53#!)Rwk^Rb}wg7(PYMCmarVvofIMfM79jOZ6+ zWYN3~?h-f!;V`0raw^3))w|dI3@^sU;fEcNO=f4>w^}Xs>u3pf3BT%G;XL4M#OfVO z9J6gH)(Tq>TZ@&jC!!L}G&}n5m^RV22yIwE zXurUlJSBH5TgiBi@ZpKzcKR=09NFNMTEe)(TEHF7w*|cvdTW_FBhwbRBj9JA_@vsxc83gk47q(eCJB^e5~(KEk!oGnTBUEl@pk8uuf=Ur1|M zs*o0K6JLsb89O6ZC~gs@2^+)q2EPkP;q+kCgOSumuf*lSgRx7FWA+@|9P0?H$I@b1 zZzZhfZM5C%s6*#s$FN1%4nO8dECrLJqtR4!B`QO|W5=D%?%Tv7dK9c=PT__Iz6;qK zUKuqh#vDt;!-+&fSi;CSRZK_J;D~{OiGjJ?L}nP&mumBtxFKg>tj%%O{*SHEnqvKK z(Oafivu$(i7ad*bzgQvOfWN@Ml7?*i}v-opBc z_dRg2;C%Q>;g8W$abp}iK^bs-GCgq_A{1zwXip3zPPy57-bi?=Sd zJT#}8bN#F$7OCZcb)oH?eTBpBXh0MFRltf3!gu0IT?QxFBj)CaEXb{$hwcyRpcdnD3#{`So z3oL=RGS6@>1UwA-Aox8Tja(wCi;;@|@vmdK7>!1w(j)m{>w*^t#B*#6EBFi5pU8B7 z!8PbK`(tao<-Tc{>9kQ~M2xSDm8Ljzg{9VV**e$u)b_jGXg}=`p@G;LOpE{I^178? zA6Z4q!Ar;i);g{$;7rhUL3;R($VXAx(QjiGi64u5#C#SBqH-c~LpKMt^Rn2{j0@mR zpUFGYjpA|G5=WtJm9^ZGYDP_yO&n7%Q!n#;v%@U30#>dKu!q?>jwg=2XaY73H{nL- z4EJh+>l;m{L7|N8?9;pzfy;wyLkl8gkp-fvXmxa7F-JT_`APO&|*8yug}T>OnQ z&Ar-l(>seyqJ{zikQD})v)QM)2LomYjtd?t*cz4}@hD<`hz!!`>f zLFWQaam-8w91G@B$%M*nbUwve9i#2%t&c25v&^*Cw8ymA^xjl!PPO#5KCrp%YtdhE zhHIz0k9Q~Wl6*=P07>8?2u9{Jy0iANGdL5uu>qOXbpSD7a%GBGqTu9mDy--AAI zPWHHo@6?K*K>ku%CMDyGHgW2+v0MM`u002JSv@lW_?TjhR zFANK#p79I`Wq^zg@LNCf9Y9H6rPh*zi6ZZ8_s_0l&Ovwt-qXK3i10Y)7-xa&o%@JK z>1`x0`Z)A6;4XL&YK8kD4afq<7Df~!m66W?7~hbINIU!l{s`B=-C;hQ3@?KZz0;xp-E6rVcai}YO}=a6F3NE{%>5P3u~J$StH331pDS zJLDf^2+{(tfi2Kd$PO+AKLLG!hjcOBPOYR2zBRrK|EX>{Nf9rJBg7@*262^mPgsdi zatOJOY$7RghVOxo<=6DDQo-~bzdxX(^MFHu73c?U248_La47UA)Cm3OXCNK!2akYD z;SyK`TcJBp4U`KR{P_(8TYz5yiazc~{Yb5)lBoB-6}}kX3vw&jpNu3?0wzUd9y#0p zg||teuiB3o;&&1%=tF)lVx-@R;DQ6deV`2FLK)BuXb1EcbO5>uy@Zthd#xJkfSy7B zKmV(7YjFd741NTa;0y2r_{QJ6 z1s(-g`5lr(5cg*}4`BP5T~8O%2I?HOm6}TRq{1khPv+D4uAUgqCj>PwU^-2%E_EmUuLut7O-)A`N0}L{S1cvV!s=#iXQ`Mi zj0g1Lv_sT=V4*`zoVNz!Z_rja$JA&j(Vy1UYVT@YbT@U&^h~2aT!xn6Q;0NRK6Hy& z$kDic^V;fvKFBrfX+&|9Ale=^GxA{A=AgNL9v(Cfjkcb+4tER|ON8Cb)`I#qRiD1j zuIQ+!sCZBzs0^!bZ3FwBsTzz+NkWhyaV~a4$mmqS@3CieBKSg-IR$j zNr6w@eur*gxN5d&M{7~-{O{%p%a_70xu5_1#QQYvle*&f+Qhb6kwf(!m4PKLBEKz> ziK&#l8HK5Zc_S{2s2V|x_?};#QJhd3dcfPysfL_nG|NLom2K-AK2~eKC0FeIvf#^# z^5U;iRj2Fo+iX3-((meR$aWH@Z{X7XB%wsCOPVI@T%KTfZ~>X$lCv^%Rtg$3E#!&! zC(bl-LP3f?_b#+*0!r@e*KG@N7dRY zr)qt5cwJ*-Y3sJGD$$~WzQGuyD?ZJUP2bPC>T%G2Md-=smx<}=!v&Law&iBz&d111H$kwRclSt#D-t$Vrr+<_}7Z-zBhhpjp~{x0tWP| z%Z6g}dHa7ff6ir(L;lgB%c7GLzovZ`xa6$LL9@A8w}!n=4v1YFy4tVSt%Wg_oB{g{ zGNo69k2_1+m@U6GNgC4{$2GP!nwrYJ4HFKaq)HbB+vF0g_uNqqG|EV|B&ucu_Vr%F1Ea>}58m#)RLlG)5 znX-UIb<6V^6*M|xZQRwAzKl0HoAW4n#W^!F_odE_$HPAP-*wMrEpwbklGGn0yL)eU z&S~A$l-iJ2_o3EU<5@eo?r6iImZu%Nd*6x`@;lmA#Ek$Uozq#5M*j5h^KmYzy9L+t z;R0TvU%{EY^;uqNXlz<&wNId{naaX%X*E)gaAfDh7Oy6+25DV=T}hpHy{*2qslM%M zmsYq;a#voXAxw)ba{!3Jb&2-;=sz`dPBb&gK5R+Wh@3IGJvrO5UZn>nPKmq_knS;` zMX@vC4N5~Fr|Uw?*v8-L$eLv}^J))>u6@*d`ybtC7W+-bRJ)|z2glO{#mgQ~m+onKMznbR~vNoDub*1^WGy1<%| z)sL&d>fzOAYZlato6ffX)zjWzF5jyOffKC9z+zT~o5S~7NP4tu(!ya=b6N|QjJQ>} zumH%*5WGx*qrHM_y*@ivgI7_i`nLFw?$WlnroZZct9?{GruuS~Z}qhrtj@1_VLR00 z(tl(C8FV)7wZu~5*tgw_{IO8axZhGwWcd|778ox^I?1M-@HLh3bDG_)GM>)MmlXyzZPW1=idbg14zB z5-3q$`0nm0>=lk{$a{spZ%Oz4#)!sG4X5j(8~?34(3IO+&>G*fU6d#JTd`jsi9WDd zDI8}{w?jVHgXTt+#~n-CleI1Dd+x$)P#{aUC!P(yzqYTa-`Fb_UKiePAKkUA z>qXb@UVq6g}tO)K^3WePTy~}$Six4qOaY_@3ts@uGr*TugzXy(v zPEUwTYY|woXXK5}D$i_9ZjJmLsO6PAoub?}x0sG=7RbD%-}*~LFGS}=m-<)t$BDP} zy%J6lIrZS({=MG9<$cd&!olINGm#2KxtKg^{PQDE#r}~TE>LFqc^>>ZVGE=7rcBSgn-Q7Ykk^uhCq9g63wq;H#{2+2H0m_9N?-9R5nEU-REYxm zsq)9li-VIjg<7jRXYix4MqVp7%G{I_277cT;BQ1Q1hBWeyZM&!y`#)=e<#h&n2{Bi z)0KQOju{p1o#1+hwSjnxjWW2a_RAIG)&27%x_-vMpuAHtpfIU?W&5Qel33v%!biOx zqEInUAycCm#eR>r&9%+zjQ`B2lDO35BblqRD|4vXF@krAGb8u$QEnJxw7msJv>i%c zX|niy|EvCLiMw2<3Q}Lu6>1i%mkugr-2|DuLewyxDsEVHaUZq-Ibe}eLQ(w+@sL7 zyaVh6$~A15p-Y{rxHm9$;Hm71!mjevne-v14uiljUp-Pz9hfM3*~9NS(>q-BgY=~G zh~5pOJLb}zTma8o{J%rq$9zvbm;5n3Bx7=VZ(MTJsi3R8e)bpY4E&qXUHeKgT%IEr z%iL6%nv=R2#zJI`G1YiYBb4__#tMn9pE@(U4tLM(Yn3KzGU3}qBy9~R(nIAxDtJWn z+xV=cptS!ouVlVY`X}L9)JeX8ch;Ez##%nYe)_Y6k5x<6Et;3wFjEh*7fnF}F^*yL z;ADAG-_xFRU6Z@qd*+FrNggPlX^YIa?Qf_!d$Y$f???P~Vcgi=@eh*zNH-2kN&g|P zBXVN!O?N%B0$PHv*Mo-B>IOxzI#IV$|D$O;_8#M4v*9dbhib9po#;)+z1Gy$;?|KJ zs@_g1|L(i z)v$b}yjDG3Co#Up;w=xY0^3XM8Jwf_A6VS)++EzZpnY6>ZO01HACeu)QHB(JnSBC{ z<5cCg&-0pZZs31W+41s({){R?cm_XJnlLI1^!bw;%Anf3F}1NweOPl!$I~~%rKq3T z!+HX*L=MBxHAiIu;#*yCtF`$}Q$|ZcM`VvyT&O&)zlpVyKT}It<(z3AXML1`w1^k6 z^ON5Q-sWA*nVIjBu`_mWw2nWSb)6=#Z!m=G_G=+cla6QDfgQ8Wvi?YJbKJz2pcMv| zvQs?Ro!*hvexhYn`}^K`eaB?ew4-4Zf8kgInOM)9g>Fl{4*H)Az8g(XLWWWE;`7Ug zPZgX>?1_CD7|5~G&yX^sM&mMgNm)Laqg9*cU_rRU_8Z}BRpNYjw?;01CVJnk={VQs z-s#%2S;QDPtkmg#M;Mk?G6vjFdC0!wB5|$rIvPAJ;eox(T=mSSRDglAh`A`1=fTAA#rD7;(H;oWwry`gJUZ-KZ- z(XBpYa7Mx`7YGG;+3}n?lC#RC&0}KBQERN)qTHnR>$=2|AdRh#WJfB)6O(j zAye@QwsT|-bvNU&%LlIw{QfZi_(>_IjFma6%*DeLsZZj-AUBT|mcw3*l^Bfb4E0To zRo4h(_%zF5>l_la#ba&8@!BHgJMpug`#ocNe(45860y7dhrvuur{Ows4S9-|TGZBQ zWD$VV4^&eIw_?!z256I0-x5q39Ug(udTVWW)qgU6!hW{)0Tu?;Ezz$f zY+d}HsfG+`_J^E#In1oXae|-L4al#_gyjF@8C#CE91yZBxfGG;onS04CP%G^`H3_T$ z{&I*c0SIO&)s7haAPX0t?Vl>1+h-Bp6e;>A%M%7)Y8WP&^(-&;_u;E=@dt4wp=$H)gIHFQchRa4rc4dqbDqMLJZ{4^67fo1?pn( zxIM-~!e{jf>UGNH1G)X~eIxpI^{wt-ATF2gRlU~bzz@vsL)mN>r`-Lz_kI4&us1RH zZpeXV4EC$KWIEv#6iwC5*?6P0Sng zP1N=FCHNWmsD7(@p>m%LlOB|AmmZUr48+Sjl@m1E^+oUnv)wiZXr@)MGr27u8+>mE z0HMZkr>Of;hNz2Ct3t;5jO8Y>UP9vmmgNO}&A85(g=ArC%o}Vnpo3n^W;-2ZFWTBio_*nbIFdjK#sc`f`?(Bmu<9UmH zo(FsiSrooH;!(u%h%2FG0ZY87F0&cO!E};l-GN4!<{E2^Cy^TSENiCy9C#giNKc^O zfjTKVhZFg`#f-QZCulPVOO#deowBn77o;ntH>9Z4Jn&4eQ5IR27z@!rSyvx0-dTq1-K4G}xTUj(UqGTj!ic0i%v9CE-y!^XhVkSMd#Dzu}34>gL` zPT#~_#H^>6LsekBBa$q&`rs?jb*5%RqW+ckS55KYZRG+*mb_h-Eg=DV)+DhgN^Rv!H>Zb^Jbd|j+Ea&Ab0-&FVSPGR)1;4G4Fd5TU$P9vW%o8?!+ zWWNZwQb4GTwu!!lehbQ?tO5G$C1eKi){I<}NO_uuZ zpvz#k%3oEfTBGLbCL8Y~WkX*JrQjX1L@0lE?0ffLtS^l<8wPg~k$=7x_U^~#}$g_JAJFPn`U-1z93|4@M zjUV*Wb!FOIZHdNPb4PtdJyr9g&dYch3B;L1I`AI4#;S4I$9v;F=;s_TGw@m9l)xPU zLjNN^@g5y6&a6}@3}`1tS^qMppu6A?rfDz(t;b&CpDh1a`-b)m+ollv3D{O;jk0Vt zx1cH{7Kw%t<3>ZH?v*xAdquldcTm68@X?q9e?YZ(Hu({R=qi?xBXK+FS>U_X|2F@( zfNcQ+{sX^qAG>FR8{s^Wd6GH}s3M=+M9EY3 zW%f0s#ujSbga?|Pv1Vi=Ty4blM|JhuZ`#Q^u3n~ZHu#w=@C~fWa-J*#C(%Z+e&FnJ z8|Qi6r_Aqx|0zDsf5d0=^ZZ75kK%205wo7qTqw?t8HB{L#ax1}LlO}Ql7sCuf5mTE z4p>Lpc*JF*f>=T9w)tC+;Zw~&V}GD$kX>-DDae>@NHM%Kv>DT35%L(*;eXj~+hyQt zS_N~a^Jmv!UZK}DpCmujuhVabU$yT(pH?piZ!Fi(`7q-?^;e*QthC**95GX{Wb`xg z2f7h^X9g{FYk~E=^`*7YcEna^8)X||EyW4!5V``H2hTB`H@+RhI)ubk5;^;I(>9@vZRN=D*PYrJu&P(kIB9@VMf3hLgei42=g*+Gi3s zt=sTqEFXDox@W3{cc9PBR{SqZv!%zf#`@9LN~p+A@+skCE3lyE6Xrk7ugpp2Z|D?6 zZ@Ol>181Y2=8Jf$MPwr%tn6&T>z=Q#>Af#(7J;YrWTdt@fDiUhDdj z^P|%;<~~{~Wt=06Txj#OrdnFf9hd?ggFZ&h=myN&Jkh+*Ty8#Zt}vIFL(T6o8ybin zN0N};NIRlM7-$_5j(TC0=2+`HBEWGQ^oA6gi7R%0AaNHK+lJa;5Wxba;0sIWwsf@xacvY9@&O+uyQQW{Ihwx`B(E4Gt+zuL(p7w zE%F0$6xoPmBA$o>jzc~Vz0x`{Cw#mm!ZwKv26Cx~>7Q8loby}*+*Y}J^3r%gyh?Y( zt&F?gmE<%ztDH8mtC=J{h*m&74t{s|*vAmRTD$S(=8@P2ltgsMH>3`+BMZKFk-g4(~-MIp8 zH<#c_xV^4vE`83QoIbF9*j>y#Mkhpo^Bp!K*@js9@h0;}Y(F{ziGmNACYY*?UdGD? zcf)7>9euSv!Qg2OG&R6os2_gSnnm_FqA7_`4Bds9&caz|*(!FK({1P9IYlndhiJVE z!Kvl6aVj{aoO8}yY*$t)qlnf_{f&|XnjHu1GNRC?w^R=yiZL#hj+P=bkw$m}JQ*Ga z#}Bm#I1*OC3M2&+oA+6gZC%7#doM`gE1Y$S z1+!kTOPqdl;yXDxJ!FTlAF#5Si|99?t(0-V68l18vUM5$C-xQ@1|KkOGaVX=%C)9f z#)-x}BVt?y-$BFhKdpC&iS}oXaIl*)4mv?gpoh?3(eh|^D4Etqdrm*Wn8<7%LVUv- z!S-=tI-hX9>&$i5vLCaqGTRvQ7@z5Nw5`x*N+&>b)RR7>2l2*Au~;!Sx)xq(B8_uR zeE0#(L>?n&QHHq-H(CdY-S&NsaR3G!0=+3WDIU~)R24N1`W^D7X=&%^p+l?AWNc@A zWSAL2%xTOi%mijPqm*%;ai8&)v5HYiZ=!vN{-Iu?tOvb-)As*})7DIU4aP$^BWsa$ z$R6Yb@)Y5q?Pw`>(0muKwcNEHx2+~7k{R|8N3CND@EEWHY%mKnfK2K`Dn^Zl{2(tV z8F~VZrkQEe>8bR0v_hH$YK1~*MYKO?p|p)qHFYVKLmi;7DaU}j_T|JS>m?-{yv`Y;DZnzvXW+cYAP{6g*=vau3aO1Vef3SEX4LSvw9 zkPaG8yEH_ZwA)Y-vR~GoJ}mSJ+LmZUa@|#df7s4lWnJL9kxQ^JCQ@`$jkOcj@ThhZ-Q#j zKIGFDupF!cd6b_h|55rVLdr8rEae&qg2lit;65M(`hlmwbfC`hheO~FbV%s9y0oyy9(Du@{)HccXs|~l+6LZLa$dx2MH1h}2 z-|p%#I2Hm$KolTy^gBiXJ;1i13SY}meQ*+(Iz&H#^M+zg0$c>bfo{h|$6`mC!)#w{ zXV``0adI>nJyhrWml#1%2v-8LMGRSUAMu{JK{OIJB9dH2mXg(^hV-?k*-PvS`&>u8 oL*&Q;oPaoBCa?+U1wueCFn$Op5}X6>1&@RG!GFOU;9ubX0i69{EdT%j literal 0 HcmV?d00001 diff --git a/includes/install/sounds/en/us/callie/custom/8000/now.wav b/includes/install/sounds/en/us/callie/custom/8000/now.wav new file mode 100644 index 0000000000000000000000000000000000000000..ebd9d924d9b754ae8a9b5337b6cc63d0ba0e43f6 GIT binary patch literal 5682 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 pY zVqT3(VcX*EGFBuCku_Eplqy!ZL-@qH$I0Niu1*JEP7sD`HpE!GK^PD3z0RXYmX zpayjl&^72yRfcMZu0p>_U!r}Z98lFEUf3dI@8EFzaUhx>7BKS3WbP1bx-x8bC=PD5gT$bQul^gp~whZ_p@!J6&pZIuN1 zfNs|=97M^_328u%Wp6_0X1>?w8oS+Ie5 zLB`tmvx~qmF3^SJ!vU%;nm?qi7ZlEQ1C3VDW~);}^Pn$KIG zP}z=sCb@+Nw1$t1KbiC>^?lm8G(oB%a;L{1;0fyj@-{fdiT0>*LHUzyZAO7tL&86lMwD60)IB@hcK75fYSrF5G| zjh`&kIoee|Gu4ppl726)I50<|w~w+MBLbjg**KTWvVG7BJKws|8cdyFjFi>-mu{kZ zEn2GX)XvrU>!g|=@Hx6>17LPFsdb6!70Mr!SJ8#KOXf=3L;5FR8E>pK-lH<;eiWVX zPx8le80#!tZC6+4U^@@kf>;iA@KkK%^VccwBK$Wj4S7)&))nT*mI|W9`oVl%UxE{8C3+Zd)fE~49858`>s@u{G>7nw z*feB`vQ?Ra1sT%FcR-JzO!mn2g4aQRB=ml?HlaD`UD679ZPb#WJ+5~loQyCF2%3@d zmq{|kHSlQmDEY}cm-s?<+P)#qm}cuPV&{=*2#Q+OrFa$oSY47qxX1X4LrzA&ldnmho`l3(qCbSfeirB1@PG6^+eu0V?B+KMPxD)W zTNFq(S!IOWT4@T`pHS1tHDoci6X$F9X@}_E=)W?K9Q?j#2rrzeA)Sdx zve8yXN-Sq|(b)H@a@BUsPm`$|rGKr{=#*NOhETU5rt z-fM&9(cK9P5)5uh8q75Ytop8K_&d!TG9tv5zsJ zBXm|&f6SIxI{Mql@(|E}ru!txW?mwj#5`qN!N2$&{3^H_%w{W@8_aRWOe@F?^Ai0G ze4Bcmx=8a$*Pu@|stkkr2tBTe!-r!1$S!obx=&kRTI1lD%b@{5i0rvrkI%WF`mpaK z)1x9I4~Dyj(IJIFM|^ACZiqkgo&)QEdP-A<9?Eh)wT-5d?A zIi+(qNQ}Q3y7jL5e{?r=6Lq!PGnzl~ad^JA$q;D0L9GTn;Eh6+WQ2>bjm}{G*Efc?Nx-~sRw&;ujDX7EQy$XmyI%LCv%ct5Ow z$MApWck^X}biqymA{a0HM>rtV3#)`q!cBrYejfh@>;#YFt%pv78V4H=1T5S~hvrqu zt>h+f#at4X;5bPGdzszK&Ua{L>1;3yvo^-gfUMlX|JSg`*gDq6PULQLa^Mt@2>uI> zhfL6M-b7dnA9Lg_6}%D9f*@g-&|e4&6@mwXb%IbqBY!V{rG<3@q&0joFl4;E5t>IT_c(a6X8bYlV6h?$!f<)k!)LKdt`IB|Ihx>o<&`t ztkewpUz(#QFguwCOgBR?Fe_$x4kfdh`Ip(wOm%3PM!J^X>`*dY=vL}qs@#z~pUR=K zsQ@a1ilc@){I94IY7VuL+DF}WbP`P^&~xcybUPiytaZGs3;R9W!sc>EIScnSa1nsO zZ@|+a4yHhBpj(cPr=TESDld;WmN$ZzzzgOHc!SU@=sdL2@fSov0Q4EW1?~iAfd!y9 zXaU-QhYnoq2Q~rAfZ4!gU_3AZnCL+5d`AP*=8hB?sme>oww#sB~S literal 0 HcmV?d00001 diff --git a/includes/install/sounds/en/us/callie/custom/8000/number.wav b/includes/install/sounds/en/us/callie/custom/8000/number.wav new file mode 100644 index 0000000000000000000000000000000000000000..c23932c8976f67b45e9f388eb0d07016b1d4e64b GIT binary patch literal 7030 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 AQ~&?~ literal 0 HcmV?d00001 diff --git a/includes/install/sounds/en/us/callie/custom/8000/or.wav b/includes/install/sounds/en/us/callie/custom/8000/or.wav new file mode 100644 index 0000000000000000000000000000000000000000..dd64e41490a3bad0e76fc407e53b0e5983c3560e GIT binary patch literal 4692 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 literal 0 HcmV?d00001 diff --git a/includes/install/sounds/en/us/callie/custom/8000/pin.wav b/includes/install/sounds/en/us/callie/custom/8000/pin.wav new file mode 100644 index 0000000000000000000000000000000000000000..0fa00e3969a770ef158548bd44a86bd6f2cb6c65 GIT binary patch literal 6654 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≪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 literal 0 HcmV?d00001 diff --git a/includes/install/sounds/en/us/callie/custom/8000/please_enter_the_extension_number.wav b/includes/install/sounds/en/us/callie/custom/8000/please_enter_the_extension_number.wav new file mode 100644 index 0000000000000000000000000000000000000000..d9384b0fefcafb637f7f22967090f35ae5f49735 GIT binary patch literal 32360 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 PD}MQ}v+Mu%x%K}5H<0lX literal 0 HcmV?d00001 diff --git a/includes/install/sounds/en/us/callie/custom/8000/please_enter_the_phone_number.wav b/includes/install/sounds/en/us/callie/custom/8000/please_enter_the_phone_number.wav new file mode 100644 index 0000000000000000000000000000000000000000..9cb4057bdf33a5d9a0061f05278e6cfdc47ddcc5 GIT binary patch literal 26552 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 I|2uE}3vXBLZ2$lO literal 0 HcmV?d00001 diff --git a/includes/install/sounds/en/us/callie/custom/8000/please_enter_the_pin_number.wav b/includes/install/sounds/en/us/callie/custom/8000/please_enter_the_pin_number.wav new file mode 100644 index 0000000000000000000000000000000000000000..107728a5a8f20d45ad345ad0c793451d80530301 GIT binary patch literal 27504 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

      ?v+Al*5+r9(aNkmhnd7*b1&`5sHPm)e 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 literal 0 HcmV?d00001 diff --git a/includes/install/sounds/en/us/callie/custom/16000/wakeup.wav b/includes/install/sounds/en/us/callie/custom/16000/wakeup.wav new file mode 100644 index 0000000000000000000000000000000000000000..94d0e57853748c9de8ce4b8c6d8a4bde52f2f821 GIT binary patch literal 18752 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 BlS}{r literal 0 HcmV?d00001 diff --git a/includes/install/sounds/en/us/callie/custom/16000/your.wav b/includes/install/sounds/en/us/callie/custom/16000/your.wav new file mode 100644 index 0000000000000000000000000000000000000000..a8e9f7f2bb63ebd328422924153302e1026e8b54 GIT binary patch literal 12726 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 a{(I;%&IT>cmKyl3cEi~-2G_Br;Qs*Lh%wLr literal 0 HcmV?d00001 diff --git a/includes/install/sounds/en/us/callie/custom/16000/your_pin_number_is_incorect_goodbye.wav b/includes/install/sounds/en/us/callie/custom/16000/your_pin_number_is_incorect_goodbye.wav new file mode 100644 index 0000000000000000000000000000000000000000..80d49558a5d3d3dcfbbb5f69343deba7fa5b668b GIT binary patch literal 143252 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 AiU0rr literal 0 HcmV?d00001 diff --git a/includes/install/sounds/en/us/callie/custom/8000/a.wav b/includes/install/sounds/en/us/callie/custom/8000/a.wav new file mode 100644 index 0000000000000000000000000000000000000000..75b6a753ff6f8dbb3cbec7ae39f21c9aa1df6753 GIT binary patch literal 5478 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 F{{yh~i6Q_1 literal 0 HcmV?d00001 diff --git a/includes/install/sounds/en/us/callie/custom/8000/accept.wav b/includes/install/sounds/en/us/callie/custom/8000/accept.wav new file mode 100644 index 0000000000000000000000000000000000000000..32f638d5c39c7e7ed676307da1f08a3a2a10d404 GIT binary patch literal 8934 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 F{{zWSXWak* literal 0 HcmV?d00001 diff --git a/includes/install/sounds/en/us/callie/custom/8000/begin_recording.wav b/includes/install/sounds/en/us/callie/custom/8000/begin_recording.wav new file mode 100644 index 0000000000000000000000000000000000000000..9e4992ca6a3d240debfaebba7574706dbebda476 GIT binary patch literal 19480 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 literal 0 HcmV?d00001 diff --git a/includes/install/sounds/en/us/callie/custom/8000/call.wav b/includes/install/sounds/en/us/callie/custom/8000/call.wav new file mode 100644 index 0000000000000000000000000000000000000000..d0d48e2540a0e6d32e55e0e6f35dc2fe7053f72d GIT binary patch literal 6110 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 Gt^Wevq)9FS literal 0 HcmV?d00001 diff --git a/includes/install/sounds/en/us/callie/custom/8000/call_forward_has_been_set.wav b/includes/install/sounds/en/us/callie/custom/8000/call_forward_has_been_set.wav new file mode 100644 index 0000000000000000000000000000000000000000..58262852206969f884906b8586775d8576453481 GIT binary patch literal 30976 zcmeFZ<$Dy#7dBko?nwd^db;&uWYwFzRKHZ~zn>NgBg!(k^-TIFS)8q9BAp%OXID{58 zL5M_pG-BxVq4`kfe}Dgz!2cxhKMDL#0{{0CU@(I*7Jn51-lhLj;Pn6h_kZ8||JzsU zQ4rF??@2U@Lcu5;rK1c~3pGO3Q4XquYN9kKDJTK{%SH83Q~0hHs(~_posB@DCIpg9ZJSw8kdT|oD~=nEXn zK*9q-YYh+!wuo_4G!3mm%g{oQ+au&pc+pPO7G^OSokl0%-5)&$YukVa<0!1gskk%l zhsWWSI0Jdn5@I)TnkXfjlIzJ5GFDbhHYFDl83d2q$cDE`zX|!=74{0djPcM<-BX;r zE!Ni9+^lMiD^k8cq-{j3z7hFSs3uGH)dkE_7jxSjb|=sD!c&AW&!CFe-`{IObnX6^g!+c)&?F&u}y&r`A7V6S`&+CdbgK4fX zu4tC6{N+dPb=e5U*Lzz9{G0h zvuWq6Lr4zyBr@gq6dmQA$+={SEJ&HFnxK5ABvq5-HOW=t3;qakLY1m2Bl>gQ*yZ9x z@}ly&Vl4Ryj}q5Q<8dZ#NFOY;C?z|o zPAW|JfOs2ilGj!|CtirF`D22TSS>$Eo`9^Uu5>ZQb zFr{#Bq28kUir$J@#CWzVlO-)6jEX$jH+%qJA!^B2%JT6@`Ag+%O}VDJq8s^_EJD#r z_8!)U@uXSlP}fspl0&bEyJVQGn2=C2>7evC8cF)7E7h!2#7^MHqZIi$ay6kLE=&L6 z5^gs0K};qZ%eIh6c3p81-;r4NIh&GtK%em;^j~Bwy6Boq|Dl|y{OS`$4CMyORQxK* zM@sipmvY4@^iWB&I=+|ZguMyf$m#Otb22KM3!q}D#==5oEq|X~Og-Z+qxlL-zDCT$ zjfv)X0kM)OMP1|_WJBaDm7Uf3%IQRbIE%QiFrfZ|(@om@*oWE2IVnd! zODl6*v)vkJr>wq?L5}^*EL^1C?!PQNCsv-AoNP#_5#KOTnYccasHRW1C13ZSgCZeU#c6kx6ZK{=XB(kj{2HcJfJen(6emM$Azz!JpcII^uA`n zmBMxvE=L}I?ep9}Ip|B!l-S#ur|Y;H)okKu!qj*bRj$aUYk2N5!9=b)l=z$WGheS5 zWH@AbVX9H}^hf@u{0|YIRurJ`(~2gS=Q}P6YqUur36Y~B7sp*snvgTBer(>IhA5|b z(o>Di^|bO%#Vq$Ogo#5!V@EGjuz97!?QCspR`&FZfBunA-M*NZ4n_j0@VZ$p8nOfbmS_jYKciZD!mBc|mm7kyTh&R&y*!<4wXCurP%HJ0a z|Iw*9yZCF-yu!AHFAS`kmD&Bdkl3&e;iDspll^l#HmqtCSI=6bXT%URz`5T}a{lsv z)Y7p^wAtq26dm;^68DwdM7GuXQapPBqkCvpm(jihZK)>2FcJ7IxU*8(*7R z+I5bPmVYZ`B|=ed+0@E}s&SU)PKw{5c;@>=pA__4ur6v~f;H=4ZnK6}c@r|?bW;q5 zw~IcGG^MKUN1h3b^6BR)FO?U+tIV^tbH&+GO}dKb<(JAPmo2MoYW~9;Aq(~M4Z0oj zGI(j2IlLgLPqv}K%x1r3ozz{dc=Ve4Fvi$OwIuRv=v-B~ZGO?ZqA$iBbg_7j^>y8@ z6pGV+^!q`S<{REpGV-Y3r=X6(MgBT}fB&GUiz!#@w8|Tv8yqL%zNRUq!%d08MqM@i z0?jG@vg3>OmMfNd%*&~l=HE-X!pP|M z<8v;T+aNYs*`;##$8`mdO}k~wgN6jDl!5N96-?PA%Q0#upX7aG8&`g$@Z9&XqJ+v5 zmcHyIqM`PR?;PJZni-moS~_H3{M%~7Yv0M~llIB)5B@)+ROtrI-4T++(ab^WJylJJ zlhsxZmTl*j+lE!TO9qusHAlE=ve|-DP>B24H19qt)iZ>7$B$FA@S7fPjju}GmT|P& z^6L8%NPT}VQ@*#js{!#1eOHI5LQbj@_=hfkM<*(QiDZ^|PFd3|ffkvg4t1IuK(BDW zb`EskcK4*KsP691o==ocN>q&u{42Ua@`a4a)koBvo;D%;I%;W>70)Ts*wRq4-}+F- z|B3Pn|Ixk46F~Vh!OTq08TUws+;zcq+IiM>!d}-o&+SKZ+&xC1HoKnMPI^vqFO~Q8 zOT#-2flKA4**-~6I^?`fGW>PO* zL+qVgd7gIEX6jF8OXphWG|wcq0h`L4qXgGb#w@P$c^y8Glx{C9A^T z2!df@(aX|pbiT$BvLU>)cBM4a)z0?Gy^whUdy*tikR#Dj&EDPJjNZU@_7>2!=?tp6 z_cP@~8R^a5OE^HO3G5$rGKt8jnYBEtWm2ukH!732rR7>>u)Q;<)#L|-2Il()5Hp#! z9+`Wq_Y>0$9Eqb2KgT^=rt`k%8bvXEm;m+|yPe)e{p0HEjHSP_T@{CP1Gm7-KU*1sjXbG^pu<8`Cy%7d}O&}zwS9f&-9G-oN)c+>FYg5o2h&5 z7}pH%B|%h|>dlcT?s}pu`B~QZ++(Q&Be!$jvhxM&zI1W4k}<)%BX0Q~CD*#oIC!@o z8!px5{`Cad3XDyxjU7&^4Re9+Nk4L@d-_pZJwrV;JzYHYxmx&}&#=I_=ymZ2lH!x& zGrCs0llUxbkl4~xyLe=Ak*k~RP(Xvwmp;3RrS9&|)t&|{FP-5}(ajz2i~}qetv2^b zZ$EEe_9Q)zZcE>A-*s2IyHR7r8f3KJl|WDAr|3=bhZ9z2KC3||H;S0R@2%SOBe(dm z=dHpoWO>*S?M`Badx*O!J&tdUqqsGm+tvZb{?<8mFLmB~oL)~Ka5wbK@o?_yp0}P@ zx}Dg7obUHEh>wYmUzXfGc}+%f*8RAd!JF7~MtRAE@?&0`vTksLP*&55nBgAjenZvb zhKpA3eb*aHp0TNIkt5!l&B~cOV6nHU#?%;hKX-yBn8s2E`7ZsKU{g%JxQ9tN>0^4& z%(Ky~{xvnjFuFLS;x2ncEd*}}sjps%o4H!MddPjgS6`=&dV>gqM)D1|QYWa#wx&k37SB2&sz+NO9zOSIdmTBd?Zx4Ek%`RIac z2X|Cm$G)C*o)6y6e1*82k-L3uGSePgPv>UuCoY(4#}&}eJS*K!=VRA!dJX%5^eVpw zXhP=4G>IFZ9GbEyWk^z7Fr$`xSku?4&9;yDsn5f}n7|a(QnZEMKzC!Ttc^QNwQz2= zt~VFkKfBI(Q@9@NA$FYCPJQ!Cb@y`br6;m!WV)(;U~X7!{M@90X^H8>;=>}JE2gub z%uNkjY#u5|`NX%ie}rESnT1b!gBcGK=dDc-aWt@Aun6Y$P6Aq4#kjnQ+y&->cQp0Y zmF%LZT<)!0>oX>FYecQY`bn~k$V^l0#}Jw?vE40sQ_|e_lnL=!>+k2EsS76l#MQZ3 zTrM}8`s7+@5sW$JR7)*a8;{0oW@<2LoQrwp9ZZ>AEnTJ54$dfVpxqk!F0vwVeafin z^=l1Dof$caQyMOO8S%x>a*4gGy{aFl{ZrjT?1EDzn>0-N=vi!kWY|y{W2v$k=+|_x zca2w0KjQrPZTuzXf~U266#YVIr1`FY9L>c3maI)4nmMofK4siW?VyatszX z>74$PHB03R&cN;F7ySf&s78*%Rktd0%-GhAPGoj4KJ004HLff7i1RQlyx-}D9F3Q1 z#|K;Eq~w3n-=_CW)+MwGoTK{Nn`_-`K5v=9ej@XHqW#*bhRd%CN`5^5k}Y8=cRl+- zv$-nX+Q+`jbJm;8eB-R_ME){&pEWY4nUUOH{8~QIe}BmOxP?jfbYtcpiQgkzsUkS7 zE!ud)R_0!ZEs8Q#gr+fh1`QQv^UL|&%nMrK8fjZ^HJJ7GmX6l$1bT@#g3sqK2t)Xd z>`3M+yIBZO9M(1tO^Mo=pierPUXXPqX>^26mgmw{B$wVbZSr`qQgKRFLMX)^VmEQN zSj2Cn3mk%Zy0MPAx^<-^#Z~S~rZ}49dy4;xpZWT1eQzA6me#5-`|pmp5+h5DNirlK zOW6_AFW6VMhW=>rG1qbEz2^lvJ}9X9F6^J&8G#dYypA64;4Rta1D1=nHI7!UQdcf@ z!TW^^5x0tqgkpX(KN_!-{ime^K81gdX5wBayo_BRY15aeSg9X7#fzA2>_)CH8|Pi) z`Nt)|ui|X?ZO?LdxU0T>i^XlJZ(ZOhboHe}*x!XV_%z8W2z6JVW4`C~vx521apBz} z28VwP}unPZ<5u(Z{*j`NZDDo$hSz`qS0lMSGS}e#}z7 zP}qcIo?g1 z=69|-)zrJ59!UMpw4o~4q3l^MUtA}8(0nNh_mtltSE^>HI;aJo{i-q_uja01sfJQ+ zQr}bRR1Vb-d8+c1Y`kndF$nKQHKj#Tnv^NHgh*(o8P}O<$063tHsxmVkz%FT3#+A@ z(tRSDP|H@yM#;9z!xb%++46<*nuA61NB=K?1(z2Gr*co`fAjviPr*D)kqx3V`uQ^M(E58^G*#O6%|{K*~Nq7%Lr( zLLKl-d>D{5JN|-2sWl)s#efGr#kFxuz+l$laH~|mDN$_n979=HpE|p5NrTNlOsjJjnsxNs( zqxe~TA^J;E(ky9(R3*8kIe^FfiPu7Fy8s8gh9}^$fF3;ogwY=mo7sScjYo$7BU*;1 z0#4Km-;@qW#o|rTOOK>a@-z7dh$1=xq8CIQLRX2iqz^%%4(J4KBz6?zCA)Y?Trc*A zkv@^WN>`+Pk_V@tWB3`ClN_NXnh{Y1g9tK=tU?N6ARwvF0Ug_e?f~|86#a&CaR^r8 zo`4F50cN$BXn<q|Y6=MFT5>VIs#s}8E~xxKtx-h9)NTXMkTlopv1=j3;Te!p>%>EDxvNk zJP8${!C*(rQ4aJFk2Zp)`=Q#zW;7D&9E5oW0lL@~UYl@TKsBRK5qus3ylyPu#lrz< z{Q=*ufbSnb>#NXZKpVHCEr55ff%k8?J-P=d+$vmz1JNto4s75PUITdV9Y6}NVGI5j z@U;gx4>a5jkiTw#yluvP@o(rHAdx@t5PTYrEr1b9xD|Q>*t8xsfUB)wO>1GacL1yY z2G*bg{Pr{0xg;$DD_MxwOML-Lv`7PRYkUaz#E;N3(2fhw0y~m-(eor&@Mm-FGIh(0cDIs-{CH}1&HHC=&b|~LuD|Y?|3#|kJacaV4m;rT)YA& zqkMcE<)I}osu6e}?hhzu9)1sZ&IFjX8}2I|;JOj$EVL8^$9rL%yO9@fmHxq@XewaO zVW6|Gcr@Us&5#FL%*RVmZR7*`iiSDn14ca!?Dr|)m!*Jqve6B3Y${;5Khb;v z+VX|*X+a*zFkS{`*$Y;p8_-%OIP>$mYcPWDaP0hl$7pV|WAF zcnfpb3fO!FXpMk2+M!R-*27=&S_azNfotL4K$j2Tx;uD0Sn3m)n*(H(4kKXTn}J|g z1He|gL7$hwMp9wE7IBYM53R)cwo><8dAL*xtA`Bd5%q}>vWI*oSwsZN_QPGFk+w=3 zQNLgD0~f4Zvj7YCCBC9{u#%+1YUYDR;CS2uUjY>O6}k!UZ(w{AVU;=wqppvSfR?(! z`V@&HK-0bO3v>?9udzfJQI}{)^2B0d5;2k3LHs~N0q^%AFrd*G_dtz^X>h;z5%GkK z*aj;nhk6oU&@+@td?7x9F2jjl#4fUuJWFnu?U8+vWy)5N2gyd{I-&?7Ec@ZEI)gxp zxI{8bTcm?xnXpj!3)cK8!X2T57%I(_ilt9DAI&1(6LEl|o>r_@o>nHP{#ChDebm#{ z#i|}EA0?IzB}Pg)d?dqr{9W}NL+#}@gN?Jjx2?1XIKQ|8smDwQv6z^w%+|FEtPyUG zX_B-otz+iati-ICj3G&vBg6axkl?sl*654xho0}Qez^C!@O#^m%JLb89mWHe{@_bz za?Q|l#YAm{z9Q5o)}Gcmx3d2AhNTTGbyO*VzC&q8X}kQ-Z!$kD`L?I>rL!|z19z4; z(VX&8`8<)?nKx#ls49QVTk2g}!R*pt+hNuw+vj^EWJ>I?)c09ys&%O`uX@vzAEB!i z*{+pkp6?@m>@5G&9>zYxE}2&L82t-&@m7o!{-B>)zLi#e>6Rb&(ev$LMY(G*4%Q^= z?}q*s)gvK4?MJmkHT&gSs_7H+0v{63Tr*4;jF&CzTpp&Uuv2&-ZeTkNJna&wAO*)M`s~S>(5pkMlmSFS=xud!Nd3edB|lMH*sjCI@Gx z)iBre)Yy@>HN2H_4%OQjS+Th4o9#Arj6(v&6>v-W!LXVK66=L5&wFEo;x%78f8A0P zTy@G7Cp?oEYI_DIgzt;noEn$ytnRFNBDWyDOT=%gcdid*_Y3b9U#co~=L-FBM?{OW z_z=M>osf*!DB!zHS3^$ViE5#_h6Gnl2M+^44h@{sS5J>xH>G|gO;6_ze(+wroRQfp}{8w?V*q(pJl?ar0oe!lRm?KJCe|!I>>knJG+P2$! z6_+V9eAfldiKrGgFzH}wQu^%lrD^x#uLkc|wr71EC#-7c9Qqu$MF{7E7)0-*i@nk8 z2Ja+Sndx)clA?;jH>Dkn{hf&2jFMFyeP0Bw37-+OB;iNWkJRrO(^Ec1XtY20UA6&+ zE>#n(Deeu-Mt(itoNLJ)=UTuqRnFIjqh3C;tKyQpKCecSs++s9v^Ms=J3qe z1VBJKr<_d9&G??YH++yr#+6&+jDJ`huIkJH{s-6G+tKsFbI2=lU--7n4@dv1@X{Ma z-AYGQB{+I`Pm1+q+tdyHE(Ft&Y+NCyS;zXj|J?G$B=y_aw+>2+#ER-JTL zRG~IUm~Y=;{L515&SeksHThahTdEiRfUAjv(LpbfCd$?cfpE#<;U0 zQa3HAQ{<{RCgEV>ABoiy;^G!WDDp(n_I}IY8a?45ixBiIm=1 z-&|3lEbCr2$6&M$pz?%k+0ZbNAeTnPSSaipkQJm7OiCTwR&wVmH}(pSZxk!f(g)h>uOk zO!zIKLBbi3RD$XWpYLw(9OPlyFlj8FBi3NAdkS68+{dY%)M8h>HOY`)nqShZ!e-{( zr}$~4N!3@^Ur&a3BL0Y-lQ1!PY?@DU-|+UDPyA+Qp*hC7*|n7Z+xym=EX87m32yAm8vT5n+`f2(Fwv2B1{t+FgQFYc2dHr#50M1Cv1v~iFE2U%7?tg zU1*PWbap?X6WHghoP7jd`0q@8_88+wA9QxMU_+hC8-{$d!j-}{MVplEb;|-~gjyoS z*jkBoQ#z;nrFM;SYx{~#U3$wv%LOM-r?EqrIC{N%iR*wz&z|IOv(-I;)>W0yN;j6V zh7{Xe&svVdtrT^%;en3uHL-z-=A<>r`owKfxq;7A?W9^>%6-z)&Ff^_@!7nW-N8&? zg1F0kSAHd<^USlotr}l(uOio&ZtLp#gWo~c)Lix-8k!#cJZ^JBP@+9yZ$gvU10iEH z1%lw}Z+&Xn;3%Uo`x`%*`;F;KKcEu4e*xla@`!fE)Y8ze@?w>r&F#q+9+IcjWxf{z z6T{j@9gl675S7$AL5Mi$w}1>`UO1jxYulCXo%9*zIh(*4*;wv9zfnvPL%3B`p5v@( zaplwsi(#qdqAQzgPae=%{Lh7yMV^Q?#78F@6K2F+ibxFTq52{A_xx$DTM=8t5i-fg>RbNXLwZNBkKj|P>8IKvJ0iuiYu!t1TTO$j zj#W(ppWaKg;N8*z*oE8hRa}Hd$i66ZeMb8B(Ek^dANC|_U#uA83Xjm=QYiU6=WSDG zqsp?!5kZd=a>;Ls@5)w6MqWuqqVD1xF3|hk^~IKC2{PBV+_f{FHrzRJqtr)A0CdNI zg5?`jR-fIzoPV{z%OU?o4vh_n&5M{C@RzEc80$&0HMU%^wsHp0McgB40+AzIE1##> ztk@^7PL7pov4h=PY>c_Y{Lz}@tWKS09NZY;r1(Nwh8sXE{sehc?pAiy)X=r{9}tuh z9v$^6vN-gB{;7Hy>cH;w^mhkQO_?WrA89Ur2+V@s#01$Kc}Lk5e3#oxO?Hy@_uuL3*&XZq>DdHJ#v8#n6(BX0}_E@Mp zl<4V6)$rb8%lRRqLdua^Nu%%&Vy9w?#-iKe9};*n_*CeCu+bqF{dk`fvOQupYxlO~ zQlw%)8(3)y_~aD+LF(m!Bq1hxr?@CPXLmY(hfz1C7!O4yGAFp(LY_o|N1O@s>m|FR zO41?ym%wu&|Ak+S42ygeBKOD2zp6F9~I_%R>Eh zW5_&yCw<6M=82&j&_k#tRC{KY7%1DVe65@;6T~^*_09sT+hVnb*%R#}ZBJ~gorQF` zs36U<4zlyacp^YXsxD}!>RmxeVM`-(WA?|qidYxeTk{AFWIwoPIPI>N)Kx$T>#>W4 znZ!B83)KRpiRj05bZxUNH|3eXSPom4TUE9rjzv^cJ_g+&H8KNnkytAGS2araT%Qo! zDl9!RBQ`4OL$WI_AS6uVkve$F?m@`Cw))(DIuFt zQr+CUoY}St<2)nf$P*Klr&YPK-qJO06#J0L_uhB+w~VdWTlS=Cmt(v)nEzYoE>6Vl z$%tRD)p$7cH>#CP$H_wwW-uwi&7Z(p9n{aX=a% zEdf5#FtL)}Z|`F4P#Ig*-IC_m7Oo9ZEXlRx1N_Vl+~%n!}|tiM^a zZPBi?Ote^l(_}97Qs04r55j_D8^pIsypY;AEkDNJPn0i~Z>3<# z!xG}s=4Fs^BmIJuIqDONc8sslUXg2hY(8d;G&iuNI7zxx>O`IuW!~}ZU*ZYDA{&QHfnWg7WzRlL3;(m(ohcxq%``qVeG*?#zM!&+ zi*vj#PcQ9a(z!-cL)bN})_cP{1MsDfu5x1s#{~AJ8<{>?_ON5ccWeNkCaY8i`ZUq+ z3ztU>h*%n@tDaHoWxQ4A?>8?Z+JBpSX60&UI-hUu|6{k+j|>yjT#Ljp{>9n{0>`z+ zly|VPNpWf6n;-vvzxO@5q=R)AzgMV#d)5;NR z>tH=^O|*Y^7xI*>mG*q_x7cmT<*7q5r(}mGy$-PkWd&TqYn*3XLtLLKdzbVw2H4c* zAlrU=19y^n$GG@I+)>XI$0uir^G|zUK)gk-(=w~SjXt5P3Oy2b zL{holu{q4Fs`4_qWu}EQ9<=wQLKqo$lmAy(E<|%1sdR{p8Qc?G1F0mw7rsn}Yv$^| z1+5IBqvj>x@OS>5LfVENSFZv*=^B2))N)?1EplFUu~x~}1u*BC%r&N;m@K@c@6sc^ z-@HBOZuEI}s<=~90rMzBYtYsyV=m@u~#PNOhp< zrFxWxQ|2h|Dmld~SzB@$`Iy)X7_LLS$J=-Vcf-5gD|u&9*Qxp5!Sr)_4mX9@2p0g$ zIf@I&c$p8ek4yz@rJk&v;+Wi5VNx2ET2)u|7}YW5MWsfek!6r~06o4WT<70&5$tDg z1T&DC3TtE`+n#fB6NQbUPTDCw#Myv<6cRCHP1#)eRQYXrkaDXsSBaFnl=BoYS-Baa zCs)y1%!*B<2ck>}5f2FS`F=uY;T8WA0huk#5mLp;A}5TMhDg>;a@GswTlQeqwO{oVk!HW94_#^FX>F7?I;u-?vqURMWBU>G2m zT>!61zyWw3e47MlVGtgMlTZo#p4Gr2@Cs`XT>*n_PE5j8XcEXk3xTXsX)@qXk${5N zf?vu;fR+(>A!>wI5&eKsS&O(YScvY@@33meSB{K;FLK z-+>>t7C)05Xb#|`XCZ!22T<~Dz@z<4dpK? zTe^&IODiP;O_v_v+Q9G3LIhm12|WRXEfpOVhv3noTEd)6Jclpv39_BIsr;SHN^X*0 zlP8b^NIMxs6cY}y7a=1rN;Tv=$kU`z{*KrwJEFJ@5&*`Tm`V&sjiq(uzc^DyDz*`< zqLIR1zDMz1)n~@>sq)6MTxi{nw&C8m8Qv(>kUmK( z@Nj$zA3^Vcbvh0(H>BHi4Pl9_7I458Dd#FJ%8Tl|K60I1o927M zuZJ#8*Fq=Lwva2yx>`!rju@eAt?VOn!JL|sfjmJC<8JfMyuDnlD4CbBA8>B+w51wQ zLGA$WYoQgF=XLR8WwX&KqEItMeP8uneOp8Oe$+a(JM=Al2kAEG=4-S4f^5d1^yUu-%b&medYxW-YQ_krRzuyySMsxJcl)LUzR~aYz3IO? zXi&f*?PQ(S|FYHz_x(1-4B|iLF*8j#z+ zNVMQcRwEu(E!Heho!6A<1A_MJuLrIRs|-sGe;hF_Xkfs;fEj*c6>ShDxw%^2`kqmq zZ0aw^IGfG3$m+1BSyQYN?BlGBEs3_T);5kAPKIfRazp~}RzK2i_Py#~81Pr9I;>%+ zBBEpDfapOnm0?%IcKR19Cn$zuNjNH;<9A6W?^O3j=XdidYg0>?ss`remT=2wQ%~b8 zbE#>zCDgv!>VE(n-kY0wMXXA&@_L*;!aZzCHEk(=KYLGt?S16PixjjNAIZ8&K8$KJ$p(!9)h(o^m@X!CU~qw?Ib z&X#arJSX2MGyPlG`h!5clfx|h`-1cqOZ7+d?MS!K6ZuB zE2%EF3&wKmaMw_KzNLfHN&C}nUFY4ez5mhYTn$`HxdnI@*+tbm)FR*<_j zSXLj`C5rg9l+3=#Qq$JYblK3u{JZl7_0}V&zY3kD;am}2!mQ)liCN-n&6Lp5F`E)A z(;w&b%N>w4CA5ZSqM|FOu>WrUY>W4PqzdVD^tZgeqA_|ce37QGUz}~NewHuRQKp%u z#m<^kJ@0HLmwzaY;~z2ctdEc>RU>Ar8U(9j$0pa#!nw`rH%(y!_Ugh&8$HnUPuX*8 zcYCg#qqYb&6^CSgl8O}Y0(PeBfJJLtXiBR%P_@{)%+-U+r$39!&|hM@Fhklw43@W- zfA<{}{w>y#v?S|J?W1Wkf`9j2r_v%nS6qeNG{pAKbk$_Fz2{e=n?g1jp=zTVjlKh) z$8Ik*l$5P3Ga7oC&soN}H*j~wv(h@`mUmXaQm)tL1Vu#R*ns4=)e17&ME96Zc# zGg*^LaN8Uk%zqlX8J^o{*FE=XHVOFd|B$co8Og=TJyF&Prtv11(NJYH-*?`oZ?GZa zZ1S_}h-R~HqJCybweZzZ{o@}dQOS|9JHo<(_xVjxHO9G2U5a!Kwso}JwS0GIJ%MyA zH&5IL`5DKh8o~@_9W~Kuwb53OwT6AX^P4A_spMAUN?A44a?K501O4Hkr6G^Pmqv$0 z?h5S}oEaFZcli{{F%d3Z1MZ;QHP1EF^~GJ69?P^B7~zXpTe=5(r~1@FWNMRiUH!W0HwSDBApNiT_R#T~!Rl0HkSv|pDfWS1 zyjSdJZYN(`Xd?yUc90A7A4JFUq$9#izBkKzw|O7Yb-jzA%wXzsbNNcKHJ*$<5(|lK zL>uw}#Jon33UUJ3fow;1lC_r2ke!lskozc_$-m07<*aP7>>*iB{0Dn28unCErPk7C zagxwRc*bwx_54ll0Po?C0B>QO7%9z>PD&jh>e>S$#dhfnFcSnR0dh53Lu5As2Lcu| zA7bQ7Age<}dx>R4IysrVL0pBrjeW#xVg$tUGYKd92D=>rVw!0X<%~tsAi6vWTBrfL zyK&&jo)#yGQ4%RFkj_ipAod!9!y$^8h~DER5V>CPemD z5zk@25D)nv5kv(X zDrEWm0}*cxo{wp%Hbi!NLk#pL#L+8p7IMHZb|&I*Lv#{aI*u1W^ld)Gxz|7j&>_eX z`;NN;XC(kKZtekZ;?^*V)exmWgI9qpUjNEWIsx)O43XJ)5P^>d=0P{$Wvqvt>vwonL7ez! zmR3j92ikjr2*QV0L<|KDHzryU^@-U;0I?o8Fq`3M9$2FtwIS?87vkqGc^I*YI8XEj zn|MpqBqd@NQAHde&Jr6Ti>o>M19sS_0mqt&8-oUC;y+;YTF4_>3tRyTtOtQks9*VA z)4)3j{*^U!12=?yW|5?Zxc*IPoU~mU2+W{G(k|eX{3jJb!eSb(3CxCpz#*852f_Pb z+!5x}7h8g>ng^?^l4^ za2hQ7=k*T&Rs9cYeFi;$hO0_}fl&gl0{FiW-izS91h^zW`2=2I-!SkJfz!akk@zcP zP{h8#!$<-iMHcA1>#tnA-+)~*4D!(W!++f&Gpil=LruXF>H}k<5qvg=&!!;r=Ag$e zpvghtwG4u~U7>adV8*n78V$fcYQg)@s~SQ5CQ!Qtw9^`{=nmI)hU@x5H2x2;zzL9{ zHw}0}lYr?m5^QS}^!z)t)*gDP3wKr~+*@(LTL=Y4Ln_4GlYZq<=0SUT&|Y(>)eMfZ z;k%??wE{uEflxOKuB-*4?+$E*uFzv!7)3*?EyXf97)Sx^J)NflYXs0VZT@x1l%qBuN9%_SKj1LJ^ti5-G_DL5oqlJ z=$NRvtHUNui6Rd`dfxoc~{MuybdpFd20Ixe(2lu)K7##*| z1N(RdEU4?y{xY~?1*{5-VFg|at!@XK-2vxU!Z?mYi~D|YeSTWn4JZ#_UHKR8;rqYF z`qTQ3!#a2ntnUV_U^ie6kAXS!7W`W$*svLRD76?c9;B#3A_acUkQ52HsBUA`|0JD-z;w_ zf6pn~N!JHfCvIn3b0NS9Y)EbeJ{Iu82)(#O90M5)MdC)Wfm8=sVRbu-bETHzJz)$F zSx?*%b{QKgq>0N#r}Q@(Md*PyatGF~aw3}?4x`;k#1Ri6Yx54Ql0Q%#VkvQom;srT zEr5N~fzXpn$x_({#bjlbvZm^X>V;~ys;g?h(xx~Dp5s8ppNfO>jq)z?D!{hKkp~H1 zq85HBeiOTh1;Qm^y)+hhWQ)jlisLG)=DGHTufN_D5Ef($ZVQRLo5DiFE{A4>%I0 z=i;U%pUe)(EzT8cU9FQ==UeKh$ik3A{`Hij#T;%IMBT5^8t+_g6IX{0vd^;CGoLSi zS(yI)_4mWyJAOO&J-l>8Ws)h)8tB%s{RKvp%ly@!{2v9M37;1GN5;yULu!7?F(#WM zeh+-9TrR~j(>(KNjT=!jxlCyVNUKOzTYX#6UN%f3_<7V5%hQU_B@K#Z{P?r*S!ri; zf{W%aD(3sm3aK77KQ<&$lW;Y8P)b(ZyeN54n(rR|*aM?!MR_9~29? z>)sQdo7Pl=qeS|#|HtQV!;1Lw`j$*jF~3Z1(q`zNgz6)Q#te>Kop2&~b!@}Pmm#A9 zuIo4%4`{;>;UV9LHSpgh6P_VX<;`q}_n70BDXg+p>F>oqev}rqD!W*<)3(T?6PA#D zRr7rp2RsO^8^OosC3j0UB_EBO8$Bd^hrX_ErgARngZ={~`#!soJ;3Bs|9HN*?6xK5 zg398ucBKc3yhZzpua8$**X0m^u zpn2g1G2Ie!QVu5Wj?0K08!;=G@O`cvB^xQt<*Mj3s+(t!^SFJgZLVdJsiz^cVqlr0 z7#EExx?kL*>}_QO%T#9vZ>ji1_EBT@iw?OFCB%zJ~?t|Am`Idu?KtE zvD98ynIq2r84%$S)+)<4^KMg=F~G2)Vn%t*^0M+o!)?K-_cXXF z@=imgpScuLe&9rT0#j3lVD{h zcq6E9u6ItQ>y_h~eXwn^Wrca1vAZFw@<&C0p_|ceY3i&&*B4e3t5t7(?+5LQrp(_ z-`UpQ*}B0}*F4d{7GVnO6ThdOpfr6Uz`${>7SjPH74Ut^1?Vi!Y^oz?`V~hh!!T&pPjF) zb4)#qqYXzYUsUMIxw3-NsM5)$hSDt+I^z=X{Aa@~SIC2XME_wXH|AS=_qh8xvTa&RJu@<`s7kKlDrZ&>u2fbA7=n$_;Qwz2 z*3d3t2$7&X>64}p3^7Mk#(qfLmK>VAJh5S%U)1T)HUTGe`_*akLfnau^=7)?+m}KP zMM4X`ZaH`mwH2;KI=Dk(Xl^B|J=Qlz1cl zMT|Vs7V=d;ShqoyOKujYFy(H$eTrqK>2TFc!=HxA$_|EchTDeyRpX2q=0?`H_M2|n zdsbLMTvv9`-3!cjdz?+Ez9G zD&Jlf0L5IUsOVAo#c;y-(mcm@-Z_BU$m*nvYA zR~$u*RCLy4`(Dt$3R)HVDf~v{sVHsq@+hB3U3gf?wE*O&^2t(WkhP@x+)moydTMWF zCC#)^VU!!E87G=(v&u@^H#p|HEFK$p^Lq3dF1~nV}1O6x@q@oH|jEVueGam{#wo_$|uZ+*SOSQ)vHyK@{)YK>^vGEDTUT- z0K-#*sp*~oPnai|N~Jq`_3TV8TbL<+l-i>q#8q;e?5cdEVw0jm@j&sHB42StF;P)V z!O2fR-nWC4li9=sbO3*qBBc{zg!o8UEewFtO&AYoVWH4m+yiJxci7w2LYGi9F_^eO z)F!8rv7|3>QiF)m@C1iy5C__Zmt#NhU3iF}1Yt&cDczO|q^Hst$o8Sc*Wv`Jq4W=Y zb_U_XVeh#KeC{q7OEfTE zZ%LP>)!;L=ml{dgaI{fc2j`4Z2;>rEfZsG2A}gcdxe$AS#jOSAc@6Lprot|67CeRH zEId_0fj&TtrZpTrfc@YS=wT0@gA0KHxdPgwq-Ro))ES}ylthc9^ah?L;f5Yhz<#s% z7uS0e?CdAQ{(cR3^n<{2Oe3BWpNVkTH{L}?^d23CEQzn+X$=G)O^0_t6lptTE_kH( zkn!-Z6aoI*4Dd|X!yfh_JOSh)Ae?m}TYn_%+A0V?G78%J28cmC_^C6A_C#OUot^|a zMIj8#^D)3yP6h9;2}F}_LyRUA*uWcLPumiZfi&3XHiTz<`~jZkJn*ik!k+dlJn3T} zc+Wb(Og;c>_$6c*90WgT0C*}uTP1G8Ub!iFtQqhOkXhhwv_*g5EjWNUi;jR7Hx9m= zj23_&`!B-C2B^SY@XJ@C`9uxkID zGp54+y)o>uLtupGVO%NT2~7puWiXLK^dY(u?LaF=B*EA&fR~dA9#A^uRNTj9;F~Q5 zKl3r<2ZX?wL_lxeN>2d8I4+&SY2bgJ11%o~26hhkO=;k9RR^D{F6smP?MZ+xB*J_i z!~Ay>Ap{RO7LCCVstGbY2yNW~&!bSP4=nl_xH)7V1cUEDfVbQOe3Ryod9Ve&2H)o& zd>MSjL(rBFVS(9tAyPOJ{R24)2SHw`fU#Wus$%{SoK^I!`L@BrczSV~Le01o@VkOfc)dfyEw z(OmHVDaanUOss|+hTFIc_z8`{Q>q8gFL8qhln1st3-tCHe5sY-brylgsQ}+u23}hu z=y?|0(~XF3zqtAP(M)*u&pI?h>I2yo`2TC~JfozlvORup#m+g*?1+P>)ZE4X9Pq#g%B^ zR^k=fp|@q|Yce`B9f@=!W<+JqZ$(}XwLiUDgp9{>@*IWKYg8R0`9NKc=hjVG*BH~u z=w}k=?!#aeUQTu$zz$;2p?vJbL9}}s8vg_+!DGl`KRVb3d9Oi&5z3m*DRc|+{D9An zN7|orqWp-n?MTXwCQjo9C(-WMs$+b+5D#cmkcc;xS762d0ne!x**6smklGTgn@aq{ zDeTia&hc*$Nh2_O-=&1F!A?%nqT9-3HJ|Z1gFf|UwC5tlsl=F6Yw;{dXdq?H=OlcZ z`PG-Y4`T(KNIV;zeh*CVF>wU_Y>2$N!OQB7b+2NyU*)9R1Py5-JWpH4at_`Fy3-Tv zPW$fX)UlpBD>#=Ape19_t0qLeJmj0d)7Dgw%{(;uU67z#*oXeyDaHO&Fkh2}W9o9^ zdTKyc6Bvssbf^{c{7od+Kp>M7ZE1}Cuo1EG2N5invFj3^nEgcS*m*TuurOxR(CuP; zvJ}H^=D>A(1)+<;w>5zb755$p@{ZVIBxYS8SG>Pvj%5EVO%r=GR81f-nOc zb6mNk3zAqt@>JnNU4_sR-CwA$5CckuVAHw8>1u050X=Ld#YnmGv&u#} zL2}3^!7)dW+oeiLX3aV$TovPWCyDYJqT3-Z(T&$1)%P)+(2q8>Hf+}2*RL>i)KAwn z1Q+QkzNk)98Y^w&$E3F5At5o;A|Ut|uq%1nGu<=X`=$2_@3X!f{|CX!a7+1dG1YW2 zW>ez4w9fVF<&@-4DD)Lp6fQ0pnzt#dZ(3=>aPy05X7EE#nX`lSaLx5<0UTlUL&rm7 zO}Khc_3Y{?HIABrHIr+%S+_bnc@Km`y5-UR63yx9*|CN1HW*M+-f(53lZ|GU9V<>Q zyq48BevFVS*Mt_~+i-dAhWwGl@Id)9(I|T4xxtqHeXf_QpSqWHx8UxiyM6D?s`gn= z+j`kwa}+z)TFWhEmh1Klu5SYowMW$X#2q=SO6oTax9HmP%T}w}c4>1tuiA9pJX(C+ z{iLOnW4Js=?G|pQyAv0Pn_%iM_;j~~O3!ZFPUkhp{@Q`HdtGk-T5qhYF&{1#_o$bolu$dbHWo*1;R z->En-K_w*97x@xABQRW3@f_ zymI25BR5~WJ@CP6wbyJJ?tQ*IWxcMO;r*!liT%>fo6WZuo=ocA&kmh^ux)%Db1loJ^1C{FIx)JJ)$kNC%X?;L)xa=<5 zjOupx;_t3~u&pYps<`%N=U&enU`KnEY(w#gZ-Tpgw>+xvqtNrxLn%{!l^tt_JU#fjcdDnUyRChV zWoPa2nl=yT-EZ}9pk=9bldX?4!}E?W)4w8nU`$mtvB zOLcd$4zg}>9B}lV7|7&$$s(;%nkt>8ViE&>65Q=A zc6W4r@7&^O>ipha;VQ7l*^=z<**04SSw}l&dma)QW)YkwA*LuUDX}WuocnS9JN3I4 zKT-T%&f7_Sjbp=E;X~?gV!7cL^EXk;jcH;hc9U^pe>G8QpggUtm!6Ldmdcg(%BhH# zduwS=auwEy_PsF~WS1B~t-;KGFusmju{=B#b+aQP9MJ`YuT=>Xpxk?%vZWHOO zoKhT;Pg*ZY!A9O?uBTi*ormpjI*g8CmXE5P58buNjwQ}d+#`a`e{d4B1*aZoj zk~?I0vO5+`YfxBnt2ib{jTx$+CPoS6;t1nMarY9uQ3DLG>*uLAL;L+Zg4^(EmPb+* zd>l%CWPf;jq%ySE@A3Z@Ob!n5n%q(De>j)gnp!Ve&sj4qJ8HhQw6cHToao6Ti_02u zfw6b&$z&>Ik%I8upIs_!rK?ebN7 zE<2vK{nd8B7Hi#HyV^3x;;t^XeCy2iEeMoEd_t}1=je4Yp17>EF4i|L0FUzD;Wb5@>`KQ`Z4;H*EmzB~U^L0*G)8E@$Ggr&O2bb~pWy=AtTPpe%* z2LgW&P4h2wE%l~`D?+~$ZDWe0MN$HX8Si1}_j%6%Z>;|tPpo5$E!&~m=URWVPIQ*J zUv>)aQGxhKVPu`uQ#@jP-!wV)PFi91>g;}5m08~4$CCyjCR@FmwiM8g>FgvgdxW7qkOT6FtX03ev;wH5^~$-P0K6JUsy1| z;H$hvxnC#s5br5n)yt9lp#rI!u8DrCloFmMEe*Hz?Q$LP%nc0onLW$NYSbxs#rwe9 zJ2)k{!~3-NTmK^eA?Iq#7dDThhrP`9vh$R8jIYK$z!wU?FFg!TROTD2VrpYQi+?rs zPS(gAF{?bgO@5F3e|cD8<2ue}80!^dS6I zWW8K2Zwp@a4MnG-yhA<7{tdy81L^*x;LXs5pw<6OAU-rRc)+{N{iOT6^KFOUzRNk* z-Q2UwJIP-WNC?MB&6E`3qOQa=GWw~w)rsDevl*VOLs{N>dD&0p#N=Ghs;MW}+npqu zHi~U!=N|h2)hG&yg5FLZ;^L^XR`OCKR2-0|9fCmcxGfzXn!y@ z)GQd~eabo2dEQygYWJyYp!cHhP5-t~KlzL@mb2)Wx@dE|nD+6jljo#=RBvr|X6~nX zHF=5o%kx|1f0ws5?T464#;?@3!!P^)?mI(n7gKOn=g zMn`%^(v;oGH&PnR<6ot!{m|DPU*P3NInzUEge@DahCob?&n8_ zVTPH;Q|7FgD=}jH=EP$O^WzsL&PwVSHAk09cEuz$EDe;?#Dl^Ec`jU*-SW1`vhWP4 zgS;fNF8pC6MeZ$42+xW9Lsldk?Kq~{wQz^f;BX01%AF#Y;qlQUFqp787zp2!;%=o);tZ{^)z2QgwV*MW7Y4J}`FEi2aZ*c}E^8=g+ zE$hfZxie>Tiu7 z`WE;|H_(=2S7&ucI$ z2B-tMx`GYPBZJ95@SeNzX%~Tv4CK7EkX*V;LHRz%+j<%b`t)7A;#MET^b{im{uJSKgWSCpR0 zKxI6cNzTJsGLwB^7>Lk$T2Ksb_N8!D$Pk|u$B8S&@5Ezpp^l2X;jN4j`+^(Bi+14* zh~j1#))P464hP5R4pX5$C-H`$a;fBCFo73EIC)1nEm|fu>$;S5kC6W z;8=$^li%l4nP^RC&b(uUIbez3g8!Z%cg!EO<4-WA2g0vliswL1Hc;m%ki}+#S#W_C z?4i{&;I4F0o6x@m@|32jF+4J0Uo`;(ZGo&`A!qI+YFq}Up)pG;z$0pDR}n~H7m%{~ zl)8r+ZVFbUOl}qa3|yip^U4LT@iYD1$NBy{{PZ8!Wijpq!k9n~i+jj-H>dWQ>L|vt z3q1Tnv`bGLjO6Q0gu|4gLgqyJZ-Re)2Cj1il!l+J@A_n+EE_{NEV!qLa>x1 zFxYhPuQ(*=g4uANY!@19#>RMRc{H3nEcE;W$k`DjxE?-|#*$dh8T(yyX&RXC7a&Dn zA)CV>J+)*ciKFx~FwZWaP_KZXjRcVz2MYBUp5FmY8&by~>BR^<2iv3tS26fi8u*Yz zORE^WQ{*=OwvP9+3~il7Et5f3hJh7LM8E$E5;-1}ZZ4?j=OCs>;e=eLjrY(eAHDF> z{(ESFojzzi@Ng%<6{`E6fVM_JN&MW2Mt9=s*c4GbYq>vSKmb)fspSfH(;Ex_*D`WQ zJi?6Pzy5;U)fhkqP(=;5OQpx@$Tx?78_*jqez~QPem~&w@5K=lx`6VIp-H$$~D>Z|(O$ zBxGi%#9DOfCOy&mQ;ClKE7LY1zVyw)82RX-j@B6|qX^k)S4aBr9M>!KR^u=Yuj{jh zN=>Qj?w7TA`xEDrAgouW5aqKj(kQYU4EIIaSV9h$ z=fqLq`nklZv_-p*g6Yr2pK}SDd=e>q01I-n(1Ll81Y6D={3SFWA5>rR9Q~?$QvV%1 z$+3n#qFIO{YUT&!FRW!l(T=?!*yqI8bbZ7%tkC0l--B1BSg40rX)XQ_kGh47F|F}@ zJqzn*uh^OqorLD7jF%p3KUTOe^nx|?tQf&o)v{V1SEn+u9Uq=dK8do#Tm1L|HPya+S0jnEZ@H6JwEOMmW>+xlzp=4x6q zOsJw~chK2ON;`1?R-^-1@^02W&F^quaFZJ+8m+yL?`=A>74M&NLYNAkU4}I+C6==- zxojfpKb2SL#dxy+OqUbHv1C*#6gI10PzAyRz(|B2)!urI6l>Y>Re-A5FN)6|Uis~ec z#z&=PjQ>VW$N%^YvtuW6&pk zNxviCWOTVeXrs%*C-FSouMgQ7^uY?eBb<=FU~c`yzKM+XjAo2-Ni~U6)%o&7{9S9* zMa2C43X-kWfrW3Gi<_-q!;Sr-`K*q_h2sHVP1Sf)K*_% zjrbQlmuFbRF0xkMQKyKBLIb>gEzmAOX$OaRt2$Vjgx_zUTA(aceiuFP%WpCU1!O|M zO0@lTbv*vDGkCM2)iFw;_$f8?V4u5MNK`FKr8)w(unn*5LgBCKMB>A?!f?H!{!N*H z23}D%C|)&9yrXtkEcl+DVNS*&pQ-qO&a#RW6B)zxL4ZFL8_4+7z)sk4XZeptk zVa3bIYqSG&gS)Kcr4$L{&Tk57@8+r2&8fSFvJa^punn15yAAALUT0Nng1;>py(^*@$=Jhjcs`S{ z94E-|G!BpE9xU7g^igIU$FlN%&kkn_|qty+cM<(r!qsAGOc@ZfsMnB3~WkUG$+VeRxewGGk?rFv%wJvv;6Uq6I_H|}o zV`i_L2*5Zr>jY&r!-sZOeVldgG5XPoeO)8gp8D7^&D(yHwSE=8mR{@}da+CEPXAV8 zTQ{($InK^y7iH@3)_9pG1K6{?jI8Fdw!DMYpNyqwOOLuyvbML3r#Bwf#xiQip&c5Z zHivywD^^8~!8;%SI+V7UQv7&ZH z&&z7&p{07P9MOBUuQ99h6LqV$_Inx)X|u-VZNj}Lx!Z>RJ72UzkOJikktlR&sMV^1-u@U>Wg=-VD`g^V)k@9bh zZVght&+~mOosZR3Yp=FTtK?m6=kW{N*OROT+N!*T@mYmd%tLRMvVUL0>owH!1+PCt z%Qo{VjWK%y{rH(3jP}bN_n0{r%5+h>w$szN*$Q%ieo=Snkds*V_}6RgokxF{LP^?(t zr#J~xEV4VZJMQnFbI%!lXYRar?|t{X_v_uMefyu20q9@Uuico*GgHC<0Ei{6t!H1g z1ONqLVASxL!&h1Nd*LRy8t#E};5hgNoCz1e*>I6{oC{~cVeoS}1Wtli;eRj=B!PqA z4j>Q~oCMp!OfVXRgST)q+yaxpV88({vL5*Zk&su&JR}>*Lo$(7){|Pqi=Ib$^cK1r z4Os6tS-QtqIyY+BYKgd5^gdeuccK3t*-Ec^|4%T+xiK;xeOopC!+UuPa$h^eM7?j} zUj+MM+o4Yx4@&Km9J|3*q`6H8cFiIB#O0tf!SnNd=go%ht#(d(ApT%paXg_u7Z&>3 zNhWp`yQ5?Y%k+(?fSlDA%VY4P&dqqVzLmQz_2B9*!+dPKoyZ&NKF#WC;=g-OQEGmS2^1gRq}VzC)9f!M8!atQnIY^B zte3|kgxZ0tK84K{d2IlG7#Yid68KWehU1ClaH~2%FC?$nS7}YyKh({(-`%yg2yRWVOpU=b zwMF0yaTdDA93pg->_#lCr~hImfk^xy_M`M2cf&ks`w{z8yQrVX((!y4%eD@ZpfOd9 zwNnlRv*j}Fit<`dGIpbXUYLc`_{V08|JkUn#V-2Y7(fg?)K0LNW3>IfdAbJwx`OQP_U#s|#SYnGQwbhOL$y zM7-A%^tH+(gF9EwS1FInoUFd4$nSM(BR(c|DGai`L*gxnR;u&!O^AO3z zDhhS@?Lqrv>Js)GS&WwBN%nD6U-AZC2Se~25Mz?cmjc7Z1~0HT+1u2GtA^Wt-VYq+X;WvjgAWuH!M z#;3W7EAOZ$-&M9})?pLfgPae6livE@g6AJ!ysjMoD*x58%AGIYyiwj={%BU;tewb> zQ$4mbu7#2AD7W`g;>4_!I<`+gYjrBGo^#%t#M{Ro9IXA-H7s#Q^m^jBf9Z!Wd=us7 zXc=6~J*+zYX3fX#!TZVu7u@}0-BkshUjoY8JIC*0#m%7V4D5?RGp#%A6#X*F- z+J?o44!{{xljp07IU6XjzV=RNE=2PSqyyqUo(%+jS-#2sC3J4!I$i2N>+eM$=01wA z&6TL#e!^)Fb%eEysvEmM^?v5*oS(D$h24WEYX?<*;ET~)5&b;tU4LVZv4;|w|{1Mer z@re_YE7Si;Tc3R0>v7d07o}C=RO2Y#&2`^(oot29)CIk-c?P^Qo$46D&7ET7g`<2a z*D#&6lINDfG>%=&Iv2Wpth3cY%0+ z`YOe$@h|Qsno~61v|8f^c_jLS~S*qHoPq-dW8 z=PO~_3F9`tifTi>w{1fpYz5nZHNb5?Q?3cC*`3^cK1%vt_?2x*!M$Z1rT?FdnT zw!w;!MWC4#RTIRW{0+W9Y$W6et%7k(ivOjr((j>H`73Kr)c9&T&^y=xYB5|xW;>6E zAMz}Z>tV(0w2a>}>tyVSEe)ArBnp-6esL=}Y_mB7_BVJXngCBBbHOS&N2@PfWZwoV z*|x#}{xtW>-=X$J)s1SeZ>z6^Kc@CV&6L`~OrEenZ;B4J;~{$@Uq?Sls7WR=uq--b za@vBZI`%4g3&YTPTrxy$w;W9!r|<)4cQ_QBfW`U_xoL0--G&yKAwsCwM=WG#`)}8D zt-e}QSsUh`=lj{W!C%DolLe%;eP8&wsLoz8aa-!m%*yO-IlGboA58RVLZ~stVrZ4CZWx6xJ`rW>m+ME8W zV4m{89Bli+(Ib3iG#!5>B{pMiW}nQm^og-Cq2mA$@`HUDM0}_n1viKS;vD&$yh5#~ zdf;`SB0USXV7{UI277V)`JLS8;0Wd#oxqF>^bT}q#?xhfF5ne9>TdKuYC(wI(>?Cb z`$|&rgu-e9XZ2M3??b}#WP~D+R_||1o73xFXaD7gIr;ogQi$$rweamVPFO8 zVu!H10!7RfdK;a`JfrK;_55-EBDy|%RD57`#gd#C!urRyO6rj@Bqup{aduqNoXB`$ zq;i=(&p0^0cuZRgrlMcks>ou;7DqWb7+bFO7eWK2{!aAw%xboPOXSyZNn9tcjI9o~ zV+jA{nu|4yd@wLTtT7(qEkdSvj>nHmEy=o^>&zRS^EByvf2M>*S|JM zNf%9nNOAw=*&p99wOQ8V+!J|U=T1(!?U_WF()qwI{#L>6!Y9fP`V2D%TT0${#fSdj z`pp(@v=$~apZcHr_t0MlW(6h%$FYh0M6pJU5%074%tYU@+VTDo!EAA>UW%qTLc)#M z#FTMaYTj4*>vNl=eCcUxTcYe>U(-7S^|)BEj@rv8z@|}sLfV9$cV&}l&@WwLA24~$ zD|#-olc@}t!AIO6AxZp?@5p8``+W}I86Osy%>lJND5rA6hQ;1a8k>1Am&?!0r_zL| z4@9|qGq{p@%6i1d@_Fr`8mIP^*NZcxi_#uts`jIHLf@^EMkjNkg-QK-f@-re8VL?{vN2-~FPGNtTO)~Uz!QqvFn zz(K|u^%MD?*ixJ+mWsQ@Nn(3(zt~3NrCxFexufzw^|G-ZWMT$Bfy5n$Le_=ZJsYAg z#0^Z?m-I3D%lI9hG4?$$UdvE(jYsB5BU4XSr)ibORagou^)|{PakO|rdM_s^PI-lt zt?bp3P1Ss7@cJ$-UJF;p%D;>G!baf_v6oaN^%V=nhSCUGk;lu&q|H*QI?Iqi0+w#O zWj`NsG;C$$`>2B0mvJY(|9Ovj=Xn!7K_`mOfjZ0wJRD^XG}2)dEHF1|0r`ccv%6d& zP8NEJbLE#xgt}aLsC-bTXnnLgN_XiK@sLm|qziNSk^EEsjZiFpCVnT-{8{0WI87QY z^;5R$qmWDZelpt;=`ITo^_=kBh+ZAnFCivzK>Ulig^~STlL#N!3AY==_33(jqZMpw zPS=O24&^gtg6x$F#e-t8d|NJ(+sTCrRM%>IRH*bZi$EWj0`E;Q(e}Fr}pA;WU z_r+1dzd{RXgWO7fV&$j($Q1mht&#mVSDjE_#OtV7@7sj(#5su*lIo|d^L7m%U^6W= z+yfEdS(AddkgGs66g5d5u5OZN3Jv)+;%Al@P||iOMZK%7vi|CcvRvDvZC5(UpGd!o zuPuB3Blea)k$|*GY$je1IQ|=9hFC3C$*uLHFaZ@%+RFJWLfVCTBRj=3N~lWGlV7JC zO!_l^Q^YLCNbKS#037Xa8lkVI)&?2h4o4r zrwld9OxawE%*P7AaYNSID(%=fdY5ln)#vYreE723RlAH?CT`I7!M5az5NCL|s7UV^ z%g-`Xzs_8qlb+c-qhHd0k^ayVj&!6#Pt=x3sRAt!Vk;p++$DV>HW9`NWBFvhA-|4a zBV`YTk8 zjEnz0sWRns=E*!Mzd`!o>I-#^@y1xAch`4n{pA@#A=f3q`3rn~edl~me>l^V&EXT}+j=ZVDn&I z<~(zUDPp<>Td+O(fzn=SsWMONt7a&r@*N?OI})78{Na0E)6)01FULPR@I8M)bZ8#% z3Xihy3@M3t5c_As>6C)3wt4gFRA&^YEKj{1GcojO80*|iG{pV|z06|up%heHLTR8O z|15B&sw)>Fjsn zQst5ELU_z=VT0A-gJOooy^TMfb|-yL`oo+?DT`veCNzzxpcaNCQ#z=?S|d}nkJ?zZ zN*W=a<#%w4f{&Qxfx65Y|MkG>ARVj~o=9R^^f)6@!w){ z**n}&@s9enu@Qt4ogC5bwvkU_|4Hbcaxyb7cTi4AZdPXB#1Y=5o@1^#jz(l8S`3Dm z6Vw^<6zP}#WvfYCH109$+My1~~hl72%UP6U*Litg3>hIN2%6$2yaDi>& z_xinbf2IZ7oS!AO)BMI_#6hCYQEt>TKjyW!IN6srKQkh?Uw*U9pHnxc#>TY^_kgk{aMTOA5iuw>%6mF-TKe9MA(^SUjk2z!9!~ko z8|EnsKj|XLF8Cq9Xqe)aj_?_*FZfq*aNr@cI1t6y=#Na>Km`NYyZm)tlsc;wvPWI5 z)|bYM4}=)DEI3q^UZ^NiIVVaX9521O`rJaQRBwUP5@R(tmD~$R9r$INpv9eTL&D{##3JhWP(L?Ed{#pL3{x|-6bZ8(s zxQ)%??Lt6UBBqE=YuCHPE8HCJCw3Pb$CYx4LZpLfXIr_N@r7QBt8k8(fccd#AJRBn;z^I z*u^}j7tx*Q40;-E(&w0G0XbNYo5If)I*6~tWU0F}S&Eewimk+GF(`zH-;2|wEDQfA zh5!cOkI53}PwrRYis!eO1aGH=x=D4D=OzzL`X@d#?qyU+#98+>#|c{oRtOJhtK%?Df1dxTkMTA0U-4g|E10z4ake#IE~HBRhXLZIfa-#i|^G3+I&<)|;Be!_Ii)s)(IXW+TSyXG! zoQQs5Wg&+hgGm+J0frmn)dNzffN`yZADJqeq6hg^3+K-A4f2il9rk_h?@k|O1_k?a z1BBlsNg1G@GOGcBISHTbIaTdg=mPHY(1GDF;<_ggrAPl7b3Nv6G~)@0tPUIIzU^#l ze`K4A$Dog)&0L}n*A}Yxlt#+8^4}6C_7ZOiGlVaN8-nGZk|9;d2bDfnCQa6gwZ2+w z4QOR*BXys$R@tg-P=LBdEzolHFym)qs)<-AwjQVgosoCQar6^Rz}De4_&VY|@eAR$ zHMZR&4iinSeqc-d2k1Jg)krnEPQ@cZECNT7d~5^G5S_@W)EIl7qt@}2 z^Mdnt=UOLl-geA#9J13?GpY-D&K737h9AcIphrMBtYZ{tca?TBE84{(t1e=>rCeXG zAJ^ZKP27I&G*`$!=64E5#0u#PrATXTWWyFn11y(tl4X=?&vr(+Ub&Wpybl@fe(lZ- z?HJl2)O0s<$AsKe{)mBP>dAzh;BrG(|@pJh%TpteO9;uZ7p^L2 zgwyF@slUltwvL1c{|nuKj0GKGo>^enbh{RzdX*9KNr{vei#cMIwYxVK$6GtlKplQR_9x~ z)@y0{3w@%IYW`=ggMC2*|mWZ8RJmj=Tn+fKygQbI@#W`i)gavQe&g)jwKa@2oY^nrVgF5N*D;S9`Ce z>tpm2IxxB!hYiUnFuyUMnFVlz)%orNE`UsACGs4}MQ5O87U%f{{a^`=`Yo^Dk1j@g zpbac-Pmq(ycgRR29=Q!BgGlfIu7fS0XkIp#n!U|5Gho~_jvHTF@|7{)SZW==wy^bj zW1n%+(2O?bT=Tja4u``Nkb}*^9Pm5vfgEHovKhH*v9A&mg{GtJ(Z1+(bd4oj(79*{ znuxwY_8}!m1oA)dEog6Xz$f5ht9ypPTjnNnxS4Mv=1rs2m}~Sg+8B+DCPtxkHNiM! z{Lhe$OtYss$2?}fvN*fBR=xQa)(0cOF(87*$a3Ti;zz>J#@6gg(1B=Mv<;euI?-y& z4y%xXNDT53{9=tx1@GVv*blnkJ@Y$ru$gV@#z*5Xqult>IB4-t2dwis5$m7oMP z2NZY$4_HigTj++b%yZ@zbA~y{Y-QFp|MxWWDwHO`U?TPw8kF= z-+@7v_6T6WNARLG+eL6R>TFm*c@Fu)uX{@w-=l`sO B)2#pi literal 0 HcmV?d00001 diff --git a/includes/install/sounds/en/us/callie/custom/8000/cancel.wav b/includes/install/sounds/en/us/callie/custom/8000/cancel.wav new file mode 100644 index 0000000000000000000000000000000000000000..d94f97b757e39823644dc71651b26ba7418b9c53 GIT binary patch literal 8670 zcmW++1$-0d`+wiN%f;KI?kzRyKyfQJVCaw`1BTle&Ty9jWw^T)8I0kSVZ|L*bXYxU zlcs4rxtzZL_xJzgb9ZU;-Xq^f@;=|ofF9kt{nr41A)N+yojC2c1RVeX;#bFb09NDy zKmZ*WKjybFm+=}MXb4QG6$l4Yzyk0+OoV^HN_ZaD!+UTa+zNZcU`WGT;0_o7B@hL- zz$iEka&Q@(51+vl)D=vmZi4U4TE-Gl%*+*62CrcjQ!h0lua?`XKFkduXIp#MlxCVz zq^VWUgm3e?I4H0w!yB1egLoYgTGs1>V)wP<5TUigL zSe^|JGA-$R_e-Xq|A2k1)Y>y$>P+~&3|&SC@iPP+EC6$S-4qo10z#Rm~h0okW*%t7QJw)liMQ$1~o!!Tula?`~ ziH%6)&QkN-WBhHE+0IQ|rTUv=6*p6U$9bE%O(ZaD{hO4R#c_gGoxvVqPpaB5ADL+? zNpf*r)Gf%r`7ZK6_>J30uY}L|`EtE%y!a=4LSFW|`D^MB|3UJmexRSC)>6;ibI~b3 zL%g86LPBq*9#d7aLDD01k58dzlQejw_JJc{kF2d!1><3N*qOQjE|Y!G9Al1dig8CLhv`B$>oPSP6knuLZl`~z=S^LZ>2&qvvOm5Ae%kV` z-J61cufE>(q0yK4+Rls(z6@R-(Id@*WCa-13%Z( z-`308rK-F#|8r$=-`AV(r#;Mnu=GycqaKgPKkZgBvgW$23(+(1LBxpk4$ZH&vUHf8 zSJg75`H`&75gpXOsxHED!au}hWaa#9sP|31x#nplSIU2i{h0Rgmv?L4Kl?BD>*n%T zCY6KtUx8Y6_u!t*AMy}MH*A+x;PLPs}83P+H zX@0VeFX?4C8$E_D6ptzx5F!0WN-#yR`wF~M?BC4i>gr8Ts~%OqHt>d%rdDRNg|!7a zXE2}mR%>P33nuu)+b z<#B8Ye1%f@Qh0+HAZD^-d}mxl?e^+6)h$Z{zI89#Tbf@s)3B$enWdnBqnxmN>)y8>qDLEvqEERvD4&o-yNxwxX2%lc9Of%3$7h+VOQ1h#`lI^pD(-* z`Ml`U?oS8H<<%{!yO?tAC!AM35n?CeD_Nl(8>);|HLPlOutUFQFSGln-3yv6yG**p ztpX$Y!BKbu^b=qE3+%s`Mpn14N-Dcje!XH%*~2P-&8ceIw8?t0-eNa;6S>|(Kk7U6 z-Vk40S=tY|-?zSy*Ei=({M`7v`jf;_s=eZ0!UAe#i{Uu#9=pURt9@C~x;*z&vk&So z6TZclG_4wInpbnvWU>u&4)=@_4uXH6pjL%;i0YHnvC)<0$<01BpP11-@@TL}y@|X- z()4|qNbQn6BSNI<%zT%*ZcO!+@`K;#65(6_l9=*>suso}#+vF&b9j^nqC04+dJ+Fy^A-bH)$fZ9MSY%PHqEEw@AB@E+K$y zEPYqrNH(1`N~v56_haiAi^?>?P*~ZwN?&!i@=R5!;ia*P^z zQMJoZY#eQzY^X9GsGd=mXNTSpUX*?(TWH&b)Wwh@QGO zvV$r~(_2wN6J%q`#1C){vi@FkvD#n$rtDbd>k4PZk;=x#@y6y=A?EqkXy*sd7{4Gj zhS5Y9b#74SsICc5(qfyQ&Pm96m=F|xE%>S8lH$3-temA8OUKF_QXO;6Ij62;oyKCT zX;)KPv(Gf4dX6E&m~Q-19c0>S&3D>8Hs%^nq69ipP3WhDt&fXOnV&th*_rJ2>3iZQ zh7Z!OQ|(cQYk1WU%2fIbc}VE#^VhdFT{RX~Xe<6M_mqcL4y@c%<*uqX3^)I5ee8(y z&hWqC4N^8-C||5?7^04zm$JCg#T+_kW6F#eA#{#rpsJ&Cq9RvWKwD&KAm5+rq3n08 zeJp9_5$35Tndx42o^g!vh9R$JeQkxczw?@Bp}&wPq@6^lyh>f98x{6G=6>?Ctg@_W z8GVz-M6+R)`X4k~6}fV~;zw#bN)*)WM%RM6g{Dg59wTjBU>I!tRK2gJYfY1yXXZC` zN9~*4W0>#xBT@}GLiJWm)fNO@48I!FJ*9p2Z`nk4Y3h-9E{Y5_2dLF6l=BqFWKP&v zRImx&Lk_3)cgqoTW7EXyNMoom!#K=nFy@($SR);m-7kH8xgW)s(r{t`y+QRk;AzmB zaC_`uNexrT)S~3BiR0taB9;XW*DhCeRAiH#(O!NXQ{=9-MOtB9X>DfhEmK8}&a@e4 z<26%HOS~<^In~pfv9L>pGBF!10fA&MdbE<#e%5D)501`_n;*X}zGvKb(RaerLvHF; zXiq9lvLytC2JxeqLmrpwh?8|3w70jFTklyW)Gjs?<|SreIcWW8yY4`)mfo$*YxcD8 zD@dfC%ahdU0UrJ7&|ML|qJP1%s0ye-MOwr z=K#ld_7=9Z`r^6)b?UlHbzbW^Te`Emdx^KF|6eX#G)Vu#0NDWfapfd+KW)3f1-b+J zi$Q~fUj(NHhXes#Q*DvztXv_>C#C~E>LGsS+j8IhoBbXAxy(|Z(L2~%iARqaQ;_*5}(cY;Xm`8gucRF;f25p&&5<} zwS=T@=n(Rwrr>WNhppf&cpK7$f=DCWupEBD6V`Z`07>`)ECku$61J=@;-rz1Q~W9x zh+RZUXd+I;o{W%&Ne?BL6pd!1J?JdDg;*2=+JMPm75Ec4fD#UZt6_7v08ef*=mp2X z1T2q5H_&=C4h11mdL-?XilyWDYQ{c?qh4q_T7@1V3(|njU=&yb&VskVj7P*67zi7{ z#xNQ7gFWH*a2V_iyTW#`A*=--z-_P`j0DYr9MogX4xxo;6xxsGqaV;Tv>h!)6VN>L z1nd0^{f7+5g{23A0F2sCpa+t==o~tVt@whmio_NV!Zs`baadmoXbo4uZ8)M{D8N>PoM=iU5wS!Jp(ZH81v|n4 zFdV)Djer*P0VUY0`Dh24f;yot=&*EKdL}KAdLj>wh!%VQ3%Y=wp)Oz;IEeAtiZN^i zGvP^i98Q22akNQd1AGrdvD{O5n!X0lVq`P1{4%f;BT|80A}u(H-b=O86y%a5$tV4U z`lDhg3?Cn)ji?FghGt=p?&6gK%EmrJ9QiIF9h?DwfFT%>DHyYN;1bvZ{sBht26V@M zT9FS;1R>yW>_3k_pr0@zm%u;}h>oCsz>U5~OHfmkhstpttV7Q+PA|}MbQwKG*YS#@ zs4p6Uvxb$101FC5$B`N%JOjtO1g{*3#-NiJ5eA@`=ulArP@S~16-x9GT0ZqXX&qq%55!?DZ&f5O?-AB+L zMB;oN2`IcCVedMF3t$E)00+Q6TxVBs-Tbe51n?Ke{}jlA9?Yct2CBhsoUdDe24^b3 z_gK&yRExdH!m+!GF}#l6V;}CJmDu`uXfH|zGH?caV?_Y$z#iU0w^1E92hxBFM==*% zMr)A?)nksPFSa%fbjP?&$F)5T3;;qah@nJi=qHZT;~^2BDOgl zBg;vQ^hw$)oy4|n#h9dnai9u4L?5No(oJN;+DD)dl3f~#tM(SQ#*cb|6l9jNP;1<2 z%cO0%E3Eqe{&gDr{}5-+T5RJgjQcXM16M;awqPypBO09H5x4`K0`I|nET;&a$9GLf zpRmM#aEu>d+@_-8_|ApsKM)Ha;hb25JZ@3d_U>sZpqQPt2WqJSxDbZ2s2qHi^#JAza4iQ;`}C45hQpcg3zt8S?`1^l6t z>DuTz>WAvP1r}=$sGBKA$$|-|7{aFcHhV6*#ye*^rr1sOpnhcizxBX2%XZUt$@a!R z)w#yK-n+`bicbbTWFwWwHLrC$Lf(X3jrcKI6+1WfYwWSO2XUQZevRC%%a>J%N11cp zF}?xb`R-{h!D)AoW#ZV$>`A|xN%k`CJN7rV7tDQXCzuA99@cqmBkV@U8BevZjsGuh zzR*KRMc2t8a#7{d-U_%B{547$UzoTiswcMXVbI~s_{8c_dYC!xfn@cYw z_e%HJWxml~pXafAhcm}9*D=>M*Bi=kJ{EhosxH{F|!3{pl;Pk5VpH=`sgy^++!m2o(Bc>o6*32JdK_?vu6^oFJA5V%haq%IIK(mf{K z)x}giukJhE8J@3>8Fejc##CihWK~d=JB;7e8tjtqys#G>pjs)~ z2fPf~9J4e@k+vvfP1drUCJpPO{?gQ=X?&GX2=`znbTNIKbi*-(j%q05$s%N9%RT8X z)*0t+>B;jHxmUV}y1(Kb+Rsi?{hiu_HE)bj#{C9l>}x8ht9R%bR`?Sp%Tg6;br0R~ zFe!FIa{IKRbQ|`oE_GM*5^Vxl$Z=dZFhMqf?n=d=g}j{KCH?^ylWhqk>RIId$@{^# z$S?X+{QG=QJwx1^of-B6b@8Shh7pzHEALiS7@3;P+Pihp4vo(s3@1wzDs40U+R!Ia z5ea9L-#08wXEH`LG{(;h-Jr@Nx1pIpK|Z6};CWgFMo4$07O;j~Kmp<}aRhtOm+mwA zW;3ujr*CaxpR=M!V+X2T64Cht@)v4Mg1tpI`?p;SmNF7Y&Q zi=I|~f$hz{@TFsx?~r?{XS4f?Bf7q%wuRYmim#nxvD9^|7wmzaKiQjTqwHtZ^MKl* zb75R0h+P~%t--BCn6xC(6ni%;C!j0+nCL?^lR-rXMSHq8aS!)v67Ivh&==AG%-{Us zJnO7>kM?!&BPN0Q$D8d{c&~WQxd%H3+FI0+wHos%^ORb@Ww$lMKGW5bIV;R09?PRN zw*m`-#)o!^sEHaJTNO7W;YowR@gt(Lf^w7*p@b zrR<<`SHSS#j^Ul6qGJAxh4DM$*T%n&z7{$-ptF1*xqui)-K1;fcjaAVG}#m?;C?s< zP669QJ@?7?o9BbOqi2$Lt1pQ8*JtpidM3JNII3-H>w8#>Enf3gQ?_Y|xpmzbJLx&; ze=d9lrBs3PY`~;odHCJPZPBT*x8rsvtW1n;po!fO8m`?&uOwCx-^g4ULro`cp;oxY zw~LphW6~Mn9=p)@x96NE!Pm*Zkv+(E_mB0B^F+7_m%@46eyF~4U6uJq)76@BrXq8X zI#j>g+19(Cjg}J0K*d6hTGuPMdDyl{I`-Fu?4&PA9~1k;HIG=YcdNC^FvUYfC*=Xf zGx`D95VBH|bVD2@ZWLTx4*LVM!nf5|#4Kn3bJZg{@7R;=Z|#GfXI$Og4cr4<<<2DM zeMf?$v3`MUnrXVyU@;6vHHX^#bKNd6MiBjFS#1yMaT*F-k=Wov8&L++;4y%2pZCL$FYy0|fwoHfU4ED72J@!B1|3q3UN!dI=5wtYK z82T;jNyN+Oaq%}3FC;Zh+!#AA{FeTbHb&!92Wp6b-?+=amrEbusE(d?DkmuueLvJH|;l^3Qtd8vY+O{1sYu= z!sW}_~F-v1i#_*6*!Tt*7dD+Y6oh+3@~Cw14YR(E5<2p-EwH!y+PniJTJkIci&E$MAb0eS)?G zHq$mzI}|tRVH67{i9@+FOoDH=_ogSwv%?+g?&Yd=E_TK{osO-Jeh$%|=2+_pc3PZQ zTqoRTJg>cp%whjZ9w6tbbWgTRqm<^|`ii z`x1xNWpqFGzGG_GE<(9996lu%%dXPL<%bjvR4JO40fD+!`nURgJ*~f|tJTT$f%qDz zs|nbneWfl}TIDo-oWf76h$7e&bd>g&xX#!ZXAD+_~Hl?pWklfNKJJ z-gp{&=XfK0`S{79#J>}H=^|Y-|+`l(u{>8+Wd`B8(^ zebqBn>y>vDv|_Bhlpak_l0{Sh!H%els1l0!3w$PD%?A5h`nG$vyLY&|dF-BO?`qFc zH*z&`=Xzdw_cLwS)!ZTe2O(0_O5>3lJ|xCd7i8;cx%{Ynxnh-ayK1c3qE={LtGlZ= zspP5xWlQB+#cVl2f29(sXJjE6LUOPb=qK$F`tgO_A}*Pm!Oru~X9|3+d|iAue65(n z%sJ*Dlh0gdTHyV`b9NrrosSX%L>-=hx8d3H6BrM_!byaJ^pTXT67xgvX`Y7iPSO45uQ$bVo$L|I3NgoQ@#hc7!zXg>@@ZZ zo6hy;!nv>P-)s%LhMR!do6o{D@w1pGotK8-i7W#)At>@1NmHGu0n}vbA=OS+E1O0a z(!1#Xv`4m0)uWWs+SAQFhd#8HCAUR08q)X&stsyEdh z>lsG%rP3&dJWoz1bI7m6YRp?)gze!&Jh9cFNys40m2}cMvA?Jh9|(U4!-SSXqA*n0 zAlw$p1ed@H4a6VCBcffLf_aP#e8&?!vo8Y%FbEbwH;g3mh#|x#;yED^+2mky0y&x- zLXIRSle5V=WNXqv>?Jy42JQr$1Y5&$uo1I6=P-{@hB-D`I*dK$geSsoVY)C{=q_}{ z+ItI=g@;({Mv;()OV=^K(G~5)lh7#e3Ur5Ou+AJ}5V4XtPZ%)o)|VWJnYRRzBOVbO ziII2`s>Qp4(J%>q1KU7Hz~Q-eAo58^q_I*%$t6A#Z-^Jf1LA7&7wp$WF<(3-eiGd{ zZ?dGp(h9tPsg=}tQe2C<6A3lJ^Xgvk7}SFR%y6}YKf&MNT6hdIL5DG0a{`~Y?izwi8kQ6WVm*(Ti_%7xW zqcNwk0Z*A95Q&+GKA4^PA209$m@r46ff=wFYzy;XG%L-+rVP)|2F%7; hF;n73Ui@MahnX7*9|Vxl|9-iF@R`JC0{?d7{{WE(c|!mI literal 0 HcmV?d00001 diff --git a/includes/install/sounds/en/us/callie/custom/8000/delete.wav b/includes/install/sounds/en/us/callie/custom/8000/delete.wav new file mode 100644 index 0000000000000000000000000000000000000000..5d3fc7d632c6e2c29659d35b21a7255c09b688a6 GIT binary patch literal 7978 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 literal 0 HcmV?d00001 diff --git a/includes/install/sounds/en/us/callie/custom/8000/digits.wav b/includes/install/sounds/en/us/callie/custom/8000/digits.wav new file mode 100644 index 0000000000000000000000000000000000000000..75b61f002a9a6f88ec406f21ba8d17e89c7d65db GIT binary patch literal 6332 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 literal 0 HcmV?d00001 diff --git a/includes/install/sounds/en/us/callie/custom/8000/enter.wav b/includes/install/sounds/en/us/callie/custom/8000/enter.wav new file mode 100644 index 0000000000000000000000000000000000000000..e0814774814a121a04a05b4d471ff8da5d50dfdd GIT binary patch literal 7306 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 G@c#faE3GF0 literal 0 HcmV?d00001 diff --git a/includes/install/sounds/en/us/callie/custom/8000/exit.wav b/includes/install/sounds/en/us/callie/custom/8000/exit.wav new file mode 100644 index 0000000000000000000000000000000000000000..495ace50d6dfab8a08c3fd5aef9183c19d7c1975 GIT binary patch literal 5852 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 Ee^;;G`Tzg` literal 0 HcmV?d00001 diff --git a/includes/install/sounds/en/us/callie/custom/8000/extension.wav b/includes/install/sounds/en/us/callie/custom/8000/extension.wav new file mode 100644 index 0000000000000000000000000000000000000000..4f86bdbf3f093cd3bfab45216479a4429340dfed GIT binary patch literal 11084 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

      Tz%@wkFVuD6C6X_V+a>x*3{H*;Z^OU41wky}k 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 literal 0 HcmV?d00001 diff --git a/includes/install/sounds/en/us/callie/custom/8000/please_enter_the_recording_number.wav b/includes/install/sounds/en/us/callie/custom/8000/please_enter_the_recording_number.wav new file mode 100644 index 0000000000000000000000000000000000000000..0a25273c9bbf821e2c27b1bd48a350b518b1ff10 GIT binary patch literal 31796 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 Z{+}NBpFa41$6^252mj~yzyB|-{9hVxFLD3? literal 0 HcmV?d00001 diff --git a/includes/install/sounds/en/us/callie/custom/8000/please_enter_your_pin_number.wav b/includes/install/sounds/en/us/callie/custom/8000/please_enter_your_pin_number.wav new file mode 100644 index 0000000000000000000000000000000000000000..46263917a38aa8d0ec624bf1e9212bade4033112 GIT binary patch literal 28212 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 literal 0 HcmV?d00001 diff --git a/includes/install/sounds/en/us/callie/custom/8000/please_say_your_name_and_reason_for_calling.wav b/includes/install/sounds/en/us/callie/custom/8000/please_say_your_name_and_reason_for_calling.wav new file mode 100644 index 0000000000000000000000000000000000000000..325a879d846dabfcd16659d280cc22b50b4e860a GIT binary patch literal 35860 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 literal 0 HcmV?d00001 diff --git a/includes/install/sounds/en/us/callie/custom/8000/press_1_to_accept_2_to_reject_or_3_for_voicemail.wav b/includes/install/sounds/en/us/callie/custom/8000/press_1_to_accept_2_to_reject_or_3_for_voicemail.wav new file mode 100644 index 0000000000000000000000000000000000000000..9c01616a9d5f7ab9aae2ef10a5b7b8cd58745d20 GIT binary patch literal 68104 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 T^-IGV=6_!Q=ez#@^DqAk9NZjf literal 0 HcmV?d00001 diff --git a/includes/install/sounds/en/us/callie/custom/8000/press_1_to_accept_this_call.wav b/includes/install/sounds/en/us/callie/custom/8000/press_1_to_accept_this_call.wav new file mode 100644 index 0000000000000000000000000000000000000000..fa79822fe133f8db0a5cdfe7f2d0cbd5cb1d3eec GIT binary patch literal 32908 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�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 W$n_?6{U@t_lU@HOcKzRuTmJaQ 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 z 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 i=q7YNItqzqLPCt# zx%=Mk%=h~J_P2YhGxOg2zxQVT@A`J@+&Q&ALW9~5{BGRTg2W(%5QeQ?0zymj5n@mf z8Z)wBBm?gpWZp4-nP}!DZjB33e{`JwO?aV$aD>m~&-thMty}>o=Pvjz_-cJFUlccz ztK$ClpXN^pHwZ%A@kxde%@r3(c|3>QxE)Mx7c&@qL zIC$H9>l4dqi_E&jI>C0$9_bqH-NO&V>m(J*tl(Y|rLixPXe!s>OQt4MNZ*>09rr4v zuB?x+)_zZWtfE2jhR;8KI{JBMQSsNJ(ktaRD|c(In7%qrdp8PQm?w&?@DIs(SvQ(Z zY;m#WulXBVwa)I77Lb$^vpIy5cH<+hduvn`3FY&@u{G~1nk+`S8gfmQvT>$ zbnR)wL4!ftPjgW>(->^(tE;G-P&%c!L%FkdwPm8Kf}bfF5Vof7y{x2`TiZ0r|Jq`D z)6)&^C1ym7QoizcF$PtUvcyu~S5MiJn(Z~p>UP>rmLayjmO%Z0YEMP?@|#tUH2n=m z%lE=sRr@$y{f$j<%Yru7+Qj8ON^-4`p)$#IE<&uh3l@Dr$=uR4! zTK1alh7w(f_I9nL`fbfqU9nZ~X^w9zy-~;Oxf*rIebMYt^LtrcQf4HsNjM!mk*u~Y zw_G+^Y95y6mer|zRNbLwa4pqH4Kq!;E(yF`jikCQoF(AQE%4-jqg< zn;y^G&@4amO?-Czr8=ACFYP_eUmU-iKU4%4|5$ZTzq_`$VnOW{^GVZe?Le(jhqOC1 zdo)M%L(FB~Sa-f7jIfr8e9HQ|8vcY^5;4aS417+ zlJH;ar#1@DZqpLA-Pdw;2Ai}r@ojj%_jhx+r?+ugp{U}y`GGdJywWh+d)8W^X>K{; zc%}&}>;0{HP2bXvr6;scog&|0(d>wwDP;|AXQ#Km*X~j4dX0ip)9d~joa>R;N^ES^ z;ZMJmPt!cD99@-V``~%y$Z;(9&UDW<{!&Y;C6xz@e=kX{?rOMY>x^55oQ_XUi^~$7Iu^@=>4W6m>7re%)T_F!i+GcFFuYK9Li<3$1PRCuQ+mfXLg;7gWLvz}<3U0@DnAsw;Q9=5ju@Yv8r@3QbRa{|0sjReb(Ti_6 zrW|tzM~Uwd_r34AXR7U$VXQ8s>dZGs^(g&d>lR_2VpW8wZc*bN&A!V&-u}-P8QC{7 z-o@t2HVJ+0$E(_Wjs4oH@X%*_X;951%~JD8XBW5IE%6Mr&ob3Fd|#7W-KEB@m7BY9 zG2%ArA7Yx-e~|e;cW>+5yffMF8#hV*A?!i`Bl7$DT1T7S=s(q*s2Q%0(naWYn2=?Q zvAt=Hp^xTzEn9Q6dT*`5ILp?NPnH&`Uq%g1>6or=tjxWiyC7$OraDEEI4S&|B!TJY zcR)+`j1#n7v=4P>^=k}D(Z`h7&U~;!}bJ6^rz)!;Til>Y55otfoV4bNxxvLSt9U66K z8#QBUAL@JBa(%DxN#*&lo$+^4t~bO@ujQU?(XdHY#>lj@F}u}k*kmiJr zw;uBx<}Zk)flou)#CANIsCKVrMD1wfS7U)~p?kR} zLAWa(E?J-$7g{&`ZiKDQ)I?wG>LhV;NbKF%=CR>HdsS-HHLNCr5b4ae{ANFHJW`ut zIB%@g%-3!)Pto1iIxJI7jZGgN-?<{3J$MCbkA9X+R=-mB37Q<06gfKlZOrcIgvf@` zsS#~M8ib4wTp(XA`%!!gjTPGaBi&6LnRd7Nh9$`In?Yher%Ts;G4|8_X^gfQt*xE$ zE}3r~`b=wNsDUC{G@P&t;2WQs^9egxOc`wQgG{kFd5p~eCFc&$(yuNki~X{Q-p znYYCh};F?YeEalWuyt+|#;Q;KPualf&*X{ouBb+%pRy6Kt1x%e!ahrcnsM7zbiB(tT9 zWaH%>6&;jy16~JQR83W%QR~$g)U~P&0bdo{WxDya1Zm=`d0W;gtf#>({KjUj~yWDCmtZ_B*n7xvLJbX`AB(7xm12a zmLuCFeJFV(-YQCE*J1-rCnxyUelZv5>*2lO8Rm)eM0-*^vprRwOWrHKcU(6Ahk)ov zbQxz>xx}oLhJu;yz+zR)_WAIP7H*SW_$beR& ziO4{o(AF@bzeq3AlH3;4ACaR?=s1dq}rom+HBZ|Q(SdRPQ z9NZIk!d-C>IO~QR;RqanH=1L!NVhNi-p&(kbgLA%i- z6rsg*0IHxYYKczJ_Q*qZbOI`;TTusS;W&y$>(Nk{7w$#PPyrf+%4jQ8O+V5PbOl{c zhtS5fFAb*CXb>GpN7As=4k@XIUME}WW73wgR7$(kP&$!zqZ8+PjC<$~q^0Xob94?3K$p;X zbO8N|I-`v+`k81mZHTteGCG{zp#k(PZAoX)l_23sI-VYfRxZ)MsFm)f9ncx*(MS)X z40IMGJBWTmSI{!F3EGK+773jLzd1+^&#%)qXci4d-RUFRhpwib>2ILP=`hmiG#|zj z2kl52%i|)XRL|S1D;}pQCKy)6$;eoBpSgZtPC~Kt-wl4?0EMz;Q_;^Yjr$h}ydI zBvt$!AzzGy70flJ6K|6vp`U1zD2Kd*C?3On5VxTgR>ls4m_N<$K}EDem~OfvI%fIe zAEZ8R`7N+1uNK)Q68si-4p_=nOQe$J9#6mpUw`&DmK93aQ4EV;i#9XaC_#LbykbVc z*+SMY^kxpzd8msh2yJA4W=ymTyMV@H5mP`}ya2oWA?#opMLRGPi5etNCYSJM`i}g{ z=8=4K9jj3@yb>wUTNI2g1A33(BWR?kJ_@1X?C-Q8{tmT39dUaUP8p_}tU|dyA4<1B zr)yDr=d1wgS&PHiDfk4xPPxU~S)>pZJ6Fi}drpzr=nAY-8nAi%RWhCF;vd8M_y@u? zrX_DBL-26EDS3|S5EY$(w+aW?enL;2ivx)kHDT5XEZU0e3gd7LdQYZc22hiV%i*0v z;xc*-ComN(rGJPQqcnP4%=6co9=L+~aC1C@j$}C!gKyzsv@f#}wdYTX=ArSz6mbQa zj9xL5xbvbCn!^*>NPZ4&C9he?E5UpcS0Y{F9zYA2BKH^2 zaHem*cq_l%KU=(&E2M9jj@$xf5IfZOTC@($@{7dToRLZ-nVu5nFx%UcAzmPS=jTMB z+%95ePxzcj%?#moG5Pc#UdDE&i-lk|ow)fFRx8Ajmf{}4eekL;%a&V-N9|p64I8vi7yHrnS<;>l!s zE|)FO`p)Rm&(=iL6jdLqOsKR~uBy~jmefwyel&ivW$;JYR`MO8UE&gxPUG_7Rhrl8yPNXOA9O*6C#GnlTU(@YS9kuly5x0Xy~1^$ z#uvJZTU0$Wc)TH!!K&QI`YDR^^9^P++Sb&P9n&x|<90$-XsPNc6Ulvbt88N|6YNtQ zDp$NuM8@O8s3!{M+q+(vk@i`6dhzYg`#(1P^1dXr@`WzKR^L5V*p45u8^oMcDSM_S zp&g=wlbSc&pBtaGyWzOZE=h4=(E-0R1G%2|PG+msY%8$u^3Fx0L>a6~q-QS+6^^B* zCK_wm#G-Crb`}dI<&{4hzE~%^5_uij$YhC(;wRE&fjh!vG5VxkjT$t2lC?A|AcKw5 z2Y-}Sa4ntPEg#MQS}pdow&RZTOt}0Kb6VP6@h2VWo@KjZ*iiF*c|>_oRlVw7HB$`} zEGd>~$7fed_eb|6UWPg=LnH3S_fA`sU77o~1#UgHzB}T1xK&bVJ!R&sgH1=wk30{_ z5j<6_m5r8N6Qv8=TyoobLws#kO@r#$Riib38|IlbmW#F#w$HZZz&LDi&UN?oiJ5+i zc46}p`1*4i{gU%Eud>OZ3}cK`7Ql`b#@ZTMjHM-5iY!${9#+l}F(aqeU4RY+is7x{Hgn@KVpe9{97|vmu;M) z%hJ5p%{4Z%t+IV_miwcmRr2eyUFt2-hM3~`*Yy(8Zl*O%`{_M< z8`c^_OoJ`KTsp8*(U-fF=-6nRW-GCuvng%w?VW2E6ctwts;(%{sD5vr zYCCQ|Xciogyit5P*(=Km`5Lh+dQSXLNh!$z$+HthNqy>!iask(A){ou$`tW$idkW+ zLw(|%beTWf<#Q}^4hA~KBAoOc_YW4Pdy1WhT*o}kTx0AvEFa9xHLc6XR%^7JE=a%H zVzu|T4KOz|EA5}TW8|o$SKy@Jy@4}>kA{7UV&lDWj}x9GUr5>+xK$D=4#a=ptE^8k zNPSc0LZ5_10(RfCj~CJ;I<_aBEQIqv`TDu~IIenAxQnhc_GgaH_HU*>m1$*3hACFY z^ucu6-O^KTbsF2*&-tu$B_1Zr4muR{SXrnxhA#_S5i&kZ6@9IaxlVIsJNBNmyVxUi zMmrVS03y|)nUulp1-;k9-(h#71>7lLm_Odv%r(N9=xyxFa>Y0gx%<0`y_rT+Imfug ze8@P;>T@4;XWOrt&pKoL{|FBV$1ae?$?r*qDz(9j!!simgcw5-;^OLTkZdCPiY1By zQJG|+`mf*viZnziE1{?hw*;5UM~e3H`}}={cfvgGt2c-Q;IaH8&nIsv*Ui(|vB-JZ z`^;mpFSbvz)-k4bkc<6#L!x zj61;{;x0S3nO~dRm`#SJ#>4jY?%5D)r(2V4rS@9KTCY#oBl3v97po*YE=);eg%pmEt+>S*+Z7<1q~`A-3F0xIMI%7p=ERGk$qMK94C)Izw* zEhIB>5WU9N_!fGwcbI#OyB@cK+u;4#>u?`-7CKTKs~qRu7WY_Jy1Ti1l5?WfV)l4O z`-l5>3Oz_Vw?s%LnY`QQC?+V^ z1?*QAiPteN@NVkocKU8{yM12p)IwXj<+*96G1A)5zRmHo>#}o}242pmy~IA4)rzqV-zSfFEGUHnKGq-QJLy~Of9dPyI^-(xoOaE#-L#!` zDO@6ZsH4B9tLL3H##-Qh>DuNB^3CMO5`(ZuSR=Y6O_a`8gai=fDmAa}rpQtj2M$$p z0j&aA)gxt~qN(((tgd`Jth*nJKH{DHWPURl%{#pboS0kU?&bRC`qw$#@vGDAOmv-e z{q4AHzhz%x-Dqp*&^!Ke)p&Ebzx;27{q!jM#B3A|5#N{Wk&Tk)$yUf#DOW1X72{Py zRYgiqKpRzs?1QwI@|=96xPdfF8pDRL0{ar3r377|)k3L|ENtUP@*)0t9P9tV=k(n6 zP4Kny7Wme2soZe?&-`5eyx(Zw>akl`3;Vrj zt!S2LjcApqqe#bIW(Tv?%uGhXY=ZUv99Xq)r_uB@SxEATm^=}#2-AfYLWp4J5A(nB znpB;}7v~c!6&q3>9_?AA~yOC-RXrrDtdpbQHzm&6r@AsWa6~65ExX z%&uTpv-8<$>d=GscNe<54&q-$oOV6lzA@sFNHc{YV`7CfpR(3R8qG zLV{3N2o&s*_7VGq ztzbX0FW8Ih26iZ$$(ot7%wUl9E-)|A_z7Bq8X_l*couCA+{k&*bVCwEz6y7R!@{4! zc441zT=-Ye3JIhS^j1jHVb%T=7>Nn!Jght?;rloW+S|_9MfLz$?Ot_4;?N$-;FAZaG?3kKn-@C@Yr2lgAnW8s_N z6e372nMyX3_e4s&(v2WzJg_EbkQ24Sqw!z(1-9crrXJIk>A`enTEj6LcqI=m!B_BX z=q(f%p|$9H6bk&w9y$uR8#lQ{{v@MGXW)hsh+WVLRYHmIN+^W>4bWd5@*|l-mXfEW ziUb22^9wyk%K<@cQC~C<7?vx@jr=G8Hvx924IJA5b5sv&;O-Oj7uo_`N(WezC!=@3 zW}T#y=_Hy$V`&VnCO64DkaZvV9W=ZYMlc5YSqxm)da{k2C3naNVk171KnKD02iT*C z{#RM-0`e|H3(z%m7`;S~VRxfXs4M(lK&{biIR6JYua>}w{eu4El9b2?T+~r|mF}V& z=o0X~xxlYXp#`)Z*tb9MKPt-5OxlXpr-8u33*S^5m5t)_Am18ufJ zBhVP&y(XhYz^u)J-`UVhKhzD_s}3j;q%=}D^j1ReLVw5ULExCi&>x}AESgRefE#NM z{p3Jz<6!Gcdx0+hrSAYe5hxp_q7Xn{TWF~<`1wF+eeq=}SI1GPA_kiDW zAR}x`fICy+RN#P8@C@L^&Y@~F57@FM!U$mzNZHVBaIR)&NV<_=zXmx)L$QS)LeDX6 z&?un|-<&@@e_>MB4!sJ0_<0BJQO_yw$KIf%TaP zSjeM8ksd9^W$=ayN8we#6;+_chyX*k5G2nBT#rIeX($>=i|JXCNsEYwya6(M&!(fe?|2VDm~?hN{j9)W+p0Drv$$hv|~0yDZ1 zzE}aCv>rIpHDG}yaJ2`%T#0tT^?GPw39z}-!OI4tA*eS*tu8R0_F$n-Ft*0PK}Vwi zkjM!VnLuB);CBw-mtE8eUg(CS3-oJ*r?sHhqW}AG8Svb-)J&^@t*xeZS_9`cc#{LB z8iAIS;ODU*X)>w{SjdLG70QCXa)298gnQATv0&I#z&p!9OB}GrUg*^bt<{39UeXtU zxcBr5y-pv(@ifGMqYy{_JMMt}Pq5>8*sg=UpTXO2=oc7UIqY8{4!naFis>h~(m`u_ zYN3A0)BmhthfxY3rH2~+A76CPpB~2UhBrL$qz0t?4B6mch$a8wGei7>Wn!>Hs^Q2r@MS$r^)=8^OH{xDyRXkb`WYpjj615e%q^0fdBu+|h8Q zgt0Inbq(n8zcIgoK3~wc|Cja%$hRDDxPmT)_&WXn=v)YKb_HDkca{O}7t{T~k#7d1 zZiIa&WS~88{SWBlKOd+DsqG+<6*eQtt_OKbK@b1g$^mk!0DCE@9>mGy|3}LdkRk>~ z76Ic51=-@ja#3(k1vn?5H9fRe0prv`YkJTR3*IjUyof-8P>8h>K(iP&7JNhkzyDdk zE>tDbK;Hkbo($&=ptq*bTQgu5Tf^1~GEEmiVh7X%*!@vZxfl$Qx<6!vA?Oc4?kSk% z9E1A9Rj42oqE`^BKcm;M&e#u#?*{K=0-oAIRlx+2bs%KSrFbO1fcIi0aE(EX80G}u z@IUw}?vKaf1MuBpm{UB2dW(^C2cL7$4%U2!n%wmZXg=D`-eU`xPHb=Kcu_Deh8%E^ zPVy0M3V+7mSlh~!=Y8nf&e!E*Bnw4%>1X^@%wr#!L#<>0(R+4q$z&TZg1SZqJAx@; zyNgzfjLaX*Muw0m`T*?Egjh&FL{T{N2B(Qmu&GQF=042LdNNn>I~>9k)2lFxEJG8R zTqclN&-7>VnGEJKE{1AKE!Zm)a+v{z;~KgQ?T0@I&B5Jq88ehw4Oy!UH^6@*9av%p zSfmd`fib8vpwuW#B>QL*WaNAr3$`q#x9LOB*-jEeSCSQ^9{CO;sv7d>F4_R*pcXu18%Uf*S!<2O!>Tgptlc_3&);Gpa>D;O^)kRLB0NX7mDL zWhz=pHxmMQUI*SKLt2PGbFdHMiWkiXPCf}2{}*ZS6hKotWZ3V)Pl9n>e3rh1$n}x# zL~jAldm- zRp6_aA^QbUN*FX6>R1v$Z6~}EZ-LPbMN`pIsHL5PoV<))5}v`Fbpz>(&e6`0O*hke z=o7vQ8JmZCWKXo6{0O;44c~st2bsORN z2iz6iBp7gik~)REM264MAB3)SGrB_C3H``hEJ81Y%XAyeJIncdLL=lSy975G230RD zIYbr$VtxW24MA0O7ui5|!;GmFM2!IOWhGSH#^XNdBe@L`{XXqX#*+h}%~0^xi8K&q z1lMRdc>Hku4IQL?0SSpzfm1*Wz0rG+DU+JWF?vhlAh<_yXkOoV5jwu#I9c7_@~qv6W6>0}7%oSkD>oBVg2tXtruZ zcHl%g@F+NsE}?5`8#D+s0R6DlQXIj5@walY72}2h$1y${fPr8y7zDJS1h~;<R5S~;1V<5%BXa>&pjBwC8d5!~9Su-7 zsYlRv=x>~l@4$9YjAo#B82h6^S8!3?fxbrFkqc-44~+C`5Ci{*Arc%y(Rg2nQ8pNg zHlwQ`1AK;kJ%h49H9C!};Q+?oY;YPp0DZt%Ea}CV_M;MX5*cwUzr_A+f>H1ka-t`o z0yM+>$p98K1hjy~U=ipEe}No4jU_jOBDGLiiFC+{(!oKb0cO|)I^c0|8<^leysiq& z2MX#92x1J;1n(cfqo@t8wS{OD%EdWQaV_{k8N7L76QTM7JgcPBXSSxH( z)`5q>PN`r4{EAA3)zC^j!&?86yUSzHJ^7M42YBFc>JlN7^{MXgpqi%y)XnNpNsu>! zm&mJj00QxdJV>;rzN2Om-N-5AG90A`UG`Ch00XfE4!5K(%Q%)ajjS!`8GTw;*&N>izJ^sS!oC#kbTI%H8%~nqc281 zH^f>BVi#EoEf1|TW8YY6j9vq!??NDXVz`uV!BzVw`Fi-E&*Z)4uJ7LOS>wIzKI*FT z-1l{6zTljZSfZV7ebk!RjHHx$9~z`I?$Y$jrmM4=M!hoUB#n$-s#{AHsjtG@`QagV z==0!RZX;h3T*NS*K%L+${_ytA1bc< zXkD*uR({_3ygze}XS7M&W&Kn8L@o$#3pE$Qd|B{zi^jJ<6y9g{LEnhtDT((0S0ZR>Y6-yjdj zH-iV+Dt41_L@rYjiSM+_wB=M88Z3_$j?t&xS*{6nD_sjb9avZJR`39CB8T3qWVyTI=#-9y=Zf%1T!+a0tA&(oJZ3w=NP{-tNLtHXtGk}lcwW5VqE zBeVKuuV^WEkQyG1&WIjBP@Lo*?Y%B-L4D;%n#Go_=7G9gf+fqueeNN3zqx06`gvA) zLR?iindi7H{stGM&$}kN1Wy~!a5|QMti)-$7M;*TP`*sbL3tsv?h#1GI$JYFl8RW*h=r6TOMM zff{E=|0=eR+vPgWG~;Kpqv#B7WAMIjireog_gr%h{&3#gl*{GUh?}TGQU66!|<4vR`v6R4iOWmHGm0op!Ay!?ci;Kq9J$^kx6?am+^l2hT(Lseh&K6S~&_ z6XW)Gqpkj~-Wn(G`o_b1`qDr0OXM;*L)+3+6q9S8p8PbWDs4;FzFb4*+O$&%iP7UV z)6qo5qxJwJHRrWS+9le2$_39LM|fLMH-Da1|o5Np<^i|`uZsU;XSMj`~EX|Uc)5zN7-)3|3-rEIz$C#bu<4{<+L`2Bx z(KXt3pbolaXD~J}g%#=Vz1O|{{IZYo4rOS3{ocRb|C6u4y~wF`TiwT8hkQqb zThdeYl_n+nQuGJg_2kznbJMFcbF;>^oY8ioeUznHQZulE?+iPT)znPQI%BO_(gfg2 z@|mY!$=;XCtC z>!Y}Lsoyl1mi{=ata0~@c4^M!XT}a-mwpJ@TdJ?CZ)i*1)Q-@kqg9bL!t~I+!2EzF z=;9Xh%R;VDv+$(g7WP}l;f=VU`=qn2(^H4)`nmJGQ<%#f7rG+lz%A4uZK2^KlgCsQ zw;|gI?`BJ&*g-M zh2QYz;NN@}lkdLkdFtBayyu$eoq;QAHxm`S8ng>n#6`+9G#lNb;q5D!38HCYae?Zr;vF2Z4(#iz2a@;nd{w6U-kdXv=6QeH4U8;E-GHtuXZNWjR{dT=1K8O z5>u0ZO+248KP8eBYyHJ?FM0w|NhDH-;U##O+(0cScasZ)Ku6NwN~S$>%xoBY{3z7 z@`u7}gqfik!ms>)?0$x)yLnD{MtMKDZ+b<4bLJs?FIW}2BTSW+sSIjNw$Z)UuQuso zow3X9zb54+Wu|#QZA?s-1%A%VHNwT~41zDt#HT}q29+gdX(A=OtCAz|h zS}5%l_l5aj4(|yja?^rVK85?2Ys|f2GMH$(#+%?x@+|f&@!s~PF#Q9?{11_k)B)Wj zOEl#gQI~EyXliW!*oN$%CL}u&)7~YINq!lhX}xNmqq{==pLP-4M%*E;qnYGY*hxJB zud5BE-qLB|2|qJ9gnh{F2?$IPGl6Y~ZKcvhzHILa&lvAq-}he83)p0KVxTT`IJ{Ck zr2Yv6YKdNF=x3^oIU3U|{->mQNoO6F)U_!!iJ!+u$7P#_8T#u6Xf9K~kXxvuR64nb zno5=8sre8(BF>6rMC$lof*dE%hDMR|lOrSZaqaK2C;_%bkxtH&;3_OfGGD`RBRnGN(@`YZY-UFg5+ zpTQOfr}HV{mr`%_8Q4X&)-BbCj85};OJ?j6`y~6~#PXE!DOZv|N|h3p#663>993xO zuYX9Cl38RMa032-=cE}R3zaC_q^6Pfk>#PyTn=ByZD99sUTz+{F0d(($~^Sf^Dm&E z_zLL_{sN|woyT_;o`fID=TQadL4B&bu3sFr#kACNGbT2Uwh8uAc3a}L#EOIsv57HZ z>q&ik?LWF@gcsa{Yw(;Yse(FC?Jb=b_eGBK1^n{h&+J}yH`|%%%xq$&GAo!RjKDNv z?=tV0Om;H+DZ3+Zf*U8;#XqECctfMteXKiRyk?#fINPeE{}Sys zjm;C66@5sj*QY}p@`6I?xKyEjF7}stsy|1@isK|MG$QmHe~fLywq^=^-_n}=3`fo5*%wcvfR~?KAO%|p}vy}PDPq4MVrM{oxk(G{VWOds*C(MYyWnY;%B(Z-& zR6YiXypMH6_0?DETfqe=9m>)O>6~H{^Tnr9x5(1){_r`zdoU7c!ff{! z(T_dTy!CwldXD>K|7p6I=^ZTNd|Z{F39k^^%RVJmokrA>%P3Lzi+-#z$t0Se#8k!l zY_^1b7_q~X%Ix#(?`?;yZOjji1-epdIN6gph;fq-?khvo3bkBpBmNhe%FhX0XLtEE z-W%R2zISfHv(Z0+{>pC(cIQTLHsMyNb?BRL+sNlT{B1dA{mEFVJE$+Fo}hzp2$&%5l59$v@K$&)e#iIZ z`-Psc|F9}^$TySj;{%@gbS`c3bqdH_U+%3?A>N1#l?S38>Ui}s_yk6QDdaUxg=UeV zo#`{P!@57NN&FpKl6_4=PJCP2qPXv^Q%%KDJ)%bHS5fVBS2bFw5V_=Hd4POR9v?CU zv-#(K**lKz=c#d(dGfq@-p~A7*)Ic6gC~T(;Wgpq;#_&8v_pzlhs&JU7LEngN)0tj zw}m`ygqD@YJ{Fs8re%(Grmf7{)iO6G+Hybos3{axV7zS<4fC{R+R4OV^_=oe#Kjv! z<$)9?n|+3nInV!sK1o+FHB5xv#C77Tg2{p|)HZCBN+SO!smfDnr1AnSQTL!@L^IsK z%+=)U8t8T!PDW3U-et-(uQz>c-W#nkbu>?o8X8?-dTvOMGDXkQ{h(iND5cI3mq?pB zMZ6&P5BvpoAWup^MiUFY6%1;MyrS@4@+C%%l|Da;P$;P=WyTXx#Zg63S4?ry?V^5&I%ka2Z_>TTZ<0!K zAtk}Bn4cZ1PE#oPAE`|8hM$Ii4&UZeLW@I3f-(Gq5Xa964GcF4_X@v=bQbH0&86+~ zud=MXMKze+Q{i1$M2x_lOjnJE%FqV2Cp5g~Pwl_j8f`d5x9XUA={H5$c8P2Zd7}?kcP_3yK)Gpj<%%}QO=g9r!3erNZBc@}|F2dz7 z8(zk2BMC%w4CSFV$c8qmgVk>8WQCWzC>P{u@(X#h++WU-X-O;pCCSo4nUM!5@t7-H zp+?mHn6G?{#$k3f9xi~t!vVx`;ytm8{D*{8fP6!aBN^f$F^!l&loB0@M#K|118U%I zKx2-ZQ~Rn}>IS8iBFgXNqqt6A%04+qaVUM2amsjQwNkEBW4}ID|JUI$kK z9l%!95v8JMxWntH+SUEaU}e41M=4Z>EB||AtW!>5n~ajGc2_s5r&Js2k9J^QJPk9j z+d(C8gE-g+j)iMr1$+*DP)jr+5{c$S3gIB)2td4n_uwx0HS7&jG3&h>v!v;O!~FXK z%%kCs4UU3U_@9ga2fdcL+W-In literal 0 HcmV?d00001 diff --git a/includes/install/sounds/en/us/callie/custom/8000/schedule.wav b/includes/install/sounds/en/us/callie/custom/8000/schedule.wav new file mode 100644 index 0000000000000000000000000000000000000000..a4ab3819c724e5f41b896ee4cdea86a5d1bbe3b6 GIT binary patch literal 8970 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 literal 0 HcmV?d00001 diff --git a/includes/install/sounds/en/us/callie/custom/8000/scheduled.wav b/includes/install/sounds/en/us/callie/custom/8000/scheduled.wav new file mode 100644 index 0000000000000000000000000000000000000000..49cf0fb083370788c739d9a548fc06f0852f6240 GIT binary patch literal 10028 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 literal 0 HcmV?d00001 diff --git a/includes/install/sounds/en/us/callie/custom/8000/set.wav b/includes/install/sounds/en/us/callie/custom/8000/set.wav new file mode 100644 index 0000000000000000000000000000000000000000..b6be954c59e6053a9c216205461a9268a62e73a3 GIT binary patch literal 5278 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 MLl^!^r(h!fAM^&M3;+NC literal 0 HcmV?d00001 diff --git a/includes/install/sounds/en/us/callie/custom/8000/snooze.wav b/includes/install/sounds/en/us/callie/custom/8000/snooze.wav new file mode 100644 index 0000000000000000000000000000000000000000..e4e5072bb79e797b76209268aff8cedda96e3c6b GIT binary patch literal 10946 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 VZve)*0b=>Th?VECFOFh`{2!$mZukHI literal 0 HcmV?d00001 diff --git a/includes/install/sounds/en/us/callie/custom/8000/the.wav b/includes/install/sounds/en/us/callie/custom/8000/the.wav new file mode 100644 index 0000000000000000000000000000000000000000..4e4a28ca552615bf526c5d734b0472c43f87ec10 GIT binary patch literal 3760 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 literal 0 HcmV?d00001 diff --git a/includes/install/sounds/en/us/callie/custom/8000/this.wav b/includes/install/sounds/en/us/callie/custom/8000/this.wav new file mode 100644 index 0000000000000000000000000000000000000000..66301fa46243aeac376cfa802955d698409dea42 GIT binary patch literal 4264 zcmWkxcT^R}+n(9Iy~Cx5ARVL`6cmY~Vq%Sn8XJZf%TLtU(O}o8vBz$V6-z7_HN>D0 z1yK|mDuRkcz(%{=-uvC%nQy-{|LmSU@B5V5DbIw_BSxH60FX0u%J8|13nJM^0NIfp z0l=og01!X{@@5sxTF-u{0MCE~2E%Fa7gz;9L4TqbkwFX~))TvkJA|6B5(EiI4{?Rq zO!Omsa5QwX)!T3_nu>VnE%Sn5nE%iOd>$u&M&JZ<;Lk9Q2qub%24VwwmCWEA=B(jt z=R6@7ledT-L@Ornugog?s3pkwMqi{}WqITHjJgfW$=Uoo@hNesSSdazT)-=(hq-Ou zC(db(P|sUmBW}b2@IJ4GTR}V}mVh5nCZ%#$dIx*W?km1+_##ow{af%*yjD6$k|#bO z>g3PhRKiHGiec#QX{o2wUE+#%oVQ`~dfO7a)PVIlwq4e0*Kw*2{VpgJ$z)@L>VpUO zD35H6zLHRpP?WeRrEl{5gd=fTVMgUs$-gky11-x{bsv|tDE|BW&7Ow3hStXTw-rr) zeo(Z{=$d5cvJUf}Am>Z80SV!S39WrLWbPYWK6ulhmqQ0-uShk-+zh)TD?rCg8w?IZ zdq=bi7%$q?t~H()p3!u!E61eJ9%`*@YOQa3Hud?w7X>c|x2#uPu;{42gsPx(J%&X4 zlD2*plcq|~PWz@Wj_$3z5YWh9>OE?2F{D`HjEmJZ*1N7(ZZkcV>CUmB;kI?QeTJge zIZb7C1uq)vt~@>Ta%Ic7wix{x+Z5)EaJ8gdSsdCCm66ceYg@m`12zm8k-9W?bq|jG z1(@hsXROs;Rn>Mz>k>@w?R$MusD&6#eg~&BubggUS!Yd4Vngp&TVL&INNUEdd0NIc zgG%C>q)(K-ZnMK*MX7pjNg-0J((;p^M4#!g+&@`Z4~jjbTt(J=%MDwYP31a9b<$sh zowxy2`c7NFFm!f?z8n2!H~$yb zeD~eP4xwIWsrGo8r*NWxBgyhR7D$B8O}yOuQD$XUW!8}1={?>DCQCMX&l(NdkGh%K zXl;_?2=f8-;{}WMivQ%TM3225E2*B=y6l~+X-xCUck??+b(AUGdEZySXwgEH!nrJ{ z6Gtj@!&fJw^wL4)+1rOq?^_l(B_v*$=8D(sXqU9FYn|NbGe`QC5_3csr8UxrLOV2j zZkWb)PJh4qZENGHrofNt&IUtwN0Ij`^BV02bzld1i9cF8BXDoHu_u)_CCimHd*HA> zlcQuo7JjWWU010Zt7`8!piXowVy2R{B7rPi`kO!n&Up&Vg(~|;x@AOj=DQuA7O5zG zz2&fDy7#azh^nI|fa{#wf<20+?*GON_-t(E9|KwjR;P+0_69fd?%CV*FVxv;LQNT$ zQYN@wFkJD{f4`zk&;YsAE%QxP_tx$2&$f8p#kFfS0j8g9yDMxI<+lcQ>fi+(c&$lBE@rMzktjBse%}K zqQjwcwq9-d(A@TZ!^das|7x2}yR9bcOk0+9j_Is^lZkJ0Ib)eae4&4PSXTVb)N>i8 z{ulZiQw?#S1#Kc-OsT8JXtWG)AYUU`Ps+tvlF`Bz-Z)S|?Xexu?o}`9__od2Uflku zYrJ-~_PH)w+o^S_f99apWocd#8N%YzP4}XyF zqGz&~GT(3pqYvOY=K?29@RRT!9!CG;`N7)Dc(}{jX;*z}U!sz$Q#AGZ54sH9VO@#3 zU)Sc&ymq;Eoc;^zGoKQEEm{+>r8^OGC*GO-xHn39pRy$RUHshOaiZ~(aXb@q28H1Y z&TUQyahi9KOXG81hf`}W)b~-{P^GFYt>TZIw#-h{8QV2SU8%dJ{Y!O3E!J4HXZ8M8 z+E<8moLGgZTVdq+__*ZeG(q~>KAY24^?n$hE3c8~^RH3MJo9`8a10GV{kX4q4>`Bt zTNID}a2(Pr^hebb+Gl;5+oo3aRu!wp=z@$_^aHgOT8H*P*SwBX8n;1i$#I4-DsF$$I}l+l_=NwE$04BU!&epKfrVlLIjCwgr@|_ybR9&II*61 z3t@h$UafMqjcvcA+21u!n{A$N8Dkq{R+{#i#%Ru|j&!!PFVw~vj$3rzZE%?QsQ<-o z!=k-$uX=^``?8NW?XSL@(#oSZ`CV74Bu1DC&jOC%Yu=wk75_SKD)Ex(?tS4|U{!0M zt2VTrZWDYO_%WhW+Vwx}9Q|a&Z^o;-Xx&+Dux^>&W_n^j;rj=?t;upRcw@)@0lN( zUTO0*Qw@!pw5}DJE1EpbK-DPK34O74i=p23z?DpYk4$8;U=zPgz9t|k&=;~G>_+6n zaBf&mL`aV_Av?O222Be(BD*XUikEO-g8$GFoCj9E(g*10>&~h}wNcs%%{RIVZH=*)<#+2vSEhFX9Skv1L3VJ~3wuhkB|2HF-*-ww z;J)CFU`a?vw-F(20VRHiW$D69elEG6jOC0(Ey#_}Ge?-aR0VaJ9_KymE%5GhA8}>ouGglc`o3)m5<8tc~N4>q&y~xv@ZpMMsQ6>P+ z!2(_q|At_oJXtzN(c8aR?();f6pAMQR{0oZwn8hN;WtroMyL|3=bsWHn1cyoFujvn z>fP$9@y2>4xj(ueIg(waj&e)3ZLU>j-D&^Fy3z64xy|vV8@Tto1APUaKGb!Zq|InN zrT0A|CzB)j9U_fDCtD`k$`6%~ksOz%${$O1DzC`IV!mVZlSN5&ZTnc z`=~oJm^ev>kw5UboHg7M-bhY}*e<>#3Xu8n3k0JjA%Y2#67hcCQqcmwh<}?q9%#^R z=9cHCXN(Vdo;aU5Z#f=1Lfl>U3U8UW!2P@LmixR%!#wqzrk9`%zC-99rS{2*zv(Za(I!FxuRz7P|;1nKEYDX=j1M~ zmdwJv;RED{ccYC|41I={Qb#D4&*4)seW_7^XfSBxaHhmNjVqCuCUPjp!JeXJ') + .appendTo(placeholder); + } + + if (axis.direction == "x") { + // to avoid measuring the widths of the labels (it's slow), we + // construct fixed-size boxes and put the labels inside + // them, we don't need the exact figures and the + // fixed-size box content is easy to center + if (w == null) + w = Math.floor(canvasWidth / (ticks.length > 0 ? ticks.length : 1)); + + // measure x label heights + if (h == null) { + labels = []; + for (i = 0; i < ticks.length; ++i) { + l = ticks[i].label; + if (l) + labels.push('
      ' + l + '
      '); + } + + if (labels.length > 0) { + // stick them all in the same div and measure + // collective height + labels.push('
      '); + dummyDiv = makeDummyDiv(labels, "width:10000px;"); + h = dummyDiv.height(); + dummyDiv.remove(); + } + } + } + else if (w == null || h == null) { + // calculate y label dimensions + for (i = 0; i < ticks.length; ++i) { + l = ticks[i].label; + if (l) + labels.push('
      ' + l + '
      '); + } + + if (labels.length > 0) { + dummyDiv = makeDummyDiv(labels, ""); + if (w == null) + w = dummyDiv.children().width(); + if (h == null) + h = dummyDiv.find("div.tickLabel").height(); + dummyDiv.remove(); + } + } + + if (w == null) + w = 0; + if (h == null) + h = 0; + + axis.labelWidth = w; + axis.labelHeight = h; + } + + function allocateAxisBoxFirstPhase(axis) { + // find the bounding box of the axis by looking at label + // widths/heights and ticks, make room by diminishing the + // plotOffset + + var lw = axis.labelWidth, + lh = axis.labelHeight, + pos = axis.options.position, + tickLength = axis.options.tickLength, + axismargin = options.grid.axisMargin, + padding = options.grid.labelMargin, + all = axis.direction == "x" ? xaxes : yaxes, + index; + + // determine axis margin + var samePosition = $.grep(all, function (a) { + return a && a.options.position == pos && a.reserveSpace; + }); + if ($.inArray(axis, samePosition) == samePosition.length - 1) + axismargin = 0; // outermost + + // determine tick length - if we're innermost, we can use "full" + if (tickLength == null) + tickLength = "full"; + + var sameDirection = $.grep(all, function (a) { + return a && a.reserveSpace; + }); + + var innermost = $.inArray(axis, sameDirection) == 0; + if (!innermost && tickLength == "full") + tickLength = 5; + + if (!isNaN(+tickLength)) + padding += +tickLength; + + // compute box + if (axis.direction == "x") { + lh += padding; + + if (pos == "bottom") { + plotOffset.bottom += lh + axismargin; + axis.box = { top: canvasHeight - plotOffset.bottom, height: lh }; + } + else { + axis.box = { top: plotOffset.top + axismargin, height: lh }; + plotOffset.top += lh + axismargin; + } + } + else { + lw += padding; + + if (pos == "left") { + axis.box = { left: plotOffset.left + axismargin, width: lw }; + plotOffset.left += lw + axismargin; + } + else { + plotOffset.right += lw + axismargin; + axis.box = { left: canvasWidth - plotOffset.right, width: lw }; + } + } + + // save for future reference + axis.position = pos; + axis.tickLength = tickLength; + axis.box.padding = padding; + axis.innermost = innermost; + } + + function allocateAxisBoxSecondPhase(axis) { + // set remaining bounding box coordinates + if (axis.direction == "x") { + axis.box.left = plotOffset.left; + axis.box.width = plotWidth; + } + else { + axis.box.top = plotOffset.top; + axis.box.height = plotHeight; + } + } + + function setupGrid() { + var i, axes = allAxes(); + + // first calculate the plot and axis box dimensions + + $.each(axes, function (_, axis) { + axis.show = axis.options.show; + if (axis.show == null) + axis.show = axis.used; // by default an axis is visible if it's got data + + axis.reserveSpace = axis.show || axis.options.reserveSpace; + + setRange(axis); + }); + + allocatedAxes = $.grep(axes, function (axis) { return axis.reserveSpace; }); + + plotOffset.left = plotOffset.right = plotOffset.top = plotOffset.bottom = 0; + if (options.grid.show) { + $.each(allocatedAxes, function (_, axis) { + // make the ticks + setupTickGeneration(axis); + setTicks(axis); + snapRangeToTicks(axis, axis.ticks); + + // find labelWidth/Height for axis + measureTickLabels(axis); + }); + + // with all dimensions in house, we can compute the + // axis boxes, start from the outside (reverse order) + for (i = allocatedAxes.length - 1; i >= 0; --i) + allocateAxisBoxFirstPhase(allocatedAxes[i]); + + // make sure we've got enough space for things that + // might stick out + var minMargin = options.grid.minBorderMargin; + if (minMargin == null) { + minMargin = 0; + for (i = 0; i < series.length; ++i) + minMargin = Math.max(minMargin, series[i].points.radius + series[i].points.lineWidth/2); + } + + for (var a in plotOffset) { + plotOffset[a] += options.grid.borderWidth; + plotOffset[a] = Math.max(minMargin, plotOffset[a]); + } + } + + plotWidth = canvasWidth - plotOffset.left - plotOffset.right; + plotHeight = canvasHeight - plotOffset.bottom - plotOffset.top; + + // now we got the proper plotWidth/Height, we can compute the scaling + $.each(axes, function (_, axis) { + setTransformationHelpers(axis); + }); + + if (options.grid.show) { + $.each(allocatedAxes, function (_, axis) { + allocateAxisBoxSecondPhase(axis); + }); + + insertAxisLabels(); + } + + insertLegend(); + } + + function setRange(axis) { + var opts = axis.options, + min = +(opts.min != null ? opts.min : axis.datamin), + max = +(opts.max != null ? opts.max : axis.datamax), + delta = max - min; + + if (delta == 0.0) { + // degenerate case + var widen = max == 0 ? 1 : 0.01; + + if (opts.min == null) + min -= widen; + // always widen max if we couldn't widen min to ensure we + // don't fall into min == max which doesn't work + if (opts.max == null || opts.min != null) + max += widen; + } + else { + // consider autoscaling + var margin = opts.autoscaleMargin; + if (margin != null) { + if (opts.min == null) { + min -= delta * margin; + // make sure we don't go below zero if all values + // are positive + if (min < 0 && axis.datamin != null && axis.datamin >= 0) + min = 0; + } + if (opts.max == null) { + max += delta * margin; + if (max > 0 && axis.datamax != null && axis.datamax <= 0) + max = 0; + } + } + } + axis.min = min; + axis.max = max; + } + + function setupTickGeneration(axis) { + var opts = axis.options; + + // estimate number of ticks + var noTicks; + if (typeof opts.ticks == "number" && opts.ticks > 0) + noTicks = opts.ticks; + else + // heuristic based on the model a*sqrt(x) fitted to + // some data points that seemed reasonable + noTicks = 0.3 * Math.sqrt(axis.direction == "x" ? canvasWidth : canvasHeight); + + var delta = (axis.max - axis.min) / noTicks, + size, generator, unit, formatter, i, magn, norm; + + if (opts.mode == "time") { + // pretty handling of time + + // 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 (opts.minTickSize != null) { + if (typeof opts.tickSize == "number") + minSize = opts.tickSize; + else + minSize = opts.minTickSize[0] * timeUnitSize[opts.minTickSize[1]]; + } + + for (var 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; + } + + axis.tickSize = opts.tickSize || [size, unit]; + + 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.setUTCSeconds(floorInBase(d.getUTCSeconds(), tickSize)); + if (unit == "minute") + d.setUTCMinutes(floorInBase(d.getUTCMinutes(), tickSize)); + if (unit == "hour") + d.setUTCHours(floorInBase(d.getUTCHours(), tickSize)); + if (unit == "month") + d.setUTCMonth(floorInBase(d.getUTCMonth(), tickSize)); + if (unit == "year") + d.setUTCFullYear(floorInBase(d.getUTCFullYear(), tickSize)); + + // reset smaller components + d.setUTCMilliseconds(0); + if (step >= timeUnitSize.minute) + d.setUTCSeconds(0); + if (step >= timeUnitSize.hour) + d.setUTCMinutes(0); + if (step >= timeUnitSize.day) + d.setUTCHours(0); + if (step >= timeUnitSize.day * 4) + d.setUTCDate(1); + if (step >= timeUnitSize.year) + d.setUTCMonth(0); + + + var carry = 0, v = Number.NaN, prev; + do { + prev = v; + v = d.getTime(); + ticks.push(v); + if (unit == "month") { + if (tickSize < 1) { + // a bit complicated - we'll divide the month + // up but we need to take care of fractions + // so we don't end up in the middle of a day + d.setUTCDate(1); + var start = d.getTime(); + d.setUTCMonth(d.getUTCMonth() + 1); + var end = d.getTime(); + d.setTime(v + carry * timeUnitSize.hour + (end - start) * tickSize); + carry = d.getUTCHours(); + d.setUTCHours(0); + } + else + d.setUTCMonth(d.getUTCMonth() + tickSize); + } + else if (unit == "year") { + d.setUTCFullYear(d.getUTCFullYear() + tickSize); + } + else + d.setTime(v + step); + } while (v < axis.max && v != prev); + + return ticks; + }; + + formatter = function (v, axis) { + var d = new Date(v); + + // first check global format + if (opts.timeformat != null) + return $.plot.formatDate(d, opts.timeformat, opts.monthNames); + + var t = axis.tickSize[0] * timeUnitSize[axis.tickSize[1]]; + var span = axis.max - axis.min; + var suffix = (opts.twelveHourClock) ? " %p" : ""; + + if (t < timeUnitSize.minute) + fmt = "%h:%M:%S" + suffix; + else if (t < timeUnitSize.day) { + if (span < 2 * timeUnitSize.day) + fmt = "%h:%M" + suffix; + else + fmt = "%b %d %h:%M" + suffix; + } + 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 $.plot.formatDate(d, fmt, opts.monthNames); + }; + } + else { + // pretty rounding of base-10 numbers + var maxDec = opts.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 (opts.minTickSize != null && size < opts.minTickSize) + size = opts.minTickSize; + + axis.tickDecimals = Math.max(0, maxDec != null ? maxDec : dec); + axis.tickSize = opts.tickSize || size; + + generator = function (axis) { + var ticks = []; + + // spew out all possible ticks + var start = floorInBase(axis.min, axis.tickSize), + i = 0, v = Number.NaN, prev; + do { + prev = v; + v = start + i * axis.tickSize; + ticks.push(v); + ++i; + } while (v < axis.max && v != prev); + return ticks; + }; + + formatter = function (v, axis) { + return v.toFixed(axis.tickDecimals); + }; + } + + if (opts.alignTicksWithAxis != null) { + var otherAxis = (axis.direction == "x" ? xaxes : yaxes)[opts.alignTicksWithAxis - 1]; + if (otherAxis && otherAxis.used && otherAxis != axis) { + // consider snapping min/max to outermost nice ticks + var niceTicks = generator(axis); + if (niceTicks.length > 0) { + if (opts.min == null) + axis.min = Math.min(axis.min, niceTicks[0]); + if (opts.max == null && niceTicks.length > 1) + axis.max = Math.max(axis.max, niceTicks[niceTicks.length - 1]); + } + + generator = function (axis) { + // copy ticks, scaled to this axis + var ticks = [], v, i; + for (i = 0; i < otherAxis.ticks.length; ++i) { + v = (otherAxis.ticks[i].v - otherAxis.min) / (otherAxis.max - otherAxis.min); + v = axis.min + v * (axis.max - axis.min); + ticks.push(v); + } + return ticks; + }; + + // we might need an extra decimal since forced + // ticks don't necessarily fit naturally + if (axis.mode != "time" && opts.tickDecimals == null) { + var extraDec = Math.max(0, -Math.floor(Math.log(delta) / Math.LN10) + 1), + ts = generator(axis); + + // only proceed if the tick interval rounded + // with an extra decimal doesn't give us a + // zero at end + if (!(ts.length > 1 && /\..*0$/.test((ts[1] - ts[0]).toFixed(extraDec)))) + axis.tickDecimals = extraDec; + } + } + } + + axis.tickGenerator = generator; + if ($.isFunction(opts.tickFormatter)) + axis.tickFormatter = function (v, axis) { return "" + opts.tickFormatter(v, axis); }; + else + axis.tickFormatter = formatter; + } + + function setTicks(axis) { + var oticks = axis.options.ticks, ticks = []; + if (oticks == null || (typeof oticks == "number" && oticks > 0)) + ticks = axis.tickGenerator(axis); + else if (oticks) { + if ($.isFunction(oticks)) + // generate the ticks + ticks = oticks({ min: axis.min, max: axis.max }); + else + ticks = oticks; + } + + // clean up/labelify the supplied ticks, copy them over + var i, v; + axis.ticks = []; + for (i = 0; i < ticks.length; ++i) { + var label = null; + var t = ticks[i]; + if (typeof t == "object") { + v = +t[0]; + if (t.length > 1) + label = t[1]; + } + else + v = +t; + if (label == null) + label = axis.tickFormatter(v, axis); + if (!isNaN(v)) + axis.ticks.push({ v: v, label: label }); + } + } + + function snapRangeToTicks(axis, ticks) { + if (axis.options.autoscaleMargin && ticks.length > 0) { + // snap to ticks + if (axis.options.min == null) + axis.min = Math.min(axis.min, ticks[0].v); + if (axis.options.max == null && ticks.length > 1) + axis.max = Math.max(axis.max, ticks[ticks.length - 1].v); + } + } + + function draw() { + ctx.clearRect(0, 0, canvasWidth, canvasHeight); + + var grid = options.grid; + + // draw background, if any + if (grid.show && grid.backgroundColor) + drawBackground(); + + if (grid.show && !grid.aboveData) + drawGrid(); + + for (var i = 0; i < series.length; ++i) { + executeHooks(hooks.drawSeries, [ctx, series[i]]); + drawSeries(series[i]); + } + + executeHooks(hooks.draw, [ctx]); + + if (grid.show && grid.aboveData) + drawGrid(); + } + + function extractRange(ranges, coord) { + var axis, from, to, key, axes = allAxes(); + + for (i = 0; i < axes.length; ++i) { + axis = axes[i]; + if (axis.direction == coord) { + key = coord + axis.n + "axis"; + if (!ranges[key] && axis.n == 1) + key = coord + "axis"; // support x1axis as xaxis + if (ranges[key]) { + from = ranges[key].from; + to = ranges[key].to; + break; + } + } + } + + // backwards-compat stuff - to be removed in future + if (!ranges[key]) { + axis = coord == "x" ? xaxes[0] : yaxes[0]; + from = ranges[coord + "1"]; + to = ranges[coord + "2"]; + } + + // auto-reverse as an added bonus + if (from != null && to != null && from > to) { + var tmp = from; + from = to; + to = tmp; + } + + return { from: from, to: to, axis: axis }; + } + + function drawBackground() { + ctx.save(); + ctx.translate(plotOffset.left, plotOffset.top); + + ctx.fillStyle = getColorOrGradient(options.grid.backgroundColor, plotHeight, 0, "rgba(255, 255, 255, 0)"); + ctx.fillRect(0, 0, plotWidth, plotHeight); + ctx.restore(); + } + + function drawGrid() { + var i; + + ctx.save(); + ctx.translate(plotOffset.left, plotOffset.top); + + // draw markings + var markings = options.grid.markings; + if (markings) { + if ($.isFunction(markings)) { + var axes = plot.getAxes(); + // xmin etc. is backwards compatibility, to be + // removed in the future + axes.xmin = axes.xaxis.min; + axes.xmax = axes.xaxis.max; + axes.ymin = axes.yaxis.min; + axes.ymax = axes.yaxis.max; + + markings = markings(axes); + } + + for (i = 0; i < markings.length; ++i) { + var m = markings[i], + xrange = extractRange(m, "x"), + yrange = extractRange(m, "y"); + + // fill in missing + if (xrange.from == null) + xrange.from = xrange.axis.min; + if (xrange.to == null) + xrange.to = xrange.axis.max; + if (yrange.from == null) + yrange.from = yrange.axis.min; + if (yrange.to == null) + yrange.to = yrange.axis.max; + + // clip + if (xrange.to < xrange.axis.min || xrange.from > xrange.axis.max || + yrange.to < yrange.axis.min || yrange.from > yrange.axis.max) + continue; + + xrange.from = Math.max(xrange.from, xrange.axis.min); + xrange.to = Math.min(xrange.to, xrange.axis.max); + yrange.from = Math.max(yrange.from, yrange.axis.min); + yrange.to = Math.min(yrange.to, yrange.axis.max); + + if (xrange.from == xrange.to && yrange.from == yrange.to) + continue; + + // then draw + xrange.from = xrange.axis.p2c(xrange.from); + xrange.to = xrange.axis.p2c(xrange.to); + yrange.from = yrange.axis.p2c(yrange.from); + yrange.to = yrange.axis.p2c(yrange.to); + + if (xrange.from == xrange.to || yrange.from == yrange.to) { + // draw line + ctx.beginPath(); + ctx.strokeStyle = m.color || options.grid.markingsColor; + ctx.lineWidth = m.lineWidth || options.grid.markingsLineWidth; + ctx.moveTo(xrange.from, yrange.from); + ctx.lineTo(xrange.to, yrange.to); + ctx.stroke(); + } + else { + // fill area + ctx.fillStyle = m.color || options.grid.markingsColor; + ctx.fillRect(xrange.from, yrange.to, + xrange.to - xrange.from, + yrange.from - yrange.to); + } + } + } + + // draw the ticks + var axes = allAxes(), bw = options.grid.borderWidth; + + for (var j = 0; j < axes.length; ++j) { + var axis = axes[j], box = axis.box, + t = axis.tickLength, x, y, xoff, yoff; + if (!axis.show || axis.ticks.length == 0) + continue + + ctx.strokeStyle = axis.options.tickColor || $.color.parse(axis.options.color).scale('a', 0.22).toString(); + ctx.lineWidth = 1; + + // find the edges + if (axis.direction == "x") { + x = 0; + if (t == "full") + y = (axis.position == "top" ? 0 : plotHeight); + else + y = box.top - plotOffset.top + (axis.position == "top" ? box.height : 0); + } + else { + y = 0; + if (t == "full") + x = (axis.position == "left" ? 0 : plotWidth); + else + x = box.left - plotOffset.left + (axis.position == "left" ? box.width : 0); + } + + // draw tick bar + if (!axis.innermost) { + ctx.beginPath(); + xoff = yoff = 0; + if (axis.direction == "x") + xoff = plotWidth; + else + yoff = plotHeight; + + if (ctx.lineWidth == 1) { + x = Math.floor(x) + 0.5; + y = Math.floor(y) + 0.5; + } + + ctx.moveTo(x, y); + ctx.lineTo(x + xoff, y + yoff); + ctx.stroke(); + } + + // draw ticks + ctx.beginPath(); + for (i = 0; i < axis.ticks.length; ++i) { + var v = axis.ticks[i].v; + + xoff = yoff = 0; + + if (v < axis.min || v > axis.max + // skip those lying on the axes if we got a border + || (t == "full" && bw > 0 + && (v == axis.min || v == axis.max))) + continue; + + if (axis.direction == "x") { + x = axis.p2c(v); + yoff = t == "full" ? -plotHeight : t; + + if (axis.position == "top") + yoff = -yoff; + } + else { + y = axis.p2c(v); + xoff = t == "full" ? -plotWidth : t; + + if (axis.position == "left") + xoff = -xoff; + } + + if (ctx.lineWidth == 1) { + if (axis.direction == "x") + x = Math.floor(x) + 0.5; + else + y = Math.floor(y) + 0.5; + } + + ctx.moveTo(x, y); + ctx.lineTo(x + xoff, y + yoff); + } + + ctx.stroke(); + } + + + // draw border + if (bw) { + ctx.lineWidth = bw; + ctx.strokeStyle = options.grid.borderColor; + ctx.strokeRect(-bw/2, -bw/2, plotWidth + bw, plotHeight + bw); + } + + ctx.restore(); + } + + function insertAxisLabels() { + placeholder.find(".tickLabels").remove(); + + var html = ['
      ']; + + var axes = allAxes(); + for (var j = 0; j < axes.length; ++j) { + var axis = axes[j], box = axis.box; + if (!axis.show) + continue; + //debug: html.push('
      ') + html.push('
      '); + for (var i = 0; i < axis.ticks.length; ++i) { + var tick = axis.ticks[i]; + if (!tick.label || tick.v < axis.min || tick.v > axis.max) + continue; + + var pos = {}, align; + + if (axis.direction == "x") { + align = "center"; + pos.left = Math.round(plotOffset.left + axis.p2c(tick.v) - axis.labelWidth/2); + if (axis.position == "bottom") + pos.top = box.top + box.padding; + else + pos.bottom = canvasHeight - (box.top + box.height - box.padding); + } + else { + pos.top = Math.round(plotOffset.top + axis.p2c(tick.v) - axis.labelHeight/2); + if (axis.position == "left") { + pos.right = canvasWidth - (box.left + box.width - box.padding) + align = "right"; + } + else { + pos.left = box.left + box.padding; + align = "left"; + } + } + + pos.width = axis.labelWidth; + + var style = ["position:absolute", "text-align:" + align ]; + for (var a in pos) + style.push(a + ":" + pos[a] + "px") + + html.push('
      ' + tick.label + '
      '); + } + html.push('
      '); + } + + html.push('
      '); + + placeholder.append(html.join("")); + } + + function drawSeries(series) { + if (series.lines.show) + drawSeriesLines(series); + if (series.bars.show) + drawSeriesBars(series); + if (series.points.show) + drawSeriesPoints(series); + } + + function drawSeriesLines(series) { + function plotLine(datapoints, xoffset, yoffset, axisx, axisy) { + var points = datapoints.points, + ps = datapoints.pointsize, + prevx = null, prevy = null; + + ctx.beginPath(); + for (var i = ps; i < points.length; i += ps) { + var x1 = points[i - ps], y1 = points[i - ps + 1], + x2 = points[i], y2 = points[i + 1]; + + if (x1 == null || x2 == null) + continue; + + // clip with ymin + if (y1 <= y2 && y1 < axisy.min) { + if (y2 < axisy.min) + continue; // line segment is outside + // compute new intersection point + x1 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1; + y1 = axisy.min; + } + else if (y2 <= y1 && y2 < axisy.min) { + if (y1 < axisy.min) + continue; + x2 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1; + y2 = axisy.min; + } + + // clip with ymax + if (y1 >= y2 && y1 > axisy.max) { + if (y2 > axisy.max) + continue; + x1 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1; + y1 = axisy.max; + } + else if (y2 >= y1 && y2 > axisy.max) { + if (y1 > axisy.max) + continue; + x2 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1; + y2 = axisy.max; + } + + // clip with xmin + if (x1 <= x2 && x1 < axisx.min) { + if (x2 < axisx.min) + continue; + y1 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1; + x1 = axisx.min; + } + else if (x2 <= x1 && x2 < axisx.min) { + if (x1 < axisx.min) + continue; + y2 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1; + x2 = axisx.min; + } + + // clip with xmax + if (x1 >= x2 && x1 > axisx.max) { + if (x2 > axisx.max) + continue; + y1 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1; + x1 = axisx.max; + } + else if (x2 >= x1 && x2 > axisx.max) { + if (x1 > axisx.max) + continue; + y2 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1; + x2 = axisx.max; + } + + if (x1 != prevx || y1 != prevy) + ctx.moveTo(axisx.p2c(x1) + xoffset, axisy.p2c(y1) + yoffset); + + prevx = x2; + prevy = y2; + ctx.lineTo(axisx.p2c(x2) + xoffset, axisy.p2c(y2) + yoffset); + } + ctx.stroke(); + } + + function plotLineArea(datapoints, axisx, axisy) { + var points = datapoints.points, + ps = datapoints.pointsize, + bottom = Math.min(Math.max(0, axisy.min), axisy.max), + i = 0, top, areaOpen = false, + ypos = 1, segmentStart = 0, segmentEnd = 0; + + // we process each segment in two turns, first forward + // direction to sketch out top, then once we hit the + // end we go backwards to sketch the bottom + while (true) { + if (ps > 0 && i > points.length + ps) + break; + + i += ps; // ps is negative if going backwards + + var x1 = points[i - ps], + y1 = points[i - ps + ypos], + x2 = points[i], y2 = points[i + ypos]; + + if (areaOpen) { + if (ps > 0 && x1 != null && x2 == null) { + // at turning point + segmentEnd = i; + ps = -ps; + ypos = 2; + continue; + } + + if (ps < 0 && i == segmentStart + ps) { + // done with the reverse sweep + ctx.fill(); + areaOpen = false; + ps = -ps; + ypos = 1; + i = segmentStart = segmentEnd + ps; + continue; + } + } + + if (x1 == null || x2 == null) + continue; + + // clip x values + + // clip with xmin + if (x1 <= x2 && x1 < axisx.min) { + if (x2 < axisx.min) + continue; + y1 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1; + x1 = axisx.min; + } + else if (x2 <= x1 && x2 < axisx.min) { + if (x1 < axisx.min) + continue; + y2 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1; + x2 = axisx.min; + } + + // clip with xmax + if (x1 >= x2 && x1 > axisx.max) { + if (x2 > axisx.max) + continue; + y1 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1; + x1 = axisx.max; + } + else if (x2 >= x1 && x2 > axisx.max) { + if (x1 > axisx.max) + continue; + y2 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1; + x2 = axisx.max; + } + + if (!areaOpen) { + // open area + ctx.beginPath(); + ctx.moveTo(axisx.p2c(x1), axisy.p2c(bottom)); + areaOpen = true; + } + + // now first check the case where both is outside + if (y1 >= axisy.max && y2 >= axisy.max) { + ctx.lineTo(axisx.p2c(x1), axisy.p2c(axisy.max)); + ctx.lineTo(axisx.p2c(x2), axisy.p2c(axisy.max)); + continue; + } + else if (y1 <= axisy.min && y2 <= axisy.min) { + ctx.lineTo(axisx.p2c(x1), axisy.p2c(axisy.min)); + ctx.lineTo(axisx.p2c(x2), axisy.p2c(axisy.min)); + continue; + } + + // else it's a bit more complicated, there might + // be a flat maxed out rectangle first, then a + // triangular cutout or reverse; to find these + // keep track of the current x values + var x1old = x1, x2old = x2; + + // clip the y values, without shortcutting, we + // go through all cases in turn + + // clip with ymin + if (y1 <= y2 && y1 < axisy.min && y2 >= axisy.min) { + x1 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1; + y1 = axisy.min; + } + else if (y2 <= y1 && y2 < axisy.min && y1 >= axisy.min) { + x2 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1; + y2 = axisy.min; + } + + // clip with ymax + if (y1 >= y2 && y1 > axisy.max && y2 <= axisy.max) { + x1 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1; + y1 = axisy.max; + } + else if (y2 >= y1 && y2 > axisy.max && y1 <= axisy.max) { + x2 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1; + y2 = axisy.max; + } + + // if the x value was changed we got a rectangle + // to fill + if (x1 != x1old) { + ctx.lineTo(axisx.p2c(x1old), axisy.p2c(y1)); + // it goes to (x1, y1), but we fill that below + } + + // fill triangular section, this sometimes result + // in redundant points if (x1, y1) hasn't changed + // from previous line to, but we just ignore that + ctx.lineTo(axisx.p2c(x1), axisy.p2c(y1)); + ctx.lineTo(axisx.p2c(x2), axisy.p2c(y2)); + + // fill the other rectangle if it's there + if (x2 != x2old) { + ctx.lineTo(axisx.p2c(x2), axisy.p2c(y2)); + ctx.lineTo(axisx.p2c(x2old), axisy.p2c(y2)); + } + } + } + + ctx.save(); + ctx.translate(plotOffset.left, plotOffset.top); + ctx.lineJoin = "round"; + + var lw = series.lines.lineWidth, + sw = series.shadowSize; + // FIXME: consider another form of shadow when filling is turned on + if (lw > 0 && sw > 0) { + // draw shadow as a thick and thin line with transparency + ctx.lineWidth = sw; + ctx.strokeStyle = "rgba(0,0,0,0.1)"; + // position shadow at angle from the mid of line + var angle = Math.PI/18; + plotLine(series.datapoints, Math.sin(angle) * (lw/2 + sw/2), Math.cos(angle) * (lw/2 + sw/2), series.xaxis, series.yaxis); + ctx.lineWidth = sw/2; + plotLine(series.datapoints, Math.sin(angle) * (lw/2 + sw/4), Math.cos(angle) * (lw/2 + sw/4), series.xaxis, series.yaxis); + } + + ctx.lineWidth = lw; + ctx.strokeStyle = series.color; + var fillStyle = getFillStyle(series.lines, series.color, 0, plotHeight); + if (fillStyle) { + ctx.fillStyle = fillStyle; + plotLineArea(series.datapoints, series.xaxis, series.yaxis); + } + + if (lw > 0) + plotLine(series.datapoints, 0, 0, series.xaxis, series.yaxis); + ctx.restore(); + } + + function drawSeriesPoints(series) { + function plotPoints(datapoints, radius, fillStyle, offset, shadow, axisx, axisy, symbol) { + var points = datapoints.points, ps = datapoints.pointsize; + + for (var i = 0; i < points.length; i += ps) { + var x = points[i], y = points[i + 1]; + if (x == null || x < axisx.min || x > axisx.max || y < axisy.min || y > axisy.max) + continue; + + ctx.beginPath(); + x = axisx.p2c(x); + y = axisy.p2c(y) + offset; + if (symbol == "circle") + ctx.arc(x, y, radius, 0, shadow ? Math.PI : Math.PI * 2, false); + else + symbol(ctx, x, y, radius, shadow); + ctx.closePath(); + + if (fillStyle) { + ctx.fillStyle = fillStyle; + ctx.fill(); + } + ctx.stroke(); + } + } + + ctx.save(); + ctx.translate(plotOffset.left, plotOffset.top); + + var lw = series.points.lineWidth, + sw = series.shadowSize, + radius = series.points.radius, + symbol = series.points.symbol; + if (lw > 0 && sw > 0) { + // draw shadow in two steps + var w = sw / 2; + ctx.lineWidth = w; + ctx.strokeStyle = "rgba(0,0,0,0.1)"; + plotPoints(series.datapoints, radius, null, w + w/2, true, + series.xaxis, series.yaxis, symbol); + + ctx.strokeStyle = "rgba(0,0,0,0.2)"; + plotPoints(series.datapoints, radius, null, w/2, true, + series.xaxis, series.yaxis, symbol); + } + + ctx.lineWidth = lw; + ctx.strokeStyle = series.color; + plotPoints(series.datapoints, radius, + getFillStyle(series.points, series.color), 0, false, + series.xaxis, series.yaxis, symbol); + ctx.restore(); + } + + function drawBar(x, y, b, barLeft, barRight, offset, fillStyleCallback, axisx, axisy, c, horizontal, lineWidth) { + var left, right, bottom, top, + drawLeft, drawRight, drawTop, drawBottom, + tmp; + + // in horizontal mode, we start the bar from the left + // instead of from the bottom so it appears to be + // horizontal rather than vertical + if (horizontal) { + drawBottom = drawRight = drawTop = true; + drawLeft = false; + left = b; + right = x; + top = y + barLeft; + bottom = y + barRight; + + // account for negative bars + if (right < left) { + tmp = right; + right = left; + left = tmp; + drawLeft = true; + drawRight = false; + } + } + else { + drawLeft = drawRight = drawTop = true; + drawBottom = false; + left = x + barLeft; + right = x + barRight; + bottom = b; + top = y; + + // account for negative bars + if (top < bottom) { + tmp = top; + top = bottom; + bottom = tmp; + drawBottom = true; + drawTop = false; + } + } + + // clip + if (right < axisx.min || left > axisx.max || + top < axisy.min || bottom > axisy.max) + return; + + if (left < axisx.min) { + left = axisx.min; + drawLeft = false; + } + + if (right > axisx.max) { + right = axisx.max; + drawRight = false; + } + + if (bottom < axisy.min) { + bottom = axisy.min; + drawBottom = false; + } + + if (top > axisy.max) { + top = axisy.max; + drawTop = false; + } + + left = axisx.p2c(left); + bottom = axisy.p2c(bottom); + right = axisx.p2c(right); + top = axisy.p2c(top); + + // fill the bar + if (fillStyleCallback) { + c.beginPath(); + c.moveTo(left, bottom); + c.lineTo(left, top); + c.lineTo(right, top); + c.lineTo(right, bottom); + c.fillStyle = fillStyleCallback(bottom, top); + c.fill(); + } + + // draw outline + if (lineWidth > 0 && (drawLeft || drawRight || drawTop || drawBottom)) { + c.beginPath(); + + // FIXME: inline moveTo is buggy with excanvas + c.moveTo(left, bottom + offset); + if (drawLeft) + c.lineTo(left, top + offset); + else + c.moveTo(left, top + offset); + if (drawTop) + c.lineTo(right, top + offset); + else + c.moveTo(right, top + offset); + if (drawRight) + c.lineTo(right, bottom + offset); + else + c.moveTo(right, bottom + offset); + if (drawBottom) + c.lineTo(left, bottom + offset); + else + c.moveTo(left, bottom + offset); + c.stroke(); + } + } + + function drawSeriesBars(series) { + function plotBars(datapoints, barLeft, barRight, offset, fillStyleCallback, axisx, axisy) { + var points = datapoints.points, ps = datapoints.pointsize; + + for (var i = 0; i < points.length; i += ps) { + if (points[i] == null) + continue; + drawBar(points[i], points[i + 1], points[i + 2], barLeft, barRight, offset, fillStyleCallback, axisx, axisy, ctx, series.bars.horizontal, series.bars.lineWidth); + } + } + + ctx.save(); + ctx.translate(plotOffset.left, plotOffset.top); + + // FIXME: figure out a way to add shadows (for instance along the right edge) + ctx.lineWidth = series.bars.lineWidth; + ctx.strokeStyle = series.color; + var barLeft = series.bars.align == "left" ? 0 : -series.bars.barWidth/2; + var fillStyleCallback = series.bars.fill ? function (bottom, top) { return getFillStyle(series.bars, series.color, bottom, top); } : null; + plotBars(series.datapoints, barLeft, barLeft + series.bars.barWidth, 0, fillStyleCallback, series.xaxis, series.yaxis); + ctx.restore(); + } + + function getFillStyle(filloptions, seriesColor, bottom, top) { + var fill = filloptions.fill; + if (!fill) + return null; + + if (filloptions.fillColor) + return getColorOrGradient(filloptions.fillColor, bottom, top, seriesColor); + + var c = $.color.parse(seriesColor); + c.a = typeof fill == "number" ? fill : 0.4; + c.normalize(); + return c.toString(); + } + + function insertLegend() { + placeholder.find(".legend").remove(); + + if (!options.legend.show) + return; + + var fragments = [], rowStarted = false, + lf = options.legend.labelFormatter, s, label; + for (var i = 0; i < series.length; ++i) { + s = series[i]; + label = s.label; + if (!label) + continue; + + if (i % options.legend.noColumns == 0) { + if (rowStarted) + fragments.push(''); + fragments.push(''); + rowStarted = true; + } + + if (lf) + label = lf(label, s); + + fragments.push( + '
      ' + + '' + label + ''); + } + if (rowStarted) + fragments.push(''); + + if (fragments.length == 0) + return; + + var table = '' + fragments.join("") + '
      '; + if (options.legend.container != null) + $(options.legend.container).html(table); + else { + var pos = "", + p = options.legend.position, + m = options.legend.margin; + if (m[0] == null) + m = [m, m]; + if (p.charAt(0) == "n") + pos += 'top:' + (m[1] + plotOffset.top) + 'px;'; + else if (p.charAt(0) == "s") + pos += 'bottom:' + (m[1] + plotOffset.bottom) + 'px;'; + if (p.charAt(1) == "e") + pos += 'right:' + (m[0] + plotOffset.right) + 'px;'; + else if (p.charAt(1) == "w") + pos += 'left:' + (m[0] + plotOffset.left) + 'px;'; + var legend = $('
      ' + table.replace('style="', 'style="position:absolute;' + pos +';') + '
      ').appendTo(placeholder); + if (options.legend.backgroundOpacity != 0.0) { + // put in the transparent background + // separately to avoid blended labels and + // label boxes + var c = options.legend.backgroundColor; + if (c == null) { + c = options.grid.backgroundColor; + if (c && typeof c == "string") + c = $.color.parse(c); + else + c = $.color.extract(legend, 'background-color'); + c.a = 1; + c = c.toString(); + } + var div = legend.children(); + $('
      ').prependTo(legend).css('opacity', options.legend.backgroundOpacity); + } + } + } + + + // interactive features + + var highlights = [], + redrawTimeout = null; + + // returns the data item the mouse is over, or null if none is found + function findNearbyItem(mouseX, mouseY, seriesFilter) { + var maxDistance = options.grid.mouseActiveRadius, + smallestDistance = maxDistance * maxDistance + 1, + item = null, foundPoint = false, i, j; + + for (i = series.length - 1; i >= 0; --i) { + if (!seriesFilter(series[i])) + continue; + + var s = series[i], + axisx = s.xaxis, + axisy = s.yaxis, + points = s.datapoints.points, + ps = s.datapoints.pointsize, + mx = axisx.c2p(mouseX), // precompute some stuff to make the loop faster + my = axisy.c2p(mouseY), + maxx = maxDistance / axisx.scale, + maxy = maxDistance / axisy.scale; + + // with inverse transforms, we can't use the maxx/maxy + // optimization, sadly + if (axisx.options.inverseTransform) + maxx = Number.MAX_VALUE; + if (axisy.options.inverseTransform) + maxy = Number.MAX_VALUE; + + if (s.lines.show || s.points.show) { + for (j = 0; j < points.length; j += ps) { + var x = points[j], y = points[j + 1]; + if (x == null) + continue; + + // For points and lines, the cursor must be within a + // certain distance to the data point + if (x - mx > maxx || x - mx < -maxx || + y - my > maxy || y - my < -maxy) + continue; + + // We have to calculate distances in pixels, not in + // data units, because the scales of the axes may be different + var dx = Math.abs(axisx.p2c(x) - mouseX), + dy = Math.abs(axisy.p2c(y) - mouseY), + dist = dx * dx + dy * dy; // we save the sqrt + + // use <= to ensure last point takes precedence + // (last generally means on top of) + if (dist < smallestDistance) { + smallestDistance = dist; + item = [i, j / ps]; + } + } + } + + if (s.bars.show && !item) { // no other point can be nearby + var barLeft = s.bars.align == "left" ? 0 : -s.bars.barWidth/2, + barRight = barLeft + s.bars.barWidth; + + for (j = 0; j < points.length; j += ps) { + var x = points[j], y = points[j + 1], b = points[j + 2]; + if (x == null) + continue; + + // for a bar graph, the cursor must be inside the bar + if (series[i].bars.horizontal ? + (mx <= Math.max(b, x) && mx >= Math.min(b, x) && + my >= y + barLeft && my <= y + barRight) : + (mx >= x + barLeft && mx <= x + barRight && + my >= Math.min(b, y) && my <= Math.max(b, y))) + item = [i, j / ps]; + } + } + } + + if (item) { + i = item[0]; + j = item[1]; + ps = series[i].datapoints.pointsize; + + return { datapoint: series[i].datapoints.points.slice(j * ps, (j + 1) * ps), + dataIndex: j, + series: series[i], + seriesIndex: i }; + } + + return null; + } + + function onMouseMove(e) { + if (options.grid.hoverable) + triggerClickHoverEvent("plothover", e, + function (s) { return s["hoverable"] != false; }); + } + + function onMouseLeave(e) { + if (options.grid.hoverable) + triggerClickHoverEvent("plothover", e, + function (s) { return false; }); + } + + function onClick(e) { + triggerClickHoverEvent("plotclick", e, + function (s) { return s["clickable"] != false; }); + } + + // trigger click or hover event (they send the same parameters + // so we share their code) + function triggerClickHoverEvent(eventname, event, seriesFilter) { + var offset = eventHolder.offset(), + canvasX = event.pageX - offset.left - plotOffset.left, + canvasY = event.pageY - offset.top - plotOffset.top, + pos = canvasToAxisCoords({ left: canvasX, top: canvasY }); + + pos.pageX = event.pageX; + pos.pageY = event.pageY; + + var item = findNearbyItem(canvasX, canvasY, seriesFilter); + + if (item) { + // fill in mouse pos for any listeners out there + item.pageX = parseInt(item.series.xaxis.p2c(item.datapoint[0]) + offset.left + plotOffset.left); + item.pageY = parseInt(item.series.yaxis.p2c(item.datapoint[1]) + offset.top + plotOffset.top); + } + + if (options.grid.autoHighlight) { + // clear auto-highlights + for (var i = 0; i < highlights.length; ++i) { + var h = highlights[i]; + if (h.auto == eventname && + !(item && h.series == item.series && + h.point[0] == item.datapoint[0] && + h.point[1] == item.datapoint[1])) + unhighlight(h.series, h.point); + } + + if (item) + highlight(item.series, item.datapoint, eventname); + } + + placeholder.trigger(eventname, [ pos, item ]); + } + + function triggerRedrawOverlay() { + if (!redrawTimeout) + redrawTimeout = setTimeout(drawOverlay, 30); + } + + function drawOverlay() { + redrawTimeout = null; + + // draw highlights + octx.save(); + octx.clearRect(0, 0, canvasWidth, canvasHeight); + octx.translate(plotOffset.left, plotOffset.top); + + var i, hi; + for (i = 0; i < highlights.length; ++i) { + hi = highlights[i]; + + if (hi.series.bars.show) + drawBarHighlight(hi.series, hi.point); + else + drawPointHighlight(hi.series, hi.point); + } + octx.restore(); + + executeHooks(hooks.drawOverlay, [octx]); + } + + function highlight(s, point, auto) { + if (typeof s == "number") + s = series[s]; + + if (typeof point == "number") { + var ps = s.datapoints.pointsize; + point = s.datapoints.points.slice(ps * point, ps * (point + 1)); + } + + var i = indexOfHighlight(s, point); + if (i == -1) { + highlights.push({ series: s, point: point, auto: auto }); + + triggerRedrawOverlay(); + } + else if (!auto) + highlights[i].auto = false; + } + + function unhighlight(s, point) { + if (s == null && point == null) { + highlights = []; + triggerRedrawOverlay(); + } + + if (typeof s == "number") + s = series[s]; + + if (typeof point == "number") + point = s.data[point]; + + var i = indexOfHighlight(s, point); + if (i != -1) { + highlights.splice(i, 1); + + triggerRedrawOverlay(); + } + } + + function indexOfHighlight(s, p) { + for (var i = 0; i < highlights.length; ++i) { + var h = highlights[i]; + if (h.series == s && h.point[0] == p[0] + && h.point[1] == p[1]) + return i; + } + return -1; + } + + function drawPointHighlight(series, point) { + var x = point[0], y = point[1], + axisx = series.xaxis, axisy = series.yaxis; + + if (x < axisx.min || x > axisx.max || y < axisy.min || y > axisy.max) + return; + + var pointRadius = series.points.radius + series.points.lineWidth / 2; + octx.lineWidth = pointRadius; + octx.strokeStyle = $.color.parse(series.color).scale('a', 0.5).toString(); + var radius = 1.5 * pointRadius, + x = axisx.p2c(x), + y = axisy.p2c(y); + + octx.beginPath(); + if (series.points.symbol == "circle") + octx.arc(x, y, radius, 0, 2 * Math.PI, false); + else + series.points.symbol(octx, x, y, radius, false); + octx.closePath(); + octx.stroke(); + } + + function drawBarHighlight(series, point) { + octx.lineWidth = series.bars.lineWidth; + octx.strokeStyle = $.color.parse(series.color).scale('a', 0.5).toString(); + var fillStyle = $.color.parse(series.color).scale('a', 0.5).toString(); + var barLeft = series.bars.align == "left" ? 0 : -series.bars.barWidth/2; + drawBar(point[0], point[1], point[2] || 0, barLeft, barLeft + series.bars.barWidth, + 0, function () { return fillStyle; }, series.xaxis, series.yaxis, octx, series.bars.horizontal, series.bars.lineWidth); + } + + function getColorOrGradient(spec, bottom, top, defaultColor) { + if (typeof spec == "string") + return spec; + else { + // assume this is a gradient spec; IE currently only + // supports a simple vertical gradient properly, so that's + // what we support too + var gradient = ctx.createLinearGradient(0, top, 0, bottom); + + for (var i = 0, l = spec.colors.length; i < l; ++i) { + var c = spec.colors[i]; + if (typeof c != "string") { + var co = $.color.parse(defaultColor); + if (c.brightness != null) + co = co.scale('rgb', c.brightness) + if (c.opacity != null) + co.a *= c.opacity; + c = co.toString(); + } + gradient.addColorStop(i / (l - 1), c); + } + + return gradient; + } + } + } + + $.plot = function(placeholder, data, options) { + //var t0 = new Date(); + var plot = new Plot($(placeholder), data, options, $.plot.plugins); + //(window.console ? console.log : alert)("time used (msecs): " + ((new Date()).getTime() - t0.getTime())); + return plot; + }; + + $.plot.version = "0.7"; + + $.plot.plugins = []; + + // returns a string with the date d formatted according to fmt + $.plot.formatDate = function(d, fmt, monthNames) { + var leftPad = function(n) { + n = "" + n; + return n.length == 1 ? "0" + n : n; + }; + + var r = []; + var escape = false, padNext = false; + var hours = d.getUTCHours(); + var isAM = hours < 12; + if (monthNames == null) + monthNames = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]; + + if (fmt.search(/%p|%P/) != -1) { + if (hours > 12) { + hours = hours - 12; + } else if (hours == 0) { + hours = 12; + } + } + for (var i = 0; i < fmt.length; ++i) { + var c = fmt.charAt(i); + + if (escape) { + switch (c) { + case 'h': c = "" + hours; break; + case 'H': c = leftPad(hours); break; + case 'M': c = leftPad(d.getUTCMinutes()); break; + case 'S': c = leftPad(d.getUTCSeconds()); break; + case 'd': c = "" + d.getUTCDate(); break; + case 'm': c = "" + (d.getUTCMonth() + 1); break; + case 'y': c = "" + d.getUTCFullYear(); break; + case 'b': c = "" + monthNames[d.getUTCMonth()]; break; + case 'p': c = (isAM) ? ("" + "am") : ("" + "pm"); break; + case 'P': c = (isAM) ? ("" + "AM") : ("" + "PM"); break; + case '0': c = ""; padNext = true; break; + } + if (c && padNext) { + c = leftPad(c); + padNext = false; + } + r.push(c); + if (!padNext) + escape = false; + } + else { + if (c == "%") + escape = true; + else + r.push(c); + } + } + return r.join(""); + }; + + // round to nearby lower multiple of base + function floorInBase(n, base) { + return base * Math.floor(n / base); + } + +})(jQuery); diff --git a/includes/jquery/flot/jquery.min.js b/includes/jquery/flot/jquery.min.js new file mode 100644 index 0000000000..6422523161 --- /dev/null +++ b/includes/jquery/flot/jquery.min.js @@ -0,0 +1,23 @@ +/* + * jQuery JavaScript Library v1.5.1 + * http://jquery.com/ + * + * Copyright 2011, John Resig + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * Copyright 2011, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * + * Date: Wed Feb 23 13:55:29 2011 -0500 + */ +(function(aY,H){var al=aY.document;var a=(function(){var bn=function(bI,bJ){return new bn.fn.init(bI,bJ,bl)},bD=aY.jQuery,bp=aY.$,bl,bH=/^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]+)$)/,bv=/\S/,br=/^\s+/,bm=/\s+$/,bq=/\d/,bj=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,bw=/^[\],:{}\s]*$/,bF=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,by=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,bs=/(?:^|:|,)(?:\s*\[)+/g,bh=/(webkit)[ \/]([\w.]+)/,bA=/(opera)(?:.*version)?[ \/]([\w.]+)/,bz=/(msie) ([\w.]+)/,bB=/(mozilla)(?:.*? rv:([\w.]+))?/,bG=navigator.userAgent,bE,bC=false,bk,e="then done fail isResolved isRejected promise".split(" "),bd,bu=Object.prototype.toString,bo=Object.prototype.hasOwnProperty,bi=Array.prototype.push,bt=Array.prototype.slice,bx=String.prototype.trim,be=Array.prototype.indexOf,bg={};bn.fn=bn.prototype={constructor:bn,init:function(bI,bM,bL){var bK,bN,bJ,bO;if(!bI){return this}if(bI.nodeType){this.context=this[0]=bI;this.length=1;return this}if(bI==="body"&&!bM&&al.body){this.context=al;this[0]=al.body;this.selector="body";this.length=1;return this}if(typeof bI==="string"){bK=bH.exec(bI);if(bK&&(bK[1]||!bM)){if(bK[1]){bM=bM instanceof bn?bM[0]:bM;bO=(bM?bM.ownerDocument||bM:al);bJ=bj.exec(bI);if(bJ){if(bn.isPlainObject(bM)){bI=[al.createElement(bJ[1])];bn.fn.attr.call(bI,bM,true)}else{bI=[bO.createElement(bJ[1])]}}else{bJ=bn.buildFragment([bK[1]],[bO]);bI=(bJ.cacheable?bn.clone(bJ.fragment):bJ.fragment).childNodes}return bn.merge(this,bI)}else{bN=al.getElementById(bK[2]);if(bN&&bN.parentNode){if(bN.id!==bK[2]){return bL.find(bI)}this.length=1;this[0]=bN}this.context=al;this.selector=bI;return this}}else{if(!bM||bM.jquery){return(bM||bL).find(bI)}else{return this.constructor(bM).find(bI)}}}else{if(bn.isFunction(bI)){return bL.ready(bI)}}if(bI.selector!==H){this.selector=bI.selector;this.context=bI.context}return bn.makeArray(bI,this)},selector:"",jquery:"1.5.1",length:0,size:function(){return this.length},toArray:function(){return bt.call(this,0)},get:function(bI){return bI==null?this.toArray():(bI<0?this[this.length+bI]:this[bI])},pushStack:function(bJ,bL,bI){var bK=this.constructor();if(bn.isArray(bJ)){bi.apply(bK,bJ)}else{bn.merge(bK,bJ)}bK.prevObject=this;bK.context=this.context;if(bL==="find"){bK.selector=this.selector+(this.selector?" ":"")+bI}else{if(bL){bK.selector=this.selector+"."+bL+"("+bI+")"}}return bK},each:function(bJ,bI){return bn.each(this,bJ,bI)},ready:function(bI){bn.bindReady();bk.done(bI);return this},eq:function(bI){return bI===-1?this.slice(bI):this.slice(bI,+bI+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(bt.apply(this,arguments),"slice",bt.call(arguments).join(","))},map:function(bI){return this.pushStack(bn.map(this,function(bK,bJ){return bI.call(bK,bJ,bK)}))},end:function(){return this.prevObject||this.constructor(null)},push:bi,sort:[].sort,splice:[].splice};bn.fn.init.prototype=bn.fn;bn.extend=bn.fn.extend=function(){var bR,bK,bI,bJ,bO,bP,bN=arguments[0]||{},bM=1,bL=arguments.length,bQ=false;if(typeof bN==="boolean"){bQ=bN;bN=arguments[1]||{};bM=2}if(typeof bN!=="object"&&!bn.isFunction(bN)){bN={}}if(bL===bM){bN=this;--bM}for(;bM0){return}bk.resolveWith(al,[bn]);if(bn.fn.trigger){bn(al).trigger("ready").unbind("ready")}}},bindReady:function(){if(bC){return}bC=true;if(al.readyState==="complete"){return setTimeout(bn.ready,1)}if(al.addEventListener){al.addEventListener("DOMContentLoaded",bd,false);aY.addEventListener("load",bn.ready,false)}else{if(al.attachEvent){al.attachEvent("onreadystatechange",bd);aY.attachEvent("onload",bn.ready);var bI=false;try{bI=aY.frameElement==null}catch(bJ){}if(al.documentElement.doScroll&&bI){bf()}}}},isFunction:function(bI){return bn.type(bI)==="function"},isArray:Array.isArray||function(bI){return bn.type(bI)==="array"},isWindow:function(bI){return bI&&typeof bI==="object"&&"setInterval" in bI},isNaN:function(bI){return bI==null||!bq.test(bI)||isNaN(bI)},type:function(bI){return bI==null?String(bI):bg[bu.call(bI)]||"object"},isPlainObject:function(bJ){if(!bJ||bn.type(bJ)!=="object"||bJ.nodeType||bn.isWindow(bJ)){return false}if(bJ.constructor&&!bo.call(bJ,"constructor")&&!bo.call(bJ.constructor.prototype,"isPrototypeOf")){return false}var bI;for(bI in bJ){}return bI===H||bo.call(bJ,bI)},isEmptyObject:function(bJ){for(var bI in bJ){return false}return true},error:function(bI){throw bI},parseJSON:function(bI){if(typeof bI!=="string"||!bI){return null}bI=bn.trim(bI);if(bw.test(bI.replace(bF,"@").replace(by,"]").replace(bs,""))){return aY.JSON&&aY.JSON.parse?aY.JSON.parse(bI):(new Function("return "+bI))()}else{bn.error("Invalid JSON: "+bI)}},parseXML:function(bK,bI,bJ){if(aY.DOMParser){bJ=new DOMParser();bI=bJ.parseFromString(bK,"text/xml")}else{bI=new ActiveXObject("Microsoft.XMLDOM");bI.async="false";bI.loadXML(bK)}bJ=bI.documentElement;if(!bJ||!bJ.nodeName||bJ.nodeName==="parsererror"){bn.error("Invalid XML: "+bK)}return bI},noop:function(){},globalEval:function(bK){if(bK&&bv.test(bK)){var bJ=al.head||al.getElementsByTagName("head")[0]||al.documentElement,bI=al.createElement("script");if(bn.support.scriptEval()){bI.appendChild(al.createTextNode(bK))}else{bI.text=bK}bJ.insertBefore(bI,bJ.firstChild);bJ.removeChild(bI)}},nodeName:function(bJ,bI){return bJ.nodeName&&bJ.nodeName.toUpperCase()===bI.toUpperCase()},each:function(bL,bP,bK){var bJ,bM=0,bN=bL.length,bI=bN===H||bn.isFunction(bL);if(bK){if(bI){for(bJ in bL){if(bP.apply(bL[bJ],bK)===false){break}}}else{for(;bM1){var bN=bt.call(arguments,0),bL=bO,bK=function(bP){return function(bQ){bN[bP]=arguments.length>1?bt.call(arguments,0):bQ;if(!(--bL)){bI.resolveWith(bM,bN)}}};while((bO--)){bJ=bN[bO];if(bJ&&bn.isFunction(bJ.promise)){bJ.promise().then(bK(bO),bI.reject)}else{--bL}}if(!bL){bI.resolveWith(bM,bN)}}else{if(bI!==bJ){bI.resolve(bJ)}}return bM},uaMatch:function(bJ){bJ=bJ.toLowerCase();var bI=bh.exec(bJ)||bA.exec(bJ)||bz.exec(bJ)||bJ.indexOf("compatible")<0&&bB.exec(bJ)||[];return{browser:bI[1]||"",version:bI[2]||"0"}},sub:function(){function bJ(bL,bM){return new bJ.fn.init(bL,bM)}bn.extend(true,bJ,this);bJ.superclass=this;bJ.fn=bJ.prototype=this();bJ.fn.constructor=bJ;bJ.subclass=this.subclass;bJ.fn.init=function bK(bL,bM){if(bM&&bM instanceof bn&&!(bM instanceof bJ)){bM=bJ(bM)}return bn.fn.init.call(this,bL,bM,bI)};bJ.fn.init.prototype=bJ.fn;var bI=bJ(al);return bJ},browser:{}});bk=bn._Deferred();bn.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(bJ,bI){bg["[object "+bI+"]"]=bI.toLowerCase()});bE=bn.uaMatch(bG);if(bE.browser){bn.browser[bE.browser]=true;bn.browser.version=bE.version}if(bn.browser.webkit){bn.browser.safari=true}if(be){bn.inArray=function(bI,bJ){return be.call(bJ,bI)}}if(bv.test("\xA0")){br=/^[\s\xA0]+/;bm=/[\s\xA0]+$/}bl=bn(al);if(al.addEventListener){bd=function(){al.removeEventListener("DOMContentLoaded",bd,false);bn.ready()}}else{if(al.attachEvent){bd=function(){if(al.readyState==="complete"){al.detachEvent("onreadystatechange",bd);bn.ready()}}}}function bf(){if(bn.isReady){return}try{al.documentElement.doScroll("left")}catch(bI){setTimeout(bf,1);return}bn.ready()}return bn})();(function(){a.support={};var bd=al.createElement("div");bd.style.display="none";bd.innerHTML="
      a";var bm=bd.getElementsByTagName("*"),bk=bd.getElementsByTagName("a")[0],bl=al.createElement("select"),be=bl.appendChild(al.createElement("option")),bj=bd.getElementsByTagName("input")[0];if(!bm||!bm.length||!bk){return}a.support={leadingWhitespace:bd.firstChild.nodeType===3,tbody:!bd.getElementsByTagName("tbody").length,htmlSerialize:!!bd.getElementsByTagName("link").length,style:/red/.test(bk.getAttribute("style")),hrefNormalized:bk.getAttribute("href")==="/a",opacity:/^0.55$/.test(bk.style.opacity),cssFloat:!!bk.style.cssFloat,checkOn:bj.value==="on",optSelected:be.selected,deleteExpando:true,optDisabled:false,checkClone:false,noCloneEvent:true,noCloneChecked:true,boxModel:null,inlineBlockNeedsLayout:false,shrinkWrapBlocks:false,reliableHiddenOffsets:true};bj.checked=true;a.support.noCloneChecked=bj.cloneNode(true).checked;bl.disabled=true;a.support.optDisabled=!be.disabled;var bf=null;a.support.scriptEval=function(){if(bf===null){var bo=al.documentElement,bp=al.createElement("script"),br="script"+a.now();try{bp.appendChild(al.createTextNode("window."+br+"=1;"))}catch(bq){}bo.insertBefore(bp,bo.firstChild);if(aY[br]){bf=true;delete aY[br]}else{bf=false}bo.removeChild(bp);bo=bp=br=null}return bf};try{delete bd.test}catch(bh){a.support.deleteExpando=false}if(!bd.addEventListener&&bd.attachEvent&&bd.fireEvent){bd.attachEvent("onclick",function bn(){a.support.noCloneEvent=false;bd.detachEvent("onclick",bn)});bd.cloneNode(true).fireEvent("onclick")}bd=al.createElement("div");bd.innerHTML="";var bg=al.createDocumentFragment();bg.appendChild(bd.firstChild);a.support.checkClone=bg.cloneNode(true).cloneNode(true).lastChild.checked;a(function(){var bp=al.createElement("div"),e=al.getElementsByTagName("body")[0];if(!e){return}bp.style.width=bp.style.paddingLeft="1px";e.appendChild(bp);a.boxModel=a.support.boxModel=bp.offsetWidth===2;if("zoom" in bp.style){bp.style.display="inline";bp.style.zoom=1;a.support.inlineBlockNeedsLayout=bp.offsetWidth===2;bp.style.display="";bp.innerHTML="
      ";a.support.shrinkWrapBlocks=bp.offsetWidth!==2}bp.innerHTML="
      t
      ";var bo=bp.getElementsByTagName("td");a.support.reliableHiddenOffsets=bo[0].offsetHeight===0;bo[0].style.display="";bo[1].style.display="none";a.support.reliableHiddenOffsets=a.support.reliableHiddenOffsets&&bo[0].offsetHeight===0;bp.innerHTML="";e.removeChild(bp).style.display="none";bp=bo=null});var bi=function(e){var bp=al.createElement("div");e="on"+e;if(!bp.attachEvent){return true}var bo=(e in bp);if(!bo){bp.setAttribute(e,"return;");bo=typeof bp[e]==="function"}bp=null;return bo};a.support.submitBubbles=bi("submit");a.support.changeBubbles=bi("change");bd=bm=bk=null})();var aE=/^(?:\{.*\}|\[.*\])$/;a.extend({cache:{},uuid:0,expando:"jQuery"+(a.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:true,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:true},hasData:function(e){e=e.nodeType?a.cache[e[a.expando]]:e[a.expando];return !!e&&!P(e)},data:function(bf,bd,bh,bg){if(!a.acceptData(bf)){return}var bk=a.expando,bj=typeof bd==="string",bi,bl=bf.nodeType,e=bl?a.cache:bf,be=bl?bf[a.expando]:bf[a.expando]&&a.expando;if((!be||(bg&&be&&!e[be][bk]))&&bj&&bh===H){return}if(!be){if(bl){bf[a.expando]=be=++a.uuid}else{be=a.expando}}if(!e[be]){e[be]={};if(!bl){e[be].toJSON=a.noop}}if(typeof bd==="object"||typeof bd==="function"){if(bg){e[be][bk]=a.extend(e[be][bk],bd)}else{e[be]=a.extend(e[be],bd)}}bi=e[be];if(bg){if(!bi[bk]){bi[bk]={}}bi=bi[bk]}if(bh!==H){bi[bd]=bh}if(bd==="events"&&!bi[bd]){return bi[bk]&&bi[bk].events}return bj?bi[bd]:bi},removeData:function(bg,be,bh){if(!a.acceptData(bg)){return}var bj=a.expando,bk=bg.nodeType,bd=bk?a.cache:bg,bf=bk?bg[a.expando]:a.expando;if(!bd[bf]){return}if(be){var bi=bh?bd[bf][bj]:bd[bf];if(bi){delete bi[be];if(!P(bi)){return}}}if(bh){delete bd[bf][bj];if(!P(bd[bf])){return}}var e=bd[bf][bj];if(a.support.deleteExpando||bd!=aY){delete bd[bf]}else{bd[bf]=null}if(e){bd[bf]={};if(!bk){bd[bf].toJSON=a.noop}bd[bf][bj]=e}else{if(bk){if(a.support.deleteExpando){delete bg[a.expando]}else{if(bg.removeAttribute){bg.removeAttribute(a.expando)}else{bg[a.expando]=null}}}}},_data:function(bd,e,be){return a.data(bd,e,be,true)},acceptData:function(bd){if(bd.nodeName){var e=a.noData[bd.nodeName.toLowerCase()];if(e){return !(e===true||bd.getAttribute("classid")!==e)}}return true}});a.fn.extend({data:function(bg,bi){var bh=null;if(typeof bg==="undefined"){if(this.length){bh=a.data(this[0]);if(this[0].nodeType===1){var e=this[0].attributes,be;for(var bf=0,bd=e.length;bf-1){return true}}return false},val:function(bk){if(!arguments.length){var be=this[0];if(be){if(a.nodeName(be,"option")){var bd=be.attributes.value;return !bd||bd.specified?be.value:be.text}if(a.nodeName(be,"select")){var bi=be.selectedIndex,bl=[],bm=be.options,bh=be.type==="select-one";if(bi<0){return null}for(var bf=bh?bi:0,bj=bh?bi+1:bm.length;bf=0}else{if(a.nodeName(this,"select")){var bn=a.makeArray(bq);a("option",this).each(function(){this.selected=a.inArray(a(this).val(),bn)>=0});if(!bn.length){this.selectedIndex=-1}}else{this.value=bq}}})}});a.extend({attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},attr:function(bd,e,bi,bl){if(!bd||bd.nodeType===3||bd.nodeType===8||bd.nodeType===2){return H}if(bl&&e in a.attrFn){return a(bd)[e](bi)}var be=bd.nodeType!==1||!a.isXMLDoc(bd),bh=bi!==H;e=be&&a.props[e]||e;if(bd.nodeType===1){var bg=a2.test(e);if(e==="selected"&&!a.support.optSelected){var bj=bd.parentNode;if(bj){bj.selectedIndex;if(bj.parentNode){bj.parentNode.selectedIndex}}}if((e in bd||bd[e]!==H)&&be&&!bg){if(bh){if(e==="type"&&f.test(bd.nodeName)&&bd.parentNode){a.error("type property can't be changed")}if(bi===null){if(bd.nodeType===1){bd.removeAttribute(e)}}else{bd[e]=bi}}if(a.nodeName(bd,"form")&&bd.getAttributeNode(e)){return bd.getAttributeNode(e).nodeValue}if(e==="tabIndex"){var bk=bd.getAttributeNode("tabIndex");return bk&&bk.specified?bk.value:C.test(bd.nodeName)||k.test(bd.nodeName)&&bd.href?0:H}return bd[e]}if(!a.support.style&&be&&e==="style"){if(bh){bd.style.cssText=""+bi}return bd.style.cssText}if(bh){bd.setAttribute(e,""+bi)}if(!bd.attributes[e]&&(bd.hasAttribute&&!bd.hasAttribute(e))){return H}var bf=!a.support.hrefNormalized&&be&&bg?bd.getAttribute(e,2):bd.getAttribute(e);return bf===null?H:bf}if(bh){bd[e]=bi}return bd[e]}});var aP=/\.(.*)$/,a0=/^(?:textarea|input|select)$/i,K=/\./g,aa=/ /g,aw=/[^\w\s.|`]/g,E=function(e){return e.replace(aw,"\\$&")};a.event={add:function(bg,bk,br,bi){if(bg.nodeType===3||bg.nodeType===8){return}try{if(a.isWindow(bg)&&(bg!==aY&&!bg.frameElement)){bg=aY}}catch(bl){}if(br===false){br=a5}else{if(!br){return}}var be,bp;if(br.handler){be=br;br=be.handler}if(!br.guid){br.guid=a.guid++}var bm=a._data(bg);if(!bm){return}var bq=bm.events,bj=bm.handle;if(!bq){bm.events=bq={}}if(!bj){bm.handle=bj=function(){return typeof a!=="undefined"&&!a.event.triggered?a.event.handle.apply(bj.elem,arguments):H}}bj.elem=bg;bk=bk.split(" ");var bo,bh=0,bd;while((bo=bk[bh++])){bp=be?a.extend({},be):{handler:br,data:bi};if(bo.indexOf(".")>-1){bd=bo.split(".");bo=bd.shift();bp.namespace=bd.slice(0).sort().join(".")}else{bd=[];bp.namespace=""}bp.type=bo;if(!bp.guid){bp.guid=br.guid}var bf=bq[bo],bn=a.event.special[bo]||{};if(!bf){bf=bq[bo]=[];if(!bn.setup||bn.setup.call(bg,bi,bd,bj)===false){if(bg.addEventListener){bg.addEventListener(bo,bj,false)}else{if(bg.attachEvent){bg.attachEvent("on"+bo,bj)}}}}if(bn.add){bn.add.call(bg,bp);if(!bp.handler.guid){bp.handler.guid=br.guid}}bf.push(bp);a.event.global[bo]=true}bg=null},global:{},remove:function(br,bm,be,bi){if(br.nodeType===3||br.nodeType===8){return}if(be===false){be=a5}var bu,bh,bj,bo,bp=0,bf,bk,bn,bg,bl,e,bt,bq=a.hasData(br)&&a._data(br),bd=bq&&bq.events;if(!bq||!bd){return}if(bm&&bm.type){be=bm.handler;bm=bm.type}if(!bm||typeof bm==="string"&&bm.charAt(0)==="."){bm=bm||"";for(bh in bd){a.event.remove(br,bh+bm)}return}bm=bm.split(" ");while((bh=bm[bp++])){bt=bh;e=null;bf=bh.indexOf(".")<0;bk=[];if(!bf){bk=bh.split(".");bh=bk.shift();bn=new RegExp("(^|\\.)"+a.map(bk.slice(0).sort(),E).join("\\.(?:.*\\.)?")+"(\\.|$)")}bl=bd[bh];if(!bl){continue}if(!be){for(bo=0;bo=0){bd.type=bm=bm.slice(0,-1);bd.exclusive=true}if(!bf){bd.stopPropagation();if(a.event.global[bm]){a.each(a.cache,function(){var br=a.expando,bq=this[br];if(bq&&bq.events&&bq.events[bm]){a.event.trigger(bd,bi,bq.handle.elem)}})}}if(!bf||bf.nodeType===3||bf.nodeType===8){return H}bd.result=H;bd.target=bf;bi=a.makeArray(bi);bi.unshift(bd)}bd.currentTarget=bf;var bj=a._data(bf,"handle");if(bj){bj.apply(bf,bi)}var bo=bf.parentNode||bf.ownerDocument;try{if(!(bf&&bf.nodeName&&a.noData[bf.nodeName.toLowerCase()])){if(bf["on"+bm]&&bf["on"+bm].apply(bf,bi)===false){bd.result=false;bd.preventDefault()}}}catch(bn){}if(!bd.isPropagationStopped()&&bo){a.event.trigger(bd,bi,bo,true)}else{if(!bd.isDefaultPrevented()){var be,bk=bd.target,e=bm.replace(aP,""),bp=a.nodeName(bk,"a")&&e==="click",bl=a.event.special[e]||{};if((!bl._default||bl._default.call(bf,bd)===false)&&!bp&&!(bk&&bk.nodeName&&a.noData[bk.nodeName.toLowerCase()])){try{if(bk[e]){be=bk["on"+e];if(be){bk["on"+e]=null}a.event.triggered=true;bk[e]()}}catch(bg){}if(be){bk["on"+e]=be}a.event.triggered=false}}}},handle:function(e){var bl,be,bd,bn,bm,bh=[],bj=a.makeArray(arguments);e=bj[0]=a.event.fix(e||aY.event);e.currentTarget=this;bl=e.type.indexOf(".")<0&&!e.exclusive;if(!bl){bd=e.type.split(".");e.type=bd.shift();bh=bd.slice(0).sort();bn=new RegExp("(^|\\.)"+bh.join("\\.(?:.*\\.)?")+"(\\.|$)")}e.namespace=e.namespace||bh.join(".");bm=a._data(this,"events");be=(bm||{})[e.type];if(bm&&be){be=be.slice(0);for(var bg=0,bf=be.length;bg-1?a.map(bd.options,function(bf){return bf.selected}).join("-"):""}else{if(bd.nodeName.toLowerCase()==="select"){be=bd.selectedIndex}}}return be},X=function X(bf){var bd=bf.target,be,bg;if(!a0.test(bd.nodeName)||bd.readOnly){return}be=a._data(bd,"_change_data");bg=j(bd);if(bf.type!=="focusout"||bd.type!=="radio"){a._data(bd,"_change_data",bg)}if(be===H||bg===be){return}if(be!=null||bg){bf.type="change";bf.liveFired=H;a.event.trigger(bf,arguments[1],bd)}};a.event.special.change={filters:{focusout:X,beforedeactivate:X,click:function(bf){var be=bf.target,bd=be.type;if(bd==="radio"||bd==="checkbox"||be.nodeName.toLowerCase()==="select"){X.call(this,bf)}},keydown:function(bf){var be=bf.target,bd=be.type;if((bf.keyCode===13&&be.nodeName.toLowerCase()!=="textarea")||(bf.keyCode===32&&(bd==="checkbox"||bd==="radio"))||bd==="select-multiple"){X.call(this,bf)}},beforeactivate:function(be){var bd=be.target;a._data(bd,"_change_data",j(bd))}},setup:function(be,bd){if(this.type==="file"){return false}for(var e in a6){a.event.add(this,e+".specialChange",a6[e])}return a0.test(this.nodeName)},teardown:function(e){a.event.remove(this,".specialChange");return a0.test(this.nodeName)}};a6=a.event.special.change.filters;a6.focus=a6.beforeactivate}function aN(bd,bf,e){var be=a.extend({},e[0]);be.type=bd;be.originalEvent={};be.liveFired=H;a.event.handle.call(bf,be);if(be.isDefaultPrevented()){e[0].preventDefault()}}if(al.addEventListener){a.each({focus:"focusin",blur:"focusout"},function(be,e){a.event.special[e]={setup:function(){this.addEventListener(be,bd,true)},teardown:function(){this.removeEventListener(be,bd,true)}};function bd(bf){bf=a.event.fix(bf);bf.type=e;return a.event.handle.call(this,bf)}})}a.each(["bind","one"],function(bd,e){a.fn[e]=function(bj,bk,bi){if(typeof bj==="object"){for(var bg in bj){this[e](bg,bk,bj[bg],bi)}return this}if(a.isFunction(bk)||bk===false){bi=bk;bk=H}var bh=e==="one"?a.proxy(bi,function(bl){a(this).unbind(bl,bh);return bi.apply(this,arguments)}):bi;if(bj==="unload"&&e!=="one"){this.one(bj,bk,bi)}else{for(var bf=0,be=this.length;bfbf){break}bn.currentTarget=bh.elem;bn.data=bh.handleObj.data;bn.handleObj=bh.handleObj;br=bh.handleObj.origHandler.apply(bh.elem,arguments);if(br===false||bn.isPropagationStopped()){bf=bh.level;if(br===false){bk=false}if(bn.isImmediatePropagationStopped()){break}}}return bk}function n(bd,e){return(bd&&bd!=="*"?bd+".":"")+e.replace(K,"`").replace(aa,"&")}a.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").split(" "),function(bd,e){a.fn[e]=function(bf,be){if(be==null){be=bf;bf=null}return arguments.length>0?this.bind(e,bf,be):this.trigger(e)};if(a.attrFn){a.attrFn[e]=true}}); +/* + * Sizzle CSS Selector Engine + * Copyright 2011, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * More information: http://sizzlejs.com/ + */ +(function(){var bn=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,bo=0,br=Object.prototype.toString,bi=false,bh=true,bp=/\\/g,bv=/\W/;[0,0].sort(function(){bh=false;return 0});var bf=function(bA,e,bD,bE){bD=bD||[];e=e||al;var bG=e;if(e.nodeType!==1&&e.nodeType!==9){return[]}if(!bA||typeof bA!=="string"){return bD}var bx,bI,bL,bw,bH,bK,bJ,bC,bz=true,by=bf.isXML(e),bB=[],bF=bA;do{bn.exec("");bx=bn.exec(bF);if(bx){bF=bx[3];bB.push(bx[1]);if(bx[2]){bw=bx[3];break}}}while(bx);if(bB.length>1&&bj.exec(bA)){if(bB.length===2&&bk.relative[bB[0]]){bI=bs(bB[0]+bB[1],e)}else{bI=bk.relative[bB[0]]?[e]:bf(bB.shift(),e);while(bB.length){bA=bB.shift();if(bk.relative[bA]){bA+=bB.shift()}bI=bs(bA,bI)}}}else{if(!bE&&bB.length>1&&e.nodeType===9&&!by&&bk.match.ID.test(bB[0])&&!bk.match.ID.test(bB[bB.length-1])){bH=bf.find(bB.shift(),e,by);e=bH.expr?bf.filter(bH.expr,bH.set)[0]:bH.set[0]}if(e){bH=bE?{expr:bB.pop(),set:bl(bE)}:bf.find(bB.pop(),bB.length===1&&(bB[0]==="~"||bB[0]==="+")&&e.parentNode?e.parentNode:e,by);bI=bH.expr?bf.filter(bH.expr,bH.set):bH.set;if(bB.length>0){bL=bl(bI)}else{bz=false}while(bB.length){bK=bB.pop();bJ=bK;if(!bk.relative[bK]){bK=""}else{bJ=bB.pop()}if(bJ==null){bJ=e}bk.relative[bK](bL,bJ,by)}}else{bL=bB=[]}}if(!bL){bL=bI}if(!bL){bf.error(bK||bA)}if(br.call(bL)==="[object Array]"){if(!bz){bD.push.apply(bD,bL)}else{if(e&&e.nodeType===1){for(bC=0;bL[bC]!=null;bC++){if(bL[bC]&&(bL[bC]===true||bL[bC].nodeType===1&&bf.contains(e,bL[bC]))){bD.push(bI[bC])}}}else{for(bC=0;bL[bC]!=null;bC++){if(bL[bC]&&bL[bC].nodeType===1){bD.push(bI[bC])}}}}}else{bl(bL,bD)}if(bw){bf(bw,bG,bD,bE);bf.uniqueSort(bD)}return bD};bf.uniqueSort=function(bw){if(bq){bi=bh;bw.sort(bq);if(bi){for(var e=1;e0};bf.find=function(bC,e,bD){var bB;if(!bC){return[]}for(var by=0,bx=bk.order.length;by":function(bB,bw){var bA,bz=typeof bw==="string",bx=0,e=bB.length;if(bz&&!bv.test(bw)){bw=bw.toLowerCase();for(;bx=0)){if(!bx){e.push(bA)}}else{if(bx){bw[bz]=false}}}}return false},ID:function(e){return e[1].replace(bp,"")},TAG:function(bw,e){return bw[1].replace(bp,"").toLowerCase()},CHILD:function(e){if(e[1]==="nth"){if(!e[2]){bf.error(e[0])}e[2]=e[2].replace(/^\+|\s*/g,"");var bw=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(e[2]==="even"&&"2n"||e[2]==="odd"&&"2n+1"||!/\D/.test(e[2])&&"0n+"+e[2]||e[2]);e[2]=(bw[1]+(bw[2]||1))-0;e[3]=bw[3]-0}else{if(e[2]){bf.error(e[0])}}e[0]=bo++;return e},ATTR:function(bz,bw,bx,e,bA,bB){var by=bz[1]=bz[1].replace(bp,"");if(!bB&&bk.attrMap[by]){bz[1]=bk.attrMap[by]}bz[4]=(bz[4]||bz[5]||"").replace(bp,"");if(bz[2]==="~="){bz[4]=" "+bz[4]+" "}return bz},PSEUDO:function(bz,bw,bx,e,bA){if(bz[1]==="not"){if((bn.exec(bz[3])||"").length>1||/^\w/.test(bz[3])){bz[3]=bf(bz[3],null,null,bw)}else{var by=bf.filter(bz[3],bw,bx,true^bA);if(!bx){e.push.apply(e,by)}return false}}else{if(bk.match.POS.test(bz[0])||bk.match.CHILD.test(bz[0])){return true}}return bz},POS:function(e){e.unshift(true);return e}},filters:{enabled:function(e){return e.disabled===false&&e.type!=="hidden"},disabled:function(e){return e.disabled===true},checked:function(e){return e.checked===true},selected:function(e){if(e.parentNode){e.parentNode.selectedIndex}return e.selected===true},parent:function(e){return !!e.firstChild},empty:function(e){return !e.firstChild},has:function(bx,bw,e){return !!bf(e[3],bx).length},header:function(e){return(/h\d/i).test(e.nodeName)},text:function(e){return"text"===e.getAttribute("type")},radio:function(e){return"radio"===e.type},checkbox:function(e){return"checkbox"===e.type},file:function(e){return"file"===e.type},password:function(e){return"password"===e.type},submit:function(e){return"submit"===e.type},image:function(e){return"image"===e.type},reset:function(e){return"reset"===e.type},button:function(e){return"button"===e.type||e.nodeName.toLowerCase()==="button"},input:function(e){return(/input|select|textarea|button/i).test(e.nodeName)}},setFilters:{first:function(bw,e){return e===0},last:function(bx,bw,e,by){return bw===by.length-1},even:function(bw,e){return e%2===0},odd:function(bw,e){return e%2===1},lt:function(bx,bw,e){return bwe[3]-0},nth:function(bx,bw,e){return e[3]-0===bw},eq:function(bx,bw,e){return e[3]-0===bw}},filter:{PSEUDO:function(bx,bC,bB,bD){var e=bC[1],bw=bk.filters[e];if(bw){return bw(bx,bB,bC,bD)}else{if(e==="contains"){return(bx.textContent||bx.innerText||bf.getText([bx])||"").indexOf(bC[3])>=0}else{if(e==="not"){var by=bC[3];for(var bA=0,bz=by.length;bA=0)}}},ID:function(bw,e){return bw.nodeType===1&&bw.getAttribute("id")===e},TAG:function(bw,e){return(e==="*"&&bw.nodeType===1)||bw.nodeName.toLowerCase()===e},CLASS:function(bw,e){return(" "+(bw.className||bw.getAttribute("class"))+" ").indexOf(e)>-1},ATTR:function(bA,by){var bx=by[1],e=bk.attrHandle[bx]?bk.attrHandle[bx](bA):bA[bx]!=null?bA[bx]:bA.getAttribute(bx),bB=e+"",bz=by[2],bw=by[4];return e==null?bz==="!=":bz==="="?bB===bw:bz==="*="?bB.indexOf(bw)>=0:bz==="~="?(" "+bB+" ").indexOf(bw)>=0:!bw?bB&&e!==false:bz==="!="?bB!==bw:bz==="^="?bB.indexOf(bw)===0:bz==="$="?bB.substr(bB.length-bw.length)===bw:bz==="|="?bB===bw||bB.substr(0,bw.length+1)===bw+"-":false},POS:function(bz,bw,bx,bA){var e=bw[2],by=bk.setFilters[e];if(by){return by(bz,bx,bw,bA)}}}};var bj=bk.match.POS,be=function(bw,e){return"\\"+(e-0+1)};for(var bg in bk.match){bk.match[bg]=new RegExp(bk.match[bg].source+(/(?![^\[]*\])(?![^\(]*\))/.source));bk.leftMatch[bg]=new RegExp(/(^(?:.|\r|\n)*?)/.source+bk.match[bg].source.replace(/\\(\d+)/g,be))}var bl=function(bw,e){bw=Array.prototype.slice.call(bw,0);if(e){e.push.apply(e,bw);return e}return bw};try{Array.prototype.slice.call(al.documentElement.childNodes,0)[0].nodeType}catch(bu){bl=function(bz,by){var bx=0,bw=by||[];if(br.call(bz)==="[object Array]"){Array.prototype.push.apply(bw,bz)}else{if(typeof bz.length==="number"){for(var e=bz.length;bx";e.insertBefore(bw,e.firstChild);if(al.getElementById(bx)){bk.find.ID=function(bz,bA,bB){if(typeof bA.getElementById!=="undefined"&&!bB){var by=bA.getElementById(bz[1]);return by?by.id===bz[1]||typeof by.getAttributeNode!=="undefined"&&by.getAttributeNode("id").nodeValue===bz[1]?[by]:H:[]}};bk.filter.ID=function(bA,by){var bz=typeof bA.getAttributeNode!=="undefined"&&bA.getAttributeNode("id");return bA.nodeType===1&&bz&&bz.nodeValue===by}}e.removeChild(bw);e=bw=null})();(function(){var e=al.createElement("div");e.appendChild(al.createComment(""));if(e.getElementsByTagName("*").length>0){bk.find.TAG=function(bw,bA){var bz=bA.getElementsByTagName(bw[1]);if(bw[1]==="*"){var by=[];for(var bx=0;bz[bx];bx++){if(bz[bx].nodeType===1){by.push(bz[bx])}}bz=by}return bz}}e.innerHTML="";if(e.firstChild&&typeof e.firstChild.getAttribute!=="undefined"&&e.firstChild.getAttribute("href")!=="#"){bk.attrHandle.href=function(bw){return bw.getAttribute("href",2)}}e=null})();if(al.querySelectorAll){(function(){var e=bf,by=al.createElement("div"),bx="__sizzle__";by.innerHTML="

      ";if(by.querySelectorAll&&by.querySelectorAll(".TEST").length===0){return}bf=function(bJ,bA,bE,bI){bA=bA||al;if(!bI&&!bf.isXML(bA)){var bH=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(bJ);if(bH&&(bA.nodeType===1||bA.nodeType===9)){if(bH[1]){return bl(bA.getElementsByTagName(bJ),bE)}else{if(bH[2]&&bk.find.CLASS&&bA.getElementsByClassName){return bl(bA.getElementsByClassName(bH[2]),bE)}}}if(bA.nodeType===9){if(bJ==="body"&&bA.body){return bl([bA.body],bE)}else{if(bH&&bH[3]){var bD=bA.getElementById(bH[3]);if(bD&&bD.parentNode){if(bD.id===bH[3]){return bl([bD],bE)}}else{return bl([],bE)}}}try{return bl(bA.querySelectorAll(bJ),bE)}catch(bF){}}else{if(bA.nodeType===1&&bA.nodeName.toLowerCase()!=="object"){var bB=bA,bC=bA.getAttribute("id"),bz=bC||bx,bL=bA.parentNode,bK=/^\s*[+~]/.test(bJ);if(!bC){bA.setAttribute("id",bz)}else{bz=bz.replace(/'/g,"\\$&")}if(bK&&bL){bA=bA.parentNode}try{if(!bK||bL){return bl(bA.querySelectorAll("[id='"+bz+"'] "+bJ),bE)}}catch(bG){}finally{if(!bC){bB.removeAttribute("id")}}}}}return e(bJ,bA,bE,bI)};for(var bw in e){bf[bw]=e[bw]}by=null})()}(function(){var e=al.documentElement,bx=e.matchesSelector||e.mozMatchesSelector||e.webkitMatchesSelector||e.msMatchesSelector,bw=false;try{bx.call(al.documentElement,"[test!='']:sizzle")}catch(by){bw=true}if(bx){bf.matchesSelector=function(bz,bB){bB=bB.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!bf.isXML(bz)){try{if(bw||!bk.match.PSEUDO.test(bB)&&!/!=/.test(bB)){return bx.call(bz,bB)}}catch(bA){}}return bf(bB,null,null,[bz]).length>0}}})();(function(){var e=al.createElement("div");e.innerHTML="
      ";if(!e.getElementsByClassName||e.getElementsByClassName("e").length===0){return}e.lastChild.className="e";if(e.getElementsByClassName("e").length===1){return}bk.order.splice(1,0,"CLASS");bk.find.CLASS=function(bw,bx,by){if(typeof bx.getElementsByClassName!=="undefined"&&!by){return bx.getElementsByClassName(bw[1])}};e=null})();function bd(bw,bB,bA,bE,bC,bD){for(var by=0,bx=bE.length;by0){bz=e;break}}}e=e[bw]}bE[by]=bz}}}if(al.documentElement.contains){bf.contains=function(bw,e){return bw!==e&&(bw.contains?bw.contains(e):true)}}else{if(al.documentElement.compareDocumentPosition){bf.contains=function(bw,e){return !!(bw.compareDocumentPosition(e)&16)}}else{bf.contains=function(){return false}}}bf.isXML=function(e){var bw=(e?e.ownerDocument||e:0).documentElement;return bw?bw.nodeName!=="HTML":false};var bs=function(e,bC){var bA,by=[],bz="",bx=bC.nodeType?[bC]:bC;while((bA=bk.match.PSEUDO.exec(e))){bz+=bA[0];e=e.replace(bk.match.PSEUDO,"")}e=bk.relative[e]?e+"*":e;for(var bB=0,bw=bx.length;bB0){for(var bi=bh;bi0},closest:function(bm,bd){var bj=[],bg,be,bl=this[0];if(a.isArray(bm)){var bi,bf,bh={},e=1;if(bl&&bm.length){for(bg=0,be=bm.length;bg-1:a(bl).is(bi)){bj.push({selector:bf,elem:bl,level:e})}}bl=bl.parentNode;e++}}return bj}var bk=F.test(bm)?a(bm,bd||this.context):null;for(bg=0,be=this.length;bg-1:a.find.matchesSelector(bl,bm)){bj.push(bl);break}else{bl=bl.parentNode;if(!bl||!bl.ownerDocument||bl===bd){break}}}}bj=bj.length>1?a.unique(bj):bj;return this.pushStack(bj,"closest",bm)},index:function(e){if(!e||typeof e==="string"){return a.inArray(this[0],e?a(e):this.parent().children())}return a.inArray(e.jquery?e[0]:e,this)},add:function(e,bd){var bf=typeof e==="string"?a(e,bd):a.makeArray(e),be=a.merge(this.get(),bf);return this.pushStack(B(bf[0])||B(be[0])?be:a.unique(be))},andSelf:function(){return this.add(this.prevObject)}});function B(e){return !e||!e.parentNode||e.parentNode.nodeType===11}a.each({parent:function(bd){var e=bd.parentNode;return e&&e.nodeType!==11?e:null},parents:function(e){return a.dir(e,"parentNode")},parentsUntil:function(bd,e,be){return a.dir(bd,"parentNode",be)},next:function(e){return a.nth(e,2,"nextSibling")},prev:function(e){return a.nth(e,2,"previousSibling")},nextAll:function(e){return a.dir(e,"nextSibling")},prevAll:function(e){return a.dir(e,"previousSibling")},nextUntil:function(bd,e,be){return a.dir(bd,"nextSibling",be)},prevUntil:function(bd,e,be){return a.dir(bd,"previousSibling",be)},siblings:function(e){return a.sibling(e.parentNode.firstChild,e)},children:function(e){return a.sibling(e.firstChild)},contents:function(e){return a.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:a.makeArray(e.childNodes)}},function(e,bd){a.fn[e]=function(bh,be){var bg=a.map(this,bd,bh),bf=M.call(arguments);if(!W.test(e)){be=bh}if(be&&typeof be==="string"){bg=a.filter(be,bg)}bg=this.length>1&&!ao[e]?a.unique(bg):bg;if((this.length>1||aW.test(be))&&ai.test(e)){bg=bg.reverse()}return this.pushStack(bg,e,bf.join(","))}});a.extend({filter:function(be,e,bd){if(bd){be=":not("+be+")"}return e.length===1?a.find.matchesSelector(e[0],be)?[e[0]]:[]:a.find.matches(be,e)},dir:function(be,bd,bg){var e=[],bf=be[bd];while(bf&&bf.nodeType!==9&&(bg===H||bf.nodeType!==1||!a(bf).is(bg))){if(bf.nodeType===1){e.push(bf)}bf=bf[bd]}return e},nth:function(bg,e,be,bf){e=e||1;var bd=0;for(;bg;bg=bg[be]){if(bg.nodeType===1&&++bd===e){break}}return bg},sibling:function(be,bd){var e=[];for(;be;be=be.nextSibling){if(be.nodeType===1&&be!==bd){e.push(be)}}return e}});function av(bf,be,e){if(a.isFunction(be)){return a.grep(bf,function(bh,bg){var bi=!!be.call(bh,bg,bh);return bi===e})}else{if(be.nodeType){return a.grep(bf,function(bh,bg){return(bh===be)===e})}else{if(typeof be==="string"){var bd=a.grep(bf,function(bg){return bg.nodeType===1});if(a9.test(be)){return a.filter(be,bd,!e)}else{be=a.filter(be,bd)}}}}return a.grep(bf,function(bh,bg){return(a.inArray(bh,be)>=0)===e})}var ab=/ jQuery\d+="(?:\d+|null)"/g,aj=/^\s+/,O=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,c=/<([\w:]+)/,v=/",""],legend:[1,"
      ","
      "],thead:[1,"","
      "],tr:[2,"","
      "],td:[3,"","
      "],col:[2,"","
      "],area:[1,"",""],_default:[0,"",""]};an.optgroup=an.option;an.tbody=an.tfoot=an.colgroup=an.caption=an.thead;an.th=an.td;if(!a.support.htmlSerialize){an._default=[1,"div
      ","
      "]}a.fn.extend({text:function(e){if(a.isFunction(e)){return this.each(function(be){var bd=a(this);bd.text(e.call(this,be,bd.text()))})}if(typeof e!=="object"&&e!==H){return this.empty().append((this[0]&&this[0].ownerDocument||al).createTextNode(e))}return a.text(this)},wrapAll:function(e){if(a.isFunction(e)){return this.each(function(be){a(this).wrapAll(e.call(this,be))})}if(this[0]){var bd=a(e,this[0].ownerDocument).eq(0).clone(true);if(this[0].parentNode){bd.insertBefore(this[0])}bd.map(function(){var be=this;while(be.firstChild&&be.firstChild.nodeType===1){be=be.firstChild}return be}).append(this)}return this},wrapInner:function(e){if(a.isFunction(e)){return this.each(function(bd){a(this).wrapInner(e.call(this,bd))})}return this.each(function(){var bd=a(this),be=bd.contents();if(be.length){be.wrapAll(e)}else{bd.append(e)}})},wrap:function(e){return this.each(function(){a(this).wrapAll(e)})},unwrap:function(){return this.parent().each(function(){if(!a.nodeName(this,"body")){a(this).replaceWith(this.childNodes)}}).end()},append:function(){return this.domManip(arguments,true,function(e){if(this.nodeType===1){this.appendChild(e)}})},prepend:function(){return this.domManip(arguments,true,function(e){if(this.nodeType===1){this.insertBefore(e,this.firstChild)}})},before:function(){if(this[0]&&this[0].parentNode){return this.domManip(arguments,false,function(bd){this.parentNode.insertBefore(bd,this)})}else{if(arguments.length){var e=a(arguments[0]);e.push.apply(e,this.toArray());return this.pushStack(e,"before",arguments)}}},after:function(){if(this[0]&&this[0].parentNode){return this.domManip(arguments,false,function(bd){this.parentNode.insertBefore(bd,this.nextSibling)})}else{if(arguments.length){var e=this.pushStack(this,"after",arguments);e.push.apply(e,a(arguments[0]).toArray());return e}}},remove:function(e,bf){for(var bd=0,be;(be=this[bd])!=null;bd++){if(!e||a.filter(e,[be]).length){if(!bf&&be.nodeType===1){a.cleanData(be.getElementsByTagName("*"));a.cleanData([be])}if(be.parentNode){be.parentNode.removeChild(be)}}}return this},empty:function(){for(var e=0,bd;(bd=this[e])!=null;e++){if(bd.nodeType===1){a.cleanData(bd.getElementsByTagName("*"))}while(bd.firstChild){bd.removeChild(bd.firstChild)}}return this},clone:function(bd,e){bd=bd==null?false:bd;e=e==null?bd:e;return this.map(function(){return a.clone(this,bd,e)})},html:function(bf){if(bf===H){return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(ab,""):null}else{if(typeof bf==="string"&&!L.test(bf)&&(a.support.leadingWhitespace||!aj.test(bf))&&!an[(c.exec(bf)||["",""])[1].toLowerCase()]){bf=bf.replace(O,"<$1>");try{for(var be=0,bd=this.length;be1&&be0?this.clone(true):this).get();a(bk[bi])[bd](bg);bh=bh.concat(bg)}return this.pushStack(bh,e,bk.selector)}}});function a1(e){if("getElementsByTagName" in e){return e.getElementsByTagName("*")}else{if("querySelectorAll" in e){return e.querySelectorAll("*")}else{return[]}}}a.extend({clone:function(bg,bi,be){var bh=bg.cloneNode(true),e,bd,bf;if((!a.support.noCloneEvent||!a.support.noCloneChecked)&&(bg.nodeType===1||bg.nodeType===11)&&!a.isXMLDoc(bg)){ac(bg,bh);e=a1(bg);bd=a1(bh);for(bf=0;e[bf];++bf){ac(e[bf],bd[bf])}}if(bi){s(bg,bh);if(be){e=a1(bg);bd=a1(bh);for(bf=0;e[bf];++bf){s(e[bf],bd[bf])}}}return bh},clean:function(be,bg,bn,bi){bg=bg||al;if(typeof bg.createElement==="undefined"){bg=bg.ownerDocument||bg[0]&&bg[0].ownerDocument||al}var bo=[];for(var bm=0,bh;(bh=be[bm])!=null;bm++){if(typeof bh==="number"){bh+=""}if(!bh){continue}if(typeof bh==="string"&&!T.test(bh)){bh=bg.createTextNode(bh)}else{if(typeof bh==="string"){bh=bh.replace(O,"<$1>");var bp=(c.exec(bh)||["",""])[1].toLowerCase(),bf=an[bp]||an._default,bl=bf[0],bd=bg.createElement("div");bd.innerHTML=bf[1]+bh+bf[2];while(bl--){bd=bd.lastChild}if(!a.support.tbody){var e=v.test(bh),bk=bp==="table"&&!e?bd.firstChild&&bd.firstChild.childNodes:bf[1]===""&&!e?bd.childNodes:[];for(var bj=bk.length-1;bj>=0;--bj){if(a.nodeName(bk[bj],"tbody")&&!bk[bj].childNodes.length){bk[bj].parentNode.removeChild(bk[bj])}}}if(!a.support.leadingWhitespace&&aj.test(bh)){bd.insertBefore(bg.createTextNode(aj.exec(bh)[0]),bd.firstChild)}bh=bd.childNodes}}if(bh.nodeType){bo.push(bh)}else{bo=a.merge(bo,bh)}}if(bn){for(bm=0;bo[bm];bm++){if(bi&&a.nodeName(bo[bm],"script")&&(!bo[bm].type||bo[bm].type.toLowerCase()==="text/javascript")){bi.push(bo[bm].parentNode?bo[bm].parentNode.removeChild(bo[bm]):bo[bm])}else{if(bo[bm].nodeType===1){bo.splice.apply(bo,[bm+1,0].concat(a.makeArray(bo[bm].getElementsByTagName("script"))))}bn.appendChild(bo[bm])}}}return bo},cleanData:function(bd){var bg,be,e=a.cache,bl=a.expando,bj=a.event.special,bi=a.support.deleteExpando;for(var bh=0,bf;(bf=bd[bh])!=null;bh++){if(bf.nodeName&&a.noData[bf.nodeName.toLowerCase()]){continue}be=bf[a.expando];if(be){bg=e[be]&&e[be][bl];if(bg&&bg.events){for(var bk in bg.events){if(bj[bk]){a.event.remove(bf,bk)}else{a.removeEvent(bf,bk,bg.handle)}}if(bg.handle){bg.handle.elem=null}}if(bi){delete bf[a.expando]}else{if(bf.removeAttribute){bf.removeAttribute(a.expando)}}delete e[be]}}}});function a8(e,bd){if(bd.src){a.ajax({url:bd.src,async:false,dataType:"script"})}else{a.globalEval(bd.text||bd.textContent||bd.innerHTML||"")}if(bd.parentNode){bd.parentNode.removeChild(bd)}}var ae=/alpha\([^)]*\)/i,ak=/opacity=([^)]*)/,aM=/-([a-z])/ig,y=/([A-Z])/g,aZ=/^-?\d+(?:px)?$/i,a7=/^-?\d/,aV={position:"absolute",visibility:"hidden",display:"block"},ag=["Left","Right"],aR=["Top","Bottom"],U,ay,aL,l=function(e,bd){return bd.toUpperCase()};a.fn.css=function(e,bd){if(arguments.length===2&&bd===H){return this}return a.access(this,e,bd,true,function(bf,be,bg){return bg!==H?a.style(bf,be,bg):a.css(bf,be)})};a.extend({cssHooks:{opacity:{get:function(be,bd){if(bd){var e=U(be,"opacity","opacity");return e===""?"1":e}else{return be.style.opacity}}}},cssNumber:{zIndex:true,fontWeight:true,opacity:true,zoom:true,lineHeight:true},cssProps:{"float":a.support.cssFloat?"cssFloat":"styleFloat"},style:function(bf,be,bk,bg){if(!bf||bf.nodeType===3||bf.nodeType===8||!bf.style){return}var bj,bh=a.camelCase(be),bd=bf.style,bl=a.cssHooks[bh];be=a.cssProps[bh]||bh;if(bk!==H){if(typeof bk==="number"&&isNaN(bk)||bk==null){return}if(typeof bk==="number"&&!a.cssNumber[bh]){bk+="px"}if(!bl||!("set" in bl)||(bk=bl.set(bf,bk))!==H){try{bd[be]=bk}catch(bi){}}}else{if(bl&&"get" in bl&&(bj=bl.get(bf,false,bg))!==H){return bj}return bd[be]}},css:function(bh,bg,bd){var bf,be=a.camelCase(bg),e=a.cssHooks[be];bg=a.cssProps[be]||be;if(e&&"get" in e&&(bf=e.get(bh,true,bd))!==H){return bf}else{if(U){return U(bh,bg,be)}}},swap:function(bf,be,bg){var e={};for(var bd in be){e[bd]=bf.style[bd];bf.style[bd]=be[bd]}bg.call(bf);for(bd in be){bf.style[bd]=e[bd]}},camelCase:function(e){return e.replace(aM,l)}});a.curCSS=a.css;a.each(["height","width"],function(bd,e){a.cssHooks[e]={get:function(bg,bf,be){var bh;if(bf){if(bg.offsetWidth!==0){bh=o(bg,e,be)}else{a.swap(bg,aV,function(){bh=o(bg,e,be)})}if(bh<=0){bh=U(bg,e,e);if(bh==="0px"&&aL){bh=aL(bg,e,e)}if(bh!=null){return bh===""||bh==="auto"?"0px":bh}}if(bh<0||bh==null){bh=bg.style[e];return bh===""||bh==="auto"?"0px":bh}return typeof bh==="string"?bh:bh+"px"}},set:function(be,bf){if(aZ.test(bf)){bf=parseFloat(bf);if(bf>=0){return bf+"px"}}else{return bf}}}});if(!a.support.opacity){a.cssHooks.opacity={get:function(bd,e){return ak.test((e&&bd.currentStyle?bd.currentStyle.filter:bd.style.filter)||"")?(parseFloat(RegExp.$1)/100)+"":e?"1":""},set:function(bf,bg){var be=bf.style;be.zoom=1;var e=a.isNaN(bg)?"":"alpha(opacity="+bg*100+")",bd=be.filter||"";be.filter=ae.test(bd)?bd.replace(ae,e):be.filter+" "+e}}}if(al.defaultView&&al.defaultView.getComputedStyle){ay=function(bh,e,bf){var be,bg,bd;bf=bf.replace(y,"-$1").toLowerCase();if(!(bg=bh.ownerDocument.defaultView)){return H}if((bd=bg.getComputedStyle(bh,null))){be=bd.getPropertyValue(bf);if(be===""&&!a.contains(bh.ownerDocument.documentElement,bh)){be=a.style(bh,bf)}}return be}}if(al.documentElement.currentStyle){aL=function(bg,be){var bh,bd=bg.currentStyle&&bg.currentStyle[be],e=bg.runtimeStyle&&bg.runtimeStyle[be],bf=bg.style;if(!aZ.test(bd)&&a7.test(bd)){bh=bf.left;if(e){bg.runtimeStyle.left=bg.currentStyle.left}bf.left=be==="fontSize"?"1em":(bd||0);bd=bf.pixelLeft+"px";bf.left=bh;if(e){bg.runtimeStyle.left=e}}return bd===""?"auto":bd}}U=ay||aL;function o(be,bd,e){var bg=bd==="width"?ag:aR,bf=bd==="width"?be.offsetWidth:be.offsetHeight;if(e==="border"){return bf}a.each(bg,function(){if(!e){bf-=parseFloat(a.css(be,"padding"+this))||0}if(e==="margin"){bf+=parseFloat(a.css(be,"margin"+this))||0}else{bf-=parseFloat(a.css(be,"border"+this+"Width"))||0}});return bf}if(a.expr&&a.expr.filters){a.expr.filters.hidden=function(be){var bd=be.offsetWidth,e=be.offsetHeight;return(bd===0&&e===0)||(!a.support.reliableHiddenOffsets&&(be.style.display||a.css(be,"display"))==="none")};a.expr.filters.visible=function(e){return !a.expr.filters.hidden(e)}}var i=/%20/g,ah=/\[\]$/,bc=/\r?\n/g,ba=/#.*$/,ar=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,aO=/^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,aB=/(?:^file|^widget|\-extension):$/,aD=/^(?:GET|HEAD)$/,b=/^\/\//,I=/\?/,aU=/)<[^<]*)*<\/script>/gi,p=/^(?:select|textarea)/i,g=/\s+/,bb=/([?&])_=[^&]*/,R=/(^|\-)([a-z])/g,aJ=function(bd,e,be){return e+be.toUpperCase()},G=/^([\w\+\.\-]+:)\/\/([^\/?#:]*)(?::(\d+))?/,z=a.fn.load,V={},q={},au,r;try{au=al.location.href}catch(am){au=al.createElement("a");au.href="";au=au.href}r=G.exec(au.toLowerCase());function d(e){return function(bg,bi){if(typeof bg!=="string"){bi=bg;bg="*"}if(a.isFunction(bi)){var bf=bg.toLowerCase().split(g),be=0,bh=bf.length,bd,bj,bk;for(;be=0){var e=be.slice(bg,be.length);be=be.slice(0,bg)}var bf="GET";if(bh){if(a.isFunction(bh)){bi=bh;bh=H}else{if(typeof bh==="object"){bh=a.param(bh,a.ajaxSettings.traditional);bf="POST"}}}var bd=this;a.ajax({url:be,type:bf,dataType:"html",data:bh,complete:function(bk,bj,bl){bl=bk.responseText;if(bk.isResolved()){bk.done(function(bm){bl=bm});bd.html(e?a("
      ").append(bl.replace(aU,"")).find(e):bl)}if(bi){bd.each(bi,[bl,bj,bk])}}});return this},serialize:function(){return a.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?a.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||p.test(this.nodeName)||aO.test(this.type))}).map(function(e,bd){var be=a(this).val();return be==null?null:a.isArray(be)?a.map(be,function(bg,bf){return{name:bd.name,value:bg.replace(bc,"\r\n")}}):{name:bd.name,value:be.replace(bc,"\r\n")}}).get()}});a.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(e,bd){a.fn[bd]=function(be){return this.bind(bd,be)}});a.each(["get","post"],function(e,bd){a[bd]=function(be,bg,bh,bf){if(a.isFunction(bg)){bf=bf||bh;bh=bg;bg=H}return a.ajax({type:bd,url:be,data:bg,success:bh,dataType:bf})}});a.extend({getScript:function(e,bd){return a.get(e,H,bd,"script")},getJSON:function(e,bd,be){return a.get(e,bd,be,"json")},ajaxSetup:function(be,e){if(!e){e=be;be=a.extend(true,a.ajaxSettings,e)}else{a.extend(true,be,a.ajaxSettings,e)}for(var bd in {context:1,url:1}){if(bd in e){be[bd]=e[bd]}else{if(bd in a.ajaxSettings){be[bd]=a.ajaxSettings[bd]}}}return be},ajaxSettings:{url:au,isLocal:aB.test(r[1]),global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":"*/*"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":aY.String,"text html":true,"text json":a.parseJSON,"text xml":a.parseXML}},ajaxPrefilter:d(V),ajaxTransport:d(q),ajax:function(bh,bf){if(typeof bh==="object"){bf=bh;bh=H}bf=bf||{};var bl=a.ajaxSetup({},bf),bz=bl.context||bl,bo=bz!==bl&&(bz.nodeType||bz instanceof a)?a(bz):a.event,by=a.Deferred(),bv=a._Deferred(),bj=bl.statusCode||{},bk,bp={},bx,bg,bt,bm,bq,bi=0,be,bs,br={readyState:0,setRequestHeader:function(e,bA){if(!bi){bp[e.toLowerCase().replace(R,aJ)]=bA}return this},getAllResponseHeaders:function(){return bi===2?bx:null},getResponseHeader:function(bA){var e;if(bi===2){if(!bg){bg={};while((e=ar.exec(bx))){bg[e[1].toLowerCase()]=e[2]}}e=bg[bA.toLowerCase()]}return e===H?null:e},overrideMimeType:function(e){if(!bi){bl.mimeType=e}return this},abort:function(e){e=e||"abort";if(bt){bt.abort(e)}bn(0,e);return this}};function bn(bF,bD,bG,bC){if(bi===2){return}bi=2;if(bm){clearTimeout(bm)}bt=H;bx=bC||"";br.readyState=bF?4:0;var bA,bK,bJ,bE=bG?a4(bl,br,bG):H,bB,bI;if(bF>=200&&bF<300||bF===304){if(bl.ifModified){if((bB=br.getResponseHeader("Last-Modified"))){a.lastModified[bk]=bB}if((bI=br.getResponseHeader("Etag"))){a.etag[bk]=bI}}if(bF===304){bD="notmodified";bA=true}else{try{bK=D(bl,bE);bD="success";bA=true}catch(bH){bD="parsererror";bJ=bH}}}else{bJ=bD;if(!bD||bF){bD="error";if(bF<0){bF=0}}}br.status=bF;br.statusText=bD;if(bA){by.resolveWith(bz,[bK,bD,br])}else{by.rejectWith(bz,[br,bD,bJ])}br.statusCode(bj);bj=H;if(be){bo.trigger("ajax"+(bA?"Success":"Error"),[br,bl,bA?bK:bJ])}bv.resolveWith(bz,[br,bD]);if(be){bo.trigger("ajaxComplete",[br,bl]);if(!(--a.active)){a.event.trigger("ajaxStop")}}}by.promise(br);br.success=br.done;br.error=br.fail;br.complete=bv.done;br.statusCode=function(bA){if(bA){var e;if(bi<2){for(e in bA){bj[e]=[bj[e],bA[e]]}}else{e=bA[br.status];br.then(e,e)}}return this};bl.url=((bh||bl.url)+"").replace(ba,"").replace(b,r[1]+"//");bl.dataTypes=a.trim(bl.dataType||"*").toLowerCase().split(g);if(!bl.crossDomain){bq=G.exec(bl.url.toLowerCase());bl.crossDomain=!!(bq&&(bq[1]!=r[1]||bq[2]!=r[2]||(bq[3]||(bq[1]==="http:"?80:443))!=(r[3]||(r[1]==="http:"?80:443))))}if(bl.data&&bl.processData&&typeof bl.data!=="string"){bl.data=a.param(bl.data,bl.traditional)}aI(V,bl,bf,br);if(bi===2){return false}be=bl.global;bl.type=bl.type.toUpperCase();bl.hasContent=!aD.test(bl.type);if(be&&a.active++===0){a.event.trigger("ajaxStart")}if(!bl.hasContent){if(bl.data){bl.url+=(I.test(bl.url)?"&":"?")+bl.data}bk=bl.url;if(bl.cache===false){var bd=a.now(),bw=bl.url.replace(bb,"$1_="+bd);bl.url=bw+((bw===bl.url)?(I.test(bl.url)?"&":"?")+"_="+bd:"")}}if(bl.data&&bl.hasContent&&bl.contentType!==false||bf.contentType){bp["Content-Type"]=bl.contentType}if(bl.ifModified){bk=bk||bl.url;if(a.lastModified[bk]){bp["If-Modified-Since"]=a.lastModified[bk]}if(a.etag[bk]){bp["If-None-Match"]=a.etag[bk]}}bp.Accept=bl.dataTypes[0]&&bl.accepts[bl.dataTypes[0]]?bl.accepts[bl.dataTypes[0]]+(bl.dataTypes[0]!=="*"?", */*; q=0.01":""):bl.accepts["*"];for(bs in bl.headers){br.setRequestHeader(bs,bl.headers[bs])}if(bl.beforeSend&&(bl.beforeSend.call(bz,br,bl)===false||bi===2)){br.abort();return false}for(bs in {success:1,error:1,complete:1}){br[bs](bl[bs])}bt=aI(q,bl,bf,br);if(!bt){bn(-1,"No Transport")}else{br.readyState=1;if(be){bo.trigger("ajaxSend",[br,bl])}if(bl.async&&bl.timeout>0){bm=setTimeout(function(){br.abort("timeout")},bl.timeout)}try{bi=1;bt.send(bp,bn)}catch(bu){if(status<2){bn(-1,bu)}else{a.error(bu)}}}return br},param:function(e,be){var bd=[],bg=function(bh,bi){bi=a.isFunction(bi)?bi():bi;bd[bd.length]=encodeURIComponent(bh)+"="+encodeURIComponent(bi)};if(be===H){be=a.ajaxSettings.traditional}if(a.isArray(e)||(e.jquery&&!a.isPlainObject(e))){a.each(e,function(){bg(this.name,this.value)})}else{for(var bf in e){u(bf,e[bf],be,bg)}}return bd.join("&").replace(i,"+")}});function u(be,bg,bd,bf){if(a.isArray(bg)&&bg.length){a.each(bg,function(bi,bh){if(bd||ah.test(be)){bf(be,bh)}else{u(be+"["+(typeof bh==="object"||a.isArray(bh)?bi:"")+"]",bh,bd,bf)}})}else{if(!bd&&bg!=null&&typeof bg==="object"){if(a.isArray(bg)||a.isEmptyObject(bg)){bf(be,"")}else{for(var e in bg){u(be+"["+e+"]",bg[e],bd,bf)}}}else{bf(be,bg)}}}a.extend({active:0,lastModified:{},etag:{}});function a4(bl,bk,bh){var bd=bl.contents,bj=bl.dataTypes,be=bl.responseFields,bg,bi,bf,e;for(bi in be){if(bi in bh){bk[be[bi]]=bh[bi]}}while(bj[0]==="*"){bj.shift();if(bg===H){bg=bl.mimeType||bk.getResponseHeader("content-type")}}if(bg){for(bi in bd){if(bd[bi]&&bd[bi].test(bg)){bj.unshift(bi);break}}}if(bj[0] in bh){bf=bj[0]}else{for(bi in bh){if(!bj[0]||bl.converters[bi+" "+bj[0]]){bf=bi;break}if(!e){e=bi}}bf=bf||e}if(bf){if(bf!==bj[0]){bj.unshift(bf)}return bh[bf]}}function D(bp,bh){if(bp.dataFilter){bh=bp.dataFilter(bh,bp.dataType)}var bl=bp.dataTypes,bo={},bi,bm,be=bl.length,bj,bk=bl[0],bf,bg,bn,bd,e;for(bi=1;bi=0;bf--){if(be[bf].elem===this){if(e){be[bf](true)}be.splice(bf,1)}}});if(!e){this.dequeue()}return this}});function aQ(bd,e){var be={};a.each(ax.concat.apply([],ax.slice(0,e)),function(){be[this]=bd});return be}a.each({slideDown:aQ("show",1),slideUp:aQ("hide",1),slideToggle:aQ("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,bd){a.fn[e]=function(be,bg,bf){return this.animate(bd,be,bg,bf)}});a.extend({speed:function(be,bf,bd){var e=be&&typeof be==="object"?a.extend({},be):{complete:bd||!bd&&bf||a.isFunction(be)&&be,duration:be,easing:bd&&bf||bf&&!a.isFunction(bf)&&bf};e.duration=a.fx.off?0:typeof e.duration==="number"?e.duration:e.duration in a.fx.speeds?a.fx.speeds[e.duration]:a.fx.speeds._default;e.old=e.complete;e.complete=function(){if(e.queue!==false){a(this).dequeue()}if(a.isFunction(e.old)){e.old.call(this)}};return e},easing:{linear:function(be,bf,e,bd){return e+bd*be},swing:function(be,bf,e,bd){return((-Math.cos(be*Math.PI)/2)+0.5)*bd+e}},timers:[],fx:function(bd,e,be){this.options=e;this.elem=bd;this.prop=be;if(!e.orig){e.orig={}}}});a.fx.prototype={update:function(){if(this.options.step){this.options.step.call(this.elem,this.now,this)}(a.fx.step[this.prop]||a.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null)){return this.elem[this.prop]}var e,bd=a.css(this.elem,this.prop);return isNaN(e=parseFloat(bd))?!bd||bd==="auto"?0:bd:e},custom:function(bh,bg,bf){var e=this,be=a.fx;this.startTime=a.now();this.start=bh;this.end=bg;this.unit=bf||this.unit||(a.cssNumber[this.prop]?"":"px");this.now=this.start;this.pos=this.state=0;function bd(bi){return e.step(bi)}bd.elem=this.elem;if(bd()&&a.timers.push(bd)&&!aS){aS=setInterval(be.tick,be.interval)}},show:function(){this.options.orig[this.prop]=a.style(this.elem,this.prop);this.options.show=true;this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur());a(this.elem).show()},hide:function(){this.options.orig[this.prop]=a.style(this.elem,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(bf){var bk=a.now(),bg=true;if(bf||bk>=this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;for(var bh in this.options.curAnim){if(this.options.curAnim[bh]!==true){bg=false}}if(bg){if(this.options.overflow!=null&&!a.support.shrinkWrapBlocks){var be=this.elem,bl=this.options;a.each(["","X","Y"],function(bm,bn){be.style["overflow"+bn]=bl.overflow[bm]})}if(this.options.hide){a(this.elem).hide()}if(this.options.hide||this.options.show){for(var e in this.options.curAnim){a.style(this.elem,e,this.options.orig[e])}}this.options.complete.call(this.elem)}return false}else{var bd=bk-this.startTime;this.state=bd/this.options.duration;var bi=this.options.specialEasing&&this.options.specialEasing[this.prop];var bj=this.options.easing||(a.easing.swing?"swing":"linear");this.pos=a.easing[bi||bj](this.state,bd,0,1,this.options.duration);this.now=this.start+((this.end-this.start)*this.pos);this.update()}return true}};a.extend(a.fx,{tick:function(){var bd=a.timers;for(var e=0;e").appendTo("body"),bd=e.css("display");e.remove();if(bd==="none"||bd===""){bd="block"}N[be]=bd}return N[be]}var S=/^t(?:able|d|h)$/i,Y=/^(?:body|html)$/i;if("getBoundingClientRect" in al.documentElement){a.fn.offset=function(bq){var bg=this[0],bj;if(bq){return this.each(function(e){a.offset.setOffset(this,bq,e)})}if(!bg||!bg.ownerDocument){return null}if(bg===bg.ownerDocument.body){return a.offset.bodyOffset(bg)}try{bj=bg.getBoundingClientRect()}catch(bn){}var bp=bg.ownerDocument,be=bp.documentElement;if(!bj||!a.contains(be,bg)){return bj?{top:bj.top,left:bj.left}:{top:0,left:0}}var bk=bp.body,bl=az(bp),bi=be.clientTop||bk.clientTop||0,bm=be.clientLeft||bk.clientLeft||0,bd=(bl.pageYOffset||a.support.boxModel&&be.scrollTop||bk.scrollTop),bh=(bl.pageXOffset||a.support.boxModel&&be.scrollLeft||bk.scrollLeft),bo=bj.top+bd-bi,bf=bj.left+bh-bm;return{top:bo,left:bf}}}else{a.fn.offset=function(bn){var bh=this[0];if(bn){return this.each(function(bo){a.offset.setOffset(this,bn,bo)})}if(!bh||!bh.ownerDocument){return null}if(bh===bh.ownerDocument.body){return a.offset.bodyOffset(bh)}a.offset.initialize();var bk,be=bh.offsetParent,bd=bh,bm=bh.ownerDocument,bf=bm.documentElement,bi=bm.body,bj=bm.defaultView,e=bj?bj.getComputedStyle(bh,null):bh.currentStyle,bl=bh.offsetTop,bg=bh.offsetLeft;while((bh=bh.parentNode)&&bh!==bi&&bh!==bf){if(a.offset.supportsFixedPosition&&e.position==="fixed"){break}bk=bj?bj.getComputedStyle(bh,null):bh.currentStyle;bl-=bh.scrollTop;bg-=bh.scrollLeft;if(bh===be){bl+=bh.offsetTop;bg+=bh.offsetLeft;if(a.offset.doesNotAddBorder&&!(a.offset.doesAddBorderForTableAndCells&&S.test(bh.nodeName))){bl+=parseFloat(bk.borderTopWidth)||0;bg+=parseFloat(bk.borderLeftWidth)||0}bd=be;be=bh.offsetParent}if(a.offset.subtractsBorderForOverflowNotVisible&&bk.overflow!=="visible"){bl+=parseFloat(bk.borderTopWidth)||0;bg+=parseFloat(bk.borderLeftWidth)||0}e=bk}if(e.position==="relative"||e.position==="static"){bl+=bi.offsetTop;bg+=bi.offsetLeft}if(a.offset.supportsFixedPosition&&e.position==="fixed"){bl+=Math.max(bf.scrollTop,bi.scrollTop);bg+=Math.max(bf.scrollLeft,bi.scrollLeft)}return{top:bl,left:bg}}}a.offset={initialize:function(){var e=al.body,bd=al.createElement("div"),bg,bi,bh,bj,be=parseFloat(a.css(e,"marginTop"))||0,bf="
      ";a.extend(bd.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"});bd.innerHTML=bf;e.insertBefore(bd,e.firstChild);bg=bd.firstChild;bi=bg.firstChild;bj=bg.nextSibling.firstChild.firstChild;this.doesNotAddBorder=(bi.offsetTop!==5);this.doesAddBorderForTableAndCells=(bj.offsetTop===5);bi.style.position="fixed";bi.style.top="20px";this.supportsFixedPosition=(bi.offsetTop===20||bi.offsetTop===15);bi.style.position=bi.style.top="";bg.style.overflow="hidden";bg.style.position="relative";this.subtractsBorderForOverflowNotVisible=(bi.offsetTop===-5);this.doesNotIncludeMarginInBodyOffset=(e.offsetTop!==be);e.removeChild(bd);e=bd=bg=bi=bh=bj=null;a.offset.initialize=a.noop},bodyOffset:function(e){var be=e.offsetTop,bd=e.offsetLeft;a.offset.initialize();if(a.offset.doesNotIncludeMarginInBodyOffset){be+=parseFloat(a.css(e,"marginTop"))||0;bd+=parseFloat(a.css(e,"marginLeft"))||0}return{top:be,left:bd}},setOffset:function(bf,bo,bi){var bj=a.css(bf,"position");if(bj==="static"){bf.style.position="relative"}var bh=a(bf),bd=bh.offset(),e=a.css(bf,"top"),bm=a.css(bf,"left"),bn=(bj==="absolute"&&a.inArray("auto",[e,bm])>-1),bl={},bk={},be,bg;if(bn){bk=bh.position()}be=bn?bk.top:parseInt(e,10)||0;bg=bn?bk.left:parseInt(bm,10)||0;if(a.isFunction(bo)){bo=bo.call(bf,bi,bd)}if(bo.top!=null){bl.top=(bo.top-bd.top)+be}if(bo.left!=null){bl.left=(bo.left-bd.left)+bg}if("using" in bo){bo.using.call(bf,bl)}else{bh.css(bl)}}};a.fn.extend({position:function(){if(!this[0]){return null}var be=this[0],bd=this.offsetParent(),bf=this.offset(),e=Y.test(bd[0].nodeName)?{top:0,left:0}:bd.offset();bf.top-=parseFloat(a.css(be,"marginTop"))||0;bf.left-=parseFloat(a.css(be,"marginLeft"))||0;e.top+=parseFloat(a.css(bd[0],"borderTopWidth"))||0;e.left+=parseFloat(a.css(bd[0],"borderLeftWidth"))||0;return{top:bf.top-e.top,left:bf.left-e.left}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||al.body;while(e&&(!Y.test(e.nodeName)&&a.css(e,"position")==="static")){e=e.offsetParent}return e})}});a.each(["Left","Top"],function(bd,e){var be="scroll"+e;a.fn[be]=function(bh){var bf=this[0],bg;if(!bf){return null}if(bh!==H){return this.each(function(){bg=az(this);if(bg){bg.scrollTo(!bd?bh:a(bg).scrollLeft(),bd?bh:a(bg).scrollTop())}else{this[be]=bh}})}else{bg=az(bf);return bg?("pageXOffset" in bg)?bg[bd?"pageYOffset":"pageXOffset"]:a.support.boxModel&&bg.document.documentElement[be]||bg.document.body[be]:bf[be]}}});function az(e){return a.isWindow(e)?e:e.nodeType===9?e.defaultView||e.parentWindow:false}a.each(["Height","Width"],function(bd,e){var be=e.toLowerCase();a.fn["inner"+e]=function(){return this[0]?parseFloat(a.css(this[0],be,"padding")):null};a.fn["outer"+e]=function(bf){return this[0]?parseFloat(a.css(this[0],be,bf?"margin":"border")):null};a.fn[be]=function(bg){var bh=this[0];if(!bh){return bg==null?null:this}if(a.isFunction(bg)){return this.each(function(bl){var bk=a(this);bk[be](bg.call(this,bl,bk[be]()))})}if(a.isWindow(bh)){var bi=bh.document.documentElement["client"+e];return bh.document.compatMode==="CSS1Compat"&&bi||bh.document.body["client"+e]||bi}else{if(bh.nodeType===9){return Math.max(bh.documentElement["client"+e],bh.body["scroll"+e],bh.documentElement["scroll"+e],bh.body["offset"+e],bh.documentElement["offset"+e])}else{if(bg===H){var bj=a.css(bh,be),bf=parseFloat(bj);return a.isNaN(bf)?bj:bf}else{return this.css(be,typeof bg==="string"?bg:bg+"px")}}}}});aY.jQuery=aY.$=a})(window); \ No newline at end of file diff --git a/includes/jquery/jquery-1.7.2.min.js b/includes/jquery/jquery-1.7.2.min.js new file mode 100644 index 0000000000..16ad06c5ac --- /dev/null +++ b/includes/jquery/jquery-1.7.2.min.js @@ -0,0 +1,4 @@ +/*! jQuery v1.7.2 jquery.com | jquery.org/license */ +(function(a,b){function cy(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cu(a){if(!cj[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){ck||(ck=c.createElement("iframe"),ck.frameBorder=ck.width=ck.height=0),b.appendChild(ck);if(!cl||!ck.createElement)cl=(ck.contentWindow||ck.contentDocument).document,cl.write((f.support.boxModel?"":"")+""),cl.close();d=cl.createElement(a),cl.body.appendChild(d),e=f.css(d,"display"),b.removeChild(ck)}cj[a]=e}return cj[a]}function ct(a,b){var c={};f.each(cp.concat.apply([],cp.slice(0,b)),function(){c[this]=a});return c}function cs(){cq=b}function cr(){setTimeout(cs,0);return cq=f.now()}function ci(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ch(){try{return new a.XMLHttpRequest}catch(b){}}function cb(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g0){if(c!=="border")for(;e=0===c})}function S(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function K(){return!0}function J(){return!1}function n(a,b,c){var d=b+"defer",e=b+"queue",g=b+"mark",h=f._data(a,d);h&&(c==="queue"||!f._data(a,e))&&(c==="mark"||!f._data(a,g))&&setTimeout(function(){!f._data(a,e)&&!f._data(a,g)&&(f.removeData(a,d,!0),h.fire())},0)}function m(a){for(var b in a){if(b==="data"&&f.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function l(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(k,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNumeric(d)?+d:j.test(d)?f.parseJSON(d):d}catch(g){}f.data(a,c,d)}else d=b}return d}function h(a){var b=g[a]={},c,d;a=a.split(/\s+/);for(c=0,d=a.length;c)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,n=/^[\],:{}\s]*$/,o=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,p=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,q=/(?:^|:|,)(?:\s*\[)+/g,r=/(webkit)[ \/]([\w.]+)/,s=/(opera)(?:.*version)?[ \/]([\w.]+)/,t=/(msie) ([\w.]+)/,u=/(mozilla)(?:.*? rv:([\w.]+))?/,v=/-([a-z]|[0-9])/ig,w=/^-ms-/,x=function(a,b){return(b+"").toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=m.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.7.2",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.add(a);return this},eq:function(a){a=+a;return a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j0)return;A.fireWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").off("ready")}},bindReady:function(){if(!A){A=e.Callbacks("once memory");if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a!=null&&a==a.window},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||D.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw new Error(a)},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(n.test(b.replace(o,"@").replace(p,"]").replace(q,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(c){if(typeof c!="string"||!c)return null;var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&e.error("Invalid XML: "+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,"ms-").replace(v,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i1?i.call(arguments,0):b,j.notifyWith(k,e)}}function l(a){return function(c){b[a]=arguments.length>1?i.call(arguments,0):c,--g||j.resolveWith(j,b)}}var b=i.call(arguments,0),c=0,d=b.length,e=Array(d),g=d,h=d,j=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred(),k=j.promise();if(d>1){for(;c
      a",d=p.getElementsByTagName("*"),e=p.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=p.getElementsByTagName("input")[0],b={leadingWhitespace:p.firstChild.nodeType===3,tbody:!p.getElementsByTagName("tbody").length,htmlSerialize:!!p.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:p.className!=="t",enctype:!!c.createElement("form").enctype,html5Clone:c.createElement("nav").cloneNode(!0).outerHTML!=="<:nav>",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,pixelMargin:!0},f.boxModel=b.boxModel=c.compatMode==="CSS1Compat",i.checked=!0,b.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,b.optDisabled=!h.disabled;try{delete p.test}catch(r){b.deleteExpando=!1}!p.addEventListener&&p.attachEvent&&p.fireEvent&&(p.attachEvent("onclick",function(){b.noCloneEvent=!1}),p.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),b.radioValue=i.value==="t",i.setAttribute("checked","checked"),i.setAttribute("name","t"),p.appendChild(i),j=c.createDocumentFragment(),j.appendChild(p.lastChild),b.checkClone=j.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=i.checked,j.removeChild(i),j.appendChild(p);if(p.attachEvent)for(n in{submit:1,change:1,focusin:1})m="on"+n,o=m in p,o||(p.setAttribute(m,"return;"),o=typeof p[m]=="function"),b[n+"Bubbles"]=o;j.removeChild(p),j=g=h=p=i=null,f(function(){var d,e,g,h,i,j,l,m,n,q,r,s,t,u=c.getElementsByTagName("body")[0];!u||(m=1,t="padding:0;margin:0;border:",r="position:absolute;top:0;left:0;width:1px;height:1px;",s=t+"0;visibility:hidden;",n="style='"+r+t+"5px solid #000;",q="
      "+""+"
      ",d=c.createElement("div"),d.style.cssText=s+"width:0;height:0;position:static;top:0;margin-top:"+m+"px",u.insertBefore(d,u.firstChild),p=c.createElement("div"),d.appendChild(p),p.innerHTML="
      t
      ",k=p.getElementsByTagName("td"),o=k[0].offsetHeight===0,k[0].style.display="",k[1].style.display="none",b.reliableHiddenOffsets=o&&k[0].offsetHeight===0,a.getComputedStyle&&(p.innerHTML="",l=c.createElement("div"),l.style.width="0",l.style.marginRight="0",p.style.width="2px",p.appendChild(l),b.reliableMarginRight=(parseInt((a.getComputedStyle(l,null)||{marginRight:0}).marginRight,10)||0)===0),typeof p.style.zoom!="undefined"&&(p.innerHTML="",p.style.width=p.style.padding="1px",p.style.border=0,p.style.overflow="hidden",p.style.display="inline",p.style.zoom=1,b.inlineBlockNeedsLayout=p.offsetWidth===3,p.style.display="block",p.style.overflow="visible",p.innerHTML="
      ",b.shrinkWrapBlocks=p.offsetWidth!==3),p.style.cssText=r+s,p.innerHTML=q,e=p.firstChild,g=e.firstChild,i=e.nextSibling.firstChild.firstChild,j={doesNotAddBorder:g.offsetTop!==5,doesAddBorderForTableAndCells:i.offsetTop===5},g.style.position="fixed",g.style.top="20px",j.fixedPosition=g.offsetTop===20||g.offsetTop===15,g.style.position=g.style.top="",e.style.overflow="hidden",e.style.position="relative",j.subtractsBorderForOverflowNotVisible=g.offsetTop===-5,j.doesNotIncludeMarginInBodyOffset=u.offsetTop!==m,a.getComputedStyle&&(p.style.marginTop="1%",b.pixelMargin=(a.getComputedStyle(p,null)||{marginTop:0}).marginTop!=="1%"),typeof d.style.zoom!="undefined"&&(d.style.zoom=1),u.removeChild(d),l=p=d=null,f.extend(b,j))});return b}();var j=/^(?:\{.*\}|\[.*\])$/,k=/([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!m(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i,j=f.expando,k=typeof c=="string",l=a.nodeType,m=l?f.cache:a,n=l?a[j]:a[j]&&j,o=c==="events";if((!n||!m[n]||!o&&!e&&!m[n].data)&&k&&d===b)return;n||(l?a[j]=n=++f.uuid:n=j),m[n]||(m[n]={},l||(m[n].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?m[n]=f.extend(m[n],c):m[n].data=f.extend(m[n].data,c);g=h=m[n],e||(h.data||(h.data={}),h=h.data),d!==b&&(h[f.camelCase(c)]=d);if(o&&!h[c])return g.events;k?(i=h[c],i==null&&(i=h[f.camelCase(c)])):i=h;return i}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e,g,h=f.expando,i=a.nodeType,j=i?f.cache:a,k=i?a[h]:h;if(!j[k])return;if(b){d=c?j[k]:j[k].data;if(d){f.isArray(b)||(b in d?b=[b]:(b=f.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,g=b.length;e1,null,!1)},removeData:function(a){return this.each(function(){f.removeData(this,a)})}}),f.extend({_mark:function(a,b){a&&(b=(b||"fx")+"mark",f._data(a,b,(f._data(a,b)||0)+1))},_unmark:function(a,b,c){a!==!0&&(c=b,b=a,a=!1);if(b){c=c||"fx";var d=c+"mark",e=a?0:(f._data(b,d)||1)-1;e?f._data(b,d,e):(f.removeData(b,d,!0),n(b,c,"mark"))}},queue:function(a,b,c){var d;if(a){b=(b||"fx")+"queue",d=f._data(a,b),c&&(!d||f.isArray(c)?d=f._data(a,b,f.makeArray(c)):d.push(c));return d||[]}},dequeue:function(a,b){b=b||"fx";var c=f.queue(a,b),d=c.shift(),e={};d==="inprogress"&&(d=c.shift()),d&&(b==="fx"&&c.unshift("inprogress"),f._data(a,b+".run",e),d.call(a,function(){f.dequeue(a,b)},e)),c.length||(f.removeData(a,b+"queue "+b+".run",!0),n(a,b,"queue"))}}),f.fn.extend({queue:function(a,c){var d=2;typeof a!="string"&&(c=a,a="fx",d--);if(arguments.length1)},removeAttr:function(a){return this.each(function(){f.removeAttr(this,a)})},prop:function(a,b){return f.access(this,f.prop,a,b,arguments.length>1)},removeProp:function(a){a=f.propFix[a]||a;return this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,g,h,i;if(f.isFunction(a))return this.each(function(b){f(this).addClass(a.call(this,b,this.className))});if(a&&typeof a=="string"){b=a.split(p);for(c=0,d=this.length;c-1)return!0;return!1},val:function(a){var c,d,e,g=this[0];{if(!!arguments.length){e=f.isFunction(a);return this.each(function(d){var g=f(this),h;if(this.nodeType===1){e?h=a.call(this,d,g.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.type]||f.valHooks[this.nodeName.toLowerCase()];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}if(g){c=f.valHooks[g.type]||f.valHooks[g.nodeName.toLowerCase()];if(c&&"get"in c&&(d=c.get(g,"value"))!==b)return d;d=g.value;return typeof d=="string"?d.replace(q,""):d==null?"":d}}}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,g=a.selectedIndex,h=[],i=a.options,j=a.type==="select-one";if(g<0)return null;c=j?g:0,d=j?g+1:i.length;for(;c=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,d,e){var g,h,i,j=a.nodeType;if(!!a&&j!==3&&j!==8&&j!==2){if(e&&c in f.attrFn)return f(a)[c](d);if(typeof a.getAttribute=="undefined")return f.prop(a,c,d);i=j!==1||!f.isXMLDoc(a),i&&(c=c.toLowerCase(),h=f.attrHooks[c]||(u.test(c)?x:w));if(d!==b){if(d===null){f.removeAttr(a,c);return}if(h&&"set"in h&&i&&(g=h.set(a,d,c))!==b)return g;a.setAttribute(c,""+d);return d}if(h&&"get"in h&&i&&(g=h.get(a,c))!==null)return g;g=a.getAttribute(c);return g===null?b:g}},removeAttr:function(a,b){var c,d,e,g,h,i=0;if(b&&a.nodeType===1){d=b.toLowerCase().split(p),g=d.length;for(;i=0}})});var z=/^(?:textarea|input|select)$/i,A=/^([^\.]*)?(?:\.(.+))?$/,B=/(?:^|\s)hover(\.\S+)?\b/,C=/^key/,D=/^(?:mouse|contextmenu)|click/,E=/^(?:focusinfocus|focusoutblur)$/,F=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,G=function( +a){var b=F.exec(a);b&&(b[1]=(b[1]||"").toLowerCase(),b[3]=b[3]&&new RegExp("(?:^|\\s)"+b[3]+"(?:\\s|$)"));return b},H=function(a,b){var c=a.attributes||{};return(!b[1]||a.nodeName.toLowerCase()===b[1])&&(!b[2]||(c.id||{}).value===b[2])&&(!b[3]||b[3].test((c["class"]||{}).value))},I=function(a){return f.event.special.hover?a:a.replace(B,"mouseenter$1 mouseleave$1")};f.event={add:function(a,c,d,e,g){var h,i,j,k,l,m,n,o,p,q,r,s;if(!(a.nodeType===3||a.nodeType===8||!c||!d||!(h=f._data(a)))){d.handler&&(p=d,d=p.handler,g=p.selector),d.guid||(d.guid=f.guid++),j=h.events,j||(h.events=j={}),i=h.handle,i||(h.handle=i=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.dispatch.apply(i.elem,arguments):b},i.elem=a),c=f.trim(I(c)).split(" ");for(k=0;k=0&&(h=h.slice(0,-1),k=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if((!e||f.event.customEvent[h])&&!f.event.global[h])return;c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.isTrigger=!0,c.exclusive=k,c.namespace=i.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)"):null,o=h.indexOf(":")<0?"on"+h:"";if(!e){j=f.cache;for(l in j)j[l].events&&j[l].events[h]&&f.event.trigger(c,d,j[l].handle.elem,!0);return}c.result=b,c.target||(c.target=e),d=d!=null?f.makeArray(d):[],d.unshift(c),p=f.event.special[h]||{};if(p.trigger&&p.trigger.apply(e,d)===!1)return;r=[[e,p.bindType||h]];if(!g&&!p.noBubble&&!f.isWindow(e)){s=p.delegateType||h,m=E.test(s+h)?e:e.parentNode,n=null;for(;m;m=m.parentNode)r.push([m,s]),n=m;n&&n===e.ownerDocument&&r.push([n.defaultView||n.parentWindow||a,s])}for(l=0;le&&j.push({elem:this,matches:d.slice(e)});for(k=0;k0?this.on(b,null,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0),C.test(b)&&(f.event.fixHooks[b]=f.event.keyHooks),D.test(b)&&(f.event.fixHooks[b]=f.event.mouseHooks)}),function(){function x(a,b,c,e,f,g){for(var h=0,i=e.length;h0){k=j;break}}j=j[a]}e[h]=k}}}function w(a,b,c,e,f,g){for(var h=0,i=e.length;h+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d="sizcache"+(Math.random()+"").replace(".",""),e=0,g=Object.prototype.toString,h=!1,i=!0,j=/\\/g,k=/\r\n/g,l=/\W/;[0,0].sort(function(){i=!1;return 0});var m=function(b,d,e,f){e=e||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return e;var i,j,k,l,n,q,r,t,u=!0,v=m.isXML(d),w=[],x=b;do{a.exec(""),i=a.exec(x);if(i){x=i[3],w.push(i[1]);if(i[2]){l=i[3];break}}}while(i);if(w.length>1&&p.exec(b))if(w.length===2&&o.relative[w[0]])j=y(w[0]+w[1],d,f);else{j=o.relative[w[0]]?[d]:m(w.shift(),d);while(w.length)b=w.shift(),o.relative[b]&&(b+=w.shift()),j=y(b,j,f)}else{!f&&w.length>1&&d.nodeType===9&&!v&&o.match.ID.test(w[0])&&!o.match.ID.test(w[w.length-1])&&(n=m.find(w.shift(),d,v),d=n.expr?m.filter(n.expr,n.set)[0]:n.set[0]);if(d){n=f?{expr:w.pop(),set:s(f)}:m.find(w.pop(),w.length===1&&(w[0]==="~"||w[0]==="+")&&d.parentNode?d.parentNode:d,v),j=n.expr?m.filter(n.expr,n.set):n.set,w.length>0?k=s(j):u=!1;while(w.length)q=w.pop(),r=q,o.relative[q]?r=w.pop():q="",r==null&&(r=d),o.relative[q](k,r,v)}else k=w=[]}k||(k=j),k||m.error(q||b);if(g.call(k)==="[object Array]")if(!u)e.push.apply(e,k);else if(d&&d.nodeType===1)for(t=0;k[t]!=null;t++)k[t]&&(k[t]===!0||k[t].nodeType===1&&m.contains(d,k[t]))&&e.push(j[t]);else for(t=0;k[t]!=null;t++)k[t]&&k[t].nodeType===1&&e.push(j[t]);else s(k,e);l&&(m(l,h,e,f),m.uniqueSort(e));return e};m.uniqueSort=function(a){if(u){h=i,a.sort(u);if(h)for(var b=1;b0},m.find=function(a,b,c){var d,e,f,g,h,i;if(!a)return[];for(e=0,f=o.order.length;e":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!l.test(b)){b=b.toLowerCase();for(;e=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(j,"")},TAG:function(a,b){return a[1].replace(j,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||m.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&m.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(j,"");!f&&o.attrMap[g]&&(a[1]=o.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(j,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=m(b[3],null,null,c);else{var g=m.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(o.match.POS.test(b[0])||o.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!m(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return bc[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=o.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||n([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||!!a.nodeName&&a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=m.attr?m.attr(a,c):o.attrHandle[c]?o.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":!f&&m.attr?d!=null:f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=o.setFilters[e];if(f)return f(a,c,b,d)}}},p=o.match.POS,q=function(a,b){return"\\"+(b-0+1)};for(var r in o.match)o.match[r]=new RegExp(o.match[r].source+/(?![^\[]*\])(?![^\(]*\))/.source),o.leftMatch[r]=new RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[r].source.replace(/\\(\d+)/g,q));o.match.globalPOS=p;var s=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(t){s=function(a,b){var c=0,d=b||[];if(g.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var e=a.length;c",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(o.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},o.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(o.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(o.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=m,b=c.createElement("div"),d="__sizzle__";b.innerHTML="

      ";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){m=function(b,e,f,g){e=e||c;if(!g&&!m.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return s(e.getElementsByTagName(b),f);if(h[2]&&o.find.CLASS&&e.getElementsByClassName)return s(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return s([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return s([],f);if(i.id===h[3])return s([i],f)}try{return s(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var k=e,l=e.getAttribute("id"),n=l||d,p=e.parentNode,q=/^\s*[+~]/.test(b);l?n=n.replace(/'/g,"\\$&"):e.setAttribute("id",n),q&&p&&(e=e.parentNode);try{if(!q||p)return s(e.querySelectorAll("[id='"+n+"'] "+b),f)}catch(r){}finally{l||k.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)m[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}m.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!m.isXML(a))try{if(e||!o.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return m(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="
      ";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;o.order.splice(1,0,"CLASS"),o.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?m.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?m.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:m.contains=function(){return!1},m.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var y=function(a,b,c){var d,e=[],f="",g=b.nodeType?[b]:b;while(d=o.match.PSEUDO.exec(a))f+=d[0],a=a.replace(o.match.PSEUDO,"");a=o.relative[a]?a+"*":a;for(var h=0,i=g.length;h0)for(h=g;h=0:f.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h=1;while(g&&g.ownerDocument&&g!==b){for(d=0;d-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a)return this[0]&&this[0].parentNode?this.prevAll().length:-1;if(typeof a=="string")return f.inArray(this[0],f(a));return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(S(c[0])||S(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c);L.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!R[a]?f.unique(e):e,(this.length>1||N.test(d))&&M.test(a)&&(e=e.reverse());return this.pushStack(e,a,P.call(arguments).join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var V="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",W=/ jQuery\d+="(?:\d+|null)"/g,X=/^\s+/,Y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Z=/<([\w:]+)/,$=/]","i"),bd=/checked\s*(?:[^=]|=\s*.checked.)/i,be=/\/(java|ecma)script/i,bf=/^\s*",""],legend:[1,"
      ","
      "],thead:[1,"","
      "],tr:[2,"","
      "],td:[3,"","
      "],col:[2,"","
      "],area:[1,"",""],_default:[0,"",""]},bh=U(c);bg.optgroup=bg.option,bg.tbody=bg.tfoot=bg.colgroup=bg.caption=bg.thead,bg.th=bg.td,f.support.htmlSerialize||(bg._default=[1,"div
      ","
      "]),f.fn.extend({text:function(a){return f.access(this,function(a){return a===b?f.text(this):this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a))},null,a,arguments.length)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=f.isFunction(a);return this.each(function(c){f(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f +.clean(arguments);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f.clean(arguments));return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){return f.access(this,function(a){var c=this[0]||{},d=0,e=this.length;if(a===b)return c.nodeType===1?c.innerHTML.replace(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!bg[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1>");try{for(;d1&&l0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d,e,g,h=f.support.html5Clone||f.isXMLDoc(a)||!bc.test("<"+a.nodeName+">")?a.cloneNode(!0):bo(a);if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bk(a,h),d=bl(a),e=bl(h);for(g=0;d[g];++g)e[g]&&bk(d[g],e[g])}if(b){bj(a,h);if(c){d=bl(a),e=bl(h);for(g=0;d[g];++g)bj(d[g],e[g])}}d=e=null;return h},clean:function(a,b,d,e){var g,h,i,j=[];b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);for(var k=0,l;(l=a[k])!=null;k++){typeof l=="number"&&(l+="");if(!l)continue;if(typeof l=="string")if(!_.test(l))l=b.createTextNode(l);else{l=l.replace(Y,"<$1>");var m=(Z.exec(l)||["",""])[1].toLowerCase(),n=bg[m]||bg._default,o=n[0],p=b.createElement("div"),q=bh.childNodes,r;b===c?bh.appendChild(p):U(b).appendChild(p),p.innerHTML=n[1]+l+n[2];while(o--)p=p.lastChild;if(!f.support.tbody){var s=$.test(l),t=m==="table"&&!s?p.firstChild&&p.firstChild.childNodes:n[1]===""&&!s?p.childNodes:[];for(i=t.length-1;i>=0;--i)f.nodeName(t[i],"tbody")&&!t[i].childNodes.length&&t[i].parentNode.removeChild(t[i])}!f.support.leadingWhitespace&&X.test(l)&&p.insertBefore(b.createTextNode(X.exec(l)[0]),p.firstChild),l=p.childNodes,p&&(p.parentNode.removeChild(p),q.length>0&&(r=q[q.length-1],r&&r.parentNode&&r.parentNode.removeChild(r)))}var u;if(!f.support.appendChecked)if(l[0]&&typeof (u=l.length)=="number")for(i=0;i1)},f.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=by(a,"opacity");return c===""?"1":c}return a.style.opacity}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":f.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(!!a&&a.nodeType!==3&&a.nodeType!==8&&!!a.style){var g,h,i=f.camelCase(c),j=a.style,k=f.cssHooks[i];c=f.cssProps[i]||i;if(d===b){if(k&&"get"in k&&(g=k.get(a,!1,e))!==b)return g;return j[c]}h=typeof d,h==="string"&&(g=bu.exec(d))&&(d=+(g[1]+1)*+g[2]+parseFloat(f.css(a,c)),h="number");if(d==null||h==="number"&&isNaN(d))return;h==="number"&&!f.cssNumber[i]&&(d+="px");if(!k||!("set"in k)||(d=k.set(a,d))!==b)try{j[c]=d}catch(l){}}},css:function(a,c,d){var e,g;c=f.camelCase(c),g=f.cssHooks[c],c=f.cssProps[c]||c,c==="cssFloat"&&(c="float");if(g&&"get"in g&&(e=g.get(a,!0,d))!==b)return e;if(by)return by(a,c)},swap:function(a,b,c){var d={},e,f;for(f in b)d[f]=a.style[f],a.style[f]=b[f];e=c.call(a);for(f in b)a.style[f]=d[f];return e}}),f.curCSS=f.css,c.defaultView&&c.defaultView.getComputedStyle&&(bz=function(a,b){var c,d,e,g,h=a.style;b=b.replace(br,"-$1").toLowerCase(),(d=a.ownerDocument.defaultView)&&(e=d.getComputedStyle(a,null))&&(c=e.getPropertyValue(b),c===""&&!f.contains(a.ownerDocument.documentElement,a)&&(c=f.style(a,b))),!f.support.pixelMargin&&e&&bv.test(b)&&bt.test(c)&&(g=h.width,h.width=c,c=e.width,h.width=g);return c}),c.documentElement.currentStyle&&(bA=function(a,b){var c,d,e,f=a.currentStyle&&a.currentStyle[b],g=a.style;f==null&&g&&(e=g[b])&&(f=e),bt.test(f)&&(c=g.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),g.left=b==="fontSize"?"1em":f,f=g.pixelLeft+"px",g.left=c,d&&(a.runtimeStyle.left=d));return f===""?"auto":f}),by=bz||bA,f.each(["height","width"],function(a,b){f.cssHooks[b]={get:function(a,c,d){if(c)return a.offsetWidth!==0?bB(a,b,d):f.swap(a,bw,function(){return bB(a,b,d)})},set:function(a,b){return bs.test(b)?b+"px":b}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return bq.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNumeric(b)?"alpha(opacity="+b*100+")":"",g=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&f.trim(g.replace(bp,""))===""){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bp.test(g)?g.replace(bp,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){return f.swap(a,{display:"inline-block"},function(){return b?by(a,"margin-right"):a.style.marginRight})}})}),f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style&&a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)}),f.each({margin:"",padding:"",border:"Width"},function(a,b){f.cssHooks[a+b]={expand:function(c){var d,e=typeof c=="string"?c.split(" "):[c],f={};for(d=0;d<4;d++)f[a+bx[d]+b]=e[d]||e[d-2]||e[0];return f}}});var bC=/%20/g,bD=/\[\]$/,bE=/\r?\n/g,bF=/#.*$/,bG=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bH=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bI=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bJ=/^(?:GET|HEAD)$/,bK=/^\/\//,bL=/\?/,bM=/)<[^<]*)*<\/script>/gi,bN=/^(?:select|textarea)/i,bO=/\s+/,bP=/([?&])_=[^&]*/,bQ=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bR=f.fn.load,bS={},bT={},bU,bV,bW=["*/"]+["*"];try{bU=e.href}catch(bX){bU=c.createElement("a"),bU.href="",bU=bU.href}bV=bQ.exec(bU.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bR)return bR.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("
      ").append(c.replace(bM,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bN.test(this.nodeName)||bH.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bE,"\r\n")}}):{name:b.name,value:c.replace(bE,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.on(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?b$(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),b$(a,b);return a},ajaxSettings:{url:bU,isLocal:bI.test(bV[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded; charset=UTF-8",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":bW},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:bY(bS),ajaxTransport:bY(bT),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?ca(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader("Last-Modified"))f.lastModified[k]=y;if(z=v.getResponseHeader("Etag"))f.etag[k]=z}if(a===304)w="notmodified",o=!0;else try{r=cb(d,x),w="success",o=!0}catch(A){w="parsererror",u=A}}else{u=w;if(!w||a)w="error",a<0&&(a=0)}v.status=a,v.statusText=""+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.fireWith(e,[v,w]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f.Callbacks("once memory"),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bG.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.add,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bF,"").replace(bK,bV[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bO),d.crossDomain==null&&(r=bQ.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bV[1]&&r[2]==bV[2]&&(r[3]||(r[1]==="http:"?80:443))==(bV[3]||(bV[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),bZ(bS,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bJ.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bL.test(d.url)?"&":"?")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bP,"$1_="+x);d.url=y+(y===d.url?(bL.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", "+bW+"; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=bZ(bT,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){if(s<2)w(-1,z);else throw z}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)b_(g,a[g],c,e);return d.join("&").replace(bC,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var cc=f.now(),cd=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+cc++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=typeof b.data=="string"&&/^application\/x\-www\-form\-urlencoded/.test(b.contentType);if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(cd.test(b.url)||e&&cd.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(cd,l),b.url===j&&(e&&(k=k.replace(cd,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var ce=a.ActiveXObject?function(){for(var a in cg)cg[a](0,1)}:!1,cf=0,cg;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ch()||ci()}:ch,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,ce&&delete cg[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n);try{m.text=h.responseText}catch(a){}try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cf,ce&&(cg||(cg={},f(a).unload(ce)),cg[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var cj={},ck,cl,cm=/^(?:toggle|show|hide)$/,cn=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,co,cp=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cq;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(ct("show",3),a,b,c);for(var g=0,h=this.length;g=i.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),i.animatedProperties[this.prop]=!0;for(b in i.animatedProperties)i.animatedProperties[b]!==!0&&(g=!1);if(g){i.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){h.style["overflow"+b]=i.overflow[a]}),i.hide&&f(h).hide();if(i.hide||i.show)for(b in i.animatedProperties)f.style(h,b,i.orig[b]),f.removeData(h,"fxshow"+b,!0),f.removeData(h,"toggle"+b,!0);d=i.complete,d&&(i.complete=!1,d.call(h))}return!1}i.duration==Infinity?this.now=e:(c=e-this.startTime,this.state=c/i.duration,this.pos=f.easing[i.animatedProperties[this.prop]](this.state,c,0,1,i.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){var a,b=f.timers,c=0;for(;c-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cx.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cx.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,c){var d=/Y/.test(c);f.fn[a]=function(e){return f.access(this,function(a,e,g){var h=cy(a);if(g===b)return h?c in h?h[c]:f.support.boxModel&&h.document.documentElement[e]||h.document.body[e]:a[e];h?h.scrollTo(d?f(h).scrollLeft():g,d?g:f(h).scrollTop()):a[e]=g},a,e,arguments.length,null)}}),f.each({Height:"height",Width:"width"},function(a,c){var d="client"+a,e="scroll"+a,g="offset"+a;f.fn["inner"+a]=function(){var a=this[0];return a?a.style?parseFloat(f.css(a,c,"padding")):this[c]():null},f.fn["outer"+a]=function(a){var b=this[0];return b?b.style?parseFloat(f.css(b,c,a?"margin":"border")):this[c]():null},f.fn[c]=function(a){return f.access(this,function(a,c,h){var i,j,k,l;if(f.isWindow(a)){i=a.document,j=i.documentElement[d];return f.support.boxModel&&j||i.body&&i.body[d]||j}if(a.nodeType===9){i=a.documentElement;if(i[d]>=i[e])return i[d];return Math.max(a.body[e],i[e],a.body[g],i[g])}if(h===b){k=f.css(a,c),l=parseFloat(k);return f.isNumeric(l)?l:k}f(a).css(c,h)},c,a,arguments.length,null)}}),a.jQuery=a.$=f,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return f})})(window); \ No newline at end of file diff --git a/includes/lib_cdr.php b/includes/lib_cdr.php new file mode 100644 index 0000000000..911bf39c89 --- /dev/null +++ b/includes/lib_cdr.php @@ -0,0 +1,100 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +/* +if ($db_type == "sqlite") { + try { + if (strlen($dbfilename) == 0) { + //if (strlen($_SERVER["SERVER_NAME"]) == 0) { $_SERVER["SERVER_NAME"] = "http://localhost"; } + $server_name = $_SERVER["SERVER_NAME"]; + $server_name = str_replace ("www.", "", $server_name); + $server_name = str_replace ("example.net", "example.com", $server_name); + //$server_name = str_replace (".", "_", $server_name); + $dbfilenameshort = $server_name; + $dbfilename = $server_name.'.db'; + } + else { + $dbfilenameshort = $dbfilename; + } + $db_file_path = str_replace("\\", "/", $db_file_path); + + + if (file_exists($db_file_path.'/'.$dbfilename)) { + //echo "main file exists
      "; + } + else { //file doese not exist + + //--- begin: create the sqlite db file ----------------------------------------- + $filename = $_SERVER["DOCUMENT_ROOT"].PROJECT_PATH.'/includes/install/sql/sqlite.sql'; + $file_contents = file_get_contents($filename); + //echo "
      \n";
      +				//echo $file_contents;
      +				//echo "
      \n"; + //exit; + + //replace \r\n with \n then explode on \n + $file_contents = str_replace("\r\n", "\n", $file_contents); + + //loop line by line through all the lines of sql code + $stringarray = explode("\n", $file_contents); + $x = 0; + foreach($stringarray as $sql) { + //create the call detail records database + if (strtolower(substr($sql, 0, 18)) == "create table v_cdr") { + try { + $dbcdr = new PDO('sqlite:'.$db_file_path.'/'.$dbfilenameshort.'.cdr.db'); //sqlite 3 + $dbcdr->query($sql); + unset($dbcdr); + } + catch (PDOException $error) { + print "error: " . $error->getMessage() . "
      "; + die(); + } + } + $x++; + } + unset ($file_contents, $sql); + //--- end: create the sqlite db ----------------------------------------- + + if (is_writable($db_file_path.'/'.$dbfilename)) { //is writable + //use database in current location + } + else { //not writable + echo "The database ".$db_file_path."/".$dbfilename." is not writeable2."; + exit; + } + } + + unset($db); + //$db = new PDO('sqlite::memory:'); //sqlite 3 + $db = new PDO('sqlite:'.$db_file_path.'/'.$dbfilenameshort.'.cdr.db'); //sqlite 3 + } + catch (PDOException $error) { + print "error: " . $error->getMessage() . "
      "; + die(); + } +} +*/ +?> \ No newline at end of file diff --git a/includes/lib_functions.php b/includes/lib_functions.php new file mode 100644 index 0000000000..6b2f514232 --- /dev/null +++ b/includes/lib_functions.php @@ -0,0 +1,948 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ + + if (!function_exists('software_version')) { + function software_version() { + return '3.0.4'; + } + } + + if (!function_exists('check_str')) { + function check_str($string) { + global $db_type; + //when code in db is urlencoded the ' does not need to be modified + if ($db_type == "sqlite") { + if (function_exists('sqlite_escape_string')) { + $string = sqlite_escape_string($string); + } + else { + $string = str_replace("''","'",$string); + } + } + if ($db_type == "pgsql") { + $string = pg_escape_string($string); + } + if ($db_type == "mysql") { + $tmp_str = mysql_real_escape_string($string); + if (strlen($tmp_str)) { + $string = $tmp_str; + } + else { + $search = array("\x00", "\n", "\r", "\\", "'", "\"", "\x1a"); + $replace = array("\\x00", "\\n", "\\r", "\\\\" ,"\'", "\\\"", "\\\x1a"); + $string = str_replace($search, $replace, $string); + } + } + return trim($string); //remove white space + } + } + + if (!function_exists('check_sql')) { + function check_sql($string) { + return trim($string); //remove white space + } + } + + if (!function_exists('uuid')) { + function uuid() { + //uuid version 4 + return sprintf( '%04x%04x-%04x-%04x-%04x-%04x%04x%04x', + // 32 bits for "time_low" + mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff ), + + // 16 bits for "time_mid" + mt_rand( 0, 0xffff ), + + // 16 bits for "time_hi_and_version", + // four most significant bits holds version number 4 + mt_rand( 0, 0x0fff ) | 0x4000, + + // 16 bits, 8 bits for "clk_seq_hi_res", + // 8 bits for "clk_seq_low", + // two most significant bits holds zero and one for variant DCE1.1 + mt_rand( 0, 0x3fff ) | 0x8000, + + // 48 bits for "node" + mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff ) + ); + } + //echo uuid(); + } + + if (!function_exists('recursive_copy')) { + function recursive_copy($src,$dst) { + $dir = opendir($src); + if (!$dir) { + throw new Exception("recursive_copy() source directory '".$src."' does not exist."); + } + if (!is_dir($dst)) { + if (!mkdir($dst)) { + throw new Exception("recursive_copy() failed to create destination directory '".$dst."'"); + } + } + while(false !== ( $file = readdir($dir)) ) { + if (( $file != '.' ) && ( $file != '..' )) { + if ( is_dir($src . '/' . $file) ) { + recursive_copy($src . '/' . $file,$dst . '/' . $file); + } + else { + copy($src . '/' . $file,$dst . '/' . $file); + } + } + } + closedir($dir); + } + } + + if (!function_exists('if_group')) { + function if_group($group) { + //set default false + $result = false; + //search for the permission + if (count($_SESSION["groups"]) > 0) { + foreach($_SESSION["groups"] as $row) { + if ($row['group_name'] == $group) { + $result = true; + break; + } + } + } + //return the result + return $result; + } + } + + if (!function_exists('permission_exists')) { + function permission_exists($permission) { + //set default false + $result = false; + //search for the permission + if (count($_SESSION["permissions"]) > 0) { + foreach($_SESSION["permissions"] as $row) { + if ($row['permission_name'] == $permission) { + $result = true; + break; + } + } + } + //return the result + return $result; + } + } + + if (!function_exists('group_members')) { + function group_members($db, $user_uuid) { + global $domain_uuid; + $sql = "select * from v_group_users "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and user_uuid = '".$user_uuid."' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + $result_count = count($result); + $group_members = "||"; + foreach($result as $field) { + //get the list of groups + $group_members .= $field['group_name']."||"; + } + unset($sql, $result, $row_count); + return $group_members; + } + } + + if (!function_exists('if_group_member')) { + function if_group_member($group_members, $group) { + if (stripos($group_members, "||".$group."||") === false) { + return false; //group does not exist + } + else { + return true; //group exists + } + } + } + + if (!function_exists('superadmin_list')) { + function superadmin_list($db) { + global $domain_uuid; + $sql = "select * from v_group_users "; + $sql .= "where group_name = 'superadmin' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + $result_count = count($result); + $superadmin_list = "||"; + foreach($result as $field) { + //get the list of superadmins + $superadmin_list .= $field['user_uuid']."||"; + } + unset($sql, $result, $row_count); + return $superadmin_list; + } + } + //superadmin_list($db); + + if (!function_exists('if_superadmin')) { + function if_superadmin($superadmin_list, $user_uuid) { + if (stripos($superadmin_list, "||".$user_uuid."||") === false) { + return false; //user_uuid does not exist + } + else { + return true; //user_uuid exists + } + } + } + + if (!function_exists('html_select_other')) { + function html_select_other($db, $table_name, $field_name, $sql_where_optional, $field_current_value) { + //html select other : build a select box from distinct items in db with option for other + global $domain_uuid; + + $html = "
      \n"; + $html .= "\n"; + $html .= "\n"; + $html .= "\n"; + $html .= "\n"; + $html .= "
      \n"; + $html .= "\n"; + $html .= "\n"; + $html .= "\n"; + $html .= "\n"; + $html .= "
      "; + + return $html; + } + } + + if (!function_exists('html_select')) { + function html_select($db, $table_name, $field_name, $sql_where_optional, $field_current_value, $field_value = '', $style = '') { + //html select other : build a select box from distinct items in db with option for other + global $domain_uuid; + + if (strlen($field_value) > 0) { + $html .= "\n"; + $html .= "\n"; + $sql = "SELECT distinct($field_name) as $field_name FROM $table_name $sql_where_optional "; + } + + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + $result_count = count($result); + if ($result_count > 0) { //if user account exists then show login + foreach($result as $field) { + if (strlen($field[$field_name]) > 0) { + if ($field_current_value == $field[$field_name]) { + if (strlen($field_value) > 0) { + $html .= "\n"; + } + else { + $html .= "\n"; + } + } + else { + if (strlen($field_value) > 0) { + $html .= "\n"; + } + else { + $html .= "\n"; + } + } + } + } + } + unset($sql, $result, $result_count); + $html .= "\n"; + + return $html; + } + } + //$table_name = 'v_templates'; $field_name = 'templatename'; $sql_where_optional = "where domain_uuid = '$domain_uuid' "; $field_current_value = ''; + //echo html_select($db, $table_name, $field_name, $sql_where_optional, $field_current_value); + + if (!function_exists('html_select_on_change')) { + function html_select_on_change($db, $table_name, $field_name, $sql_where_optional, $field_current_value, $onchange, $field_value = '') { + //html select other : build a select box from distinct items in db with option for other + global $domain_uuid; + + $html .= "\n"; + + return $html; + } + } + + if (!function_exists('th_order_by')) { + //html table header order by + function th_order_by($field_name, $columntitle, $order_by, $order) { + + $html = "    "; + if (strlen($order_by)==0) { + $html .= "$columntitle"; + } + else { + if ($order=="asc") { + $html .= "$columntitle"; + } + else { + $html .= "$columntitle"; + } + } + $html .= "    "; + return $html; + } + } + ////example usage + //$table_name = 'tblcontacts'; $field_name = 'contactcategory'; $sql_where_optional = "", $field_current_value =''; + //echo html_select_other($db, $table_name, $field_name, $sql_where_optional, $field_current_value); + //// On the page that recieves the POST + //if (check_str($_POST["contactcategory"]) == "Other") { //echo "found: ".$contactcategory; + // $contactcategory = check_str($_POST["contactcategoryother"]); + //} + + if (!function_exists('log_add')) { + function log_add($db, $log_type, $log_status, $log_desc, $log_add_user, $log_add_user_ip) { + return; //this disables the function + global $domain_uuid; + + $sql = "insert into logs "; + $sql .= "("; + $sql .= "log_type, "; + $sql .= "log_status, "; + $sql .= "log_desc, "; + $sql .= "log_add_user, "; + $sql .= "log_add_user_ip, "; + $sql .= "log_add_date "; + $sql .= ")"; + $sql .= "values "; + $sql .= "("; + $sql .= "'$log_type', "; + $sql .= "'$log_status', "; + $sql .= "'$log_desc', "; + $sql .= "'$log_add_user', "; + $sql .= "'$log_add_user_ip', "; + $sql .= "now() "; + $sql .= ")"; + $db->exec(check_sql($sql)); + unset($sql); + } + } + //$log_type = ''; $log_status=''; $log_add_user=''; $log_desc=''; + //log_add($db, $log_type, $log_status, $log_desc, $log_add_user, $_SERVER["REMOTE_ADDR"]); + + if (!function_exists('get_ext')) { + function get_ext($filename) { + preg_match('/[^?]*/', $filename, $matches); + $string = $matches[0]; + + $pattern = preg_split('/\./', $string, -1, PREG_SPLIT_OFFSET_CAPTURE); + + // check if there is any extension + if(count($pattern) == 1){ + //echo 'No File Extension Present'; + return ''; + } + + if(count($pattern) > 1) { + $filenamepart = $pattern[count($pattern)-1][0]; + preg_match('/[^?]*/', $filenamepart, $matches); + return $matches[0]; + } + } + //echo "ext: ".get_ext('test.txt'); + } + + if (!function_exists('file_upload')) { + function file_upload($field = '', $file_type = '', $dest_dir = '') { + + $uploadtempdir = $_ENV["TEMP"]."\\"; + ini_set('upload_tmp_dir', $uploadtempdir); + + $tmp_name = $_FILES[$field]["tmp_name"]; + $file_name = $_FILES[$field]["name"]; + $file_type = $_FILES[$field]["type"]; + $file_size = $_FILES[$field]["size"]; + $file_ext = get_ext($file_name); + $file_name_orig = $file_name; + $file_name_base = substr($file_name, 0, (strlen($file_name) - (strlen($file_ext)+1))); + //$dest_dir = '/tmp'; + + if ($file_size == 0){ + return; + } + + if (!is_dir($dest_dir)) { + echo "dest_dir not found
      \n"; + return; + } + + //check if allowed file type + if ($file_type == "img") { + switch (strtolower($file_ext)) { + case "jpg": + break; + case "png": + break; + case "gif": + break; + case "bmp": + break; + case "psd": + break; + case "tif": + break; + default: + return false; + } + } + if ($file_type == "file") { + switch (strtolower($file_ext)) { + case "doc": + break; + case "pdf": + break; + case "ppt": + break; + case "xls": + break; + case "zip": + break; + case "exe": + break; + default: + return false; + } + } + + //find unique filename: check if file exists if it does then increment the filename + $i = 1; + while( file_exists($dest_dir.'/'.$file_name)) { + if (strlen($file_ext)> 0) { + $file_name = $file_name_base . $i .'.'. $file_ext; + } + else { + $file_name = $file_name_orig . $i; + } + $i++; + } + + //echo "file_type: ".$file_type."
      \n"; + //echo "tmp_name: ".$tmp_name."
      \n"; + //echo "file_name: ".$file_name."
      \n"; + //echo "file_ext: ".$file_ext."
      \n"; + //echo "file_name_orig: ".$file_name_orig."
      \n"; + //echo "file_name_base: ".$file_name_base."
      \n"; + //echo "dest_dir: ".$dest_dir."
      \n"; + + //move the file to upload directory + //bool move_uploaded_file ( string $filename, string $destination ) + + if (move_uploaded_file($tmp_name, $dest_dir.'/'.$file_name)){ + return $file_name; + } + else { + echo "File upload failed! Here's some debugging info:\n"; + return false; + } + exit; + + } //end function + } + + if ( !function_exists('sys_get_temp_dir')) { + function sys_get_temp_dir() { + if( $temp=getenv('TMP') ) return $temp; + if( $temp=getenv('TEMP') ) return $temp; + if( $temp=getenv('TMPDIR') ) return $temp; + $temp=tempnam(__FILE__,''); + if (file_exists($temp)) { + unlink($temp); + return dirname($temp); + } + return null; + } + } + //echo realpath(sys_get_temp_dir()); + + if (!function_exists('username_exists')) { + function username_exists($username) { + global $db, $domain_uuid; + $sql = "select * from v_users "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and username = '".$username."' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + $result_count = count($result); + if ($result_count > 0) { + return true; + } + else { + return false; + } + } + } + + if (!function_exists('add_extension_user')) { + function add_extension_user($extension_uuid, $username) { + global $db, $domain_uuid; + //get the user_uuid by using the username + $sql = "select * from v_users "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and username = '$username' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + unset($prep_statement); + foreach ($result as &$row) { + //check if the user_uuid exists in v_extension_users + $sql = "select * from v_extension_users "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and user_uuid = '".$row["user_uuid"]."' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $extension_users_result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + unset($prep_statement); + //assign the extension to the user + if (count($extension_users_result) == 0) { + $sql = "insert into v_extension_users "; + $sql .= "("; + $sql .= "domain_uuid, "; + $sql .= "extension_uuid, "; + $sql .= "user_uuid "; + $sql .= ") "; + $sql .= "values "; + $sql .= "("; + $sql .= "'$domain_uuid', "; + $sql .= "'$extension_uuid', "; + $sql .= "'".$row["user_uuid"]."' "; + $sql .= ")"; + $db->exec(check_sql($sql)); + unset($sql); + } + } + unset ($result); + } + } + + if (!function_exists('user_add')) { + function user_add($username, $password, $user_email='') { + global $db, $domain_uuid, $v_salt; + $user_uuid = uuid(); + if (strlen($username) == 0) { return false; } + if (strlen($password) == 0) { return false; } + if (!username_exists($username)) { + //salt used with the password to create a one way hash + $salt = generate_password('20', '4'); + //add the user account + $user_type = 'Individual'; + $user_category = 'user'; + $sql = "insert into v_users "; + $sql .= "("; + $sql .= "domain_uuid, "; + $sql .= "user_uuid, "; + $sql .= "username, "; + $sql .= "password, "; + $sql .= "salt, "; + if (strlen($user_email) > 0) { $sql .= "user_email, "; } + $sql .= "user_add_date, "; + $sql .= "user_add_user "; + $sql .= ")"; + $sql .= "values "; + $sql .= "("; + $sql .= "'$domain_uuid', "; + $sql .= "'$user_uuid', "; + $sql .= "'$username', "; + $sql .= "'".md5($salt.$password)."', "; + $sql .= "'$salt', "; + if (strlen($user_email) > 0) { $sql .= "'$user_email', "; } + $sql .= "now(), "; + $sql .= "'".$_SESSION["username"]."' "; + $sql .= ")"; + $db->exec(check_sql($sql)); + unset($sql); + + //add the user to the member group + $group_name = 'user'; + $sql = "insert into v_group_users "; + $sql .= "("; + $sql .= "group_user_uuid, "; + $sql .= "domain_uuid, "; + $sql .= "group_name, "; + $sql .= "user_uuid "; + $sql .= ")"; + $sql .= "values "; + $sql .= "("; + $sql .= "'".uuid()."', "; + $sql .= "'$domain_uuid', "; + $sql .= "'$group_name', "; + $sql .= "'$user_uuid' "; + $sql .= ")"; + $db->exec(check_sql($sql)); + unset($sql); + } //end if !username_exists + } //end function definition + } //end function_exists + +function switch_module_is_running($fp, $mod) { + if (!$fp) { + //if the handle does not exist create it + $fp = event_socket_create($_SESSION['event_socket_ip_address'], $_SESSION['event_socket_port'], $_SESSION['event_socket_password']); + //if the handle still does not exist show an error message + if (!$fp) { + $msg = "
      Connection to Event Socket failed.
      "; + } + } + if ($fp) { + //send the api command to check if the module exists + $switchcmd = "module_exists $mod"; + $switch_result = event_socket_request($fp, 'api '.$switchcmd); + unset($switchcmd); + if (trim($switch_result) == "true") { + return true; + } + else { + return false; + } + } + else { + return false; + } +} +//switch_module_is_running('mod_spidermonkey'); + +//format a number (n) replace with a number (r) remove the number +function format_string ($format, $data) { + $x=0; + $tmp = ''; + for ($i = 0; $i <= strlen($format); $i++) { + $tmp_format = strtolower(substr($format, $i, 1)); + if ($tmp_format == 'x') { + $tmp .= substr($data, $x, 1); + $x++; + } + elseif ($tmp_format == 'r') { + $x++; + } + else { + $tmp .= $tmp_format; + } + } + return $tmp; +} + +//get the format and use it to format the phone number + function format_phone($phone_number) { + if (strlen($_SESSION["format_phone_array"]) == 0) { + $_SESSION["format_phone_array"] = ""; //clear the menu + global $domain_uuid, $db; + $sql = "select * from v_vars "; + $sql .= "where var_name = 'format_phone' "; + $sql .= "and var_enabled = 'true' "; + $prep_statement = $db->prepare(check_sql($sql)); + if ($prep_statement) { + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach ($result as &$row) { + $_SESSION["format_phone_array"][] = $row["var_value"]; + } + unset ($prep_statement); + } + } + foreach ($_SESSION["format_phone_array"] as &$format) { + $format_count = substr_count($format, 'x'); + $format_count = $format_count + substr_count($format, 'R'); + if ($format_count == strlen($phone_number)) { + //format the number + $phone_number = format_string($format, $phone_number); + } + } + return $phone_number; + } + +//browser detection without browscap.ini dependency + function http_user_agent() { + $u_agent = $_SERVER['HTTP_USER_AGENT']; + $bname = 'Unknown'; + $platform = 'Unknown'; + $version= ""; + + //get the platform? + if (preg_match('/linux/i', $u_agent)) { + $platform = 'linux'; + } + elseif (preg_match('/macintosh|mac os x/i', $u_agent)) { + $platform = 'mac'; + } + elseif (preg_match('/windows|win32/i', $u_agent)) { + $platform = 'windows'; + } + + //get the name of the useragent yes seperately and for good reason + if(preg_match('/MSIE/i',$u_agent) && !preg_match('/Opera/i',$u_agent)) + { + $bname = 'Internet Explorer'; + $ub = "MSIE"; + } + elseif(preg_match('/Firefox/i',$u_agent)) + { + $bname = 'Mozilla Firefox'; + $ub = "Firefox"; + } + elseif(preg_match('/Chrome/i',$u_agent)) + { + $bname = 'Google Chrome'; + $ub = "Chrome"; + } + elseif(preg_match('/Safari/i',$u_agent)) + { + $bname = 'Apple Safari'; + $ub = "Safari"; + } + elseif(preg_match('/Opera/i',$u_agent)) + { + $bname = 'Opera'; + $ub = "Opera"; + } + elseif(preg_match('/Netscape/i',$u_agent)) + { + $bname = 'Netscape'; + $ub = "Netscape"; + } + + //finally get the correct version number + $known = array('Version', $ub, 'other'); + $pattern = '#(?' . join('|', $known) . + ')[/ ]+(?[0-9.|a-zA-Z.]*)#'; + if (!preg_match_all($pattern, $u_agent, $matches)) { + // we have no matching number just continue + } + + // see how many we have + $i = count($matches['browser']); + if ($i != 1) { + //we will have two since we are not using 'other' argument yet + //see if version is before or after the name + if (strripos($u_agent,"Version") < strripos($u_agent,$ub)){ + $version= $matches['version'][0]; + } + else { + $version= $matches['version'][1]; + } + } + else { + $version= $matches['version'][0]; + } + + // check if we have a number + if ($version==null || $version=="") {$version="?";} + + return array( + 'userAgent' => $u_agent, + 'name' => $bname, + 'version' => $version, + 'platform' => $platform, + 'pattern' => $pattern + ); + } + +//tail php function for non posix systems + function tail($file, $num_to_get=10) { + $fp = fopen($file, 'r'); + $position = filesize($file); + $chunklen = 4096; + if($position-$chunklen<=0) { + fseek($fp,0); + } + else { + fseek($fp, $position-$chunklen); + } + $data="";$ret="";$lc=0; + while($chunklen > 0) + { + $data = fread($fp, $chunklen); + $dl=strlen($data); + for($i=$dl-1;$i>=0;$i--){ + if($data[$i]=="\n"){ + if($lc==0 && $ret!="")$lc++; + $lc++; + if($lc>$num_to_get)return $ret; + } + $ret=$data[$i].$ret; + } + if($position-$chunklen<=0){ + fseek($fp,0); + $chunklen=$chunklen-abs($position-$chunklen); + }else fseek($fp, $position-$chunklen); + $position = $position - $chunklen; + } + fclose($fp); + return $ret; + } + +//generate a random password with upper, lowercase and symbols + function generate_password($length = 10, $strength = 4) { + $password = ''; + $charset = ''; + if ($strength >= 1) { $charset .= "0123456789"; } + if ($strength >= 2) { $charset .= "abcdefghijkmnopqrstuvwxyz"; } + if ($strength >= 3) { $charset .= "ABCDEFGHIJKLMNPQRSTUVWXYZ"; } + if ($strength >= 4) { $charset .= "!!!!!^$%*?....."; } + srand((double)microtime() * rand(1000000, 9999999)); + while ($length > 0) { + $password.= $charset[rand(0, strlen($charset)-1)]; + $length--; + } + return $password; + } + //echo generate_password(4, 4); + +//based on Wez Furlong do_post_request + if (!function_exists('send_http_request')) { + function send_http_request($url, $data, $method = "POST", $optional_headers = null) { + $params = array('http' => array( + 'method' => $method, + 'content' => $data + )); + if ($optional_headers !== null) { + $params['http']['header'] = $optional_headers; + } + $ctx = stream_context_create($params); + $fp = @fopen($url, 'rb', false, $ctx); + if (!$fp) { + throw new Exception("Problem with $url, $php_errormsg"); + } + $response = @stream_get_contents($fp); + if ($response === false) { + throw new Exception("Problem reading data from $url, $php_errormsg"); + } + return $response; + } + } + +//convert the string to a named array + if(!function_exists('csv_to_named_array')) { + function csv_to_named_array($tmp_str, $tmp_delimiter) { + $tmp_array = explode ("\n", $tmp_str); + $result = ''; + if (trim(strtoupper($tmp_array[0])) != "+OK") { + $tmp_field_name_array = explode ($tmp_delimiter, $tmp_array[0]); + $x = 0; + foreach ($tmp_array as $row) { + if ($x > 0) { + $tmp_field_value_array = explode ($tmp_delimiter, $tmp_array[$x]); + $y = 0; + foreach ($tmp_field_value_array as $tmp_value) { + $tmp_name = $tmp_field_name_array[$y]; + if (trim(strtoupper($tmp_value)) != "+OK") { + $result[$x][$tmp_name] = $tmp_value; + } + $y++; + } + } + $x++; + } + unset($row); + } + return $result; + } + } + +function get_time_zone_offset($remote_tz, $origin_tz = 'UTC') { + $origin_dtz = new DateTimeZone($origin_tz); + $remote_dtz = new DateTimeZone($remote_tz); + $origin_dt = new DateTime("now", $origin_dtz); + $remote_dt = new DateTime("now", $remote_dtz); + $offset = $remote_dtz->getOffset($remote_dt) - $origin_dtz->getOffset($origin_dt); + return $offset; +} + +function number_pad($number,$n) { + return str_pad((int) $number,$n,"0",STR_PAD_LEFT); +} + +?> \ No newline at end of file diff --git a/includes/lib_pdo.php b/includes/lib_pdo.php new file mode 100644 index 0000000000..2cecab0678 --- /dev/null +++ b/includes/lib_pdo.php @@ -0,0 +1,374 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane + Raymond Chandler + */ +include "root.php"; +require_once "includes/lib_functions.php"; + +//set defaults + if (isset($dbtype) > 0) { + $db_type = $dbtype; + } + if (isset($dbhost) > 0) { + $db_host = $dbhost; + } + if (isset($dbport) > 0) { + $db_port = $dbport; + } + if (isset($dbname) > 0) { + $db_name = $dbname; + } + if (isset($dbusername) > 0) { + $db_username = $dbusername; + } + if (isset($dbpassword) > 0) { + $db_password = $dbpassword; + } + if (isset($db_file_path) > 0) { + $db_path = $db_file_path; + } + if (isset($dbfilename) > 0) { + $db_name = $dbfilename; + } + +if (!function_exists('get_db_field_names')) { + function get_db_field_names($db, $table, $db_name='fusionpbx') { + $query = sprintf('SELECT * FROM %s LIMIT 1', $table); + foreach ($db->query($query, PDO::FETCH_ASSOC) as $row) { + return array_keys($row); + } + + // if we're still here, we need to try something else + $fields = array(); + $driver = $db->getAttribute(PDO::ATTR_DRIVER_NAME); + if ($driver == 'sqlite') { + $query = sprintf("Pragma table_info(%s);", $table); + $stmt = $db->prepare($query); + $result = $stmt->execute(); + $rows = $stmt->fetchAll(PDO::FETCH_NAMED); + //printf('
      %s
      ', print_r($rows, true)); + $row_count = count($rows); + //printf('
      %s
      ', print_r($rows, true)); + for ($i = 0; $i < $row_count; $i++) { + array_push($fields, $rows[$i]['name']); + } + return $fields; + } else { + $query = sprintf("SELECT * FROM information_schema.columns + WHERE table_schema='%s' AND table_name='%s';" + , $db_name, $table + ); + $stmt = $db->prepare($query); + $result = $stmt->execute(); + $rows = $stmt->fetchAll(PDO::FETCH_NAMED); + $row_count = count($rows); + //printf('
      %s
      ', print_r($rows, true)); + for ($i = 0; $i < $row_count; $i++) { + array_push($fields, $rows[$i]['COLUMN_NAME']); + } + return $fields; + } + } +} + +if ($db_type == "sqlite") { + //prepare the database connection + if (strlen($db_name) == 0) { + //if (strlen($_SERVER["SERVER_NAME"]) == 0) { $_SERVER["SERVER_NAME"] = "http://localhost"; } + $server_name = $_SERVER["SERVER_NAME"]; + $server_name = str_replace ("www.", "", $server_name); + //$server_name = str_replace (".", "_", $server_name); + $db_name_short = $server_name; + $db_name = $server_name.'.db'; + } + else { + $db_name_short = $db_name; + } + + $filepath = $_SERVER["DOCUMENT_ROOT"].PROJECT_PATH.'/secure'; + $db_path = $_SERVER["DOCUMENT_ROOT"].PROJECT_PATH.'/secure'; + $db_path = realpath($db_path); + if (file_exists($db_path.'/'.$db_name)) { + //echo "database file exists
      "; + } + else { + if (is_writable($db_path.'/'.$db_name)) { + //use database in current location + } + else { //not writable + echo "The database ".$db_path."/".$db_name." does not exist or is not writable."; + exit; + } + } + + if (!function_exists('php_md5')) { + function php_md5($string) { + return md5($string); + } + } + if (!function_exists('php_unix_timestamp')) { + function php_unix_timestamp($string) { + return strtotime($string); + } + } + if (!function_exists('php_now')) { + function php_now() { + return date("Y-m-d H:i:s"); + } + } + if (!function_exists('php_left')) { + function php_left($string, $num) { + return substr($string, 0, $num); + } + } + if (!function_exists('php_right')) { + function php_right($string, $num) { + return substr($string, (strlen($string)-$num), strlen($string)); + } + } + + //database connection + try { + //create the database connection object + //$db = new PDO('sqlite2:example.db'); //sqlite 2 + //$db = new PDO('sqlite::memory:'); //sqlite 3 + $db = new PDO('sqlite:'.$db_path.'/'.$db_name); //sqlite 3 + //enable foreign key constraints + $db->query('PRAGMA foreign_keys = ON;'); + //add additional functions to SQLite so that they are accessible inside SQL + //bool PDO::sqliteCreateFunction ( string function_name, callback callback [, int num_args] ) + $db->sqliteCreateFunction('md5', 'php_md5', 1); + $db->sqliteCreateFunction('unix_timestamp', 'php_unix_timestamp', 1); + $db->sqliteCreateFunction('now', 'php_now', 0); + $db->sqliteCreateFunction('sqlitedatatype', 'phpsqlitedatatype', 2); + $db->sqliteCreateFunction('strleft', 'php_left', 2); + $db->sqliteCreateFunction('strright', 'php_right', 2); + } + catch (PDOException $error) { + print "error: " . $error->getMessage() . "
      "; + die(); + } +} //end if db_type sqlite + + +if ($db_type == "mysql") { + //database connection + try { + //required for mysql_real_escape_string + if (function_exists(mysql_connect)) { + $mysql_connection = mysql_connect($db_host, $db_username, $db_password); + } + //mysql pdo connection + if (strlen($db_host) == 0 && strlen($db_port) == 0) { + //if both host and port are empty use the unix socket + $db = new PDO("mysql:host=$db_host;unix_socket=/var/run/mysqld/mysqld.sock;dbname=$db_name", $db_username, $db_password); + } + else { + if (strlen($db_port) == 0) { + //leave out port if it is empty + $db = new PDO("mysql:host=$db_host;dbname=$db_name;", $db_username, $db_password, array( + PDO::ATTR_ERRMODE, + PDO::ERRMODE_EXCEPTION + )); + } + else { + $db = new PDO("mysql:host=$db_host;port=$db_port;dbname=$db_name;", $db_username, $db_password, array( + PDO::ATTR_ERRMODE, + PDO::ERRMODE_EXCEPTION + )); + } + } + } + catch (PDOException $error) { + print "error: " . $error->getMessage() . "
      "; + die(); + } +} //end if db_type mysql + + +if ($db_type == "pgsql") { + //database connection + try { + if (strlen($db_host) > 0) { + if (strlen($db_port) == 0) { $db_port = "5432"; } + $db = new PDO("pgsql:host=$db_host port=$db_port dbname=$db_name user=$db_username password=$db_password"); + } + else { + $db = new PDO("pgsql:dbname=$db_name user=$db_username password=$db_password"); + } + } + catch (PDOException $error) { + print "error: " . $error->getMessage() . "
      "; + die(); + } +} //end if db_type pgsql + +//domain list + if (strlen($_SESSION["domain_uuid"]) == 0) { + //get the domain + $domain_array = explode(":", $_SERVER["HTTP_HOST"]); + //get the domain_uuid + $sql = "select * from v_domains "; + $sql .= "order by domain_name asc "; + $prep_statement = $db->prepare($sql); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach($result as $row) { + if (count($result) == 1) { + $_SESSION["domain_uuid"] = $row["domain_uuid"]; + $_SESSION["domain_name"] = $row['domain_name']; + } + else { + if ($row['domain_name'] == $domain_array[0] || $row['domain_name'] == 'www.'.$domain_array[0]) { + $_SESSION["domain_uuid"] = $row["domain_uuid"]; + $_SESSION["domain_name"] = $row["domain_name"]; + } + } + $_SESSION['domains'][$row['domain_uuid']]['domain_uuid'] = $row['domain_uuid']; + $_SESSION['domains'][$row['domain_uuid']]['domain_name'] = $row['domain_name']; + } + unset($result, $prep_statement); + } + +//get the session settings + if (!isset($_SESSION['domain']['menu'])) { + //get the default settings + $sql = "select * from v_default_settings "; + $sql .= "where default_setting_enabled = 'true' "; + $prep_statement = $db->prepare($sql); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach($result as $row) { + $name = $row['default_setting_name']; + $category = $row['default_setting_category']; + $subcategory = $row['default_setting_subcategory']; + if (strlen($subcategory) == 0) { + $_SESSION[$category][$name] = $row['default_setting_value']; + } + else { + $_SESSION[$category][$subcategory][$name] = $row['default_setting_value']; + } + } + + //get the domains settings + $sql = "select * from v_domain_settings "; + $sql .= "where domain_uuid = '".$_SESSION["domain_uuid"]."' "; + $sql .= "and domain_setting_enabled = 'true' "; + $prep_statement = $db->prepare($sql); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach($result as $row) { + $name = $row['domain_setting_name']; + $category = $row['domain_setting_category']; + $subcategory = $row['domain_setting_subcategory']; + if (strlen($subcategory) == 0) { + //$$category[$name] = $row['domain_setting_value']; + $_SESSION[$category][$name] = $row['domain_setting_value']; + } + else { + //$$category[$subcategory][$name] = $row['domain_setting_value']; + $_SESSION[$category][$subcategory][$name] = $row['domain_setting_value']; + } + } + + //get the user settings + $sql = "select * from v_user_settings "; + $sql .= "where domain_uuid = '".$_SESSION["domain_uuid"]."' "; + $sql .= "and user_uuid = '".$_SESSION["user_uuid"]."' "; + $sql .= "and user_setting_enabled = 'true' "; + $prep_statement = $db->prepare($sql); + if ($prep_statement) { + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach($result as $row) { + $name = $row['user_setting_name']; + $category = $row['user_setting_category']; + $subcategory = $row['user_setting_subcategory']; + if (strlen($subcategory) == 0) { + //$$category[$name] = $row['domain_setting_value']; + $_SESSION[$category][$name] = $row['user_setting_value']; + } + else { + //$$category[$subcategory][$name] = $row['domain_setting_value']; + $_SESSION[$category][$subcategory][$name] = $row['user_setting_value']; + } + } + } + + //set the values from the session variables + if (strlen($_SESSION['domain']['time_zone']['name']) > 0) { + //server time zone + $_SESSION['time_zone']['system'] = date_default_timezone_get(); + //domain time zone set in system settings + $_SESSION['time_zone']['domain'] = $_SESSION['domain']['time_zone']['name']; + //set the domain time zone as the default time zone + date_default_timezone_set($_SESSION['domain']['time_zone']['name']); + } + + //set the context + if (strlen($_SESSION["context"]) == 0) { + if (count($_SESSION["domains"]) > 1) { + $_SESSION["context"] = $_SESSION["domain_name"]; + } + else { + $_SESSION["context"] = 'default'; + } + } + } + +//recordings add the domain to the path if there is more than one domains + if (count($_SESSION["domains"]) > 1) { + if (strlen($_SESSION['switch']['recordings']['dir']) > 0) { + if (substr($_SESSION['switch']['recordings']['dir'], -strlen($_SESSION["domain_name"])) != $_SESSION["domain_name"]) { + //get the default recordings directory + $sql = "select * from v_default_settings "; + $sql .= "where default_setting_enabled = 'true' "; + $sql .= "and default_setting_category = 'switch' "; + $sql .= "and default_setting_subcategory = 'recordings' "; + $sql .= "and default_setting_name = 'dir' "; + $prep_statement = $db->prepare($sql); + $prep_statement->execute(); + $result_default_settings = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach($result_default_settings as $row) { + $name = $row['default_setting_name']; + $category = $row['default_setting_category']; + $subcategory = $row['default_setting_subcategory']; + $switch_recordings_dir = $row['default_setting_value']; + } + //add the domain + $_SESSION['switch']['recordings']['dir'] = $switch_recordings_dir.'/'.$_SESSION["domain_name"]; + } + } + } + +//set the domain_uuid variable from the session + if (strlen($_SESSION["domain_uuid"]) > 0) { + $domain_uuid = $_SESSION["domain_uuid"]; + } + else { + $domain_uuid = uuid(); + } + +?> \ No newline at end of file diff --git a/includes/lib_pdo_vm.php b/includes/lib_pdo_vm.php new file mode 100644 index 0000000000..e5b75d4120 --- /dev/null +++ b/includes/lib_pdo_vm.php @@ -0,0 +1,69 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require "includes/require.php"; + +//get the contents of xml_cdr.conf.xml + $conf_xml_string = file_get_contents($_SESSION['switch']['conf']['dir'].'/autoload_configs/voicemail.conf.xml'); + +//parse the xml to get the call detail record info + try { + $conf_xml = simplexml_load_string($conf_xml_string); + } + catch(Exception $e) { + echo $e->getMessage(); + } + +//define variables + $odbc_dsn = ''; + $odbc_db_user = ''; + $odbc_db_pass = ''; + +//find the odbc info + foreach ($conf_xml->profiles->profile->param as $row) { + if ($row->attributes()->name == "odbc-dsn") { + $odbc_array = explode(":", $row->attributes()->value); + $odbc_dsn = $odbc_array[0]; + $odbc_db_user = $odbc_array[1]; + $odbc_db_pass = $odbc_array[2]; + } + } + +//database connection + try { + unset($db); + if (strlen($odbc_dsn) == 0) { + $db = new PDO('sqlite:'.$_SESSION['switch']['db']['dir'].'/voicemail_default.db'); //sqlite 3 + } + else { + $db = new PDO("odbc:$odbc_dsn", "$odbc_db_user", "$odbc_db_pass"); + } + } + catch (PDOException $e) { + echo 'Connection failed: ' . $e->getMessage(); + } + + ?> \ No newline at end of file diff --git a/includes/lib_php.php b/includes/lib_php.php new file mode 100644 index 0000000000..e6b2366ba6 --- /dev/null +++ b/includes/lib_php.php @@ -0,0 +1,67 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ + //error_reporting(E_ALL ^ E_NOTICE); //hide notices + error_reporting(E_ALL ^ E_NOTICE ^ E_WARNING ); //hide notices and warnings + //error_reporting(E_ALL); + + //session handling + //start the session + session_start(); + //set the last activity time stamp + $_SESSION['session']['last_activity'] = time(); + //check whether to timout the session + //if (isset($_SESSION['session']['last_activity']) && (time() - $_SESSION['session']['last_activity'] > 14400)) { + // session_destroy(); // destroy session data in storage + // session_unset(); // unset $_SESSION variable for the runtime + //} + //regenerate sessions to avoid session id attacks such as session fixation + if (!isset($_SESSION['session']['created'])) { + $_SESSION['session']['created'] = time(); + } else if (time() - $_SESSION['session']['created'] > 1800) { + // session started more than 30 minutes ago + session_regenerate_id(true); // rotate the session id + $_SESSION['session']['created'] = time(); // update creation time + } + + //get the document_root parent directory + $document_root_parent = join(array_slice(explode("\\",realpath($_SERVER["DOCUMENT_ROOT"])),0,-1), '/'); + + //if magic quotes is enabled remove the slashes + if (get_magic_quotes_gpc()) { + $in = array(&$_GET, &$_POST, &$_REQUEST, &$_COOKIE); + while (list($k,$v) = each($in)) { + foreach ($v as $key => $val) { + if (!is_array($val)) { + $in[$k][$key] = stripslashes($val); + continue; + } + $in[] =& $in[$k][$key]; + } + } + unset($in); + } + +?> diff --git a/includes/lib_schema.php b/includes/lib_schema.php new file mode 100644 index 0000000000..cb0025a564 --- /dev/null +++ b/includes/lib_schema.php @@ -0,0 +1,584 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +//require_once "includes/require.php"; +//require_once "includes/classes/database.php"; +//$db = new database; +//$db->db = $db; +//$db->db_type = $db_type; +//$db->add(); + +function db_table_exists_alternate ($db, $db_type, $table_name) { + $sql = "select count(*) from $table_name "; + $result = $db->query($sql); + if ($result > 0) { + return true; //table exists + } + else { + return false; //table doesn't exist + } +} + +function db_table_exists ($db, $db_type, $db_name, $table_name) { + $sql = ""; + if ($db_type == "sqlite") { + $sql .= "SELECT * FROM sqlite_master WHERE type='table' and name='$table_name' "; + } + if ($db_type == "pgsql") { + $sql .= "select * from pg_tables where schemaname='public' and tablename = '$table_name' "; + } + if ($db_type == "mysql") { + $sql .= "SELECT TABLE_NAME FROM information_schema.tables WHERE table_schema = '$db_name' and TABLE_NAME = '$table_name' "; + } + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + if (count($result) > 0) { + return true; //table exists + } + else { + return false; //table doesn't exist + } +} + +function db_table_info($db, $db_name, $db_type, $table_name) { + if (strlen($table_name) == 0) { return false; } + if ($db_type == "sqlite") { + $sql = "PRAGMA table_info(".$table_name.");"; + } + if ($db_type == "pgsql") { + $sql = "SELECT ordinal_position, "; + $sql .= "column_name, "; + $sql .= "data_type, "; + $sql .= "column_default, "; + $sql .= "is_nullable, "; + $sql .= "character_maximum_length, "; + $sql .= "numeric_precision "; + $sql .= "FROM information_schema.columns "; + $sql .= "WHERE table_name = '".$table_name."' "; + $sql .= "and table_catalog = '".$db_name."' "; + $sql .= "ORDER BY ordinal_position; "; + } + if ($db_type == "mysql") { + $sql = "describe ".$table_name.";"; + } + $prep_statement = $db->prepare($sql); + $prep_statement->execute(); + return $prep_statement->fetchAll(PDO::FETCH_ASSOC); +} + +function db_data_type($db_type, $table_info, $column_name) { + if ($db_type == "sqlite") { + foreach ($table_info as $key => &$row) { + if ($row['name'] == $column_name) { + return $row['type']; + } + } + } + if ($db_type == "pgsql") { + foreach ($table_info as $key => &$row) { + if ($row['column_name'] == $column_name) { + return $row['data_type']; + } + } + } + if ($db_type == "mysql") { + foreach ($table_info as $key => &$row) { + if ($row['Field'] == $column_name) { + return $row['Type']; + } + } + } +} + +function db_sqlite_column_exists($table_info, $column_name) { + foreach ($table_info as $key => &$row) { + if ($row['name'] == $column_name) { + return true; + } + } + return $false; +} + +function db_column_exists ($db, $db_type, $db_name, $table_name, $column_name) { + global $display_type; + + if ($db_type == "sqlite") { + $table_info = db_table_info($db, $db_name, $db_type, $table_name); + if (db_sqlite_column_exists($table_info, $column_name)) { + return true; + } + else { + return false; + } + } + if ($db_type == "pgsql") { + $sql = "SELECT attname FROM pg_attribute WHERE attrelid = (SELECT oid FROM pg_class WHERE relname = '$table_name') AND attname = '$column_name'; "; + } + if ($db_type == "mysql") { + //$sql .= "SELECT * FROM information_schema.COLUMNS where TABLE_SCHEMA = '$db_name' and TABLE_NAME = '$table_name' and COLUMN_NAME = '$column_name' "; + $sql = "show columns from $table_name where field = '$column_name' "; + } + if ($sql) { + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + if (!$result) { + return false; + } + if (count($result) > 0) { + return true; + } + else { + return false; + } + unset ($prep_statement); + } +} + +function db_column_data_type ($db, $db_type, $db_name, $table_name, $column_name) { + $table_info = db_table_info($db, $db_name, $db_type, $table_name); + return db_data_type($db_type, $table_info, $column_name); +} + +function db_create_table ($apps, $db_type, $table) { + foreach ($apps as $x => &$app) { + foreach ($app['db'] as $y => $row) { + if ($row['table'] == $table) { + $sql = "CREATE TABLE " . $row['table'] . " (\n"; + $field_count = 0; + foreach ($row['fields'] as $field) { + if ($field['deprecated'] == "true") { + //skip this row + } + else { + if ($field_count > 0 ) { $sql .= ",\n"; } + if (is_array($field['name'])) { + $sql .= $field['name']['text'] . " "; + } + else { + $sql .= $field['name'] . " "; + } + if (is_array($field['type'])) { + $sql .= $field['type'][$db_type]; + } + else { + $sql .= $field['type']; + } + $field_count++; + } + } + $sql .= ");\n\n"; + return $sql; + } + } + } +} + +function db_insert_into ($apps, $db_type, $table) { + foreach ($apps as $x => &$app) { + foreach ($app['db'] as $y => $row) { + if ($row['table'] == $table) { + $sql = "INSERT INTO " . $row['table'] . " ("; + $field_count = 0; + foreach ($row['fields'] as $field) { + if ($field['deprecated'] == "true") { + //skip this field + } + else { + if ($field_count > 0 ) { $sql .= ","; } + if (is_array($field['name'])) { + $sql .= $field['name']['text']; + } + else { + $sql .= $field['name']; + } + $field_count++; + } + } + $sql .= ")\n"; + $sql .= "SELECT "; + $field_count = 0; + foreach ($row['fields'] as $field) { + if ($field['deprecated'] == "true") { + //skip this field + } + else { + if ($field_count > 0 ) { $sql .= ","; } + if (is_array($field['name'])) { + if ($field['exists'] == "false") { + $sql .= $field['name']['deprecated']; + } + else { + $sql .= $field['name']['text']; + } + } + else { + $sql .= $field['name']; + } + $field_count++; + } + } + $sql .= " FROM tmp_".$row['table'].";\n\n"; + return $sql; + } + } + } +} + +function db_upgrade_schema ($db, $db_type, $db_name, $display_results) { + global $display_type; + + //PHP PDO check if table or column exists + //check if table exists + // SELECT * FROM sqlite_master WHERE type='table' AND name='v_cdr' + //check if column exists + // SELECT * FROM sqlite_master WHERE type='table' AND name='v_cdr' AND sql LIKE '%caller_id_name TEXT,%' + //aditional information + // http://www.sqlite.org/faq.html#q9 + + //postgresql + //list all tables in the database + // SELECT table_name FROM pg_tables WHERE schemaname='public'; + //check if table exists + // SELECT * FROM pg_tables WHERE schemaname='public' AND table_name = 'v_groups' + //check if column exists + // SELECT attname FROM pg_attribute WHERE attrelid = (SELECT oid FROM pg_class WHERE relname = 'v_cdr') AND attname = 'caller_id_name'; + //mysql + //list all tables in the database + // SELECT TABLE_NAME FROM information_schema.tables WHERE table_schema = 'fusionpbx' + //check if table exists + // SELECT TABLE_NAME FROM information_schema.tables WHERE table_schema = 'fusionpbx' AND TABLE_NAME = 'v_groups' + //check if column exists + // SELECT * FROM information_schema.COLUMNS where TABLE_SCHEMA = 'fusionpbx' AND TABLE_NAME = 'v_cdr' AND COLUMN_NAME = 'context' + //oracle + //check if table exists + // SELECT TABLE_NAME FROM ALL_TABLES + + //get the $apps array from the installed apps from the core and mod directories + $config_list = glob($_SERVER["DOCUMENT_ROOT"] . PROJECT_PATH . "/*/*/app_config.php"); + $x=0; + foreach ($config_list as &$config_path) { + include($config_path); + $x++; + } + + //update the app db array add exists true or false + $sql = ''; + foreach ($apps as $x => &$app) { + foreach ($app['db'] as $y => &$row) { + $table_name = $row['table']; + if (strlen($table_name) > 0) { + //check if the table exists + if (db_table_exists($db, $db_type, $db_name, $table_name)) { + $apps[$x]['db'][$y]['exists'] = 'true'; + } + else { + $apps[$x]['db'][$y]['exists'] = 'false'; + } + //check if the column exists + foreach ($row['fields'] as $z => $field) { + if ($field['deprecated'] == "true") { + //skip this field + } + else { + if (is_array($field['name'])) { + $field_name = $field['name']['text']; + } + else { + $field_name = $field['name']; + } + if (strlen(field_name) > 0) { + if (db_column_exists ($db, $db_type, $db_name, $table_name, $field_name)) { + //found + $apps[$x]['db'][$y]['fields'][$z]['exists'] = 'true'; + } + else { + //not found + $apps[$x]['db'][$y]['fields'][$z]['exists'] = 'false'; + } + } + unset($field_name); + } + } + unset($table_name); + } + } + } + + //prepare the variables + $sql_update = ''; + $var_uuid = $_GET["id"]; + + //add missing tables and fields + foreach ($apps as $x => &$app) { + foreach ($app['db'] as $y => &$row) { + $table_name = $row['table']; + //check if the table exists + if ($row['exists'] == "true") { + if (count($row['fields']) > 0) { + foreach ($row['fields'] as $z => $field) { + if ($field['deprecated'] == "true") { + //skip this field + } + else { + //get the data type + if (is_array($field['type'])) { + $field_type = $field['type'][$db_type]; + } + else { + $field_type = $field['type']; + } + //get the field name + if (is_array($field['name'])) { + $field_name = $field['name']['text']; + } + else { + $field_name = $field['name']; + } + //find missing fields and add them + if ($field['deprecated'] == "true") { + //skip this row + } + else { + if (is_array($field['name'])) { + if ($field['exists'] == "false" && !db_column_exists ($db, $db_type, $db_name, $table_name, $field['name']['deprecated'])) { + $sql_update .= "ALTER TABLE ".$table_name." ADD ".$field['name']['text']." ".$field_type.";\n"; + } + } + else { + if ($field['exists'] == "false") { + $sql_update .= "ALTER TABLE ".$table_name." ADD ".$field['name']." ".$field_type.";\n"; + } + } + } + //rename fields where the name has changed + if (is_array($field['name'])) { + if (db_column_exists ($db, $db_type, $db_name, $table_name, $field['name']['deprecated'])) { + if ($db_type == "pgsql") { + $sql_update .= "ALTER TABLE ".$table_name." RENAME COLUMN ".$field['name']['deprecated']." to ".$field['name']['text'].";\n"; + } + if ($db_type == "mysql") { + $field_type = str_replace("AUTO_INCREMENT PRIMARY KEY", "", $field_type); + $sql_update .= "ALTER TABLE ".$table_name." CHANGE ".$field['name']['deprecated']." ".$field['name']['text']." ".$field_type.";\n"; + } + if ($db_type == "sqlite") { + //a change has been made to the field name + $apps[$x]['db'][$y]['rebuild'] = 'true'; + } + } + } + //change the data type if it has been changed + //if the data type in the app db array is different than the type in the database then change the data type + $db_field_type = db_column_data_type ($db, $db_type, $db_name, $table_name, $field_name); + if ($db_field_type != $field_type) { + if ($db_type == "pgsql") { + if (strtolower($field_type) == "uuid") { + $sql_update .= "ALTER TABLE ".$table_name." ALTER COLUMN ".$field_name." TYPE uuid USING\n"; + $sql_update .= "CAST(regexp_replace(".$field_name.", '([A-Z0-9]{4})([A-Z0-9]{12})', E'\\1-\\2')\n"; + $sql_update .= "AS uuid);\n"; + } + else { + if ($db_field_type = "integer" && strtolower($field_type) == "serial") { + //field type has not changed + } elseif ($db_field_type = "timestamp without time zone" && strtolower($field_type) == "timestamp") { + //field type has not changed + } elseif ($db_field_type = "character" && strtolower($field_type) == "char(1)") { + //field type has not changed + } + else { + $sql_update .= "-- $db_type, $db_name, $table_name, $field_name ".db_column_data_type ($db, $db_type, $db_name, $table_name, $field_name)."
      "; + $sql_update .= "ALTER TABLE ".$table_name." ALTER COLUMN ".$field_name." TYPE ".$field_type.";\n"; + } + } + } + if ($db_type == "mysql") { + $sql_update .= "ALTER TABLE ".$table_name." modify ".$field_name." ".$field_type.";\n"; + } + if ($db_type == "sqlite") { + //a change has been made to the field type + $apps[$x]['db'][$y]['rebuild'] = 'true'; + } + } + } + } + unset($column_array); + } + } + else { + //create table + $sql_update .= db_create_table($apps, $db_type, $row['table']); + } + } + } + //rebuild and populate the table + foreach ($apps as $x => &$app) { + foreach ($app['db'] as $y => &$row) { + $table_name = $row['table']; + if ($row['rebuild'] == "true") { + if ($db_type == "sqlite") { + //rename the table + $sql_update .= "ALTER TABLE ".$table_name." RENAME TO tmp_".$table_name.";\n"; + //create the table + $sql_update .= db_create_table($apps, $db_type, $table_name); + //insert the data into the new table + $sql_update .= db_insert_into($apps, $db_type, $table_name); + //drop the old table + $sql_update .= "DROP TABLE tmp_".$table_name.";\n"; + } + } + } + } + //display results as html + if ($display_results && $display_type == "html") { + //show the database type + echo "Database Type: ".$db_type. "

      "; + //start the table + echo "\n"; + //show the changes + if (strlen($sql_update) > 0) { + echo "\n"; + echo "\n"; + echo "\n"; + } + //list all tables + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + //build the html while looping through the app db array + $sql = ''; + foreach ($apps as &$app) { + foreach ($app['db'] as $row) { + $table_name = $row['table']; + echo "\n"; + + //check if the table exists + if ($row['exists'] == "true") { + echo "\n"; + echo "\n"; + + if (count($row['fields']) > 0) { + echo "\n"; + } + } + else { + echo "\n"; + echo "\n"; + echo "\n"; + } + echo "\n"; + } + } + unset ($prep_statement); + //end the list of tables + echo "
      \n"; + echo "
      \n"; + echo "SQL Changes:
      \n"; + echo "
      \n";
      +					echo $sql_update;
      +					echo "
      \n"; + echo "
      \n"; + echo "
      TableExistsDetails
      table
      $table_name
      true\n"; + //show the list of columns + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + foreach ($row['fields'] as $field) { + if ($field['deprecated'] == "true") { + //skip this field + } + else { + if (is_array($field['name'])) { + $field_name = $field['name']['text']; + } + else { + $field_name = $field['name']; + } + if (is_array($field['type'])) { + $field_type = $field['type'][$db_type]; + } + else { + $field_type = $field['type']; + } + echo "\n"; + echo "\n"; + echo "\n"; + if ($field['exists'] == "true") { + echo "\n"; + echo "\n"; + } + else { + echo "\n"; + echo "\n"; + } + echo "\n"; + } + } + unset($column_array); + echo "
      nametypeexists
      ".$field_name."".$field_type."true false 
      \n"; + echo "
      table
      $table_name
      exists
      false
       
      \n"; + echo "
      \n"; + } + + //loop line by line through all the lines of sql code + $x = 0; + if (strlen($sql_update) == 0 && $display_type == "text") { + echo " Schema: no change\n"; + } + else { + if ($display_type == "text") { + echo " Schema:\n"; + } + //$db->beginTransaction(); + $update_array = explode(";", $sql_update); + foreach($update_array as $sql) { + if (strlen(trim($sql))) { + try { + $db->query(trim($sql)); + if ($display_type == "text") { + echo " $sql\n"; + } + } + catch (PDOException $error) { + if ($display_results) { + echo " error: " . $error->getMessage() . " sql: $sql
      "; + } + } + } + } + //$db->commit(); + echo "\n"; + unset ($file_contents, $sql_update, $sql); + } + +} //end function + +?> \ No newline at end of file diff --git a/includes/lib_switch.php b/includes/lib_switch.php new file mode 100644 index 0000000000..b94c9ec54e --- /dev/null +++ b/includes/lib_switch.php @@ -0,0 +1,4335 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require_once "root.php"; +require_once "includes/require.php"; + +//preferences + $v_label_show = false; + $v_menu_tab_show = false; + $v_fax_show = true; + $v_path_show = true; + +//get user defined variables + if (strlen($_SESSION['user_defined_variables']) == 0) { + $sql = "select * from v_vars "; + $sql .= "where var_cat = 'Defaults' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_ASSOC); + foreach ($result as &$row) { + switch ($row["var_name"]) { + case "username": + //not allowed to override this value + break; + case "groups": + //not allowed to override this value + break; + case "menu": + //not allowed to override this value + break; + case "template_name": + //not allowed to override this value + break; + case "template_content": + //not allowed to override this value + break; + case "extension_array": + //not allowed to override this value + break; + case "user_extension_array": + //not allowed to override this value + break; + case "user_array": + //not allowed to override this value + break; + default: + $_SESSION[$row["var_name"]] = $row["var_value"]; + } + } + //when this value is cleared it will re-read the user defined variables + $_SESSION["user_defined_variables"] = "set"; + } + +/* +function v_settings() { + global $db, $domain_uuid; + + //get the program directory + $program_dir = ''; + $doc_root = $_SERVER["DOCUMENT_ROOT"]; + $doc_root = str_replace ("\\", "/", $doc_root); + $doc_root_array = explode("/", $doc_root); + $doc_root_array_count = count($doc_root_array); + $x = 0; + foreach ($doc_root_array as $value) { + $program_dir = $program_dir.$value."/"; + if (($doc_root_array_count-3) == $x) { + break; + } + $x++; + } + $program_dir = rtrim($program_dir, "/"); + + //get the domains variables + $sql = "select * from v_domain_settings "; + $sql .= "where domain_uuid = '".$domain_uuid."' "; + $sql .= "and domain_setting_enabled = 'true' "; + $prep_statement = $db->prepare($sql); + if ($prep_statement) { + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach($result as $row) { + $name = $row['domain_setting_name']; + $settings_array[$name] = $row['domain_setting_value']; + } + } + + //get the server variables + $sql = "select * from v_server_settings "; + $sql .= "where domain_uuid = '".$domain_uuid."' "; + $sql .= "and domain_setting_enabled = 'true' "; + $prep_statement = $db->prepare($sql); + if ($prep_statement) { + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); + foreach($result as $row) { + $name = $row['server_setting_name']; + $settings_array[$name] = $row['server_setting_value']; + } + } + + //return the results + return $settings_array; +} +//update the settings +//$settings_array = v_settings(); +foreach($settings_array as $name => $value) { + $$name = $value; +} +*/ + +//create the recordings/archive/year/month/day directory structure + $v_recording_archive_dir = $_SESSION['switch']['recordings']['dir']."/archive/".date("Y")."/".date("M")."/".date("d"); + if(!is_dir($v_recording_archive_dir)) { + mkdir($v_recording_archive_dir, 0764, true); + chmod($_SESSION['switch']['recordings']['dir']."/archive/".date("Y"), 0764); + chmod($_SESSION['switch']['recordings']['dir']."/archive/".date("Y")."/".date("M"), 0764); + chmod($v_recording_archive_dir, 0764); + } + +//get the event socket information + if (strlen($_SESSION['event_socket_ip_address']) == 0) { + $sql = "select * from v_settings "; + $prep_statement = $db->prepare(check_sql($sql)); + if ($prep_statement) { + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_ASSOC); + foreach ($result as &$row) { + $_SESSION['event_socket_ip_address'] = $row["event_socket_ip_address"]; + $_SESSION['event_socket_port'] = $row["event_socket_port"]; + $_SESSION['event_socket_password'] = $row["event_socket_password"]; + break; //limit to 1 row + } + } + } + +//get the extensions that are assigned to this user + if (strlen($_SESSION["user_uuid"]) > 0 && count($_SESSION['user']['extension']) == 0) { + //get the user extension list + unset($_SESSION['user']['extension']); + $sql = "select e.extension, e.user_context, e.extension_uuid from v_extensions as e, v_extension_users as u "; + $sql .= "where e.domain_uuid = '".$_SESSION['domain_uuid']."' "; + $sql .= "and e.extension_uuid = u.extension_uuid "; + $sql .= "and u.user_uuid = '".$_SESSION['user_uuid']."' "; + $sql .= "and e.enabled = 'true' "; + $sql .= "order by e.extension asc "; + $result = $db->query($sql)->fetchAll(PDO::FETCH_ASSOC); + if (count($result) > 0) { + $x = 0; + foreach($result as $row) { + $_SESSION['user']['extension'][$x]['user'] = $row['extension']; + $_SESSION['user']['extension'][$x]['extension_uuid'] = $row['extension_uuid']; + $_SESSION['user_context'] = $row["user_context"]; + $x++; + } + } + //if no extension has been assigned then setting user_context will still need to be set + if (strlen($_SESSION['user_context']) == 0) { + if (count($_SESSION['domains']) == 1) { + $_SESSION['user_context'] = "default"; + } + else { + $_SESSION['user_context'] = $_SESSION['domain_name']; + } + } + } + +if ($db_type == "sqlite") { + //sqlite: check if call detail record (CDR) db file exists if not create it + if (!file_exists($db_file_path.'/'.$server_name.'.cdr.db')) { + //echo "file does not exist: ".$_SESSION['switch']['db']['dir'].'/cdr.db'; + if (copy($db_file_path.'/cdr.clean.db', $db_file_path.'/'.$server_name.'.cdr.db')) { + //echo "copy succeeded.\n"; + } + } +} + +function build_menu() { + global $v_menu_tab_show; + + if ($v_menu_tab_show) { + global $config; + if (is_dir($_SERVER["DOCUMENT_ROOT"].'/fusionpbx')){ $relative_url = $_SERVER["DOCUMENT_ROOT"].'/fusionpbx'; } else { $relative_url = '/'; } + + $tab_array = array(); + $menu_selected = false; + if ($_SERVER["SCRIPT_NAME"] == $relative_url."/v_settings.php") { $menu_selected = true; } + $tab_array[] = array(gettext("Settings"), $menu_selected, $relative_url."/v_settings.php"); + unset($menu_selected); + + $menu_selected = false; + if ($_SERVER["SCRIPT_NAME"] == $relative_url."/dialplans.php") { $menu_selected = true; } + if ($_SERVER["SCRIPT_NAME"] == $relative_url."/dialplans.php") { $menu_selected = true; } + if ($_SERVER["SCRIPT_NAME"] == $relative_url."/dialplan_edit.php") { $menu_selected = true; } + if ($_SERVER["SCRIPT_NAME"] == $relative_url."/dialplan_details_edit.php") { $menu_selected = true; } + $tab_array[] = array(gettext("Dialplan"), $menu_selected, $relative_url."/dialplans.php"); + unset($menu_selected); + + $menu_selected = false; + if ($_SERVER["SCRIPT_NAME"] == $relative_url."/v_extensions.php") { $menu_selected = true; } + if ($_SERVER["SCRIPT_NAME"] == $relative_url."/v_extensions_edit.php") { $menu_selected = true; } + $tab_array[] = array(gettext("Extensions"), $menu_selected, $relative_url."/v_extensions.php"); + unset($menu_selected); + + $menu_selected = false; + if ($_SERVER["SCRIPT_NAME"] == $relative_url."/v_features.php") { $menu_selected = true; } + if ($_SERVER["SCRIPT_NAME"] == $relative_url."/v_fax.php") { $menu_selected = true; } + if ($_SERVER["SCRIPT_NAME"] == $relative_url."/v_fax_edit.php") { $menu_selected = true; } + if ($_SERVER["SCRIPT_NAME"] == $relative_url."/v_hunt_group.php") { $menu_selected = true; } + if ($_SERVER["SCRIPT_NAME"] == $relative_url."/v_hunt_group_edit.php") { $menu_selected = true; } + if ($_SERVER["SCRIPT_NAME"] == $relative_url."/v_hunt_group_destinations.php") { $menu_selected = true; } + if ($_SERVER["SCRIPT_NAME"] == $relative_url."/v_hunt_group_destinations_edit.php") { $menu_selected = true; } + if ($_SERVER["SCRIPT_NAME"] == $relative_url."/v_auto_attendant.php") { $menu_selected = true; } + if ($_SERVER["SCRIPT_NAME"] == $relative_url."/v_auto_attendant_edit.php") { $menu_selected = true; } + if ($_SERVER["SCRIPT_NAME"] == $relative_url."/v_auto_attendant_options_edit.php") { $menu_selected = true; } + if ($_SERVER["SCRIPT_NAME"] == $relative_url."/v_modules.php") { $menu_selected = true; } + if ($_SERVER["SCRIPT_NAME"] == $relative_url."/v_recordings.php") { $menu_selected = true; } + if ($_SERVER["SCRIPT_NAME"] == $relative_url."/v_recordings_edit.php") { $menu_selected = true; } + $tab_array[] = array(gettext("Features"), $menu_selected, $relative_url."/v_features.php"); + unset($menu_selected); + + $menu_selected = false; + if ($_SERVER["SCRIPT_NAME"] == $relative_url."/v_gateways.php") { $menu_selected = true; } + if ($_SERVER["SCRIPT_NAME"] == $relative_url."/v_gateways_edit.php") { $menu_selected = true; } + $tab_array[] = array(gettext("Gateways"), $menu_selected, $relative_url."/v_gateways.php"); + unset($menu_selected); + + $menu_selected = false; + if ($_SERVER["SCRIPT_NAME"] == $relative_url."/v_profiles.php") { $menu_selected = true; } + if ($_SERVER["SCRIPT_NAME"] == $relative_url."/v_profile_edit.php") { $menu_selected = true; } + $tab_array[] = array(gettext("Profiles"), $menu_selected, $relative_url."/v_profiles.php"); + unset($menu_selected); + + $menu_selected = false; + if ($_SERVER["SCRIPT_NAME"] == $relative_url."/v_status.php") { $menu_selected = true; } + $tab_array[] = array(gettext("Status"), $menu_selected, $relative_url."/v_status.php"); + unset($menu_selected); + + $menu_selected = false; + if ($_SERVER["SCRIPT_NAME"] == $relative_url."/v_vars.php") { $menu_selected = true; } + $tab_array[] = array(gettext("Vars"), $menu_selected, $relative_url."/v_vars.php"); + unset($menu_selected); + } +} + + +function event_socket_create($host, $port, $password){ + $fp = fsockopen($host, $port, $errno, $errdesc, 3); + socket_set_blocking($fp,false); + + if (!$fp) { + //error "invalid handle
      \n"; + //echo "error number: ".$errno."
      \n"; + //echo "error description: ".$errdesc."
      \n"; + } + else { + //connected to the socket return the handle + while (!feof($fp)) { + $buffer = fgets($fp, 1024); + usleep(100); //allow time for reponse + if (trim($buffer) == "Content-Type: auth/request") { + fputs($fp, "auth $password\n\n"); + break; + } + } + return $fp; + } +} //end function + + +function event_socket_request($fp, $cmd) { + if ($fp) { + fputs($fp, $cmd."\n\n"); + usleep(100); //allow time for reponse + + $response = ""; + $i = 0; + $contentlength = 0; + while (!feof($fp)) { + $buffer = fgets($fp, 4096); + if ($contentlength > 0) { + $response .= $buffer; + } + + if ($contentlength == 0) { //if content length is already don't process again + if (strlen(trim($buffer)) > 0) { //run only if buffer has content + $temparray = explode(":", trim($buffer)); + if ($temparray[0] == "Content-Length") { + $contentlength = trim($temparray[1]); + } + } + } + + usleep(20); //allow time for reponse + + //optional because of script timeout //don't let while loop become endless + if ($i > 1000000) { break; } + + if ($contentlength > 0) { //is contentlength set + //stop reading if all content has been read. + if (strlen($response) >= $contentlength) { + break; + } + } + $i++; + } + + return $response; + } + else { + echo "no handle"; + } +} + + +function event_socket_request_cmd($cmd) { + global $db, $domain_uuid, $host; + + $sql = "select * from v_settings "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_ASSOC); + foreach ($result as &$row) { + $event_socket_ip_address = $row["event_socket_ip_address"]; + $event_socket_port = $row["event_socket_port"]; + $event_socket_password = $row["event_socket_password"]; + break; //limit to 1 row + } + unset ($prep_statement); + + $fp = event_socket_create($event_socket_ip_address, $event_socket_port, $event_socket_password); + $response = event_socket_request($fp, $cmd); + fclose($fp); +} + +function byte_convert( $bytes ) { + if ($bytes<=0) { + return '0 Byte'; + } + + $convention=1000; //[1000->10^x|1024->2^x] + $s=array('B', 'kB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB'); + $e=floor(log($bytes,$convention)); + $e=floor(log($bytes,$convention)); + return round($bytes/pow($convention,$e),2).' '.$s[$e]; +} + +function lan_sip_profile() { + global $config; + clearstatcache(); + + //if the lan directory does not exist then create it + if (!is_readable($_SESSION['switch']['conf']['dir'].'/sip_profiles/lan/')) { + exec("mkdir ".$_SESSION['switch']['conf']['dir']."/sip_profiles/lan/"); + } + + //create the LAN profile if it doesn't exist + if (!file_exists($_SESSION['switch']['conf']['dir'].'/sip_profiles/lan.xml')) { + $lan_ip = $config['interfaces']['lan']['ipaddr']; + if (strlen($lan_ip) > 0) { + exec("cp ".$_SESSION['switch']['conf']['dir']."/sip_profiles/internal.xml ".$_SESSION['switch']['conf']['dir']."/sip_profiles/lan.xml"); + + $filename = $_SESSION['switch']['conf']['dir']."/sip_profiles/lan.xml"; + $handle = fopen($filename,"rb"); + $contents = fread($handle, filesize($filename)); + fclose($handle); + + $handle = fopen($filename,"w"); + $contents = str_replace("", "", $contents); + $contents = str_replace("", "", $contents); + $contents = str_replace("", "", $contents); + $contents = str_replace("", "", $contents); + $contents = str_replace("", "", $contents); + fwrite($handle, $contents); + unset($contents); + fclose($handle); + unset($filename); + } + } +} + +function ListFiles($dir) { + if($dh = opendir($dir)) { + $files = Array(); + $inner_files = Array(); + + while($file = readdir($dh)) { + if($file != "." && $file != ".." && $file[0] != '.') { + if(is_dir($dir . "/" . $file)) { + //$inner_files = ListFiles($dir . "/" . $file); //recursive + if(is_array($inner_files)) $files = array_merge($files, $inner_files); + } else { + array_push($files, $file); + //array_push($files, $dir . "/" . $file); + } + } + } + closedir($dh); + return $files; + } +} + +function switch_select_destination($select_type, $select_label, $select_name, $select_value, $select_style, $action='') { + //select_type can be ivr, dialplan, or call_center_contact + global $config, $db, $domain_uuid; + + if (if_group("superadmin")) { + echo "\n"; + echo "\n"; + } + + //default selection found to false + $selection_found = false; + + if (if_group("superadmin")) { + echo " \n"; + } + + echo " \n"; + + //list call center queues + $sql = "select * from v_call_center_queues "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "order by queue_name asc "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_ASSOC); + if ($select_type == "dialplan" || $select_type == "ivr") { + echo "\n"; + } + $previous_call_center_name = ""; + foreach ($result as &$row) { + $queue_name = $row["queue_name"]; + $queue_name = str_replace('_${domain_name}@default', '', $queue_name); + $queue_extension = $row["queue_extension"]; + if ($previous_call_center_name != $queue_name) { + if ("menu-exec-app:transfer ".$queue_extension." XML ".$_SESSION["context"] == $select_value || "transfer:".$queue_extension." XML ".$_SESSION["context"] == $select_value) { + if ($select_type == "ivr") { + echo " \n"; + } + if ($select_type == "dialplan") { + echo " \n"; + } + $selection_found = true; + } + else { + if ($select_type == "ivr") { + echo " \n"; + } + if ($select_type == "dialplan") { + echo " \n"; + } + } + $previous_call_center_name = $queue_name; + } + } + if ($select_type == "dialplan" || $select_type == "ivr") { + echo "\n"; + } + unset ($prep_statement); + + //list call groups + $sql = "select distinct(call_group) from v_extensions "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "order by call_group asc "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $x = 0; + $result = $prep_statement->fetchAll(PDO::FETCH_ASSOC); + if ($select_type == "dialplan" || $select_type == "ivr") { + echo "\n"; + } + $previous_call_group_name = ""; + foreach ($result as &$row) { + $call_groups = $row["call_group"]; + $call_group_array = explode(",", $call_groups); + foreach ($call_group_array as $call_group) { + $call_group = trim($call_group); + if ($previous_call_group_name != $call_group) { + if ("menu-exec-app:bridge group/".$call_group."@".$_SESSION['domain_name'] == $select_value || "bridge:group/".$call_group."@".$_SESSION['domain_name'] == $select_value) { + if ($select_type == "ivr") { + echo " \n"; + } + if ($select_type == "dialplan") { + echo " \n"; + } + $selection_found = true; + } + else { + if ($select_type == "ivr") { + echo " \n"; + } + if ($select_type == "dialplan") { + echo " \n"; + } + } + $previous_call_group_name = $call_group; + } + } + $x++; + } + if ($select_type == "dialplan" || $select_type == "ivr") { + echo "\n"; + } + unset ($prep_statement); + + //list conferences + $sql = "select * from v_conferences "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "order by conference_name asc "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $x = 0; + $result = $prep_statement->fetchAll(PDO::FETCH_ASSOC); + if ($select_type == "dialplan" || $select_type == "ivr") { + echo "\n"; + } + foreach ($result as &$row) { + $name = $row["conference_name"]; + $extension = $row["conference_extension"]; + $description = $row["conference_description"]; + if ("execute_extension ".$extension." XML ".$_SESSION['context'] == $select_value || "execute_extension:".$extension." XML ".$_SESSION['context'] == $select_value) { + if ($select_type == "ivr") { + echo " \n"; + } + if ($select_type == "dialplan") { + echo " \n"; + } + $selection_found = true; + } + else { + if ($select_type == "ivr") { + echo " \n"; + } + if ($select_type == "dialplan") { + echo " \n"; + } + } + $x++; + } + if ($select_type == "dialplan" || $select_type == "ivr") { + echo "\n"; + } + unset ($prep_statement); + + //list destinations + $sql = "select * from v_destinations "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and destination_enabled = 'true' "; + $sql .= "order by destination_name asc "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $x = 0; + $result = $prep_statement->fetchAll(PDO::FETCH_ASSOC); + if ($select_type == "dialplan" || $select_type == "ivr") { + echo "\n"; + } + foreach ($result as &$row) { + $name = $row["destination_name"]; + $context = $row["destination_context"]; + $extension = $row["destination_extension"]; + $description = $row["destination_description"]; + if ("execute_extension ".$extension." XML ".$context == $select_value || "execute_extension:".$extension." XML ".$context == $select_value) { + if ($select_type == "ivr") { + echo " \n"; + } + if ($select_type == "dialplan") { + echo " \n"; + } + $selection_found = true; + } + else { + if ($select_type == "ivr") { + echo " \n"; + } + if ($select_type == "dialplan") { + echo " \n"; + } + } + $x++; + } + if ($select_type == "dialplan" || $select_type == "ivr") { + echo "\n"; + } + unset ($prep_statement); + + //list extensions + $sql = "select * from v_extensions "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and enabled = 'true' "; + $sql .= "order by extension asc "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_ASSOC); + if ($select_type == "dialplan" || $select_type == "ivr" || $select_type == "call_center_contact") { + echo "\n"; + } + foreach ($result as &$row) { + $extension = $row["extension"]; + $context = $row["user_context"]; + $description = $row["description"]; + if ("transfer ".$extension." XML ".$context == $select_value || "transfer:".$extension." XML ".$context == $select_value || "user/$extension@".$_SESSION['domains'][$domain_uuid]['domain_name'] == $select_value) { + if ($select_type == "ivr") { + echo " \n"; + } + if ($select_type == "dialplan") { + echo " \n"; + } + if ($select_type == "call_center_contact") { + echo " \n"; + } + $selection_found = true; + } + else { + if ($select_type == "ivr") { + echo " \n"; + } + if ($select_type == "dialplan") { + echo " \n"; + } + if ($select_type == "call_center_contact") { + echo " \n"; + } + } + } + if ($select_type == "dialplan" || $select_type == "ivr" || $select_type == "call_center_contact") { + echo "\n"; + } + unset ($prep_statement, $extension); + + //list fax extensions + if ($select_type == "dialplan" || $select_type == "ivr") { + $sql = "select * from v_fax "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "order by fax_extension asc "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_ASSOC); + echo "\n"; + foreach ($result as &$row) { + $fax_name = $row["fax_name"]; + $extension = $row["fax_extension"]; + if ("transfer $extension XML ".$_SESSION["context"] == $select_value || "transfer:".$extension." XML ".$_SESSION["context"] == $select_value) { + if ($select_type == "ivr") { + echo " \n"; + } + if ($select_type == "dialplan") { + echo " \n"; + } + $selection_found = true; + } + else { + if ($select_type == "ivr") { + echo " \n"; + } + if ($select_type == "dialplan") { + echo " \n"; + } + } + } + echo "\n"; + unset ($prep_statement, $extension); + } + + //list fifo queues + $sql = "select * from v_dialplan_details "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "order by dialplan_detail_data asc "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $x = 0; + $result = $prep_statement->fetchAll(PDO::FETCH_ASSOC); + if ($select_type == "dialplan" || $select_type == "ivr") { + echo "\n"; + } + foreach ($result as &$row) { + //$dialplan_detail_tag = $row["dialplan_detail_tag"]; + if ($row["dialplan_detail_type"] == "fifo") { + if (strpos($row["dialplan_detail_data"], '@${domain_name} in') !== false) { + $dialplan_uuid = $row["dialplan_uuid"]; + //get the extension number using the dialplan_uuid + $sql = "select dialplan_detail_data as extension_number "; + $sql .= "from v_dialplan_details "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and dialplan_uuid = '$dialplan_uuid' "; + $sql .= "and dialplan_detail_type = 'destination_number' "; + $tmp = $db->query($sql)->fetch(PDO::FETCH_ASSOC); + $extension_number = $tmp['extension_number']; + $extension_number = ltrim($extension_number, "^"); + $extension_number = ltrim($extension_number, "\\"); + $extension_number = rtrim($extension_number, "$"); + unset($tmp); + + //get the extension number using the dialplan_uuid + $sql = "select * "; + $sql .= "from v_dialplans "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and dialplan_uuid = '$dialplan_uuid' "; + $tmp = $db->query($sql)->fetch(PDO::FETCH_ASSOC); + $dialplan_name = $tmp['dialplan_name']; + $dialplan_name = str_replace("_", " ", $dialplan_name); + unset($tmp); + + $fifo_name = $row["dialplan_detail_data"]; + $fifo_name = str_replace('@${domain_name} in', '', $fifo_name); + $option_label = $extension_number.' '.$dialplan_name; + if ($select_type == "ivr") { + if ("menu-exec-app:transfer ".$row["dialplan_detail_data"] == $select_value) { + echo " \n"; + $selection_found = true; + } + else { + echo " \n"; + } + } + if ($select_type == "dialplan") { + if ("transfer:".$row["dialplan_detail_data"] == $select_value) { + echo " \n"; + $selection_found = true; + } + else { + echo " \n"; + } + } + } + } + } + if ($select_type == "dialplan" || $select_type == "ivr") { + echo "\n"; + } + unset ($prep_statement); + + //gateways + if (if_group("superadmin")) { + if ($select_type == "dialplan" || $select_type == "ivr" || $select_type == "call_center_contact") { + echo "\n"; + } + $sql = "select * from v_gateways "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and enabled = 'true' "; + $sql .= "order by gateway asc "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_ASSOC); + $result_count = count($result); + unset ($prep_statement, $sql); + $tmp_selected = ''; + foreach($result as $row) { + if ($row['gateway'] == $select_value) { + $tmp_selected = "selected='selected'"; + } + if ($select_type == "dialplan") { + if (count($_SESSION['domains']) == 1) { + echo " \n"; + } + else { + echo " \n"; + } + } + if ($select_type == "ivr") { + if (count($_SESSION['domains']) == 1) { + echo " \n"; + } + else { + echo " \n"; + } + } + if ($select_type == "call_center_contact") { + if (count($_SESSION['domains']) == 1) { + echo " \n"; + } + else { + echo " \n"; + } + } + $tmp_selected = ''; + } + unset($sql, $result); + if ($select_type == "dialplan" || $select_type == "ivr" || $select_type == "call_center_contact") { + echo "\n"; + } + } + + //list hunt groups + $sql = "select * from v_hunt_groups "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and ( "; + $sql .= "hunt_group_type = 'simultaneous' "; + $sql .= "or hunt_group_type = 'sequence' "; + $sql .= "or hunt_group_type = 'sequentially' "; + $sql .= ") "; + $sql .= "order by hunt_group_extension asc "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_ASSOC); + if ($select_type == "dialplan" || $select_type == "ivr") { + echo "\n"; + } + foreach ($result as &$row) { + $extension = $row["hunt_group_extension"]; + $hunt_group_name = $row["hunt_group_name"]; + if ("transfer $extension XML ".$_SESSION["context"] == $select_value || "transfer:".$extension." XML ".$_SESSION["context"] == $select_value) { + if ($select_type == "ivr") { + echo " \n"; + } + if ($select_type == "dialplan") { + echo " \n"; + } + $selection_found = true; + } + else { + if ($select_type == "ivr") { + echo " \n"; + } + if ($select_type == "dialplan") { + echo " \n"; + } + } + } + if ($select_type == "dialplan" || $select_type == "ivr") { + echo "\n"; + } + unset ($prep_statement, $extension); + + //list ivr menus + $sql = "select * from v_ivr_menus "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and ivr_menu_enabled = 'true' "; + $sql .= "order by ivr_menu_extension asc "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_ASSOC); + if ($select_type == "dialplan" || $select_type == "ivr") { + echo "\n"; + } + foreach ($result as &$row) { + $extension = $row["ivr_menu_extension"]; + $extension_name = $row["ivr_menu_name"]; + $extension_label = $row["ivr_menu_name"]; + $extension_name = str_replace(" ", "_", $extension_name); + if (count($_SESSION["domains"]) > 1) { + $extension_name = $_SESSION['domains'][$row['domain_uuid']]['domain_name'].'-'.$extension_name; + } + if ("ivr:".$extension_name."" == $select_value || "ivr ".$extension_name == $select_value || "transfer:".$extension." XML ".$_SESSION["context"] == $select_value) { + if ($select_type == "ivr") { + echo " \n"; + } + if ($select_type == "dialplan") { + echo " \n"; + } + $selection_found = true; + } + else { + if ($select_type == "ivr") { + echo " \n"; + } + if ($select_type == "dialplan") { + echo " \n"; + } + } + } + if ($select_type == "dialplan" || $select_type == "ivr") { + echo "\n"; + } + unset ($prep_statement, $extension); + + //list ivr menus + if ($select_type == "ivr") { + //list sub ivr menu + $sql = "select * from v_ivr_menus "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and ivr_menu_enabled = 'true' "; + $sql .= "order by ivr_menu_name asc "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_ASSOC); + if ($select_type == "dialplan" || $select_type == "ivr") { + echo "\n"; + } + foreach ($result as &$row) { + $extension_name = $row["ivr_menu_name"]; + $extension_label = $row["ivr_menu_name"]; + $extension_name = str_replace(" ", "_", $extension_name); + if (count($_SESSION["domains"]) > 1) { + $extension_name = $_SESSION['domains'][$row['domain_uuid']]['domain_name'].'-'.$extension_name; + } + if ($extension_name == $select_value) { + echo " \n"; + $selection_found = true; + } + else { + echo " \n"; + } + } + if ($select_type == "dialplan" || $select_type == "ivr") { + echo "\n"; + } + unset ($prep_statement, $extension_name); + + //list ivr misc + if ($select_type == "dialplan" || $select_type == "ivr") { + echo "\n"; + } + if ($ivr_menu_option_action == "menu-top") { + echo " \n"; + $selection_found = true; + } + else { + echo " \n"; + } + if ($ivr_menu_option_action == "menu-exit") { + echo " \n"; + $selection_found = true; + } + else { + echo " \n"; + } + if (strlen($select_value) > 0) { + if (!$selection_found) { + echo " \n"; + } + } + if ($select_type == "dialplan" || $select_type == "ivr") { + echo "\n"; + } + } + + //list the languages + if ($select_type == "dialplan" || $select_type == "ivr") { + echo "\n"; + } + //dutch + if ("menu-exec-app:set default_language=nl" == $select_value || "set:default_language=nl" == $select_value) { + if ($select_type == "ivr") { + echo " \n"; + } + if ($select_type == "dialplan") { + echo " \n"; + } + } + else { + if ($select_type == "ivr") { + echo " \n"; + } + if ($select_type == "dialplan") { + echo " \n"; + } + } + //english + if ("menu-exec-app:set default_language=en" == $select_value || "set:default_language=en" == $select_value) { + if ($select_type == "ivr") { + echo " \n"; + } + if ($select_type == "dialplan") { + echo " \n"; + } + } + else { + if ($select_type == "ivr") { + echo " \n"; + } + if ($select_type == "dialplan") { + echo " \n"; + } + } + //french + if ("menu-exec-app:set default_language=fr" == $select_value || "set:default_language=fr" == $select_value) { + if ($select_type == "ivr") { + echo " \n"; + } + if ($select_type == "dialplan") { + echo " \n"; + } + } + else { + if ($select_type == "ivr") { + echo " \n"; + } + if ($select_type == "dialplan") { + echo " \n"; + } + } + //italian + if ("menu-exec-app:set default_language=it" == $select_value || "set:default_language=it" == $select_value) { + if ($select_type == "ivr") { + echo " \n"; + } + if ($select_type == "dialplan") { + echo " \n"; + } + } + else { + if ($select_type == "ivr") { + echo " \n"; + } + if ($select_type == "dialplan") { + echo " \n"; + } + } + //german + if ("menu-exec-app:set default_language=de" == $select_value || "set:default_language=de" == $select_value) { + if ($select_type == "ivr") { + echo " \n"; + } + if ($select_type == "dialplan") { + echo " \n"; + } + } + else { + if ($select_type == "ivr") { + echo " \n"; + } + if ($select_type == "dialplan") { + echo " \n"; + } + } + //portuguese - portugal + if ("menu-exec-app:set default_language=de" == $select_value || "set:default_language=de" == $select_value) { + if ($select_type == "ivr") { + echo " \n"; + } + if ($select_type == "dialplan") { + echo " \n"; + } + } + else { + if ($select_type == "ivr") { + echo " \n"; + } + if ($select_type == "dialplan") { + echo " \n"; + } + } + //portuguese - brazil + if ("menu-exec-app:set default_language=pt-br" == $select_value || "set:default_language=de" == $select_value) { + if ($select_type == "ivr") { + echo " \n"; + } + if ($select_type == "dialplan") { + echo " \n"; + } + } + else { + if ($select_type == "ivr") { + echo " \n"; + } + if ($select_type == "dialplan") { + echo " \n"; + } + } + //spanish + if ("menu-exec-app:set default_language=es" == $select_value || "set:default_language=es" == $select_value) { + if ($select_type == "ivr") { + echo " \n"; + } + if ($select_type == "dialplan") { + echo " \n"; + } + } + else { + if ($select_type == "ivr") { + echo " \n"; + } + if ($select_type == "dialplan") { + echo " \n"; + } + } + if ($select_type == "dialplan" || $select_type == "ivr") { + echo "\n"; + } + + //recordings + if ($select_type == "dialplan" || $select_type == "ivr") { + if($dh = opendir($_SESSION['switch']['recordings']['dir']."/")) { + $tmp_selected = false; + $files = Array(); + echo "\n"; + while($file = readdir($dh)) { + if($file != "." && $file != ".." && $file[0] != '.') { + if(is_readable($_SESSION['switch']['recordings']['dir'] . "/" . $file)) { + //this is a directory + } + else { + if ($ivr_menu_greet_long == $_SESSION['switch']['recordings']['dir']."/".$file) { + $tmp_selected = true; + if ($select_type == "dialplan") { + echo " \n"; + } + if ($select_type == "ivr") { + echo " \n"; + } + } + else { + if ($select_type == "dialplan") { + echo " \n"; + } + if ($select_type == "ivr") { + echo " \n"; + } + } + } + } + } + closedir($dh); + echo "\n"; + } + } + + //ring groups + $sql = "select * from v_ring_groups "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and ring_group_enabled = 'true' "; + $sql .= "order by ring_group_extension asc "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_ASSOC); + if ($select_type == "dialplan" || $select_type == "ivr") { + echo "\n"; + } + foreach ($result as &$row) { + $extension = $row["ring_group_extension"]; + $context = $row["ring_group_context"]; + $description = $row["ring_group_description"]; + if ("transfer ".$extension." XML ".$context == $select_value || "transfer:".$extension." XML ".$context == $select_value) { + if ($select_type == "ivr") { + echo " \n"; + } + if ($select_type == "dialplan") { + echo " \n"; + } + $selection_found = true; + } + else { + if ($select_type == "ivr") { + echo " \n"; + } + if ($select_type == "dialplan") { + echo " \n"; + } + } + } + if ($select_type == "dialplan" || $select_type == "ivr") { + echo "\n"; + } + + //list time conditions + $sql = "select * from v_dialplan_details "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $x = 0; + $result = $prep_statement->fetchAll(PDO::FETCH_ASSOC); + foreach ($result as &$row) { + //$dialplan_detail_tag = $row["dialplan_detail_tag"]; + switch ($row['dialplan_detail_type']) { + case "hour": + $time_array[$row['dialplan_uuid']] = $row['dialplan_detail_type']; + break; + case "minute": + $time_array[$row['dialplan_uuid']] = $row['dialplan_detail_type']; + break; + case "minute-of-day": + $time_array[$row['dialplan_uuid']] = $row['dialplan_detail_type']; + break; + case "mday": + $time_array[$row['dialplan_uuid']] = $row['dialplan_detail_type']; + break; + case "mweek": + $time_array[$row['dialplan_uuid']] = $row['dialplan_detail_type']; + break; + case "mon": + $time_array[$row['dialplan_uuid']] = $row['dialplan_detail_type']; + break; + case "yday": + $time_array[$row['dialplan_uuid']] = $row['dialplan_detail_type']; + break; + case "year": + $time_array[$row['dialplan_uuid']] = $row['dialplan_detail_type']; + break; + case "wday": + $time_array[$row['dialplan_uuid']] = $row['dialplan_detail_type']; + break; + case "week": + $time_array[$row['dialplan_uuid']] = $row['dialplan_detail_type']; + break; + default: + //$time_array[$row['dialplan_uuid']] = $row['dialplan_detail_type']; + break; + } + } + if ($select_type == "dialplan" || $select_type == "ivr") { + echo "\n"; + } + foreach($time_array as $key=>$val) { + $dialplan_uuid = $key; + //get the extension number using the dialplan_uuid + $sql = "select dialplan_detail_data as extension_number "; + $sql .= "from v_dialplan_details "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and dialplan_uuid = '$dialplan_uuid' "; + $sql .= "and dialplan_detail_type = 'destination_number' "; + $sql .= "order by extension_number asc "; + $tmp = $db->query($sql)->fetch(PDO::FETCH_ASSOC); + $extension_number = $tmp['extension_number']; + $extension_number = ltrim($extension_number, "^"); + $extension_number = ltrim($extension_number, "\\"); + $extension_number = rtrim($extension_number, "$"); + unset($tmp); + + //get the extension number using the dialplan_uuid + $sql = "select * "; + $sql .= "from v_dialplans "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and dialplan_uuid = '$dialplan_uuid' "; + $tmp = $db->query($sql)->fetch(PDO::FETCH_ASSOC); + $dialplan_name = $tmp['dialplan_name']; + $dialplan_name = str_replace("_", " ", $dialplan_name); + unset($tmp); + + $option_label = $extension_number.' '.$dialplan_name; + if ($select_type == "ivr") { + if ("menu-exec-app:transfer ".$extension_number." XML ".$_SESSION["context"] == $select_value) { + echo " \n"; + $selection_found = true; + } + else { + echo " \n"; + } + } + if ($select_type == "dialplan") { + if ("transfer:".$extension_number == $select_value) { + echo " \n"; + $selection_found = true; + } + else { + echo " \n"; + } + } + } + if ($select_type == "dialplan" || $select_type == "ivr") { + echo "\n"; + } + unset ($prep_statement); + + //list voicemail + $sql = "select * from v_extensions "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and enabled = 'true' "; + $sql .= "order by extension asc "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_ASSOC); + if ($select_type == "dialplan" || $select_type == "ivr") { + echo "\n"; + } + foreach ($result as &$row) { + $extension = $row["extension"]; + $context = $row["user_context"]; + $description = $row["description"]; + if ("voicemail default \${domain_name} ".$extension == $select_value || "voicemail:default \${domain_name} ".$extension == $select_value) { + if ($select_type == "ivr") { + echo " \n"; + } + if ($select_type == "dialplan") { + echo " \n"; + } + $selection_found = true; + } + else { + if ($select_type == "ivr") { + echo " \n"; + } + if ($select_type == "dialplan") { + echo " \n"; + } + } + } + if ($select_type == "dialplan" || $select_type == "ivr") { + echo "\n"; + } + + //other + if (if_group("superadmin")) { + if ($select_type == "dialplan" || $select_type == "ivr" || $select_type == "call_center_contact") { + echo "\n"; + } + if ($select_type == "dialplan" || $select_type == "ivr") { + //set the default value + $selected = ''; + //answer + if ($select_value == "answer") { $selected = "selected='selected'"; } + if ($select_type == "dialplan") { + echo " \n"; + } + if ($select_type == "ivr") { + echo " \n"; + } + //bridge + if ($select_value == "bridge") { $selected = "selected='selected'"; } + if ($select_type == "dialplan") { + echo " \n"; + } + if ($select_type == "ivr") { + echo " \n"; + } + //db + if ($select_value == "db") { $selected = "selected='selected'"; } + if ($select_type == "dialplan") { + echo " \n"; + } + if ($select_type == "ivr") { + echo " \n"; + } + //export + if ($select_value == "export") { $selected = "selected='selected'"; } + if ($select_type == "dialplan") { + echo " \n"; + } + if ($select_type == "ivr") { + echo " \n"; + } + //global_set + if ($select_value == "global_set") { $selected = "selected='selected'"; } + if ($select_type == "dialplan") { + echo " \n"; + } + if ($select_type == "ivr") { + echo " \n"; + } + //group + if ($select_value == "group") { $selected = "selected='selected'"; } + if ($select_type == "dialplan") { + echo " \n"; + } + if ($select_type == "ivr") { + echo " \n"; + } + //hangup + if ($select_value == "hangup") { $selected = "selected='selected'"; } + if ($select_type == "dialplan") { + echo " \n"; + } + if ($select_type == "ivr") { + echo " \n"; + } + //info + if ($select_value == "info") { $selected = "selected='selected'"; } + if ($select_type == "dialplan") { + echo " \n"; + } + if ($select_type == "ivr") { + echo " \n"; + } + //javascript + if ($select_value == "javascript") { $selected = "selected='selected'"; } + if ($select_type == "dialplan") { + echo " \n"; + } + if ($select_type == "ivr") { + echo " \n"; + } + //lua + if ($select_value == "lua") { $selected = "selected='selected'"; } + if ($select_type == "dialplan") { + echo " \n"; + } + if ($select_type == "ivr") { + echo " \n"; + } + //perl + if ($select_value == "perl") { $selected = "selected='selected'"; } + if ($select_type == "dialplan") { + echo " \n"; + } + if ($select_type == "ivr") { + echo " \n"; + } + //reject + if ($select_value == "reject") { $selected = "selected='selected'"; } + if ($select_type == "dialplan") { + echo " \n"; + } + if ($select_type == "ivr") { + echo " \n"; + } + //set + if ($select_value == "set") { $selected = "selected='selected'"; } + if ($select_type == "dialplan") { + echo " \n"; + } + if ($select_type == "ivr") { + echo " \n"; + } + //sleep + if ($select_value == "sleep") { $selected = "selected='selected'"; } + if ($select_type == "dialplan") { + echo " \n"; + } + if ($select_type == "ivr") { + echo " \n"; + } + //transfer + if ($select_value == "transfer") { $selected = "selected='selected'"; } + if ($select_type == "dialplan") { + echo " \n"; + } + if ($select_type == "ivr") { + echo " \n"; + } + //other + if ($select_value == "other") { + echo " \n"; + } else { + echo " \n"; + } + } + if (!$selection_found) { + if (strlen($select_label) > 0) { + echo " \n"; + } + else { + echo " \n"; + } + } + if ($select_type == "dialplan" || $select_type == "ivr" || $select_type == "call_center_contact") { + echo "\n"; + } + } + + /* + //echo " \n"; + //echo " \n"; + echo " \n"; + //echo " \n"; + //echo " \n"; + //echo " \n"; + echo " \n"; + //echo " \n"; + //echo " \n"; + //echo " \n"; + //echo " \n"; + //echo " \n"; + echo " \n"; + echo " \n"; + //echo " \n"; + echo " \n"; + echo " \n"; + //echo " \n"; + echo " \n"; + //echo " \n"; + echo " \n"; + //echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + */ + unset ($prep_statement, $extension); + + echo " \n"; + if (if_group("superadmin")) { + echo ""; + } +} + +function save_setting_xml() { + global $db, $domain_uuid, $host, $config; + + $sql = "select * from v_settings "; + $prep_statement = $db->prepare(check_sql($sql)); + if ($prep_statement) { + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_ASSOC); + foreach ($result as &$row) { + $fout = fopen($_SERVER["DOCUMENT_ROOT"].PROJECT_PATH."/secure/v_config_cli.php","w"); + $tmp_xml = ""; + fwrite($fout, $tmp_xml); + unset($tmp_xml); + fclose($fout); + + $fout = fopen($_SESSION['switch']['conf']['dir']."/directory/default/default.xml","w"); + $tmp_xml = "\n"; + $tmp_xml .= " \n"; + $tmp_xml .= " \n"; + $tmp_xml .= " \n"; + $tmp_xml .= " \n"; + $tmp_xml .= " \n"; + $tmp_xml .= " \n"; + $tmp_xml .= " \n"; + $tmp_xml .= " \n"; + $tmp_xml .= " \n"; + $tmp_xml .= "\n"; + fwrite($fout, $tmp_xml); + unset($tmp_xml); + fclose($fout); + + $event_socket_ip_address = $row['event_socket_ip_address']; + if (strlen($event_socket_ip_address) == 0) { $event_socket_ip_address = '127.0.0.1'; } + + $fout = fopen($_SESSION['switch']['conf']['dir']."/autoload_configs/event_socket.conf.xml","w"); + $tmp_xml = "\n"; + $tmp_xml .= " \n"; + $tmp_xml .= " \n"; + $tmp_xml .= " \n"; + $tmp_xml .= " \n"; + $tmp_xml .= " \n"; + $tmp_xml .= " \n"; + $tmp_xml .= ""; + fwrite($fout, $tmp_xml); + unset($tmp_xml, $event_socket_password); + fclose($fout); + + $fout = fopen($_SESSION['switch']['conf']['dir']."/autoload_configs/xml_rpc.conf.xml","w"); + $tmp_xml = "\n"; + $tmp_xml .= " \n"; + $tmp_xml .= " \n"; + $tmp_xml .= " \n"; + $tmp_xml .= " \n"; + $tmp_xml .= " \n"; + $tmp_xml .= " \n"; + $tmp_xml .= " \n"; + $tmp_xml .= " \n"; + $tmp_xml .= "\n"; + fwrite($fout, $tmp_xml); + unset($tmp_xml); + fclose($fout); + + //shout.conf.xml + $fout = fopen($_SESSION['switch']['conf']['dir']."/autoload_configs/shout.conf.xml","w"); + $tmp_xml = "\n"; + $tmp_xml .= " \n"; + $tmp_xml .= " \n"; + $tmp_xml .= " \n"; + $tmp_xml .= " \n"; + $tmp_xml .= " \n"; + $tmp_xml .= " \n"; + $tmp_xml .= ""; + fwrite($fout, $tmp_xml); + unset($tmp_xml); + fclose($fout); + + break; //limit to 1 row + } + unset ($prep_statement); + } + + //apply settings reminder + $_SESSION["reload_xml"] = true; + + //$cmd = "api reloadxml"; + //event_socket_request_cmd($cmd); + //unset($cmd); +} + +function save_extension_xml() { + //declare global variables + global $config, $db, $domain_uuid; + + //get the context based from the domain_uuid + if (count($_SESSION['domains']) == 1) { + $user_context = "default"; + } + else { + $user_context = $_SESSION['domains'][$domain_uuid]['domain_name']; + } + + //delete all old extensions to prepare for new ones + $dialplan_list = glob($_SESSION['switch']['extensions']['dir']."/".$user_context."/v_*.xml"); + foreach($dialplan_list as $name => $value) { + unlink($value); + } + + //write the xml files + $sql = "select * from v_extensions "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "order by call_group asc "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $i = 0; + $extension_xml_condensed = false; + + while($row = $prep_statement->fetch(PDO::FETCH_ASSOC)) { + $call_group = $row['call_group']; + $call_group = str_replace(";", ",", $call_group); + $tmp_array = explode(",", $call_group); + foreach ($tmp_array as &$tmp_call_group) { + $tmp_call_group = trim($tmp_call_group); + if (strlen($tmp_call_group) > 0) { + if (strlen($call_group_array[$tmp_call_group]) == 0) { + $call_group_array[$tmp_call_group] = $row['extension']; + } + else { + $call_group_array[$tmp_call_group] = $call_group_array[$tmp_call_group].','.$row['extension']; + } + } + $i++; + } + $user_context = $row['user_context']; + $vm_password = $row['vm_password']; + $vm_password = str_replace("#", "", $vm_password); //preserves leading zeros + + //echo "enabled: ".$row['enabled']; + if ($row['enabled'] != "false") { + //remove invalid characters from the file names + $extension = $row['extension']; + $extension = str_replace(" ", "_", $extension); + $extension = preg_replace("/[\*\:\\/\<\>\|\'\"\?]/", "", $extension); + + $tmp_xml .= "\n"; + $cidr = ''; + if (strlen($row['cidr']) > 0) { + $cidr = " cidr=\"" . $row['cidr'] . "\""; + } + $number_alias = ''; + if (strlen($row['number_alias']) > 0) { + $number_alias = " number-alias=\"".$row['number_alias']."\""; + } + $tmp_xml .= " \n"; + $tmp_xml .= " \n"; + $tmp_xml .= " \n"; + $tmp_xml .= " \n"; + switch ($row['vm_enabled']) { + case "true": + $tmp_xml .= " \n"; + break; + case "false": + $tmp_xml .= " \n"; + break; + default: + $tmp_xml .= " \n"; + } + if (strlen($row['vm_mailto']) > 0) { + $tmp_xml .= " \n"; + + switch ($row['vm_attach_file']) { + case "true": + $tmp_xml .= " \n"; + break; + case "false": + $tmp_xml .= " \n"; + break; + default: + $tmp_xml .= " \n"; + } + switch ($row['vm_keep_local_after_email']) { + case "true": + $tmp_xml .= " \n"; + break; + case "false": + $tmp_xml .= " \n"; + break; + default: + $tmp_xml .= " \n"; + } + $tmp_xml .= " \n"; + } + if (strlen($row['mwi_account']) > 0) { + $tmp_xml .= " \n"; + } + if (strlen($row['auth_acl']) > 0) { + $tmp_xml .= " \n"; + } + if (strlen($row['directory_exten_visible']) > 0) { + $tmp_xml .= " \n"; + } + $tmp_xml .= " \n"; + $tmp_xml .= " \n"; + if (strlen($row['call_group']) > 0) { + $tmp_xml .= " \n"; + } + if (strlen($row['hold_music']) > 0) { + $tmp_xml .= " \n"; + } + $tmp_xml .= " \n"; + if (strlen($switch_account_code) > 0) { + $tmp_xml .= " \n"; + } + else { + $tmp_xml .= " \n"; + } + $tmp_xml .= " \n"; + if (strlen($row['effective_caller_id_name']) > 0) { + $tmp_xml .= " \n"; + } + if (strlen($row['effective_caller_id_number']) > 0) { + $tmp_xml .= " \n"; + } + if (strlen($row['outbound_caller_id_name']) > 0) { + $tmp_xml .= " \n"; + } + if (strlen($row['outbound_caller_id_number']) > 0) { + $tmp_xml .= " \n"; + } + if (strlen($row['emergency_caller_id_number']) > 0) { + $tmp_xml .= " \n"; + } + if (strlen($row['directory_full_name']) > 0) { + $tmp_xml .= " \n"; + } + if (strlen($row['directory_visible']) > 0) { + $tmp_xml .= " \n"; + } + if (strlen($row['limit_max']) > 0) { + $tmp_xml .= " \n"; + } + else { + $tmp_xml .= " \n"; + } + if (strlen($row['limit_destination']) > 0) { + $tmp_xml .= " \n"; + } + if (strlen($row['sip_force_contact']) > 0) { + $tmp_xml .= " \n"; + } + if (strlen($row['sip_force_expires']) > 0) { + $tmp_xml .= " \n"; + } + if (strlen($row['nibble_account']) > 0) { + $tmp_xml .= " \n"; + } + switch ($row['sip_bypass_media']) { + case "bypass-media": + $tmp_xml .= " \n"; + break; + case "bypass-media-after-bridge": + $tmp_xml .= " \n"; + break; + case "proxy-media": + $tmp_xml .= " \n"; + break; + } + + $tmp_xml .= " \n"; + $tmp_xml .= " \n"; + + if (!is_readable($_SESSION['switch']['extensions']['dir']."/".$row['user_context'])) { + mkdir($_SESSION['switch']['extensions']['dir']."/".$row['user_context'],0755,true); + } + if (strlen($extension) > 0) { + $fout = fopen($_SESSION['switch']['extensions']['dir']."/".$row['user_context']."/v_".$extension.".xml","w"); + } + $tmp_xml .= "\n"; + fwrite($fout, $tmp_xml); + unset($tmp_xml); + fclose($fout); + } + } + unset ($prep_statement); + + //prepare extension + $extension_dir_path = realpath($_SESSION['switch']['extensions']['dir']); + $user_context = str_replace(" ", "_", $user_context); + $user_context = preg_replace("/[\*\:\\/\<\>\|\'\"\?]/", "", $user_context); + + //define the group members + $tmp_xml = "\n"; + $tmp_xml .= "\n"; + $tmp_xml .= "\n"; + $tmp_xml .= " \n"; + if ($user_context == "default") { + $tmp_xml .= " \n"; + } + else { + $tmp_xml .= " \n"; + } + $tmp_xml .= " \n"; + $tmp_xml .= " \n"; + $tmp_xml .= " \n"; + $tmp_xml .= "\n"; + $tmp_xml .= " \n"; + $tmp_xml .= " \n"; + $tmp_xml .= " \n"; + $tmp_xml .= " \n"; + $tmp_xml .= " \n"; + $tmp_xml .= " \n"; + $tmp_xml .= " \n"; + $tmp_xml .= "\n"; + $tmp_xml .= " \n"; + $tmp_xml .= " \n"; + $tmp_xml .= " \n"; + $tmp_xml .= " \n"; + $tmp_xml .= " \n"; + $tmp_xml .= " \n"; + $tmp_xml .= "\n"; + $previous_call_group = ""; + foreach ($call_group_array as $key => $value) { + $call_group = trim($key); + $extension_list = trim($value); + if (strlen($call_group) > 0) { + if ($previous_call_group != $call_group) { + $tmp_xml .= " \n"; + $tmp_xml .= " \n"; + $tmp_xml .= " \n"; + $extension_array = explode(",", $extension_list); + foreach ($extension_array as &$tmp_extension) { + $tmp_xml .= " \n"; + } + $tmp_xml .= " \n"; + $tmp_xml .= " \n"; + $tmp_xml .= "\n"; + } + $previous_call_group = $call_group; + } + unset($call_group); + } + $tmp_xml .= " \n"; + $tmp_xml .= "\n"; + $tmp_xml .= " \n"; + $tmp_xml .= ""; + + //write the xml file + if (is_readable($extension_dir_path) && strlen($extension_dir_path) > 0) { + $fout = fopen($extension_dir_path."/".$user_context.".xml","w"); + fwrite($fout, $tmp_xml); + unset($tmp_xml); + fclose($fout); + } + + //syncrhonize the phone directory + sync_directory(); + + //apply settings reminder + $_SESSION["reload_xml"] = true; + + //$cmd = "api reloadxml"; + //event_socket_request_cmd($cmd); + //unset($cmd); +} + +function filename_safe($filename) { + // lower case + $filename = strtolower($filename); + + // replace spaces with a '_' + $filename = str_replace(" ", "_", $filename); + + // loop through string + $result = ''; + for ($i=0; $i 1) { + $v_needle = 'v_'.$_SESSION['domain_name'].'-'; + } + else { + $v_needle = 'v_'; + } + $gateway_list = glob($_SESSION['switch']['gateways']['dir'] . "/*/".$v_needle."*.xml"); + foreach ($gateway_list as $gateway_file) { + unlink($gateway_file); + } + + //get the list of gateways and write the xml + $sql = "select * from v_gateways "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_ASSOC); + foreach ($result as &$row) { + if ($row['enabled'] != "false") { + //remove invalid characters from the file names + $gateway = $row['gateway']; + $gateway = str_replace(" ", "_", $gateway); + $gateway = preg_replace("/[\*\:\\/\<\>\|\'\"\?]/", "", $gateway); + //set the default profile as external + $profile = $row['profile']; + if (strlen($profile) == 0) { + $profile = "external"; + } + if (count($_SESSION["domains"]) > 1) { + $fout = fopen($_SESSION['switch']['gateways']['dir']."/".$profile."/v_".$_SESSION['domain_name'].'-'.$gateway.".xml","w"); + $tmp_xml .= "\n"; + $tmp_xml .= " \n"; + } + else { + $fout = fopen($_SESSION['switch']['gateways']['dir']."/".$profile."/v_".$gateway.".xml","w"); + $tmp_xml .= "\n"; + $tmp_xml .= " \n"; + } + if (strlen($row['username']) > 0) { + $tmp_xml .= " \n"; + } + else { + $tmp_xml .= " \n"; + } + if (strlen($row['distinct_to']) > 0) { + $tmp_xml .= " \n"; + } + if (strlen($row['auth_username']) > 0) { + $tmp_xml .= " \n"; + } + if (strlen($row['password']) > 0) { + $tmp_xml .= " \n"; + } + else { + $tmp_xml .= " \n"; + } + if (strlen($row['realm']) > 0) { + $tmp_xml .= " \n"; + } + if (strlen($row['from_user']) > 0) { + $tmp_xml .= " \n"; + } + if (strlen($row['from_domain']) > 0) { + $tmp_xml .= " \n"; + } + if (strlen($row['proxy']) > 0) { + $tmp_xml .= " \n"; + } + if (strlen($row['register_proxy']) > 0) { + $tmp_xml .= " \n"; + } + if (strlen($row['outbound_proxy']) > 0) { + $tmp_xml .= " \n"; + } + if (strlen($row['expire_seconds']) > 0) { + $tmp_xml .= " \n"; + } + if (strlen($row['register']) > 0) { + $tmp_xml .= " \n"; + } + + if (strlen($row['register_transport']) > 0) { + switch ($row['register_transport']) { + case "udp": + $tmp_xml .= " \n"; + break; + case "tcp": + $tmp_xml .= " \n"; + break; + case "tls": + $tmp_xml .= " \n"; + $tmp_xml .= " \n"; + break; + default: + $tmp_xml .= " \n"; + } + } + + if (strlen($row['retry_seconds']) > 0) { + $tmp_xml .= " \n"; + } + if (strlen($row['extension']) > 0) { + $tmp_xml .= " \n"; + } + if (strlen($row['ping']) > 0) { + $tmp_xml .= " \n"; + } + if (strlen($row['context']) > 0) { + $tmp_xml .= " \n"; + } + if (strlen($row['caller_id_in_from']) > 0) { + $tmp_xml .= " \n"; + } + if (strlen($row['supress_cng']) > 0) { + $tmp_xml .= " \n"; + } + if (strlen($row['sip_cid_type']) > 0) { + $tmp_xml .= " \n"; + } + if (strlen($row['extension_in_contact']) > 0) { + $tmp_xml .= " \n"; + } + + $tmp_xml .= " \n"; + $tmp_xml .= ""; + + fwrite($fout, $tmp_xml); + unset($tmp_xml); + fclose($fout); + } + + } //end foreach + unset($prep_statement); + + //apply settings reminder + $_SESSION["reload_xml"] = true; + +} + + +function save_module_xml() { + global $config, $db, $domain_uuid; + + $xml = ""; + $xml .= "\n"; + $xml .= " \n"; + + $sql = "select * from v_modules "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $prev_module_cat = ''; + $result = $prep_statement->fetchAll(PDO::FETCH_ASSOC); + foreach ($result as $row) { + if ($prev_module_cat != $row['module_cat']) { + $xml .= "\n \n"; + } + if ($row['module_enabled'] == "true"){ + $xml .= " \n"; + } + $prev_module_cat = $row['module_cat']; + } + $xml .= "\n"; + $xml .= " \n"; + $xml .= ""; + + $fout = fopen($_SESSION['switch']['conf']['dir']."/autoload_configs/modules.conf.xml","w"); + fwrite($fout, $xml); + unset($xml); + fclose($fout); + + //apply settings reminder + $_SESSION["reload_xml"] = true; + + //$cmd = "api reloadxml"; + //event_socket_request_cmd($cmd); + //unset($cmd); +} + +function save_var_xml() { + global $config, $db, $domain_uuid; + + $fout = fopen($_SESSION['switch']['conf']['dir']."/vars.xml","w"); + $xml = ''; + + $sql = "select * from v_vars "; + $sql .= "where var_enabled = 'true' "; + $sql .= "order by var_cat, var_order asc "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $prev_var_cat = ''; + $result = $prep_statement->fetchAll(PDO::FETCH_ASSOC); + foreach ($result as &$row) { + if ($row['var_cat'] != 'Provision') { + if ($prev_var_cat != $row['var_cat']) { + $xml .= "\n\n"; + if (strlen($row["var_description"]) > 0) { + $xml .= "\n"; + } + } + $xml .= "\n"; + } + $prev_var_cat = $row['var_cat']; + } + $xml .= "\n"; + fwrite($fout, $xml); + unset($xml); + fclose($fout); + + //apply settings reminder + $_SESSION["reload_xml"] = true; + + //$cmd = "api reloadxml"; + //event_socket_request_cmd($cmd); + //unset($cmd); +} + +function outbound_route_to_bridge ($destination_number) { + global $domain_uuid, $db; + + $destination_number = trim($destination_number); + if (is_numeric($destination_number)) { + //not found, continue to process the function + } + else { + //not a number, brige_array and exit the function + $bridge_array[0] = $destination_number; + return $bridge_array; + } + + $sql = "select * from v_dialplans "; + $sql .= "where domain_uuid = '".$domain_uuid."' "; + $sql .= "and app_uuid = '8c914ec3-9fc0-8ab5-4cda-6c9288bdc9a3' "; + $sql .= "order by dialplan_order asc "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_ASSOC); + $x = 0; + foreach ($result as &$row) { + //set as variables + $dialplan_uuid = $row['dialplan_uuid']; + $dialplan_detail_tag = $row["dialplan_detail_tag"]; + $dialplan_detail_type = $row['dialplan_detail_type']; + $dialplan_continue = $row['dialplan_continue']; + + //get the extension number using the dialplan_uuid + $sql = "select * "; + $sql .= "from v_dialplan_details "; + $sql .= "where domain_uuid = '".$_SESSION['domain_uuid']."' "; + $sql .= "and dialplan_uuid = '$dialplan_uuid' "; + $sql .= "order by dialplan_detail_order asc "; + $sub_result = $db->query($sql)->fetchAll(PDO::FETCH_ASSOC); + $regex_match = false; + foreach ($sub_result as &$sub_row) { + if ($sub_row['dialplan_detail_tag'] == "condition") { + if ($sub_row['dialplan_detail_type'] == "destination_number") { + $dialplan_detail_data = $sub_row['dialplan_detail_data']; + $pattern = '/'.$dialplan_detail_data.'/'; + preg_match($pattern, $destination_number, $matches, PREG_OFFSET_CAPTURE); + if (count($matches) == 0) { + $regex_match = false; + } + else { + $regex_match = true; + $regex_match_1 = $matches[1][0]; + $regex_match_2 = $matches[2][0]; + $regex_match_3 = $matches[3][0]; + $regex_match_4 = $matches[4][0]; + $regex_match_5 = $matches[5][0]; + } + } + } + } + if ($regex_match) { + foreach ($sub_result as &$sub_row) { + $dialplan_detail_data = $sub_row['dialplan_detail_data']; + if ($sub_row['dialplan_detail_tag'] == "action" && $sub_row['dialplan_detail_type'] == "bridge" && $dialplan_detail_data != "\${enum_auto_route}") { + $dialplan_detail_data = str_replace("\$1", $regex_match_1, $dialplan_detail_data); + $dialplan_detail_data = str_replace("\$2", $regex_match_2, $dialplan_detail_data); + $dialplan_detail_data = str_replace("\$3", $regex_match_3, $dialplan_detail_data); + $dialplan_detail_data = str_replace("\$4", $regex_match_4, $dialplan_detail_data); + $dialplan_detail_data = str_replace("\$5", $regex_match_5, $dialplan_detail_data); + //echo "dialplan_detail_data: $dialplan_detail_data"; + $bridge_array[$x] = $dialplan_detail_data; + $x++; + if ($dialplan_continue == "false") { + break 2; + } + } + } + } + } + return $bridge_array; + unset ($prep_statement); +} +//$destination_number = '1231234'; +//$bridge_array = outbound_route_to_bridge ($destination_number); +//foreach ($bridge_array as &$bridge) { +// echo "bridge: ".$bridge."
      "; +//} + +function extension_exists($extension) { + global $db, $domain_uuid; + $sql = "select * from v_extensions "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and extension = '$extension' "; + $sql .= "and enabled = 'true' "; + $result = $db->query($sql)->fetchAll(PDO::FETCH_ASSOC); + if (count($result) > 0) { + return true; + } + else { + return false; + } +} + +function save_hunt_group_xml() { + + //Hunt Group Lua Notes: + //get the domain + //loop through all Hunt Groups + //get the Hunt Group information such as the name and description + //add each Hunt Group to the dialplan + //get the list of destinations then build the Hunt Group lua + + //get the domain + global $db, $domain_uuid, $host, $config; + + $tmp = ""; + $tmp .= "\n"; + $tmp .= " domain_name = \"".$domain."\"; //by default this is the ipv4 address of FreeSWITCH used for transfer to voicemail\n"; + $tmp .= "\n"; + $tmp .= "\n"; + + //prepare for hunt group .lua files to be written. delete all hunt groups that are prefixed with huntgroup_ and have a file extension of .lua + $v_prefix = 'v_huntgroup_'; + if($dh = opendir($_SESSION['switch']['scripts']['dir'])) { + $files = Array(); + while($file = readdir($dh)) { + if($file != "." && $file != ".." && $file[0] != '.') { + if(is_dir($dir . "/" . $file)) { + //this is a directory + } else { + if (substr($file,0, strlen($v_prefix)) == $v_prefix && substr($file,-4) == '.lua') { + if ($file != "huntgroup_originate.lua") { + unlink($_SESSION['switch']['scripts']['dir'].'/'.$file); + } + } + } + } + } + closedir($dh); + } + + //loop through all Hunt Groups + $x = 0; + + $sql = "select * from v_hunt_groups "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_ASSOC); + foreach ($result as &$row) { + //get the Hunt Group information such as the name and description + //$row['hunt_group_uuid'] + //$row['hunt_group_extension'] + //$row['hunt_group_name'] + //$row['hunt_group_type'] + //$row['hunt_group_timeout'] + //$row['hunt_group_context'] + //$row['hunt_group_ringback'] + //$row['hunt_group_cid_name_prefix'] + //$row['hunt_group_pin'] + //$row['hunt_group_caller_announce'] + //$row['hunt_group_enabled'] + //$row['hunt_group_description'] + $domain_uuid = $row['domain_uuid']; + $dialplan_uuid = $row['dialplan_uuid']; + + //add each hunt group to the dialplan + if (strlen($row['hunt_group_uuid']) > 0) { + //set default action to add + $action = 'add'; + //check whether the dialplan entry exists in the database + $action = 'add'; //set default action to add + $i = 0; + $sql = "select count(*) as num_rows from v_dialplans "; + $sql .= "where domain_uuid = '".$domain_uuid."' "; + $sql .= "and dialplan_uuid = '".$dialplan_uuid."' "; + $prep_statement_2 = $db->prepare(check_sql($sql)); + if ($prep_statement_2) { + $prep_statement_2->execute(); + $row2 = $prep_statement_2->fetch(PDO::FETCH_ASSOC); + if ($row2['num_rows'] > 0) { + //$num_rows = $row2['num_rows']; + $action = 'update'; + } + } + unset($prep_statement, $result); + + if ($action == 'add') { + //create dialplan entry for each huntgroup + $app_uuid = '0610f841-2e27-4c5f-7926-08ab3aad02e0'; + if ($row['hunt_group_enabled'] == "false") { + $dialplan_enabled = 'false'; + } + else { + $dialplan_enabled = 'true'; + } + if (strlen($dialplan_uuid) == 0) { + //create a dialplan uuid + $dialplan_uuid = uuid(); + //update the hunt groups table with the database + $sql = "update v_hunt_groups "; + $sql .= "set dialplan_uuid = '".$dialplan_uuid."' "; + $sql .= "where domain_uuid = '".$_SESSION['domain_uuid']."' "; + $sql .= "and hunt_group_uuid = '".$row['hunt_group_uuid']."' "; + $db->query($sql); + unset($sql); + } + + require_once "includes/classes/dialplan.php"; + $dialplan = new dialplan; + $dialplan->domain_uuid = $_SESSION['domain_uuid']; + $dialplan->app_uuid = $app_uuid; + $dialplan->dialplan_uuid = $dialplan_uuid; + $dialplan->dialplan_name = $row['hunt_group_name']; + //$dialplan->dialplan_continue = $dialplan_continue; + $dialplan->dialplan_order = '330'; + $dialplan->dialplan_context = $_SESSION['context']; + $dialplan->dialplan_enabled = $dialplan_enabled; + $dialplan->dialplan_description = $row['hunt_group_description']; + $dialplan->dialplan_add(); + unset($dialplan); + } + + if ($action == 'update') { + //update the huntgroup fifo + $dialplan_name = $row['hunt_group_name'].'.park'; + $dialplan_order = '330'; + $context = $row['hunt_group_context']; + if ($row['hunt_group_enabled'] == "false") { + $enabled = 'false'; + } + else { + $enabled = 'true'; + } + $description = $row['hunt_group_description']; + $hunt_group_uuid = $row['hunt_group_uuid']; + + $sql = "update v_dialplans set "; + $sql .= "dialplan_name = '$dialplan_name', "; + $sql .= "dialplan_order = '$dialplan_order', "; + $sql .= "dialplan_context = '$context', "; + $sql .= "dialplan_enabled = '$enabled', "; + $sql .= "dialplan_description = '$description' "; + $sql .= "where domain_uuid = '".$_SESSION['domain_uuid']."' "; + $sql .= "and dialplan_uuid = '".$dialplan_uuid."' "; + $db->query($sql); + unset($sql); + + $sql = "delete from v_dialplan_details "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and dialplan_uuid = '$dialplan_uuid' "; + $db->query($sql); + unset($sql); + } + + //if action is add or update + if ($action == 'add' || $action == 'update') { + require_once "includes/classes/dialplan.php"; + $dialplan = new dialplan; + $dialplan->domain_uuid = $_SESSION['domain_uuid']; + $dialplan->dialplan_uuid = $dialplan_uuid; + $dialplan->dialplan_detail_tag = 'condition'; //condition, action, antiaction + $dialplan->dialplan_detail_type = 'destination_number'; + $dialplan->dialplan_detail_data = '^'.$row['hunt_group_extension'].'$'; + //$dialplan->dialplan_detail_break = ''; + //$dialplan->dialplan_detail_inline = ''; + $dialplan->dialplan_detail_group = '1'; + $dialplan->dialplan_detail_order = '010'; + $dialplan->dialplan_detail_add(); + unset($dialplan); + + $dialplan = new dialplan; + $dialplan->domain_uuid = $_SESSION['domain_uuid']; + $dialplan->dialplan_uuid = $dialplan_uuid; + $dialplan->dialplan_detail_tag = 'action'; //condition, action, antiaction + $dialplan->dialplan_detail_type = 'lua'; + $dialplan->dialplan_detail_data = 'v_huntgroup_'.$_SESSION['domain_name'].'_'.$row['hunt_group_extension'].'.lua'; + //$dialplan->dialplan_detail_break = ''; + //$dialplan->dialplan_detail_inline = ''; + $dialplan->dialplan_detail_group = '1'; + $dialplan->dialplan_detail_order = '020'; + $dialplan->dialplan_detail_add(); + unset($dialplan); + + $dialplan = new dialplan; + $dialplan->domain_uuid = $_SESSION['domain_uuid']; + $dialplan->dialplan_uuid = $dialplan_uuid; + $dialplan->dialplan_detail_tag = 'condition'; //condition, action, antiaction + $dialplan->dialplan_detail_type = 'destination_number'; + $dialplan->dialplan_detail_data = '^\*'.$row['hunt_group_extension'].'$'; + $dialplan->dialplan_detail_break = 'on-true'; + //$dialplan->dialplan_detail_inline = ''; + $dialplan->dialplan_detail_group = '2'; + $dialplan->dialplan_detail_order = '020'; + $dialplan->dialplan_detail_add(); + unset($dialplan); + + $dialplan = new dialplan; + $dialplan->domain_uuid = $_SESSION['domain_uuid']; + $dialplan->dialplan_uuid = $dialplan_uuid; + $dialplan->dialplan_detail_tag = 'action'; //condition, action, antiaction + $dialplan->dialplan_detail_type = 'set'; + $dialplan->dialplan_detail_data = 'fifo_music=$${hold_music}'; + //$dialplan->dialplan_detail_break = ''; + //$dialplan->dialplan_detail_inline = ''; + $dialplan->dialplan_detail_group = '2'; + $dialplan->dialplan_detail_order = '020'; + $dialplan->dialplan_detail_add(); + unset($dialplan); + + $hunt_group_timeout_type = $row['hunt_group_timeout_type']; + $hunt_group_timeout_destination = $row['hunt_group_timeout_destination']; + if ($hunt_group_timeout_type == "voicemail") { $hunt_group_timeout_destination = '*99'.$hunt_group_timeout_destination; } + $dialplan = new dialplan; + $dialplan->domain_uuid = $_SESSION['domain_uuid']; + $dialplan->dialplan_uuid = $dialplan_uuid; + $dialplan->dialplan_detail_tag = 'action'; //condition, action, antiaction + $dialplan->dialplan_detail_type = 'set'; + $dialplan->dialplan_detail_data = 'fifo_orbit_exten='.$hunt_group_timeout_destination.':'.$row['hunt_group_timeout']; + //$dialplan->dialplan_detail_break = ''; + //$dialplan->dialplan_detail_inline = ''; + $dialplan->dialplan_detail_group = '2'; + $dialplan->dialplan_detail_order = '030'; + $dialplan->dialplan_detail_add(); + unset($dialplan); + + $dialplan = new dialplan; + $dialplan->domain_uuid = $_SESSION['domain_uuid']; + $dialplan->dialplan_uuid = $dialplan_uuid; + $dialplan->dialplan_detail_tag = 'action'; //condition, action, antiaction + $dialplan->dialplan_detail_type = 'fifo'; + $dialplan->dialplan_detail_data = $row['hunt_group_extension'].'@${domain_name} in'; + //$dialplan->dialplan_detail_break = ''; + //$dialplan->dialplan_detail_inline = ''; + $dialplan->dialplan_detail_group = '2'; + $dialplan->dialplan_detail_order = '040'; + $dialplan->dialplan_detail_add(); + unset($dialplan); + } + + //save the dialplan xml files + save_dialplan_xml(); + } //end if strlen hunt_group_uuid; add the Hunt Group to the dialplan + + //get the list of destinations then build the Hunt Group Lua + $tmp = "\n"; + $tmp .= "session:preAnswer();\n"; + $tmp .= "extension = '".$row['hunt_group_extension']."';\n"; + $tmp .= "result = '';\n"; + $tmp .= "timeoutpin = 7500;\n"; + $tmp .= "sip_profile = 'internal';\n"; + $tmp .= "\n"; + + $tmp .= "function extension_registered(domain_name, sip_profile, extension)\n"; + $tmp .= " api = freeswitch.API();\n"; + $tmp .= " result = api:execute(\"sofia_contact\", sip_profile..\"/\"..extension..\"@\"..domain_name);\n"; + $tmp .= " if (result == \"error/user_not_registered\") then\n"; + $tmp .= " return false;\n"; + $tmp .= " else\n"; + $tmp .= " return true;\n"; + $tmp .= " end\n"; + $tmp .= "end\n"; + $tmp .= "\n"; + + $tmp .= "\n"; + $tmp .= "sounds_dir = session:getVariable(\"sounds_dir\");\n"; + $tmp .= "uuid = session:getVariable(\"uuid\");\n"; + $tmp .= "dialed_extension = session:getVariable(\"dialed_extension\");\n"; + $tmp .= "domain_name = session:getVariable(\"domain_name\");\n"; + $tmp .= "caller_id_name = session:getVariable(\"caller_id_name\");\n"; + $tmp .= "caller_id_number = session:getVariable(\"caller_id_number\");\n"; + $tmp .= "effective_caller_id_name = session:getVariable(\"effective_caller_id_name\");\n"; + $tmp .= "effective_caller_id_number = session:getVariable(\"effective_caller_id_number\");\n"; + $tmp .= "outbound_caller_id_name = session:getVariable(\"outbound_caller_id_name\");\n"; + $tmp .= "outbound_caller_id_number = session:getVariable(\"outbound_caller_id_number\");\n"; + $tmp .= "\n"; + + $tmp .= "--set the sounds path for the language, dialect and voice\n"; + $tmp .= " default_language = session:getVariable(\"default_language\");\n"; + $tmp .= " default_dialect = session:getVariable(\"default_dialect\");\n"; + $tmp .= " default_voice = session:getVariable(\"default_voice\");\n"; + $tmp .= " if (not default_language) then default_language = 'en'; end\n"; + $tmp .= " if (not default_dialect) then default_dialect = 'us'; end\n"; + $tmp .= " if (not default_voice) then default_voice = 'callie'; end\n"; + $tmp .= "\n"; + + //pin number requested from caller if provided + if (strlen($row['hunt_group_pin']) > 0) { + $tmp .= "pin = '".$row['hunt_group_pin']."';\n"; + $tmp .= "digits = session:playAndGetDigits(".strlen($row['hunt_group_pin']).", ".strlen($row['hunt_group_pin']).", 3, 3000, \"#\", sounds_dir..\"/\"..default_language..\"/\"..default_dialect..\"/\"..default_voice..\"/custom/please_enter_the_pin_number.wav\", \"\", \"\\\\d+\");\n"; + $tmp .= "\n"; + $tmp .= "\n"; + $tmp .= "if (digits == pin) then\n"; + $tmp .= " --continue\n"; + $tmp .= "\n"; + } + + //caller announce requested from caller if provided + if ($row['hunt_group_caller_announce'] == "true" || $row['hunt_group_call_prompt'] == "true") { + if ($row['hunt_group_caller_announce'] == "true") { + $tmp .= "function originate(domain_name, session, sipuri, extension, caller_id_name, caller_id_number, caller_announce) \n"; + } + else { + $tmp .= "function originate(domain_name, session, sipuri, extension, caller_id_name, caller_id_number) \n"; + } + $tmp .= " --caller_id_name = caller_id_name.replace(\" \", \"..\");\n"; + $tmp .= " caller_id_name = string.gsub(caller_id_name, \" \", \"..\");\n"; + //$tmp .= " --session:execute(\"luarun\", \"huntgroup_originate.lua \"..domain_name..\" \"..uuid..\" \"..sipuri..\" \"..extension..\" \"..caller_id_name..\" \"..caller_id_number..\" \"..caller_announce);\n"; + $tmp .= " api = freeswitch.API();\n"; + if ($row['hunt_group_caller_announce'] == "true") { + $tmp .= " result = api:execute(\"luarun\", \"huntgroup_originate.lua \"..domain_name..\" \"..uuid..\" \"..sipuri..\" \"..extension..\" \"..caller_id_name..\" \"..caller_id_number..\" \"..caller_announce);\n"; + } + else { + $tmp .= " result = api:execute(\"luarun\", \"huntgroup_originate.lua \"..domain_name..\" \"..uuid..\" \"..sipuri..\" \"..extension..\" \"..caller_id_name..\" \"..caller_id_number..\"\");\n"; + } + $tmp .= "end"; + $tmp .= "\n"; + + if ($row['hunt_group_caller_announce'] == "true") { + $tmp .= "caller_announce = \"".$tmp_dir."/\"..extension..\"_\"..uuid..\".wav\";\n"; + $tmp .= "session:streamFile(sounds_dir..\"/\"..default_language..\"/\"..default_dialect..\"/\"..default_voice..\"/custom/please_say_your_name_and_reason_for_calling.wav\");\n"; + $tmp .= "session:execute(\"gentones\", \"%(1000, 0, 640)\");\n"; + $tmp .= "session:execute(\"set\", \"playback_terminators=#\");\n"; + $tmp .= "session:execute(\"record\", caller_announce..\" 180 200\");\n"; + } + $tmp .= "\n"; + $tmp .= "session:setAutoHangup(false);\n"; + $tmp .= "session:execute(\"transfer\", \"*\"..extension..\" XML ".$_SESSION["context"]."\");\n"; + $tmp .= "\n"; + } + + //set caller id prefix + if (strlen($row['hunt_group_cid_name_prefix'])> 0) { + $tmp .= "if caller_id_name then\n"; + $tmp .= " session:setVariable(\"caller_id_name\", \"".$row['hunt_group_cid_name_prefix']."\"..caller_id_name);\n"; + $tmp .= "end\n"; + $tmp .= "if effective_caller_id_name then\n"; + $tmp .= " session:setVariable(\"effective_caller_id_name\", \"".$row['hunt_group_cid_name_prefix']."\"..effective_caller_id_name);\n"; + $tmp .= "elseif caller_id_name then\n"; + $tmp .= " --effective_caller_id_name missing, set to caller_id_name\n"; + $tmp .= " session:setVariable(\"effective_caller_id_name\", \"".$row['hunt_group_cid_name_prefix']."\"..caller_id_name);\n"; + $tmp .= "end\n"; + $tmp .= "if outbound_caller_id_name then\n"; + $tmp .= " session:setVariable(\"outbound_caller_id_name\", \"".$row['hunt_group_cid_name_prefix']."\"..outbound_caller_id_name);\n"; + $tmp .= "end\n"; + } + + //set ring back + if (isset($row['hunt_group_ringback'])){ + if ($row['hunt_group_ringback'] == "music"){ + $tmp .= "session:execute(\"set\", \"ringback=\${hold_music}\"); --set to music\n"; + $tmp .= "session:execute(\"set\", \"transfer_ringback=\${hold_music}\"); --set to music\n"; + } + else { + $tmp .= "session:execute(\"set\", \"ringback=\$\${".$row['hunt_group_ringback']."}\"); --set to ringtone\n"; + $tmp .= "session:execute(\"set\", \"transfer_ringback=\$\${".$row['hunt_group_ringback']."}\"); --set to ringtone\n"; + } + if ($row['hunt_group_ringback'] == "ring"){ + $tmp .= "session:execute(\"set\", \"ringback=\$\${us-ring}\"); --set to ringtone\n"; + $tmp .= "session:execute(\"set\", \"transfer_ringback=\$\${us-ring}\"); --set to ringtone\n"; + } + } + else { + $tmp .= "session:execute(\"set\", \"ringback=\${hold_music}\"); --set to ringtone\n"; + $tmp .= "session:execute(\"set\", \"transfer_ringback=\${hold_music}\"); --set to ringtone\n"; + } + + if ($row['hunt_group_timeout'] > 0) { + //$tmp .= "session:setVariable(\"call_timeout\", \"".$row['hunt_group_timeout']."\");\n"; + $tmp .= "session:setVariable(\"continue_on_fail\", \"true\");\n"; + $tmp .= "session:setVariable(\"ignore_early_media\", \"true\");\n"; + } + $tmp .= "session:setVariable(\"hangup_after_bridge\", \"true\");\n"; + $tmp .= "\n"; + $tmp .= "--freeswitch.consoleLog( \"info\", \"dialed extension:\"..dialed_extension..\"\\n\" );\n"; + $tmp .= "--freeswitch.consoleLog( \"info\", \"domain: \"..domain..\"\\n\" );\n"; + $tmp .= "--freeswitch.consoleLog( \"info\", \"us_ring: \"..us_ring..\"\\n\" );\n"; + $tmp .= "--freeswitch.consoleLog( \"info\", \"domain_name: \"..domain_name..\"\\n\" );\n"; + $tmp .= "\n"; + + $tmp .= "--freeswitch.consoleLog( \"info\", \"action call now don't wait for dtmf\\n\" );\n"; + if ($row['hunt_group_caller_announce'] == "true" || $row['hunt_group_call_prompt'] == "true") { + //do nothing + } + else { + $tmp .= "if session:ready() then\n"; + //$tmp .= " session.answer();\n"; + } + $tmp .= "\n"; + + $i = 0; + $sql = "select * from v_hunt_group_destinations "; + $sql .= "where hunt_group_uuid = '".$row['hunt_group_uuid']."' "; + $sql .= "and domain_uuid = '$domain_uuid' "; + //$sql .= "and destination_enabled = 'true' "; + $sql .= "order by destination_order asc "; + $prep_statement_2 = $db->prepare($sql); + $prep_statement_2->execute(); + while($ent = $prep_statement_2->fetch(PDO::FETCH_ASSOC)) { + //$ent['hunt_group_uuid'] + //$ent['destination_data'] + //$ent['destination_type'] + //$ent['destination_profile'] + //$ent['destination_order'] + //$ent['destination_enabled'] + //$ent['destination_description'] + + $destination_timeout = $ent['destination_timeout']; + if (strlen($destination_timeout) == 0) { + if (strlen($row['hunt_group_timeout']) == 0) { + $destination_timeout = '30'; + } + else { + $destination_timeout = $row['hunt_group_timeout']; + } + } + + //set the default profile + if (strlen($ent['destination_data']) == 0) { $ent['destination_data'] = "internal"; } + + if ($ent['destination_type'] == "extension") { + //$tmp .= " sofia_contact_".$ent['destination_data']." = \"\${sofia_contact(".$ent['destination_profile']."/".$ent['destination_data']."@\"..domain_name..\")}\";\n"; + $tmp_sub_array["application"] = "bridge"; + $tmp_sub_array["type"] = "extension"; + $tmp_sub_array["extension"] = $ent['destination_data']; + //$tmp_sub_array["data"] = "\"[leg_timeout=$destination_timeout]\"..sofia_contact_".$ent['destination_data']; + $tmp_sub_array["data"] = "\"[leg_timeout=$destination_timeout]user/".$ent['destination_data']."@\"..domain_name"; + $tmp_array[$i] = $tmp_sub_array; + unset($tmp_sub_array); + } + if ($ent['destination_type'] == "voicemail") { + $tmp_sub_array["application"] = "voicemail"; + $tmp_sub_array["type"] = "voicemail"; + $tmp .= " session:execute(\"voicemail\", \"default \${domain_name} ".$ent['destination_data']."\");\n"; + //$tmp_sub_array["application"] = "voicemail"; + //$tmp_sub_array["data"] = "default \${domain_name} ".$ent['destination_data']; + //$tmp_array[$i] = $tmp_sub_array; + unset($tmp_sub_array); + } + if ($ent['destination_type'] == "sip uri") { + $tmp_sub_array["application"] = "bridge"; + $tmp_sub_array["type"] = "sip uri"; + //$destination_data = "{user=foo}loopback/".$ent['destination_data']."/default/XML"; + $bridge_array = outbound_route_to_bridge ($ent['destination_data']); + $destination_data = $bridge_array[0]; + $tmp_sub_array["application"] = "bridge"; + $tmp_sub_array["data"] = "\"[leg_timeout=$destination_timeout,origination_caller_id_name=\"..outbound_caller_id_name..\",origination_caller_id_number=\"..outbound_caller_id_number..\"]".$destination_data."\""; + $tmp_array[$i] = $tmp_sub_array; + unset($tmp_sub_array); + unset($destination_data); + } + $i++; + } //end while + unset ($sql, $prep_statement_2); + unset($i, $ent); + + $i = 0; + if(count($tmp_array) > 0) { + foreach ($tmp_array as $ent) { + $tmpdata = $ent["data"]; + if ($ent["application"] == "voicemail") { $tmpdata = "*99".$tmpdata; } + if ($i < 1) { + $tmp_buffer = $tmpdata; + } + else { + $tmp_buffer .= "..\",\"..".$tmpdata; + } + $i++; + } + } + unset($i); + $tmp_application = $tmp_array[0]["application"]; + + if ($row['hunt_group_type'] == "simultaneous" || $row['hunt_group_type'] == "follow_me_simultaneous" || $row['hunt_group_type'] == "call_forward") { + $tmp_switch = "simultaneous"; + } + if ($row['hunt_group_type'] == "sequence" || $row['hunt_group_type'] == "follow_me_sequence" || $row['hunt_group_type'] == "sequentially") { + $tmp_switch = "sequence"; + } + switch ($tmp_switch) { + case "simultaneous": + if ($row['hunt_group_caller_announce'] == "true" || $row['hunt_group_call_prompt'] == "true") { + $i = 0; + if (count($tmp_array) > 0) { + foreach ($tmp_array as $tmp_row) { + $tmpdata = $tmp_row["data"]; + if ($tmp_row["application"] == "voicemail") { + $tmpdata = "*99".$tmpdata; + } + else { + if ($tmp_row["type"] == "extension") { + $tmp .= "if (extension_registered(domain_name, sip_profile, '".$tmp_row["extension"]."')) then\n"; + $tmp .= " "; + } + if ($row['hunt_group_caller_announce'] == "true") { + $tmp .= "result = originate (domain_name, session, ".$tmpdata.", extension, caller_id_name, caller_id_number, caller_announce);\n"; + } + else { + $tmp .= "result = originate (domain_name, session, ".$tmpdata.", extension, caller_id_name, caller_id_number);\n"; + } + if ($tmp_row["type"] == "extension") { + $tmp .= "end\n"; + } + } + } + } + } + else { + $tmp .= "\n"; + if (strlen($tmp_buffer) > 0) { + $tmp .= " session:execute(\"".$tmp_application."\", $tmp_buffer);\n"; + } + } + break; + case "sequence": + $tmp .= "\n"; + $i = 0; + if (count($tmp_array) > 0) { + if ($row['hunt_group_caller_announce'] == "true" || $row['hunt_group_call_prompt'] == "true") { + $i = 0; + if (count($tmp_array) > 0) { + foreach ($tmp_array as $tmp_row) { + $tmpdata = $tmp_row["data"]; + if ($tmp_row["application"] == "voicemail") { + $tmpdata = "*99".$tmpdata; + } + else { + if ($tmp_row["type"] == "extension") { + $tmp .= "if (extension_registered(domain_name, sip_profile, '".$tmp_row["extension"]."')) then\n"; + $tmp .= " "; + } + if ($row['hunt_group_caller_announce'] == "true") { + $tmp .= "result = originate (domain_name, session, ".$tmpdata.", extension, caller_id_name, caller_id_number, caller_announce);\n"; + } + else { + $tmp .= "result = originate (domain_name, session, ".$tmpdata.", extension, caller_id_name, caller_id_number);\n"; + } + if ($tmp_row["type"] == "extension") { + $tmp .= "end\n"; + } + } + } + } + } + else { + foreach ($tmp_array as $tmp_row) { + if (strlen($tmp_row["data"]) > 0) { + $tmp .= " session:execute(\"".$tmp_application."\", ".$tmp_row["data"].");\n"; + } + } + } + unset($tmp_row); + } + break; + } + unset($tmp_switch, $tmp_buffer, $tmp_array); + + //set the timeout destination + $hunt_group_timeout_destination = $row['hunt_group_timeout_destination']; + if ($row['hunt_group_timeout_type'] == "extension") { $hunt_group_timeout_type = "transfer"; } + if ($row['hunt_group_timeout_type'] == "voicemail") { $hunt_group_timeout_type = "voicemail"; $hunt_group_timeout_destination = "default \${domain_name} ".$hunt_group_timeout_destination; } + if ($row['hunt_group_timeout_type'] == "sip uri") { $hunt_group_timeout_type = "bridge"; } + $tmp .= "\n"; + if ($row['hunt_group_caller_announce'] == "true" || $row['hunt_group_call_prompt'] == "true") { + //do nothing + } + else { + $tmp .= " --timeout\n"; + if ($row['hunt_group_type'] != 'dnd') { + $tmp .= " originate_disposition = session:getVariable(\"originate_disposition\");\n"; + $tmp .= " if originate_disposition ~= \"SUCCESS\" then\n"; + } + $tmp .= " session:execute(\"".$hunt_group_timeout_type."\", \"".$hunt_group_timeout_destination."\");\n"; + if ($row['hunt_group_type'] != 'dnd') { + $tmp .= " end\n"; + } + } + + if ($row['hunt_group_caller_announce'] == "true" || $row['hunt_group_call_prompt'] == "true") { + //do nothing + } + else { + $tmp .= "end --end if session:ready\n"; + } + $tmp .= "\n"; + //pin number requested from caller if provided + if (strlen($row['hunt_group_pin']) > 0) { + $tmp .= "else \n"; + $tmp .= " session:streamFile(sounds_dir..\"/\"..default_language..\"/\"..default_dialect..\"/\"..default_voice..\"/custom/your_pin_number_is_incorect_goodbye.wav\");\n"; + $tmp .= " session:hangup();\n"; + $tmp .= "end\n"; + $tmp .= "\n"; + } + + //unset variables + $tmp .= "\n"; + $tmp .= "--clear variables\n"; + $tmp .= "dialed_extension = \"\";\n"; + $tmp .= "new_extension = \"\";\n"; + $tmp .= "domain_name = \"\";\n"; + $tmp .= "\n"; + + //remove invalid characters from the file names + $huntgroup_extension = $row['hunt_group_extension']; + $huntgroup_extension = str_replace(" ", "_", $huntgroup_extension); + $huntgroup_extension = preg_replace("/[\*\:\\/\<\>\|\'\"\?]/", "", $huntgroup_extension); + + //write the hungroup lua script + if (strlen($row['hunt_group_extension']) > 0) { + if ($row['hunt_group_enabled'] != "false") { + $hunt_group_filename = "v_huntgroup_".$_SESSION['domains'][$domain_uuid]['domain_name']."_".$huntgroup_extension.".lua"; + //echo "location".$_SESSION['switch']['scripts']['dir']."/".$hunt_group_filename; + $fout = fopen($_SESSION['switch']['scripts']['dir']."/".$hunt_group_filename,"w"); + fwrite($fout, $tmp); + unset($hunt_group_filename); + fclose($fout); + } + } + } //end while + + //apply settings reminder + $_SESSION["reload_xml"] = true; +} //end huntgroup function lua + + +function get_recording_filename($id) { + global $domain_uuid, $db; + $sql = "select * from v_recordings "; + $sql .= "where recording_uuid = '$id' "; + $sql .= "and domain_uuid = '$domain_uuid' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_ASSOC); + foreach ($result as &$row) { + //$filename = $row["filename"]; + //$recording_name = $row["recording_name"]; + //$recording_uuid = $row["recording_uuid"]; + return $row["filename"]; + break; //limit to 1 row + } + unset ($prep_statement); +} + +function dialplan_add($domain_uuid, $dialplan_uuid, $dialplan_name, $dialplan_order, $dialplan_context, $dialplan_enabled, $dialplan_description, $app_uuid) { + global $db, $db_type; + $sql = "insert into v_dialplans "; + $sql .= "("; + $sql .= "domain_uuid, "; + $sql .= "dialplan_uuid, "; + if (strlen($app_uuid) > 0) { + $sql .= "app_uuid, "; + } + $sql .= "dialplan_name, "; + $sql .= "dialplan_order, "; + $sql .= "dialplan_context, "; + $sql .= "dialplan_enabled, "; + $sql .= "dialplan_description "; + $sql .= ")"; + $sql .= "values "; + $sql .= "("; + $sql .= "'$domain_uuid', "; + $sql .= "'$dialplan_uuid', "; + if (strlen($app_uuid) > 0) { + $sql .= "'$app_uuid', "; + } + $sql .= "'$dialplan_name', "; + $sql .= "'$dialplan_order', "; + $sql .= "'$dialplan_context', "; + $sql .= "'$dialplan_enabled', "; + $sql .= "'$dialplan_description' "; + $sql .= ")"; + $db->exec(check_sql($sql)); + unset($sql); +} + +function dialplan_detail_add($domain_uuid, $dialplan_uuid, $dialplan_detail_tag, $dialplan_detail_order, $dialplan_detail_group, $dialplan_detail_type, $dialplan_detail_data) { + global $db; + $dialplan_detail_uuid = uuid(); + $sql = "insert into v_dialplan_details "; + $sql .= "("; + $sql .= "domain_uuid, "; + $sql .= "dialplan_uuid, "; + $sql .= "dialplan_detail_uuid, "; + $sql .= "dialplan_detail_tag, "; + $sql .= "dialplan_detail_group, "; + $sql .= "dialplan_detail_order, "; + $sql .= "dialplan_detail_type, "; + $sql .= "dialplan_detail_data "; + $sql .= ")"; + $sql .= "values "; + $sql .= "("; + $sql .= "'$domain_uuid', "; + $sql .= "'".check_str($dialplan_uuid)."', "; + $sql .= "'".check_str($dialplan_detail_uuid)."', "; + $sql .= "'".check_str($dialplan_detail_tag)."', "; + if (strlen($dialplan_detail_group) == 0) { + $sql .= "null, "; + } + else { + $sql .= "'".check_str($dialplan_detail_group)."', "; + } + $sql .= "'".check_str($dialplan_detail_order)."', "; + $sql .= "'".check_str($dialplan_detail_type)."', "; + $sql .= "'".check_str($dialplan_detail_data)."' "; + $sql .= ")"; + $db->exec(check_sql($sql)); + unset($sql); +} + +function save_dialplan_xml() { + global $db, $domain_uuid; + + //get the context based from the domain_uuid + if (count($_SESSION['domains']) == 1) { + $user_context = "default"; + } + else { + $user_context = $_SESSION['domains'][$domain_uuid]['domain_name']; + } + + //prepare for dialplan .xml files to be written. delete all dialplan files that are prefixed with dialplan_ and have a file extension of .xml + $dialplan_list = glob($_SESSION['switch']['dialplan']['dir'] . "/*/*v_dialplan*.xml"); + foreach($dialplan_list as $name => $value) { + unlink($value); + } + $dialplan_list = glob($_SESSION['switch']['dialplan']['dir'] . "/*/*_v_*.xml"); + foreach($dialplan_list as $name => $value) { + unlink($value); + } + $dialplan_list = glob($_SESSION['switch']['dialplan']['dir'] . "/*/*/*_v_*.xml"); + foreach($dialplan_list as $name => $value) { + unlink($value); + } + + $sql = "select * from v_dialplans "; + $sql .= "where dialplan_enabled = 'true' "; + $prep_statement = $db->prepare(check_sql($sql)); + if ($prep_statement) { + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_ASSOC); + foreach ($result as &$row) { + $tmp = ""; + $tmp .= "\n"; + + $dialplan_continue = ''; + if ($row['dialplan_continue'] == "true") { + $dialplan_continue = "continue=\"true\""; + } + + $tmp = "\n"; + + $sql = " select * from v_dialplan_details "; + $sql .= " where dialplan_uuid = '".$row['dialplan_uuid']."' "; + $sql .= " and domain_uuid = '".$row['domain_uuid']."' "; + $sql .= " order by dialplan_detail_group asc, dialplan_detail_order asc "; + $prep_statement_2 = $db->prepare($sql); + if ($prep_statement_2) { + $prep_statement_2->execute(); + $result2 = $prep_statement_2->fetchAll(PDO::FETCH_NAMED); + $result_count2 = count($result2); + unset ($prep_statement_2, $sql); + + //create a new array that is sorted into groups and put the tags in order conditions, actions, anti-actions + $details = ''; + $previous_tag = ''; + $details[$group]['condition_count'] = ''; + //conditions + $x = 0; + $y = 0; + foreach($result2 as $row2) { + if ($row2['dialplan_detail_tag'] == "condition") { + //get the group + $group = $row2['dialplan_detail_group']; + //get the generic type + switch ($row2['dialplan_detail_type']) { + case "hour": + $type = 'time'; + break; + case "minute": + $type = 'time'; + break; + case "minute-of-day": + $type = 'time'; + break; + case "mday": + $type = 'time'; + break; + case "mweek": + $type = 'time'; + break; + case "mon": + $type = 'time'; + break; + case "yday": + $type = 'time'; + break; + case "year": + $type = 'time'; + break; + case "wday": + $type = 'time'; + break; + case "week": + $type = 'time'; + break; + default: + $type = 'default'; + } + + //add the conditions to the details array + $details[$group]['condition-'.$x]['dialplan_detail_tag'] = $row2['dialplan_detail_tag']; + $details[$group]['condition-'.$x]['dialplan_detail_type'] = $row2['dialplan_detail_type']; + $details[$group]['condition-'.$x]['dialplan_uuid'] = $row2['dialplan_uuid']; + $details[$group]['condition-'.$x]['dialplan_detail_order'] = $row2['dialplan_detail_order']; + $details[$group]['condition-'.$x]['field'][$y]['type'] = $row2['dialplan_detail_type']; + $details[$group]['condition-'.$x]['field'][$y]['data'] = $row2['dialplan_detail_data']; + $details[$group]['condition-'.$x]['dialplan_detail_break'] = $row2['dialplan_detail_break']; + $details[$group]['condition-'.$x]['dialplan_detail_group'] = $row2['dialplan_detail_group']; + $details[$group]['condition-'.$x]['dialplan_detail_inline'] = $row2['dialplan_detail_inline']; + if ($type == "time") { + $y++; + } + } + if ($type == "default") { + $x++; + $y = 0; + } + } + + //actions + $x = 0; + foreach($result2 as $row2) { + if ($row2['dialplan_detail_tag'] == "action") { + $group = $row2['dialplan_detail_group']; + foreach ($row2 as $key => $val) { + $details[$group]['action-'.$x][$key] = $val; + } + } + $x++; + } + //anti-actions + $x = 0; + foreach($result2 as $row2) { + if ($row2['dialplan_detail_tag'] == "anti-action") { + $group = $row2['dialplan_detail_group']; + foreach ($row2 as $key => $val) { + $details[$group]['anti-action-'.$x][$key] = $val; + } + } + $x++; + } + unset($result2); + } + + $i=1; + if ($result_count2 > 0) { + foreach($details as $group) { + $current_count = 0; + $x = 0; + foreach($group as $ent) { + $close_condition_tag = true; + if (empty($ent)) { + $close_condition_tag = false; + } + $current_tag = $ent['dialplan_detail_tag']; + $c = 0; + if ($ent['dialplan_detail_tag'] == "condition") { + //get the generic type + switch ($ent['dialplan_detail_type']) { + case "hour": + $type = 'time'; + break; + case "minute": + $type = 'time'; + break; + case "minute-of-day": + $type = 'time'; + break; + case "mday": + $type = 'time'; + break; + case "mweek": + $type = 'time'; + break; + case "mon": + $type = 'time'; + break; + case "yday": + $type = 'time'; + break; + case "year": + $type = 'time'; + break; + case "wday": + $type = 'time'; + break; + case "week": + $type = 'time'; + break; + default: + $type = 'default'; + } + + //set the attribute and expression + $condition_attribute = ''; + foreach($ent['field'] as $field) { + if ($type == "time") { + if (strlen($field['type']) > 0) { + $condition_attribute .= $field['type'].'="'.$field['data'].'" '; + } + $condition_expression = ''; + } + if ($type == "default") { + $condition_attribute = ''; + if (strlen($field['type']) > 0) { + $condition_attribute = 'field="'.$field['type'].'" '; + } + $condition_expression = ''; + if (strlen($field['data']) > 0) { + $condition_expression = 'expression="'.$field['data'].'" '; + } + } + } + + //get the condition break attribute + $condition_break = ''; + if (strlen($ent['dialplan_detail_break']) > 0) { + $condition_break = "break=\"".$ent['dialplan_detail_break']."\" "; + } + + //get the count + $count = 0; + foreach($details as $group2) { + foreach($group2 as $ent2) { + if ($ent2['dialplan_detail_group'] == $ent['dialplan_detail_group'] && $ent2['dialplan_detail_tag'] == "condition") { + $count++; + } + } + } + + //use the correct type of dialplan_detail_tag open or self closed + if ($count == 1) { //single condition + //start dialplan_detail_tag + $tmp .= " \n"; + } + else { //more than one condition + $current_count++; + if ($current_count < $count) { + //all tags should be self-closing except the last one + $tmp .= " \n"; + } + else { + //for the last dialplan_detail_tag use the start dialplan_detail_tag + $tmp .= " \n"; + } + } + } + //actions + if ($ent['dialplan_detail_tag'] == "action") { + //get the action inline attribute + $action_inline = ''; + if (strlen($ent['dialplan_detail_inline']) > 0) { + $action_inline = "inline=\"".$ent['dialplan_detail_inline']."\""; + } + if (strlen($ent['dialplan_detail_data']) > 0) { + $tmp .= " \n"; + } + else { + $tmp .= " \n"; + } + } + //anti-actions + if ($ent['dialplan_detail_tag'] == "anti-action") { + if (strlen($ent['dialplan_detail_data']) > 0) { + $tmp .= " \n"; + } + else { + $tmp .= " \n"; + } + } + //set the previous dialplan_detail_tag + $previous_tag = $ent['dialplan_detail_tag']; + $i++; + } //end foreach + if ($close_condition_tag == true) { + $tmp .= " \n"; + } + $x++; + } + if ($condition_count > 0) { + $condition_count = $result_count2; + } + unset($sql, $result_count2, $result2, $row_count2); + } //end if results + $tmp .= "\n"; + + $dialplan_order = $row['dialplan_order']; + if (strlen($dialplan_order) == 0) { $dialplan_order = "000".$dialplan_order; } + if (strlen($dialplan_order) == 1) { $dialplan_order = "00".$dialplan_order; } + if (strlen($dialplan_order) == 2) { $dialplan_order = "0".$dialplan_order; } + if (strlen($dialplan_order) == 4) { $dialplan_order = "999"; } + if (strlen($dialplan_order) == 5) { $dialplan_order = "999"; } + + //remove invalid characters from the file names + $dialplan_name = $row['dialplan_name']; + $dialplan_name = str_replace(" ", "_", $dialplan_name); + $dialplan_name = preg_replace("/[\*\:\\/\<\>\|\'\"\?]/", "", $dialplan_name); + + $dialplan_filename = $dialplan_order."_v_".$dialplan_name.".xml"; + if (strlen($row['dialplan_context']) > 0) { + if (!is_dir($_SESSION['switch']['dialplan']['dir']."/".$row['dialplan_context'])) { + mkdir($_SESSION['switch']['dialplan']['dir']."/".$row['dialplan_context'],0755,true); + } + if ($row['dialplan_context'] == "public") { + if (count($_SESSION['domains']) > 1) { + if (!is_dir($_SESSION['switch']['dialplan']['dir']."/public/".$_SESSION['domains'][$row['domain_uuid']]['domain_name'])) { + mkdir($_SESSION['switch']['dialplan']['dir']."/public/".$_SESSION['domains'][$row['domain_uuid']]['domain_name'],0755,true); + } + file_put_contents($_SESSION['switch']['dialplan']['dir']."/public/".$_SESSION['domains'][$row['domain_uuid']]['domain_name']."/".$dialplan_filename, $tmp); + } + else { + file_put_contents($_SESSION['switch']['dialplan']['dir']."/public/".$dialplan_filename, $tmp); + } + } + else { + if (!is_dir($_SESSION['switch']['dialplan']['dir']."/".$row['dialplan_context'])) { + mkdir($_SESSION['switch']['dialplan']['dir']."/".$row['dialplan_context'],0755,true); + } + file_put_contents($_SESSION['switch']['dialplan']['dir']."/".$row['dialplan_context']."/".$dialplan_filename, $tmp); + } + } + + unset($dialplan_filename); + unset($tmp); + } //end while + } + + //apply settings reminder + $_SESSION["reload_xml"] = true; +} + + +if (!function_exists('phone_letter_to_number')) { + function phone_letter_to_number($tmp) { + $tmp = strtolower($tmp); + if ($tmp == "a" | $tmp == "b" | $tmp == "c") { return 2; } + if ($tmp == "d" | $tmp == "e" | $tmp == "f") { return 3; } + if ($tmp == "g" | $tmp == "h" | $tmp == "i") { return 4; } + if ($tmp == "j" | $tmp == "k" | $tmp == "l") { return 5; } + if ($tmp == "m" | $tmp == "n" | $tmp == "o") { return 6; } + if ($tmp == "p" | $tmp == "q" | $tmp == "r" | $tmp == "s") { return 7; } + if ($tmp == "t" | $tmp == "u" | $tmp == "v") { return 8; } + if ($tmp == "w" | $tmp == "x" | $tmp == "y" | $tmp == "z") { return 9; } + } +} + + +if (!function_exists('sync_directory')) { + function sync_directory() { + + global $domain_uuid, $db; + + $tmp = "include(\"config.js\");\n"; + $tmp .= "//var sounds_dir\n"; + $tmp .= "var admin_pin = \"\";\n"; + $tmp .= "var search_type = \"\";\n"; + $tmp .= "//var tmp_dir\n"; + $tmp .= "var digitmaxlength = 0;\n"; + $tmp .= "var timeoutpin = 5000;\n"; + $tmp .= "var timeouttransfer = 5000;\n"; + $tmp .= "\n"; + $tmp .= "var dtmf = new Object( );\n"; + $tmp .= "dtmf.digits = \"\";\n"; + $tmp .= "\n"; + $tmp .= "function mycb( session, type, obj, arg ) {\n"; + $tmp .= " try {\n"; + $tmp .= " if ( type == \"dtmf\" ) {\n"; + $tmp .= " console_log( \"info\", \"digit: \"+obj.digit+\"\\n\" );\n"; + $tmp .= " if ( obj.digit == \"#\" ) {\n"; + $tmp .= " //console_log( \"info\", \"detected pound sign.\\n\" );\n"; + $tmp .= " exit = true;\n"; + $tmp .= " return( false );\n"; + $tmp .= " }\n"; + $tmp .= " if ( obj.digit == \"*\" ) {\n"; + $tmp .= " //console_log( \"info\", \"detected pound sign.\\n\" );\n"; + $tmp .= " exit = true;\n"; + $tmp .= " return( false );\n"; + $tmp .= " }\n"; + $tmp .= " dtmf.digits += obj.digit;\n"; + $tmp .= " if ( dtmf.digits.length >= digitmaxlength ) {\n"; + $tmp .= " exit = true;\n"; + $tmp .= " return( false );\n"; + $tmp .= " }\n"; + $tmp .= " }\n"; + $tmp .= " } catch (e) {\n"; + $tmp .= " console_log( \"err\", e+\"\\n\" );\n"; + $tmp .= " }\n"; + $tmp .= " return( true );\n"; + $tmp .= "} //end function mycb\n"; + $tmp .= "\n"; + $tmp .= "function directory_search(search_type) {\n"; + $tmp .= "\n"; + $tmp .= " digitmaxlength = 3;\n"; + $tmp .= " session.streamFile( sounds_dir+\"/en/us/callie/directory/48000/dir-enter_person.wav\");\n"; + $tmp .= " if (search_type == \"last_name\") {\n"; + $tmp .= " session.streamFile( sounds_dir+\"/en/us/callie/directory/48000/dir-last_name.wav\", mycb, \"dtmf\");\n"; + $tmp .= " session.streamFile( sounds_dir+\"/en/us/callie/directory/48000/dir-to_search_by.wav\", mycb, \"dtmf\");\n"; + $tmp .= " session.streamFile( sounds_dir+\"/en/us/callie/directory/48000/dir-first_name.wav\", mycb, \"dtmf\");\n"; + $tmp .= " }\n"; + $tmp .= " if (search_type == \"first_name\") {\n"; + $tmp .= " session.streamFile( sounds_dir+\"/en/us/callie/directory/48000/dir-first_name.wav\", mycb, \"dtmf\");\n"; + $tmp .= " session.streamFile( sounds_dir+\"/en/us/callie/directory/48000/dir-to_search_by.wav\", mycb, \"dtmf\");\n"; + $tmp .= " session.streamFile( sounds_dir+\"/en/us/callie/directory/48000/dir-last_name.wav\", mycb, \"dtmf\");\n"; + $tmp .= " }\n"; + $tmp .= " session.streamFile( sounds_dir+\"/en/us/callie/directory/48000/dir-press.wav\", mycb, \"dtmf\");\n"; + $tmp .= " session.execute(\"say\", \"en name_spelled iterated 1\");\n"; + $tmp .= " session.collectInput( mycb, dtmf, timeoutpin );\n"; + $tmp .= " var dtmf_search = dtmf.digits;\n"; + $tmp .= " //console_log( \"info\", \"--\" + dtmf.digits + \"--\\n\" );\n"; + $tmp .= " if (dtmf_search == \"1\") {\n"; + $tmp .= " //console_log( \"info\", \"press 1 detected: \" + dtmf.digits + \"\\n\" );\n"; + $tmp .= " //console_log( \"info\", \"press 1 detected: \" + search_type + \"\\n\" );\n"; + $tmp .= " if (search_type == \"last_name\") {\n"; + $tmp .= " //console_log( \"info\", \"press 1 detected last_name: \" + search_type + \"\\n\" );\n"; + $tmp .= " search_type = \"first_name\";\n"; + $tmp .= " }\n"; + $tmp .= " else {\n"; + $tmp .= " //console_log( \"info\", \"press 1 detected first_name: \" + search_type + \"\\n\" );\n"; + $tmp .= " search_type = \"last_name\";\n"; + $tmp .= " }\n"; + $tmp .= " dtmf_search = \"\";\n"; + $tmp .= " dtmf.digits = \"\";\n"; + $tmp .= " directory_search(search_type);\n"; + $tmp .= " return;\n"; + $tmp .= " }\n"; + $tmp .= " console_log( \"info\", \"first 3 letters of first or last name: \" + dtmf.digits + \"\\n\" );\n"; + $tmp .= "\n"; + $tmp .= " //session.execute(\"say\", \"en name_spelled pronounced mark\");\n"; + $tmp .= " //\n"; + $tmp .= " //session.execute(\"say\", \"en number iterated 12345\");\n"; + $tmp .= " //session.execute(\"say\", \"en number pronounced 1001\");\n"; + $tmp .= " //session.execute(\"say\", \"en short_date_time pronounced [timestamp]\");\n"; + $tmp .= " //session.execute(\"say\", \"en CURRENT_TIME pronounced CURRENT_TIME\");\n"; + $tmp .= " //session.execute(\"say\", \"en CURRENT_DATE pronounced CURRENT_DATE\");\n"; + $tmp .= " //session.execute(\"say\", \"en CURRENT_DATE_TIME pronounced CURRENT_DATE_TIME\");\n"; + $tmp .= "\n"; + $tmp .= "\n"; + $tmp .= " //take each name and convert it to the equivalent number in php when this file is generated\n"; + $tmp .= " //then test each number see if it matches the user dtmf search keys\n"; + $tmp .= "\n"; + $tmp .= " var result_array = new Array();\n"; + $tmp .= " var x = 0;\n"; + + //get a list of extensions and the users assigned to them + $sql = "select * from v_extensions "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $x = 0; + $result = $prep_statement->fetchAll(PDO::FETCH_ASSOC); + foreach ($result as &$row) { + $extension = $row["extension"]; + $effective_caller_id_name = $row["effective_caller_id_name"]; + //$user_list = $row["user_list"]; + //$user_list = trim($user_list, "|"); + //$username_array = explode ("|", $user_list); + foreach ($username_array as &$username) { + if (strlen($username) > 0) { + $sql = "select * from v_users "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and username = '$username' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $tmp_result = $prep_statement->fetchAll(PDO::FETCH_ASSOC); + foreach ($tmp_result as &$row_tmp) { + $user_first_name = $row_tmp["user_first_name"]; + $user_last_name = $row_tmp["user_last_name"]; + if ($user_first_name == "na") { $user_first_name = ""; } + if ($user_last_name == "na") { $user_last_name = ""; } + if ($user_first_name == "admin") { $user_first_name = ""; } + if ($user_last_name == "admin") { $user_last_name = ""; } + if ($user_first_name == "superadmin") { $user_first_name = ""; } + if ($user_last_name == "superadmin") { $user_last_name = ""; } + if (strlen($user_first_name.$user_last_name) == 0) { + $name_array = explode (" ", $effective_caller_id_name); + $user_first_name = $name_array[0]; + if (count($name_array) > 1) { + $user_last_name = $name_array[1]; + } + } + + break; //limit to 1 row + } + $f1 = phone_letter_to_number(substr($user_first_name, 0,1)); + $f2 = phone_letter_to_number(substr($user_first_name, 1,1)); + $f3 = phone_letter_to_number(substr($user_first_name, 2,1)); + + $l1 = phone_letter_to_number(substr($user_last_name, 0,1)); + $l2 = phone_letter_to_number(substr($user_last_name, 1,1)); + $l3 = phone_letter_to_number(substr($user_last_name, 2,1)); + + //echo $sql." extension: $extension first_name $user_first_name last_name $user_last_name $tmp
      "; + + $tmp .= " if (search_type == \"first_name\" && dtmf_search == \"".$f1.$f2.$f3."\" || search_type == \"last_name\" && dtmf_search == \"".$l1.$l2.$l3."\") {\n"; + $tmp .= " result_array[x]=new Array()\n"; + $tmp .= " result_array[x]['first_name'] =\"".$user_first_name."\";\n"; + $tmp .= " result_array[x]['last_name'] =\"".$user_last_name."\";\n"; + $tmp .= " result_array[x]['extension'] = \"".$extension."\";\n"; + $tmp .= " //console_log( \"info\", \"found: ".$user_first_name." ".$user_last_name."\\n\" );\n"; + $tmp .= " x++;\n"; + $tmp .= " }\n"; + } + } + } + unset ($prep_statement); + + $tmp .= "\n"; + $tmp .= "\n"; + $tmp .= " //say the number of results that matched\n"; + $tmp .= " \$result_count = result_array.length;\n"; + $tmp .= " session.execute(\"say\", \"en number iterated \"+\$result_count);\n"; + $tmp .= " session.streamFile( sounds_dir+\"/en/us/callie/directory/48000/dir-result_match.wav\", mycb, \"dtmf\");\n"; + $tmp .= "\n"; + $tmp .= " //clear values\n"; + $tmp .= " dtmf_search = 0;\n"; + $tmp .= " dtmf.digits = '';\n"; + $tmp .= "\n"; + $tmp .= " if (\$result_count == 0) {\n"; + $tmp .= " //session.execute(\"transfer\", \"*347 XML ".$_SESSION["context"]."\");\n"; + $tmp .= " directory_search(search_type);\n"; + $tmp .= " return;\n"; + $tmp .= " }\n"; + $tmp .= "\n"; + $tmp .= " session.execute(\"set\", \"tts_engine=flite\");\n"; + $tmp .= " session.execute(\"set\", \"tts_voice=rms\"); //rms //kal //awb //slt\n"; + $tmp .= " session.execute(\"set\", \"playback_terminators=#\");\n"; + $tmp .= " //session.speak(\"flite\",\"kal\",\"Thanks for.. calling\");\n"; + $tmp .= "\n"; + $tmp .= " i=1;\n"; + $tmp .= " for ( i in result_array ) {\n"; + $tmp .= "\n"; + $tmp .= " //say first name and last name is at extension 1001\n"; + $tmp .= " //session.execute(\"speak\", result_array[i]['first_name']);\n"; + $tmp .= " //session.execute(\"speak\", result_array[i]['last_name']);\n"; + $tmp .= " session.execute(\"say\", \"en name_spelled pronounced \"+result_array[i]['first_name']);\n"; + $tmp .= " session.execute(\"sleep\", \"500\");\n"; + $tmp .= " session.execute(\"say\", \"en name_spelled pronounced \"+result_array[i]['last_name']);\n"; + $tmp .= " session.streamFile( sounds_dir+\"/en/us/callie/directory/48000/dir-at_extension.wav\", mycb, \"dtmf\");\n"; + $tmp .= " session.execute(\"say\", \"en number pronounced \"+result_array[i]['extension']);\n"; + $tmp .= "\n"; + $tmp .= " //to select this entry press 1\n"; + $tmp .= " session.streamFile( sounds_dir+\"/en/us/callie/directory/48000/dir-to_select_entry.wav\", mycb, \"dtmf\");\n"; + $tmp .= " session.streamFile( sounds_dir+\"/en/us/callie/directory/48000/dir-press.wav\", mycb, \"dtmf\");\n"; + $tmp .= " session.execute(\"say\", \"en number iterated 1\");\n"; + $tmp .= "\n"; + $tmp .= " //console_log( \"info\", \"first name: \" + result_array[i]['first_name'] + \"\\n\" );\n"; + $tmp .= " //console_log( \"info\", \"last name: \" + result_array[i]['last_name'] + \"\\n\" );\n"; + $tmp .= " //console_log( \"info\", \"extension: \" + result_array[i]['extension'] + \"\\n\" );\n"; + $tmp .= "\n"; + $tmp .= " //if 1 is pressed then transfer the call\n"; + $tmp .= " dtmf.digits = session.getDigits(1, \"#\", 3000);\n"; + $tmp .= " if (dtmf.digits == \"1\") {\n"; + $tmp .= " console_log( \"info\", \"directory: call transfered to: \" + result_array[i]['extension'] + \"\\n\" );\n"; + $tmp .= " session.execute(\"transfer\", result_array[i]['extension']+\" XML ".$_SESSION["context"]."\");\n"; + $tmp .= " }\n"; + $tmp .= "\n"; + $tmp .= " }\n"; + $tmp .= "}\n"; + $tmp .= "\n"; + $tmp .= "\n"; + $tmp .= "if ( session.ready() ) {\n"; + $tmp .= " session.answer();\n"; + $tmp .= " search_type = \"last_name\";\n"; + $tmp .= " directory_search(search_type);\n"; + $tmp .= " session.hangup(\"NORMAL_CLEARING\");\n"; + $tmp .= "}\n"; + $tmp .= ""; + + //write the file + $fout = fopen($switch_scripts_dir."/directory.js","w"); + fwrite($fout, $tmp); + fclose($fout); + + //apply settings reminder + $_SESSION["reload_xml"] = true; + } //end sync_directory +} //end if function exists + +if (!function_exists('save_ivr_menu_xml')) { + function save_ivr_menu_xml() { + global $db, $domain_uuid; + + //prepare for dialplan .xml files to be written. delete all dialplan files that are prefixed with dialplan_ and have a file extension of .xml + if (count($_SESSION["domains"]) > 1) { + $v_needle = 'v_'.$_SESSION['domain_name'].'_'; + } + else { + $v_needle = 'v_'; + } + if($dh = opendir($_SESSION['switch']['conf']['dir']."/ivr_menus/")) { + $files = Array(); + while($file = readdir($dh)) { + if($file != "." && $file != ".." && $file[0] != '.') { + if(is_dir($dir . "/" . $file)) { + //this is a directory + } else { + if (strpos($file, $v_needle) !== false && substr($file,-4) == '.xml') { + //echo "file: $file
      \n"; + unlink($_SESSION['switch']['conf']['dir']."/ivr_menus/".$file); + } + } + } + } + closedir($dh); + } + + $sql = "select * from v_ivr_menus "; + $sql .= " where domain_uuid = '$domain_uuid' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_ASSOC); + $result_count = count($result); + unset ($prep_statement, $sql); + if ($result_count > 0) { + foreach($result as $row) { + $dialplan_uuid = $row["dialplan_uuid"]; + $ivr_menu_uuid = $row["ivr_menu_uuid"]; + $ivr_menu_name = check_str($row["ivr_menu_name"]); + $ivr_menu_extension = $row["ivr_menu_extension"]; + $ivr_menu_greet_long = $row["ivr_menu_greet_long"]; + $ivr_menu_greet_short = $row["ivr_menu_greet_short"]; + $ivr_menu_invalid_sound = $row["ivr_menu_invalid_sound"]; + $ivr_menu_exit_sound = $row["ivr_menu_exit_sound"]; + $ivr_menu_confirm_macro = $row["ivr_menu_confirm_macro"]; + $ivr_menu_confirm_key = $row["ivr_menu_confirm_key"]; + $ivr_menu_tts_engine = $row["ivr_menu_tts_engine"]; + $ivr_menu_tts_voice = $row["ivr_menu_tts_voice"]; + $ivr_menu_confirm_attempts = $row["ivr_menu_confirm_attempts"]; + $ivr_menu_timeout = $row["ivr_menu_timeout"]; + $ivr_menu_exit_app = $row["ivr_menu_exit_app"]; + $ivr_menu_exit_data = $row["ivr_menu_exit_data"]; + $ivr_menu_inter_digit_timeout = $row["ivr_menu_inter_digit_timeout"]; + $ivr_menu_max_failures = $row["ivr_menu_max_failures"]; + $ivr_menu_max_timeouts = $row["ivr_menu_max_timeouts"]; + $ivr_menu_digit_len = $row["ivr_menu_digit_len"]; + $ivr_menu_direct_dial = $row["ivr_menu_direct_dial"]; + $ivr_menu_enabled = $row["ivr_menu_enabled"]; + $ivr_menu_description = check_str($row["ivr_menu_description"]); + + //replace space with an underscore + $ivr_menu_name = str_replace(" ", "_", $ivr_menu_name); + + //add each IVR menu to the XML config + $tmp = "\n"; + if (strlen($ivr_menu_description) > 0) { + $tmp .= " \n"; + } + if (count($_SESSION["domains"]) > 1) { + $tmp .= " 0) { + $tmp .= " greet-short=\"".$ivr_menu_greet_short."\"\n"; + } + } + else { + //not found + if (strlen($ivr_menu_greet_short) > 0) { + $tmp .= " greet-short=\"".$ivr_menu_greet_short."\"\n"; + } + } + $tmp .= " invalid-sound=\"$ivr_menu_invalid_sound\"\n"; + $tmp .= " exit-sound=\"$ivr_menu_exit_sound\"\n"; + $tmp .= " confirm-macro=\"$ivr_menu_confirm_macro\"\n"; + $tmp .= " confirm-key=\"$ivr_menu_confirm_key\"\n"; + $tmp .= " tts-engine=\"$ivr_menu_tts_engine\"\n"; + $tmp .= " tts-voice=\"$ivr_menu_tts_voice\"\n"; + $tmp .= " confirm-attempts=\"$ivr_menu_confirm_attempts\"\n"; + $tmp .= " timeout=\"$ivr_menu_timeout\"\n"; + $tmp .= " inter-digit-timeout=\"$ivr_menu_inter_digit_timeout\"\n"; + $tmp .= " max-failures=\"$ivr_menu_max_failures\"\n"; + $tmp .= " max-timeouts=\"$ivr_menu_max_timeouts\"\n"; + $tmp .= " digit-len=\"$ivr_menu_digit_len\">\n"; + + $sub_sql = ""; + $sub_sql .= "select * from v_ivr_menu_options "; + $sub_sql .= "where ivr_menu_uuid = '$ivr_menu_uuid' "; + $sub_sql .= "and domain_uuid = '$domain_uuid' "; + $sub_sql .= "order by ivr_menu_option_order asc "; + $sub_prep_statement = $db->prepare(check_sql($sub_sql)); + $sub_prep_statement->execute(); + $sub_result = $sub_prep_statement->fetchAll(PDO::FETCH_ASSOC); + foreach ($sub_result as &$sub_row) { + //$ivr_menu_uuid = $sub_row["ivr_menu_uuid"]; + $ivr_menu_option_digits = $sub_row["ivr_menu_option_digits"]; + $ivr_menu_option_action = $sub_row["ivr_menu_option_action"]; + $ivr_menu_option_param = $sub_row["ivr_menu_option_param"]; + $ivr_menu_option_description = $sub_row["ivr_menu_option_description"]; + + $tmp .= " "; + if (strlen($ivr_menu_option_description) == 0) { + $tmp .= "\n"; + } + else { + $tmp .= " \n"; + } + } + unset ($sub_prep_statement, $sub_row); + + if ($ivr_menu_direct_dial == "true") { + $tmp .= " \n"; + } + $tmp .= " \n"; + $tmp .= "\n"; + + //remove invalid characters from the file names + $ivr_menu_name = str_replace(" ", "_", $ivr_menu_name); + $ivr_menu_name = preg_replace("/[\*\:\\/\<\>\|\'\"\?]/", "", $ivr_menu_name); + + //write the file + if (count($_SESSION["domains"]) > 1) { + $fout = fopen($_SESSION['switch']['conf']['dir']."/ivr_menus/v_".$_SESSION['domains'][$row['domain_uuid']]['domain_name']."_".$ivr_menu_name.".xml","w"); + } + else { + $fout = fopen($_SESSION['switch']['conf']['dir']."/ivr_menus/v_".$ivr_menu_name.".xml","w"); + } + fwrite($fout, $tmp); + fclose($fout); + } + } + save_dialplan_xml(); + + //apply settings reminder + $_SESSION["reload_xml"] = true; + } +} + +if (!function_exists('save_call_center_xml')) { + function save_call_center_xml() { + global $db, $domain_uuid; + + //include the classes + include "includes/classes/dialplan.php"; + + $sql = "select * from v_call_center_queues "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_ASSOC); + $result_count = count($result); + unset ($prep_statement, $sql); + if ($result_count > 0) { //found results + foreach($result as $row) { + $call_center_queue_uuid = $row["call_center_queue_uuid"]; + $domain_uuid = $row["domain_uuid"]; + $dialplan_uuid = $row["dialplan_uuid"]; + $queue_name = check_str($row["queue_name"]); + $queue_extension = $row["queue_extension"]; + $queue_strategy = $row["queue_strategy"]; + $queue_moh_sound = $row["queue_moh_sound"]; + $queue_record_template = $row["queue_record_template"]; + $queue_time_base_score = $row["queue_time_base_score"]; + $queue_max_wait_time = $row["queue_max_wait_time"]; + $queue_max_wait_time_with_no_agent = $row["queue_max_wait_time_with_no_agent"]; + $queue_tier_rules_apply = $row["queue_tier_rules_apply"]; + $queue_tier_rule_wait_second = $row["queue_tier_rule_wait_second"]; + $queue_tier_rule_wait_multiply_level = $row["queue_tier_rule_wait_multiply_level"]; + $queue_tier_rule_no_agent_no_wait = $row["queue_tier_rule_no_agent_no_wait"]; + $queue_timeout_action = $row["queue_timeout_action"]; + $queue_discard_abandoned_after = $row["queue_discard_abandoned_after"]; + $queue_abandoned_resume_allowed = $row["queue_abandoned_resume_allowed"]; + $queue_cid_prefix = $row["queue_cid_prefix"]; + $queue_description = check_str($row["queue_description"]); + + //replace space with an underscore + $queue_name = str_replace(" ", "_", $queue_name); + + //add each Queue to the dialplan + if (strlen($row['call_center_queue_uuid']) > 0) { + $action = 'add'; //set default action to add + $i = 0; + + //determine the action add or update + if (strlen($dialplan_uuid) > 0) { + $sql = "select * from v_dialplans "; + $sql .= "where dialplan_uuid = '".$dialplan_uuid."' "; + $prep_statement_2 = $db->prepare($sql); + $prep_statement_2->execute(); + while($row2 = $prep_statement_2->fetch(PDO::FETCH_ASSOC)) { + $action = 'update'; + break; //limit to 1 row + } + unset ($sql, $prep_statement_2); + } + + if ($action == 'add') { + //create queue entry in the dialplan + $dialplan_name = $queue_name; + $dialplan_order ='210'; + $dialplan_context = $_SESSION['context']; + $dialplan_enabled = 'true'; + $dialplan_description = $queue_description; + $app_uuid = '95788e50-9500-079e-2807-fd530b0ea370'; + $dialplan_uuid = uuid(); + dialplan_add($domain_uuid, $dialplan_uuid, $dialplan_name, $dialplan_order, $dialplan_context, $dialplan_enabled, $dialplan_description, $app_uuid); + + //add the dialplan_uuid to the call center table + $sql = "update v_call_center_queues set "; + $sql .= "dialplan_uuid = '$dialplan_uuid' "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and call_center_queue_uuid = '".$row['call_center_queue_uuid']."' "; + $db->exec(check_sql($sql)); + unset($sql); + + //group 1 + $dialplan = new dialplan; + $dialplan->domain_uuid = $domain_uuid; + $dialplan->dialplan_uuid = $dialplan_uuid; + $dialplan->dialplan_detail_tag = 'condition'; //condition, action, antiaction + $dialplan->dialplan_detail_type = '${caller_id_name}'; + $dialplan->dialplan_detail_data = '^([^#]+#)(.*)$'; + $dialplan->dialplan_detail_break = 'never'; + $dialplan->dialplan_detail_inline = ''; + $dialplan->dialplan_detail_group = '1'; + $dialplan->dialplan_detail_order = '000'; + $dialplan->dialplan_detail_add(); + unset($dialplan); + + $dialplan = new dialplan; + $dialplan->domain_uuid = $domain_uuid; + $dialplan->dialplan_uuid = $dialplan_uuid; + $dialplan->dialplan_detail_tag = 'action'; //condition, action, antiaction + $dialplan->dialplan_detail_type = 'set'; + $dialplan->dialplan_detail_data = 'caller_id_name=$2'; + $dialplan->dialplan_detail_break = ''; + $dialplan->dialplan_detail_inline = ''; + $dialplan->dialplan_detail_group = '1'; + $dialplan->dialplan_detail_order = '001'; + $dialplan->dialplan_detail_add(); + unset($dialplan); + + //group 2 + $dialplan = new dialplan; + $dialplan->domain_uuid = $domain_uuid; + $dialplan->dialplan_uuid = $dialplan_uuid; + $dialplan->dialplan_detail_tag = 'condition'; //condition, action, antiaction + $dialplan->dialplan_detail_type = 'destination_number'; + $dialplan->dialplan_detail_data = '^'.$row['queue_extension'].'$'; + $dialplan->dialplan_detail_break = ''; + $dialplan->dialplan_detail_inline = ''; + $dialplan->dialplan_detail_group = '2'; + $dialplan->dialplan_detail_order = '000'; + $dialplan->dialplan_detail_add(); + unset($dialplan); + + $dialplan = new dialplan; + $dialplan->domain_uuid = $domain_uuid; + $dialplan->dialplan_uuid = $dialplan_uuid; + $dialplan->dialplan_detail_tag = 'action'; //condition, action, antiaction + $dialplan->dialplan_detail_type = 'answer'; + $dialplan->dialplan_detail_data = ''; + $dialplan->dialplan_detail_break = ''; + $dialplan->dialplan_detail_inline = ''; + $dialplan->dialplan_detail_group = '2'; + $dialplan->dialplan_detail_order = '001'; + $dialplan->dialplan_detail_add(); + unset($dialplan); + + $dialplan = new dialplan; + $dialplan->domain_uuid = $domain_uuid; + $dialplan->dialplan_uuid = $dialplan_uuid; + $dialplan->dialplan_detail_tag = 'action'; //condition, action, antiaction + $dialplan->dialplan_detail_type = 'set'; + $dialplan->dialplan_detail_data = 'hangup_after_bridge=true'; + $dialplan->dialplan_detail_break = ''; + $dialplan->dialplan_detail_inline = ''; + $dialplan->dialplan_detail_group = '2'; + $dialplan->dialplan_detail_order = '002'; + $dialplan->dialplan_detail_add(); + unset($dialplan); + + $dialplan = new dialplan; + $dialplan->domain_uuid = $domain_uuid; + $dialplan->dialplan_uuid = $dialplan_uuid; + $dialplan->dialplan_detail_tag = 'action'; //condition, action, antiaction + $dialplan->dialplan_detail_type = 'set'; + $dialplan->dialplan_detail_data = "caller_id_name=".$queue_cid_prefix."#\${caller_id_name}"; + $dialplan->dialplan_detail_break = ''; + $dialplan->dialplan_detail_inline = ''; + $dialplan->dialplan_detail_group = '2'; + $dialplan->dialplan_detail_order = '003'; + $dialplan->dialplan_detail_add(); + unset($dialplan); + + $dialplan = new dialplan; + $dialplan->domain_uuid = $domain_uuid; + $dialplan->dialplan_uuid = $dialplan_uuid; + $dialplan->dialplan_detail_tag = 'action'; //condition, action, antiaction + $dialplan->dialplan_detail_type = 'system'; + $dialplan->dialplan_detail_data = 'mkdir -p $${base_dir}/recordings/archive/${strftime(%Y)}/${strftime(%b)}/${strftime(%d)}/'; + $dialplan->dialplan_detail_break = ''; + $dialplan->dialplan_detail_inline = ''; + $dialplan->dialplan_detail_group = '2'; + $dialplan->dialplan_detail_order = '004'; + $dialplan->dialplan_detail_add(); + unset($dialplan); + + $dialplan = new dialplan; + $dialplan->domain_uuid = $domain_uuid; + $dialplan->dialplan_uuid = $dialplan_uuid; + $dialplan->dialplan_detail_tag = 'action'; //condition, action, antiaction + $dialplan->dialplan_detail_type = 'callcenter'; + $dialplan->dialplan_detail_data = $queue_name."@".$_SESSION['domains'][$domain_uuid]['domain_name']; + $dialplan->dialplan_detail_break = ''; + $dialplan->dialplan_detail_inline = ''; + $dialplan->dialplan_detail_group = '2'; + $dialplan->dialplan_detail_order = '005'; + $dialplan->dialplan_detail_add(); + unset($dialplan); + + if (strlen($queue_timeout_action) > 0) { + $action_array = explode(":",$queue_timeout_action); + $dialplan = new dialplan; + $dialplan->domain_uuid = $domain_uuid; + $dialplan->dialplan_uuid = $dialplan_uuid; + $dialplan->dialplan_detail_tag = 'action'; //condition, action, antiaction + $dialplan->dialplan_detail_type = $action_array[0]; + $dialplan->dialplan_detail_data = substr($queue_timeout_action, strlen($action_array[0])+1, strlen($queue_timeout_action)); + $dialplan->dialplan_detail_break = ''; + $dialplan->dialplan_detail_inline = ''; + $dialplan->dialplan_detail_group = '2'; + $dialplan->dialplan_detail_order = '006'; + $dialplan->dialplan_detail_add(); + unset($dialplan); + } + + $dialplan = new dialplan; + $dialplan->domain_uuid = $domain_uuid; + $dialplan->dialplan_uuid = $dialplan_uuid; + $dialplan->dialplan_detail_tag = 'action'; //condition, action, antiaction + $dialplan->dialplan_detail_type = 'hangup'; + $dialplan->dialplan_detail_data = ''; + $dialplan->dialplan_detail_break = ''; + $dialplan->dialplan_detail_inline = ''; + $dialplan->dialplan_detail_group = '2'; + $dialplan->dialplan_detail_order = '007'; + $dialplan->dialplan_detail_add(); + unset($dialplan); + } + if ($action == 'update') { + //update the queue entry in the dialplan + + $dialplan_name = $queue_name; + $dialplan_order = '9'; + //$context = $row['queue_context']; + $context = 'default'; + $enabled = 'true'; + $descr = $queue_description; + $call_center_queue_uuid = $row['call_center_queue_uuid']; + + $sql = "update v_dialplans set "; + $sql .= "dialplan_name = '$dialplan_name', "; + $sql .= "dialplan_order = '$dialplan_order', "; + $sql .= "context = '$context', "; + $sql .= "enabled = '$enabled', "; + $sql .= "descr = '$descr' "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and dialplan_uuid = 'dialplan_uuid' "; + //echo "sql: ".$sql."
      "; + $db->query($sql); + unset($sql); + + //update the condition + $sql = "update v_dialplan_details set "; + $sql .= "dialplan_detail_data = '^".$row['queue_extension']."$' "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and dialplan_detail_tag = 'condition' "; + $sql .= "and dialplan_detail_type = 'destination_number' "; + $sql .= "and dialplan_uuid = '$dialplan_uuid' "; + //echo $sql."
      "; + $db->query($sql); + unset($sql); + + //update the action + $sql = "update v_dialplan_details set "; + $sql .= "dialplan_detail_data = 'caller_id_name=".$queue_cid_prefix."\${caller_id_name}' "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and dialplan_detail_tag = 'action' "; + $sql .= "and dialplan_detail_type = 'set' "; + $sql .= "and dialplan_uuid = '$dialplan_uuid' "; + $sql .= "and dialplan_detail_data like '%{caller_id_name}%' "; + //echo $sql."
      "; + $db->query($sql); + + //update the action + $sql = "update v_dialplan_details set "; + $sql .= "dialplan_detail_data = '".$queue_name."@".$_SESSION['domains'][$domain_uuid]['domain_name']."' "; + $sql .= "where domain_uuid = '$domain_uuid' "; + $sql .= "and dialplan_detail_tag = 'action' "; + $sql .= "and dialplan_detail_type = 'callcenter' "; + $sql .= "and dialplan_uuid = '$dialplan_uuid' "; + //echo $sql."
      "; + $db->query($sql); + + unset($dialplan_name); + unset($order); + unset($context); + unset($enabled); + unset($descr); + unset($dialplan_uuid); + } + unset($action); + unset($dialplanincludeid); + } //end if strlen call_center_queue_uuid; add the call center queue to the dialplan + } + + //prepare Queue XML string + $v_queues = ''; + $sql = "select * from v_call_center_queues "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_ASSOC); + $x=0; + foreach ($result as &$row) { + $queue_name = $row["queue_name"]; + $queue_extension = $row["queue_extension"]; + $queue_strategy = $row["queue_strategy"]; + $queue_moh_sound = $row["queue_moh_sound"]; + $queue_record_template = $row["queue_record_template"]; + $queue_time_base_score = $row["queue_time_base_score"]; + $queue_max_wait_time = $row["queue_max_wait_time"]; + $queue_max_wait_time_with_no_agent = $row["queue_max_wait_time_with_no_agent"]; + $queue_tier_rules_apply = $row["queue_tier_rules_apply"]; + $queue_tier_rule_wait_second = $row["queue_tier_rule_wait_second"]; + $queue_tier_rule_wait_multiply_level = $row["queue_tier_rule_wait_multiply_level"]; + $queue_tier_rule_no_agent_no_wait = $row["queue_tier_rule_no_agent_no_wait"]; + $queue_discard_abandoned_after = $row["queue_discard_abandoned_after"]; + $queue_abandoned_resume_allowed = $row["queue_abandoned_resume_allowed"]; + $queue_description = $row["queue_description"]; + if ($x > 0) { + $v_queues .= "\n"; + $v_queues .= " "; + } + $v_queues .= "\n"; + $v_queues .= " \n"; + $v_queues .= " \n"; + if (strlen($queue_record_template) > 0) { + $v_queues .= " \n"; + } + $v_queues .= " \n"; + $v_queues .= " \n"; + $v_queues .= " \n"; + $v_queues .= " \n"; + $v_queues .= " \n"; + $v_queues .= " \n"; + $v_queues .= " \n"; + $v_queues .= " \n"; + $v_queues .= " \n"; + $v_queues .= " "; + $x++; + } + unset ($prep_statement); + + //prepare Agent XML string + $v_agents = ''; + $sql = "select * from v_call_center_agents "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_ASSOC); + $x=0; + foreach ($result as &$row) { + //get the values from the db and set as php variables + $agent_name = $row["agent_name"]; + $agent_type = $row["agent_type"]; + $agent_call_timeout = $row["agent_call_timeout"]; + $agent_contact = $row["agent_contact"]; + $agent_status = $row["agent_status"]; + $agent_no_answer_delay_time = $row["agent_no_answer_delay_time"]; + $agent_max_no_answer = $row["agent_max_no_answer"]; + $agent_wrap_up_time = $row["agent_wrap_up_time"]; + $agent_reject_delay_time = $row["agent_reject_delay_time"]; + $agent_busy_delay_time = $row["agent_busy_delay_time"]; + if ($x > 0) { + $v_agents .= "\n"; + $v_agents .= " "; + + } + + //get and then set the complete agent_contact with the call_timeout and when necessary confirm + $tmp_confirm = "group_confirm_file=custom/press_1_to_accept_this_call.wav,group_confirm_key=1"; + if(strstr($agent_contact, '}') === FALSE) { + //not found + if(stristr($agent_contact, 'sofia/gateway') === FALSE) { + //add the call_timeout + $tmp_agent_contact = "{call_timeout=".$agent_call_timeout."}".$agent_contact; + } + else { + //add the call_timeout and confirm + $tmp_agent_contact = $tmp_first.',call_timeout='.$agent_call_timeout.$tmp_last; + $tmp_agent_contact = "{".$tmp_confirm.",call_timeout=".$agent_call_timeout."}".$agent_contact; + } + } + else { + //found + if(stristr($agent_contact, 'sofia/gateway') === FALSE) { + //not found + if(stristr($agent_contact, 'call_timeout') === FALSE) { + //add the call_timeout + $tmp_pos = strrpos($agent_contact, "}"); + $tmp_first = substr($agent_contact, 0, $tmp_pos); + $tmp_last = substr($agent_contact, $tmp_pos); + $tmp_agent_contact = $tmp_first.',call_timeout='.$agent_call_timeout.$tmp_last; + } + else { + //the string has the call timeout + $tmp_agent_contact = $agent_contact; + } + } + else { + //found + $tmp_pos = strrpos($agent_contact, "}"); + $tmp_first = substr($agent_contact, 0, $tmp_pos); + $tmp_last = substr($agent_contact, $tmp_pos); + if(stristr($agent_contact, 'call_timeout') === FALSE) { + //add the call_timeout and confirm + $tmp_agent_contact = $tmp_first.','.$tmp_confirm.',call_timeout='.$agent_call_timeout.$tmp_last; + } + else { + //add confirm + $tmp_agent_contact = $tmp_first.','.$tmp_confirm.$tmp_last; + } + } + } + + $v_agents .= "prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(PDO::FETCH_ASSOC); + $x=0; + foreach ($result as &$row) { + $agent_name = $row["agent_name"]; + $queue_name = $row["queue_name"]; + $tier_level = $row["tier_level"]; + $tier_position = $row["tier_position"]; + if ($x > 0) { + $v_tiers .= "\n"; + $v_tiers .= " "; + } + $v_tiers .= ""; + $x++; + } + + //get the contents of the template + $file_contents = file_get_contents($_SERVER["DOCUMENT_ROOT"].PROJECT_PATH."/includes/templates/conf/autoload_configs/callcenter.conf.xml"); + + //add the Call Center Queues, Agents and Tiers to the XML config + $file_contents = str_replace("{v_queues}", $v_queues, $file_contents); + unset ($v_queues); + + $file_contents = str_replace("{v_agents}", $v_agents, $file_contents); + unset ($v_agents); + + $file_contents = str_replace("{v_tiers}", $v_tiers, $file_contents); + unset ($v_tiers); + + //write the XML config file + $fout = fopen($_SESSION['switch']['conf']['dir']."/autoload_configs/callcenter.conf.xml","w"); + fwrite($fout, $file_contents); + fclose($fout); + + //syncrhonize the configuration + save_dialplan_xml(); + + //apply settings reminder + $_SESSION["reload_xml"] = true; + } + } +} + +if (!function_exists('switch_conf_xml')) { + function switch_conf_xml() { + //get the global variables + global $db, $domain_uuid; + + //get the contents of the template + $file_contents = file_get_contents($_SERVER["DOCUMENT_ROOT"].PROJECT_PATH."/includes/templates/conf/autoload_configs/switch.conf.xml"); + + //prepare the php variables + if (stristr(PHP_OS, 'WIN')) { + $bindir = getenv(PHPRC); + $v_mailer_app ='"'. $bindir."\php". '" -f '.$_SERVER["DOCUMENT_ROOT"].PROJECT_PATH."\secure\\v_mailto.php -- "; + $v_mailer_app = sprintf("'%s'", $v_mailer_app); + $v_mailer_app_args = ""; + } + else { + if (file_exists(PHP_BINDIR.'/php')) { define("PHP_BIN", "php"); } + $v_mailer_app = PHP_BINDIR."/".PHP_BIN." ".$_SERVER["DOCUMENT_ROOT"].PROJECT_PATH."/secure/v_mailto.php"; + $v_mailer_app = sprintf('"%s"', $v_mailer_app); + $v_mailer_app_args = "-t"; + } + + //replace the values in the template + $file_contents = str_replace("{v_mailer_app}", $v_mailer_app, $file_contents); + unset ($v_mailer_app); + + //replace the values in the template + $file_contents = str_replace("{v_mailer_app_args}", $v_mailer_app_args, $file_contents); + unset ($v_mailer_app_args); + + //write the XML config file + $fout = fopen($_SESSION['switch']['conf']['dir']."/autoload_configs/switch.conf.xml","w"); + fwrite($fout, $file_contents); + fclose($fout); + + //apply settings reminder + $_SESSION["reload_xml"] = true; + } +} + +if (!function_exists('xml_cdr_conf_xml')) { + function xml_cdr_conf_xml() { + + //get the global variables + global $db, $domain_uuid; + + //get the contents of the template + $file_contents = file_get_contents($_SERVER["DOCUMENT_ROOT"].PROJECT_PATH."/includes/templates/conf/autoload_configs/xml_cdr.conf.xml"); + + //replace the values in the template + $file_contents = str_replace("{v_http_protocol}", "http", $file_contents); + $file_contents = str_replace("{domain_name}", "127.0.0.1", $file_contents); + $file_contents = str_replace("{v_project_path}", PROJECT_PATH, $file_contents); + + $v_user = generate_password(); + $file_contents = str_replace("{v_user}", $v_user, $file_contents); + unset ($v_user); + + $v_pass = generate_password(); + $file_contents = str_replace("{v_pass}", $v_pass, $file_contents); + unset ($v_pass); + + //write the XML config file + $fout = fopen($_SESSION['switch']['conf']['dir']."/autoload_configs/xml_cdr.conf.xml","w"); + fwrite($fout, $file_contents); + fclose($fout); + + //apply settings reminder + $_SESSION["reload_xml"] = true; + } +} + +if (!function_exists('save_sip_profile_xml')) { + function save_sip_profile_xml() { + + //get the global variables + global $db, $domain_uuid; + + //get the sip profiles from the database + $sql = "select * from v_sip_profiles "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(); + $result_count = count($result); + unset ($prep_statement, $sql); + if ($result_count > 0) { + foreach($result as $row) { + $sip_profile_uuid = $row['sip_profile_uuid']; + $sip_profile_name = $row['sip_profile_name']; + + //get the xml sip profile template + if ($sip_profile_name == "internal" || $sip_profile_name == "external" || $sip_profile_name == "internal-ipv6") { + $file_contents = file_get_contents($_SERVER["DOCUMENT_ROOT"].PROJECT_PATH."/app/sip_profiles/resources/xml/sip_profiles/".$sip_profile_name.".xml"); + } + else { + $file_contents = file_get_contents($_SERVER["DOCUMENT_ROOT"].PROJECT_PATH."/app/sip_profiles/resources/xml/sip_profiles/default.xml"); + } + + //get the sip profile settings + $sql = "select * from v_sip_profile_settings "; + $sql .= "where sip_profile_uuid = '$sip_profile_uuid' "; + $sql .= "and sip_profile_setting_enabled = 'true' "; + $prep_statement = $db->prepare(check_sql($sql)); + $prep_statement->execute(); + $result = $prep_statement->fetchAll(); + $sip_profile_settings = ''; + foreach ($result as &$row) { + $sip_profile_settings .= " \n"; + } + unset ($prep_statement); + + //replace the values in the template + $file_contents = str_replace("{v_sip_profile_name}", $sip_profile_name, $file_contents); + $file_contents = str_replace("{v_sip_profile_settings}", $sip_profile_settings, $file_contents); + + //write the XML config file + if (is_readable($_SESSION['switch']['conf']['dir']."/sip_profiles/")) { + $fout = fopen($_SESSION['switch']['conf']['dir']."/sip_profiles/".$sip_profile_name.".xml","w"); + fwrite($fout, $file_contents); + fclose($fout); + } + + //if the directory does not exist then create it + if (!is_readable($_SESSION['switch']['conf']['dir']."/sip_profiles/".$sip_profile_name)) { mkdir($_SESSION['switch']['conf']['dir']."/sip_profiles/".$sip_profile_name,0775,true); } + + } //end foreach + unset($sql, $result, $row_count); + } //end if results + + //apply settings reminder + $_SESSION["reload_xml"] = true; + } +} + +if (!function_exists('save_switch_xml')) { + function save_switch_xml() { + if (is_readable($_SESSION['switch']['dialplan']['dir'])) { + save_dialplan_xml(); + } + if (is_readable($_SESSION['switch']['extensions']['dir'])) { + save_extension_xml(); + } + if (is_readable($_SESSION['switch']['conf']['dir'])) { + save_setting_xml(); + save_module_xml(); + save_var_xml(); + save_call_center_xml(); + save_gateway_xml(); + save_ivr_menu_xml(); + save_sip_profile_xml(); + } + if (is_readable($_SESSION['switch']['scripts']['dir'])) { + save_hunt_group_xml(); + } + } +} + +?> \ No newline at end of file diff --git a/includes/menu.php b/includes/menu.php new file mode 100644 index 0000000000..02f82b2fe0 --- /dev/null +++ b/includes/menu.php @@ -0,0 +1,80 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +require_once "root.php"; +require_once "includes/require.php"; + +//define the variable + $v_menu = ''; + +//force the menu to generate on every page load + //$_SESSION["menu"] = ''; + +//build the menu if the session menu has no length + if (!isset($_SESSION["menu"])) { + $_SESSION["menu"] = ''; + } + if (strlen($_SESSION["menu"]) == 0) { + $menuwidth = '110'; + //echo " \n"; + //echo " "; + + $v_menu = ""; + $v_menu .= " \n"; + //$v_menu .= " \n"; + $v_menu .= "\n"; + + $v_menu .= "\n"; + $v_menu .= "
      \n"; + $v_menu .= "\n"; + + require_once "includes/classes/menu.php"; + $menu = new menu; + $menu->db = $db; + $menu->menu_uuid = $_SESSION['domain']['menu']['uuid']; + $v_menu .= $menu->build_html("", "main"); + unset($menu); + + $v_menu .= "
      \n"; + $_SESSION["menu"] = $v_menu; + } + else { + //echo "from session"; + } + +//testing + //echo $_SESSION["menu"]; +?> diff --git a/includes/paging.php b/includes/paging.php new file mode 100644 index 0000000000..2cf53e6179 --- /dev/null +++ b/includes/paging.php @@ -0,0 +1,102 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ + +function paging($num_rows, $param, $rows_per_page) { + + if (strlen($rows_per_page)==0) { + $rows_per_page = "5"; //default number of rows per page + } + + +// by default we show first page + $pagenum = 0; + + // if $_get['page'] defined, use it as page number + if(isset($_GET['page'])) { + $pagenum = $_GET['page']; + } + + // counting the offset + $offset = ($pagenum - 1) * $rows_per_page; + + // how many pages we have when using paging? + $maxpage = ceil($num_rows/$rows_per_page); + + // print the link to access each page + $self = $_SERVER['PHP_SELF']; + $nav = ''; + for($page = 1; $page <= $maxpage; $page++){ + if ($page == $pagenum) { + $nav .= " $page "; // no need to create a link to current page + } + else { + $nav .= " $page \n"; + } + } + + if ($pagenum > 0) { + //echo "currently middepage
      "; + $page = $pagenum - 1; + $prev = "\n"; + $first = "\n"; + + } + else { + //echo "currently on the first page
      "; + $prev = "\n"; + //$first = "\n"; + } + + if (($pagenum + 1) < $maxpage) { + //echo "middle page
      "; + $page = $pagenum + 1; + $next = "\n"; + $last = "\n"; + + } + else { + //echo "last page
      "; + $last = "\n"; + $next = "\n"; + //$last = "\n"; + + } + + $returnearray = array(); + if ($maxpage > 1) { + //$returnearray[] = $first . $prev ." Page $pagenum of $maxpage " . $next . $last; + $returnearray[] = "
      ".$prev ." " .$next. "
      \n"; + } + else { + $returnearray[] = ""; + } + $returnearray[] = $rows_per_page; + $returnearray[] = $offset; + + return $returnearray; + +} +?> diff --git a/includes/persistform.php b/includes/persistform.php new file mode 100644 index 0000000000..d4466d13ae --- /dev/null +++ b/includes/persistform.php @@ -0,0 +1,46 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ + +function persistform($formarray) { + // Remember Form Input Values + if(is_array($formarray)) { + $content .= "
      \n"; + foreach($formarray as $key => $val) { + if($key == "XID" || $key == "ACT" || $key == "RET") continue; + if ($key != "persistform") { //clears the persistform value + $content .= "\n"; + } + } + $content .= "\n"; //sets persistform to yes + $content .= "\n"; + $content .= "
      \n"; + } + return $content; +} +//persistform($_POST); +//persistform($_GET); + +?> diff --git a/includes/persistformvar.php b/includes/persistformvar.php new file mode 100644 index 0000000000..21ea89fd14 --- /dev/null +++ b/includes/persistformvar.php @@ -0,0 +1,47 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ + +function persistformvar($formarray) { + // Remember Form Input Values + if(is_array($formarray)) { + $content .= "
      \n"; + foreach($formarray as $key => $val) { + if($key == "XID" || $key == "ACT" || $key == "RET") continue; + if ($key != "persistform") { //clears the persistform value + $content .= "\n"; + } + } + $content .= "\n"; //sets persistform to yes + $content .= "\n"; + $content .= "
      \n"; + } + echo $content; + //return $content; +} +//persistformvar($_POST); +//persistformvar($_GET); + +?> diff --git a/includes/phpsvnclient/definitions.php b/includes/phpsvnclient/definitions.php new file mode 100644 index 0000000000..2aec0ddc5a --- /dev/null +++ b/includes/phpsvnclient/definitions.php @@ -0,0 +1,81 @@ + + + +'); + +define("PHPSVN_NORMAL_REQUEST", +' + + + + + + +'); + +// +// + +define("PHPSVN_VERSION_REQUEST",''); +define("PHPSVN_LOGS_REQUEST",' %d%d'); + +define("SVN_LAST_MODIFIED","lp1:getlastmodified"); +define("SVN_URL","D:href"); +define("SVN_RELATIVE_URL","lp3:baseline-relative-path"); +define("SVN_FILE_ID","lp3:repository-uuid"); +define("SVN_STATUS","D:status"); +define("SVN_IN_FILE","D:propstat"); +define("SVN_FILE","D:response"); + +define("SVN_LOGS_BEGINGS","S:log-item"); +define("SVN_LOGS_VERSION","D:version-name"); +define("SVN_LOGS_AUTHOR","D:creator-displayname"); +define("SVN_LOGS_DATE","S:date"); + +// file changes. Note that we grouping ALL changed files together, +// so we will list deleted and renamed files here as well +define("SVN_LOGS_MODIFIED_FILES","S:modified-path"); +define("SVN_LOGS_ADDED_FILES","S:added-path"); +define("SVN_LOGS_DELETED_FILES","S:deleted-path"); +define("SVN_LOGS_RENAMED_FILES","S:replaced-path"); + +define("SVN_LOGS_COMMENT","D:comment"); + +define("NOT_FOUND", 2); +define("AUTH_REQUIRED", 3); +define("UNKNOWN_ERROR",4); +define("NO_ERROR",1) +?> diff --git a/includes/phpsvnclient/http.php b/includes/phpsvnclient/http.php new file mode 100644 index 0000000000..59d80e4d23 --- /dev/null +++ b/includes/phpsvnclient/http.php @@ -0,0 +1,1985 @@ +"01", + "Feb"=>"02", + "Mar"=>"03", + "Apr"=>"04", + "May"=>"05", + "Jun"=>"06", + "Jul"=>"07", + "Aug"=>"08", + "Sep"=>"09", + "Oct"=>"10", + "Nov"=>"11", + "Dec"=>"12"); + var $session=''; + var $connection_close=0; + + /* Private methods - DO NOT CALL */ + + Function Tokenize($string,$separator="") + { + if(!strcmp($separator,"")) + { + $separator=$string; + $string=$this->next_token; + } + for($character=0;$characternext_token=substr($string,$found+1); + return(substr($string,0,$found)); + } + else + { + $this->next_token=""; + return($string); + } + } + + Function CookieEncode($value, $name) + { + return($name ? str_replace("=", "%25", $value) : str_replace(";", "%3B", $value)); + } + + Function SetError($error) + { + return($this->error=$error); + } + + Function SetPHPError($error, &$php_error_message) + { + if(IsSet($php_error_message) + && strlen($php_error_message)) + $error.=": ".$php_error_message; + return($this->SetError($error)); + } + + Function SetDataAccessError($error,$check_connection=0) + { + $this->error=$error; + if(!$this->use_curl + && function_exists("socket_get_status")) + { + $status=socket_get_status($this->connection); + if($status["timed_out"]) + $this->error.=": data access time out"; + elseif($status["eof"]) + { + if($check_connection) + $this->error=""; + else + $this->error.=": the server disconnected"; + } + } + } + + Function OutputDebug($message) + { + $message.="\n"; + if($this->html_debug) + $message=str_replace("\n","
      \n",HtmlEntities($message)); + echo $message; + flush(); + } + + Function GetLine() + { + for($line="";;) + { + if($this->use_curl) + { + $eol=strpos($this->response,"\n",$this->read_response); + $data=($eol ? substr($this->response,$this->read_response,$eol+1-$this->read_response) : ""); + $this->read_response+=strlen($data); + } + else + { + if(feof($this->connection)) + { + $this->SetDataAccessError("reached the end of data while reading from the HTTP server connection"); + return(0); + } + $data=fgets($this->connection,100); + } + if(GetType($data)!="string" + || strlen($data)==0) + { + $this->SetDataAccessError("it was not possible to read line from the HTTP server"); + return(0); + } + $line.=$data; + $length=strlen($line); + if($length + && !strcmp(substr($line,$length-1,1),"\n")) + { + $length-=(($length>=2 && !strcmp(substr($line,$length-2,1),"\r")) ? 2 : 1); + $line=substr($line,0,$length); + if($this->debug) + $this->OutputDebug("S $line"); + return($line); + } + } + } + + Function PutLine($line) + { + if($this->debug) + $this->OutputDebug("C $line"); + if(!fputs($this->connection,$line."\r\n")) + { + $this->SetDataAccessError("it was not possible to send a line to the HTTP server"); + return(0); + } + return(1); + } + + Function PutData($data) + { + if(strlen($data)) + { + if($this->debug) + $this->OutputDebug('C '.$data); + if(!fputs($this->connection,$data)) + { + $this->SetDataAccessError("it was not possible to send data to the HTTP server"); + return(0); + } + } + return(1); + } + + Function FlushData() + { + if(!fflush($this->connection)) + { + $this->SetDataAccessError("it was not possible to send data to the HTTP server"); + return(0); + } + return(1); + } + + Function ReadChunkSize() + { + if($this->remaining_chunk==0) + { + $debug=$this->debug; + if(!$this->debug_response_body) + $this->debug=0; + $line=$this->GetLine(); + $this->debug=$debug; + if(GetType($line)!="string") + return($this->SetError("4 could not read chunk start: ".$this->error)); + $this->remaining_chunk=hexdec($line); + } + return(""); + } + + Function ReadBytes($length) + { + if($this->use_curl) + { + $bytes=substr($this->response,$this->read_response,min($length,strlen($this->response)-$this->read_response)); + $this->read_response+=strlen($bytes); + if($this->debug + && $this->debug_response_body + && strlen($bytes)) + $this->OutputDebug("S ".$bytes); + } + else + { + if($this->chunked) + { + for($bytes="",$remaining=$length;$remaining;) + { + if(strlen($this->ReadChunkSize())) + return(""); + if($this->remaining_chunk==0) + { + $this->last_chunk_read=1; + break; + } + $ask=min($this->remaining_chunk,$remaining); + $chunk=@fread($this->connection,$ask); + $read=strlen($chunk); + if($read==0) + { + $this->SetDataAccessError("it was not possible to read data chunk from the HTTP server"); + return(""); + } + if($this->debug + && $this->debug_response_body) + $this->OutputDebug("S ".$chunk); + $bytes.=$chunk; + $this->remaining_chunk-=$read; + $remaining-=$read; + if($this->remaining_chunk==0) + { + if(feof($this->connection)) + return($this->SetError("reached the end of data while reading the end of data chunk mark from the HTTP server")); + $data=@fread($this->connection,2); + if(strcmp($data,"\r\n")) + { + $this->SetDataAccessError("it was not possible to read end of data chunk from the HTTP server"); + return(""); + } + } + } + } + else + { + $bytes=@fread($this->connection,$length); + if(strlen($bytes)) + { + if($this->debug + && $this->debug_response_body) + $this->OutputDebug("S ".$bytes); + } + else + $this->SetDataAccessError("it was not possible to read data from the HTTP server", $this->connection_close); + } + } + return($bytes); + } + + Function EndOfInput() + { + if($this->use_curl) + return($this->read_response>=strlen($this->response)); + if($this->chunked) + return($this->last_chunk_read); + return(feof($this->connection)); + } + + Function Resolve($domain, &$ip, $server_type) + { +// if(ereg('^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$',$domain)) + if(preg_match('/^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$/',$domain)) + $ip=$domain; + else + { + if($this->debug) + $this->OutputDebug('Resolving '.$server_type.' server domain "'.$domain.'"...'); + if(!strcmp($ip=@gethostbyname($domain),$domain)) + $ip=""; + } + if(strlen($ip)==0 + || (strlen($this->exclude_address) + && !strcmp(@gethostbyname($this->exclude_address),$ip))) + return($this->SetError("could not resolve the host domain \"".$domain."\"")); + return(''); + } + + Function Connect($host_name, $host_port, $ssl, $server_type = 'HTTP') + { + $domain=$host_name; + $port = $host_port; + if(strlen($error = $this->Resolve($domain, $ip, $server_type))) + return($error); + if(strlen($this->socks_host_name)) + { + switch($this->socks_version) + { + case '4': + $version = 4; + break; + case '5': + $version = 5; + break; + default: + return('it was not specified a supported SOCKS protocol version'); + break; + } + $host_ip = $ip; + $port = $this->socks_host_port; + $host_server_type = $server_type; + $server_type = 'SOCKS'; + if(strlen($error = $this->Resolve($this->socks_host_name, $ip, $server_type))) + return($error); + } + if($this->debug) + $this->OutputDebug('Connecting to '.$server_type.' server IP '.$ip.' port '.$port.'...'); + if($ssl) + $ip="ssl://".$ip; + if(($this->connection=($this->timeout ? @fsockopen($ip, $port, $errno, $error, $this->timeout) : @fsockopen($ip, $port, $errno)))==0) + { + switch($errno) + { + case -3: + return($this->SetError("-3 socket could not be created")); + case -4: + return($this->SetError("-4 dns lookup on hostname \"".$host_name."\" failed")); + case -5: + return($this->SetError("-5 connection refused or timed out")); + case -6: + return($this->SetError("-6 fdopen() call failed")); + case -7: + return($this->SetError("-7 setvbuf() call failed")); + default: + return($this->SetPHPError($errno." could not connect to the host \"".$host_name."\"",$php_errormsg)); + } + } + else + { + if($this->data_timeout + && function_exists("socket_set_timeout")) + socket_set_timeout($this->connection,$this->data_timeout,0); + if(strlen($this->socks_host_name)) + { + if($this->debug) + $this->OutputDebug('Connected to the SOCKS server '.$this->socks_host_name); + $send_error = 'it was not possible to send data to the SOCKS server'; + $receive_error = 'it was not possible to receive data from the SOCKS server'; + switch($version) + { + case 4: + $command = 1; + if(!fputs($this->connection, chr($version).chr($command).pack('nN', $host_port, ip2long($host_ip)).$this->user.Chr(0))) + $error = $this->SetDataAccessError($send_error); + else + { + $response = fgets($this->connection, 9); + if(strlen($response) != 8) + $error = $this->SetDataAccessError($receive_error); + else + { + $socks_errors = array( + "\x5a"=>'', + "\x5b"=>'request rejected', + "\x5c"=>'request failed because client is not running identd (or not reachable from the server)', + "\x5d"=>'request failed because client\'s identd could not confirm the user ID string in the request', + ); + $error_code = $response[1]; + $error = (IsSet($socks_errors[$error_code]) ? $socks_errors[$error_code] : 'unknown'); + if(strlen($error)) + $error = 'SOCKS error: '.$error; + } + } + break; + case 5: + if($this->debug) + $this->OutputDebug('Negotiating the authentication method ...'); + $methods = 1; + $method = 0; + if(!fputs($this->connection, chr($version).chr($methods).chr($method))) + $error = $this->SetDataAccessError($send_error); + else + { + $response = fgets($this->connection, 3); + if(strlen($response) != 2) + $error = $this->SetDataAccessError($receive_error); + elseif(Ord($response[1]) != $method) + $error = 'the SOCKS server requires an authentication method that is not yet supported'; + else + { + if($this->debug) + $this->OutputDebug('Connecting to '.$host_server_type.' server IP '.$host_ip.' port '.$host_port.'...'); + $command = 1; + $address_type = 1; + if(!fputs($this->connection, chr($version).chr($command)."\x00".chr($address_type).pack('Nn', ip2long($host_ip), $host_port))) + $error = $this->SetDataAccessError($send_error); + else + { + $response = fgets($this->connection, 11); + if(strlen($response) != 10) + $error = $this->SetDataAccessError($receive_error); + else + { + $socks_errors = array( + "\x00"=>'', + "\x01"=>'general SOCKS server failure', + "\x02"=>'connection not allowed by ruleset', + "\x03"=>'Network unreachable', + "\x04"=>'Host unreachable', + "\x05"=>'Connection refused', + "\x06"=>'TTL expired', + "\x07"=>'Command not supported', + "\x08"=>'Address type not supported' + ); + $error_code = $response[1]; + $error = (IsSet($socks_errors[$error_code]) ? $socks_errors[$error_code] : 'unknown'); + if(strlen($error)) + $error = 'SOCKS error: '.$error; + } + } + } + } + break; + default: + $error = 'support for SOCKS protocol version '.$this->socks_version.' is not yet implemented'; + break; + } + if(strlen($error)) + { + fclose($this->connection); + return($error); + } + } + if($this->debug) + $this->OutputDebug("Connected to $host_name"); + if(strlen($this->proxy_host_name) + && !strcmp(strtolower($this->protocol), 'https')) + { + if(function_exists('stream_socket_enable_crypto') + && in_array('ssl', stream_get_transports())) + $this->state = "ConnectedToProxy"; + else + { + $this->OutputDebug("It is not possible to start SSL after connecting to the proxy server. If the proxy refuses to forward the SSL request, you may need to upgrade to PHP 5.1 or later with OpenSSL support enabled."); + $this->state="Connected"; + } + } + else + $this->state="Connected"; + return(""); + } + } + + Function Disconnect() + { + if($this->debug) + $this->OutputDebug("Disconnected from ".$this->host_name); + if($this->use_curl) + { + curl_close($this->connection); + $this->response=""; + } + else + fclose($this->connection); + $this->state="Disconnected"; + return(""); + } + + /* Public methods */ + + Function GetRequestArguments($url, &$arguments) + { + if(strlen($this->error)) + return($this->error); + $arguments=array(); + $parameters=@parse_url($url); + + if(!$parameters) + return($this->SetError("it was not specified a valid URL")); + if(!IsSet($parameters["scheme"])) + return($this->SetError("it was not specified the protocol type argument")); + switch(strtolower($parameters["scheme"])) + { + case "http": + case "https": + $arguments["Protocol"]=$parameters["scheme"]; + break; + default: + return($parameters["scheme"]." connection scheme is not yet supported"); + } + if(!IsSet($parameters["host"])) + return($this->SetError("it was not specified the connection host argument")); + $arguments["HostName"]=$parameters["host"]; + $arguments["Headers"]=array("Host"=>$parameters["host"].(IsSet($parameters["port"]) ? ":".$parameters["port"] : "")); + if(IsSet($parameters["user"])) + { + $arguments["AuthUser"]=UrlDecode($parameters["user"]); + if(!IsSet($parameters["pass"])) + $arguments["AuthPassword"]=""; + } + if(IsSet($parameters["pass"])) + { + if(!IsSet($parameters["user"])) + $arguments["AuthUser"]=""; + $arguments["AuthPassword"]=UrlDecode($parameters["pass"]); + } + if(IsSet($parameters["port"])) + { + if(strcmp($parameters["port"],strval(intval($parameters["port"])))) + return($this->SetError("it was not specified a valid connection host argument")); + $arguments["HostPort"]=intval($parameters["port"]); + } + else + $arguments["HostPort"]=0; + $arguments["RequestURI"]=(IsSet($parameters["path"]) ? $parameters["path"] : "/").(IsSet($parameters["query"]) ? "?".$parameters["query"] : ""); + if(strlen($this->user_agent)) + $arguments["Headers"]["User-Agent"]=$this->user_agent; + return(""); + } + + Function Open($arguments) + { + if(strlen($this->error)) + return($this->error); + if($this->state!="Disconnected") + return("1 already connected"); + if(IsSet($arguments["HostName"])) + $this->host_name=$arguments["HostName"]; + if(IsSet($arguments["HostPort"])) + $this->host_port=$arguments["HostPort"]; + if(IsSet($arguments["ProxyHostName"])) + $this->proxy_host_name=$arguments["ProxyHostName"]; + if(IsSet($arguments["ProxyHostPort"])) + $this->proxy_host_port=$arguments["ProxyHostPort"]; + if(IsSet($arguments["SOCKSHostName"])) + $this->socks_host_name=$arguments["SOCKSHostName"]; + if(IsSet($arguments["SOCKSHostPort"])) + $this->socks_host_port=$arguments["SOCKSHostPort"]; + if(IsSet($arguments["SOCKSVersion"])) + $this->socks_version=$arguments["SOCKSVersion"]; + if(IsSet($arguments["Protocol"])) + $this->protocol=$arguments["Protocol"]; + switch(strtolower($this->protocol)) + { + case "http": + $default_port=80; + break; + case "https": + $default_port=443; + break; + default: + return($this->SetError("2 it was not specified a valid connection protocol")); + } + if(strlen($this->proxy_host_name)==0) + { + if(strlen($this->host_name)==0) + return($this->SetError("2 it was not specified a valid hostname")); + $host_name=$this->host_name; + $host_port=($this->host_port ? $this->host_port : $default_port); + $server_type = 'HTTP'; + } + else + { + $host_name=$this->proxy_host_name; + $host_port=$this->proxy_host_port; + $server_type = 'HTTP proxy'; + } + $ssl=(strtolower($this->protocol)=="https" && strlen($this->proxy_host_name)==0); + if($ssl + && strlen($this->socks_host_name)) + return($this->SetError('establishing SSL connections via a SOCKS server is not yet supported')); + $this->use_curl=($ssl && $this->prefer_curl && function_exists("curl_init")); + if($this->debug) + $this->OutputDebug("Connecting to ".$this->host_name); + if($this->use_curl) + { + $error=(($this->connection=curl_init($this->protocol."://".$this->host_name.($host_port==$default_port ? "" : ":".strval($host_port))."/")) ? "" : "Could not initialize a CURL session"); + if(strlen($error)==0) + { + if(IsSet($arguments["SSLCertificateFile"])) + curl_setopt($this->connection,CURLOPT_SSLCERT,$arguments["SSLCertificateFile"]); + if(IsSet($arguments["SSLCertificatePassword"])) + curl_setopt($this->connection,CURLOPT_SSLCERTPASSWD,$arguments["SSLCertificatePassword"]); + if(IsSet($arguments["SSLKeyFile"])) + curl_setopt($this->connection,CURLOPT_SSLKEY,$arguments["SSLKeyFile"]); + if(IsSet($arguments["SSLKeyPassword"])) + curl_setopt($this->connection,CURLOPT_SSLKEYPASSWD,$arguments["SSLKeyPassword"]); + } + $this->state="Connected"; + } + else + { + $error=""; + if(strlen($this->proxy_host_name) + && (IsSet($arguments["SSLCertificateFile"]) + || IsSet($arguments["SSLCertificateFile"]))) + $error="establishing SSL connections using certificates or private keys via non-SSL proxies is not supported"; + else + { + if($ssl) + { + if(IsSet($arguments["SSLCertificateFile"])) + $error="establishing SSL connections using certificates is only supported when the cURL extension is enabled"; + elseif(IsSet($arguments["SSLKeyFile"])) + $error="establishing SSL connections using a private key is only supported when the cURL extension is enabled"; + else + { + $version=explode(".",function_exists("phpversion") ? phpversion() : "3.0.7"); + $php_version=intval($version[0])*1000000+intval($version[1])*1000+intval($version[2]); + if($php_version<4003000) + $error="establishing SSL connections requires at least PHP version 4.3.0 or having the cURL extension enabled"; + elseif(!function_exists("extension_loaded") + || !extension_loaded("openssl")) + $error="establishing SSL connections requires the OpenSSL extension enabled"; + } + } + if(strlen($error)==0) + $error=$this->Connect($host_name, $host_port, $ssl, $server_type); + } + } + if(strlen($error)) + return($this->SetError($error)); + $this->session=md5(uniqid("")); + return(""); + } + + Function Close() + { + if($this->state=="Disconnected") + return("1 already disconnected"); + $error=$this->Disconnect(); + if(strlen($error)==0) + $this->state="Disconnected"; + return($error); + } + + Function PickCookies(&$cookies,$secure) + { + if(IsSet($this->cookies[$secure])) + { + $now=gmdate("Y-m-d H-i-s"); + for($domain=0,Reset($this->cookies[$secure]);$domaincookies[$secure]);Next($this->cookies[$secure]),$domain++) + { + $domain_pattern=Key($this->cookies[$secure]); + $match=strlen($this->request_host)-strlen($domain_pattern); + if($match>=0 + && !strcmp($domain_pattern,substr($this->request_host,$match)) + && ($match==0 + || $domain_pattern[0]=="." + || $this->request_host[$match-1]==".")) + { + for(Reset($this->cookies[$secure][$domain_pattern]),$path_part=0;$path_partcookies[$secure][$domain_pattern]);Next($this->cookies[$secure][$domain_pattern]),$path_part++) + { + $path=Key($this->cookies[$secure][$domain_pattern]); + if(strlen($this->request_uri)>=strlen($path) + && substr($this->request_uri,0,strlen($path))==$path) + { + for(Reset($this->cookies[$secure][$domain_pattern][$path]),$cookie=0;$cookiecookies[$secure][$domain_pattern][$path]);Next($this->cookies[$secure][$domain_pattern][$path]),$cookie++) + { + $cookie_name=Key($this->cookies[$secure][$domain_pattern][$path]); + $expires=$this->cookies[$secure][$domain_pattern][$path][$cookie_name]["expires"]; + if($expires=="" + || strcmp($now,$expires)<0) + $cookies[$cookie_name]=$this->cookies[$secure][$domain_pattern][$path][$cookie_name]; + } + } + } + } + } + } + } + + Function GetFileDefinition($file, &$definition) + { + $name=""; + if(IsSet($file["FileName"])) + $name=basename($file["FileName"]); + if(IsSet($file["Name"])) + $name=$file["Name"]; + if(strlen($name)==0) + return("it was not specified the file part name"); + if(IsSet($file["Content-Type"])) + { + $content_type=$file["Content-Type"]; + $type=$this->Tokenize(strtolower($content_type),"/"); + $sub_type=$this->Tokenize(""); + switch($type) + { + case "text": + case "image": + case "audio": + case "video": + case "application": + case "message": + break; + case "automatic": + switch($sub_type) + { + case "name": + switch(GetType($dot=strrpos($name,"."))=="integer" ? strtolower(substr($name,$dot)) : "") + { + case ".xls": + $content_type="application/excel"; + break; + case ".hqx": + $content_type="application/macbinhex40"; + break; + case ".doc": + case ".dot": + case ".wrd": + $content_type="application/msword"; + break; + case ".pdf": + $content_type="application/pdf"; + break; + case ".pgp": + $content_type="application/pgp"; + break; + case ".ps": + case ".eps": + case ".ai": + $content_type="application/postscript"; + break; + case ".ppt": + $content_type="application/powerpoint"; + break; + case ".rtf": + $content_type="application/rtf"; + break; + case ".tgz": + case ".gtar": + $content_type="application/x-gtar"; + break; + case ".gz": + $content_type="application/x-gzip"; + break; + case ".php": + case ".php3": + $content_type="application/x-httpd-php"; + break; + case ".js": + $content_type="application/x-javascript"; + break; + case ".ppd": + case ".psd": + $content_type="application/x-photoshop"; + break; + case ".swf": + case ".swc": + case ".rf": + $content_type="application/x-shockwave-flash"; + break; + case ".tar": + $content_type="application/x-tar"; + break; + case ".zip": + $content_type="application/zip"; + break; + case ".mid": + case ".midi": + case ".kar": + $content_type="audio/midi"; + break; + case ".mp2": + case ".mp3": + case ".mpga": + $content_type="audio/mpeg"; + break; + case ".ra": + $content_type="audio/x-realaudio"; + break; + case ".wav": + $content_type="audio/wav"; + break; + case ".bmp": + $content_type="image/bitmap"; + break; + case ".gif": + $content_type="image/gif"; + break; + case ".iff": + $content_type="image/iff"; + break; + case ".jb2": + $content_type="image/jb2"; + break; + case ".jpg": + case ".jpe": + case ".jpeg": + $content_type="image/jpeg"; + break; + case ".jpx": + $content_type="image/jpx"; + break; + case ".png": + $content_type="image/png"; + break; + case ".tif": + case ".tiff": + $content_type="image/tiff"; + break; + case ".wbmp": + $content_type="image/vnd.wap.wbmp"; + break; + case ".xbm": + $content_type="image/xbm"; + break; + case ".css": + $content_type="text/css"; + break; + case ".txt": + $content_type="text/plain"; + break; + case ".htm": + case ".html": + $content_type="text/html"; + break; + case ".xml": + $content_type="text/xml"; + break; + case ".mpg": + case ".mpe": + case ".mpeg": + $content_type="video/mpeg"; + break; + case ".qt": + case ".mov": + $content_type="video/quicktime"; + break; + case ".avi": + $content_type="video/x-ms-video"; + break; + case ".eml": + $content_type="message/rfc822"; + break; + default: + $content_type="application/octet-stream"; + break; + } + break; + default: + return($content_type." is not a supported automatic content type detection method"); + } + break; + default: + return($content_type." is not a supported file content type"); + } + } + else + $content_type="application/octet-stream"; + $definition=array( + "Content-Type"=>$content_type, + "NAME"=>$name + ); + if(IsSet($file["FileName"])) + { + if(GetType($length=@filesize($file["FileName"]))!="integer") + { + $error="it was not possible to determine the length of the file ".$file["FileName"]; + if(IsSet($php_errormsg) + && strlen($php_errormsg)) + $error.=": ".$php_errormsg; + if(!file_exists($file["FileName"])) + $error="it was not possible to access the file ".$file["FileName"]; + return($error); + } + $definition["FILENAME"]=$file["FileName"]; + $definition["Content-Length"]=$length; + } + elseif(IsSet($file["Data"])) + $definition["Content-Length"]=strlen($definition["DATA"]=$file["Data"]); + else + return("it was not specified a valid file name"); + return(""); + } + + Function ConnectFromProxy($arguments, &$headers) + { + if(!$this->PutLine('CONNECT '.$this->host_name.':'.($this->host_port ? $this->host_port : 443).' HTTP/1.0') + || (strlen($this->user_agent) + && !$this->PutLine('User-Agent: '.$this->user_agent)) + || (IsSet($arguments['Headers']['Proxy-Authorization']) + && !$this->PutLine('Proxy-Authorization: '.$arguments['Headers']['Proxy-Authorization'])) + || !$this->PutLine('')) + { + $this->Disconnect(); + return($this->error); + } + $this->state = "ConnectSent"; + if(strlen($error=$this->ReadReplyHeadersResponse($headers))) + return($error); + $proxy_authorization=""; + while(!strcmp($this->response_status, "100")) + { + $this->state="ConnectSent"; + if(strlen($error=$this->ReadReplyHeadersResponse($headers))) + return($error); + } + switch($this->response_status) + { + case "200": + if(!@stream_socket_enable_crypto($this->connection, 1, STREAM_CRYPTO_METHOD_SSLv23_CLIENT)) + { + $this->SetPHPError('it was not possible to start a SSL encrypted connection via this proxy', $php_errormsg); + $this->Disconnect(); + return($this->error); + } + $this->state = "Connected"; + break; + case "407": + if(strlen($error=$this->Authenticate($headers, -1, $proxy_authorization, $this->proxy_request_user, $this->proxy_request_password, $this->proxy_request_realm, $this->proxy_request_workstation))) + return($error); + break; + default: + return($this->SetError("unable to send request via proxy")); + } + return(""); + } + + Function SendRequest($arguments) + { + if(strlen($this->error)) + return($this->error); + if(IsSet($arguments["ProxyUser"])) + $this->proxy_request_user=$arguments["ProxyUser"]; + elseif(IsSet($this->proxy_user)) + $this->proxy_request_user=$this->proxy_user; + if(IsSet($arguments["ProxyPassword"])) + $this->proxy_request_password=$arguments["ProxyPassword"]; + elseif(IsSet($this->proxy_password)) + $this->proxy_request_password=$this->proxy_password; + if(IsSet($arguments["ProxyRealm"])) + $this->proxy_request_realm=$arguments["ProxyRealm"]; + elseif(IsSet($this->proxy_realm)) + $this->proxy_request_realm=$this->proxy_realm; + if(IsSet($arguments["ProxyWorkstation"])) + $this->proxy_request_workstation=$arguments["ProxyWorkstation"]; + elseif(IsSet($this->proxy_workstation)) + $this->proxy_request_workstation=$this->proxy_workstation; + switch($this->state) + { + case "Disconnected": + return($this->SetError("1 connection was not yet established")); + case "Connected": + $connect = 0; + break; + case "ConnectedToProxy": + if(strlen($error = $this->ConnectFromProxy($arguments, $headers))) + return($error); + $connect = 1; + break; + default: + return($this->SetError("2 can not send request in the current connection state")); + } + if(IsSet($arguments["RequestMethod"])) + $this->request_method=$arguments["RequestMethod"]; + if(IsSet($arguments["User-Agent"])) + $this->user_agent=$arguments["User-Agent"]; + if(!IsSet($arguments["Headers"]["User-Agent"]) + && strlen($this->user_agent)) + $arguments["Headers"]["User-Agent"]=$this->user_agent; + if(strlen($this->request_method)==0) + return($this->SetError("3 it was not specified a valid request method")); + if(IsSet($arguments["RequestURI"])) + $this->request_uri=$arguments["RequestURI"]; + if(strlen($this->request_uri)==0 + || substr($this->request_uri,0,1)!="/") + return($this->SetError("4 it was not specified a valid request URI")); + $this->request_arguments=$arguments; + $this->request_headers=(IsSet($arguments["Headers"]) ? $arguments["Headers"] : array()); + $body_length=0; + $this->request_body=""; + $get_body=1; + if($this->request_method=="POST" + || $this->request_method=="PUT") + { + if(IsSet($arguments['StreamRequest'])) + { + $get_body = 0; + $this->request_headers["Transfer-Encoding"]="chunked"; + } + elseif(IsSet($arguments["PostFiles"]) + || ($this->force_multipart_form_post + && IsSet($arguments["PostValues"]))) + { + $boundary="--".md5(uniqid(time())); + $this->request_headers["Content-Type"]="multipart/form-data; boundary=".$boundary.(IsSet($arguments["CharSet"]) ? "; charset=".$arguments["CharSet"] : ""); + $post_parts=array(); + if(IsSet($arguments["PostValues"])) + { + $values=$arguments["PostValues"]; + if(GetType($values)!="array") + return($this->SetError("5 it was not specified a valid POST method values array")); + for(Reset($values),$value=0;$value$headers,"DATA"=>$data); + $body_length+=strlen($headers)+strlen($data)+strlen("\r\n"); + } + } + $body_length+=strlen("--".$boundary."--\r\n"); + $files=(IsSet($arguments["PostFiles"]) ? $arguments["PostFiles"] : array()); + Reset($files); + $end=(GetType($input=Key($files))!="string"); + for(;!$end;) + { + if(strlen($error=$this->GetFileDefinition($files[$input],$definition))) + return("3 ".$error); + $headers="--".$boundary."\r\nContent-Disposition: form-data; name=\"".$input."\"; filename=\"".$definition["NAME"]."\"\r\nContent-Type: ".$definition["Content-Type"]."\r\n\r\n"; + $part=count($post_parts); + $post_parts[$part]=array("HEADERS"=>$headers); + if(IsSet($definition["FILENAME"])) + { + $post_parts[$part]["FILENAME"]=$definition["FILENAME"]; + $data=""; + } + else + $data=$definition["DATA"]; + $post_parts[$part]["DATA"]=$data; + $body_length+=strlen($headers)+$definition["Content-Length"]+strlen("\r\n"); + Next($files); + $end=(GetType($input=Key($files))!="string"); + } + $get_body=0; + } + elseif(IsSet($arguments["PostValues"])) + { + $values=$arguments["PostValues"]; + if(GetType($values)!="array") + return($this->SetError("5 it was not specified a valid POST method values array")); + for(Reset($values),$value=0;$value0) + $this->request_body.="&"; + $this->request_body.=UrlEncode($k)."=".UrlEncode($values[$k][$v]); + } + } + else + { + if($value>0) + $this->request_body.="&"; + $this->request_body.=UrlEncode($k)."=".UrlEncode($values[$k]); + } + } + $this->request_headers["Content-Type"]="application/x-www-form-urlencoded".(IsSet($arguments["CharSet"]) ? "; charset=".$arguments["CharSet"] : ""); + $get_body=0; + } + } + if($get_body + && (IsSet($arguments["Body"]) + || IsSet($arguments["BodyStream"]))) + { + if(IsSet($arguments["Body"])) + $this->request_body=$arguments["Body"]; + else + { + $stream=$arguments["BodyStream"]; + $this->request_body=""; + for($part=0; $partrequest_body.=$stream[$part]["Data"]; + elseif(IsSet($stream[$part]["File"])) + { + if(!($file=@fopen($stream[$part]["File"],"rb"))) + return($this->SetPHPError("could not open upload file ".$stream[$part]["File"], $php_errormsg)); + while(!feof($file)) + { + if(GetType($block=@fread($file,$this->file_buffer_length))!="string") + { + $error=$this->SetPHPError("could not read body stream file ".$stream[$part]["File"], $php_errormsg); + fclose($file); + return($error); + } + $this->request_body.=$block; + } + fclose($file); + } + else + return("5 it was not specified a valid file or data body stream element at position ".$part); + } + } + if(!IsSet($this->request_headers["Content-Type"])) + $this->request_headers["Content-Type"]="application/octet-stream".(IsSet($arguments["CharSet"]) ? "; charset=".$arguments["CharSet"] : ""); + } + if(IsSet($arguments["AuthUser"])) + $this->request_user=$arguments["AuthUser"]; + elseif(IsSet($this->user)) + $this->request_user=$this->user; + if(IsSet($arguments["AuthPassword"])) + $this->request_password=$arguments["AuthPassword"]; + elseif(IsSet($this->password)) + $this->request_password=$this->password; + if(IsSet($arguments["AuthRealm"])) + $this->request_realm=$arguments["AuthRealm"]; + elseif(IsSet($this->realm)) + $this->request_realm=$this->realm; + if(IsSet($arguments["AuthWorkstation"])) + $this->request_workstation=$arguments["AuthWorkstation"]; + elseif(IsSet($this->workstation)) + $this->request_workstation=$this->workstation; + if(strlen($this->proxy_host_name)==0 + || $connect) + $request_uri=$this->request_uri; + else + { + switch(strtolower($this->protocol)) + { + case "http": + $default_port=80; + break; + case "https": + $default_port=443; + break; + } + $request_uri=strtolower($this->protocol)."://".$this->host_name.(($this->host_port==0 || $this->host_port==$default_port) ? "" : ":".$this->host_port).$this->request_uri; + } + if($this->use_curl) + { + $version=(GetType($v=curl_version())=="array" ? (IsSet($v["version"]) ? $v["version"] : "0.0.0") : (ereg("^libcurl/([0-9]+\\.[0-9]+\\.[0-9]+)",$v,$m) ? $m[1] : "0.0.0")); + $curl_version=100000*intval($this->Tokenize($version,"."))+1000*intval($this->Tokenize("."))+intval($this->Tokenize("")); + $protocol_version=($curl_version<713002 ? "1.0" : $this->protocol_version); + } + else + $protocol_version=$this->protocol_version; + $this->request=$this->request_method." ".$request_uri." HTTP/".$protocol_version; + if($body_length + || ($body_length=strlen($this->request_body))) + $this->request_headers["Content-Length"]=$body_length; + for($headers=array(),$host_set=0,Reset($this->request_headers),$header=0;$headerrequest_headers);Next($this->request_headers),$header++) + { + $header_name=Key($this->request_headers); + $header_value=$this->request_headers[$header_name]; + if(GetType($header_value)=="array") + { + for(Reset($header_value),$value=0;$valuerequest_headers))=="host") + { + $this->request_host=strtolower($header_value); + $host_set=1; + } + } + if(!$host_set) + { + $headers[]="Host: ".$this->host_name; + $this->request_host=strtolower($this->host_name); + } + if(count($this->cookies)) + { + $cookies=array(); + $this->PickCookies($cookies,0); + if(strtolower($this->protocol)=="https") + $this->PickCookies($cookies,1); + if(count($cookies)) + { + $h=count($headers); + $headers[$h]="Cookie:"; + for(Reset($cookies),$cookie=0;$cookieuse_curl) + { + if(IsSet($arguments['StreamRequest'])) + return($this->SetError("Streaming request data is not supported when using Curl")); + if($body_length + && strlen($this->request_body)==0) + { + for($request_body="",$success=1,$part=0;$partSetPHPError("could not open upload file ".$post_parts[$part]["FILENAME"], $php_errormsg); + $success=0; + break; + } + while(!feof($file)) + { + if(GetType($block=@fread($file,$this->file_buffer_length))!="string") + { + $this->SetPHPError("could not read upload file", $php_errormsg); + $success=0; + break; + } + $request_body.=$block; + } + fclose($file); + if(!$success) + break; + } + $request_body.="\r\n"; + } + $request_body.="--".$boundary."--\r\n"; + } + else + $request_body=$this->request_body; + curl_setopt($this->connection,CURLOPT_HEADER,1); + curl_setopt($this->connection,CURLOPT_RETURNTRANSFER,1); + if($this->timeout) + curl_setopt($this->connection,CURLOPT_TIMEOUT,$this->timeout); + curl_setopt($this->connection,CURLOPT_SSL_VERIFYPEER,0); + curl_setopt($this->connection,CURLOPT_SSL_VERIFYHOST,0); + $request=$this->request."\r\n".implode("\r\n",$headers)."\r\n\r\n".$request_body; + curl_setopt($this->connection,CURLOPT_CUSTOMREQUEST,$request); + if($this->debug) + $this->OutputDebug("C ".$request); + if(!($success=(strlen($this->response=curl_exec($this->connection))!=0))) + { + $error=curl_error($this->connection); + $this->SetError("Could not execute the request".(strlen($error) ? ": ".$error : "")); + } + } + else + { + if(($success=$this->PutLine($this->request))) + { + for($header=0;$headerPutLine($headers[$header])) + break; + } + if($success + && ($success=$this->PutLine(""))) + { + if(IsSet($arguments['StreamRequest'])) + $next_state = "SendingRequestBody"; + elseif($body_length) + { + if(strlen($this->request_body)) + $success=$this->PutData($this->request_body); + else + { + for($part=0;$partPutData($post_parts[$part]["HEADERS"])) + || !($success=$this->PutData($post_parts[$part]["DATA"]))) + break; + if(IsSet($post_parts[$part]["FILENAME"])) + { + if(!($file=@fopen($post_parts[$part]["FILENAME"],"rb"))) + { + $this->SetPHPError("could not open upload file ".$post_parts[$part]["FILENAME"], $php_errormsg); + $success=0; + break; + } + while(!feof($file)) + { + if(GetType($block=@fread($file,$this->file_buffer_length))!="string") + { + $this->SetPHPError("could not read upload file", $php_errormsg); + $success=0; + break; + } + if(!($success=$this->PutData($block))) + break; + } + fclose($file); + if(!$success) + break; + } + if(!($success=$this->PutLine(""))) + break; + } + if($success) + $success=$this->PutLine("--".$boundary."--"); + } + if($success) + $sucess=$this->FlushData(); + } + } + } + } + if(!$success) + return($this->SetError("5 could not send the HTTP request: ".$this->error)); + $this->state=$next_state; + return(""); + } + + Function SetCookie($name, $value, $expires="" , $path="/" , $domain="" , $secure=0, $verbatim=0) + { + if(strlen($this->error)) + return($this->error); + if(strlen($name)==0) + return($this->SetError("it was not specified a valid cookie name")); + if(strlen($path)==0 + || strcmp($path[0],"/")) + return($this->SetError($path." is not a valid path for setting cookie ".$name)); + if($domain=="" + || !strpos($domain,".",$domain[0]=="." ? 1 : 0)) + return($this->SetError($domain." is not a valid domain for setting cookie ".$name)); + $domain=strtolower($domain); + if(!strcmp($domain[0],".")) + $domain=substr($domain,1); + if(!$verbatim) + { + $name=$this->CookieEncode($name,1); + $value=$this->CookieEncode($value,0); + } + $secure=intval($secure); + $this->cookies[$secure][$domain][$path][$name]=array( + "name"=>$name, + "value"=>$value, + "domain"=>$domain, + "path"=>$path, + "expires"=>$expires, + "secure"=>$secure + ); + return(""); + } + + Function SendRequestBody($data, $end_of_data) + { + if(strlen($this->error)) + return($this->error); + switch($this->state) + { + case "Disconnected": + return($this->SetError("1 connection was not yet established")); + case "Connected": + case "ConnectedToProxy": + return($this->SetError("2 request was not sent")); + case "SendingRequestBody": + break; + case "RequestSent": + return($this->SetError("3 request body was already sent")); + default: + return($this->SetError("4 can not send the request body in the current connection state")); + } + $length = strlen($data); + if($length) + { + $size = dechex($length)."\r\n"; + if(!$this->PutData($size) + || !$this->PutData($data)) + return($this->error); + } + if($end_of_data) + { + $size = "0\r\n"; + if(!$this->PutData($size)) + return($this->error); + $this->state = "RequestSent"; + } + return(""); + } + + Function ReadReplyHeadersResponse(&$headers) + { + $headers=array(); + if(strlen($this->error)) + return($this->error); + switch($this->state) + { + case "Disconnected": + return($this->SetError("1 connection was not yet established")); + case "Connected": + return($this->SetError("2 request was not sent")); + case "ConnectedToProxy": + return($this->SetError("2 connection from the remote server from the proxy was not yet established")); + case "SendingRequestBody": + return($this->SetError("4 request body data was not completely sent")); + case "ConnectSent": + $connect = 1; + break; + case "RequestSent": + $connect = 0; + break; + default: + return($this->SetError("3 can not get request headers in the current connection state")); + } + $this->content_length=$this->read_length=$this->read_response=$this->remaining_chunk=0; + $this->content_length_set=$this->chunked=$this->last_chunk_read=$chunked=0; + $this->connection_close=0; + for($this->response_status="";;) + { + $line=$this->GetLine(); + if(GetType($line)!="string") + return($this->SetError("4 could not read request reply: ".$this->error)); + if(strlen($this->response_status)==0) + { +// if(!eregi($match="^http/[0-9]+\\.[0-9]+[ \t]+([0-9]+)[ \t]*(.*)\$",$line,$matches)) + if(!preg_match("~^http/[0-9]+\\.[0-9]+[ \t]+([0-9]+)[ \t]*(.*)\$~i",$line,$matches)) + return($this->SetError("3 it was received an unexpected HTTP response status")); + $this->response_status=$matches[1]; + $this->response_message=$matches[2]; + } + if($line=="") + { + if(strlen($this->response_status)==0) + return($this->SetError("3 it was not received HTTP response status")); + $this->state=($connect ? "GotConnectHeaders" : "GotReplyHeaders"); + break; + } + $header_name=strtolower($this->Tokenize($line,":")); + $header_value=Trim(Chop($this->Tokenize("\r\n"))); + if(IsSet($headers[$header_name])) + { + if(GetType($headers[$header_name])=="string") + $headers[$header_name]=array($headers[$header_name]); + $headers[$header_name][]=$header_value; + } + else + $headers[$header_name]=$header_value; + if(!$connect) + { + switch($header_name) + { + case "content-length": + $this->content_length=intval($headers[$header_name]); + $this->content_length_set=1; + break; + case "transfer-encoding": + $encoding=$this->Tokenize($header_value,"; \t"); + if(!$this->use_curl + && !strcmp($encoding,"chunked")) + $chunked=1; + break; + case "set-cookie": + if($this->support_cookies) + { + if(GetType($headers[$header_name])=="array") + $cookie_headers=$headers[$header_name]; + else + $cookie_headers=array($headers[$header_name]); + for($cookie=0;$cookieTokenize($cookie_headers[$cookie],"=")); + $cookie_value=$this->Tokenize(";"); + $domain=$this->request_host; + $path="/"; + $expires=""; + $secure=0; + while(($name=trim(UrlDecode($this->Tokenize("="))))!="") + { + $value=UrlDecode($this->Tokenize(";")); + switch($name) + { + case "domain": + $domain=$value; + break; + case "path": + $path=$value; + break; + case "expires": + if(ereg("^((Mon|Monday|Tue|Tuesday|Wed|Wednesday|Thu|Thursday|Fri|Friday|Sat|Saturday|Sun|Sunday), )?([0-9]{2})\\-(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\\-([0-9]{2,4}) ([0-9]{2})\\:([0-9]{2})\\:([0-9]{2}) GMT\$",$value,$matches)) + { + $year=intval($matches[5]); + if($year<1900) + $year+=($year<70 ? 2000 : 1900); + $expires="$year-".$this->months[$matches[4]]."-".$matches[3]." ".$matches[6].":".$matches[7].":".$matches[8]; + } + break; + case "secure": + $secure=1; + break; + } + } + if(strlen($this->SetCookie($cookie_name, $cookie_value, $expires, $path , $domain, $secure, 1))) + $this->error=""; + } + } + break; + case "connection": + $this->connection_close=!strcmp(strtolower($header_value),"close"); + break; + } + } + } + $this->chunked=$chunked; + if($this->content_length_set) + $this->connection_close=0; + return(""); + } + + Function Redirect(&$headers) + { + if($this->follow_redirect) + { + if(!IsSet($headers["location"]) + || (GetType($headers["location"])!="array" + && strlen($location=$headers["location"])==0) + || (GetType($headers["location"])=="array" + && strlen($location=$headers["location"][0])==0)) + return($this->SetError("3 it was received a redirect without location URL")); + if(strcmp($location[0],"/")) + { + $location_arguments=parse_url($location); + if(!IsSet($location_arguments["scheme"])) + $location=((GetType($end=strrpos($this->request_uri,"/"))=="integer" && $end>1) ? substr($this->request_uri,0,$end) : "")."/".$location; + } + if(!strcmp($location[0],"/")) + $location=$this->protocol."://".$this->host_name.($this->host_port ? ":".$this->host_port : "").$location; + $error=$this->GetRequestArguments($location,$arguments); + if(strlen($error)) + return($this->SetError("could not process redirect url: ".$error)); + $arguments["RequestMethod"]="GET"; + if(strlen($error=$this->Close())==0 + && strlen($error=$this->Open($arguments))==0 + && strlen($error=$this->SendRequest($arguments))==0) + { + $this->redirection_level++; + if($this->redirection_level>$this->redirection_limit) + $error="it was exceeded the limit of request redirections"; + else + $error=$this->ReadReplyHeaders($headers); + $this->redirection_level--; + } + if(strlen($error)) + return($this->SetError($error)); + } + return(""); + } + + Function Authenticate(&$headers, $proxy, &$proxy_authorization, &$user, &$password, &$realm, &$workstation) + { + if($proxy) + { + $authenticate_header="proxy-authenticate"; + $authorization_header="Proxy-Authorization"; + $authenticate_status="407"; + $authentication_mechanism=$this->proxy_authentication_mechanism; + } + else + { + $authenticate_header="www-authenticate"; + $authorization_header="Authorization"; + $authenticate_status="401"; + $authentication_mechanism=$this->authentication_mechanism; + } + if(IsSet($headers[$authenticate_header])) + { + if(function_exists("class_exists") + && !class_exists("sasl_client_class")) + return($this->SetError("the SASL client class needs to be loaded to be able to authenticate".($proxy ? " with the proxy server" : "")." and access this site")); + if(GetType($headers[$authenticate_header])=="array") + $authenticate=$headers[$authenticate_header]; + else + $authenticate=array($headers[$authenticate_header]); + for($response="", $mechanisms=array(),$m=0;$mTokenize($authenticate[$m]," "); + $response=$this->Tokenize(""); + if(strlen($authentication_mechanism)) + { + if(!strcmp($authentication_mechanism,$mechanism)) + { + $mechanisms[]=$mechanism; + break; + } + } + else + $mechanisms[]=$mechanism; + } + $sasl=new sasl_client_class; + if(IsSet($user)) + $sasl->SetCredential("user",$user); + if(IsSet($password)) + $sasl->SetCredential("password",$password); + if(IsSet($realm)) + $sasl->SetCredential("realm",$realm); + if(IsSet($workstation)) + $sasl->SetCredential("workstation",$workstation); + $sasl->SetCredential("uri",$this->request_uri); + $sasl->SetCredential("method",$this->request_method); + $sasl->SetCredential("session",$this->session); + do + { + $status=$sasl->Start($mechanisms,$message,$interactions); + } + while($status==SASL_INTERACT); + switch($status) + { + case SASL_CONTINUE: + break; + case SASL_NOMECH: + return($this->SetError(($proxy ? "proxy " : "")."authentication error: ".(strlen($authentication_mechanism) ? "authentication mechanism ".$authentication_mechanism." may not be used: " : "").$sasl->error)); + default: + return($this->SetError("Could not start the SASL ".($proxy ? "proxy " : "")."authentication client: ".$sasl->error)); + } + if($proxy >= 0) + { + for(;;) + { + if(strlen($error=$this->ReadReplyBody($body,$this->file_buffer_length))) + return($error); + if(strlen($body)==0) + break; + } + } + $authorization_value=$sasl->mechanism.(IsSet($message) ? " ".($sasl->encode_response ? base64_encode($message) : $message) : ""); + $request_arguments=$this->request_arguments; + $arguments=$request_arguments; + $arguments["Headers"][$authorization_header]=$authorization_value; + if(!$proxy + && strlen($proxy_authorization)) + $arguments["Headers"]["Proxy-Authorization"]=$proxy_authorization; + if(strlen($error=$this->Close()) + || strlen($error=$this->Open($arguments))) + return($this->SetError($error)); + $authenticated=0; + if(IsSet($message)) + { + if($proxy < 0) + { + if(strlen($error=$this->ConnectFromProxy($arguments, $headers))) + return($this->SetError($error)); + } + else + { + if(strlen($error=$this->SendRequest($arguments)) + || strlen($error=$this->ReadReplyHeadersResponse($headers))) + return($this->SetError($error)); + } + if(!IsSet($headers[$authenticate_header])) + $authenticate=array(); + elseif(GetType($headers[$authenticate_header])=="array") + $authenticate=$headers[$authenticate_header]; + else + $authenticate=array($headers[$authenticate_header]); + for($mechanism=0;$mechanismTokenize($authenticate[$mechanism]," "),$sasl->mechanism)) + { + $response=$this->Tokenize(""); + break; + } + } + switch($this->response_status) + { + case $authenticate_status: + break; + case "301": + case "302": + case "303": + case "307": + if($proxy >= 0) + return($this->Redirect($headers)); + default: + if(intval($this->response_status/100)==2) + { + if($proxy) + $proxy_authorization=$authorization_value; + $authenticated=1; + break; + } + if($proxy + && !strcmp($this->response_status,"401")) + { + $proxy_authorization=$authorization_value; + $authenticated=1; + break; + } + return($this->SetError(($proxy ? "proxy " : "")."authentication error: ".$this->response_status." ".$this->response_message)); + } + } + for(;!$authenticated;) + { + do + { + $status=$sasl->Step($response,$message,$interactions); + } + while($status==SASL_INTERACT); + switch($status) + { + case SASL_CONTINUE: + $authorization_value=$sasl->mechanism.(IsSet($message) ? " ".($sasl->encode_response ? base64_encode($message) : $message) : ""); + $arguments=$request_arguments; + $arguments["Headers"][$authorization_header]=$authorization_value; + if(!$proxy + && strlen($proxy_authorization)) + $arguments["Headers"]["Proxy-Authorization"]=$proxy_authorization; + if($proxy < 0) + { + if(strlen($error=$this->ConnectFromProxy($arguments, $headers))) + return($this->SetError($error)); + } + else + { + if(strlen($error=$this->SendRequest($arguments)) + || strlen($error=$this->ReadReplyHeadersResponse($headers))) + return($this->SetError($error)); + } + switch($this->response_status) + { + case $authenticate_status: + if(GetType($headers[$authenticate_header])=="array") + $authenticate=$headers[$authenticate_header]; + else + $authenticate=array($headers[$authenticate_header]); + for($response="",$mechanism=0;$mechanismTokenize($authenticate[$mechanism]," "),$sasl->mechanism)) + { + $response=$this->Tokenize(""); + break; + } + } + if($proxy >= 0) + { + for(;;) + { + if(strlen($error=$this->ReadReplyBody($body,$this->file_buffer_length))) + return($error); + if(strlen($body)==0) + break; + } + } + $this->state="Connected"; + break; + case "301": + case "302": + case "303": + case "307": + if($proxy >= 0) + return($this->Redirect($headers)); + default: + if(intval($this->response_status/100)==2) + { + if($proxy) + $proxy_authorization=$authorization_value; + $authenticated=1; + break; + } + if($proxy + && !strcmp($this->response_status,"401")) + { + $proxy_authorization=$authorization_value; + $authenticated=1; + break; + } + return($this->SetError(($proxy ? "proxy " : "")."authentication error: ".$this->response_status." ".$this->response_message)); + } + break; + default: + return($this->SetError("Could not process the SASL ".($proxy ? "proxy " : "")."authentication step: ".$sasl->error)); + } + } + } + return(""); + } + + Function ReadReplyHeaders(&$headers) + { + if(strlen($error=$this->ReadReplyHeadersResponse($headers))) + return($error); + $proxy_authorization=""; + while(!strcmp($this->response_status, "100")) + { + $this->state="RequestSent"; + if(strlen($error=$this->ReadReplyHeadersResponse($headers))) + return($error); + } + switch($this->response_status) + { + case "301": + case "302": + case "303": + case "307": + if(strlen($error=$this->Redirect($headers))) + return($error); + break; + case "407": + if(strlen($error=$this->Authenticate($headers, 1, $proxy_authorization, $this->proxy_request_user, $this->proxy_request_password, $this->proxy_request_realm, $this->proxy_request_workstation))) + return($error); + if(strcmp($this->response_status,"401")) + return(""); + case "401": + return($this->Authenticate($headers, 0, $proxy_authorization, $this->request_user, $this->request_password, $this->request_realm, $this->request_workstation)); + } + return(""); + } + + Function ReadReplyBody(&$body,$length) + { + $body=""; + if(strlen($this->error)) + return($this->error); + switch($this->state) + { + case "Disconnected": + return($this->SetError("1 connection was not yet established")); + case "Connected": + case "ConnectedToProxy": + return($this->SetError("2 request was not sent")); + case "RequestSent": + if(($error=$this->ReadReplyHeaders($headers))!="") + return($error); + break; + case "GotReplyHeaders": + break; + default: + return($this->SetError("3 can not get request headers in the current connection state")); + } + if($this->content_length_set) + $length=min($this->content_length-$this->read_length,$length); + if($length>0 + && !$this->EndOfInput() + && ($body=$this->ReadBytes($length))=="") + { + if(strlen($this->error)) + return($this->SetError("4 could not get the request reply body: ".$this->error)); + } + $this->read_length+=strlen($body); + return(""); + } + + Function SaveCookies(&$cookies, $domain='', $secure_only=0, $persistent_only=0) + { + $now=gmdate("Y-m-d H-i-s"); + $cookies=array(); + for($secure_cookies=0,Reset($this->cookies);$secure_cookiescookies);Next($this->cookies),$secure_cookies++) + { + $secure=Key($this->cookies); + if(!$secure_only + || $secure) + { + for($cookie_domain=0,Reset($this->cookies[$secure]);$cookie_domaincookies[$secure]);Next($this->cookies[$secure]),$cookie_domain++) + { + $domain_pattern=Key($this->cookies[$secure]); + $match=strlen($domain)-strlen($domain_pattern); + if(strlen($domain)==0 + || ($match>=0 + && !strcmp($domain_pattern,substr($domain,$match)) + && ($match==0 + || $domain_pattern[0]=="." + || $domain[$match-1]=="."))) + { + for(Reset($this->cookies[$secure][$domain_pattern]),$path_part=0;$path_partcookies[$secure][$domain_pattern]);Next($this->cookies[$secure][$domain_pattern]),$path_part++) + { + $path=Key($this->cookies[$secure][$domain_pattern]); + for(Reset($this->cookies[$secure][$domain_pattern][$path]),$cookie=0;$cookiecookies[$secure][$domain_pattern][$path]);Next($this->cookies[$secure][$domain_pattern][$path]),$cookie++) + { + $cookie_name=Key($this->cookies[$secure][$domain_pattern][$path]); + $expires=$this->cookies[$secure][$domain_pattern][$path][$cookie_name]["expires"]; + if((!$persistent_only + && strlen($expires)==0) + || (strlen($expires) + && strcmp($now,$expires)<0)) + $cookies[$secure][$domain_pattern][$path][$cookie_name]=$this->cookies[$secure][$domain_pattern][$path][$cookie_name]; + } + } + } + } + } + } + } + + Function SavePersistentCookies(&$cookies, $domain='', $secure_only=0) + { + $this->SaveCookies($cookies, $domain, $secure_only, 1); + } + + Function GetPersistentCookies(&$cookies, $domain='', $secure_only=0) + { + $this->SavePersistentCookies($cookies, $domain, $secure_only); + } + + Function RestoreCookies($cookies, $clear=1) + { + $new_cookies=($clear ? array() : $this->cookies); + for($secure_cookies=0, Reset($cookies); $secure_cookiesSetError("invalid cookie secure value type (".serialize($secure).")")); + for($cookie_domain=0,Reset($cookies[$secure]);$cookie_domainSetError("invalid cookie domain value type (".serialize($domain_pattern).")")); + for(Reset($cookies[$secure][$domain_pattern]),$path_part=0;$path_partSetError("invalid cookie path value type (".serialize($path).")")); + for(Reset($cookies[$secure][$domain_pattern][$path]),$cookie=0;$cookieSetError("invalid cookie expiry value type (".serialize($expires).")")); + $new_cookies[$secure][$domain_pattern][$path][$cookie_name]=array( + "name"=>$cookie_name, + "value"=>$value, + "domain"=>$domain_pattern, + "path"=>$path, + "expires"=>$expires, + "secure"=>$secure + ); + } + } + } + } + $this->cookies=$new_cookies; + return(""); + } +}; + +?> diff --git a/includes/phpsvnclient/phpsvnclient.php b/includes/phpsvnclient/phpsvnclient.php new file mode 100644 index 0000000000..3322596ab7 --- /dev/null +++ b/includes/phpsvnclient/phpsvnclient.php @@ -0,0 +1,709 @@ + + * @license BSD License + */ +class phpsvnclient { + /** + * SVN Repository URL + * + * @var string + * @access private + */ + private $_url; + /** + * Cache, for don't request the same thing in a + * short period of time. + * + * @var string + * @access private + */ + private $_cache; + /** + * HTTP Client object + * + * @var object + * @access private + */ + private $_http; + /** + * Respository Version. + * + * @access private + * @var interger + */ + private $_repVersion; + /** + * Password + * + * @access private + * @var string + */ + private $pass; + /** + * Password + * + * @access private + * @var string + */ + private $user; + /** + * Last error number + * + * Possible values are NOT_ERROR, NOT_FOUND, AUTH_REQUIRED, UNKOWN_ERROR + * + * @access public + * @var integer + */ + public $errNro; + + private $storeDirectoryFiles = array(); + private $lastDirectoryFiles; + + public function phpsvnclient($url = 'http://fusionpbx.googlecode.com/svn/', $user = false, $pass = false) { + $this->__construct($url, $user, $pass); + register_shutdown_function(array(&$this, '__destruct')); + } + + public function __construct($url = 'http://fusionpbx.googlecode.com/svn/trunk/fusionpbx/', $user = false, $pass = false) { + $http = & $this->_http; + $http = new http_class; + $http->user_agent = "FusionPBXphpsvnclient (http://fusionpbx.com/)"; + + $this->_url = $url; + $this->user = $user; + $this->pass = $pass; + } + +/** + * Public Functions + */ + + /** + * checkOut + */ + public function checkOut($folder = '/', $outPath = '.') { + while($outPath[strlen($outPath) - 1] == '/' && strlen($outPath) > 1) + $outPath = substr($outPath, 0, -1); + $tree = $this->getDirectoryTree($folder); + if(!file_exists($outPath)){ + mkdir($outPath, 0777, TRUE); + } + foreach($tree as $file) { + $path = $file['path']; + $tmp = strstr(trim($path, '/'), trim($folder, '/')); + $createPath = $outPath . '/' . ($tmp ? substr($tmp, strlen(trim($folder, '/'))) : ""); + if(trim($path, '/') == trim($folder, '/')) + continue; + if($file['type'] == 'directory' && !is_dir($createPath)){ + mkdir($createPath); + }elseif($file['type'] == 'file') { + $contents = $this->getFile($path); + $hOut = fopen($createPath, 'w'); + fwrite($hOut, $contents); + fclose($hOut); + } + } + } + + /** + * rawDirectoryDump + * + * This method dumps SVN data for $folder + * in the version $version of the repository. + * + * @param string $folder Folder to get data + * @param integer $version Repository version, -1 means actual + * @return array SVN data dump. + */ + public function rawDirectoryDump($folder='/',$version=-1) { + $actVersion = $this->getVersion(); + if ( $version == -1 || $version > $actVersion) { + $version = $actVersion; + } + $url = $this->cleanURL($this->_url . "/!svn/bc/" . $version . "/" . $folder . "/"); + $this->initQuery($args, "PROPFIND", $url); + $args['Body'] = PHPSVN_NORMAL_REQUEST; + $args['Headers']['Content-Length'] = strlen(PHPSVN_NORMAL_REQUEST); + + if ( ! $this->Request($args, $headers, $body) ) { + return false; + } + $xml2Array = new xml2Array(); + return $xml2Array->xmlParse($body); + } + +// +// use this to get node of tree by path with '/' terminator +// +function get_value_by_path($__xml_tree, $__tag_path) +{ + $tmp_arr =& $__xml_tree; + print_r($tmp_arr); + $tag_path = explode('/', $__tag_path); + foreach($tag_path as $tag_name) + { + $res = false; + foreach($tmp_arr as $key => $node) + { + if(is_int($key) && $node['name'] == $tag_name) + { + $tmp_arr = $node; + $res = true; + break; + } + } + if(!$res) + return false; + } + return $tmp_arr; +} + + +function my_xml2array($__url) +{ + $xml_values = array(); + $contents = $__url;//file_get_contents($__url); + $parser = xml_parser_create(''); + if(!$parser) + return false; + + xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING, 'UTF-8'); + xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0); + xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1); + xml_parse_into_struct($parser, trim($contents), $xml_values); + xml_parser_free($parser); + if (!$xml_values) + return array(); + + $xml_array = array(); + $last_tag_ar =& $xml_array; + $parents = array(); + $last_counter_in_tag = array(1=>0); + foreach ($xml_values as $data) + { + switch($data['type']) + { + case 'open': + $last_counter_in_tag[$data['level']+1] = 0; + $new_tag = array('name' => $data['tag']); + if(isset($data['attributes'])) + $new_tag['attributes'] = $data['attributes']; + if(isset($data['value']) && trim($data['value'])) + $new_tag['value'] = trim($data['value']); + $last_tag_ar[$last_counter_in_tag[$data['level']]] = $new_tag; + $parents[$data['level']] =& $last_tag_ar; + $last_tag_ar =& $last_tag_ar[$last_counter_in_tag[$data['level']]++]; + break; + case 'complete': + $new_tag = array('name' => $data['tag']); + if(isset($data['attributes'])) + $new_tag['attributes'] = $data['attributes']; + if(isset($data['value']) && trim($data['value'])) + $new_tag['value'] = trim($data['value']); + + $last_count = count($last_tag_ar)-1; + $last_tag_ar[$last_counter_in_tag[$data['level']]++] = $new_tag; + break; + case 'close': + $last_tag_ar =& $parents[$data['level']]; + break; + default: + break; + }; + } + return $xml_array; +} + + /** + * getDirectoryFiles + * + * This method returns all the files in $folder + * in the version $version of the repository. + * + * @param string $folder Folder to get files + * @param integer $version Repository version, -1 means actual + * @return array List of files. */ + public function getDirectoryFiles($folder='/', $version=-1) { + if ($arrOutput = $this->rawDirectoryDump($folder, $version)) { +// echo '
      ';
      +//			print_r($arrOutput);
      +//			echo '
      '; + $files = array(); + foreach($arrOutput['children'] as $key=>$value) { + //echo $key . ' => ' . $value . '
      '; + array_walk_recursive($value, array($this, 'storeDirectoryFiles')); + array_push($files, $this->storeDirectoryFiles); + unset($this->storeDirectoryFiles); + } + return $files; + } + return false; + } + + /** + * getDirectoryTree + * + * This method returns the complete tree of files and directories + * in $folder from the version $version of the repository. Can also be used + * to get the info for a single file or directory + * + * @param string $folder Folder to get tree + * @param integer $version Repository version, -1 means actual + * @param boolean $recursive Whether to get the tree recursively, or just + * the specified directory/file. + * + * @return array List of files and directories. + */ + public function getDirectoryTree($folder='/',$version=-1, $recursive=true) { + $directoryTree = array(); + + if (!($arrOutput = $this->getDirectoryFiles($folder, $version))) + return false; + + if (!$recursive) + return $arrOutput[0]; + + while(count($arrOutput) && is_array($arrOutput)) { + $array = array_shift($arrOutput); + + array_push($directoryTree, $array); + + if(trim($array['path'], '/') == trim($folder, '/')) + continue; + + if ($array['type'] == 'directory') { + $walk = $this->getDirectoryFiles($array['path'], $version); + array_shift($walk); + //$walk = array_reverse($walk); + + foreach($walk as $step) { + array_unshift($arrOutput, $step); + } + } + } + return $directoryTree; + } + + /** + * Returns file contents + * + * @param string $file File pathname + * @param integer $version File Version + * @return string File content and information, false on error, or if a + * directory is requested + */ + public function getFile($file,$version=-1) { + $actVersion = $this->getVersion(); + if ( $version == -1 || $version > $actVersion) { + $version = $actVersion; + } + + // check if this is a directory... if so, return false, otherwise we + // get the HTML output of the directory listing from the SVN server. + // This is maybe a bit heavy since it makes another connection to the + // SVN server. Maybe add this as an option/parameter? ES 23/06/08 + $fileInfo = $this->getDirectoryTree($file, $version, false); + if ($fileInfo["type"] == "directory") + return false; + + $url = $this->cleanURL($this->_url."/!svn/bc/".$version."/".$file."/"); + $this->initQuery($args,"GET",$url); + if ( ! $this->Request($args, $headers, $body) ) + return false; + + return $body; + } + + /** + * Get changes logs of a file. + * + * Get repository change logs between version + * $vini and $vend. + * + * @param integer $vini Initial Version + * @param integer $vend End Version + * @return Array Respository Logs + */ + public function getRepositoryLogs($vini=0,$vend=-1) { + return $this->getFileLogs("/",$vini,$vend); + } + + /** + * Get changes logs of a file. + * + * Get repository change of a file between version + * $vini and $vend. + * + * @param + * @param integer $vini Initial Version + * @param integer $vend End Version + * @return Array Respository Logs + */ + public function getFileLogs($file, $vini=0,$vend=-1) { + $fileLogs = array(); + + $actVersion = $this->getVersion(); + if ( $vend == -1 || $vend > $actVersion) + $vend = $actVersion; + + if ( $vini < 0) $vini=0; + if ( $vini > $vend) $vini = $vend; + + $url = $this->cleanURL($this->_url."/!svn/bc/".$actVersion."/".$file."/"); + $this->initQuery($args,"REPORT",$url); + $args['Body'] = sprintf(PHPSVN_LOGS_REQUEST,$vini,$vend); + $args['Headers']['Content-Length'] = strlen($args['Body']); + $args['Headers']['Depth']=1; + + if ( ! $this->Request($args, $headers, $body) ) + return false; + + $xml2Array = new xml2Array(); + $arrOutput = $xml2Array->xmlParse($body); +// array_shift($arrOutput['children']); + + foreach($arrOutput['children'] as $value) { + $array=array(); + foreach($value['children'] as $entry) { + if ($entry['name'] == 'D:VERSION-NAME') $array['version'] = $entry['tagData']; + if ($array['version'] == $vini) continue 2; + if ($entry['name'] == 'D:CREATOR-DISPLAYNAME') $array['author'] = $entry['tagData']; + if ($entry['name'] == 'S:DATE') $array['date'] = $entry['tagData']; + if ($entry['name'] == 'D:COMMENT') $array['comment'] = $entry['tagData']; + + if (($entry['name'] == 'S:ADDED-PATH') || + ($entry['name'] == 'S:MODIFIED-PATH') || + ($entry['name'] == 'S:DELETED-PATH')) { + // For backward compatability + $array['files'][] = $entry['tagData']; + + if ($entry['name'] == 'S:ADDED-PATH') $array['add_files'][] = $entry['tagData']; + if ($entry['name'] == 'S:MODIFIED-PATH') $array['mod_files'][] = $entry['tagData']; + if ($entry['name'] == 'S:DELETED-PATH') $array['del_files'][] = $entry['tagData']; + } + } + array_push($fileLogs,$array); + } + + return $fileLogs; + } + + + /** + * Get the repository version + * + * @return integer Repository version + * @access public + */ + public function getVersion() { + if ( $this->_repVersion > 0) return $this->_repVersion; + + $this->_repVersion = -1; $this->initQuery($args,"PROPFIND",$this->cleanURL($this->_url."/!svn/vcc/default") ); + $args['Body'] = PHPSVN_VERSION_REQUEST; + $args['Headers']['Content-Length'] = strlen(PHPSVN_NORMAL_REQUEST); + $args['Headers']['Depth']=0; + + if ( !$this->Request($args, $tmp, $body) ) { + return $this->_repVersion; + } + + $parser=new xml_parser_class; + $parser->Parse( $body,true); + $enable=false; + foreach($parser->structure as $value) { + if ( $enable ) { + $t = explode("/",$value); + + // start from the end and move backwards until we find a non-blank entry + $index = count($t) - 1; + while ($t[$index] == ""){ + $index--; + } + + // check the last non-empty element to see if it's numeric. If so, it's the revision number + if (is_numeric($t[$index])) { + $this->_repVersion = $t[$index]; + break; + } + else { + // If there was no number, this was the wrong D:href, so disable 'til we find the next one. + $enable = false; + continue; + } + } + if ( is_array($value) && $value['Tag'] == 'D:href') $enable = true; + } + return $this->_repVersion; + } + +/** + * Deprecated functions for backward comatability + */ + + /** + * Set URL + * + * Set the project repository URL. + * + * @param string $url URL of the project. + * @access public + */ + public function setRepository($url) { + $this->_url = $url; + } + /** + * Old method; there's a typo in the name. This is now a wrapper for setRepository + */ + public function setRespository($url) { + return $this->setRepository($url); + } + /** + * Add Authentication settings + * + * @param string $user Username + * @param string $pass Password + */ + public function setAuth($user,$pass) { + $this->user = $user; + $this->pass = $pass; + } + +/** + * Private Functions + */ + /** + * Callback for array_walk_recursive in public function getDirectoryFiles + * + * @access private + */ + private function storeDirectoryFiles($item, $key) { + if ($key == 'name') { + switch ($item) { + case 'D:HREF': + case 'LP1:GETLASTMODIFIED': + case 'LP2:BASELINE-RELATIVE-PATH': + case 'LP3:BASELINE-RELATIVE-PATH': + case 'LP3:MD5-CHECKSUM': + case 'LP1:VERSION-NAME': + case 'LP1:GETCONTENTLENGTH': + case 'D:STATUS': + $this->lastDirectoryFiles = $item; + break; + default: + break; + } + } elseif (($key == 'tagData') && ($this->lastDirectoryFiles != '')) { + + // Unsure if the 1st of two D:HREF's always returns the result we want, but for now... + if (($this->lastDirectoryFiles == 'D:HREF') && (isset($this->storeDirectoryFiles['type']))) return; + + // Dump into the array + $ldf = $this->lastDirectoryFiles; + switch ($ldf) { + case 'D:HREF': + $var = 'type'; + break; + case 'LP1:GETLASTMODIFIED': + $var = 'last_mod'; +// $var = "$ldf"; + break; + case 'LP2:BASELINE-RELATIVE-PATH': + case 'LP3:BASELINE-RELATIVE-PATH': + $var = 'path'; +// $var = "$ldf"; + break; + case 'LP3:MD5-CHECKSUM': + $var = 'md5'; +// $var = "$ldf"; + break; +/* case 'LP1:VERSION-NAME': + $var = 'version'; + break; + case 'LP1:GETCONTENTLENGTH': + $var = 'size'; + break; +*/ case 'D:STATUS': +// return; + $var = 'status'; +// $var = "$ldf"; + break; + default: + //$var = "$ldf"; + break; + + } + $this->storeDirectoryFiles[$var] = $item; + $this->lastDirectoryFiles = ''; + // Detect 'type' as either a 'directory' or 'file' + if ( (isset($this->storeDirectoryFiles['type'])) && + //(isset($this->storeDirectoryFiles['last-mod'])) && + (isset($this->storeDirectoryFiles['path'])) + && (isset($this->storeDirectoryFiles['status'])) + ) { + $this->storeDirectoryFiles['path'] = str_replace(' ', '%20', $this->storeDirectoryFiles['path']); //Hack to make filenames with spaces work. + $len = strlen($this->storeDirectoryFiles['path']); + if ( substr($this->storeDirectoryFiles['type'],strlen($this->storeDirectoryFiles['type']) - $len) == $this->storeDirectoryFiles['path'] ) { + $this->storeDirectoryFiles['type'] = 'file'; + } else { + $this->storeDirectoryFiles['type'] = 'directory'; + } + } + + } else { + $this->lastDirectoryFiles = ''; + } + } + + /** + * Prepare HTTP CLIENT object + * + * @param array &$arguments Byreferences variable. + * @param string $method Method for the request (GET,POST,PROPFIND, REPORT,ETC). + * @param string $url URL for the action. + * @access private + */ + private function initQuery(&$arguments,$method, $url) { + $http = & $this->_http; + $http->GetRequestArguments($url,$arguments); + if ( isset($this->user) && isset($this->pass)) { + $arguments["Headers"]["Authorization"] = " Basic ".base64_encode($this->user.":".$this->pass); + } + $arguments["RequestMethod"]=$method; + $arguments["Headers"]["Content-Type"] = "text/xml"; + $arguments["Headers"]["Depth"] = 1; + } + + /** + * Open a connection, send request, read header + * and body. + * + * @param Array $args Connetion's argument + * @param Array &$headers Array with the header response. + * @param string &$body Body response. + * @return boolean True is query success + * @access private + */ + private function Request($args, &$headers, &$body) { + $args['RequestURI'] = str_replace(' ', '%20', $args['RequestURI']); //Hack to make filenames with spaces work. + $http = & $this->_http; + $http->Open($args); + $http->SendRequest($args); + $http->ReadReplyHeaders($headers); +// echo "
      \n";
      +//		print_r($http);
      +//		echo "
      \n";
      +		if ($http->response_status[0] != 2) {
      +			switch( $http->response_status ) {
      +				case 404:
      +					$this->errNro=NOT_FOUND;
      +					break;
      +				case 401:
      +					$this->errNro=AUTH_REQUIRED;
      +					break;
      +				default:
      +					$this->errNro=UNKNOWN_ERROR;
      +			}
      +			$http->close();
      +			return false;
      +		}
      +		$this->errNro = NO_ERROR;
      +		$body='';
      +		$tbody='';
      +		for(;;) {
      +			$error=$http->ReadReplyBody($tbody,1000);
      +			if($error!="" || strlen($tbody)==0) break;
      +			$body.=($tbody);
      +		}
      +		$http->close();
      +		return true;
      +	}
      +
      +	/**
      +	 *  Clean URL
      +	 *
      +	 *  Delete "//" on URL requests.
      +	 *
      +	 *  @param string $url URL
      +	 *  @return string New cleaned URL.
      +	 *  @access private
      +	 */
      +	private function cleanURL($url) {
      +		return preg_replace("/((^:)\/\/)/", "//", $url);
      +	}
      +}
      +?>
      +
      diff --git a/includes/phpsvnclient/xml2Array.php b/includes/phpsvnclient/xml2Array.php
      new file mode 100644
      index 0000000000..1c21d957b2
      --- /dev/null
      +++ b/includes/phpsvnclient/xml2Array.php
      @@ -0,0 +1,56 @@
      +
      +Usage
      + Grab some XML data, either from a file, URL, etc. however you want.
      + Assume storage in $strYourXML;
      +
      + $arrOutput = new xml2Array($strYourXML);
      + print_r($arrOutput); //print it out, or do whatever!
      +*/
      +class xml2Array {
      +   
      +	private $arrOutput = array();
      +	private $resParser;
      +	private $strXmlData;
      +
      +	public function xmlParse($strInputXML) {
      +		$this->resParser = xml_parser_create ();
      +		xml_set_object($this->resParser,$this);
      +		xml_set_element_handler($this->resParser, "tag_open", "tagClosed");
      +		xml_set_character_data_handler($this->resParser, "tagData");
      +       
      +		$this->strXmlData = xml_parse($this->resParser,$strInputXML );
      +		if(!$this->strXmlData) {
      +			die(sprintf("XML error: %s at line %d",
      +				xml_error_string(xml_get_error_code($this->resParser)),
      +				xml_get_current_line_number($this->resParser)));
      +		}
      +
      +		xml_parser_free($this->resParser);
      +		// Changed by Deadpan110
      +		//return $this->arrOutput;
      +		return $this->arrOutput[0];
      +	}
      +
      +	private function tag_open($parser, $name, $attrs) {
      +		$tag=array("name"=>$name,"attrs"=>$attrs);
      +		array_push($this->arrOutput,$tag);
      +	}
      +
      +	private function tagData($parser, $tagData) {
      +		if(trim($tagData)) {
      +			if(isset($this->arrOutput[count($this->arrOutput)-1]['tagData'])) {
      +				$this->arrOutput[count($this->arrOutput)-1]['tagData'] .= $tagData;
      +			} else {
      +				$this->arrOutput[count($this->arrOutput)-1]['tagData'] = $tagData;
      +			}
      +		}
      +	}
      +
      +	private function tagClosed($parser, $name) {
      +		$this->arrOutput[count($this->arrOutput)-2]['children'][] = $this->arrOutput[count($this->arrOutput)-1];
      +		array_pop($this->arrOutput);
      +	}
      +}
      +?>
      \ No newline at end of file
      diff --git a/includes/phpsvnclient/xml_parser.php b/includes/phpsvnclient/xml_parser.php
      new file mode 100644
      index 0000000000..15e02e0f6a
      --- /dev/null
      +++ b/includes/phpsvnclient/xml_parser.php
      @@ -0,0 +1,427 @@
      +error,""))
      +		$xml_parser_handlers[$parser]->StartElement($xml_parser_handlers[$parser],$name,$attrs);
      +}
      +
      +Function xml_parser_end_element_handler($parser,$name)
      +{
      +  global $xml_parser_handlers;
      +
      +	if(!strcmp($xml_parser_handlers[$parser]->error,""))
      +		$xml_parser_handlers[$parser]->EndElement($xml_parser_handlers[$parser],$name);
      +}
      +
      +Function xml_parser_character_data_handler($parser,$data)
      +{
      +  global $xml_parser_handlers;
      +
      +	if(!strcmp($xml_parser_handlers[$parser]->error,""))
      +		$xml_parser_handlers[$parser]->CharacterData($xml_parser_handlers[$parser],$data);
      +}
      +
      +class xml_parser_handler_class
      +{
      +	var $xml_parser;
      +	var $error_number=0;
      +	var $error="";
      +	var $error_code=0;
      +	var $error_line,$error_column,$error_byte_index;
      +	var $structure=array();
      +	var $positions=array();
      +	var $path="";
      +	var $store_positions=0;
      +	var $simplified_xml=0;
      +	var $fail_on_non_simplified_xml=0;
      +
      +	Function SetError(&$object,$error_number,$error)
      +	{
      +		$object->error_number=$error_number;
      +		$object->error=$error;
      +		$object->error_line=xml_get_current_line_number($object->xml_parser);
      +		$object->error_column=xml_get_current_column_number($object->xml_parser);
      +		$object->error_byte_index=xml_get_current_byte_index($object->xml_parser);
      +	}
      +
      +	Function SetElementData(&$object,$path,&$data)
      +	{
      +		$object->structure[$path]=$data;
      +		if($object->store_positions)
      +		{
      +			$object->positions[$path]=array(
      +				"Line"=>xml_get_current_line_number($object->xml_parser),
      +				"Column"=>xml_get_current_column_number($object->xml_parser),
      +				"Byte"=>xml_get_current_byte_index($object->xml_parser)
      +			);
      +		}
      +	}
      +
      +	Function StartElement(&$object,$name,&$attrs)
      +	{
      +		if(strcmp($this->path,""))
      +		{
      +			$element=$object->structure[$this->path]["Elements"];
      +			$object->structure[$this->path]["Elements"]++;
      +			$this->path.=",$element";
      +		}
      +		else
      +		{
      +			$element=0;
      +			$this->path="0";
      +		}
      +		$data=array(
      +			"Tag"=>$name,
      +			"Elements"=>0
      +		);
      +		if($object->simplified_xml)
      +		{
      +			if($object->fail_on_non_simplified_xml
      +			&& count($attrs)>0)
      +			{
      +				$this->SetError($object,2,"Simplified XML can not have attributes in tags");
      +				return;
      +			}
      +		}
      +		else
      +			$data["Attributes"]=$attrs;
      +		$this->SetElementData($object,$this->path,$data);
      +	}
      +
      +	Function EndElement(&$object,$name)
      +	{
      +		$this->path=(($position=strrpos($this->path,",")) ? substr($this->path,0,$position) : "");
      +	}
      +
      +	Function CharacterData(&$object,$data)
      +	{
      +		$element=$object->structure[$this->path]["Elements"];
      +		$previous=$this->path.",".strval($element-1);
      +		if($element>0
      +		&& GetType($object->structure[$previous])=="string")
      +			$object->structure[$previous].=$data;
      +		else
      +		{
      +			$this->SetElementData($object,$this->path.",$element",$data);
      +			$object->structure[$this->path]["Elements"]++;
      +		}
      +	}
      +};
      +
      +class xml_parser_class
      +{
      +	var $xml_parser=0;
      +	var $parser_handler;
      +	var $error="";
      +	var $error_number=0;
      +	var $error_line=0;
      +	var $error_column=0;
      +	var $error_byte_index=0;
      +	var $error_code=0;
      +	var $stream_buffer_size=4096;
      +	var $structure=array();
      +	var $positions=array();
      +	var $store_positions=0;
      +	var $case_folding=0;
      +	var $target_encoding="ISO-8859-1";
      +	var $simplified_xml=0;
      +	var $fail_on_non_simplified_xml=0;
      +
      +	Function xml_parser_start_element_handler($parser,$name,$attrs)
      +	{
      +		if(!strcmp($this->error,""))
      +			$this->parser_handler->StartElement($this,$name,$attrs);
      +	}
      +
      +	Function xml_parser_end_element_handler($parser,$name)
      +	{
      +		if(!strcmp($this->error,""))
      +			$this->parser_handler->EndElement($this,$name);
      +	}
      +
      +	Function xml_parser_character_data_handler($parser,$data)
      +	{
      +		if(!strcmp($this->error,""))
      +			$this->parser_handler->CharacterData($this,$data);
      +	}
      +
      +	Function SetErrorPosition($error_number,$error,$line,$column,$byte_index)
      +	{
      +		$this->error_number=$error_number;
      +		$this->error=$error;
      +		$this->error_line=$line;
      +		$this->error_column=$column;
      +		$this->error_byte_index=$byte_index;
      +	}
      +
      +	Function SetError($error_number,$error)
      +	{
      +		$this->error_number=$error_number;
      +		$this->error=$error;
      +		if($this->xml_parser)
      +		{
      +			$line=xml_get_current_line_number($this->xml_parser);
      +			$column=xml_get_current_column_number($this->xml_parser);
      +			$byte_index=xml_get_current_byte_index($this->xml_parser);
      +		}
      +		else
      +		{
      +			$line=$column=1;
      +			$byte_index=0;
      +		}
      +		$this->SetErrorPosition($error_number,$error,$line,$column,$byte_index);
      +	}
      +
      +	Function Parse($data,$end_of_data)
      +	{
      +		global $xml_parser_handlers;
      +
      +		if(strcmp($this->error,""))
      +			return($this->error);
      +		if(!$this->xml_parser)
      +		{
      +			if(!function_exists("xml_parser_create"))
      +			{
      +				$this->SetError(1,"XML support is not available in this PHP configuration");
      +				return($this->error);
      +			}
      +			if(!($this->xml_parser=xml_parser_create()))
      +			{
      +				$this->SetError(1,"Could not create the XML parser");
      +				return($this->error);
      +			}
      +			xml_parser_set_option($this->xml_parser,XML_OPTION_CASE_FOLDING,$this->case_folding);
      +			xml_parser_set_option($this->xml_parser,XML_OPTION_TARGET_ENCODING,$this->target_encoding);
      +			if(function_exists("xml_set_object"))
      +			{
      +				xml_set_object($this->xml_parser,$this);
      +				$this->parser_handler=new xml_parser_handler_class;
      +				$this->structure=array();
      +				$this->positions=array();
      +			}
      +			else
      +			{
      +				$xml_parser_handlers[$this->xml_parser]=new xml_parser_handler_class;
      +				$xml_parser_handlers[$this->xml_parser]->xml_parser=$this->xml_parser;
      +				$xml_parser_handlers[$this->xml_parser]->store_positions=$this->store_positions;
      +				$xml_parser_handlers[$this->xml_parser]->simplified_xml=$this->simplified_xml;
      +				$xml_parser_handlers[$this->xml_parser]->fail_on_non_simplified_xml=$this->fail_on_non_simplified_xml;
      +			}
      +			xml_set_element_handler($this->xml_parser,"xml_parser_start_element_handler","xml_parser_end_element_handler");
      +			xml_set_character_data_handler($this->xml_parser,"xml_parser_character_data_handler");
      +		}
      +		$parser_ok=xml_parse($this->xml_parser,$data,$end_of_data);
      +		if(!function_exists("xml_set_object"))
      +			$this->error=$xml_parser_handlers[$this->xml_parser]->error;
      +		if(!strcmp($this->error,""))
      +		{
      +			if($parser_ok)
      +			{
      +				if($end_of_data)
      +				{
      +					if(function_exists("xml_set_object"))
      +						Unset($this->parser_handler);
      +					else
      +					{
      +						$this->structure=$xml_parser_handlers[$this->xml_parser]->structure;
      +						$this->positions=$xml_parser_handlers[$this->xml_parser]->positions;
      +						Unset($xml_parser_handlers[$this->xml_parser]);
      +					}
      +					xml_parser_free($this->xml_parser);
      +					$this->xml_parser=0;
      +				}
      +			}
      +			else
      +				$this->SetError(2,"Could not parse data: ".xml_error_string($this->error_code=xml_get_error_code($this->xml_parser)));
      +		}
      +		else
      +		{
      +			if(!function_exists("xml_set_object"))
      +			{
      +				$this->error_number=$xml_parser_handlers[$this->xml_parser]->error_number;
      +				$this->error_code=$xml_parser_handlers[$this->xml_parser]->error_code;
      +				$this->error_line=$xml_parser_handlers[$this->xml_parser]->error_line;
      +				$this->error_column=$xml_parser_handlers[$this->xml_parser]->error_column;
      +				$this->error_byte_index=$xml_parser_handlers[$this->xml_parser]->error_byte_index;
      +			}			
      +		}
      +		return($this->error);
      +	}
      +
      +	Function VerifyWhiteSpace($path)
      +	{
      +		if($this->store_positions)
      +		{
      +			$line=$parser->positions[$path]["Line"];
      +			$column=$parser->positions[$path]["Column"];
      +			$byte_index=$parser->positions[$path]["Byte"];
      +		}
      +		else
      +		{
      +			$line=$column=1;
      +			$byte_index=0;
      +		}
      +		if(!IsSet($this->structure[$path]))
      +		{
      +			$this->SetErrorPosition(2,"element path does not exist",$line,$column,$byte_index);
      +			return($this->error);
      +		}
      +		if(GetType($this->structure[$path])!="string")
      +		{
      +			$this->SetErrorPosition(2,"element is not data",$line,$column,$byte_index);
      +			return($this->error);
      +		}
      +		$data=$this->structure[$path];
      +		for($previous_return=0,$position=0;$positionSetErrorPosition(2,"data is not white space",$line,$column,$byte_index);
      +					return($this->error);
      +			}
      +		}
      +		return("");
      +	}
      +
      +	Function ParseStream($stream)
      +	{
      +		if(strcmp($this->error,""))
      +			return($this->error);
      +		do
      +		{
      +			if(!($data=@fread($stream,$this->stream_buffer_size)))
      +			{
      +				if(!feof($stream))
      +				{
      +					$this->SetError(3,"Could not read from input stream".(IsSet($php_errormsg) ? ': '.$php_errormsg : ''));
      +					break;
      +				}
      +			}
      +			if(strcmp($error=$this->Parse($data,feof($stream)),""))
      +				break;
      +		}
      +		while(!feof($stream));
      +		return($this->error);
      +	}
      +
      +	Function ParseFile($file)
      +	{
      +		if(!file_exists($file))
      +			return("the XML file to parse ($file) does not exist");
      +		if(!($definition=@fopen($file,"r")))
      +			return("could not open the XML file ($file)".(IsSet($php_errormsg) ? ': '.$php_errormsg : ''));
      +		$error=$this->ParseStream($definition);
      +		fclose($definition);
      +		return($error);
      +	}
      +};
      +
      +Function XMLParseFile(&$parser,$file,$store_positions,$cache="",$case_folding=0,$target_encoding="ISO-8859-1",$simplified_xml=0,$fail_on_non_simplified_xml=0)
      +{
      +	if(!file_exists($file))
      +		return("the XML file to parse ($file) does not exist");
      +	if(strcmp($cache,""))
      +	{
      +		if(file_exists($cache)
      +		&& filemtime($file)<=filemtime($cache))
      +		{
      +			if(($cache_file=@fopen($cache,"r")))
      +			{
      +				if(function_exists("set_file_buffer"))
      +					set_file_buffer($cache_file,0);
      +				if(!($cache_contents=@fread($cache_file,filesize($cache))))
      +					$error="could not read from the XML cache file $cache".(IsSet($php_errormsg) ? ': '.$php_errormsg : '');
      +				else
      +					$error="";
      +				fclose($cache_file);
      +				if(!strcmp($error,""))
      +				{
      +					if(GetType($parser=unserialize($cache_contents))=="object"
      +					&& IsSet($parser->structure))
      +					{
      +						if(!IsSet($parser->simplified_xml))
      +							$parser->simplified_xml=0;
      +						if(($simplified_xml
      +						|| !$parser->simplified_xml)
      +						&& (!$store_positions
      +						|| $parser->store_positions))
      +						{
      +							return("");
      +						}
      +					}
      +					else
      +						$error="it was not specified a valid cache object in XML file ($cache)";
      +				}
      +			}
      +			else
      +				$error="could not open cache XML file ($cache)".(IsSet($php_errormsg) ? ': '.$php_errormsg : '');
      +			if(strcmp($error,""))
      +				return($error);
      +		}
      +	}
      +	$parser=new xml_parser_class;
      +	$parser->store_positions=$store_positions;
      +	$parser->case_folding=$case_folding;
      +	$parser->target_encoding=$target_encoding;
      +	$parser->simplified_xml=$simplified_xml;
      +	$parser->fail_on_non_simplified_xml=$fail_on_non_simplified_xml;
      +	if(!strcmp($error=$parser->ParseFile($file),"")
      +	&& strcmp($cache,""))
      +	{
      +		if(($cache_file=@fopen($cache,"w")))
      +		{
      +			if(function_exists("set_file_buffer"))
      +				set_file_buffer($cache_file,0);
      +			if(!@fwrite($cache_file,serialize($parser))
      +			|| !@fclose($cache_file))
      +				$error="could to write to the XML cache file ($cache)".(IsSet($php_errormsg) ? ': '.$php_errormsg : '');
      +			if(strcmp($error,""))
      +				unlink($cache);
      +		}
      +		else
      +			$error="could not open for writing to the cache file ($cache)".(IsSet($php_errormsg) ? ': '.$php_errormsg : '');
      +	}
      +	return($error);
      +}
      +
      +?>
      \ No newline at end of file
      diff --git a/includes/pop3/mime_parser.php b/includes/pop3/mime_parser.php
      new file mode 100644
      index 0000000000..455041581e
      --- /dev/null
      +++ b/includes/pop3/mime_parser.php
      @@ -0,0 +1,2439 @@
      +
      +
      +
      +	net.manuellemos.mimeparser
      +
      +	@(#) $Id: mime_parser.php,v 1.68 2010/04/08 22:58:13 mlemos Exp $
      +	Copyright © (C) Manuel Lemos 2006 - 2008
      +	MIME parser
      +	Manuel Lemos
      +	mlemos-at-acm.org
      +
      +	
      +		en
      +		Parse MIME encapsulated e-mail message data compliant with
      +			the RFC 2822 or aggregated in mbox format.
      +		Use the function Decode function
      +			to retrieve the structure of the messages to be parsed. Adjust its
      +			parameters to tell how to return the decoded body data.
      +			Use the SaveBody parameter to make the body parts be saved
      +			to files when the message is larger than the available memory. Use
      +			the SkipBody parameter to just retrieve the message
      +			structure without returning the body data.
      +			If the message data is an archive that may contain multiple messages
      +			aggregated in the mbox format, set the variable
      +			mbox to 1.
      +	
      +
      +{/metadocument}
      +*/
      +
      +class mime_parser_class
      +{
      +/*
      +{metadocument}
      +	
      +		error
      +		STRING
      +		
      +		
      +			Store the message that is returned when an error
      +				occurs.
      +			Check this variable to understand what happened when a call to
      +				any of the class functions has failed.
      +				This class uses cumulative error handling. This means that if one
      +				class functions that may fail is called and this variable was
      +				already set to an error message due to a failure in a previous call
      +				to the same or other function, the function will also fail and does
      +				not do anything.
      +				This allows programs using this class to safely call several
      +				functions that may fail and only check the failure condition after
      +				the last function call.
      +				Just set this variable to an empty string to clear the error
      +				condition.
      +		
      +	
      +{/metadocument}
      +*/
      +	var $error='';
      +
      +/*
      +{metadocument}
      +	
      +		error_position
      +		INTEGER
      +		-1
      +		
      +			Point to the position of the message data or file that
      +				refers to the last error that occurred.
      +			Check this variable to determine the relevant position of the
      +				message when a parsing error occurs.
      +		
      +	
      +{/metadocument}
      +*/
      +	var $error_position = -1;
      +
      +/*
      +{metadocument}
      +	
      +		mbox
      +		BOOLEAN
      +		0
      +		
      +			Specify whether the message data to parse is a single RFC
      +				2822 message or it is an archive that contain multiple messages in
      +				the mbox format.
      +			Set this variable to 1 if it is
      +				it is intended to parse an mbox message archive.
      + mbox archives may contain multiple messages. Each message starts + with the header From. Since all valid RFC 2822 headers + must with a colon, the class will fail to parse a mbox archive if + this variable is set to 0.
      +
      +
      +{/metadocument} +*/ + var $mbox = 0; + +/* +{metadocument} + + decode_headers + BOOLEAN + 1 + + Specify whether the message headers should be decoded. + Set this variable to 1 if it is + necessary to decode message headers that may have non-ASCII + characters and use other character set encodings. + + +{/metadocument} +*/ + var $decode_headers = 1; + +/* +{metadocument} + + decode_bodies + BOOLEAN + 1 + + Specify whether the message body parts should be decoded. + Set this variable to 1 if it is + necessary to parse the message bodies and extract its part + structure. + + +{/metadocument} +*/ + var $decode_bodies = 1; + +/* +{metadocument} + + extract_addresses + BOOLEAN + 1 + + Specify whether the message headers that usually contain + e-mail addresses should be parsed and the addresses should be + extracted by the Decode function. + Set this variable to 1 if it is + necessary to extract the e-mail addresses contained in certain + message headers. + The headers to be parsed are defined by the + address_headers variable. + The parsed addresses are returned by the + ExtractedAddresses entry of the + Decode + decoded + argument of the + Decode function. + + +{/metadocument} +*/ + var $extract_addresses = 1; + +/* +{metadocument} + + address_headers + HASH + + + Specify which headers contain addresses that should be + parsed and extracted. + Change this variable if you need to extract e-mail addresses + from a different list of message headers. + It must be set to an associative array with keys set to the names + of the headers to be parsed including the colon. The array values + must be set to a boolean flag to tell whether the headers with the + respective name should be parsed. The header names must be in lower + case. + By default the class addresses from the headers: + from:, to:, + cc:, bcc:, + return-path:, + reply-to: and + disposition-notification-to:. + + +{/metadocument} +*/ + var $address_headers = array( + 'from:' => 1, + 'to:' => 1, + 'cc:' => 1, + 'bcc:' => 1, + 'return-path:'=>1, + 'reply-to:'=>1, + 'disposition-notification-to:'=>1 + ); + +/* +{metadocument} + + message_buffer_length + INTEGER + 8000 + + Maximum length of the chunks of message data that the class + parse at one time. + Adjust this value according to the available memory. + + +{/metadocument} +*/ + var $message_buffer_length = 8000; + +/* +{metadocument} + + ignore_syntax_errors + BOOLEAN + 1 + + Specify whether the class should ignore syntax errors in + malformed messages. + Set this variable to 0 if it is + necessary to verify whether message data may be corrupted due to + to eventual bugs in the program that generated the + message. + Currently the class only ignores some types of syntax errors. + Other syntax errors may still cause the + Decode to fail. + + +{/metadocument} +*/ + var $ignore_syntax_errors=1; + +/* +{metadocument} + + warnings + HASH + + + Return a list of positions of the original message that + contain syntax errors. + Check this variable to retrieve eventual message syntax + errors that were ignored when the + ignore_syntax_errors is set to + 1. + The indexes of this array are the positions of the errors. The + array values are the corresponding syntax error messages. + + +{/metadocument} +*/ + var $warnings=array(); + +/* +{metadocument} + + track_lines + BOOLEAN + 0 + + Tell the class to keep track the position of each message + line. + Set this variable to 1 if you + need to determine the line and column number associated to a given + position of the parsed message. + + +{/metadocument} +*/ + var $track_lines = 0; + + /* Private variables */ + var $state = MIME_PARSER_START; + var $buffer = ''; + var $buffer_position = 0; + var $offset = 0; + var $parts = array(); + var $part_position = 0; + var $headers = array(); + var $body_parser; + var $body_parser_state = MIME_PARSER_BODY_DONE; + var $body_buffer = ''; + var $body_buffer_position = 0; + var $body_offset = 0; + var $current_header = ''; + var $file; + var $body_file; + var $position = 0; + var $body_part_number = 1; + var $next_token = ''; + var $lines = array(); + var $line_offset = 0; + var $last_line = 1; + var $last_carriage_return = 0; + + /* Private functions */ + + Function SetError($error) + { + $this->error = $error; + return(0); + } + + Function SetErrorWithContact($error) + { + return($this->SetError($error.'. Please contact the author Manuel Lemos and send a copy of this message to let him add support for this kind of messages')); + } + + Function SetPositionedError($error, $position) + { + $this->error_position = $position; + return($this->SetError($error)); + } + + Function SetPositionedWarning($error, $position) + { + if(!$this->ignore_syntax_errors) + return($this->SetPositionedError($error, $position)); + $this->warnings[$position]=$error; + return(1); + } + + Function SetPHPError($error, &$php_error_message) + { + if(IsSet($php_error_message) + && strlen($php_error_message)) + $error .= ': '.$php_error_message; + return($this->SetError($error)); + } + + Function ResetParserState() + { + $this->error=''; + $this->error_position = -1; + $this->state = MIME_PARSER_START; + $this->buffer = ''; + $this->buffer_position = 0; + $this->offset = 0; + $this->parts = array(); + $this->part_position = 0; + $this->headers = array(); + $this->body_parser_state = MIME_PARSER_BODY_DONE; + $this->body_buffer = ''; + $this->body_buffer_position = 0; + $this->body_offset = 0; + $this->current_header = ''; + $this->position = 0; + $this->body_part_number = 1; + $this->next_token = ''; + $this->lines = ($this->track_lines ? array(0 => 0) : array()); + $this->line_offset = 0; + $this->last_line = 0; + $this->last_carriage_return = 0; + } + + Function Tokenize($string,$separator="") + { + if(!strcmp($separator,"")) + { + $separator=$string; + $string=$this->next_token; + } + for($character=0;$characternext_token=substr($string,$found+1); + return(substr($string,0,$found)); + } + else + { + $this->next_token=''; + return($string); + } + } + + Function ParseStructuredHeader($value, &$type, &$parameters, &$character_sets, &$languages) + { + $type = strtolower(trim($this->Tokenize($value, ';'))); + $p = trim($this->Tokenize('')); + $parameters = $character_sets = $languages = array(); + while(strlen($p)) + { + $parameter = trim(strtolower($this->Tokenize($p, '='))); + $remaining = trim($this->Tokenize('')); + if(strlen($remaining) + && !strcmp($remaining[0], '"') + && (GetType($quote = strpos($remaining, '"', 1)) == 'integer')) + { + $value = substr($remaining, 1, $quote - 1); + $p = trim(substr($remaining, $quote + 1)); + if(strlen($p) > 0 + && !strcmp($p[0], ';')) + $p = substr($p, 1); + } + else + { + $value = trim($this->Tokenize($remaining, ';')); + $p = trim($this->Tokenize('')); + } + if(($l=strlen($parameter)) + && !strcmp($parameter[$l - 1],'*')) + { + $parameter=$this->Tokenize($parameter, '*'); + if(IsSet($parameters[$parameter]) + && IsSet($character_sets[$parameter])) + $value = $parameters[$parameter] . UrlDecode($value); + else + { + $character_sets[$parameter] = strtolower($this->Tokenize($value, '\'')); + $languages[$parameter] = $this->Tokenize('\''); + $value = UrlDecode($this->Tokenize('')); + } + } + $parameters[$parameter] = $value; + } + } + + Function FindStringLineBreak($string, $position, &$break, &$line_break) + { + if(GetType($line_break=strpos($string, $break="\n", $position))=='integer') + { + if(GetType($new_line_break=strpos($string, "\n", $position))=='integer') + { + if($new_line_break < $line_break) + { + $break = "\n"; + $line_break = $new_line_break; + return(1); + } + } + if($line_break>$position + && $string[$line_break-1]=="\r") + { + $line_break--; + $break="\r\n"; + } + return(1); + } + return(GetType($line_break=strpos($string, $break="\r", $position))=='integer'); + } + + Function FindLineBreak($position, &$break, &$line_break) + { + if(GetType($line_break=strpos($this->buffer, $break="\r", $position))=='integer') + { + if(GetType($new_line_break=strpos($this->buffer, "\n", $position))=='integer') + { + if($new_line_break < $line_break) + { + $break = "\n"; + $line_break = $new_line_break; + return(1); + } + } + if(($n = $line_break + 1) < strlen($this->buffer) + && $this->buffer[$n]=="\n") + $break="\r\n"; + return(1); + } + return(GetType($line_break=strpos($this->buffer, $break="\n", $position))=='integer'); + } + + Function FindBodyLineBreak($position, &$break, &$line_break) + { + if(GetType($line_break=strpos($this->body_buffer, $break="\r", $position))=='integer') + { + if(GetType($new_line_break=strpos($this->body_buffer, "\n", $position))=='integer') + { + if($new_line_break < $line_break) + { + $break = "\n"; + $line_break = $new_line_break; + return(1); + } + } + if(($n = $line_break + 1) < strlen($this->body_buffer) + && $this->body_buffer[$n]=="\n") + $break="\r\n"; + return(1); + } + return(GetType($line_break=strpos($this->body_buffer, $break="\n", $position))=='integer'); + } + + Function ParseHeaderString($body, &$position, &$headers) + { + $l = strlen($body); + $headers = array(); + for(;$position < $l;) + { + if($this->FindStringLineBreak($body, $position, $break, $line_break)) + { + $line = substr($body, $position, $line_break - $position); + $position = $line_break + strlen($break); + } + else + { + $line = substr($body, $position); + $position = $l; + } + if(strlen($line)==0) + break; + $h = strtolower(strtok($line,':')); + $headers[$h] = trim(strtok('')); + } + } + + Function ParsePart($end, &$part, &$need_more_data) + { + $need_more_data = 0; + switch($this->state) + { + case MIME_PARSER_START: + $part=array( + 'Type'=>'MessageStart', + 'Position'=>$this->offset + $this->buffer_position + ); + $this->state = MIME_PARSER_HEADER; + break; + case MIME_PARSER_HEADER: + if($this->FindLineBreak($this->buffer_position, $break, $line_break)) + { + $next = $line_break + strlen($break); + if(!strcmp($break,"\r") + && strlen($this->buffer) == $next + && !$end) + { + $need_more_data = 1; + break; + } + if($line_break==$this->buffer_position) + { + $part=array( + 'Type'=>'BodyStart', + 'Position'=>$this->offset + $this->buffer_position + ); + $this->buffer_position = $next; + $this->state = MIME_PARSER_BODY; + break; + } + } + if(GetType($colon=strpos($this->buffer, ':', $this->buffer_position))=='integer') + { + if(GetType($space=strpos(substr($this->buffer, $this->buffer_position, $colon - $this->buffer_position), ' '))=='integer') + { + if((!$this->mbox + || strcmp(substr($this->buffer, $this->buffer_position, $space), 'From')) + && !$this->SetPositionedWarning('invalid header name line', $this->buffer_position)) + return(0); + $next = $this->buffer_position + $space + 1; + } + else + $next = $colon+1; + } + else + { + $need_more_data = 1; + break; + } + $part=array( + 'Type'=>'HeaderName', + 'Name'=>substr($this->buffer, $this->buffer_position, $next - $this->buffer_position), + 'Position'=>$this->offset + $this->buffer_position + ); + $this->buffer_position = $next; + $this->state = MIME_PARSER_HEADER_VALUE; + break; + case MIME_PARSER_HEADER_VALUE: + $position = $this->buffer_position; + $value = ''; + for(;;) + { + if($this->FindLineBreak($position, $break, $line_break)) + { + $next = $line_break + strlen($break); + $line = substr($this->buffer, $position, $line_break - $position); + if(strlen($this->buffer) == $next) + { + if(!$end) + { + $need_more_data = 1; + break 2; + } + $value .= $line; + $part=array( + 'Type'=>'HeaderValue', + 'Value'=>$value, + 'Position'=>$this->offset + $this->buffer_position + ); + $this->buffer_position = $next; + $this->state = MIME_PARSER_END; + break ; + } + else + { + $character = $this->buffer[$next]; + if(!strcmp($character, ' ') + || !strcmp($character, "\t")) + { + $value .= $line; + $position = $next + 1; + } + else + { + $value .= $line; + $part=array( + 'Type'=>'HeaderValue', + 'Value'=>$value, + 'Position'=>$this->offset + $this->buffer_position + ); + $this->buffer_position = $next; + $this->state = MIME_PARSER_HEADER; + break 2; + } + } + } + else + { + if(!$end) + { + $need_more_data = 1; + break; + } + else + { + $value .= substr($this->buffer, $position); + $part=array( + 'Type'=>'HeaderValue', + 'Value'=>$value, + 'Position'=>$this->offset + $this->buffer_position + ); + $this->buffer_position = strlen($this->buffer); + $this->state = MIME_PARSER_END; + break; + } + } + } + break; + case MIME_PARSER_BODY: + if($this->mbox) + { + $add = 0; + $append=''; + if($this->FindLineBreak($this->buffer_position, $break, $line_break)) + { + $next = $line_break + strlen($break); + $following = $next + strlen($break); + if($following >= strlen($this->buffer) + || GetType($line=strpos($this->buffer, $break, $following))!='integer') + { + if(!$end) + { + $need_more_data = 1; + break; + } + } + $start = substr($this->buffer, $next, strlen($break.'From ')); + if(!strcmp($break.'From ', $start)) + { + if($line_break == $this->buffer_position) + { + $part=array( + 'Type'=>'MessageEnd', + 'Position'=>$this->offset + $this->buffer_position + ); + $this->buffer_position = $following; + $this->state = MIME_PARSER_START; + break; + } + else + $add = strlen($break); + $next = $line_break; + } + elseif(($indent = strspn($this->buffer, '>', $next)) > 0) + { + $start = substr($this->buffer, $next + $indent, strlen('From ')); + if(!strcmp('From ', $start)) + { + $part=array( + 'Type'=>'BodyData', + 'Data'=>substr($this->buffer, $this->buffer_position, $next - $this->buffer_position), + 'Position'=>$this->offset + $this->buffer_position + ); + $this->buffer_position = $next + 1; + break; + } + } + } + else + { + if(!$end) + { + $need_more_data = 1; + break; + } + $next = strlen($this->buffer); + $append="\r\n"; + } + if($next > $this->buffer_position) + { + $part=array( + 'Type'=>'BodyData', + 'Data'=>substr($this->buffer, $this->buffer_position, $next + $add - $this->buffer_position).$append, + 'Position'=>$this->offset + $this->buffer_position + ); + } + elseif($end) + { + $part=array( + 'Type'=>'MessageEnd', + 'Position'=>$this->offset + $this->buffer_position + ); + $this->state = MIME_PARSER_END; + } + $this->buffer_position = $next; + } + else + { + if(strlen($this->buffer)-$this->buffer_position) + { + $data=substr($this->buffer, $this->buffer_position, strlen($this->buffer) - $this->buffer_position); + $end_line = (!strcmp(substr($data,-1),"\n") || !strcmp(substr($data,-1),"\r")); + if($end + && !$end_line) + { + $data.="\n"; + $end_line = 1; + } + $offset = $this->offset + $this->buffer_position; + $this->buffer_position = strlen($this->buffer); + $need_more_data = !$end; + if(!$end_line) + { + if(GetType($line_break=strrpos($data, "\n"))=='integer' + || GetType($line_break=strrpos($data, "\r"))=='integer') + { + $line_break++; + $this->buffer_position -= strlen($data) - $line_break; + $data = substr($data, 0, $line_break); + } + } + $part=array( + 'Type'=>'BodyData', + 'Data'=>$data, + 'Position'=>$offset + ); + } + else + { + if($end) + { + $part=array( + 'Type'=>'MessageEnd', + 'Position'=>$this->offset + $this->buffer_position + ); + $this->state = MIME_PARSER_END; + } + else + $need_more_data = 1; + } + } + break; + default: + return($this->SetPositionedError($this->state.' is not a valid parser state', $this->buffer_position)); + } + return(1); + } + + Function QueueBodyParts() + { + for(;;) + { + if(!$this->body_parser->GetPart($part,$end)) + return($this->SetError($this->body_parser->error)); + if($end) + return(1); + if(!IsSet($part['Part'])) + $part['Part']=$this->headers['Boundary']; + $this->parts[]=$part; + } + } + + Function ParseParameters($value, &$first, &$parameters, $return) + { + $first = strtolower(trim(strtok($value, ';'))); + $values = trim(strtok('')); + $parameters = array(); + $return_value = ''; + while(strlen($values)) + { + $parameter = trim(strtolower(strtok($values, '='))); + $value = trim(strtok(';')); + $l = strlen($value); + if($l > 1 + && !strcmp($value[0], '"') + && !strcmp($value[$l - 1], '"')) + $value = substr($value, 1, $l - 2); + $parameters[$parameter] = $value; + if(!strcmp($parameter, $return)) + $return_value = $value; + $values = trim(strtok('')); + } + return($return_value); + } + + Function DecodePart($part) + { + switch($part['Type']) + { + case 'MessageStart': + $this->headers=array(); + break; + case 'HeaderName': + if($this->decode_bodies) + $this->current_header = strtolower($part['Name']); + break; + case 'HeaderValue': + if($this->decode_headers) + { + $value = $part['Value']; + $error = ''; + for($decoded_header = array(), $position = 0; $positionsubstr($value, $position), + 'Encoding'=>'ASCII' + ); + } + } + break; + } + $set = $encoded + 2; + if(GetType($method=strpos($value,'?', $set))!='integer') + { + $error = 'invalid header encoding syntax '.$part['Value']; + $error_position = $part['Position'] + $set; + break; + } + $encoding=strtoupper(substr($value, $set, $method - $set)); + $method += 1; + if(GetType($data=strpos($value,'?', $method))!='integer') + { + $error = 'invalid header encoding syntax '.$part['Value']; + $error_position = $part['Position'] + $set; + break; + } + $start = $data + 1; + if(GetType($end=strpos($value,'?=', $start))!='integer') + { + $error = 'invalid header encoding syntax '.$part['Value']; + $error_position = $part['Position'] + $start; + break; + } + if($encoded > $position) + { + if(count($decoded_header)) + $decoded_header[count($decoded_header)-1]['Value'].=substr($value, $position, $encoded - $position); + else + { + $decoded_header[]=array( + 'Value'=>substr($value, $position, $encoded - $position), + 'Encoding'=>'ASCII' + ); + } + } + switch(strtolower(substr($value, $method, $data - $method))) + { + case 'q': + if($end>$start) + { + for($decoded = '', $position = $start; $position < $end ; ) + { + switch($value[$position]) + { + case '=': + $h = HexDec($hex = strtolower(substr($value, $position+1, 2))); + if($end - $position < 3 + || strcmp(sprintf('%02x', $h), $hex)) + { + $warning = 'the header specified an invalid encoded character'; + $warning_position = $part['Position'] + $position + 1; + if($this->ignore_syntax_errors) + { + $this->SetPositionedWarning($warning, $warning_position); + $decoded .= '='; + $position ++; + } + else + { + $error = $warning; + $error_position = $warning_position; + break 4; + } + } + else + { + $decoded .= Chr($h); + $position += 3; + } + break; + case '_': + $decoded .= ' '; + $position++; + break; + default: + $decoded .= $value[$position]; + $position++; + break; + } + } + if(count($decoded_header) + && (!strcmp($decoded_header[$last = count($decoded_header)-1]['Encoding'], 'ASCII')) + || !strcmp($decoded_header[$last]['Encoding'], $encoding)) + { + $decoded_header[$last]['Value'].= $decoded; + $decoded_header[$last]['Encoding']= $encoding; + } + else + { + $decoded_header[]=array( + 'Value'=>$decoded, + 'Encoding'=>$encoding + ); + } + } + break; + case 'b': + $decoded=base64_decode(substr($value, $start, $end - $start)); + if($end <= $start + || GetType($decoded) != 'string' + || strlen($decoded) == 0) + { + $warning = 'the header specified an invalid base64 encoded text'; + $warning_position = $part['Position'] + $start; + if($this->ignore_syntax_errors) + $this->SetPositionedWarning($warning, $warning_position); + else + { + $error = $warning; + $error_position = $warning_position; + break 2; + } + } + if(count($decoded_header) + && (!strcmp($decoded_header[$last = count($decoded_header)-1]['Encoding'], 'ASCII')) + || !strcmp($decoded_header[$last]['Encoding'], $encoding)) + { + $decoded_header[$last]['Value'].= $decoded; + $decoded_header[$last]['Encoding']= $encoding; + } + else + { + $decoded_header[]=array( + 'Value'=>$decoded, + 'Encoding'=>$encoding + ); + } + break; + default: + $error = 'the header specified an unsupported encoding method'; + $error_position = $part['Position'] + $method; + break 2; + } + $position = $end + 2; + } + if(strlen($error)==0 + && count($decoded_header)) + $part['Decoded']=$decoded_header; + } + if($this->decode_bodies + || $this->decode_headers) + { + switch($this->current_header) + { + case 'content-type:': + $boundary = $this->ParseParameters($part['Value'], $type, $parameters, 'boundary'); + $this->headers['Type'] = $type; + if($this->decode_headers) + { + $part['MainValue'] = $type; + $part['Parameters'] = $parameters; + } + if(!strcmp(strtok($type, '/'), 'multipart')) + { + $this->headers['Multipart'] = 1; + if(strlen($boundary)) + $this->headers['Boundary'] = $boundary; + else + return($this->SetPositionedError('multipart content-type header does not specify the boundary parameter', $part['Position'])); + } + break; + case 'content-transfer-encoding:': + switch($this->headers['Encoding']=strtolower(trim($part['Value']))) + { + case 'quoted-printable': + $this->headers['QuotedPrintable'] = 1; + break; + case '7 bit': + case '8 bit': + if(!$this->SetPositionedWarning('"'.$this->headers['Encoding'].'" is an incorrect content transfer encoding type', $part['Position'])) + return(0); + case '7bit': + case '8bit': + case 'binary': + break; + case 'base64': + $this->headers['Base64']=1; + break; + default: + if(!$this->SetPositionedWarning('decoding '.$this->headers['Encoding'].' encoded bodies is not yet supported', $part['Position'])) + return(0); + } + break; + } + } + break; + case 'BodyStart': + if($this->decode_bodies + && IsSet($this->headers['Multipart'])) + { + $this->body_parser_state = MIME_PARSER_BODY_START; + $this->body_buffer = ''; + $this->body_buffer_position = 0; + } + break; + case 'MessageEnd': + if($this->decode_bodies + && IsSet($this->headers['Multipart']) + && $this->body_parser_state != MIME_PARSER_BODY_DONE) + { + if($this->body_parser_state != MIME_PARSER_BODY_DATA) + return($this->SetPositionedError('incomplete message body part', $part['Position'])); + if(!$this->SetPositionedWarning('truncated message body part', $part['Position'])) + return(0); + } + break; + case 'BodyData': + if($this->decode_bodies) + { + if(strlen($this->body_buffer)==0) + { + $this->body_buffer = $part['Data']; + $this->body_offset = $part['Position']; + } + else + $this->body_buffer .= $part['Data']; + if(IsSet($this->headers['Multipart'])) + { + $boundary = '--'.$this->headers['Boundary']; + switch($this->body_parser_state) + { + case MIME_PARSER_BODY_START: + for($position = $this->body_buffer_position; ;) + { + if(!$this->FindBodyLineBreak($position, $break, $line_break)) + return(1); + $next = $line_break + strlen($break); + if(!strcmp(rtrim(substr($this->body_buffer, $position, $line_break - $position)), $boundary)) + { + $part=array( + 'Type'=>'StartPart', + 'Part'=>$this->headers['Boundary'], + 'Position'=>$this->body_offset + $next + ); + $this->parts[]=$part; + UnSet($this->body_parser); + $this->body_parser = new mime_parser_class; + $this->body_parser->decode_bodies = 1; + $this->body_parser->decode_headers = $this->decode_headers; + $this->body_parser->mbox = 0; + $this->body_parser_state = MIME_PARSER_BODY_DATA; + $this->body_buffer = substr($this->body_buffer, $next); + $this->body_offset += $next; + $this->body_buffer_position = 0; + break; + } + else + $position = $next; + } + case MIME_PARSER_BODY_DATA: + for($position = $this->body_buffer_position; ;) + { + if(!$this->FindBodyLineBreak($position, $break, $line_break)) + { + if($position > 0) + { + if(!$this->body_parser->Parse(substr($this->body_buffer, 0, $position), 0)) + return($this->SetError($this->body_parser->error)); + if(!$this->QueueBodyParts()) + return(0); + } + $this->body_buffer = substr($this->body_buffer, $position); + $this->body_buffer_position = 0; + $this->body_offset += $position; + return(1); + } + $next = $line_break + strlen($break); + $line = rtrim(substr($this->body_buffer, $position, $line_break - $position)); + if(!strcmp($line, $boundary.'--')) + { + if(!$this->body_parser->Parse(substr($this->body_buffer, 0, $position), 1)) + return($this->SetError($this->body_parser->error)); + if(!$this->QueueBodyParts()) + return(0); + $part=array( + 'Type'=>'EndPart', + 'Part'=>$this->headers['Boundary'], + 'Position'=>$this->body_offset + $position + ); + $this->body_buffer = substr($this->body_buffer, $next); + $this->body_buffer_position = 0; + $this->body_offset += $next; + $this->body_parser_state = MIME_PARSER_BODY_DONE; + break 2; + } + elseif(!strcmp($line, $boundary)) + { + if(!$this->body_parser->Parse(substr($this->body_buffer, 0, $position), 1)) + return($this->SetError($this->body_parser->error)); + if(!$this->QueueBodyParts()) + return(0); + $part=array( + 'Type'=>'EndPart', + 'Part'=>$this->headers['Boundary'], + 'Position'=>$this->body_offset + $position + ); + $this->parts[] = $part; + $part=array( + 'Type'=>'StartPart', + 'Part'=>$this->headers['Boundary'], + 'Position'=>$this->body_offset + $next + ); + $this->parts[] = $part; + UnSet($this->body_parser); + $this->body_parser = new mime_parser_class; + $this->body_parser->decode_bodies = 1; + $this->body_parser->decode_headers = $this->decode_headers; + $this->body_parser->mbox = 0; + $this->body_buffer = substr($this->body_buffer, $next); + $this->body_buffer_position = 0; + $this->body_offset += $next; + $position=0; + continue; + } + $position = $next; + } + break; + case MIME_PARSER_BODY_DONE: + return(1); + default: + return($this->SetPositionedError($this->state.' is not a valid body parser state', $this->body_buffer_position)); + } + } + elseif(IsSet($this->headers['QuotedPrintable'])) + { + for($end = strlen($this->body_buffer), $decoded = '', $position = $this->body_buffer_position; $position < $end; ) + { + if(GetType($equal = strpos($this->body_buffer, '=', $position))!='integer') + { + $decoded .= substr($this->body_buffer, $position); + $position = $end; + break; + } + $next = $equal + 1; + switch($end - $equal) + { + case 1: + $decoded .= substr($this->body_buffer, $position, $equal - $position); + $position = $equal; + break 2; + case 2: + $decoded .= substr($this->body_buffer, $position, $equal - $position); + if(!strcmp($this->body_buffer[$next],"\n")) + $position = $end; + else + $position = $equal; + break 2; + } + if(!strcmp(substr($this->body_buffer, $next, 2), $break="\r\n") + || !strcmp($this->body_buffer[$next], $break="\n") + || !strcmp($this->body_buffer[$next], $break="\r")) + { + $decoded .= substr($this->body_buffer, $position, $equal - $position); + $position = $next + strlen($break); + continue; + } + $decoded .= substr($this->body_buffer, $position, $equal - $position); + $h = HexDec($hex=strtolower(substr($this->body_buffer, $next, 2))); + if(strcmp(sprintf('%02x', $h), $hex)) + { + if(!$this->SetPositionedWarning('the body specified an invalid quoted-printable encoded character', $this->body_offset + $next)) + return(0); + $decoded.='='; + $position=$next; + } + else + { + $decoded .= Chr($h); + $position = $equal + 3; + } + } + if(strlen($decoded)==0) + { + $this->body_buffer_position = $position; + return(1); + } + $part['Data'] = $decoded; + $this->body_buffer = substr($this->body_buffer, $position); + $this->body_buffer_position = 0; + $this->body_offset += $position; + } + elseif(IsSet($this->headers['Base64'])) + { + $part['Data'] = base64_decode($this->body_buffer_position ? substr($this->body_buffer,$this->body_buffer_position) : $this->body_buffer); + $this->body_offset += strlen($this->body_buffer) - $this->body_buffer_position; + $this->body_buffer_position = 0; + $this->body_buffer = ''; + } + else + { + $part['Data'] = substr($this->body_buffer, $this->body_buffer_position); + $this->body_buffer_position = 0; + $this->body_buffer = ''; + } + } + break; + } + $this->parts[]=$part; + return(1); + } + + Function DecodeStream($parameters, &$end_of_message, &$decoded) + { + $end_of_message = 1; + $state = MIME_MESSAGE_START; + for(;;) + { + if(!$this->GetPart($part, $end)) + return(0); + if($end) + { + if(IsSet($parameters['File'])) + { + $end_of_data = feof($this->file); + if($end_of_data) + break; + $data = @fread($this->file, $this->message_buffer_length); + if(GetType($data)!='string') + return($this->SetPHPError('could not read the message file', $php_errormsg)); + $end_of_data = feof($this->file); + } + else + { + $end_of_data=($this->position>=strlen($parameters['Data'])); + if($end_of_data) + break; + $data = substr($parameters['Data'], $this->position, $this->message_buffer_length); + $this->position += strlen($data); + $end_of_data = ($this->position >= strlen($parameters['Data'])); + } + if(!$this->Parse($data, $end_of_data)) + return(0); + continue; + } + $type = $part['Type']; + switch($state) + { + case MIME_MESSAGE_START: + switch($type) + { + case 'MessageStart': + $decoded=array( + 'Headers'=>array(), + 'Parts'=>array() + ); + $end_of_message = 0; + $state = MIME_MESSAGE_GET_HEADER_NAME; + continue 3; + case 'MessageEnd': + return($this->SetPositionedWarning('incorrectly ended body part', $part['Position'])); + } + break; + + case MIME_MESSAGE_GET_HEADER_NAME: + switch($type) + { + case 'HeaderName': + $header = strtolower($part['Name']); + $state = MIME_MESSAGE_GET_HEADER_VALUE; + continue 3; + case 'BodyStart': + $state = MIME_MESSAGE_GET_BODY; + $part_number = 0; + continue 3; + } + break; + + case MIME_MESSAGE_GET_HEADER_VALUE: + switch($type) + { + case 'HeaderValue': + $value = trim($part['Value']); + if(!IsSet($decoded['Headers'][$header])) + { + $h = 0; + $decoded['Headers'][$header]=$value; + if($this->extract_addresses + && IsSet($this->address_headers[$header])) + $decoded['HeaderPositions'][$header] = $part['Position']; + } + elseif(GetType($decoded['Headers'][$header])=='string') + { + $h = 1; + $decoded['Headers'][$header]=array($decoded['Headers'][$header], $value); + } + else + { + $h = count($decoded['Headers'][$header]); + $decoded['Headers'][$header][]=$value; + } + if(IsSet($part['Decoded']) + && (count($part['Decoded'])>1 + || strcmp($part['Decoded'][0]['Encoding'],'ASCII') + || strcmp($value, trim($part['Decoded'][0]['Value'])))) + { + $p=$part['Decoded']; + $p[0]['Value']=ltrim($p[0]['Value']); + $last=count($p)-1; + $p[$last]['Value']=rtrim($p[$last]['Value']); + $decoded['DecodedHeaders'][$header][$h]=$p; + } + switch($header) + { + case 'content-disposition:': + $filename='filename'; + break; + case 'content-type:': + if(!IsSet($decoded['FileName'])) + { + $filename='name'; + break; + } + default: + $filename=''; + break; + } + if(strlen($filename)) + { + if(IsSet($decoded['DecodedHeaders'][$header][$h]) + && count($decoded['DecodedHeaders'][$header][$h]) == 1) + { + $value = $decoded['DecodedHeaders'][$header][$h][0]['Value']; + $encoding = $decoded['DecodedHeaders'][$header][$h][0]['Encoding']; + } + else + $encoding = ''; + $this->ParseStructuredHeader($value, $type, $header_parameters, $character_sets, $languages); + if(IsSet($header_parameters[$filename])) + { + $decoded['FileName']=$header_parameters[$filename]; + if(IsSet($character_sets[$filename]) + && strlen($character_sets[$filename])) + $decoded['FileNameCharacterSet']=$character_sets[$filename]; + if(IsSet($character_sets['language']) + && strlen($character_sets['language'])) + $decoded['FileNameCharacterSet']=$character_sets[$filename]; + if(!IsSet($decoded['FileNameCharacterSet']) + && strlen($encoding)) + $decoded['FileNameCharacterSet'] = $encoding; + if(!strcmp($header, 'content-disposition:')) + $decoded['FileDisposition']=$type; + } + } + $state = MIME_MESSAGE_GET_HEADER_NAME; + continue 3; + } + break; + + case MIME_MESSAGE_GET_BODY: + switch($type) + { + case 'BodyData': + if(IsSet($parameters['SaveBody'])) + { + if(!IsSet($decoded['BodyFile'])) + { + $directory_separator=(defined('DIRECTORY_SEPARATOR') ? DIRECTORY_SEPARATOR : '/'); + $path = (strlen($parameters['SaveBody']) ? ($parameters['SaveBody'].(strcmp($parameters['SaveBody'][strlen($parameters['SaveBody'])-1], $directory_separator) ? $directory_separator : '')) : '').strval($this->body_part_number); + if(!($this->body_file = fopen($path, 'wb'))) + return($this->SetPHPError('could not create file '.$path.' to save the message body part', $php_errormsg)); + $decoded['BodyFile'] = $path; + $decoded['BodyPart'] = $this->body_part_number; + $decoded['BodyLength'] = 0; + $this->body_part_number++; + } + if(strlen($part['Data']) + && !fwrite($this->body_file, $part['Data'])) + { + $this->SetPHPError('could not save the message body part to file '.$decoded['BodyFile'], $php_errormsg); + fclose($this->body_file); + @unlink($decoded['BodyFile']); + return(0); + } + } + elseif(IsSet($parameters['SkipBody']) + && $parameters['SkipBody']) + { + if(!IsSet($decoded['BodyPart'])) + { + $decoded['BodyPart'] = $this->body_part_number; + $decoded['BodyLength'] = 0; + $this->body_part_number++; + } + } + else + { + if(IsSet($decoded['Body'])) + $decoded['Body'].=$part['Data']; + else + { + $decoded['Body']=$part['Data']; + $decoded['BodyPart'] = $this->body_part_number; + $decoded['BodyLength'] = 0; + $this->body_part_number++; + } + } + $decoded['BodyLength'] += strlen($part['Data']); + continue 3; + case 'StartPart': + if(!$this->DecodeStream($parameters, $end_of_part, $decoded_part)) + return(0); + $decoded['Parts'][$part_number]=$decoded_part; + $part_number++; + $state = MIME_MESSAGE_GET_BODY_PART; + continue 3; + case 'MessageEnd': + if(IsSet($decoded['BodyFile'])) + fclose($this->body_file); + return(1); + } + break; + + case MIME_MESSAGE_GET_BODY_PART: + switch($type) + { + case 'EndPart': + $state = MIME_MESSAGE_GET_BODY; + continue 3; + } + break; + } + return($this->SetError('unexpected decoded message part type '.$type.' in state '.$state)); + } + return(1); + } + + /* Public functions */ + + Function Parse($data, $end) + { + if(strlen($this->error)) + return(0); + if($this->state==MIME_PARSER_END) + return($this->SetError('the parser already reached the end')); + $length = strlen($data); + if($this->track_lines + && $length) + { + $line = $this->last_line; + $position = 0; + if($this->last_carriage_return) + { + if($data[0] == "\n") + ++$position; + $this->lines[++$line] = $this->line_offset + $position; + $this->last_carriage_return = 0; + } + while($position < $length) + { + $position += strcspn($data, "\r\n", $position) ; + if($position >= $length) + break; + if($data[$position] == "\r") + { + ++$position; + if($position >= $length) + { + $this->last_carriage_return = 1; + break; + } + if($data[$position] == "\n") + ++$position; + $this->lines[++$line] = $this->line_offset + $position; + } + else + { + ++$position; + $this->lines[++$line] = $this->line_offset + $position; + } + } + $this->last_line = $line; + $this->line_offset += $length; + } + $this->buffer .= $data; + do + { + Unset($part); + if(!$this->ParsePart($end, $part, $need_more_data)) + return(0); + if(IsSet($part) + && !$this->DecodePart($part)) + return(0); + } + while(!$need_more_data + && $this->state!=MIME_PARSER_END); + if($end + && $this->state!=MIME_PARSER_END) + return($this->SetError('reached a premature end of data')); + if($this->buffer_position>0) + { + $this->offset += $this->buffer_position; + $this->buffer = substr($this->buffer, $this->buffer_position); + $this->buffer_position = 0; + } + return(1); + } + + Function ParseFile($file) + { + if(strlen($this->error)) + return(0); + if(!($stream = @fopen($file, 'r'))) + return($this->SetPHPError('Could not open the file '.$file, $php_errormsg)); + for($end = 0;!$end;) + { + if(!($data = @fread($stream, $this->message_buffer_length))) + { + $this->SetPHPError('Could not read the file '.$file, $php_errormsg); + fclose($stream); + return(0); + } + $end=feof($stream); + if(!$this->Parse($data, $end)) + { + fclose($stream); + return(0); + } + } + fclose($stream); + return(1); + } + + Function GetPart(&$part, &$end) + { + $end = ($this->part_position >= count($this->parts)); + if($end) + { + if($this->part_position) + { + $this->part_position = 0; + $this->parts = array(); + } + } + else + { + $part = $this->parts[$this->part_position]; + $this->part_position ++; + } + return(1); + } + +/* +{metadocument} + + Decode + BOOLEAN + + Parse and decode message data and retrieve its structure. + Pass an array to the + Decode + parameters + + parameter to define whether the message data should be read and + parsed from a file or a data string, as well additional parsing + options. The + Decode + decoded + returns the + data structure of the parsed messages. + This function returns 1 if + the specified message data is parsed successfully. Otherwise, + check the variables error and + error_position to determine what + error occurred and the relevant message position. + + + parameters + HASH + + Associative array to specify parameters for the message + data parsing and decoding operation. Here follows the list of + supported parameters that should be used as indexes of the + array: + File + Name of the file from which the message data will be read. It + may be the name of a file stream or a remote URL, as long as + your PHP installation is configured to allow accessing remote + files with the fopen() function. + Data + String that specifies the message data. This should be used + as alternative data source for passing data available in memory, + like for instance messages stored in a database that was queried + dynamically and the message data was fetched into a string + variable. + SaveBody + If this parameter is specified, the message body parts are saved + to files. The path of the directory where the files are saved is + defined by this parameter value. The information about the + message body part structure is returned by the + Decode + decoded + argument, but it just returns the body data part + file name instead of the actual body data. It is recommended for + retrieving messages larger than the available memory. The names + of the body part files are numbers starting from + 1. + SkipBody + If this parameter is set to 1, the + message body parts are skipped. This means the information about + the message body part structure is returned by the + Decode + decoded + but it does not return any body data. It is + recommended just for parsing messages without the need to + retrieve the message body part data. + + + + decoded + ARRAY + + + Retrieve the structure of the parsed message headers and + body data. + The argument is used to return by reference an array of message + structure definitions. Each array entry refers to the structure + of each message that is found and parsed successfully. + Each message entry consists of an associative array with several + entries that describe the message structure. Here follows the + list of message structure entries names and the meaning of the + respective values: + Headers + Associative array that returns the list of all the message + headers. The array entries are the header names mapped to + lower case, including the end colon. The array values are the + respective header raw values without any start or trailing white + spaces. Long header values split between multiple message lines + are gathered in single string without line breaks. If an header + with the same name appears more than once in the message, the + respective value is an array with the values of all of the + header occurrences. + DecodedHeaders + Associative array that returns the list of all the encoded + message headers when the + decode_headers variable is set. The + array entries are the header names mapped to lower case, + including the end colon. The array values are also arrays that + list only the occurrences of the header that originally were + encoded. Each entry of the decoded header array contains more + associative arrays that describe each part of the decoded + header. Each of those associative arrays have an entry named + Value that contains the decoded header part value, and + another entry named Encoding that specifies the + character set encoding of the value in upper case. + ExtractedAddresses + If the extract_addresses variable + is set to 1, this entry is set to an + associative array with the addresses found in the headers + specified by the address_headers + variable. + The parsed addresses found on each header are returned as an + array with the format of the + addresses + rfc822_addresses_class.html#argument_ParseAddressList_addresses + argument of the + ParseAddressList + rfc822_addresses_class.html#function_ParseAddressList + function of the + RFC 822 addresses + rfc822_addresses_class.html + class. + Parts + If this message content type is multipart, this entry is an + array that describes each of the parts contained in the message + body. Each message part is described by an associative array + with the same structure of a complete message + definition. + Body + String with the decoded data contained in the message body. If + the SaveBody or SkipBody parameters are + defined, the Body entry is not set. + BodyFile + Name of the file to which the message body data was saved when + the SaveBody parameter is defined. + BodyLength + Length of the current decoded body part. + BodyPart + Number of the current message body part. + FileName + Name of the file for body parts composed from + files. + FileNameCharacterSet + Character set encoding for file parts with names that may + include non-ASCII characters. + FileNameLanguage + Language of file parts with names that may include non-ASCII + characters. + FileDisposition + Disposition of parts that files. It may be either + inline for file parts to be + displayed with the message, or + attachment otherwise. + + + +{/metadocument} +*/ + Function Decode($parameters, &$decoded) + { + if(IsSet($parameters['File'])) + { + if(!($this->file = @fopen($parameters['File'], 'r'))) + return($this->SetPHPError('could not open the message file to decode '.$parameters['File'], $php_errormsg)); + } + elseif(IsSet($parameters['Data'])) + $this->position = 0; + else + return($this->SetError('it was not specified a valid message to decode')); + $this->warnings = $decoded = array(); + $this->ResetParserState(); + $addresses = new rfc822_addresses_class; + $addresses->ignore_syntax_errors = $this->ignore_syntax_errors; + for($message = 0; ($success = $this->DecodeStream($parameters, $end_of_message, $decoded_message)) && !$end_of_message; $message++) + { + if($this->extract_addresses) + { + $headers = $decoded_message['Headers']; + $positions = (IsSet($decoded_message['HeaderPositions']) ? $decoded_message['HeaderPositions'] : array()); + $th = count($headers); + for(Reset($headers), $h = 0; $h<$th; Next($headers), ++$h) + { + $header = Key($headers); + if(IsSet($this->address_headers[$header]) + && $this->address_headers[$header]) + { + $values = (GetType($headers[$header]) == 'array' ? $headers[$header] : array($headers[$header])); + $p = (GetType($positions[$header]) == 'array' ? $positions[$header] : array($positions[$header])); + $tv = count($values); + for($v = 0; $v<$tv; ++$v) + { + if($addresses->ParseAddressList($values[$v], $a)) + { + if($v==0) + $decoded_message['ExtractedAddresses'][$header] = $a; + else + { + $tl = count($a); + for($l = 0; $l<$tl; ++$l) + $decoded_message['ExtractedAddresses'][$header][] = $a[$l]; + } + $tw = count($addresses->warnings); + for($w = 0, Reset($addresses->warnings); $w < $tw; Next($addresses->warnings), $w++) + { + $warning = Key($addresses->warnings); + if(!$this->SetPositionedWarning('Address extraction warning from header '.$header.' '.$addresses->warnings[$warning], $warning + $p[$v])) + return(0); + } + } + elseif(!$this->SetPositionedWarning('Address extraction error from header '.$header.' '.$addresses->error, $addresses->error_position + $p[$v])) + return(0); + } + } + } + UnSet($decoded_message['HeaderPositions']); + } + $decoded[$message]=$decoded_message; + } + if(IsSet($parameters['File'])) + fclose($this->file); + return($success); + } +/* +{metadocument} + + +{/metadocument} +*/ + + Function CopyAddresses($message, &$results, $header) + { + if(!IsSet($message['Headers'][$header])) + return; + if(!IsSet($message['ExtractedAddresses'][$header])) + { + $parser = new rfc822_addresses_class; + $parser->ignore_syntax_errors = $this->ignore_syntax_errors; + $values = (GetType($message['Headers'][$header]) == 'array' ? $message['Headers'][$header] : array($message['Headers'][$header])); + $tv = count($values); + $addresses = array(); + for($v = 0; $v<$tv; ++$v) + { + if($parser->ParseAddressList($values[$v], $a)) + { + if($v==0) + $addresses = $a; + else + { + $tl = count($a); + for($l = 0; $l<$tl; ++$l) + $addresses[] = $a[$l]; + } + } + } + } + else + $addresses = $message['ExtractedAddresses'][$header]; + if(count($addresses)) + $results[ucfirst(substr($header, 0, strlen($header) -1))] = $addresses; + } + + Function ReadMessageBody($message, &$body, $prefix) + { + if(IsSet($message[$prefix])) + $body = $message[$prefix]; + elseif(IsSet($message[$prefix.'File'])) + { + $path = $message[$prefix.'File']; + if(!($file = @fopen($path, 'rb'))) + return($this->SetPHPError('could not open the message body file '.$path, $php_errormsg)); + for($body = '', $end = 0;!$end;) + { + if(!($data = @fread($file, $this->message_buffer_length))) + { + $this->SetPHPError('Could not open the message body file '.$path, $php_errormsg); + fclose($stream); + return(0); + } + $end=feof($file); + $body.=$data; + } + fclose($file); + } + else + $body = ''; + return(1); + } +/* +{metadocument} + + Analyze + BOOLEAN + + Analyze a parsed message to describe its contents. + Pass an array to the + Analyze + message + + parameter with the decoded message array structure returned by the + Decode function. The + Analyze + results + returns details about the type of message that was + analyzed and its contents. + This function returns 1 if + the specified message is analyzed successfully. Otherwise, + check the variables error and + error_position to determine what + error occurred. + + + message + HASH + + Pass an associative array with the definition of an + individual message returned by the + Decode + decoded + argument of the + Decode function.. + + + + results + HASH + + + Returns an associative array with the results of the + analysis. Some types of entries are returned for all types of + analyzed messages. Other entries are specific to each type of + message. + Type + Type of message that was analyzed. Currently it supports the + types: binary, text, html, + video, image, audio, zip, + pdf, postscript, ms-word, + ms-excel, ms-powerpoint, ms-tnef, + odf-writer, signature, report-type, + delivery-status and message. + SubType + Name of the variant of the message type format. + Description + Human readable description in English of the message type. + + + + From message headers: + Encoding + Character set encoding of the message part. + Subject + The message subject. + SubjectEncoding + Character set encoding of the message subject. + Date + The message date. + From + To + Cc + Bcc + Array of e-mail addresses found in the From, + To, Cc, Bcc. + Each of the entries consists of an associative array with an + entry named address with the e-mail address and + optionally another named name with the associated + name. + + + For content message parts: + + Data + String of data of the message part. + DataFile + File with data of the message part. + DataLength + Length of the data of the message part. + + + + For message with embedded files: + + FileName + Original name of the file. + ContentID + Content identifier of the file to be used in references from + other message parts. + For instance, an HTML message may reference images embedded in + the message using URLs that start with the + cid: followed by the content + identifier of the embedded image file part. + Disposition + Information of whether the embedded file should be displayed + inline when the message is presented, or it is an attachment + file. + + + For composite message: + + Attachments + List of files attached to the message. + Alternative + List of alternative message parts that can be displayed if the + main message type is not supported by the program displaying + the message. + Related + List of message parts related with the main message type. + It may list for instance embedded images or CSS files related + with an HTML message type. + + + For bounced messages or other types of delivery status report + messages: + + Recipients + List of recipients of the original message. + Each entry contains an associative array that may have the + entries: Recipient with the original recipient address, + Action with the name action that triggered the delivery + status report, Status with the code of the status of + the message delivery. + Response + Human readable response sent by the server the originated the + report. + + + + +{/metadocument} +*/ + Function Analyze($message, &$results) + { + $results = array(); + if(!IsSet($message['Headers']['content-type:'])) + $content_type = 'text/plain'; + elseif(count($message['Headers']['content-type:']) == 1) + $content_type = $message['Headers']['content-type:']; + else + { + if(!$this->SetPositionedWarning('message contains multiple content-type headers', 0)) + return(0); + $content_type = $message['Headers']['content-type:'][0]; + } + $disposition = $this->ParseParameters($content_type, $content_type, $parameters, 'disposition'); + $type = $this->Tokenize($content_type, '/'); + $sub_type = $this->Tokenize(';'); + $copy_body = 1; + $tolerate_unrecognized = 1; + switch($type) + { + case 'multipart': + $tolerate_unrecognized = 0; + $copy_body = 0; + $lp = count($message['Parts']); + if($lp == 0) + return($this->SetError($this->decode_bodies ? 'No parts were found in the '.$content_type.' part message' : 'It is not possible to analyze multipart messages without parsing the contained message parts. Please set the decode_bodies variable to 1 before parsing the message')); + $parts = array(); + for($p = 0; $p < $lp; ++$p) + { + if(!$this->Analyze($message['Parts'][$p], $parts[$p])) + return(0); + } + switch($sub_type) + { + case 'alternative': + $p = $lp; + $results = $parts[--$p]; + for(--$p ; $p >=0 ; --$p) + $results['Alternative'][] = $parts[$p]; + break; + + case 'related': + $results = $parts[0]; + for($p = 1; $p < $lp; ++$p) + $results['Related'][] = $parts[$p]; + break; + + case 'mixed': + $results = $parts[0]; + for($p = 1; $p < $lp; ++$p) + $results['Attachments'][] = $parts[$p]; + break; + + case 'report': + if(IsSet($parameters['report-type'])) + { + switch($parameters['report-type']) + { + case 'delivery-status': + for($p = 1; $p < $lp; ++$p) + { + if(!strcmp($parts[$p]['Type'], $parameters['report-type'])) + { + $results = $parts[$p]; + break; + } + } + if(!$this->ReadMessageBody($parts[0], $body, 'Data')) + return(0); + if(strlen($body)) + $results['Response'] = $body; + break; + } + } + $results['Type'] = $parameters['report-type']; + break; + + case 'signed': + if($lp != 2) + return($this->SetError('this '.$content_type.' message does not have just 2 parts')); + if(strcmp($parts[1]['Type'], 'signature')) + { + $this->SetErrorWithContact('this '.$content_type.' message does not contain a signature'); + $this->error = ''; + } + $results = $parts[0]; + $results['Signature'] = $parts[1]; + break; + + case 'appledouble': + if($lp != 2) + return($this->SetError('this '.$content_type.' message does not have just 2 parts')); + if(strcmp($parts[0]['Type'], 'applefile')) + { + $this->SetErrorWithContact('this '.$content_type.' message does not contain an Apple file header'); + $this->error = ''; + } + $results = $parts[1]; + $results['AppleFileHeader'] = $parts[0]; + break; + + } + break; + case 'text': + switch($sub_type) + { + case 'plain': + $results['Type'] = 'text'; + $results['Description'] = 'Text message'; + break; + case 'html': + $results['Type'] = 'html'; + $results['Description'] = 'HTML message'; + break; + default: + $results['Type'] = $type; + $results['SubType'] = $sub_type; + $results['Description'] = 'Text file in the '.strtoupper($sub_type).' format'; + break; + } + break; + case 'video': + $results['Type'] = $type; + $results['SubType'] = $sub_type; + $results['Description'] = 'Video file in the '.strtoupper($sub_type).' format'; + break; + case 'image': + $results['Type'] = $type; + $results['SubType'] = $sub_type; + $results['Description'] = 'Image file in the '.strtoupper($sub_type).' format'; + break; + case 'audio': + $results['Type'] = $type; + $results['SubType'] = $sub_type; + $results['Description'] = 'Audio file in the '.strtoupper($sub_type).' format'; + break; + case 'application': + switch($sub_type) + { + case 'octet-stream': + case 'x-msdownload': + $results['Type'] = 'binary'; + $results['Description'] = 'Binary file'; + break; + case 'pdf': + $results['Type'] = $sub_type; + $results['Description'] = 'Document in PDF format'; + break; + case 'postscript': + $results['Type'] = $sub_type; + $results['Description'] = 'Document in Postscript format'; + break; + case 'msword': + $results['Type'] = 'ms-word'; + $results['Description'] = 'Word processing document in Microsoft Word format'; + break; + case 'vnd.ms-powerpoint': + $results['Type'] = 'ms-powerpoint'; + $results['Description'] = 'Presentation in Microsoft PowerPoint format'; + break; + case 'vnd.ms-excel': + $results['Type'] = 'ms-excel'; + $results['Description'] = 'Spreadsheet in Microsoft Excel format'; + break; + case 'x-compressed': + if(!IsSet($parameters['name']) + || GetType($dot = strpos($parameters['name'], '.'))!='integer' + || strcmp($extension = strtolower(substr($parameters['name'], $dot + 1)), 'zip')) + break; + case 'zip': + case 'x-zip': + case 'x-zip-compressed': + $results['Type'] = 'zip'; + $results['Description'] = 'ZIP archive with compressed files'; + break; + case 'ms-tnef': + $results['Type'] = $sub_type; + $results['Description'] = 'Microsoft Exchange data usually sent by Microsoft Outlook'; + break; + case 'pgp-signature': + $results['Type'] = 'signature'; + $results['SubType'] = $sub_type; + $results['Description'] = 'Message signature for PGP'; + break; + case 'x-pkcs7-signature': + case 'pkcs7-signature': + $results['Type'] = 'signature'; + $results['SubType'] = $sub_type; + $results['Description'] = 'PKCS message signature'; + break; + case 'vnd.oasis.opendocument.text': + $results['Type'] = 'odf-writer'; + $results['Description'] = 'Word processing document in ODF text format used by OpenOffice Writer'; + break; + case 'applefile': + $results['Type'] = 'applefile'; + $results['Description'] = 'Apple file resource header'; + break; + } + break; + case 'message': + $tolerate_unrecognized = 0; + switch($sub_type) + { + case 'delivery-status': + $results['Type'] = $sub_type; + $results['Description'] = 'Notification of the status of delivery of a message'; + if(!$this->ReadMessageBody($message, $body, 'Body')) + return(0); + if(($l = strlen($body))) + { + $position = 0; + $this->ParseHeaderString($body, $position, $headers); + $recipients = array(); + for(;$position<$l;) + { + $this->ParseHeaderString($body, $position, $headers); + if(count($headers)) + { + $r = count($recipients); + if(IsSet($headers['action'])) + $recipients[$r]['Action'] = $headers['action']; + if(IsSet($headers['status'])) + $recipients[$r]['Status'] = $headers['status']; + if(IsSet($headers['original-recipient'])) + { + strtok($headers['original-recipient'], ';'); + $recipients[$r]['Address'] = trim(strtok('')); + } + elseif(IsSet($headers['final-recipient'])) + { + strtok($headers['final-recipient'], ';'); + $recipients[$r]['Address'] = trim(strtok('')); + } + } + } + $results['Recipients'] = $recipients; + } + $copy_body = 0; + break; + case 'rfc822': + $results['Type'] = 'message'; + $results['Description'] = 'E-mail message'; + break; + } + break; + default: + $tolerate_unrecognized = 0; + break; + } + if(!IsSet($results['Type'])) + { + $this->SetErrorWithContact($content_type.' message parts are not yet recognized'); + $results['Type'] = $this->error; + $this->error = ''; + } + if(IsSet($parameters['charset'])) + $results['Encoding'] = strtolower($parameters['charset']); + if(IsSet($message['Headers']['subject:'])) + { + if(IsSet($message['DecodedHeaders']['subject:']) + && count($message['DecodedHeaders']['subject:']) == 1 + && count($message['DecodedHeaders']['subject:'][0]) == 1) + { + $results['Subject'] = $message['DecodedHeaders']['subject:'][0][0]['Value']; + $results['SubjectEncoding'] = strtolower($message['DecodedHeaders']['subject:'][0][0]['Encoding']); + } + else + $results['Subject'] = $message['Headers']['subject:']; + } + if(IsSet($message['Headers']['date:'])) + { + if(IsSet($message['DecodedHeaders']['date:']) + && count($message['DecodedHeaders']['date:']) == 1 + && count($message['DecodedHeaders']['date:'][0]) == 1) + $results['Date'] = $message['DecodedHeaders']['date:'][0][0]['Value']; + else + $results['Date'] = $message['Headers']['date:']; + } + $l = count($this->address_headers); + for(Reset($this->address_headers), $h = 0; $h<$l; Next($this->address_headers), ++$h) + $this->CopyAddresses($message, $results, Key($this->address_headers)); + if($copy_body) + { + if(IsSet($message['Body'])) + $results['Data'] = $message['Body']; + elseif(IsSet($message['BodyFile'])) + $results['DataFile'] = $message['BodyFile']; + elseif(IsSet($message['BodyLength'])) + $results['DataLength'] = $message['BodyLength']; + if(IsSet($message['FileName'])) + $results['FileName'] = $message['FileName']; + if(IsSet($message['FileDisposition'])) + $results['FileDisposition'] = $message['FileDisposition']; + if(IsSet($message['Headers']['content-id:'])) + { + $content_id = trim($message['Headers']['content-id:']); + $l = strlen($content_id); + if(!strcmp($content_id[0], '<') + && !strcmp($content_id[$l - 1], '>')) + $results['ContentID'] = substr($content_id, 1, $l - 2); + } + } + return(1); + } +/* +{metadocument} + + +{/metadocument} +*/ + +/* +{metadocument} + + GetPositionLine + BOOLEAN + + Get the line number of the document that corresponds to a + given position. + Pass the document offset number as the position to be + located. Make sure the track_lines + variable is set to 1 before parsing + the document. + This function returns 1 if + the track_lines variable is set to + 1 and it was given a valid positive + position number that does not exceed the position of the last + parsed document line. + + + position + INTEGER + + Position of the line to be located. + + + + line + INTEGER + + + Returns the number of the line that corresponds to the + given document position. + + + + column + INTEGER + + + Returns the number of the column of the line that + corresponds to the given document position. + + + +{/metadocument} +*/ + Function GetPositionLine($position, &$line, &$column) + { + if(!$this->track_lines) + return($this->SetPositionedError('line positions are not being tracked', $position)); + $bottom = 0; + $top = count($this->lines) - 1; + if($position < 0) + return($this->SetPositionedError('it was not specified a valid position', $position)); + for(;;) + { + $line = intval(($bottom + $top) / 2); + $current = $this->lines[$line]; + if($current < $position) + $bottom = $line + 1; + elseif($current > $position) + $top = $line - 1; + else + break; + if($top < $bottom) + { + $line = $top; + break; + } + } + $column = $position - $this->lines[$line] + 1; + ++$line; + return(1); + } +/* +{metadocument} + + +{/metadocument} +*/ +}; + +/* + +{metadocument} +
      +{/metadocument} + +*/ + +?> \ No newline at end of file diff --git a/includes/pop3/parse_message.php b/includes/pop3/parse_message.php new file mode 100644 index 0000000000..b3cd9ec1f6 --- /dev/null +++ b/includes/pop3/parse_message.php @@ -0,0 +1,87 @@ + + +Parsing a message with Manuel Lemos' PHP POP3 and MIME Parser classes + + +

      Parsing a message with Manuel Lemos' PHP POP3 and MIME Parser classes

      +
      +decode_bodies = 1; + + $parameters=array( + 'File'=>$message_file, + + /* Read a message from a string instead of a file */ + /* 'Data'=>'My message data string', */ + + /* Save the message body parts to a directory */ + /* 'SaveBody'=>'/tmp', */ + + /* Do not retrieve or save message body parts */ + 'SkipBody'=>1, + ); + $success=$mime->Decode($parameters, $decoded); + + + if(!$success) + echo '

      MIME message decoding error: '.HtmlSpecialChars($mime->error)."

      \n"; + else + { + echo '

      MIME message decoding successful

      '."\n"; + echo '

      Message structure

      '."\n"; + echo '
      ';
      +		var_dump($decoded[0]);
      +		echo '
      '; + if($mime->Analyze($decoded[0], $results)) + { + echo '

      Message analysis

      '."\n"; + echo '
      ';
      +			var_dump($results);
      +			echo '
      '; + } + else + echo 'MIME message analyse error: '.$mime->error."\n"; + } +?> +
      + + diff --git a/includes/pop3/pop3.php b/includes/pop3/pop3.php new file mode 100644 index 0000000000..954184495a --- /dev/null +++ b/includes/pop3/pop3.php @@ -0,0 +1,796 @@ +next_token; + } + for($character=0;$characternext_token=substr($string,$found+1); + return(substr($string,0,$found)); + } + else + { + $this->next_token=""; + return($string); + } + } + + Function SetError($error) + { + return($this->error=$error); + } + + Function OutputDebug($message) + { + $message.="\n"; + if($this->html_debug) + $message=str_replace("\n","
      \n",HtmlSpecialChars($message)); + echo $message; + flush(); + } + + Function GetLine() + { + for($line="";;) + { + if(feof($this->connection)) + return(0); + $line.=fgets($this->connection,100); + $length=strlen($line); + if($length>=2 + && substr($line,$length-2,2)=="\r\n") + { + $line=substr($line,0,$length-2); + if($this->debug) + $this->OutputDebug("S $line"); + return($line); + } + } + } + + Function PutLine($line) + { + if($this->debug) + $this->OutputDebug("C $line"); + return(fputs($this->connection,"$line\r\n")); + } + + Function OpenConnection() + { + if($this->tls) + { + $version=explode(".",function_exists("phpversion") ? phpversion() : "3.0.7"); + $php_version=intval($version[0])*1000000+intval($version[1])*1000+intval($version[2]); + if($php_version<4003000) + return("establishing TLS connections requires at least PHP version 4.3.0"); + if(!function_exists("extension_loaded") + || !extension_loaded("openssl")) + return("establishing TLS connections requires the OpenSSL extension enabled"); + } + if($this->hostname=="") + return($this->SetError("2 it was not specified a valid hostname")); + if($this->debug) + $this->OutputDebug("Connecting to ".$this->hostname." ..."); + if(($this->connection=@fsockopen(($this->tls ? "tls://" : "").$this->hostname, $this->port, $error, $error_message))==0) + { + switch($error) + { + case -3: + return($this->SetError("-3 socket could not be created")); + case -4: + return($this->SetError("-4 dns lookup on hostname \"$hostname\" failed")); + case -5: + return($this->SetError("-5 connection refused or timed out")); + case -6: + return($this->SetError("-6 fdopen() call failed")); + case -7: + return($this->SetError("-7 setvbuf() call failed")); + default: + return($this->SetError($error." could not connect to the host \"".$this->hostname."\": ".$error_message)); + } + } + return(""); + } + + Function CloseConnection() + { + if($this->debug) + $this->OutputDebug("Closing connection."); + if($this->connection!=0) + { + fclose($this->connection); + $this->connection=0; + } + } + + /* Public methods */ + + /* Open method - set the object variable $hostname to the POP3 server address. */ + + Function Open() + { + if($this->state!="DISCONNECTED") + return($this->SetError("1 a connection is already opened")); + if(($error=$this->OpenConnection())!="") + return($error); + $greeting=$this->GetLine(); + if(GetType($greeting)!="string" + || $this->Tokenize($greeting," ")!="+OK") + { + $this->CloseConnection(); + return($this->SetError("3 POP3 server greeting was not found")); + } + $this->Tokenize("<"); + $this->greeting = $this->Tokenize(">"); + $this->must_update=0; + $this->state="AUTHORIZATION"; + return(""); + } + + /* Close method - this method must be called at least if there are any + messages to be deleted */ + + Function Close() + { + if($this->state=="DISCONNECTED") + return($this->SetError("no connection was opened")); + while($this->state=='GETMESSAGE') + { + if(strlen($error=$this->GetMessage(8000, $message, $end_of_message))) + return($error); + } + if($this->must_update + || $this->quit_handshake) + { + if($this->PutLine("QUIT")==0) + return($this->SetError("Could not send the QUIT command")); + $response=$this->GetLine(); + if(GetType($response)!="string") + return($this->SetError("Could not get quit command response")); + if($this->Tokenize($response," ")!="+OK") + return($this->SetError("Could not quit the connection: ".$this->Tokenize("\r\n"))); + } + $this->CloseConnection(); + $this->state="DISCONNECTED"; + pop3_class::SetConnection(-1, $this->connection_name, $this); + return(""); + } + + /* Login method - pass the user name and password of POP account. Set + $apop to 1 or 0 wether you want to login using APOP method or not. */ + + Function Login($user,$password,$apop=0) + { + if($this->state!="AUTHORIZATION") + return($this->SetError("connection is not in AUTHORIZATION state")); + if($apop) + { + if(!strcmp($this->greeting,"")) + return($this->SetError("Server does not seem to support APOP authentication")); + if($this->PutLine("APOP $user ".md5("<".$this->greeting.">".$password))==0) + return($this->SetError("Could not send the APOP command")); + $response=$this->GetLine(); + if(GetType($response)!="string") + return($this->SetError("Could not get APOP login command response")); + if($this->Tokenize($response," ")!="+OK") + return($this->SetError("APOP login failed: ".$this->Tokenize("\r\n"))); + } + else + { + $authenticated=0; + if(strcmp($this->authentication_mechanism,"USER") + && function_exists("class_exists") + && class_exists("sasl_client_class")) + { + if(strlen($this->authentication_mechanism)) + $mechanisms=array($this->authentication_mechanism); + else + { + $mechanisms=array(); + if($this->PutLine("CAPA")==0) + return($this->SetError("Could not send the CAPA command")); + $response=$this->GetLine(); + if(GetType($response)!="string") + return($this->SetError("Could not get CAPA command response")); + if(!strcmp($this->Tokenize($response," "),"+OK")) + { + for(;;) + { + $response=$this->GetLine(); + if(GetType($response)!="string") + return($this->SetError("Could not retrieve the supported authentication methods")); + switch($this->Tokenize($response," ")) + { + case ".": + break 2; + case "SASL": + for($method=1;strlen($mechanism=$this->Tokenize(" "));$method++) + $mechanisms[]=$mechanism; + break; + } + } + } + } + $sasl=new sasl_client_class; + $sasl->SetCredential("user",$user); + $sasl->SetCredential("password",$password); + if(strlen($this->realm)) + $sasl->SetCredential("realm",$this->realm); + if(strlen($this->workstation)) + $sasl->SetCredential("workstation",$this->workstation); + do + { + $status=$sasl->Start($mechanisms,$message,$interactions); + } + while($status==SASL_INTERACT); + switch($status) + { + case SASL_CONTINUE: + break; + case SASL_NOMECH: + if(strlen($this->authentication_mechanism)) + return($this->SetError("authenticated mechanism ".$this->authentication_mechanism." may not be used: ".$sasl->error)); + break; + default: + return($this->SetError("Could not start the SASL authentication client: ".$sasl->error)); + } + if(strlen($sasl->mechanism)) + { + if($this->PutLine("AUTH ".$sasl->mechanism.(IsSet($message) ? " ".base64_encode($message) : ""))==0) + return("Could not send the AUTH command"); + $response=$this->GetLine(); + if(GetType($response)!="string") + return("Could not get AUTH command response"); + switch($this->Tokenize($response," ")) + { + case "+OK": + $response=""; + break; + case "+": + $response=base64_decode($this->Tokenize("\r\n")); + break; + default: + return($this->SetError("Authentication error: ".$this->Tokenize("\r\n"))); + } + for(;!$authenticated;) + { + do + { + $status=$sasl->Step($response,$message,$interactions); + } + while($status==SASL_INTERACT); + switch($status) + { + case SASL_CONTINUE: + if($this->PutLine(base64_encode($message))==0) + return("Could not send message authentication step message"); + $response=$this->GetLine(); + if(GetType($response)!="string") + return("Could not get authentication step message response"); + switch($this->Tokenize($response," ")) + { + case "+OK": + $authenticated=1; + break; + case "+": + $response=base64_decode($this->Tokenize("\r\n")); + break; + default: + return($this->SetError("Authentication error: ".$this->Tokenize("\r\n"))); + } + break; + default: + return($this->SetError("Could not process the SASL authentication step: ".$sasl->error)); + } + } + } + } + if(!$authenticated) + { + if($this->PutLine("USER $user")==0) + return($this->SetError("Could not send the USER command")); + $response=$this->GetLine(); + if(GetType($response)!="string") + return($this->SetError("Could not get user login entry response")); + if($this->Tokenize($response," ")!="+OK") + return($this->SetError("User error: ".$this->Tokenize("\r\n"))); + if($this->PutLine("PASS $password")==0) + return($this->SetError("Could not send the PASS command")); + $response=$this->GetLine(); + if(GetType($response)!="string") + return($this->SetError("Could not get login password entry response")); + if($this->Tokenize($response," ")!="+OK") + return($this->SetError("Password error: ".$this->Tokenize("\r\n"))); + } + } + $this->state="TRANSACTION"; + return(""); + } + + /* Statistics method - pass references to variables to hold the number of + messages in the mail box and the size that they take in bytes. */ + + Function Statistics(&$messages,&$size) + { + if($this->state!="TRANSACTION") + return($this->SetError("connection is not in TRANSACTION state")); + if($this->PutLine("STAT")==0) + return($this->SetError("Could not send the STAT command")); + $response=$this->GetLine(); + if(GetType($response)!="string") + return($this->SetError("Could not get the statistics command response")); + if($this->Tokenize($response," ")!="+OK") + return($this->SetError("Could not get the statistics: ".$this->Tokenize("\r\n"))); + $messages=$this->Tokenize(" "); + $size=$this->Tokenize(" "); + return(""); + } + + /* ListMessages method - the $message argument indicates the number of a + message to be listed. If you specify an empty string it will list all + messages in the mail box. The $unique_id flag indicates if you want + to list the each message unique identifier, otherwise it will + return the size of each message listed. If you list all messages the + result will be returned in an array. */ + + Function ListMessages($message,$unique_id) + { + if($this->state!="TRANSACTION") + return($this->SetError("connection is not in TRANSACTION state")); + if($unique_id) + $list_command="UIDL"; + else + $list_command="LIST"; + if($this->PutLine("$list_command".($message ? " ".$message : ""))==0) + return($this->SetError("Could not send the $list_command command")); + $response=$this->GetLine(); + if(GetType($response)!="string") + return($this->SetError("Could not get message list command response")); + if($this->Tokenize($response," ")!="+OK") + return($this->SetError("Could not get the message listing: ".$this->Tokenize("\r\n"))); + if($message=="") + { + for($messages=array();;) + { + $response=$this->GetLine(); + if(GetType($response)!="string") + return($this->SetError("Could not get message list response")); + if($response==".") + break; + $message=intval($this->Tokenize($response," ")); + if($unique_id) + $messages[$message]=$this->Tokenize(" "); + else + $messages[$message]=intval($this->Tokenize(" ")); + } + return($messages); + } + else + { + $message=intval($this->Tokenize(" ")); + $value=$this->Tokenize(" "); + return($unique_id ? $value : intval($value)); + } + } + + /* RetrieveMessage method - the $message argument indicates the number of + a message to be listed. Pass a reference variables that will hold the + arrays of the $header and $body lines. The $lines argument tells how + many lines of the message are to be retrieved. Pass a negative number + if you want to retrieve the whole message. */ + + Function RetrieveMessage($message,&$headers,&$body,$lines) + { + if($this->state!="TRANSACTION") + return($this->SetError("connection is not in TRANSACTION state")); + if($lines<0) + { + $command="RETR"; + $arguments="$message"; + } + else + { + $command="TOP"; + $arguments="$message $lines"; + } + if($this->PutLine("$command $arguments")==0) + return($this->SetError("Could not send the $command command")); + $response=$this->GetLine(); + if(GetType($response)!="string") + return($this->SetError("Could not get message retrieval command response")); + if($this->Tokenize($response," ")!="+OK") + return($this->SetError("Could not retrieve the message: ".$this->Tokenize("\r\n"))); + for($headers=$body=array(),$line=0;;) + { + $response=$this->GetLine(); + if(GetType($response)!="string") + return($this->SetError("Could not retrieve the message")); + switch($response) + { + case ".": + return(""); + case "": + break 2; + default: + if(substr($response,0,1)==".") + $response=substr($response,1,strlen($response)-1); + break; + } + if($this->join_continuation_header_lines + && $line>0 + && ($response[0]=="\t" + || $response[0]==" ")) + $headers[$line-1].=$response; + else + { + $headers[$line]=$response; + $line++; + } + } + for($line=0;;$line++) + { + $response=$this->GetLine(); + if(GetType($response)!="string") + return($this->SetError("Could not retrieve the message")); + switch($response) + { + case ".": + return(""); + default: + if(substr($response,0,1)==".") + $response=substr($response,1,strlen($response)-1); + break; + } + $body[$line]=$response; + } + return(""); + } + + /* OpenMessage method - the $message argument indicates the number of + a message to be opened. The $lines argument tells how many lines of + the message are to be retrieved. Pass a negative number if you want + to retrieve the whole message. */ + + Function OpenMessage($message, $lines=-1) + { + if($this->state!="TRANSACTION") + return($this->SetError("connection is not in TRANSACTION state")); + if($lines<0) + { + $command="RETR"; + $arguments="$message"; + } + else + { + $command="TOP"; + $arguments="$message $lines"; + } + if($this->PutLine("$command $arguments")==0) + return($this->SetError("Could not send the $command command")); + $response=$this->GetLine(); + if(GetType($response)!="string") + return($this->SetError("Could not get message retrieval command response")); + if($this->Tokenize($response," ")!="+OK") + return($this->SetError("Could not retrieve the message: ".$this->Tokenize("\r\n"))); + $this->state="GETMESSAGE"; + $this->message_buffer=""; + return(""); + } + + /* GetMessage method - the $count argument indicates the number of bytes + to be read from an opened message. The $message returns by reference + the data read from the message. The $end_of_message argument returns + by reference a boolean value indicated whether it was reached the end + of the message. */ + + Function GetMessage($count, &$message, &$end_of_message) + { + if($this->state!="GETMESSAGE") + return($this->SetError("connection is not in GETMESSAGE state")); + $message=""; + $end_of_message=0; + while($count>strlen($this->message_buffer) + && !$end_of_message) + { + $response=$this->GetLine(); + if(GetType($response)!="string") + return($this->SetError("Could not retrieve the message headers")); + if(!strcmp($response,".")) + { + $end_of_message=1; + $this->state="TRANSACTION"; + break; + } + else + { + if(substr($response,0,1)==".") + $response=substr($response,1,strlen($response)-1); + $this->message_buffer.=$response."\r\n"; + } + } + if($end_of_message + || $count>=strlen($this->message_buffer)) + { + $message=$this->message_buffer; + $this->message_buffer=""; + } + else + { + $message=substr($this->message_buffer, 0, $count); + $this->message_buffer=substr($this->message_buffer, $count); + } + return(""); + } + + /* DeleteMessage method - the $message argument indicates the number of + a message to be marked as deleted. Messages will only be effectively + deleted upon a successful call to the Close method. */ + + Function DeleteMessage($message) + { + if($this->state!="TRANSACTION") + return($this->SetError("connection is not in TRANSACTION state")); + if($this->PutLine("DELE $message")==0) + return($this->SetError("Could not send the DELE command")); + $response=$this->GetLine(); + if(GetType($response)!="string") + return($this->SetError("Could not get message delete command response")); + if($this->Tokenize($response," ")!="+OK") + return($this->SetError("Could not delete the message: ".$this->Tokenize("\r\n"))); + $this->must_update=1; + return(""); + } + + /* ResetDeletedMessages method - Reset the list of marked to be deleted + messages. No messages will be marked to be deleted upon a successful + call to this method. */ + + Function ResetDeletedMessages() + { + if($this->state!="TRANSACTION") + return($this->SetError("connection is not in TRANSACTION state")); + if($this->PutLine("RSET")==0) + return($this->SetError("Could not send the RSET command")); + $response=$this->GetLine(); + if(GetType($response)!="string") + return($this->SetError("Could not get reset deleted messages command response")); + if($this->Tokenize($response," ")!="+OK") + return($this->SetError("Could not reset deleted messages: ".$this->Tokenize("\r\n"))); + $this->must_update=0; + return(""); + } + + /* IssueNOOP method - Just pings the server to prevent it auto-close the + connection after an idle timeout (tipically 10 minutes). Not very + useful for most likely uses of this class. It's just here for + protocol support completeness. */ + + Function IssueNOOP() + { + if($this->state!="TRANSACTION") + return($this->SetError("connection is not in TRANSACTION state")); + if($this->PutLine("NOOP")==0) + return($this->SetError("Could not send the NOOP command")); + $response=$this->GetLine(); + if(GetType($response)!="string") + return($this->SetError("Could not NOOP command response")); + if($this->Tokenize($response," ")!="+OK") + return($this->SetError("Could not issue the NOOP command: ".$this->Tokenize("\r\n"))); + return(""); + } + + Function &SetConnection($set, &$current_name, &$pop3) + { + static $connections = array(); + + if($set>0) + { + $current_name = strval(count($connections)); + $connections[$current_name] = &$pop3; + } + elseif($set<0) + { + $connections[$current_name] = ''; + $current_name = ''; + } + elseif(IsSet($connections[$current_name]) + && GetType($connections[$current_name])!='string') + { + $connection = &$connections[$current_name]; + return($connection); + } + return($pop3); + } + + /* GetConnectionName method - Retrieve the name associated to an + established POP3 server connection to use as virtual host name for + use in POP3 stream wrapper URLs. */ + Function GetConnectionName(&$connection_name) + { + if($this->state!="TRANSACTION") + return($this->SetError("cannot get the name of a POP3 connection that was not established and the user has logged in")); + if(strlen($this->connection_name) == 0) + pop3_class::SetConnection(1, $this->connection_name, $this); + $connection_name = $this->connection_name; + return(''); + } +}; + +class pop3_stream +{ + var $opened = 0; + var $report_errors = 1; + var $read = 0; + var $buffer = ""; + var $end_of_message=1; + var $previous_connection = 0; + var $pop3; + + Function SetError($error) + { + if($this->report_errors) + trigger_error($error); + return(FALSE); + } + + Function ParsePath($path, &$url) + { + if(!$this->previous_connection) + { + if(IsSet($url["host"])) + $this->pop3->hostname=$url["host"]; + if(IsSet($url["port"])) + $this->pop3->port=intval($url["port"]); + if(IsSet($url["scheme"]) + && !strcmp($url["scheme"],"pop3s")) + $this->pop3->tls=1; + if(!IsSet($url["user"])) + return($this->SetError("it was not specified a valid POP3 user")); + if(!IsSet($url["pass"])) + return($this->SetError("it was not specified a valid POP3 password")); + if(!IsSet($url["path"])) + return($this->SetError("it was not specified a valid mailbox path")); + } + if(IsSet($url["query"])) + { + parse_str($url["query"],$query); + if(IsSet($query["debug"])) + $this->pop3->debug = intval($query["debug"]); + if(IsSet($query["html_debug"])) + $this->pop3->html_debug = intval($query["html_debug"]); + if(!$this->previous_connection) + { + if(IsSet($query["tls"])) + $this->pop3->tls = intval($query["tls"]); + if(IsSet($query["realm"])) + $this->pop3->realm = UrlDecode($query["realm"]); + if(IsSet($query["workstation"])) + $this->pop3->workstation = UrlDecode($query["workstation"]); + if(IsSet($query["authentication_mechanism"])) + $this->pop3->realm = UrlDecode($query["authentication_mechanism"]); + } + if(IsSet($query["quit_handshake"])) + $this->pop3->quit_handshake = intval($query["quit_handshake"]); + } + return(TRUE); + } + + Function stream_open($path, $mode, $options, &$opened_path) + { + $this->report_errors = (($options & STREAM_REPORT_ERRORS) !=0); + if(strcmp($mode, "r")) + return($this->SetError("the message can only be opened for reading")); + $url=parse_url($path); + $host = $url['host']; + $pop3 = &pop3_class::SetConnection(0, $host, $this->pop3); + if(IsSet($pop3)) + { + $this->pop3 = &$pop3; + $this->previous_connection = 1; + } + else + $this->pop3=new pop3_class; + if(!$this->ParsePath($path, $url)) + return(FALSE); + $message=substr($url["path"],1); + if(strcmp(intval($message), $message) + || $message<=0) + return($this->SetError("it was not specified a valid message to retrieve")); + if(!$this->previous_connection) + { + if(strlen($error=$this->pop3->Open())) + return($this->SetError($error)); + $this->opened = 1; + $apop = (IsSet($url["query"]["apop"]) ? intval($url["query"]["apop"]) : 0); + if(strlen($error=$this->pop3->Login(UrlDecode($url["user"]), UrlDecode($url["pass"]),$apop))) + { + $this->stream_close(); + return($this->SetError($error)); + } + } + if(strlen($error=$this->pop3->OpenMessage($message,-1))) + { + $this->stream_close(); + return($this->SetError($error)); + } + $this->end_of_message=FALSE; + if($options & STREAM_USE_PATH) + $opened_path=$path; + $this->read = 0; + $this->buffer = ""; + return(TRUE); + } + + Function stream_eof() + { + if($this->read==0) + return(FALSE); + return($this->end_of_message); + } + + Function stream_read($count) + { + if($count<=0) + return($this->SetError("it was not specified a valid length of the message to read")); + if($this->end_of_message) + return(""); + if(strlen($error=$this->pop3->GetMessage($count, $read, $this->end_of_message))) + return($this->SetError($error)); + $this->read += strlen($read); + return($read); + } + + Function stream_close() + { + while(!$this->end_of_message) + $this->stream_read(8000); + if($this->opened) + { + $this->pop3->Close(); + $this->opened = 0; + } + } +}; + +?> \ No newline at end of file diff --git a/includes/pop3/rfc822_addresses.php b/includes/pop3/rfc822_addresses.php new file mode 100644 index 0000000000..293c789ce6 --- /dev/null +++ b/includes/pop3/rfc822_addresses.php @@ -0,0 +1,903 @@ + + + + net.manuellemos.mimeparser + + @(#) $Id: rfc822_addresses.php,v 1.13 2010/04/08 20:09:23 mlemos Exp $ + Copyright © (C) Manuel Lemos 2006 - 2008 + RFC 822 e-mail addresses parser + Manuel Lemos + mlemos-at-acm.org + + + en + Parse e-mail addresses from headers of + http://www.ietf.org/rfc/rfc822.txt + RFC 822 + compliant e-mail messages. + Use the function ParseAddressList + function to retrieve the list of e-mail addresses contained in + e-mail message headers like From, To, Cc + or Bcc. + + +{/metadocument} +*/ + +class rfc822_addresses_class +{ + /* Private variables */ + + var $v = ''; + + /* Public variables */ + +/* +{metadocument} + + error + STRING + + + Store the message that is returned when an error + occurs. + Check this variable to understand what happened when a call to + any of the class functions has failed. + This class uses cumulative error handling. This means that if one + class functions that may fail is called and this variable was + already set to an error message due to a failure in a previous call + to the same or other function, the function will also fail and does + not do anything. + This allows programs using this class to safely call several + functions that may fail and only check the failure condition after + the last function call. + Just set this variable to an empty string to clear the error + condition. + + +{/metadocument} +*/ + var $error = ''; + +/* +{metadocument} + + error_position + INTEGER + -1 + + Point to the position of the message data or file that + refers to the last error that occurred. + Check this variable to determine the relevant position of the + message when a parsing error occurs. + + +{/metadocument} +*/ + var $error_position = -1; + +/* +{metadocument} + + ignore_syntax_errors + BOOLEAN + 1 + + Specify whether the class should ignore syntax errors in + malformed addresses. + Set this variable to 0 if it is + necessary to verify whether message data may be corrupted due to + to eventual bugs in the program that generated the + message. + Currently the class only ignores some types of syntax errors. + Other syntax errors may still cause the + ParseAddressList to fail. + + +{/metadocument} +*/ + var $ignore_syntax_errors=1; + +/* +{metadocument} + + warnings + HASH + + + Return a list of positions of the original message that + contain syntax errors. + Check this variable to retrieve eventual message syntax + errors that were ignored when the + ignore_syntax_errors is set to + 1. + The indexes of this array are the positions of the errors. The + array values are the corresponding syntax error messages. + + +{/metadocument} +*/ + var $warnings=array(); + + /* Private functions */ + + Function SetError($error) + { + $this->error = $error; + return(0); + } + + Function SetPositionedError($error, $position) + { + $this->error_position = $position; + return($this->SetError($error)); + } + + Function SetWarning($warning, $position) + { + $this->warnings[$position]=$warning; + return(1); + } + + Function SetPositionedWarning($error, $position) + { + if(!$this->ignore_syntax_errors) + return($this->SetPositionedError($error, $position)); + return($this->SetWarning($error, $position)); + } + + Function QDecode($p, &$value, &$encoding) + { + $encoding = $charset = null; + $s = 0; + $decoded = ''; + $l = strlen($value); + while($s < $l) + { + if(GetType($q = strpos($value, '=?', $s)) != 'integer') + { + if($s == 0) + return(1); + if($s < $l) + $decoded .= substr($value, $s); + break; + } + if($s < $q) + $decoded .= substr($value, $s, $q - $s); + $q += 2; + if(GetType($c = strpos($value, '?', $q)) != 'integer' + || $q == $c) + return($this->SetPositionedWarning('invalid Q-encoding character set', $p + $q)); + if(IsSet($charset)) + { + $another_charset = strtolower(substr($value, $q, $c - $q)); + if(strcmp($charset, $another_charset) + && strcmp($another_charset, 'ascii')) + return($this->SetWarning('it is not possible to decode an encoded value using mixed character sets into a single value', $p + $q)); + } + else + { + $charset = strtolower(substr($value, $q, $c - $q)); + if(!strcmp($charset, 'ascii')) + $charset = null; + } + ++$c; + if(GetType($t = strpos($value, '?', $c)) != 'integer' + || $c==$t) + return($this->SetPositionedWarning('invalid Q-encoding type', $p + $c)); + $type = strtolower(substr($value, $c, $t - $c)); + ++$t; + if(GetType($e = strpos($value, '?=', $t)) != 'integer') + return($this->SetPositionedWarning('invalid Q-encoding encoded data', $p + $e)); + switch($type) + { + case 'q': + for($s = $t; $s<$e;) + { + switch($b = $value[$s]) + { + case '=': + $h = HexDec($hex = strtolower(substr($value, $s + 1, 2))); + if($s + 3 > $e + || strcmp(sprintf('%02x', $h), $hex)) + return($this->SetPositionedWarning('invalid Q-encoding q encoded data', $p + $s)); + $decoded .= chr($h); + $s += 3; + break; + + case '_': + $decoded .= ' '; + ++$s; + break; + + default: + $decoded .= $b; + ++$s; + } + } + break; + + case 'b': + if($e <= $t + || strlen($binary = base64_decode($data = substr($value, $t, $e - $t))) == 0 + || GetType($binary) != 'string') + return($this->SetPositionedWarning('invalid Q-encoding b encoded data', $p + $t)); + $decoded .= $binary; + $s = $e; + break; + + default: + return($this->SetPositionedWarning('Q-encoding '.$type.' is not yet supported', $p + $c)); + } + $s += 2; + } + $value = $decoded; + $encoding = $charset; + return(1); + } + + Function ParseCText(&$p, &$c_text) + { + $c_text = null; + $v = $this->v; + if($pv; + if($p>strlen($v) + || GetType(strchr("\t\r\n \"\\\0", $c = $v[$p])) == 'string') + return(1); + if(Ord($c) >= 128) + { + if(!$this->ignore_syntax_errors) + return(1); + $this->SetPositionedWarning('it was used an unencoded 8 bit character', $p); + } + $q_text = $c; + ++$p; + return(1); + } + + Function ParseQuotedPair(&$p, &$quoted_pair) + { + $quoted_pair = null; + $v = $this->v; + $l = strlen($v); + if($p+1 < $l + && !strcmp($v[$p], '\\') + && GetType(strchr("\r\n\0", $c = $v[$p + 1])) != 'string' + && Ord($c)<128) + { + $quoted_pair = $c; + $p += 2; + } + return(1); + } + + Function ParseCContent(&$p, &$c_content) + { + $c_content = null; + $c = $p; + if(!$this->ParseQuotedPair($c, $content)) + return(0); + if(!IsSet($content)) + { + if(!$this->ParseCText($c, $content)) + return(0); + if(!IsSet($content)) + { + if(!$this->ParseComment($c, $content)) + return(0); + if(!IsSet($content)) + return(1); + } + } + $c_content = $content; + $p = $c; + return(1); + } + + Function SkipWhiteSpace(&$p) + { + $v = $this->v; + $l = strlen($v); + for(;$p<$l; ++$p) + { + switch($v[$p]) + { + case ' ': + case "\n": + case "\r": + case "\t": + break; + default: + return(1); + } + } + return(1); + } + + Function ParseComment(&$p, &$comment) + { + $comment = null; + $v = $this->v; + $l = strlen($v); + $c = $p; + if($c >= $l + || strcmp($v[$c], '(')) + return(1); + ++$c; + for(; $c < $l;) + { + if(!$this->SkipWhiteSpace($c)) + return(0); + if(!$this->ParseCContent($c, $c_content)) + return(0); + if(!IsSet($c_content)) + break; + } + if(!$this->SkipWhiteSpace($c)) + return(0); + if($c >= $l + || strcmp($v[$c], ')')) + return(1); + ++$c; + $comment = substr($v, $p, $c - $p); + $p = $c; + return(1); + } + + Function SkipCommentGetWhiteSpace(&$p, &$space) + { + $v = $this->v; + $l = strlen($v); + for($space = '';$p<$l;) + { + switch($w = $v[$p]) + { + case ' ': + case "\n": + case "\r": + case "\t": + ++$p; + $space .= $w; + break; + case '(': + if(!$this->ParseComment($p, $comment)) + return(0); + default: + return(1); + } + } + return(1); + } + + Function SkipCommentWhiteSpace(&$p) + { + $v = $this->v; + $l = strlen($v); + for(;$p<$l;) + { + switch($w = $v[$p]) + { + case ' ': + case "\n": + case "\r": + case "\t": + ++$p; + break; + case '(': + if(!$this->ParseComment($p, $comment)) + return(0); + default: + return(1); + } + } + return(1); + } + + Function ParseQContent(&$p, &$q_content) + { + $q_content = null; + $q = $p; + if(!$this->ParseQuotedPair($q, $content)) + return(0); + if(!IsSet($content)) + { + if(!$this->ParseQText($q, $content)) + return(0); + if(!IsSet($content)) + return(1); + } + $q_content = $content; + $p = $q; + return(1); + } + + Function ParseAtom(&$p, &$atom, $dot) + { + $atom = null; + $v = $this->v; + $l = strlen($v); + $a = $p; + if(!$this->SkipCommentGetWhiteSpace($a, $space)) + return(0); + $match = '/^([-'.($dot ? '.' : '').'A-Za-z0-9!#$&\'*+\\/=?^_{|}~]+)/'; + for($s = $a;$a < $l;) + { + if(preg_match($match, substr($this->v, $a), $m)) + $a += strlen($m[1]); + elseif(Ord($v[$a]) < 128) + break; + elseif(!$this->SetPositionedWarning('it was used an unencoded 8 bit character', $a)) + return(0); + else + ++$a; + } + if($s == $a) + return(1); + $atom = $space.substr($this->v, $s, $a - $s); + if(!$this->SkipCommentGetWhiteSpace($a, $space)) + return(0); + $atom .= $space; + $p = $a; + return(1); + } + + Function ParseQuotedString(&$p, &$quoted_string) + { + $quoted_string = null; + $v = $this->v; + $l = strlen($v); + $s = $p; + if(!$this->SkipCommentWhiteSpace($s)) + return(0); + if($s >= $l + || strcmp($v[$s], '"')) + return(1); + ++$s; + for($string = '';$s < $l;) + { + $w = $s; + if(!$this->SkipWhiteSpace($s)) + return(0); + if($w != $s) + $string .= substr($v, $w, $s - $w); + if(!$this->ParseQContent($s, $q_content)) + return(0); + if(!IsSet($q_content)) + break; + $string .= $q_content; + } + $w = $s; + if(!$this->SkipWhiteSpace($s)) + return(0); + if($w != $s) + $string .= substr($v, $w, $s - $w); + if($s >= $l + || strcmp($v[$s], '"')) + return(1); + ++$s; + if(!$this->SkipCommentWhiteSpace($s)) + return(0); + $quoted_string = $string; + $p = $s; + return(1); + } + + Function ParseWord(&$p, &$word) + { + $word = null; + if(!$this->ParseQuotedString($p, $word)) + return(0); + if(IsSet($word)) + return(1); + if(!$this->ParseAtom($p, $word, 0)) + return(0); + return(1); + } + + Function ParseObsPhrase(&$p, &$obs_phrase) + { + $obs_phrase = null; + $v = $this->v; + $l = strlen($v); + $ph = $p; + if(!$this->ParseWord($ph, $word)) + return(0); + $string = $word; + for(;;) + { + if(!$this->ParseWord($ph, $word)) + return(0); + if(IsSet($word)) + { + $string .= $word; + continue; + } + $w = $ph; + if(!$this->SkipCommentGetWhiteSpace($ph, $space)) + return(0); + if($w != $ph) + { + $string .= $space; + continue; + } + if($ph >= $l + || strcmp($v[$ph], '.')) + break; + $string .= '.'; + ++$ph; + } + $obs_phrase = $string; + $p = $ph; + return(1); + } + + Function ParsePhrase(&$p, &$phrase) + { + $phrase = null; + if(!$this->ParseObsPhrase($p, $phrase)) + return(0); + if(IsSet($phrase)) + return(1); + $ph = $p; + if(!$this->ParseWord($ph, $word)) + return(0); + $string = $word; + for(;;) + { + if(!$this->ParseWord($ph, $word)) + return(0); + if(!IsSet($word)) + break; + $string .= $word; + } + $phrase = $string; + $p = $ph; + return(1); + } + + Function ParseAddrSpec(&$p, &$addr_spec) + { + $addr_spec = null; + $v = $this->v; + $l = strlen($v); + $a = $p; + if(!$this->ParseQuotedString($a, $local_part)) + return(0); + if(!IsSet($local_part)) + { + if(!$this->ParseAtom($a, $local_part, 1)) + return(0); + $local_part = trim($local_part); + } + if($a >= $l + || strcmp($v[$a], '@')) + return(1); + ++$a; + if(!$this->ParseAtom($a, $domain, 1)) + return(0); + if(!IsSet($domain)) + return(1); + $addr_spec = $local_part.'@'.trim($domain); + $p = $a; + return(1); + } + + Function ParseAngleAddr(&$p, &$addr) + { + $addr = null; + $v = $this->v; + $l = strlen($v); + $a = $p; + if(!$this->SkipCommentWhiteSpace($a)) + return(0); + if($a >= $l + || strcmp($v[$a], '<')) + return(1); + ++$a; + if(!$this->ParseAddrSpec($a, $addr_spec)) + return(0); + if($a >= $l + || strcmp($v[$a], '>')) + return(1); + ++$a; + if(!$this->SkipCommentWhiteSpace($a)) + return(0); + $addr = $addr_spec; + $p = $a; + return(1); + } + + Function ParseName(&$p, &$address) + { + $address = null; + $a = $p; + if(!$this->ParsePhrase($a, $display_name)) + return(0); + if(IsSet($display_name)) + { + if(!$this->QDecode($p, $display_name, $encoding)) + return(0); + $address['name'] = trim($display_name); + if(IsSet($encoding)) + $address['encoding'] = $encoding; + } + $p = $a; + return(1); + } + + Function ParseNameAddr(&$p, &$address) + { + $address = null; + $a = $p; + if(!$this->ParsePhrase($a, $display_name)) + return(0); + if(!$this->ParseAngleAddr($a, $addr)) + return(0); + if(!IsSet($addr)) + return(1); + $address = array('address'=>$addr); + if(IsSet($display_name)) + { + if(!$this->QDecode($p, $display_name, $encoding)) + return(0); + $address['name'] = trim($display_name); + if(IsSet($encoding)) + $address['encoding'] = $encoding; + } + $p = $a; + return(1); + } + + Function ParseAddrNameAddr(&$p, &$address) + { + $address = null; + $a = $p; + if(!$this->ParseAddrSpec($a, $display_name)) + return(0); + if(!IsSet($display_name)) + return(1); + if(!$this->ParseAngleAddr($a, $addr)) + return(0); + if(!IsSet($addr)) + return(1); + if(!$this->QDecode($p, $display_name, $encoding)) + return(0); + $address = array( + 'address'=>$addr, + 'name' => trim($display_name) + ); + if(IsSet($encoding)) + $address['encoding'] = $encoding; + $p = $a; + return(1); + } + + Function ParseMailbox(&$p, &$address) + { + $address = null; + if($this->ignore_syntax_errors) + { + $a = $p; + if(!$this->ParseAddrNameAddr($p, $address)) + return(0); + if(IsSet($address)) + return($this->SetPositionedWarning('it was specified an unquoted address as name', $a)); + } + if(!$this->ParseNameAddr($p, $address)) + return(0); + if(IsSet($address)) + return(1); + if(!$this->ParseAddrSpec($p, $addr_spec)) + return(0); + if(IsSet($addr_spec)) + { + $address = array('address'=>$addr_spec); + return(1); + } + $a = $p; + if($this->ignore_syntax_errors + && $this->ParseName($p, $address) + && IsSet($address)) + return($this->SetPositionedWarning('it was specified a name without an address', $a)); + return(1); + } + + Function ParseMailboxGroup(&$p, &$mailbox_group) + { + $v = $this->v; + $l = strlen($v); + $g = $p; + if(!$this->ParseMailbox($g, $address)) + return(0); + if(!IsSet($address)) + return(1); + $addresses = array($address); + for(;$g < $l;) + { + if(strcmp($v[$g], ',')) + break; + ++$g; + if(!$this->ParseMailbox($g, $address)) + return(0); + if(!IsSet($address)) + return(1); + $addresses[] = $address; + } + $mailbox_group = $addresses; + $p = $g; + return(1); + } + + Function ParseGroup(&$p, &$address) + { + $address = null; + $v = $this->v; + $l = strlen($v); + $g = $p; + if(!$this->ParsePhrase($g, $display_name)) + return(0); + if(!IsSet($display_name) + || $g >= $l + || strcmp($v[$g], ':')) + return(1); + ++$g; + if(!$this->ParseMailboxGroup($g, $mailbox_group)) + return(0); + if(!IsSet($mailbox_group)) + { + if(!$this->SkipCommentWhiteSpace($g)) + return(0); + $mailbox_group = array(); + } + if($g >= $l + || strcmp($v[$g], ';')) + return(1); + $c = ++$g; + if($this->SkipCommentWhiteSpace($g) + && $g > $c + && !$this->SetPositionedWarning('it were used invalid comments after a group of addresses', $c)) + return(0); + if(!$this->QDecode($p, $display_name, $encoding)) + return(0); + $address = array( + 'name'=>$display_name, + 'group'=>$mailbox_group + ); + if(IsSet($encoding)) + $address['encoding'] = $encoding; + $p = $g; + return(1); + } + + Function ParseAddress(&$p, &$address) + { + $address = null; + if(!$this->ParseGroup($p, $address)) + return(0); + if(!IsSet($address)) + { + if(!$this->ParseMailbox($p, $address)) + return(0); + } + return(1); + } + + /* Public functions */ + +/* +{metadocument} + + ParseAddressList + BOOLEAN + + Parse and extract e-mail addresses eventually from headers + of an e-mail message. + Pass a string value with a list of e-mail addresses to the + + ParseAddressList + value + . The + ParseAddressList + addresses + returns the list of e-mail addresses found. + This function returns 1 if + the specified value is parsed successfully. Otherwise, + check the variables error and + error_position to determine what + error occurred and the relevant value position. + + + value + STRING + + String with a list of e-mail addresses to parse. + + + + addresses + ARRAY + + + Return the list of parsed e-mail addresses. + Each entry in the list is an associative array. + For normal addresses, this associative array has the entry + address set to the e-mail address. + If the address has an associated name, it is stored in the + entry name. + For address groups, there is the entry + name. + The group addresses list are stored in the entry + group as an array. The structure of + the group addresses list array is the same as this addresses + list array argument. + + + +{/metadocument} +*/ + Function ParseAddressList($value, &$addresses) + { + $this->warnings = array(); + $addresses = array(); + $this->v = $v = $value; + $l = strlen($v); + $p = 0; + if(!$this->ParseAddress($p, $address)) + return(0); + if(!IsSet($address)) + return($this->SetPositionedError('it was not specified a valid address', $p)); + $addresses[] = $address; + while($p < $l) + { + if(strcmp($v[$p], ',') + && !$this->SetPositionedWarning('multiple addresses must be separated by commas: ', $p)) + return(0); + ++$p; + if(!$this->ParseAddress($p, $address)) + return(0); + if(!IsSet($address)) + return($this->SetPositionedError('it was not specified a valid address after comma', $p)); + $addresses[] = $address; + } + return(1); + } +/* +{metadocument} + + +{/metadocument} +*/ + +}; + +/* + +{metadocument} + +{/metadocument} + +*/ + +?> \ No newline at end of file diff --git a/includes/qr/qrcode.php b/includes/qr/qrcode.php new file mode 100644 index 0000000000..e36e6aa2e3 --- /dev/null +++ b/includes/qr/qrcode.php @@ -0,0 +1,1470 @@ +typeNumber = 1; + $this->errorCorrectLevel = QR_ERROR_CORRECT_LEVEL_H; + $this->qrDataList = array(); + } + + function getTypeNumber() { + return $this->typeNumber; + } + + function setTypeNumber($typeNumber) { + $this->typeNumber = $typeNumber; + } + + function getErrorCorrectLevel() { + return $this->errorCorrectLevel; + } + + function setErrorCorrectLevel($errorCorrectLevel) { + $this->errorCorrectLevel = $errorCorrectLevel; + } + + function addData($data, $mode = 0) { + + if ($mode == 0) { + $mode = QRUtil::getMode($data); + } + + switch($mode) { + case QR_MODE_NUMBER : + $this->addDataImpl(new QRNumber($data) ); + break; + + case QR_MODE_ALPHA_NUM : + $this->addDataImpl(new QRAlphaNum($data) ); + break; + + case QR_MODE_8BIT_BYTE : + $this->addDataImpl(new QR8BitByte($data) ); + break; + + case QR_MODE_KANJI : + $this->addDataImpl(new QRKanji($data) ); + break; + + default : + trigger_error("mode:$mode", E_USER_ERROR); + } + } + + function clearData() { + $qrDataList = array(); + } + + function addDataImpl(&$qrData) { + $this->qrDataList[] = $qrData; + } + + function getDataCount() { + return count($this->qrDataList); + } + + function getData($index) { + return $this->qrDataList[$index]; + } + + function isDark($row, $col) { + if ($this->modules[$row][$col] !== null) { + return $this->modules[$row][$col]; + } else { + return false; + } + } + + function getModuleCount() { + return $this->moduleCount; + } + + function make() { + $this->makeImpl(false, $this->getBestMaskPattern() ); + } + + function getBestMaskPattern() { + $minLostPoint = 0; + $pattern = 0; + for ($i = 0; $i < 8; $i++) { + $this->makeImpl(true, $i); + $lostPoint = QRUtil::getLostPoint($this); + if ($i == 0 || $minLostPoint > $lostPoint) { + $minLostPoint = $lostPoint; + $pattern = $i; + } + } + return $pattern; + } + + function createNullArray($length) { + $nullArray = array(); + for ($i = 0; $i < $length; $i++) { + $nullArray[] = null; + } + return $nullArray; + } + + function makeImpl($test, $maskPattern) { + $this->moduleCount = $this->typeNumber * 4 + 17; + + $this->modules = array(); + for ($i = 0; $i < $this->moduleCount; $i++) { + $this->modules[] = QRCode::createNullArray($this->moduleCount); + } + + $this->setupPositionProbePattern(0, 0); + $this->setupPositionProbePattern($this->moduleCount - 7, 0); + $this->setupPositionProbePattern(0, $this->moduleCount - 7); + $this->setupPositionAdjustPattern(); + $this->setupTimingPattern(); + $this->setupTypeInfo($test, $maskPattern); + if ($this->typeNumber >= 7) { + $this->setupTypeNumber($test); + } + $dataArray = $this->qrDataList; + + $data = QRCode::createData($this->typeNumber, $this->errorCorrectLevel, $dataArray); + + $this->mapData($data, $maskPattern); + } + + function mapData(&$data, $maskPattern) { + + $inc = -1; + $row = $this->moduleCount - 1; + $bitIndex = 7; + $byteIndex = 0; + + for ($col = $this->moduleCount - 1; $col > 0; $col -= 2) { + if ($col == 6) $col--; + while (true) { + for ($c = 0; $c < 2; $c++) { + if ($this->modules[$row][$col - $c] === null) { + $dark = false; + if ($byteIndex < count($data) ) { + $dark = ( ( ($data[$byteIndex] >> $bitIndex) & 1) == 1); + } + + $mask = QRUtil::getMask($maskPattern, $row, $col - $c); + + if ($mask) { + $dark = !$dark; + } + + $this->modules[$row][$col - $c] = $dark; + $bitIndex--; + + if ($bitIndex == -1) { + $byteIndex++; + $bitIndex = 7; + } + } + } + $row += $inc; + + if ($row < 0 || $this->moduleCount <= $row) { + $row -= $inc; + $inc = -$inc; + break; + } + } + } + } + + function setupPositionAdjustPattern() { + $pos = QRUtil::getPatternPosition($this->typeNumber); + for ($i = 0; $i < count($pos); $i++) { + for ($j = 0; $j < count($pos); $j++) { + $row = $pos[$i]; + $col = $pos[$j]; + + if ($this->modules[$row][$col] !== null) { + continue; + } + + for ($r = -2; $r <= 2; $r++) { + for ($c = -2; $c <= 2; $c++) { + if ($r == -2 || $r == 2 || $c == -2 || $c == 2 + || ($r == 0 && $c == 0) ) { + $this->modules[$row + $r][$col + $c] = true; + } else { + $this->modules[$row + $r][$col + $c] = false; + } + } + } + } + } + } + + function setupPositionProbePattern($row, $col) { + + for ($r = -1; $r <= 7; $r++) { + + for ($c = -1; $c <= 7; $c++) { + + if ($row + $r <= -1 || $this->moduleCount <= $row + $r + || $col + $c <= -1 || $this->moduleCount <= $col + $c) { + continue; + } + + if ( (0 <= $r && $r <= 6 && ($c == 0 || $c == 6) ) + || (0 <= $c && $c <= 6 && ($r == 0 || $r == 6) ) + || (2 <= $r && $r <= 4 && 2 <= $c && $c <= 4) ) { + $this->modules[$row + $r][$col + $c] = true; + } else { + $this->modules[$row + $r][$col + $c] = false; + } + } + } + } + + function setupTimingPattern() { + + for ($r = 8; $r < $this->moduleCount - 8; $r++) { + if ($this->modules[$r][6] !== null) { + continue; + } + $this->modules[$r][6] = ($r % 2 == 0); + } + + for ($c = 8; $c < $this->moduleCount - 8; $c++) { + if ($this->modules[6][$c] !== null) { + continue; + } + $this->modules[6][$c] = ($c % 2 == 0); + } + } + + function setupTypeNumber($test) { + + $bits = QRUtil::getBCHTypeNumber($this->typeNumber); + + for ($i = 0; $i < 18; $i++) { + $mod = (!$test && ( ($bits >> $i) & 1) == 1); + $this->modules[floor($i / 3)][$i % 3 + $this->moduleCount - 8 - 3] = $mod; + } + + for ($i = 0; $i < 18; $i++) { + $mod = (!$test && ( ($bits >> $i) & 1) == 1); + $this->modules[$i % 3 + $this->moduleCount - 8 - 3][floor($i / 3)] = $mod; + } + } + + function setupTypeInfo($test, $maskPattern) { + + $data = ($this->errorCorrectLevel << 3) | $maskPattern; + $bits = QRUtil::getBCHTypeInfo($data); + + for ($i = 0; $i < 15; $i++) { + + $mod = (!$test && ( ($bits >> $i) & 1) == 1); + + if ($i < 6) { + $this->modules[$i][8] = $mod; + } else if ($i < 8) { + $this->modules[$i + 1][8] = $mod; + } else { + $this->modules[$this->moduleCount - 15 + $i][8] = $mod; + } + } + + for ($i = 0; $i < 15; $i++) { + + $mod = (!$test && ( ($bits >> $i) & 1) == 1); + + if ($i < 8) { + $this->modules[8][$this->moduleCount - $i - 1] = $mod; + } else if ($i < 9) { + $this->modules[8][15 - $i - 1 + 1] = $mod; + } else { + $this->modules[8][15 - $i - 1] = $mod; + } + } + + $this->modules[$this->moduleCount - 8][8] = !$test; + } + + function createData($typeNumber, $errorCorrectLevel, $dataArray) { + + $rsBlocks = QRRSBlock::getRSBlocks($typeNumber, $errorCorrectLevel); + + $buffer = new QRBitBuffer(); + + for ($i = 0; $i < count($dataArray); $i++) { + $data = $dataArray[$i]; + $buffer->put($data->getMode(), 4); + $buffer->put($data->getLength(), $data->getLengthInBits($typeNumber) ); + $data->write($buffer); + } + + $totalDataCount = 0; + for ($i = 0; $i < count($rsBlocks); $i++) { + $totalDataCount += $rsBlocks[$i]->getDataCount(); + } +/* + if ($buffer->getLengthInBits() > $totalDataCount * 8) { + trigger_error("code length overflow. (" + . $buffer->getLengthInBits() + . ">" + . $totalDataCount * 8 + . ")", E_USER_ERROR); + } +*/ + // end code. + if ($buffer->getLengthInBits() + 4 <= $totalDataCount * 8) { + $buffer->put(0, 4); + } + + // padding + while ($buffer->getLengthInBits() % 8 != 0) { + $buffer->putBit(false); + } + + // padding + while (true) { + + if ($buffer->getLengthInBits() >= $totalDataCount * 8) { + break; + } + $buffer->put(QR_PAD0, 8); + + if ($buffer->getLengthInBits() >= $totalDataCount * 8) { + break; + } + $buffer->put(QR_PAD1, 8); + } + + return QRCode::createBytes($buffer, $rsBlocks); + } + + function createBytes(&$buffer, &$rsBlocks) { + + $offset = 0; + + $maxDcCount = 0; + $maxEcCount = 0; + + $dcdata = QRCode::createNullArray(count($rsBlocks) ); + $ecdata = QRCode::createNullArray(count($rsBlocks) ); + + for ($r = 0; $r < count($rsBlocks); $r++) { + + $dcCount = $rsBlocks[$r]->getDataCount(); + $ecCount = $rsBlocks[$r]->getTotalCount() - $dcCount; + + $maxDcCount = max($maxDcCount, $dcCount); + $maxEcCount = max($maxEcCount, $ecCount); + + $dcdata[$r] = QRCode::createNullArray($dcCount); + for ($i = 0; $i < count($dcdata[$r]); $i++) { + $bdata = $buffer->getBuffer(); + $dcdata[$r][$i] = 0xff & $bdata[$i + $offset]; + } + $offset += $dcCount; + + $rsPoly = QRUtil::getErrorCorrectPolynomial($ecCount); + $rawPoly = new QRPolynomial($dcdata[$r], $rsPoly->getLength() - 1); + + $modPoly = $rawPoly->mod($rsPoly); + $ecdata[$r] = QRCode::createNullArray($rsPoly->getLength() - 1); + for ($i = 0; $i < count($ecdata[$r]); $i++) { + $modIndex = $i + $modPoly->getLength() - count($ecdata[$r]); + $ecdata[$r][$i] = ($modIndex >= 0)? $modPoly->get($modIndex) : 0; + } + } + + $totalCodeCount = 0; + for ($i = 0; $i < count($rsBlocks); $i++) { + $totalCodeCount += $rsBlocks[$i]->getTotalCount(); + } + + $data = QRCode::createNullArray($totalCodeCount); + + $index = 0; + + for ($i = 0; $i < $maxDcCount; $i++) { + for ($r = 0; $r < count($rsBlocks); $r++) { + if ($i < count($dcdata[$r]) ) { + $data[$index++] = $dcdata[$r][$i]; + } + } + } + + for ($i = 0; $i < $maxEcCount; $i++) { + for ($r = 0; $r < count($rsBlocks); $r++) { + if ($i < count($ecdata[$r]) ) { + $data[$index++] = $ecdata[$r][$i]; + } + } + } + + return $data; + } + + function getMinimumQRCode($data, $errorCorrectLevel) { + + $mode = QRUtil::getMode($data); + + $qr = new QRCode(); + $qr->setErrorCorrectLevel($errorCorrectLevel); + $qr->addData($data, $mode); + + $qrData = $qr->getData(0); + $length = $qrData->getLength(); + + for ($typeNumber = 1; $typeNumber <= 10; $typeNumber++) { + if ($length <= QRUtil::getMaxLength($typeNumber, $mode, $errorCorrectLevel) ) { + $qr->setTypeNumber($typeNumber); + break; + } + } + + $qr->make(); + + return $qr; + } + + function createImage($size = 2, $margin = 2) { + + $image_size = $this->getModuleCount() * $size + $margin * 2; + + $image = imagecreatetruecolor($image_size, $image_size); + + $black = imagecolorallocate($image, 0, 0, 0); + $white = imagecolorallocate($image, 255, 255, 255); + + imagefilledrectangle($image, 0, 0, $image_size, $image_size, $white); + + for ($r = 0; $r < $this->getModuleCount(); $r++) { + for ($c = 0; $c < $this->getModuleCount(); $c++) { + if ($this->isDark($r, $c) ) { + + imagefilledrectangle($image, + $margin + $c * $size, + $margin + $r * $size, + $margin + ($c + 1) * $size - 1, + $margin + ($r + 1) * $size - 1, + $black); + } + } + } + + return $image; + } + + + function printHTML($size = "2px") { + + $style = "border-style:none;border-collapse:collapse;margin:0px;padding:0px;"; + + print(""); + + for ($r = 0; $r < $this->getModuleCount(); $r++) { + + print(""); + + for ($c = 0; $c < $this->getModuleCount(); $c++) { + $color = $this->isDark($r, $c)? "#000000" : "#ffffff"; + print(""); + } + + print(""); + } + + print("
      "); + } +} + +//--------------------------------------------------------------- +// QRUtil +//--------------------------------------------------------------- + +$QR_PATTERN_POSITION_TABLE = array( + array(), + array(6, 18), + array(6, 22), + array(6, 26), + array(6, 30), + array(6, 34), + array(6, 22, 38), + array(6, 24, 42), + array(6, 26, 46), + array(6, 28, 50), + array(6, 30, 54), + array(6, 32, 58), + array(6, 34, 62), + array(6, 26, 46, 66), + array(6, 26, 48, 70), + array(6, 26, 50, 74), + array(6, 30, 54, 78), + array(6, 30, 56, 82), + array(6, 30, 58, 86), + array(6, 34, 62, 90), + array(6, 28, 50, 72, 94), + array(6, 26, 50, 74, 98), + array(6, 30, 54, 78, 102), + array(6, 28, 54, 80, 106), + array(6, 32, 58, 84, 110), + array(6, 30, 58, 86, 114), + array(6, 34, 62, 90, 118), + array(6, 26, 50, 74, 98, 122), + array(6, 30, 54, 78, 102, 126), + array(6, 26, 52, 78, 104, 130), + array(6, 30, 56, 82, 108, 134), + array(6, 34, 60, 86, 112, 138), + array(6, 30, 58, 86, 114, 142), + array(6, 34, 62, 90, 118, 146), + array(6, 30, 54, 78, 102, 126, 150), + array(6, 24, 50, 76, 102, 128, 154), + array(6, 28, 54, 80, 106, 132, 158), + array(6, 32, 58, 84, 110, 136, 162), + array(6, 26, 54, 82, 110, 138, 166), + array(6, 30, 58, 86, 114, 142, 170) +); + +$QR_MAX_LENGTH = array( + array( array(41, 25, 17, 10), array(34, 20, 14, 8), array(27, 16, 11, 7), array(17, 10, 7, 4) ), + array( array(77, 47, 32, 20), array(63, 38, 26, 16), array(48, 29, 20, 12), array(34, 20, 14, 8) ), + array( array(127, 77, 53, 32), array(101, 61, 42, 26), array(77, 47, 32, 20), array(58, 35, 24, 15) ), + array( array(187, 114, 78, 48), array(149, 90, 62, 38), array(111, 67, 46, 28), array(82, 50, 34, 21) ), + array( array(255, 154, 106, 65), array(202, 122, 84, 52), array(144, 87, 60, 37), array(106, 64, 44, 27) ), + array( array(322, 195, 134, 82), array(255, 154, 106, 65), array(178, 108, 74, 45), array(139, 84, 58, 36) ), + array( array(370, 224, 154, 95), array(293, 178, 122, 75), array(207, 125, 86, 53), array(154, 93, 64, 39) ), + array( array(461, 279, 192, 118), array(365, 221, 152, 93), array(259, 157, 108, 66), array(202, 122, 84, 52) ), + array( array(552, 335, 230, 141), array(432, 262, 180, 111), array(312, 189, 130, 80), array(235, 143, 98, 60) ), + array( array(652, 395, 271, 167), array(513, 311, 213, 131), array(364, 221, 151, 93), array(288, 174, 119, 74) ) +); + + +define("QR_G15", (1 << 10) | (1 << 8) | (1 << 5) + | (1 << 4) | (1 << 2) | (1 << 1) | (1 << 0) ); + +define("QR_G18", (1 << 12) | (1 << 11) | (1 << 10) + | (1 << 9) | (1 << 8) | (1 << 5) | (1 << 2) | (1 << 0) ); + +define("QR_G15_MASK", (1 << 14) | (1 << 12) | (1 << 10) + | (1 << 4) | (1 << 1) ); + +class QRUtil { + + function getPatternPosition($typeNumber) { + global $QR_PATTERN_POSITION_TABLE; + return $QR_PATTERN_POSITION_TABLE[$typeNumber - 1]; + } + + function getMaxLength($typeNumber, $mode, $errorCorrectLevel) { + + global $QR_MAX_LENGTH; + + $t = $typeNumber - 1; + $e = 0; + $m = 0; + + switch($errorCorrectLevel) { + case QR_ERROR_CORRECT_LEVEL_L : $e = 0; break; + case QR_ERROR_CORRECT_LEVEL_M : $e = 1; break; + case QR_ERROR_CORRECT_LEVEL_Q : $e = 2; break; + case QR_ERROR_CORRECT_LEVEL_H : $e = 3; break; + default : + trigger_error("e:$errorCorrectLevel", E_USER_ERROR); + } + + switch($mode) { + case QR_MODE_NUMBER : $m = 0; break; + case QR_MODE_ALPHA_NUM : $m = 1; break; + case QR_MODE_8BIT_BYTE : $m = 2; break; + case QR_MODE_KANJI : $m = 3; break; + default : + trigger_error("m:$mode", E_USER_ERROR); + } + + return $QR_MAX_LENGTH[$t][$e][$m]; + } + + function getErrorCorrectPolynomial($errorCorrectLength) { + + $a = new QRPolynomial(array(1) ); + + for ($i = 0; $i < $errorCorrectLength; $i++) { + $a = $a->multiply(new QRPolynomial(array(1, QRMath::gexp($i) ) ) ); + } + + return $a; + } + + function getMask($maskPattern, $i, $j) { + + switch ($maskPattern) { + + case QR_MASK_PATTERN000 : return ($i + $j) % 2 == 0; + case QR_MASK_PATTERN001 : return $i % 2 == 0; + case QR_MASK_PATTERN010 : return $j % 3 == 0; + case QR_MASK_PATTERN011 : return ($i + $j) % 3 == 0; + case QR_MASK_PATTERN100 : return (floor($i / 2) + floor($j / 3) ) % 2 == 0; + case QR_MASK_PATTERN101 : return ($i * $j) % 2 + ($i * $j) % 3 == 0; + case QR_MASK_PATTERN110 : return ( ($i * $j) % 2 + ($i * $j) % 3) % 2 == 0; + case QR_MASK_PATTERN111 : return ( ($i * $j) % 3 + ($i + $j) % 2) % 2 == 0; + + default : + trigger_error("mask:$maskPattern", E_USER_ERROR); + } + } + + function getLostPoint($qrCode) { + + $moduleCount = $qrCode->getModuleCount(); + + $lostPoint = 0; + + + // LEVEL1 + + for ($row = 0; $row < $moduleCount; $row++) { + + for ($col = 0; $col < $moduleCount; $col++) { + + $sameCount = 0; + $dark = $qrCode->isDark($row, $col); + + for ($r = -1; $r <= 1; $r++) { + + if ($row + $r < 0 || $moduleCount <= $row + $r) { + continue; + } + + for ($c = -1; $c <= 1; $c++) { + + if ($col + $c < 0 || $moduleCount <= $col + $c) { + continue; + } + + if ($r == 0 && $c == 0) { + continue; + } + + if ($dark == $qrCode->isDark($row + $r, $col + $c) ) { + $sameCount++; + } + } + } + + if ($sameCount > 5) { + $lostPoint += (3 + $sameCount - 5); + } + } + } + + // LEVEL2 + + for ($row = 0; $row < $moduleCount - 1; $row++) { + for ($col = 0; $col < $moduleCount - 1; $col++) { + $count = 0; + if ($qrCode->isDark($row, $col ) ) $count++; + if ($qrCode->isDark($row + 1, $col ) ) $count++; + if ($qrCode->isDark($row, $col + 1) ) $count++; + if ($qrCode->isDark($row + 1, $col + 1) ) $count++; + if ($count == 0 || $count == 4) { + $lostPoint += 3; + } + } + } + + // LEVEL3 + + for ($row = 0; $row < $moduleCount; $row++) { + for ($col = 0; $col < $moduleCount - 6; $col++) { + if ($qrCode->isDark($row, $col) + && !$qrCode->isDark($row, $col + 1) + && $qrCode->isDark($row, $col + 2) + && $qrCode->isDark($row, $col + 3) + && $qrCode->isDark($row, $col + 4) + && !$qrCode->isDark($row, $col + 5) + && $qrCode->isDark($row, $col + 6) ) { + $lostPoint += 40; + } + } + } + + for ($col = 0; $col < $moduleCount; $col++) { + for ($row = 0; $row < $moduleCount - 6; $row++) { + if ($qrCode->isDark($row, $col) + && !$qrCode->isDark($row + 1, $col) + && $qrCode->isDark($row + 2, $col) + && $qrCode->isDark($row + 3, $col) + && $qrCode->isDark($row + 4, $col) + && !$qrCode->isDark($row + 5, $col) + && $qrCode->isDark($row + 6, $col) ) { + $lostPoint += 40; + } + } + } + + // LEVEL4 + + $darkCount = 0; + + for ($col = 0; $col < $moduleCount; $col++) { + for ($row = 0; $row < $moduleCount; $row++) { + if ($qrCode->isDark($row, $col) ) { + $darkCount++; + } + } + } + + $ratio = abs(100 * $darkCount / $moduleCount / $moduleCount - 50) / 5; + $lostPoint += $ratio * 10; + + return $lostPoint; + } + + function getMode($s) { + if (QRUtil::isAlphaNum($s) ) { + if (QRUtil::isNumber($s) ) { + return QR_MODE_NUMBER; + } + return QR_MODE_ALPHA_NUM; + } else if (QRUtil::isKanji($s) ) { + return QR_MODE_KANJI; + } else { + return QR_MODE_8BIT_BYTE; + } + } + + function isNumber($s) { + for ($i = 0; $i < strlen($s); $i++) { + $c = ord($s[$i]); + if (!(QRUtil::toCharCode('0') <= $c && $c <= QRUtil::toCharCode('9') ) ) { + return false; + } + } + return true; + } + + function isAlphaNum($s) { + for ($i = 0; $i < strlen($s); $i++) { + $c = ord($s[$i]); + if (!(QRUtil::toCharCode('0') <= $c && $c <= QRUtil::toCharCode('9') ) + && !(QRUtil::toCharCode('A') <= $c && $c <= QRUtil::toCharCode('Z') ) + && strpos(" $%*+-./:", $s[$i]) === false) { + return false; + } + } + return true; + } + + function isKanji($s) { + + $data = $s; + + $i = 0; + + while ($i + 1 < strlen($data) ) { + + $c = ( (0xff & ord($data[$i]) ) << 8) | (0xff & ord($data[$i + 1]) ); + + if (!(0x8140 <= $c && $c <= 0x9FFC) && !(0xE040 <= $c && $c <= 0xEBBF) ) { + return false; + } + + $i += 2; + } + + if ($i < strlen($data) ) { + return false; + } + + return true; + } + + function toCharCode($s) { + return ord($s[0]); + } + + function getBCHTypeInfo($data) { + $d = $data << 10; + while (QRUtil::getBCHDigit($d) - QRUtil::getBCHDigit(QR_G15) >= 0) { + $d ^= (QR_G15 << (QRUtil::getBCHDigit($d) - QRUtil::getBCHDigit(QR_G15) ) ); + } + return ( ($data << 10) | $d) ^ QR_G15_MASK; + } + + function getBCHTypeNumber($data) { + $d = $data << 12; + while (QRUtil::getBCHDigit($d) - QRUtil::getBCHDigit(QR_G18) >= 0) { + $d ^= (QR_G18 << (QRUtil::getBCHDigit($d) - QRUtil::getBCHDigit(QR_G18) ) ); + } + return ($data << 12) | $d; + } + + function getBCHDigit($data) { + + $digit = 0; + + while ($data != 0) { + $digit++; + $data >>= 1; + } + + return $digit; + } +} + +//--------------------------------------------------------------- +// QRRSBlock +//--------------------------------------------------------------- + +$QR_RS_BLOCK_TABLE = array( + + // L + // M + // Q + // H + + // 1 + array(1, 26, 19), + array(1, 26, 16), + array(1, 26, 13), + array(1, 26, 9), + + // 2 + array(1, 44, 34), + array(1, 44, 28), + array(1, 44, 22), + array(1, 44, 16), + + // 3 + array(1, 70, 55), + array(1, 70, 44), + array(2, 35, 17), + array(2, 35, 13), + + // 4 + array(1, 100, 80), + array(2, 50, 32), + array(2, 50, 24), + array(4, 25, 9), + + // 5 + array(1, 134, 108), + array(2, 67, 43), + array(2, 33, 15, 2, 34, 16), + array(2, 33, 11, 2, 34, 12), + + // 6 + array(2, 86, 68), + array(4, 43, 27), + array(4, 43, 19), + array(4, 43, 15), + + // 7 + array(2, 98, 78), + array(4, 49, 31), + array(2, 32, 14, 4, 33, 15), + array(4, 39, 13, 1, 40, 14), + + // 8 + array(2, 121, 97), + array(2, 60, 38, 2, 61, 39), + array(4, 40, 18, 2, 41, 19), + array(4, 40, 14, 2, 41, 15), + + // 9 + array(2, 146, 116), + array(3, 58, 36, 2, 59, 37), + array(4, 36, 16, 4, 37, 17), + array(4, 36, 12, 4, 37, 13), + + // 10 + array(2, 86, 68, 2, 87, 69), + array(4, 69, 43, 1, 70, 44), + array(6, 43, 19, 2, 44, 20), + array(6, 43, 15, 2, 44, 16) + +); + +class QRRSBlock { + + var $totalCount; + var $dataCount; + + function QRRSBlock($totalCount, $dataCount) { + $this->totalCount = $totalCount; + $this->dataCount = $dataCount; + } + + function getDataCount() { + return $this->dataCount; + } + + function getTotalCount() { + return $this->totalCount; + } + + function getRSBlocks($typeNumber, $errorCorrectLevel) { + + $rsBlock = QRRSBlock::getRsBlockTable($typeNumber, $errorCorrectLevel); + $length = count($rsBlock) / 3; + + $list = array(); + + for ($i = 0; $i < $length; $i++) { + + $count = $rsBlock[$i * 3 + 0]; + $totalCount = $rsBlock[$i * 3 + 1]; + $dataCount = $rsBlock[$i * 3 + 2]; + + for ($j = 0; $j < $count; $j++) { + $list[] = new QRRSBlock($totalCount, $dataCount); + } + } + + return $list; + } + + function getRsBlockTable($typeNumber, $errorCorrectLevel) { + + global $QR_RS_BLOCK_TABLE; + + switch($errorCorrectLevel) { + case QR_ERROR_CORRECT_LEVEL_L : + return $QR_RS_BLOCK_TABLE[($typeNumber - 1) * 4 + 0]; + case QR_ERROR_CORRECT_LEVEL_M : + return $QR_RS_BLOCK_TABLE[($typeNumber - 1) * 4 + 1]; + case QR_ERROR_CORRECT_LEVEL_Q : + return $QR_RS_BLOCK_TABLE[($typeNumber - 1) * 4 + 2]; + case QR_ERROR_CORRECT_LEVEL_H : + return $QR_RS_BLOCK_TABLE[($typeNumber - 1) * 4 + 3]; + default : + trigger_error("tn:$typeNumber/ecl:$errorCorrectLevel", E_USER_ERROR); + } + } +} + +//--------------------------------------------------------------- +// QRNumber +//--------------------------------------------------------------- + +class QRNumber extends QRData { + + function QRNumber($data) { + QRData::QRData(QR_MODE_NUMBER, $data); + } + + function write(&$buffer) { + + $data = $this->getData(); + + $i = 0; + + while ($i + 2 < strlen($data) ) { + $num = QRNumber::parseInt(substr($data, $i, 3) ); + $buffer->put($num, 10); + $i += 3; + } + + if ($i < strlen($data) ) { + + if (strlen($data) - $i == 1) { + $num = QRNumber::parseInt(substr($data, $i, $i + 1) ); + $buffer->put($num, 4); + } else if (strlen($data) - $i == 2) { + $num = QRNumber::parseInt(substr($data, $i, $i + 2) ); + $buffer->put($num, 7); + } + } + } + + function getLength() { + return strlen($this->getData() ); + } + + function parseInt($s) { + + $num = 0; + for ($i = 0; $i < strlen($s); $i++) { + $num = $num * 10 + QRNumber::parseIntAt(ord($s[$i]) ); + } + return $num; + } + + function parseIntAt($c) { + + if (QRUtil::toCharCode('0') <= $c && $c <= QRUtil::toCharCode('9') ) { + return $c - QRUtil::toCharCode('0'); + } + + trigger_error("illegal char : $c", E_USER_ERROR); + } +} + +//--------------------------------------------------------------- +// QRKanji +//--------------------------------------------------------------- + +class QRKanji extends QRData { + + function QRKanji($data) { + QRData::QRData(QR_MODE_KANJI, $data); + } + + function write(&$buffer) { + + $data = $this->getData(); + + $i = 0; + + while ($i + 1 < strlen($data) ) { + + $c = ( (0xff & ord($data[$i]) ) << 8) | (0xff & ord($data[$i + 1]) ); + + if (0x8140 <= $c && $c <= 0x9FFC) { + $c -= 0x8140; + } else if (0xE040 <= $c && $c <= 0xEBBF) { + $c -= 0xC140; + } else { + trigger_error("illegal char at " . ($i + 1) . "/$c", E_USER_ERROR); + } + + $c = ( ($c >> 8) & 0xff) * 0xC0 + ($c & 0xff); + + $buffer->put($c, 13); + + $i += 2; + } + + if ($i < strlen($data) ) { + trigger_error("illegal char at " . ($i + 1), E_USER_ERROR); + } + } + + function getLength() { + return floor(strlen($this->getData() ) / 2); + } +} + +//--------------------------------------------------------------- +// QRAlphaNum +//--------------------------------------------------------------- + +class QRAlphaNum extends QRData { + + function QRAlphaNum($data) { + QRData::QRData(QR_MODE_ALPHA_NUM, $data); + } + + function write(&$buffer) { + + $i = 0; + $c = $this->getData(); + + while ($i + 1 < strlen($c) ) { + $buffer->put(QRAlphaNum::getCode(ord($c[$i]) ) * 45 + + QRAlphaNum::getCode(ord($c[$i + 1]) ), 11); + $i += 2; + } + + if ($i < strlen($c) ) { + $buffer->put(QRAlphaNum::getCode(ord($c[$i])), 6); + } + } + + function getLength() { + return strlen($this->getData() ); + } + + function getCode($c) { + + if (QRUtil::toCharCode('0') <= $c + && $c <= QRUtil::toCharCode('9') ) { + return $c - QRUtil::toCharCode('0'); + } else if (QRUtil::toCharCode('A') <= $c + && $c <= QRUtil::toCharCode('Z') ) { + return $c - QRUtil::toCharCode('A') + 10; + } else { + switch ($c) { + case QRUtil::toCharCode(' ') : return 36; + case QRUtil::toCharCode('$') : return 37; + case QRUtil::toCharCode('%') : return 38; + case QRUtil::toCharCode('*') : return 39; + case QRUtil::toCharCode('+') : return 40; + case QRUtil::toCharCode('-') : return 41; + case QRUtil::toCharCode('.') : return 42; + case QRUtil::toCharCode('/') : return 43; + case QRUtil::toCharCode(':') : return 44; + default : + trigger_error("illegal char : $c", E_USER_ERROR); + } + } + + } +} + +//--------------------------------------------------------------- +// QR8BitByte +//--------------------------------------------------------------- + +class QR8BitByte extends QRData { + + function QR8BitByte($data) { + QRData::QRData(QR_MODE_8BIT_BYTE, $data); + } + + function write(&$buffer) { + + $data = $this->getData(); + for ($i = 0; $i < strlen($data); $i++) { + $buffer->put(ord($data[$i]), 8); + } + } + + function getLength() { + return strlen($this->getData() ); + } +} + +//--------------------------------------------------------------- +// QRData +//--------------------------------------------------------------- + +class QRData { + + var $mode; + + var $data; + + function QRData($mode, $data) { + $this->mode = $mode; + $this->data = $data; + } + + function getMode() { + return $this->mode; + } + + function getData() { + return $this->data; + } + + function getLength() { + trigger_error("not implemented.", E_USER_ERROR); + } + + function write(&$buffer) { + trigger_error("not implemented.", E_USER_ERROR); + } + + function getLengthInBits($type) { + + if (1 <= $type && $type < 10) { + + // 1 - 9 + + switch($this->mode) { + case QR_MODE_NUMBER : return 10; + case QR_MODE_ALPHA_NUM : return 9; + case QR_MODE_8BIT_BYTE : return 8; + case QR_MODE_KANJI : return 8; + default : + trigger_error("mode:$this->mode", E_USER_ERROR); + } + + } else if ($type < 27) { + + // 10 - 26 + + switch($this->mode) { + case QR_MODE_NUMBER : return 12; + case QR_MODE_ALPHA_NUM : return 11; + case QR_MODE_8BIT_BYTE : return 16; + case QR_MODE_KANJI : return 10; + default : + trigger_error("mode:$this->mode", E_USER_ERROR); + } + + } else if ($type < 41) { + + // 27 - 40 + + switch($this->mode) { + case QR_MODE_NUMBER : return 14; + case QR_MODE_ALPHA_NUM : return 13; + case QR_MODE_8BIT_BYTE : return 16; + case QR_MODE_KANJI : return 12; + default : + trigger_error("mode:$this->mode", E_USER_ERROR); + } + + } else { + trigger_error("mode:$this->mode", E_USER_ERROR); + } + } + +} + +//--------------------------------------------------------------- +// QRMath +//--------------------------------------------------------------- + +$QR_MATH_EXP_TABLE = null; +$QR_MATH_LOG_TABLE = null; + +class QRMath { + + function init() { + + global $QR_MATH_EXP_TABLE; + global $QR_MATH_LOG_TABLE; + + $QR_MATH_EXP_TABLE = QRMath::createNumArray(256); + + for ($i = 0; $i < 8; $i++) { + $QR_MATH_EXP_TABLE[$i] = 1 << $i; + } + + for ($i = 8; $i < 256; $i++) { + $QR_MATH_EXP_TABLE[$i] = $QR_MATH_EXP_TABLE[$i - 4] + ^ $QR_MATH_EXP_TABLE[$i - 5] + ^ $QR_MATH_EXP_TABLE[$i - 6] + ^ $QR_MATH_EXP_TABLE[$i - 8]; + } + + $QR_MATH_LOG_TABLE = QRMath::createNumArray(256); + + for ($i = 0; $i < 255; $i++) { + $QR_MATH_LOG_TABLE[$QR_MATH_EXP_TABLE[$i] ] = $i; + } + } + + function createNumArray($length) { + $num_array = array(); + for ($i = 0; $i < $length; $i++) { + $num_array[] = 0; + } + return $num_array; + } + + function glog($n) { + global $QR_MATH_LOG_TABLE; + if ($n < 1) { + trigger_error("log($n)", E_USER_ERROR); + } + return $QR_MATH_LOG_TABLE[$n]; + } + + function gexp($n) { + global $QR_MATH_EXP_TABLE; + while ($n < 0) { + $n += 255; + } + while ($n >= 256) { + $n -= 255; + } + return $QR_MATH_EXP_TABLE[$n]; + } +} + +// init static table +QRMath::init(); + +//--------------------------------------------------------------- +// QRPolynomial +//--------------------------------------------------------------- + +class QRPolynomial { + + var $num; + + function QRPolynomial($num, $shift = 0) { + $offset = 0; + + while ($offset < count($num) && $num[$offset] == 0) { + $offset++; + } + + $this->num = QRMath::createNumArray(count($num) - $offset + $shift); + for ($i = 0; $i < count($num) - $offset; $i++) { + $this->num[$i] = $num[$i + $offset]; + } + } + + function get($index) { + return $this->num[$index]; + } + + function getLength() { + return count($this->num); + } + + // PHP5 + function __toString() { + return $this->toString(); + } + + function toString() { + $buffer = ""; + for ($i = 0; $i < $this->getLength(); $i++) { + if ($i > 0) { + $buffer .= ","; + } + $buffer .= $this->get($i); + } + return $buffer; + } + + function toLogString() { + $buffer = ""; + for ($i = 0; $i < $this->getLength(); $i++) { + if ($i > 0) { + $buffer .= ","; + } + $buffer .= QRMath::glog($this->get(i) ); + } + return $buffer; + } + + function multiply($e) { + $num = QRMath::createNumArray($this->getLength() + $e->getLength() - 1); + for ($i = 0; $i < $this->getLength(); $i++) { + for ($j = 0; $j < $e->getLength(); $j++) { + $num[$i + $j] ^= QRMath::gexp(QRMath::glog($this->get($i) ) + QRMath::glog($e->get($j) ) ); + } + } + return new QRPolynomial($num); + } + + function mod($e) { + if ($this->getLength() - $e->getLength() < 0) { + return $this; + } + $ratio = QRMath::glog($this->get(0) ) - QRMath::glog($e->get(0) ); + $num = QRMath::createNumArray($this->getLength() ); + for ($i = 0; $i < $this->getLength(); $i++) { + $num[$i] = $this->get($i); + } + for ($i = 0; $i < $e->getLength(); $i++) { + $num[$i] ^= QRMath::gexp(QRMath::glog($e->get($i) ) + $ratio); + } + $newPolynomial = new QRPolynomial($num); + return $newPolynomial->mod($e); + } +} + +//--------------------------------------------------------------- +// Mode +//--------------------------------------------------------------- + +define("QR_MODE_NUMBER", 1 << 0); +define("QR_MODE_ALPHA_NUM", 1 << 1); +define("QR_MODE_8BIT_BYTE", 1 << 2); +define("QR_MODE_KANJI", 1 << 3); + +//--------------------------------------------------------------- +// MaskPattern +//--------------------------------------------------------------- + +define("QR_MASK_PATTERN000", 0); +define("QR_MASK_PATTERN001", 1); +define("QR_MASK_PATTERN010", 2); +define("QR_MASK_PATTERN011", 3); +define("QR_MASK_PATTERN100", 4); +define("QR_MASK_PATTERN101", 5); +define("QR_MASK_PATTERN110", 6); +define("QR_MASK_PATTERN111", 7); + +//--------------------------------------------------------------- +// ErrorCorrectLevel + +// 7%. +define("QR_ERROR_CORRECT_LEVEL_L", 1); +// 15%. +define("QR_ERROR_CORRECT_LEVEL_M", 0); +// 25%. +define("QR_ERROR_CORRECT_LEVEL_Q", 3); +// 30%. +define("QR_ERROR_CORRECT_LEVEL_H", 2); + + +//--------------------------------------------------------------- +// QRBitBuffer +//--------------------------------------------------------------- + +class QRBitBuffer { + var $buffer; + var $length; + + function QRBitBuffer() { + $this->buffer = array(); + $this->length = 0; + } + + function getBuffer() { + return $this->buffer; + } + + function getLengthInBits() { + return $this->length; + } + + function __toString() { + $buffer = ""; + for ($i = 0; $i < $this->getLengthInBits(); $i++) { + $buffer .= $this->get($i)? '1' : '0'; + } + return $buffer; + } + + function get($index) { + $bufIndex = floor($index / 8); + return ( ($this->buffer[$bufIndex] >> (7 - $index % 8) ) & 1) == 1; + } + + function put($num, $length) { + for ($i = 0; $i < $length; $i++) { + $this->putBit( ( ($num >> ($length - $i - 1) ) & 1) == 1); + } + } + + function putBit($bit) { + $bufIndex = floor($this->length / 8); + if (count($this->buffer) <= $bufIndex) { + $this->buffer[] = 0; + } + if ($bit) { + $this->buffer[$bufIndex] |= (0x80 >> ($this->length % 8) ); + } + $this->length++; + } +} + +?> \ No newline at end of file diff --git a/includes/recaptchalib.php b/includes/recaptchalib.php new file mode 100644 index 0000000000..e18ddb8856 --- /dev/null +++ b/includes/recaptchalib.php @@ -0,0 +1,276 @@ + $value ) + $req .= $key . '=' . urlencode( stripslashes($value) ) . '&'; + + // Cut the last '&' + $req=substr($req,0,strlen($req)-1); + return $req; +} + + + +/** + * Submits an HTTP POST to a reCAPTCHA server + * @param string $host + * @param string $path + * @param array $data + * @param int port + * @return array response + */ +function _recaptcha_http_post($host, $path, $data, $port = 80) { + + $req = _recaptcha_qsencode ($data); + + $http_request = "POST $path HTTP/1.0\r\n"; + $http_request .= "Host: $host\r\n"; + $http_request .= "Content-Type: application/x-www-form-urlencoded;\r\n"; + $http_request .= "Content-Length: " . strlen($req) . "\r\n"; + $http_request .= "User-Agent: reCAPTCHA/PHP\r\n"; + $http_request .= "\r\n"; + $http_request .= $req; + + $response = ''; + if( false == ( $fs = @fsockopen($host, $port, $errno, $errstr, 10) ) ) { + die ('Could not open socket'); + } + + fwrite($fs, $http_request); + + while ( !feof($fs) ) + $response .= fgets($fs, 1160); // One TCP-IP packet + fclose($fs); + $response = explode("\r\n\r\n", $response, 2); + + return $response; +} + + + +/** + * Gets the challenge HTML (javascript and non-javascript version). + * This is called from the browser, and the resulting reCAPTCHA HTML widget + * is embedded within the HTML form it was called from. + * @param string $pubkey A public key for reCAPTCHA + * @param string $error The error given by reCAPTCHA (optional, default is null) + * @param boolean $use_ssl Should the request be made over ssl? (optional, default is false) + + * @return string - The HTML to be embedded in the user's form. + */ +function recaptcha_get_html ($pubkey, $error = null, $use_ssl = false) +{ + if ($pubkey == null || $pubkey == '') { + die ("To use reCAPTCHA you must get an API key from https://www.google.com/recaptcha/admin/create"); + } + + if ($use_ssl) { + $server = RECAPTCHA_API_SECURE_SERVER; + } else { + $server = RECAPTCHA_API_SERVER; + } + + $errorpart = ""; + if ($error) { + $errorpart = "&error=" . $error; + } + return ' + + '; +} + + + + +/** + * A ReCaptchaResponse is returned from recaptcha_check_answer() + */ +class ReCaptchaResponse { + var $is_valid; + var $error; +} + + +/** + * Calls an HTTP POST function to verify if the user's guess was correct + * @param string $privkey + * @param string $remoteip + * @param string $challenge + * @param string $response + * @param array $extra_params an array of extra variables to post to the server + * @return ReCaptchaResponse + */ +function recaptcha_check_answer ($privkey, $remoteip, $challenge, $response, $extra_params = array()) +{ + if ($privkey == null || $privkey == '') { + die ("To use reCAPTCHA you must get an API key from https://www.google.com/recaptcha/admin/create"); + } + + if ($remoteip == null || $remoteip == '') { + die ("For security reasons, you must pass the remote ip to reCAPTCHA"); + } + + + + //discard spam submissions + if ($challenge == null || strlen($challenge) == 0 || $response == null || strlen($response) == 0) { + $recaptcha_response = new ReCaptchaResponse(); + $recaptcha_response->is_valid = false; + $recaptcha_response->error = 'incorrect-captcha-sol'; + return $recaptcha_response; + } + + $response = _recaptcha_http_post (RECAPTCHA_VERIFY_SERVER, "/recaptcha/api/verify", + array ( + 'privatekey' => $privkey, + 'remoteip' => $remoteip, + 'challenge' => $challenge, + 'response' => $response + ) + $extra_params + ); + + $answers = explode ("\n", $response [1]); + $recaptcha_response = new ReCaptchaResponse(); + + if (trim ($answers [0]) == 'true') { + $recaptcha_response->is_valid = true; + } + else { + $recaptcha_response->is_valid = false; + $recaptcha_response->error = $answers [1]; + } + return $recaptcha_response; + +} + +/** + * gets a URL where the user can sign up for reCAPTCHA. If your application + * has a configuration page where you enter a key, you should provide a link + * using this function. + * @param string $_SESSION['domain_name'] The domain where the page is hosted + * @param string $app_name The name of your application + */ +function recaptcha_get_signup_url ($domain_name = null, $app_name = null) { + return "https://www.google.com/recaptcha/admin/create?" . _recaptcha_qsencode (array ('domains' => $domain_name, 'app' => $app_name)); +} + +function _recaptcha_aes_pad($val) { + $block_size = 16; + $numpad = $block_size - (strlen ($val) % $block_size); + return str_pad($val, strlen ($val) + $numpad, chr($numpad)); +} + +/* Mailhide related code */ + +function _recaptcha_aes_encrypt($val,$ky) { + if (! function_exists ("mcrypt_encrypt")) { + die ("To use reCAPTCHA Mailhide, you need to have the mcrypt php module installed."); + } + $mode=MCRYPT_MODE_CBC; + $enc=MCRYPT_RIJNDAEL_128; + $val=_recaptcha_aes_pad($val); + return mcrypt_encrypt($enc, $ky, $val, $mode, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"); +} + + +function _recaptcha_mailhide_urlbase64 ($x) { + return strtr(base64_encode ($x), '+/', '-_'); +} + +/* gets the reCAPTCHA Mailhide url for a given email, public key and private key */ +function recaptcha_mailhide_url($pubkey, $privkey, $email) { + if ($pubkey == '' || $pubkey == null || $privkey == "" || $privkey == null) { + die ("To use reCAPTCHA Mailhide, you have to sign up for a public and private key, " . + "you can do so at http://www.google.com/recaptcha/mailhide/apikey"); + } + + + $ky = pack('H*', $privkey); + $cryptmail = _recaptcha_aes_encrypt ($email, $ky); + + return "http://www.google.com/recaptcha/mailhide/d?k=" . $pubkey . "&c=" . _recaptcha_mailhide_urlbase64 ($cryptmail); +} + +/** + * gets the parts of the email to expose to the user. + * eg, given johndoe@example,com return ["john", "example.com"]. + * the email is then displayed as john...@example.com + */ +function _recaptcha_mailhide_email_parts ($email) { + $arr = preg_split("/@/", $email ); + + if (strlen ($arr[0]) <= 4) { + $arr[0] = substr ($arr[0], 0, 1); + } else if (strlen ($arr[0]) <= 6) { + $arr[0] = substr ($arr[0], 0, 3); + } else { + $arr[0] = substr ($arr[0], 0, 4); + } + return $arr; +} + +/** + * Gets html to display an email address given a public an private key. + * to get a key, go to: + * + * http://www.google.com/recaptcha/mailhide/apikey + */ +function recaptcha_mailhide_html($pubkey, $privkey, $email) { + $emailparts = _recaptcha_mailhide_email_parts ($email); + $url = recaptcha_mailhide_url ($pubkey, $privkey, $email); + + return htmlentities($emailparts[0]) . "...@" . htmlentities ($emailparts [1]); + +} + +?> \ No newline at end of file diff --git a/includes/require.php b/includes/require.php new file mode 100644 index 0000000000..202b61ea85 --- /dev/null +++ b/includes/require.php @@ -0,0 +1,32 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +include "includes/config.php"; +require_once "includes/lib_php.php"; +require "includes/lib_pdo.php"; +require_once "includes/lib_functions.php"; +require_once "includes/lib_switch.php"; +?> \ No newline at end of file diff --git a/includes/root.php b/includes/root.php new file mode 100644 index 0000000000..7286b67f62 --- /dev/null +++ b/includes/root.php @@ -0,0 +1,50 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ + +// make sure the PATH_SEPARATOR is defined + if (!defined("PATH_SEPARATOR")) { + if ( strpos( $_ENV[ "OS" ], "Win" ) !== false ) { define("PATH_SEPARATOR", ";"); } else { define("PATH_SEPARATOR", ":"); } + } + +// make sure the document_root is set + $_SERVER["SCRIPT_FILENAME"] = str_replace("\\", "/", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = str_replace($_SERVER["PHP_SELF"], "", $_SERVER["SCRIPT_FILENAME"]); + $_SERVER["DOCUMENT_ROOT"] = realpath($_SERVER["DOCUMENT_ROOT"]); + //echo "DOCUMENT_ROOT: ".$_SERVER["DOCUMENT_ROOT"]."
      \n"; + //echo "PHP_SELF: ".$_SERVER["PHP_SELF"]."
      \n"; + //echo "SCRIPT_FILENAME: ".$_SERVER["SCRIPT_FILENAME"]."
      \n"; + +// if the project directory exists then add it to the include path otherwise add the document root to the include path + if (is_dir($_SERVER["DOCUMENT_ROOT"].'/fusionpbx')){ + define('PROJECT_PATH', '/fusionpbx'); + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER["DOCUMENT_ROOT"].'/fusionpbx' ); + } + else { + define('PROJECT_PATH', ''); + set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER['DOCUMENT_ROOT'] ); + } + +?> \ No newline at end of file diff --git a/includes/securedownload.php b/includes/securedownload.php new file mode 100644 index 0000000000..eec57dbc23 --- /dev/null +++ b/includes/securedownload.php @@ -0,0 +1,91 @@ + + Portions created by the Initial Developer are Copyright (C) 2008-2012 + the Initial Developer. All Rights Reserved. + + Contributor(s): + Mark J Crane +*/ +include "root.php"; +require_once "includes/require.php"; +require_once "includes/checkauth.php"; + +//clears if file exists cache +clearstatcache(); + + +function getDownloadFilename($strfile) { + // Get download file name and path + //$basedir = "c:\\products\\"; + //$basedir = "/home/wwwbeta/secure/files/"; + $basedir = "c:/www/demo.netprofx.com/secure/files/"; + // Build and return download file name + return $basedir . $strfile; +} + +function DownloadFile($filename) { + // Check filename + if (empty($filename) || !file_exists($filename)) { + echo "Error: file doesn't exist or is empty.
      \n $filename"; + return FALSE; + } + + $file_extension = strtolower(substr(strrchr($filename,"."),1)); + switch ($file_extension) { + case "pdf": $ctype="application/pdf"; break; + case "exe": $ctype="application/octet-stream"; break; + case "zip": $ctype="application/zip"; break; + case "doc": $ctype="application/msword"; break; + case "xls": $ctype="application/vnd.ms-excel"; break; + case "ppt": $ctype="application/vnd.ms-powerpoint"; break; + case "gif": $ctype="image/gif"; break; + case "png": $ctype="image/png"; break; + case "jpe": case "jpeg": + case "jpg": $ctype="image/jpg"; break; + default: $ctype="application/force-download"; + } + + //if (!file_exists($filename)) { + // die("NO FILE HERE
      $filename"); + //} + + // Create download file name to be displayed to user + $saveasname = basename($filename); + + header("Expires: 0"); + header("Pragma: public"); + header("Expires: 0"); + header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); + header("Cache-Control: private",false); + header("Content-Type: $ctype"); + header("Content-Disposition: attachment; filename=\"".basename($filename)."\";"); + header("Content-Transfer-Encoding: binary"); + header("Content-Length: ".@filesize($filename)); + + set_time_limit(0); + @readfile($filename) or die("File not found."); + + // Done + return TRUE; +} + + + +?> diff --git a/includes/templates/conf/autoload_configs/.htaccess b/includes/templates/conf/autoload_configs/.htaccess new file mode 100644 index 0000000000..d776d84a77 --- /dev/null +++ b/includes/templates/conf/autoload_configs/.htaccess @@ -0,0 +1,3 @@ + + Deny from all + \ No newline at end of file diff --git a/includes/templates/conf/autoload_configs/abstraction.conf.xml b/includes/templates/conf/autoload_configs/abstraction.conf.xml new file mode 100644 index 0000000000..d4b1dfd274 --- /dev/null +++ b/includes/templates/conf/autoload_configs/abstraction.conf.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/includes/templates/conf/autoload_configs/acl.conf.xml b/includes/templates/conf/autoload_configs/acl.conf.xml new file mode 100644 index 0000000000..0c117d07bf --- /dev/null +++ b/includes/templates/conf/autoload_configs/acl.conf.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/includes/templates/conf/autoload_configs/alsa.conf.xml b/includes/templates/conf/autoload_configs/alsa.conf.xml new file mode 100644 index 0000000000..e589acaacf --- /dev/null +++ b/includes/templates/conf/autoload_configs/alsa.conf.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/includes/templates/conf/autoload_configs/blacklist.conf.xml b/includes/templates/conf/autoload_configs/blacklist.conf.xml new file mode 100644 index 0000000000..a981ebbdb0 --- /dev/null +++ b/includes/templates/conf/autoload_configs/blacklist.conf.xml @@ -0,0 +1,11 @@ + + + + + diff --git a/includes/templates/conf/autoload_configs/callcenter.conf.xml b/includes/templates/conf/autoload_configs/callcenter.conf.xml new file mode 100644 index 0000000000..54e7e78c56 --- /dev/null +++ b/includes/templates/conf/autoload_configs/callcenter.conf.xml @@ -0,0 +1,23 @@ + + + + + + + + {v_queues} + + + + + + + {v_agents} + + + + + {v_tiers} + + + \ No newline at end of file diff --git a/includes/templates/conf/autoload_configs/cdr_csv.conf.xml b/includes/templates/conf/autoload_configs/cdr_csv.conf.xml new file mode 100644 index 0000000000..8d796c68f0 --- /dev/null +++ b/includes/templates/conf/autoload_configs/cdr_csv.conf.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/includes/templates/conf/autoload_configs/cdr_mongodb.conf.xml b/includes/templates/conf/autoload_configs/cdr_mongodb.conf.xml new file mode 100644 index 0000000000..ce366d1bd0 --- /dev/null +++ b/includes/templates/conf/autoload_configs/cdr_mongodb.conf.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/includes/templates/conf/autoload_configs/cdr_pg_csv.conf.xml b/includes/templates/conf/autoload_configs/cdr_pg_csv.conf.xml new file mode 100644 index 0000000000..4fec817b45 --- /dev/null +++ b/includes/templates/conf/autoload_configs/cdr_pg_csv.conf.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/includes/templates/conf/autoload_configs/cdr_sqlite.conf.xml b/includes/templates/conf/autoload_configs/cdr_sqlite.conf.xml new file mode 100644 index 0000000000..872c04c4fb --- /dev/null +++ b/includes/templates/conf/autoload_configs/cdr_sqlite.conf.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/includes/templates/conf/autoload_configs/cepstral.conf.xml b/includes/templates/conf/autoload_configs/cepstral.conf.xml new file mode 100644 index 0000000000..cf431de700 --- /dev/null +++ b/includes/templates/conf/autoload_configs/cepstral.conf.xml @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file diff --git a/includes/templates/conf/autoload_configs/cidlookup.conf.xml b/includes/templates/conf/autoload_configs/cidlookup.conf.xml new file mode 100644 index 0000000000..a30f9f5c10 --- /dev/null +++ b/includes/templates/conf/autoload_configs/cidlookup.conf.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/includes/templates/conf/autoload_configs/conference.conf.xml b/includes/templates/conf/autoload_configs/conference.conf.xml new file mode 100644 index 0000000000..a33be22d05 --- /dev/null +++ b/includes/templates/conf/autoload_configs/conference.conf.xml @@ -0,0 +1,226 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/includes/templates/conf/autoload_configs/console.conf.xml b/includes/templates/conf/autoload_configs/console.conf.xml new file mode 100644 index 0000000000..2d9e3e8de5 --- /dev/null +++ b/includes/templates/conf/autoload_configs/console.conf.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + diff --git a/includes/templates/conf/autoload_configs/db.conf.xml b/includes/templates/conf/autoload_configs/db.conf.xml new file mode 100644 index 0000000000..abc6c0c152 --- /dev/null +++ b/includes/templates/conf/autoload_configs/db.conf.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/includes/templates/conf/autoload_configs/dialplan_directory.conf.xml b/includes/templates/conf/autoload_configs/dialplan_directory.conf.xml new file mode 100644 index 0000000000..e4edcd6b15 --- /dev/null +++ b/includes/templates/conf/autoload_configs/dialplan_directory.conf.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/includes/templates/conf/autoload_configs/dingaling.conf.xml b/includes/templates/conf/autoload_configs/dingaling.conf.xml new file mode 100644 index 0000000000..e68c8b4b44 --- /dev/null +++ b/includes/templates/conf/autoload_configs/dingaling.conf.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/includes/templates/conf/autoload_configs/directory.conf.xml b/includes/templates/conf/autoload_configs/directory.conf.xml new file mode 100644 index 0000000000..748b2337c4 --- /dev/null +++ b/includes/templates/conf/autoload_configs/directory.conf.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/includes/templates/conf/autoload_configs/distributor.conf.xml b/includes/templates/conf/autoload_configs/distributor.conf.xml new file mode 100644 index 0000000000..a03b1ee810 --- /dev/null +++ b/includes/templates/conf/autoload_configs/distributor.conf.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/includes/templates/conf/autoload_configs/easyroute.conf.xml b/includes/templates/conf/autoload_configs/easyroute.conf.xml new file mode 100644 index 0000000000..350a50989b --- /dev/null +++ b/includes/templates/conf/autoload_configs/easyroute.conf.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/includes/templates/conf/autoload_configs/enum.conf.xml b/includes/templates/conf/autoload_configs/enum.conf.xml new file mode 100644 index 0000000000..0304d0dacd --- /dev/null +++ b/includes/templates/conf/autoload_configs/enum.conf.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/includes/templates/conf/autoload_configs/erlang_event.conf.xml b/includes/templates/conf/autoload_configs/erlang_event.conf.xml new file mode 100644 index 0000000000..62deb84f67 --- /dev/null +++ b/includes/templates/conf/autoload_configs/erlang_event.conf.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + diff --git a/includes/templates/conf/autoload_configs/event_multicast.conf.xml b/includes/templates/conf/autoload_configs/event_multicast.conf.xml new file mode 100644 index 0000000000..eac0392607 --- /dev/null +++ b/includes/templates/conf/autoload_configs/event_multicast.conf.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/includes/templates/conf/autoload_configs/event_socket.conf.xml b/includes/templates/conf/autoload_configs/event_socket.conf.xml new file mode 100644 index 0000000000..5ea2e09788 --- /dev/null +++ b/includes/templates/conf/autoload_configs/event_socket.conf.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/includes/templates/conf/autoload_configs/fax.conf.xml b/includes/templates/conf/autoload_configs/fax.conf.xml new file mode 100644 index 0000000000..c7d825665e --- /dev/null +++ b/includes/templates/conf/autoload_configs/fax.conf.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/includes/templates/conf/autoload_configs/fifo.conf.xml b/includes/templates/conf/autoload_configs/fifo.conf.xml new file mode 100644 index 0000000000..b1db4dd2bd --- /dev/null +++ b/includes/templates/conf/autoload_configs/fifo.conf.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/includes/templates/conf/autoload_configs/hash.conf.xml b/includes/templates/conf/autoload_configs/hash.conf.xml new file mode 100644 index 0000000000..95b7928775 --- /dev/null +++ b/includes/templates/conf/autoload_configs/hash.conf.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/includes/templates/conf/autoload_configs/httapi.conf.xml b/includes/templates/conf/autoload_configs/httapi.conf.xml new file mode 100644 index 0000000000..c2fe584a02 --- /dev/null +++ b/includes/templates/conf/autoload_configs/httapi.conf.xml @@ -0,0 +1,127 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/includes/templates/conf/autoload_configs/http_cache.conf.xml b/includes/templates/conf/autoload_configs/http_cache.conf.xml new file mode 100644 index 0000000000..4f05269658 --- /dev/null +++ b/includes/templates/conf/autoload_configs/http_cache.conf.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/includes/templates/conf/autoload_configs/ivr.conf.xml b/includes/templates/conf/autoload_configs/ivr.conf.xml new file mode 100644 index 0000000000..bd4e73dedf --- /dev/null +++ b/includes/templates/conf/autoload_configs/ivr.conf.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/includes/templates/conf/autoload_configs/java.conf.xml b/includes/templates/conf/autoload_configs/java.conf.xml new file mode 100644 index 0000000000..3d1a3b5e5b --- /dev/null +++ b/includes/templates/conf/autoload_configs/java.conf.xml @@ -0,0 +1,13 @@ + + + + + + + + + + diff --git a/includes/templates/conf/autoload_configs/lcr.conf.xml b/includes/templates/conf/autoload_configs/lcr.conf.xml new file mode 100644 index 0000000000..9d106d4890 --- /dev/null +++ b/includes/templates/conf/autoload_configs/lcr.conf.xml @@ -0,0 +1,89 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/includes/templates/conf/autoload_configs/local_stream.conf.xml b/includes/templates/conf/autoload_configs/local_stream.conf.xml new file mode 100644 index 0000000000..94a5665392 --- /dev/null +++ b/includes/templates/conf/autoload_configs/local_stream.conf.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/includes/templates/conf/autoload_configs/logfile.conf.xml b/includes/templates/conf/autoload_configs/logfile.conf.xml new file mode 100644 index 0000000000..65bea552bd --- /dev/null +++ b/includes/templates/conf/autoload_configs/logfile.conf.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/includes/templates/conf/autoload_configs/lua.conf.xml b/includes/templates/conf/autoload_configs/lua.conf.xml new file mode 100644 index 0000000000..1eb594f0b5 --- /dev/null +++ b/includes/templates/conf/autoload_configs/lua.conf.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + diff --git a/includes/templates/conf/autoload_configs/memcache.conf.xml b/includes/templates/conf/autoload_configs/memcache.conf.xml new file mode 100644 index 0000000000..dc0173f986 --- /dev/null +++ b/includes/templates/conf/autoload_configs/memcache.conf.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/includes/templates/conf/autoload_configs/modules.conf.xml b/includes/templates/conf/autoload_configs/modules.conf.xml new file mode 100644 index 0000000000..de4bc40897 --- /dev/null +++ b/includes/templates/conf/autoload_configs/modules.conf.xml @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/includes/templates/conf/autoload_configs/mongo.conf.xml b/includes/templates/conf/autoload_configs/mongo.conf.xml new file mode 100644 index 0000000000..8423645e95 --- /dev/null +++ b/includes/templates/conf/autoload_configs/mongo.conf.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + diff --git a/includes/templates/conf/autoload_configs/nibblebill.conf.xml b/includes/templates/conf/autoload_configs/nibblebill.conf.xml new file mode 100644 index 0000000000..ed1c9332c8 --- /dev/null +++ b/includes/templates/conf/autoload_configs/nibblebill.conf.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/includes/templates/conf/autoload_configs/opal.conf.xml b/includes/templates/conf/autoload_configs/opal.conf.xml new file mode 100644 index 0000000000..1133227499 --- /dev/null +++ b/includes/templates/conf/autoload_configs/opal.conf.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/includes/templates/conf/autoload_configs/osp.conf.xml b/includes/templates/conf/autoload_configs/osp.conf.xml new file mode 100644 index 0000000000..b320dbba88 --- /dev/null +++ b/includes/templates/conf/autoload_configs/osp.conf.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/includes/templates/conf/autoload_configs/perl.conf.xml b/includes/templates/conf/autoload_configs/perl.conf.xml new file mode 100644 index 0000000000..b2435000ff --- /dev/null +++ b/includes/templates/conf/autoload_configs/perl.conf.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + diff --git a/includes/templates/conf/autoload_configs/pocketsphinx.conf.xml b/includes/templates/conf/autoload_configs/pocketsphinx.conf.xml new file mode 100644 index 0000000000..3bf7d5e575 --- /dev/null +++ b/includes/templates/conf/autoload_configs/pocketsphinx.conf.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/includes/templates/conf/autoload_configs/portaudio.conf.xml b/includes/templates/conf/autoload_configs/portaudio.conf.xml new file mode 100644 index 0000000000..02c21ef449 --- /dev/null +++ b/includes/templates/conf/autoload_configs/portaudio.conf.xml @@ -0,0 +1,218 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/includes/templates/conf/autoload_configs/post_load_modules.conf.xml b/includes/templates/conf/autoload_configs/post_load_modules.conf.xml new file mode 100644 index 0000000000..8f4e132fa4 --- /dev/null +++ b/includes/templates/conf/autoload_configs/post_load_modules.conf.xml @@ -0,0 +1,4 @@ + + + + diff --git a/includes/templates/conf/autoload_configs/presence_map.conf.xml b/includes/templates/conf/autoload_configs/presence_map.conf.xml new file mode 100644 index 0000000000..8a9d1dde5a --- /dev/null +++ b/includes/templates/conf/autoload_configs/presence_map.conf.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/includes/templates/conf/autoload_configs/python.conf.xml b/includes/templates/conf/autoload_configs/python.conf.xml new file mode 100644 index 0000000000..d3a8fdc755 --- /dev/null +++ b/includes/templates/conf/autoload_configs/python.conf.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + diff --git a/includes/templates/conf/autoload_configs/redis.conf.xml b/includes/templates/conf/autoload_configs/redis.conf.xml new file mode 100644 index 0000000000..1a1f474036 --- /dev/null +++ b/includes/templates/conf/autoload_configs/redis.conf.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/includes/templates/conf/autoload_configs/rss.conf.xml b/includes/templates/conf/autoload_configs/rss.conf.xml new file mode 100644 index 0000000000..f8c4f6d2b4 --- /dev/null +++ b/includes/templates/conf/autoload_configs/rss.conf.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/includes/templates/conf/autoload_configs/rtmp.conf.xml b/includes/templates/conf/autoload_configs/rtmp.conf.xml new file mode 100644 index 0000000000..d5d278810e --- /dev/null +++ b/includes/templates/conf/autoload_configs/rtmp.conf.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/includes/templates/conf/autoload_configs/sangoma_codec.conf.xml b/includes/templates/conf/autoload_configs/sangoma_codec.conf.xml new file mode 100644 index 0000000000..eed9d673e1 --- /dev/null +++ b/includes/templates/conf/autoload_configs/sangoma_codec.conf.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + diff --git a/includes/templates/conf/autoload_configs/shout.conf.xml b/includes/templates/conf/autoload_configs/shout.conf.xml new file mode 100644 index 0000000000..3f381e6278 --- /dev/null +++ b/includes/templates/conf/autoload_configs/shout.conf.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/includes/templates/conf/autoload_configs/skinny.conf.xml b/includes/templates/conf/autoload_configs/skinny.conf.xml new file mode 100644 index 0000000000..6a878fcd71 --- /dev/null +++ b/includes/templates/conf/autoload_configs/skinny.conf.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/includes/templates/conf/autoload_configs/sofia.conf.xml b/includes/templates/conf/autoload_configs/sofia.conf.xml new file mode 100644 index 0000000000..a5e8614322 --- /dev/null +++ b/includes/templates/conf/autoload_configs/sofia.conf.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + diff --git a/includes/templates/conf/autoload_configs/spandsp.conf.xml b/includes/templates/conf/autoload_configs/spandsp.conf.xml new file mode 100644 index 0000000000..6f062cc731 --- /dev/null +++ b/includes/templates/conf/autoload_configs/spandsp.conf.xml @@ -0,0 +1,108 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/includes/templates/conf/autoload_configs/spidermonkey.conf.xml b/includes/templates/conf/autoload_configs/spidermonkey.conf.xml new file mode 100644 index 0000000000..2e6dc6a166 --- /dev/null +++ b/includes/templates/conf/autoload_configs/spidermonkey.conf.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/includes/templates/conf/autoload_configs/switch.conf.xml b/includes/templates/conf/autoload_configs/switch.conf.xml new file mode 100644 index 0000000000..044a618eeb --- /dev/null +++ b/includes/templates/conf/autoload_configs/switch.conf.xml @@ -0,0 +1,165 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/includes/templates/conf/autoload_configs/syslog.conf.xml b/includes/templates/conf/autoload_configs/syslog.conf.xml new file mode 100644 index 0000000000..636a12c8c1 --- /dev/null +++ b/includes/templates/conf/autoload_configs/syslog.conf.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/includes/templates/conf/autoload_configs/timezones.conf.xml b/includes/templates/conf/autoload_configs/timezones.conf.xml new file mode 100644 index 0000000000..85c805ff25 --- /dev/null +++ b/includes/templates/conf/autoload_configs/timezones.conf.xml @@ -0,0 +1,551 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/includes/templates/conf/autoload_configs/tts_commandline.conf.xml b/includes/templates/conf/autoload_configs/tts_commandline.conf.xml new file mode 100644 index 0000000000..eb816431be --- /dev/null +++ b/includes/templates/conf/autoload_configs/tts_commandline.conf.xml @@ -0,0 +1,15 @@ + + + + + + diff --git a/includes/templates/conf/autoload_configs/unicall.conf.xml b/includes/templates/conf/autoload_configs/unicall.conf.xml new file mode 100644 index 0000000000..eeaa0782f7 --- /dev/null +++ b/includes/templates/conf/autoload_configs/unicall.conf.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/includes/templates/conf/autoload_configs/unimrcp.conf.xml b/includes/templates/conf/autoload_configs/unimrcp.conf.xml new file mode 100644 index 0000000000..45dda798a1 --- /dev/null +++ b/includes/templates/conf/autoload_configs/unimrcp.conf.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/includes/templates/conf/autoload_configs/voicemail.conf.xml b/includes/templates/conf/autoload_configs/voicemail.conf.xml new file mode 100644 index 0000000000..a484fdfc46 --- /dev/null +++ b/includes/templates/conf/autoload_configs/voicemail.conf.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/includes/templates/conf/autoload_configs/voicemail_ivr.conf.xml b/includes/templates/conf/autoload_configs/voicemail_ivr.conf.xml new file mode 100644 index 0000000000..529509a495 --- /dev/null +++ b/includes/templates/conf/autoload_configs/voicemail_ivr.conf.xml @@ -0,0 +1,208 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/includes/templates/conf/autoload_configs/xml_cdr.conf.xml b/includes/templates/conf/autoload_configs/xml_cdr.conf.xml new file mode 100644 index 0000000000..336ea33486 --- /dev/null +++ b/includes/templates/conf/autoload_configs/xml_cdr.conf.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/includes/templates/conf/autoload_configs/xml_curl.conf.xml b/includes/templates/conf/autoload_configs/xml_curl.conf.xml new file mode 100644 index 0000000000..30951d83c8 --- /dev/null +++ b/includes/templates/conf/autoload_configs/xml_curl.conf.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/includes/templates/conf/autoload_configs/xml_rpc.conf.xml b/includes/templates/conf/autoload_configs/xml_rpc.conf.xml new file mode 100644 index 0000000000..714a909907 --- /dev/null +++ b/includes/templates/conf/autoload_configs/xml_rpc.conf.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/includes/templates/conf/autoload_configs/zeroconf.conf.xml b/includes/templates/conf/autoload_configs/zeroconf.conf.xml new file mode 100644 index 0000000000..84c1a46171 --- /dev/null +++ b/includes/templates/conf/autoload_configs/zeroconf.conf.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/includes/templates/conf/chatplan/default.xml b/includes/templates/conf/chatplan/default.xml new file mode 100644 index 0000000000..62f3f020ea --- /dev/null +++ b/includes/templates/conf/chatplan/default.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/includes/templates/conf/dialplan/default.xml b/includes/templates/conf/dialplan/default.xml new file mode 100644 index 0000000000..350a85e97c --- /dev/null +++ b/includes/templates/conf/dialplan/default.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/includes/templates/conf/dialplan/default/00_ladspa.xml.noload b/includes/templates/conf/dialplan/default/00_ladspa.xml.noload new file mode 100644 index 0000000000..a26b193ef5 --- /dev/null +++ b/includes/templates/conf/dialplan/default/00_ladspa.xml.noload @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/includes/templates/conf/dialplan/default/00_pizza_demo.xml.noload b/includes/templates/conf/dialplan/default/00_pizza_demo.xml.noload new file mode 100644 index 0000000000..e7fcca204a --- /dev/null +++ b/includes/templates/conf/dialplan/default/00_pizza_demo.xml.noload @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/includes/templates/conf/dialplan/default/01_Talking_Clock.xml.noload b/includes/templates/conf/dialplan/default/01_Talking_Clock.xml.noload new file mode 100644 index 0000000000..bc5077053a --- /dev/null +++ b/includes/templates/conf/dialplan/default/01_Talking_Clock.xml.noload @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/includes/templates/conf/dialplan/default/01_example.com.xml.noload b/includes/templates/conf/dialplan/default/01_example.com.xml.noload new file mode 100644 index 0000000000..bd61cd2788 --- /dev/null +++ b/includes/templates/conf/dialplan/default/01_example.com.xml.noload @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/includes/templates/conf/dialplan/features.xml b/includes/templates/conf/dialplan/features.xml new file mode 100644 index 0000000000..ac0d5eb73a --- /dev/null +++ b/includes/templates/conf/dialplan/features.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/includes/templates/conf/dialplan/public.xml b/includes/templates/conf/dialplan/public.xml new file mode 100644 index 0000000000..4935b1f10d --- /dev/null +++ b/includes/templates/conf/dialplan/public.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/includes/templates/conf/dialplan/public/00_inbound_did.xml.noload b/includes/templates/conf/dialplan/public/00_inbound_did.xml.noload new file mode 100644 index 0000000000..d40b3ab2c9 --- /dev/null +++ b/includes/templates/conf/dialplan/public/00_inbound_did.xml.noload @@ -0,0 +1,18 @@ + + + + + + + + + + diff --git a/includes/templates/conf/dialplan/skinny-patterns.xml b/includes/templates/conf/dialplan/skinny-patterns.xml new file mode 100644 index 0000000000..7817323aa9 --- /dev/null +++ b/includes/templates/conf/dialplan/skinny-patterns.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + diff --git a/includes/templates/conf/dialplan/skinny-patterns/20-Demo.xml b/includes/templates/conf/dialplan/skinny-patterns/20-Demo.xml new file mode 100644 index 0000000000..f69658128f --- /dev/null +++ b/includes/templates/conf/dialplan/skinny-patterns/20-Demo.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/includes/templates/conf/dialplan/skinny-patterns/20-Local_extension.xml b/includes/templates/conf/dialplan/skinny-patterns/20-Local_extension.xml new file mode 100644 index 0000000000..9ad5651328 --- /dev/null +++ b/includes/templates/conf/dialplan/skinny-patterns/20-Local_extension.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/includes/templates/conf/dialplan/skinny-patterns/90-External.xml b/includes/templates/conf/dialplan/skinny-patterns/90-External.xml new file mode 100644 index 0000000000..50d6c37f24 --- /dev/null +++ b/includes/templates/conf/dialplan/skinny-patterns/90-External.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/includes/templates/conf/dialplan/skinny-patterns/99-Default_Drop.xml b/includes/templates/conf/dialplan/skinny-patterns/99-Default_Drop.xml new file mode 100644 index 0000000000..897fd8fb94 --- /dev/null +++ b/includes/templates/conf/dialplan/skinny-patterns/99-Default_Drop.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/includes/templates/conf/directory/default.xml b/includes/templates/conf/directory/default.xml new file mode 100644 index 0000000000..8af7aea135 --- /dev/null +++ b/includes/templates/conf/directory/default.xml @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/includes/templates/conf/directory/default/brian.xml.noload b/includes/templates/conf/directory/default/brian.xml.noload new file mode 100644 index 0000000000..05fe0c8324 --- /dev/null +++ b/includes/templates/conf/directory/default/brian.xml.noload @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/includes/templates/conf/directory/default/default.xml.noload b/includes/templates/conf/directory/default/default.xml.noload new file mode 100644 index 0000000000..05eb1b4001 --- /dev/null +++ b/includes/templates/conf/directory/default/default.xml.noload @@ -0,0 +1,22 @@ + + + + + + + + + + + + diff --git a/includes/templates/conf/directory/default/example.com.xml.noload b/includes/templates/conf/directory/default/example.com.xml.noload new file mode 100644 index 0000000000..42a33ddbf3 --- /dev/null +++ b/includes/templates/conf/directory/default/example.com.xml.noload @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/includes/templates/conf/directory/default/skinny-example.xml.noload b/includes/templates/conf/directory/default/skinny-example.xml.noload new file mode 100644 index 0000000000..357eb72f12 --- /dev/null +++ b/includes/templates/conf/directory/default/skinny-example.xml.noload @@ -0,0 +1,35 @@ + + + + + + + + + + +

      5Dv68$( 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 literal 0 HcmV?d00001 diff --git a/includes/install/sounds/en/us/callie/custom/8000/to.wav b/includes/install/sounds/en/us/callie/custom/8000/to.wav new file mode 100644 index 0000000000000000000000000000000000000000..7b26105f361f12b13b39988bf723f51eed4e4c7b GIT binary patch literal 4964 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 Pc=asp>FzOlc6j~|gNZ~I literal 0 HcmV?d00001 diff --git a/includes/install/sounds/en/us/callie/custom/8000/voicemail.wav b/includes/install/sounds/en/us/callie/custom/8000/voicemail.wav new file mode 100644 index 0000000000000000000000000000000000000000..dccb29a16ed59362610ec41e6384051ceba9f799 GIT binary patch literal 12608 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≥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 literal 0 HcmV?d00001 diff --git a/includes/install/sounds/en/us/callie/custom/8000/wakeup.wav b/includes/install/sounds/en/us/callie/custom/8000/wakeup.wav new file mode 100644 index 0000000000000000000000000000000000000000..b5cb91622de10131ff1ec92408a3965d30e3e51a GIT binary patch literal 9042 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 GP5uv!owXwX literal 0 HcmV?d00001 diff --git a/includes/install/sounds/en/us/callie/custom/8000/your.wav b/includes/install/sounds/en/us/callie/custom/8000/your.wav new file mode 100644 index 0000000000000000000000000000000000000000..d401310b62bb3a1bb5aa8928435d274e9761ecf9 GIT binary patch literal 5938 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 G(*7Uae7JG| literal 0 HcmV?d00001 diff --git a/includes/install/source.xml b/includes/install/source.xml new file mode 100644 index 0000000000..218b6aaf4d --- /dev/null +++ b/includes/install/source.xml @@ -0,0 +1,5063 @@ + + + file + /.htaccess + Mon, 05 Jul 2010 17:59:19 GMT + 792e4a892be4096d965a4660fcc0bdc9 + 332 + + + directory + /core + + + + + + directory + /core/backup + + + + + + file + /core/backup/backup.php + Sat, 06 Feb 2010 18:10:09 GMT + 946fa5976d2b29ae1e585d9894098069 + 1630 + + + file + /core/backup/backupandrestore.php + Sat, 06 Feb 2010 18:10:09 GMT + e848f428bd5455fa58472c39b68d62d6 + 2941 + + + file + /core/backup/root.php + Sat, 06 Feb 2010 18:10:09 GMT + a20aca300a3c9c1cdd724971dba4626d + 1913 + + + directory + /core/menu + + + + + + file + /core/menu/index.php + Sat, 01 May 2010 08:12:06 GMT + 24c7f43397fb1ff8e8cc1aba16a7db5c + 10321 + + + file + /core/menu/menu.php + Sat, 01 May 2010 08:11:22 GMT + 54b00234bc20f257a6f0e1123071c8ce + 10415 + + + file + /core/menu/menu_delete.php + Sun, 23 May 2010 06:16:08 GMT + 5767c2426cc87c6bf213d713ea953d0b + 1578 + + + file + /core/menu/menu_edit.php + Sun, 23 May 2010 06:18:11 GMT + 90a282b8dbd0f820dd106a347c3dd56e + 12103 + + + file + /core/menu/menu_list.php + Sat, 01 May 2010 08:12:06 GMT + 6b2020cb1e9878503698f2741b34d9fa + 12725 + + + file + /core/menu/menu_move_down.php + Sun, 23 May 2010 06:18:11 GMT + 003c88d77ce6fa13a9f20d32feed7faa + 2982 + + + file + /core/menu/menu_move_up.php + Sun, 23 May 2010 06:18:42 GMT + 23e0080e62ba268612113c43de5253d7 + 2504 + + + file + /core/menu/menu_restore_default.php + Sun, 23 May 2010 06:19:04 GMT + 119127e0ef2e342326fb98847f78666a + 4393 + + + file + /core/menu/root.php + Sat, 06 Feb 2010 18:05:21 GMT + d399882b4822a07f0f4745cc41e1af1a + 1911 + + + directory + /core/settings + + + + + + file + /core/settings/root.php + Sat, 06 Feb 2010 18:02:36 GMT + a20aca300a3c9c1cdd724971dba4626d + 1913 + + + file + /core/settings/v_settings.php + Sat, 01 May 2010 08:03:57 GMT + ba867fd1a54a476feaf27bdc7f554120 + 5629 + + + file + /core/settings/v_settings_delete.php + Sat, 01 May 2010 08:03:57 GMT + 76069f395e160be17b1a3acac98ef602 + 1500 + + + file + /core/settings/v_settings_edit.php + Sat, 28 Aug 2010 18:49:56 GMT + 4b6a77eba20cd866ef3bf58cf8ed06a2 + 21008 + + + directory + /core/status + + + + + + file + /core/status/root.php + Sat, 06 Feb 2010 18:02:14 GMT + a20aca300a3c9c1cdd724971dba4626d + 1913 + + + file + /core/status/cmd.php + Sat, 06 Feb 2010 18:02:13 GMT + 2305b689a2e50df316552fca238c371d + 1786 + + + file + /core/status/v_status.php + Fri, 27 Aug 2010 23:20:26 GMT + be0a01baea7e3f1b044965c6733ba95e + 20672 + + + file + /core/status/v_status_registrations.php + Thu, 01 Jul 2010 20:26:06 GMT + 88d4549190d71d3c7085a054fb3c1c92 + 5011 + + + directory + /core/system_settings + + + + + + file + /core/system_settings/root.php + Sat, 06 Feb 2010 18:01:24 GMT + a20aca300a3c9c1cdd724971dba4626d + 1913 + + + file + /core/system_settings/v_system_settings.php + Sun, 15 Aug 2010 07:25:30 GMT + 82fd3f709bb619c9671b5aa848d98a83 + 6329 + + + file + /core/system_settings/v_system_settings_default.php + Mon, 30 Aug 2010 22:52:07 GMT + d4587f85de8bd9749effe554aaadef03 + 5790 + + + file + /core/system_settings/v_system_settings_delete.php + Sun, 15 Aug 2010 07:25:06 GMT + ff127bdb0d6793660fad7f0d22d1d57b + 1564 + + + file + /core/system_settings/v_system_settings_edit.php + Sun, 15 Aug 2010 07:24:54 GMT + ba9989d7c88fea789ea6e0bfa23953c9 + 28525 + + + directory + /core/upgrade + + + + + + file + /core/upgrade/root.php + Tue, 20 Oct 2009 18:13:40 GMT + 1d66d2f0f6ca694fc5d98c5b0e94e05b + 1091 + + + file + /core/upgrade/upgrade.php + Sun, 07 Mar 2010 04:05:23 GMT + efef8f062ab1103a56db3d610ac4b364 + 1591 + + + file + /core/upgrade/upgrade_schema.php + Fri, 01 Oct 2010 08:52:39 GMT + df3dc29315af014411644de0c5658b06 + 1655 + + + file + /core/upgrade/upgrade_svn.php + Thu, 09 Sep 2010 06:11:54 GMT + f0c7192b55c864260bbf3d5dc2549a2e + 7549 + + + file + /core/upgrade/upgrade_xml.php + Tue, 20 Jul 2010 02:17:47 GMT + 7bf91067097b7938f8f220355f51d5d6 + 3590 + + + directory + /core/users + + + + + + file + /core/users/groupadd.php + Sat, 06 Feb 2010 17:54:25 GMT + c70e80108d447d56a8b196cb442d2f4a + 3430 + + + file + /core/users/groupdelete.php + Sat, 06 Feb 2010 17:54:21 GMT + 0e321232aafc985247378f961309daf8 + 1510 + + + file + /core/users/grouplist.php + Sat, 06 Feb 2010 17:54:17 GMT + a03418af9922b3929f73c67fb49fe54a + 4852 + + + file + /core/users/groupmemberadd.php + Sat, 06 Feb 2010 17:53:40 GMT + ec2a900ab96a94a5d3f4dac68b45ef35 + 2378 + + + file + /core/users/groupmemberdelete.php + Sat, 06 Feb 2010 17:53:33 GMT + 9a627b38c57a78add544f7c19945a0eb + 2183 + + + file + /core/users/groupmembers.php + Sat, 06 Feb 2010 17:54:53 GMT + 122456196393dc1983f4c3b4c60353a0 + 4679 + + + file + /core/users/index.php + Sat, 06 Feb 2010 17:54:49 GMT + 9e0a8c8ef7c0af5cdec0afb0d16f65c9 + 1450 + + + file + /core/users/root.php + Sat, 06 Feb 2010 17:54:45 GMT + a20aca300a3c9c1cdd724971dba4626d + 1913 + + + file + /core/users/signup.php + Sun, 23 May 2010 06:22:02 GMT + 8a7b40722027520c4bfe7022934c3ef8 + 23160 + + + file + /core/users/useradd.php + Sat, 06 Feb 2010 17:54:38 GMT + 40b087a82e163a8cf2ffeb5492c99d49 + 6637 + + + file + /core/users/userdelete.php + Sat, 06 Feb 2010 17:54:34 GMT + d38aa19c7900f7b104ae656fb008e20a + 2626 + + + file + /core/users/userlist.php + Sat, 06 Feb 2010 17:54:32 GMT + 7aa313b5674fa527c479d73bbd0cde86 + 8989 + + + file + /core/users/usersupdate.php + Sat, 11 Sep 2010 16:59:21 GMT + d054a42ee31abcbd9d0099b88a5ee9c8 + 24995 + + + directory + /images + + + + + + file + /images/background_cell_active.gif + Fri, 21 May 2010 08:53:03 GMT + 0bf1471ae70a9b4e3818f7bd44ae1afb + 128 + + + file + /images/background_cell_conference.gif + Fri, 21 May 2010 08:53:03 GMT + 3b0736071002f93929130eb10d9d1869 + 128 + + + file + /images/background_cell_fifo.gif + Fri, 21 May 2010 08:53:02 GMT + 684692e2901f1105f42b99a6d0482d0b + 128 + + + file + /images/background_cell_light.gif + Fri, 21 May 2010 08:53:03 GMT + 204131d7b2e940853a07b97c788ed475 + 149 + + + file + /images/blank.gif + Fri, 21 May 2010 08:53:03 GMT + 56398e76be6355ad5999b262208a17c9 + 49 + + + file + /images/icon_cal.gif + Fri, 21 May 2010 08:52:38 GMT + 9c6f557f2ab2e04f6c3f4c2d6a8f40e9 + 646 + + + file + /images/icon_e.gif + Fri, 21 May 2010 08:53:02 GMT + e6b0a46279a319f635306e0238b2ec68 + 1106 + + + file + /images/icon_plus.gif + Fri, 21 May 2010 08:53:02 GMT + 5ac12528061cade8421f8f73eb766a11 + 1100 + + + file + /images/icon_up.gif + Fri, 21 May 2010 08:53:02 GMT + 4653b9b36eff66d412a8c962c574923b + 1116 + + + file + /images/icon_view.gif + Fri, 21 May 2010 08:53:03 GMT + 23624c848a869a3d4eb7f16f9f3f135f + 1109 + + + file + /images/icon_x.gif + Fri, 21 May 2010 08:53:02 GMT + c53fdfed01f3bb048ad3bbbf10692ebe + 1111 + + + directory + /includes + + + + + + file + /includes/calendar_lw_layers.js + Tue, 08 Dec 2009 02:25:03 GMT + 320abdf3709d06879886397b51c1a7eb + 4834 + + + file + /includes/calendar_lw_menu.js + Tue, 08 Dec 2009 02:25:03 GMT + 025630a5fc20907369decafc96234945 + 8367 + + + file + /includes/calendar_popcalendar.js + Tue, 08 Dec 2009 02:25:03 GMT + dec43c74fe649175a666a8df31d3b868 + 23043 + + + directory + /includes/captcha + + + + + + directory + /includes/captcha/fonts + + + + + + file + /includes/captcha/fonts/hanshand.ttf + Tue, 08 Dec 2009 02:24:54 GMT + 5abafb3678ef53ce7298c9e253a0a2b4 + 53424 + + + file + /includes/captcha/fonts/ROUGD.TTF + Tue, 08 Dec 2009 02:24:54 GMT + 58dcf2f5d780c90a9d45284cde4eb4d1 + 65036 + + + file + /includes/captcha/fonts/Zebra.ttf + Tue, 08 Dec 2009 02:24:54 GMT + 47b48b6778cf0b3e1a70e28fe4c2c7cb + 82064 + + + file + /includes/captcha/img.php + Sat, 06 Feb 2010 18:19:35 GMT + 6eb82ef732e3f02a50c0e885562dcbf4 + 3290 + + + file + /includes/captcha/root.php + Sat, 06 Feb 2010 18:19:35 GMT + d399882b4822a07f0f4745cc41e1af1a + 1911 + + + file + /includes/checkauth.php + Sun, 05 Sep 2010 06:44:52 GMT + 8f5f75bae7abe72ddfe0283d9f05935f + 4660 + + + file + /includes/checkstring.php + Sat, 06 Feb 2010 18:17:07 GMT + 276485fdbdbc49ed2d0ccc1fbc912109 + 955 + + + file + /includes/class.phpmailer.php + Tue, 08 Dec 2009 02:25:03 GMT + d80cf8d4005ee4334f445e91402b6b17 + 56086 + + + file + /includes/class.smtp.php + Tue, 08 Dec 2009 02:25:03 GMT + d2be32bec43171954dc9bd328ab63dac + 31376 + + + file + /includes/class_vcard.php + Tue, 08 Jun 2010 00:32:38 GMT + 720e638a94af0dbb374d746a42ef46de + 6073 + + + file + /includes/config.php.dist + Sat, 06 Feb 2010 18:18:53 GMT + 7af7ffbb69ddc8585810c5cd0def1379 + 2381 + + + file + /includes/directory.php + Tue, 23 Mar 2010 10:05:56 GMT + 101e7bddf1e063aead84d9bc68fdd8f8 + 12927 + + + file + /includes/download.php + Sat, 06 Feb 2010 18:18:53 GMT + 31d2bf32511a4651914330577269ccac + 1052 + + + directory + /includes/edit_area + + + + + + file + /includes/edit_area/edit_area_full.gz + Tue, 08 Dec 2009 02:24:53 GMT + 8c924f9b2bc2bc0ac2919cbbffb24fa2 + 29125 + + + file + /includes/edit_area/edit_area_full.js + Tue, 08 Dec 2009 02:24:53 GMT + 58b9669d5903765b99ca4adac8e9b9f5 + 114587 + + + directory + /includes/edit_area/images + + + + + + file + /includes/edit_area/images/autocompletion.gif + Tue, 08 Dec 2009 02:24:53 GMT + a49a7f9395b32bcf6aa8e143e17c03ff + 359 + + + file + /includes/edit_area/images/close.gif + Tue, 08 Dec 2009 02:24:53 GMT + 6cc9d27bdda91ad192a4326a653ba566 + 102 + + + file + /includes/edit_area/images/fullscreen.gif + Tue, 08 Dec 2009 02:24:53 GMT + 88d0dd1d465c2989dc04cb8f4473f6b9 + 198 + + + file + /includes/edit_area/images/go_to_line.gif + Tue, 08 Dec 2009 02:24:53 GMT + 05aa7fa3c6c720595bb3ead7366bbe07 + 1053 + + + file + /includes/edit_area/images/help.gif + Tue, 08 Dec 2009 02:24:53 GMT + 4cd4a5d2cdcd74c8aeced17813afd6ea + 295 + + + file + /includes/edit_area/images/highlight.gif + Tue, 08 Dec 2009 02:24:53 GMT + 96382d6d24bb8a1b228586b323e72fb4 + 256 + + + file + /includes/edit_area/images/load.gif + Tue, 08 Dec 2009 02:24:53 GMT + 203725593d5c7412fc51aa603434f96f + 1041 + + + file + /includes/edit_area/images/move.gif + Tue, 08 Dec 2009 02:24:53 GMT + 0da84ad6a24533d4335cef8255101edc + 257 + + + file + /includes/edit_area/images/newdocument.gif + Tue, 08 Dec 2009 02:24:53 GMT + 24b01aa27845c551f24a186a92cbc94e + 170 + + + file + /includes/edit_area/images/opacity.png + Tue, 08 Dec 2009 02:24:53 GMT + 7f1c7b1ff1f3e04828540f6ffdde46c2 + 147 + + + file + /includes/edit_area/images/processing.gif + Tue, 08 Dec 2009 02:24:53 GMT + 40418383947fe6335056fce05abe44a2 + 825 + + + file + /includes/edit_area/images/redo.gif + Tue, 08 Dec 2009 02:24:53 GMT + c2b3b80e20aa7f50ec45acb999373425 + 169 + + + file + /includes/edit_area/images/reset_highlight.gif + Tue, 08 Dec 2009 02:24:53 GMT + e9c387cc80f33b14447b628df1906639 + 168 + + + file + /includes/edit_area/images/save.gif + Tue, 08 Dec 2009 02:24:53 GMT + 2392d13d22fec22e69add07becf83e20 + 285 + + + file + /includes/edit_area/images/search.gif + Tue, 08 Dec 2009 02:24:53 GMT + 791e640ca1b345a84084eb611004de98 + 191 + + + file + /includes/edit_area/images/smooth_selection.gif + Tue, 08 Dec 2009 02:24:53 GMT + e6a384f19aef7c0fb2f2e0ee0bdc72e0 + 174 + + + file + /includes/edit_area/images/spacer.gif + Tue, 08 Dec 2009 02:24:53 GMT + 12bf9e19374920de3146a64775f46a5e + 43 + + + file + /includes/edit_area/images/statusbar_resize.gif + Tue, 08 Dec 2009 02:24:53 GMT + 1b952cd23844b834e0a307db3c803626 + 79 + + + file + /includes/edit_area/images/undo.gif + Tue, 08 Dec 2009 02:24:53 GMT + 7883b9e1f9bf0b860e77b904e1941591 + 175 + + + file + /includes/edit_area/images/word_wrap.gif + Tue, 08 Dec 2009 02:24:53 GMT + 47bd30f6fe667d34f37230b01544595a + 951 + + + directory + /includes/edit_area/langs + + + + + + file + /includes/edit_area/langs/bg.js + Tue, 08 Dec 2009 02:24:53 GMT + 33949d475debd38862a6c8a6a5934fb6 + 3132 + + + file + /includes/edit_area/langs/cs.js + Tue, 08 Dec 2009 02:24:53 GMT + a7ac795809ed32a3e42c5fe7ad5ca204 + 2202 + + + file + /includes/edit_area/langs/de.js + Tue, 08 Dec 2009 02:24:53 GMT + 2855b486c898565e93a4124aaf31b48d + 2244 + + + file + /includes/edit_area/langs/dk.js + Tue, 08 Dec 2009 02:24:53 GMT + cdda9d4383c055093c78d3ab4d8c71c5 + 2123 + + + file + /includes/edit_area/langs/en.js + Tue, 08 Dec 2009 02:24:53 GMT + a9941aeea2f8286991a4f2abe3d0367d + 1969 + + + file + /includes/edit_area/langs/eo.js + Tue, 08 Dec 2009 02:24:53 GMT + 97ee39c2f4861273de5ed1fb2280b8ae + 2282 + + + file + /includes/edit_area/langs/es.js + Tue, 08 Dec 2009 02:24:53 GMT + 877c2f5a72984003da94b082b0fa04ab + 2146 + + + file + /includes/edit_area/langs/fi.js + Tue, 08 Dec 2009 02:24:53 GMT + effce5cfeb1b273543d1def9226ce843 + 2126 + + + file + /includes/edit_area/langs/fr.js + Tue, 08 Dec 2009 02:24:53 GMT + e26b41e7407e91bb66e05abb7e9c0533 + 2413 + + + file + /includes/edit_area/langs/hr.js + Tue, 08 Dec 2009 02:24:53 GMT + 8179b813bea428c74c5d289aeb119a74 + 1985 + + + file + /includes/edit_area/langs/it.js + Tue, 08 Dec 2009 02:24:53 GMT + b937185e999b70255d161d15453a1cdf + 2113 + + + file + /includes/edit_area/langs/ja.js + Tue, 08 Dec 2009 02:24:53 GMT + a96e8fad9b9fef10138fb5be3f9b8b1a + 2171 + + + file + /includes/edit_area/langs/mk.js + Tue, 08 Dec 2009 02:24:53 GMT + 15acec0d9d4bee76f9f7fd90bc74f91e + 2817 + + + file + /includes/edit_area/langs/nl.js + Tue, 08 Dec 2009 02:24:53 GMT + 74b7565272926811078e12f746e2242a + 2034 + + + file + /includes/edit_area/langs/pl.js + Tue, 08 Dec 2009 02:24:53 GMT + 39ff6ff5981cc6730b6ee2832f47f556 + 2106 + + + file + /includes/edit_area/langs/pt.js + Tue, 08 Dec 2009 02:24:53 GMT + 6589eeeb1f79d896acfa7ab9dd5a7d97 + 1937 + + + file + /includes/edit_area/langs/ru.js + Tue, 08 Dec 2009 02:24:53 GMT + f9f79e8730db7701c4ec4eb612c815d9 + 2919 + + + file + /includes/edit_area/langs/sk.js + Tue, 08 Dec 2009 02:24:53 GMT + a664ffc9e05ddd7c8341645839ddeccf + 2211 + + + file + /includes/edit_area/langs/zh.js + Tue, 08 Dec 2009 02:24:53 GMT + 4f844bc3cde7edaf03ee66aefaabb40d + 2025 + + + directory + /includes/edit_area/plugins + + + + + + directory + /includes/edit_area/plugins/charmap + + + + + + file + /includes/edit_area/plugins/charmap/charmap.js + Tue, 08 Dec 2009 02:24:52 GMT + 15d5626b8375004c217dec10ce1346a4 + 2807 + + + directory + /includes/edit_area/plugins/charmap/css + + + + + + file + /includes/edit_area/plugins/charmap/css/charmap.css + Tue, 08 Dec 2009 02:24:52 GMT + 84eed9f0eaf34e71f528444d0fbd729c + 953 + + + directory + /includes/edit_area/plugins/charmap/images + + + + + + file + /includes/edit_area/plugins/charmap/images/charmap.gif + Tue, 08 Dec 2009 02:24:52 GMT + 948c608cfe393168642e3946097eba3d + 245 + + + directory + /includes/edit_area/plugins/charmap/jscripts + + + + + + file + /includes/edit_area/plugins/charmap/jscripts/map.js + Tue, 08 Dec 2009 02:24:52 GMT + 071107a09c753f3d2e88d0b99aa61820 + 11846 + + + directory + /includes/edit_area/plugins/charmap/langs + + + + + + file + /includes/edit_area/plugins/charmap/langs/bg.js + Tue, 08 Dec 2009 02:24:52 GMT + a4c60ccea1575a77c43c964ab1d78a62 + 396 + + + file + /includes/edit_area/plugins/charmap/langs/cs.js + Tue, 08 Dec 2009 02:24:52 GMT + d578b06a1b41e5da773ddb688d98bdd9 + 187 + + + file + /includes/edit_area/plugins/charmap/langs/de.js + Tue, 08 Dec 2009 02:24:52 GMT + b93418619c8678c6505c023b1072b80b + 192 + + + file + /includes/edit_area/plugins/charmap/langs/dk.js + Tue, 08 Dec 2009 02:24:52 GMT + e6395e180e9b9bd87a7e96cf745b101e + 187 + + + file + /includes/edit_area/plugins/charmap/langs/en.js + Tue, 08 Dec 2009 02:24:52 GMT + 17a20a2e46b7de8d7fa5370a9bf6b294 + 187 + + + file + /includes/edit_area/plugins/charmap/langs/eo.js + Tue, 08 Dec 2009 02:24:52 GMT + 0cc471de01b7ad207df32c450682cd3d + 175 + + + file + /includes/edit_area/plugins/charmap/langs/es.js + Tue, 08 Dec 2009 02:24:52 GMT + ea43e35253952cc33c85d3fe7c9bb27b + 187 + + + file + /includes/edit_area/plugins/charmap/langs/fr.js + Tue, 08 Dec 2009 02:24:52 GMT + 96c4acb5f590d7b403d3b0e319dfb349 + 194 + + + file + /includes/edit_area/plugins/charmap/langs/hr.js + Tue, 08 Dec 2009 02:24:52 GMT + 578178183db00474dfa660f616db86ae + 191 + + + file + /includes/edit_area/plugins/charmap/langs/it.js + Tue, 08 Dec 2009 02:24:52 GMT + 433ac140154e12f5423b226c6ed8e148 + 189 + + + file + /includes/edit_area/plugins/charmap/langs/ja.js + Tue, 08 Dec 2009 02:24:52 GMT + fc17e42e8ce2ac676f885d332244cbaa + 187 + + + file + /includes/edit_area/plugins/charmap/langs/mk.js + Tue, 08 Dec 2009 02:24:52 GMT + 4cc7a175a342f413101db66013f09900 + 188 + + + file + /includes/edit_area/plugins/charmap/langs/nl.js + Tue, 08 Dec 2009 02:24:52 GMT + 0e717e403d8c8f53e4376c3b4e09d6fd + 190 + + + file + /includes/edit_area/plugins/charmap/langs/pl.js + Tue, 08 Dec 2009 02:24:52 GMT + 52627faf46a7b1f8b8f5110358d224cf + 192 + + + file + /includes/edit_area/plugins/charmap/langs/pt.js + Tue, 08 Dec 2009 02:24:52 GMT + 9828da57868e6192b5c921400ab87d1f + 187 + + + file + /includes/edit_area/plugins/charmap/langs/ru.js + Tue, 08 Dec 2009 02:24:52 GMT + 67e1426c248ee6fe6274ee2fed23df22 + 275 + + + file + /includes/edit_area/plugins/charmap/langs/sk.js + Tue, 08 Dec 2009 02:24:52 GMT + 3da0f484cce154d5a8f06572ac5a8461 + 194 + + + file + /includes/edit_area/plugins/charmap/langs/zh.js + Tue, 08 Dec 2009 02:24:52 GMT + 50f6ecf19890d2cd305357ca9679684c + 169 + + + file + /includes/edit_area/plugins/charmap/popup.html + Tue, 08 Dec 2009 02:24:52 GMT + 7d97c56e6f29a3cdaacb934793133188 + 782 + + + directory + /includes/edit_area/plugins/test + + + + + + directory + /includes/edit_area/plugins/test/css + + + + + + file + /includes/edit_area/plugins/test/css/test.css + Tue, 08 Dec 2009 02:24:52 GMT + c6d48fc50bb974b20bec7731e312f5de + 53 + + + directory + /includes/edit_area/plugins/test/images + + + + + + file + /includes/edit_area/plugins/test/images/test.gif + Tue, 08 Dec 2009 02:24:52 GMT + 6036655a01df362267183a8b23fead10 + 87 + + + directory + /includes/edit_area/plugins/test/langs + + + + + + file + /includes/edit_area/plugins/test/langs/bg.js + Tue, 08 Dec 2009 02:24:51 GMT + d7123a41255600449aec9fc1f301c147 + 244 + + + file + /includes/edit_area/plugins/test/langs/cs.js + Tue, 08 Dec 2009 02:24:51 GMT + 1cefb4fd6e169dfe1950c35b4aff1eba + 84 + + + file + /includes/edit_area/plugins/test/langs/de.js + Tue, 08 Dec 2009 02:24:51 GMT + 7a7675c982dd18be1ced114aa70daafb + 92 + + + file + /includes/edit_area/plugins/test/langs/dk.js + Tue, 08 Dec 2009 02:24:51 GMT + 488f8af5a93283499dfebe551fb7f4ed + 84 + + + file + /includes/edit_area/plugins/test/langs/en.js + Tue, 08 Dec 2009 02:24:51 GMT + acb2b331564a8dc553302aa46d5f5d36 + 84 + + + file + /includes/edit_area/plugins/test/langs/eo.js + Tue, 08 Dec 2009 02:24:51 GMT + a010b4aa33bb848a8b16793910eb05ac + 89 + + + file + /includes/edit_area/plugins/test/langs/es.js + Tue, 08 Dec 2009 02:24:51 GMT + 687fba1e66bc7ef6cec32cb208e2b1d7 + 84 + + + file + /includes/edit_area/plugins/test/langs/fr.js + Tue, 08 Dec 2009 02:24:51 GMT + 7091caec9d5c627073e728ab74a3a5bd + 88 + + + file + /includes/edit_area/plugins/test/langs/hr.js + Tue, 08 Dec 2009 02:24:51 GMT + 152f29d20c99cb7d337f0f369dd71ceb + 86 + + + file + /includes/edit_area/plugins/test/langs/it.js + Tue, 08 Dec 2009 02:24:51 GMT + 7de5456ada17577d4fcbbfc619324662 + 92 + + + file + /includes/edit_area/plugins/test/langs/ja.js + Tue, 08 Dec 2009 02:24:51 GMT + 5ccb36b44757fc4e514498c4f447577c + 84 + + + file + /includes/edit_area/plugins/test/langs/mk.js + Tue, 08 Dec 2009 02:24:51 GMT + 7a5f9fbf31ac0783d92fcaed1f1c8295 + 84 + + + file + /includes/edit_area/plugins/test/langs/nl.js + Tue, 08 Dec 2009 02:24:51 GMT + 4b3627381f170e533d9eb767487f33d3 + 84 + + + file + /includes/edit_area/plugins/test/langs/pl.js + Tue, 08 Dec 2009 02:24:51 GMT + 255f97808244326878b647cecb64aebc + 78 + + + file + /includes/edit_area/plugins/test/langs/pt.js + Tue, 08 Dec 2009 02:24:51 GMT + dcbf418e8f05db1ef7b13cbc8e03782b + 84 + + + file + /includes/edit_area/plugins/test/langs/ru.js + Tue, 08 Dec 2009 02:24:51 GMT + 37a504c426450b8e738f7ebbd3ee7587 + 119 + + + file + /includes/edit_area/plugins/test/langs/sk.js + Tue, 08 Dec 2009 02:24:51 GMT + 1e7b4e0b10b36b9d63edc4d6bfeea172 + 92 + + + file + /includes/edit_area/plugins/test/langs/zh.js + Tue, 08 Dec 2009 02:24:51 GMT + 0a68369b57f733e07b1eb10c1c238d95 + 87 + + + file + /includes/edit_area/plugins/test/test.js + Tue, 08 Dec 2009 02:24:52 GMT + 8559ea076cd3f47bac8540f91369e7c6 + 3695 + + + file + /includes/edit_area/plugins/test/test2.js + Tue, 08 Dec 2009 02:24:52 GMT + 9bef02a43a1bd789ec6534f20fbbfc5d + 47 + + + directory + /includes/edit_area/reg_syntax + + + + + + file + /includes/edit_area/reg_syntax/basic.js + Tue, 08 Dec 2009 02:24:53 GMT + 68e21d612e33473e6326c1e72df6421e + 2650 + + + file + /includes/edit_area/reg_syntax/brainfuck.js + Tue, 08 Dec 2009 02:24:53 GMT + 6514a6685ea2b819c610f050b4c36a32 + 907 + + + file + /includes/edit_area/reg_syntax/c.js + Tue, 08 Dec 2009 02:24:53 GMT + 8668c7d1d3f4c1fae0fe5e46ef2b1fe9 + 1648 + + + file + /includes/edit_area/reg_syntax/coldfusion.js + Tue, 08 Dec 2009 02:24:53 GMT + 389c9d5f2cbab70de8109b549d6f103d + 5934 + + + file + /includes/edit_area/reg_syntax/cpp.js + Tue, 08 Dec 2009 02:24:53 GMT + 4af61c486401e028b44874169d6bda35 + 1853 + + + file + /includes/edit_area/reg_syntax/css.js + Tue, 08 Dec 2009 02:24:53 GMT + 33d561ba22a917c3279fb31a4a760551 + 4972 + + + file + /includes/edit_area/reg_syntax/html.js + Tue, 08 Dec 2009 02:24:53 GMT + b0f62d2507c072a89e51e60270f911d7 + 1116 + + + file + /includes/edit_area/reg_syntax/java.js + Tue, 08 Dec 2009 02:24:53 GMT + 548e6e6ff4547cbec9b38f1f09b49f95 + 1667 + + + file + /includes/edit_area/reg_syntax/js.js + Tue, 08 Dec 2009 02:24:53 GMT + 2d77b33a886e435004e11a1835f4b6f9 + 4368 + + + file + /includes/edit_area/reg_syntax/pas.js + Tue, 08 Dec 2009 02:24:53 GMT + 34dabdc2dc2df0c5a8865ad6f3f3688e + 3292 + + + file + /includes/edit_area/reg_syntax/perl.js + Tue, 08 Dec 2009 02:24:53 GMT + e01cf02194bff0a6c3565b2b93399887 + 3166 + + + file + /includes/edit_area/reg_syntax/php.js + Tue, 08 Dec 2009 02:24:53 GMT + d0048d0d4a51f0e2fb359169f62828d3 + 14135 + + + file + /includes/edit_area/reg_syntax/python.js + Tue, 08 Dec 2009 02:24:53 GMT + 776815baeec98159e3f1f6ae6a4d70c0 + 7897 + + + file + /includes/edit_area/reg_syntax/robotstxt.js + Tue, 08 Dec 2009 02:24:53 GMT + f24de940202b28b84d393703cf73fd7e + 634 + + + file + /includes/edit_area/reg_syntax/ruby.js + Tue, 08 Dec 2009 02:24:53 GMT + cf881ed977dc8dcc5683c186a55e566f + 1732 + + + file + /includes/edit_area/reg_syntax/sql.js + Tue, 08 Dec 2009 02:24:53 GMT + 1696ab1abdc071d299af651defdaea4f + 3384 + + + file + /includes/edit_area/reg_syntax/tsql.js + Tue, 08 Dec 2009 02:24:53 GMT + fef976fba89b77c46191eb3d9288e7c1 + 5211 + + + file + /includes/edit_area/reg_syntax/vb.js + Tue, 08 Dec 2009 02:24:53 GMT + 1614b162371030dd3372c80bbc40084c + 2196 + + + file + /includes/edit_area/reg_syntax/xml.js + Tue, 08 Dec 2009 02:24:53 GMT + 5fda1c26de462cbdf74ef0c185bcb8d8 + 1264 + + + file + /includes/footer.php + Thu, 09 Sep 2010 04:19:23 GMT + 7c0bc2cfa1fc969dbd2a578ceb4ba700 + 4820 + + + file + /includes/getcontent.php + Sat, 06 Feb 2010 18:18:53 GMT + c8c28473f6285fabb6ea4543c157e7b6 + 1874 + + + file + /includes/header.php + Sat, 06 Feb 2010 18:18:53 GMT + 4eac32156e9dfc3adac6c33c134ddc5e + 1458 + + + directory + /includes/install + + + + + + directory + /includes/install/autoload_configs + + + + + + file + /includes/install/autoload_configs/cdr_csv.conf.xml + Tue, 08 Dec 2009 02:24:56 GMT + 8b824abf2cc66031ffa9f8d51e4d2b44 + 2463 + + + directory + /includes/install/dialplan + + + + + + file + /includes/install/dialplan/default.xml + Wed, 11 Aug 2010 13:51:49 GMT + 156993963dc7b2c2112eaee26021b4d8 + 33866 + + + directory + /includes/install/htdocs + + + + + + file + /includes/install/htdocs/license.txt + Tue, 08 Dec 2009 02:24:56 GMT + e477142260885b28359224de461f8bed + 1492 + + + file + /includes/install/htdocs/slim.swf + Tue, 08 Dec 2009 02:24:56 GMT + 6da31effb6edadd3c7d55d3dc3877d00 + 56327 + + + file + /includes/install/htdocs/slimtest.htm + Tue, 08 Dec 2009 02:24:56 GMT + f11e41bdc8a118ea03b32fa4d9b2eb5c + 789 + + + directory + /includes/install/scripts + + + + + + file + /includes/install/scripts/call_broadcast_originate.js + Fri, 12 Mar 2010 01:03:35 GMT + c88b59e727795ecd439696fad076c00a + 2784 + + + file + /includes/install/scripts/call_forward_basic.lua + Sat, 21 Aug 2010 16:40:31 GMT + 75055a5e981fb90ad16d678449853c15 + 6941 + + + file + /includes/install/scripts/disa.lua + Sat, 28 Aug 2010 07:27:50 GMT + e9d0a9f5368cf132bf74ade7044b2556 + 5818 + + + file + /includes/install/scripts/huntgroup_originate.js + Tue, 06 Jul 2010 07:11:16 GMT + 2fcbbcee41cdab48515456f24f707e3d + 2417 + + + file + /includes/install/scripts/intercom.lua + Sat, 02 Oct 2010 21:29:15 GMT + 470c734e4cc5b1bf18a47a4ada28015c + 5057 + + + file + /includes/install/scripts/originate.js + Tue, 06 Jul 2010 07:11:58 GMT + c20d8be185c08e665ce763ca1bd20595 + 1152 + + + file + /includes/install/scripts/recordings.lua + Sat, 18 Sep 2010 23:31:58 GMT + 1b462d10b8d7b93ed0b14c4a2e63c562 + 5618 + + + file + /includes/install/scripts/roku.lua + Thu, 09 Sep 2010 22:29:29 GMT + 88a5b268bd9b45587f0d41e612217db3 + 3338 + + + directory + /includes/install/sounds + + + + + + directory + /includes/install/sounds/custom + + + + + + directory + /includes/install/sounds/custom/16000 + + + + + + file + /includes/install/sounds/custom/16000/begin_recording.wav + Tue, 06 Jul 2010 07:27:24 GMT + bbf95551bbdbc5316b4f73ea805b770b + 77156 + + + file + /includes/install/sounds/custom/16000/call_forward_has_been_deleted.wav + Tue, 06 Jul 2010 07:27:59 GMT + aa9eb7ba0d8d02639bdfeee379c364d6 + 114092 + + + file + /includes/install/sounds/custom/16000/call_forward_has_been_set.wav + Tue, 06 Jul 2010 07:28:21 GMT + 7321c5225cff0bcc45bbb22cc8afc8b1 + 123164 + + + file + /includes/install/sounds/custom/16000/followme_menu.wav + Tue, 06 Jul 2010 07:33:02 GMT + bfb5873ad6c52af49589ad861a325e8d + 248228 + + + file + /includes/install/sounds/custom/16000/please_enter_the_extension_number.wav + Tue, 06 Jul 2010 07:26:53 GMT + feebc69643e05097154681293147ac8b + 128996 + + + file + /includes/install/sounds/custom/16000/please_enter_the_phone_number.wav + Tue, 06 Jul 2010 07:29:15 GMT + 422e2520cc768e7bd5aa7c9fe2044d1a + 105668 + + + file + /includes/install/sounds/custom/16000/please_enter_the_pin_number.wav + Tue, 06 Jul 2010 07:29:42 GMT + b9c2800746b860c1ff60f4690a2b3f00 + 109556 + + + file + /includes/install/sounds/custom/16000/please_enter_your_pin_number.wav + Tue, 06 Jul 2010 07:30:07 GMT + 8c563af0f07284a00df7a37c64e95cc4 + 112148 + + + file + /includes/install/sounds/custom/16000/please_say_your_name_and_reason_for_calling.wav + Tue, 06 Jul 2010 07:30:35 GMT + 0410a0ca15c77c68d4bd359b6624e2b1 + 143252 + + + file + /includes/install/sounds/custom/16000/press_1_to_accept_2_to_reject_or_3_for_voicemail.wav + Tue, 06 Jul 2010 07:31:08 GMT + 07f2ceb86d16823a4df1874c8d507ffc + 223604 + + + file + /includes/install/sounds/custom/16000/your_pin_number_is_incorect_goodbye.wav + Tue, 06 Jul 2010 07:31:46 GMT + ccae9539f0bf07171782a88170f77bc8 + 143252 + + + directory + /includes/install/sounds/custom/8000 + + + + + + file + /includes/install/sounds/custom/8000/begin_recording.wav + Tue, 08 Dec 2009 02:25:02 GMT + 55b24f8fcf30d59da9cf9176329b702c + 19480 + + + file + /includes/install/sounds/custom/8000/call_forward_has_been_deleted.wav + Tue, 08 Dec 2009 02:25:02 GMT + b04be640cff8a9a5a609880ad48b2e11 + 28668 + + + file + /includes/install/sounds/custom/8000/call_forward_has_been_set.wav + Tue, 08 Dec 2009 02:25:02 GMT + 6b7cfd2e67f488db89e9e3b454fdaa61 + 30976 + + + file + /includes/install/sounds/custom/8000/followme_menu.wav + Tue, 08 Dec 2009 02:25:02 GMT + 6d207d938e1eff410ecbe42bc89d1b86 + 66860 + + + file + /includes/install/sounds/custom/8000/please_enter_the_extension_number.wav + Tue, 08 Dec 2009 02:25:02 GMT + 7094ea33f7319b94eab72ebcab621ea4 + 32360 + + + file + /includes/install/sounds/custom/8000/please_enter_the_phone_number.wav + Tue, 08 Dec 2009 02:25:02 GMT + 641f6b17ff5cf538c0937aa17b178adc + 26552 + + + file + /includes/install/sounds/custom/8000/please_enter_the_pin_number.wav + Tue, 08 Dec 2009 02:25:02 GMT + 82759320121a88f7a6d6bdd7eecfca5b + 27504 + + + file + /includes/install/sounds/custom/8000/please_enter_your_pin_number.wav + Tue, 08 Dec 2009 02:25:02 GMT + 63d1b5fa350a0e2b6ead3220b6b3b061 + 28212 + + + file + /includes/install/sounds/custom/8000/please_say_your_name_and_reason_for_calling.wav + Tue, 08 Dec 2009 02:25:02 GMT + 7fcbd940088c0a423d60d10909fa64c7 + 35860 + + + file + /includes/install/sounds/custom/8000/press_1_to_accept_2_to_reject_or_3_for_voicemail.wav + Tue, 08 Dec 2009 02:25:02 GMT + b24a2008ac97127a22c5b1a81c768f06 + 68104 + + + file + /includes/install/sounds/custom/8000/your_pin_number_is_incorect_goodbye.wav + Tue, 08 Dec 2009 02:25:02 GMT + 6c3d7230382ecaf5110335d41e609549 + 43420 + + + file + /includes/install/source.xml + Thu, 09 Sep 2010 05:07:14 GMT + f4e6de980c77dd44fc860d6899bf7f2e + 146914 + + + directory + /includes/install/sql + + + + + + file + /includes/install/sql/mysql.sql + Sat, 18 Sep 2010 20:09:43 GMT + 916e8fe7f7477f196cb724ec2da1ca94 + 41951 + + + file + /includes/install/sql/pgsql.sql + Sat, 18 Sep 2010 20:09:50 GMT + 201eb1f2001c9839dbd005de6e764722 + 42761 + + + file + /includes/install/sql/sqlite.sql + Sat, 18 Sep 2010 20:08:35 GMT + 02662b3efdeb52cb09ba47203984c8d2 + 41728 + + + file + /includes/lib_cdr.php + Sat, 06 Feb 2010 18:18:53 GMT + 83d550d6c159fb6db6d0d6605f8ed5ee + 3111 + + + file + /includes/lib_functions.php + Thu, 23 Sep 2010 10:36:46 GMT + 28ba5b89a5660e0734239d4439a60e98 + 20444 + + + file + /includes/lib_install_copy.php + Tue, 21 Sep 2010 16:40:39 GMT + 6db91d8c03136b915d65371b801311d0 + 10391 + + + file + /includes/lib_pdo.php + Thu, 23 Sep 2010 08:11:46 GMT + 2a66473313ff282fc45b0328ccfa6feb + 8465 + + + file + /includes/lib_php.php + Tue, 09 Mar 2010 23:56:52 GMT + 3ba8c2dfb9a069de73dbcacfdbf99273 + 3770 + + + file + /includes/lib_schema.php + Fri, 01 Oct 2010 15:46:30 GMT + 90340704c5af4240884aa6bd76ed0de1 + 11343 + + + file + /includes/lib_switch.php + Wed, 22 Sep 2010 15:30:03 GMT + a96c4f73ee5321da9786b9f940e835d3 + 217716 + + + file + /includes/lib_system_settings_default.php + Mon, 30 Aug 2010 22:04:47 GMT + 0062ee7b9fd7d1ea021ef03ada2e799c + 8733 + + + file + /includes/menu.php + Sun, 18 Apr 2010 02:58:04 GMT + 8825aef61e2df6e755579ab750a52e6b + 9533 + + + file + /includes/menu_list.php + Sun, 18 Apr 2010 03:03:28 GMT + 5d695dfe5ee9b84b3fb3ac394aad120c + 10495 + + + file + /includes/paging.php + Sat, 06 Feb 2010 18:17:54 GMT + 6130c7876f557bf9762376363fcee359 + 3467 + + + file + /includes/persistform.php + Sat, 06 Feb 2010 18:17:54 GMT + e2d36087c696746e62bc3d28367d05b5 + 1571 + + + file + /includes/persistformvar.php + Sat, 06 Feb 2010 18:17:54 GMT + 7be4848bfd70ceff231ccc0f6f896778 + 1605 + + + directory + /includes/pop3 + + + + + + file + /includes/pop3/mime_parser.php + Fri, 09 Apr 2010 00:01:37 GMT + 9f6694873f9785bb3f0f640a417dbd8f + 77658 + + + file + /includes/pop3/parse_message.php + Sun, 01 Feb 2009 16:33:42 GMT + e9108d04e271950c5711cda9b7ab88dd + 2589 + + + file + /includes/pop3/pop3.php + Sun, 01 Feb 2009 16:33:42 GMT + db16cec54c4ac61b749e35689c9c9787 + 23819 + + + file + /includes/pop3/rfc822_addresses.php + Fri, 09 Apr 2010 00:01:37 GMT + 5a4310adf2b11f5154531ad5d6c68b0f + 20122 + + + directory + /includes/templates/provision + + + + + + directory + /includes/templates/provision/aastra + + + + + + directory + /includes/templates/provision/aastra/675x + + + + + + file + /includes/templates/provision/aastra/675x/{v_mac}.cfg + Thu, 19 Aug 2010 07:41:58 GMT + dabe18bd088393a798ce77e09d4e84c7 + 3697 + + + directory + /includes/templates/provision/cisco + + + + + + directory + /includes/templates/provision/cisco/7940 + + + + + + directory + /includes/templates/provision/cisco/7960 + + + + + + directory + /includes/templates/provision/grandstream + + + + + + directory + /includes/templates/provision/linksys + + + + + + directory + /includes/templates/provision/linksys/spa942 + + + + + + file + /includes/templates/provision/linksys/spa942/{v_mac}.xml + Mon, 05 Jul 2010 17:58:03 GMT + 826df81f528099612f785bb68ca542f8 + 1364 + + + directory + /includes/templates/provision/polycom + + + + + + directory + /includes/templates/provision/snom + + + + + + directory + /includes/templates/provision/snom/820 + + + + + + file + /includes/templates/provision/snom/820/{v_mac}.xml + Sun, 27 Jun 2010 10:02:56 GMT + 46c1aa2b3da420cd26fd7b361bcd3360 + 2373 + + + directory + /includes/templates/provision/yealink + + + + + + file + /includes/root.php + Sat, 06 Feb 2010 18:17:54 GMT + a20aca300a3c9c1cdd724971dba4626d + 1913 + + + file + /includes/securedownload.php + Sat, 06 Feb 2010 18:17:54 GMT + 5fd41baaed351b0f27c6774b64ee8096 + 2941 + + + file + /includes/upload.php + Sat, 06 Feb 2010 18:17:54 GMT + 64d6abe31bcfa5d107d4f8b9eb9581d3 + 1705 + + + file + /includes/cmd.php + Sat, 06 Feb 2010 18:17:54 GMT + 3041c90a77039729bb041c0679a0c80e + 1788 + + + file + /includes/v_dialplan_entry_exists.php + Sat, 06 Feb 2010 18:17:54 GMT + 38f66218cc0ca9faa16a81bb7bdf3027 + 4093 + + + file + /includes/wysiwyg.php + Sat, 06 Feb 2010 18:17:17 GMT + 951c322cd95551458a036020407add07 + 7093 + + + file + /index.php + Thu, 23 Sep 2010 10:37:11 GMT + 3a4264b33e02dc3d8cf804f845e0bbd7 + 11206 + + + file + /install.php + Thu, 23 Sep 2010 08:43:41 GMT + 0fb3b6e5b3b51f763949eb54b97c5f29 + 54107 + + + file + /licenses.php + Mon, 21 Jun 2010 23:56:08 GMT + bdc853e1bb9d26b93cbc9fb5ec39bbef + 3476 + + + file + /login.php + Thu, 29 Jul 2010 03:05:07 GMT + c9fc2ebbbe95518fbeb3144afa78fae2 + 2558 + + + file + /logout.php + Sat, 06 Feb 2010 18:12:33 GMT + 4c47ffae19cabefbdd41b5fa9626059b + 1015 + + + directory + /mod + + + + + + directory + /mod/auto_attendant + + + + + + file + /mod/auto_attendant/root.php + Sat, 06 Feb 2010 18:30:59 GMT + a20aca300a3c9c1cdd724971dba4626d + 1913 + + + file + /mod/auto_attendant/v_auto_attendant.php + Mon, 22 Feb 2010 23:04:56 GMT + 0c777740aca5f973cf4ca418c56c7c4a + 6376 + + + file + /mod/auto_attendant/v_auto_attendant_delete.php + Sat, 06 Feb 2010 18:31:00 GMT + 1438343375ffcc1d364acbc13180a670 + 2995 + + + file + /mod/auto_attendant/v_auto_attendant_edit.php + Sat, 28 Aug 2010 18:49:38 GMT + 0ce8cf0a49722d42e22c21314469cc8a + 31690 + + + file + /mod/auto_attendant/v_auto_attendant_options_delete.php + Sat, 06 Feb 2010 18:30:59 GMT + 17c1ee1f30ab48c4129012ded718c3f3 + 1790 + + + file + /mod/auto_attendant/v_auto_attendant_options_edit.php + Sat, 28 Aug 2010 18:49:30 GMT + 2418d4d58f7a2a2ffab01708100e6b92 + 13141 + + + directory + /mod/calls_active + + + + + + file + /mod/calls_active/root.php + Tue, 20 Oct 2009 18:13:40 GMT + 1d66d2f0f6ca694fc5d98c5b0e94e05b + 1091 + + + file + /mod/calls_active/v_calls_active.php + Sat, 10 Apr 2010 02:36:26 GMT + 3de488dfe1ae12f7588db2f738934089 + 5325 + + + file + /mod/calls_active/v_calls_active_assigned_extensions_inc.php + Sun, 22 Aug 2010 08:51:29 GMT + a0d720d60f75b2a16c4ee8823cd8db1d + 11664 + + + file + /mod/calls_active/v_calls_active_extensions.php + Mon, 30 Aug 2010 18:05:51 GMT + bc748bd109faf4bb24dc6fbf0499dd60 + 7747 + + + file + /mod/calls_active/v_calls_active_extensions_inc.php + Fri, 27 Aug 2010 23:54:49 GMT + d650fb5ec6a51c455aa8e6c33c1781a1 + 16404 + + + file + /mod/calls_active/v_calls_active_inc.php + Thu, 27 May 2010 22:59:34 GMT + 6995c9e3c2a184612eee1115a9364e37 + 14295 + + + file + /mod/calls_active/v_calls_exec.php + Sat, 18 Sep 2010 21:19:42 GMT + dd5ed8421d87d8b10b290e2e3190c412 + 5186 + + + directory + /mod/call_broadcast + + + + + + file + /mod/call_broadcast/root.php + Fri, 12 Feb 2010 06:43:53 GMT + a20aca300a3c9c1cdd724971dba4626d + 1913 + + + file + /mod/call_broadcast/v_call_broadcast.php + Fri, 03 Sep 2010 08:06:49 GMT + e3091908fd30670bc8031e70f3c62875 + 5710 + + + file + /mod/call_broadcast/v_call_broadcast_delete.php + Fri, 12 Feb 2010 06:43:52 GMT + 3e34c7486be6c4723141c9bf613ac614 + 1524 + + + file + /mod/call_broadcast/v_call_broadcast_edit.php + Fri, 03 Sep 2010 08:07:01 GMT + 7934aa16d6978744d1fd6f0770e48a8d + 18426 + + + file + /mod/call_broadcast/v_call_broadcast_send.php + Fri, 25 Jun 2010 04:12:52 GMT + a40a6e6829bb0c62b2c2fbeaebb7c104 + 13138 + + + directory + /mod/call_forward + + + + + + file + /mod/call_forward/root.php + Sat, 06 Feb 2010 18:31:36 GMT + a20aca300a3c9c1cdd724971dba4626d + 1913 + + + file + /mod/call_forward/v_call_forward.php + Sun, 19 Sep 2010 03:39:37 GMT + cd8f2129b853ab739e8060d3ffe7e43c + 8278 + + + file + /mod/call_forward/v_call_forward_add.php + Thu, 15 Jul 2010 08:58:36 GMT + a3138810902b87fe1c38599813dbf816 + 26761 + + + file + /mod/call_forward/v_call_forward_delete.php + Sat, 06 Feb 2010 18:31:37 GMT + 9a8dd600b6467a831b6344a4da359a89 + 1825 + + + file + /mod/call_forward/v_call_forward_details_delete.php + Sat, 06 Feb 2010 18:31:36 GMT + e7e9864c56887d50ca37e861b55faaf3 + 1742 + + + file + /mod/call_forward/v_call_forward_details_edit.php + Sun, 23 May 2010 06:24:56 GMT + 150a27be5f1325dd1fc82f4350288cac + 16253 + + + file + /mod/call_forward/v_call_forward_edit.php + Sat, 28 Aug 2010 18:49:11 GMT + 45f94c9284cf075e6d8614ab7936b9a2 + 19401 + + + directory + /mod/cdr + + + + + + file + /mod/cdr/root.php + Sat, 06 Feb 2010 18:09:39 GMT + a20aca300a3c9c1cdd724971dba4626d + 1913 + + + file + /mod/cdr/v_cdr.php + Sun, 29 Aug 2010 04:35:01 GMT + acdcd298d1926225ca8f0c39b9b7b34c + 18036 + + + file + /mod/cdr/v_cdr_csv.php + Sun, 29 Aug 2010 04:35:31 GMT + 3a021e1cdcbd9940cc74261838c52b5b + 6104 + + + file + /mod/cdr/v_cdr_edit.php + Sat, 28 Aug 2010 18:49:02 GMT + 51cb63bc7bce086f045af86c0bb4faf2 + 17414 + + + file + /mod/cdr/v_cdr_import.php + Sun, 23 May 2010 06:23:48 GMT + 73ef6714bb4a115430664c0e82447c81 + 3248 + + + file + /mod/cdr/v_cdr_search.php + Tue, 06 Jul 2010 22:02:44 GMT + 425fe4561ac66de5bf3d595307bdd5bc + 5811 + + + directory + /mod/click_to_call + + + + + + file + /mod/click_to_call/click_to_call.php + Tue, 04 May 2010 02:47:08 GMT + a81e4afd3294f387865ae30a08bba761 + 5398 + + + file + /mod/click_to_call/root.php + Thu, 11 Mar 2010 10:21:32 GMT + a20aca300a3c9c1cdd724971dba4626d + 1913 + + + directory + /mod/conferences + + + + + + file + /mod/conferences/root.php + Sat, 06 Feb 2010 18:30:24 GMT + a20aca300a3c9c1cdd724971dba4626d + 1913 + + + file + /mod/conferences/v_conferences.php + Sat, 18 Sep 2010 18:41:56 GMT + ae89b09587aae22ca8a047769ba34add + 8971 + + + file + /mod/conferences/v_conferences_delete.php + Sat, 06 Feb 2010 18:30:23 GMT + 4ef8cc1ea94058b0319f364024033eac + 1824 + + + file + /mod/conferences/v_conferences_details_delete.php + Sat, 06 Feb 2010 18:30:23 GMT + 7188d5fb3a4e7bb692ae107d993bdc87 + 1741 + + + file + /mod/conferences/v_conferences_details_edit.php + Sun, 23 May 2010 06:25:30 GMT + 2b519d42e181fd784b4a125c6c1d2d2f + 16274 + + + file + /mod/conferences/v_conferences_edit.php + Sat, 18 Sep 2010 18:41:15 GMT + 3f0b47f93758ff1e26c5fb169cfaf98a + 21403 + + + file + /mod/conferences/v_conferences_edit_advanced.php + Thu, 15 Jul 2010 22:20:31 GMT + 4276f5bcd02bebfd87c9d8ed9e5f15ee + 18909 + + + directory + /mod/conferences_active + + + + + + file + /mod/conferences_active/root.php + Tue, 20 Oct 2009 18:13:40 GMT + 1d66d2f0f6ca694fc5d98c5b0e94e05b + 1091 + + + file + /mod/conferences_active/v_conferences_active.php + Thu, 11 Feb 2010 18:35:26 GMT + 4e4e0c721682df1d6e0c95eb1e60c967 + 3537 + + + file + /mod/conferences_active/v_conferences_active_inc.php + Thu, 11 Feb 2010 20:41:22 GMT + 7f0bf3a18c3fed1540ca2b33baaf2fc4 + 3284 + + + file + /mod/conferences_active/v_conference_exec.php + Thu, 13 May 2010 11:16:52 GMT + bf5bcab7e8abf841491058acf55ae60a + 4027 + + + file + /mod/conferences_active/v_conference_interactive.php + Thu, 11 Feb 2010 18:36:17 GMT + b233603ea73fea87488b7da81e39c2c6 + 4164 + + + file + /mod/conferences_active/v_conference_interactive_inc.php + Thu, 13 May 2010 10:58:29 GMT + 68214114f8ddd7127aa1c27f16f4f93d + 7970 + + + directory + /mod/contacts + + + + + + file + /mod/contacts/root.php + Sat, 06 Feb 2010 18:29:43 GMT + a20aca300a3c9c1cdd724971dba4626d + 1913 + + + file + /mod/contacts/users.php + Fri, 03 Sep 2010 07:40:48 GMT + 11a9edefb97be120ae6a1315ca8a207a + 6905 + + + file + /mod/contacts/users_delete.php + Sat, 06 Feb 2010 18:29:43 GMT + 5ef460395fc017831c06720cc3a25092 + 1531 + + + file + /mod/contacts/users_edit.php + Sat, 28 Aug 2010 18:48:55 GMT + cafb237d4d3944e326f5a82b5ab8888f + 42268 + + + file + /mod/contacts/users_vcard.php + Tue, 08 Jun 2010 05:37:43 GMT + 4b84fc5b607f5501dcd56d433bd430c8 + 4354 + + + directory + /mod/content + + + + + + file + /mod/content/index.php + Sat, 06 Feb 2010 18:07:33 GMT + 0d5bda44b8b09c0db174bab3e3544674 + 1233 + + + file + /mod/content/root.php + Sat, 06 Feb 2010 18:07:29 GMT + a20aca300a3c9c1cdd724971dba4626d + 1913 + + + file + /mod/content/rss.css + Tue, 08 Dec 2009 02:25:06 GMT + a3f96f1ba9be618ea2154531627e80f8 + 694 + + + file + /mod/content/rss.php + Sat, 06 Feb 2010 18:09:06 GMT + aa0d12cd56d15f9e1f5da159444c8a27 + 7682 + + + file + /mod/content/rssadd.php + Sun, 23 May 2010 06:26:22 GMT + 202ce21c18632c09e9bf02e19552f7a3 + 10477 + + + file + /mod/content/rsscontent.php + Sat, 06 Feb 2010 18:08:59 GMT + 228dae7777d58771f221f00b32018653 + 2012 + + + file + /mod/content/rssdelete.php + Sun, 23 May 2010 06:43:08 GMT + b0cc4c8cc2d85c2923ffdf27fe9918d5 + 1679 + + + file + /mod/content/rsslist.php + Wed, 24 Feb 2010 16:13:54 GMT + 2649f7eecd704336e7525eed5a043b06 + 8186 + + + file + /mod/content/rssmovedown.php + Sun, 23 May 2010 06:26:48 GMT + 59a6c22433a88901a30001e4b1b594c9 + 2675 + + + file + /mod/content/rssmoveup.php + Sun, 23 May 2010 06:27:00 GMT + 629bc473f58cc7fca44aee0559372d8d + 2198 + + + file + /mod/content/rsssearch.php + Sat, 06 Feb 2010 18:08:42 GMT + f55e6c830fb6925129351c05f5e2ab39 + 10682 + + + file + /mod/content/rsssubadd.php + Sun, 23 May 2010 06:56:28 GMT + e499313ab65420dd3476cc4a2a395102 + 5087 + + + file + /mod/content/rsssubcategoryadd.php + Sun, 23 May 2010 06:58:00 GMT + 474155551f4694d33fa0959948fe1dbf + 3334 + + + file + /mod/content/rsssubcategorylist.php + Sat, 06 Feb 2010 18:08:18 GMT + 8ac2d1a519a64aeceaf3cc2e36c12eb2 + 6260 + + + file + /mod/content/rsssubcategoryupdate.php + Sat, 06 Feb 2010 18:08:12 GMT + 3df7a52702ac43ef0503d8e0ad7e39c0 + 4137 + + + file + /mod/content/rsssubdelete.php + Sun, 23 May 2010 06:43:26 GMT + 8b60324d6755d64357d034b35c727c85 + 1692 + + + file + /mod/content/rsssublist.php + Sat, 06 Feb 2010 18:08:04 GMT + 639203a208621a400d7bc04917660a1c + 14992 + + + file + /mod/content/rsssubsearch.php + Sat, 06 Feb 2010 18:08:00 GMT + 19203a2e993a429b7dded8a2c724d4a7 + 10203 + + + file + /mod/content/rsssubupdate.php + Sat, 06 Feb 2010 18:07:49 GMT + 02a9263e38177e0c6302b2a084328fa5 + 6956 + + + file + /mod/content/rssupdate.php + Sun, 05 Sep 2010 07:29:15 GMT + e618ee07c766a86767d138edefc6b388 + 14159 + + + directory + /mod/dialplan + + + + + + file + /mod/dialplan/root.php + Sat, 06 Feb 2010 18:07:05 GMT + a20aca300a3c9c1cdd724971dba4626d + 1913 + + + file + /mod/dialplan/v_dialplans.php + Sat, 01 May 2010 07:58:21 GMT + a3be48af0b44ecfefa947281feaa8585 + 4431 + + + file + /mod/dialplan/v_dialplans.php + Tue, 04 May 2010 01:28:42 GMT + b1a0d09a3c629c9c70183cd92a1889f8 + 6568 + + + file + /mod/dialplan/dialplan_add.php + Sat, 14 Aug 2010 07:01:10 GMT + 3d234f0355ce2c1b332ce504260d568e + 26489 + + + file + /mod/dialplan/v_dialplan_delete.php + Sat, 01 May 2010 19:07:25 GMT + 70c98ad23504a24fa38c13c6ca8ee0b6 + 1830 + + + file + /mod/dialplan/v_dialplan_details_delete.php + Tue, 04 May 2010 01:29:47 GMT + a731a9a1e8963c1a1aecd5f3bd0eafb2 + 1747 + + + file + /mod/dialplan/v_dialplan_details_edit.php + Sun, 23 May 2010 06:27:22 GMT + fb41795185cfbec6470d738ef5a924e7 + 16312 + + + file + /mod/dialplan/v_dialplan_edit.php + Sat, 28 Aug 2010 18:50:00 GMT + f5421ef8b178c5af04abab3f8c7adfd5 + 19521 + + + directory + /mod/dialplan_outbound + + + + + + file + /mod/dialplan_outbound/root.php + Thu, 15 Jul 2010 22:20:31 GMT + a20aca300a3c9c1cdd724971dba4626d + 1913 + + + file + /mod/dialplan_outbound/v_dialplan_outbound.php + Thu, 02 Sep 2010 08:17:36 GMT + 14b0b555ae6840a52d67f8f0e0363f57 + 8088 + + + file + /mod/dialplan_outbound/v_dialplan_outbound_add.php + Fri, 03 Sep 2010 06:57:37 GMT + 27c70472cc21e12e6816a970bdabe237 + 23379 + + + file + /mod/dialplan_outbound/v_dialplan_outbound_delete.php + Thu, 02 Sep 2010 08:03:59 GMT + 14fb4d0b98d3583c6d24daeb46fd3939 + 1830 + + + file + /mod/dialplan_outbound/v_dialplan_outbound_details_delete.php + Thu, 02 Sep 2010 08:03:58 GMT + 6b9b76c12378bb24d087fbc839f7c8b2 + 1747 + + + file + /mod/dialplan_outbound/v_dialplan_outbound_details_edit.php + Fri, 03 Sep 2010 01:18:55 GMT + c65c6eaaa48a9e490e13993143dd4182 + 16160 + + + file + /mod/dialplan_outbound/v_dialplan_outbound_edit.php + Thu, 02 Sep 2010 08:19:22 GMT + c6c0e2b04090844b31535f58e70ff8c1 + 18988 + + + directory + /mod/exec + + + + + + file + /mod/exec/root.php + Sat, 06 Feb 2010 18:29:14 GMT + a20aca300a3c9c1cdd724971dba4626d + 1913 + + + file + /mod/exec/v_exec.php + Sat, 10 Apr 2010 02:34:16 GMT + 8e33fb266adfaa5e267be76ab9c1c1a1 + 7190 + + + directory + /mod/extensions + + + + + + file + /mod/extensions/root.php + Sat, 06 Feb 2010 18:06:15 GMT + a20aca300a3c9c1cdd724971dba4626d + 1913 + + + file + /mod/extensions/v_extensions.php + Thu, 05 Aug 2010 15:52:26 GMT + 3ef63d4f5b1cf9c304ee40ee4ceb37b7 + 5813 + + + file + /mod/extensions/v_extensions_delete.php + Sat, 06 Feb 2010 18:06:15 GMT + da29fa8196cbf0be474eba43be84b68a + 1586 + + + file + /mod/extensions/v_extensions_edit.php + Tue, 07 Sep 2010 12:02:49 GMT + 7d50119a307ef438bd50d8922f6d2554 + 32017 + + + directory + /mod/fax + + + + + + file + /mod/fax/root.php + Sat, 06 Feb 2010 18:28:52 GMT + a20aca300a3c9c1cdd724971dba4626d + 1913 + + + file + /mod/fax/v_fax.php + Tue, 29 Jun 2010 06:48:29 GMT + 5812644d3d5a2c44771bdf9cf8a02e3f + 5489 + + + file + /mod/fax/v_fax_delete.php + Tue, 29 Jun 2010 06:47:47 GMT + e688ce09274ddd3b2b7fc3413080fbae + 1503 + + + file + /mod/fax/v_fax_edit.php + Mon, 12 Jul 2010 16:04:27 GMT + 5b42f88134c8511277aeacf1c154e8ed + 29625 + + + directory + /mod/features + + + + + + file + /mod/features/root.php + Sat, 06 Feb 2010 18:28:15 GMT + a20aca300a3c9c1cdd724971dba4626d + 1913 + + + file + /mod/features/v_features.php + Wed, 24 Feb 2010 07:36:30 GMT + 3d5c49ea8ba3b39e56729c67597f87f5 + 5671 + + + directory + /mod/fifo + + + + + + file + /mod/fifo/root.php + Sat, 10 Jul 2010 02:32:26 GMT + a20aca300a3c9c1cdd724971dba4626d + 1913 + + + file + /mod/fifo/v_fifo.php + Tue, 13 Jul 2010 05:57:16 GMT + 37d054a855d6d6d65ca03413be62e2ad + 7927 + + + file + /mod/fifo/v_fifo_add.php + Sun, 11 Jul 2010 08:50:43 GMT + 3b09db9d886ca744edc2ac82ce8f5689 + 17738 + + + file + /mod/fifo/v_fifo_delete.php + Sat, 10 Jul 2010 20:05:27 GMT + dd5b28101578f84f8e14a477d21a1055 + 1743 + + + file + /mod/fifo/v_fifo_details_delete.php + Sat, 10 Jul 2010 20:05:51 GMT + f2369ffb533c13aed30361c10c58ed71 + 1660 + + + file + /mod/fifo/v_fifo_details_edit.php + Sun, 11 Jul 2010 08:48:06 GMT + 24557188a309771fbee717079f594b9c + 15795 + + + file + /mod/fifo/v_fifo_edit.php + Sat, 28 Aug 2010 18:50:00 GMT + 6d7d1b70627dc32f720e65b4496f496a + 18819 + + + directory + /mod/fifo_list + + + + + + file + /mod/fifo_list/root.php + Thu, 10 Jun 2010 19:58:45 GMT + 1d66d2f0f6ca694fc5d98c5b0e94e05b + 1091 + + + file + /mod/fifo_list/v_fifo_exec.php + Sun, 11 Jul 2010 07:59:59 GMT + 15a1ae96460c7965bdb21db9665aff4b + 3506 + + + file + /mod/fifo_list/v_fifo_interactive.php + Sun, 11 Jul 2010 08:59:23 GMT + 492de8f176feaf5d9987d1bb70e36337 + 4080 + + + file + /mod/fifo_list/v_fifo_interactive_inc.php + Sun, 11 Jul 2010 08:08:25 GMT + db385fbafa904bf27cf617b2d519e087 + 7276 + + + file + /mod/fifo_list/v_fifo_list.php + Sun, 11 Jul 2010 07:59:59 GMT + f9aa241ce14e776a225fd2529498999e + 3444 + + + file + /mod/fifo_list/v_fifo_list_inc.php + Sun, 11 Jul 2010 07:59:59 GMT + 7ba0f1332da558afd04babd75d535abb + 3727 + + + directory + /mod/gateways + + + + + + file + /mod/gateways/root.php + Sat, 06 Feb 2010 18:05:48 GMT + a20aca300a3c9c1cdd724971dba4626d + 1913 + + + file + /mod/gateways/v_gateways.php + Sat, 06 Feb 2010 18:05:49 GMT + f547f19c3bce7a9f87c09923afc9f210 + 6683 + + + file + /mod/gateways/v_gateways_delete.php + Sat, 06 Feb 2010 18:05:49 GMT + d4eadbdaa260723a8c51ad80fda630bc + 2631 + + + file + /mod/gateways/v_gateways_edit.php + Tue, 07 Sep 2010 12:10:16 GMT + d61af79d667e6042fbc080c24888c5ea + 34506 + + + directory + /mod/grammar_edit + + + + + + file + /mod/grammar_edit/clipadd.php + Sun, 23 May 2010 06:37:09 GMT + 28549f6f91b0d869877e1a6b0af23966 + 3269 + + + file + /mod/grammar_edit/clipdelete.php + Sat, 06 Feb 2010 18:34:44 GMT + 2c02de8b37ce5c23ecf21c9c8da581d9 + 1412 + + + file + /mod/grammar_edit/cliplist.php + Sat, 06 Feb 2010 18:34:44 GMT + d8d2ce5f33d43bbd3a3e63176115ae23 + 12754 + + + file + /mod/grammar_edit/clipoptions.php + Sat, 06 Feb 2010 18:34:44 GMT + 3bde522624cbb5345d3ad1fdc42ef140 + 3100 + + + file + /mod/grammar_edit/clipoptionslist.php + Sat, 06 Feb 2010 18:34:44 GMT + 0c8f8b95aee81315c786f7cdc8929d2f + 10761 + + + file + /mod/grammar_edit/clipsearch.php + Sat, 06 Feb 2010 18:34:44 GMT + 82a54406083514f6f2ce0cce35abeda3 + 6481 + + + file + /mod/grammar_edit/clipupdate.php + Sat, 06 Feb 2010 18:34:43 GMT + 30210d0c7a4526edc2066b7e7d244365 + 4337 + + + file + /mod/grammar_edit/filedelete.php + Sat, 06 Feb 2010 18:34:43 GMT + 810c5c9aef088f4d75896c10a917639e + 2201 + + + file + /mod/grammar_edit/filelist.php + Sat, 28 Aug 2010 21:22:17 GMT + f8ff3663039278539ce36d7b7abacb89 + 8690 + + + file + /mod/grammar_edit/filenew.php + Sat, 06 Feb 2010 18:34:43 GMT + 33042b92b0173e15a6f543ee0bccc8e2 + 2311 + + + file + /mod/grammar_edit/fileoptions.php + Sat, 06 Feb 2010 18:34:43 GMT + 5b79c7987f6cb1b4d2f8f2a17702dbb5 + 4000 + + + file + /mod/grammar_edit/fileoptionslist.php + Sat, 06 Feb 2010 18:34:43 GMT + 0cbb547a0fd10ac3485d51125e6adfa3 + 14064 + + + file + /mod/grammar_edit/fileread.php + Sat, 06 Feb 2010 18:34:43 GMT + 87311164928514f501d66acf3e977af5 + 1213 + + + file + /mod/grammar_edit/filerename.php + Sat, 06 Feb 2010 18:34:43 GMT + 3b5a76994b03f24d4dc03032f6ddfb7b + 2688 + + + file + /mod/grammar_edit/filesave.php + Sat, 06 Feb 2010 18:34:43 GMT + f22c7667f8480711d35e974f742c830c + 1302 + + + file + /mod/grammar_edit/folderdelete.php + Sat, 06 Feb 2010 18:34:43 GMT + 8b171129783c2e6f5fba0d43c5652880 + 1198 + + + file + /mod/grammar_edit/foldernew.php + Sat, 06 Feb 2010 18:34:43 GMT + 4f130ae369199f4c8b5e06e3269a4f45 + 2199 + + + file + /mod/grammar_edit/footer.php + Sat, 06 Feb 2010 18:34:43 GMT + 48b9b9266e8e74b4ae39a4249a8e37c8 + 1188 + + + file + /mod/grammar_edit/header.php + Sat, 06 Feb 2010 18:34:43 GMT + 745a04241d9d3d90d3c7fb886f02c767 + 2818 + + + directory + /mod/grammar_edit/images + + + + + + file + /mod/grammar_edit/images/file.gif + Tue, 08 Dec 2009 02:24:00 GMT + f5ddae5e4e5eb50e1841b543dc9efd0e + 96 + + + file + /mod/grammar_edit/images/file.png + Tue, 08 Dec 2009 02:24:00 GMT + b0b89b853c4514d1a79429365cdf0cb2 + 434 + + + file + /mod/grammar_edit/images/folder.gif + Tue, 08 Dec 2009 02:24:00 GMT + 33d8e89f825441b036df0ea0a4d7c86b + 585 + + + file + /mod/grammar_edit/images/gear.png + Tue, 08 Dec 2009 02:24:00 GMT + 91a6abc4126bc211a6ffe69a1f3fdbc8 + 822 + + + file + /mod/grammar_edit/images/leaf.gif + Tue, 08 Dec 2009 02:24:00 GMT + 33d8e89f825441b036df0ea0a4d7c86b + 585 + + + file + /mod/grammar_edit/images/minus.gif + Tue, 08 Dec 2009 02:24:00 GMT + 813b2a3203fad9b56dc006e90996dba8 + 124 + + + file + /mod/grammar_edit/images/plus.gif + Tue, 08 Dec 2009 02:24:00 GMT + 6e6b599e843efe688bc76a2e19ebeced + 129 + + + file + /mod/grammar_edit/images/program.gif + Tue, 08 Dec 2009 02:24:00 GMT + 738187dc01e9c8a83723362935ef372c + 61 + + + directory + /mod/grammar_edit/images/thumbnails + + + + + + file + /mod/grammar_edit/images/thumbnails/cliplibrary.png + Tue, 08 Dec 2009 02:24:00 GMT + 3b5ec9a7a870c46784047083bbcfd67a + 20544 + + + file + /mod/grammar_edit/images/thumbnails/filemanagement.png + Tue, 08 Dec 2009 02:24:00 GMT + 8ba2a3f2d1f05c2acba6ed8fafbc49f4 + 23105 + + + file + /mod/grammar_edit/images/thumbnails/phpeditor.png + Tue, 08 Dec 2009 02:24:00 GMT + 08f4a12c81a3f87af7de6139cc8a8669 + 98754 + + + file + /mod/grammar_edit/index.php + Wed, 25 Aug 2010 23:44:39 GMT + 94d97486f8c00d1c8130610735a6ad7f + 9363 + + + file + /mod/grammar_edit/list.php + Sat, 06 Feb 2010 18:34:44 GMT + e93ae1b29d085e0457f1e3ed62531c67 + 4290 + + + file + /mod/grammar_edit/readme.txt + Tue, 08 Dec 2009 02:24:01 GMT + 53dd94e0899a6dbd9d36075ff8dcb7ba + 126 + + + file + /mod/grammar_edit/root.php + Sat, 06 Feb 2010 18:34:44 GMT + a20aca300a3c9c1cdd724971dba4626d + 1913 + + + directory + /mod/hardware_phones + + + + + + file + /mod/hardware_phones/root.php + Thu, 10 Jun 2010 20:00:21 GMT + a20aca300a3c9c1cdd724971dba4626d + 1913 + + + file + /mod/hardware_phones/v_hardware_phones.php + Fri, 03 Sep 2010 08:02:08 GMT + a676e69b7f5987c31a40c9d8df23faff + 6359 + + + file + /mod/hardware_phones/v_hardware_phones_delete.php + Sun, 27 Jun 2010 06:30:20 GMT + 1bd7ad3207de513e79156d1cf1f08aa3 + 1455 + + + file + /mod/hardware_phones/v_hardware_phones_edit.php + Fri, 03 Sep 2010 08:01:58 GMT + dcd35aef9aa1f400e8ab8f3e8e968a09 + 11595 + + + directory + /mod/hunt_group + + + + + + file + /mod/hunt_group/root.php + Sat, 06 Feb 2010 18:27:40 GMT + a20aca300a3c9c1cdd724971dba4626d + 1913 + + + file + /mod/hunt_group/v_hunt_group.php + Sat, 06 Feb 2010 18:27:40 GMT + dd31575678eeef367523efe610389df2 + 6331 + + + file + /mod/hunt_group/v_hunt_group_delete.php + Sat, 06 Feb 2010 18:27:40 GMT + db7cfdf2736ccf71d0b18ccff6740fd3 + 3816 + + + file + /mod/hunt_group/v_hunt_group_destinations_delete.php + Sat, 06 Feb 2010 18:27:40 GMT + 408af55b503108fdad2a8b7ccd9e0fa9 + 1738 + + + file + /mod/hunt_group/v_hunt_group_destinations_edit.php + Sat, 28 Aug 2010 18:50:00 GMT + 3ba620fa342c3e78e8cd1cf99b9f1151 + 11601 + + + file + /mod/hunt_group/v_hunt_group_edit.php + Sat, 28 Aug 2010 18:50:00 GMT + dd5cf744b0c218700eb51d6ee41efe3a + 21107 + + + directory + /mod/ivr_menu + + + + + + file + /mod/ivr_menu/root.php + Thu, 11 Mar 2010 10:22:41 GMT + a20aca300a3c9c1cdd724971dba4626d + 1913 + + + file + /mod/ivr_menu/v_ivr_menu.php + Fri, 03 Sep 2010 07:49:29 GMT + 5f679960ef59816a6044a034489dc9e4 + 5436 + + + file + /mod/ivr_menu/v_ivr_menu_delete.php + Wed, 12 May 2010 23:27:21 GMT + 3ab15f0aa7f7b82a3feae85b3d937ca5 + 2155 + + + file + /mod/ivr_menu/v_ivr_menu_edit.php + Fri, 03 Sep 2010 07:53:28 GMT + e654a1a75e9ba94d498ec31cf68e00f8 + 28623 + + + file + /mod/ivr_menu/v_ivr_menu_options.php + Fri, 01 Oct 2010 02:14:39 GMT + ac7f17b3e58a9f7de9cc4db487e03dab + 6713 + + + file + /mod/ivr_menu/v_ivr_menu_options_delete.php + Tue, 11 May 2010 07:53:27 GMT + 117e8011fbd9389f47393cd24d8c742c + 851 + + + file + /mod/ivr_menu/v_ivr_menu_options_edit.php + Fri, 03 Sep 2010 07:52:33 GMT + 61681b8ad6dd0c9817aa67006eebb784 + 11774 + + + directory + /mod/modules + + + + + + file + /mod/modules/root.php + Sat, 06 Feb 2010 18:04:36 GMT + a20aca300a3c9c1cdd724971dba4626d + 1913 + + + file + /mod/modules/v_modules.php + Sat, 01 May 2010 08:04:43 GMT + bf50f66f71171a4981b3c9073526bcd1 + 7316 + + + file + /mod/modules/v_modules_delete.php + Sat, 01 May 2010 08:04:43 GMT + f54ff1eabd51b61e3159b9b68a7dc32a + 1518 + + + file + /mod/modules/v_modules_edit.php + Sat, 28 Aug 2010 18:48:19 GMT + 676584f0be83463da930015eba88390a + 10006 + + + directory + /mod/php_edit + + + + + + file + /mod/php_edit/clipadd.php + Sun, 23 May 2010 06:29:55 GMT + 53478170a6f1dfbeefd843aac38320cd + 3556 + + + file + /mod/php_edit/clipdelete.php + Sat, 06 Feb 2010 18:36:27 GMT + 2c02de8b37ce5c23ecf21c9c8da581d9 + 1412 + + + file + /mod/php_edit/cliplist.php + Sat, 06 Feb 2010 18:36:27 GMT + d8d2ce5f33d43bbd3a3e63176115ae23 + 12754 + + + file + /mod/php_edit/clipoptions.php + Sat, 06 Feb 2010 18:36:27 GMT + 3bde522624cbb5345d3ad1fdc42ef140 + 3100 + + + file + /mod/php_edit/clipoptionslist.php + Sat, 06 Feb 2010 18:36:27 GMT + 0c8f8b95aee81315c786f7cdc8929d2f + 10761 + + + file + /mod/php_edit/clipsearch.php + Sat, 06 Feb 2010 18:36:27 GMT + 82a54406083514f6f2ce0cce35abeda3 + 6481 + + + file + /mod/php_edit/clipupdate.php + Sat, 06 Feb 2010 18:36:27 GMT + 83d6d740fa4f3a5c23207dc2a4598a75 + 4346 + + + file + /mod/php_edit/filedelete.php + Sat, 06 Feb 2010 18:36:26 GMT + 810c5c9aef088f4d75896c10a917639e + 2201 + + + file + /mod/php_edit/filelist.php + Tue, 20 Jul 2010 01:36:53 GMT + 72c204d299a4369a620dc14b2e5da449 + 13665 + + + file + /mod/php_edit/filenew.php + Sat, 06 Feb 2010 18:36:26 GMT + 33042b92b0173e15a6f543ee0bccc8e2 + 2311 + + + file + /mod/php_edit/fileoptions.php + Sat, 06 Feb 2010 18:36:26 GMT + 5b79c7987f6cb1b4d2f8f2a17702dbb5 + 4000 + + + file + /mod/php_edit/fileoptionslist.php + Sat, 06 Feb 2010 18:36:26 GMT + c55b42c2c00d2dbad6df12a60595fa56 + 14073 + + + file + /mod/php_edit/fileread.php + Sat, 06 Feb 2010 18:36:26 GMT + 87311164928514f501d66acf3e977af5 + 1213 + + + file + /mod/php_edit/filerename.php + Sat, 06 Feb 2010 18:36:26 GMT + 3b5a76994b03f24d4dc03032f6ddfb7b + 2688 + + + file + /mod/php_edit/filesave.php + Sat, 06 Feb 2010 18:36:27 GMT + f22c7667f8480711d35e974f742c830c + 1302 + + + file + /mod/php_edit/folderdelete.php + Sat, 06 Feb 2010 18:36:27 GMT + 8b171129783c2e6f5fba0d43c5652880 + 1198 + + + file + /mod/php_edit/foldernew.php + Sat, 06 Feb 2010 18:36:27 GMT + 4f130ae369199f4c8b5e06e3269a4f45 + 2199 + + + file + /mod/php_edit/footer.php + Sat, 06 Feb 2010 18:36:26 GMT + 48b9b9266e8e74b4ae39a4249a8e37c8 + 1188 + + + file + /mod/php_edit/header.php + Sat, 06 Feb 2010 18:36:26 GMT + 745a04241d9d3d90d3c7fb886f02c767 + 2818 + + + directory + /mod/php_edit/images + + + + + + file + /mod/php_edit/images/file.gif + Tue, 08 Dec 2009 02:24:03 GMT + f5ddae5e4e5eb50e1841b543dc9efd0e + 96 + + + file + /mod/php_edit/images/file.png + Tue, 08 Dec 2009 02:24:03 GMT + b0b89b853c4514d1a79429365cdf0cb2 + 434 + + + file + /mod/php_edit/images/folder.gif + Tue, 08 Dec 2009 02:24:03 GMT + 33d8e89f825441b036df0ea0a4d7c86b + 585 + + + file + /mod/php_edit/images/gear.png + Tue, 08 Dec 2009 02:24:03 GMT + 91a6abc4126bc211a6ffe69a1f3fdbc8 + 822 + + + file + /mod/php_edit/images/leaf.gif + Tue, 08 Dec 2009 02:24:03 GMT + 33d8e89f825441b036df0ea0a4d7c86b + 585 + + + file + /mod/php_edit/images/minus.gif + Tue, 08 Dec 2009 02:24:03 GMT + 813b2a3203fad9b56dc006e90996dba8 + 124 + + + file + /mod/php_edit/images/plus.gif + Tue, 08 Dec 2009 02:24:03 GMT + 6e6b599e843efe688bc76a2e19ebeced + 129 + + + file + /mod/php_edit/images/program.gif + Tue, 08 Dec 2009 02:24:03 GMT + 738187dc01e9c8a83723362935ef372c + 61 + + + directory + /mod/php_edit/images/thumbnails + + + + + + file + /mod/php_edit/images/thumbnails/cliplibrary.png + Tue, 08 Dec 2009 02:24:03 GMT + 3b5ec9a7a870c46784047083bbcfd67a + 20544 + + + file + /mod/php_edit/images/thumbnails/filemanagement.png + Tue, 08 Dec 2009 02:24:03 GMT + 8ba2a3f2d1f05c2acba6ed8fafbc49f4 + 23105 + + + file + /mod/php_edit/images/thumbnails/phpeditor.png + Tue, 08 Dec 2009 02:24:03 GMT + 08f4a12c81a3f87af7de6139cc8a8669 + 98754 + + + file + /mod/php_edit/index.php + Wed, 25 Aug 2010 23:43:37 GMT + 987a801e927bf2f992c5f39b66567441 + 9457 + + + file + /mod/php_edit/list.php + Sat, 06 Feb 2010 18:36:26 GMT + e93ae1b29d085e0457f1e3ed62531c67 + 4290 + + + file + /mod/php_edit/readme.txt + Tue, 08 Dec 2009 02:24:03 GMT + 53dd94e0899a6dbd9d36075ff8dcb7ba + 126 + + + file + /mod/php_edit/root.php + Sat, 06 Feb 2010 18:36:26 GMT + d399882b4822a07f0f4745cc41e1af1a + 1911 + + + directory + /mod/php_service + + + + + + file + /mod/php_service/root.php + Fri, 07 May 2010 19:29:25 GMT + a20aca300a3c9c1cdd724971dba4626d + 1913 + + + file + /mod/php_service/v_php_service.php + Fri, 03 Sep 2010 07:44:27 GMT + 4743d414d982a2afb7691eeafd97b38e + 6347 + + + file + /mod/php_service/v_php_service_delete.php + Wed, 16 Jun 2010 02:52:45 GMT + fdc6723647587389507911ce528e57fd + 1388 + + + file + /mod/php_service/v_php_service_edit.php + Mon, 12 Jul 2010 15:21:42 GMT + b269ac27f41bcfda1b4c0e11acb7f4f1 + 17518 + + + directory + /mod/profiles + + + + + + file + /mod/profiles/root.php + Sat, 06 Feb 2010 18:04:00 GMT + a20aca300a3c9c1cdd724971dba4626d + 1913 + + + file + /mod/profiles/v_profiles.php + Mon, 30 Aug 2010 18:11:47 GMT + d8095fea4c9e2f0454cdfe0a9ff4bc75 + 6143 + + + file + /mod/profiles/v_profile_edit.php + Sat, 01 May 2010 08:07:29 GMT + a686d9b5c036aea94fae303405bdff34 + 3478 + + + directory + /mod/provision + + + + + + file + /mod/provision/index.php + Sat, 21 Aug 2010 00:28:36 GMT + 6e338d6199a5cec02dfbf988b603f29d + 15673 + + + file + /mod/provision/root.php + Thu, 11 Mar 2010 10:21:27 GMT + a20aca300a3c9c1cdd724971dba4626d + 1913 + + + directory + /mod/public_includes + + + + + + file + /mod/public_includes/root.php + Sat, 06 Feb 2010 18:03:20 GMT + a20aca300a3c9c1cdd724971dba4626d + 1913 + + + file + /mod/public_includes/v_public.php + Thu, 08 Jul 2010 22:07:24 GMT + f220ba931a587ce1f235f8807a72555e + 17034 + + + file + /mod/public_includes/v_public_add.php + Sat, 14 Aug 2010 07:04:05 GMT + ad75b8f2fe06a7e38cf0e161aa5814a3 + 26225 + + + file + /mod/public_includes/v_public_delete.php + Sat, 06 Feb 2010 18:03:20 GMT + 48aac49ab1fc7d95e1acf1186559abe6 + 2769 + + + file + /mod/public_includes/v_public_details_delete.php + Sat, 06 Feb 2010 18:03:20 GMT + 73c0fae3464189c82a535680d9d84ccf + 1761 + + + file + /mod/public_includes/v_public_details_edit.php + Sat, 28 Aug 2010 18:48:10 GMT + 7b7d55d8f0b815db485d435448c8a73b + 22746 + + + file + /mod/public_includes/v_public_edit.php + Sat, 28 Aug 2010 18:46:38 GMT + 9a8ed8625f859d394891d150012dbf64 + 19939 + + + directory + /mod/recordings + + + + + + file + /mod/recordings/root.php + Sat, 06 Feb 2010 18:27:00 GMT + a20aca300a3c9c1cdd724971dba4626d + 1913 + + + file + /mod/recordings/slim.swf + Tue, 08 Dec 2009 02:24:04 GMT + 6da31effb6edadd3c7d55d3dc3877d00 + 56327 + + + file + /mod/recordings/v_recordings.php + Fri, 13 Aug 2010 09:57:49 GMT + fe57be200d70bf00adc7130d3661b299 + 16500 + + + file + /mod/recordings/v_recordings_delete.php + Sat, 06 Feb 2010 18:27:00 GMT + c87891cc3cc8a5e0668b11dde72e6328 + 2034 + + + file + /mod/recordings/v_recordings_edit.php + Sat, 28 Aug 2010 18:46:48 GMT + a8d03f1ba6930416cd153124caffd06a + 8618 + + + file + /mod/recordings/v_recordings_play.php + Thu, 01 Jul 2010 17:04:06 GMT + 34682e3658f3663880af26d42bce5882 + 2463 + + + directory + /mod/roku + + + + + + file + /mod/roku/roku.php + Mon, 30 Aug 2010 18:13:21 GMT + 43f3c848ae6907d85e81562a97a1d26a + 2159 + + + directory + /mod/script_edit + + + + + + file + /mod/script_edit/clipadd.php + Sun, 23 May 2010 06:36:04 GMT + 5405ec84debf977805d9a00b8fa4ab75 + 3326 + + + file + /mod/script_edit/clipdelete.php + Sat, 06 Feb 2010 18:26:19 GMT + 2c02de8b37ce5c23ecf21c9c8da581d9 + 1412 + + + file + /mod/script_edit/cliplist.php + Sat, 06 Feb 2010 18:26:19 GMT + d8d2ce5f33d43bbd3a3e63176115ae23 + 12754 + + + file + /mod/script_edit/clipoptions.php + Sat, 06 Feb 2010 18:26:19 GMT + 3bde522624cbb5345d3ad1fdc42ef140 + 3100 + + + file + /mod/script_edit/clipoptionslist.php + Sat, 06 Feb 2010 18:25:02 GMT + 0c8f8b95aee81315c786f7cdc8929d2f + 10761 + + + file + /mod/script_edit/clipsearch.php + Sat, 06 Feb 2010 18:24:57 GMT + 82a54406083514f6f2ce0cce35abeda3 + 6481 + + + file + /mod/script_edit/clipupdate.php + Sat, 06 Feb 2010 18:26:18 GMT + 8fc3a552fee934be35697d6b32c4943d + 4232 + + + file + /mod/script_edit/filedelete.php + Sat, 06 Feb 2010 18:26:18 GMT + 810c5c9aef088f4d75896c10a917639e + 2201 + + + file + /mod/script_edit/filelist.php + Tue, 20 Jul 2010 01:39:55 GMT + e15865ce541b06a53fb5737c9e4c521b + 13866 + + + file + /mod/script_edit/filenew.php + Sat, 06 Feb 2010 18:26:18 GMT + 33042b92b0173e15a6f543ee0bccc8e2 + 2311 + + + file + /mod/script_edit/fileoptions.php + Sat, 06 Feb 2010 18:26:18 GMT + 5b79c7987f6cb1b4d2f8f2a17702dbb5 + 4000 + + + file + /mod/script_edit/fileoptionslist.php + Sat, 06 Feb 2010 18:26:18 GMT + 23f7f613bb6b8092557a4f2880421359 + 14059 + + + file + /mod/script_edit/fileread.php + Sat, 06 Feb 2010 18:26:18 GMT + 87311164928514f501d66acf3e977af5 + 1213 + + + file + /mod/script_edit/filerename.php + Sat, 06 Feb 2010 18:26:18 GMT + 3b5a76994b03f24d4dc03032f6ddfb7b + 2688 + + + file + /mod/script_edit/filesave.php + Sat, 06 Feb 2010 18:26:20 GMT + f22c7667f8480711d35e974f742c830c + 1302 + + + file + /mod/script_edit/folderdelete.php + Sat, 06 Feb 2010 18:26:19 GMT + 8b171129783c2e6f5fba0d43c5652880 + 1198 + + + file + /mod/script_edit/foldernew.php + Sat, 06 Feb 2010 18:26:19 GMT + 4f130ae369199f4c8b5e06e3269a4f45 + 2199 + + + file + /mod/script_edit/footer.php + Sat, 06 Feb 2010 18:26:19 GMT + 48b9b9266e8e74b4ae39a4249a8e37c8 + 1188 + + + file + /mod/script_edit/header.php + Sat, 06 Feb 2010 18:26:19 GMT + 745a04241d9d3d90d3c7fb886f02c767 + 2818 + + + directory + /mod/script_edit/images + + + + + + file + /mod/script_edit/images/file.gif + Tue, 08 Dec 2009 02:24:09 GMT + f5ddae5e4e5eb50e1841b543dc9efd0e + 96 + + + file + /mod/script_edit/images/file.png + Tue, 08 Dec 2009 02:24:09 GMT + b0b89b853c4514d1a79429365cdf0cb2 + 434 + + + file + /mod/script_edit/images/folder.gif + Tue, 08 Dec 2009 02:24:09 GMT + 33d8e89f825441b036df0ea0a4d7c86b + 585 + + + file + /mod/script_edit/images/gear.png + Tue, 08 Dec 2009 02:24:09 GMT + 91a6abc4126bc211a6ffe69a1f3fdbc8 + 822 + + + file + /mod/script_edit/images/leaf.gif + Tue, 08 Dec 2009 02:24:09 GMT + 33d8e89f825441b036df0ea0a4d7c86b + 585 + + + file + /mod/script_edit/images/minus.gif + Tue, 08 Dec 2009 02:24:09 GMT + 813b2a3203fad9b56dc006e90996dba8 + 124 + + + file + /mod/script_edit/images/plus.gif + Tue, 08 Dec 2009 02:24:09 GMT + 6e6b599e843efe688bc76a2e19ebeced + 129 + + + file + /mod/script_edit/images/program.gif + Tue, 08 Dec 2009 02:24:09 GMT + 738187dc01e9c8a83723362935ef372c + 61 + + + directory + /mod/script_edit/images/thumbnails + + + + + + file + /mod/script_edit/images/thumbnails/cliplibrary.png + Tue, 08 Dec 2009 02:24:09 GMT + 3b5ec9a7a870c46784047083bbcfd67a + 20544 + + + file + /mod/script_edit/images/thumbnails/filemanagement.png + Tue, 08 Dec 2009 02:24:09 GMT + 8ba2a3f2d1f05c2acba6ed8fafbc49f4 + 23105 + + + file + /mod/script_edit/images/thumbnails/phpeditor.png + Tue, 08 Dec 2009 02:24:09 GMT + 08f4a12c81a3f87af7de6139cc8a8669 + 98754 + + + file + /mod/script_edit/index.php + Wed, 25 Aug 2010 23:42:59 GMT + 94d97486f8c00d1c8130610735a6ad7f + 9363 + + + file + /mod/script_edit/list.php + Sat, 06 Feb 2010 18:26:19 GMT + e93ae1b29d085e0457f1e3ed62531c67 + 4290 + + + file + /mod/script_edit/readme.txt + Tue, 08 Dec 2009 02:24:09 GMT + 53dd94e0899a6dbd9d36075ff8dcb7ba + 126 + + + file + /mod/script_edit/root.php + Sat, 06 Feb 2010 18:26:19 GMT + d399882b4822a07f0f4745cc41e1af1a + 1911 + + + directory + /mod/soft_phone + + + + + + file + /mod/soft_phone/root.php + Sat, 06 Feb 2010 18:24:36 GMT + a20aca300a3c9c1cdd724971dba4626d + 1913 + + + file + /mod/soft_phone/v_softphone.php + Sat, 06 Feb 2010 18:24:36 GMT + 5cefe5eef350cb0d3582e50440d4a21f + 10475 + + + directory + /mod/sql_query + + + + + + file + /mod/sql_query/root.php + Thu, 11 Mar 2010 10:21:34 GMT + a20aca300a3c9c1cdd724971dba4626d + 1913 + + + file + /mod/sql_query/v_sql_query.php + Fri, 09 Jul 2010 02:54:39 GMT + 0c7c208202e52f2b1b3050fe9482b9e7 + 4143 + + + file + /mod/sql_query/v_sql_query_result.php + Thu, 05 Aug 2010 06:01:23 GMT + d9fac6d0d25b33d339bf7bfed553e7bf + 4055 + + + directory + /mod/templates + + + + + + file + /mod/templates/root.php + Sat, 06 Feb 2010 18:00:35 GMT + a20aca300a3c9c1cdd724971dba4626d + 1913 + + + file + /mod/templates/templates.php + Thu, 11 Mar 2010 10:04:45 GMT + 220314b2ccf5c6dab1824010e4797e97 + 5632 + + + file + /mod/templates/templates_delete.php + Sat, 06 Feb 2010 18:00:25 GMT + e2ae034aa17a21d33bbb4be026effa05 + 1531 + + + file + /mod/templates/templates_edit.php + Sat, 28 Aug 2010 18:47:00 GMT + ec38cddfd390e51098fd68e95f87cd9b + 12129 + + + file + /mod/templates/template_restore_default.php + Sun, 23 May 2010 06:31:50 GMT + 31708bdb97cec760f1f0d2c033553169 + 4095 + + + directory + /mod/time_conditions + + + + + + file + /mod/time_conditions/root.php + Sat, 10 Jul 2010 02:32:54 GMT + a20aca300a3c9c1cdd724971dba4626d + 1913 + + + file + /mod/time_conditions/v_dialplans.php + Wed, 14 Jul 2010 19:37:55 GMT + ecfbc50b3b4036755c675715d4e75ec0 + 9358 + + + file + /mod/time_conditions/dialplan_add.php + Thu, 15 Jul 2010 05:48:51 GMT + 88d76764c52f555967dd8009149da61a + 41649 + + + file + /mod/time_conditions/v_dialplan_delete.php + Sat, 10 Jul 2010 02:32:54 GMT + 70c98ad23504a24fa38c13c6ca8ee0b6 + 1830 + + + file + /mod/time_conditions/v_dialplan_details_delete.php + Sat, 10 Jul 2010 02:32:55 GMT + a731a9a1e8963c1a1aecd5f3bd0eafb2 + 1747 + + + file + /mod/time_conditions/v_dialplan_details_edit.php + Tue, 13 Jul 2010 20:36:08 GMT + 9bd82d87d238bdb52d1cfb0ed2d74954 + 16305 + + + file + /mod/time_conditions/v_dialplan_edit.php + Sat, 28 Aug 2010 18:47:14 GMT + 90dd319e7f235af7703119d79ea83976 + 19568 + + + directory + /mod/users + + + + + + file + /mod/users/root.php + Sat, 06 Feb 2010 18:23:29 GMT + a20aca300a3c9c1cdd724971dba4626d + 1913 + + + file + /mod/users/signup.php + Mon, 06 Sep 2010 10:37:59 GMT + 57cf8747a968e149e1b6ba5e0512777d + 23220 + + + file + /mod/users/usersupdate.php + Sat, 11 Sep 2010 16:52:29 GMT + 592fc38cdf16f7ee96b4140f91eca1cb + 24822 + + + directory + /mod/users_bulk_add + + + + + + file + /mod/users_bulk_add/root.php + Sun, 27 Jun 2010 10:16:02 GMT + a20aca300a3c9c1cdd724971dba4626d + 1913 + + + file + /mod/users_bulk_add/v_users_bulk_add.php + Thu, 15 Jul 2010 20:25:55 GMT + ca0ef8933e738cb4fe5031b8fd490f6b + 6836 + + + directory + /mod/vars + + + + + + file + /mod/vars/root.php + Sat, 06 Feb 2010 17:52:31 GMT + a20aca300a3c9c1cdd724971dba4626d + 1913 + + + file + /mod/vars/v_vars.php + Sat, 01 May 2010 08:06:02 GMT + 75c63ebf17ffe1ee74ac40d9ae53513c + 7887 + + + file + /mod/vars/v_vars.textarea.php + Sat, 01 May 2010 08:06:02 GMT + 2d73130196e06c933427fcc8afd4330e + 4538 + + + file + /mod/vars/v_vars_delete.php + Sat, 01 May 2010 08:06:27 GMT + a16822bccc972ec3ab6b54167daa16b1 + 1513 + + + file + /mod/vars/v_vars_edit.php + Sat, 28 Aug 2010 18:47:29 GMT + 02566ad6528146c536e8874e6a5b1cce + 13731 + + + directory + /mod/voicemail_msgs + + + + + + file + /mod/voicemail_msgs/root.php + Sat, 06 Feb 2010 18:23:06 GMT + a20aca300a3c9c1cdd724971dba4626d + 1913 + + + file + /mod/voicemail_msgs/v_voicemail_msgs.php + Wed, 19 May 2010 20:31:23 GMT + 78422b1c8d6033ef33428e7af054909c + 12024 + + + file + /mod/voicemail_msgs/v_voicemail_msgs_delete.php + Sat, 06 Feb 2010 18:23:07 GMT + eea93a77f04c7ebe80c852705f396187 + 2565 + + + file + /mod/voicemail_msgs/v_voicemail_msgs_password.php + Sat, 28 Aug 2010 18:47:37 GMT + fe73ce8b6bdbf9ac2bdc88f7a54c21ec + 14622 + + + file + /mod/voicemail_msgs/v_voicemail_msgs_play.php + Sat, 06 Feb 2010 18:23:06 GMT + d38415afee911511f94092304a4193ff + 2370 + + + directory + /mod/voicemail_status + + + + + + file + /mod/voicemail_status/root.php + Sat, 06 Feb 2010 18:22:38 GMT + a20aca300a3c9c1cdd724971dba4626d + 1913 + + + file + /mod/voicemail_status/v_voicemail.php + Wed, 19 May 2010 19:38:36 GMT + 2c91f3e2ef57976b11cbe1887847a1a6 + 6734 + + + file + /mod/voicemail_status/v_voicemail_prefs_delete.php + Sat, 06 Feb 2010 18:22:38 GMT + 296e463b9f94802ac9878bd648cc2fb0 + 1923 + + + directory + /mod/xml_cdr + + + + + + file + /mod/xml_cdr/root.php + Fri, 07 May 2010 19:30:10 GMT + a20aca300a3c9c1cdd724971dba4626d + 1913 + + + file + /mod/xml_cdr/xml_cdr.php + Sun, 29 Aug 2010 04:31:18 GMT + 5d0e850ce9af15f86937e76a518afea6 + 21108 + + + file + /mod/xml_cdr/v_xml_cdr_csv.php + Sun, 29 Aug 2010 04:36:52 GMT + 6e487492870ec7b858b98e943aa44dad + 5973 + + + file + /mod/xml_cdr/v_xml_cdr_delete.php + Wed, 04 Aug 2010 19:26:51 GMT + de136c983ae66ade089f09116b08fcb0 + 730 + + + file + /mod/xml_cdr/v_xml_cdr_details.php + Sun, 08 Aug 2010 09:45:46 GMT + 2c7fe2f7f8840762def3c67bc41ea70a + 16342 + + + file + /mod/xml_cdr/v_xml_cdr_edit.php + Wed, 04 Aug 2010 19:29:59 GMT + 5773cc956021af6461db226fb091684d + 22717 + + + file + /mod/xml_cdr/v_xml_cdr_import.php + Fri, 01 Oct 2010 08:01:28 GMT + c123f3f87335e8a1eb37f53b6fa18c3e + 9322 + + + file + /mod/xml_cdr/v_xml_cdr_search.php + Fri, 01 Oct 2010 02:25:52 GMT + 19a6723d640d78293e46f5d019cf2fd9 + 5823 + + + directory + /mod/xml_edit + + + + + + file + /mod/xml_edit/clipadd.php + Sun, 23 May 2010 06:32:53 GMT + 7f5d8e8b6ebbe0273a3832963dbc685e + 3273 + + + file + /mod/xml_edit/clipdelete.php + Sat, 01 May 2010 08:14:18 GMT + 10a7d1018e22a91efdcd9403e24e8f82 + 1471 + + + file + /mod/xml_edit/cliplist.php + Sat, 01 May 2010 08:14:29 GMT + 88fc145a96531a17b0a429be4f839172 + 13098 + + + file + /mod/xml_edit/clipoptions.php + Sat, 01 May 2010 08:14:37 GMT + a335e9b42c5628fd78bfacce500eb04b + 3155 + + + file + /mod/xml_edit/clipoptionslist.php + Sat, 01 May 2010 08:14:43 GMT + 7176b2b795fb5d35162f92b1e8c7d48c + 10766 + + + file + /mod/xml_edit/clipsearch.php + Sat, 01 May 2010 08:14:48 GMT + 75cb211af71a2a55d2cd1b888ee1b6bb + 6668 + + + file + /mod/xml_edit/clipupdate.php + Sat, 01 May 2010 08:14:56 GMT + f6703d96f2f70e860ea502392da08ea6 + 4487 + + + file + /mod/xml_edit/filedelete.php + Sat, 01 May 2010 08:16:09 GMT + 7eec5a5d505d48a0abfed9ce89319c6c + 2268 + + + file + /mod/xml_edit/filelist.php + Mon, 30 Aug 2010 18:02:07 GMT + 1c16a71a83e33eb728b467293122483b + 13970 + + + file + /mod/xml_edit/filenew.php + Sat, 01 May 2010 08:16:01 GMT + cf1ee352afd87e915084872884455cde + 2403 + + + file + /mod/xml_edit/fileoptions.php + Sat, 01 May 2010 08:15:55 GMT + 8b068ea59428f211d68839ae3e3c49ea + 4083 + + + file + /mod/xml_edit/fileoptionslist.php + Sat, 01 May 2010 08:15:47 GMT + 3d3f9c4d64bed6d739f9d07a0c234be7 + 14085 + + + file + /mod/xml_edit/fileread.php + Sat, 01 May 2010 08:15:42 GMT + 386914139a8d09c9a31a5bae48a32262 + 1467 + + + file + /mod/xml_edit/filerename.php + Sat, 01 May 2010 08:15:37 GMT + 99760910d1d1ec202a9d76497dcfee54 + 2796 + + + file + /mod/xml_edit/filesave.php + Sat, 01 May 2010 08:15:33 GMT + d133f7e7a237f9eb1c3232b411a7f4ea + 1358 + + + file + /mod/xml_edit/folderdelete.php + Sat, 01 May 2010 08:15:28 GMT + ff98014304dce09f69c0b82ed02f33d3 + 1203 + + + file + /mod/xml_edit/foldernew.php + Sat, 01 May 2010 08:15:23 GMT + 3e1a29cc68dd691032c68b0e2b6adc47 + 2213 + + + file + /mod/xml_edit/footer.php + Sat, 06 Feb 2010 18:22:01 GMT + 9559d67fa5d8024d8213e58ebd02a06c + 1200 + + + file + /mod/xml_edit/header.php + Sat, 06 Feb 2010 18:22:01 GMT + 745a04241d9d3d90d3c7fb886f02c767 + 2818 + + + directory + /mod/xml_edit/images + + + + + + file + /mod/xml_edit/images/file.gif + Tue, 08 Dec 2009 02:24:06 GMT + f5ddae5e4e5eb50e1841b543dc9efd0e + 96 + + + file + /mod/xml_edit/images/file.png + Tue, 08 Dec 2009 02:24:06 GMT + b0b89b853c4514d1a79429365cdf0cb2 + 434 + + + file + /mod/xml_edit/images/folder.gif + Tue, 08 Dec 2009 02:24:06 GMT + 33d8e89f825441b036df0ea0a4d7c86b + 585 + + + file + /mod/xml_edit/images/gear.png + Tue, 08 Dec 2009 02:24:06 GMT + 91a6abc4126bc211a6ffe69a1f3fdbc8 + 822 + + + file + /mod/xml_edit/images/leaf.gif + Tue, 08 Dec 2009 02:24:06 GMT + 33d8e89f825441b036df0ea0a4d7c86b + 585 + + + file + /mod/xml_edit/images/minus.gif + Tue, 08 Dec 2009 02:24:06 GMT + 813b2a3203fad9b56dc006e90996dba8 + 124 + + + file + /mod/xml_edit/images/plus.gif + Tue, 08 Dec 2009 02:24:06 GMT + 6e6b599e843efe688bc76a2e19ebeced + 129 + + + file + /mod/xml_edit/images/program.gif + Tue, 08 Dec 2009 02:24:06 GMT + 738187dc01e9c8a83723362935ef372c + 61 + + + directory + /mod/xml_edit/images/thumbnails + + + + + + file + /mod/xml_edit/images/thumbnails/cliplibrary.png + Tue, 08 Dec 2009 02:24:06 GMT + 3b5ec9a7a870c46784047083bbcfd67a + 20544 + + + file + /mod/xml_edit/images/thumbnails/filemanagement.png + Tue, 08 Dec 2009 02:24:06 GMT + 8ba2a3f2d1f05c2acba6ed8fafbc49f4 + 23105 + + + file + /mod/xml_edit/images/thumbnails/phpeditor.png + Tue, 08 Dec 2009 02:24:06 GMT + 08f4a12c81a3f87af7de6139cc8a8669 + 98754 + + + file + /mod/xml_edit/index.php + Wed, 25 Aug 2010 23:40:51 GMT + d5200344babc8a1ff687ad8cb564fa70 + 9475 + + + file + /mod/xml_edit/list.php + Sat, 01 May 2010 08:13:55 GMT + 7bfa6f4b5ce517356c17a6841270e261 + 4392 + + + file + /mod/xml_edit/readme.txt + Tue, 08 Dec 2009 02:24:07 GMT + 53dd94e0899a6dbd9d36075ff8dcb7ba + 126 + + + file + /mod/xml_edit/root.php + Sat, 06 Feb 2010 18:22:01 GMT + a20aca300a3c9c1cdd724971dba4626d + 1913 + + + file + /root.php + Sat, 06 Feb 2010 18:12:33 GMT + a20aca300a3c9c1cdd724971dba4626d + 1913 + + + directory + /secure + + + + + + file + /secure/.htaccess + Tue, 29 Jun 2010 08:34:20 GMT + d3e3f4f1861877f7e035cb8876ba8d18 + 60 + + + file + /secure/class.phpmailer.php + Tue, 29 Jun 2010 08:34:19 GMT + d80cf8d4005ee4334f445e91402b6b17 + 56086 + + + file + /secure/class.smtp.php + Tue, 29 Jun 2010 08:34:20 GMT + d2be32bec43171954dc9bd328ab63dac + 31376 + + + file + /secure/fax_to_email.php + Tue, 07 Sep 2010 06:35:18 GMT + 176d1835e583ba73f29894b5b7ce98e5 + 8381 + + + file + /secure/htaccess.tmp + Tue, 29 Jun 2010 08:34:20 GMT + d3e3f4f1861877f7e035cb8876ba8d18 + 60 + + + file + /secure/index.php + Tue, 29 Jun 2010 08:34:20 GMT + 02c874c2cb149f783e14b0867246f2a4 + 940 + + + file + /secure/root.php + Tue, 29 Jun 2010 08:34:19 GMT + a20aca300a3c9c1cdd724971dba4626d + 1913 + + + file + /secure/v_config_cli.php + Tue, 29 Jun 2010 08:34:19 GMT + 6e1e710fe517b4a624d0fad75313d1bb + 1109 + + + file + /secure/v_mailto.php + Tue, 29 Jun 2010 08:34:19 GMT + 9d33605176da0905309c7f62f58d9eb4 + 7230 + + + directory + /themes + + + + + + directory + /themes/default + + + + + + file + /themes/default/background.gif + Tue, 08 Dec 2009 02:24:10 GMT + 519582841753eaec7ceccd815f576b11 + 128 + + + file + /themes/default/background_black.png + Sat, 04 Sep 2010 23:40:30 GMT + e99b62c13995e4d2082d7e2cb509336f + 322 + + + file + /themes/default/background_cell.gif + Wed, 24 Feb 2010 03:39:51 GMT + b5dc189db0c5688ffbb85131d8983eae + 128 + + + file + /themes/default/background_cell.png + Wed, 24 Feb 2010 03:57:49 GMT + 38bdb2a91cf5bf2c5c957362d4978fff + 135 + + + file + /themes/default/background_head.png + Wed, 24 Feb 2010 03:13:59 GMT + e0ec4552445b04ddce3efad334707a03 + 339 + + + file + /themes/default/background_th.png + Thu, 15 Jul 2010 22:21:35 GMT + f312bb56f3f1c40047420ba07e411aa2 + 324 + + + file + /themes/default/background_th_blue.png + Thu, 15 Jul 2010 22:21:35 GMT + f312bb56f3f1c40047420ba07e411aa2 + 324 + + + file + /themes/default/blank.gif + Tue, 08 Dec 2009 02:24:10 GMT + 56398e76be6355ad5999b262208a17c9 + 49 + + + file + /themes/default/logo.png + Fri, 19 Feb 2010 22:21:10 GMT + e45f2d2b34a95646df5e16393857278d + 14978 + + + file + /themes/default/menu_background.jpg + Wed, 24 Feb 2010 02:24:57 GMT + a0c9ea4b1e3456316d5e521b9841518a + 1124 + + + file + /themes/default/template.php + Sun, 05 Sep 2010 00:03:16 GMT + 313eb46074ee2f98cea99cfc3855dd05 + 7735 + + + directory + /themes/horizontal + + + + + + file + /themes/horizontal/background.jpg + Wed, 24 Feb 2010 02:24:57 GMT + a0c9ea4b1e3456316d5e521b9841518a + 1124 + + + file + /themes/horizontal/background_cell.gif + Wed, 24 Feb 2010 03:39:51 GMT + b5dc189db0c5688ffbb85131d8983eae + 128 + + + file + /themes/horizontal/background_head.png + Wed, 24 Feb 2010 03:13:59 GMT + e0ec4552445b04ddce3efad334707a03 + 339 + + + file + /themes/horizontal/background_th.png + Wed, 24 Feb 2010 06:21:09 GMT + f312bb56f3f1c40047420ba07e411aa2 + 324 + + + file + /themes/horizontal/background_th_blue.png + Thu, 15 Jul 2010 22:21:35 GMT + f312bb56f3f1c40047420ba07e411aa2 + 324 + + + file + /themes/horizontal/background_th_purple.png + Wed, 24 Feb 2010 06:03:21 GMT + 1e2480358b52c6c5714c236724dbae3f + 310 + + + file + /themes/horizontal/blank.gif + Tue, 08 Dec 2009 02:24:10 GMT + 56398e76be6355ad5999b262208a17c9 + 49 + + + file + /themes/horizontal/logo.png + Fri, 19 Feb 2010 22:21:10 GMT + e45f2d2b34a95646df5e16393857278d + 14978 + + + file + /themes/horizontal/template.php + Sun, 05 Sep 2010 00:37:03 GMT + b97ed9148e7489e48f3eb557f544a449 + 8686 + + \ No newline at end of file diff --git a/includes/install/sql/mysql.sql b/includes/install/sql/mysql.sql new file mode 100644 index 0000000000..d2ba34d170 --- /dev/null +++ b/includes/install/sql/mysql.sql @@ -0,0 +1 @@ +INSERT INTO v_settings (numbering_plan, event_socket_ip_address, event_socket_port, event_socket_password, xml_rpc_http_port, xml_rpc_auth_realm, xml_rpc_auth_user, xml_rpc_auth_pass, admin_pin, smtp_host, smtp_secure, smtp_auth, smtp_username, smtp_password, smtp_from, smtp_from_name, mod_shout_decoder, mod_shout_volume) VALUES ('US','127.0.0.1',8021,'ClueCon',8787,'localhost','xmlrpc','7e4d3i',1234,'','none','','','','','Voicemail','i386',0.3); \ No newline at end of file diff --git a/includes/install/sql/pgsql.sql b/includes/install/sql/pgsql.sql new file mode 100644 index 0000000000..2f66737e92 --- /dev/null +++ b/includes/install/sql/pgsql.sql @@ -0,0 +1,9 @@ +--BEGIN TRANSACTION; +INSERT INTO v_settings (numbering_plan, event_socket_ip_address, event_socket_port, event_socket_password, xml_rpc_http_port, xml_rpc_auth_realm, xml_rpc_auth_user, xml_rpc_auth_pass, admin_pin, smtp_host, smtp_secure, smtp_auth, smtp_username, smtp_password, smtp_from, smtp_from_name, mod_shout_decoder, mod_shout_volume) VALUES ('US','127.0.0.1',8021,'ClueCon',8787,'localhost','xmlrpc','7e4d3i',1234,'','none','','','','','Voicemail','i386',0.3); +CREATE INDEX index_billsec ON v_xml_cdr(billsec); +CREATE INDEX index_caller_id_name ON v_xml_cdr(caller_id_name); +CREATE INDEX index_destination_number ON v_xml_cdr(destination_number); +CREATE INDEX index_duration ON v_xml_cdr(duration); +CREATE INDEX index_hangup_cause ON v_xml_cdr(hangup_cause); +CREATE INDEX index_start_stamp ON v_xml_cdr(start_stamp); +--COMMIT; diff --git a/includes/install/sql/sqlite.sql b/includes/install/sql/sqlite.sql new file mode 100644 index 0000000000..e1d207635f --- /dev/null +++ b/includes/install/sql/sqlite.sql @@ -0,0 +1,9 @@ +--BEGIN TRANSACTION; +INSERT INTO v_settings (numbering_plan, event_socket_ip_address, event_socket_port, event_socket_password, xml_rpc_http_port, xml_rpc_auth_realm, xml_rpc_auth_user, xml_rpc_auth_pass, admin_pin, smtp_host, smtp_secure, smtp_auth, smtp_username, smtp_password, smtp_from, smtp_from_name, mod_shout_decoder, mod_shout_volume) VALUES ('US','127.0.0.1',8021,'ClueCon',8787,'localhost','xmlrpc','7e4d3i',1234,'','none','','','','','Voicemail','i386',0.3); +CREATE INDEX index_billsec ON v_xml_cdr(billsec ASC); +CREATE INDEX index_caller_id_name ON v_xml_cdr(caller_id_name ASC); +CREATE INDEX index_destination_number ON v_xml_cdr(destination_number ASC); +CREATE INDEX index_duration ON v_xml_cdr(duration ASC); +CREATE INDEX index_hangup_cause ON v_xml_cdr(hangup_cause ASC); +CREATE INDEX index_start_stamp ON v_xml_cdr(start_stamp ASC); +--COMMIT; diff --git a/includes/jquery/flot/excanvas.min.js b/includes/jquery/flot/excanvas.min.js new file mode 100644 index 0000000000..12c74f7bea --- /dev/null +++ b/includes/jquery/flot/excanvas.min.js @@ -0,0 +1 @@ +if(!document.createElement("canvas").getContext){(function(){var z=Math;var K=z.round;var J=z.sin;var U=z.cos;var b=z.abs;var k=z.sqrt;var D=10;var F=D/2;function T(){return this.context_||(this.context_=new W(this))}var O=Array.prototype.slice;function G(i,j,m){var Z=O.call(arguments,2);return function(){return i.apply(j,Z.concat(O.call(arguments)))}}function AD(Z){return String(Z).replace(/&/g,"&").replace(/"/g,""")}function r(i){if(!i.namespaces.g_vml_){i.namespaces.add("g_vml_","urn:schemas-microsoft-com:vml","#default#VML")}if(!i.namespaces.g_o_){i.namespaces.add("g_o_","urn:schemas-microsoft-com:office:office","#default#VML")}if(!i.styleSheets.ex_canvas_){var Z=i.createStyleSheet();Z.owningElement.id="ex_canvas_";Z.cssText="canvas{display:inline-block;overflow:hidden;text-align:left;width:300px;height:150px}"}}r(document);var E={init:function(Z){if(/MSIE/.test(navigator.userAgent)&&!window.opera){var i=Z||document;i.createElement("canvas");i.attachEvent("onreadystatechange",G(this.init_,this,i))}},init_:function(m){var j=m.getElementsByTagName("canvas");for(var Z=0;Z1){j--}if(6*j<1){return i+(Z-i)*6*j}else{if(2*j<1){return Z}else{if(3*j<2){return i+(Z-i)*(2/3-j)*6}else{return i}}}}function Y(Z){var AE,p=1;Z=String(Z);if(Z.charAt(0)=="#"){AE=Z}else{if(/^rgb/.test(Z)){var m=g(Z);var AE="#",AF;for(var j=0;j<3;j++){if(m[j].indexOf("%")!=-1){AF=Math.floor(C(m[j])*255)}else{AF=Number(m[j])}AE+=I[N(AF,0,255)]}p=m[3]}else{if(/^hsl/.test(Z)){var m=g(Z);AE=c(m);p=m[3]}else{AE=B[Z]||Z}}}return{color:AE,alpha:p}}var L={style:"normal",variant:"normal",weight:"normal",size:10,family:"sans-serif"};var f={};function X(Z){if(f[Z]){return f[Z]}var m=document.createElement("div");var j=m.style;try{j.font=Z}catch(i){}return f[Z]={style:j.fontStyle||L.style,variant:j.fontVariant||L.variant,weight:j.fontWeight||L.weight,size:j.fontSize||L.size,family:j.fontFamily||L.family}}function P(j,i){var Z={};for(var AF in j){Z[AF]=j[AF]}var AE=parseFloat(i.currentStyle.fontSize),m=parseFloat(j.size);if(typeof j.size=="number"){Z.size=j.size}else{if(j.size.indexOf("px")!=-1){Z.size=m}else{if(j.size.indexOf("em")!=-1){Z.size=AE*m}else{if(j.size.indexOf("%")!=-1){Z.size=(AE/100)*m}else{if(j.size.indexOf("pt")!=-1){Z.size=m/0.75}else{Z.size=AE}}}}}Z.size*=0.981;return Z}function AA(Z){return Z.style+" "+Z.variant+" "+Z.weight+" "+Z.size+"px "+Z.family}function t(Z){switch(Z){case"butt":return"flat";case"round":return"round";case"square":default:return"square"}}function W(i){this.m_=V();this.mStack_=[];this.aStack_=[];this.currentPath_=[];this.strokeStyle="#000";this.fillStyle="#000";this.lineWidth=1;this.lineJoin="miter";this.lineCap="butt";this.miterLimit=D*1;this.globalAlpha=1;this.font="10px sans-serif";this.textAlign="left";this.textBaseline="alphabetic";this.canvas=i;var Z=i.ownerDocument.createElement("div");Z.style.width=i.clientWidth+"px";Z.style.height=i.clientHeight+"px";Z.style.overflow="hidden";Z.style.position="absolute";i.appendChild(Z);this.element_=Z;this.arcScaleX_=1;this.arcScaleY_=1;this.lineScale_=1}var M=W.prototype;M.clearRect=function(){if(this.textMeasureEl_){this.textMeasureEl_.removeNode(true);this.textMeasureEl_=null}this.element_.innerHTML=""};M.beginPath=function(){this.currentPath_=[]};M.moveTo=function(i,Z){var j=this.getCoords_(i,Z);this.currentPath_.push({type:"moveTo",x:j.x,y:j.y});this.currentX_=j.x;this.currentY_=j.y};M.lineTo=function(i,Z){var j=this.getCoords_(i,Z);this.currentPath_.push({type:"lineTo",x:j.x,y:j.y});this.currentX_=j.x;this.currentY_=j.y};M.bezierCurveTo=function(j,i,AI,AH,AG,AE){var Z=this.getCoords_(AG,AE);var AF=this.getCoords_(j,i);var m=this.getCoords_(AI,AH);e(this,AF,m,Z)};function e(Z,m,j,i){Z.currentPath_.push({type:"bezierCurveTo",cp1x:m.x,cp1y:m.y,cp2x:j.x,cp2y:j.y,x:i.x,y:i.y});Z.currentX_=i.x;Z.currentY_=i.y}M.quadraticCurveTo=function(AG,j,i,Z){var AF=this.getCoords_(AG,j);var AE=this.getCoords_(i,Z);var AH={x:this.currentX_+2/3*(AF.x-this.currentX_),y:this.currentY_+2/3*(AF.y-this.currentY_)};var m={x:AH.x+(AE.x-this.currentX_)/3,y:AH.y+(AE.y-this.currentY_)/3};e(this,AH,m,AE)};M.arc=function(AJ,AH,AI,AE,i,j){AI*=D;var AN=j?"at":"wa";var AK=AJ+U(AE)*AI-F;var AM=AH+J(AE)*AI-F;var Z=AJ+U(i)*AI-F;var AL=AH+J(i)*AI-F;if(AK==Z&&!j){AK+=0.125}var m=this.getCoords_(AJ,AH);var AG=this.getCoords_(AK,AM);var AF=this.getCoords_(Z,AL);this.currentPath_.push({type:AN,x:m.x,y:m.y,radius:AI,xStart:AG.x,yStart:AG.y,xEnd:AF.x,yEnd:AF.y})};M.rect=function(j,i,Z,m){this.moveTo(j,i);this.lineTo(j+Z,i);this.lineTo(j+Z,i+m);this.lineTo(j,i+m);this.closePath()};M.strokeRect=function(j,i,Z,m){var p=this.currentPath_;this.beginPath();this.moveTo(j,i);this.lineTo(j+Z,i);this.lineTo(j+Z,i+m);this.lineTo(j,i+m);this.closePath();this.stroke();this.currentPath_=p};M.fillRect=function(j,i,Z,m){var p=this.currentPath_;this.beginPath();this.moveTo(j,i);this.lineTo(j+Z,i);this.lineTo(j+Z,i+m);this.lineTo(j,i+m);this.closePath();this.fill();this.currentPath_=p};M.createLinearGradient=function(i,m,Z,j){var p=new v("gradient");p.x0_=i;p.y0_=m;p.x1_=Z;p.y1_=j;return p};M.createRadialGradient=function(m,AE,j,i,p,Z){var AF=new v("gradientradial");AF.x0_=m;AF.y0_=AE;AF.r0_=j;AF.x1_=i;AF.y1_=p;AF.r1_=Z;return AF};M.drawImage=function(AO,j){var AH,AF,AJ,AV,AM,AK,AQ,AX;var AI=AO.runtimeStyle.width;var AN=AO.runtimeStyle.height;AO.runtimeStyle.width="auto";AO.runtimeStyle.height="auto";var AG=AO.width;var AT=AO.height;AO.runtimeStyle.width=AI;AO.runtimeStyle.height=AN;if(arguments.length==3){AH=arguments[1];AF=arguments[2];AM=AK=0;AQ=AJ=AG;AX=AV=AT}else{if(arguments.length==5){AH=arguments[1];AF=arguments[2];AJ=arguments[3];AV=arguments[4];AM=AK=0;AQ=AG;AX=AT}else{if(arguments.length==9){AM=arguments[1];AK=arguments[2];AQ=arguments[3];AX=arguments[4];AH=arguments[5];AF=arguments[6];AJ=arguments[7];AV=arguments[8]}else{throw Error("Invalid number of arguments")}}}var AW=this.getCoords_(AH,AF);var m=AQ/2;var i=AX/2;var AU=[];var Z=10;var AE=10;AU.push(" ','","");this.element_.insertAdjacentHTML("BeforeEnd",AU.join(""))};M.stroke=function(AM){var m=10;var AN=10;var AE=5000;var AG={x:null,y:null};var AL={x:null,y:null};for(var AH=0;AHAL.x){AL.x=Z.x}if(AG.y==null||Z.yAL.y){AL.y=Z.y}}}AK.push(' ">');if(!AM){R(this,AK)}else{a(this,AK,AG,AL)}AK.push("");this.element_.insertAdjacentHTML("beforeEnd",AK.join(""))}};function R(j,AE){var i=Y(j.strokeStyle);var m=i.color;var p=i.alpha*j.globalAlpha;var Z=j.lineScale_*j.lineWidth;if(Z<1){p*=Z}AE.push("')}function a(AO,AG,Ah,AP){var AH=AO.fillStyle;var AY=AO.arcScaleX_;var AX=AO.arcScaleY_;var Z=AP.x-Ah.x;var m=AP.y-Ah.y;if(AH instanceof v){var AL=0;var Ac={x:0,y:0};var AU=0;var AK=1;if(AH.type_=="gradient"){var AJ=AH.x0_/AY;var j=AH.y0_/AX;var AI=AH.x1_/AY;var Aj=AH.y1_/AX;var Ag=AO.getCoords_(AJ,j);var Af=AO.getCoords_(AI,Aj);var AE=Af.x-Ag.x;var p=Af.y-Ag.y;AL=Math.atan2(AE,p)*180/Math.PI;if(AL<0){AL+=360}if(AL<0.000001){AL=0}}else{var Ag=AO.getCoords_(AH.x0_,AH.y0_);Ac={x:(Ag.x-Ah.x)/Z,y:(Ag.y-Ah.y)/m};Z/=AY*D;m/=AX*D;var Aa=z.max(Z,m);AU=2*AH.r0_/Aa;AK=2*AH.r1_/Aa-AU}var AS=AH.colors_;AS.sort(function(Ak,i){return Ak.offset-i.offset});var AN=AS.length;var AR=AS[0].color;var AQ=AS[AN-1].color;var AW=AS[0].alpha*AO.globalAlpha;var AV=AS[AN-1].alpha*AO.globalAlpha;var Ab=[];for(var Ae=0;Ae')}else{if(AH instanceof u){if(Z&&m){var AF=-Ah.x;var AZ=-Ah.y;AG.push("')}}else{var Ai=Y(AO.fillStyle);var AT=Ai.color;var Ad=Ai.alpha*AO.globalAlpha;AG.push('')}}}M.fill=function(){this.stroke(true)};M.closePath=function(){this.currentPath_.push({type:"close"})};M.getCoords_=function(j,i){var Z=this.m_;return{x:D*(j*Z[0][0]+i*Z[1][0]+Z[2][0])-F,y:D*(j*Z[0][1]+i*Z[1][1]+Z[2][1])-F}};M.save=function(){var Z={};Q(this,Z);this.aStack_.push(Z);this.mStack_.push(this.m_);this.m_=d(V(),this.m_)};M.restore=function(){if(this.aStack_.length){Q(this.aStack_.pop(),this);this.m_=this.mStack_.pop()}};function H(Z){return isFinite(Z[0][0])&&isFinite(Z[0][1])&&isFinite(Z[1][0])&&isFinite(Z[1][1])&&isFinite(Z[2][0])&&isFinite(Z[2][1])}function y(i,Z,j){if(!H(Z)){return }i.m_=Z;if(j){var p=Z[0][0]*Z[1][1]-Z[0][1]*Z[1][0];i.lineScale_=k(b(p))}}M.translate=function(j,i){var Z=[[1,0,0],[0,1,0],[j,i,1]];y(this,d(Z,this.m_),false)};M.rotate=function(i){var m=U(i);var j=J(i);var Z=[[m,j,0],[-j,m,0],[0,0,1]];y(this,d(Z,this.m_),false)};M.scale=function(j,i){this.arcScaleX_*=j;this.arcScaleY_*=i;var Z=[[j,0,0],[0,i,0],[0,0,1]];y(this,d(Z,this.m_),true)};M.transform=function(p,m,AF,AE,i,Z){var j=[[p,m,0],[AF,AE,0],[i,Z,1]];y(this,d(j,this.m_),true)};M.setTransform=function(AE,p,AG,AF,j,i){var Z=[[AE,p,0],[AG,AF,0],[j,i,1]];y(this,Z,true)};M.drawText_=function(AK,AI,AH,AN,AG){var AM=this.m_,AQ=1000,i=0,AP=AQ,AF={x:0,y:0},AE=[];var Z=P(X(this.font),this.element_);var j=AA(Z);var AR=this.element_.currentStyle;var p=this.textAlign.toLowerCase();switch(p){case"left":case"center":case"right":break;case"end":p=AR.direction=="ltr"?"right":"left";break;case"start":p=AR.direction=="rtl"?"right":"left";break;default:p="left"}switch(this.textBaseline){case"hanging":case"top":AF.y=Z.size/1.75;break;case"middle":break;default:case null:case"alphabetic":case"ideographic":case"bottom":AF.y=-Z.size/2.25;break}switch(p){case"right":i=AQ;AP=0.05;break;case"center":i=AP=AQ/2;break}var AO=this.getCoords_(AI+AF.x,AH+AF.y);AE.push('');if(AG){R(this,AE)}else{a(this,AE,{x:-i,y:0},{x:AP,y:Z.size})}var AL=AM[0][0].toFixed(3)+","+AM[1][0].toFixed(3)+","+AM[0][1].toFixed(3)+","+AM[1][1].toFixed(3)+",0,0";var AJ=K(AO.x/D)+","+K(AO.y/D);AE.push('','','');this.element_.insertAdjacentHTML("beforeEnd",AE.join(""))};M.fillText=function(j,Z,m,i){this.drawText_(j,Z,m,i,false)};M.strokeText=function(j,Z,m,i){this.drawText_(j,Z,m,i,true)};M.measureText=function(j){if(!this.textMeasureEl_){var Z='';this.element_.insertAdjacentHTML("beforeEnd",Z);this.textMeasureEl_=this.element_.lastChild}var i=this.element_.ownerDocument;this.textMeasureEl_.innerHTML="";this.textMeasureEl_.style.font=this.font;this.textMeasureEl_.appendChild(i.createTextNode(j));return{width:this.textMeasureEl_.offsetWidth}};M.clip=function(){};M.arcTo=function(){};M.createPattern=function(i,Z){return new u(i,Z)};function v(Z){this.type_=Z;this.x0_=0;this.y0_=0;this.r0_=0;this.x1_=0;this.y1_=0;this.r1_=0;this.colors_=[]}v.prototype.addColorStop=function(i,Z){Z=Y(Z);this.colors_.push({offset:i,color:Z.color,alpha:Z.alpha})};function u(i,Z){q(i);switch(Z){case"repeat":case null:case"":this.repetition_="repeat";break;case"repeat-x":case"repeat-y":case"no-repeat":this.repetition_=Z;break;default:n("SYNTAX_ERR")}this.src_=i.src;this.width_=i.width;this.height_=i.height}function n(Z){throw new o(Z)}function q(Z){if(!Z||Z.nodeType!=1||Z.tagName!="IMG"){n("TYPE_MISMATCH_ERR")}if(Z.readyState!="complete"){n("INVALID_STATE_ERR")}}function o(Z){this.code=this[Z];this.message=Z+": DOM Exception "+this.code}var x=o.prototype=new Error;x.INDEX_SIZE_ERR=1;x.DOMSTRING_SIZE_ERR=2;x.HIERARCHY_REQUEST_ERR=3;x.WRONG_DOCUMENT_ERR=4;x.INVALID_CHARACTER_ERR=5;x.NO_DATA_ALLOWED_ERR=6;x.NO_MODIFICATION_ALLOWED_ERR=7;x.NOT_FOUND_ERR=8;x.NOT_SUPPORTED_ERR=9;x.INUSE_ATTRIBUTE_ERR=10;x.INVALID_STATE_ERR=11;x.SYNTAX_ERR=12;x.INVALID_MODIFICATION_ERR=13;x.NAMESPACE_ERR=14;x.INVALID_ACCESS_ERR=15;x.VALIDATION_ERR=16;x.TYPE_MISMATCH_ERR=17;G_vmlCanvasManager=E;CanvasRenderingContext2D=W;CanvasGradient=v;CanvasPattern=u;DOMException=o})()}; \ No newline at end of file diff --git a/includes/jquery/flot/jquery.flot.js b/includes/jquery/flot/jquery.flot.js new file mode 100644 index 0000000000..aabc544e9a --- /dev/null +++ b/includes/jquery/flot/jquery.flot.js @@ -0,0 +1,2599 @@ +/*! Javascript plotting library for jQuery, v. 0.7. + * + * Released under the MIT license by IOLA, December 2007. + * + */ + +// first an inline dependency, jquery.colorhelpers.js, we inline it here +// for convenience + +/* Plugin for jQuery for working with colors. + * + * Version 1.1. + * + * Inspiration from jQuery color animation plugin by John Resig. + * + * Released under the MIT license by Ole Laursen, October 2009. + * + * Examples: + * + * $.color.parse("#fff").scale('rgb', 0.25).add('a', -0.5).toString() + * var c = $.color.extract($("#mydiv"), 'background-color'); + * console.log(c.r, c.g, c.b, c.a); + * $.color.make(100, 50, 25, 0.4).toString() // returns "rgba(100,50,25,0.4)" + * + * Note that .scale() and .add() return the same modified object + * instead of making a new one. + * + * V. 1.1: Fix error handling so e.g. parsing an empty string does + * produce a color rather than just crashing. + */ +(function(B){B.color={};B.color.make=function(F,E,C,D){var G={};G.r=F||0;G.g=E||0;G.b=C||0;G.a=D!=null?D:1;G.add=function(J,I){for(var H=0;H=1){return"rgb("+[G.r,G.g,G.b].join(",")+")"}else{return"rgba("+[G.r,G.g,G.b,G.a].join(",")+")"}};G.normalize=function(){function H(J,K,I){return KI?I:K)}G.r=H(0,parseInt(G.r),255);G.g=H(0,parseInt(G.g),255);G.b=H(0,parseInt(G.b),255);G.a=H(0,G.a,1);return G};G.clone=function(){return B.color.make(G.r,G.b,G.g,G.a)};return G.normalize()};B.color.extract=function(D,C){var E;do{E=D.css(C).toLowerCase();if(E!=""&&E!="transparent"){break}D=D.parent()}while(!B.nodeName(D.get(0),"body"));if(E=="rgba(0, 0, 0, 0)"){E="transparent"}return B.color.parse(E)};B.color.parse=function(F){var E,C=B.color.make;if(E=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(F)){return C(parseInt(E[1],10),parseInt(E[2],10),parseInt(E[3],10))}if(E=/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(F)){return C(parseInt(E[1],10),parseInt(E[2],10),parseInt(E[3],10),parseFloat(E[4]))}if(E=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(F)){return C(parseFloat(E[1])*2.55,parseFloat(E[2])*2.55,parseFloat(E[3])*2.55)}if(E=/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(F)){return C(parseFloat(E[1])*2.55,parseFloat(E[2])*2.55,parseFloat(E[3])*2.55,parseFloat(E[4]))}if(E=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(F)){return C(parseInt(E[1],16),parseInt(E[2],16),parseInt(E[3],16))}if(E=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(F)){return C(parseInt(E[1]+E[1],16),parseInt(E[2]+E[2],16),parseInt(E[3]+E[3],16))}var D=B.trim(F).toLowerCase();if(D=="transparent"){return C(255,255,255,0)}else{E=A[D]||[0,0,0];return C(E[0],E[1],E[2])}};var A={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0,0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0]}})(jQuery); + +// the actual Flot code +(function($) { + function Plot(placeholder, data_, options_, plugins) { + // data is on the form: + // [ series1, series2 ... ] + // where series is either just the data as [ [x1, y1], [x2, y2], ... ] + // or { data: [ [x1, y1], [x2, y2], ... ], label: "some label", ... } + + var series = [], + options = { + // the color theme used for graphs + colors: ["#edc240", "#afd8f8", "#cb4b4b", "#4da74d", "#9440ed"], + legend: { + show: true, + noColumns: 1, // number of colums in legend table + labelFormatter: null, // fn: string -> string + labelBoxBorderColor: "#ccc", // border color for the little label boxes + container: null, // container (as jQuery object) to put legend in, null means default on top of graph + position: "ne", // position of default legend container within plot + margin: 5, // distance from grid edge to default legend container within plot + backgroundColor: null, // null means auto-detect + backgroundOpacity: 0.85 // set to 0 to avoid background + }, + xaxis: { + show: null, // null = auto-detect, true = always, false = never + position: "bottom", // or "top" + mode: null, // null or "time" + color: null, // base color, labels, ticks + tickColor: null, // possibly different color of ticks, e.g. "rgba(0,0,0,0.15)" + transform: null, // null or f: number -> number to transform axis + inverseTransform: null, // if transform is set, this should be the inverse function + min: null, // min. value to show, null means set automatically + max: null, // max. value to show, null means set automatically + autoscaleMargin: null, // margin in % to add if auto-setting min/max + ticks: null, // either [1, 3] or [[1, "a"], 3] or (fn: axis info -> ticks) or app. number of ticks for auto-ticks + tickFormatter: null, // fn: number -> string + labelWidth: null, // size of tick labels in pixels + labelHeight: null, + reserveSpace: null, // whether to reserve space even if axis isn't shown + tickLength: null, // size in pixels of ticks, or "full" for whole line + alignTicksWithAxis: null, // axis number or null for no sync + + // mode specific options + tickDecimals: null, // no. of decimals, null means auto + tickSize: null, // number or [number, "unit"] + minTickSize: null, // number or [number, "unit"] + monthNames: null, // list of names of months + timeformat: null, // format string to use + twelveHourClock: false // 12 or 24 time in time mode + }, + yaxis: { + autoscaleMargin: 0.02, + position: "left" // or "right" + }, + xaxes: [], + yaxes: [], + series: { + points: { + show: false, + radius: 3, + lineWidth: 2, // in pixels + fill: true, + fillColor: "#ffffff", + symbol: "circle" // or callback + }, + lines: { + // we don't put in show: false so we can see + // whether lines were actively disabled + lineWidth: 2, // in pixels + fill: false, + fillColor: null, + steps: false + }, + bars: { + show: false, + lineWidth: 2, // in pixels + barWidth: 1, // in units of the x axis + fill: true, + fillColor: null, + align: "left", // or "center" + horizontal: false + }, + shadowSize: 3 + }, + grid: { + show: true, + aboveData: false, + color: "#545454", // primary color used for outline and labels + backgroundColor: null, // null for transparent, else color + borderColor: null, // set if different from the grid color + tickColor: null, // color for the ticks, e.g. "rgba(0,0,0,0.15)" + labelMargin: 5, // in pixels + axisMargin: 8, // in pixels + borderWidth: 2, // in pixels + minBorderMargin: null, // in pixels, null means taken from points radius + markings: null, // array of ranges or fn: axes -> array of ranges + markingsColor: "#f4f4f4", + markingsLineWidth: 2, + // interactive stuff + clickable: false, + hoverable: false, + autoHighlight: true, // highlight in case mouse is near + mouseActiveRadius: 10 // how far the mouse can be away to activate an item + }, + hooks: {} + }, + canvas = null, // the canvas for the plot itself + overlay = null, // canvas for interactive stuff on top of plot + eventHolder = null, // jQuery object that events should be bound to + ctx = null, octx = null, + xaxes = [], yaxes = [], + plotOffset = { left: 0, right: 0, top: 0, bottom: 0}, + canvasWidth = 0, canvasHeight = 0, + plotWidth = 0, plotHeight = 0, + hooks = { + processOptions: [], + processRawData: [], + processDatapoints: [], + drawSeries: [], + draw: [], + bindEvents: [], + drawOverlay: [], + shutdown: [] + }, + plot = this; + + // public functions + plot.setData = setData; + plot.setupGrid = setupGrid; + plot.draw = draw; + plot.getPlaceholder = function() { return placeholder; }; + plot.getCanvas = function() { return canvas; }; + plot.getPlotOffset = function() { return plotOffset; }; + plot.width = function () { return plotWidth; }; + plot.height = function () { return plotHeight; }; + plot.offset = function () { + var o = eventHolder.offset(); + o.left += plotOffset.left; + o.top += plotOffset.top; + return o; + }; + plot.getData = function () { return series; }; + plot.getAxes = function () { + var res = {}, i; + $.each(xaxes.concat(yaxes), function (_, axis) { + if (axis) + res[axis.direction + (axis.n != 1 ? axis.n : "") + "axis"] = axis; + }); + return res; + }; + plot.getXAxes = function () { return xaxes; }; + plot.getYAxes = function () { return yaxes; }; + plot.c2p = canvasToAxisCoords; + plot.p2c = axisToCanvasCoords; + plot.getOptions = function () { return options; }; + plot.highlight = highlight; + plot.unhighlight = unhighlight; + plot.triggerRedrawOverlay = triggerRedrawOverlay; + plot.pointOffset = function(point) { + return { + left: parseInt(xaxes[axisNumber(point, "x") - 1].p2c(+point.x) + plotOffset.left), + top: parseInt(yaxes[axisNumber(point, "y") - 1].p2c(+point.y) + plotOffset.top) + }; + }; + plot.shutdown = shutdown; + plot.resize = function () { + getCanvasDimensions(); + resizeCanvas(canvas); + resizeCanvas(overlay); + }; + + // public attributes + plot.hooks = hooks; + + // initialize + initPlugins(plot); + parseOptions(options_); + setupCanvases(); + setData(data_); + setupGrid(); + draw(); + bindEvents(); + + + function executeHooks(hook, args) { + args = [plot].concat(args); + for (var i = 0; i < hook.length; ++i) + hook[i].apply(this, args); + } + + function initPlugins() { + for (var i = 0; i < plugins.length; ++i) { + var p = plugins[i]; + p.init(plot); + if (p.options) + $.extend(true, options, p.options); + } + } + + function parseOptions(opts) { + var i; + + $.extend(true, options, opts); + + if (options.xaxis.color == null) + options.xaxis.color = options.grid.color; + if (options.yaxis.color == null) + options.yaxis.color = options.grid.color; + + if (options.xaxis.tickColor == null) // backwards-compatibility + options.xaxis.tickColor = options.grid.tickColor; + if (options.yaxis.tickColor == null) // backwards-compatibility + options.yaxis.tickColor = options.grid.tickColor; + + if (options.grid.borderColor == null) + options.grid.borderColor = options.grid.color; + if (options.grid.tickColor == null) + options.grid.tickColor = $.color.parse(options.grid.color).scale('a', 0.22).toString(); + + // fill in defaults in axes, copy at least always the + // first as the rest of the code assumes it'll be there + for (i = 0; i < Math.max(1, options.xaxes.length); ++i) + options.xaxes[i] = $.extend(true, {}, options.xaxis, options.xaxes[i]); + for (i = 0; i < Math.max(1, options.yaxes.length); ++i) + options.yaxes[i] = $.extend(true, {}, options.yaxis, options.yaxes[i]); + + // backwards compatibility, to be removed in future + if (options.xaxis.noTicks && options.xaxis.ticks == null) + options.xaxis.ticks = options.xaxis.noTicks; + if (options.yaxis.noTicks && options.yaxis.ticks == null) + options.yaxis.ticks = options.yaxis.noTicks; + if (options.x2axis) { + options.xaxes[1] = $.extend(true, {}, options.xaxis, options.x2axis); + options.xaxes[1].position = "top"; + } + if (options.y2axis) { + options.yaxes[1] = $.extend(true, {}, options.yaxis, options.y2axis); + options.yaxes[1].position = "right"; + } + if (options.grid.coloredAreas) + options.grid.markings = options.grid.coloredAreas; + if (options.grid.coloredAreasColor) + options.grid.markingsColor = options.grid.coloredAreasColor; + if (options.lines) + $.extend(true, options.series.lines, options.lines); + if (options.points) + $.extend(true, options.series.points, options.points); + if (options.bars) + $.extend(true, options.series.bars, options.bars); + if (options.shadowSize != null) + options.series.shadowSize = options.shadowSize; + + // save options on axes for future reference + for (i = 0; i < options.xaxes.length; ++i) + getOrCreateAxis(xaxes, i + 1).options = options.xaxes[i]; + for (i = 0; i < options.yaxes.length; ++i) + getOrCreateAxis(yaxes, i + 1).options = options.yaxes[i]; + + // add hooks from options + for (var n in hooks) + if (options.hooks[n] && options.hooks[n].length) + hooks[n] = hooks[n].concat(options.hooks[n]); + + executeHooks(hooks.processOptions, [options]); + } + + function setData(d) { + series = parseData(d); + fillInSeriesOptions(); + processData(); + } + + function parseData(d) { + var res = []; + for (var i = 0; i < d.length; ++i) { + var s = $.extend(true, {}, options.series); + + if (d[i].data != null) { + s.data = d[i].data; // move the data instead of deep-copy + delete d[i].data; + + $.extend(true, s, d[i]); + + d[i].data = s.data; + } + else + s.data = d[i]; + res.push(s); + } + + return res; + } + + function axisNumber(obj, coord) { + var a = obj[coord + "axis"]; + if (typeof a == "object") // if we got a real axis, extract number + a = a.n; + if (typeof a != "number") + a = 1; // default to first axis + return a; + } + + function allAxes() { + // return flat array without annoying null entries + return $.grep(xaxes.concat(yaxes), function (a) { return a; }); + } + + function canvasToAxisCoords(pos) { + // return an object with x/y corresponding to all used axes + var res = {}, i, axis; + for (i = 0; i < xaxes.length; ++i) { + axis = xaxes[i]; + if (axis && axis.used) + res["x" + axis.n] = axis.c2p(pos.left); + } + + for (i = 0; i < yaxes.length; ++i) { + axis = yaxes[i]; + if (axis && axis.used) + res["y" + axis.n] = axis.c2p(pos.top); + } + + if (res.x1 !== undefined) + res.x = res.x1; + if (res.y1 !== undefined) + res.y = res.y1; + + return res; + } + + function axisToCanvasCoords(pos) { + // get canvas coords from the first pair of x/y found in pos + var res = {}, i, axis, key; + + for (i = 0; i < xaxes.length; ++i) { + axis = xaxes[i]; + if (axis && axis.used) { + key = "x" + axis.n; + if (pos[key] == null && axis.n == 1) + key = "x"; + + if (pos[key] != null) { + res.left = axis.p2c(pos[key]); + break; + } + } + } + + for (i = 0; i < yaxes.length; ++i) { + axis = yaxes[i]; + if (axis && axis.used) { + key = "y" + axis.n; + if (pos[key] == null && axis.n == 1) + key = "y"; + + if (pos[key] != null) { + res.top = axis.p2c(pos[key]); + break; + } + } + } + + return res; + } + + function getOrCreateAxis(axes, number) { + if (!axes[number - 1]) + axes[number - 1] = { + n: number, // save the number for future reference + direction: axes == xaxes ? "x" : "y", + options: $.extend(true, {}, axes == xaxes ? options.xaxis : options.yaxis) + }; + + return axes[number - 1]; + } + + function fillInSeriesOptions() { + var i; + + // collect what we already got of colors + var neededColors = series.length, + usedColors = [], + assignedColors = []; + for (i = 0; i < series.length; ++i) { + var sc = series[i].color; + if (sc != null) { + --neededColors; + if (typeof sc == "number") + assignedColors.push(sc); + else + usedColors.push($.color.parse(series[i].color)); + } + } + + // we might need to generate more colors if higher indices + // are assigned + for (i = 0; i < assignedColors.length; ++i) { + neededColors = Math.max(neededColors, assignedColors[i] + 1); + } + + // produce colors as needed + var colors = [], variation = 0; + i = 0; + while (colors.length < neededColors) { + var c; + if (options.colors.length == i) // check degenerate case + c = $.color.make(100, 100, 100); + else + c = $.color.parse(options.colors[i]); + + // vary color if needed + var sign = variation % 2 == 1 ? -1 : 1; + c.scale('rgb', 1 + sign * Math.ceil(variation / 2) * 0.2) + + // FIXME: if we're getting to close to something else, + // we should probably skip this one + colors.push(c); + + ++i; + if (i >= options.colors.length) { + i = 0; + ++variation; + } + } + + // fill in the options + var colori = 0, s; + for (i = 0; i < series.length; ++i) { + s = series[i]; + + // assign colors + if (s.color == null) { + s.color = colors[colori].toString(); + ++colori; + } + else if (typeof s.color == "number") + s.color = colors[s.color].toString(); + + // turn on lines automatically in case nothing is set + if (s.lines.show == null) { + var v, show = true; + for (v in s) + if (s[v] && s[v].show) { + show = false; + break; + } + if (show) + s.lines.show = true; + } + + // setup axes + s.xaxis = getOrCreateAxis(xaxes, axisNumber(s, "x")); + s.yaxis = getOrCreateAxis(yaxes, axisNumber(s, "y")); + } + } + + function processData() { + var topSentry = Number.POSITIVE_INFINITY, + bottomSentry = Number.NEGATIVE_INFINITY, + fakeInfinity = Number.MAX_VALUE, + i, j, k, m, length, + s, points, ps, x, y, axis, val, f, p; + + function updateAxis(axis, min, max) { + if (min < axis.datamin && min != -fakeInfinity) + axis.datamin = min; + if (max > axis.datamax && max != fakeInfinity) + axis.datamax = max; + } + + $.each(allAxes(), function (_, axis) { + // init axis + axis.datamin = topSentry; + axis.datamax = bottomSentry; + axis.used = false; + }); + + for (i = 0; i < series.length; ++i) { + s = series[i]; + s.datapoints = { points: [] }; + + executeHooks(hooks.processRawData, [ s, s.data, s.datapoints ]); + } + + // first pass: clean and copy data + for (i = 0; i < series.length; ++i) { + s = series[i]; + + var data = s.data, format = s.datapoints.format; + + if (!format) { + format = []; + // find out how to copy + format.push({ x: true, number: true, required: true }); + format.push({ y: true, number: true, required: true }); + + if (s.bars.show || (s.lines.show && s.lines.fill)) { + format.push({ y: true, number: true, required: false, defaultValue: 0 }); + if (s.bars.horizontal) { + delete format[format.length - 1].y; + format[format.length - 1].x = true; + } + } + + s.datapoints.format = format; + } + + if (s.datapoints.pointsize != null) + continue; // already filled in + + s.datapoints.pointsize = format.length; + + ps = s.datapoints.pointsize; + points = s.datapoints.points; + + insertSteps = s.lines.show && s.lines.steps; + s.xaxis.used = s.yaxis.used = true; + + for (j = k = 0; j < data.length; ++j, k += ps) { + p = data[j]; + + var nullify = p == null; + if (!nullify) { + for (m = 0; m < ps; ++m) { + val = p[m]; + f = format[m]; + + if (f) { + if (f.number && val != null) { + val = +val; // convert to number + if (isNaN(val)) + val = null; + else if (val == Infinity) + val = fakeInfinity; + else if (val == -Infinity) + val = -fakeInfinity; + } + + if (val == null) { + if (f.required) + nullify = true; + + if (f.defaultValue != null) + val = f.defaultValue; + } + } + + points[k + m] = val; + } + } + + if (nullify) { + for (m = 0; m < ps; ++m) { + val = points[k + m]; + if (val != null) { + f = format[m]; + // extract min/max info + if (f.x) + updateAxis(s.xaxis, val, val); + if (f.y) + updateAxis(s.yaxis, val, val); + } + points[k + m] = null; + } + } + else { + // a little bit of line specific stuff that + // perhaps shouldn't be here, but lacking + // better means... + if (insertSteps && k > 0 + && points[k - ps] != null + && points[k - ps] != points[k] + && points[k - ps + 1] != points[k + 1]) { + // copy the point to make room for a middle point + for (m = 0; m < ps; ++m) + points[k + ps + m] = points[k + m]; + + // middle point has same y + points[k + 1] = points[k - ps + 1]; + + // we've added a point, better reflect that + k += ps; + } + } + } + } + + // give the hooks a chance to run + for (i = 0; i < series.length; ++i) { + s = series[i]; + + executeHooks(hooks.processDatapoints, [ s, s.datapoints]); + } + + // second pass: find datamax/datamin for auto-scaling + for (i = 0; i < series.length; ++i) { + s = series[i]; + points = s.datapoints.points, + ps = s.datapoints.pointsize; + + var xmin = topSentry, ymin = topSentry, + xmax = bottomSentry, ymax = bottomSentry; + + for (j = 0; j < points.length; j += ps) { + if (points[j] == null) + continue; + + for (m = 0; m < ps; ++m) { + val = points[j + m]; + f = format[m]; + if (!f || val == fakeInfinity || val == -fakeInfinity) + continue; + + if (f.x) { + if (val < xmin) + xmin = val; + if (val > xmax) + xmax = val; + } + if (f.y) { + if (val < ymin) + ymin = val; + if (val > ymax) + ymax = val; + } + } + } + + if (s.bars.show) { + // make sure we got room for the bar on the dancing floor + var delta = s.bars.align == "left" ? 0 : -s.bars.barWidth/2; + if (s.bars.horizontal) { + ymin += delta; + ymax += delta + s.bars.barWidth; + } + else { + xmin += delta; + xmax += delta + s.bars.barWidth; + } + } + + updateAxis(s.xaxis, xmin, xmax); + updateAxis(s.yaxis, ymin, ymax); + } + + $.each(allAxes(), function (_, axis) { + if (axis.datamin == topSentry) + axis.datamin = null; + if (axis.datamax == bottomSentry) + axis.datamax = null; + }); + } + + function makeCanvas(skipPositioning, cls) { + var c = document.createElement('canvas'); + c.className = cls; + c.width = canvasWidth; + c.height = canvasHeight; + + if (!skipPositioning) + $(c).css({ position: 'absolute', left: 0, top: 0 }); + + $(c).appendTo(placeholder); + + if (!c.getContext) // excanvas hack + c = window.G_vmlCanvasManager.initElement(c); + + // used for resetting in case we get replotted + c.getContext("2d").save(); + + return c; + } + + function getCanvasDimensions() { + canvasWidth = placeholder.width(); + canvasHeight = placeholder.height(); + + if (canvasWidth <= 0 || canvasHeight <= 0) + throw "Invalid dimensions for plot, width = " + canvasWidth + ", height = " + canvasHeight; + } + + function resizeCanvas(c) { + // resizing should reset the state (excanvas seems to be + // buggy though) + if (c.width != canvasWidth) + c.width = canvasWidth; + + if (c.height != canvasHeight) + c.height = canvasHeight; + + // so try to get back to the initial state (even if it's + // gone now, this should be safe according to the spec) + var cctx = c.getContext("2d"); + cctx.restore(); + + // and save again + cctx.save(); + } + + function setupCanvases() { + var reused, + existingCanvas = placeholder.children("canvas.base"), + existingOverlay = placeholder.children("canvas.overlay"); + + if (existingCanvas.length == 0 || existingOverlay == 0) { + // init everything + + placeholder.html(""); // make sure placeholder is clear + + placeholder.css({ padding: 0 }); // padding messes up the positioning + + if (placeholder.css("position") == 'static') + placeholder.css("position", "relative"); // for positioning labels and overlay + + getCanvasDimensions(); + + canvas = makeCanvas(true, "base"); + overlay = makeCanvas(false, "overlay"); // overlay canvas for interactive features + + reused = false; + } + else { + // reuse existing elements + + canvas = existingCanvas.get(0); + overlay = existingOverlay.get(0); + + reused = true; + } + + ctx = canvas.getContext("2d"); + octx = overlay.getContext("2d"); + + // we include the canvas in the event holder too, because IE 7 + // sometimes has trouble with the stacking order + eventHolder = $([overlay, canvas]); + + if (reused) { + // run shutdown in the old plot object + placeholder.data("plot").shutdown(); + + // reset reused canvases + plot.resize(); + + // make sure overlay pixels are cleared (canvas is cleared when we redraw) + octx.clearRect(0, 0, canvasWidth, canvasHeight); + + // then whack any remaining obvious garbage left + eventHolder.unbind(); + placeholder.children().not([canvas, overlay]).remove(); + } + + // save in case we get replotted + placeholder.data("plot", plot); + } + + function bindEvents() { + // bind events + if (options.grid.hoverable) { + eventHolder.mousemove(onMouseMove); + eventHolder.mouseleave(onMouseLeave); + } + + if (options.grid.clickable) + eventHolder.click(onClick); + + executeHooks(hooks.bindEvents, [eventHolder]); + } + + function shutdown() { + if (redrawTimeout) + clearTimeout(redrawTimeout); + + eventHolder.unbind("mousemove", onMouseMove); + eventHolder.unbind("mouseleave", onMouseLeave); + eventHolder.unbind("click", onClick); + + executeHooks(hooks.shutdown, [eventHolder]); + } + + function setTransformationHelpers(axis) { + // set helper functions on the axis, assumes plot area + // has been computed already + + function identity(x) { return x; } + + var s, m, t = axis.options.transform || identity, + it = axis.options.inverseTransform; + + // precompute how much the axis is scaling a point + // in canvas space + if (axis.direction == "x") { + s = axis.scale = plotWidth / Math.abs(t(axis.max) - t(axis.min)); + m = Math.min(t(axis.max), t(axis.min)); + } + else { + s = axis.scale = plotHeight / Math.abs(t(axis.max) - t(axis.min)); + s = -s; + m = Math.max(t(axis.max), t(axis.min)); + } + + // data point to canvas coordinate + if (t == identity) // slight optimization + axis.p2c = function (p) { return (p - m) * s; }; + else + axis.p2c = function (p) { return (t(p) - m) * s; }; + // canvas coordinate to data point + if (!it) + axis.c2p = function (c) { return m + c / s; }; + else + axis.c2p = function (c) { return it(m + c / s); }; + } + + function measureTickLabels(axis) { + var opts = axis.options, i, ticks = axis.ticks || [], labels = [], + l, w = opts.labelWidth, h = opts.labelHeight, dummyDiv; + + function makeDummyDiv(labels, width) { + return $('