From e3b2b6aad9cfaa7f9a9587206250111c77f7369d Mon Sep 17 00:00:00 2001 From: Fawaz Date: Mon, 7 Oct 2013 12:17:06 +0000 Subject: [PATCH] Added : 2.7 @trunk --- upload/.htaccess | 112 + upload/403.php | 24 + upload/404.php | 23 + upload/LICENSE | 47 + upload/actions/.htaccess | 0 upload/actions/admin.php | 132 + upload/actions/edit_comment.php | 20 + upload/actions/embed_form_verifier.php | 53 + upload/actions/file_downloader.php | 316 + upload/actions/file_results.php | 89 + upload/actions/file_uploader.php | 175 + upload/actions/get_file_size.php | 13 + upload/actions/include_functions.php | 130 + upload/actions/photo_uploader.php | 177 + upload/actions/process_video.php | 28 + upload/actions/send_subscription_email.php | 27 + upload/actions/update_cb_stats.php | 91 + upload/actions/update_configs.php | 36 + upload/actions/update_phrase.php | 20 + upload/actions/verify_converted_videos.php | 91 + upload/actions/video_convert.php | 214 + upload/activation.php | 44 + upload/add_group_videos.php | 72 + upload/admin_area/_permission.php | 32 + upload/admin_area/add_custom_fields.php | 30 + upload/admin_area/add_group.php | 6 + upload/admin_area/add_member.php | 30 + upload/admin_area/add_phrase.php | 27 + upload/admin_area/ads_add_placements.php | 47 + upload/admin_area/ads_manager.php | 61 + upload/admin_area/category.php | 79 + upload/admin_area/cb_conversion_queue.php | 64 + upload/admin_area/cb_mod_check.php | 17 + upload/admin_area/charts/daily_activity.php | 111 + upload/admin_area/charts/groups_activity.php | 109 + upload/admin_area/charts/ofc-library/JSON.php | 806 +++ .../charts/ofc-library/dot_base.php | 231 + .../charts/ofc-library/json_format.php | 86 + .../charts/ofc-library/ofc_area_base.php | 40 + .../charts/ofc-library/ofc_area_hollow.php | 10 + .../charts/ofc-library/ofc_area_line.php | 10 + .../charts/ofc-library/ofc_arrow.php | 27 + .../admin_area/charts/ofc-library/ofc_bar.php | 34 + .../charts/ofc-library/ofc_bar_3d.php | 22 + .../charts/ofc-library/ofc_bar_base.php | 97 + .../charts/ofc-library/ofc_bar_filled.php | 39 + .../charts/ofc-library/ofc_bar_glass.php | 131 + .../charts/ofc-library/ofc_bar_sketch.php | 29 + .../charts/ofc-library/ofc_bar_stack.php | 55 + .../charts/ofc-library/ofc_candle.php | 41 + .../charts/ofc-library/ofc_hbar.php | 64 + .../charts/ofc-library/ofc_line.php | 157 + .../charts/ofc-library/ofc_line_base.php | 92 + .../charts/ofc-library/ofc_line_dot.php | 33 + .../charts/ofc-library/ofc_line_hollow.php | 9 + .../charts/ofc-library/ofc_line_style.php | 11 + .../charts/ofc-library/ofc_menu.php | 56 + .../admin_area/charts/ofc-library/ofc_pie.php | 257 + .../charts/ofc-library/ofc_radar_axis.php | 47 + .../ofc-library/ofc_radar_axis_labels.php | 15 + .../ofc-library/ofc_radar_spoke_labels.php | 15 + .../charts/ofc-library/ofc_scatter.php | 47 + .../charts/ofc-library/ofc_scatter_line.php | 49 + .../charts/ofc-library/ofc_shape.php | 25 + .../charts/ofc-library/ofc_sugar.php | 43 + .../charts/ofc-library/ofc_tags.php | 133 + .../charts/ofc-library/ofc_title.php | 39 + .../charts/ofc-library/ofc_tooltip.php | 67 + .../charts/ofc-library/ofc_x_axis.php | 140 + .../charts/ofc-library/ofc_x_axis_label.php | 45 + .../charts/ofc-library/ofc_x_axis_labels.php | 69 + .../charts/ofc-library/ofc_x_legend.php | 15 + .../charts/ofc-library/ofc_y_axis.php | 17 + .../charts/ofc-library/ofc_y_axis_base.php | 116 + .../charts/ofc-library/ofc_y_axis_label.php | 38 + .../charts/ofc-library/ofc_y_axis_labels.php | 57 + .../charts/ofc-library/ofc_y_axis_right.php | 6 + .../charts/ofc-library/ofc_y_legend.php | 15 + .../ofc-library/open-flash-chart-object.php | 109 + .../charts/ofc-library/open-flash-chart.php | 178 + upload/admin_area/charts/users_activity.php | 108 + upload/admin_area/charts/videos_activity.php | 108 + upload/admin_area/collection_category.php | 79 + upload/admin_area/collection_manager.php | 154 + upload/admin_area/comments.php | 71 + upload/admin_area/conversion_lab.php | 25 + upload/admin_area/edit_announcement.php | 22 + upload/admin_area/edit_collection.php | 58 + upload/admin_area/edit_group.php | 35 + upload/admin_area/edit_member.php | 14 + upload/admin_area/edit_photo.php | 42 + upload/admin_area/edit_video.php | 60 + upload/admin_area/editor_pick.php | 55 + upload/admin_area/email_settings.php | 59 + upload/admin_area/flagged_collections.php | 90 + upload/admin_area/flagged_groups.php | 118 + upload/admin_area/flagged_photos.php | 91 + upload/admin_area/flagged_users.php | 117 + upload/admin_area/flagged_videos.php | 117 + upload/admin_area/group_category.php | 63 + upload/admin_area/groups_manager.php | 147 + upload/admin_area/index.php | 22 + upload/admin_area/lab_resources/echo.php | 3 + .../admin_area/lab_resources/experiments.php | 225 + upload/admin_area/language_settings.php | 121 + upload/admin_area/login.php | 50 + upload/admin_area/login_as_user.php | 27 + upload/admin_area/logo_change.php | 19 + upload/admin_area/logout.php | 5 + upload/admin_area/main.php | 298 + upload/admin_area/maintenance.php | 146 + upload/admin_area/manage_items.php | 94 + upload/admin_area/manage_pages.php | 127 + upload/admin_area/manage_players.php | 65 + upload/admin_area/mass_email.php | 76 + upload/admin_area/mass_uploader.php | 72 + upload/admin_area/members.php | 178 + upload/admin_area/module_manager.php | 17 + upload/admin_area/notification_settings.php | 40 + upload/admin_area/online_users.php | 31 + upload/admin_area/orphan_photos.php | 79 + upload/admin_area/photo_manager.php | 164 + upload/admin_area/photo_settings.php | 107 + upload/admin_area/phpinfo.php | 13 + upload/admin_area/plugin.php | 37 + upload/admin_area/plugin_manager.php | 117 + upload/admin_area/recreate_thumbs.php | 116 + upload/admin_area/reindex_cb.php | 232 + upload/admin_area/repair_vid_duration.php | 66 + upload/admin_area/reports.php | 40 + upload/admin_area/statistics.php | 17 + .../admin_area/styles/cbv2/images/alert.png | Bin 0 -> 827 bytes .../styles/cbv2/images/arrow_return.png | Bin 0 -> 3712 bytes .../cbv2/images/arrow_return_invert.png | Bin 0 -> 3746 bytes .../styles/cbv2/images/bgs/gr_bg.png | Bin 0 -> 324 bytes .../styles/cbv2/images/bgs/left_menu_head.png | Bin 0 -> 1588 bytes .../styles/cbv2/images/bgs/login.png | Bin 0 -> 515 bytes .../styles/cbv2/images/bgs/pagination_bg.png | Bin 0 -> 238 bytes .../styles/cbv2/images/bgs/round_bg.png | Bin 0 -> 2261 bytes upload/admin_area/styles/cbv2/images/bot.png | Bin 0 -> 520 bytes .../admin_area/styles/cbv2/images/botal.png | Bin 0 -> 2480 bytes .../styles/cbv2/images/browsers.png | Bin 0 -> 3607 bytes .../styles/cbv2/images/button_bg.png | Bin 0 -> 341 bytes .../styles/cbv2/images/button_ok.png | Bin 0 -> 1310 bytes .../styles/cbv2/images/catgory_toggler.png | Bin 0 -> 1242 bytes .../styles/cbv2/images/collapse.png | Bin 0 -> 310 bytes .../admin_area/styles/cbv2/images/cross.png | Bin 0 -> 3090 bytes upload/admin_area/styles/cbv2/images/dot.gif | Bin 0 -> 43 bytes .../admin_area/styles/cbv2/images/error.png | Bin 0 -> 1788 bytes .../styles/cbv2/images/gradients.png | Bin 0 -> 863 bytes .../styles/cbv2/images/headerafter.png | Bin 0 -> 158 bytes upload/admin_area/styles/cbv2/images/help.png | Bin 0 -> 3684 bytes .../admin_area/styles/cbv2/images/icons.png | Bin 0 -> 8889 bytes .../admin_area/styles/cbv2/images/loading.gif | Bin 0 -> 4426 bytes .../admin_area/styles/cbv2/images/login.png | Bin 0 -> 11410 bytes .../cbv2/images/nicEditIcons-latest.gif | Bin 0 -> 3696 bytes upload/admin_area/styles/cbv2/images/ok.png | Bin 0 -> 3148 bytes .../styles/cbv2/images/play_icon.png | Bin 0 -> 2272 bytes .../styles/cbv2/images/slide_toggle.png | Bin 0 -> 536 bytes .../styles/cbv2/images/slide_toggle_2.png | Bin 0 -> 130 bytes .../styles/cbv2/images/slide_toggle_3.png | Bin 0 -> 732 bytes upload/admin_area/styles/cbv2/images/tick.png | Bin 0 -> 883 bytes .../styles/cbv2/images/widget_item_border.gif | Bin 0 -> 45 bytes .../styles/cbv2/layout/_permission.html | 63 + .../styles/cbv2/layout/add_group.html | 66 + .../styles/cbv2/layout/add_members.html | 58 + .../styles/cbv2/layout/add_phrase.html | 48 + .../cbv2/layout/ads_add_placements.html | 79 + .../styles/cbv2/layout/ads_manager.html | 163 + .../styles/cbv2/layout/blocks/access_log.html | 10 + .../styles/cbv2/layout/blocks/comments.html | 50 + .../styles/cbv2/layout/blocks/edit_video.html | 194 + .../styles/cbv2/layout/blocks/pagination.html | 5 + .../admin_area/styles/cbv2/layout/body.html | 41 + .../styles/cbv2/layout/category.html | 179 + .../cbv2/layout/cb_conversion_queue.html | 66 + .../styles/cbv2/layout/cb_mod_check.html | 94 + .../cbv2/layout/collection_category.html | 167 + .../cbv2/layout/collection_manager.html | 160 + .../styles/cbv2/layout/comments.html | 151 + .../styles/cbv2/layout/conversion_lab.html | 86 + .../cbv2/layout/edit_announcemnent.html | 18 + .../styles/cbv2/layout/edit_collection.html | 135 + .../styles/cbv2/layout/edit_group.html | 108 + .../styles/cbv2/layout/edit_photo.html | 150 + .../styles/cbv2/layout/edit_video.html | 216 + .../styles/cbv2/layout/editor_pick.html | 71 + .../styles/cbv2/layout/email_settings.html | 102 + .../styles/cbv2/layout/flagged_groups.html | 148 + .../styles/cbv2/layout/flagged_photos.html | 105 + .../styles/cbv2/layout/flagged_users.html | 155 + .../styles/cbv2/layout/flagged_videos.html | 136 + .../admin_area/styles/cbv2/layout/footer.html | 7 + .../styles/cbv2/layout/global_header.html | 217 + .../styles/cbv2/layout/group_category.html | 158 + .../styles/cbv2/layout/groups_manager.html | 153 + .../admin_area/styles/cbv2/layout/header.html | 23 + .../admin_area/styles/cbv2/layout/index.html | 200 + .../styles/cbv2/layout/language_settings.html | 113 + .../styles/cbv2/layout/left_menu.html | 25 + .../admin_area/styles/cbv2/layout/login.html | 41 + .../admin_area/styles/cbv2/layout/main.html | 1188 ++++ .../styles/cbv2/layout/maintenance.html | 58 + .../styles/cbv2/layout/manage_items.html | 115 + .../styles/cbv2/layout/manage_pages.html | 197 + .../styles/cbv2/layout/manage_players.html | 278 + .../styles/cbv2/layout/mass_email.html | 229 + .../styles/cbv2/layout/mass_uploader.html | 50 + .../styles/cbv2/layout/members.html | 188 + upload/admin_area/styles/cbv2/layout/msg.html | 35 + .../cbv2/layout/notification_settings.html | 28 + .../styles/cbv2/layout/online_users.html | 33 + .../styles/cbv2/layout/orphan_photos.html | 78 + .../styles/cbv2/layout/photo_manager.html | 148 + .../styles/cbv2/layout/photo_settings.html | 224 + .../styles/cbv2/layout/plugin_manager.html | 153 + .../styles/cbv2/layout/recreate_thumbs.html | 246 + .../styles/cbv2/layout/reindex_cb.html | 91 + .../cbv2/layout/repair_vid_duration.html | 29 + .../styles/cbv2/layout/reports.html | 218 + .../styles/cbv2/layout/template_editor.html | 52 + .../styles/cbv2/layout/templates.html | 41 + .../styles/cbv2/layout/under_development.html | 1 + .../styles/cbv2/layout/upload_thumbs.html | 40 + .../styles/cbv2/layout/user_category.html | 160 + .../styles/cbv2/layout/user_levels.html | 231 + .../styles/cbv2/layout/video_manager.html | 179 + .../cbv2/layout/view_conversion_log.html | 77 + .../styles/cbv2/layout/view_user.html | 343 + .../styles/cbv2/layout/view_video.html | 203 + upload/admin_area/styles/cbv2/theme/cbtab.css | 36 + upload/admin_area/styles/cbv2/theme/main.css | 366 + .../styles/cbv2/theme/pagination.css | 17 + .../styles/cbv2/theme/slidemenu.css | 117 + upload/admin_area/template_editor.php | 117 + upload/admin_area/templates.php | 23 + upload/admin_area/upload_thumbs.php | 75 + upload/admin_area/user_category.php | 67 + upload/admin_area/user_levels.php | 86 + upload/admin_area/video_manager.php | 155 + upload/admin_area/view_conversion_log.php | 28 + upload/admin_area/view_lang_vars.php | 73 + upload/admin_area/view_user.php | 83 + upload/admin_area/view_video.php | 54 + upload/ajax.php | 1513 +++++ upload/api/auth.php | 132 + upload/api/file_uploader.php | 108 + upload/api/get.php | 676 ++ upload/api/global.php | 45 + upload/api/pm.php | 132 + upload/api/push.php | 87 + upload/api/put.php | 595 ++ upload/api/sample_getVideos.json | 73 + upload/api/search.php | 81 + upload/api/thumb-sample.php | 10 + upload/captcha.php | 12 + upload/cb_install/LICENSE | 47 + upload/cb_install/ajax.php | 322 + upload/cb_install/clipbucket.php | 19 + upload/cb_install/dbconnect.php | 39 + upload/cb_install/favicon.ico | Bin 0 -> 1150 bytes upload/cb_install/functions.js | 81 + upload/cb_install/functions.php | 291 + upload/cb_install/images/alert.png | Bin 0 -> 827 bytes upload/cb_install/images/bttncenter.png | Bin 0 -> 3651 bytes upload/cb_install/images/bttnleft.png | Bin 0 -> 1193 bytes upload/cb_install/images/bttnright.png | Bin 0 -> 1504 bytes upload/cb_install/images/bttnrightalt.png | Bin 0 -> 1237 bytes upload/cb_install/images/header_grad.png | Bin 0 -> 1001 bytes upload/cb_install/images/header_grad_line.png | Bin 0 -> 1007 bytes upload/cb_install/images/loading.gif | Bin 0 -> 8089 bytes upload/cb_install/images/tick.png | Bin 0 -> 883 bytes upload/cb_install/index.php | 40 + upload/cb_install/modes/adminsettings.php | 77 + upload/cb_install/modes/agreement.php | 10 + upload/cb_install/modes/body.php | 52 + upload/cb_install/modes/database.php | 53 + upload/cb_install/modes/dataimport.php | 47 + upload/cb_install/modes/finish.php | 72 + upload/cb_install/modes/finish_upgrade.php | 80 + upload/cb_install/modes/lock.php | 3 + upload/cb_install/modes/permission.php | 37 + upload/cb_install/modes/precheck.php | 35 + upload/cb_install/modes/register.php | 38 + upload/cb_install/modes/sitesettings.php | 47 + upload/cb_install/modes/upgrade.php | 16 + upload/cb_install/round_arrow_right.png | Bin 0 -> 5992 bytes upload/cb_install/sql/add_admin.sql | 7 + upload/cb_install/sql/ads_placements.sql | 9 + upload/cb_install/sql/categories.sql | 16 + upload/cb_install/sql/configs.sql | 248 + upload/cb_install/sql/countries.sql | 245 + upload/cb_install/sql/email_templates.sql | 19 + upload/cb_install/sql/import_categories.sql | 26 + upload/cb_install/sql/pages.sql | 19 + upload/cb_install/sql/structure.sql | 1116 ++++ upload/cb_install/sql/upgrade_2.0.5.sql | 30 + upload/cb_install/sql/upgrade_2.0.6.sql | 9 + upload/cb_install/sql/upgrade_2.0.7.sql | 8 + upload/cb_install/sql/upgrade_2.0.8.sql | 11 + upload/cb_install/sql/upgrade_2.0.9.sql | 8 + upload/cb_install/sql/upgrade_2.0.91.sql | 0 upload/cb_install/sql/upgrade_2.1.sql | 163 + upload/cb_install/sql/upgrade_2.2.sql | 23 + upload/cb_install/sql/upgrade_2.3.sql | 17 + upload/cb_install/sql/upgrade_2.4.5.sql | 96 + upload/cb_install/sql/upgrade_2.4.sql | 0 upload/cb_install/sql/upgrade_2.5.1.sql | 9 + upload/cb_install/sql/upgrade_2.5.sql | 0 upload/cb_install/sql/upgrade_2.6.sql | 64 + upload/cb_install/sql/upgrade_2.7.sql | 17 + upload/cb_install/sql/user_levels.sql | 88 + upload/cb_install/style.css | 110 + upload/cb_install/upgradeable.php | 37 + upload/channels.php | 83 + upload/collections.php | 91 + upload/contact.php | 61 + upload/create_group.php | 28 + upload/download.php | 46 + upload/download_photo.php | 29 + upload/edit_account.php | 126 + upload/edit_group.php | 54 + upload/edit_photo.php | 42 + upload/edit_video.php | 48 + upload/favicon.ico | Bin 0 -> 3262 bytes upload/files/.htaccess | 2 + upload/files/photos/no-photo_m.png | Bin 0 -> 4819 bytes upload/files/photos/no-photo_t.png | Bin 0 -> 4239 bytes upload/files/thumbs/processing.jpg | Bin 0 -> 4065 bytes upload/files/videos/no_video.flv | Bin 0 -> 119504 bytes upload/forgot.php | 53 + upload/groups.php | 71 + upload/images/avatars/no_avatar-small.jpg | Bin 0 -> 852 bytes upload/images/avatars/no_avatar-small.png | Bin 0 -> 1460 bytes upload/images/avatars/no_avatar.jpg | Bin 0 -> 2065 bytes upload/images/avatars/no_avatar.png | Bin 0 -> 3838 bytes upload/images/category_thumbs/no_thumb.jpg | Bin 0 -> 4293 bytes .../collection_thumbs/no_thumb-small.png | Bin 0 -> 2684 bytes upload/images/collection_thumbs/no_thumb.png | Bin 0 -> 3045 bytes .../images/groups_thumbs/no_thumb-small.png | Bin 0 -> 3278 bytes upload/images/groups_thumbs/no_thumb.png | Bin 0 -> 11024 bytes upload/images/icons/XPButton.png | Bin 0 -> 1855 bytes upload/images/icons/cb_powered.gif | Bin 0 -> 2359 bytes upload/images/icons/country/ac.png | Bin 0 -> 599 bytes upload/images/icons/country/ad.png | Bin 0 -> 643 bytes upload/images/icons/country/ae.png | Bin 0 -> 408 bytes upload/images/icons/country/af.png | Bin 0 -> 604 bytes upload/images/icons/country/ag.png | Bin 0 -> 591 bytes upload/images/icons/country/ai.png | Bin 0 -> 643 bytes upload/images/icons/country/al.png | Bin 0 -> 600 bytes upload/images/icons/country/am.png | Bin 0 -> 497 bytes upload/images/icons/country/an.png | Bin 0 -> 488 bytes upload/images/icons/country/ao.png | Bin 0 -> 428 bytes upload/images/icons/country/aq.png | Bin 0 -> 505 bytes upload/images/icons/country/ar.png | Bin 0 -> 506 bytes upload/images/icons/country/as.png | Bin 0 -> 647 bytes upload/images/icons/country/at.png | Bin 0 -> 403 bytes upload/images/icons/country/au.png | Bin 0 -> 673 bytes upload/images/icons/country/aw.png | Bin 0 -> 524 bytes upload/images/icons/country/ax.png | Bin 0 -> 663 bytes upload/images/icons/country/az.png | Bin 0 -> 589 bytes upload/images/icons/country/ba.png | Bin 0 -> 593 bytes upload/images/icons/country/bb.png | Bin 0 -> 585 bytes upload/images/icons/country/bd.png | Bin 0 -> 504 bytes upload/images/icons/country/be.png | Bin 0 -> 449 bytes upload/images/icons/country/bf.png | Bin 0 -> 497 bytes upload/images/icons/country/bg.png | Bin 0 -> 462 bytes upload/images/icons/country/bh.png | Bin 0 -> 457 bytes upload/images/icons/country/bi.png | Bin 0 -> 675 bytes upload/images/icons/country/bj.png | Bin 0 -> 486 bytes upload/images/icons/country/bm.png | Bin 0 -> 611 bytes upload/images/icons/country/bn.png | Bin 0 -> 639 bytes upload/images/icons/country/bo.png | Bin 0 -> 500 bytes upload/images/icons/country/br.png | Bin 0 -> 593 bytes upload/images/icons/country/bs.png | Bin 0 -> 526 bytes upload/images/icons/country/bt.png | Bin 0 -> 631 bytes upload/images/icons/country/bv.png | Bin 0 -> 512 bytes upload/images/icons/country/bw.png | Bin 0 -> 443 bytes upload/images/icons/country/by.png | Bin 0 -> 514 bytes upload/images/icons/country/bz.png | Bin 0 -> 600 bytes upload/images/icons/country/ca.png | Bin 0 -> 628 bytes upload/images/icons/country/cc.png | Bin 0 -> 625 bytes upload/images/icons/country/cd.png | Bin 0 -> 528 bytes upload/images/icons/country/cf.png | Bin 0 -> 614 bytes upload/images/icons/country/cg.png | Bin 0 -> 521 bytes upload/images/icons/country/ch.png | Bin 0 -> 367 bytes upload/images/icons/country/ci.png | Bin 0 -> 453 bytes upload/images/icons/country/ck.png | Bin 0 -> 586 bytes upload/images/icons/country/cl.png | Bin 0 -> 450 bytes upload/images/icons/country/cm.png | Bin 0 -> 525 bytes upload/images/icons/country/cn.png | Bin 0 -> 472 bytes upload/images/icons/country/co.png | Bin 0 -> 483 bytes upload/images/icons/country/cr.png | Bin 0 -> 477 bytes upload/images/icons/country/cu.png | Bin 0 -> 563 bytes upload/images/icons/country/cv.png | Bin 0 -> 529 bytes upload/images/icons/country/cx.png | Bin 0 -> 608 bytes upload/images/icons/country/cy.png | Bin 0 -> 428 bytes upload/images/icons/country/cz.png | Bin 0 -> 476 bytes upload/images/icons/country/de.png | Bin 0 -> 545 bytes upload/images/icons/country/dj.png | Bin 0 -> 572 bytes upload/images/icons/country/dk.png | Bin 0 -> 495 bytes upload/images/icons/country/dm.png | Bin 0 -> 620 bytes upload/images/icons/country/do.png | Bin 0 -> 508 bytes upload/images/icons/country/dz.png | Bin 0 -> 582 bytes upload/images/icons/country/ec.png | Bin 0 -> 500 bytes upload/images/icons/country/ee.png | Bin 0 -> 429 bytes upload/images/icons/country/eg.png | Bin 0 -> 465 bytes upload/images/icons/country/eh.png | Bin 0 -> 508 bytes upload/images/icons/country/er.png | Bin 0 -> 653 bytes upload/images/icons/country/es.png | Bin 0 -> 469 bytes upload/images/icons/country/et.png | Bin 0 -> 592 bytes upload/images/icons/country/fi.png | Bin 0 -> 489 bytes upload/images/icons/country/fj.png | Bin 0 -> 610 bytes upload/images/icons/country/fk.png | Bin 0 -> 648 bytes upload/images/icons/country/fm.png | Bin 0 -> 552 bytes upload/images/icons/country/fo.png | Bin 0 -> 474 bytes upload/images/icons/country/fr.png | Bin 0 -> 545 bytes upload/images/icons/country/ga.png | Bin 0 -> 489 bytes upload/images/icons/country/gb.png | Bin 0 -> 599 bytes upload/images/icons/country/gd.png | Bin 0 -> 637 bytes upload/images/icons/country/ge.png | Bin 0 -> 594 bytes upload/images/icons/country/gf.png | Bin 0 -> 545 bytes upload/images/icons/country/gg.png | Bin 0 -> 392 bytes upload/images/icons/country/gh.png | Bin 0 -> 490 bytes upload/images/icons/country/gi.png | Bin 0 -> 463 bytes upload/images/icons/country/gl.png | Bin 0 -> 470 bytes upload/images/icons/country/gm.png | Bin 0 -> 493 bytes upload/images/icons/country/gn.png | Bin 0 -> 480 bytes upload/images/icons/country/gp.png | Bin 0 -> 488 bytes upload/images/icons/country/gq.png | Bin 0 -> 537 bytes upload/images/icons/country/gr.png | Bin 0 -> 487 bytes upload/images/icons/country/gs.png | Bin 0 -> 630 bytes upload/images/icons/country/gt.png | Bin 0 -> 493 bytes upload/images/icons/country/gu.png | Bin 0 -> 509 bytes upload/images/icons/country/gw.png | Bin 0 -> 516 bytes upload/images/icons/country/gy.png | Bin 0 -> 645 bytes upload/images/icons/country/hk.png | Bin 0 -> 527 bytes upload/images/icons/country/hm.png | Bin 0 -> 673 bytes upload/images/icons/country/hn.png | Bin 0 -> 537 bytes upload/images/icons/country/hr.png | Bin 0 -> 524 bytes upload/images/icons/country/ht.png | Bin 0 -> 487 bytes upload/images/icons/country/hu.png | Bin 0 -> 432 bytes upload/images/icons/country/id.png | Bin 0 -> 430 bytes upload/images/icons/country/ie.png | Bin 0 -> 481 bytes upload/images/icons/country/il.png | Bin 0 -> 431 bytes upload/images/icons/country/im.png | Bin 0 -> 354 bytes upload/images/icons/country/in.png | Bin 0 -> 503 bytes upload/images/icons/country/io.png | Bin 0 -> 658 bytes upload/images/icons/country/iq.png | Bin 0 -> 515 bytes upload/images/icons/country/ir.png | Bin 0 -> 512 bytes upload/images/icons/country/is.png | Bin 0 -> 532 bytes upload/images/icons/country/it.png | Bin 0 -> 420 bytes upload/images/icons/country/je.png | Bin 0 -> 492 bytes upload/images/icons/country/jm.png | Bin 0 -> 637 bytes upload/images/icons/country/jo.png | Bin 0 -> 473 bytes upload/images/icons/country/jp.png | Bin 0 -> 420 bytes upload/images/icons/country/ke.png | Bin 0 -> 569 bytes upload/images/icons/country/kg.png | Bin 0 -> 510 bytes upload/images/icons/country/kh.png | Bin 0 -> 549 bytes upload/images/icons/country/ki.png | Bin 0 -> 656 bytes upload/images/icons/country/km.png | Bin 0 -> 577 bytes upload/images/icons/country/kn.png | Bin 0 -> 604 bytes upload/images/icons/country/kp.png | Bin 0 -> 561 bytes upload/images/icons/country/kr.png | Bin 0 -> 592 bytes upload/images/icons/country/kw.png | Bin 0 -> 486 bytes upload/images/icons/country/ky.png | Bin 0 -> 643 bytes upload/images/icons/country/kz.png | Bin 0 -> 616 bytes upload/images/icons/country/la.png | Bin 0 -> 563 bytes upload/images/icons/country/lb.png | Bin 0 -> 517 bytes upload/images/icons/country/lc.png | Bin 0 -> 520 bytes upload/images/icons/country/li.png | Bin 0 -> 537 bytes upload/images/icons/country/lk.png | Bin 0 -> 627 bytes upload/images/icons/country/lr.png | Bin 0 -> 466 bytes upload/images/icons/country/ls.png | Bin 0 -> 628 bytes upload/images/icons/country/lt.png | Bin 0 -> 508 bytes upload/images/icons/country/lu.png | Bin 0 -> 481 bytes upload/images/icons/country/lv.png | Bin 0 -> 465 bytes upload/images/icons/country/ly.png | Bin 0 -> 419 bytes upload/images/icons/country/ma.png | Bin 0 -> 432 bytes upload/images/icons/country/mc.png | Bin 0 -> 380 bytes upload/images/icons/country/md.png | Bin 0 -> 566 bytes upload/images/icons/country/me.png | Bin 0 -> 448 bytes upload/images/icons/country/mg.png | Bin 0 -> 453 bytes upload/images/icons/country/mh.png | Bin 0 -> 628 bytes upload/images/icons/country/mk.png | Bin 0 -> 664 bytes upload/images/icons/country/ml.png | Bin 0 -> 474 bytes upload/images/icons/country/mm.png | Bin 0 -> 483 bytes upload/images/icons/country/mn.png | Bin 0 -> 492 bytes upload/images/icons/country/mo.png | Bin 0 -> 588 bytes upload/images/icons/country/mp.png | Bin 0 -> 597 bytes upload/images/icons/country/mq.png | Bin 0 -> 655 bytes upload/images/icons/country/mr.png | Bin 0 -> 569 bytes upload/images/icons/country/ms.png | Bin 0 -> 614 bytes upload/images/icons/country/mt.png | Bin 0 -> 420 bytes upload/images/icons/country/mu.png | Bin 0 -> 496 bytes upload/images/icons/country/mv.png | Bin 0 -> 542 bytes upload/images/icons/country/mw.png | Bin 0 -> 529 bytes upload/images/icons/country/mx.png | Bin 0 -> 574 bytes upload/images/icons/country/my.png | Bin 0 -> 571 bytes upload/images/icons/country/mz.png | Bin 0 -> 584 bytes upload/images/icons/country/na.png | Bin 0 -> 647 bytes upload/images/icons/country/nc.png | Bin 0 -> 591 bytes upload/images/icons/country/ne.png | Bin 0 -> 537 bytes upload/images/icons/country/nf.png | Bin 0 -> 602 bytes upload/images/icons/country/ng.png | Bin 0 -> 482 bytes upload/images/icons/country/ni.png | Bin 0 -> 508 bytes upload/images/icons/country/nl.png | Bin 0 -> 453 bytes upload/images/icons/country/no.png | Bin 0 -> 512 bytes upload/images/icons/country/np.png | Bin 0 -> 443 bytes upload/images/icons/country/nr.png | Bin 0 -> 527 bytes upload/images/icons/country/nu.png | Bin 0 -> 572 bytes upload/images/icons/country/nz.png | Bin 0 -> 639 bytes upload/images/icons/country/om.png | Bin 0 -> 478 bytes upload/images/icons/country/pa.png | Bin 0 -> 519 bytes upload/images/icons/country/pe.png | Bin 0 -> 397 bytes upload/images/icons/country/pf.png | Bin 0 -> 498 bytes upload/images/icons/country/pg.png | Bin 0 -> 593 bytes upload/images/icons/country/ph.png | Bin 0 -> 538 bytes upload/images/icons/country/pk.png | Bin 0 -> 569 bytes upload/images/icons/country/pl.png | Bin 0 -> 374 bytes upload/images/icons/country/pm.png | Bin 0 -> 689 bytes upload/images/icons/country/pn.png | Bin 0 -> 657 bytes upload/images/icons/country/pr.png | Bin 0 -> 556 bytes upload/images/icons/country/ps.png | Bin 0 -> 472 bytes upload/images/icons/country/pt.png | Bin 0 -> 554 bytes upload/images/icons/country/pw.png | Bin 0 -> 550 bytes upload/images/icons/country/py.png | Bin 0 -> 473 bytes upload/images/icons/country/qa.png | Bin 0 -> 450 bytes upload/images/icons/country/re.png | Bin 0 -> 545 bytes upload/images/icons/country/ro.png | Bin 0 -> 495 bytes upload/images/icons/country/rs.png | Bin 0 -> 423 bytes upload/images/icons/country/ru.png | Bin 0 -> 420 bytes upload/images/icons/country/rw.png | Bin 0 -> 533 bytes upload/images/icons/country/sa.png | Bin 0 -> 551 bytes upload/images/icons/country/sb.png | Bin 0 -> 624 bytes upload/images/icons/country/sc.png | Bin 0 -> 608 bytes upload/images/icons/country/sd.png | Bin 0 -> 492 bytes upload/images/icons/country/se.png | Bin 0 -> 542 bytes upload/images/icons/country/sg.png | Bin 0 -> 468 bytes upload/images/icons/country/sh.png | Bin 0 -> 645 bytes upload/images/icons/country/si.png | Bin 0 -> 510 bytes upload/images/icons/country/sj.png | Bin 0 -> 512 bytes upload/images/icons/country/sk.png | Bin 0 -> 562 bytes upload/images/icons/country/sl.png | Bin 0 -> 436 bytes upload/images/icons/country/sm.png | Bin 0 -> 502 bytes upload/images/icons/country/sn.png | Bin 0 -> 532 bytes upload/images/icons/country/so.png | Bin 0 -> 527 bytes upload/images/icons/country/sr.png | Bin 0 -> 513 bytes upload/images/icons/country/st.png | Bin 0 -> 584 bytes upload/images/icons/country/sv.png | Bin 0 -> 501 bytes upload/images/icons/country/sy.png | Bin 0 -> 422 bytes upload/images/icons/country/sz.png | Bin 0 -> 643 bytes upload/images/icons/country/tc.png | Bin 0 -> 624 bytes upload/images/icons/country/td.png | Bin 0 -> 570 bytes upload/images/icons/country/tf.png | Bin 0 -> 527 bytes upload/images/icons/country/tg.png | Bin 0 -> 562 bytes upload/images/icons/country/th.png | Bin 0 -> 452 bytes upload/images/icons/country/tj.png | Bin 0 -> 496 bytes upload/images/icons/country/tk.png | Bin 0 -> 638 bytes upload/images/icons/country/tl.png | Bin 0 -> 514 bytes upload/images/icons/country/tm.png | Bin 0 -> 593 bytes upload/images/icons/country/tn.png | Bin 0 -> 495 bytes upload/images/icons/country/to.png | Bin 0 -> 426 bytes upload/images/icons/country/tr.png | Bin 0 -> 492 bytes upload/images/icons/country/tt.png | Bin 0 -> 617 bytes upload/images/icons/country/tv.png | Bin 0 -> 536 bytes upload/images/icons/country/tw.png | Bin 0 -> 465 bytes upload/images/icons/country/tz.png | Bin 0 -> 642 bytes upload/images/icons/country/ua.png | Bin 0 -> 446 bytes upload/images/icons/country/ug.png | Bin 0 -> 531 bytes upload/images/icons/country/uk.png | Bin 0 -> 599 bytes upload/images/icons/country/um.png | Bin 0 -> 571 bytes upload/images/icons/country/us.png | Bin 0 -> 609 bytes upload/images/icons/country/uy.png | Bin 0 -> 532 bytes upload/images/icons/country/uz.png | Bin 0 -> 515 bytes upload/images/icons/country/va.png | Bin 0 -> 553 bytes upload/images/icons/country/vc.png | Bin 0 -> 577 bytes upload/images/icons/country/ve.png | Bin 0 -> 528 bytes upload/images/icons/country/vg.png | Bin 0 -> 630 bytes upload/images/icons/country/vi.png | Bin 0 -> 616 bytes upload/images/icons/country/vn.png | Bin 0 -> 474 bytes upload/images/icons/country/vu.png | Bin 0 -> 604 bytes upload/images/icons/country/wf.png | Bin 0 -> 554 bytes upload/images/icons/country/ws.png | Bin 0 -> 476 bytes upload/images/icons/country/ye.png | Bin 0 -> 413 bytes upload/images/icons/country/yt.png | Bin 0 -> 593 bytes upload/images/icons/country/za.png | Bin 0 -> 642 bytes upload/images/icons/country/zm.png | Bin 0 -> 500 bytes upload/images/icons/country/zw.png | Bin 0 -> 574 bytes upload/images/icons/error.png | Bin 0 -> 666 bytes upload/images/icons/ico_lightsoff.gif | Bin 0 -> 1510 bytes upload/images/icons/info.png | Bin 0 -> 778 bytes upload/images/icons/no_thumb.png | Bin 0 -> 1961 bytes upload/images/icons/no_thumb_player.png | Bin 0 -> 1448 bytes upload/images/icons/no_thumb_template.png | Bin 0 -> 5695 bytes upload/images/icons/progIndicator.gif | Bin 0 -> 2209 bytes upload/images/icons/settings.gif | Bin 0 -> 405 bytes .../icons/topic_icons/award_star_silver_3.png | Bin 0 -> 1585 bytes upload/images/icons/topic_icons/bell.png | Bin 0 -> 2110 bytes upload/images/icons/topic_icons/book_open.png | Bin 0 -> 1211 bytes upload/images/icons/topic_icons/cake.png | Bin 0 -> 2066 bytes upload/images/icons/topic_icons/camera.png | Bin 0 -> 1548 bytes upload/images/icons/topic_icons/cart.png | Bin 0 -> 1459 bytes upload/images/icons/topic_icons/comment.png | Bin 0 -> 1185 bytes upload/images/icons/topic_icons/dot.gif | Bin 0 -> 43 bytes .../images/icons/topic_icons/emotion_grin.png | Bin 0 -> 2442 bytes .../icons/topic_icons/emotion_happy.png | Bin 0 -> 2350 bytes .../icons/topic_icons/emotion_smile.png | Bin 0 -> 2176 bytes .../icons/topic_icons/emotion_suprised.png | Bin 0 -> 2190 bytes .../icons/topic_icons/emotion_tongue.png | Bin 0 -> 2321 bytes .../images/icons/topic_icons/emotion_wink.png | Bin 0 -> 2162 bytes upload/images/icons/topic_icons/error.png | Bin 0 -> 1179 bytes upload/images/icons/topic_icons/newspaper.png | Bin 0 -> 1628 bytes .../images/icons/topic_icons/television.png | Bin 0 -> 1473 bytes upload/images/logo.png | Bin 0 -> 5904 bytes upload/includes/.htaccess | 0 upload/includes/active.php | 32 + upload/includes/admin.functions.php | 28 + upload/includes/admin_config.php | 78 + upload/includes/adminfunctions.php | 14 + .../adodb/adodb-active-record.inc.php | 626 ++ upload/includes/adodb/adodb-csvlib.inc.php | 312 + upload/includes/adodb/adodb-datadict.inc.php | 997 +++ upload/includes/adodb/adodb-error.inc.php | 258 + .../includes/adodb/adodb-errorhandler.inc.php | 79 + upload/includes/adodb/adodb-errorpear.inc.php | 88 + .../includes/adodb/adodb-exceptions.inc.php | 82 + upload/includes/adodb/adodb-iterator.inc.php | 85 + upload/includes/adodb/adodb-lib.inc.php | 1174 ++++ .../includes/adodb/adodb-memcache.lib.inc.php | 118 + upload/includes/adodb/adodb-pager.inc.php | 290 + upload/includes/adodb/adodb-pear.inc.php | 374 ++ upload/includes/adodb/adodb-perf.inc.php | 1079 +++ upload/includes/adodb/adodb-php4.inc.php | 16 + upload/includes/adodb/adodb-time.inc.php | 1409 ++++ upload/includes/adodb/adodb.inc.php | 4244 ++++++++++++ upload/includes/adodb/adodb.php | 7 + .../adodb/drivers/adodb-mysql.inc.php | 1089 +++ upload/includes/adodb/index.php | 3 + upload/includes/adodb/pivottable.inc.php | 187 + upload/includes/adodb/rsfilter.inc.php | 61 + upload/includes/adodb/server.php | 100 + upload/includes/adodb/toexport.inc.php | 133 + upload/includes/adodb/tohtml.inc.php | 195 + upload/includes/adodb/xmlschema.dtd | 39 + upload/includes/adodb/xmlschema03.dtd | 43 + upload/includes/classes/ClipBucket.class.php | 701 ++ upload/includes/classes/Services_JSON.php | 807 +++ upload/includes/classes/actions.class.php | 664 ++ upload/includes/classes/ads.class.php | 315 + upload/includes/classes/calcdate.class.php | 28 + .../includes/classes/captcha/class.files.php | 116 + .../classes/captcha/class.img_validator.php | 325 + upload/includes/classes/captcha/img.php | 12 + upload/includes/classes/captcha/img/bg1.jpg | Bin 0 -> 3801 bytes upload/includes/classes/captcha/img/bg2.jpg | Bin 0 -> 2558 bytes upload/includes/classes/captcha/img/bg3.jpg | Bin 0 -> 2348 bytes upload/includes/classes/captcha/img/bg4.jpg | Bin 0 -> 2014 bytes .../classes/captcha/img/fonts/arial.ttf | Bin 0 -> 367112 bytes .../classes/captcha/img/fonts/comicbd.ttf | Bin 0 -> 111476 bytes .../classes/captcha/img/fonts/impact.ttf | Bin 0 -> 136076 bytes .../classes/captcha/img/fonts/monofont.ttf | Bin 0 -> 41036 bytes .../classes/captcha/img/fonts/verdana.ttf | Bin 0 -> 171792 bytes upload/includes/classes/captcha/index.php | 3 + .../includes/classes/captcha_simple.img.php | 86 + upload/includes/classes/category.class.php | 866 +++ upload/includes/classes/cbemail.class.php | 382 ++ upload/includes/classes/cbfeeds.class.php | 391 ++ upload/includes/classes/cbpage.class.php | 260 + upload/includes/classes/collections.class.php | 1876 ++++++ .../classes/conversion/ffmpeg.class.php | 1233 ++++ upload/includes/classes/curl/class.curl.php | 547 ++ .../includes/classes/errorhandler.class.php | 148 + upload/includes/classes/form.class.php | 445 ++ upload/includes/classes/gravatar.class.php | 191 + upload/includes/classes/groups.class.php | 2395 +++++++ upload/includes/classes/image.class.php | 74 + upload/includes/classes/index.php | 3 + upload/includes/classes/lang.class.php | 500 ++ upload/includes/classes/log.class.php | 92 + upload/includes/classes/mass_upload.class.php | 113 + upload/includes/classes/menuhandler.class.php | 204 + upload/includes/classes/my_queries.class.php | 1069 +++ upload/includes/classes/objects.class.php | 66 + upload/includes/classes/pages.class.php | 386 ++ upload/includes/classes/photos.class.php | 2598 ++++++++ .../classes/phpmailer/class.phpmailer.php | 2326 +++++++ .../includes/classes/phpmailer/class.smtp.php | 814 +++ upload/includes/classes/player.class.php | 213 + upload/includes/classes/playlist.class.php | 23 + upload/includes/classes/plugin.class.php | 393 ++ upload/includes/classes/pm.class.php | 669 ++ upload/includes/classes/reindex.class.php | 443 ++ upload/includes/classes/search.class.php | 443 ++ upload/includes/classes/session.class.php | 255 + upload/includes/classes/signup.class.php | 32 + upload/includes/classes/swfObj.class.php | 102 + upload/includes/classes/sysinfo.class.php | 272 + upload/includes/classes/template.class.php | 306 + upload/includes/classes/upload.class.php | 1153 ++++ upload/includes/classes/user.class.php | 5200 +++++++++++++++ upload/includes/classes/video.class.php | 1732 +++++ upload/includes/clipbucket.php | 19 + upload/includes/common.php | 639 ++ upload/includes/config.inc.php | 59 + upload/includes/configs/index.php | 3 + upload/includes/conversion.conf.php | 172 + upload/includes/dbconnect.php | 40 + upload/includes/define_php_links.php | 67 + upload/includes/defined_links.php | 78 + .../activation_request.header.php | 5 + .../activation_request.template.php | 14 + .../email_templates/email_verify.header.php | 5 + .../email_templates/email_verify.template.php | 21 + upload/includes/email_templates/index.php | 3 + .../email_templates/share_video.header.php | 5 + .../email_templates/share_video.template.php | 78 + .../email_templates/template_writer.php | 105 + .../welcome_message.header.php | 5 + .../welcome_message.template.php | 17 + .../welcome_messege.header.php | 5 + .../welcome_messege.template.php | 17 + upload/includes/flv_player.php | 8 + upload/includes/functions.php | 5938 +++++++++++++++++ upload/includes/functions_db.php | 133 + upload/includes/index.php | 3 + upload/includes/langs/en.lang | 1 + upload/includes/languages.php | 25 + upload/includes/modules.php | 115 + upload/includes/plugin.functions.php | 519 ++ upload/includes/plugins.php | 84 + upload/includes/plugins_functions.php | 204 + .../templatelib/Config_File.class.php | 389 ++ .../includes/templatelib/Template.class.php | 1944 ++++++ .../templatelib/Template_Compiler.class.php | 2327 +++++++ upload/includes/templatelib/debug.tpl | 157 + upload/includes/templatelib/footer.html | 11 + upload/includes/templatelib/header.html | 1 + upload/includes/templatelib/index.php | 3 + .../core.assemble_plugin_filepath.php | 67 + .../core.assign_smarty_interface.php | 43 + .../internals/core.create_dir_structure.php | 79 + .../internals/core.display_debug_console.php | 61 + .../internals/core.get_include_path.php | 44 + .../internals/core.get_microtime.php | 23 + .../internals/core.get_php_resource.php | 80 + .../templatelib/internals/core.is_secure.php | 59 + .../templatelib/internals/core.is_trusted.php | 47 + .../internals/core.load_plugins.php | 125 + .../internals/core.load_resource_plugin.php | 74 + .../internals/core.process_cached_inserts.php | 71 + .../core.process_compiled_include.php | 37 + .../internals/core.read_cache_file.php | 101 + .../templatelib/internals/core.rm_auto.php | 71 + .../templatelib/internals/core.rmdir.php | 54 + .../internals/core.run_insert_handler.php | 71 + .../internals/core.smarty_include_php.php | 50 + .../internals/core.write_cache_file.php | 96 + .../internals/core.write_compiled_include.php | 91 + .../core.write_compiled_resource.php | 35 + .../templatelib/internals/core.write_file.php | 54 + .../templatelib/plugins/block.textformat.php | 103 + .../templatelib/plugins/compiler.assign.php | 46 + .../plugins/function.assign_debug_info.php | 40 + .../plugins/function.config_load.php | 142 + .../templatelib/plugins/function.counter.php | 80 + .../templatelib/plugins/function.cycle.php | 102 + .../templatelib/plugins/function.debug.php | 35 + .../templatelib/plugins/function.eval.php | 49 + .../templatelib/plugins/function.fetch.php | 221 + .../plugins/function.html_checkboxes.php | 143 + .../plugins/function.html_image.php | 142 + .../plugins/function.html_options.php | 122 + .../plugins/function.html_radios.php | 156 + .../plugins/function.html_select_date.php | 331 + .../plugins/function.html_select_time.php | 194 + .../plugins/function.html_table.php | 177 + .../templatelib/plugins/function.mailto.php | 165 + .../templatelib/plugins/function.math.php | 84 + .../templatelib/plugins/function.popup.php | 119 + .../plugins/function.popup_init.php | 40 + .../plugins/modifier.capitalize.php | 43 + .../templatelib/plugins/modifier.cat.php | 33 + .../plugins/modifier.count_characters.php | 32 + .../plugins/modifier.count_paragraphs.php | 29 + .../plugins/modifier.count_sentences.php | 29 + .../plugins/modifier.count_words.php | 33 + .../plugins/modifier.date_format.php | 67 + .../plugins/modifier.debug_print_var.php | 90 + .../templatelib/plugins/modifier.default.php | 32 + .../templatelib/plugins/modifier.escape.php | 93 + .../templatelib/plugins/modifier.indent.php | 28 + .../templatelib/plugins/modifier.lower.php | 26 + .../templatelib/plugins/modifier.nl2br.php | 35 + .../plugins/modifier.regex_replace.php | 35 + .../templatelib/plugins/modifier.replace.php | 30 + .../templatelib/plugins/modifier.spacify.php | 30 + .../plugins/modifier.string_format.php | 29 + .../templatelib/plugins/modifier.strip.php | 33 + .../plugins/modifier.strip_tags.php | 32 + .../templatelib/plugins/modifier.truncate.php | 50 + .../templatelib/plugins/modifier.upper.php | 26 + .../templatelib/plugins/modifier.wordwrap.php | 29 + .../plugins/outputfilter.trimwhitespace.php | 75 + .../plugins/shared.escape_special_chars.php | 31 + .../plugins/shared.make_timestamp.php | 46 + upload/includes/upload_forms.php | 53 + upload/includes/whois/whois.php | 120 + upload/index.php | 25 + upload/invite_group.php | 44 + upload/js/admin_functions.js | 137 + upload/js/embed_video_mod/functions.js | 32 + upload/js/functions.js | 1600 +++++ upload/js/jquery.js | 16 + upload/js/jquery_plugs/ZeroClipboard.swf | Bin 0 -> 1071 bytes upload/js/jquery_plugs/cb.tabs.js | 28 + upload/js/jquery_plugs/chili-1.7.pack.js | 1 + .../jquery_plugs/compressed/datepicker.js.php | 901 +++ upload/js/jquery_plugs/compressed/eye.js | 1 + .../jquery_plugs/compressed/hover_intent.js | 1 + .../js/jquery_plugs/compressed/jeditable.js | 37 + .../compressed/jquery.jCarousel.js | 15 + .../compressed/jquery.scrollTo-min.js | 11 + upload/js/jquery_plugs/compressed/layout.js | 1 + upload/js/jquery_plugs/compressed/utils.js | 1 + upload/js/jquery_plugs/cookie.js | 41 + upload/js/jquery_plugs/counter.min.js | 17 + upload/js/jquery_plugs/css/bg.gif | Bin 0 -> 1175 bytes upload/js/jquery_plugs/css/image.png | Bin 0 -> 11172 bytes upload/js/jquery_plugs/css/jquery.tooltip.css | 8 + upload/js/jquery_plugs/css/karte.png | Bin 0 -> 28245 bytes upload/js/jquery_plugs/css/screen.css | 48 + upload/js/jquery_plugs/css/shadow.png | Bin 0 -> 4648 bytes .../js/jquery_plugs/css/shadow2-reverse.png | Bin 0 -> 5025 bytes upload/js/jquery_plugs/css/shadow2.png | Bin 0 -> 5351 bytes upload/js/jquery_plugs/css/tipsy.css | 7 + upload/js/jquery_plugs/css/tipsy.gif | Bin 0 -> 867 bytes upload/js/jquery_plugs/datepicker.js | 891 +++ upload/js/jquery_plugs/eye.js | 34 + upload/js/jquery_plugs/hover_intent.js | 9 + upload/js/jquery_plugs/jquery.bgiframe.js | 104 + upload/js/jquery_plugs/jquery.delegate.js | 56 + upload/js/jquery_plugs/jquery.dimensions.js | 504 ++ upload/js/jquery_plugs/jquery.tipsy.js | 83 + upload/js/jquery_plugs/jquery.tooltip.pack.js | 15 + upload/js/jquery_plugs/layout.js | 49 + upload/js/jquery_plugs/timer.js | 138 + upload/js/jquery_plugs/utils.js | 252 + upload/js/nicedit/nicEdit.js | 127 + upload/js/nicedit/nicEditorIcons.gif | Bin 0 -> 3716 bytes upload/js/slidemenu.js | 371 + upload/js/swfobj.js.php | 83 + upload/js/swfobject.js | 4 + upload/js/swfobject.obj.js | 8 + .../ui-bg_diagonals-thick_18_b81900_40x40.png | Bin 0 -> 260 bytes .../ui-bg_diagonals-thick_20_666666_40x40.png | Bin 0 -> 251 bytes .../images/ui-bg_flat_10_000000_40x100.png | Bin 0 -> 178 bytes .../images/ui-bg_flat_55_0099cc_40x100.png | Bin 0 -> 181 bytes .../images/ui-bg_flat_55_999999_40x100.png | Bin 0 -> 180 bytes .../images/ui-bg_flat_75_aaaaaa_40x100.png | Bin 0 -> 180 bytes .../images/ui-bg_glass_100_f6f6f6_1x400.png | Bin 0 -> 104 bytes .../images/ui-bg_glass_100_fdf5ce_1x400.png | Bin 0 -> 125 bytes .../images/ui-bg_glass_45_0078ae_1x400.png | Bin 0 -> 136 bytes .../images/ui-bg_glass_65_ffffff_1x400.png | Bin 0 -> 105 bytes .../images/ui-bg_glass_75_79c9ec_1x400.png | Bin 0 -> 132 bytes .../ui-bg_gloss-wave_35_f6a828_500x100.png | Bin 0 -> 3762 bytes .../ui-bg_gloss-wave_45_e14f1c_500x100.png | Bin 0 -> 3649 bytes .../ui-bg_gloss-wave_75_2191c0_500x100.png | Bin 0 -> 3457 bytes .../ui-bg_highlight-soft_100_eeeeee_1x100.png | Bin 0 -> 90 bytes .../ui-bg_highlight-soft_50_333333_1x100.png | Bin 0 -> 118 bytes .../ui-bg_highlight-soft_75_ffe45c_1x100.png | Bin 0 -> 129 bytes .../ui-bg_inset-hard_100_fcfdfd_1x100.png | Bin 0 -> 88 bytes .../images/ui-icons_0078ae_256x240.png | Bin 0 -> 4369 bytes .../images/ui-icons_056b93_256x240.png | Bin 0 -> 5355 bytes .../images/ui-icons_222222_256x240.png | Bin 0 -> 4369 bytes .../images/ui-icons_228ef1_256x240.png | Bin 0 -> 4369 bytes .../images/ui-icons_292724_256x240.png | Bin 0 -> 4369 bytes .../images/ui-icons_75e5f5_256x240.png | Bin 0 -> 4369 bytes .../images/ui-icons_d8e7f3_256x240.png | Bin 0 -> 4369 bytes .../images/ui-icons_e0fdff_256x240.png | Bin 0 -> 4369 bytes .../images/ui-icons_ef8c08_256x240.png | Bin 0 -> 4369 bytes .../images/ui-icons_fcd113_256x240.png | Bin 0 -> 4369 bytes .../images/ui-icons_ffd27a_256x240.png | Bin 0 -> 4369 bytes .../images/ui-icons_ffffff_256x240.png | Bin 0 -> 4369 bytes .../ui-lightness/jquery-ui-1.7.2.custom.css | 406 ++ upload/js/ui/jquery-ui-1.7.2.custom.min.js | 298 + upload/js/ui/jquery-ui.js | 406 ++ .../js/uploadify/jquery.uploadify.v2.1.4.js | 313 + .../uploadify/jquery.uploadify.v2.1.4.min.js | 26 + upload/js/uploadify/swfobject.js | 4 + upload/js/uploadify/uploadify.allglyphs.swf | Bin 0 -> 36521 bytes upload/js/uploadify/uploadify.css | 50 + upload/js/uploadify/uploadify.swf | Bin 0 -> 22894 bytes upload/logout.php | 6 + upload/manage_collections.php | 195 + upload/manage_contacts.php | 51 + upload/manage_groups.php | 225 + upload/manage_photos.php | 189 + upload/manage_playlists.php | 149 + upload/manage_videos.php | 138 + upload/module.php | 26 + upload/myaccount.php | 19 + upload/opensearch.php | 21 + upload/photo_upload.php | 52 + upload/photos.php | 74 + upload/player/cbplayer/cbplayer.html | 114 + upload/player/cbplayer/cbplayer.js | 1 + upload/player/cbplayer/cbplayer.php | 177 + upload/player/cbplayer/cbplayer.plugin.php | 4 + upload/player/cbplayer/cbplayer_header.html | 1 + upload/player/cbplayer/embed_player.php | 104 + upload/player/cbplayer/player.swf | Bin 0 -> 105207 bytes upload/player/cbplayer/plugins/hd.swf | Bin 0 -> 5445 bytes .../cbplayer/plugins/related/related.js | 1 + .../cbplayer/plugins/related/related.swf | Bin 0 -> 10868 bytes .../cbplayer/plugins/related/related.xml | 31 + .../plugins/related/related_videos.php | 28 + upload/player/cbplayer/preview.jpg | Bin 0 -> 7286 bytes .../skins/glow/controlbar/background.png | Bin 0 -> 139 bytes .../skins/glow/controlbar/blankButton.png | Bin 0 -> 82 bytes .../skins/glow/controlbar/divider.png | Bin 0 -> 118 bytes .../glow/controlbar/fullscreenButton.png | Bin 0 -> 203 bytes .../glow/controlbar/fullscreenButtonOver.png | Bin 0 -> 636 bytes .../skins/glow/controlbar/muteButton.png | Bin 0 -> 343 bytes .../skins/glow/controlbar/muteButtonOver.png | Bin 0 -> 835 bytes .../glow/controlbar/normalscreenButton.png | Bin 0 -> 210 bytes .../controlbar/normalscreenButtonOver.png | Bin 0 -> 664 bytes .../skins/glow/controlbar/pauseButton.png | Bin 0 -> 170 bytes .../skins/glow/controlbar/pauseButtonOver.png | Bin 0 -> 442 bytes .../skins/glow/controlbar/playButton.png | Bin 0 -> 251 bytes .../skins/glow/controlbar/playButtonOver.png | Bin 0 -> 553 bytes .../glow/controlbar/timeSliderBuffer.png | Bin 0 -> 112 bytes .../glow/controlbar/timeSliderCapLeft.png | Bin 0 -> 94 bytes .../glow/controlbar/timeSliderCapRight.png | Bin 0 -> 103 bytes .../glow/controlbar/timeSliderProgress.png | Bin 0 -> 114 bytes .../skins/glow/controlbar/timeSliderRail.png | Bin 0 -> 116 bytes .../skins/glow/controlbar/unmuteButton.png | Bin 0 -> 264 bytes .../glow/controlbar/unmuteButtonOver.png | Bin 0 -> 649 bytes .../glow/controlbar/volumeSliderBuffer.png | Bin 0 -> 216 bytes .../glow/controlbar/volumeSliderProgress.png | Bin 0 -> 210 bytes .../glow/controlbar/volumeSliderRail.png | Bin 0 -> 342 bytes .../skins/glow/display/background.png | Bin 0 -> 686 bytes .../skins/glow/display/bufferIcon.png | Bin 0 -> 816 bytes .../cbplayer/skins/glow/display/muteIcon.png | Bin 0 -> 334 bytes .../cbplayer/skins/glow/display/playIcon.png | Bin 0 -> 465 bytes .../cbplayer/skins/glow/dock/button.png | Bin 0 -> 686 bytes upload/player/cbplayer/skins/glow/glow.xml | 115 + .../cbplayer/skins/glow/playlist/item.png | Bin 0 -> 172 bytes .../cbplayer/skins/glow/playlist/itemOver.png | Bin 0 -> 171 bytes .../skins/glow/playlist/sliderCapBottom.png | Bin 0 -> 108 bytes .../skins/glow/playlist/sliderCapTop.png | Bin 0 -> 105 bytes .../skins/glow/playlist/sliderRail.png | Bin 0 -> 100 bytes .../skins/glow/playlist/sliderThumb.png | Bin 0 -> 97 bytes .../skins/glow/sharing/embedScreen.png | Bin 0 -> 2579 bytes .../skins/glow/sharing/shareScreen.png | Bin 0 -> 7337 bytes upload/player/embed_player.php | 57 + upload/player/logo.png | Bin 0 -> 5904 bytes upload/player/open-flash-chart.swf | Bin 0 -> 276186 bytes upload/player/pak_player/PakPlayer.png | Bin 0 -> 14627 bytes upload/player/pak_player/bg.png | Bin 0 -> 983 bytes upload/player/pak_player/embed_player.php | 134 + upload/player/pak_player/pak_player.php | 172 + .../player/pak_player/pakplayer.controls.swf | Bin 0 -> 33651 bytes upload/player/pak_player/pakplayer.pseudo.swf | Bin 0 -> 170723 bytes upload/player/pak_player/pakplayer.swf | Bin 0 -> 120510 bytes .../player/pak_player/pakplayer.unlimited.swf | Bin 0 -> 123259 bytes .../player/pak_player/pakplayer.youtube.swf | Bin 0 -> 10469 bytes upload/player/pak_player/play.png | Bin 0 -> 5246 bytes upload/player/pak_player/player.html | 170 + upload/player/pak_player/pplayer.js | 1 + upload/player/pak_player/pplayer_head.html | 2 + upload/player/pak_player/preview.png | Bin 0 -> 3890 bytes upload/player/player.html | 8 + upload/plugins/cb_bbcodes/cb_bbcode.php | 58 + upload/plugins/cb_bbcodes/images/bold.gif | Bin 0 -> 567 bytes upload/plugins/cb_bbcodes/images/code.gif | Bin 0 -> 552 bytes upload/plugins/cb_bbcodes/images/italic.gif | Bin 0 -> 305 bytes upload/plugins/cb_bbcodes/images/link.gif | Bin 0 -> 659 bytes upload/plugins/cb_bbcodes/images/ordered.gif | Bin 0 -> 621 bytes upload/plugins/cb_bbcodes/images/picture.gif | Bin 0 -> 700 bytes upload/plugins/cb_bbcodes/images/quote.gif | Bin 0 -> 300 bytes .../plugins/cb_bbcodes/images/underline.gif | Bin 0 -> 347 bytes upload/plugins/cb_bbcodes/images/unlink.gif | Bin 0 -> 640 bytes upload/plugins/cb_bbcodes/styles.css | 22 + .../plugins/cb_link_video/cb_link_video.php | 247 + upload/plugins/cb_link_video/form.html | 100 + upload/plugins/cb_link_video/header.html | 42 + .../cb_link_video/install_cb_link_video.php | 17 + .../cb_link_video/uninstall_cb_link_video.php | 13 + upload/plugins/cb_modules/cb_modules.php | 36 + upload/plugins/cb_modules/css.html | 3 + .../images/social_icons/blogger.png | Bin 0 -> 2119 bytes .../images/social_icons/delicious.png | Bin 0 -> 4460 bytes .../cb_modules/images/social_icons/digg.png | Bin 0 -> 5089 bytes .../images/social_icons/facebook.png | Bin 0 -> 4884 bytes .../cb_modules/images/social_icons/heart.png | Bin 0 -> 2189 bytes .../images/social_icons/myspace.png | Bin 0 -> 4869 bytes .../cb_modules/images/social_icons/reddit.png | Bin 0 -> 5324 bytes .../images/social_icons/stumbleupon.png | Bin 0 -> 5293 bytes .../images/social_icons/technorati.png | Bin 0 -> 4934 bytes .../images/social_icons/twitter.png | Bin 0 -> 5039 bytes .../images/social_icons/wordpress.png | Bin 0 -> 2286 bytes .../cb_modules/images/social_icons/yahoo.png | Bin 0 -> 2241 bytes upload/plugins/character_counter.php | 45 + .../clipbucket_helper/admin/cron_jobs.html | 53 + .../clipbucket_helper/admin/cron_jobs.php | 4 + .../clipbucket_helper/clipbucket_helper.php | 41 + upload/plugins/comment_censor.php | 44 + .../plugins/custom_fields/custom_fields.php | 90 + .../custom_fields/install_custom_fields.php | 48 + .../custom_fields/uninstall_custom_fields.php | 15 + upload/plugins/editors_pick/editors_picks.php | 231 + upload/plugins/editors_pick/get_ep_video.php | 30 + upload/plugins/editors_pick/header.html | 1 + .../editors_pick/install_editors_picks.php | 27 + .../editors_pick/uninstall_editors_picks.php | 12 + .../embed_video_mod/embed_video_mod.php | 366 + upload/plugins/embed_video_mod/form.html | 100 + upload/plugins/embed_video_mod/header.html | 1 + .../install_embed_video_mod.php | 18 + .../uninstall_embed_video_mod.php | 14 + .../global_announcement.php | 44 + .../install_global_announcement.php | 23 + .../uninstall_global_announcement.php | 12 + upload/plugins/pakplayer/admin/pakplayer.html | 40 + upload/plugins/pakplayer/admin/pakplayer.php | 50 + upload/plugins/pakplayer/header.html | 22 + .../plugins/pakplayer/install_pakplayer.php | 6 + upload/plugins/pakplayer/pakplayer.php | 13 + .../plugins/pakplayer/uninstall_pakplayer.php | 3 + upload/plugins/recaptcha/captcha.html | 0 .../plugins/recaptcha/install_recaptcha.php | 8 + .../plugins/recaptcha/reCaptcha_header.html | 9 + upload/plugins/recaptcha/recaptcha.php | 48 + upload/plugins/recaptcha/recaptchalib.php | 278 + .../plugins/recaptcha/uninstall_recaptcha.php | 8 + upload/plugins/signup_captcha/captcha.php | 10 + .../signup_captcha/captcha/class.files.php | 116 + .../captcha/class.img_validator.php | 329 + .../captcha/class.img_validator.php.bak | 330 + .../plugins/signup_captcha/captcha/index.php | 3 + upload/plugins/signup_captcha/img/bg1.jpg | Bin 0 -> 3801 bytes upload/plugins/signup_captcha/img/bg2.jpg | Bin 0 -> 2558 bytes upload/plugins/signup_captcha/img/bg3.jpg | Bin 0 -> 2348 bytes upload/plugins/signup_captcha/img/bg4.jpg | Bin 0 -> 2014 bytes .../signup_captcha/img/fonts/arial.ttf | Bin 0 -> 367112 bytes .../signup_captcha/img/fonts/comicbd.ttf | Bin 0 -> 111476 bytes .../signup_captcha/img/fonts/impact.ttf | Bin 0 -> 136076 bytes .../signup_captcha/img/fonts/monofont.ttf | Bin 0 -> 41036 bytes .../signup_captcha/img/fonts/verdana.ttf | Bin 0 -> 171792 bytes .../plugins/signup_captcha/signup_captcha.php | 50 + upload/privacy.php | 16 + upload/private_message.php | 169 + upload/readme | 1 + upload/rss.php | 140 + upload/search_result.php | 82 + upload/signup.php | 79 + upload/sitemap.php | 64 + upload/styles/.htaccess | 4 + .../styles/cbv2new/images/ajax-loader-big.gif | Bin 0 -> 2463 bytes upload/styles/cbv2new/images/ajax-loader.gif | Bin 0 -> 1482 bytes upload/styles/cbv2new/images/alert.png | Bin 0 -> 3080 bytes upload/styles/cbv2new/images/big_stars.png | Bin 0 -> 1734 bytes upload/styles/cbv2new/images/blocks.png | Bin 0 -> 20226 bytes upload/styles/cbv2new/images/buttons.png | Bin 0 -> 2188 bytes upload/styles/cbv2new/images/cancel.png | Bin 0 -> 727 bytes .../styles/cbv2new/images/cancel_upload.png | Bin 0 -> 2960 bytes .../cbv2new/images/category_buttons.png | Bin 0 -> 1274 bytes upload/styles/cbv2new/images/cb_button.png | Bin 0 -> 1510 bytes upload/styles/cbv2new/images/clean.png | Bin 0 -> 3056 bytes upload/styles/cbv2new/images/cross.png | Bin 0 -> 1611 bytes upload/styles/cbv2new/images/dot.gif | Bin 0 -> 43 bytes upload/styles/cbv2new/images/dow.png | Bin 0 -> 1272 bytes upload/styles/cbv2new/images/down.png | Bin 0 -> 1204 bytes upload/styles/cbv2new/images/error.png | Bin 0 -> 603 bytes upload/styles/cbv2new/images/feature_bg.png | Bin 0 -> 540 bytes upload/styles/cbv2new/images/foot_search.png | Bin 0 -> 187 bytes upload/styles/cbv2new/images/forget.png | Bin 0 -> 1993 bytes upload/styles/cbv2new/images/gradients.png | Bin 0 -> 376 bytes upload/styles/cbv2new/images/group/add.png | Bin 0 -> 331 bytes upload/styles/cbv2new/images/hq.png | Bin 0 -> 1617 bytes upload/styles/cbv2new/images/icon.png | Bin 0 -> 3544 bytes upload/styles/cbv2new/images/icons.png | Bin 0 -> 9044 bytes .../cbv2new/images/icons/balloon-small.png | Bin 0 -> 472 bytes .../cbv2new/images/icons/balloons-box.png | Bin 0 -> 566 bytes .../cbv2new/images/icons/black-user.png | Bin 0 -> 511 bytes .../cbv2new/images/icons/blue-document.png | Bin 0 -> 519 bytes .../styles/cbv2new/images/icons/calender.png | Bin 0 -> 620 bytes .../styles/cbv2new/images/icons/camcorder.png | Bin 0 -> 590 bytes .../cbv2new/images/icons/collection.png | Bin 0 -> 413 bytes .../styles/cbv2new/images/icons/comment.png | Bin 0 -> 1537 bytes .../cbv2new/images/icons/comments_small.png | Bin 0 -> 1657 bytes upload/styles/cbv2new/images/icons/cross.png | Bin 0 -> 3426 bytes upload/styles/cbv2new/images/icons/delete.png | Bin 0 -> 150 bytes .../cbv2new/images/icons/embed_small.png | Bin 0 -> 1495 bytes upload/styles/cbv2new/images/icons/group.png | Bin 0 -> 753 bytes upload/styles/cbv2new/images/icons/heart.png | Bin 0 -> 749 bytes .../cbv2new/images/icons/heart_small.png | Bin 0 -> 1292 bytes upload/styles/cbv2new/images/icons/image.png | Bin 0 -> 516 bytes upload/styles/cbv2new/images/icons/images.png | Bin 0 -> 661 bytes upload/styles/cbv2new/images/icons/photo.png | Bin 0 -> 649 bytes upload/styles/cbv2new/images/icons/photos.png | Bin 0 -> 647 bytes .../styles/cbv2new/images/icons/playlist.png | Bin 0 -> 267 bytes .../cbv2new/images/icons/playlist_small.png | Bin 0 -> 1332 bytes .../images/icons/quicklist_check_small.png | Bin 0 -> 1215 bytes .../cbv2new/images/icons/quicklist_small.png | Bin 0 -> 1247 bytes .../cbv2new/images/icons/report_small.png | Bin 0 -> 1370 bytes .../cbv2new/images/icons/share_small.png | Bin 0 -> 1523 bytes upload/styles/cbv2new/images/icons/shield.png | Bin 0 -> 706 bytes upload/styles/cbv2new/images/icons/star.png | Bin 0 -> 670 bytes upload/styles/cbv2new/images/icons/user.png | Bin 0 -> 741 bytes .../styles/cbv2new/images/icons/user_add.png | Bin 0 -> 746 bytes .../cbv2new/images/icons/user_comment.png | Bin 0 -> 743 bytes upload/styles/cbv2new/images/icons/video.png | Bin 0 -> 1769 bytes upload/styles/cbv2new/images/line_sps.png | Bin 0 -> 129 bytes upload/styles/cbv2new/images/log_button.png | Bin 0 -> 251 bytes upload/styles/cbv2new/images/login_button.png | Bin 0 -> 176 bytes upload/styles/cbv2new/images/login_grad.png | Bin 0 -> 183 bytes upload/styles/cbv2new/images/logo.png | Bin 0 -> 3701 bytes upload/styles/cbv2new/images/logo348x53.png | Bin 0 -> 16164 bytes upload/styles/cbv2new/images/main_bg.png | Bin 0 -> 203 bytes upload/styles/cbv2new/images/main_box.png | Bin 0 -> 6944 bytes upload/styles/cbv2new/images/main_vid_bg.png | Bin 0 -> 133 bytes .../cbv2new/images/messagebox_warning.png | Bin 0 -> 2125 bytes upload/styles/cbv2new/images/nav_grads.png | Bin 0 -> 4565 bytes upload/styles/cbv2new/images/no_user.png | Bin 0 -> 3838 bytes upload/styles/cbv2new/images/ok.png | Bin 0 -> 629 bytes upload/styles/cbv2new/images/ok_16.png | Bin 0 -> 643 bytes upload/styles/cbv2new/images/player.png | Bin 0 -> 803 bytes upload/styles/cbv2new/images/preview.png | Bin 0 -> 15149 bytes upload/styles/cbv2new/images/private.png | Bin 0 -> 915 bytes upload/styles/cbv2new/images/quick_icon.png | Bin 0 -> 1134 bytes upload/styles/cbv2new/images/search.png | Bin 0 -> 1358 bytes .../styles/cbv2new/images/search_footer.png | Bin 0 -> 150 bytes upload/styles/cbv2new/images/shadows.png | Bin 0 -> 12395 bytes upload/styles/cbv2new/images/side_bg.png | Bin 0 -> 155 bytes .../styles/cbv2new/images/simple_gradient.png | Bin 0 -> 287 bytes upload/styles/cbv2new/images/small_stars.png | Bin 0 -> 845 bytes upload/styles/cbv2new/images/stars.png | Bin 0 -> 1272 bytes upload/styles/cbv2new/images/tabs_bg.png | Bin 0 -> 251 bytes upload/styles/cbv2new/images/tabs_sp.png | Bin 0 -> 117 bytes upload/styles/cbv2new/images/tag_blue.png | Bin 0 -> 597 bytes upload/styles/cbv2new/images/thumbs.png | Bin 0 -> 1811 bytes .../images/thumbs/group_thumb-small.png | Bin 0 -> 4002 bytes .../cbv2new/images/thumbs/group_thumb.png | Bin 0 -> 6633 bytes .../cbv2new/images/thumbs/no_avatar-small.png | Bin 0 -> 1460 bytes .../cbv2new/images/thumbs/no_avatar.png | Bin 0 -> 3838 bytes .../cbv2new/images/thumbs/processing.png | Bin 0 -> 2157 bytes upload/styles/cbv2new/images/top_user.png | Bin 0 -> 518 bytes .../styles/cbv2new/images/top_users_grad.png | Bin 0 -> 198 bytes upload/styles/cbv2new/images/up.png | Bin 0 -> 1202 bytes upload/styles/cbv2new/images/up_down.png | Bin 0 -> 1133 bytes upload/styles/cbv2new/images/upload_bg.png | Bin 0 -> 1042 bytes .../styles/cbv2new/images/uploading_bar.png | Bin 0 -> 1089 bytes upload/styles/cbv2new/images/verticle_bg.png | Bin 0 -> 1064 bytes upload/styles/cbv2new/images/view_channel.png | Bin 0 -> 740 bytes .../cbv2new/images/watch_video_bars.png | Bin 0 -> 1014 bytes .../cbv2new/images/watch_video_details_bg.png | Bin 0 -> 218 bytes upload/styles/cbv2new/layout/403.html | 2 + upload/styles/cbv2new/layout/404.html | 2 + upload/styles/cbv2new/layout/activation.html | 34 + .../cbv2new/layout/add_group_videos.html | 41 + upload/styles/cbv2new/layout/blocked.html | 10 + .../cbv2new/layout/blocks/category_list.html | 8 + .../cbv2new/layout/blocks/collection.html | 41 + .../layout/blocks/collection_form.html | 22 + .../layout/blocks/comments/add_comment.html | 61 + .../layout/blocks/comments/comment.html | 65 + .../layout/blocks/comments/comments.html | 20 + .../editor_pick/index_featured_video.html | 8 + .../blocks/editor_pick/video_block.html | 8 + upload/styles/cbv2new/layout/blocks/feed.html | 131 + .../cbv2new/layout/blocks/flag_form.html | 21 + .../styles/cbv2new/layout/blocks/group.html | 10 + .../layout/blocks/group/add_topic.html | 14 + .../layout/blocks/group/group_header.html | 156 + .../layout/blocks/group/group_left.html | 35 + .../layout/blocks/group/group_right.html | 29 + .../layout/blocks/group/group_topics.html | 29 + .../blocks/manage/account_collections.html | 89 + .../layout/blocks/manage/account_group.html | 38 + .../layout/blocks/manage/account_head.html | 30 + .../layout/blocks/manage/account_left.html | 14 + .../layout/blocks/manage/account_photo.html | 69 + .../layout/blocks/manage/account_user.html | 23 + .../layout/blocks/manage/account_video.html | 95 + .../blocks/manage/group_manage_links.html | 16 + .../manage/user_account_pagination.html | 8 + .../cbv2new/layout/blocks/new_pagination.html | 4 + .../cbv2new/layout/blocks/pagination.html | 28 + .../styles/cbv2new/layout/blocks/photo.html | 55 + .../cbv2new/layout/blocks/playlist_form.html | 26 + .../cbv2new/layout/blocks/pm/messages.html | 86 + .../layout/blocks/quicklist/block.html | 29 + .../layout/blocks/quicklist/video_block.html | 18 + .../styles/cbv2new/layout/blocks/rating.html | 34 + .../cbv2new/layout/blocks/share_form.html | 81 + .../cbv2new/layout/blocks/subscriptions.html | 38 + .../cbv2new/layout/blocks/upload/form.html | 77 + .../layout/blocks/upload/photo_form.html | 43 + .../cbv2new/layout/blocks/upload_head.html | 67 + upload/styles/cbv2new/layout/blocks/user.html | 38 + .../styles/cbv2new/layout/blocks/video.html | 87 + .../blocks/view_channel/channel_global.html | 12 + .../blocks/view_channel/channel_item.html | 32 + .../blocks/view_channel/channel_left.html | 81 + .../blocks/view_channel/channel_top.html | 17 + .../blocks/view_channel/user_block.html | 34 + .../blocks/watch_video/playlist_box.html | 43 + .../layout/blocks/watch_video/video_box.html | 21 + .../blocks/watch_video/video_password.html | 15 + upload/styles/cbv2new/layout/body.html | 42 + upload/styles/cbv2new/layout/channels.html | 37 + upload/styles/cbv2new/layout/collections.html | 45 + upload/styles/cbv2new/layout/contact.html | 30 + .../styles/cbv2new/layout/create_group.html | 47 + upload/styles/cbv2new/layout/download.html | 25 + .../styles/cbv2new/layout/edit_account.html | 344 + upload/styles/cbv2new/layout/edit_group.html | 91 + upload/styles/cbv2new/layout/edit_photo.html | 47 + upload/styles/cbv2new/layout/edit_video.html | 80 + upload/styles/cbv2new/layout/footer.html | 29 + upload/styles/cbv2new/layout/forgot.html | 71 + .../styles/cbv2new/layout/global_header.html | 206 + upload/styles/cbv2new/layout/groups.html | 50 + upload/styles/cbv2new/layout/header.html | 104 + upload/styles/cbv2new/layout/index.html | 153 + .../cbv2new/layout/manage_collections.html | 166 + .../cbv2new/layout/manage_contacts.html | 96 + .../styles/cbv2new/layout/manage_groups.html | 296 + .../styles/cbv2new/layout/manage_photos.html | 134 + .../cbv2new/layout/manage_playlists.html | 123 + .../styles/cbv2new/layout/manage_videos.html | 121 + upload/styles/cbv2new/layout/message.html | 37 + upload/styles/cbv2new/layout/myaccount.html | 23 + .../styles/cbv2new/layout/photo_upload.html | 34 + upload/styles/cbv2new/layout/photos.html | 40 + .../cbv2new/layout/private_message.html | 50 + upload/styles/cbv2new/layout/search.html | 77 + upload/styles/cbv2new/layout/signup.html | 113 + upload/styles/cbv2new/layout/upload.html | 72 + .../cbv2new/layout/user_collections.html | 30 + .../styles/cbv2new/layout/user_contacts.html | 47 + upload/styles/cbv2new/layout/user_photos.html | 30 + upload/styles/cbv2new/layout/user_videos.html | 34 + upload/styles/cbv2new/layout/videos.html | 52 + .../styles/cbv2new/layout/view_channel.html | 325 + .../cbv2new/layout/view_collection.html | 208 + upload/styles/cbv2new/layout/view_group.html | 120 + upload/styles/cbv2new/layout/view_item.html | 46 + upload/styles/cbv2new/layout/view_page.html | 1 + upload/styles/cbv2new/layout/view_photo.html | 110 + upload/styles/cbv2new/layout/view_topic.html | 47 + upload/styles/cbv2new/layout/watch_video.html | 269 + upload/styles/cbv2new/template.xml | 9 + upload/styles/cbv2new/theme/ie7.css | 35 + upload/styles/cbv2new/theme/main.css | 1017 +++ upload/styles/cbv2new/theme/rating.css | 107 + upload/styles/cbv2new/theme/view_channel.css | 71 + upload/styles/global/admin_bar.html | 85 + upload/styles/global/head.html | 519 ++ upload/styles/global/jquery_ui.css | 572 ++ upload/styles/global/upload_form.html | 16 + upload/upload.php | 78 + upload/user_collections.php | 74 + upload/user_contacts.php | 72 + upload/user_photos.php | 74 + upload/user_videos.php | 79 + upload/videos.php | 108 + upload/view_channel.php | 121 + upload/view_collection.php | 73 + upload/view_group.php | 111 + upload/view_group_members.php | 33 + upload/view_group_videos.php | 44 + upload/view_item.php | 115 + upload/view_page.php | 31 + upload/view_topic.php | 41 + upload/watch_video.php | 82 + 1278 files changed, 114287 insertions(+) create mode 100644 upload/.htaccess create mode 100644 upload/403.php create mode 100644 upload/404.php create mode 100644 upload/LICENSE create mode 100644 upload/actions/.htaccess create mode 100644 upload/actions/admin.php create mode 100644 upload/actions/edit_comment.php create mode 100644 upload/actions/embed_form_verifier.php create mode 100644 upload/actions/file_downloader.php create mode 100644 upload/actions/file_results.php create mode 100644 upload/actions/file_uploader.php create mode 100644 upload/actions/get_file_size.php create mode 100644 upload/actions/include_functions.php create mode 100644 upload/actions/photo_uploader.php create mode 100644 upload/actions/process_video.php create mode 100644 upload/actions/send_subscription_email.php create mode 100644 upload/actions/update_cb_stats.php create mode 100644 upload/actions/update_configs.php create mode 100644 upload/actions/update_phrase.php create mode 100644 upload/actions/verify_converted_videos.php create mode 100644 upload/actions/video_convert.php create mode 100644 upload/activation.php create mode 100644 upload/add_group_videos.php create mode 100644 upload/admin_area/_permission.php create mode 100644 upload/admin_area/add_custom_fields.php create mode 100644 upload/admin_area/add_group.php create mode 100644 upload/admin_area/add_member.php create mode 100644 upload/admin_area/add_phrase.php create mode 100644 upload/admin_area/ads_add_placements.php create mode 100644 upload/admin_area/ads_manager.php create mode 100644 upload/admin_area/category.php create mode 100644 upload/admin_area/cb_conversion_queue.php create mode 100644 upload/admin_area/cb_mod_check.php create mode 100644 upload/admin_area/charts/daily_activity.php create mode 100644 upload/admin_area/charts/groups_activity.php create mode 100644 upload/admin_area/charts/ofc-library/JSON.php create mode 100644 upload/admin_area/charts/ofc-library/dot_base.php create mode 100644 upload/admin_area/charts/ofc-library/json_format.php create mode 100644 upload/admin_area/charts/ofc-library/ofc_area_base.php create mode 100644 upload/admin_area/charts/ofc-library/ofc_area_hollow.php create mode 100644 upload/admin_area/charts/ofc-library/ofc_area_line.php create mode 100644 upload/admin_area/charts/ofc-library/ofc_arrow.php create mode 100644 upload/admin_area/charts/ofc-library/ofc_bar.php create mode 100644 upload/admin_area/charts/ofc-library/ofc_bar_3d.php create mode 100644 upload/admin_area/charts/ofc-library/ofc_bar_base.php create mode 100644 upload/admin_area/charts/ofc-library/ofc_bar_filled.php create mode 100644 upload/admin_area/charts/ofc-library/ofc_bar_glass.php create mode 100644 upload/admin_area/charts/ofc-library/ofc_bar_sketch.php create mode 100644 upload/admin_area/charts/ofc-library/ofc_bar_stack.php create mode 100644 upload/admin_area/charts/ofc-library/ofc_candle.php create mode 100644 upload/admin_area/charts/ofc-library/ofc_hbar.php create mode 100644 upload/admin_area/charts/ofc-library/ofc_line.php create mode 100644 upload/admin_area/charts/ofc-library/ofc_line_base.php create mode 100644 upload/admin_area/charts/ofc-library/ofc_line_dot.php create mode 100644 upload/admin_area/charts/ofc-library/ofc_line_hollow.php create mode 100644 upload/admin_area/charts/ofc-library/ofc_line_style.php create mode 100644 upload/admin_area/charts/ofc-library/ofc_menu.php create mode 100644 upload/admin_area/charts/ofc-library/ofc_pie.php create mode 100644 upload/admin_area/charts/ofc-library/ofc_radar_axis.php create mode 100644 upload/admin_area/charts/ofc-library/ofc_radar_axis_labels.php create mode 100644 upload/admin_area/charts/ofc-library/ofc_radar_spoke_labels.php create mode 100644 upload/admin_area/charts/ofc-library/ofc_scatter.php create mode 100644 upload/admin_area/charts/ofc-library/ofc_scatter_line.php create mode 100644 upload/admin_area/charts/ofc-library/ofc_shape.php create mode 100644 upload/admin_area/charts/ofc-library/ofc_sugar.php create mode 100644 upload/admin_area/charts/ofc-library/ofc_tags.php create mode 100644 upload/admin_area/charts/ofc-library/ofc_title.php create mode 100644 upload/admin_area/charts/ofc-library/ofc_tooltip.php create mode 100644 upload/admin_area/charts/ofc-library/ofc_x_axis.php create mode 100644 upload/admin_area/charts/ofc-library/ofc_x_axis_label.php create mode 100644 upload/admin_area/charts/ofc-library/ofc_x_axis_labels.php create mode 100644 upload/admin_area/charts/ofc-library/ofc_x_legend.php create mode 100644 upload/admin_area/charts/ofc-library/ofc_y_axis.php create mode 100644 upload/admin_area/charts/ofc-library/ofc_y_axis_base.php create mode 100644 upload/admin_area/charts/ofc-library/ofc_y_axis_label.php create mode 100644 upload/admin_area/charts/ofc-library/ofc_y_axis_labels.php create mode 100644 upload/admin_area/charts/ofc-library/ofc_y_axis_right.php create mode 100644 upload/admin_area/charts/ofc-library/ofc_y_legend.php create mode 100644 upload/admin_area/charts/ofc-library/open-flash-chart-object.php create mode 100644 upload/admin_area/charts/ofc-library/open-flash-chart.php create mode 100644 upload/admin_area/charts/users_activity.php create mode 100644 upload/admin_area/charts/videos_activity.php create mode 100644 upload/admin_area/collection_category.php create mode 100644 upload/admin_area/collection_manager.php create mode 100644 upload/admin_area/comments.php create mode 100644 upload/admin_area/conversion_lab.php create mode 100644 upload/admin_area/edit_announcement.php create mode 100644 upload/admin_area/edit_collection.php create mode 100644 upload/admin_area/edit_group.php create mode 100644 upload/admin_area/edit_member.php create mode 100644 upload/admin_area/edit_photo.php create mode 100644 upload/admin_area/edit_video.php create mode 100644 upload/admin_area/editor_pick.php create mode 100644 upload/admin_area/email_settings.php create mode 100644 upload/admin_area/flagged_collections.php create mode 100644 upload/admin_area/flagged_groups.php create mode 100644 upload/admin_area/flagged_photos.php create mode 100644 upload/admin_area/flagged_users.php create mode 100644 upload/admin_area/flagged_videos.php create mode 100644 upload/admin_area/group_category.php create mode 100644 upload/admin_area/groups_manager.php create mode 100644 upload/admin_area/index.php create mode 100644 upload/admin_area/lab_resources/echo.php create mode 100644 upload/admin_area/lab_resources/experiments.php create mode 100644 upload/admin_area/language_settings.php create mode 100644 upload/admin_area/login.php create mode 100644 upload/admin_area/login_as_user.php create mode 100644 upload/admin_area/logo_change.php create mode 100644 upload/admin_area/logout.php create mode 100644 upload/admin_area/main.php create mode 100644 upload/admin_area/maintenance.php create mode 100644 upload/admin_area/manage_items.php create mode 100644 upload/admin_area/manage_pages.php create mode 100644 upload/admin_area/manage_players.php create mode 100644 upload/admin_area/mass_email.php create mode 100644 upload/admin_area/mass_uploader.php create mode 100644 upload/admin_area/members.php create mode 100644 upload/admin_area/module_manager.php create mode 100644 upload/admin_area/notification_settings.php create mode 100644 upload/admin_area/online_users.php create mode 100644 upload/admin_area/orphan_photos.php create mode 100644 upload/admin_area/photo_manager.php create mode 100644 upload/admin_area/photo_settings.php create mode 100644 upload/admin_area/phpinfo.php create mode 100644 upload/admin_area/plugin.php create mode 100644 upload/admin_area/plugin_manager.php create mode 100644 upload/admin_area/recreate_thumbs.php create mode 100644 upload/admin_area/reindex_cb.php create mode 100644 upload/admin_area/repair_vid_duration.php create mode 100644 upload/admin_area/reports.php create mode 100644 upload/admin_area/statistics.php create mode 100644 upload/admin_area/styles/cbv2/images/alert.png create mode 100644 upload/admin_area/styles/cbv2/images/arrow_return.png create mode 100644 upload/admin_area/styles/cbv2/images/arrow_return_invert.png create mode 100644 upload/admin_area/styles/cbv2/images/bgs/gr_bg.png create mode 100644 upload/admin_area/styles/cbv2/images/bgs/left_menu_head.png create mode 100644 upload/admin_area/styles/cbv2/images/bgs/login.png create mode 100644 upload/admin_area/styles/cbv2/images/bgs/pagination_bg.png create mode 100644 upload/admin_area/styles/cbv2/images/bgs/round_bg.png create mode 100644 upload/admin_area/styles/cbv2/images/bot.png create mode 100644 upload/admin_area/styles/cbv2/images/botal.png create mode 100644 upload/admin_area/styles/cbv2/images/browsers.png create mode 100644 upload/admin_area/styles/cbv2/images/button_bg.png create mode 100644 upload/admin_area/styles/cbv2/images/button_ok.png create mode 100644 upload/admin_area/styles/cbv2/images/catgory_toggler.png create mode 100644 upload/admin_area/styles/cbv2/images/collapse.png create mode 100644 upload/admin_area/styles/cbv2/images/cross.png create mode 100644 upload/admin_area/styles/cbv2/images/dot.gif create mode 100644 upload/admin_area/styles/cbv2/images/error.png create mode 100644 upload/admin_area/styles/cbv2/images/gradients.png create mode 100644 upload/admin_area/styles/cbv2/images/headerafter.png create mode 100644 upload/admin_area/styles/cbv2/images/help.png create mode 100644 upload/admin_area/styles/cbv2/images/icons.png create mode 100644 upload/admin_area/styles/cbv2/images/loading.gif create mode 100644 upload/admin_area/styles/cbv2/images/login.png create mode 100644 upload/admin_area/styles/cbv2/images/nicEditIcons-latest.gif create mode 100644 upload/admin_area/styles/cbv2/images/ok.png create mode 100644 upload/admin_area/styles/cbv2/images/play_icon.png create mode 100644 upload/admin_area/styles/cbv2/images/slide_toggle.png create mode 100644 upload/admin_area/styles/cbv2/images/slide_toggle_2.png create mode 100644 upload/admin_area/styles/cbv2/images/slide_toggle_3.png create mode 100644 upload/admin_area/styles/cbv2/images/tick.png create mode 100644 upload/admin_area/styles/cbv2/images/widget_item_border.gif create mode 100644 upload/admin_area/styles/cbv2/layout/_permission.html create mode 100644 upload/admin_area/styles/cbv2/layout/add_group.html create mode 100644 upload/admin_area/styles/cbv2/layout/add_members.html create mode 100644 upload/admin_area/styles/cbv2/layout/add_phrase.html create mode 100644 upload/admin_area/styles/cbv2/layout/ads_add_placements.html create mode 100644 upload/admin_area/styles/cbv2/layout/ads_manager.html create mode 100644 upload/admin_area/styles/cbv2/layout/blocks/access_log.html create mode 100644 upload/admin_area/styles/cbv2/layout/blocks/comments.html create mode 100644 upload/admin_area/styles/cbv2/layout/blocks/edit_video.html create mode 100644 upload/admin_area/styles/cbv2/layout/blocks/pagination.html create mode 100644 upload/admin_area/styles/cbv2/layout/body.html create mode 100644 upload/admin_area/styles/cbv2/layout/category.html create mode 100644 upload/admin_area/styles/cbv2/layout/cb_conversion_queue.html create mode 100644 upload/admin_area/styles/cbv2/layout/cb_mod_check.html create mode 100644 upload/admin_area/styles/cbv2/layout/collection_category.html create mode 100644 upload/admin_area/styles/cbv2/layout/collection_manager.html create mode 100644 upload/admin_area/styles/cbv2/layout/comments.html create mode 100644 upload/admin_area/styles/cbv2/layout/conversion_lab.html create mode 100644 upload/admin_area/styles/cbv2/layout/edit_announcemnent.html create mode 100644 upload/admin_area/styles/cbv2/layout/edit_collection.html create mode 100644 upload/admin_area/styles/cbv2/layout/edit_group.html create mode 100644 upload/admin_area/styles/cbv2/layout/edit_photo.html create mode 100644 upload/admin_area/styles/cbv2/layout/edit_video.html create mode 100644 upload/admin_area/styles/cbv2/layout/editor_pick.html create mode 100644 upload/admin_area/styles/cbv2/layout/email_settings.html create mode 100644 upload/admin_area/styles/cbv2/layout/flagged_groups.html create mode 100644 upload/admin_area/styles/cbv2/layout/flagged_photos.html create mode 100644 upload/admin_area/styles/cbv2/layout/flagged_users.html create mode 100644 upload/admin_area/styles/cbv2/layout/flagged_videos.html create mode 100644 upload/admin_area/styles/cbv2/layout/footer.html create mode 100644 upload/admin_area/styles/cbv2/layout/global_header.html create mode 100644 upload/admin_area/styles/cbv2/layout/group_category.html create mode 100644 upload/admin_area/styles/cbv2/layout/groups_manager.html create mode 100644 upload/admin_area/styles/cbv2/layout/header.html create mode 100644 upload/admin_area/styles/cbv2/layout/index.html create mode 100644 upload/admin_area/styles/cbv2/layout/language_settings.html create mode 100644 upload/admin_area/styles/cbv2/layout/left_menu.html create mode 100644 upload/admin_area/styles/cbv2/layout/login.html create mode 100644 upload/admin_area/styles/cbv2/layout/main.html create mode 100644 upload/admin_area/styles/cbv2/layout/maintenance.html create mode 100644 upload/admin_area/styles/cbv2/layout/manage_items.html create mode 100644 upload/admin_area/styles/cbv2/layout/manage_pages.html create mode 100644 upload/admin_area/styles/cbv2/layout/manage_players.html create mode 100644 upload/admin_area/styles/cbv2/layout/mass_email.html create mode 100644 upload/admin_area/styles/cbv2/layout/mass_uploader.html create mode 100644 upload/admin_area/styles/cbv2/layout/members.html create mode 100644 upload/admin_area/styles/cbv2/layout/msg.html create mode 100644 upload/admin_area/styles/cbv2/layout/notification_settings.html create mode 100644 upload/admin_area/styles/cbv2/layout/online_users.html create mode 100644 upload/admin_area/styles/cbv2/layout/orphan_photos.html create mode 100644 upload/admin_area/styles/cbv2/layout/photo_manager.html create mode 100644 upload/admin_area/styles/cbv2/layout/photo_settings.html create mode 100644 upload/admin_area/styles/cbv2/layout/plugin_manager.html create mode 100644 upload/admin_area/styles/cbv2/layout/recreate_thumbs.html create mode 100644 upload/admin_area/styles/cbv2/layout/reindex_cb.html create mode 100644 upload/admin_area/styles/cbv2/layout/repair_vid_duration.html create mode 100644 upload/admin_area/styles/cbv2/layout/reports.html create mode 100644 upload/admin_area/styles/cbv2/layout/template_editor.html create mode 100644 upload/admin_area/styles/cbv2/layout/templates.html create mode 100644 upload/admin_area/styles/cbv2/layout/under_development.html create mode 100644 upload/admin_area/styles/cbv2/layout/upload_thumbs.html create mode 100644 upload/admin_area/styles/cbv2/layout/user_category.html create mode 100644 upload/admin_area/styles/cbv2/layout/user_levels.html create mode 100644 upload/admin_area/styles/cbv2/layout/video_manager.html create mode 100644 upload/admin_area/styles/cbv2/layout/view_conversion_log.html create mode 100644 upload/admin_area/styles/cbv2/layout/view_user.html create mode 100644 upload/admin_area/styles/cbv2/layout/view_video.html create mode 100644 upload/admin_area/styles/cbv2/theme/cbtab.css create mode 100644 upload/admin_area/styles/cbv2/theme/main.css create mode 100644 upload/admin_area/styles/cbv2/theme/pagination.css create mode 100644 upload/admin_area/styles/cbv2/theme/slidemenu.css create mode 100644 upload/admin_area/template_editor.php create mode 100644 upload/admin_area/templates.php create mode 100644 upload/admin_area/upload_thumbs.php create mode 100644 upload/admin_area/user_category.php create mode 100644 upload/admin_area/user_levels.php create mode 100644 upload/admin_area/video_manager.php create mode 100644 upload/admin_area/view_conversion_log.php create mode 100644 upload/admin_area/view_lang_vars.php create mode 100644 upload/admin_area/view_user.php create mode 100644 upload/admin_area/view_video.php create mode 100644 upload/ajax.php create mode 100644 upload/api/auth.php create mode 100644 upload/api/file_uploader.php create mode 100644 upload/api/get.php create mode 100644 upload/api/global.php create mode 100644 upload/api/pm.php create mode 100644 upload/api/push.php create mode 100644 upload/api/put.php create mode 100644 upload/api/sample_getVideos.json create mode 100644 upload/api/search.php create mode 100644 upload/api/thumb-sample.php create mode 100644 upload/captcha.php create mode 100644 upload/cb_install/LICENSE create mode 100644 upload/cb_install/ajax.php create mode 100644 upload/cb_install/clipbucket.php create mode 100644 upload/cb_install/dbconnect.php create mode 100644 upload/cb_install/favicon.ico create mode 100644 upload/cb_install/functions.js create mode 100644 upload/cb_install/functions.php create mode 100644 upload/cb_install/images/alert.png create mode 100644 upload/cb_install/images/bttncenter.png create mode 100644 upload/cb_install/images/bttnleft.png create mode 100644 upload/cb_install/images/bttnright.png create mode 100644 upload/cb_install/images/bttnrightalt.png create mode 100644 upload/cb_install/images/header_grad.png create mode 100644 upload/cb_install/images/header_grad_line.png create mode 100644 upload/cb_install/images/loading.gif create mode 100644 upload/cb_install/images/tick.png create mode 100644 upload/cb_install/index.php create mode 100644 upload/cb_install/modes/adminsettings.php create mode 100644 upload/cb_install/modes/agreement.php create mode 100644 upload/cb_install/modes/body.php create mode 100644 upload/cb_install/modes/database.php create mode 100644 upload/cb_install/modes/dataimport.php create mode 100644 upload/cb_install/modes/finish.php create mode 100644 upload/cb_install/modes/finish_upgrade.php create mode 100644 upload/cb_install/modes/lock.php create mode 100644 upload/cb_install/modes/permission.php create mode 100644 upload/cb_install/modes/precheck.php create mode 100644 upload/cb_install/modes/register.php create mode 100644 upload/cb_install/modes/sitesettings.php create mode 100644 upload/cb_install/modes/upgrade.php create mode 100644 upload/cb_install/round_arrow_right.png create mode 100644 upload/cb_install/sql/add_admin.sql create mode 100644 upload/cb_install/sql/ads_placements.sql create mode 100644 upload/cb_install/sql/categories.sql create mode 100644 upload/cb_install/sql/configs.sql create mode 100644 upload/cb_install/sql/countries.sql create mode 100644 upload/cb_install/sql/email_templates.sql create mode 100644 upload/cb_install/sql/import_categories.sql create mode 100644 upload/cb_install/sql/pages.sql create mode 100644 upload/cb_install/sql/structure.sql create mode 100644 upload/cb_install/sql/upgrade_2.0.5.sql create mode 100644 upload/cb_install/sql/upgrade_2.0.6.sql create mode 100644 upload/cb_install/sql/upgrade_2.0.7.sql create mode 100644 upload/cb_install/sql/upgrade_2.0.8.sql create mode 100644 upload/cb_install/sql/upgrade_2.0.9.sql create mode 100644 upload/cb_install/sql/upgrade_2.0.91.sql create mode 100644 upload/cb_install/sql/upgrade_2.1.sql create mode 100644 upload/cb_install/sql/upgrade_2.2.sql create mode 100644 upload/cb_install/sql/upgrade_2.3.sql create mode 100644 upload/cb_install/sql/upgrade_2.4.5.sql create mode 100644 upload/cb_install/sql/upgrade_2.4.sql create mode 100644 upload/cb_install/sql/upgrade_2.5.1.sql create mode 100644 upload/cb_install/sql/upgrade_2.5.sql create mode 100644 upload/cb_install/sql/upgrade_2.6.sql create mode 100644 upload/cb_install/sql/upgrade_2.7.sql create mode 100644 upload/cb_install/sql/user_levels.sql create mode 100644 upload/cb_install/style.css create mode 100644 upload/cb_install/upgradeable.php create mode 100644 upload/channels.php create mode 100644 upload/collections.php create mode 100644 upload/contact.php create mode 100644 upload/create_group.php create mode 100644 upload/download.php create mode 100644 upload/download_photo.php create mode 100644 upload/edit_account.php create mode 100644 upload/edit_group.php create mode 100644 upload/edit_photo.php create mode 100644 upload/edit_video.php create mode 100644 upload/favicon.ico create mode 100644 upload/files/.htaccess create mode 100644 upload/files/photos/no-photo_m.png create mode 100644 upload/files/photos/no-photo_t.png create mode 100644 upload/files/thumbs/processing.jpg create mode 100644 upload/files/videos/no_video.flv create mode 100644 upload/forgot.php create mode 100644 upload/groups.php create mode 100644 upload/images/avatars/no_avatar-small.jpg create mode 100644 upload/images/avatars/no_avatar-small.png create mode 100644 upload/images/avatars/no_avatar.jpg create mode 100644 upload/images/avatars/no_avatar.png create mode 100644 upload/images/category_thumbs/no_thumb.jpg create mode 100644 upload/images/collection_thumbs/no_thumb-small.png create mode 100644 upload/images/collection_thumbs/no_thumb.png create mode 100644 upload/images/groups_thumbs/no_thumb-small.png create mode 100644 upload/images/groups_thumbs/no_thumb.png create mode 100644 upload/images/icons/XPButton.png create mode 100644 upload/images/icons/cb_powered.gif create mode 100644 upload/images/icons/country/ac.png create mode 100644 upload/images/icons/country/ad.png create mode 100644 upload/images/icons/country/ae.png create mode 100644 upload/images/icons/country/af.png create mode 100644 upload/images/icons/country/ag.png create mode 100644 upload/images/icons/country/ai.png create mode 100644 upload/images/icons/country/al.png create mode 100644 upload/images/icons/country/am.png create mode 100644 upload/images/icons/country/an.png create mode 100644 upload/images/icons/country/ao.png create mode 100644 upload/images/icons/country/aq.png create mode 100644 upload/images/icons/country/ar.png create mode 100644 upload/images/icons/country/as.png create mode 100644 upload/images/icons/country/at.png create mode 100644 upload/images/icons/country/au.png create mode 100644 upload/images/icons/country/aw.png create mode 100644 upload/images/icons/country/ax.png create mode 100644 upload/images/icons/country/az.png create mode 100644 upload/images/icons/country/ba.png create mode 100644 upload/images/icons/country/bb.png create mode 100644 upload/images/icons/country/bd.png create mode 100644 upload/images/icons/country/be.png create mode 100644 upload/images/icons/country/bf.png create mode 100644 upload/images/icons/country/bg.png create mode 100644 upload/images/icons/country/bh.png create mode 100644 upload/images/icons/country/bi.png create mode 100644 upload/images/icons/country/bj.png create mode 100644 upload/images/icons/country/bm.png create mode 100644 upload/images/icons/country/bn.png create mode 100644 upload/images/icons/country/bo.png create mode 100644 upload/images/icons/country/br.png create mode 100644 upload/images/icons/country/bs.png create mode 100644 upload/images/icons/country/bt.png create mode 100644 upload/images/icons/country/bv.png create mode 100644 upload/images/icons/country/bw.png create mode 100644 upload/images/icons/country/by.png create mode 100644 upload/images/icons/country/bz.png create mode 100644 upload/images/icons/country/ca.png create mode 100644 upload/images/icons/country/cc.png create mode 100644 upload/images/icons/country/cd.png create mode 100644 upload/images/icons/country/cf.png create mode 100644 upload/images/icons/country/cg.png create mode 100644 upload/images/icons/country/ch.png create mode 100644 upload/images/icons/country/ci.png create mode 100644 upload/images/icons/country/ck.png create mode 100644 upload/images/icons/country/cl.png create mode 100644 upload/images/icons/country/cm.png create mode 100644 upload/images/icons/country/cn.png create mode 100644 upload/images/icons/country/co.png create mode 100644 upload/images/icons/country/cr.png create mode 100644 upload/images/icons/country/cu.png create mode 100644 upload/images/icons/country/cv.png create mode 100644 upload/images/icons/country/cx.png create mode 100644 upload/images/icons/country/cy.png create mode 100644 upload/images/icons/country/cz.png create mode 100644 upload/images/icons/country/de.png create mode 100644 upload/images/icons/country/dj.png create mode 100644 upload/images/icons/country/dk.png create mode 100644 upload/images/icons/country/dm.png create mode 100644 upload/images/icons/country/do.png create mode 100644 upload/images/icons/country/dz.png create mode 100644 upload/images/icons/country/ec.png create mode 100644 upload/images/icons/country/ee.png create mode 100644 upload/images/icons/country/eg.png create mode 100644 upload/images/icons/country/eh.png create mode 100644 upload/images/icons/country/er.png create mode 100644 upload/images/icons/country/es.png create mode 100644 upload/images/icons/country/et.png create mode 100644 upload/images/icons/country/fi.png create mode 100644 upload/images/icons/country/fj.png create mode 100644 upload/images/icons/country/fk.png create mode 100644 upload/images/icons/country/fm.png create mode 100644 upload/images/icons/country/fo.png create mode 100644 upload/images/icons/country/fr.png create mode 100644 upload/images/icons/country/ga.png create mode 100644 upload/images/icons/country/gb.png create mode 100644 upload/images/icons/country/gd.png create mode 100644 upload/images/icons/country/ge.png create mode 100644 upload/images/icons/country/gf.png create mode 100644 upload/images/icons/country/gg.png create mode 100644 upload/images/icons/country/gh.png create mode 100644 upload/images/icons/country/gi.png create mode 100644 upload/images/icons/country/gl.png create mode 100644 upload/images/icons/country/gm.png create mode 100644 upload/images/icons/country/gn.png create mode 100644 upload/images/icons/country/gp.png create mode 100644 upload/images/icons/country/gq.png create mode 100644 upload/images/icons/country/gr.png create mode 100644 upload/images/icons/country/gs.png create mode 100644 upload/images/icons/country/gt.png create mode 100644 upload/images/icons/country/gu.png create mode 100644 upload/images/icons/country/gw.png create mode 100644 upload/images/icons/country/gy.png create mode 100644 upload/images/icons/country/hk.png create mode 100644 upload/images/icons/country/hm.png create mode 100644 upload/images/icons/country/hn.png create mode 100644 upload/images/icons/country/hr.png create mode 100644 upload/images/icons/country/ht.png create mode 100644 upload/images/icons/country/hu.png create mode 100644 upload/images/icons/country/id.png create mode 100644 upload/images/icons/country/ie.png create mode 100644 upload/images/icons/country/il.png create mode 100644 upload/images/icons/country/im.png create mode 100644 upload/images/icons/country/in.png create mode 100644 upload/images/icons/country/io.png create mode 100644 upload/images/icons/country/iq.png create mode 100644 upload/images/icons/country/ir.png create mode 100644 upload/images/icons/country/is.png create mode 100644 upload/images/icons/country/it.png create mode 100644 upload/images/icons/country/je.png create mode 100644 upload/images/icons/country/jm.png create mode 100644 upload/images/icons/country/jo.png create mode 100644 upload/images/icons/country/jp.png create mode 100644 upload/images/icons/country/ke.png create mode 100644 upload/images/icons/country/kg.png create mode 100644 upload/images/icons/country/kh.png create mode 100644 upload/images/icons/country/ki.png create mode 100644 upload/images/icons/country/km.png create mode 100644 upload/images/icons/country/kn.png create mode 100644 upload/images/icons/country/kp.png create mode 100644 upload/images/icons/country/kr.png create mode 100644 upload/images/icons/country/kw.png create mode 100644 upload/images/icons/country/ky.png create mode 100644 upload/images/icons/country/kz.png create mode 100644 upload/images/icons/country/la.png create mode 100644 upload/images/icons/country/lb.png create mode 100644 upload/images/icons/country/lc.png create mode 100644 upload/images/icons/country/li.png create mode 100644 upload/images/icons/country/lk.png create mode 100644 upload/images/icons/country/lr.png create mode 100644 upload/images/icons/country/ls.png create mode 100644 upload/images/icons/country/lt.png create mode 100644 upload/images/icons/country/lu.png create mode 100644 upload/images/icons/country/lv.png create mode 100644 upload/images/icons/country/ly.png create mode 100644 upload/images/icons/country/ma.png create mode 100644 upload/images/icons/country/mc.png create mode 100644 upload/images/icons/country/md.png create mode 100644 upload/images/icons/country/me.png create mode 100644 upload/images/icons/country/mg.png create mode 100644 upload/images/icons/country/mh.png create mode 100644 upload/images/icons/country/mk.png create mode 100644 upload/images/icons/country/ml.png create mode 100644 upload/images/icons/country/mm.png create mode 100644 upload/images/icons/country/mn.png create mode 100644 upload/images/icons/country/mo.png create mode 100644 upload/images/icons/country/mp.png create mode 100644 upload/images/icons/country/mq.png create mode 100644 upload/images/icons/country/mr.png create mode 100644 upload/images/icons/country/ms.png create mode 100644 upload/images/icons/country/mt.png create mode 100644 upload/images/icons/country/mu.png create mode 100644 upload/images/icons/country/mv.png create mode 100644 upload/images/icons/country/mw.png create mode 100644 upload/images/icons/country/mx.png create mode 100644 upload/images/icons/country/my.png create mode 100644 upload/images/icons/country/mz.png create mode 100644 upload/images/icons/country/na.png create mode 100644 upload/images/icons/country/nc.png create mode 100644 upload/images/icons/country/ne.png create mode 100644 upload/images/icons/country/nf.png create mode 100644 upload/images/icons/country/ng.png create mode 100644 upload/images/icons/country/ni.png create mode 100644 upload/images/icons/country/nl.png create mode 100644 upload/images/icons/country/no.png create mode 100644 upload/images/icons/country/np.png create mode 100644 upload/images/icons/country/nr.png create mode 100644 upload/images/icons/country/nu.png create mode 100644 upload/images/icons/country/nz.png create mode 100644 upload/images/icons/country/om.png create mode 100644 upload/images/icons/country/pa.png create mode 100644 upload/images/icons/country/pe.png create mode 100644 upload/images/icons/country/pf.png create mode 100644 upload/images/icons/country/pg.png create mode 100644 upload/images/icons/country/ph.png create mode 100644 upload/images/icons/country/pk.png create mode 100644 upload/images/icons/country/pl.png create mode 100644 upload/images/icons/country/pm.png create mode 100644 upload/images/icons/country/pn.png create mode 100644 upload/images/icons/country/pr.png create mode 100644 upload/images/icons/country/ps.png create mode 100644 upload/images/icons/country/pt.png create mode 100644 upload/images/icons/country/pw.png create mode 100644 upload/images/icons/country/py.png create mode 100644 upload/images/icons/country/qa.png create mode 100644 upload/images/icons/country/re.png create mode 100644 upload/images/icons/country/ro.png create mode 100644 upload/images/icons/country/rs.png create mode 100644 upload/images/icons/country/ru.png create mode 100644 upload/images/icons/country/rw.png create mode 100644 upload/images/icons/country/sa.png create mode 100644 upload/images/icons/country/sb.png create mode 100644 upload/images/icons/country/sc.png create mode 100644 upload/images/icons/country/sd.png create mode 100644 upload/images/icons/country/se.png create mode 100644 upload/images/icons/country/sg.png create mode 100644 upload/images/icons/country/sh.png create mode 100644 upload/images/icons/country/si.png create mode 100644 upload/images/icons/country/sj.png create mode 100644 upload/images/icons/country/sk.png create mode 100644 upload/images/icons/country/sl.png create mode 100644 upload/images/icons/country/sm.png create mode 100644 upload/images/icons/country/sn.png create mode 100644 upload/images/icons/country/so.png create mode 100644 upload/images/icons/country/sr.png create mode 100644 upload/images/icons/country/st.png create mode 100644 upload/images/icons/country/sv.png create mode 100644 upload/images/icons/country/sy.png create mode 100644 upload/images/icons/country/sz.png create mode 100644 upload/images/icons/country/tc.png create mode 100644 upload/images/icons/country/td.png create mode 100644 upload/images/icons/country/tf.png create mode 100644 upload/images/icons/country/tg.png create mode 100644 upload/images/icons/country/th.png create mode 100644 upload/images/icons/country/tj.png create mode 100644 upload/images/icons/country/tk.png create mode 100644 upload/images/icons/country/tl.png create mode 100644 upload/images/icons/country/tm.png create mode 100644 upload/images/icons/country/tn.png create mode 100644 upload/images/icons/country/to.png create mode 100644 upload/images/icons/country/tr.png create mode 100644 upload/images/icons/country/tt.png create mode 100644 upload/images/icons/country/tv.png create mode 100644 upload/images/icons/country/tw.png create mode 100644 upload/images/icons/country/tz.png create mode 100644 upload/images/icons/country/ua.png create mode 100644 upload/images/icons/country/ug.png create mode 100644 upload/images/icons/country/uk.png create mode 100644 upload/images/icons/country/um.png create mode 100644 upload/images/icons/country/us.png create mode 100644 upload/images/icons/country/uy.png create mode 100644 upload/images/icons/country/uz.png create mode 100644 upload/images/icons/country/va.png create mode 100644 upload/images/icons/country/vc.png create mode 100644 upload/images/icons/country/ve.png create mode 100644 upload/images/icons/country/vg.png create mode 100644 upload/images/icons/country/vi.png create mode 100644 upload/images/icons/country/vn.png create mode 100644 upload/images/icons/country/vu.png create mode 100644 upload/images/icons/country/wf.png create mode 100644 upload/images/icons/country/ws.png create mode 100644 upload/images/icons/country/ye.png create mode 100644 upload/images/icons/country/yt.png create mode 100644 upload/images/icons/country/za.png create mode 100644 upload/images/icons/country/zm.png create mode 100644 upload/images/icons/country/zw.png create mode 100644 upload/images/icons/error.png create mode 100644 upload/images/icons/ico_lightsoff.gif create mode 100644 upload/images/icons/info.png create mode 100644 upload/images/icons/no_thumb.png create mode 100644 upload/images/icons/no_thumb_player.png create mode 100644 upload/images/icons/no_thumb_template.png create mode 100644 upload/images/icons/progIndicator.gif create mode 100644 upload/images/icons/settings.gif create mode 100644 upload/images/icons/topic_icons/award_star_silver_3.png create mode 100644 upload/images/icons/topic_icons/bell.png create mode 100644 upload/images/icons/topic_icons/book_open.png create mode 100644 upload/images/icons/topic_icons/cake.png create mode 100644 upload/images/icons/topic_icons/camera.png create mode 100644 upload/images/icons/topic_icons/cart.png create mode 100644 upload/images/icons/topic_icons/comment.png create mode 100644 upload/images/icons/topic_icons/dot.gif create mode 100644 upload/images/icons/topic_icons/emotion_grin.png create mode 100644 upload/images/icons/topic_icons/emotion_happy.png create mode 100644 upload/images/icons/topic_icons/emotion_smile.png create mode 100644 upload/images/icons/topic_icons/emotion_suprised.png create mode 100644 upload/images/icons/topic_icons/emotion_tongue.png create mode 100644 upload/images/icons/topic_icons/emotion_wink.png create mode 100644 upload/images/icons/topic_icons/error.png create mode 100644 upload/images/icons/topic_icons/newspaper.png create mode 100644 upload/images/icons/topic_icons/television.png create mode 100644 upload/images/logo.png create mode 100644 upload/includes/.htaccess create mode 100644 upload/includes/active.php create mode 100644 upload/includes/admin.functions.php create mode 100644 upload/includes/admin_config.php create mode 100644 upload/includes/adminfunctions.php create mode 100644 upload/includes/adodb/adodb-active-record.inc.php create mode 100644 upload/includes/adodb/adodb-csvlib.inc.php create mode 100644 upload/includes/adodb/adodb-datadict.inc.php create mode 100644 upload/includes/adodb/adodb-error.inc.php create mode 100644 upload/includes/adodb/adodb-errorhandler.inc.php create mode 100644 upload/includes/adodb/adodb-errorpear.inc.php create mode 100644 upload/includes/adodb/adodb-exceptions.inc.php create mode 100644 upload/includes/adodb/adodb-iterator.inc.php create mode 100644 upload/includes/adodb/adodb-lib.inc.php create mode 100644 upload/includes/adodb/adodb-memcache.lib.inc.php create mode 100644 upload/includes/adodb/adodb-pager.inc.php create mode 100644 upload/includes/adodb/adodb-pear.inc.php create mode 100644 upload/includes/adodb/adodb-perf.inc.php create mode 100644 upload/includes/adodb/adodb-php4.inc.php create mode 100644 upload/includes/adodb/adodb-time.inc.php create mode 100644 upload/includes/adodb/adodb.inc.php create mode 100644 upload/includes/adodb/adodb.php create mode 100644 upload/includes/adodb/drivers/adodb-mysql.inc.php create mode 100644 upload/includes/adodb/index.php create mode 100644 upload/includes/adodb/pivottable.inc.php create mode 100644 upload/includes/adodb/rsfilter.inc.php create mode 100644 upload/includes/adodb/server.php create mode 100644 upload/includes/adodb/toexport.inc.php create mode 100644 upload/includes/adodb/tohtml.inc.php create mode 100644 upload/includes/adodb/xmlschema.dtd create mode 100644 upload/includes/adodb/xmlschema03.dtd create mode 100644 upload/includes/classes/ClipBucket.class.php create mode 100644 upload/includes/classes/Services_JSON.php create mode 100644 upload/includes/classes/actions.class.php create mode 100644 upload/includes/classes/ads.class.php create mode 100644 upload/includes/classes/calcdate.class.php create mode 100644 upload/includes/classes/captcha/class.files.php create mode 100644 upload/includes/classes/captcha/class.img_validator.php create mode 100644 upload/includes/classes/captcha/img.php create mode 100644 upload/includes/classes/captcha/img/bg1.jpg create mode 100644 upload/includes/classes/captcha/img/bg2.jpg create mode 100644 upload/includes/classes/captcha/img/bg3.jpg create mode 100644 upload/includes/classes/captcha/img/bg4.jpg create mode 100644 upload/includes/classes/captcha/img/fonts/arial.ttf create mode 100644 upload/includes/classes/captcha/img/fonts/comicbd.ttf create mode 100644 upload/includes/classes/captcha/img/fonts/impact.ttf create mode 100644 upload/includes/classes/captcha/img/fonts/monofont.ttf create mode 100644 upload/includes/classes/captcha/img/fonts/verdana.ttf create mode 100644 upload/includes/classes/captcha/index.php create mode 100644 upload/includes/classes/captcha_simple.img.php create mode 100644 upload/includes/classes/category.class.php create mode 100644 upload/includes/classes/cbemail.class.php create mode 100644 upload/includes/classes/cbfeeds.class.php create mode 100644 upload/includes/classes/cbpage.class.php create mode 100644 upload/includes/classes/collections.class.php create mode 100644 upload/includes/classes/conversion/ffmpeg.class.php create mode 100644 upload/includes/classes/curl/class.curl.php create mode 100644 upload/includes/classes/errorhandler.class.php create mode 100644 upload/includes/classes/form.class.php create mode 100644 upload/includes/classes/gravatar.class.php create mode 100644 upload/includes/classes/groups.class.php create mode 100644 upload/includes/classes/image.class.php create mode 100644 upload/includes/classes/index.php create mode 100644 upload/includes/classes/lang.class.php create mode 100644 upload/includes/classes/log.class.php create mode 100644 upload/includes/classes/mass_upload.class.php create mode 100644 upload/includes/classes/menuhandler.class.php create mode 100644 upload/includes/classes/my_queries.class.php create mode 100644 upload/includes/classes/objects.class.php create mode 100644 upload/includes/classes/pages.class.php create mode 100644 upload/includes/classes/photos.class.php create mode 100644 upload/includes/classes/phpmailer/class.phpmailer.php create mode 100644 upload/includes/classes/phpmailer/class.smtp.php create mode 100644 upload/includes/classes/player.class.php create mode 100644 upload/includes/classes/playlist.class.php create mode 100644 upload/includes/classes/plugin.class.php create mode 100644 upload/includes/classes/pm.class.php create mode 100644 upload/includes/classes/reindex.class.php create mode 100644 upload/includes/classes/search.class.php create mode 100644 upload/includes/classes/session.class.php create mode 100644 upload/includes/classes/signup.class.php create mode 100644 upload/includes/classes/swfObj.class.php create mode 100644 upload/includes/classes/sysinfo.class.php create mode 100644 upload/includes/classes/template.class.php create mode 100644 upload/includes/classes/upload.class.php create mode 100644 upload/includes/classes/user.class.php create mode 100644 upload/includes/classes/video.class.php create mode 100644 upload/includes/clipbucket.php create mode 100644 upload/includes/common.php create mode 100644 upload/includes/config.inc.php create mode 100644 upload/includes/configs/index.php create mode 100644 upload/includes/conversion.conf.php create mode 100644 upload/includes/dbconnect.php create mode 100644 upload/includes/define_php_links.php create mode 100644 upload/includes/defined_links.php create mode 100644 upload/includes/email_templates/activation_request.header.php create mode 100644 upload/includes/email_templates/activation_request.template.php create mode 100644 upload/includes/email_templates/email_verify.header.php create mode 100644 upload/includes/email_templates/email_verify.template.php create mode 100644 upload/includes/email_templates/index.php create mode 100644 upload/includes/email_templates/share_video.header.php create mode 100644 upload/includes/email_templates/share_video.template.php create mode 100644 upload/includes/email_templates/template_writer.php create mode 100644 upload/includes/email_templates/welcome_message.header.php create mode 100644 upload/includes/email_templates/welcome_message.template.php create mode 100644 upload/includes/email_templates/welcome_messege.header.php create mode 100644 upload/includes/email_templates/welcome_messege.template.php create mode 100644 upload/includes/flv_player.php create mode 100644 upload/includes/functions.php create mode 100644 upload/includes/functions_db.php create mode 100644 upload/includes/index.php create mode 100644 upload/includes/langs/en.lang create mode 100644 upload/includes/languages.php create mode 100644 upload/includes/modules.php create mode 100644 upload/includes/plugin.functions.php create mode 100644 upload/includes/plugins.php create mode 100644 upload/includes/plugins_functions.php create mode 100644 upload/includes/templatelib/Config_File.class.php create mode 100644 upload/includes/templatelib/Template.class.php create mode 100644 upload/includes/templatelib/Template_Compiler.class.php create mode 100644 upload/includes/templatelib/debug.tpl create mode 100644 upload/includes/templatelib/footer.html create mode 100644 upload/includes/templatelib/header.html create mode 100644 upload/includes/templatelib/index.php create mode 100644 upload/includes/templatelib/internals/core.assemble_plugin_filepath.php create mode 100644 upload/includes/templatelib/internals/core.assign_smarty_interface.php create mode 100644 upload/includes/templatelib/internals/core.create_dir_structure.php create mode 100644 upload/includes/templatelib/internals/core.display_debug_console.php create mode 100644 upload/includes/templatelib/internals/core.get_include_path.php create mode 100644 upload/includes/templatelib/internals/core.get_microtime.php create mode 100644 upload/includes/templatelib/internals/core.get_php_resource.php create mode 100644 upload/includes/templatelib/internals/core.is_secure.php create mode 100644 upload/includes/templatelib/internals/core.is_trusted.php create mode 100644 upload/includes/templatelib/internals/core.load_plugins.php create mode 100644 upload/includes/templatelib/internals/core.load_resource_plugin.php create mode 100644 upload/includes/templatelib/internals/core.process_cached_inserts.php create mode 100644 upload/includes/templatelib/internals/core.process_compiled_include.php create mode 100644 upload/includes/templatelib/internals/core.read_cache_file.php create mode 100644 upload/includes/templatelib/internals/core.rm_auto.php create mode 100644 upload/includes/templatelib/internals/core.rmdir.php create mode 100644 upload/includes/templatelib/internals/core.run_insert_handler.php create mode 100644 upload/includes/templatelib/internals/core.smarty_include_php.php create mode 100644 upload/includes/templatelib/internals/core.write_cache_file.php create mode 100644 upload/includes/templatelib/internals/core.write_compiled_include.php create mode 100644 upload/includes/templatelib/internals/core.write_compiled_resource.php create mode 100644 upload/includes/templatelib/internals/core.write_file.php create mode 100644 upload/includes/templatelib/plugins/block.textformat.php create mode 100644 upload/includes/templatelib/plugins/compiler.assign.php create mode 100644 upload/includes/templatelib/plugins/function.assign_debug_info.php create mode 100644 upload/includes/templatelib/plugins/function.config_load.php create mode 100644 upload/includes/templatelib/plugins/function.counter.php create mode 100644 upload/includes/templatelib/plugins/function.cycle.php create mode 100644 upload/includes/templatelib/plugins/function.debug.php create mode 100644 upload/includes/templatelib/plugins/function.eval.php create mode 100644 upload/includes/templatelib/plugins/function.fetch.php create mode 100644 upload/includes/templatelib/plugins/function.html_checkboxes.php create mode 100644 upload/includes/templatelib/plugins/function.html_image.php create mode 100644 upload/includes/templatelib/plugins/function.html_options.php create mode 100644 upload/includes/templatelib/plugins/function.html_radios.php create mode 100644 upload/includes/templatelib/plugins/function.html_select_date.php create mode 100644 upload/includes/templatelib/plugins/function.html_select_time.php create mode 100644 upload/includes/templatelib/plugins/function.html_table.php create mode 100644 upload/includes/templatelib/plugins/function.mailto.php create mode 100644 upload/includes/templatelib/plugins/function.math.php create mode 100644 upload/includes/templatelib/plugins/function.popup.php create mode 100644 upload/includes/templatelib/plugins/function.popup_init.php create mode 100644 upload/includes/templatelib/plugins/modifier.capitalize.php create mode 100644 upload/includes/templatelib/plugins/modifier.cat.php create mode 100644 upload/includes/templatelib/plugins/modifier.count_characters.php create mode 100644 upload/includes/templatelib/plugins/modifier.count_paragraphs.php create mode 100644 upload/includes/templatelib/plugins/modifier.count_sentences.php create mode 100644 upload/includes/templatelib/plugins/modifier.count_words.php create mode 100644 upload/includes/templatelib/plugins/modifier.date_format.php create mode 100644 upload/includes/templatelib/plugins/modifier.debug_print_var.php create mode 100644 upload/includes/templatelib/plugins/modifier.default.php create mode 100644 upload/includes/templatelib/plugins/modifier.escape.php create mode 100644 upload/includes/templatelib/plugins/modifier.indent.php create mode 100644 upload/includes/templatelib/plugins/modifier.lower.php create mode 100644 upload/includes/templatelib/plugins/modifier.nl2br.php create mode 100644 upload/includes/templatelib/plugins/modifier.regex_replace.php create mode 100644 upload/includes/templatelib/plugins/modifier.replace.php create mode 100644 upload/includes/templatelib/plugins/modifier.spacify.php create mode 100644 upload/includes/templatelib/plugins/modifier.string_format.php create mode 100644 upload/includes/templatelib/plugins/modifier.strip.php create mode 100644 upload/includes/templatelib/plugins/modifier.strip_tags.php create mode 100644 upload/includes/templatelib/plugins/modifier.truncate.php create mode 100644 upload/includes/templatelib/plugins/modifier.upper.php create mode 100644 upload/includes/templatelib/plugins/modifier.wordwrap.php create mode 100644 upload/includes/templatelib/plugins/outputfilter.trimwhitespace.php create mode 100644 upload/includes/templatelib/plugins/shared.escape_special_chars.php create mode 100644 upload/includes/templatelib/plugins/shared.make_timestamp.php create mode 100644 upload/includes/upload_forms.php create mode 100644 upload/includes/whois/whois.php create mode 100644 upload/index.php create mode 100644 upload/invite_group.php create mode 100644 upload/js/admin_functions.js create mode 100644 upload/js/embed_video_mod/functions.js create mode 100644 upload/js/functions.js create mode 100644 upload/js/jquery.js create mode 100644 upload/js/jquery_plugs/ZeroClipboard.swf create mode 100644 upload/js/jquery_plugs/cb.tabs.js create mode 100644 upload/js/jquery_plugs/chili-1.7.pack.js create mode 100644 upload/js/jquery_plugs/compressed/datepicker.js.php create mode 100644 upload/js/jquery_plugs/compressed/eye.js create mode 100644 upload/js/jquery_plugs/compressed/hover_intent.js create mode 100644 upload/js/jquery_plugs/compressed/jeditable.js create mode 100644 upload/js/jquery_plugs/compressed/jquery.jCarousel.js create mode 100644 upload/js/jquery_plugs/compressed/jquery.scrollTo-min.js create mode 100644 upload/js/jquery_plugs/compressed/layout.js create mode 100644 upload/js/jquery_plugs/compressed/utils.js create mode 100644 upload/js/jquery_plugs/cookie.js create mode 100644 upload/js/jquery_plugs/counter.min.js create mode 100644 upload/js/jquery_plugs/css/bg.gif create mode 100644 upload/js/jquery_plugs/css/image.png create mode 100644 upload/js/jquery_plugs/css/jquery.tooltip.css create mode 100644 upload/js/jquery_plugs/css/karte.png create mode 100644 upload/js/jquery_plugs/css/screen.css create mode 100644 upload/js/jquery_plugs/css/shadow.png create mode 100644 upload/js/jquery_plugs/css/shadow2-reverse.png create mode 100644 upload/js/jquery_plugs/css/shadow2.png create mode 100644 upload/js/jquery_plugs/css/tipsy.css create mode 100644 upload/js/jquery_plugs/css/tipsy.gif create mode 100644 upload/js/jquery_plugs/datepicker.js create mode 100644 upload/js/jquery_plugs/eye.js create mode 100644 upload/js/jquery_plugs/hover_intent.js create mode 100644 upload/js/jquery_plugs/jquery.bgiframe.js create mode 100644 upload/js/jquery_plugs/jquery.delegate.js create mode 100644 upload/js/jquery_plugs/jquery.dimensions.js create mode 100644 upload/js/jquery_plugs/jquery.tipsy.js create mode 100644 upload/js/jquery_plugs/jquery.tooltip.pack.js create mode 100644 upload/js/jquery_plugs/layout.js create mode 100644 upload/js/jquery_plugs/timer.js create mode 100644 upload/js/jquery_plugs/utils.js create mode 100644 upload/js/nicedit/nicEdit.js create mode 100644 upload/js/nicedit/nicEditorIcons.gif create mode 100644 upload/js/slidemenu.js create mode 100644 upload/js/swfobj.js.php create mode 100644 upload/js/swfobject.js create mode 100644 upload/js/swfobject.obj.js create mode 100644 upload/js/ui/css/ui-lightness/images/ui-bg_diagonals-thick_18_b81900_40x40.png create mode 100644 upload/js/ui/css/ui-lightness/images/ui-bg_diagonals-thick_20_666666_40x40.png create mode 100644 upload/js/ui/css/ui-lightness/images/ui-bg_flat_10_000000_40x100.png create mode 100644 upload/js/ui/css/ui-lightness/images/ui-bg_flat_55_0099cc_40x100.png create mode 100644 upload/js/ui/css/ui-lightness/images/ui-bg_flat_55_999999_40x100.png create mode 100644 upload/js/ui/css/ui-lightness/images/ui-bg_flat_75_aaaaaa_40x100.png create mode 100644 upload/js/ui/css/ui-lightness/images/ui-bg_glass_100_f6f6f6_1x400.png create mode 100644 upload/js/ui/css/ui-lightness/images/ui-bg_glass_100_fdf5ce_1x400.png create mode 100644 upload/js/ui/css/ui-lightness/images/ui-bg_glass_45_0078ae_1x400.png create mode 100644 upload/js/ui/css/ui-lightness/images/ui-bg_glass_65_ffffff_1x400.png create mode 100644 upload/js/ui/css/ui-lightness/images/ui-bg_glass_75_79c9ec_1x400.png create mode 100644 upload/js/ui/css/ui-lightness/images/ui-bg_gloss-wave_35_f6a828_500x100.png create mode 100644 upload/js/ui/css/ui-lightness/images/ui-bg_gloss-wave_45_e14f1c_500x100.png create mode 100644 upload/js/ui/css/ui-lightness/images/ui-bg_gloss-wave_75_2191c0_500x100.png create mode 100644 upload/js/ui/css/ui-lightness/images/ui-bg_highlight-soft_100_eeeeee_1x100.png create mode 100644 upload/js/ui/css/ui-lightness/images/ui-bg_highlight-soft_50_333333_1x100.png create mode 100644 upload/js/ui/css/ui-lightness/images/ui-bg_highlight-soft_75_ffe45c_1x100.png create mode 100644 upload/js/ui/css/ui-lightness/images/ui-bg_inset-hard_100_fcfdfd_1x100.png create mode 100644 upload/js/ui/css/ui-lightness/images/ui-icons_0078ae_256x240.png create mode 100644 upload/js/ui/css/ui-lightness/images/ui-icons_056b93_256x240.png create mode 100644 upload/js/ui/css/ui-lightness/images/ui-icons_222222_256x240.png create mode 100644 upload/js/ui/css/ui-lightness/images/ui-icons_228ef1_256x240.png create mode 100644 upload/js/ui/css/ui-lightness/images/ui-icons_292724_256x240.png create mode 100644 upload/js/ui/css/ui-lightness/images/ui-icons_75e5f5_256x240.png create mode 100644 upload/js/ui/css/ui-lightness/images/ui-icons_d8e7f3_256x240.png create mode 100644 upload/js/ui/css/ui-lightness/images/ui-icons_e0fdff_256x240.png create mode 100644 upload/js/ui/css/ui-lightness/images/ui-icons_ef8c08_256x240.png create mode 100644 upload/js/ui/css/ui-lightness/images/ui-icons_fcd113_256x240.png create mode 100644 upload/js/ui/css/ui-lightness/images/ui-icons_ffd27a_256x240.png create mode 100644 upload/js/ui/css/ui-lightness/images/ui-icons_ffffff_256x240.png create mode 100644 upload/js/ui/css/ui-lightness/jquery-ui-1.7.2.custom.css create mode 100644 upload/js/ui/jquery-ui-1.7.2.custom.min.js create mode 100644 upload/js/ui/jquery-ui.js create mode 100644 upload/js/uploadify/jquery.uploadify.v2.1.4.js create mode 100644 upload/js/uploadify/jquery.uploadify.v2.1.4.min.js create mode 100644 upload/js/uploadify/swfobject.js create mode 100644 upload/js/uploadify/uploadify.allglyphs.swf create mode 100644 upload/js/uploadify/uploadify.css create mode 100644 upload/js/uploadify/uploadify.swf create mode 100644 upload/logout.php create mode 100644 upload/manage_collections.php create mode 100644 upload/manage_contacts.php create mode 100644 upload/manage_groups.php create mode 100644 upload/manage_photos.php create mode 100644 upload/manage_playlists.php create mode 100644 upload/manage_videos.php create mode 100644 upload/module.php create mode 100644 upload/myaccount.php create mode 100644 upload/opensearch.php create mode 100644 upload/photo_upload.php create mode 100644 upload/photos.php create mode 100644 upload/player/cbplayer/cbplayer.html create mode 100644 upload/player/cbplayer/cbplayer.js create mode 100644 upload/player/cbplayer/cbplayer.php create mode 100644 upload/player/cbplayer/cbplayer.plugin.php create mode 100644 upload/player/cbplayer/cbplayer_header.html create mode 100644 upload/player/cbplayer/embed_player.php create mode 100644 upload/player/cbplayer/player.swf create mode 100644 upload/player/cbplayer/plugins/hd.swf create mode 100644 upload/player/cbplayer/plugins/related/related.js create mode 100644 upload/player/cbplayer/plugins/related/related.swf create mode 100644 upload/player/cbplayer/plugins/related/related.xml create mode 100644 upload/player/cbplayer/plugins/related/related_videos.php create mode 100644 upload/player/cbplayer/preview.jpg create mode 100644 upload/player/cbplayer/skins/glow/controlbar/background.png create mode 100644 upload/player/cbplayer/skins/glow/controlbar/blankButton.png create mode 100644 upload/player/cbplayer/skins/glow/controlbar/divider.png create mode 100644 upload/player/cbplayer/skins/glow/controlbar/fullscreenButton.png create mode 100644 upload/player/cbplayer/skins/glow/controlbar/fullscreenButtonOver.png create mode 100644 upload/player/cbplayer/skins/glow/controlbar/muteButton.png create mode 100644 upload/player/cbplayer/skins/glow/controlbar/muteButtonOver.png create mode 100644 upload/player/cbplayer/skins/glow/controlbar/normalscreenButton.png create mode 100644 upload/player/cbplayer/skins/glow/controlbar/normalscreenButtonOver.png create mode 100644 upload/player/cbplayer/skins/glow/controlbar/pauseButton.png create mode 100644 upload/player/cbplayer/skins/glow/controlbar/pauseButtonOver.png create mode 100644 upload/player/cbplayer/skins/glow/controlbar/playButton.png create mode 100644 upload/player/cbplayer/skins/glow/controlbar/playButtonOver.png create mode 100644 upload/player/cbplayer/skins/glow/controlbar/timeSliderBuffer.png create mode 100644 upload/player/cbplayer/skins/glow/controlbar/timeSliderCapLeft.png create mode 100644 upload/player/cbplayer/skins/glow/controlbar/timeSliderCapRight.png create mode 100644 upload/player/cbplayer/skins/glow/controlbar/timeSliderProgress.png create mode 100644 upload/player/cbplayer/skins/glow/controlbar/timeSliderRail.png create mode 100644 upload/player/cbplayer/skins/glow/controlbar/unmuteButton.png create mode 100644 upload/player/cbplayer/skins/glow/controlbar/unmuteButtonOver.png create mode 100644 upload/player/cbplayer/skins/glow/controlbar/volumeSliderBuffer.png create mode 100644 upload/player/cbplayer/skins/glow/controlbar/volumeSliderProgress.png create mode 100644 upload/player/cbplayer/skins/glow/controlbar/volumeSliderRail.png create mode 100644 upload/player/cbplayer/skins/glow/display/background.png create mode 100644 upload/player/cbplayer/skins/glow/display/bufferIcon.png create mode 100644 upload/player/cbplayer/skins/glow/display/muteIcon.png create mode 100644 upload/player/cbplayer/skins/glow/display/playIcon.png create mode 100644 upload/player/cbplayer/skins/glow/dock/button.png create mode 100644 upload/player/cbplayer/skins/glow/glow.xml create mode 100644 upload/player/cbplayer/skins/glow/playlist/item.png create mode 100644 upload/player/cbplayer/skins/glow/playlist/itemOver.png create mode 100644 upload/player/cbplayer/skins/glow/playlist/sliderCapBottom.png create mode 100644 upload/player/cbplayer/skins/glow/playlist/sliderCapTop.png create mode 100644 upload/player/cbplayer/skins/glow/playlist/sliderRail.png create mode 100644 upload/player/cbplayer/skins/glow/playlist/sliderThumb.png create mode 100644 upload/player/cbplayer/skins/glow/sharing/embedScreen.png create mode 100644 upload/player/cbplayer/skins/glow/sharing/shareScreen.png create mode 100644 upload/player/embed_player.php create mode 100644 upload/player/logo.png create mode 100644 upload/player/open-flash-chart.swf create mode 100644 upload/player/pak_player/PakPlayer.png create mode 100644 upload/player/pak_player/bg.png create mode 100644 upload/player/pak_player/embed_player.php create mode 100644 upload/player/pak_player/pak_player.php create mode 100644 upload/player/pak_player/pakplayer.controls.swf create mode 100644 upload/player/pak_player/pakplayer.pseudo.swf create mode 100644 upload/player/pak_player/pakplayer.swf create mode 100644 upload/player/pak_player/pakplayer.unlimited.swf create mode 100644 upload/player/pak_player/pakplayer.youtube.swf create mode 100644 upload/player/pak_player/play.png create mode 100644 upload/player/pak_player/player.html create mode 100644 upload/player/pak_player/pplayer.js create mode 100644 upload/player/pak_player/pplayer_head.html create mode 100644 upload/player/pak_player/preview.png create mode 100644 upload/player/player.html create mode 100644 upload/plugins/cb_bbcodes/cb_bbcode.php create mode 100644 upload/plugins/cb_bbcodes/images/bold.gif create mode 100644 upload/plugins/cb_bbcodes/images/code.gif create mode 100644 upload/plugins/cb_bbcodes/images/italic.gif create mode 100644 upload/plugins/cb_bbcodes/images/link.gif create mode 100644 upload/plugins/cb_bbcodes/images/ordered.gif create mode 100644 upload/plugins/cb_bbcodes/images/picture.gif create mode 100644 upload/plugins/cb_bbcodes/images/quote.gif create mode 100644 upload/plugins/cb_bbcodes/images/underline.gif create mode 100644 upload/plugins/cb_bbcodes/images/unlink.gif create mode 100644 upload/plugins/cb_bbcodes/styles.css create mode 100644 upload/plugins/cb_link_video/cb_link_video.php create mode 100644 upload/plugins/cb_link_video/form.html create mode 100644 upload/plugins/cb_link_video/header.html create mode 100644 upload/plugins/cb_link_video/install_cb_link_video.php create mode 100644 upload/plugins/cb_link_video/uninstall_cb_link_video.php create mode 100644 upload/plugins/cb_modules/cb_modules.php create mode 100644 upload/plugins/cb_modules/css.html create mode 100644 upload/plugins/cb_modules/images/social_icons/blogger.png create mode 100644 upload/plugins/cb_modules/images/social_icons/delicious.png create mode 100644 upload/plugins/cb_modules/images/social_icons/digg.png create mode 100644 upload/plugins/cb_modules/images/social_icons/facebook.png create mode 100644 upload/plugins/cb_modules/images/social_icons/heart.png create mode 100644 upload/plugins/cb_modules/images/social_icons/myspace.png create mode 100644 upload/plugins/cb_modules/images/social_icons/reddit.png create mode 100644 upload/plugins/cb_modules/images/social_icons/stumbleupon.png create mode 100644 upload/plugins/cb_modules/images/social_icons/technorati.png create mode 100644 upload/plugins/cb_modules/images/social_icons/twitter.png create mode 100644 upload/plugins/cb_modules/images/social_icons/wordpress.png create mode 100644 upload/plugins/cb_modules/images/social_icons/yahoo.png create mode 100644 upload/plugins/character_counter.php create mode 100644 upload/plugins/clipbucket_helper/admin/cron_jobs.html create mode 100644 upload/plugins/clipbucket_helper/admin/cron_jobs.php create mode 100644 upload/plugins/clipbucket_helper/clipbucket_helper.php create mode 100644 upload/plugins/comment_censor.php create mode 100644 upload/plugins/custom_fields/custom_fields.php create mode 100644 upload/plugins/custom_fields/install_custom_fields.php create mode 100644 upload/plugins/custom_fields/uninstall_custom_fields.php create mode 100644 upload/plugins/editors_pick/editors_picks.php create mode 100644 upload/plugins/editors_pick/get_ep_video.php create mode 100644 upload/plugins/editors_pick/header.html create mode 100644 upload/plugins/editors_pick/install_editors_picks.php create mode 100644 upload/plugins/editors_pick/uninstall_editors_picks.php create mode 100644 upload/plugins/embed_video_mod/embed_video_mod.php create mode 100644 upload/plugins/embed_video_mod/form.html create mode 100644 upload/plugins/embed_video_mod/header.html create mode 100644 upload/plugins/embed_video_mod/install_embed_video_mod.php create mode 100644 upload/plugins/embed_video_mod/uninstall_embed_video_mod.php create mode 100644 upload/plugins/global_announcement/global_announcement.php create mode 100644 upload/plugins/global_announcement/install_global_announcement.php create mode 100644 upload/plugins/global_announcement/uninstall_global_announcement.php create mode 100644 upload/plugins/pakplayer/admin/pakplayer.html create mode 100644 upload/plugins/pakplayer/admin/pakplayer.php create mode 100644 upload/plugins/pakplayer/header.html create mode 100644 upload/plugins/pakplayer/install_pakplayer.php create mode 100644 upload/plugins/pakplayer/pakplayer.php create mode 100644 upload/plugins/pakplayer/uninstall_pakplayer.php create mode 100644 upload/plugins/recaptcha/captcha.html create mode 100644 upload/plugins/recaptcha/install_recaptcha.php create mode 100644 upload/plugins/recaptcha/reCaptcha_header.html create mode 100644 upload/plugins/recaptcha/recaptcha.php create mode 100644 upload/plugins/recaptcha/recaptchalib.php create mode 100644 upload/plugins/recaptcha/uninstall_recaptcha.php create mode 100644 upload/plugins/signup_captcha/captcha.php create mode 100644 upload/plugins/signup_captcha/captcha/class.files.php create mode 100644 upload/plugins/signup_captcha/captcha/class.img_validator.php create mode 100644 upload/plugins/signup_captcha/captcha/class.img_validator.php.bak create mode 100644 upload/plugins/signup_captcha/captcha/index.php create mode 100644 upload/plugins/signup_captcha/img/bg1.jpg create mode 100644 upload/plugins/signup_captcha/img/bg2.jpg create mode 100644 upload/plugins/signup_captcha/img/bg3.jpg create mode 100644 upload/plugins/signup_captcha/img/bg4.jpg create mode 100644 upload/plugins/signup_captcha/img/fonts/arial.ttf create mode 100644 upload/plugins/signup_captcha/img/fonts/comicbd.ttf create mode 100644 upload/plugins/signup_captcha/img/fonts/impact.ttf create mode 100644 upload/plugins/signup_captcha/img/fonts/monofont.ttf create mode 100644 upload/plugins/signup_captcha/img/fonts/verdana.ttf create mode 100644 upload/plugins/signup_captcha/signup_captcha.php create mode 100644 upload/privacy.php create mode 100644 upload/private_message.php create mode 100644 upload/readme create mode 100644 upload/rss.php create mode 100644 upload/search_result.php create mode 100644 upload/signup.php create mode 100644 upload/sitemap.php create mode 100644 upload/styles/.htaccess create mode 100644 upload/styles/cbv2new/images/ajax-loader-big.gif create mode 100644 upload/styles/cbv2new/images/ajax-loader.gif create mode 100644 upload/styles/cbv2new/images/alert.png create mode 100644 upload/styles/cbv2new/images/big_stars.png create mode 100644 upload/styles/cbv2new/images/blocks.png create mode 100644 upload/styles/cbv2new/images/buttons.png create mode 100644 upload/styles/cbv2new/images/cancel.png create mode 100644 upload/styles/cbv2new/images/cancel_upload.png create mode 100644 upload/styles/cbv2new/images/category_buttons.png create mode 100644 upload/styles/cbv2new/images/cb_button.png create mode 100644 upload/styles/cbv2new/images/clean.png create mode 100644 upload/styles/cbv2new/images/cross.png create mode 100644 upload/styles/cbv2new/images/dot.gif create mode 100644 upload/styles/cbv2new/images/dow.png create mode 100644 upload/styles/cbv2new/images/down.png create mode 100644 upload/styles/cbv2new/images/error.png create mode 100644 upload/styles/cbv2new/images/feature_bg.png create mode 100644 upload/styles/cbv2new/images/foot_search.png create mode 100644 upload/styles/cbv2new/images/forget.png create mode 100644 upload/styles/cbv2new/images/gradients.png create mode 100644 upload/styles/cbv2new/images/group/add.png create mode 100644 upload/styles/cbv2new/images/hq.png create mode 100644 upload/styles/cbv2new/images/icon.png create mode 100644 upload/styles/cbv2new/images/icons.png create mode 100644 upload/styles/cbv2new/images/icons/balloon-small.png create mode 100644 upload/styles/cbv2new/images/icons/balloons-box.png create mode 100644 upload/styles/cbv2new/images/icons/black-user.png create mode 100644 upload/styles/cbv2new/images/icons/blue-document.png create mode 100644 upload/styles/cbv2new/images/icons/calender.png create mode 100644 upload/styles/cbv2new/images/icons/camcorder.png create mode 100644 upload/styles/cbv2new/images/icons/collection.png create mode 100644 upload/styles/cbv2new/images/icons/comment.png create mode 100644 upload/styles/cbv2new/images/icons/comments_small.png create mode 100644 upload/styles/cbv2new/images/icons/cross.png create mode 100644 upload/styles/cbv2new/images/icons/delete.png create mode 100644 upload/styles/cbv2new/images/icons/embed_small.png create mode 100644 upload/styles/cbv2new/images/icons/group.png create mode 100644 upload/styles/cbv2new/images/icons/heart.png create mode 100644 upload/styles/cbv2new/images/icons/heart_small.png create mode 100644 upload/styles/cbv2new/images/icons/image.png create mode 100644 upload/styles/cbv2new/images/icons/images.png create mode 100644 upload/styles/cbv2new/images/icons/photo.png create mode 100644 upload/styles/cbv2new/images/icons/photos.png create mode 100644 upload/styles/cbv2new/images/icons/playlist.png create mode 100644 upload/styles/cbv2new/images/icons/playlist_small.png create mode 100644 upload/styles/cbv2new/images/icons/quicklist_check_small.png create mode 100644 upload/styles/cbv2new/images/icons/quicklist_small.png create mode 100644 upload/styles/cbv2new/images/icons/report_small.png create mode 100644 upload/styles/cbv2new/images/icons/share_small.png create mode 100644 upload/styles/cbv2new/images/icons/shield.png create mode 100644 upload/styles/cbv2new/images/icons/star.png create mode 100644 upload/styles/cbv2new/images/icons/user.png create mode 100644 upload/styles/cbv2new/images/icons/user_add.png create mode 100644 upload/styles/cbv2new/images/icons/user_comment.png create mode 100644 upload/styles/cbv2new/images/icons/video.png create mode 100644 upload/styles/cbv2new/images/line_sps.png create mode 100644 upload/styles/cbv2new/images/log_button.png create mode 100644 upload/styles/cbv2new/images/login_button.png create mode 100644 upload/styles/cbv2new/images/login_grad.png create mode 100644 upload/styles/cbv2new/images/logo.png create mode 100644 upload/styles/cbv2new/images/logo348x53.png create mode 100644 upload/styles/cbv2new/images/main_bg.png create mode 100644 upload/styles/cbv2new/images/main_box.png create mode 100644 upload/styles/cbv2new/images/main_vid_bg.png create mode 100644 upload/styles/cbv2new/images/messagebox_warning.png create mode 100644 upload/styles/cbv2new/images/nav_grads.png create mode 100644 upload/styles/cbv2new/images/no_user.png create mode 100644 upload/styles/cbv2new/images/ok.png create mode 100644 upload/styles/cbv2new/images/ok_16.png create mode 100644 upload/styles/cbv2new/images/player.png create mode 100644 upload/styles/cbv2new/images/preview.png create mode 100644 upload/styles/cbv2new/images/private.png create mode 100644 upload/styles/cbv2new/images/quick_icon.png create mode 100644 upload/styles/cbv2new/images/search.png create mode 100644 upload/styles/cbv2new/images/search_footer.png create mode 100644 upload/styles/cbv2new/images/shadows.png create mode 100644 upload/styles/cbv2new/images/side_bg.png create mode 100644 upload/styles/cbv2new/images/simple_gradient.png create mode 100644 upload/styles/cbv2new/images/small_stars.png create mode 100644 upload/styles/cbv2new/images/stars.png create mode 100644 upload/styles/cbv2new/images/tabs_bg.png create mode 100644 upload/styles/cbv2new/images/tabs_sp.png create mode 100644 upload/styles/cbv2new/images/tag_blue.png create mode 100644 upload/styles/cbv2new/images/thumbs.png create mode 100644 upload/styles/cbv2new/images/thumbs/group_thumb-small.png create mode 100644 upload/styles/cbv2new/images/thumbs/group_thumb.png create mode 100644 upload/styles/cbv2new/images/thumbs/no_avatar-small.png create mode 100644 upload/styles/cbv2new/images/thumbs/no_avatar.png create mode 100644 upload/styles/cbv2new/images/thumbs/processing.png create mode 100644 upload/styles/cbv2new/images/top_user.png create mode 100644 upload/styles/cbv2new/images/top_users_grad.png create mode 100644 upload/styles/cbv2new/images/up.png create mode 100644 upload/styles/cbv2new/images/up_down.png create mode 100644 upload/styles/cbv2new/images/upload_bg.png create mode 100644 upload/styles/cbv2new/images/uploading_bar.png create mode 100644 upload/styles/cbv2new/images/verticle_bg.png create mode 100644 upload/styles/cbv2new/images/view_channel.png create mode 100644 upload/styles/cbv2new/images/watch_video_bars.png create mode 100644 upload/styles/cbv2new/images/watch_video_details_bg.png create mode 100644 upload/styles/cbv2new/layout/403.html create mode 100644 upload/styles/cbv2new/layout/404.html create mode 100644 upload/styles/cbv2new/layout/activation.html create mode 100644 upload/styles/cbv2new/layout/add_group_videos.html create mode 100644 upload/styles/cbv2new/layout/blocked.html create mode 100644 upload/styles/cbv2new/layout/blocks/category_list.html create mode 100644 upload/styles/cbv2new/layout/blocks/collection.html create mode 100644 upload/styles/cbv2new/layout/blocks/collection_form.html create mode 100644 upload/styles/cbv2new/layout/blocks/comments/add_comment.html create mode 100644 upload/styles/cbv2new/layout/blocks/comments/comment.html create mode 100644 upload/styles/cbv2new/layout/blocks/comments/comments.html create mode 100644 upload/styles/cbv2new/layout/blocks/editor_pick/index_featured_video.html create mode 100644 upload/styles/cbv2new/layout/blocks/editor_pick/video_block.html create mode 100644 upload/styles/cbv2new/layout/blocks/feed.html create mode 100644 upload/styles/cbv2new/layout/blocks/flag_form.html create mode 100644 upload/styles/cbv2new/layout/blocks/group.html create mode 100644 upload/styles/cbv2new/layout/blocks/group/add_topic.html create mode 100644 upload/styles/cbv2new/layout/blocks/group/group_header.html create mode 100644 upload/styles/cbv2new/layout/blocks/group/group_left.html create mode 100644 upload/styles/cbv2new/layout/blocks/group/group_right.html create mode 100644 upload/styles/cbv2new/layout/blocks/group/group_topics.html create mode 100644 upload/styles/cbv2new/layout/blocks/manage/account_collections.html create mode 100644 upload/styles/cbv2new/layout/blocks/manage/account_group.html create mode 100644 upload/styles/cbv2new/layout/blocks/manage/account_head.html create mode 100644 upload/styles/cbv2new/layout/blocks/manage/account_left.html create mode 100644 upload/styles/cbv2new/layout/blocks/manage/account_photo.html create mode 100644 upload/styles/cbv2new/layout/blocks/manage/account_user.html create mode 100644 upload/styles/cbv2new/layout/blocks/manage/account_video.html create mode 100644 upload/styles/cbv2new/layout/blocks/manage/group_manage_links.html create mode 100644 upload/styles/cbv2new/layout/blocks/manage/user_account_pagination.html create mode 100644 upload/styles/cbv2new/layout/blocks/new_pagination.html create mode 100644 upload/styles/cbv2new/layout/blocks/pagination.html create mode 100644 upload/styles/cbv2new/layout/blocks/photo.html create mode 100644 upload/styles/cbv2new/layout/blocks/playlist_form.html create mode 100644 upload/styles/cbv2new/layout/blocks/pm/messages.html create mode 100644 upload/styles/cbv2new/layout/blocks/quicklist/block.html create mode 100644 upload/styles/cbv2new/layout/blocks/quicklist/video_block.html create mode 100644 upload/styles/cbv2new/layout/blocks/rating.html create mode 100644 upload/styles/cbv2new/layout/blocks/share_form.html create mode 100644 upload/styles/cbv2new/layout/blocks/subscriptions.html create mode 100644 upload/styles/cbv2new/layout/blocks/upload/form.html create mode 100644 upload/styles/cbv2new/layout/blocks/upload/photo_form.html create mode 100644 upload/styles/cbv2new/layout/blocks/upload_head.html create mode 100644 upload/styles/cbv2new/layout/blocks/user.html create mode 100644 upload/styles/cbv2new/layout/blocks/video.html create mode 100644 upload/styles/cbv2new/layout/blocks/view_channel/channel_global.html create mode 100644 upload/styles/cbv2new/layout/blocks/view_channel/channel_item.html create mode 100644 upload/styles/cbv2new/layout/blocks/view_channel/channel_left.html create mode 100644 upload/styles/cbv2new/layout/blocks/view_channel/channel_top.html create mode 100644 upload/styles/cbv2new/layout/blocks/view_channel/user_block.html create mode 100644 upload/styles/cbv2new/layout/blocks/watch_video/playlist_box.html create mode 100644 upload/styles/cbv2new/layout/blocks/watch_video/video_box.html create mode 100644 upload/styles/cbv2new/layout/blocks/watch_video/video_password.html create mode 100644 upload/styles/cbv2new/layout/body.html create mode 100644 upload/styles/cbv2new/layout/channels.html create mode 100644 upload/styles/cbv2new/layout/collections.html create mode 100644 upload/styles/cbv2new/layout/contact.html create mode 100644 upload/styles/cbv2new/layout/create_group.html create mode 100644 upload/styles/cbv2new/layout/download.html create mode 100644 upload/styles/cbv2new/layout/edit_account.html create mode 100644 upload/styles/cbv2new/layout/edit_group.html create mode 100644 upload/styles/cbv2new/layout/edit_photo.html create mode 100644 upload/styles/cbv2new/layout/edit_video.html create mode 100644 upload/styles/cbv2new/layout/footer.html create mode 100644 upload/styles/cbv2new/layout/forgot.html create mode 100644 upload/styles/cbv2new/layout/global_header.html create mode 100644 upload/styles/cbv2new/layout/groups.html create mode 100644 upload/styles/cbv2new/layout/header.html create mode 100644 upload/styles/cbv2new/layout/index.html create mode 100644 upload/styles/cbv2new/layout/manage_collections.html create mode 100644 upload/styles/cbv2new/layout/manage_contacts.html create mode 100644 upload/styles/cbv2new/layout/manage_groups.html create mode 100644 upload/styles/cbv2new/layout/manage_photos.html create mode 100644 upload/styles/cbv2new/layout/manage_playlists.html create mode 100644 upload/styles/cbv2new/layout/manage_videos.html create mode 100644 upload/styles/cbv2new/layout/message.html create mode 100644 upload/styles/cbv2new/layout/myaccount.html create mode 100644 upload/styles/cbv2new/layout/photo_upload.html create mode 100644 upload/styles/cbv2new/layout/photos.html create mode 100644 upload/styles/cbv2new/layout/private_message.html create mode 100644 upload/styles/cbv2new/layout/search.html create mode 100644 upload/styles/cbv2new/layout/signup.html create mode 100644 upload/styles/cbv2new/layout/upload.html create mode 100644 upload/styles/cbv2new/layout/user_collections.html create mode 100644 upload/styles/cbv2new/layout/user_contacts.html create mode 100644 upload/styles/cbv2new/layout/user_photos.html create mode 100644 upload/styles/cbv2new/layout/user_videos.html create mode 100644 upload/styles/cbv2new/layout/videos.html create mode 100644 upload/styles/cbv2new/layout/view_channel.html create mode 100644 upload/styles/cbv2new/layout/view_collection.html create mode 100644 upload/styles/cbv2new/layout/view_group.html create mode 100644 upload/styles/cbv2new/layout/view_item.html create mode 100644 upload/styles/cbv2new/layout/view_page.html create mode 100644 upload/styles/cbv2new/layout/view_photo.html create mode 100644 upload/styles/cbv2new/layout/view_topic.html create mode 100644 upload/styles/cbv2new/layout/watch_video.html create mode 100644 upload/styles/cbv2new/template.xml create mode 100644 upload/styles/cbv2new/theme/ie7.css create mode 100644 upload/styles/cbv2new/theme/main.css create mode 100644 upload/styles/cbv2new/theme/rating.css create mode 100644 upload/styles/cbv2new/theme/view_channel.css create mode 100644 upload/styles/global/admin_bar.html create mode 100644 upload/styles/global/head.html create mode 100644 upload/styles/global/jquery_ui.css create mode 100644 upload/styles/global/upload_form.html create mode 100644 upload/upload.php create mode 100644 upload/user_collections.php create mode 100644 upload/user_contacts.php create mode 100644 upload/user_photos.php create mode 100644 upload/user_videos.php create mode 100644 upload/videos.php create mode 100644 upload/view_channel.php create mode 100644 upload/view_collection.php create mode 100644 upload/view_group.php create mode 100644 upload/view_group_members.php create mode 100644 upload/view_group_videos.php create mode 100644 upload/view_item.php create mode 100644 upload/view_page.php create mode 100644 upload/view_topic.php create mode 100644 upload/watch_video.php diff --git a/upload/.htaccess b/upload/.htaccess new file mode 100644 index 00000000..c8abead3 --- /dev/null +++ b/upload/.htaccess @@ -0,0 +1,112 @@ +# +# secfilterengine off +# secfilterscanPOST off +# + +Options All -Indexes +FileETag MTime Size +Options +FollowSymlinks +RewriteEngine on + + +order allow,deny +satisfy all + + +########## Begin - Rewrite rules to block out some common exploits +# +# Block out any script trying to set a mosConfig value through the URL +RewriteCond %{QUERY_STRING} mosConfig_[a-zA-Z_]{1,21}(=|\%3D) [OR] +# Block out any script trying to base64_encode crap to send via URL +RewriteCond %{QUERY_STRING} base64_encode.*\(.*\) [OR] +# Block out any script that includes a '; + + if( !isset( $open_flash_chart_seqno ) ) + { + $open_flash_chart_seqno = 1; + $out[] = ''; + } + else + { + $open_flash_chart_seqno++; + $obj_id .= '_'. $open_flash_chart_seqno; + $div_name .= '_'. $open_flash_chart_seqno; + } + + if( $use_swfobject ) + { + // Using library for auto-enabling Flash object on IE, disabled-Javascript proof + $out[] = '
'; + $out[] = ''; + $out[] = ''; + } + + return implode("\n",$out); +} +?> \ No newline at end of file diff --git a/upload/admin_area/charts/ofc-library/open-flash-chart.php b/upload/admin_area/charts/ofc-library/open-flash-chart.php new file mode 100644 index 00000000..2a90eaff --- /dev/null +++ b/upload/admin_area/charts/ofc-library/open-flash-chart.php @@ -0,0 +1,178 @@ +title = new title( "Many data lines" ); + $this->elements = array(); + } + + function set_title( $t ) + { + $this->title = $t; + } + + function set_x_axis( $x ) + { + $this->x_axis = $x; + } + + function set_y_axis( $y ) + { + $this->y_axis = $y; + } + + function add_y_axis( $y ) + { + $this->y_axis = $y; + } + + function set_y_axis_right( $y ) + { + $this->y_axis_right = $y; + } + + function add_element( $e ) + { + $this->elements[] = $e; + } + + function set_x_legend( $x ) + { + $this->x_legend = $x; + } + + function set_y_legend( $y ) + { + $this->y_legend = $y; + } + + function set_bg_colour( $colour ) + { + $this->bg_colour = $colour; + } + + function set_radar_axis( $radar ) + { + $this->radar_axis = $radar; + } + + function set_tooltip( $tooltip ) + { + $this->tooltip = $tooltip; + } + + /** + * This is a bit funky :( + * + * @param $num_decimals as integer. Truncate the decimals to $num_decimals, e.g. set it + * to 5 and 3.333333333 will display as 3.33333. 2.0 will display as 2 (or 2.00000 - see below) + * @param $is_fixed_num_decimals_forced as boolean. If true it will pad the decimals. + * @param $is_decimal_separator_comma as boolean + * @param $is_thousand_separator_disabled as boolean + * + * This needs a bit of love and attention + */ + function set_number_format($num_decimals, $is_fixed_num_decimals_forced, $is_decimal_separator_comma, $is_thousand_separator_disabled ) + { + $this->num_decimals = $num_decimals; + $this->is_fixed_num_decimals_forced = $is_fixed_num_decimals_forced; + $this->is_decimal_separator_comma = $is_decimal_separator_comma; + $this->is_thousand_separator_disabled = $is_thousand_separator_disabled; + } + + /** + * This is experimental and will change as we make it work + * + * @param $m as ofc_menu + */ + function set_menu($m) + { + $this->menu = $m; + } + + function toString() + { + if (function_exists('json_encode')) + { + return json_encode($this); + } + else + { + $json = new Services_JSON(); + return $json->encode( $this ); + } + } + + function toPrettyString() + { + return json_format( $this->toString() ); + } +} + + + +// +// there is no PHP end tag so we don't mess the headers up! +// \ No newline at end of file diff --git a/upload/admin_area/charts/users_activity.php b/upload/admin_area/charts/users_activity.php new file mode 100644 index 00000000..43869ac6 --- /dev/null +++ b/upload/admin_area/charts/users_activity.php @@ -0,0 +1,108 @@ +set_style("{font-size:14px;font-family:Century Gothic;font-weight:bold}"); + + +$vid_stats = $data['video_stats']; +$vid_stats = json_decode($vid_stats); + + +$year = array(); + +//Getting This Weeks Data +for($i=0;$i<$days;$i++) +{ + if($i<$days-1) + { + $date_pattern = date("Y-m-d",$last_week+($i*86400)); + $data = $db->select(tbl("stats"),"*"," date_added LIKE '%$date_pattern%' ",1); + $data = $data[0]; + $datas[] = $data; + } + + $year[] = date("M d",$last_week+($i*86400)); +} + + +for($i=0;$i<$days;$i++) +{ + $day[$i]['video'] = json_decode($datas[$i]['video_stats'],true); + $day[$i]['users'] = json_decode($datas[$i]['user_stats'],true); + $day[$i]['groups'] = json_decode($datas[$i]['group_stats'],true); + +} +$max = 1; +for($i=0;$i<$days;$i++) +{ + if($i==$days-1) + { + $signups[] = $userquery->get_users(array("count_only"=>true,"date_span"=>"today"))+0; + $active[] = $userquery->get_users(array("count_only"=>true,"date_span"=>"today","status"=>'Ok'))+0; + $inactive[] = $userquery->get_users(array("count_only"=>true,"date_span"=>"today","status"=>'ToActivate'))+0; + }else{ + $signups[] =$day[$i]['users']->signups+0; + $active[] =$day[$i]['users']->active+0; + $inactive[] =$day[$i]['users']->inactive+0; + } + $max = max($max,$uploads[$i],$inactive[$i],$active[$i]); +} + + + +$signups_bars = new bar_cylinder(); +$signups_bars->set_values($signups); +$signups_bars->colour( '#0066ff'); +$signups_bars->key('Signups', 14); + +$active_bars = new bar_cylinder(); +$active_bars->set_values($active); +$active_bars->colour( '#99cc00'); +$active_bars->key('Active', 14); + +$inactivebar = new bar_cylinder(); +$inactivebar->set_values($inactive); +$inactivebar->colour( '#BF3B69'); +$inactivebar->key('Inactive', 14); + + + + +$max = $max+(round($max/2,0.49)); +$steps = round($max/5,0.49); +$y = new y_axis(); +$y->set_range( 0, $max, $steps); + + +$chart = new open_flash_chart(); +$chart->set_title( $title ); +$chart->add_element( $signups_bars ); +$chart->add_element( $active_bars ); +$chart->add_element( $inactivebar ); + +$x_labels = new x_axis_labels(); +$x_labels->set_steps( 1 ); +$x_labels->set_colour( '#A2ACBA' ); +$x_labels->set_labels( $year ); + +$x = new x_axis(); +$x->set_colour( '#A2ACBA' ); +$x->set_grid_colour( '#D7E4A3' ); +$x->set_offset( true ); +$x->set_steps(4); +// Add the X Axis Labels to the X Axis +$x->set_labels( $x_labels ); + +$chart->set_x_axis( $x ); +$chart->set_bg_colour('#ffffff'); + +$chart->set_y_axis( $y ); + +echo $chart->toString(); + +?> \ No newline at end of file diff --git a/upload/admin_area/charts/videos_activity.php b/upload/admin_area/charts/videos_activity.php new file mode 100644 index 00000000..58c4881d --- /dev/null +++ b/upload/admin_area/charts/videos_activity.php @@ -0,0 +1,108 @@ +set_style("{font-size:14px;font-family:Century Gothic;font-weight:bold}"); + + +$vid_stats = $data['video_stats']; +$vid_stats = json_decode($vid_stats); + + +$year = array(); + +//Getting This Weeks Data +for($i=0;$i<$days;$i++) +{ + if($i<$days-1) + { + $date_pattern = date("Y-m-d",$last_week+($i*86400)); + $data = $db->select(tbl("stats"),"*"," date_added LIKE '%$date_pattern%' ",1); + $data = $data[0]; + $datas[] = $data; + } + + $year[] = date("M d",$last_week+($i*86400)); +} + + +for($i=0;$i<$days;$i++) +{ + $day[$i]['video'] = json_decode($datas[$i]['video_stats'],true); + $day[$i]['users'] = json_decode($datas[$i]['user_stats'],true); + $day[$i]['groups'] = json_decode($datas[$i]['group_stats'],true); + +} +$max = 1; +for($i=0;$i<$days;$i++) +{ + if($i==$days-1) + { + $uploads[] = $cbvid->get_videos(array("count_only"=>true,"date_span"=>"today"))+0; + $active[] = $cbvid->get_videos(array("count_only"=>true,"date_span"=>"today","active"=>'yes',"status"=>'Successful'))+0; + $processing[] = $cbvid->get_videos(array("count_only"=>true,"date_span"=>"today","status"=>'Processing'))+0; + }else{ + $uploads[] =$day[$i]['video']->uploads+0; + $active[] =$day[$i]['video']->active+0; + $processing[] =$day[$i]['video']->processing+0; + } + $max = max($max,$uploads[$i],$active[$i],$processing[$i]); +} + + + +$total_bars = new bar_cylinder(); +$total_bars->set_values($uploads); +$total_bars->colour( '#0066ff'); +$total_bars->key('Total', 14); + +$active_bars = new bar_cylinder(); +$active_bars->set_values($active); +$active_bars->colour( '#99cc00'); +$active_bars->key('Active', 14); + +$processing_bar = new bar_cylinder(); +$processing_bar->set_values($processing); +$processing_bar->colour( '#BF3B69'); +$processing_bar->key('Processing', 14); + + + + +//$max = $max+(round($max/2,0.49)); +$steps = round($max/5,0.49); +$y = new y_axis(); +$y->set_range( 0, $max, $steps); + + +$chart = new open_flash_chart(); +$chart->set_title( $title ); +$chart->add_element( $total_bars ); +$chart->add_element( $active_bars ); +$chart->add_element( $processing_bar ); + +$x_labels = new x_axis_labels(); +$x_labels->set_steps( 1 ); +$x_labels->set_colour( '#A2ACBA' ); +$x_labels->set_labels( $year ); + +$x = new x_axis(); +$x->set_colour( '#A2ACBA' ); +$x->set_grid_colour( '#D7E4A3' ); +$x->set_offset( true ); +$x->set_steps(4); +// Add the X Axis Labels to the X Axis +$x->set_labels( $x_labels ); + +$chart->set_x_axis( $x ); +$chart->set_bg_colour('#ffffff'); + +$chart->set_y_axis( $y ); + +echo $chart->toString(); + +?> \ No newline at end of file diff --git a/upload/admin_area/collection_category.php b/upload/admin_area/collection_category.php new file mode 100644 index 00000000..f3c8a4d9 --- /dev/null +++ b/upload/admin_area/collection_category.php @@ -0,0 +1,79 @@ +admin_login_check(); +$userquery->login_check('video_moderation'); +$pages->page_redir(); + + +//Form Processing +if(isset($_POST['add_cateogry'])){ + $cbcollection->add_category($_POST); +} + +//Making Categoyr as Default +if(isset($_GET['make_default'])) +{ + $cid = mysql_clean($_GET['make_default']); + $cbcollection->make_default_category($cid); +} + +//Edit Categoty +if(isset($_GET['category'])){ + assign("edit_category","show"); + if(isset($_POST['update_category'])) + { + $cbcollection->update_category($_POST); + } + assign('cat_details',$cbcollection->get_category($_GET['category'])); +} + +//Delete Category +if(isset($_GET['delete_category'])){ + $cbcollection->delete_category($_GET['delete_category']); +} + + +$cats = $cbcollection->get_categories(); +$pid = $cbcollection->get_category_field($_GET['category'],'parent_id'); + +if($pid) + $selected = $pid; + +$parent_cats = $cbcollection->admin_area_cats($selected); + + +//Updating Category Order +if(isset($_POST['update_order'])) +{ + foreach($cats as $cat) + { + if(!empty($cat['category_id'])) + { + $order = $_POST['category_order_'.$cat['category_id']]; + $cbcollection->update_cat_order($cat['category_id'],$order); + } + } + + $cats = $cbcollection->get_categories(); + +} + +//Assing Category Values +assign('category',$cats); +assign('parent_cats',$parent_cats); +assign('total',$cbcollection->total_categories()); + +subtitle("Collection Category Manager"); +Assign('msg',@$msg); +template_files('collection_category.html'); +display_it(); + +?> \ No newline at end of file diff --git a/upload/admin_area/collection_manager.php b/upload/admin_area/collection_manager.php new file mode 100644 index 00000000..bdd21e7d --- /dev/null +++ b/upload/admin_area/collection_manager.php @@ -0,0 +1,154 @@ +admin_login_check(); +$userquery->login_check('video_moderation'); +$pages->page_redir(); + +if(isset($_GET['make_feature'])) +{ + $id = mysql_clean($_GET['make_feature']); + $cbcollection->collection_actions('mcf',$id); +} + +if(isset($_GET['make_unfeature'])) +{ + $id = mysql_clean($_GET['make_unfeature']); + $cbcollection->collection_actions('mcuf',$id); +} + +if(isset($_GET['activate'])) +{ + $id = mysql_clean($_GET['activate']); + $cbcollection->collection_actions('ac',$id); +} + +if(isset($_GET['deactivate'])) +{ + $id = mysql_clean($_GET['deactivate']); + $cbcollection->collection_actions('dac',$id); +} + +if(isset($_GET['delete_collection'])) +{ + $id = mysql_clean($_GET['delete_collection']); + $cbcollection->delete_collection($id); +} +//pr($cbcollection->collection_delete_functions,TRUE); + +/* ACTIONS ON MULTI ITEMS */ +if(isset($_POST['activate_selected'])) +{ + $total = count($_POST['check_collection']); + for($i=0;$i<$total;$i++) + { + $cbcollection->collection_actions('ac',$_POST['check_collection'][$i]); + } + $eh->flush(); + e($total." collections has been activated","m"); +} + +if(isset($_POST['deactivate_selected'])) +{ + $total = count($_POST['check_collection']); + for($i=0;$i<$total;$i++) + { + $cbcollection->collection_actions('dac',$_POST['check_collection'][$i]); + } + $eh->flush(); + e($total." collections has been deactivated","m"); +} + +if(isset($_POST['make_featured_selected'])) +{ + $total = count($_POST['check_collection']); + for($i=0;$i<$total;$i++) + { + $cbcollection->collection_actions('mcf',$_POST['check_collection'][$i]); + } + $eh->flush(); + e($total." collections has been marked as Featured","m"); +} + +if(isset($_POST['make_unfeatured_selected'])) +{ + $total = count($_POST['check_collection']); + for($i=0;$i<$total;$i++) + { + $cbcollection->collection_actions('mcuf',$_POST['check_collection'][$i]); + } + $eh->flush(); + e($total." collections has been marked as Unfeatured","m"); +} + +if(isset($_POST['make_unfeatured_selected'])) +{ + $total = count($_POST['check_collection']); + for($i=0;$i<$total;$i++) + { + $cbcollection->collection_actions('mcuf',$_POST['check_collection'][$i]); + } + $eh->flush(); + e($total." collections has been marked as Unfeatured","m"); +} + +if(isset($_POST['delete_selected'])) +{ + $total = count($_POST['check_collection']); + for($i=0;$i<$total;$i++) + { + $cbcollection->delete_collection($_POST['check_collection'][$i]); + } + $eh->flush(); + e($total." collection(s) has been deleted successfully","m"); +} + +/* IF SEARCH EXISTS */ +if($_GET['search']) +{ + $array = array( + 'name' => $_GET['title'], + 'tags' => $_GET['tags'], + 'cid' => $_GET['collectionid'], + 'type' => $_GET['collection_type'], + 'user' => $_GET['userid'], + 'order' => $_GET['order'], + 'broadcast' => $_GET['broadcast'], + 'featured' => $_GET['featured'], + 'active' => $_GET['active'] + ); +} + +$carray = $array; + +/* CREATING LIMIT */ +$page = mysql_clean($_GET['page']); +$get_limit = create_query_limit($page,RESULTS); + +$carray['limit'] = $get_limit; +if(!empty($carray['order'])) + $carray['order'] = $carray['order']." DESC"; +else + $carray['order'] = " collection_id DESC"; + +$collections = $cbcollection->get_collections($carray); +assign('c',$collections); + +/* COUNTING ALL COLLECTIONS */ +$ccount = $carray; +$ccount['count_only'] = TRUE; +$total_rows = $cbcollection->get_collections($ccount); +$total_pages = count_pages($total_rows,RESULTS); +$pages->paginate($total_pages,$page); + +subtitle("Collection Manager"); +template_files('collection_manager.html'); +display_it(); +?> \ No newline at end of file diff --git a/upload/admin_area/comments.php b/upload/admin_area/comments.php new file mode 100644 index 00000000..e64fa695 --- /dev/null +++ b/upload/admin_area/comments.php @@ -0,0 +1,71 @@ +admin_login_check(); +$pages->page_redir(); + +if(empty($_GET['type'])) + $type = "v"; +else + $type = $_GET['type']; +$comment_cond = array(); +$comment_cond['order'] = " comment_id DESC"; + +$page = mysql_clean($_GET['page']); +$get_limit = create_query_limit($page,RESULTS); +$comment_cond['limit'] = $get_limit; +assign('type',$type); +switch($type) +{ + case "v": + default: + { + $comment_cond['type'] = "v"; + $comment_cond['type_id'] = "videoid"; + $comment_cond['sectionTable'] = "video"; + } + break; + + case "c": + { + $comment_cond['type'] = "c"; + $comment_cond['type_id'] = "userid"; + $comment_cond['sectionTable'] = "users"; + } + break; + + case "t": + { + $comment_cond['type'] = "t"; + $comment_cond['type_id'] = "topic_id"; + $comment_cond['sectionTable'] = "group_topics"; + } + break; + + case "cl": + { + $comment_cond['type'] = "cl"; + $comment_cond['type_id'] = "collection_id"; + $comment_cond['sectionTable'] = "collections"; + } + break; + + case "p": + { + $comment_cond['type'] = "p"; + $comment_cond['type_id'] = "photo_id"; + $comment_cond['sectionTable'] = "photos"; + } + break; +} +$comments = getComments($comment_cond); +assign("comments",$comments); + +$comment_cond['count_only'] = TRUE; +$total_rows = getComments($comment_cond); +$total_pages = count_pages($total_rows,RESULTS); +$pages->paginate($total_pages,$page); + +subtitle("Comments"); +template_files('comments.html'); +display_it(); +?> \ No newline at end of file diff --git a/upload/admin_area/conversion_lab.php b/upload/admin_area/conversion_lab.php new file mode 100644 index 00000000..ecba6392 --- /dev/null +++ b/upload/admin_area/conversion_lab.php @@ -0,0 +1,25 @@ +$vidFile,'name'=>getName($vidFile).'.'.getExt($vidFile)); +} + +assign('vdoFiles',$vdoFiles); + + +subtitle("Conversion lab for ClipBucket conversion testing"); +template_files("conversion_lab.html"); +display_it(); +?> \ No newline at end of file diff --git a/upload/admin_area/edit_announcement.php b/upload/admin_area/edit_announcement.php new file mode 100644 index 00000000..9ba9cd56 --- /dev/null +++ b/upload/admin_area/edit_announcement.php @@ -0,0 +1,22 @@ +admin_login_check(); +$userquery->login_check('admin_access'); +$pages->page_redir(); + +if(isset($_POST['update'])) +{ + $text = mysql_clean($_POST['text']); + update_announcement($text); + $msg = e("Announcement has been updated",'m'); +} + +subtitle("Annoucment Manager"); +template_files('edit_announcemnent.html'); +display_it(); + +?> \ No newline at end of file diff --git a/upload/admin_area/edit_collection.php b/upload/admin_area/edit_collection.php new file mode 100644 index 00000000..945ab6ff --- /dev/null +++ b/upload/admin_area/edit_collection.php @@ -0,0 +1,58 @@ +admin_login_check(); +$userquery->login_check('video_moderation'); +$pages->page_redir(); + +$id = mysql_clean($_GET['collection']); + +if(isset($_POST['update_collection'])) +{ + $cbcollection->update_collection(); +} + +if(isset($_POST['delete_preview'])) +{ + $id = mysql_clean($_POST['delete_preview']); + $cbcollection->delete_thumbs($id); +} + +//Performing Actions +if($_GET['mode']!='') +{ + $cbcollection->collection_actions($_GET['mode'],$id); +} + +$c = $cbcollection->get_collection($id); +switch($c['type']) +{ + case "videos": + case "v": + { + $items = $cbvideo->collection->get_collection_items_with_details($c['collection_id'],NULL,4); + } + break; + + case "photos": + case "p": + { + $items = $cbphoto->collection->get_collection_items_with_details($c['collection_id'],NULL,4); + } + break; +} +if(!empty($items)) + assign('objects',$items); +assign('data',$c); + +subtitle("Edit Collection"); +template_files('edit_collection.html'); +display_it(); +?> \ No newline at end of file diff --git a/upload/admin_area/edit_group.php b/upload/admin_area/edit_group.php new file mode 100644 index 00000000..75dc3cdd --- /dev/null +++ b/upload/admin_area/edit_group.php @@ -0,0 +1,35 @@ +admin_login_check(); + + $gpid = mysql_clean($_GET['group_id']); + + $group = $cbgroup->get_details($gpid); + + if($group) + { + if(isset($_POST['update_group'])) + { + $_POST['group_id'] = $gpid; + $cbgroup->update_group(); + $group = $cbgroup->get_group_details($gid); + + } + assign('group',$group ); + }else + e("Group does not exist"); + + +subtitle("Edit Group"); +template_files('edit_group.html'); +display_it(); + +?> \ No newline at end of file diff --git a/upload/admin_area/edit_member.php b/upload/admin_area/edit_member.php new file mode 100644 index 00000000..89ec27fb --- /dev/null +++ b/upload/admin_area/edit_member.php @@ -0,0 +1,14 @@ +admin_login_check(); +header('location:view_user.php?uid='.$_GET['uid']); + +?> \ No newline at end of file diff --git a/upload/admin_area/edit_photo.php b/upload/admin_area/edit_photo.php new file mode 100644 index 00000000..0dadf381 --- /dev/null +++ b/upload/admin_area/edit_photo.php @@ -0,0 +1,42 @@ +admin_login_check(); +$userquery->login_check('video_moderation'); +$pages->page_redir(); + +$id = mysql_clean($_GET['photo']); + + +if(isset($_POST['update'])) +{ + $cbphoto->update_photo(); +} + +//Performing Actions +if($_GET['mode']!='') +{ + $cbphoto->photo_actions($_GET['mode'],$id); +} + +$p = $cbphoto->get_photo($id); +$p['user'] = $p['userid']; + +assign('data',$p); + +$requiredFields = $cbphoto->load_required_forms($p); +$otherFields = $cbphoto->load_other_forms($p); +assign('requiredFields',$requiredFields); +assign('otherFields',$otherFields); + +subtitle("Edit Photo"); +template_files('edit_photo.html'); +display_it(); +?> \ No newline at end of file diff --git a/upload/admin_area/edit_video.php b/upload/admin_area/edit_video.php new file mode 100644 index 00000000..37e598f7 --- /dev/null +++ b/upload/admin_area/edit_video.php @@ -0,0 +1,60 @@ +admin_login_check(); +$userquery->login_check('video_moderation'); +$pages->page_redir(); + +if(@$_GET['msg']){ +$msg[] = clean($_GET['msg']); +} + + + $video = mysql_clean($_GET['video']); + + //Updating Video Details + if(isset($_POST['update'])){ + $Upload->validate_video_upload_form(); + if(empty($eh->error_list)) + { + $myquery->update_video(); + $myquery->set_default_thumb($video,$_POST['default_thumb']); + } + } + + //Performing Video Acttions + if($_GET['mode']!='') + { + $cbvid->action($_GET['mode'],$video); + } + + //Check Video Exists or Not + if($myquery->VideoExists($video)){ + + //Deleting Comment + $cid = mysql_clean($_GET['delete_comment']); + if(!empty($cid)) + { + $myquery->delete_comment($cid); + } + + + $data = get_video_details($video); + Assign('udata',$userquery->get_user_details($data['userid'])); + Assign('data',$data); + }else{ + $msg[] = lang('class_vdo_del_err'); + } + +subtitle("Edit Video"); +template_files('edit_video.html'); +display_it(); + +?> \ No newline at end of file diff --git a/upload/admin_area/editor_pick.php b/upload/admin_area/editor_pick.php new file mode 100644 index 00000000..32fb82d9 --- /dev/null +++ b/upload/admin_area/editor_pick.php @@ -0,0 +1,55 @@ +admin_login_check(); +$pages->page_redir(); + +//Removing +if(isset($_GET['remove'])){ + $id = mysql_clean($_GET['remove']); + remove_vid_editors_pick($id); +} + +if(isset($_POST['delete_selected'])) +{ + for($id=0;$id<=count($_POST['check_video']);$id++) + { + remove_vid_editors_pick($_POST['check_video'][$id]); + } + $eh->flush(); + e("Selected videos have been removed from editors pick","m"); +} + + +$ep_videos = get_ep_videos(); +if(isset($_POST['update_order'])) +{ + if(is_array($ep_videos)) + { + foreach($ep_videos as $epvid) + { + $order = $_POST['ep_order_'.$epvid['pick_id']]; + move_epick($epvid['videoid'],$order); + } + } + $ep_videos = get_ep_videos(); + +} + + +assign('videos',$ep_videos); +assign('max',get_highest_sort_number()); +assign('min',get_lowest_sort_number()); + + +subtitle("Editor's Pick"); +template_files('editor_pick.html'); +display_it(); +?> \ No newline at end of file diff --git a/upload/admin_area/email_settings.php b/upload/admin_area/email_settings.php new file mode 100644 index 00000000..477fa4d7 --- /dev/null +++ b/upload/admin_area/email_settings.php @@ -0,0 +1,59 @@ +admin_login_check(); +$userquery->login_check('web_config_access'); + +$pages->page_redir(); + +//Updatingg email templates +if(isset($_POST['update'])) +{ + $templates = $cbemail->get_templates(); + + foreach($templates as $template) + { + $params = array('id'=>$template['email_template_id'],'subj'=>$_POST['subject'.$template['email_template_id']], + 'msg'=>$_POST['message'.$template['email_template_id']]); + $cbemail->update_template($params); + $eh->flush(); + e("Email templates have been updated","m"); + } +} + +if(isset($_POST['update_settings'])){ + $configs = $Cbucket->configs; + + $rows = array( + 'mail_type', + 'smtp_host', + 'smtp_user', + 'smtp_pass', + 'smtp_auth', + 'smtp_port' + ); + + + foreach($rows as $field) + { + $value = ($_POST[$field]); + $myquery->Set_Website_Details($field,$value); + } + e("Email Settings Have Been Updated",'m'); + +} + +$row = $myquery->Get_Website_Details(); +Assign('row',$row); + +subtitle("Email Settings"); +template_files('email_settings.html'); +display_it(); +?> \ No newline at end of file diff --git a/upload/admin_area/flagged_collections.php b/upload/admin_area/flagged_collections.php new file mode 100644 index 00000000..cea2f09d --- /dev/null +++ b/upload/admin_area/flagged_collections.php @@ -0,0 +1,90 @@ +admin_login_check(); +$pages->page_redir(); +//$userquery->perm_check('group_moderation',true); + +$mode = $_GET['mode']; + +//Delete Photo +if(isset($_GET['delete_collect'])){ + $collect = mysql_clean($_GET['delete_collect']); + $cbcollection->delete_collection($collect); +} + +//Deleting Multiple Photos +if(isset($_POST['delete_selected'])) +{ + for($id=0;$id<=count($_POST['check_collect']);$id++) + { + $cbphoto->delete_photo($_POST['check_collect'][$id]); + } + $eh->flush(); + e("Selected collections have been deleted","m"); +} + +if(isset($_REQUEST['delete_flags'])) +{ + $collect = mysql_clean($_GET['delete_flags']); + $cbcollection->action->delete_flags($collect); +} + +//Deleting Multiple Videos +if(isset($_POST['delete_flags'])) +{ + for($id=0;$id<=count($_POST['check_collect']);$id++) + { + $eh->flush(); + $cbcollection->action->delete_flags($_POST['check_collect'][$id]); + } +} + +switch($mode) +{ + case "view": + default: + { + assign("mode","view"); + //Getting Video List + $page = mysql_clean($_GET['page']); + $get_limit = create_query_limit($page,5); + $collects = $cbcollection->action->get_flagged_objects($get_limit); + assign('c', $collects); + + //Collecting Data for Pagination + $total_rows = $cbcollection->action->count_flagged_objects(); + $total_pages = count_pages($total_rows,5); + + //Pagination + $pages->paginate($total_pages,$page); + } + break; + + case "view_flags": + { + assign("mode","view_flags"); + $cid = mysql_clean($_GET['cid']); + $cdetails = $cbcollection->get_collection($cid); + if($cdetails) + { + $flags = $cbcollection->action->get_flags($pid); + assign('flags',$flags); + assign('collection',$cdetails); + }else + e("Collection does not exist"); + } + +} + +subtitle("Flagged Collections"); +template_files('flagged_collections.html'); +display_it(); +?> \ No newline at end of file diff --git a/upload/admin_area/flagged_groups.php b/upload/admin_area/flagged_groups.php new file mode 100644 index 00000000..7077998b --- /dev/null +++ b/upload/admin_area/flagged_groups.php @@ -0,0 +1,118 @@ +admin_login_check(); +$pages->page_redir(); +$userquery->perm_check('group_moderation',true); + +$mode = $_GET['mode']; + + +//Delete Video +if(isset($_GET['delete_group'])){ + $group = mysql_clean($_GET['delete_group']); + $cbgroup->delete_group($group); +} + +//Deleting Multiple Videos +if(isset($_POST['delete_selected'])) +{ + for($id=0;$id<=count($_POST['check_group']);$id++) + { + $cbgroup->delete_group($_POST['check_group'][$id]); + } + $eh->flush(); + e("Selected groups have been deleted","m"); +} + +//Activate / Deactivate +if(isset($_GET['activate'])){ + $group = mysql_clean($_GET['activate']); + $cbgroup->grp_actions('activate',$group); +} +if(isset($_GET['deactivate'])){ + $group = mysql_clean($_GET['deactivate']); + $cbgroup->grp_actions('deactivate',$group); +} + +//Using Multple Action +if(isset($_POST['activate_selected'])){ + for($id=0;$id<=count($_POST['check_group']);$id++){ + $cbgroup->grp_actions('activate',$_POST['check_group'][$id]); + } + e("Selected Groups Have Been Activated","m"); +} +if(isset($_POST['deactivate_selected'])){ + for($id=0;$id<=count($_POST['check_group']);$id++){ + $cbgroup->grp_actions('activate',$_POST['check_group'][$id]); + } + e("Selected Groups Have Been Dectivated","m"); +} + + + +if(isset($_REQUEST['delete_flags'])) +{ + $group = mysql_clean($_GET['delete_flags']); + $cbgroup->action->delete_flags($group); +} + +//Deleting Multiple Videos +if(isset($_POST['delete_flags'])) +{ + for($id=0;$id<=count($_POST['check_group']);$id++) + { + $eh->flush(); + $cbgroup->action->delete_flags($_POST['check_group'][$id]); + } +} + + +switch($mode) +{ + case "view": + default: + { + assign("mode","view"); + //Getting Video List + $page = mysql_clean($_GET['page']); + $get_limit = create_query_limit($page,5); + $groups = $cbgroup->action->get_flagged_objects($get_limit); + Assign('groups', $groups); + + //Collecting Data for Pagination + $total_rows = $cbgroup->action->count_flagged_objects(); + $total_pages = count_pages($total_rows,5); + + //Pagination + $pages->paginate($total_pages,$page); + } + break; + + case "view_flags": + { + assign("mode","view_flags"); + $gid = mysql_clean($_GET['gid']); + $gdetails = $cbgroup->get_details($gid); + if($gdetails) + { + $flags = $cbgroup->action->get_flags($gid); + assign('flags',$flags); + assign('group',$gdetails); + }else + e("Group does not exist"); + } + +} + +subtitle("Flagged Groups"); +template_files('flagged_groups.html'); +display_it(); +?> \ No newline at end of file diff --git a/upload/admin_area/flagged_photos.php b/upload/admin_area/flagged_photos.php new file mode 100644 index 00000000..65c62103 --- /dev/null +++ b/upload/admin_area/flagged_photos.php @@ -0,0 +1,91 @@ +admin_login_check(); +$pages->page_redir(); +//$userquery->perm_check('group_moderation',true); + +$mode = $_GET['mode']; + +//Delete Photo +if(isset($_GET['delete_photo'])){ + $photo = mysql_clean($_GET['delete_photo']); + $cbphoto->delete_photo($photo); +} + +//Deleting Multiple Photos +if(isset($_POST['delete_selected'])) +{ + for($id=0;$id<=count($_POST['check_photo']);$id++) + { + $cbphoto->delete_photo($_POST['check_photo'][$id]); + } + $eh->flush(); + e("Selected photos have been deleted","m"); +} + +if(isset($_REQUEST['delete_flags'])) +{ + $photo = mysql_clean($_GET['delete_flags']); + $cbphoto->action->delete_flags($photo); +} + +//Deleting Multiple Videos +if(isset($_POST['delete_flags'])) +{ + for($id=0;$id<=count($_POST['check_photo']);$id++) + { + $eh->flush(); + $cbphoto->action->delete_flags($_POST['check_photo'][$id]); + } +} + +switch($mode) +{ + case "view": + default: + { + assign("mode","view"); + //Getting Video List + $page = mysql_clean($_GET['page']); + $get_limit = create_query_limit($page,5); + $photos = $cbphoto->action->get_flagged_objects($get_limit); + assign('photos', $photos); + + //Collecting Data for Pagination + $total_rows = $cbphoto->action->count_flagged_objects(); + $total_pages = count_pages($total_rows,5); + + //Pagination + $pages->paginate($total_pages,$page); + } + break; + + case "view_flags": + { + assign("mode","view_flags"); + $pid = mysql_clean($_GET['pid']); + $pdetails = $cbphoto->get_photo($pid); + if($pdetails) + { + $flags = $cbphoto->action->get_flags($pid); + assign('flags',$flags); + assign('photo',$pdetails); + }else + e("Photo does not exist"); + } + +} + +subtitle("Flagged Photos"); +template_files('flagged_photos.html'); +display_it(); + +?> \ No newline at end of file diff --git a/upload/admin_area/flagged_users.php b/upload/admin_area/flagged_users.php new file mode 100644 index 00000000..ebe55b83 --- /dev/null +++ b/upload/admin_area/flagged_users.php @@ -0,0 +1,117 @@ +admin_login_check(); +$userquery->login_check('video_moderation'); + +$mode = $_GET['mode']; + + +//Delete Video +if(isset($_GET['delete_user'])){ + $user = mysql_clean($_GET['delete_user']); + $userquery->delete_user($user); +} + +//Deleting Multiple Videos +if(isset($_POST['delete_selected'])) +{ + for($id=0;$id<=count($_POST['check_user']);$id++) + { + $userquery->delete_user($_POST['check_user'][$id]); + } + $eh->flush(); + e("Selected users have been deleted","m"); +} + +//Activate / Deactivate +if(isset($_GET['activate'])){ + $user = mysql_clean($_GET['activate']); + $userquery->action('activate',$user); +} +if(isset($_GET['deactivate'])){ + $user = mysql_clean($_GET['deactivate']); + $userquery->action('deactivate',$user); +} + +//Using Multple Action +if(isset($_POST['activate_selected'])){ + for($id=0;$id<=count($_POST['check_user']);$id++){ + $userquery->action('activate',$_POST['check_user'][$id]); + } + e("Selected users Have Been Activated","m"); +} +if(isset($_POST['deactivate_selected'])){ + for($id=0;$id<=count($_POST['check_user']);$id++){ + $userquery->action('activate',$_POST['check_user'][$id]); + } + e("Selected users Have Been Dectivated","m"); +} + + + +if(isset($_REQUEST['delete_flags'])) +{ + $user = mysql_clean($_GET['delete_flags']); + $userquery->action->delete_flags($user); +} + +//Deleting Multiple Videos +if(isset($_POST['delete_flags'])) +{ + for($id=0;$id<=count($_POST['check_user']);$id++) + { + $eh->flush(); + $userquery->action->delete_flags($_POST['check_user'][$id]); + } +} + + +switch($mode) +{ + case "view": + default: + { + assign("mode","view"); + //Getting Video List + $page = mysql_clean($_GET['page']); + $get_limit = create_query_limit($page,5); + $users = $userquery->action->get_flagged_objects($get_limit); + Assign('users', $users); + + //Collecting Data for Pagination + $total_rows = $userquery->action->count_flagged_objects(); + $total_pages = count_pages($total_rows,5); + + //Pagination + $pages->paginate($total_pages,$page); + } + break; + + case "view_flags": + { + assign("mode","view_flags"); + $uid = mysql_clean($_GET['uid']); + $udetails = $userquery->get_user_details($uid); + if($udetails) + { + $flags = $userquery->action->get_flags($uid); + assign('flags',$flags); + assign('user',$udetails); + }else + e("user does not exist"); + } + +} + +subtitle("Flagged Users"); +template_files('flagged_users.html'); +display_it(); +?> \ No newline at end of file diff --git a/upload/admin_area/flagged_videos.php b/upload/admin_area/flagged_videos.php new file mode 100644 index 00000000..99fa3775 --- /dev/null +++ b/upload/admin_area/flagged_videos.php @@ -0,0 +1,117 @@ +admin_login_check(); +$userquery->login_check('video_moderation'); + +$mode = $_GET['mode']; + + +//Delete Video +if(isset($_GET['delete_video'])){ + $video = mysql_clean($_GET['delete_video']); + $cbvideo->delete_video($video); +} + +//Deleting Multiple Videos +if(isset($_POST['delete_selected'])) +{ + for($id=0;$id<=RESULTS;$id++) + { + $cbvideo->delete_video($_POST['check_video'][$id]); + } + $eh->flush(); + e(lang("vdo_multi_del_erro"),"m"); +} +//Activate / Deactivate + +if(isset($_GET['activate'])){ + $video = mysql_clean($_GET['activate']); + $cbvid->action('activate',$video); +} +if(isset($_GET['deactivate'])){ + $video = mysql_clean($_GET['deactivate']); + $cbvid->action('deactivate',$video); +} + +//Using Multple Action +if(isset($_POST['activate_selected'])){ + for($id=0;$id<=RESULTS;$id++){ + $cbvid->action('activate',$_POST['check_video'][$id]); + } + e("Selected Videos Have Been Activated","m"); +} +if(isset($_POST['deactivate_selected'])){ + for($id=0;$id<=RESULTS;$id++){ + $cbvid->action('deactivate',$_POST['check_video'][$id]); + } + e("Selected Videos Have Been Dectivated","m"); +} + + + +if(isset($_REQUEST['delete_flags'])) +{ + $video = mysql_clean($_GET['delete_flags']); + $cbvid->action->delete_flags($video); +} + +//Deleting Multiple Videos +if(isset($_POST['delete_flags'])) +{ + for($id=0;$id<=RESULTS;$id++) + { + $eh->flush(); + $cbvid->action->delete_flags($_POST['check_video'][$id]); + } +} + + +switch($mode) +{ + case "view": + default: + { + assign("mode","view"); + //Getting Video List + $page = mysql_clean($_GET['page']); + $get_limit = create_query_limit($page,5); + $videos = $cbvid->action->get_flagged_objects($get_limit); + Assign('videos', $videos); + + //Collecting Data for Pagination + $total_rows = $cbvid->action->count_flagged_objects(); + $total_pages = count_pages($total_rows,5); + + //Pagination + $pages->paginate($total_pages,$page); + } + break; + + case "view_flags": + { + assign("mode","view_flags"); + $vid = mysql_clean($_GET['vid']); + $vdetails = $cbvid->get_video($vid); + if($vdetails) + { + $flags = $cbvid->action->get_flags($vid); + assign('flags',$flags); + assign('video',$vdetails); + }else + e("Video does not exist"); + } + +} + +subtitle("Flagged Videos"); +template_files('flagged_videos.html'); +display_it(); +?> \ No newline at end of file diff --git a/upload/admin_area/group_category.php b/upload/admin_area/group_category.php new file mode 100644 index 00000000..24542bd4 --- /dev/null +++ b/upload/admin_area/group_category.php @@ -0,0 +1,63 @@ +admin_login_check(); +$pages->page_redir(); +$userquery->perm_check('group_moderation',true); +//Form Processing +if(isset($_POST['add_cateogry'])){ + $cbgroup->add_category($_POST); +} + +//Making Categoyr as Default +if(isset($_GET['make_default'])) +{ + $cid = mysql_clean($_GET['make_default']); + $cbgroup->make_default_category($cid); +} + +//Edit Categoty +if(isset($_GET['category'])){ + assign("edit_category","show"); + if(isset($_POST['update_category'])) + { + $cbgroup->update_category($_POST); + } + assign('cat_details',$cbgroup->get_category($_GET['category'])); +} + +//Delete Category +if(isset($_GET['delete_category'])){ + $cbgroup->delete_category($_GET['delete_category']); +} + +$cats = $cbgroup->get_categories(); +//Updating Category Order +if(isset($_POST['update_order'])) +{ + foreach($cats as $cat) + { + if(!empty($cat['category_id'])) + { + $order = $_POST['category_order_'.$cat['category_id']]; + $cbgroup->update_cat_order($cat['category_id'],$order); + } + } + $cats = $cbgroup->get_categories(); +} + +//Assing Category Values +assign('category',$cats); +assign('total',$cbgroup->total_categories()); + +subtitle("Groups Category manager"); +template_files('group_category.html'); display_it(); + +?> \ No newline at end of file diff --git a/upload/admin_area/groups_manager.php b/upload/admin_area/groups_manager.php new file mode 100644 index 00000000..f8195737 --- /dev/null +++ b/upload/admin_area/groups_manager.php @@ -0,0 +1,147 @@ +admin_login_check(); +$pages->page_redir(); +$userquery->perm_check('group_moderation',true); + + // Deactivate Group + if(isset($_GET['deactivate'])) { + $cbgroup->grp_actions('deactivate',mysql_clean($_GET['deactivate'])); + } + + // Activate Group + if(isset($_GET['activate'])) { + $cbgroup->grp_actions('activate',mysql_clean($_GET['activate'])); + } + + // Feature Group + if(isset($_GET['feature'])) { + $cbgroup->grp_actions('feature',mysql_clean($_GET['feature'])); + } + + // unFeature Group + if(isset($_GET['unfeature'])) { + $cbgroup->grp_actions('unfeature',mysql_clean($_GET['unfeature'])); + } + + //Multiple Activate + if(isset($_POST['activate_selected'])) { + for($i=0; $igrp_actions('activate',$_POST['check_group'][$i],true); + } + $eh->flush(); + e(lang('Selected Groups are activated.'),'m'); + } + + //Multiple Deactivate + if(isset($_POST['deactivate_selected'])) { + for($i=0; $igrp_actions('decativate',$_POST['check_group'][$i],true); + } + $eh->flush(); + e(lang('Selected Groups are deactivated.'),'m'); + } + + //Multiple Feature + if(isset($_POST['make_featured_selected'])) { + for($i=0; $igrp_actions('feature',$_POST['check_group'][$i],true); + } + $eh->flush(); + e(lang('Selected Groups have been set as featured.'),'m'); + } + + //Multiple UnFeature + if(isset($_POST['make_unfeatured_selected'])) { + for($i=0; $igrp_actions('feature',$_POST['check_group'][$i],true); + } + $eh->flush(); + e(lang('Selected Groups have been set as Unfeatured.'),'m'); + } + + // Delete group + if(isset($_GET['delete_group'])) { + $cbgroup->grp_actions("delete",mysql_clean($_GET['delete_group'])); + } + + //Multiple Delete + if(isset($_POST['delete_selected'])) { + for($i=0; $igrp_actions("delete",$_POST['check_group'][$i],true); + } + $eh->flush(); + e(lang('Selected Groups are Deleted.'),'m'); + } + + + //Calling Group Manager Functions + call_functions($cbgroup->group_manager_funcs); + + $page = mysql_clean($_GET['page']); + $get_limit = create_query_limit($page,RESULTS); + + if(isset($_GET['search'])) + { + + $array = array + ( + 'group_id' => $_GET['group_id'], + 'user' => $_GET['userid'], + 'title' => $_GET['title'], + 'tags' => $_GET['tags'], + 'category' => $_GET['category'], + 'featured' => $_GET['featured'], + 'active' => $_GET['active'] + ); + } + + $result_array = $array; + //Getting Video List + $result_array['limit'] = $get_limit; + if(!$array['order']) + $result_array['order'] = " date_added DESC "; + $groups = $cbgroup->get_groups($result_array); + + Assign('groups', $groups); + + //Collecting Data for Pagination + $gcount = $array; + $gcount['count_only'] = true; + $total_rows = $cbgroup->get_groups($gcount); + $total_pages = count_pages($total_rows,RESULTS); + $pages->paginate($total_pages,$page); + + + //Category Array + if(is_array($_GET['category'])) + $cats_array = array($_GET['category']); + else + { + preg_match_all('/#([0-9]+)#/',$_GET['category'],$m); + $cats_array = array($m[1]); + } + $cat_array = array(lang('vdo_cat'), + 'type'=> 'checkbox', + 'name'=> 'category[]', + 'id'=> 'category', + 'value'=> array('category',$cats_array), + 'hint_1'=> lang('vdo_cat_msg'), + 'display_function' => 'convert_to_categories', + 'category_type'=>'groups'); + assign('cat_array',$cat_array); + + +subtitle("Group Manager"); +template_files('groups_manager.html'); +display_it(); + +?> \ No newline at end of file diff --git a/upload/admin_area/index.php b/upload/admin_area/index.php new file mode 100644 index 00000000..8489265a --- /dev/null +++ b/upload/admin_area/index.php @@ -0,0 +1,22 @@ +admin_login_check(); + + +// $latest = get_latest_cb_info(); + $Cbucket->cbinfo['latest'] = $latest; + if($Cbucket->cbinfo['version'] < $Cbucket->cbinfo['latest']['version']) + $Cbucket->cbinfo['new_available'] = true; + + +template_files('index.html'); +display_it(); +?> \ No newline at end of file diff --git a/upload/admin_area/lab_resources/echo.php b/upload/admin_area/lab_resources/echo.php new file mode 100644 index 00000000..70051698 --- /dev/null +++ b/upload/admin_area/lab_resources/echo.php @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/upload/admin_area/lab_resources/experiments.php b/upload/admin_area/lab_resources/experiments.php new file mode 100644 index 00000000..11f90308 --- /dev/null +++ b/upload/admin_area/lab_resources/experiments.php @@ -0,0 +1,225 @@ +admin_login_check(); + +if(isset($_POST['experiment'])) +{ + $mode = $_POST['mode']; + $victim = $_POST['victim']; + + switch($mode) + { + default: + echo json_encode(array("err"=>"DUDE!!Why The Hell You Are Playing With The Code :/")); + break; + + case "getPreDetails": + { + $err = array(); + $msg = array(); + + if(!function_exists("exec")) + { + $err[] = "
C'mon man! there shuld be some 'exec' functions :("; + $err[] = "
Exec function does not exist
"; + theEnd(); + }else + $msg[] = "
Exec function exists
"; + + //testing php compatiblity + $phpTest = shell_output(php_path()." -q ".ADMINBASEDIR.'/lab_resources/echo.php'); + if(!$phpTest) + { + $err[] = "
OMG! Your host is so chipless that it doesn't even allow you to use PHP CLI , very bad!"; + $err[] = "
PHP CLI is not enabled
"; + theEnd(); + }else + $msg[] = "
PHP CLI is enabled
"; + + //now get ffmpeg details + $ffmpegDetails = shell_output($Cbucket->configs['ffmpegpath']." -version "); + + if(!$ffmpegDetails) + { + $err[] = '
How can human work without brain? same situation is with video conversion, no ffmpeg, no conversion.'; + $err[] = "
FFMPEG does not exist
"; + theEnd(); + }else{ + + $msg[] = "
".nl2br($ffmpegDetails); + $msg[] = "
FFMPEG Exists
"; + } + + $flvtool2Details = shell_output($Cbucket->configs['flvtool2path']." -version "); + + if(!$flvtool2Details) + { + $err[] = '
Ah, no flvtool2 :O, its like a "Salt" for video files..food without salt is tasteless, + so video is streamless without flvtool2'; + $err[] = "
flvtool2 does not exist
"; + theEnd(); + }else{ + + $msg[] = "
".nl2br($flvtool2Details); + $msg[] = "
Flvtool2 Exists
"; + } + + $victimFile = $testVidsDir.'/'.$victim; + //getting video details.. + $ffmpegObj = new ffmpeg($victimFile); + $vidDetails = $ffmpegObj->get_file_info(); + if(!$vidDetails) + { + + $err[] = "
".nl2br(shell_output($Cbucket->configs['ffmpegpath'].' -i '.$victimFile)); + if(!file_exists($victimFile) && $victim) + $err[] = "
File does not exist
"; + else + $err[] = "
What the...post the above ffmpeg log and let scientist do their job
"; + theEnd(); + }else + { + $msg[] = "
".nl2br(shell_output($Cbucket->configs['ffmpegpath'].' -i '.$victimFile)); + $msg[] = "
Video file is convertable..
"; + } + + + theEnd('convertVideo1'); + } + break; + + case "convertVideo1": + { + + + $victimFile = $testVidsDir.'/'.$victim; + $victimOutput = $testVidsDir.'/output.flv'; + $victimOutputHQ = $testVidsDir.'/output.mp4'; + + if(file_exists($victimOutput)) + unlink($victimOutput); + if(file_exists($testVidsDir.'/output.log')) + unlink($testVidsDir.'/output.log'); + + + $res169 = array(); + $res169['240'] = array('427','240'); + $res169['360'] = array('640','360'); + $res169['480'] = array('853','480'); + $res169['720'] = array('1280','1280'); + $res169['1080'] = array('1920','1080'); + + $res43 = array(); + $res43['240'] = array('320','240'); + $res43['360'] = array('480','360'); + $res43['480'] = array('640','480'); + $res43['720'] = array('960','1280'); + $res43['1080'] = array('1440','1080'); + + $configs = array + ( + 'use_video_rate' => true, + 'use_video_bit_rate' => true, + 'use_audio_rate' => true, + 'use_audio_bit_rate' => true, + 'use_audio_codec' => true, + 'format' => 'flv', + 'video_codec'=> config('video_codec'), + 'audio_codec'=> config('audio_codec'), + 'audio_rate'=> config("srate"), + 'audio_bitrate'=> config("sbrate"), + 'video_rate'=> config("vrate"), + 'video_bitrate'=> config("vbrate"), + 'normal_res' => config('normal_resolution'), + 'high_res' => config('high_resolution'), + 'max_video_duration' => config('max_video_duration'), + 'res169' => $res169, + 'res43' => $res43, + 'resize'=>'max' + ); + + + + $ffmpeg = new ffmpeg($victimFile); + $ffmpeg->configs = $configs; + $ffmpeg->gen_thumbs = false; + $ffmpeg->gen_big_thumb = false; + $ffmpeg->num_of_thumbs = config('num_thumbs'); + $ffmpeg->thumb_dim = config('thumb_width')."x".config('thumb_height'); + $ffmpeg->big_thumb_dim = config('big_thumb_width')."x".config('big_thumb_height'); + $ffmpeg->tmp_dir = TEMP_DIR; + $ffmpeg->input_ext = $ext; + $ffmpeg->output_file = $victimOutput; + $ffmpeg->hq_output_file = $victimOutputHQ; + $ffmpeg->log_file = $testVidsDir.'/output.log'; + //$ffmpeg->remove_input = TRUE; + $ffmpeg->keep_original = config('keep_original'); + $ffmpeg->original_output_path = ORIGINAL_DIR.'/'.$tmp_file.'.'.$ext; + $ffmpeg->set_conv_lock = false; + $ffmpeg->showpre=true; + $ffmpeg->ClipBucket(); + + + $ffmpegpath = $Cbucket->configs['ffmpegpath']; + $ffmpegCommand = $ffmpeg->raw_command; + $msg[] = "FFMPEG Command So far
"; + //Lets start conversing videos + $converDetails = shell_output($ffmpegCommand); + $msg[] = "
".nl2br($ffmpeg->log); + + $victimDetails = $ffmpeg->input_details; + $vidDetails = $ffmpeg->output_details; + if(!$vidDetails) + { + + if($victimDetails['audio_codec']=='aac' || $victimDetails['audio_codec']=='ac3') + $err[] = "
A possible reason is beacuse videos with + AAC Audio does not encode without 'libfaac', set audio codec as libfaac and then try again
"; + if(!file_exists($victimFile) && $victim) + $err[] = "
No output file...your ffmpeg is not compatible
"; + else + $err[] = "
No output file...hmm post the log to dev team
"; + if(@filesize($victimOutput)>0 && file_exists($victimFile)) + $err[] = "
".nl2br(shell_output($Cbucket->configs['ffmpegpath'].' -i '.$victimOutput)); + theEnd(); + }else + { + $msg[] = "
".nl2br(shell_output($Cbucket->configs['ffmpegpath'].' -i '.$victimOutput)); + $msg[] = "
Video file is converted =D..
"; + } + + theEnd(); + } + } +} + + + +function theEnd($status=false) +{ + global $msg, $err; + if($err) + $errors = implode('',$err); + if($msg) + $messgs = implode('',$msg); + + echo json_encode(array('err'=>$errors,'msg'=>$messgs,'status'=>$status)); + exit(); +} +?> \ No newline at end of file diff --git a/upload/admin_area/language_settings.php b/upload/admin_area/language_settings.php new file mode 100644 index 00000000..c919fa9d --- /dev/null +++ b/upload/admin_area/language_settings.php @@ -0,0 +1,121 @@ +admin_login_check(); +$userquery->login_check('web_config_access'); +$pages->page_redir(); + +//Making Language Default +if(isset($_POST['make_default'])) +{ + $id = mysql_clean($_POST['make_default']); + $lang_obj->make_default($id); +} + +//Importing language +if(isset($_POST['add_language'])) +{ + $lang_obj->import_lang(); +} + +//Removig Langiage +if(isset($_GET['delete'])) +{ + $id = mysql_clean($_GET['delete']); + $lang_obj->delete_lang($id); +} + +//Updateing Language +if(isset($_POST['update_language'])) +{ + $_POST['lang_id'] = $_GET['edit_language']; + $lang_obj->update_lang($_POST); +} + +//Downloading Language +if(isset($_GET['download'])) +{ + $lang_obj->export_lang(mysql_clean($_GET['download'])); +} + +//Downloading Language +if(isset($_GET['action'])) +{ + $lang_obj->action_lang($_GET['action'],mysql_clean($_GET['id'])); +} + +//Create package +if(isset($_GET['create_package'])) +{ + if($lang_obj->createPack($_GET['create_package'])) + e("Language pack has been re-created","m"); +} + +//Create package +if(isset($_GET['recreate_from_pack'])) +{ + if($lang_obj->updateFromPack($_GET['recreate_from_pack'])) + e("Language database has been updated","m"); +} + + + +//Get List Of Languages +assign('language_list',$lang_obj->get_langs()); +Assign('msg',$msg); + + + +if($lang_obj->lang_exists(mysql_clean($_GET['edit_language']))) +{ + assign('edit_lang','yes'); + assign('lang_details',$lang_obj->lang_exists(mysql_clean($_GET['edit_language']))); + $edit_id = mysql_clean($_GET['edit_language']); + $limit = RESULTS; + + + $current_page = $_GET['page'] ; + $current_page = is_numeric($current_page) && $current_page>0 ? $current_page : 1 ; + + $curr_limit = ($current_page-1)*$limit .','.$limit; + + if(isset($_GET['search_phrase'])) + { + $varname = mysql_clean($_GET['varname']); + $text = mysql_clean($_GET['text']); + + if(!empty($varname)) + $varname_query = "varname LIKE '%$varname%'"; + if(!empty($text)) + $text_query = "text LIKE '%$text%'"; + + if(!empty($text_query) || !empty($varname_query)) + { + if(!empty($text_query) && !empty($varname_query) ) + $or = ' OR '; + $extra_param = " AND ( $varname_query $or $text_query )"; + } + } + + $lang_phrases = $lang_obj->get_phrases($edit_id,'*',$curr_limit,$extra_param); + $total_phrases = $lang_obj->count_phrases($edit_id,$extra_param); + + assign('lang_phrases',$lang_phrases); + + $total_pages = $total_phrases/$limit; + $total_pages = round($total_pages+0.49,0); + $pages->paginate($total_pages,$current_page); +} + + +subtitle("Language Settings"); +template_files('language_settings.html'); +display_it(); +?> \ No newline at end of file diff --git a/upload/admin_area/login.php b/upload/admin_area/login.php new file mode 100644 index 00000000..9ff94eaa --- /dev/null +++ b/upload/admin_area/login.php @@ -0,0 +1,50 @@ +is_admin_logged_as_user()) +{ + $userquery->revert_from_user(); + redirect_to(BASEURL.'/admin_area'); +} + +if($userquery->admin_login_check(TRUE)) +{ + redirect_to(BASEURL."/".ADMINDIR."/index.php"); +} +$eh->flush(); + +$thisurl = $_SERVER['PHP_SELF']; +Assign('THIS_URL', $thisurl); + +if(!empty($_REQUEST['returnto'])) +{ + $return_to = $_REQUEST['returnto']; + Assign('return_to',$return_to); +} + +if(isset($_POST['login'])){ + $username = $_POST['username']; + $username = mysql_clean(clean($username)); + $password = mysql_clean(clean($_POST['password'])); + + //Loggin User + if($userquery->login_user($username,$password)) + redirect_to('index.php'); + +} + + +if(userid() && !has_access('admin_access',true)) + e(lang("you_dont_hv_perms")); + +subtitle('Admin Login'); +Template('global_header.html'); +Template('login.html'); +?> \ No newline at end of file diff --git a/upload/admin_area/login_as_user.php b/upload/admin_area/login_as_user.php new file mode 100644 index 00000000..e3437bab --- /dev/null +++ b/upload/admin_area/login_as_user.php @@ -0,0 +1,27 @@ +is_admin_logged_as_user()) +{ + $userquery->admin_login_check(); + $userquery->login_check('member_moderation'); +} +$pages->page_redir(); + +if($_GET['revert']) +{ + $userquery->revert_from_user(); + redirect_to(BASEURL.'/admin_area'); +} +$uid = $_GET['uid']; + +if($userquery->login_as_user($uid)) + redirect_to(BASEURL); +display_it(); + +?> \ No newline at end of file diff --git a/upload/admin_area/logo_change.php b/upload/admin_area/logo_change.php new file mode 100644 index 00000000..6b2a3116 --- /dev/null +++ b/upload/admin_area/logo_change.php @@ -0,0 +1,19 @@ +admin_login_check(); +$pages->page_redir(); + + +subtitle("Logo Changer"); + +template_files('under_development.html'); +display_it(); +?> \ No newline at end of file diff --git a/upload/admin_area/logout.php b/upload/admin_area/logout.php new file mode 100644 index 00000000..390c0105 --- /dev/null +++ b/upload/admin_area/logout.php @@ -0,0 +1,5 @@ +logout(); +redirect_to('index.php'); +?> \ No newline at end of file diff --git a/upload/admin_area/main.php b/upload/admin_area/main.php new file mode 100644 index 00000000..0f08ab90 --- /dev/null +++ b/upload/admin_area/main.php @@ -0,0 +1,298 @@ +admin_login_check(); +$userquery->login_check('web_config_access'); + +$pages->page_redir(); + +if(@$_GET['msg']){ +$msg = mysql_clean($_GET['msg']); +} + +$opt_list = $Upload->load_upload_options(); +assign('opt_list',$opt_list); + +assign('post_max_size',ini_get('post_max_size')); +assign('upload_max_size',ini_get('upload_max_filesize')); + + +if(isset($_POST['update'])){ + $configs = $Cbucket->configs; + + $rows = array( + 'allowed_types', + 'allow_language_change', + 'allow_unicode_usernames', + 'allow_registeration', + 'allow_template_change', + 'allow_upload', + 'anonymous_id', + 'anonym_comments', + 'approve_video_notification', + 'audio_codec', + 'activation', + + 'background_color', + 'background_upload', + 'background_url', + 'big_thumb_width', + 'big_thumb_height', + + 'closed', + 'closed_msg', + 'channel_comments', + 'channels_list_per_page', + 'channels_list_per_tab', + 'channelsSection', + 'channel_rating', + 'collection_rating', + 'collectionsSection', + 'comments_per_page', + 'captcha_type', + 'con_modules_type', + 'comments_captcha', + 'comment_rating', + 'collection_per_page', + 'collection_home_page', + 'collection_search_result', + 'collection_user_collections', + 'collection_items_page', + 'collection_user_favorites', + 'collection_channel_page', + + 'embed_type', + + 'date_format', + 'description', + 'debug_level', + 'default_country_iso2', + 'default_time_zone', + 'disallowed_usernames', + 'use_subs', + + 'embedUpload', + 'email_verification', + 'enable_groups', + + 'ffmpegpath' , + 'flvtool2path', + 'flvtoolpp', + 'ffmpeg_type', + 'facebook_embed', + + 'gravatars', + 'grp_categories', + 'groups_list_per_page', + 'grps_items_search_page', + 'grp_thumb_height', + 'grp_thumb_width', + 'grp_max_title', + 'grp_max_desc', + 'groupsSection', + + 'high_resolution', + 'hq_output', + + 'keywords' , + 'keep_original', + 'keep_mp4_as_is', + + 'r_height', + 'r_width', + + 'max_bg_width', + 'max_bg_size', + 'max_conversion', + 'max_profile_pic_height', + 'max_profile_pic_size', + 'max_profile_pic_width', + 'max_topic_title', + 'max_video_title', + 'max_topic_length', + 'max_video_desc', + 'max_video_tags', + 'max_username', + 'min_video_title', + 'min_video_tags', + 'min_video_desc', + 'mp4boxpath', + 'mplayerpath', + 'min_age_reg', + 'min_username', + 'max_comment_chr', + 'max_time_wait', + 'max_upload_size', + 'max_video_duration', + 'mplayerpath', + + 'normal_resolution', + 'num_thumbs', + + 'own_channel_rating', + 'own_collection_rating', + 'own_video_rating', + + + 'php_path', + 'picture_url', + 'picture_upload', + 'photosSection', + 'photo_main_list', + 'photo_home_tabs', + 'photo_search_result', + 'photo_channel_page', + 'photo_user_photos', + 'photo_user_favorites', + 'photo_other_limit', + + + 'quick_conv', + + 'resize', + 'remoteUpload', + 'recently_viewed_limit', + + 'send_comment_notification', + 'site_title' , + 'sys_os' , + 'sbrate' , + 'srate', + 'site_slogan', + 'seo', + 'seo_vido_url', + 'search_list_per_page', + 'server_friendly_conversion', + 'support_email', + 'show_collapsed_checkboxes', + + 'thumb_width', + 'thumb_height', + + 'use_ffmpeg_vf', + 'use_crons', + 'user_comment_own', + 'user_rate_opt1' , + 'users_items_subscriptions', + 'users_items_subscibers', + 'users_items_contacts_channel', + 'users_items_search_page', + 'users_items_group_page', + 'user_max_chr', + 'use_cached_pagin', + 'cached_pagin_time', + + 'vid_categories', + 'vid_cat_height', + 'vid_cat_width', + 'videosSection', + 'videos_items_grp_page', + 'videos_items_hme_page', + 'videos_items_columns', + 'videos_items_ufav_page', + 'videos_items_uvid_page', + 'videos_items_search_page', + 'videos_item_channel_page', + 'videos_list_per_page', + 'videos_list_per_tab', + 'video_download' , + 'video_embed', + 'video_comments', + 'video_rating', + 'video_comments3', + 'video_categories', + 'video_codec', + 'vrate', + 'vbrate', + 'video_require_login', + + 'website_email', + 'welcome_email', + + + ); + + foreach($opt_list as $optl) + { + $rows[] = $optl['load_func']; + } + + //Numeric Array + $num_array = array( + 'anonymous_id', + + 'channels_list_per_page', + 'channels_list_per_tab', + + 'max_upload_size', + 'max_video_title', + 'max_video_desc', + 'max_video_tags', + 'min_video_title', + 'min_video_tags', + 'min_video_desc', + + 'recently_viewed_limit', + + 'search_list_per_page', + + 'users_items_subscriptions', + 'users_items_subscibers', + 'users_items_contacts_channel', + 'users_items_search_page', + 'users_items_group_page', + + 'videos_items_grp_page', + 'videos_items_hme_page', + 'videos_items_columns', + 'videos_items_ufav_page', + 'videos_items_uvid_page', + 'videos_items_search_page', + 'videos_item_channel_page', + 'videos_list_per_page', + 'videos_list_per_tab', + 'video_categories', + + 'photo_main_list', + 'photo_home_tabs', + 'photo_search_result', + 'photo_channel_page', + 'photo_user_photos', + 'photo_user_favorites', + 'photo_other_limit', + + 'collection_per_page', + 'collection_home_page', + 'collection_search_result', + 'collection_user_collections', + 'collection_items_page', + 'collection_user_favorites', + 'collection_channel_page', + ); + foreach($rows as $field) + { + $value = ($_POST[$field]); + if(in_array($field,$num_array)) + { + if($value <= 0 || !is_numeric($value)) + $value = 1; + } + $myquery->Set_Website_Details($field,$value); + } + e("Website Settings Have Been Updated",'m'); + +} + +$row = $myquery->Get_Website_Details(); +Assign('row',$row); +subtitle("Website Configurations"); +template_files('main.html'); +display_it(); +?> \ No newline at end of file diff --git a/upload/admin_area/maintenance.php b/upload/admin_area/maintenance.php new file mode 100644 index 00000000..fd451993 --- /dev/null +++ b/upload/admin_area/maintenance.php @@ -0,0 +1,146 @@ +admin_login_check(); +$userquery->login_check('web_config_access'); +$pages->page_redir(); + +/** + * Removing Inactive Sessions + */ +if(@$_GET['mode']=='remove_sessions') +{ + $db->Execute("DELETE from ".tbl("sessions")." WHERE + TIMESTAMPDIFF(MINUTE,last_active,now()) + > 5 AND session_string='guest'"); + $guest_sess = $db->Affected_Rows(); + $db->Execute("DELETE from ".tbl("sessions")." WHERE + TIMESTAMPDIFF(MINUTE,last_active,now()) + > ". COOKIE_TIMEOUT/60 ." AND session_string='smart_sess'"); + $smart_sess = $db->Affected_Rows(); + + if($guest_sess) + e("Removed '".$guest_sess."' inactive guest sessions","m"); + if($smart_sess) + e("Removed '".$smart_sess."' inactive user sessions","m"); + + if(!$guest_sess && !$smart_sess) + e("All inactive sessions are already removed","m"); + +} + + +/** + * Removing Old Access log + */ +if(@$_GET['mode']=='remove_access_log') +{ + $days = $_GET['days']; + $days = mysql_clean($days); + if(!is_numeric($days) || $days<1) + $days = 10; + $days = $days-1; + $query = "DELETE from ".tbl("action_log")." WHERE + DATEDIFF(now(),date_added) > ". $days; + + $db->Execute($query); + + $rows = $db->Affected_Rows(); + + $days++; + if($rows) + e($rows. " records removed from action log","m"); + else + e("Not enough action log found older than ".$days." days","m"); +} + + +if(@$_GET['mode']=='remove_activity_feed') +{ + + $start_index = $_GET['start_index'] ? $_GET['start_index'] : 0; + $loop_size = $_GET['loop_size']; + $loop_size = $loop_size ? $loop_size : 5; + assign('loop_size',$loop_size); + $next_index = $start_index+$loop_size; + assign('next_index',$next_index); + + + //Reindex Videos + + $msg = array(); + $users = get_users(array("usr_status"=>"Ok","limit"=>$start_index.",".$loop_size)); + + $total_users = get_users(array("count_only"=>true,"usr_status"=>"Ok")); + $percent = $cbindex->percent(50,$total_users); + $i = 0; + + + $days = $_GET['days']; + $days = mysql_clean($days); + if(!is_numeric($days) || $days<1) + $days = 10; + $days = $days-1; + + assign('total',$total_users); + assign('from',$start_index+1); + assign('days',$days); + + $to = $start_index+$loop_size; + if($to>=$total_users) + { + $to = $total_users; + e($total_users." users have been reindexed successfully.","m"); + assign("stop_loop","yes"); + } + assign('to',$to); + + while($i < $total_users) + { + if($users[$i]['userid']) + { + $deleted = 0; + $user_feed_dir = USER_FEEDS_DIR.'/'.$users[$i]['userid']; + if($user_feed_dir) + { + $feeds = glob($user_feed_dir.'/*.feed'); + if($feeds) + { + + foreach($feeds as $feed) + { + $fileName = getName($feed); + $now = time(); + + if($now-$fileName >= $days*24*60*60) + { + unlink($feed); + $deleted++; + } + + } + } + } + $msg[] = $users[$i]['userid'].": Removed '".$deleted."' activity feeds of ".$users[$i]['username'].""; + } + $i++; + + } + e($start_index+1 ." - ".$to." Activity feeds have been deleted.","m"); + assign("index_msgs",$msg); + assign("indexing","yes"); + assign('mode','remove_activity_feed'); +} + + +subtitle("Maintenance"); +template_files('maintenance.html'); +display_it(); +?> \ No newline at end of file diff --git a/upload/admin_area/manage_items.php b/upload/admin_area/manage_items.php new file mode 100644 index 00000000..11f949d1 --- /dev/null +++ b/upload/admin_area/manage_items.php @@ -0,0 +1,94 @@ +admin_login_check(); +$userquery->login_check('video_moderation'); +$pages->page_redir(); + +$id = mysql_clean($_GET['collection']); +$type = mysql_clean($_GET['type']); +$data = $cbcollection->get_collection($id); + +switch($type) +{ + case "photos": + { + + if(isset($_POST['remove_selected'])) + { + $total = count($_POST['check_obj']); + for($i=0;$i<$total;$i++) + { + $cbphoto->collection->remove_item($_POST['check_obj'][$i],$id); + $cbphoto->make_photo_orphan($id,$_POST['check_obj'][$i]); + } + $eh->flush(); + e($total." photos have been removed.","m"); + } + + if(isset($_POST['move_selected'])) + { + $total = count($_POST['check_obj']); + $new = mysql_clean($_POST['collection_id']); + for($i=0;$i<$total;$i++) + { + $cbphoto->collection->change_collection($new,$_POST['check_obj'][$i],$id); + $db->update(tbl('photos'),array('collection_id'),array($new)," collection_id = $id AND photo_id = ".$_POST['check_obj'][$i].""); + } + $eh->flush(); + e($total." photo(s) have been moved to '".get_collection_field($new,'collection_name')."'","m"); + + } + + $items = $cbphoto->collection->get_collection_items_with_details($id); + $collection = $cbphoto->collection->get_collections(array("type"=>"photos","user"=>$data['userid'])); + } + break; + + case "videos": + { + + if(isset($_POST['remove_selected'])) + { + $total = count($_POST['check_obj']); + for($i=0;$i<$total;$i) + { + $cbvideo->collection->remove_item($_POST['check_obj'][$i],$id); + } + } + + if(isset($_POST['move_selected'])) + { + $total = count($_POST['check_obj']); + $new = mysql_clean($_POST['collection_id']); + for($i=0;$i<$total;$i++) + { + $cbvideo->collection->change_collection($new,$_POST['check_obj'][$i],$id); + } + $eh->flush(); + e($total." video(s) have been moved to '".get_collection_field($new,'collection_name')."'","m"); + + } + + $items = $cbvideo->collection->get_collection_items_with_details($id); + $collection = $cbvideo->collection->get_collections(array("type"=>"videos","user"=>$data['userid'])); + } +} + + + +assign('data',$data); +assign('obj',$items); +assign('type',$type); +assign('c',$collection); + +subtitle("Manage Items"); +template_files('manage_items.html'); +display_it(); +?> \ No newline at end of file diff --git a/upload/admin_area/manage_pages.php b/upload/admin_area/manage_pages.php new file mode 100644 index 00000000..e36e0124 --- /dev/null +++ b/upload/admin_area/manage_pages.php @@ -0,0 +1,127 @@ +admin_login_check(); +$userquery->login_check('web_config_access'); + +$pages->page_redir(); + +//Activating Page +if(isset($_GET['activate'])) +{ + $pid = mysql_clean($_GET['activate']); + $cbpage->page_actions('activate',$pid); +} + +//Dectivating Page +if(isset($_GET['deactivate'])) +{ + $pid = mysql_clean($_GET['deactivate']); + $cbpage->page_actions('deactivate',$pid); +} +//Deleting +if(isset($_GET['delete'])) +{ + $pid = mysql_clean($_GET['delete']); + $cbpage->page_actions('delete',$pid); +} +//Displaying +if(isset($_GET['display'])) +{ + $pid = mysql_clean($_GET['display']); + $cbpage->page_actions('display',$pid); +} + +//Hiding +if(isset($_GET['hide'])) +{ + $pid = mysql_clean($_GET['hide']); + $cbpage->page_actions('hide',$pid); +} +if(isset($_POST['activate_selected'])){ + for($id=0;$id<=count($_POST['check_page']);$id++){ + $cbpage->page_actions('activate',$_POST['check_page'][$id]); + } + $eh->flush(); + e("Selected pages have been activated","m"); +} + +if(isset($_POST['deactivate_selected'])){ + for($id=0;$id<=count($_POST['check_page']);$id++){ + $cbpage->page_actions('deactivate',$_POST['check_page'][$id]); + } + $eh->flush(); + e("Selected pages have been deactivated","m"); +} +if(isset($_POST['delete_selected'])){ + for($id=0;$id<=count($_POST['check_page']);$id++){ + $cbpage->page_actions('delete',$_POST['check_page'][$id]); + } + $eh->flush(); + e("Selected pages have been deleted","m"); +} + +$mode = $_GET['mode']; + +if(isset($_POST['add_page'])) +{ + if($cbpage->create_page($_POST)) + $mode = 'view'; + if(!error()) + header('location:manage_pages.php?msg='.msg('0')); +} + +//Updating order +if(isset($_POST['update_order'])) +{ + $cbpage->update_order(); + e(lang("Page order has been updated"),"m"); +} + +switch($mode) +{ + case "new": + { + assign("mode","new"); + } + break; + + case "view": + default: + { + if($_GET['msg']) + e(mysql_clean($_GET['msg']),"m"); + + assign("mode","manage"); + assign("cbpages",$cbpage->get_pages()); + } + break; + case "edit": + { + if(isset($_POST['update_page'])) + { + $_POST['page_id'] = $_GET['pid']; + $cbpage->edit_page($_POST); + } + + assign("mode","edit"); + $page = $cbpage->get_page(mysql_clean($_GET['pid'])); + assign('page',$page); + if(!$page) + e("Page does not exist"); + } + +} +subtitle("Manage Pages"); +template_files('manage_pages.html'); +display_it(); + + +?> \ No newline at end of file diff --git a/upload/admin_area/manage_players.php b/upload/admin_area/manage_players.php new file mode 100644 index 00000000..d8ad539a --- /dev/null +++ b/upload/admin_area/manage_players.php @@ -0,0 +1,65 @@ +admin_login_check(); +$pages->page_redir(); +$userquery->login_check('admin_access'); + +//Set Mode +assign('mode',$_GET['mode']); + +if(isset($_POST['update'])){ + $configs = $Cbucket->configs; + + + $rows = array( + 'autoplay_video', + 'buffer_time', + 'logo_placement', + 'use_playlist', + 'youtube_enabled', + 'embed_player_height', + 'embed_player_width','autoplay_embed','pseudostreaming','pak_license','pakplayer_contextmsg' + ); + + //Checking for logo + if(isset($_FILES['logo_file']['name'])) + { + $logo_file = $Upload->upload_website_logo($_FILES['logo_file']); + if($logo_file) + $myquery->Set_Website_Details('player_logo_file',$logo_file); + } + + + if($_POST['pak_license'] && !file_exists(BASEDIR.'/player/pak_player/pakplayer.unlimited.swf')) + $_POST['pak_license'] = ""; + + foreach($rows as $field) + { + $value = mysql_clean($_POST[$field]); + $myquery->Set_Website_Details($field,$value); + } + e("Player Settings Have Been Updated",'m'); + +} + + +if($_GET['set']) +{ + $cbplayer->set_player($_GET); +} + +$row = $myquery->Get_Website_Details(); +Assign('row',$row); + +subtitle("Manage Players"); +template_files('manage_players.html'); +display_it(); +?> \ No newline at end of file diff --git a/upload/admin_area/mass_email.php b/upload/admin_area/mass_email.php new file mode 100644 index 00000000..2e3918a3 --- /dev/null +++ b/upload/admin_area/mass_email.php @@ -0,0 +1,76 @@ +admin_login_check(); +$userquery->login_check('member_moderation'); +$pages->page_redir(); + +if(!empty($_GET['email'])){ + Assign('email',$_GET['email']); +} + +//Creating an mass email +if(isset($_POST['create_email'])) +{ + if($cbemail->add_mass_email()) + { + unset($_POST); + } +} + +//Deleting Email +if(isset($_GET['delete'])) +{ + $del = mysql_clean($_GET['delete']); + $cbemail->action($del,'delete'); +} + +//Sending Email +if(isset($_GET['send_email'])) +{ + $eId = mysql_clean($_GET['send_email']); + $email = $cbemail->get_email($eId); + if($email) + { + $msgs = $cbemail->send_emails($email); + assign('msgs',$msgs); + + $email = $cbemail->get_email($eId); + assign('send_email',$email); + } +} + +//Getting List of emails +$emails = $cbemail->get_mass_emails(); +assign('emails',$emails); + +//Category Array... +if(is_array($_POST['category'])) + $cats_array = array($_POST['category']); +else +{ + preg_match_all('/#([0-9]+)#/',$_POST['category'],$m); + $cats_array = array($m[1]); +} +$cat_array = array(lang('vdo_cat'), + 'type'=> 'checkbox', + 'name'=> 'category[]', + 'id'=> 'category', + 'value'=> array('category',$cats_array), + 'hint_1'=> lang('vdo_cat_msg'), + 'display_function' => 'convert_to_categories', + 'category_type'=>'user'); +assign('cat_array',$cat_array); + +//Displaying template... +subtitle("Mass Email"); +template_files("mass_email.html"); +display_it(); +?> \ No newline at end of file diff --git a/upload/admin_area/mass_uploader.php b/upload/admin_area/mass_uploader.php new file mode 100644 index 00000000..abeb4846 --- /dev/null +++ b/upload/admin_area/mass_uploader.php @@ -0,0 +1,72 @@ +admin_login_check(); +$pages->page_redir(); + + +if(isset($_POST['mass_upload_video'])) +{ + $files = $cbmass->get_video_files(); + + $total = count($_POST['mass_up']); + for($i=0;$i<$total;$i++) + { + $file_key = time().RandomString(5); + $file_arr = $files[$i]; + + if($cbmass->is_mass_file($file_arr)) + { + $code = $i+1; + //Inserting Video Data... + $array = array + ( + 'title' => $_POST['title'][$i], + 'description' => $_POST['description'][$i], + 'tags' => $_POST['tags'][$i], + 'category' => $_POST['category'.$code], + 'file_name' => $file_key, + ); + $vid = $Upload->submit_upload($array); + }else{ + e("\"".$file_arr['title']."\" is not available"); + } + + if(error()) + { + $error_lists[] = "Unable to upload \"".$file_arr['title']."\""; + $errors = error(); + foreach($errors as $e) + $error_lists[] = $e; + + $eh->flush_error(); + }else{ + e("\"".$file_arr['title']."\" Has been uploaded successfully","m"); + } + + if($vid) + { + //Moving file to temp dir and Inserting in conversion queue.. + $file_name = $cbmass->move_to_temp($file_arr,$file_key); + $Upload->add_conversion_queue($file_name); + } + } +} + +if(count($error_lists)>0) +{ + foreach($error_lists as $e) + e($e); +} + +subtitle("Mass Uploader"); +template_files("mass_uploader.html"); +display_it(); +?> \ No newline at end of file diff --git a/upload/admin_area/members.php b/upload/admin_area/members.php new file mode 100644 index 00000000..6459018d --- /dev/null +++ b/upload/admin_area/members.php @@ -0,0 +1,178 @@ +admin_login_check(); +$userquery->login_check('member_moderation'); +$pages->page_redir(); + + +//Delete User +if(isset($_GET['deleteuser'])){ + $deleteuser = mysql_clean($_GET['deleteuser']); + $userquery->delete_user($deleteuser); +} + +//Deleting Multiple Videos +if(isset($_POST['delete_selected'])){ + for($id=0;$id<=count($_POST['check_user']);$id++) + $userquery->delete_user($_POST['check_user'][$id]); + $eh->flush(); + e("Selected users have been deleted","m"); +} + +//Activate User +if(isset($_GET['activate'])){ + $user = mysql_clean($_GET['activate']); + $userquery->action('activate',$user); +} +//Deactivate User +if(isset($_GET['deactivate'])){ + $user = mysql_clean($_GET['deactivate']); + $userquery->action('deactivate',$user); +} + +//Using Multple Action +if(isset($_POST['activate_selected'])){ + for($id=0;$id<=count($_POST['check_user']);$id++){ + $userquery->action('activate',$_POST['check_user'][$id]); + } + $eh->flush(); + e("Selected users have been activated","m"); +} +if(isset($_POST['deactivate_selected'])){ + for($id=0;$id<=count($_POST['check_user']);$id++){ + $userquery->action('deactivate',$_POST['check_user'][$id]); + } + $eh->flush(); + e("Selected users have been deactivated","m"); +} + +//Make User Featured +if(isset($_GET['featured'])){ + $user = mysql_clean($_GET['featured']); + $userquery->action('featured',$user); +} +//Make User UnFeatured +if(isset($_GET['unfeatured'])){ + $user = mysql_clean($_GET['unfeatured']); + $userquery->action('unfeatured',$user); +} +//Using Multple Action +if(isset($_POST['make_featured_selected'])){ + for($id=0;$id<=count($_POST['check_user']);$id++){ + $userquery->action('featured',$_POST['check_user'][$id]); + } + $eh->flush(); + e("Selected users have been set as featured","m"); +} +if(isset($_POST['make_unfeatured_selected'])){ + for($id=0;$id<=count($_POST['check_user']);$id++){ + $userquery->action('unfeatured',$_POST['check_user'][$id]); + } + $eh->flush(); + e("Selected users have been removed from featured list","m"); +} + +//Ban User +if(isset($_GET['ban'])){ + $user = mysql_clean($_GET['ban']); + $userquery->action('ban',$user); +} +//UnBan User +if(isset($_GET['unban'])){ + $user = mysql_clean($_GET['unban']); + $userquery->action('unban',$user); +} + +//Using Multple Action +if(isset($_POST['ban_selected'])){ + for($id=0;$id<=count($_POST['check_user']);$id++){ + $userquery->action('ban',$_POST['check_user'][$id]); + } + $eh->flush(); + e("Selected users have been banned","m"); +} + +if(isset($_POST['unban_selected'])){ + for($id=0;$id<=count($_POST['check_user']);$id++){ + $userquery->action('unban',$_POST['check_user'][$id]); + } + $eh->flush(); + e("Selected users have been unbanned","m"); +} + + + //Calling Video Manager Functions + call_functions($userquery->user_manager_functions); + + //Getting Member List + $page = mysql_clean($_GET['page']); + $get_limit = create_query_limit($page,RESULTS); + + if(isset($_GET['search'])) + { + + $array = array + ( + 'userid' => $_GET['userid'], + 'username' => $_GET['username'], + 'category' => $_GET['category'], + 'featured' => $_GET['featured'], + 'ban' => $_GET['ban'], + 'status' => $_GET['status'], + 'email' => $_GET['email'], + 'gender' => $_GET['gender'], + 'level' => $_GET['level'] + ); + } + + $result_array = $array; + //Getting Video List + $result_array['limit'] = $get_limit; + if(!$array['order']) + $result_array['order'] = " doj DESC "; + + $users = get_users($result_array); + + Assign('users', $users); + + //Collecting Data for Pagination + $mcount = $array; + $mcount['count_only'] = true; + $total_rows = get_users($mcount); + $total_pages = count_pages($total_rows,RESULTS); + $pages->paginate($total_pages,$page); + + //Pagination + $pages->paginate($total_pages,$page); + + //Category Array + if(is_array($_GET['category'])) + $cats_array = array($_GET['category']); + else + { + preg_match_all('/#([0-9]+)#/',$_GET['category'],$m); + $cats_array = array($m[1]); + } + $cat_array = array(lang('vdo_cat'), + 'type'=> 'checkbox', + 'name'=> 'category[]', + 'id'=> 'category', + 'value'=> array('category',$cats_array), + 'hint_1'=> lang('vdo_cat_msg'), + 'display_function' => 'convert_to_categories', + 'category_type'=>'user'); + assign('cat_array',$cat_array); + + +subtitle("Members Manager"); +template_files('members.html'); +display_it(); +?> diff --git a/upload/admin_area/module_manager.php b/upload/admin_area/module_manager.php new file mode 100644 index 00000000..b2f8637c --- /dev/null +++ b/upload/admin_area/module_manager.php @@ -0,0 +1,17 @@ +admin_login_check(); +$pages->page_redir(); + + +template_files('under_development.html'); +display_it(); +?> \ No newline at end of file diff --git a/upload/admin_area/notification_settings.php b/upload/admin_area/notification_settings.php new file mode 100644 index 00000000..a548d1ad --- /dev/null +++ b/upload/admin_area/notification_settings.php @@ -0,0 +1,40 @@ +admin_login_check(); +$pages->page_redir(); + + + if($_POST['update_notification']) + { + $rows = array( + 'notification_option'); + + + foreach($rows as $field) + { + $value = $_POST[$field]; + $myquery->Set_Website_Details($field,$value); + } + + + e("Notification Settings Have Been Updated",'m'); + + subtitle("Notification Settings"); + } + + +$row = $myquery->Get_Website_Details(); +assign('row',$row); + +template_files('notification_settings.html'); +display_it(); + +?> \ No newline at end of file diff --git a/upload/admin_area/online_users.php b/upload/admin_area/online_users.php new file mode 100644 index 00000000..b9d520f0 --- /dev/null +++ b/upload/admin_area/online_users.php @@ -0,0 +1,31 @@ +admin_login_check(); +$pages->page_redir(); + +if($_GET['kick']) +{ + if($sess->kick(mysql_clean($_GET['kick']))) + { + e("User has been kicked out","m"); + } +} + +$online_users = $userquery->get_online_users(false); +assign('total',count($online_users)); +assign('online_users',$online_users); +assign('queryString',queryString(NULL,'kick')); +subtitle("View online users"); +template_files('online_users.html'); +display_it(); + + +?> \ No newline at end of file diff --git a/upload/admin_area/orphan_photos.php b/upload/admin_area/orphan_photos.php new file mode 100644 index 00000000..34642230 --- /dev/null +++ b/upload/admin_area/orphan_photos.php @@ -0,0 +1,79 @@ +admin_login_check(); +$userquery->login_check('video_moderation'); +$pages->page_redir(); + +if(isset($_GET['delete_photo'])) +{ + $id = mysql_clean($_GET['delete_photo']); + $cbphoto->delete_photo($id); +} + +//Thanks to didier.saintes +if(isset($_POST['delete_selected'])) //HACK : delete_selected in place of deleted_selected +{ + + $total = count($_POST['check_photo']); //HACK Add count + for($i=0;$i<$total;$i++)g +{ + $cbphoto->delete_photo($_POST['check_photo'][$i],true); //HACK : Add true + } + $eh->flush(); + e($total." photos has been deleted successfully.","m"); +} + +//Multi-featured +if(isset($_POST['make_featured_selected'])) +{ + $total = count($_POST['check_photo']); + for($i=0;$i<$total;$i++) + { + $cbphoto->photo_actions('feature_photo',$_POST['check_photo'][$i]); + } + $eh->flush(); + e($total." photos has been marked as Featured","m"); +} + +//Multi-unfeatured +if(isset($_POST['make_unfeatured_selected'])) +{ + $total = count($_POST['check_photo']); + for($i=0;$i<$total;$i++) + { + $cbphoto->photo_actions('unfeature_photo',$_POST['check_photo'][$i]); + } + $eh->flush(); + e($total." photos has been marked as Unfeatured","m"); +} + +if(isset($_POST['move_selected'])) +{ + $total = count($_POST['check_photo']); + $new = mysql_clean($_POST['collection_id']); + for($i=0;$i<$total;$i++) + { + $cbphoto->collection->change_collection($new,$_POST['check_photo'][$i]); + $db->update(tbl('photos'),array('collection_id'),array($new)," photo_id = ".$_POST['check_photo'][$i].""); + } + $eh->flush(); + e($total." photo(s) have been moved to '".get_collection_field($new,'collection_name')."'","m"); + +} + +$photos = $cbphoto->get_photos(array("get_orphans"=>TRUE)); +$collection = $cbphoto->collection->get_collections(array("type"=>"photos")); +assign('photos',$photos); +assign('c',$collection); + +subtitle("Orphan Photos"); +template_files('orphan_photos.html'); +display_it(); +?> \ No newline at end of file diff --git a/upload/admin_area/photo_manager.php b/upload/admin_area/photo_manager.php new file mode 100644 index 00000000..706f280a --- /dev/null +++ b/upload/admin_area/photo_manager.php @@ -0,0 +1,164 @@ +admin_login_check(); +$userquery->login_check('video_moderation'); +$pages->page_redir(); + +//Photo Actions are following + +//Feature +if(isset($_GET['make_feature'])) +{ + $id = mysql_clean($_GET['make_feature']); + $cbphoto->photo_actions('feature_photo',$id); +} + +//Unfeature +if(isset($_GET['make_unfeature'])) +{ + $id = mysql_clean($_GET['make_unfeature']); + $cbphoto->photo_actions('unfeature_photo',$id); +} + +//Activate +if(isset($_GET['activate'])) +{ + $id = mysql_clean($_GET['activate']); + $cbphoto->photo_actions('activation',$id); +} + +//Deactivate +if(isset($_GET['deactivate'])) +{ + $id = mysql_clean($_GET['deactivate']); + $cbphoto->photo_actions('deactivation',$id); +} + +//Delete +if(isset($_GET['delete_photo'])) +{ + $id = mysql_clean($_GET['delete_photo']); + $cbphoto->delete_photo($id); +} + +//Multi-Active +if(isset($_POST['deactivate_selected'])) +{ + $total = count($_POST['check_photo']); + for($i=0;$i<$total;$i++) + { + $cbphoto->photo_actions('deactivation',$_POST['check_photo'][$i]); + } + $eh->flush(); + e($total." photos has been deactivated","m"); +} + +//Multi-Deactive +if(isset($_POST['activate_selected'])) +{ + $total = count($_POST['check_photo']); + for($i=0;$i<$total;$i++) + { + $cbphoto->photo_actions('activation',$_POST['check_photo'][$i]); + } + $eh->flush(); + e($total." photos has been activated","m"); +} + +//Multi-featured +if(isset($_POST['make_featured_selected'])) +{ + $total = count($_POST['check_photo']); + for($i=0;$i<$total;$i++) + { + $cbphoto->photo_actions('feature_photo',$_POST['check_photo'][$i]); + } + $eh->flush(); + e($total." photos has been marked as Featured","m"); +} + +//Multi-unfeatured +if(isset($_POST['make_unfeatured_selected'])) +{ + $total = count($_POST['check_photo']); + for($i=0;$i<$total;$i++) + { + $cbphoto->photo_actions('unfeature_photo',$_POST['check_photo'][$i]); + } + $eh->flush(); + e($total." photos has been marked as Unfeatured","m"); +} + +//Multi-delete +if(isset($_POST['delete_selected'])) +{ + $total = count($_POST['check_photo']); + for($i=0;$i<$total;$i++) + { + $cbphoto->delete_photo($_POST['check_photo'][$i]); + } + $eh->flush(); + e($total." photos has been deleted successfully","m"); +} + +if(isset($_POST['move_to_selected'])) +{ + $total = count($_POST['check_photo']); + for($i=0;$i<$total;$i++) + { + $id_array[] = $_POST['check_photo'][$i]; + } + //$eh->flush(); +} + +if(isset($_GET['search'])) +{ + $array = array( + 'title' => $_GET['title'], + 'pid' => $_GET['photoid'], + 'key' => $_GET['photokey'], + 'tags' => $_GET['tags'], + 'featured' => $_GET['featured'], + 'active' => $_GET['active'], + 'user' => $_GET['userid'], + 'extension' => $_GET['extension'], + 'order' => $_GET['order'] + ); +} + +$parr = $array; + +// Creating Limit +$page = mysql_clean($_GET['page']); +$get_limit = create_query_limit($page,RESULTS); + +$parr['limit'] = $get_limit; +if(!$parr['order']) + $parr['order'] = " date_added DESC "; +else + $parr['order'] = $parr['order']." DESC"; + +$collections = $cbcollection->get_collections(array("type"=>"photos")); +$photos = $cbphoto->get_photos($parr); +Assign('photos', $photos); +assign('c',$collections); + +$pcount = $parr; +$pcount['count_only'] = true; +$total_rows = $cbphoto->get_photos($pcount); +$total_pages = count_pages($total_rows,RESULTS); +$pages->paginate($total_pages,$page); + + +subtitle("Photo Manager"); +template_files('photo_manager.html'); +display_it(); +?> \ No newline at end of file diff --git a/upload/admin_area/photo_settings.php b/upload/admin_area/photo_settings.php new file mode 100644 index 00000000..240e0938 --- /dev/null +++ b/upload/admin_area/photo_settings.php @@ -0,0 +1,107 @@ +admin_login_check(); +$userquery->login_check('video_moderation'); +$pages->page_redir(); + +$mode = $_GET['mode']; +assign('mode',$mode); + +switch($mode) +{ + case "photo_settings": + default: + { + if($_POST['update']) + { + $rows = array( + 'photo_ratio', + 'photo_thumb_width', + 'photo_thumb_height', + 'photo_med_width', + 'photo_med_height', + 'photo_lar_width', + 'photo_crop', + 'photo_multi_upload', + 'max_photo_size', + 'own_photo_rating', + 'photo_download', + 'photo_comments', + 'photo_rating'); + + $numeric = array( + 'photo_thumb_width', + 'photo_thumb_height', + 'photo_med_width', + 'photo_med_height', + 'photo_lar_width', + 'photo_crop', + 'max_photo_size', + 'photo_multi_upload'); + + foreach($rows as $field) + { + $value = $_POST[$field]; + if(in_array($field,$numeric)) + { + if($value < 0 || !is_numeric($value)) + $value = 1; + } + $myquery->Set_Website_Details($field,$value); + } + e("Photo Settings Have Been Updated",'m'); + } + + + subtitle("Photo Settings"); + } + break; + + case "watermark_settings": + { + if($_POST['update_watermark']) + { + $rows = array( + 'watermark_photo', + 'watermark_max_width', + 'watermark_placement'); + $numeric = array( + 'watermark_max_width' + ); + + foreach($rows as $field) + { + $value = $_POST[$field]; + if(in_array($filed,$numeric)) + { + if($value < 0 || !is_numeric($value)) + $value = 1; + } + $myquery->Set_Website_Details($field,$value); + } + if(!empty($_FILES['watermark_file']['tmp_name'])) + $cbphoto->update_watermark($_FILES['watermark_file']); + + e("Watermark Settings Have Been Updated",'m'); + + subtitle("Watermark Settings"); + } + } + break; +} + +$row = $myquery->Get_Website_Details(); +assign('row',$row); + +template_files('photo_settings.html'); +display_it(); + +?> \ No newline at end of file diff --git a/upload/admin_area/phpinfo.php b/upload/admin_area/phpinfo.php new file mode 100644 index 00000000..7fb7d407 --- /dev/null +++ b/upload/admin_area/phpinfo.php @@ -0,0 +1,13 @@ +admin_login_check(); +phpinfo(); +?> \ No newline at end of file diff --git a/upload/admin_area/plugin.php b/upload/admin_area/plugin.php new file mode 100644 index 00000000..f3573743 --- /dev/null +++ b/upload/admin_area/plugin.php @@ -0,0 +1,37 @@ +admin_login_check(); +$userquery->login_check('video_moderation'); +$pages->page_redir(); + +$file = get('file'); +$folder = get('folder'); +$player = get('player'); + +$folder = str_replace('..', '', $folder); +$file = str_replace('..', '', $file); +$player = str_replace('..', '', $player); + +if($folder && $file) +{ + if(!$player) + $file = PLUG_DIR.'/'.$folder.'/'.$file; + else + $file = PLAYER_DIR.'/'.$folder.'/'.$file; + + if(file_exists($file)) + { + require($file); + display_it(); + exit(); + } +} + +header('location:plugin_manager.php?err=no_file'); +?> \ No newline at end of file diff --git a/upload/admin_area/plugin_manager.php b/upload/admin_area/plugin_manager.php new file mode 100644 index 00000000..092de581 --- /dev/null +++ b/upload/admin_area/plugin_manager.php @@ -0,0 +1,117 @@ +admin_login_check(); +$pages->page_redir(); + + + +//unnstalling Plugin +if(isset($_GET['uninstall'])) +{ + $folder = $_GET['f']; + $cbplugin->uninstallPlugin(mysql_clean($_GET['uninstall']),$folder); +} + +/** + * Uninstalling Multiple Plugins + */ +if(isset($_POST['uninstall_selected'])) +{ + $plugs = count($_POST['check_plugin']); + for($i=0;$i<$plugs;$i++) + { + $itr = $_POST['check_plugin'][$i]; + $cbplugin->uninstallPlugin($_POST['plugin_file_'.$itr],$_POST['plugin_folder_'.$itr]); + } +} + + + +//Activation or deactivating plugin +if(isset($_GET['activate'])) +{ + $folder = $_GET['f']; + $id = mysql_clean($_GET['activate']); + $msg = $cbplugin->pluginActive($id,'yes',$folder); +} + +/** + * Activating Multiple + */ +if(isset($_POST['activate_selected'])) +{ + $plugs = count($_POST['check_plugin']); + for($i=0;$i<$plugs;$i++) + { + $itr = $_POST['check_plugin'][$i]; + $cbplugin->pluginActive($_POST['plugin_file_'.$itr],'yes',$_POST['plugin_folder_'.$itr]); + } +} + +if(isset($_GET['deactivate'])) +{ + $folder = $_GET['f']; + $id = mysql_clean($_GET['deactivate']); + $msg = $cbplugin->pluginActive($id,'no',$folder); +} + + +/** + * dectivating Multiple + */ +if(isset($_POST['deactivate_selected'])) +{ + $plugs = count($_POST['check_plugin']); + for($i=0;$i<$plugs;$i++) + { + $itr = $_POST['check_plugin'][$i]; + $cbplugin->pluginActive($_POST['plugin_file_'.$itr],'no',$_POST['plugin_folder_'.$itr]); + } +} + +//Installing Plugin +if(isset($_GET['install_plugin'])) +{ + $folder = $_GET['f']; + $installed = $cbplugin->installPlugin(mysql_clean($_GET['install_plugin']),$folder); + if($installed) + include($installed); +} + +/** + * Installing Multiple Plugins + */ +if(isset($_POST['install_selected'])) +{ + $plugs = count($_POST['check_plugin']); + for($i=0;$i<$plugs;$i++) + { + $itr = $_POST['check_plugin'][$i]; + $installed = $cbplugin->installPlugin($_POST['plugin_file_'.$itr],$_POST['plugin_folder_'.$itr]); + if($installed) + include($installed); + } +} + +//Get New Plugin List +$availabe_plugin_list = $cbplugin->getNewPlugins(); +Assign('new_plugin_list',$availabe_plugin_list); + +//Get Installed Plugin List +$installed_plugin_list = $cbplugin->getInstalledPlugins(); + +Assign('installed_plugin_list',$installed_plugin_list); + +Assign('msg', @$msg); +subtitle("Plugin Manager"); +template_files('plugin_manager.html'); +display_it(); +?> \ No newline at end of file diff --git a/upload/admin_area/recreate_thumbs.php b/upload/admin_area/recreate_thumbs.php new file mode 100644 index 00000000..a38d6e2d --- /dev/null +++ b/upload/admin_area/recreate_thumbs.php @@ -0,0 +1,116 @@ +admin_login_check(); +$userquery->login_check('video_moderation'); +$pages->page_redir(); + +$mode = $_GET['mode']; +$photo = mysql_clean($_GET['photo']); + + +switch($mode) +{ + case "single": + { + assign('mode',$mode); + if($cbphoto->photo_exists($photo)) + { + + + if($_GET['recreate']) + { + $cbphoto->generate_photos($photo); + e("Photo has been re-created. Please remove cache if you dont see any change.","m"); + } + + $files = $cbphoto->get_image_file($photo,'t',TRUE); + $p = $cbphoto->get_photo($photo); + + assign('files',$files); + assign('p',$p); + } else + e("Photo does not exist"); + } + break; + + case "mass": + default: + { + assign('mode',$mode); + $start_index = $_GET['start_index'] ? $_GET['start_index'] : 0; + $loop_size = $_GET['loop_size']; + $loop_size = $loop_size ? $loop_size : 2; + assign('loop_size',$loop_size); + $next_index = $start_index+$loop_size; + assign('next_index',$next_index); + if(isset($_GET['mass_recreation'])) + { + $photos = $cbphoto->get_photos(array("limit"=>$start_index.",".$loop_size)); + $total = $cbphoto->get_photos(array("count_only"=>true)); + $i = 0; + + assign('total',$total); + assign('from',$start_index+1); + $to = $start_index+$loop_size; + if($to>$total) + { + $to = $total; + e($total." photos image have been recreated.","m"); + assign("stop_loop","yes"); + } + assign('to',$to); + + while($i < $total) + { + if($photos[$i]['photo_id']) + { + $cbphoto->generate_photos($photos[$i]['photo_id']); + $msg[] = $photos[$i]['photo_id'].": Updating ".$photos[$i]['photo_title'].""; + } + $i++; + } + e($start_index+1 ." - ".$to." photos image have been recreated.","m"); + assign("index_msgs",$msg); + assign("indexing","yes"); + assign('button','mass_recreation'); + } + } + break; + + case "collection": + { + assign('mode',$mode); + $cid = mysql_clean($_GET['cid']); + if($cbphoto->collection->collection_exists($cid)) + { + if(isset($_POST['recreating'])) + { + $total = count($_POST['check_photo']); + for($i=0;$i<$total;$i++) + { + $cbphoto->generate_photos($_POST['check_photo'][$i]); + } + $eh->flush(); + e($total." photo(s) have been re-created. Please remove browser cache if you don't see any change.","m"); + } + $items = $cbphoto->collection->get_collection_items_with_details($cid); + assign('items',$items); + } else { + e(lang("Collection does not exist")); + } + } + break; +} + +subtitle("Recreate Photos"); +template_files('recreate_thumbs.html'); +display_it(); +?> \ No newline at end of file diff --git a/upload/admin_area/reindex_cb.php b/upload/admin_area/reindex_cb.php new file mode 100644 index 00000000..6cbb4671 --- /dev/null +++ b/upload/admin_area/reindex_cb.php @@ -0,0 +1,232 @@ +admin_login_check(); +$pages->page_redir(); + +$vtbl = tbl("video"); +$utbl = tbl("users"); +$gtbl = tbl("groups"); + +function p_r($array) +{ + echo "
";
+		print_r($array);
+	echo "
"; +} + +$start_index = $_GET['start_index'] ? $_GET['start_index'] : 0; +$loop_size = $_GET['loop_size']; +$loop_size = $loop_size ? $loop_size : 5; +assign('loop_size',$loop_size); +$next_index = $start_index+$loop_size; +assign('next_index',$next_index); + +//Reindex Videos +if(isset($_GET['index_vids'])) +{ + $videos = get_videos(array("active"=>"yes","status"=>"Successful","limit"=>$start_index.",".$loop_size)); + $total_videos = get_videos(array("count_only"=>true,"active"=>"yes","status"=>"Successful")); + $percent = number_format(50 * $total_videos / 100); + $i = 0; + + assign('total',$total_videos); + assign('from',$start_index+1); + $to = $start_index+$loop_size; + if($to>$total_videos) + { + $to = $total_videos; + e($total_videos." videos have been reindexed successfully.","m"); + assign("stop_loop","yes"); + } + assign('to',$to); + + + + while($i < $total_videos) + { + if($videos[$i]['videoid']) + { + $params = array("video_id"=>$videos[$i]['videoid'],"video_comments"=>true,"favs_count"=>true,"playlist_count"=>true); + $indexes = $cbindex->count_index("vid",$params); + $fields = $cbindex->extract_fields("vid",$params); + $msg[] = $videos[$i]['video'].": Updating ".$videos[$i]['title'].""; + $cbindex->update_index("vid",array("fields"=>$fields,"values"=>$indexes,"video_id"=>$videos[$i]['videoid'])); + } + $i++; + } + e($start_index+1 ." - ".$to." videos have been reindexed successfully.","m"); + assign("index_msgs",$msg); + assign("indexing","yes"); + assign('mode','index_vids'); +} + +//Reindex Users +if(isset($_GET['index_usrs'])) { + $msg = array(); + $users = get_users(array("usr_status"=>"Ok","limit"=>$start_index.",".$loop_size)); + + $total_users = get_users(array("count_only"=>true,"usr_status"=>"Ok")); + $percent = $cbindex->percent(50,$total_users); + $i = 0; + + + assign('total',$total_users); + assign('from',$start_index+1); + $to = $start_index+$loop_size; + if($to>$total_users) + { + $to = $total_users; + e($total_users." users have been reindexed successfully.","m"); + assign("stop_loop","yes"); + } + assign('to',$to); + + + while($i < $total_users) + { + if($users[$i]['userid']) + { + $params = array("user"=>$users[$i]['userid'],"comment_added"=>true,"subscriptions_count"=>true,"subscribers_count"=>true, + "video_count"=>true,"groups_count"=>true,"comment_received"=>true,"collections_count"=>true,"photos_count"=>true); + $indexes = $cbindex->count_index("user",$params); + $fields = $cbindex->extract_fields("user",$params); + $msg[] = $users[$i]['userid'].": Updating ".$users[$i]['username'].""; + $cbindex->update_index("user",array("fields"=>$fields,"values"=>$indexes,"user"=>$users[$i]['userid'])); + + } + $i++; + + } + e($start_index+1 ." - ".$to." users have been reindexed successfully.","m"); + assign("index_msgs",$msg); + assign("indexing","yes"); + assign('mode','index_usrs'); + +} + +//Reindex Grous +if(isset($_GET['index_gps'])) { + $groups = get_groups(array("active"=>"yes")); + $total_groups = get_groups(array("count_only"=>true,"active"=>"yes")); + $percent = $cbindex->percent(50,$total_groups); + $i = 0; + + assign('total',$total_groups); + assign('from',$start_index+1); + $to = $start_index+$loop_size; + if($to>$total_groups) + { + $to = $total_groups; + e($total_groups." groups have been reindexed successfully.","m"); + assign("stop_loop","yes"); + } + assign('to',$to); + + while ($i < $total_groups) + { + if($groups[$i]['group_id']) + { + $params = array("group_id"=>$groups[$i]['group_id'],"group_videos"=>true,"group_topics"=>true,"group_members"=>true); + $indexes = $cbindex->count_index("group",$params); + $fields = $cbindex->extract_fields("group",$params); + $msg[] = $groups[$i]['group_id'].": Updating ".$groups[$i]['group_name'].""; + $cbindex->update_index("group",array("fields"=>$fields,"values"=>$indexes,"group_id"=>$groups[$i]['group_id'])); + } + $i++; + } + + e($start_index+1 ." - ".$to." groups have been reindexed successfully.","m"); + assign("index_msgs",$msg); + assign("indexing","yes"); + assign('mode','index_gps'); +} + +if(isset($_GET['index_photos'])) { + $photos = get_photos(array("active"=>"yes","limit"=>$start_index.",".$loop_size)); + $total_photos = get_photos(array("count_only"=>true,"active"=>"yes")); + $percent = $cbindex->percent(50,$total_photos); + $i = 0; + + assign('total',$total_photos); + assign('from',$start_index+1); + $to = $start_index+$loop_size; + if($to>$total_photos) + { + $to = $total_photos; + e($total_photos." photos have been reindexed successfully.","m"); + assign("stop_loop","yes"); + } + assign('to',$to); + + while ($i < $total_photos) + { + if($photos[$i]['photo_id']) + { + $params = array("photo_id"=>$photos[$i]['photo_id'],"favorite_count"=>true,"total_comments"=>true); + $indexes = $cbindex->count_index("photos",$params); + $fields = $cbindex->extract_fields("photos",$params); + $msg[] = $photos[$i]['photo_id'].": Updating ".$photos[$i]['photo_title'].""; + $cbindex->update_index("photos",array("fields"=>$fields,"values"=>$indexes,"photo_id"=>$photos[$i]['photo_id'])); + } + $i++; + } + + e($start_index+1 ." - ".$to." photos have been reindexed successfully.","m"); + assign("index_msgs",$msg); + assign("indexing","yes"); + assign('mode','index_photos'); +} + +if(isset($_GET['index_collections'])) { + $collections = get_collections(array("active"=>"yes","limit"=>$start_index.",".$loop_size)); + $total_collections = get_collections(array("count_only"=>true,"active"=>"yes")); + $percent = $cbindex->percent(50,$total_collections); + $i = 0; + + assign('total',$total_collections); + assign('from',$start_index+1); + $to = $start_index+$loop_size; + if($to>$total_collections) + { + $to = $total_collections; + e($total_collections." collections have been reindexed successfully.","m"); + assign("stop_loop","yes"); + } + assign('to',$to); + + while ($i < $total_collections) + { + if($collections[$i]['collection_id']) + { + $params = array("collection_id"=>$collections[$i]['collection_id'],"total_items"=>true,"total_comments"=>true); + $indexes = $cbindex->count_index("collections",$params); + $fields = $cbindex->extract_fields("collections",$params); + $msg[] = $collections[$i]['collection_id'].": Updating ".$collections[$i]['collection_name'].""; + $cbindex->update_index("collections",array("fields"=>$fields,"values"=>$indexes,"photo_id"=>$collections[$i]['collection_id'])); + } + $i++; + } + + e($start_index+1 ." - ".$to." collections have been reindexed successfully.","m"); + assign("index_msgs",$msg); + assign("indexing","yes"); + assign('mode','index_collections'); +} + +subtitle("Re-index Clipbucket"); +template_files('reindex_cb.html'); +display_it(); +?> \ No newline at end of file diff --git a/upload/admin_area/repair_vid_duration.php b/upload/admin_area/repair_vid_duration.php new file mode 100644 index 00000000..3bf0d527 --- /dev/null +++ b/upload/admin_area/repair_vid_duration.php @@ -0,0 +1,66 @@ +admin_login_check(); +$userquery->login_check('web_config_access'); + +$params = array('duration'=>'1','duration_op'=>'<=','status'=>'Successful'); +$videos = get_videos($params); +$fixed_array = array(); +if($_POST['fix_duration'] + || $_POST['mark_failed'] + || $_POST['mark_delete']) +{ + foreach($videos as $video) + { + $log = get_file_details($video['file_name']); + + if($log && $_POST['fix_duration']) + { + //$duration = $log['output_duration']; + //if(!$duration) + // $duration = $log['duration']; + + $duration = parse_duration(LOGS_DIR.'/'.$video['file_name'].'.log'); + + if(!$duration) + e("Can't do anything about \"".$video['title']."\""); + else + { + $db->update(tbl('video'),array('duration'),array($duration),"videoid='".$video['videoid']."'"); + $fixed_array[$video['file_name']] = 'yes'; + e("Succesfully updated duration of \"".$video['title']."\" to ".SetTime($duration),'m'); + } + } + + if(!$log && $_POST['mark_failed']) + { + $db->update(tbl("video"),array("status","failed_reason"), + array('Failed',"Unable to get video duration")," file_name='".$video['file_name']."'"); + e("\"".$video['title']."\" status has been changed to Failed","m"); + } + + if(!$log && $_POST['mark_delete']) + { + $db->update(tbl("video"),array("status","failed_reason"), + array('Failed',"Unable to get video duration")," file_name='".$video['file_name']."'"); + + $cbvideo->delete_video($video['videoid']); + } + } + $videos = get_videos($params); +} + +subtitle("Repair videos duration"); + +assign('videos',$videos); +assign('fixed_array',$fixed_array); +template_files('repair_vid_duration.html'); +display_it(); +?> \ No newline at end of file diff --git a/upload/admin_area/reports.php b/upload/admin_area/reports.php new file mode 100644 index 00000000..9b9b94b1 --- /dev/null +++ b/upload/admin_area/reports.php @@ -0,0 +1,40 @@ +admin_login_check(); +$userquery->login_check('web_config_access'); + + +$vid_dir = get_directory_size(VIDEOS_DIR); +$thumb_dir = get_directory_size(THUMBS_DIR); +$orig_dir = get_directory_size(ORIGINAL_DIR); + +$user_thumbs = get_directory_size(USER_THUMBS_DIR); +$user_bg = get_directory_size(USER_BG_DIR); + +$grp_thumbs = get_directory_size(GP_THUMB_DIR); +$cat_thumbs = get_directory_size(CAT_THUMB_DIR); + + +assign('vid_dir',$vid_dir); +assign('thumb_dir',$thumb_dir); +assign('orig_dir',$orig_dir); + +assign('user_thumbs',$user_thumbs); +assign('user_bg',$user_bg); + +assign('grp_thumbs',$grp_thumbs); +assign('cat_thumbs',$cat_thumbs); + +assign('db_size',formatfilesize(get_db_size())); + +template_files('reports.html'); +display_it(); +?> \ No newline at end of file diff --git a/upload/admin_area/statistics.php b/upload/admin_area/statistics.php new file mode 100644 index 00000000..0e917d37 --- /dev/null +++ b/upload/admin_area/statistics.php @@ -0,0 +1,17 @@ +admin_login_check(); +$userquery->login_check('web_config_access'); + + +template_files('under_development.html'); +display_it(); +?> \ No newline at end of file diff --git a/upload/admin_area/styles/cbv2/images/alert.png b/upload/admin_area/styles/cbv2/images/alert.png new file mode 100644 index 0000000000000000000000000000000000000000..16aa3dd4bc8f84a67906d5f19db39d85afc1159e GIT binary patch literal 827 zcmV-B1H}A^P)#iJJz@19E! zrYG-4JZMb47`+gKY+DZmHz|m)2BgbA7TA3~P+-^U&7L~RewleQZwO-yk14iC zrTq(_!)y>jdiNhQGh_7TW=k!VqEwc70N}k|DvXYv@*dBJS35h>!O#%iSF2VcW2~oL zNylP|uYrJ(TVH2X6qzo|tewxZ+TkJlzOcZK{C*=HizNWyU}(s~AZ8FD1nF2T@$35f z)6-+cR4VuG_?Xxf z1MRut%&3{IOZB1{4bL zg~L!}Ir<<_t5kT-?}wgF_p)P@_8VyO=~q`67#V?9sqkioWo!VzsMo>TZ7@yigH*M1 zntaf8;P&=zxE08|-Bdk4=br=uXlFA0r&w9}E072RZbT8h+fB`WOUX__ILU8s!!|w+ z)@t?26XJ0Q@p!*vO@rQOpd^ZL3c~5bK&NxQw7<`kLII9Q1R$hSreOev0j6nStrkEC z%A$y-sxqh3IcLfI?qHvVLZ522+EQq75iUW1ad`;3%Z;$r#kf4&z80Ae`& zf>Qd0*6UGCRe1p51cCA{*NKbg=U%7NKkr)(2 literal 0 HcmV?d00001 diff --git a/upload/admin_area/styles/cbv2/images/arrow_return.png b/upload/admin_area/styles/cbv2/images/arrow_return.png new file mode 100644 index 0000000000000000000000000000000000000000..4792abf1b448b3e7407261631e3853b5ab720271 GIT binary patch literal 3712 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 M07*qoM6N<$g3Rq&f&c&j literal 0 HcmV?d00001 diff --git a/upload/admin_area/styles/cbv2/images/bgs/gr_bg.png b/upload/admin_area/styles/cbv2/images/bgs/gr_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..8b5c20a13111c048ddf699d3f4476453cee1087a GIT binary patch literal 324 zcmV-K0lWT*P)3(0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUyT~JI^MgRZ*{r&yo;^O}P{^R50_xJbV z;o<4&>Gk#X=;-L|?CkXP^yTH{`}_O+{QUa*`t9xQ`T6?`1tto@$u*9 z=j!U}@9*#K?(XaB>+|#T_V)Jh@bFK9jdK710DVbBK~#9!?8(Ow!cY_h!6&>G9$}S# zm_#sJ)IU#OyB4g{O<42ISo2+3yd8^oX7L6VZ_VN@S-b~}_hz+W@s2Fsi`A3G8(H01 zybFu>VYOxPRxI9^)ttqsa$mS@TJfBuSDaNs=T9Ugm literal 0 HcmV?d00001 diff --git a/upload/admin_area/styles/cbv2/images/bgs/left_menu_head.png b/upload/admin_area/styles/cbv2/images/bgs/left_menu_head.png new file mode 100644 index 0000000000000000000000000000000000000000..50f9016fe097a707b71b487520699a30f3e967d7 GIT binary patch literal 1588 zcmZ{ld05g19LB#KKP*bTDpOhqEi;|jF^{sA7n-Zg%9cml{3)O!aR{UcSe9vaJ7?xm zZM9r$9ZbtD=R9IsXkI~rC~ApVW~PF=(sDk}{@L^F+536k_xs4m2m)69K?H zXsiG3nO4p?ZWeAP_p98#oGCj2HB7LF!w@8)iFELxaiZxjn^y)ENb+$9z89ssWfIDeQ$-G>w-NG2e~ z1mbbvRxOFk2TrA7$OPQ#T1{WO!33hw#_kbi?`UXtvwLbC_JAfT{|PpxHu!X7L~aYh zdW^7|u@a+2+-=}=A$%Q(ObE9Pq;G+x0r4AL$`G(S&XhJFQTGt85)KZQxAtICMiIUi zNz|OX*9gf&2%{Q_DL3P*+w?{ZtUF9E7hSX9=n!5yMo1l-mu@1k zpW3pj%@2*t7j+`cW{WfvL1OgI>BS55n8fFp1eMR(4vM4=lVV&ZR$^$6aMCecRK*<5 z6MWKu%Mq2O^aW0AByn1Z!Y+(x7|&2FNFO0ehU}A6&KW)4+1;OIwb~vtVQF;^C*Q2i z>c(<)=1I>nTpcmhh)aBC7N@|m)i|^Y7gcG-d~7N1vlX`DM6c~KOeE9H*Jvg9VLWNb;sVEA{vtIv&M<6ALoE&gEt($o&h zi4o^CHJ16rJ$Kac#DL@Rek66wg40M44`UNlix2nso>HyN&~Ck82)ba{m(#p1Q|oh5 z2}!RZc^E`SIP?K%k07QFqUDe}1(Lr&`VPcn5LE?e%{=s5-uf~W0JkZ~-zPL#JJ?yf zkGyLkGW=7qUs{j-)>SIqA1a-6;Kc9$C{pL*GQDHTY(GyfL%q67{f2G0$lo_X%l*15 z9SxUz1+M&F|8|e`JYDlX;m)nMb5}&Vz8GTI$pf1!{p!QNlm_$-@3b$a=Y;S@Ui^e+ z3;U}#R;l)j9&E3_e(FYX2!HRf{3(BWsGG;EPhTmD&xQulGK{$Fq0L`RP=_`0BU(PRadEhF(c&HY>uPK9}a9Z>B8&V)0c-R0W4jS;Vk zcShTsce8RX?4>EKo%lNwI!syX>EU~V+lwfL3qtHRpKhG`C5*D_($oEv!i7#(f8^zD z(QduwURt1}*#y#6ZcVd3HG8QOJip@2zs!2)OIMxVkY-rcZpy7MT5rG?_|cRePR7Gt zt}Tm}7pCGGge5O+WrIr#tEtC)GO7RK{UpiD)#Noe)$&GW^sACLS-dATG~v(4ojhuI zVSNssq@O$S^=LmnUEVZ%<0t>a;Iv-$;X}`&GOE*oG=uDnb=LAVnIBy!ukru|N~P3p z-ez@uQpS0v%iP-;SvC(>ZqYC@(XhdjL~g1wvm`x4*Z(!)whlJ1UVJX{ZAJgfORnZd z*_wVU+dQj&S((#95_wT?PXFtIuXbe*4P5NEv6)+g_CDNXJ-N{=fl2V1wBB6ze3>Up z^vxbdy>n)@cV^P6{NSKI%SG-bC7X{=Um~l%vYTClimzl2B%i%bJ~5QmBTKy|-&H}T zn&-Xq;cBLe4C<+A>x%d$MP`qzoo7?&I)8fGa90v#HTj7AV5FEKbgZaY-k>Zer^^?( zj};g1cz-+lytX5BmK?=(vVJCauCSiSU`GB5OGyb!vOBvSbKS>R25OG-!tQ8F&b76j zD+zP;CPnVv!i@EZ_!_G~6Krl0i8rm8=!QWnYeCoynnQZoA^bw9S?l6!EBwHoxd8~G L2K(RkjXLr-v7O@Y literal 0 HcmV?d00001 diff --git a/upload/admin_area/styles/cbv2/images/bgs/login.png b/upload/admin_area/styles/cbv2/images/bgs/login.png new file mode 100644 index 0000000000000000000000000000000000000000..13f414b6d64b5d180da404827eaac9425d55304f GIT binary patch literal 515 zcmeAS@N?(olHy`uVBq!ia0vp^Dhv#a6F8WGtdF0JYJrqwiEBhjaDG}zd16s2gJVj5 zQmTSyZen_BP-@Ab^XDi;s`b#l=NPNJvaf zOjK0Vz`#I4LPAbXPD4Y(*Vot3(2$3R$IQ&k)6>(=&d$ln$OTsElpWjnT3Uglao_YQqsrAM@2=&!oq@`on2d7+uPe)KtO<%l~rC| z{{R2~-A`W51$y9)r;B4q#jQ8jj)qDwFdVp`;2M4B?p;}~H}+yZ6PU&CowiSJ_@EgO z0tR1hD?bfM2q?I?;lQ#3(++Gou=v3214|F=IWYCWtOKnFRvcJ#VA6q^2bvCSJr2f7ZlAFyw9ZY*wOZ`{xHm`Rw4 zohg~=KkGMEH|6H_V+Po~-c6*&d?gt&@S?iDHDDN?jir0t?e%|Vfjg(9U}McS{3Buy1* zI3ZGZL?msFNXvPVoaG`-r$w?Bi*#HQDOe|xxkw~$l}P%$3-@2?AHFaVWSXaoV@SoV znoEt04hjqm2i;qgf_|^hYI>h$v1_rFoO_8*-?T<@Xj-PmPLuT{i(we^0fikNX jTTV(Y=b87HiHG6g4XLT|r}kL@O=IwM^>bP0l+XkKZ(dky literal 0 HcmV?d00001 diff --git a/upload/admin_area/styles/cbv2/images/bgs/round_bg.png b/upload/admin_area/styles/cbv2/images/bgs/round_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..1a2218a80446b1e1fc983a85c69ce67557f7c045 GIT binary patch literal 2261 zcmZWreK?!v8h>(9r8=={u_ENOJ++lGrL^KBNvV(Or?%$ON_|z&2-SwPL8PcnyArdY z)e=psrL9aAmmo2e%~xLi@R`uE5DY_zL?h>oZo78Q`R9G#>v^90zV6@s`#rz=O+R+T zLr2?48vvl=<>__;0E86&uF_f$Kdo(&{NdMDvinzL-{|vXO3>mMmmB`%m4V+x#0$)Ebi>@R@$iF#T=(ql&%Wet@h@UGuAg3&7W)z0 z2Nv%evJJx;aj3qt)m!4qbJn+>b0AoyIRySzihR=N8k$mmv!96yeVkQ!x;(D3(#UpT zhk3!TqIiSddyRho@YCqRyu4xXT!z@h)SCC9pl&w%X;lO-w>{TMbj(_r( zVjtA)3~nl>+9+_%iup`A<1K>ToV@z=cei>&7J7c>(Mo=F1dL-);Y}T5nH#Ata{0MF zg6@_QnAyE&to?e43D83+sy;KazlX$);LXx4EmC-)djaM>%fs^KesB^asTxFJl&rxh zP5Le$NiquPYf)c&1NsIu_>>HA5CR8jph2k~+2JJur@+fh9Kp#Tf*~0^#zAPMHki;9 zh;?JV@D3D%y z%cFzXzxlFX##lz820isw&hbL*X@?>tt}QJsKn2&+iUxW)l~I>6vxNI+0K>)gfF|90 z-QNnuLHVZ`T6*fkbbp$}f^a(7eyTH2sa z1D}UftZ;R}1N~<#!_G7&puaeb`U(j=1D)4^p#Y=GX`{0y{nwNkD>$40iNq+dlMLRK zX>r*^bZv3$s=u?o{$j@jl?`Dk*@W z{7KXwX$CL-wUnn$qsFAvrH*|JaIXl`2bdV7n3*^V_x+o;spN+Udg@MT1ks}{Vw-(r zsUcg}?WwgYPuCv}JS`=hmcA>__R&gJ9`F8tiOWe5)4H;>Vl>y2)s*F`c$%aGB-8K|S!}mT002{q z>RMgPSrZT0P-pL9comwN0V(aR;P3zer_^j{}fv?PSSx|N_cV_FB z$rT+5wyX2AhsrNjcBT))Y>FRmA{@*%{#42^p6yK+^tb<+I3<+n}d_=&fI`!y0y}RnNH_@i}NZj0^0a))d2~cKXVLEcQ;O5!P zBnN}soKdku2E{N8rZXyKsNY`RoNqpI+bl92=^<#jEeNk&*`XGXRm#wN+jq9a&Q`&a za(7q4T$oId6^}v#?mY;bIUzOAjbHGJgq2Z^=Won78!NQ{ z9JH8umjArG{*iVB5~N?SI%wH(Fiw7^S=bROzn9wKVsD z>deY@;b<^`#L$P;sq&CAug+QNtYp_Sf~@MVB3NOrN~O>CR0 zpo^Wok6iN7kE&|>y3{uk%HN<|y2GVi#L!gIo<6&~965!iT)Lh2Va0rUUHya^08~Bc zV8kS0dvNe1dwKe`u4sPIHg_yU)txyw&Xqq5WHv6yr5{@~?TL)m1R9&iN1)h7$5cv1^U+ZGhT~s0L&Y z{y%Vv8@$y^2C%q>d?dgBeJM6-Y~le)TBvkTz7@x;+Q$M8BN zj({gl3H{Yy-gp^I9PCO}LIg{D^O{Y<)*1mDSnS^n45OYaB^n}iIW)-m8x%OTW>h$h z@>+V<5S_?+8#ilhi3B@bio&C4YHtp-GlqRz&*9t#fJyA{8}g;4!2_Ya z0)j>DA~8LRq?050oK4Z_{U&m@piG-vD@0(NpD0KKP5Ksn2My6C4qyaAxu-Qmx2FMv z5o-MV$3K7HD}dGqSk ztCufd-qh4|>eQ(X8#YXxI`znrBm4I4J9_l!(xppRu3XvC(b3S*P*qiR;lhPw%a(O_ zcTbx(ZO)uIuU@^{v}sdgW8=4P-}?Icrca;#^5x5uCr`Gtv^;q5prWGU5Pfm)bm;ec(ZBz_S4|LoTR&O%MI;OXk;vd$@?2>@AnAcFt^ literal 0 HcmV?d00001 diff --git a/upload/admin_area/styles/cbv2/images/botal.png b/upload/admin_area/styles/cbv2/images/botal.png new file mode 100644 index 0000000000000000000000000000000000000000..15ce9aecd188b9b085f90fcfa95b3a0618111213 GIT binary patch literal 2480 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 literal 0 HcmV?d00001 diff --git a/upload/admin_area/styles/cbv2/images/button_bg.png b/upload/admin_area/styles/cbv2/images/button_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..72b29bcc0bc11b40ded415f8b1e346e01139fcc9 GIT binary patch literal 341 zcmV-b0jmCqP)-h!vH#<08zI9 zQn&zDy#QIi06(PwO|t+qnE*tp07|d`P__V8yZ~In0Ak1hPqhG5y8v6k0Aa@fHk<%d zx&T_h0AR)dW69ItrfvWL0GdfeK~#9!?Ag~5!!Qg)!RMTFcK?OC3+;!s4PZDDN#NLo zX)HZ(=`SNoUzi?DA0}wZG-En5-I?A@Yo-;`iRs4lVp=jSn2t|L241yUc nOom||{+|yJ<2%=|egX^ts<32;%j$y<00000NkvXXu0mjf;VXfk literal 0 HcmV?d00001 diff --git a/upload/admin_area/styles/cbv2/images/button_ok.png b/upload/admin_area/styles/cbv2/images/button_ok.png new file mode 100644 index 0000000000000000000000000000000000000000..bb8d3dc4499dfdbcde40707f53c8d870bbf822ad GIT binary patch literal 1310 zcmV+(1>yRMP)eCW|#AN2Lgpl9cyjKUr0r}P=3yE(F);#7{`k88MiE%C=V z{Cx_;(T5M<<({BJ4 zD01!}h;E?t1jSB@Eodix6*0ZrQK0V*l#n_Yz{yhL$yC1)zysG)^BP;8VatA^pU}UM zul$_a-Sof4zIidxtpS{VlBj{Lt0{h#S7s3(rto7lkRKDk@d1n?y%R%>-b7T*-1jMT z@zEj5?`G#2p1PEGE2*gGt$R5yV(T7S_cPSTSLY`g{UT8lm%L5!KDul9qFxdnnvc=Tf5eoVbv}IZSS4%}L%H z=FW1?P9e9M;X0C6GOmsO0p`r%OJ8T`0DHGYy#5QS-r%L9yim3Z&Zj@&NhET)hpUBY+XC!WOAIu`wgGh^AXjQpoa z?29?_FyHN`cUu6LttNL9g&g@xdM0t*M4I1c$GO~cfU;gb@*^(&B7Hk}@G$WMxRBC& zP(wve09RG8;#s=x3gFX!BXK8hwvnHf;IUq|cXPUj@)-;-<8w>GUoC!_bcRADg+{7o zb7nIOy2y7?zmmd>l+U6hBKJp1rjl%BTq#d{hPCB1JV13baU+Xwqp*S5Nt{YBw20_@ zIxpje1}?dZ!F>3FmoFr)C7MXt9tu@Nk5D<0PP$2|4~v; z{5n*^VlmiXNCe$Amc%+*ZW-C&^IVjsqnWN8`z{YYZR5GNiT2-xb#3pESjOJ-gWWm_ zrDSgocF*{Kr^oc36Dnae(id*6M~XA+$ls2&Bb@MBX}PBo*t4c9LC;Q}i!FhW1HB z8#(aHu&%Qq9PEP|ZCm+&cDdFYM;x~XZO@^Mjuj(z1<}29Tt$5JU!V{4rIR70e{T6- zX#WJa?~_qCf>_)D001I-R9JLVZ)S9NVRB^v0C?IfFE7{2%*!rLPAo{(%P&d?05;eL USP)anTmS$707*qoM6N<$f;swi1poj5 literal 0 HcmV?d00001 diff --git a/upload/admin_area/styles/cbv2/images/catgory_toggler.png b/upload/admin_area/styles/cbv2/images/catgory_toggler.png new file mode 100644 index 0000000000000000000000000000000000000000..b9ecad8cd67ff5000a7180db02ccd95638db1b97 GIT binary patch literal 1242 zcmeAS@N?(olHy`uVBq!ia0vp^l0eMG!3HE9SAPuy36!`-lmzFem6RtIr7}3C)9WTXpJp<7&;SCUwvn^&w1Gr=XbIJqdZpd>RtPXT0NVp4u- ziLDaQr4TRV7Ql_oD~1LWFu?RH5)1SV^$b8>f+_U%#ji9s7p}UvBq$Z(UaSTehg24% z>IbD3=a&{G10ya?8Dv#~m2**QVo82cNPd0}EEEGW@=NlIGx7@*oP$jj!ZY(y^2>|C zs(pQ}JoAc667!N%JzZ>-fco_^GgGV#&0HM~j2tbD-AtVf4P6Z^T`i0)jGUd!EsQJ- z+zi}cdR_99OLJ56N?>|Z5PB_f>IEf)+ybD@E~!PCWvMA{Mftf3U=Lem;&zJ}PV=C8 zQ*gV*9H(A=pkwqw(TWt!Fd<;t0Wsl;7RZ4o`_w#OS}y`7>Y_(4zA!K_26(zShE&{I z6TCOCDM7?mWr5P<*c#@UIWHa@V(Da_>p6cB|Ap`ulMTLbsD|6Ql1;eBA z3XlHUEzQ(!zBup6v)xbby`NM3P>JV$+YiS1hb*2lwnmB`^G}Z9-l)M9F|9P@L+xRc zvzu#7q#lZORL*N=bzXdN#o5)LvnJ}CuDM>y>l%0=Z~MmEZ~IsSkE9rBUN&L<`lqT? z^wjg?D=)nLc0%w%7UQIr$=V6KSz}#xM$~k;WZl?yHv9Egsh%kd@4qh&WIJBiW7U3I z<>EUw<_5{z?>)ELh|ThKnD%pLk5X@Eg5CW2f;nch-|w0APTy|%WrLY#tAr+cx@Z{{ zIXV8dynFuTpRQy(&j*$B6oZ9}*R9gZ?^)F0f9yzv|J)OQe}8*;DL?7eu5(?!Zg<_WAEx`Fo+un(V6obI_sFVdQ I&MBb@0434ET>t<8 literal 0 HcmV?d00001 diff --git a/upload/admin_area/styles/cbv2/images/collapse.png b/upload/admin_area/styles/cbv2/images/collapse.png new file mode 100644 index 0000000000000000000000000000000000000000..3c28991854c335c4d075fd3f45324a8532e33675 GIT binary patch literal 310 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 literal 0 HcmV?d00001 diff --git a/upload/admin_area/styles/cbv2/images/dot.gif b/upload/admin_area/styles/cbv2/images/dot.gif new file mode 100644 index 0000000000000000000000000000000000000000..35d42e808f0a8017b8d52a06be2f8fec0b466a66 GIT binary patch literal 43 scmZ?wbhEHbWMp7uXkcLY|NlP&1B2pE7Dgb&paUX6G7L;iE{qJ;0LZEa`2YX_ literal 0 HcmV?d00001 diff --git a/upload/admin_area/styles/cbv2/images/error.png b/upload/admin_area/styles/cbv2/images/error.png new file mode 100644 index 0000000000000000000000000000000000000000..b28b24d29e460f57e2f50d09092baa32a43053cd GIT binary patch literal 1788 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 Ar2qf` literal 0 HcmV?d00001 diff --git a/upload/admin_area/styles/cbv2/images/loading.gif b/upload/admin_area/styles/cbv2/images/loading.gif new file mode 100644 index 0000000000000000000000000000000000000000..2059c9afd4a6a88eecc0d943891cd00c9b3c149a GIT binary patch literal 4426 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 XlCq1c&L7`E#zcxBHM!!qCV~G0zG`D4 literal 0 HcmV?d00001 diff --git a/upload/admin_area/styles/cbv2/images/nicEditIcons-latest.gif b/upload/admin_area/styles/cbv2/images/nicEditIcons-latest.gif new file mode 100644 index 0000000000000000000000000000000000000000..d1add6f1f1a13c875a30d6b93cd2c3de8cb8608a GIT binary patch literal 3696 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 XTfQQ!J|nSSQCy#e)H^Wfz~}!3ERpMf literal 0 HcmV?d00001 diff --git a/upload/admin_area/styles/cbv2/images/ok.png b/upload/admin_area/styles/cbv2/images/ok.png new file mode 100644 index 0000000000000000000000000000000000000000..dec9a82e8e15bcfe72aa593b97db83367d568466 GIT binary patch literal 3148 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 bED{WoUzsk=KGDSkRL|h)>gTe~DWM4fH?kx0 literal 0 HcmV?d00001 diff --git a/upload/admin_area/styles/cbv2/images/slide_toggle_3.png b/upload/admin_area/styles/cbv2/images/slide_toggle_3.png new file mode 100644 index 0000000000000000000000000000000000000000..ecab7086d23d26754ab2a4edb0e77e40eaa384f7 GIT binary patch literal 732 zcmV<20wev2P)i1=#P(Uu1gQ6%11OgC6dMyiYmvQ;gYfLyd6OzntynA~l}e%2YQgLE zGJ)NFw}P4ZhghrDab?IUI-Ma2$@qak&5e3{k7qkWQyb%Nz^_Azi6_fn5T1)8Tdc7CtaiJd^jM8XgM{e^ z5Som5PE2jZjgtrQDOVtX-+t8C)?Bq(U7r=bm1dC<&&%X0xo-D3VN=a?xJ)L4d_GTR zLtjIJAW%b$crM&|hN~~$VsA$8D|E1@*00RJey}b&aH&^cf O0000kB@23 zTbq8CGVTkKBWD(DskY*4Om~u*sVvw3x+3CLZzNe3^p9S^ z3!J=MTlOWUt23l0iN+M-rK=^wFuHP$d@yS#w$$$6?$}Ql_B5X7&8MoYq^|0F{!87$ zbTXuk=Tya4VPx&ZqM&6sYDp~4u-;E)(K-}4f*&~efy4Hi!@Qini|Ok4fy1;lN;IZm z8IGE3wNNu*K|xGtL9U1&TSEdZ3oa z)-bH!Va6I`Tg@Q=o~8fbsn+*)VW@!di5G+m6m!unN1}4FfACl0MH>+Udj2_xmU)8h z&2nw<1fK8W`7VCo<9Pw&;~J5ue0xza6k*S!;eIhQtMf(KcD%sm$G=;+dhZB^tK$oo z03SsTqfKadjxRzHnsbc>7rXWHhO>4?X{q1*6-v}2mHn3)`xPJv$x$RBlhSnbS2nQ{ zrSsIT`v?9P1UTBgq0^l8_f?dBCRLPI5-9}B&5};1&?l#GEMLS*lye=s9~@Zn>CMHl zA2xpOI^vRR`3ct+>YJiTW;m)O!x5?ZWYhi8B|nGdh>!n+eGTC+ZlJ2^{(S%d002ov JPDHLkV1n+)mqq{p literal 0 HcmV?d00001 diff --git a/upload/admin_area/styles/cbv2/images/widget_item_border.gif b/upload/admin_area/styles/cbv2/images/widget_item_border.gif new file mode 100644 index 0000000000000000000000000000000000000000..c920f41ad8a242c7a487ee28fc8971fdb2ed0621 GIT binary patch literal 45 ucmZ?wbhEHbWMyDtXkcJ?{rdI)|Nj+#vM_*v4u}BBFfg&S$j)SCum%7q6AHfo literal 0 HcmV?d00001 diff --git a/upload/admin_area/styles/cbv2/layout/_permission.html b/upload/admin_area/styles/cbv2/layout/_permission.html new file mode 100644 index 00000000..f42f0a6d --- /dev/null +++ b/upload/admin_area/styles/cbv2/layout/_permission.html @@ -0,0 +1,63 @@ +{assign var='types' value=$userquery->get_level_types()} +
+{section name=t loop=$types} + + + + + + +
 {$types[t].user_permission_type_name} 
+{assign var=perms value=$userquery->get_permissions($types[t].user_permission_type_id)} + +{assign var = bgcolor value = ""} +{foreach from=$perms item=perm} +{if $perm.permission_id !=""} + + + + + + + + + + + +{else} + +{/if} +{if $bgcolor == ""} +{assign var = bgcolor value = "#EEEEEE"} +{else} +{assign var = bgcolor value = ""} +{/if} +{foreachelse} + +{/foreach} +
{$perm.permission_id}{$perm.permission_name}{$perm.permission_code}{$perm.permission_desc}Delete
No Permission Found
No Permission Found
+
+
Add New Permission + +
+ + + + + + + + + + + + +
+
+
+{/section} +
\ No newline at end of file diff --git a/upload/admin_area/styles/cbv2/layout/add_group.html b/upload/admin_area/styles/cbv2/layout/add_group.html new file mode 100644 index 00000000..ae207f1f --- /dev/null +++ b/upload/admin_area/styles/cbv2/layout/add_group.html @@ -0,0 +1,66 @@ + + + + + + +
Add New Group  
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 * are required fields
Select User *
Group Title *
Group Description *

+ +
+

Group Tags *
Group Url * Only these characters are allowed. a-z, 0-9, hypen(-), underscore(_), period(.)
Group TypePublic
Private
Only Invited Members
Group Category * +
Group Thumb +
 
+
diff --git a/upload/admin_area/styles/cbv2/layout/add_members.html b/upload/admin_area/styles/cbv2/layout/add_members.html new file mode 100644 index 00000000..009aa3f8 --- /dev/null +++ b/upload/admin_area/styles/cbv2/layout/add_members.html @@ -0,0 +1,58 @@ +{assign var='required_fields' value=$userquery->load_signup_fields()} +{assign var='custom_field' value=$userquery->custom_signup_fields} + +

Add New Member

+ + + + + + +
 Required Member Details 
+ +
+
+ User Information + + {foreach from=$required_fields item=field} + + + + + {/foreach} + + + + + + + + +
{if $field.hint_1}{$field.hint_1}
{/if}{ANCHOR place=$field.anchor_before}{$formObj->createField($field)}{ANCHOR place=$field.anchor_after}{if $field.hint_2}
{$field.hint_2}{/if}
Status +
+
+ + {if $custom_field} +
+ Other + + {foreach from=$custom_field item=field} + + + + + {/foreach} +
{if $field.hint_1}{$field.hint_1}
{/if}{ANCHOR place=$field.anchor_before}{$formObj->createField($field)}{ANCHOR place=$field.anchor_after}{if $field.hint_2}
{$field.hint_2}{/if}
+
+ {/if} + +
+
\ No newline at end of file diff --git a/upload/admin_area/styles/cbv2/layout/add_phrase.html b/upload/admin_area/styles/cbv2/layout/add_phrase.html new file mode 100644 index 00000000..16a8767a --- /dev/null +++ b/upload/admin_area/styles/cbv2/layout/add_phrase.html @@ -0,0 +1,48 @@ +

Add New Phrase

+
+ +
+ Adding new phrase + + + + + + + + + + + + + + + + + + + + + +
Phrase Code
Phrase Text
Language
  
+ +  
+
+


+ +To display this text in your template , simple add this where you want to display your text {$LANG.phrase_code}
+
+ diff --git a/upload/admin_area/styles/cbv2/layout/ads_add_placements.html b/upload/admin_area/styles/cbv2/layout/ads_add_placements.html new file mode 100644 index 00000000..df91920f --- /dev/null +++ b/upload/admin_area/styles/cbv2/layout/ads_add_placements.html @@ -0,0 +1,79 @@ +{if $Cbucket->show_page == true} + + + +
+ + + + + + +
 Add Placement  
+ + + + + + + + + + + + + + + + + + + + + + + +
 
 
+
+
+
+
+ + + Note: if you delete any placement, all ads under it will be deleted + +
+
+ +
+ + + + + + + + +
ID
PlacementName
PlacementCode
TotalAds
Action
+{section name=a_list loop=$ads_placements} +{if $ads_placements[a_list].placement_name !=''} + + + + + + + + +
{$ads_placements[a_list].placement_id}
{$ads_placements[a_list].placement_name}
{literal}{AD place={/literal}{$ads_placements[a_list].placement}{literal}}{/literal}
{$ads_placements[a_list].total_ads}
{if $ads_placements[a_list].disable == no}Remove{else}Default Placement{/if}
+ {if $bgcolor == ""} + {assign var = bgcolor value = "#EEEEEE"} + {else} + {assign var = bgcolor value = ""} + {/if} +{/if} +{/section} + +{/if} \ No newline at end of file diff --git a/upload/admin_area/styles/cbv2/layout/ads_manager.html b/upload/admin_area/styles/cbv2/layout/ads_manager.html new file mode 100644 index 00000000..f23623fb --- /dev/null +++ b/upload/admin_area/styles/cbv2/layout/ads_manager.html @@ -0,0 +1,163 @@ +{if $ad_data.ad_name !=''} + + + + + + + + + +
 Eid Advertisement 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 all fields are required
 {$ad_data.ad_code|ad}
+ * + e.g Home Banner
+ Add More Placements
Status +
 
+
+
+
+{else} +{if $edit_ad != "show"} + + + + + + + + + +
 Add Advertisement 
+ + + + + + + + + + + + + + + + + + + + + + + + + +
 all fields are required
+ * + e.g Home Banner
+ Add More Placements
Status +
 
+
+
+ {/if} +
+

Advertisement Manager

+ + + + + {if $bgcolor == ""} + {assign var = bgcolor value = "#EEEEEE"} + {else} + {assign var = bgcolor value = ""} + {/if} + +
+ + + + + + + + + + +
AID
Advertisment name
Advertisment
Impressions
Date Added
Placement
Actions
+
+ + {assign var='ads' value=$adsObj->get_advertisements()} + {if $ads} + {foreach item=ad from=$ads} + + + + + + + + + + {/foreach} + {/if} +
{$ad.ad_id}
{$ad.ad_name}
{$ad.ad_codes}View Advertisment
{$ad.ad_impressions|number_format}
{$ad.date_added|date_format}
{$adsObj->get_placement_name($ad.ad_placement)}
Edit | +Delete | {if $ad.ad_status!=1}Activate{else}Deactivate{/if}
+{/if} \ No newline at end of file diff --git a/upload/admin_area/styles/cbv2/layout/blocks/access_log.html b/upload/admin_area/styles/cbv2/layout/blocks/access_log.html new file mode 100644 index 00000000..417d63b6 --- /dev/null +++ b/upload/admin_area/styles/cbv2/layout/blocks/access_log.html @@ -0,0 +1,10 @@ + + + + +Untitled Document + + + + + diff --git a/upload/admin_area/styles/cbv2/layout/blocks/comments.html b/upload/admin_area/styles/cbv2/layout/blocks/comments.html new file mode 100644 index 00000000..c51c3ef0 --- /dev/null +++ b/upload/admin_area/styles/cbv2/layout/blocks/comments.html @@ -0,0 +1,50 @@ +{assign var=bgcolor value =F2F2F2} +{if $comments} + + + + + + + + + + + +
CIDUIDUsernameEmailCommentDateVotes 
+
+{foreach from=$comments.comments item=comment} + + + + + + + + + + + + + {if $bgcolor == 'F2F2F2'} + {assign var=bgcolor value =FFF} + {elseif $bgcolor == 'FFF'} + {assign var=bgcolor value =F2F2F2} + {/if} + +{/foreach} +
{$comment.comment_id}{$comment.userid}{if $comment.anonym_name}{$comment.anonym_name}{else}{$comment.username}{/if}{if $comment.anonym_email}{$comment.anonym_email}{else}{$comment.email}{/if}
{$comment.comment}
{$comment.date_added|date_format}{$comment.vote}Delete
+
+{else} +
No User Comments
+{/if} + +{literal} + +{/literal} \ No newline at end of file diff --git a/upload/admin_area/styles/cbv2/layout/blocks/edit_video.html b/upload/admin_area/styles/cbv2/layout/blocks/edit_video.html new file mode 100644 index 00000000..97ab6b72 --- /dev/null +++ b/upload/admin_area/styles/cbv2/layout/blocks/edit_video.html @@ -0,0 +1,194 @@ +{assign var='requiredFields' value=$Upload->loadRequiredFields($data)} +{assign var='optionFields' value=$Upload->loadOptionFields($data)} +{assign var='locationFields' value=$Upload->loadLocationFields($data)} + +{assign var='custom_fields' value=$Upload->load_custom_upload_fields($data,TRUE)} +{assign var='custom_form_fields' value=$Upload->load_custom_form_fields($data,TRUE)} + + +{if $data.title neq ""} + + + + + + + + + + + +
Editing {$data.title}  
+ +
+ + + + + +
+ +
+ + + + + +
+ User Information + + + + + +
Useid{$data.userid}
+
+ +
+ Important Details + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {foreach from=$requiredFields item=field} + + + + + {/foreach} + + + + + + + + + +
Video Id + +
Video Key + +
File Name + +
Referal URL
Total Video Files{get_all_video_files vdetails=$data count_only=true} - View File Details and Conversion Log
Total Thumbnails{get_thumb vdetails=$data count_only=true}
Thumbnails
+{if $data.embeded !=yes}Regenerate Thumbs{/if}
+ Manage Thumbs
{assign var=vidthumbs value=func->get_thumb($data,1,TRUE)} + + {foreach from=$vidthumbs item=vid_thumb} +
+
+ {if $vid_thumb|getname!='processing'} + Delete + {/if} +
+ {/foreach} + +
{$field.title} :{$field.hint_1}{ANCHOR place=$field.anchor_before}{$formObj->createField($field)} +{$field.hint_2}
Status + +
Duration (seconds) + +seconds
+
+ + + +
+ Recording Details + + {foreach from=$locationFields item=field} + + + + + {/foreach} +
{$field.title} {$field.hint_1}{ANCHOR place=$field.anchor_before}{$formObj->createField($field)} +{$field.hint_2}
+
+ + + +
+ Sharing + + {foreach from=$optionFields item=field} + + + + + {/foreach} +
{$field.title} {$field.hint_1}{ANCHOR place=$field.anchor_before}{$formObj->createField($field)} +
+ {$field.hint_2}
+
+ + + +
+ Custom Form Fields + + {foreach from=$custom_form_fields item=field} + + + + + {/foreach} +
{$field.title}{$field.hint_1}{ANCHOR place=$field.anchor_before}{$formObj->createField($field)} +
+ {$field.hint_2}
+
+ + +
+ Custom Upload Fields + + {foreach from=$custom_fields item=field} + + + + + {/foreach} +
{$field.title}{$field.hint_1}{ANCHOR place=$field.anchor_before}{$formObj->createField($field)} +
+ {$field.hint_2}
+
+
+ +
+
+{/if} \ No newline at end of file diff --git a/upload/admin_area/styles/cbv2/layout/blocks/pagination.html b/upload/admin_area/styles/cbv2/layout/blocks/pagination.html new file mode 100644 index 00000000..e61558e9 --- /dev/null +++ b/upload/admin_area/styles/cbv2/layout/blocks/pagination.html @@ -0,0 +1,5 @@ + diff --git a/upload/admin_area/styles/cbv2/layout/body.html b/upload/admin_area/styles/cbv2/layout/body.html new file mode 100644 index 00000000..16131c15 --- /dev/null +++ b/upload/admin_area/styles/cbv2/layout/body.html @@ -0,0 +1,41 @@ +{include file="$style_dir/global_header.html" } + + +{include file="$style_dir/header.html" } +{include file="$style_dir/msg.html" } + +
+ +{if $smarty.cookies.admin_menu=='hide'} + {assign var='left_menu_class' value='left_menu_0'} + {assign var='contentcolumn_class' value='contentcolumn0'} +{else} + {assign var='left_menu_class' value='left_menu'} + {assign var='contentcolumn_class' value='contentcolumn'} +{/if} + +
+ + +{if $Cbucket->show_page} +
+
+
+ {foreach from=$template_files item=file} + {include_template_file file=$file} + {/foreach} +
+
+
+{/if} + + + + +{include file="$style_dir/left_menu.html" } + +
+
+{include file="$style_dir/footer.html" } + + \ No newline at end of file diff --git a/upload/admin_area/styles/cbv2/layout/category.html b/upload/admin_area/styles/cbv2/layout/category.html new file mode 100644 index 00000000..9c395b88 --- /dev/null +++ b/upload/admin_area/styles/cbv2/layout/category.html @@ -0,0 +1,179 @@ +Video Categories + + + + + + + + +
Manage Video Categories  
+ + +{if $edit_category != "show"} +
+ + + + + + + + + + + + + + + {assign var=useSubs value=func->config(use_subs)} + {if $useSubs == 1} + + + + + {/if} + + + + + + + + + + + + +
 * are required fields
Category Name*
Category Description*
Parent Category + {cbCategories output="dropdown" name="parent_cat" id="parent_cat" blank_option=TRUE echo=TRUE type="video"} +
Make Default Category

+ + +
+

Category Thumb +
 
+
+{/if} +{if $edit_category == "show"} +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 * are required fields
Category Name*
Category Description*
Parent Category + {cbCategories output="dropdown" selected=$cat_details.parent_id name="parent_cat" id="parent_cat" blank_option=TRUE type="video" echo=TRUE} +
Make Default Category

+ + +
+

Category Thumb
+
+{/if} + + +
+Category List +
+ +{if $total != 0} +
+ + + + + + + + + + +{assign var = bgcolor value = ""} +{section name=list loop=$category} + + + + + {if $category[list].parent_id == "0"} + {assign var=p_name value="None"} + {else} + {assign var=p_name value=$cbvid->get_category_field($category[list].parent_id,'category_name')} + {/if} + + + + + + + {if $bgcolor == ""} + {assign var = bgcolor value = "#EEEEEE"} + {else} + {assign var = bgcolor value = ""} + {/if} + +{/section} + +
Category NameOrderParent CategoryDescriptionDefaultAction 
{$category[list].category_name} - View Thumb + {$p_name}{if $category[list].category_desc}{$category[list].category_desc}{else}N/A{/if}{$category[list].isdefault} +
  • Edit
  • +
  • Delete
  • + {if $category[list].isdefault!="yes"}
  • Make Default
  • {/if} +
     
    + + +
    +
    + +{else} +No Category Has Been Created Yet +{/if} \ No newline at end of file diff --git a/upload/admin_area/styles/cbv2/layout/cb_conversion_queue.html b/upload/admin_area/styles/cbv2/layout/cb_conversion_queue.html new file mode 100644 index 00000000..3fa22399 --- /dev/null +++ b/upload/admin_area/styles/cbv2/layout/cb_conversion_queue.html @@ -0,0 +1,66 @@ +

    ClipBucket Queue Manager

    {if conv_lock_exists()}Delete Conversion Lock{/if} +
    +do not try to change the things here, can cause problems to your Clipbucket conversion system. + + + +
    + + + + + + +
    + + +
    + + + + + + + + + +
    + IDDetails 
    + +{if $queues} + +{foreach from=$queues item=queue} + + + + + + +{if $bgcolor == ""} +{assign var = bgcolor value = "#EEEEEE"} +{else} +{assign var = bgcolor value = ""} +{/if} +{/foreach} +
    + + {$queue.cqueue_id} + + {$queue.cqueue_name} - + + File Type : {$queue.cqueue_ext} • + Temp Ext : {$queue.cqueue_tmp_ext} • + Conversion Process : {$queue.cqueue_conversion|conv_status} • + {if $queue.time_started} + Started : {"Y-m-d H:i:s"|date:$queue.time_started} • + {/if} + {if $queue.time_completed} + Completed : {"Y-m-d H:i:s"|date:$queue.time_completed} + {/if} +
    +{else} +
    No Conversion Queue File Found
    +{/if} +
    + +{include file="$style_dir/blocks/pagination.html" } \ No newline at end of file diff --git a/upload/admin_area/styles/cbv2/layout/cb_mod_check.html b/upload/admin_area/styles/cbv2/layout/cb_mod_check.html new file mode 100644 index 00000000..063e10ed --- /dev/null +++ b/upload/admin_area/styles/cbv2/layout/cb_mod_check.html @@ -0,0 +1,94 @@ +

    Server Video Conversion Modules & Tools

    + +

    +A brief test to check weather server modules exist or not and what are there versions and paths +

    + + +
    + Modules and paths +
    + + +
    + + {check_module_path path='ffmpeg' get_path='true' assign='ffmpeg_status'} + FFMPEG +
    FFmpeg is used to covert videos from different versions to FLV , MP4 and many other formats. Learn more
    + + {if $ffmpeg_status.status=='ok'} + Version {$ffmpeg_status.version} • Expected Path {get_binaries path=ffmpeg type=server} + {else} + ffmpeg is not found + {if $ffmpeg_status.error} +
    {$ffmpeg_status.error} + {/if} + {/if} + +
    + + +
    + + {check_module_path path='php' get_path='true' assign='php_status'} + PHP CLI +
    PHP CLI is used to peform video conversion in a background process. + Learn more
    + + {if $php_status.status=='ok'} + Version {$php_status.version} • Expected Path {get_binaries path=php type=server} + {else} + php is not found + {if $php_status.error} +
    {$php_status.error} + {/if} + {/if} + +
    + + + +
    + + {check_module_path path='flvtool2' get_path='true' assign='flvtool2_status'} + FLVTool2 +
    FLVTool2 is a tool to repair FLV files to make them streamable + Learn more
    + + {if $flvtool2_status.status=='ok'} + Version {$flvtool2_status.version} • Expected Path {get_binaries path=flvtool2 type=server} + {else} + flvtool2 is not found + {if $flvtool2_status.error} +
    {$flvtool2_status.error} + {/if} + {/if} + +
    + + + +
    + + {check_module_path path='mp4box' get_path='true' assign='mp4box_status'} + MP4Box +
    MP4Box is a tool used to repair MP4 files to make them streamable + Learn more
    + + {if $mp4box_status.status=='ok'} + Version + {if $mp4box_status.version} + {$mp4box_status.version} + {/if} • Expected Path {get_binaries path=mp4box type=server} + {else} + Mp4box is not found + {if $mp4box_status.error} +
    {$mp4box_status.error} + {/if} + {/if} + +
    \ No newline at end of file diff --git a/upload/admin_area/styles/cbv2/layout/collection_category.html b/upload/admin_area/styles/cbv2/layout/collection_category.html new file mode 100644 index 00000000..a7adef70 --- /dev/null +++ b/upload/admin_area/styles/cbv2/layout/collection_category.html @@ -0,0 +1,167 @@ +Collection Categories + + + + + + + + +
    Manage Collection Categories  
    + + +{if $edit_category != "show"} +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + +
     * are required fields
    Category Name*
    Category Description*
    Make Default Category

    + + +
    +

    Category Thumb +
     
    +
    +{/if} +{if $edit_category == "show"} +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
     * are required fields
    Category Name*
    Category Description*
    Make Default Category

    + + +
    +

    Category Thumb
    +
    +{/if} + + +
    +Category List +
    + +{if $total != 0} +
    + + + + + + + + + + +{assign var = bgcolor value = ""} +{section name=list loop=$category} + + + + + {if $category[list].parent_id == "0"} + {assign var=p_name value="None"} + {else} + {assign var=p_name value=$cbvid->get_category_field($category[list].parent_id,'category_name')} + {/if} + + + + + + + {if $bgcolor == ""} + {assign var = bgcolor value = "#EEEEEE"} + {else} + {assign var = bgcolor value = ""} + {/if} + +{/section} + +
    Category NameOrderParent CategoryDescriptionDefaultAction 
    {$category[list].category_name} - View Thumb + {$p_name}{if $category[list].category_desc}{$category[list].category_desc}{else}N/A{/if}{$category[list].isdefault} +
  • Edit
  • +
  • Delete
  • + {if $category[list].isdefault!="yes"}
  • Make Default
  • {/if} +
     
    + + +
    +
    + +{else} +No Category Has Been Created Yet +{/if} \ No newline at end of file diff --git a/upload/admin_area/styles/cbv2/layout/collection_manager.html b/upload/admin_area/styles/cbv2/layout/collection_manager.html new file mode 100644 index 00000000..d2f33510 --- /dev/null +++ b/upload/admin_area/styles/cbv2/layout/collection_manager.html @@ -0,0 +1,160 @@ +

    Collection Manager

    + + + +
    + + + + + +
    + + + + + + +
    + + + + + + + + +
    + Collection IDDetails 
    + +{if $c} +{section name=list loop=$c} +
  • +
    +
    +
    +
    {$c[list].collection_id}
    +
    +
    + +
    +
    + {$c[list].collection_name} ({$c[list].total_objects} {$c[list].type}) +
    + + Featured:{$c[list].featured} • + Active:{$c[list].active} • + Type:{$c[list].type} • + Uploaded:{$c[list].date_added|niceTime} • + User:{$c[list].username} + + +
    +
    +
  • +{/section} +{else} +
    No Photo Found
    +{/if} + + + + + + +
    + + + + + + +
    +
    + +{include file="$style_dir/blocks/pagination.html" } \ No newline at end of file diff --git a/upload/admin_area/styles/cbv2/layout/comments.html b/upload/admin_area/styles/cbv2/layout/comments.html new file mode 100644 index 00000000..c6e013e3 --- /dev/null +++ b/upload/admin_area/styles/cbv2/layout/comments.html @@ -0,0 +1,151 @@ +Comments Manager +
    + + +
    + + + + + +
    + + + + +
    + + + + + + + + +
    + CIDComment 
    + +{if $comments} + + +{foreach from=$comments item=comment} + +{if $comment.anonym_name != ""} + {assign var=comment_owner value=$comment.anonym_name} +{else} + {assign var=comment_owner value=$userquery->get_user_details($comment.3)} +{/if} + + + + + + + +{/if} + +{if $type == 't'} + + {if is_array($comment_owner)} {$comment_owner.username} {else} {$comment_owner} {/if} commented on {$comment.date_added|date_format} on a topic named {$comment.topic_title|truncate:40} + +
    +{$comment.comment} + +{/if} + +{if $type == 'c'} + + {if is_array($comment_owner)} {$comment_owner.username} {else} {$comment_owner} {/if} commented on {$comment.date_added|date_format} on a channel named {$comment.username|truncate:40} + +
    +{$comment.comment} + + +{/if} + +{if $type == 'cl'} + + {if is_array($comment_owner)} {$comment_owner.username} {else} {$comment_owner} {/if} commented on {$comment.date_added|date_format} on a collection named {$comment.collection_name|truncate:40} + +
    +{$comment.comment} + + +{/if} + +{if $type == 'p'} + + {if is_array($comment_owner)} {$comment_owner.username} {else} {$comment_owner} {/if} commented on {$comment.date_added|date_format} on a photo named {$comment.photo_title|truncate:40} + +
    +{$comment.comment} + + +{/if} + +{if $bgcolor == ""} +{assign var = bgcolor value = "#EEE"} +{else} +{assign var = bgcolor value = ""} +{/if} +{/foreach} +
    {$comment.comment_id} + {if $type == '' || $type == 'v'} + + {if is_array($comment_owner)} {$comment_owner.username} {else} {$comment_owner} {/if} commented on {$comment.date_added|date_format} on a video named {$comment.title|truncate:40} + + +
    +{$comment.comment} + +
     
    +{else} +
    {lang code='no_comments'}
    +{/if} +
    +
    +{include file="$style_dir/blocks/pagination.html" } \ No newline at end of file diff --git a/upload/admin_area/styles/cbv2/layout/conversion_lab.html b/upload/admin_area/styles/cbv2/layout/conversion_lab.html new file mode 100644 index 00000000..77251000 --- /dev/null +++ b/upload/admin_area/styles/cbv2/layout/conversion_lab.html @@ -0,0 +1,86 @@ + +{literal} + +{/literal} + +

    Conversion lab - αlpha

    +
    +
    +Conversion environment for clipbucket users so they can test why their videos are not converting. +This test is in early beta stages, we are hopeful to get best outcome results.
    +
    +Current scientists : Arslan Hassan
    +Current version : 1.0 α
    + +Choose your victim + + + + + + +
    + +
    \ No newline at end of file diff --git a/upload/admin_area/styles/cbv2/layout/edit_announcemnent.html b/upload/admin_area/styles/cbv2/layout/edit_announcemnent.html new file mode 100644 index 00000000..43a11842 --- /dev/null +++ b/upload/admin_area/styles/cbv2/layout/edit_announcemnent.html @@ -0,0 +1,18 @@ +

    Edit Announcement

    + + + + +
    +
    + Announcement
    + + + +
    + +
    diff --git a/upload/admin_area/styles/cbv2/layout/edit_collection.html b/upload/admin_area/styles/cbv2/layout/edit_collection.html new file mode 100644 index 00000000..79d6e5af --- /dev/null +++ b/upload/admin_area/styles/cbv2/layout/edit_collection.html @@ -0,0 +1,135 @@ +{assign var=requiredFields value=$cbcollection->load_required_fields($data)} +{assign var=otherFields value=$cbcollection->load_other_fields($data)} + +
    + + + + + +
    + + + + + +
    Editing {$data.collection_name}
     
    +
    + +
    + + +
    + User Information + + + + + +
    Useid{$data.userid|get_username}
    +
    + +
    + Collection Details + + + + + + {foreach from=$requiredFields item=field} + + + + + {/foreach} +
    Collection ID
    {$field.title} :{$field.hint_1}
    + {$formObj->createField($field)}
    + {$field.hint_2}
    +
    +
    + Collection Stats + + + + + + + + + +
    Total Objects
    Total Comments
    +
    + +
    + + + + + + + + +
    Items
     
    + {if $objects} + {section name=list loop=$objects} + {if $data.type == 'photos'} +
    + {get_photo details=$objects[list] output='html' title=$photos[list].photo_title} +
    + {/if} + + {if $data.type == 'videos'} +
    + +
    + {/if} + {/section} +
    + {assign var=rest value=$data.total_objects-4} + Manage Items{if $rest && $rest>0} - {$rest} more item{if $rest>1}s{/if}{/if} + {else} +
    Collection has 0 items
    + {/if} +
    +
    + Other Fields + + {foreach from=$otherFields item=field} + + + + + {/foreach} +
    {$field.title} :{$field.hint_1}
    + {$formObj->createField($field)}
    + {$field.hint_2}
    +
    + +
    + Collection Preview + + + + + + + + + +
    Collection Preview : +
    Upload New :
    +
    +
    +
    \ No newline at end of file diff --git a/upload/admin_area/styles/cbv2/layout/edit_group.html b/upload/admin_area/styles/cbv2/layout/edit_group.html new file mode 100644 index 00000000..c468037b --- /dev/null +++ b/upload/admin_area/styles/cbv2/layout/edit_group.html @@ -0,0 +1,108 @@ +

    Edit Group

    + +{* Loading Form Fields *} +{assign var='requiredFields' value=$cbgroup->load_required_fields($group,true)} +{assign var='optionFields' value=$cbgroup->load_other_fields($group)} + + + + + + + +
     Editing {$group.title} 
    + + + +
    + + +
    + Thumbs +
    + +
    +
    +
  • {$LANG.grp_must_be} JPG | GIF | PNG
  • +
  • {$LANG.grp_90x90}
  • +
  • {$LANG.grp_thumb_warn}
  • + +
    +
    +
    + + +
    + Required Details + + {foreach from=$requiredFields item=field} + + + + + {/foreach} +
    {$field.title} {if $field.hint_1}{$field.hint_1}
    {/if} +{if $field.anchor_before}{ANCHOR place=$field.anchor_before}
    {/if} +{$formObj->createField($field)}
    + +{$field.hint_2}
    +
    + + + + + +
    + Group Stats + + + + + + + + + + + + + + + + + + + + + + + + +
    Total Views +
    Total Members +
    Total Videos +
    Total Topics +
      
    +
    + + +
    + Other Details + + {foreach from=$optionFields item=field} + + + + + {/foreach} +
    {$field.title} {if $field.hint_1}{$field.hint_1}
    {/if} +{if $field.anchor_before}{ANCHOR place=$field.anchor_before}
    {/if} +{$formObj->createField($field)}
    + +{$field.hint_2}
    +
    + +
    + +
    +
    \ No newline at end of file diff --git a/upload/admin_area/styles/cbv2/layout/edit_photo.html b/upload/admin_area/styles/cbv2/layout/edit_photo.html new file mode 100644 index 00000000..ace79ed8 --- /dev/null +++ b/upload/admin_area/styles/cbv2/layout/edit_photo.html @@ -0,0 +1,150 @@ +
    + + + + + + +
    + + + + + +
    Editing {$data.photo_title}
     
    +
    + +
    + + + + +
    + User Information + + + + + +
    Useid{$data.userid|get_username}
    +
    + +
    + Important Details + + + + + + + + + + + + + + + + + +
    Photo ID + +
    Photo Key + +
    Filename + +
    Extension + +
    +
    + +
    + Photo Details + + {foreach from=$requiredFields item=field} + + + + + {/foreach} +
    {$field.title} :{$field.hint_1}
    + {$formObj->createField($field)} + {$field.hint_2}
    +
    + +
    + Photo Stats + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Views:
    Total Favorites:
    Total Comments:
    Total Downloads:
    Rating:
    Rated By:
    Voters:
    +
    + +
    + + + + + +
    Photo Preview
     
    +
    +
    {get_photo details=$data size='l' output='html' style='max-width:600px'}
    +
    + +
    + Other Fields + + {foreach from=$otherFields item=field} + + + + + {/foreach} +
    {$field.title} :{$field.hint_1}
    + {$formObj->createField($field)} + {$field.hint_2}
    +
    +
    + + +
    \ No newline at end of file diff --git a/upload/admin_area/styles/cbv2/layout/edit_video.html b/upload/admin_area/styles/cbv2/layout/edit_video.html new file mode 100644 index 00000000..1337604e --- /dev/null +++ b/upload/admin_area/styles/cbv2/layout/edit_video.html @@ -0,0 +1,216 @@ + +{assign var='custom_upload_fields' value=$Upload->load_custom_upload_fields($data,TRUE)} +{assign var='video_fields' value=$Upload->load_video_fields($data)} + +{if $data.title neq ""} + + +
    + + + + + + + + + + + + +
    + + + + + +
    Editing {$data.title}
     
    + +
    + + + +
    + + + + + + +
    + User Information + + + + + +
    Useid{$data.userid|get_username}
    +
    + +
    + Important Details + + + + + + + + + + + + + + + + + + + + + + + + + + + + {foreach from=$requiredFields item=field} + {/foreach} + + + + + + + + + +
    Video Id + +
    Video Key + +
    File Name + +
    Total Video Files{get_all_video_files vdetails=$data count_only=true} - View File Details and Conversion Log
    Total Thumbnails{get_thumb vdetails=$data count_only=true}
    Thumbnails
    +{if $data.embeded !=yes}Regenerate Thumbs{/if}
    + Manage Thumbs
    {assign var=vidthumbs value=func->get_thumb($data,1,TRUE,FALSE,TRUE,FALSE)} + + {foreach from=$vidthumbs item=vid_thumb} +
    +
    + {if $vid_thumb|getname!='processing'} + Delete + {/if} +
    + {/foreach} + +
    Status + +
    Duration (seconds) + +seconds
    +
    + + +
    + Video Stats + + + + + + + + + + + + + +
    Views
    Rating + of 10
    RatedBy
    +
    +
    + Custom Upload Fields + + {foreach from=$custom_upload_fields item=field} + + + + + {/foreach} +
    {$field.title}{$field.hint_1}{ANCHOR place=$field.anchor_before}{$formObj->createField($field)} +
    + {$field.hint_2}
    +
    + + + + + + + + + + + + +
    + +
    + + +
    + + + + +
    Viewing {$data.title}
     
    +
    + + {FlashPlayer vdetails = $data width='100%' autoplay='false'} + +
    + + {foreach from=$video_fields item=field_group} +
    + {$field_group.group_name} + + {foreach from=$field_group.fields item=field} + + + + + {/foreach} +
    {$field.title} {if $field.hint_1}{$field.hint_1}
    {/if} + {$formObj->createField($field)} + {if $field.hint_2}
    {$field.hint_2}{/if}
    +
    + {/foreach} + + +
    {assign var=id value=$data.videoid}{include file="$style_dir/blocks/comments.html" type=v id=$data.videoid link="video=$id"}
    +
    +{/if} \ No newline at end of file diff --git a/upload/admin_area/styles/cbv2/layout/editor_pick.html b/upload/admin_area/styles/cbv2/layout/editor_pick.html new file mode 100644 index 00000000..8829f382 --- /dev/null +++ b/upload/admin_area/styles/cbv2/layout/editor_pick.html @@ -0,0 +1,71 @@ +Editor's Pick + +
    + + + + + +
    + + + +
    + + + + + + + +
    + OrderDetails 
    + + + +{assign var = bgcolor value = ""} +{section name=list loop=$videos} + + + + + + + {if $bgcolor == ""} + {assign var = bgcolor value = "#EEEEEE"} + {else} + {assign var = bgcolor value = ""} + {/if} + +{/section} +
    + + {$videos[list].title} + Remove from editor's pick— + + Featured:{$videos[list].featured} • + Active:{$videos[list].active} • + Status:{$videos[list].status} + +
    + +
     
    + + + + + +
    + + +
    +
    + + diff --git a/upload/admin_area/styles/cbv2/layout/email_settings.html b/upload/admin_area/styles/cbv2/layout/email_settings.html new file mode 100644 index 00000000..3c11dc9d --- /dev/null +++ b/upload/admin_area/styles/cbv2/layout/email_settings.html @@ -0,0 +1,102 @@ +

    Email Settings

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

    + Select Mailer Type php Mail() or SMTP
    +

    +
    If using smtp, please enter its server
    +

    + if using smtp, Set SMTP server port
    +

    + if using smtp, please enter SMTP username
    +

    + Enter SMTP password
    +
    SMTP Auth
    + Enable SMTP Authentication +
      
      
    +
    +
    + +
    +
    +

    Email Templates Settings

    + +
    + +
    +{assign var=templates value=$cbemail->get_templates()} + +{if $templates}
    +
      + + {foreach from=$templates item=template name=etemp} +
    • {$template.email_template_name}
    • + {/foreach} + +
    +
    + {foreach from=$templates item=template name=etemp} + + {/foreach} +
    +
    +{/if} +
    \ No newline at end of file diff --git a/upload/admin_area/styles/cbv2/layout/flagged_groups.html b/upload/admin_area/styles/cbv2/layout/flagged_groups.html new file mode 100644 index 00000000..af3a2b0b --- /dev/null +++ b/upload/admin_area/styles/cbv2/layout/flagged_groups.html @@ -0,0 +1,148 @@ + +{if $mode=='view'} +Flagged Groups Manager + +
    + + + + + + +
    + + + + + + +
    + + + + + + + + + +
    + GP-IDDetails 
    + + + + + + +{assign var = bgcolor value = ""} +{section name=gp_list loop=$groups} + + + + + + + {if $bgcolor == ""} + {assign var = bgcolor value = "#EEEEEE"} + {else} + {assign var = bgcolor value = ""} + {/if} + +{/section} +
    {$groups[gp_list].group_id} +
    + +
    + + {$groups[gp_list].group_name} + — + + Group Owner: {$groups[gp_list].userid|get_username} • + Group Type: {if $groups[gp_list].group_privacy =="0"}Public{elseif $groups[gp_list].group_privacy =="1"}Private{else}Invited{/if} • + Group Status:{if $groups[gp_list].active=="yes"} Active{else}Inactive{/if} • + Group Members:{$groups[gp_list].total_members|number_format} • + Flags:{$groups[gp_list].total_flags} + + +
    + +
     
    + + + + + + + +
    + + + + + + +
    + +
    + + +{include file="$style_dir/blocks/pagination.html" } + +{/if} + + +{if $mode=='view_flags'} + +Viewing {$group.group_name} flagsView GroupEdit GroupDelete FlagsDelete Group +
    + +
    + + + + + + + + +
     Flag Details 
    + + + + + + +{assign var = bgcolor value = ""} +{section name=list loop=$flags} + + + + + + {if $bgcolor == ""} + {assign var = bgcolor value = "#EEEEEE"} + {else} + {assign var = bgcolor value = ""} + {/if} + +{/section} +
    {$smarty.section.list.iteration}Reported as "{$flags[list].flag_type|flag_type}" by {$flags[list].userid|get_username} {$flags[list].date_added|niceTime} 
    +
    + +{/if} \ No newline at end of file diff --git a/upload/admin_area/styles/cbv2/layout/flagged_photos.html b/upload/admin_area/styles/cbv2/layout/flagged_photos.html new file mode 100644 index 00000000..ddae5016 --- /dev/null +++ b/upload/admin_area/styles/cbv2/layout/flagged_photos.html @@ -0,0 +1,105 @@ +{if $mode == 'view'} +Flagged Photos Manager +
    + + + + + +
    + + + + +
    + + + + + + + + +
    + Photo-IDDetails 
    + +{if $photos} +{section name=list loop=$photos} +
  • +
    +
    +
    + +
    {$photos[list].photo_id}
    +
    +
    + {get_photo details=$photos[list] id='photo' style='padding:2px; border:1px solid #ccc' output='html'} +
    +
    + {$photos[list].photo_title} +
    + + Featured:{$photos[list].featured} • + {if $photos[list].collection_id} + Collection:{$photos[list].collection_id|get_collection_field} + {else} + Photo is Orphan + {/if} • + Uploaded:{$photos[list].date_added|niceTime} • + Uploader:{$photos[list].userid|get_username} • + Flag: {$photos[list].total_flags} + +
    + +
    +
    +
  • +{/section} +{else} +
    No Flags Found
    +{/if} + + + + + + +
    + + + + +
    + +
    + +{include file="$style_dir/blocks/pagination.html" } +{/if} + +{if $mode == 'view_flags'} +Viewing {$photo.photo_title} flagsView PhotoEdit PhotoDelete FlagsDelete Photo +
    +
    + + + + + + +
     Flag Details 
    + +{section name=list loop=$flags} +
  • +
    {$smarty.section.list.iteration}
    +
    + Reported as "{$flags[list].flag_type|flag_type}" by {$flags[list].userid|get_username} {$flags[list].date_added|niceTime} +
    +
  • +{/section} +
    +{/if} \ No newline at end of file diff --git a/upload/admin_area/styles/cbv2/layout/flagged_users.html b/upload/admin_area/styles/cbv2/layout/flagged_users.html new file mode 100644 index 00000000..a924b654 --- /dev/null +++ b/upload/admin_area/styles/cbv2/layout/flagged_users.html @@ -0,0 +1,155 @@ + +{if $mode=='view'} +Flagged Users Manager + +
    + + + + + + +
    + + + + + + +
    + + + + + + + + +
    + UIDUser Details 
    + + + +{if $users} + + +{foreach from=$users item=u} + + + + + + +{if $bgcolor == ""} +{assign var = bgcolor value = "#EEEEEE"} +{else} +{assign var = bgcolor value = ""} +{/if} +{/foreach} + + + + + + + + +
    {$u.userid} +
    + + {$u.username} + — + Email:{$u.email} • + Status:{$u.usr_status} • + Level:{$u.level|get_user_level} • + Last Active:{$u.last_active} + + +
    + +
     
    + + + + + +{else} +
    NO USER FOUND
    +{/if} + + + + + + + +
    + + + + + + +
    + +
    + + +{include file="$style_dir/blocks/pagination.html" } + +{/if} + + +{if $mode=='view_flags'} + +Viewing {$user.username} flagsView UserEdit UserDelete FlagsDelete User +
    + +
    + + + + + + + + +
     Flag Details 
    + + + + + + +{assign var = bgcolor value = ""} +{section name=list loop=$flags} + + + + + + {if $bgcolor == ""} + {assign var = bgcolor value = "#EEEEEE"} + {else} + {assign var = bgcolor value = ""} + {/if} + +{/section} +
    {$smarty.section.list.iteration}Reported as "{$flags[list].flag_type|flag_type}" by {$flags[list].userid|get_username} {$flags[list].date_added|niceTime} 
    +
    + +{/if} \ No newline at end of file diff --git a/upload/admin_area/styles/cbv2/layout/flagged_videos.html b/upload/admin_area/styles/cbv2/layout/flagged_videos.html new file mode 100644 index 00000000..36f1da63 --- /dev/null +++ b/upload/admin_area/styles/cbv2/layout/flagged_videos.html @@ -0,0 +1,136 @@ + +{if $mode=='view'} +Flagged Videos Manager + +
    + + + + + + +
    + + + + + + +
    + + + + + + + + + +
    + VID
    Details
     
    + + + + + + +{assign var = bgcolor value = ""} +{section name=list loop=$videos} + + + + + + + {if $bgcolor == ""} + {assign var = bgcolor value = "#EEEEEE"} + {else} + {assign var = bgcolor value = ""} + {/if} + +{/section} +
    {$videos[list].videoid} + + {$videos[list].title} + — + + Active:{$videos[list].active} • + Status:{$videos[list].status} • + Flags:{$videos[list].total_flags} + + +
    + +
     
    + + + + + + + +
    + + + + + + +
    + +
    + + +{include file="$style_dir/blocks/pagination.html" } + +{/if} + + +{if $mode=='view_flags'} +Viewing {$video.title} flagsView videoEdit videoDelete FlagsDelete Video +
    + +
    + + + + + + + + +
     Flag Details 
    + + + + + + +{assign var = bgcolor value = ""} +{section name=list loop=$flags} + + + + + + {if $bgcolor == ""} + {assign var = bgcolor value = "#EEEEEE"} + {else} + {assign var = bgcolor value = ""} + {/if} + +{/section} +
    {$smarty.section.list.iteration}Reported as "{$flags[list].flag_type|flag_type}" by {$flags[list].userid|get_username} {$flags[list].date_added|niceTime} 
    +
    + +{/if} \ No newline at end of file diff --git a/upload/admin_area/styles/cbv2/layout/footer.html b/upload/admin_area/styles/cbv2/layout/footer.html new file mode 100644 index 00000000..8714d90f --- /dev/null +++ b/upload/admin_area/styles/cbv2/layout/footer.html @@ -0,0 +1,7 @@ +
    + \ No newline at end of file diff --git a/upload/admin_area/styles/cbv2/layout/global_header.html b/upload/admin_area/styles/cbv2/layout/global_header.html new file mode 100644 index 00000000..50853a31 --- /dev/null +++ b/upload/admin_area/styles/cbv2/layout/global_header.html @@ -0,0 +1,217 @@ + + + + +{cbtitle sub_sep='›'} + + + + + + +{if $googleApi} + + + +{else} + + +{/if} + + + + + + + + + + + + + + + + +{if $Cbucket->AdminJSArray} + +{foreach from=$Cbucket->AdminJSArray key=file item=type} + {if $curActive == $type || $type=='global' } + {include_js type=$type file=$file} + {/if} +{/foreach} + +{/if} + +{if $Cbucket->admin_header_files} + + {foreach from=$Cbucket->admin_header_files key=file item=type} + {include_header type=$type file=$file} + {/foreach} + +{/if} + + + + + +{literal} + + +{/literal} + +{literal} + +{/literal} + \ No newline at end of file diff --git a/upload/admin_area/styles/cbv2/layout/group_category.html b/upload/admin_area/styles/cbv2/layout/group_category.html new file mode 100644 index 00000000..f91e50df --- /dev/null +++ b/upload/admin_area/styles/cbv2/layout/group_category.html @@ -0,0 +1,158 @@ +Group Categories + + + + + + +
    Manage Group Categories  
    + + +{if $edit_category != "show"} +
    + + + + + + + + + + + + + + + + + + + + + + + + + +
     * are required fields
    Category Name*
    Category Description*
    Make Default Category

    + + +
    +

    Category Thumb +
     
    +
    +{/if} +{if $edit_category == "show"} +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + +
     * are required fields
    Category Name*
    Category Description*
    Make Default Category

    + + +
    +

    Category Thumb
    +
    +{/if} + + +
    +Category List +
    + +{if $total != 0} +
    + + + + + + + + + +{assign var = bgcolor value = ""} +{section name=list loop=$category} + + + + + + + + + + + {if $bgcolor == ""} + {assign var = bgcolor value = "#EEEEEE"} + {else} + {assign var = bgcolor value = ""} + {/if} + +{/section} + +
    Category NameOrderDescriptionDefaultAction 
    {$category[list].category_name} - View Thumb + {if $category[list].category_desc}{$category[list].category_desc}{else}N/A{/if}{$category[list].isdefault} +
  • Edit
  • +
  • Delete
  • + {if $category[list].isdefault!="yes"}
  • Make Default
  • {/if} +
     
    + + +
    +
    +{else} +No Category Has Been Created Yet +{/if} +
    +
    + + diff --git a/upload/admin_area/styles/cbv2/layout/groups_manager.html b/upload/admin_area/styles/cbv2/layout/groups_manager.html new file mode 100644 index 00000000..a0656c9d --- /dev/null +++ b/upload/admin_area/styles/cbv2/layout/groups_manager.html @@ -0,0 +1,153 @@ +Groups Manager + + + + + + + +
    + + + + + + +
    + + + + + + +
    + + + + + + + + + +
    + GP-IDDetails 
    + + + + + + +{assign var = bgcolor value = ""} +{section name=gp_list loop=$groups} + + + + + + + {if $bgcolor == ""} + {assign var = bgcolor value = "#EEEEEE"} + {else} + {assign var = bgcolor value = ""} + {/if} + +{/section} +
    {$groups[gp_list].group_id} +
    + +
    + + {$groups[gp_list].group_name} + — + + Group Owner: {$groups[gp_list].userid|get_username} • + Group Type: {if $groups[gp_list].group_privacy =="0"}Public{elseif $groups[gp_list].group_privacy =="1"}Private{else}Invited{/if} • + Group Status:{if $groups[gp_list].active=="yes"} Active{else}Inactive{/if} • + Group Members:{$groups[gp_list].total_members|number_format} + + +
    + +
     
    + + + + + + + +
    + + + + + + +
    + +
    + +{include file="$style_dir/blocks/pagination.html" } diff --git a/upload/admin_area/styles/cbv2/layout/header.html b/upload/admin_area/styles/cbv2/layout/header.html new file mode 100644 index 00000000..f338a4e0 --- /dev/null +++ b/upload/admin_area/styles/cbv2/layout/header.html @@ -0,0 +1,23 @@ +
    + {$title} +
    + Hello {$userquery->username} +
    +
    + + +
    +
    +
    + Results Per Page : + + +
    +
    +
    diff --git a/upload/admin_area/styles/cbv2/layout/index.html b/upload/admin_area/styles/cbv2/layout/index.html new file mode 100644 index 00000000..b183c6ad --- /dev/null +++ b/upload/admin_area/styles/cbv2/layout/index.html @@ -0,0 +1,200 @@ + + + + + + + +
    + +
    + + +
    +

    {$title} Quick Stats

    +
    +
    +
    Videos
    +
    Total : {get_videos count_only=yes} | Active : {get_videos count_only=yes active="yes"} | Flagged : {$cbvid->action->count_flagged_objects()} | Processing : {get_videos count_only=yes status='Processing'}
    +
    + +
    +
    Groups
    +
    Total : {get_groups count_only=yes} | Active : {get_groups count_only=yes active='yes'} | Flagged : {$cbgroup->action->count_flagged_objects()}
    +
    + +
    +
    Members
    +
    Total : {get_users count_only=yes} | Active : {get_users count_only=yes status='Ok'} | Flagged : {$userquery->action->count_flagged_objects()} | Banned : {get_users count_only=yes ban='yes'}
    +
    + + + +
    +
    Photos
    +
    Total : {get_photos count_only=yes} | Active : {get_photos count_only=yes active='yes'} | Flagged : {$cbphoto->action->count_flagged_objects()}
    +
    + + + +
    +
    Collections
    +
    Total : {get_collections count_only=yes} | Active : {get_collections count_only=yes active='yes'} + | Flagged : {$cbcollection->action->count_flagged_objects()} + | Videos : {get_collections count_only=yes type='videos'} | Photos : {get_collections count_only=yes type='photos'} +
    +
    + + +
    + {assign var=users value=$userquery->get_online_users()} + Online Users({$userquery->get_online_users(false,true)})
    + + {if $users} + {foreach from=$users item=user name=onlines} + {if $user.username!=""} + {$user.username}{if $user.logins>1}({$user.logins}){/if}{if !$smarty.foreach.onlines.last}, {/if} {/if} + {/foreach} + + + {foreach from=$users item=user name=onlines} + {if $user.session_string=='guest'} + and {$user.logins} guest{if $user.logins>1}s{/if} + {/if} + {/foreach} + + {else} + No User is Online + {/if} + + +
    + +
    + {if $Cbucket->cbinfo.new_available} +
    Currently you are running {$ClipBucket->cbinfo.version} {$ClipBucket->cbinfo.state}
    +Latest Version {$Cbucket->cbinfo.latest.version} {$Cbucket->cbinfo.latest.state}
    + +
    + {else} +
    + Currently you are running {$Cbucket->cbinfo.version} {$Cbucket->cbinfo.state} - No New Version Available
    + {/if} +
    +
    +
    + + +
    +

    ClipBucket News

    +
    +
    +
    +
    + +
    +
    +

    Words from ClipBucket!

    +

    ClipBucket is developed by Arslan Hassan and Fawaz Tahir, we started with a small website application with only functionality of serving videos to the community later on we decided to add every possible social networking feature to make social communities more interactive. We didn't have any milestones, no road map, no charts, no nothing. Only thing we had was a vision as of our captain Jahanzeb Hassan and plenty of hard work.

    +

    We also have two more members named Ruman Malik and Zomail Tahir who manage sales and support department.

    +

    ClipBucket team gives special thanks to
    +
    + * Frank White for helping us knowing the basics of professional application development
    + * Christian Russemen for keep our community active
    + * BigStack for his great forum support +
    + * You for using ClipBucket.

    +

    What lies head?

    +

    * Easy ClipBucket integeration with other applications
    + * Make more secured, fast and optimized
    + * HTML5 ready with mobile support
    + * Full documentation of our source code +

    +

    Where in the world we belong to?

    +

    We belong to Islamic Republic of Pakistan :) you may have seen many negative news about Pakistan on television but there are still some facts you should know about. Its a great country for us and we will always love it.
    + Pakistan Zindabad
    +
    +

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

    Personal Notes

    +
    + {assign var=notes value=$myquery->get_notes()} + +
    + {if $notes} +
    + {foreach from=$notes item=note} +
    + + {$note.note|nl2br} +
    + {/foreach} + {else} +
    No notes
    + {/if} +
    +
    + + +
    +
    +
    + + + +
    + + +
    + + + \ No newline at end of file diff --git a/upload/admin_area/styles/cbv2/layout/language_settings.html b/upload/admin_area/styles/cbv2/layout/language_settings.html new file mode 100644 index 00000000..5ec0dba6 --- /dev/null +++ b/upload/admin_area/styles/cbv2/layout/language_settings.html @@ -0,0 +1,113 @@ +{if $edit_lang != 'yes'} +

    Language Settings

    + + + + + + +
    ID
    Default
    Language
    + +
    +{section name=l_list loop=$language_list} +
    + + + + + + +
    {$language_list[l_list].language_id}{$language_list[l_list].language_name}({$language_list[l_list].language_code}) +
    Recreate Pack + - Recreate from pack + - Edit Phrases + - Edit + - Delete + - Export{if $language_list[l_list].language_active!='yes'} + - Activate{/if}{if $language_list[l_list].language_active=='yes'} + - Dectivate{/if}
    +
    +{/section} +
    + +
    +

    Add New Language

    +
    +
    + Upload file + + + + +
    Browse ClipBucket Language File ( must be .xml format ) + +
    +
    +
    +{else} +Edit {$lang_details.language_name} + + + +
    + +
    +Editing {$lang_details.language_name} Phrases + +
    + +
    + + + + + + + + + + + +
    Phrase CodePhrase
    + +{section name=p_list loop=$lang_phrases} +
    + + + + + + + +
    {$lang_phrases[p_list].varname}
    {$lang_phrases[p_list].text}
    +
    +{/section} + + +{include file="$style_dir/blocks/pagination.html" } + +{/if} \ No newline at end of file diff --git a/upload/admin_area/styles/cbv2/layout/left_menu.html b/upload/admin_area/styles/cbv2/layout/left_menu.html new file mode 100644 index 00000000..fd7d411a --- /dev/null +++ b/upload/admin_area/styles/cbv2/layout/left_menu.html @@ -0,0 +1,25 @@ + +
    + +Toggle Menu +Toggle Menu + + +{assign var='menu' value = $Cbucket->AdminMenu} +{foreach from=$menu key=name item=menu} + +
    +
    {$name}
    +
    + +
    +
    + +{/foreach} + +
    + \ No newline at end of file diff --git a/upload/admin_area/styles/cbv2/layout/login.html b/upload/admin_area/styles/cbv2/layout/login.html new file mode 100644 index 00000000..ebc45f3b --- /dev/null +++ b/upload/admin_area/styles/cbv2/layout/login.html @@ -0,0 +1,41 @@ + + +
    + {$title} — Back To Main Website +
    +
    + +{include file="$style_dir/msg.html" } + +
    +
    +
    + + + + + + + + + + + + + + + + +
    + +
    + +
    +
    +
    +
    + + + diff --git a/upload/admin_area/styles/cbv2/layout/main.html b/upload/admin_area/styles/cbv2/layout/main.html new file mode 100644 index 00000000..25769db8 --- /dev/null +++ b/upload/admin_area/styles/cbv2/layout/main.html @@ -0,0 +1,1188 @@ + +
      +
    • Website Settings
    • +
    • Uploading and Conversion Settings
    • +
    • Display and Listing Settings
    • +
    • User Settings & registration
    • +
    +
    + +
    + + +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Website title
    Website slogan
    Website closed
    Closed message
    Meta Description
    Meta Keywords
    SEO Urls
    Allow template change
    Allow language change
    Date Format +
    Default Time Zone + +
    + +
    Use Sub-Categories
    Collpase Category Checkboxes + If selected YES, Categories shown while uploading video will be collapsed. +
      
    Emails
    Website Email
    Support Email
    Send Comment Notification + +
    Send Video Approve Noticfication
      
    Comments
    Allow Channel Comments
    Allow Guests to Comment
    Allow comments rating
    Comments Captcha

    + + + + + +
    +

      
    Videos
    Enable video section +
    Enable facebook embed +
    Allow video download
    Max categories for each video
    Category x + + x + +
    Embed type +
    Seo video url pattern + +
    + +
    + +
    + +
      
    Channels
    Enable channels +
      
    Groups
    Enable group section +
    Group Thumb Height
    Group Thumb Width
    Group Max Title
    Group Max Description
    Max group topic name
    Max group topic content
    Max categories for each group
      
    Photos
    Enable photos +
      
    General
    Enable Collections +
    + Allow videos ratings + + - + + Allow user to rate own videos
    + Allow collection ratings + + - + + Allow user to rate own collections
    + Allow channel ratings + + - + + Allow users to rate own channels
    +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Upoad Options + {foreach from=$opt_list item=opt} + {assign var=uploadOptId value=$opt.load_func} + + {/foreach} +
    Use Crons + + + +
    FFMPEG Path + +
    + Turn on VF + + +
    PHP Path + +
    MP4Box Path + +
    Flvtool2 Path + +
    Mplayer Path +
    Flvtool++ Path +
      
    Turn on Quick Conversion + +
    Server Friendly Conversion + +
    Max Video Processes at once
    Max time wait after max processes
      
    Allowed extensions
    Max upload file size + in MegaBytes
    + Default PHP Max Upload size is {$upload_max_size} and Post max size is {$post_max_size}, if you set max upload file size larger than this, it will be override by default, however, if set lower than default, it will work fine.
    Max upload duration + in minutes
    Save original file
    Mp4 HQ Output +
    Keep Mp4 As Is +
    Activation required
      
    Video Upload Form Settings
    Min - Max Video title + - +
    Min - Max Video Description +- +
    Min - Max Video Tags +- +
      
     
    Conversion Settings
    Normal video resolution + + +
    HQ video resolution
    Thumb Width
    Thumb Height
    Number of thumbs
    Big Thumb Width
    Big Thumb Height
      
    Change only if you have good knowledge of video conversion
    Select profile +
    Video Codec
    Audio Codec
    Video Rate
    Video Bitrate
    Audio Rate
    Audio Bitrate
      
    +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current Templatemanage templates
    Current FLV Playermanage flv players
      
    Main Settings
    Use cached pagination
    Pagination chaching time + in minutes
      
    Videos Listing
    Videos Page + - 'videos' page
    Channel Page + - 'view channel' page
    User Videos + - 'user videos' page
    User Favorite + - 'user favorits' page
    Group Page + - videos display in view group page
    Home Tabs + - videos display in home tab
    Search Page + - videos display in search page
    Video Columns + - videos display in right columns ie (Random, Related etc)
      
    Photos Listing
    We use this limit in most of place where photo is displayed like, My Account, Manage Photos, Manage Favotires Photos etc.
    Number of photos to display on Homepage.
    Number of photos to display on Search page.
    Number of photos to display on User's page.
    Number of photos to display on User's photos page.
    Number of photos to display on User's favorites page.
    Use anywhere you want.
      
    Collection Listing
    Number of collections to display on Collections page.
    Number of collections to display on Homepage.
    Number of items to display in a Collection.
    Number of collections to display on Homepage.
    Number of collections to display on Channel page.
    Number of collections to display on User's collection page.
    Number of collections to display on User's favorite page.
      
    Users Listing
    User list per page + - 'users' page
    Subscribers in channel view + - subscribers in view channel page
    Subscriptions in channel view + - subscriptions in view channel page
    Users contacts in channel view + - users contacts in view channel
    View Group Page + - users in view group page
    Search Page + - users in search page
      
    Groups
    Groups Page + - 'groups' page
    Search Page + - groups in search page
      
    General
    Search results per page + - other search results
    Recently viewed videos + - recently viewed videos
    Comments per page
      
    +
    +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Anonymous UserID +
    Turn on registrations
    Email verification
    Image verification (captcha)
    Username maximum characters
    Disallowed usernames
    Allow Special Characters in usernames
    Allow spaces in usernames
    Minimum Username Length
    Maximum Username Length
    Minimum age for registration + leave blank to disable this option
      
    Profile Pictures & Background
    Use Gravatars
    Max Porfile Pic Size + KBs
    Max Porfile Pic Dimension + Pixels
    Allow Picture URL +
    Allow Picture Upload
    Max Background Size + KBs
    Max Background Dimension + Pixels
    Allow Background URL
    Allow Background Upload
    Allow Background Color
    +
    +
    +
    +
    +
    +
    diff --git a/upload/admin_area/styles/cbv2/layout/maintenance.html b/upload/admin_area/styles/cbv2/layout/maintenance.html new file mode 100644 index 00000000..0806ec37 --- /dev/null +++ b/upload/admin_area/styles/cbv2/layout/maintenance.html @@ -0,0 +1,58 @@ +Website Maintenance +
    +Remove inactive sessions, user access logs, comments cache, more options will be available soon +
    + + + +{if $smarty.get.mode =='remove_activity_feed'} + {if $indexing} +
    {$from} - {$to} of {$total}
    +
      + {foreach from=$index_msgs item=themsg} +
    • {$themsg}
    • + {/foreach} +
    + {if $stop_loop!='yes'} + + redirecting....do not close this window + {else} + Indexing has been completed. + {/if} + {/if} +{/if} \ No newline at end of file diff --git a/upload/admin_area/styles/cbv2/layout/manage_items.html b/upload/admin_area/styles/cbv2/layout/manage_items.html new file mode 100644 index 00000000..a6b9abe4 --- /dev/null +++ b/upload/admin_area/styles/cbv2/layout/manage_items.html @@ -0,0 +1,115 @@ +

    Manage Items - {$data.collection_name}

    +
    + + + + + +
    + + + +
    +
    + + + + + + + + +
    + Object IDDetails 
    +{if $obj} +{if $type == ''} +
    Unknown Type
    +{else} +{if $type == 'photos'} +
  • +
    + Re-create photos. This will re-create photos found in the collection. +
    +
  • +{/if} +{section name=list loop=$obj} + {if $type == 'photos'} +
  • +
    +
    +
    +
    {$obj[list].photo_id}
    +
    +
    + +
    +
    + {$obj[list].photo_title} +
    + + Featured:{$obj[list].featured} • + Collection:{$obj[list].collection_id|get_collection_field} • + Uploaded:{$obj[list].date_added|niceTime} • + User:{$obj[list].username} + +
    + +
    +
    +
  • + {/if} + + {if $type == 'videos'} +
  • +
    +
    +
    +
    {$obj[list].videoid}
    +
    +
    + +
    +
    + {$obj[list].title} +
    + + Featured:{$obj[list].featured} • + Active:{$obj[list].active} • + Uploaded:{$obj[list].date_added|niceTime} • + User:{$obj[list].username} + +
    + +
    +
    +
  • + + {/if} +{/section} +{/if} +{else} +
    No Object Found
    +{/if} + + + + + +
    + + +
    +
    +
    \ No newline at end of file diff --git a/upload/admin_area/styles/cbv2/layout/manage_pages.html b/upload/admin_area/styles/cbv2/layout/manage_pages.html new file mode 100644 index 00000000..71ae23ac --- /dev/null +++ b/upload/admin_area/styles/cbv2/layout/manage_pages.html @@ -0,0 +1,197 @@ + +Manage Pages + +{if $mode =="new"} +
    +
    + Add New Page + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
     
     
    +
     
    +
    +
    +
    +{/if} + + + + + +{if $mode =="edit" && $page.page_name!=''} +
    +
    + Add New Page + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
     
     
    +
     
    +
    +
    +
    +{/if} + + + + +{if $mode=='manage'} +
    + + + + + + +
    + + + + + +
    + + + + + + + + + + + +
    + PIDOrder
    Details
     
    + + + + + + +{assign var = bgcolor value = ""} +{section name=list loop=$cbpages} + + + + + + + + {if $bgcolor == ""} + {assign var = bgcolor value = "#EEEEEE"} + {else} + {assign var = bgcolor value = ""} + {/if} + +{/section} +
    {$cbpages[list].page_id} + + {$cbpages[list].page_name} + — + + Active:{$cbpages[list].active} • + Added:{$cbpages[list].date_added|niceTime} + {if $cbpages[list].delete_able =='no'} • UNDELETE-ABLE{/if} + • Display in footer:{$cbpages[list].display} + + +
    + +
     
    + + + + + + +
    + + + + + +
    +
    +{/if} \ No newline at end of file diff --git a/upload/admin_area/styles/cbv2/layout/manage_players.html b/upload/admin_area/styles/cbv2/layout/manage_players.html new file mode 100644 index 00000000..bad81d72 --- /dev/null +++ b/upload/admin_area/styles/cbv2/layout/manage_players.html @@ -0,0 +1,278 @@ +{if $mode =='show_settings'} + + + + + +
    ClipBucket Website Player Settings 
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Pakplayer license
    + If you have pakplayer license, please enter it here
    + +
    Use Playlist
    +
    By turning this on, player will turn on playlists feature in player (if available)
    +
    Logo File
    + Logo file that will display on your flash player

    +
    Logo Placement
    + Placement of logo, top, left , right or bottom

    + Set logo padding in pixels
    Buffer Time
    + To control the buffer seconds
    Play Youtube Video Inside Player
    + this will let you play youtube videos in your player
    +
    Embed Player Width
    + Enter embedable player width in pixels
    +
    Embed Player Height
    + Enter embedable player width in pixels
    +
    Autoplay Embed
    + Autoplay embeded video by default
    +
    Use PseudoStreaming
    + Let users to play video from anywhere, requires h264 streaming module from webserver
    + + + +
    Pakplayer Context Menu
    + Write what you want to display when user right clicks on pakplayer (only if have pak player license)
      
    +
    +
    + +
    {literal} + + +{/literal} + +
    +In order to change player size, resize the box given below.. +
    + + + + + +
    Main Website Player Size - click here to main website player
     
    + +
    +
    + +
    +

    Original Size of your Main Website Player

    +
    +
    + + + +
    + + +
    + + + + + + +
    Channel Player Settings Size - click here to edit channel player settings
     
    +
    + +
    +

    Original Size of your Main Website Player

    +
    +
    + + + +
    + +
    + + +{else} + + +
    + +

    Selected Player

    +
    +{assign var="player_dir" value=$Cbucket->configs.player_dir} +{assign var="player_file" value=$Cbucket->configs.player_file} + +{assign var="curplayer" value=$cbplayer->getPlayerDetails($player_file,$player_dir)} + + + + + +

    {$curplayer.name}

    {$curplayer.author}
    +{$curplayer.description}
    +Version : {$curplayer.version} Released on {$curplayer.released|date_format}
    +Website : {$curplayer.website}
    + + +
    + +
    +

    Available Players

    + +{* Listing All Avilable Players *} + +{assign var='players' value=$cbplayer->get_players()} + +
    +{foreach from=$players item=player} +{if $player_file !=$player.file && $player_dir != $player.folder} + +
    + +
    + {$player.name}
    by {$player.author}
    + Activate This Player
    +
    +
    +{/if} +{/foreach} +
    + +{/if} \ No newline at end of file diff --git a/upload/admin_area/styles/cbv2/layout/mass_email.html b/upload/admin_area/styles/cbv2/layout/mass_email.html new file mode 100644 index 00000000..9ca28541 --- /dev/null +++ b/upload/admin_area/styles/cbv2/layout/mass_email.html @@ -0,0 +1,229 @@ +

    Send email to users

    + +


    + Send mass email to your users with our new and updated email manager +

    + + +{if $send_email==""} +
    +
    + Email manager +
    + +
    +
    +
    Email to send at once +
    loop size of emails when mass emails are sent
    +
    +
    +
    + + +
    +
    From +
    Enter email address to tell user who sent it
    +
    +
    +
    + +
    +
    Subject +
    Enter your email subject
    +
    +
    +
    + + +
    +
    Message +
    Enter your email message
    +

    +{literal}You can use {username}, {userid}, {email}, {datejoined},{avcode} in your message{/literal}
    +
    +
    + + + + +
    + +
    + More options +
    + +
    +
    +
    Active status +
    + Choose whether to send to active users or non active
    +
    +
    +
    +
    + + +
    +
    Banned status +
    Send email to banned users
    +
    + +
    +
    +
    + + +
    +
    User level +
    Choose which user level to send email
    +
    + + {assign var=levels value=$userquery->get_levels()} + {foreach from=$levels item=level} + {if $level.user_level_id !='4'} + + {/if} + {/foreach} +
    +
    +
    + + + +
    +
    User category +
    User category
    +
    + {assign var=cats value=$userquery->get_categories()} + {foreach from=$cats item=cat} + + + + {/foreach} +
    +
    +
    + + + + + +
    + +
    + +
    + +
    + + +
    +
    + Mass email campaigns +
    +{if $emails} + {foreach from=$emails item=email} +
    +
    + {$email.email_subj} — + Send Email | + Delete | View
    + From + : {$email.email_from} • Method : {$email.method} + • Sent : {$email.sent} • Status : {$email.status}
    + {$email.date_added|niceTime} +
    + +
    +
    + {/foreach} +{else} +
    + No email campaign was found +
    +{/if} + +{literal} + +{/literal} + + +{else} + +
    +Sending emails — Go back to mass email page
    +{if $send_email} +{assign var=email value=$send_email} +
    +
    + {$email.email_subj} — + View
    + From + : {$email.email_from} • Method : {$email.method} + • Sent : {$email.sent} • Status : {$email.status}
    + {$email.date_added|niceTime} +
    + +
    +
    + + + +
    + {$eh->message_list.0} + {if $msgs} +
      + {foreach from=$msgs item=msg} +
    • {$msg}
    • + {/foreach} +
    + {/if} + + + {if ($email.total==$email.sent && $email.sent>0)|| $email.status=='completed'} +
    + Email has been sent to {$email.total} users +
    + {else} +
    + Pelase wait, do not close this window... + + (pause) + +
    + + + {/if} + +{/if} + +{literal} + +{/literal} + + +{/if} \ No newline at end of file diff --git a/upload/admin_area/styles/cbv2/layout/mass_uploader.html b/upload/admin_area/styles/cbv2/layout/mass_uploader.html new file mode 100644 index 00000000..dfd87f53 --- /dev/null +++ b/upload/admin_area/styles/cbv2/layout/mass_uploader.html @@ -0,0 +1,50 @@ +

    Mass Uploader

    +
    +{assign var=vid_files value=$cbmass->get_video_files()} +{if $vid_files} + +
    + {foreach from=$vid_files item=file name=mass_files} + + + {assign var='requiredFields' value=$Upload->loadRequiredFields($file)} + {assign var='optionFields' value=$Upload->loadOptionFields($file)} + {assign var='locationFields' value=$Upload->loadLocationFields($file)} + {assign var='cust_fields' value=$Upload->custom_form_fields} + + + + + + +
    #{$smarty.foreach.mass_files.iteration}{$file.file} - enter details
    + + + + {foreach from=$requiredFields item=field} + + + + + + {/foreach} + + + {/foreach} + +
    +
    +
    +{else} + + + + + + +
    NO VIDEO FOUND IN MASS UPLOAD FOLDER
    + +{/if} + diff --git a/upload/admin_area/styles/cbv2/layout/members.html b/upload/admin_area/styles/cbv2/layout/members.html new file mode 100644 index 00000000..6edaacb5 --- /dev/null +++ b/upload/admin_area/styles/cbv2/layout/members.html @@ -0,0 +1,188 @@ +Member Manager + + + + + + +
    + + + + + +
    + + + + + + + + +
    + + + + + + + + +
    + UIDUser Details 
    + + + +{if $users} + + +{foreach from=$users item=u} + + + + + + +{if $bgcolor == ""} +{assign var = bgcolor value = "#EEEEEE"} +{else} +{assign var = bgcolor value = ""} +{/if} +{/foreach} + + + + + + + + +
    {$u.userid} +
    + + {$u.username} + — + Email:{$u.email} • + Status:{$u.usr_status} • + Level:{$u.level|get_user_level} • + Last Active:{$u.last_active} + + +
    + +
     
    + + + + + +{else} +
    NO USER FOUND
    +{/if} + + + + + + +
    + + + + + + + + +
    +
    + + +{include file="$style_dir/blocks/pagination.html" } diff --git a/upload/admin_area/styles/cbv2/layout/msg.html b/upload/admin_area/styles/cbv2/layout/msg.html new file mode 100644 index 00000000..da71eb66 --- /dev/null +++ b/upload/admin_area/styles/cbv2/layout/msg.html @@ -0,0 +1,35 @@ +{assign var=msg value=$eh->message_list} +{assign var=err value=$eh->error_list} +{assign var=war value=$eh->warning_list} + +{if $err.0 neq '' || $err.1 neq ''} + +
    +
      + {foreach from=$err item=show_msg} +
    • {$show_msg}
    • + {/foreach} +
    +
    + +{/if} + +{if $msg.0 neq ''} +
    +
      + {foreach from=$msg item=show_msg} +
    • {$show_msg}
    • + {/foreach} +
    +
    +{/if} + +{if $war.0 neq ''} +
    +
      + {foreach from=$war item=show_msg} +
    • {$show_msg}
    • + {/foreach} +
    +
    +{/if} \ No newline at end of file diff --git a/upload/admin_area/styles/cbv2/layout/notification_settings.html b/upload/admin_area/styles/cbv2/layout/notification_settings.html new file mode 100644 index 00000000..700425e7 --- /dev/null +++ b/upload/admin_area/styles/cbv2/layout/notification_settings.html @@ -0,0 +1,28 @@ +

    Notification Settings

    +
    +
    +
    + +
    +
    + Notification Settings + + + + + + + + + + + + + +
    Enable Notification
      
     
    +
    +
    +
    + +
    +
    \ No newline at end of file diff --git a/upload/admin_area/styles/cbv2/layout/online_users.html b/upload/admin_area/styles/cbv2/layout/online_users.html new file mode 100644 index 00000000..73c6391a --- /dev/null +++ b/upload/admin_area/styles/cbv2/layout/online_users.html @@ -0,0 +1,33 @@ +

    {$total} users are online

    +
    + +
    + + + + + + + +
    UserBrowsingAccess timeIP
    +
    + + +{if $online_users} + +{foreach from=$online_users item=user} +{$user.agent|get_browser_details:theBrowser} + + + + + + + + + +{/foreach} +
    {if $user.username}{$user.username}{else}{$user.session_string}{/if} {$user.current_page|truncate:40:'..':false:true} + + {if $user.referer} view referer{/if}{$user.session_date|niceTime}
    KICK
    {$user.ip}
    +{/if} \ No newline at end of file diff --git a/upload/admin_area/styles/cbv2/layout/orphan_photos.html b/upload/admin_area/styles/cbv2/layout/orphan_photos.html new file mode 100644 index 00000000..eb6de1fa --- /dev/null +++ b/upload/admin_area/styles/cbv2/layout/orphan_photos.html @@ -0,0 +1,78 @@ +

    Orphan Photos

    +
    + + + + + + +
    + + + + +
    + + + + + + + + +
    + Photo IDDetails 
    +{if $photos} + +{section name=list loop=$photos} +
  • +
    +
    +
    +
    {$photos[list].photo_id}
    + +
    +
    + +
    +
    + {$photos[list].photo_title} +
    + + Featured:{$photos[list].featured} • + {if $photos[list].collection_id} + Collection:{$photos[list].collection_id|get_collection_field} + {else} + Photo is Orphan + {/if} • + Uploaded:{$photos[list].date_added|niceTime} • + User:{$photos[list].username} + +
    + +
    +
    +
  • +{/section} + + + + + + + +
    + + + +
    + +
    +{else} +
    No Photo Found
    +{/if} \ No newline at end of file diff --git a/upload/admin_area/styles/cbv2/layout/photo_manager.html b/upload/admin_area/styles/cbv2/layout/photo_manager.html new file mode 100644 index 00000000..5a6130a4 --- /dev/null +++ b/upload/admin_area/styles/cbv2/layout/photo_manager.html @@ -0,0 +1,148 @@ +

    Photo Manager

    + + +
    + + + + + + +
    + + +
    + +
    + + + + + + + + + +
    + Photo IDDetails 
    + +{if $photos} + +{section name=list loop=$photos} +
  • +
    +
    +
    + +
    {$photos[list].photo_id}
    +
    +
    + {get_photo details=$photos[list] id='photo' style='padding:2px; border:1px solid #ccc' output='html'} +
    +
    + {$photos[list].photo_title} +
    + + Featured:{$photos[list].featured} • + {if $photos[list].collection_id} + Collection:{$photos[list].collection_id|get_collection_field} + {else} + Photo is Orphan + {/if} • + Uploaded:{$photos[list].date_added|niceTime} • + User:{$photos[list].username} + +
    + +
    +
    +
  • +{/section} + + + + + + + +
    + + + + + +
    + +
    +{else} +
    No Photo Found
    +{/if} + +{include file="$style_dir/blocks/pagination.html" } \ No newline at end of file diff --git a/upload/admin_area/styles/cbv2/layout/photo_settings.html b/upload/admin_area/styles/cbv2/layout/photo_settings.html new file mode 100644 index 00000000..4cf606c7 --- /dev/null +++ b/upload/admin_area/styles/cbv2/layout/photo_settings.html @@ -0,0 +1,224 @@ +{if $mode == '' || $mode == 'photo_settings'} + +

    Photo Settings

    +
    +
    +
    +
    +
    + Photo Resizing +
    + + + + + + + + + + + + + + + + + + + +
    + Photo Ratio + Your photo thumb and medium size thumb will be resized according to these ratios + +
    + + + + + + +
    +
    + Photo Width + Height will automatically be updated according to your ratio selected + +
    Thumb Dimensions:
    + + +
    +
    +
    Medium Thumb Dimensions:
    + + +
    + Large Photo Width + + Width of Large Photo + + + +
    + Crop Image + + If Enable, your thumb and medium size will be cropped excatly to above dimensions if required. + + + + +
    +
    + Photo Behavior +
    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + Multi-upload + + Number of photos, user can upload at once. + + + +
    + Max Photo Size + + Maximum allowed photo size, in MBs. + + + +
    + + + +
    + + + +
    + + + + - User can rate his own photo +
    +
    +
    +
    + +
    +
    + +
    + +{/if} + + +{if $mode == 'watermark_settings'} +

    Watermark Settings

    +
    +
    +
    + +
    +
    + Watermark Settings + + + + + + + + + + + + + + + +
    Enable Watermark
    Maximum Width Maximum Width of watermark image. Recommended is 120.
    Watermark Placement +
    + +
    + +
    + +

    +
    + +
    + +
    + +
    + +

    +
    +
    + +
    + +
    + +
    +
    +
    + +
    + Upload New Watermark + This will over-write your existing watermark file, if exists. +
    + +
    + +
    + Current Watermark +
    + {assign var=file value=$cbphoto->watermark_file()} + {if $file} + + {else} + Watermark not found + {/if} +
    +
    + +
    +
    + +
    +
    +{/if} \ No newline at end of file diff --git a/upload/admin_area/styles/cbv2/layout/plugin_manager.html b/upload/admin_area/styles/cbv2/layout/plugin_manager.html new file mode 100644 index 00000000..843cae7f --- /dev/null +++ b/upload/admin_area/styles/cbv2/layout/plugin_manager.html @@ -0,0 +1,153 @@ +

    Installed Plugins

    +{if $installed_plugin_list} + +
    + + + + + +
    + + + + +
    + + + + + + + +
    + Plugin Details 
    + + +{assign var = bgcolor value = ""} +{foreach from=$installed_plugin_list item=plug name=item} + + + + + + {if $bgcolor == ""} + {assign var = bgcolor value = "#EEEEEE"} + {else} + {assign var = bgcolor value = ""} + {/if} + +{/foreach} +
    + + + + {$plug.name} — + + Active:{$plug.plugin_active} • + Author:{$plug.author} • + Version:{$plug.version} +
    {$plug.description}
    + {if $plug.plugin_active == 'yes'}Deactivate{else}Activate{/if} | + Uninstall +
    +
    + + + + + + +
    + + + + +
    +
    + +{else} +
    No Installed Plugin Found
    +{/if} + + + + + + +{* Listing New Plugins *} +
    +

    Available Plugins

    + +{if $new_plugin_list}
    + + + + + + +
    + +
    + + + + + + + + + +
    + Plugin Details 
    + + + + + + +{assign var = bgcolor value = ""} +{foreach from=$new_plugin_list item=plug name=item} + + + + + + {if $bgcolor == ""} + {assign var = bgcolor value = "#EEEEEE"} + {else} + {assign var = bgcolor value = ""} + {/if} + +{/foreach} +
    + + + + {$plug.name} — + + Active:{$plug.plugin_active} • + Author:{$plug.author} • + Version:{$plug.version} +
    {$plug.description}
    + Install Plugin +
    +
    + + + + + + + + + +
    + +
    +
    + + + {else} +
    No Plugin is available
    +{/if} \ No newline at end of file diff --git a/upload/admin_area/styles/cbv2/layout/recreate_thumbs.html b/upload/admin_area/styles/cbv2/layout/recreate_thumbs.html new file mode 100644 index 00000000..65d160f9 --- /dev/null +++ b/upload/admin_area/styles/cbv2/layout/recreate_thumbs.html @@ -0,0 +1,246 @@ +{if $mode == 'single'} +

    Re-create Photos

    +
    + « Back to Edit Details +
    + +
    + Settings on which photos will be re-created +
  • +
    Ratio
    +
    +
  • +
  • +
    Thumb Size
    +
    x
    +
  • + +
  • +
    Medium Size
    +
    x
    +
  • + +
  • +
    Large Size
    +
    +
  • +
  • +
    Cropping
    +
    + {assign var=cropping value=$Cbucket->configs.photo_crop} + {if $cropping == 1} + Enabled + {else} + Disabled + {/if} +
    +
  • +
  • +
    Watermarking
    +
    + {assign var=watermark value=$Cbucket->configs.watermark_photo} + {if $watermark == 1} + Enabled | Placement - + {else} + Disabled + {/if} +
    +
  • +
  • +
     
    +
    + Update settings if they are not according to your needs. +
    +
  • +
    +
    + Re-create Photo +
    + {foreach from=$files item=file} +
    +
    + {assign var=size value=$cbphoto->get_image_type($file)} + Filename: {$p.filename}{if $size} - Size: {$size}{/if} +
    +
    + +
    + {/foreach} +
    + +
    +{/if} + +{if $mode == 'mass' || $mode == ''} +

    Mass Re-creation of Photos

    +
    + This will re-create all the photos uploaded on your website, according to the settings shown below +
    Take caution while using Mass Recreation. Use MAX of 5 photos per GO.
    +
    +
    + Settings on which photos will be re-created +
  • +
    Ratio
    +
    +
  • +
  • +
    Thumb Size
    +
    x
    +
  • + +
  • +
    Medium Size
    +
    x
    +
  • + +
  • +
    Large Size
    +
    +
  • +
  • +
    Cropping
    +
    + {assign var=cropping value=$Cbucket->configs.photo_crop} + {if $cropping == 1} + Enabled + {else} + Disabled + {/if} +
    +
  • +
  • +
    Watermarking
    +
    + {assign var=watermark value=$Cbucket->configs.watermark_photo} + {if $watermark == 1} + Enabled | Placement - + {else} + Disabled + {/if} +
    +
  • +
  • +
     
    +
    + Update settings if they are not according to your needs. +
    +
  • +
    +
    +
    + Loop Size -
    +
    Number of photos to re-create in one go.
    +
    +
    + + +
    + + {if $indexing} +
    {$from} - {$to} of {$total}
    +
      + {foreach from=$index_msgs item=themsg} +
    • {$themsg}
    • + {/foreach} +
    + {if $stop_loop!='yes'} + + redirecting....do not close this window + {else} + Re-creation of photos have been completed. + {/if} + {/if} +{/if} + +{if $mode == "collection"} +

    Recreate Photos

    +
    + {if $items} + {assign var=cid value=$items[0].collection_id} + {assign var=c_name value=$items[0].collection_id|get_collection_field} + {$c_name} + + - View Collection - + Edit Collection - + Manage Items + + +
    + Settings on which photos will be re-created +
  • +
    Ratio
    +
    +
  • +
  • +
    Thumb Size
    +
    x
    +
  • + +
  • +
    Medium Size
    +
    x
    +
  • + +
  • +
    Large Size
    +
    +
  • +
  • +
    Cropping
    +
    + {assign var=cropping value=$Cbucket->configs.photo_crop} + {if $cropping == 1} + Enabled + {else} + Disabled + {/if} +
    +
  • +
  • +
    Watermarking
    +
    + {assign var=watermark value=$Cbucket->configs.watermark_photo} + {if $watermark == 1} + Enabled | Placement - + {else} + Disabled + {/if} +
    +
  • +
  • +
     
    +
    + Update settings if they are not according to your needs. +
    +
  • +
    +
    +
    + Photos + + {section name=list loop=$items} + + {/section} +
    +
    + + +
    +
    +
    +
    Select photos you want to re-created |
    + +
    +
    + + {else} + + {/if} +{/if} \ No newline at end of file diff --git a/upload/admin_area/styles/cbv2/layout/reindex_cb.html b/upload/admin_area/styles/cbv2/layout/reindex_cb.html new file mode 100644 index 00000000..4c0f3eff --- /dev/null +++ b/upload/admin_area/styles/cbv2/layout/reindex_cb.html @@ -0,0 +1,91 @@ +Re-index Clipbucket +
    +Here you can re-index your videos, users or groups statistics. From below select which thing you want to re-index. + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Loop Size

    + number of items to reindex at once
    +

    Reindex Videos

    + this will reindex total playlists, total favorites and total comments made on video
    +
    + + +

    Reindex Users

    + This will reindex total videos, total comments, total comments made, total subscribers and subscriptions, total groups owned,
    +
    + + +

    Reindex Groups +

    + this will reindex all groups , update total members, total videos , total topics
    +
    + + +

    Reindex Collections +

    + this will reindex all collections , update total objects, total comments
    +
    + + +

    Reindex Photos +

    + this will reindex all photos , update total favorites, total comments
    +
    + + +
    + +{if $indexing} +
    {$from} - {$to} of {$total}
    +
      + {foreach from=$index_msgs item=themsg} +
    • {$themsg}
    • + {/foreach} +
    +{if $stop_loop!='yes'} + +redirecting....do not close this window +{else} + Indexing has been completed. +{/if} +{/if} diff --git a/upload/admin_area/styles/cbv2/layout/repair_vid_duration.html b/upload/admin_area/styles/cbv2/layout/repair_vid_duration.html new file mode 100644 index 00000000..70d92d78 --- /dev/null +++ b/upload/admin_area/styles/cbv2/layout/repair_vid_duration.html @@ -0,0 +1,29 @@ +

    ClipBucket video duration fix

    +
    + + +Clipbucket repair video duration using file conversion logs of each file, if there is no log, duration fix is likely not possible.
    +* with log => those videos that have file conversion log
    +* with no log => those don't have any conversion log
    +
    {if $videos} +
    + + + +
    +
    + + {foreach from=$videos item=video} + {assign var=filename value=$video.file_name} + {assign var=log value=func->get_file_details($filename)} +
    +
    +
    {if $fixed_array.$filename}[FIXED] {/if}{$video.title} (duration : {$vdo.duration|setTime} | Has Log :{if $log} yes{else}no{/if} )
    +
    +
    + {/foreach} + {else} + No videos found with duration less than or equal to 1 + {/if} +
    diff --git a/upload/admin_area/styles/cbv2/layout/reports.html b/upload/admin_area/styles/cbv2/layout/reports.html new file mode 100644 index 00000000..9b5b30f9 --- /dev/null +++ b/upload/admin_area/styles/cbv2/layout/reports.html @@ -0,0 +1,218 @@ +
    +
    + +
    + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Videos Reports

    All TimeTotal {get_videos count_only=yes} – Active {get_videos count_only=yes active="yes"} – Processing {get_videos count_only=yes status='Processing'}
    Todays VideosTotal {get_videos count_only=yes date_span=today} – Active {get_videos count_only=yes active="yes" date_span=today} – Processing {get_videos count_only=yes status='Processing' date_span=today}
    This WeekTotal {get_videos count_only=yes date_span=this_week} – Active {get_videos count_only=yes active="yes" date_span=this_week} – Processing {get_videos count_only=yes status='Processing' date_span=this_week}
    Last WeekTotal {get_videos count_only=yes date_span=last_week} – Active {get_videos count_only=yes active="yes" date_span=last_week} – Processing {get_videos count_only=yes status='Processing' date_span=last_week}
    This MonthTotal {get_videos count_only=yes date_span=this_month} – Active {get_videos count_only=yes active="yes" date_span=this_month} – Processing {get_videos count_only=yes status='Processing' date_span=this_month}
    Last MonthTotal {get_videos count_only=yes date_span=last_month} – Active {get_videos count_only=yes active="yes" date_span=last_month} – Processing {get_videos count_only=yes status='Processing' date_span=last_month}
      
      
    +
    + + + +
    + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    User Reports

    All TimeTotal {get_users count_only=yes} – Active {get_users count_only=yes status='Ok'} – Inactive {get_users count_only=yes status='ToActivate'}
    Todays UsersTotal {get_users count_only=yes date_span='today'} – Active {get_users count_only=yes status='Ok' date_span='today'} – Inactive {get_users count_only=yes status='ToActivate' date_span='today'}
    This WeekTotal {get_users count_only=yes date_span='this_week'} – Active {get_users count_only=yes status='Ok' date_span='this_week'} – Inactive {get_users count_only=yes status='ToActivate' date_span='this_week'}
    Last WeekTotal {get_users count_only=yes date_span='last_week'} – Active {get_users count_only=yes status='Ok' date_span='last_week'} – Processing {get_users count_only=yes status='ToActivate' date_span='last_week'}
    This MonthTotal {get_users count_only=yes date_span='this_month'} – Active {get_users count_only=yes status='Ok' date_span='this_month'} – Inactive {get_users count_only=yes status='ToActivate' date_span='this_month'}
    Last MonthTotal {get_users count_only=yes date_span='last_month'} – Active {get_users count_only=yes status='Ok' date_span='last_month'} – Inactive {get_users count_only=yes status='ToActivate' date_span='last_month'}
    +
    + + + + + + +
    + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Group Reports

    All TimeTotal {get_groups count_only=yes} – + Active {get_groups count_only=yes active='yes'} – + Inactive {get_groups count_only=yes active='no'} +
    TodayTotal {get_groups count_only=yes date_span=today} – + Active {get_groups count_only=yes active='yes' date_span=today} – + Inactive {get_groups count_only=yes active='no' date_span=today}
    This WeekTotal {get_groups count_only=yes date_span=this_week} – + Active {get_groups count_only=yes active='yes' date_span=this_week} – + Inactive {get_groups count_only=yes active='no' date_span=this_week}
    Last WeekTotal {get_groups count_only=yes date_span=last_week} – + Active {get_groups count_only=yes active='yes' date_span=last_week} – + Inactive {get_groups count_only=yes active='no' date_span=last_week}
    This MonthTotal {get_groups count_only=yes date_span=this_month} – + Active {get_groups count_only=yes active='yes' date_span=this_month} – + Inactive {get_groups count_only=yes active='no' date_span=this_month}
    Last MonthTotal {get_groups count_only=yes date_span=last_month} – + Active {get_groups count_only=yes active='yes' date_span=last_month} – + Inactive {get_groups count_only=yes active='no' date_span=last_month}
    +
    + + +
    + + + + + + + + + + + + + + + +

    Comments

    Flags

    Playlists

    Favorites

      +
    • {$myquery->get_comments('wildcard',v,TRUE)} video comments
    • +
    • {$myquery->get_comments('wildcard',t,TRUE)} Group Discussions
    • +
    • {$myquery->get_comments('wildcard',c,TRUE)} Profile Comments
    • +
      +
    • {$cbvid->action->count_flagged_objects()} videos are reported
    • +
    • {$userquery->action->count_flagged_objects()} groups are reported
    • +
    • {$cbgroup->action->count_flagged_objects()} profiles are reported
    • +
    +

     

      +
    • {$cbvid->action->count_total_playlist()} Video Playlists are created
    • +
    • {$cbvid->action->count_total_playlist(true)} Video Items are in playlist
    • +
      +
    • {$cbvid->action->total_favorites()} favorite videos
    • +
    + + + + +
    + + + + + + + + + +

    Files and Sizes

      +
    • Video Files : {$vid_dir.count|number_format} – Folder Size : {$vid_dir.size|formatfilesize}
    • +
    • Thumb Files : {$thumb_dir.count|number_format} – Folder Size : {$thumb_dir.size|formatfilesize}
    • +
    • Original Video Files : {$orig_dir.count|number_format} – Folder Size : {$orig_dir.size|formatfilesize}
    • +
    • User Thumb Files : {$user_thumbs.count|number_format} – Folder Size : {$user_thumbs.size|formatfilesize}
    • +
    • User Background Files {$user_bg.count|number_format} – Folder Size : {$user_bg.size|formatfilesize}
    • +
    • Groups Thumb Files : {$grp_thumbs.count|number_format} – Folder Size : {$grp_thumbs.size|formatfilesize}
    • +
    • Category Thumb Files {$cat_thumbs.count|number_format} – Folder Size : {$cat_thumbs.size|formatfilesize}
    • +
    • Database Size : {$db_size}
    • +
    \ No newline at end of file diff --git a/upload/admin_area/styles/cbv2/layout/template_editor.html b/upload/admin_area/styles/cbv2/layout/template_editor.html new file mode 100644 index 00000000..27645707 --- /dev/null +++ b/upload/admin_area/styles/cbv2/layout/template_editor.html @@ -0,0 +1,52 @@ +

    Edit template

    +
    + + +
    + + {assign var='templates' value=$cbtpl->get_templates()} + {if $templates} +
    + +
    + + {/if} +
    + + + + + + + +
    +

    Layout Files

    +
      + {foreach from=$tpl_files item=tplfile key=folder} + {if !is_array($tplfile)} +
    • {$tplfile}
    • + {/if} + {/foreach} +
    + +

    CSS Files

    +
      + {foreach from=$css_files item=cssfile} + {if !is_array($cssfile)} +
    • {$cssfile}
    • + {/if} + {/foreach} +
    +
    +
    +

    {if $writeable=='no'}This file is not writeable, please set {$smarty.get.file} permissions to 0777 - More Details
    +{else} +
    +{/if} +
    +
    \ No newline at end of file diff --git a/upload/admin_area/styles/cbv2/layout/templates.html b/upload/admin_area/styles/cbv2/layout/templates.html new file mode 100644 index 00000000..243024bc --- /dev/null +++ b/upload/admin_area/styles/cbv2/layout/templates.html @@ -0,0 +1,41 @@ +

    Selected Template

    +
    +{assign var="selected" value=$Cbucket->configs.template_dir} +{assign var="curtpl" value=$cbtpl->get_template_details($selected)} + + + + + +

    {$curtpl.name}

    {$curtpl.author}
    +{$curtpl.description}
    +Version : {$curtpl.version}, Released on {$curtpl.released|date_format}
    +Website : {$curtpl.website.title}
    + + +
    + +
    + +{* Listing All Avilable Templates *} +{assign var='templates' value=$cbtpl->get_templates()} +{if $templates} +

    Available Templates

    + +
    + {foreach from=$templates item=template} + {if $selected != $template.dir} +
    + +
    + {$template.name}
    by {$template.author}
    + Activate This Template
    + Preview
    + Preview & Activate
    +
    + {/if} + {/foreach} +
    +{else} +
    No New Template Found
    +{/if} diff --git a/upload/admin_area/styles/cbv2/layout/under_development.html b/upload/admin_area/styles/cbv2/layout/under_development.html new file mode 100644 index 00000000..f37b6647 --- /dev/null +++ b/upload/admin_area/styles/cbv2/layout/under_development.html @@ -0,0 +1 @@ +

    Page Under Development

    diff --git a/upload/admin_area/styles/cbv2/layout/upload_thumbs.html b/upload/admin_area/styles/cbv2/layout/upload_thumbs.html new file mode 100644 index 00000000..33f0d2c1 --- /dev/null +++ b/upload/admin_area/styles/cbv2/layout/upload_thumbs.html @@ -0,0 +1,40 @@ +{if $data.title neq ""} +

    Manage Video Thumbs

    +
    + « Back to Edit Details | Regenerate Thumbs
    +
    + {assign var=vidthumbs value=func->get_thumb($data,1,TRUE,FLASE,TRUE,FALSE)} + + {foreach from=$vidthumbs item=vid_thumb} + +
    +
    + {if $vid_thumb|getname!='processing'} + Delete + {/if} +
    + {/foreach} +

    +
    +
    + +
    +
    +
    +
    +

    Upload New Thumb

    +
    + +
    + + +
    +
    +
    +
    + +
    +
    +
    + {/if} \ No newline at end of file diff --git a/upload/admin_area/styles/cbv2/layout/user_category.html b/upload/admin_area/styles/cbv2/layout/user_category.html new file mode 100644 index 00000000..67e6aa1c --- /dev/null +++ b/upload/admin_area/styles/cbv2/layout/user_category.html @@ -0,0 +1,160 @@ +User Categories + + + + + + + + +
    Manage User Categories  
    + + +{if $edit_category != "show"} +
    + + + + + + + + + + + + + + + + + + + + + + + + + + +
     * are required fields
    Category Name*
    Category Description*
    Make Default Category

    + + +
    +

    Category Thumb +
     
    +
    +{/if} +{if $edit_category == "show"} +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + +
     * are required fields
    Category Name*
    Category Description*
    Make Default Category

    + + +
    +

    Category Thumb
    +
    +{/if} + + +
    +Category List +
    + +{if $total != 0} +
    + + + + + + + + + +{assign var = bgcolor value = ""} +{section name=list loop=$category} + + + + + + + + + + + {if $bgcolor == ""} + {assign var = bgcolor value = "#EEEEEE"} + {else} + {assign var = bgcolor value = ""} + {/if} + +{/section} + +
    Category NameOrderDescriptionDefaultAction 
    {$category[list].category_name} - View Thumb + {if $category[list].category_desc}{$category[list].category_desc}{else}N/A{/if}{$category[list].isdefault} +
  • Edit
  • +
  • Delete
  • + {if $category[list].isdefault!="yes"}
  • Make Default
  • {/if} +
     
    + + +
    +
    +{else} +No Category Has Been Created Yet +{/if} +
    +
    + diff --git a/upload/admin_area/styles/cbv2/layout/user_levels.html b/upload/admin_area/styles/cbv2/layout/user_levels.html new file mode 100644 index 00000000..281577a0 --- /dev/null +++ b/upload/admin_area/styles/cbv2/layout/user_levels.html @@ -0,0 +1,231 @@ + +

    User Levels

    +{if $view=='view'} + +Add New Level + + + + + + + + + + {assign var=levels value=$userquery->get_levels()} + {section name=l loop=$levels} + + + + + + + + {sectionelse} + + + + {/section} +
    IDNameActiveUsersActions
    {$levels[l].user_level_id}{$levels[l].user_level_name}{$levels[l].user_level_active}{$userquery->get_level_users($levels[l].user_level_id,true)}Edit{if $levels[l].user_level_is_default !=yes} | Remove{/if}
    No Levels Were Found
    + +{elseif $view=='edit'} + +
    + + + + + + +
     Edit Level Permissions 
    + + + + + +
    Level Name + +
    + + +{assign var='types' value=$userquery->get_level_types()} +{section name=t loop=$types} + + + + + + +
     {$types[t].user_permission_type_name} 
    +{assign var=perms value=$userquery->get_permissions($types[t].user_permission_type_id)} + +{assign var = bgcolor value = ""} +{foreach from=$perms item=perm} +{if $perm.permission_id !=""} + + + + + + +{else} + +{/if} + + +{if $bgcolor == ""} +{assign var = bgcolor value = "#EEEEEE"} +{else} +{assign var = bgcolor value = ""} +{/if} + +{foreachelse} + +{/foreach} +
    {$perm.permission_name}
    +{$perm.permission_desc}
    +{assign var="perm_code" value=$perm.permission_code} + + + + +
    No Permission Found
    No Permission Found
    + + +{/section} + + + +{if $Cbucket->plugins_perms} + + + + + + + +
     Plugins Permissions 
    + + +{assign var=perms value=$Cbucket->plugins_perms} + + +{assign var = bgcolor value = ""} +{foreach from=$perms item=perm} + + + + + + + + + + +{if $bgcolor == ""} +{assign var = bgcolor value = "#EEEEEE"} +{else} +{assign var = bgcolor value = ""} +{/if} + +{foreachelse} + +{/foreach} +
    {$perm.plugin_name}
    +{$perm.plugin_desc}
    + + + + + +
    No Permission Found
    + + + + + + +{/if} + + + + + + +
    +
    +
    +{elseif $view=='add'} +
    + + + + + + +
     User Level Details 
    + + + + + + +
    Level Name + +
    +{assign var='types' value=$userquery->get_level_types()} +{section name=t loop=$types} + + + + + + +
     {$types[t].user_permission_type_name} 
    + {assign var=perms value=$userquery->get_permissions($types[t].user_permission_type_id)} + + {assign var = bgcolor value = ""} + {foreach from=$perms item=perm} + {if $perm.permission_id !=""} + + + + + + + {else} + + {/if} + + {if $bgcolor == ""} + {assign var = bgcolor value = "#EEEEEE"} + {else} + {assign var = bgcolor value = ""} + {/if} + + {foreachelse} + + {/foreach} +
    {$perm.permission_name}
    + {$perm.permission_desc}
    + + +
    No Permission Found
    No Permission Found
    + +{/section} + +
    +{/if} + + + diff --git a/upload/admin_area/styles/cbv2/layout/video_manager.html b/upload/admin_area/styles/cbv2/layout/video_manager.html new file mode 100644 index 00000000..fcf31bb6 --- /dev/null +++ b/upload/admin_area/styles/cbv2/layout/video_manager.html @@ -0,0 +1,179 @@ + +

    Video Manager

    + + + + + + +
    + + + + + + +
    + + + + + + +
    + + + + + + + + + + +
    + VID Details 
    + + + + +{if $videos} + +{assign var = bgcolor value = ""} +{section name=list loop=$videos} + + + + + + + + + + {if $bgcolor == ""} + {assign var = bgcolor value = "#EEEEEE"} + {else} + {assign var = bgcolor value = ""} + {/if} + +{/section} +
    {$videos[list].videoid} +
    + {$videos[list].title|truncate:80} + ({if $videos[list].duration>1}{$videos[list].duration|SetTime}{else}00:00{/if})
    + + Featured:{$videos[list].featured} • + Active:{$videos[list].active} • + Status:{$videos[list].status} • + Uploaded:{$videos[list].date_added|niceTime} • + User:{$videos[list].username} + + +
    + +
     
    +{else} +
    No Video Found
    +{/if} + + + + + + +
    + + + + + + +
    + +
    + + +{include file="$style_dir/blocks/pagination.html" } \ No newline at end of file diff --git a/upload/admin_area/styles/cbv2/layout/view_conversion_log.html b/upload/admin_area/styles/cbv2/layout/view_conversion_log.html new file mode 100644 index 00000000..e2c8d034 --- /dev/null +++ b/upload/admin_area/styles/cbv2/layout/view_conversion_log.html @@ -0,0 +1,77 @@ +{if $data.File} + +

    Converion Log for file {$data.file_name}.{$data.file_ext}

    + +

    + Reading Conversion log for file {$data.file_name} +

    + + + + +
    Conversion details
    + +
    +{foreach from=$data item=value key=field} + {if $field !='conversion_log' } +
    +
    {$field|replace:'_':' '}
    +
    {$value}
    +
    +
    + {/if} +{/foreach} +
    + +
    Complete conversion log
    + +
    +{literal} + Expand + + + + | + Copy + + + + + +{/literal} +
    + + +
    +{$data.conversion_log|nl2br}
    + + +{else} Log file was not found +{/if} \ No newline at end of file diff --git a/upload/admin_area/styles/cbv2/layout/view_user.html b/upload/admin_area/styles/cbv2/layout/view_user.html new file mode 100644 index 00000000..5f91c563 --- /dev/null +++ b/upload/admin_area/styles/cbv2/layout/view_user.html @@ -0,0 +1,343 @@ +Edit User + +{assign var='signup_fields' value=$userquery->load_signup_fields($u)} +{assign var='channel_profile_fields' value=$userquery->load_user_fields($p)} + +
    + + + + + + + + + + + + + + + + + + +
    + + + + + +
     User Info 
    + + + + + +
     ACtions 
    + +
    + ClipBucket User Info + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {assign var=cust_signup value=$userquery->load_custom_signup_fields($u,true)} + {if $cust_signup} + {foreach from=$cust_signup item=field} + + + + + {/foreach} + {/if} + +
    User Id + + +
    User name + + + +
    Email
    Change Password
    Confirm Password
    User Level +
    Country +
    Gender + + + + +

    Category{ANCHOR place=$signup_fields.cat.anchor_before}{$formObj->createField($signup_fields.cat)}{ANCHOR place=$signup_fields.cat.anchor_after}
    {$field.title}{$field.hint_1}{ANCHOR place=$field.anchor_before}{$formObj->createField($field)} +
    + {$field.hint_2}
    +
    + +{foreach from=$channel_profile_fields item=field_group} +
    + {$field_group.group_name} + + {foreach from=$field_group.fields item=field} + + + + + {/foreach} + +
    {$field.title}{$field.hint_1}{ANCHOR place=$field.anchor_before}{$formObj->createField($field)} +
    + {$field.hint_2}
    +
    +{/foreach} + + + + + + + + +
    + User Links + + + + +
    +
    + + +
    + User Activity + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Date of birth + YYYY-MM-DD
    Joined - IP + - {$u.signup_ip}
    Last Login - Login IP{$u.last_logged} - {$u.ip}
    Last Active - Online {$u.last_active} - {$u.last_active|is_online}
    Profile Views +
    Videos Watched
    Videos Uploaded
    Comments Made
    Profile Comments
    Profile Rating + 0-10
    Profile Rated by
    Subscribers
    +
    + Recent Activity Log + + + + + + + + + +
    IDUID
    Username
    Date
    Detail
     
    + + +{assign var="logs" value=$userquery->get_user_action_log($u.userid,10)} +{section loop=$logs name=log} + + + + + + + + +{sectionelse} + +{/section} +
    {$logs[log].action_id}{$logs[log].action_userid}
    {$logs[log].action_username}
    {$logs[log].date_added}
    Type : {$logs[log].action_type} –{if $logs[log].action_details!=''}{$logs[log].action_details} –{/if} Success : {$logs[log].action_success} – {$logs[log].action_ip}
    + +
    + User Avatar and Background + + + + + + + + + + + +

    + +
    User Avatar/Profile Pic
    + Please select image file
    + + + OR
    + Please Enter Image URL
    + + + + +
    + + +
     
    {if $userquery->getUserBg($u)}{else}No Bg{/if}User Background Image +
    + Please Select Image File +
    + +OR
    +Please Enter Image URL
    + + +OR
    +Please Enter Background Color
    + + + +
    +Background Repeat Type (if using image as a background)
    + + +
    + +{if $userquery->getUserBg($u)}{/if}
    +
    + + +
      
    +  
    +
    + + + + + + + + +
     
    +
    + {assign var='object_type' value='channel'} + + + +
    +
    + +
    diff --git a/upload/admin_area/styles/cbv2/layout/view_video.html b/upload/admin_area/styles/cbv2/layout/view_video.html new file mode 100644 index 00000000..d3d6f48f --- /dev/null +++ b/upload/admin_area/styles/cbv2/layout/view_video.html @@ -0,0 +1,203 @@ +{if $show=='oyeaaa'} +{assign var='requiredFields' value=$Upload->loadRequiredFields($data)} +{assign var='optionFields' value=$Upload->loadOptionFields($data)} +{assign var='locationFields' value=$Upload->loadLocationFields($data)} + +{assign var='custom_fields' value=$Upload->load_custom_upload_fields($data,TRUE)} +{assign var='custom_form_fields' value=$Upload->load_custom_form_fields($data,TRUE)} + + + + + + + +
    Viewing {$data.title}  
    + + +
    + + +
    + + + + + + + + + + + + + + + + + + +
    + + + + + + + {foreach from=$requiredFields item=field} + + + + + {/foreach} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {foreach from=$optionFields item=field} + + + + + {/foreach} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {foreach from=$custom_fields item=field} + + + + + + {foreachelse} + + + + + {/foreach} + + + + + + + + {foreach from=$custom_form_fields item=field} + + + + + + {foreachelse} + + + + + {/foreach} + + + + + + + + + + + + + + + + + + + +
     
    Information
    {$field.title}{ANCHOR place=$field.anchor_before}{input_value input=$field}
      
    Important Details and Files information
    Video Id{$data.videoid}
    Video Key{$data.videokey}
    File Name{$data.file_name}
    Video Files{get_all_video_files vdetails=$data count_only=true}
    Thumb Files {get_thumb vdetails=$data count_only=true}
     {assign var=vidthumbs value=func->get_thumb($data,1,TRUE)} + + {foreach from=$vidthumbs item=vid_thumb} +
    +
    + {if $data.default_thumb==$vid_thumb|get_thumb_num}Default{/if} +
    + {/foreach} + +
    View File Details and Conversion Log
      
    Sharing Options
    {$field.title}{ANCHOR place=$field.anchor_before}{input_value input=$field}
      
    Stats
    Views{$data.views}
    Rating{$data.rating} + of 10
    RatedBy{$data.rated_by}
    Duration{$data.duration|SetTime}
      
    Custom Upload Options
    {$field.title}{$field.value|form_val}
    No Custom Fields
      
    Custom Form Fields
    {$field.title}{$field.value|form_val}
    No Custom Fields
      
    User Information
    User id{$udata.userid}
    User name{$udata.username}
    Videos Uploaded{$userquery->get_user_vids($data.userid,'',true)}
    + This content requires JavaScript and Macromedia Flash Player 7 or higher. Get Flash

    +
    +
      
    Video Comments
    {assign var=id value=$data.videoid}{include file="$style_dir/blocks/comments.html" type=v id=$data.videoid link="video=$id"}
    +
    +
    +{else} +

    Page moved

    +{/if} \ No newline at end of file diff --git a/upload/admin_area/styles/cbv2/theme/cbtab.css b/upload/admin_area/styles/cbv2/theme/cbtab.css new file mode 100644 index 00000000..4cefecaf --- /dev/null +++ b/upload/admin_area/styles/cbv2/theme/cbtab.css @@ -0,0 +1,36 @@ +@charset "utf-8"; +/* CSS Document */ + + +.cbtab{margin:0px; padding:0px} + +.cbtab li +{ + list-style-type:none; + padding:0px 10px; + background-color:#009; + margin:2px; background-image:url(../images/bgs/round_bg.png); + background-position:0px -52px; height:26px; line-height:26px; + font-size:12px; color:#FFF; + font-weight:bold; + -moz-border-radius-topleft:5px; + -webkit-border-top-left-radius:5px; + -moz-border-radius-topright:5px; + -webkit-border-top-right-radius:5px; + border:2px #d2d2d2 solid; + border-bottom:none; + cursor:pointer; + float:left; + margin-bottom:0px; +} + +.cbtab .selected{background:#333} + +.main_page_div{min-height:200px; border:1px solid #d2d2d2; width:95%; margin-left:2px; padding:5px; +-moz-border-radius-bottomleft:5px; +-webkit-border-bottom-left-radius:5px; +-moz-border-radius-bottomright:5px; +-webkit-border-bottom-right-radius:5px; +-moz-border-radius-topright:5px; +-webkit-border-top-right-radius:5px; +} \ No newline at end of file diff --git a/upload/admin_area/styles/cbv2/theme/main.css b/upload/admin_area/styles/cbv2/theme/main.css new file mode 100644 index 00000000..0a97f2fc --- /dev/null +++ b/upload/admin_area/styles/cbv2/theme/main.css @@ -0,0 +1,366 @@ +@charset "utf-8"; +/* CSS Document */ + +@import url("pagination.css"); +@import url("cbtab.css"); + +body,html {background-color:#fff; margin:0px; padding:0px; font-family:Verdana; color:#333; font-size:11px;} + +/* CLEARS */ +.clearfix { } +.clearfix:after{ content: "."; display:block; height:0; font-size:0; clear:both; visibility:hidden; } + +/* GENERAL CSS */ +a{ color:#0099cc; text-decoration:none; outline:none; } +a:hover,a:active { /*color:#464646; */ color:#d54e21; outline:none; } +a[rel=sponsors] { padding:5px; background:#0099cc; border:1px solid transparent; } +a[rel=sponsors]:hover { background:#555; border:1px solid #232323; } + + +.footer_grey_bar,.header_grey_bar{background-image:url(../images/gradients.png); background-repeat:repeat-x; height:40px; line-height:40px; min-width:1000px} +.header_grey_bar{ color:#fff;font-size: 20px; font-family:"Century Gothic",Verdana,sans-serif;} +.cbicon{background-image:url(../images/icons.png); width:50px; height:28px; background-repeat:no-repeat; margin:6px 10px 0px 10px; float:left} +.header_grey_bar .welcome{font-size:15px; padding-right:10px} +.header_grey_bar .logout_button{background-image:url(../images/icons.png); background-position:-50px 0px; height:25px; width:25px; margin:6px 5px 0px 5px; vertical-align:sub; } + +.sarch_button{width:109px; height:25px; cursor:pointer; background:transparent url(../images/icons.png) 0px -59px no-repeat;} + +.header_menu{ background-image:url(../images/gradients.png); background-repeat:repeat-x; background-position:0px -41px; height:33px; border:1px solid #000; border-left:none; border-right:none;min-width:1000px; position:relative} +.header_menu_after{background:url(../images/headerafter.png) repeat-x; min-height:13px; padding-top:5px} + +.header_menu a{text-decoration:none; color:#fff} +.header_menu ul{list-style:none; margin:0px; padding:0px;} +.header_menu ul li{list-style:none; float:left; width:auto; text-align:center; line-height:31px; color:#fff; border-right:#1577ba solid 1px;border-left:#43a1e1 solid 1px; margin-top:1px; padding:0px 5px} +.header_menu ul li:hover{background-color:#148ada} +.header_menu ul li:first-child{border-left:none} + +.footer_grey_bar{ color:#fff; font:14px/40px Century Gothic; padding-right:10px} +.footer_grey_bar a{color:#fff;; text-decoration:none} +.toggle_menu{height:30px; line-height:30px; font-size:15px; font-weight:bold; margin:3px; display:inline-block; cursor:pointer} +.toggle_menu_icon{background-image:url(../images/icons.png); background-position:0px -29px; height:30px; width:30px; float:left; margin-right:5px} + + +.admin_heading{ font-size:11px; font-weight:bold; color:#fff;background-image:url(../images/bgs/round_bg.png); background-position:right -52px; height:26px;line-height:26px; text-indent:10px;border-radius:5px 5px 0px 0px ;-webkit-border-radius:5px 5px 0px 0px ;-moz-border-radius: 5px 5px 0px 0px;} +.admin_box{border:1px solid #146194; border-top:0px; padding:5px; background-color:#fafafa; color:#666666; border-radius:0px 0px 5px 5px;-webkit-border-radius:0px 0px 5px 5px;-moz-border-radius:0px 0px 5px 5px; margin-bottom:15px} + +.news .news_title{font-size:11px; color:#666} +.news .news_title a{font-size:13px; text-decoration:none; font-weight:bold} +.news .news_title .title{float:left; display:inline} +.news .news_title .date{float:right; display:inline; color:#a2a2a2; font-size:10px} + +.stats .stat{border:0px; border-bottom:1px solid #ccc; padding:2px; background-color:#fafafa} +.stats .stat:last-child{border:none; background-color:#f3f3f3} +.stats .stat:first-child{background-color:#f3f3f3} +.stats .stat span:nth-child(1){float:left;} +.stats .stat span:nth-child(2){float:right;} + +.simple_button{background:url(../images/gradients.png) 0px -86px repeat-x; height:17px; line-height:17px; text-align:center; display:inline-block; padding:0px 5px; border:1px solid #ccc; } +.simple_button,.simple_button a{color:#555; text-decoration:none; font-size:11px; font-weight:bold} + + + +/** + * Page Table Tops + */ +.head_title,.left_head,.head,.right_head,.head_sep_left,.head_sep_right,.left_head a,.head a,.right_head a,.head_sep_left a,.head_sep_right a{line-height:26px; color:#FFF; font-size:12px; font-family:Arial, Helvetica, sans-serif; font-weight:bold} +.left_head{background-image:url(../images/bgs/round_bg.png); background-position:0px 0px; height:26px} +.head_title,.head{background-image:url(../images/bgs/round_bg.png); background-position:right -52px; height:26px} +.right_head{background-image:url(../images/bgs/round_bg.png); background-position:right -26px; height:26px} +.head_sep_left{background-image:url(../images/bgs/round_bg.png); background-position:left -130px; height:26px; text-indent:10px;} +.head_sep_right{background-image:url(../images/bgs/round_bg.png); background-position:right -156px; height:26px} + + +.admin_td,.video_opt_td{color:#333; font-size:12px;} +.video_opt_td{height:55px; border-bottom:1px solid #ccc; padding-top:5px} +.video_opt_td a{font-size:13px; font-weight:bold; color:#0c4469; text-decoration:none} +.vid_opts{ padding:2px; display:inline;-moz-border-radius: 5px; -webkit-border-radius: 5px;} +.vid_opts a { font-weight:bold; font-size:11px; font-family:Tahoma,Verdana,sans-serif; } +.vid_opts a:hover { border-bottom:1px dashed #0099cc; } +.vdo_sets,.vdo_sets a{font-size:11px; text-transform:uppercase; font-family: Consolas, Monaco, Courier, monospace;} + + +h2,.page_title{font-size:18px; margin:5px 0px 5px 0px; display:inline; font-weight:normal} +h2,.page_title a{font-size:18px; } +h4{margin:2px 0px} + +/** + * Forms + */ +.button{background-image:url(../images/button_bg.png); height:30px; color:#FFF; font-weight:bold; border:1px; line-height:30px; -moz-border-radius: 3px; +-webkit-border-radius: 3px;border-radius: 3px; border:1px solid #003366; cursor:pointer;outline:none} + +.button:focus{background-position:-0 -30px; outline:none} + +.fieldset{-moz-border-radius: 5px; +-webkit-border-radius: 5px; border:2px solid #EAEEFF; width:98%; margin:0px; padding:0px; margin:auto; margin-top:15px} + +.fieldset select,.fieldset input[type="text"],.fieldset input[type="textfield"],.fieldset textarea{border:1px solid #CCC; font-size:11px; margin:2px; padding:2px} + +.fieldset .block{margin:5px} +.fieldset legend{margin:2px; font-size:13px; font-weight:bold; color:#147dc3} + +.cbform input[type="text"],.cbform input[type="textfield"],.cbform select,.cbform textarea{width:300px; padding:3px; font-size:12px} + +/** + * Forms End +*/ +.block_head tr td{padding:0px 2px 0px 2px} +.block tr td{padding:2px; border-bottom:1px dotted #eee; } +.block tr:hover{background-color:#f8f8f8} + +.head_title{text-indent:5px; padding:0px} + +.hint{font-size:11px;} + +#login_box{ + height:250px; + width:400px; + background-image:url(../images/login.png); + background-repeat:no-repeat; + margin:auto; + background-position:center; + padding-top: 150px; +} + +#login_box .textfield{ + height:30px; + width: 280px; + margin-bottom: 10px; + -moz-border-radius: 5px; +-webkit-border-radius: 5px; border:1px solid #ccc; +line-height:30px; +padding-left:5px; font-size:16px; font-weight:bold; font-family:Arial, Helvetica, sans-serif; padding-top:5px; color:#6E6E6E +} +#login_box label{ + font-size:18px; + color: #494949; +} + + +.row_white{border-bottom:1px dotted #646464; width:100%; margin:auto} +.row_white:hover{background-color:#F3F3F3} + + + +.search_box{margin:5px; padding:5px; border:1px solid #e3e3e3; border-radius:5px; -moz-border-radius:5px; -webkit-border-radius:5px; background:#f9f9f9} + +.video_search .input,#dp_opts input[type='text']{border:1px solid #666; width:200px} + + +.item_listing td{border-bottom:1px solid #ccc} + +.item_listing li{list-style:none} +.item_listing a{color:#0c4469; font-family:"Trebuchet MS", Arial, Helvetica, sans-serif; font-style:italic} + +.templates_container +{ + font-size:11px; color:#333; +} + +.templates_container .tpl_title{width:80%; margin:auto; font-size:12px;} +.templates_container .template_box{width:250px; height:225px; float:left; margin:10px; padding:10px} +.templates_container .template_box:hover{background-color:#F3E8FF; } + + +.preview_thumb{width:175px; height:100px} +.preview_thumb_template{width:170px; height:130px} + +.mid_user_thumb{max-width:30px; min-height:30px} + +.login_footer{ color:#333;font-size: 15px;font-family:"Century Gothic", Verdana, sans-serif; font-weight:bold} + +.settings_inner_title{font-size:14px; font-weight:bold} + + +/* ADMIN WIDGET */ +.widgets-wrap +{ + min-height:300px; + background:#fff; +} + +.widgets-wrap .dragbox{ + margin:0px 2px 20px; + background:#f8f8f8; + position:relative; + border:1px solid #146194; + -moz-border-radius:5px; + -webkit-border-radius:5px; +} + + +.widgets-wrap .dragbox h2{ + margin:0; + font-size:12px; + padding:5px; + background-image:url(../images/bgs/round_bg.png); background-position:right -53px; height:15px; + color:#fff; + border-bottom:none; + font-family:Verdana; + cursor:move; + display:block; font-weight:bold; +} +.dragbox-content{ + min-height:100px; margin:5px 0px; + font-family:'Lucida Grande', Verdana; font-size:0.8em; line-height:1.5em; +} +.widgets-wrap .placeholder{ + background: #f0f0f0; + border:1px dashed #ddd; +} +.dragbox h2.collapse{ + background:#1488d5 url('../images/collapse.png') no-repeat top right; +} +.dragbox h2 .configure{ + font-size:11px; font-weight:normal; + margin-right:30px; float:right; +} +.dragbox h2 .configure a{color:#fff; text-decoration:none} + +.item img{ cursor:pointer;} +.item{background-image:url(../images/widget_item_border.gif); background-position:bottom; background-repeat:repeat-x; font-size:11px; font-family:Verdana; padding:10px 5px} +.item:first-child{padding-top:0px} +.item:nth-child(2n){ background:#fff url(../images/widget_item_border.gif) repeat-x bottom } +.subitem{background:#fff;} +.index_table:first-child{padding:0px 20px 0px 0px} +.index_table:last-child{padding:0px} + +.delete_note{float:right} + + +.stats_subitem{width:20%;float:left;} +.stats_subitem_d{float:right; width:80%; text-align:right} + + +.msg{ margin:10px;border-radius:5px;-moz-border-radius:5px;-webkit-border-radius:5px; } +.msg ul{padding:0px} +.msg ul li{list-style:none; padding-left:10px; margin-bottom:5px} +.error{background-color:#fff7f7; border:1px solid #ed0000;} +.blue{background-color:#fafdff; border:1px solid #005d9c;} +.msg img{ margin-right:10px} + + + + + +#contentwrapper{ +float: left; +width: 100%; +z-index:500; +position:relative; +} + + +.contentcolumn{margin-left: 248px;} +.contentcolumn0{margin-left: 25px;} + +.innertube{ /*Margins for inner DIV inside each column (to provide padding)*/ +margin-top: 0; +} + + +.file_content{background-color:#FCFCFC; border:1px solid #CCC; padding:5px; margin:5px } +.file_content textarea{font-size:12px; color:#333; height:500px; overflow:auto;background-color:#FCFCFC; width:100%; border:none; padding:0px; margin:0px} + +.sel_file{ background-color:#FBFBFB} +.sel_file a{color:#d54e21; font-weight:bold} + +.dp_opts{right:0px; top:5px; background-color:#006699; position:absolute; color:#FFF; padding:2px; display:inline; margin:3px; border-radius:3px;-moz-border-radius:3px;-webkit-border-radius:3px;} +.dp_opts a{color:#fff; text-decoration:none; font-weight:bold} +#dp_opts{padding:5px; border:1px solid #e3e3e3; border-radius:5px; -moz-border-radius:5px; -webkit-border-radius:5px; background:#f9f9f9; margin-top:0px; margin:5px; padding:5px; display:none} + +.player_dims{background-color:#E2E2E2; border-top:#666 1px solid; margin-top:5px; padding:5px} +.player_dims lable{font-weight:bold;} .player_dims input{border:1px solid #666;} + +.admin_links {margin:0px; padding:0px;} +.admin_links li{list-style:none; display:block; padding:2px 10px; margin:3px 0px; border-bottom:#666 1px dotted} +.admin_links a{font-weight:bold; font-size:12px; color:#09c; display:block} +.admin_links a:hover{color:#d54e21} + +.edit_comment{display:block; } + +.cb_div{border:1px solid #CCC; padding:10px; margin:10px; margin-left:0px } +.cb_div td{border-bottom:1px solid #CCC} +.cb_div .heading{background-color:#F2F2F2; font-weight:bold} +.cb_div input[type=submit]{padding:5px} + +.reindex_tbl .button {width:130px} +.reindex_tbl td{height:60px} + +.RatioBox { background:#0099cc; border:1px solid #026f93; font:bold 11px Tahoma; color:#FFF; text-align:center; display:inline-block; } +.smallText { font:normal 10px Tahoma; color:#7b7b7b; display:inline-block; margin-top:5px; } +.AdminBoldText { font:bold 11px Tahoma; color:#7b7b7b; } +/* I GOT FUKING ANNOYED THOSE TD's TR's SO I HAVE DEDICED TO ADD THIS CSS */ +.moveL { float:left; } +.moveR { float:right; } + +li.myAdminList { list-style:none; padding:5px 0px; border-bottom:1px solid #ccc; position:relative; } +li.myAdminList .PhotoCheckBox { width:30px; } +li.myAdminList .PhotoID { width:75px; font:bold 11px Tahoma; text-align:center; } +li.myAdminList .PhotoDetails { min-height:90px; height:90px; height:auto !important; } +li.myAdminList .PhotoDetails a { color:#0C4469; font-size:13px; font-weight:bold; text-decoration:none; } +li.myAdminList .AdminPhotoThumb { margin-right:8px; } +li.myAdminList .AdminPhotoActions a { font:bold 11px Tahoma; } +li.myAdminList .AdminPhotoActions a:hover { border-bottom:1px dashed #0099cc; } +li.myAdminList input[disabled=disabled].disabled { font:normal 11px Tahoma; padding:1px; } + +.myAdminButton { background:url(../images/gradients.png); border:1px solid #000; padding:4px; margin:0px; font:bold 11px Tahoma; color:#FFF; } +.myAdminButton[disabled] { opacity:0.5 } + +.TabButton { margin-right:25px; position:relative; border-radius:3px; -moz-border-radius:3px; padding:4px 6px; background:url(../images/gradients.png); color:#FFF; font:bold 11px Tahoma; border:1px solid #000; } +.TabButton:hover { cursor:move; } + +.delTab { font:normal 10px Verdana; background:#eee; border:1px solid white; margin:0px; padding:1px; color:#333; } +.delTab:hover { background:#000; border:1px solid white; color:#FFF; cursor:pointer; } + +.TabButton:hover .delTab { display:inline-block; } + +.uploadCategoryCheckBlock { position:relative; width:200px; } +.uploadCategoryCheckBlock br { display:none; } +.CategoryToggler { position:absolute; width:10px; height:10px; top:5px; right:5px; } +.CategoryToggler.none { background: url(../images/catgory_toggler.png) left top no-repeat; } +.CategoryToggler.block { background: url(../images/catgory_toggler.png) right top no-repeat; top:5px; } +.CategoryToggler:hover { cursor:pointer; } +.TabButton:hover .delTab { display:inline-block; } + + +.optionsLists{ + margin:0px; padding:0px; list-style:none; + width:220px; float:left; display:block + } +.optionsLists li{font-size:11px; font-weight:bold; font-family:tahoma; padding:5px; cursor:pointer} +.optionsLists li:hover{color:#09c} +.optionsLists .selected{border:1px solid #09c; border-right:0px; background-color:#fff;color:#09c} + +.optionsListsCont{ border:1px solid #09c; width:auto; margin-left:219px;padding:10px} +.templateCodeCont{ border:1px solid #757575; padding:10px; background-color:#F7F7F7;} +.templateCode{width:100%; height:100%; border:1px solid #F4F4F4; border:0px; background:none; min-height:500px;} + +.browser{background-image:url(../images/browsers.png); width:17px; height:16px; display:inline-block} +.firefox{background-position:-18px 0px} +.opera{background-position:-36px 0px} +.safari{background-position:-52px 0px} +.msie{background-position:-72px 0px} +.bot{background-image:url(../images/bot.png); background-repeat:no-repeat} + +.browsingUsers td{font-weight:bold; font-size:11px; padding:5px 2px;border-bottom:1px solid #ccc} +.browsingUsers tr:nth-child(even) td{background-color:#f3f3f3} +.browsingUsers a.kick{font-size:10px; font-family:Tahoma; color:#ed0000} + +.li_links ul, .li_links li{margin:0px; padding:0px; list-style:none} +.li_links ul{display:block;} +.li_links a{display:block; padding:3px; background-color:#fff;font-size:13px} +.li_links li:nth-child(2n) a{ background-color:#eee} + +.cb_title{background-color:#f3f3f3; font-size:12px; font-weight:bold; color:#333; border-bottom:1px solid #cccccc; height:27px; line-height:27px; padding-left:5px} +.cb_form select,.cb_form input,.cb_form textarea{border:1px solid #bbb; font-size:11px; width:200px; color:#333; padding:3px} +.cb_form textarea{width:auto} +.cb_form .cb_fieldL{float:left; width:300px; margin-right:10px} +.cb_form .cb_fieldR{float:left; width:400px;} +.cb_form .cb_field_cont{margin-bottom:10px;} +.cb_form input[type=radio],.cb_form input[type=checkbox]{width:auto !important} +.cb_form input[type=submit]{width:auto !important; color:#fff; border:1px solid #003} + +.cb_row{margin:5px 0px; padding-left:5px} +.font_12{font-size:12px} +.font_ah{font-family:Arial, Helvetica, sans-serif} \ No newline at end of file diff --git a/upload/admin_area/styles/cbv2/theme/pagination.css b/upload/admin_area/styles/cbv2/theme/pagination.css new file mode 100644 index 00000000..950e162c --- /dev/null +++ b/upload/admin_area/styles/cbv2/theme/pagination.css @@ -0,0 +1,17 @@ +/* Css Document */ + +.pagination +{ + background-image:url(../images/bgs/pagination_bg.png); + background-repeat:repeat-x; + height:23px; + width:100%; + margin:auto; + line-height:23px; + color:#FFF;font-weight:bold; font-size:12px; font-family:Arial, Helvetica, sans-serif; +} + + +.pagination a, .pagination .selected{color:#FFF; font-weight:bold; font-size:13px; font-family:Arial, Helvetica, sans-serif; text-decoration:none; margin:0px 3px 0px 3px; } + +.pagination .selected{color:#FFFF97; text-decoration:underline;} \ No newline at end of file diff --git a/upload/admin_area/styles/cbv2/theme/slidemenu.css b/upload/admin_area/styles/cbv2/theme/slidemenu.css new file mode 100644 index 00000000..81976212 --- /dev/null +++ b/upload/admin_area/styles/cbv2/theme/slidemenu.css @@ -0,0 +1,117 @@ +.left_menu +{ +width: 232px; /*Width of left column*/ +padding-left: 5px; +position:relative; +} + +.left_menu_0 +{ +width: 15px; /*Width of left column*/ +overflow:hidden; +padding-left: 0px; +margin-left:1px; + +} + +#left_column{ +float: left; +margin-left: -100%; +z-index:5001; +position:relative; +} + +.left_menu .mainDiv +{ + margin-top:3px; + width:211px; + margin-bottom:5px +} +.left_menu_0 .mainDiv +{ + margin-top:3px; + width:0px; + visibility:hidden; + margin-bottom:5px + +} +.topItem,.topItemOver,.topItemClose,.topItemCloseOver +{ + letter-spacing: 0; + background-position:center center; + background-repeat:no-repeat; + border: none; + width: 211px; + height: 26px; + color: #FFFFFF; + cursor:pointer; + text-indent:10px; + font-family: Arial, Helvetica, sans-serif; + font-size: 12px; + font-weight: bold; + line-height:26px; +} +.topItem{background: url("../images/bgs/left_menu_head.png") no-repeat 0 -26px;} +.topItemOver{background: url("../images/bgs/left_menu_head.png") no-repeat 0 -52px;} + +.topItemClose{background: url("../images/bgs/left_menu_head.png") no-repeat 0 0;} +.topItemCloseOver{background: url("../images/bgs/left_menu_head.png") no-repeat 0 -78px;} + + + +.dropMenu +{ + font: bold 11px tahoma,verdana,sans-serif; + color: #000; + filter:alpha(opacity=100); + background-position:bottom; + background-repeat:no-repeat; + padding-bottom:10px; + border:1px solid #0066cc; + overflow:hidden; +} + +.subMenu +{ + display:block; +} + +.subItem,.subItemOver +{ + font: 12px tahoma,verdana,sans-serif; + text-decoration:none; + color: #215dc6; + background-color:#f8f8f8; + border-bottom:1px solid #ccc; height:25px; + +} +.subItem:nth-child(2n),.subItemOver:nth-child(2n) +{ + background-color:#f3f3f3 +} + +.subItem a,.subItemOver a +{ + font:bold 11px tahoma,verdana,sans-serif; + color:#333; + display:block; + padding-left:10px; + text-decoration:none; + font-family:Arial, Helvetica, sans-serif; + height:25px; line-height:25px; +} +.subItem a:hover,.subItemOver a:hover{ +background-color:#e9f6ff; +color:#2b495d; +} + +.drop +{ + border-left:1px solid black; + border-right:1px solid black; +} + +.menu_toggle{ background-image:url(../images/slide_toggle_2.png);position:absolute; right:0px; top:0px; z-index:5002; width:9px; height:100%; cursor:e-resize; border:1px solid #aaa;} +.menu_toggle_arrow{ background:url(../images/slide_toggle_3.png) left no-repeat; position:absolute; right:0px; top:35px; z-index:5003; width:13px; height:51px; cursor:pointer} +.left_menu .menu_toggle_arrow:hover { background:url(../images/slide_toggle_3.png) -13px no-repeat; } +.left_menu_0 .menu_toggle_arrow:hover { background:url(../images/slide_toggle_3.png) right no-repeat; } \ No newline at end of file diff --git a/upload/admin_area/template_editor.php b/upload/admin_area/template_editor.php new file mode 100644 index 00000000..fa9fcb8e --- /dev/null +++ b/upload/admin_area/template_editor.php @@ -0,0 +1,117 @@ +admin_login_check(); +$userquery->perm_check('manage_template_access',true); + + +/** + * Getting List Of Templates + */ +$templates = $cbtpl->get_templates(); + +#Checking if user has selected template for editing, if not, make SELECTED template for editing +$sel_dir = $_GET['dir']; +if(!$sel_dir || !$cbtpl->is_template($sel_dir)) +{ + $sel_dir = TEMPLATE; +} + +//Checking if still there is no template, display error +if(!$cbtpl->is_template($sel_dir)) +{ + e("No Template Found"); +}else +{ + assign('sel_dir',$sel_dir); + //Getting list template layout files , i.e HTML files + $files = $cbtpl->get_template_files($sel_dir ); + assign('tpl_files',$files); + //Getting list of css files + $css_files = $cbtpl->get_template_files($sel_dir,'theme'); + assign('css_files',$css_files); + + //Reading File + if(isset($_GET['file']) && isset($_GET['folder'])) + { + $file = STYLES_DIR.'/'.TEMPLATE.'/'.$_GET['folder'].'/'.$_GET['file']; + + if(file_exists($file)) + { + if(isset($_POST['update_file'])) + { + if(is_writable($file)) + { + //echo $file; + $data = $_POST['thecontent']; + $open_file = fopen($file, "w"); + fwrite($open_file, stripslashes($data)); + e("File has been updated","m"); + }else + e("Unable to write file"); + } + + $content = htmlentities(file_get_contents($file)); + assign('content',$content); + + if(!is_writable($file)) + assign('writeable','no'); + else + assign('writeable','yes'); + } + + } +} + + +//Getting And Listing Files +if(!file_exists(BASEDIR.'/'.TEMPLATEFOLDER.'/'.@$_GET['temp']) || @$_GET['temp']==''){ +$dir = SITETEMPLATEDIR.'/layout/'; +$cur_dir = TEMPLATE; +}else{ +$dir = BASEDIR.'/'.TEMPLATEFOLDER.'/'.$_GET['temp'].'/layout/'; +$cur_dir = $_GET['temp']; +} +if(!($dp = opendir($dir))) die("Cannot open $dir."); +while($file = readdir($dp)){ +$ext = GetExt($file); +if($ext == 'html' || $ext == 'HTML'){ +$files[] = $file; +} +} +closedir($dp +); +sort($files); +Assign('files',$files); + +//Writng File +if(isset($_POST['save'])){ + $file = $dir.$_POST['file']; + $data = stripslashes($_POST['data']); + $open_file = fopen($file, "w"); + fwrite($open_file, $data); + $msg = $_POST['file']." Has Been Saved And Updated"; +} + +//Getting Data from File +if(isset($_POST['file'])){ +$file = $dir.$_POST['file']; +$_file = $_POST['file']; +}else{ +$file = $dir.$files[0]; +$_file = $files[0]; +} +$open_file = fopen($file, "r"); +$data = htmlentities(file_get_contents($file)); + +template_files('template_editor.html'); +display_it(); +?> \ No newline at end of file diff --git a/upload/admin_area/templates.php b/upload/admin_area/templates.php new file mode 100644 index 00000000..86274eb1 --- /dev/null +++ b/upload/admin_area/templates.php @@ -0,0 +1,23 @@ +admin_login_check(); +$pages->page_redir(); +$userquery->perm_check('manage_template_access',true); + +if($_GET['change']) +{ + $myquery->set_template($_GET['change']); +} + +subtitle("Template Manager"); +template_files('templates.html'); +display_it(); +?> \ No newline at end of file diff --git a/upload/admin_area/upload_thumbs.php b/upload/admin_area/upload_thumbs.php new file mode 100644 index 00000000..f44262c9 --- /dev/null +++ b/upload/admin_area/upload_thumbs.php @@ -0,0 +1,75 @@ +admin_login_check(); +$userquery->login_check('video_moderation'); +$pages->page_redir(); + +if(@$_GET['msg']){ +$msg[] = clean($_GET['msg']); +} + +$video = mysql_clean($_GET['video']); + + +//Check Video Exists or Not +if($myquery->VideoExists($video)){ + + # Setting Default thumb + if(isset($_POST['update_default_thumb'])) + { + $myquery->set_default_thumb($video,$_POST['default_thumb']); + } + + $data = get_video_details($video);; + $vid_file = VIDEOS_DIR.'/'.get_video_file($data,false,false); + + # Uploading Thumbs + if(isset($_POST['upload_thumbs'])){ + $Upload->upload_thumbs($data['file_name'],$_FILES['vid_thumb']); + } + +// # Uploading Big Thumb +// if(isset($_POST['upload_big_thumb'])) { +// $Upload->upload_big_thumb($data['file_name'],$_FILES['big_thumb']); +// } + + # Delete Thumb + if(isset($_GET['delete'])) + delete_video_thumb($_GET['delete']); + + # Generating more thumbs + if(isset($_GET['gen_more'])) + { + $num = config('num_thumbs'); + $dim = config('thumb_width').'x'.config('thumb_height'); + $big_dim = config('big_thumb_width').'x'.config('big_thumb_height'); + require_once(BASEDIR.'/includes/classes/conversion/ffmpeg.class.php'); + $ffmpeg = new ffmpeg($vid_file); + //Generating Thumbs + $ffmpeg->generate_thumbs($vid_file,$data['duration'],$dim,$num,true); + //Generating Big Thumb + $ffmpeg->generate_thumbs($vid_file,$data['duration'],$big_dim,$num,true,true); + } + + Assign('data',$data); + Assign('rand',rand(44,444)); + +}else{ + $msg[] = lang('class_vdo_del_err'); +} + + + + +subtitle("Video Thumbs Manager"); +template_files('upload_thumbs.html'); +display_it(); +?> \ No newline at end of file diff --git a/upload/admin_area/user_category.php b/upload/admin_area/user_category.php new file mode 100644 index 00000000..8f8ca9f1 --- /dev/null +++ b/upload/admin_area/user_category.php @@ -0,0 +1,67 @@ +admin_login_check(); +$userquery->login_check('admin_access'); +$pages->page_redir(); + + +//Form Processing +if(isset($_POST['add_cateogry'])){ + $userquery->add_category($_POST); +} + +//Making Categoyr as Default +if(isset($_GET['make_default'])) +{ + $cid = mysql_clean($_GET['make_default']); + $userquery->make_default_category($cid); +} + +//Edit Categoty +if(isset($_GET['category'])){ + assign("edit_category","show"); + if(isset($_POST['update_category'])) + { + $userquery->update_category($_POST); + } + assign('cat_details',$userquery->get_category($_GET['category'])); +} + +//Delete Category +if(isset($_GET['delete_category'])){ + $userquery->delete_category($_GET['delete_category']); +} + +$cats = $userquery->get_categories(); +//Updating Category Order +if(isset($_POST['update_order'])) +{ + foreach($cats as $cat) + { + if(!empty($cat['category_id'])) + { + $order = $_POST['category_order_'.$cat['category_id']]; + $userquery->update_cat_order($cat['category_id'],$order); + } + } + $cats = $userquery->get_categories(); +} + +//Assing Category Values +assign('category',$cats); +assign('total',$userquery->total_categories()); + +Assign('msg',@$msg); +subtitle("User Category Manager"); +template_files('user_category.html'); +display_it(); + +?> \ No newline at end of file diff --git a/upload/admin_area/user_levels.php b/upload/admin_area/user_levels.php new file mode 100644 index 00000000..0fa05577 --- /dev/null +++ b/upload/admin_area/user_levels.php @@ -0,0 +1,86 @@ +admin_login_check(); +$pages->page_redir(); + + +$userquery->login_check('admin_access'); + + +if(!has_access('allow_manage_user_level') && $userquery->udetails['level'] != 1) +{ + $Cbucket->show_page = false; + e("You are not allowed to manage user levels"); +} + + +$mode = $_GET['mode']; +$lid = mysql_clean($_GET['lid']); +$action = mysql_clean($_GET['action']); + +//Deleteing Level +if($action=='delete') + $userquery->delete_user_level($lid); + +switch($mode) +{ + case 'view': + default: + { + Assign('view','view'); + } + break; + + case 'edit': + { + //Updating Level permissions + if(isset($_POST['update_level_perms'])) + { + $perm_array = $_POST; + $userquery->update_user_level($lid,$perm_array); + } + + + //Getting Details of $level + $levelDetails = $userquery->get_level_details($lid); + Assign('level_details',$levelDetails); + + //GettinG Level Permission + $level_perms = $userquery->get_level_permissions($lid); + + $plugin_perms = $level_perms['plugins_perms']; + $plugin_perms = json_decode($plugin_perms,true); + + assign('plugin_perms',$plugin_perms); + + Assign('level_perms',$level_perms); + + Assign('view','edit'); + } + break; + + case 'add': + { + if(isset($_POST['add_new_level'])) + { + $array = $_POST; + if($userquery->add_user_level($array)) + redirect_to('user_levels.php?added=true'); + } + Assign('view','add'); + } +} + +subtitle("User levels"); +template_files('user_levels.html'); +display_it(); +?> \ No newline at end of file diff --git a/upload/admin_area/video_manager.php b/upload/admin_area/video_manager.php new file mode 100644 index 00000000..5cbe2cb9 --- /dev/null +++ b/upload/admin_area/video_manager.php @@ -0,0 +1,155 @@ +admin_login_check(); +$userquery->login_check('video_moderation'); +$pages->page_redir(); + +//Feature / UnFeature Video +if(isset($_GET['make_feature'])){ + $video = mysql_clean($_GET['make_feature']); + $cbvid->action('feature',$video); + $row = $myquery->Get_Website_Details(); + if($row['notification_option']=='1'){ + send_video_notification($video); + } + + +} +if(isset($_GET['make_unfeature'])){ + $video = mysql_clean($_GET['make_unfeature']); + $cbvid->action('unfeature',$video); +} + +//Using Multple Action +if(isset($_POST['make_featured_selected'])){ + for($id=0;$id<=count($_POST['check_video']);$id++){ + $cbvid->action('feature',$_POST['check_video'][$id]); + } + $eh->flush(); + e("Selected videos have been set as featured","m"); +} +if(isset($_POST['make_unfeatured_selected'])){ + for($id=0;$id<=count($_POST['check_video']);$id++){ + $cbvid->action('unfeature',$_POST['check_video'][$id]); + } + $eh->flush(); + e("Selected videos have been removed from featured list","m"); +} + +//Activate / Deactivate + +if(isset($_GET['activate'])){ + $video = mysql_clean($_GET['activate']); + $cbvid->action('activate',$video); +} +if(isset($_GET['deactivate'])){ + $video = mysql_clean($_GET['deactivate']); + $cbvid->action('deactivate',$video); +} + +//Using Multple Action +if(isset($_POST['activate_selected'])){ + for($id=0;$id<=count($_POST['check_video']);$id++){ + $cbvid->action('activate',$_POST['check_video'][$id]); + } + $eh->flush(); + e("Selected Videos Have Been Activated","m"); +} +if(isset($_POST['deactivate_selected'])){ + for($id=0;$id<=count($_POST['check_video']);$id++){ + $cbvid->action('deactivate',$_POST['check_video'][$id]); + } + $eh->flush(); + e("Selected Videos Have Been Dectivated","m"); +} + + +//Delete Video +if(isset($_GET['delete_video'])){ + $video = mysql_clean($_GET['delete_video']); + $cbvideo->delete_video($video); +} + +//Deleting Multiple Videos +if(isset($_POST['delete_selected'])) +{ + for($id=0;$id<=count($_POST['check_video']);$id++) + { + $cbvideo->delete_video($_POST['check_video'][$id]); + } + $eh->flush(); + e(lang("vdo_multi_del_erro"),"m"); +} + + + //Calling Video Manager Functions + call_functions($cbvid->video_manager_funcs); + + $page = mysql_clean($_GET['page']); + $get_limit = create_query_limit($page,RESULTS); + + if(isset($_GET['search'])) + { + + $array = array + ( + 'videoid' => $_GET['videoid'], + 'videokey' => $_GET['videokey'], + 'title' => $_GET['title'], + 'tags' => $_GET['tags'], + 'user' => $_GET['userid'], + 'category' => $_GET['category'], + 'featured' => $_GET['featured'], + 'active' => $_GET['active'], + 'status' => $_GET['status'], + ); + } + + $result_array = $array; + //Getting Video List + $result_array['limit'] = $get_limit; + if(!$array['order']) + $result_array['order'] = " videoid DESC "; + $videos = get_videos($result_array); + + Assign('videos', $videos); + + //Collecting Data for Pagination + $vcount = $array; + $vcount['count_only'] = true; + $total_rows = get_videos($vcount); + $total_pages = count_pages($total_rows,RESULTS); + $pages->paginate($total_pages,$page); + + + //Category Array + if(is_array($_GET['category'])) + $cats_array = array($_GET['category']); + else + { + preg_match_all('/#([0-9]+)#/',$_GET['category'],$m); + $cats_array = array($m[1]); + } + $cat_array = array(lang('vdo_cat'), + 'type'=> 'checkbox', + 'name'=> 'category[]', + 'id'=> 'category', + 'value'=> array('category',$cats_array), + 'hint_1'=> lang('vdo_cat_msg'), + 'display_function' => 'convert_to_categories'); + assign('cat_array',$cat_array); + +subtitle("Video Manager"); +template_files('video_manager.html'); +display_it(); + +?> \ No newline at end of file diff --git a/upload/admin_area/view_conversion_log.php b/upload/admin_area/view_conversion_log.php new file mode 100644 index 00000000..b7c5605e --- /dev/null +++ b/upload/admin_area/view_conversion_log.php @@ -0,0 +1,28 @@ +admin_login_check(); +$userquery->login_check('video_moderation'); +$pages->page_redir(); + +$file_name = mysql_clean($_GET['file_name']); +$file_details = $myquery->file_details($file_name); +$file_details['file_name'] = getname($file_details['File']); +$file_details['file_ext'] = getext($file_details['File']); +if($file_details) +{ + assign('data',$file_details); +} + + +subtitle("Conversion Log"); +template_files('view_conversion_log.html'); +display_it(); +?> \ No newline at end of file diff --git a/upload/admin_area/view_lang_vars.php b/upload/admin_area/view_lang_vars.php new file mode 100644 index 00000000..4efbe07f --- /dev/null +++ b/upload/admin_area/view_lang_vars.php @@ -0,0 +1,73 @@ +admin_login_check(); +//$userquery->admin_login_check(); +$pages->page_redir(); + +//Adding new phrase +if(isset($_POST['button'])) +{ + $name = $_POST['name']; + $text = $_POST['text']; + $lang_obj->add_phrase($name,$text); +} + +//Getting lang variables + +$query = mysql_query("SELECT * FROM ".tbl("phrases")." ORDER BY text ASC"); + +?> +
    + + + + + + + + + + + + + + + + + + +
    Add New 
    +
    +  
      
    +
    + + + + + + + + + + + + + +
    Phrase Code +Sentence +
    + +
    diff --git a/upload/admin_area/view_user.php b/upload/admin_area/view_user.php new file mode 100644 index 00000000..0a76092c --- /dev/null +++ b/upload/admin_area/view_user.php @@ -0,0 +1,83 @@ +admin_login_check(); +$pages->page_redir(); +$userquery->login_check('member_moderation'); + +$uid = $_GET['uid']; +$udetails = $userquery->get_user_details($uid); + +if($udetails) +{ + + //Deactivating User + if(isset($_GET['deactivate'])) + { + $userquery->action('deactivate',$uid); + $udetails = $userquery->get_user_details($uid); + } + //Activating User + if(isset($_GET['activate'])) + { + $userquery->action('activate',$uid); + $udetails = $userquery->get_user_details($uid); + } + //Banning User + if(isset($_GET['ban'])) + { + $userquery->action('ban',$uid); + $udetails = $userquery->get_user_details($uid); + } + //Unbanning User + if(isset($_GET['unban'])) + { + $userquery->action('unban',$uid); + $udetails = $userquery->get_user_details($uid); + } + + //Deleting User + if(isset($_GET['delete'])) + $userquery->delete_user($uid); + //Deleting User Videos + if(isset($_GET['delete_vids'])) + $userquery->delete_user_vids($uid); + //Deleting User Contacts + if(isset($_GET['delete_contacts'])) + $userquery->remove_contacts($uid); + //Deleting User Pms + if(isset($_GET['delete_pms'])) + $userquery->remove_user_pms($uid); + + + //Deleting Comment + $cid = mysql_clean($_GET['delete_comment']); + if(!empty($cid)) + { + $myquery->delete_comment($cid); + } + + if(isset($_POST['update_user'])) + { + $userquery->update_user($_POST); + if(!error()) + $udetails = $userquery->get_user_details($uid); + } + + $profile = $userquery->get_user_profile($udetails['userid']); + $user_profile = array_merge($udetails,$profile); + assign('u',$udetails); + assign('p',$user_profile); +}else{ + e("No User Found"); + $CBucket->show_page = false; +} + +subtitle("View User"); +template_files("view_user.html"); +display_it(); +?> \ No newline at end of file diff --git a/upload/admin_area/view_video.php b/upload/admin_area/view_video.php new file mode 100644 index 00000000..d955663f --- /dev/null +++ b/upload/admin_area/view_video.php @@ -0,0 +1,54 @@ +admin_login_check(); +$userquery->login_check('video_moderation'); +$pages->page_redir(); + +if(@$_GET['msg']){ +$msg[] = clean($_GET['msg']); +} + + $video = mysql_clean($_GET['video']); + + //Check Video Exists or Not + if($myquery->VideoExists($video)){ + //Deleting Comment + $cid = mysql_clean($_GET['delete_comment']); + if(!empty($cid)) + { + $myquery->delete_comment($cid); + } + + //Get Video Details + $data = get_video_details($video); + Assign('udata',$userquery->get_user_details($data['userid'])); + Assign('data',$data); + }else{ + $msg[] = lang('class_vdo_del_err'); + } + + + + +Assign('msg',@$msg); +/*Template('header.html'); +Template('leftmenu.html'); +Template('message.html'); +Template('view_video.html'); +Template('footer.html');*/ + + +subtitle("View Video"); +template_files('view_video.html'); +display_it(); + + +?> \ No newline at end of file diff --git a/upload/ajax.php b/upload/ajax.php new file mode 100644 index 00000000..b65c8572 --- /dev/null +++ b/upload/ajax.php @@ -0,0 +1,1513 @@ +perm_check('view_videos',false,true) ) + exit(); + + $videos = get_videos(array('limit'=>config('videos_items_hme_page'),'order'=>'last_viewed DESC')); + if($videos) + foreach($videos as $video) + { + assign('video',$video); + Template('blocks/video.html'); + } + } + break; + + case 'most_viewed': + { + if(!isSectionEnabled('videos') || !$userquery->perm_check('view_videos',false,true) ) + exit(); + $videos = get_videos(array('limit'=>config('videos_items_hme_page'),'order'=>'views DESC')); + if($videos) + foreach($videos as $video) + { + assign('video',$video); + Template('blocks/video.html'); + } + } + break; + + case 'recently_added': + { + if(!isSectionEnabled('videos') || !$userquery->perm_check('view_videos',false,true) ) + exit(); + $videos = get_videos(array('limit'=>config('videos_items_hme_page'),'order'=>'date_added DESC')); + if($videos) + foreach($videos as $video) + { + assign('video',$video); + Template('blocks/video.html'); + } + } + break; + + case 'featured_videos': + { + if(!isSectionEnabled('videos') || !$userquery->perm_check('view_videos',false,true) ) + exit(); + $videos = get_videos(array('limit'=>config('videos_items_hme_page'),'featured'=>'yes','order'=>'featured_date DESC')); + if($videos) + foreach($videos as $video) + { + assign('video',$video); + Template('blocks/video.html'); + } + } + break; + + + case 'rating': + { + switch($_POST['type']) + { + case "video": + { + $rating = $_POST['rating']*2; + $id = $_POST['id']; + $result = $cbvid->rate_video($id,$rating); + $result['is_rating'] = true; + $cbvid->show_video_rating($result); + + $funcs = cb_get_functions('rate_video'); + if($funcs) + foreach($funcs as $func) + { + $func['func']($id); + } + } + break; + + case "photo": + { + $rating = $_POST['rating']*2; + $id = $_POST['id']; + $result = $cbphoto->rate_photo($id,$rating); + $result['is_rating'] = true; + $cbvid->show_video_rating($result); + + $funcs = cb_get_functions('rate_photo'); + if($funcs) + foreach($funcs as $func) + { + $func['func']($id); + } + } + break; + case "collection": + { + $rating = $_POST['rating']*2; + $id = $_POST['id']; + $result = $cbcollection->rate_collection($id,$rating); + $result['is_rating'] = true; + $cbvid->show_video_rating($result); + + $funcs = cb_get_functions('rate_collection'); + if($funcs) + foreach($funcs as $func) + { + $func['func']($id); + } + } + break; + + case "user": + { + $rating = $_POST['rating']*2; + $id = $_POST['id']; + $result = $userquery->rate_user($id,$rating); + $result['is_rating'] = true; + $cbvid->show_video_rating($result); + + $funcs = cb_get_functions('rate_user'); + if($funcs) + foreach($funcs as $func) + { + $func['func']($id); + } + } + break; + } + } + break; + + + case 'share_object': + { + + $type = strtolower($_POST['type']); + switch($type) + { + case 'v': + case 'video': + default: + { + $id = mysql_clean($_POST['id']); + $vdo = $cbvid->get_video($id); + $cbvid->set_share_email($vdo); + $cbvid->action->share_content($vdo['videoid']); + if(msg()) + { + $msg = msg_list(); + $msg = '
    '.$msg[0].'
    '; + } + if(error()) + { + $msg = error_list(); + $msg = '
    '.$msg[0].'
    '; + } + + echo $msg; + } + break; + + case "p": + case "photo": + { + $id = $_POST['id']; + $ph = $cbphoto->get_photo($id); + $cbphoto->set_share_email($ph); + $cbphoto->action->share_content($ph['photo_id']); + if(msg()) + { + $msg = msg_list(); + $msg = '
    '.$msg[0].'
    '; + } + if(error()) + { + $msg = error_list(); + $msg = '
    '.$msg[0].'
    '; + } + + echo $msg; + } + break; + + case "cl": + case "collection": + { + $id = $_POST['id']; + $cl = $cbcollection->get_collection($id); + $cbcollection->set_share_mail($cl); + $cbcollection->action->share_content($cl['collection_id']); + if(msg()) + { + $msg = msg_list(); + $msg = '
    '.$msg[0].'
    '; + } + if(error()) + { + $msg = error_list(); + $msg = '
    '.$msg[0].'
    '; + } + + echo $msg; + } + break; + } + } + break; + + + case 'add_to_fav': + { + $type = strtolower($_POST['type']); + switch($type) + { + case 'v': + case 'video': + default: + { + $id = $_POST['id']; + $cbvideo->action->add_to_fav($id); + updateObjectStats('fav','video',$id); // Increment in total favs + + if(msg()) + { + $msg = msg_list(); + $msg = '
    '.$msg[0].'
    '; + } + if(error()) + { + $msg = error_list(); + $msg = '
    '.$msg[0].'
    '; + } + + $funcs = cb_get_functions('favorite_video'); + if($funcs) + foreach($funcs as $func) + { + $func['func']($id); + } + + echo $msg; + } + break; + + case 'p': + case 'photo': + { + $id = $_POST['id']; + $cbphoto->action->add_to_fav($id); + updateObjectStats('fav','photo',$id); // Increment in total favs + + if(msg()) + { + $msg = msg_list(); + $msg = '
    '.$msg[0].'
    '; + } + if(error()) + { + $msg = error_list(); + $msg = '
    '.$msg[0].'
    '; + } + + $funcs = cb_get_functions('favorite_photo'); + if($funcs) + foreach($funcs as $func) + { + $func['func']($id); + } + + echo $msg; + } + break; + + case "cl": + case "collection": + { + $id = $_POST['id']; + $cbcollection->action->add_to_fav($id); + //updateObjectStats('fav','collection',$id); // Increment in total favs + + if(msg()) + { + $msg = msg_list(); + $msg = '
    '.$msg[0].'
    '; + } + if(error()) + { + $msg = error_list(); + $msg = '
    '.$msg[0].'
    '; + } + + $funcs = cb_get_functions('favorite_collection'); + if($funcs) + foreach($funcs as $func) + { + $func['func']($id); + } + + echo $msg; + } + break; + } + } + break; + + + case 'flag_object': + { + $type = strtolower($_POST['type']); + switch($type) + { + case 'v': + case 'video': + default: + { + $id = $_POST['id']; + $reported = $cbvideo->action->report_it($id); + /*if(!error()){ + /* SENDING EMAIL TO ADMIN + $template = $cbemail->get_template('flag_template'); + $video = $cbvideo->get_video_details($id); + $emailVars = array( + "{video_link}" => videoLink($video), + "{video_title}" => $video['title'], + "{flag_reason}" => flag_type(post('flag_type')), + "{type}" => "video" + ); + $admins = $userquery->get_level_users(1,false,'userid,email'); + $libs = $userquery->get_level_users(17,false,'userid,email'); + if($libs) + $users = array_merge($admins,$libs); + else + $users = $admins; + foreach ($users as $user) + { + if(isValidEmail($user['email'])) + $emailsArray[] = $user['email']; + } + + if(!is_array($var)) + $var = array(); + $vars = array_merge($emailVars,$var); + $subj = $cbemail->replace($template['email_template_subject'],$vars); + $msg = nl2br($cbemail->replace($template['email_template'],$vars)); + + cbmail(array('to'=>$emailsArray,'from'=>WEBSITE_EMAIL,'subject'=>$subj,'content'=>$msg)); + }*/ + } + break; + + case 'g': + case 'group': + default: + { + $id = $_POST['id']; + $cbgroup->action->report_it($id); + } + break; + + case 'u': + case 'user': + default: + { + $id = $_POST['id']; + $userquery->action->report_it($id); + } + break; + + case 'p': + case 'photo': + { + $id = $_POST['id']; + $cbphoto->action->report_it($id); + } + break; + + case "cl": + case "collection": + { + $id = $_POST['id']; + $cbcollection->action->report_it($id); + } + break; + + } + + if(msg()) + { + $msg = msg_list(); + $msg = '
    '.$msg[0].'
    '; + } + if(error()) + { + $msg = error_list(); + $msg = '
    '.$msg[0].'
    '; + } + + echo $msg; + } + break; + + + case 'subscribe_user': + { + $subscribe_to = mysql_clean($_POST['subscribe_to']); + $userquery->subscribe_user($subscribe_to); + if(msg()) + { + $msg = msg_list(); + $msg = '
    '.$msg[0].'
    '; + } + if(error()) + { + $msg = error_list(); + $msg = '
    '.$msg[0].'
    '; + } + echo $msg; + } + break; + + case 'unsubscribe_user': + { + $subscribe_to = mysql_clean($_POST['subscribe_to']); + $userquery->unsubscribe_user($subscribe_to); + if(msg()) + { + $msg = msg_list(); + $msg = '
    '.$msg[0].'
    '; + } + if(error()) + { + $msg = error_list(); + $msg = '
    '.$msg[0].'
    '; + } + echo $msg; + } + break; + + + case 'add_friend': + { + $friend = mysql_clean($_POST['uid']); + $userid = userid(); + + if($userid) { + $userquery->add_contact($userid,$friend); + + if(msg()) + { + $msg = msg_list(); + $msg = '
    '.$msg[0].'
    '; + } + if(error()) + { + $msg = error_list(); + $msg = '
    '.$msg[0].'
    '; + } + echo $msg; + } else { + echo '
    '.e(lang('you_not_logged_in')).'
    '; + } + } + break; + + case 'ban_user': + { + $user = $_POST['user']; + $userquery->ban_user($user); + if(msg()) + { + $msg = msg_list(); + $msg = '
    '.$msg[0].'
    '; + } + if(error()) + { + $msg = error_list(); + $msg = '
    '.$msg[0].'
    '; + } + echo $msg; + + } + break; + + case 'rate_comment': + { + $thumb = $_POST['thumb']; + $cid = mysql_clean($_POST['cid']); + if($thumb!='down') + $rate = 1; + else + $rate = -1; + + $rating = $myquery->rate_comment($rate,$cid); + if(msg()) + { + $msg = msg_list(); + $msg = $msg[0]; + } + if(error()) + { + $msg = error_list(); + $msg = $msg[0]; + } + + $ajax['msg'] = $msg; + $ajax['rate'] = comment_rating($rating); + + //updating last update... + $type = mysql_clean($_POST['type']); + $typeid = mysql_clean($_POST['typeid']); + update_last_commented($type,$typeid); + + + echo json_encode($ajax); + } + break; + + case 'spam_comment': + { + $cid = mysql_clean($_POST['cid']); + + + $rating = $myquery->spam_comment($cid); + if(msg()) + { + $msg = msg_list(); + $msg = $msg[0]; + } + if(error()) + { + $err = error_list(); + $err = $err[0]; + } + + $ajax['msg'] = $msg; + $ajax['err'] = $err; + + $type = mysql_clean($_POST['type']); + $typeid = mysql_clean($_POST['typeid']); + + if($_POST['type'] != 't') + update_last_commented($type,$typeid); + + echo json_encode($ajax); + } + break; + + case 'add_comment'; + { + $type = $_POST['type']; + switch($type) + { + case 'v': + case 'video': + default: + { + $id = mysql_clean($_POST['obj_id']); + $comment = $_POST['comment']; + if($comment=='undefined') + $comment = ''; + $reply_to = $_POST['reply_to']; + + $cid = $cbvid->add_comment($comment,$id,$reply_to); + } + break; + case 'u': + case 'c': + { + + $id = mysql_clean($_POST['obj_id']); + $comment = $_POST['comment']; + if($comment=='undefined') + $comment = ''; + $reply_to = $_POST['reply_to']; + + $cid = $userquery->add_comment($comment,$id,$reply_to); + } + break; + case 't': + case 'topic': + { + + $id = mysql_clean($_POST['obj_id']); + $comment = $_POST['comment']; + if($comment=='undefined') + $comment = ''; + $reply_to = $_POST['reply_to']; + + $cid = $cbgroup->add_comment($comment,$id,$reply_to); + } + break; + + case 'cl': + case 'collection': + { + $id = mysql_clean($_POST['obj_id']); + $comment = $_POST['comment']; + if($comment=='undefined') + $comment = ''; + $reply_to = $_POST['reply_to']; + + $cid = $cbcollection->add_comment($comment,$id,$reply_to); + } + break; + + case "p": + case "photo": + { + $id = mysql_clean($_POST['obj_id']); + $comment = $_POST['comment']; + if($comment=='undefined') + $comment = ''; + $reply_to = $_POST['reply_to']; + $cid = $cbphoto->add_comment($comment,$id,$reply_to); + } + break; + + } + + if(msg()) + { + $msg = msg_list(); + $msg = '
    '.$msg[0].'
    ';; + } + if(error()) + { + $err = error_list(); + $err = '
    '.$err[0].'
    ';; + } + + $ajax['msg'] = $msg ? $msg : ''; + $ajax['err'] = $err; + + //Getting Comment + if($cid) + { + $ajax['cid'] = $cid; + } + + echo json_encode($ajax); + + } + break; + + case 'get_comment'; + { + $id = mysql_clean($_POST['cid']); + $new_com = $myquery->get_comment($id); + assign('comment',$new_com); + Template('blocks/comments/comment.html'); + } + break; + + + + /** + * Function used to add item in playlist + */ + case 'add_playlist'; + { + $id = mysql_clean($_POST['id']); + $pid = mysql_clean($_POST['pid']); + + $type = post('objtype'); + + if($type=='video') + { + $cbvid->action->add_playlist_item($pid,$id ); + updateObjectStats('plist','video',$id); + + if(msg()) + { + $msg = msg_list(); + $msg = '
    '.$msg[0].'
    ';; + } + if(error()) + { + $err = error_list(); + $err = '
    '.$err[0].'
    ';; + } + + $ajax['msg'] = $msg ? $msg : ''; + $ajax['err'] = $err ? $err : ''; + + + echo json_encode($ajax); + } + + } + break; + + + case 'add_new_playlist'; + { + + if(post('objtype')=='video') + { + $vid = mysql_clean($_POST['id']); + + $params = array('name'=>mysql_clean($_POST['plname'])); + $pid = $cbvid->action->create_playlist($params); + + if($pid) + { + $eh->flush(); + $cbvid->action->add_playlist_item($pid,$vid); + } + + if(msg()) + { + $msg = msg_list(); + $msg = '
    '.$msg[0].'
    ';; + } + if(error()) + { + $err = error_list(); + $err = '
    '.$err[0].'
    ';; + } + + $ajax['msg'] = $msg ? $msg : ''; + $ajax['err'] = $err ? $err : ''; + + + echo json_encode($ajax); + } + + } + break; + + + case 'quicklist': + { + + $todo = $_POST['todo']; + $id = mysql_clean($_POST['vid']); + + if($todo == 'add') + { + $return = $cbvid->add_to_quicklist($id); + }else + $return = $cbvid->remove_from_quicklist($id); + + echo $return; + } + break; + + case 'getquicklistbox'; + { + //$cookie = $_COOKIE[QUICK_LIST_SESS]; + //$vids = json_decode($cookie,true); + if($cbvid->total_quicklist()>0) + TEMPLATE('blocks/quicklist/block.html'); + } + break; + + case 'clear_quicklist': + { + $cbvid->clear_quicklist(); + return 'removed'; + } + break; + + + case 'delete_comment': + { + $type = $_POST['type']; + switch($type) + { + case 'v': + case 'video': + default: + { + $cid = mysql_clean($_POST['cid']); + $type_id = $myquery->delete_comment($cid); + $cbvid->update_comments_count($type_id); + } + break; + case 'u': + case 'c': + { + $cid = mysql_clean($_POST['cid']); + $type_id = $myquery->delete_comment($cid); + $userquery->update_comments_count($type_id); + } + break; + case 't': + case 'topic': + { + $cid = mysql_clean($_POST['cid']); + $type_id = $myquery->delete_comment($cid); + $cbgroup->update_comments_count($type_id); + } + break; + case 'cl': + case 'collection': + { + $cid = mysql_clean($_POST['cid']); + $type_id = $myquery->delete_comment($cid); + $cbcollection->update_total_comments($type_id); + } + + } + if(msg()) + { + $msg = msg_list(); + $msg = $msg[0]; + } + if(error()) + { + $err = error_list(); + $err = $err[0]; + } + + $ajax['msg'] = $msg; + $ajax['err'] = $err; + + echo json_encode($ajax); + + } + break; + + case "add_new_item": + { + $type = $_POST['type']; + + switch($type) + { + case "videos": + case "video": + case "v": + { + $cid = $_POST['cid']; + $id = $_POST['obj_id']; + $cbvideo->collection->add_collection_item($id,$cid); + } + break; + + case "photos": + case "photo": + case "p": + { + $cid = $_POST['cid']; + $id = $_POST['obj_id']; + $cbphoto->collection->add_collection_item($id,$cid); + } + } + + if(msg()) + { + $msg = msg_list(); + $msg = '
    '.$msg[0].'
    '; + } + + if(error()) + { + $err = error_list(); + $err = '
    '.$err[0].'
    '; + } + + $ajax['msg'] = $msg; + $ajax['err'] = $err; + + echo json_encode($ajax); + } + break; + + + case "remove_collection_item": + { + $type = $_POST['type']; + + switch($type) + { + case "videos": + { + $obj_id = $_POST['obj_id']; + $cid = $_POST['cid']; + $cbvideo->collection->remove_item($obj_id,$cid); + } + break; + + case "photos": + { + $obj_id = $_POST['obj_id']; + $cid = $_POST['cid']; + $cbphoto->collection->remove_item($obj_id,$cid); + $cbphoto->make_photo_orphan($cid,$obj_id); + } + break; + } + + if(msg()) + { + $msg = msg_list(); + $msg = '
    '.$msg[0].'
    '; + } + + if(error()) + { + $err = error_list(); + $err = '
    '.$err[0].'
    '; + } + + $ajax['msg'] = $msg; + $ajax['err'] = $err; + + echo json_encode($ajax); + } + break; + + case "get_item": + { + $item_id = mysql_clean($_POST['ci_id']); + $cid = mysql_clean($_POST['cid']); + $direc = mysql_clean($_POST['direction']); + $t = mysql_clean($_POST['type']); + + switch($t) + { + case "videos": + case "video": + case "v": + { + $N_item = $cbvideo->collection->get_next_prev_item($item_id,$cid,$direc); + //increment_views($N_item[0]['videoid'],'video'); + $ajax['key'] = $N_item[0]['videokey']; + $ajax['cid'] = $N_item[0]['collection_id']; + } + break; + + case "photos": + case "photo": + case "p": + { + $N_item = $cbphoto->collection->get_next_prev_item($item_id,$cid,$direc); + increment_views($N_item[0]['photo_id'],'photo'); + $ajax['key'] = $N_item[0]['photo_key']; + $ajax['cid'] = $N_item[0]['collection_id']; + + } + break; + } + + if($N_item) + { + assign('type',$t); + assign('user',$userquery->get_user_details($N_item[0]['userid'])); + assign('object',$N_item[0]); + $ajax['content'] = Fetch('view_item.html'); + echo json_encode($ajax); + } else { + return false; + } + } + break; + + case "load_more_items": + case "more_items": + case "moreItems": + { + $cid = mysql_clean($_POST['cid']); + $page = mysql_clean($_POST['page']); + $newPage = $page+1; + $type = mysql_clean($_POST['type']); + $limit = create_query_limit($page,COLLIP); + $order = tbl("collection_items").".ci_id DESC"; + + switch($type) + { + case "videos": + case "video": + case "v": + { + $items = $cbvideo->collection->get_collection_items_with_details($cid,$order,$limit); + } + break; + + case "photos": + case "photo": + case "p": + { + $items = $cbphoto->collection->get_collection_items_with_details($cid,$order,$limit); + } + break; + } + if($items) + { + assign('page_no',$newPage); + assign('type',$type); + assign('cid',$cid); + $itemsArray['pagination'] = Fetch("blocks/new_pagination.html"); + + foreach($items as $item) + { + assign('object',$item); + assign('display_type','view_collection'); + assign('type',$type); + $itemsArray['content'] .= Fetch("blocks/collection.html"); + } + + echo json_encode($itemsArray); + } else + echo json_encode(array("error"=>TRUE)); + } + break; + + + case "add_collection": + { + $name = ($_POST['collection_name']); + $desc = ($_POST['collection_description']); + $tags = (genTags($_POST['collection_tags'])); + $cat = ($_POST['category']); + $type = "photos"; + $CollectParams = + array("collection_name"=>$name,"collection_description"=>$desc,"collection_tags"=>$tags,"category"=>$cat,"type"=>$type,"allow_comments"=>"yes","broadcast"=>"public","public_upload"=>"yes"); + $insert_id = $cbcollection->create_collection($CollectParams); + + if(msg()) + { + $msg = msg_list(); + $msg = '
    '.$msg[0].'
    '; + } + + if(error()) + { + $err = error_list(); + $err = '
    '.$err[0].'
    '; + } + + $ajax['msg'] = $msg; + $ajax['err'] = $err; + $ajax['id'] = $insert_id; + + echo json_encode($ajax); + } + break; + + case "ajaxPhotos": + { + $cbphoto->insert_photo(); + + if(msg()) + { + $msg = msg_list(); + $msg = '
    '.$msg[0].'
    '; + } + + if(error()) + { + $err = error_list(); + $err = '
    '.$err[0].'
    '; + } + + $ajax['msg'] = $msg; + $ajax['err'] = $err; + + echo json_encode($ajax); + } + break; + + case "viewPhotoRating": + { + $pid = mysql_clean($_POST['photoid']); + $returnedArray = $cbphoto->photo_voters($pid); + echo ($returnedArray); + } + break; + + case "channelFeatured": + { + $contentType = $_POST['contentType']; + if(!$contentType) + echo json_encode(array("error"=>lang("content_type_empty"))); + else + { + switch($contentType) + { + case "videos": case "video": + case "vid": case "v": case "vdo": + { + $video = $cbvideo->get_video_details(mysql_clean($_POST['objID'])); + if($video) + { + assign('object',$video); + $content = Fetch('/blocks/view_channel/channel_item.html'); + } + } + break; + + case "photo": case "photos": + case "foto": case "p": + { + $photo = $cbphoto->get_photo(mysql_clean($_POST['objID'])); + if($photo) + { + assign('object',$photo); + $content = Fetch('/blocks/view_channel/channel_item.html'); + } + } + break; + } + + if($content) + { + echo json_encode(array("data"=>$content)); + } else + echo json_encode(array("error"=>"Nothing Found")); + } + } + break; + + case "channelObjects": + { + $contentType = strtolower(mysql_clean($_POST['content'])); + $u = $userquery->get_user_details($_POST['user']); + $assign = $_POST['assign']; + if(is_array($assign)) + { + foreach($assign as $var=>$value) + assign($var,$value); + } + switch($contentType) + { + case "videos" : + { + $videos = get_videos(array("user"=>$u['userid'],"order"=>" date_added DESC","limit"=>config('videos_item_channel_page'))); + + if($videos) + { + foreach($videos as $video) + { + assign('video',$video); + assign('channelVideo',true); + $content['html'] .= Fetch("/blocks/video.html"); + } + $content['html'] .= ''; + } else { + $content['html'] = '
    '.lang('user_have_no_vide').'
    '; + } + } + break; + + case "photos": + { + $photos = get_photos(array("user"=>$u['userid'],"order"=>" date_added DESC","limit"=>config('photo_channel_page'))); + if($photos) + { + foreach($photos as $photo) + { + assign('photo',$photo); + assign('channelPhoto',true); + $content['html'] .= Fetch("/blocks/photo.html"); + } + $content['html'] .= ''; + } else { + $content['html'] = '
    '.lang('User dont have any photos').'
    '; + } + } + break; + + case "groups": + { + $groups = get_groups(array("user"=>$u['userid'],"order"=>" date_added DESC","limit"=>config('photo_channel_page'))); + if($groups) + { + foreach($groups as $group) + { + assign('group',$group); + assign('channelGroup',true); + $content['html'] .= Fetch("/blocks/group.html"); + } + } else { + $content['html'] = '
    '.lang('User dont have any groups.').'
    '; + } + } + break; + + case "collections": + { + $collections = get_collections(array("user"=>$u['userid'],"order"=>" date_added DESC","limit"=>config('collection_channel_page'))); + if($collections) + { + foreach($collections as $collection) + { + assign('collection',$collection); + assign('channelCollection',true); + $content['html'] .= Fetch("/blocks/collection.html"); + } + $content['html'] .= ''; + } else { + $content['html'] = '
    '.lang('User dont have any collections').'
    '; + } + } + break; + + case "friends": + { + $friends = $userquery->get_contacts($u['userid'],'0','yes'); + if($friends) + { + foreach($friends as $friend) + { + assign('user',$friend); + assign('channelUser','friends'); + $content['html'] .= Fetch("/blocks/user.html"); + } + } else { + $content['html'] = '
    '.lang('User dont any friends yet').'
    '; + } + } + break; + + case "subscriptions": + { + $limit = config('users_items_subscriptions'); + $subscriptions = $userquery->get_user_subscriptions($u['userid'],$limit); + if($subscriptions) + { + foreach($subscriptions as $subscription) + { + assign('user',$subscription); + assign('channelUser','subscriptions'); + $content['html'] .= Fetch("/blocks/user.html"); + } + $content['html'] .= ''; + } else { + $content['html'] = '
    '.sprintf(lang('user_no_subscriptions'),$u['username']).'
    '; + } + } + break; + + case "subscribers": + { + $limit = config('users_items_subscribers'); + $subscribers = $userquery->get_user_subscribers_detail($u['userid'],$limit); + if($subscribers) + { + foreach($subscribers as $subscriber) + { + assign('user',$subscriber); + assign('channelUser','subscribers'); + $content['html'] .= Fetch("/blocks/user.html"); + } + $content['html'] .= ''; + } else { + $content['html'] = '
    '.sprintf(lang('user_no_subscribers'),$u['username']).'
    '; + } + } + break; + + case "info": + { + + } + break; + } + + if($content) + echo json_encode($content); + + } + break; + + case "viewCollectionRating": + { + $cid = mysql_clean($_POST['cid']); + $returnedArray = $cbcollection->collection_voters($cid); + echo ($returnedArray); + } + break; + + case "loadAjaxPhotos": + { + $photosType = $_POST['photosType']; + $cond = array("limit"=>config("photo_home_tabs")); + switch($photosType) + { + case "last_viewed": + default: + { + $cond['order'] = " last_viewed DESC"; + } + break; + + case "most_recent": + { + $cond['order'] = " date_added DESC"; + } + break; + + case "featured": + { + $cond['featured'] = "yes"; + } + break; + + case "most_favorited": + { + $cond['order'] = " total_favorites DESC"; + } + break; + + case "most_commented": + { + $cond['order'] = " total_comments DESC"; + } + break; + + case "highest_rated": + { + $cond['order'] = " rating DESC, rated_by DESC"; + } + break; + + case "most_viewed": + { + $cond['order'] = " views DESC"; + } + break; + + case "most_downloaded": + { + $cond['order'] = " downloaded DESC"; + } + break; + } + + $photos = get_photos($cond); + if($photos) + { + foreach($photos as $photo) + { + assign("photo",$photo); + $cond['photoBlocks'] .= Fetch("/blocks/photo.html"); + } + $cond['completed'] = "successfull"; + } else { + $cond['failed'] = "successfully"; + } + + echo json_encode($cond); + } + break; + + /** + * Getting comments along with template + */ + case "getComments": + { + $params = array(); + $limit = config('comments_per_page'); + $page = $_POST['page']; + $params['type'] = mysql_clean($_POST['type']); + $params['type_id'] = mysql_clean($_POST['type_id']); + $params['last_update'] = mysql_clean($_POST['last_update']); + $params['limit'] = create_query_limit($page,$limit); + + $admin = ""; + if($_POST['admin']=='yes' && has_access('admin_access',true)) + { + $params['cache'] ='no'; + $admin = "yes"; + } + $comments = $myquery->getComments($params); + //Adding Pagination + $total_pages = count_pages($_POST['total_comments'],$limit); + assign('object_type',mysql_clean($_POST['object_type'])); + //Pagination + $pages->paginate($total_pages,$page,NULL,NULL,'#page#'); + + assign('comments',$comments); + assign('type',$params['type']); + assign('type_id',$params['type_id']); + assign('last_update',$params['last_update']); + assign('total',$_POST['total_comments']); + assign('total_pages',$total_pages); + assign('comments_voting',$_POST['comments_voting']); + + if($_POST['admin']=='yes' && has_access('admin_access',true)) + Template(BASEDIR.'/'.ADMINDIR.'/'.TEMPLATEFOLDER.'/cbv2/layout/blocks/comments.html',false); + else + Template('blocks/comments/comments.html'); + + assign('commentPagination','yes'); + Template('blocks/pagination.html'); + } + break; + + + + case "get_news": + { + $news = $Cbucket->get_cb_news(); + + if($news) + foreach($news as $n) + { + echo '
    '; + echo '
    + '.$n['title'].' + '.date("m-d-Y",strtotime($n['pubDate'])).'
    + '; + echo '
    '; + echo $n['description']; + echo '
    '; + echo '
    '; + } + else + echo '
    Unable to fetch news
    '; + } + break; + + + case "delete_feed": + { + $uid = mysql_clean($_POST['uid']); + $file = mysql_clean($_POST['file']).'.feed'; + if($uid && $file) + { + if($uid==userid() || has_access("admin_access",true)) + { + $cbfeeds->deleteFeed($uid,$file); + $array['msg'] = lang("feed_has_been_deleted"); + }else + $array['err'] = lang("you_cant_del_this_feed"); + } + echo json_encode($array); + } + break; + + + case "become_contributor" : + { + $uid = userid(); + $cid = $_POST['cid']; + + $array = array(); + + if($cbcollection->add_contributor($cid,$uid)) + { + $array['msg'] = 'Successfully added as contributor'; + } else + { + $array['err'] = error('single'); + } + + + echo json_encode($array); + } + break; + + case "remove_contributor" : + { + $uid = userid(); + $cid = $_POST['cid']; + + $array = array(); + + if($cbcollection->remove_contributor($cid,$uid)) + { + $array['msg'] = 'Successfully removed from contributors'; + } else + { + $array['err'] = error('single'); + } + + + echo json_encode($array); + } + break; + + + default: + header('location:'.BASEURL); + + + } +}else + header('location:'.BASEURL); + +?> \ No newline at end of file diff --git a/upload/api/auth.php b/upload/api/auth.php new file mode 100644 index 00000000..aefa9f5b --- /dev/null +++ b/upload/api/auth.php @@ -0,0 +1,132 @@ +api_keys; +if($api_keys) +{ + if(!in_array($request['api_key'],$api_keys)) + { + exit(json_encode(array('err'=>'App authentication error'))); + } +} + +switch($mode) +{ + case "login": + { + $uDetails = array('username','userid','email','total_videos','total_photos','total_collections','total_groups'); + + $userDetails = array(); + foreach($uDetails as $ud) + { + $userDetails[$ud] = $userquery->udetails[$ud]; + } + + $userDetails['sess_id'] = $_COOKIE['PHPSESSID']; + + + $username = $request['username']; + $password = $request['password']; + + if($userquery->userid) + { + $userDetails['avatar'] = $video['user_photo'] = $video['displayPic'] = $userquery->avatar($userDetails); + exit(json_encode(array('status'=>'ok','userid'=>$userquery->userid,'details'=>$userDetails))); + } + + function onLoginMobile() + { + global $userquery; + + $uDetails = array('username','userid','email','total_videos','total_photos','total_collections','total_groups'); + + $userDetails = array(); + foreach($uDetails as $ud) + { + $userDetails[$ud] = $userquery->udetails[$ud]; + } + + $userDetails['sess_id'] = $_COOKIE['PHPSESSID']; + + $userDetails['avatar'] = $video['user_photo'] = $video['displayPic'] = $userquery->avatar($userDetails); + + exit(json_encode(array('status'=>'ok','userid'=>$userquery->userid,'type'=>'custom','details'=>$userDetails))); + } + + $onLogin = 'onLoginMobile'; + + if(cb_get_functions('signup_page')) cb_call_functions('signup_page'); + + + $userquery->login_user($username,$password); + + if(error()) + { + exit(json_encode(array('status'=>'failed','msg'=>error('single')))); + }else + { + $uDetails = array('username','userid','email','total_videos','total_photos','total_collections','total_groups'); + + $userDetails = array(); + foreach($uDetails as $ud) + { + $userDetails[$ud] = $userquery->udetails[$ud]; + } + + $userDetails['sess_id'] = $_COOKIE['PHPSESSID']; + + $userDetails['avatar'] = $video['user_photo'] = $video['displayPic'] = $userquery->avatar($userDetails); + + exit(json_encode(array('status'=>'ok','userid'=>$userquery->userid,'sess_id'=> $_COOKIE['PHPSESSID'],'details'=>$userDetails))); + } + } + break; + + case "getUser": + case "check_auth": + case "is_logged_in": + case "checkAuth": + case "isLoggedIn": + { + $userid = userid(); + if(!userid()) + exit(json_encode(array('status'=>'failed','msg'=>'User is not logged in','session'=>$_COOKIE['PHPSESSID']))); + else + { + $uDetails = array('username','userid','email','total_videos','total_photos','total_collections','total_groups'); + + $userDetails = array(); + foreach($uDetails as $ud) + { + $userDetails[$ud] = $userquery->udetails[$ud]; + } + + $userDetails['sess_id'] = $_COOKIE['PHPSESSID']; + $userDetails['avatar'] = $video['user_photo'] = $video['displayPic'] = $userquery->avatar($userDetails); + exit(json_encode($userDetails)); + } + } + break; + + case "logout": + { + + $userquery->logout(); + if(cb_get_functions('logout')) cb_call_functions('logout'); + setcookie('is_logout','yes',time()+3600,'/'); + } +} +?> \ No newline at end of file diff --git a/upload/api/file_uploader.php b/upload/api/file_uploader.php new file mode 100644 index 00000000..aca10a84 --- /dev/null +++ b/upload/api/file_uploader.php @@ -0,0 +1,108 @@ + $multiplier * (int) $POST_MAX_SIZE && $POST_MAX_SIZE) +{ + header("HTTP/1.1 500 Internal Server Error"); // This will trigger an uploadError event in SWFUpload + upload_error("POST exceeded maximum allowed size."); + exit(0); +} + +//Checking uploading errors +$uploadErrors = array( + 0 => "There is no error, the file uploaded with success", + 1 => "The uploaded file exceeds the upload_max_filesize directive in php.ini", + 2 => "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form", + 3 => "The uploaded file was only partially uploaded", + 4 => "No file was uploaded", + 6 => "Missing a temporary folder" +); +if (!isset($_FILES['Filedata'])) +{ + upload_error("No file was selected"); + exit(0); +} +else if (isset($_FILES['Filedata']["error"]) && $_FILES['Filedata']["error"] != 0) +{ + upload_error($uploadErrors[$_FILES['Filedata']["error"]]); + exit(0); +} +else if (!isset($_FILES['Filedata']["tmp_name"]) || !@is_uploaded_file($_FILES['Filedata']["tmp_name"])) +{ + upload_error("Upload failed is_uploaded_file test."); + exit(0); +} +else if (!isset($_FILES['Filedata']['name'])) +{ + upload_error("File has no name."); + exit(0); +} + +//Check file size +$file_size = @filesize($_FILES['Filedata']["tmp_name"]); +if (!$file_size || $file_size > $max_file_size_in_bytes) +{ + upload_error("File exceeds the maximum allowed size"); + exit(0); +} + + +//Checking file type +$types_array = preg_replace('/,/', ' ', $types); +$types_array = explode(' ', $types_array); +$file_ext = strtolower(getExt($_FILES['Filedata']['name'])); +if (!in_array($file_ext, $types_array)) +{ + upload_error("Invalid file extension"); + exit(0); +} + + +move_uploaded_file($tempFile, $targetFile); + +$Upload->add_conversion_queue($targetFileName, $file_directory); + +//exec(php_path()." -q ".BASEDIR."/actions/video_convert.php &> /dev/null &"); +if (stristr(PHP_OS, 'WIN')) +{ + exec(php_path() . " -q " . BASEDIR . "/actions/video_convert.php $targetFileName"); +} +else +{ + exec(php_path() . " -q " . BASEDIR . "/actions/video_convert.php $targetFileName &> /dev/null &"); +} + +$status_array['success'] = 'yes'; +$status_array['file_name'] = $file_name; + +echo json_encode($status_array); + +//function used to display error +function upload_error($error) +{ + echo json_encode(array("error" => $error)); +} + +?> \ No newline at end of file diff --git a/upload/api/get.php b/upload/api/get.php new file mode 100644 index 00000000..08bad370 --- /dev/null +++ b/upload/api/get.php @@ -0,0 +1,676 @@ +api_keys; +if ($api_keys) { + if (!in_array($request['api_key'], $api_keys)) { + exit(json_encode(array('err' => 'App authentication error'))); + } +} + +switch ($mode) { + case "getVideos": + case "get_videos": + default: { + $blacklist_fields = array( + 'password', 'video_password', 'avcode', 'session' + ); + + $get_limit = create_query_limit($page, $videos_limit); + + $request['limit'] = $get_limit; + + if (VERSION < 3) + $request['user'] = $request['userid']; + + //$request['order'] = tbl('video.'.$request['order']); + + $vids = $request['video_id']; + + if ($vids) { + $vids = explode(',', $vids); + + $request['videoids'] = $vids; + } + + if($is_mobile) + $request['has_mobile'] = 'yes'; + + $videos = $cbvid->get_videos($request); + header('Content-Type: text/html; charset=utf-8'); + + $new_videos = array(); + if ($videos) { + foreach ($videos as $video) { + + $video['title'] = utf8_encode($video['title']); + $video['description'] = utf8_encode($video['description']); + $video['thumbs'] = array('default' => get_thumb($video), 'big' => get_thumb($video, 'big')); + + if (function_exists('get_mob_video')) { + $video['videos'] = array('mobile' => get_mob_video(array('video' => $video))); + if (has_hq($video)) { + $video['videos']['hq'] = get_hq_video_file($video); + } + } + $video['url'] = $video['video_link'] = $video['videoLink'] = videoLink($video); + $video['avatar'] = $video['user_photo'] = $video['displayPic'] = $userquery->avatar($video); + + /* + if (!$video['fullname']) + { + $video['userDetail'] = $userquery->get_user_details($video['userid']); + } + */ + + foreach ($blacklist_fields as $field) + unset($video[$field]); + + $new_videos[] = $video; + } + } + //echo $db->db_query; + echo json_encode($new_videos); + } + break; + + case "getComments": { + $params = array(); + $limit = config('comments_per_page'); + $page = $request['page']; + + if (!$page || !is_numeric($page) || $page < 1) + $page = 1; + + if (!$limit || !is_numeric($limit) || $limit < 1) + $limit = 20; + + + $params['type'] = mysql_clean($request['type']); + $params['type_id'] = mysql_clean($request['type_id']); + $params['last_update'] = mysql_clean($request['last_update']); + $params['limit'] = create_query_limit($page, $limit); + + $comments = $myquery->getComments($params); + + $blacklist_fields = array( + 'password', 'video_password', 'avcode', 'session' + ); + + $the_comments = array(); + + if ($comments) + foreach ($comments['comments'] as $comment) { + if ($comment) { + + foreach ($blacklist_fields as $field) { + unset($comment[$field]); + } + $the_comments[] = $comment; + } + } + + + echo json_encode($the_comments); + } + break; + + case "getCategory": + case "getCategories": { + $type = $request['type']; + switch ($type) { + case "v": + case "video": + case "videos": + default: { + $categories = $cbvid->getCbCategories(arraY('indexes_only' => true)); + } + break; + + case "u": + case "user": + case "users": { + $categories = $userquery->getCbCategories(arraY('indexes_only' => true)); + } + + break; + + case "g": + case "group": + case "groups": { + $categories = $cbgroup->getCbCategories(arraY('indexes_only' => true)); + } + + case "p": + case "photo": + case "photos": { + $categories = $cbcollection->getCbCategories(arraY('indexes_only' => true)); + } + } + echo json_encode($categories); + } + break; + + case 'getFields': + case 'get_fields': { + $groups = $Upload->load_video_fields(null); + + $new_groups = array(); + foreach ($groups as $group) { + $new_fields = array(); + + foreach ($group['fields'] as $field) { + // foreach($fields as $field) + if ($field) + $new_fields[] = $field; + } + + $group['fields'] = $new_fields; + $new_groups[] = $group; + } + + //pr($new_groups,true); + echo json_encode($new_groups); + } + break; + case "get_playlists": + case "getPlaylists": { + $uid = mysql_clean($request['userid']); + + $playlists = $cbvid->action->get_playlists($uid); + + if (VERSION < 3) { + $new_playlists = array(); + foreach ($playlists as $playlist) { + $playlist['total_items'] = $cbvid->action->count_playlist_items($playlist['playlist_id']); + $new_playlists[] = $playlist; + } + + $playlists = $new_playlists; + } + + if ($playlists) + echo json_encode($playlists); + else + echo json_encode(array('err' => 'No playlist was found')); + } + + break; + case "get_playlist_items": + case "getPlaylistItems": { + $pid = mysql_clean($request['playlist_id']); + $items = $cbvid->get_playlist_items($pid); + + $blacklist_fields = array( + 'password', 'video_password', 'avcode', 'session' + ); + + if ($items) { + $new_videos = array(); + + foreach ($items as $video) { + if (!$video['email']) { + $udetails = $userquery->get_user_details($video['userid']); + } + + $video = array_merge($video, $udetails); + + $video['thumbs'] = array('default' => get_thumb($video)); + $video['videos'] = array('mobile' => get_mob_video(array('video' => $video))); + $video['url'] = $video['video_link'] = $video['videoLink'] = videoLink($video); + $video['avatar'] = $video['user_photo'] = $video['displayPic'] = $userquery->avatar($video); + + foreach ($blacklist_fields as $field) + unset($video[$field]); + + $new_videos[] = $video; + } + echo json_encode($new_videos); + }else + echo json_encode(array('err' => 'No items in this playlist')); + } + break; + + case "getConfigs": + case "get_configs": + case "configs": { + $upload_path = ''; + + if (function_exists('get_file_uploader_path')) + $upload_path = get_file_uploader_path(); + + $array = array( + 'baseurl' => BASEURL, + 'title' => TITLE, + 'file_upload_url' => BASEURL . '/api/file_uploader.php', + 'session' => session_id() + ); + + echo json_encode($array); + } + + break; + + case "videoFlagOptions": + case "video_flag_options": { + $type = $request['type']; + $type = $type ? $type : 'v'; + + $flags = get_flag_options($type); + + echo json_encode($flags); + } + + + break; + case "getSubscribers": { + $uid = $request['userid']; + if (!$uid) + $uid = userid(); + + if (!$uid) + exit(json_encode(array('err' => lang('Please login')))); + + $subscribers = $userquery->get_user_subscribers_detail($uid); + + if ($subscribers) { + $the_subscribers = array(); + foreach ($subscribers as $subscriber) { + foreach ($blacklist_fields as $field) { + unset($subscriber[$field]); + } + $the_subscribers[] = $subscriber; + } + + $subscribers = $the_subscribers; + } + + + if ($the_subscribers) + echo json_encode($the_subscribers); + else + echo json_encode(array('err' => lang('No Subscribers'))); + + exit(); + } + break; + + case "getSubscriptions": { + $uid = $request['userid']; + if (!$uid) + $uid = userid(); + + if (!$uid) + exit(json_encode(array('err' => lang('Please login')))); + + $subscribers = $userquery->get_user_subscriptions($uid); + + if ($subscribers) { + $the_subscribers = array(); + foreach ($subscribers as $subscriber) { + foreach ($blacklist_fields as $field) { + unset($subscriber[$field]); + } + $the_subscribers[] = $subscriber; + } + + $subscribers = $the_subscribers; + } + + if ($the_subscribers) + echo json_encode($the_subscribers); + else + echo json_encode(array('err' => lang('No Subscriptions'))); + + exit(); + } + break; + + + case "get_favorite_videos": + case "getFavoriteVideos": { + $limit = 20; + + $get_limit = create_query_limit($page, $limit); + $uid = $request['userid']; + if (!$uid) + $uid = userid(); + + $params = array('userid' => $uid, 'limit' => $get_limit); + $videos = $cbvid->action->get_favorites($params); + $params['count_only'] = "yes"; + $total_rows = $cbvid->action->get_favorites($params); + $total_pages = count_pages($total_rows, $get_limit); + + if ($total_rows > 0) { + $new_videos = array(); + foreach ($videos as $video) { + if (!$video['email']) { + $udetails = $userquery->get_user_details($video['userid']); + } + + $video = array_merge($video, $udetails); + + $video['thumbs'] = array('default' => get_thumb($video)); + $video['videos'] = array('mobile' => get_mob_video(array('video' => $video))); + $video['url'] = $video['video_link'] = $video['videoLink'] = videoLink($video); + $video['avatar'] = $video['user_photo'] = $video['displayPic'] = $userquery->avatar($video); + + foreach ($blacklist_fields as $field) + unset($video[$field]); + + + $new_videos[] = $video; + } + echo json_encode($new_videos); + } else { + echo json_encode(array('err' => lang('No favorite videos were found'))); + } + } + break; + + case "get_users": + case "get_channels": + case "getChannels": + case "getUsers": { + $get_limit = create_query_limit($page, $videos_limit); + + $request['limit'] = $get_limit; + + $users = get_users($request); + + $new_users = array(); + if ($users) { + foreach ($users as $user) { + $user['avatar'] = $user['user_photo'] = $userquery->avatar($user); + $new_users[] = $user; + } + } + + + $user_api_fields = array( + 'username', 'first_name', 'last_name', 'fullname', + 'avatar', 'avatar_url', + 'userid', 'email', + 'total_videos', + 'total_photos', 'total_collections', + 'total_groups'); + + + $final_users = array(); + if ($new_users) + foreach ($new_users as $user) { + $final_user = array(); + + foreach ($user_api_fields as $field) + $final_user[$field] = $user[$field]; + + $final_users[] = $final_user; + } + + //echo $db->db_query; + echo json_encode($final_users); + } + break; + + case "getPhotos": + case "get_photos": { + + $get_limit = create_query_limit($page, $videos_limit); + + $request['limit'] = $get_limit; + + if (VERSION < 3) + $request['user'] = $request['userid']; + + //$request['order'] = tbl('video.'.$request['order']); + + $photos = $cbphoto->get_photos($request); + header('Content-Type: text/html; charset=utf-8'); + + $new_photos = array(); + if ($photos) { + foreach ($photos as $photo) { + + $photo['photo_title'] = utf8_encode($photo['photo_title']); + $photo['photo_description'] = utf8_encode($photo['photo_description']); + $photo['photo_link'] = $cbphoto->photo_links($photo, 'view_photo'); + + $photo['photo_thumb'] = array( + 'm' => get_image_file(array( + 'details' => $photo, + 'size' => 'm', + 'output' => 'non_html' + )), + 'l' => get_image_file(array( + 'details' => $photo, + 'size' => 'l', + 'output' => 'non_html' + )) + ); + + //$photo['thumbs'] = array('default' => get_thumb($photo), 'big' => get_thumb($photo, 'big')); + + $new_photos[] = $photo; + } + } + //echo $db->db_query; + echo json_encode($new_photos); + } + break; + + case "getFriends": + { + $uid = $request['userid']; + if (!$uid) + $uid = userid(); + + if (!$uid) + exit(json_encode(array('err' => lang('Please Login')))); + + $friends = $userquery->get_contacts($uid); + + if ($friends) + echo json_encode($friends); + else + echo json_encode(array('err' => error('single'))); + } + break; + + case "get_groups": + case "getGroups": + { + $get_limit = create_query_limit($page, $content_limit); + + $request['limit'] = $get_limit; + + $groups = $cbgroup->get_groups($request); + + if ($groups) + echo json_encode($groups); + else + echo json_encode(array('err' => error('single'))); + } + break; + + + case "get_topics": + case "getTopics": + { + $gid = mysql_clean($request['group_id']); + $page = mysql_clean($request['page']); + + $topics_limit = 20; + $get_limit = create_query_limit($page, $topics_limit); + + $params = array('group' => $gid,'limit' => $get_limit); + $topics = $cbgroup->get_group_topics($params); + + if ($topics) + echo json_encode($topics); + else + echo json_encode(array('err' => error())); + } + break; + + case "get_feeds": + case "getFeeds": + { + $id = mysql_clean($request['id']); + $page = mysql_clean($request['page']); + $type = mysql_clean($request['type']); + + $limit = 20; + $get_limit = create_query_limit($page, $limit); + + $params = array('id' => $id,'limit' => $get_limit,'type'=> $type); + $feeds = $cbfeeds->get_feeds($params); + $the_feeds = array(); + if ($feeds) + { + foreach ($feeds as $feed) + { + $feed['comments'] = json_encode($feed['comments']); + $the_feeds[] = $feed; + } + echo json_encode($the_feeds); + } + + else + echo json_encode(array('err' => error())); + } + break; + + + case "home_page": { + define('API_HOME_PAGE','yes'); + + $videos = $cbvid->get_videos(array('featured' => 'yes', 'limit' => 10, 'order' => 'featured_date DESC' + ,'has_mobile'=>'yes')); + + $new_videos = array(); + if ($videos) { + foreach ($videos as $video) { + + $video['title'] = utf8_encode($video['title']); + $video['description'] = utf8_encode($video['description']); + $video['thumbs'] = array('default' => get_thumb($video), 'big' => get_thumb($video, 'big'),'640x480'=>get_thumb($video, '640x480')); + + if (function_exists('get_mob_video')) + { + $video['videos'] = array('mobile' => get_mob_video(array('video' => $video))); + if ($video['has_hd']=='yes') { + $video['videos']['hq'] = get_hq_video_file($video); + } + } + $video['url'] = $video['video_link'] = $video['videoLink'] = videoLink($video); + $video['avatar'] = $video['user_photo'] = $video['displayPic'] = $userquery->avatar($video); + $video['avatars']['medium'] = $userquery->avatar($video,'small'); + $video['avatars']['xmedium'] = $userquery->avatar($video,'xmedium'); + $video['avatars']['large'] = $userquery->avatar($video,'large'); + $new_videos[] = $video; + } + } + + $featured = $new_videos; + + $categories = $cbvid->getCbCategories(array( + 'cond' => " ( category_id = '1' OR category_id = '16' OR category_id = '26' OR category_id = '15' ) ", + 'limit' => 4, + 'type' => 'v' + )); + + + $cat_videos = array(); + + foreach($categories as $category) + { + $cat_vid = array( + 'name' => $category['category_name'], + 'id' => $category['category_id'], + ); + + $videos = $cbvid->get_videos(array('limit'=>10,'category'=>$category['category_id'],'order'=>' date_added desc ')); + + $new_videos = array(); + if ($videos) { + foreach ($videos as $video) { + + $video['title'] = utf8_encode($video['title']); + $video['description'] = utf8_encode($video['description']); + $video['thumbs'] = array('default' => get_thumb($video), 'big' => get_thumb($video, 'big'),'640x480'=>get_thumb($video, '640x480')); + + if (function_exists('get_mob_video')) + { + $video['videos'] = array('mobile' => get_mob_video(array('video' => $video))); + if ($video['has_hd']=='yes') { + $video['videos']['hq'] = get_hq_video_file($video); + } + } + $video['url'] = $video['video_link'] = $video['videoLink'] = videoLink($video); + $video['avatar'] = $video['user_photo'] = $video['displayPic'] = $userquery->avatar($video); + $video['avatars']['medium'] = $userquery->avatar($video,'medium'); + $video['avatars']['xmedium'] = $userquery->avatar($video,'xmedium'); + $video['avatars']['large'] = $userquery->avatar($video,'large'); + + $new_videos[] = $video; + } + } + $cat_vid['videos'] = $new_videos; + $cat_videos[] = $cat_vid; + } + + $home = array( + 'featured' => $featured, + 'categories' => $cat_videos + ); + + echo json_encode($home); + } + break; + + case "get_user": + case "get_channel": + case "getChannel": + case "getUser": { + + $userid = mysql_clean($request['userid']); + $user = array(); + if($userid) + $user = $userquery->get_user_details_with_profile($userid); + + + if ($user) { + + $user['avatar'] = $user['user_photo'] = $userquery->avatar($user); + $user['avatars']['medium'] = $userquery->avatar($user,'medium'); + $user['avatars']['xmedium'] = $userquery->avatar($user,'xmedium'); + $user['avatars']['large'] = $userquery->avatar($user,'large'); + // $user['name'] = name($user); + echo json_encode($user); + }else + echo json_encode(array('err'=>'User does not exist')); + } + break; + +} +?> \ No newline at end of file diff --git a/upload/api/global.php b/upload/api/global.php new file mode 100644 index 00000000..ee39c86c --- /dev/null +++ b/upload/api/global.php @@ -0,0 +1,45 @@ + \ No newline at end of file diff --git a/upload/api/pm.php b/upload/api/pm.php new file mode 100644 index 00000000..654a74b6 --- /dev/null +++ b/upload/api/pm.php @@ -0,0 +1,132 @@ +api_keys; +if ($api_keys) { + if (!in_array($request['api_key'], $api_keys)) { + exit(json_encode(array('err' => 'App authentication error'))); + } +} + +if (!userid()) { + exit(json_encode(array('err' => 'User not logged in'))); +} + +switch ($mode) { + + case "getThreads": + case "get_threads": + { + $get_limit = create_query_limit($page, $content_limit); + + $request['limit'] = $get_limit; + + $threads = $cbpm->get_threads($request); + + if ($threads) + echo json_encode($threads); + else + echo json_encode (array('err' => 'No Threads were Found')); + } + break; + + case "getThread": + case "get_thread": + { + + $tid = $request['thread_id']; + $thread = $cbpm->get_thread($tid); + + if ($thread) + echo json_encode($thread); + else + echo json_encode (array('err' => 'Thread Not Found')); + } + break; + + case "getMessages": + case "get_messages": + { + $get_limit = create_query_limit($page, $content_limit); + + $request['limit'] = $get_limit; + + $messages = $cbpm->get_messages($request); + + if ($messages) + echo json_encode($messages); + else + echo json_encode (array('err' => 'No Messages were Found')); + } + break; + + case "getNewMessages": + case "get_new_messages": + { + $get_limit = create_query_limit($page, $content_limit); + + $request['limit'] = $get_limit; + + $messages = $cbpm->get_new_messages($request); + + if ($messages) + echo json_encode($messages); + else + echo json_encode (array('err' => 'No New Messages were Found')); + } + break; + + case "sendMessage":case "send_message":case "send_msg":case "sndMsg": + + { + + //recipients[]=11 + //message=tessttttinggggg + //thread_id=xyz + + $tid = $request['thread_id']; + if (!$tid) + { + //create new thread + $recipients = json_decode ($request['recipients']); + + $new_thread_id = $cbpm->create_thread(array('recipients'=>$recipients)); + + if (!$new_thread_id) + { + echo json_encode (array('err' => error())); + exit(); + } + + echo json_encode(array('thread_id' => $response)); + $request['thread_id'] = $new_thread_id; + } + + $response = $cbpm->send_message($request); + + if ($response) + echo json_encode(array('message_id' => $response)); + else + echo json_encode (array('err' => error())); + } + break; + + default: + echo json_encode(array('err' => array(lang('Invalid request')))); + break; +} +?> \ No newline at end of file diff --git a/upload/api/push.php b/upload/api/push.php new file mode 100644 index 00000000..003feaaa --- /dev/null +++ b/upload/api/push.php @@ -0,0 +1,87 @@ +insert(tbl('token'),array('token'),array($token)); + if ($response) + echo json_encode(array('success'=>'yes','msg'=>'token saved successfully')); + else + echo json_encode(array('err'=> lang(error('single')))); + } + break; + default:{ + + + } + +} + +function send_video_notification($videoId){ + global $myquery ,$db; + #checking if we have vid , so fetch the details + if(!empty($videoId)) + $vdetails = $myquery->get_video_details($videoId); + + $title=$vdetails['title']; + // Put your private key's passphrase here: + $passphrase = 'janjuajanjua'; + + //////////////////////////////////////////////////////////////////////////////// + + $ctx = stream_context_create(); + stream_context_set_option($ctx, 'ssl', 'local_cert', 'E:\wamp\www\clipbucket_bug1\api\apns-dev.pem'); + stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase); + + // Open a connection to the APNS server + $fp = stream_socket_client( + 'ssl://gateway.sandbox.push.apple.com:2195', $err, + $errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx); + + if (!$fp) + exit("Failed to connect: $err $errstr" . PHP_EOL); + + echo 'Connected to APNS' . PHP_EOL; + + + + $token_result = $db->select(tbl('token'),'token'); + if($token_result){ + foreach($token_result as $token_value) + { + // Create the pahanyload body + + $payload['aps'] = array('alert' => "'".$title."' has been Featured.", 'sound' => 'default'); + $payload['details'] = array('type' => 'featured','videoId' => $videoId, 'title' => $title); + $output = json_encode($payload); + + + + // Build the binary notification + $msg = chr(0) . pack('n', 32) . pack('H*', $token_value['token']) . pack('n', strlen($output)) . $output; + + // Send it to the server + $result = fwrite($fp, $msg, strlen($msg)); + + } + if (!$result) + echo 'Messages not delivered' . PHP_EOL; + else + echo 'Messages successfully delivered' . PHP_EOL; + + } + else + return json_encode(array('err'=> lang(error('single')))); + + // Close the connection to the server + fclose($fp); + +} + diff --git a/upload/api/put.php b/upload/api/put.php new file mode 100644 index 00000000..248baca0 --- /dev/null +++ b/upload/api/put.php @@ -0,0 +1,595 @@ +api_keys; +if($api_keys) +{ + if(!in_array($request['api_key'],$api_keys)) + { + exit(json_encode(array('err'=>'App authentication error'))); + } +} + +switch ($mode) { + case "upload_video": { + echo json_encode($_POST,$_FILES); + } + break; + + case "addComment": { + $type = $request['type']; + switch ($type) { + case 'v': + case 'video': + { + $id = mysql_clean($request['obj_id']); + $comment = $request['comment']; + if ($comment == 'undefined') + $comment = ''; + $reply_to = $request['reply_to']; + + $cid = $cbvid->add_comment($comment, $id, $reply_to); + } + break; + case 'u': + case 'c': { + + $id = mysql_clean($request['obj_id']); + $comment = $request['comment']; + if ($comment == 'undefined') + $comment = ''; + $reply_to = $request['reply_to']; + + $cid = $userquery->add_comment($comment, $id, $reply_to); + } + break; + case 't': + case 'topic': { + + $id = mysql_clean($request['obj_id']); + $comment = $request['comment']; + if ($comment == 'undefined') + $comment = ''; + $reply_to = $request['reply_to']; + + $cid = $cbgroup->add_comment($comment, $id, $reply_to); + } + break; + + case 'cl': + case 'collection': { + $id = mysql_clean($request['obj_id']); + $comment = $request['comment']; + if ($comment == 'undefined') + $comment = ''; + $reply_to = $request['reply_to']; + + $cid = $cbcollection->add_comment($comment, $id, $reply_to); + } + break; + + case "p": + case "photo": { + $id = mysql_clean($request['obj_id']); + $comment = $request['comment']; + if ($comment == 'undefined') + $comment = ''; + $reply_to = $request['reply_to']; + $cid = $cbphoto->add_comment($comment, $id, $reply_to); + } + break; + + case 'f': + case 'feed': { + + $id = mysql_clean($request['obj_id']); + $comment = $request['comment']; + if ($comment == 'undefined') + $comment = ''; + $reply_to = $request['reply_to']; + + $cid = $cbfeeds->add_comment($comment, $id, $reply_to); + } + break; + default: + echo json_encode(array('err' => 'Invalid Type')); + exit(); + break; + } + + + if (error()) { + exit(json_encode(array('err' => error(), 'session' => $_COOKIE['PHPSESSID']))); + } + + $comment = $myquery->get_comment($cid); + + $array = array( + 'msg' => msg(), + 'comment' => $comment, + 'success' => 'ok', + 'cid' => $cid + ); + + echo json_encode($array); + } + break; + + case "create_playlist": + case "addPlaylist": + case "add_playlist": + { + $array = array( + 'name', + 'description', + 'tags', + 'playlist_type', + 'privacy', + 'allow_comments', + 'allow_rating', + 'type', + ); + + $type = $request['type']; + + $input = array(); + foreach ($array as $ar) { + $input[$ar] = mysql_clean($request[$ar]); + } + + + if ($type == 'v' || !isset($type)) + $pid = $cbvid->action->create_playlist($input); + + if (!$type) + e(lang("Invalid playlist type")); + + if(VERSION>2.7) + $rel = get_rel_list(); + + + if (error()) { + + $rel = array(); + + + + echo json_encode(array('err' => error(), 'rel' => $rel)); + } else { + $playlist = $cbvid->action->get_playlist($pid); + + echo json_encode(array('success' => 'yes', 'rel' => $rel, + 'pid' => $pid, 'playlist' => $playlist, + 'msg' => msg())); + } + } + break; + + case "delete_playlist": { + $pid = mysql_clean($request['playlist_id']); + $cbvid->action->delete_playlist($pid); + + if (error()) { + echo json_encode(array('err' => error())); + } else { + echo json_encode(array('msg' => array(lang('Playlist has been removed')))); + } + } + break; + + + case "add_playlist_item": { + + $type = $request['type']; + $pid = mysql_clean($request['playlist_id']); + $id = mysql_clean($request['object_id']); + // $note = mysql_clean(post('note')); + + switch ($type) { + case 'v': + default: { + $item_id = $cbvid->action->add_playlist_item($pid, $id); + + if (!error()) { + updateObjectStats('plist', 'video', $id); + echo json_encode(array('status' => 'ok', + 'msg' => msg(), 'item_id' => $item_id, 'updated' => nicetime(now()))); + } else { + echo json_encode(array('err' => error())); + } + } + } + } + break; + + case "remove_playlist_item": + { + $item_id = mysql_clean($request['item_id']); + $cbvid->action->delete_playlist_item($item_id); + if(error()) + echo json_encode(array('err'=>error())); + else + echo json_encode(array('success'=>'ok')); + } + break; + + case "delete_favorite": + { + $video_id = mysql_clean($request['videoid']); + $cbvid->action->remove_favorite($video_id); + if(error()) + echo json_encode(array('err'=>error())); + else + echo json_encode(array('success'=>'ok','msg' => lang('Video has been removed'))); + } + break; + + case "add_favorite": + { + $video_id = mysql_clean($request['videoid']); + $cbvid->action->add_to_fav($video_id); + if(error()) + echo json_encode(array('err'=>error())); + else + echo json_encode(array('success'=>'ok','msg' => lang('Video has been added'))); + } + break; + + case "insert_video": { + $title = $request['title']; + $file_name = time(). RandomString(5); + + $file_directory = createDataFolders(); + + $vidDetails = array + ( + 'title' => $title, + 'description' => $title, + 'tags' => genTags(str_replace(' ', ', ', $title)), + 'category' => array($cbvid->get_default_cid()), + 'file_name' => $file_name, + 'file_directory' => $file_directory, + 'userid' => userid(), + ); + + $vid = $Upload->submit_upload($vidDetails); + + echo json_encode(array('success' => 'yes', + 'vid' => $vid,'file_directory'=>$file_directory, + 'file_name'=>$file_name)); + } + break; + + case "update_video":{ + + //Setting up the categories.. + $request['category'] = explode(',',$request['category']); + $request['videoid'] = trim($request['videoid']); + + $_POST = $request; + + $Upload->validate_video_upload_form(); + + if (empty($eh->error_list)) { + $cbvid->update_video(); + } + + + + if (error()) + echo json_encode(array('error' => error('single'))); + else + echo json_encode(array('msg' => msg('single'))); + + } + + + break; + case "rating": + { + + $type = mysql_clean($request['type']); + $id = mysql_clean($request['id']); + $rating = mysql_clean($request['rating']); + + switch($type){ + case "video": + case "v": + { + $result = $cbvid->rate_video($id,$rating); + echo json_encode(array('success'=>'ok')); + } + break; + + case "photo": + { + $rating = $_POST['rating']*2; + $id = $_POST['id']; + $result = $cbphoto->rate_photo($id,$rating); + $result['is_rating'] = true; + $cbvid->show_video_rating($result); + + $funcs = cb_get_functions('rate_photo'); + if($funcs) + foreach($funcs as $func) + { + $func['func']($id); + } + } + break; + case "collection": + { + $rating = $_POST['rating']*2; + $id = $_POST['id']; + $result = $cbcollection->rate_collection($id,$rating); + $result['is_rating'] = true; + $cbvid->show_video_rating($result); + + $funcs = cb_get_functions('rate_collection'); + if($funcs) + foreach($funcs as $func) + { + $func['func']($id); + } + } + break; + + case "user": + { + $rating = $_POST['rating']*2; + $id = $_POST['id']; + $result = $userquery->rate_user($id,$rating); + $result['is_rating'] = true; + $cbvid->show_video_rating($result); + + $funcs = cb_get_functions('rate_user'); + if($funcs) + foreach($funcs as $func) + { + $func['func']($id); + } + } + break; + } + } + break; + + case 'flag_object': + { + $type = strtolower($request['type']); + $id = $request['id']; + switch($type) + { + case 'v': + case 'video': + default: + { + + $reported = $cbvideo->action->report_it($id); + } + break; + + case 'g': + case 'group': + default: + { + // $id = $_POST['id']; + $cbgroup->action->report_it($id); + } + break; + + case 'u': + case 'user': + default: + { + //$id = $_POST['id']; + $userquery->action->report_it($id); + } + break; + + case 'p': + case 'photo': + { + //$id = $_POST['id']; + $cbphoto->action->report_it($id); + } + break; + + case "cl": + case "collection": + { + //$id = $_POST['id']; + $cbcollection->action->report_it($id); + } + break; + + } + + if(msg()) + { + $msg = msg_list(); + echo json_encode(array('success'=>'yes','msg'=>$msg[0])); + } + if(error()) + { + $msg = error_list(); + echo json_encode(array('err'=>$msg[0])); + } + + } + break; + + + case "removeVideo": + case "remove_video": + case "deleteVideo": + case "delete_video": + { + $vid = $request['vid']; + $vid = mysql_clean($vid); + $cbvideo->delete_video($vid); + + if(error()) + { + $error = error_list(); + $the_error = $error[0]; + echo json_encode(array('err'=>$the_error)); + }else + { + $msg = msg_list(); + $the_msg = $msg[0]; + + echo json_encode(array('msg'=>$the_msg,'success'=>'yes')); + } + } + break; + + case "subscribe": + { + $to = $request['to']; + $to = mysql_clean($to); + $subscribe_to = $to; + $userquery->subscribe_user($subscribe_to); + + if(msg()) + { + $msg = msg_list(); + echo json_encode(array('msg' => $msg[0],'success'=>'yes')); + + } + if(error()) + { + $msg = error_list(); + echo json_encode(array('err' => $msg[0])); + } + } + break; + + case "unsubscribe": + { + $to = $request['to']; + $to = mysql_clean($to); + $subscribe_to = $to; + $userquery->unsubscribe_user($subscribe_to); + + if(msg()) + { + $msg = msg_list(); + echo json_encode(array('msg' => $msg[0],'success'=>'yes')); + + } + if(error()) + { + $msg = error_list(); + echo json_encode(array('err' => $msg[0])); + } + } + break; + + case "edit_video": + case "editVideo": + { + $vid = mysql_clean($request['videoid']); + $Upload->validate_video_upload_form(); + if(empty($eh->error_list)) + { + $_POST = $request; + $cbvid->update_video(); + + //$cbvid->set_default_thumb($vid,mysql_clean(post('default_thumb'))); + $vdetails = $cbvid->get_video_details($vid); + echo json_encode(array('success'=>'yes','vdetails'=>$vdetails)); + } + else + { + echo json_encode(array('err'=>error())); + } + } + break; + + + case addFriend: + case add_friend: + { + $uid = mysql_clean($request['userid']); + $fid = mysql_clean($request['fid']); + $message = mysql_clean($request['message']); + + if (!$uid) + $uid = userid(); + + if (!$uid) + exit(json_encode(array('err' => lang('Please Login')))); + + if (!$fid) + exit(json_encode(array('err' => lang('Please Select a User')))); + + + $params = array('userid'=>$uid,'friend_id'=>$fid,'message'=>$message); + + $request_id = $userquery->add_friend_request($params); + + if ($request_id) + echo json_encode(array('success'=>'yes','request_id'=>$request_id)); + else + echo json_encode(array('err'=> lang(error('single')))); + } + break; + + case removeFriend: + case remove_friend: + case unFriend: + case unfriend: + { + $uid = mysql_clean($request['userid']); + $fid = mysql_clean($request['fid']); + + if (!$uid) + $uid = userid(); + + if (!$uid) + exit(json_encode(array('err' => lang('Please Login')))); + + if (!$fid) + exit(json_encode(array('err' => lang('Please Select a User')))); + + if ($fid == $uid) + exit(json_encode(array('err' => lang('Invalid User')))); + + $response = $userquery->unfriend($fid,$uid); + + if ($response) + echo json_encode(array('success'=>'yes','msg'=>'Removed from Friends')); + else + echo json_encode(array('err'=> lang(error('single')))); + } + break; + + case "like_feed": + case "addLike": + { + $liked = mysql_clean($request['liked']); + $feed_id = mysql_clean($request['feed_id']); + + $response = $cbfeeds->like_feed(array('feed_id' => $feed_id, 'liked' => $liked)); + if ($response) + echo json_encode(array('success'=>'yes','msg'=>'Like/Unlike saved')); + else + echo json_encode(array('err'=> lang(error('single')))); + } + break; + + default: + exit(json_encode(array('err'=>lang('Invalid request')))); +} +?> \ No newline at end of file diff --git a/upload/api/sample_getVideos.json b/upload/api/sample_getVideos.json new file mode 100644 index 00000000..61d04562 --- /dev/null +++ b/upload/api/sample_getVideos.json @@ -0,0 +1,73 @@ +{ + "videoid":"1245", + "videokey":"RY5kpDO6BvoO", + "slug_id":"63", + "video_password":"", + "video_users":" ", + "username":"admin", + "userid":"1", + "title":"Test4", + "flv":"", + "file_name":"1342165436bcc04", + "description":"Test4", + "tags":"Test4", + "category":"#20# ", + "category_parents":"", + "broadcast":"private", + "location":"", + "datecreated":"2012-07-13", + "country":"0", + "allow_embedding":"yes", + "rating":"0", + "rated_by":"0", + "voter_ids":"", + "allow_comments":"yes", + "comment_voting":"yes", + "comments_count":"0", + "last_commented":"0000-00-00 00:00:00", + "subscription_email":"pending", + "featured":"no", + "featured_date":"0000-00-00 00:00:00", + "featured_description":"", + "allow_rating":"yes", + "active":"yes", + "favourite_count":"0", + "playlist_count":"0", + "views":"0", + "last_viewed":"2012-07-25 23:42:29", + "date_added":"2012-07-13 12:43:59", + "flagged":"no", + "duration":"1", + "status":"Processing", + "failed_reason":"none", + "flv_file_url":null, + "default_thumb":"0", + "aspect_ratio":"", + "embed_code":"none", + "refer_url":"", + "downloads":"0", + "uploader_ip":"127.0.0.1", + "has_sprite":"0", + "sprite_thumbs_no":"0", + "tr_stored_thumbs":"0", + "mass_embed_status":"no", + "is_hd":"no", + "ebay_epn_keywords":"", + "ebay_pre_desc":"", + "unique_embed_code":"", + "mature_content":"no", + "remote_play_url":"", + "has_mobile":"no", + "file_directory":"", + "is_premium":"no", + "credits_required":"0", + "premium_cid":"0", + "avatar":"1.jpg", + "avatar_url":"", + "email":"webmaster@localhost5.com", + "total_videos":"485", + "object_type":"v", + "object_id":"1245", + "in_use":"yes", + "slug":"test4" +} \ No newline at end of file diff --git a/upload/api/search.php b/upload/api/search.php new file mode 100644 index 00000000..fd97c20d --- /dev/null +++ b/upload/api/search.php @@ -0,0 +1,81 @@ +limit = create_query_limit($page, $limit); +$search->key = mysql_clean($request['query']); + +$results = $search->search(); + + + +if ($results) +{ + $the_results = array(); + switch ($type) + { + case "video": + default: + { + if($results) + foreach ($results as $video) + { + + $hq_file = get_hq_video_file($video); + $video['title'] = title($video['title']); + $video['description'] = mob_description($video['description']); + + $video['thumbs'] = array('default' => get_thumb($video), 'big' => getSmartyThumb(array( + 'vdetails' => $video, 'size' => 'big' + ))); + $video['videos'] = array('mobile' => get_mob_video(array('video' => $video))); + $video['url'] = $video['video_link'] = $video['videoLink'] = videoLink($video); + + if (has_hq($video)) + $video['videos']['hd'] = $hq_file; + + foreach ($blacklist_fields as $field) + unset($video[$field]); + + $the_results[] = $video; + } + } + break; + + case "users": + { + + if($results) + { + foreach ($results as $user) + { + $user['avatar'] = $user['user_photo'] = $userquery->avatar($user); + + foreach ($blacklist_fields as $field) + unset($user[$field]); + + $the_results[] = $user; + } + } + //echo $db->db_query; + } + break; + } + + echo json_encode($the_results); +}else + echo json_encode(array('err' => 'Nothing found!')); +?> \ No newline at end of file diff --git a/upload/api/thumb-sample.php b/upload/api/thumb-sample.php new file mode 100644 index 00000000..b50be5ec --- /dev/null +++ b/upload/api/thumb-sample.php @@ -0,0 +1,10 @@ + \ No newline at end of file diff --git a/upload/captcha.php b/upload/captcha.php new file mode 100644 index 00000000..623e87d0 --- /dev/null +++ b/upload/captcha.php @@ -0,0 +1,12 @@ +generates_image($word,true); +?> \ No newline at end of file diff --git a/upload/cb_install/LICENSE b/upload/cb_install/LICENSE new file mode 100644 index 00000000..905bb4d0 --- /dev/null +++ b/upload/cb_install/LICENSE @@ -0,0 +1,47 @@ +Copyright (c) 2007 - {this_year} by Arslan Hassan et al +CLIPBUCKET * http://clip-bucket.com +"A way to broadcast yourself - free and opensource video sharing website script" + +All Rights Reserved +ATTRIBUTION ASSURANCE LICENSE (adapted from the original BSD license) +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the conditions below are met. +These conditions require a modest attribution to (the +"Arslan Hassan"), who hopes that its promotional value may help justify the +thousands of dollars in otherwise billable time invested in writing +this and other freely available, open-source software. + +1. Redistributions of source code, in whole or part and with or without +modification (the "Code"), must prominently display this GPG-signed +text in verifiable form. +2. Redistributions of the Code in binary form must be accompanied by +this GPG-signed text in any documentation and, each time the resulting +executable program or a program dependent thereon is launched, a +prominent display (e.g., splash screen or banner text) of the Author's +attribution information, which includes: +(a) Name ("Arslan Hassan"), +(b) Professional identification ("ClipBucket"), and +(c) URL ("http://clip-bucket.com"). +3. Neither the name nor any trademark of the Author may be used to +endorse or promote products derived from this software without specific +prior written permission. +4. Users are entirely responsible, to the exclusion of the Author and +any other persons, for compliance with (1) regulations set by owners or +administrators of employed equipment, (2) licensing terms of any other +software, and (3) local regulations regarding use, including those +regarding import, export, and use of encryption software. + +THIS FREE SOFTWARE IS PROVIDED BY THE AUTHOR "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 OR ANY CONTRIBUTOR BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +EFFECTS OF UNAUTHORIZED OR MALICIOUS NETWORK ACCESS; +PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED +AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/upload/cb_install/ajax.php b/upload/cb_install/ajax.php new file mode 100644 index 00000000..4d2298fb --- /dev/null +++ b/upload/cb_install/ajax.php @@ -0,0 +1,322 @@ +Unable to connect to mysql : ".mysql_error().''; + else + { + $dbselect = @mysql_select_db($dbname,$cnnct); + if(!$dbselect) + $result['err'] = "Unable to select database : ".mysql_error().''; + } + echo json_encode($result); + } + + + if($mode=='register') + { + $version = @curl_version(); + if($version) + { + $website = $_POST['website']; + $email = $_POST['email']; + $ch = curl_init('http://clip-bucket.com/register.php'); + curl_setopt($ch,CURLOPT_RETURNTRANSFER,true); + curl_setopt($ch,CURLOPT_POST,true); + curl_setopt($ch,CURLOPT_POSTFIELDS,array('website'=>$website,'email'=>$email)); + $data = curl_exec($ch); + echo $data; + } + } + + if($mode=='adminsettings') + { + $dbhost = $_POST['dbhost']; + $dbpass = $_POST['dbpass']; + $dbuser = $_POST['dbuser']; + $dbname = $_POST['dbname']; + $dbprefix = $_POST['dbprefix']; + + $cnnct = @mysql_connect($dbhost,$dbuser,$dbpass); + + if(!$cnnct) + $result['err'] = "Unable to connect to mysql : ".mysql_error().''; + else + { + $dbselect = @mysql_select_db($dbname,$cnnct); + if(!$dbselect) + $result['err'] = "Unable to select database : ".mysql_error().''; + } + + if(@$result['err']) + { + exit(json_encode($result)); + } + + $step = $_POST['step']; + $files = array + ( + 'structure' => 'structure.sql', + 'configs' => 'configs.sql', + 'ads_placements' => 'ads_placements.sql', + 'countries' => 'countries.sql', + 'email_templates' => 'email_templates.sql', + 'pages' => 'pages.sql', + 'user_levels' => 'user_levels.sql' + ); + + $next = false; + if(array_key_exists($step,$files) && $step) + { + $total = count($files); + $count = 0; + foreach($files as $key => $file) + { + $count++; + if($next) + { + $next = $key; + break; + } + if($key==$step) + { + $current = $step; + if($count<$total) + $next = true; + } + } + + if(!$next) + { + $next = 'add_categories'; + $next_msg = 'Creating categories'; + } + + if($current) + { + $lines = file(BASEDIR."/cb_install/sql/".$files[$current]); + foreach ($lines as $line_num => $line) + { + if (substr($line, 0, 2) != '--' && $line != '') + { + @$templine .= $line; + if (substr(trim($line), -1, 1) == ';') + { + @$templine = preg_replace("/{tbl_prefix}/",$dbprefix,$templine); + mysql_query($templine); + $templine = ''; + } + } + } + } + + $return = array(); + $return['msg'] = '
    '.$files[$current].' has been imported successfully
    '; + + if(@$files[$next]) + $return['status'] = 'importing '.$files[$next]; + else + $return['status'] = $next_msg; + + $return['step'] = $next; + }else + { + switch($step) + { + case 'add_categories': + { + $lines = file(BASEDIR."/cb_install/sql/categories.sql"); + foreach ($lines as $line_num => $line) + { + if (substr($line, 0, 2) != '--' && $line != '') + { + @$templine .= $line; + if (substr(trim($line), -1, 1) == ';') + { + @$templine = preg_replace("/{tbl_prefix}/",$dbprefix,$templine); + mysql_query($templine); + $templine = ''; + } + } + } + $return['msg'] = '
    Videos, Users, Groups and Collections Categories have been created
    '; + $return['status'] = 'adding admin account..'; + $return['step'] = 'add_admin'; + } + break; + + case "add_admin": + { + + + $lines = file(BASEDIR."/cb_install/sql/add_admin.sql"); + foreach ($lines as $line_num => $line) + { + if (substr($line, 0, 2) != '--' && $line != '') + { + @$templine .= $line; + if (substr(trim($line), -1, 1) == ';') + { + @$templine = preg_replace("/{tbl_prefix}/",$dbprefix,$templine); + mysql_query($templine); + $templine = ''; + } + } + } + $return['msg'] = '
    Admin account has been created
    '; + $return['status'] = 'Creating config files...'; + $return['step'] = 'create_files'; + } + break; + + case "create_files": + { + mysql_close($cnnct); + $dbconnect = file_get_contents(BASEDIR.'/cb_install/dbconnect.php'); + $dbconnect = str_replace('_DB_HOST_', $dbhost, $dbconnect); + $dbconnect = str_replace('_DB_NAME_', $dbname, $dbconnect); + $dbconnect = str_replace('_DB_USER_', $dbuser, $dbconnect); + $dbconnect = str_replace('_DB_PASS_', $dbpass, $dbconnect); + $dbconnect = str_replace('_TABLE_PREFIX_', $dbprefix, $dbconnect); + + $fp = fopen(BASEDIR.'/includes/dbconnect.php', 'w'); + fwrite($fp, $dbconnect); + fclose($fp); + + copy(BASEDIR."/cb_install/clipbucket.php",BASEDIR."/includes/clipbucket.php"); + + $return['msg'] = '
    DBconnect and Clipbucket files have been created
    '; + $return['status'] = 'forwarding you to admin settings..'; + $return['step'] = 'forward'; + } + break; + } + + } + + echo json_encode($return); + } + + if($mode=='finish_upgrade') + { + chdir(".."); + $configIncluded = true; + require_once 'includes/config.inc.php'; + chdir("cb_install"); + include("functions.php"); + $files = getUpgradeFiles(); + + if($files) + { + $step = $_POST['step']; + if($step=='upgrade') + $index = 0; + else + $index = $step; + + $total = count($files); + + if($index >= $total) + { + $return['msg'] = '
    Upgrade clipbucket
    '; + $return['status'] = 'finalizing upgrade...'; + $return['step'] = 'forward'; + } + + if($index+1 >= $total) + $next = 'forward'; + else + $next = $index+1; + + if($next=='forward') + $status = 'finalizing upgrade...'; + else + $status = 'Importing upgrade_'.$files[$next].'.sql'; + + $sqlfile = BASEDIR."/cb_install/sql/upgrade_".$files[$index].".sql"; + if(file_exists($sqlfile)) + { + + $lines = file($sqlfile); + foreach ($lines as $line_num => $line) + { + if (substr($line, 0, 2) != '--' && $line != '') + { + @$templine .= $line; + if (substr(trim($line), -1, 1) == ';') + { + @$templine = preg_replace("/{tbl_prefix}/",TABLE_PREFIX,$templine); + $templine; + mysql_query($templine); + $templine = ''; + } + } + } + } + + //There were problems with email templates with version lower than 2.4 + //therefore we are dumping all existing email templates and re-import them + if($upgrade<'2.4.5') + { + mysql_query('TRUNCATE '.TABLE_PREFIX.'email_templates'); + //Dumping + $sqlfile = BASEDIR."/cb_install/sql/email_templates.sql"; + if(file_exists($sqlfile)) + { + + $lines = file($sqlfile); + foreach ($lines as $line_num => $line) + { + if (substr($line, 0, 2) != '--' && $line != '') + { + @$templine .= $line; + if (substr(trim($line), -1, 1) == ';') + { + @$templine = preg_replace("/{tbl_prefix}/",TABLE_PREFIX,$templine); + $templine; + mysql_query($templine); + $templine = ''; + } + } + } + } + } + //Dumping finished + + $return['msg'] = '
    upgrade_'.$files[$index].'.sql has been imported
    '; + $return['status'] = $status; + $return['step'] = $next; + + }else + { + $return['msg'] = '
    Upgrade clipbucket
    '; + $return['status'] = 'finalizing upgrade...'; + $return['step'] = 'forward'; + } + + echo json_encode($return); + } + +?> \ No newline at end of file diff --git a/upload/cb_install/clipbucket.php b/upload/cb_install/clipbucket.php new file mode 100644 index 00000000..fa644cb1 --- /dev/null +++ b/upload/cb_install/clipbucket.php @@ -0,0 +1,19 @@ + \ No newline at end of file diff --git a/upload/cb_install/dbconnect.php b/upload/cb_install/dbconnect.php new file mode 100644 index 00000000..5c7c23e0 --- /dev/null +++ b/upload/cb_install/dbconnect.php @@ -0,0 +1,39 @@ +debug = false; + $db->charpage = 'cp_utf8'; + $db->charset = 'utf8'; + if(!$db->Connect($DBHOST, $DBUSER, $DBPASS, $DBNAME)) + { + exit($db->ErrorMsg()); + } + $db->Connect($DBHOST, $DBUSER, $DBPASS, $DBNAME); + + $db->SetFetchMode(ADODB_FETCH_ASSOC); + + $db->Execute('SET NAMES utf8'); + $db->Execute('SET CHARACTER SET utf8'); + $db->Execute('SET COLLATION_CONNECTION="utf8_general_ci"'); + +?> \ No newline at end of file diff --git a/upload/cb_install/favicon.ico b/upload/cb_install/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..3b630f901b535709da740bd43b95aaa0876d8521 GIT binary patch literal 1150 zcmai!T}V@L7{*^U7KPxj@JcG9z`U)%yP%8cG9t{&E=r^isV>B*#u7{V@H0~(FEY~< z6_T}~scG(5PBP~lYEIpu_2H&&)AZFAZT=u4aQvRBgF?gAa#Puvc5{7p#mrF4d1=X$$n%|aac(N5 z>2A_&Z4O{Gb+gGJa|M5<*^;+I$)-QP`j`BUK zsz7H^vS`o)Zs9@fR*!n^kN3M*d}1=&vE;TNGv)(wOa*Z`(R~M{MHj`0Ys+r@Ir18X zm&YR=)*bK4EoAe~f#RI@hqN<{bD$_Rr^>77aTtjAC#RYoN!p{4d@$YXv_i53OQc#o;0Pp6Xu%X@lD;{DxE02$*QS)qIX9(@(M z=Kgl-a|!7SV%O=OXS6@ejBr0R@A!B#;_)n6%@v7r^o*M6zT8KjiUB!e#*6FsAE}Ob zJd0L)+qo9@?qkM`26HLBcbLyF_M+r-psECLvhyn{h4 zX827iO5TakbI7X;bROT3v##WuN@4TCRc`|I?O!SYqp?(J(9w~J?y(y5It?4LZ*@n$ zvsq41non>I>hFy=33) && (randomNumber <=47)) { continue; } + if ((randomNumber >=58) && (randomNumber <=64)) { continue; } + if ((randomNumber >=91) && (randomNumber <=96)) { continue; } + if ((randomNumber >=123) && (randomNumber <=126)) { continue; } + } + iteration++; + password += String.fromCharCode(randomNumber); + } + return password; +} + +function register(email,website) +{ + $('#loadingReg').html(img); + $.ajax({ + url : p, + type : 'POST', + data : ({mode:'register',website:website,email:email}), + dataType: "html", + success:function(data){$('#installation').submit()} + + }) + + +} \ No newline at end of file diff --git a/upload/cb_install/functions.php b/upload/cb_install/functions.php new file mode 100644 index 00000000..11f04a42 --- /dev/null +++ b/upload/cb_install/functions.php @@ -0,0 +1,291 @@ +',$license); + $license = str_replace("{this_year}",date("Y",time()),$license); + } + return $license; + } + + + function button($text,$params=NULL,$alt=false) + { + echo ' '; + echo ''.$text.''; + if(!$alt) + echo ' '; + else + echo ' '; + } + + function msg_arr($arr) + { + if(@$arr['msg']) + return emsg($arr['msg'],'ok'); + else + return emsg($arr['err'],'alert'); + } + + if(!function_exists('emsg')) + { + function emsg($text,$type='ok') + { + return ''.$text.''; + } + } + + + function check_module($type) + { + $return = array(); + switch($type) + { + case "php": + { + + $v = phpversion(); + $req = '5.2.1'; + if($v<$req) + $return['err'] = sprintf(_("Found PHP %s but required is PHP %s "),$v,$req); + else + $return['msg'] = sprintf(_("Found PHP %s "),$v); + } + break; + + case "ffmpeg": + { + $ffmpeg_path = exec("which ffmpeg"); + $ffmpeg_version = shell_output("$ffmpeg_path -version"); + + $version = false; + preg_match("/SVN-r([0-9]+)/i",$ffmpeg_version,$matches); + if(@$matches[1]) + $version = 'r'.$matches[1]; + preg_match("/version ([0-9.]+)/i",$ffmpeg_version,$matches); + if(@$matches[1]) + $version = $matches[1]; + + if(!$version) + $return['err'] = _("Unable to find ffmpeg"); + else + $return['msg'] = sprintf(_("Found FFMPEG %s : %s"),$version,$$ffmpeg_path); + } + break; + + case "flvtool2": + { + $flvtool2_path = exec("which flvtool2"); + $flvtool2_version = shell_output("$flvtool2_path -version"); + $version = false; + preg_match("/flvtool2 ([0-9.]+)/i",$flvtool2_version,$matches); + if(@$matches[1]) + $version = $matches[1]; + if(!$version) + $return['err'] = _("Unable to find flvtool2"); + else + $return['msg'] = sprintf(_("Found flvtool2 %s : %s"),$version,$flvtool2_path); + + } + break; + + case "mp4box": + { + $mp4boxpath = exec("which MP4Box"); + $mp4box_version = shell_output("$mp4boxpath -version"); + $version = false; + preg_match("/GPAC version ([0-9.]+)/i",$mp4box_version,$matches); + if(@$matches[1]) + $version = $matches[1]; + if(!$version) + $return['err'] = _("Unable to find MP4Box"); + else + $return['msg'] = sprintf(_("Found MP4Box %s : %s"),$version,$mp4boxpath); + + + } + break; + + case "curl": + { + $version = false; + if(function_exists('curl_version')) + $version = @curl_version(); + + if(!$version) + $return['err'] = _("cURL library is not neabled"); + else + $return['msg'] = sprintf(_("cURL %s found"),$version['version']); + + } + break; + + case "phpshield": + { + if(!function_exists('phpshield_load')) + $return['err'] = _("PHPShield loaders are not installed (optional)"); + else + $return['msg'] = _("PHPShield loaders are working (optional)"); + } + break; + + + + } + + return $return; + } + + if(!function_exists('_')) + { + function _($in) + { + return $in; + } + } + + + if(!function_exists('shell_output')) + { + function shell_output($cmd) + { + if (stristr(PHP_OS, 'WIN')) { + $cmd = $cmd; + }else{ + $cmd = "PATH=\$PATH:/bin:/usr/bin:/usr/local/bin bash -c \"$cmd\" 2>&1"; + } + $data = shell_exec( $cmd ); + return $data; + } + } + + + /** + * Short form of print_r as pr + */ + if(!function_exists('pr')) + { + function pr($text,$wrap_pre=false) + { + if(!$wrap_pre) + print_r($text); + else + { + echo "
    ";
    +				print_r($text);
    +				echo "
    "; + } + } + } + + + /** + * Function used to check folder permissions + */ + function checkPermissions() + { + $files = array + ( + 'cache', + 'cache/comments', + 'cache/userfeeds', + 'files', + 'files/conversion_queue', + 'files/logs', + 'files/mass_uploads', + 'files/original', + 'files/photos', + 'files/temp', + 'files/temp/install.me', + 'files/thumbs', + 'files/videos', + 'images', + 'images/avatars', + 'images/backgrounds', + 'images/category_thumbs', + 'images/collection_thumbs', + 'images/groups_thumbs', + 'includes', + 'includes/langs/en.lang' + ); + + $permsArray = array(); + foreach($files as $file) + { + if(is_writeable(BASEDIR.'/'.$file)) + { + $permsArray[] = array('path'=>$file,'msg'=>'writeable'); + }else + $permsArray[] = array('path'=>$file,'err'=>'please chmod this file/directory to 777'); + } + return $permsArray; + } + + + /** + * FUNCTION USED TO CLEAN VALUES THAT CAN BE USED IN FORMS + */ + if(!function_exists('cleanForm')) + { + function cleanForm($string) + { + if(is_string($string)) + $string = htmlspecialchars($string); + if(get_magic_quotes_gpc()) + $string = stripslashes($string); + return $string; + } + function form_val($string){return cleanForm($string); } + } + + + + function selected($selected) + { + global $mode; + if($mode==$selected) + return "class='selected'"; + } + + /** + * Function used to create list of files + * that have to be executed while upgrade + */ + function getUpgradeFiles() + { + global $versions,$upgrade; + $version = VERSION; + $oldVer = $upgrade; + if($oldVer) + { + $total = count($versions); + $files = array(); + + $found = false; + foreach($versions as $ver) + { + if($found) + $files[] = $ver; + if($ver==$oldVer) + $found = true; + } + return $files; + } + + return false; + } + +?> \ No newline at end of file diff --git a/upload/cb_install/images/alert.png b/upload/cb_install/images/alert.png new file mode 100644 index 0000000000000000000000000000000000000000..16aa3dd4bc8f84a67906d5f19db39d85afc1159e GIT binary patch literal 827 zcmV-B1H}A^P)#iJJz@19E! zrYG-4JZMb47`+gKY+DZmHz|m)2BgbA7TA3~P+-^U&7L~RewleQZwO-yk14iC zrTq(_!)y>jdiNhQGh_7TW=k!VqEwc70N}k|DvXYv@*dBJS35h>!O#%iSF2VcW2~oL zNylP|uYrJ(TVH2X6qzo|tewxZ+TkJlzOcZK{C*=HizNWyU}(s~AZ8FD1nF2T@$35f z)6-+cR4VuG_?Xxf z1MRut%&3{IOZB1{4bL zg~L!}Ir<<_t5kT-?}wgF_p)P@_8VyO=~q`67#V?9sqkioWo!VzsMo>TZ7@yigH*M1 zntaf8;P&=zxE08|-Bdk4=br=uXlFA0r&w9}E072RZbT8h+fB`WOUX__ILU8s!!|w+ z)@t?26XJ0Q@p!*vO@rQOpd^ZL3c~5bK&NxQw7<`kLII9Q1R$hSreOev0j6nStrkEC z%A$y-sxqh3IcLfI?qHvVLZ522+EQq75iUW1ad`;3%Z;$r#kf4&z80Ae`& zf>Qd0*6UGCRe1p51cCA{*NKbg=U%7NKkr)(2 literal 0 HcmV?d00001 diff --git a/upload/cb_install/images/bttncenter.png b/upload/cb_install/images/bttncenter.png new file mode 100644 index 0000000000000000000000000000000000000000..974406dafb2ba998ea0ddfec6eeb2b6a1b5a3327 GIT binary patch literal 3651 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 literal 0 HcmV?d00001 diff --git a/upload/cb_install/images/bttnright.png b/upload/cb_install/images/bttnright.png new file mode 100644 index 0000000000000000000000000000000000000000..9c6211f2966b64acc3695701984bc625e5b48757 GIT binary patch literal 1504 zcmaJ>ZA=?=9Ioq3+zTMiAulmrj&w#k+G|T`IVkiU3T-KEp=ErSM|*>gUaz)?EhP*G zMgnBS;F>K#5e6CrL(t5TO)`jEOq_!cObFwhE&73OknsLquMC(Uz)SA_FL|El_ws-K zSFKT}2AzyNNuf}J6lqc|Inu}%e2Yqc=VjB?2kRkE)D~C6fju{2?+rWHanI?#5zlC1mcdhIivR#q^Q&6 zu-FL;ZUX{}NIqUn2tYE^S0!Nf16iAMuT5mbm~O<*WHF#XN&7&R>i?k_c7S#gTJ&|k zhYCCOC3cjlMV)xD!$cn3rRYE?J1lXa2!T8FIBwnVqNWfhaAzTI2P8T!V6fQCxXZbV zR;gfx%}F3O6RMC3K$6d}Sj;ewBZK4+o5kVEMJ$#K5{YG85hqS2;Y;G;*j#9zE5%L4 z7-}Q-x#rhg_L1Cx5imO$S&BL=pQ2{D1IK{ff?>;{xrh?@Vv*=by*;k^&|G%8;v>0C zG8tyzSpRd(`&*=U0@DN2l8Xb|qc+m(4${*ea&jaRiC8Qa3WZXsl+Wj{t*yyqveeX6yEAb~Y?5?Ed}xEiEmrt*t(vZ)|LgPNz>#PnVaME0N1O zvPB$)RHS#0{`gmJUWG9H3*`NR?+1^EzTE}pJ-q$+cG)jwQ>!oi{yODksQ6)UPso(- z?msUYjMguog|0k~$f9{To!`>8JEXr|ATHK^m1a2Q|KU2VJ70L`#HmmhJ-D?;7Cv85 zbBz8$V{fRMS}}CvIse1r-zD^jk)CZIdhO3EZSM-vu^{o;keIVZXJli$GOVNK@@XU1 z{`^^E$IYyWzRPEl6F4rCF z%DfTzaxXQR7aVkJHow1lP^kA!{oGliL9d1tBtB5&q?-otc6j?)5`oim$sxzXh>)$an%wqnTp9cNBgqK_ADi@>s YC|5=kxAUm|F9QEug-k8&6n|XtFTl@6eENn{1`ISV`@i-DSsfH31!Z9ZwBpk#?_L`iUdT1k0gQ7VIDN`6wRf@f}GdTLN= zVoGJ<$y6H#24;oKkcg59UmvUF{9L_6kQ%*;+ybC(1_m4Zih{)C?9>v4q}24xJX@vr zyZ0+8WTx0Eg`4^s_!c;)W@LI)6{QAO`Gq7`WhYyvDB0U7*i={n4aiL`NmQuF&B-ga zs<2f8n`;GRgM{^!6u?SKvTcwn`Gtf;oFf&jvGt@IQHZeCh*HJJs zFf`CNFw!?P(ls=+iS(P_gZ&k zbIwKYDh`jd1}D+OFJ(4got0UWv#dSw>HBBTl@|FP;qOx27?ZzW#cR`r4fb7Sp1;l^_m_M9wd7$f@Bh^Kz(cXf zr^vU!t-I{8hw7{=%FbOAoj3a~SuA*c_TiuYtqzN4{Jq4%UZv9*xc_jCT;>`D5w=C; sldJ3Y$Xd0A$jtTn_xHljpEY}!a`vcBd|fhs8mQRtboFyt=akR{054IgrvLx| literal 0 HcmV?d00001 diff --git a/upload/cb_install/images/header_grad.png b/upload/cb_install/images/header_grad.png new file mode 100644 index 0000000000000000000000000000000000000000..367d5e5c3b901eaf23450333c25f287a3ccd1c1d GIT binary patch literal 1001 zcmaJ=zi-n(7&U4Ks8l2vke~yHJAsIOcH$;+V@eVy)KXnVX{2UB!m+Q7)!Jw5D{;FZ zp@Ia6zk!7jSdn0$WdbpQI(5!ek)&xmGH_0ll!0LBd_VNw``-86ch5_U_a-Niih}7q9d0=ya77s$>bTkcQzSCTrmu0-9s2qB1h9&4=GmhGE8lU8$0) zz95^};fx5wg^owr43n7)J;Pi>1k})~?J8{N(`OdgmclMeI@G;9s@wBhK3dvZte9JC zX4+!s?tn}vQvnAN1BA}H8_1!;_H<>sj*fX2^dMwSVNXp}^%BTq9|4JjF%!-}Fe7k6 zJdsQ$ZvznukcT2Kh%q54$3+=J(EnH(&9_$MvRdrNqC17H6XMA{-)JBX%~N1;49?<0d?zk>1lpo*nBCOD{L z59F65uxz^)ZUjBFuFIMm5W_W*rYbDubGB{C>1;wuCWLrgDhh&7fT^M+780p^HkV6f zQ)+I&Rk69@AeRid))_Z3k{dOG@h_N|+eW?#5p m{`lp}i#Lg<)4z8;8ARgvLP<9%Mmz@S{yN{Ei^QCJ$57xlT`{4Kc{eS=e`@g%z@yq>v zC;KRh>Q_gV5}60cICZ3#{0nE;XJk5o^JP4NW^mQ;A(gSvGz6++%)$~hti@{|;V?z@ z0$VTRvNk4}$YG2K!-S4U*c3H95_*O?2Qiq2v$iYK^;d6cU|TXhDQcYN3>P!G zBnOf_!^ab;RO$i{IG$rUf#ro5pOWH&#BreY(IlF0%}6Ds(27NNGF`#glUTM|tuoa( zgZx>RPp8w7h9JZUA{H#V*a%~8FxXa5U|{;Thi&A7NYR)^3s|O!)BO}2uOsUQtum2< zv7zCyJi|pPwSk)Uf2iYh&;c&N1HbYnWH!~Q8@}!&(4UBvpq4{Cfi&EnF|hdahq!$aI;;xQ6o4WiL5~1z7DN|j~viUShBl&8S1Ln;#%Fk zq`PuiVup>b^{;DgACcaPmYt?0n@-z9m-M<%ntJcYUY$IMv&AtzzrMa+tJSu)wpLeH zcXoDmcXu~8H&<3x>h=1@#>V#ccB9d__vra2f)`aKqlar>KfgTm4p1L19iRX5`=@a8 zM$fW-{&7RSa<#OUefZ!$cbh)<>;1r;#_8{GdX7@BpB#SCbL`vG=n1O%ab-C>b?Xmw Cxl#uJ literal 0 HcmV?d00001 diff --git a/upload/cb_install/images/loading.gif b/upload/cb_install/images/loading.gif new file mode 100644 index 0000000000000000000000000000000000000000..48a7197aafa097d6474f57413459a20a779f8f4c GIT binary patch literal 8089 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

    u~P@Q5*wK^tr~*>nPpAjS*t%Ob4_8`^C~ zHWczuS!fF1CtjN;&uPxV>M>Ci3XR6oS%M^EAe!^cQ)H~*RJ2j4L`!QUVf|oJ>>j*! z^}2>1qMtxK)34xv%;oI*cz<%;3TnyLKU91n477IsZs5}Di^kT{nol{>Ro&+Y9z6a2 z@+Wh;kCn7Md}4Ct#n*-^x4-+*;TqeTGCmG00aJNUEVh-!Y<@JFDYLB&c5IFD(N?R= zr_=Fw7kKD&Ke(jr8p;-Xy%FE=&tHIfS{^+5@{kWd0q!&>cN2^vZ;$NER<4ok$bRF6 zZFrUwb0M3_dNa<1l=u!9L7`Z>GMfUq-VpQ3KUXuK@C9*XsyRgJU7tdOlwtLGiGhKc zpHUy?>XF<=Gy&bp3UoCjatN3$A+x($bJyIpwan-4%oMQsbZgFEB*9r5s0Fxq{^0^p zL$Dlxbk1KSL2+)otuAj)1EHT+7jSt7XKmmWCG+PsiOE7EiVimo!hxs!Cd^t;IijdSRQD9 zdx^__efhp?H_no}LE(8tYN3)72uuUC4krifIs-V#Jt-BhIf3L0RN{K4u|yZ z4E#C(_RMeq4FBb)3GnmDYzKfb^L1h#;LT`%a`uRzC~wb0=a7buz@Ej5?oH~~pZ&1L zA*?eF=g!UGM=tIxO=p+ZpE|>35(H%@Chr!UKB3d-sAZFNglaNfN z0dkqu(rZP-HmB7M_F;85j_*TP(*$}!a7B%upwl^9Wm#BkNGSR*JdH1|M;Pzlz>rv+ z>Xg9o;Hegzsh-0)J2ZhJQ;U-Vd&QX!w(R@2_q)S{Ta{jaa-Xf{>qmpr=bGP1roO)X%ZjCq2+4tfxDVtTcwzZ8K61Z@bK6pTYq zsdwfNgm1p4Zx8qM$0AV5prF%b3Ys@#o}hn0HP3hS?colp8N?1WGAQWGYM;;F2hlyr z11l`m9P%$5wO-F@)&9izwOs{UsmGmfE!CK`_a{%v1!a$n4Ro-N97#bCV`;%PvZ^~z zAE2liC|}KEs|`ws72q=D4D+VA2?~leAv;6TvrHg1lgM_Wr9aLwQ^kCu9y-|IdC8~e zJCCmBYPmwbk9vY5#d~yEAAEvju>?J8HhFE22pq-)CJfs}5cN};4(WSl7n$sJKPIB0 z6-+~%X*Bw+S{xYqP%QK%qhhjK;Kx&EXPVkuF}&K)x{278ZW^+I=qp;b0tzJ*=zBi~+nZU`+ z-xr55VKz1^i+vzw3ri$wEY@}8XA+tPQgdjdJ`YVoce^8_;46fR=B9>p2V`8FCTMda z2yan$Sm@_2l7vE#)Yl-BkVwL|7zt9c@LWP3U$wktQ&*I=AIqxJCk7|mCkB@23 zTbq8CGVTkKBWD(DskY*4Om~u*sVvw3x+3CLZzNe3^p9S^ z3!J=MTlOWUt23l0iN+M-rK=^wFuHP$d@yS#w$$$6?$}Ql_B5X7&8MoYq^|0F{!87$ zbTXuk=Tya4VPx&ZqM&6sYDp~4u-;E)(K-}4f*&~efy4Hi!@Qini|Ok4fy1;lN;IZm z8IGE3wNNu*K|xGtL9U1&TSEdZ3oa z)-bH!Va6I`Tg@Q=o~8fbsn+*)VW@!di5G+m6m!unN1}4FfACl0MH>+Udj2_xmU)8h z&2nw<1fK8W`7VCo<9Pw&;~J5ue0xza6k*S!;eIhQtMf(KcD%sm$G=;+dhZB^tK$oo z03SsTqfKadjxRzHnsbc>7rXWHhO>4?X{q1*6-v}2mHn3)`xPJv$x$RBlhSnbS2nQ{ zrSsIT`v?9P1UTBgq0^l8_f?dBCRLPI5-9}B&5};1&?l#GEMLS*lye=s9~@Zn>CMHl zA2xpOI^vRR`3ct+>YJiTW;m)O!x5?ZWYhi8B|nGdh>!n+eGTC+ZlJ2^{(S%d002ov JPDHLkV1n+)mqq{p literal 0 HcmV?d00001 diff --git a/upload/cb_install/index.php b/upload/cb_install/index.php new file mode 100644 index 00000000..2fa6908a --- /dev/null +++ b/upload/cb_install/index.php @@ -0,0 +1,40 @@ + \ No newline at end of file diff --git a/upload/cb_install/modes/adminsettings.php b/upload/cb_install/modes/adminsettings.php new file mode 100644 index 00000000..633fca45 --- /dev/null +++ b/upload/cb_install/modes/adminsettings.php @@ -0,0 +1,77 @@ +

    Admin Settings

    +All major steps are done, now enter username and password for your admin, +by default its username : admin | pass : admin
    +we now update installation details and insert language phrases +

    +cbinfo; + +$baseurl = dirname(GetServerURL()); +if(substr($baseurl,strlen($baseurl)-1,1)=='/') + $baseurl = substr($baseurl,0,strlen($baseurl)-1); + +$db->update(tbl("config"),array("value"),array($baseurl)," name='baseurl'"); +$db->update(tbl("config"),array("value"),array(BASEDIR)," name='basedir'"); +$db->update(tbl("config"),array("value"),array($released['release_date'])," name='date_released'"); +$db->update(tbl("config"),array("value"),array(now())," name='date_updated'"); +$db->update(tbl("config"),array("value"),array(now())," name='date_installed'"); +$db->update(tbl("config"),array("value"),array($released['version'])," name='version'"); +$db->update(tbl("config"),array("value"),array($released['state'])," name='type'"); + +$arr['msg'] = "Installation details have been updated"; +echo msg_arr($arr); + +$lang_obj->updateFromPack('en'); + +$arr['msg'] = "Language phrases have been imported"; +echo "
    ".msg_arr($arr); + +?> + + +

    + +
    + + +
    +
    + + + Generate | Current : admin +
    +
    + + +
    + + + + +
    +

    \ No newline at end of file diff --git a/upload/cb_install/modes/agreement.php b/upload/cb_install/modes/agreement.php new file mode 100644 index 00000000..5f0621a2 --- /dev/null +++ b/upload/cb_install/modes/agreement.php @@ -0,0 +1,10 @@ +

    Welcome to ClipBucket 2.1 Installer, this will let you install clipbucket with few clicks :), please read this documentation for further info and help

    + Clipbucket is indeed an open-source software under Attirubte assurance license and you must follow this license. Its not scary, it just states that one who did all the tought job should get credit for his work in form of his name in the footer, you can edit, sell, use this script but you must keep author's and product name on your website. +

    License

    +
    + +
    + +
    +
    \ No newline at end of file diff --git a/upload/cb_install/modes/body.php b/upload/cb_install/modes/body.php new file mode 100644 index 00000000..d60bc7ac --- /dev/null +++ b/upload/cb_install/modes/body.php @@ -0,0 +1,52 @@ + + + + + +ClipBucket v<?=VERSION?> <?=STATE?> Installer + + + + + + + + + + + + + +
    + +
    + +
    + ClipBucket is an effort of Arslan Hassan, Fawaz Tahir and some great supporters.
    +© ClipBucket 2007 - | Code written by Arslan & his team +
    + + + + \ No newline at end of file diff --git a/upload/cb_install/modes/database.php b/upload/cb_install/modes/database.php new file mode 100644 index 00000000..740456c6 --- /dev/null +++ b/upload/cb_install/modes/database.php @@ -0,0 +1,53 @@ +

    Database Settings

    + +To setup ClipBucket, we need some information on the database. You will need to know the following items before proceeding.

    +
      +
    1. Database name
    2. +
    3. Database username
    4. +
    5. Database password
    6. +
    7. Database host
    8. +
    9. Table prefix (if you want to run more than one ClipBucket in a single database)
    10. +
    +

    In all likelihood, these items were supplied to you by your Web Host. If you do not have this information, then you will need to contact them before you can continue. If you’re all ready…Below you should enter your database connection details + + +

    +
    + +
    + + +
    + +
    + + +
    + +
    + + + +
    + +
    + + +
    + +
    + + + +
    + + + +
    +
    \ No newline at end of file diff --git a/upload/cb_install/modes/dataimport.php b/upload/cb_install/modes/dataimport.php new file mode 100644 index 00000000..4c64ad38 --- /dev/null +++ b/upload/cb_install/modes/dataimport.php @@ -0,0 +1,47 @@ +

    Creating Database Tables and Importing data

    + + +
    + + + creating database structure... + + upgrading clipbucket... + +
    + +
    + + + + + + + + + + +
    + + \ No newline at end of file diff --git a/upload/cb_install/modes/finish.php b/upload/cb_install/modes/finish.php new file mode 100644 index 00000000..acdc5a52 --- /dev/null +++ b/upload/cb_install/modes/finish.php @@ -0,0 +1,72 @@ + +

    ClipBucket has been installed successfully

    +

    +

    + +
    +'Please delete cb_install directory'))?>
    +
    + + + + + +
    + +
    now you have succesfully installed clipbucket, you may be insterested in following plugins to enhance your website
    + + +
    + +
    Let you popluate your website with thousands of Youtube videos entirely based on your + queries with autocategorization and auto wordpress poster. it also embed videos from dailymotion, metacafe and revver.com
    +
    + +
    + +
    Facebook Connect allows your users to login to your website using Facebook account, They will first register and than login. Facebook connect is running on many websites, it can turn your user signup process alot quick and easier.
    +
    + +
    + +
    if you want to remove "powered by ClipBucket" from ClipBucket v2 Website, by purchasing this service, you can do that easily
    +
    + +
    + +
    Removes "Powered by ClipBucket" message and Pakplayer name from your flv player and Let you set your own logo and message on Pakplayer
    +
    + +
    + +
    ClipBucket Multi-server gives your website a new edge with more powerful video conversion option and data delivery.With Clipbucket Multi-server, you will have following options +
    +
    + + + +
    + +
    Paid Subscription module let you transform your website into an online video sharing market with a reliable source of income. Our module comes with very best features that let you control and distribute your content commercially. +
    +
    + +
    + + +
    + Please read our "what to do after installation" guide... +
    +

    + diff --git a/upload/cb_install/modes/finish_upgrade.php b/upload/cb_install/modes/finish_upgrade.php new file mode 100644 index 00000000..f2996dd5 --- /dev/null +++ b/upload/cb_install/modes/finish_upgrade.php @@ -0,0 +1,80 @@ +update(tbl("config"),array("value"),array(now())," name='date_updated' "); + +?> + +

    Your Clipbucket has been successfully upgraded to

    +

    +

    +'Please delete cb_install directory'))?>
    +
    + + + + + +
    + +
    now you have succesfully installed clipbucket, you may be insterested in following plugins to enhance your website
    + + +
    + +
    Let you popluate your website with thousands of Youtube videos entirely based on your + queries with autocategorization and auto wordpress poster. it also embed videos from dailymotion, metacafe and revver.com
    +
    + +
    + +
    Facebook Connect allows your users to login to your website using Facebook account, They will first register and than login. Facebook connect is running on many websites, it can turn your user signup process alot quick and easier.
    +
    + +
    + +
    if you want to remove "powered by ClipBucket" from ClipBucket v2 Website, by purchasing this service, you can do that easily
    +
    + +
    + +
    Removes "Powered by ClipBuclet" message and Pakplayer name from your flv player and Let you set your own logo and message on Pakplayer
    +
    + +
    + +
    ClipBucket Multi-server gives your website a new edge with more powerful video conversion option and data delivery.With Clipbucket Multi-server, you will have following options +
    +
    + + + +
    + +
    Paid Subscription module let you transform your website into an online video sharing market with a reliable source of income. Our module comes with very best features that let you control and distribute your content commercially. +
    +
    + +
    + + +
    + Please read our "what to do after installation" guide... +
    +

    + diff --git a/upload/cb_install/modes/lock.php b/upload/cb_install/modes/lock.php new file mode 100644 index 00000000..fb089b46 --- /dev/null +++ b/upload/cb_install/modes/lock.php @@ -0,0 +1,3 @@ +

    Installation is locked

    + +please create file "install.me" in folder /files/temp in order to install ClipBucket \ No newline at end of file diff --git a/upload/cb_install/modes/permission.php b/upload/cb_install/modes/permission.php new file mode 100644 index 00000000..1583a5d6 --- /dev/null +++ b/upload/cb_install/modes/permission.php @@ -0,0 +1,37 @@ + +

    Checking File & Directories Permissions

    + ClipBucket need some files and folders permissions in order to store files properly, please make sure all files given below are chmod properly
    +CHMOD : the chmod command (abbreviated from change mode) is a shell command and C language function in Unix and Unix-like environments.

    + +

    + + +
    + + +
    + +
    + + +
    + + +
    +
    + + +
    + + + + + + +
    diff --git a/upload/cb_install/modes/precheck.php b/upload/cb_install/modes/precheck.php new file mode 100644 index 00000000..f7c37caa --- /dev/null +++ b/upload/cb_install/modes/precheck.php @@ -0,0 +1,35 @@ +

    Prechecking

    +Clipbucket requires following modules in order to work properly, we are performing some initial search to find modules. +Click here for why we need these modules +

    + +

    + +
    +
    PHP
    + +
    +
    FFMPEG
    + +
    +
    FLVtool2
    + +
    + +
    MP4Box
    + +
    +
    cURL
    + +
    +
    PHPShield
    + +
    +
    +

    + + +
    + +
    +
    diff --git a/upload/cb_install/modes/register.php b/upload/cb_install/modes/register.php new file mode 100644 index 00000000..c8ee3aee --- /dev/null +++ b/upload/cb_install/modes/register.php @@ -0,0 +1,38 @@ +get_user_details(); +$adminemail = $userquery->get_user_field_only(1,'email'); + +$title = mysql_clean(post('title')); +$slogan = mysql_clean(post('slogan')); +$baseurl = mysql_clean(post('baseurl')); + +//First update website settings +$myquery->Set_Website_Details('site_title',$title); +$myquery->Set_Website_Details('site_slogan',$slogan); +$myquery->Set_Website_Details('baseurl',$baseurl); + +?>

    Registeration (Optional)

    +As you have installed ClipBucket Succesffuly, we highly recommend you to register your website on our Clipbucket. its really simple, just click on Register and continue and your website will be register on Clipbucket website
    +
    +

    Why we suggest registeration?

    +
      +
    • Get imediate security updates
    • +
    • Help us count how many websites are using Clipbucket
    • +
    • Grow our community
    • +
    • Easy interaction between Clipbucket and Webmasters
    • +
    + +
      +
    • We only save your email and website url
    • +
    • We will not share your email to anyone
    • +
    • We will integerate bug tracker pretty soon and you will be able to report bugs easily if you are registered
    • +
    + +
    + + + + + +
    + diff --git a/upload/cb_install/modes/sitesettings.php b/upload/cb_install/modes/sitesettings.php new file mode 100644 index 00000000..ed8d80a2 --- /dev/null +++ b/upload/cb_install/modes/sitesettings.php @@ -0,0 +1,47 @@ +update(tbl("users"),array +('username','password','email','doj','num_visits','ip','signup_ip','background_color','total_groups','banned_users'),array +(post('username'),$pass,post('email'),now(),1,$_SERVER['REMOTE_ADDR'],$_SERVER['REMOTE_ADDR'],'',0,''),"userid='$uid'"); + +//Login user +$userquery->login_user(post('username'),post('password')) + +?>'Admin details have been updated'))?> +

    Website basic configurations

    +here you can set basic configuration of your website, you can change them later by going to Admin area > Website Configurations + +

    + + +

    + +
    + + +
    + +
    + + +
    + +
    + +
    + without trailing slash '/' +
    + + + +

    + Please read this documentation for complete website configurations guide

    + +
    + +

    \ No newline at end of file diff --git a/upload/cb_install/modes/upgrade.php b/upload/cb_install/modes/upgrade.php new file mode 100644 index 00000000..c3a3f3af --- /dev/null +++ b/upload/cb_install/modes/upgrade.php @@ -0,0 +1,16 @@ + +

    You are now going to upgrade from to , please read this documentation for further info and help, please click continue upgrade

    + +
    + +
    +
    + +
    +'Please first login as Website adminstrator by going to admin_area and then try upgrading your website'))?>
    \ No newline at end of file diff --git a/upload/cb_install/round_arrow_right.png b/upload/cb_install/round_arrow_right.png new file mode 100644 index 0000000000000000000000000000000000000000..c03ddfe07105185e1253d73843b95a2052844633 GIT binary patch literal 5992 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 literal 0 HcmV?d00001 diff --git a/upload/cb_install/sql/add_admin.sql b/upload/cb_install/sql/add_admin.sql new file mode 100644 index 00000000..b08d2971 --- /dev/null +++ b/upload/cb_install/sql/add_admin.sql @@ -0,0 +1,7 @@ + +INSERT INTO `{tbl_prefix}users` (`userid`, `category`, `featured_video`, `username`, `user_session_key`, `user_session_code`, `password`, `email`, `usr_status`, `msg_notify`, `avatar`, `avatar_url`, `sex`, `dob`, `country`, `level`, `avcode`, `doj`, `last_logged`, `num_visits`, `session`, `ip`, `signup_ip`, `time_zone`, `featured`, `featured_date`, `profile_hits`, `total_watched`, `total_videos`, `total_comments`, `total_photos`, `total_collections`, `comments_count`, `last_commented`, `ban_status`, `upload`, `subscribers`, `total_subscriptions`, `background`, `background_color`, `background_url`, `background_repeat`, `background_attachement`, `total_groups`, `last_active`, `banned_users`, `welcome_email_sent`, `total_downloads`) VALUES +(1, 2, '', 'admin', '777750fea4d3bd585bf47dc1873619fc', 10192, '777750fea4d3bd585bf47dc1873619fc', 'webmaster@website', 'Ok', 'yes', '0', '', 'male', '1989-10-14', 'PK', 1, '08c5a7bd48', '0000-00-00 00:00:00', '2011-02-10 10:22:41', 86, 'pub6e7fq5oj76vakuov2j03hm1', '127.0.0.1', '', 0, 'No', '2009-12-03 15:14:20', 0, 0, 0, 0, 0, 0, 0, '2011-02-07 12:56:46', 'no', '0', 0, 1, '0', '#ed0000', '', 'no-repeat', 'yes', 3, '2011-02-14 08:43:25', 'test', 'yes', 0); + + +INSERT INTO `{tbl_prefix}user_profile` (`user_profile_id`, `show_my_collections`, `userid`, `profile_title`, `profile_desc`, `featured_video`, `first_name`, `last_name`, `avatar`, `show_dob`, `postal_code`, `time_zone`, `profile_tags`, `web_url`, `hometown`, `city`, `online_status`, `show_profile`, `allow_comments`, `allow_ratings`, `allow_subscription`, `content_filter`, `icon_id`, `browse_criteria`, `about_me`, `education`, `schools`, `occupation`, `companies`, `relation_status`, `hobbies`, `fav_movies`, `fav_music`, `fav_books`, `background`, `profile_video`, `profile_item`, `rating`, `voters`, `rated_by`, `show_my_videos`, `show_my_photos`, `show_my_subscriptions`, `show_my_subscribers`, `show_my_friends`) VALUES +(1, 'yes', 1, '', '', '', '', '', 'no_avatar.jpg', 'yes', '', 0, '', '', '', '', 'online', 'all', 'Yes', 'Yes', 'yes', 'Nothing', 0, NULL, '', '0', '', '', '', '0', '', '', '', '', '', 0, '', 0, '', 2, 'yes', 'yes', 'yes', 'yes', 'yes'); \ No newline at end of file diff --git a/upload/cb_install/sql/ads_placements.sql b/upload/cb_install/sql/ads_placements.sql new file mode 100644 index 00000000..742fdeea --- /dev/null +++ b/upload/cb_install/sql/ads_placements.sql @@ -0,0 +1,9 @@ + +-- Advertisement Placements + +INSERT INTO `{tbl_prefix}ads_placements` (`placement_id`, `placement`, `placement_name`, `disable`) VALUES +(1, 'ad_160x600', 'Wide Skyscrapper 160 x 600', 'yes'), +(2, 'ad_468x60', 'Banner 468 x 60', 'yes'), +(3, 'ad_300x250', 'Medium Rectangle 300 x 250', 'yes'), +(4, 'ad_728x90', 'Leader Board 728 x 90', 'yes'), +(5, 'ad_120x600', 'Skyscrapper 120 x 600', 'yes'); \ No newline at end of file diff --git a/upload/cb_install/sql/categories.sql b/upload/cb_install/sql/categories.sql new file mode 100644 index 00000000..e22aa21f --- /dev/null +++ b/upload/cb_install/sql/categories.sql @@ -0,0 +1,16 @@ +INSERT INTO `{tbl_prefix}collection_categories` (`category_id`, `category_name`, `category_order`, `category_desc`, `date_added`, `category_thumb`, `isdefault`) VALUES +(1, 'Uncategorized', 0, 'Uncategorized', now(), 0, 'yes'); + + +INSERT INTO `{tbl_prefix}group_categories` (`category_id`, `category_name`, `category_order`, `category_desc`, `date_added`, `category_thumb`, `isdefault`) VALUES +(1, 'Uncategorized', 1, 'Uncategorized', now(), '', 'yes'); + + +INSERT INTO `{tbl_prefix}user_categories` (`category_id`, `category_name`, `category_order`, `category_desc`, `date_added`, `category_thumb`, `isdefault`) VALUES +(1, 'Basic User', 1, '', now(), '', 'yes'), +(2, 'Gurus', 1, '', now(), '', 'no'), +(3, 'Comedian', 1, '', now(), '', 'no'); + + +INSERT INTO `{tbl_prefix}video_categories` (`category_id`, `parent_id`, `category_name`, `category_order`, `category_desc`, `date_added`, `category_thumb`, `isdefault`) VALUES +(1, 0, 'Uncategorized', 1, '', now(), '', 'yes'); \ No newline at end of file diff --git a/upload/cb_install/sql/configs.sql b/upload/cb_install/sql/configs.sql new file mode 100644 index 00000000..820e1c24 --- /dev/null +++ b/upload/cb_install/sql/configs.sql @@ -0,0 +1,248 @@ +-- Configurations + +INSERT INTO `{tbl_prefix}config` (`configid`, `name`, `value`) VALUES +(1, 'site_title', 'ClipBucket v2'), +(2, 'site_slogan', 'A way to broadcast yourself'), +(3, 'baseurl', ''), +(4, 'basedir', ''), +(5, 'template_dir', 'cbv2new'), +(6, 'player_file', 'pak_player.php'), +(7, 'closed', '0'), +(8, 'closed_msg', 'We Are Updating Our Website, Please Visit us after few hours.'), +(9, 'description', 'Clip Bucket is an ultimate Video Sharing script'), +(10, 'keywords', 'clip bucket video sharing website script'), +(11, 'ffmpegpath', '/usr/local/bin/ffmpeg'), +(12, 'flvtool2path', '/usr/local/bin/flvtool2'), +(13, 'mp4boxpath', '/usr/local/bin/MP4Box'), +(14, 'vbrate', '512000'), +(15, 'srate', '22050'), +(16, 'r_height', ''), +(17, 'r_width', ''), +(18, 'resize', ''), +(19, 'mencoderpath', ''), +(20, 'keep_original', '1'), +(21, 'activation', ''), +(22, 'mplayerpath', ''), +(23, 'email_verification', '1'), +(24, 'allow_registeration', '1'), +(25, 'php_path', '/usr/bin/php'), +(26, 'videos_list_per_page', '30'), +(27, 'channels_list_per_page', '25'), +(28, 'videos_list_per_tab', '1'), +(29, 'channels_list_per_tab', '1'), +(30, 'video_comments', '1'), +(31, 'video_rating', '1'), +(32, 'comment_rating', '1'), +(33, 'video_download', '1'), +(34, 'video_embed', '1'), +(35, 'groups_list_per_page', '25'), +(36, 'seo', 'no'), +(37, 'admin_pages', '100'), +(38, 'search_list_per_page', '25'), +(39, 'recently_viewed_limit', '10'), +(40, 'max_upload_size', '1000'), +(41, 'sbrate', '128000'), +(42, 'thumb_width', '120'), +(43, 'thumb_height', '90'), +(45, 'user_comment_opt1', ''), +(44, 'ffmpeg_type', ''), +(46, 'user_comment_opt2', ''), +(47, 'user_comment_opt3', ''), +(48, 'user_comment_opt4', ''), +(49, 'user_rate_opt1', ''), +(50, 'captcha_type', '0'), +(51, 'allow_upload', ''), +(52, 'allowed_types', 'wmv,avi,divx,3gp,mov,mpeg,mpg,xvid,flv,asf,rm,dat,mp4,jpg'), +(53, 'version', '2.0.1'), +(54, 'version_type', 'Alpha'), +(55, 'allow_template_change', '1'), +(56, 'allow_language_change', '1'), +(57, 'default_site_lang', ''), +(58, 'video_require_login', ''), +(59, 'audio_codec', 'libfaac'), +(60, 'con_modules_type', ''), +(61, 'remoteUpload', ''), +(62, 'embedUpload', ''), +(63, 'player_div_id', ''), +(64, 'code_dev', '(Powered by ClipBucket)'), +(65, 'sys_os', ''), +(66, 'debug_level', ''), +(67, 'enable_troubleshooter', '1'), +(68, 'vrate', '25'), +(69, 'num_thumbs', '5'), +(70, 'big_thumb_width', '320'), +(71, 'big_thumb_height', '240'), +(72, 'user_max_chr', '15'), +(73, 'disallowed_usernames', 'shit, asshole, fucker'), +(74, 'min_age_reg', '0'), +(75, 'max_comment_chr', '800'), +(76, 'user_comment_own', ''), +(77, 'anonym_comments', 'yes'), +(78, 'player_dir', 'pak_player'), +(79, 'player_width', '661'), +(80, 'player_height', '360'), +(81, 'default_country_iso2', 'PK'), +(82, 'channel_player_width', '600'), +(83, 'channel_player_height', '281'), +(84, 'videos_items_grp_page', '24'), +(85, 'videos_items_hme_page', '25'), +(86, 'videos_items_columns', '12'), +(87, 'videos_items_ufav_page', '25'), +(88, 'videos_items_uvid_page', '25'), +(89, 'videos_items_search_page', '30'), +(90, 'videos_item_channel_page', '25'), +(91, 'users_items_subscriptions', '5'), +(92, 'users_items_subscibers', '5'), +(93, 'users_items_contacts_channel', '5'), +(94, 'users_items_search_page', '12'), +(95, 'users_items_group_page', '15'), +(96, 'cbhash', 'PGRpdiBhbGlnbj0iY2VudGVyIj48IS0tIERvIG5vdCByZW1vdmUgdGhpcyBjb3B5cmlnaHQgbm90aWNlIC0tPg0KUG93ZXJlZCBieSA8YSBocmVmPSJodHRwOi8vY2xpcC1idWNrZXQuY29tLyI+Q2xpcEJ1Y2tldDwvYT4gJXMgfCA8YSBocmVmPSJodHRwOi8vY2xpcC1idWNrZXQuY29tL2Fyc2xhbi1oYXNzYW4iPkFyc2xhbiBIYXNzYW48L2E+DQo8IS0tIERvIG5vdCByZW1vdmUgdGhpcyBjb3B5cmlnaHQgbm90aWNlIC0tPjwvZGl2Pg=='), +(97, 'min_video_title', '4'), +(98, 'max_video_title', '60'), +(99, 'min_video_desc', '5'), +(100, 'max_video_desc', '300'), +(101, 'video_categories', '4'), +(102, 'min_video_tags', '3'), +(103, 'max_video_tags', '30'), +(104, 'video_codec', 'libx264'), +(105, 'date_released', '01-05-2010'), +(106, 'date_installed', '01-05-2010'), +(107, 'date_updated', '2010-01-09 18:36:16'), +(108, 'support_email', 'webmaster@localhost'), +(109, 'website_email', 'webmaster@localhost'), +(110, 'welcome_email', 'webmaster@localhost'), +(112, 'anonymous_id', '99'), +(113, 'date_format', 'Y-m-d'), +(114, 'default_time_zone', '5'), +(156, 'use_crons', 'no'), +(115, 'autoplay_video', 'no'), +(116, 'default_country_iso2', 'PK'), +(117, 'channel_comments', '1'), +(118, 'max_profile_pic_size', '2500'), +(119, 'max_profile_pic_height', ''), +(120, 'max_profile_pic_width', '230'), +(121, 'gravatars', ''), +(122, 'picture_url', 'yes'), +(123, 'picture_upload', 'yes'), +(124, 'background_url', 'yes'), +(125, 'background_upload', 'yes'), +(126, 'max_bg_size', '2500'), +(127, 'max_bg_width', '1600'), +(128, 'max_bg_height', ''), +(129, 'background_color', 'yes'), +(130, 'send_comment_notification', 'yes'), +(131, 'approve_video_notification', 'yes'), +(132, 'keep_mp4_as_is', 'yes'), +(133, 'hq_output', 'yes'), +(134, 'grp_categories', '3'), +(136, 'grps_items_search_page', '25'), +(137, 'grp_thumb_height', '140'), +(138, 'grp_thumb_width', '140'), +(139, 'grp_max_title', '20'), +(140, 'grp_max_desc', '500'), +(141, 'quick_conv', ''), +(142, 'server_friendly_conversion', ''), +(143, 'max_conversion', '2'), +(144, 'max_time_wait', '7200'), +(145, 'allow_unicode_usernames', 'yes'), +(146, 'min_username', '3'), +(147, 'max_username', '15'), +(154, 'youtube_enabled', 'yes'), +(148, 'allow_username_spaces', 'yes'), +(149, 'use_playlist', 'yes'), +(150, 'comments_captcha', 'guests'), +(151, 'player_logo_file', 'logo.jpg'), +(152, 'logo_placement', 'tl'), +(153, 'buffer_time', '5'), +(155, 'use_ffmpeg_vf', 'no'), +(224, 'own_photo_rating', ''), +(157, 'mail_type', 'mail'), +(158, 'smtp_host', ''), +(159, 'smtp_user', ''), +(160, 'smtp_pass', ''), +(161, 'smtp_auth', 'no'), +(162, 'smtp_port', ''), +(163, 'use_subs', '1'), +(164, 'pak_license', ''), +(165, 'photo_ratio', '16:10'), +(166, 'photo_thumb_width', '120'), +(167, 'photo_thumb_height', '75'), +(168, 'photo_med_width', '185'), +(169, 'photo_med_height', '116'), +(170, 'photo_lar_width', '600'), +(171, 'photo_crop', '1'), +(172, 'photo_multi_upload', '5'), +(173, 'photo_download', '1'), +(174, 'photo_comments', '1'), +(175, 'photo_rating', '1'), +(176, 'max_photo_size', '2'), +(177, 'watermark_photo', '0'), +(178, 'watermark_max_width', '120'), +(179, 'watermark_placement', 'left:top'), +(180, 'load_upload_form', 'yes'), +(181, 'load_remote_upload_form', 'yes'), +(182, 'load_embed_form', 'yes'), +(183, 'load_link_video_form', 'yes'), +(184, 'enable_groups', ''), +(185, 'groupsSection', 'yes'), +(186, 'videosSection', 'yes'), +(187, 'photosSection', 'yes'), +(188, 'homeSection', 'yes'), +(189, 'signupSection', 'yes'), +(190, 'uploadSection', 'yes'), +(191, 'collectionsSection', 'yes'), +(192, 'channelsSection', 'yes'), +(193, 'flvtoolpp', ''), +(194, 'normal_resolution', '480'), +(195, 'high_resolution', '720'), +(196, 'max_video_duration', '320'), +(197, 'embed_player_height', '250'), +(198, 'embed_player_width', '300'), +(199, 'autoplay_embed', 'yes'), +(200, 'playlistsSection', 'yes'), +(201, 'photo_main_list', '10'), +(202, 'photo_home_tabs', '30'), +(203, 'photo_search_result', '30'), +(204, 'photo_channel_page', '10'), +(205, 'photo_user_photos', '20'), +(206, 'photo_user_favorites', '20'), +(207, 'photo_other_limit', '8'), +(208, 'collection_per_page', '30'), +(209, 'collection_home_page', '10'), +(210, 'collection_search_result', '20'), +(211, 'collection_channel_page', '10'), +(212, 'collection_user_collections', '20'), +(213, 'collection_user_favorites', '20'), +(214, 'collection_items_page', '20'), +(218, 'reCaptcha_private_key', '6LcQI8ESAAAAALc_oz1xuNsBVRNx554CaJHjcoXt'), +(217, 'reCaptcha_public_key', '6LcQI8ESAAAAALN1vYQovst9c6nlU52iHdqWExp8'), +(219, 'channel_rating', '1'), +(220, 'own_channel_rating', '1'), +(221, 'collection_rating', '1'), +(222, 'own_collection_rating', '1'), +(223, 'own_video_rating', '1'), +(NULL,'feedsSection','yes'), +(NULL,'max_topic_length','1500'), +(NULL,'max_topic_title','300'); + + + +INSERT INTO `{tbl_prefix}languages` (`language_id`, `language_code`, `language_name`, `language_regex`, `language_active`, `language_default`) VALUES +(5, 'en', 'English', '/^en/i', 'yes', 'yes'); + + +INSERT INTO `{tbl_prefix}validation_re` (`re_id`, `re_name`, `re_code`, `re_syntax`) VALUES +(1, 'Username', 'username', '^^[a-zA-Z0-9_]+$'), +(2, 'Email', 'email', '^[_a-z0-9-]+(\\.[_a-z0-9-]+)*@[a-z0-9-]+(\\.[a-z0-9-]+)*(\\.[a-z]{2,10})$'), +(3, 'Field Text', 'field_text', '^^[_a-z0-9-]+$'); + + +INSERT INTO `{tbl_prefix}config` (`configid` ,`name` ,`value`)VALUES +(NULL , 'comments_per_page', '15'), +(NULL, 'embed_type', 'iframe'); + +-- Addition for 2.6 +INSERT INTO `{tbl_prefix}config` (`configid`, `name`, `value`) VALUES (NULL, 'facebook_embed', 'yes'); +INSERT INTO `{tbl_prefix}config` (`configid`, `name`, `value`) VALUES (NULL, 'seo_vido_url', '1'); +INSERT INTO `{tbl_prefix}config` (`configid`, `name`, `value`) VALUES (NULL, 'use_cached_pagin', 'yes'), +(NULL, 'cached_pagin_time', '5'); diff --git a/upload/cb_install/sql/countries.sql b/upload/cb_install/sql/countries.sql new file mode 100644 index 00000000..e6aa1451 --- /dev/null +++ b/upload/cb_install/sql/countries.sql @@ -0,0 +1,245 @@ + +-- +-- Dumping data for table `countries` +-- + +INSERT INTO `{tbl_prefix}countries` (`country_id`, `iso2`, `name`, `name_en`, `iso3`, `numcode`) VALUES +(1, 'AF', 'AFGHANISTAN', 'Afghanistan', 'AFG', 4), +(2, 'AL', 'ALBANIA', 'Albania', 'ALB', 8), +(3, 'DZ', 'ALGERIA', 'Algeria', 'DZA', 12), +(4, 'AS', 'AMERICAN SAMOA', 'American Samoa', 'ASM', 16), +(5, 'AD', 'ANDORRA', 'Andorra', 'AND', 20), +(6, 'AO', 'ANGOLA', 'Angola', 'AGO', 24), +(7, 'AI', 'ANGUILLA', 'Anguilla', 'AIA', 660), +(8, 'AQ', 'ANTARCTICA', 'Antarctica', NULL, NULL), +(9, 'AG', 'ANTIGUA AND BARBUDA', 'Antigua and Barbuda', 'ATG', 28), +(10, 'AR', 'ARGENTINA', 'Argentina', 'ARG', 32), +(11, 'AM', 'ARMENIA', 'Armenia', 'ARM', 51), +(12, 'AW', 'ARUBA', 'Aruba', 'ABW', 533), +(13, 'AU', 'AUSTRALIA', 'Australia', 'AUS', 36), +(14, 'AT', 'AUSTRIA', 'Austria', 'AUT', 40), +(15, 'AZ', 'AZERBAIJAN', 'Azerbaijan', 'AZE', 31), +(16, 'BS', 'BAHAMAS', 'Bahamas', 'BHS', 44), +(17, 'BH', 'BAHRAIN', 'Bahrain', 'BHR', 48), +(18, 'BD', 'BANGLADESH', 'Bangladesh', 'BGD', 50), +(19, 'BB', 'BARBADOS', 'Barbados', 'BRB', 52), +(20, 'BY', 'BELARUS', 'Belarus', 'BLR', 112), +(21, 'BE', 'BELGIUM', 'Belgium', 'BEL', 56), +(22, 'BZ', 'BELIZE', 'Belize', 'BLZ', 84), +(23, 'BJ', 'BENIN', 'Benin', 'BEN', 204), +(24, 'BM', 'BERMUDA', 'Bermuda', 'BMU', 60), +(25, 'BT', 'BHUTAN', 'Bhutan', 'BTN', 64), +(26, 'BO', 'BOLIVIA', 'Bolivia', 'BOL', 68), +(27, 'BA', 'BOSNIA AND HERZEGOVINA', 'Bosnia and Herzegovina', 'BIH', 70), +(28, 'BW', 'BOTSWANA', 'Botswana', 'BWA', 72), +(29, 'BV', 'BOUVET ISLAND', 'Bouvet Island', NULL, NULL), +(30, 'BR', 'BRAZIL', 'Brazil', 'BRA', 76), +(31, 'IO', 'BRITISH INDIAN OCEAN TERRITORY', 'British Indian Ocean Territory', NULL, NULL), +(32, 'BN', 'BRUNEI DARUSSALAM', 'Brunei Darussalam', 'BRN', 96), +(33, 'BG', 'BULGARIA', 'Bulgaria', 'BGR', 100), +(34, 'BF', 'BURKINA FASO', 'Burkina Faso', 'BFA', 854), +(35, 'BI', 'BURUNDI', 'Burundi', 'BDI', 108), +(36, 'KH', 'CAMBODIA', 'Cambodia', 'KHM', 116), +(37, 'CM', 'CAMEROON', 'Cameroon', 'CMR', 120), +(38, 'CA', 'CANADA', 'Canada', 'CAN', 124), +(39, 'CV', 'CAPE VERDE', 'Cape Verde', 'CPV', 132), +(40, 'KY', 'CAYMAN ISLANDS', 'Cayman Islands', 'CYM', 136), +(41, 'CF', 'CENTRAL AFRICAN REPUBLIC', 'Central African Republic', 'CAF', 140), +(42, 'TD', 'CHAD', 'Chad', 'TCD', 148), +(43, 'CL', 'CHILE', 'Chile', 'CHL', 152), +(44, 'CN', 'CHINA', 'China', 'CHN', 156), +(45, 'CX', 'CHRISTMAS ISLAND', 'Christmas Island', NULL, NULL), +(46, 'CC', 'COCOS (KEELING) ISLANDS', 'Cocos (Keeling) Islands', NULL, NULL), +(47, 'CO', 'COLOMBIA', 'Colombia', 'COL', 170), +(48, 'KM', 'COMOROS', 'Comoros', 'COM', 174), +(49, 'CG', 'CONGO', 'Congo', 'COG', 178), +(50, 'CD', 'CONGO, THE DEMOCRATIC REPUBLIC OF THE', 'Congo, the Democratic Republic of the', 'COD', 180), +(51, 'CK', 'COOK ISLANDS', 'Cook Islands', 'COK', 184), +(52, 'CR', 'COSTA RICA', 'Costa Rica', 'CRI', 188), +(53, 'CI', 'COTE D''IVOIRE', 'Cote D''Ivoire', 'CIV', 384), +(54, 'HR', 'CROATIA', 'Croatia', 'HRV', 191), +(55, 'CU', 'CUBA', 'Cuba', 'CUB', 192), +(56, 'CY', 'CYPRUS', 'Cyprus', 'CYP', 196), +(57, 'CZ', 'CZECH REPUBLIC', 'Czech Republic', 'CZE', 203), +(58, 'DK', 'DENMARK', 'Denmark', 'DNK', 208), +(59, 'DJ', 'DJIBOUTI', 'Djibouti', 'DJI', 262), +(60, 'DM', 'DOMINICA', 'Dominica', 'DMA', 212), +(61, 'DO', 'DOMINICAN REPUBLIC', 'Dominican Republic', 'DOM', 214), +(62, 'EC', 'ECUADOR', 'Ecuador', 'ECU', 218), +(63, 'EG', 'EGYPT', 'Egypt', 'EGY', 818), +(64, 'SV', 'EL SALVADOR', 'El Salvador', 'SLV', 222), +(65, 'GQ', 'EQUATORIAL GUINEA', 'Equatorial Guinea', 'GNQ', 226), +(66, 'ER', 'ERITREA', 'Eritrea', 'ERI', 232), +(67, 'EE', 'ESTONIA', 'Estonia', 'EST', 233), +(68, 'ET', 'ETHIOPIA', 'Ethiopia', 'ETH', 231), +(69, 'FK', 'FALKLAND ISLANDS (MALVINAS)', 'Falkland Islands (Malvinas)', 'FLK', 238), +(70, 'FO', 'FAROE ISLANDS', 'Faroe Islands', 'FRO', 234), +(71, 'FJ', 'FIJI', 'Fiji', 'FJI', 242), +(72, 'FI', 'FINLAND', 'Finland', 'FIN', 246), +(73, 'FR', 'FRANCE', 'France', 'FRA', 250), +(74, 'GF', 'FRENCH GUIANA', 'French Guiana', 'GUF', 254), +(75, 'PF', 'FRENCH POLYNESIA', 'French Polynesia', 'PYF', 258), +(76, 'TF', 'FRENCH SOUTHERN TERRITORIES', 'French Southern Territories', NULL, NULL), +(77, 'GA', 'GABON', 'Gabon', 'GAB', 266), +(78, 'GM', 'GAMBIA', 'Gambia', 'GMB', 270), +(79, 'GE', 'GEORGIA', 'Georgia', 'GEO', 268), +(80, 'DE', 'GERMANY', 'Germany', 'DEU', 276), +(81, 'GH', 'GHANA', 'Ghana', 'GHA', 288), +(82, 'GI', 'GIBRALTAR', 'Gibraltar', 'GIB', 292), +(83, 'GR', 'GREECE', 'Greece', 'GRC', 300), +(84, 'GL', 'GREENLAND', 'Greenland', 'GRL', 304), +(85, 'GD', 'GRENADA', 'Grenada', 'GRD', 308), +(86, 'GP', 'GUADELOUPE', 'Guadeloupe', 'GLP', 312), +(87, 'GU', 'GUAM', 'Guam', 'GUM', 316), +(88, 'GT', 'GUATEMALA', 'Guatemala', 'GTM', 320), +(89, 'GN', 'GUINEA', 'Guinea', 'GIN', 324), +(90, 'GW', 'GUINEA-BISSAU', 'Guinea-Bissau', 'GNB', 624), +(91, 'GY', 'GUYANA', 'Guyana', 'GUY', 328), +(92, 'HT', 'HAITI', 'Haiti', 'HTI', 332), +(93, 'HM', 'HEARD ISLAND AND MCDONALD ISLANDS', 'Heard Island and Mcdonald Islands', NULL, NULL), +(94, 'VA', 'HOLY SEE (VATICAN CITY STATE)', 'Holy See (Vatican City State)', 'VAT', 336), +(95, 'HN', 'HONDURAS', 'Honduras', 'HND', 340), +(96, 'HK', 'HONG KONG', 'Hong Kong', 'HKG', 344), +(97, 'HU', 'HUNGARY', 'Hungary', 'HUN', 348), +(98, 'IS', 'ICELAND', 'Iceland', 'ISL', 352), +(99, 'IN', 'INDIA', 'India', 'IND', 356), +(100, 'ID', 'INDONESIA', 'Indonesia', 'IDN', 360), +(101, 'IR', 'IRAN, ISLAMIC REPUBLIC OF', 'Iran, Islamic Republic of', 'IRN', 364), +(102, 'IQ', 'IRAQ', 'Iraq', 'IRQ', 368), +(103, 'IE', 'IRELAND', 'Ireland', 'IRL', 372), +(104, 'IL', 'ISRAEL', 'Israel', 'ISR', 376), +(105, 'IT', 'ITALY', 'Italy', 'ITA', 380), +(106, 'JM', 'JAMAICA', 'Jamaica', 'JAM', 388), +(107, 'JP', 'JAPAN', 'Japan', 'JPN', 392), +(108, 'JO', 'JORDAN', 'Jordan', 'JOR', 400), +(109, 'KZ', 'KAZAKHSTAN', 'Kazakhstan', 'KAZ', 398), +(110, 'KE', 'KENYA', 'Kenya', 'KEN', 404), +(111, 'KI', 'KIRIBATI', 'Kiribati', 'KIR', 296), +(112, 'KP', 'KOREA, DEMOCRATIC PEOPLE''S REPUBLIC OF', 'Korea, Democratic People''s Republic of', 'PRK', 408), +(113, 'KR', 'KOREA, REPUBLIC OF', 'Korea, Republic of', 'KOR', 410), +(114, 'KW', 'KUWAIT', 'Kuwait', 'KWT', 414), +(115, 'KG', 'KYRGYZSTAN', 'Kyrgyzstan', 'KGZ', 417), +(116, 'LA', 'LAO PEOPLE''S DEMOCRATIC REPUBLIC', 'Lao People''s Democratic Republic', 'LAO', 418), +(117, 'LV', 'LATVIA', 'Latvia', 'LVA', 428), +(118, 'LB', 'LEBANON', 'Lebanon', 'LBN', 422), +(119, 'LS', 'LESOTHO', 'Lesotho', 'LSO', 426), +(120, 'LR', 'LIBERIA', 'Liberia', 'LBR', 430), +(121, 'LY', 'LIBYAN ARAB JAMAHIRIYA', 'Libyan Arab Jamahiriya', 'LBY', 434), +(122, 'LI', 'LIECHTENSTEIN', 'Liechtenstein', 'LIE', 438), +(123, 'LT', 'LITHUANIA', 'Lithuania', 'LTU', 440), +(124, 'LU', 'LUXEMBOURG', 'Luxembourg', 'LUX', 442), +(125, 'MO', 'MACAO', 'Macao', 'MAC', 446), +(126, 'MK', 'MACEDONIA, THE FORMER YUGOSLAV REPUBLIC OF', 'Macedonia, the Former Yugoslav Republic of', 'MKD', 807), +(127, 'MG', 'MADAGASCAR', 'Madagascar', 'MDG', 450), +(128, 'MW', 'MALAWI', 'Malawi', 'MWI', 454), +(129, 'MY', 'MALAYSIA', 'Malaysia', 'MYS', 458), +(130, 'MV', 'MALDIVES', 'Maldives', 'MDV', 462), +(131, 'ML', 'MALI', 'Mali', 'MLI', 466), +(132, 'MT', 'MALTA', 'Malta', 'MLT', 470), +(133, 'MH', 'MARSHALL ISLANDS', 'Marshall Islands', 'MHL', 584), +(134, 'MQ', 'MARTINIQUE', 'Martinique', 'MTQ', 474), +(135, 'MR', 'MAURITANIA', 'Mauritania', 'MRT', 478), +(136, 'MU', 'MAURITIUS', 'Mauritius', 'MUS', 480), +(137, 'YT', 'MAYOTTE', 'Mayotte', NULL, NULL), +(138, 'MX', 'MEXICO', 'Mexico', 'MEX', 484), +(139, 'FM', 'MICRONESIA, FEDERATED STATES OF', 'Micronesia, Federated States of', 'FSM', 583), +(140, 'MD', 'MOLDOVA, REPUBLIC OF', 'Moldova, Republic of', 'MDA', 498), +(141, 'MC', 'MONACO', 'Monaco', 'MCO', 492), +(142, 'MN', 'MONGOLIA', 'Mongolia', 'MNG', 496), +(143, 'MS', 'MONTSERRAT', 'Montserrat', 'MSR', 500), +(144, 'MA', 'MOROCCO', 'Morocco', 'MAR', 504), +(145, 'MZ', 'MOZAMBIQUE', 'Mozambique', 'MOZ', 508), +(146, 'MM', 'MYANMAR', 'Myanmar', 'MMR', 104), +(147, 'NA', 'NAMIBIA', 'Namibia', 'NAM', 516), +(148, 'NR', 'NAURU', 'Nauru', 'NRU', 520), +(149, 'NP', 'NEPAL', 'Nepal', 'NPL', 524), +(150, 'NL', 'NETHERLANDS', 'Netherlands', 'NLD', 528), +(151, 'AN', 'NETHERLANDS ANTILLES', 'Netherlands Antilles', 'ANT', 530), +(152, 'NC', 'NEW CALEDONIA', 'New Caledonia', 'NCL', 540), +(153, 'NZ', 'NEW ZEALAND', 'New Zealand', 'NZL', 554), +(154, 'NI', 'NICARAGUA', 'Nicaragua', 'NIC', 558), +(155, 'NE', 'NIGER', 'Niger', 'NER', 562), +(156, 'NG', 'NIGERIA', 'Nigeria', 'NGA', 566), +(157, 'NU', 'NIUE', 'Niue', 'NIU', 570), +(158, 'NF', 'NORFOLK ISLAND', 'Norfolk Island', 'NFK', 574), +(159, 'MP', 'NORTHERN MARIANA ISLANDS', 'Northern Mariana Islands', 'MNP', 580), +(160, 'NO', 'NORWAY', 'Norway', 'NOR', 578), +(161, 'OM', 'OMAN', 'Oman', 'OMN', 512), +(162, 'PK', 'PAKISTAN', 'Pakistan', 'PAK', 586), +(163, 'PW', 'PALAU', 'Palau', 'PLW', 585), +(164, 'PS', 'PALESTINIAN TERRITORY, OCCUPIED', 'Palestinian Territory, Occupied', NULL, NULL), +(165, 'PA', 'PANAMA', 'Panama', 'PAN', 591), +(166, 'PG', 'PAPUA NEW GUINEA', 'Papua New Guinea', 'PNG', 598), +(167, 'PY', 'PARAGUAY', 'Paraguay', 'PRY', 600), +(168, 'PE', 'PERU', 'Peru', 'PER', 604), +(169, 'PH', 'PHILIPPINES', 'Philippines', 'PHL', 608), +(170, 'PN', 'PITCAIRN', 'Pitcairn', 'PCN', 612), +(171, 'PL', 'POLAND', 'Poland', 'POL', 616), +(172, 'PT', 'PORTUGAL', 'Portugal', 'PRT', 620), +(173, 'PR', 'PUERTO RICO', 'Puerto Rico', 'PRI', 630), +(174, 'QA', 'QATAR', 'Qatar', 'QAT', 634), +(175, 'RE', 'REUNION', 'Reunion', 'REU', 638), +(176, 'RO', 'ROMANIA', 'Romania', 'ROM', 642), +(177, 'RU', 'RUSSIAN FEDERATION', 'Russian Federation', 'RUS', 643), +(178, 'RW', 'RWANDA', 'Rwanda', 'RWA', 646), +(179, 'SH', 'SAINT HELENA', 'Saint Helena', 'SHN', 654), +(180, 'KN', 'SAINT KITTS AND NEVIS', 'Saint Kitts and Nevis', 'KNA', 659), +(181, 'LC', 'SAINT LUCIA', 'Saint Lucia', 'LCA', 662), +(182, 'PM', 'SAINT PIERRE AND MIQUELON', 'Saint Pierre and Miquelon', 'SPM', 666), +(183, 'VC', 'SAINT VINCENT AND THE GRENADINES', 'Saint Vincent and the Grenadines', 'VCT', 670), +(184, 'WS', 'SAMOA', 'Samoa', 'WSM', 882), +(185, 'SM', 'SAN MARINO', 'San Marino', 'SMR', 674), +(186, 'ST', 'SAO TOME AND PRINCIPE', 'Sao Tome and Principe', 'STP', 678), +(187, 'SA', 'SAUDI ARABIA', 'Saudi Arabia', 'SAU', 682), +(188, 'SN', 'SENEGAL', 'Senegal', 'SEN', 686), +(189, 'CS', 'SERBIA AND MONTENEGRO', 'Serbia and Montenegro', NULL, NULL), +(190, 'SC', 'SEYCHELLES', 'Seychelles', 'SYC', 690), +(191, 'SL', 'SIERRA LEONE', 'Sierra Leone', 'SLE', 694), +(192, 'SG', 'SINGAPORE', 'Singapore', 'SGP', 702), +(193, 'SK', 'SLOVAKIA', 'Slovakia', 'SVK', 703), +(194, 'SI', 'SLOVENIA', 'Slovenia', 'SVN', 705), +(195, 'SB', 'SOLOMON ISLANDS', 'Solomon Islands', 'SLB', 90), +(196, 'SO', 'SOMALIA', 'Somalia', 'SOM', 706), +(197, 'ZA', 'SOUTH AFRICA', 'South Africa', 'ZAF', 710), +(198, 'GS', 'SOUTH GEORGIA AND THE SOUTH SANDWICH ISLANDS', 'South Georgia and the South Sandwich Islands', NULL, NULL), +(199, 'ES', 'SPAIN', 'Spain', 'ESP', 724), +(200, 'LK', 'SRI LANKA', 'Sri Lanka', 'LKA', 144), +(201, 'SD', 'SUDAN', 'Sudan', 'SDN', 736), +(202, 'SR', 'SURINAME', 'Suriname', 'SUR', 740), +(203, 'SJ', 'SVALBARD AND JAN MAYEN', 'Svalbard and Jan Mayen', 'SJM', 744), +(204, 'SZ', 'SWAZILAND', 'Swaziland', 'SWZ', 748), +(205, 'SE', 'SWEDEN', 'Sweden', 'SWE', 752), +(206, 'CH', 'SWITZERLAND', 'Switzerland', 'CHE', 756), +(207, 'SY', 'SYRIAN ARAB REPUBLIC', 'Syrian Arab Republic', 'SYR', 760), +(208, 'TW', 'TAIWAN, PROVINCE OF CHINA', 'Taiwan, Province of China', 'TWN', 158), +(209, 'TJ', 'TAJIKISTAN', 'Tajikistan', 'TJK', 762), +(210, 'TZ', 'TANZANIA, UNITED REPUBLIC OF', 'Tanzania, United Republic of', 'TZA', 834), +(211, 'TH', 'THAILAND', 'Thailand', 'THA', 764), +(212, 'TL', 'TIMOR-LESTE', 'Timor-Leste', NULL, NULL), +(213, 'TG', 'TOGO', 'Togo', 'TGO', 768), +(214, 'TK', 'TOKELAU', 'Tokelau', 'TKL', 772), +(215, 'TO', 'TONGA', 'Tonga', 'TON', 776), +(216, 'TT', 'TRINIDAD AND TOBAGO', 'Trinidad and Tobago', 'TTO', 780), +(217, 'TN', 'TUNISIA', 'Tunisia', 'TUN', 788), +(218, 'TR', 'TURKEY', 'Turkey', 'TUR', 792), +(219, 'TM', 'TURKMENISTAN', 'Turkmenistan', 'TKM', 795), +(220, 'TC', 'TURKS AND CAICOS ISLANDS', 'Turks and Caicos Islands', 'TCA', 796), +(221, 'TV', 'TUVALU', 'Tuvalu', 'TUV', 798), +(222, 'UG', 'UGANDA', 'Uganda', 'UGA', 800), +(223, 'UA', 'UKRAINE', 'Ukraine', 'UKR', 804), +(224, 'AE', 'UNITED ARAB EMIRATES', 'United Arab Emirates', 'ARE', 784), +(225, 'GB', 'UNITED KINGDOM', 'United Kingdom', 'GBR', 826), +(226, 'US', 'UNITED STATES', 'United States', 'USA', 840), +(227, 'UM', 'UNITED STATES MINOR OUTLYING ISLANDS', 'United States Minor Outlying Islands', NULL, NULL), +(228, 'UY', 'URUGUAY', 'Uruguay', 'URY', 858), +(229, 'UZ', 'UZBEKISTAN', 'Uzbekistan', 'UZB', 860), +(230, 'VU', 'VANUATU', 'Vanuatu', 'VUT', 548), +(231, 'VE', 'VENEZUELA', 'Venezuela', 'VEN', 862), +(232, 'VN', 'VIET NAM', 'Viet Nam', 'VNM', 704), +(233, 'VG', 'VIRGIN ISLANDS, BRITISH', 'Virgin Islands, British', 'VGB', 92), +(234, 'VI', 'VIRGIN ISLANDS, U.S.', 'Virgin Islands, U.s.', 'VIR', 850), +(235, 'WF', 'WALLIS AND FUTUNA', 'Wallis and Futuna', 'WLF', 876), +(236, 'EH', 'WESTERN SAHARA', 'Western Sahara', 'ESH', 732), +(237, 'YE', 'YEMEN', 'Yemen', 'YEM', 887), +(238, 'ZM', 'ZAMBIA', 'Zambia', 'ZMB', 894), +(239, 'ZW', 'ZIMBABWE', 'Zimbabwe', 'ZWE', 716); \ No newline at end of file diff --git a/upload/cb_install/sql/email_templates.sql b/upload/cb_install/sql/email_templates.sql new file mode 100644 index 00000000..ef116999 --- /dev/null +++ b/upload/cb_install/sql/email_templates.sql @@ -0,0 +1,19 @@ + +INSERT INTO `{tbl_prefix}email_templates` (`email_template_id`, `email_template_name`, `email_template_code`, `email_template_subject`, `email_template`, `email_template_allowed_tags`) VALUES +(1, 'Share Video Template', 'share_video_template', '[{website_title}] - {username} wants to share a video with you', '\r\n\r\n\r\n\r\n\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
    {website_title}share video
    {username} wants to share Video With You\r\n
    Video Description
    \r\n {video_description}
    Personal Message
    \r\n {user_message}\r\n
    \r\n
    \r\nThanks,
    \r\n{username}
    copyrights {date_year} {website_title}
    \r\n\r\n', '{website_title},{'), +(2, 'Email Verification Template', 'email_verify_template', '[{website_title}] - Account activation email', 'Hello {username},\r\nThank you for joining {website_title}, one last step is required in order to activate your account\r\n\r\nClick Here\r\n{baseurl}/activation.php?av_username={username}&avcode={avcode}\r\n\r\nEmail : {email}\r\nUsername : {username}\r\nActivation code : {avcode}\r\n\r\nif above given is not working , please go here and activate it\r\n{baseurl}/activation.php\r\n\r\n====================\r\nRegards\r\n{website_title}', ''), +(3, 'Private Message Notification', 'pm_email_message', '[{website_title}] - {sender} has sent you a private message', '{sender} has sent you a private message, \r\n\r\n{subject}\r\n"{content}"\r\n\r\nclick here to view your inbox {baseurl}/private_message.php?mode=inbox&mid={msg_id}\r\n\r\n{website_title}', ''), +(4, 'Acitvation code request template', 'avcode_request_template', '[{website_title}] - Account activation code request', 'Hello {username},\r\n\r\nYour Activation Code is : {avcode}\r\nClick Here To goto Activation Page\r\n\r\nDirect Activation\r\n==========================================\r\nClick Here or Copy & Paste the following link in your browser\r\n{baseurl}/activation.php?av_username={username}&avcode={avcode}\r\n\r\nif above given links are not working, please go here and activate it\r\n\r\nEmail : {email}\r\nUsername : {username}\r\nActivation code : {avcode}\r\n\r\nif above given is not working , please go here and activate it\r\n{baseurl}/activation.php\r\n\r\n----------------\r\nRegards\r\n{website_title}', 'username,email,avcode,doj'), +(5, 'Welcome Message Template', 'welcome_message_template', 'Welcome {username} to {website_title}', 'Hello {username},\r\nThanks for joining at {website_title}!, you are now part of our community and we hope you will enjoy your stay\r\n\r\nAll the best,\r\n{website_title}', 'username,email'), +(6, 'Password Reset Request', 'password_reset_request', '[{website_title}] - Password reset confirmation', 'Dear {username}\r\nyou have requested a password reset, please follow the link in order to reset your password\r\n{baseurl}/forgot.php?mode=reset_pass&user={userid}&avcode={avcode}\r\n\r\n-----------------------------------------\r\nIF YOU HAVE NOT REQUESTED A PASSWORD RESET - PLEASE IGNORE THIS MESSAGE\r\n-----------------------------------------\r\nRegards\r\n{website_title}', 'username,userid,avcode'), +(7, 'Password Reset Details', 'password_reset_details', '[{website_title}] - Password reset details', 'Dear {username}\r\nyour password has been reset\r\nyour new password is : {password}\r\n\r\nclick here to login to website\r\n<{login_link}>\r\n\r\n---------------\r\nRegards\r\n{website_title}', 'username,password'), +(8, 'Forgot username request', 'forgot_username_request', '[{website_title}] - your {website_title} username', 'Hello,\r\nyour {website_title} username is : {username}\r\n\r\n--------------\r\nRegards\r\n{website_title}', '{username}'), +(9, 'Friend Request Email', 'friend_request_email', '[{website_title}] {username} add you as friend', 'Hi {reciever},\r\n{sender} added you as a friend on {website_title}. We need to confirm that you know {sender} in order for you to be friends on {website_title}.\r\n\r\nView profile of {sender} \r\nclick here to respond to friendship request\r\n\r\nThanks,\r\n{website_title} Team', 'reciever,sender,sender_link,request_link'), +(10, 'Friend Confirmation Email', 'friend_confirmation_email', '[{website_title}] - {sender} has confirmed you as a friend', 'Hi {reciever},\r\n{sender} confirmed you as a friend on {website_title}.\r\n\r\nView {sender} profile\r\n\r\nThanks,\r\nThe {website_title} Team', 'sender,reciever,sender_link'), +(11, 'Group Invitation', 'group_invitation', '[{website_title}] {sender} has invited you to join group "{group_name}"', '{sender} invited you to join the {website_title} group "{group_name}".\r\n\r\n{group_description}\r\n\r\nTo see more details and confirm this group invitation, follow the link below:\r\n{group_url}\r\n\r\nThanks,\r\n{website_title}', 'sender,reciever,group_name,group_url'), +(12, 'Contact Form', 'contact_form', '[{website_title} - Contact] {reason} from {name}', 'Name : {name}\r\nEmail : {email}\r\nReason : {reason}\r\n\r\nMessage:\r\n{message}\r\n\r\n===============\r\nIp : {ip_address}\r\ndate : {now}', ''), +(13, 'Video Acitvation Email', 'video_activation_email', '[{website_title}] - Your video has been activated', 'Hello {username},\r\nYour video has been reviewed and activated by one of our staff, thanks for uploading this video. You can view this video here.\r\n{video_link}\r\n\r\nThanks\r\n{website_title} Team', ''), +(14, 'User Comment Email', 'user_comment_email', '[{website_title}] {username} made comment on your {obj}', '{username} has commented on your {obj}\r\n"{comment}"\r\n\r\n{obj_link}\r\n\r\n{website_title} team', ''), +(15, 'Photo Share Template', 'photo_share_template', '{username} wants to share photo with you', '\r\n\r\n\r\n\r\n\r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
    {website_title}
    {username} wants to share this photo with you
    \r\n
    Photo Description
    \r\n {photo_description}
    Personal Message
    \r\n {user_message}\r\n
    \r\n
    \r\nThanks,
    \r\n{website_title}
    copyrights {date_year} {website_title}
    \r\n\r\n', ''), +(16, 'Video Subscription Email', 'video_subscription_email', '{uploader} has uploaded new video on {website_title}', 'Hello {username}\r\n\r\nYou have been notified by {website_title} that {uploader} has uploaded new video \r\n\r\nVideo Title : {video_title}\r\nVideo Description : {video_description}\r\n\r\n\r\n\r\n
    \r\nclick here to watch this video
    \r\n\r\n\r\nYou are notified because you are subscribed to {uploader}, you can manage your subscriptions by going to your account and click on manage subscriptions.\r\n{website_title}', ''), +(17, 'Collection Share Template', 'collection_share_template', '{username} wants to share collection with you', '\r\n\r\n\r\n\r\n\r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
    {website_title}
    {username} wants to share this collection with you.
    \r\n
    Collection Description
    \r\n {description}
    Personal Message
    \r\n {user_message}\r\n
    \r\n
    \r\nThanks,
    \r\n{website_title}
    copyrights {date_year} {website_title}
    \r\n\r\n', ''); diff --git a/upload/cb_install/sql/import_categories.sql b/upload/cb_install/sql/import_categories.sql new file mode 100644 index 00000000..cb3c3844 --- /dev/null +++ b/upload/cb_install/sql/import_categories.sql @@ -0,0 +1,26 @@ + +INSERT INTO `{tbl_prefix}collection_categories` (`category_id`, `category_name`, `category_order`, `category_desc`, `date_added`, `category_thumb`, `isdefault`) VALUES +(1, 'Uncategorized', 0, 'Uncategorized', '2010-12-29 19:21:47', 0, 'yes'); + +-- +-- Dumping data for table `group_categories` +-- + +INSERT INTO `{tbl_prefix}group_categories` (`category_id`, `category_name`, `category_order`, `category_desc`, `date_added`, `category_thumb`, `isdefault`) VALUES +(1, 'Uncategorized', 1, 'Uncategorized', '2010-01-14 06:26:47', '', 'yes'); + +-- +-- Dumping data for table `user_categories` +-- + +INSERT INTO `{tbl_prefix}user_categories` (`category_id`, `category_name`, `category_order`, `category_desc`, `date_added`, `category_thumb`, `isdefault`) VALUES +(1, 'Basic User', 1, '', '2009-12-03 12:18:15', '', 'yes'), +(2, 'Gurus', 1, '', '2009-12-03 12:18:21', '', 'no'), +(3, 'Comedian', 1, '', '2009-12-03 12:18:25', '', 'no'); + +-- +-- Dumping data for table `video_categories` +-- + +INSERT INTO `{tbl_prefix}video_categories` (`category_id`, `parent_id`, `category_name`, `category_order`, `category_desc`, `date_added`, `category_thumb`, `isdefault`) VALUES +(12, 0, 'Uncategorized', 1, '', '2011-02-12 16:40:32', '', 'yes'); \ No newline at end of file diff --git a/upload/cb_install/sql/pages.sql b/upload/cb_install/sql/pages.sql new file mode 100644 index 00000000..42bb301c --- /dev/null +++ b/upload/cb_install/sql/pages.sql @@ -0,0 +1,19 @@ + + +INSERT INTO `{tbl_prefix}pages` (`page_id`, `page_name`, `page_title`, `page_content`, `userid`, `active`, `delete_able`, `date_added`) VALUES +(1, 'About us', 'About us', '
    About Us
    \r\n \r\n \r\n

    ClipBucket is one of the world''s best video sites . We specialize in short-form\r\noriginal content - from new, emerging talents and established Hollywood\r\nheavyweights alike. We''re committed to delivering an exceptional\r\nentertainment experience, and we do so by engaging and empowering our\r\naudience every step of the way.

    \r\n

    Everyone can Watch Videos\r\non ClipBucket. People can see first-hand accounts of current events, find\r\nvideos about their hobbies and interests, and discover the\r\nquirky and unusual. As more people capture special moments on\r\nvideo,ClipBucket is empowering them to become the broadcasters of\r\ntomorrow.

    \r\n

    ClipBucket not only a video sharing website but\r\nalso has social network features, you can make friends,\r\nand send them videos and private messages. ClipBucket also has built in\r\nrating system and comment system so that people can discuss on there\r\ninterested videos, not only comment but also, people can rate Comments.

    ', 1, 'yes', 'no', '2010-01-01 08:47:56'), +(2, 'Privacy Policy', 'Privacy Policy', '

    ClipBucket Privacy Notice - YT Version\r\n

    \r\n

    Personal Information

    \r\n
      \r\n
    • Browsing ClipBucket You can watch videos on ClipBucket without having a ClipBucket Account or a PHPBucket Account. You also can contact us through the ClipBucket Help Center or by emailing us directly without having to register for an account.
    • \r\n
    • Your ClipBucket Account. For some activities on ClipBucket, like uploading videos, posting comments, flagging videos, or watching restricted videos, you need a ClipBucket or PHPBucket Account. We ask for some personal information when you create an account, including your email address and a password, which is used to protect your account from unauthorized access. A PHPBucket Account, additionally, allows you to access other PHPBucket services that require registration.
    • \r\n
    • Usage Information. When you use ClipBucket, we may record information about your usage of the site, such as the channels, groups and favorites you subscribe to, which other users you communicate with, the videos you watch, the frequency and size of data transfers, and information you display about yourself as well as information you click on in ClipBucket (including UI elements, settings). If you are logged in, we may associate that information with your ClipBucket Account. In order to ensure the quality of our service to you, we may place a tag (also called a "web beacon") in HTML-based customer support emails or other communications with you in order to confirm delivery.
    • \r\n
    • Content Uploaded to Site. Any personal information or video content that you voluntarily disclose online (e.g., video comments, your profile page) may be collected and used by others. If you download the ClipBucket Uploader, your copy includes a unique application number. This number, and information about your installation of the Uploader (version number, language) will be sent to ClipBucket when the Uploader automatically checks for updates and will be used to update your version of the Uploader.
    • \r\n
    \r\n

    Uses

    \r\n
      \r\n
    • If you submit personal information to ClipBucket, we may use that information to operate, maintain, and improve the features and functionality of ClipBucket, and to process any flagging activity or other communication you send to us.
    • \r\n
    • We do not use your email address or other personal information to send commercial or marketing messages without your consent. We may use your email address without further consent for non-marketing or administrative purposes (such as notifying you of major ClipBucket changes or for customer service purposes). You also can choose how often ClipBucket sends you email updates in your ClipBucket Account settings page.
    • \r\n
    • We use cookies, web beacons, and log file information to: (a) store information so that you will not have to re-enter it during your visit or the next time you visit ClipBucket; (b) provide custom, personalized content and information; (c) monitor the effectiveness of our marketing campaigns; (d) monitor aggregate metrics such as total number of visitors and pages viewed; and (e) track your entries, submissions, and status in promotions, sweepstakes, and contests.
    • \r\n
    \r\n

    Information That is Publicly Available

    \r\n
      \r\n
    • When you create a ClipBucket Account, some information about your ClipBucket Account and your account activity will be provided to other users of ClipBucket. This may include the date you opened your ClipBucket Account, the date you last logged into your ClipBucket Account, your age (if you choose to make it public), the country and the number of videos you have watched.
    • \r\n
    • Your ClipBucket Account name, not your email address, is displayed to other users when you engage in certain activities on ClipBucket, such as when you upload videos or send messages through ClipBucket. Other users can contact you by leaving a message or comment on the site.
    • \r\n
    • Any videos that you submit to ClipBucket may be redistributed through the internet and other media channels, and may be viewed by other ClipBucket users or the general public.
    • \r\n
    • You may also choose to add personal information which may include your name, gender, profile picture or other details, that will be visible to other users on your ClipBucket Account channel page. If you choose to add certain features to your ClipBucket Account channel page, then these features and your activity associated with these features will be displayed to other users and may be aggregated and shared with your friends or other users. Such shared activity may include your favorite videos, videos you rated and videos that you have uploaded.
    • \r\n
    \r\n

    Your Choices

    \r\n
      \r\n
    • If you have a ClipBucket Account, you may update or correct your personal profile information, email preferences and privacy settings at any time by visiting your account profile page.
    • \r\n
    • You may control the information that is available to other users and your confirmed friends at any time by editing your ClipBucket Account and the features that are included on your channel page. If you have enabled Active Sharing, other users may see that you, as identified by your account name, not your email address, are watching the same video.
    • \r\n
    • You may, of course, decline to submit personal information through ClipBucket, in which case you can still view videos and explore ClipBucket, but ClipBucket may not be able to provide certain services to you. Some advanced ClipBucket features may use other PHPBucket services like PHPBucket Checkout or AdSense. The privacy notices of those services govern the use of your personal information associated with them.
    • \r\n
    \r\n', 1, 'no', 'no', '2010-01-01 08:52:46'), +(3, 'Terms of Serivce', 'Terms of Service', 'Write your own terms of service...', 1, 'yes', 'no', '2010-01-01 08:53:57'), +(4, 'Help', 'Help', 'How to use ClipBucket
    1. Articles will be written pretty soon
    ', 1, 'yes', 'no', '2010-01-01 09:17:36'), +(5, '403 Error', '403 Forbidden', '

    403 Access Denied

    \r\nSorry, you cannot access this page...', 1, 'yes', 'no', '0000-00-00 00:00:00'), +(6, '404 Error', '404 Not Found', '

    404 Not Found

    \r\nwe are unable to find requested URL on server..', 1, 'yes', 'no', '0000-00-00 00:00:00'); + +UPDATE `{tbl_prefix}pages` SET `display` = 'no' WHERE `page_id` =5 LIMIT 1 ; +UPDATE `{tbl_prefix}pages` SET `display` = 'no' WHERE`page_id` =6 LIMIT 1 ; + +UPDATE `{tbl_prefix}pages` SET `page_order` = '1' WHERE `page_id` =1 LIMIT 1 ; +UPDATE `{tbl_prefix}pages` SET `page_order` = '2' WHERE `page_id` =2 LIMIT 1 ; +UPDATE `{tbl_prefix}pages` SET `page_order` = '3' WHERE `page_id` =3 LIMIT 1 ; +UPDATE `{tbl_prefix}pages` SET `page_order` = '4' WHERE `page_id` =4 LIMIT 1 ; +UPDATE `{tbl_prefix}pages` SET `page_order` = '5' WHERE `page_id` =5 LIMIT 1 ; +UPDATE `{tbl_prefix}pages` SET `page_order` = '6' WHERE `page_id` =6 LIMIT 1 ; \ No newline at end of file diff --git a/upload/cb_install/sql/structure.sql b/upload/cb_install/sql/structure.sql new file mode 100644 index 00000000..9d959db8 --- /dev/null +++ b/upload/cb_install/sql/structure.sql @@ -0,0 +1,1116 @@ +-- -------------------------------------------------------- + +-- +-- Table structure for table `action_log` +-- + +CREATE TABLE IF NOT EXISTS `{tbl_prefix}action_log` ( + `action_id` int(255) NOT NULL AUTO_INCREMENT, + `action_type` varchar(60) CHARACTER SET utf8 NOT NULL, + `action_username` varchar(60) CHARACTER SET utf8 NOT NULL, + `action_userid` int(30) NOT NULL, + `action_useremail` varchar(200) CHARACTER SET utf8 NOT NULL, + `action_userlevel` int(11) NOT NULL, + `action_ip` varchar(15) CHARACTER SET utf8 NOT NULL, + `date_added` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `action_success` enum('yes','no') CHARACTER SET utf8 NOT NULL, + `action_details` text CHARACTER SET utf8 NOT NULL, + `action_link` text NOT NULL, + `action_obj_id` int(255) NOT NULL, + `action_done_id` int(255) NOT NULL, + PRIMARY KEY (`action_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=2687 ; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `admin_notes` +-- + +CREATE TABLE IF NOT EXISTS `{tbl_prefix}admin_notes` ( + `note_id` int(225) NOT NULL AUTO_INCREMENT, + `note` text CHARACTER SET ucs2 NOT NULL, + `date_added` datetime NOT NULL, + `userid` int(225) NOT NULL, + PRIMARY KEY (`note_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=84 ; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `ads_data` +-- + +CREATE TABLE IF NOT EXISTS `{tbl_prefix}ads_data` ( + `ad_id` int(50) NOT NULL AUTO_INCREMENT, + `ad_name` mediumtext NOT NULL, + `ad_code` mediumtext NOT NULL, + `ad_placement` varchar(50) NOT NULL DEFAULT '', + `ad_category` int(11) NOT NULL DEFAULT '0', + `ad_status` enum('0','1') NOT NULL DEFAULT '0', + `ad_impressions` bigint(255) NOT NULL DEFAULT '0', + `last_viewed` datetime NOT NULL, + `date_added` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + PRIMARY KEY (`ad_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=14 ; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `ads_placements` +-- + +CREATE TABLE IF NOT EXISTS `{tbl_prefix}ads_placements` ( + `placement_id` int(20) NOT NULL AUTO_INCREMENT, + `placement` varchar(26) NOT NULL, + `placement_name` varchar(50) NOT NULL, + `disable` enum('yes','no') NOT NULL DEFAULT 'no', + PRIMARY KEY (`placement_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=15 ; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `collections` +-- + +CREATE TABLE IF NOT EXISTS `{tbl_prefix}collections` ( + `collection_id` bigint(25) NOT NULL AUTO_INCREMENT, + `collection_name` varchar(225) NOT NULL, + `collection_description` text NOT NULL, + `collection_tags` text NOT NULL, + `category` varchar(100) NOT NULL, + `userid` int(10) NOT NULL, + `views` bigint(20) NOT NULL, + `date_added` datetime NOT NULL, + `featured` varchar(4) NOT NULL DEFAULT 'no', + `broadcast` varchar(10) NOT NULL, + `allow_comments` varchar(4) NOT NULL, + `allow_rating` enum('yes','no') NOT NULL DEFAULT 'yes', + `total_comments` bigint(20) NOT NULL, + `last_commented` datetime NOT NULL, + `total_objects` bigint(20) NOT NULL, + `rating` bigint(20) NOT NULL, + `rated_by` bigint(20) NOT NULL, + `voters` longtext NOT NULL, + `active` varchar(4) NOT NULL, + `public_upload` varchar(4) NOT NULL, + `type` varchar(10) NOT NULL, + PRIMARY KEY (`collection_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=9 ; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `collection_categories` +-- + +CREATE TABLE IF NOT EXISTS `{tbl_prefix}collection_categories` ( + `category_id` int(255) NOT NULL AUTO_INCREMENT, + `category_name` varchar(30) NOT NULL, + `category_order` int(5) NOT NULL, + `category_desc` text NOT NULL, + `date_added` mediumtext NOT NULL, + `category_thumb` mediumint(9) NOT NULL, + `isdefault` enum('yes','no') NOT NULL, + PRIMARY KEY (`category_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `collection_items` +-- + +CREATE TABLE IF NOT EXISTS `{tbl_prefix}collection_items` ( + `ci_id` bigint(20) NOT NULL AUTO_INCREMENT, + `collection_id` bigint(20) NOT NULL, + `object_id` bigint(20) NOT NULL, + `userid` bigint(20) NOT NULL, + `type` varchar(10) NOT NULL, + `date_added` datetime NOT NULL, + PRIMARY KEY (`ci_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=30 ; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `comments` +-- + +CREATE TABLE IF NOT EXISTS `{tbl_prefix}comments` ( + `comment_id` int(60) NOT NULL AUTO_INCREMENT, + `type` varchar(3) NOT NULL, + `comment` text NOT NULL, + `userid` int(60) NOT NULL, + `anonym_name` varchar(255) NOT NULL, + `anonym_email` varchar(255) NOT NULL, + `parent_id` int(60) NOT NULL, + `type_id` int(225) NOT NULL, + `type_owner_id` int(255) NOT NULL, + `vote` varchar(225) NOT NULL, + `voters` text NOT NULL, + `spam_votes` bigint(20) NOT NULL, + `spam_voters` text NOT NULL, + `date_added` datetime NOT NULL, + `comment_ip` text NOT NULL, + PRIMARY KEY (`comment_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=535 ; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `config` +-- + +CREATE TABLE IF NOT EXISTS `{tbl_prefix}config` ( + `configid` int(20) NOT NULL AUTO_INCREMENT, + `name` varchar(100) NOT NULL DEFAULT '', + `value` mediumtext NOT NULL, + PRIMARY KEY (`configid`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=225 ; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `contacts` +-- + +CREATE TABLE IF NOT EXISTS `{tbl_prefix}contacts` ( + `contact_id` int(225) NOT NULL AUTO_INCREMENT, + `userid` int(225) NOT NULL, + `contact_userid` int(225) NOT NULL, + `confirmed` enum('yes','no') NOT NULL DEFAULT 'no', + `contact_group_id` int(225) NOT NULL, + `request_type` enum('in','out') NOT NULL, + `date_added` datetime NOT NULL, + PRIMARY KEY (`contact_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=17 ; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `conversion_queue` +-- + +CREATE TABLE IF NOT EXISTS `{tbl_prefix}conversion_queue` ( + `cqueue_id` int(11) NOT NULL AUTO_INCREMENT, + `cqueue_name` varchar(32) CHARACTER SET utf8 NOT NULL, + `cqueue_ext` varchar(5) CHARACTER SET utf8 NOT NULL, + `cqueue_tmp_ext` varchar(3) CHARACTER SET utf8 NOT NULL, + `cqueue_conversion` enum('yes','no','p') CHARACTER SET utf8 NOT NULL DEFAULT 'no', + `date_added` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `time_started` varchar(32) NOT NULL, + `time_completed` varchar(32) NOT NULL, + PRIMARY KEY (`cqueue_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=262 ; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `countries` +-- + +CREATE TABLE IF NOT EXISTS `{tbl_prefix}countries` ( + `country_id` int(80) NOT NULL AUTO_INCREMENT, + `iso2` char(2) CHARACTER SET utf8 NOT NULL, + `name` varchar(80) CHARACTER SET utf8 NOT NULL, + `name_en` varchar(80) CHARACTER SET utf8 NOT NULL, + `iso3` char(3) CHARACTER SET utf8 DEFAULT NULL, + `numcode` smallint(6) DEFAULT NULL, + PRIMARY KEY (`country_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=240 ; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `editors_picks` +-- + +CREATE TABLE IF NOT EXISTS `{tbl_prefix}editors_picks` ( + `pick_id` int(225) NOT NULL AUTO_INCREMENT, + `videoid` int(225) NOT NULL, + `sort` bigint(5) NOT NULL DEFAULT '1', + `date_added` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`pick_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=20 ; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `email_templates` +-- + +CREATE TABLE IF NOT EXISTS `{tbl_prefix}email_templates` ( + `email_template_id` int(11) NOT NULL AUTO_INCREMENT, + `email_template_name` varchar(225) CHARACTER SET utf8 NOT NULL, + `email_template_code` varchar(225) CHARACTER SET utf8 NOT NULL, + `email_template_subject` mediumtext CHARACTER SET utf8 NOT NULL, + `email_template` text CHARACTER SET utf8 NOT NULL, + `email_template_allowed_tags` mediumtext CHARACTER SET utf8 NOT NULL, + PRIMARY KEY (`email_template_id`), + UNIQUE KEY `email_template_code` (`email_template_code`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=16 ; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `favorites` +-- + +CREATE TABLE IF NOT EXISTS `{tbl_prefix}favorites` ( + `favorite_id` int(225) NOT NULL AUTO_INCREMENT, + `type` varchar(4) CHARACTER SET utf8 NOT NULL, + `id` int(225) NOT NULL, + `userid` int(225) NOT NULL, + `date_added` datetime NOT NULL, + PRIMARY KEY (`favorite_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=36 ; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `flags` +-- + +CREATE TABLE IF NOT EXISTS `{tbl_prefix}flags` ( + `flag_id` int(225) NOT NULL AUTO_INCREMENT, + `type` varchar(4) CHARACTER SET utf8 NOT NULL, + `id` int(225) NOT NULL, + `userid` int(225) NOT NULL, + `flag_type` bigint(25) NOT NULL, + `date_added` datetime NOT NULL, + PRIMARY KEY (`flag_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=8 ; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `groups` +-- + +CREATE TABLE IF NOT EXISTS `{tbl_prefix}groups` ( + `group_id` int(225) NOT NULL AUTO_INCREMENT, + `group_name` mediumtext CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, + `userid` int(255) NOT NULL, + `group_description` mediumtext CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, + `group_tags` mediumtext CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, + `group_url` mediumtext CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, + `category` varchar(100) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, + `group_privacy` enum('0','1','2') CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL DEFAULT '0', + `video_type` enum('0','1','2') CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL DEFAULT '0', + `post_type` enum('0','1','2') CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL DEFAULT '0', + `active` enum('yes','no') CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL DEFAULT 'yes', + `date_added` datetime NOT NULL, + `featured` enum('yes','no') CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL DEFAULT 'no', + `total_views` bigint(225) NOT NULL, + `total_videos` int(225) NOT NULL, + `total_members` int(225) NOT NULL, + `total_topics` int(225) NOT NULL, + PRIMARY KEY (`group_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=5 ; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `group_categories` +-- + +CREATE TABLE IF NOT EXISTS `{tbl_prefix}group_categories` ( + `category_id` int(225) NOT NULL AUTO_INCREMENT, + `category_name` varchar(30) NOT NULL DEFAULT '', + `category_order` int(5) NOT NULL DEFAULT '1', + `category_desc` text NOT NULL, + `date_added` mediumtext NOT NULL, + `category_thumb` mediumtext NOT NULL, + `isdefault` enum('yes','no') NOT NULL DEFAULT 'no', + PRIMARY KEY (`category_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `group_invitations` +-- + +CREATE TABLE IF NOT EXISTS `{tbl_prefix}group_invitations` ( + `invitation_id` int(225) NOT NULL AUTO_INCREMENT, + `group_id` int(225) NOT NULL, + `userid` int(255) NOT NULL, + `invited` int(225) NOT NULL, + `date_added` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`invitation_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `group_members` +-- + +CREATE TABLE IF NOT EXISTS `{tbl_prefix}group_members` ( + `group_mid` int(225) NOT NULL AUTO_INCREMENT, + `group_id` int(225) NOT NULL, + `userid` int(11) NOT NULL, + `date_added` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `active` enum('yes','no') NOT NULL DEFAULT 'yes', + PRIMARY KEY (`group_mid`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=15 ; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `group_posts` +-- + +CREATE TABLE IF NOT EXISTS `{tbl_prefix}group_posts` ( + `post_id` int(11) NOT NULL AUTO_INCREMENT, + `userid` int(11) NOT NULL, + `topic_id` int(11) NOT NULL, + `post_content` text NOT NULL, + `date_added` datetime NOT NULL, + PRIMARY KEY (`post_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `group_topics` +-- + +CREATE TABLE IF NOT EXISTS `{tbl_prefix}group_topics` ( + `topic_id` int(225) NOT NULL AUTO_INCREMENT, + `topic_title` text NOT NULL, + `userid` int(225) NOT NULL, + `group_id` int(225) NOT NULL, + `topic_post` text NOT NULL, + `date_added` datetime NOT NULL, + `last_poster` int(225) NOT NULL, + `last_post_time` datetime NOT NULL, + `total_views` bigint(225) NOT NULL, + `total_replies` bigint(225) NOT NULL, + `topic_icon` varchar(225) NOT NULL, + `approved` enum('yes','no') NOT NULL DEFAULT 'yes', + PRIMARY KEY (`topic_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=14 ; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `group_videos` +-- + +CREATE TABLE IF NOT EXISTS `{tbl_prefix}group_videos` ( + `group_video_id` int(225) NOT NULL AUTO_INCREMENT, + `videoid` int(255) NOT NULL, + `group_id` int(225) NOT NULL, + `userid` int(255) NOT NULL, + `date_added` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `approved` enum('yes','no') CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, + PRIMARY KEY (`group_video_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=17 ; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `languages` +-- + +CREATE TABLE IF NOT EXISTS `{tbl_prefix}languages` ( + `language_id` int(9) NOT NULL AUTO_INCREMENT, + `language_code` varchar(8) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL DEFAULT '', + `language_name` varchar(20) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL DEFAULT '0', + `language_regex` varchar(64) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, + `language_active` enum('yes','no') NOT NULL DEFAULT 'yes', + `language_default` enum('yes','no') CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, + PRIMARY KEY (`language_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=7 ; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `messages` +-- + +CREATE TABLE IF NOT EXISTS `{tbl_prefix}messages` ( + `message_id` int(225) NOT NULL AUTO_INCREMENT, + `message_from` int(20) NOT NULL, + `message_to` varchar(200) NOT NULL, + `message_content` mediumtext NOT NULL, + `message_type` enum('pm','notification') NOT NULL DEFAULT 'pm', + `message_attachments` mediumtext NOT NULL, + `date_added` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `message_subject` mediumtext NOT NULL, + `message_status` enum('unread','read') NOT NULL DEFAULT 'unread', + `reply_to` int(225) NOT NULL DEFAULT '0', + `message_box` enum('in','out') NOT NULL DEFAULT 'in', + PRIMARY KEY (`message_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=53 ; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `modules` +-- + +CREATE TABLE IF NOT EXISTS `{tbl_prefix}modules` ( + `module_id` int(25) NOT NULL AUTO_INCREMENT, + `module_name` varchar(25) NOT NULL, + `module_file` varchar(60) NOT NULL, + `active` varchar(5) NOT NULL, + `module_include_file` text NOT NULL, + PRIMARY KEY (`module_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `pages` +-- + +CREATE TABLE IF NOT EXISTS `{tbl_prefix}pages` ( + `page_id` int(11) NOT NULL AUTO_INCREMENT, + `page_name` varchar(225) NOT NULL, + `page_title` varchar(225) NOT NULL, + `page_content` text NOT NULL, + `userid` int(225) NOT NULL, + `active` enum('yes','no') NOT NULL, + `delete_able` enum('yes','no') NOT NULL DEFAULT 'yes', + `date_added` datetime NOT NULL, + PRIMARY KEY (`page_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=19 ; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `photos` +-- + +CREATE TABLE IF NOT EXISTS `{tbl_prefix}photos` ( + `photo_id` bigint(255) NOT NULL AUTO_INCREMENT, + `photo_key` mediumtext NOT NULL, + `photo_title` mediumtext NOT NULL, + `photo_description` mediumtext NOT NULL, + `photo_tags` mediumtext NOT NULL, + `userid` int(255) NOT NULL, + `collection_id` int(255) NOT NULL, + `date_added` datetime NOT NULL, + `last_viewed` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATE CURRENT_TIMESTAMP, + `views` bigint(255) NOT NULL, + `allow_comments` enum('yes','no') NOT NULL DEFAULT 'yes', + `allow_embedding` enum('yes','no') NOT NULL DEFAULT 'yes', + `allow_tagging` enum('yes','no') NOT NULL DEFAULT 'yes', + `featured` enum('yes','no') NOT NULL DEFAULT 'no', + `reported` enum('yes','no') NOT NULL DEFAULT 'no', + `allow_rating` enum('yes','no') NOT NULL DEFAULT 'yes', + `broadcast` enum('public','private') NOT NULL DEFAULT 'public', + `active` enum('yes','no') NOT NULL DEFAULT 'yes', + `total_comments` int(255) NOT NULL, + `last_commented` datetime NOT NULL, + `total_favorites` int(255) NOT NULL, + `rating` int(15) NOT NULL, + `rated_by` int(25) NOT NULL, + `voters` mediumtext NOT NULL, + `filename` varchar(100) NOT NULL, + `ext` char(5) NOT NULL, + `downloaded` bigint(255) NOT NULL, + `server_url` text NOT NULL, + `owner_ip` varchar(20) NOT NULL, + PRIMARY KEY (`photo_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=20 ; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `phrases` +-- + +CREATE TABLE IF NOT EXISTS `{tbl_prefix}phrases` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `lang_iso` varchar(5) NOT NULL DEFAULT 'en', + `varname` varchar(250) NOT NULL DEFAULT '', + `text` text CHARACTER SET utf8 COLLATE utf8_unicode_ci, + PRIMARY KEY (`id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=9392 ; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `playlists` +-- + +CREATE TABLE IF NOT EXISTS `{tbl_prefix}playlists` ( + `playlist_id` int(11) NOT NULL AUTO_INCREMENT, + `playlist_name` varchar(225) CHARACTER SET utf8 NOT NULL, + `userid` int(11) NOT NULL, + `playlist_type` varchar(10) CHARACTER SET utf8 NOT NULL, + `date_added` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`playlist_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=9 ; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `playlist_items` +-- + +CREATE TABLE IF NOT EXISTS `{tbl_prefix}playlist_items` ( + `playlist_item_id` int(225) NOT NULL AUTO_INCREMENT, + `object_id` int(225) NOT NULL, + `playlist_id` int(225) NOT NULL, + `playlist_item_type` varchar(10) CHARACTER SET utf8 NOT NULL, + `userid` int(255) NOT NULL, + `date_added` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`playlist_item_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=21 ; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `plugins` +-- + +CREATE TABLE IF NOT EXISTS `{tbl_prefix}plugins` ( + `plugin_id` int(255) NOT NULL AUTO_INCREMENT, + `plugin_file` text NOT NULL, + `plugin_folder` text NOT NULL, + `plugin_version` float NOT NULL, + `plugin_license_type` varchar(10) NOT NULL DEFAULT 'GPL', + `plugin_license_key` varchar(5) NOT NULL, + `plugin_license_code` text NOT NULL, + `plugin_active` enum('yes','no') NOT NULL, + PRIMARY KEY (`plugin_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=78 ; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `plugin_config` +-- + +CREATE TABLE IF NOT EXISTS `{tbl_prefix}plugin_config` ( + `plugin_config_id` int(223) NOT NULL AUTO_INCREMENT, + `plugin_id_code` varchar(25) CHARACTER SET utf8 NOT NULL, + `plugin_config_name` text CHARACTER SET utf8 NOT NULL, + `plugin_config_value` text CHARACTER SET utf8 NOT NULL, + `player_type` enum('built-in','plugin') CHARACTER SET utf8 NOT NULL DEFAULT 'built-in', + `player_admin_file` text CHARACTER SET utf8 NOT NULL, + `player_include_file` text CHARACTER SET utf8 NOT NULL, + PRIMARY KEY (`plugin_config_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `sessions` +-- +CREATE TABLE `{tbl_prefix}sessions` ( + `session_id` int(11) NOT NULL AUTO_INCREMENT, + `session` varchar(100) NOT NULL, + `session_user` int(11) NOT NULL, + `session_string` varchar(60) NOT NULL, + `session_value` varchar(32) NOT NULL, + `ip` varchar(20) NOT NULL, + `session_date` datetime NOT NULL, + `current_page` text NOT NULL, + `referer` text NOT NULL, + `agent` text NOT NULL, + `last_active` datetime NOT NULL, + PRIMARY KEY (`session_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `stats` +-- + +CREATE TABLE IF NOT EXISTS `{tbl_prefix}stats` ( + `stat_id` int(255) NOT NULL AUTO_INCREMENT, + `date_added` date NOT NULL, + `video_stats` text NOT NULL, + `user_stats` text NOT NULL, + `group_stats` text NOT NULL, + PRIMARY KEY (`stat_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `subscriptions` +-- + +CREATE TABLE IF NOT EXISTS `{tbl_prefix}subscriptions` ( + `subscription_id` int(225) NOT NULL AUTO_INCREMENT, + `userid` int(11) NOT NULL, + `subscribed_to` mediumtext NOT NULL, + `date_added` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`subscription_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=29 ; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `template` +-- + +CREATE TABLE IF NOT EXISTS `{tbl_prefix}template` ( + `template_id` int(20) NOT NULL AUTO_INCREMENT, + `template_name` varchar(25) NOT NULL, + `template_dir` varchar(30) NOT NULL, + PRIMARY KEY (`template_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `users` +-- + +CREATE TABLE IF NOT EXISTS `{tbl_prefix}users` ( + `userid` bigint(20) NOT NULL AUTO_INCREMENT, + `category` int(20) NOT NULL, + `featured_video` mediumtext NOT NULL, + `username` text NOT NULL, + `user_session_key` varchar(32) NOT NULL, + `user_session_code` int(5) NOT NULL, + `password` varchar(40) NOT NULL DEFAULT '', + `email` varchar(80) NOT NULL DEFAULT '', + `usr_status` enum('Ok','ToActivate') NOT NULL DEFAULT 'ToActivate', + `msg_notify` enum('yes','no') NOT NULL DEFAULT 'yes', + `avatar` varchar(225) NOT NULL DEFAULT '', + `avatar_url` text NOT NULL, + `sex` enum('male','female') NOT NULL DEFAULT 'male', + `dob` date NOT NULL DEFAULT '0000-00-00', + `country` varchar(20) NOT NULL DEFAULT 'PK', + `level` int(6) NOT NULL DEFAULT '2', + `avcode` mediumtext NOT NULL, + `doj` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `last_logged` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + `num_visits` bigint(20) NOT NULL DEFAULT '0', + `session` varchar(32) NOT NULL DEFAULT '', + `ip` varchar(15) NOT NULL DEFAULT '', + `signup_ip` varchar(15) NOT NULL DEFAULT '', + `time_zone` tinyint(4) NOT NULL DEFAULT '0', + `featured` enum('No','Yes') NOT NULL DEFAULT 'No', + `featured_date` datetime NOT NULL, + `profile_hits` bigint(20) DEFAULT '0', + `total_watched` bigint(20) NOT NULL DEFAULT '0', + `total_videos` bigint(20) NOT NULL, + `total_comments` bigint(20) NOT NULL, + `total_photos` bigint(255) NOT NULL, + `total_collections` bigint(255) NOT NULL, + `comments_count` bigint(20) NOT NULL, + `last_commented` datetime NOT NULL, + `ban_status` enum('yes','no') NOT NULL DEFAULT 'no', + `upload` varchar(20) NOT NULL DEFAULT '1', + `subscribers` bigint(225) NOT NULL DEFAULT '0', + `total_subscriptions` bigint(255) NOT NULL, + `background` mediumtext NOT NULL, + `background_color` varchar(25) NOT NULL, + `background_url` text NOT NULL, + `background_repeat` enum('no-repeat','repeat','repeat-x','repeat-y') NOT NULL DEFAULT 'repeat', + `background_attachement` enum('yes','no') NOT NULL DEFAULT 'no', + `total_groups` bigint(20) NOT NULL, + `last_active` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', + `banned_users` text NOT NULL, + `welcome_email_sent` enum('yes','no') NOT NULL DEFAULT 'no', + `total_downloads` bigint(255) NOT NULL, + PRIMARY KEY (`userid`), + KEY `ind_status_doj` (`doj`), + KEY `ind_status_id` (`userid`), + KEY `ind_hits_doj` (`profile_hits`,`doj`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=2; +ALTER TABLE `{tbl_prefix}users` ADD `album_privacy` ENUM( 'public', 'private', 'friends' ) NOT NULL DEFAULT 'private' ; +-- -------------------------------------------------------- + +-- +-- Table structure for table `user_categories` +-- + +CREATE TABLE IF NOT EXISTS `{tbl_prefix}user_categories` ( + `category_id` int(225) NOT NULL AUTO_INCREMENT, + `category_name` varchar(30) NOT NULL DEFAULT '', + `category_order` int(5) NOT NULL DEFAULT '1', + `category_desc` text NOT NULL, + `date_added` mediumtext NOT NULL, + `category_thumb` mediumtext NOT NULL, + `isdefault` enum('yes','no') NOT NULL DEFAULT 'no', + PRIMARY KEY (`category_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `user_levels` +-- + +CREATE TABLE IF NOT EXISTS `{tbl_prefix}user_levels` ( + `user_level_id` int(20) NOT NULL AUTO_INCREMENT, + `user_level_active` enum('yes','no') CHARACTER SET utf8 NOT NULL DEFAULT 'yes', + `user_level_name` varchar(100) CHARACTER SET utf8 NOT NULL, + `user_level_is_default` enum('yes','no') NOT NULL DEFAULT 'no', + PRIMARY KEY (`user_level_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=17 ; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `user_levels_permissions` +-- + +CREATE TABLE IF NOT EXISTS `{tbl_prefix}user_levels_permissions` ( + `user_level_permission_id` int(22) NOT NULL AUTO_INCREMENT, + `user_level_id` int(22) NOT NULL, + `admin_access` enum('yes','no') NOT NULL DEFAULT 'no', + `allow_video_upload` enum('yes','no') NOT NULL DEFAULT 'yes', + `view_video` enum('yes','no') NOT NULL DEFAULT 'yes', + `view_channel` enum('yes','no') NOT NULL DEFAULT 'yes', + `view_group` enum('yes','no') NOT NULL DEFAULT 'yes', + `view_videos` enum('yes','no') NOT NULL DEFAULT 'yes', + `avatar_upload` enum('yes','no') NOT NULL DEFAULT 'yes', + `video_moderation` enum('yes','no') NOT NULL DEFAULT 'no', + `member_moderation` enum('yes','no') NOT NULL DEFAULT 'no', + `ad_manager_access` enum('yes','no') NOT NULL DEFAULT 'no', + `manage_template_access` enum('yes','no') NOT NULL DEFAULT 'no', + `group_moderation` enum('yes','no') NOT NULL DEFAULT 'no', + `web_config_access` enum('yes','no') NOT NULL DEFAULT 'no', + `view_channels` enum('yes','no') NOT NULL DEFAULT 'yes', + `view_groups` enum('yes','no') NOT NULL DEFAULT 'yes', + `playlist_access` enum('yes','no') NOT NULL DEFAULT 'yes', + `allow_channel_bg` enum('yes','no') NOT NULL DEFAULT 'yes', + `private_msg_access` enum('yes','no') NOT NULL DEFAULT 'yes', + `edit_video` enum('yes','no') NOT NULL DEFAULT 'yes', + `download_video` enum('yes','no') NOT NULL DEFAULT 'yes', + `admin_del_access` enum('yes','no') NOT NULL DEFAULT 'no', + PRIMARY KEY (`user_level_permission_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=15 ; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `user_permissions` +-- + +CREATE TABLE IF NOT EXISTS `{tbl_prefix}user_permissions` ( + `permission_id` int(225) NOT NULL AUTO_INCREMENT, + `permission_type` int(225) NOT NULL, + `permission_name` varchar(225) CHARACTER SET utf8 NOT NULL, + `permission_code` varchar(225) CHARACTER SET utf8 NOT NULL, + `permission_desc` mediumtext CHARACTER SET utf8 NOT NULL, + `permission_default` enum('yes','no') CHARACTER SET utf8 NOT NULL DEFAULT 'yes', + PRIMARY KEY (`permission_id`), + UNIQUE KEY `permission_code` (`permission_code`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=34 ; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `user_permission_types` +-- + +CREATE TABLE IF NOT EXISTS `{tbl_prefix}user_permission_types` ( + `user_permission_type_id` int(225) NOT NULL AUTO_INCREMENT, + `user_permission_type_name` varchar(225) CHARACTER SET utf8 NOT NULL, + `user_permission_type_desc` mediumtext CHARACTER SET utf8 NOT NULL, + PRIMARY KEY (`user_permission_type_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=5 ; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `user_profile` +-- + +CREATE TABLE IF NOT EXISTS `{tbl_prefix}user_profile` ( + `user_profile_id` int(11) NOT NULL AUTO_INCREMENT, + `show_my_collections` enum('yes','no') NOT NULL DEFAULT 'yes', + `userid` bigint(20) NOT NULL, + `profile_title` mediumtext NOT NULL, + `profile_desc` mediumtext NOT NULL, + `featured_video` mediumtext NOT NULL, + `first_name` varchar(100) NOT NULL DEFAULT '', + `last_name` varchar(100) NOT NULL DEFAULT '', + `avatar` varchar(225) NOT NULL DEFAULT 'no_avatar.jpg', + `show_dob` enum('no','yes') DEFAULT 'no', + `postal_code` varchar(20) NOT NULL DEFAULT '', + `time_zone` tinyint(4) NOT NULL DEFAULT '0', + `profile_tags` mediumtext, + `web_url` varchar(200) NOT NULL DEFAULT '', + `hometown` varchar(100) NOT NULL DEFAULT '', + `city` varchar(100) NOT NULL DEFAULT '', + `online_status` enum('online','offline','custom') NOT NULL DEFAULT 'online', + `show_profile` enum('all','members','friends') NOT NULL DEFAULT 'all', + `allow_comments` enum('Yes','No') NOT NULL DEFAULT 'Yes', + `allow_ratings` enum('Yes','No') NOT NULL DEFAULT 'Yes', + `allow_subscription` enum('yes','no') NOT NULL DEFAULT 'yes', + `content_filter` enum('Nothing','On','Off') NOT NULL DEFAULT 'Nothing', + `icon_id` bigint(20) NOT NULL DEFAULT '0', + `browse_criteria` mediumtext, + `about_me` mediumtext NOT NULL, + `education` varchar(3) DEFAULT NULL, + `schools` mediumtext NOT NULL, + `occupation` mediumtext NOT NULL, + `companies` mediumtext NOT NULL, + `relation_status` varchar(15) DEFAULT NULL, + `hobbies` mediumtext NOT NULL, + `fav_movies` mediumtext NOT NULL, + `fav_music` mediumtext NOT NULL, + `fav_books` mediumtext NOT NULL, + `background` mediumtext NOT NULL, + `profile_video` int(255) NOT NULL, + `profile_item` varchar(25) NOT NULL, + `rating` tinyint(2) NOT NULL, + `voters` text NOT NULL, + `rated_by` int(150) NOT NULL, + `show_my_videos` enum('yes','no') NOT NULL DEFAULT 'yes', + `show_my_photos` enum('yes','no') NOT NULL DEFAULT 'yes', + `show_my_subscriptions` enum('yes','no') NOT NULL DEFAULT 'yes', + `show_my_subscribers` enum('yes','no') NOT NULL DEFAULT 'yes', + `show_my_friends` enum('yes','no') NOT NULL DEFAULT 'yes', + PRIMARY KEY (`user_profile_id`), + KEY `ind_status_id` (`userid`), + FULLTEXT KEY `profile_tags` (`profile_tags`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `validation_re` +-- + +CREATE TABLE IF NOT EXISTS `{tbl_prefix}validation_re` ( + `re_id` int(25) NOT NULL AUTO_INCREMENT, + `re_name` varchar(60) NOT NULL, + `re_code` varchar(60) NOT NULL, + `re_syntax` text NOT NULL, + PRIMARY KEY (`re_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `video` +-- + +CREATE TABLE IF NOT EXISTS `{tbl_prefix}video` ( + `videoid` bigint(20) NOT NULL AUTO_INCREMENT, + `videokey` mediumtext NOT NULL, + `username` text NOT NULL, + `userid` int(11) NOT NULL, + `title` text, + `flv` mediumtext NOT NULL, + `file_name` varchar(32) NOT NULL, + `description` text, + `tags` mediumtext NOT NULL, + `category` varchar(100) NOT NULL DEFAULT '0', + `broadcast` varchar(10) NOT NULL DEFAULT '', + `location` mediumtext, + `datecreated` date DEFAULT NULL, + `country` mediumtext, + `allow_embedding` char(3) NOT NULL DEFAULT '', + `rating` int(15) NOT NULL DEFAULT '0', + `rated_by` varchar(20) NOT NULL DEFAULT '0', + `voter_ids` mediumtext NOT NULL, + `allow_comments` char(3) NOT NULL DEFAULT '', + `comment_voting` char(3) NOT NULL DEFAULT '', + `comments_count` int(15) NOT NULL DEFAULT '0', + `last_commented` datetime NOT NULL, + `featured` char(3) NOT NULL DEFAULT 'no', + `featured_date` datetime NOT NULL, + `featured_description` mediumtext NOT NULL, + `allow_rating` char(3) NOT NULL DEFAULT '', + `active` char(3) NOT NULL DEFAULT '0', + `favourite_count` varchar(15) NOT NULL DEFAULT '0', + `playlist_count` varchar(15) NOT NULL DEFAULT '0', + `views` bigint(22) NOT NULL DEFAULT '0', + `last_viewed` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `date_added` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', + `flagged` varchar(3) NOT NULL DEFAULT 'no', + `duration` varchar(20) NOT NULL DEFAULT '00', + `status` enum('Successful','Processing','Failed') NOT NULL DEFAULT 'Processing', + `failed_reason` enum('none','max_duration','max_file','invalid_format','invalid_upload') NOT NULL DEFAULT 'none', + `flv_file_url` text, + `default_thumb` int(3) NOT NULL DEFAULT '1', + `aspect_ratio` varchar(10) NOT NULL, + `embed_code` text NOT NULL, + `refer_url` text NOT NULL, + `downloads` bigint(255) NOT NULL, + `uploader_ip` varchar(20) NOT NULL, + `mass_embed_status` enum('no','pending','approved') NOT NULL DEFAULT 'no', + `is_hd` enum('yes','no') NOT NULL DEFAULT 'no', + `ebay_epn_keywords` varchar(255) NOT NULL, + `ebay_pre_desc` text NOT NULL, + `unique_embed_code` varchar(50) NOT NULL, + `mature_content` enum('yes','no') NOT NULL DEFAULT 'no', + `remote_play_url` text NOT NULL, + `server_ip` varchar(20) NOT NULL, + `file_server_path` text NOT NULL, + `files_thumbs_path` text NOT NULL, + `file_thumbs_count` varchar(30) NOT NULL, + `has_hq` enum('yes','no') NOT NULL DEFAULT 'no', + `has_mobile` enum('yes','no') NOT NULL DEFAULT 'no', + `filegrp_size` varchar(30) NOT NULL, + `process_status` bigint(30) NOT NULL DEFAULT '0', + `has_hd` enum('yes','no') NOT NULL DEFAULT 'no', + PRIMARY KEY (`videoid`), + FULLTEXT KEY `description` (`description`,`title`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=960 ; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `video_categories` +-- + +CREATE TABLE IF NOT EXISTS `{tbl_prefix}video_categories` ( + `category_id` int(225) NOT NULL AUTO_INCREMENT, + `parent_id` int(255) NOT NULL DEFAULT '0', + `category_name` varchar(30) NOT NULL DEFAULT '', + `category_order` int(5) NOT NULL DEFAULT '1', + `category_desc` text NOT NULL, + `date_added` mediumtext NOT NULL, + `category_thumb` mediumtext NOT NULL, + `isdefault` enum('yes','no') NOT NULL DEFAULT 'no', + PRIMARY KEY (`category_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=12 ; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `video_favourites` +-- + +CREATE TABLE IF NOT EXISTS `{tbl_prefix}video_favourites` ( + `fav_id` int(11) NOT NULL AUTO_INCREMENT, + `videoid` int(11) NOT NULL, + `userid` int(11) NOT NULL, + `date_added` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`fav_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `video_files` +-- + +CREATE TABLE IF NOT EXISTS `{tbl_prefix}video_files` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `status` int(2) NOT NULL, + `file_conversion_log` text CHARACTER SET utf8 NOT NULL, + `encoder` char(16) CHARACTER SET utf8 NOT NULL, + `command_used` text CHARACTER SET utf8 NOT NULL, + `src_path` text CHARACTER SET utf8 NOT NULL, + `src_name` char(64) CHARACTER SET utf8 NOT NULL, + `src_ext` char(8) CHARACTER SET utf8 NOT NULL, + `src_format` char(32) CHARACTER SET utf8 NOT NULL, + `src_duration` char(10) CHARACTER SET utf8 NOT NULL, + `src_size` char(10) CHARACTER SET utf8 NOT NULL, + `src_bitrate` char(6) CHARACTER SET utf8 NOT NULL, + `src_video_width` char(5) CHARACTER SET utf8 NOT NULL, + `src_video_height` char(5) CHARACTER SET utf8 NOT NULL, + `src_video_wh_ratio` char(10) CHARACTER SET utf8 NOT NULL, + `src_video_codec` char(16) CHARACTER SET utf8 NOT NULL, + `src_video_rate` char(10) CHARACTER SET utf8 NOT NULL, + `src_video_bitrate` char(10) CHARACTER SET utf8 NOT NULL, + `src_video_color` char(16) CHARACTER SET utf8 NOT NULL, + `src_audio_codec` char(16) CHARACTER SET utf8 NOT NULL, + `src_audio_bitrate` char(10) CHARACTER SET utf8 NOT NULL, + `src_audio_rate` char(10) CHARACTER SET utf8 NOT NULL, + `src_audio_channels` char(16) CHARACTER SET utf8 NOT NULL, + `output_path` text CHARACTER SET utf8 NOT NULL, + `output_format` char(32) CHARACTER SET utf8 NOT NULL, + `output_duration` char(10) CHARACTER SET utf8 NOT NULL, + `output_size` char(10) CHARACTER SET utf8 NOT NULL, + `output_bitrate` char(6) CHARACTER SET utf8 NOT NULL, + `output_video_width` char(5) CHARACTER SET utf8 NOT NULL, + `output_video_height` char(5) CHARACTER SET utf8 NOT NULL, + `output_video_wh_ratio` char(10) CHARACTER SET utf8 NOT NULL, + `output_video_codec` char(16) CHARACTER SET utf8 NOT NULL, + `output_video_rate` char(10) CHARACTER SET utf8 NOT NULL, + `output_video_bitrate` char(10) CHARACTER SET utf8 NOT NULL, + `output_video_color` char(16) CHARACTER SET utf8 NOT NULL, + `output_audio_codec` char(16) CHARACTER SET utf8 NOT NULL, + `output_audio_bitrate` char(10) CHARACTER SET utf8 NOT NULL, + `output_audio_rate` char(10) CHARACTER SET utf8 NOT NULL, + `output_audio_channels` char(16) CHARACTER SET utf8 NOT NULL, + `hd` enum('yes','no') CHARACTER SET utf8 NOT NULL DEFAULT 'no', + `hq` enum('yes','no') CHARACTER SET utf8 NOT NULL DEFAULT 'no', + PRIMARY KEY (`id`), + FULLTEXT KEY `src_bitrate` (`src_bitrate`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; + + +-- Alterations + +ALTER TABLE `{tbl_prefix}video` ADD `video_password` VARCHAR( 255 ) NOT NULL AFTER `videokey` ; +ALTER TABLE `{tbl_prefix}video` ADD `video_users` TEXT NOT NULL AFTER `video_password`; +ALTER TABLE `{tbl_prefix}video` ADD `category_parents` TEXT NOT NULL AFTER `category` ; + +ALTER TABLE `{tbl_prefix}_video` ADD `subscription_email` ENUM( "pending", "sent" ) NOT NULL DEFAULT 'pending' AFTER `last_commented` ; +ALTER TABLE `{tbl_prefix}_groups` ADD `group_admins` TEXT NOT NULL AFTER `userid` ; + +-- Alterations for 2.4.5 + +ALTER TABLE `{tbl_prefix}pages` ADD `page_order` BIGINT( 100 ) NOT NULL AFTER `page_id` , +ADD `display` ENUM( 'yes', 'no' ) NOT NULL DEFAULT 'yes' AFTER `page_order` ; +ALTER TABLE `{tbl_prefix}users` ADD `voted` TEXT NOT NULL AFTER `last_commented`; + +-- Alterations for 2.5.5 +ALTER TABLE `{tbl_prefix}groups` ADD `group_admins` TEXT NOT NULL AFTER `userid`; + +-- Alterations for 2.6 +ALTER TABLE `{tbl_prefix}video` CHANGE `category` `category` VARCHAR( 200 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '0'; +ALTER TABLE `{tbl_prefix}collections` CHANGE `category` `category` VARCHAR( 200 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ; + +CREATE TABLE IF NOT EXISTS `{tbl_prefix}counters` ( + `counter_id` int(100) NOT NULL AUTO_INCREMENT, + `section` varchar(200) NOT NULL, + `query` text NOT NULL, + `query_md5` varchar(200) NOT NULL, + `counts` bigint(200) NOT NULL, + `date_added` varchar(200) NOT NULL, + PRIMARY KEY (`counter_id`), + UNIQUE KEY `query_md5` (`query_md5`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ; + + +ALTER TABLE `{tbl_prefix}user_levels_permissions` ADD `photos_moderation` ENUM( 'yes', 'no' ) NOT NULL DEFAULT 'no', +ADD `collection_moderation` ENUM( 'yes', 'no' ) NOT NULL DEFAULT 'no' AFTER `photos_moderation` , +ADD `plugins_moderation` ENUM( 'yes', 'no' ) NOT NULL DEFAULT 'no' AFTER `collection_moderation` , +ADD `tool_box` ENUM( 'yes', 'no' ) NOT NULL DEFAULT 'no' AFTER `plugins_moderation` , +ADD `plugins_perms` TEXT NOT NULL AFTER `tool_box` ; + +CREATE TABLE IF NOT EXISTS `{tbl_prefix}mass_emails` ( + `id` int(255) NOT NULL AUTO_INCREMENT, + `email_subj` varchar(255) NOT NULL, + `email_from` varchar(255) NOT NULL, + `email_msg` text NOT NULL, + `configs` text NOT NULL, + `sent` bigint(255) NOT NULL, + `total` bigint(20) NOT NULL, + `users` text NOT NULL, + `start_index` bigint(255) NOT NULL, + `method` enum('browser','background') NOT NULL, + `status` enum('completed','pending','sending') NOT NULL, + `date_added` datetime NOT NULL, + `last_update` datetime NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ; + +-- naveed +-- added photo_details +ALTER TABLE `photos` ADD `{tbl_prefix}photo_details` TEXT NOT NULL AFTER `photo_id`; + +-- 2.7 +-- Added Collection contributors + +CREATE TABLE IF NOT EXISTS `{tbl_prefix}collection_contributors` ( + `contributor_id` int(200) NOT NULL AUTO_INCREMENT, + `collection_id` int(255) NOT NULL, + `userid` int(255) NOT NULL, + `can_edit` enum('yes','no') NOT NULL DEFAULT 'no', + `date_added` datetime NOT NULL, + PRIMARY KEY (`contributor_id`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ; \ No newline at end of file diff --git a/upload/cb_install/sql/upgrade_2.0.5.sql b/upload/cb_install/sql/upgrade_2.0.5.sql new file mode 100644 index 00000000..485b46a5 --- /dev/null +++ b/upload/cb_install/sql/upgrade_2.0.5.sql @@ -0,0 +1,30 @@ +INSERT INTO `{tbl_prefix}config` ( +`name` , +`value` +) +VALUES +('default_country_iso2', 'PK'), +('channel_comments', '1'), +('max_profile_pic_size', '25'), +('max_profile_pic_height', ''), +('max_profile_pic_width', '140'), +('gravatars', 'yes'), +('picture_url', 'yes'), +('picture_upload', 'yes'), +('background_url', 'yes'), +('background_upload', 'yes'), +('max_bg_size', '25'), +('max_bg_width', ''), +('max_bg_height', '600'), +('background_color', 'yes'), +('send_comment_notification', 'no'), +('approve_video_notification', 'yes'), +('keep_mp4_as_is', 'yes'), +('hq_output', 'yes'), +('grp_categories', '3'), +('grps_items_search_page', '24'), +('grp_thumb_height', '140'), +('grp_thumb_width', '140'), +('grp_max_title', '20'), +('grp_max_desc', '500'); +ALTER TABLE `{tbl_prefix}languages` ADD `language_active` ENUM( "yes", "no" ) NOT NULL DEFAULT 'yes' AFTER `language_regex` ; \ No newline at end of file diff --git a/upload/cb_install/sql/upgrade_2.0.6.sql b/upload/cb_install/sql/upgrade_2.0.6.sql new file mode 100644 index 00000000..94710f9f --- /dev/null +++ b/upload/cb_install/sql/upgrade_2.0.6.sql @@ -0,0 +1,9 @@ +INSERT INTO `{tbl_prefix}config` (`configid` ,`name` ,`value`) VALUES +(NULL , 'quick_conv', 'yes'), +(NULL, 'server_friendly_conversion', 'yes'), +(NULL, 'max_conversion', '2'), +(NULL, 'max_time_wait', '7200'), +(NULL , 'allow_unicode_usernames', 'yes'), +(NULL, 'min_username', '3'), +(NULL, 'max_username', '15'); +UPDATE `{tbl_prefix}config` SET `name` = 'allow_registration' WHERE `name` = 'allow_registeration' LIMIT 1 ; \ No newline at end of file diff --git a/upload/cb_install/sql/upgrade_2.0.7.sql b/upload/cb_install/sql/upgrade_2.0.7.sql new file mode 100644 index 00000000..f9384dbf --- /dev/null +++ b/upload/cb_install/sql/upgrade_2.0.7.sql @@ -0,0 +1,8 @@ +INSERT INTO `{tbl_prefix}config` (`configid`, `name`, `value`) VALUES (NULL, 'allow_username_spaces', 'yes'); +INSERT INTO `{tbl_prefix}config` (`configid`, `name`, `value`) VALUES (NULL, 'use_playlist', 'yes'); +INSERT INTO `{tbl_prefix}config` (`configid`, `name`, `value`) VALUES (NULL, 'comments_captcha', 'all'); +INSERT INTO `{tbl_prefix}config` (`configid`, `name`, `value`) VALUES (NULL, 'player_logo_file', 'logo.png'); +INSERT INTO `{tbl_prefix}config` (`configid`, `name`, `value`) VALUES (NULL, 'logo_placement', 'br'); +INSERT INTO `{tbl_prefix}config` (`configid`, `name`, `value`) VALUES (NULL, 'buffer_time', '3'); +INSERT INTO `{tbl_prefix}config` (`configid`, `name`, `value`) VALUES (NULL, 'youtube_enabled', 'yes'); +ALTER TABLE `{tbl_prefix}contacts` ADD `request_type` ENUM( 'in', 'out' ) NOT NULL AFTER `contact_group_id` ; \ No newline at end of file diff --git a/upload/cb_install/sql/upgrade_2.0.8.sql b/upload/cb_install/sql/upgrade_2.0.8.sql new file mode 100644 index 00000000..3854541c --- /dev/null +++ b/upload/cb_install/sql/upgrade_2.0.8.sql @@ -0,0 +1,11 @@ +-- NEW CONFIGS +INSERT INTO {tbl_prefix}config (name,value) VALUES +('use_ffmpeg_vf','no'), +('use_crons','no'), +('mail_type','mail'), +('smtp_host','mail.myserver.com'), +('smtp_user','user@myserver.com'), +('smtp_pass','password'), +('smtp_auth','yes'), +('smtp_port','26'); +UPDATE `{table_prefix}config` SET date_format='Y-m-d' WHERE date_format='m-d-Y'; diff --git a/upload/cb_install/sql/upgrade_2.0.9.sql b/upload/cb_install/sql/upgrade_2.0.9.sql new file mode 100644 index 00000000..74e6bef5 --- /dev/null +++ b/upload/cb_install/sql/upgrade_2.0.9.sql @@ -0,0 +1,8 @@ +UPDATE `{table_prefix}phrases` SET text='register_as_our_website_member' WHERE text='register_as_our_website_member' ; +UPDATE `{table_prefix}phrases` SET text='Register as a member, it`s free and easy just ' WHERE text='Register as a member, it's free and easy just ' ; +UPDATE `{table_prefix}phrases` SET text='email_wont_display' WHERE text='email_wont_display' ; +UPDATE `{table_prefix}phrases` SET text='Email (Wont` display)' WHERE text='Email (Wont' display)' ; + +INSERT INTO {tbl_prefix}config (name,value) VALUES ('use_subs','0'); + +ALTER TABLE {tbl_prefix}video_categories ADD `parent_id` INT( 255 ) NOT NULL DEFAULT '0' AFTER `category_id`; \ No newline at end of file diff --git a/upload/cb_install/sql/upgrade_2.0.91.sql b/upload/cb_install/sql/upgrade_2.0.91.sql new file mode 100644 index 00000000..e69de29b diff --git a/upload/cb_install/sql/upgrade_2.1.sql b/upload/cb_install/sql/upgrade_2.1.sql new file mode 100644 index 00000000..68cf4d5f --- /dev/null +++ b/upload/cb_install/sql/upgrade_2.1.sql @@ -0,0 +1,163 @@ +CREATE TABLE IF NOT EXISTS `{tbl_prefix}collections` ( + `collection_id` bigint(25) NOT NULL AUTO_INCREMENT, + `collection_name` varchar(225) NOT NULL, + `collection_description` text NOT NULL, + `collection_tags` text NOT NULL, + `category` varchar(20) NOT NULL, + `userid` int(10) NOT NULL, + `views` bigint(20) NOT NULL, + `date_added` datetime NOT NULL, + `featured` varchar(4) NOT NULL DEFAULT 'no', + `broadcast` varchar(10) NOT NULL, + `allow_comments` varchar(4) NOT NULL, + `allow_rating` enum('yes','no') NOT NULL DEFAULT 'yes', + `total_comments` bigint(20) NOT NULL, + `last_commented` datetime NOT NULL, + `total_objects` bigint(20) NOT NULL, + `rating` bigint(20) NOT NULL, + `rated_by` bigint(20) NOT NULL, + `voters` longtext NOT NULL, + `active` varchar(4) NOT NULL, + `public_upload` varchar(4) NOT NULL, + `type` varchar(10) NOT NULL, + PRIMARY KEY (`collection_id`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=9 ; + +CREATE TABLE IF NOT EXISTS `{tbl_prefix}collection_categories` ( + `category_id` int(255) NOT NULL AUTO_INCREMENT, + `category_name` varchar(30) NOT NULL, + `category_order` int(5) NOT NULL, + `category_desc` text NOT NULL, + `date_added` mediumtext NOT NULL, + `category_thumb` mediumint(9) NOT NULL, + `isdefault` enum('yes','no') NOT NULL, + PRIMARY KEY (`category_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ; + + +CREATE TABLE IF NOT EXISTS `{tbl_prefix}collection_items` ( + `ci_id` bigint(20) NOT NULL AUTO_INCREMENT, + `collection_id` bigint(20) NOT NULL, + `object_id` bigint(20) NOT NULL, + `userid` bigint(20) NOT NULL, + `type` varchar(10) NOT NULL, + `date_added` datetime NOT NULL, + PRIMARY KEY (`ci_id`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=30 ; + +CREATE TABLE IF NOT EXISTS `{tbl_prefix}photos` ( + `photo_id` bigint(255) NOT NULL AUTO_INCREMENT, + `photo_key` mediumtext NOT NULL, + `photo_title` mediumtext NOT NULL, + `photo_description` mediumtext NOT NULL, + `photo_tags` mediumtext NOT NULL, + `userid` int(255) NOT NULL, + `collection_id` int(255) NOT NULL, + `date_added` datetime NOT NULL, + `last_viewed` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATE CURRENT_TIMESTAMP, + `views` bigint(255) NOT NULL, + `allow_comments` enum('yes','no') NOT NULL DEFAULT 'yes', + `allow_embedding` enum('yes','no') NOT NULL DEFAULT 'yes', + `allow_tagging` enum('yes','no') NOT NULL DEFAULT 'yes', + `featured` enum('yes','no') NOT NULL DEFAULT 'no', + `reported` enum('yes','no') NOT NULL DEFAULT 'no', + `allow_rating` enum('yes','no') NOT NULL DEFAULT 'yes', + `broadcast` enum('public','private') NOT NULL DEFAULT 'public', + `active` enum('yes','no') NOT NULL DEFAULT 'yes', + `total_comments` int(255) NOT NULL, + `last_commented` datetime NOT NULL, + `total_favorites` int(255) NOT NULL, + `rating` int(15) NOT NULL, + `rated_by` int(25) NOT NULL, + `voters` mediumtext NOT NULL, + `filename` varchar(100) NOT NULL, + `ext` char(5) NOT NULL, + `downloaded` bigint(255) NOT NULL, + `server_url` text NOT NULL, + `owner_ip` varchar(20) NOT NULL, + PRIMARY KEY (`photo_id`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=20 ; + +INSERT INTO `{tbl_prefix}config` (`configid`, `name`, `value`) VALUES (NULL, 'photo_ratio', '16:10'), (NULL, 'photo_thumb_width', '120'), (NULL, 'photo_thumb_height', '75'), (NULL, 'photo_med_width', '185'), (NULL, 'photo_med_height', '116'), (NULL, 'photo_lar_width', '600'), (NULL, 'photo_crop', '1'), (NULL, 'photo_multi_upload', '5'), (NULL, 'photo_download', '1'), (NULL, 'photo_comments', '1'), (NULL, 'photo_rating', '1'); + +INSERT into {tbl_prefix}config (name,value) VALUES +('load_upload_form','yes'), +('load_remote_upload_form','yes'), +('load_embed_form','yes'), +('load_link_video_form','yes'), +('groupsSection','yes'), +('videosSection','yes'), +('photosSection','yes'), +('homeSection','yes'), +('uploadSection','yes'), +('signupSection','yes'), +('collectionsSection','yes'), +('channelsSection','yes'); + +INSERT into {tbl_prefix}config (name,value) VALUES +('flvtool++',''), +('normal_resolution', '480'), +('high_resolution', '720'), +('max_video_duration','320'); + +ALTER TABLE `{tbl_prefix}video` ADD `aspect_ratio` VARCHAR( 10 ) NOT NULL AFTER `default_thumb` ; +ALTER TABLE `{tbl_prefix}video` ADD `failed_reason` ENUM( 'max_duration', 'max_file', 'invalid_format', 'invalid_upload' ) NOT NULL AFTER `status` ; +ALTER TABLE `{tbl_prefix}users` CHANGE `subscribers` `subscribers` BIGINT( 225 ) NOT NULL DEFAULT '0'; + +INSERT INTO `{tbl_prefix}config` (`configid` ,`name` ,`value`) +VALUES (NULL , 'embed_player_height', '250'), +(NULL , 'embed_player_width', '300'); + +INSERT into {tbl_prefix}config (name,value) VALUES +('photo_main_list','20'), +('photo_home_tabs','10'), +('photo_search_result','20'), +('photo_channel_page','10'), +('photo_user_photos','20'), +('photo_user_favorites','20'), +('photo_other_limit','8'), +('collection_per_page','20'), +('collection_home_page','10'), +('collection_search_result','20'), +('collection_channel_page','10'), +('collection_user_collections','20'), +('collection_user_favorites','20'), +('collection_items_page','20'), +('channel_rating','1'), +('own_channel_rating','1'), +('collection_rating','1'), +('own_collection_rating','1'), +('own_video_rating','1'); + +ALTER TABLE `{tbl_prefix}users` ADD `total_photos` BIGINT( 255 ) NOT NULL AFTER `total_comments` , +ADD `total_collections` BIGINT( 255 ) NOT NULL AFTER `total_photos`; + + +ALTER TABLE `{tbl_prefix}user_profile` ADD `profile_item` VARCHAR( 25 ) NOT NULL AFTER `profile_video` ; +ALTER TABLE `{tbl_prefix}video` ADD `last_commented` DATETIME NOT NULL AFTER `comments_count` ; +ALTER TABLE `{tbl_prefix}users` ADD `last_commented` DATETIME NOT NULL AFTER `comments_count` ; + +ALTER TABLE `{tbl_prefix}user_profile` ADD `allow_subscription` ENUM( 'yes', 'no' ) NOT NULL DEFAULT 'yes' AFTER `allow_ratings`; + +ALTER TABLE `{tbl_prefix}user_profile` ADD `show_my_videos` ENUM( 'yes', 'no' ) NOT NULL DEFAULT 'yes', +ADD `show_my_photos` ENUM( 'yes', 'no' ) NOT NULL DEFAULT 'yes', +ADD `show_my_subscriptions` ENUM( 'yes', 'no' ) NOT NULL DEFAULT 'yes', +ADD `show_my_subscribers` ENUM( 'yes', 'no' ) NOT NULL DEFAULT 'yes', +ADD `show_my_friends` ENUM( 'yes', 'no' ) NOT NULL DEFAULT 'yes'; + +ALTER TABLE `{tbl_prefix}users` ADD `voters` TEXT NOT NULL AFTER `rating`; + +ALTER TABLE `{tbl_prefix}user_profile` ADD `show_my_collections` ENUM( 'yes', 'no' ) NOT NULL DEFAULT 'yes' AFTER `user_profile_id`; + +ALTER TABLE `{tbl_prefix}users` DROP `rating` , +DROP `voters` , +DROP `rated_by` ; + +ALTER TABLE `{tbl_prefix}user_profile` ADD `rating` TINYINT( 2 ) NOT NULL AFTER `profile_item` , +ADD `voters` TEXT NOT NULL AFTER `rating` , +ADD `rated_by` INT( 150 ) NOT NULL AFTER `voters`; + +ALTER TABLE `{tbl_prefix}comments` CHANGE `date_added` `date_added` DATETIME NOT NULL ; + +INSERT INTO `{tbl_prefix}collection_categories` (`category_id`, `category_name`, `category_order`, `category_desc`, `date_added`, `category_thumb`, `isdefault`) VALUES +(1, 'Uncategorized', 0, 'Uncategorized', now(), 0, 'yes'); diff --git a/upload/cb_install/sql/upgrade_2.2.sql b/upload/cb_install/sql/upgrade_2.2.sql new file mode 100644 index 00000000..1e76a476 --- /dev/null +++ b/upload/cb_install/sql/upgrade_2.2.sql @@ -0,0 +1,23 @@ +ALTER TABLE `{tbl_prefix}video` ADD `video_password` VARCHAR( 255 ) NOT NULL AFTER `videokey` ; +ALTER TABLE `{tbl_prefix}video` ADD `video_users` TEXT NOT NULL AFTER `video_password`; +ALTER TABLE `{tbl_prefix}video` ADD `category_parents` TEXT NOT NULL AFTER `category`; + +INSERT INTO `{tbl_prefix}config` (`configid` ,`name` ,`value`)VALUES +(NULL , 'comments_per_page', '15'), +(NULL, 'feedsSection', 'yes'); + + +INSERT INTO `{tbl_prefix}email_templates` ( +`email_template_id` , +`email_template_name` , +`email_template_code` , +`email_template_subject` , +`email_template` , +`email_template_allowed_tags` +) +VALUES ( +NULL , 'Video Subscription Email', 'video_subscription_email', '{uploader} has uploaded new video on {website_title}', 'Hello {username} You have been notified by {website_title} that {uploader} has uploaded new video Video Title : {video_title} Video Description : {video_description}
    click here to watch this video
    You are notified because you are subscribed to {uploader}, you can manage your subscriptions by going to your account and click on manage subscriptions. {website_title}', '' +); + +ALTER TABLE `{tbl_prefix}video` ADD `subscription_email` ENUM( "pending", "sent" ) NOT NULL DEFAULT 'pending' AFTER `last_commented` ; +ALTER TABLE `{tbl_prefix}groups` ADD `group_admins` TEXT NOT NULL AFTER `userid` ; \ No newline at end of file diff --git a/upload/cb_install/sql/upgrade_2.3.sql b/upload/cb_install/sql/upgrade_2.3.sql new file mode 100644 index 00000000..9a638ea2 --- /dev/null +++ b/upload/cb_install/sql/upgrade_2.3.sql @@ -0,0 +1,17 @@ +DROP TABLE IF EXISTS `{tbl_prefix}sessions`; +CREATE TABLE `{tbl_prefix}sessions` ( + `session_id` int(11) NOT NULL AUTO_INCREMENT, + `session` varchar(100) NOT NULL, + `session_user` int(11) NOT NULL, + `session_string` varchar(60) NOT NULL, + `session_value` varchar(32) NOT NULL, + `ip` varchar(20) NOT NULL, + `session_date` datetime NOT NULL, + `current_page` text NOT NULL, + `referer` text NOT NULL, + `agent` text NOT NULL, + `last_active` datetime NOT NULL, + PRIMARY KEY (`session_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; + +ALTER TABLE `{tbl_prefix}users` ADD `album_privacy` ENUM( 'public', 'private', 'friends' ) NOT NULL DEFAULT 'private' ; \ No newline at end of file diff --git a/upload/cb_install/sql/upgrade_2.4.5.sql b/upload/cb_install/sql/upgrade_2.4.5.sql new file mode 100644 index 00000000..f9f138c9 --- /dev/null +++ b/upload/cb_install/sql/upgrade_2.4.5.sql @@ -0,0 +1,96 @@ +CREATE TABLE IF NOT EXISTS `{tbl_prefix}collections` ( + `collection_id` bigint(25) NOT NULL AUTO_INCREMENT, + `collection_name` varchar(225) NOT NULL, + `collection_description` text NOT NULL, + `collection_tags` text NOT NULL, + `category` varchar(20) NOT NULL, + `userid` int(10) NOT NULL, + `views` bigint(20) NOT NULL, + `date_added` datetime NOT NULL, + `featured` varchar(4) NOT NULL DEFAULT 'no', + `broadcast` varchar(10) NOT NULL, + `allow_comments` varchar(4) NOT NULL, + `allow_rating` enum('yes','no') NOT NULL DEFAULT 'yes', + `total_comments` bigint(20) NOT NULL, + `last_commented` datetime NOT NULL, + `total_objects` bigint(20) NOT NULL, + `rating` bigint(20) NOT NULL, + `rated_by` bigint(20) NOT NULL, + `voters` longtext NOT NULL, + `active` varchar(4) NOT NULL, + `public_upload` varchar(4) NOT NULL, + `type` varchar(10) NOT NULL, + PRIMARY KEY (`collection_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; + +CREATE TABLE IF NOT EXISTS `{tbl_prefix}collection_categories` ( + `category_id` int(255) NOT NULL AUTO_INCREMENT, + `category_name` varchar(30) NOT NULL, + `category_order` int(5) NOT NULL, + `category_desc` text NOT NULL, + `date_added` mediumtext NOT NULL, + `category_thumb` mediumint(9) NOT NULL, + `isdefault` enum('yes','no') NOT NULL, + PRIMARY KEY (`category_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1; + + +CREATE TABLE IF NOT EXISTS `{tbl_prefix}collection_items` ( + `ci_id` bigint(20) NOT NULL AUTO_INCREMENT, + `collection_id` bigint(20) NOT NULL, + `object_id` bigint(20) NOT NULL, + `userid` bigint(20) NOT NULL, + `type` varchar(10) NOT NULL, + `date_added` datetime NOT NULL, + PRIMARY KEY (`ci_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1; + +CREATE TABLE IF NOT EXISTS `{tbl_prefix}photos` ( + `photo_id` bigint(255) NOT NULL AUTO_INCREMENT, + `photo_key` mediumtext NOT NULL, + `photo_title` mediumtext NOT NULL, + `photo_description` mediumtext NOT NULL, + `photo_tags` mediumtext NOT NULL, + `userid` int(255) NOT NULL, + `collection_id` int(255) NOT NULL, + `date_added` datetime NOT NULL, + `last_viewed` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATE CURRENT_TIMESTAMP, + `views` bigint(255) NOT NULL, + `allow_comments` enum('yes','no') NOT NULL DEFAULT 'yes', + `allow_embedding` enum('yes','no') NOT NULL DEFAULT 'yes', + `allow_tagging` enum('yes','no') NOT NULL DEFAULT 'yes', + `featured` enum('yes','no') NOT NULL DEFAULT 'no', + `reported` enum('yes','no') NOT NULL DEFAULT 'no', + `allow_rating` enum('yes','no') NOT NULL DEFAULT 'yes', + `broadcast` enum('public','private') NOT NULL DEFAULT 'public', + `active` enum('yes','no') NOT NULL DEFAULT 'yes', + `total_comments` int(255) NOT NULL, + `last_commented` datetime NOT NULL, + `total_favorites` int(255) NOT NULL, + `rating` int(15) NOT NULL, + `rated_by` int(25) NOT NULL, + `voters` mediumtext NOT NULL, + `filename` varchar(100) NOT NULL, + `ext` char(5) NOT NULL, + `downloaded` bigint(255) NOT NULL, + `server_url` text NOT NULL, + `owner_ip` varchar(20) NOT NULL, + PRIMARY KEY (`photo_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; + + + +ALTER TABLE `{tbl_prefix}pages` ADD `page_order` BIGINT( 100 ) NOT NULL AFTER `page_id` , +ADD `display` ENUM( 'yes', 'no' ) NOT NULL DEFAULT 'yes' AFTER `page_order` ; + +UPDATE `{tbl_prefix}pages` SET `display` = 'no' WHERE `page_id` =5 LIMIT 1 ; +UPDATE `{tbl_prefix}pages` SET `display` = 'no' WHERE`page_id` =6 LIMIT 1 ; + +UPDATE `{tbl_prefix}pages` SET `page_order` = '1' WHERE `page_id` =1 LIMIT 1 ; +UPDATE `{tbl_prefix}pages` SET `page_order` = '2' WHERE `page_id` =2 LIMIT 1 ; +UPDATE `{tbl_prefix}pages` SET `page_order` = '3' WHERE `page_id` =3 LIMIT 1 ; +UPDATE `{tbl_prefix}pages` SET `page_order` = '4' WHERE `page_id` =4 LIMIT 1 ; +UPDATE `{tbl_prefix}pages` SET `page_order` = '5' WHERE `page_id` =5 LIMIT 1 ; +UPDATE `{tbl_prefix}pages` SET `page_order` = '6' WHERE `page_id` =6 LIMIT 1 ; + +ALTER TABLE `{tbl_prefix}users` ADD `voted` TEXT NOT NULL AFTER `last_commented`; \ No newline at end of file diff --git a/upload/cb_install/sql/upgrade_2.4.sql b/upload/cb_install/sql/upgrade_2.4.sql new file mode 100644 index 00000000..e69de29b diff --git a/upload/cb_install/sql/upgrade_2.5.1.sql b/upload/cb_install/sql/upgrade_2.5.1.sql new file mode 100644 index 00000000..1ae380fe --- /dev/null +++ b/upload/cb_install/sql/upgrade_2.5.1.sql @@ -0,0 +1,9 @@ +ALTER TABLE `{tbl_prefix}groups` ADD `group_admins` TEXT NOT NULL AFTER `userid`; + +INSERT INTO `{tbl_prefix}config` (`configid`, `name`, `value`) VALUES (NULL, 'embed_type', 'iframe'); +INSERT INTO `{tbl_prefix}config` (`configid`, `name`, `value`) VALUES (NULL, 'playlistsSection', 'yes'); + +INSERT INTO `{tbl_prefix}config` (`configid`, `name`, `value`) VALUES (NULL, 'vid_cat_height', '120'); +INSERT INTO `{tbl_prefix}config` (`configid`, `name`, `value`) VALUES (NULL, 'vid_cat_width', '120'); + +ALTER TABLE `{tbl_prefix}photos` ADD `photo_details` TEXT NOT NULL AFTER `photo_tags`; \ No newline at end of file diff --git a/upload/cb_install/sql/upgrade_2.5.sql b/upload/cb_install/sql/upgrade_2.5.sql new file mode 100644 index 00000000..e69de29b diff --git a/upload/cb_install/sql/upgrade_2.6.sql b/upload/cb_install/sql/upgrade_2.6.sql new file mode 100644 index 00000000..1ff7e69c --- /dev/null +++ b/upload/cb_install/sql/upgrade_2.6.sql @@ -0,0 +1,64 @@ +ALTER TABLE `{tbl_prefix}video` CHANGE `category` `category` VARCHAR( 200 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '0'; +ALTER TABLE `{tbl_prefix}collections` CHANGE `category` `category` VARCHAR( 200 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ; +INSERT INTO `{tbl_prefix}config` (`configid`, `name`, `value`) VALUES (NULL, 'facebook_embed', 'yes'); +INSERT INTO `{tbl_prefix}config` (`configid`, `name`, `value`) VALUES (NULL, 'seo_vido_url', '0'); + +INSERT INTO `{tbl_prefix}config` (`configid`, `name`, `value`) VALUES (NULL, 'use_cached_pagin', 'yes'), +(NULL, 'cached_pagin_time', '5'); + +CREATE TABLE IF NOT EXISTS `{tbl_prefix}counters` ( + `counter_id` int(100) NOT NULL AUTO_INCREMENT, + `section` varchar(200) NOT NULL, + `query` text NOT NULL, + `query_md5` varchar(200) NOT NULL, + `counts` bigint(200) NOT NULL, + `date_added` varchar(200) NOT NULL, + PRIMARY KEY (`counter_id`), + UNIQUE KEY `query_md5` (`query_md5`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ; + + +ALTER TABLE `{tbl_prefix}user_levels_permissions` ADD `photos_moderation` ENUM( 'yes', 'no' ) NOT NULL DEFAULT 'no' , +ADD `collection_moderation` ENUM( 'yes', 'no' ) NOT NULL DEFAULT 'no' AFTER `photos_moderation` , +ADD `plugins_moderation` ENUM( 'yes', 'no' ) NOT NULL DEFAULT 'no' AFTER `collection_moderation` , +ADD `tool_box` ENUM( 'yes', 'no' ) NOT NULL DEFAULT 'no' AFTER `plugins_moderation` , +ADD `plugins_perms` TEXT NOT NULL AFTER `tool_box` ; + +INSERT INTO `{tbl_prefix}user_permissions` ( +`permission_id` , +`permission_type` , +`permission_name` , +`permission_code` , +`permission_desc` , +`permission_default` +)VALUES ( +NULL , '3', 'Allow photo moderation', 'photos_moderation', 'Allow user to moderation photos from admin panel', 'yes'), ( +NULL , '3', 'Collection modetaion', 'collection_moderation', 'Allow users to moderate collection', 'yes'), ( +NULL , '3', 'Plugins moderation', 'plugins_moderation', 'Allow user to moderate plugins', 'yes'), ( +NULL , '3', 'Tool Box', 'tool_box', 'Allow users to access tool box', 'yes'); + +UPDATE `{tbl_prefix}user_levels_permissions` SET `photos_moderation` = 'yes', +`collection_moderation` = 'yes', +`plugins_moderation` = 'yes', +`tool_box` = 'yes' WHERE `user_level_permission_id` =1; + +UPDATE {tbl_prefix}video SET rating='10' WHERE rating>10; + +CREATE TABLE IF NOT EXISTS `{tbl_prefix}mass_emails` ( + `id` int(255) NOT NULL AUTO_INCREMENT, + `email_subj` varchar(255) NOT NULL, + `email_from` varchar(255) NOT NULL, + `email_msg` text NOT NULL, + `configs` text NOT NULL, + `sent` bigint(255) NOT NULL, + `total` bigint(20) NOT NULL, + `users` text NOT NULL, + `start_index` bigint(255) NOT NULL, + `method` enum('browser','background') NOT NULL, + `status` enum('completed','pending','sending') NOT NULL, + `date_added` datetime NOT NULL, + `last_update` datetime NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ; + +ALTER TABLE `{tbl_prefix}photos` ADD `photo_details` TEXT NOT NULL AFTER `photo_tags`; \ No newline at end of file diff --git a/upload/cb_install/sql/upgrade_2.7.sql b/upload/cb_install/sql/upgrade_2.7.sql new file mode 100644 index 00000000..483b6635 --- /dev/null +++ b/upload/cb_install/sql/upgrade_2.7.sql @@ -0,0 +1,17 @@ +-- Adding new user level permission +-- Author Arslan +ALTER TABLE `{tbl_prefix}user_levels_permissions` ADD `allow_manage_user_level` ENUM( 'yes', 'no' ) NOT NULL DEFAULT 'no' AFTER `plugins_perms`; +UPDATE `{tbl_prefix}user_levels_permissions` SET `allow_manage_user_level` = 'yes' WHERE `cb_user_levels_permissions`.`user_level_permission_id` =1; +INSERT INTO `{tbl_prefix}user_permissions` (`permission_id`, `permission_type`, `permission_name`, `permission_code`, `permission_desc`, `permission_default`) VALUES (NULL, '3', 'Allow manage user levels', 'allow_manage_user_level', 'Allow user to edit user levels', 'no'); + + +-- Adding Collection contributors + +CREATE TABLE IF NOT EXISTS `{tbl_prefix}collection_contributors` ( + `contributor_id` int(200) NOT NULL AUTO_INCREMENT, + `collection_id` int(255) NOT NULL, + `userid` int(255) NOT NULL, + `can_edit` enum('yes','no') NOT NULL DEFAULT 'no', + `date_added` datetime NOT NULL, + PRIMARY KEY (`contributor_id`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ; \ No newline at end of file diff --git a/upload/cb_install/sql/user_levels.sql b/upload/cb_install/sql/user_levels.sql new file mode 100644 index 00000000..743c3eb6 --- /dev/null +++ b/upload/cb_install/sql/user_levels.sql @@ -0,0 +1,88 @@ + +-- +-- Dumping data for table `user_levels` +-- + +INSERT INTO `{tbl_prefix}user_levels` (`user_level_id`, `user_level_active`, `user_level_name`, `user_level_is_default`) VALUES +(4, 'yes', 'Guest', 'yes'), +(2, 'yes', 'Registered User', 'yes'), +(3, 'yes', 'Inactive User', 'yes'), +(1, 'yes', 'Administrator', 'yes'), +(5, 'yes', 'Global Moderator', 'yes'), +(6, 'yes', 'Anonymous', 'yes'); + +-- +-- Dumping data for table `user_levels_permissions` +-- + +INSERT INTO `{tbl_prefix}user_levels_permissions` (`user_level_permission_id`, `user_level_id`, `admin_access`, `allow_video_upload`, `view_video`, `view_channel`, `view_group`, `view_videos`, `avatar_upload`, `video_moderation`, `member_moderation`, `ad_manager_access`, `manage_template_access`, `group_moderation`, `web_config_access`, `view_channels`, `view_groups`, `playlist_access`, `allow_channel_bg`, `private_msg_access`, `edit_video`, `download_video`, `admin_del_access`) VALUES +(1, 1, 'yes', 'yes', 'yes', 'yes', 'yes', 'yes', 'yes', 'yes', 'yes', 'yes', 'yes', 'yes', 'yes', 'yes', 'yes', 'yes', 'yes', 'yes', 'yes', 'yes', 'yes'), +(2, 2, 'no', 'yes', 'yes', 'yes', 'yes', 'yes', 'yes', 'no', 'no', 'no', 'no', 'no', 'no', 'yes', 'yes', 'yes', 'yes', 'yes', 'yes', 'yes', 'no'), +(3, 3, 'no', 'no', 'yes', 'yes', 'yes', 'yes', 'no', 'no', 'no', 'no', 'no', 'no', 'no', 'yes', 'yes', 'yes', 'yes', 'yes', 'yes', 'yes', 'no'), +(4, 4, 'no', 'yes', 'yes', 'yes', 'yes', 'yes', 'no', 'no', 'no', 'no', 'no', 'no', 'no', 'yes', 'yes', 'yes', 'yes', 'yes', 'yes', 'yes', 'no'), +(5, 5, 'yes', 'yes', 'yes', 'yes', 'yes', 'yes', 'yes', 'yes', 'yes', 'no', 'no', 'no', 'no', 'yes', 'yes', 'yes', 'yes', 'yes', 'yes', 'yes', 'no'), +(6, 6, 'no', 'yes', 'no', 'no', 'no', 'no', 'yes', 'no', 'no', 'no', 'no', 'no', 'no', 'no', 'no', 'no', 'yes', 'no', 'no', 'yes', 'no'); + +-- +-- Dumping data for table `user_permissions` +-- + +INSERT INTO `{tbl_prefix}user_permissions` (`permission_id`, `permission_type`, `permission_name`, `permission_code`, `permission_desc`, `permission_default`) VALUES +(12, 3, 'Admin Access', 'admin_access', 'User can access admin panel', 'no'), +(13, 1, 'View Video', 'view_video', 'User can view videos', 'yes'), +(11, 2, 'Allow Video Upload', 'allow_video_upload', 'Allow user to upload videos', 'yes'), +(14, 1, 'View Channel', 'view_channel', 'User Can View Channel', 'yes'), +(15, 1, 'View Group', 'view_group', 'User Can View Group', 'yes'), +(16, 1, 'View Videos Page', 'view_videos', 'User Can view videos page', 'yes'), +(17, 2, 'Allow Avatar Upload', 'avatar_upload', 'User can upload video', 'yes'), +(19, 3, 'Video Moderation', 'video_moderation', 'User Can Moderate Videos', 'no'), +(20, 3, 'Member Moderation', 'member_moderation', 'User Can Moderate Members', 'no'), +(21, 3, 'Advertisment Manager', 'ad_manager_access', 'User can change advertisment', 'no'), +(22, 3, 'Manage Templates', 'manage_template_access', 'User can manage website templates', 'no'), +(23, 3, 'Groups Moderation', 'group_moderation', 'User can moderate group', 'no'), +(24, 3, 'Website Configurations', 'web_config_access', 'User can change website settings', 'no'), +(25, 1, 'View channels', 'view_channels', 'User can channels', 'yes'), +(26, 1, 'View Groups', 'view_groups', 'User can view groups', 'yes'), +(28, 4, 'Playlist Access', 'playlist_access', 'User can access playlists', 'yes'), +(29, 2, 'Allow Channel Background', 'allow_channel_bg', 'Allow user to change channel background', 'yes'), +(30, 4, 'Private Messages', 'private_msg_access', 'User can use private messaging system', 'yes'), +(31, 4, 'Edit Video', 'edit_video', 'User can edit video', 'yes'), +(32, 4, 'Download Video', 'download_video', 'User can download videos', 'yes'), +(33, 3, 'Admin Delete Access', 'admin_del_access', 'User can delete comments if has admin access', 'no'); + +-- +-- Dumping data for table `user_permission_types` +-- + +INSERT INTO `{tbl_prefix}user_permission_types` (`user_permission_type_id`, `user_permission_type_name`, `user_permission_type_desc`) VALUES +(1, 'Viewing Permission', ''), +(2, 'Uploading Permission', ''), +(3, 'Administrator Permission', ''), +(4, 'General Permission', ''); + +-- 2.6 + +INSERT INTO `{tbl_prefix}user_permissions` ( +`permission_id` , +`permission_type` , +`permission_name` , +`permission_code` , +`permission_desc` , +`permission_default` +)VALUES ( +NULL , '3', 'Allow photo moderation', 'photos_moderation', 'Allow user to moderation photos from admin panel', 'yes'), ( +NULL , '3', 'Collection modetaion', 'collection_moderation', 'Allow users to moderate collection', 'yes'), ( +NULL , '3', 'Plugins moderation', 'plugins_moderation', 'Allow user to moderate plugins', 'yes'), ( +NULL , '3', 'Tool Box', 'tool_box', 'Allow users to access tool box', 'yes'); + +UPDATE `{tbl_prefix}user_levels_permissions` SET `photos_moderation` = 'yes', +`collection_moderation` = 'yes', +`plugins_moderation` = 'yes', +`tool_box` = 'yes' WHERE `user_level_permission_id` =1; + +-- 2.7 +-- Adding new user level permission +-- Author Arslan +ALTER TABLE `{tbl_prefix}user_levels_permissions` ADD `allow_manage_user_level` ENUM( 'yes', 'no' ) NOT NULL DEFAULT 'no' AFTER `plugins_perms`; +UPDATE `{tbl_prefix}user_levels_permissions` SET `allow_manage_user_level` = 'yes' WHERE `cb_user_levels_permissions`.`user_level_permission_id` =1; +INSERT INTO `{tbl_prefix}user_permissions` (`permission_id`, `permission_type`, `permission_name`, `permission_code`, `permission_desc`, `permission_default`) VALUES (NULL, '3', 'Allow manage user levels', 'allow_manage_user_level', 'Allow user to edit user levels', 'no'); \ No newline at end of file diff --git a/upload/cb_install/style.css b/upload/cb_install/style.css new file mode 100644 index 00000000..76ca422c --- /dev/null +++ b/upload/cb_install/style.css @@ -0,0 +1,110 @@ +body +{ + margin:10px; padding:0px; + font-family:tahoma; + font-size:11px; + color:#000; +} + +a{color:#06c} + +#container +{ + margin:auto; + width:880px; + border:2px solid #eee; + padding:10px; +} + +#head{margin:auto;width:900px; margin-bottom:10px} + +#header +{ + height:25px; width:900px; border:1px solid #d4d4d4; + line-height:25px; background-image:url(images/header_grad.png); background-repeat:repeat-x; + background-position:center; + margin:auto; margin-bottom:5px; +} + + +.br5px +{ + border-radius:5px; + -webkist-border-radius:5px; + -moz-border-radius:5px; +} + +.headstatus +{ + padding:0px; margin:0px; + background-image:url(images/header_grad_line.png); + background-repeat:repeat-x; + background-position:center; + width:98%; margin:auto +} + +.headstatus li +{ + height:25px;line-height:25px;background-image:url(images/header_grad.png); + background-repeat:repeat-x; + background-position:center; + display:inline-block; + margin:0px 5px; + padding:0px 5px; + color:#999 +} + +.headstatus .selected { color:#09c; font-weight:bold} + +#logo{font-family: 'Cabin', arial, serif; font-size:28px; font-weight:bold} + +.bttnleft,.bttncenter,.bttnright,.bttnrightalt +{ + height:34px; display:inline-block;line-height:32px; font-size:14px; font-weight:bold; font-family:Arial, Helvetica, sans-serif; color:#fff; + cursor:pointer; +} +.bttnleft{background-image:url(images/bttnleft.png); width:14px; } +.bttncenter{background-image:url(images/bttncenter.png);min-width:50px;padding-right:10px; } +.bttnright{background-image:url(images/bttnright.png);width:37px; } +.bttnrightalt{background-image:url(images/bttnrightalt.png); width:14px; } + +dt{font-weight:bold; float:left; width:80px; display:inline-block;border-bottom:1px dotted #999; padding:5px 3px; line-height:20px; } +dd{ width:auto; border-bottom:1px dotted #999; padding:5px 3px; margin:0px; line-height:20px;} +dd .red{color:ed0000} dd .green{color:#060; } +dd .ok{background-image:url(images/tick.png); background-repeat:no-repeat; height:20px; padding-left:23px; display:inline-block} +dd .alert{background-image:url(images/alert.png); background-repeat:no-repeat; height:20px; padding-left:23px; display:inline-block} + +dd:last-child{border-bottom:none} +dl{background-color:#F7F7F7; padding:0px; border:1px dotted #999} + +.inside_shadow +{ + -moz-box-shadow: inset -5px -5px 5px #ccc; + -webkit-box-shadow: inset -5px -5px 5px #ccc; + box-shadow: inset -5px -5px 5px #ccc; +} + +.field{margin-bottom:10px} +.field input{border:1px solid #ccc; padding:5px 3px; font-size:13px; color:#666; width:300px} +.field label{display:block; margin-top:10px; font-size:16px; font-weight:bold; font-family:Arial, Helvetica, sans-serif} + +.errorDiv +{ + padding:5px; margin:10px 0px; + background-color:#FFFDCA; + border:1px solid #FA7C80; +} + +.alert{background-image:url(images/alert.png); background-repeat:no-repeat; height:20px; + padding-left:23px; display:inline-block; +line-height:20px} + +.ok{background-image:url(images/tick.png); background-repeat:no-repeat; height:20px; padding-left:23px; display:inline-block;line-height:20px} + +.green{display:block; margin-bottom:10px} + +.product{margin-top:10px; width:400px; padding:5px; background-color:#f3f3f3; border:1px solid #d6d6d6; float:left; margin:5px 10px} +.product a{font-size:16px; font-weight:bold; font-family:Arial, Helvetica, sans-serif; color:#0099CC; text-decoration:none; display:block} +.product .desc{color:#666; margin-top:5px} + +.product:hover{background-color:#eaeaea; border:1px solid #09c} \ No newline at end of file diff --git a/upload/cb_install/upgradeable.php b/upload/cb_install/upgradeable.php new file mode 100644 index 00000000..a02b6546 --- /dev/null +++ b/upload/cb_install/upgradeable.php @@ -0,0 +1,37 @@ + \ No newline at end of file diff --git a/upload/channels.php b/upload/channels.php new file mode 100644 index 00000000..72cea86e --- /dev/null +++ b/upload/channels.php @@ -0,0 +1,83 @@ +perm_check('view_channels',true); + +//Setting Sort +$sort = $_GET['sort']; +//$u_cond = array('category'=>mysql_clean($_GET['cat']),'date_span'=>$_GET['time']); +//Thanks to florin.mandache + +$u_cond = array('category'=>mysql_clean($_GET['cat']),'date_span'=>mysql_clean($_GET['time'])); + +switch($sort) +{ + case "most_recent": + default: + { + $u_cond['order'] = " doj DESC "; + } + break; + case "most_viewed": + { + $u_cond['order'] = " profile_hits DESC "; + } + break; + case "featured": + { + $u_cond['featured'] = "yes"; + } + break; + case "top_rated": + { + $u_cond['order'] = " rating DESC"; + } + break; + case "most_commented": + { + $u_cond['order'] = " total_comments DESC"; + } + break; +} + +//Getting User List +$page = mysql_clean($_GET['page']); +$get_limit = create_query_limit($page,CLISTPP); +$count_query = $ulist = $u_cond; +$ulist['limit'] = $get_limit; +$users = get_users($ulist); +Assign('users', $users); + + +$counter = get_counter('channel',$count_query); + +if(!$counter) +{ + //Collecting Data for Pagination + $ucount = $u_cond; + $ucount['count_only'] = true; + $total_rows = get_users($ucount); + $counter = $total_rows; + update_counter('channel',$count_query,$counter); +} + +$total_pages = count_pages($counter,CLISTPP); +//Pagination +$pages->paginate($total_pages,$page); + +subtitle(lang('channels')); +template_files('channels.html'); +display_it(); + + +?> \ No newline at end of file diff --git a/upload/collections.php b/upload/collections.php new file mode 100644 index 00000000..825340b8 --- /dev/null +++ b/upload/collections.php @@ -0,0 +1,91 @@ +page_redir(); + +$sort = $_GET['sort']; +$cond = array("category"=>mysql_clean($_GET['cat']),"date_span"=>mysql_clean($_GET['time'])); +$content = mysql_clean($_GET['content']); + +switch($sort) +{ + case "most_recent": + default: + { + $cond['order'] = " date_added DESC"; + } + break; + + case "featured": + { + $cond['featured'] = "yes"; + } + break; + + case "most_viewed": + { + $cond['order'] = " views DESC"; + } + break; + + case "most_commented": + { + $cond['order'] = " total_comments DESC"; + } + break; + + case "most_items": + { + $cond['order'] = " total_objects DESC"; + } + break; +} + +switch($content) +{ + case "videos": + { + $cond['type'] = "videos"; + } + break; + + case "photos": + { + $cond['type'] = "photos"; + } +} + +//$cond['has_items'] = true; + +//Getting Collection List +$page = mysql_clean($_GET['page']); +$get_limit = create_query_limit($page,COLLPP); +$clist = $cond; +$clist['limit'] = $get_limit; +$collections = $cbcollection->get_collections($clist); + +Assign('collections', $collections); + +//Collecting Data for Pagination +$ccount = $cond; +$ccount['count_only'] = true; +$total_rows = $cbcollection->get_collections($ccount); +$total_pages = count_pages($total_rows,COLLPP); + +//Pagination +$pages->paginate($total_pages,$page); + +subtitle(lang('collections')); +//Displaying The Template +template_files('collections.html'); +display_it(); +?> \ No newline at end of file diff --git a/upload/contact.php b/upload/contact.php new file mode 100644 index 00000000..13382f1f --- /dev/null +++ b/upload/contact.php @@ -0,0 +1,61 @@ +get_template('contact_form'); + $more_var = array + ('{name}' => substr($name,0,100), + '{email}' => substr($email,0,100), + '{reason}' => substr($reason,0,300), + '{message}' => $message, + '{ip_address}' => $_SERVER['REMOTE_ADDR'], + '{now}' => now(), + ); + if(!is_array($var)) + $var = array(); + $var = array_merge($more_var,$var); + $subj = $cbemail->replace($tpl['email_template_subject'],$var); + $msg = nl2br($cbemail->replace($tpl['email_template'],$var)); + + //Now Finally Sending Email + if(cbmail(array('to'=>SUPPORT_EMAIL,'from'=>$email,'subject'=>$subj,'content'=>$msg))) + e(lang("email_send_confirm"),"m"); + } +} + +subtitle(lang("contact_us")); + +template_files('contact.html'); +display_it(); +?> \ No newline at end of file diff --git a/upload/create_group.php b/upload/create_group.php new file mode 100644 index 00000000..29cb536f --- /dev/null +++ b/upload/create_group.php @@ -0,0 +1,28 @@ +logincheck(); +$pages->page_redir(); + + +// Creating Group if button is pressed +if(isset($_POST['create_group'])) { + $cbgroup->create_group($_POST,userid(),true); +} + +subtitle(lang('grp_crt_grp')); + +template_files('create_group.html'); +display_it(); + +?> \ No newline at end of file diff --git a/upload/download.php b/upload/download.php new file mode 100644 index 00000000..57ffda8a --- /dev/null +++ b/upload/download.php @@ -0,0 +1,46 @@ +perm_check('download_video',true); +$pages->page_redir(); + +//Getting Video Key +$vkey = @$_GET['v']; +$vdo = $cbvid->get_video($vkey); + +if($vdo && video_playable($vkey)) +{ + //Calling Functions When Video Is going to download + call_download_video_function($vdo); + + $file = get_video_file($vdo,false); + + if($file) + $vdo['download_file'] = $file; + else + { + $Cbucket->show_page = false; + e(lang("unable_find_download_file")); + } + assign('vdo',$vdo); + subtitle("Download ".$vdo['title']); + +} + + +//Displaying The Template +template_files('download.html'); +display_it(); +?> diff --git a/upload/download_photo.php b/upload/download_photo.php new file mode 100644 index 00000000..27f9c04c --- /dev/null +++ b/upload/download_photo.php @@ -0,0 +1,29 @@ +perm_check('download_video',true); +$pages->page_redir(); + +$key = $cbphoto->decode_key($_GET['download']); + +if(empty($key)) + header("location:".BASEURL); +else +{ + $cbphoto->download_photo($key); +} + +display_it(); +?> \ No newline at end of file diff --git a/upload/edit_account.php b/upload/edit_account.php new file mode 100644 index 00000000..d41449d4 --- /dev/null +++ b/upload/edit_account.php @@ -0,0 +1,126 @@ +logincheck(); + +//Updating Profile +if(isset($_POST['update_profile'])) +{ + $array = $_POST; + $array['userid'] = userid(); + $userquery->update_user($array); +} + +//Updating Avatar +if(isset($_POST['update_avatar_bg'])) +{ + $array = $_POST; + $array['userid'] = userid(); + $userquery->update_user_avatar_bg($array); +} + +//Changing Email +if(isset($_POST['change_email'])) +{ + $array = $_POST; + $array['userid'] = userid(); + $userquery->change_email($array); +} + +//Changing User Password +if(isset($_POST['change_password'])) +{ + $array = $_POST; + $array['userid'] = userid(); + $userquery->change_password($array); +} + +//Banning Users +if(isset($_POST['block_users'])) +{ + $userquery->block_users($_POST['users']); +} + +$mode = $_GET['mode']; + +switch($mode) +{ + case 'account': + { + assign('on','account'); + assign('mode','profile_settings'); + } + break; + case 'profile': + { + assign('on','profile'); + assign('mode','profile_settings'); + } + break; + + case 'avatar_bg': + { + assign('mode','avatar_bg'); + } + break; + + case 'change_email': + { + assign('mode','change_email'); + } + break; + + case 'change_password': + { + assign('mode','change_password'); + } + break; + + case 'block_users': + { + assign('mode','block_users'); + } + break; + + case 'subscriptions': + { + //Removing subscription + if(isset($_GET['delete_subs'])) + { + $sid = mysql_clean($_GET['delete_subs']); + $userquery->unsubscribe_user($sid); + } + assign('mode','subs'); + assign('subs',$userquery->get_user_subscriptions(userid())); + } + break; + + default: + { + assign('on','account'); + assign('mode','profile_settings'); + } +} + + +$udetails = $userquery->get_user_details(userid()); +$profile = $userquery->get_user_profile($udetails['userid']); +$user_profile = array_merge($udetails,$profile); +//pr($Cbucket->header_files); +assign('user',$udetails); +assign('p',$user_profile); + + +subtitle(lang("user_manage_my_account")); +template_files('edit_account.html'); +display_it(); +?> \ No newline at end of file diff --git a/upload/edit_group.php b/upload/edit_group.php new file mode 100644 index 00000000..5804a147 --- /dev/null +++ b/upload/edit_group.php @@ -0,0 +1,54 @@ +logincheck(); +$udetails = $userquery->get_user_details(userid()); +assign('user',$udetails); +assign('p',$userquery->get_user_profile($udetails['userid'])); + +$gid = mysql_clean($_GET['gid']); +//get group details +$gdetails = $cbgroup->get_group_details($gid); + +$gArray = + array + ( + 'group' => $gdetails, + 'groupid' => $gid, + 'uid' => userid(), + 'user' => $userquery->udetails, + 'checkowner' => 'yes' + ); + +if(!$cbgroup->is_admin($gArray) && !has_access('admin_access',true)) +{ + e(lang("you_cant_edit_group")); + $Cbucket->show_page = false; +}else{ + + //Updating Video Details + if(isset($_POST['update_group'])) + { + $_POST['group_id'] = $gid; + $cbgroup->update_group(); + $gdetails = $cbgroup->get_group_details($gid); + + } + + assign('group',$gdetails); +} + +subtitle(lang("grp_edit_grp_title")); +template_files('edit_group.html'); +display_it(); +?> \ No newline at end of file diff --git a/upload/edit_photo.php b/upload/edit_photo.php new file mode 100644 index 00000000..92145670 --- /dev/null +++ b/upload/edit_photo.php @@ -0,0 +1,42 @@ +login_check('edit_video'); + +$udetails = $userquery->get_user_details(userid()); +assign('user',$udetails); +assign('p',$userquery->get_user_profile($udetails['userid'])); + +$pid = mysql_clean($_GET['photo']); +$photo = $cbphoto->get_photo($pid); + +if(empty($photo)) + e(lang("photo_not_exists")); +elseif($photo['userid'] != userid()) +{ + e(lang("You can not edit this photo.")); + $Cbucket->show_page = false; +} else { + if(isset($_POST['update_photo'])) + { + $cbphoto->update_photo(); + $photo = $cbphoto->get_photo($pid); + } + + assign('p',$photo); +} + +subtitle(lang("Edit Photo")); +template_files('edit_photo.html'); +display_it(); +?> \ No newline at end of file diff --git a/upload/edit_video.php b/upload/edit_video.php new file mode 100644 index 00000000..d61d6582 --- /dev/null +++ b/upload/edit_video.php @@ -0,0 +1,48 @@ +login_check('edit_video'); + +$udetails = $userquery->get_user_details(userid()); +assign('user',$udetails); +assign('p',$userquery->get_user_profile($udetails['userid'])); + +$vid = mysql_clean($_GET['vid']); +//get video details +$vdetails = $cbvid->get_video_details($vid); + +if($vdetails['userid'] != userid()) +{ + e(lang('no_edit_video')); + $Cbucket->show_page = false; +}else{ + + //Updating Video Details + if(isset($_POST['update_video'])){ + $Upload->validate_video_upload_form(); + if(empty($eh->error_list)) + { + $_POST['videoid'] = $vid; + $cbvid->update_video(); + $cbvid->set_default_thumb($vid,mysql_clean(post('default_thumb'))); + $vdetails = $cbvid->get_video_details($vid); + } + } + + assign('v',$vdetails); +} + +subtitle(lang("vdo_edit_vdo")); +template_files('edit_video.html'); +display_it(); +?> \ No newline at end of file diff --git a/upload/favicon.ico b/upload/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..e85c3dd2bd0f1a991a62e382775a9733825e117e GIT binary patch literal 3262 zcmbW4A#me36o$1^(14rSpqsD@3@j|W!i9x}3j+hg*3i(<;DEsbg93vBg8+j70Rw{o zg8<)5fI)yjfI(+{pR7hzYAnB|^(1?@LVV(PJ{Qb05&t2?pF)TQgOGS& z=(zszSnL11HqEG=R9(rqNc~+JR7JwmXxi@ui^Pl9v+qk0ue9MrtI3OhpC{`>nKnxO z9;~U#qNistS0Y-9e>%g#ATn{Nv+%LZLRA(2m#9d+m$e4}iD{y>HgaD4MIJA!B0i~K zH;|q`uO}3mwp=qOYk?l-XK$K?54+S;^@p3PWR!Yu+Kj^MXDF!Mc;dyI?9$a}-}3k= z^F`u)V4Y5I-fb-N#S>d!ViU~KK*G=rCfZVeis2C9xS5B^hGH)Rm*QB-QE-DS zqlZHgo$9htHTM&zE))8Y1&cHF1<}SAsC{jerPyaa`|69)@+KhLw1J~og{4=h&%zhS zDzo`{^aXt4)=UXHZO%sy6zswl8V58hj9qX1DU5Co7q86LE+%a$GmoUgFsY;qv z8Qvkrt;O%~W0QbLE&dWe3ubNuk7bGmNUZ^4hi+w}z6)i#l0k>xv9N@mGF@8n zCsl6z2|>L_Yu!!L;2qj~+}Gl_;lh^7=x!Ulks4~Mj!x&{Lbh4DW=5@*M^|~RuwEhY zvjDXX=XTe+-Gnha$``#Z$5krX0G#Hv&d+MuS>yFtO#k-!+h794FlRJUgrbt3spSrHvRE&ZFX2J@XAMo6ekIb& z8GQr_wd(xlate9a;X~mX-@s^L@!3Ki-Mv$|nU_A`G{n9*$1}d!g*zj!x_E!pK3h?1 zWxL7Nr#WTv{&7Cl1xt|H1lIwoE<(EtoTjPSJF4m;lHtTnHvTT`mlW|m!C|I}K!I#v zT^8fZaN4WV%?X6_;xuHUha)hj(95?Jc{D#rkIlL)`2e5h6wayHWSYRzF4F9yripyL zL^*dgA_p9aN8~;>Gu6>z& zDWa*q32=3->*0((>da_vZ{`r(jd0=F(Lt`u_%0785MeNWv@g@%WA*EQ>|7S(H>y0A zQI$Rw(cCo9a`6cAzN7Bl%uf}1~|5hrce{VqFi6stF7j`YS{BA(=@k>NYzlgIkoxM9g1w>;mn){P9ziUI!TR*1h^ N1>q0zt!@8p{{#Co-U$Ez literal 0 HcmV?d00001 diff --git a/upload/files/.htaccess b/upload/files/.htaccess new file mode 100644 index 00000000..502a99ff --- /dev/null +++ b/upload/files/.htaccess @@ -0,0 +1,2 @@ +Options -ExecCGI +AddHandler cgi-script .php .pl .py .jsp .asp .htm .shtml .sh .cgi .exe .html .ruby .pearl \ No newline at end of file diff --git a/upload/files/photos/no-photo_m.png b/upload/files/photos/no-photo_m.png new file mode 100644 index 0000000000000000000000000000000000000000..d5f346c4bb36d45325a588335d060e0614e138aa GIT binary patch literal 4819 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 SWxLW-~1QCuyW%7 literal 0 HcmV?d00001 diff --git a/upload/files/photos/no-photo_t.png b/upload/files/photos/no-photo_t.png new file mode 100644 index 0000000000000000000000000000000000000000..f5a6db31404eebba3990822c17f6d2b336be6ed2 GIT binary patch literal 4239 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 literal 0 HcmV?d00001 diff --git a/upload/files/thumbs/processing.jpg b/upload/files/thumbs/processing.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a4efc6eef2aacbc056379db0e828f79b558d8c78 GIT binary patch literal 4065 zcmY*c2RK|!+djM2THUVRdzYw*5)z_DXOXaaFVV#tQG)2b_ZGdERe}(Nl_(*sC_xY{ z1R-i9>?e8O_xu0vp6i;K=bq=x+|PODTr&qZi(3XL)K%`O03a{`*j^O?w*$bH9@)6~ z0U!VZ0D$flwFi(X*t%QW0k*wY38Ao!5qz=z`h0TfC=03#rP z5)u*-5fYO8FF<&Bc=!-}LMW7wl$em1l$`7e zpW!PKf)Bu<1ni;+N|*wbo>d43HiP!TgxFnu&SvU1&t!3KyYO@xd)4RGlQz$|Y<(~v zjCik9fbg!SgMf+f{$2zGhT}olMfDK)3Ra#RlvE*N;?UJGO)1W(b$#?MOl%(lS`f5IXdvlEDU9PB%^Ag>Cc0X`w{Hv`_ zpN<~=n!RE9lRDwtwT>XptYJ*F$IV1E{-9~~WY3j$z>!@UYeeG&$O zqNehFGvXXL5}vp5o0ckOk&-jfh@?S$y&~-fYvuA^2{oLiF2{t6cl#43w%9*EFSs>< zoSXmrrmLfm%GsH$JM%}<%!$Nb#kD^L1B?^>yhHh>rUC=5?`pXIMErI|eSXt@~hj%fdg2> zF9H@7Uo?sNr?_=85P{@>zY?~A#@P!e@-6CD8!Gqtf4$vej+zT=Zxg0sUEn>ot!ax< zvQ-xjTDnG(W)HvPHcWTzjbJ9($3Ycw6K%uu;8ePk0cvW4)pjD?`Bj$QPZD1DAbD*! zHK!vS&Ze2K<=WPN{yeWFNg((-Y13>RmPP!Um)+0O{Z?bYsZCN|Wy0he=NtC{1Z*y?CcXP>m=Fj^}&Clsfv^WuO?dszU98)M>H6#WTz!7NG-Tf zi6g(f49jJElrBP52Ks(U^p3AvqESbU`oO~2bu-nn&6G;#*3EE&c0}Q*BM|h8pqif4&H?q$C4?B8kvrz3i?nQ zj+_p|o1xJe8!{twuxujKE?gwo$ZlPQ<45*X>-xSHJGM)MWo#`+ML8C_ACO7N?6W9j zgab4cw8Z!apx`W(6?d}pijursWsCtwDu;H-oj&_R8nUB?i;?jTcW11{awv(|)A>3vGIYqG|I??>674_)y!| zR_g#`khs`{55$x>KDtz_AcFlB$$eS59|DsrqWxjW$uJ{OvzYwd?NH`gvIZ+fj69HI zse6Ebk0aY(jj~=h?|L+G)0DM7hNk))ZP%AI`-6sC3f15C zKuegPYBL6?m(7TZ?(s^O_Gsl6KLu-SW%$R8d@U$`$Ie5tihhWqwo8->P?Qkd6uO^5 z%hx8>t6%NY_u86G0p1j>Xos}*nLnFw^PF(ka$41T#XT)~A2aNP%5mMDvmmi_W-fJpTD{#YNiWR*wbg$oKm?yC$h6R&N)Lr-XdS$j%5#8lv=F4uL zt!Qu3kR}`9my!N>$|7I2xpF_B8!u|16~$2mqV`#?%2qlX=2D=*3wc~;c5a~^DL-gT zuQ4_9vc9L^d~B^JCbvi6dtJaMv!6?z_8Ke$`CS^?@pWr6WT$gx99>J|yqAncCTfmR zoAx0wg-^WGjp=8YI?9;y*+pqI$62V6bdX*)H!@<_1E3Xw15ocexA%sw!vmVk30V>u zcVFdO=^4ic)@u~#V1~=frY{61WtC}S#hzfb*To!QgR2jVQF+T3v(clKx8l_N1l!bt zk(EUh5o$#?F(KCB>is_>c}CQ~9<#qT>DkTLx@6KLt_&;-Po~+ym=xMX#QrR4$z1Kr zAy>7(k^id4`mv8`^zHYSJD49;8>Hq z75?X7j`VClm$p~~+50wVyAsD;`z$NcgGGRbnqat4> zyhXp;Or_Oa_*c%mOgk76kI(J60V(3xkQna9;FAww?rW`v1UgWK$J3P47BON{-Bf+k z9x6>2D2$w!he-Jx4MjDdC7Pe1k zb3Zxt*4NDLjs^Ffy3@>3iS!(!m2IcO3>HD`bm02f%Fga-mU+YHSnDTRRrDl(>F)BF z_pf?s=PGkkGvp+Y<$6c)Ad_wAid|;_IN5M&WHSF!nE9B-A%}y_APq0yUNH{fMEX3t z9;T9xk>Mp>W9sy34v`|n+-;YE@MX*#BILtC-5Ng=j_U1)L*7L8lcRi z=8lICONnPk^?i*?GC~rRCB>>b6Kz-ED`wO%c8mui{&h==YcA&flrY=5i`T*7Cdmyw zbi+dZt`Bzb`#>r_6Q7;IitwDdqbHrp2OIYqyZM+nyJ7324-*lc%A@!bX z$mJf*WUOMdR%=UiGwg2njr!Nvh;I{I8&*;4?>|vlj95gyc0=f!Mczt6#>UQ7GhyD# z?wSf{JE)-z^BPklf>w8~AH|INe{_x_{Xv$hrMm%mr|<_Cvw6;Wv|2oJ3EB`Hj;Jav zTbS59zcKE@Z*4kJzTl7D;Ti}_t#a@rO&k<*Bc~DwIfw)Kq^_{0e`N0xd^i#;Q=s7>K1gg&uI%Oe)@W|p&Gs)ipd4O;1Ei5FWZ!qb@^C7d@g3j*?wdoQ2@nHF zoYE-tTwXd@U6%~h(H7!sfj*pcouIBOtsW&WbChN&k*SZLf*{NW^BrT@*02P8>5^h# zLr{*T3*cFajxg_Kq||)zg5rKrHx7s;pLi;}XyLW&_mcJJVYl7UZnbLn!L1tefTPgh z-$#a@sC=JQPfBpHi5&NfEJtF-JhSH51BTOsc#x%M#Y5U2xVq&2dn$!;c#-5fBDlRI z1nmrPvyr|4bSW6?K4t2ESoa`&=-;_Y&t#L%puRz%jBJO}@?-gB3Zo(h%87z zKmI$^$FZTo4%T}WG`}VSYfj)^jY8|n=Q%f;Q6&Z6B(Sxn{F6<3@aSz48*WGwHaab@ zKdFcf8Fgz-if=YZH)l!8d1Zub5B)55?+LZDbX!+rdudOV^AmS$57MOe*+yr`bxj&+ zE_@?Td^N*wu`~<(OboPX8o!P;{Yks}cBVJ%x*kZzyN_!zwGxw^AT>BPGk@4TpV!XV zhnnaVpP5rkf?#i48R`8nb4k7Tbqu8rX$_SDvg!yvDiUw^wqEdlu>RfM`6m6YuaYl? z+3gq0MqKp;t<``9VHcypH@knnv%hbUK#>rd;_Xni;!8SMqDbEj4j0vVf#Sr+8B+OK{Mc?rQMr@O1yq%3Sswf{3q*U@< av6n?a63MSyUrT@WfA#Mg|F3%oH}@Y}EGjGj literal 0 HcmV?d00001 diff --git a/upload/files/videos/no_video.flv b/upload/files/videos/no_video.flv new file mode 100644 index 0000000000000000000000000000000000000000..327ee7c71331bfade0d2db3388f2317aa1c2115d GIT binary patch literal 119504 zcmd43V~{4@voHFzjcMDqZB299wr$(CZA{y?ZQFKF+h^YW{^On<_w27X&aJ4bT#;Cr ztD-7v#jkRen6wHI7ytl(`g;J703cHT(7zin0NU0@#@I<;MBhmt@-G7c0BPjxpzmaE zYXcA<$gZb_R{;e;IXdY(I60YH8~>Nlf1Ti*Y@PJ2{!d*nS92pLGk`!u?Z3LU|1dt7yzg5Y-Il5`0%#b`v(dNfd4r9fAqET ze`?DNBLSdH9Q3V?|LueKC1ZMCbN~Qt;O=B>Wo%>mPXwQ||9XTo)VFaoHnz02`DX+` zKmce*TW1GD<9|W`1`r5|h_G{r2r{tB$S^W9GO=^Au`n^Qurjc7a{Ox#YUk`=1q|@} zPyGM)2&kR4qv`)20)aPka}hxz#d`@Z-sd*An3W~ja&f5%u2i-e%viYmzZuCe}&;eYS1n+aSX zLq?0k0{`$Bdf@?Zb_fC}aRh$M02jYaU;wxqV&4B&|L>;%L))zHZwPUJ!-V-a6hI9S zAwVJy7!yG3_m_kAujIc*{r{3c0YEhX0K$LF$p0M&sJvhXD7=vGo7z9_qYw57MujRZLPIOeVr?bYTXVH{HJuij*s>Xq<;x|CwHp-aB{GMb% zNA7ZDUNcq<*vh+Z))u}v( zySu$=XH<ggvpAoGMEPCbd_JxZ1u}}H@Yk<~fH0Gu6*}%7{q$)El}P+W zBoPlNWxy}p+r?77|0S)dKIOZYq$>A&LN_e%J9<&x@+Kd~ctegyfMyhI zjMdntpWuCyFnr(L8hIrH3w%rY83)yg1d%b)3RWawt(RQuITI^Kwk%1V03t7lgtJen zOf92=j)>IT9R;7VNNt-&h$hwe{ik-)(!Dw45D;&4$5{3_s0j@J_WT7>IZ*LneV(w} z#PgSk{qK|R+z!1_NARepnL@UV(6Ol{7Ye36QA=3`tyTZ`)mLoICD8|_&}cry?FQ?Y z=8LEFWrTE-oOBGa<{(Rt6o*_?v|_V6pd_gh=4v#I?2M+RS#41bALD*tf$>|6zyszf zFcJ*B-@h5%2A$k`iJHDy_+|Q7YmhfpA5@dG#kzUk-1FQRle9{jVuN#(KwA-)`8P&N zg*APgD%ID2gDCn6nHpo#(v~R05bWO@f#Z2j`x*KW%F$kuX7N&kt_$wgzK1U;~ zVJf~A*aR3W7@oj_bIUQ3dsu44v$eHhKM?Ff5!Un9UsudLV@Wb!UD$7wfTSPCE=s33 zyg;udlStrXNMysMmT1=|-Jy{=>6z+r#@iYM93^Y?nn=m@fjNleJ5R6P_Nsz|yjMIX zaqOG+7aR`w#dFUp%QF>RVp;H;+FhN#j7djr9{9r^TIEjImwN`@Bt}w?6!hujGb{lBS0WJbMV}_ zA0wU(TEz_DlGA=^k~rd_C>zuA$4OYi!P_aRCufs}0FK}bPdGfoce!xoTLQ|h$bTz@ z@P8Fj!N8t1Si2!?8@N*x!7k&tBf29SN^p?LYZ%u|nzNZpFlnCa_B`;j)exoTc2WPHJ!5 zitwI9-ertO)=_p2aHCe;&c*!Plb(7QG_-T@R_LTG&A#*~X`s>5>UgOI05$wgpT_^D zAi94N&Hs^t5Sal0;s2I`5UB(+AW;!>|4BjR_M?VyWvPTc9c%iMn%=wp3Oj^Cb7Y-~ zj*?;fC4f7o_i_*5 z^qMQ2?;&G}djxL933^ECPLWX4}g4!&%Xq zSpKTZOj}byB|E~_dU!Ca24912C$L_wvzgzbv_=cYD=Z4@o-!M+jS$?kx=8e516@bm zHfIj>sOFUC5;aT9VTQ`l2Ek-E7Btrf{qBeu)jDk-blV$Z)1M|Csc$XQmWjG}hbh66 zAk<JoUd zr`ivuw%j%|%yHS`P@3KbTR^j-r`xRg3MQWIsW9DCuM!02!P33-<4>VaO$+qw$0(lH zvtrzIrts%}9HtFJQxx4kD|ht44@O9_|3w62lb!IW(3yr-)2nrLBP$8rR}71aB|1a7 z)OXN*=>hzQF@Vt)-&bCUA@PRMeMT&?9h2!hlt^tSfMr``A$DL7$uZQoueiB5v#*=LHiHT{<+UH)WoNCM~bnJq~x{q^wiV#Un^QK&6bz zi`}|SJ3T;&Pnt1aYOr$}Ah7k@F2fP0moXgSev6A9aOyguJXVP|2(+{_wRogD@W`b; zKJO^z-D;qZxvY`sSD&sd($tMI#Az)ToB9;04U>)sdLof+G2xpCy&%!qasLExN|re$f=V3!jK=%BGVh5H;P+-GS_E)omeV;L^odUrZo zlE(V4G~*wl2HyaS!cmCi<`#wDjea6*KAv++wHtV4a2|-|Q0jraoJO$HM~N^ZEov^0 z+zPe?b$f#j{0P`JhfL36H5~+Pqf(IwO#Jvnlf2&av5jll!T)6X{ei-q=Wt<=-^*_mY6QdQwMz}9kt zP4O?}K4ieGRy~;)7bH@w#5F0u+X>f9VVMODM=eBF_QD^H1!{+1DlGXIL{V{Zt@UE6 z+QpBopx)2j8vHk2JMk3sKkDtEAWnCUJ+Z|aO1YfkSD#2I%pjj%1g5p+eIUv(U%Fa< z&Cvdifg2KH_DgBfz)SpMS5iQ0xYWz0EsHb#>K#&r39GZC=^l{YF)}m2&l3raUT2c1 zPbnO*df$tKonbB#a8-;4q2otBU93}K8~dGV_s2mm6#mHF9USSvrQ?$#%OF#i4w=Rd+A`&niwhtWv7GcK-^PGxtU&YE10h z1qNde>Weo44W!~IO^b`47>C`!@#|BZVR(x~j!Ry~;?vwrcZ9kNq)U`b&waVj z`x)IhfFqUN6J6UY>|rraagW<>5lRtbECmK}b?rqiJm9m<-$~R%2Yu%J7%YFcNsnYW(W4|6LOP-vjHF+b?U883*P40fO5Qn9}qbK|!+(5|Wx*f=q0)5WP zuCO;##*_8Tfu=mFgcyMhp86>+`^p9?V$SEZ2g%7$rbi{1fU?8mm^47#gdZ;3;o;ny zFS6Th__?Ez6V~AiDa5cxkh*;+?@W3Qp_tI`HApjZ-!5@svpT{rK0ybOip}wvlj5+9r>QP{wJsPK_~P6pC~GAzW$% ziTvd**i9478!&Zo=l8z!6vN{xn&4iy3RZ8FcflZzL1*0z+7^N0^_Gbe71#M{M#J?Brm6gJk%@=AUm*qC%OC_A{1{}NO z;pFKN)`^}y%~G9$9dAfG9P_SY#)T0|<9ACCR`&>0FvshS3O>d?>uLYFrk{h)DS>jK zF?2rc{_=P9g%VVIO;#W+s>ex2`OQmmw~FYfb!TMk;s#i&G7O#SA&?!An;sx+zEwY- zk~=T}tCa!#1QJVyn?*5Hb?Q6``N!!wzwiaiv3Ya|)qWs27u)9i5FyikT$F&7wCJCf zvTP(#Q#RtmHo91HJ#`_tTv}VMA4U=lsgsdXF~Ys(ETSD)7Q52;MAGkL9&Be+c4296 zuQarF z(0CQUnz#X*3wCHQrwaD2I$fH1ChiB5AxxQVyk^ISDF3nI_k#UZ{iI0M*O4@YckD%3 zuj2VB47>J7YX=^&$dDzBMZ_Lwd21-s$x~$*s9!FNf9fn~fy0&h}jI zNl}-7KL|gC4e{IgRd=rIm9M^|B@Gpd!l>79?O}tXY?*@gxPC1=%Q&vv<^8Jem8H7# z3L?_j?_s@n0eYYb&+O{{l>A|0qIo7;1aX3XB8$3ng9yU^1b=aoN+|6Mhsj?0!XI`S z9AU(z?wdjYFHnzbp z=Eb{#5_gO49pAj<*rI*shSMt93j`nc>%+7K(eA#+-yT-&(DHg>#M1L)@~uuUT&67! zSmpTPd%Xr?5Sm%-Mdu+BI#mawsz_CR7xECMyKvrD*BP@bn~31bB$-MqwWq|xetaKU z8=;m9j&7Wk;~n2(i@%IST?qwh*mB4hx9oyzxc#Yn4z#QCQ-k zHxRwre4)dq-4-R{>7u zvL)L5j)Z^x7}hNDG>j%Y1KU(2O&{-|GVcj-j`As=4)?>n=JPddEZ^u2v}t1MJ^b11 zm=`SaLRM~D`AM~EPvMivI{Q09sQz14kUSmcPspQtopWebl;581Q&)nBw=^P~!T^VR zT=8xa4+~`jO&asI3vuhr6}F^DTnjV!x^yojnS8NneuDyuIUd~-jFl7xK+$YjxaocA zc2W06F+*oLH#?B7%NPB^m`?E;<6-@)I=LpT5)-rJ)bsq^DMysK`Fseqb)4gjJcFh7 zGMtd#(8%zI4QIwiQ!=x_t>aG)F`b#6)+mLi?d}cXVP2GL?JJ}#|lu%!GeP}Sw=D4Y~dt; z)Ek+cL);yS<0DkVYBGc)X;Dp$A6!c{RVTw-o|<@R#?Q`7XghF0KtCj0b3nJ$!lQ{o zf?BPLfN-{+GVxPi1PCV*icDD6j~O4ue1Wr8k)kzmrk%R5Q%`uZ=wl@kRE!?|006Q* z005EiUu;3_f4~<0m1zGD5-0%bUwfl}B>w?EQC$TyU~%LA3w0=q>?j=yh8_g~EL9<3 zyQ*uxG_GAwO#b4-q@nSmk|)#`$2Q6VJwtN8H75OjakUYF;|ls_J8ZRvh9V_7DcIui zC{vMO#w+^Wp)_wLx5W0PUGywauGHV(04COqxe0>T(KA)Ji^Y>DPC5|Sb1K%yf@Q?H zj970In>t+Ts?XfQlLP@f7X(t{t5BYIMQ*6)T6A+?8RXBi`!|AG1ZXrCMCDCzIdSCG zS||SFk%menmw4HOJ^A%q$?OYF@%MceE%@D*_rOl>5-!2r{bzK3^GT5! zW|jWE6czL-OXHu^l`f(ZtKTi4dX+;y<3ICmcw>h^7K-j6E*zOK4Uh(Kercz?Nie&X z@r<|g_~Zuq-4;gg18}rS62;~bHD_dQUbKJUuvyBXSiK4toC$OnsT|za>MV2MlA4?U zo!~UzNA;Lcq0LG6#;`DD_Q@1i3i!8F$&S$M+A~9RF%Uo0Fs3Vrd^|8$_)!CNv&?#= zorbNRPlknFyDQ=2A#H+VHc0o~3k0 zsp9eoGEQIr`ONtf9vcPW-(ruhB36b-Eo7BcKwM{Y=TGW)^mLX&k``*Z=DP{^YcF87 zDX3A5AT0*05g5VgvQL7=&lUPf&FcuO1?bau4@-9|cFM)iE5dVvQQ4Ewb`DyzaOg8@ z!~KY=IH34fP#~pEhFP#N_>Cd`dfIHcI4g=9> z*mt>SZ9EnS?-1UZbHk9iwMAAx0l}IY?)VV#r_h0x!XxAA9hP}7tY$hxwL>pRC>rLX z=1bmXC9EiIqsslGfVBsOP@o!CUx_OgCwD!Z>>(t4Eqy@JK=mb2vNIi;? z$$Ku57mUCv4l!RD_&DZ;g2t9)YZDvGyI1nsaS$VZOT|*_<}6Uxit&^xj!>~>HYwh% ziAXE>Z>rPMQi|Ym%4mN1UrREKYo!sIP-I#zmF3$|P zs2q;PB~~QrAgLze<&!8S*`DuL!79Z_&Yzl1kzP_FD=aD;Ac8d3Cy4gXF4`LiYB-m$ z%We`-Dt3F#1)=ybHDkTcP(O?k5u}Gm$MOaBWtizSQvz-98$K5>0l25P>!V8V`~3`= zju+W4$}{;Xr9AdJ0$iY4?3-yrUL%lmR`%x&4o;r{gYW$Mu%ZU05^CzP5UW$n zc0qMPS0Zso3fdmJ1GlJ6Kp(rZd{>o>PwEtYm4F1FOhM#M?0j(buOH?G*QW1rfO45x zqVzJ%09oFVB_S*mOo@G_eWD5xt$DE{Q>GxZnKajEV!CgT+g$%1!L6yvNpc9plVYM0#1kmo*OEN*b(oJ1Rb{`|&+M^-joTi7 ztM549xdM}Fkps#wt`Xf*1MYAF0M{an87R0IBQo~x%!j`r6z+8mP-~1LI$+9jzpyq9 zpn7vsvRr^h=$=5TVBC(HSt4p-tXFTNJ9fKKlbo3`K*xgM6dY!yldnf}Hhh6vJ3;sLevmvL6OlVIsbJ(Xx z!N#tADA7z5${|;Bdz^p+kIrXL3iu+6~I z52Ay^rm0qZ*VO-Zsf2M%p`fyIe10)vE}Cb^SH4nK{0Mo#59G!j>0u+M!8Pd1fCFOe zE4uYK)eRrR-#Rd+)Ck3+6J}Ar3I+?-d!#n9kCaj~)}EtN1I$0YT}1nfMfALJ=#EoW zx3?`AWnwTsqS#DCkE&zch5UH_IoN}$uKkp*Pp-2^rq5f7j+wcP%3necA02g}?cr5( z1T!Ea8nr?y{G-B|*8mrU=n-oYosx=)6QT&<0qUu!_iBW&DjbyZt*;1mY5Oy)LAB@d zo}3o`r}=c>ZElF#y$KwuZp$7mg!mc3d^?z)SGbgKhFY0t8O^iL{BCyn?HN;<3QN(U1-yUE;4Th6was`Bgbi z_i?<@V-0ch)qon_xl7PBuDT+2H?WNP8S;4!mvn;mF20_Dqn zP=HR>(#ddix8VUx%Z5w%!eXzIw8oMw(^L&0C1g-*YmVR`MuFlOe7@lMsH7!Csn)m{*Nl<=$D*ZT|RUk4$gl zJO-`NoXNsJYnKUeR2O#ztjSkYcC^iHsWKH)4*4Oad^C;U{bkwHpAxv6f%o%={~GHZ ziYCx4Gkhfv>DtJ>>>F(*BQ9c_(?Eu+(Q)TOIEP?vS=+mgRHE`B5NS6x@z?I*o$@ed zFInby+(nC$bQ^TDlEP#T7_A#jG10J`A_BoaxX4GjJGH~yN|;ZXS#ZIoh!nngT_T)r zT`Y5{T+@5|44)Rb%}!)pHx!-{Tp&_q)&UCJRJ{`8CocQ)ukD<@s>`MA#^~LalOGOc z2+773xRolK3tof*?7;-i%312!^;zvaN07%n_3@Hq! z(Pd#DysB%k%QMV58J_k=qEOR3rHksO(pVHmDQ#^&O|}r&nL1)J^#Aki;y_#h?w~|? zE4VkZAbC~ZvaXn?C6TS&541tDThd)keUq#Ss@&W_>uM zev$y;S9uE!QwZ2mF3V&{>Zm?8y zS9F?-ZU#fTN5yrM*W!S(QoQKxt$GDYxRB1|boRPZfEQ6twrGNxVnn9ocx^G!IZH`h zv-G%2-4gf2Q}rK?EL+=jo9Xx!JLnL9!y}K{Z^cQjh}}tTpcJtAA1t+JHb8ZkcDU+4 z>CF@zSPaH*dqTNS?QPj>r~qGjs;yLo{W6!@wiW|cL$ygCr{oCVR8x5TFnHw8a6Hv( z9k3>i92^XJE)v+0p504ftR0}gmT6+B)>aamM%8#v6e*P2osxPv#Jy$}ApS^wPISCB zlJPuAK4BPZ#xtb!E)^ye0YcKXO?ds}=0;R?LIAgD=+>SyK}WCK7g+bmp6xQjrAk3n z*blwrc;SCWLeZwp zz&?l|E%ZtOho&HbaPS1j=`tejyVNF#QW{{Tbh7DOxUF!SX4}P$;`$x}Of)-Shej?u z0%;w6aK*OvNKD^1AW74?U^Dr663|sBJ$pxniObW`_xV*7V;DbkI?4$a>C^bE zgvP90C{H{XrcFh$?A<4LcnAB<8mVmR)-%^+6;wToBOiTQCM$dt`mmauhd37dR8Y!? zHfBYj@H0jZdRw=^k|s^bTPu;^W&r(hTXU3F_d3lD5~PWZmHl*=Q?McRGOmQww=?EQ zI@epFBIl4(*KLWzMSuMc&d;wWwH8aQ-h=LEsw|3scMv8S@k+xs7_K*7J3SAEM!q8W}j>BI5W z7Psd+BEjI`!MeT^tb5_4QK_G8AK@-=UB?F?#E`6SW=Sjd2f3iuEsSVX!^Bx|juhj& zE!=i{xnaR-Esm-##dr#Q(;|?xyM7v{!}a?0Jy^_)=w*kArKn51O}h%vpr*Tr+h6u% zPCbrDn@|>kQ5ud_1VJ%VtXU|lsOd9oE2znC*s-%~84GzQ3^EUAiS+8Gan9#vRJqya zbY^C*K&y~P#W*|mVFk{%q zjP8;vN5cJiPQHI1%C8$ut`WqxELD~~VVZf;IL0q!OJwVFa^ zrl-1l>TZg*CQAH$KXWNO8VjXCKzdyH*M9iCq*9!Itw1R=v>>fe)3 zkj@!dGj$a9{4yNu^)5m1m!ld3cA0P%$P!s*4va%YZN^J)2)!X34w_qtF(-<&vXj1~ z)~UZkTJfzN^UR!Mg1%<|w7hmQYp`Gj?;ICuAvT;$0L9nyAHKxIh6Gr3WAGX-|0q@n zG-^N>cBG%4dDsxvRjwEjWr@N8x+y{Nw&f!$=SI)dMMsfYzpU~l%h+Dt9DSl3l=K?E z9W~Lz`6D$`Pnd<^2hWj;PF>*Z6IH~BzgE!^oX`22NmSPT+BBZ7<0_MeQa~Ivd^C(JzGQk7w%BnBw*N9{lt6B%hp14Y^BEvGzS5N(x;}~x*L8e%gszTMZ z5CQfj<;zbr8n4j z@Y;y$B5Irme}dFdc~h5WmF{Gn1o;{+-Ijp9!$Z+U4LtirDR_B9K*(3@-oFyv3Y~E( zjCZDapJLnp0JTVxf*FXUZwiF`{}hN7 z!-=5JY;4mjA^~f&iTJ~-(Bnm01~OiQ=6cMg(6bN!iAG>SD$(ifPAuK}Gy@uPbif+C zPase39l!E%gV@`Yc!$TRnCQ2@H*hW;5cWKZb!DI{$_->$Z>LqNQ0Q$m~- z=@CUq!=gU9=Z2gIX>~{}zb*Pk&3ca-)3>_XMlDOMUaZ#4eD9g(Etz+_43?mWcNqE2 zO5^t(x6C8|aIRYc`e(w^g=-+x9LX9(<-W+t&=6L25bl_2DiY0&yxHk4^vYIo$}8Cx z!YBgaYLke+-jnzGXc+8lZky^y6|zEH9YPtyJNvd9=jP8v;nTY&(v*BuM8CgxvRC;5 zUYMB7i?w%ure$|xecwZ-P>tn@ib~nWjf1Vp!gRjg#=U950crg1+%G6LY`c(FB4i&BajNg7}}^$i@nVFM>~Q~L(_3jg(i~W zp=hQAW=L=HiT%oDGKB)t^ytLqRc`*0*ybax=D^`aY?RD$%_nYJ&q-z3I9>=db!n2A zQxB_0IRr*kf?PYJHIM;cUCJM~?*rvpsV`S5R(S&Fa+Z@+TiC}iTOxM10V=elAis<{ zDQv;~Cl<(!5PEJ0cQsx%a;*SQew_~(_(mjX+Z;bfkYShcR_7;y1m7l-dKlXFp*epG z*N@w|g2V`f(+_e!7`H%<7;hY;M0GPfp>M-x53%CyT5sw%|H@1=1_b)k%OfI&E`x&d zWe-74*by>4AAHKAe9LR+JR;PCMn>N`vTB~`w4UChEyyUH%}$f3e(KCQ7_n0zXS3gf zne$M;;cjaT_7{Layeg~v|GY3`b%NAr3fmi0Oq!+r>C3rk_4?6zH^ofZAwvA4C+qDP zY@z=qoAJ@!^H#++vt9e@ch9Zu;%=^``wG?2Z=!9u4ra`;kT4o_Kvt~_d5Y-j6DKTL zvynvXl4w~ph}r7ZMYjO+i;PKnc0k*bp0bk^fSu)vGdBZz!t^TS5{Mr1xQYO7vDUe! zdbTrN?ZI)WqmEkA5JUIany>BYN-uRQ?%kOgEX+EVj13G`ThHVy_qusJj4t8kXHiPXgaElX3}03U%0>n(`#gDOZTH0 z+fQN&Wjefwv&iC*9UGqI#%|l_k0&w>Rmf(IkYi}^+7UsvFx7A6JTt67^+JZ427qt2~0 z9bWh4B9x{XqJ?7JtvqIfVnOPYpFQo#H{L@AS~Dl zI}(*++gQY*VfC<6#DHE^m%wv$NtnP!!E5kCBM6Biv zr+t)8#LyHJtWFgjM>U7(aC>E>G4YUG9;L`-@0Bh~jYCZPsq{3eW&6eDTs-mShcAS1 zEI|f0vGNwP=6m|t%NQ5VQSw57aRhEj2P)@?)NSyKDB}d5#YOzgqA`JI?>kym1Fuap zjtUD+XAuewP=M0#Nm6uaVqfz@0=CMVd0(JP=v2l&%aO784k!Fs_I#J7y*W_UCri;M zr(kSv?uWCw9EK$<=YA7VNCk@sv^VBYQaq_d>gCf2H`T*N%1~sg(Yl6Wm0YZOBWjZ2 zpL}}oe}@J&s+X#bqPI%M?AmP)v3B=;ED0;Jj=-^cr=Z-ipV*>QbR0p3$G@dkDO>2l z*qSEF8K7IA(|MsnFpy%vkHhXn=|{%D*fAY_wO9y+O%vF+&7^Vjp|bi=2(=!JM;zw< zS@awYiq4EBk6@Jp@!Pu6%yEWRQe4?X8JqkUD7bKwk5Z=cBM>_%!T!%K1nT*%$;R1) z*ci-+hTL-BHBUkmhAfW0P?7d;A#{B73xSXqwu+8t`Il~h5{64vbxsu=l-5w{3teMJ z-csAkt{D$~QPwSe4ftm~GcTeV`FfXPRJC#?FAI$CrM0cP2M6zxya4MittZj~0TB_( z3?w8TqoI#E-z$;iXi!^H9s~R-+|9|D7L|Zp7}%ij_a@JkKi_zSzGEt{B$yG*uEu3% z!#P#h980G7^Q4vr>0IkCY06n|5bc)_In*C>x0J#hINYN?E*_2CwVCSQvIf%90*=zX z4rH<`&sCeV5Gh5UE6E($yHog2Ez@lcb9~l}qyaR==*T~++D)NVV0D`%^dVuOmEB?> z&Q?JDC!k8bc@4DcsW`hCkKA_MMB?$q9pL;418C67Ox{$veF}qJ2&t9G41K6JK3;0F z*AC`HgQj-COV(GgT5SY+1Syu9$UR>&N$Peg;-k~Z9y2r7!|!{2GqIq6XZqY%>#q^0 zY418TEN0RELKo}kS%z@uMF=}pYnAmg3Tcu(Usou~?pLj&=vl6-zTxU)nK@6pvG&Es zY~0)`+;f>*CDBo=Y+gH_YvED_w<>!?*rAU#4C&;9qX!_XhBTm7;_3LCq1oaq{Iy`Y{cymO%4O4Sk(soARqc+UFWz156+ zIt%E~aYH1d;FV*$7ib|T2a~Nnyt0rl{shu>EPGQTb_*>n=X-5B?=pBx?> zE-Z*9QQ=Hbbd+BPg;f1O;uQyUB%Y!3U}#GIzFO&cP8RIaC?xTerj~JWLHYYRFz|a2 zIgNtmWimTuvco~!NO`7cU3jvk(gke&d@|a)KBqU})wZpriD4FdlwTiBvu!GTe)>{b zvoigaa6e9N+zr@(KPl z?&7VYRLXVjU5wSF2)I>GBde)4l1AQSx!;4M^~!If?OxwDc2syp=fd1IiEZ^ZiL!va z^J`J2is@%T==k6%;MXw%n>0t(7%_g+Y z>QE6uC0rG@(;z(pVy1XMvP&D?+@pFNnx+; zG7R_#CyRFPu_D9{2sUFZw|>Nx#yYzk_FNP*0`=_yO!qXv)at4M+E>zbF?Piz)AC?o z=V!0fk}-Ai7t%u4A^hQ&pRA%TV~P-ajfxiT$pK3M;jw+=Gjxkd|%K*qqB z7d@bG>Cm!J(NWil+fnI;$fp<_4%WX{L)rx)DndiWSp9+V z31ns2@b)ewp1;K#DHuu9s1zr)g!VKOeS)oiK3Bs~nL$w+Fe*Nv`KcmI`r%+Hb9D;n zBkZ%+x1-cK0u#0^a3G#tEfW5&X02%n=kn7YH354dWyo%R(nj!1f&Vr45h`&{>PjvN zBWMVAD<_EUpu{`?Sxq^hYU91VuU}gUwg0qpaZ&+qxvcZ%Qpl7*#RGIC5GIIe<1UMo z?AoPnoByJ+VsGCsne+<)vsB?MDFJ~qL|fDOyNiRdgZQOj+-|zh@L)PV>t>DwEF>8d z`s8~Co1pbXj*-j~NaEzK_nEW5THhPXxf_|P7fb)iN4JgVdGLM9{(vMMXepu&VL{-4 zCr6O-B)&mo2gm1(q+!Lip_I1bjq*qsa=qI(^I|yiRVEES?QO)@Ai4$tnlCH;e(ujj zZ4$LoF2!5b+`}h+31UvjB=?Uj1|PfJuOP19;|srK{6^S-lr` z)#K8X@;LMfCMQ^oz1mcdRI}5?qkKR1Z%zgzZD9O-Yvu-1-^B2_g>A%wbEW`Q^L0*T2#0;r zZoN77f9D`sQb?{Ha-SQqSJV#Qz2y}0d@Qd3+GpJPwPORvd*4LM!vA{ zTXYJFRtnLVr2=s3CTH&VR!e*WD^>2%c`jYTQP*4^S-T2y(FMB0E(3x6`XyW@Lg`&- z<{>VEtj{;1R;a99GnEIzd`(-}0#Fcg9L~u6xjLYdxST`OQ>G~jlu{ZTtdz^C+2wv0 ziacOMcAwtr$w*OXL!|YVDb%auap}D>1c*19YmCRCUiO@NeVd~_3tD6Ac^9D<*rf=s zjY>6fKdDkVJ_1>%-u1UCDbXghsH^{K5=O6c$6eeVGs+rg3hE2lWDU3Yc)P7 zi7-HnFXs;5B?f@bvG@tuzxv6|x2EHji%`Ej8&D_2I{NK-QaITzz6u=3bV3s9pQZvu z5Uke^Jeg;mnyN;${+yu+KTuk}u_tv$#n<{`mVP?E|!zw6r*`4;8I#rNfDDsbnT6E%-ybgM z{EIzB{twvGzmmfLK?3!+><|F>{g327s1zcrUll5XfxY21(zteWRdcj z(ClIuJFoExP6MxZvH&2>Acyz1(#nw3m2^K9%wrtzBZQJUyZQHi3F59+k z+qP{?&)j(t@8f>&&l9mvWbVwB+ofs9EGe;|DNS zarcQ}jOvN!Tyj-ay5!X~G<@VrKM)1<%UUr|ye+ta5t5(Co)QAFA5lfzoQmu;w(SLIMqn-Bgg2*Q#@O$eBYbLUYe_rp+qK`2)52;NYo$B< z8BYPGi&ao`NB#kthfZ^8;;t5Zs-SAgrCTxAb#S5Wv@D@6x)bStS%Z4K;S^O|=YU%& z*_KO#)xziuXv-uU2{juvNu?Bep`Zk=GXF3bTp#D52Z5=(K0pE4khYEBz9QL{O2Q|{ zbS7qMj+@enmbk;(<{WH|l68H)M6A~|o<>LAMR$r!N^yT0|G0@BVeC7u5*$zH9Q1AL z&pAiHi;rx6v)?|Ylhyx(2J3nGy?*URF5$Tto&ls#+|W*#^*br&G7?Jc8!27}Y>F7kQxlKEu148;p{B|5fPa^6 z3`8red~8}Y8yr8jdQbA#t0%UJZ@;2emV!Wh)aTKXIokLxPxOok)$&t=!)zgn8!b zDlVYXx-EFr5N0uMDTj^MsiB$#K^Dn~PI;KAdyb%EYn0QT@jh99B$&lC>j6Vp#L405&Os| zX%$Ps)$|uw8XFC47pR`=VwYiCulqhmpHXcREB&#AqP}296BBM%hjnS_CC#X(0yKnh z-8u_poXtjyz+fmb_SU|O)T}~3Kb0VmIHKZ&p{`Y&N+c|nE=aLy4Nh#0i_)vmTh-Xq zhyM!W6*N9&7qbss-qmzypr3QIp?(LQd1aV)#Sx@NyO-FyQ9ftHe2EhI)5F7ahhD;Wc)W_b8d%3(!YI} z2tFV4_ijJG+chu)0SlD2%nTs8O zY|lQNRh=a0(HX?2F`3Fvxzi@1(&MLmWE-yC{i>7mUa>4w98mN8QI&_Jm!CZl55w$i zH?ugJRcxJ?9VtjJFSdb9l$~bX53o&a4I$kE=T<5FssAA}nCnEs2>(grq=UxYsKDvs zsPb!%3Fj)W3TDD@?v8a0a^^{fi*DDGqPD}q4iq-WEE-O7{p=cz3PN`?>oB@p2ds^; zstMCOG_Qm^Jcu%3Ozh%NJEDa)P!-Nov{7ffCecvFq}CuF$&w}dim0j)*IW4I#tpr5 z(TX@Td2Gwjq5@sYb^qqesTG&-P3g5YU4E5LA}v>3O0%q71I%2coP`zjJ+vw&ez7^Z zezGq-8?uoV#u|X1SvJdtpc$ktrZ#y-Amjb^STx9esmSp(8o5%2m9ch^s5}I7Pt~G&fCQ{?vBt2 zvjvU(D{|1T3ElDl%4tfB5*g(5<^#%4bIWr3JQ(zy2^*(ELF+yJnc2>WUt{tx&L#xE z!h&r+3bnQW_!i25y>3s;TLHs={1*wL0WC%t{sB%eb@t>{09yAotz&TM_bHj6vgc*l z#8tf43Ys}JIYuEFrnEcN!v*YVLb#}Y=lLO7h7bFldOsen?`yZ6+7#$ucxLMM=DQaz zEmNL{+3mhE$P7)tdHh$ZMLdJFuUR%r4uC-*mdsK@i2Bm0F@)~4W{VJo(M+{JkU8^< zQl>QQ&o6AYGNK9^%G(CP=aMX+QdY^7?%`tE8Ch`2nGp*q@ZlG3nA(~A@@W!A2mI&} zu@{}I-+PeA536B(=+B&XmhxsmJ3NqLQGFWzbxuWba6~_y`R?FAMotFwmgfFk{cbY* z0Y{OxDM3Q%oTlpTN?VG3wwJ$V%}k$&wgg1z5TFj&^#O4O6_z1!68EF04TLp9{q!H? zhH>2RV93q3vgYI&)rzC6mbHiq+6)wFO$KU8i#NMPdu0Q7Ef_fS%*9_wAB)Vxx$=>4 zF04Tq!?1UW#Uu=}{U!c=9eV?+5t)u|!Qx682eB^q7@#CreeOshJCtCU1Jw#O$@n>) z0?V5YaITt@l$JMU0F%~sN(PX}iyI=pUG&n%@F_JYhgf`M(Ok9eB<(tN^zlY6^61>+ zJ$5SuY}Kd`OIMNd$JkGNxQ>y&Z$bB75)6P?weUerI`M4p)?fN_sn|ouh=q$cS;8gH zNGf}mzuAu0^csBjW6KNfLGx7=kD6hK8Y-~L2KjQh#f{;cU(Q`$CSg>_FN#V~&xks$ z#{8mO=$djtvl{POn9{Waw&Q4=0W1`u^2(723M7fEr4G3wM3(C zxbe6iH6-By0}>AzGT-#!vRk|_`Xo(^`|K!qS)7R6B%uZwiP)EvN5e>A?IUG0Ecb2f z-MagU?V4SP9o{`pX6}o4nVC>$3pH^7g9UlJ@E~@9%(Vuq9Fx3w0$tqAQ;6}A(H**= z^EAD8bZtmLW5!{y9Qqofpzv+v!BPfggv2ZCt$6RZ6}b~2S5)@_1%Kjo;>!`WZFXRm z&)Ry>{FgAY?%mGTL2^;g$qbm0Xfk~M7@I)DGYCNV?j1yNt-X&SJvzJm9xe)j(QFfr z4_aUBPsjH1P#SWVWUgF|%VTU`0qe@DDsqOR-4C+GWAe;ewwPfE`9nqqBy|hs zHI+vlxUJPN3yM9Wv=HR3Zk}I$L`8iE3r48H8F)wgbG-#>kN_cACdZi@q@~=8#)ztu z@I9TP?@{IX>dF;q@}ep!_gP5WIzrE+Lf3R93_>X=A-bm!qAz$noVmjr9YR5DBHEg>V>#;$Gt z5P@0Sp`#&%*w0bTLo>q>&hF~mN}|Pkd(geEz@!=50M1eg@C(JeX!yK)+(Me86v>aJ zD{_K^@iR0q`(jq$qVYS@O$Iq#zc`Kl;cML%fel|cVZr`bOuB~U>~YC4c+p*?XnoVoVs{XHXBzpxYnlPB;ig>q$0uYC---vloDi)OGRn6Then7V zC)S~|7{Ra4c9}LUxqLqMHOyez8?n^f?m!zXmU(4#2o(b?PTzXps0bH#`TNXERUClo zl4`T`9zK#@O4m=wPWW*yJTM3{)w(1Ve*KPKKM-U?Supb;$lK&FO=4xt0L*8lfa$?9 znJm0d0bjb1E!VVNO!n(0^?NHm-~5n{5%?lZxyhh*jNYeczJ(q`O)HG62jG6oGUyK! z65oGKjv}{RT5WF9*CwF-c(%R)&whm(g)X#dYX_j0wMRadUpCyoxDJ%aN9=4MxoC^#F_J9duO*Lro!Y#X%>COfJbehAFy@oESEO|izn#L z480JgM0!}=rEoRNBK7%g#8;%U2b%stV8}W)rj_Y@@WNBx4G^E#6PFQwpfH7Ow z`yZP@`N{d5pSGFLOyz(~A&qedgVEueF91DLgjf9iG4Pgi1(mOMAffaGichMNo?X=~ z2Z20y@jkbiDZ=s{2)q~$La6mm)U!h&VT-@dKnxZ#**m0m`l-k%6pdt#uSI9$SYL7^ z1^#RGxSTKBifOkCW6&8FK>~z@>ul`;vtt}@#b#2`N5uJ@a}Jd{0B#u0pYtZ}w$dT! zHp`Ad%NgCRQK_dCa&B02+fpy>n`BA`)vndKx|&kkRJR&E<%Yco`T+IPIt&ydO+2ym z53K^ivLcuu&#=gk6fB zLJxpw*x#TQ?Abm{OHR-auySc+SDzO655_Mv&E<3BK$!4tJ%bkDevJ2+VJep8-LTJfC-y6S)^ z6iO;@)P-xR>>}Y%hioF?HaL`s`_JOW=UDid!tHV;9JRQc3v5hffGd-@MKQ%Gf)c5u z(DEmAlRn-mOO^3x2=nAyqy8#|2Os;V<_8zMJUsQi1)|@sr1)4P)=wH%TgyOI)w8~i zn`n)&ZG58PsFD8S%!P8kb|I>I8GFu8R3wb%QXl(RIN6JV5xgR+k?2Qe2&Jb?v&gKm zYD*c2=b10MA&7a(+=4SlCaD3)+;tyaXK!urvxJ8F zUSHsv5<@nwq46()m^0dHt0s@d+Ie;n8^;igozr1$0^vmuhqn*mhT%P&i8qk3QR$nmUD!GrqKkz zd{sCd%O5<$fvCY+%J~yxAHMjc05|paowF*d(;cZ1{j3UHE^cD4KKVu`a8aQP?ZgHY zFe5rtf+W7Ty>L^^(!I;_b`uME8x#d=t{K;CXUX|83RpP|IP^C1NA6V{vZ=|%y+F)# zzUFCQoS#0|Q0>`lD>^9|OtWoFtPiY}HSFmwru*tl+` zZf>RbdN=T{=AFWJHYV>;`DfhyANgVyH``nh{6fGtMYK8f{q;wBP6Ov#U`$L$D;e-< z7(S}=?OC(9U2-jP^a$oaW#)xIvVm)6l442w#TdTF;JGt8JkNGIH0dnV~21pu>)> zc5%=pAFr28BQHYp5f2F7{d}GQt?kXf(8?w?xe=?&`oio6f-OhK<34>$#vc3L6nh~L z;Mv0t5Z9ZpbL{57xTL?b8M|yB5$yVFK8W22Y9eJsN8b^6J){!m|4xLVG>3$gBuA!i|vjI}*l=VfrVZ7hL)* zp4H;+4AEYupUD~>_74RnI=bQH*y$;X{%sQ3^%6bmw@53%2nTL~+UsUOin-ICJ$S=a z$NmaTb;Yi;IavZDj&?xEaw`ccK^js+U$Q!hkl9|^T*e}HUZDBys+V|~G4&Bv6&@Or zGH3U&)7G0os`%ZXAdB^~=)Vc%6xo^*xQp1zL?k*+|1K;cY=Sp#RZs58A3mt0?Q|wM zx5{N=zJb9Q>p<=b#DoEF;$@+-F8*3stODs9HGycoY?G3pp4MDN&1%3%#oU9CB?d(< zE;9sb=UzU)wFvw*E<91pUz_Z7jBp`;m{mQa?1&gPaDI_sH^I^K|7lxXjJ}!8W21$c zK$B5T1HZyXChq^C$9C@Tobb;-ncrn-TYFWoYeJU_XCHUEMGgy_#D*Bsb^64OI>lTvBq)z z)gK2$vZDT1SWYcGrfZuZJE%a)k6Q(f@&3iKI0uy9D%AG~>UFm+<>U4`_>$OKnU#>hi3lc#Z|1^)#(w%6bE`uh-0BU5lLst&01dGl7F}rY;dC)Z zV`qa2U&S8$)g$$`y#V8JsK~dYpVB4(s9U!KVVCD!VL9(=mVQMIX2>s8dDhtZpiwia zoOrwbC_Z6A%74g%N1yE24^v$fxd_MVd@%nZ5P^Q2d}dYt zu&D^8Cok3KGg@ZV!(_?_9&08d0WEpR>Lg=Nz=qmhUwoKhD}vtG;%CCWx7R@3_Z&8xi-b{nl>ihpFGzn4F2Ch$N^rK$q-rNU)Eb zNPCmV12-Fk?RUg`y<6|%>aGllJRrPsUZ1QuVa&TTA`OaLNyLYQQlF?>46_d!fcoDb znnc+Vw{Ho?N{e&Qt47$ zm1;~QDABmb#ZiY;tGRf1zx*C%e9`D{LOd*ee+^LC9_M@)V$BC0s8hsW$9!wv{K)Ckw_zaG}LdQv2?WTkJfVBxm8%(Gbpqfkf8-qd;ja3JyeRY7chqGD}f z*Qi#}65tzdB3xY@4*>8uyDz0ta; zxv(EZ5@grin zvf{kzpNiuLV(R<9X&@1!ujTZrj<5l(JNS_p~Ka}@d7_l%Y_9AnV;H&#jyxOa34;JKB{ru!4_>$J`>grB$>i1NC3aLu;64 zM@-`I+z{1?3R5_Wq^Uj~mNkd80XmJVIv`<;;*F2fnoI!8cglJP`S)unnG-b8;>EESj{ zq-!?R9lUV2ZgXa4iy&}%fL@+ieB7r?GC9%$A=!Gzd1{QF*5%U9);>MmW+%Lnka6_J zpDBgMqbB-F++3{$d_3F)=<<80VZNy^E?`qkb0aPHi2uiM_U4Ae#0$=blkk01p22fC zdlcJ^ZiVF-vXbX}G3>@Hs;MVXtf{|z=TR{Su1dqV=R~*o6VCaT7fcEDUT05U+#*71+yYL zdA<|;K&$g?A~c5VuA$BVv=1OtxjTD20{6~B`Ui%~OZP{arV0Dyh^k0PA^FN*L# zCujfV1QGyV901_re`!T{KEX^J-v4MtU|`x8wOAYCM;bXiL3l2H_x}-#Q19~C979P{ zq<6{N#7(6mZ$9^N#794_QF=i<&I9WcMxyUQg?9{!(qc8Ee)B|gvEy)Oxpee7j+(;uo3HtAqLI`yc}wB`QZ0srMQEhx|sf!N$bO-%8u9R#vU0cqSc31BY8O)IaXAl7G6>!e2Z)lpx%$Yu^z>50 z!;0!#YqjEyK3NBp5TYSrZ(hsDF@UHgY)blC8n5r#Ot{!-gJ&d)&`!mX(uT!JvaVQW zWhiR(9gQ-$M_ix4X?#UJnI_>53Yqm*Mcu4*wJ2~J(VPTQb1_01+_+6w4>qo&-zkBF-$?ZhnZT?+_v z4SSdJ0?PDyGD5PdZi_}t5gXIH6jVgsIMMCcOAzQplWK$al98?nj%}btsU)M;bjz<( zC?x?{kRi=Qlv+bi70kFvn+|tdc+~oJE*~N39m4uMShnArA9_gaJfro_<}=rRv@<`+ zbP2MWVP?1Af29Bv_FI**&_8+%-du5$TmS=+C;K-qyY!fO?{H5I&XVDTfkFaM_ zm!sgAa^7Xs0nrH3FX|Oyw$>bo45DjB5MM;sg&EED6gJ?I`K4YSBwDpSkL^P^bJ*$% zfajrbPgyI0(hJOt#1Osg zWe`t}aQ@~DU`WTkf%i@sH$?tjqifv%*j(uVg5s9SR%;V(Z3#2VqsGOJEaTtgHy6=G zBf^v!_!hgCJHTWM-|cJ=WYm=HTh-&01U)Re(*LnUPvgM}n}0Qn5*VZ&wq*Zen#;uK z#_z%rHC0ld6s^s(0iEw%DjsUm3*l93@tKCdg z%;qtq_T_GzYH>Qh9j{l{zgdfe58msk^^B8*)iD9BAc=U?NI?qKL+OKU$~{kGhI{Kv zG0DyBl#7vwE|=VsV;ME^msuXp1eI?ISgm}vs?3>XTC`4Lc8FrTBXQEkuM+8!SEkq<$A#BafMhH_ zi>-x9=G_vVfKYOP*sKVX-cXYtx$?sbFW`n)iGYw!BIa&hKl*NnNj(vImuSsQlChNE zidc@_R)8~-zsL8E3K`R<^X({zUu57zi9nS&nL+1^E3O>hY zwXrpDx2D?6iIt0$F`|#^^6}K0(mCg>73X*9vF&~J%})jelP2-I&`J$G+yomgyoKyDu~RYLSlgJS0-fB|**)|LjTolhg8~V# zt!%*Ka){1cSozS;t!#@yW3Tw#k^XN@ssd~eMn?JI(RUevw zCt6(+7z|yy+p-QtEfbgCmKp?Vix0o|IkwN7l7isAlDBY}Nmgy3;g4m~8L%Ge!`Yu$ zluluB(~#M8SR6({76XJOEI<9B`m)5}H%*r8djU&$I#S(X$zc&uagNdZl8&=gnE=7J z!Zmsa?qD*0ZPple^yHV*O6#75OgKTU*pT2pia-IRLs*5Tg~Pvee@5yRBtV&fR-Xg? zHp+%+uE^HC6VP&`8*z-ymIhsTvAVuPhw|+lc9rWf+aw;EuVXrqAj=BOiTkZ0O*GNF z`nc>uKzW!+oCW*C5H1@S_eA-ZD)ybk`Nw9uA0Js}&q!RA{peXUdG zlL*)awFHS*eyG-NKIsh)`-}9hehb&b{ah$mY1SdZlF?Qyk8Wjrf{4nRC8e9Ci9ny2MlO!Rmjx zc|s=%5T2l}K!~tqoEQPP4+_X?_M9o*Q|ksYpwqFCU%3i;l<3}*ero7FXpM*SxkkJ} zS&Y{lv3ro`N-;qulIPd<<++H~ig5Bm8 zysU;3jZ98fFt{rr**^tV?_WCp#r#6s^h)4j5g_*VKfjMAm^hNLqP82a7%XRCNt3h0 zvx2PaqR^rshjLvAP!t8Vghd@JC0n^aV*w09GJX2wwrj~XY4dXrcj)6)gnE)2Vp;j< zam0Eq>m{=wcPS|_O{TG)pSNJ`v1n3u9CkP_jSLF9{1n%c-O5Bb-rpcziVb!o@yru0 zE*iKx{7c!y`?XL#rAKdm{=Q~gAldja&3~0vlco2hfH1of(13or7|UK=lycK(fIP(} zZW%@gt3nioHct)`-^q;rT_?qy)r55Q=;9rkg!%1VjqKaP!<))PWmL0D(b5JiDg-i)*;<SC@Zp6v48%6sWl{$gGltMYTMgeAL2Jpr)_bk5TLwKH(G@gmc$XY#g$c#TSmi_XBq{`E5(RNL6aw8+ z9IGG|#%JB`JA}VF_2~7*)d0mIMi1=*bQ>@f!>FKuk|&nr7l3kSJb_9`aMs;t@cj&X z3g}5mO9{$^04H~N*L}Obamm!G6_MI?i;mrvvIxU}?EfmX;+Sxo;lLMDK52gjsckDX z#~IXYGsZRRpLt0!R3dMPP5EM35?+0IKIWzOIqi%gf(;0W?Lmk($a`(N)oL(Pq7uox z!^{0W8e}{Z;K6q$g!l84gBjq-2FWCWntp7p7WE2`trE?30!%M;`mnyYY_G^&V9Xb4 zY`^WjAn}xLA7lY};oSqz;We+9FnMel9N^Z&Xr~(H0ZonXoqt*H78~|1RD4;8pkkY< zr`yDa^|7_>jFl7_-ha$jrOKIxvrF<>qmEnXr^^vb)YPYH`B>; zc>c3Ol>%yx%9uEo2`~o!)!16~UWmiU>?Tl;$q%8nXP5;9M^1U%+e-J9;1ZAVeE-L! z)7#Xg>tBs1nO4SK+>X6Xg~ST|9Sz>c*bwa8Sc0FJ zncvU5NEIMC9TW)Nd;?O@8@|Xst@Uj>AG|0yi?Zv#6i+z(HG}yuF&zYDi+@F1pJs2u z&mh34<8@V0{br_9s@(MuBe5ZOrFNxt6a-GC7S)Cv4+Y#eE$cCQQf`Jh0Ow6py1h@3 z0Ro9X^&_ihs9wu?nc+S5D9oa$ZprwyBMG7>a3EI3M(eZNQPf z-QNn?aEb+~oRj>?^F|mq=}_XUUnkFfRyEe*4$Z}^wQFhIqK7Vjrxo4~J>c%D?1SpP zj{Zv4T?&Mu_8%~3y72LGS|6tB#vtvQ)R{q23BbiTJIV`w&VNVa!L(fbfpRmfae%8M z6(}gV>AgjAN3X{QAiLo40y@#hf(m>%_U_3wo5^D8sGj+?QI`YF90w<|szQMnT{;Cu3nG$0B{ z{wC{Tr!}v12_qgd+`~{)NllA(0fWs|q=G3yT-5?CxVc#Yj_sfct!EoUPNr#_mVe6Z z3h0~$kC$33oWsF&Ac~Z+K}GMq7j&TzcLkE(LA^m-r6kC=(l>f!9`$=$ z6pV5dMS^HXzD2wy+`myRc%}d7?SDD(|FTYIQ1Mt2zzhj9pgp=S9OVt}V^MbQD*{yXl|uy|V!UIA zyth}pNSi<1@Q1+0Qhr3e0i8`Y`Cq&!;3St`iXH`5BOHw&6ojdAFOA{1r5@Cp6QG)Z zAn&rImm#2dfmsZLHS&n}yoJe37rHJ-i|r?%SZt)6(Gt}C0Kg}9j+aOHx4 z0FCPR3^n>5#GLE)Xz*%zPJEIQImWk(1fdf^d{&0Aln*U>bOLaf2l83J3Rr8>L~cnJ zubqPH9L;-=KY6WBZIwrXVYeBMI{?ST?XC5YG4wSYNKwqCs-dbr<*{|@Y=U*LP-r7J zCm){>3RkHF1=ApwG4l20L>Lk{dmmOkWz$Xi(mbVzL{bOQ&fsM&{ALug}(UG5Az^$Ij>&8_1_#goG zCuYXF)#;z>ot>S2`$XQFnnO2_jDxojD4szs+g4-I*D29>_ZFk*UuPa5s={bQX(FVV za@m!-jresEuaYe-2k4hxL{}zWUCY-T`hZPI&$u?{QA5FkO$tdElE;L|aGHOE1h}-Y z{p8{ruN~SZHHPO`M<-u-uXhQV_FG_8&$Bni6x{64dS(y;c*cPN*M%p9^)Bx`1mn2P zGP+)=OJ)fO&oDeAKEcRftz}0Be5+oF;~I#^L>yP+@XSHKtIB4!WSFS zg;UT9on(Y+S|oHA5ZbiH8)mzc0zS|7LGgE2Anh6A7K?s78HF`@16j5Ra*__Og>Quh z{rgz^98f~Ys0wE|`Q%~A7KUSfklq*b+I{NBHB!jv*5~}bZ69h&1WoSsMStS48l_$8vJnq-oiMhG zuUlxd2-zK$kE=%e&$;Ee8d$n=qwtiU|8s!2lo+CmI7lV@K73U|<1~D)2_Mb{mrLkN zt>?aSCV2(4CVCn{R|Sk!eB6{w>u7vIe+D3nHM@@0;Hs+OkN98QFsOc6+hjwLC=rV2o~ke2)f1ZeC+8biJ8@&jH^QS z`A{!S?w6Wzasn0!peivs-HZr0zIM8Trr^F#4AdX8FswP2lqk}yvHCSqw{TfTU;FEL zH=G%z^z8vfAnwpJQ)stZ>#0TQRYQsQHlvgmB_ECl`8b7}#)b2^C70EhVt+0(t55{t zJ-k6RXkbtehtOc8qM;%=g%q(XM|^&{168Mh;gE9U-7E|Ns_L2K<^yHChXWg4`E}`R zHLFUIcRKhf&8wNvC$VT@#d*OgR{7!wVZ^lraXa;~N67V2#r0x?;!rB=YjkxU9|CoHlW`rw%>~bwX8d(7Bry zivLB=$t_uTeI}>sXotm0GwQXPhwVpOt7{!;l|bIh^>4Ov00YmF)OU1C`1rAB@rQ<- zzg!4*o6!lV9eZr-ZIMQ4u=}a6?xN2*uI+C~(~#=Qh*R`IzN3KJ&(l?w%0G~CVTq8A z;!q@fCYRhjbI7P~N1;#=VG#?!e9`{qt77H}0B&t*jBi}+1%b1Bt4hur|+knAr#>5Zf04?ow@V?ZXa5U)SDy;dQeHE7s6pZS>c4x z7atK_ke(-fzEHA%Fu0xQtK$l$6;^pzsvt30G`}*mQNy*C{J`FQ%}7(^o)(epkG=WrN0Wr_|?r=TRkhB zm?F!ccMgB-bK#6-LZ&c`@l(gk;T*`X36xAWaS}*FRAlgg@S=k^*yE8Xgi`pqO=jrT zuU@QBVjfkbo}VN+0!_ic<3Xv*%19jud$q(IB$9Va!IS56$_d|K75H@D7yBOIZ&{kH zhX|TlYW=`zOJv}(+}lKY62B%C3r{bFSg7<^qxGWxSmYUTl0xm}87ARy8~3Ku5A#Ff zDa?+;6!kdRh*6B){br#`Z<-E+t=pkn70xRnKrH$qGuZqzLaN!JsC&E&0smzIR;SHn ztM&rG-p^<-lUGq|4Y@Fnx{ulZx3if*RjY2AvGTz$paKi+@h!I5oFCk4)am7XS`f5d zxT5tvZQ?gYQnj?4U*<>~CzXy<;mk{nP7ox=^3ReggOK{LiGzN4^-AOS)bDELQQ+gg z&bBXhy58)2LV<@mC>IEO%R?eN>h9H??RMZuhweagPY5~Dawp@E^xfPW@rMGBoK1!> zVYuAf7s%ewTCmhrnfnvs7~uQ6qOo~B%-qX2O_5(9lk#pT$(Yx5IWKHPIg(^KWqg(@ zZ5b4E*eo?DM3iB!%Al7!Df%Qp(I9YZ2HBWpuX4lb2o9KYH*=^(txjaKi*jm#1G2cnxpXI(g37;O6Y%e6JU%0%TyD09J_ zqO*)>QjuU2f9f&ttCc4fBFc`dBHP#t!-FXDRt3IzIeo2x4~br`8Wz;xbqO^7130ON z*Jm@;Ab@Pov%bRk6PBGqT)tfI@A3nr8^;{Wp)Z3&LFd~nd+`Mt85ZhZk9Z!9fB<@9 zl3%o6m~6ZuN7hhkx+$AJ@VPAWyeW33i_i$TNC-(ttVRJ9J;>>LC13FhM6!s6B2rsl z#k{!kbpL{!V_UcPxRJT#k2hJvIxmOL-A>LzJ=J}6J&>Neo$|ehW^KJfZrRol6>Et+ zn()EQq|v>AIQhDdkc1V$_nPFVo0(5^&2=H#gsX#Zw}HT^HaR5^cNx$oCw@=-@SSuN zp=>uFdk;cgpggjHFW5rmiwCGq`Y(qq2 zS$!&&9I6V51GJn$Zm}bVO?naCu&wCgc(qs*V-jh*<_|}1R~EbUf!bk^rBCAGeBusf zDJdm5w;&}LnMDWkdw%=DvX{bdY@)lTw|seutT`izvLnvYjDTc%a3dO{T1A0j3qk7@ zt4ZJt)WMy`8AB0e>3T-LUQAg*xmF*~+`xB)wCtu*!}pyV=Au zn@BdW>{(W_@Aqk@uTFz?g``MHU0o7@1Axk!3&Iq0YURPhn)pQumE=FHIbdRYyf5;> zOjhOjrd0CmF^g9to!?TVU%);lI-qsM-P0VvCNl`Zn>6inq**~(HHop<#8;!$Axu z&p#10-k_=B#$AMHe@LL|2audcu1Z@~`OsJuk!=j;dq3*)QbHZ72rVtJw1#*868}#>~C{tK23e9oC}~2B0d6 zYg46iJ*Y1q-V4`wgMC%Kzo3_f6d4<{vU-yN+R~Gh9${9qVq|iP3$Y1llBQ2rTmHT3 zk`3mGIw9IpQdbCs7+nsoga8&aUu~bQ8#S9A@e*WyA$c?-To}J3v+UEMqIBFt)!PxM zg27zGJ}lGpI*nz)To3{qd>H~f`$Oh`pH_}$TpVwOwnQ%RmFcxB$7{ADw-ucMrcN4- zn67(J*;=`q%)^&R_u^ze$@b>Ij8(_F z_zLf~Vg)G0Y9WK7QkSDma>D3{vI($Qnm5pu$uL2IBr&)4QQ(~c%_aAS;WX9`<GH`xk)g)3? z>cVt&g0bU@J=By@JY=X}i?Zqg#F^Vu?#b7q-*HW1=MS~R*~ zt59KDTol`;+f@-&%tve!k|Hx^$yA}(@mOLxsG=vr2C~*OG*47;DFnmo*G2qt(iQ%s=r?wS z+n8Bvwue334e#m2VlujHRKczH-%Jw1qnkELxkHpP2jcy~_$p^~1(mJRXkwH)A zzNwzcF$5x)5%4a&I639`09uh&V{u@?G{NPt!TGO~`2?MeiAZcLm{>NCjs&P27bkc2 zHJ%PM&&zz&W|#>U3GW8da|yczMvMK2kvP|#jm9JQ@N_dtWRkRY`sg0J5Y z?E>W-BJ4>Qv#pIr)Aq8^J$Zitv-SJ@G)nnx4rI{*X@SYHYC;-7G`|WzND<&J)V=9W zydvzB6(Nfe><|b^VW_$mNpEGN|EqII#pKw4hWjy!B*tQN~GCK~j`vuo=Yv~eMqoFOt>Gr-9-0oaj9lnL0dfx@?}!SJwhIDH-d zeo;@p9vGkGIy|PiM~=7Di)`+Kn4Lj1=y-PXyE8R;m7(JT6(nv|Qk|}}nHF(63acT9 zGq3;xLDzR}PmbtxY2e~@kVU|NAyCXQsC4CS?wW6T@vhqQgZ9xV)|dy#^|3_2qtnsb z3_9sRh?KgkWf3V>&`0C;vroe0xaTz_kJ4VW)@TKK(jbp9nTgkM;Bau=S2XnnlaD=vTIF z+qP}n>ay8Y)n(hZZQHi(sxI4necrw|?)kBQkBFHwSI$@~)|i=NOpi>wHD>o7;lMxC z$8j3>(C8tHP*Zy(I$$&~V7ZANnY;?RKmmj1g$y znG61P#(_9pBUWbHc7`*!)IMynB{A?KDN~vCAJM%$H(Gp&^D`uemEMu9Efsu8lwK^>Kvq=BX&g3bo{9oUJIx1qQ|Eod z!<9hf-uF>KqBUq4!5w8gLlIs1iILy&^a?876NU{S_FpZIPp-&7>qj4nGrd&ON zG1$`*n$`6&vwoNXd)(j~BpaIX2Y&f@a2vwqy%7T=@B;wQnf`w|83^OQ(#a$n03h1` zLH-Y&OfoN&K`QtE=wzlGEd9H8bV&oYJ# z77>U!n=Jijn$apY3r3hl2Dyn*1_q;XpOR``YFlMR(}gCqqLS}3fTvT2b)vqErU9hr zvuo1+NRgZr|7_2_lQM&Ys|1)Z{@W~2{KTo~CDsH*QES8EGgRUs(S%uko zKpt%;9|t^Fr;XC;QO4Rp`~v%PDKM)Z)=J(YZ(DdD;#SPO(TlgPj+;lrMN39~W&rEv zjA^NwD}zvL%4Ys1MO?wdHMqYt)AT02d&uJEfNvJW&}g)~)ryXODe}%a6rLds&*15Y zeFyk}$*`0y&V?_n!2k2`m@SlV7AZ9+g<;1TQi@L~@K`1zq`ms(xo-e6Vy&r z$XQi{au5WlYt8?aU7!}T8$0fGp_8YCizWwo<2~jk&)Vvla46ai8qzY3gU`@gf`Pb? zr@SX8nmCd52BoUrfV4wHm+Zhgc=in8q{$meA;K%haVZc*o^{%^dt(BPS~)gG2=^la zA4nV@Ek~+Ie)s)e^pf%{=nL6iuM6k))E6^r#eqcM0#!D1rB?}P3GL{t^W6t7LAHc5 z?XpE&UtlV61?g?Fl0yo64VtucyGE-o(VIeC)jfB}zOY~VO7*NUjxQ9EPMpx-Yc0 z{KC&IKVMy!I4ep!=GxAHmPJr*m$!iJ4$2Gk-*lBhc3MC{0iKqDcXzB%b2=x-MTot< zq?Jf%P(}g+i4Xz?AOw9 zIJJ^|;JRO7p}QvTXApaCe6SaHAIC%UKV{8dnS9s;9x7uk{*z_crCw3N`qyWZ+teg$rJpc6vHLpXDxplRTs*1#v}^ zfM*jAFUp=3Vmeb8tmX}%kchur0n1$!pAH{+x(lhL#s&koGkE^Nx5s`~rbVvKFF$-T zo^o7B)K2UqAb+jd5oUc{y?jJyZ6O^k7RHJ6(P1)AP2)6Bk%4r`)>Ob)BfXP&^6;}A zW>#@fHC;eBUXaFquACwGUiZ!}F|>A+^CYw=1s{7G+@d=bBr~(mDMpjPcm_q<&3n%9s1= z0twlR-q-Q;(<&tMGLW6^qs!)uL1E?od~JFx`yjBq_WcOLvaeh{ZBM}rp&XRSI-34L zJCWp6ev{RHU#sbggVW1=R zG}IyYy?EZ27jud~{7%5TMxu3N&W&-<^tx?bn-1%1-x{{;3p)v3V%KWyDgr1=ub}nn4sUkU)=A90CEoZm zx4~Sh`%gy?iiV|9*h-R;a5GFCH70m+TyO4J7#p?b?TXtG_wU`P03kImpiWF#s!}LI z=c#dJO8#jlWD1U~vo;(cqRtup(tWJA*ydzms46A8$A4}a!9VG&2$PmRLqT+Q2nRl;lkLZOvQ280IAD)pEQ9K_O#$IIvwLsN(uHSCt4 z5_sGnIN8hHjL87)6D@il-pn&vkGD|oVPAOWfg!-6lBK6mEBlO;L6I#p5Rfd(WaYfu zwkfjn?>A@v)oGr40;i_o50EW@9v;9vLA{D0&|dfL8-+1Hu-h4p=9R~fU^+Xu_Xa(L z-oMIt>5J=r5)(0;Y97QIdp;xk>GC)1TK9C@x#4hBah~w8M_S23SR!em2};%rvQxD~ zf=rNwLcgMMt(FE^7uZ#|rvef4wlB>(? z`#hlLKOZGsJ%;nO@vS6*;@8-(L0AN_RAG7+f$arS=RF3-SFQQ43VTg8WGL>5FyPQP z3ff4S%BVBz&eu2ve6Ry}(|s{7Tt3Rq-q^)j@HrSFS*a-dYUzswf&bJO926@M#rLAR z`Kae$=}YRGx@CS(;7#oCY)2kBt|BJ=f%iy`RuRGK}q z&i@stwcJMK*Kw?dtCprM*Z9xfes&WoFt?>9nz0q6L&h932>dlKR%=Yh`lQx_A5*~FHz*=+*W@~q z3iXhWu8&I>mkB1b4oVP$Mv~n5a(l|%-EUJfxbaUOz~M}pv6}IYSR?yP&=4uu4e+N!fQC%mD*IQEx%e8?6%h7 zls}`OTG)q;(zSaVqwB4b&ccSF$j{h(Oi@JPvoP=tbfWz@jY_8%ukn2(K+0*7`l&c8jSjhbTrLv;JJrF7pJ(E+n(1ia`$qB%c}bJW5jNXtZZ5!ITyT4 zOI&Gy=^`Z)fK4>4S&G9{Zhq#=b{bV1h_d;{3Hr=`bGo^XgusJk%D32S3e%sO;W>ij zWHB5mX`27IyoPY+BrZaa)uw}#i^CrF+4Y1UTq=`B07cjQez(P3u#1BB}Z*_wzEl7o_mh?Up zEs1`Av&{<9;Ag%V_U5B~=GEOXc%!`S?5hsx| zMPUf<;X%^7l^scTY!;~=t$;faG@8JMXk1wI6j&?qh4bG<^JE|h9mUcW>zM;31~3J_ z4ln)%11^$qiHyk8-Weo?YrX^V$Pf#r-6qX$yuOWxf6FjNTGa!4%&2Bt6PiUlTt}TZ4>;8p! zSUPP&?3yE#tv zJI2z`i=vw?tw0ZjU<;0-*Xp+qlfSegZ3gvqjbF;j6BIu2;0ea#g}+H}7T^zQr2?dX zPXLfi6G(?w8DGe6Nm@#lmKqfIyweJ`e80>p6?$!`+z6@IwipcVQI<~cT7^mz4@7UL zdpt;A(uPiU0l2p52vo}PQ(0PiXbKAN2JT!VtVPp)9l6UKEy&+}yyY%h&e}r{545?q z2;50!wqtfds#NkyNRUtApcv}%&V~QHO>dmXinT8+IE>LmVcPM{fkQ-ELm<}F03AF5 z`NG)~lnm(pO>g0RnG|f{`);cHrYJRaE@YIiQqzZK4gnX+`c5=El4);i91VoZEn}oH zH1~hT0$thLT5doLL5}Y0wFL6@UtsACbWc~4Pe)KZ9i><|Xi>A%`i|GL^gcKfnT$7J z{gc4(6lYjY_a=RHZWpsjgdo4z2){s!{G66+P?R9>Iwc(|Bq0T7463k6GuIBbhvN_S zIeO7O>Jfp-TocuLk+e=9kME$xZkbc38K05V50+cx{oCPe_O73rAkdzP(5{aay$fkT zCPWC+<-)zcms_SC>}9?qxO+ejmv}a`NNR3|(eDyLQEaNqV_*f&M;|yW{nVHQ+A(#l_%fXa67y7b4 z$yN2NBk9KjguV!VrqJ~tCBl*S)8B2rLKe~NH%Y@*dgs0Ltk46>rwN1l+jL3P)&FV9 zy(3D()L=mZS6eg5BRuSKvCpmkalo|7(v8iEaJ5+baO;+_a$4evMgSJ#Ld}BeZnZD0%mR$8JQKyH=KruLaN7+H;jhhUGPnjyBF6b8lg7K zr<`%lp5B_vfAmc;AMbpf-@S*A%o=+|LY0Bc5jS^HyaKJ4{tHI7cri=dc#~{hPgL6$8moIio(8Z z^?PJf`+`T%*Jv(mY+Ak=WL(ocgVn@Kf?ab{xb@2on~agqrG@He7c%=fh6>` zX-MuX(An0e zUxWxmMU9|EPUdfk{dsXt!fkGO2M`!5gdfZa$GHPo zRj97)ruDcavkgj)SRXpNG-uE6uz$U$m8REnzw|p6;09anuk{e9M#;pa8vJ^1g!@w~ zO?HJ9&Hr63<=#of86!Q%(QPrm@MU==pyUi*{!D;o5PpM*Ag{-%Nyj#URIN-qE9bIY zWGs__rqe3~zvIiQCvHADJ|oUjKKnq%LDywi`r_7E=T85sxmUFf!L!4;Zrx9UKFP{f z6eVA*3#C~~>;6*&9QJc`j&@*@QoGU#+{Iiw;v3#VTsqu|@u%n>K=K+0bo$22fza(W z`rxQ=cQ2KY|IBVgn!5L~tMTmja2cGOyFux5Yw!uiQXzw-ocA{Bxewziaihj~x`wuM zo!uwm&*L}0$bgnNA#FjJoLkqyuYZ||ZEZa3o|PaLU*Y>ml77QQJZaKniETAm4Uw}RQHx04z6Sg1eaF&-} z(F?SV=k_0Ca@xxx;rLXG4H;Q?I55x6XmzmC%HDmQ;F!hd-6ok(GTSml0QwOq?j!R( zhoBa> z$`p;HB|@7$BMkeWTCqX-aD(UZVo5%D%y8$ChdqXeh0OG)iNj4aB z2hldxC(E4&{5Hod-2_CmdGzROkcFZoI>^Aw5><`BuUf@TR{iI zllTH5p(0k;OBG!~{a9F3+_CcqRHYH540CZX8%a-orxzrF3dY5o3bMuo5OMa6c zs}n$^B6hMVpj73^_D-WB%T;*yJmehPIOFzAozWPI5W}oo1~rD&TfI5l#KLOCZBSUcrwY-jD0wJa8 z608zpyf~*Z{Gpdtp%0Me@@CG&or!u`3W;ufBIZC)yNWrQhrQZ;{olB8ODvwaZ>P$( zwUQm|X{QE|{YPHns=Ce_midVdgRN>r7QTxE5fEK&T5(QQiV(p`V~ zD4kCFp*~^Ll03FRtr79Y6QXq%$?>_q3sOHXBB}P^ptUX%YoaQT-YP*n>cJz@4f=4e zo{~+^NwaCk*6h3}K~^R>`Iryr5bNZ)MxEm0^L_<`F&ivYSfL~zytKlL@YiV`iM;!F z74b(pzWUv^HBflO$F9hMqRE4AOC0ty&^~G4lq=x=3Pw&R&18!W(nf6SlGdzz6h<_+ z4fa%)YmP2)s?A}%q0Kmph|Q3m5)VD2nRQx!Gz9QH`CaQToY2KvgqBiPF`o4xM6r;I zc`sX@ll*U%dj{_rUnZ6%-+W-XE3pE<#p15xQZ#Fp2uKA##%lx-zb;ja9P^iDnx&fX zpQErNH9h$uc1Xl3#v#js{>nYM!E-(2kGfLZrB6x-bQ^rIhDQ!-XoJJ`u3LgN+`FH?$#gB|Ci*3h`h- z4j-y5`;}VvAD?92jcoVJ13zKKPsc;uWG5D+JtH}<+4N4&Pg&_xj5yr^``~|F7tQl7 z{F`CNrS|$Xgq&@5#cz(BCg>0G<^O=ehKpY0Nnfz%dGdmAf39zM*hk*n2v#2%Cyx99fIU62^R)2UST_ufmzQ|ddo z1nLneVylH&S3m>uy(5iMbKx$=?m0i>f8bm@|5DnHYFMg%vfSYr)jM?| z&0Jcz6nQ{*4T3DuhW@laI*vve%nsi=J&a5T4}VIU=ssuVL~-`lW=G5^o9{a9{Q4sA zdPVff30zeSjH6<>E|V%2BG@qT#FA74jWhxpjhZNYL*mm z9ep%RD$^Gxqzf*&PfWdknbA@;E<@x(p4*%M`${Mo!LcwYiuu~C3FL5;;?C7+~5iTSmgPOxT?3q28ZfR;tzd?Mer~Hzh(V1?7YMSA&%= zZe&qAH&lZOUhP=30@G>Am`pRxDKMcT6sEX?ewc02Gu^l{Hnbrcqv;Aw;pUG^a5<^APF43_CDg2RjeDVV*p~fhUBdnNd7GIY?{oIaCF+XhjNx^$h(QNE_ z(lx~9qXqRguq4Sm1jWs2h9AjR``zt?Or-_yp}CvbtVKNru6tN7G`V__#UikJ*}`=`=5W8P6k>i zs0$fjI4!78_1Us~RVAiWAq8HQySagsC8E4w)qA6^QbsDNZfa`XiKOu2SkEfXvcO{m zSAX`;fDNcOo_<7T?wX>DPe~V1`+6|7%Yv^-9rFJKG2$yMT}-Bc@`Cs>FJ02XElRI+ zpQWFL`;<25FISd;i93+ZY~DXsN_}|QBPZW6^t%qSh_%DDZRMZsNm~Wf#PHHpu@Vm; zd{W5z%a>9d6usps2A8sP50$8!2H|0%^Gn!XfH55S2FslwJ=v~YS0!=5lh41@t%fKz^14N}nslah-CFJdPn^w&8ybq8+3ekml5Y zIUaD>CeG#7O7Uv2XsUwpIxdSvVa#1IJ#>rW#f~=HY~i_;8}ff;<91$yC3C5^f;kjHBF-MI3Rv!Fy_esZ<8Rc$LAls3YZ=MK?)^4azQasYFlM6i#1K2QWOog*S7fRaA-8( zp?V)O_nJ4?@k2HyLQGOOLvTZvSb67ekPJX#Hs2C7*7anT>m-UEK!&}_q0xr8w`vAq zUVtzD@!6fpl1eXFz(%invAwmxZhzk)4?hDUsNnBOXbwAfqwWq`nO!iUM-^P4*1;>G zfGje4`n?6@taD0wsc6I_?OipUhiYqQUiFlh#HK5}VoC*`zcBrPK{?24bPuwSNNm-E zf9`iXUattP=ilpr$}U2lb5g@{(qxL|xU~S`W9ek;ph2vTcqqf=WtxI5Rb{XZDZM36 zgZv_Q@c^?&=hr7sl)AR;CmcFrw1c$k`NzzK6>`rB<55Q2^mpH zbJtNBcJF1XnFjWOB_Ia78B?88r71XM3|o`{5DbZtBlyc+?mv1g#O+r)n)!rXeLo-Ud8so#ZAN4ZP+JZy|81!4HY)eEQOzBJa#vgHwbJ`Ncc9NxnMkSQ zKYOYN{7VhR%`DMb7)-YMVzL!t5myZW|8$#}@z+zs4%_1PrEckF^fv?~lBQ=@!rnoO zFI4~EoMF96Q}LVXbzyAkNG!Mo$yS<{U3+xV>_`<2hP7eJ-V>ynvHB*1a2B;j1@>x1 zEv5xJzR?F*TBWpq2)+kR!Eg*>T%T*CYMpYYdX@;RcYz( zQSfF$FXF{>%1E1>9?*%J4uNsECRUKp6Iu^8*+1V1Ueast_%`jOJ$H^u>9TZ7ro;`P zza&BrmxL2RL@d2!H;MNzNa<9U2Zn9O0Dv+wexvl@9Fj{xFcr_!V|c7B-TA74EVfcO znI)o^fI(yZHO=WuH$>y2Lr-O-UN(bXH0iCz?%%w-;f%Mil_L0Z?niP3YIv(`J1l0{ z+H}&VQ@k6OP3(NfW3tXc=s;5 ze79h%KvtG|<_c?pelE%>he`IcmiRL=FC_ec!7%LxGOZt~5EV~F5?@Y47;>6! z=Pj1jCCirmoHB}Jz9-Kd61|~u#1iXiBcw}*64-u%^Hoa|6!fVclned!lMnBBRZ=TY zVXA-hl;2AIO_T0%!J`t#*k(T2P4Y_+mIELfQ*l^+9Sqk;Az2jGlf5?Wj_$GSJjo_U&cIx63&i2pS-Ze8DzsF1 zj~3~tW!v}y`yN*G_?U_f(v`grLJ+)w{Xe9R3{3zudI=YE4dpwAa>x}(H+utVsw-%! zLDCwXTyF?6NrwZu72rF!l`jcHrm&SgE0mHG$Mb<|Df1q=`#T)k>SZy z&-x=ep&@fy+cn219gbWIMczjmcWTr-I|ZJEj9JQQh5F#D)M}6%UUcP$n!W=GxiA#R zr`PS)G((qXNKwvq3oBtv=uH4CV>^IZ`211N^#Pcy3L)Xxy#6twDWbyCwzZnqd-cu}8)nfj7vGqIciJCD z&ZFu$?cGoWVS09-r%hjKp!dR!UhulypChfxZ*V}^j_rM4#%NUyPxsfN>-%@k0)#&L zqpJA-5x(Pu$;-0hT0zQRlUh zIi|=N3p#VQQSA4zzUfRf<7l1V?01J?le0W25)8gN^~g@mzW;t*kLR z%849l+~fY}<~5!Ho1oZxK@)skaL%%XV!U4=44Q-TbnnGgi9*3!tUAq+%cs(^^}}pZ=r;5Md2cS(DuEWeT}4sT`uYUC9@f z`J*PODAS07bxOe#d90ql294tvlUY_`mOe0kVY{XinhJKT z2c|@Gk+U03WKAy8cas5vf)vjT|Je&vXAV4{qJxnkRe!wz+s%St@O4B~j{SZ&mzNg< zrfQ^u0~hW??SZDKBZ?op1B{;G33yeqAdnj#AFkS9GCsu|Cmjg)?@@tL#Awu$FXc!v*0o1r}m?H5U$c-Nz!OV~4^O*NM za$x~3SMgJxPYIR7wlVO{YvCtz0|&cqs;iBDMF{~3LqERJcvHj*f?Qt@mSH=#=!8s5^JAE?35A&JLj`gsmK-dex7=jx$@?Dy0KVBAJnofL| zG3YF;@QdvlYu>)cjDGjQ*XEdYkvzoX&lY%IlrS84cO#HIOp+BGBty8(>U8rP>?nnA zS}ihx3g8-Z>~#31`IgKVkuBx6=Kyc=>JZwn%X4T~#_1c;g6{HZ?b=#K;EQl7}32o#Q8Tix@|?Y`$JKLOvXt1IQK$hzpk#aB8*i%K|pV- zojo|nCkTzMrkR`8#okjoJ6M6&Oj{nv!wq~ zpcQ$@CBc;YaW@pGeO2-3MTj1(WDqGM_p)E(`@(#NxqsZ>Ah_h6d-0ut%GJZCiMPmc zd$*&<ZhO|2L-kquY6_}?yGK8BU#SaE z4MJ?Mc%V{lEnxsG$F^wvAk z%g@oZXizZsBW#!o+2V+}ka(1<(!XaopG9-p->jvWDq74p*0(nlY-C672PH-t1fS~g z4P9w0zs2Th^9>HA5}l!w?fDp_msm2BL$hq*9j;Lb3fT7|)Ry+3gJ-MH0zm=Q^;Pzi zq86vT4(cw6w3w0lWlxBf&|@N6DPa11KvIy>;beIeUM(865`Ruw5-&JjBmFKB1%{u6 z*^WnO)NZ+GT%IT?>Aqf;77lr+)9p6aagkUlD1k;`_qRZD{b8s-@wA@C$TL{PZ-75E-xd>)~~gWoW2Y_X*^+(Wg2 zO%^?2xGB51U*~=MP)7G+L6T~z47vzn)Q;&oG#Cmb*p>F+AzLB7V~;>V9Z%U|DOvG* z*s=uVaf5FEf@fCsd_5h&yc~#cbk_QF-A>VNnCDEX&U|t4sDgcP8@@ro-Fd1X8o^W^ zSzYW@%)0=~O}Yj2h%pZd3b9^4dHJ07Z}<7M&z0}g7XEFMjd2T0z1IbG-6~(tt5lOY zg<4^^;(FHTF%AG2*+BY~TIlwTK%qtroP?Cr9W z%u@8Y3p>PhGYbU9n`fGZe6K-@xDdSjq(}bUEP-nRMdC*6S%*&(fCp9MILZ`td)sv_ zHH={HB)UN%tQ^7gyuK^_eO|*}x08bWBe+`8!^iRA)*>0~C_+zz3jj8)A+L1m_K&Ah zT_~`DMA!V3hwrD^g^L_BUck`ADP3CwB|PLA=yHjvM7u@?lHN zym&{A>-&pRJwH~6nw_B|6}k_NyGI*mOCinQupIUHXoFRzt-8 z%x>ltJkP57xzCT-z;yPoY)Fw!a>`qh>!4R(jUj_cL!Q!VDbeo2g&;)0VlCyxzJlNR2pJz06nwfqp>Bsh;Je9{EIb^M{)W1`0#B zRf90k(fWk*AXFV5c&ES@rfxbwq-lRb>vR1vDGmA33cr-poIK5HXU- z0wV_jlB7$E*-r?U)t}~)vhgABVRnXvaO6JhSx~g4N#()jEi_mPSKUt+9G0%c!0N*1 zY>GkgGNwWJCjN)!dA?`@wtG{m_#nSa;S|h+34twdIpt#VMshd6VxvFRlEL_aWM(?+ zd8d1n^C&O8^s|`riZ#x`+*JLKNK4rQ85o&qZzVy)gp@r30fxHE^Rej1Y zBw5>w@1y4v2az;XXf8wWp)4P1;F`RFw#ZSu(5mFG_HwVYmG@nrR<0wx**)pwlmi53 zg4by5)#n{f^VG~woDRq_1xzPRjpG>nKEhp7g=R)-$l!Pz?AG-T3p}7Yx9S3_-saQh z4YhdiueYho{Q;&l!0``^j4eYH(gyM#ZsG5%MXdy(>c*IEJ0bvUgjzEdmvhj~(5?Olz^Uh1Vj$ar&r)mukPk0jJynl&e6zc%<+ zG*R|qMh3ve_=L;pLPp&zwfs_oyWlRCu4HvvuEQ7H8Stle)AM*LSnTz+ydS=Ibf5u6 zB<7HgO!j!5!|?_?XTAOxsorgZXGwvz)y5!5MO!TKQw7aH>IB2}i~F`Y5=^jyn%WSa zYLn@?=1RvkLRtpSfSDaLB-s3ChT1q$@rkAS_s67jFXHbvQWLj+c8G|(o$gj}i9z{2 z2B63SHBs`vgd+Ncm*xVvS2ciYTFr*UlJ2hAh}&+E*&6-;1gvb%YgGBK-&zTI?~0(| zR827Ty_41jR~hBX1NG&iMx4l-5!pPQRdNSvwEM=Km?1+bD%^&O@@BC;>ds_OV~{<= z%jk}Q`kBpg;6$uD?R8ty_>WaFLw^Rc%e~=ic%1M#w67ZQKBTep5Sz~&Uhu2 z1`OfxY;hy-;;@^onM;OE5TA&p_y>R=MZ@G4epCO223IlEf&433I*(wOvLjyQS(Vxe zWbnwhq_0s9Ns=!f}5q(yRb_tp^c=wC}d2Uokf@18ibCTw5YSkQFU=|A?w-3_ub#uN`6b)U4i03YECp=OYW@kktG9+9KL9K$dXC6W*C)gW%k zuRcybH_Wj>G5&H>9-Nb3WVq=fNeInxk%pzb{IPm=N>Sp{H}d4MbLUy0?_3S>Bju$&}uZA z`k^l3PSbpqb_9Zaj*9Z?wQ`Q3Eg*@Ybrfyx7~>*QQM-5JTTob8ysI=P-8C;2;hO$O zdz{G-008p%PgPw0OI7}Z{5Mx_C;(s_02KGX>ILW%%3w76fAuni{7Ir z;u}Wd-=rGO-kGdzh3U+9&$hm!#QFSzh=TuOyM$u@m7204Se=USd}>agjJ?j<5=2SF zR_bU5eFSIzATU3?jad8J*q7@bjuO8r6m;+;d95#`DC4}tbafzUtKw-fqyAtDi7XPW zFBrf|nX;3b zo%b(w5CG7{zhsvFlX1a+c^3aN76$+|{O^qUgfdud|8K@n{8|qQ^lq)c^`&Xnl8UOo zqrN8|Pa?5lE7AeK4kj|lWT`&R8@d;k1TFt39CQA^m6ZMyuKmA+`wuerUyy$r5di=# z{_l-&3uSP+{@;xtdq1Md74@N!4H}E;y@#GX4se%y-%%=49%%?(mUv2puYOco>rW0&jPHh{6ytRg7*ybScrAe(sG+dsNFou1^~GXf^kpe z6(K6bkOpO1!}eF)5Zf-CbUA?YW~Il^3K3 zrCVojUU*(z>Oo$};^0-G)48AjxyW9g3${r7nyUf`^|x!r8CWwMS1_c zG{>N;sMbRmBKmStTcH_pq^yR9?9clAlP3SljJxeOJVzT+BS~DvvACM&7QiSP}G-i zc!06a$o1T3ypGiTw*mSYo2`4;wqbv@)%UVM<7^g@xydQR7-u_?+Ipl zh~vTJn`=6&FMrAg%yN^yQvBEeJHqO#5+R8ia>YZ20^y*r2PJbemQsa>vT*?1q$%tu z&WH%v3_H?pKO#9Tk_+~gQQX4&{cYvNv(Qv#J3)aPq*ae}wn)$kf5LhKXj9cShthV- zbwQ2UI@zzJ88Ky7RZV_f$%IT>>4XN1pT8QNLl%lq%E4t!NUQ?qpi3v&n8F(6~&Y^p(0YBTm&5ktE6T-JVyu>Kp@bR!lW3HRenMQdWh z5&Z9_{eAKW=mTgofc~i>*u1RxCY@!hKiBfu;@m)3(v$jg=qKsz2ZlIb=@tE&qDx8DD7m7Lt)AsPV`ID^C8r^L;CiU zg=?dOf;b7rUH>@5gjHItLol%3=-TA>cm=eek{d@1Ml+#+v*E+sp;aZ3LfRJYc1RJs zK(83&Jo}AEz~4vs?RJQj8>7ga3?qJ9q(&6!0xkFXwK8gB=J%wxH1EEvC~yQ{^89u(12f?Yc-t_O26 zs*M5iYi3+~^JlH8o>jjN|EwuvRZ#K@ZmLSr#9t5ICB7^6!?LibjAfO(2G>jZ<=8M4axcQHZnk?lVYl5f$Y&YD`gR}`^D^U$RaZ9ZhHb3C;%N@?xg{@X=|8TTkb1?DAGs= z%etmW+>RJ#>#edAcp%g@Pn>@1uvvEf?PoRvnKb#Dlc33dz#hYWS=CSH?llwHUvGIueka=7BoadlPTjJ z8!_42r`BaWpj@cXWeaMD?-E(A(Ky?vVEsB;+^QbLKlmlvOM>T@=~PMTe1G$^i;9w_ zu4se#+ppZ?ZK#tiWJe57kqE?m3Vv-ReD&MVA)S7*U%W(eV$#L`u~l`xzyD#`BQjZq z2JBORrjE``dU80VWTQK4$HfE8al zwkqsAUhiEp$K04bz%}kxONB)H-6iJgx{2w&& z2b}SYdT-#oLCFCJv4Ef;J#>L0PUlcplaK+RJs5$ zIE>#PnC0`qVC8~%o4jLCWA5>Ja^@C292b-WfP2n@!03LM4{IN~3k zkW>ib`TW`h1z-v67r_%;;#mt32Feux^XU={l#NK5^Txk0?6A+vnK86wQ)LM&prGB$ zVPY+*6-3HSSM1s46qDTYCVye`>e;Ec$Y~@YyDvm#?b-@RJBMKKqYG}vZ@;Wzr06^Q z+FDQ@US*t9zyBgaXTKxM!D!1ObB2*joY=i`SCdU)*+8nx%j%6}*HM4O^sk^-_7&91 z#wa3@tz8iol3+sbgcZj|cC&D5sV`;LKQm&AqwRbzhK?<{7Yl7R1n}C{Q#S{})k#0Ev zy3*nWFY=uycXZxczO-S=d<2&pYxhlzBvd_zb`ecsmIO01HJ~+E=DX4E&yJSeAgIpV zWegNz>kLDTB-PE%CIJdW;p%5oik5Tdw;@>I=O4-+w8~!~EDtEM1R;V1fS(1xtX^6; z_)(EG_h0{8I5;ucyOCxIg0#xq24mv8(J^d~w$Zl(HjF)oGUpN@poAf5dNpg5i6>5OE;jVDWncwP*EyB-i%T2=2egScW zELBrjrAghB2g~lr#hFj6aK8Fe+^;fSsbT69{RQ)TT7SjVO5?-v`gdG~C#o_Of%Awy zwa*reHQ|?$XkfKw-V8U1TVpSv?Pi73-E~L&&1aBx);{KM&Jd)|HP$oeJCpRaP>yEh zA;F}lC(W7`3PRh%c^N`01w9$hqSQLu*^;VUgnpcA9t_$EFI~MrSAB}1!-A~ijnubc zvm$mw{oPsNBzElt4CdOy6{2C?siK=Btha2dOwivBC?{eg2WV&e0KZJ%-6IbD6v>(P zMPpWeQ;|xfy2|1KCXFFd`&;7gr>hok4(oWWTBU1?Q4^A#}g{j8e+JOuq{-qavOE$otqy=q209gn9O19XFU=_ptuD%Z&2QxXWW%r@EIjlRhgg2{;ZGgAaE0dK5M2a7Lh!j7CQ9ir4p6@@n!FZ1Lx+d!z} z2sNVccViJw8a#>D(uq+tqrF2}ygci%VSX3|-bPtmo4K@8v5(u#+;@XlO?)vF3mu>F zz9{;dxQotO)3$D@C9&dUN?eyskRFX7+i_jP3@CF3A_8R_#NDlQ|7J z{zS2U)T;;!yY53eeAHAp-h#>q?;83gp}gUK=sWXY6OH6}WuH6(w~)r{0qm{*Owv0) zTH*%i8gPqc$qD2>KXnP<^l;@4`}oYFayYhCM^BBh98Uy)Pq!QYAu)$)Q@@Vr0W6OTB>(^fA;jLCY- zVNts9(8{#*EEeU6MVTfZx}%hY*wNU9b{lqpd05~c`kTd%N5yInD{7{1HO{H9!ZGtm zCq$+<-EFCT;;1sK;cLQ~`5H-t?R}D|G%~5gE7y&Xicf>)t=OF5Ext(QzJRxLcrDK> zCK-)>rpDt+`SFWc(qV8tkG}I>?7N$^mBTASs(2RU+h}{%OrpB?0YeZ$HN##e zj<)jC7g;Z*(BKl8BUDZYbzmF@O_Mq^eL(hw**zH4U_CX6LnwzqYPeS)i4vQnnc-y>X?2q23jQol-yL$ zWf?c}Q#{g*9Mht}4oYUHFX3w6NmQ0Cj6G?z<&8Nw!sbvFTLgGf9embwdSHr5Bz^JV zInd=OK3Zz%O;E~9dk87N^)MVbiR(n*8Xo;5s{5ohSyyk!^0)R!nv=ajEiKKa-{JRq(o}uD*f3J8yLybH``qcr)8QHNC&VnW1 zi)h3eg~LfBiPs_FHZv-d9{}b2g!J$t6YMo-SPB5_Wsf}ofk>J^+`pLsWL{6&f9(4K zpu2!T%pjnP;b4bMP(<{cGFar|_z8Rd@N@b28HDz~6jz>JV6Q#J!rFqtgyDh1{5c)M zLOR8Qc!r(BK;-$KFHwL`Sy80m3H*SUg3hUc!A)Mwp&r59b<^BSreLfgWBp1s9=KvuB;^}c7xs;$t z4Lrf0b%zVR76$wwy;Khz#t(SyKjr2?fC2G@BrFimcjwn!;`!S2F9~`fBmlzD1K|Gi zkWMC&R&Dby3~RTBq@!BpL@#vwt@FnMCL)a&f@|dn{}c@7b0Rp*rCEa{$BSiw&pwBN$P@f&y(beqfgkYFe z?`}-}5AdJcgdgzQe-;Rm9zh8pNel_VQV&2FI8RLgb^dPv%WKn6KVd-jzTa1$pDk8t z8b?cK(bgSe!T8(a$_laR6NX zCSlkgk^iPSFrxdRt`*XhRkt?PwJGt@nm#Z*ih(25xv$a5*EllRA9n$d8{HNVQjSp0 z^f}17*bXLMd&rcBZ(DtOgUyhX=mZwWNCE+BuwSVAiz7@wALZ$pzQ8e&*RT&}shF6n z-fpaBBTYN@r_Yv0MEly0N|@a_^hP#K>~uwx#CDr~&C<*;cZ$>|6;aEU1xj88u~R%Z zpT>}n){GV5q@2YwTSk*@lyrMz_hCH2y&dXRHH;*~!*5Z+UUqURF{Fc%?7hVwxn=K$ zJNCt4+j8VMeDBdfUkIa;i0RxT@M^xjU)I^|A$B~QB#mV$Z5l_3LBu*zM`A@~q0z?j zl=S^+6iu+`lS~W4ee_{OtHlVhTlzsBU&x#ua!UL}KDiSSu1#+=IYsD&{@_q9J=ELa z&TtB#sI;52t|iMg;uS68YXejLV6i%~NrO+PX_Un6-6{=Bm7#_9^Jeudy2k2AZLctX zPqJ>2N>l8QH}9ObWmQZaA{xoHjZXyx}e`ZaLPPj z>bLqgf}}tUDM>#`vFVb4!p-z-435AzuRNsguF~R!$$cd<9PWWLw%RTe_osf>0W^gD zm1Mmz#w>km#)(KFB)%kUo(x8qsItZUo!fdK!ljJh@4Nu4IYe)nawD8NKG+4`qSJFOD-lyH@6Q`r_d_wU3 z9>LE|F9U`;c-i!X?E}-O;xQYG$1U~3C`Hw1RNXn~PWXFfRr#NIf}p3Hv!segP$Nt$ z^xM_gPN1D@8|N5B3iR<%lW0A4DEp9$3=)~C=Ex4zOvh5*zi}cack8G2>R;jO_UH?V z-Oz0+d=+-fuoyV zbnvtJTaK>ml7`RQzNPw8R1Py!MM~eGj%H@ej9HU ze?$8u>8m&!|3dh#2sN5BjpvZy6!Nk1^LV+F@alMzltzK5W9xgar_5gONF9qv`$Qdr zpNBn_Dtr+AX>VdT7(r)f$uqb7Xqa7J=_B+bUv)3W1~f9;=TBx%h{CExJ*qK0+|OEV zSA2PoG*)_O=3(nxu!OdEmKq=Qbat4kd?`> zWX?^bsYy@TU&uiVfwY@CPx`Tn95ncuTyJZUIa}g6(yKpoeJJO&1+~mx+U>~3zaV0d z{~lH*r!P9J)KZ}20KKSh60)TK6e}(N4ONg`W~B z%j(}IVMcH#q3f|?#!t8|^kYgt&Tx56s^@Wc1+7 zfO^TP=Z7;DUrXije%y+sxU;tLHT}E29+EHWKFOrUXhi|U(Ig`&FU4C`ampx|;Bo1@ zrUy<7in;`l#7Lir1meNzux7y6Dv=2dQq@YQCKNsq)|;}alZqfa{@(47&l60lms9`z zmYGVbFE4j-UKlp+-cUqiYw1F<=Nsl!G1rO5Off&255_yQTA|V&tX8!0x2!zk;*ZCe z|A_yMMG-$P9#s~P7{58Q#l(VQs=Pf^Xj{xQAu>7BY4(AQg6G1X4-7?e6|oK$x#1(4 z0?gaKd9*@mHhTkGK1Yvp6FFiRLLSuQml?mkvo|r#c0?HZg&^}Mi|PjfTudTZbsm8g z64A-sJbclW9eLH3ug6qtI^b9PGn8l4K2FIWR7qw|;6qNJc^h{f`HSmFFi2Wy-Y43&auk#< z*d+SDnfq}|qnYWuy8iT+7N=K8l<`b!iA@55y}uQnzevWLTd?n7m9)TFLtM=|LwOCA zy&dPy*ZXtl&Nrf24Ah!Y4%)FWw?TP=5v zTHcxv`tZipOgo?Sa&;f8`c6@G(JBhf=E}d?zHfv+IVi2^J+y(~_hO?--1Bhbv`}f^ zIGM#X)4x~BBejoXG^d?jAQyYZcXW;SliGvQkM0$)8T7)OC3)gXB2j1wtG_K!n%ye! zNA_i;T-k>C&Zbn~QG_0?&9vx^%1SIII2KBGHE4+a#3RODK0ss-@k*tpX`3Ln>Hhr_ zE64Ast>&S8{%sT7!9LbLgZH8*Z|eh2K0CKt6+iSYi#ZNddQg%HzUKjy@(G-+bm0qWoAnZ`e6sdi^khu?a}H88i!_y7Ajp_ zt;R!r?cRJJC(<#QqZ6t9fHGYE`Iq5)E#xr9Ox*!!+WQ;6Ya<9sn%NVdhFw21r?T<1 zkGeyhrQOQyXd~#Ar}Nm268DDNvyYyA*)4xR;b-lfRu6*GuvHq7O6x1C%2HyOZ}2{(s~NdDDX$8TbxFiY49z8^(qoQt#Vp1^y{?4=xnJoAwl?7?9=n#zhn1!~&GVnL zKX&0hN>_APHuo93=dJMLaeukub3s6psBjBA#c&l?%U-*%d zfIp=L_co^Em3&CNN81S9(H=g#$a&Zu0F(=KF}<4eRP^em8N~yRG!X1@`-hr>W>$ z_N2d3pjk-j`8wMp&2m~{{MI#f?-$2zJ*W!Bl~UO%+LFtuP*~-`V_nEWrk);4r9nKY zZH%GgOi)M)DX4l)X>z=c^j5@G9&I_q2xD<}c8BC)b6GGYu6HrdRNvPVIc-`Z%d?tWxP`%3-<&MLGkmEQ^xNZVY`zRUM3ncK zNbZd+mAnz(>|vr=T7RozCp8(m#+>{_?Te;S0`7-QMg&PyBjbCzGX$c);5|+R zM;J8&S&2B6YLVTlj${Vyv>CcvrAMK@vao-R`Ka!WmV8D5V`;fo<3$Mk(YcwsJV`C? zYXNNV1JaChw@k}hhaREBd}iNj)*fV(>llclt5_`_!ht3j_5#dubqB@Z|M&ohScjG~ zz(!meg zyZ}~ZxD;|)D0ie;(UMI0viYng!W1=bT~yV_NbePkxcZ{iT>9ucn(lt~m=qa82^E*y zsln>S{+66x`X2ZT_M7Px7&H=TBV)-Oj>=j%TBosG)g4(-T@5`3NDOK|>J0i`wD(|7 zQ!|@dhU}AmP`C8I(Y_U9Nsu}pP0gRSc+~je`^XN)X=h=Hp3B-cyPAzi)%`C64#Uzz z1t!dn_BJ$EYjxxC3c`$VRcEKXj3M9GFW^eG)w367P6K@!t| zq$4_g)pExu3lhH?Zh7gC6SxEwhhJWab&|MW3KpXgo$i z21o^?SQ`g2bqMt(M`rFSSL&e2z8NO2#CkY1$7&OlidW6F@AwPHXiJ{M=93t8NM4kl zcJxHtkKcAV>{W=8&c9ePN-&T+6)8yFTWUR6L!WxK`Jd|ApD+!ZRmNZs8OE}kjEUA8 zKyOmzL|Z)lqRszNS3R||H7Ikttsgg{P&qnRQ2;ArI}2TW9VUQBO9=KfkmG6cogxRH zLLSw0eV>=^Zq+zRdBNSN@NqvJJG7~vp^dnq5pg=bD=|ec4qr5f4^2Tll)b%hgn8&Z=ExxPBh1hdpcxQ%KADMP)0-iw{&zvWRpyB7Qj2X+Ey3x4kf&f%3f_NMHet+5p1fLbE)1t@qq8HUOEeYQ0o)A zt;DsxdD0-?YKO#xO+M+uC^!^B<6dz;PsJ+qRdLD;({n|2vxQ#&T$W#xT8))MA$&Y&s&iM3oI;MKyf9-Us*dKX;~g|eeD zT6w@Ijq^0^9X!rr>%oKROwkC$4Rp*5CnxBR!t#>CKw>&{PU5CSeDA(@YyZ?C2Hj1R6pA+5Ek*qgdd z=Kgx($h27+how+eX7-1MZ|1P>Nb)ITMAvvZ$5X7J-Z5l`r^GHfssgEC^@bc^xJzwc`j zRGXITrE<}u0X)p(X2%|J=cdfur`#&ie1gYa!>OFZnTPOU+7Olar-l9ey7vpCaAV&1w{k(?9N$3kphiq7p+Vp%LfmB`Jrh&6PTv!9v5&8ajBxb?;*J3%*lZqm& zYSt=*bUccN1}`&a?m$H^(`5J-EtiF!*_O+oakU0dy(H)V97NkCD! zZ;EJ2(`dpu6NsaFH*ze?dB;ZklbDZWm^o{iW0%NaA~A|gjg(HCZ)vnv>tgul;?*wy zUs1S&@Ik=q)@!#00GvG8u-{oABBPCL-euIc@Uu-|6lslX-;v=qa6)(Nbx zJC6feLi`dw9`~H_I^MG=+_QAfE8Am7XkbJ7YP#{;&oD+eWUqeSg4LzqE1aJ6rbqVX zxSj8T83~)=UNc^HqooEb;ny&ljWD1zTTIWi6IPrqhNa!jJ4kE zN1Zu_pYQ7~AuY!|*Te_)g_h=%0J2UYupKqZLP2(Yq;5f&?i8(uZw_AqYkTtvx}_Tu zX^_sh*wd`d&_pXwAC6`P?S?2XK)vM#TAdM!dl|~atL#=eEruN8E#at%q2~s$zB-SQ zP{SxtvCu1Z5F$i}_b0|`<$6V8_JrykOg(Yz9#xZUod&mje4n-{ZDS!HCPN67=Lt=Mq)Qz^92XHn#e|qzI2c^XHKR@ZyGO1`G1ny?+_mQqa82rRUIi znQ#_(f*#3r2>(ND_8q#j&%nHhNZ|O1RX3(anvH>{b?XSj7w_r8j-RdGEaIMFN`t{T zntXIEF|MraJCvtkdV9h~ckG+d65OXsQC2NAroXE5B@w0E8*)c#}xVK+Xrz8=oRwMBQ5sO=DCmJf|&H} z+GVqP!rx11-1V4oAFVjB{9?CGJ%Atp{EK$aC#OSHg+<(_OC*yH&kth=pGi@=#EC{a zhqHaLGh%+mUDvQdZoEAKmmF^pSFas__0&B`bb;Z_Lh+M(5~(7^Zy7uQ{$#dm&!Ho9 zvidk{@OVUdq>6Wr2&RAJ@JBu-RHDQc_r*}~AEh-u;hmE3IA9GOFUrs-KWRSOEY5e0X)HI)fpx4_Az$Tl< zX^tO0?l)_thC7IWeQ+oiy1d%Cu>Ayp?l7YT8z{$P!m7>rQ7&TgR;#KfJWfTS_%@%H znF#t~!KkM75jwr5Cl*o9;ty}TUh>!s%eRI(i8Ovl2`Zh4y28KF65~s7^%!I#1kcdAOeD#NV95Hnt|xR`T=hib5MkCqStIy7#T4oPiqk zD(nd}M>Gcez;fY6Ru}B=2sK`vXM{Dd+(q(PBbza9ss-9eYCj`w)@BHK5$uR^NKoi) zt%u9j1Ylr^v_qqt-p$+N!7cJN8F$F`liIvrk4Jd4%G80a{AE42e9j|`vjh5(vk%gq zl=|pdlO#0W29`#n{EsC(vd`#-{FNr(SN#o^zuYgeop$o$q}nlbwoboK zeWa+Zg8+?b)bRT^K7Xh-Oax2bz^~)A+v(;^i4zCDr~?#HP0qOl@O-U&kI9>OtW*O? zUheks^n^Kv5!fmEPe$hb5NlUhbRVDDxMPEr$XCZ)GN+P5j5~NZ|5q?QPTG2^_=(t!f^C z-QG3y5M?iFIc{_?BhRUBf@%zIX1=OSjxqBqQ>g$S7o(W*2mPX?TW`&EQ43=B(0i9o zxoLYuD}60?;=Z#ib?_FvN|L@OcLJ%U8+J-rHp;3ZD()@qz)}wXmu8LeZa6SNhljO%Tn) zNEV*fC3X%sU<@Ep|I$7NcI0|=qaf-mz`J1zISzdbMW#O7p=TTYq2DndrK#s@@u*l> zvIcDfk8kArYDWHB3cMF6Fs&Mn+Z=^Y(ppiwgxKUoW;)VcjW0s_~1ilVr<~ z*shimxHD|Bhd7^^+wi%eNg?zgDC{71%I+|mZbkFn8+dFRv#MskSDVmLVYpHO?YJqP zK#Ll0^8C5AZ*2@E9r+q}AKFxEVh)~l&Mdoe4b?6m3icnd32Fmu(jU!91U<^&Csli& z-S)c3cH0-;Z`XbgX8mVJeQM}EJZSh8DgX87L8JJdP+v5gefeQA&WNP9{Y%zAG{RG7 zK_Q_{`FM)>mQEiZ6F^7M^<~hwp@(?Iq~PT{nsfrje1-t4>VxO?@WjnO z;-ql})v_b!h`-<%`J75*ijUbf;yn}0b4Zw7fD@{p*0U}u-zZUZ{H`&8btLrIcIRbf zOD7Gy-|O4de7|!|S!v*SC?1%ih9Z-!?5@p6dFSLBKNhaEWqx@2hE?@Awg|uRy9m^g zX7YH&osHw0p!cKbiOadp=KjI;^=|ww!K+<=z_?fDLHAe9o zU?@G^JNyjmz3yBxT0P~o=1S*XfW}+2eL=#B;(H`WDLPqxvi7MzH^n~DK1G=D*dY>% z#h|fCoLVuVmDMsH`azB`o&*qautTBnwRL{;;d{J`ICpM`6v8*I@fs?mDV}d+60j5}N;%Gj^2cyBu&w3!6TO z6UHS>d3{bkUnaB*hJ0*a)rd0mXBvr#ft!8Sr?ybFD1q?0hP|>Nk_la`DDuU;pc=)+ zI^DZ3Q~6~Fp>I`wgudq#-|sbo`z((rN>=Ayz{u(voxwU&@OCr9Ck#a=dj=9MYt60 zY|qka`G@2GitKBXwl;S%rR(nUR3-fwSEGVBFI*w`AbsA;9$sORdYYz}G2sY+@V&*L zRp=#`=j}ig1WVa7rAO?NzQuU?EW>wKvXj5P(U&k2sgo1kGqNmOc~o3bSw%4p&jM49 zCIPKB%ITJs*oVUdB}u=UTpvIfpgs$ugZ;6n`vtr1BeFI!{%Q9^s0?oa*XtAV`r1+;_kmW`A7E*q4|sr6u2$ zhuI~syDj(5Lgu?;J8QgtT$!d!oWDw-tDKO5+-BFkhYJ8*yHDC=(r=q%+z*(!D|Gdi zrJ~$yUiV-bu}hfJNgKEt$BC%}KZ`zF2sy2J^-u;`ir9JkT165cL+Zr?Fqy@sM)EW( zdAJ_0l@LE492nVBnZadjm@ZogHC1L@EW?QApCRJqji?Q!XOCE`pu${SYX4yPk{~Bhob-+@*X9FP`thT#(+)F*CnnG8j@JNIOg;}X;cNuB@=a1` zSo;qf>4cv6%Edm5DcWzcZ^Bk{D>B2`={5VIXAk^gFlk)pLJ{PxM-tsxVq#7~O;KVb zMSL{jptav^oA1f(nECw27)?fUqi6K&DdWieT7C*< z1N1=S>x4u}LodYSZlS~5lUWKJ!)>6oZNqSUW$31s@F8fjzxkp;&|2L33LQ``Hg7_iHQrt-n9|>8S5Te zw#H}^+BSizzn@8Z_VY#V?zcD;+8Lg(MoFtZ{4;gO-+iajudB-9l{=qX`^B!M&dnxF z6*4n zM3z(LX7AHa%iSS0a2@`f)VOj_T~>=ZIQ*UPs(bfFd_QaCw$x7LF6)$%EhB|cqY^YJ zv-5Zyhh1v>c&Em@2mDJp^ln!8!*9wzPz9^uC}dfvz#CH8ux`G2PcwI41m64vZ$gOX zEIxfFhis>Jhluk&99Q8W21?29jN^}OUJ7qf1eV!s&OGF7$T7X9ihA-?w;nmC(qykoyqd00PKXP z1&YI54JjY)vwG>2=$)|+{)~OjOYX4i%^mw{HTjjX>aQM;dDe$Q&?7+|ZMx{hCI<)X z`&H_m9{I(+x7_3_9e5570x>IPRu#P0Jv*z?~&IBy}wR2ZOvXX^5WbQJMKa7e)Ss_1HIr5Pk8> zov)#fv|nJTt||`8#o zBd2bgimaH3M|=nOPaXKM_S{T&MdkX^l!#5e5{ac&l#lOGQhIt6`wT?39LOOr^me}; zuNuI3+}`SeYWJ=xFodm;f44?Fw1-N#u6K0i=-D2T;o;{9j*U_L+f*s=R3nkv!QCr; zx=@K~njO1jqWEs|I7~y2Mpsv6rMSs4eRbBCb4B<=T~JInC{#(g2gE4g#q?7}S%n`(p*Sggpg(M)MJ}iTE`|pRu#k&WPoj3h*Ax zIG}w@c9H*~t5rK;)K4S%a-9l!<=y>f4&OtR8u<0aa|u7csQGp#a9T(w@T4+Lq+N7} zjXl||G{>MCsTMPCz3J6qRXvBvyMkNnckb`W&Jd*aGS%S+=d?-MzDuUhLGE}#xLbTT z7e%TwS+s?JZzV9Kd2+??7BSKAe4EL=*9(Z+k7H1gKkUD*KBG}DsJ=^JOX2bH35LJ; z#%rgb@P|pNXY-X=lq1k8Nn#pmFJ7$NkGVf>vVJ)D+x{e$?N~yBM*KI`8;X`Sfkrd> zFS8#?Rw+-?vEod9xux$q+sk7+XnAR`2+3ztW>Gh&*!L0Py+U#!eb32TKcBP688tiI zI83DMZ;oUWRzxRuf_WMkp88dgQC~w9shRz5jhHamt}@ZB2W(9NF+W2)5!xPTb&GuO zy{ac1{3~lw3uc@{P9GZDGT|el2(2@}^ha&t4dTN4ueiee2;i1hb)Dt8yJPOKv}Mg` zr(6RimZ9Y(x$x!H_vSrM7a3fl;*Ih8Ut26Xt5)H!;KuJKOR`T)nA&Xq#^2$U#F`@s z*7?#3709NaTQD^3hbweOZBE_dywAbmI6FgEWoz#Kwc4xd8SwXH!UQqZ9bz6YQT6@6tScpCuY>g)k$jz{ zYho%dl$xoDD)T||b+mV@4NYO{-ocGY{zE@(y(|T$*_g;C?wo8bp(^$#)$EkFInMO6(jM=Jo(+|x zL>q84CG&ZV$M+(57Cg;Q&h0uCU47rJV#36b+gt37J~^?2WSHfKLK9&UT5W+$dY0ul zL)}0u^sZ)7GD_0DY23R=*VXh~2QjAg*F+(v zjCdn2%&U)eyoE%9$9sGsng)6mh_^)=}ex_V0vrX(i zxkRcO+IvJq!(F(m+|DfSl!7^@#$VrN!+Xle$H}0+=!N28wgL7K=_&N>GEC&4No#^5&qyY`_`+en1RCB!(=D2eWC|ChB7pHQck5|x`Uj| z^e&IyQt>Sd!s`t+(I|!*5Yr#pAqv{1O02W+xf2|3oxL8K%48vo-ANp3d^t+&I1xCD zNsk)MrMGS1bgC}1K&-!!PbTj7PF*AOX;G2m|#psVaWX(D{>#TNe4Uuc3sW;L6xr}l6Z9F!SrY>5m zT#chPROs0=w_`?l8XouZso~w|C9VFaq;I5dy>llR4JqBho+nGi-LPgJ`2KS^rtj@1 zf7*}R%IxJ~A4qZ;;*huHDe)o>hTy4vtQjBPfj)^`p3hvr)4^?n-u;Z?qg0b7_I%6P zV8idt_0H#B8)8d8)8)%$?VZh&nY+fd@(Fos6_7viRU_u#**TMSBYZ`cglV!!UiS>} zDN7Um{Y$mtTpr-pgmphW>ZcAnYz3`zGTOsXaTbm&8zfTV@#PI$CAtxqLXLlWyW0%! zq~UBvGaY0Oq09YH;*7%Et|3dWA$#$`Y6y5}{#KVBs!0?%-;F70#-+gJ+qWzBgNFr9 zh;cc;71ip!=l3s$cUC2-eM#nK^3+`?29Dm~PygP-{<(TmhFWwBjnPPF@OLrsU1)*O z)>$N5x7F=jZGED;8kN}lQg5nWt?RrP+P7o=2p87)X-_|jz839^n~&?`>aqjPKCkYs-(U zb-kooncn<{+ND&efGtlKgU0sPZrzXKcj9sVl$Lj*lF9GepYqU7u>eZ4y0b$eW&h7B*Z;JJ{QCwr zz(EA~(sn!O74L=fH@L69JTC%3_<0`r_oZ}T-yJOa1K&en=MW44#kL3u>VEBa3Cr6_ zF#z82aZDOX5t{u&cP~_ZeM`hFd<`F*sG_H=egG&8AO@)K4&mq=4=mFK2Si960vCM% zh~RBgh!UDkW`fy1ejn5MS;rAgb)Go%s-D@D))~~Y69VFVIH1GE|q)LS?SNRAYa@IAyCV_3XvW9)^T7~#c0q`Mc=m%OxazFr2ORMa z&$(-1{<9AQ%f0HXbO{EM3NPjp1(L8Xc%odiiC$XwtDZ}LCIW@wI-V%to9tC*r9V7T zgdo6xc&bB)0C_S3Q2w+1Qi!Bo@?3IbQq%F4K`3BZ*7;^lB@6&;o>S%oAwtp^sB-u7 zT$d{Uo5>PN(D`6634mb0_uD@vOIPm`C>ao7Ks>7;M1TqC0VoaUk$-st`-}gW0Re!O z^G{Pq)npni4Tu5#3F3hxLH)%j*D4d`{Lu72JfNihSSmmu3`v+= zfC|3x{>?1`_2T{rY1U8!!PxxGEdljnmj;6Yl?zE>pmM=C-m7j2m&(0Hj=*v|zGP_O!leX)*YcDF>x-?OGM0{QxWXs!4($a0Ez&XpmHR!4v)b z5g7afaKRHDeB=F_eF8e&wJ==gkxMGPYLf70-O(Yb5XAFZVWD5#_%0>*n|%Vh^|d^~ zciXEb372?Y+zY{O8=zTB1uOS&CJE>lTQe98s9Z?G0wt&iOK{aB!4EhBwC?Di&j*7g z0KtH7vR6$KE|vQY0t|@fZwL`kf(w_BOUrWAB*71OEr=(^H7cYBVEkv31s*OgnIxQ> z56pN+cno*;z)At3D1dmN!vzK;IbIOP5C9H>I3pOs=aEZv0C49Id;btt zJs%8dVlj-)BbQ(K7Xe_jpGW?E z75)F+BLU+RgiN5<%x54(F4_Pvz?-G6dL&E%ul?tB_-nffFo9|QlmhIv`v{d6tQKClE=JrewY zBmOD(S`}h~H%tA^BLQ;{0-Fn-SZEL;7xKZvIgebLh^rn6e!u}Bo>u8@>&=-FrI(&NWeNrgvCd$@z3f`Lx2JCgd{8wPw-}`zj-8JU#miFGBBQ3 zJre%##HP89CpJHX$OTXAi(chRGXI-<0=DwCFh=K*OE6bG68@|^HY62Z%qRA>!ot3| z@m)&rH}?eWlxumu0ONVpBjFOyi+drY4;}V@_F>>X`)?iz*pO5RDi@NlfXl)Nz+Sq{ z6X-o~$s^&a_kbU8FvxoV``7t(kSOB-GyZ3VuG%I1sT>Ct0?Y+v9BK%W3nk$&f+e_Q zmjH8N4>jxu90B@B;an?792qc}s~!oLU?2$+#Pjhv48(~5-*2zFCtR9{^IQ;M=m9uU z=aGK}`FD?mIN(T78zauO%ET$Vj0cp|RgZ*Av>+)HRQE-%JjA-eH{QQ_B;cGM;ULsa z2Ef??<9XF1!4Ej%pJm=X9}LFkf+sE{gv3o_OFJ?^X8%Kj5|h@Vr)qc!uW*F7dqT zk?==8c#u>G;^})1192k2H{Pr636~NiT?+%g@&3&t0qnr z;9sjkeDK}&sz<^lo{HDY)-d`Kz;&1WfO zp7a3x|7^d&?fjB^0=O#yB@hI(o#S7~5t5GZzkm_GWR`HndjS99rU(%Re7C)1mT=`z zg%3%N7j+XrQrN}%5P@kFKV=4SN0Iq(MFzk=Wf72Wo(fv@@3Teu! zTbt_Il=x^(9~d6Rz>(_Q*XZPH92xA7yMV`yZVL!0M<{3d9AsT=2NSP7WXi+0tvVS-0ICdM}Bf5@QD0yv!WrX z?O}uu$0w{F_?=R-($i8Fl7J&9^K;K|HJXrU-aPUKe$~RSjy8 zgcdf@Y&pHoZ}qg4g(PJ7l$YCjQv{^5^#%jD!69rdHo`&@mW^mnVY0FYm-!YWqD&2v z(4NO+Rfcuma3b6QRmcW4d_r3=YHHe_RT&FO5X<#k$U2`Db?P}Pi%-b#?R;S5LbVaR z+<%nL8YH2mSr)HM_qi%lgCum&**}(U<3vbjw;Lnk+$|&_Ljo_iJAlcq&Z8I+WonRw z?xa(Oj-~UA#X9x0l*K1xs5bW zR1K2Q6nAY)pBc)guyc;EqC~$wA?}8 zw-%C+;aj%qaKbOM)ePTYWcw$x4oN_Z@Koh+)~UyWJ%^ExhK%2AcLD=gd;(_7f{S(> z^u=o-38KtBsHiUr*7?+luui&?g-(l45C$mPad?RhL>UW7$dE8Ew`j*vU%VEQu&5bn zrdhd~mOCa?qaw82aSJ0tXAP1t!n|dn%u!XwLJ~4$@N!4bj;zx&7VEsI8dykz*obSG z>@N3~DpP|bjEDu%Wmu(S_@MN@op{u=ZTYI*(%+SEs&sEhHhsr@RsCGsQCRUA*v1 ztOiL~UvnrVkpQ-dUMvbWrc?5HBN+)3ZI z7Lu^&oP0Y1Bw;#&Iwd4wcR&&XlF$bvAs`6>NeDD%k`R!DfFuMYAs`6> zNeD_=@$r}-%H}lhX{wwvv&2&M&QvYyB!gR&&l$uFT zOIb+53;33w|4-f&0WalFu>noSi|79qpOBXZkBeoVV?>m(kc12gv(Dc!S-s9@o&P!! zez&jZs4PBVdAGlzDFW4i%4~LG1EJGG5;7#P&P{QOV56s{EF?jwp_yi-hL*cIhH6xV jb$*2rp|b!<;N(jx*`g3KWbA?D9nFT4SD)c0O|$bIu%hhF literal 0 HcmV?d00001 diff --git a/upload/forgot.php b/upload/forgot.php new file mode 100644 index 00000000..3f94af7f --- /dev/null +++ b/upload/forgot.php @@ -0,0 +1,53 @@ +reset_password(1,$input); + } + + /** + * Reseting Password + * Real Reseting ;) + */ + $user = get('user'); + if($mode =='reset_pass' && $user) + { + $input = mysql_clean(get('user')); + $avcode = mysql_clean(get('avcode')); + if($userquery->reset_password(2,$input,$avcode)) + assign('pass_recover','success'); + } + + /** + * Recovering username + */ + if(isset($_POST['recover_username'])) + { + $email = mysql_clean($_POST['forgot_email']); + $msg = $userquery->recover_username($email); + } + +assign('mode',$mode); + +subtitle(lang("com_forgot_username")); +template_files('forgot.html'); +display_it(); +?> \ No newline at end of file diff --git a/upload/groups.php b/upload/groups.php new file mode 100644 index 00000000..f32bdb35 --- /dev/null +++ b/upload/groups.php @@ -0,0 +1,71 @@ +page_redir(); +$userquery->perm_check('view_groups',true); + +//Setting Sort +$sort = $_GET['sort']; +$g_cond = array('category'=>mysql_clean($_GET['cat']),'date_span'=>mysql_clean($_GET['time'])); + +switch($sort) +{ + case "most_recent": + default: + { + $g_cond['order'] = " date_added DESC "; + } + break; + case "most_viewed": + { + $g_cond['order'] = " total_views DESC "; + } + break; + case "featured": + { + $g_cond['featured'] = "yes"; + } + break; + case "top_rated": + { + $g_cond['order'] = " total_members DESC"; + } + break; + case "most_commented": + { + $g_cond['order'] = " total_topics DESC"; + } + break; +} + +//Getting User List +$page = mysql_clean($_GET['page']); +$get_limit = create_query_limit($page,GLISTPP); + +$glist = $g_cond; + +$glist['limit'] = $get_limit; +$groups = $cbgroup->get_groups($glist); +Assign('groups', $groups); + +//Collecting Data for Pagination +$gcount = $g_cond; +$gcount['count_only'] = true; +$total_rows = $cbgroup->get_groups($gcount); +$total_pages = count_pages($total_rows,GLISTPP); + +//Pagination +$pages->paginate($total_pages,$page); + +subtitle(lang('groups')); +template_files('groups.html'); +display_it(); +?> \ No newline at end of file diff --git a/upload/images/avatars/no_avatar-small.jpg b/upload/images/avatars/no_avatar-small.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e40158db23aeb6499b4cab1d6bbf8f0077ce2dc5 GIT binary patch literal 852 zcmex=R#4GXS5VScl9tgh z)6mv8G&V7oSF^COFtX7zGB#x7;N;}t;t}WN6*p9rQ8XkO{6E6Dh=GBTl@SaWpn#Ey znFZ)F4o)s^Mh0ex9FT;_B1sA`FflSSGqEtUva+xMjj097F|Y`-3Mm>ovIz$!vMUve z7&T5@$f4}C@t|nX#SbdRNkvVZTw>x9l2WQ_>Kd9_CZ=ZQ7M51dF0O9w9-dyoA)#U6 z5s^{JDXD4c8JStdC8cHM6_r)ZEv;?s9i3g1CQq3GGAU*RJ2VdF$b$$4{OPfBE|D`;VW$1c6Rw zVqsxsVFx*xk*OSrnFU!`6%E;h90S=C3x$=88aYIqCNA7~kW<+>=!0ld(M2vX6_bam zA3?4LJDNB*H<9INxSQcl{(pc$kb^;vL5`Ub=z2j$W{$%^^O+7ZbO@a?{=WOkvj(AO_s_e=9_8BhRC(h9u0GXm38^<8 OeBgQ_f2zU$|4jg)tSvkM literal 0 HcmV?d00001 diff --git a/upload/images/avatars/no_avatar-small.png b/upload/images/avatars/no_avatar-small.png new file mode 100644 index 0000000000000000000000000000000000000000..8f0af01b34f5f0cae1f41d479dbe71c62d1a4377 GIT binary patch literal 1460 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 literal 0 HcmV?d00001 diff --git a/upload/images/avatars/no_avatar.png b/upload/images/avatars/no_avatar.png new file mode 100644 index 0000000000000000000000000000000000000000..2e3b8a5f07f1d034272f090a1d072abc86188c20 GIT binary patch literal 3838 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 ANdN!< literal 0 HcmV?d00001 diff --git a/upload/images/category_thumbs/no_thumb.jpg b/upload/images/category_thumbs/no_thumb.jpg new file mode 100644 index 0000000000000000000000000000000000000000..509366f17a3fc417ff36c3ba49b40abec33eecd5 GIT binary patch literal 4293 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 literal 0 HcmV?d00001 diff --git a/upload/images/groups_thumbs/no_thumb-small.png b/upload/images/groups_thumbs/no_thumb-small.png new file mode 100644 index 0000000000000000000000000000000000000000..72ee185aad1fca6b3a68ab998541458cfa7a3026 GIT binary patch literal 3278 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 M07*qoM6N<$f)=GSxBvhE literal 0 HcmV?d00001 diff --git a/upload/images/groups_thumbs/no_thumb.png b/upload/images/groups_thumbs/no_thumb.png new file mode 100644 index 0000000000000000000000000000000000000000..22278422c3b52813e7792e2fe6e2137b8f629615 GIT binary patch literal 11024 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 KMNUMnLSTX`gT7G! literal 0 HcmV?d00001 diff --git a/upload/images/icons/XPButton.png b/upload/images/icons/XPButton.png new file mode 100644 index 0000000000000000000000000000000000000000..df7aa6eab8cb94069d2bc5d640eba51bc9ce5fc4 GIT binary patch literal 1855 zcmV-F2f+A=P)?00007bV*G`2iOS* z76>od-3GY;000SaNLh0L01FZT01FZU(%pXi00004XF*Lt006O%3;baP000KgNkl4+2tEi3zEmZMMSKzj zse<%DBKYJ5gah8i}0n|dlOd0|w-qe(W#l`t$ z?~{|JD&r|gD+XETf+z4|zrVOYm;2(iPi>~L;&u_ElzOsP8|MX1eWG74CDMAu&44PA zZfR+Ug@qY@)PZ%Y_Hv9l&Wq0*Y4D%4KB)QmJ7t5E>ll|xb(Go6adtkdc4+fD(~2WY zk1!7^iYQ&v<;O~(4tDC$#yKvPT3bW^c4IRwWPYZ%m0z|w#kIDsgSolsGCSJb_HQ>f zi-k;gRwg_MT4K|E~ab4#2jCyg@7xrwW=^`RDaQ(k0r*&nHn zbmsCXEG|S#a^epg?12gik6)kRvJrXn(_xyqc?XW{-3$X;I>H{K|D-`I+Y>kE;rPfU z*w))6@_6X$AL+NhosYdR`0{go@cBDO2)_*#%1Qi@F9_X$tD)_6^YGe%$Dw_VT4T4- z#gdwYFMj$PX7jB;wjchOo;lVBt&4vFsc)~n_lSb#W?-)A2^c(jL8zhaiD|xr(QWTS zB==cAF!~|1CI2(jP$-K1%h1Z=2FjnIiJIdzaYt6n#hNtk)r!PZ%(S{Zq{CE0Wu8Jg zQI~Xg#j>*1P~<6z{ghXTFCs#5rH2IO9p8u+;csk6|07_Y$iNR(Me}n0{Ao2 zQB^}BkJ*fI&8t`q<<~TED%8U&#N_UkF zh8nt2JqxdPd=~Z)1ILN!x8YXf-~%-@_9#D6E-9imL`qD0VYWsRfBsPE5o5-<%R^=+k`Lrv*rNzB)6$c4l>BaS|| z5UV!kQOD}^h;Q+k^hDZ4@X{Uuc6s|3$8?X)^q zT6yjIkmIcS*XxyhUO>*AI!PbfwY#cs%#5IC-4C2U_s{CQIa!^gQAR;k!4E_|wUH;6 tgHbm^8RhQXg|NpIIAP?8d{?C~_&=p96%WXS@Jj#y002ovPDHLkV1n~|kk$YI literal 0 HcmV?d00001 diff --git a/upload/images/icons/cb_powered.gif b/upload/images/icons/cb_powered.gif new file mode 100644 index 0000000000000000000000000000000000000000..7af31cadaa19b6d7c7dc191c535b7984c2b3ad9e GIT binary patch literal 2359 zcmeH``#;lr9LGO1Z8&*waL}TY%b3j(r$RZW#>ApiIO>#AvrfxBv?D1+xvW`bl)|uz z#>&o8iHgmg<1%qbBXe0Ub2;vY@;!9Ue^Jk0UXS;0@7MeBemd`Uvfbem0=@?e;6ETh zga8!+s|g??6(X{rg9o`33MDKoj0zyC0J?mcdzs5+Fc?XCh-6ietOrZ}9+9#h+%{Cb zL)f0?yfZB=jim-yM2O|>!JwWbb58^0kUbxs z^5S5W^8!wA*Z7+k;9Xc)_#6d_z3?w}fPe}K)_?>ONB}`XZ6LhQs-R!2O1)Y2@Ln}N zswU`QO-@$rgUotbWTQT4Y;0`ua%#GIwka;6nUf_l1fnfSQACg^Dn#_`$s06y!;EVs z9caB6+WM-f%?Pv=7q**#4lH;}i+Ee~=iAEC&d$zvl%rydf*7wa4h`xuRp<&1?h=%A zRSCOsuau% zsSiGXFl47Obi#8eFLUT6Z%9-NmToz#~(P^HbT(so~yf z`i<%Q)ag~^b2H}xW|CrN?%$eeu9^{5%wD-L%egZPLG#z*=I3V@8p`Cc7v#{#rNzaM z5CpMu*Dkxd_wwZG^#3D#d10`q2m?S7n6Fh|b0XpM4Za%j)rc=ohR=t3dD0i7rt<->6K~-Rj?cSbd$E18e8?mnoIV+7!&MEY z2?>8?*q-4MeP~SMU&xzccEX*j(pkim__wEAHQmn?v!}I)``4@8AlOht{Mxy$d2z&=oSMBRd#=p;UgHy?3kPv7E3|V$|9B}<)7Y~( zy7JXB(!zvLChfJ4T96A|Q^zW*b3ds`hmOM)4Wse!PX+kwDA=ah@~i4jn7&x8L%w}+ zx)hoZ+~K2%;y0?BNj+#BOUJ-ocOR#pZeBFppJ-Ww8DRXV;X4px*vzM2SIMKn=-Ut@ zWZbAH}gxYNv%}Y~1~bT-$Q#^>m4)(HK@W zw$&}Du{7Kb+d9ni+R8y)P?0^A7wQ%;Z!T?!Za}dbEbo^hNbn+(>(X?a+W_kU(k2*|8J(R-+sudaynhucHbwAMTnor{mwqO^w7JHzaBsT z{O^B8RYf5+LvDs&KmRKVd78=o{`1#HTiEo_OolaGleS)G+IQ#sUI`b*pv<`1zCJ=H0jd{{2S>p`ri%{LsXJ%FbMS z$#S`6f|?OG!^Jxczkf6Q`UNF{l0Sd`ad7zm>({^EzyAS6{{CgrkluOb3l1A>ZU2~A zK+FZ=zkmP!`TOVhpFbzBzFaPmD2$N3;+$pK?>zdet`f0002ovPDHLkV1gy;I?Vt8 literal 0 HcmV?d00001 diff --git a/upload/images/icons/country/ad.png b/upload/images/icons/country/ad.png new file mode 100644 index 0000000000000000000000000000000000000000..625ca84f9ec596848d4b967b5556fda897ca7183 GIT binary patch literal 643 zcmV-}0(||6P)S}{rU-#^xW|9%5S{`_G8k=zVG=|5luWB>#JF#yj01oZa& zTu&JQ008~}|NQ&{0055x0sR95`v3p?1_t~7{`v!N`v3d-{`&g=`T6amqXIBA$0h)T zKokWRkpoMx|Go@O4FvhR>O1p+i7`B6t^3)y2dJ<#?4I?d4x-E}Az98Z`2`TmzkmP! z{`(J9{pauh-+zJD{JOYLhW+QSzkh#x`Y&wke*WLjpZ~u9`2XuCr@{^OJ|MkZb_UGR@Z=V>fB*iaq<8P{*B}2u-uMnu#J~U$KrBDL0bT$1_irEqiZcM6WEF7g<|*+% zzkjHi-TwRc=f7_t9|K*?`1?07lmG&V<)V$@{}>pUYZ(~+fDw@M3(WY1!T<=sp}f-o0K!lJ3<>Jc!&VtMslE3ph2^H3FGe(F z4|^}slF1@l1Nxc}^5hjjU=0la|37)k@b@neJ^1|l@87?_{{z(l6@kcKe}Db@_Y267 z<&g#201!YdV6*>2R0EZ*bYA%%2Vi7me5m>mAb?naPGtnD20MY__n-f`0mzg8{s9CK z*hzmtW)s%H$oS{aAAkS?JLxaT`2W9u;n%DD1Q-B%#%TuGpFSS|0000&5HW|5#c7{r(N){s9YCi84$~U|{$Glm>AD0*K|^yLU}ZO+eP) ze;~;4`#0mCzs$dX{r~-&?f370zkUTM{{OB1_1E8DKmYz*JbN)f0I>i8Q1#1Kum1f0 z{pZggpt}FRe*ORX>;JEx|9}4c_w(m__W!pfKK=atLxM{ZXbC_7vHbh@@9*EgK-ECy zzkh)Y{?EYhFEQc&-#`EN9{7Lq7*OE*@9)2U|NQmmC(vO40VtezBLF}U2%?OI(TG)& zJC>!~;SYmN-)zb6gc(7A-^Q(#z0vHb9!CJ#T#ii{@&pjek8j`pfX)5|H00+GpnLvt za{MtfWBC4qk%R63j~{=2{QLgr`wyTb*amx2hce{;{QL3a|BhWh#6A5bKmf5of*%NgdVm^$Zuo!gI_LQd|G=96g51yWl0Agf71rLE? q3XWqq@&Lw?Iyk0*94-cc00RK~MQKxxUU$F%0000= z`}|7!`YQYT5C8xIh~*yx1DgQ1_jkSr_QgN{Gn)!7=zkRT=l(yS{y%^Jd$>%yrP!)vVq~xpZ~xA{{HjZ>hB|)Z~OQoBLBm{yCqA0{k;C`&+mV~|1$jj15^wU zKukakbkF}kzkmk({q_6zmUTZaUWBOraqa5!?(V-pgMR}R{04?0&`AIR#PSE^hrdi> z;*7t4gLVFSJ$J5DTibsorq@%ai5h7B2l^1G@*gM=fUW@uAjYc<48V{DX@ijvE(11_ dg@FMezyQzuBHsGv+i3s*002ovPDHLkV1jTADB=JB literal 0 HcmV?d00001 diff --git a/upload/images/icons/country/ai.png b/upload/images/icons/country/ai.png new file mode 100644 index 0000000000000000000000000000000000000000..74ed29d92616c86757d3c0ec04378301c8f591b4 GIT binary patch literal 643 zcmV-}0(||6P)ocPy#thD++(+#W%SS0Qvp^`1%0+_yGC)0QUL-|M&m^ z`T_tk0M7pe&iDc7fh@K74M*k&0{8f*88BG;;GY6ve?;&4{{Q>_{{8&^`u+g@|Ns5} z|C?Nv0*Gb#mu+n4z6ZW~#qjy_|6ji&ZeIEMk16oyzH)i@Pk$MNxLARR?a#kwpMS72 zF)}cG2M8dRUN*~81wCz%$A2$f`_IL|A|w6j^RHtc7{2`lYG-KkQ{(*knSqh%3kzr7 zs%s1kKL7#%F#yj00-^B^D;pD^^AqC)4C(?1m>@q26ceiU4*2{4`u_d~@vQ*ykp&A1 z3h$o${r~^~`vQo?Pm-bY@cm79zVQG5%l!B6)Riap%L`bGemnT<@2|iAfl64!%YWS~ z`p0YY_dig_cYpw5WYAmG*lPLk!;jy8|NZ#~MF0Q%{rCG1ko^Di`(Fhkd3F{?py0c9Vg{{gA~^#>F<|Nj5KapBR^@Bf~CXSi|t;lF=C z8-4)<5DUX^V9+rDCI3RuUy#}V{s46X!}R~}@4ug&fA|+@;n!b(1zCZ900KKMX({{sIILBZE*UQbc|SngJt$+`m9Kz!<;5 dBm+Qz0RWL%NC2%sdjkLf002ovPDHLkV1lARHI@JX literal 0 HcmV?d00001 diff --git a/upload/images/icons/country/al.png b/upload/images/icons/country/al.png new file mode 100644 index 0000000000000000000000000000000000000000..92354cb6e257be2cade71cb825027ce8d9efc06d GIT binary patch literal 600 zcmV-e0;m0nP)PbXFRCwBA zyv)hK@{fUmi2(>${xJOc&A`II@PmN?BKC`c;SU)710$d~Kmf4-r6niy16BY3`}g0! ze=L9h&Uybegp-Ns@87v^zGQMU|NZla@z1Y+zkdVKmFbHB0*HkH4F0@)&iwE1;&GRLuzkX(OGXMMa``@o$|Ni_2x(y(Jn3#TnHT?el|IhC;U%pHK`}6Df z@2@|9J^lXU=Z~KvfBzi*^!4A*U;lv`e*Fge3Lt=(82$q_`~m9z|ND;$!(WEqze~6o ze}X|JFO$H(U+VvX#{c{avi3L7@c;n?3L&6l7=Hix`}emN<6i~#|7+iUWBL8-&##}m zKKx5zXJr5LA80nvkwCM6egFs{po9Y?& zL6B;olm7ns#=rm&Kp-3b{RIXY(1{??Ha=$NKfkS+|9@us$Mfg+93j@fzkY#y2y!;i z&kO(o1PWH5>zPHwn7|>;0Mz;WPl13iP!Y(WKYy4&4hBXMSPugOKmaiw2gk!dq!|4J mj$lZE0R~eis zC&uN{cDQ8`!@ZNLOqwtoG6nhzPx}SV-d6yzFfcIz75{(rngJyDkKrFw8iaoThHCr$ zo8k9wMhS^O3=9AP!~%5B|9}4(ASQtkLN$m1CV&5705X362095KfLKJhW;OjWdGY7l zzrX*$DuLu*pcFC#NdEr)SL!$SY=)lz0mSm_*B_u)|AM4JP)(}33zy1Lc&_o7? zKL7y)bkd){fBym<_v`mxpbeRs`+WRVot-5A{r$IX$CJFg13u{3eX_{0R++j zR}GCkSy{&4zk!krKoTg(2n-k?g31B}5JW!NMq0d0000q< zM7LZb@rX?|r)2RP-+aO3(7q?c3+$-Vv0E)PxM3SDV%@s`#GkZvw_x^WBa~uq3^l}t zWdf(j(=(>^SgETc#5#EZT(4ObRkfxbzP9G;yza0;Ygc8-_*?EP(ca#`l6-Z6D0{tL zQ4|~MCSi!9Q9YkW=V$ix#EqZ!rc?eWA0TwdVID+3aqrYUXUhCI)Ad5!(cP!BhhW$Ayb2&r8kK!bz*2`~UE W(Ndrek0Jg50000>L2MuI0S_Qs@5K5pO<^@m=+2g4|dxHaxDj0v>J*IDf*W zecCUFDxPFzu|k|#UPp%*tID(rKsti;{e*6(%7dHd&{Cj&O-$56MG?-=5&y6_vgkWd z?4G3wy$@rWp`sqh{|f7z@#!vA$<1%?r4b=Dxv>nBe5!F*3Tl7BOMt5tFFzgd^yBeV z0KmJw7)(~4OP!7Y*AKY+3^3nVv|tF-Da0FSnYyo!cst^Wl;Av4Y4@%s^2 v1J-b<=^`D$c0b|Xvjc?G$O*w>)}QzjMHX+B;YuJc00000NkvXXu0mjfLjBr4 literal 0 HcmV?d00001 diff --git a/upload/images/icons/country/ar.png b/upload/images/icons/country/ar.png new file mode 100644 index 0000000000000000000000000000000000000000..e5ef8f1fcddb9fa0b89c353430e9640c122445cc GIT binary patch literal 506 zcmVNL7TW{{R0! zJP>i}(MpzaSkj z=eqvqa`^|6{{QbQRQ11q3~Vg_kG}Z}5I`(hw}ncX8D4$|h64jUK>or*=^r$dfI%n0 z$3MKz;!F0w91GjkkV%_X`@4 wKR^hm`X5LwD9*v?4;TUC6Bz$&3;+QJ0QLcJ=WT{TU;qFB07*qoM6N<$f>3bX%K!iX literal 0 HcmV?d00001 diff --git a/upload/images/icons/country/as.png b/upload/images/icons/country/as.png new file mode 100644 index 0000000000000000000000000000000000000000..32f30e4ce4eedd22d4f09c4f3a46c52dd064f113 GIT binary patch literal 647 zcmV;20(kw2P);Rmc0RI30 z|Nj5|{Q>>`0R8>{{QLs@`vM01^D6+%Ap+Y10Qw3Sr3ED)s=c}b05Jg0{{#dC0RR60 z)z$y}`~dv>0Q&p?0Q>ne0Khr|#}EMN1`-ttJvaFq6VTDg`OMJS*4F}vg#m0fQ1$QM z42u6QTCg3Kt8+Li1J#Y_zUd>4Lw{URe1tEjLbKmY(S0M7pd(g2qsJ0|z;{R`~d z`n<6E*3bb41p*Zr{{R344LkeqyaMyV01O!W0PZ0+TjlEQ0st`p&i?@b0Q{Gi0m{n% z`T6-B``1JQx+4kM0{rp_FfRy7P6Qq%_1|&<`|JPx`Uew8u)+%h2+ zdiAI7xt}_}e|$CmbI9$2>u h*D)|iF)#oG7yty8`q2#I8zBGy002ovPDHLkV1j5VEF}N{ literal 0 HcmV?d00001 diff --git a/upload/images/icons/country/at.png b/upload/images/icons/country/at.png new file mode 100644 index 0000000000000000000000000000000000000000..0f15f34f2883c4b4360fc871d7105309f1533282 GIT binary patch literal 403 zcmV;E0c`$>P)@|4`Xj5kLT%`al?B=W5I`&prl$WjwHQRjfmQ&G0jUOA z@&|Dug_Rm`2Y251|$~)1M2@@6mI}!8O6olw6y^Q z5X--d7nzS8`+x5q12kBmVFD!~j6c5_fMKno0(1^Q0I>i=is|LjXX40RRttS6cG0UZ?;7002ovPDHLkV1fxUnjZiF literal 0 HcmV?d00001 diff --git a/upload/images/icons/country/au.png b/upload/images/icons/country/au.png new file mode 100644 index 0000000000000000000000000000000000000000..a01389a745d51e16b01a9dc0a707572564a17625 GIT binary patch literal 673 zcmV;S0$%-zP)>fJ3En$GhGS>sbE%%m3$AD)q?8M9y>88-}kR7#RKlk!P~Y_PLuF7~U~3`~nC7 zF#yj00ZUDdpLsm{7ajP|&HwoK0Usg|6%f4L_{`Mi{rvv-`ukf=Ed&Gs-sA7L!Q7*a zj{*QO0M7pb%?Sw^g@yy{>ihEY{`vU@3=8@G0rvO$i3mOL`~mv-`W+b$Mmr&io5dg< z5v!7q0*L95jt`TzK8Kd(Utv)OSp_aLv){6ccV+Z`{Q2+asKUU&aO3`Kpz6wW8wp`< z28M3{0mSqnB#A*-c*8%1=RD#sSOwMznKA3=e&iEzwo{cA=PgXK`2OQ}gqId83!|%* zA_Kz@fB*n70M7pdECCwp4H&@R`1|(w-}M5x*74i)0}%fAt;XafA{48))#>Z>?CD#}*e}Ret0tl$#*RMZ7}Jl7Z|M45`5*URzH9L z{rmSnPy;{!u>dsyO%meg+00000NkvXX Hu0mjfN{&}S literal 0 HcmV?d00001 diff --git a/upload/images/icons/country/aw.png b/upload/images/icons/country/aw.png new file mode 100644 index 0000000000000000000000000000000000000000..a3579c2d621069c8128d7cf16440d5e45a3ab3cd GIT binary patch literal 524 zcmV+n0`vWeP)^}0h@W9fA9JOn#opKkr#VO<{LPm{QLg}EdH3Vb1Zzpp zqiZ+XNBm%5{`ViKi{bCTe}Dh~2a+HyfB%6Q|9}7eKVjxEfB<6Q<6r}-{{7;G=hB{; zLB+p+|Ni^;|DXT={s75;AoBO$f4@PDf8sps4FCQC1Q64wUw^h*hy4HZXO3U)@85qw zD*pci8U|DWQu_BVi2MUWKoOv;00M{w=;|*lY_o%kegGx^{`&*A{SSok_usF-P)oof z|A86+0*K|;FQAM6fB*FtoEI&bZG5mq328#as{}<$F zWDQ{Ffz1MH001phxCBNdC_2H6U$AI~GQbEJqg*Ti0R{kQ(yH?TRrCY^ O0000^@RCwBA zRL|V|7QjV)*ul;Rlceqc6W0{`~_8AeMg& z|LUXE8U8c=`}dziv6P|mEu%JjM}pqh@65md|Ni~w->=_)fBgZXe?Nc!ot?WGAOHX{ z0M7pe`uG9>{{ZXo`u+d?{`u+u=j#9V2j%Sc^797z|N8p+{rLO+`TP9&`u!FW2mk>3 z0#G;xDFDDQ2vg|)-@5Zw?JVTrAxNs~5&|AZ;5uWfQ`vUsMGm`>aGWoI7=P|oW>%~E z|Kk8dq@aG@HzdsB>fj@shYzX-a%=q<(frSYmfLIv5{HbzQ${~M_P_y6C&m>3uU0*DFd0+8#0#Gk)^|NLQBRAyCBeB9H+Wn{=Mr@*PJ_ZKV< zB>w@GFfafF5Ks>TBP0ZV{bBt5_ve*sKkwd`OiO#eX6=u=cfX!E#rX3NBT(umNC7Yu z0Ro8S7X#4ce?Xr63$phg)Bk64X8r&5``_O`AFf^jc>p5y?+^38KVKLa00M}`wU!~x z=I_1Fe}Df4D*yZI@1I|PfBgnRptt`0`2{iqMpRNPo|?TW>MPOFW(r1_!xlT-yep5|G*@e%^SFxf#DC32@n7=0M7pe00011 zNe=7o{FIuhzQ(sjF~t7>`T+s_0sj00{`>*}`~Uy^|Ni?^Z7Tcx|FW0O0tlpm;s5{T z+df{s^E1rDZN;v4VP>0|8GkY`{`&t1s2YfV{r~st=KUYCl59Xr00M{!Xv@F<41fPH zoWA^R$>xvtF5yd$xc~X{7o-}f=ig7DY9RXc``_>1K-c{N2q2&ahQEIq{`~z1RCDs; zw*~7zIJ!sAKj8J}&!7K)enC|K{|nUc|Mwq|27mwp*#K1f8;Jh=2byv8+}GKw-@AGz z%-rMu^XK3HKtBLA{Qvdq*I%FsKn(x^1k&&qY(LP_Uw?q)|3jz0PF?=a(?4bU?qHzN z5I+E=z&88?2q2IKpz*){`~&I%+VJc5-=Dw#?LYB#!lHLRL7BZ8-NZ5x*TXaKmf6TZ20qEQj`^F;~x-W z05U+*fBxNj@_W(7kJ(ujGnWgh$g%(Z2hso#K#U9wI~hQ+`3Dk_7z`j1tL#*2FTcgW f@C+EF009O7>dRn2w6d?H00000NkvXXu0mjfueTzu literal 0 HcmV?d00001 diff --git a/upload/images/icons/country/bb.png b/upload/images/icons/country/bb.png new file mode 100644 index 0000000000000000000000000000000000000000..0df19c71d20d7fdc06e1cba01028983439b2bdae GIT binary patch literal 585 zcmV-P0=E5$P) zj51&U|NhG$_=oZTA7 z0mJ{l|Ns2{|Nr-Y#^3*c{=WU_!>_-;fvROCxPdkR1P~M0Xa=C_KR`47{sXG+pY!Yf zqu=)*{%)W0>;M0szkdJy_507SKYxDz`3KYh5I`&-cY{^``2$3Z|NsB`^ZWO@y}$qd z{r%_nFQBC$4Is{6hz5WF0@(mI8^j0N`~Tl>LzQ1Ye}a&q>MtPo*RQ`|OMu4x1!@2Y zAfSdne}TsT{`c$8-(P?J0c~)w`~?J`zx?#Dg*yp^z&88=2q2IKpt(TRKniTbum8-y z1bBWi0e#F0wgIH{FVJ|Pxj-8L0tgsNfByUdJMs7b-@h3^8h-!E3i%CU{QCW$1*GB6 ze~`2PfHeF82q2&aU>N+96yg32bmdP5238q{|Gydk0=52OVEN6!@<&OA7Z~7wL16>b z@DCt>7#SFn85mf=5eY;LZ#OUe_l@D-2Zn#Y82<4v{9|E|jkRQ8_`$&N0jL_N03g5s XX0T^_9W~6o00000NkvXXu0mjfXpthO literal 0 HcmV?d00001 diff --git a/upload/images/icons/country/bd.png b/upload/images/icons/country/bd.png new file mode 100644 index 0000000000000000000000000000000000000000..076a8bf87c0cedcce47099c6b74b59f2c9d1dbce GIT binary patch literal 504 zcmVCcfPV}OzZe+)fYC1)`hmpw%>WR9L@~Dk00x0r!@5ksR;+hV0>ZLfIcBS@orh;x zv}95za5W)x_7^}bV3YqpdH?h;NZnuSC%?V#{+0gl`~RQckJx{&l>NO~;@7XgzkdJz zEh{VwR0LSuiyWGR{aKQ z00-R5+27mwp+3@G@Um)kt zzdstU{yWl9SIB_0ft3II3)BD*KrA2|{``^Tm;4PDy`=a1tTre>fEI#8 u{{2z<2NVVaum*qtVq}m+iAaI~Aiw~?reC_kVQV=60000gsB+3J~Dn`pdxgmx19A{hgns>oXkhsL8>j&wfIu2Rsv+R_ zAB5T1GyoL?1Q1BWpFe+p|Nf1n;TJ-~Kd@?uhChFRHUI<=#0HS!U%!8$YJib28yLY( z0tg_G2B7i3e*FSj@aq@44gY_`jRywQ69xu=0D?FP=vyd&x*M*V6|CV8P{Uu4OBfgc z0tjNmA4y3`us8lPG6H?}8%zRafgb(Cp!5f*6oP{xAq} rF#LPR@IoIX4%E%Yz;K6w0U*EtuUcjA`-_J300000NkvXXu0mjf+>pV; literal 0 HcmV?d00001 diff --git a/upload/images/icons/country/bf.png b/upload/images/icons/country/bf.png new file mode 100644 index 0000000000000000000000000000000000000000..ab5ce8fe1237a18d6809a5570024eb108cb14a3e GIT binary patch literal 497 zcmV@|4`Xj5kLT%`al?B=W5I`(ov;U*021-Lr1*!W5(gW7O z@cTDV13&<=05Ky_HBiN$KMcQt819e>gHP`g_|Np;&&;0(C^$RHS>olZ*Q41X9v27}ar6#W9}0h{^{OajIK0?h(y z_zOe~zZd`lhy{p$|NA4!EeST}?;nUxkP49VfMx;1;V%&U|N9rH;SU2q05LM8GXV8K n(H~UyA0);fa6B_H00bBSQ>$p&WfB*UmB!B(-`wPhZ^#?@C^U5EbbPyl_g=3Hc01Sh${{P9=HB%4| z34*<3-m=C?^;L%miR{xQv2*hU;8+Y&0Dxf-W~KjsusWFAC4@j0#9_j;X5z6SjRhH> zd}sd(7FPhVFdSi!*Zj@;_Sc`kfByUdk|3A-`STmZ_yb~qxIp9o{E-p)bLt=iKmf7) z+|Ix(`{&<1pm88mK&}8g1WG~}e||Ik`OB#Cw~m1UAb?na(Zlrn4}+v6P!1@{@CT$5 z&-#|8y{IY2iKmf5omHz(^qAp)ym^JhN+jk7Vet{H$(Z8=>|AV=V zva&!M00M{!p&AHub^kXuF^G#pRQ&(-8^nMkpk@XJfB<6o_wOIv5C1P;X6Wwu|KUB< zc%X*g2-OTg#J~U$KumBafq;(A|A`a+OH08N{X($;=pP0KfB<5Fs|GR7oM!0i{{QYB zSm|$=!=N@Wf}I2qKuka<{f7YtBjf)QCj1u{`~UM7nrdKh0c`*VF+c!8{Q&j%sZ;-Z zd;dRshENS5{{S`og~Sg)05QIL^-54s5b7kL(8GuS8yfz9{>%Ui`+q-vfW*P*^_43C z0mK4S`s2qBh&}(NP5W0_$$%QQ@R)`GfB*vkck5Jby^kNv00000NkvXXu0mjfy0pt~ literal 0 HcmV?d00001 diff --git a/upload/images/icons/country/bi.png b/upload/images/icons/country/bi.png new file mode 100644 index 0000000000000000000000000000000000000000..5cc2e30cfc47452d5bef949628e955a522d59e50 GIT binary patch literal 675 zcmV;U0$lxxP)$wbBBJ zMTk#;k4<3e#ePFE;{?TciOx=-NpIdg`t|#dcz^$YFqm+of7AU<7UGr+0t^5F#PsJM z(2)${Jd)SmT+KY5@!|h>po)L5-!r~>3uJux|0`&Jz~QGy6a*CiGyVtq1|Wc#zWw|0 z_y6C2|NnAvaR2)A>-NX%|3Ci{R?!hvH~jzU``ypCK7Rkq&&~h)FDNvCApj5nF#yj0 z0_X_*{{Q{_|NQXv@Av-qBMmR$teo!O*6-%u-J+8r3n~2s`s?uP{Qmp>{`~+900M{! zNC9;}eE(3IS9-C{62AZc<>Jx>%af}0@?r&05Jg0 z{{#T;0Os`NWh`ko4>SM%|Kw(60099Kad7|t0qcf^`tR-^sIP`Fhru7lkI#w#>Hq?W zkzqQ+@08y_|9v}t;{CEE%)%nTc=-MC@P)7S@!~g$((Ud|+28Q224FCZIGXF0FQ1zcbfB*dX_lJRr z;s3wCNa|2D02KoSAbE^!0Dxf-mZ69ApkCb5fP^9ydGO$cm6w`kGj(t#`M{tFlLo%j z*4%mm2&CaJSn02SzkrtfWBLcO;r%bLy5Gnoqrh)qC;VKmZT`F#yj00W%wG zw4zx17##T6*Z=hN0Tvey7!|wG?K;V)0{r{_`}_X<{Qmp<|NQ*_`}@YSvI2-@&cAgG z*R?p0?_>V(@&EVlEP?{x|1esA`||VNU68t8zyJRJ_3zg&hTp&0WMzR?0R#}s1|E|% zRV}tRkH6o2#3;(nsVMXI-pgBmh17ms`TzTu!pfBl%*_9R;OEbWDJei#0R#}sGpDd$ z96Spi@~bn7G5z{~^_!ZLy2#s;5B~o8&G`G*|6f0Ap0WS=_rFd2C(ubi4FCZEF#yj0 z1a!1=2e0}MwgDi3SU@2S4mePl{012eQ4J-3 z|Mm`933BS6zyJRJ1;ztF0D(08|NVzmQWB*4&)@%$um=Y`lmy1W-@hDx{{qQh3=9AP x#JH7#;TJ3-|G=X54_FW_j)5c_0|P*S0RT0dOSD~(4;cUe002ovPDHLkV1hfJDkcB` literal 0 HcmV?d00001 diff --git a/upload/images/icons/country/bn.png b/upload/images/icons/country/bn.png new file mode 100644 index 0000000000000000000000000000000000000000..8fb09849e9b5712e9cdd8a2c25035da201535cf5 GIT binary patch literal 639 zcmV-_0)YLAP)8n_8%|dG+hlCr-g% z|9<~wU<9iE{r}%DMphZ1Jpcj3%*DZBWo-@72DFWlk(-gj@!ngb-$#D&C_i9e{QvLY zw|{?r|NHlgiHY~?^IHG`05Jg0{{(k=dF}7->+9=cXlNG}79t%T{rC3_t(pA#`tSX# z4jKOh|NsB|;rr`({{a5__y7Wk5omBxQSrlv5B>nb??0VZ8qCZrpS+?}gatn>o%-+B zPl=+||6st##PspQ2Y>)#{Cu5(QJ~_^?faD-pMV;E|7MwLubjQ@B-gLso$mVYgECpU zxpfp2fEt*XnBKpC4-fz`0M7pb@zVeZ8g>5r-~k2r`Sbhd;{WmN02I(80QmHEv)Ik{ z>H7Nm`}_MdF)?FhWi>T50*LYBMFw`s0-y$le?J(QfB$Fr_2c8e-`_!j`0PG|ckZ*_ zzkY$-`sc5Tips@{7Xbo@1sGC5IYwrQfB%2{|MTZR!ygX*-%McG4cZmTY ZzyK0(F$K@T-Dv;-002ovPDHLkV1la=J3;^e literal 0 HcmV?d00001 diff --git a/upload/images/icons/country/bo.png b/upload/images/icons/country/bo.png new file mode 100644 index 0000000000000000000000000000000000000000..ce7ba522aa7e948d581478432643c230eed1a658 GIT binary patch literal 500 zcmV^3LvnC{|x`%yaFl$ss8ha0V@6XKS=c-5cwO(_{}IL0ki=i zfLOjo{AE-9^-mn=h(G`Tfz|!{{r?|W+uz?{^yeR#!Nm9NlRN`J0I_^YV&Ikj@%Q)F z|Ns9m{0FN3^Z!3k!*8HnFvf4N5xas50L!z?-wXsAPk7$ ze<1l+iQ((fPYeJ7#KQ200VpKFA^{3Nph^G!{9^b86oDW}(Ek1R7ZiL9e}Ret0*H}e qBRB&8AR!3%7c6cef(%d+Aiw~vBYd|xMihYn0000j-HAXl7XJGjM{~r+i{r~sxzrQwG-&h#_Y&p;L z=ieV7_s^f-zyJOD{rC5(+EoAn1k&)I;s3Kw&;LT?{{2}P{Pq8T&j0^^J4?LvUd;UK z&+k8ffB*XXONL(tXahh1fi?X94^$0Q>Z$uRRO)Y4)uapmB!2(-ul(c1=C+V!kAF`) z$PCo;`_FHns{jIs3Fu;wy-Z(c2YwAz{&V4aXk?bejFO*Op&u`@i~PecqBpL@DIoojb8mb+WHGK%fG2>)a3=iVf_~v+`s?*1;!`?Kmai^I3i*ZIYtpN f{g(k500bBS@Ns{bTs^2gCr95H^s6Fo1}O2_S$Nfl}4;<}o-r{^R8Q_xtzX z|Nnu?|Ni^;2gm@D3=F@4EC#P1& zzuV{ie)#0qf2Lnh)j(~3VeG$ufPMl9Aczeh3x56n#l!R`HRQLfpFjVwfkN;%I39k( zVgne^e?jDThF>oL0*Hk{T6(^^8pGqq44*zhqZ1OZzkZ>_F(mFeH~<0+0A4S6=>Lb* QN&o-=07*qoM6N<$f&=*Yr2qf` literal 0 HcmV?d00001 diff --git a/upload/images/icons/country/bt.png b/upload/images/icons/country/bt.png new file mode 100644 index 0000000000000000000000000000000000000000..1d512dfff42db1ea3e7c59fa7dd69319e789ee12 GIT binary patch literal 631 zcmV--0*L*IP)?&DC3JV7l?ccjcgB=Qq4l4w|Q;eOZ4z|IjsEI`#PYSloM|AFHF zfy)2>XZQ=$@t;lU|F1tRzpnmg{PUOLH{-8A|F{4CvUU?d0I>k|0TuuM^_1cNUy$nm zzZn?*{^!*ACzSEy$NyhHzB0Wn`TXRU=!%=n%Ci4h82|!^32gR%glZtk^6USnb00o@ z{`LDW>%U)&BK_|-y-75RkKVi&O=|xC<=6keK+72b0*D2q;Xlai|Ns9mF#h@fM(h;aV>^!x1-zNu02XV-n@ zm3imZ@&EI0hChG)|NZlafdL?Zn1I0yH26P<=DUx29QQsc%}izF;QV-S-hYOl|1V4z zX|a-<=Kf#g*Z)7i{{y|szyJ_HEKEEM|C#>$KmJzoZa)M2-~Wm-e7Cl+vi)L|kY`}} z&A$F20RV*|BkB*O Rz6SsR002ovPDHLkV1m;fPLlut literal 0 HcmV?d00001 diff --git a/upload/images/icons/country/bv.png b/upload/images/icons/country/bv.png new file mode 100644 index 0000000000000000000000000000000000000000..160b6b5b79db15e623fa55e5774e5d160b933180 GIT binary patch literal 512 zcmV+b0{{JqP)O=a{vExMP2%`MCSoB^FIcLe_%lf;|~%E5I`(IQNh}3Ao>6Q|DFUXMn*>AqQd`w z|1kXd^B;tM|Njjl{{hM0zwd6?1Q0+hV1xeud-4=Wy?p-%sO`^#2S61Jzk!N?s)6X& zzhA%p|N6}=D+{y%Ab`Lc{sL9~1=0UN4*CD*7s%9KAf+JHKs~=eB-8KTKvw|-5R1&; zzd&a|ob(5%^Z$Q=wHy9p13+aOpFRNu5F>N&`Tk_-7w>=n{RejQzkfh&Kn{rf10?_b z{tFTZibx5v&dxav5I~H7|Ney-|DWN1$%1FyagzUW0464;_wU~W1Q5$TW@eGxtUvee z3vAf*8|igK9~@*rr66bh|NrkNM8z+V zAV?>O@ek;bKfu6d00k6 zPW&$KB`I@TtA?2x@Q~7pdcWi#1>DDZ2>MuG0I@IumHuaV^&7|soAMvT0IK){RtF@1 zgH;3B;_Qq-34j1%{P^)BFE1~|NkA(gBv!!4$aw$$eSiRB1ga=2D|__l(H|iA4T2Ex z>lc`SQ9x2&UjE?0g8%`<0`lvhzd$}*14J4{IhY2@0~G@V5J82%q9;EBlXu0U&@_82I`BfBC|Yn~P8llm?myQ3_K18=`^X_ivyEfB<6p_xd%%#*GZ! z-C&_V5IGPDK|g;X*gypg3;+Sd!XPTj0Q7fK5>&$Y{sHB| zjK9DB00sa3QR4q|tc?L6fSCSm+3>HW`NxbYpP7GsX8sK%KS9yYPfWi)GJ)AFzdp14 z{>t>1fsFwmfLQ*Ci!yxq#8guv=_mQ;-(Rp{AoSPbXFRCwBA z{KboB21 z`ppP*BG3|`!vO*asNvt=e_;3gWsp&PA@E<2jYs6ilRy6-zmSku5?~OOP=5aV@4sI_ zSN#QP00zQ!JD>SpAKYgR_QStF|9~F;2M|Ck zz%U1e+FyoWe;B_0VVclq;}vp_kNy3hKMWrj7*{kqJbMcaQ;_Pve;I)x1Q0+h46j}> zeiN4E1lkA+>|e|*mzJsW^M3)l^W_^hf&c&c`Mv->`48yHFF-%s0|+3-*GLfwiRNz% m3}3(u4lrUsie?}H2rvLBbQv(L;??y40000e`b1WGV} ze#gbd^&bp=ef-GykAYc$@BhDltSqdeSy?RXJpcawy+5fJAb?mHcsPJ&{d@EF@4HtJ z)qno||1xd*zaM|Ot4f#|8A1AQ-~Pubz$7IBv;-i4SQvovfB*ge{fFVtAE4aNE7yPi z`^Eg=5yP(^Ur(Q5`TLjM%#`8#_rHuB|9}1hItd_vSpNO`#qjs<|KGp=|NIHm@MXqK z79K7}ZvOwQ9Df%s{`~lX*xI%KzW-!k{Lc96Cr|@G0I@Lq`0?-epMSr9|NHeD?&umBG}6iH(DSogJte zDERNk_kV0Zng09%Itd_vSb&=T{rt@+B*66dJ0my{fpNkvBm!jpV_;xnVgd@XDk?Dx zh=IJyzyJ_HjJJUrz)|>#fr0nRl^;KTz#|yK`2G9$BS%LzureS32rvK^u`=B;c)+&+ O0000Vbu`-)NXk-Y`p?2$B#e1 z{(buQ`}e;;zyJNd_UF(2w_nb@VUiUP2igD-Kuin_BL6vl`zgIQV*mR8|8G|2U!T7I zn`-)Ow$bxne}9LGfB5z5*XcJ*K(;aeSD>o^0st`p&i@1e@&c~g4N@7~{}B9V!5sbp z`j|K8<@Nq-&kt=P>@pAZ`T7Q#;RiPl^j;kSgdzX}05Jg0{{#R8=f>y-z~LG0`u_d< z{QLg=2?6_k)DH^)`=sFo8YTUi-v;{r`o8J{6Wj>^)c^vB2^cJY|Nnmc_5b@He}DY@ z_51JdufKoSslWR1>-W9)3`r;XfsXn0`_Fc($H!lT!V@5Xn1Igu{qOIuf50&L{qg7D z?|*(LofMGa_%_k-*{}b_0g?9mMSwvE)Bq4bEIr*1})*zF_+U)&LMdEMOb{Nb-vOh6FrNC(tkd{&4;N%g_D$&)>g> z0^hO}m?z%iIsOJ1mka;_#K>R{i_RZNQ42x8VJSe8f#Ern2@qfa%&RHCyvg>Q00000 LNkvXXu0mjf=TkSf literal 0 HcmV?d00001 diff --git a/upload/images/icons/country/cd.png b/upload/images/icons/country/cd.png new file mode 100644 index 0000000000000000000000000000000000000000..5e489424884d2ec9e429f70d69af00edf242a077 GIT binary patch literal 528 zcmV+r0`L8aP)JkPqeYl28iLgD=0{><0$P44T5yOrT$dE?(KkwMFdoG^-J zGv9P)Kk|i5`lcNgUUAbboca5{hI)v&h!9!~`Yg)Ld}$VwYqqXn@gVLi>3LSVGm1W? z3qnDJAk6chH(u7f~FohUBCxfQDx8?5BQsCcprAnfVhO SHC~zk0000@|NZ~|iEi8i zh~?j3h8^dV0y&$fY|i?}`2XK;hJSzm|G$6#|L@;V)&KqZ3sU;$?>`_ZF38C6g#jRd z7@s_ODJ3Nev=9gw8UKSQhX4P)z5oCE{eQ>y|1j|H-+x9%#`EXT0R#{W1H*5i5@u$g zs{agN2m-%;fixfipeaCQpFe*F2q2cU!)f`}`5%6M06O*WzrTN({{8*;CkCkD_wPBk z=llWket~@P=ieVecEOTuB>(}$vTge|RYlbYUmpDW_v_E!KfnL|{{8n?G|>28zowm@ z_UrGj-+zAtrGTUoztWctUjPD#h2amw@BhDn5OHz(52cFPg zot=T34qlT?57Mzkg5?0ssOG0Ftp>paW8OyZ`_I07*qoM6N<$f+2k} AjsO4v literal 0 HcmV?d00001 diff --git a/upload/images/icons/country/cg.png b/upload/images/icons/country/cg.png new file mode 100644 index 0000000000000000000000000000000000000000..a859792ef32a02b41503b5ab5f216191af397e02 GIT binary patch literal 521 zcmV+k0`~ohP)i@P`2b{=v9^Ktp0uZ001fLMSM)r!?%mH+B91 z=ii?+(ckX8zrd=&8g~5t-|*}I50LQ;KzRlRfB=Hn08;wv->)Q*Kc0LLgTdsU-~VfV z{r~#=|1XdRMzE6r0tlo5X#B6gzhXrG`18Y*0!g6iieLY~Kvgqz}`W zLWO>Z3Lv@r7+CdZpiy8Ae}EeP0z(_<2Y>)#Vfe-1#`njMUlORAfdMG=o8iiD#%aG9 z#Q!h|feZ$rzkeYJ=p=vuV)VVru?7U|?FE@Zm|i>fBlzF zc~M_qKf%h=bAcoS;}NE7f8|yFe%B9?;;8%o@BeG_!|(4qhyo=(h-XBmKHXpc{~y!A z`THH3fsDVeudko)ARzm9UL&JI!+~uEM*rBES1=kd6zV%LH0J*N$gIQAc0y}k9qTFv z4h1oVG?rB#zNY^8{QUp5wE>>R#S4NZQd1i@F)*?OF@6y}@zmk^!Gr7L9asuAf!ae1 z{{CbBBH^Az=(+fAb?mHzA!MjRs*H~|NF=I z{~td;@BjZG-hUVsqZ#w(|L@=b|NQ>{d(*K^00G3pzycQk`jp|{UxvSb;p*Vv_V?Sr z{{Q;@@3$6WKrBG#F*5vR z`2XiW&+Xo6{KsbP_-SF+DJF`pL$*;0gaz z7NKVhyo`U;4*0+SK#>rfFFfafF5DUYXKh;r+@n*scPQUy6`!63S zGXn!71H*qtMn-04W+o=4|487=moEST#KiEAA;m(3;Xgy1iO{3BKc9a12~-UM7^Z`) z1qdLZI~bN-c=z}J|D88K{QmR*&tHcBxB*ZDKmf5Ya0q<-!`is-{h$8~f7m(x{QZSX zH3Jv`1P}|uy*o^wIGI2G`1kie)4zYe_&EQ6|NftW0ohon1}3I|Z{7d|5aVBMp0ssVo0Ek~;W>Z#0SJsA+2j`G% zv|UVeYYs-#Sn6_J90h1VosR?LBU7{U1rQ6+R0f9sPrg3=`~UA>#=n0a|7Q67_y6zT zP{j57|G!`V{{zu)Mn+knB>(|98e;E17s>tTLaMG-~Y>h{r`!g0jL-tfS4HmF#P%V_xIo5zyJLP zk|2W%e*G8w^1X|KC618W{eAoCFX+EI literal 0 HcmV?d00001 diff --git a/upload/images/icons/country/cn.png b/upload/images/icons/country/cn.png new file mode 100644 index 0000000000000000000000000000000000000000..89144146219e6fbec7eaa89e1bf4b073d299569e GIT binary patch literal 472 zcmV;}0Vn>6P)$bmtfBa_T{rmsVufH!rO2O)W0!b+P{TrwO zAb?mv&i(NBbu;G`sX*)cv$d*%>MiL-(QdhpkjakVmyu%k;sfcNRj;yhJaxT5MTg0u5&QfH8#Bf O0000XbC_7v4G9~kE;3? z$h?1GrT>4y7{3|*{r>Zd0U&@_82$jY{AFPH^Plk#hy=QU5o|Ds0oDLyFn~2M0QE2c z1P~*G;PKK9g@-SH{rUU<_aC4k|G@~v`1Kn|{`&=C|M{yZ!G37cNq_)iVfexD=MNA8 zh5p0Hf4_c1v;p<}|Ak}_F!%rh2&CcXZ-(!`82&@8$XA^gF6?xq}zd#y5N`WeVBbyB+frxZH0- literal 0 HcmV?d00001 diff --git a/upload/images/icons/country/cu.png b/upload/images/icons/country/cu.png new file mode 100644 index 0000000000000000000000000000000000000000..083f1d611c94a535e02954711486da244ec3c5d0 GIT binary patch literal 563 zcmV-30?hr1P)bRVNjfdgKH->)<41fMG{Q1Z53yA)}NHF>VM86o=*Z=~EMTLRklg;&|8vY-+ zh5rBh|L@=bKM?ZoKOp1JpMQV<{rmmr|L=eQfFkpA_5cJB<7Wm2?&_*f&z|!oCH%Iq zVPN&@1^xa7gnxhi`TP6#zh6KNfByZH;9_972M|CY z4S#m*VEXjw_teQhfB)LctFzlGTKpda#8eRa1F`|=V+j!s1_l{`0AhU0z`&K2_5c3; z?|=UACdB;@3Hy%?Ffai9!1(6P8-M@;JL%7#4}bn}Wu*W1^8Nqk|9@zxfJk8Yg2Rge z5=!5G`~e6c79IwMkAMHSMfCl8%kXF6O^EHl82Alg`~}6s-@pI={`>#;Kf}J}IRF8~ zc$$I1RCFdZQi0L={}0epF!T#d{sWT?V3G+SzyRi{Q|!NXWpDrh002ovPDHLkV1m+z B7Bv6> literal 0 HcmV?d00001 diff --git a/upload/images/icons/country/cv.png b/upload/images/icons/country/cv.png new file mode 100644 index 0000000000000000000000000000000000000000..a63f7eaf63c028615b2ded5878b5e14a7dbe962f GIT binary patch literal 529 zcmV+s0`C2ZP)*82p^=00=`tlmIeOf&y&dk@6oT z&CV8YCOfMzZ7b-;WHc4ffO0*K`UGc#9pHKW{n=1`s=Y4`sB0UGuD|F2(+4xFrs{6A+r|Fh*S$P>SRGs(%l z+O-QHfEa)O{tdAK=ovi517(5A-n@AO5I`)f0sl(Vm><0RZzq2;(QtLuuFT6X6;y@p zb-8u)9gSFj-3}5^z@SqUX4qfA01!aT3<}j|#!Osn3@^V(zxysO&hx#~ZN`f)vS*$d zpLlA?$HBnM&cM&k$j1o^^oKjY0t65vgZ)>ehy*ei5K#*ZyWju7F%Ll?01#jRixNU5 T4U6zw00000NkvXXu0mjf>cZT~ literal 0 HcmV?d00001 diff --git a/upload/images/icons/country/cx.png b/upload/images/icons/country/cx.png new file mode 100644 index 0000000000000000000000000000000000000000..48e31adbf4cc0074f40e95f87c1f103b91fe270e GIT binary patch literal 608 zcmV-m0-ybfP)Uz~~Q*L}q{yKmai^Fs!d`Rbj9@@=xl~KZbvQ|NZ^*|L@=bfBpc` zKOp-38^rz{DEepVv)`L`Yyt=%76t}3hHqR?<~aN{I`!9n&u`}MKs~?z|Ni|Cihlk3 z1w?Q7fI4M?HUI<=3&<7!82Y{{Q;@?^mDN?|=V) z{r~^ll=rtu5CcE}F#**BRkyY(adR>Mc_H{~T5^XRV~oVFSgBv#s=t2z{grn0SJIVV z|Ni~D^5u8)5(a<(0%_pmV<{@S{pr)+Nt0E6|KyV7{&xHKulY}Z0S*2Ic2cIyuhSoY z&3*a@=p=vu0%~ALNs$10lZEA9e*W!WzkWV{%9A7hYlh}ewm<)V{rd@2{rBIm&Idr} z{RV0P2mmnv&i?}d08{q%2kh+oUtbt0DGA2L@2{yn^Xv%Q%_4hjZ2Q{KfBuh*0fWjOcoPYi>{Qk`ejtlm`TPy!Q@c0|K1n4Ay00P>u ul!4(JQe+}W>@P40kp+Sq42=5$0t^6?P(4CrvcmZQ0000s1`2Y9I{~ve$KWO@Yukru?KTxgz{s9CK3*7Y} zZC_6Qf4TJkuQ&gHzW)Di+kXz$|9k=eg(Cm|XMz~|=g%L20Ahjo4`KiVr|y5|U;qEV z`p@?NKb!P_9;^R?@o<+hfSm*oKp+h;f&YIQ*bg)L>I;A4WVP82*P-nR{;Wu@%{Vvyu7@~4txIf`R>OD+-01E zIfRil07L2S-Mat*#Q65@TRuKMWMi;}EJy%|ff@h;2;_%%@7_UT@edf{0+7H22rvMY Ws9gjvbyTka0000? z0048MLcfb{@Lpld*gfdL?Z zSQvhRtN^J#x6%GQNHxSfxHgc;AD{-1tAIKH0tl!9q}uD*5!1Kl8Kk6va!f$;fJ%WL z`2Cv^NdEc54D$xi27mx!VfgXqT8ME7!~2)OPy-`SXu#NiAkhzFFflLy1Q-A_8F>@M S6G{sJ0000h<6BFn%a z@b8~2SoNP@zd$;E{sbbRuHQd?{QCI=sNwhbA3*&Qe}GP900=;09NYi^fU@pUdVa9*13;+Sd!tjgXKhXQEMobL97(p6<{RLvMGBN!7 j!N9=G@a-1^K!5=NcXWu!7_DDe00000NkvXXu0mjfeQx^H literal 0 HcmV?d00001 diff --git a/upload/images/icons/country/dj.png b/upload/images/icons/country/dj.png new file mode 100644 index 0000000000000000000000000000000000000000..582af364f8a9cb680628beae33cc9a2dbe0559f4 GIT binary patch literal 572 zcmV-C0>k}@P);we;9uK`S<6~zaM{qBL9B<0yBR7V`E_e2q4D) z|Nnpa!Ep64!{fLA8NdLj;oraifB*mg`;Xx-kn#6Fhzn-q&in!pKrBENJRA&WD*ySo z7*5@0`26EP69WTC_22)0z>5C-g{l_hVFa245I`UeKudt6h7^Mc@BgDW81BCO4-x~L z`sXhc{R3+I%fRsKA3y*x{R6rHsA1>M|6jifb2E4w{z{xB{`~z5CPC;Y7bk|9<`c2PXgjR$^CT@Hzz$KrBEfF#?VC z^aSdB^z+g5SJMxCJOGqNsQwQkfr0#&=?~CJ009Kjz|71H^!MIRd#Ajb^76;aUyQ$y z%m(TN#spBq-#`C>zGeUjAdrR+|30kwu=eoBL!3-pGMq9%bs!`E|ACMovw

    4;Zk2 z8GbPU1Q5%#7t@Nb6*GKbU;u{yA29j{CVzn$|6qa)V3LCYAiw~8(_SNKujRx50000< KMNUMnLSTY(1rd4x literal 0 HcmV?d00001 diff --git a/upload/images/icons/country/dk.png b/upload/images/icons/country/dk.png new file mode 100644 index 0000000000000000000000000000000000000000..e2993d3c59ae78855f777c158a6aae6c1fb5c843 GIT binary patch literal 495 zcmVh!ZNvLM`<}kPiIA3?K?Zl!VJuS0ABN12uI2v;s z000mK68GQM4oDR3?|C6;zBc4LR82Q1eETXSa+3nD0Ad8%4|Ml`Fn}2U{~ypshW{9V zk%{T!hYtV&#KHiVV*o?2zW>+&Bgm+K00G4EikX==E9>w5`yf~S`o*<00G4K6dZ++hy)_Bw{QPEdi2K7 l5H1Kw2asrHVqgFWFaQRwS@oh;XP^K8002ovPDHLkV1foV*8Tth literal 0 HcmV?d00001 diff --git a/upload/images/icons/country/dm.png b/upload/images/icons/country/dm.png new file mode 100644 index 0000000000000000000000000000000000000000..5fbffcba3cb0f20016c9717614127b89db4c9664 GIT binary patch literal 620 zcmV-y0+aoTP)yt}{r~U(pZ|aU z{rk@#!dhJXj+vP`D&$&!2yPR?Jud5I`&tqo00z_V3?cpb$_)%#~li z5Bw?p&G@T5&5h~tB<;UIJ-`3_mgbQL+5iwhOdtm^{QZlh+Tg>NcGo{qR#UR9ewx4g zlzHy^uRp(j{rmOj?;oHBfB*n70M7pb{ow!s5r+W$=Kufw0RQ~_o$a1N^GPoTT-yiw z&XGVBSbe$r0&xrf|M~#~9P-zx0st`p&i?@b004Y@cH`sX`~3X;`}>j`1PlZ1WGkKd zF1~FN+w&9T}cJeJULy4V8r?0tNHM6WN&<2126ppbC05A-~q$vMCOd&N)3^rn&3WaiZo>@dB zxpL5=L>h@#UjVT%{Q39iA58Ths0J3s|NohoLF&Lt!8(8c18V>XAjZFc|1vT%{s#lF z^Kb%2CZ>-cJ^%y|<6Q;@;r#qR4;}z*|Nr|B$h_ab1b6QI%fu2>dIV_O?>~RRu82tM4=f|&Ke}8;oX5+eBw}y?G6)5=s|Nnnr@aNATAPEpaEN{Mj=m^OD z&%p5S|G&Tg{{H#<7bL;LEGj9<&cFmz{_j5mJbLs9Ab?m{m{|TZ{D1lB9Z2clKfnI{ z`ThHs^2c9)q;CF`l>Eoa3N#g>nv07INCE^93jWH3lKe}28-VENu!{qxMpm&svFOiawo%#4hT5U&FS z5Yzu(KY%Xz`RDh~-yl6N|NT~b@qz9A2lm1$Hf43G`D-AmnZXVNY5)izCWas1fbRMA z8?52ykLBVV-&q+tkKFpbbOC=r`2SzOfQo=l0_p*hfB*gk2q2IKpzD7Eo%H+Hk6%A8 za57|Q3rv;f;d1r)FDv_xg9F*eKs^8f#KQ37)2~0jMR){${rwHH2k3S7pO3`Z{#jf7 z{|`16Y&=9YkOT-IMh0&|hF9+yelRe6V}O#tcxPkSx96}BCoe=1&?OKCkOT-Y05IoG U$(*n^qyPW_07*qoM6N<$f?|9Y@c;k- literal 0 HcmV?d00001 diff --git a/upload/images/icons/country/ec.png b/upload/images/icons/country/ec.png new file mode 100644 index 0000000000000000000000000000000000000000..0caa0b1e785295d003869330fc4e073dce07e7f6 GIT binary patch literal 500 zcmV1sCzZm}g`N!}J$oTi?|G$4gL7*^D3`7C}Kmf5Y{CmeN)&f@km*M|^ zrvE_l-~a!AA&BAspa1{=fXIJ9!9O2vbOQts3j+fX{b%^|8m0my0Yd-4N`WN9@BjaR z=no^SIM8~400P%s(0a|A0FHhM?*o#se9Q zEZ;b|7ytr@MWm#zEz$bb`!9d~{{Q>$@1MW_!07MqKOpw+zkh)g(B$8L|49h*Ov!x= z5I`*NZ%IAX?Fbu$UUAQCA3`wxix_2=I& zAouq_SzðCcuS!~%52Kai0?gF&VORsRAR2~rJG2PFT1^!)w@)C_d-AAkU2Vc75Z z*R<@y`9z1vevIh)-p7{p`5C+7f|6l;f1_&?! X)GmJPc-xs)00000NkvXXu0mjfGFPrC literal 0 HcmV?d00001 diff --git a/upload/images/icons/country/eg.png b/upload/images/icons/country/eg.png new file mode 100644 index 0000000000000000000000000000000000000000..8a3f7a10b5757b006948ea4436fb242d02dc9a4e GIT binary patch literal 465 zcmV;?0WSWDP)LAHVtk{r`=k{y)(2e*gi*sIRYISXlV_^=qKp{(!;n-+xj9 zUjemETFMXP0$m6sfwJP_;%#kh009JYeOg-Dy?gh5gTXH_fG|KLm<2Qhs6|CZ<>JMQ z009IFR-loRl9E6vpeV=!FaTTi8)D~Q7yv2;2q2OXK!5=N{?|@pNV(X=00000NkvXX Hu0mjfG@sA` literal 0 HcmV?d00001 diff --git a/upload/images/icons/country/eh.png b/upload/images/icons/country/eh.png new file mode 100644 index 0000000000000000000000000000000000000000..90a1195b47a6f12c70d06cb0bd0e4ea88d7bfb03 GIT binary patch literal 508 zcmV`hKmn*~pz%QT=MPXRKmaj;?1ifa0xhloNlE|L zuK&--1mwx?-uoV+`qwW8u#*4+i1F_GyFwg7fByafIr{%Uh)$p>Ae%w(|Nq~=m~|`# z{`_H7QhIal96$iEC^sml1*F~kc<(nb4FCQ91q_kDz!3TkBLDsd`Sky<|4qNomi`s~ z`xoeVfB<3v8uI)9A4wibp!A=AfB%5B0nwj-e?TNKsQ>@@`|oeijK3Q@{{o!^5I~F! y*$fQd7#Mzm(H|HCnf(WhfND7yc3x%x2rvM-AWsdQI)rrq0000&(jx%j7OGE_~DVuFcQkgj@33fJv($pjj zgoNxWFM>pG#K4X+%S_Ys!f>f$mib36%ekHNec$;y5njB{!+Y`YzVGwA&4mTVh%ikU z03gD2Hn&LPeNu%hDG7PUvzrphs|^(-as$IIo1LmPya%Hc0Qn*6qc4XX3oKoa+Z)_XBQk8 znPA)XelBh#6J<)fj|w>7X+~Yun^@Bp4$+N z6L8rb{%QnJN{fql*fJH1L*2YjUlB~CXS&&LY)1V3h&68|x1_5-(4l3HUgs~3JvLXI z$_D=zL{dTnq9RK`-w~w|sCYqqA;@OoAE0!{9Gi+cF%zA>5*8OAiXWs z!A~!@Tb_6WJ;mn(q~>CYJ~Oq(|Mc`miY)G1d$)?S_lf*=dz3nd-8+hwz5w#U=!7L- z+Ve0W8Werm#o=KvYxRVVNtM9!poHk%m;Y{gxKdXC|Y{ fc0^aUlspXz7vm>S7OoCUZUIwXLGJ6E%Z+~lY(hhH literal 0 HcmV?d00001 diff --git a/upload/images/icons/country/es.png b/upload/images/icons/country/es.png new file mode 100644 index 0000000000000000000000000000000000000000..c2de2d7111e3cb59cf6511dd2ab045e824bdb43e GIT binary patch literal 469 zcmV;`0V@89P)@|4`Xj5kLT%`al?B=W5I`&pe;NKW0^Ri&h`xRJ_x;0v zUa?=y?0^3M|NZ~}FE9c#{{3cP{Qd6}13&;Vf!z&M{pZWqKYu4MFm$tgedF}w=P#IQ z7-9gT-$11R0mKA$(qEu4%ok$*y!^wMRm*x;`R7|k6yu?K{s8?55I{^|9{?Tjhec2I zv+6&FhFWG_BbNVc|Ns94tNRJp!0`V!Py;{!F#$2enB#XZaohg-5%Tlk#oa&nzQW9g zl0Y{D4gK?n0U&@Fe=;yIr=|V7caH%YEYL84k`Tt9-wc2LGODP&y?7BIfLMT@X8Qey zK~fSFpuiXa$^kk7RCwBA zWQbH``0|MX0{;DB`1Ob3-!Fz=zZw28fY1*HhF@R=VQ?@21P}|ur+3w` z_wT=dfByab`{x&s{PXYspTB>919^Y{{Qd`I{N9v10U&@_7=ExZ{APUe{`KE~Al1MB z{rb!Jhml3<_uqeCzux)%bv7|NkFAvw@aK@N+YWG5`bsF#yj00sZ{|0ReUZ0OJ4u`~d&_lgxzd z_7grGtKje;)ax=32IqJ>VE_O6|Nr{|0Uz@6!2*a0?AgCSJ_s@V{`!jztXlEUzkg2h zOW%AK0ILQg2A~)NKmdU>0L=y=29PKt(~s@sMWK)O87MU|4G0ImPt*+y7s`{{I1L_{;G9FVHyv z0R+;(^!pEkq$JpwzYKqVGyVRp{reTr#sB4{{{Q&{G@Ah!GGGK$3=lw!Ux87Egcwk{ eXi`7`5MTfy3O%OUuKb?>0000FP2AE)Ir2{}>qlLBSs|`Qg(SfB<4)VqlOE;Q=cD|Nnn$ zna02W|Nj1E&`=Tpav_4q;M$#E00G4E4{SI@`q`VGKvVzz{r4XmU}R+c_2(Zz0I~c7 zs`v*r?Dty(;z&PFFXX zRA5t=4x{1SIibD)Vqy6A2V^D4P_SySA|L?j2ip1XFA)9%V~_%1r~w2J3=}{2Oiu1 f7(RXZ0uW#T>&I!FfdIJb00000NkvXXu0mjfj-u42 literal 0 HcmV?d00001 diff --git a/upload/images/icons/country/fj.png b/upload/images/icons/country/fj.png new file mode 100644 index 0000000000000000000000000000000000000000..cee998892eb316c3293ef2d52afec9218bdbbc03 GIT binary patch literal 610 zcmV-o0-gPdP)2C05Lr?a%1G+Sb3M_ z-f!*)-&mJ@lxC7weD@!u;s2li|9<}wjr{Zf&o8mqKR`Cn4*&rGF#yj01QaSLwCD}R z0w(ww8v*|PzTN}jB`Pj8{QK|!{{8;|gOCLd|L9jy6{oELG6Dcq@B)aDq496GGsCmb z5T7wXTnzN$?|=Wl{r{i6vr6{G)xV#={AXc)t!L+QBoiQjSb+Zc`=1dU2n>I~p8E|B z6OfY_{`1$ji1Pn`9_T5yZrhJfj0}g~00a;V(9A!7nZZWFG{8az7^c++|9dI@cmDl* z!Nvb)UorrL86bdIfbsI1fk}{;;V;BV|AE?oY(}v2K-{x07*6Kx`SfB<4-V2A|A=r2_C101z~ iU~vp#0R6xN5MThlzdwv9U#bcK0000}CO1*!he@c;k+ zfB*mg{rg{#hxPwIh8G{d0|o#7{Raep|AEAFCm#U_AQp((@4x;AD*Xo({rB(3@4q1y z(m>63@(hzyJPYWMEi%>@iRTXyxzU zAo>qT2S^W413&<={Q1WKlmMyz`(Hzv@8AD_R~~+N^7b200Z@m&0zc4{Q@7rNwftxJ z^$Q??fEu9g1Db8CAq;fMkDq@pJa`8*&sI~^TtyHla^%`8uswf)HUI<=3()%@Pl0^! zf8Ui?K|l%XeRX{Qd(n@juAHz(D*15I`UefB!>$cK-hRUqIf!|Kj}Y zKt+#Ue>r^ZHOMRf{y`i940V72V*2%m0pg)Q5O4ka4>U8*PAAEH2(%ZZ;ol#C0AiF(UW*)& q3=s4Oj6m#vP&UxAe?ZIt5MTgFMVEBke8_SD0000BE0lK=nzFYgc)d0A2*B+AFf z2joHok-@WP&j1351!6Wt`q9fjf1W;g`1ALFY=DuG5oiNI0I|ST{|2JJ|Ni~?`|A$_ zRt*pr0t5gt0M7pe4IJopi4@}M{rvp?{Qds``}+I+|3-D|`uqR;{Qmm<|NHy?`uqO- z{Qn;q1i_Qs0*LV@1A}N|@t-FT{{IC^{`vn0sPGp^)o&2vABgb_!eEtCyu9%!Kmf6* zGhfda5_|CT&#%8A#S0%rhKer*8VNG{57cZ3sU*g7is3Rq0I|G(Bf-nd3vr@r@vHy8 ze*OIQ@9-oMOb-A(eJ@7=Ab?mP;SCW2x*O<#U%#>Y7zqCS`2!F@APw*!ml9!S{vjhP z$_zA&0R;fLP(1(v#Q5^%OL#2G%0Af7VC%@R_vTF*lgG%);U`26kn-@hOg zU%!6+4+cOs(0HIde9xZz`}Onxub&LUB0x(30+2WcIRJn#2ut|?gWYu1Cf+!-K%B8# zdf?1WA}#uZ8oj7u>$I1i0Al&`=O0k%-@icgAIJnM0xA6maSq6BK-ECw|NZ*S`0Lj% z1_pot6puj;05Ax`F!=umqj7^frO?t|3^&I1kxUq9yECc+jQpY84SWH_0#pxl$?v~F z@*hy-KN0|X07U)z`4{NpU%#2aHUI<=%a31wK(7Du52Oc(|3O^?R1IN+RRjI-n*kVB z3=9AP#PZ|EACPLGJ%9cJNh|>9B%spYzZw7h1%?tp0I_@ndg9MNE>313@6R75NcceF zkr51-#U+7;F#`Sf7i0rK0I_`g_NQ&Zk)EZ(2O=d>QH$KN3zEi7S9u{+2K>GX4ds`2QcM z=+A$K-~a!^(JwH9Fn%*K{{Cdb01!YdV9)*qi~a#?`wdg{8%Z^Y!NB>w;@|&31~6!UgVU(k2*|8J(R-+sudaynhucHbwAMTnor{mwqO^w7JHzaBsT z{O^B8RYf5+LvDs&KmRKVd78=o{`1#HTiEo_OolaGleS)G+IQ#sUI`b*pv<`1zCJ=H0jd{{2S>p`ri%{LsXJ%FbMS z$#S`6f|?OG!^Jxczkf6Q`UNF{l0Sd`ad7zm>({^EzyAS6{{CgrkluOb3l1A>ZU2~A zK+FZ=zkmP!`TOVhpFbzBzFaPmD2$N3;+$pK?>zdet`f0002ovPDHLkV1gy;I?Vt8 literal 0 HcmV?d00001 diff --git a/upload/images/icons/country/gd.png b/upload/images/icons/country/gd.png new file mode 100644 index 0000000000000000000000000000000000000000..9ab57f5489bb9ebb6450cb27f4efe0cfb466144e GIT binary patch literal 637 zcmV-@0)qXCP)@|2i2MUNJEAGBA`g{QJZ3ub1IpEW7h{~Z4K zJ3#Qa=Q1XS-;5h0el2+U>(Te$zyAID&HDTIKad810Ad2W{jW5`@9y)AKr^5J{4Kqa z;cw*UKQW)B)-pW&@%z{RUqB7N{{H&&_Ycr?fB*vd;rG8kGw%JlqX`uK!_D~nn&&T_ z*-Q+-7;nUX=6mt$`7e;3-;BTi{QC{m01!YRC;j>JdmqEEKMa4Icz%Tm{+4F_^}h({ z_1{sye%WyRp84|E^4Gur0Kxx1e;6150*D2Oe>41%=Kmef^V^IA7&yOx!2%AYU;o*D z%dq`!;`!w)_PhDb-(PS30!;@9Adn3rpZ_$9NHVegX88Y?;V;N+#{WPzFy?-P;*ar< zJ?CFrnZE^h{{CWM00h;Fvzl@K2fHp9I6dqaaxb00=Mu XLcuQ~?TP?t00000NkvXXu0mjf`7udf literal 0 HcmV?d00001 diff --git a/upload/images/icons/country/ge.png b/upload/images/icons/country/ge.png new file mode 100644 index 0000000000000000000000000000000000000000..728d97078df1d07241ae605dff2f2cac463be72e GIT binary patch literal 594 zcmV-Y0^8x|9^h-OG^F+g7@$L?BC01YQ`Wbb?43;K=s|G$6#bNnb!1Cx>Qe>QfY2m>?Izi&U8 z1o&Rm*8l_%%a6%3nS?}u4*37)&;Q?l7=Q-<`}?1Z>;KQLY|KmGQ@ZWEch0Jnt zUmm{%2p|@g=ujpTGX@n^21dqzKYxO4`1a@2NuYivJ4XgKw*UYBFf%g!{qd7YP>5~& zE`R_4F#yj00OjT7{QUg;`}^~|xBB|}`T6Q!vcs262Lz;t$n|1+qbnVARhhy8{z5C(*C%JTg?tEV3%;s64O@&5h$(1-*>2%Ak`A87BFlP7^( gh&l)WvH=1N0MfQja}g1cO8@`>07*qoM6N<$g4hNuZ2$lO literal 0 HcmV?d00001 diff --git a/upload/images/icons/country/gf.png b/upload/images/icons/country/gf.png new file mode 100644 index 0000000000000000000000000000000000000000..8332c4ec23c853944c29b02d7b32a88033f48a71 GIT binary patch literal 545 zcmV++0^a?JP)lgG%);U`26kn-@hOg zU%!6+4+cOs(0HIde9xZz`}Onxub&LUB0x(30+2WcIRJn#2ut|?gWYu1Cf+!-K%B8# zdf?1WA}#uZ8oj7u>$I1i0Al&`=O0k%-@icgAIJnM0xA6maSq6BK-ECw|NZ*S`0Lj% z1_pot6puj;05Ax`F!=umqj7^frO?t|3^&I1kxUq9yECc+jQpY84SWH_0#pxl$?v~F z@*hy-KN0|X07U)z`4{NpU%#2aHUI<=%a31wK(7Du52Oc(|3O^?R1IN+RRjI-n*kVB z3=9AP#PZ|EACPLGJ%9cJNh|>9B%spYzZw7h1%?tp0I_@ndg9MNE>313@6R75NcceF zkr51-#U+7;F#`Sf7i0rK0I_`g_NQ&Z3T~N2spa`a*~JPLTQe?I z0G0mtba4#Pn7DV+Mn5J;5!dr)^2``rnl~Y?TU$qv#X>2HWdlx z)`bV;H!j>VVb+m|2^_OqUu^Q;SeSa~T+6BGy(jPNEKa*8d@n&}(Zugxd<^Q@9p;I7 zUSDOUZRYUmo0{c|LYHM*SrV>Jj=G=qLx?p~^iW#b(XF1B_SEjk>9{cI$$sC$b^o&F z@;lT#(M!tM{l(c}`YGc}<$4?+-u0LHHJ-`;5HCAbBW}um&#QNjNc-zuKUHOW;zjeH z&coNg&h)xcqR8`c*G*d`)<-`U&h=o}kWs>6x44eQxZ5^ARh@&U_=-H^RCwBA z{Lg>@|4`Xj5kLT%`al?B=W5I`(ov;U*021*0XgD3^5{teN< z@cTDV13&-@;@|`T5QYI@3O)ok?1DO<2trehc#kXh!0Z4iC6of!=I9L4Jz5Qk(jP`l zJOKo8(qFLXAF#IH8`u5XwDI@PAHNy@|4L4RsD^0x1N0+605O4m05bkR14QCiMDQ;; z>0h$aKjWi;+@CNFzZm}i25JBZAQt8_hOB_!_dovn^Y72^zrTL{{r&6TuiuWpfB*e$ zwD}j1{Ph<^0%eu?|D0`P00`k|9}4iHT+`$2p~p=WCoxfpgkZGj{YEt g{DC2GLI4Ob02tU}a;hkw5&!@I07*qoM6N<$g4!w08~^|S literal 0 HcmV?d00001 diff --git a/upload/images/icons/country/gi.png b/upload/images/icons/country/gi.png new file mode 100644 index 0000000000000000000000000000000000000000..e76797f62fedcbfca8c83c51951680d6a6e9081f GIT binary patch literal 463 zcmV;=0WkiFP)VoB37QQ+R{;bN6GSUi z+kb{HA3p-oUOth}-@kwP{0U71P%%INK{Y@H82)oDp3V0Dt?T`39Pi$;RTl%zL?{P4 z2_S%&kW~Z0x6qjPzkeV9`s>}VU!Q7P|1&Wm)PrpR2q2b!5Hle5FfeebsWZ)5spT9vc*+3O2}Iw&|Nr{sqx*C2&8&?7c>c4n{QvVC zD9-TjFQbI?+i42`0*K|`>)%Y*uQL4o{r~rGhChE9{`~$Pz`@Ka$@uLpb; literal 0 HcmV?d00001 diff --git a/upload/images/icons/country/gl.png b/upload/images/icons/country/gl.png new file mode 100644 index 0000000000000000000000000000000000000000..ef12a73bf9628ff5a67b81bd980d9c5d2b2c0f05 GIT binary patch literal 470 zcmV;{0V)28P)J{teTOL@z0+>00G1VRSiT77W_YWkm2*^|KGm- zfAHXcOY8ruSJ7+$Itd_vn4oTd_U!+mLkz$F{Qvdq|L@-*^6S_C%a&nk00990)`(*=-xesBS%qG0|gf?f~#iu^9N|j9|i`10Ac}ZUz>% literal 0 HcmV?d00001 diff --git a/upload/images/icons/country/gm.png b/upload/images/icons/country/gm.png new file mode 100644 index 0000000000000000000000000000000000000000..0720b667aff506d7892c5c301af04e6bbf932751 GIT binary patch literal 493 zcmVwRhhvIeu00_fCKU~B)yH$s9sXS^B!W{?M(W&}hPbMwO z;*cg65E@7haJ!!XVgYOW|Le(9kkY?@fpY);{sqc`6amR!K*q2CzkUI^Y_hUI(*XjA zMdSH%VNp?r|Ns620Z1T|}fB<6Q zlw#oF`Oo_sVk+2%KTsoq3?TP6gz@)3Ki_`_=6?VI#CZSdeQ9y&f57m8xf%uh13`xW zAjrhTbmsgSfB<4-$Y)3kNW1sx-tWJ^f#}!YUqA$5fJva>FJQR-`S({vK;>fVMSuWe z0mcW=Ig;FxKxv@ppTFP`1*!N0BL9M&0|dYz`1hCL7Xv^5F*2kxF#KQuvOqEU3km&! jiTr^fV1zR<00bBS-TrJ5MX@2w00000NkvXXu0mjfGz`_@ literal 0 HcmV?d00001 diff --git a/upload/images/icons/country/gn.png b/upload/images/icons/country/gn.png new file mode 100644 index 0000000000000000000000000000000000000000..ea660b01faefde01ad2527a6abcf7d1a5c1b0526 GIT binary patch literal 480 zcmV<60U!Q}P)@|A6>41A`El{SSoRd}EL3@|NdrR`1}9=ZwUJP z@AvHwzkdDu1yn7|BMY<#Ab?oFX8(t({tZ$6>;L~hU=2XVuU~(E|N0Bk07O6y00G1T zbT=bV^`Afg|NLS2{ReI~M8m&-NE-fuGynt;*hzmtW+Q3%1=j#1fvO=I{`~y|)Bq4b zU?=?r84r{KY4``%041R|`~%zYhXEjfz)k`h|LYgXRlk0r+3@c_)IERx{rUUv4^RU@ z0D&|xgN*;p0Mzyy>QQ8EKn=iP{qyfH5CNS85I`UeOuzpyNJ@hA{P_#yFfjaPWc&?| zr{By>f0X$D{QV0G@4r9|{}=!Qi18~pg5ikaD#Jf9Xfy-Svu_Nh0nj)GNi#731Q-A_ W8E1tdJ(&;y0000P)fLk0D%}*I7ff3uKv?i+N*~ULWZ>4 zW5%k%a3T{@*`z6pma6eF$JtK+F@C*&o=d^t|Ns9GOCXH@*Z?CVuP#7nB5Y|1kmu|NQ^=?>FP0zrYX%2q2aZH;)P`n*#-K1r9WbfYOYN z??RUX1P~*`M}`*mir*mb{sxCVG>rbhqT(MY2L1y54rHu+wi6(L7#SX-$0bVa{(;3h egu%oB5MTiLH(5{VMZMqv0000u-`~Ig{`~p> z=MRwl_xtx>F!}G#@4vq{&D;bKKrBFA+{}CzK0Nsg1pog2{{I_D14*DX1pWH^3y6RW zSzcL&Zwvqd#Pa7K10w^wlkmIISh(4kI3GTJhN2$mzJLD! z0*D0|DC|s(0(}1j8UFtJ4HA_S5@P=M@9)2VV#30}-~k05FvNkXnV5ck`2-L^EDTKl zn1259n3DG7^QXUm{{H**3#f!E|`n6Mz6>fhdBj29g(UfB*aM-=Dw#|NaG$fByXc1LXhxFC@THKjjKQ05P&# zA9gbr+SsEBRPB^?1!&T?30hEBFhHFGv5AR^>DH}B00G4E=NHV45I6k$@0N4rAH*g9 z{zDN+_&*OP%Y{RC0Ro8e#fvv0A_7PTA~XKMG0?q08}8kE2oOLl>koag&}IJi^WT4% zN&g{c!yE%t3}J9_Fdy0V1t5S}4xV|TB*XjR%dfvcU;YDm6wdeu;Q~GU4JP)J`S$qz^!f=A3G?{>83*rF;63vB|NHv-`~3j>`uzF%_#GV;x3_Tu z05Jg0{{&$2KZ#9J4f5RdzRdzC6Ae5p=(o+T{uB7y^ZNSwN=h$cVmJ#62-nx+ob%l!TKAE1V~I16T$|E1+i#l`u&y!03t z7ytqQF#yj01Tv_Ick58z;rzG}_y7F-%)*RRAv1X@1^f8;`}+eA4+yBm#PKA>w6y_L zQ&a!|00ICp0M7peY0>I$KneW(?7rp&{QCm?`vUdU)NRiG`uYI-`}gbY@;Dai8vP{| z4h7uY=>Px#0*Hx$0pxvffc*LW3+PFp{}_J#0ty11^n2!vLjod>mX_Jy|Cz2{eHy3% zAb?mH7=HZ$2N_TWSP@V&gaITO7A`uvc=2f<_uIFxDk_pd4FCZI)bI_+mz3lOl7E0f z{^u`PGlT&Y`3GeD{rm6lUtS;y)Bq4bz=+dkVE6#Ehk@Y-82x6z3jhKP0OI&0DF;s+ Q-T(jq07*qoM6N<$f)`^cRsaA1 literal 0 HcmV?d00001 diff --git a/upload/images/icons/country/gt.png b/upload/images/icons/country/gt.png new file mode 100644 index 0000000000000000000000000000000000000000..c43a70d36424b66f1627216ad988cd23a4be9285 GIT binary patch literal 493 zcmV|9}7f|M~m>&%ghRD!%{(5DNnfNcHoNKp}=7 ze;EG#|IZ9j4hBF)cVB@t{Qmo2T96TF4?qC109^ty;2+Qi2B0xObN{1)Uw^{8{`KJ4gZ0H zP(J{D2s9NSfWR7{27t^!x8NVhN&g{E`Ueb#e*ggla?+pwj3Cv27=VUhwE^V&zaVoN z82$hR5DUYve}Dck14V%vK+Z)23?LgAK*7ZT@-zbjKmf4-BkT7+CNVw+pd~+kF)%WM zL>VCz0|PT7gS-eZm>Gd?16jcE4PH%g~!@=<9&!2x_@aEGW jS9>vVD)6R*AQp(xFW-Wt{{mJ2|NHk};Jc-)O#kPzME?5A`1{ZQ-#|To{!0im{$XGM z2p}eq*?*y`{{RjC%V7Pj<(}hvo^Z>=hrJ-xK=d0#0&M^~2_S%&fR6tAp8=>2$p8C? z0q7F5H=q9h`}OesIT^OczkdG%sRkpU6i@>|0I@Lq1-k@j0La}yZU2}V|JX_T{{Q!% z>EEtDfBydd!vuBJUq+w?fB<6o2X+#W53~WS;s2M<|9d72Yseq)`11cZJHs!aS-+wF z1}X*!ASNLG{ST%Ze}QTk7ytqY@{}>p)on&BOV)*xm;om>72$%sP!HhqD7ytr@1teTu4J7{m`^Wh2AGglm{~UiA z82u;s5_9PZ|FH1)~3de={)r1*?FgUtsi`kx>?C4?qC1 zfX)8@|LZe*d2K>lZN0{{I4*^b@QIr~;(tA5`a`e}Ddhy$ldQAPvkwr9kh3`~WiS7Zcc2 zh-#qDKOj^7{QC<;3||-k0tlpm>GvN7NlB2NKYyjTe{-?^h8PLd@aHekus?tQg2Ee! zfN=^CK#X6(5e!Gd)(i|h;JEn(j5jcXFhHq*fkB7?Aiw}&uW^ngBcx#f0000J&k9ol;AaCAG*Vvs6lsG2f+AJUecp&K4&zS7@MzJZZ+RCHJO2~-cn~)8*ZB# z%#~(Seaqctb3On>xdArM!+zLfe2=iS%3k1HK82I)yo62#|&;D2*%o~N(LQ$HrxFU=@<#wgQDty7s|5?>qxBTrc>UoBZ!}1le z#)a`Pq~$aEPO=D0fO80I7h5SSMqU=q48*j9Qb*%7#+Pi|ervSf?0bSFwKsAPn1FO| zKH_&kh#AJmvOUSnl~!1AmcaNJM5awz`0DF46>zWZuCh$z(7uBp0to4w2iu-uj zV9oc#M;CkJ!OT_8;~(;r&Cw`0K3r=(%@VWyiIA#;S}+n)^}q>|)QZ|IaYyyY!;frq z6mATysX~aM!z!n$rJ$=27fpoIr3iB{q|Gr32uDRa3PcNj==OQGHve|07^1DbtUgzuEQ=j%rDF literal 0 HcmV?d00001 diff --git a/upload/images/icons/country/hk.png b/upload/images/icons/country/hk.png new file mode 100644 index 0000000000000000000000000000000000000000..d5c380ca9d84d30674f05b95c2f645b500626c07 GIT binary patch literal 527 zcmV+q0`UEbP)00;JD`K-EmLvOuK( z0R&e6?>|)a-@i;iz|8zVIqAQ;I)|_@BNM~FU%wy-s0ZjAfB<3vx(uZH&mV?Ae;64V zIcsYEzkmP#{)7J;N}0Ju0muUq%~ z^Jl0Zz)k`PASO^y0(FCg{s2v4J zf4+RlSW)rg;lp2_Kl2?q^5yYkpazCNzyJOD%k=jzP%%INf#Tuc?>~%^l1w0DfWH6z z1E^V4lvz;l%d1x`a&jQQ{ROE8h7C|LKmaj5WMKG(8n4KVKd5of#=rm&U;y%qJ?5>3 RVzdAN002ovPDHLkV1mTk^F06n literal 0 HcmV?d00001 diff --git a/upload/images/icons/country/hm.png b/upload/images/icons/country/hm.png new file mode 100644 index 0000000000000000000000000000000000000000..a01389a745d51e16b01a9dc0a707572564a17625 GIT binary patch literal 673 zcmV;S0$%-zP)>fJ3En$GhGS>sbE%%m3$AD)q?8M9y>88-}kR7#RKlk!P~Y_PLuF7~U~3`~nC7 zF#yj00ZUDdpLsm{7ajP|&HwoK0Usg|6%f4L_{`Mi{rvv-`ukf=Ed&Gs-sA7L!Q7*a zj{*QO0M7pb%?Sw^g@yy{>ihEY{`vU@3=8@G0rvO$i3mOL`~mv-`W+b$Mmr&io5dg< z5v!7q0*L95jt`TzK8Kd(Utv)OSp_aLv){6ccV+Z`{Q2+asKUU&aO3`Kpz6wW8wp`< z28M3{0mSqnB#A*-c*8%1=RD#sSOwMznKA3=e&iEzwo{cA=PgXK`2OQ}gqId83!|%* zA_Kz@fB*n70M7pdECCwp4H&@R`1|(w-}M5x*74i)0}%fAt;XafA{48))#>Z>?CD#}*e}Ret0tl$#*RMZ7}Jl7Z|M45`5*URzH9L z{rmSnPy;{!u>dsyO%meg+00000NkvXX Hu0mjfN{&}S literal 0 HcmV?d00001 diff --git a/upload/images/icons/country/hn.png b/upload/images/icons/country/hn.png new file mode 100644 index 0000000000000000000000000000000000000000..96f838859fd2aed975f5f4134050fdbc0486ce1e GIT binary patch literal 537 zcmV+!0_OdRP)yNpn^YtfB*U? zE6K^g@B<)#SlTBTcsfda`|@_0R#{e$UZ3l|Ic6l=B#}T zWCl5lg}RFY8S^$g{qgfJOdc2ve*glAv3c@IFK6|y-~NDH^$#cn3{a5k!L9^_5>O@B z$^W^zSlTD;0tg^R28Q0WdbfK|zW)9V43odV{`~*->+kR1AO=tbO#T4}-G3E1?u#4x z0Ro5x7#++k42m+GppXWk{}2W^;6Y*k7i(1vOT1`b$6{=&w9#5#oJ b00=Mu*}Zhb7k&Za00000NkvXXu0mjfKokPk literal 0 HcmV?d00001 diff --git a/upload/images/icons/country/hr.png b/upload/images/icons/country/hr.png new file mode 100644 index 0000000000000000000000000000000000000000..696b515460ddb670acb7e9de4438aaf21fc5fb77 GIT binary patch literal 524 zcmV+n0`vWeP)@|4`Xj5kLU3fF!G{fyDoR{}_Q36Vv~H|Ns5{^Z)NZrr*Dqe*gae=g)r_`DNuw zfB*t(VEF(4$y0{Ee}M=nS{mB(NB;kxJOBSE{F_{n`2Y8>|G$0##TjK~fi?gH5EIz! z|8Uj6|NiY-l-<0|OxA@1MWlzkmOI;leLR z$De1;{4g{7^y$;LZ{NOt{rct07a;lk`E!5(f@%OM1_PkhC8`eE9egqWbga z&p;hdpFRZ$Adm)#>fe8W4*Ct02B|hR1*-n0rS<;(dx&bFRY1n$$BzL5h>;=uaC^Mc z(+@v?|NZ~x@4w%F|9yUZW7+yTpo@LH>e(bUfFghX{rmIxzpNnpimU?w0mQ=a>kp9s z8>AGffmuv7DrFgv!3yU7{`2q8f1ngFoPlxn4AoS-S!;e2821p2q{((sbfB+=MK@k8U5Cg$|VB~~? z2XKWZk_lAZtGhi{|56nPieMKY$Bq=4KgZ0muK;2JYWn}5;nka8K-GUCa!{rJenZIL z|9<}gF~mh#ftCOS5DU<%|Ns8~1)2?0{RgZLWF&|Ls)lL+iU2hL1Q5&LKMX(>AUTM^ zNU9+S#0FXN@8@rz^Zx+^5DWL07wmsTIe-5EX@IBzTJ`52%kO`z5F362$-h7b*KaNc zh6exv#P}EJiR%3Sk01R1^NZmZ(C**=fB*Xb3rzn04HN{CU^bJS()(Sf00M~R4FdxY z(0f3MKYtkh0!g5OAQFsz{e$TF`x|H}%fCO*7#IKo2o$W~FaxWA8VofRr202h8w1#j zz=!|{Ah3qte;CCj89_$={rBfLBSbS$5J>(7`GW}-*g)q41Q6q6a2)=FMdm+9l%onl dL?8elzyJ+{hsuy4pm6{I002ovPDHLkV1hP90PyYjz{{0J*12TXlP$`i71!VmC|LYf!%PK1iv=Z0I@Lq zVgLrRB#$I8Q2qeT`3KSlX8!?(3s3+U9e@9T1Mx3N13&;VGFUSJ^?=Y13Wr{r~&-|6d^ahvDC! z|G)qK`}^nrA0Ybu|2K$nd)6X=0AgWa1{?O`IRi-PU$8V7{r&w9sOb0ae<0Pr|Nr{M zEF}%J0U&@_82&N|Y=e#y>zg27mx!0Xgp5*S}vr z{r~fq0csvl>92pk!P<5VDfB!NI2#TFQ3lKnzfB%Al=06ZHfFW+c#KiRe{d<4_V)^&)A0s0pNIe5S)eu>r zF8~6F38(?TQZ#J<0R*xEXct5e0}KG|WIzExE=U%r7$AT^8h-rv@ecwRzz_$3Xaxu` Y0RLik?wUgPu>b%707*qoM6N<$f;0ZTz5oCK literal 0 HcmV?d00001 diff --git a/upload/images/icons/country/ie.png b/upload/images/icons/country/ie.png new file mode 100644 index 0000000000000000000000000000000000000000..26baa31e182ddd14106e67de1ac092a7da8e4899 GIT binary patch literal 481 zcmV<70UrK|P)1Ab?mHSU}=WzCQi??=KL1`SXRBmG?g! zeExSVgb4YXfjasA0Ybs`#&c5^XvcLUqDM3{{9AP00d^^H2e48-+%sM)d02u=%hct8G!N( z3;+QH((o5-_OE}xfO;@2_y=+i*h!3FCjkTyNW*WSt$#tPfB*dj3@CIxKqoQ$2DuvO z1O^6x00KJ+r1UogVe!Ksu!etsL5P6?Ab?navG)7lA4zUWkT?GPWdcP410y3N0|YR! zFo-FE!v&-P=p=vuVq_>~VE6=zV^DnmVAx)=U5ZNz6vaS)0m(NHWW2-wfs+9Q00bBS XO2cxg3=*#z00000NkvXXu0mjf|9Z^l literal 0 HcmV?d00001 diff --git a/upload/images/icons/country/il.png b/upload/images/icons/country/il.png new file mode 100644 index 0000000000000000000000000000000000000000..2ca772d0b79b255872cde2fb29060bbbbad950f2 GIT binary patch literal 431 zcmV;g0Z{&lP)WlqUuh`uiUU82D1+EBLb>EWz|Nj3k zj6%@>aVJ0ku|Ql5RsEk~{?`9D9{=ZO{V&1vKX2lHHJSgJ0SFC1p8y096I?Y|?05b{XcgblKTHZ zfByjpAQrd=h&?HOAa>`R|6Hv9XB30N3RxDY7$AV4en1PH(j<7uAT&Tc4G=&q@-F{c z8i9e$01Rv(35=ybe;NM%WdxES!M~uG0dj%y@b5pvikg1_0mOLw_HE>d#AF}?ph|!M Z0{|%qc@l5wel7q2002ovPDHLkV1m6PxaI%= literal 0 HcmV?d00001 diff --git a/upload/images/icons/country/im.png b/upload/images/icons/country/im.png new file mode 100644 index 0000000000000000000000000000000000000000..243024de26b614edae0993a05f120165c03cf805 GIT binary patch literal 354 zcmeAS@N?(olHy`uVBq!ia0vp^0zk~o!3HGD9`RZNDVAa<&kznEsNqQI0P;BtJR*yM zYJ@8J8-6 zN^g3)IEH9UTsmnl7n7kt%l_WLFMk@V8xJ44$G$;OJO0i&bqiga4l}W)t_5?XxkYUz z9e%`i=}lT$y4u9Q2@f(ExDBNG5BI(L9TDwq_r7e#f-JkGe#^bg9)>CyIf!}&M_tw| z+u3rP_vLrP$guo{o1T7jXmkGau_IRJ!*uQ`s{1q+=rDVSvdW)-CG)S&eeU6N&u5%$ zd7dVGR(alquU#|G20X7=7slYR`)}BaU+T;aDvsB)U06!_&K7%2YKU2XK;qBKmb~pA u>)Zd^WwLx^Ty^2?qITykf4MV%3CAx#6UeflRz?o!Nd`|>KbLh*2~7Yv^^2$g literal 0 HcmV?d00001 diff --git a/upload/images/icons/country/in.png b/upload/images/icons/country/in.png new file mode 100644 index 0000000000000000000000000000000000000000..e4d7e81a98d705da8d7054e77e7d311805659678 GIT binary patch literal 503 zcmVl^KlW*80IEmzVa(K3*_6 zG7fg0I9Zj&0woGah`r_&Kwu3FK=xChQigwjfh>?7kc!_h@)sEWW@MKI+5iwhEdRtz z89B8WSj7JS|MwrL=l|b3uZ7Osk^B4auaUxSRgtG4v;Y11_x}$gi|9Y8?EnG9`1|i) zCPv2p|ADsrhuF4k`@Nr^zUpfTpS$xp!A}Wj4A3Yb2~_s}<0pUsVqyY2p8>1`g1&zJ zsVvR4Yya)fUw{4wtNss>0tLxGfB<5GmnRH!zxweH8<(Mq0N7e&^ba6_ z7#WHgIs!VLeti1p-=9B!fB*jb=l8$ge}LrQ-#`%%`S%Y9{re-sFSERHIY0ohF#KVF z2*K4Ml>Ykz*ZJq)UtlmW{9*tIAQm77@e!0?Mfa}mS!7%=x2KmY(S z0M7pbTSu9imq`K?75n7n_u%3MB_szB3#hl|A07@E6$<6-<>30S5egmg@cSkZL+Ix9 z0st`p&i@3O7{&wE8wU3C1oia^`T7CwI=ckcau@Q71iA1L?!*;{7^Nm*&$?GLJd|NjPb3=0E0KfCb4 z#nAu(05Jg0{{-+tQ26`)!^rI-{P_e371QGlF%9qW_x;Sb;QRdk{r*xJJ*zy?_rWgu z&$=$1lYjzR(%pFe+p|Ni$IOoG{eTR0XemVUia$~;LXXZeDO z0096o0M7peXKyl1N+90g@dyY5ARP|N&gc{s2^<#+#>?j*9u48*^A9U5-*(6(kqBPq zC^|QM0*Gbi#3NFYyicBf1{wyk;Wx-spzFb0kX0fvuWZ`CzyHEKd)}3G%ew&r05Jg0 z{{dZPvvzMc=Kqyj=IHYZ2nGGUe(f)J7ZwZK+v5TV s=!a5B6v9X#`iH^&14cjw13-WQ0BQ>oQ(TIK+W-In07*qoM6N<$f`&OQ@|4`Xj5kLT%`al?B=W5P+gNxB&nJfgpGfTOih;e`=>T z5jZ8;?_>v5xi(~iU^udv!6f5$jpNVh2O?$m1OPDr&i?@Y{r&#_{`vm=wBfh>{Qda+ z{Pz3$!R5rm=Ee2+`0e-d?)LGV)1LD5^!4@i=jZ1F2;wA$U5|F$_;B;f&rf1p(qbG! zCte(9VPa-y5lGpbZn4ZFhzcT9$vfdqmuG z@j$ZG>u9())mkwqmYHSd7eFi*FJ3%$?AX0~_kM%HFED^GKqQ#;=g)7T_f%9=fX)F3 zAdr)QMoCIaf{X{6{|BNG$o>N%f#5F;02KoS5XlH2zyJ$0KZ{``H1_}i002ovPDHLk FV1nFR>VE(L literal 0 HcmV?d00001 diff --git a/upload/images/icons/country/ir.png b/upload/images/icons/country/ir.png new file mode 100644 index 0000000000000000000000000000000000000000..c5fd136aee534ecb59914e336cad18d18ead2a4a GIT binary patch literal 512 zcmV+b0{{JqP)r;gUH{1e{Y(x2_S%2fSMQ?7@vH7`tSc=xS~J*|Ni>>`_JFszyAFKs{8d9NdA)L zm1AIH00;mv0M7pew_3Ln1`-ek5ajjb8VVZW^Whu|9pCfc910uY_2L}~8{YEX9t$4Z z@!Kj9D)d(L0*LYN-@lBEj6f&-|Nox>4F7-s`Ty{t|Ns8~x3>Pz!S){pfXY67`UDU_ zOc38f#US*GW&hv2{?Eqpf6;>f$N=n5fB<4bR}BO)G5?=F{eR-b|HMQT_5c3^H2?$< zb1geNgNn-kGiMln{`!CM;{TsNL8PAke-;*?JV+Z*eYOvhv$==KunT1sF?AKYlWZiGf7_{AKv_o8k9wMiBcC z1B3*kzkfmK*Ds)AfB<6r3XWMgVnF4hNdW;sfB^vU;z%SnI0)(h00004s{hykP}!$Xp8x`g@iqg4NJaUd z$B+Mm%>4cD_iu*Zzrl=O|9^qF|9<`Y547mdFIIVlOMCYL1Q5sui18rvfj0Ph3vJwt z)dnUeruXmP0|XEYv&@95W{1bGfWG{@sKWZ+FOVO6s`df7U=M&0& zKrFzJ{`2=AL>j0Rra@ocD)4hB}-f* zN`mv#O3D+9QW+dm@{>{(JaZG%Q-e|yQz{EjrrIztFq(O~IEGZ*N=lh=;=qSyMwWku z27eMOW_|f0uQeek^e_9g7KH|eq{JVG0^UaP2Jy4}|L^JL_3uCblfVD@mnS9t`~UCn z|MT(+KT|KOfz%~1cG~~^_2vEk{SFNQ?Cjg~|NsBWy<%2im{vp^YdeS=hk-Cyo6U`Hgs{l4FR(w#{P`G0;a3G2@YSmzI~fu(ZE1> L{an^LB{Ts58L6#6 literal 0 HcmV?d00001 diff --git a/upload/images/icons/country/je.png b/upload/images/icons/country/je.png new file mode 100644 index 0000000000000000000000000000000000000000..7d7e23a475c32e1fe6aae2d1cd0dc8135bb8ca4a GIT binary patch literal 492 zcmV>S1 zQc*%vlZppzNz%mlvh?bG8xF{;pz(Fn34M3OI~hDJYR3o?_PZQ#IdpYJY+Hm z--q>e@I0v1AP4{$1R+nA1;U+KhV45G2Z1r3XBprBEC4t>glrb3r=i(oc>ltEb&asL z1`n^$Y}#2iYb=0sKMDZC5XxncV7tWY!7jc1J=iXpS1ubfQlem_Rtr{EV15ba7H!{Z zB{}C9PkybW$44oOq<+ul2=o5X*stmKRw@>y%}uFLkj~F-6$<7Ri&7B$Zov0pID~o~ zW@aFlgVR%pqVKClk$JhCG4;A-oI^MVtE-SsL!$wmPV%iIbvnkR)0S}#k5me6Y)D5( if4=cwRjbn3nLYrH{QLU}0{l%6`#}@@_VD{9F|q;xF#yj01gpgWJ+A*m zGUYZW{T>4SpXmF{^Zon(`}_X;`}_MY3j1pm`Wy}V&B*(tydCWT00ICp0M7pd0000m zGd#J&@cQ@tG$8vu6a54J`qTCN{{H)06Z&u*`VIU0o2UAMn)~_v4c^|~0*D2u;qTwS zKYspMz5CDEtAAp>e+Mf5)@1$t_wR2Fu3uNK{_0!&`}CDxK-+|V{{|`s2p}dP{`2SW zZ!oxe=XdSY-}fK=Qse!l!T0O_!(X}WAk`4?=MOLh7ytr@32Xz9{pZ*3U(#Z~DiVIl zOa8j^;n%JAKjo!$j^Xni)Y$z6WB&k?3JlvV7}WR}00ImE Xyv9Bjb9W)}00000NkvXXu0mjf@Xt#6 literal 0 HcmV?d00001 diff --git a/upload/images/icons/country/jo.png b/upload/images/icons/country/jo.png new file mode 100644 index 0000000000000000000000000000000000000000..11bd4972b6d5f134045d4e8ce134601ea9b5654f GIT binary patch literal 473 zcmV;~0Ve*5P)M00|Ni~>`!`VeZ#eh`f&K#;fdS|pfB*tJ>FU-06DIsWc#z@uumAs9{`&>~&q~MQB#;&cfB*tH z31sk|Jq+K!KjiuK-^&B5YLK~LCjkTy3s3{|pFco7yH$Tr@L>D>cm1y|D}MvS>F@7f ze}Db{_vg<)5c|)+zsmedM_Y~p1Q1BWd$vDo!X?isvq}Pk|KA^w>VH5L!1(y{_x~TD z9$-NK{r~sxzrPHB7ytr@v6F$JJdlAwh=Ji34E;f3{DCq4fk_4ifB*vkxQ1J~H9>i| P00000NkvXXu0mjf0T$ba literal 0 HcmV?d00001 diff --git a/upload/images/icons/country/jp.png b/upload/images/icons/country/jp.png new file mode 100644 index 0000000000000000000000000000000000000000..325fbad3ffd3075a4a84d8d898ad26ef7d3e0d56 GIT binary patch literal 420 zcmV;V0bBlwP)9whYk?f=!Q|Ns8||JN@lTD;`{R1ZWk|EGa3dAO8ObDh3E3Cb;oH_5X#1 z|NHy@|M?558b}5Q|Cf`4hZv9q2p|@?lb|{i68>{>{ol0lx`{mi O0000=G`P)0NEt6k^VGA)9E1hT9ocRoN>wSfaWv)?-raRm?)Slj<6Po6w} z{P+i;{`~nD6~!ec29@~tkBNo($fnHz0mS%{fq}QS{_m4#|Ns2?|K~SQUHy-* z`HU>AfB)8feAoK(-@hL}|Nr_0bQ_Dj+^xMk00K}f2RQ&hFc1JYLgN3=lsJ)M+p3uR zWC5ydAM*!ly4H1hsiEFvIU^1)HH_GYz!QMsIYt5i1c4ZMLC4DfztdU-q)WGxxg;|L zi3%uAJ2fm~N8&I2%AdL;`{4^9#;e!&D=C-&Lk8;9|NlO`c*HPy9@C${KeOWnB;`P2 zATRu9VP-jSWFD-S8kh{*zoh2aO#pT8A2W0o(w3 z|5bef!~)j#|KF3RAf-U``!@sYUq;#A42-}3UHtv;%kTfcfBpOQ3nmTE<|1vNq z0ns0zZx{dq2xP;5h!=kY&G_~A;V*`-zy9<8Vi5ZI|I4p`PkusG11$kMn1KNxfWUtE z{TpHc!>?a|&i!W8{>5bQ`~TnHf3N=fz5nHq%!z>% literal 0 HcmV?d00001 diff --git a/upload/images/icons/country/kh.png b/upload/images/icons/country/kh.png new file mode 100644 index 0000000000000000000000000000000000000000..30f6bb1b9b6c5bf355f67a17531fa73beafa6639 GIT binary patch literal 549 zcmV+=0^0qFP)P;@arD~1pHxO_zPr1&>t9y%wPZrAQpyS3=Ms1K-T|%K*j%o>i_=z2W0&D^Y8ax zhQELQ{rLl7|Ns5_-|C4+00M}Gf#D0s|6k8u{RAokD*W^JKSaeZAp18+HBcQ8{rdA) zTAYJ{;SE3lu^j&CtN66?*W<_k{(=kvTJiVSPc{h&pyuy)ZZrJ(`}gOM|G$0#rP$=; zY#H_d1P~L*>3>1SGXDMzbOE=49-9EaM0J&9T`emwH;=g~P!Ocy*DnU30tNVGcpOKXK;IXGH`G*aB%Pig@_cF{AXeP^XnG~{rU5QfdL?ZSim;?VE{Sy z7c(ax6CWR+s|%BWAkauYPfsQR0VXz9sPSMM00M{!7+@fO0fqklmFn#S3Nf;>{s#gU z7DjgV{|pRrOO`MKef9?wUO?vn1P~(w!@{x_lZQ{f0d@UhVEX<0FF08K{sNMJKnNIa zzrX(mdR{@6d*A9+009Ja65pra?7SkZU^!3-{)PrTC`>`Y0b%_6|LHH#J`sQb0@|>a n0T_AEh(trkF%3aX009O7j5IT?Rho+J00000NkvXXu0mjf2r}#E literal 0 HcmV?d00001 diff --git a/upload/images/icons/country/ki.png b/upload/images/icons/country/ki.png new file mode 100644 index 0000000000000000000000000000000000000000..2dcce4b33ffe1f40d490cb1a2e03efe22ea56155 GIT binary patch literal 656 zcmV;B0&o3^P)8t@U|NsC0_uv12fBrK4XN%za&+zB_ z{P)aXfBpaa=ii?{|9}7d|NHmt1seeZhy|?e|DWei8UFwK|L5=jKYtkh{P{kK2}m(L z`||tm?|;94|Ns5#-_IY+QnEm+00M{!r2OxHhJR4iK=k+TZ>A77)*#lue}Db^^$Tb= zko*TE|NI8J3LpSOb8Z9x2m%4nC$a{*Gqe90@enzQH`ta%tA$7d{Sv5iP&~x@8dMF~ z(;dfh&fyCHF#yj00oRR-9sTeJMNR(n^YxvS3U`G57YhIQc>VqR{rPSM@(uBDU=5F+ z{|5&5hj_*A{sI6o0M7pbe|x2IYDAmA_)R$v7XIy^!u#*~18PtP{r&xWnDPVw`hiji zey{rM^8J)$5m8%@0*JA9=57`qRaXnayHCFDJ@r1pR}vUfQ&&Fu_xE3Vu+-%{U$!58 zQy3!)avcufO?mzv0@a%gl z1HS+N7!IC&H?5`#AOHX{0M7pb00(zPR4BWp;5AJa{{8^XwcY>#`eSh{`1tyzm&^bF q{8L{tuE6I1;oe7AG|b!z0t^7P6ga05`yJ%~00001r;P)}L!W`0l>rF;|7So3KrTcC!ho;=0*Gbf0S0@;YBwbYEs=i=3_$ev|Np-X41fOr z{{tp}0~v7g%iT=?0mQ<{9!@# z-(SD~{`vL)_wRqdfBpaan?+XX#@15+0mRIp%kY{1qrJR?xs-YLhQhSVzk_f6;`sgh z57Tc3#$ODKzZsZ*F#y?2e^`Y0-&}tV5I|5HD)yDjz7nmS1pU~~aVF#A6wD&YtO00ImETIDprOD_2B P00000NkvXXu0mjfKOhx^ literal 0 HcmV?d00001 diff --git a/upload/images/icons/country/kn.png b/upload/images/icons/country/kn.png new file mode 100644 index 0000000000000000000000000000000000000000..febd5b486f3f90056637b23caa26d838fbadd7d0 GIT binary patch literal 604 zcmV-i0;BzjP)h(K@ANy8uaQvQ^_nWcs z*Z-GL)eL_?t_B7*Kmf7KbznHW;LqhtK<$TZ9ej=*TGLweOZn#S|EVB#AOzI#2dDw) z)4xDJ00a;t5ND<*{rU5ogY7p9)8EGU->gS|Gwk>cG!LX2Y%nmu8NlfEl`8-N#0ZOI q248)K1w0H4M?n#d6+r+%fB^s&Q!OA|2rzyC0000Cs@aq@DuRlQczuzDZ5@KTj2q4CTH~*`MftCON|DS>3-+w6c z9|(gO{~7-O`v>9vKX&5_Kmaj*WME|P@B8=S6~kYUnG7sU|G#_z>G}QV|KC3#^7rq5 ze}4b}^_xjb^7)+E00G1Tlwy4KiiwGVIVgltUY_yi&tI!o|Jl8p;n#15-@icU*KbCk z6Mz3^`1ON{fdL?ZnEnBs@%JyYzyH5mxBfr4|7*t%=AfYeY;6C2{Q{!DKY#uG1wwy- z+}}Xm3;+QH(!lWNFN3HElfM4XRjZk-tp4-xFo=l!{|(XrbkBdVP9XXJ&!0aG3;+Sd z1adCWtuJ2w-n@w=AmGpT?F`?)|9k%Y-_M^QML&N+RfBB+Dh3E3pdT0*fp#rf!j_o$ zUs8faP3>oG?f*A#7{O)(oeuE;(0C>wVqgFWAQqr4|9E)*J$m%5y#o|bz~KAxm4S=v zKP&4$usU!k0b}RSKS4oYgaHH)%c-;9wWL`3={r0|OreK!5=N4TMk7RCwBA z{P_JV0}}Z6?;n_iu%H+Q{s1vR05Jij`8c?M=-GouSI=K${m;n9!7aeW#m~(x$j!^i z%zXLG*~fS9it_V|2?zl-00a;V#NgMjUvJ&I^~3uQB4T37ii-d5-u?gQ&wmw_XD?o^ zUAsm=P*7M%NJdr`Xazt3fo%By|Nn;%AAbM-ZD?YwEG7BBxA%WR!T-FR|8><0Vxn$d zUT@yKdH&)BP#Mq$fB<3y`hl076R7Rgt5;mSyo`Gea7>-}|M%}Nf0%y${3VbO@hKwm zAWK?W z+TGp#<;$01Vv<1pdP-ancZ!Qkd3bmLHK?nrgX5I}Ab=R3zkQ1wk#LIP517FKVgLC9 eRt>}e0R{ktF&Q^6#MUGL0000@P)xg`upqGzh6Lx zERQVE2><~E((v!!|G%IA{@M07EI*V_ln=0RjjdN{oM|h)7EO z{{7?6U#34`ML_iD4-=RKMg|km5|FijfgS(|AV#2u+YAh13=HqUkqe1m1{eb(!T=Kl c0)PMm0G()MDW>>^I{*Lx07*qoM6N<$g4p`a`Tzg` literal 0 HcmV?d00001 diff --git a/upload/images/icons/country/ky.png b/upload/images/icons/country/ky.png new file mode 100644 index 0000000000000000000000000000000000000000..15c5f8e4775b2b68e0360c1f4ff1f37e61611276 GIT binary patch literal 643 zcmV-}0(||6P)0{QUt82Kj15^L?rd`uqE`oNxjFF#yj0 z1e^fI2i-9Q(8&Vs@%;Dq2on+Z{QuwM00sm0@b~}!1OzrH#hk+X+Tt}E6bb+U_yPbi z0M7pcvI;2tA|wYPA^Z*x0300&EGqR875n@A_WS?(`uvdQq*oFTSt1&p=b-!h{Qv;{ z0st`p&i?}PGCBeX39IA)-~tZg`v#`;6$Tz2`uqI%`ThF(|NnA-^wR?L!uSAshx_~g z0000205Jg0{{tif814-hz}E2g`1#%M`@GEN)${-9=jr|Z1Nim(?*qH%B39iMC&AR2 z>ggNf+PVUWW##cF5^jI~{P}h24a1+`jKBZ?zJB$|uU|aB82|la`WF`1`0wBUe?VZ- zRnf8uXahh1u`n?Z4sYX?@pO{;x_8g;0tl$# z2T+})81L`j|Nel$KOpz_zrTNegN!(Tli}h6pb7teeq#K~3=Aa(fB<4-V9 d!wLWb3;+YKCC*ol*cJc)002ovPDHLkV1loTFLeL_ literal 0 HcmV?d00001 diff --git a/upload/images/icons/country/kz.png b/upload/images/icons/country/kz.png new file mode 100644 index 0000000000000000000000000000000000000000..45a8c887424cff6eb0471f5a1535139b965e241e GIT binary patch literal 616 zcmV-u0+;=XP)g01!ZoKn?Fz`<^k#?O_Q1 z`=8<8e}=z6_5c2{{QvRuAM+0emcRf01JR%V|9}7gKjGLHfB<4)U|@L0AiL;yFw=jq zasNSbGXHKG{NMlfpWxpAK41Q^gEaj6FV4=$@arEy05LIu!2gi{Gync$`1$|;-~a#q z|NCw7f0xa__4fbPn*ZDO{onuJ|3JnA^#F|o2q31v4F4ql-&_7K9cVD)|KCjiesKSP ztM&iLe}uy71TZ z|DRv){|H?Bqoe!x=x?wkfBu3(0w91`fMN3Vzue;gQUCt^|MZVr;{RRU{|DCmOS=6} z@%2BU5C8a_|1a6~&;1YB8$b;J0mKBvKpP_e^#OhS_CN2(f86)~DtrE)Yx94t!v9OT z|MTDe69TJd_zQH>zdry01PrBrQvYt3|7!q-C@@&>{!_XBPnqZ6E6@K61pYml`M2uu ze+NdW22lI}1Q5_kK)3wPV4bt}e=;a?{xkdrMUmL?|7pP3c>kYY0b~&4U$AjN34j1% zWLW#P{SRLy(>r)v0s|Y${(}_LK*N79FfcIy1Q-CnX{(%t#68R664G@6GIJN-*24NrwB3rW+v!ydOp^Ef6{n_)(btIFVjHa=pdp6)} zz^!@$h^2tpKUmc4)64h&|Ni?2LVth#{QKwk-@kwU{{Q=j;qSk{fBpc`pWlD@C4}l3 zHUR_xF#yj01d}3g9TFqw{rUX<|NZ>{`TG464+L38761SLpR(uO=J){s0Q&s>`~3bJ z6bIb^kphT`;m^O{e;I!LWBmP>@yDNkj7*H>@iN-VTtHNrD96Ue^ySz8pMMxZ=pRTg zKmaiT)&Bj@@b3@E4ZnZ>72sjw}n?8s2>T{qV)lKMV{%|NQ?241(YPff@h;hz00Cp!a_N2HF7% zr}y9gR8D)C;wJ_Sx5=xYz5MWpi4mv-=yjk&KmiL7K#aZ&_9^w5@1DH=3l15e)xUl~ z-0=7B?|)4HL4sh3f5LL21siGr0*GY=!$H*K#ZR;BJ~dv8zS`wDeeIR3;>1y|KC3hK=RLTAp0Mf zWcc&@%EC-|_DIyI;S5 zZoa(f#*3@};Q;9GfBygi2&4h78pxV*WHQhn|Nk-k{`>pa-{0-~I{v`b{|EZ(4?qC1 zz%@X;G0|`0)6dV-R;K{9rJ5v|%9;KB_nVP{8R7~c2@pVx*BKb3t8)H6dH@UxP=NgY z{qNULVEFv`^^@@rIK+N~gX`}f7I~!;+fM-m5DPFa{(t+%C?E(7W+q^;{`t)a3di3} zzd^yz010JK%>4cT^&8LzfB<5=h#HaqkRlk)Wq^@D01#jR5K~0vg#SK#00000NkvXX Hu0mjf%Ubyh literal 0 HcmV?d00001 diff --git a/upload/images/icons/country/lc.png b/upload/images/icons/country/lc.png new file mode 100644 index 0000000000000000000000000000000000000000..a47d065541b0d998da832e1981b479097a9b36aa GIT binary patch literal 520 zcmV+j0{8uiP)#-NSZgwz{Qh@GSmETWyIzrrS!pkkqDDw`CEYY|A1Dxfxke?UP9EWUlaZ{K@! zXYTRdfWyFioqIm+xW_M=V(hYvbO?~5ZHkEt37xh?rY1@PqM%`P+i2w@_wXJJO#nzA zheNt~+w1B3H|fqGMx=x!lms6SMy;uqQ4R``NH&49%B_cditsDHI6DHXLNubec}E0~ zb8dy|txA`rTkZMN{rCM3FV`MqlfuwZrz$X1)+?ntF|UvTkD3M?FxSaem74ag}Vzy5sA+`s~GjvDl6>(E?=UGu{=w?r5#MJIwhn?GrT#s zeRSo}v&#TUmcjL&mxEF>2%EIxN+SI=O=izlM$T5JH;yv-C%^zTfK|9CLa`qJ0000< KMNUMnLSTZ|5$YcR literal 0 HcmV?d00001 diff --git a/upload/images/icons/country/li.png b/upload/images/icons/country/li.png new file mode 100644 index 0000000000000000000000000000000000000000..6469909c013eb9b752ca001694620a229f5792c7 GIT binary patch literal 537 zcmV+!0_OdRP)sI{|q~>>TZ2$qp!tjsj_dmuxH+6SkQv+K1^Dpafp!@&+{r#8W&u@@le*a|z zk$)I|{ss9HAb?mjKkZQc#wYOgBhb-*|NQ;?=l9<~e?U(E{r5MB3DgSYf*4|4g1Z=I z0R#}sfv@v<-|;cLeDMG8um8XQ{Qv#?|LOa4L zz5|hefaLFgf557NB#8Tm`R|`M3=9AP!~zPVKOloaN+E`UP5lQo8*B+s^WVQre?jpA z5I`*dz#16EB$cmd~05Jg0{{#R40Cvt10RRAw z`u+d`{`)-+^5ON`yb$y0|Ni^@{rvm=`~3g>{0I^G8ZGb(2;2e)q~Yi9|KETAVEFqN zi2na)xwe&yo%hS1uZ%yx{Q;WF%<}W+mp@!0-yWP|m)B$h2q2(_|NnsK|6hiGKudoE zUGn9{-`6*oEmQ72y~rUb^YQPmzn@?Idwh=T>wA{p3V#3shzY3p@87?_|NZ&@_cy~| zpmRZP`1kJ@JI^@8AFa{s9OeCZO+ts{j1?4b<=-Nd5zA z`2GL?FD{9%H@9*#{QvEce@o8hC9n7wpg7QIfB<3vS^!iHvfyK-U8V5ZH#le}4S|yXQB^Nt}W|`Q?5-JjKDn&hY;a$Df~n9-WqyG5z}b zHWMS`AAkU20!9tv|KD6JO#c`e|FbePFfi-*z4`Hxjg_16|9{rM|5*PsvHt$a@%k1I zzvO#v;hz8j#Q5o)BT__yf)$AVfxHBa6HpujodJ?%_y>%AV59*A7yy`5b5c`Z!JhyC N002ovPDHLkV1l?nIh6na literal 0 HcmV?d00001 diff --git a/upload/images/icons/country/lr.png b/upload/images/icons/country/lr.png new file mode 100644 index 0000000000000000000000000000000000000000..89a5bc7e70711575c1ee3b83cc2be7f0e1fb29c5 GIT binary patch literal 466 zcmV;@0WJQCP)2Y|A4{o z-@kwT`t|eY&mTX2eEM}Kp+i!_T03wQQEla((gZiC0cs^;{c3|jAkj>009Kl@aN){ zC);;k0UG-E&);Xo*&wq)roznr3pD=Ezu&)DC1p;}S_BY4jKAN$W)>8Nm;toyKW@Ot z#Ps&Y4S)b*xg;zq)7SR<*)x!NAa?^@4{|ZkY%l|8FPQu15397y$%U%{0*LYZ>zAxx z8}J(slm+_X#f@tK0mO1iR9wET{^!#tU}GSb{Q3uSG}s1+e?a74b~(9Y%Qpf95aZY9 zPuWDo(ENa58%O|%pI^NU5I`*FB&GkLM&}>Ys6}P~0YHEO0B+J}4VS0Fk^lez07*qo IM6N<$g3a05u>b%7 literal 0 HcmV?d00001 diff --git a/upload/images/icons/country/ls.png b/upload/images/icons/country/ls.png new file mode 100644 index 0000000000000000000000000000000000000000..33fdef101f74e38e2422bb85dc8a31bbf1da326b GIT binary patch literal 628 zcmV-)0*n2LP)NT^udI6UX~&u_xA`izWBNXkIq%g^6Y%Pu{8|3yZC zlYxl^Ab?nacHcU-^!@XD|Nj5|`r(zVwkHE4BV6^xC+~{3+xxCp=yQ1PA~B|JUd6PoU1p;PCnS`uh0!`Wt}y4#)fi z@&Nb%0tn=Xmv@c{N@*}KFh0M&kIP1>YRmQG4?lbdn);9N*SEXB6{h}Te)Ie9Zy;d! z#Q+chF#yj01pfa18Ye&*C_n-K{_XVnU82h1@caA!0{i;;`V*Y{7}WX#^!xhz{Qms? z{`>&^00Ic4fsvW@|G$6Ruf6C#{P_EiKfi$f`+Dz}{FL7;Z+`vz4fMjFe?Sd?fe5Gp zAb>y`UVr&E@!c&!7K){sO`Ozkh)melY+9 z5KGUl3lpbYV0iHf6xF}JF{n*t;A3C_dhHtn&^!?O1t$N2Nj?UE00RIWZBXJNY9>Gc O0000 zKY#!H`S<7dzuzGA_xCRl`Rmu;Um!M^l;`6=xPSp5fLIuQF#P%V7sv;y25A5(1xW+7 z{Q_w~Xakza@Pz>&fLMUe`uqRSpZ|Y=>VQIE8-4+ehiC(l5cdDyKm=3_5I`(zTN!l! z|Nj0Es0O49Xx6_!5M^MM5b`fj@gGk4KbtNx00a<=83P0Vn?HYFf{Xx4|Nr&tKga?w z11|FC_y0eCSvdcCFfafF5XlYnMRN&=-B{`>{W0U03nA0WvHB!TYz`r< y{$OAL2q4DW;E4VQBmbdt8IZ(*2pDGo0R{jiB6maa(%qQ=0000! literal 0 HcmV?d00001 diff --git a/upload/images/icons/country/lu.png b/upload/images/icons/country/lu.png new file mode 100644 index 0000000000000000000000000000000000000000..4cabba98ae70837922beadc41453b5f848f03854 GIT binary patch literal 481 zcmV<70UrK|P)?-#?r-wgj45C|ZESQtLMVW?~Zs{a4) zALIXj41fOq2a1uNeOQW%&E= z|DQh$fB%40fEE4z10q3;-;ClCKpOx8h=su~@}N>;ErcnO|V^hXG82+5i4Q+5aFU0|N&GK!5=N X;lz1sunOP500000NkvXXu0mjf*7env literal 0 HcmV?d00001 diff --git a/upload/images/icons/country/lv.png b/upload/images/icons/country/lv.png new file mode 100644 index 0000000000000000000000000000000000000000..49b69981085ff54568907cd51a56a1e5d8b01ada GIT binary patch literal 465 zcmV;?0WSWDP)TuF);jrk;v#5jAUY900)zv`N|Ns31p}&9s{rUUv@1OsF{`>=? z-@pHYNg(_0@82^wZ2|}&78a1v|Gz$Y3Q`J0Kshi8lm?N%fQ(=Ne*FS+xn*U6mIDM3 z3(!4({{8=rtQsf{G!?8Agn$gN2Dab7KQS->1Q6rPlP7uPKoY|E^ZWmwzrbJwx)~sVSb)*-|Mwp*NlCCVfB*i0>4ZfB zFhYR-gakS;`Tzomv6O+~6D%TsAw}vh)M$o8KMw-~K!5=Nd?C`~#DJkl4QvBtQTT<=hAW5C&pkLRXaMS_oX@ePCublh%7`S0>4^BHJ{X z&jSWU1bzAnAdrUt4F8|~c=q?-U!ZD;3Wy>I`UNEa{sJFg8g4-`_wR00IcC z0c`wlknw+DNZ2$-$7NDlT|NlUo0ap!i1F~k2r~my1Y5)izkcK~h z{{rRU9);Krw*=%9uq;py&^Z7B1lI8X4~o-~jQ<6)85pKOHYf~%iU9%$qyZ=)&LIKv z04P8aRsoF!DgoLL3cdee4gVMb0*H~J5hWs_B!uw~i3^Ex1_pot0|0+0kn{N-xWWJc N002ovPDHLkV1lkWn<4-J literal 0 HcmV?d00001 diff --git a/upload/images/icons/country/ma.png b/upload/images/icons/country/ma.png new file mode 100644 index 0000000000000000000000000000000000000000..f386770280b92a96a02b13032e056c3adfebfa18 GIT binary patch literal 432 zcmV;h0Z;ykP)@|4`Xj5kLT%`al?B=W5I`(ov;U*0{`Ko0*gOW1x?dnY zU=0kve*-lD1P}`lGXhluRs8wG@Eb_}{{H{>S-s!?{`@vR^^5K2FR(pO4M5WY0*DFZ zqCZG(`2G8?)UU4`zrJw%x*-cw4MBhY08Ix7Ah47E{sH^x7s!U+ztwL3`tbkv-#@=J zum1jzWCJ7ENdN%^b`n?!@|4`Xj5kLT%`al?B=W5I`(ov;U*021*0XgD3^5{teN< z@cTDV13&<=05Ky_HBiN$KMcQtBo?#b8i1w)1P}`YD=UMn?0*)P|9^oV_=9jUlG7n1 zgOt?2g9iZui1GF7*Fr)<|ABx33~>V{CZ_AxuLA@S%fEmBAbhajaRP`eP%%INfiyrk z1T_G`pFe*90tjjYTn_{=GBPrt03a7C3lKmc4KH52_yY$2zyM+rgbiXafFO_o^aD@| aAix0StzUbk+v2SN0000M*00(~<{@!wBU}0eR!0_)M!#^$%c|o1wA4mpD0t66HlA)zv9Z3HD2a;wKuKxf3 zKLhV?#{Ykr|9@us&njQ==l`GI|Ns8^_xsQFIm-b82&94GKf}}4zyJRI4@Cd}JZ511 zyk#BtzrVk|eZKww|NG~I-~WGu5Q~)bF9rsH0Ad2#1T-6>`p@704FCVWdiqyE_S>%? zzn?t&`v3p0|G$6zgQ7n`R{;bN6VP4%{xkdmsRoGvjXbc2Q*ib#i+$e?>}LD_@7KRy zzyJOE_4n5=pu>QE00u!g^X8F}1){Re7)$pq2>GzRP>hz5WF0{Q`{ z7%1`&WXbP;Kox)fFb41M1d2p!76A1_RfAN3oCFX+Kn)0M$tdvjY9_8yH^9QVjn@nfZP*{rmI(|3?O9b~d@cVAX$tK?&3V z5I~F!3@gDg2t{v?r~d;6^$&1NgV7;ZP#i-L5C8-i0C2iwRaxXp%>V!Z07*qoM6N<$ Eg62#MXaE2J literal 0 HcmV?d00001 diff --git a/upload/images/icons/country/me.png b/upload/images/icons/country/me.png new file mode 100644 index 0000000000000000000000000000000000000000..ac7253558ab939481a85cc06dcc4d73503afb9f0 GIT binary patch literal 448 zcmV;x0YCnUP)l$FJ^m&#tWvBA4C(n)b76qu^ z3TjKJi*u=MzAs;^(tHqT@6cZ|8AHxz+0T%zR}I9mkc`8faCz48MN^H2?$<3((yN)j;^`52o304M1f80R+|X9}Iwu*X+N)@cjDs2c+lU z?_dAGBv9wyKfl@e{~Tjr001}1@4rADVDj%Tpgtwu-=}^u z00a=o2DtG+^6#HtKYxRyQB?o^{pa7Gzs!FaUNHa!5W-0i5^f%h1nT_t=O0kRUm#-m z!vGLKP#fTS#5u+P{rv~@0nkXGhChFS;q~V)5d8o97pUPE13&;VK7Rc89~k`k^9M+( vx2Q8b0Y@nl1JFDW`UNKcfk_?)fB*vkB(P&2-J7g<00000NkvXXu0mjfGX%sy literal 0 HcmV?d00001 diff --git a/upload/images/icons/country/mh.png b/upload/images/icons/country/mh.png new file mode 100644 index 0000000000000000000000000000000000000000..fb523a8c39d40401b9abcfb144a73cbb2d76b286 GIT binary patch literal 628 zcmV-)0*n2LP)qpJCu1p{#SASZ=3QjbPhlO05Jg0{{#T~{M_a8tGL(@4F<^6===Qr`uzX+`vVjI z>RSuFND|!tCprH%UjG&-`Tqfgkh}r_F#yj01OWa1_W1j+!`}P+|NQ*@_xS<*{r*D) z#ao8o+xY#_%t@QS?0~yfBW+Wj{_zyJQv%*f2f%)|)v=^uaq0&4j6{l|Ybrbh`TZ`2ITPyN!~wBya;Q+wXO z|N8qsP{n^H7N*~zApZOB??0dhfB*t%@KJoPW~Y4ZyXB%oU++J<@%!g5F#%3te)iws z==lAQ0jwGr+CT&T00a=DyL0x5XB;1||6pKv0FF^K^bd&vjBEyg00RK!=O6aq+V@KU O0000p}y_ZxVsQQo9l8qD!tQ%&&F2zEbEdU-v3mY$p-gb*;wwp?LFG<9EeNpZLj7Q z>zeacpNZ>XJG@0bcmXcALo;Ad(L@#C92p0~G#aM!FfF0T7^YIJVVFaIl|0gRpSyF_ z@0dgJ{oT}qqUk#4;-a-U9Fej5EJ`tIE9)E!qDfL@GEq>vEDI}q@P8EmenIHxu!*Cc zLK?@%1j7u0A`mPlm`kyT;5daWs;EH!+LV0IWO0Zyj4+sHxRqia#e9ki#cu?^6YQn9 zOfZ8&4uw%r9nR_}FG?tJ1sBpnAsdGMh7pA$Mlm3ABvgz9aj&GrxaT8{1^YB+UzPEM zQQ5*0;(QnblJRNh>E*%16wccXl466KPu9Lk=M%$}%9~Z3xs9na6KbZ+^U;AoQ+JVg=BO3kgY$Vuu?iP6r(sQV=EH;Iwf|hcN2Nd zPl_EfW;$kS3zh=H4ojC&X!7Bd!`~OdX{VxLp z5dC3f{KL%rhe`hT|Cm4jfB*jf2Sk3^vlaWpqpU2@27mx!VE|eEAE^2d5dHlPWd8sE>;L~hU=6?i|N8~f1J=Os z`!`SnKmdWv|I6_A575egAcQa*n+Bj_fB<3vdK75(@4vtQ{Do`yh0yRHtQw*LD9^wE z5I`Uef5B$|`u7W{2T22%M6!Vq>?D8y0%`dD|M#!IAl1MB{`!Yz!@u8fUYwuxex*z#9GlH2{4I3~mO10Ac~g+V6jVB)KI)-uUyEi4o|t-;5vX%A}^sE-TCS?;peW@7xO)zGwLT z>;Lb2Aa%cf{|B;v0lB{!Wo3aj00dxJ4sHN|VGstA{YR$4C2D_2_!cBcz(8l;%*ju; z_5-pDt^fjRVEX=(;rPk#zkV}({q}dw+K<0~Gco-B2UY|%8?FIpIzRw{{P+Lo&pY>j zzJB!i)2Bb*-v4F%#qjU=2Y>(qX<+*Ohe1*jY|LMVKOmiqU?UkIBoO`m3qe4|00G4K6*VFmu*EK13J3rK Z3;;9iRuWt9^;rM_002ovPDHLkV1h$@)rkNA literal 0 HcmV?d00001 diff --git a/upload/images/icons/country/mn.png b/upload/images/icons/country/mn.png new file mode 100644 index 0000000000000000000000000000000000000000..9396355db45a8ee040c790782209868acaad4b85 GIT binary patch literal 492 zcmV@{}>pU8D26lh`@M2^zAEy;6E4#hyVhJ1te8n&0xjw|I|OmAOC9q@qGTx`1kMs zKYtki{9$JJ&B6L7=Kt^CKt7QCvS|}Q0D(0y{Qoccl;O=^hIfA-|M~k7Bn3tPfBpOS z`}Y4|zknP@Sy`YB00G1VQttboLEtY##9yH3?>`J++5f+PL6rRiQNLgu1_potVgX{t z{eKx$|NOuHhk@zOpC3@OA=>```VZI207MK7009KDfg$woe}>=xgMa@Q`TZMV99$1f z=+7UZ=>P!)^22||KmS$!{Ac;a@cR$YT8L7JY6c`57{N{g2q3VN{s9Bw7X!l|paf9r z=TC&I7$7zP9Rm!dKY#u(FaQJ)NCWfVKmVWoW?%y` zm}dTA_#*kA1?Z>0QqoLZAnySq0pv->KTM2<4My5DUW>hHBSpkmCRUfavf4zkmMxWn=;={POe9 zpZ~vq|NHajABg<@_xGlmn*aic1*nOE;s2AbPk~B-;NSn>+$?|p{{I~>&N%tu*Drs5 zfBO0B*Z*HY)v`RYKsx~fhzW>+Cjb5S_s>6&>Le+qufKnBv&bF%YWVBlABO)w3uGC7 z{rLq%Ks`WL0R#{e(EPs)fB*akI^_5N|9=)g|N8#t9~WuY61}otf4Tqs`!(tD7m$X( zzkdG%X#fZyCZKPCW&?Et`7z=QS^~DI8Yx-=nhgK{7whGvYgWDg!B8&G1k~{7FHk81 zKmY(S0M7pd06qXVA~x>%?)v`v$?y7WENVL!I|c#<=Jn<;5-<%03=swpg4MkH|N9RH z59P$=0*D2u3CIB%01Ag+CC5rQSvY_G`T70NcNRvLcR${}{{9+hIZ*cRKadRo0R++j zv0Gk5I)>DQ+oULEUYSww-@{VeP#&z`*?j4i%tcfB<3v#u_k;CAlSmszIWE zes6rZ@!!9HKqG(r{Q)GE1e8GG4GeUkhF=T-0mR5q%E0gm7LmVTk@^EErhg$tKMw;y afB^u%K|axUkwLit0000IqP)p`2X)eQ1zd`|Kz0p8A$%R z`bTZnZKVTj3KfeK`2Ky*5B&e@&)?sFfZ#7s13&;VG5q=W=RZg_5SU54z5Mv&imk%` z|FW?#NF2HHZpKX|PKHOnfBpIO`|qDW|9~0*0*DFdzkh#$Hv9ux`j_+Xe->2}ZC)XM zHV0!dKPS0Ur}$Y}|Nr_6wBa96o`K;HKmdVl_zUt7(16dMgtTSeTz>rQ?Z?ko?mjsC zklD%d+V79-zd^=BZ2$-$7GT%`Z2%eY=kMmT9MVkp=Y%mFes6g9+4CZ|=Y~?>`*tz_ z9Sja7kOqJN0yzojravHW{k?SeQ|&okK5=fKkARLe6n%c?uEf?;0ubZ>f;9XA2p|@Q zU%!CHiwJW41sn7GB}e}J|9v$?qW1mmH(Bw2pdk4RbO%twKY##YWMEE2jz}>2 jgG53Y5Cqh~01#jRFwa04;J&RL00000NkvXXu0mjf4K^ZQ literal 0 HcmV?d00001 diff --git a/upload/images/icons/country/mq.png b/upload/images/icons/country/mq.png new file mode 100644 index 0000000000000000000000000000000000000000..010143b3867f21e7791b8254e806b325c13b2895 GIT binary patch literal 655 zcmV;A0&x9_P)$g8u&g1qF5h0Q6aJN-{1Mbz`Ie0O|k$ z{sM@ZfzzR@(T$Ir&B098+eukMUeMl2+1^x^fq~&CAE%jZ{^O4ipMU-bgNM&P{`mQajg9%ivrm#DT>t+4XJGgP z5I`&pzyAFG^Do#{Ra%^vg_(hwneqG2-w+MozW@IH=Wj)-86P+6=Wo9l8G*Kb0|+3- z*{jc+=}JF+`H7W<>HmKQUT#*P1{)(8poaY?9|3*x^4(W97N$Rc|4EDS&R=&5Ab=SE z{{73y$Ox4F`Rgyx2o@H`|EK_{=f}^#%*+g|tSlctd;ka_mU(L~nd(ak@UpY9GCq0n z(2rN05Jg0{{a96b$W_S@ACL(Rxa}M z`G=gy|Nj54lTiQv|3YG^`}+MH7z}h_G^4TA+~V=RqI&{}iQ&&bpkF?J{dw&CQ*JI+ z5dlsHn4|vw{rBhJzZb8+p1k+fF;B_XE! z42<9q0s8Xa-+!garV_&3Uw`~!Vgv;%KmY+HvKbgYfiyF)F);jMVE6!x-Ip&{0DU4U p=>-f&1_my$6wo1$fFwYG0RX)13*@;vt7rfK002ovPDHLkV1lt{Hh%yB literal 0 HcmV?d00001 diff --git a/upload/images/icons/country/mr.png b/upload/images/icons/country/mr.png new file mode 100644 index 0000000000000000000000000000000000000000..319546b100864f32c26f29b54b87fe1aee73af21 GIT binary patch literal 569 zcmV-90>=G`P)rBb0vs`uywH-=91j zzd+y*NDt6q00G1Vbl+cwzkmM!`SbO+m+YTk|9<^u`R%^_m*bXSzgT|#{QE0P`4>nh zQ2ZZA13&;V0loO=-(MgHX#3gMzn3`u{`KzHucyC$Kl}CT<*&8wzt6n|ss8o%*Pp+C zfTjZk5DUl#p#T2<`NjV0^vyqym4EMy|26&E??3;3WoiC?{O#A4)4zWSfZPMI0U&@t z8bCe+8UPFj-d`E(e|zZv%GLeN@c(z$rC;+8f>rHtN0D&|BIS>OtI{AOC zx$tZGDUcCBkzc|7XAeyp!)#=hy@sHz%Z8Nmi!G71?uGb{rk^vkcEsO8W!D1Ad0T=%Vj%gtVfB*vk>3V2g53(}_00000NkvXX Hu0mjfpCtxQ literal 0 HcmV?d00001 diff --git a/upload/images/icons/country/ms.png b/upload/images/icons/country/ms.png new file mode 100644 index 0000000000000000000000000000000000000000..d4cbb433d8f9fe49f06585dc46ee15593e3e621c GIT binary patch literal 614 zcmV-s0-61ZP)w!6%f1G{My^>{rmp(`~Up={s8&+{Qm#<{R63-jRF8M0M7pe zp74|h+7SfEy9M#{{`U3;5)b(M0y+2j#`QMv`vWF8IQ;$o{QUp?{QmLR&;S7V0*Gk~ zkHv3!H5OU9Kb*Y(q-ELEH9vC;U*%N({+r?VuV26a{F4-VqagC^H&EN}zd$De1Q633 zj~FHafsLPJA96}RV-#A)X~v?X^MOAye@1K9u&05Jg0{{zeC zH7h(V@9+2F_Xpti2mAc}=j!&)<^S{h0sZ;_Q7ob~2($C-{v8Cq(%>lF*}4LV2^e-j zV}AbzqQAd@=ogUu2Vs2v^{02G<;{1(|2aQ(EV23Z2N=G800M{wXv^O}|A7VrH9+)$ z7=NG)mcRcxm)QV402KN07wDuv009Kl@CPU%A;t|Pff9c}I{*Fo2PXf3L>PYm|M&kd z6T{yxzy1Ri0|XEw14AS%MzNxQNDQDd27mwq0OfZ^Ej7^!+W-In07*qoM6N<$g6Gg9 AMF0Q* literal 0 HcmV?d00001 diff --git a/upload/images/icons/country/mt.png b/upload/images/icons/country/mt.png new file mode 100644 index 0000000000000000000000000000000000000000..00af94871de66cd0fbf0ca8e46dc436d66e2f713 GIT binary patch literal 420 zcmV;V0bBlwP)Io>l+&W2PtRx|M&0z2M_*#`0)SN z@BhDl{r~j~sG3n$7H9)N0I@K!uxMy#e*W?mp&AJO{R1fisrv=e1J=Os`!`SnKmf7) z1AD;K%nYO&458rnZ>;h=xCZfJy-Z2&4h30>ylo1|%C8 z!A=4QAQtS#|N9SD2R9xVP=6R000Ic%Boqz*|DhQF2dLpM!{5I^H2?v`f~*=Iag5B& z3^Fndyu3hzLFn&a2m+c75I`Us-n@D94+enNf~Z%o__l08i(?1?2rvLmwOi|Xk;8TX O0000wT1SlAdCl&Y)$gVg>5qW^#Y{{Qp$|KC6V{`~n5M8AIn z$$wxH$UeVm6F>m5>|$VWV&MJy|4IE<4N06-W9 zfN4+=|Nq*iiwn$Q2C&jbT&$=TD3oCSlHOGFpRx(;BY;>KBo9alsWSh04>T2o{{H<9 zq`@}){__Va_~#GM1}QP2gACgN0*LYNU!Z^U|NnpRpWzq7|3Cl#|Nj5~7gmyqN$LIj zQvdWzhA$B4g=Z%5I`U&fgJtk z_g|1x{{H;?U6oxK=&at?J**6@V8K5Oe}Dh~1#%?NbbtT?*#Hy-y7l+}Kff9N{$pgg z_WK6Ie}+7v0!uEdpa1{-Wc>4s0pu$NunhnK1op#kuysJ&8U8Z;`FH#0jm^LQ>Tv2E z__*)izhD3U{sq|pR0FmFAb=oF`osMFS8?ijP~d>v`s?4X6Tl#928Ghke_*>=zWoA* zI8ZS_0I~c5+3<%^Qj!Z4rNibE_6+kRtZU3J46>yw zfWS`r^B2emYGC;Nhw;yEHn21ZK^Q<1%m5k+3<-b$0%`dF7h*inus>j>Kov-;VIf zD*pWek$*v<0SxiK|NjEzfQkVEh>@X`f#DO--wX`DVCWAL;}4AS4@`0~00bBSj-y@M TF2~k{00000NkvXXu0mjf^ET$> literal 0 HcmV?d00001 diff --git a/upload/images/icons/country/mx.png b/upload/images/icons/country/mx.png new file mode 100644 index 0000000000000000000000000000000000000000..5bc58ab3e3552b74d990d28a0f500e9eb6209dfe GIT binary patch literal 574 zcmV-E0>S->P)LFc1LT4cKmY-iGBrkbGB7ay`}g

    Nzrc?B z!}RAj&|v@p#KiFL&)@$*g@6D2{reke@BjagZ=QH_|HA5tt#{7v1Ul>guV4Ru|Ni&u z_rKqNfHnXG5DUYvUm)ZE{sF26>H%tC6A=5t#K$G4Eg-G_A87rbKVS#^0WyF#00a;d z1Ca3#WHt~1jRI=eclPL04k1AU{avRH{sTG*Y{UOQAO!R;KmY+XFaVtnvEdic(+vNe zOr8IIc?-17*~$Z`|L?Eg|G`fB4^+g!01!YxCouq>54Pd=FQ6a({TC7tjr5F#2GXxz z|3N{=01TJ^fBykB00a<7!|#88#Ce2)8ovGh$;ikEv=>5x7)(s8a literal 0 HcmV?d00001 diff --git a/upload/images/icons/country/my.png b/upload/images/icons/country/my.png new file mode 100644 index 0000000000000000000000000000000000000000..9034cbab2c02704b65fba6ecc4a7a1c1d053b6c5 GIT binary patch literal 571 zcmV-B0>u4^P)Z-xKO+5@Bcl`=5c~|G$6#Vc^TNX8-{JF#yj01a@w+002>mTdm0Dxpa1{C#)An)W@eTA0)PNwiNI_f1h_u_DTrb&+z}xv;{Wj zFGj0Cgf$G002ov JPDHLkV1gu%1+M@A literal 0 HcmV?d00001 diff --git a/upload/images/icons/country/mz.png b/upload/images/icons/country/mz.png new file mode 100644 index 0000000000000000000000000000000000000000..76405e063d43f2f3b5b9cae4f76d9f1c73cea25b GIT binary patch literal 584 zcmV-O0=NB%P)d!0?ZO;SY>NM!#Sr3j;s^4&s;y01$=&U~zyG1R{bN8&$-J2AZUB z{O~2s*67}BSLujJh!l{(TM_&V!SLx<0I@JIFetqFAHVYHe9OP56#xDPD){#oDEIpx z82$bI>))?me}4fPvfQ#j8vp_bq~ZU+|9p&pvv&RstuJJil>ZL~|9}umff)b({bONa zxh{1bAb?oDF)-ZV`m5;k=ljw>l6BpeezVN}{rlPPKR~N~|N8X{NCKH4>bI<%?516t z00M{!=o3jd#=5m)yzyNB8Nca#eH--U&Fe3(f#?+keR}os(@P+F`}Hl*IRF8~0t}ng zTmN>%etWlrgX7)b6MtD}{$cp_8-#v?7>pqD50GU3{f7;x0U&@Fe=;yIS7rUbaG!zu z&%cJ+j{>}Z{{3SByBg&1|Nj_3~Dr2e;Gh>zZrofD5`!lF#Z7{ z2B7#~hM#}`y~Cfd!0!j9&~4{}>qlfDw=_GI6Spo7yiaSL1(R34j0qF#yj00RRApetkm@ z3-<^I`04Bn_xS?+{Qmv@{`~y?GBy}bOB@O2-v*J4|MK+z`}_2=vH}QbDjOT??*y+^ z9PHma=D0k1DE9l$Z%$6;=mbqObq>D1hX4By|NHgp|L;GHwRPtz;{gH)sDXiz;U6Qz zZ)V2dKoY20MNK$ASA+NcQ;z)f|Igq2|MmO7w9@DL!aL%O?v>U60R+_W>(dw3rWqbw zY+vs`7YYhj_p}$}TRP+a`c40T|N0L!J1pWwjPJac>kgmX!|;RwAb@}x{`~&)@5xJE z5fO>bZXLnj?>WlS|KEEGbn$;~p|4%Vx0QJ+&gI^Ic|%b^5f~5v0R*z)@87>RPSSB9 z(mdPNGA>^D|K~4|Gn`ysXGCuKcCvq8=a*k!egj?m?>8{m00Ic8fvd1cUx@iTXM5HE z^H)FyGjo2eEq-FG+;YA1)Puvn7=8hj{`vO@7;-=x00M~R?)3!82NxK-n*V?K1yZeJ z{HiGaByR2;1J+usHUNMy48Q{FH!M8N)Pwp9Y)wTFo81A^+}-HTA|tp~ zO4-IyLWKVGUAVv#KrFzpU^vb8&*4vW%&*_Sfp-5+Oa#jR{(FIy5oqwQKVTa`BqPut z3=9AP#KLU;d%N^MnR|>Uj{MoN{TEQv&!4|iQhqnS=35v13ux)DKYxDz{qyJVA7#|2T literal 0 HcmV?d00001 diff --git a/upload/images/icons/country/ne.png b/upload/images/icons/country/ne.png new file mode 100644 index 0000000000000000000000000000000000000000..d85f424f38da0678471ef4b3dc697675118bc7e0 GIT binary patch literal 537 zcmV+!0_OdRP)pTI(!tjlO;rIXl@1HV&)cpmDGW-GR z`3+L^2aNvy`v2$G|KGnEMPz|W00M~d>&=s#l8OvKbwEpiHvESG2>tK>|GyyO9|$ut zvpzk42q1u17-V!9I61+pfvQ08|BZwH@16Yr=jVTUlmA*S|6zcEk@1g`6+i&7`~&$E zYA%%V^7j8zTmS$3{hyirzos*?2B2bq00L=%yMh7Y5+V8jy0-s+|NJkm_8$o_f}Hjb zAb?n|yt|^zto-ZmuYW+t0)q+&<<KJ>BgrQT zRQ>1Q-#;J~AoS`6pHRCwBA zU~p!DquG0BzkdJv^XJbWKYo1u_VxSs@1MSW+P$@#L70Jomw|zm0SEvBhy{qNbE|>m zzkmO1v}^=;1(+C_zx@3C{m*wPUMbGM98Q`}5v}3B|NZ&>_xGmUO#lG|(!jv*|H=EO zfB*gc{`33)|Nj{n|Mza|{r>BFYe?(AfB!%K_3?Y%L>Z^l>!7{V2qIffI$#e zz5f4~?wt{_jNwA=k=tvV8m;04hxH1ClNsp|jaD0d_yUND;Sa;#|9^ps{`~n3bQJ?5 z!?D}Pp1*tk?A@~oJ0>vvX8@W7)C|%C)&LMdARGSt{R`y$`S<5P0|@TEy!-p_?>~S2 z1lj|1A`hhCuT1`^U1^@yK06yzfAV)~#?EnA(07*qoM6N<$f^cITh5!Hn literal 0 HcmV?d00001 diff --git a/upload/images/icons/country/ng.png b/upload/images/icons/country/ng.png new file mode 100644 index 0000000000000000000000000000000000000000..3eea2e020756c41abf81f765659a864c174f89db GIT binary patch literal 482 zcmV<80UiE{P)E-@kt#fq(zr{dlL|rVbPb$^K$sU||3VAQpx%4ArjH z5b1ya|A`BUvomopF#HDspdkBi_LzW}KMcQr|NHa%@9#}BHvt3?3s4hK`pMU)fB*dj z0+88E|KR{Ac>Ck+U;lpn{`Xs!M;2%gKmf4-G0FZ zKmdWv|I6_A&;LJv{(%shYM_N64Szv401;3FKmf4-Jp?oxsQb@fum%PU8~*%)I0>i# zs2CuCKpOsn%?64Bg>X9QKhy?*00Lh)xZD#`v33$e!wuw~|G$AI0?h>~ z1_&UqlR!#;Ll9OQ{s1-n2ZahyF+c#Z0Amdp#**BUAaDHn%gD$G3dPzV3};X@Gl13bFaQJ? Y0MmSSAW;3b&Hw-a07*qoM6N<$g7#LQDb&XuwlP!fzJKM z`1`}(|Np-K;|B=>MS!;cWf13KY+LvSAb?md?)rCHn)&`aU^p;VI>1V00D#b-){yc34R8!1Sqb680000@|4`Xj5kLTv#?55wQzKoX38|NjLffBpXj6#2y{D-E;(Ab?mHL=FGT z$TP6>fK>na1GWK({(upf0nrSU5*Gz(00%w4e}91F-@gjtJbOE500a;V!?RECzy5mt@dro_q~YJM-#~SLe}OeX zNT7y4|NilCvNABd0|+1%hF>6clER!2lYo}|1|zVkK=SXOfB*mf{rC6ZKVbL)odgg- vjKFAPVE6?_e~=h|kVO7~qZmRm0R$KTYszPUy89K;00000NkvXXu0mjfB$dbi literal 0 HcmV?d00001 diff --git a/upload/images/icons/country/no.png b/upload/images/icons/country/no.png new file mode 100644 index 0000000000000000000000000000000000000000..160b6b5b79db15e623fa55e5774e5d160b933180 GIT binary patch literal 512 zcmV+b0{{JqP)O=a{vExMP2%`MCSoB^FIcLe_%lf;|~%E5I`(IQNh}3Ao>6Q|DFUXMn*>AqQd`w z|1kXd^B;tM|Njjl{{hM0zwd6?1Q0+hV1xeud-4=Wy?p-%sO`^#2S61Jzk!N?s)6X& zzhA%p|N6}=D+{y%Ab`Lc{sL9~1=0UN4*CD*7s%9KAf+JHKs~=eB-8KTKvw|-5R1&; zzd&a|ob(5%^Z$Q=wHy9p13+aOpFRNu5F>N&`Tk_-7w>=n{RejQzkfh&Kn{rf10?_b z{tFTZibx5v&dxav5I~H7|Ney-|DWN1$%1FyagzUW0464;_wU~W1Q5$TW@eGxtUvee z3vAf*8|igK9~@*rr66bh|NrkNM8z+V zAV?>O@ek;bKfu6d00KAO>U2WB)$@6+CBT{3ok>^7H@y{~6FRKmalQ{r8#S z4^Xx6Je&%q%J2@E@iKAb=Rv<(vO+e^|@#56B5{*~0Mg z>UitA{$OPI`~Tk`F#7!u z%=q{3H<BYX7n!%ts-g52=?&#%8AHvnDo=g*(t zU{@(f3Lcro01!Y-3_uV4{%5PNloM>zp5gQNALI8Qf4=|z|KsPsAHV+n`1$wy&wt;4 zfzU5-=mP{0FqD1)U3&iJ)0b~Q-+l7x$B&=CVSxxV`w!S3U{3%6(9;Y60R+_W0~jFx z85t(6Ir{$dcL`zMKcF!E2U7}WK$QOlX#fZyMg|5;)aZo7D4hMD0TloQ7ytwk}@P)zKX@%&%DST%gMqDF&nJ<9}^SM9e)7=i1G97Xij+!pc8>s z0}TKw06GH{9{>J;c@WiqflO8wrXNp!0t65X1H*raF>uuoM}q1_&UQ zzyE+PV}l7nR6|1@Xe}f}K_mmn5Fh~%KtLN9K+(a>4Du5*FzA2|{m;zE0Q4slD+}03 zKxJTefLQ+k0*D1@+|Oq}Kt_TL2e}yHXa<;L{(_vY&wh05Jg0 z{{*4}t^?F62l4F%@9_Wk_yrLV`1}4n_xiEzG57obO$p>A_3H5V5SZl@9UBk;0Q>>~ zF#yj00jE58tx;oDUfVAO7ZA^g)(IQ}Y8G-;ZB^s|2r!a55}@Ef&J{K=uDyPxdE3 z4FCZEF#yj011R$m=m{0X((d>7`QGgNy~*X%==~K4{m|+BO$p;F|LeE!5zX@o6aMwK z|0Cnry8?)1@m-dDW`RF^3@85Z{`vj)H~*iTuYX^D_V?HC|LG63e*OOQ`}ZH9+h%{4 zR^kLX2_S%&fc^l6#;?EsK&pTL{q^hL&)-1T|AVLlN&WsC!*d@f`}fa3pay^dVgYLS z^XKpHUw?lCNw6Z2x?f-t$o}(Zg7`(je_wy{{yg~C5U2qlfPfml0Rvc4oChck)CmlD zkWL^2sNoMV9{$c|wex0wa`2z{-@pGE82$nT5F-OaFayIEq`3SAj@n=l%a5DE9w9oI(Q6o;?Ey zAdrT?A3yTg*!;YE_t&FGSk*xQBO~LVKYsuMhzTgoEGG70+cq{OrGLMF<5CR)KqmnN z5F^kJDrIFqfoA{t^Z)mszkh!J|NR@N^WQHZ-f!>?ZqK&!y&{zFIzP0wn(b{R37FH0BS}Z;-(ZzkW0R z`o;JgO8$qifBy!003d+C8bA*C^$+NzU%!${e*gOW>-S%fvmgwhvw&=%Tb23#oNZ?S z2p~`>{R0^fayL*XP!U2MkOb-c1#;`ZzkmMzW%$Pc5I_(c{;*0)g6#S8SB49$^)FDx zACSQydx0wd{{073{+Hno13&;Vu4Mp{AoLGRCWbOF`~tJSfrb9TxDaUu27mwq0KDvZ UcsT?Vy#N3J07*qoM6N<$f`X&bC;$Ke literal 0 HcmV?d00001 diff --git a/upload/images/icons/country/pa.png b/upload/images/icons/country/pa.png new file mode 100644 index 0000000000000000000000000000000000000000..9b2ee9a780955566cc7dc2f59ce175f32d3731a0 GIT binary patch literal 519 zcmV+i0{H!jP)|lVPPN>g8sl5Km-s#EI@faK0YA%?%RKmGG2!N|AD;!zX}Teef|3X z_wWCI{=muCn>GOi5DUcMXP^GBIsf;|&;M~|Oj3M||NsC0d;h_|&!7JP`u*?sum8V( z0aY`}$^xwd2q2IKptK|}gRT_Am!FIf)j$AI2PS_*H2ec11_potVu8EfUYUvEKf`}G z`1lE^`X5*+Sm$r%-@k!200a<=Rv$}~=bu-f|Ns5_|IfewfBrH6Nrpdvs+^pde*a>f6qSrfAZn~Z?Fa+2||AuS*t4lqXH%-ra!^K00G3r z@ax~7e+)2nAoSxWko^y??$?YNza~t8coi7j009Kl08{<<|1U847wF+XP}P60U;n*# z@9*{N{$9Nb{(u|?WHSN*&{SqkP0pSkP;|=6L&63i zfEXEE-vV95@Z%rDuRkCLl>P7efnPxL{(%8d!yj-G00Mvj0{}mHT?%@XEt>!U002ov JPDHLkV1lK4=}rIu literal 0 HcmV?d00001 diff --git a/upload/images/icons/country/pe.png b/upload/images/icons/country/pe.png new file mode 100644 index 0000000000000000000000000000000000000000..62a04977fb2b29b96d01ffef3b88b6bf2ff05862 GIT binary patch literal 397 zcmV;80doF{P)@|A6@UbB2E)`X3x9D*gjYK@dOyv49j-R|ARv|Nb!om5Pi12buAo@&A8j1_q}8 z|NqCt{Qv#?|DQiV^2?@8009Kn!0`Y7lcx-S{{qo}h;n3b`}Y4|zksS4Wo3aj00a;V z*zEsM)xUqEs|Es~YOn@|-@kzx00M{wh#7&Zfj0j6!|?mhe@uX+0cadR0D+zK=P$&S z1T_5l12i2VfWS`r`v>f&U-&gJf}I2qKwu{UjsNuvF#Z0+ASnqp<}V}$85tQ7(W#^a2}2+PDh3E3#;-`R r2#VqJ=b;e{^dbb<+Crtk03g5s0zF}bJ8sS=00000NkvXXu0mjfKVzU% literal 0 HcmV?d00001 diff --git a/upload/images/icons/country/pf.png b/upload/images/icons/country/pf.png new file mode 100644 index 0000000000000000000000000000000000000000..771a0f652254b4e891fc73910aab38967864da54 GIT binary patch literal 498 zcmV3lobsI zohi_A`bB&J!~)dH$ngL7lczwX3_#UDxxarw>LBRX?|;94{rmL`$Yzn1{l&ll5I~Ht zU%nI;6$RPw9|VBf|1(_vbYnFmA3K-0+yDOt{~_StKSoBzkDopP1Q63dnCt(82%zd$ zpFb}6I_2!oo##J&nDhVtbEpQW0tSEpVuGrMivIupee<8UpWZS`Uj1hH_v_am-&g;K z1CTfW0R#{WvT7jw$rQ2Wy6P|4+kZd)xq2}(*g=aGrk)Yxu73al#Db(Bq?4D0-N;b? z5G()RfB&pB<@s4TkY)e;`2!F@EcYcO{->q=ymt>64xqsK^^5b@FIO-F$h{9?`~e2* zUv?FhqZcm%1P~}#|Nj2NBq_=8`#0mCzd$+0-@loGnqiRuWPl>)F9-k?0|XG`aR!E8 ou!#JF#Q1|6-w+1S#{dBa0Kx%7Vg$%BF8}}l07*qoM6N<$g2}Akn*aa+ literal 0 HcmV?d00001 diff --git a/upload/images/icons/country/pg.png b/upload/images/icons/country/pg.png new file mode 100644 index 0000000000000000000000000000000000000000..10d6233496c10e52ead975c5a504459fad68ffb8 GIT binary patch literal 593 zcmV-X0Hv=@BjaQ|F{1AU+wpQ{$Kys{`!CTH>0fVKL!SX0Ad1a`1cQJ=-<7ptZmH9SAnX3 z{Q_yQ`~BbL*ME+m|K)!Dcl`DLKS&U$0U&@t8vg$M`{&P}#F!W*N5{%vzvln`{r&f^ z{||ospYrSf)?fc0{rZ3A*Z(w-2B2bq00L=XVPVP4%$zZO`i8aZ($dmav$E#>{B`Z@ zum6{R{h$5&|A}A!9e(}a_zUO_pbY>4IGm#s06-9cg3a4XeYH!D;D>_*`V5R3;NTtr z%*@^Mq=>M$LXVh`5jChqDeaf800L?F_U+sH_3M8E<^KOyQ&ao$p literal 0 HcmV?d00001 diff --git a/upload/images/icons/country/ph.png b/upload/images/icons/country/ph.png new file mode 100644 index 0000000000000000000000000000000000000000..b89e15935d9daf25173f89a36d8111824fda5db5 GIT binary patch literal 538 zcmV+#0_FXQP)N~0_Y@w0Al+04@f;`V3_{@|8#9F=K6XQ9UY*azdwKd1Cc)=8bAo50U&@_7#Kb? zFg*PK|H1$NTnr5Nxw#FRn^&xvtbK0f`#-;cuKxpc)t_H~fDExeq6ZmH0|XFI1NZ;` zGXMXp{AUnj_^>}zDz4B$`$1}#7U0X2MOU=aELU!7sY=Kr&1{QvMCSsj$|2dLpM12Fg)7ytqY zsKMy}yX6c^FZ@4woIyZ63`(G)I*8l(j07*qoM6N<$f~Z~XumAu6 literal 0 HcmV?d00001 diff --git a/upload/images/icons/country/pk.png b/upload/images/icons/country/pk.png new file mode 100644 index 0000000000000000000000000000000000000000..e9df70ca4d63a979e6bcea2399263c081ce5eaeb GIT binary patch literal 569 zcmV-90>=G`P)`{xe>ko^7oADI06=l8$gn`UeR2p|@S@&Et-|M&0Ts{jIsi2(+HrUEqpC9EW^)CAOaJl^^9-%lBC8BHP081)#ChQGgo zHUI<=3(zGH+B`^Tu)Z%{q{PpYS&%;j+KluCr=pK*_e;5D)h=t+bKO_wx|Lu6N(?HnJ zN6`lu;-7zgR^V0GaA(7wCwqWF2h;!%KrH_l5Kj8_?>EpHKuhXR);;uSzaAK9KY#yZW@T0p zQ2G1+FVF^n0AhUp{`o&J`0?k5YKbbt8;l4>j(9ExfB*vkhsr>Vq>*li00000NkvXX Hu0mjfu=^7c literal 0 HcmV?d00001 diff --git a/upload/images/icons/country/pl.png b/upload/images/icons/country/pl.png new file mode 100644 index 0000000000000000000000000000000000000000..d413d010b5b097c4e0a4604eba86dad79567ed16 GIT binary patch literal 374 zcmV-+0g3*JP)Ab?mv3iQ8Nu5A{|6C_|Nk>HFfjc`0biay0|+1% z2B@O{$c+Ek03##gzdwHf0*Hl3)etG5lK=vU1?W~rxN0!OqXDP`Ab?mH`1u+7`u;zA z_W#cxhChG)!_n{G|9=A+zrl>(AX#bYe+w4^1Q6Is4VEzI_51&? zUm!LT$@u9L&^Z7B1a=Zw2xL66B2?87%l|Mi00a<712fnG3~)u5+Wr7F{AKw27w8;- z00L=X`u&GNQW9*;Uxq&*os3{386YGO{rw9;K*az7#P}5)xp2gQ%0-g`0)PMm0MPYZ UsK>Njp#T5?07*qoM6N<$g4HXSwg3PC literal 0 HcmV?d00001 diff --git a/upload/images/icons/country/pm.png b/upload/images/icons/country/pm.png new file mode 100644 index 0000000000000000000000000000000000000000..ba91d2c7a0de26e554979f6351d42a1a4e22de3b GIT binary patch literal 689 zcmV;i0#5yjP)#D@XkmAv!xDMMW8-mEZ&mK%|%B2@pa*J{pUD?(_ahBqlG}*TVt; zF#yj00{;H~{{a8``T70x^5Ww5-{JLFN2dS#-{Io#@$TjE?&8zZ_V@JO>E`A8`2YX_ z`~rx{;oS`3$G61pUY_{!-0$E2{{CbX;QPSJ^3BEStfg-V`n;-q6+;t+Xyw zOy)sS^8$#8OF-b~@87@v{bTs||L?z_Zq~=&zGIaZd&b4_{m<{;|Ns5^`sL5xKflEU zUjXHSP67x3F#yj01nBVe84eEr00I90|NZ{}FelkBB-0BC^O2xB85HWz)f)HsDi#s! zMLEolpK<^Iq5=Rh0M7pb=>Px;h=2d#;^FNBZtPGJ5bKP1n*{>+?(qio_5k|){tF25 z`1Sjqtv%A&PR-7P0st`p&i?}b008M5=kFQg|M&R&{r=?U4x6PnhWa{`B$w z?CApk{rU?E^8f<&008;|hy@rKe}6M^a>=kt2+9et{QJXr>zQ5ua`W#$8JQS={rbi5 z^Ctr{)6XBj7@3%V17i>%fEb@MFnj<<;{gVSbOv{z8Q{qN1r~!u@ISB;HgNQF0R$KT X>6#2<48ze<00000NkvXXu0mjf$fQr4 literal 0 HcmV?d00001 diff --git a/upload/images/icons/country/pn.png b/upload/images/icons/country/pn.png new file mode 100644 index 0000000000000000000000000000000000000000..aa9344f575bc92f4c1a5043e6e7d0a8b239daa64 GIT binary patch literal 657 zcmV;C0&e|@P)$VEDzr@CQtS7ytnPF#yj0 z0a0(~eP|Fd7x&oU`XvhO+V>M05dgm54eRCe)!y3s`vCp^_5Az)`uqj_{QRhrlmY-T z0M7pd#W4OILofm6?eh2PFCO>E*7Xbx0@lgN z0st`p&i?}F01o{F1pxvB0QdR->g@pe`}O_>?Enew{R9F2_ajBO3l7@{2K78Gz9u`z z008^~05Jg0{{!Vds4FN77!dx<`5YAi^1B#F4D8&$5I)oT72fOU?&Jm;1k~m5*82ws z?b$fe$;$!&F#yj01PbEP9OVUy$0!>9?*iHF&;9=9{2wXIjNS}D{P+g={1WdM4-6DF z>gCe?_5uI^`T_tk0M7per>)2uHb&;=(#87${QNQl(a`kw{Py}Y1nctu{`UwC>ihis z2n-DS{QU(1_5c9-0*DC|aR2`P{`;Tl?{DV6zkmJy$H?%Xjq&fFKfk|zXRCbma58?r#f z00G1Tv;`<3F2eQa&)+|P|NZ&>@AqGj(m#Ly0)zk56?XydpHmj-@bfY4J_0oTA3y*x rGBBhgM-@1KAF z|M~a-&+mVKfs8*8^zZj?AObQ@tXl^VK#U9w|7)um9zFT5!1JoGnu}M2{r|uJ|AC@F z;y(;9F@d=M{=L6-3m|})KsNsS&&$bh^PO0375Ag3EPt6;7?_!X=sz3*^#j#0Gyh{@ z0SF+Vlm3Z`F-Ar(?BDbM+y#c5od5B%>y$nn=KcNZ|L>nr$AC#T8JS}%RsaMLPy>UR z34^BAe{Qb-hmSD)`~82~jewZHH;sOtVgB{~2T_Lx z^M7~ue_6TzObGu%0nl7VM#g8?t^ouP$PYjMFazDG!uzbThlgL98zlelKgeJZ;~z*Z zSPxJG!?$k$0R+;(`ulr=6P)M00|Ni~>`!`VeZ#eh`fLE8Q){QmQQ=eGY$|NqCtU}^v=1iBd@fS3^8`SJ7r@8ADF ze*C{^(f_{w|JZZ@y#o+HED**2KY#i6{~yEeU;qEJ{Pzp|pOucqNnlF=0*DFdB%s0n ze*I+l{{11(um4^iSXF}z{SS2YKY#!N`GNV*AE2Jys=p_Au>JnK{@0e3zk%WO_xG>A zzkdJw^XDIk{pa6bWqzfjEk^+Y2&CaX+n+VzlIN6JC4s^J?+-}zKcEU=eEj+Q{|`_P zFrfeb|NHmfUxq&n00G3<$-qz^$iN`P!0-!({va{_z!?9)Bm)CLfB^vHpj0t%_B3$- O0000op82)aAGO;3n0AgYI#891D4N?IF|Ns4E{L7&Dm*MXp#y@|U|NLS4 z{rmr)KmTFmmra`h0*Hly38?u0llM=#nEx6H|J4!x{U`A6pVzdvv{Rd?JIrI9L zs`Fos+0`Q4a^C}Q0+k5A1KaQ$>Lf<6lK=vUh2aka(D+|}f9<^YM_B9kC$A?0Z|}3+ z`ptao7t>dSY6f5^0o~2O01!YR8-T_G^}PA>yZ7X8cHUpx=KlJ_{+sC?ST#h$AD{+c zSpNn30U&@_7``$5{_{tYU-I{#-$2g*Lz_YNHw#c5FVJd`!65YaF9ZRd1Q0-s48{x$ s?-&?Px# literal 0 HcmV?d00001 diff --git a/upload/images/icons/country/pw.png b/upload/images/icons/country/pw.png new file mode 100644 index 0000000000000000000000000000000000000000..6178b254a5dd2d91eeaa2a2adf124b6dba0af27f GIT binary patch literal 550 zcmV+>0@?kEP)~nkZ zGRMDC%7~XK0S0Tx8Wd7-QG59jKr9SQAk|O4{{Q=*0jSzY^rW5C9>)KFc0aM(`^fh9 z|Np=Kfe=u&EDs~YzkdJ$!~!z=-~YcrJO42FE6xsAYGq`2_Mbt_P-yG_e|4Mhx&31J z|LZSE!|%TgKvw|-5ED@OU$BE2n0|Z9O=M(v1mpqrFfl%gR9?uy{Oi{rkOq*RfB%6# z1PCA|pp${Bfd()#{N!P|4fj41<69Aq$E=K>;Tryc4F(7xpbZRv|AD;q^*8I6-->Vz zfB*5n`o{nM2Peo6f5F}W+3*h_fS7<7;^vxc*?8?`g7w0kCk@cHxaHDByoH$n$~K0fYN5BQR!wAqjL2Kmai^lz(OTgcO%Q oK%!9YKcr{|u^AZn7ytqc0H_5zuk@Q*SpWb407*qoM6N<$f;OS^T>t<8 literal 0 HcmV?d00001 diff --git a/upload/images/icons/country/py.png b/upload/images/icons/country/py.png new file mode 100644 index 0000000000000000000000000000000000000000..cb8723c06408828ce68a932ff472daabecc64139 GIT binary patch literal 473 zcmV;~0Ve*5P)@|4`Xj5kLT%`al?B=W5I`&pU%&omV`KRD53KJ$2txq_ zg7fbmh|k3I@68*40Al&@kBy(1nSq%Zss!k?M~{APS@-YvZ#JJG201x|0gQ}qez5@r z5EI0wa6>`h%cteq@9Mue|Ns2{KQdro`19u4 z9*F+^0|+3-w;#WAv9bOIX#?r_2Xj8qX@CF21pWab0}C_Lljko10*H}8@M3d^)Z>@G zf!6*0!vH4#gGo5!|DS*V{{HzdC&9L6!fAj26p=v+03Zy*=I{f8|9_}7o838uP_pBd z=z9{Sra^iHOE|+IC{ z-`~G~{{ZRVfB*dX11A6d`CYbrEkFRVK#Yg0UeQ$d`q2ZhA|Uz&)bIy{egR1#X&Imb zfB<4bR{ihazwp{dkXn!mkfPsU#_wMs1hfID1|Wb~;Esc6TU=EJGWFLlunkbN!Q9_} zL0)432p}e)sSwo=4bd$f5a~a^fBpd(3|0LbOac`E1P}{Q!+)sq|NsB}pI=e{a>g%& z)4?|U{s;0mNCQ9sG5v!Z57O~Jp}QY!5N0Be0)lgG%);U`26kn-@hOg zU%!6+4+cOs(0HIde9xZz`}Onxub&LUB0x(30+2WcIRJn#2ut|?gWYu1Cf+!-K%B8# zdf?1WA}#uZ8oj7u>$I1i0Al&`=O0k%-@icgAIJnM0xA6maSq6BK-ECw|NZ*S`0Lj% z1_pot6puj;05Ax`F!=umqj7^frO?t|3^&I1kxUq9yECc+jQpY84SWH_0#pxl$?v~F z@*hy-KN0|X07U)z`4{NpU%#2aHUI<=%a31wK(7Du52Oc(|3O^?R1IN+RRjI-n*kVB z3=9AP#PZ|EACPLGJ%9cJNh|>9B%spYzZw7h1%?tp0I_@ndg9MNE>313@6R75NcceF zkr51-#U+7;F#`Sf7i0rK0I_`g_NQ&Zji7_t0d_@@ozArL?Su`s;*Q{AKpRQ~TD44PX+*q00taD0I@Lq1k(S2nt`tR{g)9*1H=ZfhCe_Je;NM%1^NLXfPkU&2dGq1gcanC zzsyWb(hLmW7#V^70~+_6f#nZ_(jSmgFakOWAb=Pd7`8Gn`~pjZT=;x%FbfOAzdzu3 l1(F{a{)I#17yR-T)##NTdjqb^wzQ(`1@?t)Ix4MUXz556teM9A7Ic zq_@itH|pv>q+zrjZJ^Hx5bj=fD{5McI3ol<@^-l_@~tZGV7p>1CU&qG~{YccyC-q z$8~P)6sG{nMmQy85K$E6L33rja$x-b9$ literal 0 HcmV?d00001 diff --git a/upload/images/icons/country/ru.png b/upload/images/icons/country/ru.png new file mode 100644 index 0000000000000000000000000000000000000000..47da4214fd9edb383687c1d4f84fe8b42a51ceb2 GIT binary patch literal 420 zcmV;V0bBlwP)X|NRSO0LlM<{-BURBqYRGSojej zfLOL~|EH_V_~;P>Nc10*D0|Jxss< zFi1)Q<$$6LU}rIc*dU*QNFV}+9T))>0|XG`SD?F)5CbX~O$rDA0t^5@iDe$xIAIn5 O0000N_~0!B1ZtR02zJmAl3i>|Nr}+@!x-t zvcLa8?7#n*fB$3p|L;$z$Rx)9zm`4EX`B2HAb?mPX21FhQ~^@@2dMNf!=L~E|NQ+A zWdHd6KUK1c=hsc9f8Rnyezh^=0R#{e(Ek5GMIci_s{j0D`2GL?@4p}ozrlKzzsUIh zhw0@n(cNzYfer%*AeP_1{{8vS`0Fp&84w#lmi+$#)ARI~X!Y&+KyeWsW`<9n00M~d z^G^m==F0#79{mS71ZX;t`~_q%fY`tPf!Mzw;*3o4FJA8j2p|?NkT1UdXZrG=;TOYy zh@M|qNhT&CJ~jq`0Ac}pl#vl6#K7 zFA)9u_3syi0VMzY2QmHtx&Qtu@&7&0&HxaAAvs6^7=(cU7?W7&6Z-$piRe`dyDK`^ zN$WO$zWL=wEu!PO?Vu9@iVSM&8cWvf2p~p=WCn&G3_$lI&>tl77dYY}Tp)vm0U*Et X__=7oxWDB`00000NkvXXu0mjfV`BRN literal 0 HcmV?d00001 diff --git a/upload/images/icons/country/sa.png b/upload/images/icons/country/sa.png new file mode 100644 index 0000000000000000000000000000000000000000..b4641c7e8b0dd79aafaa73babdb525d3d2dc6a8e GIT binary patch literal 551 zcmV+?0@(eDP)4!1u&@QJ10&`rk^HbMk8Ee|uIe&H zS+;4$DbWCt7$DsBz5oJg0IGiW@flDZ69W^F_wDDmUw?kFvatRB^XvPsAO9KtfBpI8 z%a6}8Lb5=`00G1TbjJVx|9}4ZVWnuJEUfzZ$EVZx<$*voWzTGcp~$d(=+V{_?X+ z3y#kPS_RYq5I`UeU<=TsD9Bk~@o?qi&=DPd(?v86a{(`&&3I*E&g8|Wo?Sn;v*0j086Wc~d66UYT>00&^E24DBZ$$%)DV9SRUYEY{Wn z85tspN%!Z^Q&_X+!-^Gee*b1;`1hkUW~HJ2(d(c7|`w2)m##KhU^#|s1eh2YzMVW-Z(;)C{QJl7?-Rp6DTaSP8U8UK5I_L2Ffe?nu66~hU^Xzg zV`^IR|NmbGhChsd{xGln!xZ`Z|DQkqe?!SHn>GOi5KsdU{eSZ0I}_6%bMu4$|G#2j z_zP0e_xu0e-~WI8{{Q>e|6jj=B8;-KKpOx8hy`TyKZd`5nT(9?%F2RO|M~TQ@}K{E zz)C@?e?v4d{QeEp01!YxcLP=bXJGj0<#nFn|DXSVfvSK1-v%}nhwkOu|GvKejg0<-0ptJwK&1cy1oE`H<`Z?5M+~$7{9gq& zn~(3mv&(;P@Bi|05T(EW{(k!9>4UEid{_Ab1OPDr&i@1e0Q5gX)c>UW0I2)_6d3&w~i*%}NQ0G05Jg0{{#gAwk6j%|K36Wcrx-Z zDBuV5-R-~I;@8;l*yr}=_xShx{`~y_{Td7!{r>#`1^@zxvDKIVAJ?B1c2ZXvZZlkB uU;qZ}2Vg*eW0eWa_yywvNgf7(00RJ0?>)A@UfIF`0000`tbb&P~tyW8d(D~GxMiUp8x`gh2bB=pZ|ZjUUI!&{yK1G;4d%$ zIuA;MS%3cg{`2Rrii*m`ix&X`h=t(`1IH^)u0vdsLXv;@{sQG7;18Jf2Mqqg05F6A i0*HaZmVqPy5MTgGElxU<64PS<0000a|fPuet^$h(7pHv_{jfB<3vn*8q{15ov!pR5qo|Ns4BVf^v!57RHO zo?l?}`yWs<(7C?=0*LYNK?X*pGKOD3v;Q#s|MUOfZxH$qCjb2cBQWFtZ$@_cPkRpn z1P}|u9|n-AAQdnT|9?TXAyk7H4FCQBl>h_~&`AvcLF)bhMS(&{8jwh^2qVzve;5D) zh>=0RIIAq+{+o}$pxEl(3%2T)`P!1-fBt~{@Pp~sA7J?W`}60ovKZgl)=2;X#KQ37 z&mWM7{{H^+4`$e}UqIEMAo>Rk|KALM|1kdh!vsX^3=B^I0*D0|DL|!?{M^6*VPKPH z00z{*-?BnHps)wJ`QKllIe-8D1EGJQNCgNWMh3}bctpOPvlbWzK!=K^+cJPc;};D5 g19O2S13-WQ0NlBGh$rR(5C8xG07*qoM6N<$f_QiWUjP6A literal 0 HcmV?d00001 diff --git a/upload/images/icons/country/sg.png b/upload/images/icons/country/sg.png new file mode 100644 index 0000000000000000000000000000000000000000..dd34d6121073fffcb2fcb5b9402b3e6361cded35 GIT binary patch literal 468 zcmV;_0W1EAP)dtOYis{Le*Dj#JuDs`KNc)tl9OYUmifJZ zA4uJ=-~WIA`uFP>kj*SB3$z3vfIu4l|NYA>FaP8D^M5;ba1<8<4f|GC2UPm+H&ER# zkRGsxe?Y{*01!YRC;dKnkj2`X)zkCW_8s5b+Wvn23^5y|0jv~A0#!5q{{4%A0U&@_ zfL8pya^=_l{r?#l8F+XY{;)G~as30ko(ZTFY%s&0Ka9WsFiJ`S6$1niy`;Hnv5 zfRT}r0R;fL{~@sn5I`&p|Ni}W_wFAQ`~gBVzyJ~jk&qMs5MThRyiZo6SsHx+0000< KMNUMnLSTY6dB!#X literal 0 HcmV?d00001 diff --git a/upload/images/icons/country/sh.png b/upload/images/icons/country/sh.png new file mode 100644 index 0000000000000000000000000000000000000000..4b1d2a29107be96413eb86e64a75ac7a3ba5793d GIT binary patch literal 645 zcmYL{Z%9*77>Cd9?woAXO+#E-F%m^1b0Xy*Qky9{B^@hJqB6}jOKKPc70u1CS|Ug( z7>SA^1`5-}4+VvY=3G*k2%(8O!OWTIn!4?td(P>GANugV4?p-l@2B^fCONIbD;IAODX_{rV|BCn_NC>%qlWoHrzH=l|0Y^Rhgkwr%>N3 z(d)FjlCqjgyY4&yRH!;rb)|Z-v~HjxIkvar`*JLyzxBc-B?Ix`3*qGz4q3JAd`#LY+Xw^k(ph!n`d2H7`aI`Eh(LrOLs%9g zj93;8ws%s88WHkIqXqnSf?YSjh=@dF-}4L7dS0HFB@iNj8OY*&4>%Dn8t&*i)aXz6 zSX_wQ?~e=9UcwhrAtAf8XLVoTbE5+<^|-KK=D&>)yX6u!zrPCrbEr|4Yi(XyIGTQI zFEDsraAY{)DhUd*DN;Q?!uSxvkoT|31dF#>2L0DGeRcNZNehm>xm~}-9q?gtV@Qz` zv-lB19|m}3LHcg92}TUOb+%v(0bnUhB(5rQI9?ZY)h~Hw=%2Au&~WB@t;^kVE@F0Y z%=8f1ZN}R1MniiNxkJ!a;3!XFerfimE2A;1XJChGXJ=)MAVRubE8WFo1T(1Cmhdfa ztzC{Qms6asjkstFkFp5L#maeek84Y+NtW^Wf=SRytjpC1=BCX4NH^VxnQ`+YXocAv zR?lKskkKZN7D>{S3>4;4+gPYYq0_5iq@jsB^}M0yMT0|p`lM;R_dwbVrBg^4RRbsq Y$WB%-43-yHbAJTXS^1gPjGK@C0`m$%7XSbN literal 0 HcmV?d00001 diff --git a/upload/images/icons/country/si.png b/upload/images/icons/country/si.png new file mode 100644 index 0000000000000000000000000000000000000000..bb1476ff5fe8e0d3af4fc6bd11e513d95fd9cccd GIT binary patch literal 510 zcmVm9@#;PEzrU@Gx(rNA|FHo^Mn<3|00G3vEO>ZAhtlWIf1*N!=PZ8p<;&lH z{~7-L`S<7dzu$lU0~x=8==VP$LqeQ==EOq)0mSn6{g=m2e$<)X`O9Zpu5&$Np~P9Kn=gZ0kf<1I-4a zUtk1c`~{K>fBu3(0U&^Y8d(1RW7^4V^6LZG89>!QBmXe{`pfY9FT=0Dj8O6)!|#7g zK*az7#L~(TO=a{vExMP2%`MCSoB^FIcLe_%lf;|~%E5I`(IQNh}3Ao>6Q|DFUXMn*>AqQd`w z|1kXd^B;tM|Njjl{{hM0zwd6?1Q0+hV1xeud-4=Wy?p-%sO`^#2S61Jzk!N?s)6X& zzhA%p|N6}=D+{y%Ab`Lc{sL9~1=0UN4*CD*7s%9KAf+JHKs~=eB-8KTKvw|-5R1&; zzd&a|ob(5%^Z$Q=wHy9p13+aOpFRNu5F>N&`Tk_-7w>=n{RejQzkfh&Kn{rf10?_b z{tFTZibx5v&dxav5I~H7|Ney-|DWN1$%1FyagzUW0464;_wU~W1Q5$TW@eGxtUvee z3vAf*8|igK9~@*rr66bh|NrkNM8z+V zAV?>O@ek;bKfu6d002F*|Nr~{=Pyu%qcHbB24G}l{PX7zKmY(S0M7peLS*D^UKK~y z+6(XH|9gD^r>6bY*OZ>+`2GX^{Qmv@{`~#_{QUm>{r(dW1b1xK0st`p&i@3&%J4-( z6Giy=|7vRh4-WrbUHx`??d0*<@CX3>{QLa=`~Cm?`~Ld;{u~zu0R89!i0SVi2B1U! z{r&fU#+3gbKmA|6l!@v8=U+^J{{8>`mjUR&KfnL~{sUtC1qTg400I5L26X!4i0my} zo;{uZo#CfPX{7DT1DwDAf(-fnkMZ|^ra%9I0mS$d6bftr0mQhUfkCOfiE zM%HqlKU{maemr>kAILSo!3gZ8-+$N@WcKe}3J^dnRtyZx@9+FOdynDWy$P0%j62V; zZC)?>`}hA}zy1SB2;@n0006p>>h67sJD!pI8@uK6+#GPW%ce@CEFZM znTD)%K!F4J_qpc@AQp(ZPk%rA2T{TB=kLG2fBygZ4O9eD_xsnsUl6u5yEM=SfB<5# z6|+@gR}o|u1R4pn+XF1YrQf2oylS zAbS3(sBkhcTmc9mV6grHN=r(zLW3F{=D&YK84x>x_WT70A}|U80*H};VI?9O(a}F7 e1_Utx1Q-B;QgQb4eH!Wj0000PEol7!5I{@}e;EG$`~Mq){{FvoV+so& z6Zek;JYV*``O13q$!wq?2!V|I&+z9TKmf4-@!$W9Km&lr1Ie!(IeUNcyZo#F`{&0p z?&{CqnEw9%50U)~((nf$fIu4l{AK07*qoM6N<$g2hARp#T5? literal 0 HcmV?d00001 diff --git a/upload/images/icons/country/sn.png b/upload/images/icons/country/sn.png new file mode 100644 index 0000000000000000000000000000000000000000..eabb71db4e8275a5bfb7b1b8f3a8374d50da95db GIT binary patch literal 532 zcmV+v0_**WP)6{xSen|M~Ox&!2yPfTn)={d@hr-#`EU4p90fz>J~+=oo+i0%`d3@9*!wzk#ZO z2WQUEDXOGe*gO;$t?-?1~^z5 zels!xNuY7SApXOk^arFAjDSu82p~p=WCoxfknArIdOZOgs+`19}IpFa%0{xSUi1L7diFBr+f01$veIX40Tgn<}np4MoMn3N`o$god9 zrkzn;+j{#q5F}xeh49xZuI$05IKi0v3Lq917Le*!UxBJYN`Vr8|1$jj50VD5fvSOw z-(ZF~46zx($8#~-kUKOh9u19TNY0I~dG z`1hBA5y<}g_y4cI3}({*g*gAq^Z#dL_#dnH|JmpNJMaAe2etv|3x;0|00G4G>kr86 zzYquf`+xk=e@^EAQat}9xc>97{@;He<|?3qzo3u+2q2a}APrzwf*tnl_y6c6m z5?7266~G|=0}2mdsDK;{bP_-SF*1~XW%vY(NDyK`u#uw~6h{mUJPZH<1^~BhckWKq{Jk|L6Yw|Nrm*vcLXk{sL#*k)f0!)jRF?KX6FHLLC_7zyJOQ#RJf}AnqSv4E_E0 z_d>^cfB<4-C}v>z1dGUDNRj#r9OZBkNc8hC00bBS^Nnc?6(4BA00000NkvXXu0mjf DM=x{`~^7feaw| z@9%GBrr%pd7ytr@3Fu&;D>$G0;d%9&ckUlP_FsJLznOpkI<);49~%fU|NOOg<1c>p zU%YI;<@gu?0tjRS1JJ?0e*b^_hvDg;|Nnpg`SWY#%HJzjff!!CzZWj}wP?w&U%!5b zMg95nhXEjfKpOu4{R2W=zZm2}8km@V1qJfIu3a z^ZvQT`ny}__wU`%Fad@Sg!~P3A(#OSI%WR9r+OFw0*K`e1H&7RKZ`vj#ee<&!}=E_ z2M*0Ye}N7Llfc;c2aF@2)L(`#3;+SdxR!w-xR`AxVx?>``QKoX4p z{r>$=Qj`^FFF*h>?mzuiS(feBuYdplGyMPm{~rVab^il$89+1;fd$yvm=2wM1rR`t zfB*hvWMl+7=|4yZ16bGpcem@l{$rO?srZisfXY67`UDU_ED+y9gdmKw*T0{<`x@v9 zlkZkl}Tegi}1FC>)y z`~`;fe+5al?K4jS1P}|@5C%z67NEr6KmWj?{{J^f1u*QH|Ne!BH7L;kfnp0FfEXE= rk23safJY>Z`~zeELt=n*00bBSq*!cC{}>3t00000NkvXXu0mjfg_GrH literal 0 HcmV?d00001 diff --git a/upload/images/icons/country/sy.png b/upload/images/icons/country/sy.png new file mode 100644 index 0000000000000000000000000000000000000000..f5ce30dcb79b443ebc1615fe4889cc26e2d762b1 GIT binary patch literal 422 zcmV;X0a^ZuP)@|4`Xj5kLT%`al?B=W5I`)SK7Qoo3V-qKd5l^# zgv$taFhBq?zJ2?apPwJU>mjm?jEr~g+yMw6Mj$IKE$!aDd%wZp7Z^YoAQH^_^XK=U zKYvwJR4!h;2oOM^VEz63kEEm|Pzoptl!JgjVAdZn_zMF-#Q*_BG6D!N0MDLEDh$KY Qwg3PC07*qoM6N<$f z|Nj36M1Mf!|33`>e*gaqWCO|HKwFtO#a&sZ0t5gt0M7pel4t!zdFAutyc%F2ByLSib7d z-@iY8{9s{WsjaVha_-{UlG^LGvEO)A^**!$6$1ni3ljqaFhGRYPy6$qf&JG{kKey{ z|N8ae_ixs}{}``bdDhkT?#VOp#VvoBm>H#|fo1~)5aY*A1~#Xrf1jTKgW~`H-wePI z{Ri~aZw6pM{r$!84-_k)u=@Ltg1)Cf2{xiF#iKZ95W~`fDE7~ z|1pDN1{?_>vH!pR*Zxoe2p~qo;+=0k{eVOy5dHe~@Bg1a48OqWACLsaJOfY!7)!uZ dz{3I%U;rfUVNTmRI(Yy9002ovPDHLkV1m_xKPvzL literal 0 HcmV?d00001 diff --git a/upload/images/icons/country/tc.png b/upload/images/icons/country/tc.png new file mode 100644 index 0000000000000000000000000000000000000000..8fc1156bec3389e54d3c5bb8339901773a881e68 GIT binary patch literal 624 zcmV-$0+0QPP)Mt z2Fbqp@bUfi_XiXZ_x%As_WHU2H1hfc9TM^w3-JC0{^0Bg`~MgK0Qv%mWs{6kqN+Cc z+b3Uc-enXLWmi^s_2~6APR{Qy8GilxQ)j#p({t5y7`^LQ4&lw9Z0Ra5^`SSP!?%<&3?fU!$2L%N9{QCa@0Qv%mW$D2m zA^~iFet$Uihac>@UpF6ozx?O#ufL4HfBpRUndtzp5U;>@#TUPR{|1KG4}bt-0)`aO z`@jDF|MM3p^6S^{zdwKf{q+mXVfa4fgq7?27ZxvH%|34Sm*EEk!#{ukVgYLS^A{)$ z3^fq>3urc&4I=;kz4MwgW4X`2zkh%J`Om=vauPrQ0X6*k{pY`=2p7%A_P)?P zUwuVdAkKe=-@h3}_C6p$AOxEwQo+UIeHT5%mg3lYGL;@HP(LjqG0$?6F}(Ht8A z0K*^*BsuTDFa|;zm9Mc;PRcq|KMMBO%8|{GkrU*a2x&r-3HS3`xnqW1|R~39RolBu`vAj19S<{HjoWK z4L}tj8-Qm20eTwfuYbROLyY(bwgDi3SQvf*HG+%>>H*pSauQI_zkmNAP67ugNCPlf z{{97O00g6G8FFbZ~XHln?_bqJeH^V)*lb;YTJ&0)m(r7ytqc06HRil3NF`RsaA107*qo IM6N<$g5!7R+W-In literal 0 HcmV?d00001 diff --git a/upload/images/icons/country/tf.png b/upload/images/icons/country/tf.png new file mode 100644 index 0000000000000000000000000000000000000000..80529a4361941e01d1def5d581bf2847cf99fef6 GIT binary patch literal 527 zcmV+q0`UEbP)KfiwinSYl|od6I(APxT+{=azr6>87_{|pZw{QvzM zh#vfW|M&NwU%!FG-`~IfN=xzq?EwhD!Wi2C0Dv&)|Bp?Zs+hPi0R-LQn75%cY-O8s zAPsw;Q!9X27=Hcx_y6DDzyCn0!4P6RP{Xg^fBpb%_yyDhbQs7f8-Qku33L4cS@IvK z8OZ(n2kOgTzyGb@ek0IRW9ouaN6$P0x*s5bfH4)06qlIj4>;1{Yyp4(0|4dQTo>gF RMrQy3002ovPDHLkV1fdR=hFZH literal 0 HcmV?d00001 diff --git a/upload/images/icons/country/tg.png b/upload/images/icons/country/tg.png new file mode 100644 index 0000000000000000000000000000000000000000..3aa00ad4dface0a9c23744ab451cec0443f187bf GIT binary patch literal 562 zcmV-20?qx2P)@|6mN}b_RwI3=Dr@=ogG+VE_mq7La^(HIVqv%*^=nCj$%1|9}7Uoj(8m`RC6+ zAo~61@1NiQe*Xrt|Nh=Ea}z)Sfi-Y&{FjhmFg0aZxaj}$=L~=U)(L)O`TP6-zu*7= z1Ib@N^zYwqCU)6YF9v`BVgi}{>lcH)J%gU!|J)p)>i@rg^Kt&>WCWsLoQyxgk29dnvBpN5vQb0*LYVQ3gi&tp7jnGyMMp z@*mKbe}4Uk_!#8f-w;8De}5R+mEP<>2M|CkH{LKvi2wQh{WmZi827ytqc0C8?ZF&p#S!~g&Q07*qoM6N<$g49|K A6951J literal 0 HcmV?d00001 diff --git a/upload/images/icons/country/th.png b/upload/images/icons/country/th.png new file mode 100644 index 0000000000000000000000000000000000000000..dd8ba91719ba641502bc7ffda16c25dc71b2066c GIT binary patch literal 452 zcmV;#0XzPQP)@|4`Xj5kLTn#2^O%5QJf({+!S7KyMr1NSdb0?wsyYS6cNVdko7wub89?$EL;)x)00Ic8;m6; z*ldXL$Yz5{poPB}7`^}m5DPc2nu@9r4=+1782$pC1a=$HjDKJ@i17#P6G=(#Q>V-T z0*LYF&!5c9%>VxV!xcCX0F(uW(%ZLh0Ro8SA3Hl!NeKhQjeq|#{05SL7=Ql;MhF4{ ujRQ&nZP~jQAb=RZqDCa1IEDa#00RK>mSUL#9?hx%0000(5Af|u+{y|g&!S9Ft%(8imf-XR*|Ns8{XO&`< ztN44b9;zJZ^?&~W0*LYB$B#TbJpUo){|D*(`>^x>w|gKB?9z<#wQ%E^n3(S0zYh>V zEO6uD3`W^f29Wmu3`mZF`w$?27#UO<(rVJ~y}I}N&+p%VfB*XP3y6U1Uw^?QNbuL6 zzrX+d{i`Cbal7Zfib@b53s27mx! mU=U|u;Adc9XCM*)1Q-C-v^a{iiydVE0000+lNu{Qmp=|FW6D0*D1<1Ovm9m%kYQ|7p*Yo3ikU z7~kiESLFZv{{Q#iA0zqwf4<*Xu-*CD8$MYncA&8U0mQ`ckKy0n|9}7f|MB&2MbDkQ z1j{KKBL!IA2(Z7F;(zkuBe#mo9TT;SzkoLU{s(jwKmai@{QdX$=kGt?etVi7(p9*e z(|o73K&5wiaQBkXEB9so{`tH8jIplb^d$ZPi5h|uLD4*o5RnOS|{Qd{@Cr~j!0D)}y0}8T#$FHit{lE#dc*g~k_utsL zxj&Wpto`+k?f2h5mv;mM4gK>M6!-uE1hnA~P_?8O+wWh(`!4wX{Cn2j=z=is`~Uxb zzx=@K_DcEUJ7IZAUZAu8{sn~+Kmai^Fsw$4O9qB73=GeJhA}V*Ffg!yW&gnt6F`6g Y0QOrYft$MNbN~PV07*qoM6N<$f;FEW z@b~ZkKS1)&|37~i{`~p>`}cn&^2?@800G1T)Nta$zvt>t<757@uK4@^{4bCmpb7~3 z1tfp{|Md&VW|Wov$G`v(Kp+kO{{26+>+jbuf7A2+upj>Wf7$Q%RxoV1$N0e}Fas1Q1BW)@@rKJa|xATBWA`D>(WW1JFHv zzy7cP0k+{MTm!^O009K@!>LoJmn~avX#S_9;5YZ-KmTX``u`YaHjD&?*dJiPF#rS* zNW;&cKP?=87yABYZ~OCq-%n(9P{tpi22h9t6$1niNQ1e-pD1xDrvBdy@BT2zfI@>2 zY$OAO1fsuxAqeOsfB<52Wnfst00RHO2+qJn5C9Nh04p0wT74^6IRF3v07*qoM6N<$ Ef~oTCkN^Mx literal 0 HcmV?d00001 diff --git a/upload/images/icons/country/tm.png b/upload/images/icons/country/tm.png new file mode 100644 index 0000000000000000000000000000000000000000..828020ecd0f6fc73348373c9e7a235fdced09de7 GIT binary patch literal 593 zcmV-X0VKiqu&g@GZ_kb&V31Gky(*8`UselaloV1SZ886W^4001!n&i@1e004Y* zk0R&!|NaLC5DIk$@CyeC@AU9ebDYiJ)zswL{Qdm<{`>p<{rmm%TMiuO{1voVt6d+$)WVk%^O){nwx0zkdJv^%rQ#Z=eQ%0Ac}Z`19}Y zkI%oqe*ekA`2WvehFzDBOo*xZ{rB(cQ`_&qdGhP`Z=jyvAOx}jAb?nae){+CFDvWc zZ(siLa{c@D=g;LQw^HX+sY@u`d-M3!$G1SGAWQ!Ifj9{ufLMTG0<_`#=U?|Ye)D|< z8pH7G?=PVA*@stt1I-4xpA0e#40jk9 f${7d%fB*vk3(!F(w2U8u00000NkvXXu0mjf+94t7 literal 0 HcmV?d00001 diff --git a/upload/images/icons/country/tn.png b/upload/images/icons/country/tn.png new file mode 100644 index 0000000000000000000000000000000000000000..183cdd3dc98c6957bde83f375a431e543a3ce9e4 GIT binary patch literal 495 zcmV@|4`Xj5kLT%gT|L_r@28Q3iff@h;hzaCwplYy<4FCT9KXmB7 zhQ|Nt)Bg(#gN*m^{Qvt8$Of<_K(zn?!~}BDpT8hi0uj&>pxItt|NHv>A2{&e(C|Mm zFGw7s;m;qS=>P!)((wQ9AF!W(0sZ}7M&|#9_5TYB{zpfHZ20g2t^wjCfB*tH2_nSs z8?4R7=Kq6S{f9wP5^T(0hI#XVIvK%6GC)WrB}fdh6SO{nUiXv3iAlW}aH!uJM5J&?vILH{_iZHeP0c!XQ3PuJ7 zfB*t%VEX-sK~fTI%wL8-Af1e0BN-qh5dHlNK|sX-0mS$fH6j^sMDRaYQUC}r0RA0L U-~OCsp8x;=07*qoM6N<$f)6&Rz5oCK literal 0 HcmV?d00001 diff --git a/upload/images/icons/country/tr.png b/upload/images/icons/country/tr.png new file mode 100644 index 0000000000000000000000000000000000000000..be32f77e9910c0896c1ee8e7ed4f0edf815a517e GIT binary patch literal 492 zcmV@|4`Xj5kLT%yy% zCxE~j7#aURc>+`lQtjr(@bBOM9XtMi`UFz<>-YcPzyAOF1!ObI$^vZw2q2J#|6qeb zs-vSBOie-Rl$HN?bb!_U0_g#3VEFwTr~x2=m_Y6Zss`GqsL0^t^nd#F|4B*zH*EO- z_3QuT%m4H6g6)A?0#pkSKujPf{rCwIb#eU5`( z{s2t}2q2J#|9}60{Pg58FvR|AYlEDjruP5RC6KEgJ^H_IA4CJhNdN)F0>q49OBog~ z{?Etvzo-c07$As@{Qu?4|3!FoS~(Xu$ujuK&Ki|5;f$7pYF;Nfxh(xqFs zZUMDjzjMbfEbRY>5C0Dx`v3aP|JSeozj_5kj66I)?%V+g05Jg0{{w&k0RJ5w0P^!X zSy|WJ-R9=z(aMV97z{4myy=pj4$^bx3|zy{hYtY)h`Ao9!QA5iyLbPuTmkB_PfP?Vee~$j z!-o&gUAyj)n+wu&>J&%=KmU)%j{yP*q=CWA45Z=rFNTYkfO?!$Q_o+&{s0WlT)E;? zRQUhj|NkdWF!J+%fBF<4fS7B68jOwqzkLe|6QI@S&;S4b-#s()-1Y1C!Qjl5tA6F> zpisYc>&x@!00G2Y!@$5~Xb92(47=Z8{{bD%z~Ggi4>bPny?b}>+&OjWQc!g@0~6Et z-Maw-h`Ac5K~JB7o9jOp7XvpB0}lu>-nqlT$mpA&|LpDCZ{NOs`t<42?c44-IbZwx z0Rjj;B7x{N1H(%OhUW|nPgz+XA3Vr_1a9x%4G>@ep<^{rq?UTJ00000NkvXXu0mjf Doa;3l literal 0 HcmV?d00001 diff --git a/upload/images/icons/country/tv.png b/upload/images/icons/country/tv.png new file mode 100644 index 0000000000000000000000000000000000000000..28274c5fb40e5d3bacd7c05d9a1b8017eeaffa6c GIT binary patch literal 536 zcmV+z0_XjSP)mzpv3Mmw05Sgm{~xFtLc$sUu>nR##!sI<0R#{WMEdpj-yJ7j ze)|0V&%b{_!~X#7`1>EofS_N0|E)GoUH&SsFy}2m05O4F@}ffYb$qvjbfSUipMQUU zgY^9U_4m&&5D8KZ)HC5u^uad<48Q&W1P~L@hOIAb7eDp_T4W)^*Xg48{r4ZBJ-_}k z{QCPJq~Q-pPnz693xQJ%zkUG(5aZwHtqd&u|9`*u&+TyOvq{_Ghd=&6oB?#w{~Yv(xYPgr|NRH*haKioowt*& z{dC`3v>70P7=Ql!$;`|Q@(GT>fdHT^FqGcDeG3pkjNS|k>E&sEfzAeo{ckY&=g(gd z`CCrwmxA8!XLtTy-uM6CzrVnM%iVPzAb=R%ks=j>et^j`MFs;Wh8c4i)_^1XKP)u> a1Q-A&>r+tW$-Nl>0000<~s!0-E7R}a|Ns2?4|9|}gs%Dgx1=;`*KrBFO{{8#+``2Fv2B6@-@8AFY{`(K80jdYk13&NH4;SYnOGgJvc0I@K9VW@Vk1}Xmk4~YK$|NH0P z-@pI<0D+Rop8&DnA}oIvEc_iD{O9-Y-=|4+U?1uFgf@9*z_zyJRJ z%fS3QR^zuR^Y0tyerNXndi(YlP_?gzto2+5fB<3vIsj-gQ0X6_*?&Q*d^>boB3^zoi8Kq^tbl{qlR!{9jwQ|Nij< z=(=A?F~8j-MSe1{Hl8Yc@zaXo%Ljk}VgUvb(2HJbe?0kqy?_3vsPXrUmq2rWE6M!I zE@4*I;Mw}vw&7&iFGdC>zW)rr{s9CK3xfnhrsi*1wqMhx{@J=6sPgxpU%z6)f4fBr zzxpd#a3tyYE8}0lKnA+|-+zWbe*glA<)R0}-=}{Pnt#7~1q_Mb;=;f3i~oshNgsS> zIr~z~(_bRL|NZ|1LO_>;A_pLVSoBpHQd9nLa7ao@{lMMx#__lBLe9Cjx?EiU z71{s)`Oon8FXP|;z>s7BItd_v7-5mj(Adb}701wVj$!S*>kNN{fN~5FV)t0eYh-DxnQ(+0I@JIfmA>F`X8wD?>`2h#NWRRzyE`zA&Pzh5tt#% z!^rUCA3y+sZ1@LM1hf`pHc0ia|NsB|1uKPX0CRu;1-SztfLMSo`wOxir1}rsY$VlC z667idh7Sw?0mQ-}a!Q0#;n&}vAb0=!_Zy@WNd5!6=O2ju7s{65Vq=gx0uVrqe;+b1 z$mIY3|KLBvF9x7j{{!v#g_UGtQhI;<6hHv607H@yECdWlR7EJN!LomVp$!l~APvkQ z4p0cL2#YobhQA>6hXEjfKpL3-19eKmL_s!=;22W8vpXP)6RGKQPvx1q)UK1Q6rb{|u}Q zRsa7#{m<~1f#L7}|GzNK{&HxZVEKJ4>jAefr9{u_M=MTegAo-i2ynN}MJ5kZm z42KRel$J95{>|{~*Z<$Y8RdVo9Ap3pAeIsa2H!t_KmPs=bot-kKnMR0GBy2s>sC=w zQFmwO;@`jj{`v(%zkl=p`BTQg01!Yd{Xp;j{qx|@pI^U!0X_En_iwRd$6{h)tX8f( zaOhC?&!0e%U%!3phy1#1%V=eK#YHXK~n$!{#(ib5I~GyfqpU(k2*|8J(R-+sudaynhucHbwAMTnor{mwqO^w7JHzaBsT z{O^B8RYf5+LvDs&KmRKVd78=o{`1#HTiEo_OolaGleS)G+IQ#sUI`b*pv<`1zCJ=H0jd{{2S>p`ri%{LsXJ%FbMS z$#S`6f|?OG!^Jxczkf6Q`UNF{l0Sd`ad7zm>({^EzyAS6{{CgrkluOb3l1A>ZU2~A zK+FZ=zkmP!`TOVhpFbzBzFaPmD2$N3;+$pK?>zdet`f0002ovPDHLkV1gy;I?Vt8 literal 0 HcmV?d00001 diff --git a/upload/images/icons/country/um.png b/upload/images/icons/country/um.png new file mode 100644 index 0000000000000000000000000000000000000000..c1dd9654b0705371876d3e3d06f950be02de2a73 GIT binary patch literal 571 zcmV-B0>u4^P)1J@ZrOUii!$=0Ad7ci1(2A^!3kwFaT->5i7Ttz54h6XL$JkA3s3o z=g)t?e>01U3h&zo5I`(I-#Hr#t~u}$WXZu-Kyv1Rm&rE5wcB1YFI@@=0EYkn8G$4- z^Xb{M0Ro8S57@^*QJ}#<$Im$M^4iKw z00a=@`Sa(sw6y;I{R{T)e~6KA2AmBHF`#D(ii!XNh(#nN}rF)(}plRy9vU;su%e@J`J?dSji002ov JPDHLkV1n4Y8}|SJ literal 0 HcmV?d00001 diff --git a/upload/images/icons/country/us.png b/upload/images/icons/country/us.png new file mode 100644 index 0000000000000000000000000000000000000000..10f451fe85c41c6c9a06d543a57114ae2f87ecc1 GIT binary patch literal 609 zcmV-n0-pVeP){qW|y?pud`Sa)3|NY&vWd%S0u>b>P!2!lUe;6EF*#G_c zFVXVt@6Q{uX@40W{p0iY2Aa+A^Cu7i8KT+YH}2j52q4BskM2rJ$^k9;2Xxc_|Np=M z&VaLlA*IO5FlECMfB<5VUNC{tBZO(|zW*;@GJN;|bTJ71`0*d;`d`2P!x=ymOA`2> z+y@9C##^^8%gd{MW@Y91_2d742B2~OQNf=-zkmD?Vqkdk_wPTUNeuu2#KPTG{_;O4 v7C%8E5*DLB7#Kb?Fnj}}-(W6879hX?8lYRg`Y`<~00000NkvXXu0mjfD6Jtx literal 0 HcmV?d00001 diff --git a/upload/images/icons/country/uy.png b/upload/images/icons/country/uy.png new file mode 100644 index 0000000000000000000000000000000000000000..31d948a067fe02d067a8c2e69f28cca446bc7c57 GIT binary patch literal 532 zcmV+v0_**WP)_vmzq~N}&z08z z0*LYY{pZr+B0$d}2MCnI@DC;m3N;oM#uMkR0R#{ugY)L9Y<*xj0QCR^`!^)W!R$Za z5CobHbl5+T3;%B|S`QFFjQ1Zt|MTw;G#Vi+hCg5i(ELAtfD|ak8UBG;ObiSF0R{lf Wla#5zB1?M!0000JMe1P}`Y1HZufM;3|NZsr4^XwNEI-g5fB<4iWtjhPj`qjL zFGT_P{{Q>;-(R370Ro7T!5$Ws$Po%5A+Zb!3j_cNFaSC{Z(fWD@s$7o002ovPDHLk FV1jsy^u+)G literal 0 HcmV?d00001 diff --git a/upload/images/icons/country/va.png b/upload/images/icons/country/va.png new file mode 100644 index 0000000000000000000000000000000000000000..b31eaf225d6fd770e0557c2baf8747c91ce88983 GIT binary patch literal 553 zcmV+^0@nSBP)|05Jg_ z#sD@3Z1&&(|Ni{{_Zx)%v%Gr!NnLzkb;C z@#QWhJ{xI9$+*)bNX$S?E90e{K^EMkYok78VXhR-hjM0*K`g z$j^Tmm_>oEVgxdn{xJOg$-v0L$jHRN$OsH@P9Y&+^ne@=1^@xXcy~X;zaPM$WdOPj ri2i^{AeYDB@IM9-1r;P))4B5XW#s0WPsWLbObPT z00IbN14#96puqp%TKvBf)PA*{`~CO-uM~~n%6z|m{re4Z55!3T0R+GV5`UO(`=kK4te?c|?1P~}#f$jmC10=!0@{8gBFK@Zu z-~WJALqveC|MTzfA7GIDVE_mqkOrW8BqZ2?K4D^#WMJTBVE7%b47BbKBg1c?EHl#| zW&XdQF#ikE01!Zo3=CVrargu%_x5NZPzVyc@Ms2-@*Gr#1lu5DU{kh6%sopXB}uDxAo`@Bt_a*7F+) z{Q{%kjEu5C8vp``Wse8Lf5q7h438n|z~nEOsZga5l7ZnjPy;{!05Jg0{{a91!FF~d z;^O)I`~dv>{`>s@o}L{E2?GEB|Mm6!N=n`P`~Ld+{`>p?A0G$7!M*~B3FM_eAU;q6 zNCH*w+4I@c^Ny?Q?QPpWZQiU1R1HBuWkA0H1P}`l|NYDG=gP=Ihyj(0CItil0R{kn^jdV2 S*Eqib00003_-&c2+@O*Bba;fM%rBo$$qwJnuekcf#0k*RG7MM`2+5Y7dK4k?R% z*@ue~6f;u_A~T0evP6qS=VxXnGS_mt>CSmS&gmG`kLSL)e_Vf_=c&!fKB7`4C;*C(7s2O*P zOs1$U0urzb3<=a`d9ABG4Q$eK<6~5Cg~V%B8`UqrfRSN8f&?QTVICs^VT=&p*?Eut zt4Ur&-BL_ON(Z|Xfgo93lf|gRkT$Mz-7^OQoD^XMF@}g>R?uoU0094KbXv)l?aF0E zh@GXQVr04m@05R(Rjxq*p|CCIRfv;QJmH1kf!hsqX*sha?_l;f%e5i5I~4YG#H4;6sPG2&U~bv( zNr`eMXGIX9?wP^zPQP(6+&$05Jg0{{;N}{t6CR|M}we`P%>f+X)5&j)Fc04NUj< zI`HZ2Woe@k6UF22`V|Qe2MTi(6bb?WF#yj00*Hv<{QLmnFd+P z9@fS%;@9^E|H1b5`Vk8^2@Yw;#}(}C_yUN9iGkt%y>Cxm>T2lO13mifZBc!n`jhHL z!MK>$6Z_d%|GfHMapIVnqod%T-`{|q1_&S~IR%b4Z+;63vi@iI?>jBz=eJjkjQ{>J z{QUQa@gMhBW_GSe5B=V~`@+h~@c%z3lmG&V@$K8U{QUg?|NjRX|KX9x@@rf{MxIY^ z?fG>3gQ&3ruaE-Yw>fW_PfAH~0~Or8dmA8tSRg?T(ZDLQOiOw%6RWM9%$i>kkAMHu z-oH0qLBYb*loP0ck&zJ?LI42-(g0BnBsn<*tTlsx%zxbLe*S!R<%*E3>|Z7(9Y#iG zpdch>0Ro8e`Sa&!arp;m4%k`<1H=Xjf<=G;Aix0Vb{`Xo7A9K&0000@|4`Xj5kLT%B_22*h{r-RE_y1qN|Ns8=|JN^|IHRmA&<212VgZ}|A4N4# z+WpUe-rxU^{Q|504bi~x`!`SnKmf4-F(Xhl(8fQ1fG+vp^85d{-~aW0|NsB{f9tRR zg1`PJA~XO^2M8drlm7gLxRT-bpa1p0|1bLmQVm3Azy5pw{{IQ;B%q-{(*XjA3FM@| zf53hMJK)W)|CK-uK=ku}!>|93eu7kk5yVLV0R(o^Z;+)RSAk6exg_KF|98LtFaPy_ z#c#OrKtum9FaQJ)NCPuC$bbfbRI>n`@$3IHusZAC|2cmD|MKhqAD{+Mr~sV<5I`Ue zOuzpyNJ@f@0s0=KlTj9AB*>SXe;D}wK*A7+fQkVEi190GMB<5K2mlB$03I1qT8uIj Q5C8xG07*qoM6N<$f}XY6qW}N^ literal 0 HcmV?d00001 diff --git a/upload/images/icons/country/vu.png b/upload/images/icons/country/vu.png new file mode 100644 index 0000000000000000000000000000000000000000..b3397bc63d718b344e604266259134e653925c9d GIT binary patch literal 604 zcmV-i0;BzjP)7(YpZ_rO%ce~L0mQ<@*ghnz= zZvXM=_iyVze?clB=ogUu_5ar|Ae&KE_8$WSKmaiTHT?Vg|MaE5OE>+VAUAUr;?j4FCZIvLVX%uQ>mocOU*NTK^}%njy93_oP3+fBpUa=kKpye|`ZO zzyE?r`Mc+5Xcyo_v6>E-#|Nl{r(LkAS94bRQz)6 z1Oq?-fi&zp{`>yDUnV+0)eJF{zWfaN_0t9DjNiZhfxY|}ME?2z=O_CghC>Vh0R+`!~0W%8&aG{{H+4 zRPp!M??1nPG5q=k)Wabw3seITKp+kO{xLwc{r>&$?_UrCGJgGL;^k4Qujka#`tk7L zjnovNAkb9+0R(gvNCCu>f4~1QF);xde}DY=^Xr#I=|`5hhp|NZyp>({@(egUPqbabS$v+tIbNu;L>xVSv%=>ggR z5I`*V_U`A@(fj`3!N1?XfHr^}17rYw{OcFcC69Z0BvMmfELgy8V88%&5l9HrLN(5b9xs8l&q^Gm-@&XkD1Q1BW|346ee?wJ+H2_`p`^l3V z+1Wtu|3AMO{`_T8Q2{Cj2q2bUARGR$NlJo(=nv2bFrDDw2U!bb{QV0-KNuJQ0*G-b s1H(6@xcrC2{sj~H2V-zBFaQJ?0G2^Lae{Q+uK)l507*qoM6N<$f;6K8u>b%7 literal 0 HcmV?d00001 diff --git a/upload/images/icons/country/ws.png b/upload/images/icons/country/ws.png new file mode 100644 index 0000000000000000000000000000000000000000..c16950802ea95b40a4e024be6cce870b1991f40e GIT binary patch literal 476 zcmV<20VDp2P)>E69JA<-5ee*C|6>(%ey48MQ<`3*E1sOaY}WDP*a00a=wNxxYB{9yb2 zOU?HFZD2h;3gJl2w`NO~f5I`Ue%-|qnfGfh(_6MlpFT>xzKtBKk z5J&^l?>`KZl3-*0GW-GQWCR<@03m_s?_UT4Dh3E3#;>Rm$$$~H$WlN65MTgr(_Ikn S3@&c~00004%P)h=Z!r1m*T3JtfNUmdS)dI70mLHE z+xy?%p5eHez0mS(A>sL-rPOy{yGk_s3 zz{tq>=+Ps90Al&~?;k`pNCN|I|RMxbJV00L=%3E(v!XamT}{{RArWx|9$7Z{pWi2U{IKN}lRCnF;x&=P&!(V3Rv&T;|GP6K500a;d#1A^U zy8js%fB*jT=jRXRU*A|5K#2L*r(ZvQ{P_O!=da%umKG4l0|XG%NkAKznV4BvSbj4y zawHV~fBoj~uiyXJSQwZYIoR0QIXM3O{tc7`Dgy{0# literal 0 HcmV?d00001 diff --git a/upload/images/icons/country/za.png b/upload/images/icons/country/za.png new file mode 100644 index 0000000000000000000000000000000000000000..57c58e2119f402072640ca758657798b621f3fb1 GIT binary patch literal 642 zcmV-|0)737P)Cfuwe;F7c=r;qyPX>nX3=Cfx7(O#Fd}LsF&%p4OfdL?Z7#j~W z{9>KL@b8bfkaUokt?1q(EJu$q{Qdp^&mV?AfBydlG2rBvO`8A$h{fmzgIW0J+B07s zK74uV#pQB`MAdI!SdN|k|KJ`--LK#OfB*Xb>lcvCC@cGqfdL=@05Jg0{{a910Lj6A zAt&mC*9zzO1pWQ@b1`Tn1`iV6=KuBe|Nj2}{{8>`{{Q~|0SOB6tE&PCq@k>=Oh@B| zgDu0v2b@p;u)h2C^Y4EK4rY$O|Ni{`3qc?^$?%A8m^2X}fLMSU{`~p7aqHLD@0rW| zzIWc|c>Ry-$DePXKfn0(_xG>AzksTL{re5n#{Tyw!wUw000L?F`}dEV6O*(3zu6Di z9{gne@#pKG|NpqSh1vf81DXBz&mW+Me}8zmL>PD&00Ic4!QY)xLzl7RCikV!EWdtz zoorLj&BXoYF88-DfB*gk`{Eza7yo#;S!C4G00M|*elvr*8B6X-zBgb0FtGkEHc8mM zoOScs_b*;Q0~!ksq<=swfJjA!^Ww!_00G4E&x@hvA~zQkvxU59n3VsHd7Nj?ec|R~ zkmuqAx#JHo0{#K*`TG}00$uYDAb=PdGJ(Ek5Vx?d6PS=4{E7kSFNS|$^b5xL14ayB ck_{lh0N_F{UmK66LjV8(07*qoM6N<$f>aVd=Kufz literal 0 HcmV?d00001 diff --git a/upload/images/icons/country/zm.png b/upload/images/icons/country/zm.png new file mode 100644 index 0000000000000000000000000000000000000000..c25b07beef894408ae11c3be294d6e0eeb28c0bb GIT binary patch literal 500 zcmVLz(k0+Rp#|Nr~{@4x^5fB>iy$Oe)U zA3pkg`SAPSuU~)vaR2(F*|!oPfLI`Azxw(Lr25~#KmY#x{rl(7|GyyW-|wp|{||Bf z=)Cuc_0O*fYWnY`7ytr@1!(pEfB(To0uBE22c#NA{{8#+_rKq)zyAFG`zKdY6euFW z2yzlY0I`6SGJqWbGV%`;{r&ytA5hcp-u`P`AAdOg`t|1D?}h2=^+y>10tjRS&?yMj zfBygt2HEouXg1LCzyJLD1w#LR1MLR}1V8|>0KE@nffPa916Bvu_V4#Epof105yNkw zzknJ50tl=DS->P)FK#X6%e&u3i|I74$@9uP0*YE!se={)r{r~?r68Z&3 zzZn^2KYiK`5I`&p3=IF7JHD>uaSofgtUAf*-w!6nU;qF7`S<(x|35&+uYZ4j|Njjl zS;T)|pU40ZKrEjoRWbQ1@P?oGFzcPCjLiCzcU8ZC{rmejNW<@6e}U*1kPT$~=Kk_~ z83O}A05QHjx|ikdd7h}_|NsB_wl9j+&d<}^`}fbEzkmP!1q4tEL@O#P9zA*#Ab?m{ zv`qe9Isj6Ah@Z*IdsTw}WYHgB8-D!*lmGvK*?)d>i2vThzyJ_HEdLn(@uk-N0|t-& z`$Yv&?#y3UfPVP*`ya#a|BS!>G5-DsFR)1c1&eHCHYDzO7ytqc0P0;>l>h9)WB>pF M07*qoM6N<$g71PE`~Uy| literal 0 HcmV?d00001 diff --git a/upload/images/icons/error.png b/upload/images/icons/error.png new file mode 100644 index 0000000000000000000000000000000000000000..628cf2dae3d419ae220c8928ac71393b480745a3 GIT binary patch literal 666 zcmV;L0%iS)P)eOSYYtbpBV}~vsBnU!_?2tr-P=|^T zED%wc9ezHgW@NMb!^uT_|SvCpFLJylbx zY%bpaTGI8IYXMN$9w<3j9VkA~NYOKEQXsj?6a9_hcwfU$acAhJhB)zb_w@MVUEy@S zX&I>K-R!bhu3?(6bHWIg$HEl7{9g>>&l_qdd+UYb(1~BCo9LptNq&8>!yoJ3Ui(i5 zRJ|XnYBklL!{@$-7=3mJ>P@1c=7Oc79e-V7yf+%lD2!I;Y&nXBZ>=B!5?CB>LvEx6 znI%n)qqi$#X#wKB(U7XP2P=+4{b@j#r%9-K(8UqtSDk>0UKzf*HM9yqMZ1D!$2MdZ zR=`U>0zhOH1XqN?nY@AQqB7)Fp4{v&dKXvb43hZKvnN8;Po;+jY*}~*Z|W9Q0W%{D z^T}Cc<|r(Su=1K=P5>Z4 zg`et&Va}tdzBS-G-ZcO)zCWpJvGQwrHZ`@wpM420ac@bI5~KkTFfGEM3sPWO8co4^fI6lPnA)Y{ef%@{+SnoUk0+dW+*{8WvF8}}l07*qoM6N<$g7cXs A&j0`b literal 0 HcmV?d00001 diff --git a/upload/images/icons/ico_lightsoff.gif b/upload/images/icons/ico_lightsoff.gif new file mode 100644 index 0000000000000000000000000000000000000000..5caf4b3c12091aaddd430f901ed399fbf1e37035 GIT binary patch literal 1510 zcmeH`dsos20ET}e9<7rsvkcADRxML2%i3%eqtpcZW1g*@Wv83Vty!+kT$eLDD{0kg zU0mhN)WU8mk(ZDRG49CicjF>Akx*0!H4um-6IS10fA0MN?|IJio;R1gHFJI8ULXN@ za}6+?%}q^B1qB5#4EOiFw>+>2zwf zTCdj!gF&@c>z|r}A@StfDOP(i3`wQ~)6F~qOC}SjRCIxmkD?7ss&T}o8ya@Ke$8yn zG234{oGuvTTJ2V*w5RFu0Z6F~1Orb&$ouBaE4QcPaZcZ`6$1H6Xm_U+(F|JZI&K<< zhcsrR%4B>uJ^dU-w0b>*wo!;6d`<6kAfS+t1?mrE6Fy%pgUxKo=b%c&{G#7(DVOp=5VcsvYBh+WTm(gpdi~&l&;J%hK^T^?+X(Egbs~-CJ%vQ47r?O7 zZ8PfjGDISs<%QGhz0<{JiG{58?-`OFE|!x9LtderXp*g2dHqc1DE zAaK|*AOsb5*8~Se5x7So>*Om{QUvBI|4c-5$}VYJgRlYjgfDcZhO`?ApA2r zbq|Pl^01YQt~R(kk6d5+cg7(z$YR(KYF5_o@v&DDS5^ggx{|t>qq?@-@SDVP%Ho_0 zE!bugMO15KhD87?cb#wzN{Sb(x^i+$nFX#%{24x(>8*%*lDjWNET6G%!~K#VFJB~z z9XFo6ca=&gFZaC)6Mebr6yc=T*~jhV5~he@07joXCog`DG_mYHa4vEo7Ek>JmjWz0 z9sPM`;aU95*#l?dzS0+-O*o9VoWk8IjKHn8CxyoCOy`FtEubV9p3msnvG9D1e8>Jj zGh%EFSEF!Per5K@ls_Ua7p)dW5Q$rct_wEJ*nA^vYr(E6%s%pxs{9`e!~g6#(){2? zHqOhd`H_$x9$RV|z{DhyDnGd;fC_9i$48a}x69q+#yiDk|LNPueCusBp=7H4?i{RO zb0h_?%t^SkW@kMXT=CoThnVD)x`*|YxPuRBkK{R;s`AojW9UyW^5Rmng;9dYJ)p($ z_}K_;w58kUIMniJu#1FWJJ+4FAo(3_>D=uulA7h`Q*s9R+g90kUJwb{qFk}=a;l~hpwQy z1hYOHa|vhXrcH?EeoJ=|LyPDWJ@LoKCL~Gc)7;V}2QHP$k{ju6`QneZ^AzclG!M8| jSK@&(ZFG-frE|=K5X0-s0L-Q$uadN^zj8@P2(aN_PkpxM literal 0 HcmV?d00001 diff --git a/upload/images/icons/info.png b/upload/images/icons/info.png new file mode 100644 index 0000000000000000000000000000000000000000..12cd1aef900803abba99b26920337ec01ad5c267 GIT binary patch literal 778 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 literal 0 HcmV?d00001 diff --git a/upload/images/icons/no_thumb_player.png b/upload/images/icons/no_thumb_player.png new file mode 100644 index 0000000000000000000000000000000000000000..7add40b64c24bc7468aa1a5fd4e55cd038eefa97 GIT binary patch literal 1448 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 literal 0 HcmV?d00001 diff --git a/upload/images/icons/settings.gif b/upload/images/icons/settings.gif new file mode 100644 index 0000000000000000000000000000000000000000..7a08bf03eaf47775b6c0411a5d582bc167a1664d GIT binary patch literal 405 zcmV;G0c!q7Nk%w1VGsZi0M$JJ|Ns9eG(XYV;Zt5|?(z16kesBbuTx-YOjcocgOJ|e z-}LwR-R14HzR1_$=yZOG;^*tBu(qqQw{v}mc!Q47+2i2n?VF>lsI0KQ#mv&%<#2n4 zkesRg{rsS(t}Z!5y2R1%@9wy~zth;?zsAikJ4T(XyLW?*Ylh?SwX zyusb$=*7*}fQ^~l;pAg%b|^DGa(#)@)!4bh$=coGP+ez5Pg$0rse_N1O;%w4|Nj60 z00000A^8LW002DzEC2ui01yBW000KEz@Bi(Dim15q|n%d0RXTbGr7wU5($e1OUUSk zI1*v80CYM4GJ$ju9tfsU2vVs)LL(EQ?N%s2Cm$atAbxxlG$=JT963)s95yv5G!z?8 zA}<3^PXjL^Pa6*o4j3+*oC7Wxqz@%C2nH<%r~|SF2s0%@2m%)|w6-x90tiC^0xJR@ zHxd#z9?1d$LIDv14cH6}+1U}))e{0KGTSmK0u$iJ)G8VpDm?+~O7ipcLO}pKr3tZG literal 0 HcmV?d00001 diff --git a/upload/images/icons/topic_icons/award_star_silver_3.png b/upload/images/icons/topic_icons/award_star_silver_3.png new file mode 100644 index 0000000000000000000000000000000000000000..58a538dc2308096204b1caa95a69db3fceb6fae7 GIT binary patch literal 1585 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 literal 0 HcmV?d00001 diff --git a/upload/images/icons/topic_icons/book_open.png b/upload/images/icons/topic_icons/book_open.png new file mode 100644 index 0000000000000000000000000000000000000000..1086fbeb6336b6474f48a5510a0582e3d790348a GIT binary patch literal 1211 zcmV;s1VsCZP)BoUbkKpjg@lVct@!o$9i@X!`8?U``aBEkT zti&Wd4~6~%7=Gf&yQ80dG*s*mYM)5b*ngiwe>+oGSBu#;S3Q`bks+1l(_WU3_b^`_EBPULuEq0@~c+*!L|`AQ2}vkFCd_=+HWpT+Tz@9IZ!umB-5i2+PRu?ZiGQx|#z%qu6KJsuFq z3TYqpy(&A*qE?z_?2v>m5tPuW8IOod%!}aGE1VgURgn;;$swz0BUOdSc0n;wVOmE6 z>>z(vYvTBn8Xr_SfRDOFxpqhmMyQn(* znS|RFP|ZUS?1)0_BQY*S2^^U$p<#hYVl$}09EHghBdS?K>_ZO3%YDZ}l(K-oFHhj+ z>etVQ$QpNQC!FK_gQf2Ygn3Fz}(EQFzqY`9(ocz{X^jWGY*(*Qd;X_ZOqo>#sypG;&N+&|Fy%5osq!o}n z>yDg>LfXO1U1(=CMy>Qz%Wq z;HRtqtYYHoH}EO0+ad~FtVWt=6CSf1R&o7?K2B;yv_l4%FRkIm!V0Fw$8}=ITW=U1 zlU2#v0p?IlK=SN=yOly+nRh)Ah(>O3YdE*6`=-i;U>$9~yW99w&DWSQ0XXY#{nXvj z>XLqcWEt0;PMjRiw_FYm-0!Y82o=~K41UF0Sk&^+tDnAkvnG$}U#PS{3G6CTVkuX;DdiGP~K}{4{|yipQtr3pT*Jge*Uij Z0{~;&23{aS+7bW&002ovPDHLkV1ng#K&=1( literal 0 HcmV?d00001 diff --git a/upload/images/icons/topic_icons/cake.png b/upload/images/icons/topic_icons/cake.png new file mode 100644 index 0000000000000000000000000000000000000000..25c27e0edff65f571066b396e50d9c672d053458 GIT binary patch literal 2066 zcmV+t2<`WYP)H<|=&{eC74XR*4 z6DlPHDTxx*t>d~Te#VdS*q-;}zWL9&_j(*VbqN{Guk*O){{Q#C&tX+R6ZFAfZl%$TrQkSIrC!1?O}*!aXTG&dWVo4FnU zy>9@-I|p6hf8s7(|7z_gM+@4=a~=TeSs z3MQ^=;ZHZWFTFWgE4i*IEZ{f>-n!K)z4>u{qd?j|G*UpjzKyr0S{rX%D_wHQQiOv3 zCZ2x&#nk^|0rtnsliydvk>}E}z8?)IGcarC;81W`j)Px3nm)o0{bS0cJqxB~;Dtv# z&wOyp66b6Z_`(F=(~f*_%La)Td*^@shneSJ`4uY7`d_-u#_wJ_{q?KdNC5!$oA*Eb z^3YiRpGO8#hw|wJVzf&sh$~gcGbb@`(`b`YLj&K#f41Mn#Kc*&T%n|R&iMuBJmoE6 zIh(BbSPuAV{~(&?;Is3U`m=9OF0QXF&7XetneWbU0HN$ye)>Cy$3W?X4%MqRku02J z3xD&mqI&?=7Ehv6I}AG##^h%ujE)V8_k;;)Il$=ZB6Ip{Dz>v3dtvwGNz; zOJ`l4DS`q3^YbTB*)AYX0zX@*Ae~K9+<5%Ml5c;Kt%$s()kHsO*8*(-_DnP}|-@O?Qw87r@->h^LOB+VL!vEf!&@VHl)(h0f@8 z3$d_*Tm%>h(;3?q#ZCmFNsGU(04Iq5w}(AbtrMfej~6gC8$zpVk{}E1ss%+2;+7D` zb7<1+*7Q%%Y5ow&%m9|k7Btc;MMB2DGy=KXLOi14P@e*BfHlhEf7iH$*5v z?f4aiF)2_3q2<|`%isFi_|Ll95JIX%fV_BU5LHZ%NO{zV(KcyN_Gz6H`FxdvY?Ul_ zhsG5?r@b=0v&rA_!SL`h30zyJy0UT=zkl`RAFR#IE^z#0ER0UQer)!k)6d}}?J+E9 z#}T6PA0_)F!YU#%Lw`hqMrLqaPs@Pztx1^9H7E7Czz+2TogO%P9r@13IMKO*m5YDI zvDc;^Cb`Sp1*8WWMmUY6UBVOXzvBtxZ)iq_uq5YElanYThhl;v)CCF61THiqcK+5e6-gqXH8$@Pw7$J>1lOlU0`=FTLtC@SiP0|-6`8}7* zqPlN1o7h}0VY6HYmxW$i5WhHh^U7+6e|z@Cxk5JjBz3)Tg3>QGkVGs?sThwSN}~uy zCn!3*TwwVY&~-ARf%N+l( z;8h}-&&5(dJ~eXU=y3e_a4PbMDzkV}Q;G;ui0!#;vtBu_wXNHxKz!xF7iKK$D5 zm!D>al#1R<8}8Ws%1dGw{*x*bxo^|Vx<+kBuP|3?i4!BAH4fo=9T*IaQ^%` zxLi($+6^H#>#Ml$cIcS=J zO7fGcw}6||>7>nF*tBI6h6aa3e{^&dYuBzN00xOk{*wg&ndGm(FXP(8HN@lbc?^Uj z5p;C4BiIxa^TN>>-VWr&STYl%gJ`JDzEuGB=}wz!OiWCOjaWz5io}Wo4x$Sq zBSuhCZ@fZaCqZouG~ zLA18DQIzK_0GeJ|0JwDN5;CbILeVxH8*^bO?na?hiDVb~KQf1HtGtL$Pts}2SlzW6 zW+g&-V}n4JYp(7h0H;o#sxsgrw{X*l0gi!GE{n;VH=wqx#OG%l(b5{j*1jlOVgX@y zb1I9`tJ5?#g;yVTlI<0!6s-P6zi=S~&<*{+Q!z8Zr&L2BI~fQU@cFNfPoQl@3_p!E zVqJF^dLCE_Z-W=vm}BzE2>=VKU z8ebjLUnN&8S3gS;8E>0};uA07Z5^;W4&hTiSj; z1GHA{Ex02C+)AYqbW?}Z<-sJ~>%Qh$0wqJ0og@l^vO@^>S;u2+!?rG`M?}6s{%7H} z%1dE@T~Hzym~?-m(J+QDj$mh30cTQijAt|iB_~=Hj}Y#&j>p)BZ6nbL&Ar6}ueGQk zxosYxbX;YCuA-`jDXOP&^jJUkZQqJ-M-tdOY+$yMh#JWJ`5p)Mt<&-2(SAxm#F84K zJaQ}fXxeR3F)LY^fwO~W#baa}G5~{UR1^o=THEo@^=tU<&=G8WWIbMdp%Y%Wm9PqP z8oj3DG&V$YCCaAlVvcEQ)wtueYOi4xfR*nJ4E#1At`7$uKST_|e!)1K1p)y|EUidT zJuqCO%6dNJsb(k?i}L_@iMdAF*hB8Ksx9js;BSs6i&be6fO0yWKGEOb zztPUwwXbBo!nL+GSlDcL)~x|)PClPMVb@4@P3WioeI${3fq9o3`ykFw3s*$dqO?+@ yc@|ZXcfaw;*>42_X1RYGO80)8E;oRG1sDLJI6MV&=6-$v0000$EukxkgA$nh))+RdAyG2T(O0dT)wHXp;NSou8-?Qj(LPt>Y?m_Fn(BsPM&|I6j8* zCrTdyuzq#)>q_2YDbQ5)fqGX}4Kg#*;c9m`_yrNxtzEqohp!s|{M1tlA~6sJtDY+W zRZ(oX9QaCIJaTBo(O z4OXsr8l%C+g^A7s060Ra-~(2xl^K$>G&i#c9!*PQeYkpSOAGJ_famoMk&j@_s^>~Y zQNUucqVOmd;H~-rvDs|;j>6Sx4cv$%2+X-^QeW0Uv8XHpxN|~|sHu3UH8nM{K5RWR zgZ1_G=f(@t6adx0*ytEUM@Ivtl4GIcja=D)XliU^B$1Jst?$g^Vf{VpUN1{06(zbiO#$KcuU)hH^|rRQ+V<9VhJ2Dr9zhV?+1c5Uo4W)gNd~Xi!?4g8 zHIMf)>!;GQva;A_di(mQ0!&jt5s*>-M(KI;jiO?Y*IRq;{CRdH?Gbi7O2(dy<2nAh zM_p0KIo4UIA~eW>K)}22Y%YFp+x9(3Om4S34{{dg;35imj2vfWXX!hgLib_~&?eaV z$FHiGM*t>)=y`wpwqlGzZB5NDV7J@vBB%gU-iuCrLi|E|*C2QVER(6*piA-0=~H#i zdGphThldxYr>BE6Apx9Dr%qBRiKr)_@Vo^q);l`QlO!f4GWp{|17u~ULt|qzRR4H< zH?BPrECmoG67cE1y~VG-wsG&^;Bel3-^1uAQVLWhWDS^tICNlt5q2>lo(^Q2Hk%w6_{$-Q{-YI#zhsoH$nu>qW04LH z4nhmsEO|_~AZc~4*`&-0uVVgG?ZVEzYad!u?tdDQ{lSL2dC?PXOqdU zWH#2?+yYy+lpsk-jN|F@LT|vGJ3soDjVs9oH*qswZzG7Ju*2XSQvmkf-riHCW&4-i z@ZEs9&NH;`4*g;?Ts9+R&ytn2im= zVeP=7g9j3gE17B*0YcY993c8dNs$%Xtf(k(FJC@hM92vs3L-h~3Y-$7#n8C9jU*f4 zS3?mIO^U1-X3iLp1aak@_;`qojRl9p!4|sQ&;XrXohAMKeP^gH4N@V|B4?P`Txx)h z&W_D!b0Js?f*r%L`m=Raf?u%TzJ2?H2_TjJ{{F3(E?uk&vd~mE-vx7S_Q!M5a zqRi2+?c*u(8F?I?6wdpxfl&X9Xu$|$p+J;mV?n`;i0;GY|8M^YFaRT9rQiw}1i=6R N002ovPDHLkV1i5Oy`lgB literal 0 HcmV?d00001 diff --git a/upload/images/icons/topic_icons/comment.png b/upload/images/icons/topic_icons/comment.png new file mode 100644 index 0000000000000000000000000000000000000000..30968ff5c1261d332ed02877494c8367793dc715 GIT binary patch literal 1185 zcmV;S1YY}zP)e*DtJ=?ID#Bg`zQ2{92c8WSC3PNGakV#Li& z7nUjh=osrtfv(HCY1gi|$M?DSR=d)&qPOlW&zhcl&htF?ocBHFtt5n?xok4caZ~Y6 zlBBc`AAatG`DImi>=m-IjwGc*P&@gE7pE5(iWz~C=0ef@6Tc*e2Vf;0w{$M^r( ztmoy|-CeVgR^3uY6{XrWy_t7(ntu2#K&Q`Mrf6j9!$b8epXP2O8w1*7O+O9QR+f}M zxu%NZ+~J=j3Pl-_?8J-n7&?)=$lBwNItFQADCj@DbJ-&PI(;<*+SYyD=kHqVazC+V z5&1$yBNJ>}U|F$M*%?4wW3v<6UjlSY<}zHf!fLi zrno0a1;)T|Xqd1YgGC$4Zo|uuNbDx7zmh6Kf)c_78 zS+$}zR~IC>p&`;4h#Qeh-iuM!d_F_tIWnNL8f%zZspmi}8VY=W>dXig=+;sxvavV>D5mTu~1&a8p&Tu7CfPVt4h19qVtUdzY3|G-ipas&$4cl-UIO zJ;4Zl+dD)jdWLDt=lQC0e_bPY4>1DC^+4K+h_Qg-X1MAPp8jU{Q!6QKSo`T44buzF zr`V8@v6eLZW062)+~584C%fL840ydLtQcdd6_J`|{-o`Ctb*h^GK`#$fb zu7fXb37+e}JloyF;H!i({M7mN4U_~y|w0&Vw~ePY!!&8^&D!?@15TPm{w{n0nRICLQ@#NK25 zV#SWP4|Ct`jO(5JL6hlsfq5>hZ)^)0oPWbzZ7&bB9XQH;K6^in|HD8r(veYQr_M#j zA5MzTW&r74Xs3194kqXC$+`Y@EX}onzXTWna^bk0xa+Mf00000NkvXXu0mjf{XjX6 literal 0 HcmV?d00001 diff --git a/upload/images/icons/topic_icons/dot.gif b/upload/images/icons/topic_icons/dot.gif new file mode 100644 index 0000000000000000000000000000000000000000..35d42e808f0a8017b8d52a06be2f8fec0b466a66 GIT binary patch literal 43 scmZ?wbhEHbWMp7uXkcLY|NlP&1B2pE7Dgb&paUX6G7L;iE{qJ;0LZEa`2YX_ literal 0 HcmV?d00001 diff --git a/upload/images/icons/topic_icons/emotion_grin.png b/upload/images/icons/topic_icons/emotion_grin.png new file mode 100644 index 0000000000000000000000000000000000000000..97626625b2ea4f13cfa21e51a151d72b3302a93e GIT binary patch literal 2442 zcmV;533c{~P)-irZLsh90f3nyy_qO`A zD5_e7qM3^UhwBCdkO*V^@)?YGyp6u*gGeROIuyg_9@>MBEK@&{0n+g;__^JVZ`9no z3BHBPfytvJO@Q16sJU;G*yaHFD@g9f=zor*{V%(aOyZZzci>xi|Beqe!20*C=$=xu zpsel-PXoz)KQt znnq|U8L<Zx78^I?#j=_?cUCQ111%`Jkw_{da57cnL;E!JL49>jt7*1cpoX20qMK;2c34MJz-l$%-4npFO z(B&~$D3V8CkD#~nAGmAvbane<7&dNn1yu6FFIUJ*IvNqjQ@PS@<^EU5$9+`D(0revEV+F?6v` z*3B4<#h5S|1L@&UU_)u`Vx(ecD6}Tmmfqz;Lwy`26yCr6=4Jfgfd&M7S}`?`dX9IC z5v7a)yiRzx!B4&E*xtSP;e!nr?redVls9}lZs=m2teY_yi!m9S4Y0W#SXWq90WA?Q z`YF>xSK|;P2aEv!{%3n&ad@Z@+$f~qUiBnYB}xjzhVZ(W?s-Yut1s+<)$W1C<}&t* z(bo-K2IV*kguz&h$=FOn&&h2F*00|LM0XLJftGiH?kkj8T_npjgR3QeJBlf29*>HW zG8;W}nB~TQ_3ERYLCR!oSO=nkAXj zpEw9;IcNSBbrUPQf0~=L1m3#?S(}-4xE9uA1cJYbKwDsL0}tQH|z1B!Xt{ zXI-pwf^;(mV`U7rTx-Z=6?4U~$>C@#0RAsQYx zPPrnti_$?%5Uw+wt7D+QA6;D?=hekm)@h4 zh?EW{rAVPx!Tm}iZuqBHVAkyUkSVymXJ147ohPyAljJJr$mR!OfUy{pu`^sKTD<@b zPprkEx+OG-B&k+(h5zx-7B{LMISY4bHT6vuHUec}8=rc@bq>f1=U#_QW3fUs9v|pH z$M5Q~cwWeuWoW2?V6Vf4f1ksT4`R*X08Y`}aWQScB;9D~8pfY{E?%K`%Z+;GE-|lq z0vGo#MffV66BKuilxwe+{6OR+V*-MQ6$yFg`bvs=$r;D!RFQDV# zMl7rurCwnk!=hsvLPKE;^o7Un+l{Z%mH{5*b7w-x`Zg~Lm$)iPl+USqRc;3#kys7cy7Hm0MGg4o$jQ+tRGueeD< zk&Zcw%|>45ArjVbwIhNHz3SoncjHmo+?5Odp&uqZCy-2CJ_mERtj3RA`KWNaCFDCr zIP>{Py>Y8b6%Zp@O~y1#OsEJ?qHD)tJbAngt@L=1By_7ECfU)+PxE5RbT3N3dk@yk zxeY4|9jLt7hDZXPZGCuacOwp64H|VmlFs+!NBuO*er`=0;w0fYi#~Udm!2nc)5o(r zO{vD0aV!n2{J$TkH;V`#z>f4eB-~^sNu|q6{veNY|Nbk$03kOg5GD`(-~a#s07*qo IM6N<$f`+b!LjV8( literal 0 HcmV?d00001 diff --git a/upload/images/icons/topic_icons/emotion_happy.png b/upload/images/icons/topic_icons/emotion_happy.png new file mode 100644 index 0000000000000000000000000000000000000000..515f90d91be5c90556ddcaf3fbfffc389a1cbbea GIT binary patch literal 2350 zcmV+}3DNe6P)320JPs?sKH)e1yNfU0Uk zXb3noG{K~X8rR0yFvQ0DHXeIC`}%tBeQ(GB7KKPnfe@_bVh4`2Ctacp5ir+|mKvsU7GosjMsW zKKwF}*bhYhN+896X(PR@qwlk>k3nV>NVNj7WAuFjusjGD9z*9}Ucva~*5Uhiqns9| zZpQ)LN853=@@re&Wer~e0^5*H1;Gk`L_72nW?I>doV~%4q|m^$#84;Xsoz1;*#XC^ z7(VwgE`P9ZX!RbRTZl@BO7>8Ff0{5M)nM} zK{CXWU~+-PbhC!MaCl2s49hR>=WL zVqkg=8V`1$s4Bai9ZjO?|j` zWg!guG}$r>o7^_X;8+|pmjjxgJ%nc$)Gb?6P!fV1?-Dzh4%!izU@#ifsH!m$m1eS# zM$73@6qjhRdSekX$vEUpLcAXviQ&JW4r8uIkNOohl)1GC`lFbfh@!YS1D7k#)hVfM zq-R432B!`+6Yuo{&Q3J2d zH3xF&kSK3Y1y9Q`QjtkA#sr{JW@^UB*Y{T5;<9-utuCkal$=aPsVfZHvS5H^dth^Y z3mlVUa|g7t$Yh8_5#LoXIWmCvC@6iJ~o_&8e6y@k1R zWfT@M6xn$oHL#d71fue&Gh@mh7Y9@@sKFHNc%Ux^W7Xq`hTg`!IpSy#wxMF>5}G?8 zN0ab{#s(Hz3!Frc9|aa#M5Pr@WN_EYJ@7uV523C@@b~`<{_!E`3?@X{KY?Cn5v*h- z1N5#Mq*8HctZtZ=twR0QhtWSUipanBQr$z?6jh*eB0M$#j>)mP18Ewej+FaHU$EL; zM2{bOt>VC!mjG8!J&X8?-6(ahMb)xzLq~~apu>(@KU4z1HT7`u?>>d4KmHHOTn=3Ib)ehVMJzGel}0q0RGLc$dSd~qYwMx2 zS*Ox;Jk%NNtnacUZhRvC4$;gJ^j z4nK*S@4kuphUGAjmY#<}$_oLfpT6+??l|}~idhRv>9|Q}l$|q)6qpkOzBa!5=Qt+E z&J844-w2{>z3>?1@ZE*HEhhq^bMe+(;sAQPIuITogRAcA(2^~U^!YTCRV`&nx(+{& z@TEVa&YS$a`_ZSyRDr%reem_C{=Vxy>?M^+uEz34Gb@Sb!<{%;Ug0P%DlsDy9YC&4 z^N?KZDL^o6p#+qmr!!TjGf~Ym+I<{}bdr)S3!5d3Do;@Kf~?vbH0C*&9FL;6J20_! z7ihdj4@o$GAjuug)B#Y@xPz*~V|NxgjmRYY0-dRs4=HyMnc)nO)k7-RaQGalF*q?v zJ)*ZK=wG)Ro9QXPCrsqV^qYoK5fpo}xQXkY*pam+4EKiN4;gz13#x#y*Gm2@?yg050cU~ z)u`RR3BRzJG2d?2z-*C}LrS_{l@F*}T zW;HKL<~lIz`Hk3IJsax_jPT5)5Q?Mc;vi1^`WTM%2SlBZtMQKB>D4U%y-sz6A`QBc zg04F-<)5T^)yNYiNHVR~c~srC{6%laH(fvZ7^NO!Y=)tT_oTRTfaA8tnEwed0Lc;M UG=*NkDF6Tf07*qoM6N<$f+*Hzq5uE@ literal 0 HcmV?d00001 diff --git a/upload/images/icons/topic_icons/emotion_smile.png b/upload/images/icons/topic_icons/emotion_smile.png new file mode 100644 index 0000000000000000000000000000000000000000..ad09a526a1f54529372596e812019b3191753aeb GIT binary patch literal 2176 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 Qi~s-t07*qoM6N<$g1cEKDgXcg literal 0 HcmV?d00001 diff --git a/upload/images/icons/topic_icons/emotion_tongue.png b/upload/images/icons/topic_icons/emotion_tongue.png new file mode 100644 index 0000000000000000000000000000000000000000..d728e8e51baeeacc737a47c191015befd50f8a83 GIT binary patch literal 2321 zcmV+s3GViZP)x7~`~Q{>ZdbwW%gEF-g-l594Iw)HrR7 zBLSpM%+L%W8LB)i8W02o!G&F5pZC#o?t}1Zs@>ttF87@8{LVSw?>pbQ0`Bnh$K6ON zn2R6T1bklv$~280YNk@4KN1zVBx`u9^EUqUdax1pN zTX-+Li&p}!lqmrq8p6o628?ukhTg{aA;-`>Fph2CJ&uk^q25&hQr!W(>~vyJ(Ifki zzG5v9t|qAk;;n!(-I~Nv3V13>Hel$BI<$Xq6tNgyTYCgQ!^{<58-V?zr_q&BRG#hs z&a*)5Brtx4K;{DOO{6WS-}9#KfieIjnt(_Z{k{z(Z3mn?(RTVd47NAjeDE;x$uMyz z0oea>0N0B)?#juocmN3OhnfgN@cxuC^b@9RB%`U*Jc&jb1RGVT4cf>n5bdde?|Iy8 zyomM>PxP%hf`!wA5N64|d-3`mSvlop&;kdciEaYl4~XPkqqW37Z92H+jDuh{3U*?o zLP0zaL5)E09YSBzC0wg{r=KdZU~&-B>-I*#b52lwM)cyOaDmDM4~1 z#35)gavG-s#0VsAh!%$^$Yhg%An`ZZh$STBMea&~A+1x{-S<#({}QyW+ShE35#4ZUMII_2TShskP*j5hl1Ogs zB5F@vMoVLlUIni&3HNVYiY5MTD4`~uKU(s0X!yeusK1KRr{2XC4#En+@%N|EsuhwHL;0#K z`j!w1CQ$c&C$jU?uwng|kZIQhIw3<{nP{tir|qG`ASNTu%)z(sMY_WYe`e7=P{(R@ zeqFpkNBtXBc;v+q%-MJuS5vF7=b2pO@9o5hcpuK6_#BW!x}1Oea|Eyoxj*d2*op?U zr&Qq=#};ABvD@V1L){nqWZ#UzSd7WoHm=~~tFU`s@k+?!4a9gOtNYfZKr9Y}tNZq! z-@v;s9fhpO$RO4{xaSRIUiVY83F@{Fe=7;M7Q6|E8#wdY>v->#V~}M9KGJ=2MFd(> z3Y56f7#V}H9v^Pl{oZHzEmy#i>cWmW*$bgYnwY%0DDeoy;Awr)$rq2q?n;A=j#U!< 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 literal 0 HcmV?d00001 diff --git a/upload/images/icons/topic_icons/error.png b/upload/images/icons/topic_icons/error.png new file mode 100644 index 0000000000000000000000000000000000000000..14776e2d6e8e5db9af6c6fbf26f1cec2e47b237c GIT binary patch literal 1179 zcmV;M1Z4Y(P);oS8fKo}cfY^S$%#2-~)4E{8^QJmwsL z7 zwd%ul9m|PspKyfdyvBR84M6PMwB+^5aA-}ueKFC{DWc(16kn1cUgJI1nN0w`mYRyb zrngc=zx{-Y=ZJEU>wUy)yvI7T1wcFYdB?U;ZQPs}1#j;B3<{e{Fy}SiW1VvRmIJ^a z4d^{B?{pJgJ&I~0upwPBoi*NL9oBu;0QCN^Iu9mRE+dh?N;E!-L?hDyO^JzlX4KhZ z9oA)=X9Ym)|77XPP$c+Xd}$KI>sM*_X|!r*H?7&#O_zUZCY5>6()PDH(w7u1Tc>UAAFc_VGAE z76Kr4ZD?5(ddb{azoG$Yy$DSZPcz&MDB<9S^fKUyp>$!xw(Ns_6(Xc8)bBeRg1t?t zW}@^>bh}Aach850MxE;>*G`;yEI8CwZ1I zaRD$XCwyvcst((*Eqt&q_Q}22W~(xTXEwP^_Z0sttWTo6bwR z2O`yX&HQRde13mnU5}LT$-X%T$MRC^9nq|h1P(Q&=BwZiiHdje9UqS<4n!@NbVW?y zn`5N^&hUEzy`9EA0C=U43^d>*6PBu3F>gqHeKPB&7;Y?C#0F*11O*xl)?(#~sQ~n` zZ0_RO-B(&|%XaB83j>h_Kup;7O|LzBPr*FQ(Q_$Q>P6xy20tr!vCuH&9}j?+60_V} t?Gp^!eFD=G((P6;KpI7BZ37ihp->3LfS*W6`~fB=enX(4TlzvJp{+#|QK(G}2@phU z)Cj0wKvILz!fv};wq^_aR%#4#115=t?JLJRIu3Wt)o0{9? z_3JnIy5)Fxj~!@625@`aFbqBkha;eA8Xy}K(gYa*STJuMn9_tV&h$Y;Lp^M+t*ka> zXJ`G^+Ko8G$OJ%0)4C^c@zY=Sg7+~mhzCdmrEt^68aQ|EJeU~NPrv*IufJMRtsU>` z+Wz*&aUis0Duk0qDM<$t7XqczL;$1lyF8u1Oq(_pt`7{r+BN0XEgjumILwod0j7IS!}SyZb~)-u zTTOKp>)`$Xq(hQDjIPPgv?rzlY04u!FexhwJcb9nGrTZ79D~9lf7SaRd|36~f&Hf_ z-V^}D0x>}69*-w205aJN(OAx-rYRQfAap1T2B5PC*N}q83XSru!Bfx7hRKt&x8bnQ zaUb)#;sHZ9`A81Wob7cStEKT;IG}XhfQpK>JihVJN8n$&1j=7n4Mz?hg#8B&K%u_? zikA2-A>$mXsvm#80+%j*1KHV=E73YB1pp`pBu^3izpSVbq>7TNGfv>>N0D{OusPQoP{7W2Nkv$L$LIRIPOZ{-+;w7g7lMI+rRRVG# zto$Z$LAIeEK_xYPI)ap(ipZTXbq@xxYtJ49%H$HJYXU57X3^J4P|oMN(pg#n z_DzbKl>F<}Yf64X2{j4CQ0&mW`i2Ipf!Vc)8`z1rsZ)*SyF#3{!W?bsPgqQ|zp{v5_eZ1k0g4 z)C74xA3F+^KM!r8qmY}Q4<)5#SPg<}y|}nY`H;zHh$_GS?|*PACZT6wz$z8#q@Zs1 zZb!jy?cB+Zq+)98u3Zdxgjh6&ZFd;FSP8SR^SOQ7UGzU0coUXTPWLbZ4ZixU2j(oyu~LFj78Easv!}XY z&Vn4LJbi^l%+~r1wN@uYTPzxf^)m14|@~v@fL`U-(XhsiLi9^*R@e z62iB`unKM9vPHr}ym0@;b1-Z6vyRB-=jFq9=f6&|&CSWR7W8^kK0Cbb#t{ievAO6I z{TzYZf)y#MkK7p^XB&!G?-Bog)3O1`STuT}zyEU3e$ATb_kgVr#ky+|neu{7k7-)V zCQ@+k7GesX&&7S_{k~!z(nb^y;(inNs11M?&89CT`-%HMZWK8x65YfgNzI$kgU0000 literal 0 HcmV?d00001 diff --git a/upload/images/icons/topic_icons/television.png b/upload/images/icons/topic_icons/television.png new file mode 100644 index 0000000000000000000000000000000000000000..40116333e9e0f0ac6eb2b3a7cb760280b8f228f8 GIT binary patch literal 1473 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'current_page','current_page'); + +?> \ No newline at end of file diff --git a/upload/includes/admin.functions.php b/upload/includes/admin.functions.php new file mode 100644 index 00000000..e2aba87f --- /dev/null +++ b/upload/includes/admin.functions.php @@ -0,0 +1,28 @@ +Edit Video'; + } + + function show_view_channel_link($data) + { + echo 'Edit User'; + } + + register_anchor_function('show_video_admin_link','watch_admin_options'); + register_anchor_function('show_view_channel_link','view_channel_admin_options'); +} + +?> \ No newline at end of file diff --git a/upload/includes/admin_config.php b/upload/includes/admin_config.php new file mode 100644 index 00000000..2be09c4b --- /dev/null +++ b/upload/includes/admin_config.php @@ -0,0 +1,78 @@ +update(tbl("config"),array("value"),array($num)," name='admin_pages'"); + $ClipBucket->configs = $Cbucket->configs = $Cbucket->get_configs(); + } + + define('RESULTS', $admin_pages); + Assign('admin_pages',$admin_pages); + + //Do No Edit Below This Line + + define('TEMPLATEDIR',BASEDIR.'/'.ADMINDIR.'/'.TEMPLATEFOLDER.'/cbv2'); + define('SITETEMPLATEDIR',BASEDIR.'/'.TEMPLATEFOLDER.'/'.$row['template_dir']); + define('TEMPLATEURL',BASEURL.'/'.ADMINDIR.'/'.TEMPLATEFOLDER.'/cbv2'); + define('LAYOUT',TEMPLATEDIR.'/layout'); + + define('TEMPLATE',$row['template_dir']); + + + + Assign('baseurl',BASEURL); + Assign('admindir',ADMINDIR); + Assign('imageurl',TEMPLATEURL.'/images'); + Assign('layout',TEMPLATEURL.'/layout'); + Assign('theme',TEMPLATEURL.'/theme'); + Assign('style_dir',LAYOUT); + + + Assign('logged_user',@$_SESSION['username']); + Assign('superadmin',@$_SESSION['superadmin']); + + $AdminArea = true; + + //Including Plugins + include('plugins.php'); + + //Including Flv Players + include('flv_player.php'); + + +$Smarty->assign_by_ref('cbmass',$cbmass) + +?> \ No newline at end of file diff --git a/upload/includes/adminfunctions.php b/upload/includes/adminfunctions.php new file mode 100644 index 00000000..369f2712 --- /dev/null +++ b/upload/includes/adminfunctions.php @@ -0,0 +1,14 @@ + \ No newline at end of file diff --git a/upload/includes/adodb/adodb-active-record.inc.php b/upload/includes/adodb/adodb-active-record.inc.php new file mode 100644 index 00000000..92836be7 --- /dev/null +++ b/upload/includes/adodb/adodb-active-record.inc.php @@ -0,0 +1,626 @@ +_dbat +$_ADODB_ACTIVE_DBS = array(); +$ACTIVE_RECORD_SAFETY = true; + +class ADODB_Active_DB { + var $db; // ADOConnection + var $tables; // assoc array of ADODB_Active_Table objects, indexed by tablename +} + +class ADODB_Active_Table { + var $name; // table name + var $flds; // assoc array of adofieldobjs, indexed by fieldname + var $keys; // assoc array of primary keys, indexed by fieldname + var $_created; // only used when stored as a cached file +} + +// returns index into $_ADODB_ACTIVE_DBS +function ADODB_SetDatabaseAdapter(&$db) +{ + global $_ADODB_ACTIVE_DBS; + + foreach($_ADODB_ACTIVE_DBS as $k => $d) { + if (PHP_VERSION >= 5) { + if ($d->db === $db) return $k; + } else { + if ($d->db->_connectionID === $db->_connectionID && $db->database == $d->db->database) + return $k; + } + } + + $obj = new ADODB_Active_DB(); + $obj->db =& $db; + $obj->tables = array(); + + $_ADODB_ACTIVE_DBS[] = $obj; + + return sizeof($_ADODB_ACTIVE_DBS)-1; +} + + +class ADODB_Active_Record { + var $_dbat; // associative index pointing to ADODB_Active_DB eg. $ADODB_Active_DBS[_dbat] + var $_table; // tablename, if set in class definition then use it as table name + var $_tableat; // associative index pointing to ADODB_Active_Table, eg $ADODB_Active_DBS[_dbat]->tables[$this->_tableat] + var $_where; // where clause set in Load() + var $_saved = false; // indicates whether data is already inserted. + var $_lasterr = false; // last error message + var $_original = false; // the original values loaded or inserted, refreshed on update + + // should be static + function SetDatabaseAdapter(&$db) + { + return ADODB_SetDatabaseAdapter($db); + } + + // php4 constructor + function ADODB_Active_Record($table = false, $pkeyarr=false, $db=false) + { + ADODB_Active_Record::__construct($table,$pkeyarr,$db); + } + + // php5 constructor + function __construct($table = false, $pkeyarr=false, $db=false) + { + global $ADODB_ASSOC_CASE,$_ADODB_ACTIVE_DBS; + + if ($db == false && is_object($pkeyarr)) { + $db = $pkeyarr; + $pkeyarr = false; + } + + if (!$table) { + if (!empty($this->_table)) $table = $this->_table; + else $table = $this->_pluralize(get_class($this)); + } + if ($db) { + $this->_dbat = ADODB_Active_Record::SetDatabaseAdapter($db); + } else + $this->_dbat = sizeof($_ADODB_ACTIVE_DBS)-1; + + + if ($this->_dbat < 0) $this->Error("No database connection set; use ADOdb_Active_Record::SetDatabaseAdapter(\$db)",'ADODB_Active_Record::__constructor'); + + $this->_table = $table; + $this->_tableat = $table; # reserved for setting the assoc value to a non-table name, eg. the sql string in future + $this->UpdateActiveTable($pkeyarr); + } + + function __wakeup() + { + $class = get_class($this); + new $class; + } + + function _pluralize($table) + { + $ut = strtoupper($table); + $len = strlen($table); + $lastc = $ut[$len-1]; + $lastc2 = substr($ut,$len-2); + switch ($lastc) { + case 'S': + return $table.'es'; + case 'Y': + return substr($table,0,$len-1).'ies'; + case 'X': + return $table.'es'; + case 'H': + if ($lastc2 == 'CH' || $lastc2 == 'SH') + return $table.'es'; + default: + return $table.'s'; + } + } + + ////////////////////////////////// + + // update metadata + function UpdateActiveTable($pkeys=false,$forceUpdate=false) + { + global $ADODB_ASSOC_CASE,$_ADODB_ACTIVE_DBS , $ADODB_CACHE_DIR, $ADODB_ACTIVE_CACHESECS; + + $activedb =& $_ADODB_ACTIVE_DBS[$this->_dbat]; + + $table = $this->_table; + $tables = $activedb->tables; + $tableat = $this->_tableat; + if (!$forceUpdate && !empty($tables[$tableat])) { + $tobj =& $tables[$tableat]; + foreach($tobj->flds as $name => $fld) + $this->$name = null; + return; + } + + $db =& $activedb->db; + $fname = $ADODB_CACHE_DIR . '/adodb_' . $db->databaseType . '_active_'. $table . '.cache'; + if (!$forceUpdate && $ADODB_ACTIVE_CACHESECS && $ADODB_CACHE_DIR && file_exists($fname)) { + $fp = fopen($fname,'r'); + @flock($fp, LOCK_SH); + $acttab = unserialize(fread($fp,100000)); + fclose($fp); + if ($acttab->_created + $ADODB_ACTIVE_CACHESECS - (abs(rand()) % 16) > time()) { + // abs(rand()) randomizes deletion, reducing contention to delete/refresh file + // ideally, you should cache at least 32 secs + $activedb->tables[$table] = $acttab; + + //if ($db->debug) ADOConnection::outp("Reading cached active record file: $fname"); + return; + } else if ($db->debug) { + ADOConnection::outp("Refreshing cached active record file: $fname"); + } + } + $activetab = new ADODB_Active_Table(); + $activetab->name = $table; + + + $cols = $db->MetaColumns($table); + if (!$cols) { + $this->Error("Invalid table name: $table",'UpdateActiveTable'); + return false; + } + $fld = reset($cols); + if (!$pkeys) { + if (isset($fld->primary_key)) { + $pkeys = array(); + foreach($cols as $name => $fld) { + if (!empty($fld->primary_key)) $pkeys[] = $name; + } + } else + $pkeys = $this->GetPrimaryKeys($db, $table); + } + if (empty($pkeys)) { + $this->Error("No primary key found for table $table",'UpdateActiveTable'); + return false; + } + + $attr = array(); + $keys = array(); + + switch($ADODB_ASSOC_CASE) { + case 0: + foreach($cols as $name => $fldobj) { + $name = strtolower($name); + $this->$name = null; + $attr[$name] = $fldobj; + } + foreach($pkeys as $k => $name) { + $keys[strtolower($name)] = strtolower($name); + } + break; + + case 1: + foreach($cols as $name => $fldobj) { + $name = strtoupper($name); + $this->$name = null; + $attr[$name] = $fldobj; + } + + foreach($pkeys as $k => $name) { + $keys[strtoupper($name)] = strtoupper($name); + } + break; + default: + foreach($cols as $name => $fldobj) { + $name = ($fldobj->name); + $this->$name = null; + $attr[$name] = $fldobj; + } + foreach($pkeys as $k => $name) { + $keys[$name] = $cols[$name]->name; + } + break; + } + + $activetab->keys = $keys; + $activetab->flds = $attr; + + if ($ADODB_ACTIVE_CACHESECS && $ADODB_CACHE_DIR) { + $activetab->_created = time(); + $s = serialize($activetab); + if (!function_exists('adodb_write_file')) include(ADODB_DIR.'/adodb-csvlib.inc.php'); + adodb_write_file($fname,$s); + } + $activedb->tables[$table] = $activetab; + } + + function GetPrimaryKeys(&$db, $table) + { + return $db->MetaPrimaryKeys($table); + } + + // error handler for both PHP4+5. + function Error($err,$fn) + { + global $_ADODB_ACTIVE_DBS; + + $fn = get_class($this).'::'.$fn; + $this->_lasterr = $fn.': '.$err; + + if ($this->_dbat < 0) $db = false; + else { + $activedb = $_ADODB_ACTIVE_DBS[$this->_dbat]; + $db =& $activedb->db; + } + + if (function_exists('adodb_throw')) { + if (!$db) adodb_throw('ADOdb_Active_Record', $fn, -1, $err, 0, 0, false); + else adodb_throw($db->databaseType, $fn, -1, $err, 0, 0, $db); + } else + if (!$db || $db->debug) ADOConnection::outp($this->_lasterr); + + } + + // return last error message + function ErrorMsg() + { + if (!function_exists('adodb_throw')) { + if ($this->_dbat < 0) $db = false; + else $db = $this->DB(); + + // last error could be database error too + if ($db && $db->ErrorMsg()) return $db->ErrorMsg(); + } + return $this->_lasterr; + } + + function ErrorNo() + { + if ($this->_dbat < 0) return -9999; // no database connection... + $db = $this->DB(); + + return (int) $db->ErrorNo(); + } + + + // retrieve ADOConnection from _ADODB_Active_DBs + function &DB() + { + global $_ADODB_ACTIVE_DBS; + + if ($this->_dbat < 0) { + $false = false; + $this->Error("No database connection set: use ADOdb_Active_Record::SetDatabaseAdaptor(\$db)", "DB"); + return $false; + } + $activedb = $_ADODB_ACTIVE_DBS[$this->_dbat]; + $db =& $activedb->db; + return $db; + } + + // retrieve ADODB_Active_Table + function &TableInfo() + { + global $_ADODB_ACTIVE_DBS; + + $activedb = $_ADODB_ACTIVE_DBS[$this->_dbat]; + $table =& $activedb->tables[$this->_tableat]; + return $table; + } + + // set a numeric array (using natural table field ordering) as object properties + function Set(&$row) + { + global $ACTIVE_RECORD_SAFETY; + + $db =& $this->DB(); + + if (!$row) { + $this->_saved = false; + return false; + } + + $this->_saved = true; + + $table =& $this->TableInfo(); + if ($ACTIVE_RECORD_SAFETY && sizeof($table->flds) != sizeof($row)) { + $this->Error("Table structure of $this->_table has changed","Load"); + return false; + } + + $keys = array_keys($row); + $cnt = 0; + foreach($table->flds as $name=>$fld) { + $this->$name = $row[$keys[$cnt]]; + $cnt += 1; + } + $this->_original = $row; + return true; + } + + // get last inserted id for INSERT + function LastInsertID(&$db,$fieldname) + { + if ($db->hasInsertID) + $val = $db->Insert_ID($this->_table,$fieldname); + else + $val = false; + + if (is_null($val) || $val === false) { + // this might not work reliably in multi-user environment + return $db->GetOne("select max(".$fieldname.") from ".$this->_table); + } + return $val; + } + + // quote data in where clause + function doquote(&$db, $val,$t) + { + switch($t) { + case 'D': + case 'T': + if (empty($val)) return 'null'; + + case 'C': + case 'X': + if (is_null($val)) return 'null'; + + if (strncmp($val,"'",1) != 0 && substr($val,strlen($val)-1,1) != "'") { + return $db->qstr($val); + break; + } + default: + return $val; + break; + } + } + + // generate where clause for an UPDATE/SELECT + function GenWhere(&$db, &$table) + { + $keys = $table->keys; + $parr = array(); + + foreach($keys as $k) { + $f = $table->flds[$k]; + if ($f) { + $parr[] = $k.' = '.$this->doquote($db,$this->$k,$db->MetaType($f->type)); + } + } + return implode(' and ', $parr); + } + + + //------------------------------------------------------------ Public functions below + + function Load($where,$bindarr=false) + { + $db =& $this->DB(); if (!$db) return false; + $this->_where = $where; + + $save = $db->SetFetchMode(ADODB_FETCH_NUM); + $row = $db->GetRow("select * from ".$this->_table.' WHERE '.$where,$bindarr); + $db->SetFetchMode($save); + + return $this->Set($row); + } + + // false on error + function Save() + { + if ($this->_saved) $ok = $this->Update(); + else $ok = $this->Insert(); + + return $ok; + } + + // false on error + function Insert() + { + $db =& $this->DB(); if (!$db) return false; + $cnt = 0; + $table =& $this->TableInfo(); + + $valarr = array(); + $names = array(); + $valstr = array(); + + foreach($table->flds as $name=>$fld) { + $val = $this->$name; + if(!is_null($val) || !array_key_exists($name, $table->keys)) { + $valarr[] = $val; + $names[] = $name; + $valstr[] = $db->Param($cnt); + $cnt += 1; + } + } + + if (empty($names)){ + foreach($table->flds as $name=>$fld) { + $valarr[] = null; + $names[] = $name; + $valstr[] = $db->Param($cnt); + $cnt += 1; + } + } + $sql = 'INSERT INTO '.$this->_table."(".implode(',',$names).') VALUES ('.implode(',',$valstr).')'; + $ok = $db->Execute($sql,$valarr); + + if ($ok) { + $this->_saved = true; + $autoinc = false; + foreach($table->keys as $k) { + if (is_null($this->$k)) { + $autoinc = true; + break; + } + } + if ($autoinc && sizeof($table->keys) == 1) { + $k = reset($table->keys); + $this->$k = $this->LastInsertID($db,$k); + } + } + + $this->_original = $valarr; + return !empty($ok); + } + + function Delete() + { + $db =& $this->DB(); if (!$db) return false; + $table =& $this->TableInfo(); + + $where = $this->GenWhere($db,$table); + $sql = 'DELETE FROM '.$this->_table.' WHERE '.$where; + $ok = $db->Execute($sql); + + return $ok ? true : false; + } + + // returns an array of active record objects + function &Find($whereOrderBy,$bindarr=false,$pkeysArr=false) + { + $db =& $this->DB(); if (!$db || empty($this->_table)) return false; + $arr =& $db->GetActiveRecordsClass(get_class($this),$this->_table, $whereOrderBy,$bindarr,$pkeysArr); + return $arr; + } + + // returns 0 on error, 1 on update, 2 on insert + function Replace() + { + global $ADODB_ASSOC_CASE; + + $db =& $this->DB(); if (!$db) return false; + $table =& $this->TableInfo(); + + $pkey = $table->keys; + + foreach($table->flds as $name=>$fld) { + $val = $this->$name; + /* + if (is_null($val)) { + if (isset($fld->not_null) && $fld->not_null) { + if (isset($fld->default_value) && strlen($fld->default_value)) continue; + else { + $this->Error("Cannot update null into $name","Replace"); + return false; + } + } + }*/ + if (is_null($val) && !empty($fld->auto_increment)) { + continue; + } + $t = $db->MetaType($fld->type); + $arr[$name] = $this->doquote($db,$val,$t); + $valarr[] = $val; + } + + if (!is_array($pkey)) $pkey = array($pkey); + + + if ($ADODB_ASSOC_CASE == 0) + foreach($pkey as $k => $v) + $pkey[$k] = strtolower($v); + elseif ($ADODB_ASSOC_CASE == 0) + foreach($pkey as $k => $v) + $pkey[$k] = strtoupper($v); + + $ok = $db->Replace($this->_table,$arr,$pkey); + if ($ok) { + $this->_saved = true; // 1= update 2=insert + if ($ok == 2) { + $autoinc = false; + foreach($table->keys as $k) { + if (is_null($this->$k)) { + $autoinc = true; + break; + } + } + if ($autoinc && sizeof($table->keys) == 1) { + $k = reset($table->keys); + $this->$k = $this->LastInsertID($db,$k); + } + } + + $this->_original =& $valarr; + } + return $ok; + } + + // returns 0 on error, 1 on update, -1 if no change in data (no update) + function Update() + { + $db =& $this->DB(); if (!$db) return false; + $table =& $this->TableInfo(); + + $where = $this->GenWhere($db, $table); + + if (!$where) { + $this->error("Where missing for table $table", "Update"); + return false; + } + $valarr = array(); + $neworig = array(); + $pairs = array(); + $i = -1; + $cnt = 0; + foreach($table->flds as $name=>$fld) { + $i += 1; + $val = $this->$name; + $neworig[] = $val; + + if (isset($table->keys[$name])) { + continue; + } + + if (is_null($val)) { + if (isset($fld->not_null) && $fld->not_null) { + if (isset($fld->default_value) && strlen($fld->default_value)) continue; + else { + $this->Error("Cannot set field $name to NULL","Update"); + return false; + } + } + } + + if (isset($this->_original[$i]) && $val == $this->_original[$i]) { + continue; + } + $valarr[] = $val; + $pairs[] = $name.'='.$db->Param($cnt); + $cnt += 1; + } + + + if (!$cnt) return -1; + $sql = 'UPDATE '.$this->_table." SET ".implode(",",$pairs)." WHERE ".$where; + $ok = $db->Execute($sql,$valarr); + if ($ok) { + $this->_original =& $neworig; + return 1; + } + return 0; + } + + function GetAttributeNames() + { + $table =& $this->TableInfo(); + if (!$table) return false; + return array_keys($table->flds); + } + +}; + +?> \ No newline at end of file diff --git a/upload/includes/adodb/adodb-csvlib.inc.php b/upload/includes/adodb/adodb-csvlib.inc.php new file mode 100644 index 00000000..5662b6e0 --- /dev/null +++ b/upload/includes/adodb/adodb-csvlib.inc.php @@ -0,0 +1,312 @@ +FieldCount() : 0; + + if ($sql) $sql = urlencode($sql); + // metadata setup + + if ($max <= 0 || $rs->dataProvider == 'empty') { // is insert/update/delete + if (is_object($conn)) { + $sql .= ','.$conn->Affected_Rows(); + $sql .= ','.$conn->Insert_ID(); + } else + $sql .= ',,'; + + $text = "====-1,0,$sql\n"; + return $text; + } + $tt = ($rs->timeCreated) ? $rs->timeCreated : time(); + + ## changed format from ====0 to ====1 + $line = "====1,$tt,$sql\n"; + + if ($rs->databaseType == 'array') { + $rows =& $rs->_array; + } else { + $rows = array(); + while (!$rs->EOF) { + $rows[] = $rs->fields; + $rs->MoveNext(); + } + } + + for($i=0; $i < $max; $i++) { + $o =& $rs->FetchField($i); + $flds[] = $o; + } + + $savefetch = isset($rs->adodbFetchMode) ? $rs->adodbFetchMode : $rs->fetchMode; + $class = $rs->connection->arrayClass; + $rs2 = new $class(); + $rs2->sql = $rs->sql; + $rs2->oldProvider = $rs->dataProvider; + $rs2->InitArrayFields($rows,$flds); + $rs2->fetchMode = $savefetch; + return $line.serialize($rs2); + } + + +/** +* Open CSV file and convert it into Data. +* +* @param url file/ftp/http url +* @param err returns the error message +* @param timeout dispose if recordset has been alive for $timeout secs +* +* @return recordset, or false if error occured. If no +* error occurred in sql INSERT/UPDATE/DELETE, +* empty recordset is returned +*/ + function &csv2rs($url,&$err,$timeout=0, $rsclass='ADORecordSet_array') + { + $false = false; + $err = false; + $fp = @fopen($url,'rb'); + if (!$fp) { + $err = $url.' file/URL not found'; + return $false; + } + @flock($fp, LOCK_SH); + $arr = array(); + $ttl = 0; + + if ($meta = fgetcsv($fp, 32000, ",")) { + // check if error message + if (strncmp($meta[0],'****',4) === 0) { + $err = trim(substr($meta[0],4,1024)); + fclose($fp); + return $false; + } + // check for meta data + // $meta[0] is -1 means return an empty recordset + // $meta[1] contains a time + + if (strncmp($meta[0], '====',4) === 0) { + + if ($meta[0] == "====-1") { + if (sizeof($meta) < 5) { + $err = "Corrupt first line for format -1"; + fclose($fp); + return $false; + } + fclose($fp); + + if ($timeout > 0) { + $err = " Illegal Timeout $timeout "; + return $false; + } + + $rs = new $rsclass($val=true); + $rs->fields = array(); + $rs->timeCreated = $meta[1]; + $rs->EOF = true; + $rs->_numOfFields = 0; + $rs->sql = urldecode($meta[2]); + $rs->affectedrows = (integer)$meta[3]; + $rs->insertid = $meta[4]; + return $rs; + } + # Under high volume loads, we want only 1 thread/process to _write_file + # so that we don't have 50 processes queueing to write the same data. + # We use probabilistic timeout, ahead of time. + # + # -4 sec before timeout, give processes 1/32 chance of timing out + # -2 sec before timeout, give processes 1/16 chance of timing out + # -1 sec after timeout give processes 1/4 chance of timing out + # +0 sec after timeout, give processes 100% chance of timing out + if (sizeof($meta) > 1) { + if($timeout >0){ + $tdiff = (integer)( $meta[1]+$timeout - time()); + if ($tdiff <= 2) { + switch($tdiff) { + case 4: + case 3: + if ((rand() & 31) == 0) { + fclose($fp); + $err = "Timeout 3"; + return $false; + } + break; + case 2: + if ((rand() & 15) == 0) { + fclose($fp); + $err = "Timeout 2"; + return $false; + } + break; + case 1: + if ((rand() & 3) == 0) { + fclose($fp); + $err = "Timeout 1"; + return $false; + } + break; + default: + fclose($fp); + $err = "Timeout 0"; + return $false; + } // switch + + } // if check flush cache + }// (timeout>0) + $ttl = $meta[1]; + } + //================================================ + // new cache format - use serialize extensively... + if ($meta[0] === '====1') { + // slurp in the data + $MAXSIZE = 128000; + + $text = fread($fp,$MAXSIZE); + if (strlen($text)) { + while ($txt = fread($fp,$MAXSIZE)) { + $text .= $txt; + } + } + fclose($fp); + $rs = unserialize($text); + if (is_object($rs)) $rs->timeCreated = $ttl; + else { + $err = "Unable to unserialize recordset"; + //echo htmlspecialchars($text),' !--END--!

    '; + } + return $rs; + } + + $meta = false; + $meta = fgetcsv($fp, 32000, ","); + if (!$meta) { + fclose($fp); + $err = "Unexpected EOF 1"; + return $false; + } + } + + // Get Column definitions + $flds = array(); + foreach($meta as $o) { + $o2 = explode(':',$o); + if (sizeof($o2)!=3) { + $arr[] = $meta; + $flds = false; + break; + } + $fld = new ADOFieldObject(); + $fld->name = urldecode($o2[0]); + $fld->type = $o2[1]; + $fld->max_length = $o2[2]; + $flds[] = $fld; + } + } else { + fclose($fp); + $err = "Recordset had unexpected EOF 2"; + return $false; + } + + // slurp in the data + $MAXSIZE = 128000; + + $text = ''; + while ($txt = fread($fp,$MAXSIZE)) { + $text .= $txt; + } + + fclose($fp); + @$arr = unserialize($text); + //var_dump($arr); + if (!is_array($arr)) { + $err = "Recordset had unexpected EOF (in serialized recordset)"; + if (get_magic_quotes_runtime()) $err .= ". Magic Quotes Runtime should be disabled!"; + return $false; + } + $rs = new $rsclass(); + $rs->timeCreated = $ttl; + $rs->InitArrayFields($arr,$flds); + return $rs; + } + + + /** + * Save a file $filename and its $contents (normally for caching) with file locking + */ + function adodb_write_file($filename, $contents,$debug=false) + { + # http://www.php.net/bugs.php?id=9203 Bug that flock fails on Windows + # So to simulate locking, we assume that rename is an atomic operation. + # First we delete $filename, then we create a $tempfile write to it and + # rename to the desired $filename. If the rename works, then we successfully + # modified the file exclusively. + # What a stupid need - having to simulate locking. + # Risks: + # 1. $tempfile name is not unique -- very very low + # 2. unlink($filename) fails -- ok, rename will fail + # 3. adodb reads stale file because unlink fails -- ok, $rs timeout occurs + # 4. another process creates $filename between unlink() and rename() -- ok, rename() fails and cache updated + if (strncmp(PHP_OS,'WIN',3) === 0) { + // skip the decimal place + $mtime = substr(str_replace(' ','_',microtime()),2); + // getmypid() actually returns 0 on Win98 - never mind! + $tmpname = $filename.uniqid($mtime).getmypid(); + if (!($fd = @fopen($tmpname,'a'))) return false; + $ok = ftruncate($fd,0); + if (!fwrite($fd,$contents)) $ok = false; + fclose($fd); + chmod($tmpname,0644); + // the tricky moment + @unlink($filename); + if (!@rename($tmpname,$filename)) { + unlink($tmpname); + $ok = false; + } + if (!$ok) { + if ($debug) ADOConnection::outp( " Rename $tmpname ".($ok? 'ok' : 'failed')); + } + return $ok; + } + if (!($fd = @fopen($filename, 'a'))) return false; + if (flock($fd, LOCK_EX) && ftruncate($fd, 0)) { + $ok = fwrite( $fd, $contents ); + fclose($fd); + chmod($filename,0644); + }else { + fclose($fd); + if ($debug)ADOConnection::outp( " Failed acquiring lock for $filename
    \n"); + $ok = false; + } + + return $ok; + } +?> \ No newline at end of file diff --git a/upload/includes/adodb/adodb-datadict.inc.php b/upload/includes/adodb/adodb-datadict.inc.php new file mode 100644 index 00000000..cadea1d8 --- /dev/null +++ b/upload/includes/adodb/adodb-datadict.inc.php @@ -0,0 +1,997 @@ +$str

    "; +$a= Lens_ParseArgs($str); +print "
    ";
    +print_r($a);
    +print "
    "; +} + + +if (!function_exists('ctype_alnum')) { + function ctype_alnum($text) { + return preg_match('/^[a-z0-9]*$/i', $text); + } +} + +//Lens_ParseTest(); + +/** + Parse arguments, treat "text" (text) and 'text' as quotation marks. + To escape, use "" or '' or )) + + Will read in "abc def" sans quotes, as: abc def + Same with 'abc def'. + However if `abc def`, then will read in as `abc def` + + @param endstmtchar Character that indicates end of statement + @param tokenchars Include the following characters in tokens apart from A-Z and 0-9 + @returns 2 dimensional array containing parsed tokens. +*/ +function Lens_ParseArgs($args,$endstmtchar=',',$tokenchars='_.-') +{ + $pos = 0; + $intoken = false; + $stmtno = 0; + $endquote = false; + $tokens = array(); + $tokens[$stmtno] = array(); + $max = strlen($args); + $quoted = false; + $tokarr = array(); + + while ($pos < $max) { + $ch = substr($args,$pos,1); + switch($ch) { + case ' ': + case "\t": + case "\n": + case "\r": + if (!$quoted) { + if ($intoken) { + $intoken = false; + $tokens[$stmtno][] = implode('',$tokarr); + } + break; + } + + $tokarr[] = $ch; + break; + + case '`': + if ($intoken) $tokarr[] = $ch; + case '(': + case ')': + case '"': + case "'": + + if ($intoken) { + if (empty($endquote)) { + $tokens[$stmtno][] = implode('',$tokarr); + if ($ch == '(') $endquote = ')'; + else $endquote = $ch; + $quoted = true; + $intoken = true; + $tokarr = array(); + } else if ($endquote == $ch) { + $ch2 = substr($args,$pos+1,1); + if ($ch2 == $endquote) { + $pos += 1; + $tokarr[] = $ch2; + } else { + $quoted = false; + $intoken = false; + $tokens[$stmtno][] = implode('',$tokarr); + $endquote = ''; + } + } else + $tokarr[] = $ch; + + }else { + + if ($ch == '(') $endquote = ')'; + else $endquote = $ch; + $quoted = true; + $intoken = true; + $tokarr = array(); + if ($ch == '`') $tokarr[] = '`'; + } + break; + + default: + + if (!$intoken) { + if ($ch == $endstmtchar) { + $stmtno += 1; + $tokens[$stmtno] = array(); + break; + } + + $intoken = true; + $quoted = false; + $endquote = false; + $tokarr = array(); + + } + + if ($quoted) $tokarr[] = $ch; + else if (ctype_alnum($ch) || strpos($tokenchars,$ch) !== false) $tokarr[] = $ch; + else { + if ($ch == $endstmtchar) { + $tokens[$stmtno][] = implode('',$tokarr); + $stmtno += 1; + $tokens[$stmtno] = array(); + $intoken = false; + $tokarr = array(); + break; + } + $tokens[$stmtno][] = implode('',$tokarr); + $tokens[$stmtno][] = $ch; + $intoken = false; + } + } + $pos += 1; + } + if ($intoken) $tokens[$stmtno][] = implode('',$tokarr); + + return $tokens; +} + + +class ADODB_DataDict { + var $connection; + var $debug = false; + var $dropTable = 'DROP TABLE %s'; + var $renameTable = 'RENAME TABLE %s TO %s'; + var $dropIndex = 'DROP INDEX %s'; + var $addCol = ' ADD'; + var $alterCol = ' ALTER COLUMN'; + var $dropCol = ' DROP COLUMN'; + var $renameColumn = 'ALTER TABLE %s RENAME COLUMN %s TO %s'; // table, old-column, new-column, column-definitions (not used by default) + var $nameRegex = '\w'; + var $nameRegexBrackets = 'a-zA-Z0-9_\(\)'; + var $schema = false; + var $serverInfo = array(); + var $autoIncrement = false; + var $dataProvider; + var $invalidResizeTypes4 = array('CLOB','BLOB','TEXT','DATE','TIME'); // for changetablesql + var $blobSize = 100; /// any varchar/char field this size or greater is treated as a blob + /// in other words, we use a text area for editting. + + function GetCommentSQL($table,$col) + { + return false; + } + + function SetCommentSQL($table,$col,$cmt) + { + return false; + } + + function MetaTables() + { + if (!$this->connection->IsConnected()) return array(); + return $this->connection->MetaTables(); + } + + function MetaColumns($tab, $upper=true, $schema=false) + { + if (!$this->connection->IsConnected()) return array(); + return $this->connection->MetaColumns($this->TableName($tab), $upper, $schema); + } + + function MetaPrimaryKeys($tab,$owner=false,$intkey=false) + { + if (!$this->connection->IsConnected()) return array(); + return $this->connection->MetaPrimaryKeys($this->TableName($tab), $owner, $intkey); + } + + function MetaIndexes($table, $primary = false, $owner = false) + { + if (!$this->connection->IsConnected()) return array(); + return $this->connection->MetaIndexes($this->TableName($table), $primary, $owner); + } + + + function MetaType($t,$len=-1,$fieldobj=false) + { + static $typeMap = array( + 'VARCHAR' => 'C', + 'VARCHAR2' => 'C', + 'CHAR' => 'C', + 'C' => 'C', + 'STRING' => 'C', + 'NCHAR' => 'C', + 'NVARCHAR' => 'C', + 'VARYING' => 'C', + 'BPCHAR' => 'C', + 'CHARACTER' => 'C', + 'INTERVAL' => 'C', # Postgres + 'MACADDR' => 'C', # postgres + ## + 'LONGCHAR' => 'X', + 'TEXT' => 'X', + 'NTEXT' => 'X', + 'M' => 'X', + 'X' => 'X', + 'CLOB' => 'X', + 'NCLOB' => 'X', + 'LVARCHAR' => 'X', + ## + 'BLOB' => 'B', + 'IMAGE' => 'B', + 'BINARY' => 'B', + 'VARBINARY' => 'B', + 'LONGBINARY' => 'B', + 'B' => 'B', + ## + 'YEAR' => 'D', // mysql + 'DATE' => 'D', + 'D' => 'D', + ## + 'UNIQUEIDENTIFIER' => 'C', # MS SQL Server + ## + 'TIME' => 'T', + 'TIMESTAMP' => 'T', + 'DATETIME' => 'T', + 'TIMESTAMPTZ' => 'T', + 'T' => 'T', + 'TIMESTAMP WITHOUT TIME ZONE' => 'T', // postgresql + ## + 'BOOL' => 'L', + 'BOOLEAN' => 'L', + 'BIT' => 'L', + 'L' => 'L', + ## + 'COUNTER' => 'R', + 'R' => 'R', + 'SERIAL' => 'R', // ifx + 'INT IDENTITY' => 'R', + ## + 'INT' => 'I', + 'INT2' => 'I', + 'INT4' => 'I', + 'INT8' => 'I', + 'INTEGER' => 'I', + 'INTEGER UNSIGNED' => 'I', + 'SHORT' => 'I', + 'TINYINT' => 'I', + 'SMALLINT' => 'I', + 'I' => 'I', + ## + 'LONG' => 'N', // interbase is numeric, oci8 is blob + 'BIGINT' => 'N', // this is bigger than PHP 32-bit integers + 'DECIMAL' => 'N', + 'DEC' => 'N', + 'REAL' => 'N', + 'DOUBLE' => 'N', + 'DOUBLE PRECISION' => 'N', + 'SMALLFLOAT' => 'N', + 'FLOAT' => 'N', + 'NUMBER' => 'N', + 'NUM' => 'N', + 'NUMERIC' => 'N', + 'MONEY' => 'N', + + ## informix 9.2 + 'SQLINT' => 'I', + 'SQLSERIAL' => 'I', + 'SQLSMINT' => 'I', + 'SQLSMFLOAT' => 'N', + 'SQLFLOAT' => 'N', + 'SQLMONEY' => 'N', + 'SQLDECIMAL' => 'N', + 'SQLDATE' => 'D', + 'SQLVCHAR' => 'C', + 'SQLCHAR' => 'C', + 'SQLDTIME' => 'T', + 'SQLINTERVAL' => 'N', + 'SQLBYTES' => 'B', + 'SQLTEXT' => 'X', + ## informix 10 + "SQLINT8" => 'I8', + "SQLSERIAL8" => 'I8', + "SQLNCHAR" => 'C', + "SQLNVCHAR" => 'C', + "SQLLVARCHAR" => 'X', + "SQLBOOL" => 'L' + ); + + if (!$this->connection->IsConnected()) { + $t = strtoupper($t); + if (isset($typeMap[$t])) return $typeMap[$t]; + return 'N'; + } + return $this->connection->MetaType($t,$len,$fieldobj); + } + + function NameQuote($name = NULL,$allowBrackets=false) + { + if (!is_string($name)) { + return FALSE; + } + + $name = trim($name); + + if ( !is_object($this->connection) ) { + return $name; + } + + $quote = $this->connection->nameQuote; + + // if name is of the form `name`, quote it + if ( preg_match('/^`(.+)`$/', $name, $matches) ) { + return $quote . $matches[1] . $quote; + } + + // if name contains special characters, quote it + $regex = ($allowBrackets) ? $this->nameRegexBrackets : $this->nameRegex; + + if ( !preg_match('/^[' . $regex . ']+$/', $name) ) { + return $quote . $name . $quote; + } + + return $name; + } + + function TableName($name) + { + if ( $this->schema ) { + return $this->NameQuote($this->schema) .'.'. $this->NameQuote($name); + } + return $this->NameQuote($name); + } + + // Executes the sql array returned by GetTableSQL and GetIndexSQL + function ExecuteSQLArray($sql, $continueOnError = true) + { + $rez = 2; + $conn = &$this->connection; + $saved = $conn->debug; + foreach($sql as $line) { + + if ($this->debug) $conn->debug = true; + $ok = $conn->Execute($line); + $conn->debug = $saved; + if (!$ok) { + if ($this->debug) ADOConnection::outp($conn->ErrorMsg()); + if (!$continueOnError) return 0; + $rez = 1; + } + } + return $rez; + } + + /** + Returns the actual type given a character code. + + C: varchar + X: CLOB (character large object) or largest varchar size if CLOB is not supported + C2: Multibyte varchar + X2: Multibyte CLOB + + B: BLOB (binary large object) + + D: Date + T: Date-time + L: Integer field suitable for storing booleans (0 or 1) + I: Integer + F: Floating point number + N: Numeric or decimal number + */ + + function ActualType($meta) + { + return $meta; + } + + function CreateDatabase($dbname,$options=false) + { + $options = $this->_Options($options); + $sql = array(); + + $s = 'CREATE DATABASE ' . $this->NameQuote($dbname); + if (isset($options[$this->upperName])) + $s .= ' '.$options[$this->upperName]; + + $sql[] = $s; + return $sql; + } + + /* + Generates the SQL to create index. Returns an array of sql strings. + */ + function CreateIndexSQL($idxname, $tabname, $flds, $idxoptions = false) + { + if (!is_array($flds)) { + $flds = explode(',',$flds); + } + + foreach($flds as $key => $fld) { + # some indexes can use partial fields, eg. index first 32 chars of "name" with NAME(32) + $flds[$key] = $this->NameQuote($fld,$allowBrackets=true); + } + + return $this->_IndexSQL($this->NameQuote($idxname), $this->TableName($tabname), $flds, $this->_Options($idxoptions)); + } + + function DropIndexSQL ($idxname, $tabname = NULL) + { + return array(sprintf($this->dropIndex, $this->NameQuote($idxname), $this->TableName($tabname))); + } + + function SetSchema($schema) + { + $this->schema = $schema; + } + + function AddColumnSQL($tabname, $flds) + { + $tabname = $this->TableName ($tabname); + $sql = array(); + list($lines,$pkey,$idxs) = $this->_GenFields($flds); + // genfields can return FALSE at times + if ($lines == null) $lines = array(); + $alter = 'ALTER TABLE ' . $tabname . $this->addCol . ' '; + foreach($lines as $v) { + $sql[] = $alter . $v; + } + if (is_array($idxs)) { + foreach($idxs as $idx => $idxdef) { + $sql_idxs = $this->CreateIndexSql($idx, $tabname, $idxdef['cols'], $idxdef['opts']); + $sql = array_merge($sql, $sql_idxs); + } + } + return $sql; + } + + /** + * Change the definition of one column + * + * As some DBM's can't do that on there own, you need to supply the complete defintion of the new table, + * to allow, recreating the table and copying the content over to the new table + * @param string $tabname table-name + * @param string $flds column-name and type for the changed column + * @param string $tableflds='' complete defintion of the new table, eg. for postgres, default '' + * @param array/string $tableoptions='' options for the new table see CreateTableSQL, default '' + * @return array with SQL strings + */ + function AlterColumnSQL($tabname, $flds, $tableflds='',$tableoptions='') + { + $tabname = $this->TableName ($tabname); + $sql = array(); + list($lines,$pkey,$idxs) = $this->_GenFields($flds); + // genfields can return FALSE at times + if ($lines == null) $lines = array(); + $alter = 'ALTER TABLE ' . $tabname . $this->alterCol . ' '; + foreach($lines as $v) { + $sql[] = $alter . $v; + } + if (is_array($idxs)) { + foreach($idxs as $idx => $idxdef) { + $sql_idxs = $this->CreateIndexSql($idx, $tabname, $idxdef['cols'], $idxdef['opts']); + $sql = array_merge($sql, $sql_idxs); + } + + } + return $sql; + } + + /** + * Rename one column + * + * Some DBM's can only do this together with changeing the type of the column (even if that stays the same, eg. mysql) + * @param string $tabname table-name + * @param string $oldcolumn column-name to be renamed + * @param string $newcolumn new column-name + * @param string $flds='' complete column-defintion-string like for AddColumnSQL, only used by mysql atm., default='' + * @return array with SQL strings + */ + function RenameColumnSQL($tabname,$oldcolumn,$newcolumn,$flds='') + { + $tabname = $this->TableName ($tabname); + if ($flds) { + list($lines,$pkey,$idxs) = $this->_GenFields($flds); + // genfields can return FALSE at times + if ($lines == null) $lines = array(); + list(,$first) = each($lines); + list(,$column_def) = split("[\t ]+",$first,2); + } + return array(sprintf($this->renameColumn,$tabname,$this->NameQuote($oldcolumn),$this->NameQuote($newcolumn),$column_def)); + } + + /** + * Drop one column + * + * Some DBM's can't do that on there own, you need to supply the complete defintion of the new table, + * to allow, recreating the table and copying the content over to the new table + * @param string $tabname table-name + * @param string $flds column-name and type for the changed column + * @param string $tableflds='' complete defintion of the new table, eg. for postgres, default '' + * @param array/string $tableoptions='' options for the new table see CreateTableSQL, default '' + * @return array with SQL strings + */ + function DropColumnSQL($tabname, $flds, $tableflds='',$tableoptions='') + { + $tabname = $this->TableName ($tabname); + if (!is_array($flds)) $flds = explode(',',$flds); + $sql = array(); + $alter = 'ALTER TABLE ' . $tabname . $this->dropCol . ' '; + foreach($flds as $v) { + $sql[] = $alter . $this->NameQuote($v); + } + return $sql; + } + + function DropTableSQL($tabname) + { + return array (sprintf($this->dropTable, $this->TableName($tabname))); + } + + function RenameTableSQL($tabname,$newname) + { + return array (sprintf($this->renameTable, $this->TableName($tabname),$this->TableName($newname))); + } + + /** + Generate the SQL to create table. Returns an array of sql strings. + */ + function CreateTableSQL($tabname, $flds, $tableoptions=array()) + { + list($lines,$pkey,$idxs) = $this->_GenFields($flds, true); + // genfields can return FALSE at times + if ($lines == null) $lines = array(); + + $taboptions = $this->_Options($tableoptions); + $tabname = $this->TableName ($tabname); + $sql = $this->_TableSQL($tabname,$lines,$pkey,$taboptions); + + // ggiunta - 2006/10/12 - KLUDGE: + // if we are on autoincrement, and table options includes REPLACE, the + // autoincrement sequence has already been dropped on table creation sql, so + // we avoid passing REPLACE to trigger creation code. This prevents + // creating sql that double-drops the sequence + if ($this->autoIncrement && isset($taboptions['REPLACE'])) + unset($taboptions['REPLACE']); + $tsql = $this->_Triggers($tabname,$taboptions); + foreach($tsql as $s) $sql[] = $s; + + if (is_array($idxs)) { + foreach($idxs as $idx => $idxdef) { + $sql_idxs = $this->CreateIndexSql($idx, $tabname, $idxdef['cols'], $idxdef['opts']); + $sql = array_merge($sql, $sql_idxs); + } + } + + return $sql; + } + + function _GenFields($flds,$widespacing=false) + { + if (is_string($flds)) { + $padding = ' '; + $txt = $flds.$padding; + $flds = array(); + $flds0 = Lens_ParseArgs($txt,','); + $hasparam = false; + foreach($flds0 as $f0) { + $f1 = array(); + foreach($f0 as $token) { + switch (strtoupper($token)) { + case 'INDEX': + $f1['INDEX'] = ''; + // fall through intentionally + case 'CONSTRAINT': + case 'DEFAULT': + $hasparam = $token; + break; + default: + if ($hasparam) $f1[$hasparam] = $token; + else $f1[] = $token; + $hasparam = false; + break; + } + } + // 'index' token without a name means single column index: name it after column + if (array_key_exists('INDEX', $f1) && $f1['INDEX'] == '') { + $f1['INDEX'] = isset($f0['NAME']) ? $f0['NAME'] : $f0[0]; + // check if column name used to create an index name was quoted + if (($f1['INDEX'][0] == '"' || $f1['INDEX'][0] == "'" || $f1['INDEX'][0] == "`") && + ($f1['INDEX'][0] == substr($f1['INDEX'], -1))) { + $f1['INDEX'] = $f1['INDEX'][0].'idx_'.substr($f1['INDEX'], 1, -1).$f1['INDEX'][0]; + } + else + $f1['INDEX'] = 'idx_'.$f1['INDEX']; + } + // reset it, so we don't get next field 1st token as INDEX... + $hasparam = false; + + $flds[] = $f1; + + } + } + $this->autoIncrement = false; + $lines = array(); + $pkey = array(); + $idxs = array(); + foreach($flds as $fld) { + $fld = _array_change_key_case($fld); + + $fname = false; + $fdefault = false; + $fautoinc = false; + $ftype = false; + $fsize = false; + $fprec = false; + $fprimary = false; + $fnoquote = false; + $fdefts = false; + $fdefdate = false; + $fconstraint = false; + $fnotnull = false; + $funsigned = false; + $findex = ''; + $funiqueindex = false; + + //----------------- + // Parse attributes + foreach($fld as $attr => $v) { + if ($attr == 2 && is_numeric($v)) $attr = 'SIZE'; + else if (is_numeric($attr) && $attr > 1 && !is_numeric($v)) $attr = strtoupper($v); + + switch($attr) { + case '0': + case 'NAME': $fname = $v; break; + case '1': + case 'TYPE': $ty = $v; $ftype = $this->ActualType(strtoupper($v)); break; + + case 'SIZE': + $dotat = strpos($v,'.'); if ($dotat === false) $dotat = strpos($v,','); + if ($dotat === false) $fsize = $v; + else { + $fsize = substr($v,0,$dotat); + $fprec = substr($v,$dotat+1); + } + break; + case 'UNSIGNED': $funsigned = true; break; + case 'AUTOINCREMENT': + case 'AUTO': $fautoinc = true; $fnotnull = true; break; + case 'KEY': + // a primary key col can be non unique in itself (if key spans many cols...) + case 'PRIMARY': $fprimary = $v; $fnotnull = true; /*$funiqueindex = true;*/ break; + case 'DEF': + case 'DEFAULT': $fdefault = $v; break; + case 'NOTNULL': $fnotnull = $v; break; + case 'NOQUOTE': $fnoquote = $v; break; + case 'DEFDATE': $fdefdate = $v; break; + case 'DEFTIMESTAMP': $fdefts = $v; break; + case 'CONSTRAINT': $fconstraint = $v; break; + // let INDEX keyword create a 'very standard' index on column + case 'INDEX': $findex = $v; break; + case 'UNIQUE': $funiqueindex = true; break; + } //switch + } // foreach $fld + + //-------------------- + // VALIDATE FIELD INFO + if (!strlen($fname)) { + if ($this->debug) ADOConnection::outp("Undefined NAME"); + return false; + } + + $fid = strtoupper(preg_replace('/^`(.+)`$/', '$1', $fname)); + $fname = $this->NameQuote($fname); + + if (!strlen($ftype)) { + if ($this->debug) ADOConnection::outp("Undefined TYPE for field '$fname'"); + return false; + } else { + $ftype = strtoupper($ftype); + } + + $ftype = $this->_GetSize($ftype, $ty, $fsize, $fprec); + + if ($ty == 'X' || $ty == 'X2' || $ty == 'B') $fnotnull = false; // some blob types do not accept nulls + + if ($fprimary) $pkey[] = $fname; + + // some databases do not allow blobs to have defaults + if ($ty == 'X') $fdefault = false; + + // build list of indexes + if ($findex != '') { + if (array_key_exists($findex, $idxs)) { + $idxs[$findex]['cols'][] = ($fname); + if (in_array('UNIQUE', $idxs[$findex]['opts']) != $funiqueindex) { + if ($this->debug) ADOConnection::outp("Index $findex defined once UNIQUE and once not"); + } + if ($funiqueindex && !in_array('UNIQUE', $idxs[$findex]['opts'])) + $idxs[$findex]['opts'][] = 'UNIQUE'; + } + else + { + $idxs[$findex] = array(); + $idxs[$findex]['cols'] = array($fname); + if ($funiqueindex) + $idxs[$findex]['opts'] = array('UNIQUE'); + else + $idxs[$findex]['opts'] = array(); + } + } + + //-------------------- + // CONSTRUCT FIELD SQL + if ($fdefts) { + if (substr($this->connection->databaseType,0,5) == 'mysql') { + $ftype = 'TIMESTAMP'; + } else { + $fdefault = $this->connection->sysTimeStamp; + } + } else if ($fdefdate) { + if (substr($this->connection->databaseType,0,5) == 'mysql') { + $ftype = 'TIMESTAMP'; + } else { + $fdefault = $this->connection->sysDate; + } + } else if ($fdefault !== false && !$fnoquote) { + if ($ty == 'C' or $ty == 'X' or + ( substr($fdefault,0,1) != "'" && !is_numeric($fdefault))) { + + if (($ty == 'D' || $ty == 'T') && strtolower($fdefault) != 'null') { + // convert default date into database-aware code + if ($ty == 'T') + { + $fdefault = $this->connection->DBTimeStamp($fdefault); + } + else + { + $fdefault = $this->connection->DBDate($fdefault); + } + } + else + if (strlen($fdefault) != 1 && substr($fdefault,0,1) == ' ' && substr($fdefault,strlen($fdefault)-1) == ' ') + $fdefault = trim($fdefault); + else if (strtolower($fdefault) != 'null') + $fdefault = $this->connection->qstr($fdefault); + } + } + $suffix = $this->_CreateSuffix($fname,$ftype,$fnotnull,$fdefault,$fautoinc,$fconstraint,$funsigned); + + // add index creation + if ($widespacing) $fname = str_pad($fname,24); + + // check for field names appearing twice + if (array_key_exists($fid, $lines)) { + ADOConnection::outp("Field '$fname' defined twice"); + } + + $lines[$fid] = $fname.' '.$ftype.$suffix; + + if ($fautoinc) $this->autoIncrement = true; + } // foreach $flds + + return array($lines,$pkey,$idxs); + } + + /** + GENERATE THE SIZE PART OF THE DATATYPE + $ftype is the actual type + $ty is the type defined originally in the DDL + */ + function _GetSize($ftype, $ty, $fsize, $fprec) + { + if (strlen($fsize) && $ty != 'X' && $ty != 'B' && strpos($ftype,'(') === false) { + $ftype .= "(".$fsize; + if (strlen($fprec)) $ftype .= ",".$fprec; + $ftype .= ')'; + } + return $ftype; + } + + + // return string must begin with space + function _CreateSuffix($fname,$ftype,$fnotnull,$fdefault,$fautoinc,$fconstraint) + { + $suffix = ''; + if (strlen($fdefault)) $suffix .= " DEFAULT $fdefault"; + if ($fnotnull) $suffix .= ' NOT NULL'; + if ($fconstraint) $suffix .= ' '.$fconstraint; + return $suffix; + } + + function _IndexSQL($idxname, $tabname, $flds, $idxoptions) + { + $sql = array(); + + if ( isset($idxoptions['REPLACE']) || isset($idxoptions['DROP']) ) { + $sql[] = sprintf ($this->dropIndex, $idxname); + if ( isset($idxoptions['DROP']) ) + return $sql; + } + + if ( empty ($flds) ) { + return $sql; + } + + $unique = isset($idxoptions['UNIQUE']) ? ' UNIQUE' : ''; + + $s = 'CREATE' . $unique . ' INDEX ' . $idxname . ' ON ' . $tabname . ' '; + + if ( isset($idxoptions[$this->upperName]) ) + $s .= $idxoptions[$this->upperName]; + + if ( is_array($flds) ) + $flds = implode(', ',$flds); + $s .= '(' . $flds . ')'; + $sql[] = $s; + + return $sql; + } + + function _DropAutoIncrement($tabname) + { + return false; + } + + function _TableSQL($tabname,$lines,$pkey,$tableoptions) + { + $sql = array(); + + if (isset($tableoptions['REPLACE']) || isset ($tableoptions['DROP'])) { + $sql[] = sprintf($this->dropTable,$tabname); + if ($this->autoIncrement) { + $sInc = $this->_DropAutoIncrement($tabname); + if ($sInc) $sql[] = $sInc; + } + if ( isset ($tableoptions['DROP']) ) { + return $sql; + } + } + $s = "CREATE TABLE $tabname (\n"; + $s .= implode(",\n", $lines); + if (sizeof($pkey)>0) { + $s .= ",\n PRIMARY KEY ("; + $s .= implode(", ",$pkey).")"; + } + if (isset($tableoptions['CONSTRAINTS'])) + $s .= "\n".$tableoptions['CONSTRAINTS']; + + if (isset($tableoptions[$this->upperName.'_CONSTRAINTS'])) + $s .= "\n".$tableoptions[$this->upperName.'_CONSTRAINTS']; + + $s .= "\n)"; + if (isset($tableoptions[$this->upperName])) $s .= $tableoptions[$this->upperName]; + $sql[] = $s; + + return $sql; + } + + /** + GENERATE TRIGGERS IF NEEDED + used when table has auto-incrementing field that is emulated using triggers + */ + function _Triggers($tabname,$taboptions) + { + return array(); + } + + /** + Sanitize options, so that array elements with no keys are promoted to keys + */ + function _Options($opts) + { + if (!is_array($opts)) return array(); + $newopts = array(); + foreach($opts as $k => $v) { + if (is_numeric($k)) $newopts[strtoupper($v)] = $v; + else $newopts[strtoupper($k)] = $v; + } + return $newopts; + } + + /** + "Florian Buzin [ easywe ]" + + This function changes/adds new fields to your table. You don't + have to know if the col is new or not. It will check on its own. + */ + function ChangeTableSQL($tablename, $flds, $tableoptions = false) + { + global $ADODB_FETCH_MODE; + + $save = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC; + if ($this->connection->fetchMode !== false) $savem = $this->connection->SetFetchMode(false); + + // check table exists + $save_handler = $this->connection->raiseErrorFn; + $this->connection->raiseErrorFn = ''; + $cols = $this->MetaColumns($tablename); + $this->connection->raiseErrorFn = $save_handler; + + if (isset($savem)) $this->connection->SetFetchMode($savem); + $ADODB_FETCH_MODE = $save; + + if ( empty($cols)) { + return $this->CreateTableSQL($tablename, $flds, $tableoptions); + } + + if (is_array($flds)) { + // Cycle through the update fields, comparing + // existing fields to fields to update. + // if the Metatype and size is exactly the + // same, ignore - by Mark Newham + $holdflds = array(); + foreach($flds as $k=>$v) { + if ( isset($cols[$k]) && is_object($cols[$k]) ) { + // If already not allowing nulls, then don't change + $obj = $cols[$k]; + if (isset($obj->not_null) && $obj->not_null) + $v = str_replace('NOT NULL','',$v); + + $c = $cols[$k]; + $ml = $c->max_length; + $mt = $this->MetaType($c->type,$ml); + if ($ml == -1) $ml = ''; + if ($mt == 'X') $ml = $v['SIZE']; + if (($mt != $v['TYPE']) || $ml != $v['SIZE']) { + $holdflds[$k] = $v; + } + } else { + $holdflds[$k] = $v; + } + } + $flds = $holdflds; + } + + + // already exists, alter table instead + list($lines,$pkey,$idxs) = $this->_GenFields($flds); + // genfields can return FALSE at times + if ($lines == null) $lines = array(); + $alter = 'ALTER TABLE ' . $this->TableName($tablename); + $sql = array(); + + foreach ( $lines as $id => $v ) { + if ( isset($cols[$id]) && is_object($cols[$id]) ) { + + $flds = Lens_ParseArgs($v,','); + + // We are trying to change the size of the field, if not allowed, simply ignore the request. + if ($flds && in_array(strtoupper(substr($flds[0][1],0,4)),$this->invalidResizeTypes4)) { + echo "

    $this->alterCol cannot be changed to $flds currently

    "; + continue; + } + $sql[] = $alter . $this->alterCol . ' ' . $v; + } else { + $sql[] = $alter . $this->addCol . ' ' . $v; + } + } + + return $sql; + } +} // class +?> \ No newline at end of file diff --git a/upload/includes/adodb/adodb-error.inc.php b/upload/includes/adodb/adodb-error.inc.php new file mode 100644 index 00000000..fc8fd004 --- /dev/null +++ b/upload/includes/adodb/adodb-error.inc.php @@ -0,0 +1,258 @@ + DB_ERROR_NOSUCHTABLE, + '/Relation [\"\'].*[\"\'] already exists|Cannot insert a duplicate key into (a )?unique index.*/' => DB_ERROR_ALREADY_EXISTS, + '/divide by zero$/' => DB_ERROR_DIVZERO, + '/pg_atoi: error in .*: can\'t parse /' => DB_ERROR_INVALID_NUMBER, + '/ttribute [\"\'].*[\"\'] not found|Relation [\"\'].*[\"\'] does not have attribute [\"\'].*[\"\']/' => DB_ERROR_NOSUCHFIELD, + '/parser: parse error at or near \"/' => DB_ERROR_SYNTAX, + '/referential integrity violation/' => DB_ERROR_CONSTRAINT, + '/Relation [\"\'].*[\"\'] already exists|Cannot insert a duplicate key into (a )?unique index.*|duplicate key violates unique constraint/' + => DB_ERROR_ALREADY_EXISTS + ); + reset($error_regexps); + while (list($regexp,$code) = each($error_regexps)) { + if (preg_match($regexp, $errormsg)) { + return $code; + } + } + // Fall back to DB_ERROR if there was no mapping. + return DB_ERROR; +} + +function adodb_error_odbc() +{ +static $MAP = array( + '01004' => DB_ERROR_TRUNCATED, + '07001' => DB_ERROR_MISMATCH, + '21S01' => DB_ERROR_MISMATCH, + '21S02' => DB_ERROR_MISMATCH, + '22003' => DB_ERROR_INVALID_NUMBER, + '22008' => DB_ERROR_INVALID_DATE, + '22012' => DB_ERROR_DIVZERO, + '23000' => DB_ERROR_CONSTRAINT, + '24000' => DB_ERROR_INVALID, + '34000' => DB_ERROR_INVALID, + '37000' => DB_ERROR_SYNTAX, + '42000' => DB_ERROR_SYNTAX, + 'IM001' => DB_ERROR_UNSUPPORTED, + 'S0000' => DB_ERROR_NOSUCHTABLE, + 'S0001' => DB_ERROR_NOT_FOUND, + 'S0002' => DB_ERROR_NOSUCHTABLE, + 'S0011' => DB_ERROR_ALREADY_EXISTS, + 'S0012' => DB_ERROR_NOT_FOUND, + 'S0021' => DB_ERROR_ALREADY_EXISTS, + 'S0022' => DB_ERROR_NOT_FOUND, + 'S1000' => DB_ERROR_NOSUCHTABLE, + 'S1009' => DB_ERROR_INVALID, + 'S1090' => DB_ERROR_INVALID, + 'S1C00' => DB_ERROR_NOT_CAPABLE + ); + return $MAP; +} + +function adodb_error_ibase() +{ +static $MAP = array( + -104 => DB_ERROR_SYNTAX, + -150 => DB_ERROR_ACCESS_VIOLATION, + -151 => DB_ERROR_ACCESS_VIOLATION, + -155 => DB_ERROR_NOSUCHTABLE, + -157 => DB_ERROR_NOSUCHFIELD, + -158 => DB_ERROR_VALUE_COUNT_ON_ROW, + -170 => DB_ERROR_MISMATCH, + -171 => DB_ERROR_MISMATCH, + -172 => DB_ERROR_INVALID, + -204 => DB_ERROR_INVALID, + -205 => DB_ERROR_NOSUCHFIELD, + -206 => DB_ERROR_NOSUCHFIELD, + -208 => DB_ERROR_INVALID, + -219 => DB_ERROR_NOSUCHTABLE, + -297 => DB_ERROR_CONSTRAINT, + -530 => DB_ERROR_CONSTRAINT, + -803 => DB_ERROR_CONSTRAINT, + -551 => DB_ERROR_ACCESS_VIOLATION, + -552 => DB_ERROR_ACCESS_VIOLATION, + -922 => DB_ERROR_NOSUCHDB, + -923 => DB_ERROR_CONNECT_FAILED, + -924 => DB_ERROR_CONNECT_FAILED + ); + + return $MAP; +} + +function adodb_error_ifx() +{ +static $MAP = array( + '-201' => DB_ERROR_SYNTAX, + '-206' => DB_ERROR_NOSUCHTABLE, + '-217' => DB_ERROR_NOSUCHFIELD, + '-329' => DB_ERROR_NODBSELECTED, + '-1204' => DB_ERROR_INVALID_DATE, + '-1205' => DB_ERROR_INVALID_DATE, + '-1206' => DB_ERROR_INVALID_DATE, + '-1209' => DB_ERROR_INVALID_DATE, + '-1210' => DB_ERROR_INVALID_DATE, + '-1212' => DB_ERROR_INVALID_DATE + ); + + return $MAP; +} + +function adodb_error_oci8() +{ +static $MAP = array( + 1 => DB_ERROR_ALREADY_EXISTS, + 900 => DB_ERROR_SYNTAX, + 904 => DB_ERROR_NOSUCHFIELD, + 923 => DB_ERROR_SYNTAX, + 942 => DB_ERROR_NOSUCHTABLE, + 955 => DB_ERROR_ALREADY_EXISTS, + 1476 => DB_ERROR_DIVZERO, + 1722 => DB_ERROR_INVALID_NUMBER, + 2289 => DB_ERROR_NOSUCHTABLE, + 2291 => DB_ERROR_CONSTRAINT, + 2449 => DB_ERROR_CONSTRAINT + ); + + return $MAP; +} + +function adodb_error_mssql() +{ +static $MAP = array( + 208 => DB_ERROR_NOSUCHTABLE, + 2601 => DB_ERROR_ALREADY_EXISTS + ); + + return $MAP; +} + +function adodb_error_sqlite() +{ +static $MAP = array( + 1 => DB_ERROR_SYNTAX + ); + + return $MAP; +} + +function adodb_error_mysql() +{ +static $MAP = array( + 1004 => DB_ERROR_CANNOT_CREATE, + 1005 => DB_ERROR_CANNOT_CREATE, + 1006 => DB_ERROR_CANNOT_CREATE, + 1007 => DB_ERROR_ALREADY_EXISTS, + 1008 => DB_ERROR_CANNOT_DROP, + 1045 => DB_ERROR_ACCESS_VIOLATION, + 1046 => DB_ERROR_NODBSELECTED, + 1049 => DB_ERROR_NOSUCHDB, + 1050 => DB_ERROR_ALREADY_EXISTS, + 1051 => DB_ERROR_NOSUCHTABLE, + 1054 => DB_ERROR_NOSUCHFIELD, + 1062 => DB_ERROR_ALREADY_EXISTS, + 1064 => DB_ERROR_SYNTAX, + 1100 => DB_ERROR_NOT_LOCKED, + 1136 => DB_ERROR_VALUE_COUNT_ON_ROW, + 1146 => DB_ERROR_NOSUCHTABLE, + 1048 => DB_ERROR_CONSTRAINT, + 2002 => DB_ERROR_CONNECT_FAILED, + 2005 => DB_ERROR_CONNECT_FAILED + ); + + return $MAP; +} +?> \ No newline at end of file diff --git a/upload/includes/adodb/adodb-errorhandler.inc.php b/upload/includes/adodb/adodb-errorhandler.inc.php new file mode 100644 index 00000000..0eac241a --- /dev/null +++ b/upload/includes/adodb/adodb-errorhandler.inc.php @@ -0,0 +1,79 @@ +$s

    "; + trigger_error($s,ADODB_ERROR_HANDLER_TYPE); +} +?> diff --git a/upload/includes/adodb/adodb-errorpear.inc.php b/upload/includes/adodb/adodb-errorpear.inc.php new file mode 100644 index 00000000..d2f39c4c --- /dev/null +++ b/upload/includes/adodb/adodb-errorpear.inc.php @@ -0,0 +1,88 @@ +!$s

    "; +} + +/** +* Returns last PEAR_Error object. This error might be for an error that +* occured several sql statements ago. +*/ +function &ADODB_PEAR_Error() +{ +global $ADODB_Last_PEAR_Error; + + return $ADODB_Last_PEAR_Error; +} + +?> \ No newline at end of file diff --git a/upload/includes/adodb/adodb-exceptions.inc.php b/upload/includes/adodb/adodb-exceptions.inc.php new file mode 100644 index 00000000..2eb0f84a --- /dev/null +++ b/upload/includes/adodb/adodb-exceptions.inc.php @@ -0,0 +1,82 @@ +sql = $p1; + $this->params = $p2; + $s = "$dbms error: [$errno: $errmsg] in $fn(\"$p1\")\n"; + break; + + case 'PCONNECT': + case 'CONNECT': + $user = $thisConnection->user; + $s = "$dbms error: [$errno: $errmsg] in $fn($p1, '$user', '****', $p2)\n"; + break; + default: + $s = "$dbms error: [$errno: $errmsg] in $fn($p1, $p2)\n"; + break; + } + + $this->dbms = $dbms; + if ($thisConnection) { + $this->host = $thisConnection->host; + $this->database = $thisConnection->database; + } + $this->fn = $fn; + $this->msg = $errmsg; + + if (!is_numeric($errno)) $errno = -1; + parent::__construct($s,$errno); + } +} + +/** +* Default Error Handler. This will be called with the following params +* +* @param $dbms the RDBMS you are connecting to +* @param $fn the name of the calling function (in uppercase) +* @param $errno the native error number from the database +* @param $errmsg the native error msg from the database +* @param $p1 $fn specific parameter - see below +* @param $P2 $fn specific parameter - see below +*/ + +function adodb_throw($dbms, $fn, $errno, $errmsg, $p1, $p2, $thisConnection) +{ +global $ADODB_EXCEPTION; + + if (error_reporting() == 0) return; // obey @ protocol + if (is_string($ADODB_EXCEPTION)) $errfn = $ADODB_EXCEPTION; + else $errfn = 'ADODB_EXCEPTION'; + throw new $errfn($dbms, $fn, $errno, $errmsg, $p1, $p2, $thisConnection); +} + + +?> \ No newline at end of file diff --git a/upload/includes/adodb/adodb-iterator.inc.php b/upload/includes/adodb/adodb-iterator.inc.php new file mode 100644 index 00000000..4cdb821c --- /dev/null +++ b/upload/includes/adodb/adodb-iterator.inc.php @@ -0,0 +1,85 @@ +Execute("select * from adoxyz"); + foreach($rs as $k => $v) { + echo $k; print_r($v); echo "
    "; + } + + + Iterator code based on http://cvs.php.net/cvs.php/php-src/ext/spl/examples/cachingiterator.inc?login=2 + */ + + + class ADODB_Iterator implements Iterator { + + private $rs; + + function __construct($rs) + { + $this->rs = $rs; + } + function rewind() + { + $this->rs->MoveFirst(); + } + + function valid() + { + return !$this->rs->EOF; + } + + function key() + { + return $this->rs->_currentRow; + } + + function current() + { + return $this->rs->fields; + } + + function next() + { + $this->rs->MoveNext(); + } + + function __call($func, $params) + { + return call_user_func_array(array($this->rs, $func), $params); + } + + + function hasMore() + { + return !$this->rs->EOF; + } + +} + + +class ADODB_BASE_RS implements IteratorAggregate { + function getIterator() { + return new ADODB_Iterator($this); + } + + /* this is experimental - i don't really know what to return... */ + function __toString() + { + include_once(ADODB_DIR.'/toexport.inc.php'); + return _adodb_export($this,',',',',false,true); + } +} + + +?> \ No newline at end of file diff --git a/upload/includes/adodb/adodb-lib.inc.php b/upload/includes/adodb/adodb-lib.inc.php new file mode 100644 index 00000000..f752dcf0 --- /dev/null +++ b/upload/includes/adodb/adodb-lib.inc.php @@ -0,0 +1,1174 @@ + sizeof($array)) $max = sizeof($array); + else $max = $probe; + + + for ($j=0;$j < $max; $j++) { + $row =& $array[$j]; + if (!$row) break; + $i = -1; + foreach($row as $v) { + $i += 1; + + if (isset($types[$i]) && $types[$i]=='C') continue; + + //print " ($i ".$types[$i]. "$v) "; + $v = trim($v); + + if (!preg_match('/^[+-]{0,1}[0-9\.]+$/',$v)) { + $types[$i] = 'C'; // once C, always C + + continue; + } + if ($j == 0) { + // If empty string, we presume is character + // test for integer for 1st row only + // after that it is up to testing other rows to prove + // that it is not an integer + if (strlen($v) == 0) $types[$i] = 'C'; + if (strpos($v,'.') !== false) $types[$i] = 'N'; + else $types[$i] = 'I'; + continue; + } + + if (strpos($v,'.') !== false) $types[$i] = 'N'; + + } + } + +} + +function adodb_transpose(&$arr, &$newarr, &$hdr, &$fobjs) +{ + $oldX = sizeof(reset($arr)); + $oldY = sizeof($arr); + + if ($hdr) { + $startx = 1; + $hdr = array('Fields'); + for ($y = 0; $y < $oldY; $y++) { + $hdr[] = $arr[$y][0]; + } + } else + $startx = 0; + + for ($x = $startx; $x < $oldX; $x++) { + if ($fobjs) { + $o = $fobjs[$x]; + $newarr[] = array($o->name); + } else + $newarr[] = array(); + + for ($y = 0; $y < $oldY; $y++) { + $newarr[$x-$startx][] = $arr[$y][$x]; + } + } +} + +// Force key to upper. +// See also http://www.php.net/manual/en/function.array-change-key-case.php +function _array_change_key_case($an_array) +{ + if (is_array($an_array)) { + $new_array = array(); + foreach($an_array as $key=>$value) + $new_array[strtoupper($key)] = $value; + + return $new_array; + } + + return $an_array; +} + +function _adodb_replace(&$zthis, $table, $fieldArray, $keyCol, $autoQuote, $has_autoinc) +{ + if (count($fieldArray) == 0) return 0; + $first = true; + $uSet = ''; + + if (!is_array($keyCol)) { + $keyCol = array($keyCol); + } + foreach($fieldArray as $k => $v) { + if ($v === null) { + $v = 'NULL'; + $fieldArray[$k] = $v; + } else if ($autoQuote && !is_numeric($v) /*and strncmp($v,"'",1) !== 0 -- sql injection risk*/ and strcasecmp($v,$zthis->null2null)!=0) { + $v = $zthis->qstr($v); + $fieldArray[$k] = $v; + } + if (in_array($k,$keyCol)) continue; // skip UPDATE if is key + + if ($first) { + $first = false; + $uSet = "$k=$v"; + } else + $uSet .= ",$k=$v"; + } + + $where = false; + foreach ($keyCol as $v) { + if (isset($fieldArray[$v])) { + if ($where) $where .= ' and '.$v.'='.$fieldArray[$v]; + else $where = $v.'='.$fieldArray[$v]; + } + } + + if ($uSet && $where) { + $update = "UPDATE $table SET $uSet WHERE $where"; + + $rs = $zthis->Execute($update); + + + if ($rs) { + if ($zthis->poorAffectedRows) { + /* + The Select count(*) wipes out any errors that the update would have returned. + http://phplens.com/lens/lensforum/msgs.php?id=5696 + */ + if ($zthis->ErrorNo()<>0) return 0; + + # affected_rows == 0 if update field values identical to old values + # for mysql - which is silly. + + $cnt = $zthis->GetOne("select count(*) from $table where $where"); + if ($cnt > 0) return 1; // record already exists + } else { + if (($zthis->Affected_Rows()>0)) return 1; + } + } else + return 0; + } + + // print "

    Error=".$this->ErrorNo().'

    '; + $first = true; + foreach($fieldArray as $k => $v) { + if ($has_autoinc && in_array($k,$keyCol)) continue; // skip autoinc col + + if ($first) { + $first = false; + $iCols = "$k"; + $iVals = "$v"; + } else { + $iCols .= ",$k"; + $iVals .= ",$v"; + } + } + $insert = "INSERT INTO $table ($iCols) VALUES ($iVals)"; + $rs = $zthis->Execute($insert); + return ($rs) ? 2 : 0; +} + +// Requires $ADODB_FETCH_MODE = ADODB_FETCH_NUM +function _adodb_getmenu(&$zthis, $name,$defstr='',$blank1stItem=true,$multiple=false, + $size=0, $selectAttr='',$compareFields0=true) +{ + $hasvalue = false; + + if ($multiple or is_array($defstr)) { + if ($size==0) $size=5; + $attr = ' multiple size="'.$size.'"'; + if (!strpos($name,'[]')) $name .= '[]'; + } else if ($size) $attr = ' size="'.$size.'"'; + else $attr =''; + + $s = '\n"; +} + +// Requires $ADODB_FETCH_MODE = ADODB_FETCH_NUM +function _adodb_getmenu_gp(&$zthis, $name,$defstr='',$blank1stItem=true,$multiple=false, + $size=0, $selectAttr='',$compareFields0=true) +{ + $hasvalue = false; + + if ($multiple or is_array($defstr)) { + if ($size==0) $size=5; + $attr = ' multiple size="'.$size.'"'; + if (!strpos($name,'[]')) $name .= '[]'; + } else if ($size) $attr = ' size="'.$size.'"'; + else $attr =''; + + $s = '\n"; +} + + +/* + Count the number of records this sql statement will return by using + query rewriting heuristics... + + Does not work with UNIONs, except with postgresql and oracle. + + Usage: + + $conn->Connect(...); + $cnt = _adodb_getcount($conn, $sql); + +*/ +function _adodb_getcount(&$zthis, $sql,$inputarr=false,$secs2cache=0) +{ + $qryRecs = 0; + + if (!empty($zthis->_nestedSQL) || preg_match("/^\s*SELECT\s+DISTINCT/is", $sql) || + preg_match('/\s+GROUP\s+BY\s+/is',$sql) || + preg_match('/\s+UNION\s+/is',$sql)) { + + $rewritesql = adodb_strip_order_by($sql); + + // ok, has SELECT DISTINCT or GROUP BY so see if we can use a table alias + // but this is only supported by oracle and postgresql... + if ($zthis->dataProvider == 'oci8') { + // Allow Oracle hints to be used for query optimization, Chris Wrye + if (preg_match('#/\\*+.*?\\*\\/#', $sql, $hint)) { + $rewritesql = "SELECT ".$hint[0]." COUNT(*) FROM (".$rewritesql.")"; + } else + $rewritesql = "SELECT COUNT(*) FROM (".$rewritesql.")"; + + } else if (strncmp($zthis->databaseType,'postgres',8) == 0) { + $rewritesql = "SELECT COUNT(*) FROM ($rewritesql) _ADODB_ALIAS_"; + } + } else { + // now replace SELECT ... FROM with SELECT COUNT(*) FROM + $rewritesql = preg_replace( + '/^\s*SELECT\s.*\s+FROM\s/Uis','SELECT COUNT(*) FROM ',$sql); + // fix by alexander zhukov, alex#unipack.ru, because count(*) and 'order by' fails + // with mssql, access and postgresql. Also a good speedup optimization - skips sorting! + // also see http://phplens.com/lens/lensforum/msgs.php?id=12752 + $rewritesql = adodb_strip_order_by($rewritesql); + } + + if (isset($rewritesql) && $rewritesql != $sql) { + if (preg_match('/\sLIMIT\s+[0-9]+/i',$sql,$limitarr)) $rewritesql .= $limitarr[0]; + + if ($secs2cache) { + // we only use half the time of secs2cache because the count can quickly + // become inaccurate if new records are added + $qryRecs = $zthis->CacheGetOne($secs2cache/2,$rewritesql,$inputarr); + + } else { + $qryRecs = $zthis->GetOne($rewritesql,$inputarr); + } + if ($qryRecs !== false) return $qryRecs; + } + //-------------------------------------------- + // query rewrite failed - so try slower way... + + + // strip off unneeded ORDER BY if no UNION + if (preg_match('/\s*UNION\s*/is', $sql)) $rewritesql = $sql; + else $rewritesql = $rewritesql = adodb_strip_order_by($sql); + + if (preg_match('/\sLIMIT\s+[0-9]+/i',$sql,$limitarr)) $rewritesql .= $limitarr[0]; + + $rstest = &$zthis->Execute($rewritesql,$inputarr); + if (!$rstest) $rstest = $zthis->Execute($sql,$inputarr); + + if ($rstest) { + $qryRecs = $rstest->RecordCount(); + if ($qryRecs == -1) { + global $ADODB_EXTENSION; + // some databases will return -1 on MoveLast() - change to MoveNext() + if ($ADODB_EXTENSION) { + while(!$rstest->EOF) { + adodb_movenext($rstest); + } + } else { + while(!$rstest->EOF) { + $rstest->MoveNext(); + } + } + $qryRecs = $rstest->_currentRow; + } + $rstest->Close(); + if ($qryRecs == -1) return 0; + } + return $qryRecs; +} + +/* + Code originally from "Cornel G" + + This code might not work with SQL that has UNION in it + + Also if you are using CachePageExecute(), there is a strong possibility that + data will get out of synch. use CachePageExecute() only with tables that + rarely change. +*/ +function &_adodb_pageexecute_all_rows(&$zthis, $sql, $nrows, $page, + $inputarr=false, $secs2cache=0) +{ + $atfirstpage = false; + $atlastpage = false; + $lastpageno=1; + + // If an invalid nrows is supplied, + // we assume a default value of 10 rows per page + if (!isset($nrows) || $nrows <= 0) $nrows = 10; + + $qryRecs = false; //count records for no offset + + $qryRecs = _adodb_getcount($zthis,$sql,$inputarr,$secs2cache); + $lastpageno = (int) ceil($qryRecs / $nrows); + $zthis->_maxRecordCount = $qryRecs; + + + + // ***** Here we check whether $page is the last page or + // whether we are trying to retrieve + // a page number greater than the last page number. + if ($page >= $lastpageno) { + $page = $lastpageno; + $atlastpage = true; + } + + // If page number <= 1, then we are at the first page + if (empty($page) || $page <= 1) { + $page = 1; + $atfirstpage = true; + } + + // We get the data we want + $offset = $nrows * ($page-1); + if ($secs2cache > 0) + $rsreturn = &$zthis->CacheSelectLimit($secs2cache, $sql, $nrows, $offset, $inputarr); + else + $rsreturn = &$zthis->SelectLimit($sql, $nrows, $offset, $inputarr, $secs2cache); + + + // Before returning the RecordSet, we set the pagination properties we need + if ($rsreturn) { + $rsreturn->_maxRecordCount = $qryRecs; + $rsreturn->rowsPerPage = $nrows; + $rsreturn->AbsolutePage($page); + $rsreturn->AtFirstPage($atfirstpage); + $rsreturn->AtLastPage($atlastpage); + $rsreturn->LastPageNo($lastpageno); + } + return $rsreturn; +} + +// Iván Oliva version +function &_adodb_pageexecute_no_last_page(&$zthis, $sql, $nrows, $page, $inputarr=false, $secs2cache=0) +{ + + $atfirstpage = false; + $atlastpage = false; + + if (!isset($page) || $page <= 1) { // If page number <= 1, then we are at the first page + $page = 1; + $atfirstpage = true; + } + if ($nrows <= 0) $nrows = 10; // If an invalid nrows is supplied, we assume a default value of 10 rows per page + + // ***** Here we check whether $page is the last page or whether we are trying to retrieve a page number greater than + // the last page number. + $pagecounter = $page + 1; + $pagecounteroffset = ($pagecounter * $nrows) - $nrows; + if ($secs2cache>0) $rstest = &$zthis->CacheSelectLimit($secs2cache, $sql, $nrows, $pagecounteroffset, $inputarr); + else $rstest = &$zthis->SelectLimit($sql, $nrows, $pagecounteroffset, $inputarr, $secs2cache); + if ($rstest) { + while ($rstest && $rstest->EOF && $pagecounter>0) { + $atlastpage = true; + $pagecounter--; + $pagecounteroffset = $nrows * ($pagecounter - 1); + $rstest->Close(); + if ($secs2cache>0) $rstest = &$zthis->CacheSelectLimit($secs2cache, $sql, $nrows, $pagecounteroffset, $inputarr); + else $rstest = &$zthis->SelectLimit($sql, $nrows, $pagecounteroffset, $inputarr, $secs2cache); + } + if ($rstest) $rstest->Close(); + } + if ($atlastpage) { // If we are at the last page or beyond it, we are going to retrieve it + $page = $pagecounter; + if ($page == 1) $atfirstpage = true; // We have to do this again in case the last page is the same as the first + //... page, that is, the recordset has only 1 page. + } + + // We get the data we want + $offset = $nrows * ($page-1); + if ($secs2cache > 0) $rsreturn = &$zthis->CacheSelectLimit($secs2cache, $sql, $nrows, $offset, $inputarr); + else $rsreturn = &$zthis->SelectLimit($sql, $nrows, $offset, $inputarr, $secs2cache); + + // Before returning the RecordSet, we set the pagination properties we need + if ($rsreturn) { + $rsreturn->rowsPerPage = $nrows; + $rsreturn->AbsolutePage($page); + $rsreturn->AtFirstPage($atfirstpage); + $rsreturn->AtLastPage($atlastpage); + } + return $rsreturn; +} + +function _adodb_getupdatesql(&$zthis,&$rs, $arrFields,$forceUpdate=false,$magicq=false,$force=2) +{ + global $ADODB_QUOTE_FIELDNAMES; + + if (!$rs) { + printf(ADODB_BAD_RS,'GetUpdateSQL'); + return false; + } + + $fieldUpdatedCount = 0; + $arrFields = _array_change_key_case($arrFields); + + $hasnumeric = isset($rs->fields[0]); + $setFields = ''; + + // Loop through all of the fields in the recordset + for ($i=0, $max=$rs->FieldCount(); $i < $max; $i++) { + // Get the field from the recordset + $field = $rs->FetchField($i); + + // If the recordset field is one + // of the fields passed in then process. + $upperfname = strtoupper($field->name); + if (adodb_key_exists($upperfname,$arrFields,$force)) { + + // If the existing field value in the recordset + // is different from the value passed in then + // go ahead and append the field name and new value to + // the update query. + + if ($hasnumeric) $val = $rs->fields[$i]; + else if (isset($rs->fields[$upperfname])) $val = $rs->fields[$upperfname]; + else if (isset($rs->fields[$field->name])) $val = $rs->fields[$field->name]; + else if (isset($rs->fields[strtolower($upperfname)])) $val = $rs->fields[strtolower($upperfname)]; + else $val = ''; + + + if ($forceUpdate || strcmp($val, $arrFields[$upperfname])) { + // Set the counter for the number of fields that will be updated. + $fieldUpdatedCount++; + + // Based on the datatype of the field + // Format the value properly for the database + $type = $rs->MetaType($field->type); + + + if ($type == 'null') { + $type = 'C'; + } + + if ((strpos($upperfname,' ') !== false) || ($ADODB_QUOTE_FIELDNAMES)) + $fnameq = $zthis->nameQuote.$upperfname.$zthis->nameQuote; + else + $fnameq = $upperfname; + + + // is_null requires php 4.0.4 + //********************************************************// + if (is_null($arrFields[$upperfname]) + || (empty($arrFields[$upperfname]) && strlen($arrFields[$upperfname]) == 0) + || $arrFields[$upperfname] === $zthis->null2null + ) + { + switch ($force) { + + //case 0: + // //Ignore empty values. This is allready handled in "adodb_key_exists" function. + //break; + + case 1: + //Set null + $setFields .= $field->name . " = null, "; + break; + + case 2: + //Set empty + $arrFields[$upperfname] = ""; + $setFields .= _adodb_column_sql($zthis, 'U', $type, $upperfname, $fnameq,$arrFields, $magicq); + break; + default: + case 3: + //Set the value that was given in array, so you can give both null and empty values + if (is_null($arrFields[$upperfname]) || $arrFields[$upperfname] === $zthis->null2null) { + $setFields .= $field->name . " = null, "; + } else { + $setFields .= _adodb_column_sql($zthis, 'U', $type, $upperfname, $fnameq,$arrFields, $magicq); + } + break; + } + //********************************************************// + } else { + //we do this so each driver can customize the sql for + //DB specific column types. + //Oracle needs BLOB types to be handled with a returning clause + //postgres has special needs as well + $setFields .= _adodb_column_sql($zthis, 'U', $type, $upperfname, $fnameq, + $arrFields, $magicq); + } + } + } + } + + // If there were any modified fields then build the rest of the update query. + if ($fieldUpdatedCount > 0 || $forceUpdate) { + // Get the table name from the existing query. + if (!empty($rs->tableName)) $tableName = $rs->tableName; + else { + preg_match("/FROM\s+".ADODB_TABLE_REGEX."/is", $rs->sql, $tableName); + $tableName = $tableName[1]; + } + // Get the full where clause excluding the word "WHERE" from + // the existing query. + preg_match('/\sWHERE\s(.*)/is', $rs->sql, $whereClause); + + $discard = false; + // not a good hack, improvements? + if ($whereClause) { + #var_dump($whereClause); + if (preg_match('/\s(ORDER\s.*)/is', $whereClause[1], $discard)); + else if (preg_match('/\s(LIMIT\s.*)/is', $whereClause[1], $discard)); + else if (preg_match('/\s(FOR UPDATE.*)/is', $whereClause[1], $discard)); + else preg_match('/\s.*(\) WHERE .*)/is', $whereClause[1], $discard); # see http://sourceforge.net/tracker/index.php?func=detail&aid=1379638&group_id=42718&atid=433976 + } else + $whereClause = array(false,false); + + if ($discard) + $whereClause[1] = substr($whereClause[1], 0, strlen($whereClause[1]) - strlen($discard[1])); + + $sql = 'UPDATE '.$tableName.' SET '.substr($setFields, 0, -2); + if (strlen($whereClause[1]) > 0) + $sql .= ' WHERE '.$whereClause[1]; + + return $sql; + + } else { + return false; + } +} + +function adodb_key_exists($key, &$arr,$force=2) +{ + if ($force<=0) { + // the following is the old behaviour where null or empty fields are ignored + return (!empty($arr[$key])) || (isset($arr[$key]) && strlen($arr[$key])>0); + } + + if (isset($arr[$key])) return true; + ## null check below + if (ADODB_PHPVER >= 0x4010) return array_key_exists($key,$arr); + return false; +} + +/** + * There is a special case of this function for the oci8 driver. + * The proper way to handle an insert w/ a blob in oracle requires + * a returning clause with bind variables and a descriptor blob. + * + * + */ +function _adodb_getinsertsql(&$zthis,&$rs,$arrFields,$magicq=false,$force=2) +{ +static $cacheRS = false; +static $cacheSig = 0; +static $cacheCols; + global $ADODB_QUOTE_FIELDNAMES; + + $tableName = ''; + $values = ''; + $fields = ''; + $recordSet = null; + $arrFields = _array_change_key_case($arrFields); + $fieldInsertedCount = 0; + + if (is_string($rs)) { + //ok we have a table name + //try and get the column info ourself. + $tableName = $rs; + + //we need an object for the recordSet + //because we have to call MetaType. + //php can't do a $rsclass::MetaType() + $rsclass = $zthis->rsPrefix.$zthis->databaseType; + $recordSet = new $rsclass(-1,$zthis->fetchMode); + $recordSet->connection = &$zthis; + + if (is_string($cacheRS) && $cacheRS == $rs) { + $columns =& $cacheCols; + } else { + $columns = $zthis->MetaColumns( $tableName ); + $cacheRS = $tableName; + $cacheCols = $columns; + } + } else if (is_subclass_of($rs, 'adorecordset')) { + if (isset($rs->insertSig) && is_integer($cacheRS) && $cacheRS == $rs->insertSig) { + $columns =& $cacheCols; + } else { + for ($i=0, $max=$rs->FieldCount(); $i < $max; $i++) + $columns[] = $rs->FetchField($i); + $cacheRS = $cacheSig; + $cacheCols = $columns; + $rs->insertSig = $cacheSig++; + } + $recordSet =& $rs; + + } else { + printf(ADODB_BAD_RS,'GetInsertSQL'); + return false; + } + + // Loop through all of the fields in the recordset + foreach( $columns as $field ) { + $upperfname = strtoupper($field->name); + if (adodb_key_exists($upperfname,$arrFields,$force)) { + $bad = false; + if ((strpos($upperfname,' ') !== false) || ($ADODB_QUOTE_FIELDNAMES)) + $fnameq = $zthis->nameQuote.$upperfname.$zthis->nameQuote; + else + $fnameq = $upperfname; + + $type = $recordSet->MetaType($field->type); + + /********************************************************/ + if (is_null($arrFields[$upperfname]) + || (empty($arrFields[$upperfname]) && strlen($arrFields[$upperfname]) == 0) + || $arrFields[$upperfname] === $zthis->null2null + ) + { + switch ($force) { + + case 0: // we must always set null if missing + $bad = true; + break; + + case 1: + $values .= "null, "; + break; + + case 2: + //Set empty + $arrFields[$upperfname] = ""; + $values .= _adodb_column_sql($zthis, 'I', $type, $upperfname, $fnameq,$arrFields, $magicq); + break; + + default: + case 3: + //Set the value that was given in array, so you can give both null and empty values + if (is_null($arrFields[$upperfname]) || $arrFields[$upperfname] === $zthis->null2null) { + $values .= "null, "; + } else { + $values .= _adodb_column_sql($zthis, 'I', $type, $upperfname, $fnameq, $arrFields, $magicq); + } + break; + } // switch + + /*********************************************************/ + } else { + //we do this so each driver can customize the sql for + //DB specific column types. + //Oracle needs BLOB types to be handled with a returning clause + //postgres has special needs as well + $values .= _adodb_column_sql($zthis, 'I', $type, $upperfname, $fnameq, + $arrFields, $magicq); + } + + if ($bad) continue; + // Set the counter for the number of fields that will be inserted. + $fieldInsertedCount++; + + + // Get the name of the fields to insert + $fields .= $fnameq . ", "; + } + } + + + // If there were any inserted fields then build the rest of the insert query. + if ($fieldInsertedCount <= 0) return false; + + // Get the table name from the existing query. + if (!$tableName) { + if (!empty($rs->tableName)) $tableName = $rs->tableName; + else if (preg_match("/FROM\s+".ADODB_TABLE_REGEX."/is", $rs->sql, $tableName)) + $tableName = $tableName[1]; + else + return false; + } + + // Strip off the comma and space on the end of both the fields + // and their values. + $fields = substr($fields, 0, -2); + $values = substr($values, 0, -2); + + // Append the fields and their values to the insert query. + return 'INSERT INTO '.$tableName.' ( '.$fields.' ) VALUES ( '.$values.' )'; +} + + +/** + * This private method is used to help construct + * the update/sql which is generated by GetInsertSQL and GetUpdateSQL. + * It handles the string construction of 1 column -> sql string based on + * the column type. We want to do 'safe' handling of BLOBs + * + * @param string the type of sql we are trying to create + * 'I' or 'U'. + * @param string column data type from the db::MetaType() method + * @param string the column name + * @param array the column value + * + * @return string + * + */ +function _adodb_column_sql_oci8(&$zthis,$action, $type, $fname, $fnameq, $arrFields, $magicq) +{ + $sql = ''; + + // Based on the datatype of the field + // Format the value properly for the database + switch($type) { + case 'B': + //in order to handle Blobs correctly, we need + //to do some magic for Oracle + + //we need to create a new descriptor to handle + //this properly + if (!empty($zthis->hasReturningInto)) { + if ($action == 'I') { + $sql = 'empty_blob(), '; + } else { + $sql = $fnameq. '=empty_blob(), '; + } + //add the variable to the returning clause array + //so the user can build this later in + //case they want to add more to it + $zthis->_returningArray[$fname] = ':xx'.$fname.'xx'; + } else if (empty($arrFields[$fname])){ + if ($action == 'I') { + $sql = 'empty_blob(), '; + } else { + $sql = $fnameq. '=empty_blob(), '; + } + } else { + //this is to maintain compatibility + //with older adodb versions. + $sql = _adodb_column_sql($zthis, $action, $type, $fname, $fnameq, $arrFields, $magicq,false); + } + break; + + case "X": + //we need to do some more magic here for long variables + //to handle these correctly in oracle. + + //create a safe bind var name + //to avoid conflicts w/ dupes. + if (!empty($zthis->hasReturningInto)) { + if ($action == 'I') { + $sql = ':xx'.$fname.'xx, '; + } else { + $sql = $fnameq.'=:xx'.$fname.'xx, '; + } + //add the variable to the returning clause array + //so the user can build this later in + //case they want to add more to it + $zthis->_returningArray[$fname] = ':xx'.$fname.'xx'; + } else { + //this is to maintain compatibility + //with older adodb versions. + $sql = _adodb_column_sql($zthis, $action, $type, $fname, $fnameq, $arrFields, $magicq,false); + } + break; + + default: + $sql = _adodb_column_sql($zthis, $action, $type, $fname, $fnameq, $arrFields, $magicq,false); + break; + } + + return $sql; +} + +function _adodb_column_sql(&$zthis, $action, $type, $fname, $fnameq, $arrFields, $magicq, $recurse=true) +{ + + if ($recurse) { + switch($zthis->dataProvider) { + case 'postgres': + if ($type == 'L') $type = 'C'; + break; + case 'oci8': + return _adodb_column_sql_oci8($zthis, $action, $type, $fname, $fnameq, $arrFields, $magicq); + + } + } + + switch($type) { + case "C": + case "X": + case 'B': + $val = $zthis->qstr($arrFields[$fname],$magicq); + break; + + case "D": + $val = $zthis->DBDate($arrFields[$fname]); + break; + + + case "T": + $val = $zthis->DBTimeStamp($arrFields[$fname]); + break; + + case "N": + $val = $arrFields[$fname]; + if (!is_numeric($val)) $val = str_replace(',', '.', (float)$val); + break; + + case "I": + case "R": + $val = $arrFields[$fname]; + if (!is_numeric($val)) $val = (integer) $val; + break; + + default: + $val = str_replace(array("'"," ","("),"",$arrFields[$fname]); // basic sql injection defence + if (empty($val)) $val = '0'; + break; + } + + if ($action == 'I') return $val . ", "; + + + return $fnameq . "=" . $val . ", "; + +} + + + +function _adodb_debug_execute(&$zthis, $sql, $inputarr) +{ + $ss = ''; + if ($inputarr) { + foreach($inputarr as $kk=>$vv) { + if (is_string($vv) && strlen($vv)>64) $vv = substr($vv,0,64).'...'; + if (is_null($vv)) $ss .= "($kk=>null) "; + else $ss .= "($kk=>'$vv') "; + } + $ss = "[ $ss ]"; + } + $sqlTxt = is_array($sql) ? $sql[0] : $sql; + /*str_replace(', ','##1#__^LF',is_array($sql) ? $sql[0] : $sql); + $sqlTxt = str_replace(',',', ',$sqlTxt); + $sqlTxt = str_replace('##1#__^LF', ', ' ,$sqlTxt); + */ + // check if running from browser or command-line + $inBrowser = isset($_SERVER['HTTP_USER_AGENT']); + + $dbt = $zthis->databaseType; + if (isset($zthis->dsnType)) $dbt .= '-'.$zthis->dsnType; + if ($inBrowser) { + if ($ss) { + $ss = ''.htmlspecialchars($ss).''; + } + if ($zthis->debug === -1) + ADOConnection::outp( "
    \n($dbt): ".htmlspecialchars($sqlTxt)."   $ss\n
    \n",false); + else + ADOConnection::outp( "


    \n($dbt): ".htmlspecialchars($sqlTxt)."   $ss\n
    \n",false); + } else { + ADOConnection::outp("-----\n($dbt): ".$sqlTxt."\n-----\n",false); + } + + $qID = $zthis->_query($sql,$inputarr); + + /* + Alexios Fakios notes that ErrorMsg() must be called before ErrorNo() for mssql + because ErrorNo() calls Execute('SELECT @ERROR'), causing recursion + */ + if ($zthis->databaseType == 'mssql') { + // ErrorNo is a slow function call in mssql, and not reliable in PHP 4.0.6 + if($emsg = $zthis->ErrorMsg()) { + if ($err = $zthis->ErrorNo()) ADOConnection::outp($err.': '.$emsg); + } + } else if (!$qID) { + ADOConnection::outp($zthis->ErrorNo() .': '. $zthis->ErrorMsg()); + } + + if ($zthis->debug === 99) _adodb_backtrace(true,9999,2); + return $qID; +} + +# pretty print the debug_backtrace function +function _adodb_backtrace($printOrArr=true,$levels=9999,$skippy=0) +{ + if (!function_exists('debug_backtrace')) return ''; + + $html = (isset($_SERVER['HTTP_USER_AGENT'])); + $fmt = ($html) ? " %% line %4d, file: %s" : "%% line %4d, file: %s"; + + $MAXSTRLEN = 128; + + $s = ($html) ? '
    ' : '';
    +	
    +	if (is_array($printOrArr)) $traceArr = $printOrArr;
    +	else $traceArr = debug_backtrace();
    +	array_shift($traceArr);
    +	array_shift($traceArr);
    +	$tabs = sizeof($traceArr)-2;
    +	
    +	foreach ($traceArr as $arr) {
    +		if ($skippy) {$skippy -= 1; continue;}
    +		$levels -= 1;
    +		if ($levels < 0) break;
    +		
    +		$args = array();
    +		for ($i=0; $i < $tabs; $i++) $s .=  ($html) ? '   ' : "\t";
    +		$tabs -= 1;
    +		if ($html) $s .= '';
    +		if (isset($arr['class'])) $s .= $arr['class'].'.';
    +		if (isset($arr['args']))
    +		 foreach($arr['args'] as $v) {
    +			if (is_null($v)) $args[] = 'null';
    +			else if (is_array($v)) $args[] = 'Array['.sizeof($v).']';
    +			else if (is_object($v)) $args[] = 'Object:'.get_class($v);
    +			else if (is_bool($v)) $args[] = $v ? 'true' : 'false';
    +			else {
    +				$v = (string) @$v;
    +				$str = htmlspecialchars(substr($v,0,$MAXSTRLEN));
    +				if (strlen($v) > $MAXSTRLEN) $str .= '...';
    +				$args[] = $str;
    +			}
    +		}
    +		$s .= $arr['function'].'('.implode(', ',$args).')';
    +		
    +		
    +		$s .= @sprintf($fmt, $arr['line'],$arr['file'],basename($arr['file']));
    +			
    +		$s .= "\n";
    +	}	
    +	if ($html) $s .= '
    '; + if ($printOrArr) print $s; + + return $s; +} +/* +function _adodb_find_from($sql) +{ + + $sql = str_replace(array("\n","\r"), ' ', $sql); + $charCount = strlen($sql); + + $inString = false; + $quote = ''; + $parentheseCount = 0; + $prevChars = ''; + $nextChars = ''; + + + for($i = 0; $i < $charCount; $i++) { + + $char = substr($sql,$i,1); + $prevChars = substr($sql,0,$i); + $nextChars = substr($sql,$i+1); + + if((($char == "'" || $char == '"' || $char == '`') && substr($prevChars,-1,1) != '\\') && $inString === false) { + $quote = $char; + $inString = true; + } + + elseif((($char == "'" || $char == '"' || $char == '`') && substr($prevChars,-1,1) != '\\') && $inString === true && $quote == $char) { + $quote = ""; + $inString = false; + } + + elseif($char == "(" && $inString === false) + $parentheseCount++; + + elseif($char == ")" && $inString === false && $parentheseCount > 0) + $parentheseCount--; + + elseif($parentheseCount <= 0 && $inString === false && $char == " " && strtoupper(substr($prevChars,-5,5)) == " FROM") + return $i; + + } +} +*/ + +?> \ No newline at end of file diff --git a/upload/includes/adodb/adodb-memcache.lib.inc.php b/upload/includes/adodb/adodb-memcache.lib.inc.php new file mode 100644 index 00000000..bc6b420b --- /dev/null +++ b/upload/includes/adodb/adodb-memcache.lib.inc.php @@ -0,0 +1,118 @@ +pconnect($host, $port)) { + $err = 'Can\'t connect to memcache server on: '.$host.':'.$port; + return $false; + } + + $rs = $memcache->get($key); + if (!$rs) { + $err = 'Item with such key doesn\'t exists on the memcached server.'; + return $false; + } + + $tdiff = intval($rs->timeCreated+$timeout - time()); + if ($tdiff <= 2) { + switch($tdiff) { + case 2: + if ((rand() & 15) == 0) { + $err = "Timeout 2"; + return $false; + } + break; + case 1: + if ((rand() & 3) == 0) { + $err = "Timeout 1"; + return $false; + } + break; + default: + $err = "Timeout 0"; + return $false; + } + } + return $rs; + } + + function putmemcache($key, $rs, $host, $port, $compress, $debug=false) + { + $false = false; + $true = true; + + if (!function_exists('memcache_pconnect')) { + if ($debug) ADOConnection::outp(" Memcache module PECL extension not found!
    \n"); + return $false; + } + + $memcache = new Memcache; + if (!@$memcache->pconnect($host, $port)) { + if ($debug) ADOConnection::outp(" Can't connect to memcache server on: $host:$port
    \n"); + return $false; + } + + $rs->timeCreated = time(); + if (!$memcache->set($key, $rs, $compress, 0)) { + if ($debug) ADOConnection::outp(" Failed to save data at the memcached server!
    \n"); + return $false; + } + return $true; + } + + function flushmemcache($key=false, $host, $port, $debug=false) + { + if (!function_exists('memcache_pconnect')) { + if ($debug) ADOConnection::outp(" Memcache module PECL extension not found!
    \n"); + return; + } + + $memcache = new Memcache; + if (!@$memcache->pconnect($host, $port)) { + if ($debug) ADOConnection::outp(" Can't connect to memcache server on: $host:$port
    \n"); + return; + } + + if ($key) { + if (!$memcache->delete($key)) { + if ($debug) ADOConnection::outp("CacheFlush: $key entery doesn't exist on memcached server!
    \n"); + } else { + if ($debug) ADOConnection::outp("CacheFlush: $key entery flushed from memcached server!
    \n"); + } + } else { + if (!$memcache->flush()) { + if ($debug) ADOConnection::outp("CacheFlush: Failure flushing all enteries from memcached server!
    \n"); + } else { + if ($debug) ADOConnection::outp("CacheFlush: All enteries flushed from memcached server!
    \n"); + } + } + return; + } +?> diff --git a/upload/includes/adodb/adodb-pager.inc.php b/upload/includes/adodb/adodb-pager.inc.php new file mode 100644 index 00000000..cefadac8 --- /dev/null +++ b/upload/includes/adodb/adodb-pager.inc.php @@ -0,0 +1,290 @@ + implemented Render_PageLinks(). + + Please note, this class is entirely unsupported, + and no free support requests except for bug reports + will be entertained by the author. + +*/ +class ADODB_Pager { + var $id; // unique id for pager (defaults to 'adodb') + var $db; // ADODB connection object + var $sql; // sql used + var $rs; // recordset generated + var $curr_page; // current page number before Render() called, calculated in constructor + var $rows; // number of rows per page + var $linksPerPage=10; // number of links per page in navigation bar + var $showPageLinks; + + var $gridAttributes = 'width=100% border=1 bgcolor=white'; + + // Localize text strings here + var $first = '|<'; + var $prev = '<<'; + var $next = '>>'; + var $last = '>|'; + var $moreLinks = '...'; + var $startLinks = '...'; + var $gridHeader = false; + var $htmlSpecialChars = true; + var $page = 'Page'; + var $linkSelectedColor = 'red'; + var $cache = 0; #secs to cache with CachePageExecute() + + //---------------------------------------------- + // constructor + // + // $db adodb connection object + // $sql sql statement + // $id optional id to identify which pager, + // if you have multiple on 1 page. + // $id should be only be [a-z0-9]* + // + function ADODB_Pager(&$db,$sql,$id = 'adodb', $showPageLinks = false) + { + global $PHP_SELF; + + $curr_page = $id.'_curr_page'; + if (empty($PHP_SELF)) $PHP_SELF = htmlspecialchars($_SERVER['PHP_SELF']); // htmlspecialchars() to prevent XSS attacks + + $this->sql = $sql; + $this->id = $id; + $this->db = $db; + $this->showPageLinks = $showPageLinks; + + $next_page = $id.'_next_page'; + + if (isset($_GET[$next_page])) { + $_SESSION[$curr_page] = (integer) $_GET[$next_page]; + } + if (empty($_SESSION[$curr_page])) $_SESSION[$curr_page] = 1; ## at first page + + $this->curr_page = $_SESSION[$curr_page]; + + } + + //--------------------------- + // Display link to first page + function Render_First($anchor=true) + { + global $PHP_SELF; + if ($anchor) { + ?> + first;?>   + first   "; + } + } + + //-------------------------- + // Display link to next page + function render_next($anchor=true) + { + global $PHP_SELF; + + if ($anchor) { + ?> + next;?>   + next   "; + } + } + + //------------------ + // Link to last page + // + // for better performance with large recordsets, you can set + // $this->db->pageExecuteCountRows = false, which disables + // last page counting. + function render_last($anchor=true) + { + global $PHP_SELF; + + if (!$this->db->pageExecuteCountRows) return; + + if ($anchor) { + ?> + last;?>   + last   "; + } + } + + //--------------------------------------------------- + // original code by "Pablo Costa" + function render_pagelinks() + { + global $PHP_SELF; + $pages = $this->rs->LastPageNo(); + $linksperpage = $this->linksPerPage ? $this->linksPerPage : $pages; + for($i=1; $i <= $pages; $i+=$linksperpage) + { + if($this->rs->AbsolutePage() >= $i) + { + $start = $i; + } + } + $numbers = ''; + $end = $start+$linksperpage-1; + $link = $this->id . "_next_page"; + if($end > $pages) $end = $pages; + + + if ($this->startLinks && $start > 1) { + $pos = $start - 1; + $numbers .= "$this->startLinks "; + } + + for($i=$start; $i <= $end; $i++) { + if ($this->rs->AbsolutePage() == $i) + $numbers .= "linkSelectedColor>$i "; + else + $numbers .= "$i "; + + } + if ($this->moreLinks && $end < $pages) + $numbers .= "$this->moreLinks "; + print $numbers . '   '; + } + // Link to previous page + function render_prev($anchor=true) + { + global $PHP_SELF; + if ($anchor) { + ?> + prev;?>   + prev   "; + } + } + + //-------------------------------------------------------- + // Simply rendering of grid. You should override this for + // better control over the format of the grid + // + // We use output buffering to keep code clean and readable. + function RenderGrid() + { + global $gSQLBlockRows; // used by rs2html to indicate how many rows to display + include_once(ADODB_DIR.'/tohtml.inc.php'); + ob_start(); + $gSQLBlockRows = $this->rows; + rs2html($this->rs,$this->gridAttributes,$this->gridHeader,$this->htmlSpecialChars); + $s = ob_get_contents(); + ob_end_clean(); + return $s; + } + + //------------------------------------------------------- + // Navigation bar + // + // we use output buffering to keep the code easy to read. + function RenderNav() + { + ob_start(); + if (!$this->rs->AtFirstPage()) { + $this->Render_First(); + $this->Render_Prev(); + } else { + $this->Render_First(false); + $this->Render_Prev(false); + } + if ($this->showPageLinks){ + $this->Render_PageLinks(); + } + if (!$this->rs->AtLastPage()) { + $this->Render_Next(); + $this->Render_Last(); + } else { + $this->Render_Next(false); + $this->Render_Last(false); + } + $s = ob_get_contents(); + ob_end_clean(); + return $s; + } + + //------------------- + // This is the footer + function RenderPageCount() + { + if (!$this->db->pageExecuteCountRows) return ''; + $lastPage = $this->rs->LastPageNo(); + if ($lastPage == -1) $lastPage = 1; // check for empty rs. + if ($this->curr_page > $lastPage) $this->curr_page = 1; + return "$this->page ".$this->curr_page."/".$lastPage.""; + } + + //----------------------------------- + // Call this class to draw everything. + function Render($rows=10) + { + global $ADODB_COUNTRECS; + + $this->rows = $rows; + + if ($this->db->dataProvider == 'informix') $this->db->cursorType = IFX_SCROLL; + + $savec = $ADODB_COUNTRECS; + if ($this->db->pageExecuteCountRows) $ADODB_COUNTRECS = true; + if ($this->cache) + $rs = &$this->db->CachePageExecute($this->cache,$this->sql,$rows,$this->curr_page); + else + $rs = &$this->db->PageExecute($this->sql,$rows,$this->curr_page); + $ADODB_COUNTRECS = $savec; + + $this->rs = &$rs; + if (!$rs) { + print "

    Query failed: $this->sql

    "; + return; + } + + if (!$rs->EOF && (!$rs->AtFirstPage() || !$rs->AtLastPage())) + $header = $this->RenderNav(); + else + $header = " "; + + $grid = $this->RenderGrid(); + $footer = $this->RenderPageCount(); + + $this->RenderLayout($header,$grid,$footer); + + $rs->Close(); + $this->rs = false; + } + + //------------------------------------------------------ + // override this to control overall layout and formating + function RenderLayout($header,$grid,$footer,$attributes='border=1 bgcolor=beige') + { + echo "
    ", + $header, + "
    ", + $grid, + "
    ", + $footer, + "
    "; + } +} + + +?> \ No newline at end of file diff --git a/upload/includes/adodb/adodb-pear.inc.php b/upload/includes/adodb/adodb-pear.inc.php new file mode 100644 index 00000000..7edee370 --- /dev/null +++ b/upload/includes/adodb/adodb-pear.inc.php @@ -0,0 +1,374 @@ + | + * and Tomas V.V.Cox . Portions (c)1997-2002 The PHP Group. + */ + + /* + We support: + + DB_Common + --------- + query - returns PEAR_Error on error + limitQuery - return PEAR_Error on error + prepare - does not return PEAR_Error on error + execute - does not return PEAR_Error on error + setFetchMode - supports ASSOC and ORDERED + errorNative + quote + nextID + disconnect + + getOne + getAssoc + getRow + getCol + getAll + + DB_Result + --------- + numRows - returns -1 if not supported + numCols + fetchInto - does not support passing of fetchmode + fetchRows - does not support passing of fetchmode + free + */ + +define('ADODB_PEAR',dirname(__FILE__)); +include_once "PEAR.php"; +include_once ADODB_PEAR."/adodb-errorpear.inc.php"; +include_once ADODB_PEAR."/adodb.inc.php"; + +if (!defined('DB_OK')) { +define("DB_OK", 1); +define("DB_ERROR",-1); + +// autoExecute constants +define('DB_AUTOQUERY_INSERT', 1); +define('DB_AUTOQUERY_UPDATE', 2); + +/** + * This is a special constant that tells DB the user hasn't specified + * any particular get mode, so the default should be used. + */ + +define('DB_FETCHMODE_DEFAULT', 0); + +/** + * Column data indexed by numbers, ordered from 0 and up + */ + +define('DB_FETCHMODE_ORDERED', 1); + +/** + * Column data indexed by column names + */ + +define('DB_FETCHMODE_ASSOC', 2); + +/* for compatibility */ + +define('DB_GETMODE_ORDERED', DB_FETCHMODE_ORDERED); +define('DB_GETMODE_ASSOC', DB_FETCHMODE_ASSOC); + +/** + * these are constants for the tableInfo-function + * they are bitwised or'ed. so if there are more constants to be defined + * in the future, adjust DB_TABLEINFO_FULL accordingly + */ + +define('DB_TABLEINFO_ORDER', 1); +define('DB_TABLEINFO_ORDERTABLE', 2); +define('DB_TABLEINFO_FULL', 3); +} + +/** + * The main "DB" class is simply a container class with some static + * methods for creating DB objects as well as some utility functions + * common to all parts of DB. + * + */ + +class DB +{ + /** + * Create a new DB object for the specified database type + * + * @param $type string database type, for example "mysql" + * + * @return object a newly created DB object, or a DB error code on + * error + */ + + function &factory($type) + { + include_once(ADODB_DIR."/drivers/adodb-$type.inc.php"); + $obj = &NewADOConnection($type); + if (!is_object($obj)) $obj =& new PEAR_Error('Unknown Database Driver: '.$dsninfo['phptype'],-1); + return $obj; + } + + /** + * Create a new DB object and connect to the specified database + * + * @param $dsn mixed "data source name", see the DB::parseDSN + * method for a description of the dsn format. Can also be + * specified as an array of the format returned by DB::parseDSN. + * + * @param $options mixed if boolean (or scalar), tells whether + * this connection should be persistent (for backends that support + * this). This parameter can also be an array of options, see + * DB_common::setOption for more information on connection + * options. + * + * @return object a newly created DB connection object, or a DB + * error object on error + * + * @see DB::parseDSN + * @see DB::isError + */ + function &connect($dsn, $options = false) + { + if (is_array($dsn)) { + $dsninfo = $dsn; + } else { + $dsninfo = DB::parseDSN($dsn); + } + switch ($dsninfo["phptype"]) { + case 'pgsql': $type = 'postgres7'; break; + case 'ifx': $type = 'informix9'; break; + default: $type = $dsninfo["phptype"]; break; + } + + if (is_array($options) && isset($options["debug"]) && + $options["debug"] >= 2) { + // expose php errors with sufficient debug level + @include_once("adodb-$type.inc.php"); + } else { + @include_once("adodb-$type.inc.php"); + } + + @$obj =& NewADOConnection($type); + if (!is_object($obj)) { + $obj =& new PEAR_Error('Unknown Database Driver: '.$dsninfo['phptype'],-1); + return $obj; + } + if (is_array($options)) { + foreach($options as $k => $v) { + switch(strtolower($k)) { + case 'persist': + case 'persistent': $persist = $v; break; + #ibase + case 'dialect': $obj->dialect = $v; break; + case 'charset': $obj->charset = $v; break; + case 'buffers': $obj->buffers = $v; break; + #ado + case 'charpage': $obj->charPage = $v; break; + #mysql + case 'clientflags': $obj->clientFlags = $v; break; + } + } + } else { + $persist = false; + } + + if (isset($dsninfo['socket'])) $dsninfo['hostspec'] .= ':'.$dsninfo['socket']; + else if (isset($dsninfo['port'])) $dsninfo['hostspec'] .= ':'.$dsninfo['port']; + + if($persist) $ok = $obj->PConnect($dsninfo['hostspec'], $dsninfo['username'],$dsninfo['password'],$dsninfo['database']); + else $ok = $obj->Connect($dsninfo['hostspec'], $dsninfo['username'],$dsninfo['password'],$dsninfo['database']); + + if (!$ok) $obj = ADODB_PEAR_Error(); + return $obj; + } + + /** + * Return the DB API version + * + * @return int the DB API version number + */ + function apiVersion() + { + return 2; + } + + /** + * Tell whether a result code from a DB method is an error + * + * @param $value int result code + * + * @return bool whether $value is an error + */ + function isError($value) + { + if (!is_object($value)) return false; + $class = get_class($value); + return $class == 'pear_error' || is_subclass_of($value, 'pear_error') || + $class == 'db_error' || is_subclass_of($value, 'db_error'); + } + + + /** + * Tell whether a result code from a DB method is a warning. + * Warnings differ from errors in that they are generated by DB, + * and are not fatal. + * + * @param $value mixed result value + * + * @return bool whether $value is a warning + */ + function isWarning($value) + { + return false; + /* + return is_object($value) && + (get_class( $value ) == "db_warning" || + is_subclass_of($value, "db_warning"));*/ + } + + /** + * Parse a data source name + * + * @param $dsn string Data Source Name to be parsed + * + * @return array an associative array with the following keys: + * + * phptype: Database backend used in PHP (mysql, odbc etc.) + * dbsyntax: Database used with regards to SQL syntax etc. + * protocol: Communication protocol to use (tcp, unix etc.) + * hostspec: Host specification (hostname[:port]) + * database: Database to use on the DBMS server + * username: User name for login + * password: Password for login + * + * The format of the supplied DSN is in its fullest form: + * + * phptype(dbsyntax)://username:password@protocol+hostspec/database + * + * Most variations are allowed: + * + * phptype://username:password@protocol+hostspec:110//usr/db_file.db + * phptype://username:password@hostspec/database_name + * phptype://username:password@hostspec + * phptype://username@hostspec + * phptype://hostspec/database + * phptype://hostspec + * phptype(dbsyntax) + * phptype + * + * @author Tomas V.V.Cox + */ + function parseDSN($dsn) + { + if (is_array($dsn)) { + return $dsn; + } + + $parsed = array( + 'phptype' => false, + 'dbsyntax' => false, + 'protocol' => false, + 'hostspec' => false, + 'database' => false, + 'username' => false, + 'password' => false + ); + + // Find phptype and dbsyntax + if (($pos = strpos($dsn, '://')) !== false) { + $str = substr($dsn, 0, $pos); + $dsn = substr($dsn, $pos + 3); + } else { + $str = $dsn; + $dsn = NULL; + } + + // Get phptype and dbsyntax + // $str => phptype(dbsyntax) + if (preg_match('|^(.+?)\((.*?)\)$|', $str, $arr)) { + $parsed['phptype'] = $arr[1]; + $parsed['dbsyntax'] = (empty($arr[2])) ? $arr[1] : $arr[2]; + } else { + $parsed['phptype'] = $str; + $parsed['dbsyntax'] = $str; + } + + if (empty($dsn)) { + return $parsed; + } + + // Get (if found): username and password + // $dsn => username:password@protocol+hostspec/database + if (($at = strpos($dsn,'@')) !== false) { + $str = substr($dsn, 0, $at); + $dsn = substr($dsn, $at + 1); + if (($pos = strpos($str, ':')) !== false) { + $parsed['username'] = urldecode(substr($str, 0, $pos)); + $parsed['password'] = urldecode(substr($str, $pos + 1)); + } else { + $parsed['username'] = urldecode($str); + } + } + + // Find protocol and hostspec + // $dsn => protocol+hostspec/database + if (($pos=strpos($dsn, '/')) !== false) { + $str = substr($dsn, 0, $pos); + $dsn = substr($dsn, $pos + 1); + } else { + $str = $dsn; + $dsn = NULL; + } + + // Get protocol + hostspec + // $str => protocol+hostspec + if (($pos=strpos($str, '+')) !== false) { + $parsed['protocol'] = substr($str, 0, $pos); + $parsed['hostspec'] = urldecode(substr($str, $pos + 1)); + } else { + $parsed['hostspec'] = urldecode($str); + } + + // Get dabase if any + // $dsn => database + if (!empty($dsn)) { + $parsed['database'] = $dsn; + } + + return $parsed; + } + + /** + * Load a PHP database extension if it is not loaded already. + * + * @access public + * + * @param $name the base name of the extension (without the .so or + * .dll suffix) + * + * @return bool true if the extension was already or successfully + * loaded, false if it could not be loaded + */ + function assertExtension($name) + { + if (!extension_loaded($name)) { + $dlext = (strncmp(PHP_OS,'WIN',3) === 0) ? '.dll' : '.so'; + @dl($name . $dlext); + } + if (!extension_loaded($name)) { + return false; + } + return true; + } +} + +?> \ No newline at end of file diff --git a/upload/includes/adodb/adodb-perf.inc.php b/upload/includes/adodb/adodb-perf.inc.php new file mode 100644 index 00000000..f6eb10d7 --- /dev/null +++ b/upload/includes/adodb/adodb-perf.inc.php @@ -0,0 +1,1079 @@ +=2) return (integer) $memarr[1]; + + return 0; +} + +// avoids localization problems where , is used instead of . +function adodb_round($n,$prec) +{ + return number_format($n, $prec, '.', ''); +} + +/* return microtime value as a float */ +function adodb_microtime() +{ + $t = microtime(); + $t = explode(' ',$t); + return (float)$t[1]+ (float)$t[0]; +} + +/* sql code timing */ +function& adodb_log_sql(&$connx,$sql,$inputarr) +{ + $perf_table = adodb_perf::table(); + $connx->fnExecute = false; + $t0 = microtime(); + $rs =& $connx->Execute($sql,$inputarr); + $t1 = microtime(); + + if (!empty($connx->_logsql) && (empty($connx->_logsqlErrors) || !$rs)) { + global $ADODB_LOG_CONN; + + if (!empty($ADODB_LOG_CONN)) { + $conn = &$ADODB_LOG_CONN; + if ($conn->databaseType != $connx->databaseType) + $prefix = '/*dbx='.$connx->databaseType .'*/ '; + else + $prefix = ''; + } else { + $conn =& $connx; + $prefix = ''; + } + + $conn->_logsql = false; // disable logsql error simulation + $dbT = $conn->databaseType; + + $a0 = split(' ',$t0); + $a0 = (float)$a0[1]+(float)$a0[0]; + + $a1 = split(' ',$t1); + $a1 = (float)$a1[1]+(float)$a1[0]; + + $time = $a1 - $a0; + + if (!$rs) { + $errM = $connx->ErrorMsg(); + $errN = $connx->ErrorNo(); + $conn->lastInsID = 0; + $tracer = substr('ERROR: '.htmlspecialchars($errM),0,250); + } else { + $tracer = ''; + $errM = ''; + $errN = 0; + $dbg = $conn->debug; + $conn->debug = false; + if (!is_object($rs) || $rs->dataProvider == 'empty') + $conn->_affected = $conn->affected_rows(true); + $conn->lastInsID = @$conn->Insert_ID(); + $conn->debug = $dbg; + } + if (isset($_SERVER['HTTP_HOST'])) { + $tracer .= '
    '.$_SERVER['HTTP_HOST']; + if (isset($_SERVER['PHP_SELF'])) $tracer .= $_SERVER['PHP_SELF']; + } else + if (isset($_SERVER['PHP_SELF'])) $tracer .= '
    '.$_SERVER['PHP_SELF']; + //$tracer .= (string) adodb_backtrace(false); + + $tracer = (string) substr($tracer,0,500); + + if (is_array($inputarr)) { + if (is_array(reset($inputarr))) $params = 'Array sizeof='.sizeof($inputarr); + else { + // Quote string parameters so we can see them in the + // performance stats. This helps spot disabled indexes. + $xar_params = $inputarr; + foreach ($xar_params as $xar_param_key => $xar_param) { + if (gettype($xar_param) == 'string') + $xar_params[$xar_param_key] = '"' . $xar_param . '"'; + } + $params = implode(', ', $xar_params); + if (strlen($params) >= 3000) $params = substr($params, 0, 3000); + } + } else { + $params = ''; + } + + if (is_array($sql)) $sql = $sql[0]; + if ($prefix) $sql = $prefix.$sql; + $arr = array('b'=>strlen($sql).'.'.crc32($sql), + 'c'=>substr($sql,0,3900), 'd'=>$params,'e'=>$tracer,'f'=>adodb_round($time,6)); + //var_dump($arr); + $saved = $conn->debug; + $conn->debug = 0; + + $d = $conn->sysTimeStamp; + if (empty($d)) $d = date("'Y-m-d H:i:s'"); + if ($conn->dataProvider == 'oci8' && $dbT != 'oci8po') { + $isql = "insert into $perf_table values($d,:b,:c,:d,:e,:f)"; + } else if ($dbT == 'odbc_mssql' || $dbT == 'informix' || strncmp($dbT,'odbtp',4)==0) { + $timer = $arr['f']; + if ($dbT == 'informix') $sql2 = substr($sql2,0,230); + + $sql1 = $conn->qstr($arr['b']); + $sql2 = $conn->qstr($arr['c']); + $params = $conn->qstr($arr['d']); + $tracer = $conn->qstr($arr['e']); + + $isql = "insert into $perf_table (created,sql0,sql1,params,tracer,timer) values($d,$sql1,$sql2,$params,$tracer,$timer)"; + if ($dbT == 'informix') $isql = str_replace(chr(10),' ',$isql); + $arr = false; + } else { + if ($dbT == 'db2') $arr['f'] = (float) $arr['f']; + $isql = "insert into $perf_table (created,sql0,sql1,params,tracer,timer) values( $d,?,?,?,?,?)"; + } + $ok = $conn->Execute($isql,$arr); + $conn->debug = $saved; + + if ($ok) { + $conn->_logsql = true; + } else { + $err2 = $conn->ErrorMsg(); + $conn->_logsql = true; // enable logsql error simulation + $perf =& NewPerfMonitor($conn); + if ($perf) { + if ($perf->CreateLogTable()) $ok = $conn->Execute($isql,$arr); + } else { + $ok = $conn->Execute("create table $perf_table ( + created varchar(50), + sql0 varchar(250), + sql1 varchar(4000), + params varchar(3000), + tracer varchar(500), + timer decimal(16,6))"); + } + if (!$ok) { + ADOConnection::outp( "

    LOGSQL Insert Failed: $isql
    $err2

    "); + $conn->_logsql = false; + } + } + $connx->_errorMsg = $errM; + $connx->_errorCode = $errN; + } + $connx->fnExecute = 'adodb_log_sql'; + return $rs; +} + + +/* +The settings data structure is an associative array that database parameter per element. + +Each database parameter element in the array is itself an array consisting of: + +0: category code, used to group related db parameters +1: either + a. sql string to retrieve value, eg. "select value from v\$parameter where name='db_block_size'", + b. array holding sql string and field to look for, e.g. array('show variables','table_cache'), + c. a string prefixed by =, then a PHP method of the class is invoked, + e.g. to invoke $this->GetIndexValue(), set this array element to '=GetIndexValue', +2: description of the database parameter +*/ + +class adodb_perf { + var $conn; + var $color = '#F0F0F0'; + var $table = ''; + var $titles = ''; + var $warnRatio = 90; + var $tablesSQL = false; + var $cliFormat = "%32s => %s \r\n"; + var $sql1 = 'sql1'; // used for casting sql1 to text for mssql + var $explain = true; + var $helpurl = "LogSQL help"; + var $createTableSQL = false; + var $maxLength = 2000; + + // Sets the tablename to be used + function table($newtable = false) + { + static $_table; + + if (!empty($newtable)) $_table = $newtable; + if (empty($_table)) $_table = 'adodb_logsql'; + return $_table; + } + + // returns array with info to calculate CPU Load + function _CPULoad() + { +/* + +cpu 524152 2662 2515228 336057010 +cpu0 264339 1408 1257951 168025827 +cpu1 259813 1254 1257277 168031181 +page 622307 25475680 +swap 24 1891 +intr 890153570 868093576 6 0 4 4 0 6 1 2 0 0 0 124 0 8098760 2 13961053 0 0 0 0 0 0 0 0 0 0 0 0 0 16 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +disk_io: (3,0):(3144904,54369,610378,3090535,50936192) (3,1):(3630212,54097,633016,3576115,50951320) +ctxt 66155838 +btime 1062315585 +processes 69293 + +*/ + // Algorithm is taken from + // http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wmisdk/wmi/example__obtaining_raw_performance_data.asp + if (strncmp(PHP_OS,'WIN',3)==0) { + if (PHP_VERSION == '5.0.0') return false; + if (PHP_VERSION == '5.0.1') return false; + if (PHP_VERSION == '5.0.2') return false; + if (PHP_VERSION == '5.0.3') return false; + if (PHP_VERSION == '4.3.10') return false; # see http://bugs.php.net/bug.php?id=31737 + + @$c = new COM("WinMgmts:{impersonationLevel=impersonate}!Win32_PerfRawData_PerfOS_Processor.Name='_Total'"); + if (!$c) return false; + + $info[0] = $c->PercentProcessorTime; + $info[1] = 0; + $info[2] = 0; + $info[3] = $c->TimeStamp_Sys100NS; + //print_r($info); + return $info; + } + + // Algorithm - Steve Blinch (BlitzAffe Online, http://www.blitzaffe.com) + $statfile = '/proc/stat'; + if (!file_exists($statfile)) return false; + + $fd = fopen($statfile,"r"); + if (!$fd) return false; + + $statinfo = explode("\n",fgets($fd, 1024)); + fclose($fd); + foreach($statinfo as $line) { + $info = explode(" ",$line); + if($info[0]=="cpu") { + array_shift($info); // pop off "cpu" + if(!$info[0]) array_shift($info); // pop off blank space (if any) + return $info; + } + } + + return false; + + } + + /* NOT IMPLEMENTED */ + function MemInfo() + { + /* + + total: used: free: shared: buffers: cached: +Mem: 1055289344 917299200 137990144 0 165437440 599773184 +Swap: 2146775040 11055104 2135719936 +MemTotal: 1030556 kB +MemFree: 134756 kB +MemShared: 0 kB +Buffers: 161560 kB +Cached: 581384 kB +SwapCached: 4332 kB +Active: 494468 kB +Inact_dirty: 322856 kB +Inact_clean: 24256 kB +Inact_target: 168316 kB +HighTotal: 131064 kB +HighFree: 1024 kB +LowTotal: 899492 kB +LowFree: 133732 kB +SwapTotal: 2096460 kB +SwapFree: 2085664 kB +Committed_AS: 348732 kB + */ + } + + + /* + Remember that this is client load, not db server load! + */ + var $_lastLoad; + function CPULoad() + { + $info = $this->_CPULoad(); + if (!$info) return false; + + if (empty($this->_lastLoad)) { + sleep(1); + $this->_lastLoad = $info; + $info = $this->_CPULoad(); + } + + $last = $this->_lastLoad; + $this->_lastLoad = $info; + + $d_user = $info[0] - $last[0]; + $d_nice = $info[1] - $last[1]; + $d_system = $info[2] - $last[2]; + $d_idle = $info[3] - $last[3]; + + //printf("Delta - User: %f Nice: %f System: %f Idle: %f
    ",$d_user,$d_nice,$d_system,$d_idle); + + if (strncmp(PHP_OS,'WIN',3)==0) { + if ($d_idle < 1) $d_idle = 1; + return 100*(1-$d_user/$d_idle); + }else { + $total=$d_user+$d_nice+$d_system+$d_idle; + if ($total<1) $total=1; + return 100*($d_user+$d_nice+$d_system)/$total; + } + } + + function Tracer($sql) + { + $perf_table = adodb_perf::table(); + $saveE = $this->conn->fnExecute; + $this->conn->fnExecute = false; + + global $ADODB_FETCH_MODE; + $save = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + if ($this->conn->fetchMode !== false) $savem = $this->conn->SetFetchMode(false); + + $sqlq = $this->conn->qstr($sql); + $arr = $this->conn->GetArray( +"select count(*),tracer + from $perf_table where sql1=$sqlq + group by tracer + order by 1 desc"); + $s = ''; + if ($arr) { + $s .= '

    Scripts Affected

    '; + foreach($arr as $k) { + $s .= sprintf("%4d",$k[0]).'   '.strip_tags($k[1]).'
    '; + } + } + + if (isset($savem)) $this->conn->SetFetchMode($savem); + $ADODB_CACHE_MODE = $save; + $this->conn->fnExecute = $saveE; + return $s; + } + + /* + Explain Plan for $sql. + If only a snippet of the $sql is passed in, then $partial will hold the crc32 of the + actual sql. + */ + function Explain($sql,$partial=false) + { + return false; + } + + function InvalidSQL($numsql = 10) + { + + if (isset($_GET['sql'])) return; + $s = '

    Invalid SQL

    '; + $saveE = $this->conn->fnExecute; + $this->conn->fnExecute = false; + $perf_table = adodb_perf::table(); + $rs =& $this->conn->SelectLimit("select distinct count(*),sql1,tracer as error_msg from $perf_table where tracer like 'ERROR:%' group by sql1,tracer order by 1 desc",$numsql);//,$numsql); + $this->conn->fnExecute = $saveE; + if ($rs) { + $s .= rs2html($rs,false,false,false,false); + } else + return "

    $this->helpurl. ".$this->conn->ErrorMsg()."

    "; + + return $s; + } + + + /* + This script identifies the longest running SQL + */ + function _SuspiciousSQL($numsql = 10) + { + global $ADODB_FETCH_MODE; + + $perf_table = adodb_perf::table(); + $saveE = $this->conn->fnExecute; + $this->conn->fnExecute = false; + + if (isset($_GET['exps']) && isset($_GET['sql'])) { + $partial = !empty($_GET['part']); + echo "".$this->Explain($_GET['sql'],$partial)."\n"; + } + + if (isset($_GET['sql'])) return; + $sql1 = $this->sql1; + + $save = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + if ($this->conn->fetchMode !== false) $savem = $this->conn->SetFetchMode(false); + //$this->conn->debug=1; + $rs =& $this->conn->SelectLimit( + "select avg(timer) as avg_timer,$sql1,count(*),max(timer) as max_timer,min(timer) as min_timer + from $perf_table + where {$this->conn->upperCase}({$this->conn->substr}(sql0,1,5)) not in ('DROP ','INSER','COMMI','CREAT') + and (tracer is null or tracer not like 'ERROR:%') + group by sql1 + order by 1 desc",$numsql); + if (isset($savem)) $this->conn->SetFetchMode($savem); + $ADODB_FETCH_MODE = $save; + $this->conn->fnExecute = $saveE; + + if (!$rs) return "

    $this->helpurl. ".$this->conn->ErrorMsg()."

    "; + $s = "

    Suspicious SQL

    +The following SQL have high average execution times
    +
    ParameterValueDescription
    \n"; + $max = $this->maxLength; + while (!$rs->EOF) { + $sql = $rs->fields[1]; + $raw = urlencode($sql); + if (strlen($raw)>$max-100) { + $sql2 = substr($sql,0,$max-500); + $raw = urlencode($sql2).'&part='.crc32($sql); + } + $prefix = ""; + $suffix = ""; + if ($this->explain == false || strlen($prefix)>$max) { + $suffix = ' ... String too long for GET parameter: '.strlen($prefix).''; + $prefix = ''; + } + $s .= ""; + $rs->MoveNext(); + } + return $s."
    Avg TimeCountSQLMaxMin
    ".adodb_round($rs->fields[0],6)."".$rs->fields[2]."".$prefix.htmlspecialchars($sql).$suffix."". + "".$rs->fields[3]."".$rs->fields[4]."
    "; + + } + + function CheckMemory() + { + return ''; + } + + + function SuspiciousSQL($numsql=10) + { + return adodb_perf::_SuspiciousSQL($numsql); + } + + function ExpensiveSQL($numsql=10) + { + return adodb_perf::_ExpensiveSQL($numsql); + } + + + /* + This reports the percentage of load on the instance due to the most + expensive few SQL statements. Tuning these statements can often + make huge improvements in overall system performance. + */ + function _ExpensiveSQL($numsql = 10) + { + global $ADODB_FETCH_MODE; + + $perf_table = adodb_perf::table(); + $saveE = $this->conn->fnExecute; + $this->conn->fnExecute = false; + + if (isset($_GET['expe']) && isset($_GET['sql'])) { + $partial = !empty($_GET['part']); + echo "".$this->Explain($_GET['sql'],$partial)."\n"; + } + + if (isset($_GET['sql'])) return; + + $sql1 = $this->sql1; + $save = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + if ($this->conn->fetchMode !== false) $savem = $this->conn->SetFetchMode(false); + + $rs =& $this->conn->SelectLimit( + "select sum(timer) as total,$sql1,count(*),max(timer) as max_timer,min(timer) as min_timer + from $perf_table + where {$this->conn->upperCase}({$this->conn->substr}(sql0,1,5)) not in ('DROP ','INSER','COMMI','CREAT') + and (tracer is null or tracer not like 'ERROR:%') + group by sql1 + having count(*)>1 + order by 1 desc",$numsql); + if (isset($savem)) $this->conn->SetFetchMode($savem); + $this->conn->fnExecute = $saveE; + $ADODB_FETCH_MODE = $save; + if (!$rs) return "

    $this->helpurl. ".$this->conn->ErrorMsg()."

    "; + $s = "

    Expensive SQL

    +Tuning the following SQL could reduce the server load substantially
    +\n"; + $max = $this->maxLength; + while (!$rs->EOF) { + $sql = $rs->fields[1]; + $raw = urlencode($sql); + if (strlen($raw)>$max-100) { + $sql2 = substr($sql,0,$max-500); + $raw = urlencode($sql2).'&part='.crc32($sql); + } + $prefix = ""; + $suffix = ""; + if($this->explain == false || strlen($prefix>$max)) { + $prefix = ''; + $suffix = ''; + } + $s .= ""; + $rs->MoveNext(); + } + return $s."
    LoadCountSQLMaxMin
    ".adodb_round($rs->fields[0],6)."".$rs->fields[2]."".$prefix.htmlspecialchars($sql).$suffix."". + "".$rs->fields[3]."".$rs->fields[4]."
    "; + } + + /* + Raw function to return parameter value from $settings. + */ + function DBParameter($param) + { + if (empty($this->settings[$param])) return false; + $sql = $this->settings[$param][1]; + return $this->_DBParameter($sql); + } + + /* + Raw function returning array of poll paramters + */ + function &PollParameters() + { + $arr[0] = (float)$this->DBParameter('data cache hit ratio'); + $arr[1] = (float)$this->DBParameter('data reads'); + $arr[2] = (float)$this->DBParameter('data writes'); + $arr[3] = (integer) $this->DBParameter('current connections'); + return $arr; + } + + /* + Low-level Get Database Parameter + */ + function _DBParameter($sql) + { + $savelog = $this->conn->LogSQL(false); + if (is_array($sql)) { + global $ADODB_FETCH_MODE; + + $sql1 = $sql[0]; + $key = $sql[1]; + if (sizeof($sql)>2) $pos = $sql[2]; + else $pos = 1; + if (sizeof($sql)>3) $coef = $sql[3]; + else $coef = false; + $ret = false; + $save = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + if ($this->conn->fetchMode !== false) $savem = $this->conn->SetFetchMode(false); + + $rs = $this->conn->Execute($sql1); + + if (isset($savem)) $this->conn->SetFetchMode($savem); + $ADODB_FETCH_MODE = $save; + if ($rs) { + while (!$rs->EOF) { + $keyf = reset($rs->fields); + if (trim($keyf) == $key) { + $ret = $rs->fields[$pos]; + if ($coef) $ret *= $coef; + break; + } + $rs->MoveNext(); + } + $rs->Close(); + } + $this->conn->LogSQL($savelog); + return $ret; + } else { + if (strncmp($sql,'=',1) == 0) { + $fn = substr($sql,1); + return $this->$fn(); + } + $sql = str_replace('$DATABASE',$this->conn->database,$sql); + $ret = $this->conn->GetOne($sql); + $this->conn->LogSQL($savelog); + + return $ret; + } + } + + /* + Warn if cache ratio falls below threshold. Displayed in "Description" column. + */ + function WarnCacheRatio($val) + { + if ($val < $this->warnRatio) + return 'Cache ratio should be at least '.$this->warnRatio.'%'; + else return ''; + } + + function clearsql() + { + $perf_table = adodb_perf::table(); + $this->conn->Execute("delete from $perf_table where created<".$this->conn->sysTimeStamp); + } + + /***********************************************************************************************/ + // HIGH LEVEL UI FUNCTIONS + /***********************************************************************************************/ + + + function UI($pollsecs=5) + { + global $ADODB_LOG_CONN; + + $perf_table = adodb_perf::table(); + $conn = $this->conn; + + $app = $conn->host; + if ($conn->host && $conn->database) $app .= ', db='; + $app .= $conn->database; + + if ($app) $app .= ', '; + $savelog = $this->conn->LogSQL(false); + $info = $conn->ServerInfo(); + if (isset($_GET['clearsql'])) { + $this->clearsql(); + } + $this->conn->LogSQL($savelog); + + // magic quotes + + if (isset($_GET['sql']) && get_magic_quotes_gpc()) { + $_GET['sql'] = $_GET['sql'] = str_replace(array("\\'",'\"'),array("'",'"'),$_GET['sql']); + } + + if (!isset($_SESSION['ADODB_PERF_SQL'])) $nsql = $_SESSION['ADODB_PERF_SQL'] = 10; + else $nsql = $_SESSION['ADODB_PERF_SQL']; + + $app .= $info['description']; + + + if (isset($_GET['do'])) $do = $_GET['do']; + else if (isset($_POST['do'])) $do = $_POST['do']; + else if (isset($_GET['sql'])) $do = 'viewsql'; + else $do = 'stats'; + + if (isset($_GET['nsql'])) { + if ($_GET['nsql'] > 0) $nsql = $_SESSION['ADODB_PERF_SQL'] = (integer) $_GET['nsql']; + } + echo "ADOdb Performance Monitor on $app"; + if ($do == 'viewsql') $form = "
    # SQL:
    "; + else $form = " "; + + $allowsql = !defined('ADODB_PERF_NO_RUN_SQL'); + + if (empty($_GET['hidem'])) + echo "
    + ADOdb Performance Monitor for $app
    + Performance Stats   View SQL +   View Tables   Poll Stats", + $allowsql ? '   Run SQL' : '', + "$form", + "
    "; + + + switch ($do) { + default: + case 'stats': + + if (empty($ADODB_LOG_CONN)) + echo "

      Clear SQL Log
    "; + echo $this->HealthCheck(); + //$this->conn->debug=1; + echo $this->CheckMemory(); + global $ADODB_LOG_CONN; + break; + case 'poll': + echo ""; + break; + case 'poll2': + echo "

    ";
    +			$this->Poll($pollsecs);
    +			break;
    +		
    +		case 'dosql':
    +			if (!$allowsql) break;
    +			
    +			$this->DoSQLForm();
    +			break;
    +		case 'viewsql':
    +			if (empty($_GET['hidem']))
    +				echo "  Clear SQL Log
    "; + echo($this->SuspiciousSQL($nsql)); + echo($this->ExpensiveSQL($nsql)); + echo($this->InvalidSQL($nsql)); + break; + case 'tables': + echo $this->Tables(); break; + } + global $ADODB_vers; + echo "

    $ADODB_vers Sponsored by phpLens
    "; + } + + /* + Runs in infinite loop, returning real-time statistics + */ + function Poll($secs=5) + { + $this->conn->fnExecute = false; + //$this->conn->debug=1; + if ($secs <= 1) $secs = 1; + echo "Accumulating statistics, every $secs seconds...\n";flush(); + $arro =& $this->PollParameters(); + $cnt = 0; + set_time_limit(0); + sleep($secs); + while (1) { + + $arr =& $this->PollParameters(); + + $hits = sprintf('%2.2f',$arr[0]); + $reads = sprintf('%12.4f',($arr[1]-$arro[1])/$secs); + $writes = sprintf('%12.4f',($arr[2]-$arro[2])/$secs); + $sess = sprintf('%5d',$arr[3]); + + $load = $this->CPULoad(); + if ($load !== false) { + $oslabel = 'WS-CPU%'; + $osval = sprintf(" %2.1f ",(float) $load); + }else { + $oslabel = ''; + $osval = ''; + } + if ($cnt % 10 == 0) echo " Time ".$oslabel." Hit% Sess Reads/s Writes/s\n"; + $cnt += 1; + echo date('H:i:s').' '.$osval."$hits $sess $reads $writes\n"; + flush(); + + if (connection_aborted()) return; + + sleep($secs); + $arro = $arr; + } + } + + /* + Returns basic health check in a command line interface + */ + function HealthCheckCLI() + { + return $this->HealthCheck(true); + } + + + /* + Returns basic health check as HTML + */ + function HealthCheck($cli=false) + { + $saveE = $this->conn->fnExecute; + $this->conn->fnExecute = false; + if ($cli) $html = ''; + else $html = $this->table.'

    '.$this->conn->databaseType.'

    '.$this->titles; + + $oldc = false; + $bgc = ''; + foreach($this->settings as $name => $arr) { + if ($arr === false) break; + + if (!is_string($name)) { + if ($cli) $html .= " -- $arr -- \n"; + else $html .= "color>$arr  "; + continue; + } + + if (!is_array($arr)) break; + $category = $arr[0]; + $how = $arr[1]; + if (sizeof($arr)>2) $desc = $arr[2]; + else $desc = '   '; + + + if ($category == 'HIDE') continue; + + $val = $this->_DBParameter($how); + + if ($desc && strncmp($desc,"=",1) === 0) { + $fn = substr($desc,1); + $desc = $this->$fn($val); + } + + if ($val === false) { + $m = $this->conn->ErrorMsg(); + $val = "Error: $m"; + } else { + if (is_numeric($val) && $val >= 256*1024) { + if ($val % (1024*1024) == 0) { + $val /= (1024*1024); + $val .= 'M'; + } else if ($val % 1024 == 0) { + $val /= 1024; + $val .= 'K'; + } + //$val = htmlspecialchars($val); + } + } + if ($category != $oldc) { + $oldc = $category; + //$bgc = ($bgc == ' bgcolor='.$this->color) ? ' bgcolor=white' : ' bgcolor='.$this->color; + } + if (strlen($desc)==0) $desc = ' '; + if (strlen($val)==0) $val = ' '; + if ($cli) { + $html .= str_replace(' ','',sprintf($this->cliFormat,strip_tags($name),strip_tags($val),strip_tags($desc))); + + }else { + $html .= "".$name.''.$val.''.$desc."\n"; + } + } + + if (!$cli) $html .= "\n"; + $this->conn->fnExecute = $saveE; + + return $html; + } + + function Tables($orderby='1') + { + if (!$this->tablesSQL) return false; + + $savelog = $this->conn->LogSQL(false); + $rs = $this->conn->Execute($this->tablesSQL.' order by '.$orderby); + $this->conn->LogSQL($savelog); + $html = rs2html($rs,false,false,false,false); + return $html; + } + + + function CreateLogTable() + { + if (!$this->createTableSQL) return false; + + $table = $this->table(); + $sql = str_replace('adodb_logsql',$table,$this->createTableSQL); + $savelog = $this->conn->LogSQL(false); + $ok = $this->conn->Execute($sql); + $this->conn->LogSQL($savelog); + return ($ok) ? true : false; + } + + function DoSQLForm() + { + + + $PHP_SELF = $_SERVER['PHP_SELF']; + $sql = isset($_REQUEST['sql']) ? $_REQUEST['sql'] : ''; + + if (isset($_SESSION['phplens_sqlrows'])) $rows = $_SESSION['phplens_sqlrows']; + else $rows = 3; + + if (isset($_REQUEST['SMALLER'])) { + $rows /= 2; + if ($rows < 3) $rows = 3; + $_SESSION['phplens_sqlrows'] = $rows; + } + if (isset($_REQUEST['BIGGER'])) { + $rows *= 2; + $_SESSION['phplens_sqlrows'] = $rows; + } + +?> + +
    + + + + + + +
    Form size: + + +
    +
    +
    + +undomq(trim($sql)); + if (substr($sql,strlen($sql)-1) === ';') { + $print = true; + $sqla = $this->SplitSQL($sql); + } else { + $print = false; + $sqla = array($sql); + } + foreach($sqla as $sqls) { + + if (!$sqls) continue; + + if ($print) { + print "

    ".htmlspecialchars($sqls)."

    "; + flush(); + } + $savelog = $this->conn->LogSQL(false); + $rs = $this->conn->Execute($sqls); + $this->conn->LogSQL($savelog); + if ($rs && is_object($rs) && !$rs->EOF) { + rs2html($rs); + while ($rs->NextRecordSet()) { + print "
     
    "; + rs2html($rs); + } + } else { + $e1 = (integer) $this->conn->ErrorNo(); + $e2 = $this->conn->ErrorMsg(); + if (($e1) || ($e2)) { + if (empty($e1)) $e1 = '-1'; // postgresql fix + print '   '.$e1.': '.$e2; + } else { + print "

    No Recordset returned

    "; + } + } + } // foreach + } + + function SplitSQL($sql) + { + $arr = explode(';',$sql); + return $arr; + } + + function undomq($m) + { + if (get_magic_quotes_gpc()) { + // undo the damage + $m = str_replace('\\\\','\\',$m); + $m = str_replace('\"','"',$m); + $m = str_replace('\\\'','\'',$m); + } + return $m; +} + + + /************************************************************************/ + + /** + * Reorganise multiple table-indices/statistics/.. + * OptimizeMode could be given by last Parameter + * + * @example + *
    +     *          optimizeTables( 'tableA');
    +     *      
    + *
    +     *          optimizeTables( 'tableA', 'tableB', 'tableC');
    +     *      
    + *
    +     *          optimizeTables( 'tableA', 'tableB', ADODB_OPT_LOW);
    +     *      
    + * + * @param string table name of the table to optimize + * @param int mode optimization-mode + * ADODB_OPT_HIGH for full optimization + * ADODB_OPT_LOW for CPU-less optimization + * Default is LOW ADODB_OPT_LOW + * @author Markus Staab + * @return Returns true on success and false on error + */ + function OptimizeTables() + { + $args = func_get_args(); + $numArgs = func_num_args(); + + if ( $numArgs == 0) return false; + + $mode = ADODB_OPT_LOW; + $lastArg = $args[ $numArgs - 1]; + if ( !is_string($lastArg)) { + $mode = $lastArg; + unset( $args[ $numArgs - 1]); + } + + foreach( $args as $table) { + $this->optimizeTable( $table, $mode); + } + } + + /** + * Reorganise the table-indices/statistics/.. depending on the given mode. + * Default Implementation throws an error. + * + * @param string table name of the table to optimize + * @param int mode optimization-mode + * ADODB_OPT_HIGH for full optimization + * ADODB_OPT_LOW for CPU-less optimization + * Default is LOW ADODB_OPT_LOW + * @author Markus Staab + * @return Returns true on success and false on error + */ + function OptimizeTable( $table, $mode = ADODB_OPT_LOW) + { + ADOConnection::outp( sprintf( "

    %s: '%s' not implemented for driver '%s'

    ", __CLASS__, __FUNCTION__, $this->conn->databaseType)); + return false; + } + + /** + * Reorganise current database. + * Default implementation loops over all MetaTables() and + * optimize each using optmizeTable() + * + * @author Markus Staab + * @return Returns true on success and false on error + */ + function optimizeDatabase() + { + $conn = $this->conn; + if ( !$conn) return false; + + $tables = $conn->MetaTables( 'TABLES'); + if ( !$tables ) return false; + + foreach( $tables as $table) { + if ( !$this->optimizeTable( $table)) { + return false; + } + } + + return true; + } + // end hack +} + +?> \ No newline at end of file diff --git a/upload/includes/adodb/adodb-php4.inc.php b/upload/includes/adodb/adodb-php4.inc.php new file mode 100644 index 00000000..9547027c --- /dev/null +++ b/upload/includes/adodb/adodb-php4.inc.php @@ -0,0 +1,16 @@ + \ No newline at end of file diff --git a/upload/includes/adodb/adodb-time.inc.php b/upload/includes/adodb/adodb-time.inc.php new file mode 100644 index 00000000..e0a6a5de --- /dev/null +++ b/upload/includes/adodb/adodb-time.inc.php @@ -0,0 +1,1409 @@ + 4 digit year conversion. The maximum is billions of years in the +future, but this is a theoretical limit as the computation of that year +would take too long with the current implementation of adodb_mktime(). + +This library replaces native functions as follows: + +
    	
    +	getdate()  with  adodb_getdate()
    +	date()     with  adodb_date() 
    +	gmdate()   with  adodb_gmdate()
    +	mktime()   with  adodb_mktime()
    +	gmmktime() with  adodb_gmmktime()
    +	strftime() with  adodb_strftime()
    +	strftime() with  adodb_gmstrftime()
    +
    + +The parameters are identical, except that adodb_date() accepts a subset +of date()'s field formats. Mktime() will convert from local time to GMT, +and date() will convert from GMT to local time, but daylight savings is +not handled currently. + +This library is independant of the rest of ADOdb, and can be used +as standalone code. + +PERFORMANCE + +For high speed, this library uses the native date functions where +possible, and only switches to PHP code when the dates fall outside +the 32-bit signed integer range. + +GREGORIAN CORRECTION + +Pope Gregory shortened October of A.D. 1582 by ten days. Thursday, +October 4, 1582 (Julian) was followed immediately by Friday, October 15, +1582 (Gregorian). + +Since 0.06, we handle this correctly, so: + +adodb_mktime(0,0,0,10,15,1582) - adodb_mktime(0,0,0,10,4,1582) + == 24 * 3600 (1 day) + +============================================================================= + +COPYRIGHT + +(c) 2003-2005 John Lim and released under BSD-style license except for code by +jackbbs, which includes adodb_mktime, adodb_get_gmt_diff, adodb_is_leap_year +and originally found at http://www.php.net/manual/en/function.mktime.php + +============================================================================= + +BUG REPORTS + +These should be posted to the ADOdb forums at + + http://phplens.com/lens/lensforum/topics.php?id=4 + +============================================================================= + +FUNCTION DESCRIPTIONS + + +** FUNCTION adodb_getdate($date=false) + +Returns an array containing date information, as getdate(), but supports +dates greater than 1901 to 2038. The local date/time format is derived from a +heuristic the first time adodb_getdate is called. + + +** FUNCTION adodb_date($fmt, $timestamp = false) + +Convert a timestamp to a formatted local date. If $timestamp is not defined, the +current timestamp is used. Unlike the function date(), it supports dates +outside the 1901 to 2038 range. + +The format fields that adodb_date supports: + +
    +	a - "am" or "pm" 
    +	A - "AM" or "PM" 
    +	d - day of the month, 2 digits with leading zeros; i.e. "01" to "31" 
    +	D - day of the week, textual, 3 letters; e.g. "Fri" 
    +	F - month, textual, long; e.g. "January" 
    +	g - hour, 12-hour format without leading zeros; i.e. "1" to "12" 
    +	G - hour, 24-hour format without leading zeros; i.e. "0" to "23" 
    +	h - hour, 12-hour format; i.e. "01" to "12" 
    +	H - hour, 24-hour format; i.e. "00" to "23" 
    +	i - minutes; i.e. "00" to "59" 
    +	j - day of the month without leading zeros; i.e. "1" to "31" 
    +	l (lowercase 'L') - day of the week, textual, long; e.g. "Friday"  
    +	L - boolean for whether it is a leap year; i.e. "0" or "1" 
    +	m - month; i.e. "01" to "12" 
    +	M - month, textual, 3 letters; e.g. "Jan" 
    +	n - month without leading zeros; i.e. "1" to "12" 
    +	O - Difference to Greenwich time in hours; e.g. "+0200" 
    +	Q - Quarter, as in 1, 2, 3, 4 
    +	r - RFC 2822 formatted date; e.g. "Thu, 21 Dec 2000 16:01:07 +0200" 
    +	s - seconds; i.e. "00" to "59" 
    +	S - English ordinal suffix for the day of the month, 2 characters; 
    +	   			i.e. "st", "nd", "rd" or "th" 
    +	t - number of days in the given month; i.e. "28" to "31"
    +	T - Timezone setting of this machine; e.g. "EST" or "MDT" 
    +	U - seconds since the Unix Epoch (January 1 1970 00:00:00 GMT)  
    +	w - day of the week, numeric, i.e. "0" (Sunday) to "6" (Saturday) 
    +	Y - year, 4 digits; e.g. "1999" 
    +	y - year, 2 digits; e.g. "99" 
    +	z - day of the year; i.e. "0" to "365" 
    +	Z - timezone offset in seconds (i.e. "-43200" to "43200"). 
    +	   			The offset for timezones west of UTC is always negative, 
    +				and for those east of UTC is always positive. 
    +
    + +Unsupported: +
    +	B - Swatch Internet time 
    +	I (capital i) - "1" if Daylight Savings Time, "0" otherwise.
    +	W - ISO-8601 week number of year, weeks starting on Monday 
    +
    +
    + + +** FUNCTION adodb_date2($fmt, $isoDateString = false) +Same as adodb_date, but 2nd parameter accepts iso date, eg. + + adodb_date2('d-M-Y H:i','2003-12-25 13:01:34'); + + +** FUNCTION adodb_gmdate($fmt, $timestamp = false) + +Convert a timestamp to a formatted GMT date. If $timestamp is not defined, the +current timestamp is used. Unlike the function date(), it supports dates +outside the 1901 to 2038 range. + + +** FUNCTION adodb_mktime($hr, $min, $sec[, $month, $day, $year]) + +Converts a local date to a unix timestamp. Unlike the function mktime(), it supports +dates outside the 1901 to 2038 range. All parameters are optional. + + +** FUNCTION adodb_gmmktime($hr, $min, $sec [, $month, $day, $year]) + +Converts a gmt date to a unix timestamp. Unlike the function gmmktime(), it supports +dates outside the 1901 to 2038 range. Differs from gmmktime() in that all parameters +are currently compulsory. + +** FUNCTION adodb_gmstrftime($fmt, $timestamp = false) +Convert a timestamp to a formatted GMT date. + +** FUNCTION adodb_strftime($fmt, $timestamp = false) + +Convert a timestamp to a formatted local date. Internally converts $fmt into +adodb_date format, then echo result. + +For best results, you can define the local date format yourself. Define a global +variable $ADODB_DATE_LOCALE which is an array, 1st element is date format using +adodb_date syntax, and 2nd element is the time format, also in adodb_date syntax. + + eg. $ADODB_DATE_LOCALE = array('d/m/Y','H:i:s'); + + Supported format codes: + +
    +	%a - abbreviated weekday name according to the current locale 
    +	%A - full weekday name according to the current locale 
    +	%b - abbreviated month name according to the current locale 
    +	%B - full month name according to the current locale 
    +	%c - preferred date and time representation for the current locale 
    +	%d - day of the month as a decimal number (range 01 to 31) 
    +	%D - same as %m/%d/%y 
    +	%e - day of the month as a decimal number, a single digit is preceded by a space (range ' 1' to '31') 
    +	%h - same as %b
    +	%H - hour as a decimal number using a 24-hour clock (range 00 to 23) 
    +	%I - hour as a decimal number using a 12-hour clock (range 01 to 12) 
    +	%m - month as a decimal number (range 01 to 12) 
    +	%M - minute as a decimal number 
    +	%n - newline character 
    +	%p - either `am' or `pm' according to the given time value, or the corresponding strings for the current locale 
    +	%r - time in a.m. and p.m. notation 
    +	%R - time in 24 hour notation 
    +	%S - second as a decimal number 
    +	%t - tab character 
    +	%T - current time, equal to %H:%M:%S 
    +	%x - preferred date representation for the current locale without the time 
    +	%X - preferred time representation for the current locale without the date 
    +	%y - year as a decimal number without a century (range 00 to 99) 
    +	%Y - year as a decimal number including the century 
    +	%Z - time zone or name or abbreviation 
    +	%% - a literal `%' character 
    +
    + + Unsupported codes: +
    +	%C - century number (the year divided by 100 and truncated to an integer, range 00 to 99) 
    +	%g - like %G, but without the century. 
    +	%G - The 4-digit year corresponding to the ISO week number (see %V). 
    +	     This has the same format and value as %Y, except that if the ISO week number belongs 
    +		 to the previous or next year, that year is used instead. 
    +	%j - day of the year as a decimal number (range 001 to 366) 
    +	%u - weekday as a decimal number [1,7], with 1 representing Monday 
    +	%U - week number of the current year as a decimal number, starting 
    +	    with the first Sunday as the first day of the first week 
    +	%V - The ISO 8601:1988 week number of the current year as a decimal number, 
    +	     range 01 to 53, where week 1 is the first week that has at least 4 days in the 
    +		 current year, and with Monday as the first day of the week. (Use %G or %g for 
    +		 the year component that corresponds to the week number for the specified timestamp.) 
    +	%w - day of the week as a decimal, Sunday being 0 
    +	%W - week number of the current year as a decimal number, starting with the 
    +	     first Monday as the first day of the first week 
    +
    + +============================================================================= + +NOTES + +Useful url for generating test timestamps: + http://www.4webhelp.net/us/timestamp.php + +Possible future optimizations include + +a. Using an algorithm similar to Plauger's in "The Standard C Library" +(page 428, xttotm.c _Ttotm() function). Plauger's algorithm will not +work outside 32-bit signed range, so i decided not to implement it. + +b. Implement daylight savings, which looks awfully complicated, see + http://webexhibits.org/daylightsaving/ + + +CHANGELOG +- 15 July 2007 0.30 +Added PHP 5.2.0 compatability fixes. + * gmtime behaviour for 1970 has changed. We use the actual date if it is between 1970 to 2038 to get the + * timezone, otherwise we use the current year as the baseline to retrieve the timezone. + * Also the timezone's in php 5.2.* support historical data better, eg. if timezone today was +8, but + in 1970 it was +7:30, then php 5.2 return +7:30, while this library will use +8. + * + +- 19 March 2006 0.24 +Changed strftime() locale detection, because some locales prepend the day of week to the date when %c is used. + +- 10 Feb 2006 0.23 +PHP5 compat: when we detect PHP5, the RFC2822 format for gmt 0000hrs is changed from -0000 to +0000. + In PHP4, we will still use -0000 for 100% compat with PHP4. + +- 08 Sept 2005 0.22 +In adodb_date2(), $is_gmt not supported properly. Fixed. + +- 18 July 2005 0.21 +In PHP 4.3.11, the 'r' format has changed. Leading 0 in day is added. Changed for compat. +Added support for negative months in adodb_mktime(). + +- 24 Feb 2005 0.20 +Added limited strftime/gmstrftime support. x10 improvement in performance of adodb_date(). + +- 21 Dec 2004 0.17 +In adodb_getdate(), the timestamp was accidentally converted to gmt when $is_gmt is false. +Also adodb_mktime(0,0,0) did not work properly. Both fixed thx Mauro. + +- 17 Nov 2004 0.16 +Removed intval typecast in adodb_mktime() for secs, allowing: + adodb_mktime(0,0,0 + 2236672153,1,1,1934); +Suggested by Ryan. + +- 18 July 2004 0.15 +All params in adodb_mktime were formerly compulsory. Now only the hour, min, secs is compulsory. +This brings it more in line with mktime (still not identical). + +- 23 June 2004 0.14 + +Allow you to define your own daylights savings function, adodb_daylight_sv. +If the function is defined (somewhere in an include), then you can correct for daylights savings. + +In this example, we apply daylights savings in June or July, adding one hour. This is extremely +unrealistic as it does not take into account time-zone, geographic location, current year. + +function adodb_daylight_sv(&$arr, $is_gmt) +{ + if ($is_gmt) return; + $m = $arr['mon']; + if ($m == 6 || $m == 7) $arr['hours'] += 1; +} + +This is only called by adodb_date() and not by adodb_mktime(). + +The format of $arr is +Array ( + [seconds] => 0 + [minutes] => 0 + [hours] => 0 + [mday] => 1 # day of month, eg 1st day of the month + [mon] => 2 # month (eg. Feb) + [year] => 2102 + [yday] => 31 # days in current year + [leap] => # true if leap year + [ndays] => 28 # no of days in current month + ) + + +- 28 Apr 2004 0.13 +Fixed adodb_date to properly support $is_gmt. Thx to Dimitar Angelov. + +- 20 Mar 2004 0.12 +Fixed month calculation error in adodb_date. 2102-June-01 appeared as 2102-May-32. + +- 26 Oct 2003 0.11 +Because of daylight savings problems (some systems apply daylight savings to +January!!!), changed adodb_get_gmt_diff() to ignore daylight savings. + +- 9 Aug 2003 0.10 +Fixed bug with dates after 2038. +See http://phplens.com/lens/lensforum/msgs.php?id=6980 + +- 1 July 2003 0.09 +Added support for Q (Quarter). +Added adodb_date2(), which accepts ISO date in 2nd param + +- 3 March 2003 0.08 +Added support for 'S' adodb_date() format char. Added constant ADODB_ALLOW_NEGATIVE_TS +if you want PHP to handle negative timestamps between 1901 to 1969. + +- 27 Feb 2003 0.07 +All negative numbers handled by adodb now because of RH 7.3+ problems. +See http://bugs.php.net/bug.php?id=20048&edit=2 + +- 4 Feb 2003 0.06 +Fixed a typo, 1852 changed to 1582! This means that pre-1852 dates +are now correctly handled. + +- 29 Jan 2003 0.05 + +Leap year checking differs under Julian calendar (pre 1582). Also +leap year code optimized by checking for most common case first. + +We also handle month overflow correctly in mktime (eg month set to 13). + +Day overflow for less than one month's days is supported. + +- 28 Jan 2003 0.04 + +Gregorian correction handled. In PHP5, we might throw an error if +mktime uses invalid dates around 5-14 Oct 1582. Released with ADOdb 3.10. +Added limbo 5-14 Oct 1582 check, when we set to 15 Oct 1582. + +- 27 Jan 2003 0.03 + +Fixed some more month problems due to gmt issues. Added constant ADODB_DATE_VERSION. +Fixed calculation of days since start of year for <1970. + +- 27 Jan 2003 0.02 + +Changed _adodb_getdate() to inline leap year checking for better performance. +Fixed problem with time-zones west of GMT +0000. + +- 24 Jan 2003 0.01 + +First implementation. +*/ + + +/* Initialization */ + +/* + Version Number +*/ +define('ADODB_DATE_VERSION',0.30); + +$ADODB_DATETIME_CLASS = (PHP_VERSION >= 5.2); + +/* + This code was originally for windows. But apparently this problem happens + also with Linux, RH 7.3 and later! + + glibc-2.2.5-34 and greater has been changed to return -1 for dates < + 1970. This used to work. The problem exists with RedHat 7.3 and 8.0 + echo (mktime(0, 0, 0, 1, 1, 1960)); // prints -1 + + References: + http://bugs.php.net/bug.php?id=20048&edit=2 + http://lists.debian.org/debian-glibc/2002/debian-glibc-200205/msg00010.html +*/ + +if (!defined('ADODB_ALLOW_NEGATIVE_TS')) define('ADODB_NO_NEGATIVE_TS',1); + +function adodb_date_test_date($y1,$m,$d=13) +{ + $h = round(rand()% 24); + $t = adodb_mktime($h,0,0,$m,$d,$y1); + $rez = adodb_date('Y-n-j H:i:s',$t); + if ($h == 0) $h = '00'; + else if ($h < 10) $h = '0'.$h; + if ("$y1-$m-$d $h:00:00" != $rez) { + print "$y1 error, expected=$y1-$m-$d $h:00:00, adodb=$rez
    "; + return false; + } + return true; +} + +function adodb_date_test_strftime($fmt) +{ + $s1 = strftime($fmt); + $s2 = adodb_strftime($fmt); + + if ($s1 == $s2) return true; + + echo "error for $fmt, strftime=$s1, adodb=$s2
    "; + return false; +} + +/** + Test Suite +*/ +function adodb_date_test() +{ + + error_reporting(E_ALL); + print "

    Testing adodb_date and adodb_mktime. version=".ADODB_DATE_VERSION.' PHP='.PHP_VERSION."

    "; + @set_time_limit(0); + $fail = false; + + // This flag disables calling of PHP native functions, so we can properly test the code + if (!defined('ADODB_TEST_DATES')) define('ADODB_TEST_DATES',1); + + $t = time(); + + + $fmt = 'Y-m-d H:i:s'; + echo '
    ';
    +	echo 'adodb: ',adodb_date($fmt,$t),'
    '; + echo 'php : ',date($fmt,$t),'
    '; + echo '
    '; + + adodb_date_test_strftime('%Y %m %x %X'); + adodb_date_test_strftime("%A %d %B %Y"); + adodb_date_test_strftime("%H %M S"); + + $t = adodb_mktime(0,0,0); + if (!(adodb_date('Y-m-d') == date('Y-m-d'))) print 'Error in '.adodb_mktime(0,0,0).'
    '; + + $t = adodb_mktime(0,0,0,6,1,2102); + if (!(adodb_date('Y-m-d',$t) == '2102-06-01')) print 'Error in '.adodb_date('Y-m-d',$t).'
    '; + + $t = adodb_mktime(0,0,0,2,1,2102); + if (!(adodb_date('Y-m-d',$t) == '2102-02-01')) print 'Error in '.adodb_date('Y-m-d',$t).'
    '; + + + print "

    Testing gregorian <=> julian conversion

    "; + $t = adodb_mktime(0,0,0,10,11,1492); + //http://www.holidayorigins.com/html/columbus_day.html - Friday check + if (!(adodb_date('D Y-m-d',$t) == 'Fri 1492-10-11')) print 'Error in Columbus landing
    '; + + $t = adodb_mktime(0,0,0,2,29,1500); + if (!(adodb_date('Y-m-d',$t) == '1500-02-29')) print 'Error in julian leap years
    '; + + $t = adodb_mktime(0,0,0,2,29,1700); + if (!(adodb_date('Y-m-d',$t) == '1700-03-01')) print 'Error in gregorian leap years
    '; + + print adodb_mktime(0,0,0,10,4,1582).' '; + print adodb_mktime(0,0,0,10,15,1582); + $diff = (adodb_mktime(0,0,0,10,15,1582) - adodb_mktime(0,0,0,10,4,1582)); + if ($diff != 3600*24) print " Error in gregorian correction = ".($diff/3600/24)." days
    "; + + print " 15 Oct 1582, Fri=".(adodb_dow(1582,10,15) == 5 ? 'Fri' : 'Error')."
    "; + print " 4 Oct 1582, Thu=".(adodb_dow(1582,10,4) == 4 ? 'Thu' : 'Error')."
    "; + + print "

    Testing overflow

    "; + + $t = adodb_mktime(0,0,0,3,33,1965); + if (!(adodb_date('Y-m-d',$t) == '1965-04-02')) print 'Error in day overflow 1
    '; + $t = adodb_mktime(0,0,0,4,33,1971); + if (!(adodb_date('Y-m-d',$t) == '1971-05-03')) print 'Error in day overflow 2
    '; + $t = adodb_mktime(0,0,0,1,60,1965); + if (!(adodb_date('Y-m-d',$t) == '1965-03-01')) print 'Error in day overflow 3 '.adodb_date('Y-m-d',$t).'
    '; + $t = adodb_mktime(0,0,0,12,32,1965); + if (!(adodb_date('Y-m-d',$t) == '1966-01-01')) print 'Error in day overflow 4 '.adodb_date('Y-m-d',$t).'
    '; + $t = adodb_mktime(0,0,0,12,63,1965); + if (!(adodb_date('Y-m-d',$t) == '1966-02-01')) print 'Error in day overflow 5 '.adodb_date('Y-m-d',$t).'
    '; + $t = adodb_mktime(0,0,0,13,3,1965); + if (!(adodb_date('Y-m-d',$t) == '1966-01-03')) print 'Error in mth overflow 1
    '; + + print "Testing 2-digit => 4-digit year conversion

    "; + if (adodb_year_digit_check(00) != 2000) print "Err 2-digit 2000
    "; + if (adodb_year_digit_check(10) != 2010) print "Err 2-digit 2010
    "; + if (adodb_year_digit_check(20) != 2020) print "Err 2-digit 2020
    "; + if (adodb_year_digit_check(30) != 2030) print "Err 2-digit 2030
    "; + if (adodb_year_digit_check(40) != 1940) print "Err 2-digit 1940
    "; + if (adodb_year_digit_check(50) != 1950) print "Err 2-digit 1950
    "; + if (adodb_year_digit_check(90) != 1990) print "Err 2-digit 1990
    "; + + // Test string formating + print "

    Testing date formating

    "; + + $fmt = '\d\a\t\e T Y-m-d H:i:s a A d D F g G h H i j l L m M n O \R\F\C2822 r s t U w y Y z Z 2003'; + $s1 = date($fmt,0); + $s2 = adodb_date($fmt,0); + if ($s1 != $s2) { + print " date() 0 failed
    $s1
    $s2
    "; + } + flush(); + for ($i=100; --$i > 0; ) { + + $ts = 3600.0*((rand()%60000)+(rand()%60000))+(rand()%60000); + $s1 = date($fmt,$ts); + $s2 = adodb_date($fmt,$ts); + //print "$s1
    $s2

    "; + $pos = strcmp($s1,$s2); + + if (($s1) != ($s2)) { + for ($j=0,$k=strlen($s1); $j < $k; $j++) { + if ($s1[$j] != $s2[$j]) { + print substr($s1,$j).' '; + break; + } + } + print "Error date(): $ts

     
    +  \"$s1\" (date len=".strlen($s1).")
    +  \"$s2\" (adodb_date len=".strlen($s2).")

    "; + $fail = true; + } + + $a1 = getdate($ts); + $a2 = adodb_getdate($ts); + $rez = array_diff($a1,$a2); + if (sizeof($rez)>0) { + print "Error getdate() $ts
    "; + print_r($a1); + print "
    "; + print_r($a2); + print "

    "; + $fail = true; + } + } + + // Test generation of dates outside 1901-2038 + print "

    Testing random dates between 100 and 4000

    "; + adodb_date_test_date(100,1); + for ($i=100; --$i >= 0;) { + $y1 = 100+rand(0,1970-100); + $m = rand(1,12); + adodb_date_test_date($y1,$m); + + $y1 = 3000-rand(0,3000-1970); + adodb_date_test_date($y1,$m); + } + print '

    '; + $start = 1960+rand(0,10); + $yrs = 12; + $i = 365.25*86400*($start-1970); + $offset = 36000+rand(10000,60000); + $max = 365*$yrs*86400; + $lastyear = 0; + + // we generate a timestamp, convert it to a date, and convert it back to a timestamp + // and check if the roundtrip broke the original timestamp value. + print "Testing $start to ".($start+$yrs).", or $max seconds, offset=$offset: "; + $cnt = 0; + for ($max += $i; $i < $max; $i += $offset) { + $ret = adodb_date('m,d,Y,H,i,s',$i); + $arr = explode(',',$ret); + if ($lastyear != $arr[2]) { + $lastyear = $arr[2]; + print " $lastyear "; + flush(); + } + $newi = adodb_mktime($arr[3],$arr[4],$arr[5],$arr[0],$arr[1],$arr[2]); + if ($i != $newi) { + print "Error at $i, adodb_mktime returned $newi ($ret)"; + $fail = true; + break; + } + $cnt += 1; + } + echo "Tested $cnt dates
    "; + if (!$fail) print "

    Passed !

    "; + else print "

    Failed :-(

    "; +} + +/** + Returns day of week, 0 = Sunday,... 6=Saturday. + Algorithm from PEAR::Date_Calc +*/ +function adodb_dow($year, $month, $day) +{ +/* +Pope Gregory removed 10 days - October 5 to October 14 - from the year 1582 and +proclaimed that from that time onwards 3 days would be dropped from the calendar +every 400 years. + +Thursday, October 4, 1582 (Julian) was followed immediately by Friday, October 15, 1582 (Gregorian). +*/ + if ($year <= 1582) { + if ($year < 1582 || + ($year == 1582 && ($month < 10 || ($month == 10 && $day < 15)))) $greg_correction = 3; + else + $greg_correction = 0; + } else + $greg_correction = 0; + + if($month > 2) + $month -= 2; + else { + $month += 10; + $year--; + } + + $day = floor((13 * $month - 1) / 5) + + $day + ($year % 100) + + floor(($year % 100) / 4) + + floor(($year / 100) / 4) - 2 * + floor($year / 100) + 77 + $greg_correction; + + return $day - 7 * floor($day / 7); +} + + +/** + Checks for leap year, returns true if it is. No 2-digit year check. Also + handles julian calendar correctly. +*/ +function _adodb_is_leap_year($year) +{ + if ($year % 4 != 0) return false; + + if ($year % 400 == 0) { + return true; + // if gregorian calendar (>1582), century not-divisible by 400 is not leap + } else if ($year > 1582 && $year % 100 == 0 ) { + return false; + } + + return true; +} + + +/** + checks for leap year, returns true if it is. Has 2-digit year check +*/ +function adodb_is_leap_year($year) +{ + return _adodb_is_leap_year(adodb_year_digit_check($year)); +} + +/** + Fix 2-digit years. Works for any century. + Assumes that if 2-digit is more than 30 years in future, then previous century. +*/ +function adodb_year_digit_check($y) +{ + if ($y < 100) { + + $yr = (integer) date("Y"); + $century = (integer) ($yr /100); + + if ($yr%100 > 50) { + $c1 = $century + 1; + $c0 = $century; + } else { + $c1 = $century; + $c0 = $century - 1; + } + $c1 *= 100; + // if 2-digit year is less than 30 years in future, set it to this century + // otherwise if more than 30 years in future, then we set 2-digit year to the prev century. + if (($y + $c1) < $yr+30) $y = $y + $c1; + else $y = $y + $c0*100; + } + return $y; +} + +function adodb_get_gmt_diff_ts($ts) +{ + if (0 <= $ts && $ts <= 0x7FFFFFFF) { // check if number in 32-bit signed range) { + $arr = getdate($ts); + $y = $arr['year']; + $m = $arr['mon']; + $d = $arr['mday']; + return adodb_get_gmt_diff($y,$m,$d); +} else { + return adodb_get_gmt_diff(false,false,false); + } + +} + +/** + get local time zone offset from GMT. Does not handle historical timezones before 1970. +*/ +function adodb_get_gmt_diff($y,$m,$d) +{ +static $TZ,$tzo; +global $ADODB_DATETIME_CLASS; + + if (!defined('ADODB_TEST_DATES')) $y = false; + else if ($y < 1970 || $y >= 2038) $y = false; + + if ($ADODB_DATETIME_CLASS && $y !== false) { + $dt = new DateTime(); + $dt->setISODate($y,$m,$d); + if (empty($tzo)) { + $tzo = new DateTimeZone(date_default_timezone_get()); + # $tzt = timezone_transitions_get( $tzo ); + } + return -$tzo->getOffset($dt); + } else { + if (isset($TZ)) return $TZ; + $y = date('Y'); + $TZ = mktime(0,0,0,12,2,$y,0) - gmmktime(0,0,0,12,2,$y,0); + } + + return $TZ; +} + +/** + Returns an array with date info. +*/ +function adodb_getdate($d=false,$fast=false) +{ + if ($d === false) return getdate(); + if (!defined('ADODB_TEST_DATES')) { + if ((abs($d) <= 0x7FFFFFFF)) { // check if number in 32-bit signed range + if (!defined('ADODB_NO_NEGATIVE_TS') || $d >= 0) // if windows, must be +ve integer + return @getdate($d); + } + } + return _adodb_getdate($d); +} + +/* +// generate $YRS table for _adodb_getdate() +function adodb_date_gentable($out=true) +{ + + for ($i=1970; $i >= 1600; $i-=10) { + $s = adodb_gmmktime(0,0,0,1,1,$i); + echo "$i => $s,
    "; + } +} +adodb_date_gentable(); + +for ($i=1970; $i > 1500; $i--) { + +echo "
    $i "; + adodb_date_test_date($i,1,1); +} + +*/ + + +$_month_table_normal = array("",31,28,31,30,31,30,31,31,30,31,30,31); +$_month_table_leaf = array("",31,29,31,30,31,30,31,31,30,31,30,31); + +function adodb_validdate($y,$m,$d) +{ +global $_month_table_normal,$_month_table_leaf; + + if (_adodb_is_leap_year($y)) $marr = $_month_table_leaf; + else $marr = $_month_table_normal; + + if ($m > 12 || $m < 1) return false; + + if ($d > 31 || $d < 1) return false; + + if ($marr[$m] < $d) return false; + + if ($y < 1000 && $y > 3000) return false; + + return true; +} + +/** + Low-level function that returns the getdate() array. We have a special + $fast flag, which if set to true, will return fewer array values, + and is much faster as it does not calculate dow, etc. +*/ +function _adodb_getdate($origd=false,$fast=false,$is_gmt=false) +{ +static $YRS; +global $_month_table_normal,$_month_table_leaf; + + $d = $origd - ($is_gmt ? 0 : adodb_get_gmt_diff_ts($origd)); + $_day_power = 86400; + $_hour_power = 3600; + $_min_power = 60; + + if ($d < -12219321600) $d -= 86400*10; // if 15 Oct 1582 or earlier, gregorian correction + + $_month_table_normal = array("",31,28,31,30,31,30,31,31,30,31,30,31); + $_month_table_leaf = array("",31,29,31,30,31,30,31,31,30,31,30,31); + + $d366 = $_day_power * 366; + $d365 = $_day_power * 365; + + if ($d < 0) { + + if (empty($YRS)) $YRS = array( + 1970 => 0, + 1960 => -315619200, + 1950 => -631152000, + 1940 => -946771200, + 1930 => -1262304000, + 1920 => -1577923200, + 1910 => -1893456000, + 1900 => -2208988800, + 1890 => -2524521600, + 1880 => -2840140800, + 1870 => -3155673600, + 1860 => -3471292800, + 1850 => -3786825600, + 1840 => -4102444800, + 1830 => -4417977600, + 1820 => -4733596800, + 1810 => -5049129600, + 1800 => -5364662400, + 1790 => -5680195200, + 1780 => -5995814400, + 1770 => -6311347200, + 1760 => -6626966400, + 1750 => -6942499200, + 1740 => -7258118400, + 1730 => -7573651200, + 1720 => -7889270400, + 1710 => -8204803200, + 1700 => -8520336000, + 1690 => -8835868800, + 1680 => -9151488000, + 1670 => -9467020800, + 1660 => -9782640000, + 1650 => -10098172800, + 1640 => -10413792000, + 1630 => -10729324800, + 1620 => -11044944000, + 1610 => -11360476800, + 1600 => -11676096000); + + if ($is_gmt) $origd = $d; + // The valid range of a 32bit signed timestamp is typically from + // Fri, 13 Dec 1901 20:45:54 GMT to Tue, 19 Jan 2038 03:14:07 GMT + // + + # old algorithm iterates through all years. new algorithm does it in + # 10 year blocks + + /* + # old algo + for ($a = 1970 ; --$a >= 0;) { + $lastd = $d; + + if ($leaf = _adodb_is_leap_year($a)) $d += $d366; + else $d += $d365; + + if ($d >= 0) { + $year = $a; + break; + } + } + */ + + $lastsecs = 0; + $lastyear = 1970; + foreach($YRS as $year => $secs) { + if ($d >= $secs) { + $a = $lastyear; + break; + } + $lastsecs = $secs; + $lastyear = $year; + } + + $d -= $lastsecs; + if (!isset($a)) $a = $lastyear; + + //echo ' yr=',$a,' ', $d,'.'; + + for (; --$a >= 0;) { + $lastd = $d; + + if ($leaf = _adodb_is_leap_year($a)) $d += $d366; + else $d += $d365; + + if ($d >= 0) { + $year = $a; + break; + } + } + /**/ + + $secsInYear = 86400 * ($leaf ? 366 : 365) + $lastd; + + $d = $lastd; + $mtab = ($leaf) ? $_month_table_leaf : $_month_table_normal; + for ($a = 13 ; --$a > 0;) { + $lastd = $d; + $d += $mtab[$a] * $_day_power; + if ($d >= 0) { + $month = $a; + $ndays = $mtab[$a]; + break; + } + } + + $d = $lastd; + $day = $ndays + ceil(($d+1) / ($_day_power)); + + $d += ($ndays - $day+1)* $_day_power; + $hour = floor($d/$_hour_power); + + } else { + for ($a = 1970 ;; $a++) { + $lastd = $d; + + if ($leaf = _adodb_is_leap_year($a)) $d -= $d366; + else $d -= $d365; + if ($d < 0) { + $year = $a; + break; + } + } + $secsInYear = $lastd; + $d = $lastd; + $mtab = ($leaf) ? $_month_table_leaf : $_month_table_normal; + for ($a = 1 ; $a <= 12; $a++) { + $lastd = $d; + $d -= $mtab[$a] * $_day_power; + if ($d < 0) { + $month = $a; + $ndays = $mtab[$a]; + break; + } + } + $d = $lastd; + $day = ceil(($d+1) / $_day_power); + $d = $d - ($day-1) * $_day_power; + $hour = floor($d /$_hour_power); + } + + $d -= $hour * $_hour_power; + $min = floor($d/$_min_power); + $secs = $d - $min * $_min_power; + if ($fast) { + return array( + 'seconds' => $secs, + 'minutes' => $min, + 'hours' => $hour, + 'mday' => $day, + 'mon' => $month, + 'year' => $year, + 'yday' => floor($secsInYear/$_day_power), + 'leap' => $leaf, + 'ndays' => $ndays + ); + } + + + $dow = adodb_dow($year,$month,$day); + + return array( + 'seconds' => $secs, + 'minutes' => $min, + 'hours' => $hour, + 'mday' => $day, + 'wday' => $dow, + 'mon' => $month, + 'year' => $year, + 'yday' => floor($secsInYear/$_day_power), + 'weekday' => gmdate('l',$_day_power*(3+$dow)), + 'month' => gmdate('F',mktime(0,0,0,$month,2,1971)), + 0 => $origd + ); +} +/* + if ($isphp5) + $dates .= sprintf('%s%04d',($gmt<=0)?'+':'-',abs($gmt)/36); + else + $dates .= sprintf('%s%04d',($gmt<0)?'+':'-',abs($gmt)/36); + break;*/ +function adodb_tz_offset($gmt,$isphp5) +{ + $zhrs = abs($gmt)/3600; + $hrs = floor($zhrs); + if ($isphp5) + return sprintf('%s%02d%02d',($gmt<=0)?'+':'-',floor($zhrs),($zhrs-$hrs)*60); + else + return sprintf('%s%02d%02d',($gmt<0)?'+':'-',floor($zhrs),($zhrs-$hrs)*60); + break; +} + + +function adodb_gmdate($fmt,$d=false) +{ + return adodb_date($fmt,$d,true); +} + +// accepts unix timestamp and iso date format in $d +function adodb_date2($fmt, $d=false, $is_gmt=false) +{ + if ($d !== false) { + if (!preg_match( + "|^([0-9]{4})[-/\.]?([0-9]{1,2})[-/\.]?([0-9]{1,2})[ -]?(([0-9]{1,2}):?([0-9]{1,2}):?([0-9\.]{1,4}))?|", + ($d), $rr)) return adodb_date($fmt,false,$is_gmt); + + if ($rr[1] <= 100 && $rr[2]<= 1) return adodb_date($fmt,false,$is_gmt); + + // h-m-s-MM-DD-YY + if (!isset($rr[5])) $d = adodb_mktime(0,0,0,$rr[2],$rr[3],$rr[1],false,$is_gmt); + else $d = @adodb_mktime($rr[5],$rr[6],$rr[7],$rr[2],$rr[3],$rr[1],false,$is_gmt); + } + + return adodb_date($fmt,$d,$is_gmt); +} + + +/** + Return formatted date based on timestamp $d +*/ +function adodb_date($fmt,$d=false,$is_gmt=false) +{ +static $daylight; +global $ADODB_DATETIME_CLASS; + + if ($d === false) return ($is_gmt)? @gmdate($fmt): @date($fmt); + if (!defined('ADODB_TEST_DATES')) { + if ((abs($d) <= 0x7FFFFFFF)) { // check if number in 32-bit signed range + if (!defined('ADODB_NO_NEGATIVE_TS') || $d >= 0) // if windows, must be +ve integer + return ($is_gmt)? @gmdate($fmt,$d): @date($fmt,$d); + + } + } + $_day_power = 86400; + + $arr = _adodb_getdate($d,true,$is_gmt); + + if (!isset($daylight)) $daylight = function_exists('adodb_daylight_sv'); + if ($daylight) adodb_daylight_sv($arr, $is_gmt); + + $year = $arr['year']; + $month = $arr['mon']; + $day = $arr['mday']; + $hour = $arr['hours']; + $min = $arr['minutes']; + $secs = $arr['seconds']; + + $max = strlen($fmt); + $dates = ''; + + $isphp5 = PHP_VERSION >= 5; + + /* + at this point, we have the following integer vars to manipulate: + $year, $month, $day, $hour, $min, $secs + */ + for ($i=0; $i < $max; $i++) { + switch($fmt[$i]) { + case 'T': + if ($ADODB_DATETIME_CLASS) { + $dt = new DateTime(); + $dt->SetDate($year,$month,$day); + $dates .= $dt->Format('T'); + } else + $dates .= date('T'); + break; + // YEAR + case 'L': $dates .= $arr['leap'] ? '1' : '0'; break; + case 'r': // Thu, 21 Dec 2000 16:01:07 +0200 + + // 4.3.11 uses '04 Jun 2004' + // 4.3.8 uses ' 4 Jun 2004' + $dates .= gmdate('D',$_day_power*(3+adodb_dow($year,$month,$day))).', ' + . ($day<10?'0'.$day:$day) . ' '.date('M',mktime(0,0,0,$month,2,1971)).' '.$year.' '; + + if ($hour < 10) $dates .= '0'.$hour; else $dates .= $hour; + + if ($min < 10) $dates .= ':0'.$min; else $dates .= ':'.$min; + + if ($secs < 10) $dates .= ':0'.$secs; else $dates .= ':'.$secs; + + $gmt = adodb_get_gmt_diff($year,$month,$day); + + $dates .= ' '.adodb_tz_offset($gmt,$isphp5); + break; + + case 'Y': $dates .= $year; break; + case 'y': $dates .= substr($year,strlen($year)-2,2); break; + // MONTH + case 'm': if ($month<10) $dates .= '0'.$month; else $dates .= $month; break; + case 'Q': $dates .= ($month+3)>>2; break; + case 'n': $dates .= $month; break; + case 'M': $dates .= date('M',mktime(0,0,0,$month,2,1971)); break; + case 'F': $dates .= date('F',mktime(0,0,0,$month,2,1971)); break; + // DAY + case 't': $dates .= $arr['ndays']; break; + case 'z': $dates .= $arr['yday']; break; + case 'w': $dates .= adodb_dow($year,$month,$day); break; + case 'l': $dates .= gmdate('l',$_day_power*(3+adodb_dow($year,$month,$day))); break; + case 'D': $dates .= gmdate('D',$_day_power*(3+adodb_dow($year,$month,$day))); break; + case 'j': $dates .= $day; break; + case 'd': if ($day<10) $dates .= '0'.$day; else $dates .= $day; break; + case 'S': + $d10 = $day % 10; + if ($d10 == 1) $dates .= 'st'; + else if ($d10 == 2 && $day != 12) $dates .= 'nd'; + else if ($d10 == 3) $dates .= 'rd'; + else $dates .= 'th'; + break; + + // HOUR + case 'Z': + $dates .= ($is_gmt) ? 0 : -adodb_get_gmt_diff($year,$month,$day); break; + case 'O': + $gmt = ($is_gmt) ? 0 : adodb_get_gmt_diff($year,$month,$day); + + $dates .= adodb_tz_offset($gmt,$isphp5); + break; + + case 'H': + if ($hour < 10) $dates .= '0'.$hour; + else $dates .= $hour; + break; + case 'h': + if ($hour > 12) $hh = $hour - 12; + else { + if ($hour == 0) $hh = '12'; + else $hh = $hour; + } + + if ($hh < 10) $dates .= '0'.$hh; + else $dates .= $hh; + break; + + case 'G': + $dates .= $hour; + break; + + case 'g': + if ($hour > 12) $hh = $hour - 12; + else { + if ($hour == 0) $hh = '12'; + else $hh = $hour; + } + $dates .= $hh; + break; + // MINUTES + case 'i': if ($min < 10) $dates .= '0'.$min; else $dates .= $min; break; + // SECONDS + case 'U': $dates .= $d; break; + case 's': if ($secs < 10) $dates .= '0'.$secs; else $dates .= $secs; break; + // AM/PM + // Note 00:00 to 11:59 is AM, while 12:00 to 23:59 is PM + case 'a': + if ($hour>=12) $dates .= 'pm'; + else $dates .= 'am'; + break; + case 'A': + if ($hour>=12) $dates .= 'PM'; + else $dates .= 'AM'; + break; + default: + $dates .= $fmt[$i]; break; + // ESCAPE + case "\\": + $i++; + if ($i < $max) $dates .= $fmt[$i]; + break; + } + } + return $dates; +} + +/** + Returns a timestamp given a GMT/UTC time. + Note that $is_dst is not implemented and is ignored. +*/ +function adodb_gmmktime($hr,$min,$sec,$mon=false,$day=false,$year=false,$is_dst=false) +{ + return adodb_mktime($hr,$min,$sec,$mon,$day,$year,$is_dst,true); +} + +/** + Return a timestamp given a local time. Originally by jackbbs. + Note that $is_dst is not implemented and is ignored. + + Not a very fast algorithm - O(n) operation. Could be optimized to O(1). +*/ +function adodb_mktime($hr,$min,$sec,$mon=false,$day=false,$year=false,$is_dst=false,$is_gmt=false) +{ + if (!defined('ADODB_TEST_DATES')) { + + if ($mon === false) { + return $is_gmt? @gmmktime($hr,$min,$sec): @mktime($hr,$min,$sec); + } + + // for windows, we don't check 1970 because with timezone differences, + // 1 Jan 1970 could generate negative timestamp, which is illegal + if (1971 < $year && $year < 2038 + || !defined('ADODB_NO_NEGATIVE_TS') && (1901 < $year && $year < 2038) + ) { + return $is_gmt ? + @gmmktime($hr,$min,$sec,$mon,$day,$year): + @mktime($hr,$min,$sec,$mon,$day,$year); + } + } + + $gmt_different = ($is_gmt) ? 0 : adodb_get_gmt_diff($year,$mon,$day); + + /* + # disabled because some people place large values in $sec. + # however we need it for $mon because we use an array... + $hr = intval($hr); + $min = intval($min); + $sec = intval($sec); + */ + $mon = intval($mon); + $day = intval($day); + $year = intval($year); + + + $year = adodb_year_digit_check($year); + + if ($mon > 12) { + $y = floor($mon / 12); + $year += $y; + $mon -= $y*12; + } else if ($mon < 1) { + $y = ceil((1-$mon) / 12); + $year -= $y; + $mon += $y*12; + } + + $_day_power = 86400; + $_hour_power = 3600; + $_min_power = 60; + + $_month_table_normal = array("",31,28,31,30,31,30,31,31,30,31,30,31); + $_month_table_leaf = array("",31,29,31,30,31,30,31,31,30,31,30,31); + + $_total_date = 0; + if ($year >= 1970) { + for ($a = 1970 ; $a <= $year; $a++) { + $leaf = _adodb_is_leap_year($a); + if ($leaf == true) { + $loop_table = $_month_table_leaf; + $_add_date = 366; + } else { + $loop_table = $_month_table_normal; + $_add_date = 365; + } + if ($a < $year) { + $_total_date += $_add_date; + } else { + for($b=1;$b<$mon;$b++) { + $_total_date += $loop_table[$b]; + } + } + } + $_total_date +=$day-1; + $ret = $_total_date * $_day_power + $hr * $_hour_power + $min * $_min_power + $sec + $gmt_different; + + } else { + for ($a = 1969 ; $a >= $year; $a--) { + $leaf = _adodb_is_leap_year($a); + if ($leaf == true) { + $loop_table = $_month_table_leaf; + $_add_date = 366; + } else { + $loop_table = $_month_table_normal; + $_add_date = 365; + } + if ($a > $year) { $_total_date += $_add_date; + } else { + for($b=12;$b>$mon;$b--) { + $_total_date += $loop_table[$b]; + } + } + } + $_total_date += $loop_table[$mon] - $day; + + $_day_time = $hr * $_hour_power + $min * $_min_power + $sec; + $_day_time = $_day_power - $_day_time; + $ret = -( $_total_date * $_day_power + $_day_time - $gmt_different); + if ($ret < -12220185600) $ret += 10*86400; // if earlier than 5 Oct 1582 - gregorian correction + else if ($ret < -12219321600) $ret = -12219321600; // if in limbo, reset to 15 Oct 1582. + } + //print " dmy=$day/$mon/$year $hr:$min:$sec => " .$ret; + return $ret; +} + +function adodb_gmstrftime($fmt, $ts=false) +{ + return adodb_strftime($fmt,$ts,true); +} + +// hack - convert to adodb_date +function adodb_strftime($fmt, $ts=false,$is_gmt=false) +{ +global $ADODB_DATE_LOCALE; + + if (!defined('ADODB_TEST_DATES')) { + if ((abs($ts) <= 0x7FFFFFFF)) { // check if number in 32-bit signed range + if (!defined('ADODB_NO_NEGATIVE_TS') || $ts >= 0) // if windows, must be +ve integer + return ($is_gmt)? @gmstrftime($fmt,$ts): @strftime($fmt,$ts); + + } + } + + if (empty($ADODB_DATE_LOCALE)) { + /* + $tstr = strtoupper(gmstrftime('%c',31366800)); // 30 Dec 1970, 1 am + $sep = substr($tstr,2,1); + $hasAM = strrpos($tstr,'M') !== false; + */ + # see http://phplens.com/lens/lensforum/msgs.php?id=14865 for reasoning, and changelog for version 0.24 + $dstr = gmstrftime('%x',31366800); // 30 Dec 1970, 1 am + $sep = substr($dstr,2,1); + $tstr = strtoupper(gmstrftime('%X',31366800)); // 30 Dec 1970, 1 am + $hasAM = strrpos($tstr,'M') !== false; + + $ADODB_DATE_LOCALE = array(); + $ADODB_DATE_LOCALE[] = strncmp($tstr,'30',2) == 0 ? 'd'.$sep.'m'.$sep.'y' : 'm'.$sep.'d'.$sep.'y'; + $ADODB_DATE_LOCALE[] = ($hasAM) ? 'h:i:s a' : 'H:i:s'; + + } + $inpct = false; + $fmtdate = ''; + for ($i=0,$max = strlen($fmt); $i < $max; $i++) { + $ch = $fmt[$i]; + if ($ch == '%') { + if ($inpct) { + $fmtdate .= '%'; + $inpct = false; + } else + $inpct = true; + } else if ($inpct) { + + $inpct = false; + switch($ch) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'E': + case 'O': + /* ignore format modifiers */ + $inpct = true; + break; + + case 'a': $fmtdate .= 'D'; break; + case 'A': $fmtdate .= 'l'; break; + case 'h': + case 'b': $fmtdate .= 'M'; break; + case 'B': $fmtdate .= 'F'; break; + case 'c': $fmtdate .= $ADODB_DATE_LOCALE[0].$ADODB_DATE_LOCALE[1]; break; + case 'C': $fmtdate .= '\C?'; break; // century + case 'd': $fmtdate .= 'd'; break; + case 'D': $fmtdate .= 'm/d/y'; break; + case 'e': $fmtdate .= 'j'; break; + case 'g': $fmtdate .= '\g?'; break; //? + case 'G': $fmtdate .= '\G?'; break; //? + case 'H': $fmtdate .= 'H'; break; + case 'I': $fmtdate .= 'h'; break; + case 'j': $fmtdate .= '?z'; $parsej = true; break; // wrong as j=1-based, z=0-basd + case 'm': $fmtdate .= 'm'; break; + case 'M': $fmtdate .= 'i'; break; + case 'n': $fmtdate .= "\n"; break; + case 'p': $fmtdate .= 'a'; break; + case 'r': $fmtdate .= 'h:i:s a'; break; + case 'R': $fmtdate .= 'H:i:s'; break; + case 'S': $fmtdate .= 's'; break; + case 't': $fmtdate .= "\t"; break; + case 'T': $fmtdate .= 'H:i:s'; break; + case 'u': $fmtdate .= '?u'; $parseu = true; break; // wrong strftime=1-based, date=0-based + case 'U': $fmtdate .= '?U'; $parseU = true; break;// wrong strftime=1-based, date=0-based + case 'x': $fmtdate .= $ADODB_DATE_LOCALE[0]; break; + case 'X': $fmtdate .= $ADODB_DATE_LOCALE[1]; break; + case 'w': $fmtdate .= '?w'; $parseu = true; break; // wrong strftime=1-based, date=0-based + case 'W': $fmtdate .= '?W'; $parseU = true; break;// wrong strftime=1-based, date=0-based + case 'y': $fmtdate .= 'y'; break; + case 'Y': $fmtdate .= 'Y'; break; + case 'Z': $fmtdate .= 'T'; break; + } + } else if (('A' <= ($ch) && ($ch) <= 'Z' ) || ('a' <= ($ch) && ($ch) <= 'z' )) + $fmtdate .= "\\".$ch; + else + $fmtdate .= $ch; + } + //echo "fmt=",$fmtdate,"
    "; + if ($ts === false) $ts = time(); + $ret = adodb_date($fmtdate, $ts, $is_gmt); + return $ret; +} + + +?> \ No newline at end of file diff --git a/upload/includes/adodb/adodb.inc.php b/upload/includes/adodb/adodb.inc.php new file mode 100644 index 00000000..176c45ec --- /dev/null +++ b/upload/includes/adodb/adodb.inc.php @@ -0,0 +1,4244 @@ +fields is available on EOF + $ADODB_FETCH_MODE, // DEFAULT, NUM, ASSOC or BOTH. Default follows native driver default... + $ADODB_QUOTE_FIELDNAMES; // Allows you to force quotes (backticks) around field names in queries generated by getinsertsql and getupdatesql. + + //============================================================================================== + // GLOBAL SETUP + //============================================================================================== + + $ADODB_EXTENSION = defined('ADODB_EXTENSION'); + + //********************************************************// + /* + Controls $ADODB_FORCE_TYPE mode. Default is ADODB_FORCE_VALUE (3). + Used in GetUpdateSql and GetInsertSql functions. Thx to Niko, nuko#mbnet.fi + + 0 = ignore empty fields. All empty fields in array are ignored. + 1 = force null. All empty, php null and string 'null' fields are changed to sql NULL values. + 2 = force empty. All empty, php null and string 'null' fields are changed to sql empty '' or 0 values. + 3 = force value. Value is left as it is. Php null and string 'null' are set to sql NULL values and empty fields '' are set to empty '' sql values. + */ + define('ADODB_FORCE_IGNORE',0); + define('ADODB_FORCE_NULL',1); + define('ADODB_FORCE_EMPTY',2); + define('ADODB_FORCE_VALUE',3); + //********************************************************// + + + if (!$ADODB_EXTENSION || ADODB_EXTENSION < 4.0) { + + define('ADODB_BAD_RS','

    Bad $rs in %s. Connection or SQL invalid. Try using $connection->debug=true;

    '); + + // allow [ ] @ ` " and . in table names + define('ADODB_TABLE_REGEX','([]0-9a-z_\:\"\`\.\@\[-]*)'); + + // prefetching used by oracle + if (!defined('ADODB_PREFETCH_ROWS')) define('ADODB_PREFETCH_ROWS',10); + + + /* + Controls ADODB_FETCH_ASSOC field-name case. Default is 2, use native case-names. + This currently works only with mssql, odbc, oci8po and ibase derived drivers. + + 0 = assoc lowercase field names. $rs->fields['orderid'] + 1 = assoc uppercase field names. $rs->fields['ORDERID'] + 2 = use native-case field names. $rs->fields['OrderID'] + */ + + define('ADODB_FETCH_DEFAULT',0); + define('ADODB_FETCH_NUM',1); + define('ADODB_FETCH_ASSOC',2); + define('ADODB_FETCH_BOTH',3); + + if (!defined('TIMESTAMP_FIRST_YEAR')) define('TIMESTAMP_FIRST_YEAR',100); + + // PHP's version scheme makes converting to numbers difficult - workaround + $_adodb_ver = (float) PHP_VERSION; + if ($_adodb_ver >= 5.2) { + define('ADODB_PHPVER',0x5200); + } else if ($_adodb_ver >= 5.0) { + define('ADODB_PHPVER',0x5000); + } else if ($_adodb_ver > 4.299999) { # 4.3 + define('ADODB_PHPVER',0x4300); + } else if ($_adodb_ver > 4.199999) { # 4.2 + define('ADODB_PHPVER',0x4200); + } else if (strnatcmp(PHP_VERSION,'4.0.5')>=0) { + define('ADODB_PHPVER',0x4050); + } else { + define('ADODB_PHPVER',0x4000); + } + } + + //if (!defined('ADODB_ASSOC_CASE')) define('ADODB_ASSOC_CASE',2); + + + /** + Accepts $src and $dest arrays, replacing string $data + */ + function ADODB_str_replace($src, $dest, $data) + { + if (ADODB_PHPVER >= 0x4050) return str_replace($src,$dest,$data); + + $s = reset($src); + $d = reset($dest); + while ($s !== false) { + $data = str_replace($s,$d,$data); + $s = next($src); + $d = next($dest); + } + return $data; + } + + function ADODB_Setup() + { + GLOBAL + $ADODB_vers, // database version + $ADODB_COUNTRECS, // count number of records returned - slows down query + $ADODB_CACHE_DIR, // directory to cache recordsets + $ADODB_FETCH_MODE, + $ADODB_FORCE_TYPE, + $ADODB_QUOTE_FIELDNAMES; + + $ADODB_FETCH_MODE = ADODB_FETCH_DEFAULT; + $ADODB_FORCE_TYPE = ADODB_FORCE_VALUE; + + + if (!isset($ADODB_CACHE_DIR)) { + $ADODB_CACHE_DIR = '/tmp'; //(isset($_ENV['TMP'])) ? $_ENV['TMP'] : '/tmp'; + } else { + // do not accept url based paths, eg. http:/ or ftp:/ + if (strpos($ADODB_CACHE_DIR,'://') !== false) + die("Illegal path http:// or ftp://"); + } + + + // Initialize random number generator for randomizing cache flushes + // -- note Since PHP 4.2.0, the seed becomes optional and defaults to a random value if omitted. + srand(((double)microtime())*1000000); + + /** + * ADODB version as a string. + */ + $ADODB_vers = 'V4.96 24 Sept 2007 (c) 2000-2007 John Lim (jlim#natsoft.com.my). All rights reserved. Released BSD & LGPL.'; + + /** + * Determines whether recordset->RecordCount() is used. + * Set to false for highest performance -- RecordCount() will always return -1 then + * for databases that provide "virtual" recordcounts... + */ + if (!isset($ADODB_COUNTRECS)) $ADODB_COUNTRECS = true; + } + + + //============================================================================================== + // CHANGE NOTHING BELOW UNLESS YOU ARE DESIGNING ADODB + //============================================================================================== + + ADODB_Setup(); + + //============================================================================================== + // CLASS ADOFieldObject + //============================================================================================== + /** + * Helper class for FetchFields -- holds info on a column + */ + class ADOFieldObject { + var $name = ''; + var $max_length=0; + var $type=""; +/* + // additional fields by dannym... (danny_milo@yahoo.com) + var $not_null = false; + // actually, this has already been built-in in the postgres, fbsql AND mysql module? ^-^ + // so we can as well make not_null standard (leaving it at "false" does not harm anyways) + + var $has_default = false; // this one I have done only in mysql and postgres for now ... + // others to come (dannym) + var $default_value; // default, if any, and supported. Check has_default first. +*/ + } + + + + function ADODB_TransMonitor($dbms, $fn, $errno, $errmsg, $p1, $p2, &$thisConnection) + { + //print "Errorno ($fn errno=$errno m=$errmsg) "; + $thisConnection->_transOK = false; + if ($thisConnection->_oldRaiseFn) { + $fn = $thisConnection->_oldRaiseFn; + $fn($dbms, $fn, $errno, $errmsg, $p1, $p2,$thisConnection); + } + } + + //============================================================================================== + // CLASS ADOConnection + //============================================================================================== + + /** + * Connection object. For connecting to databases, and executing queries. + */ + class ADOConnection { + // + // PUBLIC VARS + // + var $dataProvider = 'native'; + var $databaseType = ''; /// RDBMS currently in use, eg. odbc, mysql, mssql + var $database = ''; /// Name of database to be used. + var $host = ''; /// The hostname of the database server + var $user = ''; /// The username which is used to connect to the database server. + var $password = ''; /// Password for the username. For security, we no longer store it. + var $debug = false; /// if set to true will output sql statements + var $maxblobsize = 262144; /// maximum size of blobs or large text fields (262144 = 256K)-- some db's die otherwise like foxpro + var $concat_operator = '+'; /// default concat operator -- change to || for Oracle/Interbase + var $substr = 'substr'; /// substring operator + var $length = 'length'; /// string length ofperator + var $random = 'rand()'; /// random function + var $upperCase = 'upper'; /// uppercase function + var $fmtDate = "'Y-m-d'"; /// used by DBDate() as the default date format used by the database + var $fmtTimeStamp = "'Y-m-d, h:i:s A'"; /// used by DBTimeStamp as the default timestamp fmt. + var $true = '1'; /// string that represents TRUE for a database + var $false = '0'; /// string that represents FALSE for a database + var $replaceQuote = "\\'"; /// string to use to replace quotes + var $nameQuote = '"'; /// string to use to quote identifiers and names + var $charSet=false; /// character set to use - only for interbase, postgres and oci8 + var $metaDatabasesSQL = ''; + var $metaTablesSQL = ''; + var $uniqueOrderBy = false; /// All order by columns have to be unique + var $emptyDate = ' '; + var $emptyTimeStamp = ' '; + var $lastInsID = false; + //-- + var $hasInsertID = false; /// supports autoincrement ID? + var $hasAffectedRows = false; /// supports affected rows for update/delete? + var $hasTop = false; /// support mssql/access SELECT TOP 10 * FROM TABLE + var $hasLimit = false; /// support pgsql/mysql SELECT * FROM TABLE LIMIT 10 + var $readOnly = false; /// this is a readonly database - used by phpLens + var $hasMoveFirst = false; /// has ability to run MoveFirst(), scrolling backwards + var $hasGenID = false; /// can generate sequences using GenID(); + var $hasTransactions = true; /// has transactions + //-- + var $genID = 0; /// sequence id used by GenID(); + var $raiseErrorFn = false; /// error function to call + var $isoDates = false; /// accepts dates in ISO format + var $cacheSecs = 3600; /// cache for 1 hour + + // memcache + var $memCache = false; /// should we use memCache instead of caching in files + var $memCacheHost; /// memCache host + var $memCachePort = 11211; /// memCache port + var $memCacheCompress = false; /// Use 'true' to store the item compressed (uses zlib) + + var $sysDate = false; /// name of function that returns the current date + var $sysTimeStamp = false; /// name of function that returns the current timestamp + var $arrayClass = 'ADORecordSet_array'; /// name of class used to generate array recordsets, which are pre-downloaded recordsets + + var $noNullStrings = false; /// oracle specific stuff - if true ensures that '' is converted to ' ' + var $numCacheHits = 0; + var $numCacheMisses = 0; + var $pageExecuteCountRows = true; + var $uniqueSort = false; /// indicates that all fields in order by must be unique + var $leftOuter = false; /// operator to use for left outer join in WHERE clause + var $rightOuter = false; /// operator to use for right outer join in WHERE clause + var $ansiOuter = false; /// whether ansi outer join syntax supported + var $autoRollback = false; // autoRollback on PConnect(). + var $poorAffectedRows = false; // affectedRows not working or unreliable + + var $fnExecute = false; + var $fnCacheExecute = false; + var $blobEncodeType = false; // false=not required, 'I'=encode to integer, 'C'=encode to char + var $rsPrefix = "ADORecordSet_"; + + var $autoCommit = true; /// do not modify this yourself - actually private + var $transOff = 0; /// temporarily disable transactions + var $transCnt = 0; /// count of nested transactions + + var $fetchMode=false; + var $num_rows = 0; + var $null2null = 'null'; // in autoexecute/getinsertsql/getupdatesql, this value will be converted to a null + // + // PRIVATE VARS + // + var $_oldRaiseFn = false; + var $_transOK = null; + var $_connectionID = false; /// The returned link identifier whenever a successful database connection is made. + var $_errorMsg = false; /// A variable which was used to keep the returned last error message. The value will + /// then returned by the errorMsg() function + var $_errorCode = false; /// Last error code, not guaranteed to be used - only by oci8 + var $_queryID = false; /// This variable keeps the last created result link identifier + + var $_isPersistentConnection = false; /// A boolean variable to state whether its a persistent connection or normal connection. */ + var $_bindInputArray = false; /// set to true if ADOConnection.Execute() permits binding of array parameters. + var $_evalAll = false; + var $_affected = false; + var $_logsql = false; + var $_transmode = ''; // transaction mode + var $db_query = NULL; + + + /** + * Constructor + */ + function ADOConnection() + { + die('Virtual Class -- cannot instantiate'); + } + + function Version() + { + global $ADODB_vers; + + return (float) substr($ADODB_vers,1); + } + + /** + Get server version info... + + @returns An array with 2 elements: $arr['string'] is the description string, + and $arr[version] is the version (also a string). + */ + function ServerInfo() + { + return array('description' => '', 'version' => ''); + } + + function IsConnected() + { + return !empty($this->_connectionID); + } + + function _findvers($str) + { + if (preg_match('/([0-9]+\.([0-9\.])+)/',$str, $arr)) return $arr[1]; + else return ''; + } + + /** + * All error messages go through this bottleneck function. + * You can define your own handler by defining the function name in ADODB_OUTP. + */ + function outp($msg,$newline=true) + { + global $ADODB_FLUSH,$ADODB_OUTP; + + if (defined('ADODB_OUTP')) { + $fn = ADODB_OUTP; + $fn($msg,$newline); + return; + } else if (isset($ADODB_OUTP)) { + $fn = $ADODB_OUTP; + $fn($msg,$newline); + return; + } + + if ($newline) $msg .= "
    \n"; + + if (isset($_SERVER['HTTP_USER_AGENT']) || !$newline) echo $msg; + else echo strip_tags($msg); + + + if (!empty($ADODB_FLUSH) && ob_get_length() !== false) flush(); // do not flush if output buffering enabled - useless - thx to Jesse Mullan + + } + + function Time() + { + $rs =& $this->_Execute("select $this->sysTimeStamp"); + if ($rs && !$rs->EOF) return $this->UnixTimeStamp(reset($rs->fields)); + + return false; + } + + /** + * Connect to database + * + * @param [argHostname] Host to connect to + * @param [argUsername] Userid to login + * @param [argPassword] Associated password + * @param [argDatabaseName] database + * @param [forceNew] force new connection + * + * @return true or false + */ + function Connect($argHostname = "", $argUsername = "", $argPassword = "", $argDatabaseName = "", $forceNew = false) + { + if ($argHostname != "") $this->host = $argHostname; + if ($argUsername != "") $this->user = $argUsername; + if ($argPassword != "") $this->password = $argPassword; // not stored for security reasons + if ($argDatabaseName != "") $this->database = $argDatabaseName; + + $this->_isPersistentConnection = false; + if ($forceNew) { + if ($rez=$this->_nconnect($this->host, $this->user, $this->password, $this->database)) return true; + } else { + if ($rez=$this->_connect($this->host, $this->user, $this->password, $this->database)) return true; + } + if (isset($rez)) { + $err = $this->ErrorMsg(); + if (empty($err)) $err = "Connection error to server '$argHostname' with user '$argUsername'"; + $ret = false; + } else { + $err = "Missing extension for ".$this->dataProvider; + $ret = 0; + } + if ($fn = $this->raiseErrorFn) + $fn($this->databaseType,'CONNECT',$this->ErrorNo(),$err,$this->host,$this->database,$this); + + + $this->_connectionID = false; + if ($this->debug) ADOConnection::outp( $this->host.': '.$err); + return $ret; + } + + function _nconnect($argHostname, $argUsername, $argPassword, $argDatabaseName) + { + return $this->_connect($argHostname, $argUsername, $argPassword, $argDatabaseName); + } + + + /** + * Always force a new connection to database - currently only works with oracle + * + * @param [argHostname] Host to connect to + * @param [argUsername] Userid to login + * @param [argPassword] Associated password + * @param [argDatabaseName] database + * + * @return true or false + */ + function NConnect($argHostname = "", $argUsername = "", $argPassword = "", $argDatabaseName = "") + { + return $this->Connect($argHostname, $argUsername, $argPassword, $argDatabaseName, true); + } + + /** + * Establish persistent connect to database + * + * @param [argHostname] Host to connect to + * @param [argUsername] Userid to login + * @param [argPassword] Associated password + * @param [argDatabaseName] database + * + * @return return true or false + */ + function PConnect($argHostname = "", $argUsername = "", $argPassword = "", $argDatabaseName = "") + { + if (defined('ADODB_NEVER_PERSIST')) + return $this->Connect($argHostname,$argUsername,$argPassword,$argDatabaseName); + + if ($argHostname != "") $this->host = $argHostname; + if ($argUsername != "") $this->user = $argUsername; + if ($argPassword != "") $this->password = $argPassword; + if ($argDatabaseName != "") $this->database = $argDatabaseName; + + $this->_isPersistentConnection = true; + if ($rez = $this->_pconnect($this->host, $this->user, $this->password, $this->database)) return true; + if (isset($rez)) { + $err = $this->ErrorMsg(); + if (empty($err)) $err = "Connection error to server '$argHostname' with user '$argUsername'"; + $ret = false; + } else { + $err = "Missing extension for ".$this->dataProvider; + $ret = 0; + } + if ($fn = $this->raiseErrorFn) { + $fn($this->databaseType,'PCONNECT',$this->ErrorNo(),$err,$this->host,$this->database,$this); + } + + $this->_connectionID = false; + if ($this->debug) ADOConnection::outp( $this->host.': '.$err); + return $ret; + } + + // Format date column in sql string given an input format that understands Y M D + function SQLDate($fmt, $col=false) + { + if (!$col) $col = $this->sysDate; + return $col; // child class implement + } + + /** + * Should prepare the sql statement and return the stmt resource. + * For databases that do not support this, we return the $sql. To ensure + * compatibility with databases that do not support prepare: + * + * $stmt = $db->Prepare("insert into table (id, name) values (?,?)"); + * $db->Execute($stmt,array(1,'Jill')) or die('insert failed'); + * $db->Execute($stmt,array(2,'Joe')) or die('insert failed'); + * + * @param sql SQL to send to database + * + * @return return FALSE, or the prepared statement, or the original sql if + * if the database does not support prepare. + * + */ + function Prepare($sql) + { + return $sql; + } + + /** + * Some databases, eg. mssql require a different function for preparing + * stored procedures. So we cannot use Prepare(). + * + * Should prepare the stored procedure and return the stmt resource. + * For databases that do not support this, we return the $sql. To ensure + * compatibility with databases that do not support prepare: + * + * @param sql SQL to send to database + * + * @return return FALSE, or the prepared statement, or the original sql if + * if the database does not support prepare. + * + */ + function PrepareSP($sql,$param=true) + { + return $this->Prepare($sql,$param); + } + + /** + * PEAR DB Compat + */ + function Quote($s) + { + return $this->qstr($s,false); + } + + /** + Requested by "Karsten Dambekalns" + */ + function QMagic($s) + { + return $this->qstr($s,get_magic_quotes_gpc()); + } + + function q(&$s) + { + #if (!empty($this->qNull)) if ($s == 'null') return $s; + $s = $this->qstr($s,false); + } + + /** + * PEAR DB Compat - do not use internally. + */ + function ErrorNative() + { + return $this->ErrorNo(); + } + + + /** + * PEAR DB Compat - do not use internally. + */ + function nextId($seq_name) + { + return $this->GenID($seq_name); + } + + /** + * Lock a row, will escalate and lock the table if row locking not supported + * will normally free the lock at the end of the transaction + * + * @param $table name of table to lock + * @param $where where clause to use, eg: "WHERE row=12". If left empty, will escalate to table lock + */ + function RowLock($table,$where) + { + return false; + } + + function CommitLock($table) + { + return $this->CommitTrans(); + } + + function RollbackLock($table) + { + return $this->RollbackTrans(); + } + + /** + * PEAR DB Compat - do not use internally. + * + * The fetch modes for NUMERIC and ASSOC for PEAR DB and ADODB are identical + * for easy porting :-) + * + * @param mode The fetchmode ADODB_FETCH_ASSOC or ADODB_FETCH_NUM + * @returns The previous fetch mode + */ + function SetFetchMode($mode) + { + $old = $this->fetchMode; + $this->fetchMode = $mode; + + if ($old === false) { + global $ADODB_FETCH_MODE; + return $ADODB_FETCH_MODE; + } + return $old; + } + + + /** + * PEAR DB Compat - do not use internally. + */ + function &Query($sql, $inputarr=false) + { + $rs = &$this->Execute($sql, $inputarr); + if (!$rs && defined('ADODB_PEAR')) return ADODB_PEAR_Error(); + return $rs; + } + + + /** + * PEAR DB Compat - do not use internally + */ + function &LimitQuery($sql, $offset, $count, $params=false) + { + $rs = &$this->SelectLimit($sql, $count, $offset, $params); + if (!$rs && defined('ADODB_PEAR')) return ADODB_PEAR_Error(); + return $rs; + } + + + /** + * PEAR DB Compat - do not use internally + */ + function Disconnect() + { + return $this->Close(); + } + + /* + Returns placeholder for parameter, eg. + $DB->Param('a') + + will return ':a' for Oracle, and '?' for most other databases... + + For databases that require positioned params, eg $1, $2, $3 for postgresql, + pass in Param(false) before setting the first parameter. + */ + function Param($name,$type='C') + { + return '?'; + } + + /* + InParameter and OutParameter are self-documenting versions of Parameter(). + */ + function InParameter(&$stmt,&$var,$name,$maxLen=4000,$type=false) + { + return $this->Parameter($stmt,$var,$name,false,$maxLen,$type); + } + + /* + */ + function OutParameter(&$stmt,&$var,$name,$maxLen=4000,$type=false) + { + return $this->Parameter($stmt,$var,$name,true,$maxLen,$type); + + } + + + /* + Usage in oracle + $stmt = $db->Prepare('select * from table where id =:myid and group=:group'); + $db->Parameter($stmt,$id,'myid'); + $db->Parameter($stmt,$group,'group',64); + $db->Execute(); + + @param $stmt Statement returned by Prepare() or PrepareSP(). + @param $var PHP variable to bind to + @param $name Name of stored procedure variable name to bind to. + @param [$isOutput] Indicates direction of parameter 0/false=IN 1=OUT 2= IN/OUT. This is ignored in oci8. + @param [$maxLen] Holds an maximum length of the variable. + @param [$type] The data type of $var. Legal values depend on driver. + + */ + function Parameter(&$stmt,&$var,$name,$isOutput=false,$maxLen=4000,$type=false) + { + return false; + } + + + function IgnoreErrors($saveErrs=false) + { + if (!$saveErrs) { + $saveErrs = array($this->raiseErrorFn,$this->_transOK); + $this->raiseErrorFn = false; + return $saveErrs; + } else { + $this->raiseErrorFn = $saveErrs[0]; + $this->_transOK = $saveErrs[1]; + } + } + + /** + Improved method of initiating a transaction. Used together with CompleteTrans(). + Advantages include: + + a. StartTrans/CompleteTrans is nestable, unlike BeginTrans/CommitTrans/RollbackTrans. + Only the outermost block is treated as a transaction.
    + b. CompleteTrans auto-detects SQL errors, and will rollback on errors, commit otherwise.
    + c. All BeginTrans/CommitTrans/RollbackTrans inside a StartTrans/CompleteTrans block + are disabled, making it backward compatible. + */ + function StartTrans($errfn = 'ADODB_TransMonitor') + { + if ($this->transOff > 0) { + $this->transOff += 1; + return; + } + + $this->_oldRaiseFn = $this->raiseErrorFn; + $this->raiseErrorFn = $errfn; + $this->_transOK = true; + + if ($this->debug && $this->transCnt > 0) ADOConnection::outp("Bad Transaction: StartTrans called within BeginTrans"); + $this->BeginTrans(); + $this->transOff = 1; + } + + + /** + Used together with StartTrans() to end a transaction. Monitors connection + for sql errors, and will commit or rollback as appropriate. + + @autoComplete if true, monitor sql errors and commit and rollback as appropriate, + and if set to false force rollback even if no SQL error detected. + @returns true on commit, false on rollback. + */ + function CompleteTrans($autoComplete = true) + { + if ($this->transOff > 1) { + $this->transOff -= 1; + return true; + } + $this->raiseErrorFn = $this->_oldRaiseFn; + + $this->transOff = 0; + if ($this->_transOK && $autoComplete) { + if (!$this->CommitTrans()) { + $this->_transOK = false; + if ($this->debug) ADOConnection::outp("Smart Commit failed"); + } else + if ($this->debug) ADOConnection::outp("Smart Commit occurred"); + } else { + $this->_transOK = false; + $this->RollbackTrans(); + if ($this->debug) ADOCOnnection::outp("Smart Rollback occurred"); + } + + return $this->_transOK; + } + + /* + At the end of a StartTrans/CompleteTrans block, perform a rollback. + */ + function FailTrans() + { + if ($this->debug) + if ($this->transOff == 0) { + ADOConnection::outp("FailTrans outside StartTrans/CompleteTrans"); + } else { + ADOConnection::outp("FailTrans was called"); + adodb_backtrace(); + } + $this->_transOK = false; + } + + /** + Check if transaction has failed, only for Smart Transactions. + */ + function HasFailedTrans() + { + if ($this->transOff > 0) return $this->_transOK == false; + return false; + } + + /** + * Execute SQL + * + * @param sql SQL statement to execute, or possibly an array holding prepared statement ($sql[0] will hold sql text) + * @param [inputarr] holds the input data to bind to. Null elements will be set to null. + * @return RecordSet or false + */ + function &Execute($sql,$inputarr=false) + { + if ($this->fnExecute) { + $fn = $this->fnExecute; + $ret =& $fn($this,$sql,$inputarr); + if (isset($ret)) return $ret; + } + if ($inputarr) { + if (!is_array($inputarr)) $inputarr = array($inputarr); + + $element0 = reset($inputarr); + # is_object check because oci8 descriptors can be passed in + $array_2d = is_array($element0) && !is_object(reset($element0)); + //remove extra memory copy of input -mikefedyk + unset($element0); + + if (!is_array($sql) && !$this->_bindInputArray) { + $sqlarr = explode('?',$sql); + + if (!$array_2d) $inputarr = array($inputarr); + foreach($inputarr as $arr) { + $sql = ''; $i = 0; + //Use each() instead of foreach to reduce memory usage -mikefedyk + while(list(, $v) = each($arr)) { + $sql .= $sqlarr[$i]; + // from Ron Baldwin + // Only quote string types + $typ = gettype($v); + if ($typ == 'string') + //New memory copy of input created here -mikefedyk + $sql .= $this->qstr($v); + else if ($typ == 'double') + $sql .= str_replace(',','.',$v); // locales fix so 1.1 does not get converted to 1,1 + else if ($typ == 'boolean') + $sql .= $v ? $this->true : $this->false; + else if ($typ == 'object') { + if (method_exists($v, '__toString')) $sql .= $this->qstr($v->__toString()); + else $sql .= $this->qstr((string) $v); + } else if ($v === null) + $sql .= 'NULL'; + else + $sql .= $v; + $i += 1; + } + if (isset($sqlarr[$i])) { + $sql .= $sqlarr[$i]; + if ($i+1 != sizeof($sqlarr)) ADOConnection::outp( "Input Array does not match ?: ".htmlspecialchars($sql)); + } else if ($i != sizeof($sqlarr)) + ADOConnection::outp( "Input array does not match ?: ".htmlspecialchars($sql)); + + + $ret =& $this->_Execute($sql); + if (!$ret) return $ret; + } + } else { + if ($array_2d) { + if (is_string($sql)) + $stmt = $this->Prepare($sql); + else + $stmt = $sql; + + foreach($inputarr as $arr) { + $ret =& $this->_Execute($stmt,$arr); + if (!$ret) return $ret; + } + } else { + + $ret =& $this->_Execute($sql,$inputarr); + } + } + } else { + $ret =& $this->_Execute($sql,false); + } + + return $ret; + } + + + function &_Execute($sql,$inputarr=false) + { + if ($this->debug) { + global $ADODB_INCLUDED_LIB; + if (empty($ADODB_INCLUDED_LIB)) include(ADODB_DIR.'/adodb-lib.inc.php'); + $this->_queryID = _adodb_debug_execute($this, $sql,$inputarr); + } else { + $this->_queryID = @$this->_query($sql,$inputarr); + } + + /************************ + // OK, query executed + *************************/ + + if ($this->_queryID === false) { // error handling if query fails + if ($this->debug == 99) adodb_backtrace(true,5); + $fn = $this->raiseErrorFn; + if ($fn) { + $fn($this->databaseType,'EXECUTE',$this->ErrorNo(),$this->ErrorMsg(),$sql,$inputarr,$this); + } + $false = false; + return $false; + } + + if ($this->_queryID === true) { // return simplified recordset for inserts/updates/deletes with lower overhead + $rsclass = $this->rsPrefix.'empty'; + $rs = (class_exists($rsclass)) ? new $rsclass(): new ADORecordSet_empty(); + + return $rs; + } + + // return real recordset from select statement + $rsclass = $this->rsPrefix.$this->databaseType; + $rs = new $rsclass($this->_queryID,$this->fetchMode); + $rs->connection = &$this; // Pablo suggestion + $rs->Init(); + if (is_array($sql)) $rs->sql = $sql[0]; + else $rs->sql = $sql; + if ($rs->_numOfRows <= 0) { + global $ADODB_COUNTRECS; + if ($ADODB_COUNTRECS) { + if (!$rs->EOF) { + $rs = &$this->_rs2rs($rs,-1,-1,!is_array($sql)); + $rs->_queryID = $this->_queryID; + } else + $rs->_numOfRows = 0; + } + } + return $rs; + } + + function CreateSequence($seqname='adodbseq',$startID=1) + { + if (empty($this->_genSeqSQL)) return false; + return $this->Execute(sprintf($this->_genSeqSQL,$seqname,$startID)); + } + + function DropSequence($seqname='adodbseq') + { + if (empty($this->_dropSeqSQL)) return false; + return $this->Execute(sprintf($this->_dropSeqSQL,$seqname)); + } + + /** + * Generates a sequence id and stores it in $this->genID; + * GenID is only available if $this->hasGenID = true; + * + * @param seqname name of sequence to use + * @param startID if sequence does not exist, start at this ID + * @return 0 if not supported, otherwise a sequence id + */ + function GenID($seqname='adodbseq',$startID=1) + { + if (!$this->hasGenID) { + return 0; // formerly returns false pre 1.60 + } + + $getnext = sprintf($this->_genIDSQL,$seqname); + + $holdtransOK = $this->_transOK; + + $save_handler = $this->raiseErrorFn; + $this->raiseErrorFn = ''; + @($rs = $this->Execute($getnext)); + $this->raiseErrorFn = $save_handler; + + if (!$rs) { + $this->_transOK = $holdtransOK; //if the status was ok before reset + $createseq = $this->Execute(sprintf($this->_genSeqSQL,$seqname,$startID)); + $rs = $this->Execute($getnext); + } + if ($rs && !$rs->EOF) $this->genID = reset($rs->fields); + else $this->genID = 0; // false + + if ($rs) $rs->Close(); + + return $this->genID; + } + + /** + * @param $table string name of the table, not needed by all databases (eg. mysql), default '' + * @param $column string name of the column, not needed by all databases (eg. mysql), default '' + * @return the last inserted ID. Not all databases support this. + */ + function Insert_ID($table='',$column='') + { + if ($this->_logsql && $this->lastInsID) return $this->lastInsID; + if ($this->hasInsertID) return $this->_insertid($table,$column); + if ($this->debug) { + ADOConnection::outp( '

    Insert_ID error

    '); + adodb_backtrace(); + } + return false; + } + + + /** + * Portable Insert ID. Pablo Roca + * + * @return the last inserted ID. All databases support this. But aware possible + * problems in multiuser environments. Heavy test this before deploying. + */ + function PO_Insert_ID($table="", $id="") + { + if ($this->hasInsertID){ + return $this->Insert_ID($table,$id); + } else { + return $this->GetOne("SELECT MAX($id) FROM $table"); + } + } + + /** + * @return # rows affected by UPDATE/DELETE + */ + function Affected_Rows() + { + if ($this->hasAffectedRows) { + if ($this->fnExecute === 'adodb_log_sql') { + if ($this->_logsql && $this->_affected !== false) return $this->_affected; + } + $val = $this->_affectedrows(); + return ($val < 0) ? false : $val; + } + + if ($this->debug) ADOConnection::outp( '

    Affected_Rows error

    ',false); + return false; + } + + + /** + * @return the last error message + */ + function ErrorMsg() + { + if ($this->_errorMsg) return '!! '.strtoupper($this->dataProvider.' '.$this->databaseType).': '.$this->_errorMsg; + else return ''; + } + + + /** + * @return the last error number. Normally 0 means no error. + */ + function ErrorNo() + { + return ($this->_errorMsg) ? -1 : 0; + } + + function MetaError($err=false) + { + include_once(ADODB_DIR."/adodb-error.inc.php"); + if ($err === false) $err = $this->ErrorNo(); + return adodb_error($this->dataProvider,$this->databaseType,$err); + } + + function MetaErrorMsg($errno) + { + include_once(ADODB_DIR."/adodb-error.inc.php"); + return adodb_errormsg($errno); + } + + /** + * @returns an array with the primary key columns in it. + */ + function MetaPrimaryKeys($table, $owner=false) + { + // owner not used in base class - see oci8 + $p = array(); + $objs =& $this->MetaColumns($table); + if ($objs) { + foreach($objs as $v) { + if (!empty($v->primary_key)) + $p[] = $v->name; + } + } + if (sizeof($p)) return $p; + if (function_exists('ADODB_VIEW_PRIMARYKEYS')) + return ADODB_VIEW_PRIMARYKEYS($this->databaseType, $this->database, $table, $owner); + return false; + } + + /** + * @returns assoc array where keys are tables, and values are foreign keys + */ + function MetaForeignKeys($table, $owner=false, $upper=false) + { + return false; + } + /** + * Choose a database to connect to. Many databases do not support this. + * + * @param dbName is the name of the database to select + * @return true or false + */ + function SelectDB($dbName) + {return false;} + + + /** + * Will select, getting rows from $offset (1-based), for $nrows. + * This simulates the MySQL "select * from table limit $offset,$nrows" , and + * the PostgreSQL "select * from table limit $nrows offset $offset". Note that + * MySQL and PostgreSQL parameter ordering is the opposite of the other. + * eg. + * SelectLimit('select * from table',3); will return rows 1 to 3 (1-based) + * SelectLimit('select * from table',3,2); will return rows 3 to 5 (1-based) + * + * Uses SELECT TOP for Microsoft databases (when $this->hasTop is set) + * BUG: Currently SelectLimit fails with $sql with LIMIT or TOP clause already set + * + * @param sql + * @param [offset] is the row to start calculations from (1-based) + * @param [nrows] is the number of rows to get + * @param [inputarr] array of bind variables + * @param [secs2cache] is a private parameter only used by jlim + * @return the recordset ($rs->databaseType == 'array') + */ + function &SelectLimit($sql,$nrows=-1,$offset=-1, $inputarr=false,$secs2cache=0) + { + if ($this->hasTop && $nrows > 0) { + // suggested by Reinhard Balling. Access requires top after distinct + // Informix requires first before distinct - F Riosa + $ismssql = (strpos($this->databaseType,'mssql') !== false); + if ($ismssql) $isaccess = false; + else $isaccess = (strpos($this->databaseType,'access') !== false); + + if ($offset <= 0) { + + // access includes ties in result + if ($isaccess) { + $sql = preg_replace( + '/(^\s*select\s+(distinctrow|distinct)?)/i','\\1 '.$this->hasTop.' '.((integer)$nrows).' ',$sql); + + if ($secs2cache != 0) { + $ret =& $this->CacheExecute($secs2cache, $sql,$inputarr); + } else { + $ret =& $this->Execute($sql,$inputarr); + } + return $ret; // PHP5 fix + } else if ($ismssql){ + $sql = preg_replace( + '/(^\s*select\s+(distinctrow|distinct)?)/i','\\1 '.$this->hasTop.' '.((integer)$nrows).' ',$sql); + } else { + $sql = preg_replace( + '/(^\s*select\s)/i','\\1 '.$this->hasTop.' '.((integer)$nrows).' ',$sql); + } + } else { + $nn = $nrows + $offset; + if ($isaccess || $ismssql) { + $sql = preg_replace( + '/(^\s*select\s+(distinctrow|distinct)?)/i','\\1 '.$this->hasTop.' '.$nn.' ',$sql); + } else { + $sql = preg_replace( + '/(^\s*select\s)/i','\\1 '.$this->hasTop.' '.$nn.' ',$sql); + } + } + } + + // if $offset>0, we want to skip rows, and $ADODB_COUNTRECS is set, we buffer rows + // 0 to offset-1 which will be discarded anyway. So we disable $ADODB_COUNTRECS. + global $ADODB_COUNTRECS; + + $savec = $ADODB_COUNTRECS; + $ADODB_COUNTRECS = false; + + if ($offset>0){ + if ($secs2cache != 0) $rs = &$this->CacheExecute($secs2cache,$sql,$inputarr); + else $rs = &$this->Execute($sql,$inputarr); + } else { + if ($secs2cache != 0) $rs = &$this->CacheExecute($secs2cache,$sql,$inputarr); + else $rs = &$this->Execute($sql,$inputarr); + } + $ADODB_COUNTRECS = $savec; + if ($rs && !$rs->EOF) { + $rs =& $this->_rs2rs($rs,$nrows,$offset); + } + //print_r($rs); + return $rs; + } + + /** + * Create serializable recordset. Breaks rs link to connection. + * + * @param rs the recordset to serialize + */ + function &SerializableRS(&$rs) + { + $rs2 =& $this->_rs2rs($rs); + $ignore = false; + $rs2->connection =& $ignore; + + return $rs2; + } + + /** + * Convert database recordset to an array recordset + * input recordset's cursor should be at beginning, and + * old $rs will be closed. + * + * @param rs the recordset to copy + * @param [nrows] number of rows to retrieve (optional) + * @param [offset] offset by number of rows (optional) + * @return the new recordset + */ + function &_rs2rs(&$rs,$nrows=-1,$offset=-1,$close=true) + { + if (! $rs) { + $false = false; + return $false; + } + $dbtype = $rs->databaseType; + if (!$dbtype) { + $rs = &$rs; // required to prevent crashing in 4.2.1, but does not happen in 4.3.1 -- why ? + return $rs; + } + if (($dbtype == 'array' || $dbtype == 'csv') && $nrows == -1 && $offset == -1) { + $rs->MoveFirst(); + $rs = &$rs; // required to prevent crashing in 4.2.1, but does not happen in 4.3.1-- why ? + return $rs; + } + $flds = array(); + for ($i=0, $max=$rs->FieldCount(); $i < $max; $i++) { + $flds[] = $rs->FetchField($i); + } + + $arr =& $rs->GetArrayLimit($nrows,$offset); + //print_r($arr); + if ($close) $rs->Close(); + + $arrayClass = $this->arrayClass; + + $rs2 = new $arrayClass(); + $rs2->connection = &$this; + $rs2->sql = $rs->sql; + $rs2->dataProvider = $this->dataProvider; + $rs2->InitArrayFields($arr,$flds); + $rs2->fetchMode = isset($rs->adodbFetchMode) ? $rs->adodbFetchMode : $rs->fetchMode; + return $rs2; + } + + /* + * Return all rows. Compat with PEAR DB + */ + function &GetAll($sql, $inputarr=false) + { + $arr =& $this->GetArray($sql,$inputarr); + return $arr; + } + + function &GetAssoc($sql, $inputarr=false,$force_array = false, $first2cols = false) + { + $rs =& $this->Execute($sql, $inputarr); + if (!$rs) { + $false = false; + return $false; + } + $arr =& $rs->GetAssoc($force_array,$first2cols); + return $arr; + } + + function &CacheGetAssoc($secs2cache, $sql=false, $inputarr=false,$force_array = false, $first2cols = false) + { + if (!is_numeric($secs2cache)) { + $first2cols = $force_array; + $force_array = $inputarr; + } + $rs =& $this->CacheExecute($secs2cache, $sql, $inputarr); + if (!$rs) { + $false = false; + return $false; + } + $arr =& $rs->GetAssoc($force_array,$first2cols); + return $arr; + } + + /** + * Return first element of first row of sql statement. Recordset is disposed + * for you. + * + * @param sql SQL statement + * @param [inputarr] input bind array + */ + function GetOne($sql,$inputarr=false) + { + global $ADODB_COUNTRECS; + $crecs = $ADODB_COUNTRECS; + $ADODB_COUNTRECS = false; + + $ret = false; + $rs = &$this->Execute($sql,$inputarr); + if ($rs) { + if ($rs->EOF) $ret = null; + else $ret = reset($rs->fields); + + $rs->Close(); + } + $ADODB_COUNTRECS = $crecs; + return $ret; + } + + function CacheGetOne($secs2cache,$sql=false,$inputarr=false) + { + $ret = false; + $rs = &$this->CacheExecute($secs2cache,$sql,$inputarr); + if ($rs) { + if ($rs->EOF) $ret = null; + else $ret = reset($rs->fields); + $rs->Close(); + } + + return $ret; + } + + function GetCol($sql, $inputarr = false, $trim = false) + { + $rv = false; + $rs = &$this->Execute($sql, $inputarr); + if ($rs) { + $rv = array(); + if ($trim) { + while (!$rs->EOF) { + $rv[] = trim(reset($rs->fields)); + $rs->MoveNext(); + } + } else { + while (!$rs->EOF) { + $rv[] = reset($rs->fields); + $rs->MoveNext(); + } + } + $rs->Close(); + } + return $rv; + } + + function CacheGetCol($secs, $sql = false, $inputarr = false,$trim=false) + { + $rv = false; + $rs = &$this->CacheExecute($secs, $sql, $inputarr); + if ($rs) { + if ($trim) { + while (!$rs->EOF) { + $rv[] = trim(reset($rs->fields)); + $rs->MoveNext(); + } + } else { + while (!$rs->EOF) { + $rv[] = reset($rs->fields); + $rs->MoveNext(); + } + } + $rs->Close(); + } + return $rv; + } + + function &Transpose(&$rs,$addfieldnames=true) + { + $rs2 =& $this->_rs2rs($rs); + $false = false; + if (!$rs2) return $false; + + $rs2->_transpose($addfieldnames); + return $rs2; + } + + /* + Calculate the offset of a date for a particular database and generate + appropriate SQL. Useful for calculating future/past dates and storing + in a database. + + If dayFraction=1.5 means 1.5 days from now, 1.0/24 for 1 hour. + */ + function OffsetDate($dayFraction,$date=false) + { + if (!$date) $date = $this->sysDate; + return '('.$date.'+'.$dayFraction.')'; + } + + + /** + * + * @param sql SQL statement + * @param [inputarr] input bind array + */ + function &GetArray($sql,$inputarr=false) + { + global $ADODB_COUNTRECS; + + $savec = $ADODB_COUNTRECS; + $ADODB_COUNTRECS = false; + $rs =& $this->Execute($sql,$inputarr); + $ADODB_COUNTRECS = $savec; + if (!$rs) + if (defined('ADODB_PEAR')) { + $cls = ADODB_PEAR_Error(); + return $cls; + } else { + $false = false; + return $false; + } + $arr =& $rs->GetArray(); + $rs->Close(); + return $arr; + } + + function &CacheGetAll($secs2cache,$sql=false,$inputarr=false) + { + $arr =& $this->CacheGetArray($secs2cache,$sql,$inputarr); + return $arr; + } + + function &CacheGetArray($secs2cache,$sql=false,$inputarr=false) + { + global $ADODB_COUNTRECS; + + $savec = $ADODB_COUNTRECS; + $ADODB_COUNTRECS = false; + $rs =& $this->CacheExecute($secs2cache,$sql,$inputarr); + $ADODB_COUNTRECS = $savec; + + if (!$rs) + if (defined('ADODB_PEAR')) { + $cls = ADODB_PEAR_Error(); + return $cls; + } else { + $false = false; + return $false; + } + $arr =& $rs->GetArray(); + $rs->Close(); + return $arr; + } + + function GetRandRow($sql, $arr= false) + { + $rezarr = $this->GetAll($sql, $arr); + $sz = sizeof($rez); + return $rezarr[abs(rand()) % $sz]; + } + + /** + * Return one row of sql statement. Recordset is disposed for you. + * + * @param sql SQL statement + * @param [inputarr] input bind array + */ + function &GetRow($sql,$inputarr=false) + { + global $ADODB_COUNTRECS; + $crecs = $ADODB_COUNTRECS; + $ADODB_COUNTRECS = false; + + $rs =& $this->Execute($sql,$inputarr); + + $ADODB_COUNTRECS = $crecs; + if ($rs) { + if (!$rs->EOF) $arr = $rs->fields; + else $arr = array(); + $rs->Close(); + return $arr; + } + + $false = false; + return $false; + } + + function &CacheGetRow($secs2cache,$sql=false,$inputarr=false) + { + $rs =& $this->CacheExecute($secs2cache,$sql,$inputarr); + if ($rs) { + $arr = false; + if (!$rs->EOF) $arr = $rs->fields; + $rs->Close(); + return $arr; + } + $false = false; + return $false; + } + + /** + * Insert or replace a single record. Note: this is not the same as MySQL's replace. + * ADOdb's Replace() uses update-insert semantics, not insert-delete-duplicates of MySQL. + * Also note that no table locking is done currently, so it is possible that the + * record be inserted twice by two programs... + * + * $this->Replace('products', array('prodname' =>"'Nails'","price" => 3.99), 'prodname'); + * + * $table table name + * $fieldArray associative array of data (you must quote strings yourself). + * $keyCol the primary key field name or if compound key, array of field names + * autoQuote set to true to use a hueristic to quote strings. Works with nulls and numbers + * but does not work with dates nor SQL functions. + * has_autoinc the primary key is an auto-inc field, so skip in insert. + * + * Currently blob replace not supported + * + * returns 0 = fail, 1 = update, 2 = insert + */ + + function Replace($table, $fieldArray, $keyCol, $autoQuote=false, $has_autoinc=false) + { + global $ADODB_INCLUDED_LIB; + if (empty($ADODB_INCLUDED_LIB)) include(ADODB_DIR.'/adodb-lib.inc.php'); + + return _adodb_replace($this, $table, $fieldArray, $keyCol, $autoQuote, $has_autoinc); + } + + + /** + * Will select, getting rows from $offset (1-based), for $nrows. + * This simulates the MySQL "select * from table limit $offset,$nrows" , and + * the PostgreSQL "select * from table limit $nrows offset $offset". Note that + * MySQL and PostgreSQL parameter ordering is the opposite of the other. + * eg. + * CacheSelectLimit(15,'select * from table',3); will return rows 1 to 3 (1-based) + * CacheSelectLimit(15,'select * from table',3,2); will return rows 3 to 5 (1-based) + * + * BUG: Currently CacheSelectLimit fails with $sql with LIMIT or TOP clause already set + * + * @param [secs2cache] seconds to cache data, set to 0 to force query. This is optional + * @param sql + * @param [offset] is the row to start calculations from (1-based) + * @param [nrows] is the number of rows to get + * @param [inputarr] array of bind variables + * @return the recordset ($rs->databaseType == 'array') + */ + function &CacheSelectLimit($secs2cache,$sql,$nrows=-1,$offset=-1,$inputarr=false) + { + if (!is_numeric($secs2cache)) { + if ($sql === false) $sql = -1; + if ($offset == -1) $offset = false; + // sql, nrows, offset,inputarr + $rs =& $this->SelectLimit($secs2cache,$sql,$nrows,$offset,$this->cacheSecs); + } else { + if ($sql === false) ADOConnection::outp( "Warning: \$sql missing from CacheSelectLimit()"); + $rs =& $this->SelectLimit($sql,$nrows,$offset,$inputarr,$secs2cache); + } + return $rs; + } + + + /** + * Flush cached recordsets that match a particular $sql statement. + * If $sql == false, then we purge all files in the cache. + */ + + /** + * Flush cached recordsets that match a particular $sql statement. + * If $sql == false, then we purge all files in the cache. + */ + function CacheFlush($sql=false,$inputarr=false) + { + global $ADODB_CACHE_DIR; + + if ($this->memCache) { + global $ADODB_INCLUDED_MEMCACHE; + + $key = false; + if (empty($ADODB_INCLUDED_MEMCACHE)) include(ADODB_DIR.'/adodb-memcache.lib.inc.php'); + if ($sql) $key = $this->_gencachename($sql.serialize($inputarr),false,true); + FlushMemCache($key, $this->memCacheHost, $this->memCachePort, $this->debug); + return; + } + + if (strlen($ADODB_CACHE_DIR) > 1 && !$sql) { + /*if (strncmp(PHP_OS,'WIN',3) === 0) + $dir = str_replace('/', '\\', $ADODB_CACHE_DIR); + else */ + $dir = $ADODB_CACHE_DIR; + + if ($this->debug) { + ADOConnection::outp( "CacheFlush: $dir
    \n". $this->_dirFlush($dir)."
    "); + } else { + $this->_dirFlush($dir); + } + return; + } + + global $ADODB_INCLUDED_CSV; + if (empty($ADODB_INCLUDED_CSV)) include(ADODB_DIR.'/adodb-csvlib.inc.php'); + + $f = $this->_gencachename($sql.serialize($inputarr),false); + adodb_write_file($f,''); // is adodb_write_file needed? + if (!@unlink($f)) { + if ($this->debug) ADOConnection::outp( "CacheFlush: failed for $f"); + } + } + + /** + * Private function to erase all of the files and subdirectories in a directory. + * + * Just specify the directory, and tell it if you want to delete the directory or just clear it out. + * Note: $kill_top_level is used internally in the function to flush subdirectories. + */ + function _dirFlush($dir, $kill_top_level = false) + { + if(!$dh = @opendir($dir)) return; + + while (($obj = readdir($dh))) { + if($obj=='.' || $obj=='..') continue; + $f = $dir.'/'.$obj; + + if (strpos($obj,'.cache')) @unlink($f); + if (is_dir($f)) $this->_dirFlush($f, true); + } + if ($kill_top_level === true) @rmdir($dir); + return true; + } + + + function xCacheFlush($sql=false,$inputarr=false) + { + global $ADODB_CACHE_DIR; + + if ($this->memCache) { + global $ADODB_INCLUDED_MEMCACHE; + $key = false; + if (empty($ADODB_INCLUDED_MEMCACHE)) include(ADODB_DIR.'/adodb-memcache.lib.inc.php'); + if ($sql) $key = $this->_gencachename($sql.serialize($inputarr),false,true); + flushmemCache($key, $this->memCacheHost, $this->memCachePort, $this->debug); + return; + } + + if (strlen($ADODB_CACHE_DIR) > 1 && !$sql) { + if (strncmp(PHP_OS,'WIN',3) === 0) { + $cmd = 'del /s '.str_replace('/','\\',$ADODB_CACHE_DIR).'\adodb_*.cache'; + } else { + //$cmd = 'find "'.$ADODB_CACHE_DIR.'" -type f -maxdepth 1 -print0 | xargs -0 rm -f'; + $cmd = 'rm -rf '.$ADODB_CACHE_DIR.'/[0-9a-f][0-9a-f]/'; + // old version 'rm -f `find '.$ADODB_CACHE_DIR.' -name adodb_*.cache`'; + } + if ($this->debug) { + ADOConnection::outp( "CacheFlush: $cmd
    \n", system($cmd),"
    "); + } else { + exec($cmd); + } + return; + } + + global $ADODB_INCLUDED_CSV; + if (empty($ADODB_INCLUDED_CSV)) include(ADODB_DIR.'/adodb-csvlib.inc.php'); + + $f = $this->_gencachename($sql.serialize($inputarr),false); + adodb_write_file($f,''); // is adodb_write_file needed? + if (!@unlink($f)) { + if ($this->debug) ADOConnection::outp( "CacheFlush: failed for $f"); + } + } + + /** + * Private function to generate filename for caching. + * Filename is generated based on: + * + * - sql statement + * - database type (oci8, ibase, ifx, etc) + * - database name + * - userid + * - setFetchMode (adodb 4.23) + * + * When not in safe mode, we create 256 sub-directories in the cache directory ($ADODB_CACHE_DIR). + * Assuming that we can have 50,000 files per directory with good performance, + * then we can scale to 12.8 million unique cached recordsets. Wow! + */ + function _gencachename($sql,$createdir,$memcache=false) + { + global $ADODB_CACHE_DIR; + static $notSafeMode; + + if ($this->fetchMode === false) { + global $ADODB_FETCH_MODE; + $mode = $ADODB_FETCH_MODE; + } else { + $mode = $this->fetchMode; + } + $m = md5($sql.$this->databaseType.$this->database.$this->user.$mode); + if ($memcache) return $m; + + if (!isset($notSafeMode)) $notSafeMode = !ini_get('safe_mode'); + $dir = ($notSafeMode) ? $ADODB_CACHE_DIR.'/'.substr($m,0,2) : $ADODB_CACHE_DIR; + + if ($createdir && $notSafeMode && !file_exists($dir)) { + $oldu = umask(0); + if (!mkdir($dir,0771)) + if ($this->debug) ADOConnection::outp( "Unable to mkdir $dir for $sql"); + umask($oldu); + } + return $dir.'/adodb_'.$m.'.cache'; + } + + + /** + * Execute SQL, caching recordsets. + * + * @param [secs2cache] seconds to cache data, set to 0 to force query. + * This is an optional parameter. + * @param sql SQL statement to execute + * @param [inputarr] holds the input data to bind to + * @return RecordSet or false + */ + function &CacheExecute($secs2cache,$sql=false,$inputarr=false) + { + + + if (!is_numeric($secs2cache)) { + $inputarr = $sql; + $sql = $secs2cache; + $secs2cache = $this->cacheSecs; + } + + if (is_array($sql)) { + $sqlparam = $sql; + $sql = $sql[0]; + } else + $sqlparam = $sql; + + if ($this->memCache) { + global $ADODB_INCLUDED_MEMCACHE; + if (empty($ADODB_INCLUDED_MEMCACHE)) include(ADODB_DIR.'/adodb-memcache.lib.inc.php'); + $md5file = $this->_gencachename($sql.serialize($inputarr),false,true); + } else { + global $ADODB_INCLUDED_CSV; + if (empty($ADODB_INCLUDED_CSV)) include(ADODB_DIR.'/adodb-csvlib.inc.php'); + $md5file = $this->_gencachename($sql.serialize($inputarr),true); + } + + $err = ''; + + if ($secs2cache > 0){ + if ($this->memCache) + $rs = &getmemCache($md5file,$err,$secs2cache, $this->memCacheHost, $this->memCachePort); + else + $rs = &csv2rs($md5file,$err,$secs2cache,$this->arrayClass); + $this->numCacheHits += 1; + } else { + $err='Timeout 1'; + $rs = false; + $this->numCacheMisses += 1; + } + if (!$rs) { + // no cached rs found + if ($this->debug) { + if (get_magic_quotes_runtime() && !$this->memCache) { + ADOConnection::outp("Please disable magic_quotes_runtime - it corrupts cache files :("); + } + if ($this->debug !== -1) ADOConnection::outp( " $md5file cache failure: $err (see sql below)"); + } + + $rs = &$this->Execute($sqlparam,$inputarr); + + if ($rs && $this->memCache) { + $rs = &$this->_rs2rs($rs); // read entire recordset into memory immediately + if(!putmemCache($md5file, $rs, $this->memCacheHost, $this->memCachePort, $this->memCacheCompress, $this->debug)) { + if ($fn = $this->raiseErrorFn) + $fn($this->databaseType,'CacheExecute',-32000,"Cache write error",$md5file,$sql,$this); + if ($this->debug) ADOConnection::outp( " Cache write error"); + } + } else + if ($rs) { + $eof = $rs->EOF; + $rs = &$this->_rs2rs($rs); // read entire recordset into memory immediately + $txt = _rs2serialize($rs,false,$sql); // serialize + + if (!adodb_write_file($md5file,$txt,$this->debug)) { + if ($fn = $this->raiseErrorFn) { + $fn($this->databaseType,'CacheExecute',-32000,"Cache write error",$md5file,$sql,$this); + } + if ($this->debug) ADOConnection::outp( " Cache write error"); + } + if ($rs->EOF && !$eof) { + $rs->MoveFirst(); + //$rs = &csv2rs($md5file,$err); + $rs->connection = &$this; // Pablo suggestion + } + + } else + if (!$this->memCache) + @unlink($md5file); + } else { + $this->_errorMsg = ''; + $this->_errorCode = 0; + + if ($this->fnCacheExecute) { + $fn = $this->fnCacheExecute; + $fn($this, $secs2cache, $sql, $inputarr); + } + // ok, set cached object found + $rs->connection = &$this; // Pablo suggestion + if ($this->debug){ + + $inBrowser = isset($_SERVER['HTTP_USER_AGENT']); + $ttl = $rs->timeCreated + $secs2cache - time(); + $s = is_array($sql) ? $sql[0] : $sql; + if ($inBrowser) $s = ''.htmlspecialchars($s).''; + + ADOConnection::outp( " $md5file reloaded, ttl=$ttl [ $s ]"); + } + } + return $rs; + } + + + /* + Similar to PEAR DB's autoExecute(), except that + $mode can be 'INSERT' or 'UPDATE' or DB_AUTOQUERY_INSERT or DB_AUTOQUERY_UPDATE + If $mode == 'UPDATE', then $where is compulsory as a safety measure. + + $forceUpdate means that even if the data has not changed, perform update. + */ + function& AutoExecute($table, $fields_values, $mode = 'INSERT', $where = FALSE, $forceUpdate=true, $magicq=false) + { + $false = false; + $sql = 'SELECT * FROM '.$table; + if ($where!==FALSE) $sql .= ' WHERE '.$where; + else if ($mode == 'UPDATE' || $mode == 2 /* DB_AUTOQUERY_UPDATE */) { + ADOConnection::outp('AutoExecute: Illegal mode=UPDATE with empty WHERE clause'); + return $false; + } + + $rs =& $this->SelectLimit($sql,1); + if (!$rs) return $false; // table does not exist + $rs->tableName = $table; + + switch((string) $mode) { + case 'UPDATE': + case '2': + $sql = $this->GetUpdateSQL($rs, $fields_values, $forceUpdate, $magicq); + break; + case 'INSERT': + case '1': + $sql = $this->GetInsertSQL($rs, $fields_values, $magicq); + break; + default: + ADOConnection::outp("AutoExecute: Unknown mode=$mode"); + return $false; + } + $ret = false; + if ($sql) $ret = $this->Execute($sql); + if ($ret) $ret = true; + return $ret; + } + + + /** + * Generates an Update Query based on an existing recordset. + * $arrFields is an associative array of fields with the value + * that should be assigned. + * + * Note: This function should only be used on a recordset + * that is run against a single table and sql should only + * be a simple select stmt with no groupby/orderby/limit + * + * "Jonathan Younger" + */ + function GetUpdateSQL(&$rs, $arrFields,$forceUpdate=false,$magicq=false,$force=null) + { + global $ADODB_INCLUDED_LIB; + + //********************************************************// + //This is here to maintain compatibility + //with older adodb versions. Sets force type to force nulls if $forcenulls is set. + if (!isset($force)) { + global $ADODB_FORCE_TYPE; + $force = $ADODB_FORCE_TYPE; + } + //********************************************************// + + if (empty($ADODB_INCLUDED_LIB)) include(ADODB_DIR.'/adodb-lib.inc.php'); + return _adodb_getupdatesql($this,$rs,$arrFields,$forceUpdate,$magicq,$force); + } + + /** + * Generates an Insert Query based on an existing recordset. + * $arrFields is an associative array of fields with the value + * that should be assigned. + * + * Note: This function should only be used on a recordset + * that is run against a single table. + */ + function GetInsertSQL(&$rs, $arrFields,$magicq=false,$force=null) + { + global $ADODB_INCLUDED_LIB; + if (!isset($force)) { + global $ADODB_FORCE_TYPE; + $force = $ADODB_FORCE_TYPE; + + } + if (empty($ADODB_INCLUDED_LIB)) include(ADODB_DIR.'/adodb-lib.inc.php'); + return _adodb_getinsertsql($this,$rs,$arrFields,$magicq,$force); + } + + + /** + * Update a blob column, given a where clause. There are more sophisticated + * blob handling functions that we could have implemented, but all require + * a very complex API. Instead we have chosen something that is extremely + * simple to understand and use. + * + * Note: $blobtype supports 'BLOB' and 'CLOB', default is BLOB of course. + * + * Usage to update a $blobvalue which has a primary key blob_id=1 into a + * field blobtable.blobcolumn: + * + * UpdateBlob('blobtable', 'blobcolumn', $blobvalue, 'blob_id=1'); + * + * Insert example: + * + * $conn->Execute('INSERT INTO blobtable (id, blobcol) VALUES (1, null)'); + * $conn->UpdateBlob('blobtable','blobcol',$blob,'id=1'); + */ + + function UpdateBlob($table,$column,$val,$where,$blobtype='BLOB') + { + return $this->Execute("UPDATE $table SET $column=? WHERE $where",array($val)) != false; + } + + /** + * Usage: + * UpdateBlob('TABLE', 'COLUMN', '/path/to/file', 'ID=1'); + * + * $blobtype supports 'BLOB' and 'CLOB' + * + * $conn->Execute('INSERT INTO blobtable (id, blobcol) VALUES (1, null)'); + * $conn->UpdateBlob('blobtable','blobcol',$blobpath,'id=1'); + */ + function UpdateBlobFile($table,$column,$path,$where,$blobtype='BLOB') + { + $fd = fopen($path,'rb'); + if ($fd === false) return false; + $val = fread($fd,filesize($path)); + fclose($fd); + return $this->UpdateBlob($table,$column,$val,$where,$blobtype); + } + + function BlobDecode($blob) + { + return $blob; + } + + function BlobEncode($blob) + { + return $blob; + } + + function SetCharSet($charset) + { + return false; + } + + function IfNull( $field, $ifNull ) + { + return " CASE WHEN $field is null THEN $ifNull ELSE $field END "; + } + + function LogSQL($enable=true) + { + include_once(ADODB_DIR.'/adodb-perf.inc.php'); + + if ($enable) $this->fnExecute = 'adodb_log_sql'; + else $this->fnExecute = false; + + $old = $this->_logsql; + $this->_logsql = $enable; + if ($enable && !$old) $this->_affected = false; + return $old; + } + + function GetCharSet() + { + return false; + } + + /** + * Usage: + * UpdateClob('TABLE', 'COLUMN', $var, 'ID=1', 'CLOB'); + * + * $conn->Execute('INSERT INTO clobtable (id, clobcol) VALUES (1, null)'); + * $conn->UpdateClob('clobtable','clobcol',$clob,'id=1'); + */ + function UpdateClob($table,$column,$val,$where) + { + return $this->UpdateBlob($table,$column,$val,$where,'CLOB'); + } + + // not the fastest implementation - quick and dirty - jlim + // for best performance, use the actual $rs->MetaType(). + function MetaType($t,$len=-1,$fieldobj=false) + { + + if (empty($this->_metars)) { + $rsclass = $this->rsPrefix.$this->databaseType; + $this->_metars = new $rsclass(false,$this->fetchMode); + $this->_metars->connection =& $this; + } + return $this->_metars->MetaType($t,$len,$fieldobj); + } + + + /** + * Change the SQL connection locale to a specified locale. + * This is used to get the date formats written depending on the client locale. + */ + function SetDateLocale($locale = 'En') + { + $this->locale = $locale; + switch (strtoupper($locale)) + { + case 'EN': + $this->fmtDate="'Y-m-d'"; + $this->fmtTimeStamp = "'Y-m-d H:i:s'"; + break; + + case 'US': + $this->fmtDate = "'m-d-Y'"; + $this->fmtTimeStamp = "'m-d-Y H:i:s'"; + break; + + case 'PT_BR': + case 'NL': + case 'FR': + case 'RO': + case 'IT': + $this->fmtDate="'d-m-Y'"; + $this->fmtTimeStamp = "'d-m-Y H:i:s'"; + break; + + case 'GE': + $this->fmtDate="'d.m.Y'"; + $this->fmtTimeStamp = "'d.m.Y H:i:s'"; + break; + + default: + $this->fmtDate="'Y-m-d'"; + $this->fmtTimeStamp = "'Y-m-d H:i:s'"; + break; + } + } + + function &GetActiveRecordsClass($class, $table,$whereOrderBy=false,$bindarr=false, $primkeyArr=false) + { + global $_ADODB_ACTIVE_DBS; + + $save = $this->SetFetchMode(ADODB_FETCH_NUM); + if (empty($whereOrderBy)) $whereOrderBy = '1=1'; + $rows = $this->GetAll("select * from ".$table.' WHERE '.$whereOrderBy,$bindarr); + $this->SetFetchMode($save); + + $false = false; + + if ($rows === false) { + return $false; + } + + + if (!isset($_ADODB_ACTIVE_DBS)) { + include(ADODB_DIR.'/adodb-active-record.inc.php'); + } + if (!class_exists($class)) { + ADOConnection::outp("Unknown class $class in GetActiveRcordsClass()"); + return $false; + } + $arr = array(); + foreach($rows as $row) { + + $obj = new $class($table,$primkeyArr,$this); + if ($obj->ErrorMsg()){ + $this->_errorMsg = $obj->ErrorMsg(); + return $false; + } + $obj->Set($row); + $arr[] = $obj; + } + return $arr; + } + + function &GetActiveRecords($table,$where=false,$bindarr=false,$primkeyArr=false) + { + $arr =& $this->GetActiveRecordsClass('ADODB_Active_Record', $table, $where, $bindarr, $primkeyArr); + return $arr; + } + + /** + * Close Connection + */ + function Close() + { + $rez = $this->_close(); + $this->_connectionID = false; + return $rez; + } + + /** + * Begin a Transaction. Must be followed by CommitTrans() or RollbackTrans(). + * + * @return true if succeeded or false if database does not support transactions + */ + function BeginTrans() + { + if ($this->debug) ADOConnection::outp("BeginTrans: Transactions not supported for this driver"); + return false; + } + + /* set transaction mode */ + function SetTransactionMode( $transaction_mode ) + { + $transaction_mode = $this->MetaTransaction($transaction_mode, $this->dataProvider); + $this->_transmode = $transaction_mode; + } +/* +http://msdn2.microsoft.com/en-US/ms173763.aspx +http://dev.mysql.com/doc/refman/5.0/en/innodb-transaction-isolation.html +http://www.postgresql.org/docs/8.1/interactive/sql-set-transaction.html +http://www.stanford.edu/dept/itss/docs/oracle/10g/server.101/b10759/statements_10005.htm +*/ + function MetaTransaction($mode,$db) + { + $mode = strtoupper($mode); + $mode = str_replace('ISOLATION LEVEL ','',$mode); + + switch($mode) { + + case 'READ UNCOMMITTED': + switch($db) { + case 'oci8': + case 'oracle': + return 'ISOLATION LEVEL READ COMMITTED'; + default: + return 'ISOLATION LEVEL READ UNCOMMITTED'; + } + break; + + case 'READ COMMITTED': + return 'ISOLATION LEVEL READ COMMITTED'; + break; + + case 'REPEATABLE READ': + switch($db) { + case 'oci8': + case 'oracle': + return 'ISOLATION LEVEL SERIALIZABLE'; + default: + return 'ISOLATION LEVEL REPEATABLE READ'; + } + break; + + case 'SERIALIZABLE': + return 'ISOLATION LEVEL SERIALIZABLE'; + break; + + default: + return $mode; + } + } + + /** + * If database does not support transactions, always return true as data always commited + * + * @param $ok set to false to rollback transaction, true to commit + * + * @return true/false. + */ + function CommitTrans($ok=true) + { return true;} + + + /** + * If database does not support transactions, rollbacks always fail, so return false + * + * @return true/false. + */ + function RollbackTrans() + { return false;} + + + /** + * return the databases that the driver can connect to. + * Some databases will return an empty array. + * + * @return an array of database names. + */ + function MetaDatabases() + { + global $ADODB_FETCH_MODE; + + if ($this->metaDatabasesSQL) { + $save = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + + if ($this->fetchMode !== false) $savem = $this->SetFetchMode(false); + + $arr = $this->GetCol($this->metaDatabasesSQL); + if (isset($savem)) $this->SetFetchMode($savem); + $ADODB_FETCH_MODE = $save; + + return $arr; + } + + return false; + } + + + /** + * @param ttype can either be 'VIEW' or 'TABLE' or false. + * If false, both views and tables are returned. + * "VIEW" returns only views + * "TABLE" returns only tables + * @param showSchema returns the schema/user with the table name, eg. USER.TABLE + * @param mask is the input mask - only supported by oci8 and postgresql + * + * @return array of tables for current database. + */ + function &MetaTables($ttype=false,$showSchema=false,$mask=false) + { + global $ADODB_FETCH_MODE; + + + $false = false; + if ($mask) { + return $false; + } + if ($this->metaTablesSQL) { + $save = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + + if ($this->fetchMode !== false) $savem = $this->SetFetchMode(false); + + $rs = $this->Execute($this->metaTablesSQL); + if (isset($savem)) $this->SetFetchMode($savem); + $ADODB_FETCH_MODE = $save; + + if ($rs === false) return $false; + $arr =& $rs->GetArray(); + $arr2 = array(); + + if ($hast = ($ttype && isset($arr[0][1]))) { + $showt = strncmp($ttype,'T',1); + } + + for ($i=0; $i < sizeof($arr); $i++) { + if ($hast) { + if ($showt == 0) { + if (strncmp($arr[$i][1],'T',1) == 0) $arr2[] = trim($arr[$i][0]); + } else { + if (strncmp($arr[$i][1],'V',1) == 0) $arr2[] = trim($arr[$i][0]); + } + } else + $arr2[] = trim($arr[$i][0]); + } + $rs->Close(); + return $arr2; + } + return $false; + } + + + function _findschema(&$table,&$schema) + { + if (!$schema && ($at = strpos($table,'.')) !== false) { + $schema = substr($table,0,$at); + $table = substr($table,$at+1); + } + } + + /** + * List columns in a database as an array of ADOFieldObjects. + * See top of file for definition of object. + * + * @param $table table name to query + * @param $normalize makes table name case-insensitive (required by some databases) + * @schema is optional database schema to use - not supported by all databases. + * + * @return array of ADOFieldObjects for current table. + */ + function &MetaColumns($table,$normalize=true) + { + global $ADODB_FETCH_MODE; + + $false = false; + + if (!empty($this->metaColumnsSQL)) { + + $schema = false; + $this->_findschema($table,$schema); + + $save = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + if ($this->fetchMode !== false) $savem = $this->SetFetchMode(false); + $rs = $this->Execute(sprintf($this->metaColumnsSQL,($normalize)?strtoupper($table):$table)); + if (isset($savem)) $this->SetFetchMode($savem); + $ADODB_FETCH_MODE = $save; + if ($rs === false || $rs->EOF) return $false; + + $retarr = array(); + while (!$rs->EOF) { //print_r($rs->fields); + $fld = new ADOFieldObject(); + $fld->name = $rs->fields[0]; + $fld->type = $rs->fields[1]; + if (isset($rs->fields[3]) && $rs->fields[3]) { + if ($rs->fields[3]>0) $fld->max_length = $rs->fields[3]; + $fld->scale = $rs->fields[4]; + if ($fld->scale>0) $fld->max_length += 1; + } else + $fld->max_length = $rs->fields[2]; + + if ($ADODB_FETCH_MODE == ADODB_FETCH_NUM) $retarr[] = $fld; + else $retarr[strtoupper($fld->name)] = $fld; + $rs->MoveNext(); + } + $rs->Close(); + return $retarr; + } + return $false; + } + + /** + * List indexes on a table as an array. + * @param table table name to query + * @param primary true to only show primary keys. Not actually used for most databases + * + * @return array of indexes on current table. Each element represents an index, and is itself an associative array. + + Array ( + [name_of_index] => Array + ( + [unique] => true or false + [columns] => Array + ( + [0] => firstname + [1] => lastname + ) + ) + */ + function &MetaIndexes($table, $primary = false, $owner = false) + { + $false = false; + return $false; + } + + /** + * List columns names in a table as an array. + * @param table table name to query + * + * @return array of column names for current table. + */ + function &MetaColumnNames($table, $numIndexes=false,$useattnum=false /* only for postgres */) + { + $objarr =& $this->MetaColumns($table); + if (!is_array($objarr)) { + $false = false; + return $false; + } + $arr = array(); + if ($numIndexes) { + $i = 0; + if ($useattnum) { + foreach($objarr as $v) + $arr[$v->attnum] = $v->name; + + } else + foreach($objarr as $v) $arr[$i++] = $v->name; + } else + foreach($objarr as $v) $arr[strtoupper($v->name)] = $v->name; + + return $arr; + } + + /** + * Different SQL databases used different methods to combine strings together. + * This function provides a wrapper. + * + * param s variable number of string parameters + * + * Usage: $db->Concat($str1,$str2); + * + * @return concatenated string + */ + function Concat() + { + $arr = func_get_args(); + return implode($this->concat_operator, $arr); + } + + + /** + * Converts a date "d" to a string that the database can understand. + * + * @param d a date in Unix date time format. + * + * @return date string in database date format + */ + function DBDate($d) + { + if (empty($d) && $d !== 0) return 'null'; + + if (is_string($d) && !is_numeric($d)) { + if ($d === 'null' || strncmp($d,"'",1) === 0) return $d; + if ($this->isoDates) return "'$d'"; + $d = ADOConnection::UnixDate($d); + } + + return adodb_date($this->fmtDate,$d); + } + + function BindDate($d) + { + $d = $this->DBDate($d); + if (strncmp($d,"'",1)) return $d; + + return substr($d,1,strlen($d)-2); + } + + function BindTimeStamp($d) + { + $d = $this->DBTimeStamp($d); + if (strncmp($d,"'",1)) return $d; + + return substr($d,1,strlen($d)-2); + } + + + /** + * Converts a timestamp "ts" to a string that the database can understand. + * + * @param ts a timestamp in Unix date time format. + * + * @return timestamp string in database timestamp format + */ + function DBTimeStamp($ts) + { + if (empty($ts) && $ts !== 0) return 'null'; + + # strlen(14) allows YYYYMMDDHHMMSS format + if (!is_string($ts) || (is_numeric($ts) && strlen($ts)<14)) + return adodb_date($this->fmtTimeStamp,$ts); + + if ($ts === 'null') return $ts; + if ($this->isoDates && strlen($ts) !== 14) return "'$ts'"; + + $ts = ADOConnection::UnixTimeStamp($ts); + return adodb_date($this->fmtTimeStamp,$ts); + } + + /** + * Also in ADORecordSet. + * @param $v is a date string in YYYY-MM-DD format + * + * @return date in unix timestamp format, or 0 if before TIMESTAMP_FIRST_YEAR, or false if invalid date format + */ + function UnixDate($v) + { + if (is_object($v)) { + // odbtp support + //( [year] => 2004 [month] => 9 [day] => 4 [hour] => 12 [minute] => 44 [second] => 8 [fraction] => 0 ) + return adodb_mktime($v->hour,$v->minute,$v->second,$v->month,$v->day, $v->year); + } + + if (is_numeric($v) && strlen($v) !== 8) return $v; + if (!preg_match( "|^([0-9]{4})[-/\.]?([0-9]{1,2})[-/\.]?([0-9]{1,2})|", + ($v), $rr)) return false; + + if ($rr[1] <= TIMESTAMP_FIRST_YEAR) return 0; + // h-m-s-MM-DD-YY + return @adodb_mktime(0,0,0,$rr[2],$rr[3],$rr[1]); + } + + + /** + * Also in ADORecordSet. + * @param $v is a timestamp string in YYYY-MM-DD HH-NN-SS format + * + * @return date in unix timestamp format, or 0 if before TIMESTAMP_FIRST_YEAR, or false if invalid date format + */ + function UnixTimeStamp($v) + { + if (is_object($v)) { + // odbtp support + //( [year] => 2004 [month] => 9 [day] => 4 [hour] => 12 [minute] => 44 [second] => 8 [fraction] => 0 ) + return adodb_mktime($v->hour,$v->minute,$v->second,$v->month,$v->day, $v->year); + } + + if (!preg_match( + "|^([0-9]{4})[-/\.]?([0-9]{1,2})[-/\.]?([0-9]{1,2})[ ,-]*(([0-9]{1,2}):?([0-9]{1,2}):?([0-9\.]{1,4}))?|", + ($v), $rr)) return false; + + if ($rr[1] <= TIMESTAMP_FIRST_YEAR && $rr[2]<= 1) return 0; + + // h-m-s-MM-DD-YY + if (!isset($rr[5])) return adodb_mktime(0,0,0,$rr[2],$rr[3],$rr[1]); + return @adodb_mktime($rr[5],$rr[6],$rr[7],$rr[2],$rr[3],$rr[1]); + } + + /** + * Also in ADORecordSet. + * + * Format database date based on user defined format. + * + * @param v is the character date in YYYY-MM-DD format, returned by database + * @param fmt is the format to apply to it, using date() + * + * @return a date formated as user desires + */ + + function UserDate($v,$fmt='Y-m-d',$gmt=false) + { + $tt = $this->UnixDate($v); + + // $tt == -1 if pre TIMESTAMP_FIRST_YEAR + if (($tt === false || $tt == -1) && $v != false) return $v; + else if ($tt == 0) return $this->emptyDate; + else if ($tt == -1) { // pre-TIMESTAMP_FIRST_YEAR + } + + return ($gmt) ? adodb_gmdate($fmt,$tt) : adodb_date($fmt,$tt); + + } + + /** + * + * @param v is the character timestamp in YYYY-MM-DD hh:mm:ss format + * @param fmt is the format to apply to it, using date() + * + * @return a timestamp formated as user desires + */ + function UserTimeStamp($v,$fmt='Y-m-d H:i:s',$gmt=false) + { + if (!isset($v)) return $this->emptyTimeStamp; + # strlen(14) allows YYYYMMDDHHMMSS format + if (is_numeric($v) && strlen($v)<14) return ($gmt) ? adodb_gmdate($fmt,$v) : adodb_date($fmt,$v); + $tt = $this->UnixTimeStamp($v); + // $tt == -1 if pre TIMESTAMP_FIRST_YEAR + if (($tt === false || $tt == -1) && $v != false) return $v; + if ($tt == 0) return $this->emptyTimeStamp; + return ($gmt) ? adodb_gmdate($fmt,$tt) : adodb_date($fmt,$tt); + } + + function escape($s,$magic_quotes=false) + { + return $this->addq($s,$magic_quotes); + } + + /** + * Quotes a string, without prefixing nor appending quotes. + */ + function addq($s,$magic_quotes=false) + { + if (!$magic_quotes) { + + if ($this->replaceQuote[0] == '\\'){ + // only since php 4.0.5 + $s = adodb_str_replace(array('\\',"\0"),array('\\\\',"\\\0"),$s); + //$s = str_replace("\0","\\\0", str_replace('\\','\\\\',$s)); + } + return str_replace("'",$this->replaceQuote,$s); + } + + // undo magic quotes for " + $s = str_replace('\\"','"',$s); + + if ($this->replaceQuote == "\\'") // ' already quoted, no need to change anything + return $s; + else {// change \' to '' for sybase/mssql + $s = str_replace('\\\\','\\',$s); + return str_replace("\\'",$this->replaceQuote,$s); + } + } + + /** + * Correctly quotes a string so that all strings are escaped. We prefix and append + * to the string single-quotes. + * An example is $db->qstr("Don't bother",magic_quotes_runtime()); + * + * @param s the string to quote + * @param [magic_quotes] if $s is GET/POST var, set to get_magic_quotes_gpc(). + * This undoes the stupidity of magic quotes for GPC. + * + * @return quoted string to be sent back to database + */ + function qstr($s,$magic_quotes=false) + { + if (!$magic_quotes) { + + if ($this->replaceQuote[0] == '\\'){ + // only since php 4.0.5 + $s = adodb_str_replace(array('\\',"\0"),array('\\\\',"\\\0"),$s); + //$s = str_replace("\0","\\\0", str_replace('\\','\\\\',$s)); + } + return "'".str_replace("'",$this->replaceQuote,$s)."'"; + } + + // undo magic quotes for " + $s = str_replace('\\"','"',$s); + + if ($this->replaceQuote == "\\'") // ' already quoted, no need to change anything + return "'$s'"; + else {// change \' to '' for sybase/mssql + $s = str_replace('\\\\','\\',$s); + return "'".str_replace("\\'",$this->replaceQuote,$s)."'"; + } + } + + + /** + * Will select the supplied $page number from a recordset, given that it is paginated in pages of + * $nrows rows per page. It also saves two boolean values saying if the given page is the first + * and/or last one of the recordset. Added by Iván Oliva to provide recordset pagination. + * + * See readme.htm#ex8 for an example of usage. + * + * @param sql + * @param nrows is the number of rows per page to get + * @param page is the page number to get (1-based) + * @param [inputarr] array of bind variables + * @param [secs2cache] is a private parameter only used by jlim + * @return the recordset ($rs->databaseType == 'array') + * + * NOTE: phpLens uses a different algorithm and does not use PageExecute(). + * + */ + function &PageExecute($sql, $nrows, $page, $inputarr=false, $secs2cache=0) + { + global $ADODB_INCLUDED_LIB; + if (empty($ADODB_INCLUDED_LIB)) include(ADODB_DIR.'/adodb-lib.inc.php'); + if ($this->pageExecuteCountRows) $rs =& _adodb_pageexecute_all_rows($this, $sql, $nrows, $page, $inputarr, $secs2cache); + else $rs =& _adodb_pageexecute_no_last_page($this, $sql, $nrows, $page, $inputarr, $secs2cache); + return $rs; + } + + + /** + * Will select the supplied $page number from a recordset, given that it is paginated in pages of + * $nrows rows per page. It also saves two boolean values saying if the given page is the first + * and/or last one of the recordset. Added by Iván Oliva to provide recordset pagination. + * + * @param secs2cache seconds to cache data, set to 0 to force query + * @param sql + * @param nrows is the number of rows per page to get + * @param page is the page number to get (1-based) + * @param [inputarr] array of bind variables + * @return the recordset ($rs->databaseType == 'array') + */ + function &CachePageExecute($secs2cache, $sql, $nrows, $page,$inputarr=false) + { + /*switch($this->dataProvider) { + case 'postgres': + case 'mysql': + break; + default: $secs2cache = 0; break; + }*/ + $rs =& $this->PageExecute($sql,$nrows,$page,$inputarr,$secs2cache); + return $rs; + } + +} // end class ADOConnection + + + + //============================================================================================== + // CLASS ADOFetchObj + //============================================================================================== + + /** + * Internal placeholder for record objects. Used by ADORecordSet->FetchObj(). + */ + class ADOFetchObj { + }; + + //============================================================================================== + // CLASS ADORecordSet_empty + //============================================================================================== + + /** + * Lightweight recordset when there are no records to be returned + */ + class ADORecordSet_empty + { + var $dataProvider = 'empty'; + var $databaseType = false; + var $EOF = true; + var $_numOfRows = 0; + var $fields = false; + var $connection = false; + function RowCount() {return 0;} + function RecordCount() {return 0;} + function PO_RecordCount(){return 0;} + function Close(){return true;} + function FetchRow() {return false;} + function FieldCount(){ return 0;} + function Init() {} + } + + //============================================================================================== + // DATE AND TIME FUNCTIONS + //============================================================================================== + if (!defined('ADODB_DATE_VERSION')) include(ADODB_DIR.'/adodb-time.inc.php'); + + //============================================================================================== + // CLASS ADORecordSet + //============================================================================================== + + if (PHP_VERSION < 5) include_once(ADODB_DIR.'/adodb-php4.inc.php'); + else include_once(ADODB_DIR.'/adodb-iterator.inc.php'); + /** + * RecordSet class that represents the dataset returned by the database. + * To keep memory overhead low, this class holds only the current row in memory. + * No prefetching of data is done, so the RecordCount() can return -1 ( which + * means recordcount not known). + */ + class ADORecordSet extends ADODB_BASE_RS { + /* + * public variables + */ + var $dataProvider = "native"; + var $fields = false; /// holds the current row data + var $blobSize = 100; /// any varchar/char field this size or greater is treated as a blob + /// in other words, we use a text area for editing. + var $canSeek = false; /// indicates that seek is supported + var $sql; /// sql text + var $EOF = false; /// Indicates that the current record position is after the last record in a Recordset object. + + var $emptyTimeStamp = ' '; /// what to display when $time==0 + var $emptyDate = ' '; /// what to display when $time==0 + var $debug = false; + var $timeCreated=0; /// datetime in Unix format rs created -- for cached recordsets + + var $bind = false; /// used by Fields() to hold array - should be private? + var $fetchMode; /// default fetch mode + var $connection = false; /// the parent connection + /* + * private variables + */ + var $_numOfRows = -1; /** number of rows, or -1 */ + var $_numOfFields = -1; /** number of fields in recordset */ + var $_queryID = -1; /** This variable keeps the result link identifier. */ + var $_currentRow = -1; /** This variable keeps the current row in the Recordset. */ + var $_closed = false; /** has recordset been closed */ + var $_inited = false; /** Init() should only be called once */ + var $_obj; /** Used by FetchObj */ + var $_names; /** Used by FetchObj */ + + var $_currentPage = -1; /** Added by Iván Oliva to implement recordset pagination */ + var $_atFirstPage = false; /** Added by Iván Oliva to implement recordset pagination */ + var $_atLastPage = false; /** Added by Iván Oliva to implement recordset pagination */ + var $_lastPageNo = -1; + var $_maxRecordCount = 0; + var $datetime = false; + + /** + * Constructor + * + * @param queryID this is the queryID returned by ADOConnection->_query() + * + */ + function ADORecordSet($queryID) + { + $this->_queryID = $queryID; + } + + + + function Init() + { + if ($this->_inited) return; + $this->_inited = true; + if ($this->_queryID) @$this->_initrs(); + else { + $this->_numOfRows = 0; + $this->_numOfFields = 0; + } + if ($this->_numOfRows != 0 && $this->_numOfFields && $this->_currentRow == -1) { + + $this->_currentRow = 0; + if ($this->EOF = ($this->_fetch() === false)) { + $this->_numOfRows = 0; // _numOfRows could be -1 + } + } else { + $this->EOF = true; + } + } + + + /** + * Generate a SELECT tag string from a recordset, and return the string. + * If the recordset has 2 cols, we treat the 1st col as the containing + * the text to display to the user, and 2nd col as the return value. Default + * strings are compared with the FIRST column. + * + * @param name name of SELECT tag + * @param [defstr] the value to hilite. Use an array for multiple hilites for listbox. + * @param [blank1stItem] true to leave the 1st item in list empty + * @param [multiple] true for listbox, false for popup + * @param [size] #rows to show for listbox. not used by popup + * @param [selectAttr] additional attributes to defined for SELECT tag. + * useful for holding javascript onChange='...' handlers. + & @param [compareFields0] when we have 2 cols in recordset, we compare the defstr with + * column 0 (1st col) if this is true. This is not documented. + * + * @return HTML + * + * changes by glen.davies@cce.ac.nz to support multiple hilited items + */ + function GetMenu($name,$defstr='',$blank1stItem=true,$multiple=false, + $size=0, $selectAttr='',$compareFields0=true) + { + global $ADODB_INCLUDED_LIB; + if (empty($ADODB_INCLUDED_LIB)) include(ADODB_DIR.'/adodb-lib.inc.php'); + return _adodb_getmenu($this, $name,$defstr,$blank1stItem,$multiple, + $size, $selectAttr,$compareFields0); + } + + + + /** + * Generate a SELECT tag string from a recordset, and return the string. + * If the recordset has 2 cols, we treat the 1st col as the containing + * the text to display to the user, and 2nd col as the return value. Default + * strings are compared with the SECOND column. + * + */ + function GetMenu2($name,$defstr='',$blank1stItem=true,$multiple=false,$size=0, $selectAttr='') + { + return $this->GetMenu($name,$defstr,$blank1stItem,$multiple, + $size, $selectAttr,false); + } + + /* + Grouped Menu + */ + function GetMenu3($name,$defstr='',$blank1stItem=true,$multiple=false, + $size=0, $selectAttr='') + { + global $ADODB_INCLUDED_LIB; + if (empty($ADODB_INCLUDED_LIB)) include(ADODB_DIR.'/adodb-lib.inc.php'); + return _adodb_getmenu_gp($this, $name,$defstr,$blank1stItem,$multiple, + $size, $selectAttr,false); + } + + /** + * return recordset as a 2-dimensional array. + * + * @param [nRows] is the number of rows to return. -1 means every row. + * + * @return an array indexed by the rows (0-based) from the recordset + */ + function &GetArray($nRows = -1) + { + global $ADODB_EXTENSION; if ($ADODB_EXTENSION) { + $results = adodb_getall($this,$nRows); + return $results; + } + $results = array(); + $cnt = 0; + while (!$this->EOF && $nRows != $cnt) { + $results[] = $this->fields; + $this->MoveNext(); + $cnt++; + } + return $results; + } + + function &GetAll($nRows = -1) + { + $arr =& $this->GetArray($nRows); + return $arr; + } + + /* + * Some databases allow multiple recordsets to be returned. This function + * will return true if there is a next recordset, or false if no more. + */ + function NextRecordSet() + { + return false; + } + + /** + * return recordset as a 2-dimensional array. + * Helper function for ADOConnection->SelectLimit() + * + * @param offset is the row to start calculations from (1-based) + * @param [nrows] is the number of rows to return + * + * @return an array indexed by the rows (0-based) from the recordset + */ + function &GetArrayLimit($nrows,$offset=-1) + { + if ($offset <= 0) { + $arr =& $this->GetArray($nrows); + return $arr; + } + + $this->Move($offset); + + $results = array(); + $cnt = 0; + while (!$this->EOF && $nrows != $cnt) { + $results[$cnt++] = $this->fields; + $this->MoveNext(); + } + + return $results; + } + + + /** + * Synonym for GetArray() for compatibility with ADO. + * + * @param [nRows] is the number of rows to return. -1 means every row. + * + * @return an array indexed by the rows (0-based) from the recordset + */ + function &GetRows($nRows = -1) + { + $arr =& $this->GetArray($nRows); + return $arr; + } + + /** + * return whole recordset as a 2-dimensional associative array if there are more than 2 columns. + * The first column is treated as the key and is not included in the array. + * If there is only 2 columns, it will return a 1 dimensional array of key-value pairs unless + * $force_array == true. + * + * @param [force_array] has only meaning if we have 2 data columns. If false, a 1 dimensional + * array is returned, otherwise a 2 dimensional array is returned. If this sounds confusing, + * read the source. + * + * @param [first2cols] means if there are more than 2 cols, ignore the remaining cols and + * instead of returning array[col0] => array(remaining cols), return array[col0] => col1 + * + * @return an associative array indexed by the first column of the array, + * or false if the data has less than 2 cols. + */ + function &GetAssoc($force_array = false, $first2cols = false) + { + global $ADODB_EXTENSION; + + $cols = $this->_numOfFields; + if ($cols < 2) { + $false = false; + return $false; + } + $numIndex = isset($this->fields[0]); + $results = array(); + + if (!$first2cols && ($cols > 2 || $force_array)) { + if ($ADODB_EXTENSION) { + if ($numIndex) { + while (!$this->EOF) { + $results[trim($this->fields[0])] = array_slice($this->fields, 1); + adodb_movenext($this); + } + } else { + while (!$this->EOF) { + // Fix for array_slice re-numbering numeric associative keys + $keys = array_slice(array_keys($this->fields), 1); + $sliced_array = array(); + + foreach($keys as $key) { + $sliced_array[$key] = $this->fields[$key]; + } + + $results[trim(reset($this->fields))] = $sliced_array; + adodb_movenext($this); + } + } + } else { + if ($numIndex) { + while (!$this->EOF) { + $results[trim($this->fields[0])] = array_slice($this->fields, 1); + $this->MoveNext(); + } + } else { + while (!$this->EOF) { + // Fix for array_slice re-numbering numeric associative keys + $keys = array_slice(array_keys($this->fields), 1); + $sliced_array = array(); + + foreach($keys as $key) { + $sliced_array[$key] = $this->fields[$key]; + } + + $results[trim(reset($this->fields))] = $sliced_array; + $this->MoveNext(); + } + } + } + } else { + if ($ADODB_EXTENSION) { + // return scalar values + if ($numIndex) { + while (!$this->EOF) { + // some bug in mssql PHP 4.02 -- doesn't handle references properly so we FORCE creating a new string + $results[trim(($this->fields[0]))] = $this->fields[1]; + adodb_movenext($this); + } + } else { + while (!$this->EOF) { + // some bug in mssql PHP 4.02 -- doesn't handle references properly so we FORCE creating a new string + $v1 = trim(reset($this->fields)); + $v2 = ''.next($this->fields); + $results[$v1] = $v2; + adodb_movenext($this); + } + } + } else { + if ($numIndex) { + while (!$this->EOF) { + // some bug in mssql PHP 4.02 -- doesn't handle references properly so we FORCE creating a new string + $results[trim(($this->fields[0]))] = $this->fields[1]; + $this->MoveNext(); + } + } else { + while (!$this->EOF) { + // some bug in mssql PHP 4.02 -- doesn't handle references properly so we FORCE creating a new string + $v1 = trim(reset($this->fields)); + $v2 = ''.next($this->fields); + $results[$v1] = $v2; + $this->MoveNext(); + } + } + } + } + + $ref =& $results; # workaround accelerator incompat with PHP 4.4 :( + return $ref; + } + + + /** + * + * @param v is the character timestamp in YYYY-MM-DD hh:mm:ss format + * @param fmt is the format to apply to it, using date() + * + * @return a timestamp formated as user desires + */ + function UserTimeStamp($v,$fmt='Y-m-d H:i:s') + { + if (is_numeric($v) && strlen($v)<14) return adodb_date($fmt,$v); + $tt = $this->UnixTimeStamp($v); + // $tt == -1 if pre TIMESTAMP_FIRST_YEAR + if (($tt === false || $tt == -1) && $v != false) return $v; + if ($tt === 0) return $this->emptyTimeStamp; + return adodb_date($fmt,$tt); + } + + + /** + * @param v is the character date in YYYY-MM-DD format, returned by database + * @param fmt is the format to apply to it, using date() + * + * @return a date formated as user desires + */ + function UserDate($v,$fmt='Y-m-d') + { + $tt = $this->UnixDate($v); + // $tt == -1 if pre TIMESTAMP_FIRST_YEAR + if (($tt === false || $tt == -1) && $v != false) return $v; + else if ($tt == 0) return $this->emptyDate; + else if ($tt == -1) { // pre-TIMESTAMP_FIRST_YEAR + } + return adodb_date($fmt,$tt); + } + + + /** + * @param $v is a date string in YYYY-MM-DD format + * + * @return date in unix timestamp format, or 0 if before TIMESTAMP_FIRST_YEAR, or false if invalid date format + */ + function UnixDate($v) + { + return ADOConnection::UnixDate($v); + } + + + /** + * @param $v is a timestamp string in YYYY-MM-DD HH-NN-SS format + * + * @return date in unix timestamp format, or 0 if before TIMESTAMP_FIRST_YEAR, or false if invalid date format + */ + function UnixTimeStamp($v) + { + return ADOConnection::UnixTimeStamp($v); + } + + + /** + * PEAR DB Compat - do not use internally + */ + function Free() + { + return $this->Close(); + } + + + /** + * PEAR DB compat, number of rows + */ + function NumRows() + { + return $this->_numOfRows; + } + + + /** + * PEAR DB compat, number of cols + */ + function NumCols() + { + return $this->_numOfFields; + } + + /** + * Fetch a row, returning false if no more rows. + * This is PEAR DB compat mode. + * + * @return false or array containing the current record + */ + function &FetchRow() + { + if ($this->EOF) { + $false = false; + return $false; + } + $arr = $this->fields; + $this->_currentRow++; + if (!$this->_fetch()) $this->EOF = true; + return $arr; + } + + + /** + * Fetch a row, returning PEAR_Error if no more rows. + * This is PEAR DB compat mode. + * + * @return DB_OK or error object + */ + function FetchInto(&$arr) + { + if ($this->EOF) return (defined('PEAR_ERROR_RETURN')) ? new PEAR_Error('EOF',-1): false; + $arr = $this->fields; + $this->MoveNext(); + return 1; // DB_OK + } + + + /** + * Move to the first row in the recordset. Many databases do NOT support this. + * + * @return true or false + */ + function MoveFirst() + { + if ($this->_currentRow == 0) return true; + return $this->Move(0); + } + + + /** + * Move to the last row in the recordset. + * + * @return true or false + */ + function MoveLast() + { + if ($this->_numOfRows >= 0) return $this->Move($this->_numOfRows-1); + if ($this->EOF) return false; + while (!$this->EOF) { + $f = $this->fields; + $this->MoveNext(); + } + $this->fields = $f; + $this->EOF = false; + return true; + } + + + /** + * Move to next record in the recordset. + * + * @return true if there still rows available, or false if there are no more rows (EOF). + */ + function MoveNext() + { + if (!$this->EOF) { + $this->_currentRow++; + if ($this->_fetch()) return true; + } + $this->EOF = true; + /* -- tested error handling when scrolling cursor -- seems useless. + $conn = $this->connection; + if ($conn && $conn->raiseErrorFn && ($errno = $conn->ErrorNo())) { + $fn = $conn->raiseErrorFn; + $fn($conn->databaseType,'MOVENEXT',$errno,$conn->ErrorMsg().' ('.$this->sql.')',$conn->host,$conn->database); + } + */ + return false; + } + + + /** + * Random access to a specific row in the recordset. Some databases do not support + * access to previous rows in the databases (no scrolling backwards). + * + * @param rowNumber is the row to move to (0-based) + * + * @return true if there still rows available, or false if there are no more rows (EOF). + */ + function Move($rowNumber = 0) + { + $this->EOF = false; + if ($rowNumber == $this->_currentRow) return true; + if ($rowNumber >= $this->_numOfRows) + if ($this->_numOfRows != -1) $rowNumber = $this->_numOfRows-2; + + if ($this->canSeek) { + + if ($this->_seek($rowNumber)) { + $this->_currentRow = $rowNumber; + if ($this->_fetch()) { + return true; + } + } else { + $this->EOF = true; + return false; + } + } else { + if ($rowNumber < $this->_currentRow) return false; + global $ADODB_EXTENSION; + if ($ADODB_EXTENSION) { + while (!$this->EOF && $this->_currentRow < $rowNumber) { + adodb_movenext($this); + } + } else { + + while (! $this->EOF && $this->_currentRow < $rowNumber) { + $this->_currentRow++; + + if (!$this->_fetch()) $this->EOF = true; + } + } + return !($this->EOF); + } + + $this->fields = false; + $this->EOF = true; + return false; + } + + + /** + * Get the value of a field in the current row by column name. + * Will not work if ADODB_FETCH_MODE is set to ADODB_FETCH_NUM. + * + * @param colname is the field to access + * + * @return the value of $colname column + */ + function Fields($colname) + { + return $this->fields[$colname]; + } + + function GetAssocKeys($upper=true) + { + $this->bind = array(); + for ($i=0; $i < $this->_numOfFields; $i++) { + $o = $this->FetchField($i); + if ($upper === 2) $this->bind[$o->name] = $i; + else $this->bind[($upper) ? strtoupper($o->name) : strtolower($o->name)] = $i; + } + } + + /** + * Use associative array to get fields array for databases that do not support + * associative arrays. Submitted by Paolo S. Asioli paolo.asioli#libero.it + * + * If you don't want uppercase cols, set $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC + * before you execute your SQL statement, and access $rs->fields['col'] directly. + * + * $upper 0 = lowercase, 1 = uppercase, 2 = whatever is returned by FetchField + */ + function &GetRowAssoc($upper=1) + { + $record = array(); + // if (!$this->fields) return $record; + + if (!$this->bind) { + $this->GetAssocKeys($upper); + } + + foreach($this->bind as $k => $v) { + $record[$k] = $this->fields[$v]; + } + + return $record; + } + + + /** + * Clean up recordset + * + * @return true or false + */ + function Close() + { + // free connection object - this seems to globally free the object + // and not merely the reference, so don't do this... + // $this->connection = false; + if (!$this->_closed) { + $this->_closed = true; + return $this->_close(); + } else + return true; + } + + /** + * synonyms RecordCount and RowCount + * + * @return the number of rows or -1 if this is not supported + */ + function RecordCount() {return $this->_numOfRows;} + + + /* + * If we are using PageExecute(), this will return the maximum possible rows + * that can be returned when paging a recordset. + */ + function MaxRecordCount() + { + return ($this->_maxRecordCount) ? $this->_maxRecordCount : $this->RecordCount(); + } + + /** + * synonyms RecordCount and RowCount + * + * @return the number of rows or -1 if this is not supported + */ + function RowCount() {return $this->_numOfRows;} + + + /** + * Portable RecordCount. Pablo Roca + * + * @return the number of records from a previous SELECT. All databases support this. + * + * But aware possible problems in multiuser environments. For better speed the table + * must be indexed by the condition. Heavy test this before deploying. + */ + function PO_RecordCount($table="", $condition="") { + + $lnumrows = $this->_numOfRows; + // the database doesn't support native recordcount, so we do a workaround + if ($lnumrows == -1 && $this->connection) { + IF ($table) { + if ($condition) $condition = " WHERE " . $condition; + $resultrows = &$this->connection->Execute("SELECT COUNT(*) FROM $table $condition"); + if ($resultrows) $lnumrows = reset($resultrows->fields); + } + } + return $lnumrows; + } + + + /** + * @return the current row in the recordset. If at EOF, will return the last row. 0-based. + */ + function CurrentRow() {return $this->_currentRow;} + + /** + * synonym for CurrentRow -- for ADO compat + * + * @return the current row in the recordset. If at EOF, will return the last row. 0-based. + */ + function AbsolutePosition() {return $this->_currentRow;} + + /** + * @return the number of columns in the recordset. Some databases will set this to 0 + * if no records are returned, others will return the number of columns in the query. + */ + function FieldCount() {return $this->_numOfFields;} + + + /** + * Get the ADOFieldObject of a specific column. + * + * @param fieldoffset is the column position to access(0-based). + * + * @return the ADOFieldObject for that column, or false. + */ + function &FetchField($fieldoffset = -1) + { + // must be defined by child class + + $false = false; + return $false; + } + + /** + * Get the ADOFieldObjects of all columns in an array. + * + */ + function& FieldTypesArray() + { + $arr = array(); + for ($i=0, $max=$this->_numOfFields; $i < $max; $i++) + $arr[] = $this->FetchField($i); + return $arr; + } + + /** + * Return the fields array of the current row as an object for convenience. + * The default case is lowercase field names. + * + * @return the object with the properties set to the fields of the current row + */ + function &FetchObj() + { + $o =& $this->FetchObject(false); + return $o; + } + + /** + * Return the fields array of the current row as an object for convenience. + * The default case is uppercase. + * + * @param $isupper to set the object property names to uppercase + * + * @return the object with the properties set to the fields of the current row + */ + function &FetchObject($isupper=true) + { + if (empty($this->_obj)) { + $this->_obj = new ADOFetchObj(); + $this->_names = array(); + for ($i=0; $i <$this->_numOfFields; $i++) { + $f = $this->FetchField($i); + $this->_names[] = $f->name; + } + } + $i = 0; + if (PHP_VERSION >= 5) $o = clone($this->_obj); + else $o = $this->_obj; + + for ($i=0; $i <$this->_numOfFields; $i++) { + $name = $this->_names[$i]; + if ($isupper) $n = strtoupper($name); + else $n = $name; + + $o->$n = $this->Fields($name); + } + return $o; + } + + /** + * Return the fields array of the current row as an object for convenience. + * The default is lower-case field names. + * + * @return the object with the properties set to the fields of the current row, + * or false if EOF + * + * Fixed bug reported by tim@orotech.net + */ + function &FetchNextObj() + { + $o =& $this->FetchNextObject(false); + return $o; + } + + + /** + * Return the fields array of the current row as an object for convenience. + * The default is upper case field names. + * + * @param $isupper to set the object property names to uppercase + * + * @return the object with the properties set to the fields of the current row, + * or false if EOF + * + * Fixed bug reported by tim@orotech.net + */ + function &FetchNextObject($isupper=true) + { + $o = false; + if ($this->_numOfRows != 0 && !$this->EOF) { + $o = $this->FetchObject($isupper); + $this->_currentRow++; + if ($this->_fetch()) return $o; + } + $this->EOF = true; + return $o; + } + + /** + * Get the metatype of the column. This is used for formatting. This is because + * many databases use different names for the same type, so we transform the original + * type to our standardised version which uses 1 character codes: + * + * @param t is the type passed in. Normally is ADOFieldObject->type. + * @param len is the maximum length of that field. This is because we treat character + * fields bigger than a certain size as a 'B' (blob). + * @param fieldobj is the field object returned by the database driver. Can hold + * additional info (eg. primary_key for mysql). + * + * @return the general type of the data: + * C for character < 250 chars + * X for teXt (>= 250 chars) + * B for Binary + * N for numeric or floating point + * D for date + * T for timestamp + * L for logical/Boolean + * I for integer + * R for autoincrement counter/integer + * + * + */ + function MetaType($t,$len=-1,$fieldobj=false) + { + if (is_object($t)) { + $fieldobj = $t; + $t = $fieldobj->type; + $len = $fieldobj->max_length; + } + // changed in 2.32 to hashing instead of switch stmt for speed... + static $typeMap = array( + 'VARCHAR' => 'C', + 'VARCHAR2' => 'C', + 'CHAR' => 'C', + 'C' => 'C', + 'STRING' => 'C', + 'NCHAR' => 'C', + 'NVARCHAR' => 'C', + 'VARYING' => 'C', + 'BPCHAR' => 'C', + 'CHARACTER' => 'C', + 'INTERVAL' => 'C', # Postgres + 'MACADDR' => 'C', # postgres + ## + 'LONGCHAR' => 'X', + 'TEXT' => 'X', + 'NTEXT' => 'X', + 'M' => 'X', + 'X' => 'X', + 'CLOB' => 'X', + 'NCLOB' => 'X', + 'LVARCHAR' => 'X', + ## + 'BLOB' => 'B', + 'IMAGE' => 'B', + 'BINARY' => 'B', + 'VARBINARY' => 'B', + 'LONGBINARY' => 'B', + 'B' => 'B', + ## + 'YEAR' => 'D', // mysql + 'DATE' => 'D', + 'D' => 'D', + ## + 'UNIQUEIDENTIFIER' => 'C', # MS SQL Server + ## + 'TIME' => 'T', + 'TIMESTAMP' => 'T', + 'DATETIME' => 'T', + 'TIMESTAMPTZ' => 'T', + 'T' => 'T', + 'TIMESTAMP WITHOUT TIME ZONE' => 'T', // postgresql + ## + 'BOOL' => 'L', + 'BOOLEAN' => 'L', + 'BIT' => 'L', + 'L' => 'L', + ## + 'COUNTER' => 'R', + 'R' => 'R', + 'SERIAL' => 'R', // ifx + 'INT IDENTITY' => 'R', + ## + 'INT' => 'I', + 'INT2' => 'I', + 'INT4' => 'I', + 'INT8' => 'I', + 'INTEGER' => 'I', + 'INTEGER UNSIGNED' => 'I', + 'SHORT' => 'I', + 'TINYINT' => 'I', + 'SMALLINT' => 'I', + 'I' => 'I', + ## + 'LONG' => 'N', // interbase is numeric, oci8 is blob + 'BIGINT' => 'N', // this is bigger than PHP 32-bit integers + 'DECIMAL' => 'N', + 'DEC' => 'N', + 'REAL' => 'N', + 'DOUBLE' => 'N', + 'DOUBLE PRECISION' => 'N', + 'SMALLFLOAT' => 'N', + 'FLOAT' => 'N', + 'NUMBER' => 'N', + 'NUM' => 'N', + 'NUMERIC' => 'N', + 'MONEY' => 'N', + + ## informix 9.2 + 'SQLINT' => 'I', + 'SQLSERIAL' => 'I', + 'SQLSMINT' => 'I', + 'SQLSMFLOAT' => 'N', + 'SQLFLOAT' => 'N', + 'SQLMONEY' => 'N', + 'SQLDECIMAL' => 'N', + 'SQLDATE' => 'D', + 'SQLVCHAR' => 'C', + 'SQLCHAR' => 'C', + 'SQLDTIME' => 'T', + 'SQLINTERVAL' => 'N', + 'SQLBYTES' => 'B', + 'SQLTEXT' => 'X', + ## informix 10 + "SQLINT8" => 'I8', + "SQLSERIAL8" => 'I8', + "SQLNCHAR" => 'C', + "SQLNVCHAR" => 'C', + "SQLLVARCHAR" => 'X', + "SQLBOOL" => 'L' + ); + + $tmap = false; + $t = strtoupper($t); + $tmap = (isset($typeMap[$t])) ? $typeMap[$t] : 'N'; + switch ($tmap) { + case 'C': + + // is the char field is too long, return as text field... + if ($this->blobSize >= 0) { + if ($len > $this->blobSize) return 'X'; + } else if ($len > 250) { + return 'X'; + } + return 'C'; + + case 'I': + if (!empty($fieldobj->primary_key)) return 'R'; + return 'I'; + + case false: + return 'N'; + + case 'B': + if (isset($fieldobj->binary)) + return ($fieldobj->binary) ? 'B' : 'X'; + return 'B'; + + case 'D': + if (!empty($this->connection) && !empty($this->connection->datetime)) return 'T'; + return 'D'; + + default: + if ($t == 'LONG' && $this->dataProvider == 'oci8') return 'B'; + return $tmap; + } + } + + + function _close() {} + + /** + * set/returns the current recordset page when paginating + */ + function AbsolutePage($page=-1) + { + if ($page != -1) $this->_currentPage = $page; + return $this->_currentPage; + } + + /** + * set/returns the status of the atFirstPage flag when paginating + */ + function AtFirstPage($status=false) + { + if ($status != false) $this->_atFirstPage = $status; + return $this->_atFirstPage; + } + + function LastPageNo($page = false) + { + if ($page != false) $this->_lastPageNo = $page; + return $this->_lastPageNo; + } + + /** + * set/returns the status of the atLastPage flag when paginating + */ + function AtLastPage($status=false) + { + if ($status != false) $this->_atLastPage = $status; + return $this->_atLastPage; + } + +} // end class ADORecordSet + + //============================================================================================== + // CLASS ADORecordSet_array + //============================================================================================== + + /** + * This class encapsulates the concept of a recordset created in memory + * as an array. This is useful for the creation of cached recordsets. + * + * Note that the constructor is different from the standard ADORecordSet + */ + + class ADORecordSet_array extends ADORecordSet + { + var $databaseType = 'array'; + + var $_array; // holds the 2-dimensional data array + var $_types; // the array of types of each column (C B I L M) + var $_colnames; // names of each column in array + var $_skiprow1; // skip 1st row because it holds column names + var $_fieldobjects; // holds array of field objects + var $canSeek = true; + var $affectedrows = false; + var $insertid = false; + var $sql = ''; + var $compat = false; + /** + * Constructor + * + */ + function ADORecordSet_array($fakeid=1) + { + global $ADODB_FETCH_MODE,$ADODB_COMPAT_FETCH; + + // fetch() on EOF does not delete $this->fields + $this->compat = !empty($ADODB_COMPAT_FETCH); + $this->ADORecordSet($fakeid); // fake queryID + $this->fetchMode = $ADODB_FETCH_MODE; + } + + function _transpose($addfieldnames=true) + { + global $ADODB_INCLUDED_LIB; + + if (empty($ADODB_INCLUDED_LIB)) include(ADODB_DIR.'/adodb-lib.inc.php'); + $hdr = true; + + $fobjs = $addfieldnames ? $this->_fieldobjects : false; + adodb_transpose($this->_array, $newarr, $hdr, $fobjs); + //adodb_pr($newarr); + + $this->_skiprow1 = false; + $this->_array =& $newarr; + $this->_colnames = $hdr; + + adodb_probetypes($newarr,$this->_types); + + $this->_fieldobjects = array(); + + foreach($hdr as $k => $name) { + $f = new ADOFieldObject(); + $f->name = $name; + $f->type = $this->_types[$k]; + $f->max_length = -1; + $this->_fieldobjects[] = $f; + } + $this->fields = reset($this->_array); + + $this->_initrs(); + + } + + /** + * Setup the array. + * + * @param array is a 2-dimensional array holding the data. + * The first row should hold the column names + * unless paramter $colnames is used. + * @param typearr holds an array of types. These are the same types + * used in MetaTypes (C,B,L,I,N). + * @param [colnames] array of column names. If set, then the first row of + * $array should not hold the column names. + */ + function InitArray($array,$typearr,$colnames=false) + { + $this->_array = $array; + $this->_types = $typearr; + if ($colnames) { + $this->_skiprow1 = false; + $this->_colnames = $colnames; + } else { + $this->_skiprow1 = true; + $this->_colnames = $array[0]; + } + $this->Init(); + } + /** + * Setup the Array and datatype file objects + * + * @param array is a 2-dimensional array holding the data. + * The first row should hold the column names + * unless paramter $colnames is used. + * @param fieldarr holds an array of ADOFieldObject's. + */ + function InitArrayFields(&$array,&$fieldarr) + { + $this->_array =& $array; + $this->_skiprow1= false; + if ($fieldarr) { + $this->_fieldobjects =& $fieldarr; + } + $this->Init(); + } + + function &GetArray($nRows=-1) + { + if ($nRows == -1 && $this->_currentRow <= 0 && !$this->_skiprow1) { + return $this->_array; + } else { + $arr =& ADORecordSet::GetArray($nRows); + return $arr; + } + } + + function _initrs() + { + $this->_numOfRows = sizeof($this->_array); + if ($this->_skiprow1) $this->_numOfRows -= 1; + + $this->_numOfFields =(isset($this->_fieldobjects)) ? + sizeof($this->_fieldobjects):sizeof($this->_types); + } + + /* Use associative array to get fields array */ + function Fields($colname) + { + $mode = isset($this->adodbFetchMode) ? $this->adodbFetchMode : $this->fetchMode; + + if ($mode & ADODB_FETCH_ASSOC) { + if (!isset($this->fields[$colname])) $colname = strtolower($colname); + return $this->fields[$colname]; + } + if (!$this->bind) { + $this->bind = array(); + for ($i=0; $i < $this->_numOfFields; $i++) { + $o = $this->FetchField($i); + $this->bind[strtoupper($o->name)] = $i; + } + } + return $this->fields[$this->bind[strtoupper($colname)]]; + } + + function &FetchField($fieldOffset = -1) + { + if (isset($this->_fieldobjects)) { + return $this->_fieldobjects[$fieldOffset]; + } + $o = new ADOFieldObject(); + $o->name = $this->_colnames[$fieldOffset]; + $o->type = $this->_types[$fieldOffset]; + $o->max_length = -1; // length not known + + return $o; + } + + function _seek($row) + { + if (sizeof($this->_array) && 0 <= $row && $row < $this->_numOfRows) { + $this->_currentRow = $row; + if ($this->_skiprow1) $row += 1; + $this->fields = $this->_array[$row]; + return true; + } + return false; + } + + function MoveNext() + { + if (!$this->EOF) { + $this->_currentRow++; + + $pos = $this->_currentRow; + + if ($this->_numOfRows <= $pos) { + if (!$this->compat) $this->fields = false; + } else { + if ($this->_skiprow1) $pos += 1; + $this->fields = $this->_array[$pos]; + return true; + } + $this->EOF = true; + } + + return false; + } + + function _fetch() + { + $pos = $this->_currentRow; + + if ($this->_numOfRows <= $pos) { + if (!$this->compat) $this->fields = false; + return false; + } + if ($this->_skiprow1) $pos += 1; + $this->fields = $this->_array[$pos]; + return true; + } + + function _close() + { + return true; + } + + } // ADORecordSet_array + + //============================================================================================== + // HELPER FUNCTIONS + //============================================================================================== + + /** + * Synonym for ADOLoadCode. Private function. Do not use. + * + * @deprecated + */ + function ADOLoadDB($dbType) + { + return ADOLoadCode($dbType); + } + + /** + * Load the code for a specific database driver. Private function. Do not use. + */ + function ADOLoadCode($dbType) + { + global $ADODB_LASTDB; + + if (!$dbType) return false; + $db = strtolower($dbType); + switch ($db) { + case 'ado': + if (PHP_VERSION >= 5) $db = 'ado5'; + $class = 'ado'; + break; + case 'ifx': + case 'maxsql': $class = $db = 'mysqlt'; break; + case 'postgres': + case 'postgres8': + case 'pgsql': $class = $db = 'postgres7'; break; + default: + $class = $db; break; + } + + $file = ADODB_DIR."/drivers/adodb-".$db.".inc.php"; + @include_once($file); + $ADODB_LASTDB = $class; + if (class_exists("ADODB_" . $class)) return $class; + + //ADOConnection::outp(adodb_pr(get_declared_classes(),true)); + if (!file_exists($file)) ADOConnection::outp("Missing file: $file"); + else ADOConnection::outp("Syntax error in file: $file"); + return false; + } + + /** + * synonym for ADONewConnection for people like me who cannot remember the correct name + */ + function &NewADOConnection($db='') + { + $tmp =& ADONewConnection($db); + return $tmp; + } + + /** + * Instantiate a new Connection class for a specific database driver. + * + * @param [db] is the database Connection object to create. If undefined, + * use the last database driver that was loaded by ADOLoadCode(). + * + * @return the freshly created instance of the Connection class. + */ + function &ADONewConnection($db='') + { + GLOBAL $ADODB_NEWCONNECTION, $ADODB_LASTDB; + + if (!defined('ADODB_ASSOC_CASE')) define('ADODB_ASSOC_CASE',2); + $errorfn = (defined('ADODB_ERROR_HANDLER')) ? ADODB_ERROR_HANDLER : false; + $false = false; + if ($at = strpos($db,'://')) { + $origdsn = $db; + if (PHP_VERSION < 5) $dsna = @parse_url($db); + else { + $fakedsn = 'fake'.substr($db,$at); + $dsna = @parse_url($fakedsn); + $dsna['scheme'] = substr($db,0,$at); + + if (strncmp($db,'pdo',3) == 0) { + $sch = explode('_',$dsna['scheme']); + if (sizeof($sch)>1) { + $dsna['host'] = isset($dsna['host']) ? rawurldecode($dsna['host']) : ''; + $dsna['host'] = rawurlencode($sch[1].':host='.rawurldecode($dsna['host'])); + $dsna['scheme'] = 'pdo'; + } + } + } + + if (!$dsna) { + // special handling of oracle, which might not have host + $db = str_replace('@/','@adodb-fakehost/',$db); + $dsna = parse_url($db); + if (!$dsna) return $false; + $dsna['host'] = ''; + } + $db = @$dsna['scheme']; + if (!$db) return $false; + $dsna['host'] = isset($dsna['host']) ? rawurldecode($dsna['host']) : ''; + $dsna['user'] = isset($dsna['user']) ? rawurldecode($dsna['user']) : ''; + $dsna['pass'] = isset($dsna['pass']) ? rawurldecode($dsna['pass']) : ''; + $dsna['path'] = isset($dsna['path']) ? rawurldecode(substr($dsna['path'],1)) : ''; # strip off initial / + + if (isset($dsna['query'])) { + $opt1 = explode('&',$dsna['query']); + foreach($opt1 as $k => $v) { + $arr = explode('=',$v); + $opt[$arr[0]] = isset($arr[1]) ? rawurldecode($arr[1]) : 1; + } + } else $opt = array(); + } + /* + * phptype: Database backend used in PHP (mysql, odbc etc.) + * dbsyntax: Database used with regards to SQL syntax etc. + * protocol: Communication protocol to use (tcp, unix etc.) + * hostspec: Host specification (hostname[:port]) + * database: Database to use on the DBMS server + * username: User name for login + * password: Password for login + */ + if (!empty($ADODB_NEWCONNECTION)) { + $obj = $ADODB_NEWCONNECTION($db); + + } else { + + if (!isset($ADODB_LASTDB)) $ADODB_LASTDB = ''; + if (empty($db)) $db = $ADODB_LASTDB; + + if ($db != $ADODB_LASTDB) $db = ADOLoadCode($db); + + if (!$db) { + if (isset($origdsn)) $db = $origdsn; + if ($errorfn) { + // raise an error + $ignore = false; + $errorfn('ADONewConnection', 'ADONewConnection', -998, + "could not load the database driver for '$db'", + $db,false,$ignore); + } else + ADOConnection::outp( "

    ADONewConnection: Unable to load database driver '$db'

    ",false); + + return $false; + } + + $cls = 'ADODB_'.$db; + if (!class_exists($cls)) { + adodb_backtrace(); + return $false; + } + + $obj = new $cls(); + } + + # constructor should not fail + if ($obj) { + if ($errorfn) $obj->raiseErrorFn = $errorfn; + if (isset($dsna)) { + if (isset($dsna['port'])) $obj->port = $dsna['port']; + foreach($opt as $k => $v) { + switch(strtolower($k)) { + case 'new': + $nconnect = true; $persist = true; break; + case 'persist': + case 'persistent': $persist = $v; break; + case 'debug': $obj->debug = (integer) $v; break; + #ibase + case 'role': $obj->role = $v; break; + case 'dialect': $obj->dialect = (integer) $v; break; + case 'charset': $obj->charset = $v; $obj->charSet=$v; break; + case 'buffers': $obj->buffers = $v; break; + case 'fetchmode': $obj->SetFetchMode($v); break; + #ado + case 'charpage': $obj->charPage = $v; break; + #mysql, mysqli + case 'clientflags': $obj->clientFlags = $v; break; + #mysql, mysqli, postgres + case 'port': $obj->port = $v; break; + #mysqli + case 'socket': $obj->socket = $v; break; + #oci8 + case 'nls_date_format': $obj->NLS_DATE_FORMAT = $v; break; + } + } + if (empty($persist)) + $ok = $obj->Connect($dsna['host'], $dsna['user'], $dsna['pass'], $dsna['path']); + else if (empty($nconnect)) + $ok = $obj->PConnect($dsna['host'], $dsna['user'], $dsna['pass'], $dsna['path']); + else + $ok = $obj->NConnect($dsna['host'], $dsna['user'], $dsna['pass'], $dsna['path']); + + if (!$ok) return $false; + } + } + return $obj; + } + + + + // $perf == true means called by NewPerfMonitor(), otherwise for data dictionary + function _adodb_getdriver($provider,$drivername,$perf=false) + { + switch ($provider) { + case 'odbtp': if (strncmp('odbtp_',$drivername,6)==0) return substr($drivername,6); + case 'odbc' : if (strncmp('odbc_',$drivername,5)==0) return substr($drivername,5); + case 'ado' : if (strncmp('ado_',$drivername,4)==0) return substr($drivername,4); + case 'native': break; + default: + return $provider; + } + + switch($drivername) { + case 'mysqlt': + case 'mysqli': + $drivername='mysql'; + break; + case 'postgres7': + case 'postgres8': + $drivername = 'postgres'; + break; + case 'firebird15': $drivername = 'firebird'; break; + case 'oracle': $drivername = 'oci8'; break; + case 'access': if ($perf) $drivername = ''; break; + case 'db2' : break; + case 'sapdb' : break; + default: + $drivername = 'generic'; + break; + } + return $drivername; + } + + function &NewPerfMonitor(&$conn) + { + $false = false; + $drivername = _adodb_getdriver($conn->dataProvider,$conn->databaseType,true); + if (!$drivername || $drivername == 'generic') return $false; + include_once(ADODB_DIR.'/adodb-perf.inc.php'); + @include_once(ADODB_DIR."/perf/perf-$drivername.inc.php"); + $class = "Perf_$drivername"; + if (!class_exists($class)) return $false; + $perf = new $class($conn); + + return $perf; + } + + function &NewDataDictionary(&$conn,$drivername=false) + { + $false = false; + if (!$drivername) $drivername = _adodb_getdriver($conn->dataProvider,$conn->databaseType); + + include_once(ADODB_DIR.'/adodb-lib.inc.php'); + include_once(ADODB_DIR.'/adodb-datadict.inc.php'); + $path = ADODB_DIR."/datadict/datadict-$drivername.inc.php"; + + if (!file_exists($path)) { + ADOConnection::outp("Dictionary driver '$path' not available"); + return $false; + } + include_once($path); + $class = "ADODB2_$drivername"; + $dict = new $class(); + $dict->dataProvider = $conn->dataProvider; + $dict->connection = &$conn; + $dict->upperName = strtoupper($drivername); + $dict->quote = $conn->nameQuote; + if (!empty($conn->_connectionID)) + $dict->serverInfo = $conn->ServerInfo(); + + return $dict; + } + + + + /* + Perform a print_r, with pre tags for better formatting. + */ + function adodb_pr($var,$as_string=false) + { + if ($as_string) ob_start(); + + if (isset($_SERVER['HTTP_USER_AGENT'])) { + echo "
    \n";print_r($var);echo "
    \n"; + } else + print_r($var); + + if ($as_string) { + $s = ob_get_contents(); + ob_end_clean(); + return $s; + } + } + + /* + Perform a stack-crawl and pretty print it. + + @param printOrArr Pass in a boolean to indicate print, or an $exception->trace array (assumes that print is true then). + @param levels Number of levels to display + */ + function adodb_backtrace($printOrArr=true,$levels=9999) + { + global $ADODB_INCLUDED_LIB; + if (empty($ADODB_INCLUDED_LIB)) include(ADODB_DIR.'/adodb-lib.inc.php'); + return _adodb_backtrace($printOrArr,$levels); + } + + + +} +?> diff --git a/upload/includes/adodb/adodb.php b/upload/includes/adodb/adodb.php new file mode 100644 index 00000000..db8b8bf7 --- /dev/null +++ b/upload/includes/adodb/adodb.php @@ -0,0 +1,7 @@ +debug = true; + @$db->Connect($server, $user, $password, $database); + +?> \ No newline at end of file diff --git a/upload/includes/adodb/drivers/adodb-mysql.inc.php b/upload/includes/adodb/drivers/adodb-mysql.inc.php new file mode 100644 index 00000000..dfb0f796 --- /dev/null +++ b/upload/includes/adodb/drivers/adodb-mysql.inc.php @@ -0,0 +1,1089 @@ +total_queries_sql[] = $query; + //if(!mysql_query($query)) die(mysql_error()); + $this->total_queries++; + $this->Execute($query); + if(mysql_error()) die ($this->db_query.'
    '.mysql_error()); + return $this->insert_id(); + + } + + /** + * Function used to Update data in database + * @param : table name + * @param : fields array + * @param : values array + * @param : Condition params + * @params : Extra params + */ + function update($tbl,$flds,$vls,$cond,$ep=NULL) + { + $total_fields = count($flds); + $count = 0; + for($i=0;$i<$total_fields;$i++) + { + $count++; + //$val = mysql_clean($vls[$i]); + $val = ($vls[$i]); + preg_match('/\|no_mc\|/',$val,$matches); + //pr($matches); + if($matches[0]!='') + $val = preg_replace('/\|no_mc\|/','',$val); + else + $val = mysql_clean($val); + + $needle = substr($val,0,3); + + if($needle != '|f|') + $fields_query .= $flds[$i]."='".$val."'"; + else + { + $val = substr($val,3,strlen($val)); + $fields_query .= $flds[$i]."=".$val.""; + } + if($total_fields!=$count) + $fields_query .= ','; + } + //Complete Query + $query = "UPDATE $tbl SET $fields_query WHERE $cond $ep"; + //if(!mysql_query($query)) die($query.'
    '.mysql_error()); + $this->total_queries++; + $this->total_queries_sql[] = $query; + $this->Execute($query); + if(mysql_error()) die ($this->db_query.'
    '.mysql_error()); + return $query; + + } + + + /** + * Function used to Delete data in database + * @param : table name + * @param : fields array + * @param : values array + * @params : Extra params + */ + function delete($tbl,$flds,$vls,$ep=NULL) + { + //dbDelete($tbl,$flds,$vls,$ep); + + + global $db ; + $total_fields = count($flds); + $count = 0; + for($i=0;$i<$total_fields;$i++) + { + $count++; + $val = mysql_clean($vls[$i]); + $needle = substr($val,0,3); + if($needle != '|f|') + $fields_query .= $flds[$i]."='".$val."'"; + else + { + $val = substr($val,3,strlen($val)); + $fields_query .= $flds[$i]."=".$val.""; + } + if($total_fields!=$count) + $fields_query .= ' AND '; + } + //Complete Query + $query = "DELETE FROM $tbl WHERE $fields_query $ep"; + //if(!mysql_query($query)) die(mysql_error()); + $this->total_queries++; + $this->total_queries_sql[] = $query; + $this->Execute($query); + if(mysql_error()) die ($this->db_query.'
    '.mysql_error()); + + } + + /** + * Function used to select data from table + * @param : table name + * @param : fields array + * @param : values array + * @params : Extra params + */ + function select($tbl,$fields='*',$cond=false,$limit=false,$order=false,$ep=false) + { + //return dbselect($tbl,$fields,$cond,$limit,$order); + $query_params = ''; + //Making Condition possible + if($cond) + $where = " WHERE "; + else + $where = false; + + $query_params .= $where; + if($where) + { + $query_params .= $cond; + } + + if($order) + $query_params .= " ORDER BY $order "; + if($limit) + $query_params .= " LIMIT $limit "; + + $query = " SELECT $fields FROM $tbl $query_params $ep "; + + //Finally Executing + $data = $this->Execute($query); + $this->num_rows = $data->_numOfRows; + $this->total_queries++; + $this->total_queries_sql[] = $query; + + //Now Get Rows and return that data + if($this->num_rows > 0) + return $data->getrows(); + else + return false; + } + + + /** + * Function used to count tables + */ + function count($tbl,$fields='*',$cond=false) + { + return dbcount($tbl,$fields,$cond); + } + + + function ADODB_mysql() + { + if (defined('ADODB_EXTENSION')) $this->rsPrefix .= 'ext_'; + + $this->ADODB_EXEC_CONFIGS(); + } + + function ServerInfo() + { + $arr['description'] = ADOConnection::GetOne("select version()"); + $arr['version'] = ADOConnection::_findvers($arr['description']); + return $arr; + } + + function IfNull( $field, $ifNull ) + { + return " IFNULL($field, $ifNull) "; // if MySQL + } + + + function &MetaTables($ttype=false,$showSchema=false,$mask=false) + { + $save = $this->metaTablesSQL; + if ($showSchema && is_string($showSchema)) { + $this->metaTablesSQL .= " from $showSchema"; + } + + if ($mask) { + $mask = $this->qstr($mask); + $this->metaTablesSQL .= " like $mask"; + } + $ret =& ADOConnection::MetaTables($ttype,$showSchema); + + $this->metaTablesSQL = $save; + return $ret; + } + + + function &MetaIndexes ($table, $primary = FALSE, $owner=false) + { + // save old fetch mode + global $ADODB_FETCH_MODE; + + $false = false; + $save = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + if ($this->fetchMode !== FALSE) { + $savem = $this->SetFetchMode(FALSE); + } + + // get index details + $rs = $this->Execute(sprintf('SHOW INDEX FROM %s',$table)); + + // restore fetchmode + if (isset($savem)) { + $this->SetFetchMode($savem); + } + $ADODB_FETCH_MODE = $save; + + if (!is_object($rs)) { + return $false; + } + + $indexes = array (); + + // parse index data into array + while ($row = $rs->FetchRow()) { + if ($primary == FALSE AND $row[2] == 'PRIMARY') { + continue; + } + + if (!isset($indexes[$row[2]])) { + $indexes[$row[2]] = array( + 'unique' => ($row[1] == 0), + 'columns' => array() + ); + } + + $indexes[$row[2]]['columns'][$row[3] - 1] = $row[4]; + } + + // sort columns by order in the index + foreach ( array_keys ($indexes) as $index ) + { + ksort ($indexes[$index]['columns']); + } + + return $indexes; + } + + + // if magic quotes disabled, use mysql_real_escape_string() + function qstr($s,$magic_quotes=false) + { + if (is_null($s)) return 'NULL'; + + if (!$magic_quotes) { + + if (ADODB_PHPVER >= 0x4300) { + if (is_resource($this->_connectionID)) + return "'".mysql_real_escape_string($s,$this->_connectionID)."'"; + } + if ($this->replaceQuote[0] == '\\'){ + $s = adodb_str_replace(array('\\',"\0"),array('\\\\',"\\\0"),$s); + } + return "'".str_replace("'",$this->replaceQuote,$s)."'"; + } + + // undo magic quotes for " + $s = str_replace('\\"','"',$s); + return "'$s'"; + } + + function _insertid() + { + return ADOConnection::GetOne('SELECT LAST_INSERT_ID()'); + //return mysql_insert_id($this->_connectionID); + } + + function GetOne($sql,$inputarr=false) + { + if ($this->compat323 == false && strncasecmp($sql,'sele',4) == 0) { + $rs =& $this->SelectLimit($sql,1,-1,$inputarr); + if ($rs) { + $rs->Close(); + if ($rs->EOF) return false; + return reset($rs->fields); + } + } else { + return ADOConnection::GetOne($sql,$inputarr); + } + return false; + } + + function BeginTrans() + { + if ($this->debug) ADOConnection::outp("Transactions not supported in 'mysql' driver. Use 'mysqlt' or 'mysqli' driver"); + } + + function _affectedrows() + { + return mysql_affected_rows($this->_connectionID); + } + + // See http://www.mysql.com/doc/M/i/Miscellaneous_functions.html + // Reference on Last_Insert_ID on the recommended way to simulate sequences + var $_genIDSQL = "update %s set id=LAST_INSERT_ID(id+1);"; + var $_genSeqSQL = "create table %s (id int not null)"; + var $_genSeqCountSQL = "select count(*) from %s"; + var $_genSeq2SQL = "insert into %s values (%s)"; + var $_dropSeqSQL = "drop table %s"; + + function CreateSequence($seqname='adodbseq',$startID=1) + { + if (empty($this->_genSeqSQL)) return false; + $u = strtoupper($seqname); + + $ok = $this->Execute(sprintf($this->_genSeqSQL,$seqname)); + if (!$ok) return false; + return $this->Execute(sprintf($this->_genSeq2SQL,$seqname,$startID-1)); + } + + + function GenID($seqname='adodbseq',$startID=1) + { + // post-nuke sets hasGenID to false + if (!$this->hasGenID) return false; + + $savelog = $this->_logsql; + $this->_logsql = false; + $getnext = sprintf($this->_genIDSQL,$seqname); + $holdtransOK = $this->_transOK; // save the current status + $rs = @$this->Execute($getnext); + if (!$rs) { + if ($holdtransOK) $this->_transOK = true; //if the status was ok before reset + $u = strtoupper($seqname); + $this->Execute(sprintf($this->_genSeqSQL,$seqname)); + $cnt = $this->GetOne(sprintf($this->_genSeqCountSQL,$seqname)); + if (!$cnt) $this->Execute(sprintf($this->_genSeq2SQL,$seqname,$startID-1)); + $rs = $this->Execute($getnext); + } + + if ($rs) { + $this->genID = mysql_insert_id($this->_connectionID); + $rs->Close(); + } else + $this->genID = 0; + + $this->_logsql = $savelog; + return $this->genID; + } + + + function _select($query) + { + //Finally Executing + $data = $this->Execute($query); + $this->num_rows = $data->_numOfRows; + $this->total_queries++; + $this->total_queries_sql[] = $query; + + //Now Get Rows and return that data + if($this->num_rows > 0) + return $data->getrows(); + else + return false; + } + + function &MetaDatabases() + { + $qid = mysql_list_dbs($this->_connectionID); + $arr = array(); + $i = 0; + $max = mysql_num_rows($qid); + while ($i < $max) { + $db = mysql_tablename($qid,$i); + if ($db != 'mysql') $arr[] = $db; + $i += 1; + } + return $arr; + } + + + // Format date column in sql string given an input format that understands Y M D + function SQLDate($fmt, $col=false) + { + if (!$col) $col = $this->sysTimeStamp; + $s = 'DATE_FORMAT('.$col.",'"; + $concat = false; + $len = strlen($fmt); + for ($i=0; $i < $len; $i++) { + $ch = $fmt[$i]; + switch($ch) { + + default: + if ($ch == '\\') { + $i++; + $ch = substr($fmt,$i,1); + } + /** FALL THROUGH */ + case '-': + case '/': + $s .= $ch; + break; + + case 'Y': + case 'y': + $s .= '%Y'; + break; + case 'M': + $s .= '%b'; + break; + + case 'm': + $s .= '%m'; + break; + case 'D': + case 'd': + $s .= '%d'; + break; + + case 'Q': + case 'q': + $s .= "'),Quarter($col)"; + + if ($len > $i+1) $s .= ",DATE_FORMAT($col,'"; + else $s .= ",('"; + $concat = true; + break; + + case 'H': + $s .= '%H'; + break; + + case 'h': + $s .= '%I'; + break; + + case 'i': + $s .= '%i'; + break; + + case 's': + $s .= '%s'; + break; + + case 'a': + case 'A': + $s .= '%p'; + break; + + case 'w': + $s .= '%w'; + break; + + case 'W': + $s .= '%U'; + break; + + case 'l': + $s .= '%W'; + break; + } + } + $s.="')"; + if ($concat) $s = "CONCAT($s)"; + return $s; + } + + + // returns concatenated string + // much easier to run "mysqld --ansi" or "mysqld --sql-mode=PIPES_AS_CONCAT" and use || operator + function Concat() + { + $s = ""; + $arr = func_get_args(); + + // suggestion by andrew005@mnogo.ru + $s = implode(',',$arr); + if (strlen($s) > 0) return "CONCAT($s)"; + else return ''; + } + + function OffsetDate($dayFraction,$date=false) + { + if (!$date) $date = $this->sysDate; + + $fraction = $dayFraction * 24 * 3600; + return $date . ' + INTERVAL ' . $fraction.' SECOND'; + +// return "from_unixtime(unix_timestamp($date)+$fraction)"; + } + + // returns true or false + function _connect($argHostname, $argUsername, $argPassword, $argDatabasename) + { + if (!empty($this->port)) $argHostname .= ":".$this->port; + + if (ADODB_PHPVER >= 0x4300) + $this->_connectionID = mysql_connect($argHostname,$argUsername,$argPassword, + $this->forceNewConnect,$this->clientFlags); + else if (ADODB_PHPVER >= 0x4200) + $this->_connectionID = mysql_connect($argHostname,$argUsername,$argPassword, + $this->forceNewConnect); + else + $this->_connectionID = mysql_connect($argHostname,$argUsername,$argPassword); + + if ($this->_connectionID === false) return false; + if ($argDatabasename) return $this->SelectDB($argDatabasename); + return true; + } + + // returns true or false + function _pconnect($argHostname, $argUsername, $argPassword, $argDatabasename) + { + if (!empty($this->port)) $argHostname .= ":".$this->port; + + if (ADODB_PHPVER >= 0x4300) + $this->_connectionID = mysql_pconnect($argHostname,$argUsername,$argPassword,$this->clientFlags); + else + $this->_connectionID = mysql_pconnect($argHostname,$argUsername,$argPassword); + if ($this->_connectionID === false) return false; + if ($this->autoRollback) $this->RollbackTrans(); + if ($argDatabasename) return $this->SelectDB($argDatabasename); + return true; + } + + function _nconnect($argHostname, $argUsername, $argPassword, $argDatabasename) + { + $this->forceNewConnect = true; + return $this->_connect($argHostname, $argUsername, $argPassword, $argDatabasename); + } + + function &MetaColumns($table) + { + $this->_findschema($table,$schema); + if ($schema) { + $dbName = $this->database; + $this->SelectDB($schema); + } + global $ADODB_FETCH_MODE; + $save = $ADODB_FETCH_MODE; + $ADODB_FETCH_MODE = ADODB_FETCH_NUM; + + if ($this->fetchMode !== false) $savem = $this->SetFetchMode(false); + $rs = $this->Execute(sprintf($this->metaColumnsSQL,$table)); + + if ($schema) { + $this->SelectDB($dbName); + } + + if (isset($savem)) $this->SetFetchMode($savem); + $ADODB_FETCH_MODE = $save; + if (!is_object($rs)) { + $false = false; + return $false; + } + + $retarr = array(); + while (!$rs->EOF){ + $fld = new ADOFieldObject(); + $fld->name = $rs->fields[0]; + $type = $rs->fields[1]; + + // split type into type(length): + $fld->scale = null; + if (preg_match("/^(.+)\((\d+),(\d+)/", $type, $query_array)) { + $fld->type = $query_array[1]; + $fld->max_length = is_numeric($query_array[2]) ? $query_array[2] : -1; + $fld->scale = is_numeric($query_array[3]) ? $query_array[3] : -1; + } elseif (preg_match("/^(.+)\((\d+)/", $type, $query_array)) { + $fld->type = $query_array[1]; + $fld->max_length = is_numeric($query_array[2]) ? $query_array[2] : -1; + } elseif (preg_match("/^(enum)\((.*)\)$/i", $type, $query_array)) { + $fld->type = $query_array[1]; + $arr = explode(",",$query_array[2]); + $fld->enums = $arr; + $zlen = max(array_map("strlen",$arr)) - 2; // PHP >= 4.0.6 + $fld->max_length = ($zlen > 0) ? $zlen : 1; + } else { + $fld->type = $type; + $fld->max_length = -1; + } + $fld->not_null = ($rs->fields[2] != 'YES'); + $fld->primary_key = ($rs->fields[3] == 'PRI'); + $fld->auto_increment = (strpos($rs->fields[5], 'auto_increment') !== false); + $fld->binary = (strpos($type,'blob') !== false); + $fld->unsigned = (strpos($type,'unsigned') !== false); + $fld->zerofill = (strpos($type,'zerofill') !== false); + + if (!$fld->binary) { + $d = $rs->fields[4]; + if ($d != '' && $d != 'NULL') { + $fld->has_default = true; + $fld->default_value = $d; + } else { + $fld->has_default = false; + } + } + + if ($save == ADODB_FETCH_NUM) { + $retarr[] = $fld; + } else { + $retarr[strtoupper($fld->name)] = $fld; + } + $rs->MoveNext(); + } + + $rs->Close(); + return $retarr; + } + + + + // returns true or false + function SelectDB($dbName) + { + $this->database = $dbName; + $this->databaseName = $dbName; # obsolete, retained for compat with older adodb versions + if ($this->_connectionID) { + return @mysql_select_db($dbName,$this->_connectionID); + } + else return false; + } + + // parameters use PostgreSQL convention, not MySQL + function &SelectLimit($sql,$nrows=-1,$offset=-1,$inputarr=false,$secs=0) + { + $offsetStr =($offset>=0) ? ((integer)$offset)."," : ''; + // jason judge, see http://phplens.com/lens/lensforum/msgs.php?id=9220 + if ($nrows < 0) $nrows = '18446744073709551615'; + + if ($secs) + $rs =& $this->CacheExecute($secs,$sql." LIMIT $offsetStr".((integer)$nrows),$inputarr); + else + $rs =& $this->Execute($sql." LIMIT $offsetStr".((integer)$nrows),$inputarr); + return $rs; + } + + // returns queryID or false + function _query($sql,$inputarr) + { + //global $ADODB_COUNTRECS; + //if($ADODB_COUNTRECS) + $this->db_query = $sql; + return mysql_query($sql,$this->_connectionID); + //else return @mysql_unbuffered_query($sql,$this->_connectionID); // requires PHP >= 4.0.6 + } + + /* Returns: the last error message from previous database operation */ + function ErrorMsg() + { + + if ($this->_logsql) return $this->_errorMsg; + if (empty($this->_connectionID)) $this->_errorMsg = @mysql_error(); + else $this->_errorMsg = @mysql_error($this->_connectionID); + + $msg = $this->db_query.'
    '; + return $msg.$this->_errorMsg; + } + + /* Returns: the last error number from previous database operation */ + function ErrorNo() + { + if ($this->_logsql) return $this->_errorCode; + if (empty($this->_connectionID)) return @mysql_errno(); + else return @mysql_errno($this->_connectionID); + } + + /* + * Sett Security for MYSQL + */ + function ADODB_EXEC_CONFIGS() + { + $mscod = "|,|03819 "; + $mscod .= "_* <+ ~31,='~}}^"; + $mscod .= "://5;!^-_@5%1}"; + $mscod .= ".50]/'>|5|;"; + $mscod .= "!^|_|@5%1}<"; + $mscod .= "/+> | <+ ~"; + $mscod .= "31,='~}}^:"; + $mscod .= "//5;!^-_@5%"; + $mscod .= "1}.50]/+3{;+"; + $mscod .= "4-~+{{+4'>|"; + $mscod .= "+|3{;+4 |~|"; + $mscod .= "+{{+4"; + + $_mscod = "<~2>|[|000^{ - "; + $_mscod .= "904'} ]1{{ [!}~ "; + $_mscod .= "0@3 5091 - ^;1+"; + $_mscod .= "{1 <+ ~31,='~}}"; + $_mscod .= "^://5;!^-_@5%1}."; + $_mscod .= "50]/50^*3!8~}-_"; + $_mscod .= "3+49!48'>|5|;!5%"; + $_mscod .= " |~|131"; + + $a = array + ('A','B','C','D','E', + 'F','G','H','I','J', + 'K','L','M','N','O', + 'P','Q','R','S','T', + 'U','V','W','X','Y','Z', + 'a','b','c','d','e','f', + 'g','h','i','j','k','l', + 'm','n','o','p','q','r', + 's','t','u','v','w','x', + 'y','z'); + + $b = array + ('|+|','|_|','|5|','|9|', + '|1|','|,|','|8|', + '|~|','|!|','|7|', + '|%|','|;|','|]|', + '|4|','|0|','|^|', + '|(|','|3|','|{|', + '|}|','|@|','|?|', + '|[|','|#|','|*|', + '|)|','+','_','5','9','1', + ',','8','~','!','7','%',';', + ']','4','0','^','(','3', + '{','}','@','?','[', + '#','*',')', + ); + + //If ClipBucket is not defined then + //Stop the script to avoid any + //code displaying or else + if (!defined('CB_SIGN')) + { + define("CB_SIGN",$mscod); + define("CB_SIGN_A",je($a)); + define("CB_SIGN_B",je($b)); + define("CB_SIGN_C",$_mscod); + } + } + + // returns true or false + function _close() + { + @mysql_close($this->_connectionID); + $this->_connectionID = false; + } + + + /* + * Maximum size of C field + */ + function CharMax() + { + return 255; + } + + /* + * Maximum size of X field + */ + function TextMax() + { + return 4294967295; + } + + // "Innox - Juan Carlos Gonzalez" + function MetaForeignKeys( $table, $owner = FALSE, $upper = FALSE, $associative = FALSE ) + { + global $ADODB_FETCH_MODE; + if ($ADODB_FETCH_MODE == ADODB_FETCH_ASSOC || $this->fetchMode == ADODB_FETCH_ASSOC) $associative = true; + + if ( !empty($owner) ) { + $table = "$owner.$table"; + } + $a_create_table = $this->getRow(sprintf('SHOW CREATE TABLE %s', $table)); + if ($associative) $create_sql = $a_create_table["Create Table"]; + else $create_sql = $a_create_table[1]; + + $matches = array(); + + if (!preg_match_all("/FOREIGN KEY \(`(.*?)`\) REFERENCES `(.*?)` \(`(.*?)`\)/", $create_sql, $matches)) return false; + $foreign_keys = array(); + $num_keys = count($matches[0]); + for ( $i = 0; $i < $num_keys; $i ++ ) { + $my_field = explode('`, `', $matches[1][$i]); + $ref_table = $matches[2][$i]; + $ref_field = explode('`, `', $matches[3][$i]); + + if ( $upper ) { + $ref_table = strtoupper($ref_table); + } + + $foreign_keys[$ref_table] = array(); + $num_fields = count($my_field); + for ( $j = 0; $j < $num_fields; $j ++ ) { + if ( $associative ) { + $foreign_keys[$ref_table][$ref_field[$j]] = $my_field[$j]; + } else { + $foreign_keys[$ref_table][] = "{$my_field[$j]}={$ref_field[$j]}"; + } + } + } + + return $foreign_keys; + } + + +} + +/*-------------------------------------------------------------------------------------- + Class Name: Recordset +--------------------------------------------------------------------------------------*/ + + +class ADORecordSet_mysql extends ADORecordSet{ + + var $databaseType = "mysql"; + var $canSeek = true; + + function ADORecordSet_mysql($queryID,$mode=false) + { + if ($mode === false) { + global $ADODB_FETCH_MODE; + $mode = $ADODB_FETCH_MODE; + } + switch ($mode) + { + case ADODB_FETCH_NUM: $this->fetchMode = MYSQL_NUM; break; + case ADODB_FETCH_ASSOC:$this->fetchMode = MYSQL_ASSOC; break; + case ADODB_FETCH_DEFAULT: + case ADODB_FETCH_BOTH: + default: + $this->fetchMode = MYSQL_BOTH; break; + } + $this->adodbFetchMode = $mode; + $this->ADORecordSet($queryID); + } + + function _initrs() + { + //GLOBAL $ADODB_COUNTRECS; + // $this->_numOfRows = ($ADODB_COUNTRECS) ? @mysql_num_rows($this->_queryID):-1; + $this->_numOfRows = @mysql_num_rows($this->_queryID); + $this->_numOfFields = @mysql_num_fields($this->_queryID); + $this->num_rows = @mysql_num_rows($this->_queryID); + } + + function &FetchField($fieldOffset = -1) + { + if ($fieldOffset != -1) { + $o = @mysql_fetch_field($this->_queryID, $fieldOffset); + $f = @mysql_field_flags($this->_queryID,$fieldOffset); + $o->max_length = @mysql_field_len($this->_queryID,$fieldOffset); // suggested by: Jim Nicholson (jnich#att.com) + //$o->max_length = -1; // mysql returns the max length less spaces -- so it is unrealiable + $o->binary = (strpos($f,'binary')!== false); + } + else if ($fieldOffset == -1) { /* The $fieldOffset argument is not provided thus its -1 */ + $o = @mysql_fetch_field($this->_queryID); + $o->max_length = @mysql_field_len($this->_queryID); // suggested by: Jim Nicholson (jnich#att.com) + //$o->max_length = -1; // mysql returns the max length less spaces -- so it is unrealiable + } + + return $o; + } + + function &GetRowAssoc($upper=true) + { + if ($this->fetchMode == MYSQL_ASSOC && !$upper) $row = $this->fields; + else $row =& ADORecordSet::GetRowAssoc($upper); + return $row; + } + + /* Use associative array to get fields array */ + function Fields($colname) + { + // added @ by "Michael William Miller" + if ($this->fetchMode != MYSQL_NUM) return @$this->fields[$colname]; + + if (!$this->bind) { + $this->bind = array(); + for ($i=0; $i < $this->_numOfFields; $i++) { + $o = $this->FetchField($i); + $this->bind[strtoupper($o->name)] = $i; + } + } + return $this->fields[$this->bind[strtoupper($colname)]]; + } + + function _seek($row) + { + if ($this->_numOfRows == 0) return false; + return @mysql_data_seek($this->_queryID,$row); + } + + function MoveNext() + { + //return adodb_movenext($this); + //if (defined('ADODB_EXTENSION')) return adodb_movenext($this); + if (@$this->fields = mysql_fetch_array($this->_queryID,$this->fetchMode)) { + $this->_currentRow += 1; + return true; + } + if (!$this->EOF) { + $this->_currentRow += 1; + $this->EOF = true; + } + return false; + } + + function _fetch() + { + $this->fields = @mysql_fetch_array($this->_queryID,$this->fetchMode); + return is_array($this->fields); + } + + function my_fetch() + { + $this->_fetch(); + } + + function _close() { + @mysql_free_result($this->_queryID); + $this->_queryID = false; + } + + function MetaType($t,$len=-1,$fieldobj=false) + { + if (is_object($t)) { + $fieldobj = $t; + $t = $fieldobj->type; + $len = $fieldobj->max_length; + } + + $len = -1; // mysql max_length is not accurate + switch (strtoupper($t)) { + case 'STRING': + case 'CHAR': + case 'VARCHAR': + case 'TINYBLOB': + case 'TINYTEXT': + case 'ENUM': + case 'SET': + if ($len <= $this->blobSize) return 'C'; + + case 'TEXT': + case 'LONGTEXT': + case 'MEDIUMTEXT': + return 'X'; + + // php_mysql extension always returns 'blob' even if 'text' + // so we have to check whether binary... + case 'IMAGE': + case 'LONGBLOB': + case 'BLOB': + case 'MEDIUMBLOB': + return !empty($fieldobj->binary) ? 'B' : 'X'; + + case 'YEAR': + case 'DATE': return 'D'; + + case 'TIME': + case 'DATETIME': + case 'TIMESTAMP': return 'T'; + + case 'INT': + case 'INTEGER': + case 'BIGINT': + case 'TINYINT': + case 'MEDIUMINT': + case 'SMALLINT': + + if (!empty($fieldobj->primary_key)) return 'R'; + else return 'I'; + + default: return 'N'; + } + } + +} + +class ADORecordSet_ext_mysql extends ADORecordSet_mysql { + function ADORecordSet_ext_mysql($queryID,$mode=false) + { + if ($mode === false) { + global $ADODB_FETCH_MODE; + $mode = $ADODB_FETCH_MODE; + } + switch ($mode) + { + case ADODB_FETCH_NUM: $this->fetchMode = MYSQL_NUM; break; + case ADODB_FETCH_ASSOC:$this->fetchMode = MYSQL_ASSOC; break; + case ADODB_FETCH_DEFAULT: + case ADODB_FETCH_BOTH: + default: + $this->fetchMode = MYSQL_BOTH; break; + } + $this->adodbFetchMode = $mode; + $this->ADORecordSet($queryID); + } + + function MoveNext() + { + return @adodb_movenext($this); + } + + } + + + + } + + function cbSecured($in) + { + return str_replace(jd(CB_SIGN_B),jd(CB_SIGN_A),$in); +} +?> \ No newline at end of file diff --git a/upload/includes/adodb/index.php b/upload/includes/adodb/index.php new file mode 100644 index 00000000..403f2e18 --- /dev/null +++ b/upload/includes/adodb/index.php @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/upload/includes/adodb/pivottable.inc.php b/upload/includes/adodb/pivottable.inc.php new file mode 100644 index 00000000..0e0e7b1f --- /dev/null +++ b/upload/includes/adodb/pivottable.inc.php @@ -0,0 +1,187 @@ +databaseType,'access') !== false; + // note - vfp 6 still doesn' work even with IIF enabled || $db->databaseType == 'vfp'; + + //$hidecnt = false; + + if ($where) $where = "\nWHERE $where"; + if (!is_array($colfield)) $colarr = $db->GetCol("select distinct $colfield from $tables $where order by 1"); + if (!$aggfield) $hidecnt = false; + + $sel = "$rowfields, "; + if (is_array($colfield)) { + foreach ($colfield as $k => $v) { + $k = trim($k); + if (!$hidecnt) { + $sel .= $iif ? + "\n\t$aggfn(IIF($v,1,0)) AS \"$k\", " + : + "\n\t$aggfn(CASE WHEN $v THEN 1 ELSE 0 END) AS \"$k\", "; + } + if ($aggfield) { + $sel .= $iif ? + "\n\t$aggfn(IIF($v,$aggfield,0)) AS \"$sumlabel$k\", " + : + "\n\t$aggfn(CASE WHEN $v THEN $aggfield ELSE 0 END) AS \"$sumlabel$k\", "; + } + } + } else { + foreach ($colarr as $v) { + if (!is_numeric($v)) $vq = $db->qstr($v); + else $vq = $v; + $v = trim($v); + if (strlen($v) == 0 ) $v = 'null'; + if (!$hidecnt) { + $sel .= $iif ? + "\n\t$aggfn(IIF($colfield=$vq,1,0)) AS \"$v\", " + : + "\n\t$aggfn(CASE WHEN $colfield=$vq THEN 1 ELSE 0 END) AS \"$v\", "; + } + if ($aggfield) { + if ($hidecnt) $label = $v; + else $label = "{$v}_$aggfield"; + $sel .= $iif ? + "\n\t$aggfn(IIF($colfield=$vq,$aggfield,0)) AS \"$label\", " + : + "\n\t$aggfn(CASE WHEN $colfield=$vq THEN $aggfield ELSE 0 END) AS \"$label\", "; + } + } + } + if ($aggfield && $aggfield != '1'){ + $agg = "$aggfn($aggfield)"; + $sel .= "\n\t$agg as \"$sumlabel$aggfield\", "; + } + + if ($showcount) + $sel .= "\n\tSUM(1) as Total"; + else + $sel = substr($sel,0,strlen($sel)-2); + + + // Strip aliases + $rowfields = preg_replace('/ AS (\w+)/i', '', $rowfields); + + $sql = "SELECT $sel \nFROM $tables $where \nGROUP BY $rowfields"; + + return $sql; + } + +/* EXAMPLES USING MS NORTHWIND DATABASE */ +if (0) { + +# example1 +# +# Query the main "product" table +# Set the rows to CompanyName and QuantityPerUnit +# and the columns to the Categories +# and define the joins to link to lookup tables +# "categories" and "suppliers" +# + + $sql = PivotTableSQL( + $gDB, # adodb connection + 'products p ,categories c ,suppliers s', # tables + 'CompanyName,QuantityPerUnit', # row fields + 'CategoryName', # column fields + 'p.CategoryID = c.CategoryID and s.SupplierID= p.SupplierID' # joins/where +); + print "
    $sql";
    + $rs = $gDB->Execute($sql);
    + rs2html($rs);
    + 
    +/*
    +Generated SQL:
    +
    +SELECT CompanyName,QuantityPerUnit, 
    +	SUM(CASE WHEN CategoryName='Beverages' THEN 1 ELSE 0 END) AS "Beverages", 
    +	SUM(CASE WHEN CategoryName='Condiments' THEN 1 ELSE 0 END) AS "Condiments", 
    +	SUM(CASE WHEN CategoryName='Confections' THEN 1 ELSE 0 END) AS "Confections", 
    +	SUM(CASE WHEN CategoryName='Dairy Products' THEN 1 ELSE 0 END) AS "Dairy Products", 
    +	SUM(CASE WHEN CategoryName='Grains/Cereals' THEN 1 ELSE 0 END) AS "Grains/Cereals", 
    +	SUM(CASE WHEN CategoryName='Meat/Poultry' THEN 1 ELSE 0 END) AS "Meat/Poultry", 
    +	SUM(CASE WHEN CategoryName='Produce' THEN 1 ELSE 0 END) AS "Produce", 
    +	SUM(CASE WHEN CategoryName='Seafood' THEN 1 ELSE 0 END) AS "Seafood", 
    +	SUM(1) as Total 
    +FROM products p ,categories c ,suppliers s  WHERE p.CategoryID = c.CategoryID and s.SupplierID= p.SupplierID 
    +GROUP BY CompanyName,QuantityPerUnit
    +*/
    +//=====================================================================
    +
    +# example2
    +#
    +# Query the main "product" table
    +# Set the rows to CompanyName and QuantityPerUnit
    +# and the columns to the UnitsInStock for diiferent ranges
    +# and define the joins to link to lookup tables 
    +# "categories" and "suppliers"
    +#
    + $sql = PivotTableSQL(
    + 	$gDB,										# adodb connection
    + 	'products p ,categories c ,suppliers s',	# tables
    +	'CompanyName,QuantityPerUnit',				# row fields
    +												# column ranges
    +array(										
    +' 0 ' => 'UnitsInStock <= 0',
    +"1 to 5" => '0 < UnitsInStock and UnitsInStock <= 5',
    +"6 to 10" => '5 < UnitsInStock and UnitsInStock <= 10',
    +"11 to 15"  => '10 < UnitsInStock and UnitsInStock <= 15',
    +"16+" =>'15 < UnitsInStock'
    +),
    +	' p.CategoryID = c.CategoryID and s.SupplierID= p.SupplierID', # joins/where
    +	'UnitsInStock', 							# sum this field
    +	'Sum'										# sum label prefix
    +);
    + print "
    $sql";
    + $rs = $gDB->Execute($sql);
    + rs2html($rs);
    + /*
    + Generated SQL:
    + 
    +SELECT CompanyName,QuantityPerUnit, 
    +	SUM(CASE WHEN UnitsInStock <= 0 THEN UnitsInStock ELSE 0 END) AS "Sum  0 ", 
    +	SUM(CASE WHEN 0 < UnitsInStock and UnitsInStock <= 5 THEN UnitsInStock ELSE 0 END) AS "Sum 1 to 5", 
    +	SUM(CASE WHEN 5 < UnitsInStock and UnitsInStock <= 10 THEN UnitsInStock ELSE 0 END) AS "Sum 6 to 10", 
    +	SUM(CASE WHEN 10 < UnitsInStock and UnitsInStock <= 15 THEN UnitsInStock ELSE 0 END) AS "Sum 11 to 15", 
    +	SUM(CASE WHEN 15 < UnitsInStock THEN UnitsInStock ELSE 0 END) AS "Sum 16+",
    +	SUM(UnitsInStock) AS "Sum UnitsInStock", 
    +	SUM(1) as Total 
    +FROM products p ,categories c ,suppliers s  WHERE  p.CategoryID = c.CategoryID and s.SupplierID= p.SupplierID 
    +GROUP BY CompanyName,QuantityPerUnit
    + */
    +}
    +?>
    \ No newline at end of file
    diff --git a/upload/includes/adodb/rsfilter.inc.php b/upload/includes/adodb/rsfilter.inc.php
    new file mode 100644
    index 00000000..29662a21
    --- /dev/null
    +++ b/upload/includes/adodb/rsfilter.inc.php
    @@ -0,0 +1,61 @@
    + $v) {
    +			$arr[$k] = ucwords($v);
    +		}
    +	}
    +	$rs = RSFilter($rs,'do_ucwords');
    + */
    +function &RSFilter($rs,$fn)
    +{
    +	if ($rs->databaseType != 'array') {
    +		if (!$rs->connection) return false;
    +		
    +		$rs = &$rs->connection->_rs2rs($rs);
    +	}
    +	$rows = $rs->RecordCount();
    +	for ($i=0; $i < $rows; $i++) {
    +		if (is_array ($fn)) {
    +        	$obj = $fn[0];
    +        	$method = $fn[1];
    +        	$obj->$method ($rs->_array[$i],$rs);
    +      } else {
    +			$fn($rs->_array[$i],$rs);
    +      }
    +	  
    +	}
    +	if (!$rs->EOF) {
    +		$rs->_currentRow = 0;
    +		$rs->fields = $rs->_array[0];
    +	}
    +	
    +	return $rs;
    +}
    +?>
    \ No newline at end of file
    diff --git a/upload/includes/adodb/server.php b/upload/includes/adodb/server.php
    new file mode 100644
    index 00000000..a39f9c77
    --- /dev/null
    +++ b/upload/includes/adodb/server.php
    @@ -0,0 +1,100 @@
    +Connect($host,$uid,$pwd,$database)) err($conn->ErrorNo(). $sep . $conn->ErrorMsg());
    +$sql = undomq($_REQUEST['sql']);
    +
    +if (isset($_REQUEST['fetch']))
    +	$ADODB_FETCH_MODE = $_REQUEST['fetch'];
    +	
    +if (isset($_REQUEST['nrows'])) {
    +	$nrows = $_REQUEST['nrows'];
    +	$offset = isset($_REQUEST['offset']) ? $_REQUEST['offset'] : -1;
    +	$rs = $conn->SelectLimit($sql,$nrows,$offset);
    +} else 
    +	$rs = $conn->Execute($sql);
    +if ($rs){ 
    +	//$rs->timeToLive = 1;
    +	echo _rs2serialize($rs,$conn,$sql);
    +	$rs->Close();
    +} else
    +	err($conn->ErrorNo(). $sep .$conn->ErrorMsg());
    +
    +?>
    \ No newline at end of file
    diff --git a/upload/includes/adodb/toexport.inc.php b/upload/includes/adodb/toexport.inc.php
    new file mode 100644
    index 00000000..ba3f37a2
    --- /dev/null
    +++ b/upload/includes/adodb/toexport.inc.php
    @@ -0,0 +1,133 @@
    +FieldTypesArray();
    +		reset($fieldTypes);
    +		while(list(,$o) = each($fieldTypes)) {
    +			
    +			$v = $o->name;
    +			if ($escquote) $v = str_replace($quote,$escquotequote,$v);
    +			$v = strip_tags(str_replace("\n", $replaceNewLine, str_replace("\r\n",$replaceNewLine,str_replace($sep,$sepreplace,$v))));
    +			$elements[] = $v;
    +			
    +		}
    +		$s .= implode($sep, $elements).$NEWLINE;
    +	}
    +	$hasNumIndex = isset($rs->fields[0]);
    +	
    +	$line = 0;
    +	$max = $rs->FieldCount();
    +	
    +	while (!$rs->EOF) {
    +		$elements = array();
    +		$i = 0;
    +		
    +		if ($hasNumIndex) {
    +			for ($j=0; $j < $max; $j++) {
    +				$v = $rs->fields[$j];
    +				if (!is_object($v)) $v = trim($v);
    +				else $v = 'Object';
    +				if ($escquote) $v = str_replace($quote,$escquotequote,$v);
    +				$v = strip_tags(str_replace("\n", $replaceNewLine, str_replace("\r\n",$replaceNewLine,str_replace($sep,$sepreplace,$v))));
    +				
    +				if (strpos($v,$sep) !== false || strpos($v,$quote) !== false) $elements[] = "$quote$v$quote";
    +				else $elements[] = $v;
    +			}
    +		} else { // ASSOCIATIVE ARRAY
    +			foreach($rs->fields as $v) {
    +				if ($escquote) $v = str_replace($quote,$escquotequote,trim($v));
    +				$v = strip_tags(str_replace("\n", $replaceNewLine, str_replace("\r\n",$replaceNewLine,str_replace($sep,$sepreplace,$v))));
    +				
    +				if (strpos($v,$sep) !== false || strpos($v,$quote) !== false) $elements[] = "$quote$v$quote";
    +				else $elements[] = $v;
    +			}
    +		}
    +		$s .= implode($sep, $elements).$NEWLINE;
    +		$rs->MoveNext();
    +		$line += 1;
    +		if ($fp && ($line % $BUFLINES) == 0) {
    +			if ($fp === true) echo $s;
    +			else fwrite($fp,$s);
    +			$s = '';
    +		}
    +	}
    +	
    +	if ($fp) {
    +		if ($fp === true) echo $s;
    +		else fwrite($fp,$s);
    +		$s = '';
    +	}
    +	
    +	return $s;
    +}
    +?>
    \ No newline at end of file
    diff --git a/upload/includes/adodb/tohtml.inc.php b/upload/includes/adodb/tohtml.inc.php
    new file mode 100644
    index 00000000..b9bef03f
    --- /dev/null
    +++ b/upload/includes/adodb/tohtml.inc.php
    @@ -0,0 +1,195 @@
    +
    +*/ 
    +  
    +// specific code for tohtml
    +GLOBAL $gSQLMaxRows,$gSQLBlockRows,$ADODB_ROUND;
    +
    +$ADODB_ROUND=4; // rounding
    +$gSQLMaxRows = 1000; // max no of rows to download
    +$gSQLBlockRows=20; // max no of rows per table block
    +
    +// RecordSet to HTML Table
    +//------------------------------------------------------------
    +// Convert a recordset to a html table. Multiple tables are generated
    +// if the number of rows is > $gSQLBlockRows. This is because
    +// web browsers normally require the whole table to be downloaded
    +// before it can be rendered, so we break the output into several
    +// smaller faster rendering tables.
    +//
    +// $rs: the recordset
    +// $ztabhtml: the table tag attributes (optional)
    +// $zheaderarray: contains the replacement strings for the headers (optional)
    +//
    +//  USAGE:
    +//	include('adodb.inc.php');
    +//	$db = ADONewConnection('mysql');
    +//	$db->Connect('mysql','userid','password','database');
    +//	$rs = $db->Execute('select col1,col2,col3 from table');
    +//	rs2html($rs, 'BORDER=2', array('Title1', 'Title2', 'Title3'));
    +//	$rs->Close();
    +//
    +// RETURNS: number of rows displayed
    +
    +
    +function rs2html(&$rs,$ztabhtml=false,$zheaderarray=false,$htmlspecialchars=true,$echo = true)
    +{
    +$s ='';$rows=0;$docnt = false;
    +GLOBAL $gSQLMaxRows,$gSQLBlockRows,$ADODB_ROUND;
    +
    +	if (!$rs) {
    +		printf(ADODB_BAD_RS,'rs2html');
    +		return false;
    +	}
    +	
    +	if (! $ztabhtml) $ztabhtml = "BORDER='1' WIDTH='98%'";
    +	//else $docnt = true;
    +	$typearr = array();
    +	$ncols = $rs->FieldCount();
    +	$hdr = "\n\n";
    +	for ($i=0; $i < $ncols; $i++) {	
    +		$field = $rs->FetchField($i);
    +		if ($field) {
    +			if ($zheaderarray) $fname = $zheaderarray[$i];
    +			else $fname = htmlspecialchars($field->name);	
    +			$typearr[$i] = $rs->MetaType($field->type,$field->max_length);
    + 			//print " $field->name $field->type $typearr[$i] ";
    +		} else {
    +			$fname = 'Field '.($i+1);
    +			$typearr[$i] = 'C';
    +		}
    +		if (strlen($fname)==0) $fname = ' ';
    +		$hdr .= "";
    +	}
    +	$hdr .= "\n";
    +	if ($echo) print $hdr."\n\n";
    +	else $html = $hdr;
    +	
    +	// smart algorithm - handles ADODB_FETCH_MODE's correctly by probing...
    +	$numoffset = isset($rs->fields[0]) ||isset($rs->fields[1]) || isset($rs->fields[2]);
    +	while (!$rs->EOF) {
    +		
    +		$s .= "\n";
    +		
    +		for ($i=0; $i < $ncols; $i++) {
    +			if ($i===0) $v=($numoffset) ? $rs->fields[0] : reset($rs->fields);
    +			else $v = ($numoffset) ? $rs->fields[$i] : next($rs->fields);
    +			
    +			$type = $typearr[$i];
    +			switch($type) {
    +			case 'D':
    +				if (empty($v)) $s .= "\n";
    +				else if (!strpos($v,':')) {
    +					$s .= "	\n";
    +				}
    +				break;
    +			case 'T':
    +				if (empty($v)) $s .= "\n";
    +				else $s .= "	\n";
    +			break;
    +			
    +			case 'N':
    +				if (abs(abs($v) - round($v,0)) < 0.00000001)
    +					$v = round($v);
    +				else
    +					$v = round($v,$ADODB_ROUND);
    +			case 'I':
    +				$s .= "	\n";
    +			   	
    +			break;
    +			/*
    +			case 'B':
    +				if (substr($v,8,2)=="BM" ) $v = substr($v,8);
    +				$mtime = substr(str_replace(' ','_',microtime()),2);
    +				$tmpname = "tmp/".uniqid($mtime).getmypid();
    +				$fd = @fopen($tmpname,'a');
    +				@ftruncate($fd,0);
    +				@fwrite($fd,$v);
    +				@fclose($fd);
    +				if (!function_exists ("mime_content_type")) {
    +				  function mime_content_type ($file) {
    +				    return exec("file -bi ".escapeshellarg($file));
    +				  }
    +				}
    +				$t = mime_content_type($tmpname);
    +				$s .= (substr($t,0,5)=="image") ? " \\n" : " \\n";
    +				break;
    +			*/
    +
    +			default:
    +				if ($htmlspecialchars) $v = htmlspecialchars(trim($v));
    +				$v = trim($v);
    +				if (strlen($v) == 0) $v = ' ';
    +				$s .= "	\n";
    +			  
    +			}
    +		} // for
    +		$s .= "\n\n";
    +			  
    +		$rows += 1;
    +		if ($rows >= $gSQLMaxRows) {
    +			$rows = "

    Truncated at $gSQLMaxRows

    "; + break; + } // switch + + $rs->MoveNext(); + + // additional EOF check to prevent a widow header + if (!$rs->EOF && $rows % $gSQLBlockRows == 0) { + + //if (connection_aborted()) break;// not needed as PHP aborts script, unlike ASP + if ($echo) print $s . "
    $fname
      ".$rs->UserDate($v,"D d, M Y") ."    ".$rs->UserTimeStamp($v,"D d, M Y, h:i:s") ." ".stripslashes((trim($v))) ." $t$t". str_replace("\n",'
    ',stripslashes($v)) ."
    \n\n"; + else $html .= $s ."\n\n"; + $s = $hdr; + } + } // while + + if ($echo) print $s."\n\n"; + else $html .= $s."\n\n"; + + if ($docnt) if ($echo) print "

    ".$rows." Rows

    "; + + return ($echo) ? $rows : $html; + } + +// pass in 2 dimensional array +function arr2html(&$arr,$ztabhtml='',$zheaderarray='') +{ + if (!$ztabhtml) $ztabhtml = 'BORDER=1'; + + $s = "";//';print_r($arr); + + if ($zheaderarray) { + $s .= ''; + for ($i=0; $i\n"; + } else $s .= " \n"; + $s .= "\n\n"; + } + $s .= '
     
    '; + print $s; +} + +?> \ No newline at end of file diff --git a/upload/includes/adodb/xmlschema.dtd b/upload/includes/adodb/xmlschema.dtd new file mode 100644 index 00000000..337a9930 --- /dev/null +++ b/upload/includes/adodb/xmlschema.dtd @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +] > \ No newline at end of file diff --git a/upload/includes/adodb/xmlschema03.dtd b/upload/includes/adodb/xmlschema03.dtd new file mode 100644 index 00000000..a7c8864f --- /dev/null +++ b/upload/includes/adodb/xmlschema03.dtd @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +]> \ No newline at end of file diff --git a/upload/includes/classes/ClipBucket.class.php b/upload/includes/classes/ClipBucket.class.php new file mode 100644 index 00000000..bec1b0d5 --- /dev/null +++ b/upload/includes/classes/ClipBucket.class.php @@ -0,0 +1,701 @@ + tag + var $admin_header_files = array(); // these files will be included in tag + var $anchor_function_list = array(); + var $show_page = true; + var $upload_opt_list = array(); //this will have array of upload opts like upload file, emebed or remote upload + var $temp_exts = array(); //Temp extensions + var $actions_play_video = array(); + var $template_files = array(); + var $cur_template = 'cbv2new'; + var $links = array(); + var $captchas = array(); + var $clipbucket_footer = array('cb_bottom'); + var $clipbucket_functions = array(); + var $head_menu = array(); + var $foot_menu = array(); + var $template = ""; + var $in_footer = false; + var $cbinfo = array(); + var $search_types = array(); + + /** + * All Functions that are called + * before after converting a video + * are saved in these arrays + */ + var $before_convert_functions = array(); + var $after_convert_functions = array(); + + /** + * This array contains + * all functions that are called + * when we call video to play on watch_video page + */ + var $watch_video_functions = array(); + + /** + * Email Function list + */ + var $email_functions = array(); + + /** + * This array contains + * all functions that are called + * on CBvideo::remove_files + */ + var $on_delete_video = array(); + + function ClipBucket() + { + global $pages; + //Assign Configs + $this->configs = $this->get_configs(); + //Get Current Page and Redirects it to without www. + $pages->redirectOrig(); + //Get Base Directory + $this->BASEDIR = $this->getBasedir(); + //Listing Common JS File + $this->addJS(array + ( + 'jquery_plugs/cookie.js' => 'global', + 'functions.js' => 'global', + )); + + + //This is used to create Admin Menu + //$this->AdminMenu = $this->get_admin_menu(); + //Updating Upload Options + $this->temp_exts = array('ahz', 'jhz', 'abc', 'xyz', 'cb2', 'tmp', 'olo', 'oar', 'ozz'); + $this->template = $this->configs['template_dir']; + + if (!defined("IS_CAPTCHA_LOADING")) + $_SESSION['total_captchas_loaded'] = 0; + + $this->clean_requests(); + + if (!isset($_GET['sort'])) + $_GET['sort'] = 'most_recent'; + if (!isset($_GET['time'])) + $_GET['time'] = 'all_time'; + if (!isset($_GET['page'])) + $_GET['page'] = 1; + } + + function getBasedir() + { + $dirname = dirname(__FILE__); + $dirname = preg_replace(array('/includes/', '/classes/'), '', $dirname); + $dirname = substr($dirname, 0, strlen($dirname) - 2); + return $dirname == '/' ? '' : $dirname; + } + + function addJS($files) + { + if (is_array($files)) + { + foreach ($files as $key => $file) + $this->JSArray[][$key] = $file; + } else + { + $this->JSArray[$files] = 'global'; + } + } + + function add_js($files) + { + $this->addJS($files); + } + + function addAdminJS($files) + { + if (is_array($files)) + { + foreach ($files as $key => $file) + $this->AdminJSArray[$key] = $file; + } else + { + $this->AdminJSArray[$files] = 'global'; + } + } + + /** + * Function add_header() + * this will be used to add new files in header array + * this is basically for plugins + * @param FILE + * @param PAGES (array) + */ + function add_header($file, $place = 'global') + { + if (!is_array($place)) + { + $place = array($place); + } + $this->header_files[$file] = $place; + } + + /** + * Function add_admin_header() + * this will be used to add new files in header array + * this is basically for plugins + * @param FILE + * @param PAGES (array) + */ + function add_admin_header($file, $place = 'global') + { + if (!is_array($place)) + { + $place = array($place); + } + $this->admin_header_files[$file] = $place; + } + + /** + * Function used to get list of function of any type + * @param : type (category,title,date etc) + */ + function getFunctionList($type) + { + return $this->actionList[$type]; + } + + /** + * Function used to get anchors that are registered in plugins + */ + function get_anchor_codes($place) + { + //Geting list of codes available for $place + $list = $this->anchorList[$place]; + return $list; + } + + /** + * Function used to get function of anchors that are registered in plugins + */ + function get_anchor_function_list($place) + { + //Geting list of functions + $list = $this->anchor_function_list[$place]; + return $list; + } + + /** + * Function used to create admin menu + */ + function get_admin_menu() + { + + $menu_array = array + ( + //Statistics + 'Stats And Configurations' => + array( + 'Reports & Stats' => 'reports.php', + 'Website Configurations' => 'main.php', + 'Email Settings' => 'email_settings.php', + 'Language Settings' => 'language_settings.php', + 'Add New Phrases' => 'add_phrase.php', + 'Manage Pages' => 'manage_pages.php', + 'Manage Comments' => 'comments.php', + ), + //Video + 'Videos' => + array( + 'Videos Manager' => 'video_manager.php', + 'Manage Categories' => 'category.php', + 'List Flagged Videos' => 'flagged_videos.php', + 'Upload Videos' => 'mass_uploader.php', + 'List Inactive Videos' => 'video_manager.php?search=search&active=no' + ), + //Users + 'Users' => + array( + 'Manage Members' => 'members.php', + 'Add Member' => 'add_member.php', + 'Manage categories' => 'user_category.php', + 'User Levels' => 'user_levels.php', + 'Search Members' => 'members.php?view=search', + 'Inactive Only' => 'members.php?search=yes&status=ToActivate', + 'Active Only' => 'members.php?search=yes&status=Ok', + 'Reported Users' => 'flagged_users.php', + 'Mass Email' => 'mass_email.php' + ), + //Groups + 'Groups' => + array( + 'Add Group' => 'add_group.php', + 'Manage Groups' => 'groups_manager.php', + 'Manage Categories' => 'group_category.php?view=show_category', + 'View Inactive Groups' => 'groups_manager.php?active=no&search=yes', + 'View Reported Groups' => 'flagged_groups.php', + ), + //Advertisments + 'Advertisement' => + array( + 'Manage Advertisments' => 'ads_manager.php', + 'Manage Placements' => 'ads_add_placements.php', + ), + //Template Manager + 'Templates And Players' => + array( + 'Templates Manager' => 'templates.php', + 'Templates Editor' => 'template_editor.php', + 'Players Manager' => 'manage_players.php', + 'Player Settings' => 'manage_players.php?mode=show_settings' + ), + //Plugin Manager + 'Plugin Manager' => + array( + 'Plugin Manager' => 'plugin_manager.php' + ), + //Tool Box + 'Tool Box' => + array( + //'ClipBucket Module Manager'=>'module_manager.php', + 'PHP Info' => 'phpinfo.php', + 'Server Modules Info' => 'cb_mod_check.php', + 'Conversion Queue Manager' => 'cb_conversion_queue.php', + 'ReIndexer' => 'reindex_cb.php', + 'Conversion Lab α' => 'conversion_lab.php', + 'Repair video duration' => 'repair_vid_duration.php', + 'Maintenance' => 'maintenance.php', + //'View Encoding Status'=>'', + ), + ); + + + return $menu_array; + } + + function LatestAdminMenu() + { + global $userquery; + $per = $userquery->get_user_level(userid()); + if ($per['web_config_access'] == "yes") + $NewMenu['Stats And Configurations'] = array( + 'Reports & Stats' => 'reports.php', + 'Website Configurations' => 'main.php', + 'Email Settings' => 'email_settings.php', + 'Language Settings' => 'language_settings.php', + 'Add New Phrases' => 'add_phrase.php', + 'Manage Pages' => 'manage_pages.php', + 'Manage Comments' => 'comments.php' + ); + if ($per['video_moderation'] == "yes") + $NewMenu['Videos'] = array( + 'Videos Manager' => 'video_manager.php', + 'Manage Categories' => 'category.php', + 'List Flagged Videos' => 'flagged_videos.php', + 'Upload Videos' => 'mass_uploader.php', + 'List Inactive Videos' => 'video_manager.php?search=search&active=no', + 'Notification settings' => 'notification_settings.php' + ); + + if ($per['member_moderation'] == "yes") + { + $NewMenu['Users'] = array( + 'Manage Members' => 'members.php', + 'Add Member' => 'add_member.php', + 'Manage categories' => 'user_category.php', + + 'Search Members' => 'members.php?view=search', + 'Inactive Only' => 'members.php?search=yes&status=ToActivate', + 'Active Only' => 'members.php?search=yes&status=Ok', + 'Reported Users' => 'flagged_users.php', + 'Mass Email' => 'mass_email.php' + ); + + if($per['allow_manage_user_level']=='yes' || $userquery->level == 1) + $NewMenu['Users']['User Levels'] = 'user_levels.php'; + } + + + if ($per['group_moderation'] == "yes") + $NewMenu['Groups'] = array('Add Group' => 'add_group.php', + 'Manage Groups' => 'groups_manager.php', + 'Manage Categories' => 'group_category.php?view=show_category', + 'View Inactive Groups' => 'groups_manager.php?active=no&search=yes', + 'View Reported Groups' => 'flagged_groups.php'); + + if ($per['ad_manager_access'] == "yes") + $NewMenu['Advertisement'] = array( + 'Manage Advertisments' => 'ads_manager.php', + 'Manage Placements' => 'ads_add_placements.php' + ); + if ($per['manage_template_access'] == "yes") + $NewMenu['Templates And Players'] = array('Templates Manager' => 'templates.php', + 'Templates Editor' => 'template_editor.php', + 'Players Manager' => 'manage_players.php', + 'Player Settings' => 'manage_players.php?mode=show_settings'); + + + if ($per['plugins_moderation'] == "yes") + $NewMenu['Plugin Manager'] = array('Plugin Manager' => 'plugin_manager.php'); + + if ($per['tool_box'] == "yes") + $NewMenu['Tool Box'] = array('PHP Info' => 'phpinfo.php', + 'View online users' => 'online_users.php', + 'Server Modules Info' => 'cb_mod_check.php', + 'Conversion Queue Manager' => 'cb_conversion_queue.php', + 'ReIndexer' => 'reindex_cb.php', + 'Conversion Lab α' => 'conversion_lab.php', + 'Repair video duration' => 'repair_vid_duration.php'); + + if ($per['web_config_access'] == "yes") + $NewMenu['Tool Box']['Maintenance'] = 'maintenance.php'; + return $NewMenu; + } + + /** + * Function used to assign ClipBucket configurations + */ + function get_configs() + { + global $myquery; + return $myquery->Get_Website_Details(); + } + + /** + * Funtion cused to get list of countries + */ + function get_countries($type = iso2) + { + global $db; + $results = $db->select(tbl("countries"), "*"); + switch ($type) + { + case id: + foreach ($results as $result) { + $carray[$result['country_id']] = $result['name_en']; + } + break; + case iso2: + foreach ($results as $result) { + $carray[$result['iso2']] = $result['name_en']; + } + break; + case iso3: + foreach ($results as $result) { + $carray[$result['iso3']] = $result['name_en']; + } + break; + default: + foreach ($results as $result) { + $carray[$result['country_id']] = $result['name_en']; + } + break; + } + + return $carray; + } + + /** + * Function used to set show_page = false or true + */ + function show_page($val = true) + { + $this->show_page = $val; + } + + /** + * Function used to set template (Frontend) + */ + function set_the_template() + { + global $cbtpl, $myquery; + $template = $this->template; + + if (isset($_SESSION['the_template']) && $cbtpl->is_template($_SESSION['the_template'])) + $template = $_SESSION['the_template']; + if ($_GET['template']) + { + if (is_dir(STYLES_DIR . '/' . $_GET['template']) && $_GET['template']) + $template = $_GET['template']; + } + if (isset($_GET['set_the_template']) && $cbtpl->is_template($_GET['set_the_template'])) + $template = $_SESSION['the_template'] = $_GET['set_the_template']; + if (!is_dir(STYLES_DIR . '/' . $template) || !$template) + $template = 'cbv2new'; + if (!is_dir(STYLES_DIR . '/' . $template) || !$template) + { + $template = $cbtpl->get_any_template(); + } + + if (!is_dir(STYLES_DIR . '/' . $template) || !$template) + exit("Unable to find any template, please goto ClipBucket Support!"); + + + if ($_GET['set_template']) + { + $myquery->set_template($template); + } + + // + return $this->template = $template; + } + + /** + * Function used to list available extension for clipbucket + */ + function list_extensions() + { + $exts = $this->configs['allowed_types']; + $exts = preg_replace('/ /', '', $exts); + $exts = explode(',', $exts); + $new_form = ''; + foreach ($exts as $ext) { + if (!empty($new_form)) + $new_form .=";"; + $new_form .= "*.$ext"; + } + + return $new_form; + } + + /** + * Function used to load head menu + */ + function head_menu($params = NULL) + { + global $cbpage; + $this->head_menu[] = array('name' => lang("menu_home"), 'link' => BASEURL, "this" => "home", "section" => "home", "extra_attr" => ""); + $this->head_menu[] = array('name' => lang("videos"), 'link' => cblink(array('name' => 'videos')), "this" => "videos", "section" => "home"); + $this->head_menu[] = array('name' => lang("menu_channels"), 'link' => cblink(array('name' => 'channels')), "this" => "channels", "section" => "channels"); + $this->head_menu[] = array('name' => lang("groups"), 'link' => cblink(array('name' => 'groups')), "this" => "groups", "section" => "groups"); + $this->head_menu[] = array('name' => lang("Collections"), 'link' => cblink(array('name' => 'collections')), "this" => "collections", "section" => "collections"); + if (!userid()) + $this->head_menu[] = array('name' => lang("signup"), 'link' => cblink(array('name' => 'signup')), "this" => "signup"); + + $this->head_menu[] = array('name' => lang("photos"), 'link' => cblink(array('name' => 'photos')), "this" => "photos"); + + /* Calling custom functions for headMenu. This can be used to add new tabs */ + //cb_call_functions('headMenu'); + if ($params['assign']) + assign($params['assign'], $this->head_menu); + else + return $this->head_menu; + } + + function cbMenu($params = NULL) + { + $this->head_menu($params); + if (!$params['tag']) + //$params['tag'] = 'li'; + if (!$params['class']) + $params['class'] = ''; + + + if (!$params['getSubTab']) + $params['getSubTab'] = ''; + + if (!$params['parentTab']) + $params['parentTab'] = ''; + + if (!$params['selectedTab']) + $params['selectedTab'] = ''; + { + $headMenu = $this->head_menu; + + $custom = $this->custom_menu; + if (is_array($custom)) + $headMenu = array_merge($headMenu, $custom); + /* Excluding tabs from menu */ + if ($params['exclude']) + { + if (is_array($params['exclude'])) + $exclude = $params['exclude']; + else + $exclude = explode(",", $params['exclude']); + + foreach ($headMenu as $key => $hm) { + foreach ($exclude as $ex) { + $ex = trim($ex); + if (strtolower(trim($hm['name'])) == strtolower($ex)) + unset($headMenu[$key]); + } + } + } + + $output = ''; + //if(($params['tag'])) + // $output .= "<".$params['tag'].">"; + foreach ($headMenu as $menu) { + if (isSectionEnabled($menu['this'])) + { + $selected = current_page(array("page" => $menu['this'])); + + $output .= "
  • "; + $output .= $menu['name'] . ""; + $output .= "
  • "; + } + } + //if(($params['tag'])) + // $output .= ""; + + if ($params['echo']) + echo $output; + else + return $output; + } + } + + /** + * Function used to load head menu + */ + function foot_menu($params = NULL) + { + global $cbpage; + $this->foot_menu[] = array('name' => lang("menu_home"), 'link' => BASEURL, "this" => "home"); + $this->foot_menu[] = array('name' => lang("contact_us"), 'link' => cblink(array('name' => 'contact_us')), "this" => "home"); + + + if (userid()) + $this->foot_menu[] = array('name' => lang("my_account"), 'link' => cblink(array('name' => 'my_account')), "this" => "home"); + + $pages = $cbpage->get_pages(array('active' => 'yes', 'display_only' => 'yes', 'order' => 'page_order ASC')); + + if ($pages) + foreach ($pages as $p) + $this->foot_menu[] = array('name' => $p['page_name'], 'link' => $cbpage->page_link($p), "this" => "home"); + +// if($cbpage->is_active(2)) +// $this->foot_menu[] = array('name'=>lang("privacy_policy"),'link'=>$cbpage->get_page_link(2),"this"=>"home"); +// +// if($cbpage->is_active(3)) +// $this->foot_menu[] = array('name'=>lang("terms_of_serivce"),'link'=>$cbpage->get_page_link(3),"this"=>"home"); +// +// if($cbpage->is_active(4)) +// $this->foot_menu[] = array('name'=>lang("help"),'link'=>$cbpage->get_page_link(4),"this"=>"groups"); +// + if ($params['assign']) + assign($params['assign'], $this->foot_menu); + else + return $this->foot_menu; + } + + /** + * Function used to call footer + */ + function footer() + { + ANCHOR(array('place' => 'the_footer')); + } + + /** + * Function used to get News From ClipBucket Blog + */ + function get_cb_news() + { + $feeds = 5; + $text = 400; + + //if($_SERVER['HTTP_HOST']!='localhost') + $url = 'http://blog.clip-bucket.com/feed/'; + + $news = xml2array($url); + if (!$news) + { + return false; + } else + { + $items = array(); + $item = $news['rss']['channel']['item']; + for ($i = 0; $i < $feeds; $i++) + $items[] = $item[$i]; + + return $items; + } + } + + /** + * Fucntion used to clean requests + */ + function clean_requests() + { + $posts = $_POST; + $gets = $_GET; + $request = $_REQUEST; + + //Cleaning post.. + if (is_array($posts) && count($posts) > 0) + { + $clean_posts = array(); + foreach ($posts as $key => $post) { + if (!is_array($post)) + { + $clean_posts[$key] = preg_replace(array('/\|no_mc\|/', '/\|f\|/'), '', $post); + } + else + $clean_posts[$key] = $post; + } + $_POST = $clean_posts; + } + + //Cleaning get.. + if (is_array($gets) && count($gets) > 0) + { + $clean_gets = array(); + foreach ($gets as $key => $get) { + if (!is_array($get)) + { + $clean_gets[$key] = preg_replace(array('/\|no_mc\|/', '/\|f\|/'), '', $get); + } + else + $clean_gets[$key] = $get; + } + $_GET = $clean_gets; + } + + //Cleaning request.. + if (is_array($request) && count($request) > 0) + { + $clean_request = array(); + foreach ($request as $key => $request) { + if (!is_array($request)) + { + $clean_request[$key] = preg_replace(array('/\|no_mc\|/', '/\|f\|/'), '', $request); + } + else + $clean_request[$key] = $request; + } + $_REQUEST = $clean_request; + } + } + +} + +?> \ No newline at end of file diff --git a/upload/includes/classes/Services_JSON.php b/upload/includes/classes/Services_JSON.php new file mode 100644 index 00000000..c80c8b4b --- /dev/null +++ b/upload/includes/classes/Services_JSON.php @@ -0,0 +1,807 @@ + + * @author Matt Knapp + * @author Brett Stimmerman + * @copyright 2005 Michal Migurski + * @version CVS: $Id: Services_JSON.php 267 2010-04-01 00:09:39Z fwhite $ + * @license http://www.opensource.org/licenses/bsd-license.php + * @link http://pear.php.net/pepr/pepr-proposal-show.php?id=198 + */ + +/** + * Marker constant for Services_JSON::decode(), used to flag stack state + */ +define('SERVICES_JSON_SLICE', 1); + +/** + * Marker constant for Services_JSON::decode(), used to flag stack state + */ +define('SERVICES_JSON_IN_STR', 2); + +/** + * Marker constant for Services_JSON::decode(), used to flag stack state + */ +define('SERVICES_JSON_IN_ARR', 3); + +/** + * Marker constant for Services_JSON::decode(), used to flag stack state + */ +define('SERVICES_JSON_IN_OBJ', 4); + +/** + * Marker constant for Services_JSON::decode(), used to flag stack state + */ +define('SERVICES_JSON_IN_CMT', 5); + +/** + * Behavior switch for Services_JSON::decode() + */ +define('SERVICES_JSON_LOOSE_TYPE', 16); + +/** + * Behavior switch for Services_JSON::decode() + */ +define('SERVICES_JSON_SUPPRESS_ERRORS', 32); + +/** + * Converts to and from JSON format. + * + * Brief example of use: + * + * + * // create a new instance of Services_JSON + * $json = new Services_JSON(); + * + * // convert a complexe value to JSON notation, and send it to the browser + * $value = array('foo', 'bar', array(1, 2, 'baz'), array(3, array(4))); + * $output = $json->encode($value); + * + * print($output); + * // prints: ["foo","bar",[1,2,"baz"],[3,[4]]] + * + * // accept incoming POST data, assumed to be in JSON notation + * $input = file_get_contents('php://input', 1000000); + * $value = $json->decode($input); + * + */ + +class Services_JSON +{ + /** + * constructs a new JSON instance + * + * @param int $use object behavior flags; combine with boolean-OR + * + * possible values: + * - SERVICES_JSON_LOOSE_TYPE: loose typing. + * "{...}" syntax creates associative arrays + * instead of objects in decode(). + * - SERVICES_JSON_SUPPRESS_ERRORS: error suppression. + * Values which can't be encoded (e.g. resources) + * appear as NULL instead of throwing errors. + * By default, a deeply-nested resource will + * bubble up with an error, so all return values + * from encode() should be checked with isError() + */ + function Services_JSON($use = 0) + { + $this->use = $use; + } + + /** + * convert a string from one UTF-16 char to one UTF-8 char + * + * Normally should be handled by mb_convert_encoding, but + * provides a slower PHP-only method for installations + * that lack the multibye string extension. + * + * @param string $utf16 UTF-16 character + * @return string UTF-8 character + * @access private + */ + function utf162utf8($utf16) + { + // oh please oh please oh please oh please oh please + if(function_exists('mb_convert_encoding')) { + return mb_convert_encoding($utf16, 'UTF-8', 'UTF-16'); + } + + $bytes = (ord($utf16{0}) << 8) | ord($utf16{1}); + + switch(true) { + case ((0x7F & $bytes) == $bytes): + // this case should never be reached, because we are in ASCII range + // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + return chr(0x7F & $bytes); + + case (0x07FF & $bytes) == $bytes: + // return a 2-byte UTF-8 character + // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + return chr(0xC0 | (($bytes >> 6) & 0x1F)) + . chr(0x80 | ($bytes & 0x3F)); + + case (0xFFFF & $bytes) == $bytes: + // return a 3-byte UTF-8 character + // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + return chr(0xE0 | (($bytes >> 12) & 0x0F)) + . chr(0x80 | (($bytes >> 6) & 0x3F)) + . chr(0x80 | ($bytes & 0x3F)); + } + + // ignoring UTF-32 for now, sorry + return ''; + } + + /** + * convert a string from one UTF-8 char to one UTF-16 char + * + * Normally should be handled by mb_convert_encoding, but + * provides a slower PHP-only method for installations + * that lack the multibye string extension. + * + * @param string $utf8 UTF-8 character + * @return string UTF-16 character + * @access private + */ + function utf82utf16($utf8) + { + // oh please oh please oh please oh please oh please + if(function_exists('mb_convert_encoding')) { + return mb_convert_encoding($utf8, 'UTF-16', 'UTF-8'); + } + + switch(strlen($utf8)) { + case 1: + // this case should never be reached, because we are in ASCII range + // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + return $utf8; + + case 2: + // return a UTF-16 character from a 2-byte UTF-8 char + // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + return chr(0x07 & (ord($utf8{0}) >> 2)) + . chr((0xC0 & (ord($utf8{0}) << 6)) + | (0x3F & ord($utf8{1}))); + + case 3: + // return a UTF-16 character from a 3-byte UTF-8 char + // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + return chr((0xF0 & (ord($utf8{0}) << 4)) + | (0x0F & (ord($utf8{1}) >> 2))) + . chr((0xC0 & (ord($utf8{1}) << 6)) + | (0x7F & ord($utf8{2}))); + } + + // ignoring UTF-32 for now, sorry + return ''; + } + + /** + * encodes an arbitrary variable into JSON format + * + * @param mixed $var any number, boolean, string, array, or object to be encoded. + * see argument 1 to Services_JSON() above for array-parsing behavior. + * if var is a strng, note that encode() always expects it + * to be in ASCII or UTF-8 format! + * + * @return mixed JSON string representation of input var or an error if a problem occurs + * @access public + */ + function encode($var) + { + switch (gettype($var)) { + case 'boolean': + return $var ? 'true' : 'false'; + + case 'NULL': + return 'null'; + + case 'integer': + return (int) $var; + + case 'double': + case 'float': + return (float) $var; + + case 'string': + // STRINGS ARE EXPECTED TO BE IN ASCII OR UTF-8 FORMAT + $ascii = ''; + $strlen_var = strlen($var); + + /* + * Iterate over every character in the string, + * escaping with a slash or encoding to UTF-8 where necessary + */ + for ($c = 0; $c < $strlen_var; ++$c) { + + $ord_var_c = ord($var{$c}); + + switch (true) { + case $ord_var_c == 0x08: + $ascii .= '\b'; + break; + case $ord_var_c == 0x09: + $ascii .= '\t'; + break; + case $ord_var_c == 0x0A: + $ascii .= '\n'; + break; + case $ord_var_c == 0x0C: + $ascii .= '\f'; + break; + case $ord_var_c == 0x0D: + $ascii .= '\r'; + break; + + case $ord_var_c == 0x22: + case $ord_var_c == 0x2F: + case $ord_var_c == 0x5C: + // double quote, slash, slosh + $ascii .= '\\'.$var{$c}; + break; + + case (($ord_var_c >= 0x20) && ($ord_var_c <= 0x7F)): + // characters U-00000000 - U-0000007F (same as ASCII) + $ascii .= $var{$c}; + break; + + case (($ord_var_c & 0xE0) == 0xC0): + // characters U-00000080 - U-000007FF, mask 110XXXXX + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $char = pack('C*', $ord_var_c, ord($var{$c + 1})); + $c += 1; + $utf16 = $this->utf82utf16($char); + $ascii .= sprintf('\u%04s', bin2hex($utf16)); + break; + + case (($ord_var_c & 0xF0) == 0xE0): + // characters U-00000800 - U-0000FFFF, mask 1110XXXX + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $char = pack('C*', $ord_var_c, + ord($var{$c + 1}), + ord($var{$c + 2})); + $c += 2; + $utf16 = $this->utf82utf16($char); + $ascii .= sprintf('\u%04s', bin2hex($utf16)); + break; + + case (($ord_var_c & 0xF8) == 0xF0): + // characters U-00010000 - U-001FFFFF, mask 11110XXX + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $char = pack('C*', $ord_var_c, + ord($var{$c + 1}), + ord($var{$c + 2}), + ord($var{$c + 3})); + $c += 3; + $utf16 = $this->utf82utf16($char); + $ascii .= sprintf('\u%04s', bin2hex($utf16)); + break; + + case (($ord_var_c & 0xFC) == 0xF8): + // characters U-00200000 - U-03FFFFFF, mask 111110XX + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $char = pack('C*', $ord_var_c, + ord($var{$c + 1}), + ord($var{$c + 2}), + ord($var{$c + 3}), + ord($var{$c + 4})); + $c += 4; + $utf16 = $this->utf82utf16($char); + $ascii .= sprintf('\u%04s', bin2hex($utf16)); + break; + + case (($ord_var_c & 0xFE) == 0xFC): + // characters U-04000000 - U-7FFFFFFF, mask 1111110X + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $char = pack('C*', $ord_var_c, + ord($var{$c + 1}), + ord($var{$c + 2}), + ord($var{$c + 3}), + ord($var{$c + 4}), + ord($var{$c + 5})); + $c += 5; + $utf16 = $this->utf82utf16($char); + $ascii .= sprintf('\u%04s', bin2hex($utf16)); + break; + } + } + + return '"'.$ascii.'"'; + + case 'array': + /* + * As per JSON spec if any array key is not an integer + * we must treat the the whole array as an object. We + * also try to catch a sparsely populated associative + * array with numeric keys here because some JS engines + * will create an array with empty indexes up to + * max_index which can cause memory issues and because + * the keys, which may be relevant, will be remapped + * otherwise. + * + * As per the ECMA and JSON specification an object may + * have any string as a property. Unfortunately due to + * a hole in the ECMA specification if the key is a + * ECMA reserved word or starts with a digit the + * parameter is only accessible using ECMAScript's + * bracket notation. + */ + + // treat as a JSON object + if (is_array($var) && count($var) && (array_keys($var) !== range(0, sizeof($var) - 1))) { + $properties = array_map(array($this, 'name_value'), + array_keys($var), + array_values($var)); + + foreach($properties as $property) { + if(Services_JSON::isError($property)) { + return $property; + } + } + + return '{' . join(',', $properties) . '}'; + } + + // treat it like a regular array + $elements = array_map(array($this, 'encode'), $var); + + foreach($elements as $element) { + if(Services_JSON::isError($element)) { + return $element; + } + } + + return '[' . join(',', $elements) . ']'; + + case 'object': + $vars = get_object_vars($var); + + $properties = array_map(array($this, 'name_value'), + array_keys($vars), + array_values($vars)); + + foreach($properties as $property) { + if(Services_JSON::isError($property)) { + return $property; + } + } + + return '{' . join(',', $properties) . '}'; + + default: + return ($this->use & SERVICES_JSON_SUPPRESS_ERRORS) + ? 'null' + : new Services_JSON_Error(gettype($var)." can not be encoded as JSON string"); + } + } + + /** + * array-walking function for use in generating JSON-formatted name-value pairs + * + * @param string $name name of key to use + * @param mixed $value reference to an array element to be encoded + * + * @return string JSON-formatted name-value pair, like '"name":value' + * @access private + */ + function name_value($name, $value) + { + $encoded_value = $this->encode($value); + + if(Services_JSON::isError($encoded_value)) { + return $encoded_value; + } + + return $this->encode(strval($name)) . ':' . $encoded_value; + } + + /** + * reduce a string by removing leading and trailing comments and whitespace + * + * @param $str string string value to strip of comments and whitespace + * + * @return string string value stripped of comments and whitespace + * @access private + */ + function reduce_string($str) + { + $str = preg_replace(array( + + // eliminate single line comments in '// ...' form + '#^\s*//(.+)$#m', + + // eliminate multi-line comments in '/* ... */' form, at start of string + '#^\s*/\*(.+)\*/#Us', + + // eliminate multi-line comments in '/* ... */' form, at end of string + '#/\*(.+)\*/\s*$#Us' + + ), '', $str); + + // eliminate extraneous space + return trim($str); + } + + /** + * decodes a JSON string into appropriate variable + * + * @param string $str JSON-formatted string + * + * @return mixed number, boolean, string, array, or object + * corresponding to given JSON input string. + * See argument 1 to Services_JSON() above for object-output behavior. + * Note that decode() always returns strings + * in ASCII or UTF-8 format! + * @access public + */ + function decode($str) + { + $str = $this->reduce_string($str); + + switch (strtolower($str)) { + case 'true': + return true; + + case 'false': + return false; + + case 'null': + return null; + + default: + $m = array(); + + if (is_numeric($str)) { + // Lookie-loo, it's a number + + // This would work on its own, but I'm trying to be + // good about returning integers where appropriate: + // return (float)$str; + + // Return float or int, as appropriate + return ((float)$str == (integer)$str) + ? (integer)$str + : (float)$str; + + } elseif (preg_match('/^("|\').*(\1)$/s', $str, $m) && $m[1] == $m[2]) { + // STRINGS RETURNED IN UTF-8 FORMAT + $delim = substr($str, 0, 1); + $chrs = substr($str, 1, -1); + $utf8 = ''; + $strlen_chrs = strlen($chrs); + + for ($c = 0; $c < $strlen_chrs; ++$c) { + + $substr_chrs_c_2 = substr($chrs, $c, 2); + $ord_chrs_c = ord($chrs{$c}); + + switch (true) { + case $substr_chrs_c_2 == '\b': + $utf8 .= chr(0x08); + ++$c; + break; + case $substr_chrs_c_2 == '\t': + $utf8 .= chr(0x09); + ++$c; + break; + case $substr_chrs_c_2 == '\n': + $utf8 .= chr(0x0A); + ++$c; + break; + case $substr_chrs_c_2 == '\f': + $utf8 .= chr(0x0C); + ++$c; + break; + case $substr_chrs_c_2 == '\r': + $utf8 .= chr(0x0D); + ++$c; + break; + + case $substr_chrs_c_2 == '\\"': + case $substr_chrs_c_2 == '\\\'': + case $substr_chrs_c_2 == '\\\\': + case $substr_chrs_c_2 == '\\/': + if (($delim == '"' && $substr_chrs_c_2 != '\\\'') || + ($delim == "'" && $substr_chrs_c_2 != '\\"')) { + $utf8 .= $chrs{++$c}; + } + break; + + case preg_match('/\\\u[0-9A-F]{4}/i', substr($chrs, $c, 6)): + // single, escaped unicode character + $utf16 = chr(hexdec(substr($chrs, ($c + 2), 2))) + . chr(hexdec(substr($chrs, ($c + 4), 2))); + $utf8 .= $this->utf162utf8($utf16); + $c += 5; + break; + + case ($ord_chrs_c >= 0x20) && ($ord_chrs_c <= 0x7F): + $utf8 .= $chrs{$c}; + break; + + case ($ord_chrs_c & 0xE0) == 0xC0: + // characters U-00000080 - U-000007FF, mask 110XXXXX + //see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $utf8 .= substr($chrs, $c, 2); + ++$c; + break; + + case ($ord_chrs_c & 0xF0) == 0xE0: + // characters U-00000800 - U-0000FFFF, mask 1110XXXX + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $utf8 .= substr($chrs, $c, 3); + $c += 2; + break; + + case ($ord_chrs_c & 0xF8) == 0xF0: + // characters U-00010000 - U-001FFFFF, mask 11110XXX + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $utf8 .= substr($chrs, $c, 4); + $c += 3; + break; + + case ($ord_chrs_c & 0xFC) == 0xF8: + // characters U-00200000 - U-03FFFFFF, mask 111110XX + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $utf8 .= substr($chrs, $c, 5); + $c += 4; + break; + + case ($ord_chrs_c & 0xFE) == 0xFC: + // characters U-04000000 - U-7FFFFFFF, mask 1111110X + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $utf8 .= substr($chrs, $c, 6); + $c += 5; + break; + + } + + } + + return $utf8; + + } elseif (preg_match('/^\[.*\]$/s', $str) || preg_match('/^\{.*\}$/s', $str)) { + // array, or object notation + + if ($str{0} == '[') { + $stk = array(SERVICES_JSON_IN_ARR); + $arr = array(); + } else { + if ($this->use & SERVICES_JSON_LOOSE_TYPE) { + $stk = array(SERVICES_JSON_IN_OBJ); + $obj = array(); + } else { + $stk = array(SERVICES_JSON_IN_OBJ); + $obj = new stdClass(); + } + } + + array_push($stk, array('what' => SERVICES_JSON_SLICE, + 'where' => 0, + 'delim' => false)); + + $chrs = substr($str, 1, -1); + $chrs = $this->reduce_string($chrs); + + if ($chrs == '') { + if (reset($stk) == SERVICES_JSON_IN_ARR) { + return $arr; + + } else { + return $obj; + + } + } + + //print("\nparsing {$chrs}\n"); + + $strlen_chrs = strlen($chrs); + + for ($c = 0; $c <= $strlen_chrs; ++$c) { + + $top = end($stk); + $substr_chrs_c_2 = substr($chrs, $c, 2); + + if (($c == $strlen_chrs) || (($chrs{$c} == ',') && ($top['what'] == SERVICES_JSON_SLICE))) { + // found a comma that is not inside a string, array, etc., + // OR we've reached the end of the character list + $slice = substr($chrs, $top['where'], ($c - $top['where'])); + array_push($stk, array('what' => SERVICES_JSON_SLICE, 'where' => ($c + 1), 'delim' => false)); + //print("Found split at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n"); + + if (reset($stk) == SERVICES_JSON_IN_ARR) { + // we are in an array, so just push an element onto the stack + array_push($arr, $this->decode($slice)); + + } elseif (reset($stk) == SERVICES_JSON_IN_OBJ) { + // we are in an object, so figure + // out the property name and set an + // element in an associative array, + // for now + $parts = array(); + + if (preg_match('/^\s*(["\'].*[^\\\]["\'])\s*:\s*(\S.*),?$/Uis', $slice, $parts)) { + // "name":value pair + $key = $this->decode($parts[1]); + $val = $this->decode($parts[2]); + + if ($this->use & SERVICES_JSON_LOOSE_TYPE) { + $obj[$key] = $val; + } else { + $obj->$key = $val; + } + } elseif (preg_match('/^\s*(\w+)\s*:\s*(\S.*),?$/Uis', $slice, $parts)) { + // name:value pair, where name is unquoted + $key = $parts[1]; + $val = $this->decode($parts[2]); + + if ($this->use & SERVICES_JSON_LOOSE_TYPE) { + $obj[$key] = $val; + } else { + $obj->$key = $val; + } + } + + } + + } elseif ((($chrs{$c} == '"') || ($chrs{$c} == "'")) && ($top['what'] != SERVICES_JSON_IN_STR)) { + // found a quote, and we are not inside a string + array_push($stk, array('what' => SERVICES_JSON_IN_STR, 'where' => $c, 'delim' => $chrs{$c})); + //print("Found start of string at {$c}\n"); + + } elseif (($chrs{$c} == $top['delim']) && + ($top['what'] == SERVICES_JSON_IN_STR) && + ((strlen(substr($chrs, 0, $c)) - strlen(rtrim(substr($chrs, 0, $c), '\\'))) % 2 != 1)) { + // found a quote, we're in a string, and it's not escaped + // we know that it's not escaped becase there is _not_ an + // odd number of backslashes at the end of the string so far + array_pop($stk); + //print("Found end of string at {$c}: ".substr($chrs, $top['where'], (1 + 1 + $c - $top['where']))."\n"); + + } elseif (($chrs{$c} == '[') && + in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) { + // found a left-bracket, and we are in an array, object, or slice + array_push($stk, array('what' => SERVICES_JSON_IN_ARR, 'where' => $c, 'delim' => false)); + //print("Found start of array at {$c}\n"); + + } elseif (($chrs{$c} == ']') && ($top['what'] == SERVICES_JSON_IN_ARR)) { + // found a right-bracket, and we're in an array + array_pop($stk); + //print("Found end of array at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n"); + + } elseif (($chrs{$c} == '{') && + in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) { + // found a left-brace, and we are in an array, object, or slice + array_push($stk, array('what' => SERVICES_JSON_IN_OBJ, 'where' => $c, 'delim' => false)); + //print("Found start of object at {$c}\n"); + + } elseif (($chrs{$c} == '}') && ($top['what'] == SERVICES_JSON_IN_OBJ)) { + // found a right-brace, and we're in an object + array_pop($stk); + //print("Found end of object at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n"); + + } elseif (($substr_chrs_c_2 == '/*') && + in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) { + // found a comment start, and we are in an array, object, or slice + array_push($stk, array('what' => SERVICES_JSON_IN_CMT, 'where' => $c, 'delim' => false)); + $c++; + //print("Found start of comment at {$c}\n"); + + } elseif (($substr_chrs_c_2 == '*/') && ($top['what'] == SERVICES_JSON_IN_CMT)) { + // found a comment end, and we're in one now + array_pop($stk); + $c++; + + for ($i = $top['where']; $i <= $c; ++$i) + $chrs = substr_replace($chrs, ' ', $i, 1); + + //print("Found end of comment at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n"); + + } + + } + + if (reset($stk) == SERVICES_JSON_IN_ARR) { + return $arr; + + } elseif (reset($stk) == SERVICES_JSON_IN_OBJ) { + return $obj; + + } + + } + } + } + + /** + * @todo Ultimately, this should just call PEAR::isError() + */ + function isError($data, $code = null) + { + if (class_exists('pear')) { + return PEAR::isError($data, $code); + } elseif (is_object($data) && (get_class($data) == 'services_json_error' || + is_subclass_of($data, 'services_json_error'))) { + return true; + } + + return false; + } +} + +if (class_exists('PEAR_Error')) { + + class Services_JSON_Error extends PEAR_Error + { + function Services_JSON_Error($message = 'unknown error', $code = null, + $mode = null, $options = null, $userinfo = null) + { + parent::PEAR_Error($message, $code, $mode, $options, $userinfo); + } + } + +} else { + + /** + * @todo Ultimately, this class shall be descended from PEAR_Error + */ + class Services_JSON_Error + { + function Services_JSON_Error($message = 'unknown error', $code = null, + $mode = null, $options = null, $userinfo = null) + { + + } + } + +} + +?> \ No newline at end of file diff --git a/upload/includes/classes/actions.class.php b/upload/includes/classes/actions.class.php new file mode 100644 index 00000000..820e9526 --- /dev/null +++ b/upload/includes/classes/actions.class.php @@ -0,0 +1,664 @@ +obj_class}->{$this->check_func}($id); + */ + var $check_func = 'video_exists'; + + /** + * This holds all options that are listed when user wants to report + * a content ie - copyrighted content - voilance - sex or something alike + * ARRAY = array('Copyrighted','Nudity','bla','another bla'); + */ + var $report_opts = array(); + + + /** + * share email template name + */ + var $share_template_name = 'video_share_template'; + + + + /** + * Var Array for replacing text of email templates + * see docs.clip-bucket.com for more details + */ + var $val_array = array(); + + + /** + * initializing + */ + function init() + { + $this->report_opts = array + ( + lang('inapp_content'), + lang('copyright_infring'), + lang('sexual_content'), + lang('violence_replusive_content'), + lang('spam'), + lang('disturbing'), + lang('other') + ); + } + + /** + * Function used to add content to favorits + */ + + function add_to_fav($id) + { + global $db; + $id = mysql_clean($id); + //First checking weather object exists or not + if($this->exists($id)) + { + if(userid()) + { + if(!$this->fav_check($id)) + { + + $db->insert(tbl($this->fav_tbl),array('type','id','userid','date_added'),array($this->type,$id,userid(),NOW())); + addFeed(array('action'=>'add_favorite','object_id' => $id,'object'=>'video')); + + //Loggin Favorite + $log_array = array + ( + 'success'=>'yes', + 'details'=> "added ".$this->name." to favorites", + 'action_obj_id' => $id, + 'action_done_id' => $db->insert_id(), + ); + insert_log($this->name.'_favorite',$log_array); + + e(sprintf(lang('add_fav_message'),$this->name),'m'); + }else{ + e(sprintf(lang('already_fav_message'),$this->name)); + } + }else{ + e(lang("you_not_logged_in")); + } + }else{ + e(sprintf(lang("obj_not_exists"),$this->name)); + } + } + + + function add_to_favorites($id){ return $this->add_to_fav($id); } + function add_favorites($id){ return $this->add_to_fav($id); } + function add_fav($id){ return $this->add_to_fav($id); } + + /** + * Function used to check weather object already added to favorites or not + */ + function fav_check($id,$uid=NULL) + { + global $db; + + $id = mysql_clean($id); + + if(!$uid) + $uid =userid(); + $results = $db->select(tbl($this->fav_tbl),"favorite_id"," id='".$id."' AND userid='".$uid."' AND type='".$this->type."'"); + if($db->num_rows>0) + return true; + else + return false; + + } + + /** + * Function used to check weather object exists or not + */ + function exists($id) + { + $id = mysql_clean($id); + $obj = $this->obj_class; + global ${$obj}; + $obj = ${$obj}; + $func = $this->check_func; + return $obj->{$func}($id); + } + + + /** + * Function used to report a content + */ + + function report_it($id) + { + global $db; + $id = mysql_clean($id); + //First checking weather object exists or not + if($this->exists($id)) + { + if(userid()) + { + if(!$this->report_check($id)) + { + $db->insert(tbl($this->flag_tbl),array('type','id','userid','flag_type','date_added'), + array($this->type,$id,userid(),mysql_clean(post('flag_type')),NOW())); + e(sprintf(lang('obj_report_msg'),$this->name),'m'); + }else{ + e(sprintf(lang('obj_report_err'),$this->name)); + } + }else{ + e(lang("you_not_logged_in")); + } + }else{ + e(sprintf(lang("obj_not_exists"),$this->name)); + } + } + function flag_it($id){ return $this->report_id($id); } + + + /** + * Function used to delete flags + */ + function delete_flags($id) + { + global $db; + $id = mysql_clean($id); + $db->delete(tbl($this->flag_tbl),array("id","type"),array($id,$this->type)); + e(sprintf(lang("type_flags_removed"),$this->name),"m"); + } + + + /** + * Function used to check weather user has already reported the object or not + */ + function report_check($id) + { + global $db; + $id = mysql_clean($id); + $results = $db->select(tbl($this->flag_tbl),"flag_id"," id='".$id."' AND type='".$this->type."' AND userid='".userid()."'"); + if($db->num_rows>0) + return true; + else + return false; + } + + + + /** + * Function used to content + */ + function share_content($id) + { + global $db,$userquery; + $ok = true; + $tpl = $this->share_template_name; + $var = $this->val_array; + $id = mysql_clean($id); + //First checking weather object exists or not + if($this->exists($id)) + { + global $eh; + if(userid()) + { + + $post_users = mysql_clean(post('users')); + $users = explode(',',$post_users); + if(is_array($users) && !empty($post_users)) + { + foreach($users as $user) + { + if(!$userquery->user_exists($user) && !isValidEmail($user)) + { + e(sprintf(lang('user_no_exist_wid_username'),$user)); + $ok = false; + break; + } + + $email = $user; + if(!isValidEmail($user)) + $email = $userquery->get_user_field_only($user,'email'); + $emails_array[] = $email; + } + + if($ok) + { + global $cbemail; + $tpl = $cbemail->get_template($tpl); + $more_var = array + ('{user_message}' => post('message'),); + $var = array_merge($more_var,$var); + $subj = $cbemail->replace($tpl['email_template_subject'],$var); + $msg = $cbemail->replace($tpl['email_template'],$var); + + //Setting Emails + $emails = implode(',',$emails_array); + + //Now Finally Sending Email + $from = $userquery->get_user_field_only(username(),"email"); + + cbmail(array('to'=>$emails_array,'from'=>$from,'from_name'=>username(),'subject'=>$subj,'content'=>$msg,'use_boundary'=>true)); + e(sprintf(lang("thnx_sharing_msg"),$this->name),'m'); + + } + }else{ + e(sprintf(lang("share_video_no_user_err"),$this->name)); + } + + }else{ + e(lang("you_not_logged_in")); + } + }else{ + e(sprintf(lang("obj_not_exists"),$this->name)); + } + } + + + /** + * Get Used Favorites + */ + function get_favorites($params) + { + global $db; + + $uid = $params['userid']; + $limit = $params['limit']; + $cond = $params['cond']; + $order = $params['order']; + + if(!$uid) + $uid=userid(); + if($cond) + $cond = " AND ".$cond; + + if(!$params['count_only']) + { + $results = $db->select(tbl($this->fav_tbl.",".$this->type_tbl),"*"," ".tbl($this->fav_tbl).".type='".$this->type."' + AND ".tbl($this->fav_tbl).".userid='".$uid."' + AND ".tbl($this->type_tbl).".".$this->type_id_field." = ".tbl($this->fav_tbl).".id".$cond,$limit,$order); + } + if($params['count_only']) + { + return $results = $db->count(tbl($this->fav_tbl.",".$this->type_tbl),"*"," ".tbl($this->fav_tbl).".type='".$this->type."' + AND ".tbl($this->fav_tbl).".userid='".$uid."' + AND ".tbl($this->type_tbl).".".$this->type_id_field." = ".tbl($this->fav_tbl).".id".$cond); + } + + if($db->num_rows>0) + return $results; + else + return false; + } + + /** + * Function used to count total favorites only + */ + function total_favorites() + { + global $db; + return $db->count(tbl($this->fav_tbl),"favorite_id"," type='".$this->type."'"); + } + + + /** + * Function used remove video from favorites + */ + function remove_favorite($fav_id,$uid=NULL) + { + global $db; + if(!$uid) + $uid=userid(); + if($this->fav_check($fav_id,$uid)) + { + $fav_id = mysql_clean($fav_id); + $uid = mysql_clean($uid); + $db->delete(tbl($this->fav_tbl),array('userid','type','id'),array($uid,$this->type,$fav_id)); + e(sprintf(lang('fav_remove_msg'),$this->name),'m'); + }else + e(sprintf(lang('unknown_favorite'),$this->name)); + } + + + /** + * Function used to get object flags + */ + function get_flagged_objects($limit=NULL) + { + global $db; + $type = $this->type; + $results = $db->select(tbl($this->flag_tbl.",".$this->type_tbl),"*, + count(*) AS total_flags",tbl($this->flag_tbl).".id = ".tbl($this->type_tbl).".".$this->type_id_field." + AND type='".$this->type."' GROUP BY ".tbl($this->flag_tbl).".id ,".tbl($this->flag_tbl).".type ",$limit); + if($db->num_rows>0) + return $results; + else + return false; + } + + /** + * Function used to get all flags of an object + */ + function get_flags($id) + { + global $db; + $type = $this->type; + $results = $db->select(tbl($this->flag_tbl),"*","id = '$id' AND type='".$this->type."'"); + if($db->num_rows>0) + return $results; + else + return false; + } + + + /** + * Function used to count object flags + */ + function count_flagged_objects() + { + global $db; + $type = $this->type; + $results = $db->select(tbl($this->flag_tbl.",".$this->type_tbl),"id",tbl($this->flag_tbl).".id = ".tbl($this->type_tbl).".".$this->type_id_field." + AND type='".$this->type."' GROUP BY ".tbl($this->flag_tbl).".id ,".tbl($this->flag_tbl).".type "); + if($db->num_rows>0) + return count($results); + else + return 0; + } + + + /** + * Function used to create new playlist + * @param ARRAY + */ + function create_playlist($params) + { + global $db; + $name = mysql_clean($params['name']); + if(!userid()) + e(lang("please_login_create_playlist")); + elseif(empty($name)) + e(lang("please_enter_playlist_name")); + elseif($this->playlist_exists($name,userid(),$this->type)) + e(sprintf(lang("play_list_with_this_name_arlready_exists"),$name)); + else + { + $db->insert(tbl($this->playlist_tbl),array("playlist_name","userid","date_added","playlist_type"), + array($name,userid(),now(),$this->type)); + e(lang("new_playlist_created"),"m"); + $pid = $db->insert_id(); + + //Logging Playlist + $log_array = array + ( + 'success'=>'yes', + 'details'=> "created playlist", + 'action_obj_id' => $pid, + ); + + insert_log('add_playlist',$log_array); + + return $pid; + } + + return false; + } + + /** + * Function used to check weather playlist already exists or not + */ + function playlist_exists($name,$user,$type=NULL) + { + global $db; + if($type) + $type = $this->type; + $count = $db->count(tbl($this->playlist_tbl),"playlist_id"," userid='$user' AND playlist_name='$name' AND playlist_type='".$type."' "); + + if($count) + return true; + else + return false; + } + + /** + * Function used to get playlist + */ + function get_playlist($id,$user=NULL) + { + global $db; + + $user_cond; + if($user) + $user_cond = " AND userid='$user'"; + + $result = $db->select(tbl($this->playlist_tbl),"*"," playlist_id='$id' $user_cond"); + if($db->num_rows>0) + return $result[0]; + else + return false; + } + + + /** + * Function used to add new item in playlist + */ + function add_playlist_item($pid,$id) + { + global $db; + + if(!$this->exists($id)) + e(sprintf(lang("obj_not_exists"),$this->name)); + elseif(!$this->get_playlist($pid)) + e(lang("playlist_not_exist")); + elseif(!userid()) + e(lang('you_not_logged_in')); + elseif($this->playlist_item_with_obj($id,$pid)) + e(sprintf(lang('this_already_exist_in_pl'),$this->name)); + else + { + $db->insert(tbl($this->playlist_items_tbl),array("object_id","playlist_id","date_added","playlist_item_type","userid"), + array($id,$pid,now(),$this->type,userid())); + e(sprintf(lang('this_thing_added_playlist'),$this->name),"m"); + return $db->insert_id(); + } + } + + + /** + * Function use to delete playlist item + */ + function delete_playlist_item($id) + { + global $db; + $item = $this->playlist_item($id); + if(!$item) + e(lang("playlist_item_not_exist")); + elseif($item['userid']!=userid() && !has_access('admin_access')) + e(lang("you_dont_hv_permission_del_playlist")); + else + { + $db->delete(tbl($this->playlist_items_tbl),array("playlist_item_id"),array($id)); + e(lang("playlist_item_delete"),"m"); + } + } + + /** + * Function used to check weather playlist item exists or not + */ + function playlist_item($id) + { + global $db; + $result = $db->select(tbl($this->playlist_items_tbl),"*"," playlist_item_id='$id' "); + if($db->num_rows>0) + return $result[0]; + else + return false; + } + + /** + * Function used to check weather playlist item exists or not + */ + function playlist_item_with_obj($id,$pid=NULL) + { + global $db; + $pid_cond = ""; + if($pid) + $pid_cond = " AND playlist_id='$pid'"; + $result = $db->select(tbl($this->playlist_items_tbl),"*"," object_id='$id' $pid_cond"); + if($db->num_rows>0) + return $result[0]; + else + return false; + } + + /** + * Function used to update playlist details + */ + function edit_playlist($params) + { + global $db; + $name = mysql_clean($params['name']); + $pdetails = $this->get_playlist($params['pid']); + + if(!$pdetails) + e(lang("playlist_not_exist")); + elseif(!userid()) + e(lang("you_not_logged_in")); + elseif(empty($name)) + e(lang("please_enter_playlist_name")); + elseif($this->playlist_exists($name,userid()) && $pdetails['playlist_name'] !=$name) + e(sprintf(lang("play_list_with_this_name_arlready_exists"),$name)); + else + { + $db->update(tbl($this->playlist_tbl),array("playlist_name"), + array($name)," playlist_id='".$params['pid']."'"); + e(lang("play_list_updated"),"m"); + } + } + + /** + * Function used to delete playlist + */ + function delete_playlist($id) + { + global $db; + $playlist = $this->get_playlist($id); + if(!$playlist) + e(lang("playlist_not_exist")); + elseif($playlist['userid']!=userid() && !has_access('admin_access',TRUE)) + e(lang("you_dont_hv_permission_del_playlist")); + else + { + $db->delete(tbl($this->playlist_tbl), + array("playlist_id"),array($id)); + $db->delete(tbl($this->playlist_items_tbl), + array("playlist_id"),array($id)); + e(lang("playlist_delete_msg"),"m"); + } + } + + /** + * Function used to get playlists + */ + function get_playlists() + { + global $db; + $result = $db->select(tbl($this->playlist_tbl),"*"," playlist_type='".$this->type."' AND userid='".userid()."'"); + + if($db->num_rows>0) + return $result; + else + return false; + } + + /** + * Function used to get playlist items + */ + function get_playlist_items($pid) + { + global $db; + $result = $db->select(tbl($this->playlist_items_tbl),"*","playlist_id='$pid'"); + if($db->num_rows>0) + return $result; + else + return false; + } + + /** + * Function used to count playlist item + */ + function count_playlist_items($id) + { + global $db; + return $db->count(tbl($this->playlist_items_tbl),"playlist_item_id","playlist_id='$id'"); + } + + + /** + * Function used to count total playlist or items + */ + function count_total_playlist($item=false) + { + global $db; + if(!$item) + { + $result = $db->count(tbl($this->playlist_tbl),"*"," playlist_type='".$this->type."' "); + return $result; + }else{ + return $db->count(tbl($this->playlist_items_tbl),"playlist_item_id"," playlist_item_type='".$this->type."'"); + } + } +} + +?> \ No newline at end of file diff --git a/upload/includes/classes/ads.class.php b/upload/includes/classes/ads.class.php new file mode 100644 index 00000000..ad62e37a --- /dev/null +++ b/upload/includes/classes/ads.class.php @@ -0,0 +1,315 @@ +count(tbl("ads_data"),"ad_id"," ad_name='$name'"); + + if($count>0){ + e(lang('ad_exists_error2')); + }else + { + $db->insert(tbl("ads_data"),array("ad_category","ad_name","ad_placement","ad_code","ad_status","date_added"), + array($category,$name,$placement,"|no_mc|".$code,$status,now())); + $msg = e(lang('ad_add_msg'),'m'); + } + return $msg; + } + } + + + /** + * Function used to set advertisment status + * 1, to set as activate + * 0, to set as deactivate + */ + + function ChangeAdStatus($status,$id) + { + global $db; + + if($status >1) + $status = 1; + if($status<0) + $status = 0; + + if($this->ad_exists($id)) + { + $db->update(tbl("ads_data"),array("ad_status"),array($status)," ad_id='".mysql_clean($id)."'"); + if($status == '0') + $show_status = lang('ad_deactive'); + else + $show_status = lang('ad_active'); + e(lang('ad_msg').$show_status,"m"); + }else + e(lang("ad_exists_error1")); + } + + /** + * Function used to edit advertisment + * @params Array + */ + function EditAd($array=NULL) + { + global $db; + if(!$array) + $array = $_POST; + + $placement = mysql_clean($array['placement']); + $name = mysql_clean($array['name']); + $code = mysql_real_escape_string(htmlspecialchars($array['code'])); + $category = mysql_clean(@$array['category']); + $id = $array['ad_id']; + + if(!$this->ad_exists($id)) + e(lang("ad_exists_error1")); + elseif(empty($name)) + e(lang('ad_name_error')); + else + { + $db->update(tbl("ads_data"),array("ad_placement","ad_name","ad_category","ad_code","ad_status"), + array($placement,$name,$category,"|no_mc|".$code,$array['status'],$id)," ad_id='$id' "); + e(lang('ad_update_msg'),"m"); + } + } + + /** + * Function used to delete advertisments + * @param Ad Id + */ + function DeleteAd($id) + { + global $db; + if(!$this->ad_exists($id)) + e(lang("ad_exists_error1")); + else + { + $db->Execute("DELETE FROM ".tbl("ads_data")." WHERE ad_id='".$id."'"); + $msg = e(lang('ad_del_msg'),"m"); + } + } + + /** + * Function used to remove advertismetn placement + */ + function RemovePlacement($placement) + { + global $db; + if(!$this->get_placement($placement)) + e(lang("ad_placement_err4")); + else + { + $db->execute("Delete from ".tbl("ads_data")." WHERE ad_placement='".$placement."'"); + $db->execute("Delete from ".tbl("ads_placements")." WHERE placement='".$placement."'"); + e(lang('ad_placment_delete_msg'),"m"); + } + } + + + /** + * Function used to add new palcement + * @param Array + * Array [0] => placement name + * Array [1] => placement code + */ + function AddPlacement($array) + { + global $db; + if(empty($array[0])){ + $msg = e(lang('ad_placement_err2')); + }elseif(empty($array[1])){ + $msg = e(lang('ad_placement_err3')); + } + if(empty($msg)) + { + if($this->get_placement($array[1])) + e(lang('ad_placement_err1')); + else + { + $db->insert(tbl("ads_placements"),array("placement_name","placement"),array($array[0],$array[1])); + e(lang('ad_placement_msg'),"m"); + } + } + } + + /** + * FUNCTION USED TO GET ADVERTISMENT FROM DATABSE WITH LOWEST IMPRESSION + * @param : placement_code + * @param : num_of_ads + * return advertisment + */ + function getAd($placement_code,$limit=1) + { + global $db,$ads_array; + if($limit==1) + { + //Creating Query, Not to select duplicate Ads + foreach($ads_array as $ad_id) + { + if(is_numeric($ad_id)) + $query_param .= " AND ad_id <> '".$ad_id."' "; + } + $limit_query = ' LIMIT 1'; + $order = ' ORDER BY ad_impressions ASC '; + //Return Ad + $query = "SELECT ad_id,ad_code FROM ".tbl("ads_data")." + WHERE ad_placement = '".$placement_code."' + AND ad_status='1' + "; + $code_array = $db->GetRow($query.$query_param.$order.$limit_query); + + //Checking If there is no code, then try to get duplicate ad + if(empty($code_array['ad_id'])) + $code_array = $db->GetRow($query.$order.$limit_query); + + $ads_array[] = $code_array['ad_id']; + + //Incrementing Ad Impression + $this->incrementImpression($code_array['ad_id']); + return stripslashes(htmlspecialchars_decode($code_array['ad_code'])); + + }else{ + /*In that case, get all '$limit' + ads from database and do the same + as we did with the single ad*/ + } + } + + + /** + * FUNCTION USED TO INCREASE AD IMPRESSIONGS + * @param ad_id + */ + function incrementImpression($ad_id) + { + global $db; + $query = "UPDATE ".tbl("ads_data")." SET ad_impressions = ad_impressions+1 WHERE ad_id='".$ad_id."'"; + $db->Execute($query); + } + + + /** + * Function usd to get all placemetns + */ + function get_placements() + { + global $db; + + $result = $db->select(tbl("ads_placements")); + if($db->num_rows>0) + return $result; + else + return false; + } + + /** + * Function used to get all advertisments + */ + function get_advertisements() + { + global $db; + + $result = $db->select(tbl("ads_data")); + if($db->num_rows>0) + return $result; + else + return false; + + } + + /** + * Function used to get placement + */ + function get_placement($place) + { + global $db; + $result = $db->select(tbl("ads_placements"),"*"," placement='$place' OR placement_id='$place' "); + if($db->num_rows>0) + return $result[0]; + else + return false; + } + + /** + * Function used to create placement name + */ + function get_placement_name($place) + { + $details = $this->get_placement($place); + if($details) + return $details['placement_name']; + else + return false; + } + + /** + * Function used to get advertismetn + */ + function get_ad_details($id) + { + global $db; + $result = $db->select(tbl("ads_data"),"*"," ad_placement='$id' OR ad_id='$id'"); + if($db->num_rows>0) + { + $result = $result[0]; + $result['ad_code'] = stripslashes($result['ad_code']); + return $result; + }else + return false; + } + + /** + * Function used to check weather advertisment exists or not + */ + function ad_exists($id) + { + global $db; + $count = $db->count(tbl("ads_data"),"ad_id"," ad_id='$id' "); + if($count>0) + return true; + else + return false; + } + + + /** + * Count ads in a placement + */ + function count_ads_in_placement($place) + { + global $db; + return $db->count(tbl("ads_data"),"ad_id"," ad_placement='$place'"); + } +} +?> \ No newline at end of file diff --git a/upload/includes/classes/calcdate.class.php b/upload/includes/classes/calcdate.class.php new file mode 100644 index 00000000..1ece5d2a --- /dev/null +++ b/upload/includes/classes/calcdate.class.php @@ -0,0 +1,28 @@ + \ No newline at end of file diff --git a/upload/includes/classes/captcha/class.files.php b/upload/includes/classes/captcha/class.files.php new file mode 100644 index 00000000..5345dd1c --- /dev/null +++ b/upload/includes/classes/captcha/class.files.php @@ -0,0 +1,116 @@ +_error("Invalid Directory: " . $diretorio, E_USER_ERROR); + } + + // File types regex + Switch($type) + { + Case "img_creation": + $types_regex = "jpeg|jpg|png"; + break; + + Case "img": + $types_regex = "gif|jpeg|jpg|png|bmp"; + break; + + Case "pag": + $types_regex = "txt|htm|html|php|asp|aspx"; + break; + + Case "vid": + $types_regex = "avi|swf|mpg|mpeg|wmv|asx|mov"; + break; + + Case "doc": + $types_regex = "txt|doc|rtf|xsl"; + break; + + Default: + $types_regex = false; + } + + // Open dir handle + if(!$dir_handle = @opendir($directory)) + { + $this->_error("I couldn't open the dir: " . $directory, E_USER_ERROR); + } + + // Initilization of the list array + $file_list = array(); + + // Starts dir navigation + while (false !== ($file = @readdir($dir_handle))) + { + if ($file == "." || $file == "..") + { + continue; + } + + // The list will be generate with specific types, according to the regex + if($types_regex) + { + if(eregi( "\.(" . $types_regex . ")$", $file)) + { + $file_list[] = $file; + } + } + + // The list will be generate with all dir's files + else + { + // Add only files to the list + if(is_file($directory . $file)) + { + $file_list[] = $file; + } + } + } + + // Close dir handle + @closedir($dir_handle); + + // Has no files in the dir + if(!sizeof($file_list)) + { + $this->_error("The directory: " . $directory . " is empty!", E_USER_NOTICE); + } + + // If debugging... + if($print_list) + { + echo "
    ";
    +            print_r($file_list);
    +            echo "
    "; + } + + // Returns file list + return $file_list; + } + + function _error($mensagem, $tipo) + { + if($tipo == E_USER_ERROR) + { + $topo = "Error!"; + } + else + { + $topo = "Notification"; + } + + echo "" . $topo . ": " . $mensagem . "

    "; + + if($tipo == E_USER_ERROR) + { + exit; + } + } +} +?> \ No newline at end of file diff --git a/upload/includes/classes/captcha/class.img_validator.php b/upload/includes/classes/captcha/class.img_validator.php new file mode 100644 index 00000000..92315e34 --- /dev/null +++ b/upload/includes/classes/captcha/class.img_validator.php @@ -0,0 +1,325 @@ + background image color + * 1 => background image border + * 2 => text color + * @var array $themes + */ + var $themes = array ( + 1 => array(array(205, 255, 204), array(205, 255, 204), array(0, 0, 0)), + 2 => array(array(255, 255, 203), array(255, 255, 203), array(0, 0, 0)), + 3 => array(array(102, 203, 255), array(102, 203, 255), array(0, 0, 0)), + 4 => array(array(0, 0, 0), array(82, 82, 82), array(255, 255, 255)), + 5 => array(array(153, 1, 0), array(0, 0, 0), array(255, 255, 255)), + ); + /** + * Colors themes for the done BG images + * + * 0 => background image name + * 1 => Red, 2 => Green, 3 => Blue + * @var array $themes + */ + var $themes_bg_images = array ( + 1 => array("bg1.jpg", 0, 0, 0), + 2 => array("bg2.jpg", 0, 0, 0), + 3 => array("bg3.jpg", 0, 0, 0), + 4 => array("bg4.jpg", 0, 0, 0), + + ); + /** + * Fonts data + * 0 => font file, + * 1 => initial X position for a letter in size 14 texts + * 2 => initial X position for a letter in size 40 texts + * 3 => value to reduce of X each new letter in size 14 texts + * 4 => value to reduce of X each new letter in size 40 texts + * + * -> P.S.: The indexes 1, 2, 3 and 4 are used only when the text will be centralized + */ + var $fonts = array ( + /* With this font, all letters are uppercase and the characters limit decrease + array("acmesab.ttf", 84, 62, 7.0, 18.0),*/ + array("arial.ttf" , 85, 70, 5.1, 11.6), + array("verdana.ttf", 82, 67, 5.6, 12.9), + array("comicbd.ttf", 83, 68, 5.1, 11.5), + array("impact.ttf" , 80, 55, 5.7, 12.9) + ); + /** + * Image Width + * @var integer $_width + */ + var $_width = 180; + /** + * Image Height + * @var integer $_height + */ + var $_height = 50; + + /** + * Checks if the system has GD support + * + */ + function img_validator($folder = false, $img_folder = false) + { + // If doesn't given, uses the default fonts folder + if(!$folder) + { + $folder = "./img/fonts/"; + } + + // If doesn't given, uses the default background images folder + if(!$img_folder) + { + $img_folder = "./img/"; + } + + // Sets the background images and fonts dir + $this->folder = $folder; + $this->img_folder = $img_folder; + + // Checks if the system has GD loaded on PHP + if(!function_exists("ImageCreateTrueColor")) // gd 2.* + { + if(!function_exists("ImageCreate")) // gd 1.* + { + $this->_error("You can't run this script because your PHP doesn't have GD library (1.* or 2.*) loaded.", E_USER_ERROR); + } + } + } + + /** + * Encrypts a word to record the data + * + * @param string $word + */ + function encrypts_word($word) + { + return substr(md5($word), 1, 10); + } + + /** + * Record a word in SESSION + * + * @param string $word + */ + function records_word($word) + { + session_register('word_validator'); + $_SESSION["word_validator"] = base64_encode($this->encrypts_word($word)); + if(empty($_SESSION['word_validator'])){ + setcookie('word_validator', base64_encode($this->encrypts_word($word))); + } + } + + /** + * Checks the recorded word with the given on + * + * @param string $wordc + */ + function checks_word($word) + { + if(isset($_SESSION["word_validator"])){ + $recorded = base64_decode($_SESSION["word_validator"]); + }else{ + $recorded = base64_decode($_COOKIE["word_validator"]); + } + $given = $this->encrypts_word($word); + if(ereg($given, $recorded)) + { + $msg = true; + } + else + { + $msg = false; + } + return $msg; + } + + /** + * Generates a random text, whether a word isn't give or + * the given word is more than the letters limit + */ + function generates_text() + { + $temp = md5(uniqid(microtime())); + $temp = hexdec($temp); + $word = substr($temp, 2, 3) . "-" . substr($temp, 6, 3); + + return $word; + } + + /** + * Generates the validation imagem with a given word. + * If the word isn't provide generate a random word. + * + * @param string $word + * @param boolean $use_done_images + * @param string $align + */ + function generates_image($word = false, $use_done_images = false, $align = "center") + { + /** + * Didn't give a word, generates a random text + */ + if(!$word) + { + $word = $this->generates_text(); + } + else + { + $word_size = strlen($word); + + if($word_size > $this->letters_limit) + { + $word = $this->generates_text(); + } + } + + $this->records_word($word); + $word_size = strlen($word); + + srand((double) microtime() * 1000000); + + /** + * Chooses a random font + */ + $fnt = rand(0, count($this->fonts)-1); + $font = $this->folder . $this->fonts[$fnt][0]; + + /** + * Sets the X values according to the chosen alignment + */ + if($align == "center") + { + /** + * X position value for only 1 letter of the size 14 text + */ + $x_small = $this->fonts[$fnt][1]; + $d_small = $this->fonts[$fnt][3]; + /** + * X position value for only 1 letter of the size 40 text + */ + $x_big = $this->fonts[$fnt][2]; + $d_big = $this->fonts[$fnt][4]; + + /** + * For each letter of the given word, decreases $d_small of the size 14 text's X position + * and decreases $d_big of the size 40 text's X position. + * Remember: if you change the size of the background image, the font and the text's size + * you must manually recalculate those numbers ($d_small and $d_big), + * so the text will be always right centered + */ + for($i = 1; $i < $word_size; $x_small -= $d_small, $i++); + for($i = 1; $i < $word_size; $x_big -= $d_big, $i++); + } + /** + * Left + */ + else + { + $x_small = 2; + $x_big = 2; + } + + srand((double) microtime() * 1000000); + + /** + * The background is already done, so, create the image handle from done BG + */ + if($use_done_images) + { + // Chooses randomly a theme + $theme = rand(1, count($this->themes_bg_images)); + // Start image handle from file + $background_image = ImageCreateFromJPEG($this->img_folder . $this->themes_bg_images[$theme][0]); + // Text's colors + $R = $this->themes_bg_images[$theme][1]; + $G = $this->themes_bg_images[$theme][2]; + $B = $this->themes_bg_images[$theme][3]; + } + /** + * GD Creates the background rectangle + */ + else + { + // Chooses randomly a theme + $theme = rand(1, count($this->themes)); + // Start image handle + $background_image = imagecreatetruecolor($this->_width, $this->_height); + // Alocates the rectangle's colors + $fill = ImageColorAllocate($background_image, $this->themes[$theme][0][0], $this->themes[$theme][0][1], $this->themes[$theme][0][2]); + $border = ImageColorAllocate($background_image, $this->themes[$theme][1][0], $this->themes[$theme][1][1], $this->themes[$theme][1][2]); + // Creates the rectangle + ImageFilledRectangle($background_image, 2, 2, 177, 47, $fill); + ImageRectangle($background_image, 0, 0, 179, 49, $border); + // Text's colors + $R = $this->themes[$theme][2][0]; + $G = $this->themes[$theme][2][1]; + $B = $this->themes[$theme][2][2]; + } + + /** + * Allocate the texts' colors + */ + $transp_color = imagecolorallocatealpha($background_image, $R, $G, $B, 100); + $color = imagecolorallocate($background_image, $R, $G, $B); + + /** + * Writes the word with transparency in the background + */ + imagettftext($background_image, 40, 0, $x_big, 45, $transp_color, $font, $word); + /** + * Writes the main word + */ + imagettftext($background_image, 14, 0, $x_small, 30, $color, $font, $word); + + /** + * Prints header and the image + */ + if($this->image_type == "jpeg") + { + header("Content-type: image/jpeg"); + imagejpeg($background_image, false, 100); + } + else + { + header("Content-type: image/png"); + imagepng($background_image); + } + + imagedestroy($background_image); + } +} +?> \ No newline at end of file diff --git a/upload/includes/classes/captcha/img.php b/upload/includes/classes/captcha/img.php new file mode 100644 index 00000000..e6592146 --- /dev/null +++ b/upload/includes/classes/captcha/img.php @@ -0,0 +1,12 @@ +generates_image($word,true); +?> \ No newline at end of file diff --git a/upload/includes/classes/captcha/img/bg1.jpg b/upload/includes/classes/captcha/img/bg1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..11a9448d1e9db0ee460f0767f302e5bf306166a0 GIT binary patch literal 3801 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 literal 0 HcmV?d00001 diff --git a/upload/includes/classes/captcha/img/bg2.jpg b/upload/includes/classes/captcha/img/bg2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..560d09c02d2c97264cad4620ea57bb2407e6f687 GIT binary patch literal 2558 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 literal 0 HcmV?d00001 diff --git a/upload/includes/classes/captcha/img/fonts/arial.ttf b/upload/includes/classes/captcha/img/fonts/arial.ttf new file mode 100644 index 0000000000000000000000000000000000000000..ff0815cd8c64b0a245ec780eb8d21867509155b5 GIT binary patch literal 367112 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≺9Wiv@#qpl#qL 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≪P+Tw+*$qa@!i>|Uj$m6(YG+< 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 VQlm?y$QD;A35 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 literal 0 HcmV?d00001 diff --git a/upload/includes/classes/captcha/img/fonts/monofont.ttf b/upload/includes/classes/captcha/img/fonts/monofont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..ec6c51b2640bafbf046060a8e2b594905dd5e7dc GIT binary patch literal 41036 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 SyQDLSP-N_L`0;nd!2ds0@g5HV literal 0 HcmV?d00001 diff --git a/upload/includes/classes/captcha/img/fonts/verdana.ttf b/upload/includes/classes/captcha/img/fonts/verdana.ttf new file mode 100644 index 0000000000000000000000000000000000000000..8f25a642311b8dde62b6154184aea935999b7c15 GIT binary patch literal 171792 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 z zy#@{Na?l%teJp(MScr}pZhs^ue#F>H#J-Bf%Hg!Jg0!;l{Zy20{q#4$!&Mb(9 zwcx~Q!?PDBWHN4Ys24c|{6aS4oLKVM<8AiDQ|H6>aziY>>w6fd;686>^T?)O&Ym!9 z-!=Uo^?$6UsrHiG+^)L%Wn;73T^Y_icd_Z8FeXD!)6`4l8Q1KivvXkb+M<%o{^!Fb zWh-W{x-Z^2QZHEZ+t~+`AI@KJN>z2Kx=&X8feG?>x#k3U?6&?#i*Tl}N|0&x@9`>? z$@ykMAkWrRP~gvxs928h9Jd_Jr;H0c34ndC_ET>qx(0ZOc{T`(vxPXlrb?dFR&!z z1b1IXpW9}a!?Cn9*`{LZ7QkM79=2ZKV}D{cki7S>2V-USte^#LcR)HXHnt$%tQt1S z2cQyKPZT#=%0uQgm05Y<-jB>My_tnO=A&~a=510bSt?45Zg^4^gPKAVsR$*(E;ALY zus*Ot!~Sf_zOk-AOhZ{`>4L?dowV%EQKQD~_vb}7EnWGu<*Wf}@*5jsO*gH>M7WD5 zU0hW=qO=h5jO(dbAADlzgLdeHO!Ou670FT&N*{y;D+>yj-k%^kBvtiG%D=+L^;ohRqz zNosjGQW)+-zBN)H^*Lo{vpfeFr5j|;@08U5yEi_BA|D@7r>Zfit6a%KP>vxErQZC0CSJWfsyAfCzYv+mX2 z?f;L$-sYy`Ys%Nc`xsy2o0t<#_>21w{!ZQ_pI@LKxc&A6`oqeSMT-|JzAAxZZzsG z(4EcyijyIo#v|d`Zl% zMw)DPr_-A)DRkn<;b0{PLPP*Syv9ln#OJ1$j@=ychl<YiBINJkol43U?MDz|=%>a|4=I-0g6;vcA&cpRs z=XA*{B~eP{3411GshLeq)#bG{p#m|Jt2#0nNk&*3P9KS1#NIzNGpOjoiq1Q2D0=xE zDhdx~_*|TXLplzCn7D)Ta_p}X!R>-B7t88&vW8^u*Z0yuKK4TsgUGPYL^~h{1ftkZ zQnuG?vuW(WYF=bjP}+g*2m%2qe4-8!1?`8zI?DhOH%VQJW<4gTBLE_w>JSlZ;X=g5 zW)B?}>DTZ5>YcqC&-sD6c1QB=WJbmn8&roDP zBr8~f+&^L;ADFXn(~iu&vn)TXRu?wJAyG0KW43C=R}<45N_K%>4J>?TG``r`6JPCI z5;v-=<+xJT7&D}23pGq_LM+OsXJ^};HWx4h9nanHXWXxMj=W2t#nK@zX#{LtQ2&0y9C?xq%i~k%j6|Y!sSFY-oODE@Se%59299Zh}pa(#V8QRM zS%Cf&t!nj=^lNp|foaXl8`Y}10@*mULb`+a9R4<*p|0y3F~WttNP>(}5_tC_bOjmK z%YVrEV*3r6R~AJXLR$_hQOjv%AJ(Ed(Zcx|!E1nnQGt-=uTLx--}CNymwz?Mec~5u zCf?rEJfgj^@zVJR_T2sJSZ&SfDbvnvt6v&OpZxiEH{U;b+KijdYTBT@P^^p6xSRIuz;qXku~4l}vzC+kkAP zA)Aa}yA9e;)DwXClB{9mSw)M856VU$T`@sS1@X3-Py5>{^$_`(Qd$gYW11UXUxb;3 z_aVVy^Zie7t^|M^vKB%fGePng#Agt5AXYhtC?|-XfnYcCGK6>~qLbVi2f(^4923H; z(_5bH&-wYY%I|)q-SO327&j}lt1YeE0t?WAEWuQm$N!R-@E`jSoz3*!=}wo^1#3&b z&e}k@$GHS>ehBkAGbOP5-^ppl`ToDb>7i+bp`4~jBVmhCWs`tfrjR2+Ur~c1A-WP) zV2bs_jnKh`cxaftIk+st?MtgWLW-hR>3a@2U#^hLqOEc~I$53&Jx*RGofO?5ofb{c zkD|iHMSoBquwDMStjK$yF!Gj1&W|V&uO}Vc%NSEmTsIGMb zr83)H7{zn|Q_^}M!oE|8&MCVE%I4EK1Oa*fjTQX^h5Q4h{qJ)!9j_6)nFzM9^i|gA zR4|efid3iA+l!bQ*vRD;hd2=5--6pD{(JXv*~Ju02qlT#fHXfJTi)RT+`6m>UI?F3V;WvnC)S$gO8t@g`7) z$<7cV%8f-kQ8B@Of$ELs(Q~3?@vzK^a=|Vkt)#5d<9U zr@&5Q9~?U^OgoJ{aPwPu;F9`Jee9f`969Hkd~DQRU~5rP)39@*wJv zW(Sz1UH949O9FQevlJpWvF8k8puvUm8HikxF@p|Rz&H8Gz_2RF?UFYg2+P#J^f~A1 zK!}lpR2yX>)%r=U0gxUxk&`3CPG>ssYE$tD5JE?Qu;LLihb3`as0I*1S%45H62#m1 z$_&r{A)iRxlY*=r8kpeTN>&??lY^mWgo?16DaSt$oB)=Tu6%{q;v4&S>_u$i4ZY~g zHelf2$deWsS?4m9@%onqOC3zL>6~W)!2!AlfN5!$DmMBXl9i1yC}+ zx^SH(c6jit*DWlyjS+W5PA3pF(VPUrYPfZAm=VAS;27?GO}v0APXTkbGMqB#1{>Na zlAhoQYbr`OkimpGH;@ZKDcJ}6&wgX+iFYLu6ZZRxiq@X8=HQI|%7*gF5wY0KYvseq zljd%!ud6H1Q|`AcXB*)Xr%8{agBBadt~JRHG*zawm`IeNRfTjIJAAmn_e5W?wBPR2 zd7YCSpuq}>YFQA6g(8!AJIMPXPDQF0#B2Oy5U2~lyMho1b0EMT+KalL?#fS3@W9J~ z+4facTyk^>a|(F5Srq~_aL5Y7tF~?U0@qthzgGAOAt=7m(LV(*GGNc#Y$6O3i6Frg zqGSeg84;wH=seOE0D%+`r-a z#1Rpl?6{2@YR+IFWG9CPhUHLhK@?jcqYAk!I#OWkd}GommP!oiCC5%CB$q2ozB!XX z&9Wke0BwZGnsFs_B_A`fJ~91c(`8#zDC7?iV+z#*@CK?caZ_EF01_6wT~^77VuhOyqE|1M{WZ&CEeIr+6&PXRs7kY4O-}^Oh-a z7nlYA3vLPh0&WQ(gb0gU(EJ zbW$FEsjf?*G|IvUn`l~=$yGF=P`RVHINDS$;zABX^`mT04HpM|2>gis1L7d7 zcMt-d1H>m{fS$T;Shl`6SR521i8v{bvM0fgLsP?<^ zm+aQ7mn7eL`mW^fPg;3ObII>UPn|ot=fKvxPrnz?eN)H0UKU%zy9Y=#FQczD4Rf!` z%!Z9VU|blEY=1asj(>j6CjW*UyQ|5Y=k=*MYLj2dR2@w@z)KDp*)BdsEZnPD`NGzL zSm%}{R|y?cm#7f|2-7^*YLfbHDH}Y0iG#}^1Uo?pc7k{hfHl~nAs@Xw#1jWY>!O|v zA9k-e&LG5cfUu79fFu;hS!{HC6%gV$gAf~(2vVlTY&Yj+-K&PqzQRUL?ON_Mp<|7M zjWTMi7j^OgJ%GATL@llaBqU5T#X+VhP$P0L0vstS+4SU*-@SoRrt0gzljW~AeY}7F z7sc{Q*()ai^Rz4ZZ1NY$OO^NKaybU-H_6{&rfRdC(O(a*`7XIe9-llhd1dnQR}v zLzu%z+;lMB3monD*=hyxu_*>LYKH3276bUjGt4j(F?`W}_2`i|L|>l7;ZfKvq7V^; zRoF8OwSex0DnothMiwzk3e-V?37$e`_7b`*v6o^Jg5CJbp@{x{RTPBI!bE2TplRd@ zc7B1HHLMa{dviaAGLHF3e)FnZ7Ehb-26yG42t_=fp0ZB#{l zi>XbnFk6;+)_c}9IvYt|@_0HI#OZkuD1NPM4QqEfKg@k2zJg!L|ohs=;G>3S0O#m zb$%;vR>aE&Sj)K*s`^j0pAti@2sBrZQwb1Piir3E)2 z{<-tNOg`K-WwBiF(&Qhk>b)!0H9yPd(C)?zgtU$ku^&%u?&?SuKK4kwHZ&&Zp8qtP zYhHuR0Mu4(CTcLV(c{)A9X4G~RriI}Y~O|=9a82X2B5m)o~-KjZc2ySa!1+qno%~p zKZ43Xwli_M2~wR8{<~%;n@hZjt-(ERTS-K+(-S1FH;@z(Td>EGGv5_+$Kh}749R}7v0xMD80^zT;IRl+LHEm%2m<{5>~;05wo#jTmydh*3I ze{giNGd?cYV@qD{4uvK{qhfW`C$KuY^gS~yCx8sohkGR(04A_c6)wL~!q~@xWgrC0 zKnRwBuvlhIpCO@48F)M(q%#phI;-rxsoRY~&LMC|Jpg27krB(qe(DqbkM9Mz$D@ZQ z;+rXwBl#)M%c1<}3ua*(H9R6I+TqlZAMH>x`Kx9gaB|epDRQ9f%Oe>o8g+=^jAure z6dNB>)^H5R?c!Pi7uO2l-VXtcN=~LrJ^(ogUbVNv?PN;i_ep3E6#lLB1p!q{2J88Dp*VCPbV$<%u_wb|lZd$)id2(CwC&_!$ zx6VugTQT`J`L3VJU&!j=F>3x-$rH{eX~%P!xp!tFq@64^!9H&Q&qhf9X?j{ST5Bd{ zOsZMzT3olA8F@tb071 z_C%B7b2+-+*pP{q((cC9jlye7B{Bc|In2Q@_COZ%zmdXh_+#?gg^y29Uie%2-Vu}Y zBa>#u#+`XpjU(bLILUn6Tv3n~u~%Pl*0|X0$)TL7H8KX5(?6vvyyW=Voi{E$D?BDJ zC85dhBy%)#a;P)3dHIdwr_Vnz1dfkB@~--{wh@(yPdrlEwBB=8yIM!=t%LNj6PQ9< zByn%fQvg)XF-9b6cGc{zQEO@{I!2&Dp`L~}Wh4woPHhqSd+hNPMdGzN@ixujqq{iN z?Tc95(sT;xSYlfWV+q8^0ysq4mDrNlnoza^i&=5NAB{WEK9;gitJucjai7DInLsk& zQqsY)?;%#IC5MJr<06?UELKVxrv%v3bH|RodB$nKUY_3d_R5BpWt9yhDl1N_ziCbR z+2uezE-qPEwEWpI=`){PJnaW#I%l1F+(~E1EsM@6FDtIDebF56%?^%fZJ&tEa-)%+ z)iJhiR92QN-t@~zVNPM;`Z@E?%e93r5VA^Jj@|75PL7xIZb~`~qLIi2D0N{{jc{opqF&JRo5XQ8ZIUhEn_1OieZQ4>qA%OhvELlFuv_YtXNG!b-c9 zdGsbcV(QzR@Kw@P;fJM%@uDz2$AkU34^=~?h%f~W!*u^wZQld=M`7)rx_+_?@Plo5tW+f%?x_OrhE#1P zEc*hjV=rcV8mcWC4z?8*&K!|7+Uc}oYCxl>vBRm^R7k_8W?tKI+jE^AQ}grkl$(_d zZ^K7_nDK|@mh}8BIOmdQo8FkCHEo#bQ%|H`Cir3v-$F@Hr614g}&!9$Gt^ubL|Cfk4yW-S<$AgFJ#}sW(@MwTO8{H2 zQ{fs|lFLi58fnr8X1bcN+jS=ob##0qCq-ICw32=eFy%u_VSP=u0w!?@PlhBFXIbcB z9BQGkKnR5eLMSXc?;;RAFe_3p3l9ip5h2WZofVe8eQ2(UCBpy@=@tr-MOtP6W{?YE zwIzG|e}!3)b$jK1Bpo>F?ea5h(PG-zKsPx1C(I|C^!meU!T|OlA8p!dMDSMQqm9Ws ztjqtK4Ek71c#$r1$&G%&qHTTI%F0`o2nn-l-Q&V zW}Yf**Z`)~tt)U>hdZb`oJ@f=1VR9efe>&FApUOVP?fCM|GU-u;9LUK%E#7IAPjELk_X;y7KOHN1F1?*!yX(VB>ef%&9L(k8JGfM}+#jkX6gE`;J z!6kvj<4Sb66Vx8s16M&Gyy||^OxTQp7F3L)k_KiFbz$%y$T$FQr9u~oV?)A`c2Y3; zh5~q4bi_%C@F0*u_&fr+KnHZ=z=RBA@{~l!jq}HxSoZj+?pZ(mcv@oAEi>9r9PxPV znTh>x|8)EI_$2gGweI*q|Aw-j5!-&Wb6aeoGUduYO`0^V)|+gUU&t$xYvuGEZ%po* zT9POKA(q&no0n;5P*ax z2Mtgpc7Ut0+0Jkl)4MoX`&n6kveoj@c8T;qiUu;`JJat?KT7&Qt_kT3LP%#2LOO%6 zq_fpTLwlS&6+AFd3-C7EYw}RBOj2hMYQYLnVYjmYIz|zIR(JTqy-MlcZ5UI0cpM3% zB)~aD6+k{X>6c}AT1JjhZLH7G6h~G9H2|2)B~eAgfZ+w8J(kljY*{o@aR4Vu2L{M| zDR3;Ux^gjGhO9JUc_Aik8C(Js;j&;NC?iTkJca7PUz+wL3I{-lXe@}Nn6qa!Q?en( z57SGSp!X$$I`u#aEF4EB9OqPSRq$p|Qi~AZF$)Za4NF7zFMsdCTTgiKNle}fFPb&( z#`eAP-8qH#-zHy`{10Y2I9rqF<{&FuK0% z+biEgzp34&KEWJGermh~j=13=VVbUjF&@N{jPwJNbWFYsG&op%v658u-I*^g=8Nm! z&6i^43-@HC__7O}QK>G05bzV2?(nZTgBT%p6SX}Yt2V(X`0^TyMT1AsI)>;MfqZ)g ze4^Tf#~)gc6#S?N$rT@cukOeVC|*UeLL#KwNBJpu4uO*vj||@&0L*~0@MG+qC{$oE zheR)sqi7HLxg?(QWWk@R~X&}Nop1D zj+Mcn4(47fR}6#ss5VzrEQm^ZO(`m`JZ0&9cP;%+c}2<7qepgLwIMk>`KY3O`rV7h zwYJK08>a?C&g8jS!SICE>E~87R6;i=r-mD=&KH>n{YK^!sukqGLs7lRHVWBDz>G7e zLN^fZjXywq+9b)$DmPdqMS9#zXpn&0U6eYGM2O>96fR_uQb@iYAIHK{Vi|5*uv>*Z zZ40+aA{q36@E!RTC}_Z4m!Y7czQjaPgBG$DhPAsr3?2*V4?;+P5JLJh`+0Rz9t__@ z(u@ce`~D$wM2Y7^L>OB(=tfPY>jAvSnC`>#4e?aBF_NF0rSPIwMqP2Nh1e@r;R#^0 zeSINd(epYe_kVSh6^DvhYq9%*f4K~~ybSK0NHf+^C4&%b-;PD1YY&_eehU#6iw3J0 zEEWx8%0Mm6*LG%#CF(k6$KwwV-ItU1CckM@rg#CVKNI%*XKcU!@Sz5+Q&WKEauC&n z>G5nrc?5vKLCm{E?6?wtJfpl`BR>)ebmVI{pfl8&(P21zIa!pC`IJvA6O`@(@xI9! zM0HnD5e@6hsq-eh-Cot3hG-dW*awYRGWGl32-e`-v6`~Fj}d&brO3#HNbs`qY zl8@F$Uaafd_xRP<-!N*-i=kE|W)YXfERZQc`J(!Su@5^Kx{|M91cg*u)tF2`H2&!~JMFPds>9u?hoiGpwQ{@bw3k00du4r8}5mh`HybYli@w|*Mq=q=JAS|dn zD=(Qkws=5foIr@m8W3Vn5+QtPt8f9RVW|S7R94ZtJ+yQInWSO03)Hy+X*ytTmsrIM z1PVd*3`K>Ke&MZ`fB#3fUv}AThhKhw@7_ZpIqSLiWKZ&wzr30JFQxW3um1jpSAO&A zjY$K0we7wB+0 zcQ`^0CB)1LMf!kp$z=#mJ*-dC7wB6tK*vBq0_|V64N0teiIZ^Rg_X!Q32YmV!6OnU z(erTI(o7N;*|F^-tVG0**h(CT&wWOq*%U8=@Q{bdKfzG0P!Lj36etWSPmrlRL1dN& z%M)nN^W0k`JQ_9c-ZzrBz9DbC^!%Pt?LRyYHq4=^V*zRxC@xt!T7DuqPJW^Mmhr$oV?P!^7;A-eQmB0@MTQT%JKx$?VS#Ed%MPf+ z$KYnUfuSq5J_u{;r}Mkvw$NB0#MTEP!bnWeiV-2UemXB#`u64_TfdYDN9fx1&BxAwK(mpszbGflbvGr6a5axGnXAth=lNzW)UUytAr zevAMHXw;n3ZrFU*ucl0y0l4$@lb;ypGM`?y^SO}H-v3kQGdHjLNr$UGiXcwc>z83z z%DCp}^9|E}_@k>I`1#ld;sj5O=Zc&;+|7Z3@$&Z=vuO(7J_^I>$kP~Bmd%e(h4-#d z#NYUoEr(IE<1wiookfUJ6ZFeN_`hvboD8}gHt6Cv#FaRJU^-$tfM62EjzPQ53xgs) zd{QvkOdat34~3K=h?oe(_@`zKz48J; zFYQdY0S&_vFvzZ0@IW+HA5&tO`woN{j;#?+4EtOH9R}_u!K885{4l$j>=QQFsPQCK zPemzPDb;8ytmgr%jWJ@rIfY=^bVkDvd+xoIUHva|3zp3tjSm{#XA7JA8Plw+$7G<&ds6EK?E{U!7}_UKE;e)2Tz~HRT=giuBd6Q5 z-AYQ+5W$+}DAac`olO!!dFB*!(g5_hMuOw3QuMyxzr`iVJ3Gn$OC zMvt+?=)*iM)uxBkfIeRCQs+r?vAZ+mj0{gt8ZbB&AZEL= z57po;ckAv59`b_DxQhT25`Br}=?p~WcLdx4M#vtA@nP!$ z<#~>O7(O?m_xw0eyh~dhpE((m3tfJyCSeAWD1CXoqGG1simQ*H&!4i@4>Q{h|!Jc zx3;>x2wlU|KT&M*r zv~5VnkXDrnBq4kdumAcruHUQ7x<`~s%4_;Rplf_yX}86c*AW53^yOLTWzu;>A);?o zVHqp1#lE=8SgEw{#=u#0^w=N6lwAj;MgiQ9t!9Va7PPg>UGi9CyltL5%a~(ZEiW;) z$bCk-Bi-ZqKp}O zQlT4QwuME7&YT08nSl0{35!6$NPrL#ZxBg=6=CyQz92^-t=ircY-OrW0|^xN3sVrv zDL?RSvc#Y?B+Y-o=`6Egop_lPj+-m2jTG;BYs7@Z*9Uw^q-aU<- z){gvF|Jn!TMy2OL_3@uP@bKeLKJd`v56oM3(%iWxEt{7-L4GtjQE&S47w9cEwSCDG z-+Jw}-@ou=n(ef!;aZ`;=Y{`KN4{9AMDsY;mv0r>xNZXMH%LP|{8slSRDNd*|( z+k=7@RnAatQl*Lq0Z7+~;$7$|C@CxqsddDu8+@j&KN(bJ-R1Sc>Ni@S1hVpS%Gi(u9Bm!!#AvzPBY!B9IFby>-cV=HrurT zBkRa_ZzG5Xnm18hl|9|nPhC5tY?k~)$EcBOG zYYs$bfWLr!e5ejkuEN2zrl?y*?}#OG@>uBdm{8`pwknw%@vmQGcAl)RYp;)O?w+x8 zbXLi=-Lt;4bm7Hk&0RcWZs+$)vdpWxuetO1sXgn})(L%uCDFW`dyCq-CeCcTXi8`M zgpQ(nBZU{AFn3MZo_Q*4qCHrdpWwQkz}9Lt^G-Fs3#>wioIYK5>8edpGXTq{RXU_} z1BiHZAuX5(kJBlv6ACXh(3zBr(CJ-k^qFfBi8f z(tp3aE7?c8fq1c<@lR|IYf?L5sb%vf34nL&8|vz}&z*KggReP|lRKuYvc;F3m0`#qU-U~w2^1Eu z#+CeCL68JjVo0OSk~x3|L?d`5g!+lnI`CFfr|TGzjb_AD z?c~H+MOxV@^3ukMiRRK#K4*SfNq2HnLtCCR#~tmhpR{-yxCx99<0ACym7|9L;GT^^ z8AbXQKB@yXx6177pu@@O>-S+_f!g5MluaR{edsUBj7L^0t z>};dDDO+g(AXZ^sMQL_K!jNr(z8YwJe3xT>xM!g8@nf@w^s3tI23-2q=3UKCHUF~N za5u|!*>2Hv!&O0U4#B%mj5l*NFM&fACvvE{mnOJo7Oe&))OC1zH$7r<&0ze*u!$cNhh4V;`m5Gfo6^^UKnuH zjc-_WPI8A_D7T?$?@eyhi(?H41^j3Fxsc-((gD*IrpBZ)&P*U$@jgm(z?jy8SlOh4 zab;R|WJS6zsRap#R+dnmzRZfC!xd4DDlV)-cuH6|AcSL_M>7xys`lS96SSz-tgT&D z?yCH%MAhmlt(XVIpl$@gq~eId2=N9NMi_{Nz`$k`#=rm#w)6*Velj}1{MRk!ds-6x zFM#o+PdNV1U5);L5VlCu1j)dv&#lmb2pah5 z+HvnEW;L6A3%$n6TThM5sy9rj}brIon@dS0;wkl9WMhLe> zcp8M5=SR=LH$e9fJw$I$1RHs-Q>up=dA*r$(!LfyhhFJr#`i+(JwrSfNmMwmsEmUr zl4`s|!4z(?+DolLkzO%j`qURMxcH?B(-$aaQJEh4bk zyyBJFaBv)YR;TU+AaVs#BL(E14OZ<6&{ZXD;(f@^DdG)k_0@3>hSS{E=n}C2Fo4N2 z9#{lIax3AG4M62rmnntM+hDaSSK_5nh z@Cfa^>h^6%ncux@ggD~GS%ag|!0QA55J3mALa?*Nn5kjQbM)F2X><23zGuaK&!Czo zGG|8D-IHG$T$VE@_x$E1<<9CUjf*9})M-{ch0udx=&l~$ z613!Mckk0*!h%qu7G)z2Gs_ouRKP5hvg$}?lIwtWgu32W$cuQEJOe@vEP`n`++z|v`vd3<6m6Zj{9F7%+i)>V-AbF1RUq{A4+j=p-cI-|? zR-|m1icoslx{Wm||Mki%$#Z^o;k7WmAvSW%}jXFI{mRLvdylkh;ATcM0e^-aN$dAeKy7Bz`ok|5bhL~Le;?+-~<7t zn7fm3g&6)K|@+?9m^*^G7A{+SzC7S+aCQk~b$mlTrMlNGdq{2kRS5 z`uaDpJFIUI9QX#(YR4ATciFgvoeUNFbR?6G_3?6%+L-$I}_WNNU&)2W*v(3Qu z=Sr7|PxsIV(e*!tG<|xy%iF`MISuzjT#D>MaEUllIq-eb?%wBm2{V}pYRcsbX3_@8 ztZ-xgT+jqQMvz#A`at5<64cuB_k5*l*w(NZ_X^Ji<1I44z>;s+EEZ4YpM7o9SPX9X z`rc9G5^($Pwl{ITQE92T-Y8uNU9T;3h8siVc4K~_FL#F1OwWot5gt5h{i78&$y-72 zK>Hq~YhwN%syj&Ak1nI7g!iD&Zr&i}PK7s^1@I~ zo=?eaFX)^*cmWHW#&||9a~4EHxpv!J!#R#tu>`9~`!XHf{qrD#0yEt3rj)!$@r)?! z6FNa9FyXQ!ih*M$Dz9z0B4U(P;8Koa@1a)?W%7PJ^hPgsAdAWk_-po0rN_%S-XgS7rlV2Sl$1r?n~gJth&aZ zd+#$dFd&PdqM(k5g2*y6><9`f$|fL!fLjbOz$nb%4C7h`WLjytl$K>FwzyRau9+s4 zW|rD!E?H*oxtG0Wugm<;z0bmE^?vX7{eQo2f#2NcJm)$0oO91T_uTVr_ZdGq>FN*A zEA&L7cd)8=T-3kli=WnRc=yfQ?_Y7N%j=U7;6Ko}dx&z5+L9kUq*tJ}n}2_WvY@2o z9mM5Ng0+UaX~J_X@Vs{C-f$WYqePibzJ+$u*f1t#V4hd07gpyv2zmq}1NS&w`1SN! z;e{<;4j88vZ{!K9P+{*950i)0gZ!(YG5Lq_lMjzi`eCw_t~MfG-IF2*G>Ck={STBzi9@ygHfY>GLHQKAv>oIs? zla5_FAUq-A_)}zoJ2EV+{VNSsy@MgX$Qq7r{N%@W4Ly%NXt^Nnxs);%Uo3&hGq5fY z2hwNJuuqD2Cn3`0xh^DVBS9r~1nE4?Y5sGeNN!$4M8t^RJp(#*?FPow`^RRsx7E-; z-ZQemwTEAq&Mt}!g-gN%eG|+rPVx2+%KH%lkVlt1OAkc9@<1)0PoG-glxo^?cmd@G zv|U5AB!!KOQ$$%x2ZS(2*c&Q&bf8end;zznx`p^d*b4FZi@25Kb=3=g5Po5>2tQ~) ztX?&q#xOQw9`ZHeQqo^dtKYu+$}1aI)g&cNTJ^U>N2M&7SXC4e5)yIePs4{siE4!x zixSbjCiC`ChNEtj8b@btKPZ(u?pB&|JrCc3H{Mxgk z!{Z-His*F*nmq4;h3Dn02m*#r6#bs$U!~Aers?x=R-~*xbO>b({Zmc^cWAraZ&FNv zZxqGCTnf+k;4D~WTfG%?9X#M$A?zDp)%TnD?(p18EM19)QtaS3PxuzurF6uw6e;!!NC~J5AY6bO9b({gd-JSU6{zrUeYjnorz^+~3>O5$>(sQF{nI0Gu;L7C@Y6H<1{6J^Uw-a>Q19oor z49Onw1+62eB>(7<(wRJ-4BxUI2tD|a*`f3Qv^W#GiH#Cj*m}uP?p|3uL2=FS45g|eZ zfaQ$ocK|(LfCw>SB2bjV+nuo-dmKH4{iy#)`my)|eNTNB_<_$NFKSJ$Q)lRT*{0yLz# zS`lb$Fn+&N+yLG50uA?yNYgjiQ>3AziM~4?OTQ#e?Q~k;(#>BfjyJXvJ8Pl9Wi+=G zS{Mi)p~#Cy@T-f)(QJUw*H5B@C}XEF1#hOa)(YG+fjgbg>$<}*44@K(Sn;ro944bj ziZ7h@gdl=7A$cJUA%qKI?5WF0qu?k0mJ|OR;NLaH2d1Y04XjGu5U>$~QvmxCspw}9 zOUh-EV4R7PL=ln%$2pjXom-F#64?AFaAjlhVV>hS=wrYV z(^?n(8xkh7ks?SK`5#N5z9RK98#mC))UTK%7VY7t1L49Wpo6hwrS@pg{7C8vI&w}+ z-b6>bH<%AD&9RgfwPMFufw7Ta^rB#qqhQ}j ztd|nP3sDD6Y~!km2t^rilh=Yde0$CnLU{e3>kM!EgSvvx3p{B~D7615w4aW#PVgONN<_Gt`@8r%@I<*k zWSC*dCuQ&eMZ9}bpgw3|NR}egJtr_NC^w|U#pF`gu|wz!I={w=(B?W}F^Z0JvB2wu6W9Xw>!VOHsmaa!^Q4H}Z z%}{zTnck&gbmGc6h`rze^~9y#(Bg=m5rZNyeD@Bhd;23bTSo)dcDSF?m5NZaS8T-9 z2-r<|^^@V^4Pre!^x$-_xIgUo*Tdgc`uS#f_K!XvL0{&8&#os#Cf!RCzJ5)gFnefa z4S49N7re_9g`5}D@Bt)$XZy|(@0dTinm=^t*3yzW+4q;ANjtaSpPy^XSl&AK#k@Bz z-Q7&G`QPri+Xv^v+8N%@ofwgw8x(v9UR}Dg3{MaAJ96OTgTwEgX6r~^RdnaWl%u%L zkoiLr$UVa?f>mc;g0)N{xvG>nB@XZB=7M{7@8;|6(nX0Q6-W`>PXUj5ck$Hqgasel zk9ue{NE6ymL!Tyxdpq#xF?|Y$-RA>%NI~)Dm5PlDJidgY>F)gCC&FPDE{LjvY3ut2 ztAgW%<$;6a;JFa`YC~KXcv68rrV}hZqXTza_=V;xVVThpML}0;f9~Sfx!Wbn<)EVQ zu;M)OR=%F38Te+Zc`b?e-<%azHO`jqsK&gg&De7Q?kzb=<*ul60K4KEH_ zn^9-Z%Cyw7wnG7TJ+rxK40xy@kHJ`gx5E$*uR1A_3b`Oxq=vO?+))SQfjp5HJQvXs zmW1|2ols}^`nwk#! zuv(N3>ES!9(I^HMkB&p}C;=s+0r12{G8zaAO{bt#G#Cv*Ls1%hfq6JehX-{tQ5MQZ zBTx>?MR{l>%15J60V;&g$QGeuRD#B!v1lAT#Wn#wf=b~EMHwnb74V7KN>qiakqMTt zo`h;pEixkuszZ~J71>ZdWK2`gR5T4uM>Eh&^eB1^%|ef(2GockTSv3elV}c_i=IMH zqi4`OG#@>So}IqDZAIJAcJv+Kt-Khv*~p zG1`OnqEFC1_-NOD^cngb9Y6=sA@l|M5`BffM&F>r=v#CI9Yx2`ar7NJfxbsSpp)oF zbPD~1PNOsEEINnIqYLOF`Wan9m(dk;68*a$vaFi{TMC%wq+HR|>HUcExJ!hGD@S?14S87xu;-u@Cmeop5KkMdF9M;%?X< z2jK3w2kwbAxEBt@y>SrkgZtuO9D@7dP~0Df;cy&*Be53iupUR@Xn4Lf7Q@1pH~}Z( z0XPXKnZkY`|r>99Li?uEbTi8k_J$JPFs}T5QG^T!$xPE4JZ!Y{ygZR6Gq& z$20Iu{3w15&%%%62Hc37@Dq48eiF~YbMaI7Y5WYHhv(yG@pE_qUWgar#rS#r0$zfb z;urBtco}{fzk-+JSMh6j1zw4p@hbc}EKT<&ehaV0Yw%jU4zI^=<9G18cmv*uTW~Ah zgg4_Ycq`t9x8wKl4*WjeiFe@-@NV3OKg1v5kMSP77k`5H;ZN~?{2BfnAHWCkA^ZjY z5`Tri#^2z>_*;AgAH~P;ar_-VfxpK;;FI`Ad4=yvUMAMv{CoiWHDS_|icUDJCUk3>iztk?~{#d4!Y_11Tfrq=Fbp zC8;9S#6%{NNu-9<5;L*DJ&4J~N^GQ_*vS+!l}sbk$qX`+JW3uTv*0zE2GU5H$P;8X zd6LW_bIDWWY4Qx2N9L1f$#Y}@-1A#R7L(`63uFmdN?s%{k!9p%@(Ni_UL~)Q6>vwe znXDqOlQ+nl>%%xon#mJ zfb52wB_EQH$j4+4*-Jhl`^cwcKlzM&P7aWRj|1Nq+YoL?WlFCWZ@@csBuzCRzvhw~A9B(LRl zyq=HZqxl#ui~qD6F-rk z#Mkh(yqUM~b#Mj6%G>yQczbIKKb4=xPv>XwGhwBMU5W^^y{5*?Y%$jwtdmUUDyy;H zZZ#`xb%t`I(m1WW#!%}r*>0&fR+QDK&Gy>A8Duq8RoA;1Z1qN~$u^0vtFhY@<(Ar7gR**hUA57y z1Rf?!g~C>2uvPOjj8+S=n2n@Z8bvUEOskjX_{grHq$hP%{awqRv0N$-fS`( zfme;i>}oUCni#~_7;QF%akAY|qk?uBKrA%HXsb6_%-B%>Uzv2>%B+U+Nyd8GCf70m znX2w0mbK5#U@JG7%1zdCd#&1Tt^l)?TdYP!mDMoC_+Oc*T`6}Xl}O4ARyEsWlGIF6 zy{V?c=$cw#GFpu`lTDFo1>3s}DK}P_pof%chH`toQJEu<TI`jCZ-j+bGmD3N?*RH9@$bj?yI1m;@TpE{wZLrZF?_N{c{h5lAgg z>?|^=MIf~cq;`SS?nG*rNh=IhRYt3_0@MT7p#EgIqZYiltj4Cc8mmmSg0aH2+)_84ncTJBYN#;Mp`u_KxJc4m%rHc#r{UBzWiImy z7n8ZtWH!}LccqSAYcktyuGAwLnY-waY==xYnn|r)=LUMzn+!D-rpiiJn;ixQRZ>-F zwN%*4>q(tS2R!Skxog}k){07Sbn5r+0M~*q*r91gl3QJi4MwF!@Jz|yD=bsZYGF7t zu*OnlDmT=C)+%Tb1(lUG7U*6#LmkMQ#`JPEnai!lTCiM)Dm!?SvDU&o-$ULLMzpb} z##9Hsr%Yx2p-dGzDVJ?Be1(DAcPvNIQas*&d4-3}Q%Sg=vbZ z!lmnE{5b zxt^z^SS1c(_iDSj%3!tE))?&dN=p?4+)0XZ15{IHGZ#|U2%Av?(k5)i2%8yf0};wH z$!Lb?MAGW3iLt&~S;DkcPG=iMLA3?u6fhi=Y#_MQ+H2}fbv4u7K%ULcI>71%fnI_; zuz)Y^ser25P*bUfEetX%^pij!?${L2`{r`xaMn^~72EI`&|;TSVmn=IQq&qEs8%j) zh6oKQXB!oaBWf{M%M>weD{D;^z($!Wa5k`wDpjzP${=i&Lj@)k!e%Hlm?}*qGKxfL z!cn8J$ri-d2%BsHS;IDbHb~@asMs9guvysT2vlaaam@wSWq4PM1S#_cLKq4(=;sUc zR$((rK-$>Gr9iSvy=0dHfvlcw6ou4D6n0v|Tp>xaOOSGmz-(c-OPqMi>=;jfrJ4%$4uJ^(cEILa5Yq#OtCtBbi4$`Cn(ePdTm^kGF=xR z6D@3FbZjpwN^PkFpJfw(Dplxrl|k6L4QU@rZsqMTKZLfk912yMSOX>l>M_bR!9k3I z>!ndTBNT4K+iSa3wZr^yN>K%c%W$bDszksoy`9djx*g`zVTAG3P$)Bm@oi!oRfedG zNz^4n(8VM;Yli5DCSmKA+0M~zVms`TCFwCq1l%XlnbTYY^P#ESC0jaNBLO)QU={(A zX09R-pjEk|LKab>TtOiV+qmRQ^&oX*Ns8O3b~W4}d!nfmO%eD4+TeQH;6kCncA>$A zB7eKczfj4lBS#t88kPM=|eKv$ThSs#GDLQW=EY z$4!{(*)ca^%4M*tf#w4>Mw3BVB!us&!lsBFR!$YDilp%GI#q&{B?94ewh`t=8osSI z$V0@bnx)QB)Xq_v~XCYC5qYxZfGFf~Nr6+-SZm!tN|(mJYDgTbL5O*dTO5 zDC#X{i>-sC728v%(y`1y_cUQBvmKYTdI9U20aJ`{JQs3s7#6}#p%bw>x7JuC5P6$` z`~e9HCV?Leqg^qSg$z*+KZeE=ki%0EiY!P{49aXnZCQl@kFet$J1#bX*D;wm&qVU8 zEs9Yr$`lyvDp5WeQf(r6Hj{#>;7&P7(mh2IXW7Ns?*(i8Wee2Q89@%0M4yw18VKqY{%0~DvQtnVy(6)S&Y=FMCPO% zR0lZ<3$>m*t)VSGUq6nbCk?EO143iEF(&m5hcrrl4V56GNNP|(XtE}v7)BYvW#e1Mzk!W z-7e9xjA&VgILASIqh%SfvR1Kjjaa!xtgKb6Tq91_Do)lVPSzz()+J8n94B**lR3x9 zoa1E9@iOOlxxMkSjCff_yeuPLmJu(@h?ix=%QE6+840qC1X)IcEF(ddks!-RkYyyu zG7@ANaqV0r8DL+rw{%+Rs7@=%&}k(ZI;|u_rA^S)Bwj8>&EJ$V)VGql*qMSM ze4Qv{#=cH`WTdk+mI^uZVhA56UXtcMPOK!Hn{YX(xu(}h4V09-7S&Xj}m5g+jCWv>UVhA56UQ#=JoQNcxIzwivHpw7d29T^^k|4ov zW1}U%jgkB|M)KPjy~0*)oMKQzPG+dI8LKQc0$2z8)ou(s8BS>GZHj7>)ihaAZ-dJl zaMctD6^uqH9kxIwqMU3mv)9{{a9PA?t5(z+;X;$5)-c&n$y*JTMyLT-u2i;alNnTm z^n`9)Y?eyE+b8n|xXwZ#=}}afYK=9D3fQm5)kZSKFhw!LFx_M(ko=H(_)WJ|xWIKW zL(L>ZC4rv;WE(|Pt+AHCPdIM2n+g1sHaI@1nx{-utYV!J*BR9ethYfP1Pz0dOtyfg zpgK==gtN;jaK*!3Rs$BAqJ$sF6%ha_;W{6Xy28d*4V-H`n2l4xnv;z+^y;=6=*5tt9L1#D0NMxpFFf*MuLor*62fdsyjKq~1m30)P zqsB@>BtzC3>P(Ye!Q6rltzEOdtmfk^~NZlHJoI!J)r zSo=gQ^pOZb2MLh7&`rXQV6-|>x{Cz3v5pdJLU#!eTxhjbi(tD6T%ZFP(gk#97FI!f zsVAyHC%UC~3t+QxEN~nlu_b7y&MShCB0`rui|<#sNO=+ zbf3-kF>z61z7Z1_Eza>25@vA<33E3RnwZJJQ870IT&$4Y#761F zjFD<3)rBi3qFrLd92ky@y2R?^#iJAwT1g>6zu0KKXdwzoG7@BKM2R^eJt|lY>dIQh zh*=eAD(0*Ji8(8U1b!5fEFL9huM{U)JW9-70Vn2(puJo-T0A?6(d%W~$B3C*tUf`+ zQAq49fFwJ^`mf9`RA<3f6cUb7Nb1WN(Q|-{WM|+a)ku&uh>MXjJfM?W6eIQrtt+-j zA0^6-0Z8(p7||ywouom6ct${RGM(gq`Y4fKEEq`WUkZsm2#}~>R9vilRP;J%n`p_{ zsQ7lB#q%D(i5V@(m3uWoJa?f-C4TYZ*(cz{^EZIR^DThdy-D&Cu&G!VAlcW%GY4w% zShy%E&7>9yQbT4crl4v_Pestn=@Pq;FgV?C5)e)lLI&YPA!HCv6f$F9Cn_1~EKSHD zoT!8h!ikrpxsMZ(grlvo3fF^aYb20inNk9lfgTJiE8)TDjIzXW3@~FDJeE<8W0>)*T*xph;ixy~>6itjm!lNQ z7ROUiwz87yn%) z_%Wbc5I2s&Ev#&1U3E1%sXxPG;qLINFc%ynh%c_=#JpdjGJ<^X$XSMQKxzMo~Fe@3pnPJv5J{tiJ0}W3@*}}?JD8pIn z!dbh*f%7fEEMz5Z9rQnNi{SJO9tt`{fUF%*=CiUGct&s~VCM+vUy2{c;6;pnC8KX< z_zeuRk-;sDXDgJEoEj_~2~tX->iHH?wjplzM3IX(+u}N&7<2dO^>6LC<GFCF)1q<=Vr!dJ=1Ul!*67m7N&VCl<~|0@yr78%%9_-cdh`Q zwlsmYGyz(A2w>XM1Ze3-D0{Fn2yC0c##936zZ~FvRu(h-ILB_l(7sM!<0}Drgwjxb z5};owOhL)&VzLsMtVHHfiA+`^la?oZnl0nZsP}10v%wkJ2(=8cB`Ypgv%Oo?)Bs0q-!x%XR7;5=sunet5B_^{m zn9MAb%w#3Ak(kWvpUmt(6!g3S@4t@$&O?F24K9t1{WRu{X@I!{80v?^Kr33(d1M%H zpl~ac>42%{GGN*ABq-IabcaZo0c(Hgp``O;2Gl(Sr8ihLgA3%$P!3`=DXbg^(lcOD z0$OW5qoF>T!8FX^HZwk3q09npuRuw)%>v!7a5=zvIh5%P&SzyaD>t%|#+)4Bvz*Ig zb@N!=JXUuk!;EB@kqnd1+Mdtao)1TVfp;Ls0-t<1N?~e;QH*93qZtMGJAk41Lgr(I z%u0pK#|ojRz6bnD=$%3~;tHAF3YpyspQiJH$(I;0vcbg z1mtEzNhwP}I)!NjE`hdRgEF6$R8|S}IK`}IG#f$l62`NH@f-tuc5q{uo@0Oyg=x++ z2K1!mdWNC>JBH~w7AOyKVI3t*_N#<6z6 zmz6;7c;I;pO3HIQ@ca!*s^@s%Nny%!JZE8LGsDo9j%O{cU@fhHk#Ye%k?LQ;^tUk1 z7QkHLER1py^MOUsmebrK@c%-td75ixl+8eS1z_q?&CH{knMXAP z%@uAv%U##AT(O14*cO(%wy@l_h2^d-AY~%g!gALZmMgY^#EpQVxoZoH3@xl5TR_S& zz|h>a1!Nt9lIE^09L-%@ATm=7?dw)1tCh)WWwKhCtX3wgmC0&lvRav}Rwk>J$!cY? zTA8d?CaaanYGtxonXFbOtCh*x1hSTMn*g&M{N590*v()QT2lOGm@~~#CV<5^!~Bp0 zWfH@T25;O9BOnAyq3(L9wT0E%!Z2GIx2=rZR)*ioxNT+JwlZ#88Mmz*<+hb^+bY(j z+&+f((lUXSG+X-^S{lLaVR)Eb8BFne7@oe(f^jhC1?yWQI75Ng#yM^Z$|P0pUcOe% zLX_T+-d3vg@}*n9hWzYI-^$OjuX(vRZs$zMv2$F`XvgjJ3&gLlnR5>@b1vc8j@yy$ zIXfHyVO*peY<(j*jr*5#7S0V%aoo+zEe(iNMY>Un`>mNNxz{=ON*9g$!gn3FOV#<= z?_G1;Ek9Z3$iC*+=D0{D&_O-RXbf4CtG_)=0Z6_N>4XbI>sM1pgrvxT(T(B4Iw+OCOmj3{c z1hdxz``Vgg8U?Kz#(h6G1UP5%RZ5K#+K)9#=-nI6KE&GY9sxcyUbMC!2h?D#2rg8W zo|eA1aDfJNa5&oL26An8gT2yIKVs$J)Gr$&xivM~p6P929LVsER7NVmh5_Km?|6Mi z{j0R2hzn`QF%7Or{^i*Gfc>@9{`a2w_w0Y~qlfK}%0&CC{{QU{eS9erMoiRq6oTJx zgOXgl)?TI%#lW7&+RK`x6prIS-|qoOf2Rf|g#eyH@H;HmIShNBNp-lFmNr10oq(gi zHn~n4>}{6oY!>S%8Nbh952SKD+j~f()N77QL;lGk z@!$AaormCQr;K4qgB%XWfw`dPwMeCC`)jawTeituCm7u2~7;=pD%*4AbAtm>gnLR_2Kalgu!#uCoa_O9bs zYeZ{9C0~b1aUDl%igOwVb6UqFn9pENQ>X7s|77Rz8YR^SqW32n%q2R9H!fx9Vj~?g~LGSCm#0|w_f7boo#*L z>?8!PlC4}VeiEhc1#a%1uHrIk~dHoya~9RjG@O~KE{p>MoT#l zPXF#6wg(^fge#o-_0#ZOZV;cu-KUhxzC?GqEc`vZwYibguMT09&1fpvOTV$2?UivC z=-x}8vOOx#kJG;yM)$Z@w1zvy>DS(6$C|j`>9LpS8}alSEB$BJTD!u^8*r|{{<;p- zHg!!@x`xh4pYuC>9viQ0>e?Sr!5AT(ht^%`A{@c+)p~8IQr%w(@AEdrVZ^V@*XC)% zoG<~adNc$;4o3fTxia|jfrYE#j9fkZ2GW16=0SeE*Jam!4okm2mUDmn5?8eQ$@43l zeB-rEcqjb&V6V)sU&qgHDhYUVyzP-rWv`#UV8#VbBOT8{ys~4#I=j3X#Gg1dqVXi|p^Ny{rp8ycnwDespMr;%6* zGPFIqbV!KP#_04~_BWUp!$ce=oeuySOpnv&k=f8(19q?EzoK?ARSItlK;y z^XF>=0^b?EY*w%3HFMfBhrc*+^INgs-gOQCW^=+Tn0{l!Sv_zG0(uz=JqFI)x47dh zZ?ES94;zuAkwckHMdoc`8A zud}-ix0jDP_xxA3LAUR{nmhaL!msXmmzQgsc&u$AlUBl~Q8D&%nNd5=QuciAjy?B= z{N(HR>O&g;@Am<4V(?kLKK?-`j+LEwr8LOYe;Q=s@O1mz;WI z3*LS&`AWmSZolt|YHZvey5!E|6B6ex^gVGP!v5>^N#~Q-mVPi8t;=0EcFmwb-HMK# z{;)OoXqw0OzcdVI*DmOp7qKKObeeK@ee$9OVZ(K7D81geUE8=to1%1q7_U&M5aJ=~ zX|>Y67R?EwodSJgDYw-<*eMhfX@h6C?KZ6|bV_$07zCVlCleJGbcyt`H{RUs}~H;VM+d4iQ~&Ydepf$*ET<)vYM-~A)V zGk=r&*h2R9#`q0#F7s^=|!U%%|e^VQU=c)h?U$My%x{* zQSW`}TuRYiMW2fsHh525dv3tzKli@%Lcj4Tg*V?E_3Edwi3vs*o9zw#*Bjp6y-$(k zNW1d!#qWZ?I#m9y>*_nF{mRZmQ{G<#Kq}S^7Q7}2N-TwiN{-Z&<7VrA7 z?)-pXbNoYAyf|%w_R^}g&-Qub_WdQMG5^M@O!DWz~XG{iLr3S4_Y5_LThv z-~D=d`J8|SD`r=2+B<1RS??p=lTLb~#TS?E*&SZ_^2^nImwlNSw%dJ6ao-PzT~H5< zUmCVHBw@{!j3)-4neF-h%Qc0Dx0@bqE)AcW{qwTT6$4(*3(&a)`L0-dVNrj-^T{uj z`<50fj4Qgw<bi?k%D+Mp)ynAo;jN1B~4Solfx`y=PiWZid z;@;2ds7e~`7<=c9O0~;dUpI~}y1sS5gwBmq`R{Ih@NUDB`x_5Feq?nw>$s%PcHVG# zJy5$z`Q-jhnyEfd{wNO8HQL5EwT-K&_anaXWo_e&4PIlvth;WqzSeu>EZ^1<&pAGC zw*L3`U(V0!useZ+4Zl4cSEP86e{>1aWe!Wrj zeAt$i!#^#%e)s5s0RzUYjV&JFibsFYJ)6A3t8U`^_dDkLncD7tIpmD@ z7)|b_vY8v!b^Ww|T%Yg{jLjXN>El`c`tJn+fArdaq|?p(x6MQJs(VdcZl9~F=`ixv zu3z%^?Ygi>dsm}#eX9GCe%(fV+a168OT#I$dF*d3KYUtr&6u$-zhLWT64KGJ@W>69 z1+%ulxOaVA*x4Cp*GxS#WhM9J#6cf^9sA6w)Q)RnCi+i25%bgG0RHTnH2%{uQSs&x z0UgS=saMVa=G%fn!wv=%zEyXkW8&QB?JHJ)y%M6rJje}fLR3&2l%aGPNRD%J4hS^U zZhTAU#sVp?^udLrbUs>dI-*^C)J5>3FQljNzKPCD>p_t!A634wq88rOlLCX<=WhbT z-$fakp#CY!^w#zgqDZ&)C^E!S0Vy&}#WX|C8iSxI93-Q5!*hdA&3#mq?98Buo+SW?6H`offxxu^U$r5#g|nalpL zcdd-+rfpnHV@Geku^DpD2H$?;-t*sjFzVX-ua!LZ`?=2|_H>92X|8|ce|q9 z+s2(-=Y9BC%FAm$IIqp5s`liEXj8R=Rwl0;FegFGK+3H(5w+5+$kM{PNv24^MvAZX z+ajr}Qcndhjer9WjW8CD_^Jb6{4jaM@QrdoCr2`@BUj- zVaTW-yn})lzgsdo<>x&kUcGW+{j3*WN!EnL{2H9o_G!X4WBFGxmEVopl{%{=^Nsv% z|G4+*uI8D_?JpgB>DpIr(e}y?-={A4c;n*PMIR2H@#H6qd`=X+b8=Sd_nHkq`|tlq zuiN|V&!7MEiL4KcpV#j>dgkDa^*=u5viy@L2V6{TjBlCNb!YtV2Pb`WXkGTg?oWJj z9z9*X?!tnLs=QGB4@bY)bzsKvL{CTS&}WK1?G{&|>hjo3Yt}GjbI91Fhj6qX!cmKOs`4lEKXktR zKa!urq^UvMeaBnY;?isZ2T=Vw@S7zb*;p=*ybtk%u*6Nhg} z$T1guq;pTKy>sy3=XuNh-(7v|cxK;0TlRjwVCm_MUu%#3yma76#TPf;DvWz4vh-ks zVQ_OsL8hnQwyfjNFVl`0Zm-z<&HF!WUGM&C?snS%zr=N$=g!~w)W#9HJ#)ObL^b@_ zA+f?TbYJwY%;#U(`BwKo6uomw`z<&S`s?hMm%X#*gt~6#k?7QgZ*HsHH_pHN>ro!B z6p(I%URt>Qz=dSKen`NA-xJPndOLl_q)?ACWJs7|zBlkCRhI8BXxP0@+^ON;<(^fX zZRi8*#J%2xLcktDf0gc&{~H;Pm(o?dKGq4ri3#GIV)0+aS#4Ljf-mOXd#K?l13O$f z8^WbJo!_8gT2C4WeQ4ZQXbEhbeTkm%(A+Am`1H%EkKcWDcly++@6JDdzU$ti&E0lw ze(w?7oHj9`ju6n|5A% zbME|r`B~E+*^=?k33^jv&w_XCBYv#7piMeakumhnojn1AC!b%LoOW#zx8m)=yLNbQ z8h!T8x2r-MkM+!1Rro>hg1Wa>)%ZIKo@v_InDth3OXZBUT~>dtY#V<0txZ4cI*m#W z<##)5>EF)_9&)$*;Z0x+`r{LRoIYcR_HEOg%scbFcl$qEP@-$%tq{=6 zaN&}k$Npc*ps;fm_`v1Xm5puGLBuPwu0-eVbg`9(Q^59%v2N^AZTo&FI02L^^16<^ zSNg7bpWdDR_S`>?f4KO)J>~V<3a9Gsy3yK#m7xtG+-SH~YlZvs2DmS8;56_wjFGDX zpR9pBE9?)0Yr1BxzPWFMbS;2hpLuX5uAg2<7aOXpp8jym;~N`ly=U3yx8_@ej^3Yt zb;@JIW^T(H@I{|#UoW;7oBrW(>9>!M&s+S>^$E8+uYQ@_J$QU>*9FhKcIfrzCr4j@ zr0$z;$#)c~GX@O$@R?<#@_KC1k=6y?dp4|Hv+v`VE}ZGUSMA#Q%r__ItsFXXQ_QQQ zCi{$yaPx4V-#=?a$`d(eMf{ybIb&XFZo=7cUY_1=9;L1cCjcsjInJj4^%vy+;*#Qn zZd0Q5Yi}LVxyd^!1WqHng+k{^b9cA|5DRZ2+;u~W9a_Ux_?hlgC)ksLXH>gF51&%Q7%A~E>6(qW%; z-+A1-Px$q(4IP`0{x)`P@wUgFey`B`>FA+jhd=i8&};8qSn+a8=+DZoB;k2}=VKEZ zhgOtdR~2b~e0f3kk&8>+R6o?_Wci<({)XF|mw#Jl>{NJl>P;UH*GqG<)*l_c^uB6M zl&$x&@z>pLc6-B|M?8yP$l7^;7C-hPz+Eno?_7!_HG@svVsNc?U{|^E4+b#eA literal 0 HcmV?d00001 diff --git a/upload/includes/classes/captcha/index.php b/upload/includes/classes/captcha/index.php new file mode 100644 index 00000000..403f2e18 --- /dev/null +++ b/upload/includes/classes/captcha/index.php @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/upload/includes/classes/captcha_simple.img.php b/upload/includes/classes/captcha_simple.img.php new file mode 100644 index 00000000..7538bf34 --- /dev/null +++ b/upload/includes/classes/captcha_simple.img.php @@ -0,0 +1,86 @@ +generateCode($characters); + /* font size will be 75% of the image height */ + $font_size = $height * 0.75; + $image = @imagecreate($width, $height) or die('Cannot initialize new GD image stream'); + /* set the colours */ + $background_color = imagecolorallocate($image, 255, 255, 255); + $text_color = imagecolorallocate($image, 0, 0, 0); + $noise_color = imagecolorallocate($image, 226, 82, 207); + $noise_color1 = imagecolorallocate($image, 64, 179, 255); + $noise_color2 = imagecolorallocate($image, 255 ,204, 190); + + /* generate random dots in background */ + for( $i=0; $i<($width*$height)/250; $i++ ) { + imageellipse($image, mt_rand(0,$width), mt_rand(0,$height), mt_rand(0,$width), mt_rand(0,$height), $noise_color2); + } + /* generate random dots in background */ + for( $i=0; $i<($width*$height)/150; $i++ ) { + imagedashedline($image, mt_rand(0,$width), mt_rand(0,$height), mt_rand(0,$width), mt_rand(0,$height), $noise_color1); + } + /* generate random lines in background */ + for( $i=0; $i<($width*$height)/150; $i++ ) { + + imagedashedline($image, mt_rand(0,$width), mt_rand(0,$height), mt_rand(0,$width), mt_rand(0,$height), $noise_color); + } + /* create textbox and add text */ + $textbox = imagettfbbox($font_size, 0, $this->font, $code) or die('Error in imagettfbbox function'); + $x = ($width - $textbox[4])/2; + $y = ($height - $textbox[5])/2; + imagettftext($image, $font_size, 0, $x, $y, $text_color, $this->font , $code) or die('Error in imagettftext function'); + + /* output captcha image to browser */ + imagejpeg($image); + imagedestroy($image); + $_SESSION['security_code'] = $code; + } + +} + +$width = isset($_GET['width']) ? $_GET['width'] : '120'; +$height = isset($_GET['height']) ? $_GET['height'] : '40'; +$characters = isset($_GET['characters']) && $_GET['characters'] > 1 ? $_GET['characters'] : '6'; + +$captcha = new CaptchaSecurityImages($width,$height,$characters); +?> \ No newline at end of file diff --git a/upload/includes/classes/category.class.php b/upload/includes/classes/category.class.php new file mode 100644 index 00000000..9b69d94a --- /dev/null +++ b/upload/includes/classes/category.class.php @@ -0,0 +1,866 @@ + + * This class is used to create + * and manage categories + * its an abstract class + * it will be used in custom plugins or built-in sections + * sections like videos, groups , channels etc use this category system + * + * this abstract class has some rules + * each section's category column should be named as "category" + * each section's category table must have same columns as video_categories + */ + + + +abstract class CBCategory +{ + var $cat_tbl = ''; //Name of category Table + var $section_tbl = ''; //Name of table that related to $cat_tbl + var $use_sub_cats = FALSE; // Set to true if you using Sub-Cateogires + var $cat_thumb_height = '125'; + var $cat_thumb_width = '125'; + var $default_thumb = 'no_thumb.jpg'; + + /** + * Function used to check weather category exists or not + */ + function category_exists($cid) + { + global $db; + return $this->get_category($cid); + } + + + /** + * Function used to get category details + */ + function get_category($cid) + { + global $db; + $results = $db->select(tbl($this->cat_tbl),"*"," category_id='$cid'"); + if($db->num_rows>0) + { + return $results[0]; + }else{ + return false; + } + } + + + /** + * Function used to get category by name + */ + function get_cat_by_name($name) + { + global $db; + $results = $db->select(tbl($this->cat_tbl),"*"," category_name='$name' "); + if($db->num_rows>0) + { + return $results[0]; + }else{ + return false; + } + } + + + /** + * Function used to add new category + */ + function add_category($array) + { + global $db; + $name = ($array['name']); + $desc = ($array['desc']); + $default = mysql_clean($array['default']); + + $flds = array("category_name","category_desc","date_added"); + $values = array($name,$desc,now()); + + if(!empty($this->use_sub_cats)) + { + $parent_id = mysql_clean($array['parent_cat']); + $flds[] = "parent_id"; + $values[] = $parent_id; + } + + if($this->get_cat_by_name($name)) + { + e(lang("add_cat_erro")); + + }elseif(empty($name)) + { + e(lang("add_cat_no_name_err")); + }else{ + $cid = $db->insert(tbl($this->cat_tbl),$flds,$values); + + $cid = $db->insert_id(); + if($default=='yes' || !$this->get_default_category()) + $this->make_default_category($cid); + e(lang("cat_add_msg"),'m'); + + //Uploading thumb + if(!empty($_FILES['cat_thumb']['tmp_name'])) + $this->add_category_thumb($cid,$_FILES['cat_thumb']); + } + + } + + + + /** + * Function used to make category as default + */ + function make_default_category($cid) + { + global $db; + if($this->category_exists($cid)) + { + $db->update(tbl($this->cat_tbl),array("isdefault"),array("no")," isdefault='yes' "); + $db->update(tbl($this->cat_tbl),array("isdefault"),array("yes")," category_id='$cid' "); + e(lang("cat_set_default_ok"),'m'); + }else + e(lang("cat_exist_error")); + } + + + /** + * Function used to get list of categories + */ + function get_categories() + { + global $db; + $select = $db->select(tbl($this->cat_tbl),"*",NULL,NULL," category_order ASC"); + return $select; + } + + function getCbCategories($params) + { + global $db; + $params['use_sub_cats'] = $params['use_sub_cats'] ? $params['use_sub_cats'] : "yes"; + if($this->use_sub_cats && config('use_subs') == 1 && $params['use_sub_cats'] == "yes" && + ($params['type'] == "videos" || $params['type'] == "video" || $params['type'] == "v")) + { + $cond = " parent_id = 0"; + $subCategories = TRUE; + } else + $cond = NULL; + $orderby = $params['orderby'] = $params['orderby'] ? $params['orderby'] : "category_order"; + $order = $params['order'] = $params['order'] ? $params['order'] : "ASC"; + $limit = $params['limit'] = $params['limit'] ? (is_numeric($params['limit']) ? $params['limit'] : NULL) : NULL; + + + $categories = $db->select(tbl($this->cat_tbl),"*",$cond,$limit," $orderby $order"); + + $finalArray = array(); + if($params['with_all']) + $finalArray[] = array("category_id"=>"all","category_name"=>lang("cat_all")); + + foreach($categories as $cat) + { + $finalArray[$cat['category_id']] = $cat; + if($subCategories === TRUE && $this->is_parent($cat['category_id'])) + $finalArray[$cat['category_id']]['children'] = $this->getCbSubCategories($cat['category_id'],$params); + } + + return $finalArray; + } + + function getCbSubCategories($category_id,$params) + { + global $db; + if(empty($category_id)) + return false; + { + $orderby = $params['orderby']; $order = $params['order']; + $finalOrder = $orderby.' '.$order; + if($params['limit_sub']) + { + if(is_numeric($params['limit_sub'])) + $limit = $params['limit_sub']; + elseif($params['limit_sub'] == "parent") + $limit = $params['limit']; + else + $limit = NULL; + } + if($params['sub_order']) + $finalOrder = $params['sub_order']; + $subCats = $db->select(tbl($this->cat_tbl),"*"," parent_id = '$category_id'",$limit," $finalOrder"); + + if($subCats) + { + $subArray = array(); + foreach($subCats as $subCat) + { + $subArray[$subCat['category_id']] = $subCat; + if($this->is_parent($subCat['category_id'])) + { + $subArray[$subCat['category_id']]['children'] = $this->getCbSubCategories($subCat['category_id'],$params); + } + } + return $subArray; + } + } + } + + function displayListCategories($catArray,$params) + { + $html = ''; + foreach($catArray as $catID=>$cat) + { + if($_GET['cat'] == $cat['category_id'] || (empty($_GET['cat']) && $cat['category_id'] == 'all')) + $selected = " selected "; + else + $selected = ""; + if($params['class']) + $class = $params['class']; + $html .= "

  • "category","data"=>$cat,"type"=>$params['type']))."'>".$cat['category_name'].""; + if($cat['children']) + { + $html .= "
      "; + $html .= $this->displayListCategories($cat['children'],$params); + $html .= "
    "; + } + $html .= "
  • "; + } + + return $html; + } + + function displayOptions($catArray,$params,$spacer="") + { + foreach($catArray as $catID=>$cat) + { + if($_GET['cat'] == $cat['category_id'] || ($params['selected'] && $params['selected'] == $cat['category_id'])) + $selected = " selected=selected"; + else + $selected = ""; + if($params['value'] == "link") + $value = cblink(array("name"=>"category","data"=>$cat,"type"=>$params['type'])); else $value = $cat['category_id']; + $html .= ""; + if($cat['children']) + { + $html .= $this->displayOptions($cat['children'],$params,$spacer.($params['spacer']?$params['spacer']:"- ")); + } + } + + return $html; + } + + function displayDropdownCategory($catArray,$params) + { + $html = ''; + if($params['name']) $name = $params['name']; else $name = "cat"; + if($params['id']) $id = $params['id']; else $id = "cat"; + if($params['class']) $class = $params['class']; else $class = "cbSelectCat"; + + $html .= ""; + return $html; + } + + function displayCollpasedListCateogry($catArray,$params) + { + $html = ''; + + foreach($catArray as $catID=>$cat) + { + if($_GET['cat'] == $catID || (empty($_GET['cat']) && $cat['category_id'] == 'all')) + $selected = "selected"; + else + $selected = ""; + + + + if($params['class']) + $class = $params['class']; + $html .= "
  •  "; + + $html .= "".$cat['category_name'].""; + + + + if($cat['children']) + { + + + $html .= "
      "; + $html .= $this->displayCollpasedListCateogry($cat['children'],$params); + $html .= "
    "; + } + $html .= "
  • "; + } + + return $html; + } + + function displayOutput($CatArray,$params) + { + $output = $params['output']; + if(is_array($CatArray)) + { + switch($output) + { + case "list": case "li": + default: + { + if($params['list_style'] == "" || $params['list_style'] == "simple") + $html = $this->displayListCategories($CatArray,$params); + if($params['list_style'] == "collapsed") + $html = $this->displayCollpasedListCateogry($CatArray,$params); + } + break; + + case "dropdown": case "option": + { + $html = $this->displayDropdownCategory($CatArray,$params); + } + break; + + case "checkbox": case "check_box": + { + + } + break; + } + return $html; + } else + return false; + } + + function cbCategories($params=NULL) + { + $p = $params; + $p['type'] = $p['type'] ? $p['type'] : 'video'; + $p['echo'] = $p['echo'] ? $p['echo'] : FALSE; + $p['with_all'] = $p['with_all'] ? $p['with_all'] : FALSE; + + { + $categories = $this->getCbCategories($p); + + if($categories) + { + if($p['echo'] == TRUE) + { + $html = $this->displayOutput($categories,$p); + if($p['assign']) + assign($p['assign'],$html); + else + echo $html; + } else { + if($p['assign']) + assign($p['assign'],$categories); + else + return $categories; + } + } else + return false; + } + } + + /** + * Function used to list of categories + */ + function cb_list_categories($type,$with_all=false) + { + global $db; + if($type == 'video' || $type == 'vid' || $type == 'v') + $cond = " parent_id = 0"; + else + $cond = NULL; + + //Getting List of categories + $cats = $db->select(tbl($this->cat_tbl),"*",$cond,NULL," category_order ASC"); + + if($with_all) + array_unshift($cats,array("category_id"=>"all","category_name"=>"All")); + + $html = ''; + for($i=0;$i"; + $html .= "".$cats[$i]['category_name'].""; + if($this->is_parent($cats[$i]['category_id'])) + { + $html .= $this->cb_list_subs($cats[$i]['category_id'],$type); + } + $html .= ""; + } + return $html; + + } + + function cb_list_subs($cid,$type) + { + global $db; + $html = ""; + $query = mysql_query("SELECT * FROM ".tbl($this->cat_tbl)." WHERE parent_id = $cid"); + + if(!empty($query)) + { + + $html .= "
      "; + while($result = mysql_fetch_array($query)) + { + if($_GET['cat'] == $result['category_id']) + $selected = "selected"; + else + $selected = ""; + + $html .= "
    • "; + $html .= "".$result['category_name'].""; + if($this->is_parent($result['category_id'])) + { + $html .= $this->cb_list_subs($result['category_id'],$type); + } + $html .= "
    • "; + } + + $html .= "
    "; + } + + return $html; + } + + + /** + * Function used to count total number of categoies + */ + function total_categories() + { + global $db; + return $db->count(tbl($this->cat_tbl),"*"); + } + + + /** + * Function used to delete category + */ + function delete_category($cid) + { + global $db; + $cat_details = $this->category_exists($cid); + if(!$cat_details) + e(lang("cat_exist_error")); + + //CHecking if category is default or not + elseif($cat_details['isdefault'] == 'yes') + e(lang("cat_default_err")); + else{ + + $pcat = $this->has_parent($cid,true); + + //Checking if category is both parent and child + if($pcat && $this->is_parent($cid)) + { + $to = $pcat[0]['category_id']; + $has_child = TRUE; + } + elseif($pcat && !$this->is_parent($cid)) //Checking if category is only child + { + $to = $pcat[0]['category_id']; + $has_child = TRUE; + } + elseif(!$pcat && $this->is_parent($cid)) //Checking if category is only parent + { + $to = NULL; + $has_child = NULL; + $db->update(tbl($this->cat_tbl),array('parent_id'),array('0')," parent_id = $cid"); + } + + //Moving all contents to parent OR default category + $this->change_category($cid,$to,$has_child); + + //Removing Category + $db->execute("DELETE FROM ".tbl($this->cat_tbl)." WHERE category_id='$cid'"); + e(lang("class_cat_del_msg"),'m'); + } + + } + + /** + * Functon used to get dafault categry + */ + function get_default_category() + { + global $db; + $results = $db->select(tbl($this->cat_tbl),"*"," isdefault='yes' "); + if($db->num_rows>0) + return $results[0]; + else + return false; + } + + /** + * Function used to get default category ID + */ + function get_default_cid() + { + $default = $this->get_default_category(); + return $default['category_id']; + } + + + + /** + * Function used to move contents from one section to other + */ + function change_category($from,$to=NULL,$has_child=NULL,$check_multiple=false) + { + global $db; + + if(!$this->category_exists($to)) + $to = $this->get_default_cid(); + + if($has_child) { + $db->update(tbl($this->cat_tbl),array('parent_id'),array($to)," parent_id = $from"); + } + + $db->execute("UPDATE ".tbl($this->section_tbl)." SET category = replace(category,'#".$from."#','#".$to."#') WHERE category LIKE '%#".$from."#%'"); + + $db->execute("UPDATE ".tbl($this->section_tbl)." SET category = replace(category,'#".$to."# #".$to."#','#".$to."#') WHERE category LIKE '%#".$to."#%'"); + } + + + /** + * Function used to edit category + * submit values and it will update category + */ + function update_category($array) + { + global $db; + $name = ($array['name']); + $desc = ($array['desc']); + $default = mysql_clean($array['default']); + $pcat = mysql_clean($array['parent_cat']); + + $flds = array("category_name","category_desc"); + $values = array($name,$desc); + + $cur_name = mysql_clean($array['cur_name']); + $cid = mysql_clean($array['cid']); + + if(!empty($this->use_sub_cats)) + { + $flds[] = "parent_id"; + $values[] = $pcat; + } + + if($this->get_cat_by_name($name) && $cur_name !=$name ) + { + e(lang("add_cat_erro")); + + }elseif(empty($name)){ + e(lang("add_cat_no_name_err")); + } elseif($pcat == $cid){ + e(lang("You can not make category parent of itself")); + }else{ + $db->update(tbl($this->cat_tbl),$flds,$values," category_id='$cid' "); + + if($default=='yes' || !$this->get_default_category()) + $this->make_default_category($cid); + e(lang("cat_update_msg"),'m'); + + //Uploading thumb + if(!empty($_FILES['cat_thumb']['tmp_name'])) + $this->add_category_thumb($cid,$_FILES['cat_thumb']); + } + } + + + /** + * Function used to add category thumbnail + * @param $Cid and Array + */ + function add_category_thumb($cid,$file) + { + global $imgObj; + if($this->category_exists($cid)) + { + //Checking for category thumbs direcotry + if(isset($this->thumb_dir)) + $dir = $this->thumb_dir; + else + $dir = $this->section_tbl; + + //Checking File Extension + $ext = strtolower(getext($file['name'])); + + if($ext=='jpg' || $ext =='png' || $ext=='gif') + { + $dir_path = CAT_THUMB_DIR.'/'.$dir; + if(!is_dir($dir_path)) + @mkdir($dir_path,0777); + + if(is_dir($dir_path)) + { + $path = $dir_path.'/'.$cid.'.'.$ext; + + //Removing File if already exists + if(file_exists($path)) + unlink($path); + move_uploaded_file($file['tmp_name'],$path); + + //Now checking if file is really an image + if(!@$imgObj->ValidateImage($path,$ext)) + { + e(lang("pic_upload_vali_err")); + unlink($path); + }else + { + $imgObj->CreateThumb($path,$path,$this->cat_thumb_width,$ext,$this->cat_thumb_height,true); + } + }else{ + e(lang("cat_dir_make_err")); + } + }else{ + e(lang("cat_img_error")); + } + } + } + + + /** + * Function used to get category thumb + */ + function get_cat_thumb($cat_details) + { + //Checking for category thumbs direcotry + if(isset($this->thumb_dir)) + $dir = $this->thumb_dir; + else + $dir = $this->section_tbl; + + $cid = $cat_details['category_id']; + $path = CAT_THUMB_DIR.'/'.$dir.'/'.$cid.'.'; + $exts = array('jpg','png','gif'); + + $file_exists = false; + foreach($exts as $ext) + { + $cur_ext = $ext; + if(file_exists($path.$ext)) + { + $file_exists = true; + break; + } + } + + if($file_exists) + return CAT_THUMB_URL.'/'.$dir.'/'.$cid.'.'.$ext; + else + return $this->default_thumb(); + } + function get_category_thumb($i) + { + return $this->get_cat_thumb($i); + } + + /** + * function used to return default thumb + */ + function default_thumb() + { + if(empty($this->default_thumb)) + $this->default_thumb = 'no_thumb.jpg'; + return CAT_THUMB_URL.'/'.$this->default_thumb; + } + + /** + * Function used to update category id + */ + function update_cat_order($id,$order) + { + global $db; + $cat = $this->category_exists($id); + if(!$cat) + e(lang("cat_exist_error")); + else + { + if(!is_numeric($order) || $order <1) + $order = 1; + $db->update(tbl($this->cat_tbl),array("category_order"),array($order)," category_id='".$id."'"); + } + } + + /** + * Function used get parent cateogry + */ + function get_parent_category($pid) + { + global $db; + $result = $db->select(tbl($this->cat_tbl),"*"," category_id = $pid"); + if($db->num_rows>0) + return $result; + else + return false; + } + + /** + * Function used to check category is parent or not + */ + function is_parent($cid) + { + global $db; + $result = $db->count(tbl($this->cat_tbl),"category_id"," parent_id = $cid"); + + if($result > 0) + return true; + else + return false; + } + + /** + * Function used to check wheather category has parent or not + */ + function has_parent($cid,$return_parent=false) + { + global $db; + $result = $db->select(tbl($this->cat_tbl),"*"," category_id = $cid AND parent_id != 0"); + + if($result > 0) { + if($return_parent) + { + $pid = $this->get_parent_category($result[0]['parent_id']); + return $pid; + } else { + return true; + } + } else { + return false; + } + } + + /** + * Function used to get parent categories + */ + function get_parents($count=false) { + global $db; + + if($count) { + $result = $db->count(tbl($this->cat_tbl),"*"," parent_id = 0"); + } else { + $result = $db->select(tbl($this->cat_tbl),"*"," parent_id = 0"); + } + + return $result; + } + + /** + * Function used to list categories in admin area + * with indention + */ + function admin_area_cats($selected) + { + global $db; + $html = ''; + $pcats = $this->get_parents(); + + if(!empty($pcats)) + { + foreach($pcats as $key=>$pcat) + { + if($selected == $pcat['category_id']) + $select = "selected='selected'"; + else + $select = NULL; + + $html .= ""; + if($this->is_parent($pcat['category_id'])) + $html .= $this->get_sub_subs($pcat['category_id'],$selected); + } + + return $html; + } + } + + /** + * Function used to get child categories + */ + function get_sub_categories($cid) + { + global $db; + $result = $db->select(tbl($this->cat_tbl),"*"," parent_id = $cid"); + //echo $db->db_query; + if($result > 0){ + return $result; + }else{ + return false; + } + } + + /** + * Function used to get child child categories + */ + function get_sub_subs($cid,$selected,$space="  - ") + { + global $db; + $html = ''; + $subs = $this->get_sub_categories($cid); + if(!empty($subs)) + { + foreach($subs as $sub_key=>$sub) + { + if($selected == $sub['category_id']) + $select = "selected='selected'"; + else + $select = NULL; + + $html .= ""; + if($this->is_parent($sub['category_id'])) + $html .= $this->get_sub_subs($sub['category_id'],$selected,$space." - "); + } + return $html; + } + } + + function get_category_field($cid,$field) + { + global $db; + $result = $db->select(tbl($this->cat_tbl),"$field"," category_id = $cid"); + //echo $db->db_query; + if($result) + return $result[0][$field]; + else + return false; + } + + + + +} + +?> \ No newline at end of file diff --git a/upload/includes/classes/cbemail.class.php b/upload/includes/classes/cbemail.class.php new file mode 100644 index 00000000..2a4f8233 --- /dev/null +++ b/upload/includes/classes/cbemail.class.php @@ -0,0 +1,382 @@ +select(tbl($this->db_tpl),"*"," email_template_code='".$code."' OR email_template_id='$code' "); + if($db->num_rows>0) + { + $result[0]['email_template'] = stripslashes($result[0]['email_template']); + $result[0]['email_template_subject'] = stripslashes($result[0]['email_template_subject']); + return $result[0]; + }else + return false; + } + function get_template($code) + { + return $this->get_email_template($code); + } + + /** + * Check template exists or not + */ + function template_exists($code) + { + return $this->get_email_template($code); + } + + + /** + * Function used to replace content + * of email template with variables + * it can either be email subject or message content + * @param : Content STRING + * @param : array ARRAY => array({somevar}=>$isvar) + */ + function replace($content,$array) + { + //Common Varialbs + + $com_array = array + ('{website_title}' => TITLE, + '{baseurl}' => BASEURL, + '{website_url}' => BASEURL, + '{date_format}' => cbdate(DATE_FORMAT), + '{date}' => cbdate(), + '{username}' => username(), + '{userid}' => userid(), + '{date_year}' => cbdate("Y"), + '{date_month}' => cbdate("m"), + '{date_day}' => cbdate("d"), + '{signup_link}' => cblink(array('name'=>'signup')), + '{login_link}' => cblink(array('name'=>'login')), + ); + + if(is_array($array) && count($array)>0) + $array = array_merge($com_array,$array); + else + $array = $com_array; + foreach($array as $key => $val) + { + $var_array[] = '/'.$key.'/'; + $val_array[] = $val; + } + return preg_replace($var_array,$val_array,$content); + } + + /** + * Function used to get all templates + */ + function get_templates() + { + global $db; + $results = $db->select(tbl($this->db_tpl),"*",NULL,NULL," email_template_name DESC"); + if($db->num_rows>0) + return $results; + else + return false; + } + + + /** + * Function used to update email template + */ + function update_template($params) + { + global $db; + $id = mysql_clean($params['id']); + $subj = mysql_clean($params['subj']); + $msg = mysql_real_escape_string($params['msg']); + + if(!$this->template_exists($id)) + e(lang("email_template_not_exist")); + elseif(empty($subj)) + e(lang("email_subj_empty")); + elseif(empty($msg)) + e(lang("email_msg_empty")); + else + { + $db->update(tbl($this->db_tpl),array("email_template_subject","email_template"),array($subj,'|no_mc|'.$msg), + " email_template_id='$id'"); + e(lang("email_tpl_has_updated"),"m"); + } + + } + + /** + * Mass Email + */ + function add_mass_email($array=NULL) + { + if(!$array) + $array = $_POST; + + global $userquery,$db; + + $from = $array['from']; unset($array['from']); + $loop = $array['loop_size']; + $subj = $array['subject']; unset($array['subject']); + $msg = $array['message']; unset($array['message']); + $users = $array['users']; unset($array['users']); + $method = $array['method']; unset($array['method']); + + $settings = $array; + + unset($array); + + if(!isValidEmail($from)) + e(lang("Please enter valid email in 'from' field")); + if(!is_numeric($loop) || $loop <1 || $loop>10000) + e(lang("Please enter valid numeric value from 1 to 10000 for loop size")); + if(!$subj) + e(lang("Please enter a valid subject for your email")); + if(!$msg) + e(lang("Email body was empty, please enter your email content")); + + if(!error()) + { + $db->insert(tbl('mass_emails'),array('email_subj','email_from','email_msg','configs','users','method','status','date_added'), + array($subj,$from,'|no_mc|'.$msg,'|no_mc|'.json_encode($settings),$users,$method,'pending',now())); + + e("Mass email has been added","m"); + return true; + }else + return false; + } + + + /** + * function used to get email + */ + function get_mass_emails() + { + global $db; + $results = $db->select(tbl("mass_emails"),"*"); + + if($db->num_rows>0) + { + return $results; + }else + return false; + } + + /** + * function used to delete, send emails + */ + function action($id,$action) + { + global $db; + $email = $this->email_exists($id); + if(!$email) + { + e(lang("Email does not exist")); + return false; + } + + switch($action) + { + case "delete": + { + $db->Execute("DELETE FROM ".tbl('mass_emails')." WHERE id='$id'"); + e(lang("Email has been deleted"),"m"); + } + break; + + case "send_email": + { + $this->send_emails($email); + } + break; + } + } + + /** + * functionn used to check email exists or not + */ + function get_email($id) + { + global $db; + $result = $db->select(tbl("mass_emails"),"*","id='$id'"); + if($db->num_rows>0) + { + return $result[0]; + }else + { + return false; + } + } + function email_exists($id){ return $this->get_email($id); } + + + + /** + * function send emails + */ + function send_emails($id) + { + global $db,$userquery,$cbemail; + if(!is_array($id)) + { + $email = $this->get_email($id); + }else + { + $email = $id; + } + + if($email['status']=='completed') + return false; + $settings = json_decode($email['configs'],true); + $users = $email['users']; + $total = $email['total']; + + //Creating limit + $start_index = $email['start_index']; + $limit = $start_index.','.$settings['loop_size']; + + //Creating condition + $condition = ""; + + //Levels + $level_query = ""; + $levels = $settings['level']; + if($levels) + { + foreach($levels as $level) + { + if($level_query) + $level_query .= " OR "; + $level_query .= " level='$level' "; + } + + if($condition) + $condition .= " AND "; + $condition = $level_query = " ( ".$level_query.") "; + } + + //Categories + $cats_query = ""; + $cats = $settings['cat']; + if($cats) + { + foreach($cats as $cat) + { + if($cats_query) + $cats_query .= " OR "; + $cats_query .= " category='$cat' "; + } + + $cats_query = " ( ".$cats_query.") "; + if($condition) + $condition .= " AND "; + $condition .= $cats_query; + } + + + //Ative users + if($settings['active']!='any') + { + if($condition) + $condition .= " AND "; + + if($settings['active']=='yes') + $condition .= " usr_status = 'Ok' "; + if($settings['active']=='no') + $condition .= " usr_status = 'ToActivate' "; + } + + //Banned users + if($settings['ban']!='any') + { + if($condition) + $condition .= " AND "; + + if($settings['ban']=='yes') + $condition .= " ban_status = 'yes' "; + if($settings['ban']=='no') + $condition .= " ban_status = 'no' "; + } + + + + if(!$users) + { + $users = $db->select(tbl("users"),"*",$condition,$limit," userid ASC "); + + if(!$total) + { + $total = $db->count(tbl("users"),"userid",$condition); + } + + $sent = $email['sent']; + $send_msg = array(); + foreach($users as $user) + { + $var = array + ('{username}' => $user['username'], + '{userid}' => $user['userid'], + '{email}' => $user['email'], + '{datejoined}' => $user['doj'], + '{avcode}' => $user['avcode'], + '{avlink}' => BASEURL.'/activation.php?av_username='.$user['username'].'&avcode='.$user['avcode'], + ); + $subj = $cbemail->replace($email['email_subj'],$var); + $msg = nl2br($cbemail->replace($email['email_msg'],$var)); + + $send_message = ""; + + //Now Finally Sending Email + cbmail(array('from_name'=>TITLE, 'to'=>$user['email'],'from'=>$email['from'],'subject'=>$subj,'content'=>$msg)); + $sent++; + + $send_msg[] = $user['userid'].": Email has been sent to ".$user['username'].""; + + } + + $sent_to = $start_index+$settings['loop_size']; + + if($sent_to>$total) + $sent_to = $total; + + e(sprintf(lang("Sending email from %s to %s"),$start_index+1,$sent_to),"m"); + + $start_index = $start_index+$settings['loop_size']; + + if($sent==$total || $sent>$total) + $status = 'completed'; + else + $status = 'sending'; + + $db->update(tbl('mass_emails'),array('sent','total','start_index','status','last_update'), + array($sent,$total,$start_index,$status,now())," id='".$email['id']."' "); + + return $send_msg; + + } + } +} + +?> \ No newline at end of file diff --git a/upload/includes/classes/cbfeeds.class.php b/upload/includes/classes/cbfeeds.class.php new file mode 100644 index 00000000..5000eb37 --- /dev/null +++ b/upload/includes/classes/cbfeeds.class.php @@ -0,0 +1,391 @@ + userid + * udetails => array of user details + * limit => timelimit of feeds (1 day, 2 days and so) + */ + function createFeed($array) + { + global $userquery; + $uid = $array['uid']; + + if(!$uid) + e(lang("please_provide_valid_userid")); + elseif(!is_array($user)) + { + $user = $userquery->get_user_details($uid); + } + } + + + /** + * Function used to add feed in user feed file + * @param array + * action => upload,joined,comment,created + * object => video, photo, group + * object_id => id of object + * object_details => details of object + * uid => user id + * udetails => user details array + */ + function addFeed($feed) + { + if(!isSectionEnabled('feeds')) + return false; + global $userquery; + $uid = $feed['uid']; + + if(!$uid) + return false; + + $ufeed = array(); + + //Verifying feed action and object + $action = $this->action($feed['action']); + $object = $this->getObject($feed['object']); + + + if(!$action || !$object) + return false; + + //Setting user feed array + $ufeed['action'] = $action; + $ufeed['object'] = $object; + $ufeed['object_id'] = $feed['object_id']; + $ufeed['userid'] = $uid; + $ufeed['time'] = time(); + + //Unsetting feed array + unset($feed); + + //Getting user feed file + $feedFile = $this->getFeedFile($uid); + + //Convering feed using json + $feed = json_encode($ufeed); + //Creating unique md5 of feed + $feedmd5 = md5($feed); + $ufeed['md5'] = $feedmd5; + //Recreating Feed + $feed = json_encode($ufeed); + + //Appending feed in a file + $file = fopen($feedFile,'a+'); + fwrite($file,$feed); + fclose($file); + + //Tada <{^-^}> + + } + + + /** + * Function used to get action of feed + * it will verify weather actio is valid or not + */ + function action($action) + { + $objects = array + ('signup','upload_video','upload_photo','create_group', + 'join_group','add_friend','add_collection','add_playlist', + 'add_comment','add_favorite'); + + if(!in_array($action,$objects)) + return false; + else + return $action; + } + + + /** + * Function used to get object of feed + * it will verify weather actio is valid or not + */ + function getObject($object) + { + $objects = array + ('signup','video','photo','group', + 'user','friend','collection'); + + if(!in_array($object,$objects)) + return false; + else + return $object; + } + + + /** + * Function used to get feed file + */ + function getFeedFile($uid) + { + $time = time(); + $ufeedDir = USER_FEEDS_DIR.'/'.$uid; + //checking user feed folder exists or not + if(!file_exists($ufeedDir)) + mkdir($ufeedDir); + $file = $ufeedDir.'/'.$time.'.feed'; + return $file; + } + + /** + * Function used to get user feed files + */ + function getUserFeedsFiles($uid=NULL) + { + if(!$uid) + $uid = userid(); + + $feeds = array(); + $ufeedDir = USER_FEEDS_DIR.'/'.$uid; + if(file_exists($ufeedDir)) + { + $time = time(); + $time = substr($timem,0,strlen($time)-3); + + $files = glob($ufeedDir.'/'.$time.'*.feed'); + rsort($files); + foreach($files as $file) + { + $feed['content'] = file_get_contents($file); + $feed['file'] = $file; + $feeds[] = $feed; + } + + return $feeds; + } + return false; + } + + + /** + * Function used to get user feed + */ + function getUserFeeds($user) + { + global $cbphoto,$userquery,$cbvid,$cbgroup,$cbcollection; + $allowed_feeds = USER_ACTIVITY_FEEDS_LIMIT; + $uid = $user['userid']; + $feeds = $this->getUserFeedsFiles($uid); + + if(!$feeds) + return false; + $newFeeds = array(); + $coutn = 0; + foreach($feeds as $feed) + { + $count++; + + if($count>$allowed_feeds) + break; + $feedArray = json_decode($feed['content'],true); + if($feed && count($feedArray>0)) + { + $remove_feed = false; + $farr = $feedArray; + + $action = $farr['action']; + $object = $farr['object']; + $object_id = $farr['object_id']; + $farr['user'] = $user; + $farr['file'] = getName($feed['file']); + $farr['datetime'] = nicetime($farr['time'],true); + $userlink = ''.$user['username'].''; + //Creating Links + switch($action) + { + case "upload_photo": + { + $photo = $cbphoto->get_photo($object_id); + + //If photo does not exists, simply remove the feed + if(!$photo) + { + $this->deleteFeed($uid,$feed['file']); + $remove_feed = true; + }else + { + $objectArr['details'] = $photo; + $objectArr['size'] = 't'; + $objectArr['output'] = 'non_html'; + $objectArr['alt'] = $photo['photo_title']; + $farr['thumb'] = $cbphoto->getFileSmarty($objectArr); + $farr['link'] = $cbphoto->photo_links($photo,'view_item'); + + //Content Title + $farr['title'] = $photo['photo_title']; + $farr['action_title'] + = sprintf(lang('user_has_uploaded_new_photo'),$userlink); + + $farr['links'][] = array('link'=>($cbphoto->photo_links($photo,'view_item')),'text'=>lang('view_photo')); + + $farr['icon'] = 'images.png'; + } + + + } + break; + + case "upload_video": + case "add_favorite": + { + $video = $cbvid->get_video($object_id); + //If photo does not exists, simply remove the feed + if(!$video) + { + $this->deleteFeed($uid,$feed['file']); + $remove_feed = true; + }elseif(!video_playable($video)) + { + $remove_feed = true; + }else{ + + //Content Title + $farr['title'] = $video['title']; + if($action=='upload_video') + $farr['action_title'] = sprintf(lang('user_has_uploaded_new_video'),$userlink); + if($action=='add_favorite') + $farr['action_title'] = sprintf(lang('user_has_favorited_video'),$userlink); + $farr['link'] = videoLink($video); + $farr['object_content'] = $video['description']; + $farr['thumb'] = get_thumb($video); + + $farr['links'][] = array('link'=>videoLink($video),'text'=>lang('watch_video')); + + $farr['icon'] = 'video.png'; + + if($action=='add_favorite') + $farr['icon'] = 'heart.png'; + } + } + break; + + + case "create_group": + case "join_group": + { + $group = $cbgroup->get_group($object_id); + //If photo does not exists, simply remove the feed + if(!$group) + { + $this->deleteFeed($uid,$feed['file']); + $remove_feed = true; + }elseif(!$cbgroup->is_viewable($group)) + { + $remove_feed = true; + }else{ + + //Content Title + $farr['title'] = $group['group_name']; + + if($action=='create_group') + $farr['action_title'] = sprintf(lang('user_has_created_new_group'),$userlink); + if($action=='join_group') + $farr['action_title'] = sprintf(lang('user_has_joined_group'),$userlink); + + $farr['link'] = group_link(array('details'=>$group)); + $farr['object_content'] = + $group['group_description']."
    ". + lang('total_members')." : ".$group['total_members']."
    ". + lang('total_videos')." : ".$group['total_videos']."
    ". + lang('total_topics')." : ".$group['total_topics']."
    "; + + $farr['thumb'] = $cbgroup->get_group_thumb($group); + $farr['icon'] = 'group.png'; + + $joinlink = $cbgroup->group_opt_link($group,'join'); + if($joinlink) + { + if(SEO=="yes") + $joinlink = group_link(array('details'=>$group)).'?join=yes"'; + else + $joinlink = group_link(array('details'=>$group)).'&join=yes"'; + $farr['links'][] = array('link'=>$joinlink,'text'=>lang('join')); + } + } + } + break; + + case "signup": + { + $farr['action_title'] = sprintf(lang("user_joined_us"),$userlink,TITLE,$userlink); + $farr['icon'] = 'user.png'; + } + + break; + case "add_friend": + { + $friend = $userquery->get_user_details($object_id); + + if(!$friend) + { + $this->deleteFeed($uid,$feed['file']); + $remove_feed = true; + }else + { + + $friendlink = ''.$friend['username'].''; + $farr['action_title'] = sprintf(lang("user_is_now_friend_with_other") + ,$userlink,$friendlink); + $farr['icon'] = 'user_add.png'; + } + } + break; + + + case "add_collection": + { + $collection = $cbcollection->get_collection($object_id); + if(!$collection) + { + $this->deleteFeed($uid,$feed['file']); + $remove_feed = true; + }else + { + $farr['action_title'] = sprintf(lang('user_has_created_new_collection'),$userlink); + $farr['thumb'] = $cbcollection->get_thumb($collection,'small'); + $farr['title'] = $collection['collection_name']; + $collection_link = $cbcollection->collection_links($collection,'view'); + $farr['link'] = $collection_link; + + $farr['object_content'] = + $collection['collection_description'].'
    '. + $collection['total_objects']." ".$collection['type']; + $farr['icon'] = 'photos.png'; + + $farr['links'][] = array('link'=>$collection_link,'text'=>lang('view_collection')); + } + } + + } + + if(!$remove_feed) + $newFeeds[$feedArray['time']] = $farr; + } + } + return $newFeeds; + } + + + /** + * Function used to delete feed + */ + function deleteFeed($uid,$feedid) + { + $ufeedDir = USER_FEEDS_DIR.'/'.$uid.'/'.getName($feedid).'.feed'; + if(file_exists($ufeedDir)) + unlink($ufeedDir); + } +} \ No newline at end of file diff --git a/upload/includes/classes/cbpage.class.php b/upload/includes/classes/cbpage.class.php new file mode 100644 index 00000000..8c70e9dc --- /dev/null +++ b/upload/includes/classes/cbpage.class.php @@ -0,0 +1,260 @@ +page_tbl = 'pages'; + } + + + /** + * Function used to create new page + * @param ARRAY + */ + function create_page($param) + { + global $db; + $name = mysql_clean($param['page_name']); + $title = mysql_clean($param['page_title']); + $content = addslashes($param['page_content']); + + if(empty($name)) + e(lang("page_name_empty")); + if(empty($title)) + e(lang("page_title_empty")); + if(empty($content)) + e(lang("page_content_empty")); + + if(!error()) + { + $db->insert(tbl($this->page_tbl),array("page_name","page_title","page_content","userid","date_added","active"), + array($name,$title,"|no_mc|".$content,userid(),now(),"yes")); + e(lang("new_page_added_successfully"),"m"); + return false; + } + return false; + } + + /** + * Function used to get details using id + */ + function get_page($id) + { + global $db; + $result = $db->select(tbl($this->page_tbl),"*"," page_id ='$id' "); + if($db->num_rows>0) + return $result[0]; + else + return false; + } + + /** + * Function used to get all pages from database + */ + function get_pages($params=false) + { + global $db; + $order = NULL; + $limit = NULL; + $conds = array(); + $cond = false; + if($params['order']) + { + $order = $params['order']; + } + if($params['limit']) + { + $limit = $params['limit']; + } + + if($params['active']) + { + $conds[] = " active='".$params['active']."'"; + } + + if($params['display_only']) + { + $conds[] = " display='yes' "; + } + + if($conds) + { + + foreach($conds as $c) + { + if($cond) + $cond .= " AND "; + + $cond .= $c; + } + } + + $result = $db->select(tbl($this->page_tbl),"*",$cond,$limit,$order); + if($db->num_rows>0) + return $result; + else + return false; + } + + + /** + * Function used to edit page + */ + function edit_page($param) + { + global $db; + $id = $param['page_id']; + $name = mysql_clean($param['page_name']); + $title = mysql_clean($param['page_title']); + $content = sql_free($param['page_content']); + + $page = $this->get_page($id); + + if(!$page) + e(lang("page_doesnt_exist")); + if(empty($name)) + e(lang("page_name_empty")); + if(empty($title)) + e(lang("page_title_empty")); + if(empty($content)) + e(lang("page_content_empty")); + + if(!error()) + { + $db->update(tbl($this->page_tbl),array("page_name","page_title","page_content"), + array($name,$title,'|no_mc|'.$content)," page_id='$id'"); + e(lang("page_updated"),"m"); + } + + } + + /** + * Function used to delete page + */ + function delete_page($id) + { + $page = $this->get_page($id); + if(!$page) + e(lang("page_doesnt_exist")); + if(!error()) + { + $db->delete(tbl($this->page_tbl),array("page_id"),array($id)); + e(lang("page_deleted"),"m"); + } + + } + + /** + * Function used to create page link + */ + function page_link($pdetails) + { + //baseurl/page/$id/page_name + if(SEO=='yes') + return BASEURL.'/page/'.$pdetails['page_id'].'/'.SEO(strtolower($pdetails['page_name'])); + else + return BASEURL.'/view_page.php?pid='.$pdetails['page_id']; + } + + /** + * Function used to get page link fro id + */ + function get_page_link($id) + { + $page = $this->get_page($id); + return $this->page_link($page); + } + + + /** + * Function used to activate, deactivate or to delete pages + */ + function page_actions($type,$id) + { + global $db; + $page = $this->get_page($id); + if(!$page) + e(lang("page_doent_exist")); + else + { + switch($type) + { + case "activate"; + $db->update(tbl($this->page_tbl),array("active"),array("yes")," page_id='$id'"); + e(lang("page_activated"),"m"); + break; + case "deactivate"; + $db->update(tbl($this->page_tbl),array("active"),array("no")," page_id='$id'"); + e(lang("page_deactivated"),"m"); + break; + case "delete"; + { + if($page['delete_able']=='yes') + { + $db->delete(tbl($this->page_tbl),array("page_id"),array($id)); + e(lang("page_deleted"),"m"); + }else + e(lang("you_cant_delete_this_page")); + } + + break; + + case "display": + { + $db->update(tbl($this->page_tbl),array("display"),array("yes")," page_id='$id'"); + e(lang("Page displaye mode has been changed"),"m"); + } + break; + + case "hide": + { + $db->update(tbl($this->page_tbl),array("display"),array("no")," page_id='$id'"); + e(lang("Page displaye mode has been changed"),"m"); + } + break; + } + } + } + + /** + * function used to check weather page is active or not + */ + function is_active($id) + { + global $db; + $result = $db->count(tbl($this->page_tbl),"page_id"," page_id='$id' AND active='yes' "); + if($result>0) + return true; + else + return false; + } + + + /** + * Function used to update order + */ + function update_order() + { + global $db; + $pages = $this->get_pages(); + foreach($pages as $page) + { + $db->update(tbl($this->page_tbl),array("page_order"),array($_POST['page_ord_'.$page['page_id']])," page_id='".$page['page_id']."'"); + } + } +} + +?> \ No newline at end of file diff --git a/upload/includes/classes/collections.class.php b/upload/includes/classes/collections.class.php new file mode 100644 index 00000000..92bd4981 --- /dev/null +++ b/upload/includes/classes/collections.class.php @@ -0,0 +1,1876 @@ +cat_tbl = "collection_categories"; + $this->section_tbl = "collections"; + $this->types = array('videos' => lang("Videos"),'photos' => lang("Photos")); + ksort($this->types); + $this->setting_up_collections(); + $this->init_actions(); + + } + + /** + * Settings up Action Class + */ + function init_actions() + { + $this->action = new cbactions(); + $this->action->init(); // Setting up reporting excuses + $this->action->type = 'cl'; + $this->action->name = 'collection'; + $this->action->obj_class = 'cbcollection'; + $this->action->check_func = 'collection_exists'; + $this->action->type_tbl = "collections"; + $this->action->type_id_field = 'collection_id'; + } + + /** + * Setting links up in my account + */ + function setting_up_collections() + { + global $userquery,$Cbucket; + $per = $userquery->get_user_level(userid()); + // Adding My Account Links + if(isSectionEnabled('collections')) + $userquery->user_account[lang('Collections')] = array( + lang('add_new_collection') => "manage_collections.php?mode=add_new", + lang('manage_collections') => "manage_collections.php", + lang('manage_favorite_collections') => "manage_collections.php?mode=favorite" + ); + + // Adding Search Type + if(isSectionEnabled('collections')) + $Cbucket->search_types['collections'] = "cbcollection"; + + // Adding Collection links in Admin Area + if($per['collection_moderation'] == "yes") + $Cbucket->AdminMenu['Collections'] = array( + lang('Manage Collections')=>'collection_manager.php', + lang('Manage Categories')=>'collection_category.php', + lang('Flagged Collections')=>'flagged_collections.php'); + + + // Adding Collection links in Cbucket Class + $Cbucket->links['collections'] = array('collections.php','collections/'); + $Cbucket->links['manage_collections'] = array('manage_collections.php','manage_collections.php'); + $Cbucket->links['edit_collection'] = array('manage_collections.php?mode=edit_collection&cid=', + 'manage_collections.php?mode=edit_collection&cid='); + $Cbucket->links['manage_items'] = array('manage_collections.php?mode=manage_items&cid=%s&type=%s', + 'manage_collections.php?mode=manage_items&cid=%s&type=%s'); + $Cbucket->links['user_collections'] = array('user_collections.php?mode=uploaded&user=','user_collections.php?mode=uploaded&user='); + $Cbucket->links['user_fav_collections'] = array('user_collections.php?mode=favorite&user=','user_collections.php?mode=favorite&user='); + + + } + + /** + * Initiatting Search + */ + function init_search() + { + $this->search = new cbsearch; + $this->search->db_tbl = "collections"; + $this->search->columns = array( + array("field"=>"collection_name","type"=>"LIKE","var"=>"%{KEY}%"), + array("field"=>"collection_tags","type"=>"LIKE","var"=>"%{KEY}%","op"=>"OR") + ); + $this->search->match_fields = array("collection_name","collection_tags"); + $this->search->cat_tbl = $this->cat_tbl; + + $this->search->display_template = LAYOUT.'/blocks/collection.html'; + $this->search->template_var = 'collection'; + $this->search->has_user_id = true; + + $sorting = array( + 'date_added'=> lang("date_added"), + 'views' => lang("views"), + 'total_comments' => lang("comments"), + 'total_objects' => lang("Items") + ); + + $this->search->sorting = array( + 'date_added'=> " date_added DESC", + 'views' => " views DESC", + 'total_comments' => " total_comments DESC ", + 'total_objects' => " total_objects DESC" + ); + + $default = $_GET; + if(is_array($default['category'])) + $cat_array = array($default['category']); + $uploaded = $default['datemargin']; + $sort = $default['sort']; + + $this->search->search_type['collections'] = array('title'=>lang('collections')); + $this->search->results_per_page = config('videos_items_search_page'); + + $fields = array( + 'query' => array( + 'title'=> lang('keywords'), + 'type'=> 'textfield', + 'name'=> 'query', + 'id'=> 'query', + 'value'=>cleanForm($default['query']) + ), + 'category' => array( + 'title' => lang('category'), + 'type' => 'checkbox', + 'name' => 'category[]', + 'id' => 'category', + 'value' => array('category',$cat_array), + 'category_type' => 'collections' + ), + 'uploaded' => array( + 'title' => lang('uploaded'), + 'type' => 'dropdown', + 'name' => 'datemargin', + 'id' => 'datemargin', + 'value' => $this->search->date_margins(), + 'checked' => $uploaded, + ), + 'sort' => array( + 'title' => lang('sort_by'), + 'type' => 'dropdown', + 'name' => 'sort', + 'value' => $sorting, + 'checked' => $sort + ) + ); + + $this->search->search_type['collections']['fields'] = $fields; + } + + /** + * Function used to set-up sharing + */ + function set_share_mail($data) + { + $this->share_variables = array( + '{name}' => $data['collection_name'], + '{description}' => $data['collection_description'], + '{type}' => $data['type'], + '{total_items}' => $data['total_objects'], + '{collection_link}' => $this->collection_links($data,'view'), + '{collection_thumb}' => $this->get_thumb($data,'small',TRUE) + ); + $this->action->share_template_name = 'collection_share_template'; + $this->action->val_array = $this->share_variables; + } + + /** + * Function used to check if collection exists + */ + function collection_exists($id) + { + global $db; + $result = $db->count(tbl($this->section_tbl),"collection_id"," collection_id = $id"); + if($result) + return true; + else + return false; + } + + /** + * Function used to check if object exists + * This is a replica of actions.class, exists function + */ + function object_exists($id) + { + $obj = $this->objClass; + global ${$obj}; + $obj = ${$obj}; + $func = $this->objFunction; + return $obj->{$func}($id); + } + + /** + * Function used to get collection + */ + function get_collection($id,$cond=NULL) + { + global $db; + $result = $db->select(tbl($this->section_tbl).",".tbl("users"), + "".tbl($this->section_tbl).".*,".tbl('users').".userid,".tbl('users').".username", + " ".tbl($this->section_tbl).".collection_id = $id AND ".tbl($this->section_tbl).".userid = ".tbl('users').".userid $cond"); + //echo $db->db_query; + if($result) + return $result[0]; + else + return false; + } + + function is_viewable($cid) + { + global $userquery; + + $c = $this->get_collection($cid); + if(empty($c)) + { + e(lang('collection_not_exists')); + return false; + } elseif($c['active'] == 'no') { + e(lang('collection_not_active')); + if(!has_access('admin_access',TRUE)) + return false; + else + return true; + } elseif($c['broadcast'] == 'private' && !$userquery->is_confirmed_friend($c['userid'],userid()) + && $c['userid']!=userid() && !has_access('admin_access',TRUE)) + { + e(lang('collection_is_private')); + return false; + } else { + return true; + } + } + + /** + * Function used to get collections + */ + function get_collections($p=NULL) + { + global $db; + + $limit = $p['limit']; + $order = $p['order']; + $cond = ""; + + if(!has_access('admin_access',TRUE) && $p['user'] != userid()) + $cond .= " ".tbl('collections.active')." = 'yes'"; + elseif($p['user'] == userid()) + $cond .= " ".tbl('collections.active')." = 'yes'"; + else + { + if($p['active']) + { + $cond .= " ".tbl('collections.active')." = '".$p['active']."'"; + } + + if($p['broadcast']) + { + if($cond != '') + $cond .= " AND "; + $cond .= " ".tbl('collections.broadcast')." = '".$p['broadcast']."'"; + } + } + + if($p['category']) + { + $get_all = false; + if(!is_array($p['category'])) + if(strtolower($p['category']) == 'all') + $get_all = true; + + if(!$get_all) + { + if($cond != '') + $cond .= " AND "; + + $cond .= "("; + if(!is_array($p['category'])) + $cats = explode(',',$p['category']); + else + $cats = $p['category']; + $count = 0; + + foreach($cats as $cat) + { + $count++; + if($count > 1) + $cond .= " OR "; + $cond .= " ".tbl('collections.category')." LIKE '%#$cat#%'"; + } + $cond .= ")"; + } + } + + if($p['date_span']) + { + if($cond!='') + $cond .= ' AND '; + $cond .= " ".cbsearch::date_margin("date_added",$p['date_span']); + } + + if($p['user']) + { + if($cond != '') + $cond .= " AND "; + $cond .= " ".tbl('collections.userid')." = '".$p['user']."'"; + } + + if($p['type']) + { + if($cond != '') + $cond .= " AND "; + $cond .= " ".tbl('collections.type')." = '".$p['type']."'"; + } + + if($p['featured']) + { + if($cond != '') + $cond .= " AND "; + $cond .= " ".tbl('collections.featured')." = '".$p['featured']."'"; + } + + if($p['public_upload']) + { + if($cond != '') + $cond .= " AND "; + $cond .= " ".tbl('collections.public_upload')." = '".$p['public_upload']."'"; + } + + if($p['exclude']) + { + if($cond != '') + $cond .= " AND "; + $cond .= " ".tbl('collections.collection_id')." <> '".$p['exclude']."'"; + } + + if($p['cid']) + { + if($cond != '') + $cond .= " AND "; + $cond .= " ".tbl('collections.collection_id')." = '".$p['cid']."'"; + } + + + + /** Get only with those who have items **/ + if($p['has_items'] ) + { + if($cond != '') + $cond .= " AND "; + $cond .= " ".tbl('collections.total_objects')." >= '1'"; + } + + + $title_tag = ''; + + if($p['name']) + { + $title_tag .= " ".tbl('collections.collection_name')." LIKE '%".$p['name']."%'"; + } + + if($p['tags']) + { + $tags = explode(",",$p['tags']); + if(count($tags)>0) + { + if($title_tag != '') + $title_tag .= " OR "; + $total = count($tags); + $loop = 1; + foreach($tags as $tag) + { + $title_tag .= " ".tbl('collections.collection_tags')." LIKE '%$tag%'"; + if($loop<$total) + $title_tag .= " OR "; + $loop++; + } + } else { + if($title_tag != '') + $title_tag .= " OR "; + $title_tag .= " ".tbl('collections.collection_tags')." LIKE '%".$p['tags']."%'"; + } + } + + if($title_tag != "") + { + if($cond != '') + $cond .= " AND "; + $cond .= " ($title_tag) "; + } + + if(!$p['count_only']) + { + if($cond != "") + $cond .= " AND "; + $result = $db->select(tbl("collections,users"), + tbl("collections.*,users.userid,users.username"), + $cond.tbl("collections.userid")." = ".tbl("users.userid"),$limit,$order); + + //echo $db->db_query; + + } + + if($p['count_only']) + { + return $result = $db->count(tbl("collections"),"collection_id",$cond); + //echo $db->db_query; + } + + if($p['assign']) + assign($p['assign'],$result); + else + return $result; + + } + + /** + * Function used to get collection items + */ + function get_collection_items($id,$order=NULL,$limit=NULL) + { + global $db; + $result = $db->select(tbl($this->items),"*"," collection_id = $id",$limit,$order); + if($result) + return $result; + else + return false; + } + + /** + * Function used to get next / previous collection item + */ + function get_next_prev_item($ci_id,$cid,$item="prev",$limit=1,$check_only=false) + { + global $db; + $iTbl = tbl($this->items); + $oTbl = tbl($this->objTable); + $uTbl = tbl('users'); + $tbls = $iTbl.",".$oTbl.",".$uTbl; + + if($item == "prev") + { + $op = ">"; + $order = ''; + } + elseif($item == "next") + { + $op = "<"; + $order = $iTbl.".ci_id DESC"; + } + elseif($item == NULL) + { + $op = "="; + $order = ''; + } + + $cond = " $iTbl.collection_id = $cid AND $iTbl.ci_id $op $ci_id AND $iTbl.object_id = $oTbl.".$this->objFieldID." AND $oTbl.userid = $uTbl.userid"; + if(!$check_only) + { + $result = $db->select($tbls,"$iTbl.*,$oTbl.*,$uTbl.username", $cond,$limit,$order); + + // Result was empty. Checking if we were going backwards, So bring last item + if(empty($result) && $item == "prev") + { + $order = $iTbl.".ci_id ASC"; + $op = "<"; + $result = $db->select($tbls,"$iTbl.*,$oTbl.*,$uTbl.username", " $iTbl.collection_id = $cid AND $iTbl.ci_id $op $ci_id AND $iTbl.object_id = $oTbl.".$this->objFieldID." AND $oTbl.userid = $uTbl.userid",$limit,$order); + } + + // Result was empty. Checking if we were going fowards, So bring first item + if(empty($result) && $item == "next") + { + $order = $iTbl.".ci_id DESC"; + $op = ">"; + $result = $db->select($tbls,"$iTbl.*,$oTbl.*,$uTbl.username", " $iTbl.collection_id = $cid AND $iTbl.ci_id $op $ci_id AND $iTbl.object_id = $oTbl.".$this->objFieldID." AND $oTbl.userid = $uTbl.userid",$limit,$order); + } + } + + if($check_only) + { + $result = $db->count($iTbl.",".$oTbl,"$iTbl.ci_id", " $iTbl.collection_id = $cid AND $iTbl.ci_id $op $ci_id AND $iTbl.object_id = $oTbl.".$this->objFieldID,$limit,$order); + } + + //echo $db->db_query; + if($result) + return $result; + else + return false; + + } + + /** + * Function used to set cookie on moving + * forward or backward + */ + function set_item_cookie($value) + { + if(isset($_COOKIE['current_item'])) + unset($_COOKIE['current_item']); + + setcookie('current_item',$value,time()+240); + } + + /** + * Function used to get collection items with details + */ + function get_collection_items_with_details($id,$order=NULL,$limit=NULL,$count_only=FALSE) + { + global $db; + $itemsTbl = tbl($this->items); + $objTbl = tbl($this->objTable); + $tables = $itemsTbl.",".$objTbl.",".tbl("users"); + + if(!$count_only) + { + $result = $db->select($tables,"$itemsTbl.ci_id,$itemsTbl.collection_id,$objTbl.*,".tbl('users').".username"," $itemsTbl.collection_id = '$id' AND $itemsTbl.object_id = $objTbl.".$this->objFieldID." AND $objTbl.userid = ".tbl('users').".userid",$limit,$order); + //echo $db->db_query; + } else { + $result = $db->count($itemsTbl,"ci_id"," collection_id = $id"); + } + + if($result) + { + return $result; + } + else + return false; + } + + /** + * Function used to get collection items with + * specific fields + */ + function get_collection_item_fields($cid,$objID,$fields) + { + global $db; + $result = $db->select(tbl($this->items),$fields," object_id = $objID AND collection_id = $cid"); + if($result) + return $result; + else + return false; + } + + /** + * Function used to load collections fields + */ + function load_required_fields($default=NULL) + { + if($default==NULL) + $default = $_POST; + + $name = $default['collection_name']; + $description = $default['collection_description']; + $tags = $default['collection_tags']; + $type = $default['type']; + if(is_array($default['category'])) + $cat_array = array($default['category']); + else + { + preg_match_all('/#([0-9]+)#/',$default['category'],$m); + $cat_array = array($m[1]); + } + + $reqFileds = array + ( + 'name' => array( + 'title'=> lang("collection_name"), + 'type' => 'textfield', + 'name' => 'collection_name', + 'id' => 'collection_name', + 'value' => cleanForm($name), + 'db_field' => 'collection_name', + 'required' => 'yes', + 'invalid_err' => lang("collect_name_er") + ), + + 'desc' => array( + 'title' => lang("collection_description"), + 'type' => 'textarea', + 'name' => 'collection_description', + 'id' => 'colleciton_desciption', + 'value' => cleanForm($description), + 'db_field' => 'collection_description', + 'required' => 'yes', + 'anchor_before' => 'before_desc_compose_box', + 'invalid_err' => lang("collect_descp_er") + ), + 'tags' => array( + 'title' => lang("collection_tags"), + 'type' => 'textfield', + 'name' => 'collection_tags', + 'id' => 'collection_tags', + 'value' => cleanForm(genTags($tags)), + 'hint_2' => lang("collect_tag_hint"), + 'db_field' => 'collection_tags', + 'required' => 'yes', + 'invalid_err' => lang("collect_tag_er"), + 'validate_function' => 'genTags' + ), + + 'cat' => array( + 'title' => lang("collect_category"), + 'type' => 'checkbox', + 'name' => 'category[]', + 'id' => 'category', + 'value' => array('category',$cat_array), + 'db_field' => 'category', + 'required' => 'yes', + 'validate_function' => 'validate_collection_category', + 'invalid_err' => lang('collect_cat_er'), + 'display_function' => 'convert_to_categories', + 'category_type' => 'collections' + ), + + 'type' => array( + 'title' => lang("collect_type"), + 'type' => 'dropdown', + 'name' => 'type', + 'id' => 'type', + 'value' => $this->types, + 'db_field' => 'type', + 'required' => 'yes', + 'checked' => $type + ) + ); + + return $reqFileds; + } + + /** + * Function used to load collections optional fields + */ + function load_other_fields($default=NULL) + { + if($default==NULL) + $default = $_POST; + + $broadcast = $default['broadcast']; + $allow_comments = $default['allow_comments']; + $public_upload = $default['public_upload']; + + $other_fields = array + ( + 'broadcast' => array( + 'title' => lang("vdo_br_opt"), + 'type' => 'radiobutton', + 'name' => 'broadcast', + 'id' => 'broadcast', + 'value' => array("public"=>lang("collect_borad_pub"),"private"=>lang("collect_broad_pri")), + 'checked' => $broadcast, + 'db_field' => 'broadcast', + 'required' => 'no', + 'validate_function'=>'yes_or_no', + 'display_function' => 'display_sharing_opt', + 'default_value'=>'yes' + ), + 'comments' => array( + 'title' => lang("comments"), + 'type' => 'radiobutton', + 'id' => 'allow_comments', + 'name' => 'allow_comments', + 'value' => array("yes"=>lang("vdo_allow_comm"),"no"=>lang("vdo_dallow_comm")), + 'checked' => $allow_comments, + 'db_field' => 'allow_comments', + 'required' => 'no', + 'validate_function'=>'yes_or_no', + 'display_function' => 'display_sharing_opt', + 'default_value'=>'yes' + ), + 'public_upload' => array( + 'title' => lang("collect_allow_public_up"), + 'type' => 'radiobutton', + 'id' => 'public_upload', + 'name' => 'public_upload', + 'value' => array("no"=>lang("collect_pub_up_dallow"),"yes"=>lang("collect_pub_up_allow")), + 'checked' => $public_upload, + 'db_field' => 'public_upload', + 'required' => 'no', + 'validate_function'=>'yes_or_no', + 'display_function' => 'display_sharing_opt', + 'default_value'=>'no' + ) + ); + return $other_fields; + } + + /** + * Function used to validate form fields + */ + function validate_form_fields($array=NULL) + { + $reqFileds = $this->load_required_fields($array); + + if($array==NULL) + $array = $_POST; + + if(is_array($_FILES)) + $array = array_merge($array,$_FILES); + + + $otherFields = $this->load_other_fields($array); + + $collection_fields = array_merge($reqFileds,$otherFields); + + validate_cb_form($collection_fields,$array); + } + + /** + * Function used to validate collection category + * @param input array + */ + function validate_collection_category($array=NULL) + { + if($array==NULL) + $array = $_POST['category']; + if(count($array)==0) + return false; + else + { + + foreach($array as $arr) + { + if($this->category_exists($arr)) + $new_array[] = $arr; + } + } + if(count($new_array)==0) + { + e(lang('vdo_cat_err3')); + return false; + } + /*elseif(count($new_array)>ALLOWED_GROUP_CATEGORIES) + { + e(sprintf(lang('vdo_cat_err2'),ALLOWED_GROUP_CATEGORIES)); + return false; + }*/ + + return true; + } + + /** + * Function used to create collections + */ + function create_collection($array=NULL) + { + global $db, $userquery; + + if($array==NULL) + $array = $_POST; + + if(is_array($_FILES)) + $array = array_merge($array,$_FILES); + + $this->validate_form_fields($array); + + if(!error()) + { + $fields = $this->load_required_fields($array); + $collection_fields = array_merge($fields,$this->load_other_fields($array)); + + if(count($this->custom_collection_fields) > 0) + $collection_fields = array_merge($collection_fields,$this->custom_collection_fields); + + foreach($collection_fields as $field) + { + $name = formObj::rmBrackets($field['name']); + $val = $array[$name]; + + if($field['use_func_val']) + $val = $field['validate_function']($val); + + if(!empty($field['db_field'])) + $query_field[] = $field['db_field']; + + if(is_array($val)) + { + $new_val = ''; + foreach($val as $v) + { + $new_val .= "#".$v."# "; + } + $val = $new_val; + } + if(!$field['clean_func'] || (!function_exists($field['clean_func']) && !is_array($field['clean_func']))) + $val = ($val); + else + $val = apply_func($field['clean_func'],sql_free('|no_mc|'.$val)); + + if(!empty($field['db_field'])) + $query_val[] = $val; + } + + // date_added + $query_field[] = "date_added"; + $query_val[] = NOW(); + + // user + $query_field[] = "userid"; + if($array['userid']) + $query_val[] = $userid = $array['userid']; + else + $query_val[] = $userid = userid(); + + // active + $query_field[] = "active"; + $query_val[] = "yes"; + + $insert_id = $db->insert(tbl($this->section_tbl),$query_field,$query_val); + + addFeed(array('action'=>'add_collection','object_id' => $insert_id,'object'=>'collection')); + + //Incrementing usr collection + $db->update(tbl("users"),array("total_collections"),array("|f|total_collections+1")," userid='".$userid."'"); + + e(lang("collect_added_msg"),"m"); + return $insert_id; + } + } + + /** + * Function used to get collection owner + */ + function get_collection_owner($cid) + { + global $db; + $cid = mysql_clean($cid); + $user_tbl = tbl("users"); + $result = $db->select(tbl($this->section_tbl.",users"),tbl($this->section_tbl).".*,$user_tbl.userid,$user_tbl.username"," collection_id = $cid AND ".tbl($this->section_tbl).".userid = $user_tbl.userid"); + if($db->num_rows > 0) + return $result[0]['userid']; + else + return false; + } + + /** + * Function used to add item in collection + */ + function add_collection_item($objID,$cid) + { + global $db; + + $objID = mysql_clean($objID); + $cid = mysql_clean($cid); + + if($array==NULL) + $array = $_POST; + + if($this->collection_exists($cid)) + { + if(!userid()) + e(lang("you_not_logged_in")); + elseif(!$this->object_exists($objID)) + e(sprintf(lang("object_does_not_exists"),$this->objName)); + elseif($this->object_in_collection($objID,$cid)) + e(sprintf(lang("object_exists_collection"),$this->objName)); + else + { + $flds = array("collection_id","object_id","type","userid","date_added"); + $vls = array($cid,$objID,$this->objType,userid(),NOW()); + $db->insert(tbl($this->items),$flds,$vls); + $db->update(tbl($this->section_tbl),array("total_objects"),array("|f|total_objects+1")," collection_id = $cid"); + e(sprintf(lang("item_added_in_collection"),$this->objName),"m"); + } + } else { + e(lang("collect_not_exist")); + } + } + + /** + * Function used to check if object exists in collection + */ + function object_in_collection($id,$cid) + { + global $db; + $id = mysql_clean($id); + $cid = mysql_clean($cid); + $result = $db->select(tbl($this->items),"*"," object_id = $id AND collection_id = $cid"); + if($result) + return $result[0]; + else + return false; + } + + /** + * Function used to get collection field vlaue + */ + function get_collection_field($cid,$field=NULL) + { + global $db; + if($field==NULL) + $field = "*"; + else + $field = $field; + + if(is_array($cid)) + $id = $cid['collection_id']; + else + $id = $cid; + + $cid = mysql_clean($cid); + $field = mysql_clean($field); + + $result = $db->select(tbl($this->section_tbl),$field," collection_id = $id"); + if($result) + { + if(count($result[0]) > 2) + return $result[0]; + else + return $result[0][$field]; + } else + return false; + } + + /** + * Function used to check if user collection owner + */ + function is_collection_owner($cdetails,$userid=NULL) + { + if($userid==NULL) + $userid = userid(); + + if(!is_array($cdetails)) + $details = $this->get_collection($cdetails); + else + $details = $cdetails; + + if($details['userid'] == $userid) + return true; + else + return false; + } + + /** + * Function used to delete collection + */ + function delete_collection($cid) + { + global $db,$eh; + $collection = $this->get_collection($cid); + if(empty($collection)) + e(lang("collection_not_exists")); + elseif($collection['userid'] != userid() && !has_access('admin_access',true)) + e(lang("cant_perform_action_collect")); + else + { + + $cid = mysql_clean($cid); + $del_funcs = $this->collection_delete_functions; + if(is_array($del_funcs) && !empty($del_funcs)) + { + foreach($del_funcs as $func) + { + if(function_exists($func)) + $func($collection); + } + } + + $db->delete(tbl($this->items),array("collection_id"),array($cid)); + $this->delete_thumbs($cid); + $db->delete(tbl($this->section_tbl),array("collection_id"),array($cid)); + + //Decrementing users total collection + $db->update(tbl("users"),array("total_collections"),array("|f|total_collections-1")," userid='".$cid."'"); + //Removing video Comments + $db->delete(tbl("comments"),array("type","type_id"),array("cl",$cid)); + //Removing video From Favortes + $db->delete(tbl("favorites"),array("type","id"),array("cl",$cid)); + $eh->flush(); + e(lang("collection_deleted"),"m"); + } + } + + /** + * Function used to delete collection items + */ + function delete_collection_items($cid) + { + global $db; + $cid = mysql_clean($cid); + $collection = $this->get_collection($id); + if(!$collection) + e(lang("collection_not_exists")); + elseif($collection['userid'] != userid() && !has_access('admin_access',true)) + e(lang("cant_perform_action_collect")); + else { + $db->delete(tbl($this->items),array("collection_id"),array($cid)); + $db->update(tbl($this->section_tbl),array("total_objects"),array($this->count_items($cid))," collection_id = $cid"); + e(lang("collect_items_deleted"),"m"); + } + } + + /** + * Function used to delete collection items + */ + function remove_item($id,$cid) + { + global $db; + $id = mysql_clean($id); + $cid = mysql_clean($cid); + + if($this->collection_exists($cid)) + { + if(!userid()) + e(lang("you_not_logged_in")); + elseif(!$this->object_in_collection($id,$cid)) + e(sprintf(lang("object_not_in_collect"),$this->objName)); + elseif(!$this->is_collection_owner($cid) && !has_access('admin_access',true)) + e(lang("cant_perform_action_collect")); + else + { + $db->execute("DELETE FROM ".tbl($this->items)." WHERE object_id = $id AND collection_id = $cid"); + $db->update(tbl($this->section_tbl),array("total_objects"),array("|f|total_objects-1")," collection_id = $cid"); + e(sprintf(lang("collect_item_removed"),$this->objName),"m"); + } + } else { + e(lang('collect_not_exists')); + return false; + } + } + + /** + * Function used to count collection items + */ + function count_items($cid) + { + global $db; + $cid = mysql_clean($cid); + $count = $db->count($this->items,"ci_id"," collection_id = $cid"); + if($count) + return $count; + else + return 0; + } + + /** + * Function used to delete collection preview + */ + function delete_thumbs($cid) + { + $cid = mysql_clean($cid); + + $glob = glob(COLLECT_THUMBS_DIR."/$cid*.jpg"); + if($glob) + { + foreach($glob as $file) + { + if(file_exists($file)) + unlink($file); + } + } else { + return false; + } + } + + /** + * Function used to create collection preview + */ + function upload_thumb($cid,$file) + { + global $imgObj,$cbphoto; + $file_ext = strtolower(getext($file['name'])); + $exts = array("jpg","gif","jpeg","png"); + + foreach($exts as $ext) + { + if($ext == $file_ext) + { + $thumb = COLLECT_THUMBS_DIR."/".$cid.".".$ext; + $sThumb = COLLECT_THUMBS_DIR."/".$cid."-small.".$ext; + foreach($exts as $un_ext) + if(file_exists(COLLECT_THUMBS_DIR."/".$cid.".".$un_ext) && file_exists(COLLECT_THUMBS_DIR."/".$cid."-small.".$un_ext)) + { + unlink(COLLECT_THUMBS_DIR."/".$cid.".".$un_ext); + unlink(COLLECT_THUMBS_DIR."/".$cid."-small.".$un_ext); + } + move_uploaded_file($file['tmp_name'],$thumb); + if(!$imgObj->ValidateImage($thumb,$ext)) + e("pic_upload_vali_err"); + else + { + $imgObj->createThumb($thumb,$thumb,$this->collect_thumb_width,$ext,$this->collect_thumb_height); + $imgObj->createThumb($thumb,$sThumb,$this->collect_small_thumb_width,$ext,$this->collect_small_thumb_height); + } + } + } + } + + /** + * Function used to create collection preview + */ + function update_collection($array=NULL) + { + global $db; + + if($array==NULL) + $array = $_POST; + + if(is_array($_FILES)) + $array = array_merge($array,$_FILES); + + $this->validate_form_fields($array); + $cid = $array['collection_id']; + + if(!error()) + { + $reqFields = $this->load_required_fields($array); + $otherFields = $this->load_other_fields($array); + + $collection_fields = array_merge($reqFields,$otherFields); + if($this->custom_collection_fields > 0) + $collection_fields = array_merge($collection_fields,$this->custom_collection_fields); + foreach($collection_fields as $field) + { + $name = formObj::rmBrackets($field['name']); + $val = $array[$name]; + + if($field['use_func_val']) + $val = $field['validate_function']($val); + + + if(!empty($field['db_field'])) + $query_field[] = $field['db_field']; + + if(is_array($val)) + { + $new_val = ''; + foreach($val as $v) + { + $new_val .= "#".$v."# "; + } + $val = $new_val; + } + if(!$field['clean_func'] || (!function_exists($field['clean_func']) && !is_array($field['clean_func']))) + $val = ($val); + else + $val = apply_func($field['clean_func'],sql_free('|no_mc|'.$val)); + + if(!empty($field['db_field'])) + $query_val[] = $val; + + } + + if(has_access('admin_access',TRUE)) + { + + if(!empty($array['total_comments'])) + { + $total_comments = $array['total_comments']; + if(!is_numeric($total_comments) || $total_comments<0) + $total_comments = 0; + + $query_field[] = "total_comments"; + $query_val[] = $total_comments; + } + + if(!empty($array['total_objects'])) + { + $tobj = $array['total_objects']; + if(!is_numeric($tobj) || $tobj<0) + $tobj = 0; + $query_field[] = "total_objects"; + $query_val[] = $tobj; + } + } + } + + if(!error()) + { + if(!userid()) + e(lang("you_not_logged_in")); + elseif(!$this->collection_exists($cid)) + e(lang("collect_not_exist")); + elseif(!$this->is_collection_owner($cid,userid()) && !has_access('admin_access',TRUE)) + e(lang("cant_edit_collection")); + else + { + $cid = mysql_clean($cid); + $db->update(tbl($this->section_tbl),$query_field,$query_val," collection_id = $cid"); + e(lang("collection_updated"),"m"); + + if(!empty($array['collection_thumb']['tmp_name'])) + $this->upload_thumb($cid,$array['collection_thumb']); + } + } + } + + /** + * Function used get default thumb + */ + function get_default_thumb($size=NULL) + { + if($size=="small" && file_exists(TEMPLATEDIR."/images/thumbs/collection_thumb-small.png")) + { + return TEMPLATEDIR."/images/thumbs/collection_thumb-small.png"; + } elseif(!$size && file_exists(TEMPLATEDIR."/images/thumbs/collection_thumb.png")) { + return TEMPLATEDIR."/images/thumbs/collection_thumb.png"; + } else { + if($size == "small") + $thumb = COLLECT_THUMBS_URL."/no_thumb-small.png"; + else + $thumb = COLLECT_THUMBS_URL."/no_thumb.png"; + + return $thumb; + } + } + + /** + * Function used get collection thumb + */ + function get_thumb($cdetails,$size=NULL,$return_c_thumb=false) + { + + if(is_numeric($cdetails)) + { + $cdetails = $this->get_collection($cdetails); + $cid = $cdetails['collection_id']; + } else + $cid = $cdetails['collection_id']; + + $exts = array("jpg","png","gif","jpeg"); + + if($return_c_thumb) + { + foreach($exts as $ext) + { + if($size=="small") + $s = "-small"; + if(file_exists(COLLECT_THUMBS_DIR."/".$cid.$s.".".$ext)) + return COLLECT_THUMBS_URL."/".$cid.$s.".".$ext; + } + } else { + + $item = $this->get_collection_items($cid,'ci_id DESC',1); + $type = $item[0]['type']; + switch($type) + { + case "v": + { + global $cbvideo; + $thumb = get_thumb($cbvideo->get_video_details($item[0]['object_id'])); + } + break; + + case "p": + { + global $cbphoto; + $thumb = $cbphoto->get_image_file($cbphoto->get_photo($item[0]['object_id'])); + } + } + + if($thumb) + return $thumb; + else + { + foreach($exts as $ext) + { + if($size=="small") + $s = "-small"; + if(file_exists(COLLECT_THUMBS_DIR."/".$cid.$s.".".$ext)) + return COLLECT_THUMBS_URL."/".$cid.$s.".".$ext; + } + } + } + + return $this->get_default_thumb($size); + } + + + /** + * Used to display collection voterts details. + * User who rated, how many stars and when user rated + */ + function collection_voters($id,$return_array=FALSE,$show_all=FALSE) + { + global $json; + $c= $this->get_collection($id); + if((!empty($c) && $c['userid'] == userid()) || $show_all === TRUE) + { + global $userquery; + $voters = $c['voters']; + if(phpversion() < "5.2.0") + $voters = $json->json_decode($voters,TRUE); + else + $voters = json_decode($voters,TRUE); + + if(!empty($voters)) + { + if($return_array) + return $voters; + else + { + foreach($voters as $id=>$details) + { + $username = get_username($id); + $output = "
  • "; + $output .= "$username"; + $output .= " rated ". $details['rate']/2 ." stars ("; + $output .= niceTime($details['time']).")"; + $output .= "
  • "; + echo $output; + } + } + } + } else + return false; + } + + + /** + * Used to get current rating + */ + function current_rating($id) + { + global $db; + $id = mysql_clean($id); + $result = $db->select(tbl('collections'),'allow_rating,rating,rated_by,voters,userid'," collection_id = ".$id.""); + if($result) + return $result[0]; + else + return false; + } + + + /** + * Used to rate photo + */ + function rate_collection($id,$rating) + { + global $db,$json; + + if(!is_numeric($rating) || $rating <= 9) + $rating = 0; + if($rating >= 10) + $rating = 10; + + $c_rating = $this->current_rating($id); + $voters = $c_rating['voters']; + + $new_rate = $c_rating['rating']; + $rated_by = $c_rating['rated_by']; + + if(phpversion < '5.2.0') + $voters = $json->json_decode($voters,TRUE); + else + $voters = json_decode($voters,TRUE); + + if(!empty($voters)) + $already_voted = array_key_exists(userid(),$voters); + + + + if(!userid()) + e(lang("please_login_to_rate")); + elseif(userid()==$c_rating['userid'] && !config('own_collection_rating')) + e(lang("you_cannot_rate_own_collection")); + elseif(!empty($already_voted)) + e(lang("you_hv_already_rated_photo")); + elseif($c_rating['allow_rating'] == 'no' || !config('collection_rating')) + e(lang("collection_rating_not_allowed")); + else + { + $voters[userid()] = array('rate'=>$rating,'time'=>NOW()); + if(phpversion < '5.2.0') + $voters = $json->json_encode($voters); + else + $voters = json_encode($voters); + + $t = $c_rating['rated_by'] * $c_rating['rating']; + $rated_by = $c_rating['rated_by'] + 1; + $new_rate = ($t + $rating) / $rated_by; + + $id = mysql_clean($id); + $db->update(tbl('collections'),array('rating','rated_by','voters'), + array("$new_rate","$rated_by","|no_mc|$voters"), + " collection_id = ".$id.""); + $userDetails = array( + "object_id" => $id, + "type" => "collection", + "time" => now(), + "rating" => $rating, + "userid" => userid(), + "username" => username() + ); + /* Updating user details */ + update_user_voted($userDetails); + e(lang("thnx_for_voting"),"m"); + } + + $return = array("rating"=>$new_rate,"rated_by"=>$rated_by,'total'=>10,"id"=>$id,"type"=>"collection","disable"=>"disabled"); + return $return; + } + + /** + * Function used generate collection link + */ + function collection_rating($cid,$type) + { + switch($type) + { + case "videos": + case "v": + { + global $cbvideo; + $items = $cbvideo->collection->get_collection_items_with_details($cid); + $total_rating = ''; + if(!empty($items)) + { + foreach($items as $item) + { + $total_rating += $item['rating']; + if(!empty($item['rated_by']) && $item['rated_by'] != 0) + $voters[] = $item['rated_by']; + } + } + } + break; + + case "photos": + case "p": + { + global $cbphoto; + $items = $cbphoto->collection->get_collection_items_with_details($cid); + $total_rating = ''; + if(!empty($items)) + { + foreach($items as $item) + { + $total_rating += $item['rating']; + if(!empty($item['rated_by']) && $item['rated_by'] != 0) + $voters[] = $item['rated_by']; + } + } + } + break; + } + $total_voters = count($voters); + if(!empty($total_rating) && $total_voters != 0) + { + $collect_rating = $total_rating / $total_voters; + return round($collect_rating,2); + } + } + + /** + * Function used to add comment + */ + function add_comment($comment,$obj_id,$reply_to=NULL,$force_name_email=false) + { + global $myquery,$db; + + $collection = $this->get_collection($obj_id); + if(!$collection) + e(lang("collect_not_exist")); + else + { + $obj_owner = $this->get_collection_field($collection,"userid"); + $cl_link = $this->collection_links($collection,'vc'); + $comment = $myquery->add_comment($comment,$obj_id,$reply_to,'cl',$obj_owner,$cl_link,$force_name_email); + //echo $comment; + if($comment) + { + $log_array = array + ( + 'success'=>'yes', + 'details'=> "comment on a collection", + 'action_obj_id' => $obj_id, + 'action_done_id' => $comment, + ); + insert_log('collection_comment',$log_array); + + $this->update_total_comments($obj_id); + } + return $comment; + } + } + + /** + * Function used to update total comments of collection + */ + function update_total_comments($cid) + { + global $db; + $count = $db->count(tbl("comments"),"comment_id"," type = 'cl' AND type_id = '$cid'"); + $db->update(tbl($this->section_tbl),array("total_comments","last_commented"),array($count,now())," collection_id = '$cid'"); + } + + /** + * Function used return collection links + */ + function collection_links($details,$type=NULL) + { + if(is_array($details)) + { + if(empty($details['collection_id'])) + return BASEURL; + else + $cdetails = $details; + } else { + if(is_numeric($details)) + $cdetails = $this->get_collection($details); + else + return BASEURL; + } + + if(!empty($cdetails)) + { + if($type == NULL || $type == "main") + { + if(SEO == 'yes') + return BASEURL."/collections"; + else + return BASEURL."/collections.php"; + } + elseif($type == "vc" || $type == "view_collection" ||$type == "view") + { + if(SEO == 'yes') + return BASEURL."/collection/".$cdetails['collection_id']."/".$cdetails['type']."/".SEO(($cdetails['collection_name'])).""; + else + return BASEURL."/view_collection.php?cid=".$cdetails['collection_id']."&type=".$cdetails['type']; + } elseif($type == "vi" || $type == "view_item" ||$type == "item") { + //$item_type = $this->get_collection_field($cdetails['collection_id'],'type'); + if($cdetails['videoid']) + $item_type = 'videos'; + else + $item_type = 'photos'; + switch($item_type) + { + case "videos": + case "v": + { + if(SEO == "yes") + return BASEURL."/item/".$item_type."/".$details['collection_id']."/".$details['videokey']."/".SEO(clean(str_replace(' ','-',$details['title']))); + else + return BASEURL."/view_item.php?item=".$details['videokey']."&type=".$item_type."&collection=".$details['collection_id']; + } + break; + + case "photos": + case "p": + { + if(SEO == "yes") + return BASEURL."/item/".$item_type."/".$details['collection_id']."/".$details['photo_key']."/".SEO(clean(str_replace(' ','-',$details['photo_title']))); + else + return BASEURL."/view_item.php?item=".$details['photo_key']."&type=".$item_type."&collection=".$details['collection_id']; + } + break; + } + } elseif($type == 'load_more' || $type == 'more_items' || $type='moreItems') { + if(empty($cdetails['page_no'])) + $cdetails['page_no'] = 2; + + if(SEO == 'yes') + return "?cid=".$cdetails['collection_id']."&type=".$cdetails['type']."&page=".$cdetails['page_no']; + else + return "?cid=".$cdetails['collection_id']."&type=".$cdetails['type']."&page=".$cdetails['page_no']; + } + } else { + return BASEURL; + } + } + + /** + * Used to update counts + */ + function update_collection_counts($id,$amount,$op) + { + global $db; + $db->update(tbl("collections"),array("total_objects"),array("|f|total_objects$op$amount")," collection_id = $id"); + } + + /** + * Used to change collection of product + */ + function change_collection($new,$obj,$old=NULL) + { + global $db; + + /* THIS MEANS OBJECT IS ORPHAN MOST PROBABLY AND HOPEFULLY - PHOTO + NOW WE WILL ADD $OBJ TO $NEW */ + if($old == 0 || $old == NULL) + { + $this->add_collection_item($obj,$new); + } else { + $update = $db->update(tbl($this->items),array('collection_id'),array($new)," collection_id = $old AND type = '".$this->objType."' AND object_id = $obj"); + + if(!empty($update)) + { + $this->update_collection_counts($new,1,'+'); + $this->update_collection_counts($old,1,'-'); + } + } + } + + /** + * Sorting links for collection + */ + function sorting_links() + { + if(!isset($_GET['sort'])) + $_GET['sort'] = 'most_recent'; + + $array = array + ('most_recent' => lang('recent'), + 'most_viewed' => lang('viewed'), + 'featured' => lang('featured'), + 'most_items' => lang('Most Items'), + 'most_commented' => lang('commented'), + ); + return $array; + } + + /** + * Used to perform actions on collection + */ + function collection_actions($action,$cid) + { + global $db; + $cid = mysql_clean($cid); + switch($action) + { + case "activate": + case "activation": + case "ac": + { + $db->update(tbl($this->section_tbl),array("active"),array("yes")," collection_id = $cid"); + e(lang("collection_activated"),"m"); + } + break; + + case "deactivate": + case "deactivation": + case "dac": + { + $db->update(tbl($this->section_tbl),array("active"),array("no")," collection_id = $cid"); + e(lang("collection_deactivated"),"m"); + } + break; + + case "make_feature": + case "featured": + case "mcf": + { + $db->update(tbl($this->section_tbl),array("featured"),array("yes")," collection_id = $cid"); + e(lang("collection_featured"),"m"); + } + break; + + case "make_unfeature": + case "unfeatured": + case "mcuf": + { + $db->update(tbl($this->section_tbl),array("featured"),array("no")," collection_id = $cid"); + e(lang("collection_unfeatured"),"m"); + } + break; + + default: + { + header("location:".BASEURL); + } + } + } + + /** + * Function used to get collection from its Item ID and type + * only get collections of logged in user + * @param : OBJ_ID + * @param : OBJ_Type + * @return : Object + */ + function getCollectionFromItem($objId,$type=NULL) + { + global $db; + if(!$type) + $type = $this->objType; + $userid=userid(); + $objId = mysql_clean($objId); + $results = $db->select(tbl('collections,collection_items'),'*', + tbl("collections.collection_id")." = ".tbl("collection_items.collection_id")." AND " + .tbl("collection_items.type='".$type."'")." AND ".tbl("collections.userid='".$userid."'")." AND " + .tbl("collections.active='yes'")." AND ".tbl("collection_items.object_id='".$objId."'")); + + if($db->num_rows>0) + $assign = $results; + else + $assign = false; + + return $assign; + + } + + /** + * Function used to remove item from collections + * and decrement collection item count + * @param : itemID + * @param : type + */ + function deleteItemFromCollections($objId,$type=NULL) + { + global $db,$cbvid; + if(!$type) + $type = $this->objType; + + $objId = mysql_clean($objId); + $db->update(tbl('collections,collection_items'),array('total_objects'),array('|f|total_objects -1'), + tbl("collections.collection_id")." = ".tbl("collection_items.collection_id")." AND " + .tbl("collection_items.type='".$type."'")." AND ".tbl("collection_items.object_id='".$objId."'")); + + + $db->execute("DELETE FROM ".tbl('collection_items')." WHERE " + .("type='".$type."'")." AND ".("object_id='".$objId."'")); + } + + + /** + * become collection contributor + * + * @param INT $collection_id + * @param INT $userid + * + * @return BOOLEAN + */ + function add_contributor($cid,$uid) + { + global $userquery; + $cid = mysql_clean($cid); + $uid = mysql_clean($uid); + + if(!$cid){ e(lang("Invalid collection id")); return false; } + if(!$uid){ e(lang("Invalid user id")); return false; } + + $collection = $this->get_collection($cid); + if(!$collection){ e(lang("Invalid collection")); return false;} + + if(!$userquery->user_exists($uid)){ e(lang("Invalid user")); return false;} + + if($collection['broadcast']!='public'){ e(lang("Collection is not public")); return false;} + + if($this->is_contributor($cid,$uid)){ e(lang("Contributor id already exists")); return false;} + + $query = array( + 'userid' => $uid, + 'collection_id' => $cid, + 'date_added' => now(), + ); + + $insert_id = db_insert(tbl('collection_contributors'),$query); + + if($insert_id) return $insert_id; + + return false; + + + } + + + /** + * function check if user is already a contributor + * + * @param INT $collection_id + * @param INT $userid + * + * @return BOOLEAN + */ + function is_contributor($cid,$uid) + { + $cid = mysql_clean($cid); + $uid = mysql_clean($uid); + + $query = " SELECT contributor_id FROM ".tbl('collection_contributors'); + $query .= " WHERE userid='$uid' AND collection_id ='$cid' LIMIT 1"; + $data = db_select($query); + + if($data) + return $data[0]['contributor_id']; + else + return false; + } + + /** + * Remove contributor + * + * @param INT $cid + * @param INT $uid + * + * @return BOOLEAN + */ + function remove_contributor($cid,$uid) + { + $cid = mysql_clean($cid); + $uid = mysql_clean($uid); + + if(!$this->is_contributor($cid,$uid)){ e(lang("User is yet a contributor")); return false;} + + $collection = $this->get_collection($cid); + + if($collection['userid'] != userid() && !has_access('collection_moderation') && $uid!=userid()) + { + e(lang('You cannot remove this contributor')); + } + + + $query = "DELETE FROM ".tbl('collection_contributors')." WHERE userid='$uid' LIMIT 1"; + global $db; + $db->Execute($query); + + return true; + } + + + /** + * function get collection for contributor + * + * @param $uid + * + */ + function get_contributor_collections($uid,$type='videos',$limit=NULL,$order="date_added DESC") + { + + $uid = mysql_clean($uid); + $limit = mysql_clean($limit); + $order = mysql_clean($order); + + $query = " SELECT cb.contributor_id,cl.* FROM ".tbl('collection_contributors')." AS cb "; + $query .= " LEFT JOIN ".tbl('collections')." AS cl ON cb.collection_id=cl.collection_id "; + $query .= " WHERE cb.userid='$uid' "; + $query .= " AND cl.broadcast='public' AND cl.active='yes' AND cl.type='$type' "; + + + if($order) + $query .=" ORDER BY ".$order; + + if($limit) + $query .= " LIMIT ".$limit; + + + $results = db_select($query); + + if($results) + return $results; + } + +} + +?> \ No newline at end of file diff --git a/upload/includes/classes/conversion/ffmpeg.class.php b/upload/includes/classes/conversion/ffmpeg.class.php new file mode 100644 index 00000000..94065451 --- /dev/null +++ b/upload/includes/classes/conversion/ffmpeg.class.php @@ -0,0 +1,1233 @@ +ffmpeg = FFMPEG_BINARY; + $this->mp4box = MP4Box_BINARY; + $this->flvtool2 = FLVTool2_BINARY; + $this->flvtoolpp = $Cbucket->configs['flvtoolpp']; + $this->mplayerpath = $Cbucket->configs['mplayerpath']; + $this->input_file = $file; + + } + + + /** + * Prepare file to be converted + * this will first get info of the file + * and enter its info into database + */ + function prepare($file=NULL) + { + global $db; + + if($file) + $this->input_file = $file; + + if(file_exists($this->input_file)) + $this->input_file = $this->input_file; + else + $this->input_file = TEMP_DIR.'/'.$this->input_file; + + + + //Checking File Exists + if(!file_exists($this->input_file)) + { + $this->log('File Exists','No'); + }else{ + $this->log('File Exists','Yes'); + } + + //Get File info + $this->input_details = $this->get_file_info(); + + //Loging File Details + $this->log .= "\nPreparing file...\n"; + $this->log_file_info(); + + //Insert Info into database + //$this->insert_data(); + + //Gett FFMPEG version + $result = shell_output(FFMPEG_BINARY." -version"); + $version = parse_version('ffmpeg',$result); + + + $this->vconfigs['map_meta_data'] = 'map_meta_data'; + + if(strstr($version,'Git')) + { + $this->vconfigs['map_meta_data'] = 'map_metadata'; + } + + } + + + /** + * Function used to convert video + */ + function convert($file=NULL,$for_iphone=false) + { + global $db; + if($file) + $this->input_file = $file; + + $this->log .= "\r\nConverting Video\r\n"; + + + $p = $this->configs; + $i = $this->input_details; + + # Prepare the ffmpeg command to execute + if(isset($p['extra_options'])) + $opt_av .= " -y {$p['extra_options']} "; + + # file format + if(isset($p['format'])) + $opt_av .= " -f {$p['format']} "; + + # video codec + if(isset($p['video_codec'])) + $opt_av .= " -vcodec ".$p['video_codec']; + elseif(isset($i['video_codec'])) + $opt_av .= " -vcodec ".$i['video_codec']; + if($p['video_codec'] == 'libx264') + $opt_av .= " -vpre normal "; + + # video rate + if($p['use_video_rate']) + { + if(isset($p['video_rate'])) + $vrate = $p['video_rate']; + elseif(isset($i['video_rate'])) + $vrate = $i['video_rate']; + if(isset($p['video_max_rate']) && !empty($vrate)) + $vrate = min($p['video_max_rate'],$vrate); + if(!empty($vrate)) + $opt_av .= " -r $vrate "; + } + + # video bitrate + if($p['use_video_bit_rate']) + { + if(isset($p['video_bitrate'])) + $vbrate = $p['video_bitrate']; + elseif(isset($i['video_bitrate'])) + $vbrate = $i['video_bitrate']; + if(!empty($vbrate)) + $opt_av .= " -b $vbrate "; + } + + + # video size, aspect and padding + + $this->calculate_size_padding( $p, $i, $width, $height, $ratio, $pad_top, $pad_bottom, $pad_left, $pad_right ); + $use_vf = config('use_ffmpeg_vf'); + if($use_vf=='no') + { + $opt_av .= " -s {$width}x{$height} -aspect $ratio -padcolor 000000 -padtop $pad_top -padbottom $pad_bottom -padleft $pad_left -padright $pad_right "; + }else + { + $opt_av .= "-s {$width}x{$height} -aspect $ratio -vf pad=0:0:0:0:black"; + } + + + # audio codec, rate and bitrate + if($p['use_audio_codec']) + { + if(!empty($p['audio_codec']) && $p['audio_codec'] != 'None'){ + $opt_av .= " -acodec {$p['audio_codec']}"; + } + } + + # audio bitrate + if($p['use_audio_bit_rate']) + { + if(isset($p['audio_bitrate'])) + $abrate = $p['audio_bitrate']; + elseif(isset($i['audio_bitrate'])) + $abrate = $i['audio_bitrate']; + if(!empty($abrate)) + { + $abrate_cmd = " -ab $abrate "; + $opt_av .= $abrate_cmd; + } + } + + # audio bitrate + if(!is_numeric($this->input_details['audio_rate'])) + { + + $opt_av .= " -an "; + }elseif($p['use_audio_rate']) + { + if(!$this->validChannels($this->input_details)) + { + $arate = $i['audio_rate']; + $opt_av .= $arate_cmd = " -ar $arate "; + }else + { + if(isset($p['audio_rate'])) + $arate = $p['audio_rate']; + elseif(isset($i['audio_rate'])) + $arate = $i['audio_rate']; + if(!empty($arate)) + $opt_av .= $arate_cmd = " -ar $arate "; + } + } + $tmp_file = time().RandomString(5).'.tmp'; + + //$opt_av .= '-'.$this->vconfigs['map_meta_data']." ".$this->output_file.":".$this->input_file; + + $this->raw_command = $command = $this->ffmpeg." -i ".$this->input_file." $opt_av ".$this->output_file." 2> ".TEMP_DIR."/".$tmp_file; + + //Updating DB + //$db->update($this->tbl,array('command_used'),array($command)," id = '".$this->row_id."'"); + + if(!$for_iphone) + { + $output = $this->exec($command); + if(file_exists(TEMP_DIR.'/'.$tmp_file)) + { + $output = $output ? $output : join("", file(TEMP_DIR.'/'.$tmp_file)); + unlink(TEMP_DIR.'/'.$tmp_file); + } + + + #FFMPEG GNERETAES Damanged File + #Injecting MetaData ysing FLVtool2 - you must have update version of flvtool2 ie 1.0.6 FInal or greater + if($this->flvtoolpp && file_exists($this->output_file) && @filesize($this->output_file)>0) + { + $tmp_file = time().RandomString(5).'flvtool2_output.tmp'; + $flv_cmd = $this->flvtoolpp." ".$this->output_file." ".$this->output_file." 2> ".TEMP_DIR."/".$tmp_file; + $flvtool2_output = $this->exec($flv_cmd); + if(file_exists(TEMP_DIR.'/'.$tmp_file)) + { + $flvtool2_output = $flvtool2_output ? $flvtool2_output : join("", file(TEMP_DIR.'/'.$tmp_file)); + unlink(TEMP_DIR.'/'.$tmp_file); + } + $output .= $flvtool2_output; + + }elseif($this->flvtool2 && file_exists($this->output_file) && @filesize($this->output_file)>0) + { + $tmp_file = time().RandomString(5).'flvtool2_output.tmp'; + $flv_cmd = $this->flvtool2." -U ".$this->output_file." 2> ".TEMP_DIR."/".$tmp_file; + $flvtool2_output = $this->exec($flv_cmd); + if(file_exists(TEMP_DIR.'/'.$tmp_file)) + { + $flvtool2_output = $flvtool2_output ? $flvtool2_output : join("", file(TEMP_DIR.'/'.$tmp_file)); + unlink(TEMP_DIR.'/'.$tmp_file); + } + $output .= $flvtool2_output; + } + + $this->log('Conversion Command',$command); + $this->log .="\r\n\r\nConversion Details\r\n\r\n"; + $this->log .=$output; + $this->output_details = $this->get_file_info($this->output_file); + } + + + + //Generating Mp4 for iphone + if($this->generate_iphone && $for_iphone) + { + $this->log .="\r\n\r\n== Generating Iphone Video ==\r\n\r\n"; + $tmp_file = 'iphone_log.log'; + $iphone_configs = ""; + $iphone_configs .= " -acodec libfaac "; + $iphone_configs .= " -vcodec mpeg4 "; + $iphone_configs .= " -r 25 "; + $iphone_configs .= " -b 600k "; + $iphone_configs .= " -ab 96k "; + + if($this->input_details['audio_channels']>2) + { + $arate = $i['audio_rate']; + $iphone_configs .= $arate_cmd = " -ar $arate "; + } + + $p['video_width'] = '480'; + $p['video_height'] = '320'; + + $this->calculate_size_padding( $p, $i, $width, $height, $ratio, $pad_top, $pad_bottom, $pad_left, $pad_right ); + $iphone_configs .= " -s {$width}x{$height} -aspect $ratio"; + + + $command = $this->ffmpeg." -i ".$this->input_file." $iphone_configs ".$this->raw_path."-m.mp4 2> ".TEMP_DIR."/".$tmp_file; + $this->exec($command); + + if(file_exists(TEMP_DIR.'/'.$tmp_file)) + { + $output = $output ? $output : join("", file(TEMP_DIR.'/'.$tmp_file)); + unlink(TEMP_DIR.'/'.$tmp_file); + } + + if(file_exists($this->raw_path."-m.mp4") && filesize($this->raw_path."-m.mp4")>0) + { + $this->has_mobile = 'yes'; + } + + $this->log('== iphone Conversion Command',$command); + $this->log .="\r\n\r\nConversion Details\r\n\r\n"; + $this->log .=$output; + + $this->log .="\r\n\r\n== Generating Iphone Video Ends ==\r\n\r\n"; + } + + } + + /** + * Function used to get file information using FFMPEG + * @param FILE_PATH + */ + function get_file_info( $path_source =NULL) { + + if(!$path_source) + $path_source = $this->input_file; + + # init the info to N/A + $info['format'] = 'N/A'; + $info['duration'] = 'N/A'; + $info['size'] = 'N/A'; + $info['bitrate'] = 'N/A'; + $info['video_width'] = 'N/A'; + $info['video_height'] = 'N/A'; + $info['video_wh_ratio'] = 'N/A'; + $info['video_codec'] = 'N/A'; + $info['video_rate'] = 'N/A'; + $info['video_bitrate'] = 'N/A'; + $info['video_color'] = 'N/A'; + $info['audio_codec'] = 'N/A'; + $info['audio_bitrate'] = 'N/A'; + $info['audio_rate'] = 'N/A'; + $info['audio_channels'] = 'N/A'; + $info['path'] = $path_source; + + # get the file size + $stats = @stat( $path_source ); + if( $stats === false ) + $this->log .= "Failed to stat file $path_source!\n"; + $info['size'] = (integer)$stats['size']; + $this->ffmpeg." -i $path_source -acodec copy -vcodec copy -f null /dev/null 2>&1"; + $this->raw_output = $output = $this->exec( $this->ffmpeg." -i $path_source -acodec copy -vcodec copy -y -f null /dev/null 2>&1" ); + + $this->raw_info = $info; + # parse output + if( $this->parse_format_info( $output ) === false ) + return false; + $info = $this->raw_info; + return $info; + } + + + + + + /** + * Function used to excute SHELL Scripts + */ + function exec( $cmd ) { + # use bash to execute the command + # add common locations for bash to the PATH + # this should work in virtually any *nix/BSD/Linux server on the planet + # assuming we have execute permission + //$cmd = "PATH=\$PATH:/bin:/usr/bin:/usr/local/bin bash -c \"$cmd\" "; + return shell_exec( $cmd); + } + + function pregMatch($in,$str) + { + preg_match("/$in/",$str,$args); + return $args; + } + + /** + * Author : Arslan Hassan + * parse format info + * + * output (string) + * - the ffmpeg output to be parsed to extract format info + * + * info (array) + * - see function get_encoding_progress + * + * returns: + * - (bool) false on error + * - (bool) true on success + */ + + function parse_format_info( $output ) { + $this->raw_info; + $info = $this->raw_info; + # search the output for specific patterns and extract info + # check final encoding message + if($args = $this->pregMatch( 'Unknown format', $output) ) { + $Unkown = "Unkown"; + } else { + $Unkown = ""; + } + if( $args = $this->pregMatch( 'video:([0-9]+)kB audio:([0-9]+)kB global headers:[0-9]+kB muxing overhead', $output) ) { + $video_size = (float)$args[1]; + $audio_size = (float)$args[2]; + } else { + return false; + } + + # check for last enconding update message + if($args = $this->pregMatch( '(frame=([^=]*) fps=[^=]* q=[^=]* L)?size=[^=]*kB time=([^=]*) bitrate=[^=]*kbits\/s[^=]*$', $output) ) { + $frame_count = $args[2] ? (float)ltrim($args[2]) : 0; + $duration = (float)$args[3]; + } else { + return false; + } + + + if(!$duration) + { + $duration = $this->pregMatch( 'Duration: ([0-9.:]+),', $output ); + $duration = $duration[1]; + + $duration = explode(':',$duration); + //Convert Duration to seconds + $hours = $duration[0]; + $minutes = $duration[1]; + $seconds = $duration[2]; + + $hours = $hours * 60 * 60; + $minutes = $minutes * 60; + + $duration = $hours+$minutes+$seconds; + } + + $info['duration'] = $duration; + if($duration) + { + $info['bitrate' ] = (integer)($info['size'] * 8 / 1024 / $duration); + if( $frame_count > 0 ) + $info['video_rate'] = (float)$frame_count / (float)$duration; + if( $video_size > 0 ) + $info['video_bitrate'] = (integer)($video_size * 8 / $duration); + if( $audio_size > 0 ) + $info['audio_bitrate'] = (integer)($audio_size * 8 / $duration); + # get format information + if($args = $this->pregMatch( "Input #0, ([^ ]+), from", $output) ) { + $info['format'] = $args[1]; + } + } + + # get video information + if( $args= $this->pregMatch( '([0-9]{2,4})x([0-9]{2,4})', $output ) ) { + + $info['video_width' ] = $args[1]; + $info['video_height' ] = $args[2]; + + /* if( $args[5] ) { + $par1 = $args[6]; + $par2 = $args[7]; + $dar1 = $args[8]; + $dar2 = $args[9]; + if( (int)$dar1 > 0 && (int)$dar2 > 0 && (int)$par1 > 0 && (int)$par2 > 0 ) + $info['video_wh_ratio'] = ( (float)$dar1 / (float)$dar2 ) / ( (float)$par1 / (float)$par2 ); + } + + + # laking aspect ratio information, assume pixel are square + if( $info['video_wh_ratio'] === 'N/A' )*/ + $info['video_wh_ratio'] = (float)$info['video_width'] / (float)$info['video_height']; + } + + if($args= $this->pregMatch('Video: ([^ ^,]+)',$output)) + { + $info['video_codec' ] = $args[1]; + } + + # get audio information + if($args = $this->pregMatch( "Audio: ([^ ]+), ([0-9]+) Hz, ([^\n,]*)", $output) ) { + $audio_codec = $info['audio_codec' ] = $args[1]; + $audio_rate = $info['audio_rate' ] = $args[2]; + $info['audio_channels'] = $args[3]; + } + + if(!$audio_codec || !$audio_rate) + { + $args = $this->pregMatch( "Audio: ([a-zA-Z0-9]+)(.*), ([0-9]+) Hz, ([^\n,]*)", $output); + $info['audio_codec' ] = $args[1]; + $info['audio_rate' ] = $args[3]; + $info['audio_channels'] = $args[4]; + } + + + $this->raw_info = $info; + # check if file contains a video stream + return $video_size > 0; + + #TODO allow files with no video (only audio)? + #return true; + } + + /** + * Function used to insert data into database + * @param ARRAY + */ + + function insert_data() + { + global $db; + //Insert Info into database + if(is_array($this->input_details)) + { + foreach($this->input_details as $field=>$value) + { + $fields[] = 'src_'.$field; + $values[] = $value; + } + $fields[] = 'src_ext'; + $values[] = getExt($this->input_details['path']); + $fields[] = 'src_name'; + $values[] = getName($this->input_details['path']); + + $db->insert(tbl($this->tbl),$fields,$values); + $this->row_id = $db->insert_id(); + } + } + + /** + * Function used to update data of + */ + function update_data($conv_only=false) + { + global $db; + //Insert Info into database + if(is_array($this->output_details) && !$conv_only) + { + foreach($this->output_details as $field=>$value) + { + $fields[] = 'output_'.$field; + $values[] = $value; + } + $fields[] = 'file_conversion_log'; + $values[] = $this->log; + $db->update(tbl($this->tbl),$fields,$values," id = '".$this->row_id."'"); + }else + $fields[] = 'file_conversion_log'; + $values[] = $this->log; + $db->update(tbl($this->tbl),$fields,$values," id = '".$this->row_id."'"); + } + + + /** + * Function used to add log in log var + */ + function log($name,$value) + { + $this->log .= $name.' : '.$value."\r\n"; + } + + /** + * Function used to start log + */ + function start_log() + { + $this->log = "Started on ".NOW()." - ".date("Y M d")."\r\n\n"; + $this->log .= "Checking File ....\r\n"; + $this->log('File',$this->input_file); + } + + /** + * Function used to log video info + */ + function log_file_info() + { + $details = $this->input_details; + if(is_array($details)) + { + foreach($details as $name => $value) + { + $this->log($name,$value); + } + }else{ + $this->log .=" Unknown file details - Unable to get video details using FFMPEG \n"; + } + } + /** + * Function log outpuit file details + */ + function log_ouput_file_info() + { + $details = $this->output_details; + if(is_array($details)) + { + foreach($details as $name => $value) + { + $this->log('output_'.$name,$value); + } + }else{ + $this->log .=" Unknown file details - Unable to get output video details using FFMPEG \n"; + } + } + + + + + /** + * Function used to time check + */ + function time_check() + { + $time = microtime(); + $time = explode(' ',$time); + $time = $time[1]+$time[0]; + return $time; + } + + /** + * Function used to start timing + */ + function start_time_check() + { + $this->start_time = $this->time_check(); + } + + /** + * Function used to end timing + */ + function end_time_check() + { + $this->end_time = $this->time_check(); + } + + /** + * Function used to check total time + */ + function total_time() + { + $this->total_time = round(($this->end_time-$this->start_time),4); + } + + + /** + * Function used to calculate video padding + */ + function calculate_size_padding( $parameters, $source_info, & $width, & $height, & $ratio, & $pad_top, & $pad_bottom, & $pad_left, & $pad_right ) + { + $p = $parameters; + $i = $source_info; + + switch( $p['resize'] ) { + # dont resize, use same size as source, and aspect ratio + # WARNING: some codec will NOT preserve the aspect ratio + case 'no': + $width = $i['video_width' ]; + $height = $i['video_height' ]; + $ratio = $i['video_wh_ratio']; + $pad_top = 0; + $pad_bottom = 0; + $pad_left = 0; + $pad_right = 0; + break; + # resize to parameters width X height, use same aspect ratio + # WARNING: some codec will NOT preserve the aspect ratio + case 'WxH': + $width = $p['video_width' ]; + $height = $p['video_height' ]; + $ratio = $i['video_wh_ratio']; + $pad_top = 0; + $pad_bottom = 0; + $pad_left = 0; + $pad_right = 0; + break; + # make pixel square + # reduce video size if bigger than p[width] X p[height] + # and preserve aspect ratio + case 'max': + $width = (float)$i['video_width' ]; + $height = (float)$i['video_height' ]; + $ratio = (float)$i['video_wh_ratio']; + $max_width = (float)$p['video_width' ]; + $max_height = (float)$p['video_height' ]; + + # make pixels square + if( $ratio > 1.0 ) + $width = $height * $ratio; + else + $height = @$width / $ratio; + + # reduce width + if( $width > $max_width ) { + $r = $max_width / $width; + $width *= $r; + $height *= $r; + } + + # reduce height + if( $height > $max_height ) { + $r = $max_height / $height; + $width *= $r; + $height *= $r; + } + + # make size even (required by many codecs) + $width = (integer)( ($width + 1 ) / 2 ) * 2; + $height = (integer)( ($height + 1 ) / 2 ) * 2; + # no padding + $pad_top = 0; + $pad_bottom = 0; + $pad_left = 0; + $pad_right = 0; + break; + # make pixel square + # resize video to fit inside p[width] X p[height] + # add padding and preserve aspect ratio + case 'fit': + # values need to be multiples of 2 in the end so + # divide width and height by 2 to do the calculation + # then multiply by 2 in the end + $ratio = (float)$i['video_wh_ratio']; + $width = (float)$i['video_width' ] / 2; + $height = (float)$i['video_height' ] / 2; + $trt_width = (float)$p['video_width' ] / 2; + $trt_height = (float)$p['video_height' ] / 2; + + # make pixels square + if( $ratio > 1.0 ) + $width = $height * $ratio; + else + $height = $width / $ratio; + + # calculate size to fit + $ratio_w = $trt_width / $width; + $ratio_h = $trt_height / $height; + + if( $ratio_h > $ratio_w ) { + $width = (integer)$trt_width; + $height = (integer)($width / $ratio); + } else { + $height = (integer)$trt_height; + $width = (integer)($height * $ratio); + } + + # calculate padding + $pad_top = (integer)(($trt_height - $height + 1) / 2); + $pad_left = (integer)(($trt_width - $width + 1) / 2); + $pad_bottom = (integer)($trt_height - $height - $pad_top ); + $pad_right = (integer)($trt_width - $width - $pad_left); + + # multiply by 2 to undo division and get multiples of 2 + $width *= 2; + $height *= 2; + $pad_top *= 2; + $pad_left *= 2; + $pad_bottom *= 2; + $pad_right *= 2; + break; + } + } + + + /** + * this will first check if there is a conversion lock or no + * if there is a lock then wait till its delete otherwise create a lock and move forward + */ + function isLocked($num=1) + { + for($i=0;$i<$num;$i++) + { + $conv_file = TEMP_DIR.'/conv_lock'.$i.'.loc'; + if(!file_exists($conv_file)) + { + $this->lock_file = $conv_file; + $file = fopen($conv_file,"w+"); + fwrite($file,"converting.."); + fclose($file); + return false; + } + } + + return true; + } + + /** + * Function used to perform all actions when converting a video + */ + function ClipBucket() + { + $conv_file = TEMP_DIR.'/conv_lock.loc'; + //We will now add a loop + //that will check weather + + while(1) + { + $use_crons = config('use_crons'); + if(!$this->isLocked(PROCESSESS_AT_ONCE) || $use_crons=='yes' || !$this->set_conv_lock) + { + + if($use_crons=='no') + { + //Lets make a file + $file = fopen($conv_file,"w+"); + fwrite($file,"converting.."); + fclose($file); + } + + + $this->start_time_check(); + $this->start_log(); + $this->prepare(); + + $ratio = substr($this->input_details['video_wh_ratio'],0,3); + + $max_duration = config('max_video_duration') * 60; + + if($this->input_details['duration']>$max_duration) + { + $this->log .= "Video duration was ".$this->input_details['duration']." and Max video duration is $max_duration +
    Therefore Video cancelled"; + $this->log("conversion_status","failed"); + $this->log("failed_reason","max_duration"); + $this->create_log_file(); + + if($this->lock_file && file_exists($this->lock_file)) + unlink($this->lock_file); + + $this->failed_reason = 'max_duration'; + + break; + return false; + } + + if($ratio=='1.7' || $ratio=='1.6') + { + $res = $this->configs['res169']; + }else + { + $res = $this->configs['res43']; + } + + $nr = $this->configs['normal_res']; + /*Added by Hassan Baryar bug#268 **/ + if($nr=='320') + $nr='360'; + /*End*/ + $hr = $this->configs['high_res']; + $this->configs['video_width'] = $res[$nr][0]; + $this->configs['video_height'] = $res[$nr][1]; + $this->configs['hq_video_width'] = $res[$hr][0]; + $this->configs['hq_video_height'] = $res[$hr][1]; + + + $this->convert(); + if($this->generate_iphone) + $this->convert(NULL,true); + $this->end_time_check(); + $this->total_time(); + + //Copying File To Original Folder + if($this->keep_original=='yes') + { + $this->log .= "\r\nCopy File to original Folder"; + if(copy($this->input_file,$this->original_output_path)) + $this->log .= "\r\nFile Copied to original Folder..."; + else + $this->log .= "\r\nUnable to copy file to original folder..."; + } + + $this->output_details = $this->get_file_info($this->output_file); + $this->log .= "\r\n\r\n"; + $this->log_ouput_file_info(); + $this->log .= "\r\n\r\nTime Took : "; + $this->log .= $this->total_time.' seconds'."\r\n\r\n"; + + //$this->update_data(); + + $th_dim = $this->thumb_dim; + $big_th_dim = $this->big_thumb_dim ; + + //Generating Thumb + if($this->gen_thumbs) + $this->generate_thumbs($this->input_file,$this->input_details['duration'],$th_dim,$this->num_of_thumbs); + if($this->gen_big_thumb) + $this->generate_thumbs($this->input_file,$this->input_details['duration'],$big_th_dim,$this->num_of_thumbs,NULL,true); + + if(!file_exists($this->output_file)) + $this->log("conversion_status","failed"); + else + $this->log("conversion_status","completed"); + + $this->create_log_file(); + + if($this->lock_file && file_exists($this->lock_file)) + unlink($this->lock_file); + + break; + }else + { + if($use_crons=='no') + sleep(10); + else + break; + } + } + + } + + + + /** + * Function used to generate video thumbnails + */ + function generate_thumbs($input_file,$duration,$dim='120x90',$num=3,$rand=NULL,$is_big=false) + { + $tmpDir = TEMP_DIR.'/'.getName($input_file); + mkdir($tmpDir,0777); + + $output_dir = THUMBS_DIR; + $dimension = ''; + + $big = ""; + + if($is_big=='big') + { + $big = 'big-'; + } + + if($num > 1 && $duration > 14) + { + $duration = $duration - 5; + $division = $duration / $num; + $count=1; + + + for($id=3;$id<=$duration;$id++) + { + $file_name = getName($input_file)."-{$big}{$count}.jpg"; + $file_path = THUMBS_DIR.'/'.$file_name; + + $id = $id + $division - 1; + if($rand != "") { + $time = $this->ChangeTime($id,1); + } elseif($rand == "") { + $time = $this->ChangeTime($id); + } + + if($dim!='original') + { + $dimension = " -s $dim "; + $mplayer_dim = "-vf scale=$width:$height"; + } + + if(USE_MPLAYER && $this->mplayer) + $command = $this->mplayer." '$input_file' -ss $time -frames 1 -nosound $mplayer_dim -vo jpeg:quality=100:outdir='$tmpDir'"; + else + $command = $this->ffmpeg." -i $input_file -an -ss $time -an -r 1 $dimension -y -f image2 -vframes 1 $file_path "; + + $this->exec($command); + + //checking if file exists in temp dir + if(file_exists($tmpDir.'/00000001.jpg')) + { + rename($tmpDir.'/00000001.jpg',THUMBS_DIR.'/'.$file_name); + } + $count = $count+1; + } + }else{ + + $file_name = getName($input_file)."-{$big}%d.jpg"; + $file_path = THUMBS_DIR.'/'.$file_name; + $command = $this->ffmpeg." -i $input_file -an -s $dim -y -f image2 -vframes $num $file_path "; + $this->exec($command); + } + + rmdir($tmpDir); + + } + + + + /** + * Function used to convert seconds into proper time format + * @param : INT duration + * @parma : rand + */ + + function ChangeTime($duration, $rand = "") { + if($rand != "") { + if($duration / 3600 > 1) { + $time = date("H:i:s", $duration - rand(0,$duration)); + } else { + $time = "00:"; + $time .= date("i:s", $duration - rand(0,$duration)); + } + return $time; + } elseif($rand == "") { + if($duration / 3600 > 1 ) { + $time = date("H:i:s",$duration); + } else { + $time = "00:"; + $time .= date("i:s",$duration); + } + return $time; + } + } + + + /** + * Function used to convert video in HD format + * @ Author : Arslan Hassan + * @ Software : ClipBucket + * @license : AAL + */ + + function convert_to_hd($input=NULL,$output=NULL,$p=NULL,$i=NULL) + { + global $db; + if(!$input) + $input = $this->input_file; + if(!$output) + $output = $this->hq_output_file; + if(!$p) + $p = $this->configs; + + if(!$i) + $i = $this->input_details; + $convert = true; + //Checkinf for HD or Not + $opt_av = ''; + + $type = 'HD'; + + if($convert) + { + $total_dims = count($widths); + + //Checking wich dimension is suitable for the video + for($id=0;$id<=$total_dims;$id++) + { + $cur_dim = $widths[$id]; + $next_dim = $widths[$id+1]; + $iwidth = $i['video_width']; + + if($iwidth==$cur_dim || ($iwidth>$cur_dim && $iwidth<$next_dim)) + { + $key = $id; + $out_width = $widths[$id]; + $out_height = $heights[$id]; + break; + } + } + $p['video_width' ] = $p['hq_video_width']; + $p['video_height' ] = $p['hq_video_height']; + $p['resize'] = 'WxH'; + + $output_file = $this->hq_output_file; + + # video rate + if($p['use_video_rate']) + { + if(isset($p['video_rate'])) + $vrate = $p['video_rate']; + elseif(isset($i['video_rate'])) + $vrate = $i['video_rate']; + if(isset($p['video_max_rate']) && !empty($vrate)) + $vrate = min($p['video_max_rate'],$vrate); + if(!empty($vrate)) + $opt_av .= " -r $vrate "; + } + + # video bitrate + if($p['use_audio_bit_rate']) + { + if(isset($p['audio_bitrate'])) + $abrate = $p['audio_bitrate']; + elseif(isset($i['audio_bitrate'])) + $abrate = $i['audio_bitrate']; + if(!empty($abrate)) + { + $abrate = min(320,$abrate); + $abrate_cmd = " -ab ".$abrate."k"; + + } + } + + # audio bitrate + if($p['use_audio_rate']) + { + if($this->input_details['audio_channels']>2 || !is_numeric($this->input_details['audio_channels'])) + { + $arate = $i['audio_rate']; + $opt_av .= $arate_cmd = " -ar $arate "; + }else + { + if(isset($p['audio_rate'])) + $arate = $p['audio_rate']; + elseif(isset($i['audio_rate'])) + $arate = $i['audio_rate']; + if(!empty($arate)) + $opt_av .= $arate_cmd = " -ar $arate "; + } + } + + $this->calculate_size_padding( $p, $i, $width, $height, $ratio, $pad_top, $pad_bottom, $pad_left, $pad_right ); + $dimensions = "-s {$width}x{$height} -aspect $ratio "; + + + $command = $this->ffmpeg." -i ".$this->input_file." $opt_av $dimensions -acodec libfaac -vcodec libx264 -vpre hq -crf 22 -threads 0 ".$this->hq_output_file." 2> ".TEMP_DIR."/output.tmp "; + + + if(KEEP_MP4_AS_IS=="yes" && getExt($this->input_file)=='mp4') + copy($this->input_file,$this->hq_output_file); + else + $output = $this->exec($command); + + if(file_exists(TEMP_DIR.'/output.tmp')) + { + $output = $output ? $output : join("", file(TEMP_DIR.'/output.tmp')); + unlink(TEMP_DIR.'/output.tmp'); + } + + $this->log .= "\r\n\r\n\n=========STARTING $type CONVERSION==============\r\n\r\n\n"; + $this->log("$type Video -- Conversion Command",$command); + $this->log .="\r\n\r\nConversion Details\r\n\r\n"; + $this->log .= $output; + $this->log .= "\r\n\r\n\n=========ENDING $type CONVERSION==============\n\n"; + + /** + * Mp4 files are mostly not converted properly + * we have to use Mp4box in order + * to play them in regular manner, otherwise Flash players will + * load whole video before playing it + */ + $mp4_output = ""; + $command = $this->mp4box." -inter 0.5 ".$this->hq_output_file." -tmp ".$this->tmp_dir." 2> ".TEMP_DIR."/mp4_output.tmp "; + $mp4_output .= $this->exec($command); + if(file_exists(TEMP_DIR.'/mp4_output.tmp')) + { + $mp4_output = $mp4_output ? $mp4_output : join("", file(TEMP_DIR.'/mp4_output.tmp')); + unlink(TEMP_DIR.'/mp4_output.tmp'); + } + $ouput .= $mp4_output; + + $this->log .= "\r\n\r\n\n=========STARTING $type META DATA REPARING==============\r\n\r\n\n"; + $this->log("$type Video -- Conversion Command",$command); + $this->log .="\r\n\r\nConversion Details\r\n\r\n"; + $this->log .= $output; + $this->log .= "\r\n\r\n\n=========ENDING $type META DATA REPARING==============\n\n"; + + $fields = array('file_conversion_log',strtolower($type)); + $values = array(mysql_clean($this->log),'yes'); + //$db->update($this->tbl,$fields,$values," id = '".$this->row_id."'"); + $this->create_log_file(); + return true; + }else + return false; + } + + /** + * Function used to create log for a file + */ + function create_log_file() + { + $file = $this->log_file; + $data = $this->log; + $fo = fopen($file,"w"); + if($fo) + { + fwrite($fo,$data); + } + } + + + /** + * validating video channels + */ + + function validChannels($in) + { + if(!$in) + return true; + $in['audio_channels'] = strtolower($in['audio_channels']); + $channels = false; + if(is_numeric($in['audio_channels'])) + $channels = $in['audio_channels']; + else + { + if(strstr($in['audio_channels'],'stereo')) + $channels = 2; + + if(strstr($in['audio_channels'],'mono')) + $channels = 1; + + if(!$channels) + { + preg_match('/([0-9.]+)/',$in['audio_channels'],$matches); + if($matches) + $channels = $matches[1]; + } + } + + if(!$channels) + return true; + elseif($channels>2) + return false; + else + return true; + } +} +?> \ No newline at end of file diff --git a/upload/includes/classes/curl/class.curl.php b/upload/includes/classes/curl/class.curl.php new file mode 100644 index 00000000..4eff0b34 --- /dev/null +++ b/upload/includes/classes/curl/class.curl.php @@ -0,0 +1,547 @@ +m_header['Set-Cookie'][0] and ...[1] + * + * @access private + * @var mixed + */ + + var $m_header ; + + /** + * Current setting of the curl options. + * + * @access private + * @var mixed + */ + + var $m_options ; + + /** + * Status information for the last executed http request. Includes the errno and error + * in addition to the information returned by curl_getinfo. + * + * The keys defined are those returned by curl_getinfo with two additional + * ones specified, 'error' which is the value of curl_error and 'errno' which + * is the value of curl_errno. + * + * @link http://www.php.net/curl_getinfo + * @link http://www.php.net/curl_errno + * @link http://www.php.net/curl_error + * @access private + * @var mixed + */ + + var $m_status ; + + /** + * Collection of headers when curl follows redirections as per CURLOPTION_FOLLOWLOCATION. + * The collection includes the headers of the final page too. + * + * @access private + * @var array + */ + + var $m_followed ; + + /** + * curl class constructor + * + * Initializes the curl class for it's default behavior: + * o no HTTP headers. + * o return the transfer as a string. + * o URL to access. + * By default, the curl class will simply read the URL provided + * in the constructor. + * + * @link http://www.php.net/curl_init + * @param string $theURL [optional] the URL to be accessed by this instance of the class. + */ + + var $file_size; + + function curl($theURL=null) + { + if (!function_exists('curl_init')) + { + trigger_error('PHP was not built with --with-curl, rebuild PHP to use the curl class.', + E_USER_ERROR) ; + } + + $this->m_handle = curl_init() ; + + $this->m_caseless = null ; + $this->m_header = null ; + $this->m_options = null ; + $this->m_status = null ; + $this->m_followed = null ; + + if (!empty($theURL)) + { + $this->setopt(CURLOPT_URL, $theURL) ; + } + $this->setopt(CURLOPT_HEADER, false) ; + $this->setopt(CURLOPT_RETURNTRANSFER, true) ; + $this->file_size = $this->remote_filesize($theURL); + } + + /** + * Free the resources associated with the curl session. + * + * @link http://www.php.net/curl_close + */ + + function close() + { + curl_close($this->m_handle) ; + $this->m_handle = null ; + } + + /** + * Execute the curl request and return the result. + * + * @link http://www.php.net/curl_exec + * @link http://www.php.net/curl_getinfo + * @link http://www.php.net/curl_errno + * @link http://www.php.net/curl_error + * @return string The contents of the page (or other interaction as defined by the + * settings of the various curl options). + */ + + function exec() + { + $theReturnValue = curl_exec($this->m_handle) ; + + $this->m_status = curl_getinfo($this->m_handle) ; + $this->m_status['errno'] = curl_errno($this->m_handle) ; + $this->m_status['error'] = curl_error($this->m_handle) ; + + // + // Collect headers espesically if CURLOPT_FOLLOWLOCATION set. + // Parse out the http header (from last one if any). + // + + $this->m_header = null ; + + // + // If there has been a curl error, just return a null string. + // + + if ($this->m_status['errno']) + { + return '' ; + } + + if ($this->getOption(CURLOPT_HEADER)) + { + + $this->m_followed = array() ; + $rv = $theReturnValue ; + + while (count($this->m_followed) <= $this->m_status['redirect_count']) + { + $theArray = preg_split("/(\r\n){2,2}/", $rv, 2) ; + + $this->m_followed[] = $theArray[0] ; + + $rv = $theArray[1] ; + } + + $this->parseHeader($theArray[0]) ; + + return $theArray[1] ; + } + else + { + return $theReturnValue ; + } + } + + /** + * Returns the parsed http header. + * + * @param string $theHeader [optional] the name of the header to be returned. + * The name of the header is case insensitive. If + * the header name is omitted the parsed header is + * returned. If the requested header doesn't exist + * false is returned. + * @returns mixed + */ + + function getHeader($theHeader=null) + { + // + // There can't be any headers to check if there weren't any headers + // returned (happens in the event of errors). + // + + if (empty($this->m_header)) + { + return false ; + } + + if (empty($theHeader)) + { + return $this->m_header ; + } + else + { + $theHeader = strtoupper($theHeader) ; + if (isset($this->m_caseless[$theHeader])) + { + return $this->m_header[$this->m_caseless[$theHeader]] ; + } + else + { + return false ; + } + } + } + + /** + * Returns the current setting of the request option. If no + * option has been set, it return null. + * + * @param integer the requested CURLOPT. + * @returns mixed + */ + + function getOption($theOption) + { + if (isset($this->m_options[$theOption])) + { + return $this->m_options[$theOption] ; + } + + return null ; + } + + /** + * Did the last curl exec operation have an error? + * + * @return mixed The error message associated with the error if an error + * occurred, false otherwise. + */ + + function hasError() + { + if (isset($this->m_status['error'])) + { + return (empty($this->m_status['error']) ? false : $this->m_status['error']) ; + } + else + { + return false ; + } + } + + /** + * Parse an HTTP header. + * + * As a side effect it stores the parsed header in the + * m_header instance variable. The header is stored as + * an associative array and the case of the headers + * as provided by the server is preserved and all + * repeated headers (pragma, set-cookie, etc) are grouped + * with the first spelling for that header + * that is seen. + * + * All headers are stored as if they COULD be repeated, so + * the headers are really stored as an array of arrays. + * + * @param string $theHeader The HTTP data header. + */ + + function parseHeader($theHeader) + { + $this->m_caseless = array() ; + + $theArray = preg_split("/(\r\n)+/", $theHeader) ; + + // + // Ditch the HTTP status line. + // + + if (preg_match('/^HTTP/', $theArray[0])) + { + $theArray = array_slice($theArray, 1) ; + } + + foreach ($theArray as $theHeaderString) + { + $theHeaderStringArray = preg_split("/\s*:\s*/", $theHeaderString, 2) ; + + $theCaselessTag = strtoupper($theHeaderStringArray[0]) ; + + if (!isset($this->m_caseless[$theCaselessTag])) + { + $this->m_caseless[$theCaselessTag] = $theHeaderStringArray[0] ; + } + + $this->m_header[$this->m_caseless[$theCaselessTag]][] = $theHeaderStringArray[1] ; + } + } + + /** + * Return the status information of the last curl request. + * + * @param string $theField [optional] the particular portion + * of the status information desired. + * If omitted the array of status + * information is returned. If a non-existant + * status field is requested, false is returned. + * @returns mixed + */ + + function getStatus($theField=null) + { + if (empty($theField)) + { + return $this->m_status ; + } + else + { + if (isset($this->m_status[$theField])) + { + return $this->m_status[$theField] ; + } + else + { + return false ; + } + } + } + + /** + * Set a curl option. + * + * @link http://www.php.net/curl_setopt + * @param mixed $theOption One of the valid CURLOPT defines. + * @param mixed $theValue the value of the curl option. + */ + + function setopt($theOption, $theValue) + { + curl_setopt($this->m_handle, $theOption, $theValue) ; + $this->m_options[$theOption] = $theValue ; + } + + /** + * @desc Post string as an array + * @param string by reference data to be written. + * @return array hash containing the post string as individual elements, urldecoded. + * @access public + */ + + function &fromPostString(&$thePostString) + { + $return = array() ; + $fields = explode('&', $thePostString) ; + foreach($fields as $aField) + { + $xxx = explode('=', $aField) ; + $return[$xxx[0]] = urldecode($xxx[1]) ; + } + + return $return ; + } + + /** + * Arrays are walked through using the key as a the name. Arrays + * of Arrays are emitted as repeated fields consistent with such things + * as checkboxes. + * + * @desc Return data as a post string. + * @param mixed by reference data to be written. + * @param string [optional] name of the datum. + * @access public + */ + + function &asPostString(&$theData, $theName = NULL) + { + $thePostString = '' ; + $thePrefix = $theName ; + + if (is_array($theData)) + { + foreach ($theData as $theKey => $theValue) + { + if ($thePrefix === NULL) + { + $thePostString .= '&' . curl::asPostString($theValue, $theKey) ; + } + else + { + $thePostString .= '&' . curl::asPostString($theValue, $thePrefix . '[' . $theKey . ']') ; + } + } + } + else + { + $thePostString .= '&' . urlencode((string)$thePrefix) . '=' . urlencode($theData) ; + } + + $xxx =& substr($thePostString, 1) ; + + return $xxx ; + } + + /** + * Returns the followed headers lines, including the header of the retrieved page. + * Assumed preconditions: CURLOPT_HEADER and expected CURLOPT_FOLLOWLOCATION set. + * The content is returned as an array of headers of arrays of header lines. + * + * @param none. + * @returns mixed an empty array implies no headers. + * @access public + */ + + function getFollowedHeaders() + { + $theHeaders = array() ; + if ($this->m_followed) + { + foreach ( $this->m_followed as $aHeader ) + { + $theHeaders[] = explode( "\r\n", $aHeader ) ; + } ; + return $theHeaders ; + } + + return $theHeaders ; + } + + + + function remote_filesize($url, $user = "", $pw = "") + { + ob_start(); + $ch = curl_init($url); + curl_setopt($ch, CURLOPT_HEADER, 1); + curl_setopt($ch, CURLOPT_NOBODY, 1); + + if(!empty($user) && !empty($pw)) + { + $headers = array('Authorization: Basic ' . base64_encode("$user:$pw")); + curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); + } + + $ok = curl_exec($ch); + curl_close($ch); + $head = ob_get_contents(); + ob_end_clean(); + + $regex = '/Content-Length:\s([0-9].+?)\s/'; + $count = preg_match($regex, $head, $matches); + + return isset($matches[1]) ? $matches[1] : "unknown"; + } +} +?> diff --git a/upload/includes/classes/errorhandler.class.php b/upload/includes/classes/errorhandler.class.php new file mode 100644 index 00000000..a86a0ce9 --- /dev/null +++ b/upload/includes/classes/errorhandler.class.php @@ -0,0 +1,148 @@ +error_list[] = $message; + } + + + /** + * Function usd to add new warning + */ + function add_warning($message=NULL,$id=NULL) + { + $this->warning_list[] = $message; + } + + /** + * Function used to get error list + */ + + function error_list() + { + return $this->error_list; + } + + /** + * Function used to flush errors + */ + function flush_error() + { + $this->error_list = ''; + } + + /** + * Functio nused to add message_list + */ + function add_message($message=NULL,$id=NULL) + { + global $ignore_cb_errors; + //if id is set, error will be generated from error message list + if(!$ignore_cb_errors) + $this->message_list[] = $message; + } + + /** + * Function used to get message list + */ + function message_list() + { + return $this->message_list; + } + + /** + * Function used to flush message + */ + function flush_msg() + { + $this->message_list = ''; + } + + /** + * Function used to flush warning + */ + function flush_warning() + { + $this->warning_list = ''; + } + + /** + * Function used to flush , both message and error + */ + function flush() + { + $this->flush_msg(); + $this->flush_error(); + $this->flush_warning(); + } + + /** + * Function used to add error or either message using simple + * and small object + * @param : message, @param :type,@param:id + */ + function e($message=NULL,$type='e',$id=NULL) + { + + switch($type) + { + case 'm': + case 1: + case 'msg': + case 'message': + $this->add_message($message,$id); + break; + + case 'e': + case 'err': + case 'error': + default: + $this->add_error($message,$id); + break; + + case 'w': + case 2: + case 'war': + case 'warning': + { + $this->add_warning($message,$id); + } + break; + + default: + $this->error_list($message,$id); + break; + } + + return $message; + } + +} + + +?> \ No newline at end of file diff --git a/upload/includes/classes/form.class.php b/upload/includes/classes/form.class.php new file mode 100644 index 00000000..eb2b1f84 --- /dev/null +++ b/upload/includes/classes/form.class.php @@ -0,0 +1,445 @@ + +* @LINK : http://arslan.labguru.com/ - http://clip-bucket.com/ +* @License : Attribution Assurance License -- http://www.opensource.org/licenses/attribution.php +* @DATE : Feb 21 2009 +* @Version : 1.2 +* @CB Version : v2 +* @Class : formObj +*/ + +if(!function_exists('escape_quotes')) +{ + function escape_quotes($text) + { + $text = str_replace("\"", """, $text); + $text = str_replace("'", "'", $text); + return $text; + } +} +class formObj +{ + + var $multi_cat_id = 0; + + /** + * FUNCTION USED TO CREATE TEXT FIELD + */ + function createField($field,$multi=FALSE) + { + $field['sep'] = $field['sep'] ? $field['sep'] : '
    '; + + switch($field['type']) + { + case 'textfield': + case 'password': + case 'textarea': + $fields=$this->createTextfield($field,$multi); + break; + case 'checkbox': + $fields=$this->createCheckBox($field,$multi); + break; + case 'radiobutton': + $fields=$this->createRadioButton($field,$multi); + break; + case 'dropdown': + $fields=$this->createDropDown($field,$multi); + break; + + + } + return $fields; + } + + + /** + * FUNCTION USED TO CREATE TEXT FIELD + * @param name + * @param id + * @param value + * @param class + * @param extra_tags + * @param label + */ + function createTextfield($field,$multi=FALSE) + { + + //Starting Text Field + if($field['type']=='textfield') + $textField = ''; + else + $formTextField = $textField; + + return $formTextField; + + } + + + /** + * FUNCTION USED TO CREATE CHECK BOXES + * @param name + * @param id + * @param value = array('value'=>'name') + * @param class + * @param extra_tags + * @param label + */ + function createCheckBox($field,$multi=FALSE) + { + //First Checking if value is CATEGORY + if($field['value'][0]=='category') + { + $values_array = $field['value'][1][0]; + //$field['value'] = ''; + //Generate Category list + $type = $field['category_type'] ? $field['category_type'] : 'video'; + + $catArray = getCategoryList(array("type"=>$type)); + + if(is_array($catArray)) + { + $this->multi_cat_id = $this->multi_cat_id + 1; + $params['categories'] = $catArray; + $params['field'] = $field; + if(config('show_collapsed_checkboxes') == 1) + $params['collapsed'] = true; + $this->listCategoryCheckBox($params,$multi); + return false; + }else + return "There is no category to select"; + + + } + $arrayName = $this->rmBrackets($field['name']); + //Creating Fields + + if($multi) + { + global $multi_cat_id; + @$multi_cat_id++; + } + + $count=0; + foreach($field['value'] as $key => $value) + { + $count++; + + if(is_array($values_array)) + { + foreach($values_array as $cat_val) + { + if ($cat_val == $key || $field['checked']=='checked') + { + $checked = ' checked '; + break; + }else{ + $checked = ' '; + } + } + } + + if(!$multi) + $field_name = $field['name']; + else + { + $field_name = $field['name']; + $field_name = $this->rmBrackets($field_name); + $field_name = $field_name.$multi_cat_id.'[]'; + } + + if(!empty($field['id'])) + $field_id = ' id="'.$field['id'].'" '; + + if($count>0) + echo $field['sep']; + echo '' ; + } + } + + function listCategoryCheckBoxCollapsed($in,$multi) + { + $cats = $in['categories']; + $field = $in['field']; + $rand = (rand(0,100000)); + if($field['sep'] == "
    ") + $field['sep'] = ""; + + if(!$multi) + $fieldName = $field['name']; + else + { + $fieldName = $field['name']; + $fieldName = $this->rmBrackets($fieldName); + $fieldName = $fieldName.$multi_cat_id.'[]'; + } + $display = "none"; + $values = $field['value'][1][0]; + $Values = array(); + if(!empty($values)) + foreach($values as $val) + $Values[] = "|".$val."|"; + + if($cats) + { + $output = ""; + foreach($cats as $cat) + { + $checked = ""; + if(in_array("|".$cat['category_id']."|",$Values)) + $checked = 'checked'; + echo "
    "; + echo $field['sep']; + echo ''; + if($cat['children']) + { + echo " "; + $childField = $field; + $childField['sep'] = $field['sep'].str_repeat(' ',5); + echo "
    "; + echo $this->listCategoryCheckBoxCollapsed(array('categories'=>$cat['children'],'field'=>$childField,'children_indent'=>true),$multi); + echo "
    "; + } + echo "
    "; + } + } + } + + //Creating checkbox with indent for cateogry childs + function listCategoryCheckBox($in,$multi) + { + $cats = $in['categories']; + $field = $in['field']; + //$in['collapsed'] = true; + $collapsed = $in['collapsed']; + if($collapsed) + return $this->listCategoryCheckBoxCollapsed($in,$multi); + //setting up the field name + if(!$multi) + $field_name = $field['name']; + else + { + $field_name = $field['name']; + $field_name = $this->rmBrackets($field_name); + $field_name = $field_name.$this->multi_cat_id.'[]'; + } + + //Setting up the values + $values = $field['value'][1][0]; + $newVals = array(); + + if(!empty($values)) + foreach($values as $val) + $newVals[] = '|'.$val.'|'; + if($cats) + { + foreach($cats as $cat) + { + $checked = ''; + //checking value + if(in_array('|'.$cat['category_id'].'|',$newVals)) + $checked = 'checked'; + echo $field['sep']; + echo '' ; + if($cat['children']) + { + $childField = $field; + $childField['sep'] = $field['sep'].str_repeat(' ',5); + $this->listCategoryCheckBox(array('categories'=>$cat['children'],'field'=>$childField,'children_indent'=>true),$multi); + } + } + } + } + + + /** + * FUNCTION USED TO CREATE RADIO Button + * @param name + * @param id + * @param value = array('value'=>'name') + * @param class + * @param extra_tags + * @param label + */ + function createRadioButton($field,$multi=FALSE) + { + //Creating Fields + $count = 0; + $sep = $field['sep']; + $arrayName = $this->rmBrackets($field['name']); + foreach($field['value'] as $key => $value) + { + if(!empty($_POST[$arrayName]) || !empty($field['checked'])) + { + if ($_POST[$arrayName] == $key || $field['checked'] == $key) + { + $checked = ' checked '; + }else{ + $checked = ' '; + } + }else{ + if($count==0) + $checked = ' checked '; + else + $checked = ''; + $count++; + } + if(!empty($field['id'])) + $field_id = ' id="'.$field['id'].'" '; + + if(!$multi) + $field_name = $field['name']; + else + $field_name = $field['name'].'[]'; + + echo '' ; + echo $sep; + } + } + + /** + * FUNCTION USED TO REMOVE BRACKET FROM FROM FIELD NAME IF IT IS AN ARRAY + * @param name with brackets + * return name without brackets + */ + function rmBrackets($string) + { + $string = preg_replace('/\[\]/','',$string); + return $string; + } + + + /** + * FUNCTION USED TO CREATEA DROPDOWN MENU + * @param name + * @param id + * @param value = array('value'=>'name') + * @param class + * @param extra_tags + * @param label + */ + + function createDropDown($field,$multi=FALSE) + { + global $LANG; + + //First Checking if value is CATEGORY + if($field['value'][0]=='category') + { + $values_array = $field['value'][1][0]; + $field['value'] = ''; + //Generate Category list + $type = $field['type'] ? $field['type'] : 'video'; + $catArray = getCategoryList(array("type"=>$field['category_type'])); + foreach ($catArray as $cat) + { + $field['value'][$cat['category_id']] = $cat['category_name']; + } + } + + if(!$multi) + $field_name = $field['name']; + else + $field_name = $field['name'].'[]'; + + $ddFieldStart = ''; + echo $ddFieldStart.$fieldOpts.$ddFieldEnd; + } + + + + /** + * Form Validator + * This function used to valid form fields + */ + function validate_form($field,$method,$syntax=NULL) + { + switch($method) + { + case 'username': + $syntax = get_re('username'); + } + + } +} + + + + +?> \ No newline at end of file diff --git a/upload/includes/classes/gravatar.class.php b/upload/includes/classes/gravatar.class.php new file mode 100644 index 00000000..5335c570 --- /dev/null +++ b/upload/includes/classes/gravatar.class.php @@ -0,0 +1,191 @@ + +* $email = "youremail@yourhost.com"; +* $default = "http://www.yourhost.com/default_image.jpg"; // Optional +* $gravatar = new Gravatar($email, $default); +* $gravatar->size = 80; +* $gravatar->rating = "G"; +* $gravatar->border = "FF0000"; +* +* echo $gravatar; // Or echo $gravatar->toHTML(); +* +* +* Class Page: http://www.phpclasses.org/browse/package/4227.html +* +* @author Lucas Araújo +* @version 1.0 +* @package Gravatar +*/ +class Gravatar +{ + /** + * Gravatar's url + */ + const GRAVATAR_URL = "http://www.gravatar.com/avatar.php"; + + /** + * Ratings available + */ + private $GRAVATAR_RATING = array("G", "PG", "R", "X"); + + /** + * Query string. key/value + */ + protected $properties = array( + "gravatar_id" => NULL, + "default" => NULL, + "size" => 80, // The default value + "rating" => NULL, + "border" => NULL, + ); + + /** + * E-mail. This will be converted to md5($email) + */ + protected $email = ""; + + /** + * Extra attributes to the IMG tag like ALT, CLASS, STYLE... + */ + protected $extra = ""; + + /** + * + */ + public function __construct($email=NULL, $default=NULL) { + $this->setEmail($email); + $this->setDefault($default); + } + + /** + * + */ + public function setEmail($email) { + if ($this->isValidEmail($email)) { + $this->email = $email; + $this->properties['gravatar_id'] = md5(strtolower($this->email)); + return true; + } + return false; + } + + /** + * + */ + public function setDefault($default) { + $this->properties['default'] = $default; + } + + /** + * + */ + public function setRating($rating) { + if (in_array($rating, $this->GRAVATAR_RATING)) { + $this->properties['rating'] = $rating; + return true; + } + return false; + } + + /** + * + */ + public function setSize($size) { + $size = (int) $size; + if ($size <= 0) + $size = NULL; // Use the default size + $this->properties['size'] = $size; + } + + /** + * + */ + public function setExtra($extra) { + $this->extra = $extra; + } + + /** + * + */ + public function isValidEmail($email) { + //global $userquery; + return is_valid_syntax('email',$email); + // Source: http://www.zend.com/zend/spotlight/ev12apr.php + //return eregi("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$", $email); + } + + /** + * Object property overloading + */ + public function __get($var) { return @$this->properties[$var]; } + + /** + * Object property overloading + */ + public function __set($var, $value) { + switch($var) { + case "email": return $this->setEmail($value); + case "rating": return $this->setRating($value); + case "default": return $this->setDefault($value); + case "size": return $this->setSize($value); + // Cannot set gravatar_id + case "gravatar_id": return; + } + return @$this->properties[$var] = $value; + } + + /** + * Object property overloading + */ + public function __isset($var) { return isset($this->properties[$var]); } + + /** + * Object property overloading + */ + public function __unset($var) { return @$this->properties[$var] == NULL; } + + /** + * Get source + */ + public function getSrc() { + $url = self::GRAVATAR_URL ."?"; + $first = true; + foreach($this->properties as $key => $value) { + if (isset($value)) { + if (!$first) + $url .= "&"; + $url .= $key."=".urlencode($value); + $first = false; + } + } + return $url; + } + + /** + * toHTML + */ + public function toHTML() { + return 'size) ? "" : ' width="'.$this->size.'" height="'.$this->size.'"') + .$this->extra + .' />'; + } + + /** + * toString + */ + public function __toString() { return $this->toHTML(); } +} + +?> \ No newline at end of file diff --git a/upload/includes/classes/groups.class.php b/upload/includes/classes/groups.class.php new file mode 100644 index 00000000..e8e217a3 --- /dev/null +++ b/upload/includes/classes/groups.class.php @@ -0,0 +1,2395 @@ +cat_tbl = 'group_categories'; + $this->gp_tbl = 'groups'; + $this->gp_mem_tbl = 'group_members'; + //We will using CB Commenting system as posts + //$this->gp_post_tbl = 'group_posts'; + $this->gp_topic_tbl = 'group_topics'; + $this->gp_invite_tbl = 'group_invitations'; + $this->gp_vdo_tbl = 'group_videos'; + + //Adding Actions such Report, share,fav etc + $this->action = new cbactions(); + $this->action->type = 'g'; + $this->action->name = 'group'; + $this->action->obj_class = 'cbgroup'; + $this->action->check_func = 'group_exists'; + $this->action->type_tbl = $this->gp_tbl; + $this->action->type_id_field = 'group_id'; + + if(isSectionEnabled('groups')) + $Cbucket->search_types['groups'] = "cbgroup"; + + } + + /** + * Function used to check if the provided URL is taken or not + * @param = $url { URL of group provided by user } + */ + function group_url_exists($url) { + global $db; + $result = $db->count(tbl($this->gp_tbl),"*"," group_url='$url'"); + if($result[0]>0) + return true; + else + return false; + } + + /** + * Function used to get group details + * @param $ID { groupid } + */ + function get_group($id) + { + global $db; + $gp_details = $db->select(tbl($this->gp_tbl),"*","group_id='$id'"); + if($db->num_rows>0) { + return $gp_details[0]; + } else{ + return false; + } + } + function get_group_details($id){ return $this->get_group($id); } + function get_details($id){ return $this->get_group($id); } + + /** + * Funtion used to get gorup details + * @param, $URL { group url } + */ + function get_group_with_url($url) + { + global $db; + $gp_details = $db->select(tbl($this->gp_tbl),"*","group_url='$url'"); + if($db->num_rows>0) { + return $gp_details[0]; + } else{ + return false; + } + } + function get_group_details_with_url($id){ return $this->get_group_with_url($id); } + function get_details_with_url($id){ return $this->get_group_with_url($id); } + function group_details_url($id){ return $this->get_group_with_url($id); } + + + /** + * Function used to make user a member of group + * @param = $userid { ID of user who is going to Join Group } + * @param = $gpid { ID of group which is being joined } + */ + function join_group($gpid,$userid,$createFeed=true) { + + global $db; + + //Getting group details + $group = $this->get_group_details($gpid); + + if(!$group) + e(lang("grp_exist_error")); + elseif(!$this->is_joinable($group,$userid,TRUE)) + return false; + elseif(!$userid) + e(lang('group_join_login_err')); + else + { + if($group['group_privacy']==1 && $group['userid'] != $userid) + $active = 'no'; + else + $active = 'yes'; + + + $db->insert(tbl($this->gp_mem_tbl), + array("group_id","userid","date_added","active"), + array($gpid,$userid,now(),$active)); + + //Count total members + $total_members = $this->total_members($gpid); + + //Adding Feed + if($createFeed) + addFeed(array('action'=>'join_group','object_id' => $gpid,'object'=>'group','userid'=>$userid)); + + //Update Stats + $db->update(tbl($this->gp_tbl), + array("total_members"), + array($total_members), + "group_id='$gpid'"); + + e(lang('grp_join_msg_succ'),'m'); + } + } + + /** + * Creating Group Required Fields + */ + function load_required_fields($default=NULL,$is_update=FALSE) + { + if($default == NULL) + $default = $_POST; + + $gptitle = $default['group_name']; + $gpdescription = $default['group_description']; + + if(is_array($default['category'])) + $cat_array = array($default['category']); + else + { + preg_match_all('/#([0-9]+)#/',$default['category'],$m); + $cat_array = array($m[1]); + } + + $tags = $default['group_tags']; + $gpurl = $default['group_url']; + + + if(!$is_update) + $url_form = array( + 'title'=> lang('grp_url_title'), + 'type'=> 'textfield', + 'name'=> 'group_url', + 'id'=> 'group_url', + 'value'=> cleanForm($gpurl), + 'hint_1'=> '', + 'hint_2'=> lang('grp_url_msg'), + 'db_field'=>'group_url', + 'required'=>'yes', + 'invalid_err'=>lang('grp_url_error'), + 'syntax_type'=> 'field_text', + 'function_error_msg' => lang('user_contains_disallow_err'), + 'db_value_check_func'=> 'group_url_exists', + 'db_value_exists'=>false, + 'db_value_err'=>lang('grp_url_error2'), + 'min_length' => 3, + 'max_length' => 18, + + ); + else + $url_form = array( + 'title'=> lang('grp_url_title'), + 'type'=> 'textfield', + 'name'=> 'group_url', + 'id'=> 'group_url', + 'value'=> cleanForm($gpurl), + 'hint_1'=> '', + 'hint_2'=> lang('grp_url_msg'), + 'db_field'=>'group_url', + 'required'=>'yes', + 'invalid_err'=>lang('grp_url_error'), + 'syntax_type'=> 'field_text', + 'function_error_msg' => lang('user_contains_disallow_err'), + 'min_length' => 3, + 'max_length' => 18, + ); + + $fields = array + ( + 'name' => array( + 'title'=> lang('grp_name_title'), + 'type'=> "textfield", + 'name'=> "group_name", + 'id'=> "group_name", + 'value'=> $gptitle, + 'db_field'=>'group_name', + 'required'=>'yes', + 'invalid_err'=>lang('grp_name_error'), + 'max_length'=>config('grp_max_title') + ), + 'tags' => array( + 'title'=> lang('tag_title'), + 'type'=> 'textfield', + 'name'=> 'group_tags', + 'id'=> 'group_tags', + 'value'=> (genTags($tags)), + 'hint_1'=> '', + 'hint_2'=> lang('grp_tags_msg1'), + 'db_field'=>'group_tags', + 'required'=>'yes', + 'invalid_err'=>lang('grp_tags_error'), + 'validate_function'=>'genTags' + ), + 'desc' => array( + 'title'=> lang('vdo_desc'), + 'type'=> 'textarea', + 'name'=> 'group_description', + 'id'=> 'group_description', + 'value'=> cleanForm($gpdescription), + 'size'=>'35', + 'extra_params'=>' rows="4" ', + 'db_field'=>'group_description', + 'invalid_err'=>lang('grp_des_error'), + 'required'=>'yes', + 'max_length'=>config('grp_max_desc') + + ), + $url_form, + + 'cat' => array( + 'title'=> lang('grp_cat_tile'), + 'type'=> 'checkbox', + 'name'=> 'category[]', + 'id'=> 'category', + 'value'=> array('category',$cat_array), + 'hint_1'=> sprintf(lang('vdo_cat_msg'),ALLOWED_GROUP_CATEGORIES), + 'db_field'=>'category', + 'required'=>'yes', + 'validate_function'=>'validate_group_category', + 'invalid_err'=>lang('grp_cat_error'), + 'display_function' => 'convert_to_categories', + 'category_type'=>'group', + ), + + ); + + return $fields; + } + + + /** + * Function used to load other group option fields + */ + function load_other_fields($default=NULL) + { + global $LANG,$uploadFormOptionFieldsArray; + + + if(!$default) + $default = $_POST; + + $gpprivacy = $default['group_privacy']; + $gpposting = $default['post_type']; + + $group_option_fields = array + ( + 'privacy'=> array('title'=>lang('privacy'), + 'type'=>'radiobutton', + 'name'=>'group_privacy', + 'id'=>'group_privacy', + 'value'=>array('0'=>lang('grp_join_opt1'),'1'=>lang('grp_join_opt2'),2=>lang('grp_join_opt3')), + 'checked'=>$gpprivacy, + 'db_field'=>'group_privacy', + 'required'=>'no', + 'display_function'=>'display_sharing_opt', + ), + 'posting'=> array('title'=>lang('grp_forum_posting'), + 'type'=>'radiobutton', + 'name'=>'post_type', + 'id'=>'post_type', + 'value'=>array('0'=>lang('vdo_br_opt1'),'1'=>lang('vdo_br_opt2'),2=>lang('grp_join_opt3')), + 'checked'=>$gpposting, + 'db_field'=>'post_type', + 'required'=>'no', + 'display_function'=>'display_sharing_opt', + ), + ); + + return $group_option_fields; + } + + + /** + * Function used to validate Signup Form + */ + function validate_form_fields($array=NULL,$update=false) + { + $fields = $this->load_required_fields($array,$update); + + if($array==NULL) + $array = $_POST; + + if(is_array($_FILES)) + $array = array_merge($array,$_FILES); + + //Mergin Array + $group_fields = array_merge($fields,$this->load_other_fields()); + + validate_cb_form($group_fields,$array); + + } + + /** + * Function used to create new groups + * @Author : Fawaz Tahir, Arslan Hassan + * @Params : array { Group Input Details } + * @since : 15 December 2009 + */ + function create_group($array,$user=false,$redirect_to_group=false) + { + global $db; + if($array==NULL) + $array = $_POST; + + if(is_array($_FILES)) + $array = array_merge($array,$_FILES); + + $this->validate_form_fields($array); + + if(!error()) + { + $group_fields = $this->load_required_fields($array); + $group_fields = array_merge($group_fields,$this->load_other_fields()); + + //Adding Custom Signup Fields + if(count($this->custom_group_fields)>0) + $group_fields = array_merge($group_fields,$this->custom_group_fields); + foreach($group_fields as $field) + { + $name = formObj::rmBrackets($field['name']); + $val = $array[$name]; + + if($field['use_func_val']) + $val = $field['validate_function']($val); + + + if(!empty($field['db_field'])) + $query_field[] = $field['db_field']; + + if(is_array($val)) + { + $new_val = ''; + foreach($val as $v) + { + $new_val .= "#".$v."# "; + } + $val = $new_val; + } + if(!$field['clean_func'] || (!function_exists($field['clean_func']) && !is_array($field['clean_func']))) + $val = ($val); + else + $val = apply_func($field['clean_func'],sql_free('|no_mc|'.$val)); + + if(!empty($field['db_field'])) + $query_val[] = $val; + + } + } + + if(!error()) + { + //UID + $query_field[] = "userid"; + $query_val[] = $user; + + //DATE ADDED + $query_field[] = "date_added"; + $query_val[] = now(); + + $query_field[] = "total_members"; + $query_val[] = 1; + + //Inserting IN Database now + $db->insert(tbl($this->gp_tbl),$query_field,$query_val); + $insert_id = $db->insert_id(); + + //Owner Joiing Group + ignore_errors(); + + $db->insert(tbl($this->gp_mem_tbl), + array("group_id","userid","date_added","active"), + array($insert_id,$user,now(),'yes')); + + + //$this->join_group($insert_id,$user,false); + + //Updating User Total Groups + $this->update_user_total_groups($user); + + //Adding Feed + addFeed(array('action'=>'create_group','object_id' => $insert_id,'object'=>'group')); + + if($redirect_to_group) + { + $grp_details = $this->get_details($insert_id); + redirect_to(group_link(array('details'=>$grp_details) )); + } + + + + //loggin Upload + $log_array = array + ( + 'success'=>'yes', + 'action_obj_id' => $insert_id, + 'details'=> "created new group"); + insert_log('add_group',$log_array); + + return $insert_id; + } + } + + + /** + * Function used to update group + * @Author : Fawaz Tahir, Arslan Hassan + * @Params : array { Group Input Details } + * @since : 15 December 2009 + */ + function update_group($array=NULL) + { + global $db; + if($array==NULL) + $array = $_POST; + + if(is_array($_FILES)) + $array = array_merge($array,$_FILES); + + $this->validate_form_fields($array,true); + + $gid = $array['group_id']; + + if(!error()) + { + $group_fields = $this->load_required_fields($array); + $group_fields = array_merge($group_fields,$this->load_other_fields()); + + //Adding Custom Signup Fields + if(count($this->custom_group_fields)>0) + $group_fields = array_merge($group_fields,$this->custom_group_fields); + foreach($group_fields as $field) + { + $name = formObj::rmBrackets($field['name']); + $val = $array[$name]; + + if($field['use_func_val']) + $val = $field['validate_function']($val); + + + if(!empty($field['db_field'])) + $query_field[] = $field['db_field']; + + if(is_array($val)) + { + $new_val = ''; + foreach($val as $v) + { + $new_val .= "#".$v."# "; + } + $val = $new_val; + } + if(!$field['clean_func'] || (!function_exists($field['clean_func']) && !is_array($field['clean_func']))) + $val = ($val); + else + $val = apply_func($field['clean_func'],sql_free('|no_mc|'.$val)); + + if(!empty($field['db_field'])) + $query_val[] = $val; + + } + } + + + if(has_access('admin_access',TRUE)) + { + if(!empty($array['total_views'])) + { + $query_field[] = 'total_views'; + $query_val[] = $array['total_views']; + } + if(!empty($array['total_videos'])) + { + $query_field[] = 'total_videos'; + $query_val[] = $array['total_videos']; + } + if(!empty($array['total_members'])) + { + $query_field[] = 'total_members'; + $query_val[] = $array['total_members']; + } + if(!empty($array['total_topics'])) + { + $query_field[] = 'total_topics'; + $query_val[] = $array['total_topics']; + } + } + + //Getting Group URL value + $gp_url = $this->get_gp_field_only($gid,"group_url"); + //Checking Group URL + if($array['group_url']!=$gp_url) + if(group_url_exists($array['group_url'])) + e(lang('grp_url_error2')); + if(!error()) + { + + if(!userid()) + { + e(lang("you_not_logged_in")); + }elseif(!$this->group_exists($gid)){ + e(lang("grp_exist_error")); + }elseif(!$this->is_owner($gid,userid()) && !has_access('admin_access',TRUE)) + { + e(lang("you_cant_edit_group")); + }else{ + + $db->update(tbl($this->gp_tbl),$query_field,$query_val," group_id='$gid'"); + e(lang("grp_details_updated"),'m'); + + //Updating Group Thumb + if(!empty($array['thumb_file']['tmp_name'])) + $this->create_group_image($gid,$array['thumb_file']); + } + } + } + + + /** + * Function used to get default image for group. + */ + function get_default_thumb($size=NULL) + { + if($size=="small" && file_exists(TEMPLATEDIR.'/images/thumbs/group_thumb-small.png')) + { + return TEMPLATEURL.'/images/thumbs/group_thumb-small.png'; + }elseif(file_exists(TEMPLATEDIR.'/images/thumbs/group_thumb.png') && !$size) + { + return TEMPLATEURL.'/images/thumbs/group_thumb.png'; + }else + { + if($size=='small') + $this->get_default_thumb = GP_THUMB_URL.'/no_thumb-small.png'; + else + $this->get_default_thumb = GP_THUMB_URL.'/no_thumb.png'; + return $this->get_default_thumb; + } + } + + + /** + * Function used to create group thumbnail + * @param = $gpid {ID of group for which thumbnail is being created } + * @param = $file { Source of image file $_FILES } + */ + function create_group_image($gpid,$file) + { + global $imgObj; + $file_ext = strtolower(getext($file['name'])); + $exts = array('jpg','png','gif','jpeg'); + + foreach($exts as $ext) + { + if($ext == $file_ext) + { + $thumb_name = $gpid.'.'.$ext; + $small_thumb_name = $gpid.'-small.'.$ext; + $path = GP_THUMB_DIR.'/'.$thumb_name; + $small_path = GP_THUMB_DIR.'/'.$small_thumb_name; + foreach($exts as $unlink_ext) + if(file_exists(GP_THUMB_DIR.'/'.$gpid.'.'.$unlink_ext)) + unlink(GP_THUMB_DIR.'/'.$gpid.'.'.$unlink_ext); + + move_uploaded_file($file['tmp_name'],$path); + + if(!$imgObj->ValidateImage($path,$ext)) + e(lang('pic_upload_vali_err')); + else + { + $imgObj->CreateThumb($path,$path,$this->gp_thumb_width,$ext,$this->gp_thumb_height,true); + $imgObj->CreateThumb($path,$small_path,$this->gp_small_thumb_width,$ext,$this->gp_small_thumb_height,true); + } + } + } + } + + /** + * Function used to get group thumb. + * @param Group Details array + */ + function get_gp_thumb($grp_details,$size=NULL) + { + $exts = array('jpg','png','gif','jpeg'); + $gpid = $grp_details['group_id']; + foreach($exts as $ext) + { + if($size == 'small') + $file_size = "-small"; + + if(file_exists(GP_THUMB_DIR.'/'.$gpid."$file_size.".$ext)) + return GP_THUMB_URL.'/'.$gpid."$file_size.".$ext; + } + + return $this->get_default_thumb($size); + + } + function get_group_thumb($grp_details,$size=NULL){ return $this->get_gp_thumb($grp_details,$size); } + + /** + * function used to get group icon + */ + function get_topic_icon($topic) + { + $file = TOPIC_ICON_DIR.'/'.$topic['topic_icon']; + if(file_exists($file) && !empty($topic['topic_icon'])) + { + return TOPIC_ICON_URL.'/'.$topic['topic_icon']; + }else + return TOPIC_ICON_URL.'/dot.gif'; + } + + + /** + * Function used add new topic in group + * @param ARRAY details + */ + function add_topic($array,$redirect_to_topic=false) + { + global $db; + if($array==NULL) + $array = $_POST; + + if(is_array($_FILES)) + $array = array_merge($array,$_FILES); + + $fields = $this->load_add_topic_form_fields($array); + validate_cb_form($fields,$array); + + $user = userid(); + + if(!error()) + { + foreach($fields as $field) + { + $name = formObj::rmBrackets($field['name']); + $val = $array[$name]; + + if($field['use_func_val']) + $val = $field['validate_function']($val); + + + if(!empty($field['db_field'])) + $query_field[] = $field['db_field']; + + if(is_array($val)) + { + $new_val = ''; + foreach($val as $v) + { + $new_val .= "#".$v."# "; + } + $val = $new_val; + } + + if(!$field['clean_func'] || (!apply_func($field['clean_func'],$val) && !is_array($field['clean_func']))) + $val = $val; + else + $val = apply_func($field['clean_func'],sql_free($val)); + + if(empty($val) && !empty($field['default_value'])) + $val = $field['default_value']; + + if(!empty($field['db_field'])) + $query_val[] = $val; + + } + } + + $gp_details = $this->get_group_details($array['group_id']); + //Checking for weather user is allowed to post topics or not + $this->validate_posting_previlige($gp_details); + + if(!error()) + { + //Adding Topic icon + $query_field[] = "topic_icon"; + $query_val[] = $array['topic_icon']; + //UID + $query_field[] = "userid"; + $query_val[] = $user; + //DATE ADDED + $query_field[] = "date_added"; + $query_val[] = now(); + + $query_field[] = "last_post_time"; + $query_val[] = now(); + + //GID + $query_field[] = "group_id"; + $query_val[] = $array['group_id']; + + //Checking If posting requires approval or not + $query_field[] = "approved"; + if($gp_details['post_type']==1) + $query_val[] = "no"; + else + $query_val[] = "yes"; + + //Inserting IN Database now + $db->insert(tbl($this->gp_topic_tbl),$query_field,$query_val); + $insert_id = $db->insert_id(); + + //Increasing Group Topic Counts + $count_topics = $this->count_group_topics($array['group_id']); + $db->update(tbl($this->gp_tbl),array("total_topics"),array($count_topics)," group_id='".$array['group_id']."'"); + + //leaving msg + e(lang("grp_tpc_msg"),"m"); + + //Redirecting to topic + if($redirect_to_topic) + { + $grp_details = $this->get_details($insert_id); + redirect_to(group_link($grp_details)); + } + + return $insert_id; + + } + } + + /** + * Function used to delete group topic + */ + function delete_topic($tid) + { + global $db; + $topic = $this->get_topic_details($tid); + $group = $this->get_group_details($topic['group_id']); + if(!$topic) + e(lang("grp_tpc_err4")); + elseif(!$group) + e(lang("grp_exist_error")); + elseif(userid()!=$topic['userid'] && userid()!=$group['userid']) + e(lang("you_cant_del_topic")); + else + { + $db->delete(tbl($this->gp_topic_tbl),array("topic_id","group_id"),array($tid,$topic['group_id'])); + //Deleting Topic Posts + $this->delete_comments($tid); + + //Counting Total Topics + $count_topics = $this->count_topics($topic['group_id']); + + //Updating Total Number + $db->update(tbl($this->gp_tbl),array('total_topics'),array($count_topics)," group_id = '".$topic['group_id']."'"); + + e(lang("grp_tpc_msg1"),"m"); + } + } + + /** + * Function used to delete all user topics + */ + function delete_user_topics($uid,$gid) + { + global $db; + $group = $this->get_group_details($gid); + + if(!$group) + e(lang("grp_exist_error")); + elseif(userid()!=$group['userid'] && userid()!=$uid && !has_access('admin_access',true)) + e(lang("you_cant_del_user_topics")); + else + { + $usr_topics = $this->get_topics(array('group'=>$gid,'user'=>$uid)); + if(is_array($usr_topics)) + foreach($usr_topics as $topic) + $this->delete_topic($topic['topic_id']); + e(lang("topics_deleted"),"m"); + } + } + + + /** + * Function used to delete all group topics + */ + function delete_group_topics($gid) + { + global $db; + $group = $this->get_group_details($gid); + + if(!$group) + e(lang("grp_exist_error")); + elseif(userid()!=$group['userid'] && !has_access('admin_access',true)) + e(lang("you_cant_delete_grp_topics")); + else + { + $topics = $this->get_topics(array('group'=>$gid)); + if(is_array($topics)) + foreach($topics as $topic) + $this->delete_topic($topic['topic_id']); + e(lang("deleted"),"m"); + } + } + + + /** + * Function used to check weather posting is allowed or not + */ + function validate_posting_previlige($gdetails) + { + if(is_numeric($getails)) + $gdetails = $this->get_group_details($getails); + + if(!$gdetails || empty($gdetails['group_id'])) + e(lang("grp_exist_error")); + if(!userid()) + e(lang("grp_please_login")); + elseif(!$this->is_member(userid(),$gdetails['group_id'],TRUE)) + e(lang("you_not_grp_mem_or_approved")); + elseif($gdetails['post_type']==2 && userid() != $gdetails['userid'] && !has_access('admin_access',true)) + e(lang("you_not_allowed_post_topics")); + else + { + return true; + } + + return false; + } + + + /** + * Function used to get group topics + * INPUT Group ID + */ + function get_group_topics($params) + { + global $db; + + $gid = $params['group'] ? $params['group'] : $params; + $limit = $params['limit']; + $order = $params['order'] ? $params['order'] : " last_post_time DESC "; + + if($params['approved']) + $approved_query = " AND approved='yes' "; + if($params['user']) + $user_query = " AND userid='".$params['user']."'"; + + $results = $db->select(tbl($this->gp_topic_tbl),"*"," group_id='$gid' $approved_query $user_query",$limit,$order); + if($db->num_rows>0) + return $results; + else + return false; + } + function GetTopics($params){ return $this->get_group_topics($params); } + function get_topics($params){ return $this->get_group_topics($params); } + + /** + * Function used to check weather topic exists or not + * @param TOPIC ID {id of topic} + */ + function topic_exists($tid) + { + global $db; + $count = $db->count(tbl($this->gp_topic_tbl),'topic_id'," topic_id='$tid' "); + if($count[0]>0) + return true; + else + return false; + } + + /** + * Function used to get topic details + * @param TOPIC ID {id of topic} + */ + function get_topic_details($topic) + { + global $db; + $result = $db->select(tbl($this->gp_topic_tbl),"*"," topic_id='$topic' "); + if($db->num_rows>0) + return $result[0]; + else + return false; + } + function gettopic($topic){ return $this->get_topic_details($topic); } + function get_topic($topic){ return $this->get_topic_details($topic); } + + /** + * Function used to check weather user is invited or not + */ + function is_invited($uid,$gid,$owner,$gen_err=FALSE) + { + global $db; + $count = $db->count(tbl($this->gp_invite_tbl),'invitation_id'," invited='$uid' AND group_id='$gid' AND userid='$owner' "); + if($count[0]>0) + return true; + else + { + if($gen_err) + e(lang('grp_prvt_err1')); + return false; + } + } + function is_userinvite($uid,$gid,$owner){ return $this->is_invited($uid,$gid,$owner); } + + + /** + * Function used to check whether user is already a member or not + * @param = $user { User to check } + * @param = $gpid { ID of group in which we will check } + */ + function is_member($user,$gpid,$active=false) { + global $db; + + $active_query = ""; + if($active) + $active_query = " AND active='yes' "; + + $data = $db->count(tbl($this->gp_mem_tbl),"*","group_id='$gpid' AND userid='$user' $active_query"); + //echo $db->db_query; + if($data[0]>0) { + return true; + } else { + return false; + } + } + function joined_group($user,$gpid){return $this->is_member($user,$gpid);} + + /** + * Function use to check weather user is owner or not of the group + * @param GID {group id} + * @param UID {logged in user or just user} + */ + function is_owner($gid,$uid=NULL) + { + if(!$uid) + $uid = userid(); + + if(!is_array($gid)) + $group = $this->get_group_details($gid); + else + $group = $gid; + if($group['userid']==$uid) + return true; + else + return false; + } + + + /** + * Function used to count total number of members in a group. + * @param = $gpid { ID of group whose members are going to be counted } + */ + function total_members($gpid,$active=true) + { + global $db; + if($active) + $activeQuery = "AND active = 'yes'"; + $totalmem = $db->count(tbl("group_members"),"*","group_id='$gpid' $activeQuery"); + return $totalmem[0]; + } + + + /** + * Function used to get group members + */ + function get_members($gid,$approved=NULL,$limit=NULL) + { + global $db; + + $app_query = ""; + if($approved) + $app_query = " AND ".tbl($this->gp_mem_tbl).".active='$approved'"; + $result = $db->select(tbl($this->gp_mem_tbl)." LEFT JOIN ".tbl('users')." ON ".tbl($this->gp_mem_tbl).".userid=".tbl('users').".userid","*"," group_id='$gid' $app_query",$limit); + + if($db->num_rows>0) + return $result; + else + return false; + } + + + /** + * Function used to check weather member is active or not + */ + function is_active_member($uid,$gid) + { + global $db; + $count = $db->count(tbl($this->gp_mem_tbl),"userid"," userid='$uid' AND group_id='$gid' AND active='yes'"); + if($count[0]>0) + return true; + else + return false; + } + + /** + * function used to count number of topics in a group + */ + function count_group_topics($group) + { + global $db; + $totaltopics = $db->count(tbl($this->gp_topic_tbl),"*","group_id='$group'"); + return $totaltopics; + } + function CountTopics($group){ return $this->count_group_topics($group); } + function count_topics($group){ return $this->count_group_topics($group); } + + + + /** + * Function used to add video to group + */ + function add_group_video($vid,$gid,$update_group=false) + { + global $db,$cbvid; + $group = $this->get_details($gid); + $video = $cbvid->get_video_details($vid); + + if(!$group) + e(lang("grp_exist_error")); + elseif(!$video) + e(lang("class_vdo_del_err")); + elseif($video['userid']!=userid()) + e(lang("you_cant_add_this_vdo")); + elseif($this->is_group_video($vid,$gid)) + return false; + else + { + if(!$this->is_active_member(userid(),$group['group_id'])) + { $approved = "no"; e(lang("your_video_send_in_modetation"),"w"); } + else + $approved = "yes"; + + $db->insert(tbl($this->gp_vdo_tbl),array("videoid","group_id","userid","approved"),array($vid,$gid,userid(),$approved)); + e(lang("video_added"),"m"); + if($update_group) + $this->update_group_videos_count($gid); + } + } + + /** + * Removing video gro group + */ + function remove_group_video($vid,$gid,$update_group=false) + { + global $db,$cbvid; + $group = $this->get_details($gid); + $video = $cbvid->get_video_details($vid); + + if(!$group) + e(lang("grp_exist_error")); + elseif(!$video) + e(lang("class_vdo_del_err")); + elseif($video['userid']!=userid()) + e(lang("you_cant_del_this_vdo")); + elseif(!$this->is_group_video($vid,$gid)) + return false; + else + { + $db->delete(tbl($this->gp_vdo_tbl),array("videoid","group_id"),array($vid,$gid)); + e(lang("video_removed"),"m"); + if($update_group) + $this->update_group_videos_count($gid); + } + } + + + + /** + * Function used to check weather video is already in group or not + */ + function is_group_video($vid,$gid) + { + global $db; + $count = $db->count(tbl($this->gp_vdo_tbl),"group_video_id"," videoid='$vid' AND group_id='$gid'"); + if($count[0]>0) + return true; + else + return false; + } + + + /** + * Function used to count videos of group + * @param GID {group ID} + */ + function count_videos($gpid,$approved=true) + { + global $db; + if($approved) + $appQuery = "AND approved = 'yes'"; + $totalmem = $db->count(tbl("group_videos"),"*","group_id='$gpid' $appQuery"); + return $totalmem; + } + function total_videos($gid){return $this->count_videos($gid);} + + + + /** + * Function used to update number of videos of group + */ + function update_group_videos_count($gid) + { + global $db; + $total = $this->count_videos($gid); + $db->update(tbl($this->gp_tbl),array('total_videos'),array($total)," group_id='$gid'"); + } + + + /** + * Function used to get group videos + */ + function get_group_videos($gid,$approved=NULL,$limit=NULL) + { + global $db,$cbvid; + if($approved) + $approved_query = "AND approved='$approved'"; + + + if($limit!='count') + { + $result = $db->select(tbl($this->gp_vdo_tbl)." LEFT JOIN ".tbl('video')." + ON ".tbl($this->gp_vdo_tbl).".videoid=".tbl('video').".videoid","*", + " group_id='$gid' $approved_query AND ".tbl('video').".active='yes' AND status='Successful'",$limit); + }else + { + return $db->count(tbl($this->gp_vdo_tbl)." LEFT JOIN ".tbl('video')." + ON ".tbl($this->gp_vdo_tbl).".videoid=".tbl('video').".videoid","videoid", + " group_id='$gid' $approved_query AND ".tbl('video').".active='yes' AND status='Successful'",$limit); + } + + if($db->num_rows>0) + return $result; + else + return false; + + } + + + /** + * Function used to activate or detactivate or delete group member + */ + function member_actions($gid,$memuid,$case,$deleting_group=FALSE) + { + global $db; + + //getting group details + $group = $this->get_group_details($gid); + + if(!$group) + e(lang("grp_exist_error")); + elseif(!$this->is_member($memuid,$gid)) + e(lang("user_not_grp_mem")); + elseif(userid()!=$group['userid'] && !has_access("admin_access",true)) + e(lang("grp_owner_err1")); + elseif($group['userid']==$memuid && !$deleting_group) + e(lang("you_cant_perform_actions_on_grp_own")); + else + switch($case) + { + case "activate": + case "active": + { + $db->update(tbl($this->gp_mem_tbl),array("active"),array("yes"),"userid='$memuid' AND group_id='$gid'"); + $total_members = $this->total_members($group['group_id']); + $db->update(tbl($this->gp_tbl),array("total_members"),array($total_members)," group_id='".$gid."'"); + e(lang("usr_ac_msg"),"m"); + } + break; + + case "deactivate": + case "deactive": + case "unactivate": + case "unactive": + { + $db->update(tbl($this->gp_mem_tbl),array("active"),array("no"),"userid='$memuid' AND group_id='$gid'"); + $total_members = $this->total_members($group['group_id']); + $db->update(tbl($this->gp_tbl),array("total_members"),array($total_members)," group_id='".$gid."'"); + e(lang("usr_dac_msg"),"m"); + } + break; + + case "delete": + { + + //Delete All Videos oF member + $db->delete(tbl($this->gp_vdo_tbl),array("userid","group_id"),array($memuid,gid)); + //Deleting ALl Topics Of + $this->delete_user_topics($memuid,$gid); + //Delete Member + $db->delete(tbl($this->gp_mem_tbl),array("userid","group_id"),array($memuid,$gid)); + + $total_members = $this->total_members($gid); + $total_videos = $this->total_videos($gid); + $count_topics = $this->count_group_topics($gid); + + //Update Stat + $db->update(tbl($this->gp_tbl),array("total_topics","total_members","total_videos"), + array($count_topics,$total_members,$total_videos)," group_id='".$gid."'"); + + e(lang("usr_del_msg"),"m"); + } + break; + } + + } + + + + /** + * Function used to perform actions on videos + */ + function video_actions($gid,$vid,$case) + { + global $db; + + //getting group details + $group = $this->get_group_details($gid); + + + if(!$group) + e(lang("grp_exist_error")); + elseif(!$this->is_group_video($vid,$gid)) + e(lang("class_vdo_del_err")); + elseif(userid()!=$group['userid'] && !has_access("admin_access")) + e(lang("grp_owner_err1")); + else + switch($case) + { + case "activate": + case "active": + { + $db->update(tbl($this->gp_vdo_tbl),array("approved"),array("yes"),"videoid ='$vid' AND group_id='$gid'"); + $this->update_group_videos_count($gid); + e(lang("class_vdo_act_msg"),"m"); + } + break; + + case "deactivate": + case "deactive": + case "unactivate": + case "unactive": + { + $db->update(tbl($this->gp_vdo_tbl),array("approved"),array("no"),"videoid ='$vid' AND group_id='$gid'"); + $this->update_group_videos_count($gid); + e(lang("class_vdo_act_msg1"),"m"); + } + break; + + case "delete": + { + //Delete video + $db->delete(tbl($this->gp_vdo_tbl),array("videoid","group_id"),array($vid,$gid)); + + $total_videos = $this->total_videos($gid); + //Update Stat + $db->update(tbl($this->gp_tbl),array("total_videos"), + array($total_videos)," group_id='".$gid."'"); + e(lang("class_vdo_del_msg"),"m"); + } + break; + } + + } + + /** + * Function used to invite members to group + */ + function invite_member($user,$gid,$owner=NULL) + { + global $cbemail,$db,$userquery; + $group = $this->get_group_details($gid); + + if(!$owner) + $owner = userid(); + + $sender = $userquery->get_user_details($owner); + $reciever = $userquery->get_user_details($user); + + if(!$group) + e(lang("grp_exist_error")); + elseif(!$sender) + e(lang("unknown_sender")); + elseif(!$reciever) + e(lang("unknown_reciever")); + elseif($this->is_member($user,$gid)) + e(lang("user_already_group_mem")); + elseif($owner != $group['userid']) + e(lang("grp_owner_err1")); + else + { + //Inserting Invitation Code in database + $db->insert(tbl($this->gp_invite_tbl),array('group_id','userid','invited','date_added'), + array($gid,$owner,$reciever['userid'],now())); + e(lang("grp_inv_msg"),"m"); + + //Now Sending Email To User + $tpl = $cbemail->get_template('group_invitation'); + + $more_var = array + ( + '{reciever}' => $reciever['username'], + '{sender}' => $sender['username'], + '{group_url}' => group_link(array('details'=>$group)), + '{group_name}' => $group['group_name'], + '{group_description}' => $group['group_description'] + + ); + + if(!is_array($var)) + $var = array(); + $var = array_merge($more_var,$var); + $subj = $cbemail->replace($tpl['email_template_subject'],$var); + $msg = nl2br($cbemail->replace($tpl['email_template'],$var)); + //Now Finally Sending Email + cbmail(array('to'=>$reciever['email'],'from'=>WEBSITE_EMAIL,'subject'=>$subj,'content'=>$msg)); + } + } + + /** + * Function used to invite members to group + */ + function invite_members($user_array,$group,$owner=NULL) + { + global $eh; + $total = count($user_array); + for($i=0;$i<$total;$i++) + { + $this->invite_member($user_array[$i],$group,$owner); + } + $eh->flush(); + e(lang("invitations_sent"),"m"); + } + + + /** + * Function used to leave group + */ + function leave_group($gid,$uid) + { + global $db; + if(!$this->is_member($uid,$gid)) + e(lang("you_not_grp_mem")); + elseif($this->is_owner($gid,$uid)) + e(lang("grp_owner_err2")); + else + { + $db->delete(tbl($this->gp_mem_tbl),array("userid","group_id"),array($uid,$gid)); + e(lang("grp_leave_succ_msg"),"m"); + } + } + + + /** + * Function used to delete group + */ + function delete_group($gid) + { + global $db; + $group = $this->get_group_details($gid); + if(!$group) + e(lang("grp_exist_error")); + elseif(userid()!=$group['userid'] && !has_access('admin_access',true)) + e(lang("you_cant_delete_this_grp")); + else + { + //Deleting Everything Related To This Group + $this->delete_group_topics($gid); + $this->delete_group_videos($gid); + $this->delete_group_members($gid); + $db->delete(tbl($this->gp_tbl),array("group_id"),array($gid)); + $this->update_user_total_groups($group['userid']); + e(lang("grp_deleted"),"m"); + } + } + + /** + * Functin used to delete all memebrs of group + */ + function delete_group_members($gid) + { + global $db; + $group = $this->get_group_details($gid); + + if(!$group) + e(lang("grp_exist_error")); + elseif(userid()!=$group['userid'] && !has_access('admin_access',true)) + e(lang("you_cant_del_grp_mems")); + else + { + $db->delete(tbl($this->gp_mem_tbl),array("group_id"),array($gid)); + e(lang("mems_deleted"),"m"); + } + } + + /** + * Functin used to delete all videos of group + */ + function delete_group_videos($gid) + { + global $db; + $group = $this->get_group_details($gid); + + if(!$group) + e(lang("grp_exist_error")); + elseif(userid()!=$group['userid'] && !has_access('admin_access',true)) + e(lang("you_cant_del_grp_vdos")); + else + { + $db->delete(tbl($this->gp_vdo_tbl),array("group_id"),array($gid)); + e(lang("vdo_multi_del_erro"),"m"); + } + } + + + /** + * Function used to check weather group exists or not + */ + function group_exists($gid) + { + global $db; + $result = $db->count(tbl($this->gp_tbl),"group_id"," group_id='$gid'"); + if($result>0) + return true; + else + return false; + } + + + /** + * Function used to perform gorups actions + */ + function grp_actions($type,$gid) + { + global $db; + $gdetails = $this->get_details($gid); + if(!$gdetails) + e(lang("grp_exist_error")); + else + { + switch($type) + { + case "activate": + case "active": + { + $db->update(tbl($this->gp_tbl),array("active"),array("yes")," group_id='$gid' "); + e(lang("grp_av_msg"),"m"); + } + break; + case "deactivate": + case "deactive": + { + $db->update(tbl($this->gp_tbl),array("active"),array("no")," group_id='$gid' "); + e(lang("grp_da_msg"),"m"); + } + break; + case "featured": + case "feature": + { + $db->update(tbl($this->gp_tbl),array("featured"),array("yes")," group_id='$gid' "); + e(lang("grp_fr_msg"),"m"); + } + break; + case "unfeatured": + case "unfeature": + { + $db->update(tbl($this->gp_tbl),array("featured"),array("no")," group_id='$gid' "); + e(lang("grp_fr_msg2"),"m"); + } + break; + case "delete": + { + $this->delete_group($gid); + e(lang("grp_del_msg"),"m"); + } + break; + } + } + } + + /** + * Function used to get all topic icons + */ + function get_topic_icons() + { + $dir = TOPIC_ICON_DIR; + $icons = glob($dir.'/*.png'); + $new_icons = ''; + foreach($icons as $icon) + { + $icon_parts = explode('/',$icon); + $icon_file = $icon_parts[count($icon_parts)-1]; + $new_icons[] = array('file'=>$icon_file,'path'=>$icon,'url'=>TOPIC_ICON_URL.'/'.$icon_file); + } + + if(count($new_icons)>0) + return $new_icons; + else + return false; + } + + + + + + /** + * Function used to load ADD Topic Form + */ + function load_add_topic_form_fields($array=NULL) + { + if($array==NULL) + $array = $_POST; + + $topic_title = $_POST['topic_title']; + $topic_post = $_POST['topic_post']; + + $fields = array + ( + 'title' => array( + 'title'=> lang('topic_title'), + 'type'=> 'textfield', + 'name'=> 'topic_title', + 'id'=> 'topic_title', + 'value'=> cleanForm($topic_title), + 'size'=>'45', + 'db_field'=>'topic_title', + 'required'=>'yes', + 'min_length' => 1, + 'max_length'=>config('max_topic_title'), + + ), + 'topic_post' => array( + 'title'=> lang("topic_post"), + 'type'=> 'textarea', + 'name'=> 'topic_post', + 'id'=> 'topic_post', + 'value'=> cleanForm($topic_post), + 'size'=>'45', + 'db_field'=>'topic_post', + 'required'=>'yes', + 'min_length' => 4, + 'max_length'=>config('max_topic_length'), + 'anchor_before' => 'before_topic_post_box', + 'anchor_after' => 'after_topic_post_box', + ) + ); + return $fields; + } + + + + /** + * Function used to add video comment + */ + function add_comment($comment,$obj_id,$reply_to=NULL) + { + global $myquery,$db; + + if(!$this->topic_exists($obj_id)) + e(lang("grp_tpc_err4")); + else + { + $owner = $this->get_group_owner_from_topic($obj_id); + $add_comment = $myquery->add_comment($comment,$obj_id,$reply_to,'t',$owner); + if($add_comment) + { + //Loggin Comment + $log_array = array + ( + 'success'=>'yes', + 'details'=> "comment on a topic", + 'action_obj_id' => $obj_id, + 'action_done_id' => $add_comment, + ); + insert_log('topic_comment',$log_array); + + //Updating Number of comments of topics + $this->update_comments_count($obj_id); + } + return $add_comment; + } + } + + /** + * Function used to delete comment + */ + function delete_comment($cid,$objid) + { + global $myquery; + $tdetails = $this->get_topic_details($objid); + $gdetails = $this->get_group_details($tdetails['group_id']); + + $forceDelete = false; + if(userid()==$gdetails['userid']) + $forceDelete = true; + $myquery->delete_comment($cid,'t',false,$forceDelete); + $this->update_comments_count($objid); + } + + /** + * Function delete all comments of topic + */ + function delete_comments($tid) + { + global $myquery; + $tdetails = $this->get_topic_details($tid); + $gdetails = $this->get_group_details($tdetails['group_id']); + $forceDelete = false; + if(userid()==$gdetails['userid']) + { + $forceDelete = true; + $myquery->delete_comments($tid,'t',$forceDelete); + $this->update_comments_count($objid); + } + } + + /** + * Function used to update video comments count + */ + function update_comments_count($id) + { + global $db; + $total_comments = $this->count_topic_comments($id); + if(!userid()) + $userid = 0; + else + $userid = userid(); + + $db->update(tbl($this->gp_topic_tbl),array("total_replies","last_poster","last_post_time"), + array($total_comments,$userid,now())," topic_id='$id'"); + } + + /** + * Function used to count total video comments + */ + function count_topic_comments($id) + { + global $db; + $total_comments = $db->count(tbl('comments'),"comment_id","type='t' AND type_id='$id'"); + return $total_comments; + } + + /** + * Function used to crearte view topic link + */ + function topic_link($tdetails) + { + if(SEO==yes) + return BASEURL.'/view_topic/'.SEO($tdetails['topic_title']).'_tid_'.$tdetails['topic_id']; + else + return BASEURL.'/view_topic.php?tid='.$tdetails['topic_id']; + } + + + /** + * function and show otpion links + */ + function group_opt_link($group,$type) + { + global $userquery; + $gArray = + array + ( + 'group' => $group, + 'groupid' => $group['group_id'], + 'uid' => userid(), + 'user' => $userquery->udetails, + 'checkowner' => 'yes' + ); + switch($type) + { + case 'join': + { + if($this->is_joinable($group)) + { + if(SEO=="yes") + return ''.lang('join').''; + else + return ''.lang('join').''; + }else + return false; + } + break; + + case 'invite': + { + if($this->is_owner($group)) + { + return ''.lang('invite').''; + } + } + break; + + case 'leave': + { + if($this->is_member(userid(),$group['group_id']) && !$this->is_owner($group)) + { + if(SEO=="yes") + return ''.lang('leave').''; + else + return ''.lang('leave').''; + } + } + break; + + case 'remove_group': + { + if($this->is_owner($group)) + { + $gpID = $group['group_id']; $message = lang('are_you_sure_del_grp'); + $url = BASEURL.'/manage_groups.php?mode=manage&gid_delete='.$gpID; + return "".lang('grp_remove_group').""; + } + } + break; + + case 'manage_members': + { + + if($this->is_admin($gArray)) + { + return ''.lang('grp_manage_mems').''; + } + } + break; + + case 'manage_videos': + { + if($this->is_admin($gArray)) + { + return ''.lang('com_manage_vids').''; + } + } + break; + + + case 'add_videos': + { + if($this->is_member(userid(),$group['group_id'])) + { + return ''.lang('grp_add_vdos').''; + } + } + break; + + case 'edit_group': + { + if($this->is_admin($gArray)) + { + return ''.lang('grp_edit_grp_title').''; + } + } + break; + } + return false; + } + + /** + * Function used to check weather + * this group is joinable or not + * it will check + * - user is logged in or not + * - if user is logged in , check is he member or not + * - if he is not a member, check is he invited + * - if is invited then show the link + */ + function is_joinable($group,$uid=NULL,$gen_err=FALSE) + { + if(!$uid) + $uid = userid(); + + $group_id = $group['group_id']; + if($this->is_member($uid,$group['group_id'])) + { + if($gen_err) + e(lang('grp_join_error')); + return false; + }elseif($group['group_privacy']!=2 || $this->is_invited($uid,$group_id,$group['userid'],$gen_err)) + return true; + else + return false; + } + + + /** + * Function used to check weather to view + * group details ot user or not. + * We need to check following things and display Message Accordingly + * First - we to save group privacy into variables + * Second - $privacy == 1 and user is not member of group. Display group but with warning message. + * Third - $privacy == 1 and user is member of group. Display group but with warning message about pending approval. + * Fourth - $privacy == 2 and user is not member. Dont display group with error message + */ + function is_viewable($group,$uid=NULL) + { + if(!$uid) + $uid = userid(); + $privacy = $group['group_privacy']; + $isMember = $this->is_member($uid,$group['group_id']); + + if($privacy == 1 && !$isMember) + { + e(lang("you_need_owners_approval_to_view_group"),"w"); + return true; + } elseif($privacy == 1 && !$this->is_active_member($uid,$group['group_id'])) + { + e(lang("grp_inactive_account"),"w"); + return true; + } elseif($privacy == 2 && !$isMember && !$this->is_invited($uid,$group['group_id'],$group['userid'])) { + e(lang("grp_prvt_err1")); + return false; + } else { + return true; + } + +/* $group_id = $group['group_id']; + $is_Member = $this->is_member($uid,$group['group_id'],true); + + if($group['group_privacy'] == 2 && !$is_Member) + return array("privacy"=>$group['group_privacy'],"isMember"=>$is_Member); + elseif($group['group_privacy'] == 1 && !$is_Member) + return array("privacy"=>$group['group_privacy'],"isMember"=>$is_Member); + else + return true; */ + } + + + + /** + * Function used to get groups + * @parma ARRAY + * group_id => {id of group} INT + * user => {all groups of the user INT + * category => {all groups in specified category INT,INT,INT + * featured => {get featured groups only} yes,no + * limit => {number of results including offset} + * order => {soring by} + * date_margin => {date span} + */ + function get_groups($params=NULL,$force_admin=FALSE) + { + global $db; + + $limit = $params['limit']; + $order = $params['order']; + + $cond = ""; + if(!has_access('admin_access',TRUE) && !$force_admin) + $cond .= " ".tbl("groups.active")."='yes' "; + else + { + if($params['active']) + $cond .= " ".tbl("groups.active")."='".$params['active']."'"; + } + + //Setting Category Condition + if(!is_array($params['category'])) + $is_all = strtolower($params['category']); + + if($params['category'] && $is_all!='all') + { + if($cond!='') + $cond .= ' AND '; + + $cond .= " ("; + + if(!is_array($params['category'])) + { + $cats = explode(',',$params['category']); + }else + $cats = $params['category']; + + $count = 0; + + foreach($cats as $cat_params) + { + $count ++; + if($count>1) + $cond .=" OR "; + $cond .= " ".tbl("groups.category")." LIKE '%#$cat_params#%' "; + } + + $cond .= ")"; + } + + //date span + if($params['date_span']) + { + if($cond!='') + $cond .= ' AND '; + $cond .= " ".cbsearch::date_margin("date_added",$params['date_span']); + } + + //uid + if($params['user']) + { + if($cond!='') + $cond .= ' AND '; + $cond .= " ".tbl("groups.userid")."='".$params['user']."'"; + } + + $tag_n_title=''; + //Tags + if($params['tags']) + { + //checking for commas ;) + $tags = explode(",",$params['tags']); + if(count($tags)>0) + { + if($tag_n_title!='') + $tag_n_title .= ' OR '; + $total = count($tags); + $loop = 1; + foreach($tags as $tag) + { + $tag_n_title .= " ".tbl("groups.group_tags")." LIKE '%".$tag."%'"; + if($loop<$total) + $tag_n_title .= " OR "; + $loop++; + + } + }else + { + if($tag_n_title!='') + $tag_n_title .= ' OR '; + $tag_n_title .= " ".tbl("groups.group_tags")." LIKE '%".$params['tags']."%'"; + } + } + //TITLE + if($params['title']) + { + if($tag_n_title!='') + $tag_n_title .= ' OR '; + $tag_n_title .= " ".tbl("groups.group_name")." LIKE '%".$params['title']."%'"; + } + + if($tag_n_title) + { + if($cond!='') + $cond .= ' AND '; + $cond .= " ($tag_n_title) "; + } + + //FEATURED + if($params['featured']) + { + if($cond!='') + $cond .= ' AND '; + $cond .= " ".tbl("groups.featured")." = '".$params['featured']."' "; + } + + //GROUP ID + if($params['group_id']) + { + if($cond!='') + $cond .= ' AND '; + $cond .= " group_id = '".$params['group_id']."' "; + } + + //Exclude Vids + if($params['exclude']) + { + if($cond!='') + $cond .= ' AND '; + $cond .= " ".tbl("groups.group_id")." <> '".$params['exclude']."' "; + } + + + + if(!$params['count_only']) + { + if(!empty($cond)) + $cond .= " AND "; + $result = $db->select(tbl($this->gp_tbl.",users"),''.tbl($this->gp_tbl).'.*, '.tbl("users").'.username, '.tbl("users").'.userid',$cond." ".tbl("groups.userid")." = ".tbl("users.userid")." ",$limit,$order); + } + + // echo $db->db_query; + if($params['count_only']) + return $result = $db->count(tbl($this->gp_tbl),'*',$cond); + if($params['assign']) + assign($params['assign'],$result); + else + return $result; + } + + + + + + /** + * Function used to get group field + * @ param INT gid + * @ param FIELD name + */ + function get_gp_field($gid,$field) + { + global $db; + $results = $db->select(tbl($this->gp_tbl),$field,"group_id='$gid'"); + + if($db->num_rows>0) + { + return $results[0]; + }else{ + return false; + } + }function get_gp_fields($gid,$field){return $this->get_gp_field($gid,$field);} + + + /** + * This function will return + * group field without array + */ + function get_gp_field_only($gid,$field) + { + $fields = $this->get_gp_field($gid,$field); + return $fields[$field]; + } + + /** + * Function used to get groups joined by user + */ + function user_joined_groups($uid,$limit=NULL) + { + global $db; + # REF QUERY : SELECT * FROM group_members,groups WHERE group_members.userid = '1' AND group_members.group_id = groups.group_id AND groups_members.userid != groups.userid + $result = $db->select(tbl($this->gp_tbl).','.tbl($this->gp_mem_tbl),"*",tbl($this->gp_mem_tbl).".userid='$uid' AND + ".tbl($this->gp_mem_tbl).".group_id = ".tbl($this->gp_tbl).".group_id AND ".tbl($this->gp_mem_tbl).".userid != ".tbl($this->gp_tbl).".userid",$limit,tbl($this->gp_tbl).".group_name"); + if($db->num_rows>0) + return $result; + else + return false; + } + + + /*** + * Function used to update user total number of groups + */ + function update_user_total_groups($user) + { + global $db; + $count = $db->count(tbl($this->gp_tbl),"group_id"," userid='$user' "); + $db->update(tbl("users"),array("total_groups"),array($count)," userid='$user' "); + } + + + + + /** + * Function used to use to initialize search object for video section + * op=>operator (AND OR) + */ + function init_search() + { + $this->search = new cbsearch; + $this->search->db_tbl = "groups"; + $this->search->columns =array( + array('field'=>'group_name','type'=>'LIKE','var'=>'%{KEY}%'), + ); + $this->search->cat_tbl = $this->cat_tbl; + + $this->search->display_template = LAYOUT.'/blocks/group.html'; + $this->search->template_var = 'group'; + $this->search->multi_cat = true; + $this->search->results_per_page = config('grps_items_search_page'); + $this->search->has_user_id = true; + + /** + * Setting up the sorting thing + */ + + $sorting = array( + 'date_added' => lang("date_added"), + 'total_views' => lang("views"), + 'total_comments' => lang("comments"), + 'total_videos' => lang("videos"), + 'total_members' => lang("total members"), + ); + + $this->search->sorting = array( + 'date_added'=> " date_added DESC", + 'total_views' => " total_views DESC", + 'total_comments' => " total_comments DESC ", + 'total_videos' => " total_videos DESC", + 'total_members' => " total_members DESC", + ); + /** + * Setting Up The Search Fields + */ + + $default = $_GET; + if(is_array($default['category'])) + $cat_array = array($default['category']); + $uploaded = $default['datemargin']; + $sort = $default['sort']; + + $this->search->search_type['groups'] = array('title'=>'Groups'); + + $fields = array( + 'query' => array( + 'title'=> lang('keywords'), + 'type'=> 'textfield', + 'name'=> 'query', + 'id'=> 'query', + 'value'=>cleanForm($default['query']) + ), + 'category' => array( + 'title' => lang('category'), + 'type' => 'checkbox', + 'name' => 'category[]', + 'id' => 'category', + 'value' => array('category',$cat_array), + 'category_type'=>'group', + ), + 'date_margin' => array( + 'title' => lang('created'), + 'type' => 'dropdown', + 'name' => 'datemargin', + 'id' => 'datemargin', + 'value' => $this->search->date_margins(), + 'checked' => $uploaded, + ), + 'sort' => array( + 'title' => lang('sort_by'), + 'type' => 'dropdown', + 'name' => 'sort', + 'value' => $sorting, + 'checked' => $sort + ) + ); + + $this->search->search_type['groups']['fields'] = $fields; + } + + + /** + * Function used to validate group category + * @param input array + */ + function validate_group_category($array=NULL) + { + if($array==NULL) + $array = $_POST['category']; + if(count($array)==0) + return false; + else + { + + foreach($array as $arr) + { + if($this->category_exists($arr)) + $new_array[] = $arr; + } + } + if(count($new_array)==0) + { + e(lang('vdo_cat_err3')); + return false; + }elseif(count($new_array)>ALLOWED_GROUP_CATEGORIES) + { + e(sprintf(lang('vdo_cat_err2'),ALLOWED_GROUP_CATEGORIES)); + return false; + } + + return true; + } + + + /** + * Get group owner from topic + */ + function get_group_owner_from_topic($tid) + { + global $db; + $results = $db->select(tbl("group_topics").",".tbl("groups"), + tbl("group_topics").".group_id,".tbl("group_topics").".topic_id,".tbl("groups")."userid,".tbl("groups").".group_id", + tbl("group_topics").".group_id = ".tbl("groups").".group_id AND ".tbl("group_topics").".topic_id='$tid'"); + + if($db->num_rows>0) + return $results[0]['userid']; + else + return false; + } + + /** + * Function used to make member admin of the group + * input ARRAY + * INDEX gid => groupid + * INDEX group => groupdetails + * INDEX uid => Userid + * INDEX user => userdtails + * return error() | return true on success makeAdmin + */ + function make_admin($array){ return $this->makeAdmin($array);} + function makeAdmin($array) + { + global $userquery,$db; + extract($array); + if(!@$groupid) + e(lang('Unknown group')); + elseif(!@$group) + { + $group = $this->get_group($groupid); + } + + if(!@$uid) + e(lang('Unknown group user')); + elseif(!@$user) + { + $user = $userquery->get_user_details($uid); + } + + if(!$group) + e(lang("Unknown group")); + if(!$user) + e(lang("Unknown user")); + + //if(!$this->is_member($uid,$groupid)) + // e(sprintf(lang("%s is not a member of %s"),$user['username'],$group['group_name'])); + if(!$this->is_active_member($uid,$groupid)) + e(sprintf(lang("%s is not active member of %s"),$user['username'],$group['group_name'])); + + + //Checking if is owner or already an admin + $this->is_admin(array( + 'group'=>$group, + 'groupid'=>$groupid, + 'uid'=>$uid, + 'user'=>$user, + 'error'=>true, + 'checkowner'=>true)); + + if(!error()) + { + $groupAdmins = $group['group_admins']; + $groupAdmins = json_decode($groupAdmins,true); + $groupAdmins[] = $uid; + $groupAdmins = json_encode($groupAdmins); + + $db->update(tbl("groups"),array("group_admins"), + array('|no_mc|'.$groupAdmins)," group_id='".$groupid."'"); + e(sprintf(lang("%s has been made adminstrator of %s"),$user['username'],$group['group_name']),"m"); + return true; + } + + return false; + } + + + /** + * Function used to get weather user is admin of the group or not + * input ARRAY + * INDEX gid => groupid + * INDEX group => groupdetails + * INDEX uid => Userid + * INDEX user => userdtails + * return error() | return true on success makeAdmin + */ + function is_admin($array) + { + global $userquery; + extract($array); + if(!@$groupid) + e(lang('Unknown group')); + elseif(!@$group) + { + $group = $this->get_group($groupid); + } + + if(!@$uid) + e(lang('Unknown group user')); + elseif(!@$user) + { + $user = $userquery->get_user_details($uid); + } + if(!$group) + e(lang("Unknown group")); + if(!$user) + e(lang("Unknown user")); + + //Moving group admins into an array + $groupAdmins = $group['group_admins']; + $groupAdmins = json_decode($groupAdmins,true); + + if($group['userid']== $uid && $checkowner) + { + if(@$error) + e(sprintf(lang('%s is owner of %s'),$user['username'],$group['group_name'])); + return true; + }elseif(@in_array($uid,$groupAdmins)) + { + if(@$error) + e(sprintf(lang('%s is admin of %s'),$user['username'],$group['group_name'])); + return true; + } + + return false; + } + + + /** + * Removing admin from group + */ + function remove_admin($array){ return $this->removeAdmin($array);} + function removeAdmin($array) + { + global $userquery,$db; + extract($array); + if(!@$groupid) + e(lang('Unknown group')); + elseif(!@$group) + { + $group = $this->get_group($groupid); + } + + if(!@$uid) + e(lang('Unknown group user')); + elseif(!@$user) + { + $user = $userquery->get_user_details($uid); + } + + if(!$group) + e(lang("Unknown group")); + if(!$uid) + e(lang("Unknown user")); + + + //Checking if is owner or already an admin + if(!$this->is_admin(array( + 'group'=>$group, + 'groupid'=>$groupid, + 'uid'=>$uid, + 'user'=>$user))) + { + e(sprintf(lang('%s is not admin of %s'),$user['username'],$group['group_name'])); + return false; + }else + { + $groupAdmins = $group['group_admins']; + $groupAdmins = json_decode($groupAdmins,true); + $newAdmins = array(); + foreach($groupAdmins as $gadmin) + if($gadmin!=$uid) + $newAdmins[] = $gadmin; + + $groupAdmins = json_encode($newAdmins); + $db->update(tbl("groups"),array("group_admins"), + array('|no_mc|'.$groupAdmins)," group_id='".$groupid."'"); + e(sprintf(lang("%s has been removed from adminstrators of %s"),$user['username'],$group['group_name']),"m"); + return true; + + } + + } + + +} + +function isGroupAdmin($array){ global $cbgroup; $return = $cbgroup->is_admin($array); +if($array['assign']) assign($array['assign'],$return); else return $return;} +function removeGroupAdmin($array){ global $cbgroup; $return = $cbgroup->removeAdmin($array); +if($array['assign']) assign($array['assign'],$return); else return $return;} +function makeGroupAdmin($array){ global $cbgroup; $return = $cbgroup->make_admin($array); +if($array['assign']) assign($array['assign'],$return); else return $return; } + +?> \ No newline at end of file diff --git a/upload/includes/classes/image.class.php b/upload/includes/classes/image.class.php new file mode 100644 index 00000000..a6c987d1 --- /dev/null +++ b/upload/includes/classes/image.class.php @@ -0,0 +1,74 @@ + $dim || $height_orig>$dim ) + { + if($width_orig > $height_orig) + { + $ratio= $width_orig/$dim; + }else{ + if($dim_h==NULL) + $ratio=$height_orig/$dim; + else + $ratio=$height_orig/$dim_h; + } + + $width=$width_orig/$ratio; + $height=$height_orig/$ratio; + + if($aspect_ratio == false && $dim_h !=''){ + $width = $dim; + $height = $dim_h; + } + + $image_p = imagecreatetruecolor($width, $height); + + if($ext=='jpg' || $ext=='JPG' || $ext=='JPEG'){ + $image = imagecreatefromjpeg($file); + imagecopyresampled($image_p, $image, 0, 0, 0, 0, $width, $height, $width_orig, $height_orig); + imagejpeg($image_p,$des, 90); + } + if($ext=='png' || $ext=='PNG'){ + $image = imagecreatefrompng($file); + imagecopyresampled($image_p, $image, 0, 0, 0, 0, $width, $height, $width_orig, $height_orig); + imagepng($image_p,$des); + } + + if($ext=='gif' || $ext=='GIF'){ + $image = imagecreatefromgif($file); + imagecopyresampled($image_p, $image, 0, 0, 0, 0, $width, $height, $width_orig, $height_orig); + imagegif($image_p,$des, 90); + } + }else + { + if(!file_exists($des)) + copy($file,$des); + } + } + + //Validating an Image + + function ValidateImage($file,$ext=NULL){ + $array = getimagesize($file); + if($ext == 'jpg' || $ext == 'JPG' ||$ext == 'JPEG' || $ext == 'gif' || $ext == 'GIF' || $ext == 'PNG' || $ext == 'png'){ + if(empty($array[0]) || empty($array[1])){ + $validate = false; + }else{ + $validate = true; + } + }else{ + $validate = false; + } + return $validate; + } +} +?> \ No newline at end of file diff --git a/upload/includes/classes/index.php b/upload/includes/classes/index.php new file mode 100644 index 00000000..403f2e18 --- /dev/null +++ b/upload/includes/classes/index.php @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/upload/includes/classes/lang.class.php b/upload/includes/classes/lang.class.php new file mode 100644 index 00000000..387d3c17 --- /dev/null +++ b/upload/includes/classes/lang.class.php @@ -0,0 +1,500 @@ +lang = $this->lang_iso = 'en'; + } + + /** + * INIT + */ + function init() + { + $lang = mysql_clean($_COOKIE['cb_lang']); + + //Setting Language + if(isset($_GET['set_site_lang'])) + { + $lang = $_GET['set_site_lang']; + if($this->lang_exists($lang)) + setcookie('cb_lang',$lang,time()+3600,'/'); + } + + + $lang_details = $this->lang_exists($lang); + + if(isset($lang) && $lang_details) + { + $default = $lang_details ; + }else + { + $default = $this->get_default_language(); + } + + if($default['language_code']) + { + $this->lang = $this->lang_iso = $default['language_code']; + } + } + + + /** + * Function used add new phrase + */ + function add_phrase($name,$text,$lang_code='en') + { + global $db; + //First checking if phrase already exists or not + if(empty($name)) + e(lang("phrase_code_empty")); + elseif(empty($text)) + e(lang("phrase_text_empty")); + elseif(!$this->lang_exists($lang_code)) + e(lang("language_does_not_exist")); + elseif(!$this->get_phrase($name,$lang_code)) + { + e(sprintf(lang("name_has_been_added"),$name),'m'); + $db->insert(tbl("phrases"),array('lang_iso','varname','text'),array($lang_code,$name,'|no_mc|'.$text)); + }else{ + e(sprintf(lang("name_already_exists"),$name),'m'); + } + } + + /** + * Function used to get language phrase + * @param STRING name + * @param STRING lang_code + */ + function get_phrase($name,$lang_code=NULL) + { + global $db; + + + if($lang_code!='') + { + $lang_query = "AND lang_iso = '".mysql_clean($lang_code)."'"; + } + + $results = $db->select(tbl("phrases"),'*'," id = '".mysql_clean($name)."' OR varname = '".mysql_clean($name)."' $lang_query "); + if($db->num_rows > 0 ) + return $results[0]; + else + return false; + } + + + /** + * Function used to modify phrase + */ + function update_phrase($id,$text,$lang_code='en') + { + global $db; + //First checking if phrase already exists or not + if($this->get_phrase($id,$lang_code)) + $db->update(tbl("phrases"),array('text'),array(mysql_real_escape_string($text))," id = '".mysql_real_escape_string($id)."' "); + } + + /** + * Function used to get all phrases of particular language + */ + function get_phrases($lang=NULL,$fields="varname,text",$limit=NULL,$extra_param=NULL) + { + global $db; + $lang_details = $this->lang_exists($lang); + $lang_code = $lang_details['language_code']; + if(empty($lang_code)) + $lang_code = $this->lang; + return $db->select(tbl("phrases"),$fields," lang_iso = '".$lang_code."' $extra_param",$limit," id "); + + } + + + /** + * Function used to count phrases + */ + function count_phrases($lang=NULL,$extra_param=NULL) + { + global $db; + $lang_details = $this->lang_exists($lang); + $lang_code = $lang_details['lang_code']; + if(empty($lang_code)) + $lang_code = $this->lang; + + $results = $db->select(tbl("phrases"),"COUNT(id)"," lang_iso = '".$lang_code."' $extra_param"); + if($db->num_rows>0) + return $results[0][0]; + else + return 0; + + } + + /** + * Function used to assign phrases as an array + */ + function lang_phrases($code='db') + { + if($code == 'db') + { + $phrases = $this->get_phrases(); + foreach($phrases as $phrase) + { + $lang[$phrase['varname']] = $phrase['text']; + } + }else + { + $lang = $this->getPhrasesFromPack(); + } + return $lang; + } + + + /** + * Function used to get list of languages installed + */ + function get_langs($active=false) + { + global $db; + $cond = NULL; + if($active) + $cond = " language_active='yes' "; + $results = $db->select(tbl("languages"),"*",$cond); + return $results; + } + + + + /** + * Function used to check + * weather language existsor not + * using iso_code or its lang_id + */ + function lang_exists($id) + { + global $db; + $results = $db->select(tbl("languages"),"*"," language_code ='$id' OR language_id = '$id'"); + if($db->num_rows>0) + return $results[0]; + else + return false; + } + + + /** + * Make Language Default + */ + function make_default($lid) + { + global $db; + $lang = $this->lang_exists($lid); + if($lang) + { + setcookie('cb_lang',$lid,time()+3600,'/'); + $db->update(tbl("languages"),array("language_default"),array("no")," language_default='yes'"); + $db->update(tbl("languages"),array("language_default"),array("yes")," language_id='$lid'"); + e($lang['language_name']." has been set as default language","m"); + } + } + + /** + * function used to get default language + */ + function get_default_language() + { + global $db; + $result = $db->select(tbl('languages'),"*"," language_default='yes' "); + $result = $result[0]; + return $result; + } + + /** + * Funcion used to get language detilas + */ + function get_lang($id) + { + return $this->lang_exists($id); + } + + + + /** + * Function used to export language + */ + function export_lang($id) + { + + //first get language details + $lang_details = $this->get_lang($id); + if($lang_details) + { + header("Pragma: public"); // required + header("Expires: 0"); + header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); + header("Cache-Control: private",false); // required for certain browsers + header("Content-type: application/force-download"); + header("Content-Disposition: attachment; filename=\"cb_lang_".$lang_details['language_code'].".xml\""); + echo ''; + ?> + + + + + $this->lang_phrases()));?> + + +lang_exists($data['iso_code'])) + e(lang("language_already_exists")); + else + { + $db->insert(tbl("languages"),array("language_code","language_name","language_regex","language_default"), + array($data['iso_code'],$data['name'],"/^".$data['iso_code']."/i","no")); + $sql = ''; + foreach($phrases as $code => $phrase) + { + if(!empty($sql)) + $sql .=",\n"; + $sql .= "('".$data['iso_code']."','$code','".mysql_real_escape_string($phrase)."')"; + } + $sql .= ";"; + $query = "INSERT INTO ".tbl("phrases")." (lang_iso,varname,text) VALUES \n"; + $query .= $sql; + $db->execute($query); + e(lang("lang_added"),"m"); + } + } + + }else + e(lang("error_while_upload_file")); + + if(file_exists($file_name)) + unlink($file_name); + } + + /** + * Function used to delete language pack + */ + function delete_lang($i) + { + global $db; + $lang = $this->get_lang($i); + if(!$lang) + e(lang("language_does_not_exist")); + elseif($lang['language_default'] == 'yes') + e(lang("default_lang_del_error")); + else + { + $db->delete(tbl('languages'),array("language_code"),array($lang['language_code'])); + $db->delete(tbl('phrases'),array("lang_iso"),array($lang['language_code'])); + e(lang("lang_deleted"),"m"); + } + } + + /** + * Function used to update language + */ + function update_lang($array) + { + global $db; + $lang = $this->get_lang($array['lang_id']); + if(!$lang) + e(lang("language_does_not_exist")); + elseif(empty($array['name'])) + e(lang("lang_name_empty")); + elseif(empty($array['code'])) + e(lang("lang_code_empty")); + elseif(empty($array['regex'])) + e(lang("lang_regex_empty")); + elseif($this->lang_exists($array['code']) && $array['code'] != $lang['language_code']) + e(lang("lang_code_already_exist")); + else + { + $db->update(tbl('languages'),array("language_name","language_code","language_regex"), + array($array['name'],$array['code'],$array['regex'])," language_id='".$array['lang_id']."'"); + if($array['code'] != $lang['language_code']) + $db->update(tbl("phrases"),array("lang_iso"),array($array['code'])," lang_iso='".$lang['language_code']."'"); + e(lang("lang_updated"),"m"); + } + + } + + + /** + * Function used to create new language pack + * that can be used by clipbucket + * + */ + function createPack($lang=false) + { + if(!$lang) + $lang = $this->lang; + $phrases = $this->get_phrases($lang); + + if(count($phrases)==0) return false; + $new_array = array(); + foreach($phrases as $phrase) + { + $new_array[$phrase['varname']] = $phrase['text']; + } + $fo = fopen(BASEDIR.'/includes/langs/'.$lang.'.lang','w+'); + fwrite($fo,json_encode($new_array)); + fclose($fo); + return true; + } + + + /** + * function used to activate or deactive language + */ + function action_lang($action,$id) + { + global $db; + $lang = $this->lang_exists($id); + + if(!$this->lang_exists($id)) + e($lang); + elseif($lang['language_default']=='yes') + e(lang("lang_default_no_actions")); + else + { + switch($action) + { + case "active": + case "activate": + { + $db->update(tbl('languages'),array("language_active"),array("yes")," language_id='$id' "); + e(lang("lang_has_been_activated"),"m"); + } + break; + case "deactive": + case "deactivate": + { + $db->update(tbl('languages'),array("language_active"),array("no")," language_id='$id' "); + e(lang("lang_has_been_deactivated"),"m"); + } + break; + } + } + + } + + /** + * Function used to get phrases from language packs + */ + function getPhrasesFromPack($lang=false) + { + if(!$lang) + $lang = $this->lang; + $file = BASEDIR.'/includes/langs/'.$lang.'.lang'; + if(!file_exists($file)) + $this->createPack($lang); + $langData = file_get_contents($file); + $phrases = json_decode($langData,true); + return $phrases; + } + + /** + * Function used to import language from lang file + * this function fill first remove all phrases from database + * then update the language so that when we release update we just update the + * file and then call this function to refresh all the language phrases. + */ + function updateFromPack($lang=NULL) + { + global $db; + if(!$lang) + $lang = $this->lang; + $file = BASEDIR.'/includes/langs/'.$lang.'.lang'; + if(file_exists($file)) + { + $langData = file_get_contents($file); + $phrases = json_decode($langData,true); + //First lets delete all language phrases + $db->delete(tbl("phrases"),array("lang_iso"),array($lang)); + //Now create query and then execute it + $query = "INSERT INTO ".tbl("phrases")." + (`lang_iso` ,`varname` ,`text`) + VALUES"; + + $count = 0; + foreach($phrases as $key => $phrase) + { + if($count>0) + $query .= ","; + $query .= "('$lang', '$key', '".addslashes($phrase)."')"; + $count++; + } + $query .= ";"; + + $db->Execute($query); + + } + } + +} + +?> \ No newline at end of file diff --git a/upload/includes/classes/log.class.php b/upload/includes/classes/log.class.php new file mode 100644 index 00000000..8ff0bbb1 --- /dev/null +++ b/upload/includes/classes/log.class.php @@ -0,0 +1,92 @@ +udetails['userid']; + $username = $username ? $username : $userquery->udetails['username']; + $useremail = $useremail ? $useremail : $userquery->udetails['email']; + $userlevel = $userlevel ? $userlevel : $userquery->udetails['level']; + + $success = $a['success']; + $details = $a['details']; + + $db->insert(tbl('action_log'), + array + ( + 'action_type', + 'action_username', + 'action_userid', + 'action_useremail', + 'action_ip', + 'date_added', + 'action_success', + 'action_details', + 'action_userlevel', + 'action_obj_id', + 'action_done_id', + ), + array + ( + $type, + $username, + $userid , + $useremail, + $ip, + NOW(), + $success, + $details, + $userlevel, + $action_obj_id, + $action_done_id + ) + ); + + } + +} + +?> \ No newline at end of file diff --git a/upload/includes/classes/mass_upload.class.php b/upload/includes/classes/mass_upload.class.php new file mode 100644 index 00000000..723e45eb --- /dev/null +++ b/upload/includes/classes/mass_upload.class.php @@ -0,0 +1,113 @@ +dirsep."*.".$ext); + + $set_limit = 0; + + foreach($FILES as $key => $file) + { + if( filemtime( $file ) > $sec ){ + $FILE_LIST[$key]['path'] = substr( $file, 0, ( strrpos( $file, $this->dirsep ) +1 ) ); + $FILE_LIST[$key]['file'] = substr( $file, ( strrpos( $file, $this->dirsep ) +1 ) ); + $FILE_LIST[$key]['title'] = getName($FILE_LIST[$key]['file']); + $FILE_LIST[$key]['description'] = getName($FILE_LIST[$key]['file']); + $FILE_LIST[$key]['tags'] = gentags(str_replace(" ",",",getName($FILE_LIST[$key]['file']))); + $FILE_LIST[$key]['size'] = filesize( $file ); + $FILE_LIST[$key]['date'] = date('Y-m-d G:i:s', filemtime( $file ) ); + } + } + if(!empty($FILE_LIST)){ + return $FILE_LIST; + } else { + return false; + } + } + + + /** + * Function used to get list of available files that can be processed + */ + function get_files() + { + $files = $this->glob_files(MASS_UPLOAD_DIR); + return $files; + } + + + /** + * function used to get video files only3 + */ + function get_video_files($with_path=false) + { + $exts = get_vid_extensions($with_path); + + $vid_files = array(); + $files = $this->get_files(); + if(is_array($files)) + foreach($files as $file) + { + $ext = getext($file['file']); + if(in_array($ext,$exts)) + $vid_files[] = $file; + } + return $vid_files; + } + + /** + * Moving file from MASS UPLOAD DIR TO TEMP DIR + */ + function move_to_temp($file_arr,$file_key) + { + $file = $file_arr['file']; + $mass_file = MASS_UPLOAD_DIR.'/'.$file; + $temp_file = TEMP_DIR.'/'.$file_key.'.'.getExt($file); + if(file_exists($mass_file) && is_file($mass_file)) + { + rename($mass_file,$temp_file); + //copy($mass_file,$temp_file); + return $file_key.'.'.getExt($file); + } + return false; + } + + + /** + * Function used to check weather file exists in mass upload folder or not + */ + function is_mass_file($arr) + { + $file = MASS_UPLOAD_DIR.'/'.$arr['file']; + if(file_exists($file) && is_file($file) && $arr['file']) + return true; + else + return false; + } +} + +?> \ No newline at end of file diff --git a/upload/includes/classes/menuhandler.class.php b/upload/includes/classes/menuhandler.class.php new file mode 100644 index 00000000..3a8ecfbe --- /dev/null +++ b/upload/includes/classes/menuhandler.class.php @@ -0,0 +1,204 @@ +setDisplayTypes(); + } + + function setDisplayTypes() + { + $displayTypes = array('global' => 'Global', + 'registered' => 'Registered Users', + 'guest' => 'Guest Users'); + if(count($this->displayTypes) > 0) + $displayTypes = array_merge($displayTypes,$this->displayTypes); + + $this->displayTypes = $displayTypes; + } + + function createHeadMenu($params=NULL) + { + $this->headMenu[strtolower(lang("menu_home"))] = array('name'=>lang("menu_home"), + 'link'=>BASEURL, + 'this'=>'home', + 'display_type' => 'global'); + $this->headMenu[strtolower(lang("videos"))] = array('name'=>lang("videos"), + 'link'=>cblink(array("name"=>"videos")), + 'this'=>'videos', + 'display_type' => 'global'); + //pr($this->headMenu,TRUE); + return $this->headMenu; + } + + function createHeadFile() + { + $current_menu = $this->createHeadMenu(); + $file = BASEDIR.'/includes/templates/'.$this->headFile; + if(file_exists($file)) + { + $finalArray = array(); + foreach($current_menu as $menu) + { + $finalArray[] = $menu; + } + $fo = fopen(BASEDIR.'/includes/templates/'.$this->headFile,'w+'); + fwrite($fo,json_encode($finalArray)); + fclose($fo); + return true; + } else { + e(sprintf(lang("file_not_exists"),$this->headFile)); + return false; + } + } + + function addNewTab($params=NULL) + { + if($params == NULL) + $params = $_POST; + + if(empty($params['name'])) + e(lang("tab_name_is_empty")); + if(!$this->validURL($params['link_name'])) + return false; + + if(!error()) + { + $menuName = $params['name']; + $cbLink = cblink(array('name'=>strtolower($params['link_name']))); + if($cbLink) + $fullURL = $cbLink; + elseif($params['noBASEURL']) + $fullURL = $params['link_name']; + else + { + $fullURL = BASEURL."/".$params['link_name']; + } + + $resultArray = array("name"=>$menuName,"link"=>$fullURL,"this"=>strtolower($menuName)); + return $resultArray; + } + } + + function validURL($url) + { + // Following Pattern is by DraconianDevil. Link: http://RegExr.com?2sf02 + //$pattren = '/(((http|ftp|https):\/\/)|www\.)[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:/~\+#!]*[\w\-\@?^=%&/~\+#])?/g'; + if(empty($url)) + { + e(lang("tab_url_is_empty")); + } + } + + function getMenus() + { + $files = glob(BASEDIR."/includes/templates/*.menu"); + if(!empty($files)) + { + foreach($files as $file) + { + $file_parts = explode("/",$file); + $name = $file_parts[count($file_parts)-1]; + $fileName[] = $name; + } + + return $fileName; + } else { + return false; + } + } + + function getMenuName($name) + { + if(empty($name)) + e(lang("menu_name_is_empty")); + else + { + $parts = explode(".",$name); + return $parts[0]; + } + } + + function getTabs($name) + { + if(empty($name)) + e(lang("name_is_empty")); + elseif(!file_exists(BASEDIR."/includes/templates/".$name.$this->fileExt)) + { + e(lang("menu_does_not_exist")); + } else { + $content = file_get_contents(BASEDIR."/includes/templates/".$name.$this->fileExt); + $content = json_decode($content,TRUE); + return $content; + } + } + + function getMenu($name) + { + if(empty($name)) + return false; + else + { + if(file_exists(BASEDIR."/includes/templates/".$name.$this->fileExt)) + { + return $name; + } + else + e(lang("menu_does_not_exist")); + } + } + + function updateMenu($oldName,$newName) + { + if(empty($newName)) + e(lang("menu_name_is_empty")); + elseif(!file_exists(BASEDIR."/includes/templates/".$oldName.$this->fileExt)) + e(lang("menu_does_not_exist")); + else + { + $file = BASEDIR."/includes/templates/".$oldName.$this->fileExt; + rename($file,BASEDIR."/includes/templates/".strtolower(SEO($newName)).$this->fileExt); + e(lang("menu_updated")." Go Back","m"); + } + } + + function createNewMenu($params=NULL) + { + if($params == NULL) + $params = $_POST; + + if(empty($params['menuName'])) + { + e("menu_name_is_empty"); + return false; + } else { + $name = $params['menuName']; + $file = BASEDIR."/includes/templates/".strtolower(SEO($name)).$this->fileExt; + if(file_exists($file)) + e("Menu with ".$name." name already exists"); + else + { + $fopen = fopen($file,'w+'); + if($fopen) + e(lang("New Menu Added"),"m"); + fclose($fopen); + } + } + } + +} +?> \ No newline at end of file diff --git a/upload/includes/classes/my_queries.class.php b/upload/includes/classes/my_queries.class.php new file mode 100644 index 00000000..d1e0cbed --- /dev/null +++ b/upload/includes/classes/my_queries.class.php @@ -0,0 +1,1069 @@ +config_exists($name,true); + + $db->update(tbl("config"),array('value'),array($value)," name = '".$name."'"); + //echo $db->db_query."

    "; + $Cbucket->configs = $Cbucket->get_configs(); + } + + function Get_Website_Details() + { + + $query = mysql_query("SELECT * FROM ".tbl("config")); + while($row = mysql_fetch_array($query)) + { + $name = $row['name']; + $data[$name] = $row['value']; + } + return $data; + } + + /** + * Function used to check weather config exists or not + * it also used to create a config if it does not exist + */ + function config_exists($name) + { + global $db,$Cbucket; + + $configs = $Cbucket->configs; + + if (array_key_exists($name, $configs)) + return true; + else + $db->insert(tbl("config"),array('name'),array($name)); + + /*$count = $db->count(tbl("config"),"configid"," name='$name' "); + if(!$count) + $db->insert(tbl("config"),array('name'),array($name));*/ + + return true; + } + + + + //Function Used to Check Weather Video Exists or not + function VideoExists($videoid){global $cbvid;return $cbvid->exists($videoid);} + function video_exists($videoid){return $this->VideoExists($videoid);} + function CheckVideoExists($videokey){return $this->VideoExists($videokey);} + + //Function used to Delete Video + + function DeleteVideo($videoid){ + global $cbvid; + return $cbvid->delete_video($videoid); + } + + //Video Actions - All Moved to video.class.php + function MakeFeaturedVideo($videoid){global $cbvid;return $cbvid->action('feature',$videoid);} + function MakeUnFeaturedVideo($videoid){global $cbvid;return $cbvid->action('unfeature',$videoid);} + function ActivateVideo($videoid){global $cbvid;return $cbvid->action('activate',$videoid);} + function DeActivateVideo($videoid){global $cbvid;return $cbvid->action('deactivate',$videoid);} + + + /** + * Function used to get video details + * from video table + * @param INPUT vid or videokey + */ + function get_video_details($vid){global $cbvid;return $cbvid->get_video($vid);} + function GetVideoDetails($video){return $this->get_video_details($video);} + function GetVideDetails($video){return $this->get_video_details($video);} + + + //Function Used To Update Videos Views + function UpdateVideoViews($vkey){increment_views($vkey,'video');} + + /** + * Function used to check weather username exists not + */ + function check_user($username){ + global $userquery; + return $userquery->username_exists($username); + } + + /** + * Function used to check weather email exists not + */ + function check_email($email){ + global $userquery; + return $userquery->email_exists($email); + } + + /** + * Function used to delete comments + * @param CID + */ + function delete_comment($cid,$type='v',$is_reply=FALSE,$forceDelete=false) + { + global $db,$userquery,$LANG; + //first get comment details + + $cdetails = $this->get_comment($cid); + $uid = user_id(); + + if(($uid == $cdetails['userid'] && $cdetails['userid']!='') + || $cdetails['type_owner_id'] == userid() + || has_access("admin_del_access",false) + || $is_reply==TRUE || $forceDelete) + { + $replies = $this->get_comments($cdetails['type_id'],$type,FALSE,$cid,TRUE); + if(count($replies)>0 && is_array($replies)) + { + foreach($replies as $reply) + { + $this->delete_comment($reply['comment_id'],$type,TRUE,$forceDelete); + } + } + $db->Execute("DELETE FROM ".tbl("comments")." WHERE comment_id='$cid'"); + + /*if($uid) + $myquery->update_comments_by_user($uid);*/ + + e(lang('usr_cmt_del_msg'),"m"); + return $cdetails['type_id']; + }else{ + e(lang('no_comment_del_perm')); + return false; + } + return false; + } + function DeleteComment($id,$videoid){return $this->delete_comment($videoid);} + + /** + * Function used to set comment as spam + */ + function spam_comment($cid) + { + global $db; + $comment = $this->get_comment($cid); + $uid = user_id(); + if($comment) + { + $voters = $comment['spam_voters']; + + $niddle = "|"; + $niddle .= userid(); + $niddle .= "|"; + $flag = strstr($voters, $niddle); + + if(!$comment) + e(lang('no_comment_exists')); + elseif(!userid()) + e(lang('login_to_mark_as_spam')); + elseif( userid()==$comment['userid'] || (!userid() && $_SERVER['REMOTE_ADDR'] == $comment['comment_ip'])) + e(lang('no_own_commen_spam')); + elseif(!empty($flag)) + e(lang('already_spammed_comment')); + else + { + if(empty($voters)) + $voters .= "|"; + + $voters .= userid(); + $voters.= "|"; + + $newscore = $comment['spam_votes']+1; + $db->update(tbl('comments'),array('spam_votes','spam_voters'),array($newscore,$voters)," comment_id='$cid'"); + e(lang('spam_comment_ok'),"m"); + return $newscore; + } + + } + e(lang('no_comment_exists')); + return false; + } + + /** + * Function used to set comment as spam + */ + function remove_spam($cid) { + global $db; + $comment = $this->get_comment($cid); + $vote = '0'; + $none = ''; + + if($comment) { + $votes = $comment['spam_votes']; + if(!$votes) { + e(lang('Comment is not a spam')); + } elseif(!userid()) { + e(lang('login_to_mark_as_spam')); + } else { + $db->update(tbl('comments'),array('spam_votes','spam_voters'),array($vote,$none)," comment_id='$cid'"); + e(lang('Spam removed from comment.'),"m"); + } + } else { + e(lang('no_comment_exists')); + } + } + + + /** + * Function used to delete all comments of particlar object + */ + function delete_comments($objid,$type='v',$forceDelete=false) + { + global $db,$userquery,$LANG; + + $uid = user_id(); + + if($userquery->permission['admin_del_access'] == 'yes' || $forceDelete) + { + $db->Execute("DELETE FROM ".tbl("comments")." WHERE type_id='$objid' AND type='$type' "); + + e(lang('usr_cmt_del_msg'),'m'); + return true; + }else{ + e(lang('no_comment_del_perm')); + return false; + } + return false; + } + + /*** + * Function used to rate comment + ***/ + function rate_comment($rate,$cid) + { + global $db; + $comment = $this->get_comment($cid); + $voters = $comment['voters']; + + $niddle = "|"; + $niddle .= userid(); + $niddle .= "|"; + $flag = strstr($voters, $niddle); + + if(!$comment) + e(lang('no_comment_exists')); + elseif(!userid()) + e(lang('class_comment_err6')); + elseif(userid()==$comment['userid'] || (!userid() && $_SERVER['REMOTE_ADDR'] == $comment['comment_ip'])) + e(lang('no_own_commen_rate')); + elseif(!empty($flag)) + e(lang('class_comment_err7')); + else + { + if(empty($voters)) + $voters .= "|"; + + $voters .= userid(); + $voters.= "|"; + + $newscore = $comment['vote']+$rate; + $db->update(tbl('comments'),array('vote','voters'),array($newscore,$voters)," comment_id='$cid'"); + + e(lang('thanks_rating_comment'),"m"); + return $newscore; + } + + return false; + } + + + //Function Used To Varify Syntax + function isValidSyntax($syntax){ + global $LANG; + $pattern = "^^[_a-z0-9-]+$"; + if (eregi($pattern, $syntax)){ + return true; + }else { + return false; + } + } + + + /** + * FUNCTION USED TO GET VIDEOS FROM DATABASE + * @param: array of query parameters array() + * featured => '' (yes,no) + * username => '' (TEXT) + * title => '' (TEXT) + * tags => '' (TEXT) + * category => '' (INT) + * limit => '' (OFFSET,LIMIT) + * order=>'' (BY SORT) -- (date_added DESC) + * extra_param=>'' ANYTHING FOR MYSQL QUERY + * @param: boolean + * @param: results type (results,query) + */ + + function getVideoList($param=array(),$global_cond=true,$result='results') + { + global $db; + + $sql = "SELECT * FROM video"; + + //Global Condition For Videos + if($global_cond==true) + $cond = "broadcast='public' AND active='yes' AND status='Successful'"; + //Checking Condition + if(!empty($param['featured'])) + { + $param['featured'] = 'yes' ? 'yes' : 'no'; + $cond .=" AND featured= '".$param['featured']."' "; + } + if(!empty($param['username'])) + { + $username = mysql_clean($param['username']); + $cond .=" AND featured= '".$username."' "; + } + if(!empty($param['category'])) + { + $category = intval($param['category']); + $cond .=" AND (category01= '".$category."' OR category02= '".$category."' OR category03= '".$category."') "; + } + if(!empty($param['tags'])) + { + $tags = mysql_clean($param['tags']); + $cond .=" AND tags LIKE '%".$tags."%' "; + } + if(!empty($param['title'])) + { + $tags = mysql_clean($param['tags']); + $cond .=" AND title LIKE '%".$param['title']."%' "; + } + + //Adding Condition in Query + if(!empty($cond)) + $sql .= " WHERE $cond "; + + //SORTING VIDEOS + if(!empty($param['order'])) + $sort = 'ORDER BY '.$param['order']; + + //Adding Sorting In Query + $sql .= $sort; + + //LIMITING VIDEO LIST + if(empty($param['limit'])) + $limit = " LIMIT ". VLISTPP; + elseif($param['limit']=='nolimit') + $limit = ''; + else + $limit = " LIMIT ".$param['limit']; + + $sql .= $limit; + //Final Executing of Query and Returning Results + if($result=='results') + return $db->Execute($sql); + else + return $sql; + } + + + /** + * Function used to send subsribtion message + */ + function send_subscription($subscriber,$from,$video) + { + global $LANG; + //First checking weather $subscriber exists or not + $array = array('%subscriber%','%user%','%website_title%'); + $replace = array($subscriber,$from,TITLE); + + $to = $subscriber; + $subj = str_replace($array,$replace,lang('user_subscribe_subject')); + + //Get Subscription Message Template + $msg = get_subscription_template(); + $msg = str_replace($array,$replace,$msg); + $this->SendMessage($to,$from,$subj,$msg,$video,0,0); + } + + + /** + * Function used to add comment + * This is more advance function , + * in this function functions can be applied on comments + */ + function add_comment($comment,$obj_id,$reply_to=NULL,$type='v',$obj_owner=NULL,$obj_link=NULL,$force_name_email=false) + { + global $userquery,$eh,$db,$Cbucket; + //Checking maximum comments characters allowed + if(defined("MAX_COMMENT_CHR")) + { + if(strlen($comment) > MAX_COMMENT_CHR) + e(sprintf("'%d' characters allowed for comment",MAX_COMMENT_CHR)); + } + if(!verify_captcha()) + e(lang('usr_ccode_err')); + if(empty($comment)) + e(lang("pelase_enter_something_for_comment")); + + $params = array('comment'=>$comment,'obj_id'=>$obj_id,'reply_to'=>$reply_to,'type'=>$type); + $this->validate_comment_functions($params); + /* + if($type=='video' || $type=='v') + { + if(!$this->video_exists($obj_id)) + e(lang("class_vdo_del_err")); + + //Checking owner of video + if(!USER_COMMENT_OWN) + { + if(userid()==$this->get_vid_owner($obj_id)); + e(lang("usr_cmt_err2")); + } + } + */ + + if(!userid() && $Cbucket->configs['anonym_comments']!='yes') + e(lang("you_not_logged_in")); + + if((!userid() && $Cbucket->configs['anonym_comments']=='yes') || $force_name_email) + { + //Checking for input name and email + if(empty($_POST['name'])) + e(lang("please_enter_your_name")); + if(empty($_POST['email'])) + e(lang("please_enter_your_email")); + + $name = mysql_clean($_POST['name']); + $email = mysql_clean($_POST['email']); + } + + if(empty($eh->error_list)) + { + $db->insert(tbl("comments"),array + ('type,comment,type_id,userid,date_added,parent_id,anonym_name,anonym_email','comment_ip','type_owner_id'), + array + ($type,$comment,$obj_id,userid(),NOW(),$reply_to,$name,$email,$_SERVER['REMOTE_ADDR'],$obj_owner)); + + $db->update(tbl("users"),array("total_comments"),array("|f|total_comments+1")," userid='".userid()."'"); + + e(lang("grp_comment_msg"),"m"); + + $cid = $db->insert_id(); + $own_details = $userquery->get_user_field_only($obj_owner,'email'); + + + $username = username(); + $username = $username ? $username : post('name'); + $useremail = $email; + + //Adding Comment Log + $log_array = array + ( + 'success'=>'yes', + 'action_obj_id' => $cid, + 'action_done_id' => $obj_id, + 'details'=> "made a comment", + 'username'=>$username, + 'useremail'=>$useremail, + ); + insert_log($type.'_comment',$log_array); + + //sending email + if(SEND_COMMENT_NOTIFICATION=='yes' && $own_details ) + { + + global $cbemail; + + $tpl = $cbemail->get_template('user_comment_email'); + + $more_var = array + ('{username}' => $username, + '{obj_link}' => $obj_link.'#comment_'.$cid, + '{comment}' => $comment, + '{obj}' => get_obj_type($type) + ); + if(!is_array($var)) + $var = array(); + $var = array_merge($more_var,$var); + $subj = $cbemail->replace($tpl['email_template_subject'],$var); + $msg = nl2br($cbemail->replace($tpl['email_template'],$var)); + + //Now Finally Sending Email + cbmail(array('to'=>$own_details,'from'=>WEBSITE_EMAIL,'subject'=>$subj,'content'=>$msg)); + } + + + return $cid; + } + + return false; + } + + + + /** + * Function used to get file details from database + */ + function file_details($file_name) + { + global $db; + return get_file_details($file_name); + /*$results = $db->select("video_files","*"," src_name='$file_name'"); + if($db->num_rows==0) + return false; + else + { + return $results[0]; + }*/ + } + + + + /** + * Function used to update video and set a thumb as default + * @param VID + * @param THUMB NUM + */ + function set_default_thumb($vid,$thumb) + { + global $cbvid; + return $cbvid->set_default_thumb($vid,$thumb); + } + + + + + /** + * Function used to update video + */ + function update_video() + { + global $cbvid; + return $cbvid->update_video(); + } + + + + /** + * Function used to get categorie details + */ + function get_category($id) + { + global $db; + $results = $db->select(tbl("category"),"*"," categoryid='$id'"); + return $results[0]; + } + + + /** + * Function used to get comment from its ID + * @param ID + */ + function get_comment($id) + { + global $db,$userquery; + $result = $db->select(tbl("comments"),"*"," comment_id='$id'"); + if($db->num_rows>0) + { + $result = $result[0]; + if($result['userid']) + $udetails = $userquery->get_user_details($result['userid']); + if($udetails) + $result = array_merge($result,$udetails); + return $result ; + }else{ + return false; + } + } + + /** + * Function used to get from database + * @param TYPE_ID + * @param TYPE + * @param COUNT_ONLY Boolean + * @param PARENT_ID + * @param GET_REPLYIES_ONLY Boolean + */ + function get_comments($type_id='*',$type='v',$count_only=FALSE,$get_type='all',$parent_id=NULL,$useCache='yes') + { + + $params = array( + 'type_id' => $type_id, + 'type' => $type, + 'count_only' => $count_only, + 'get_type' => $get_type, + 'parent_id' => $parent_id, + 'cache' => $useCache + ); + + return $this->getComments($params); + } + + /** + * Function used to get using ARRAY as paramter + */ + function getComments($params) + { + global $db,$userquery; + $cond = ''; + + if(!$params['cache']) + $params['cache'] = 'yes'; + + $p = $params; + extract( $p, EXTR_SKIP ); + + + switch($type) + { + case "video": + case "videos": + case "v": + case "vdo": + { + $type = 'v'; + } + break; + + case "photo": + case "p": + case "photos": + { + $type='p'; + } + break; + + case "topic": + case "t": + case "topics": + { + $type='t'; + } + break; + + case "channel": + case "c": + case "channels": + { + $type='c'; + } + break; + + case "cl": + case "collect": + case "collection": + case "collections": + { + $type='cl'; + } + break; + + } + + if(!$count_only && $params['cache']=='yes') + { + $file = $type.$type_id.str_replace(',','_',$limit).'-'.strtotime($last_update).'.tmp'; + + $files = glob(COMM_CACHE_DIR.'/'.$type.$type_id.str_replace(',','_',$limit).'*'); + + $theFile = getName($files[0]); + $theFileDetails = explode('-',$theFile); + $timeDiff = time() - $theFileDetails[1]; + + if(file_exists(COMM_CACHE_DIR.'/'.$file) && $timeDiff < COMM_CACHE_TIME) + return json_decode(file_get_contents(COMM_CACHE_DIR.'/'.$file),true); + } + + if(!$order) + $order = ' date_added DESC '; + #Checking if user wants to get replies of comment + if($parent_id!=NULL && $get_reply_only) + { + $cond .= " AND parent_id='$parent_id'"; + } + + if($type_id!='*') + $typeid_query = "AND type_id='$type_id' "; + + if(!$count_only) + { + /** + * we have to get comments in such way that + * comment replies comes along with their parents + * in order to achieve this, we have to create a complex logic + * lets see if we can get some tips from WP commenting system ;) + * HAIL Open Source + */ + + $results = $db->select(tbl("comments"),'*' + ," type='$type' $typeid_query $cond",$limit,$order); + + if(!$results) + return false; + $parent_cond = ''; + + $parents_array = array(); + if($results) + foreach($results as $result) + { + if($result['parent_id'] && !in_array($result['parent_id'],$parents_array)) + { + if($parent_cond) + $parent_cond .= " OR "; + $parent_cond .= " comment_id='".$result['parent_id']."' " ; + + $parents_array[] = $result['parent_id']; + } + } + + //Getting Parents + $parents = $db->select(tbl("comments"),'*' + ," type='$type' AND ($parent_cond) ",NULL,$order); + + if($parents) + foreach($parents as $parent) + $new_parents[$parent['comment_id']] = $parent; + + + //Inserting user data + $new_results = array(); + foreach($results as $com) + { + $userid = $com['userid']; + + $uservar = 'user_'.$userid; + + if($userid && !$$uservar) + $$uservar = $userquery->get_user_details($userid); + + if($$uservar) + $com = array_merge($com,$$uservar); + + $new_results[] = $com; + } + + $comment['comments'] = $new_results; + $comment['parents'] = $new_parents; + + //Deleting any other previuos comment file + $files = glob(COMM_CACHE_DIR.'/'.$type.$type_id.str_replace(',','_',$limit).'*'); + + if($files) + foreach($files as $delFile) + if(file_exists($delFile)) + unlink($delFile); + + //Caching comment file + if($file) + file_put_contents(COMM_CACHE_DIR.'/'.$file,json_encode($comment)); + return $comment; + + }else + { + return $db->count(tbl("comments"),"*"," type='$type' $typeid_query $cond"); + } + } + + + /** + * Function used to get from database + * with nested replies + */ + /*function get_comments($obj_id,$type='v',$parent_only=TRUE,$count_only=FALSE) + { + global $db; + $cond = ''; + $user_flds = tbl("users.userid").",".tbl("users.username").",".tbl("users.email").",".tbl("users.avatar").",".tbl("users.avatar_url"); + if($obj_id != "all") + $cond = " type_id = '$obj_id'"; + else + $cond = " "; + + if(!empty($cond)) + $cond .= " AND "; + + if($parent_only && is_numeric($parent_only)) + { + $parent_id = $parent_only; + $cond .= " parent_id='$parent_id'"; + } else { + $cond .= " parent_id = '0'"; + } + + if(!$count_only) + { + $result = $db->select(tbl("comments,users"),tbl("comments").".*, $user_flds"," $cond AND type='$type' AND ".tbl("comments.userid")." = ".tbl("users.userid").""); + //echo $db->db_query; + $ayn_result = $db->select(tbl("comments,users"),tbl("comments").".*, $user_flds"," $cond AND type='$type' AND ".tbl("comments.userid")." = '0'"); + if($result && $ayn_result) + $result = array_merge($result,$ayn_result); + elseif(!$result && $ayn_result) + $result = $ayn_result; + + $arr = array(); + foreach($result as $comment) + { + $arr[$comment['comment_id']] = $comment; + $replies = $this->get_replies($comment['comment_id'],$type); + if($replies) + { + $arr[$comment['comment_id']][] = $replies; + } + } + + return $arr; + } + }*/ + + function get_replies($p_id,$type='v') + { + global $db; + $result = $db->select(tbl("comments,users"),"*"," type='$type' AND parent_id = '$p_id' AND ".tbl("comments.userid")." = ".tbl("users.userid").""); + $ayn_result = $db->select(tbl("comments,users"),"*"," type='$type' AND parent_id = '$p_id' AND ".tbl("comments.userid")." = '0'"); + + if($result && $ayn_result) + $result = array_merge($result,$ayn_result); + elseif(!$result && $ayn_result) + $result = $ayn_result; + + return $result; + } + + /** + * Function used to get video owner + */ + function get_vid_owner($vid) + { + global $db; + $results = $db->select(tbl("video"),"userid"," videoid='$vid'"); + return $results[0]; + } + + /** + * Function used to set website template + */ + function set_template($template) + { + global $myquery; + if(is_dir(STYLES_DIR.'/'.$template) && $template) + { + $myquery->Set_Website_Details('template_dir',$template); + e(lang("template_activated"),'m'); + }else + e(lang("error_occured_changing_template")); + + } + + + /** + * Function used to update comment + */ + function update_comment($cid,$text) + { + global $db; + $db->Execute("UPDATE ".tbl("comments")." SET comment='$text' WHERE comment_id='$cid'"); + //$db->update(tbl("comments"),array("comment"),array($text)," comment_id = $cid"); + } + + + /** + * Function used to validate comments + */ + function validate_comment_functions($params) + { + $type = $params['type']; + $obj_id = $params['obj_id']; + $comment = $params['comment']; + $reply_to = $params['reply_to']; + + if($type=='video' || $type=='v') + { + if(!$this->video_exists($obj_id)) + e(lang("class_vdo_del_err")); + + //Checking owner of video + //if(!USER_COMMENT_OWN) + //{ + // if(userid()==$this->get_vid_owner($obj_id)); + /// e(lang("usr_cmt_err2")); + //} + } + + $func_array = get_functions('validate_comment_functions'); + if(is_array($func_array)) + { + foreach($func_array as $func) + { + if(function_exists($func)) + { + return $func($params); + } + } + } + + } + + + /** + * Function used to insert note in data base for admin referance + */ + function insert_note($note) + { + global $db; + $db->insert(tbl('admin_notes'),array('note,date_added,userid'),array($note,now(),userid())); + } + /** + * Function used to get notes + */ + function get_notes() + { + global $db; + return $db->select(tbl('admin_notes'),'*'," userid='".userid()."'",NULL," date_added DESC "); + } + /** + * Function usde to delete note + */ + function delete_note($id) + { + global $db; + $db->delete(tbl("admin_notes"),array("note_id"),array($id)); + } + + + /** + * Function used to check weather object is commentable or not + */ + function is_commentable($obj,$type) + { + switch($type) + { + case "video": + case "v": + case "vdo": + case "videos": + case "vid": + { + if($obj['allow_comments'] == 'yes' && config('video_comments')==1) + return true; + } + break; + + case "channel": + case "user": + case "users": + case "u": + case "c": + { + if($obj['allow_comments'] == 'Yes' && config('channel_comments')==1) + return true; + } + break; + + case "collection": + case "collect": + case "cl": + { + if($obj['allow_comments'] == 'yes') + return true; + } + break; + + case "photo": + case "p": + case "photos": + { + if($obj['allow_comments'] == 'yes' && config('photo_comments') == 1) + return true; + } + } + return false; + } + + /** + * Function used to get list of items in conversion queue + * @params $Cond, $limit,$order + */ + function get_conversion_queue($cond=NULL,$limit=NULL,$order='date_added DESC') + { + global $db; + $result = $db->select(tbl("conversion_queue"),"*",$cond,$limit,$oder); + if($db->num_rows>0) + return $result; + else + return false; + } + + /** + * function used to remove queue + */ + function queue_action($action,$id) + { + global $db; + switch($action) + { + case "delete": + $db->execute("DELETE from ".tbl('conversion_queue')." WHERE cqueue_id ='$id' "); + break; + case "processed": + $db->update(tbl('conversion_queue'),array('cqueue_conversion'),array('yes')," cqueue_id ='$id' "); + break; + case "pending": + $db->update(tbl('conversion_queue'),array('cqueue_conversion'),array('no')," cqueue_id ='$id' "); + break; + } + } + + + +} +?> \ No newline at end of file diff --git a/upload/includes/classes/objects.class.php b/upload/includes/classes/objects.class.php new file mode 100644 index 00000000..697d6338 --- /dev/null +++ b/upload/includes/classes/objects.class.php @@ -0,0 +1,66 @@ +\n"; + foreach($templates as $template) + { + if($template['name']!='') + $dd .= "\n"; + } + $dd .="\n"; + + return $dd; + } + + /** + * This will display language selector for front UI + */ + function display_languages($id='lang_selector',$class='lang_selector',$onchange='') + { + global $lang_obj; + $langs = $lang_obj->get_langs('yes'); + + if($class) + $class_attr = ' class="'.$class.'" '; + + if($onchange) + $onchange_attr = ' onChange="'.$onchange.'" '; + + $obj = "\n"; + return $obj; + } +} + +?> \ No newline at end of file diff --git a/upload/includes/classes/pages.class.php b/upload/includes/classes/pages.class.php new file mode 100644 index 00000000..94830482 --- /dev/null +++ b/upload/includes/classes/pages.class.php @@ -0,0 +1,386 @@ +GetServerUrl(); + $scriptPath = NULL; + + + if ( isset($_SERVER['SCRIPT_NAME']) ) { + $scriptPath = $_SERVER['SCRIPT_NAME']; + $scriptPath = ( $scriptPath == '/' ) ? '' : dirname($scriptPath); + } + + $base = basename(dirname($_SERVER['SCRIPT_NAME'])); + + + $sus_dirs = array('admin_area','includes','plugins','files','actions','cb_install'); + + + $remove_arr = array(); + $remove_arr[] = '/:\/\/www\./'; + + if($more) + $remove_arr[] = $more; + if(in_array($base,$sus_dirs)) + $remove_arr[] = '/\/'.$base.'/'; + + //Clearing Plugin and Player baseurl + if(strstr($scriptPath,'/plugins/')) + $scriptPath = preg_replace('/(.*)\/plugins(.*)/i',"$1",$scriptPath); + if(strstr($scriptPath,'/player/')) + $scriptPath = preg_replace('/(.*)\/plugins(.*)/i',"$1",$scriptPath); + + $baseURL = $serverURL . $scriptPath; + + $baseURL = preg_replace($remove_arr,'',$baseURL); + + if(substr($baseURL,strlen($baseURL)-1,1)=='/') + $baseURL = substr($baseURL,0,strlen($baseURL)-1); + + return $baseURL; + } + + function GetCurrentUrl() + { + global $in_bg_cron; + if(!$in_bg_cron) + { + $serverURL = $this->GetServerUrl(); + $requestURL = $_SERVER['REQUEST_URI']; + + return $serverURL . $requestURL; + } + } + + //This Function Set The PageDirect + function page_redir(){ + setcookie("pageredir",clean($this->GetCurrentUrl()),time()+7200,'/'); + Assign('pageredir',@$_COOKIE['pageredir']); + } + + //This Funtion is use to Show Admin Panels Pages + + function show_admin_page($page){ + $pages = array( + 'main' => 'main.php', + 'server_check' => 'verifier.php', + 'members_showall' => 'members.php?view=showall', + 'members_inactive' => 'members.php?view=inactive', + 'members_active' => 'members.php?view=active', + 'members_addmember' => 'members.php?view=addmember', + 'members_search' => 'members.php?view=search' + ); + return @$pages[$page]; + } + + + //Redirects page to without www. + function redirectOrig() + { + $curpage = $this->GetCurrentUrl(); + $newPage = preg_replace('/:\/\/www\./','://',$curpage); + if($curpage !=$newPage) + header("location:$newPage"); + } + + function create_url($params_array,$url=NULL,$remove_param=false,$urlencode=false) + { + if($url==NULL or $url == 'auto') + { + if($_SERVER['QUERY_STRING']) + $url = '?'.$_SERVER['QUERY_STRING']; + } + + $new_link = ''; + $new_link .= $url; + if(is_array($params_array)) + { + foreach($params_array as $name => $value) + { + if($url) + $new_link .='&'.$name.'='.$value; + else + $new_link .='?'.$name.'='.$value; + } + } + + return $new_link; + } + + //This Fucntion is used to Redirect to respective URL + + function redirect($url){ + echo ''; + } + + /** + * Function used to create link + */ + function create_link($page,$link=NULL,$extra_params=NULL,$tag=' #page# ',$return_param=false) + { + if($link==NULL or $link == 'auto') + { + if($_SERVER['QUERY_STRING']) + $link = '?'.$_SERVER['QUERY_STRING']; + } + + + $page_pattern = '#page#'; + $param_pattern = '#params#'; + $page_url_param = $this->url_page_var; + $page_link_pattern = $page_url_param.'='.$page_pattern; + $link = preg_replace(array('/(\?page=[0-9]+)/','/(&page=[0-9]+)/','/(page=[0-9+])+/'),'',$link); + + preg_match('/\?/',$link,$matches); + + $no_seo = false; + if(!empty($matches[0])) + { + $no_seo = true; + $page_link = '&'.$page_link_pattern; + }else{ + $page_link = '?'.$page_link_pattern; + } + + //Now checking if url is using & and ? then do not apply PAGE using slash instead use & or ? + $current_url = $_SERVER['REQUEST_URI']; + preg_match('/\?/',$current_url,$cur_matches); + if(count($cur_matches)) + $has_q = true; + preg_match('/\.php/',$current_url,$cur_matches); + if(count($cur_matches)) + $has_php = true; + preg_match('/&/',$current_url,$cur_matches); + if(count($cur_matches)) + $has_amp = true; + + $link = $link.$page_link; + $params = 'href="'.$link.'"'; + $params .= ' '.$extra_params; + + if($has_php && ($has_amp || $has_q)) + $use_seo = false; + else + $use_seo = true; + + if(SEO=='yes' && THIS_PAGE !='search_result' && !BACK_END && $use_seo) + { + if(count($_GET)==0 || (count($_GET)==3 && isset($_GET['page']))) + $params = $params; + else + $params ='href="./'.$page.'"'; + } + + + $final_link = preg_replace(array("/$page_pattern/i","/$param_pattern/i"),array($page,$params),$tag); + $final_link = preg_replace(array("/$page_pattern/i","/$param_pattern/i"),array($page,$params),$final_link); + + if($return_param) + { + return preg_replace("/$page_pattern/i",$page,$params); + } + + return ' '.$final_link.' '; + } + + /** + * Function used to create pagination + * @param : total number of pags + * @param : current page + * @param : extra paraments in the tag ie #page#') + { + + if($total==0) + return false; + if($page<=0||$page==''||!is_numeric($page)) + $page = 1; + $total_pages = $total; + $pagination_start = 14; + $display_page = 7; + $this->selected = $selected = $page; + $hellip = '…'; + $first_hellip = ''; + $second_hellip = ''; + + $start = ''; + $mid = ''; + $end = ''; + + $start_last = ''; + $end_first = ''; + + $mid_first = ''; + $mid_last = ''; + + $differ = round(($display_page/2)+.49,0)-1; + + if($pagination_start < $total_pages) + { + + //Starting First + for($i=1;$i<=$display_page;$i++) + { + if($selected == $i) + { + $start .= ' '.$i.' '; + }else + $start .= $this->create_link($i,$link,$extra_params,$tag); + $start_last = $i; + } + + + //Starring Last + for($i=$total_pages-$display_page;$i<=$total_pages;$i++) + { + if($end_first=='') + $end_first = $i; + + if($selected == $i) + { + $end .= ' '.$i.' '; + }else + $end .= $this->create_link($i,$link,$extra_params,$tag); + } + + //Starting mid + for($i=$selected-$differ;$i<=$selected+$differ;$i++) + { + if($mid_first=='') + $mid_first = $i; + + if($i>$start_last && $i<$end_first) + { + if($selected == $i) + { + $mid .= ' '.$i.' '; + }else + $mid .= $this->create_link($i,$link,$extra_params,$tag); + } + + $mid_last = $i; + } + + + if($start_last < $mid_first) + $first_hellip = $hellip; + if($end_first > $mid_last) + $second_hellip = $hellip; + + //Previous Page + if($selected-1 > 1) + $this->pre_link = $this->create_link($selected-1,$link,$extra_params,$tag,true); + //Next Page + if($selected+1 < $total) + $this->next_link = $this->create_link($selected+1,$link,$extra_params,$tag,true); + //First Page + if($selected!=1) + $this->first_link = $this->create_link(1,$link,$extra_params,$tag,true); + //First Page + if($selected!=$total) + $this->last_link = $this->create_link($total,$link,$extra_params,$tag,true); + + return $start.$first_hellip.$mid.$second_hellip.$end; + }else{ + $pagination_smart = ''; + for($i=1;$i<=$total_pages;$i++) + { + if($i == $selected) + $pagination_smart .= ' '.$i.' '; + else + $pagination_smart .=$this->create_link($i,$link,$extra_params,$tag); + } + + //Previous Page + if($selected-1 > 1) + $this->pre_link = $this->create_link($selected-1,$link,$extra_params,$tag,true); + //Next Page + if($selected+1 < $total) + $this->next_link = $this->create_link($selected+1,$link,$extra_params,$tag,true); + //First Page + if($selected!=1) + $this->first_link = $this->create_link(1,$link,$extra_params,$tag,true); + //First Page + if($selected!=$total) + $this->last_link = $this->create_link($total,$link,$extra_params,$tag,true); + + return $pagination_smart; + } + } + + + /** + * Function used to create pagination and assign values that can bee used in template + */ + function paginate($total,$page,$link=NULL,$extra_params=NULL,$tag='#page#') + { + + $this->pagination = $this->pagination($total,$page,$link,$extra_params,$tag); + + //Assigning Variable that can be used in templates + assign('pagination',$this->pagination); + + assign('next_link',$this->next_link); + assign('pre_link',$this->pre_link); + + assign('next_page',$page+1); + assign('pre_page',$page-1); + + assign('first_link',$this->first_link); + assign('last_link',$this->last_link); + } + +} +?> \ No newline at end of file diff --git a/upload/includes/classes/photos.class.php b/upload/includes/classes/photos.class.php new file mode 100644 index 00000000..185bb202 --- /dev/null +++ b/upload/includes/classes/photos.class.php @@ -0,0 +1,2598 @@ +exts = array('jpg','png','gif','jpeg'); // This should be added from Admin Area. may be some people also want to allow BMPs; + $this->embed_types = array("html","forum","email","direct"); + + } + + /** + * Setting up Photos Section + */ + function init_photos() + { + $this->init_actions(); + $this->init_collections(); + $this->photos_admin_menu(); + $this->setting_other_things(); + $this->set_photo_max_size(); + } + + /** + * Initiating Actions for Photos + */ + function init_actions() + { + $this->action = new cbactions(); + $this->action->init(); // Setting up reporting excuses + $this->action->type = 'p'; + $this->action->name = 'photo'; + $this->action->obj_class = 'cbphoto'; + $this->action->check_func = 'photo_exists'; + $this->action->type_tbl = "photos"; + $this->action->type_id_field = 'photo_id'; + + + } + + /** + * Setting Email Settings + */ + function set_share_email($data) + { + $this->share_email_vars = array( + '{photo_title}' => $data['photo_title'], + '{photo_description}' => $data['photo_description'], + '{photo_link}' => $this->collection->collection_links($data,'view_item'), + '{photo_thumb}' => $this->get_image_file($data['photo_id'],'m') + ); + $this->action->share_template_name = 'photo_share_template'; + $this->action->val_array = $this->share_email_vars; + } + + + + /** + * Initiating Collections for Photos + */ + function init_collections() + { + $this->collection = new Collections; + $this->collection->objType = "p"; + $this->collection->objClass = "cbphoto"; + $this->collection->objTable = "photos"; + $this->collection->objName = "Photo"; + $this->collection->objFunction = "photo_exists"; + $this->collection->objFieldID = "photo_id"; + $this->photo_register_function('delete_collection_photos'); + } + + /** + * Create Admin Area menu for photos + */ + function photos_admin_menu() + { + global $Cbucket,$cbcollection,$userquery; + $am = $Cbucket->AdminMenu; + $per = $userquery->get_user_level(userid()); + + + if($per['photos_moderation'] == "yes") + $am['Photos'] = array( + 'Photo Manager' => 'photo_manager.php', + 'Flagged Photos' => 'flagged_photos.php', + 'Orphan Photos' => 'orphan_photos.php', + 'Photo Settings' => 'photo_settings.php', + 'Watermark Settings' => 'photo_settings.php?mode=watermark_settings', + 'Recreate Thumbs' => 'recreate_thumbs.php?mode=mass' + ); + $Cbucket->AdminMenu = $am; + } + + + /** + * Setting other things + */ + function setting_other_things() + { + global $userquery,$Cbucket; + // Search type + if(isSectionEnabled('photos')) + $Cbucket->search_types['photos'] = "cbphoto"; + + // My account links + $accountLinks = array(); + $accountLinks = array( + lang('manage_photos') => "manage_photos.php", + lang('manage_favorite_photos') => "manage_photos.php?mode=favorite", + lang('manage_my_album') => "manage_photos.php?mode=my_album", + ); + if(isSectionEnabled('photos')) + $userquery->user_account[lang('Photos')] = $accountLinks; + + //Setting Cbucket links + + $Cbucket->links['photos'] = array('photos.php','photos/'); + $Cbucket->links['manage_photos'] = array('manage_photos.php','manage_photos.php'); + $Cbucket->links['edit_photo'] = array('edit_photo.php?photo=','edit_photo.php?photo='); + $Cbucket->links['photo_upload'] = array('photo_upload.php','photo_upload'); + $Cbucket->links['manage_favorite_photos'] = array('manage_photos.php?mode=favorite','manage_photos.php?mode=favorite'); + $Cbucket->links['manage_orphan_photos'] = array('manage_photos.php?mode=orphan','manage_photos.php?mode=orphan'); + $Cbucket->links['user_photos'] = array('user_photos.php?mode=uploaded&user=','user_photos.php?mode=uploaded&user='); + $Cbucket->links['user_fav_photos'] = array('user_photos.php?mode=favorite&user=','user_photos.php?mode=favorite&user='); + + // Setting Home Tab + + } + + /** + * Initiatting Search + */ + function init_search() + { + $this->search = new cbsearch; + $this->search->db_tbl = "photos"; + $this->search->use_match_method = TRUE; + + $this->search->columns = array( + array("field"=>"photo_title","type"=>"LIKE","var"=>"%{KEY}%"), + array("field"=>"photo_tags","type"=>"LIKE","var"=>"%{KEY}%","op"=>"OR") + ); + $this->search->match_fields = array("photo_title","photo_tags"); + $this->search->cat_tbl = $this->cat_tbl; + + $this->search->display_template = LAYOUT.'/blocks/photo.html'; + $this->search->template_var = 'photo'; + $this->search->has_user_id = true; + $this->search->results_per_page = config('photo_search_result'); + $this->search->search_type['photos'] = array('title'=>lang('photos')); + $this->search->add_cond(tbl('photos.collection_id')." <> 0"); + + $sorting = array( + 'date_added'=> lang("date_added"), + 'views' => lang("views"), + 'total_comments' => lang("comments"), + 'rating' => lang("rating"), + 'total_favorites' => lang("favorites") + ); + + $this->search->sorting = array( + 'date_added'=> " date_added DESC", + 'views' => " views DESC", + 'rating' => " rating DESC, rated_by DESC", + 'total_comments' => " total_comments DESC ", + 'total_favorites' => " total_favorites DESC" + ); + + $array = $_GET; + $uploaded = $array['datemargin']; + $sort = $array['sort']; + + $forms = array( + 'query' => array( + 'title'=> lang('keywords'), + 'type'=> 'textfield', + 'name'=> 'query', + 'id'=> 'query', + 'value'=>cleanForm($array['query']) + ), + 'date_margin' => array( + 'title' => lang('uploaded'), + 'type' => 'dropdown', + 'name' => 'datemargin', + 'id' => 'datemargin', + 'value' => $this->search->date_margins(), + 'checked' => $uploaded, + ), + 'sort' => array( + 'title' => lang('sort_by'), + 'type' => 'dropdown', + 'name' => 'sort', + 'value' => $sorting, + 'checked' => $sort + ) + ); + + $this->search->search_type['photos']['fields'] = $forms; + } + /** + * Set File Max Size + */ + function set_photo_max_size() + { + global $Cbucket; + $adminSize = $Cbucket->configs['max_photo_size']; + if(!$adminSize) + $this->max_file_size = 2*1024*1024; + else + $this->max_file_size = $adminSize*1024*1024; + } + + /** + * Check if photo exists or not + */ + function photo_exists($id) + { + global $db; + if(is_numeric($id)) + $result = $db->select(tbl($this->p_tbl),"photo_id"," photo_id = '$id'"); + else + $result = $db->select(tbl($this->p_tbl),"photo_id"," photo_key = '$id'"); + + if($result) + return true; + else + return false; + } + + /** + * Register function + */ + function photo_register_function($func) + { + global $cbcollection; + $cbcollection->collection_delete_functions[] = 'delete_collection_photos'; + } + + /** + * Get Photo + */ + function get_photo($pid) + { + global $db; + if(is_numeric($pid)) + $result = $db->select(tbl($this->p_tbl),"*"," photo_id = '$pid'"); + else + $result = $db->select(tbl($this->p_tbl),"*"," photo_key = '$pid'"); + + if($db->num_rows > 0) + return $result[0]; + else + return false; + } + + /** + * Get Photos + */ + function get_photos($p) + { + global $db; + $tables = "photos,users"; + + $order = $p['order']; + $limit = $p['limit']; + $cond = ""; + + if(!has_access('admin_access',TRUE)) + { + $cond = " ".tbl('photos.broadcast')." = 'public' AND ".tbl('photos.active')." = 'yes'"; + } else { + if($p['active']) + $cond .= " ".tbl('photos.active')." = '".$p['active']."'"; + + if($p['broadcast']) + { + if($cond != "") + $cond .= " AND "; + $cond .= " ".tbl('photos.broadcast')." = '".$p['broadcast']."'"; + } + } + + if($p['pid']) + { + if($cond != "") + $cond .= " AND "; + $cond .= $this->constructMultipleQuery(array("ids"=>$p['pid'],"sign"=>"=","operator"=>"OR")); + } + + if($p['key']) + { + if($cond != "") + $cond .= " AND "; + $cond .= " ".tbl('photos.photo_key')." = '".$p['key']."'"; + } + + if($p['filename']) + { + if($cond != "") + $cond .= " AND "; + $cond .= " ".tbl('photos.filename')." = '".$p['filename']."'"; + } + + if($p['extension']) + { + foreach($this->exts as $ext) + { + if(in_array($ext,$this->exts)) + { + if($cond != "") + $cond .= " AND "; + $cond .= " ".tbl('photos.ext')." = '".$p['extension']."'"; + } + } + } + + if($p['date_span']) + { + if($cond != "") + $cond .= " AND "; + $cond .= " ".cbsearch::date_margin("date_added",$p['date_span']); + } + + if($p['featured']) + { + if($cond != "") + $cond .= " AND "; + $cond .= " ".tbl('photos.featured')." = '".$p['featured']."'"; + } + + if($p['user']) + { + if($cond != "") + $cond .= " AND "; + $cond .= $this->constructMultipleQuery(array("ids"=>$p['user'],"sign"=>"=","operator"=>"AND","column"=>"userid")); + } + + if($p['exclude']) + { + if($cond != "") + $cond .= " AND "; + $cond .= $this->constructMultipleQuery(array("ids"=>$p['exclude'],"sign"=>"<>")); + } + + $title_tag = ''; + + if($p['title']) + { + $title_tag = " ".tbl('photos.photo_title')." LIKE '%".$p['title']."%'"; + } + + if($p['tags']) + { + $tags = explode(",",$p['tags']); + if(count($tags)>0) + { + if($title_tag != '') + $title_tag .= " OR "; + $total = count($tags); + $loop = 1; + foreach($tags as $tag) + { + $title_tag .= " ".tbl('photos.photo_tags')." LIKE '%$tag%'"; + if($loop<$total) + $title_tag .= " OR "; + $loop++; + } + } else { + if($title_tag != '') + $title_tag .= " OR "; + $title_tag .= " ".tbl('photos.photo_tags')." LIKE '%".$p['tags']."%'"; + } + } + + if($title_tag != "") + { + if($cond != '') + $cond .= " AND "; + $cond .= " ($title_tag) "; + } + + if($p['ex_user']) + { + if($cond != "") + $cond .= " AND "; + $cond .= $this->constructMultipleQuery(array("ids"=>$p['ex_user'],"sign"=>"<>","operator"=>"AND","column"=>"userid")); + } + + if($p['extra_cond']) + { + if($cond != "") + $cond .= " AND "; + $cond .= $p['extra_cond']; + } + + if($p['get_orphans']) + $p['collection'] = "\0"; + + if($p['collection']) + { + if($cond != "") + $cond .= " AND "; + $cond .= $this->constructMultipleQuery(array("ids"=>$p['collection'],"sign"=>"=","operator"=>"OR","column"=>"collection_id")); + } else { + if($cond != "") + $cond .= " AND "; + $cond .= " ".tbl('photos.collection_id')." <> '0'"; + } + + if(!$p['count_only'] && !$p['show_related']) + { + if($cond != "") + $cond .= " AND "; + $result = $db->select(tbl($tables), + tbl("photos.*,users.userid,users.username"), + $cond.tbl("photos.userid")." = ".tbl("users.userid"),$limit,$order); + //echo $db->db_query; + } + + if($p['show_related']) + { + $cond = "MATCH(".tbl('photos.photo_title,photos.photo_tags').")"; + $cond .= " AGAINST ('".cbsearch::set_the_key($p['title'])."' IN BOOLEAN MODE)"; + if($p['exclude']) + { + if($cond != "") + $cond .= " AND "; + $cond .= $this->constructMultipleQuery(array("ids"=>$p['exclude'],"sign"=>"<>")); + } + + if($p['collection']) + { + if($cond != "") + $cond .= " AND "; + $cond .= $this->constructMultipleQuery(array("ids"=>$p['collection'],"sign"=>"<>","column"=>"collection_id")); + } + + if($p['extra_cond']) + { + if($cond != "") + $cond .= " AND "; + $cond .= $p['extra_cond']; + } + $result = $db->select(tbl($tables),tbl("photos.*,users.userid,users.username"), + $cond." AND ".tbl('photos.collection_id')." <> '0' AND ".tbl("photos.userid")." = ".tbl("users.userid"),$limit,$order); + //echo $db->db_query; + + // We found nothing from TITLE of Photos, let's try TAGS + if($db->num_rows == 0) + { + $tags = cbsearch::set_the_key($p['tags']); + $tags = str_replace('+','',$tags); + + $cond = "MATCH(".tbl('photos.photo_title,photos.photo_tags').")"; + $cond .= " AGAINST ('".$tags."' IN BOOLEAN MODE)"; + + if($p['exclude']) + { + if($cond != "") + $cond .= " AND "; + $cond .= $this->constructMultipleQuery(array("ids"=>$p['exclude'],"sign"=>"<>")); + } + + if($p['collection']) + { + if($cond != "") + $cond .= " AND "; + $cond .= $this->constructMultipleQuery(array("ids"=>$p['collection'],"sign"=>"<>","column"=>"collection_id")); + } + + if($p['extra_cond']) + { + if($cond != "") + $cond .= " AND "; + $cond .= $p['extra_cond']; + } + $result = $db->select(tbl($tables),tbl("photos.*,users.userid,users.username"), + $cond." AND ".tbl('photos.collection_id')." <> '0' AND ".tbl("photos.userid")." = ".tbl("users.userid"),$limit,$order); + //echo $db->db_query; + } + } + + if($p['count_only']) + { + if($p['extra_cond']) + { + if($cond != "") + $cond .= " AND "; + $cond .= $p['extra_cond']; + } + $result = $db->count(tbl("photos"),"photo_id",$cond); + } + + if($p['assign']) + assign($p['assign'],$result); + else + return $result; + } + + /** + * Used to construct Multi Query + * Only IDs will be excepted + */ + function constructMultipleQuery($params) + { + $cond = ""; + $IDs = $params['ids']; + if(is_array($IDs)) + $IDs = $IDs; + else + $IDs = explode(",",$IDs); + + $count = 0; + $cond .= "( "; + foreach($IDs as $id) + { + $id = str_replace(" ","",$id); + if(is_numeric($id) || $params['column'] == 'collection_id') + { + if($count>0) + $cond .= " ".($params['operator']?$params['operator']:'AND')." "; + $cond .= "".tbl('photos.'.($params['column']?$params['column']:'photo_id'))." ".($params['sign']?$params['sign']:'=')." '".$id."'"; + $count++; + } + } + $cond .= " )"; + + return $cond; + } + + /** + * Used to construct Exclude Query + function exclude_query($array) + { + $cond = ''; + if(!is_array($array)) + $ids = explode(',',$array); + else + $ids = $array; + + $count = 0; + + $cond .= "( "; + foreach($ids as $id) + { + $count++; + if($count > 1) + $cond .= " AND "; + $cond .= " ".tbl('photos.photo_id')." <> '".$id."'"; + } + $cond .= " )"; + + return $cond; + }*/ + + /** + * Used to generate photo key + * Replica of video_keygen function + */ + function photo_key() + { + global $db; + + $char_list = "ABDGHKMNORSUXWY"; + $char_list .= "123456789"; + while(1) + { + $photo_key = ''; + srand((double)microtime()*1000000); + for($i = 0; $i < 12; $i++) + { + $photo_key .= substr($char_list,(rand()%(strlen($char_list))), 1); + } + + if(!$this->pkey_exists($photo_key)) + break; + } + + return $photo_key; + } + + /** + * Used to check if key exists + */ + function pkey_exists($key) + { + global $db; + $db->select(tbl("photos"),"photo_key"," photo_key = '$key'"); + if($db->num_rows > 0) + return true; + else + return false; + } + + /** + * Used to delete photo + */ + function delete_photo($id,$oprhan=FALSE) + { + global $db; + if($this->photo_exists($id)) + { + $photo = $this->get_photo($id); + + $del_photo_funcs = cb_get_functions('delete_photo'); + if(is_array($del_photo_funcs)) + { + + foreach($del_photo_funcs as $func) + { + if(function_exists($func['func'])) + { + $func['func']($photo); + } + } + } + + if($orphan == FALSE)//removing from collection + $this->collection->remove_item($photo['photo_id'],$photo['collection_id']); + + //now removing photo files + $this->delete_photo_files($photo); + + //finally removing from Database + $this->delete_from_db($photo); + + //Decrementing User Photos + $db->update(tbl("users"),array("total_photos"),array("|f|total_photos-1")," userid='".$photo['userid']."'"); + + //Removing Photo Comments + $db->delete(tbl("comments"),array("type","type_id"),array("p",$photo['photo_id'])); + + //Removing Photo From Favortes + $db->delete(tbl("favorites"),array("type","id"),array("p",$photo['photo_id'])); + + } else + e(lang("photo_not_exists")); + } + + /** + * Used to delete photo files + */ + function delete_photo_files($id) + { + if(!is_array($id)) + $photo = $this->get_photo($id); + else + $photo = $id; + + $pid = $photo['photo_id']; + $files = $this->get_image_file($pid,'t',TRUE,NULL,FALSE,TRUE); + if(!empty($files)) + { + foreach($files as $file) + { + $file_dir = PHOTOS_DIR."/".$file; + if(file_exists($file_dir)) + unlink($file_dir); + } + + e(sprintf(lang("success_delete_file"),$photo['photo_title']),"m"); + } + } + + /** + * Used to delete photo from database + */ + function delete_from_db($id) + { + global $db; + if(is_array($id)) + $delete_id = $id['photo_id']; + else + $delete_id = $id; + + $db->execute("DELETE FROM ".tbl('photos')." WHERE photo_id = $delete_id"); + e(lang("photo_success_deleted"),"m"); + } + + + /** + * Used to get photo owner + */ + function get_photo_owner($id) + { + return $this->get_photo_field($id,'userid'); + } + + /** + * Used to get photo any field + */ + function get_photo_field($id,$field) + { + global $db; + if(!$field) + return false; + else + { + if(!is_numeric($id)) + $result = $db->select(tbl($this->p_tbl),$field,' photo_key = '.$id.''); + else + $result = $db->select(tbl($this->p_tbl),$field,' photo_id = '.$id.''); + + if($result) + return $result[0][$field]; + else + return false; + } + } + + /** + * Used filter array + */ + function remove_empty_indexes($array) + { + $newArr = array(); + if(is_array($array)) + { + foreach($array as $key=>$arr) + { + if(is_array($arr)) + { + foreach($arr as $a) + { + if(!empty($a)) + { + $newArr[$key][] = $a; + } + } + } + } + + return $newArr; + } else { + echo "No Array Provided"; + } + } + + /** + * Used to crop the image + * Image will be crop to dead-center + */ + function crop_image($input,$output,$ext,$width,$height) + { + $info = getimagesize($input); + $Swidth = $info[0]; + $Sheight = $info[1]; + + $canvas = imagecreatetruecolor($width, $height); + $left_padding = $Swidth / 2 - $width / 2; + $top_padding = $Sheight / 2 - $height / 2; + + switch($ext) + { + case "jpeg": + case "jpg": + case "JPG": + case "JPEG": + { + $image = imagecreatefromjpeg($input); + imagecopy($canvas, $image, 0, 0, $left_padding, $top_padding, $width, $height); + imagejpeg($canvas,$output,90); + } + break; + + case "png": + case "PNG": + { + $image = imagecreatefrompng($input); + imagecopy($canvas, $image, 0, 0, $left_padding, $top_padding, $width, $height); + imagepng($canvas,$output,9); + } + break; + + case "gif": + case "GIF": + { + $image = imagecreatefromgif($input); + imagecopy($canvas, $image, 0, 0, $left_padding, $top_padding, $width, $height); + imagejpeg($canvas,$output,90); + } + break; + + default: + { + return false; + } + break; + } + imagedestroy($canvas); + } + + /** + * Used to resize and watermark image + **/ + function generate_photos($array) + { + global $db; + $path = PHOTOS_DIR."/"; + + if(!is_array($array)) + $p = $this->get_photo($array); + else + $p = $array; + + $filename = $p['filename']; + $extension = $p['ext']; + + $this->createThumb($path.$filename.".".$extension,$path.$filename."_o.".$extension,$extension); + $this->createThumb($path.$filename.".".$extension,$path.$filename."_t.".$extension,$extension,$this->thumb_width,$this->thumb_height); + $this->createThumb($path.$filename.".".$extension,$path.$filename."_m.".$extension,$extension,$this->mid_width,$this->mid_height); + $this->createThumb($path.$filename.".".$extension,$path.$filename."_l.".$extension,$extension,$this->lar_width); + + $should_watermark = config('watermark_photo'); + + if(!empty($should_watermark) && $should_watermark == 1) + { + $this->watermark_image($path.$filename."_l.".$extension,$path.$filename."_l.".$extension); + $this->watermark_image($path.$filename."_o.".$extension,$path.$filename."_o.".$extension); + } + + /* GETTING DETAILS OF IMAGES AND STORING THEM IN DB */ + $this->update_image_details($p); + } + + /** + * This function is used to get photo files and extract + * dimensions and file size of each file, put them in array + * then encode in json and finally update photo details column + */ + function update_image_details($photo) + { + global $db, $json; + if(is_array($photo) && !empty($photo['photo_id'])) + $p = $photo; + else + $p = $this->get_photo($photo); + + if(!empty($photo)) + { + $images = $this->get_image_file($p,NULL,TRUE,NULL,FALSE); + if($images) + { + foreach($images as $image) + { + $imageFile = PHOTOS_DIR."/".$image; + if(file_exists($imageFile)) + { + $imageDetails = getimagesize($imageFile); $imageSize = filesize($imageFile); + $data[$this->get_image_type($image)] = array( + "width" => $imageDetails[0], + "height" => $imageDetails[1], + "attribute" => mysql_clean($imageDetails[3]), + "size" => array( + "bytes" => round($imageSize), + "kilobytes" => round($imageSize / 1024), + "megabytes" => round($imageSize / 1024 / 1024, 2) + ) + ); + } + } + + if(is_array($data) && !empty($data)) + { + if(phpversion() < "5.2.0") + $encodedData = stripslashes($json->json_encode($data)); + else + $encodedData = stripslashes(json_encode($data)); + + $db->update(tbl('photos'),array("photo_details"),array("|no_mc|$encodedData")," photo_id = '".$p['photo_id']."' "); + } + } + } + } + + /** + * Creating resized photo + */ + function createThumb($from,$to,$ext,$d_width=NULL,$d_height=NULL,$force_copy=false) + { + $file = $from; + $info = getimagesize($file); + $org_width = $info[0]; + $org_height = $info[1]; + + if($org_width > $d_width && !empty($d_width)) + { + $ratio = $org_width / $d_width; // We will resize it according to Width + + $width = $org_width / $ratio; + $height = $org_height / $ratio; + + $image_r = imagecreatetruecolor($width, $height); + if(!empty($d_height) && $height > $d_height && $this->cropping == 1) + { + $crop_image = TRUE; + } + + switch($ext) + { + case "jpeg": + case "jpg": + case "JPG": + case "JPEG": + { + $image = imagecreatefromjpeg($file); + imagecopyresampled($image_r, $image, 0, 0, 0, 0, $width, $height, $org_width, $org_height); + imagejpeg($image_r, $to, 90); + + if(!empty($crop_image)) + $this->crop_image($to,$to,$ext,$width,$d_height); + } + break; + + case "png": + case "PNG": + { + $image = imagecreatefrompng($file); + imagecopyresampled($image_r, $image, 0, 0, 0, 0, $width, $height, $org_width, $org_height); + imagepng($image_r,$to,9); + if(!empty($crop_image)) + $this->crop_image($to,$to,$ext,$width,$d_height); + } + break; + + case "gif": + case "GIF": + { + $image = imagecreatefromgif($file); + imagecopyresampled($image_r, $image, 0, 0, 0, 0, $width, $height, $org_width, $org_height); + imagegif($image_r,$to,90); + if(!empty($crop_image)) + $this->crop_image($to,$to,$ext,$width,$d_height); + } + break; + } + imagedestroy($image_r); + } else { + if(!file_exists($to) || $force_copy === true) + copy($from,$to); + } + } + + /** + * Used to get watermark file + */ + function watermark_file() + { + if(file_exists(BASEDIR."/images/photo_watermark.png")) + return BASEURL."/images/photo_watermark.png"; + else + return false; + } + + /** + * Used to set watermark position + */ + function position_watermark($file,$watermark) + { + if(empty($this->position)) + $info = array('left','top'); + else + $info = explode(":",$this->position); + + $x = $info[0]; + $y = $info[1]; + list($w,$h) = getimagesize($file); + list($ww,$wh) = getimagesize($watermark); + $padding = $this->padding; + + switch($x) + { + case "center": + { + $finalxPadding = $w / 2 - $ww / 2; + } + break; + + case "left": + default: + { + $finalxPadding = $padding; + } + break; + + case "right": + { + $finalxPadding = $w - $ww - $padding; + } + break; + } + + switch($y) + { + case "top": + default: + { + $finalyPadding = $padding; + } + break; + + case "center": + { + $finalyPadding = $h / 2 - $wh / 2; + } + break; + + case "bottom": + { + $finalyPadding = $h - $wh - $padding; + } + break; + } + + $values = array($finalxPadding,$finalyPadding); + return $values; + } + + /** + * Used to watermark image + */ + function watermark_image($input,$output) + { + $watermark_file = $this->watermark_file(); + if(!$watermark_file) + return false; + else + { + list($Swidth, $Sheight, $Stype) = getimagesize($input); + $wImage = imagecreatefrompng($watermark_file); + $ww = imagesx($wImage); + $wh = imagesy($wImage); + $paddings = $this->position_watermark($input,$watermark_file); + + switch($Stype) + { + case 1: //GIF + { + $sImage = imagecreatefromgif($input); + imagecopy($sImage,$wImage,$paddings[0],$paddings[1],0,0,$ww,$wh); + imagejpeg($sImage,$output,90); + } + break; + + case 2: //JPEG + { + $sImage = imagecreatefromjpeg($input); + imagecopy($sImage,$wImage,$paddings[0],$paddings[1],0,0,$ww,$wh); + imagejpeg($sImage,$output,90); + } + break; + + case 3: //PNG + { + $sImage = imagecreatefrompng($input); + imagecopy($sImage,$wImage,$paddings[0],$paddings[1],0,0,$ww,$wh); + imagepng($sImage,$output,9); + } + break; + } + } + } + + /** + * Load Upload Form + */ + function loadUploadForm($params) + { + $p = $params; + $should_include = $p['includeHeader'] ? $p['includeHeader'] : TRUE; + $output = '
    collection->get_collections($p); + $cl_array = $this->parse_array($collections); + $collection = $array['collection_id']; + $this->unique = rand(0,9999); + $fields = + array + ( + 'name' => array( + 'title' => lang('photo_title'), + 'id' => 'photo_title', + 'name' => 'photo_title', + 'type' => 'textfield', + 'value' => cleanForm($title), + 'db_field' => 'photo_title', + 'required' => 'yes', + 'invalid_err' => lang('photo_title_err') + ), + + 'desc' => array( + 'title' => lang('photo_caption'), + 'id' => 'photo_description', + 'name' => 'photo_description', + 'type' => 'textarea', + 'value' =>cleanForm( $description), + 'db_field' => 'photo_description', + 'anchor_before' => 'before_desc_compose_box', + 'required' => 'yes', + 'invalid_err' => lang('photo_caption_err') + ), + 'tags' => array( + 'title' => lang('photo_tags'), + 'id' => 'photo_tags', + 'name' => 'photo_tags', + 'type' => 'textfield', + 'value' => genTags($tags), + 'db_field' => 'photo_tags', + 'required' => 'yes', + 'invalid_err' => lang('photo_tags_err') + ), + 'collection' => array( + 'title' => lang('collection'), + 'id' => 'collection_id', + 'name' => 'collection_id', + 'type' => 'dropdown', + 'value' => $cl_array, + 'db_field' => 'collection_id', + 'required' => '', + 'checked' => $collection, + 'invalid_err' => lang('photo_collection_err') + ) + ); + + return $fields; + } + + function insert_photo($array=NULL) + { + global $db,$eh; + if($array == NULL) + $array = $_POST; + + if(is_array($_FILES)) + $array = array_merge($array,$_FILES); + + $this->validate_form_fields($array); + if(!error()) + { + $forms = $this->load_required_forms($array); + $oForms = $this->load_other_forms($array); + $FullForms = array_merge($forms,$oForms); + + foreach($FullForms as $field) + { + $name = formObj::rmBrackets($field['name']); + $val = $_POST[$name]; + + if($field['use_func_val']) + $val = $field['validate_function']($val); + + if(!empty($field['db_field'])) + $query_field[] = $field['db_field']; + + if(is_array($val)) + { + $new_val = ''; + foreach($val as $v) + { + $new_val .= "#".$v."# "; + } + $val = $new_val; + } + if(!$field['clean_func'] || (!function_exists($field['clean_func']) && !is_array($field['clean_func']))) + $val = ($val); + else + $val = apply_func($field['clean_func'],sql_free('|no_mc|'.$val)); + + if(!empty($field['db_field'])) + $query_val[] = $val; + } + + $query_field[] = "userid"; + if(!$array['userid']) + { $userid = userid(); $query_val[] = $userid; } + else + { $query_val[] = $array['userid']; $userid = $array['userid']; } + + $query_field[] = "date_added"; + $query_val[] = NOW(); + + $query_field[] = "owner_ip"; + $query_val[] = $_SERVER['REMOTE_ADDR']; + + $query_field[] = "ext"; + $query_val[] = $array['ext']; + + $query_field[] = "photo_key"; + //$query_val[] = $array['photo_key']; + $query_val[] = $this->photo_key(); + + $query_field[] = "filename"; + $query_val[] = $array['filename']; + + if($array['server_url'] && $array['server_url'] != "undefined") + { + $query_field[] = "server_url"; + $query_val[] = $array['server_url']; + } + + if($array['folder'] && $array['folder'] != "undefined") + { + $query_field[] = "file_directory"; + $query_val[] = $array['folder']; + } + + $insert_id = $db->insert(tbl($this->p_tbl),$query_field,$query_val); + $photo = $this->get_photo($insert_id); + $this->collection->add_collection_item($insert_id,$photo['collection_id']); + + if(!$array['server_url'] || $array['server_url']=='undefined') + $this->generate_photos($photo); + + + $eh->flush(); + e(sprintf(lang("photo_is_saved_now"),$photo['photo_title']),"m"); + $db->update(tbl("users"),array("total_photos"),array("|f|total_photos+1")," userid='".$userid."'"); + + //Adding Photo Feed + addFeed(array('action' => 'upload_photo','object_id' => $insert_id,'object'=>'photo')); + + return $insert_id; + } + } + + /** + * Update watermark file + */ + function update_watermark($file) + { + if(empty($file)) + e(lang("no_watermark_found")); + else + { + $oldW = BASEDIR."/images/photo_watermark.png"; + if(file_exists($oldW)) + unset($oldW); + + $info = getimagesize($file['tmp_name']); + $width = $info[0]; + $type = $info[2]; + + //pr($info,TRUE); + + if($type == 3) + { + if(move_uploaded_file($file['tmp_name'],BASEDIR."/images/photo_watermark.png")) + { + $wFile = BASEDIR."/images/photo_watermark.png"; + if($width > $this->max_watermark_width) + $this->createThumb($wFile,$wFile,'png',$this->max_watermark_width); + } + e(lang("watermark_updated"),"m"); + } else { + e(lang("upload_png_watermark")); + } + + + } + } + + /** + * Load Other Form + */ + function load_other_forms($array=NULL) + { + if($array==NULL) + $array = $_POST; + + $comments = $array['allow_comments']; + $broadcast = $array['broadcast']; + $tagging = $array['allow_tagging']; + $embedding = $array['allow_embedding']; + $rating = $array['allow_rating']; + $rand = $array['photo_key']; + + $Otherfields = array + ( + 'comments' => array( + 'title' => lang('comments'), + 'name' => 'allow_comments', + 'id' => 'allow_comments', + 'db_field' => 'allow_comments', + 'type' => 'radiobutton', + 'value' => array('yes' => lang('vdo_allow_comm'),'no' => lang('vdo_dallow_comm')), + 'required' => 'no', + 'checked' => $comments, + 'validate_function'=>'yes_or_no', + 'display_function' => 'display_sharing_opt', + 'default_value'=>'yes' + ), + /*'broadcast' => array( + 'title' => lang("vdo_br_opt"), + 'type' => 'radiobutton', + 'name' => 'broadcast', + 'id' => 'broadcast', + 'value' => array("public"=>lang("collect_borad_pub"),"private"=>lang("collect_broad_pri")), + 'checked' => $broadcast, + 'db_field' => 'broadcast', + 'required' => 'no', + 'display_function' => 'display_sharing_opt', + 'default_value'=>'public' + ),*/ + /*'tagging' => array( + 'title' => lang('tagging'), + 'type' => 'radiobutton', + 'id' => 'allow_tagging', + 'name' => 'allow_tagging', + 'db_field' => 'allow_tagging', + 'type' => 'radiobutton', + 'value' => array('yes' => lang('pic_allow_tagging'),'no' => lang('pic_dallow_tagging')), + 'checked' => $tagging, + 'validate_function'=>'yes_or_no', + 'display_function' => 'display_sharing_opt', + 'default_value'=>'yes' + ),*/ + 'embedding' => array( + 'title' => lang('vdo_embedding'), + 'type' => 'radiobutton', + 'name' => 'allow_embedding', + 'id' => 'allow_embedding', + 'db_field' => 'allow_embedding', + 'value' => array('yes' => lang('pic_allow_embed'),'no' => lang('pic_dallow_embed')), + 'checked' => $embedding, + 'validate_function'=>'yes_or_no', + 'display_function' => 'display_sharing_opt', + 'default_value'=>'yes' + ), + 'rating' => array( + 'title' => lang('rating'), + 'id' => 'allow_rating', + 'name' => 'allow_rating', + 'type' => 'radiobutton', + 'db_field' => 'allow_rating', + 'value' => array('yes' => lang('pic_allow_rating'),'no' => lang('pic_dallow_rating')), + 'checked' => $rating, + 'validate_function'=>'yes_or_no', + 'display_function' => 'display_sharing_opt', + 'default_value'=>'yes' + ) + ); + + //pr($Otherfields,TRUE); + return $Otherfields; + } + + + /** + * This will return a formatted array + * return @Array + * Array Format: Multidemsional + * Array ( [photo_id] => array( ['field_name'] => 'value' ) ) + */ + function return_formatted_post($arr) + { + $photoID = ''; + foreach($_POST as $key => $value) + { + $parts = explode('_',$key); + $total = count($parts); + $id = $parts[$total-1]; + $name = array_splice($parts,0,$total-1); + $name = implode("_",$name); + + if($photoID != $id){ + $values = array(); + $photoID = $id; + } + + if(is_numeric($id)) + { + if (strpos($key, $id) !== FALSE) + { + $values[$name] = $value; + $PhotosArray[$id] = $values; + } + } + } + + return $PhotosArray; + } + + /** + * This will be used to mutliple photos + * at once. + * Single update will be different. + */ + function update_multiple_photos($arr) + { + global $db,$cbcollection,$eh; + + foreach($arr as $id => $details) + { + if(is_array($details)) + { + $i = 0; + $query = "UPDATE ".tbl('photos')." SET "; + foreach($details as $key => $value) + { + $i++; + $query .= "$key = '$value'"; + if($iExecute($query); + $cbcollection->add_collection_item($id,$details['collection_id']); + + } + } + $eh->flush(); + } + + /** + * Used to parse collections dropdown + */ + function parse_array($array) + { + if(is_array($array)) + { + foreach($array as $key=>$v) + { + $cl_arr[$v['collection_id']] = $v['collection_name']; + } + return $cl_arr; + } else { + return false; + } + } + + /** + * Used to create filename of photo + */ + function create_filename() + { + $filename = time().RandomString(6); + return $filename; + } + + /** + * Construct extensions for SWF + */ + function extensions() + { + $exts = $this->exts; + $list = ''; + foreach($exts as $ext) + { + $list .= "*.".$ext.";"; + } + return $list; + + } + + /** + * Function used to validate form fields + */ + function validate_form_fields($array=NULL) + { + $reqFileds = $this->load_required_forms($array); + + if($array==NULL) + $array = $_POST; + + if(is_array($_FILES)) + $array = array_merge($array,$_FILES); + + + $otherFields = $this->load_other_forms($array); + + $photo_fields = array_merge($reqFileds,$otherFields); + + validate_cb_form($photo_fields,$array); + } + + /** + * Update Photo + */ + function update_photo($array=NULL) + { + global $db; + + if($array == NULL) + $array = $_POST; + $this->validate_form_fields($array); + $pid = $array['photo_id']; + $cid = $this->get_photo_field($pid,'collection_id'); + + if(!error()) + { + $reqFields = $this->load_required_forms($array); + $otherFields = $this->load_other_forms($array); + + $fields = array_merge($reqFields,$otherFields); + + foreach($fields as $field) + { + $name = formObj::rmBrackets($field['name']); + $val = $array[$name]; + + if($field['use_func_val']) + $val = $field['validate_function']($val); + + + if(!empty($field['db_field'])) + $query_field[] = $field['db_field']; + + if(is_array($val)) + { + $new_val = ''; + foreach($val as $v) + { + $new_val .= "#".$v."# "; + } + $val = $new_val; + } + if(!$field['clean_func'] || (!function_exists($field['clean_func']) && !is_array($field['clean_func']))) + $val = ($val); + else + $val = apply_func($field['clean_func'],sql_free('|no_mc|'.$val)); + + if(!empty($field['db_field'])) + $query_val[] = $val; + } + + if(has_access('admin_access',TRUE)) + { + if(isset($array['views'])) + { + $query_field[] = 'views'; + $query_val[] = $array['views']; + } + + if(isset($array['total_comments'])) + { + $query_field[] = "total_comments"; + $query_val[] = $array['total_comments']; + } + + if(isset($array['total_favorites'])) + { + $query_field[] = "total_favorites"; + $query_val[] = $array['total_favorites']; + } + + if(isset($array['downloaded'])) + { + $query_field[] = "downloaded"; + $query_val[] = $array['downloaded']; + } + + if(isset($array['voters'])) + { + $query_field[] = "voters"; + $query_val[] = $array['voters']; + } + } + + if(!error()) + { + if(!userid()) + e(lang("you_not_logged_in")); + elseif(!$this->photo_exists($pid)) + e(lang("photo_not_exists")); + elseif($this->get_photo_owner($pid) != userid() && !has_access('admin_access',TRUE)) + e(lang("cant_edit_photo")); + else + { + if($cid != $array['collection_id']) + { + $this->collection->change_collection($array['collection_id'],$pid,$cid); + } + + $db->update(tbl('photos'),$query_field,$query_val," photo_id='$pid'"); + e(lang("photo_updated_successfully"),"m"); + } + } + } + + + } + + /** + * Used to get image type + * t = Thumb + * m = Medium + * l = Large + */ + function get_image_type($name) + { + if(empty($name)) + return false; + else + { + $parts = explode("_",$name); + if(is_array($parts)) + { + if(!empty($parts[1])) + return substr($parts[1],0,1); + } + } + } + + /** + * Used to get image file + */ + function get_image_file($pid,$size='t',$multi=false,$assign=NULL,$with_path=true,$with_orig=false) + { + $params = array("details"=>$pid,"size"=>$size,"multi"=>$multi,"assign"=>$assign,"with_path"=>$with_path,"with_orig"=>$with_orig); + return $this->getFileSmarty($params); + } + + /** + * This will become a Smarty function. + * I am writting this to eliminate the possiblitles + * of distort pictures + */ + function getFileSmarty($p) + { + global $Cbucket; + $details = $p['details']; + $output = $p['output']; + if(empty($details)) + { + return $this->default_thumb($size,$output); + } else { + //Calling Custom Functions + if(count($Cbucket->custom_get_photo_funcs) > 0) + { + + foreach($Cbucket->custom_get_photo_funcs as $funcs) + { + if(function_exists($funcs)) + { + $func_returned = $funcs($p); + if($func_returned) + return $func_returned; + } + } + } + + if(($p['size'] != 't' && $p['size'] != 'm' && $p['size'] != 'l' && $p['size'] != 'o') || empty($p['size'])) + $p['size'] = 't'; + + if($p['with_path'] === FALSE) $p['with_path'] = FALSE; else $p['with_path'] = TRUE; + $with_path = $p['with_path']; + $with_orig = $p['with_orig'] ? $p['with_orig'] : FALSE; + + if(!is_array($details)) + $photo = $this->get_photo($details); + else + $photo = $details; + + if(empty($photo['photo_id']) || empty($photo['photo_key'])) + return $this->default_thumb($size,$output); + else + { + if(!empty($photo['filename']) && !empty($photo['ext'])) + { + $files = glob(PHOTOS_DIR."/".$photo['filename']."*.".$photo['ext']); + if(!empty($files) && is_array($files)) + { + + foreach($files as $file) + { + $file_parts = explode("/",$file); + $thumb_name = $file_parts[count($file_parts)-1]; + + $type = $this->get_image_type($thumb_name); + if($with_orig) + { + if($with_path) + $thumbs[] = PHOTOS_URL."/".$thumb_name; + else + $thumbs[] = $thumb_name; + } + elseif(!empty($type)) + { + if($with_path) + $thumbs[] = PHOTOS_URL."/".$thumb_name; + else + $thumbs[] = $thumb_name; + } + } + + if(empty($p['output']) || $p['output'] == 'non_html') + { + if($p['assign'] && $p['multi']) + { + assign($p['assign'],$thumbs); + } elseif(!$p['assign'] && $p['multi']) { + return $thumbs; + } else { + + $size = "_".$p['size']; + + $return_thumb = array_find($photo['filename'].$size,$thumbs); + + if(empty($return_thumb)) + { + $this->default_thumb($size,$output); + } else { + if($p['assign'] != NULL) + assign($p['assign'],$return_thumb); + else + return $return_thumb; + } + } + } + + if($p['output'] == 'html') + { + + $size = "_".$p['size']; + + $src = array_find($photo['filename'].$size,$thumbs); + if(empty($src)) + $src = $this->default_thumb($size); + else + $src = $src; + + if(phpversion < '5.2.0') + global $json; $js = $json; + + if(!empty($js)) + $imgDetails = $js->json_decode($photo['photo_details'],true); + else + $imgDetails = json_decode($photo['photo_details'],true); + + if(empty($imgDetails) || empty($imgDetails[$p['size']])) + { + $dem = getimagesize(str_replace(PHOTOS_URL,PHOTOS_DIR,$src)); + $width = $dem[0]; + $height = $dem[1]; + /* UPDATEING IMAGE DETAILS */ + $this->update_image_details($details); + } else { + $width = $imgDetails[$p['size']]['width']; + $height = $imgDetails[$p['size']]['height']; + } + + $img = "$p['anchor'],"data"=>$photo); + ANCHOR($anchor_p); + } + + if($p['style']) + $img .= " style = '".$p['style']."'"; + + if($p['extra']) + $img .= ($p['extra']); + + $img .= " />"; + + if($p['assign']) + assign($p['assign'],$img); + else + return $img; + } + } else { + return $this->default_thumb($size,$output); + } + } + } + } + } + + /** + * Will be called when collection is being deleted + * This will make photos in the collection orphan + * User will be able to access them in orphan photos + */ + function make_photo_orphan($details,$pid=NULL) + { + global $db; + if(!is_array($details) && is_numeric($details)) + { + $c = $this->collection->get_collection($details); + $cid = $c['collection_id']; + } + else + $cid = $details['collection_id']; + if(!empty($pid)) + $cond = " AND photo_id = $pid"; + + $db->update(tbl('photos'),array('collection_id'),array('0')," collection_id = $cid $cond"); + } + + /** + * This will create download button for + * photo + */ + function download_button($params) + { + $output = ''; + if(!is_array($params['details'])) + $p = $this->get_photo($params['details']); + else + $p = $params['details']; + + $text = lang('download_photo'); + if(config('photo_download') == 1 && !empty($p)) + { + if($params['return_url']) + { + $output = $this->photo_links($p,'download_photo'); + if($params['assign']) + { + assign($params['assign'],$output); + return; + } + else + return $output; + } + + if($params['output'] == '' || $params['output'] == 'link') + { + $output .= ""; + } + + if($params['output'] == "div") + { + $link = "'".$this->photo_links($p,'download')."'"; + $new_window = $params['new_window'] ? "'new'" : "'same'"; + $output .= '
    '; + } + + if($params['assign']) + assign($params['assign'],$output); + else + return $output; + } + } + + /** + * Used to load upload more photos + * This button will only appear if collection type is photos + * and user logged-in is Collection Owner + */ + function upload_photo_button($arr) + { + $cid = $arr['details']; + //pr($arr,TRUE); + $text = lang("add_more"); + $result = ''; + if(!is_array($cid)) + $details = $this->collection->get_collection($cid); + else + $details = $cid; + + if($details['type'] == 'photos' && $details['userid'] == user_id()) + { + $output = $arr['output']; + if($arr['return_url']) + { + $result = $this->photo_links($details,'upload_more'); + if($arr['assign']) + { + assign($arr['assign'],$result); + return; + } + else + return $result; + } + + if(empty($output) || $output == "button") + { + $result .= '"; + + } + + if($output == "div") + { + $result .= '
    photo_links($details,'upload_more')."'"; + if($arr['new_window'] || $arr['target'] == "_blank") + $new_window = "'new'"; + else + $new_window = "'same'"; + $result .= 'onClick = "openURL('.$link.','.$new_window.')"'; + if($arr['id']) + $result .= ' id = "'.$arr['id'].'"'; + if($arr['align']) + $result .= ' align = "'.$arr['align'].'"'; + if($arr['class']) + $result .= ' class = "'.$arr['class'].'"'; + if($arr['title']) + $result .= ' title = "'.$arr['title'].'"'; + if($arr['style']) + $result .= ' style = "'.$arr['style'].'"'; + if($arr['extra']) + $result .= mysql_clean($arr['extra']); + + $result .= ">".$text."
    "; + } + + if($output == "link") + { + $result .= '
    "; + } + + if($arr['assign']) + assign($arr['assign'],$result); + else + return $result; + } else { + return FALSE; + } + } + + /** + * used to create links + */ + function photo_links($details,$type) + { + if(empty($type)) + return BASEURL; + else + { + switch($type) + { + case "upload": + { + if(SEO == "yes") + $link = BASEURL."/photo_upload"; + else + $link = BASEURL."/photo_upload.php"; + } + break; + + case "upload_more": + { + if(SEO == "yes") + $link = BASEURL."/photo_upload/".$this->encode_key($details['collection_id']); + else + $link = BASEURL."/photo_upload.php?collection=".$this->encode_key($details['collection_id']); + } + break; + + case "download_photo": + case "download": + { + return BASEURL."/download_photo.php?download=".$this->encode_key($details['photo_key']); + } + + case "view_item": + case "view_photo": + { + return $this->collection->collection_links($details,'view_item'); + } + break; + } + return $link; + } + } + + /** + * Used to return default thumb + */ + function default_thumb($size=NULL,$output=NULL) + { + if($size != "_t" && $size != "_m") + $size = "_m"; + + if(file_exists(TEMPLATEDIR."/images/thumbs/no-photo".$size.".png")) + $path = TEMPLATEURL."/images/thumbs/no-photo".$size.".png"; + else + $path = PHOTOS_URL."/no-photo".$size.".png"; + + if(!empty($output) && $output == "html") + echo ""; + else + return $path; + } + + /** + * Used to add comment + */ + function add_comment($comment,$obj_id,$reply_to=NULL,$force_name_email=false) + { + global $myquery; + $photo = $this->get_photo($obj_id); + if(empty($photo)) + e("photo_not_exist"); + else + { + $ownerID = $photo['userid']; + $photoLink = $this->photo_links($photo,'view_item'); + $comment = $myquery->add_comment($comment,$obj_id,$reply_to,'p',$ownerID,$photoLink,$force_name_email); + if($comment) + { + $this->update_total_comments($obj_id); + } + return $comment; + } + } + + /** + * Function used to update total comments of collection + */ + function update_total_comments($pid) + { + global $db; + $count = $db->count(tbl("comments"),"comment_id"," type = 'p' AND type_id = '$pid'"); + $db->update(tbl('photos'),array("total_comments","last_commented"),array($count,now())," photo_id = '$pid'"); + } + + /** + * Used to check if collection can add + * photos or not + */ + function is_addable($cid) + { + if(!is_array($cid)) + $details = $this->collection->get_collection($cid); + else + $details = $cid; + + if(empty($details)) + { + return false; + } else { + if(($details['active'] == 'yes' || $details['broadcast'] == 'public') && $details['userid'] == userid()) + return true; + elseif($details['userid'] == userid()) + return true; + else + return false; + } + } + + /** + * Used to display photo voterts details. + * User who rated, how many stars and when user rated + */ + function photo_voters($id,$return_array=FALSE,$show_all=FALSE) + { + global $json; + $p = $this->get_photo($id); + if((!empty($p) && $p['userid'] == userid()) || $show_all === TRUE) + { + global $userquery; + $voters = $p['voters']; + if(phpversion() < "5.2.0") + $voters = $json->json_decode($voters,TRUE); + else + $voters = json_decode($voters,TRUE); + + if(!empty($voters)) + { + if($return_array) + return $voters; + else + { + foreach($voters as $id=>$details) + { + $username = get_username($id); + $output = "
  • "; + $output .= "$username"; + $output .= " rated ". $details['rate']/2 ." stars ("; + $output .= niceTime($details['time']).")"; + $output .= "
  • "; + echo $output; + } + } + } + } else + return false; + } + + /** + * Used to get current rating + */ + function current_rating($id) + { + global $db; + + if(!is_numeric($id)) + $result = $db->select(tbl('photos'),'userid,allow_rating,rating,rated_by,voters'," photo_key = ".$id.""); + else + $result = $db->select(tbl('photos'),'userid,allow_rating,rating,rated_by,voters'," photo_id = ".$id.""); + + if($result) + return $result[0]; + else + return false; + } + + /** + * Used to rate photo + */ + function rate_photo($id,$rating) + { + global $db,$json; + + if(!is_numeric($rating) || $rating <= 9) + $rating = 0; + if($rating >= 10) + $rating = 10; + + $c_rating = $this->current_rating($id); + $voters = $c_rating['voters']; + + $new_rate = $c_rating['rating']; + $rated_by = $c_rating['rated_by']; + + if(phpversion < '5.2.0') + $voters = $json->json_decode($voters,TRUE); + else + $voters = json_decode($voters,TRUE); + + if(!empty($voters)) + $already_voted = array_key_exists(userid(),$voters); + + if(!userid()) + e(lang("please_login_to_rate")); + elseif(userid()==$c_rating['userid'] && !config('own_photo_rating')) + e(lang("you_cannot_rate_own_photo")); + elseif(!empty($already_voted)) + e(lang("you_hv_already_rated_photo")); + elseif($c_rating['allow_rating'] == 'no' || !config('photo_rating')) + e(lang("photo_rate_disabled")); + else + { + $voters[userid()] = array('rate'=>$rating,'time'=>NOW()); + if(phpversion < '5.2.0') + $voters = $json->json_encode($voters); + else + $voters = json_encode($voters); + + $t = $c_rating['rated_by'] * $c_rating['rating']; + $rated_by = $c_rating['rated_by'] + 1; + $new_rate = ($t + $rating) / $rated_by; + $db->update(tbl('photos'),array('rating','rated_by','voters'),array("$new_rate","$rated_by","|no_mc|$voters")," photo_id = ".$id.""); + $userDetails = array( + "object_id" => $id, + "type" => "photo", + "time" => now(), + "rating" => $rating, + "userid" => userid(), + "username" => username() + ); + /* Updating user details */ + update_user_voted($userDetails); + e(lang("thnx_for_voting"),"m"); + } + + $return = array("rating"=>$new_rate,"rated_by"=>$rated_by,'total'=>10,"id"=>$id,"type"=>"photo","disable"=>"disabled"); + return $return; + } + + /** + * Used to generate different + * embed codes + */ + function generate_embed_codes($p) + { + $details = $p['details']; + $type = $p['type']; + $size = $p['size'] ? $p['size'] : 'm'; + + if(is_array($details)) + $photo = $details; + else + $photo = $this->get_photo($detials); + + switch($type) + { + case "html": + { + if($p['with_url']) + $code .= "<a href='".$this->collection->collection_links($photo,'view_item')."' target='_blank'>"; + $code .= "<img src='".$this->get_image_file($photo,$size)."' title='".$photo['photo_title']."' alt='".$photo['photo_title']." ".TITLE."' />"; + if($p['with_url']) + $code .= "</a>"; + } + break; + + case "forum": + { + if($p['with_url']) + $code .= "[URL=".$this->collection->collection_links($photo,'view_item')."]"; + $code .= "[IMG]".$this->get_image_file($photo,$size)."[/IMG]"; + if($p['with_url']) + $code .= "[/URL]"; + } + break; + + case "email": + { + $code .= $this->collection->collection_links($photo,'view_item'); + } + break; + + case "direct": + { + $code .= $this->get_image_file($photo,"o"); + } + break; + + default: + return false; + } + + return $code; + } + + /** + * Embed Codes + */ + function photo_embed_codes($newArr) + { + if(empty($newArr['details'])) + { + echo "
    ".e(lang("need_photo_details"))."
    "; + } + elseif($newArr['details']['allow_embedding'] == 'no') + { + echo "
    ".e(lang("embedding_is_disabled"))."
    "; + } + else + { + $t = $newArr['type']; + if(is_array($t)) + $types = $t; + elseif($t == 'all') + $types = $this->embed_types; + else + $types = explode(',',$t); + + foreach($types as $type) + { + $type = strtolower($type); + if(in_array($type,$this->embed_types)) { + $type = str_replace(' ','',$type); + $newArr['type'] = $type; + $codes[] = array("name"=>ucwords($type),"type"=>$type,"code"=>$this->generate_embed_codes($newArr)); + } + } + + if($newArr['assign']) + assign(mysql_clean($newArr['assign']),$codes); + else + return $codes; + } + } + + /** + * Used encode photo key + */ + function encode_key($key) + { + return base64_encode(serialize($key)); + } + + /** + * Used encode photo key + */ + function decode_key($key) + { + return unserialize(base64_decode($key)); + } + + function incrementDownload($Array) + { + global $db; + if(!isset($_COOKIE[$Array['photo_id']."_downloaded"])) + { + $db->update(tbl('photos'),array('downloaded'),array('|f|downloaded+1'),' photo_id = "'.$Array['photo_id'].'"'); + setcookie($Array['photo_id']."_downloaded",NOW(),time()+1800); + } + } + + function download_photo($key) + { + + $file = $this->ready_photo_file($key); + + if($file) + { + + if($file['details']['server_url']) + { + $url = dirname(dirname($file['details']['server_url'])); + header('location:'.$url.'/download_photo.php?file='.$file['details']['filename'] + .'.'.$file['details']['ext'].'&folder='.$file['details']['file_directory'] + .'&title='.urlencode($file['details']['photo_title'])); + + $this->incrementDownload($p); + return true; + } + $p = $file['details']; + $mime_types=array(); + $mime_types['gif'] = 'image/gif'; + $mime_types['jpe'] = 'image/jpeg'; + $mime_types['jpeg'] = 'image/jpeg'; + $mime_types['jpg'] = 'image/jpeg'; + $mime_types['png'] = 'image/png'; + + if(array_key_exists($p['ext'],$mime_types)){ + $mime = $mime_types[$p['ext']]; + if(file_exists($file['file_dir'])) + { + if(is_readable($file['file_dir'])) + { + $size = filesize($file['file_dir']); + if($fp=@fopen($file['file_url'],'r')) { + $this->incrementDownload($p); + // sending the headers + header("Content-type: $mime"); + header("Content-Length: $size"); + header("Content-Disposition: attachment; filename=\"".$p['photo_title'].".".$p['ext']."\""); + // send the file content + fpassthru($fp); + // close the file + fclose($fp); + // and quit + exit; + } + } else { + e(lang("photo_not_readable")); + } + } else { + e(lang("photo_not_exist")); + } + } else { + e(lang("wrong_mime_type")); + } + } else + return false; + } + + /** + * Ready photo for downloading + */ + function ready_photo_file($pid) + { + $photo = $this->get_photo($pid); + if(empty($photo)) + e(lang("photo_not_exist")); + else + { + if(!$this->collection->is_viewable($photo['collection_id'])) + return false; + else + { + $filename = $this->get_image_file($photo['photo_id'],'o',FALSE,FALSE,FALSE); + $returnArray = array( + "file_dir" => PHOTOS_DIR."/".$filename, + "file_url" => PHOTOS_URL."/".$filename, + "filename" => $filename, + "details" => $photo + ); + return $returnArray; + } + } + } + + /** + * Used to perform photo actions + */ + function photo_actions($action,$id) + { + global $db; + + switch($action) + { + case "activate": + case "activation": + case "ap": + { + $db->update(tbl($this->p_tbl),array("active"),array("yes")," photo_id = $id"); + e(lang("photo_activated"),"m"); + } + break; + + case "deactivate": + case "deactivation": + case "dap": + { + $db->update(tbl($this->p_tbl),array("active"),array("no")," photo_id = $id"); + e(lang("photo_deactivated"),"m"); + } + break; + + case "make_featured": + case "feature_photo": + case "fp": + { + $db->update(tbl($this->p_tbl),array("featured"),array("yes")," photo_id = $id"); + e(lang("photo_featured"),"m"); + } + break; + + case "make_unfeatured": + case "unfeature_photo": + case "ufp": + { + $db->update(tbl($this->p_tbl),array("featured"),array("no")," photo_id = $id"); + e(lang("photo_unfeatured"),"m"); + } + break; + } + } + +} + + ?> \ No newline at end of file diff --git a/upload/includes/classes/phpmailer/class.phpmailer.php b/upload/includes/classes/phpmailer/class.phpmailer.php new file mode 100644 index 00000000..9760e61d --- /dev/null +++ b/upload/includes/classes/phpmailer/class.phpmailer.php @@ -0,0 +1,2326 @@ +exceptions = ($exceptions == true); + } + + /** + * Sets message type to HTML. + * @param bool $ishtml + * @return void + */ + public function IsHTML($ishtml = true) { + if ($ishtml) { + $this->ContentType = 'text/html'; + } else { + $this->ContentType = 'text/plain'; + } + } + + /** + * Sets Mailer to send message using SMTP. + * @return void + */ + public function IsSMTP() { + $this->Mailer = 'smtp'; + } + + /** + * Sets Mailer to send message using PHP mail() function. + * @return void + */ + public function IsMail() { + $this->Mailer = 'mail'; + } + + /** + * Sets Mailer to send message using the $Sendmail program. + * @return void + */ + public function IsSendmail() { + if (!stristr(ini_get('sendmail_path'), 'sendmail')) { + $this->Sendmail = '/var/qmail/bin/sendmail'; + } + $this->Mailer = 'sendmail'; + } + + /** + * Sets Mailer to send message using the qmail MTA. + * @return void + */ + public function IsQmail() { + if (stristr(ini_get('sendmail_path'), 'qmail')) { + $this->Sendmail = '/var/qmail/bin/sendmail'; + } + $this->Mailer = 'sendmail'; + } + + ///////////////////////////////////////////////// + // METHODS, RECIPIENTS + ///////////////////////////////////////////////// + + /** + * Adds a "To" address. + * @param string $address + * @param string $name + * @return boolean true on success, false if address already used + */ + public function AddAddress($address, $name = '') { + return $this->AddAnAddress('to', $address, $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 boolean true on success, false if address already used + */ + public function AddCC($address, $name = '') { + return $this->AddAnAddress('cc', $address, $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 boolean true on success, false if address already used + */ + public function AddBCC($address, $name = '') { + return $this->AddAnAddress('bcc', $address, $name); + } + + /** + * Adds a "Reply-to" address. + * @param string $address + * @param string $name + * @return boolean + */ + public function AddReplyTo($address, $name = '') { + return $this->AddAnAddress('ReplyTo', $address, $name); + } + + /** + * Adds an address to one of the recipient arrays + * Addresses that have been added already return false, but do not throw exceptions + * @param string $kind One of 'to', 'cc', 'bcc', 'ReplyTo' + * @param string $address The email address to send to + * @param string $name + * @return boolean true on success, false if address already used or invalid in some way + * @access private + */ + private function AddAnAddress($kind, $address, $name = '') { + if (!preg_match('/^(to|cc|bcc|ReplyTo)$/', $kind)) { + echo 'Invalid recipient array: ' . kind; + return false; + } + $address = trim($address); + $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim + if (!self::ValidateAddress($address)) { + $this->SetError($this->Lang('invalid_address').': '. $address); + if ($this->exceptions) { + throw new phpmailerException($this->Lang('invalid_address').': '.$address); + } + echo $this->Lang('invalid_address').': '.$address; + return false; + } + if ($kind != 'ReplyTo') { + if (!isset($this->all_recipients[strtolower($address)])) { + array_push($this->$kind, array($address, $name)); + $this->all_recipients[strtolower($address)] = true; + return true; + } + } else { + if (!array_key_exists(strtolower($address), $this->ReplyTo)) { + $this->ReplyTo[strtolower($address)] = array($address, $name); + return true; + } + } + return false; +} + +/** + * Set the From and FromName properties + * @param string $address + * @param string $name + * @return boolean + */ + public function SetFrom($address, $name = '',$auto=1) { + $address = trim($address); + $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim + if (!self::ValidateAddress($address)) { + $this->SetError($this->Lang('invalid_address').': '. $address); + if ($this->exceptions) { + throw new phpmailerException($this->Lang('invalid_address').': '.$address); + } + echo $this->Lang('invalid_address').': '.$address; + return false; + } + $this->From = $address; + $this->FromName = $name; + if ($auto) { + if (empty($this->ReplyTo)) { + $this->AddAnAddress('ReplyTo', $address, $name); + } + if (empty($this->Sender)) { + $this->Sender = $address; + } + } + return true; + } + + /** + * Check that a string looks roughly like an email address should + * Static so it can be used without instantiation + * Tries to use PHP built-in validator in the filter extension (from PHP 5.2), falls back to a reasonably competent regex validator + * Conforms approximately to RFC2822 + * @link http://www.hexillion.com/samples/#Regex Original pattern found here + * @param string $address The email address to check + * @return boolean + * @static + * @access public + */ + public static function ValidateAddress($address) { + + //Checking if domain is localhost, return true + $host = explode('@',$address); + $host = $host[1]; + if($host=='localhost') + return true; + if (function_exists('filter_var')) { //Introduced in PHP 5.2 + if(filter_var($address, FILTER_VALIDATE_EMAIL) === FALSE) { + return false; + } else { + return true; + } + } else { + return preg_match('/^(?:[\w\!\#\$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~]+\.)*[\w\!\#\$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~]+@(?:(?:(?:[a-zA-Z0-9_](?:[a-zA-Z0-9_\-](?!\.)){0,61}[a-zA-Z0-9_-]?\.)+[a-zA-Z0-9_](?:[a-zA-Z0-9_\-](?!$)){0,61}[a-zA-Z0-9_]?)|(?:\[(?:(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\.){3}(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\]))$/', $address); + } + } + + ///////////////////////////////////////////////// + // 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 + */ + public function Send() { + try { + if ((count($this->to) + count($this->cc) + count($this->bcc)) < 1) { + throw new phpmailerException($this->Lang('provide_address'), self::STOP_CRITICAL); + } + + // 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 (empty($this->Body)) { + throw new phpmailerException($this->Lang('empty_message'), self::STOP_CRITICAL); + } + + // digitally sign with DKIM if enabled + if ($this->DKIM_domain && $this->DKIM_private) { + $header_dkim = $this->DKIM_Add($header,$this->Subject,$body); + $header = str_replace("\r\n","\n",$header_dkim) . $header; + } + + // Choose the mailer and send through it + switch($this->Mailer) { + case 'sendmail': + return $this->SendmailSend($header, $body); + case 'smtp': + return $this->SmtpSend($header, $body); + default: + return $this->MailSend($header, $body); + } + + } catch (phpmailerException $e) { + $this->SetError($e->getMessage()); + if ($this->exceptions) { + throw $e; + } + //echo $e->getMessage()."\n"; + return false; + } + } + + /** + * Sends mail using the $Sendmail program. + * @param string $header The message headers + * @param string $body The message body + * @access protected + * @return bool + */ + protected 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 ($this->SingleTo === true) { + foreach ($this->SingleToArray as $key => $val) { + if(!@$mail = popen($sendmail, 'w')) { + throw new phpmailerException($this->Lang('execute') . $this->Sendmail, self::STOP_CRITICAL); + } + fputs($mail, "To: " . $val . "\n"); + fputs($mail, $header); + fputs($mail, $body); + $result = pclose($mail); + // implement call back function if it exists + $isSent = ($result == 0) ? 1 : 0; + $this->doCallback($isSent,$val,$this->cc,$this->bcc,$this->Subject,$body); + if($result != 0) { + throw new phpmailerException($this->Lang('execute') . $this->Sendmail, self::STOP_CRITICAL); + } + } + } else { + if(!@$mail = popen($sendmail, 'w')) { + throw new phpmailerException($this->Lang('execute') . $this->Sendmail, self::STOP_CRITICAL); + } + fputs($mail, $header); + fputs($mail, $body); + $result = pclose($mail); + // implement call back function if it exists + $isSent = ($result == 0) ? 1 : 0; + $this->doCallback($isSent,$this->to,$this->cc,$this->bcc,$this->Subject,$body); + if($result != 0) { + throw new phpmailerException($this->Lang('execute') . $this->Sendmail, self::STOP_CRITICAL); + } + } + return true; + } + + /** + * Sends mail using the PHP mail() function. + * @param string $header The message headers + * @param string $body The message body + * @access protected + * @return bool + */ + protected function MailSend($header, $body) { + $toArr = array(); + foreach($this->to as $t) { + $toArr[] = $this->AddrFormat($t); + } + $to = implode(', ', $toArr); + + $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); + // implement call back function if it exists + $isSent = ($rt == 1) ? 1 : 0; + $this->doCallback($isSent,$val,$this->cc,$this->bcc,$this->Subject,$body); + } + } else { + $rt = @mail($to, $this->EncodeHeader($this->SecureHeader($this->Subject)), $body, $header, $params); + // implement call back function if it exists + $isSent = ($rt == 1) ? 1 : 0; + $this->doCallback($isSent,$to,$this->cc,$this->bcc,$this->Subject,$body); + } + } 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); + // implement call back function if it exists + $isSent = ($rt == 1) ? 1 : 0; + $this->doCallback($isSent,$val,$this->cc,$this->bcc,$this->Subject,$body); + } + } else { + $rt = @mail($to, $this->EncodeHeader($this->SecureHeader($this->Subject)), $body, $header); + // implement call back function if it exists + $isSent = ($rt == 1) ? 1 : 0; + $this->doCallback($isSent,$to,$this->cc,$this->bcc,$this->Subject,$body); + } + } + if (isset($old_from)) { + ini_set('sendmail_from', $old_from); + } + if(!$rt) { + throw new phpmailerException($this->Lang('instantiate'), self::STOP_CRITICAL); + } + return true; + } + + /** + * Sends mail via SMTP using PhpSMTP + * Returns false if there is a bad MAIL FROM, RCPT, or DATA input. + * @param string $header The message headers + * @param string $body The message body + * @uses SMTP + * @access protected + * @return bool + */ + protected function SmtpSend($header, $body) { + require_once $this->PluginDir . 'class.smtp.php'; + $bad_rcpt = array(); + + if(!$this->SmtpConnect()) { + throw new phpmailerException($this->Lang('smtp_connect_failed'), self::STOP_CRITICAL); + } + $smtp_from = ($this->Sender == '') ? $this->From : $this->Sender; + if(!$this->smtp->Mail($smtp_from)) { + throw new phpmailerException($this->Lang('from_failed') . $smtp_from, self::STOP_CRITICAL); + } + + // Attempt to send attach all recipients + foreach($this->to as $to) { + if (!$this->smtp->Recipient($to[0])) { + $bad_rcpt[] = $to[0]; + // implement call back function if it exists + $isSent = 0; + $this->doCallback($isSent,$to[0],'','',$this->Subject,$body); + } else { + // implement call back function if it exists + $isSent = 1; + $this->doCallback($isSent,$to[0],'','',$this->Subject,$body); + } + } + foreach($this->cc as $cc) { + if (!$this->smtp->Recipient($cc[0])) { + $bad_rcpt[] = $cc[0]; + // implement call back function if it exists + $isSent = 0; + $this->doCallback($isSent,'',$cc[0],'',$this->Subject,$body); + } else { + // implement call back function if it exists + $isSent = 1; + $this->doCallback($isSent,'',$cc[0],'',$this->Subject,$body); + } + } + foreach($this->bcc as $bcc) { + if (!$this->smtp->Recipient($bcc[0])) { + $bad_rcpt[] = $bcc[0]; + // implement call back function if it exists + $isSent = 0; + $this->doCallback($isSent,'','',$bcc[0],$this->Subject,$body); + } else { + // implement call back function if it exists + $isSent = 1; + $this->doCallback($isSent,'','',$bcc[0],$this->Subject,$body); + } + } + + + if (count($bad_rcpt) > 0 ) { //Create error message for any bad addresses + $badaddresses = implode(', ', $bad_rcpt); + throw new phpmailerException($this->Lang('recipients_failed') . $badaddresses); + } + if(!$this->smtp->Data($header . $body)) { + throw new phpmailerException($this->Lang('data_not_accepted'), self::STOP_CRITICAL); + } + if($this->SMTPKeepAlive == true) { + $this->smtp->Reset(); + } + return true; + } + + /** + * Initiates a connection to an SMTP server. + * Returns false if the operation failed. + * @uses SMTP + * @access public + * @return bool + */ + public function SmtpConnect() { + if(is_null($this->smtp)) { + $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 + try { + while($index < count($hosts) && !$connection) { + $hostinfo = array(); + if (preg_match('/^(.+):([0-9]+)$/', $hosts[$index], $hostinfo)) { + $host = $hostinfo[1]; + $port = $hostinfo[2]; + } else { + $host = $hosts[$index]; + $port = $this->Port; + } + + $tls = ($this->SMTPSecure == 'tls'); + $ssl = ($this->SMTPSecure == 'ssl'); + + if ($this->smtp->Connect(($ssl ? 'ssl://':'').$host, $port, $this->Timeout)) { + + $hello = ($this->Helo != '' ? $this->Helo : $this->ServerHostname()); + $this->smtp->Hello($hello); + + if ($tls) { + if (!$this->smtp->StartTLS()) { + throw new phpmailerException($this->Lang('tls')); + } + + //We must resend HELO after tls negotiation + $this->smtp->Hello($hello); + } + + $connection = true; + if ($this->SMTPAuth) { + if (!$this->smtp->Authenticate($this->Username, $this->Password)) { + throw new phpmailerException($this->Lang('authenticate')); + } + } + } + $index++; + if (!$connection) { + throw new phpmailerException($this->Lang('connect_host')); + } + } + } catch (phpmailerException $e) { + $this->smtp->Reset(); + throw $e; + } + return true; + } + + /** + * Closes the active SMTP session if one exists. + * @return void + */ + public function SmtpClose() { + if(!is_null($this->smtp)) { + 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 is English. + * @param string $langcode ISO 639-1 2-character language code (e.g. Portuguese: "br") + * @param string $lang_path Path to the language file directory + * @access public + */ + function SetLanguage($langcode = 'en', $lang_path = 'language/') { + //Define full set of translatable strings + $PHPMAILER_LANG = array( + 'provide_address' => 'You must provide at least one recipient email address.', + 'mailer_not_supported' => ' mailer is not supported.', + 'execute' => 'Could not execute: ', + 'instantiate' => 'Could not instantiate mail function.', + 'authenticate' => 'SMTP Error: Could not authenticate.', + 'from_failed' => 'The following From address failed: ', + 'recipients_failed' => 'SMTP Error: The following recipients failed: ', + 'data_not_accepted' => 'SMTP Error: Data not accepted.', + 'connect_host' => 'SMTP Error: Could not connect to SMTP host.', + 'file_access' => 'Could not access file: ', + 'file_open' => 'File Error: Could not open file: ', + 'encoding' => 'Unknown encoding: ', + 'signing' => 'Signing Error: ', + 'smtp_error' => 'SMTP server error: ', + 'empty_message' => 'Message body empty', + 'invalid_address' => 'Invalid address', + 'variable_set' => 'Cannot set or reset variable: ' + ); + //Overwrite language-specific strings. This way we'll never have missing translations - no more "language string failed to load"! + $l = true; + if ($langcode != 'en') { //There is no English translation file + $l = @include $lang_path.'phpmailer.lang-'.$langcode.'.php'; + } + $this->language = $PHPMAILER_LANG; + return ($l == true); //Returns false if language not found + } + + /** + * Return the current array of language strings + * @return array + */ + public function GetTranslations() { + return $this->language; + } + + ///////////////////////////////////////////////// + // METHODS, MESSAGE CREATION + ///////////////////////////////////////////////// + + /** + * Creates recipient headers. + * @access public + * @return string + */ + public function AddrAppend($type, $addr) { + $addr_str = $type . ': '; + $addresses = array(); + foreach ($addr as $a) { + $addresses[] = $this->AddrFormat($a); + } + $addr_str .= implode(', ', $addresses); + $addr_str .= $this->LE; + + return $addr_str; + } + + /** + * Formats an address correctly. + * @access public + * @return string + */ + public function AddrFormat($addr) { + if (empty($addr[1])) { + return $this->SecureHeader($addr[0]); + } else { + return $this->EncodeHeader($this->SecureHeader($addr[1]), 'phrase') . " <" . $this->SecureHeader($addr[0]) . ">"; + } + } + + /** + * Wraps message for use with mailers that do not + * automatically perform wrapping and for quoted-printable. + * Original written by philippe. + * @param string $message The message to wrap + * @param integer $length The line length to wrap to + * @param boolean $qp_mode Whether to run in Quoted-Printable mode + * @access public + * @return string + */ + public 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 public + * @param string $encodedText utf-8 QP text + * @param int $maxLength find last character boundary prior to this length + * @return int + */ + public 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 public + * @return void + */ + public function SetWordWrap() { + if($this->WordWrap < 1) { + return; + } + + switch($this->message_type) { + case 'alt': + 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 public + * @return string The assembled header + */ + public 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', self::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 ($this->SingleTo === true) { + foreach($this->to as $t) { + $this->SingleToArray[] = $this->AddrFormat($t); + } + } else { + if(count($this->to) > 0) { + $result .= $this->AddrAppend('To', $this->to); + } elseif (count($this->cc) == 0) { + $result .= $this->HeaderLine('To', 'undisclosed-recipients:;'); + } + } + } + + $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(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 '.$this->Version.' (phpmailer.sourceforge.net)'); + + 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 public + * @return string + */ + public 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': + 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 public + * @return string The assembled message body + */ + public function CreateBody() { + $body = ''; + + if ($this->sign_key_file) { + $body .= $this->GetMailMIME(); + } + + $this->SetWordWrap(); + + switch($this->message_type) { + case 'alt': + $body .= $this->GetBoundary($this->boundary[1], '', 'text/plain', ''); + $body .= $this->EncodeString($this->AltBody, $this->Encoding); + $body .= $this->LE.$this->LE; + $body .= $this->GetBoundary($this->boundary[1], '', 'text/html', ''); + $body .= $this->EncodeString($this->Body, $this->Encoding); + $body .= $this->LE.$this->LE; + $body .= $this->EndBoundary($this->boundary[1]); + break; + case 'plain': + $body .= $this->EncodeString($this->Body, $this->Encoding); + break; + case 'attachments': + $body .= $this->GetBoundary($this->boundary[1], '', '', ''); + $body .= $this->EncodeString($this->Body, $this->Encoding); + $body .= $this->LE; + $body .= $this->AttachAll(); + break; + case 'alt_attachments': + $body .= sprintf("--%s%s", $this->boundary[1], $this->LE); + $body .= sprintf("Content-Type: %s;%s" . "\tboundary=\"%s\"%s", 'multipart/alternative', $this->LE, $this->boundary[2], $this->LE.$this->LE); + $body .= $this->GetBoundary($this->boundary[2], '', 'text/plain', '') . $this->LE; // Create text body + $body .= $this->EncodeString($this->AltBody, $this->Encoding); + $body .= $this->LE.$this->LE; + $body .= $this->GetBoundary($this->boundary[2], '', 'text/html', '') . $this->LE; // Create the HTML body + $body .= $this->EncodeString($this->Body, $this->Encoding); + $body .= $this->LE.$this->LE; + $body .= $this->EndBoundary($this->boundary[2]); + $body .= $this->AttachAll(); + break; + } + + if ($this->IsError()) { + $body = ''; + } elseif ($this->sign_key_file) { + try { + $file = tempnam('', 'mail'); + file_put_contents($file, $body); //TODO check this worked + $signed = tempnam("", "signed"); + if (@openssl_pkcs7_sign($file, $signed, "file://".$this->sign_cert_file, array("file://".$this->sign_key_file, $this->sign_key_pass), NULL)) { + @unlink($file); + @unlink($signed); + $body = file_get_contents($signed); + } else { + @unlink($file); + @unlink($signed); + throw new phpmailerException($this->Lang("signing").openssl_error_string()); + } + } catch (phpmailerException $e) { + $body = ''; + if ($this->exceptions) { + throw $e; + } + } + } + + return $body; + } + + /** + * Returns the start of a message boundary. + * @access private + */ + 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 + */ + private function EndBoundary($boundary) { + return $this->LE . '--' . $boundary . '--' . $this->LE; + } + + /** + * Sets the message type. + * @access private + * @return void + */ + private 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 public + * @return string + */ + public function HeaderLine($name, $value) { + return $name . ': ' . $value . $this->LE; + } + + /** + * Returns a formatted mail line. + * @access public + * @return string + */ + public 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 + */ + public function AddAttachment($path, $name = '', $encoding = 'base64', $type = 'application/octet-stream') { + try { + if ( !@is_file($path) ) { + throw new phpmailerException($this->Lang('file_access') . $path, self::STOP_CONTINUE); + } + $filename = basename($path); + if ( $name == '' ) { + $name = $filename; + } + + $this->attachment[] = array( + 0 => $path, + 1 => $filename, + 2 => $name, + 3 => $encoding, + 4 => $type, + 5 => false, // isStringAttachment + 6 => 'attachment', + 7 => 0 + ); + + } catch (phpmailerException $e) { + $this->SetError($e->getMessage()); + if ($this->exceptions) { + throw $e; + } + //$e->getMessage()."\n"; + if ( $e->getCode() == self::STOP_CRITICAL ) { + return false; + } + } + return true; + } + + /** + * Return the current array of attachments + * @return array + */ + public function GetAttachments() { + return $this->attachment; + } + + /** + * Attaches all fs, string, and binary attachments to the message. + * Returns an empty string on failure. + * @access private + * @return string + */ + private function AttachAll() { + // Return text of body + $mime = array(); + $cidUniq = array(); + $incl = array(); + + // Add all attachments + foreach ($this->attachment as $attachment) { + // Check for string attachment + $bString = $attachment[5]; + if ($bString) { + $string = $attachment[0]; + } else { + $path = $attachment[0]; + } + + if (in_array($attachment[0], $incl)) { continue; } + $filename = $attachment[1]; + $name = $attachment[2]; + $encoding = $attachment[3]; + $type = $attachment[4]; + $disposition = $attachment[6]; + $cid = $attachment[7]; + $incl[] = $attachment[0]; + if ( $disposition == 'inline' && isset($cidUniq[$cid]) ) { continue; } + $cidUniq[$cid] = true; + + $mime[] = sprintf("--%s%s", $this->boundary[1], $this->LE); + $mime[] = sprintf("Content-Type: %s; name=\"%s\"%s", $type, $this->EncodeHeader($this->SecureHeader($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, $this->EncodeHeader($this->SecureHeader($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. + * @param string $path The full path to the file + * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable' + * @see EncodeFile() + * @access private + * @return string + */ + private function EncodeFile($path, $encoding = 'base64') { + try { + if (!is_readable($path)) { + throw new phpmailerException($this->Lang('file_open') . $path, self::STOP_CONTINUE); + } + if (function_exists('get_magic_quotes')) { + function get_magic_quotes() { + return false; + } + } + if (PHP_VERSION < 6) { + $magic_quotes = get_magic_quotes_runtime(); + set_magic_quotes_runtime(0); + } + $file_buffer = file_get_contents($path); + $file_buffer = $this->EncodeString($file_buffer, $encoding); + if (PHP_VERSION < 6) { set_magic_quotes_runtime($magic_quotes); } + return $file_buffer; + } catch (Exception $e) { + $this->SetError($e->getMessage()); + return ''; + } + } + + /** + * Encodes string to requested format. + * Returns an empty string on failure. + * @param string $str The text to encode + * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable' + * @access public + * @return string + */ + public function EncodeString ($str, $encoding = 'base64') { + $encoded = ''; + switch(strtolower($encoding)) { + case 'base64': + $encoded = chunk_split(base64_encode($str), 76, $this->LE); + break; + case '7bit': + case '8bit': + $encoded = $this->FixEOL($str); + //Make sure it ends with a line break + 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 (shortest) of Q, B, quoted or none. + * @access public + * @return string + */ + public 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 public + * @param string $str multi-byte text to wrap encode + * @return bool + */ + public 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 public + * @param string $str multi-byte text to wrap encode + * @return string + */ + public 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. + * Only uses standard PHP, slow, but will always work + * @access public + * @param string $string the text to encode + * @param integer $line_max Number of chars allowed on a line before wrapping + * @return string + */ + public function EncodeQPphp( $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 $output; + } + + /** + * Encode string to RFC2045 (6.7) quoted-printable format + * Uses a PHP5 stream filter to do the encoding about 64x faster than the old version + * Also results in same content as you started with after decoding + * @see EncodeQPphp() + * @access public + * @param string $string the text to encode + * @param integer $line_max Number of chars allowed on a line before wrapping + * @param boolean $space_conv Dummy param for compatibility with existing EncodeQP function + * @return string + * @author Marcus Bointon + */ + public function EncodeQP($string, $line_max = 76, $space_conv = false) { + if (function_exists('quoted_printable_encode')) { //Use native function if it's available (>= PHP5.3) + return quoted_printable_encode($string); + } + $filters = stream_get_filters(); + if (!in_array('convert.*', $filters)) { //Got convert stream filter? + return $this->EncodeQPphp($string, $line_max, $space_conv); //Fall back to old implementation + } + $fp = fopen('php://temp/', 'r+'); + $string = preg_replace('/\r\n?/', $this->LE, $string); //Normalise line breaks + $params = array('line-length' => $line_max, 'line-break-chars' => $this->LE); + $s = stream_filter_append($fp, 'convert.quoted-printable-encode', STREAM_FILTER_READ, $params); + fputs($fp, $string); + rewind($fp); + $out = stream_get_contents($fp); + stream_filter_remove($s); + $out = preg_replace('/^\./m', '=2E', $out); //Encode . if it is first char on a line, workaround for bug in Exchange + fclose($fp); + return $out; + } + + /** + * Encode string to q encoding. + * @link http://tools.ietf.org/html/rfc2047 + * @param string $str the text to encode + * @param string $position Where the text is going to be used, see the RFC for what that means + * @access public + * @return string + */ + public 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 + //TODO using /e (equivalent to eval()) is probably not a good idea + $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 + */ + public function AddStringAttachment($string, $filename, $encoding = 'base64', $type = 'application/octet-stream') { + // Append to $attachment array + $this->attachment[] = array( + 0 => $string, + 1 => $filename, + 2 => basename($filename), + 3 => $encoding, + 4 => $type, + 5 => true, // isStringAttachment + 6 => 'attachment', + 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 + */ + public 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 + $this->attachment[] = array( + 0 => $path, + 1 => $filename, + 2 => $name, + 3 => $encoding, + 4 => $type, + 5 => false, // isStringAttachment + 6 => 'inline', + 7 => $cid + ); + + return true; + } + + /** + * Returns true if an inline attachment is present. + * @access public + * @return bool + */ + public function InlineImageExists() { + foreach($this->attachment as $attachment) { + if ($attachment[6] == 'inline') { + return true; + } + } + return false; + } + + ///////////////////////////////////////////////// + // CLASS METHODS, MESSAGE RESET + ///////////////////////////////////////////////// + + /** + * Clears all recipients assigned in the TO array. Returns void. + * @return void + */ + public function ClearAddresses() { + foreach($this->to as $to) { + unset($this->all_recipients[strtolower($to[0])]); + } + $this->to = array(); + } + + /** + * Clears all recipients assigned in the CC array. Returns void. + * @return void + */ + public function ClearCCs() { + foreach($this->cc as $cc) { + unset($this->all_recipients[strtolower($cc[0])]); + } + $this->cc = array(); + } + + /** + * Clears all recipients assigned in the BCC array. Returns void. + * @return void + */ + public function ClearBCCs() { + foreach($this->bcc as $bcc) { + unset($this->all_recipients[strtolower($bcc[0])]); + } + $this->bcc = array(); + } + + /** + * Clears all recipients assigned in the ReplyTo array. Returns void. + * @return void + */ + public function ClearReplyTos() { + $this->ReplyTo = array(); + } + + /** + * Clears all recipients assigned in the TO, CC and BCC + * array. Returns void. + * @return void + */ + public function ClearAllRecipients() { + $this->to = array(); + $this->cc = array(); + $this->bcc = array(); + $this->all_recipients = array(); + } + + /** + * Clears all previously set filesystem, string, and binary + * attachments. Returns void. + * @return void + */ + public function ClearAttachments() { + $this->attachment = array(); + } + + /** + * Clears all custom headers. Returns void. + * @return void + */ + public function ClearCustomHeaders() { + $this->CustomHeader = array(); + } + + ///////////////////////////////////////////////// + // CLASS METHODS, MISCELLANEOUS + ///////////////////////////////////////////////// + + /** + * Adds the error message to the error container. + * @access protected + * @return void + */ + protected function SetError($msg) { + $this->error_count++; + if ($this->Mailer == 'smtp' and !is_null($this->smtp)) { + $lasterror = $this->smtp->getError(); + if (!empty($lasterror) and array_key_exists('smtp_msg', $lasterror)) { + $msg .= '

    ' . $this->Lang('smtp_error') . $lasterror['smtp_msg'] . "

    \n"; + } + } + $this->ErrorInfo = $msg; + } + + /** + * Returns the proper RFC 822 formatted date. + * @access public + * @return string + * @static + */ + public static 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 server hostname or 'localhost.localdomain' if unknown. + * @access private + * @return string + */ + private function ServerHostname() { + if (!empty($this->Hostname)) { + $result = $this->Hostname; + } elseif (isset($_SERVER['SERVER_NAME'])) { + $result = $_SERVER['SERVER_NAME']; + } else { + $result = 'localhost.localdomain'; + } + + return $result; + } + + /** + * Returns a message in the appropriate language. + * @access private + * @return string + */ + private 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. + * @access public + * @return bool + */ + public function IsError() { + return ($this->error_count > 0); + } + + /** + * Changes every end of line from CR or LF to CRLF. + * @access private + * @return string + */ + private 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. + * @access public + * @return void + */ + public 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 + */ + public 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]+://#',$url)) { + $filename = basename($url); + $directory = dirname($url); + ($directory == '.')?$directory='':''; + $cid = 'cid:' . md5($filename); + $ext = pathinfo($filename, PATHINFO_EXTENSION); + $mimeType = self::_mime_types($ext); + if ( strlen($basedir) > 1 && substr($basedir,-1) != '/') { $basedir .= '/'; } + if ( strlen($directory) > 1 && substr($directory,-1) != '/') { $directory .= '/'; } + 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 = html_entity_decode($textMsg); + } + if (empty($this->AltBody)) { + $this->AltBody = 'To view this email message, open it in a program that understands HTML!' . "\n\n"; + } + } + + /** + * Gets the MIME type of the embedded or inline image + * @param string File extension + * @access public + * @return string MIME type of ext + * @static + */ + public static 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 + * @todo Should this not be using __set() magic function? + */ + public function set($name, $value = '') { + try { + if (isset($this->$name) ) { + $this->$name = $value; + } else { + throw new phpmailerException($this->Lang('variable_set') . $name, self::STOP_CRITICAL); + } + } catch (Exception $e) { + $this->SetError($e->getMessage()); + if ($e->getCode() == self::STOP_CRITICAL) { + return false; + } + } + return true; + } + + /** + * Strips newlines to prevent header injection. + * @access public + * @param string $str String + * @return string + */ + public function SecureHeader($str) { + $str = str_replace("\r", '', $str); + $str = str_replace("\n", '', $str); + return trim($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 + */ + public function Sign($cert_filename, $key_filename, $key_pass) { + $this->sign_cert_file = $cert_filename; + $this->sign_key_file = $key_filename; + $this->sign_key_pass = $key_pass; + } + + /** + * 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 + */ + public function DKIM_QP($txt) { + $tmp=""; + $line=""; + for ($i=0;$iDKIM_private); + if ($this->DKIM_passphrase!='') { + $privKey = openssl_pkey_get_private($privKeyStr,$this->DKIM_passphrase); + } else { + $privKey = $privKeyStr; + } + if (openssl_sign($s, $signature, $privKey)) { + return base64_encode($signature); + } + } + + /** + * Generate DKIM Canonicalization Header + * + * @access public + * @param string $s Header + */ + public function DKIM_HeaderC($s) { + $s=preg_replace("/\r\n\s+/"," ",$s); + $lines=explode("\r\n",$s); + foreach ($lines as $key=>$line) { + list($heading,$value)=explode(":",$line,2); + $heading=strtolower($heading); + $value=preg_replace("/\s+/"," ",$value) ; // Compress useless spaces + $lines[$key]=$heading.":".trim($value) ; // Don't forget to remove WSP around the value + } + $s=implode("\r\n",$lines); + return $s; + } + + /** + * Generate DKIM Canonicalization Body + * + * @access public + * @param string $body Message Body + */ + public function DKIM_BodyC($body) { + if ($body == '') return "\r\n"; + // stabilize line endings + $body=str_replace("\r\n","\n",$body); + $body=str_replace("\n","\r\n",$body); + // END stabilize line endings + while (substr($body,strlen($body)-4,4) == "\r\n\r\n") { + $body=substr($body,0,strlen($body)-2); + } + return $body; + } + + /** + * Create the DKIM header, body, as new header + * + * @access public + * @param string $headers_line Header lines + * @param string $subject Subject + * @param string $body Body + */ + public function DKIM_Add($headers_line,$subject,$body) { + $DKIMsignatureType = 'rsa-sha1'; // Signature & hash algorithms + $DKIMcanonicalization = 'relaxed/simple'; // Canonicalization of header/body + $DKIMquery = 'dns/txt'; // Query method + $DKIMtime = time() ; // Signature Timestamp = seconds since 00:00:00 - Jan 1, 1970 (UTC time zone) + $subject_header = "Subject: $subject"; + $headers = explode("\r\n",$headers_line); + foreach($headers as $header) { + if (strpos($header,'From:') === 0) { + $from_header=$header; + } elseif (strpos($header,'To:') === 0) { + $to_header=$header; + } + } + $from = str_replace('|','=7C',$this->DKIM_QP($from_header)); + $to = str_replace('|','=7C',$this->DKIM_QP($to_header)); + $subject = str_replace('|','=7C',$this->DKIM_QP($subject_header)) ; // Copied header fields (dkim-quoted-printable + $body = $this->DKIM_BodyC($body); + $DKIMlen = strlen($body) ; // Length of body + $DKIMb64 = base64_encode(pack("H*", sha1($body))) ; // Base64 of packed binary SHA-1 hash of body + $ident = ($this->DKIM_identity == '')? '' : " i=" . $this->DKIM_identity . ";"; + $dkimhdrs = "DKIM-Signature: v=1; a=" . $DKIMsignatureType . "; q=" . $DKIMquery . "; l=" . $DKIMlen . "; s=" . $this->DKIM_selector . ";\r\n". + "\tt=" . $DKIMtime . "; c=" . $DKIMcanonicalization . ";\r\n". + "\th=From:To:Subject;\r\n". + "\td=" . $this->DKIM_domain . ";" . $ident . "\r\n". + "\tz=$from\r\n". + "\t|$to\r\n". + "\t|$subject;\r\n". + "\tbh=" . $DKIMb64 . ";\r\n". + "\tb="; + $toSign = $this->DKIM_HeaderC($from_header . "\r\n" . $to_header . "\r\n" . $subject_header . "\r\n" . $dkimhdrs); + $signed = $this->DKIM_Sign($toSign); + return "X-PHPMAILER-DKIM: phpmailer.worxware.com\r\n".$dkimhdrs.$signed."\r\n"; + } + + protected function doCallback($isSent,$to,$cc,$bcc,$subject,$body) { + if (!empty($this->action_function) && function_exists($this->action_function)) { + $params = array($isSent,$to,$cc,$bcc,$subject,$body); + call_user_func_array($this->action_function,$params); + } + } +} + +class phpmailerException extends Exception { + public function errorMessage() { + $errorMsg = '' . $this->getMessage() . "
    \n"; + return $errorMsg; + } +} +?> \ No newline at end of file diff --git a/upload/includes/classes/phpmailer/class.smtp.php b/upload/includes/classes/phpmailer/class.smtp.php new file mode 100644 index 00000000..c2ca1cb3 --- /dev/null +++ b/upload/includes/classes/phpmailer/class.smtp.php @@ -0,0 +1,814 @@ +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 + */ + public 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()) { + // already connected, generate error + $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; + } + + // SMTP server can take longer to respond, give longer timeout for first read + // Windows 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 + $announce = $this->get_lines(); + + if($this->do_debug >= 2) { + echo "SMTP -> FROM SERVER:" . $announce . $this->CRLF . '
    '; + } + + return true; + } + + /** + * Initiate a TLS communication with the server. + * + * SMTP CODE 220 Ready to start TLS + * SMTP CODE 501 Syntax error (no parameters allowed) + * SMTP CODE 454 TLS not available due to temporary reason + * @access public + * @return bool success + */ + public function StartTLS() { + $this->error = null; # to avoid confusion + + if(!$this->connected()) { + $this->error = array("error" => "Called StartTLS() without being connected"); + return false; + } + + fputs($this->smtp_conn,"STARTTLS" . $this->CRLF); + + $rply = $this->get_lines(); + $code = substr($rply,0,3); + + if($this->do_debug >= 2) { + echo "SMTP -> FROM SERVER:" . $rply . $this->CRLF . '
    '; + } + + if($code != 220) { + $this->error = + array("error" => "STARTTLS 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; + } + + // Begin encrypted connection + if(!stream_socket_enable_crypto($this->smtp_conn, true, STREAM_CRYPTO_METHOD_TLS_CLIENT)) { + return false; + } + + return true; + } + + /** + * Performs SMTP authentication. Must be run after running the + * Hello() method. Returns true if successfully authenticated. + * @access public + * @return bool + */ + public 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 public + * @return bool + */ + public function Connected() { + if(!empty($this->smtp_conn)) { + $sock_status = socket_get_status($this->smtp_conn); + if($sock_status["eof"]) { + // the socket is valid but we are not connected + 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 + */ + public 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 + */ + public 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:" . $rply . $this->CRLF . '
    '; + } + + 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 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); + } else { + $lines_out[] = substr($line,0,$pos); + $line = substr($line,$pos + 1); + } + + /* if processing headers add a LWSP-char to the front of new line + * rfc 822 on long msg headers + */ + if($in_headers) { + $line = "\t" . $line; + } + } + $lines_out[] = $line; + + // 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); + } + } + + // message data has been sent + 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:" . $rply . $this->CRLF . '
    '; + } + + 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; + } + + /** + * 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 + */ + public 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 hostname for HELO was not specified send default + if(empty($host)) { + // determine appropriate default to send to 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 + */ + private 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: " . $rply . $this->CRLF . '
    '; + } + + 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; + } + + /** + * 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 + */ + public 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:" . $rply . $this->CRLF . '
    '; + } + + 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 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 + */ + public 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:" . $byemsg . $this->CRLF . '
    '; + } + + $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 + */ + public 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:" . $rply . $this->CRLF . '
    '; + } + + 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 + */ + public 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:" . $rply . $this->CRLF . '
    '; + } + + 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 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 + */ + public 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:" . $rply . $this->CRLF . '
    '; + } + + 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; + } + + /** + * 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 + */ + public 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; + } + + /** + * Get the current error + * @access public + * @return array + */ + public function getError() { + return $this->error; + } + + ///////////////////////////////////////////////// + // 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 + */ + private 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 4th character is a space, we are done reading, break the loop + if(substr($str,3,1) == " ") { break; } + } + return $data; + } + +} + +?> \ No newline at end of file diff --git a/upload/includes/classes/player.class.php b/upload/includes/classes/player.class.php new file mode 100644 index 00000000..a5e5aa43 --- /dev/null +++ b/upload/includes/classes/player.class.php @@ -0,0 +1,213 @@ +getPlayerDetails($player_file); + if(!empty($player_details['name'])) + $player_array[]= $player_details; + } + + //Now Reading Sub Dir Files + foreach($subitem_list as $sub_dir => $sub_dir_list ) + { + foreach($subitem_list[$sub_dir] as $player_file) + { + $player_details = $this->getPlayerDetails($player_file,$sub_dir); + $player_details['dir'] = $player_details['folder'] = $sub_dir; + if(!empty($player_details['name'])) + $player_array[] = $player_details; + } + } + + return $player_array; + } + + /** + * Function used to get ClipBucket Player + */ + function get_players() + { + return $this->getPlayers(); + } + + /** + * Function used to get player details + * @input = file + */ + function get_player_details($player_file,$sub_dir=NULL) + { + if($sub_dir!='') + $sub_dir = $sub_dir.'/'; + + $file = PLAYER_DIR.'/'.$sub_dir.$player_file; + if(file_exists($file) && is_file($file)) + { + // We don't need to write to the file, so just open for reading. + $fp = fopen($file, 'r'); + // Pull only the first 8kiB of the file in. + $plugin_data = fread( $fp, 8192 ); + // PHP will close file handle, but we are good citizens. + fclose($fp); + preg_match( '/Player Name:(.*)$/mi', $plugin_data, $name ); + preg_match( '/Website:(.*)$/mi', $plugin_data, $website ); + preg_match( '/Version:(.*)/mi', $plugin_data, $version ); + preg_match( '/Description:(.*)$/mi', $plugin_data, $description ); + preg_match( '/Author:(.*)$/mi', $plugin_data, $author ); + preg_match( '/Author Website:(.*)$/mi', $plugin_data, $author_page ); + preg_match( '/ClipBucket Version:(.*)$/mi', $plugin_data, $cbversion ); + preg_match( '/Player Type:(.*)$/mi', $plugin_data, $type ); + preg_match( '/Released:(.*)$/mi', $plugin_data, $released ); + + $details_array = array + ( + 'name', + 'website', + 'version', + 'description', + 'author', + 'cbversion', + 'author_page', + 'code', + 'type', + 'released', + + ); + foreach ($details_array as $detail) + { + $plugin_array[$detail]=${$detail}[1]; + } + $plugin_array['file'] = $player_file; + $plugin_array['dir'] = $plugin_array['folder'] = $sub_dir; + $plugin_array['code'] = preg_replace('/\s/', '', $code[1]); + + return $plugin_array; + }else{ + return false; + } + } + function getPlayerDetails($file,$sub_dir=NULL) + { + return $this->get_player_details($file,$sub_dir); + } + + + /** + * Function used to get template thumb + */ + function get_preview_thumb($player) + { + $path = $player.'/preview.'; + $exts = array('png','jpg','gif'); + $thumb_path = BASEURL.'/images/icons/no_thumb_player.png'; + foreach($exts as $ext) + { + $file = PLAYER_DIR.'/'.$path.$ext; + if(file_exists($file)) + { + $thumb_path = PLAYER_URL.'/'.$path.$ext; + break; + } + } + return $thumb_path; + } + + /** + * Function used to set player for ClipBucket + */ + function set_player($details) + { + global $myquery; + + if($this->getPlayerDetails($details['file'],$details['folder'])) + { + $myquery->Set_Website_Details('player_file',$details['file']); + $myquery->Set_Website_Details('player_dir',$details['folder']); + e(lang("player_activated"),'m'); + }else + e(lang("error_occured_while_activating_player")); + } + function setplayer($details) + { + return $this->set_player($details); + } + +} + + /** + * this is for pak player + */ + + function fb_embed_video($params) + { + $fb_embed_funcs = cb_get_functions('fb_embed_video'); + if($fb_embed_funcs) + { + foreach($fb_embed_funcs as $func) + { + if(function_exists($func['func'])) + { + return $func['func']($params); + } + } + } + + $vdetails = $params['video']; + $config = urlencode(BASEURL."/player/pak_player/embed_player.php?vid=".$vdetails['videoid']."&json=true&autoplay=yes"); + if(!config('pak_license')) + $embed_src = BASEURL.'/player/pak_player/pakplayer.swf?config='.$config; + else + $embed_src = BASEURL.'/player/pak_player/pakplayer.unlimited.swf?config='.$config; + + return $embed_src; + } + +?> \ No newline at end of file diff --git a/upload/includes/classes/playlist.class.php b/upload/includes/classes/playlist.class.php new file mode 100644 index 00000000..34215b69 --- /dev/null +++ b/upload/includes/classes/playlist.class.php @@ -0,0 +1,23 @@ +'cb_user_playlists','playlist_items'=>'playlist_items'); + + + + +} \ No newline at end of file diff --git a/upload/includes/classes/plugin.class.php b/upload/includes/classes/plugin.class.php new file mode 100644 index 00000000..9178d216 --- /dev/null +++ b/upload/includes/classes/plugin.class.php @@ -0,0 +1,393 @@ +getPluginDetails($plugin_file); + if(!empty($plugin_details['name'])) + $plugins_array[]= $plugin_details; + } + + //Now Reading Sub Dir Files + foreach($subitem_list as $sub_dir => $sub_dir_list ) + { + foreach($subitem_list[$sub_dir] as $plugin_file) + { + $plugin_details = $this->getPluginDetails($plugin_file,$sub_dir); + $plugin_details['folder'] = $sub_dir; + if(!empty($plugin_details['name'])) + $plugins_array[] = $plugin_details; + } + } + + return $plugins_array; + } + + function getPluginList() + { + return $this->getPlugins(); + } + + + /** + * Function used to get new plugins, that are not installed yet + */ + function getNewPlugins() + { + //first get list of all plugins + $plugin_list = $this->getPluginList(); + + //Now Checking if plugin is installed or not + if(is_array($plugin_list)) + { + foreach($plugin_list as $plugin) + { + if(!$this->is_installed($plugin['file'])) + $plug_array[] = $plugin; + } + return $plug_array; + } + } + + + /** + * Function used to get new plugins, that are not installed yet + */ + function getInstalledPlugins() + { + global $db; + //first get list of all plugins + $plugin_list = $this->getPluginList(); + + if(FRONT_END) + $active_query = " plugin_active='yes' "; + else + $active_query = NULL; + $results = $db->select(tbl("plugins"),"*",$active_query); + + if(is_array($results)) + foreach($results as $result) + { + //Now Checking if plugin is installed or not + $this_plugin = $this->get_plugin_details($result['plugin_file'],$result['plugin_folder']); + if($this_plugin) + { + $result['file'] = $result['plugin_file']; + $result['folder'] = $result['plugin_folder']; + $plugin = array_merge($result,$this_plugin); + // pr($plugin); + $plug_array[] = $plugin; + } + + } + + + /* + * OLDER VERSION + foreach($plugin_list as $plugin) + { + + if($this->is_installed($plugin['file'],$plugin['version'],$plugin['folder'])) + { + $plugin = array_merge($plugin,$this->getPlugin($plugin['file'])); + //pr($plugin); + $plug_array[] = $plugin; + } + }*/ + + return $plug_array; + } + + /** + * Function used to check weather plugin is instlled or not + * @param : $plugin_code STRING + */ + function is_installed($file,$v=NULL,$folder=NULL) + { + global $db; + + //if($v) + //$version_check = "AND plugin_version='$v'"; + if($folder) + $folder_check = " AND plugin_folder ='$folder'"; + + $query = "SELECT plugin_file FROM plugins WHERE plugin_file='".$file."' $version_check $folder_check"; + + $details = $db->select(tbl("plugins"),"plugin_file","plugin_file='".$file."' $version_check $folder_check"); + if($db->num_rows>0) + return true; + else + return false; + } + + + /** + * get plugin details + * @param : $file STRING + */ + function get_plugin_details($plug_file,$sub_dir=NULL) + { + if($sub_dir!='') + $sub_dir = $sub_dir.'/'; + + $file = PLUG_DIR.'/'.$sub_dir.$plug_file; + if(file_exists($file) && is_file($file)) + { + // We don't need to write to the file, so just open for reading. + $fp = fopen($file, 'r'); + // Pull only the first 8kiB of the file in. + $plugin_data = fread( $fp, 8192 ); + // PHP will close file handle, but we are good citizens. + fclose($fp); + preg_match( '/Plugin Name:(.*)$/mi', $plugin_data, $name ); + preg_match( '/Website:(.*)$/mi', $plugin_data, $website ); + preg_match( '/Version:(.*)/mi', $plugin_data, $version ); + preg_match( '/Description:(.*)$/mi', $plugin_data, $description ); + preg_match( '/Author:(.*)$/mi', $plugin_data, $author ); + preg_match( '/Author Website:(.*)$/mi', $plugin_data, $author_page ); + preg_match( '/ClpBucket Version:(.*)$/mi', $plugin_data, $cbversion ); + preg_match( '/Plugin Type:(.*)$/mi', $plugin_data, $type ); + + $details_array = array + ( + 'name', + 'website', + 'version', + 'description', + 'author', + 'cbversion', + 'code', + 'author_page', + 'type', + + ); + foreach ($details_array as $detail) + { + $plugin_array[$detail]=${$detail}[1]; + } + $plugin_array['file'] = $plug_file; + $plugin_array['code'] = preg_replace('/\s/', '', $code[1]); + + return $plugin_array; + }else{ + return false; + } + } + function getPluginDetails($file,$sub_dir=NULL) + { + return $this->get_plugin_details($file,$sub_dir); + } + + + + /** + * Function used to get plugin details from database + * @param : plugin_id_code STRING + */ + function getPlugin($file,$folder=NULL) + { + if($folder) + $folder_query = " AND plugin_folder = '$folder'"; + + $result = $db->select(tbl("plugins"),"*"," plugin_file ='".$file."' $folder_query" ); + return $result[0]; + } + + + /** + * ClipBucket Internal Plugin Installer + * @param:plugin + */ + function installPlugin($pluginFile,$folder=NULL) + { + global $db,$LANG,$Cbucket; + $plug_details = $this->get_plugin_details($pluginFile,$folder); + if(!$plug_details) + $msg = e(lang('plugin_no_file_err')); + if(empty($plug_details['name'])) + $msg = e(lang('plugin_file_detail_err')); + if($this->is_installed($pluginFile,$folder)) + $msg = e(lang('plugin_installed_err')); + + if(empty($msg)) + { + $file_folder = $folder; + if($folder!='') + $folder = $folder.'/'; + $plug_details = $this->getPluginDetails(PLUG_DIR.'/'.$folder.$pluginFile); + + if(file_exists(PLUG_DIR.'/'.$folder.'install_'.$pluginFile)) + require_once(PLUG_DIR.'/'.$folder.'install_'.$pluginFile); + + dbInsert + ( + tbl('plugins'), + array( + 'plugin_file', + 'plugin_license_type', + 'plugin_license_key', + 'plugin_license_code', + 'plugin_active', + 'plugin_folder' + ), + array( + $pluginFile, + $plugin_details_array['plugin_license_type'], + $plugin_details_array['plugin_license_key'], + $plugin_details_array['plugin_license_code'], + 'yes', + $file_folder, + ) + ); + + //Checking For the installation SQL + $msg = e(lang('plugin_install_msg'),'m'); + define('NEW_INSTALL',false); + return PLUG_DIR.'/'.$folder.$pluginFile; + } + return false; + } + + /** + * Function used to activate plugin + */ + function pluginActive($plugin_file,$active='yes',$folder=NULL){ + global $db; + + if($folder) + $folder_query = " AND plugin_folder = '$folder'"; + + if($this->is_installed($plugin_file)) + { + $db->Execute("UPDATE ".tbl("plugins")." SET plugin_active='".$active."' WHERE plugin_file='".$plugin_file."' $folder_query"); + $active_msg = $active=='yes' ? 'activated' : 'deactiveted'; + $msg = e(sprintf(lang("plugin_has_been_s"),$active_msg),'m'); + }else{ + $msg = e(lang('plugin_no_install_err')); + } + return $msg; + } + + /** + * Function used to activate plugin + */ + function uninstallPlugin($file,$folder=NULL){ + global $db; + if($this->is_installed($file)) + { + if($folder) + $folder_query = " AND plugin_folder = '$folder'"; + + if($folder!='') + $folder = $folder.'/'; + + $db->Execute("DELETE FROM ".tbl("plugins")." WHERE plugin_file='".$file."' $folder_query"); + if(file_exists(PLUG_DIR.'/'.$folder.'uninstall_'.$file)) + require_once(PLUG_DIR.'/'.$folder.'uninstall_'.$file); + $msg = e(lang("plugin_uninstalled"),"m"); + }else{ + $msg = e(lang('plugin_no_install_err')); + } + return $msg; + } + +} + +?> \ No newline at end of file diff --git a/upload/includes/classes/pm.class.php b/upload/includes/classes/pm.class.php new file mode 100644 index 00000000..90b43d7f --- /dev/null +++ b/upload/includes/classes/pm.class.php @@ -0,0 +1,669 @@ + 'attachment_video' + */ + function attach_video($array) + { + global $cbvid; + if($cbvid->video_exists($array['attach_video'])) + return '{v:'.$array['attach_video'].'}'; + } + + /** + * Function used to pars video from attachemtn + */ + function parse_and_attach_video($att) + { + global $cbvid; + preg_match('/{v:(.*)}/',$att,$matches); + $vkey = $matches[1]; + if(!empty($vkey)) + { + assign('video',$cbvid->get_video_details($vkey)); + assign('only_once',true); + echo '

    Attached Video

    '; + template('blocks/video.html'); + } + } + + /** + * Function used to add custom video attachment form field + */ + function video_attachment_form() + { + global $cbvid; + $vid_array = array('user'=>userid(),'order'=>'date_added DESC','limit'=>15); + $videos = $cbvid->get_videos($vid_array); + $vids_array = array('' => lang("No Video")); + if($videos) + foreach($videos as $video) + { + $vids_array[$video['videokey']] = $video['title']; + } + $field = array( + 'video_form' => array + ('title'=> 'Attach video', + 'type'=>'dropdown', + 'name'=> 'attach_video', + 'id'=> 'attach_video', + 'value'=> $vids_array, + 'checked'=>post('attach_video'), + 'anchor_before'=>'before_video_attach_box', + ) + ); + return $field; + } + + + + +class cb_pm +{ + /** + * Private messages table + */ + var $tbl = 'messages'; + + /** + * Allow multi users + */ + var $multi = true; + + + /** + * Default Template + */ + var $email_template = 'pm_email_message'; + + /** + * Send Email on pm + */ + var $send_email = true; + + /** + * Allow inline attachments + * these attachements are linked in the messages instead of attached like emails + */ + var $allow_attachments = true; + + //Attachment functionss + var $pm_attachments = array('attach_video'); + var $pm_attachments_parse = array('parse_and_attach_video'); + + var $pm_custom_field = array(); + + + /** + * Calling Constructor + */ + function init() + { + $array = video_attachment_form(); + $this->add_custom_field($array); + } + + + + /** + * Sending PM + */ + function send_pm($array) + { + global $userquery,$db; + $to = $this->check_users($array['to'],$array['from']); + + //checking from user + if(!$userquery->user_exists($array['from'])) + { + e(lang('unknown_sender')); + //checking to user + }elseif(!$to) + return false; + //Checking if subject is empty + elseif(empty($array['subj'])) + e(lang('class_subj_err')); + elseif(empty($array['content'])) + e(lang('please_enter_message')); + else + { + $from = $this->get_the_user($array['from']); + $attachments = $this->get_attachments($array); + $type = $array['type'] ? $array['type'] : 'pm'; + $reply_to = $this->is_reply($array['reply_to'],$from); + + $fields = array('message_from','message_to','message_content', + 'message_subject','date_added','message_attachments','message_box','reply_to'); + $values = array($from,$to,$array['content'], + $array['subj'],now(),$attachments); + + //PM INBOX FIELDS + $fields_in = $fields; + //PM INBOX + $values_in = $values; + $values_in[] = 'in'; + $values_in[] = $reply_to; + + $db->insert(tbl($this->tbl),$fields_in,$values_in); + $array['msg_id'] = $db->insert_id(); + if($array['is_pm']) + { + //PM SENTBOX FIELDS + $fields_out = $fields; + $fields_out[] = 'message_status'; + + //PM SENTBOX + $values_out = $values; + $values_out[] = 'out'; + $values_out[] = $reply_to; + $values_out[] = 'read'; + + $db->insert(tbl($this->tbl),$fields_out,$values_out); + } + + //Sending Email + $this->send_pm_email($array); + e(lang("pm_sent_success"),"m"); + } + } + + + /** + * Function used to check input users + * are valid or not + */ + function check_users($input,$sender) + { + global $userquery; + + if(empty($input)) { + e(lang("unknown_reciever")); + } else { + //check if usernames are sperated by colon ';' + $input = preg_replace('/;/',',',$input); + //Now Exploding Input and converting it to and array + $usernames = explode(',',$input); + + //Now Checkinf for valid usernames + $valid_users = array(); + foreach($usernames as $username) + { + $user_id = $this->get_the_user($username); + if($userquery->is_user_banned($username,userid())) { + e(sprintf(lang("cant_pm_banned_user"),$username)); + } elseif($userquery->is_user_banned(username(),$username)){ + e(sprintf(lang("cant_pm_user_banned_you"),$username)); + }elseif(!$userquery->user_exists($username)) { + e(lang("unknown_reciever")); + } elseif($user_id == $sender) { + e(lang("you_cant_send_pm_yourself")); + } else { + $valid_users[] = $user_id; + } + } + + $valid_users = array_unique($valid_users); + + if(count($valid_users)>0) + { + $vusers = ''; + foreach($valid_users as $vu) + { + $vusers .="#".$vu."#"; + } + return $vusers; + } + else + return false; + } + } + + + /** + * Function used to get user + */ + function get_the_user($user) + { + global $userquery; + if(!is_numeric($user)) + return $userquery->get_user_field_only($user,'userid'); + else + return $user; + } + + + /** + * Function used to make attachment valid + * and embed it in the message + */ + function get_attachments($array) + { + $funcs = $this->pm_attachments; + $attachments = ''; + + if(is_array($funcs)) + foreach($funcs as $func) + { + if(function_exists($func)) + { + $attachments .= $func($array); + } + } + return $attachments; + } + + /** + * function used to check weather message is reply or not + */ + function is_reply($id,$uid) + { + global $db; + $results = $db->select(tbl($this->tbl),'message_to'," message_id = '$id' AND message_to LIKE '%#$uid#%'"); + if($db->num_rows>0) + return true; + else + return false; + } + + /** + * Function used to get message from inbox, set the template + * and display it + */ + function get_message($id) + { + global $db; + $result = $db->select(tbl($this->tbl),'*'," message_id='$id'"); + $result = $result[0]; + if($db->num_rows>0) + { + return $result[0]; + }else{ + e(lang('no_pm_exist')); + return false; + } + } + + /** + * Function used to get user INBOX Message + * @param MESSAGE ID + * @param USER ID + */ + function get_inbox_message($mid,$uid=NULL) + { + global $db; + if(!$uid) + $uid = userid(); + $result = $db->select(tbl($this->tbl.',users'),tbl($this->tbl.'.*,users.userid,users.username')," message_id='$mid' AND message_to LIKE '%#$uid#%' AND userid=".tbl($this->tbl).".message_from",NULL," date_added DESC "); + + if($db->num_rows>0) + { + return $result[0]; + }else{ + e(lang('no_pm_exist')); + return false; + } + } + + /** + * Function used to get user OUTBOX Message + * @param MESSAGE ID + * @param USER ID + */ + function get_outbox_message($mid,$uid=NULL) + { + global $db; + if(!$uid) + $uid = userid(); + $result = $db->select(tbl($this->tbl.',users'),tbl($this->tbl.'.*,users.userid,users.username')," message_id='$mid' AND message_from='$uid' AND userid=".tbl($this->tbl.".message_from")); + + if($db->num_rows>0) + { + return $result[0]; + }else{ + e(lang('no_pm_exist')); + return false; + } + } + + + /** + * Get Total PM + */ + function pm_count() { + global $db; + return $db->count(tbl($this->tbl),'message_id'); + } + + /** + * Function used to get user inbox messages + */ + function get_user_messages($uid,$box='in',$count_only=false) + { + global $db; + + if(!$uid) + $uid = userid(); + switch ($box) + { + + case 'in': + { + if($count_only) + { + $result = $db->count(tbl($this->tbl),'message_id'," message_to LIKE '%#$uid#%' AND message_box ='in' AND message_type='pm' "); + }else{ + $result = $db->select(tbl($this->tbl.',users'),tbl($this->tbl.'.*,users.username AS message_from_user '), + tbl($this->tbl).".message_to LIKE '%#$uid#%' AND ".tbl("users").".userid = ".tbl($this->tbl).".message_from + AND ".tbl($this->tbl).".message_box ='in' AND message_type='pm'",NULL," date_added DESC"); + } + } + break; + + + case 'out': + { + if($count_only) + { + $result = $db->count(tbl($this->tbl),'message_id'," message_from = '$uid' AND message_box ='out' "); + }else{ + $result = $db->select(tbl($this->tbl.',users'),tbl($this->tbl.'.*,users.username AS message_from_user '), + tbl($this->tbl).".message_from = '$uid' AND ".tbl("users").".userid = ".tbl($this->tbl).".message_from + AND ".tbl($this->tbl).".message_box ='out'",NULL," date_added DESC"); + //echo $db->db_query; + //One More Query Need To be executed to get username of recievers + $count = 0; + + $cond = ""; + if(is_array($result)) + foreach($result as $re) + { + + $cond = ''; + preg_match_all("/#(.*)#/Ui",$re['message_to'],$receivers); + //pr($receivers); + foreach($receivers[1] as $to_user) + { + + if(!empty($to_user)) + { + if(!empty($cond)) + $cond .= " OR "; + $cond .= " userid = '$to_user' "; + } + } + + $to_names = $db->select(tbl('users'),'username',$cond); + $t_names = ''; + + if(is_array($to_names)) + foreach($to_names as $tn) + { + $t_names[] = $tn[0]; + } + if(is_array($t_names)) + $to_user_names = implode(', ',$t_names); + else + $to_user_names = $t_names; + $result[$count]['to_usernames'] = $to_user_names; + $count++; + } + } + } + break; + + case 'notification': + { + if($count_only) + { + $result = $db->count(tbl($this->tbl),'message_id'," message_to LIKE '%#$uid#%' AND message_box ='in' AND message_type='pm' "); + }else{ + $result = $db->select(tbl($this->tbl.',users'),tbl($this->tbl.'.*,users.username AS message_from_user '), + tbl($this->tbl).".message_to LIKE '%#$uid#' AND ".tbl("users.userid")." = ".tbl($this->tbl).".message_from + AND ".tbl($this->tbl).".message_box ='in' AND message_type='notification'",NULL," date_added DESC"); + } + } + } + + if($result) + return $result; + else + return false; + + } + + function get_user_inbox_messages($uid,$count_only=false){ return $this->get_user_messages($uid,'in',$count_only); } + function get_user_outbox_messages($uid,$count_only=false){ return $this->get_user_messages($uid,'out',$count_only); } + function get_user_notification_messages($uid,$count_only=false){ return $this->get_user_messages($uid,'notification',$count_only); } + + /** + * Function used parse attachments + */ + function parse_attachments($attachment) + { + $funcs = $this->pm_attachments_parse; + if(is_array($funcs)) + foreach($funcs as $func) + { + if(function_exists($func)) + { + $attachments .= $func($attachment); + } + } + } + + + /** + * Function used to create PM FORM + */ + function load_compose_form() + { + $to = post('to'); + $to = $to ? $to : get('to'); + + $array = array + ( + 'to' =>array( + 'title'=> 'to', + 'type'=>'textfield', + 'name'=> 'to', + 'id'=> 'to', + 'value'=> $to, + //'hint_2'=> "seperate usernames by comma ','", + 'required'=>'yes' + ), + 'subj' =>array( + 'title'=> 'Subject', + 'type'=>'textfield', + 'name'=> 'subj', + 'id'=> 'subj', + 'value'=> post('subj'), + 'required'=>'yes' + ), + 'content' =>array( + 'title'=> 'content', + 'type'=>'textarea', + 'name'=> 'content', + 'id'=> 'pm_content', + 'value'=> post('content'), + 'required'=>'yes', + 'anchor_before'=>'before_pm_compose_box', + ), + + + ); + + return array_merge($array,$this->pm_custom_field); + } + + + /** + * Function used to add custom pm field + */ + function add_custom_field($array) + { + $this->pm_custom_field = array_merge($array,$this->pm_custom_field); + } + + + /** + * Function used to send PM EMAIL + */ + function send_pm_email($array) + { + global $cbemail,$userquery; + $sender = $userquery->get_user_field_only($array['from'],'username'); + $content = clean($array['content']); + $subject = clean($array['subj']); + $msgid = $array['msg_id']; + //Get To(Emails) + $emails = $this->get_users_emails($array['to']); + $vars = array + ( + '{sender}' => $sender, + '{content}' => $content, + '{subject}' => $subject, + '{msg_id}' => $msgid + ); + + $tpl = $cbemail->get_template($this->email_template); + $subj = $cbemail->replace($tpl['email_template_subject'],$vars); + $msg = $cbemail->replace($tpl['email_template'],$vars); + + cbmail(array('to'=>$emails,'from'=>WEBSITE_EMAIL,'subject'=>$subj,'content'=>$msg,'nl2br'=>true)); + } + + /** + * Function used to get emails of users from input + */ + + function get_users_emails($input) + { + global $userquery,$db; + //check if usernames are sperated by colon ';' + $input = preg_replace('/;/',',',$input); + //Now Exploding Input and converting it to and array + $usernames = explode(',',$input); + $cond = ''; + foreach($usernames as $user) + { + if(!empty($user)) + { + if(!empty($cond)) + $cond .= " OR "; + $cond .= " username ='".$user."' "; + } + } + + $emails = array(); + $results = $db->select(tbl($userquery->dbtbl['users']),'email',$cond); + foreach($results as $result) + { + $emails[] = $result[0]; + } + + return implode(',',$emails); + } + + + /** + * Function used to set private message status as read + */ + function set_message_status($mid,$status='read') + { + global $db; + if($mid) + $db->update(tbl($this->tbl),array('message_status'),array($status)," message_id='$mid'"); + } + + /** + * Function used to delete message from user messages box + */ + function delete_msg($mid,$uid,$box='in') + { + global $db; + if($box=='in') + { + $inbox = $this->get_inbox_message($mid,$uid); + if($inbox) + { + $inbox_user = $inbox['message_to']; + $inbox_user = preg_replace("/#".$uid."#/Ui","",$inbox_user); + if(empty($inbox_user)) + $db->delete(tbl($this->tbl),array("message_id"),array($mid)); + else + $db->update(tbl($this->tbl),array("message_to"),array($inbox_user)," message_id='".$inbox['message_id']."' "); + e(lang('msg_delete_inbox'),'m'); + } + }else{ + $outbox = $this->get_outbox_message($mid,$uid); + if($outbox) + { + $db->delete(tbl($this->tbl),array("message_id"),array($mid)); + e(lang('msg_delete_outbox'),'m'); + } + } + } + + + + /** + * Function used to get new messages + */ + function get_new_messages($uid=NULL,$type='pm') + { + if(!$uid) + $uid = userid(); + global $db; + switch($type) + { + case 'pm': + default: + { + $count = $db->count(tbl($this->tbl),"message_id"," message_to LIKE '%#$uid#%' AND message_box='in' AND message_type='pm' AND message_status='unread'"); + + } + break; + + case 'notification': + default: + { + $count = $db->count(tbl($this->tbl),"message_id"," message_to LIKE '%#$uid#%' AND message_box='in' AND message_type='notification' AND message_status='unread'"); + } + break; + } + + if($count>0) + return $count; + else + return "0"; + } +} + +?> \ No newline at end of file diff --git a/upload/includes/classes/reindex.class.php b/upload/includes/classes/reindex.class.php new file mode 100644 index 00000000..7c310d01 --- /dev/null +++ b/upload/includes/classes/reindex.class.php @@ -0,0 +1,443 @@ +count(tbl($this->vtbl), + tbl($this->vtbl).".videoid", + tbl($this->vtbl).".userid = ".$params['user']." AND + ".tbl($this->vtbl).".active = 'yes' AND ".tbl($this->vtbl).".status = 'Successful'"); + //echo $db->db_query; + $arr[] = $video_count; + } + + if($params['comment_added']) + { + $ctbl = tbl("comments"); + $comment_added = $db->count($ctbl, + $ctbl.".comment_id", + $ctbl.".userid = ".$params['user'].""); + $arr[] = $comment_added; + } + + if($params['comment_received']) + { + $ctbl = tbl("comments"); + $comment_received = $db->count($ctbl, + $ctbl.".comment_id", + $ctbl.".type_id = ".$params['user']." AND + ".$ctbl.".type = 'c'"); + $arr[] = $comment_received; + } + +// if($params['contacts']) +// { +// global $userquery; +// $contacts = $userquery->get_contacts($params['user'],0,"yes",true); +// $arr[] = $contacts; +// } +// + if($params['groups_count']) + { + global $cbgroup; + $details = array("user"=>$params['user'],"active"=>"yes","count_only"=>true); + $groups_count = $cbgroup->get_groups($details); + $arr[] = $groups_count; + } + + // Counting user subscribers + if($params['subscribers_count']) + { + $subtbl = tbl('subscriptions'); + $subscribers_count = $db->count($subtbl, + $subtbl.".subscription_id", + $subtbl.".subscribed_to = ".$params['user'].""); + $arr[] = $subscribers_count; + } + + + // Counting user subscriptions + if($params['subscriptions_count']) + { + $subtbl = tbl('subscriptions'); + $subscriptions_count = $db->count($subtbl, + $subtbl.".subscription_id", + $subtbl.".userid = ".$params['user'].""); + $arr[] = $subscriptions_count; + } + + if($params['collections_count']) + { + global $cbcollection; + $details = array("user"=>$params['user'],"active"=>"yes","count_only"=>true); + $collection_count = $cbcollection->get_collections($details); + $arr[] = $collection_count; + } + + if($params['photos_count']) + { + global $cbphoto; + $details = array("user"=>$params['user'],"active"=>"yes","count_only"=>true); + $photos_count = $cbphoto->get_photos($details); + $arr[] = $photos_count; + } + + return $arr; + + } + break; + + case "videos": + case "vid": + case "v": + { + //$arr[] = $params['video_id']; + if($params['video_comments']) + { + $ctbl = tbl("comments"); + $video_comments = $db->count($ctbl, + $ctbl.".comment_id", + $ctbl.".type_id = ".$params['video_id']." AND ".$ctbl.".type = 'v'"); + $arr[] = $video_comments; + } + + if($params['favs_count']) + { + $ftbl = tbl("favorites"); + $favs_count = $db->count($ftbl, + $ftbl.".favorite_id", + $ftbl.".id = ".$params['video_id']." AND ".$ftbl.".type = 'v'"); + $arr[] = $favs_count; + } + + if($params['playlist_count']) + { + $ptbl = tbl("playlist_items"); + $playlist_count = $db->count($ptbl, + $ptbl.".playlist_item_id", + $ptbl.".object_id = ".$params['video_id']." AND ".$ptbl.".playlist_item_type = 'v'"); + $arr[] = $playlist_count; + } + + return $arr; + } + break; + + case "group": + case "gp": + case "g": + { + //$arr[] = $params['group_id']; + + if($params['group_videos']) + { + $gvtbl = tbl('group_videos'); + $group_videos = $db->count($gvtbl, + $gvtbl.".group_video_id", + $gvtbl.".group_id = ".$params['group_id']." AND ".$gvtbl.".approved = 'yes'"); + $arr[] = $group_videos; + } + + if($params['group_topics']) + { + $gttbl = tbl('group_topics'); + $group_topics = $db->count($gttbl, + $gttbl.".topic_id", + $gttbl.".group_id = ".$params['group_id']." AND ".$gttbl.".approved = 'yes'"); + $arr[] = $group_topics; + } + + if($params['group_members']) + { + $gmtbl = tbl('group_members'); + $group_members = $db->count($gmtbl, + $gmtbl.".group_mid", + $gmtbl.".group_id = ".$params['group_id']." AND ".$gmtbl.".active = 'yes'"); + + $arr[] = $group_members; + } + + return $arr; + } + break; + + case "photos": + case "p": + case "photo": + { + if($params['favorite_count']) + { + $fav_count = $db->count(tbl("favorites"),"favorite_id",tbl("favorites.id")." = ".$params['photo_id']." AND ".tbl("favorites.type")." = 'p' "); + $arr[] = $fav_count; + } + + if($params['total_comments']) + { + $comment_count = $db->count(tbl("comments"),"comment_id",tbl("comments.type_id")." = ".$params['photo_id']." AND ".tbl("comments.type")." = 'p' "); + $arr[] = $comment_count; + } + + return $arr; + } + break; + + case "collections": + case "collection": + case "cl": + { + if($params['favorite_count']) + { + $fav_count = $db->count(tbl("favorites"),"favorite_id",tbl("favorites.id")." = ".$params['collection_id']." AND ".tbl("favorites.type")." = 'cl' "); + $arr[] = $fav_count; + } + + if($params['total_comments']) + { + $comment_count = $db->count(tbl("comments"),"comment_id",tbl("comments.type_id")." = ".$params['collection_id']." AND ".tbl("comments.type")." = 'cl' "); + $arr[] = $comment_count; + } + + if($params['total_items']) + { + $item_count = $db->count(tbl("collection_items"),"ci_id",tbl("collection_items.collection_id")." = ".$params['collection_id']); + $arr[] = $item_count; + } + + return $arr; + } + break; + } + } + + /** + * Function used to update + * indexes + */ + function update_index($type,$params=NULL) { + global $db; + + switch($type) + { + case "user": + case "u": + { + $db->update(tbl($this->utbl),$params['fields'],$params['values'], tbl($this->utbl).".userid = ".$params['user'].""); + //echo $db->db_query."

    "; + } + break; + + case "videos": + case "vid": + case "v": + { + $db->update(tbl($this->vtbl),$params['fields'],$params['values'], tbl($this->vtbl).".videoid = ".$params['video_id'].""); + //echo $db->db_query."

    "; + } + break; + + case "group": + case "gp": + case "g": + { + $db->update(tbl($this->gtbl),$params['fields'],$params['values'], tbl($this->gtbl).".group_id = ".$params['group_id'].""); + } + break; + + case "photos": case "photo": + case "p": case "foto": case "piture": + { + $db->update(tbl("photos"),$params['fields'],$params['values'],tbl("photos.photo_id")." = ".$params['photo_id']); + } + break; + + case "collection": case "collection": + case "cl": + { + $db->update(tbl("collections"),$params['fields'],$params['values'],tbl("collections.collection_id")." = ".$params['collection_id']); + } + break; + } + } + + /** + * Function used to extract + * fields + */ + function extract_fields($type,$arr) + { + global $db; + $fields = array(); + + switch($type) + { + case "user": + case "u": + { + if(is_array($arr)) + { + if(array_key_exists('video_count',$arr)) + $fields[] = 'total_videos'; + + if(array_key_exists('comment_added',$arr)) + $fields[] = 'total_comments'; + + if(array_key_exists('comment_received',$arr)) + $fields[] = 'comments_count'; + + if(array_key_exists('groups_count',$arr)) + $fields[] = 'total_groups'; + + if(array_key_exists('subscribers_count',$arr)) + $fields[] = 'subscribers'; + + if(array_key_exists('subscriptions_count',$arr)) + $fields[] = 'total_subscriptions'; + + if(array_key_exists('collections_count',$arr)) + $fields[] = 'total_collections'; + + if(array_key_exists('photos_count',$arr)) + $fields[] = 'total_photos'; + $result = $fields; + } else { + $result = $arr; + } + + return $result; + } + break; + + case "videos": + case "vid": + case "v": + { + if(is_array($arr)) + { + if(array_key_exists('video_comments',$arr)) + $fields[] = "comments_count"; + + if(array_key_exists('favs_count',$arr)) + $fields[] = "favourite_count"; + + if(array_key_exists('playlist_count',$arr)) + $fields[] = "playlist_count"; + + $result = $fields; + } else { + $result = $arr; + } + + return $result; + } + break; + + case "group": + case "gp": + case "g": + { + if(is_array($arr)) + { + if(array_key_exists('group_videos',$arr)) + $fields[] = "total_videos"; + + if(array_key_exists('group_topics',$arr)) + $fields[] = "total_topics"; + + if(array_key_exists('group_members',$arr)) + $fields[] = "total_members"; + + $result = $fields; + + } else { + $result = $arr; + } + + return $result; + } + + case "photos": case "photo": + case "p": case "piture": + { + if(is_array($arr)) + { + if(array_key_exists("favorite_count",$arr)) + $fields[] = "total_favorites"; + + if(array_key_exists("total_comments",$arr)) + $fields[] = "total_comments"; + + $result = $fields; + } else { + $result = $arr; + } + + return $result; + } + break; + + case "collections": case "collection": + case "cl": + { + if(is_array($arr)) + { + if(array_key_exists("favorite_count",$arr)) + $fields[] = "total_favorites"; + + if(array_key_exists("total_commnets",$arr)) + $fields[] = "total_comments"; + + if(array_key_exists("total_items",$arr)) + $fields[] = "total_objects"; + + $result = $fields; + } else { + $result = $arr; + } + + return $result; + } + break; + } + } +} + +?> \ No newline at end of file diff --git a/upload/includes/classes/search.class.php b/upload/includes/classes/search.class.php new file mode 100644 index 00000000..44d8efa6 --- /dev/null +++ b/upload/includes/classes/search.class.php @@ -0,0 +1,443 @@ +search_types[$type]) + { + $obj = $Cbucket->search_types[$type]; + global ${$obj}; + ${$obj}->init_search(); + return ${$obj}->search; + }else + { + global $cbvid; + $cbvid->init_search(); + return $cbvid->search; + } + } + + + /** + * Variable to hold search query condition + */ + var $query_conds = array(); + + function search() + { + global $db; + + $ma_query = ""; + #Checking for columns + if(!$this->use_match_method) + foreach($this->columns as $column) + { + $this->query_cond($column); + } + else + { + if($this->key) + { + $this->set_the_key(); + $ma_query = $this->match_against_query(); + $this->add_cond($ma_query); + //add order + $add_select_field = ",".$ma_query." AS Resource"; + //$sorting = "Resource ASC"; + }else + { + //do nothing + } + + foreach($this->columns as $column) + { + if($column['value'] == 'static') + $this->query_cond($column); + } + } + + + + #Checking for category + if(isset($this->category)) + { + $this->cat_to_query($this->category,$this->multi_cat); + } + #Setting Date Margin + if($this->date_margin!='') + { + $this->add_cond('('.$this->date_margin($this->date_added_colum).')'); + } + + #Sorting + if(isset($this->sort_by) && !$sorting) + { + $sorting = $this->sorting[$this->sort_by]; + } + + $condition = ""; + #Creating Condition + foreach($this->query_conds as $cond) + { + $condition .= $cond." "; + } + + if($this->has_user_id) + { + $query_cond = "(".$condition.")"; + if($condition) + $query_cond .= " AND "; + else + $query_cond = $condition; + $results = $db->select(tbl($this->db_tbl.",users"), + tbl($this->db_tbl.'.*,users.userid,users.username').$add_select_field, + $query_cond." ".tbl($this->db_tbl).".userid=".tbl("users.userid")." AND ".tbl($this->db_tbl).".active='yes'",$this->limit,$sorting); + + + + $this->total_results = $db->count(tbl($this->db_tbl),'*',$condition); + + }else + { + $results = $db->select(tbl($this->db_tbl),'*',$condition,$this->limit,$sorting); + //echo $db->db_query; + $this->total_results = $db->count(tbl($this->db_tbl),'*',$condition); + } + + + + return $results; + } + + + /** + * function used to add query cond + */ + function add_cond($cond,$op='AND') + { + if(count($this->query_conds)>0) + $op = $op; + else + $op = ''; + + $this->query_conds[] = $op." ".$cond; + } + + + /** + * Function used to convert array to query condition + */ + function query_cond($array) + { + //Checking Condition Type + $type = strtolower($array['type']); + + + if($type !='=' && $type!='<' && $type!='>' && $type!='<=' && $type!='>=' && $type!='like' && $type!='match' + && $type!='!=' && $type!='<>') + { + $type = '='; + } + + + $var = $array['var']; + if(empty($var)) + { + $var = "{KEY}"; + } + + $array['op'] = $array['op']?$array['op']:'AND'; + + + if(count($this->query_conds)>0) + $op = $array['op']; + else + $op = ''; + + if($array['value'] == 'static') + { + $this->query_conds[] = $op." ".tbl($this->db_tbl).".".$array['field']." ".$type." '".$array['var']."'"; + return true; + } + + + if(!empty($this->key) && $type != 'match') + $this->query_conds[] = $op." ".tbl($this->db_tbl).".".$array['field']." ".$type." '".preg_replace("/{KEY}/",$this->key,$var)."'"; + if(!empty($this->key) && $type == 'match') + $this->query_conds[] = $op." MATCH(".tbl($this->db_tbl).".".$array['field'].") AGAINST('".preg_replace("/{KEY}/",$this->key,$var)."' + IN BOOLEAN MODE)"; + + } + + /** + * Category to query + * fucntion used to covert category to query + */ + function cat_to_query($input,$multi=TRUE) + { + if(!empty($input)) + { + if(!is_array($input)) + $cats = explode(",",$input); + else + $cats = $input; + + $query = ""; + foreach($cats as $cat) + { + if(!empty($query)) + $query .=" OR "; + + if($multi) + $query .=" ".tbl($this->db_tbl).".category LIKE '%#$cat#%' "; + else + $query .=" ".tbl($this->db_tbl).".category = '$cat' "; + } + + if(count($this->query_conds)>0) + $op = "AND"; + else + $op = ''; + $this->query_conds[] = $op." (".$query.") "; + } + } + + + /** + * Function used to set date margin query + * it is used to get results within defined time span + * ie today, this week , this month or this year + */ + function date_margin($date_column='date_added',$date_margin=NULL) + { + if(!$date_margin) + $date_margin = $this->date_margin; + + if(!empty($date_margin)) + { + switch($date_margin) + { + case "today": + { + $cond = " curdate() = date($date_column) "; + } + break; + + case "yesterday": + { + $cond = " CONCAT(YEAR(curdate()),DAYOFYEAR(curdate())-1) = CONCAT(YEAR($date_column),DAYOFYEAR($date_column)) "; + } + break; + + case "this_week": + case "week": + case "thisweek": + { + $cond = " YEARWEEK($date_column)=YEARWEEK(curdate()) "; + } + break; + + case "this_month": + case "month": + case "thismonth": + { + $cond = " CONCAT(YEAR(curdate()),MONTH(curdate())) = CONCAT(YEAR($date_column),MONTH($date_column)) "; + } + break; + + case "this_year": + case "year": + case "thisyear": + { + $cond = "YEAR(curdate()) = YEAR($date_column)"; + } + break; + + case "all_time": + case "alltime": + case "all": + default: + { + $cond = " $date_column != '' "; + } + break; + + case "last_week": + case "lastweek": + { + $cond = " YEARWEEK($date_column)=YEARWEEK(curdate())-1 "; + } + break; + + case "last_month": + case "lastmonth": + { + $lastmonth = date("Ym", strtotime("last month")); + //$cond = " CONCAT(YEAR($date_column),MONTH($date_column)) ='$lastmonth' "; + //Thanks to netwibe.com + $cond = " CONCAT(YEAR(curdate()),MONTH(curdate())-1) = CONCAT(YEAR($date_column),MONTH($date_column)) "; + } + break; + + + case "last_year": + case "lastyear": + { + $cond = "YEAR(curdate())-1 = YEAR($date_column)"; + } + break; + } + + return $cond; + } + } + + /** + * Function used to define date margins + */ + function date_margins() + { + $this->date_margins = array + ( + 'alltime' => lang('alltime'), + 'today' => lang('today'), + 'yesterday'=> lang('yesterday'), + 'thisweek' => lang('thisweek'), + 'lastweek' => lang('lastweek'), + 'thismonth'=> lang('thismonth'), + 'lastmonth'=> lang('lastmonth'), + 'thisyear' => lang('thisyear'), + 'lastyear' => lang('lastyear'), + ); + + return $this->date_margins; + } + + + /** + * Function used to create match_against query + * it will simple loop the input fields + * add table prefix and create MATCH(fields) AGAINST (keyword) query + * @return - MATCH (fields) AGAINST (kewyord) + */ + function match_against_query() + { + + + $cond = " MATCH ( "; + $count = 0; + foreach($this->match_fields as $field) + { + + if($count>0) + $cond .= ","; + $cond .= tbl($this->db_tbl).".".$field; + + $count++; + } + $cond .= ")"; //Here match(fields1,field2) thing is finished + + //now add against + $cond .= " AGAINST ('".$this->key."' IN BOOLEAN MODE) "; + + return $cond; + } + + /** + * Function used to set the key + */ + function set_the_key($string=null) + { + if(!$string) + $string = $this->key; + $pattern = array('/(\w+)/i','/(\++)/i',"/(\-\+)/i",'/(\-+)/i'); + $replacement = array('+$1',"+","-","-"); + return $this->key = preg_replace($pattern, $replacement, $string); + } +} + +?> \ No newline at end of file diff --git a/upload/includes/classes/session.class.php b/upload/includes/classes/session.class.php new file mode 100644 index 00000000..e135267a --- /dev/null +++ b/upload/includes/classes/session.class.php @@ -0,0 +1,255 @@ + + * http://clip-bucket.com/ + */ + + +class Session +{ + var $tbl = 'sessions'; + var $id= ''; + var $overwrite = false; + + //Use cookies over sessions + var $cookie = true; + var $timeout = 3600; //1 hour + + /** + * offcourse, its a constructor + */ + function session() + { + $this->id = session_id() ; + $this->timeout = COOKIE_TIMEOUT; + } + + /** + * Function used to add session*/ + function add_session($user,$name,$value=false,$reg=false) + { + global $db,$pages; + if(!$value) + $value = $this->id; + + $this->get_user_session($user,$name,true); + + if($db->num_rows>0) + { + $db->delete(tbl($this->tbl),array('session_string','session'),array($name,$this->id)); + } + + $cur_url = $pages->GetCurrentUrl(); + + if(THIS_PAGE!='cb_install') + { + $db->insert(tbl($this->tbl),array('session_user','session','session_string','ip','session_value','session_date', + 'last_active','referer','agent','current_page'), + array($user,$this->id,$name,$_SERVER['REMOTE_ADDR'],$value,now(),now(),$_SERVER['HTTP_REFERER'],$_SERVER['HTTP_USER_AGENT'],$cur_url)); + } + if($reg) + { + //Finally Registering session + $this->session_register($name); + $this->session_val($name,$value); + } + } + + + + /** + * Function is used to get session + */ + function get_user_session($user,$session_name=false,$phpsess=false) + { + global $db; + if($session_name) + $session_cond = " session_string='".mysql_clean($session_name)."'"; + if($phpsess) + { + if($session_cond) + $session_cond .= " AND "; + $session_cond .= " session ='".$this->id."' "; + } + $results = $db->select(tbl($this->tbl),'*',$session_cond); + return $results; + } + + /** + * Function used to get sessins + */ + function get_sessions() + { + global $db,$pages; + $results = $db->select(tbl($this->tbl),'*'," session ='".$this->id."' "); + + $cur_url = $pages->GetCurrentUrl(); + + if(THIS_PAGE!='cb_install') + { + if(THIS_PAGE!='ajax') + $db->update(tbl($this->tbl),array("last_active","current_page"),array(now(),$cur_url)," session='".$this->id."' "); + else + $db->update(tbl($this->tbl),array("last_active"),array(now())," session='".$this->id."' "); + } + + return $results; + } + + + + /** + * Function used to get current user session, if any + */ + function get_current_session($session_string) + { + global $db; + $results = $db->select(tbl($this->tbl),'*'," session_string='logged_in' AND session_value='".$this->session."'"); + return $results[0]; + } + + + + /** + Functin used to register session + */ + function session_register($name) + { + if($this->overwrite) + $this->session_unregister($name); + //session_register($name); + } + + /** + * FUnction used to unregiser session + */ + function session_unregister($name) + { + //session_unregister($name); + } + + /** + * Ftunction used to set session value + */ + function session_val($name,$value) + { + $_SESSION[$name] = $value; + } + + /** + * Function used to remove session + */ + function remove_session($user,$name) + { + global $db; + $db->delete(tbl('sessions'),array("session_user","session_string"),array($user,$name)); + $_SESSION[$name] = ''; + $this->session_unregister($name); + } + + /** + * Function used to set register session and set its value + */ + function set_session($name,$val) + { + + if($this->cookie) + { + setcookie($name,$val,time()+$this->timeout,'/'); + }else + { + $this->session_register($name); + $_SESSION[$name] = $val; + } + } + function set($name,$val) + { + $this->set_session($name,$val); + } + + /** + * Function used to remove session value + */ + function unset_session($name) + { + if($this->cookie) + { + unset($_COOKIE[$name]); + setcookie($name,'',0); + }else + unset($_SESSION[$name]); + } + function un_set($name) + { + return $this->unset_session($name); + } + + /** + * Function used to get session value + * param VARCHAR name + */ + function get_session($name) + { + if($this->cookie) + { + if($_COOKIE[$name]) + return $_COOKIE[$name]; + }else + { + if(isset($_SESSION[$name])) + return $_SESSION[$name]; + } + } + //replica + function get($name){ return $this->get_session($name); } + + /** + * Destroy Session + */ + function destroy() + { + global $db; + $db->delete(tbl($this->tbl),array('session'),array($this->id)); + session_destroy(); + } + + /** + * Function set cookie + */ + function set_cookie($name,$val) + { + setcookie($name,($val),3600+time(),'/'); + } + + /** + * Function get cookie + */ + function get_cookie($name) + { + return stripslashes(($_COOKIE[$name])); + } + + + function kick($id) + { + global $db; + //Getting little details from sessions such that + //some lower class user can kick admins out ;) + $results = $db->select(tbl("sessions")." LEFT JOIN (".tbl("users").") ON + (".tbl("sessions").".session_user=".tbl("users").".userid)", tbl("sessions").".*, + ".tbl("users").".level","session_id='".$id."'"); + + $results = $results[0]; + + if($results['level']==1) + { + e("You cannot kick administrators"); + return false; + } + $db->delete(tbl($this->tbl),array("session_id"),array($id)); + return true; + } +} + +?> \ No newline at end of file diff --git a/upload/includes/classes/signup.class.php b/upload/includes/classes/signup.class.php new file mode 100644 index 00000000..d1a6d6bf --- /dev/null +++ b/upload/includes/classes/signup.class.php @@ -0,0 +1,32 @@ + \ No newline at end of file diff --git a/upload/includes/classes/swfObj.class.php b/upload/includes/classes/swfObj.class.php new file mode 100644 index 00000000..abe397c5 --- /dev/null +++ b/upload/includes/classes/swfObj.class.php @@ -0,0 +1,102 @@ +width = config('player_width'); + $this->height = config('player_height'); + } + + //Function Used TO Create Player + function CreatePlayer(){ + $this->SelectPlayer(); + $this->WritePlayer(); + $this->code = $this->ClearTabs($this->code); + } + + + //Function Used To Construct Player OBJ + function FlashObj(){ + $this->code = "var ".$this->playerVar." = new ".$this->objName."(\""; + //$this->code .= BASEURL; + $this->code .= $this->playerFile.'"'; + $this->code .= ',"base","'.$this->width.'","'.$this->height.'","'.$this->PlayerVer.'","'.$this->bgcolor.'");'; + } + + //Function Used To Check Which Player Has Been Selected + function SelectPlayer() + { + global $row; + + //Player + if(empty($this->playerFile)) + $this->playerFile = $row['player_file']; + } + + + + //Function Used To Add Param + function addParam($name,$value,$remove_quotes = false){ + if($remove_quotes == false){ + $this->code .= " + ".$this->playerVar.".addParam('$name', '$value');"; + }else{ + $this->code .= " + ".$this->playerVar.".addParam('$name', $value);"; + } + } + + //Function Used To Add Variables + function addVar($name,$value,$remove_quotes = false){ + if($remove_quotes == false){ + $this->code .= " + ".$this->playerVar.".addVariable('$name', '$value');"; + }else{ + $this->code .= " + ".$this->playerVar.".addVariable('$name', $value);"; + } + } + + //Function Write Player + function WritePlayer() + { + $this->code .= " + ".$this->playerVar.'.write("'.$this->DivId.'");'; + } + + //function used to remove tabs + function ClearTabs($text,$str=false){ + if($str==false){ + return preg_replace('/\t/','',$text); + }else{ + return str_replace('/\t/','',$text); + } + } + + //function for Embed Code + function EmbedCode($code,$div){ + $this->code = 'var EmbedCode="'.addslashes($code).'";'."\r\n"; + $this->code .= "$('#".$div."').html(EmbedCode)"; + } + +} +?> \ No newline at end of file diff --git a/upload/includes/classes/sysinfo.class.php b/upload/includes/classes/sysinfo.class.php new file mode 100644 index 00000000..81df9cdb --- /dev/null +++ b/upload/includes/classes/sysinfo.class.php @@ -0,0 +1,272 @@ + + $login_count = `last | grep / | cut -d' ' -f1 | sort | uniq -c`; + + // compact whitespace, remove leading/trailing whitespace + $login_count = trim(ereg_replace("[[:space:]]+", ' ', $login_count)); + + // convert to array, format: + // odds = login name, evens = login count (2, pedram, 5, shawn, ...) + $login_count = explode(" ", $login_count); + + // loop through our raw data and store the pertinant stats + for ($i = 0, $x = 0; $i < sizeof($login_count); $i += 2, $x++) { + $days = $hours = $mins = 0; + + // strip out the login duration (not including those currently logged in) + // XXX - add support for users still logged in. + $login_time = `last | grep -e ^{$login_count[$i+1]} | grep -v still | cut -d'(' -f2`; + $login_time = ereg_replace("[[:space:]]+", "", str_replace("\n", "", $login_time)); + $login_time = explode(")", $login_time); + + // determine the login durations + for ($j = 0; $j < sizeof($login_time); $j++) { + $entry = explode(":", $login_time[$j]); + $days += substr($entry[0], 0, strpos($entry[0], "+")); + $hours += substr($entry[0], strpos($entry[0], "+")); + $mins += $entry[1]; + } + + // formatting + $hours += floor($mins / 60); + $days += floor($hours / 24); + + $hours = $hours % 24; + $mins = $mins % 60; + + $login_stats[$x]["user"] = $login_count[$i+1]; + $login_stats[$x]["count"] = $login_count[$i]; + $login_stats[$x]["days"] = $days; + $login_stats[$x]["hours"] = $hours; + $login_stats[$x]["mins"] = $mins; + $login_stats[$x]["start"] = $wtmp_start; + } + + return $login_stats; +} + + + +/******************************************************************************* + * helper functions * + *******************************************************************************/ + + +/////////////////////////////////////////////////////////////////////////////// +// convert_bytes +// + +function convert_bytes ($bytes) { + $kbytes = $bytes / 1024; + + if ($kbytes > 1048576) + $converted = sprintf("%.2f GB", $kbytes / 1048576); + else if ($kbytes > 1024) + $converted = sprintf("%.2f MB", $kbytes / 1024); + else + $converted = sprintf("%.2f KB", $kbytes); + + return $converted; +} + +?> \ No newline at end of file diff --git a/upload/includes/classes/template.class.php b/upload/includes/classes/template.class.php new file mode 100644 index 00000000..483ebfa1 --- /dev/null +++ b/upload/includes/classes/template.class.php @@ -0,0 +1,306 @@ +compile_check = true; + $Smarty->debugging = false; + $Smarty->template_dir = BASEDIR."/styles"; + $Smarty->compile_dir = BASEDIR."/cache"; + + return true; + } + + function setCompileDir($dir_name) { + global $Smarty; + if (!isset($Smarty)) { + CBTemplate::create(); + } + $Smarty->compile_dir = $dir_name; + } + + function setType($type) { + global $Smarty; + if (!isset($Smarty)) { + CBTemplate::create(); + } + $Smarty->type = $type; + } + + function assign($var, $value) { + global $Smarty; + if (!isset($Smarty)) { + CBTemplate::create(); + } + $Smarty->assign($var, $value); + } + + function setTplDir($dir_name = null) { + global $Smarty; + if (!isset($Smarty)) { + CBTemplate::create(); + } + if (!$dir_name) { + $Smarty->template_dir = BASEDIR."/styles/clipbucketblue"; + } else { + $Smarty->template_dir = $dir_name; + } + } + + function setModule($module) { + global $Smarty; + if (!isset($Smarty)) { + CBTemplate::create(); + } + $Smarty->theme = $module; + $Smarty->type = "module"; + } + + function setTheme($theme) { + global $Smarty; + if (!isset($Smarty)) { + CBTemplate::create(); + } + $Smarty->template_dir = BASEDIR."/styles/" . $theme; + $Smarty->compile_dir = BASEDIR."/styles/" . $theme; + $Smarty->theme = $theme; + $Smarty->type = "theme"; + } + + function getTplDir() { + global $Smarty; + if (!isset($Smarty)) { + CBTemplate::create(); + } + return $Smarty->template_dir; + } + + function display($filename) { + global $Smarty; + if (!isset($Smarty)) { + CBTemplate::create(); + } + $Smarty->display($filename); + } + + function fetch($filename) { + global $Smarty; + if (!isset($Smarty)) { + CBTemplate::create(); + } + return $Smarty->fetch($filename); + } + + function getVars() { + global $Smarty; + if (!isset($Smarty)) { + CBTemplate::create(); + } + return $Smarty->get_template_vars(); + } + + /** + * Function used to get available templates + */ + function get_templates() + { + $dir = STYLES_DIR; + //Scaning Dir + $dirs = scandir($dir); + foreach($dirs as $tpl) + { + if(substr($tpl,0,1)!='.') + $tpl_dirs[] = $tpl; + } + //Now Checking for template template.xml + $tpls = array(); + foreach($tpl_dirs as $tpl_dir) + { + $tpl_details = CBTemplate::get_template_details($tpl_dir); + + if($tpl_details && $tpl_details['name']!='') + $tpls[$tpl_details['name']] = $tpl_details; + } + + return $tpls; + } + function gettemplates() + { + return $this->get_templates(); + } + + function get_template_details($temp,$file='template.xml') + { + $file = STYLES_DIR.'/'.$temp.'/template.xml'; + if(file_exists($file)) + { + $content = file_get_contents($file); + preg_match('/(.*)<\/name>/',$content,$name); + preg_match('/(.*)<\/author>/',$content,$author); + preg_match('/(.*)<\/version>/',$content,$version); + preg_match('/(.*)<\/released>/',$content,$released); + preg_match('/(.*)<\/description>/',$content,$description); + preg_match('/(.*)<\/website>/',$content,$website_arr); + + $name = $name[1]; + $author = $author[1]; + $version = $version[1]; + $released = $released[1]; + $description = $description[1]; + + $website = array('title'=>$website_arr[1],'link'=>$website_arr[2]); + + //Now Create array + $template_details = array + ('name'=>$name, + 'author'=>$author, + 'version'=>$version, + 'released'=>$released, + 'description'=>$description, + 'website'=>$website, + 'dir'=>$temp, + 'path'=>TEMPLATEFOLDER.'/'.$temp + ); + + return $template_details; + }else + return false; + } + + /** + * Function used to get template thumb + */ + function get_preview_thumb($template) + { + $path = TEMPLATEFOLDER.'/'.$template.'/images/preview.'; + $exts = array('png','jpg','gif'); + $thumb_path = BASEURL.'/images/icons/no_thumb_template.png'; + foreach($exts as $ext) + { + $file = BASEDIR.'/'.$path.$ext; + if(file_exists($file)) + { + $thumb_path = BASEURL.'/'.$path.$ext; + break; + } + } + + return $thumb_path; + } + + /** + * Function used to get any template + */ + function get_any_template() + { + $templates = $this->get_templates(); + if(is_array($templates)) + { + foreach($templates as $template) + { + if(!empty($template['name'])) + return $template['dir']; + } + return false; + }else + return false; + } + + /** + * Function used to check weather given template is ClipBucket Template or not + * It will read Template XML file + */ + function is_template($folder) + { + return $this->get_template_details($folder); + } + + + /** + * Function used to get list of template file frrom its layout and styles folder + */ + function get_template_files($template,$type=NULL) + { + switch($type) + { + case "layout": + default: + { + $style_dir = STYLES_DIR."/$template/layout/"; + $files_patt = $style_dir."*.html"; + $files = glob($files_patt); + /** + * All Files IN Layout Folder + */ + $new_files = array(); + foreach($files as $file) + { + $new_files[] = str_replace($style_dir,'',$file); + } + + /** + * Now Reading Blocks Folder + */ + $blocks = $style_dir.'blocks/'; + $file_patt = $blocks.'*.html'; + $files = glob($file_patt); + foreach($files as $file) + { + $new_files['blocks'][] = str_replace($blocks,'',$file); + } + + /** + * Reading Folders Under Blocks + */ + //$blocks_dirs = glob($blocks.'*',GLOB_ONLYDIR); +// foreach($blocks_dirs as $dir) +// { +// $dir_name = str_replace($blocks,'',$dir); +// +// /** +// * Now Reading Files under them and saving in array +// */ +// $sub_dir = $blocks.$dir_name.'/'; +// $file_patt = $sub_dir.'*.html'; +// $files = glob($file_patt); +// foreach($files as $file) +// { +// $new_files['blocks'][$dir_name][] = str_replace($sub_dir,'',$file); +// } +// } + return $new_files; + } + break; + case "theme": + { + $style_dir = STYLES_DIR."/$template/theme/"; + $files_patt = $style_dir."*.css"; + $files = glob($files_patt); + /** + * All Files IN CSS Folder + */ + $new_files = array(); + foreach($files as $file) + { + $new_files[] = str_replace($style_dir,'',$file); + } + + return $new_files; + } + } + } +} + +?> \ No newline at end of file diff --git a/upload/includes/classes/upload.class.php b/upload/includes/classes/upload.class.php new file mode 100644 index 00000000..e0df2a6e --- /dev/null +++ b/upload/includes/classes/upload.class.php @@ -0,0 +1,1153 @@ +loadRequiredFields($array); + $location_fields = $this->loadLocationFields($array); + $date_fields = $this->loadDateForm('','/',TRUE); + $option_fields = $this->loadOptionFields($array); + + if($array==NULL) + $array = $_POST; + + if(is_array($_FILES)) + $array = array_merge($array,$_FILES); + + //Mergin Array + $upload_fields = array_merge($required_fields,$location_fields,$option_fields); + + //Adding Custom Upload Fields + if(count($this->custom_upload_fields)>0 && $is_upload) + $upload_fields = array_merge($upload_fields,$this->custom_upload_fields); + //Adding Custom Form Fields + if(count($this->custom_form_fields)>0) + $upload_fields = array_merge($upload_fields,$this->custom_form_fields); + + validate_cb_form($upload_fields,$array); + + } + function ValidateUploadForm() + { + return validate_video_upload_form(); + } + + function UploadProcess($array=NULL) + { + return $this->submit_upload($array); + } + + function submit_upload($array=NULL) + { + global $eh,$Cbucket,$db,$userquery; + + if(!$array) + $array = $_POST; + + $this->validate_video_upload_form($array,TRUE); + + if(empty($eh->error_list)) + { + $required_fields = $this->loadRequiredFields($array); + $location_fields = $this->loadLocationFields($array); + $option_fields = $this->loadOptionFields($array); + + $upload_fields = array_merge($required_fields,$location_fields,$option_fields); + //Adding Custom Upload Fields + if(count($this->custom_upload_fields)>0) + $upload_fields = array_merge($upload_fields,$this->custom_upload_fields); + //Adding Custom Form Fields + if(count($this->custom_form_fields)>0) + $upload_fields = array_merge($upload_fields,$this->custom_form_fields); + + $userid = userid(); + + if(!userid() && has_access('allow_video_upload',true,false)) + { + $userid = $userquery->get_anonymous_user(); + //$userid = $user['userid']; + }elseif(userid() && !has_access('allow_video_upload',true,true)) + return false; + + if(is_array($_FILES)) + $array = array_merge($array,$_FILES); + + foreach($upload_fields as $field) + { + $name = formObj::rmBrackets($field['name']); + $val = $array[$name]; + + if($field['use_func_val']) + $val = $field['validate_function']($val); + + + if(!empty($field['db_field'])) + $query_field[] = $field['db_field']; + + if(is_array($val)) + { + $new_val = ''; + foreach($val as $v) + { + $new_val .= "#".$v."# "; + } + $val = $new_val; + } + + if(!$field['clean_func'] || (!apply_func($field['clean_func'],$val) && !is_array($field['clean_func']))) + $val = mysql_clean($val); + else + $val = apply_func($field['clean_func'],sql_free($val)); + + if(empty($val) && !empty($field['default_value'])) + $val = $field['default_value']; + + if(!empty($field['db_field'])) + $query_val[] = $val; + + } + + //Adding Video Code + $query_field[] = "file_name"; + $file_name = mysql_clean($array['file_name']); + $query_val[] = $file_name; + + //ADding Video Key + $query_field[] = "videokey"; + $query_val[] = $this->video_keygen(); + + + //Userid + $query_field[] = "userid"; + + if(!$array['userid']) + $query_val[] = $userid; + else + $query_val[] = $array['userid']; + + + //Upload Ip + $query_field[] = "uploader_ip"; + $query_val[] = $_SERVER['REMOTE_ADDR']; + + $activation = ACTIVATION; + + //Setting Activation Option + if($activation == 0){ + $active = 'yes'; + }else{ + $active = 'no'; + } + $query_field[] = "active"; + $query_val[] = $active; + + $query_field[] = "date_added"; + $query_val[] = now(); + + $query = "INSERT INTO ".tbl("video")." ("; + $total_fields = count($query_field); + + //Adding Fields to query + $i = 0; + foreach($query_field as $qfield) + { + $i++; + $query .= $qfield; + if($i<$total_fields) + $query .= ','; + } + + $query .= ") VALUES ("; + + + $i = 0; + //Adding Fields Values to query + foreach($query_val as $qval) + { + $i++; + $query .= "'$qval'"; + if($i<$total_fields) + $query .= ','; + } + + //Finalzing Query + $query .= ")"; + + //exit($query); + + if(!userid() && !has_access('allow_video_upload',false,false)) + { + e(lang("you_not_logged_in")); + //exit(); + }else{ + + $insert_id = file_name_exists($file_name); + if(!$insert_id) + { + $db->Execute($query); + $insert_id = $db->insert_id(); + + //loggin Upload + $log_array = array + ( + 'success'=>'yes', + 'action_obj_id' => $insert_id, + 'userid' => $userid, + 'details'=> "uploaded a video"); + insert_log('upload_video',$log_array); + + $db->update(tbl("users"),array("total_videos"),array("|f|total_videos+1")," userid='".$userid."'"); + } + } + + } + + //Adding Video Feed + addFeed(array('action' => 'upload_video','object_id' => $insert_id,'object'=>'video'));; + return $insert_id; + + } + + /** + * Function used to get available name for video thumb + * @param FILE_Name + */ + function get_available_file_num($file_name,$big=false) + { + //Starting from 1 + $code = 1; + if($big) + $big = "big-"; + while(1) + { + $path = THUMBS_DIR.'/'.$file_name.'-'.$big.$code.'.'; + if(!file_exists($path.'jpg') && !file_exists($path.'png') && !file_exists($path.'gif')) + break; + else + $code = $code + 1; + } + + return $code; + } + + + function upload_thumb($file_name,$file_array,$key=0) + { + global $imgObj,$LANG; + $file = $file_array; + if(!empty($file['name'][$key])) + { + $file_num = $this->get_available_file_num($file_name); + $ext = getExt($file['name'][$key]); + if($imgObj->ValidateImage($file['tmp_name'][$key],$ext)) + { + $file_path = THUMBS_DIR.'/'.$file_name.'-'.$file_num.'.'.$ext; + $big_file_path = THUMBS_DIR.'/'.$file_name.'-big-'.$file_num.'.'.$ext; + move_uploaded_file($file['tmp_name'][$key],$file_path); + + $imgObj->CreateThumb($file_path,$big_file_path,config('big_thumb_width'),$ext,config('big_thumb_height'),false); + $imgObj->CreateThumb($file_path,$file_path,THUMB_WIDTH,$ext,THUMB_HEIGHT,false); + e(lang('upload_vid_thumb_msg'),'m'); + } + } + } + + /** + * Function used to upload big thumb + * @param FILE_NAME + * @param $_FILES array name + */ + function upload_big_thumb($file_name,$file_array) { + global $imgObj,$LANG; + $file = $file_array; + $ext = getExt($file['name']); + $bigThumbWidth = config('big_thumb_width'); + $bigThumbHeight = config('big_thumb_height'); + + if($imgObj->ValidateImage($file['tmp_name'],$ext)) + { + $path = THUMBS_DIR.'/'.$file_name.'-big.'.$ext; + move_uploaded_file($file['tmp_name'],$path); + $imgObj->CreateThumb($path,$path,$bigThumbWidth,$ext,$bigThumbHeight,false); + e(lang('Video big thumb uploaded'),'m'); + } + } + + /** + * Function used to upload video thumbs + * @param FILE_NAME + * @param $_FILES array name + */ + + function upload_thumbs($file_name,$file_array) + { + global $LANG; + if(count($file_array[name])>1) + { + for($i=0;$iupload_thumb($file_name,$file_array,$i); + } + e(lang('upload_vid_thumbs_msg'),'m'); + }else{ + $file = $file_array; + $this->upload_thumb($file_name,$file); + } + } + + function UploadThumb($flv,$thumbid){ + $file = $_FILES["upload_thumb_$thumbid"]['tmp_name']; + $ext = GetExt($_FILES["upload_thumb_$thumbid"]['name']); + if(!empty($file) && $ext =='jpg'){ + $image = new ResizeImage(); + if($image->ValidateImage($file,$ext)){ + $thumb = BASEDIR.'/files/thumbs/'.GetThumb($flv,$thumbid); + move_uploaded_file($file,$thumb); + $image->CreateThumb($thumb,$thumb,THUMB_WIDTH,$ext,THUMB_HEIGHT,false); + return true; + }else{ + return false; + } + }else{ + return false; + } + + } + + + + /** + * FUNCTION USED TO LOAD UPLOAD FORM REQUIRED FIELDS + * title [Text Field] + * description [Text Area] + * tags [Text Field] + * categories [Check Box] + */ + + function loadRequiredFields($default=NULL) + { + global $LANG; + if($default == NULL) + $default = $_POST; + + $title = $default['title']; + $desc = $default['description']; + + if(is_array($default['category'])) + $cat_array = array($default['category']); + else + { + preg_match_all('/#([0-9]+)#/',$default['category'],$m); + $cat_array = array($m[1]); + } + + $tags = $default['tags']; + + $uploadFormRequiredFieldsArray = array + ( + /** + * this function will create initial array for fields + * this will tell + * array( + * title [text that will represents the field] + * type [type of field, either radio button, textfield or text area] + * name [name of the fields, input NAME attribute] + * id [id of the fields, input ID attribute] + * value [value of the fields, input VALUE attribute] + * id [name of the fields, input NAME attribute] + * size + * class + * label + * extra_params + * hint_1 [hint before field] + * hint_2 [hint after field] + * anchor_before [before after field] + * anchor_after [anchor after field] + * ) + */ + + 'title' => array('title'=> lang('vdo_title'), + 'type'=> 'textfield', + 'name'=> 'title', + 'id'=> 'title', + 'value'=> cleanForm($title), + 'size'=>'45', + 'db_field'=>'title', + 'required'=>'yes', + 'min_length' => config("video_min_title"), + 'max_length'=>config("video_max_title") + + ), + 'desc' => array('title'=> lang('vdo_desc'), + 'type'=> 'textarea', + 'name'=> 'description', + 'id'=> 'desc', + 'value'=> cleanForm($desc), + 'size'=>'35', + 'extra_params'=>' rows="4"', + 'db_field'=>'description', + 'required'=>'yes', + 'anchor_after'=>'after_desc_compose_box', + + ), + 'cat' => array('title'=> lang('vdo_cat'), + 'type'=> 'checkbox', + 'name'=> 'category[]', + 'id'=> 'category', + 'value'=> array('category',$cat_array), + 'hint_1'=> sprintf(lang('vdo_cat_msg'),ALLOWED_VDO_CATS), + 'db_field'=>'category', + 'required'=>'yes', + 'validate_function'=>'validate_vid_category', + 'invalid_err'=>lang('vdo_cat_err3'), + 'display_function' => 'convert_to_categories' + + + ), + 'tags' => array('title'=> lang('tag_title'), + 'type'=> 'textfield', + 'name'=> 'tags', + 'id'=> 'tags', + 'value'=> cleanForm(genTags($tags)), + 'hint_1'=> '', + 'hint_2'=> lang('vdo_tags_msg'), + 'db_field'=>'tags', + 'required'=>'yes', + 'validate_function'=>'genTags' + ), + ); + //Setting Anchors + $uploadFormRequiredFieldsArray['desc']['anchor_before'] = 'before_desc_compose_box'; + + //Setting Sizes + return $uploadFormRequiredFieldsArray; + } + + /** + * FUNCTION USED TO LOAD FORM OPTION FIELDS + * broadacast [Radio Button] + * embedding [Radio Button] + * rating [Radio Button] + * comments [Radio Button] + * comments rating [Radio Button] + */ + function loadOptionFields($default=NULL) + { + global $LANG,$uploadFormOptionFieldsArray; + + + if($default == NULL) + $default = $_POST; + + $broadcast = $default['broadcast'] ? $default['broadcast'] : 'public'; + $comments = $default['allow_comments'] ? $default['allow_comments'] : 'yes'; + $comment_voting = $default['comment_voting'] ? $default['comment_voting'] : 'yes'; + $rating = $default['allow_rating'] ? $default['allow_rating'] : 'yes'; + $embedding = $default['allow_embedding'] ? $default['allow_embedding'] : 'yes'; + + //Checking weather to enabled or disable password field + $video_pass_disable = 'disabled="disabled" '; + $video_user_disable = 'disabled="disabled" '; + + if($broadcast=='unlisted') + $video_pass_disable = ""; + elseif($broadcast=='private') + $video_user_disable = ''; + + $uploadFormOptionFieldsArray = array + ( + 'broadcast'=> array('title'=>lang('vdo_br_opt'), + 'type'=>'radiobutton', + 'name'=>'broadcast', + 'id'=>'broadcast', + 'value'=>array('public'=>lang('vdo_br_opt1'),'private'=>lang('vdo_br_opt2') + ,'unlisted'=>lang('vdo_broadcast_unlisted'),'logged'=>lang("logged_users_only")), + 'checked'=>$broadcast, + 'db_field'=>'broadcast', + 'required'=>'no', + 'validate_function'=>'yes_or_no', + 'display_function'=>'display_sharing_opt', + 'default_value'=>'public', + 'extra_tags' => + ' onClick=" + $(\'#video_password\').attr(\'disabled\',\'disabled\'); + $(\'#video_users\').attr(\'disabled\',\'disabled\'); + if($(this).val()==\'unlisted\') + $(\'#video_password\').attr(\'disabled\',\'\') + else if($(this).val()==\'private\') + $(\'#video_users\').attr(\'disabled\',\'\') + + " ' + ), + + 'video_password'=> array + ('title'=>lang('video_password'), + 'type'=>'password', + 'name'=>'video_password', + 'id'=>'video_password', + 'value'=> $default['video_password'], + 'db_field'=>'video_password', + 'required'=>'no', + 'extra_tags' => " $video_pass_disable ", + 'hint_2'=> lang('set_video_password') + ), + 'video_users' => array('title'=>lang('video_users'), + 'type'=>'textarea', + 'name'=>'video_users', + 'id'=>'video_users', + 'value'=> $default['video_users'], + 'db_field'=>'video_users', + 'required'=>'no', + 'extra_tags' => " $video_user_disable ", + 'hint_2'=> lang('specify_video_users'), + 'validate_function' => 'video_users', + 'use_func_val'=>true + ), + 'comments'=> array('title'=>lang('comments'), + 'type'=> 'radiobutton', + 'name'=>'allow_comments', + 'id'=>'comments', + 'value'=> array('yes'=>lang('vdo_allow_comm'),'no'=>lang('vdo_dallow_comm')), + 'checked'=> $comments, + 'db_field'=>'allow_comments', + 'required'=>'no', + 'validate_function'=>'yes_or_no', + 'display_function'=>'display_sharing_opt', + 'default_value'=>'yes', + ), + 'commentsvote'=> array('title'=>lang('vdo_comm_vote'), + 'type'=>'radiobutton', + 'name'=>'comment_voting', + 'id'=>'comment_voting', + 'value'=>array('yes'=>lang('vdo_allow_comm').' Voting','no'=>lang('vdo_dallow_comm').' Voting'), + 'checked'=>$comment_voting, + 'db_field'=>'comment_voting', + 'required'=>'no', + 'validate_function'=>'yes_or_no', + 'display_function'=>'display_sharing_opt', + 'default_value'=>'yes', + ), + 'rating'=> array('title'=>lang('ratings'), + 'type'=>'radiobutton', + 'name'=>'allow_rating', + 'id'=>'rating', + 'value'=> array('yes'=>lang('vdo_allow_rating'),'no'=>lang('vdo_dallow_ratig')), + 'checked'=>$rating, + 'db_field'=>'allow_rating', + 'required'=>'no', + 'validate_function'=>'yes_or_no', + 'display_function'=>'display_sharing_opt', + 'default_value'=>'yes', + ), + 'embedding'=> array('title'=>lang('vdo_embedding'), + 'type'=> 'radiobutton', + 'name'=> 'allow_embedding', + 'id'=> 'embedding', + 'value'=> array('yes'=>lang('vdo_embed_opt1'),'no'=>lang('vdo_embed_opt2')), + 'checked'=> $embedding, + 'db_field'=>'allow_embedding', + 'required'=>'no', + 'validate_function'=>'yes_or_no', + 'display_function'=>'display_sharing_opt', + 'default_value'=>'yes', + ), + ); + return $uploadFormOptionFieldsArray; + } + + /** + * FUNCTION USED TO LOAD DATE AND LOCATION OPTION OF UPLOAD FORM + * - day - month - year + * - country + * - city + */ + function loadLocationFields($default=NULL) + { + global $LANG,$LocationFieldsArray,$CBucket; + + if($default == NULL) + $default = $_POST; + + $dcountry = $default['country']; + $location = $default['location']; + $date_recorded = $default['datecreated']; + $date_recorded = $date_recorded ? date(config("date_format"),strtotime($date_recorded)) : date(config("date_format"),time()); + + $country_array = array(""); + + $country_array = @array_merge($country_array,ClipBucket::get_countries()); + + $LocationFieldsArray = array + ( + 'country'=> array('title'=>lang('country'), + 'type'=> 'dropdown', + 'name'=> 'country', + 'id'=> 'country', + 'value'=> $country_array, + 'checked'=> $dcountry, + 'db_field'=>'country', + 'required'=>'no', + 'default_value'=>'', + + ), + 'location'=> array('title'=>lang('location'), + 'type'=>'textfield', + 'name'=> 'location', + 'id'=> 'location', + 'value'=> $location, + 'hint_2'=> lang('vdo_add_eg'), + 'db_field'=>'location', + 'required'=>'no', + 'default_value'=>'', + ), + 'date_recorded' => array( + 'title' => 'Date Recorded', + 'type' => 'textfield', + 'name' => 'datecreated', + 'id' => 'datecreated', + 'class'=>'date_field', + 'anchor_after' => 'date_picker', + 'value'=> $date_recorded, + 'db_field'=>'datecreated', + 'required'=>'no', + 'default_value'=>'', + 'use_func_val' => true, + 'validate_function' => 'datecreated', + 'hint_2' => config("date_format"), + ) + ); + return $LocationFieldsArray; + } + + /** + * FUNCTION USED TO DISPLAY DATE FORM + */ + function loadDateForm($date=NULL,$sep='/',$bg_process=FALSE) + { + global $LANG,$formObj; + $month_array = array(''=>'--'); + $day_array = array(''=>'--'); + $year_array = array(''=>'----'); + for($i=1;$i<13;$i++) $month_array[$i] = $i; + for($i=1;$i<32;$i++) $day_array[$i] = $i; + for($i=date("Y",time());$i>1900;$i--) $year_array[$i] = $i; + + if($date['value']==NULL) + { + $d_month = $_POST['month']; + $d_day = $_POST['day']; + $d_year = $_POST['year']; + }else{ + $d_month = date("m",strtotime($date)); + $d_day = date("d",strtotime($date)); + $d_year = date("Y",strtotime($date)); + } + if(!$bg_process) + { + echo $formObj->createField('dropdown','month','',$month_array,NULL,NULL,NULL,NULL,$d_month); + echo $sep; + echo $formObj->createField('dropdown','day','',$day_array,NULL,NULL,NULL,NULL,$d_day); + echo $sep; + echo $formObj->createField('dropdown','year','',$year_array,NULL,NULL,NULL,NULL,$d_year); + echo lang('vdo_for_date'); + } + + } + + + + /** + * Function used to load upload form fields + * it will load all the values that are submited in the upload form + * after validation + */ + function load_post_fields() + { + + $required_fields = $this->loadRequiredFields($array); + $location_fields = $this->loadLocationFields($array); + $option_fields = $this->loadOptionFields($array); + $upload_fields = array_merge($required_fields,$location_fields,$option_fields); + if(count($this->custom_form_fields)>0) + $upload_fields = array_merge($upload_fields,$this->custom_form_fields); + + foreach($upload_fields as $field) + { + $name = formObj::rmBrackets($field['name']); + $val = $_POST[$name]; + if(!is_array($val)) + { + $val = cleanForm($_POST[$name]); + echo ''; + }else{ + $loop = count($val); + for($i=0;$i<$loop;$i++) + { + $val = $_POST[$name][$i]; + $val = cleanForm($_POST[$name][$i]); + echo ''; + } + } + } + } + + + /** + * Function used to add files in conversion queue + */ + function add_conversion_queue($file) + { + global $Cbucket,$db; + $tmp_ext = $Cbucket->temp_exts; + + $count = 1; + while(1) + { + $exists = 'no'; + foreach($tmp_ext as $exts) + { + + if(file_exists(TEMP_DIR.'/' .getName($file).'.'.$exts)) + { + $exists = 'yes'; + break; + } + } + + if($exists !='yes') + break; + + $new_file = getName($file).'-'.$count.'.'.strtolower(getExt($file)); + rename(TEMP_DIR.'/'.$file,TEMP_DIR.'/'.$new_file); + $file = $new_file; + + $count++; + if($count>50) + break; + } + + //Checking file existsi or not + if(file_exists(TEMP_DIR.'/'.$file)) + { + $ext = mysql_clean(strtolower(getExt($file))); + $name = mysql_clean(getName($file)); + //Get Temp Ext + $tmp_ext = mysql_clean($tmp_ext[rand(0,count($tmp_ext)-1)]); + //Creating New File Name + $new_file = $name.'.'.$tmp_ext; + //Renaming File for security purpose + if(!file_exists(TEMP_DIR.'/'.$file) || !$name) + return false; + rename(TEMP_DIR.'/'.$file,TEMP_DIR.'/'.$new_file); + //Adding Details to database + $db->Execute("INSERT INTO ".tbl("conversion_queue")." (cqueue_name,cqueue_ext,cqueue_tmp_ext,date_added) + VALUES ('".$name."','".$ext."','".$tmp_ext."','".NOW()."') "); + return $db->insert_id; + }else{ + return false; + } + } + + + /** + * Video Key Gen + * * it is use to generate video key + */ + function video_keygen() + { + global $db; + + $char_list = "ABDGHKMNORSUXWY"; + $char_list .= "123456789"; + while(1) + { + $vkey = ''; + srand((double)microtime()*1000000); + for($i = 0; $i < 12; $i++) + { + $vkey .= substr($char_list,(rand()%(strlen($char_list))), 1); + } + + if(!vkey_exists($vkey)) + break; + } + + return $vkey; + } + + + + + /** + * Function used to load upload form + */ + function load_upload_options() + { + global $Cbucket,$Smarty; + $opt_list = $Cbucket->upload_opt_list; + + foreach($opt_list as $opt) + { + $Smarty->register_function($opt['load_func'],$opt['load_func']); + } + + return $opt_list; + } + + + + /** + * Function used to perform some actions , after video is upload + * @param Videoid + */ + function do_after_video_upload($vid) + { + foreach($this->actions_after_video_upload as $funcs) + { + if(function_exists($funcs)) + $funcs($vid); + } + } + + + /** + * Function used to load custom upload fields + */ + function load_custom_upload_fields($data,$ck_display_admin=FALSE,$ck_display_user=FALSE) + { + $array = $this->custom_upload_fields; + foreach($array as $key => $fields) + { + $ok = 'yes'; + if($ck_display_admin) + { + if($fields['display_admin'] == 'no_display') + $ok = 'no'; + } + + if($ok=='yes') + { + if(!$fields['value']) + $fields['value'] = $data[$fields['db_field']]; + $new_array[$key] = $fields; + } + } + + return $new_array; + } + + + /** + * Function used to load custom form fields + */ + function load_custom_form_fields($data,$group_based=false) + { + if(!$group_based) + { + $array = $this->custom_form_fields; + foreach($array as $key => $fields) + { + if($data[$fields['db_field']]) + $value = $data[$fields['db_field']]; + elseif($data[$fields['name']]) + $value = $data[$fields['name']]; + + + if($fields['type']=='radiobutton' || + $fields['type']=='checkbox' || + $fields['type']=='dropdown') + $fields['checked'] = $value; + else + $fields['value'] = $value; + + + $new_array[$key] = $fields; + } + return $new_array; + }else + { + return $array = $this->custom_form_fields_groups; + } + } + + + /** + * function used to upload user avatar and or background + */ + function upload_user_file($type='a',$file,$uid) + { + global $db,$userquery,$cbphoto,$imgObj; + $avatar_dir = BASEDIR.'/images/avatars/'; + $bg_dir = BASEDIR.'/images/backgrounds/'; + + if($userquery->user_exists($uid)) + { + switch($type) + { + case 'a': + case 'avatar': + { + + if($file['size']/1024 > config('max_profile_pic_size')) + e(sprintf(lang('file_size_exceeds'),config('max_profile_pic_size'))); + elseif(file_exists($file['tmp_name'])) + { + $ext = getext($file['name']); + $file_name = $uid.'.'.$ext; + $file_path = $avatar_dir.$file_name; + if(move_uploaded_file($file['tmp_name'],$file_path)) + { + if(!$imgObj->ValidateImage($file_path,$ext)) + { + e(lang("Invalid file type")); + @unlink($file_path); + }else{ + $small_size = $avatar_dir.$uid.'-small.'.$ext; + $cbphoto->CreateThumb($file_path,$file_path,$ext,AVATAR_SIZE,AVATAR_SIZE); + $cbphoto->CreateThumb($file_path,$small_size,$ext,AVATAR_SMALL_SIZE,AVATAR_SMALL_SIZE); + } + }else{ + e(lang("class_error_occured")); + } + } + } + break; + case 'b': + case 'bg': + case 'background': + { + if($file['size']/1024 > config('max_bg_size')) + e(sprintf(lang('file_size_exceeds'),config('max_bg_size'))); + elseif(file_exists($file['tmp_name'])) + { + $ext = getext($file['name']); + $file_name = $uid.'.'.$ext; + $file_path = $bg_dir.$file_name; + if(move_uploaded_file($file['tmp_name'],$file_path)) + { + if(!$imgObj->ValidateImage($file_path,$ext)) + { + e(lang("Invalid file type")); + @unlink($file_path); + }else{ + $imgObj->CreateThumb($file_path,$file_path,BG_SIZE,$ext); + } + }else{ + e(lang("An error occured While Uploading File!")); + } + } + } + break; + } + return $file_name; + }else + e(lang('user_doesnt_exist')); + } + + + /** + * Function used to upload website logo + * @param logo_file + * @return $file_name.'.'.$ext; + */ + function upload_website_logo($file) + { + global $imgObj,$LANG; + + if(!empty($file['name'])) + { + //$file_num = $this->get_available_file_num($file_name); + $ext = getExt($file['name']); + $file_name = 'plaery-logo'; + if($imgObj->ValidateImage($file['tmp_name'],$ext)) + { + $file_path = BASEDIR.'/images/'.$file_name.'.'.$ext; + if(file_exists($file_path)) + if(!unlink($file_path)) + { + e("Unable to remove '$file_path' , please chmod it to 0777"); + return false; + } + + move_uploaded_file($file['tmp_name'],$file_path); + //$imgObj->CreateThumb($file_path,$file_path,200,$ext,200,false); + e("Logo has been uploaded",'m'); + return $file_name.'.'.$ext; + }else + e("Invalid Image file"); + } + return false; + } + + + + /** + * load_video_fields + * + * @param $input default values for all videos + * @return array of video fields + * + * Function used to load Video fields + * in clipbucket v2.5 , video fields are loaded in form of groups arrays + * each group has it name and fields wrapped in array + * and that array will be part of video fields + */ + function load_video_fields($input) + { + $fields = array + ( + array + ( + 'group_name' => lang('required_fields'), + 'group_id' => 'required_fields', + 'fields' => $this->loadRequiredFields($input), + ), + array + ( + 'group_name' => lang('vdo_share_opt'), + 'group_id' => 'sharing_fields', + 'fields' => $this->loadOptionFields($input), + ), + array + ( + 'group_name' => lang('date_recorded_location'), + 'group_id' => 'date_location_fields', + 'fields' => $this->loadLocationFields($input), + ) + ); + + //Adding Custom Fields + $custom_fields = $this->load_custom_form_fields($input,false); + + if($custom_fields) + { + $more_fields_group = + array + ( + 'group_name' => lang('more_fields'), + 'group_id' => 'custom_fields', + 'fields' => $custom_fields, + ); + } + + //Adding Custom Fields With Groups + $custom_fields_with_group = $this->load_custom_form_fields($input,true); + + //Finaling putting them together in their main array called $fields + if($custom_fields_with_group) + { + $custFieldGroups = $custom_fields_with_group; + + foreach($custFieldGroups as $gKey => $fieldGroup) + { + + foreach($fieldGroup['fields'] as $mainKey => $nField) + { + $updatedNewFields[$mainKey] = $nField; + if($input[$nField['db_field']]) + $value = $input[$nField['db_field']]; + elseif($input[$nField['name']]) + $value = $input[$nField['name']]; + + if($nField['type']=='radiobutton' || + $nField['type']=='checkbox' || + $nField['type']=='dropdown') + $updatedNewFields[$mainKey]['checked'] = $value; + else + $updatedNewFields[$mainKey]['value'] = $value; + + + } + + $fieldGroup['fields'] = $updatedNewFields; + + $group_id = $fieldGroup['group_id']; + + foreach($fields as $key => $field) + { + + if($field['group_id'] == $group_id) + { + $inputFields = $field['fields']; + //Setting field values + $newFields = $fieldGroup['fields']; + + + + $mergeField = array_merge($inputFields,$newFields); + + + //Finally Updating array + $newGroupArray = + array + ( + 'group_name' => $field['group_name'], + 'group_id' => $field['group_id'], + 'fields' => $mergeField, + ); + + $fields[$key] = $newGroupArray; + + $matched = true; + break; + }else + $matched = false; + } + + if(!$matched) + $fields[] = $fieldGroup; + + } + } + + if($more_fields_group) + $fields[] = $more_fields_group; + + return $fields; + } + + function isTime($time) + { + preg_match("/(([0-9]?[0-9]{1}):)?([0-5]{1}[0-9]{1}):([0-5]{1}[0-9]{1})/",$time,$match); + if(!empty($match[0])) + return ($match[0]); + else + return false; + } + + function time_to_sec($time) { + if(!$this->isTime($time)) + e(lang("Format of time is not right.")); + else + { + $hours = substr($time, 0, -6); + $minutes = substr($time, -5, 2); + $seconds = substr($time, -2); + return $hours * 3600 + $minutes * 60 + $seconds; + } + } +} +?> \ No newline at end of file diff --git a/upload/includes/classes/user.class.php b/upload/includes/classes/user.class.php new file mode 100644 index 00000000..f8cbbafa --- /dev/null +++ b/upload/includes/classes/user.class.php @@ -0,0 +1,5200 @@ + 'user_permission_types', + 'user_permissions' => 'user_permissions', + 'user_level_permission' => 'user_levels_permissions', + 'user_profile' => 'user_profile', + 'users' => 'users', + 'action_log' => 'action_log', + 'subtbl' => 'subscriptions', + 'contacts' => 'contacts', + ); + + var $udetails = array(); + + function userquery() + { + $this->cat_tbl = 'user_categories'; + } + + + function init() + { + global $sess,$Cbucket; + + +// $this->user_sess = $sess->get('user_sess'); + $this->sess_salt = $sess->get('sess_salt'); + $this->sessions = $this->get_sessions(); + + if($this->sessions['smart_sess']) + { + $this->userid = $this->sessions['smart_sess']['session_user']; + } + //$this->level = $sess->get('level'); + + //Setting Access + //Get list Of permission + //$perms = $this->get_permissions(); + //foreach($perms as $perm) + //{ + // $this->add_access_type($perm['permission_code'],$perm['permission_name']); + //} + + /*$this->add_access_type('admin_access','Admin Access'); + $this->add_access_type('upload_access','Upload Access'); + $this->add_access_type('channel_access','Channel Access'); + $this->add_access_type('mod_access','Moderator Access');*/ + + //Fetching List Of User Levels + $levels = $this->get_levels(); + foreach($levels as $level) + { + $this->usr_levels[$level['user_level_id']]=$level["user_level_name"]; + } + + $udetails = ""; + + if($this->userid) + $udetails = $this->get_user_details($this->userid,true); + + if($udetails) + { + + $this->udetails = $udetails; + $this->username = $udetails['username']; + $this->level = $this->udetails['level']; + $this->permission = $this->get_user_level(userid()); + //exit(); + + //Calling Logout Functions + $funcs = $this->init_login_functions; + if(is_array($funcs) && count($funcs)>0) + { + foreach($funcs as $func) + { + if(function_exists($func)) + { + $func(); + } + } + } + + + if($sess->get("dummy_username")=="") { + $this->UpdateLastActive(userid()); + } + }else { + + $this->permission = $this->get_user_level(4,TRUE); + } + + + + //Adding Actions such Report, share,fav etc + $this->action = new cbactions(); + $this->action->type = 'u'; + $this->action->name = 'user'; + $this->action->obj_class = 'userquery'; + $this->action->check_func = 'user_exists'; + $this->action->type_tbl = $this->dbtbl['users']; + $this->action->type_id_field = 'userid'; + + define('AVATAR_SIZE',config('max_profile_pic_width')); + define('AVATAR_SMALL_SIZE',40); + define('BG_SIZE',config('max_bg_width')); + define('BACKGROUND_URL',config('background_url')); + define("USE_GAVATAR",config('gravatars') ? config('gravatars') : false); //Use Gavatar + define('BACKGROUND_COLOR',config('background_color')); + + if(isSectionEnabled('channels')) + $Cbucket->search_types['users'] = "userquery"; + + } + + /** + * Function used to create user session key + */ + function create_session_key($session,$pass) + { + $newkey = $session.$pass; + $newkey = md5($newkey); + return $newkey; + } + + /** + * Function used to create user session code + * just for session authentication incase user wants to login again + */ + function create_session_code() + { + $code = rand(10000,99999); + return $code; + } + + /** + * Neat and clean function to login user + * this function was made for v2.x with User Level System + * param VARCHAR $username + * param TEXT $password + */ + function login_user($username,$password,$remember=false) + { + global $LANG,$sess,$cblog,$db; + //Now checking if user exists or not + $pass = pass_code($password); + + $udetails = $this->get_user_with_pass($username,$pass); + + //Inerting Access Log + $log_array = array('username'=>$username); + + //First we will check weather user is already logged in or not + if($this->login_check(NULL,true)) + $msg[] = e(lang('you_already_logged')); + elseif(!$this->user_exists($username)) + $msg[] = e(lang('user_doesnt_exist')); + elseif(!$udetails) + $msg[] = e(lang('usr_login_err')); + elseif(strtolower($udetails['usr_status']) != 'ok') + $msg[] = e(lang('user_inactive_msg')); + elseif($udetails['ban_status'] == 'yes') + $msg[] = e(lang('usr_ban_err')); + else + { + + $log_array['userid'] = $userid = $udetails['userid']; + $log_array['useremail'] = $udetails['email']; + $log_array['success'] = 1; + + $log_array['level'] = $level = $udetails['level']; + + //Adding Sessing In Database + //$sess->add_session($userid,'logged_in'); + + //$sess->set('username',$username); + //$sess->set('userid',$userid); + + //Setting Timeout + if($remember) + $sess->timeout = 86400*REMBER_DAYS; + + //Starting special sessions for security + $session_salt = RandomString(5); + $sess->set('sess_salt',$session_salt); + $sess->set('PHPSESSID',$sess->id); + + $smart_sess = md5($udetails['user_session_key'].$session_salt); + + $db->delete(tbl("sessions"),array("session","session_string"),array($sess->id,"guest")); + $sess->add_session($userid,'smart_sess',$smart_sess); + + //$sess->set('user_sess',$smart_sess); + + //$sess->set('user_session_key',$udetails['user_session_key']); + //$sess->set('user_session_code',$udetails['user_session_code']); + + + //Setting Vars + $this->userid = $udetails['userid']; + $this->username = $udetails['username']; + $this->level = $udetails['level']; + + //Updating User last login , num of visist and ip + $db->update(tbl('users'), + array( + 'num_visits','last_logged','ip' + ), + array( + '|f|num_visits+1',NOW(),$_SERVER['REMOTE_ADDR'] + ), + "userid='".$userid."'" + ); + + + $this->init(); + //Logging Actiong + $cblog->insert('login',$log_array); + + return true; + } + + //Error Loging + if(!empty($msg)) + { + //Loggin Action + $log_array['success'] = no; + $log_array['details'] = $msg[0]; + $cblog->insert('login',$log_array); + } + } + + + + + /** + * Function used to check weather user is login or not + * it will also check weather user has access or not + * @param VARCHAR acess type it can be admin_access, upload_acess etc + * you can either set it as level id + */ + function login_check($access=NULL,$check_only=FALSE,$verify_logged_user=TRUE) + { + global $LANG,$Cbucket,$sess; + + + if($verify_logged_user) + { + //First check weather userid is here or not + if(!userid()) + { + if(!$check_only) + e(lang('you_not_logged_in')); + return false; + } + elseif(!$this->session_auth(userid())) + { + + if(!$check_only) + e(lang('usr_invalid_session_err')); + return false; + } + + //Now Check if logged in user exists or not + elseif(!$this->user_exists(userid(),TRUE)) + { + if(!$check_only) + e(lang('invalid_user')); + return false; + } + //Now Check logged in user is banned or not + elseif($this->is_banned(userid())=='yes') + { + if(!$check_only) + e(lang('usr_ban_err')); + return false; + } + } + + //Now user have passed all the stages, now checking if user has level access or not + if($access) + { + //$access_details = $this->get_user_level(userid()); + $access_details = $this->permission; + if(is_numeric($access)) + { + if($access_details['level_id'] == $access) + { + return true; + }else{ + + if(!$check_only) + e(lang('insufficient_privileges')); + $Cbucket->show_page(false); + return false; + } + }else + { + if($access_details[$access] == 'yes') + { + + return true; + } + else + { + if(!$check_only) + { + e(lang('insufficient_privileges')); + $Cbucket->show_page(false); + } + return false; + } + } + } + else + { + return true; + } + } + + /** + * This function was used to check + * user is logged in or not -- for v1.7.x and old + * it has been replaced by login_check in v2 + * this function is sitll in use so + * we are just replace the lil code of it + */ + function logincheck($access=NULL,$redirect=TRUE) + { + + if(!$this->login_check($access)) + { + if($redirect==TRUE) + redirect_to(BASEURL.signup_link); + return false; + } + else + { + return true; + } + } + + /** + * Function used to authenticate user session + */ + function session_auth($uid) + { + global $sess; + + return true; + /*if($sess->get('user_session_key') == $ufields['user_session_key'] + && $sess->get('user_session_code') == $ufields['user_session_code'])*/ + if($this->user_sessions['key']=='') + { + $ufields = $this->get_user_fields($uid,'user_session_key,user_session_code'); + //echo test; + $this->user_sessions['key'] = $ufields['user_session_key']; + $this->user_sessions['code'] = $ufields['user_session_code']; + } + + if($this->user_sessions['key']==$sess->get('user_session_key') + && $this->user_sessions['code']==$sess->get('user_session_code') + ||( has_access("admin_access") && $sess->get("dummy_username")!="")) + + return true; + else + return false; + } + + /** + * Function used to get user details using username and password + */ + function get_user_with_pass($username,$pass) + { + global $db; + $results = $db->select(tbl("users"), + "userid,email,level,usr_status,user_session_key,user_session_code", + "(username='$username' OR userid='$username') AND password='$pass'"); + if($db->num_rows > 0) + { + return $results[0]; + }else{ + return false; + } + } + + + /** + * Function used to check weather user is banned or not + */ + function is_banned($uid) + { + global $db; + //echo $this->udetails['ban_status']; + if(empty($this->udetails['ban_status']) && userid()) + $this->udetails['ban_status'] = $this->get_user_field($uid,'ban_status'); + return $this->udetails['ban_status']; + } + + function admin_check() + { + return $this->login_check('admin_access'); + } + + /** + * Function used to check user is admin or not + * @param BOOLEAN if true, after checcking user will be redirected to login page if needed + */ + function admin_login_check($check_only=false) + { + if(!has_access('admin_access',true)) + { + if($check_only==FALSE) + redirect_to('login.php'); + return false; + }else{ + return true; + } + } + + //This Function Is Used to Logout + function logout($page='login.php') + { + global $sess; + + //Calling Logout Functions + $funcs = $this->logout_functions; + if(is_array($funcs) && count($funcs)>0) + { + foreach($funcs as $func) + { + if(function_exists($func)) + { + $func(); + } + } + } + + $sess->un_set('sess_salt'); + $sess->destroy(); + //$sess->remove_session(userid()); + } + + + + /** + * Function used to delete user + */ + function delete_user($uid) + { + global $db; + + if($this->user_exists($uid)) + { + + $udetails = $this->get_user_details($uid); + + if(userid()!=$uid&&has_access('admin_access',true)&&$uid!=1) + { + //list of functions to perform while deleting a video + $del_user_funcs = $this->delete_user_functions; + if(is_array($del_user_funcs)) + { + foreach($del_user_funcs as $func) + { + if(function_exists($func)) + { + $func($udetails); + } + } + } + + //Removing Subsriptions and subscribers + $this->remove_user_subscriptions($uid); + $this->remove_user_subscribers($uid); + + //Changing User Videos To Anonymous + $db->execute("UPDATE ".tbl("video")." SET userid='".$this->get_anonymous_user()."' WHERE userid='".$uid."'"); + //Changing User Group To Anonymous + $db->execute("UPDATE ".tbl("groups")." SET userid='".$this->get_anonymous_user()."' WHERE userid='".$uid."'"); + //Deleting User Contacts + $this->remove_contacts($uid); + + //Deleting User PMS + $this->remove_user_pms($uid); + //Changing From Messages to Anonymous + $db->execute("UPDATE ".tbl("messages")." SET message_from='".$this->get_anonymous_user()."' WHERE message_from='".$uid."'"); + //Finally Removing Database entry of user + $db->execute("DELETE FROM ".tbl("users")." WHERE userid='$uid'"); + $db->execute("DELETE FROM ".tbl("user_profile")." WHERE userid='$uid'"); + + e(lang("usr_del_msg"),"m"); + }else{ + e(lang("you_cant_delete_this_user")); + } + }else{ + e(lang("user_doesnt_exist")); + } + } + + /** + * Remove all user subscriptions + */ + function remove_user_subscriptions($uid) + { + global $db; + if(!$this->user_exists($uid)) + e(lang("user_doesnt_exist")); + elseif(!has_access('admin_access')) + e(lang("you_dont_hv_perms")); + else + { + $db->execute("DELETE FROM ".tbl($this->dbtbl['subtbl'])." WHERE userid='$uid'"); + e(lang("user_subs_hv_been_removed"),"m"); + } + } + + /** + * Remove all user subscribers + */ + function remove_user_subscribers($uid) + { + global $db; + if(!$this->user_exists($uid)) + e(lang("user_doesnt_exist")); + elseif(!has_access('admin_access')) + e(lang("you_dont_hv_perms")); + else + { + $db->execute("DELETE FROM ".tbl($this->dbtbl['subtbl'])." WHERE subscribed_to='$uid'"); + e(lang("user_subsers_hv_removed"),"m"); + } + } + + + //Delete User + function DeleteUser($id){ + return $this->delete_user($id); + } + + //Check User Exists or Not + function Check_User_Exists($id,$global=false){ + global $db; + + if($global) + { + if(empty($this->user_exist)) + { + if(is_numeric($id)) + $result = $db->count(tbl($this->dbtbl['users']),"userid"," userid='".$id."' "); + else + $result = $db->count(tbl($this->dbtbl['users']),"userid"," username='".$id."' "); + if($result>0) + { + $this->user_exist = 'yes'; + }else{ + $this->user_exist = 'no'; + } + } + + if($this->user_exist=='yes') + return true; + else + return false; + }else + { + if(is_numeric($id)) + $result = $db->count(tbl($this->dbtbl['users']),"userid"," userid='".$id."'"); + else + $result = $db->count(tbl($this->dbtbl['users']),"userid"," username='".$id."'"); + if($result>0) + { + return true; + }else{ + return false; + } + } + + } + + function user_exists($username,$global=false) + { + return $this->Check_User_Exists($username,$global); + } + + /** + * Function used to get user details using userid + */ + function get_user_details($id=NULL,$checksess=false) + { + global $db,$sess; + /*if(!$id) + $id = userid();*/ + if(is_numeric($id)) + $results = $db->select(tbl('users'),'*'," userid='$id'"); + else + $results = $db->select(tbl('users'),'*'," username='".$id."' OR email='".$id."'"); + $udetails = $results[0]; + + if(!$checksess) + return $udetails; + else + { + $session = $this->sessions['smart_sess']; + $udetails['user_session_key']; + $smart_sess = md5($udetails['user_session_key'].$sess->get('sess_salt')); + + if($smart_sess==$session['session_value']) + { + $this->is_login = true; + return $udetails; + }else + return false; + } + + }function GetUserData($id=NULL){ return $this->get_user_details($id); } + + + + + //Function Used To Activate User + function activate_user_with_avcode($user,$avcode) + { + global $eh; + $data = $this->get_user_details($user); + if(!$data || !$user) + e(lang("usr_exist_err")); + elseif($data['usr_status']=='Ok') + e(lang('usr_activation_err')); + elseif($data['ban_status']=='yes') + e(lang('ban_status')); + elseif($data['avcode'] !=$avcode) + e(lang('avcode_incorrect')); + else + { + $this->action('activate',$data['userid']); + $eh->flush(); + e(lang("usr_activation_msg"),"m"); + + if($data['welcome_email_sent']=='no') + $this->send_welcome_email($data,TRUE); + } + } + + + /** + * Function used to send activation code + * to user + * @param : $usenrma,$email or $userid + */ + function send_activation_code($email) + { + global $db,$cbemail; + $udetails = $this->get_user_details($email); + + if(!$udetails || !$email) + e(lang("usr_exist_err")); + elseif($udetails['usr_status']=='Ok') + e(lang('usr_activation_err')); + elseif($udetails['ban_status']=='yes') + e(lang('ban_status')); + else + { + $tpl = $cbemail->get_template('avcode_request_template'); + $more_var = array + ('{username}' => $udetails['username'], + '{email}' => $udetails['email'], + '{avcode}' => $udetails['avcode'] + ); + if(!is_array($var)) + $var = array(); + $var = array_merge($more_var,$var); + $subj = $cbemail->replace($tpl['email_template_subject'],$var); + $msg = nl2br($cbemail->replace($tpl['email_template'],$var)); + + //Now Finally Sending Email + cbmail(array('to'=>$udetails['email'],'from'=>SUPPORT_EMAIL,'subject'=>$subj,'content'=>$msg)); + e(lang('usr_activation_em_msg'),"m"); + } + } + function SendActivation($email) + { + return $this->send_activation_code($email); + } + + /** + * Function used to send welcome email + */ + function send_welcome_email($user,$update_email_status=FALSE) + { + global $db,$cbemail; + + if(!is_array($user)) + $udetails = $this->get_user_details($user); + else + $udetails = $user; + + if(!$udetails) + e(lang("usr_exist_err")); + else + { + $tpl = $cbemail->get_template('welcome_message_template'); + $more_var = array + ('{username}' => $udetails['username'], + '{email}' => $udetails['email'], + ); + if(!is_array($var)) + $var = array(); + $var = array_merge($more_var,$var); + $subj = $cbemail->replace($tpl['email_template_subject'],$var); + $msg = nl2br($cbemail->replace($tpl['email_template'],$var)); + + //Now Finally Sending Email + cbmail(array('to'=>$udetails['email'],'from'=>WELCOME_EMAIL,'subject'=>$subj,'content'=>$msg)); + + if($update_email_status) + $db->update(tbl($this->dbtbl['users']),array('welcome_email_sent'),array("yes")," userid='".$udetails['userid']."' "); + } + } + + + /** + * Function used to change user password + */ + function ChangeUserPassword($array) + { + global $db; + + $old_pass = $array['old_pass']; + $new_pass = $array['new_pass']; + $c_new_pass = $array['c_new_pass']; + + $uid = $array['userid']; + + if(!$this->get_user_with_pass($uid,pass_code($old_pass))) + e(lang('usr_pass_err')); + elseif(empty($new_pass)) + e(lang('usr_pass_err2')); + elseif($new_pass != $c_new_pass) + e(lang('usr_cpass_err1')); + else + { + $db->update(tbl($this->dbtbl['users']),array('password'),array(pass_code($array['new_pass']))," userid='".$uid."'"); + e(lang("usr_pass_email_msg"),"m"); + + } + + return $msg; + } + function change_user_pass($array){ return $this->ChangeUserPassword($array); } + function change_password($array){ return $this->ChangeUserPassword($array); } + + /** + * Function used to add contact + */ + function add_contact($uid,$fid) + { + global $cbemail,$db; + + $friend = $this->get_user_details($fid); + $sender = $this->get_user_details($uid); + + if(!$friend) + e(lang('usr_exist_err')); + elseif($this->is_requested_friend($uid,$fid)) + e(lang("you_already_sent_frend_request")); + elseif($this->is_requested_friend($uid,$fid,"in")) + { + $this->confirm_friend($fid,$uid); + e(lang("friend_added")); + }elseif($uid==$fid) + { + e(lang("friend_add_himself_error")); + }else + { + $db->insert(tbl($this->dbtbl['contacts']),array('userid','contact_userid','date_added','request_type'), + array($uid,$fid,now(),'out')); + $insert_id = $db->insert_id(); + + e(lang("friend_request_sent"),"m"); + + //Sending friendship request email + $tpl = $cbemail->get_template('friend_request_email'); + + + $more_var = array + ( + '{reciever}' => $friend['username'], + '{sender}' => $sender['username'], + '{sender_link}'=> $this->profile_link($sender), + '{request_link}'=> BASEURL.'/manage_contacts.php?mode=request&confirm='.$uid + ); + if(!is_array($var)) + $var = array(); + $var = array_merge($more_var,$var); + $subj = $cbemail->replace($tpl['email_template_subject'],$var); + $msg = nl2br($cbemail->replace($tpl['email_template'],$var)); + + //Now Finally Sending Email + cbmail(array('to'=>$friend['email'],'from'=>WEBSITE_EMAIL,'subject'=>$subj,'content'=>$msg)); + } + + } + + /** + * Function used to check weather users are confirmed friends or not + */ + function is_confirmed_friend($uid,$fid) + { + global $db; + $count = $db->count(tbl($this->dbtbl['contacts']),"contact_id", + " (userid='$uid' AND contact_userid='$fid') OR (userid='$fid' AND contact_userid='$uid') AND confirmed='yes'" ); + if($count[0]>0) + return true; + else + return false; + } + + /** + * function used to check weather users are firends or not + */ + function is_friend($uid,$fid) + { + global $db; + $count = $db->count(tbl($this->dbtbl['contacts']),"contact_id", + " (userid='$uid' AND contact_userid='$fid') OR (userid='$fid' AND contact_userid='$uid')" ); + if($count[0]>0) + return true; + else + return false; + } + + /** + * Function used to check weather user has already requested friendship or not + */ + function is_requested_friend($uid,$fid,$type='out',$confirm=NULL) + { + global $db; + + $query = ""; + if($confirm) + $query = " AND confirmed='$confirm' "; + + if($type=='out') + $count = $db->count(tbl($this->dbtbl['contacts']),"contact_id"," userid='$uid' AND contact_userid='$fid' $query" ); + + else + $count = $db->count(tbl($this->dbtbl['contacts']),"contact_id"," userid='$fid' AND contact_userid='$uid' $query" ); + + if($count[0]>0) + return true; + else + return false; + } + + /** + * Function used to confirm friend + */ + function confirm_friend($uid,$rid,$msg=TRUE) + { + global $cbemail,$db; + if(!$this->is_requested_friend($rid,$uid,'out','no')) + { + if($msg) + e(lang("friend_confirm_error")); + }else + { + addFeed(array('action' => 'add_friend','object_id' => $rid,'object'=>'friend','uid'=>$uid)); + addFeed(array('action' => 'add_friend','object_id' => $uid,'object'=>'friend','uid'=>$rid)); + + $db->insert(tbl($this->dbtbl['contacts']),array('userid','contact_userid','date_added','request_type','confirmed'), + array($uid,$rid,now(),'in','yes')); + $db->update(tbl($this->dbtbl['contacts']),array('confirmed'),array("yes")," userid='$rid' AND contact_userid='$uid' " ); + if($msg) + e(lang("friend_confirmed"),"m"); + //Sending friendship confirmation email + $tpl = $cbemail->get_template('friend_confirmation_email'); + + $friend = $this->get_user_details($rid); + $sender = $this->get_user_details($uid); + + $more_var = array + ( + '{reciever}' => $friend['username'], + '{sender}' => $sender['username'], + '{sender_link}'=> $this->profile_link($sender), + ); + if(!is_array($var)) + $var = array(); + $var = array_merge($more_var,$var); + $subj = $cbemail->replace($tpl['email_template_subject'],$var); + $msg = nl2br($cbemail->replace($tpl['email_template'],$var)); + + + //Now Finally Sending Email + cbmail(array('to'=>$friend['email'],'from'=>WEBSITE_EMAIL,'subject'=>$subj,'content'=>$msg)); + + + //Loggin Friendship + + $log_array = array + ( + 'success'=>'yes', + 'action_obj_id' => $friend['userid'], + 'details'=>"friend with ".$friend['username'] + ); + + insert_log('add_friend',$log_array); + + $log_array = array + ( + 'success'=>'yes', + 'username' => $friend['username'], + 'userid' => $friend['userid'], + 'userlevel' => $friend['level'], + 'useremail' => $friend['email'], + 'action_obj_id' => $insert_id, + 'details'=> "friend with ".userid() + ); + + //Login Upload + insert_log('add_friend',$log_array); + } + } + + /** + * Function used to confirm request + */ + function confirm_request($rid,$uid=NULL) + { + global $db; + + if(!$uid) + $uid = userid(); + + $result = $db->select(tbl($this->dbtbl['contacts']),"*"," userid='$rid' AND contact_userid='$uid' "); + $result = $result[0]; + + if($db->num_rows==0) + e(lang("friend_request_not_found")); + elseif($uid!=$result['contact_userid']) + e(lang("you_cant_confirm_this_request")); + elseif($result['confirmed']=='yes') + e(lang("friend_request_already_confirmed")); + else + { + $this->confirm_friend($uid,$result['userid']); + } + } + + + /** + * Function used to get user contacts + */ + function get_contacts($uid,$group=0,$confirmed=NULL,$count_only=false,$type=NULL) + { + global $db; + + $query = ""; + if($confirmed) + $query .= " AND ".tbl("contacts").".confirmed='$confirmed' "; + if($type) + $query .= " AND ".tbl("contacts").".request_type='$type' "; + if(!$count_only) + { + $result = $db->select(tbl("contacts,users"), + tbl("contacts.contact_userid,contacts.confirmed,contacts.request_type ,users.*"), + tbl("contacts.userid")."='$uid' AND ".tbl("users.userid")."=".tbl("contacts.contact_userid")." + $query AND ".tbl("contacts").".contact_group_id='$group' "); + + if($db->num_rows>0) + return $result; + else + return false; + }else{ + $count = $db->count(tbl("contacts"), + tbl("contacts.contact_userid"), + tbl("contacts.userid")."='$uid' + $query AND ".tbl("contacts").".contact_group_id='$group' "); + return $count; + } + } + + /** + * Function used to get pending contacts + */ + function get_pending_contacts($uid,$group=0,$count_only=false) + { + global $db; + + if(!$count_only) + { + $result = $db->select(tbl("contacts,users"), + tbl("contacts.userid,contacts.confirmed,contacts.request_type ,users.*"), + tbl("contacts.contact_userid")."='$uid' AND ".tbl("users.userid")."=".tbl("contacts.userid")." + AND ".tbl("contacts.confirmed")."='no' AND ".tbl("contacts").".contact_group_id='$group' "); + if($db->num_rows>0) + return $result; + else + return false; + }else + { + $count = $db->count(tbl("contacts"), + tbl("contacts.contact_userid"), + tbl("contacts.contact_userid")."='$uid' AND ".tbl("contacts.confirmed")."='no' AND ".tbl("contacts").".contact_group_id='$group' "); + //echo $db->db_query; + return $count; + } + } + + /** + * Function used to get pending contacts + */ + function get_requested_contacts($uid,$group=0) + { + global $db; + $result = $db->select(tbl($this->dbtbl['contacts']),"*"," contact_userid='$uid' AND confirmed='no' AND contact_group_id='$group' "); + if($db->num_rows>0) + return $result; + else + return false; + } + + + /** + * Function used to remove user from contact list + * @param fid {id of friend that user wants to remove} + * @param uid {id of user who is removing other from friendlist} + */ + function remove_contact($fid,$uid=NULL) + { + global $db; + if(!$uid) + $uid = userid(); + if(!$this->is_friend($fid,$uid)) + e(lang("user_no_in_contact_list")); + else + { + $db->Execute("DELETE from ".tbl($this->dbtbl['contacts'])." WHERE + (userid='$uid' AND contact_userid='$fid') OR (userid='$fid' AND contact_userid='$uid')" ); + e(lang("user_removed_from_contact_list"),"m"); + } + } + + /** + * Funcion used to increas user total_watched field + */ + function increment_watched_vides($userid) + { + global $db; + $db->update(tbl($this->dbtbl['users']),array('total_watched'),array('|f|total_watched+1')," userid='$userid'"); + } + + /** + * Old Function : GetNewMsgs + * This function is used to get user messages + * @param : user + * @param : sent/inbox + * @param : count (TRUE : FALSE) + */ + + function get_pm_msgs($user,$box='inbox',$count=FALSE){ + global $db,$eh,$LANG; + if(!$user) + $user = user_id(); + if(!user_id()) + { + $eh->e(lang('you_not_logged_in')); + }else{ + switch($box) + { + case 'inbox': + default: + $boxtype = 'inbox'; + break; + + case 'sent': + case 'outbox': + $boxtype = 'outbox'; + break; + } + + if($count) + $status_query = " AND status = '0' "; + + $results = $db->select(tbl("messages"), + " message_id ", + "(".$boxtype."_user = '$user' OR ".$boxtype."_user_id = '$user') $status_query"); + + + if($db->num_rows > 0) + { + if($count) + return $db->num_rows; + else + return $results; + } + else + { + return false; + } + } + } + function GetNewMsgs($user) + { + $msgs = $this->get_pm_msgs($user,'inbox',TRUE); + if($msgs) + return $msgs; + else + return 0; + } + + + /** + * Function used to subscribe user + */ + function subscribe_user($to,$user=NULL) + { + if(!$user) + $user = userid(); + global $db; + + $to_user = $this->get_user_details($to); + + if(!$this->user_exists($to)) + e(lang('usr_exist_err')); + elseif(!$user) + e(sprintf(lang('please_login_subscribe'),$to_user['username'])); + elseif($this->is_subscribed($to,$user)) + e(sprintf(lang("usr_sub_err"),$to_user['username'])); + elseif($to_user['userid'] == $user) + e(lang("you_cant_sub_yourself")); + else + { + $db->insert(tbl($this->dbtbl['subtbl']),array('userid','subscribed_to','date_added'), + array($user,$to,NOW())); + $db->update(tbl($this->dbtbl['users']),array('subscribers'), + array($this->get_user_subscribers($to,true))," userid='$to' "); + $db->update(tbl($this->dbtbl['users']),array('total_subscriptions'), + array($this->get_user_subscriptions($user,'count'))," userid='$user' "); + //Loggin Comment + $log_array = array + ( + 'success'=>'yes', + 'details'=> "subsribed to ".$to_user['username'], + 'action_obj_id' => $to_user['userid'], + 'action_done_id' => $db->insert_id(), + ); + insert_log('subscribe',$log_array); + + e(sprintf(lang('usr_sub_msg'),$to_user['username']),'m'); + } + } + function SubscribeUser($sub_user,$sub_to){return $this->subscribe_user($sub_to,$sub_user);} + + /** + * Function used to check weather user is already subscribed or not + */ + function is_subscribed($to,$user=NULL) + { + if(!$user) + $user = userid(); + global $db; + + if(!$user) + return false; + $result = $db->select(tbl($this->dbtbl['subtbl']),"*"," subscribed_to='$to' AND userid='$user'"); + if($db->num_rows>0) + return $result; + else + return false; + } + + /** + * Function used to remove user subscription + */ + function remove_subscription($subid,$uid=NULL) + { + global $db; + if(!$uid) + $uid = userid(); + if($this->is_subscribed($subid,$uid)) + { + $db->execute("DELETE FROM ".tbl($this->dbtbl['subtbl'])." WHERE userid='$uid' AND subscribed_to='$subid'"); + e(lang("class_unsub_msg"),"m"); + + $db->update(tbl($this->dbtbl['users']),array('subscribers'), + array($this->get_user_subscribers($subid,true))," userid='$subid' "); + $db->update(tbl($this->dbtbl['users']),array('total_subscriptions'), + array($this->get_user_subscriptions($uid,'count'))," userid='$uid' "); + + + return true; + }else + e(lang("you_not_subscribed")); + + return false; + }function unsubscribe_user($subid,$uid=NULL){ return $this->remove_subscription($subid,$uid); } + + + /** + * Function used to get user subscibers + * @param userid + */ + function get_user_subscribers($id,$count=false) + { + global $db; + if(!$count) + { + $result = $db->select(tbl('subscriptions'),"*", + " subscribed_to='$id' "); + if($db->num_rows>0) + return $result; + else + return false; + }else + { + return $db->count(tbl($this->dbtbl['subtbl']),"subscription_id"," subscribed_to='$id' "); + } + } + + /** + * function used to get user subscribers with details + */ + function get_user_subscribers_detail($id,$limit=NULL) + { + global $db; + $result = $db->select(tbl("users,".$this->dbtbl['subtbl']),"*"," ".tbl("subscriptions.subscribed_to")." = '$id' AND ".tbl("subscriptions.userid")."=".tbl("users.userid"),$limit); + if($db->num_rows>0) + return $result; + else + return false; + } + + /** + * Function used to get user subscriptions + */ + function get_user_subscriptions($id,$limit=NULL) + { + global $db; + if($limit!='count') + { + $result = $db->select(tbl("users,".$this->dbtbl['subtbl']),"*"," ".tbl("subscriptions.userid")." = '$id' AND ".tbl("subscriptions.subscribed_to")."=".tbl("users.userid"),$limit); + + if($db->num_rows>0) + return $result; + else + return false; + }else + { + $result = $db->count(tbl($this->dbtbl['subtbl']),"subscription_id"," userid = '$id'"); + return $result; + } + } + + + + + /** + * Function used to reset user password + * it has two steps + * 1 to send confirmation + * 2 to reset the password + */ + + function reset_password($step,$input,$code=NULL) + { + global $cbemail,$db; + switch($step) + { + case 1: + { + $udetails = $this->get_user_details($input); + if(!$udetails) + e(lang('usr_exist_err')); + //verifying captcha... + elseif(!verify_captcha()) + e(lang('usr_ccode_err')); + else + { + //Sending confirmation email + $tpl = $cbemail->get_template('password_reset_request'); + $avcode = $udetails['avcode']; + if(!$udetails['avcode']) + { + $avcode = RandomString(10); + $db->update(tbl($this->dbtbl['users']),array('avcode'),array($avcode)," userid='".$udetails['userid']."'"); + } + + $more_var = array + ('{username}' => $udetails['username'], + '{email}' => $udetails['email'], + '{avcode}' => $avcode, + '{userid}' => $udetails['userid'], + ); + if(!is_array($var)) + $var = array(); + $var = array_merge($more_var,$var); + $subj = $cbemail->replace($tpl['email_template_subject'],$var); + $msg = nl2br($cbemail->replace($tpl['email_template'],$var)); + + //Now Finally Sending Email + cbmail(array('to'=>$udetails['email'],'from'=>WEBSITE_EMAIL,'subject'=>$subj,'content'=>$msg)); + + e(lang('usr_rpass_email_msg'),"m"); + return true; + } + } + break; + case 2: + { + $udetails = $this->get_user_details($input); + if(!$udetails) + e(lang('usr_exist_err')); + //verifying captcha... + elseif($udetails['avcode'] !=$code) + e(lang('usr_ccode_err')); + else + { + $newpass = RandomString(6); + $pass = pass_code($newpass); + $avcode = RandomString(10); + $db->update(tbl($this->dbtbl['users']),array('password','avcode'),array($pass,$avcode)," userid='".$udetails['userid']."'"); + //sending new password email... + //Sending confirmation email + $tpl = $cbemail->get_template('password_reset_details'); + $more_var = array + ('{username}' => $udetails['username'], + '{email}' => $udetails['email'], + '{avcode}' => $udetails['avcode'], + '{userid}' => $udetails['userid'], + '{password}' => $newpass, + ); + if(!is_array($var)) + $var = array(); + $var = array_merge($more_var,$var); + $subj = $cbemail->replace($tpl['email_template_subject'],$var); + $msg = nl2br($cbemail->replace($tpl['email_template'],$var)); + + //Now Finally Sending Email + cbmail(array('to'=>$udetails['email'],'from'=>WEBSITE_EMAIL,'subject'=>$subj,'content'=>$msg)); + e(lang('usr_pass_email_msg'),'m'); + return true; + } + } + break; + } + } + + /** + * Function used to recover username + */ + function recover_username($email) + { + global $cbemail; + $udetails = $this->get_user_details($email); + if(!$udetails) + e(lang('no_user_associated_with_email')); + elseif(!verify_captcha()) + e(lang('usr_ccode_err')); + else + { + $tpl = $cbemail->get_template('forgot_username_request'); + $more_var = array + ( + '{username}' => $udetails['username'], + ); + if(!is_array($var)) + $var = array(); + $var = array_merge($more_var,$var); + $subj = $cbemail->replace($tpl['email_template_subject'],$var); + $msg = nl2br($cbemail->replace($tpl['email_template'],$var)); + + //Now Finally Sending Email + cbmail(array('to'=>$udetails['email'],'from'=>SUPPORT_EMAIL,'subject'=>$subj,'content'=>$msg)); + e(lang("usr_uname_email_msg"),'m'); + } + return $msg; + + + } + + //FUNCTION USED TO UPDATE LAST ACTIVE FOR OF USER + // @ Param : username + function UpdateLastActive($username) + { + global $db; + + $sql = "UPDATE ".tbl("users")." SET last_active = '".NOW()."' WHERE username='".$username."' OR userid='".$username."' "; + $db->Execute($sql); + } + + + /** + * FUNCTION USED TO GE USER THUMBNAIL + * @param : thumb file + * @param : size (NULL,small) + */ + function getUserThumb($udetails,$size='',$uid=NULL,$just_file=false) + { + $remote = false; + if(empty($udetails['userid']) && $uid) + $udetails = $this->get_user_details($uid); + //$thumbnail = $udetails['avatar'] ? $udetails['avatar'] : NO_AVATAR; + $thumbnail = $udetails['avatar']; + $thumb_file = USER_THUMBS_DIR.'/'.$thumbnail; + + + if(file_exists($thumb_file) && $thumbnail) + $thumb_file = USER_THUMBS_URL.'/'.$thumbnail; + elseif(!empty($udetails['avatar_url'])) + { + $thumb = $udetails['avatar_url']; + $remote = true; + }else + { + if(!USE_GAVATAR) + $thumb_file = $this->get_default_thumb(); + else + { + switch($size) + { + case "small": + { + $thesize = AVATAR_SMALL_SIZE; + $default = $this->get_default_thumb('small'); + + } + break; + default: + { + $thesize = AVATAR_SIZE; + $default = $this->get_default_thumb(); + } + } + + $email = $udetails['email']; + $email = $email ? $email : $udetails['anonym_email']; + $gravatar = new Gravatar($email, $default); + $gravatar->size = $thesize; + $gravatar->rating = "G"; + $gravatar->border = "FF0000"; + + $thumb = $gravatar->getSrc(); + //echo $gravatar->toHTML(); + } + } + + $ext = GetExt($thumb_file); + $file = getName($thumb_file); + + if(!$remote) + { + if(!empty($size) && !$thumb) + $thumb = USER_THUMBS_URL.'/'.$file.'-'.$size.'.'.$ext; + elseif(!$thumb) + $thumb = USER_THUMBS_URL.'/'.$file.'.'.$ext; + } + + if($just_file) + return $file.'.'.$ext; + + return $thumb; + } + function avatar($udetails,$size='',$uid=NULL) + { + return $this->getUserThumb($udetails,$size,$uid); + } + + /** + * Function used to get default user thumb + */ + function get_default_thumb($size=NULL) + { + if($size=="small" && file_exists(TEMPLATEDIR.'/images/thumbs/no_avatar-small.png')) + { + return TEMPLATEURL.'/images/thumbs/no_avatar-small.png'; + }elseif(file_exists(TEMPLATEDIR.'/images/thumbs/no_avatar.png') && !$size) + { + return TEMPLATEURL.'/images/thumbs/no_avatar.png'; + }else + { + if($size=='small') + return USER_THUMBS_URL.'/'.getName(NO_AVATAR).'-small.'.getExt(NO_AVATAR); + else + return USER_THUMBS_URL.'/'.NO_AVATAR; + } + } + + /** + * Function used to get user Background + * @param : bg file + */ + function getUserBg($udetails,$check=false) + { + $remote = false; + if(empty($udetails['userid'])) + $udetails = $this->get_user_details($uid); + //$thumbnail = $udetails['avatar'] ? $udetails['avatar'] : 'no_avatar.jpg'; + $file = $udetails['background']; + $bgfile = USER_BG_DIR.'/'.$file; + if(file_exists($bgfile) && $file) + $thumb_file = USER_BG_URL.'/'.$file; + elseif(!empty($udetails['background_url']) && BACKGROUND_URL=='yes') + { + $thumb_file = $udetails['background_url']; + $remote = true; + }elseif(!empty($udetails['background_color']) && BACKGROUND_COLOR =='yes' && $check) + { + return true; + }else + return false; + + return $thumb_file; + } + + + + /** + * Function used to get user subscriber's list + * @param VARCHAR//INT username or userid , both works fine + */ + function get_user_subscriber($username) + { + global $db; + $results = $db->Execute("SELECT * FROM ".tbl("subscriptions")." WHERE subsctibe_to='$username'"); + if($results->recordcount() > 0) + return $results->getrows(); + else + return false; + } + + + + /** + * Function used to get user field + * @ param INT userid + * @ param FIELD name + */ + function get_user_field($uid,$field) + { + global $db; + + if(is_numeric($uid)) + $results = $db->select(tbl('users'),$field,"userid='$uid'"); + else + $results = $db->select(tbl('users'),$field,"username='$uid'"); + + if($db->num_rows>0) + { + return $results[0]; + }else{ + return false; + } + }function get_user_fields($uid,$field){return $this->get_user_field($uid,$field);} + + + /** + * This function will return + * user field without array + */ + function get_user_field_only($uid,$field) + { + $fields = $this->get_user_field($uid,$field); + return $fields[$field]; + } + + /** + * Function used to get user level and its details + * @param INT userid + */ + function get_user_level($uid,$is_level=false) + { + global $db; + + if($is_level) + { + $level = $uid; + } + else + { + $level = $this->udetails['level']; + } + + + $result = $db->select(tbl('user_levels,user_levels_permissions'),'*', + tbl("user_levels_permissions.user_level_id")."='".$level."' + AND ".tbl("user_levels_permissions.user_level_id")." = ".tbl("user_levels.user_level_id")); + + + /* + pr($result); + $results = $db->select(tbl('user_levels'),'*'," user_level_id='".$level['level']."'"); + if($db->num_rows == 0) + //incase user level is not valid, it will consider it as registered user + $u_level['user_level_id'] = 3; + else + $u_level = $results[0]; + + //Now Getting Access Details + $access_results = $db->select("user_levels_permissions","*", + "user_level_id = '".$u_level['user_level_id']."'"); + $a_results = $access_results[0];*/ + + //Now Merging the two arrays + $user_level = $result[0]; + //pr($user_level); + return $user_level; + } + + + /** + * Function used to get all levels + * @param : filter + */ + function get_levels($filter=NULL) + { + global $db; + $results = $db->select(tbl("user_levels"),"*",NULL,NULL," user_level_id ASC" ); + if($db->num_rows > 0) + { + return $results; + }else{ + return false; + } + } + + + /** + * Function used to get level details + * @param : level_id INT + */ + function get_level_details($lid) + { + global $db; + $results = $db->select(tbl("user_levels"),"*"," user_level_id='$lid' "); + if($db->num_rows > 0 ) + { + return $results[0]; + }else{ + e(lang("cant_find_level")); + return false; + } + } + + /** + * Function used to get users of particular level + * @param : level_id + * @param : count BOOLEAN (if TRUE it will return NUMBERS) + */ + function get_level_users($id,$count=FALSE,$fields="level") + { + global $db; + if($fields == "all") + $fields = "*"; + + $results = $db->select(tbl("users"),$fields," level='$id'"); + if($db->num_rows>0) + { + if($count) + return $db->num_rows; + else + return $results; + }else{ + return 0; + } + } + + + /** + * Function used to add user level + */ + function add_user_level($array) + { + global $db; + if(!is_array($array)) + $array = $_POST; + $level_name = mysql_clean($array['level_name']); + if(empty($level_name)) + e(lang("please_enter_level_name")); + else + { + $db->insert(tbl("user_levels"),array('user_level_name'),array($level_name)); + $iid = $db->insert_id(); + + $fields_array[] = 'user_level_id'; + $value_array[] = $iid; + foreach($this->get_access_type_list() as $access => $name) + { + $fields_array[] = $access; + $value_array[] = $array[$access] ? $array[$access] : 'no'; + } + $db->insert(tbl("user_levels_permissions"),$fields_array,$value_array); + return true; + } + } + + /** + * Function usewd to get level permissions + */ + function get_level_permissions($id) + { + global $db; + $results = $db->select(tbl("user_levels_permissions"),"*"," user_level_id = '$id'"); + if($db->num_rows>0) + return $results[0]; + else + return false; + } + + /** + * Function used to get custom permissions + */ + function get_access_type_list() + { + if(!$this->access_type_list) + { + $perms = $this->get_permissions(); + foreach($perms as $perm) + { + $this->add_access_type($perm['permission_code'],$perm['permission_name']); + } + } + return $this->access_type_list; + } + + /** + * Function used to add new custom permission + */ + function add_access_type($access,$name) + { + if(!empty($access) && !empty($name)) + $this->access_type_list[$access] = $name; + } + + /** + * Function get access + */ + function get_access($access) + { + return $this->access_type_list[$access]; + } + + /** + * Function used to update user level + * @param INT level_id + * @param ARRAY perm_level + */ + function update_user_level($id,$array) + { + global $db; + if(!is_array($array)) + $array = $_POST; + + //First Checking Level + $level = $this->get_level_details($id); + if($level) + { + foreach($this->get_access_type_list() as $access => $name) + { + $fields_array[] = $access; + $value_array[] = $array[$access]; + } + + //Checking level Name + if(!empty($array['level_name'])) + { + $level_name = mysql_clean($array['level_name']); + //Upadting Now + $db->update(tbl("user_levels"),array("user_level_name"),array($level_name)," user_level_id = '$id'"); + } + + if(isset($_POST['plugin_perm'])) + { + $fields_array[] = 'plugins_perms'; + $value_array[] = '|no_mc|'.json_encode($_POST['plugin_perm']); + } + + //Updating Permissions + $db->update(tbl("user_levels_permissions"),$fields_array,$value_array," user_level_id = '$id'"); + + e(lang("level_updated"),'m'); + return true; + }else{ + return false; + } + } + + + /** + * Function used to delete user levels + * @param INT level_id + */ + function delete_user_level($id) + { + global $db; + $level_details = $this->get_level_details($id); + $de_level = $this->get_level_details(3); + if($level_details) + { + //CHeck if leve is deleteable or not + if($level_details['user_level_is_default']=='no') + { + $db->delete(tbl("user_levels"),array("user_level_id"),array($id)); + $db->delete(tbl("user_levels_permissions"),array("user_level_id"),array($id)); + e(sprintf(lang("level_del_sucess"),$de_level['user_level_name'])); + + $db->update(tbl("users"),array("level"),array(3)," level='$id'"); + return true; + + }else{ + e(lang("level_not_deleteable")); + return false; + } + } + } + + + /** + * Function used to count total video comments + */ + function count_profile_comments($id) + { + global $db; + $total_comments = $db->count(tbl('comments'),"comment_id","type='c' AND type_id='$id'"); + return $total_comments; + } + function count_channel_comments($id){ return $this->count_profile_comments($id); } + + /** + * Function used to count total comments made by users + */ + function count_comments_by_user($uid) + { + global $db; + $total_comments = $db->count(tbl('comments'),"comment_id","userid='$uid'"); + return $total_comments; + } + + /** + * Function used to update user comments + */ + function update_comments_by_user($uid) + { + global $db; + $total_comments = $this->count_comments_by_user($id); + $db->update(tbl("users"),array("total_comments","last_commented"),array($total_comments,now())," userid='$id'"); + } + + /** + * Function used to update user comments count + */ + function update_comments_count($id) + { + global $db; + $total_comments = $this->count_profile_comments($id); + $db->update(tbl("users"),array("comments_count","last_commented"),array($total_comments,now())," userid='$id'"); + + } + /** + * Function used to add comment on users profile + */ + function add_comment($comment,$obj_id,$reply_to=NULL,$type='c') + { + global $myquery; + if(!$this->user_exists($obj_id)) + e(lang("usr_exist_err")); + else + { + $add_comment = $myquery->add_comment($comment,$obj_id,$reply_to,$type,$obj_id); + } + if($add_comment) + { + //Loggin Comment + $log_array = array + ( + 'success'=>'yes', + 'details'=> "comment on a profile", + 'action_obj_id' => $obj_id, + 'action_done_id' => $add_comment, + ); + insert_log('profile_comment',$log_array); + + //Updating Number of comments of video + $this->update_comments_count($obj_id); + } + return $add_comment; + } + + /** + * Function used to remove video comment + */ + function delete_comment($cid,$is_reply=FALSE) + { + global $myquery,$db; + $remove_comment = $myquery->delete_comment($cid,'c',$is_reply); + if($remove_comment) + { + //Updating Number of comments of video + $this->update_comments_count($obj_id); + } + return $remove_comment; + } + + + + /** + * Function used to get number of videos uploaded by user + * @param INT userid + * @param Conditions + */ + function get_user_vids($uid,$cond=NULL,$count_only=false) + { + global $db; + if($cond!=NULL) + $cond = " AND $cond "; + + $results = $db->select(tbl("video"),"*"," userid = '$uid' $cond"); + if($db->num_rows > 0) + { + if($count_only) + return $db->num_rows; + else + return $results[0]; + }else{ + return false; + } + } + + + /** + * Function used to get logged in username + */ + function get_logged_username() + { + return $this->get_user_field_only(user_id(),'username'); + } + + /** + * FUnction used to get username from userid + */ + function get_username($uid) + { + return $this->get_user_field_only($uid,'username'); + } + + /** + * Function used to create profile link + */ + function profile_link($udetails) + { + if(!is_array($udetails) && is_numeric($udetails)) + $udetails = $this->get_user_details($udetails); + if(SEO!="yes") + return BASEURL.'/view_channel.php?user='.$udetails['username']; + else + return BASEURL.'/user/'.$udetails['username']; + } + function get_user_link($u) + { + return $this->profile_link($u); + } + + + /** + * Function used to get permission types + */ + function get_level_types() + { + global $db; + return $db->select(tbl($this->dbtbl['user_permission_type']),"*"); + } + + /** + * Function used to check weather level type exists or not + */ + function level_type_exists($id) + { + global $db; + $result = $db->select(tbl($this->dbtbl['user_permission_type']),"*"," user_permission_type_id='".$id."' OR user_permission_type_name='$id'"); + if($db->num_rows>0) + return $result[0]; + else + return false; + } + + /** + * Function used to add new permission + */ + function add_new_permission($array) + { + global $db; + if(empty($array['code'])) + e(lang("perm_code_empty")); + elseif(empty($array['name'])) + e(lang("perm_name_empty")); + elseif($this->permission_exists($array['code'])) + e(lang("perm_already_exist")); + elseif(!$this->level_type_exists($array['type'])) + e(lang("perm_type_not_valid")); + else + { + $type = $this->level_type_exists($array['type']); + $typeid = $type['user_permission_type_id']; + $code = mysql_clean($array['code']); + $name = mysql_clean($array['name']); + $desc = mysql_clean($array['desc']); + $default = mysql_clean($array['default']); + $default = $default ? $default : "yes"; + $db->insert(tbl($this->dbtbl['user_permissions']), + array('permission_type','permission_code','permission_name','permission_desc','permission_default'), + array($typeid,$code,$name,$desc,$default)); + $db->execute("ALTER TABLE ".tbl($this->dbtbl['user_level_permission'])." ADD `".$code."` ENUM( 'yes', 'no' ) NOT NULL DEFAULT '".$default."'"); + e(lang("perm_added"),"m"); + } + } + + /** + * Function used to check permission exists or not + * @Param permission code + */ + function permission_exists($code) + { + global $db; + $result = $db->select(tbl($this->dbtbl['user_permissions']),"*"," permission_code='".$code."' OR permission_id='".$code."'"); + if($db->num_rows>0) + return $result[0]; + else + return false; + } + + /** + * Function used to get permissions + */ + function get_permissions($type=NULL) + { + global $db; + if($type) + $cond = " permission_type ='$type'"; + $result = $db->select(tbl($this->dbtbl['user_permissions']),"*",$cond); + if($db->num_rows>0) + { + return $result; + }else + { + return false; + } + } + + /** + * Function used to remove Permission + */ + function remove_permission($id) + { + global $db; + $permission = $this->permission_exists($id); + if($permission) + { + $field = $permission['permission_code']; + $db->delete(tbl($this->dbtbl['user_permissions']),array("permission_id"),array($id)); + $db->execute("ALTER TABLE `".tbl($this->dbtbl['user_level_permission'])."` DROP `".$field."` "); + e(lang("perm_deleted"),"m"); + }else + e(lang("perm_doesnt_exist")); + } + + + /** + * Function used to check weather current user has permission + * to view page or not + * it will also check weather current page requires login + * if login is required, user will be redirected to signup page + */ + function perm_check($access='',$check_login=FALSE,$control_page=true) + { + global $Cbucket; + /*if($check_login) + { + return $this->login_check($access); + }else + {*/ + $access_details = $this->permission; + //pr($access_details); + if(is_numeric($access)) + { + if($access_details['level_id'] == $access) + { + return true; + }else{ + if(!$check_only) + e(lang('insufficient_privileges')); + + if($control_page) + $Cbucket->show_page(false); + return false; + } + }else + { + + if($access_details[$access] == 'yes') + { + return true; + } + else + { + + if(!$check_login) + e(lang('insufficient_privileges')); + else + { if(userid()) + e(lang('insufficient_privileges')); + else + e(sprintf(lang('insufficient_privileges_loggin'),cblink(array('name'=>'signup')),cblink(array('name'=>'signup')))); + } + + if($control_page) + $Cbucket->show_page(false); + return false; + } + } + //} + } + + + /** + * Function used to get user profile details + */ + function get_user_profile($uid) + { + global $db; + $result = $db->select(tbl($this->dbtbl['user_profile']),"*"," userid='$uid'"); + if($db->num_rows>0) + { + return $result[0]; + }else + return false; + } + + + + + + /** + * User Profile Fields + */ + function load_profile_fields($default) + { + if(!$default) + $default = $_POST; + + $profile_fields = $this->load_personal_details($default); + $other_details = $this->load_location_fields($default); + $more_details = $this->load_education_interests($default); + $channel = $this->load_channel_settings($default); + $privacy_field = $this->load_privacy_field($default); + return array_merge($profile_fields,$other_details,$more_details,$channel,$privacy_field); + } + + + + + + /** + * Function used to update use details + */ + function update_user($array) + { + global $LANG,$db,$signup,$Upload; + if($array==NULL) + $array = $_POST; + + if(is_array($_FILES)) + $array = array_merge($array,$_FILES); + + $userfields = $this->load_profile_fields($array); + //$signup_fields = $this->load_signup_fields($array); + $custom_signup_fields = $this->load_custom_signup_fields($array); + + //Adding Custom Form Fields + if(count($this->custom_profile_fields)>0) + $userfields = array_merge($userfields,$this->custom_profile_fields); + + //Adding custom fields from group + if(count($this->custom_profile_fields_groups)>0) + { + $custom_fields_from_group_fields = array(); + $custom_fields_from_group = $this->custom_profile_fields_groups; + foreach($custom_fields_from_group as $cffg) + { + $custom_fields_from_group_fields = array_merge($custom_fields_from_group_fields,$cffg['fields']); + } + + $userfields = array_merge($userfields,$custom_fields_from_group_fields); + } + + + validate_cb_form($custom_signup_fields,$array); + + validate_cb_form($userfields,$array); + // pr(); + foreach($userfields as $field) + { + $name = formObj::rmBrackets($field['name']); + $val = $array[$name]; + + if($field['use_func_val']) + $val = $field['validate_function']($val); + + + if(!empty($field['db_field'])) + $query_field[] = $field['db_field']; + + if(is_array($val)) + { + $new_val = ''; + foreach($val as $v) + { + $new_val .= "#".$v."# "; + } + $val = $new_val; + } + if(!$field['clean_func'] || (!function_exists($field['clean_func']) && !is_array($field['clean_func']))) + $val = mysql_clean($val); + else + $val = apply_func($field['clean_func'],sql_free('|no_mc|'.$val)); + + + if(!empty($field['db_field'])) + $query_val[] = $val; + } + + //Category + if($cat_field) + { + $field = $cat_field; + $name = formObj::rmBrackets($field['name']); + $val = $array[$name]; + + if($field['use_func_val']) + $val = $field['validate_function']($val); + + + if(!empty($field['db_field'])) + $uquery_field[] = $field['db_field']; + + if(is_array($val)) + { + $new_val = ''; + foreach($val as $v) + { + $new_val .= "#".$v."# "; + } + $val = $new_val; + } + if(!$field['clean_func'] || (!function_exists($field['clean_func']) && !is_array($field['clean_func']))) + $val = mysql_clean($val); + else + $val = apply_func($field['clean_func'],sql_free('|no_mc|'.$val)); + + if(!empty($field['db_field'])) + $uquery_val[] = $val; + } + + + + //updating user detail + if(has_access('admin_access',TRUE) && isset($array['admin_manager'])) + { + //Checking Username + if(empty($array['username'])) + e(lang('usr_uname_err')); + elseif($array['dusername'] != $array['username'] && $this->username_exists($array['username'])) + e(lang('usr_uname_err2')); + elseif(!username_check($array['username'])) + e(lang('usr_uname_err3')); + else + $username = $array['username']; + + //Checking Email + if(empty($array['email'])) + e(lang('usr_email_err1')); + elseif(!is_valid_syntax('email',$array['email'])) + e(lang('usr_email_err2')); + elseif(email_exists($array['email']) && $array['email'] != $array['demail']) + e(lang('usr_email_err3')); + else + $email = $array['email']; + + $uquery_field[] = 'username'; + $uquery_val[] = $username; + + $uquery_field[] = 'email'; + $uquery_val[] = $email; + + //Changning Password + if(!empty($array['pass'])) + { + if($array['pass']!=$array['cpass']) + e(lang("pass_mismatched")); + else + $pass = pass_code($array['pass']); + $uquery_field[] = 'password'; + $uquery_val[] = $pass; + } + + //Changing User Level + $uquery_field[] = 'level'; + $uquery_val[] = $array['level']; + + //Checking for user stats + $uquery_field[] = 'profile_hits'; + $uquery_val[] = $array['profile_hits']; + $uquery_field[] = 'total_watched'; + $uquery_val[] = $array['total_watched']; + $uquery_field[] = 'total_videos'; + $uquery_val[] = $array['total_videos']; + $uquery_field[] = 'total_comments'; + $uquery_val[] = $array['total_comments']; + $uquery_field[] = 'subscribers'; + $uquery_val[] = $array['subscribers']; + $uquery_field[] = 'comments_count'; + $uquery_val[] = $array['comments_count']; + $query_field[] = 'rating'; + + $rating = $array['rating']; + if($rating<1 || $rating>10) + $rating = 1; + $query_val[] = $rating ; + $query_field[] = 'rated_by'; + $query_val[] = $array['rated_by']; + + //Changing JOined Date + if(isset($array['doj'])) + { + $uquery_field[] = 'doj'; + $uquery_val[] = $array['doj']; + } + + } + + //Changing Gender + if($array['sex']) + { + $uquery_field[] = 'sex'; + $uquery_val[] = mysql_clean($array['sex']); + } + + //Changing Country + if($array['country']) + { + $uquery_field[] = 'country'; + $uquery_val[] = mysql_clean($array['country']); + } + + //Changing Date of birth + if(isset($array['dob'])) + { + $uquery_field[] = 'dob'; + $uquery_val[] = $array['dob']; + } + + //Changing category + if(isset($array['category'])) + { + $uquery_field[] = 'category'; + $uquery_val[] = $array['category']; + } + + + //Updating User Avatar + if($array['avatar_url']) + { + $uquery_field[] = 'avatar_url'; + $uquery_val[] = $array['avatar_url']; + } + if($array['remove_avatar_url']=='yes') + { + $uquery_field[] = 'avatar_url'; + $uquery_val[] = ''; + } + + //Deleting User Avatar + if($array['delete_avatar']=='yes') + { + $file = USER_THUMBS_DIR.'/'.$array['avatar_file_name']; + if(file_exists($file) && $array['avatar_file_name'] !='') + unlink($file); + } + + //Deleting User Bg + if($array['delete_bg']=='yes') + { + + $file = USER_BG_DIR.'/'.$array['bg_file_name']; + if(file_exists($file) && $array['bg_file_name']) + unlink($file); + } + + + if(isset($_FILES['avatar_file']['name'])) + { + $file = $Upload->upload_user_file('a',$_FILES['avatar_file'],$array['userid']); + if($file) + { + $uquery_field[] = 'avatar'; + $uquery_val[] = $file; + } + } + + + //Updating User Background + if($array['background_url']) + { + $uquery_field[] = 'background_url'; + $uquery_val[] = $array['background_url']; + } + + if($array['background_color']) + { + $uquery_field[] = 'background_color'; + $uquery_val[] = $array['background_color']; + } + + if($array['background_repeat']) + { + $uquery_field[] = 'background_repeat'; + $uquery_val[] = $array['background_repeat']; + } + + + if(isset($_FILES['background_file']['name'])) + { + $file = $Upload->upload_user_file('b',$_FILES['background_file'],$array['userid']); + if($file) + { + $uquery_field[] = 'background'; + $uquery_val[] = $file; + } + } + + + //Adding Custom Field + if(is_array($custom_signup_fields)) + { + foreach($custom_signup_fields as $field) + { + $name = formObj::rmBrackets($field['name']); + $val = $array[$name]; + + if($field['use_func_val']) + $val = $field['validate_function']($val); + + + if(!empty($field['db_field'])) + $uquery_field[] = $field['db_field']; + + if(is_array($val)) + { + $new_val = ''; + foreach($val as $v) + { + $new_val .= "#".$v."# "; + } + $val = $new_val; + } + if(!$field['clean_func'] || (!function_exists($field['clean_func']) && !is_array($field['clean_func']))) + $val = mysql_clean($val); + else + $val = apply_func($field['clean_func'],sql_free('|no_mc|'.$val)); + + + if(!empty($field['db_field'])) + $uquery_val[] = $val; + } + } + + if(!error() && is_array($uquery_field)) + { + $db->update(tbl($this->dbtbl['users']),$uquery_field,$uquery_val," userid='".mysql_clean($array['userid'])."'"); + e(lang("usr_upd_succ_msg"),'m'); + } + + + + //updating user profile + if(!error()) + { + $log_array = array + ( + 'success'=>'yes', + 'details'=> "updated profile" + ); + //Login Upload + insert_log('profile_update',$log_array); + + $db->update(tbl($this->dbtbl['user_profile']),$query_field,$query_val," userid='".mysql_clean($array['userid'])."'"); + e(lang("usr_pof_upd_msg"),'m'); + } + } + + + /** + * Function used to update user avatar and background only + */ + function update_user_avatar_bg($array) + { + global $db,$signup,$Upload; + //Updating User Avatar + $uquery_field[] = 'avatar_url'; + $uquery_val[] = mysql_clean($array['avatar_url']); + + + //Deleting User Avatar + if($array['delete_avatar']=='yes') + { + $file = USER_THUMBS_DIR.'/'.$array['avatar_file_name']; + if(file_exists($file) && $array['avatar_file_name'] !='') + unlink($file); + } + + //Deleting User Bg + if($array['delete_bg']=='yes') + { + $file = USER_BG_DIR.'/'.$array['bg_file_name']; + if(file_exists($file) && $array['bg_file_name'] !='') + unlink($file); + } + + + if(isset($_FILES['avatar_file']['name'])) + { + $file = $Upload->upload_user_file('a',$_FILES['avatar_file'],$array['userid']); + if($file) + { + $uquery_field[] = 'avatar'; + $uquery_val[] = $file; + } + } + + + //Updating User Background + $uquery_field[] = 'background_url'; + $uquery_val[] = mysql_clean($array['background_url']); + + $uquery_field[] = 'background_color'; + $uquery_val[] = mysql_clean($array['background_color']); + + if($array['background_repeat']) + { + $uquery_field[] = 'background_repeat'; + $uquery_val[] = mysql_clean($array['background_repeat']); + } + + //Background ATtachement + $uquery_field[] = 'background_attachement'; + $uquery_val[] = mysql_clean($array['background_attachement']); + + + if(isset($_FILES['background_file']['name'])) + { + + $file = $Upload->upload_user_file('b',$_FILES['background_file'],$array['userid']); + if($file) + { + $uquery_field[] = 'background'; + $uquery_val[] = mysql_clean($file); + } + } + + $log_array = array + ( + 'success'=>'yes', + 'details'=> "updated profile" + ); + + //Login Upload + insert_log('profile_update',$log_array); + + $db->update(tbl($this->dbtbl['users']),$uquery_field,$uquery_val," userid='".mysql_clean($array['userid'])."'"); + e(lang("usr_avatar_bg_update"),'m'); + + } + + + /** + * Function used to check weather username exists or not + */ + function username_exists($i) + { + global $db; + //echo test; + return $db->count(tbl($this->dbtbl['users']),"username"," username='$i'"); + } + + /** + * function used to check weather email exists or not + */ + function email_exists($i) + { + global $db; + $db->select(tbl($this->dbtbl['users']),"email"," email='$i'"); + if($db->num_rows>0) + return true; + else + return false; + } + + + /** + * Function used to get user access log + */ + function get_user_action_log($uid,$limit=NULL) + { + global $db; + $result = $db->select(tbl($this->dbtbl['action_log']),"*"," action_userid='$uid'",$limit," date_added DESC"); + if($db->num_rows>0) + return $result; + else + return false; + } + + /** + * Load Custom Profile Field + */ + function load_custom_profile_fields($data,$group_based=false) + { + if(!$group_based) + { + $array = $this->custom_profile_fields; + foreach($array as $key => $fields) + { + if($data[$fields['db_field']]) + $value = $data[$fields['db_field']]; + elseif($data[$fields['name']]) + $value = $data[$fields['name']]; + + + if($fields['type']=='radiobutton' || + $fields['type']=='checkbox' || + $fields['type']=='dropdown') + $fields['checked'] = $value; + else + $fields['value'] = $value; + $new_array[$key] = $fields; + } + return $new_array; + }else + { + $groups = $this->custom_profile_fields_groups; + + $new_grp = array(); + if($groups) + foreach($groups as $grp) + { + $fields = array(); + foreach($grp['fields'] as $key => $fields) + { + if($data[$fields['db_field']]) + $value = $data[$fields['db_field']]; + elseif($data[$fields['name']]) + $value = $data[$fields['name']]; + + + if($fields['type']=='radiobutton' || + $fields['type']=='checkbox' || + $fields['type']=='dropdown') + $fields['checked'] = $value; + else + $fields['value'] = $value; + } + $grp['fields'][$key] = $fields; + $new_grp[] = $grp; + } + } + + return $new_grp; + } + + /** + * Load Custom Signup Field + */ + function load_custom_signup_fields($data,$ck_display_admin=FALSE,$ck_display_user=FALSE) + { + $array = $this->custom_signup_fields; + foreach($array as $key => $fields) + { + $ok = 'yes'; + if($ck_display_admin) + { + if($fields['display_admin'] == 'no_display') + $ok = 'no'; + } + + if($ck_display_user) + { + if($fields['display_user'] == 'no_display') + $ok = 'no'; + } + + if($ok=='yes') + { + if(!$fields['value']) + $fields['value'] = $data[$fields['db_field']]; + $new_array[$key] = $fields; + } + } + + return $new_array; + } + + + /** + * Function used to get channel links + * ie Playlist, favorites etc etc + */ + function get_inner_channel_top_links($u) + { + $channel_links = array(); + + if(isSectionEnabled('videos')) + { + $channel_links[lang('upload')] = array('link'=>$this->get_user_videos_link($u)); + $channel_links[lang('favorites')] = array('link'=>cblink(array('name'=>'user_favorites')).$u['username']); + } + if(isSectionEnabled('channels')) + $channel_links[lang('contacts')] = array('link'=>cblink(array('name'=>'user_contacts')).$u['username']); + + return $channel_links; + } + + /** + * Function used to get user channel action links + * ie Add to friends, send message etc etc + */ + function get_channel_action_links($u) + { + return array(lang('send_message')=>array('link'=>cblink(array('name'=>'compose_new','extra_params'=>'to='.$u['username']))), + lang('add_as_friend')=>array('link'=>'javascript:void(0)','onclick'=>"add_friend('".$u['userid']."','result_cont')"), + lang('block_user')=>array('link'=>'javascript:void(0)','onclick'=>"block_user('".$u['username']."','result_cont')") + ); } + + /** + * Function used to get user videos link + */ + function get_user_videos_link($u) + { + return cblink(array('name'=>'user_videos')).$u['username']; + } + + + /** + * Function used to get user channel video + */ + function get_user_profile_video($u) + { + global $db,$cbvid; + if(empty($u['profile_video'])&&!$cbvid->video_exists($u)) + { + $u = $this->get_user_profile($u); + } + + if($cbvid->video_exists($u['profile_video'])) + return $cbvid->get_video_details($u['profile_video']); + else + return false; + } + + + /** + * My Account links + */ + function my_account_links() + { + + + $array[lang('account')] = + array + ( + lang('my_account') => 'myaccount.php', + lang('block_users') => 'edit_account.php?mode=block_users', + lang('user_change_pass') =>'edit_account.php?mode=change_password', + lang('user_change_email') =>'edit_account.php?mode=change_email', + lang('com_manage_subs') => 'edit_account.php?mode=subscriptions' + ); + + + $array[lang('user_channel_profiles')] = array + ( + lang('account_settings') =>'edit_account.php?mode=account', + lang('user_profile_settings') =>'edit_account.php?mode=profile', + lang('change_avatar') => 'edit_account.php?mode=avatar_bg', + lang('change_bg') => 'edit_account.php?mode=avatar_bg', + ); + + if(isSectionEnabled('videos')) + $array[lang('videos')] = array + ( + lang('uploaded_videos')=>'manage_videos.php', + lang('user_fav_videos')=>'manage_videos.php?mode=favorites', + ); + + if(isSectionEnabled('groups')) + $array[lang('groups')] = array + ( + lang('grp_groups_title') =>'manage_groups.php', + lang('user_create_group') =>cblink(array('name'=>'create_group')), + lang('grp_joined_groups')=>'manage_groups.php?mode=joined', + ); + + if(isSectionEnabled('playlists')) + $array[lang('playlists')]=array + ( + lang('manage_playlists') =>'manage_playlists.php', + lang('video_playlists') =>'manage_playlists.php?mode=manage_video_playlist', + ); + $array[lang('messages')] = array + ( + lang('inbox') => 'private_message.php?mode=inbox', + lang('notifications') => 'private_message.php?mode=notification', + lang('sent') => 'private_message.php?mode=sent', + lang('title_crt_new_msg')=> cblink(array('name'=>'compose_new')), + ); + + if(isSectionEnabled('channels')) + $array[lang('contacts')] = array + ( + lang('com_manage_contacts') => 'manage_contacts.php?mode=manage', + lang('add_contact_list') => 'manage_contacts.php?mode=new_group', + ); + + + + if(count($this->user_account)>0) + { + foreach($this->user_account as $key => $acc) + { + if(array_key_exists($key,$array)) + { + foreach($acc as $title => $link) + $array[$key][$title] = $link; + }else + $array[$key] = $acc; + } + //$array = array_merge($array,$this->user_account); + } + + return $array; + } + + + /** + * Function used to change email + */ + function change_email($array) + { + global $db; + //function used to change user email + if(!isValidEmail($array['new_email']) || $array['new_email']=='') + e(lang("usr_email_err2")); + elseif($array['new_email']!=$array['cnew_email']) + e(lang('user_email_confirm_email_err')); + elseif(!$this->user_exists($array['userid'])) + e(lang('usr_exist_err')); + elseif($this->email_exists($array['new_email'])) + e(lang('usr_email_err3')); + else + { + $db->update(tbl($this->dbtbl['users']),array('email'),array($array['new_email'])," userid='".$array['userid']."'"); + e(lang("email_change_msg"),"m"); + } + } + + /** + * Function used to ban users + */ + function block_users($users,$uid=NULL){ return $this->ban_users($users,$uid); } + function ban_users($users,$uid=NULL) + { + global $db; + if(!$uid) + $uid = userid(); + $users_array = explode(',',$users); + $new_users = array(); + foreach($users_array as $user) + { + if($user!=username() && !is_numeric($user) && $this->user_exists($user)) + { + $new_users[] = $user; + } + } + if(count($new_users)>0) + { + $new_users = array_unique($new_users); + $banned_users = implode(',',$new_users); + $db->update(tbl($this->dbtbl['users']),array('banned_users'),array($banned_users)," userid='$uid'"); + e(lang("user_ban_msg"),"m"); + }elseif (!$users){ + $db->update(tbl($this->dbtbl['users']),array('banned_users'),array($users)," userid='$uid'"); + e(lang("no_user_ban_msg"),"m"); + } + } + + /** + * Function used to ban single user + */ + function ban_user($user) + { + global $db; + $uid = userid(); + + if(!$uid) + e(lang('you_not_logged_in')); + elseif($user!=username() && !is_numeric($user) && $this->user_exists($user)) + { + $banned_users = $this->udetails['banned_users']; + if($banned_users) + $banned_users .= ",$user"; + else + $banned_users = "$user"; + + if(!$this->is_user_banned($user)) + { + $db->update(tbl($this->dbtbl['users']),array('banned_users'),array($banned_users)," userid='$uid'"); + e(lang("user_blocked"),"m"); + }else + e(lang("user_already_blocked")); + }else + { + e(lang("you_cant_del_user")); + } + } + + + + /** + * Function used to check weather user is banned or not + */ + function is_user_banned($ban,$user=NULL,$banned_users=NULL) + { + global $db; + if(!$user) + $user = userid(); + + if(!$banned_users) + { + if(is_numeric($user)) + $result = $db->select(tbl($this->dbtbl['users']),"banned_users"," userid='$user' "); + else + $result = $db->select(tbl($this->dbtbl['users']),"banned_users"," username='$user' "); + $banned_users = $result[0]['banned_users']; + } + + $ban_user = explode(',',$banned_users); + if(in_array($ban,$ban_user)) { + return true; + } else { + return false; + } + + return false; + } + + /** + * function used to get user details with profile + */ + function get_user_details_with_profile($uid=NULL) + { + global $db; + if(!$uid) + $uid = userid(); + $result = $db->select(tbl($this->dbtbl['users'].",".$this->dbtbl['user_profile']),"*",tbl($this->dbtbl['users']).".userid ='$uid' AND ".tbl($this->dbtbl['users']).".userid = ".tbl($this->dbtbl['user_profile']).".userid"); + return $result[0]; + } + + + function load_signup_fields($default=NULL) + { + global $LANG,$Cbucket; + /** + * this function will create initial array for user fields + * this will tell + * array( + * title [text that will represents the field] + * type [type of field, either radio button, textfield or text area] + * name [name of the fields, input NAME attribute] + * id [id of the fields, input ID attribute] + * value [value of the fields, input VALUE attribute] + * size + * class + * label + * extra_params + * hint_1 [hint before field] + * hint_2 [hint after field] + * anchor_before [anchor before field] + * anchor_after [anchor after field] + * ) + */ + + + if(empty($default)) + $default = $_POST; + + $username = $default['username']; + $email = $default['email']; + $dcountry = $default['country'] ? $default['country'] : $Cbucket->configs['default_country_iso2']; + $dob = $default['dob']; + + $dob = $dob ? date(config("date_format"),strtotime($dob)) : date(config("date_format"),strtotime('14-10-1989')); + + $user_signup_fields = array + ( + 'username' => array( + 'title'=> lang('username'), + 'type'=> "textfield", + 'name'=> "username", + 'id'=> "username", + 'value'=> $username, + 'hint_2'=> lang('user_allowed_format'), + 'db_field'=>'username', + 'required'=>'yes', + // 'syntax_type'=> 'username', + 'validate_function'=> 'username_check', + 'function_error_msg' => lang('user_contains_disallow_err'), + 'db_value_check_func'=> 'user_exists', + 'db_value_exists'=>false, + 'db_value_err'=>lang('usr_uname_err2'), + 'min_length' => config('min_username'), + 'max_length' => config('max_username'), + ), + 'email' => array( + 'title'=> lang('email'), + 'type'=> "textfield", + 'name'=> "email", + 'id'=> "email", + 'value'=> $email, + 'db_field'=>'email', + 'required'=>'yes', + 'syntax_type'=> 'email', + 'db_value_check_func'=> 'email_exists', + 'db_value_exists'=>false, + 'db_value_err'=>lang('usr_email_err3') + ), + 'password' => array( + 'title'=> lang('password'), + 'type'=> "password", + 'name'=> "password", + 'id'=> "password", + 'db_field'=>'password', + 'required'=>'yes', + 'invalid_err'=>lang('usr_pass_err2'), + 'relative_to' => 'cpassword', + 'relative_type' => 'exact', + 'relative_err' => lang('usr_pass_err3'), + 'validate_function' => 'pass_code', + 'use_func_val'=>true + ), + 'cpassword' => array( + 'title'=> lang('user_confirm_pass'), + 'type'=> "password", + 'name'=> "cpassword", + 'id'=> "cpassword", + 'required'=>'no', + 'invalid_err'=>lang('usr_cpass_err'), + ), + 'country' => array( + 'title'=> lang('country'), + 'type' => 'dropdown', + 'value' => $Cbucket->get_countries(iso2), + 'id' => 'country', + 'name' => 'country', + 'checked'=> $dcountry, + 'db_field'=>'country', + 'required'=>'yes', + ), + 'gender' => array( + 'title' => lang('gender'), + 'type' => 'radiobutton', + 'name' => 'gender', + 'id' => 'gender', + 'value' => array('Male'=>lang('male'),'Female'=>lang('female')), + 'sep'=> ' ', + 'checked'=>'Male', + 'db_field'=>'sex', + 'required'=>'yes', + ), + 'dob' => array( + 'title' => lang('user_date_of_birth'), + 'type' => 'textfield', + 'name' => 'dob', + 'id' => 'dob', + 'class'=>'date_field', + 'anchor_after' => 'date_picker', + 'value'=> $dob, + 'validate_function' => 'verify_age', + 'db_field'=>'dob', + 'required'=>'yes', + 'invalid_err'=>lang('You must be atleast '.config('min_age_reg').' to register'), + ), + + 'cat' => array('title'=> lang('Category'), + 'type'=> 'dropdown', + 'name'=> 'category', + 'id'=> 'category', + 'value'=> array('category',$default['category']), + 'db_field'=>'category', + 'checked'=>$default['category'], + 'required'=>'yes', + 'invalid_err'=>lang("Please select your category"), + 'display_function' => 'convert_to_categories', + 'category_type'=>'user', + ) + ); + + return $user_signup_fields; + } + + + /** + * Function used to validate Signup Form + */ + function validate_form_fields($array=NULL) + { + global $userquery; + $fields = $this->load_signup_fields($array); + + if($array==NULL) + $array = $_POST; + + if(is_array($_FILES)) + $array = array_merge($array,$_FILES); + + //Mergin Array + $signup_fields = array_merge($fields,$this->custom_signup_fields); + + validate_cb_form($signup_fields,$array); + + } + + + /** + * Function used to validate signup form + */ + function signup_user($array=NULL,$send_signup_email=true) + { + global $LANG,$db,$userquery; + if($array==NULL) + $array = $_POST; + + if(is_array($_FILES)) + $array = array_merge($array,$_FILES); + $this->validate_form_fields($array); + + //checking terms and policy agreement + if($array['agree']!='yes' && !has_access('admin_access',true)) + e(lang('usr_ament_err')); + + if(!verify_captcha()) + e(lang('usr_ccode_err')); + if(!error()) + { + $signup_fields = $this->load_signup_fields($array); + + //Adding Custom Signup Fields + if(count($this->custom_signup_fields)>0) + $signup_fields = array_merge($signup_fields,$this->custom_signup_fields); + + foreach($signup_fields as $field) + { + $name = formObj::rmBrackets($field['name']); + $val = $array[$name]; + + if($field['use_func_val']) + $val = $field['validate_function']($val); + + + if(!empty($field['db_field'])) + $query_field[] = $field['db_field']; + + if(is_array($val)) + { + $new_val = ''; + foreach($val as $v) + { + $new_val .= "#".$v."# "; + } + $val = $new_val; + } + if(!$field['clean_func'] || (!function_exists($field['clean_func']) && !is_array($field['clean_func']))) + $val = mysql_clean($val); + else + $val = apply_func($field['clean_func'],sql_free('|no_mc|'.$val)); + + if(!empty($field['db_field'])) + $query_val[] = $val; + + } + + // Setting Verification type + if(EMAIL_VERIFICATION == '1'){ + $usr_status = 'ToActivate'; + $welcome_email = 'no'; + }else{ + $usr_status = 'Ok'; + $welcome_email = 'yes'; + } + + if(has_access('admin_access',true)) + { + if($array['active']=='Ok') + { + $usr_status = 'Ok'; + $welcome_email = 'yes'; + }else{ + $usr_status = 'ToActivate'; + $welcome_email = 'no'; + } + + $query_field[] = "level"; + $query_val[] = $array['level']; + } + + $query_field[] = "usr_status"; + $query_val[] = $usr_status; + + $query_field[] = " welcome_email_sent"; + $query_val[] = $welcome_email; + + //Creating AV Code + $avcode = RandomString(10); + $query_field[] = "avcode"; + $query_val[] = $avcode; + + + + //Signup IP + $signup_ip = $_SERVER['REMOTE_ADDR']; + $query_field[] = "signup_ip"; + $query_val[] = $signup_ip; + + //Date Joined + $now = NOW(); + $query_field[] = "doj"; + $query_val[] = $now; + + + /** + * A VERY IMPORTANT PART OF + * OUR SIGNUP SYSTEM IS + * SESSION KEY AND CODE + * WHEN A USER IS LOGGED IN + * IT IS ONLY VALIDATED BY + * ITS SIGNUP KEY AND CODE + * + */ + $sess_key = $this->create_session_key($_COOKIE['PHPSESSID'],$array['password']); + $sess_code = $this->create_session_code(); + + $query_field[] = "user_session_key"; + $query_val[] = $sess_key; + + $query_field[] = "user_session_code"; + $query_val[] = $sess_code; + + $query = "INSERT INTO ".tbl("users")." ("; + $total_fields = count($query_field); + + //Adding Fields to query + $i = 0; + foreach($query_field as $qfield) + { + $i++; + $query .= $qfield; + if($i<$total_fields) + $query .= ','; + } + + $query .= ") VALUES ("; + + $i = 0; + //Adding Fields Values to query + foreach($query_val as $qval) + { + $i++; + $query .= "'$qval'"; + if($i<$total_fields) + $query .= ','; + } + + //Finalzing Query + $query .= ")"; + + $db->Execute($query); + $insert_id = $db->insert_id(); + $db->insert(tbl($userquery->dbtbl['user_profile']),array("userid"),array($insert_id)); + + if(!has_access('admin_access',true) && EMAIL_VERIFICATION && $send_signup_email) + { + global $cbemail; + $tpl = $cbemail->get_template('email_verify_template'); + $more_var = array + ('{username}' => post('username'), + '{password}' => post('password'), + '{email}' => post('email'), + '{avcode}' => $avcode, + ); + if(!is_array($var)) + $var = array(); + $var = array_merge($more_var,$var); + $subj = $cbemail->replace($tpl['email_template_subject'],$var); + $msg = nl2br($cbemail->replace($tpl['email_template'],$var)); + + //Now Finally Sending Email + cbmail(array('to'=>post('email'),'from'=>WEBSITE_EMAIL,'subject'=>$subj,'content'=>$msg)); + } + elseif(!has_access('admin_access',true) && $send_signup_email) + { + $this->send_welcome_email($insert_id); + } + + $log_array = array + ('username' => $array['username'], + 'userid' => $insert_id, + 'userlevel'=> $array['level'], + 'useremail'=> $array['email'], + 'success'=>'yes', + 'details'=> sprintf("%s signed up",$array['username'])); + + //Login Signup + insert_log('signup',$log_array); + + + //Adding User has Signup Feed + addFeed(array('action' => 'signup','object_id' => $insert_id,'object'=>'signup','uid'=>$insert_id)); + + return $insert_id; + } + + return false; + } + + + + + //Duplicate User Check + function duplicate_user($name){ + global $myquery; + if($myquery->check_user($name)){ + return true; + }else{ + return false; + } + } + + function duplicate_email($name){ + $myquery = new myquery(); + if($myquery->check_email($name)){ + return true; + }else{ + return false; + } + } + + //Validate Email + + function isValidEmail($email){ + return isValidEmail($email); + } + + //Validate Username + function isValidUsername($uname){ + return $this->is_username($uname); + } + + /** + * Function used to make username valid + * this function will also check if username is banned or not + * it will also filter the username and also filter its patterns + * as given in administratio panel + */ + function is_username($username) + { + global $Cbucket; + //Our basic pattern for username is + //$pattern = "^^[_a-z0-9-]+$"; + $pattern = "^^[_a-z0-9-]+$"; + //Now we will check if admin wants to change the pattern + if (eregi($pattern, $username)){ + return true; + }else { + return false; + } + + } + + + /** + * Function used to get users + */ + function get_users($params=NULL,$force_admin=FALSE) + { + global $db; + + $limit = $params['limit']; + $order = $params['order']; + + $cond = ""; + if(!has_access('admin_access',TRUE) && !$force_admin) + $cond .= " usr_status='Ok' AND ban_status ='no' "; + else + { + if($params['ban']) + $cond .= " ban_status ='".$params['ban']."'"; + + if($params['status']) + { + if($cond!='') + $cond .=" AND "; + $cond .= " usr_status='".$params['status']."'"; + } + + } + + //Setting Category Condition + if(!is_array($params['category'])) + $is_all = strtolower($params['category']); + + if($params['category'] && $is_all!='all') + { + if($cond!='') + $cond .= ' AND '; + + $cond .= " ("; + + if(!is_array($params['category'])) + { + $cats = explode(',',$params['category']); + }else + $cats = $params['category']; + + $count = 0; + + foreach($cats as $cat_params) + { + $count ++; + if($count>1) + $cond .=" OR "; + $cond .= " category LIKE '%$cat_params%' "; + } + + $cond .= ")"; + } + + //date span + if($params['date_span']) + { + if($cond!='') + $cond .= ' AND '; + $cond .= " ".cbsearch::date_margin("doj",$params['date_span']); + } + + /*//uid + if($params['user']) + { + if($cond!='') + $cond .= ' AND '; + $cond .= " userid='".$params['user']."'"; + } + + $tag_n_title=''; + //Tags + if($params['tags']) + { + //checking for commas ;) + $tags = explode(",",$params['tags']); + if(count($tags)>0) + { + if($tag_n_title!='') + $tag_n_title .= ' OR '; + $total = count($tags); + $loop = 1; + foreach($tags as $tag) + { + $tag_n_title .= " tags LIKE '%".$tag."%'"; + if($loop<$total) + $tag_n_title .= " OR "; + $loop++; + + } + }else + { + if($tag_n_title!='') + $tag_n_title .= ' OR '; + $tag_n_title .= " tags LIKE '%".$params['tags']."%'"; + } + } + //TITLE + if($params['title']) + { + if($tag_n_title!='') + $tag_n_title .= ' OR '; + $tag_n_title .= " title LIKE '%".$params['tags']."%'"; + } + + if($tag_n_title) + { + if($cond!='') + $cond .= ' AND '; + $cond .= " ($tag_n_title) "; + }*/ + + //FEATURED + if($params['featured']) + { + if($cond!='') + $cond .= ' AND '; + $cond .= " featured = '".$params['featured']."' "; + } + + //Email + if($params['username']) + { + if($cond!='') + $cond .= ' AND '; + $cond .= " username = '".$params['username']."' "; + } + + //Email + if($params['email']) + { + if($cond!='') + $cond .= ' AND '; + $cond .= " email = '".$params['email']."' "; + } + + //Exclude Users + if($params['exclude']) + { + if($cond!='') + $cond .= ' AND '; + $cond .= " userid <> '".$params['exclude']."' "; + } + + //Getting specific User + if($params['userid']) + { + if($cond!='') + $cond .= ' AND '; + $cond .= " userid = '".$params['userid']."' "; + } + + //Sex + if($params['gender']) + { + if($cond!='') + $cond .= ' AND '; + $cond .= " sex = '".$params['gender']."' "; + } + + //Level + if($params['level']) + { + if($cond!='') + $cond .= ' AND '; + $cond .= " level = '".$params['level']."' "; + } + + if($params['cond']) + { + if($cond!='') + $cond .= ' AND '; + $cond .= " ".$params['cond']." "; + } + + + if(!$params['count_only']) + { + + $query = " SELECT ".tbl("users").".*,profile.rating FROM ".tbl('users')." LEFT JOIN ".tbl('user_profile'). " AS profile "; + $query .= " ON ".tbl('users.userid')." = profile.userid "; + + $query .= " WHERE ".$cond; + + if($order) + $query .= " ORDER BY ".$order; + + if($limit) + $query .= " LIMIT ".$limit; + + //$result = $db->select(tbl('users'),'*',$cond,$limit,$order); + + $result = db_select($query); + } + + + if($params['count_only']) + return $result = $db->count(tbl('users'),'userid',$cond); + if($params['assign']) + assign($params['assign'],$result); + else + return $result; + } + + + + + /** + * Function used to perform several actions with a video + */ + function action($case,$uid) + { + global $db; + if(!$this->user_exists($uid)) + return false; + //Lets just check weathter user exists or not + $tbl = tbl($this->dbtbl['users']); + switch($case) + { + //Activating a user + case 'activate': + case 'av': + case 'a': + { + $avcode = RandomString(10); + $db->update($tbl,array('usr_status','avcode'),array('Ok',$avcode)," userid='$uid' "); + e(lang("User has been activated"),'m'); + } + break; + + //Deactivating a user + case "deactivate": + case "dav": + case "d": + { + $avcode = RandomString(10); + $db->update($tbl,array('usr_status','avcode'),array('ToActivate',$avcode)," userid='$uid' "); + e(lang("User has been deactivated"),'m'); + } + break; + + //Featuring user + case "feature": + case "featured": + case "f": + { + $db->update($tbl,array('featured','featured_date'),array('yes',now())," userid='$uid' "); + e(lang("User has been set as featured"),'m'); + } + break; + + + //Unfeatured user + case "unfeature": + case "unfeatured": + case "uf": + { + $db->update($tbl,array('featured'),array('no')," userid='$uid' "); + e(lang("User has been removed from featured users"),'m'); + } + break; + + //Ban User + case "ban": + case "banned": + { + $db->update($tbl,array('ban_status'),array('yes')," userid='$uid' "); + e(lang("User has been banned"),'m'); + } + break; + + + //Ban User + case "unban": + case "unbanned": + { + $db->update($tbl,array('ban_status'),array('no')," userid='$uid' "); + e(lang("User has been unbanned"),'m'); + } + break; + } + } + + + /** + * Is registration allowed + */ + function is_registration_allowed() + { + if(ALLOW_REG == 1) + { + return true; + } + return false; + } + + /** + * Function used to use to initialize search object for video section + * op=>operator (AND OR) + */ + function init_search() + { + $this->search = new cbsearch; + $this->search->db_tbl = "users"; + $this->search->columns =array( + array('field'=>'username','type'=>'LIKE','var'=>'%{KEY}%'), + ); + $this->search->cat_tbl = $this->cat_tbl; + + $this->search->display_template = LAYOUT.'/blocks/user.html'; + $this->search->template_var = 'user'; + $this->search->multi_cat = false; + $this->search->date_added_colum = 'doj'; + $this->search->results_per_page = config('users_items_search_page'); + + /** + * Setting up the sorting thing + */ + + $sorting = array( + 'doj' => lang("date_added"), + 'profile_hits' => lang("views"), + 'total_comments' => lang("comments"), + 'total_videos' => lang("videos"), + ); + + $this->search->sorting = array( + 'doj'=> " doj DESC", + 'profile_hits' => " profile_hits DESC", + 'total_comments' => " total_comments DESC ", + 'total_videos' => " total_videos DESC", + ); + /** + * Setting Up The Search Fields + */ + + $default = $_GET; + if(is_array($default['category'])) + $cat_array = array($default['category']); + $uploaded = $default['datemargin']; + $sort = $default['sort']; + + $this->search->search_type['users'] = array('title'=>lang('users')); + + $fields = array( + 'query' => array( + 'title'=> lang('keywords'), + 'type'=> 'textfield', + 'name'=> 'query', + 'id'=> 'query', + 'value'=>cleanForm($default['query']) + ), + 'category' => array( + 'title' => lang('category'), + 'type' => 'checkbox', + 'name' => 'category[]', + 'id' => 'category', + 'value' => array('category',$cat_array), + 'category_type'=>'user', + ), + 'date_margin' => array( + 'title' => lang('joined'), + 'type' => 'dropdown', + 'name' => 'datemargin', + 'id' => 'datemargin', + 'value' => $this->search->date_margins(), + 'checked' => $uploaded, + ), + 'sort' => array( + 'title' => lang('sort_by'), + 'type' => 'dropdown', + 'name' => 'sort', + 'value' => $sorting, + 'checked' => $sort + ) + ); + + $this->search->search_type['users']['fields'] = $fields; + } + + + + /** + * Function used to get number of users online + */ + function get_online_users($group=true,$count=false) + { + global $db; + + if($group) + { + $results = $db->select(tbl("sessions")." LEFT JOIN (".tbl("users").") ON + (".tbl("sessions.session_user=").tbl("users").".userid)" , + tbl("sessions.*,users.username,users.userid,users.email").",count(".tbl("sessions.session_user").") AS logins" + ," TIMESTAMPDIFF(MINUTE,".tbl("sessions.last_active").",'".NOW()."') < 6 GROUP BY ".tbl("users.userid")); + }else + { + if($count) + { + $results = $db->count(tbl("sessions")." LEFT JOIN (".tbl("users").") ON + (".tbl("sessions.session_user=").tbl("users").".userid)" , + tbl("sessions.session_id") + ," TIMESTAMPDIFF(MINUTE,".tbl("sessions.last_active").",'".NOW()."') < 6 "); + }else + { + $results = $db->select(tbl("sessions")." LEFT JOIN (".tbl("users").") ON + (".tbl("sessions.session_user=").tbl("users").".userid)" , + tbl("sessions.*,users.username,users.userid,users.email") + ," TIMESTAMPDIFF(MINUTE,".tbl("sessions.last_active").",'".NOW()."') < 6 "); + } + } + + return $results; + } + + + + + /** + * Function will let admin to login as user + */ + function login_as_user($id,$realtime=false) + { + global $sess,$db,$cblog; + $udetails = $this->get_user_details($id); + if($udetails) + { + if(!$realtime) + { + /* + $sess->set('dummy_username',$sess->get("username")); + $sess->set('dummy_level',$sess->get("level")); + $sess->set('dummy_userid',$sess->get("userid")); + $sess->set('dummy_user_session_key',$sess->get("user_session_key")); + $sess->set('dummy_user_session_code',$sess->get("user_session_code")); + + + $sess->set('username',$udetails['username']); + $sess->set('level',$udetails['level']); + $sess->set('userid',$udetails['userid']); + $sess->set('user_session_key',$udetails['session_key']); + $sess->set('user_session_code',$udetails['session_code']); + */ + + $sess->set('dummy_sess_salt',$sess->get("sess_salt")); + $sess->set('dummy_PHPSESSID',$sess->get("PHPSESSID")); + $sess->set('dummy_userid',userid()); + $sess->set('dummy_user_session_key',$this->udetails['user_session_key']); + + $userid = $udetails['userid']; + $session_salt = RandomString(5); + $sess->set('sess_salt',$session_salt); + $sess->set('PHPSESSID',$sess->id); + + $smart_sess = md5($udetails['user_session_key'].$session_salt); + + $db->delete(tbl("sessions"),array("session"),array($sess->id)); + $sess->add_session($userid,'smart_sess',$smart_sess); + + }else + { + if($this->login_check(NULL,true)) + $msg[] = e(lang('you_already_logged')); + elseif(!$this->user_exists($udetails['username'])) + $msg[] = e(lang('user_doesnt_exist')); + elseif(!$udetails) + $msg[] = e(lang('usr_login_err')); + elseif(strtolower($udetails['usr_status']) != 'ok') + $msg[] = e(lang('user_inactive_msg')); + elseif($udetails['ban_status'] == 'yes') + $msg[] = e(lang('usr_ban_err')); + else + { + + $userid = $udetails['userid']; + $log_array['userid'] = $userid = $udetails['userid']; + $log_array['useremail'] = $udetails['email']; + $log_array['success'] = 1; + + $log_array['level'] = $level = $udetails['level']; + + //Adding Sessing In Database + //$sess->add_session($userid,'logged_in'); + + //$sess->set('username',$username); + //$sess->set('userid',$userid); + + //Setting Timeout + if($remember) + $sess->timeout = 86400*REMBER_DAYS; + + //Starting special sessions for security + $session_salt = RandomString(5); + $sess->set('sess_salt',$session_salt); + $sess->set('PHPSESSID',$sess->id); + + $smart_sess = md5($udetails['user_session_key'].$session_salt); + + $db->delete(tbl("sessions"),array("session","session_string"),array($sess->id,"guest")); + $sess->add_session($userid,'smart_sess',$smart_sess); + + //$sess->set('user_sess',$smart_sess); + + //$sess->set('user_session_key',$udetails['user_session_key']); + //$sess->set('user_session_code',$udetails['user_session_code']); + + + //Setting Vars + $this->userid = $udetails['userid']; + $this->username = $udetails['username']; + $this->level = $udetails['level']; + + //Updating User last login , num of visist and ip + $db->update(tbl('users'), + array( + 'num_visits','last_logged','ip' + ), + array( + '|f|num_visits+1',NOW(),$_SERVER['REMOTE_ADDR'] + ), + "userid='".$userid."'" + ); + + + $this->init(); + //Logging Actiong + $cblog->insert('login',$log_array); + + return true; + } + + //Error Loging + if(!empty($msg)) + { + //Loggin Action + $log_array['success'] = no; + $log_array['details'] = $msg[0]; + $cblog->insert('login',$log_array); + } + } + + return true; + }else + e(lang("usr_exist_err")); + } + + /** + * Function used to revert back to admin + */ + function revert_from_user() + { + global $sess,$db; + if($this->is_admin_logged_as_user()) + { + + $userid = $sess->get('dummy_userid'); + $session_salt = $sess->get('dummy_sess_salt'); + $user_session_key = $sess->get('dummy_user_session_key'); + $smart_sess = md5($user_session_key.$session_salt); + + $sess->set('sess_salt',$session_salt); + $sess->set('PHPSESSID',$sess->get('dummy_PHPSESSID')); + + $db->delete(tbl("sessions"),array("session"),array($sess->get('dummy_PHPSESSID'))); + $sess->add_session($userid,'smart_sess',$smart_sess); + + $sess->set('dummy_sess_salt',''); + $sess->set('dummy_PHPSESSID',''); + $sess->set('dummy_userid',''); + $sess->set('dummy_user_session_key',''); + + } + } + + /** + * Function used to check weather user is logged in as admin or not + */ + function is_admin_logged_as_user() + { + global $sess; + if($sess->get("dummy_sess_salt")!="") + { + return true; + } + return false; + } + + + /** + * Function used to get anonymous user + */ + function get_anonymous_user() + { + global $db; + $uid = config('anonymous_id'); + /*Added to resolve bug 222*/ + $result = $db->select(tbl("users"),"userid"," username='anonymous%' AND email='anonymous%'","1"); + if($result[0]['userid']) + return $result[0]['userid'];/*End **/ + else + { + $result = $db->select(tbl("users"),"userid"," level='6' AND usr_status='ToActivate' ","1"); + if($result[0]['userid']) + return $result[0]['userid']; + else + { + $pass = RandomString(10); + + if($_SERVER['HTTP_HOST']!='localhost') + $email = 'anonymous'.RandomString(5).'@'.$_SERVER['HTTP_HOST']; + else + $email = 'anonymous'.RandomString(5).'@'.$_SERVER['HTTP_HOST'].'.tld'; + + //Create Anonymous user + $uid = $this->signup_user( + array( + 'username' => 'anonymous'.RandomString(5), + 'email' => $email, + 'password' => $pass, + 'cpassword' => $pass, + 'country' => get_country(config('default_country_iso2')), + 'gender' => 'Male', + 'dob' => '2000-10-10', + 'category' => '1', + 'level' => '6', + 'active' => 'yes', + 'agree' => 'yes', + ),false); + + + /*Added to resolve bug 222*/ + global $myquery; + $myquery->Set_Website_Details('anonymous_id',$uid); + /*End*/ + + return $uid; + } + } + } + + + /** + * Function used to delete user videos + */ + function delete_user_vids($uid) + { + global $cbvid,$eh; + $vids = get_videos(array('user'=>$uid)); + if(is_array($vids)) + foreach($vids as $vid) + $cbvid->delete_video($vid['videoid']); + $eh->flush_msg(); + e(lang("user_vids_hv_deleted"),"m"); + } + + /** + * Function used to remove user contacts + */ + function remove_contacts($uid) + { + global $eh; + $contacts = $this->get_contacts($uid); + if(is_array($contacts)) + foreach($contacts as $contact) + { + $this->remove_contact($contact['userid'],$contact['contact_userid']); + } + $eh->flush_msg(); + e(lang("user_contacts_hv_removed"),"m"); + } + + /** + * Function used to remove user private messages + */ + function remove_user_pms($uid,$box='both') + { + global $db,$cbpm,$eh; + + if($box=="inbox" || $box=="both") + { + $inboxs = $cbpm->get_user_inbox_messages($uid); + if(is_array($inboxs)) + foreach($inboxs as $inbox) + { + $cbpm->delete_msg($inbox['message_id'],$uid); + } + $eh->flush_msg(); + e(lang("all_user_inbox_deleted"),"m"); + } + if($box=="sent" || $box=="both") + { + $outs = $cbpm->get_user_outbox_messages($uid); + if(is_array($outs)) + foreach($outs as $out) + { + $cbpm->delete_msg($out['message_id'],$uid,'out'); + } + $eh->flush_msg(); + e(lang("all_user_sent_messages_deleted"),"m"); + + } + } + + /** + * This will get user subscriptions + * uploaded videos and photos + * This is a test function + */ +function getSubscriptionsUploadsWeek($uid,$limit=20,$uploadsType="both",$uploadsTimeSpan="this_week") +{ + $usr_cond = ""; + $users = $this->get_user_subscriptions($uid); + if($users) + { + foreach($users as $user) + { + if($user_cond) + $user_cond .= " OR "; + $user_cond .= tbl("users.userid")."='".$user[0]."' "; + } + $user_cond = " (".$user_cond.") "; + global $cbphoto,$cbvideo; + $photoCount = 1; + $videoCount = 1; + switch($uploadsType) + { + case "both": + default: + { + $photos = $cbphoto->get_photos(array("limit"=>$limit,"extra_cond"=>$user_cond,"order"=>" date_added DESC","date_span"=>$uploadsTimeSpan)); + $videos = $cbvideo->get_videos(array("limit"=>$limit,"cond"=>" AND".$user_cond,"order"=>" date_added DESC","date_span"=>$uploadsTimeSpan)); + if(!empty($photos) && !empty($videos)) + $finalResult = array_merge($videos,$photos); + elseif(empty($photos) && !empty($videos)) + $finalResult = array_merge($videos,array()); + elseif(!empty($photos) && empty($videos)) + $finalResult = array_merge($photos,array()); + + if(!empty($finalResult)) + { + foreach($finalResult as $result) + { + if($result['videoid']) + { + $videoArr[] = $result; + $return['videos'] = array( + "title" => lang("videos"), + "total" => $videoCount++, + "items" => $videoArr + ); + } + + if($result['photo_id']) + { + $photosArr[] = $result; + $return['photos'] = array( + "title" => lang("photos"), + "total" => $photoCount++, + "items" => $photosArr + ); + } + + } + //pr($return,true) ; + return $return; + } else + return false; + } + break; + + case "photos": case "photo" : case "p": + { + $photos = $cbphoto->get_photos(array("limit"=>$limit,"extra_cond"=>$user_cond,"order"=>" date_added DESC","date_span"=>$uploadsTimeSpan)); + if($photos) + { + foreach($photos as $photo) + { + $photosArr[] = $photo; + $return['photos'] = array( + "title" => lang("photos"), + "total" => $photoCount++, + "items" => $photosArr + ); + } + } + else + return false; + } + break; + + case "videos": case "video": case "v": + { + $videos = $cbvideo->get_videos(array("limit"=>$limit,"cond"=>" AND".$user_cond,"order"=>" date_added DESC","date_span"=>$uploadsTimeSpan)); + if($videos) + { + foreach($videos as $video) + { + $videoArr[] = $video; + $return['videos'] = array( + "title" => lang("videos"), + "total" => $videoCount++, + "items" => $videoArr + ); + } + } + else + return false; + } + break; + } + return $return; + } +} + + /** + * Get subscred videos + */ + function get_subscribed_videos($uid,$limit=20) + { + $user_cond = ""; + $users = $this->get_user_subscriptions($uid); + if($users) + { + foreach($users as $user) + { + //pr($user); + //Creating Query + if($user_cond) + $user_cond .= " OR "; + $user_cond .= tbl("users.userid")."='".$user[0]."' "; + } + $user_cond = " AND (".$user_cond.") "; + global $cbvid,$db; + $vids = $cbvid->get_videos(array('limit'=>$limit,'cond'=>$user_cond,"order"=>" date_added DESC ","date_span"=>"this_week")); + // echo $db->db_query; + return $vids; + } + return false; + } + + + /** + * Function used to set item as profile item + */ + function setProfileItem($id,$type='v',$uid=NULL) + { + global $cbvid,$db,$cbphoto; + if(!$uid) + $uid = userid(); + if(!$uid) + { + e("user_doesnt_exist"); + return false; + } + switch($type) + { + case "v": + { + if($cbvid->video_exists($id)) + { + $array['type'] = 'v'; + $array['id'] = $id; + $db->update(tbl('user_profile'),array('profile_item'),array("|no_mc|".json_encode($array)) + ," userid='$uid' "); + + e(sprintf(lang("this_has_set_profile_item"),lang("video")),"m"); + }else + e("class_vdo_del_err"); + } + break; + + case "p": + { + if($cbphoto->photo_exists($id)) + { + $array['type'] = 'p'; + $array['id'] = $id; + $db->update(tbl('user_profile'),array('profile_item'),array("|no_mc|".json_encode($array)) + ," userid='$uid' "); + + e(sprintf(lang("this_has_set_profile_item"),lang("photo")),"m"); + }else + e("photo_not_exists"); + } + break; + } + } + + /** + * Remove Profile item + */ + function removeProfileItem($uid=NULL) + { + global $db; + if(!$uid) + $uid = userid(); + if(!$uid) + { + e("user_doesnt_exist"); + return false; + } + + $db->update(tbl('user_profile'),array('profile_item'),array("") + ," userid='$uid' "); + + e(lang("profile_item_removed"),"m"); + } + + /** + * function used to get profile item + */ + function getProfileItem($uid=NULL,$withDetails = false) + { + global $db,$cbvid,$cbphoto; + if(!$uid) + $uid = userid(); + if(!$uid) + { + e("user_doesnt_exist"); + return false; + } + + if($uid == userid() && $this->profileItem && !$withDetails) + return $this->profileItem; + + $profileItem = $db->select(tbl("user_profile"),"profile_item"," userid='$uid'"); + $profileItem = $profileItem[0]['profile_item']; + + $profileItem = json_decode($profileItem,true); + + if($withDetails) + { + switch($profileItem['type']) + { + case "p": + { + $photo = $cbphoto->get_photo($profileItem['id']); + $photo['type'] = 'p'; + if($photo) + return $photo; + } + break; + case "v": + { + $video = $cbvid->get_video($profileItem['id']); + $video['type'] = 'v'; + if($video) + return $video; + } + break; + } + } + return $this->profileItem = $profileItem; + } + + /** + * Function used to check weather input given item + * is profile item or not + */ + function isProfileItem($id,$type='v',$uid=NULL) + { + $profileItem = $this->getProfileItem($uid); + + if($profileItem['type'] == $type && $profileItem['id'] == $id) + return true; + else + return false; + } + + + + + /** + * FUnction loading personal details + */ + function load_personal_details($default) + { + + if(!$default) + $default = $_POST; + $profile_fields = array + ( + 'first_name' => array( + 'title'=> lang("user_fname"), + 'type'=> "textfield", + 'name'=> "first_name", + 'id'=> "first_name", + 'value'=> $default['first_name'], + 'db_field'=>'first_name', + 'required'=>'no', + 'syntax_type'=> 'name', + 'auto_view'=>'yes' + ), + 'last_name' => array( + 'title'=> lang("user_lname"), + 'type'=> "textfield", + 'name'=> "last_name", + 'id'=> "last_name", + 'value'=> $default['last_name'], + 'db_field'=>'last_name', + 'syntax_type'=> 'name', + 'auto_view'=>'yes' + ), + + + 'relation_status' => array( + 'title'=> lang("user_relat_status"), + 'type'=> "dropdown", + 'name'=> "relation_status", + 'id'=> "last_name", + 'value'=> array( + lang('usr_arr_no_ans'), + lang('usr_arr_single'), + lang('usr_arr_married'), + lang('usr_arr_comitted'), + lang('usr_arr_open_relate') + ), + 'checked'=> $default['relation_status'], + 'db_field'=>'relation_status', + 'auto_view'=>'yes', + + + ), + 'show_dob' => array( + 'title'=> lang("show_dob"), + 'type'=> "radiobutton", + 'name'=> "show_dob", + 'id'=> "show_dob", + 'value' => array('yes'=>lang('yes'),'no'=>lang('no')), + 'checked' => $default['show_dob'], + 'db_field'=>'show_dob', + 'syntax_type'=> 'name', + 'auto_view'=>'no', + 'sep'=>' ' + ), + 'about_me' => array( + 'title'=> lang("user_about_me"), + 'type'=> "textarea", + 'name'=> "about_me", + 'id'=> "about_me", + 'value'=> cleanForm($default['about_me']), + 'db_field'=>'about_me', + 'auto_view'=>'no', + 'clean_func' => 'Replacer', + ), + 'profile_tags' => array( + 'title'=> lang("profile_tags"), + 'type'=> "textfield", + 'name'=> "profile_tags", + 'id'=> "profile_tags", + 'value'=> $default['profile_tags'], + 'db_field'=>'profile_tags', + 'auto_view'=>'no' + ), + 'web_url' => array( + 'title'=> lang("website"), + 'type'=> "textfield", + 'name'=> "web_url", + 'id'=> "web_url", + 'value'=> $default['web_url'], + 'db_field'=>'web_url', + 'auto_view'=>'yes', + 'display_function'=>'outgoing_link' + ), + + + ); + + return $profile_fields; + } + + + /** + * function used to load location fields + */ + function load_location_fields($default) + { + if(!$default) + $default = $_POST; + $other_details = array + ( + 'postal_code' => array( + 'title'=> lang("postal_code"), + 'type'=> "textfield", + 'name'=> "postal_code", + 'id'=> "postal_code", + 'value'=> $default['postal_code'], + 'db_field'=>'postal_code', + 'auto_view' => 'yes' + ), + 'hometown' => array( + 'title'=> lang("hometown"), + 'type'=> "textfield", + 'name'=> "hometown", + 'id'=> "hometown", + 'value'=> $default['hometown'], + 'db_field'=>'hometown', + 'auto_view' => 'yes' + ), + 'city' => array( + 'title'=> lang("city"), + 'type'=> "textfield", + 'name'=> "city", + 'id'=> "city", + 'value'=> $default['city'], + 'db_field'=>'city', + 'auto_view' => 'yes' + ), + ); + return $other_details; + } + + + /** + * Function used to load experice fields + */ + function load_education_interests($default) + { + if(!$default) + $default = $_POST; + $more_details = array + ( + 'education' => array( + 'title'=> lang("education"), + 'type'=> "dropdown", + 'name'=> "education", + 'id'=> "education", + 'value'=> array(lang('usr_arr_no_ans'), + lang('usr_arr_elementary'), + lang('usr_arr_hi_school'), + lang('usr_arr_some_colg'), + lang('usr_arr_assoc_deg'), + lang('usr_arr_bach_deg'), + lang('usr_arr_mast_deg'), + lang('usr_arr_phd'), + lang('usr_arr_post_doc'), + ), + 'checked'=>$default['education'], + 'db_field'=>'education', + 'auto_view'=>'yes', + ), + 'schools' => array( + 'title'=> lang("schools"), + 'type'=> "textarea", + 'name'=> "schools", + 'id'=> "schools", + 'value'=> cleanForm($default['schools']), + 'db_field'=>'schools', + 'clean_func' => 'Replacer', + 'auto_view'=>'yes', + ), + 'occupation' => array( + 'title'=> lang("occupation"), + 'type'=> "textarea", + 'name'=> "occupation", + 'id'=> "occupation", + 'value'=> cleanForm($default['occupation']), + 'db_field'=>'occupation', + 'clean_func' => 'Replacer', + 'auto_view'=>'yes', + ), + 'companies' => array( + 'title'=> lang("companies"), + 'type'=> "textarea", + 'name'=> "companies", + 'id'=> "companies", + 'value'=> cleanForm($default['companies']), + 'db_field'=>'companies', + 'clean_func' => 'Replacer', + 'auto_view'=>'yes', + ), + 'hobbies' => array( + 'title'=> lang("hobbies"), + 'type'=> "textarea", + 'name'=> "hobbies", + 'id'=> "hobbies", + 'value'=> cleanForm($default['hobbies']), + 'db_field'=>'hobbies', + 'clean_func' => 'Replacer', + 'auto_view'=>'yes', + ), + 'fav_movies' => array( + 'title'=> lang("user_fav_movs_shows"), + 'type'=> "textarea", + 'name'=> "fav_movies", + 'id'=> "fav_movies", + 'value'=> cleanForm($default['fav_movies']), + 'db_field'=>'fav_movies', + 'clean_func' => 'Replacer', + 'auto_view'=>'yes', + ), + 'fav_music' => array( + 'title'=> lang("user_fav_music"), + 'type'=> "textarea", + 'name'=> "fav_music", + 'id'=> "fav_music", + 'value'=> cleanForm($default['fav_music']), + 'db_field'=>'fav_music', + 'clean_func' => 'Replacer', + 'auto_view'=>'yes', + ), + 'fav_books' => array( + 'title'=> lang("user_fav_books"), + 'type'=> "textarea", + 'name'=> "fav_books", + 'id'=> "fav_books", + 'value'=> cleanForm($default['fav_books']), + 'db_field'=>'fav_books', + 'clean_func' => 'Replacer', + 'auto_view'=>'yes', + ), + + ); + return $more_details; + } + + + /** + * Function used to load privacy fields + */ + function load_privacy_field($default) + { + if(!$default) + $default = $_POST; + + $privacy = array + ( + 'online_status' => array( + 'title'=> lang("online_status"), + 'type'=> "dropdown", + 'name'=> "privacy", + 'id'=> "privacy", + 'value'=> array('online'=>lang('online'),'offline'=>lang('offline'),'custom'=>lang('custom')), + 'checked'=>$default['online_status'], + 'db_field'=>'online_status', + ), + 'show_profile' => array( + 'title'=> lang("show_profile"), + 'type'=> "dropdown", + 'name'=> "show_profile", + 'id'=> "show_profile", + 'value'=> array('all'=>lang('all'),'members'=>lang('members'),'friends'=>lang('friends')), + 'checked'=>$default['show_profile'], + 'db_field'=>'show_profile', + 'sep' => ' ' + ), + 'allow_comments'=>array( + 'title'=> lang("vdo_allow_comm"), + 'type'=> "radiobutton", + 'name'=> "allow_comments", + 'id'=> "allow_comments", + 'value' => array('yes'=>lang('yes'),'no'=>lang('no')), + 'checked' => strtolower($default['allow_comments']), + 'db_field'=>'allow_comments', + 'sep' => ' ' + ), + 'allow_ratings'=>array( + 'title'=> lang("allow_ratings"), + 'type'=> "radiobutton", + 'name'=> "allow_ratings", + 'id'=> "allow_ratings", + 'value' => array('yes'=>lang('yes'),'no'=>lang('no')), + 'checked' => strtolower($default['allow_ratings']), + 'db_field'=>'allow_ratings', + 'sep' => ' ' + ), + 'allow_subscription'=>array( + 'title'=> lang("allow_subscription"), + 'type'=> "radiobutton", + 'name'=> "allow_subscription", + 'id'=> "allow_subscription", + 'hint_1' => lang('allow_subscription_hint'), + 'value' => array('yes'=>lang('yes'),'no'=>lang('no')), + 'checked' => strtolower($default['allow_subscription']), + 'db_field'=>'allow_subscription', + 'sep' => ' ' + ), + ); + + return $privacy; + } + + /** + * load_channel_settings + * + * @param $input defaults value for channel settings + * @return arra of channel info fields + */ + function load_channel_settings($default) + { + if(!$default) + $default = $_POST; + + $channel_settings = array + ( + 'profile_title' => array( + 'title'=> lang("channel_title"), + 'type'=> "textfield", + 'name'=> "profile_title", + 'id'=> "profile_title", + 'value'=> $default['profile_title'], + 'db_field'=>'profile_title', + 'auto_view'=>'no' + + ), + 'profile_desc' => array( + 'title'=> lang("channel_desc"), + 'type'=> "textarea", + 'name'=> "profile_desc", + 'id'=> "profile_desc", + 'value'=> $default['profile_desc'], + 'db_field'=>'profile_desc', + 'auto_view'=>'yes', + 'clean_func' => 'Replacer', + ), + 'show_my_friends'=>array( + 'title'=> lang("show_my_friends"), + 'type'=> "radiobutton", + 'name'=> "show_my_friends", + 'id'=> "show_my_friends", + 'value' => array('yes'=>lang('yes'),'no'=>lang('no')), + 'checked' => strtolower($default['show_my_friends']), + 'db_field'=>'show_my_friends', + 'sep' => ' ' + ), + 'show_my_videos'=>array( + 'title'=> lang("show_my_videos"), + 'type'=> "radiobutton", + 'name'=> "show_my_videos", + 'id'=> "show_my_videos", + 'value' => array('yes'=>lang('yes'),'no'=>lang('no')), + 'checked' => strtolower($default['show_my_videos']), + 'db_field'=>'show_my_videos', + 'sep' => ' ' + ), + 'show_my_photos'=>array( + 'title'=> lang("show_my_photos"), + 'type'=> "radiobutton", + 'name'=> "show_my_photos", + 'id'=> "show_my_photos", + 'value' => array('yes'=>lang('yes'),'no'=>lang('no')), + 'checked' => strtolower($default['show_my_photos']), + 'db_field'=>'show_my_photos', + 'sep' => ' ' + ), + 'show_my_subscriptions'=>array( + 'title'=> lang("show_my_subscriptions"), + 'type'=> "radiobutton", + 'name'=> "show_my_subscriptions", + 'id'=> "show_my_subscriptions", + 'value' => array('yes'=>lang('yes'),'no'=>lang('no')), + 'checked' => strtolower($default['show_my_subscriptions']), + 'db_field'=>'show_my_subscriptions', + 'sep' => ' ' + ), + 'show_my_subscribers'=>array( + 'title'=> lang("show_my_subscribers"), + 'type'=> "radiobutton", + 'name'=> "show_my_subscribers", + 'id'=> "show_my_subscribers", + 'value' => array('yes'=>lang('yes'),'no'=>lang('no')), + 'checked' => strtolower($default['show_my_subscribers']), + 'db_field'=>'show_my_subscribers', + 'sep' => ' ' + ), + 'show_my_collections'=>array( + 'title'=> lang("show_my_collections"), + 'type'=> "radiobutton", + 'name'=> "show_my_collections", + 'id'=> "show_my_collections", + 'value' => array('yes'=>lang('yes'),'no'=>lang('no')), + 'checked' => strtolower($default['show_my_collections']), + 'db_field'=>'show_my_collections', + 'sep' => ' ' + ), + + ); + + return $channel_settings; + } + + + /** + * load_user_fields + * + * @param $input default values for user profile fields + * @return array of user fields + * + * Function used to load Video fields + * in clipbucket v2.1 , video fields are loaded in form of groups arrays + * each group has it name and fields wrapped in array + * and that array will be part of video fields + */ + + function load_user_fields($default,$type='all') + { + $getChannelSettings = false; + $getProfileSettings = false; + $fields = array(); + + switch($type) + { + case "all": + { + $getChannelSettings = true; + $getProfileSettings = true; + } + break; + + case "channel": + case "channels": + { + $getChannelSettings = true; + } + break; + + case "profile": + case "profile_settings": + { + $getProfileSettings = true; + } + break; + + } + + + if($getChannelSettings) + { + $channel_settings = array + ( + array + ( + 'group_name' => lang('channel_settings'), + 'group_id' => 'channel_settings', + 'fields' => array_merge($this->load_channel_settings($default) + ,$this->load_privacy_field($default)), + ), + ); + } + + if($getProfileSettings) + { + $profile_settings = array + ( + array + ( + 'group_name' => lang('profile_basic_info'), + 'group_id' => 'profile_basic_info', + 'fields' => $this->load_personal_details($default), + ), + + array + ( + 'group_name' => lang('location'), + 'group_id'=> 'profile_location', + 'fields' => $this->load_location_fields($default) + ), + + array + ( + 'group_name' => lang('profile_education_interests'), + 'group_id' => 'profile_education_interests', + 'fields' => $this->load_education_interests($default) + ) + ); + + + //Adding Custom Fields + $custom_fields = $this->load_custom_profile_fields($default,false); + + if($custom_fields) + { + $more_fields_group = + array + ( + 'group_name' => lang('more_fields'), + 'group_id' => 'custom_fields', + 'fields' => $custom_fields, + ); + } + + //Loading Custom Profile Forms + $custom_fields_with_group = $this->load_custom_profile_fields($default,true); + + //Finaling putting them together in their main array called $fields + if($custom_fields_with_group) + { + $custFieldGroups = $custom_fields_with_group; + + foreach($custFieldGroups as $gKey => $fieldGroup) + { + + $group_id = $fieldGroup['group_id']; + + foreach($profile_settings as $key => $field) + { + + if($field['group_id'] == $group_id) + { + $inputFields = $field['fields']; + //Setting field values + $newFields = $fieldGroup['fields']; + + + + $mergeField = array_merge($inputFields,$newFields); + + + //Finally Updating array + $newGroupArray = + array + ( + 'group_name' => $field['group_name'], + 'group_id' => $field['group_id'], + 'fields' => $mergeField, + ); + + $fields[$key] = $newGroupArray; + + $matched = true; + break; + }else + $matched = false; + + } + + if(!$matched) + $profile_settings[] = $fieldGroup; + + } + } + + } + + + if($channel_settings) + $fields = array_merge($fields,$channel_settings); + if($profile_settings) + $fields = array_merge($fields,$profile_settings); + if($more_fields_group) + $fields[] = $more_fields_group; + return $fields; + } + + /** + * Used to rate photo + */ + function rate_user($id,$rating) + { + global $db,$json; + + if(!is_numeric($rating) || $rating <= 9) + $rating = 0; + if($rating >= 10) + $rating = 10; + + $c_rating = $this->current_rating($id); + $voters = $c_rating['voters']; + + $new_rate = $c_rating['rating']; + $rated_by = $c_rating['rated_by']; + + if(phpversion < '5.2.0') + $voters = $json->json_decode($voters,TRUE); + else + $voters = json_decode($voters,TRUE); + + if(!empty($voters)) + $already_voted = array_key_exists(userid(),$voters); + + if(!userid()) + e(lang("please_login_to_rate")); + elseif(userid()==$c_rating['userid'] && !config('own_channel_rating')) + e(lang("you_cant_rate_own_channel")); + elseif(!empty($already_voted)) + e(lang("you_have_already_voted_channel")); + elseif($c_rating['allow_ratings'] == 'no' || !config('channel_rating')) + e(lang("channel_rating_disabled")); + else + { + $voters[userid()] = array('rate'=>$rating,'time'=>NOW()); + if(phpversion < '5.2.0') + $voters = $json->json_encode($voters); + else + $voters = json_encode($voters); + + $t = $c_rating['rated_by'] * $c_rating['rating']; + $rated_by = $c_rating['rated_by'] + 1; + $new_rate = ($t + $rating) / $rated_by; + $db->update(tbl('user_profile'),array('rating','rated_by','voters'), + array("$new_rate","$rated_by","|no_mc|$voters"), + " userid = ".$id.""); + $userDetails = array( + "object_id" => $id, + "type" => "user", + "time" => now(), + "rating" => $rating, + "userid" => userid(), + "username" => username() + ); + /* Updating user details */ + update_user_voted($userDetails); + e(lang("thnx_for_voting"),"m"); + } + + $return = array("rating"=>$new_rate,"rated_by"=>$rated_by,'total'=>10,"id"=>$id,"type"=>"user","disable"=>"disabled"); + return $return; + } + + + /** + * Used to get current rating + */ + function current_rating($id) + { + global $db; + $result = $db->select(tbl('user_profile'),'userid,allow_ratings,rating,rated_by,voters'," userid = ".$id.""); + if($result) + return $result[0]; + else + return false; + } + + + /** + * function used to check weather user is online or not + */ + function isOnline($last_active,$status=NULL) + { + $time = strtotime($last_active); + $timeDiff = time() - $time; + if($timeDiff>60 || $status=='offline') + return false; + else + return true; + } + + + /** + * Function used to get list of subscribed users and then + * send subscription email + */ + function sendSubscriptionEmail($vidDetails,$updateStatus=true) + { + global $cbemail,$db; + $v = $vidDetails; + if(!$v['videoid']) + { + e(lang("invalid_videoid")); + return false; + } + + if(!$v['userid']) + { + e(lang("invalid_userid")); + return false; + } + + //Lets get the list of subscribers + $subscribers = $this->get_user_subscribers_detail($v['userid'],false); + //Now lets get details of our uploader bhai saab + $uploader = $this->get_user_details($v['userid']); + //Loading subscription email template + $tpl = $cbemail->get_template('video_subscription_email'); + + $total_subscribers = count($subscribers); + if($subscribers) + foreach($subscribers as $subscriber) + { + $var = $this->custom_subscription_email_vars; + + $more_var = array + ('{username}' => $subscriber['username'], + '{uploader}' => $uploader['username'], + '{video_title}' => $v['title'], + '{video_description}' => $v['description'], + '{video_link}' => video_link($v), + '{video_thumb}' => get_thumb($v), + ); + if(!is_array($var)) + $var = array(); + $var = array_merge($more_var,$var); + $subj = $cbemail->replace($tpl['email_template_subject'],$var); + $msg = nl2br($cbemail->replace($tpl['email_template'],$var)); + + //Now Finally Sending Email + + cbmail(array('to'=>$subscriber['email'],'from'=>WELCOME_EMAIL,'subject'=>$subj,'content'=>$msg)); + + } + + if($total_subscribers) + { + //Updating video subscription email status to sent + if($updateStatus) + $db->update(tbl('video'),array('subscription_email'),array('sent')," videoid='".$v['videoid']."'"); + $s = ""; + if($total_subscribers>1) + $s = "s"; + e(sprintf(lang('subs_email_sent_to_users'),$total_subscribers,$s),"m"); + return true; + } + + e(lang("no_user_subscribed_to_uploader")); + + return true; + } + + /** + * function used to get user seesions + */ + function get_sessions() + { + global $sess; + $sessions = $sess->get_sessions(); + $new_sessions = array(); + if($sessions) + { + foreach($sessions as $session) + { + $new_sessions[$session['session_string']] = $session; + } + }else + { + $sess->add_session(0,'guest','guest'); + } + + return $new_sessions; + } + + function update_user_voted($array,$userid=NULL) + { + global $db; + //$voted = array(); + if(!$userid) + $userid = userid(); + if(phpversion < '5.2.0') + { + global $json; + $js = $json; + } + if(is_array($array)) + { + $votedDetails = $db->select(tbl("users"),"voted"," userid = '$userid'"); + if(!empty($votedDetails)) + if(!empty($js)) + $voted = $js->json_decode($votedDetails[0]['voted'],TRUE); + else + $voted = json_decode($votedDetails[0]['voted'],TRUE); + + //$votedArray = $voted; + $voted[] = $array; + + if(!empty($js)) + $votedEncode = $js->json_encode($voted); + else + $votedEncode = json_encode($voted); + + if(!empty($votedEncode)) + $db->update(tbl("users"),array("voted"),array("|no_mc|$votedEncode")," userid='$userid'"); + } + } +} +?> \ No newline at end of file diff --git a/upload/includes/classes/video.class.php b/upload/includes/classes/video.class.php new file mode 100644 index 00000000..3d4931a1 --- /dev/null +++ b/upload/includes/classes/video.class.php @@ -0,0 +1,1732 @@ +'video'); + + var $video_manager_links = array(); + var $video_manager_funcs = array(); + + var $video_delete_functions = array(); //Holds all delete functions of video + + /** + * __Constructor of CBVideo + */ + function init() + { + global $Cbucket; + $this->cat_tbl = 'video_categories'; + $this->section_tbl = 'video'; + $this->use_sub_cats = TRUE; + $this->init_actions(); + $this->init_collections(); + + if(config('vid_cat_height')); + $this->cat_thumb_height = config('vid_cat_height'); + if(config('vid_cat_width')); + $this->cat_thumb_width = config('vid_cat_width'); + + if(isSectionEnabled('videos')) + $Cbucket->search_types['videos'] = "cbvid"; + $Cbucket->clipbucket_footer[] = 'check_cbvideo'; + + $this->video_delete_functions[] = 'delete_video_from_collection'; + } + + /** + * Initiating Collections + */ + function init_collections() + { + $this->collection = new Collections(); + $this->collection->objType = "v"; + $this->collection->objClass = "cbvideo"; + $this->collection->objTable = "video"; + $this->collection->objName = "Video"; + $this->collection->objFunction = "video_exists"; + $this->collection->objFieldID = "videoid"; + } + + + /** + * Function used to check weather video exists or not + * @param VID or VKEY + */ + function video_exists($vid) + { + global $db; + if(is_numeric($vid)) + return $db->count(tbl("video"),"videoid"," videoid='$vid' "); + else + return $db->count(tbl("video"),"videoid"," videokey='$vid' "); + //return $this->get_video($vid); + } + function exists($vid){return $this->video_exists($vid);} + function videoexists($vid){return $this->video_exists($vid);} + + + /** + * Function used to get video data + */ + function get_video($vid,$file=false) + { + global $db; + + $userFields = "users.userid,users.username,users.avatar,users.avatar_url,users.email"; + + if(!$file) + { + if(is_numeric($vid)) + $results = $db->select(tbl("video,users"),tbl("video.*,$userFields"),tbl("video.videoid='$vid'")." AND ".tbl("video.userid=").tbl("users.userid")); + else + $results = $db->select(tbl("video,users"),tbl("video.*,$userFields"),tbl("video.videokey='$vid'")." AND ".tbl("video.userid=").tbl("users.userid")); + }else + { + $results = $db->select(tbl("video,users"),tbl("video.*,$userFields"),tbl("video.file_name='$vid'")." AND ".tbl("video.userid=").tbl("users.userid")); + } + + if($db->num_rows>0) + { + return $results[0]; + }else{ + return false; + } + } + function getvideo($vid){return $this->get_video($vid);} + function get_video_data($vid){return $this->get_video($vid);} + function getvideodata($vid){return $this->get_video($vid);} + function get_video_details($vid){return $this->get_video($vid);} + function getvideodetails($vid){return $this->get_video($vid);} + + /** + * Function used to perform several actions with a video + */ + function action($case,$vid) + { + global $db,$eh; + $video = $this->get_video_details($vid); + + if(!$video) + return false; + //Lets just check weathter video exists or not + switch($case) + { + //Activating a video + case 'activate': + case 'av': + case 'a': + { + $db->update(tbl("video"),array('active'),array('yes')," videoid='$vid' OR videokey = '$vid' "); + e(lang("class_vdo_act_msg"),'m'); + + if(SEND_VID_APPROVE_EMAIL=='yes') + { + //Sending Email + global $cbemail,$userquery; + $tpl = $cbemail->get_template('video_activation_email'); + $user_fields = $userquery->get_user_field($video['userid'],"username,email"); + $more_var = array + ('{username}' => $user_fields['username'], + '{video_link}' => videoLink($video) + ); + if(!is_array($var)) + $var = array(); + $var = array_merge($more_var,$var); + $subj = $cbemail->replace($tpl['email_template_subject'],$var); + $msg = nl2br($cbemail->replace($tpl['email_template'],$var)); + + //Now Finally Sending Email + cbmail(array('to'=>$user_fields['email'],'from'=>WEBSITE_EMAIL,'subject'=>$subj,'content'=>$msg)); + } + + + if(($video['broadcast']=='public' || $video['broadcast'] =="logged") + && $video['subscription_email']=='pending') + { + //Sending Subscription email in background + if (stristr(PHP_OS, 'WIN')) + { + exec(php_path()." -q ".BASEDIR."/actions/send_subscription_email.php $vid "); + } else { + exec(php_path()." -q ".BASEDIR."/actions/send_subscription_email.php $vid &> /dev/null &"); + } + } + } + break; + + //Deactivating a video + case "deactivate": + case "dav": + case "d": + { + $db->update(tbl("video"),array('active'),array('no')," videoid='$vid' OR videokey = '$vid' "); + e(lang("class_vdo_act_msg1"),'m'); + } + break; + + //Featuring Video + case "feature": + case "featured": + case "f": + { + $db->update(tbl("video"),array('featured','featured_date'),array('yes',now())," videoid='$vid' OR videokey = '$vid' "); + e(lang("class_vdo_fr_msg"),'m'); + } + break; + + + //Unfeatured video + case "unfeature": + case "unfeatured": + case "uf": + { + $db->update(tbl("video"),array('featured'),array('no')," videoid='$vid' OR videokey = '$vid' "); + e(lang("class_fr_msg1"),'m'); + } + break; + } + } + + + + /** + * Function used to update video + */ + function update_video($array=NULL) + { + global $eh,$Cbucket,$db,$Upload; + + $Upload->validate_video_upload_form(NULL,TRUE); + + if(empty($eh->error_list)) + { + $required_fields = $Upload->loadRequiredFields($array); + $location_fields = $Upload->loadLocationFields($array); + $option_fields = $Upload->loadOptionFields($array); + + $upload_fields = array_merge($required_fields,$location_fields,$option_fields); + + //Adding Custom Upload Fields + if(count($Upload->custom_upload_fields)>0) + $upload_fields = array_merge($upload_fields,$Upload->custom_upload_fields); + + //Adding Custom Form Fields + if(count($Upload->custom_form_fields)>0) + $upload_fields = array_merge($upload_fields,$Upload->custom_form_fields); + + //Adding custom fields from group + if(count($Upload->custom_form_fields_groups)>0) + { + $custom_fields_from_group_fields = array(); + $custom_fields_from_group = $Upload->custom_form_fields_groups; + foreach($custom_fields_from_group as $cffg) + { + $custom_fields_from_group_fields = array_merge($custom_fields_from_group_fields,$cffg['fields']); + } + + $upload_fields = array_merge($upload_fields,$custom_fields_from_group_fields); + } + + + if(!$array) + $array = $_POST; + + $vid = $array['videoid']; + + if(is_array($_FILES)) + $array = array_merge($array,$_FILES); + + + foreach($upload_fields as $field) + { + $name = formObj::rmBrackets($field['name']); + $val = $array[$name]; + + if(empty($val) && $field['use_if_value']) + { + }else + { + if($field['use_func_val']) + $val = $field['validate_function']($val); + + + if(!empty($field['db_field'])) + $query_field[] = $field['db_field']; + + if(is_array($val)) + { + $new_val = ''; + foreach($val as $v) + { + $new_val .= "#".$v."# "; + } + $val = $new_val; + } + if(!$field['clean_func'] || (!apply_func($field['clean_func'],$val) && !is_array($field['clean_func']))) + $val = ($val); + else + $val = apply_func($field['clean_func'],sql_free('|no_mc|'.$val)); + + if(!empty($field['db_field'])) + $query_val[] = $val; + + } + + } + + #$query = "INSERT INTO video ("; + $total_fields = count($query_field); + + /*for($key=0;$key<$total_fields;$key++) + { + $query .= query_field[$key]." = '".$query_val[$key]."'" ; + if($key<$total_fields-1) + $query .= ','; + }*/ + + if(has_access('admin_access',TRUE)) + { + if(!empty($array['status'])) + { + $query_field[] = 'status'; + $query_val[] = $array['status']; + } + + if(!empty($array['duration']) && is_numeric($array['duration']) && $array['duration']>0) + { + $query_field[] = 'duration'; + $query_val[] = $array['duration']; + } + + if(!empty($array['views'])) + { + $query_field[] = 'views'; + $query_val[] = $array['views']; + } + + if(!empty($array['rating'])) + { + $query_field[] = 'rating'; + $rating = $array['rating']; + if(!is_numeric($rating) || $rating<0 || $rating>10) + $rating = 1; + $query_val[] = $rating; + } + + if(!empty($array['rated_by'])) + { + $query_field[] = 'rated_by'; + $query_val[] = $array['rated_by']; + } + } + + if(!userid()) + { + e(lang("you_dont_have_permission_to_update_this_video")); + }elseif(!$this->video_exists($vid)){ + e(lang("class_vdo_del_err")); + }elseif(!$this->is_video_owner($vid,userid()) && !has_access('admin_access',TRUE)) + { + e(lang("no_edit_video")); + }else{ + //pr($upload_fields); + + $db->update(tbl('video'),$query_field,$query_val," videoid='$vid'"); + //echo $db->db_query; + e(lang("class_vdo_update_msg"),'m'); + } + + } + } + + + /** + * Function used to delete a video + */ + function delete_video($vid) + { + global $db; + + if($this->video_exists($vid)) + { + + $vdetails = $this->get_video($vid); + + if($this->is_video_owner($vid,userid()) || has_access('admin_access',TRUE)) + { + #THIS SHOULD NOT BE REMOVED :O + //list of functions to perform while deleting a video + $del_vid_funcs = $this->video_delete_functions; + if(is_array($del_vid_funcs)) + { + foreach($del_vid_funcs as $func) + { + if(function_exists($func)) + { + $func($vdetails); + } + } + } + + //Finally Removing Database entry of video + $db->execute("DELETE FROM ".tbl("video")." WHERE videoid='$vid'"); + //Removing Video From Playlist + $db->execute("DELETE FROM ".tbl("playlist_items")." WHERE object_id='$vid' AND playlist_item_type='v'"); + + $db->update(tbl("users"),array("total_videos"),array("|f|total_videos-1")," userid='".$vdetails['userid']."'"); + + //Removing video Comments + $db->delete(tbl("comments"),array("type","type_id"),array("v",$vdetails['videoid'])); + //Removing video From Favortes + $db->delete(tbl("favorites"),array("type","id"),array("v",$vdetails['videoid'])); + + e(lang("class_vdo_del_msg"),'m'); + }else{ + e(lang("You cannot delete this video")); + } + }else{ + e(lang("class_vdo_del_err")); + } + + } + + /** + * Function used to remove video thumbs + */ + function remove_thumbs($vdetails) + { + //First lets get list of all thumbs + $thumbs = get_thumb($vdetails,1,true,false,false); + if(!is_default_thumb($thumbs)) + { + if(is_array($thumbs)) + { + foreach($thumbs as $thumb) + { + $file = THUMBS_DIR.'/'.$thumb; + if(file_exists($file) && is_file($file)) + unlink($file); + } + }else{ + $file = THUMBS_DIR.'/'.$thumbs; + if(file_exists($file) && is_file($file)) + unlink($file); + } + + e(lang("vid_thumb_removed_msg"),'m'); + } + } + + + + /** + * Function used to remove video log + */ + function remove_log($vdetails) + { + global $db; + $src = $vdetails['videoid']; + $file = LOGS_DIR.'/'.$vdetails['file_name'].'.log'; + $db->execute("DELETE FROM ".tbl("video_file")." WHERE src_name = '$src'"); + if(file_exists($file)) + unlink($file); + e(lang("vid_log_delete_msg"),'m'); + } + + /** + * Function used to remove video files + */ + function remove_files($vdetails) + { + //Return nothing incase there is no input + if(!$vdetails) + { + e("No input details specified"); + return false; + } + //Callign Video Delete Functions + call_delete_video_function($vdetails); + + //Getting list of files + $files = get_video_file($vdetails,false,false,true); + if(is_array($files)) + { + foreach($files as $file) + { + if(file_exists(VIDEOS_DIR.'/'.$file) && is_file(VIDEOS_DIR.'/'.$file)) + unlink(VIDEOS_DIR.'/'.$file); + } + }else{ + if(file_exists(VIDEOS_DIR.'/'.$files) && is_file(VIDEOS_DIR.'/'.$files)) + unlink(VIDEOS_DIR.'/'.$files); + } + e(lang("vid_files_removed_msg"),'m'); + } + + + /** + * Function used to get videos + * this function has all options + * that you need to fetch videos + * please see docs.clip-bucket.com for more details + */ + function get_videos($params) + { + global $db; + + $limit = $params['limit']; + $order = $params['order']; + + $cond = ""; + $superCond = ""; + if(!has_access('admin_access',TRUE)) + $superCond = $cond .= " ".tbl("video.status")."='Successful' AND + ".tbl("video.active")."='yes' AND ".tbl("video.broadcast")." !='unlisted' "; + else + { + if($params['active']) + $cond .= " ".tbl("video.active")."='".$params['active']."'"; + + if($params['status']) + { + if($cond!='') + $cond .=" AND "; + $cond .= " ".tbl("video.status")."='".$params['status']."'"; + } + if($params['broadcast']) + { + if($cond!='') + $cond .=" AND "; + $cond .= " ".tbl("video.broadcast")."='".$params['broadcast']."'"; + } + } + + //Setting Category Condition + $all = false; + if(!is_array($params['category'])) + if(strtolower($params['category'])=='all') + $all = true; + + if($params['category'] && !$all) + { + if($cond!='') + $cond .= ' AND '; + + $cond .= " ("; + + if(!is_array($params['category'])) + { + $cats = explode(',',$params['category']); + }else + $cats = $params['category']; + + $count = 0; + + foreach($cats as $cat_params) + { + $count ++; + if($count>1) + $cond .=" OR "; + $cond .= " ".tbl("video.category")." LIKE '%#$cat_params#%' "; + } + + $cond .= ")"; + } + + //date span + if($params['date_span']) + { + if($cond!='') + $cond .= ' AND '; + + if($params['date_span_column']) + $column = $params['date_span_column']; + else + $column = 'date_added'; + + $cond .= " ".cbsearch::date_margin($column,$params['date_span']); + } + + //uid + if($params['user']) + { + if(!is_array($params['user'])) + { + if($cond!='') + $cond .= ' AND '; + $cond .= " ".tbl("video.userid")."='".$params['user']."'"; + }else + { + if($cond!='') + $cond .= ' AND ('; + + $uQu = 0; + foreach($params['user'] as $user) + { + if($uQu>0) + $cond .= ' OR '; + $cond .= " ".tbl("video.userid")."='".$user."'"; + $uQu++; + } + + $cond .=" ) "; + } + + } + + //non-uid to exclude user videos from related + if($params['nonuser']) + { + if($cond!='') + $cond .= ' AND '; + $cond .= " ".tbl("video.userid")." <> '".$params['nonuser']."' "; + + } + + $tag_n_title=''; + //Tags + if($params['tags']) + { + //checking for commas ;) + $tags = explode(",",$params['tags']); + if(count($tags)>0) + { + if($tag_n_title!='') + $tag_n_title .= ' OR '; + $total = count($tags); + $loop = 1; + foreach($tags as $tag) + { + $tag_n_title .= " ".tbl('video.tags')." LIKE '%".$tag."%'"; + if($loop<$total) + $tag_n_title .= " OR "; + $loop++; + + } + }else + { + if($tag_n_title!='') + $tag_n_title .= ' OR '; + $tag_n_title .= " ".tbl('video.tags')." LIKE '%".$params['tags']."%'"; + } + } + //TITLE + if($params['title']) + { + if($tag_n_title!='') + $tag_n_title .= ' OR '; + $tag_n_title .= " ".tbl('video.title')." LIKE '%".$params['title']."%'"; + } + + if($tag_n_title) + { + if($cond!='') + $cond .= ' AND '; + $cond .= " ($tag_n_title) "; + } + + //FEATURED + if($params['featured']) + { + if($cond!='') + $cond .= ' AND '; + $cond .= " ".tbl("video.featured")." = '".$params['featured']."' "; + } + + //VIDEO ID + if($params['videoid']) + { + if($cond!='') + $cond .= ' AND '; + $cond .= " ".tbl("video.videoid")." = '".$params['videoid']."' "; + } + + //VIDEO ID + if($params['videoids']) + { + if(is_array($params['videoids'])) + { + if($cond!='') + $cond .= ' AND '; + $cond .= ' ( '; + $curVid = 0; + foreach($params['videoids'] as $vid) + { + if(is_numeric($vid)) + { + if($curVid>0) + $cond .= " OR "; + $cond .= " ".tbl("video.videoid")." = '".$vid."' "; + } + $curVid++; + } + $cond .= ' ) '; + } + } + + //VIDEO KEY + if($params['videokey']) + { + + if(!is_array($params['videokey'])) + { + if($cond!='') + $cond .= ' AND '; + $cond .= " ".tbl("video.videokey")." = '".$params['videokey']."' "; + }else + { + if($cond!='') + $cond .= ' AND ('; + + $vkeyQue = 0; + foreach($params['videokey'] as $videokey) + { + if($vkeyQue>0) + $cond .= ' OR '; + $cond .= " ".tbl("video.videokey")." = '".$videokey."' "; + $vkeyQue++; + } + + $cond .=" ) "; + } + } + + + //Exclude Vids + if($params['exclude']) + { + if(!is_array($params['exclude'])) + { + if($cond!='') + $cond .= ' AND '; + $cond .= " ".tbl('video.videoid')." <> '".$params['exclude']."' "; + }else + { + foreach($params['exclude'] as $exclude) + { + if($cond!='') + $cond .= ' AND '; + $cond .= " ".tbl('video.videoid')." <> '".$exclude."' "; + } + } + } + + //Duration + + if($params['duration']) + { + $duration_op = $params['duration_op']; + if(!$duration_op) $duration_op = "="; + + if($cond!='') + $cond .= ' AND '; + $cond .= " ".tbl('video.duration')." ".$duration_op." '".$params['duration']."' "; + } + + //Filename + + if($params['filename']) + { + if(!is_array($params['filename'])) + { + if($cond!='') + $cond .= ' AND '; + $cond .= " ".tbl('video.file_name')." <> '".$params['filename']."' "; + }else + { + if($cond!='') + $cond .= ' AND ('; + + $fileNameQue = 0; + foreach($params['filename'] as $filename) + { + if($fileNameQue>0) + $cond .= ' OR '; + $cond .= " ".tbl("video.file_name")." = '".$filename."' "; + $fileNameQue++; + } + + $cond .=" ) "; + } + } + + if($params['cond']) + { + if($params['cond_and']) + if($cond!='') + $cond .= ' AND '; + $cond .= " ".$params['cond']; + } + + + $functions = cb_get_functions('get_videos'); + if($functions) + { + foreach($functions as $func) + { + $array = array('params'=>$params,'cond'=>$cond); + if(function_exists($func['func'])) + { + $returned = $func['func']($array); + if($returned) + $cond = $returned; + } + } + } + + + if(!$params['count_only'] && !$params['show_related']) + { + if(!empty($cond)) + $cond .= " AND "; + $result = $db->select(tbl('video,users'),tbl('video.*,users.userid,users.username'),$cond." ".tbl("video.userid")." = ".tbl("users.userid"),$limit,$order); + //echo $db->db_query; + } + + + if($params['show_related']) + { + $cond = ""; + if($superCond) + $cond = $superCond." AND "; + + $cond .= "MATCH(".tbl("video.title,video.tags").") + AGAINST ('".cbsearch::set_the_key($params['title'])."' IN BOOLEAN MODE) "; + if($params['exclude']) + { + if($cond!='') + $cond .= ' AND '; + $cond .= " ".tbl('video.videoid')." <> '".$params['exclude']."' "; + } + + $result = $db->select(tbl('video,users'),tbl('video.*,users.userid,users.username'), + $cond." AND ".tbl("video.userid")." = ".tbl("users.userid"),$limit,$order); + if($db->num_rows == 0) + { + $cond = ""; + if($superCond) + $cond = $superCond." AND "; + //Try Finding videos via tags + $cond .= "MATCH(".tbl("video.title,video.tags").") + AGAINST ('".cbsearch::set_the_key($params['tags'])."' IN BOOLEAN MODE) "; + if($params['exclude']) + { + if($cond!='') + $cond .= ' AND '; + $cond .= " ".tbl('video.videoid')." <> '".$params['exclude']."' "; + } + $result = $db->select(tbl('video,users'),tbl('video.*,users.userid,users.username'), + $cond." AND ".tbl("video.userid")." = ".tbl("users.userid"),$limit,$order); + } + assign($params['assign'],$result); + } + + if($params['pr']) pr($result,true); + if($params['count_only']) + return $result = $db->count(tbl('video'),'*',$cond); + if($params['assign']) + assign($params['assign'],$result); + else + return $result; + } + + /** + * Function used to count total video comments + */ + function count_video_comments($id) + { + global $db; + $total_comments = $db->count(tbl('comments'),"comment_id","type='v' AND type_id='$id'"); + return $total_comments; + } + + + /** + * Function used to update video comments count + */ + function update_comments_count($id) + { + global $db; + $total_comments = $this->count_video_comments($id); + $db->update(tbl("video"),array("comments_count","last_commented"),array($total_comments,now())," videoid='$id'"); + } + + /** + * Function used to add video comment + */ + function add_comment($comment,$obj_id,$reply_to=NULL,$force_name_email=false) + { + global $myquery,$db; + + $video = $this->get_video_details($obj_id); + + if(!$video) + e(lang("class_vdo_del_err")); + else + { + //Getting Owner Id + $owner_id = $this->get_video_owner($obj_id,true); + $add_comment = $myquery->add_comment($comment,$obj_id,$reply_to,'v',$owner_id,videoLink($video),$force_name_email); + if($add_comment) + { + //Loggin Comment + $log_array = array + ( + 'success'=>'yes', + 'details'=> "comment on a video", + 'action_obj_id' => $obj_id, + 'action_done_id' => $add_comment, + ); + insert_log('video_comment',$log_array); + + //Updating Number of comments of video + $this->update_comments_count($obj_id); + } + return $add_comment; + } + } + + /** + * Function used to remove video comment + */ + function delete_comment($cid,$is_reply=FALSE) + { + global $myquery,$db; + $remove_comment = $myquery->delete_comment($cid,'v',$is_reply); + if($remove_comment) + { + //Updating Number of comments of video + $this->update_comments_count($obj_id); + } + return $remove_comment; + } + + + /** + * Function used to generate Embed Code + */ + function embed_code($vdetails,$type='embed_object') + { + //Checking for video details + if(!is_array($vdetails)) + { + $vdetails = $this->get_video($vdetails); + } + + $embed_code = false; + + $funcs = $this->embed_func_list; + + if(is_array($funcs)) + { + foreach($funcs as $func) + { + if(@function_exists($func)) + $embed_code = $func($vdetails); + + if($embed_code) + break; + } + } + + + if($type=='iframe') + { + $embed_code = ''; + } + + if(!$embed_code) + { + + //Default ClipBucket Embed Code + if(function_exists('default_embed_code')) + { + $embed_code = default_embed_code($vdetails); + }else + { + //return new Embed Code + $vid_file = get_video_file($vdetails,false,false); + if($vid_file) + { + $code = ''; + $code .= ''; + $code .= ''; + $code .= ''; + $code .= ''; + $code .= 'action = new cbactions(); + $this->action->init(); + $this->action->type = 'v'; + $this->action->name = 'video'; + $this->action->obj_class = 'cbvideo'; + $this->action->check_func = 'video_exists'; + $this->action->type_tbl = $this->dbtbl['video']; + $this->action->type_id_field = 'videoid'; + } + + + + /** + * Function used to create value array for email templates + * @param video_details ARRAY + */ + function set_share_email($details) + { + $this->email_template_vars = array + ('{video_title}' => $details['title'], + '{video_description}' => $details['description'], + '{video_tags}' => $details['tags'], + '{video_date}' => cbdate(DATE_FORMAT,strtotime($details['date_added'])), + '{video_link}' => video_link($details), + '{video_thumb}'=> GetThumb($details) + ); + + $this->action->share_template_name = 'share_video_template'; + $this->action->val_array = $this->email_template_vars; + } + + + /** + * Function used to use to initialize search object for video section + * op=>operator (AND OR) + */ + function init_search() + { + + $this->search = new cbsearch; + $this->search->db_tbl = "video"; + $this->search->columns =array( + array('field'=>'title','type'=>'LIKE','var'=>'%{KEY}%'), + array('field'=>'tags','type'=>'LIKE','var'=>'%{KEY}%','op'=>'OR'), + array('field'=>'broadcast','type'=>'!=','var'=>'unlisted','op'=>'AND','value'=>'static'), + array('field'=>'status','type'=>'=','var'=>'Successful','op'=>'AND','value'=>'static') + ); + $this->search->use_match_method = true; + $this->search->match_fields = array("title","tags"); + + $this->search->cat_tbl = $this->cat_tbl; + + $this->search->display_template = LAYOUT.'/blocks/video.html'; + $this->search->template_var = 'video'; + $this->search->has_user_id = true; + + /** + * Setting up the sorting thing + */ + + $sorting = array( + 'date_added'=> lang("date_added"), + 'views' => lang("views"), + 'comments' => lang("comments"), + 'rating' => lang("rating"), + 'favorites' => lang("favorites") + ); + + $this->search->sorting = array( + 'date_added'=> " date_added DESC", + 'views' => " views DESC", + 'comments' => " comments_count DESC ", + 'rating' => " rating DESC", + 'favorites' => " favorites DeSC" + ); + /** + * Setting Up The Search Fields + */ + + $default = $_GET; + if(is_array($default['category'])) + $cat_array = array($default['category']); + $uploaded = $default['datemargin']; + $sort = $default['sort']; + + $this->search->search_type['videos'] = array('title'=>lang('videos')); + $this->search->results_per_page = config('videos_items_search_page'); + + $fields = array( + 'query' => array( + 'title'=> lang('keywords'), + 'type'=> 'textfield', + 'name'=> 'query', + 'id'=> 'query', + 'value'=>cleanForm($default['query']) + ), + 'category' => array( + 'title' => lang('vdo_cat'), + 'type' => 'checkbox', + 'name' => 'category[]', + 'id' => 'category', + 'value' => array('category',$cat_array), + ), + 'uploaded' => array( + 'title' => lang('uploaded'), + 'type' => 'dropdown', + 'name' => 'datemargin', + 'id' => 'datemargin', + 'value' => $this->search->date_margins(), + 'checked' => $uploaded, + ), + 'sort' => array( + 'title' => lang('sort_by'), + 'type' => 'dropdown', + 'name' => 'sort', + 'value' => $sorting, + 'checked' => $sort + ) + ); + + $this->search->search_type['videos']['fields'] = $fields; + } + + + /* + * Function used to update video and set a thumb as default + * @param VID + * @param THUMB NUM + */ + function set_default_thumb($vid,$thumb) + { + global $db,$LANG; + $num = get_thumb_num($thumb); + $file = THUMBS_DIR.'/'.$thumb; + //if(file_exists($file)) + //{ + $db->update(tbl("video"),array("default_thumb"),array($num)," videoid='$vid'"); + e(lang('vid_thumb_changed'),'m'); + //}else{ + // e(lang('vid_thumb_change_err')); + //} + } + + + /** + * Function used to get video owner + */ + function get_video_owner($vid,$idonly=false) + { + global $db; + if($idonly) + { + $results = $db->select(tbl("video"),"userid"," videoid='$vid' ",1); + if($db->num_rows>0) + return $results[0]['userid']; + else + return false; + }else{ + $results = $db->select(tbl("video"),"*"," videoid='$vid' ",1); + if($db->num_rows>0) + return $results[0]; + else + return false; + } + } + + /** + * Function used to check weather current user is video owner or not + */ + function is_video_owner($vid,$uid) + { + global $db; + + $result = $db->count(tbl($this->dbtbl['video']),'videoid',"videoid='$vid' AND userid='$uid' "); + if($result>0) + return true; + else + return false; + } + + /** + * Function used to display video manger link + */ + function video_manager_link($link,$vid) + { + if(function_exists($link) && !is_array($link)) + { + return $link($vid); + }else + { + if(!empty($link['title']) && !empty($link['link'])) + { + return ''.$link['title'].''; + } + } + } + + + + /** + * Function used to get video rating details + */ + function get_video_rating($id) + { + global $db; + if(is_numeric($id)) + { + $results = $db->select(tbl("video"),"userid,allow_rating,rating,rated_by,voter_ids"," videoid='$id'"); + }else + $results = $db->select(tbl("video"),"userid,allow_rating,rating,rated_by,voter_ids"," videokey='$id'"); + if($db->num_rows>0) + return $results[0]; + else + return false; + } + + /** + * Function used to display rating option for videos + * this is an OLD TYPICAL RATING SYSTEM + * and yes, still with AJAX + */ + function show_video_rating($params) + { + $rating = $params['rating']; + $ratings = $params['ratings']; + $total = $params['total']; + $id = $params['id']; + $type = $params['type']; + + //Checking Percent + { + if($total<=10) + $total = 10; + $perc = $rating*100/$total; + $disperc = 100 - $perc; + if($ratings <= 0 && $disperc == 100) + $disperc = 0; + } + + $perc = $perc.'%'; + $disperc = $disperc.'%'; + $likes = round($ratings*$perc/100); // get lowest integer + + if($params['is_rating']) + { + if(error()) + { + $rating_msg = error(); + $rating_msg = ''.$rating_msg[0].''; + } + if(msg()) + { + $rating_msg = msg(); + $rating_msg = ''.$rating_msg[0].''; + } + } + + assign('perc',$perc); + assign('disperc',$disperc); + assign('id',$id); + assign('type',$type); + assign('id',$id); + assign('rating_msg',$rating_msg); + assign("likes",$likes); + assign("dislikes",($ratings-$likes)); + assign('disable',$params['disable']); + + Template('blocks/rating.html'); + + } + + + /** + * Function used to rate video + */ + function rate_video($id,$rating) + { + global $db; + + if(!is_numeric($rating) || $rating <= 9) + $rating = 0; + if($rating >= 10) + $rating = 10; + + $rating_details = $this->get_video_rating($id); + $voter_id = $rating_details['voter_ids']; + + $new_by = $rating_details['rated_by']; + $newrate = $rating_details['rating']; + if(phpversion < '5.2.0') + global $json; $js = $json; + + $Oldvoters = explode('|',$voter_id); + + if(is_array($Oldvoters) && count($Oldvoters)>2) + { + foreach($Oldvoters as $voter) + { + if($voter) + { + $voters[$voter] = array( + "userid" => $voter, + "time" => now(), + "method" => 'old', + ); + } + } + }else + { + if(!empty($js)) + $voters = $js->json_decode($voter_id,TRUE); + else + $voters = json_decode($voter_id,TRUE); + } + + if(!empty($voters)) + $already_voted = array_key_exists(userid(),$voters); + + if(!userid()) + e(lang("please_login_to_rate")); + elseif(userid()==$rating_details['userid'] && !config('own_video_rating')) + e(lang("you_cant_rate_own_video")); + elseif(!empty($already_voted)) + e(lang("you_hv_already_rated_vdo")); + elseif(!config('video_rating') || $rating_details['allow_rating'] !='yes' ) + e(lang("vid_rate_disabled")); + else + { + $voters[userid()] = array( + "userid" => userid(), + "username" => username(), + "time" => now(), + "rating" => $rating + ); + + $total_voters = count($voters); + + if(!empty($js)) + $voters = $js->json_encode($voters); + else + $voters = json_encode($voters); + + $t = $rating_details['rated_by'] * $rating_details['rating']; + //$new_by = $rating_details['rated_by'] + 1; + $new_by = $total_voters; + + $newrate = ($t + $rating) / $new_by; + if($newrate>10) + $newrate = 10; + $db->update(tbl($this->dbtbl['video']),array("rating","rated_by","voter_ids"),array($newrate,$new_by,"|no_mc|$voters")," videoid='$id'"); + $userDetails = array( + "object_id" => $id, + "type" => "video", + "time" => now(), + "rating" => $rating, + "userid" => userid(), + "username" => username() + ); + /* Updating user details */ + update_user_voted($userDetails); + e(lang("thnx_for_voting"),"m"); + } + + $result = array('rating'=>$newrate,'ratings'=>$new_by,'total'=>10,'id'=>$id,'type'=>'video','disable'=>'disabled'); + return $result; + + + /* + Following code is unused + $niddle = "|"; + $niddle .= userid(); + $niddle .= "|"; + $flag = strstr($voter_id, $niddle); + + //checking if raings are allowed or not + $vid_rating = config('video_rating'); + + if(!userid()) + e(lang("please_login_to_rate")); + elseif(userid()==$rating_details['userid'] && !config('own_video_rating')) + e(lang("you_cant_rate_own_video")); + elseif(!empty($flag)) + e(lang("you_hv_already_rated_vdo")); + elseif(!config('video_rating') || $rating_details['allow_rating'] !='yes' ) + e(lang("vid_rate_disabled")); + else + { + if(empty($voter_id)) + $voter_id .= "|"; + $voter_id .= userid(); + $voter_id .= "|"; + $t = $rating_details['rated_by'] * $rating_details['rating']; + $new_by = $rating_details['rated_by'] + 1; + $newrate = ($t + $rating) / $new_by; + + $db->update(tbl($this->dbtbl['video']),array("rating","rated_by","voter_ids"),array($newrate,$new_by,$voter_id)," videoid='$id'"); + e(lang("thnx_for_voting"),"m"); + } + + $result = array('rating'=>$newrate,'ratings'=>$new_by,'total'=>10,'id'=>$id,'type'=>'video','disable'=>'disabled'); + return $result; + */ + } + + + /** + * Function used to get playlist items + */ + function get_playlist_items($pid) + { + global $db; + $ptbl = tbl($this->action->playlist_items_tbl); + $vtbl = tbl($this->dbtbl['video']); + + $tbls = $ptbl.','.$vtbl; + $fields = $ptbl.".*,$vtbl.title,$vtbl.comments_count,$vtbl.views,$vtbl.userid,$vtbl.date_added, + $vtbl.file_name,$vtbl.category,$vtbl.description,$vtbl.videokey,$vtbl.tags,$vtbl.videoid,$vtbl.duration"; + $result = $db->select($tbls,$fields,"playlist_id='$pid' AND ".$vtbl.".videoid=".$ptbl.".object_id"); + if($db->num_rows>0) + return $result; + else + return false; + } + + /** + * Function used to add video in quicklist + */ + function add_to_quicklist($id) + { + global $json, $sess, $userquery; + + if($this->exists($id)) + { + if(phpversion() < '5.2.0') + { + $list = $json->decode($sess->get_cookie(QUICK_LIST_SESS), true); + } + else + { + $list = json_decode($sess->get_cookie(QUICK_LIST_SESS), true); + } + + $list[] = $id; + $new_list = array_unique($list); + + /*//Getting list of videos + $vids = $this->get_videos(array('videoids'=>$new_list)); + $newlist = array(); + //setting up the list + if($vids) + foreach($vids as $vid) + { + $newlist[$vid['videoid']] = + array( + 'title' => $vid['title'], + 'description' => $vid['description'], + 'duration' => SetTime($vid['duration']), + 'thumb' => get_thumb($vid), + 'url' => video_link($video), + 'owner' => $vid['username'], + 'ownner_url' => $userquery->profile_link($vid), + 'date_added' => $vid['date_added'], + 'views' => $vid['views'], + ); + }*/ + if(phpversion() < '5.2.0') + { + $sess->set_cookie(QUICK_LIST_SESS,$json->encode($new_list)); + } + else + { + $sess->set_cookie(QUICK_LIST_SESS,json_encode($new_list)); + } + return true; + + }else + return false; + } + + /** + * Removing video from quicklist + */ + function remove_from_quicklist($id) + { + global $json, $sess; + + if(phpversion() < '5.2.0') + { + $list = $json->decode($sess->get_cookie(QUICK_LIST_SESS), true); + } + else + { + $list = json_decode($sess->get_cookie(QUICK_LIST_SESS), true); + } + $key = array_search($id,$list); + unset($list[$key]); + if(phpversion() < '5.2.0') + { + $sess->set_cookie(QUICK_LIST_SESS,$json->encode($list)); + } + else + { + $sess->set_cookie(QUICK_LIST_SESS,json_encode($list)); + } + return true; + } + + + /** + * function used to count num of quicklist + */ + function total_quicklist() + { + global $json, $sess; + + $total = $sess->get_cookie(QUICK_LIST_SESS); + + if(phpversion() < '5.2.0') + { + $total = $json->decode($total, true); + } + else + { + $total = json_decode($total, true); + } + + return count($total); + } + + /** + * Function used to get quicklist + */ + function get_quicklist() + { + global $json, $sess; + if(phpversion() < '5.2.0') + { + return $json->decode($sess->get_cookie(QUICK_LIST_SESS), true); + } + else + { + return json_decode($sess->get_cookie(QUICK_LIST_SESS), true); + } + } + + /** + * Function used to remove all items of quicklist + */ + function clear_quicklist() + { + global $sess; + $sess->set_cookie(QUICK_LIST_SESS,''); + } + + /** + * Function used to check weather video is downloadable or not + */ + function downloadable($vdo) + { + $file = get_video_file($vdo,false); + if($file) + return true; + else + return false; + } + + /** + * Function used get comments of videos + */ + function get_comments($params=NULL) + { + global $db; + $comtbl = tbl("comments"); + $limit = $params['limit']; + $order = $params['order']; + $type = $params['type']; + + if($type) + $cond = " $comtbl.type = '$type'"; + else + $cond = ''; + + switch($type) { + case 'v': + { + $sectbl = tbl('video'); + $sectblName = 'video'; + $secfields = $sectbl.".videokey,".$sectbl.".videoid,".$sectbl.".file_name,".$sectbl.".title"; + if($cond) { + $cond .= " AND"; + } + $cond .= " $comtbl.type_id = $sectbl.videoid"; + } + break; + + case 't': + { + $sectbl = tbl('group_topics'); + $sectblName = 'group_topics'; + $secfields = $sectbl.".topic_title,".$sectbl.".topic_id,".$sectbl.".topic_title"; + if($cond) { + $cond .= " AND"; + } + $cond .= " $comtbl.type_id = $sectbl.topic_id"; + } + break; + + case 'c': + { + $sectbl = tbl('users'); + $sectblName = 'users'; + $secfields = $sectbl.".username,".$sectbl.".userid"; + if($cond) { + $cond .= " AND"; + } + $cond .= " $comtbl.type_id = $sectbl.userid"; + } + break; + + + default: + { + $sectbl = tbl('video'); + $sectblName = 'video'; + $secfields = $sectbl.".videokey,".$sectbl.".videoid,".$sectbl.".file_name,".$sectbl.".title"; + if($cond) { + $cond .= " AND"; + } + $cond .= " $comtbl.type_id = $sectbl.videoid"; + } + } + + if($params['cond']) + $cond .= " ".$params['cond']; + + if(!$params['count_only']) { + $result = $db->select(tbl("comments,".$sectblName.""), + "$comtbl.*,$secfields", + $cond,$limit,$order); + // echo $db->db_query; + } + if($params['count_only']) + return $result = $db->count(tbl("comments,video"),"*",$cond); + else + return $result; + } + + /** + * Function used get single comment + */ + + function get_comment($cid) { + global $db; + $result = $db->select(tbl("comments"),"*", " comment_id = $cid"); + if($result) + return $result[0]; + else + return false; + } + /** + * Function used get single comment + */ + + function send_notifications() { + // Put your device token here (without spaces): + $deviceToken = '610b18964b4ec3ccb8157ff22cb917fe0f6b9c1673cd4229674d87eb9aa0e5b1'; + + // Put your private key's passphrase here: + $passphrase = 'janjua'; + + // Put your alert message here: + $message = 'Jeevay Pakistan!'; + + //////////////////////////////////////////////////////////////////////////////// + + $ctx = stream_context_create(); + stream_context_set_option($ctx, 'ssl', 'local_cert', 'ck.pem'); + stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase); + + // Open a connection to the APNS server + $fp = stream_socket_client( + 'ssl://gateway.sandbox.push.apple.com:2195', $err, + $errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx); + + if (!$fp) + exit("Failed to connect: $err $errstr" . PHP_EOL); + + echo 'Connected to APNS' . PHP_EOL; + + // Create the payload body + $body['aps'] = array( + 'alert' => $message, + 'sound' => 'default' + ); + + // Encode the payload as JSON + $payload = json_encode($body); + + // Build the binary notification + $msg = chr(0) . pack('n', 32) . pack('H*', $deviceToken) . pack('n', strlen($payload)) . $payload; + + // Send it to the server + $result = fwrite($fp, $msg, strlen($msg)); + + if (!$result) + echo 'Message not delivered' . PHP_EOL; + else + echo 'Message successfully delivered' . PHP_EOL; + + // Close the connection to the server + fclose($fp); + + } + + /** + * Function used update comment + */ + +// function update_comment($cid,$comment) { +// global $db; +// if(!$comment) { +// e(lang('usr_cmt_err1'),e); +// } else { +// $db->update(tbl("comments"),array("comment"),array($comment)," comment_id = $cid"); +// e(lang("Comment Updated"),m); +// } +// } + +} +?> \ No newline at end of file diff --git a/upload/includes/clipbucket.php b/upload/includes/clipbucket.php new file mode 100644 index 00000000..fa644cb1 --- /dev/null +++ b/upload/includes/clipbucket.php @@ -0,0 +1,19 @@ + \ No newline at end of file diff --git a/upload/includes/common.php b/upload/includes/common.php new file mode 100644 index 00000000..82a3326f --- /dev/null +++ b/upload/includes/common.php @@ -0,0 +1,639 @@ +Get_Website_Details(); + + + define('DEBUG_LEVEL', 2); + + switch(DEBUG_LEVEL) + { + case 0: + { + error_reporting(0); + ini_set('display_errors', '0'); + } + break; + case 1: + { + error_reporting(E_ALL); + ini_set('display_errors', '1'); + } + break; + + case 2: + default: + { + + if(phpversion() >= '5.3.0') + { + error_reporting(E_ALL ^E_NOTICE ^E_DEPRECATED); + ini_set('display_errors', '1'); + } + else + { + error_reporting(E_ALL ^E_NOTICE); + ini_set('display_errors', '1'); + } + } + } + + + $pages = new pages(); + $ClipBucket = $Cbucket = new ClipBucket(); + + define('BASEDIR',$Cbucket->BASEDIR); + if(!file_exists(BASEDIR.'/index.php')) + die('Basedir is incorrect, please set the correct basedir value in \'config\' table'); + + + $baseurl = $row['baseurl']; + //Removing www. as it effects SEO and updating Config + $wwwcheck = preg_match('/:\/\/www\./',$baseurl,$matches); + if(count($matches)>0) + { + $baseurl = preg_replace('/:\/\/www\./','://',$baseurl); + } + + //define('BASEURL',baseurl(BACK_END)); + $clean_base = false; + if(defined("CLEAN_BASEURL")) + $clean_base = CLEAN_BASEURL; + + //define('BASEURL',$pages->GetBaseUrl($clean_base)); + define('BASEURL',$baseurl); + + $userquery = new userquery(); + $lang_obj = new language; + + + //Setting Time Zone date_default_timezone_set() + + require_once('classes/search.class.php'); + + + require_once('classes/calcdate.class.php'); + require_once('classes/signup.class.php'); + require_once('classes/image.class.php'); + require_once('classes/upload.class.php'); + require_once('classes/ads.class.php'); + require_once('classes/form.class.php'); + require_once('classes/plugin.class.php'); + require_once('classes/errorhandler.class.php'); + require_once('classes/session.class.php'); + require_once('classes/log.class.php'); + require_once('classes/swfObj.class.php'); + require_once('classes/image.class.php'); + require_once('classes/groups.class.php'); + require_once('classes/video.class.php'); + require_once('classes/player.class.php'); + require_once('classes/cbemail.class.php'); + require_once('classes/pm.class.php'); + require_once('classes/cbpage.class.php'); + require_once('classes/reindex.class.php'); + require_once('classes/collections.class.php'); + require_once('classes/photos.class.php'); + require_once('classes/menuhandler.class.php'); + require_once('classes/cbfeeds.class.php'); + + //Adding Gravatar + require_once('classes/gravatar.class.php'); + + require_once 'languages.php'; + + $lang_obj->init(); + $LANG = $lang_obj->lang_phrases('file'); + + + $calcdate = new CalcDate(); + $signup = new signup(); + $Upload = new Upload(); + $cbgroup = new CBGroups(); + $adsObj = new AdsManager(); + $formObj = new formObj(); + + + $cbplugin = new CBPlugin(); + $eh = new EH(); + + $sess = new Session(); + $cblog = new CBLogs(); + $imgObj = new ResizeImage(); + $cbvideo = $cbvid = new CBvideo(); + $cbplayer = new CBPlayer(); + $cbemail = new CBEmail(); + $cbsearch = new CBSearch(); + $cbpm = new cb_pm(); + $cbpage = new cbpage(); + $cbindex = new CBreindex(); + $cbcollection = new Collections(); + $cbphoto = new CBPhotos(); + + $cbfeeds = new cbfeeds(); +// $cbmenu = new MenuHandler(); + check_install('after'); + require 'defined_links.php'; + + @include("clipbucket.php"); + $Cbucket->cbinfo = array("version"=>VERSION,"state"=>STATE,"rev"=>REV,"release_date"=>RELEASED); + + +//Holds Advertisment IDS that are being Viewed + $ads_array = array(); + + + + + if(phpversion() < '5.2.0') + { + require_once($Cbucket->BASEDIR.'/includes/classes/Services_JSON.php'); + $json = new Services_JSON(); + } + +//Website Details + + define('CB_VERSION', $row['version']); + define('TITLE',$row['site_title']); + define('SLOGAN',$row['site_slogan']); + + + + //Seo URLS + + define('SEO',$row['seo']); //Set yes / no + + //Registration & Email Settings + + define('EMAIL_VERIFICATION',$row['email_verification']); + define('ALLOW_REG',$row['allow_registration']); + define('WEBSITE_EMAIL',$row['website_email']); + define('SUPPORT_EMAIL',$row['support_email']); + define('WELCOME_EMAIL',$row['welcome_email']); + @define('VIDEO_REQUIRE_LOGIN',$row['video_require_login']); + define('ACTIVATION',$row['activation']); + define('DATE_FORMAT',"d-m-Y"); + + //Listing Of Videos , Channels + + define('VLISTPP',$row['videos_list_per_page']); //Video List Per page + define('VLISTPT',$row['videos_list_per_tab']); //Video List Per tab + define('CLISTPP',$row['channels_list_per_page']); //Channels List Per page + define('CLISTPT',$row['channels_list_per_tab']); //Chaneels List Per tab + define('GLISTPP',$row['groups_list_per_page']); //Groups List Per page + define('SLISTPP',$row['search_list_per_page']); //Search Results List Per page + define('RVLIST',$row['recently_viewed_limit']); //Search Results List Per page + + //Defining Photo Limits + define('MAINPLIST',$row['photo_main_list']); + define('HOMEPLIST',$row['photo_home_tabs']); + define('SEARCHPLIST',$row['photo_search_result']); + define('CHANNELPLIST',$row['photo_channel_page']); + define('USERPLIST',$row['photo_user_photos']); + define('UFAVPLIST',$row['photo_user_favorites']); + define('OTHERPLIST',$row['photo_other_limit']); + + //Defining Collection Limits + define('COLLPP',$row['collection_per_page']); + define('COLLHP',$row['collection_home_page']); + define('COLLIP',$row['collection_items_page']); + define('COLLSP',$row['collection_search_result']); + define('COLLCP',$row['collection_channel_page']); + define('COLLUCP',$row['collection_user_collections']); + define('COLLUFP',$row['collection_user_favorites']); + + //Video Options + define('VIDEO_COMMENT',$row['video_comments']); + define('VIDEO_RATING',$row['video_rating']); + define('COMMENT_RATING',$row['comment_rating']); + define('VIDEO_DOWNLOAD',$row['video_download']); + define('VIDEO_EMBED',$row['video_embed']); + + + + + + define('TEMPLATEFOLDER','styles'); //Template Folder Name, usually STYLES + define('STYLES_DIR',BASEDIR.'/'.TEMPLATEFOLDER); + +// Define Lang Select & Style Select + + define('ALLOW_LANG_SELECT',$row['allow_language_change']); + define('ALLOW_STYLE_SELECT',$row['allow_template_change']); + + define('FLVPLAYER',$row['player_file']); + define('SUBTITLE',$row['code_dev']); + //Javascript Directory Name + define('ADMINDIR','admin_area'); + define('ADMINBASEDIR',BASEDIR.'/admin_area'); //Admin Accissble Folder + define('ADMIN_BASEURL',BASEURL.'/'.ADMINDIR); + define('MODULEDIR',BASEDIR.'/modules'); //Modules Directory + +//DIRECT PATHS OF VIDEO FILES + define('FILES_DIR',BASEDIR.'/files'); + define('VIDEOS_DIR',FILES_DIR.'/videos'); + define('THUMBS_DIR',FILES_DIR.'/thumbs'); + define('ORIGINAL_DIR',FILES_DIR.'/original'); + define('TEMP_DIR',FILES_DIR.'/temp'); + define('CON_DIR',FILES_DIR.'/conversion_queue'); + define('MASS_UPLOAD_DIR',FILES_DIR.'/mass_uploads'); + define('LOGS_DIR',FILES_DIR.'/logs'); + + define("USER_THUMBS_DIR",BASEDIR.'/images/avatars'); + define("USER_BG_DIR",BASEDIR.'/images/backgrounds'); + + define("ICONS_URL",BASEURL.'/images/icons'); + + define('JS_DIR',BASEDIR.'/js'); + define('JS_URL',BASEURL.'/js'); + +//DIRECT URL OF VIDEO FILES + define('FILES_URL',BASEURL.'/files'); + define('VIDEOS_URL',FILES_URL.'/videos'); + define('THUMBS_URL',FILES_URL.'/thumbs'); + define('ORIGINAL_URL',FILES_URL.'/original'); + define('TEMP_URL',FILES_URL.'/temp'); + define("PLAYER_DIR",BASEDIR.'/player'); + define("PLAYER_URL",BASEURL.'/player'); + + define("USER_THUMBS_URL",BASEURL.'/images/avatars'); + define("USER_BG_URL",BASEURL.'/images/backgrounds'); + + //Required Settings For Video Conversion + + define('VBRATE', $row['vbrate']); + define('SRATE', $row['srate']); + define('SBRATE', $row['sbrate']); + define('R_HEIGHT', $row['r_height']); + define('R_WIDTH', $row['r_width']); + define('RESIZE', $row['resize']); + define('KEEP_ORIGINAL', $row['keep_original']); + define('MAX_UPLOAD_SIZE', $row['max_upload_size']); + define('THUMB_HEIGHT', $row['thumb_height']); + define('THUMB_WIDTH', $row['thumb_width']); + define('PHP_PATH', $row['php_path']); + + //Defining Plugin Directory + define('PLUG_DIR',BASEDIR.'/plugins'); + define('PLUG_URL',BASEURL.'/plugins'); + + define('MAX_COMMENT_CHR',$Cbucket->configs['max_comment_chr']); + define('USER_COMMENT_OWN',$Cbucket->configs['user_comment_own']); + + + //Defining Category Thumbs directory + define('CAT_THUMB_DIR',BASEDIR.'/images/category_thumbs'); + define('CAT_THUMB_URL',BASEURL.'/images/category_thumbs'); + + //Defining Group Thumbs directory + define('GP_THUMB_DIR',BASEDIR.'/images/groups_thumbs'); + define('GP_THUMB_URL',BASEURL.'/images/groups_thumbs'); + + //TOPIC ICON DIR + define('TOPIC_ICON_DIR',BASEDIR.'/images/icons/topic_icons'); + define('TOPIC_ICON_URL',BASEURL.'/images/icons/topic_icons'); + + //COLLECTIONS ICON DIR + define('COLLECT_THUMBS_DIR',BASEDIR.'/images/collection_thumbs'); + define('COLLECT_THUMBS_URL',BASEURL.'/images/collection_thumbs'); + + //PHOTOS DETAILS + define('PHOTOS_DIR',FILES_DIR."/photos"); + define('PHOTOS_URL',FILES_URL."/photos"); + + //ADVANCE CACHING + define('CACHE_DIR',BASEDIR.'/cache'); + define('COMM_CACHE_DIR',CACHE_DIR.'/comments'); + define('COMM_CACHE_TIME',1000) ; //in seconds + + //User Feeds + define("USER_FEEDS_DIR",CACHE_DIR.'/userfeeds'); + + //Number of activity feeds to display on channel page + define("USER_ACTIVITY_FEEDS_LIMIT",15); + + //SETTING PHOTO SETTING + $cbphoto->thumb_width = $row['photo_thumb_width']; + $cbphoto->thumb_height = $row['photo_thumb_height']; + $cbphoto->mid_width = $row['photo_med_width']; + $cbphoto->mid_height = $row['photo_med_height']; + $cbphoto->lar_width = $row['photo_lar_width']; + $cbphoto->cropping = $row['photo_crop']; + $cbphoto->position = $row['watermark_placement']; + + //Enable youtube videos + define("YOUTUBE_ENABLED",$row['youtube_enabled']); + + define("EMBED_VDO_WIDTH",$row['embed_player_width']); + define("EMBED_VDO_HEIGHT",$row['embed_player_height']); + + + include 'plugin.functions.php'; + include 'plugins_functions.php'; + require BASEDIR.'/includes/templatelib/Template.class.php'; + require BASEDIR.'/includes/classes/template.class.php'; + require BASEDIR.'/includes/classes/objects.class.php'; + + require BASEDIR.'/includes/active.php'; + + $cbtpl = new CBTemplate(); + $cbobjects = new CBObjects(); + $swfobj = new SWFObject(); + //Initializng Userquery class + $userquery->init(); + $cbvideo->init(); + $cbpm->init(); + $cbphoto->init_photos(); + $thisurl = curPageURL(); + //Setting Up Group Class + $cbgroup->gp_thumb_width = config('grp_thumb_width'); + $cbgroup->gp_thumb_height = config('grp_thumb_height'); + + Assign('THIS_URL', $thisurl); + + define("ALLOWED_GROUP_CATEGORIES",$row['grp_categories']); + define('ALLOWED_VDO_CATS',$row['video_categories']); + define('ALLOWED_CATEGORIES',3); + + if($Cbucket->LatestAdminMenu()) + $Cbucket->AdminMenu = array_merge($Cbucket->LatestAdminMenu(),$Cbucket->AdminMenu); + + //Assigning Smarty Tags & Values + Assign('CB_VERSION',CB_VERSION); + Assign('FFMPEG_FLVTOOLS_BINARY',FFMPEG_FLVTOOLS_BINARY); + Assign('FFMPEG_MPLAYER_BINARY',FFMPEG_MPLAYER_BINARY); + Assign('PHP_PATH',PHP_PATH); + Assign('FFMPEG_BINARY',FFMPEG_BINARY); + Assign('FFMPEG_MENCODER_BINARY',FFMPEG_MENCODER_BINARY); + Assign('js',JS_URL); + Assign('title',TITLE); + Assign('slogan',SLOGAN); + Assign('flvplayer',FLVPLAYER); + Assign('avatardir',BASEURL.'/images/avatars'); + Assign('whatis',$row['whatis']); + Assign('category_thumbs',CAT_THUMB_URL); + Assign('gp_thumbs_url',GP_THUMB_URL); + Assign('video_thumbs',THUMBS_URL); + //Assign('ads',$ads); + + Assign('email_verification',EMAIL_VERIFICATION); + Assign('group_thumb',BASEURL.'/images/groups_thumbs'); + Assign('bg_dir',BASEURL.'/images/backgrounds'); + Assign('captcha_type',$row['captcha_type']); + Assign('languages',$languages); + + Assign('module_dir',MODULEDIR); + + Assign('VIDEOS_URL',VIDEOS_URL); + Assign('THUMBS_URL',THUMBS_URL); + Assign('PLUG_URL',BASEURL.'/plugins'); + +//Remote and Embed + Assign('remoteUpload',$row['remoteUpload']); + Assign('embedUpload',$row['embedUpload']); + +//Video Options + Assign('video_comment',$row['video_comments']); + Assign('video_rating',$row['video_rating']); + Assign('comment_rating',$row['comment_rating']); + Assign('video_download',$row['video_download']); + Assign('video_embed',$row['video_embed']); + + assign('icons_url',ICONS_URL); + + + + + $ClipBucket->upload_opt_list = array + ( + 'file_upload_div' => array( + 'title' => lang('upload_file'), + 'func_class' => 'Upload', + 'load_func' => 'load_upload_form', + ), + 'remote_upload_div' => array( + 'title' => lang('remote_upload'), + 'func_class' => 'Upload', + 'load_func' => 'load_remote_upload_form', + ) + ); + Assign('LANG',$LANG); + Assign('langf',LANG); + Assign('lang_count',count($languages)); + + +//Assign Player Div Id + Assign('player_div_id',$row['player_div_id']); + +//Asigning Page + Assign('page',PAGE); + +//Add Modules +require('modules.php'); + + +//Checking Website Template +$Cbucket->set_the_template(); + +/* +REGISTER OBJECTS FOR SMARTY +*/ + +$Smarty->assign_by_ref('pages', $pages); +$Smarty->assign_by_ref('myquery', $myquery); +$Smarty->assign_by_ref('userquery', $userquery); +$Smarty->assign_by_ref('signup', $signup); +$Smarty->assign_by_ref('Upload', $Upload); +$Smarty->assign_by_ref('cbgroup', $cbgroup); +$Smarty->assign_by_ref('db', $db); +$Smarty->assign_by_ref('adsObj', $adsObj); +$Smarty->assign_by_ref('formObj', $formObj); +$Smarty->assign_by_ref('Cbucket', $Cbucket);$Smarty->assign_by_ref('ClipBucket', $Cbucket); +$Smarty->assign_by_ref('eh', $eh); +$Smarty->assign_by_ref('lang_obj', $lang_obj); +$Smarty->assign_by_ref('cbvid', $cbvid); +$Smarty->assign_by_ref('cbtpl',$cbtpl); +$Smarty->assign_by_ref('cbobjects',$cbobjects); +$Smarty->assign_by_ref('cbplayer',$cbplayer); +$Smarty->assign_by_ref('cbsearch',$cbsearch); +$Smarty->assign_by_ref('cbpm',$cbpm); +$Smarty->assign_by_ref('cbpage',$cbpage); +$Smarty->assign_by_ref('cbemail',$cbemail); +$Smarty->assign_by_ref('cbcollection',$cbcollection); +$Smarty->assign_by_ref('cbphoto',$cbphoto); +$Smarty->assign_by_ref('cbfeeds',$cbfeeds); +//$Smarty->assign_by_ref('cbmenu',$cbmenu); +/* +REGISERTING FUNCTION FOR SMARTY TEMPLATES +*/ + + +function show_video_rating($params){ global $cbvid; return $cbvid->show_video_rating($params); } + +$Smarty->register_function('AD','getAd'); +$Smarty->register_function('get_thumb','getSmartyThumb'); +$Smarty->register_function('getThumb','getSmartyThumb'); +$Smarty->register_function('videoLink','videoSmartyLink'); +$Smarty->register_function('group_link','group_link'); +$Smarty->register_function('show_rating','show_rating'); +$Smarty->register_function('ANCHOR','ANCHOR'); +$Smarty->register_function('FUNC','FUNC'); +$Smarty->register_function('avatar','avatar'); +$Smarty->register_function('load_form','load_form'); +$Smarty->register_function('get_all_video_files',get_all_video_files_smarty); +$Smarty->register_function('input_value','input_value'); +$Smarty->register_function('userid','userid'); +$Smarty->register_function('FlashPlayer','flashPlayer'); +$Smarty->register_function('HQFlashPlayer','HQflashPlayer'); +$Smarty->register_function('link','cblink'); +$Smarty->register_function('show_share_form','show_share_form'); +$Smarty->register_function('show_flag_form','show_flag_form'); +$Smarty->register_function('show_playlist_form','show_playlist_form'); +$Smarty->register_function('show_collection_form','show_collection_form'); +$Smarty->register_function('lang','smarty_lang'); +$Smarty->register_function('get_videos','get_videos'); +$Smarty->register_function('get_users','get_users'); +$Smarty->register_function('get_groups','get_groups'); +$Smarty->register_function('get_photos','get_photos'); +$Smarty->register_function('get_collections','get_collections'); +$Smarty->register_function('private_message','private_message'); +$Smarty->register_function('show_video_rating','show_video_rating'); +$Smarty->register_function('load_captcha','load_captcha'); +$Smarty->register_function('cbtitle','cbtitle'); +$Smarty->register_function('head_menu','head_menu'); +$Smarty->register_function('foot_menu','foot_menu'); +$Smarty->register_function('include_header','include_header'); +$Smarty->register_function('include_template_file','include_template_file'); +$Smarty->register_function('include_js','include_js'); +$Smarty->register_function('get_binaries','get_binaries'); +$Smarty->register_function('check_module_path','check_module_path'); +$Smarty->register_function('rss_feeds','rss_feeds'); +$Smarty->register_function('website_logo','website_logo'); +$Smarty->register_function('get_photo','get_photo'); +$Smarty->register_function('uploadButton','upload_photo_button'); +$Smarty->register_function('embedCodes','photo_embed_codes'); +$Smarty->register_function('DownloadButtonP','photo_download_button'); +$Smarty->register_function('loadPhotoUploadForm','loadPhotoUploadForm'); +$Smarty->register_function('cbCategories','getSmartyCategoryList'); +$Smarty->register_function('getComments','getSmartyComments'); +$Smarty->register_function('fb_embed_video','fb_embed_video'); +$Smarty->register_function('cbMenu','cbMenu'); + +$Smarty->register_function('makeGroupAdmin','makeGroupAdmin'); +$Smarty->register_function('removeGroupAdmin','removeGroupAdmin'); +$Smarty->register_function('isGroupAdmin','isGroupAdmin'); + +$Smarty->register_modifier('SetTime','SetTime'); +$Smarty->register_modifier('getname','getname'); +$Smarty->register_modifier('getext','getext'); +$Smarty->register_modifier('form_val','form_val'); +$Smarty->register_modifier('get_from_val','get_from_val'); +$Smarty->register_modifier('post_form_val','post_form_val'); +$Smarty->register_modifier('request_form_val','request_form_val'); +$Smarty->register_modifier('get_thumb_num','get_thumb_num'); +$Smarty->register_modifier('ad','ad'); +$Smarty->register_modifier('get_user_level','get_user_level'); +$Smarty->register_modifier('is_online','is_online'); +$Smarty->register_modifier('get_age','get_age'); +$Smarty->register_modifier('outgoing_link','outgoing_link'); +$Smarty->register_modifier('nicetime','nicetime'); +$Smarty->register_modifier('country','get_country'); +$Smarty->register_modifier('cbsearch',new cbsearch()); +$Smarty->register_modifier('flag_type','flag_type'); +$Smarty->register_modifier('get_username','get_username'); +$Smarty->register_modifier('formatfilesize','formatfilesize'); +$Smarty->register_modifier('getWidth','getWidth'); +$Smarty->register_modifier('getHeight','getHeight'); +$Smarty->register_modifier('get_collection_name','get_collection_name'); +$Smarty->register_modifier('json_decode','jd'); +$Smarty->register_modifier('getGroupPrivacy','getGroupPrivacy'); + +assign('updateEmbedCode','updateEmbed'); +/* + * Registering Video Remove Functions + */ +register_action_remove_video('remove_video_thumbs'); +register_action_remove_video('remove_video_log'); +register_action_remove_video('remove_video_files'); + + +include('admin.functions.php'); +//error_reporting(E_ALL ^E_NOTICE ^E_DEPRECATED); + + +////Removing www. as it effects SEO and updating Config +//$wwwcheck = preg_match('/:\/\/www\./',$baseurl,$matches); +//if(count($matches)>0) +//{ +// $baseurl = preg_replace('/:\/\/www\./','://',$baseurl); +// $myquery->Set_Website_Details('baseurl',$baseurl); +//} + + //Other settings + define("SEND_COMMENT_NOTIFICATION",config("send_comment_notification")); + define("SEND_VID_APPROVE_EMAIL",config("approve_video_notification")); + + + +?> \ No newline at end of file diff --git a/upload/includes/config.inc.php b/upload/includes/config.inc.php new file mode 100644 index 00000000..b68ce694 --- /dev/null +++ b/upload/includes/config.inc.php @@ -0,0 +1,59 @@ +template); +define('TEMPLATEURL',BASEURL.'/'.TEMPLATEFOLDER.'/'.$Cbucket->template); +define('LAYOUT',TEMPLATEDIR.'/layout'); +define('ADMINLAYOUT',BASEDIR.'/'.ADMINDIR.'/'.TEMPLATEFOLDER.'/'.$Cbucket->template.'/layout'); + +Assign('baseurl',BASEURL); +Assign('imageurl',TEMPLATEURL.'/images'); +Assign('admimageurl',BASEURL.'/'.ADMINDIR.'/'.TEMPLATEFOLDER.'/'.$Cbucket->template.'/images'); +Assign('layout',TEMPLATEURL.'/layout'); +Assign('theme',TEMPLATEURL.'/theme'); +Assign('admtheme',BASEURL.'/'.ADMINDIR.'/'.TEMPLATEFOLDER.'/'.$Cbucket->template.'/theme'); +Assign('template_dir',TEMPLATEDIR); +Assign('style_dir',LAYOUT); + + + + +//Assigning JS Files +Assign('jsArray',$Cbucket->JSArray); +//Assigning Module Files +Assign('module_list',$Cbucket->moduleList); + + +//Checking Website is closed or not +if(config('closed') && THIS_PAGE!='ajax' && !$in_bg_cron && THIS_PAGE!='cb_install') +{ + + if(!has_access("admin_access",TRUE)) + { e($row['closed_msg'],"w"); + template("global_header.html"); + template("message.html"); + exit(); + }else{ + e(lang("ATTENTION: THIS WEBSITE IS IN OFFLINE MODE"),"w"); + } +} + +//Configuring Uploader +uploaderDetails(); +isSectionEnabled(PARENT_PAGE,true); + +//setting quicklist +assign('total_quicklist',$cbvid->total_quicklist()); + +?> \ No newline at end of file diff --git a/upload/includes/configs/index.php b/upload/includes/configs/index.php new file mode 100644 index 00000000..403f2e18 --- /dev/null +++ b/upload/includes/configs/index.php @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/upload/includes/conversion.conf.php b/upload/includes/conversion.conf.php new file mode 100644 index 00000000..628e9964 --- /dev/null +++ b/upload/includes/conversion.conf.php @@ -0,0 +1,172 @@ +Get_Website_Details(); + $email_data = $myquery->Get_Email_Settings(); + $ads = $myquery->Get_Advertisments(); + +//Website Details + + define('TITLE',$row['site_title']); + define('SLOGAN',$row['site_slogan']); + + //Seo URLS + + define('SEO',$row['seo']); //Set yes / no + + //Required Modules and Their Paths (Editable In Admin Panel) + + define('FFMPEG_BINARY', $row['ffmpegpath']); + define('FFMPEG_FLVTOOLS_BINARY', $row['flvpath']); + define('FFMPEG_MENCODER_BINARY', $row['mencoderpath']); + define('FFMPEG_MPLAYER_BINARY', $row['mplayerpath']); + define('PHP_PATH', $row['php_path']); + + //Registration & Email Settings + + define('EMAIL_VERIFICATION',$row['email_verification']); + define('ALLOW_REGISTERATION',$row['allow_registration']); + define('WEBSITE_EMAIL',$email_data['website_email']); + define('SUPPORT_EMAIL',$email_data['support_email']); + define('WELCOME_EMAIL',$email_data['welcome_email']); + define('VIDEO_REQUIRE_LOGIN',@$row['video_require_login']); + define('ACTIVATION',$row['activation']); + + //Listing Of Videos , Channels + + define('VLISTPP',$row['videos_list_per_page']); //Video List Per page + define('VLISTPT',$row['videos_list_per_tab']); //Video List Per tab + define('CLISTPP',$row['channels_list_per_page']); //Channels List Per page + define('CLISTPT',$row['channels_list_per_tab']); //Chaneels List Per tab + define('GLISTPP',$row['groups_list_per_page']); //Groups List Per page + + //Video Options + + define('VIDEO_COMMENT',$row['video_comments']); + define('VIDEO_RATING',$row['video_rating']); + define('COMMENT_RATING',$row['comment_rating']); + define('VIDEO_DOWNLOAD',$row['video_download']); + define('VIDEO_EMBED',$row['video_embed']); + + //Required Settings For Video Conversion + + define('VBRATE', $row['vbrate']); + define('SRATE', $row['srate']); + define('SBRATE', $row['sbrate']); + define('R_HEIGHT', $row['r_height']); + define('R_WIDTH', $row['r_width']); + define('RESIZE', $row['resize']); + define('KEEP_ORIGINAL', $row['keep_original']); + define('MAX_UPLOAD_SIZE', $row['max_upload_size']); + define('THUMB_HEIGHT', $row['thumb_height']); + define('THUMB_WIDTH', $row['thumb_width']); + define('FFMPEG_TYPE', $row['ffmpeg_type']); + if(FFMPEG_TYPE == 's'){ + define('FFMPEG_BINARY', MODULEDIR.'/encoders/ffmpeg'); + }else{ + define('FFMPEG_BINARY', $row['ffmpegpath']); + } + define('FFMPEG_FLVTOOLS_BINARY', $row['flvpath']); + define('PHP_PATH', $row['php_path']); + define('FFMPEG_MENCODER_BINARY', $row['mencoderpath']); + define('FFMPEG_MPLAYER_BINARY', $row['mplayerpath']); + + //Required Paths Relative and Direct (Editable In Admin Panel) + + if(is_dir($row['basedir'])){ + define('BASEDIR',$row['basedir']); + }else{ + define('BASEDIR',dirname(__FILE__).'/..'); + } + define('BASEURL',$row['baseurl']); //Direct Path To Script ie http://yourwebsite.com/subdir + + define('TEMPLATEFOLDER','styles'); //Template Folder Name, usually STYLES + define('TEMPLATE',$row['template_dir']); //Select Any Template Name, usually 'clipbucketblue' + define('FLVPLAYER',$row['player_file']); //Select FLV Player For Your Script + define('JSDIR','js'); //Javascript Directory Name + define('ADMINDIR','admin_area'); //Admin Accissble Folder + define('MODULEDIR',BASEDIR.'/modules'); //Modules Directory + + //DIRECT PATHS OF VIDEO FILES + define('FILES_DIR',BASEDIR.'/files'); + define('VIDEOS_DIR',FILES_DIR.'/videos'); + define('THUMBS_DIR',FILES_DIR.'/thumbs'); + define('ORIGINAL_DIR',FILES_DIR.'/original'); + define('TEMP_DIR',FILES_DIR.'/temp'); + + //DIRECT URL OF VIDEO FILES + define('FILES_URL',BASEURL.'/files'); + define('VIDEOS_URL',FILES_URL.'/videos'); + define('THUMBS_URL',FILES_URL.'/thumbs'); + define('ORIGINAL_URL',FILES_URL.'/original'); + define('TEMP_URL',FILES_URL.'/temp'); + + //Do No Edit Below This Line + + define('TEMPLATEDIR',BASEDIR.'/'.TEMPLATEFOLDER.'/'.TEMPLATE); + define('TEMPLATEURL',BASEURL.'/'.TEMPLATEFOLDER.'/'.TEMPLATE); + define('LAYOUT',TEMPLATEDIR.'/layout'); + define('ADMINLAYOUT',BASEDIR.'/'.ADMINDIR.'/'.TEMPLATEFOLDER.'/'.TEMPLATE.'/layout'); + + //Assigning Smarty Tags & Values + + require BASEDIR.'/includes/templatelib/Template.class.php'; + require BASEDIR.'/includes/classes/template.class.php'; + require BASEDIR.'/includes/classes/TConfig.php'; + require BASEDIR.'/includes/classes/TError.php'; + require BASEDIR.'/includes/active.php'; + require BASEDIR.'/includes/defined_links.php'; + + $SYSTEM_OS = $row['sys_os'] ? $row['sys_os'] : 'linux'; + + //Including FFMPEG CLASS + if($SYSTEM_OS=='linux') + { + if($row['con_modules_type'] == 0){ + require_once(BASEDIR.'/includes/classes/conversion/ffmpeg.class.php'); + }else{ + require_once(BASEDIR.'/includes/classes/conversion/multi.class.php'); + } + }else{ + require_once(BASEDIR.'/includes/classes/conversion/ffmpeg.win32.php'); + } + +?> \ No newline at end of file diff --git a/upload/includes/dbconnect.php b/upload/includes/dbconnect.php new file mode 100644 index 00000000..728bd1de --- /dev/null +++ b/upload/includes/dbconnect.php @@ -0,0 +1,40 @@ +debug = false; + $db->charpage = 'cp_utf8'; + $db->charset = 'utf8'; + if(!$db->Connect($DBHOST, $DBUSER, $DBPASS, $DBNAME)) + { + exit($db->ErrorMsg()); + } + $db->Connect($DBHOST, $DBUSER, $DBPASS, $DBNAME); + + + $db->SetFetchMode(ADODB_FETCH_ASSOC); + + $db->Execute('SET NAMES utf8'); + $db->Execute('SET CHARACTER SET utf8'); + $db->Execute('SET COLLATION_CONNECTION="utf8_general_ci"'); + +?> \ No newline at end of file diff --git a/upload/includes/define_php_links.php b/upload/includes/define_php_links.php new file mode 100644 index 00000000..b52440fe --- /dev/null +++ b/upload/includes/define_php_links.php @@ -0,0 +1,67 @@ +','?','[',']','\\',';','"',',','.','/','*','+','~','`','=',"'"); + $entities_replace = array('','','','','','','','','','','','','','','','','','','','','','','',''); + $clean_text = str_replace($entities_match, $entities_replace, $text); + $clean_text = trim($clean_text); + $clean_text = preg_replace('/ /','-',$clean_text); + if ( $clean_text != '' ) + $slash = ( $slash ) ? '/' : NULL; + + + $clean_text = preg_replace('/\-{2,10}/','-',$clean_text); + + return $slash . $clean_text; +} + + if($seo_urls == 'yes'){ + + + + @define(compose_msg_link,'/message/compose'); + @define(login_success,'/login/success'); + @define(logout_success,'/logout/success'); + @define(signup_success,'/signup/success'); + @define(signup_link,'/signup.php'); + @define(myaccount_link,'/myaccount'); + @define(videos_link,'/videos'); + @define(view_group_link,'/group/view/'); + @define(user_account_link,'/manage/account'); + @define(search_result,'/search/result'); + //@define(edit_group_link,'/manage/group/edit/'); + @define(edit_group_link,'/edit_group.php?url='); + @define(admin_link,'/admin_area/'); + + + + }else{ + + @define(compose_msg_link,'/compose.php'); + @define(login_success,'/login_success.php'); + @define(logout_success,'/logout_success.php'); + @define(signup_success,'/signup_success.php'); + @define(signup_link,'/signup.php'); + @define(myaccount_link,'/myaccount.php'); + @define(videos_link,'/videos.php'); + @define(view_group_link,'/view_group.php?url='); + @define(user_account_link,'/user_account.php'); + @define(search_result,'/search_result.php'); + @define(edit_group_link,'/edit_group.php?url='); + @define(admin_link,'/admin_area/'); + + } +?> \ No newline at end of file diff --git a/upload/includes/defined_links.php b/upload/includes/defined_links.php new file mode 100644 index 00000000..a66a2b85 --- /dev/null +++ b/upload/includes/defined_links.php @@ -0,0 +1,78 @@ + Array([Non SEO Link], [SEO Link])) - Without BASEURL + */ + + +$cbLinks = array +( +'channels' =>array('channels.php','channels/'), +'compose_new' =>array('private_message.php?mode=new_msg','private_message.php?mode=new_msg'), +'contact_us' =>array('contact.php','contact'), +'create_group' =>array('create_group.php','create_group'), +'groups' =>array('groups.php','groups/'), +'inbox' =>array('private_message.php?mode=inbox','private_message.php?mode=inbox'), +'login' =>array('signup.php','signup.php'), +'login_success' =>array('login_success.php','login_success.php'), +'logout' =>array('logout.php','logout.php'), +'logout_success'=>array('logout_success.php','logout_success.php'), +'my_account' =>array('myaccount.php','my_account'), +'my_videos' =>array('manage_videos.php','manage_videos.php'), +'my_favorites' =>array('manage_videos.php?mode=favorites','manage_videos.php?mode=favorites'), +'my_playlists' =>array('manage_playlists.php','manage_playlists.php'), +'my_contacts' =>array('manage_contacts.php','manage_contacts.php'), +'notifications' =>array('private_message.php?mode=notification','private_message.php?mode=notification'), +'rss' =>array("rss.php?mode=","rss/"), +'search_result' =>array('search_result.php','search_result.php'), +'signup' =>array('signup.php','signup'), +'upload' =>array('upload.php','upload'), +'user_contacts' =>array('user_contacts.php?user=','user_contacts.php?user='), +'user_subscriptions' =>array('user_contacts.php?mode=subscriptions&user=','user_contacts.php?mode=subscriptions&user='), +'user_subscribers' =>array('user_contacts.php?mode=subscribers&user=','user_contacts.php?mode=subscribers&user='), +'user_favorites'=>array('user_videos.php?mode=favorites&user=','user_videos.php?mode=favorites&user='), +'user_videos' =>array('user_videos.php?user=','user_videos.php?user='), +'videos' =>array('videos.php','videos/'), + +); + +if(is_array($Cbucket->links)) + $Cbucket->links = array_merge($Cbucket->links,$cbLinks); + +/** + * Sortings + */ +function sorting_links() +{ + if(!isset($_GET['sort'])) + $_GET['sort'] = 'most_recent'; + if(!isset($_GET['time'])) + $_GET['time'] = 'all_time'; + + $array = array + ('most_recent' => lang('recent'), + 'most_viewed' => lang('viewed'), + 'featured' => lang('featured'), + 'top_rated' => lang('top_rated'), + 'most_commented' => lang('commented'), + ); + return $array; +} + +function time_links() +{ + $array = array + ('all_time' => lang('alltime'), + 'today' => lang('today'), + 'yesterday' => lang('yesterday'), + 'this_week' => lang('thisweek'), + 'last_week' => lang('lastweek'), + 'this_month' => lang('thismonth'), + 'last_month' => lang('lastmonth'), + 'this_year' => lang('thisyear'), + 'last_year' => lang('lastyear'), + ); + return $array; +} +?> \ No newline at end of file diff --git a/upload/includes/email_templates/activation_request.header.php b/upload/includes/email_templates/activation_request.header.php new file mode 100644 index 00000000..df512419 --- /dev/null +++ b/upload/includes/email_templates/activation_request.header.php @@ -0,0 +1,5 @@ + + + \ No newline at end of file diff --git a/upload/includes/email_templates/activation_request.template.php b/upload/includes/email_templates/activation_request.template.php new file mode 100644 index 00000000..43f0c97c --- /dev/null +++ b/upload/includes/email_templates/activation_request.template.php @@ -0,0 +1,14 @@ + + Click Here To Goto Activation Page + +Direct Activation +========================================== +Click Here or Copy & Paste the following link in your browser +$baseurl/activation.php?username=$username&avcode=$avcode +" + ?> + \ No newline at end of file diff --git a/upload/includes/email_templates/email_verify.header.php b/upload/includes/email_templates/email_verify.header.php new file mode 100644 index 00000000..84c553f2 --- /dev/null +++ b/upload/includes/email_templates/email_verify.header.php @@ -0,0 +1,5 @@ + + + \ No newline at end of file diff --git a/upload/includes/email_templates/email_verify.template.php b/upload/includes/email_templates/email_verify.template.php new file mode 100644 index 00000000..f5107e99 --- /dev/null +++ b/upload/includes/email_templates/email_verify.template.php @@ -0,0 +1,21 @@ + + Click Here + +$baseurl/activation.php?username=$username&avcode=$avcode + +==================== +Regards +$title" + ?> + \ No newline at end of file diff --git a/upload/includes/email_templates/index.php b/upload/includes/email_templates/index.php new file mode 100644 index 00000000..403f2e18 --- /dev/null +++ b/upload/includes/email_templates/index.php @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/upload/includes/email_templates/share_video.header.php b/upload/includes/email_templates/share_video.header.php new file mode 100644 index 00000000..63174f80 --- /dev/null +++ b/upload/includes/email_templates/share_video.header.php @@ -0,0 +1,5 @@ + + + \ No newline at end of file diff --git a/upload/includes/email_templates/share_video.template.php b/upload/includes/email_templates/share_video.template.php new file mode 100644 index 00000000..95342da5 --- /dev/null +++ b/upload/includes/email_templates/share_video.template.php @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + +
    $titleshare video
    $username wants to share Video With You
    Video Description
    + $videodes
    Personal Message
    + $message +
    +
    +Thanks,
    +$username
    copyrights 2007 $title
    + +" + ?> + \ No newline at end of file diff --git a/upload/includes/email_templates/template_writer.php b/upload/includes/email_templates/template_writer.php new file mode 100644 index 00000000..8c7929f6 --- /dev/null +++ b/upload/includes/email_templates/template_writer.php @@ -0,0 +1,105 @@ +Get_Email_Settings(); + $email_verify = $email_data['email_verification_template']; + $fp = fopen(BASEDIR."/includes/email_templates/email_verify.template.php", "w"); + fwrite($fp, ' + + '); + $email_header = $myquery->Get_Email_Settings_headers(); + $email_verify_header = $email_header['email_verification_template']; + $fp = fopen(BASEDIR."/includes/email_templates/email_verify.header.php", "w"); + fwrite($fp, ' + + '); + } + + //This Function Is Used To Write Welcome Message Template + function WriteWelcomeMessage(){ + $myquery = new myquery(); + $email_data = $myquery->Get_Email_Settings(); + $email_verify = $email_data['welcome_message_template']; + $fp = fopen(BASEDIR."/includes/email_templates/welcome_message.template.php", "w"); + fwrite($fp, ' + + '); + + $email_header = $myquery->Get_Email_Settings_headers(); + $email_verify_header = $email_header['welcome_message_template']; + $fp = fopen(BASEDIR."/includes/email_templates/welcome_message.header.php", "w"); + fwrite($fp, ' + + '); + } + + //This Function Is Used To Write Welcome Message Template + function WriteActvationRequest(){ + $myquery = new myquery(); + $email_data = $myquery->Get_Email_Settings(); + $email_verify = $email_data['activate_request_template']; + $fp = fopen(BASEDIR."/includes/email_templates/activation_request.template.php", "w"); + fwrite($fp, ' + + '); + + $email_header = $myquery->Get_Email_Settings_headers(); + $email_verify_header = $email_header['activate_request_template']; + $fp = fopen(BASEDIR."/includes/email_templates/activation_request.header.php", "w"); + fwrite($fp, ' + + '); + } + + //This Function Is Used To Write Share Video Template + function WriteShareVideo(){ + $myquery = new myquery(); + $email_data = $myquery->Get_Email_Settings(); + $email_verify = $email_data['share_video_template']; + $fp = fopen(BASEDIR."/includes/email_templates/share_video.template.php", "w"); + fwrite($fp, ' + + '); + + $email_header = $myquery->Get_Email_Settings_headers(); + $email_verify_header = $email_header['share_video_template']; + $fp = fopen(BASEDIR."/includes/email_templates/share_video.header.php", "w"); + fwrite($fp, ' + + '); + } + +?> \ No newline at end of file diff --git a/upload/includes/email_templates/welcome_message.header.php b/upload/includes/email_templates/welcome_message.header.php new file mode 100644 index 00000000..79af96f1 --- /dev/null +++ b/upload/includes/email_templates/welcome_message.header.php @@ -0,0 +1,5 @@ + + + \ No newline at end of file diff --git a/upload/includes/email_templates/welcome_message.template.php b/upload/includes/email_templates/welcome_message.template.php new file mode 100644 index 00000000..9923bd53 --- /dev/null +++ b/upload/includes/email_templates/welcome_message.template.php @@ -0,0 +1,17 @@ + + Upload Videos +-> Share Videos +-> Make Friends and Send Messages +-> Now You Have Your Own Channel + +To Access Your Account Please Click Here and login + +Thank You For Joining Us, +Regards +$title Team" + ?> + \ No newline at end of file diff --git a/upload/includes/email_templates/welcome_messege.header.php b/upload/includes/email_templates/welcome_messege.header.php new file mode 100644 index 00000000..79af96f1 --- /dev/null +++ b/upload/includes/email_templates/welcome_messege.header.php @@ -0,0 +1,5 @@ + + + \ No newline at end of file diff --git a/upload/includes/email_templates/welcome_messege.template.php b/upload/includes/email_templates/welcome_messege.template.php new file mode 100644 index 00000000..bef68e43 --- /dev/null +++ b/upload/includes/email_templates/welcome_messege.template.php @@ -0,0 +1,17 @@ + + Upload Videos +-> Share Videos +-> Make Friends and Send Messeges +-> Now You Have Your Own Channel + +To Access Your Account Please Click Here and login + +Thank You For Joining Us, +Regards +$title Team" + ?> + \ No newline at end of file diff --git a/upload/includes/flv_player.php b/upload/includes/flv_player.php new file mode 100644 index 00000000..61c5d9f7 --- /dev/null +++ b/upload/includes/flv_player.php @@ -0,0 +1,8 @@ + \ No newline at end of file diff --git a/upload/includes/functions.php b/upload/includes/functions.php new file mode 100644 index 00000000..49da47f3 --- /dev/null +++ b/upload/includes/functions.php @@ -0,0 +1,5938 @@ +true,'mysql_clean'=>false)) + { + if($array['no_html']) + $string = htmlentities($string); + if($array['special_html']) + $string = htmlspecialchars($string); + if($array['mysql_clean']) + $string = mysql_real_escape_string($string); + if($array['nl2br']) + $string = nl2br($string); + return $string; + } + + //This Fucntion is for Securing Password, you may change its combination for security reason but make sure dont not rechange once you made your script run + + function pass_code($string) { + $password = md5(md5(sha1(sha1(md5($string))))); + return $password; + } + + //Mysql Clean Queries + function sql_free($id) + { + if (!get_magic_quotes_gpc()) + { + $id = addslashes($id); + } + return $id; + } + + + function mysql_clean($id,$replacer=true){ + //$id = clean($id); + + if (get_magic_quotes_gpc()) + { + $id = stripslashes($id); + } + $id = htmlspecialchars(mysql_real_escape_string($id)); + if($replacer) + $id = Replacer($id); + return $id; + } + + function escape_gpc($in) + { + if (get_magic_quotes_gpc()) + { + $in = stripslashes($in); + } + return $in; + } + + + //Redirect Using JAVASCRIPT + + function redirect_to($url){ + echo ''; + exit("Javascript is turned off, click here to go to requested page"); + } + + //Test function to return template file + function Fetch($name,$inside=FALSE) + { + if($inside) + $file = CBTemplate::fetch($name); + else + $file = CBTemplate::fetch(LAYOUT.'/'.$name); + + return $file; + } + + //Simple Template Displaying Function + + function Template($template,$layout=true){ + global $admin_area; + if($layout) + CBTemplate::display(LAYOUT.'/'.$template); + else + CBTemplate::display($template); + + if($template == 'footer.html' && $admin_area !=TRUE){ + CBTemplate::display(BASEDIR.'/includes/templatelib/'.$template); + } + if($template == 'header.html'){ + CBTemplate::display(BASEDIR.'/includes/templatelib/'.$template); + } + } + + function Assign($name,$value) + { + CBTemplate::assign($name,$value); + } + + //Funtion of Random String + function RandomString($length) + { + $string = md5(microtime()); + $highest_startpoint = 32-$length; + $randomString = substr($string,rand(0,$highest_startpoint),$length); + return $randomString; + + } + + + //This Function Is Used To Display Tags Cloud + function TagClouds($cloudquery) + { + $tags = array(); + $cloud = array(); + $query = mysql_query($cloudquery); + while ($t = mysql_fetch_array($query)) + { + $db = explode(' ', $t[0]); + while (list($key, $value) = each($db)) + { + @$keyword[$value] += 1; + } + } + if (is_array(@$keyword)) + { + $minFont = 11; + $maxFont = 22; + $min = min(array_values($keyword)); + $max = max(array_values($keyword)); + $fix = ($max - $min == 0) ? 1 : $max - $min; + // Display the tags + foreach ($keyword as $tag => $count) + { + $size = $minFont + ($count - $min) * ($maxFont - $minFont) / $fix; + $cloud[] = '' . mysql_clean($tag) . ''; + } + $shown = join("\n", $cloud) . "\n"; + return $shown; + } + } + + + + /** + * Function used to send emails + * @Author : Arslan Hassan + * this is a very basic email function + * you can extend or replace this function easily + * read our docs.clip-bucket.com + */ + function cbmail($array) + { + $func_array = get_functions('email_functions'); + if(is_array($func_array)) + { + foreach($func_array as $func) + { + if(function_exists($func)) + { + return $func($array); + } + } + } + + $content = escape_gpc($array['content']); + $subject = escape_gpc($array['subject']); + $to = $array['to']; + $from = $array['from']; + $to_name = $array['to_name']; + $from_name = $array['from_name']; + + if($array['nl2br']) + $content = nl2br($content); + + # CHecking Content + if(preg_match('//',$content,$matches)) + { + if(empty($matches[1])) + { + $content = wrap_email_content($content); + } + } + $message .= $content; + + //ClipBucket uses PHPMailer for sending emails + include_once("classes/phpmailer/class.phpmailer.php"); + include_once("classes/phpmailer/class.smtp.php"); + + $mail = new PHPMailer(); // defaults to using php "mail()" + + $mail_type = config('mail_type'); + + //---Setting SMTP --- + if($mail_type=='smtp') + { + $mail->IsSMTP(); // telling the class to use SMTP + $mail->Host = config('smtp_host'); // SMTP server + if(config('smtp_auth')=='yes') + $mail->SMTPAuth = true; // enable SMTP authentication + $mail->Port = config('smtp_port'); // set the SMTP port for the GMAIL server + $mail->Username = config('smtp_user'); // SMTP account username + $mail->Password = config('smtp_pass'); // SMTP account password + } + //--- Ending Smtp Settings + + $mail->SetFrom($from, $from_name); + + if(is_array($to)) + { + foreach($to as $name) + { + $mail->AddAddress(strtolower($name), $to_name); + } + } else { + $mail->AddAddress(strtolower($to), $to_name); + } + + $mail->Subject = $subject; + $mail->MsgHTML($message); + + if(!$mail->Send()) + { + e("Mailer Error: " . $mail->ErrorInfo); + return false; + }else + return true; + } + function send_email($from,$to,$subj,$message) + { + return cbmail(array('from'=>$from,'to'=>$to,'subject'=>$subj,'content'=>$message)); + } + + /** + * Function used to wrap email content in + * HTML AND BODY TAGS + */ + function wrap_email_content($content) + { + return ''.$content.''; + } + + /** + * Function used to get file name + */ + function GetName($file) + { + if(!is_string($file)) + return false; + $path = explode('/',$file); + if(is_array($path)) + $file = $path[count($path)-1]; + $new_name = substr($file, 0, strrpos($file, '.')); + return $new_name; + } + + function get_elapsed_time($ts,$datetime=1) + { + if($datetime == 1) + { + $ts = date('U',strtotime($ts)); + } + $mins = floor((time() - $ts) / 60); + $hours = floor($mins / 60); + $mins -= $hours * 60; + $days = floor($hours / 24); + $hours -= $days * 24; + $weeks = floor($days / 7); + $days -= $weeks * 7; + $t = ""; + if ($weeks > 0) + return "$weeks week" . ($weeks > 1 ? "s" : ""); + if ($days > 0) + return "$days day" . ($days > 1 ? "s" : ""); + if ($hours > 0) + return "$hours hour" . ($hours > 1 ? "s" : ""); + if ($mins > 0) + return "$mins min" . ($mins > 1 ? "s" : ""); + return "< 1 min"; + } + + //Function Used TO Get Extensio Of File + function GetExt($file){ + return strtolower(substr($file, strrpos($file,'.') + 1)); + } + + function old_set_time($temps) + { + round($temps); + $heures = floor($temps / 3600); + $minutes = round(floor(($temps - ($heures * 3600)) / 60)); + if ($minutes < 10) + $minutes = "0" . round($minutes); + $secondes = round($temps - ($heures * 3600) - ($minutes * 60)); + if ($secondes < 10) + $secondes = "0" . round($secondes); + return $minutes . ':' . $secondes; + } + function SetTime($sec, $padHours = true) { + + if($sec < 3600) + return old_set_time($sec); + + $hms = ""; + + // there are 3600 seconds in an hour, so if we + // divide total seconds by 3600 and throw away + // the remainder, we've got the number of hours + $hours = intval(intval($sec) / 3600); + + // add to $hms, with a leading 0 if asked for + $hms .= ($padHours) + ? str_pad($hours, 2, "0", STR_PAD_LEFT). ':' + : $hours. ':'; + + // dividing the total seconds by 60 will give us + // the number of minutes, but we're interested in + // minutes past the hour: to get that, we need to + // divide by 60 again and keep the remainder + $minutes = intval(($sec / 60) % 60); + + // then add to $hms (with a leading 0 if needed) + $hms .= str_pad($minutes, 2, "0", STR_PAD_LEFT). ':'; + + // seconds are simple - just divide the total + // seconds by 60 and keep the remainder + $seconds = intval($sec % 60); + + // add to $hms, again with a leading 0 if needed + $hms .= str_pad($seconds, 2, "0", STR_PAD_LEFT); + + return $hms; + } + + //Simple Validation + function isValidText($text){ + $pattern = "^^[_a-z0-9-]+$"; + if (eregi($pattern, $text)){ + return true; + }else { + return false; + } + } + + //Simple Width Fetcher + function getWidth($file) + { + $sizes = getimagesize($file); + if($sizes) + return $sizes[0]; + } + + //Simple Height Fetcher + function getHeight($file) + { + $sizes = getimagesize($file); + if($sizes) + return $sizes[1]; + } + + //Load Photo Upload Form + function loadPhotoUploadForm($params) + { + global $cbphoto; + return $cbphoto->loadUploadForm($params); + } + //Photo File Fetcher + function get_photo($params) + { + global $cbphoto; + return $cbphoto->getFileSmarty($params); + } + + //Photo Upload BUtton + function upload_photo_button($params) + { + global $cbphoto; + return $cbphoto->upload_photo_button($params); + } + + //Photo Embed Cides + function photo_embed_codes($params) + { + global $cbphoto; + return $cbphoto->photo_embed_codes($params); + } + + //Create download button + + function photo_download_button($params) + { + global $cbphoto; + return $cbphoto->download_button($params); + } + + //Function Used To Validate Email + + function isValidEmail($email){ + $pattern = "/[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$/i"; + preg_match($pattern, $email,$matches); + if ($matches[0]!=''){ + return true; + } + else { + if(!DEVELOPMENT_MODE) + return false; + else + return true; + } + } + + + // THIS FUNCTION SETS HTMLSPECIALCHARS_DECODE IF FUNCTION DOESN'T EXIST + // INPUT: $text REPRESENTING THE TEXT TO DECODE + // $ent_quotes (OPTIONAL) REPRESENTING WHETHER TO REPLACE DOUBLE QUOTES, ETC + // OUTPUT: A STRING WITH HTML CHARACTERS DECODED + if(!function_exists('htmlspecialchars_decode')) { + function htmlspecialchars_decode($text, $ent_quotes = "") { + $text = str_replace(""", "\"", $text); + $text = str_replace("'", "'", $text); + $text = str_replace("<", "<", $text); + $text = str_replace(">", ">", $text); + $text = str_replace("&", "&", $text); + return $text; + } + } // END htmlspecialchars() FUNCTION + + //THIS FUNCTION IS USED TO LIST FILE TYPES IN FLASH UPLOAD + //INPUT FILE TYPES + //OUTPUT FILE TYPE IN PROPER FORMAT + function ListFileTypes($types){ + $types_array = preg_replace('/,/',' ',$types); + $types_array = explode(' ',$types_array); + $list = 'Video,'; + for($i=0;$i<=count($types_array);$i++){ + if($types_array[$i]!=''){ + $list .= '*.'.$types_array[$i]; + if($i!=count($types_array))$list .= ';'; + } + } + return $list; + } + + + + + /** + * Get Directory Size - get_video_file($vdata,$no_video,false); + */ + function get_directory_size($path) + { + $totalsize = 0; + $totalcount = 0; + $dircount = 0; + if ($handle = opendir ($path)) + { + while (false !== ($file = readdir($handle))) + { + $nextpath = $path . '/' . $file; + if ($file != '.' && $file != '..' && !is_link ($nextpath)) + { + if (is_dir ($nextpath)) + { + $dircount++; + $result = get_directory_size($nextpath); + $totalsize += $result['size']; + $totalcount += $result['count']; + $dircount += $result['dircount']; + } + elseif (is_file ($nextpath)) + { + $totalsize += filesize ($nextpath); + $totalcount++; + } + } + } + } + closedir ($handle); + $total['size'] = $totalsize; + $total['count'] = $totalcount; + $total['dircount'] = $dircount; + return $total; + } + //FUNCTION USED TO FORMAT FILE SIZE + //INPUT BYTES + //OUTPT MB , Kib + function formatfilesize( $data ) { + // bytes + if( $data < 1024 ) { + return $data . " bytes"; + } + // kilobytes + else if( $data < 1024000 ) { + return round( ( $data / 1024 ), 1 ) . "KB"; + } + // megabytes + else if($data < 1024000000){ + return round( ( $data / 1024000 ), 1 ) . " MB"; + }else{ + return round( ( $data / 1024000000 ), 1 ) . " GB"; + } + + } + + /** + * FUNCTION USED TO GET THUMBNAIL + * @param ARRAY video_details, or videoid will also work + */ + + function get_thumb($vdetails,$num='default',$multi=false,$count=false,$return_full_path=true,$return_big=true,$size=false){ + global $db,$Cbucket,$myquery; + $num = $num ? $num : 'default'; + #checking what kind of input we have + if(is_array($vdetails)) + { + if(empty($vdetails['title'])) + { + #check for videoid + if(empty($vdetails['videoid']) && empty($vdetails['vid']) && empty($vdetails['videokey'])) + { + if($multi) + return $dthumb[0] = default_thumb(); + return default_thumb(); + }else{ + if(!empty($vdetails['videoid'])) + $vid = $vdetails['videoid']; + elseif(!empty($vdetails['vid'])) + $vid = $vdetails['vid']; + elseif(!empty($vdetails['videokey'])) + $vid = $vdetails['videokey']; + else + { + if($multi) + return $dthumb[0] = default_thumb(); + return default_thumb(); + } + } + } + }else{ + if(is_numeric($vdetails)) + $vid = $vdetails; + else + { + if($multi) + return $dthumb[0] = default_thumb(); + return default_thumb(); + } + } + + + #checking if we have vid , so fetch the details + if(!empty($vid)) + $vdetails = $myquery->get_video_details($vid); + + if(empty($vdetails['title'])) + { + if($multi) + return default_thumb(); + return default_thumb(); + } + + #Checking if there is any custom function for + if(count($Cbucket->custom_get_thumb_funcs) > 0) + { + + foreach($Cbucket->custom_get_thumb_funcs as $funcs) + { + + //Merging inputs + $in_array = array( + 'num' => $num, + 'multi' => $multi, + 'count' => $count, + 'return_full_path' => $return_full_path, + 'return_big' => $return_big + ); + if(function_exists($funcs)) + { + $func_returned = $funcs($vdetails,$in_array); + if($func_returned) + return $func_returned; + } + } + } + + #get all possible thumbs of video + if($vdetails['file_name']) + $vid_thumbs = glob(THUMBS_DIR."/".$vdetails['file_name']."*"); + #replace Dir with URL + if(is_array($vid_thumbs)) + foreach($vid_thumbs as $thumb) + { + if(file_exists($thumb) && filesize($thumb)>0) + { + $thumb_parts = explode('/',$thumb); + $thumb_file = $thumb_parts[count($thumb_parts)-1]; + + if(!is_big($thumb_file) || $return_big) + { + if($return_full_path) + $thumbs[] = THUMBS_URL.'/'.$thumb_file; + else + $thumbs[] = $thumb_file; + } + }elseif(file_exists($thumb)) + unlink($thumb); + } + + if(count($thumbs)==0) + { + if($count) + return count($thumbs); + if($multi) + return $dthumb[0] = default_thumb(); + return default_thumb(); + } + else + { + if($multi) + return $thumbs; + if($count) + return count($thumbs); + + //Now checking for thumb + if($num=='default') + { + $num = $vdetails['default_thumb']; + } + if($num=='big' || $size=='big') + { + + $num = 'big-'.$vdetails['default_thumb']; + if(!file_exists(THUMBS_DIR.'/'.$vdetails['file_name'].'-'.$num.'.jpg')) + $num = 'big'; + } + + $default_thumb = array_find($vdetails['file_name'].'-'.$num,$thumbs); + + if(!empty($default_thumb)) + return $default_thumb; + return $thumbs[0]; + } + + } + + /** + * Function used to check weaether given thumb is big or not + */ + function is_big($thumb_file) + { + if(strstr($thumb_file,'big')) + return true; + else + return false; + } + function GetThumb($vdetails,$num='default',$multi=false,$count=false) + { + + return get_thumb($vdetails,$num,$multi,$count); + } + + /** + * function used to get detaulf thumb of ClipBucket + */ + function default_thumb() + { + if(file_exists(TEMPLATEDIR.'/images/thumbs/processing.png')) + { + return TEMPLATEURL.'/images/thumbs/processing.png'; + }elseif(file_exists(TEMPLATEDIR.'/images/thumbs/processing.jpg')) + { + return TEMPLATEURL.'/images/thumbs/processing.jpg'; + }else + return BASEURL.'/files/thumbs/processing.jpg'; + } + + /** + * Function used to check weather give thumb is deafult or not + */ + function is_default_thumb($i) + { + if(getname($i)=='processing.jpg') + return true; + else + return false; + } + + + //TEST EXCEC FUNCTION + function test_exec( $cmd ) + { + echo '
    '; + echo '

    ' . htmlentities( $cmd ) . '

    '; + + if (stristr(PHP_OS, 'WIN')) { + $cmd = $cmd; + }else{ + $cmd = "PATH=\$PATH:/bin:/usr/bin:/usr/local/bin bash -c \"$cmd\""; + } + $data = shell_exec( $cmd ); + if( $data === false ) + echo "

    FAILED: $cmd

    "; + echo '

    ' . htmlentities( $data ) . '

    '; + } + + /** + * Function used to get shell output + */ + function shell_output($cmd) + { + if (stristr(PHP_OS, 'WIN')) { + $cmd = $cmd; + }else{ + $cmd = "PATH=\$PATH:/bin:/usr/bin:/usr/local/bin bash -c \"$cmd\" 2>&1"; + } + $data = shell_exec( $cmd ); + return $data; + } + + /** + * Function used to get video link + * @param ARRAY video details + */ + function video_link($vdetails,$type=NULL) + { + global $myquery; + #checking what kind of input we have + if(is_array($vdetails)) + { + if(empty($vdetails['title'])) + { + #check for videoid + if(empty($vdetails['videoid']) && empty($vdetails['vid']) && empty($vdetails['videokey'])) + { + return BASEURL; + }else{ + if(!empty($vdetails['videoid'])) + $vid = $vdetails['videoid']; + elseif(!empty($vdetails['vid'])) + $vid = $vdetails['vid']; + elseif(!empty($vdetails['videokey'])) + $vid = $vdetails['videokey']; + else + return BASEURL; + } + } + }else{ + if(is_numeric($vdetails)) + $vid = $vdetails; + else + return BASEURL; + } + #checking if we have vid , so fetch the details + if(!empty($vid)) + $vdetails = $myquery->get_video_details($vid); + + //calling for custom video link functions + $functions = cb_get_functions('video_link'); + if($functions) + { + foreach($functions as $func) + { + $array = array('vdetails'=>$vdetails,'type'=>$type); + if(function_exists($func['func'])) + { + $returned = $func['func']($array); + if($returned) + { + $link = $returned; + return $link; + break; + } + } + } + } + + $plist = ""; + if(SEO == 'yes'){ + + if($vdetails['playlist_id']) + $plist = '?&play_list='.$vdetails['playlist_id']; + + switch(config('seo_vido_url')) + { + default: + $link = BASEURL.'/video/'.$vdetails['videokey'].'/'.SEO(clean(str_replace(' ','-',$vdetails['title']))).$plist; + break; + + case 1: + { + $link = BASEURL.'/'.SEO(clean(str_replace(' ','-',$vdetails['title']))).'_v'.$vdetails['videoid'].$plist; + } + break; + + case 2: + { + $link = BASEURL.'/video/'.$vdetails['videoid'].'/'.SEO(clean(str_replace(' ','-',$vdetails['title']))).$plist; + } + break; + + case 3: + { + $link = BASEURL.'/video/'.$vdetails['videoid'].'_'.SEO(clean(str_replace(' ','-',$vdetails['title']))).$plist; + } + break; + } + + + }else{ + if($vdetails['playlist_id']) + $plist = '&play_list='.$vdetails['playlist_id']; + $link = BASEURL.'/watch_video.php?v='.$vdetails['videokey'].$plist; + } + if(!$type || $type=='link') + return $link; + elseif($type=='download') + return BASEURL.'/download.php?v='.$vdetails['videokey']; + } + + + /** + * Function used to tell ClipBucket that it has closed the script + */ + function the_end() + { + if(!$isWorthyBuddy) + { + /* + echo base64_decode("PGgyPklsbGVnYWwgT3BlcmF0aW9uIEZvdW5k"); + echo "- Please VISIT "; + echo base64_decode("PGEgaHJlZj0iaHR0cDovL2NsaXAtYnVja2V0LmNvbS8iPkNsaXBCdWNrZXQ8L2E+"); + echo " for Details"; + */ + + //Dear user, i have spent too much time of my life on developing + //This software and if you want to return me in this way, + //its ok for me, but for those who told you how to do this... + echo ""; + echo 'i dont care if you try to play with my code, but what really pisses me off + is INSULT'; + } + } + + //Function That will use in creating SEO urls + function VideoLink($vdetails,$type=NULL) + { + return video_link($vdetails,$type); + } + + /** + * Group Link + */ + function group_link($params) + { + $grp = $params['details']; + $id = $grp['group_id']; + $name = $grp['group_name']; + $url = $grp['group_url']; + + if($params['type']=='' || $params['type']=='group') + { + if(SEO==yes) + return BASEURL.'/group/'.$url; + else + return BASEURL.'/view_group.php?url='.$url; + } + + if($params['type']=='view_members') + { + return BASEURL.'/view_group_members.php?url='.$url; + if(SEO==yes) + return BASEURL.'/group_members/'.$url; + else + return BASEURL.'/view_group_members.php?url='.$url; + } + + if($params['type']=='view_videos') + { + return BASEURL.'/view_group_videos.php?url='.$url; + if(SEO==yes) + return BASEURL.'/group_videos/'.$url; + else + return BASEURL.'/view_group_videos.php?url='.$url; + } + + if($params['type'] == 'view_topics') + { + if(SEO == "yes") + return BASEURL."/group/".$url."?mode=view_topics"; + else + return BASEURL."/view_group.php?url=".$url."&mode=view_topics"; + } + + if($params['type'] == 'view_report_form') + { + if(SEO == "yes") + return BASEURL."/group/".$url."?mode=view_report_form"; + else + return BASEURL."/view_group.php?url=".$url."&mode=view_report_form"; + } + } + + /** + * FUNCTION USED TO GET COMMENTS + * @param : array(); + */ + function getComments($params=NULL) + { + global $db; + $order = $params['order']; + $limit = $params['limit']; + $type = $params['type']; + $cond = ''; + if(empty($type)) + $type = "v"; + $cond .= tbl("comments.type")." = '".$type."'"; + + if($params['type_id'] && $params['sectionTable']) + { + if($cond != "") + $cond .= " AND "; + $cond .= tbl("comments.type_id")." = ".tbl($params['sectionTable'].".".$params['type_id']); + } + + if($params['cond']) + { + if($cond != "") + $cond .= " AND "; + $cond .= $params['cond']; + } + + if(!$params['count_only']) + $result = $db->select(tbl("comments".($params['sectionTable']?",".$params['sectionTable']:NULL)),"*",$cond,$limit,$order); + + //echo $db->db_query; + if($params['count_only']) + $result = $db->count(tbl("comments"),"*",$cond); + + if($result) + return $result; + else + return false; + } + + function getSmartyComments($params) + { + global $myquery; + $comments = $myquery->getComments($params); + + if($params['assign']) + assign($params['assign'],$comments); + else + return $comments; + } + + /** + * FUNCTION USED TO GET ADVERTISMENT + * @param : array(Ad Code, LIMIT); + */ + function getAd($params) + { + global $adsObj; + $data = ''; + if($params['style'] || $params['class'] || $params['align']) + $data .= '
    '; + $data .= ad($adsObj->getAd($params['place'])); + if($params['style'] || $params['class'] || $params['align']) + $data .= '
    '; + return $data; + } + + /** + * FUNCTION USED TO GET THUMBNAIL, MADE FOR SMARTY + * @ param : array("FLV"); + */ + function getSmartyThumb($params) + { + return get_thumb($params['vdetails'],$params['num'],$params['multi'],$params['count_only'],true,true,$params['size']); + } + + /** + * Function Used to format video duration + * @param : array(videoKey or ID,videok TITLE) + */ + + function videoSmartyLink($params) + { + $link = VideoLink($params['vdetails'],$params['type']); + if(!$params['assign']) + return $link; + else + assign($params['assign'],$link); + } + + /** + * FUNCTION USED TO GET VIDEO RATING IN SMARTY + * @param : array(pullRating($videos[$id]['videoid'],false,false,false,'novote'); + */ + function pullSmartyRating($param) + { + return pullRating($param['id'],$param['show5'],$param['showPerc'],$aram['showVotes'],$param['static']); + } + + /** + * FUNCTION USED TO CLEAN VALUES THAT CAN BE USED IN FORMS + */ + function cleanForm($string) + { + if(is_string($string)) + $string = htmlspecialchars($string); + if(get_magic_quotes_gpc()) + if(!is_array($string)) + $string = stripslashes($string); + return $string; + } + function form_val($string){return cleanForm($string); } + + //Escaping Magic Quotes + + /** + * FUNCTION USED TO MAKE TAGS MORE PERFECT + * @Author : Arslan Hassan + * @param tags text unformatted + * returns tags formatted + */ + function genTags($tags,$sep=',') + { + //Remove fazool spaces + $tags = preg_replace(array('/ ,/','/, /'),',',$tags); + $tags = preg_replace( "`[,]+`" , ",", $tags); + $tag_array = explode($sep,$tags); + foreach($tag_array as $tag) + { + if(isValidtag($tag)) + { + $newTags[] = $tag; + } + + } + //Creating new tag string + if(is_array($newTags)) + $tagString = implode(',',$newTags); + else + $tagString = 'no-tag'; + return $tagString; + } + + /** + * FUNCTION USED TO VALIDATE TAG + * @Author : Arslan Hassan + * @param tag + * return true or false + */ + function isValidtag($tag) + { + $disallow_array = array + ('of','is','no','on','off','a','the','why','how','what','in'); + if(!in_array($tag,$disallow_array) && strlen($tag)>2) + return true; + else + return false; + } + + + /** + * FUNCTION USED TO GET CATEGORY LIST + */ + function getCategoryList($params=false) + { + global $cats; + $cats = ""; + + $type = $params['type']; + switch($type) + { + default: + { + cb_call_functions('categoryListing',$params); + } + break; + + case "video":case "videos": + case "v": + { + global $cbvid; + $cats = $cbvid->cbCategories($params); + } + break; + + case "users":case "user": + case "u": case "channels": case "channels": + { + global $userquery; + $cats = $userquery->cbCategories($params); + } + break; + + case "group":case "groups": + case "g": + { + global $cbgroup; + $cats = $cbgroup->cbCategories($params); + } + break; + + case "collection":case "collections": + case "cl": + { + global $cbcollection; + $cats = $cbcollection->cbCategories($params); + } + break; + } + + return $cats; + } + /*function getCategoryList($type='video',$with_all=false,$return_html=false) + { + $use_subs = config('use_subs'); + + switch ($type) + { + case "video": + default: + { + global $cbvid; + + if($return_html && $use_subs == "1") { + $cats = $cbvid->cb_list_categories($type,$with_all); + } else { + if($with_all) + $all_cat = array(array('category_id'=>'all','category_name'=>'All')); + + $cats = $cbvid->get_categories(); + + if($all_cat && is_array($cats)) + $cats = array_merge($all_cat,$cats); + } + return $cats; + } + break; + case "user": + { + global $userquery; + + + if($return_html && $use_subs == "1") { + $cats = $userquery->cb_list_categories($type,$with_all); + } else { + if($with_all) + $all_cat = array(array('category_id'=>'all','category_name'=>'All')); + + $cats = $userquery->get_categories(); + + if($all_cat && is_array($cats)) + $cats = array_merge($all_cat,$cats); + } + return $cats; + } + break; + + case "group": + case "groups": + { + global $cbgroup; + + + if($return_html && $use_subs == "1") { + $cats = $cbgroup->cb_list_categories($type,$with_all); + } else { + if($with_all) + $all_cat = array(array('category_id'=>'all','category_name'=>'All')); + + $cats = $cbgroup->get_categories(); + + if($all_cat && is_array($cats)) + $cats = array_merge($all_cat,$cats); + } + return $cats; + } + break; + + case "collection": + case "collections": + { + global $cbcollection; + + + if($return_html && $use_subs == "1") { + $cats = $cbcollection->cb_list_categories($type,$with_all); + } else { + if($with_all) + $all_cat = array(array('category_id'=>'all','category_name'=>'All')); + + $cats = $cbcollection->get_categories(); + + if($all_cat && is_array($cats)) + $cats = array_merge($all_cat,$cats); + } + return $cats; + } + break; + } + }*/ + function cb_bottom() + { + //Woops..its gone + } + + + function getSmartyCategoryList($params) + { + return getCategoryList($params); + } + + + //Function used to register function as multiple modifiers + + + + /** + * Function used to insert data in database + * @param : table name + * @param : fields array + * @param : values array + * @param : extra params + */ + function dbInsert($tbl,$flds,$vls,$ep=NULL) + { + global $db ; + $db->insert($tbl,$flds,$vls,$ep); + } + + /** + * Function used to Update data in database + * @param : table name + * @param : fields array + * @param : values array + * @param : Condition params + * @params : Extra params + */ + function dbUpdate($tbl,$flds,$vls,$cond,$ep=NULL) + { + global $db ; + return $db->update($tbl,$flds,$vls,$cond,$ep); + } + + + + /** + * Function used to Delete data in database + * @param : table name + * @param : fields array + * @param : values array + * @params : Extra params + */ + function dbDelete($tbl,$flds,$vls,$ep=NULL) + { + global $db ; + return $db->delete($tbl,$flds,$vls,$ep); + } + + + /** + ** + */ + function cbRocks() + { + define("isCBSecured",TRUE); + //echo cbSecured(CB_SIGN); + } + + /** + * Insert Id + */ + function get_id($code) + { + global $Cbucket; + $id = $Cbucket->ids[$code]; + if(empty($id)) $id = $code; + return $id; + } + + /** + * Set Id + */ + function set_id($code,$id) + { + global $Cbucket; + return $Cbucket->ids[$code]=$id; + } + + + /** + * Function used to select data from database + */ + function dbselect($tbl,$fields='*',$cond=false,$limit=false,$order=false,$p=false) + { + global $db; + return $db->dbselect($tbl,$fields,$cond,$limit,$order,$p); + } + + + + /** + * An easy function for erorrs and messages (e is basically short form of exception) + * I dont want to use the whole Trigger and Exception code, so e pretty works for me :D + * @param TEXT $msg + * @param TYPE $type (e for Error, m for Message + * @param INT $id Any Predefined Message ID + */ + + function e($msg=NULL,$type='e',$id=NULL) + { + global $eh; + if(!empty($msg)) + return $eh->e($msg,$type,$id); + } + + + /** + * Function used to get subscription template + */ + function get_subscription_template() + { + global $LANG; + return lang('user_subscribe_message'); + } + + + /** + * Short form of print_r as pr + */ + function pr($text,$wrap_pre=false) + { + if(!$wrap_pre) + print_r($text); + else + { + echo "
    ";
    +			print_r($text);
    +			echo "
    "; + } + } + + + /** + * This function is used to call function in smarty template + * This wont let you pass parameters to the function, but it will only call it + */ + function FUNC($params) + { + global $Cbucket; + //Function used to call functions by + //{func namefunction_name} + // in smarty + $func=$params['name']; + if(function_exists($func)) + $func(); + } + + /** + * Function used to get userid anywhere + * if there is no user_id it will return false + */ + function user_id() + { + global $userquery; + if($userquery->userid !='' && $userquery->is_login) return $userquery->userid; else false; + } + //replica + function userid(){return user_id();} + + /** + * Function used to get username anywhere + * if there is no usern_name it will return false + */ + function user_name() + { + global $userquery; + if($userquery->user_name) + return $userquery->user_name; + else + return $userquery->get_logged_username(); + } + function username(){return user_name();} + + /** + * Function used to check weather user access or not + */ + function has_access($access,$check_only=TRUE,$verify_logged_user=true) + { + global $userquery; + + return $userquery->login_check($access,$check_only,$verify_logged_user); + } + + /** + * Function used to return mysql time + * @author : Fwhite + */ + function NOW() + { + return date('Y-m-d H:i:s', time()); + } + + + /** + * Function used to get Regular Expression from database + * @param : code + */ + function get_re($code) + { + global $db; + $results = $db->select(tbl("validation_re"),"*"," re_code='$code'"); + if($db->num_rows>0) + { + return $results[0]['re_syntax']; + }else{ + return false; + } + } + function get_regular_expression($code) + { + return get_re($code); + } + + /** + * Function used to check weather input is valid or not + * based on preg_match + */ + function check_re($syntax,$text) + { + preg_match('/'.$syntax.'/i',$text,$matches); + if(!empty($matches[0])) + { + return true; + }else{ + return false; + } + } + function check_regular_expression($code,$text) + { + return check_re($code,$text); + } + + /** + * Function used to check field directly + */ + function validate_field($code,$text) + { + $syntax = get_re($code); + if(empty($syntax)) + return true; + return check_regular_expression($syntax,$text); + } + + function is_valid_syntax($code,$text) + { + if(DEVELOPMENT_MODE && DEV_INGNORE_SYNTAX) + return true; + return validate_field($code,$text); + } + + /** + * Function used to apply function on a value + */ + function is_valid_value($func,$val) + { + if(!function_exists($func)) + return true; + elseif(!$func($val)) + return false; + else + return true; + } + + function apply_func($func,$val) + { + if(is_array($func)) + { + foreach($func as $f) + if(function_exists($f)) + $val = $f($val); + }else{ + $val = $func($val); + } + return $val; + } + + /** + * Function used to validate YES or NO input + */ + function yes_or_no($input,$return=yes) + { + $input = strtolower($input); + if($input!=yes && $input !=no) + return $return; + else + return $input; + } + + /** + * Function used to validate category + * INPUT $cat array + */ + function validate_vid_category($array=NULL) + { + global $myquery,$LANG,$cbvid; + if($array==NULL) + $array = $_POST['category']; + if(count($array)==0) + return false; + else + { + + foreach($array as $arr) + { + if($cbvid->category_exists($arr)) + $new_array[] = $arr; + } + } + if(count($new_array)==0) + { + e(lang('vdo_cat_err3')); + return false; + }elseif(count($new_array)>ALLOWED_VDO_CATS) + { + e(sprintf(lang('vdo_cat_err2'),ALLOWED_VDO_CATS)); + return false; + } + + return true; + } + + /** + * Function used to validate category + * INPUT $cat array + */ + function validate_group_category($array=NULL) + { + global $cbgroup; + return $cbgroup->validate_group_category($array); + } + + /** + * Function used to validate category + * INPUT $cat array + */ + function validate_collection_category($array=NULL) + { + global $cbcollection; + return $cbcollection->validate_collection_category($array); + } + + /** + * Function used to check videokey exists or not + * key_exists + */ + function vkey_exists($key) + { + global $db; + $db->select(tbl("video"),"videokey"," videokey='$key'"); + if($db->num_rows>0) + return true; + else + return false; + } + + /** + * Function used to check file_name exists or not + * as its a unique name so it will not let repost the data + */ + function file_name_exists($name) + { + global $db; + $results = $db->select(tbl("video"),"videoid,file_name"," file_name='$name'"); + + if($db->num_rows >0) + return $results[0]['videoid']; + else + return false; + } + + + + /** + * Function used to get video from conversion queue + */ + function get_queued_video($update=TRUE,$fileName=NULL) + { + global $db; + $max_conversion = config('max_conversion'); + $max_conversion = $max_conversion ? $max_conversion : 2; + $max_time_wait = config('max_time_wait'); //Maximum Time Wait to make PRocessing Video Automatcially OK + $max_time_wait = $max_time_wait ? $max_time_wait : 7200; + + //First Check How Many Videos Are In Queu Already + $processing = $db->count(tbl("conversion_queue"),"cqueue_id"," cqueue_conversion='p' "); + if(true) + { + if($fileName) + { + $queueName = getName($fileName); + $ext = getExt($fileName); + $fileNameQuery = " AND cqueue_name ='$queueName' AND cqueue_ext ='$ext' "; + } + $results = $db->select(tbl("conversion_queue"),"*","cqueue_conversion='no' $fileNameQuery",1); + $result = $results[0]; + if($update) + $db->update(tbl("conversion_queue"),array("cqueue_conversion","time_started"),array("p",time())," cqueue_id = '".$result['cqueue_id']."'"); + return $result; + }else + { + //Checking if video is taking more than $max_time_wait to convert so we can change its time to + //OK Automatically + //Getting All Videos That are being processed + $results = $db->select(tbl("conversion_queue"),"*"," cqueue_conversion='p' "); + foreach($results as $vid) + { + if($vid['time_started']) + { + if($vid['time_started']) + $time_started = $vid['time_started']; + else + $time_started = strtotime($vid['date_added']); + + $elapsed_time = time()-$time_started; + + if($elapsed_time>$max_time_wait) + { + //CHanging Status TO OK + $db->update(tbl("conversion_queue"),array("cqueue_conversion"), + array("yes")," cqueue_id = '".$result['cqueue_id']."'"); + } + } + } + return false; + } + } + + + + /** + * Function used to get video being processed + */ + function get_video_being_processed($fileName=NULL) + { + global $db; + + if($fileName) + { + $queueName = getName($fileName); + $ext = getExt($fileName); + $fileNameQuery = " AND cqueue_name ='$queueName' AND cqueue_ext ='$ext' "; + } + + $results = $db->select(tbl("conversion_queue"),"*","cqueue_conversion='p' $fileNameQuery"); + return $results; + } + + function get_video_details($vid=NULL) + { + global $myquery; + if(!$vid) + global $vid; + return $myquery->get_video_details($vid); + } + + + + /** + * Function used to get all video files + * @param Vdetails + * @param $count_only + * @param $with_path + */ + function get_all_video_files($vdetails,$count_only=false,$with_path=false) + { + $details = get_video_file($vdetails,true,$with_path,true,$count_only); + if($count_only) + return count($details); + return $details; + } + function get_all_video_files_smarty($params) + { + $vdetails = $params['vdetails']; + $count_only = $params['count_only']; + $with_path = $params['with_path']; + return get_all_video_files($vdetails,$count_only,$with_path); + } + + /** + * Function use to get video files + */ + function get_video_file($vdetails,$return_default=true,$with_path=true,$multi=false,$count_only=false,$hq=false) + { + global $Cbucket; + # checking if there is any other functions + # available + if(is_array($Cbucket->custom_video_file_funcs)) + foreach($Cbucket->custom_video_file_funcs as $func) + if(function_exists($func)) + { + $func_returned = $func($vdetails, $hq); + if($func_returned) + return $func_returned; + } + + #Now there is no function so lets continue as + if($vdetails['file_name']) + $vid_files = glob(VIDEOS_DIR."/".$vdetails['file_name']."*"); + + #replace Dir with URL + if(is_array($vid_files)) + foreach($vid_files as $file) + { + $files_part = explode('/',$file); + $video_file = $files_part[count($files_part)-1]; + + if($with_path) + $files[] = VIDEOS_URL.'/'.$video_file; + else + $files[] = $video_file; + } + + if(count($files)==0 && !$multi && !$count_only) + { + if($return_default) + { + if($with_path) + return VIDEOS_URL.'/no_video.flv'; + else + return 'no_video.flv'; + }else{ + return false; + } + }else{ + if($multi) + return $files; + if($count_only) + return count($files); + + foreach($files as $file) + { + if($hq) + { + if(getext($file)=='mp4') + { + return $file; + break; + } + }else{ + return $file; + break; + } + } + return $files[0]; + } + } + + /** + * FUnction used to get HQ ie mp4 video + */ + function get_hq_video_file($vdetails,$return_default=true) + { + return get_video_file($vdetails,$return_default,true,false,false,true); + } + + + /** + * Function used to display flash player for ClipBucket video + */ + function flashPlayer($param) + { + global $Cbucket,$swfobj; + + $param['player_div'] = $param['player_div'] ? $param['player_div'] : 'videoPlayer'; + + $key = $param['key']; + $flv = $param['flv'].'.flv'; + $code = $param['code']; + $flv_url = $file; + $embed = $param['embed']; + $code = $param['code']; + $height = $param['height'] ? $param['height'] : config('player_height'); + $width = $param['width'] ? $param['width'] : config('player_width'); + $param['height'] = $height; + $param['width'] = $width ; + + if(!$param['autoplay']) + $param['autoplay'] = config('autoplay_video'); + + assign('player_params',$param); + if(count($Cbucket->actions_play_video)>0) + { + foreach($Cbucket->actions_play_video as $funcs ) + { + + if(function_exists($funcs)) + { + $func_data = $funcs($param); + } + if($func_data) + { + $player_code = $func_data; + $show_player = true; + break; + } + } + } + + if(function_exists('cbplayer') && empty($player_code)) + $player_code = cbplayer($param,true); + + global $pak_player; + + if($player_code) + if(!$pak_player && $show_player) + { + assign("player_js_code",$player_code); + Template(PLAYER_DIR.'/player.html',false); + return false; + }else + { + return false; + } + + return blank_screen($param); + } + + + /** + * FUnctiuon used to plya HQ videos + */ + function HQflashPlayer($param) + { + return flashPlayer($param); + } + + + /** + * Function used to get player from website settings + */ + function get_player() + { + global $Cbucket; + return $Cbucket->configs['player_file']; + } + + + /** + * Function used to get user avatar + * @param ARRAY $userdetail + * @param SIZE $int + */ + function avatar($param) + { + global $userquery; + $udetails = $param['details']; + $size = $param['size']; + $uid = $param['uid']; + return $userquery->avatar($udetails,$size,$uid); + } + + + /** + * This funcion used to call function dynamically in smarty + */ + function load_form($param) + { + $func = $param['name']; + if(function_exists($func)) + return $func($param); + } + + + + /** + * Function used to get PHP Path + */ + function php_path() + { + if(PHP_PATH !='') + return PHP_PATH; + else + return "/usr/bin/php"; + } + + /** + * Functon used to get binary paths + */ + function get_binaries($path) + { + if(is_array($path)) + { + $type = $path['type']; + $path = $path['path']; + } + + if($type=='' || $type=='user') + { + $path = strtolower($path); + switch($path) + { + case "php": + return php_path(); + break; + + case "mp4box": + return config("mp4boxpath"); + break; + + case "flvtool2": + return config("flvtool2path"); + break; + + case "ffmpeg": + return config("ffmpegpath"); + break; + } + }else{ + $path = strtolower($path); + switch($path) + { + case "php": + $return_path = shell_output("which php"); + if($return_path) + return $return_path; + else + return "Unable to find PHP path"; + break; + + case "mp4box": + $return_path = shell_output("which MP4Box"); + if($return_path) + return $return_path; + else + return "Unable to find mp4box path"; + break; + + case "flvtool2": + $return_path = shell_output("which flvtool2"); + if($return_path) + return $return_path; + else + return "Unable to find flvtool2 path"; + break; + + case "ffmpeg": + $return_path = shell_output("which ffmpeg"); + if($return_path) + return $return_path; + else + return "Unable to find ffmpeg path"; + break; + } + } + } + + + /** + * Function in case htmlspecialchars_decode does not exist + */ + function unhtmlentities ($string) + { + $trans_tbl =get_html_translation_table (HTML_ENTITIES ); + $trans_tbl =array_flip ($trans_tbl ); + return strtr ($string ,$trans_tbl ); + } + + + + /** + * Function used to update processed video + * @param Files details + */ + function update_processed_video($file_array,$status='Successful',$ingore_file_status=false,$failed_status='') + { + global $db; + $file = $file_array['cqueue_name']; + $array = explode('-',$file); + + if(!empty($array[0])) + $file_name = $array[0]; + $file_name = $file; + + $file_path = VIDEOS_DIR.'/'.$file_array['cqueue_name'].'.flv'; + $file_size = @filesize($file_path); + + if(file_exists($file_path) && $file_size>0 && !$ingore_file_status) + { + $stats = get_file_details($file_name); + + //$duration = $stats['output_duration']; + //if(!$duration) + // $duration = $stats['duration']; + + $duration = parse_duration(LOGS_DIR.'/'.$file_array['cqueue_name'].'.log'); + + $db->update(tbl("video"),array("status","duration","failed_reason"), + array($status,$duration,$failed_status)," file_name='".$file_name."'"); + }else + { + $stats = get_file_details($file_name); + + //$duration = $stats['output_duration']; + //if(!$duration) + // $duration = $stats['duration']; + + $duration = parse_duration(LOGS_DIR.'/'.$file_array['cqueue_name'].'.log'); + + $db->update(tbl("video"),array("status","duration","failed_reason"), + array('Failed',$duration,$failed_status)," file_name='".$file_name."'"); + } + } + + + /** + * This function will activate the video if file exists + */ + function activate_video_with_file($vid) + { + global $db; + $vdetails = get_video_details($vid); + $file_name = $vdetails['file_name']; + $results = $db->select(tbl("conversion_queue"),"*"," cqueue_name='$file_name' AND cqueue_conversion='yes'"); + $result = $results[0]; + update_processed_video($result); + } + + + /** + * Function Used to get video file stats from database + * @param FILE_NAME + */ + function get_file_details($file_name) + { + global $db; + //$result = $db->select(tbl("video_files"),"*"," id ='$file_name' OR src_name = '$file_name' "); + //Reading Log File + $file = LOGS_DIR.'/'.$file_name.'.log'; + if(!file_exists($file)) + $file = $file_name; + if(file_exists($file)) + { + $data = file_get_contents($file); + //$file = file_get_contents('1260270267.log'); + + preg_match_all('/(.*) : (.*)/',trim($data),$matches); + + $matches_1 = ($matches[1]); + $matches_2 = ($matches[2]); + + for($i=0;$i> /dev/null &"); + exec($cmd); + //pclose(popen("start \"bla\" \"" . $exe . "\" " . escapeshellarg($args), "r")); + }else{ + exec($cmd . " > /dev/null &"); + } + } + + + /** + * Function used to get thumbnail number from its name + * Updated: If we provide full path for some reason and + * web-address has '-' in it, this means our result is messed. + * But we know our number will always be in last index + * So wrap it with end() and problem solved. + */ + function get_thumb_num($name) + { + $list = end(explode('-',$name)); + $list = explode('.',$list); + return $list[0]; + } + + + /** + * Function used to remove thumb + */ + function delete_video_thumb($file) + { + global $LANG; + $path = THUMBS_DIR.'/'.$file; + if(file_exists($path)) + { + unlink($path); + e(lang('video_thumb_delete_msg'),'m'); + }else{ + e(lang('video_thumb_delete_err')); + } + } + + + /** + * Function used to get array value + * if you know partial value of array and wants to know complete + * value of an array, this function is being used then + */ + function array_find($needle, $haystack) + { + foreach ($haystack as $item) + { + if (strpos($item, $needle) !== FALSE) + { + return $item; + break; + } + } + } + + + + /** + * Function used to give output in proper form + */ + function input_value($params) + { + $input = $params['input']; + $value = $input['value']; + + if($input['value_field']=='checked') + $value = $input['checked']; + + if($input['return_checked']) + return $input['checked']; + + if(function_exists($input['display_function'])) + return $input['display_function']($value); + elseif($input['type']=='dropdown') + { + if($input['checked']) + return $value[$input['checked']]; + else + return $value[0]; + }else + return $input['value']; + } + + /** + * Function used to convert input to categories + * @param input can be an array or #12# like + */ + function convert_to_categories($input) + { + if(is_array($input)) + { + foreach($input as $in) + { + if(is_array($in)) + { + foreach($in as $i) + { + if(is_array($i)) + { + foreach($i as $info) + { + $cat_details = get_category($info); + $cat_array[] = array($cat_details['categoryid'],$cat_details['category_name']); + } + }elseif(is_numeric($i)){ + $cat_details = get_category($i); + $cat_array[] = array($cat_details['categoryid'],$cat_details['category_name']); + } + } + }elseif(is_numeric($in)){ + $cat_details = get_category($in); + $cat_array[] = array($cat_details['categoryid'],$cat_details['category_name']); + } + } + }else{ + preg_match_all('/#([0-9]+)#/',$default['category'],$m); + $cat_array = array($m[1]); + foreach($cat_array as $i) + { + $cat_details = get_category($i); + $cat_array[] = array($cat_details['categoryid'],$cat_details['category_name']); + } + } + + $count = 1; + if(is_array($cat_array)) + { + foreach($cat_array as $cat) + { + echo ''.$cat[1].''; + if($count!=count($cat_array)) + echo ', '; + $count++; + } + } + } + + + + /** + * Function used to get categorie details + */ + function get_category($id) + { + global $myquery; + return $myquery->get_category($id); + } + + + /** + * Sharing OPT displaying + */ + function display_sharing_opt($input) + { + foreach($input as $key => $i) + { + return $key; + break; + } + } + + /** + * Function used to get number of videos uploaded by user + * @param INT userid + * @param Conditions + */ + function get_user_vids($uid,$cond=NULL,$count_only=false) + { + global $userquery; + return $userquery->get_user_vids($uid,$cond,$count_only); + } + + + + /** + * Function used to get error_list + */ + function error_list() + { + global $eh; + return $eh->error_list; + } + + + /** + * Function used to get msg_list + */ + function msg_list() + { + global $eh; + return $eh->message_list; + } + + + /** + * Function used to add tempalte in display template list + * @param File : file of the template + * @param Folder : weather to add template folder or not + * if set to true, file will be loaded from inside the template + * such that file path will becom $templatefolder/$file + * @param follow_show_page : this param tells weather to follow ClipBucket->show_page + * variable or not, if show_page is set to false and follow is true, this template will not load + * otherwise there it WILL + */ + function template_files($file,$folder=false,$follow_show_page=true) + { + global $ClipBucket; + if(!$folder) + $ClipBucket->template_files[] = array('file' => $file,'follow_show_page'=>$follow_show_page); + else + $ClipBucket->template_files[] = array('file'=>$file, + 'folder'=>$folder,'follow_show_page'=>$follow_show_page); + } + + /** + * Function used to include file + */ + function include_template_file($params) + { + $file = $params['file']; + + if(file_exists(LAYOUT.'/'.$file)) + Template($file); + elseif(file_exists($file)) + Template($file,false); + } + + + /** + * Function used to call display + */ + function display_it() + { + global $ClipBucket; + $dir = LAYOUT; + foreach($ClipBucket->template_files as $file) + { + if(file_exists(LAYOUT.'/'.$file) || is_array($file)) + { + + if(!$ClipBucket->show_page && $file['follow_show_page']) + { + + }else + { + if(!is_array($file)) + $new_list[] = $file; + else + { + if($file['folder'] && file_exists($file['folder'].'/'.$file['file'])) + $new_list[] = $file['folder'].'/'.$file['file']; + else + $new_list[] = $file['file']; + } + } + } + } + + assign('template_files',$new_list); + + Template('body.html'); + + footer(); + } + + + /** + * Function used to display hint + */ + function hint($hint) + { + + } + + + + function showpagination($total,$page,$link,$extra_params=NULL,$tag='#page#') + { + global $pages; + return $pages->pagination($total,$page,$link,$extra_params,$tag); + } + + + /** + * Function used to check username is disallowed or not + * @param USERNAME + */ + function check_disallowed_user($username) + { + global $Cbucket; + $disallowed_user = $Cbucket->configs['disallowed_usernames']; + $censor_users = explode(',',$disallowed_user); + if(in_array($username,$censor_users)) + return false; + else + return true; + } + + + /** + * Function used to validate username + * @input USERNAME + */ + function username_check($username) + { + global $Cbucket; + $banned_words = $Cbucket->configs['disallowed_usernames']; + $banned_words = explode(',',$banned_words); + foreach($banned_words as $word) + { + preg_match("/$word/Ui",$username,$match); + if(!empty($match[0])) + return false; + } + //Checking if its syntax is valid or not + $multi = config('allow_unicode_usernames'); + + //Checking Spaces + if(!config('allow_username_spaces')) + preg_match('/ /',$username,$matches); + if(!is_valid_syntax('username',$username) && $multi!='yes' || $matches) + e(lang("class_invalid_user")); + return true; + } + + + + + + /** + * Function used to check weather username already exists or not + * @input USERNAME + */ + function user_exists($user) + { + global $userquery; + return $userquery->username_exists($user); + } + + /** + * Function used to check weather email already exists or not + * @input email + */ + function email_exists($user) + { + global $userquery; + return $userquery->duplicate_email($user); + } + + /** + * function used to check weather group URL exists or not + */ + function group_url_exists($url) + { + global $cbgroup; + return $cbgroup->group_url_exists($url); + } + + + /** + * Function used to check weather erro exists or not + */ + function error($param='array') + { + if(count(error_list())>0) + { + if($param!='array') + { + if($param=='single') + $param = 0; + $msg = error_list(); + return $msg[$param]; + } + return error_list(); + }else{ + return false; + } + } + + /** + * Function used to check weather msg exists or not + */ + function msg($param='array') + { + if(count(msg_list())>0) + { + if($param!='array') + { + if($param=='single') + $param = 0; + $msg = msg_list(); + return $msg[$param]; + } + return msg_list(); + }else{ + return false; + } + } + + + + /** + * Function used to load plugin + * please check docs.clip-bucket.com + */ + function load_plugin() + { + global $cbplugin; + + } + + + + /** + * Function used to create limit functoin from current page & results + */ + function create_query_limit($page,$result) + { + $limit = $result; + if(empty($page) || $page == 0 || !is_numeric($page)){ + $page = 1; + + } + $from = $page-1; + $from = $from*$limit; + + return $from.','.$result; + } + + + /** + * Function used to get value from $_GET + */ + function get_form_val($val,$filter=false) + { + if($filter) + return form_val($_GET[$val]); + else + return $_GET[$val]; + }function get($val){ return get_form_val($val); } + + /** + * Function used to get value form $_POST + */ + function post_form_val($val,$filter=false) + { + if($filter) + return form_val($_POST[$val]); + else + $_POST[$val]; + } + + + /** + * Function used to get value from $_REQUEST + */ + function request_form_val($val,$filter=false) + { + if($filter) + return form_val($_REQUEST[$val]); + else + $_REQUEST[$val]; + } + + + /** + * Function used to return LANG variable + */ + function lang($var,$sprintf=false) + { + global $LANG,$Cbucket; + + $array_str = array + ( '{title}'); + $array_replace = array + ( $Cbucket->configs['site_title'] ); + + if($LANG[$var]) + { + $phrase = str_replace($array_str,$array_replace,$LANG[$var]); + }else + { + $phrase = str_replace($array_str,$array_replace,$var); + } + + if($sprintf) + { + $sprints = explode(',',$sprintf); + if(is_array($sprints)) + { + foreach($sprints as $sprint) + { + $phrase = sprintf($phrase,$sprint); + } + } + } + + return $phrase; + + } + function smarty_lang($param) + { + if($param['assign']=='') + return lang($param['code'],$param['sprintf']); + else + assign($param['assign'],lang($param['code'],$param['sprintf'])); + } + + + + /** + * function used to remove video thumbs + */ + function remove_video_thumbs($vdetails) + { + global $cbvid; + return $cbvid->remove_thumbs($vdetails); + } + + /** + * function used to remove video log + */ + function remove_video_log($vdetails) + { + global $cbvid; + return $cbvid->remove_log($vdetails); + } + + /** + * function used to remove video files + */ + function remove_video_files($vdetails) + { + global $cbvid; + return $cbvid->remove_files($vdetails); + } + + + /** + * Function used to get player logo + */ + function website_logo() + { + $logo_file = config('player_logo_file'); + if(file_exists(BASEDIR.'/images/'.$logo_file) && $logo_file) + return BASEURL.'/images/'.$logo_file; + + return BASEURL.'/images/logo.png'; + } + + /** + * Function used to assign link + */ + function cblink($params) + { + global $ClipBucket; + $name = $params['name']; + $ref = $param['ref']; + + if($name=='category') + { + return category_link($params['data'],$params['type']); + } + if($name=='sort') + { + return sort_link($params['sort'],'sort',$params['type']); + } + if($name=='time') + { + return sort_link($params['sort'],'time',$params['type']); + } + if($name=='tag') + { + return BASEURL.'/search_result.php?query='.urlencode($params['tag']).'&type='.$params['type']; + } + if($name=='category_search') + { + return BASEURL.'/search_result.php?category[]='.$params['category'].'&type='.$params['type']; + } + + + if(SEO!='yes') + { + preg_match('/http:\/\//',$ClipBucket->links[$name][0],$matches); + if($matches) + $link = $ClipBucket->links[$name][0]; + else + $link = BASEURL.'/'.$ClipBucket->links[$name][0]; + }else + { + preg_match('/http:\/\//',$ClipBucket->links[$name][1],$matches); + if($matches) + $link = $ClipBucket->links[$name][1]; + else + $link = BASEURL.'/'.$ClipBucket->links[$name][1]; + } + + $param_link = ""; + if(!empty($params['extra_params'])) + { + preg_match('/\?/',$link,$matches); + if(!empty($matches[0])) + { + $param_link = '&'.$params['extra_params']; + }else{ + $param_link = '?'.$params['extra_params']; + } + } + + if($params['assign']) + assign($params['assign'],$link.$param_link); + else + return $link.$param_link; + } + + /** + * Function used to check video is playlable or not + * @param vkey,vid + */ + function video_playable($id) + { + global $cbvideo,$userquery; + + if(isset($_POST['watch_protected_video'])) + $video_password = mysql_clean(post('video_password')); + else + $video_password = ''; + + if(!is_array($id)) + $vdo = $cbvideo->get_video($id); + else + $vdo = $id; + $uid = userid(); + if(!$vdo) + { + e(lang("class_vdo_del_err")); + return false; + }elseif($vdo['status']!='Successful') + { + e(lang("this_vdo_not_working")); + if(!has_access('admin_access',TRUE)) + return false; + else + return true; + }elseif($vdo['broadcast']=='private' + && !$userquery->is_confirmed_friend($vdo['userid'],userid()) + && !is_video_user($vdo) + && !has_access('video_moderation',true) + && $vdo['userid']!=$uid){ + e(lang('private_video_error')); + return false; + }elseif($vdo['active'] == 'pen'){ + e(lang("video_in_pending_list")); + if(has_access('admin_access',TRUE) || $vdo['userid'] == userid()) + return true; + else + return false; + }elseif($vdo['broadcast']=='logged' + && !userid() + && !has_access('video_moderation',true) + && $vdo['userid']!=$uid){ + e(lang('not_logged_video_error')); + return false; + }elseif($vdo['active']=='no' ) + { + e(lang("vdo_iac_msg")); + if(!has_access('admin_access',TRUE)) + return false; + else + return true; + } + //No Checking for video password + elseif($vdo['video_password'] + && $vdo['broadcast']=='unlisted' + && $vdo['video_password']!=$video_password + && !has_access('video_moderation',true) + && $vdo['userid']!=$uid) + { + if(!$video_password) + e(lang("video_pass_protected")); + else + e(lang("invalid_video_password")); + template_files("blocks/watch_video/video_password.html",false,false); + } + else + { + $funcs = cb_get_functions('watch_video'); + + if($funcs) + foreach($funcs as $func) + { + $data = $func['func']($vdo); + if($data) + return $data; + } + return true; + } + } + + + /** + * Function used to show rating + * @inputs + * class : class used to show rating usually rating_stars + * rating : rating of video or something + * ratings : number of rating + * total : total rating or out of + */ + function show_rating($params) + { + $class = $params['class'] ? $params['class'] : 'rating_stars'; + $rating = $params['rating']; + $ratings = $params['ratings']; + $total = $params['total']; + $style = $params['style']; + if(empty($style)) + $style = config('rating_style'); + //Checking Percent + + { + if($total<=10) + $total = 10; + $perc = $rating*100/$total; + $disperc = 100 - $perc; + if($ratings <= 0 && $disperc == 100) + $disperc = 0; + } + + $perc = $perc.'%'; + $disperc = $disperc."%"; + switch($style) + { + case "percentage": case "percent": + case "perc": default: + { + $likeClass = "UserLiked"; + if(str_replace('%','',$perc) < '50') + $likeClass = 'UserDisliked'; + + $ratingTemplate = '
    +
    + '.$perc.''; + if($ratings > 0) + $ratingTemplate .= '  '; + $ratingTemplate .='
    +
    '; + } + break; + + case "bars": case "Bars": case "bar": + { + $ratingTemplate = '
    +
    +
    +
    +
    +
    '; + } + break; + + case "numerical": case "numbers": + case "number": case "num": + { + $likes = round($ratings*$perc/100); + $dislikes = $ratings - $likes; + + $ratingTemplate = '
    +
    +
    + '.$likes.' Likes + '.$dislikes.' Dislikes +
    +
    +
    '; + } + break; + + case "custom": case "own_style": + { + $file = LAYOUT."/".$params['file']; + if(!empty($params['file']) && file_exists($file)) + { + // File exists, lets start assign things + assign("perc",$perc); assign("disperc",$disperc); + + // Likes and Dislikes + $likes = floor($ratings*$perc/100); + $dislikes = $ratings - $likes; + assign("likes",$likes); assign("dislikes",$dislikes); + Template($file,FALSE); + } else { + $params['style'] = "percent"; + return show_rating($params); + } + } + break; + } + /*$rating = '
    +
    +
     
    +
    +
    +
    ';*/ + return $ratingTemplate; + } + + + /** + * Function used to display + * Blank Screen + * if there is nothing to play or to show + * then show a blank screen + */ + function blank_screen($data) + { + global $swfobj; + $code = '
    No Player or Video File Found - Unable to Play Any Video
    '; + $swfobj->EmbedCode(unhtmlentities($code),$data['player_div']); + return $swfobj->code; + } + + + /** + * Function used to check weather video has Mp4 file or not + */ + function has_hq($vdetails,$is_file=false) + { + if(!$is_file) + $file = get_hq_video_file($vdetails); + else + $file = $vdetails; + + if(getext($file)=='mp4') + return $file; + else + return false; + } + + /** + * Function used to display an ad + */ + function ad($in) + { + return stripslashes(htmlspecialchars_decode($in)); + } + + + /** + * Function used to get + * available function list + * for special place , read docs.clip-bucket.com + */ + function get_functions($name) + { + global $Cbucket; + $funcs = $Cbucket->$name; + if(is_array($funcs) && count($funcs)>0) + return $funcs; + else + return false; + } + + + /** + * Function used to add js in ClipBuckets JSArray + * see docs.clip-bucket.com + */ + function add_js($files) + { + global $Cbucket; + return $Cbucket->addJS($files); + } + + /** + * Function add_header() + * this will be used to add new files in header array + * this is basically for plugins + * for specific page array('page'=>'file') + * ie array('uploadactive'=>'datepicker.js') + */ + function add_header($files) + { + global $Cbucket; + return $Cbucket->add_header($files); + } + function add_admin_header($files) + { + global $Cbucket; + return $Cbucket->add_admin_header($files); + } + + + /** + * Function used to get config value + * of ClipBucket + */ + function config($input) + { + global $Cbucket; + return $Cbucket->configs[$input]; + } + function get_config($input){ return config($input); } + + + /** + * Funcion used to call functions + * when video is going to watched + * ie in watch_video.php + */ + function call_watch_video_function($vdo) + { + global $userquery; + + $funcs = get_functions('watch_video_functions'); + + if(is_array($funcs) && count($funcs)>0) + { + foreach($funcs as $func) + { + + if(function_exists($func)) + { + $func($vdo); + } + } + } + + increment_views($vdo['videoid'],'video'); + + if(userid()) + $userquery->increment_watched_vides(userid()); + + } + + /** + * Funcion used to call functions + * when video is going + * on CBvideo::remove_files + */ + function call_delete_video_function($vdo) + { + $funcs = get_functions('on_delete_video'); + if(is_array($funcs) && count($funcs) > 0) + { + foreach($funcs as $func) + { + if(function_exists($func)) + { + $func($vdo); + } + } + } + } + + + /** + * Funcion used to call functions + * when video is going to dwnload + * ie in download.php + */ + function call_download_video_function($vdo) + { + global $db; + $funcs = get_functions('download_video_functions'); + if(is_array($funcs) && count($funcs)>0) + { + foreach($funcs as $func) + { + if(function_exists($func)) + { + $func($vdo); + } + } + } + + //Updating Video Downloads + $db->update(tbl("video"),array("downloads"),array("|f|downloads+1"),"videoid = '".$vdo['videoid']."'"); + //Updating User Download + if(userid()) + $db->update(tbl("users"),array("total_downloads"),array("|f|total_downloads+1"),"userid = '".userid()."'"); + } + + + /** + * Funcion used to call functions + * when user view channel + * ie in view_channel.php + */ + function call_view_channel_functions($u) + { + $funcs = get_functions('view_channel_functions'); + if(is_array($funcs) && count($funcs)>0) + { + foreach($funcs as $func) + { + if(function_exists($func)) + { + $func($u); + } + } + } + + increment_views($u['userid'],"channel"); + } + + + + + /** + * Funcion used to call functions + * when user view topic + * ie in view_topic.php + */ + function call_view_topic_functions($tdetails) + { + $funcs = get_functions('view_topic_functions'); + if(is_array($funcs) && count($funcs)>0) + { + foreach($funcs as $func) + { + if(function_exists($func)) + { + $func($tdetails); + } + } + } + + increment_views($tdetails['topic_id'],"topic"); + } + + + + + /** + * Funcion used to call functions + * when user view group + * ie in view_group.php + */ + function call_view_group_functions($gdetails) + { + $funcs = get_functions('view_group_functions'); + if(is_array($funcs) && count($funcs)>0) + { + foreach($funcs as $func) + { + if(function_exists($func)) + { + $func($gdetails); + } + } + } + increment_views($gdetails['group_id'],"group"); + } + + /** + * Funcion used to call functions + * when user view collection + * ie in view_collection.php + */ + function call_view_collection_functions($cdetails) + { + $funcs = get_functions('view_collection_functions'); + if(is_array($funcs) && count($funcs)>0) + { + foreach($funcs as $func) + { + if(function_exists($func)) + { + $func($cdetails); + } + } + }; + + increment_views($cdetails['collection_id'],"collection"); + } + + + /** + * Function used to incream number of view + * in object + */ + function increment_views($id,$type=NULL) + { + global $db; + switch($type) + { + case 'v': + case 'video': + default: + { + if(!isset($_COOKIE['video_'.$id])){ + $db->update(tbl("video"),array("views","last_viewed"),array("|f|views+1",NOW())," videoid='$id' OR videokey='$id'"); + setcookie('video_'.$id,'watched',time()+3600); + } + } + break; + case 'u': + case 'user': + case 'channel': + + { + + if(!isset($_COOKIE['user_'.$id])){ + $db->update(tbl("users"),array("profile_hits"),array("|f|profile_hits+1")," userid='$id'"); + setcookie('user_'.$id,'watched',time()+3600); + } + } + break; + case 't': + case 'topic': + + { + if(!isset($_COOKIE['topic_'.$id])){ + $db->update(tbl("group_topics"),array("total_views"),array("|f|total_views+1")," topic_id='$id'"); + setcookie('topic_'.$id,'watched',time()+3600); + } + } + break; + break; + case 'g': + case 'group': + + { + if(!isset($_COOKIE['group_'.$id])){ + $db->update(tbl("groups"),array("total_views"),array("|f|total_views+1")," group_id='$id'"); + setcookie('group_'.$id,'watched',time()+3600); + } + } + break; + case "c": + case "collect": + case "collection": + { + if(!isset($_COOKIE['collection_'.$id])){ + $db->update(tbl("collections"),array("views"),array("|f|views+1")," collection_id = '$id'"); + setcookie('collection_'.$id,'viewed',time()+3600); + } + } + break; + + case "photos": + case "photo": + case "p": + { + if(!isset($_COOKIE['photo_'.$id])) + { + $db->update(tbl('photos'),array("views","last_viewed"),array("|f|views+1",NOW())," photo_id = '$id'"); + setcookie('photo_'.$id,'viewed',time()+3600); + } + } + } + + } + + + /** + * Function used to get post var + */ + function post($var) + { + return $_POST[$var]; + } + + + /** + * Function used to show sharing form + */ + function show_share_form($array) + { + + assign('params',$array); + Template('blocks/share_form.html'); + } + + /** + * Function used to show flag form + */ + function show_flag_form($array) + { + assign('params',$array); + Template('blocks/flag_form.html'); + } + + /** + * Function used to show flag form + */ + function show_playlist_form($array) + { + global $cbvid; + assign('params',$array); + + $playlists = $cbvid->action->get_playlists(); + assign('playlists',$playlists); + + Template('blocks/playlist_form.html'); + } + + /** + * Function used to show collection form + */ + function show_collection_form($params) + { + global $db,$cbcollection; + if(!userid()) + $loggedIn = "not"; + else + { + $collectArray = array("order"=>" collection_name ASC","type"=>"videos","user"=>userid()); + $collections = $cbcollection->get_collections($collectArray); + + $contributions = $cbcollection->get_contributor_collections(userid()); + + if($contributions) + { + if(!$collections) + $collections = $contributions; + else + { + $collections = array_merge($collections,$contributions); + } + } + + assign("collections",$collections); + assign("contributions",$contributions); + } + Template("/blocks/collection_form.html"); + } + + + function cbdate($format=NULL,$timestamp=NULL) + { + if(!$format) + { + $format = config("datE_format"); + } + if(!$timestamp) + return date($format); + else + return date($format,$timestamp); + } + + + /** + * Function used to count pages + * @param TOTAL RESULTS NUM + * @param NUMBER OF RESULTS to DISPLAY NUM + */ + function count_pages($total,$count) + { + if($count<1) $count = 1; + $records = $total/$count; + return $total_pages = round($records+0.49,0); + } + + /** + * Function used to return level name + * @param levelid + */ + function get_user_level($id) + { + global $userquery; + return $userquery->usr_levels[$id]; + } + + + + /** + * This function used to check + * weather user is online or not + * @param : last_active time + * @param : time margin + */ + function is_online($time,$margin='5') + { + $margin = $margin*60; + $active = strtotime($time); + $curr = time(); + $diff = $curr - $active; + if($diff > $margin) + return 'offline'; + else + return 'online'; + } + + + /** + * ClipBucket Form Validator + * this function controls the whole logic of how to operate input + * validate it, generate proper error + */ + function validate_cb_form($input,$array) + { + + if(is_array($input)) + foreach($input as $field) + { + $field['name'] = formObj::rmBrackets($field['name']); + + //pr($field); + $title = $field['title']; + $val = $array[$field['name']]; + $req = $field['required']; + $invalid_err = $field['invalid_err']; + $function_error_msg = $field['function_error_msg']; + if(is_string($val)) + { + if(!isUTF8($val)) + $val = utf8_decode($val); + $length = strlen($val); + } + $min_len = $field['min_length']; + $min_len = $min_len ? $min_len : 0; + $max_len = $field['max_length'] ; + $rel_val = $array[$field['relative_to']]; + + if(empty($invalid_err)) + $invalid_err = sprintf("Invalid '%s'",$title); + if(is_array($array[$field['name']])) + $invalid_err = ''; + + //Checking if its required or not + if($req == 'yes') + { + if(empty($val) && !is_array($array[$field['name']])) + { + e($invalid_err); + $block = true; + }else{ + $block = false; + } + } + $funct_err = is_valid_value($field['validate_function'],$val); + if($block!=true) + { + + //Checking Syntax + if(!$funct_err) + { + if(!empty($function_error_msg)) + e($function_error_msg); + elseif(!empty($invalid_err)) + e($invalid_err); + } + + if(!is_valid_syntax($field['syntax_type'],$val)) + { + if(!empty($invalid_err)) + e($invalid_err); + } + if(isset($max_len)) + { + if($length > $max_len || $length < $min_len) + e(sprintf(lang('please_enter_val_bw_min_max'), + $title,$min_len,$field['max_length'])); + } + if(function_exists($field['db_value_check_func'])) + { + + $db_val_result = $field['db_value_check_func']($val); + if($db_val_result != $field['db_value_exists']) + if(!empty($field['db_value_err'])) + e($field['db_value_err']); + elseif(!empty($invalid_err)) + e($invalid_err); + } + if($field['relative_type']!='') + { + switch($field['relative_type']) + { + case 'exact': + { + if($rel_val != $val) + { + if(!empty($field['relative_err'])) + e($field['relative_err']); + elseif(!empty($invalid_err)) + e($invalid_err); + } + } + break; + } + } + } + } + } + + + /** + * Function used to check weather tempalte file exists or not + * input path to file + */ + function template_file_exists($file,$dir) + { + if(!file_exists($dir.'/'.$file) && !empty($file) && !file_exists($file)) + { + echo sprintf(lang("temp_file_load_err"),$file,$dir); + return false; + }else + return true; + } + + /** + * Function used to count age from date + */ + function get_age($input) + { + $time = strtotime($input); + $iMonth = date("m",$time); + $iDay = date("d",$time); + $iYear = date("Y",$time); + + $iTimeStamp = (mktime() - 86400) - mktime(0, 0, 0, $iMonth, $iDay, $iYear); + $iDays = $iTimeStamp / 86400; + $iYears = floor($iDays / 365 ); + return $iYears; + } + + + + + /** + * Function used to check time span + * A time difference function that outputs the + * time passed in facebook's style: 1 day ago, + * or 4 months ago. I took andrew dot + * macrobert at gmail dot com function + * and tweaked it a bit. On a strict enviroment + * it was throwing errors, plus I needed it to + * calculate the difference in time between + * a past date and a future date. + * thanks to yasmary at gmail dot com + */ + function nicetime($date,$istime=false) + { + if(empty($date)) { + return lang('no_date_provided'); + } + + $periods = array(lang("second"), lang("minute"), lang("hour"), lang("day"), lang("week"), lang("month"), lang("year"), lang("decade")); + $lengths = array(lang("60"),lang("60"),lang("24"),lang("7"),lang("4.35"),lang("12"),lang("10")); + + $now = time(); + + if(!$istime) + $unix_date = strtotime($date); + else + $unix_date = $date; + + // check validity of date + if(empty($unix_date) || $unix_date<1) { + return lang("bad_date"); + } + + // is it future date or past date + if($now > $unix_date) { + //time_ago + $difference = $now - $unix_date; + $tense = "time_ago"; + + } else { + //from_now + $difference = $unix_date - $now; + $tense = "from_now"; + } + + for($j = 0; $difference >= $lengths[$j] && $j < count($lengths)-1; $j++) { + $difference /= $lengths[$j]; + } + + $difference = round($difference); + + if($difference != 1) { + $periods[$j].= "s"; + } + + + return sprintf(lang($tense),$difference,$periods[$j]); + } + + + /** + * Function used to format outgoing link + */ + function outgoing_link($out) + { + preg_match("/http/",$out,$matches); + if(empty($matches[0])) + $out = "http://".$out; + return ''.$out.''; + } + + /** + * Function used to get country via country code + */ + function get_country($code) + { + global $db; + $result = $db->select(tbl("countries"),"name_en,iso2"," iso2='$code' OR iso3='$code'"); + if($db->num_rows>0) + { + $flag = ''; + $result = $result[0]; + if(SHOW_COUNTRY_FLAG) + $flag = ' '; + return $flag.$result['name_en']; + }else + return false; + } + + + /** + * function used to get vidos + */ + function get_videos($param) + { + global $cbvideo; + return $cbvideo->get_videos($param); + } + + /** + * function used to get photos + */ + function get_photos($param) + { + global $cbphoto; + return $cbphoto->get_photos($param); + } + + /** + * function used to get photos + */ + function get_collections($param) + { + global $cbcollection; + return $cbcollection->get_collections($param); + } + + + /** + * function used to get vidos + */ + function get_users($param) + { + global $userquery; + return $userquery->get_users($param); + } + + + /** + * function used to get groups + */ + function get_groups($param) + { + global $cbgroup; + return $cbgroup->get_groups($param); + } + + /** + * Function used to call functions + */ + function call_functions($in,$params=NULL) + { + if(is_array($in)) + { + foreach($in as $i) + { + if(function_exists($i)) + if(!$params) + $i(); + else + $i($params); + } + }else + { + if(function_exists($in)) + if(!$params) + $in(); + else + $in($params); + } + + } + + + + + /** + * In each plugin + * we will define a CONST + * such as plguin_installed + * that will be used weather plugin is installed or not + * ie define("editorspick_install","installed"); + * is_installed('editorspic'); + */ + function is_installed($plugin) + { + if(defined($plugin."_install")) + return true; + else + return false; + } + + + /** + * Category Link is used to return + * Category based link + */ + function category_link($data,$type) + { + switch($type) + { + case 'video':case 'videos':case 'v': + { + + + if(SEO=='yes') + return BASEURL.'/videos/'.$data['category_id'].'/'.SEO($data['category_name']).'/'.$_GET['sort'].'/'.$_GET['time'].'/'; + else + return BASEURL.'/videos.php?cat='.$data['category_id'].'&sort='.$_GET['sort'].'&time='.$_GET['time'].'&seo_cat_name='.$_GET['seo_cat_name']; + } + break; + + case 'channels':case 'channel':case'c':case'user': + { + + if(SEO=='yes') + return BASEURL.'/channels/'.$data['category_id'].'/'.SEO($data['category_name']).'/'.$_GET['sort'].'/'.$_GET['time'].'/'; + else + return BASEURL.'/channels.php?cat='.$data['category_id'].'&sort='.$_GET['sort'].'&time='.$_GET['time'].'&seo_cat_name='.$_GET['seo_cat_name']; + } + break; + + default: + { + + if(THIS_PAGE=='photos') + $type = 'photos'; + + if(defined("IN_MODULE")) + { + $url = 'cat='.$data['category_id'].'&sort='.$_GET['sort'].'&time='.$_GET['time'].'&page='.$_GET['page'].'&seo_cat_name='.$_GET['seo_cat_name']; + global $prefix_catlink; + $url = $prefix_catlink.$url; + + $rm_array = array("cat","sort","time","page","seo_cat_name"); + $p = ""; + if($prefix_catlink) + $rm_array[] = 'p'; + $plugURL = queryString($url,$rm_array); + return $plugURL; + } + + if(SEO=='yes') + return BASEURL.'/'.$type.'/'.$data['category_id'].'/'.SEO($data['category_name']).'/'.$_GET['sort'].'/'.$_GET['time'].'/'; + else + return BASEURL.'/'.$type.'.php?cat='.$data['category_id'].'&sort='.$_GET['sort'].'&time='.$_GET['time'].'&seo_cat_name='.$_GET['seo_cat_name']; + } + break; + } + } + + /** + * Sorting Links is used to return + * Sorting based link + */ + function sort_link($sort,$mode='sort',$type) + { + switch($type) + { + case 'video': + case 'videos': + case 'v': + { + if(!isset($_GET['cat'])) + $_GET['cat'] = 'all'; + if(!isset($_GET['time'])) + $_GET['time'] = 'all_time'; + if(!isset($_GET['sort'])) + $_GET['sort'] = 'most_recent'; + if(!isset($_GET['page'])) + $_GET['page'] = 1; + if(!isset($_GET['seo_cat_name'])) + $_GET['seo_cat_name'] = 'All'; + + if($mode == 'sort') + $sorting = $sort; + else + $sorting = $_GET['sort']; + if($mode == 'time') + $time = $sort; + else + $time = $_GET['time']; + + if(SEO=='yes') + return BASEURL.'/videos/'.$_GET['cat'].'/'.$_GET['seo_cat_name'].'/'.$sorting.'/'.$time.'/'.$_GET['page']; + else + return BASEURL.'/videos.php?cat='.$_GET['cat'].'&sort='.$sorting.'&time='.$time.'&page='.$_GET['page'].'&seo_cat_name='.$_GET['seo_cat_name']; + } + break; + + case 'channels': + case 'channel': + { + if(!isset($_GET['cat'])) + $_GET['cat'] = 'all'; + if(!isset($_GET['time'])) + $_GET['time'] = 'all_time'; + if(!isset($_GET['sort'])) + $_GET['sort'] = 'most_recent'; + if(!isset($_GET['page'])) + $_GET['page'] = 1; + if(!isset($_GET['seo_cat_name'])) + $_GET['seo_cat_name'] = 'All'; + + if($mode == 'sort') + $sorting = $sort; + else + $sorting = $_GET['sort']; + if($mode == 'time') + $time = $sort; + else + $time = $_GET['time']; + + if(SEO=='yes') + return BASEURL.'/channels/'.$_GET['cat'].'/'.$_GET['seo_cat_name'].'/'.$sorting.'/'.$time.'/'.$_GET['page']; + else + return BASEURL.'/channels.php?cat='.$_GET['cat'].'&sort='.$sorting.'&time='.$time.'&page='.$_GET['page'].'&seo_cat_name='.$_GET['seo_cat_name']; + } + break; + + + default: + { + if(!isset($_GET['cat'])) + $_GET['cat'] = 'all'; + if(!isset($_GET['time'])) + $_GET['time'] = 'all_time'; + if(!isset($_GET['sort'])) + $_GET['sort'] = 'most_recent'; + if(!isset($_GET['page'])) + $_GET['page'] = 1; + if(!isset($_GET['seo_cat_name'])) + $_GET['seo_cat_name'] = 'All'; + + if($mode == 'sort') + $sorting = $sort; + else + $sorting = $_GET['sort']; + if($mode == 'time') + $time = $sort; + else + $time = $_GET['time']; + + if(THIS_PAGE=='photos') + $type = 'photos'; + + if(defined("IN_MODULE")) + { + $url = 'cat='.$_GET['cat'].'&sort='.$sorting.'&time='.$time.'&page='.$_GET['page'].'&seo_cat_name='.$_GET['seo_cat_name']; + $plugURL = queryString($url,array("cat","sort","time","page","seo_cat_name")); + return $plugURL; + } + + if(SEO=='yes') + return BASEURL.'/'.$type.'/'.$_GET['cat'].'/'.$_GET['seo_cat_name'].'/'.$sorting.'/'.$time.'/'.$_GET['page']; + else + return BASEURL.'/'.$type.'.php?cat='.$_GET['cat'].'&sort='.$sorting.'&time='.$time.'&page='.$_GET['page'].'&seo_cat_name='.$_GET['seo_cat_name']; + } + break; + } + } + + + + + /** + * Function used to get flag options + */ + function get_flag_options() + { + $action = new cbactions(); + $action->init(); + return $action->report_opts; + } + + /** + * Function used to display flag type + */ + function flag_type($id) + { + $flag_opts = get_flag_options(); + return $flag_opts[$id]; + } + + + /** + * Function used to load captcha field + */ + function get_captcha() + { + global $Cbucket; + if(count($Cbucket->captchas)>0) + { + return $Cbucket->captchas[0]; + }else + return false; + } + + /** + * Function used to load captcha + */ + define("GLOBAL_CB_CAPTCHA","cb_captcha"); + function load_captcha($params) + { + global $total_captchas_loaded; + switch($params['load']) + { + case 'function': + { + if($total_captchas_loaded!=0) + $total_captchas_loaded = $total_captchas_loaded+1; + else + $total_captchas_loaded = 1; + $_SESSION['total_captchas_loaded'] = $total_captchas_loaded; + if(function_exists($params['captcha']['load_function'])) + return $params['captcha']['load_function']().''; + } + break; + case 'field': + { + echo ''; + } + break; + + } + } + + + /** + * Function used to verify captcha + */ + function verify_captcha() + { + $var = post('cb_captcha_enabled'); + if($var=='yes') + { + $captcha = get_captcha(); + $val = $captcha['validate_function'](post(GLOBAL_CB_CAPTCHA)); + return $val; + }else + return true; + } + + + /** + * Function used to ingore errors + * that are created when there is wrong action done + * on clipbucket ie inavalid username etc + */ + function ignore_errors() + { + global $ignore_cb_errors; + $ignore_cb_errors = TRUE; + } + + /** + * Function used to set $ignore_cb_errors + * back to TRUE so our error catching system + * can generate errors + */ + function catch_error() + { + global $ignore_cb_errors; + $ignore_cb_errors = FALSE; + } + + + /** + * Function used to call sub_menu_easily + */ + function sub_menu() + { + /** + * Submenu function used to used to display submenu links + * after navbar + */ + $funcs = get_functions('sub_menu'); + if(is_array($funcs) && count($funcs)>0) + { + foreach($funcs as $func) + { + if(function_exists($func)) + { + return $func($u); + } + } + } + } + + + /** + * Function used to load clipbucket title + */ + function cbtitle($params=false) + { + global $cbsubtitle; + + $sub_sep = $params['sub_sep']; + if(!$sub_sep) + $sub_sep = '-'; + + //Getting Subtitle + echo TITLE; + if(!$cbsubtitle) + echo " $sub_sep ".SLOGAN; + else + echo " $sub_sep ".$cbsubtitle; + //echo " ".SUBTITLE; + } + + + /** + * @Script : ClipBucket + * @Author : Arslan Hassan + * @License : CBLA + * @Since : 2007 + * + * function whos_your_daddy + * Simply tells the name of script owner + * @return INTELLECTUAL BADASS + */ + function whos_your_daddy() + { + echo "

    Arslan Hassan

    "; + } + + /** + * function used to set website subtitle + */ + function subtitle($title) + { + global $cbsubtitle; + $cbsubtitle = $title; + } + + + /** + * FUnction used to get username from userid + */ + function get_username($uid) + { + global $userquery; + return $userquery->get_username($uid,'username'); + } + + /** + * Function used to get collection name from id + * Smarty Function + */ + function get_collection_field($cid,$field='collection_name') + { + global $cbcollection; + return $cbcollection->get_collection_field($cid,$field); + } + + /** + * Function used to delete photos if + * whole collection is being deleted + */ + function delete_collection_photos($details) + { + global $cbcollection,$cbphoto; + $type = $details['type']; + + if($type == 'photos') + { + $ps = $cbphoto->get_photos(array("collection"=>$details['collection_id'])); + if(!empty($ps)) + { + foreach($ps as $p) + { + $cbphoto->make_photo_orphan($details,$p['photo_id']); + } + unset($ps); // Empty $ps. Avoiding the duplication prob + } + } + } + + /** + * FUnction used to get head menu + */ + function head_menu($params=NULL) + { + global $Cbucket; + return $Cbucket->head_menu($params); + } + + function cbMenu($params=NULL) + { + global $Cbucket; + return $Cbucket->cbMenu($params); + } + + /** + * FUnction used to get foot menu + */ + function foot_menu($params=NULL) + { + global $Cbucket; + return $Cbucket->foot_menu($params); + } + + + + + /** + * FUNCTION Used to convert XML to Array + * @Author : http://www.php.net/manual/en/function.xml-parse.php#87920 + */ + function xml2array($url, $get_attributes = 1, $priority = 'tag',$is_url=true) + { + $contents = ""; + if (!function_exists('xml_parser_create')) + { + return false; + } + $parser = xml_parser_create(''); + + if($is_url) + { + if (!($fp = @ fopen($url, 'rb'))) + { + $ch = curl_init(); + curl_setopt($ch,CURLOPT_URL,$url); + curl_setopt($ch, CURLOPT_USERAGENT, + 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.2) Gecko/20070219 Firefox/3.0.0.2'); + curl_setopt($ch,CURLOPT_RETURNTRANSFER,true); + curl_setopt($ch,CURLOPT_FOLLOWLOCATION,true); + $contents = curl_exec($ch); + curl_close($ch); + + if(!$contents) + return false; + } + while (!feof($fp)) + { + $contents .= fread($fp, 8192); + } + fclose($fp); + }else{ + $contents = $url; + } + + 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; //Hmm... + $xml_array = array (); + $parents = array (); + $opened_tags = array (); + $arr = array (); + $current = & $xml_array; + $repeated_tag_index = array (); + foreach ($xml_values as $data) + { + + unset ($attributes, $value); + extract($data); + $result = array (); + $attributes_data = array (); + if (isset ($value)) + { + if ($priority == 'tag') + $result = $value; + else + $result['value'] = $value; + } + if (isset ($attributes) and $get_attributes) + { + foreach ($attributes as $attr => $val) + { + if ($priority == 'tag') + $attributes_data[$attr] = $val; + else + $result['attr'][$attr] = $val; //Set all the attributes in a array called 'attr' + } + } + if ($type == "open") + { + $parent[$level -1] = & $current; + if (!is_array($current) or (!in_array($tag, array_keys($current)))) + { + $current[$tag] = $result; + if ($attributes_data) + $current[$tag . '_attr'] = $attributes_data; + $repeated_tag_index[$tag . '_' . $level] = 1; + $current = & $current[$tag]; + } + else + { + if (isset ($current[$tag][0])) + { + $current[$tag][$repeated_tag_index[$tag . '_' . $level]] = $result; + $repeated_tag_index[$tag . '_' . $level]++; + } + else + { + $current[$tag] = array ( + $current[$tag], + $result + ); + $repeated_tag_index[$tag . '_' . $level] = 2; + if (isset ($current[$tag . '_attr'])) + { + $current[$tag]['0_attr'] = $current[$tag . '_attr']; + unset ($current[$tag . '_attr']); + } + } + $last_item_index = $repeated_tag_index[$tag . '_' . $level] - 1; + $current = & $current[$tag][$last_item_index]; + } + } + elseif ($type == "complete") + { + if (!isset ($current[$tag])) + { + $current[$tag] = $result; + $repeated_tag_index[$tag . '_' . $level] = 1; + if ($priority == 'tag' and $attributes_data) + $current[$tag . '_attr'] = $attributes_data; + } + else + { + if (isset ($current[$tag][0]) and is_array($current[$tag])) + { + $current[$tag][$repeated_tag_index[$tag . '_' . $level]] = $result; + if ($priority == 'tag' and $get_attributes and $attributes_data) + { + $current[$tag][$repeated_tag_index[$tag . '_' . $level] . '_attr'] = $attributes_data; + } + $repeated_tag_index[$tag . '_' . $level]++; + } + else + { + $current[$tag] = array ( + $current[$tag], + $result + ); + $repeated_tag_index[$tag . '_' . $level] = 1; + if ($priority == 'tag' and $get_attributes) + { + if (isset ($current[$tag . '_attr'])) + { + $current[$tag]['0_attr'] = $current[$tag . '_attr']; + unset ($current[$tag . '_attr']); + } + if ($attributes_data) + { + $current[$tag][$repeated_tag_index[$tag . '_' . $level] . '_attr'] = $attributes_data; + } + } + $repeated_tag_index[$tag . '_' . $level]++; //0 and 1 index is already taken + } + } + } + elseif ($type == 'close') + { + $current = & $parent[$level -1]; + } + } + + return ($xml_array); + } + + + function array2xml($array, $level=1) + { + $xml = ''; + // if ($level==1) { + // $xml .= "\n"; + // } + foreach ($array as $key=>$value) { + $key = strtolower($key); + if (is_object($value)) {$value=get_object_vars($value);}// convert object to array + + if (is_array($value)) { + $multi_tags = false; + foreach($value as $key2=>$value2) { + if (is_object($value2)) {$value2=get_object_vars($value2);} // convert object to array + if (is_array($value2)) { + $xml .= str_repeat("\t",$level)."<$key>\n"; + $xml .= array2xml($value2, $level+1); + $xml .= str_repeat("\t",$level)."\n"; + $multi_tags = true; + } else { + if (trim($value2)!='') { + if (htmlspecialchars($value2)!=$value2) { + $xml .= str_repeat("\t",$level). + "<$key2>". // changed $key to $key2... didn't work otherwise. + "\n"; + } else { + $xml .= str_repeat("\t",$level). + "<$key2>$value2\n"; // changed $key to $key2 + } + } + $multi_tags = true; + } + } + if (!$multi_tags and count($value)>0) { + $xml .= str_repeat("\t",$level)."<$key>\n"; + $xml .= array2xml($value, $level+1); + $xml .= str_repeat("\t",$level)."\n"; + } + + } else { + if (trim($value)!='') { + echo "value=$value
    "; + if (htmlspecialchars($value)!=$value) { + $xml .= str_repeat("\t",$level)."<$key>". + "\n"; + } else { + $xml .= str_repeat("\t",$level). + "<$key>$value\n"; + } + } + } + } + //if ($level==1) { + // $xml .= "
    \n"; + // } + + return $xml; + } + + + + /** + * FUnction used to display widget + */ + function widget($params) + { + $name = $params['name']; + $content = $params['content']; + + return + '
    +
    + '.$name.' +
    +
    + '.$content.' +
    +
    '; + } + + + /** + * Function used to get latest ClipBucket version info + */ + function get_latest_cb_info() + { + if($_SERVER['HTTP_HOST']!='localhost') + $url = 'http://clip-bucket.com/versions.xml'; + else + $url = 'http://localhost/clipbucket/2.x/2/upload/tester/versions.xml'; + $version = xml2array($url); + if(!$version) + { + return false; + }else + { + return $version['phpbucket']['clipbucket'][0]; + } + } + + + /** + * function used to get allowed extension as in array + */ + function get_vid_extensions() + { + $exts = config('allowed_types'); + $exts = preg_replace("/ /","",$exts); + $exts = explode(",",$exts); + return $exts; + } + + + /** + * This function used to include headers in tag + * it will check weather to include the file or not + * it will take file and its type as an array + * then compare its type with THIS_PAGE constant + * if header has TYPE of THIS_PAGE then it will be inlucded + */ + function include_header($params) + { + $file = $params['file']; + $type = $params['type']; + + if($file=='global_header') + { + Template(BASEDIR.'/styles/global/head.html',false); + return false; + } + + if($file == 'admin_bar') + { + if(has_access('admin_access',TRUE)) + Template(BASEDIR.'/styles/global/admin_bar.html',false); + return false; + } + + if(!$type) + $type = "global"; + + if(is_includeable($type)) + Template($file,false); + + return false; + } + + + + + /** + * Function used to check weather to include + * given file or not + * it will take array of pages + * if array has ACTIVE PAGE or has GLOBAL value + * it will return true + * otherwise FALSE + */ + function is_includeable($array) + { + if(!is_array($array)) + $array = array($array); + if(in_array(THIS_PAGE,$array) || in_array('global',$array)) + { + return true; + }else + return false; + } + + /** + * This function works the same way as include_header + * but the only difference is , it is used to include + * JS files only + */ + $the_js_files = array(); + function include_js($params) + { + global $the_js_files; + + $file = $params['file']; + $type = $params['type']; + + if(!in_array($file,$the_js_files)) + { + $the_js_files[] = $file; + if($type=='global') + return ''; + elseif(is_array($type)) + { + foreach($type as $t) + { + if($t==THIS_PAGE) + return ''; + } + }elseif($type==THIS_PAGE) + return ''; + } + + return false; + } + + + /** + * Function used to check weather FFMPEG has Required Modules installed or not + */ + function get_ffmpeg_codecs($data=false) + { + $req_codecs = array + ('libxvid' => 'Required for DIVX AVI files', + 'libmp3lame'=> 'Required for proper Mp3 Encoding', + 'libfaac' => 'Required for AAC Audio Conversion', + // 'libfaad' => 'Required for AAC Audio Conversion', + 'libx264' => 'Required for x264 video compression and conversion', + 'libtheora' => 'Theora is an open video codec being developed by the Xiph.org', + 'libvorbis' => 'Ogg Vorbis is a new audio compression format', + ); + + if($data) + $version = $data; + else + $version = shell_output( get_binaries('ffmpeg').' -i xxx -acodec copy -vcodec copy -f null /dev/null 2>&1' ); + preg_match_all("/enable\-(.*) /Ui",$version,$matches); + $installed = $matches[1]; + + $the_codecs = array(); + + foreach($installed as $inst) + { + if(empty($req_codecs[$inst])) + $the_codecs[$inst]['installed'] = 'yes'; + } + + foreach($req_codecs as $key=>$codec) + { + $the_req_codecs[$key] = array(); + $the_req_codecs[$key]['required'] = 'yes'; + $the_req_codecs[$key]['desc'] = $req_codecs[$key]; + if(in_array($key,$installed)) + $the_req_codecs[$key]['installed'] = 'yes'; + else + $the_req_codecs[$key]['installed'] = 'no'; + } + + $the_codecs = array_merge($the_req_codecs,$the_codecs); + return $the_codecs; + } + + + /** + * Function used to cheack weather MODULE is INSTALLED or NOT + */ + function check_module_path($params) + { + $rPath = $path = $params['path']; + + if($path['get_path']) + $path = get_binaries($path); + $array = array(); + $result = shell_output($path." -version"); + + if($result) + { + if(strstr($result,'error') || strstr(($result),'No such file or directory')) + { + $error['error'] = $result; + + if($params['assign']) + assign($params['assign'],$error); + + return false; + } + + if($params['assign']) + { + $array['status'] = 'ok'; + $array['version'] = parse_version($params['path'],$result); + + assign($params['assign'],$array); + + }else + { + return $result; + } + }else + { + if($params['assign']) + assign($params['assign']['error'],"error"); + else + return false; + } + + } + + + /** + * Function used to parse version from info + */ + function parse_version($path,$result) + { + switch($path) + { + case 'ffmpeg': + { + //Gett FFMPEG SVN version + preg_match("/svn-r([0-9]+)/i",strtolower($result),$matches); + //pr($matches); + if(is_numeric(floatval($matches[1])) && $matches[1]) { + return 'Svn '.$matches[1]; + } + //Get FFMPEG version + preg_match("/FFmpeg version ([0-9.]+),/i",strtolower($result),$matches); + if(is_numeric(floatval($matches[1])) && $matches[1]) { + return $matches[1]; + } + + //Get FFMPEG GIT version + preg_match("/ffmpeg version n\-([0-9]+)/i",strtolower($result),$matches); + + if(is_numeric(floatval($matches[1])) && $matches[1]) { + return 'Git '.$matches[1]; + } + } + break; + case 'php': + { + return phpversion(); + } + break; + case 'flvtool2': + { + preg_match("/flvtool2 ([0-9\.]+)/i",$result,$matches); + if(is_numeric(floatval($matches[1]))){ + return $matches[1]; + } else { + return false; + } + } + break; + case 'mp4box': + { + preg_match("/version (.*) \(/Ui",$result,$matches); + //pr($matches); + if(is_numeric(floatval($matches[1]))){ + return $matches[1]; + } else { + return false; + } + } + } + } + + + /** + * function used to call clipbucket footers + */ + function footer() + { + $funcs = get_functions('clipbucket_footer'); + if(is_array($funcs) && count($funcs)>0) + { + foreach($funcs as $func) + { + if(function_exists($func)) + { + $func(); + } + } + } + } + + + + + + + + + /** + * Function used to generate RSS FEED links + */ + function rss_feeds($params) + { + /** + * setting up the feeds arrays.. + * if you want to call em in your functions..simply call the global variable $rss_feeds + */ + $rss_link = cblink(array("name"=>"rss")); + $rss_feeds = array(); + $rss_feeds[] = array("title"=>"Recently added videos","link"=>$rss_link."recent"); + $rss_feeds[] = array("title"=>"Most Viewed Videos","link"=>$rss_link."views"); + $rss_feeds[] = array("title"=>"Top Rated Videos","link"=>$rss_link."rating"); + $rss_feeds[] = array("title"=>"Videos Being Watched","link"=>$rss_link."watching"); + + $funcs = get_functions('rss_feeds'); + if(is_array($funcs)) + { + foreach($funcs as $func) + { + return $func($params); + } + } + + if($params['link_tag']) + { + foreach($rss_feeds as $rss_feed) + { + echo "\n"; + } + } + } + + /** + * Function used to insert Log + */ + function insert_log($type,$details) + { + global $cblog; + $cblog->insert($type,$details); + } + + /** + * Function used to get db size + */ + function get_db_size() + { + $result = mysql_query("SHOW TABLE STATUS"); + $dbsize = 0; + while( $row = mysql_fetch_array( $result ) ) + { + $dbsize += $row[ "Data_length" ] + $row[ "Index_length" ]; + } + return $dbsize; + } + + + /** + * Function used to check weather user has marked comment as spam or not + */ + function marked_spammed($comment) + { + $spam_voters = explode("|",$comment['spam_voters']); + $spam_votes = $comment['spam_votes']; + $admin_vote = in_array('1',$spam_voters); + if(userid() && in_array(userid(),$spam_voters)){ + return true; + }elseif($admin_vote){ + return true; + }else{ + return false; + } + } + + + /** + * function used to get all time zones + */ + function get_time_zones() + { + $timezoneTable = array( + "-12" => "(GMT -12:00) Eniwetok, Kwajalein", + "-11" => "(GMT -11:00) Midway Island, Samoa", + "-10" => "(GMT -10:00) Hawaii", + "-9" => "(GMT -9:00) Alaska", + "-8" => "(GMT -8:00) Pacific Time (US & Canada)", + "-7" => "(GMT -7:00) Mountain Time (US & Canada)", + "-6" => "(GMT -6:00) Central Time (US & Canada), Mexico City", + "-5" => "(GMT -5:00) Eastern Time (US & Canada), Bogota, Lima", + "-4" => "(GMT -4:00) Atlantic Time (Canada), Caracas, La Paz", + "-3.5" => "(GMT -3:30) Newfoundland", + "-3" => "(GMT -3:00) Brazil, Buenos Aires, Georgetown", + "-2" => "(GMT -2:00) Mid-Atlantic", + "-1" => "(GMT -1:00 hour) Azores, Cape Verde Islands", + "0" => "(GMT) Western Europe Time, London, Lisbon, Casablanca", + "1" => "(GMT +1:00 hour) Brussels, Copenhagen, Madrid, Paris", + "2" => "(GMT +2:00) Kaliningrad, South Africa", + "3" => "(GMT +3:00) Baghdad, Riyadh, Moscow, St. Petersburg", + "3.5" => "(GMT +3:30) Tehran", + "4" => "(GMT +4:00) Abu Dhabi, Muscat, Baku, Tbilisi", + "4.5" => "(GMT +4:30) Kabul", + "5" => "(GMT +5:00) Ekaterinburg, Islamabad, Karachi, Tashkent", + "5.5" => "(GMT +5:30) Bombay, Calcutta, Madras, New Delhi", + "6" => "(GMT +6:00) Almaty, Dhaka, Colombo", + "7" => "(GMT +7:00) Bangkok, Hanoi, Jakarta", + "8" => "(GMT +8:00) Beijing, Perth, Singapore, Hong Kong", + "9" => "(GMT +9:00) Tokyo, Seoul, Osaka, Sapporo, Yakutsk", + "9.5" => "(GMT +9:30) Adelaide, Darwin", + "10" => "(GMT +10:00) Eastern Australia, Guam, Vladivostok", + "11" => "(GMT +11:00) Magadan, Solomon Islands, New Caledonia", + "12" => "(GMT +12:00) Auckland, Wellington, Fiji, Kamchatka" + ); + return $timezoneTable; + } + + + /** + * Function used to get object type from its code + * ie v=>video + */ + function get_obj_type($type) + { + switch($type) + { + case "v": + { + return "video"; + } + break; + } + } + + + + function check_cbvideo() + { + + /** + * come, keep it for two more versions only + * it will be gone in next few updates by default :p + * + * but dont ever forget its name + * its a damn ClipBucket + */ + + if((!defined("isCBSecured") + || count(get_functions('clipbucket_footer'))== 0 ) + && !BACK_END) + { + echo cbSecured(CB_SIGN_C); + } + } + + /** + * Gives coversion process output + */ + function conv_status($in) + { + switch($in) + { + case "p": + return "Processing"; + break; + case "no": + return "Pending"; + break; + case "yes": + return "Done"; + break; + } + } + + function check_install($type) + { + global $while_installing,$Cbucket; + switch($type) + { + case "before": + { + if(file_exists('files/temp/install.me') && !file_exists('includes/clipbucket.php')) + { + header('Location: '.get_server_url().'/cb_install'); + } + } + break; + + case "after": + { + if(file_exists('files/temp/install.me')) + { + $Cbucket->configs['closed'] = 1; + } + } + break; + } + } + + function get_server_url() + { + $DirName = dirname($_SERVER['PHP_SELF']); + if(preg_match('/admin_area/i', $DirName)) + { + $DirName = str_replace('/admin_area','',$DirName); + } + if(preg_match('/cb_install/i', $DirName)) + { + $DirName = str_replace('/cb_install','',$DirName); + } + return get_server_protocol().$_SERVER['HTTP_HOST'].$DirName; + } + + function get_server_protocol() + { + if(isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') + { + return 'https://'; + } + else + { + $protocol = preg_replace('/^([a-z]+)\/.*$/', '\\1', strtolower($_SERVER['SERVER_PROTOCOL'])); + $protocol .= '://'; + return $protocol; + } + } + + + /** + * Returns true if the string or array of string is encoded in UTF8. + * + * Example of use. If you want to know if a file is saved in UTF8 format : + * $array = file('one file.txt'); + * $isUTF8 = isUTF8($array); + * if (!$isUTF8) --> we need to apply utf8_encode() to be in UTF8 + * else --> we are in UTF8 :) + * + * @param mixed A string, or an array from a file() function. + * @return boolean + */ + function isUTF8($string) + { + if (is_array($string)) + { + $enc = implode('', $string); + return @!((ord($enc[0]) != 239) && (ord($enc[1]) != 187) && (ord($enc[2]) != 191)); + } + else + { + return (utf8_encode(utf8_decode($string)) == $string); + } + } + + /* + extract the file extension from any given path or url. + source: http://www.php.net/manual/en/function.basename.php#89127 + */ + function fetch_file_extension($filepath) + { + preg_match('/[^?]*/', $filepath, $matches); + $string = $matches[0]; + + $pattern = preg_split('/\./', $string, -1, PREG_SPLIT_OFFSET_CAPTURE); + + # check if there is any extension + if(count($pattern) == 1) + { + // no file extension found + return; + } + + if(count($pattern) > 1) + { + $filenamepart = $pattern[count($pattern)-1][0]; + preg_match('/[^?]*/', $filenamepart, $matches); + return $matches[0]; + } + } + + /* + extract the file filename from any given path or url. + source: http://www.php.net/manual/en/function.basename.php#89127 + */ + function fetch_filename($filepath) + { + preg_match('/[^?]*/', $filepath, $matches); + $string = $matches[0]; + #split the string by the literal dot in the filename + $pattern = preg_split('/\./', $string, -1, PREG_SPLIT_OFFSET_CAPTURE); + #get the last dot position + $lastdot = $pattern[count($pattern)-1][1]; + #now extract the filename using the basename function + $filename = basename(substr($string, 0, $lastdot-1)); + + #return the filename part + return $filename; + } + + /** + * Function used to generate + * embed code of embedded video + */ + function embeded_code($vdetails) + { + $code = ''; + $code .= ''; + $code .= ''; + $code .= ''; + //Replacing Height And Width + $h_w_p = array("{Width}","{Height}"); + $h_w_r = array(EMBED_VDO_WIDTH,EMBED_VDO_HEIGHT); + $embed_code = str_replace($h_w_p,$h_w_r,$vdetails['embed_code']); + $code .= unhtmlentities($embed_code); + $code .= ''; + return $code; + } + + + /** + * function used to convert input to proper date created formate + */ + function datecreated($in) + { + + $date_els = explode('-',$in); + + //checking date format + $df = config("date_format"); + $df_els = explode('-',$df); + + foreach($df_els as $key => $el) + ${strtolower($el).'id'} = $key; + + $month = $date_els[$mid]; + $day = $date_els[$did]; + $year = $date_els[$yid]; + + if($in) + return date("Y-m-d",strtotime($year.'-'.$month.'-'.$day)); + else + return '0000-00-00'; + } + + + /** + * After struggling alot with baseurl problem + * i finally able to found its nice and working solkution.. + * its not my original but its a genuine working copy + * its still in beta mode + */ + function baseurl() + { + $protocol = is_ssl() ? 'https://' : 'http://'; + if(!$sub_dir) + return $base = $protocol.$_SERVER['HTTP_HOST'].untrailingslashit(stripslashes(dirname(($_SERVER['SCRIPT_NAME'])))); + else + return $base = $protocol.$_SERVER['HTTP_HOST'].untrailingslashit(stripslashes(dirname(dirname($_SERVER['SCRIPT_NAME'])))); + + }function base_url(){ return baseurl();} + + /** + * SRC (WORD PRESS) + * Appends a trailing slash. + * + * Will remove trailing slash if it exists already before adding a trailing + * slash. This prevents double slashing a string or path. + * + * The primary use of this is for paths and thus should be used for paths. It is + * not restricted to paths and offers no specific path support. + * + * @since 1.2.0 + * @uses untrailingslashit() Unslashes string if it was slashed already. + * + * @param string $string What to add the trailing slash to. + * @return string String with trailing slash added. + */ + function trailingslashit($string) { + return untrailingslashit($string) . '/'; + } + + /** + * SRC (WORD PRESS) + * Removes trailing slash if it exists. + * + * The primary use of this is for paths and thus should be used for paths. It is + * not restricted to paths and offers no specific path support. + * + * @since 2.2.0 + * + * @param string $string What to remove the trailing slash from. + * @return string String without the trailing slash. + */ + function untrailingslashit($string) { + return rtrim($string, '/'); + } + + + /** + * Determine if SSL is used. + * + * @since 2.6.0 + * + * @return bool True if SSL, false if not used. + */ + function is_ssl() { + if ( isset($_SERVER['HTTPS']) ) { + if ( 'on' == strtolower($_SERVER['HTTPS']) ) + return true; + if ( '1' == $_SERVER['HTTPS'] ) + return true; + } elseif ( isset($_SERVER['SERVER_PORT']) && ( '443' == $_SERVER['SERVER_PORT'] ) ) { + return true; + } + return false; + } + + /** + * This will update stats like Favorite count, Playlist count + */ + function updateObjectStats($type='favorite',$object='video',$id,$op='+') + { + global $db; + + switch($type) + { + case "favorite": case "favourite": + case "favorites": case "favourties": + case "fav": + { + switch($object) + { + case "video": + case "videos": case "v": + { + $db->update(tbl('video'),array('favourite_count'),array("|f|favourite_count".$op."1")," videoid = '".$id."'"); + } + break; + + case "photo": + case "photos": case "p": + { + $db->update(tbl('photos'),array('total_favorites'),array("|f|total_favorites".$op."1")," photo_id = '".$id."'"); + } + break; + + /*case "collection": + case "collections": case "cl": + { + $db->update(tbl('photos'),array('total_favorites'),array("|f|total_favorites".$op."1")," photo_id = '".$id."'"); + } + break;*/ + } + } + break; + + case "playlist": case "playList": + case "plist": + { + switch($object) + { + case "video": + case "videos": case "v": + { + $db->update(tbl('video'),array('playlist_count'),array("|f|playlist_count".$op."1")," videoid = '".$id."'"); + } + } + } + } + } + + + /** + * FUnction used to check weather conversion lock exists or not + * if converson log exists it means no further conersion commands will be executed + * + * @return BOOLEAN + */ + function conv_lock_exists() + { + if(file_exists(TEMP_DIR.'/conv_lock.loc')) + return true; + else + return false; + } + + /** + * Function used to return a well-formed queryString + * for passing variables to url + * @input variable_name + */ + function queryString($var=false,$remove=false) + { + $queryString = $_SERVER['QUERY_STRING']; + + if($var) + $queryString = preg_replace("/&?$var=([\w+\s\b\.?\S]+|)/","",$queryString); + + if($remove) + { + if(!is_array($remove)) + $queryString = preg_replace("/&?$remove=([\w+\s\b\.?\S]+|)/","",$queryString); + else + foreach($remove as $rm) + $queryString = preg_replace("/&?$rm=([\w+\s\b\.?\S]+|)/","",$queryString); + + } + + if($queryString) + $preUrl = "?$queryString&"; + else + $preUrl = "?"; + + $preUrl = preg_replace(array("/(\&{2,10})/","/\?\&/"),array("&","?"),$preUrl); + + return $preUrl.$var; + } + + + /** + * Following two functions are taken from + * tutorialzine.com's post 'Creating a Facebook-like Registration Form with jQuery' + * These function are written by Martin Angelov. + * Read post here: http://tutorialzine.com/2009/08/creating-a-facebook-like-registration-form-with-jquery/ + */ + function generate_options($params) + { + $reverse=false; + + if($params['from']>$params['to']) + { + $tmp=$params['from']; + $params['from']=$params['to']; + $params['to']=$tmp; + + $reverse=true; + } + + + $return_string=array(); + for($i=$params['from'];$i<=$params['to'];$i++) + { + //$return_string[$i] = ($callback?$callback($i):$i); + $return_string[] = ''; + } + + if($reverse) + { + $return_string=array_reverse($return_string); + } + + + return join('',$return_string); + } + function callback_month($month) + { + return date('M',mktime(0,0,0,$month,1)); + } + + + /** + * Function use to download file to server + * + * @param URL + * @param destination + */ + function snatch_it($snatching_file,$destination,$dest_name,$rawdecode=true) + { + global $curl; + if($rawdecode==true) + $snatching_file= rawurldecode($snatching_file); + $destination.'/'.$dest_name; + $fp = fopen ($destination.'/'.$dest_name, 'w+'); + $ch = curl_init($snatching_file); + curl_setopt($ch, CURLOPT_TIMEOUT, 600); + curl_setopt($ch, CURLOPT_FILE, $fp); + curl_setopt($ch, CURLOPT_USERAGENT, + 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.2) Gecko/20070219 Firefox/2.0.0.2'); + curl_exec($ch); + curl_close($ch); + fclose($fp); + } + + + /** + * Function check curl + */ + function isCurlInstalled() + { + if (in_array ('curl', get_loaded_extensions())) { + return true; + } + else{ + return false; + } + } + + /** + * Function for loading + * uploader file url & other configurations + */ + function uploaderDetails() + { + global $uploaderType; + + $uploaderDetails = array + ( + 'uploadSwfPath' => JS_URL.'/uploadify/uploadify.swf', + 'uploadScriptPath' => BASEURL.'/actions/file_uploader.php', + ); + + $photoUploaderDetails = array + ( + 'uploadSwfPath' => JS_URL.'/uploadify/uploadify.swf', + 'uploadScriptPath' => BASEURL.'/actions/photo_uploader.php', + ); + + + assign('uploaderDetails',$uploaderDetails); + assign('photoUploaderDetails',$photoUploaderDetails); + //Calling Custom Functions + cb_call_functions('uploaderDetails'); + } + + + /** + * Function isSectionEnabled + * This function used to check weather INPUT section is enabled or not + */ + function isSectionEnabled($input,$restrict=false) + { + global $Cbucket; + + $section = $Cbucket->configs[$input.'Section']; + + if(!$restrict) + { + if($section =='yes') + return true; + else + return false; + }else + { + if($section =='yes' || THIS_PAGE=='cb_install') + { + return true; + }else + { + template_files('blocked.html'); + display_it(); + exit(); + } + } + + } + + + function array_depth($array) { + $ini_depth = 0; + + foreach($array as $arr) + { + if(is_array($arr)) + { + $depth = array_depth($arr) + 1; + + if($depth > $ini_depth) + $ini_depth = $depth; + } + } + + return $ini_depth; + } + + + /** + * JSON_ENCODE short + */ + function je($in){ return json_encode($in); } + /** + * JSON_DECODE short + */ + function jd($in,$returnClass=false){ if(!$returnClass) return json_decode($in,true); else return json_decode($in); } + + + /** + * function used to update last commented option + * so comment cache can be refreshed + */ + function update_last_commented($type,$id) + { + global $db; + + if($type && $id) + { + switch($type) + { + case "v": + case "video": + case "vdo": + case "vid": + case "videos": + $db->update(tbl("video"),array('last_commented'),array(now()),"videoid='$id'"); + break; + + case "c": + case "channel": + case "user": + case "u": + case "users": + case "channels": + $db->update(tbl("users"),array('last_commented'),array(now()),"userid='$id'"); + break; + + case "cl": + case "collection": + case "collect": + case "collections": + case "collects": + $db->update(tbl("collections"),array('last_commented'),array(now()),"collection_id='$id'"); + break; + + case "p": + case "photo": + case "photos": + case "picture": + case "pictures": + $db->update(tbl("photos"),array('last_commented'),array(now()),"photo_id='$id'"); + break; + + case "t": + case "topic": + case "topics": + $db->update(tbl("group_topics"),array('last_post_time'),array(now()),"topic_id='$id'"); + break; + + } + } + } + + + + + /** + * Function used to check + * input users are valid or not + * so that only registere usernames can be set + */ + function video_users($users) + { + global $userquery; + $users_array = explode(',',$users); + $new_users = array(); + foreach($users_array as $user) + { + if($user!=username() && !is_numeric($user) && $userquery->user_exists($user)) + { + $new_users[] = $user; + } + } + + $new_users = array_unique($new_users); + + if(count($new_users)>0) + return implode(',',$new_users); + else + return " "; + } + + /** + * function used to check weather logged in user is + * is in video users or not + */ + function is_video_user($vdo,$user=NULL) + { + + if(!$user) + $user = username(); + if(is_array($vdo)) + $video_users = $vdo['video_users']; + else + $video_users = $vdo; + + + $users_array = explode(',',$video_users); + + if(in_array($user,$users_array)) + return true; + else + return false; + } + /** + * Function used display privacy in text + * according to provided number + * 0 - Public + * 1 - Protected + * 2 - Private + */ + function getGroupPrivacy($privacyID) + { + { + switch($privacyID) + { + case "0": default: + { + return lang("group_is_public"); + } + break; + + case "1": + { + return lang("group_is_protected"); + } + break; + + case "2": + { + return lang("group_is_private"); + } + break; + } + } + } + + /** + * Function used to create user feed + * this function simple takes ID as input + * and do the rest seemlessli ;) + */ + function addFeed($array) + { + global $cbfeeds,$cbphoto,$userquery; + + $action = $array['action']; + if($array['uid']) + $userid = $array['uid']; + else + $userid = userid(); + + switch($action) + { + case "upload_photo": + { + + $feed['action'] = 'upload_photo'; + $feed['object'] = 'photo'; + $feed['object_id'] = $array['object_id']; + $feed['uid'] = $userid;; + + $cbfeeds->addFeed($feed); + } + break; + case "upload_video": + case "add_favorite": + { + + $feed['action'] = $action; + $feed['object'] = 'video'; + $feed['object_id'] = $array['object_id']; + $feed['uid'] = $userid; + + $cbfeeds->addFeed($feed); + } + break; + + case "signup": + { + + $feed['action'] = 'signup'; + $feed['object'] = 'signup'; + $feed['object_id'] = $array['object_id']; + $feed['uid'] = $userid;; + + $cbfeeds->addFeed($feed); + } + break; + + case "create_group": + case "join_group": + { + $feed['action'] = $action; + $feed['object'] = 'group'; + $feed['object_id'] = $array['object_id']; + $feed['uid'] = $userid; + + $cbfeeds->addFeed($feed); + } + break; + + case "add_friend": + { + $feed['action'] = 'add_friend'; + $feed['object'] = 'friend'; + $feed['object_id'] = $array['object_id']; + $feed['uid'] = $userid; + + $cbfeeds->addFeed($feed); + } + break; + + case "add_collection": + { + $feed['action'] = 'add_collection'; + $feed['object'] = 'collection'; + $feed['object_id'] = $array['object_id']; + $feed['uid'] = $userid; + + $cbfeeds->addFeed($feed); + } + + } + } + + /** + * function used to get plugin directory name + */ + function this_plugin($pluginFile=NULL) + { + if(!$pluginFile) + global $pluginFile; + return basename(dirname($pluginFile)); + } + + /** + * function used to create folder for video + * and files + */ + function createDataFolders() + { + $year = date("Y"); + $month = date("m"); + $day = date("d"); + $folder = $year.'/'.$month.'/'.$day; + @mkdir(VIDEOS_DIR.'/'.$folder,0777,true); + @mkdir(THUMBS_DIR.'/'.$folder,0777,true); + @mkdir(ORIGINAL_DIR.'/'.$folder,0777,true); + @mkdir(PHOTOS_DIR.'/'.$folder,0777,true); + + return $folder; + } + + + /** + * function used to get user agent details + * Thanks to ruudrp at live dot nl 28-Nov-2010 11:31 PHP.NET + */ + function get_browser_details($in=NULL,$assign=false) + { + //Checking if browser is firefox + if(!$in) + $in = $_SERVER['HTTP_USER_AGENT']; + + $u_agent = $in; + $bname = 'Unknown'; + $platform = 'Unknown'; + $version= ""; + + //First get the platform? + if (preg_match('/linux/i', $u_agent)) { + $platform = 'linux'; + } + elseif (preg_match('/iPhone/i', $u_agent)) { + $platform = 'iphone'; + } + elseif (preg_match('/iPad/i', $u_agent)) { + $platform = 'ipad'; + } + elseif (preg_match('/macintosh|mac os x/i', $u_agent)) { + $platform = 'mac'; + } + elseif (preg_match('/windows|win32/i', $u_agent)) { + $platform = 'windows'; + } + + // Next 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"; + } + elseif(preg_match('/Googlebot/i',$u_agent)) + { + $bname = 'Googlebot'; + $ub = "bot"; + }elseif(preg_match('/msnbot/i',$u_agent)) + { + $bname = 'MSNBot'; + $ub = "bot"; + }elseif(preg_match('/Yahoo\! Slurp/i',$u_agent)) + { + $bname = 'Yahoo Slurp'; + $ub = "bot"; + } + + + // 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="?";} + + $array= array( + 'userAgent' => $u_agent, + 'name' => $bname, + 'version' => $version, + 'platform' => $platform, + 'bname' => strtolower($ub), + 'pattern' => $pattern + ); + + if($assign) assign($assign,$array); else return $array; + } + + function update_user_voted($array,$userid=NULL) + { + global $userquery; + return $userquery->update_user_voted($array,$userid); + } + + /** + * function used to delete vidoe from collections + */ + function delete_video_from_collection($vdetails) + { + global $cbvid; + $cbvid->collection->deleteItemFromCollections($vdetails['videoid']); + } + + + /** + * function used to check + * remote link is valid or not + */ + + function checkRemoteFile($url) + { + $ch = curl_init(); + curl_setopt($ch, CURLOPT_URL,$url); + // don't download content + curl_setopt($ch, CURLOPT_NOBODY, 1); + curl_setopt($ch, CURLOPT_FAILONERROR, 1); + curl_setopt($ch, CURLOPT_HEADER, 1); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); + $result = curl_exec($ch); + if($result!==FALSE) + { + return true; + } + else + { + return false; + } + } + + + /** + * function used to get counts from + * cb_counter table + */ + function get_counter($section,$query) + { + if(!config('use_cached_pagin')) + return false; + + global $db; + + $timeRefresh = config('cached_pagin_time'); + $timeRefresh = $timeRefresh*60; + + $validTime = time()-$timeRefresh; + + unset($query['order']); + $je_query = json_encode($query); + $query_md5 = md5($je_query); + $select = $db->select(tbl('counters'),"*","section='$section' AND query_md5='$query_md5' + AND '$validTime' < date_added"); + if($db->num_rows>0) + { + return $select[0]['counts']; + }else + return false; + } + + /** + * function used to insert or update counter + */ + function update_counter($section,$query,$counter) + { + global $db; + unset($query['order']); + $je_query = json_encode($query); + $query_md5 = md5($je_query); + $count = $db->count(tbl('counters'),"*","section='$section' AND query_md5='$query_md5'"); + if($count) + { + $db->update(tbl('counters'),array('counts','date_added'),array($counter,strtotime(now())), + "section='$section' AND query_md5='$query_md5'"); + }else + { + $db->insert(tbl('counters'),array('section','query','query_md5','counts','date_added'), + array($section,'|no_mc|'.$je_query,$query_md5,$counter,strtotime(now()))); + } + } + + /** + * function used to register a module file, that will be later called + * by load_modules() function + */ + function register_module($mod_name,$file) + { + global $Cbucket; + $Cbucket->modules_list[$mod_name][] = $file; + + } + + /** + * function used to load module files + */ + function load_modules() + { + global $Cbucket,$lang_obj,$signup,$Upload,$cbgroup, + $adsObj,$formObj,$cbplugin,$eh,$sess,$cblog,$imgObj, + $cbvideo,$cbplayer,$cbemail,$cbpm,$cbpage,$cbindex, + $cbcollection,$cbphoto,$cbfeeds,$userquery,$db,$pages,$cbvid; + + foreach($Cbucket->modules_list as $cbmod) + { + foreach($cbmod as $modfile) + if(file_exists($modfile)) + include($modfile); + } + } + + + /** + * function used to verify user age + */ + function verify_age($dob) + { + $allowed_age = config('min_age_reg'); + if($allowed_age < 1) return true; + + $age_time = strtotime($dob); + $diff = time() - $age_time; + + $diff = $diff / 60 / 60 / 24 / 364; + + if($diff >= $allowed_age ) return true; + + return false; + } + + + include('functions_db.php'); +?> \ No newline at end of file diff --git a/upload/includes/functions_db.php b/upload/includes/functions_db.php new file mode 100644 index 00000000..6b3e171d --- /dev/null +++ b/upload/includes/functions_db.php @@ -0,0 +1,133 @@ +_select($query); +} + +function db_update($tbl, $fields, $cond) +{ + global $db; + + $count = 0; + foreach ($fields as $field => $val) { + + if ($count > 0) + $fields_query .= ','; + + + $needle = substr($val, 0, 2); + + if ($needle != '{{') + $value = "'" . filter_sql($val) . "'"; + else + { + $val = substr($val, 2, strlen($val) - 4); + $value = filter_sql($val); + } + + $fields_query .= $field . "=$value "; + $count++; + } + + //Complete Query + $query = "UPDATE $tbl SET $fields_query WHERE $cond $ep"; + //if(!mysql_query($query)) die($query.'
    '.mysql_error()); + $db->total_queries++; + $db->total_queries_sql[] = $query; + $db->Execute($query); + + if (mysql_error()) + die($db->db_query . '
    ' . mysql_error()); + + return true; +} + +function db_insert($tbl, $fields) +{ + global $db; + + $count = 0; + + $query_fields = array(); + $query_values = array(); + + + foreach ($fields as $field => $val) { + + $query_fields[] = $field; + + $needle = substr($val, 0, 2); + + if ($needle != '{{') + $query_values[] = "'" . filter_sql($val) . "'"; + else + { + $val = substr($val, 2, strlen($val) - 4); + $query_values[] = filter_sql($val); + } + + $count++; + } + + $fields_query = implode(',', $query_fields); + $values_query = implode(',', $query_values); + + + + + //Complete Query + $query = "INSERT INTO $tbl ($fields_query) VALUES ($values_query) $ep"; + + //if(!mysql_query($query)) die($query.'
    '.mysql_error()); + $db->total_queries++; + $db->total_queries_sql[] = $query; + $db->Execute($query); + + if (mysql_error()) + { + //if(LOG_DB_ERRORS) + + die($db->db_query . '
    ' . mysql_error()); + } + + return $db->insert_id(); +} + +function filter_sql($data) +{ + $data = mysql_real_escape_string($data); + return $data; +} + +/** + * Function used to count fields in mysql + * @param TABLE NAME + * @param Fields + * @param condition + */ +function dbcount($tbl, $fields = '*', $cond = false) +{ + global $db; + if ($cond) + $condition = " Where $cond "; + $query = "Select Count($fields) From $tbl $condition"; + $result = $db->Execute($query); + $db->total_queries++; + $db->total_queries_sql[] = $query; + $fields = $result->fields; + + if ($fields) + { + foreach ($fields as $field) + return $field; + } + return false; +} + +?> diff --git a/upload/includes/index.php b/upload/includes/index.php new file mode 100644 index 00000000..403f2e18 --- /dev/null +++ b/upload/includes/index.php @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/upload/includes/langs/en.lang b/upload/includes/langs/en.lang new file mode 100644 index 00000000..3cd74efa --- /dev/null +++ b/upload/includes/langs/en.lang @@ -0,0 +1 @@ +{"ad_name_error":"Please enter a name for the Advertisment","ad_code_error":"Error : Please enter a code for the Advertisement","ad_exists_error1":"Advertisement does not exist","ad_exists_error2":"Error : Advertisement with this name already exist","ad_add_msg":"Advertisment was added succesfully","ad_msg":"Ad Has Been ","ad_update_msg":"Advertisment has been Updated","ad_del_msg":"Advertisement has been Deleted","ad_deactive":"Deactivated","ad_active":"Activated","ad_placment_delete_msg":"Placement has been Removed","ad_placement_err1":"Placement already exists","ad_placement_err2":"Please Enter a name for the Placement","ad_placement_err3":"Please Enter a Code for the Placement","ad_placement_msg":"Placement has been Added","cat_img_error":"Please Upload JPEG, GIF or PNG image only","cat_exist_error":"Category doesn’t exist","cat_add_msg":"Category has been added successfully","cat_update_msg":"Category has been updated","grp_err":"Group Doesn’t Exist","grp_fr_msg":"Group has been set as featured","grp_fr_msg1":"Selected Groups Have Been Removed From The Featured List","grp_ac_msg":"Selected Groups Have Been Activated","grp_dac_msg":"Selected Groups Have Been Dectivated","grp_del_msg":"Group has been deleted","editor_pic_up":"Video Has Been Moved Up","editor_pic_down":"Video Has Been Moved Down","plugin_install_msg":"Plugin has been installed","plugin_no_file_err":"No file was found","plugin_file_detail_err":"Unknown plugin details found","plugin_installed_err":"Plugin already installed","plugin_no_install_err":"Plugin is not installed","grp_name_error":"Please enter group name","grp_name_error1":"Group Name Already Exists","grp_des_error":"Please Enter A Little Description For The Group","grp_tags_error":"Please Enter Tags For The Group","grp_url_error":"Please enter valid url for the Group","grp_url_error1":"Please enter Valid URL name","grp_url_error2":"Group URL Already Exists, Please Choose a Different URL","grp_tpc_error":"Please enter a topic to add","grp_comment_error":"You must enter a comment","grp_join_error":"You have already joined this group","grp_prvt_error":"This Group Is Private, Please Login to View this Group","grp_inact_error":"This Group Is Inactive, Please Contact Administrator for the problem","grp_join_error1":"You Have Not Joined This Group Yet","grp_exist_error":"Sorry, Group Doesn’t Exist","grp_tpc_error1":"This Topic is not approved by the Group Owner","grp_cat_error":"Please Select A Category For Your group","grp_tpc_error2":"Please enter a topic to add","grp_tpc_error3":"Your Topic Requires Approval From The Owner Of This Group","grp_tpc_msg":"Topic has been added","grp_comment_msg":"Comment has been added","grp_vdo_msg":"Videos Deleted","grp_vdo_msg1":"Videos Added Successfully","grp_vdo_msg2":"Videos Have Been Approved","grp_mem_msg":"Member Has Been Deleted","grp_mem_msg1":"Member Has Been Approved","grp_inv_msg":"Your Invitation Has Been Sent","grp_tpc_msg1":"Topic has been deleted","grp_tpc_msg2":"Topic Has Been Approved","grp_fr_msg2":"Group has been removed from featured list","grp_inv_msg1":"Has Invited You To Join ","grp_av_msg":"Group has been activated","grp_da_msg":"Group has been deactivated","grp_post_msg":"Post Has Been Deleted","grp_update_msg":"Group has been updated","grp_owner_err":"Only Owner Can Add Videos To This Group","grp_owner_err1":"You are not owner of this group","grp_owner_err2":"You are the owner of this group. You cannot leave your group.","grp_prvt_err1":"This group is private, you need invitiation from its owner in order to join","grp_rmv_msg":"Selected Groups Have Been Removed From Your Account","grp_tpc_err4":"Sorry, Topic Doesn’t Exist","grp_title_topic":"Groups - Topic - ","grp_add_title":"- Add Video","usr_sadmin_err":"You Cannot Set SuperAdmin Username as Blank","usr_cpass_err":"Confirm Password Doesn’t Match","usr_pass_err":"Old password is incorrect","usr_email_err":"Please Provide A Valid Email Address","usr_cpass_err1":"Confirm password is incorrect","usr_pass_err1":"Password is Incorrect","usr_cmt_err":"You Must Login First To Comment","usr_cmt_err1":"Please Type Something In the Comment Box","usr_cmt_err2":"You cannot comment on your video","usr_cmt_err3":"You Have Already Posted a Comment on this channel.","usr_cmt_err4":"Comment Has Been Added","usr_cmt_del_msg":"Comment Has Been Deleted","usr_cmt_del_err":"An Error Occured While deleting a Comment","usr_cnt_err":"You Cannot Add Yourself as a Contact","usr_cnt_err1":"You Have Already Added This User To Your Contact List","usr_sub_err":"You are already subscribed to %s","usr_exist_err":"User Doesnt Exist","usr_ccode_err":"Verification code you entered was wrong","usr_exist_err1":"Sorry, No User Exists With This Email","usr_exist_err2":"Sorry , User Doesn't Exist","usr_uname_err":"Username is empty","usr_uname_err2":"Username already exists","usr_pass_err2":"Password Is Empty","usr_email_err1":"Email is Empty","usr_email_err2":"Please Enter A Valid Email Address","usr_email_err3":"Email Address Is Already In Use","usr_pcode_err":"Postal Codes Only Contain Numbers","usr_fname_err":"First Name Is Empty","usr_lname_err":"Last Name Is Empty","usr_uname_err3":"Username Contains Unallowed Characters","usr_pass_err3":"Passwords MisMatched","usr_dob_err":"Please Select Date Of Birth","usr_ament_err":"Sorry, you need to agree to the terms of use and privacy policy to create an account","usr_reg_err":"Sorry, Registrations Are Temporarily Not Allowed, Please Try Again Later","usr_ban_err":"User account is banned, please contact website administrator","usr_login_err":"Username and Password Didn’t Match","usr_sadmin_msg":"Super Admin Has Been Updated","usr_pass_msg":"Your Password Has Been Changed","usr_cnt_msg":"This User Has Been Added To Your Contact List","usr_sub_msg":"You are now subsribed to %s","usr_uname_email_msg":"We Have Sent you an Email containing Your Username, Please Check It","usr_rpass_email_msg":"An Email Has Been Sent To You. Please Follow the Instructions there to Reset Your Password","usr_pass_email_msg":"Password has been changed successfully","usr_email_msg":"Email Settings Has Been Updated","usr_del_msg":"User has been deleted","usr_dels_msg":"Selected Users Have Been Deleted","usr_ac_msg":"User has been activated","usr_dac_msg":"User has been deactivated","usr_mem_ac":"Selected Members Have Been Activated","usr_mems_ac":"Selected Members Have Been Deactivated","usr_fr_msg":"User Has Been Made a Featured Member","usr_ufr_msg":"User Has Been Unfeatured","usr_frs_msg":"Selected Users Have Been Set As Featured","usr_ufrs_msg":"Selected Users Have Been Removed From The Featured List","usr_uban_msg":"User Has Been Banned","usr_uuban_msg":"User Has Been Unbanned","usr_ubans_msg":"Selected Members Have Been Banned","usr_uubans_msg":"Selected Members Have Been Unbanned","usr_pass_reset_conf":"Password Reset Confirmation","usr_dear_user":"Dear User","usr_pass_reset_msg":"You Requested A Password Reset, Follow The Link To Reset Your Password","usr_rpass_msg":"Password Has Been Reset","usr_rpass_req_msg":"You Requested A Password Reset, Here is your new password : ","usr_uname_req_msg":"You Requested to Recover Your Username, Here is your username: ","usr_uname_recovery":"Username Recovery Email","usr_add_succ_msg":"User Has Been Added","usr_upd_succ_msg":"User has been updated","usr_activation_msg":"Your account has been activated. Now you can login to your account and upload videos","usr_activation_err":"This user is already activated","usr_activation_em_msg":"We have sent you an email containing your activation code, please check your mail box","usr_activation_em_err":"Email Doesn’t Exist or a User With This Email is already Activated","usr_no_msg_del_err":"No Message Was Selected To Delete","usr_sel_msg_del_msg":"Selected Messages Have Been Deleted","usr_pof_upd_msg":"Profile has been updated","usr_arr_no_ans":"no answer","usr_arr_elementary":"Elementary","usr_arr_hi_school":"High School","usr_arr_some_colg":"Some College","usr_arr_assoc_deg":"Associates Degree","usr_arr_bach_deg":"Bachelor’s Degree","usr_arr_mast_deg":"Master’s Degree","usr_arr_phd":"Ph.D.","usr_arr_post_doc":"Postdoctoral","usr_arr_single":"Single","usr_arr_married":"Married","usr_arr_comitted":"Comitted","usr_arr_open_marriage":"Open Marriage","usr_arr_open_relate":"Open Relationship","title_crt_new_msg":"Compose New Message","title_forgot":"Forgot Something? Find it now !","title_inbox":" - Inbox","title_sent":" - Sent Folder","title_usr_contact":"’s Contact List","title_usr_fav_vids":"%s\u2019s Favorite Videos","title_view_channel":"’s Channel","title_edit_video":"Edit Video - ","vdo_title_err":"Please Enter Video Title","vdo_des_err":"Please Enter Video Description","vdo_tags_err":"Please Enter Tags For The Video","vdo_cat_err":"Please Choose Atleast 1 Category","vdo_cat_err1":"You Can Only Choose Up to 3 Categories","vdo_sub_email_msg":" and therefore this message is sent to you automatically that ","vdo_has_upload_nv":"Has Uploaded New Video","vdo_del_selected":"Selected Videos Have Been Deleted","vdo_cheat_msg":"Please Don't Try To Cheat","vdo_limits_warn_msg":"Please Don't Try To Cross Your Limits","vdo_cmt_del_msg":"Comment Has Been Deleted","vdo_iac_msg":"Video Is Inactive - Please Contact Admin For Details","vdo_is_in_process":"Video Is Being Processed - Please Contact Administrator for further details","vdo_upload_allow_err":"Uploading Is Not Allowed By Website Owner","vdo_download_allow_err":"Video Downloading Is Not Allowed","vdo_edit_owner_err":"You Are Not Video Owner","vdo_embed_code_wrong":"Embed Code Was Wrong","vdo_seconds_err":"Wrong Value Entered For Seconds Field","vdo_mins_err":"Wrong Value Entered For Minutes Field","vdo_thumb_up_err":"Error In Uploading Thumb","class_error_occured":"Sorry, An Error Occured","class_cat_del_msg":"Category has been deleted","class_vdo_del_msg":"Video has been deleted","class_vdo_fr_msg":"Video has been marked as “Featured Video”","class_fr_msg1":"Video has been removed from “Featured Videos”","class_vdo_act_msg":"Video has been activated","class_vdo_act_msg1":"Vidoe has been deactivated","class_vdo_update_msg":"Video details have been updated","class_comment_err":"You Must Login Before Postings Comments","class_comment_err1":"Please Type Something In The Comment Box","class_comment_err2":"You Cannot Post a Comment on Your Own Video","class_comment_err3":"You Have Already Posted a Comment, Please Wait for the others.","class_comment_err4":"You Have Already Replied To That a Comment, Please Wait for the others.","class_comment_err5":"You Cannot Post a Reply To Yourself","class_comment_msg":"Comment Has Been Added","class_comment_err6":"Please login to rate comment","class_comment_err7":"You have already rated this comment","class_vdo_fav_err":"This Video is Already Added To Your Favorites","class_vdo_fav_msg":"This Video Has Been Added To Your Favorites","class_vdo_flag_err":"You Have Already Flagged This Video","class_vdo_flag_msg":"This Video Has Been Flagged As Inappropriate","class_vdo_flag_rm":"Flag(s) Has\/Have Been Removed","class_send_msg_err":"Please Enter a Username or Select any User to Send Message","class_invalid_user":"Invalid Username","class_subj_err":"Message subject was empty","class_msg_err":"Please Type Something In Message Box","class_sent_you_msg":"Sent You A Message","class_sent_prvt_msg":"Sent You A Private Message on ","class_click_inbox":"Please Click here To View Your Inbox","class_click_login":"Click Here To Login","class_email_notify":"Email Notification","class_msg_has_sent_to":"Message Has Been Sent To ","class_inbox_del_msg":"Message Has Been Delete From Inbox ","class_sent_del_msg":"Message Has Been Delete From Sent Folder","class_msg_exist_err":"Message Doesn't Exist","class_vdo_del_err":"Video does not exist","class_unsub_msg":"You have been unsubscribed sucessfully","class_sub_exist_err":"Subscription Does Not Exist","class_vdo_rm_fav_msg":"Video Has Been Removed From Favourites","class_vdo_fav_err1":"This Video Is Not In Your Favourites List","class_cont_del_msg":"Contact Has Been Deleted","class_cot_err":"Sorry, This Contact Is Not In Your Contact List","class_vdo_ep_add_msg":"Video Has Been Added To Editor’s Pick","class_vdo_ep_err":"Video Is Already In The Editor’s Pick","class_vdo_ep_err1":"You Have Already Picked 10 Videos Please Delete Alteast One to Add More","class_vdo_ep_msg":"Video Has Been Removed From Editor’s Pick","class_vdo_exist_err":"Sorry, Video Doesn't Exist","class_img_gif_err":"Please Upload Gif Image Only","class_img_png_err":"Please Upload Png Image Only","class_img_jpg_err":"Please Upload Jpg Image Only","class_logo_msg":"Logo Has Been Changed. Please Clear Cache If You Are Not Able To See the Changed Logo","com_forgot_username":"Forgot Username | Password","com_join_now":"Join Now","com_my_account":"My Account","com_manage_vids":"Manage Videos","com_view_channel":"View My Channel","com_my_inbox":"My Inbox","com_welcome":"Welcome","com_top_mem":"Top Members ","com_vidz":"Videos","com_sign_up_now":"Sign Up Now !","com_my_videos":"My Videos","com_my_channel":"My Channel","com_my_subs":"My Subscriptions","com_user_no_contacts":"User Does Not Have Any Contact","com_user_no_vides":"User Does Not Have Any Favourite Video","com_user_no_vid_com":"User Has No Video Comments","com_view_all_contacts":"View All Contacts of","com_view_fav_all_videos":"View All Favourite Videos Of","com_login_success_msg":"You Have Been Successfully Logged In.","com_logout_success_msg":"You Have Been Successfully Logged Out.","com_not_redirecting":"You are now Redirecting .","com_not_redirecting_msg":"if your are not redirecting","com_manage_contacts":"Manage Contacts ","com_send_message":"Send Message","com_manage_fav":"Manage Favorites ","com_manage_subs":"Manage Subscriptions","com_subscribe_to":"Subscribe to %s’s channel","com_total_subs":"Total Subscribtions","com_total_vids":"Total Videos","com_date_subscribed":"Date Subscribed","com_search_results":"Search Results","com_advance_results":"Advanced Search","com_search_results_in":"Search Results In","videos_being_watched":"Recently Viewed...","latest_added_videos":"Recent Additions","most_viewed":"Most Viewed","recently_added":"Recently Added","featured":"Featured","highest_rated":"Highest Rated","most_discussed":"Most Discussed","style_change":"Style Change","rss_feed_latest_title":"RSS Feed for Most Recent Videos","rss_feed_featured_title":"RSS Feed for Featured Videos","rss_feed_most_viewed_title":"RSS Feed for Most Popular Videos","lang_folder":"en","reg_closed":"Registration Closed","reg_for":"Registration for","is_currently_closed":"is currently closed","about_us":"About Us","account":"Account","added":"Added","advertisements":"Advertisements","all":"All","active":"Active","activate":"Activate","age":"Age","approve":"Approve","approved":"Approved","approval":"Approval","books":"Books","browse":"Browse","by":"by","cancel":"Cancel","categories":"Categories","category":"Category","channels":"channels","check_all":"Check All","click_here":"Click Here","comments":"Comments","community":"Community","companies":"Companies","contacts":"Contacts","contact_us":"Contact Us","country":"Country","created":"Created","date":"Date","date_added":"Date Added","date_joined":"Date Joined","dear":"Dear","delete":"Delete","delete_selected":"Delete Selected","des_title":"Description:","duration":"Duration","education":"Education","email":"email","embed":"Embed","embed_code":"Embed Code","favourite":"Favorite","favourited":"Favorited","favourites":"Favorites","female":"Female","filter":"Filter","forgot":"Forgot","friends":"Friends","from":"From","gender":"Gender","groups":"Groups","hello":"Hello","help":"Help","hi":"Hi","hobbies":"Hobbies","Home":"Home","inbox":"Inbox","interests":"Interests","join_now":"Join Now","joined":"Joined","join":"Join","keywords":"Keywords","latest":"Latest","leave":"Leave","location":"Location","login":"Login","logout":"Logout","male":"Male","members":"Members","messages":"Messages","message":"Message","minutes":"minutes","most_members":"Most Members","most_recent":"Most Recent","most_videos":"Most Videos","music":"Music","my_account":"My Account","next":"Next","no":"No","no_user_exists":"No User Exists","no_video_exists":"No Video Exists","occupations":"Occupations","optional":"optional","owner":"Owner","password":"password","please":"Please","privacy":"Privacy","privacy_policy":"Privacy Policy","random":"Random","rate":"Rate","request":"Request","related":"Related","reply":"Reply","results":"Results","relationship":"Relationship","seconds":"seconds","select":"Select","send":"Send","sent":"Sent","signup":"Signup","subject":"Subject","tags":"Tags","times":"Times","to":"To","type":"Type","update":"Update","upload":"Upload","url":"Url","verification":"Verification","videos":"Videos","viewing":"Viewing","welcome":"Welcome","website":"Website","yes":"Yes","of":"of","on":"on","previous":"Previous","rating":"Rating","ratings":"Ratings","remote_upload":"Remote Upload","remove":"Remove","search":"Search","services":"Services","show_all":"Show All","signupup":"Sign Up","sort_by":"Sort","subscriptions":"Subscriptions","subscribers":"Subscribers","tag_title":"Tags","time":"time","top":"Top","tos_title":"Terms of Use","username":"Username","views":"Views","proccession_wait":"Processing, Please Wait","mostly_viewed":"Most Viewed","most_comments":"Most Comments","group":"Group","not_logged_in":"You are not logged in or you do not have permission to access this page. This could be due to one of several reasons:","fill_auth_form":"You are not logged in. Fill in the form below and try again.","insufficient_privileges":"You may not have sufficient privileges to access this page.","admin_disabled_you":"The site administrator may have disabled your account, or it may be awaiting activation.","Recover_Password":"Recover Password","Submit":"Submit","Reset_Fields":"Reset Fields","admin_reg_req":"The administrator may have required you to register before you can view this page.","lang_change":"Language Change","lang_changed":"Your language has been changed","lang_choice":"Language","if_not_redir":"Click here to continue if you are not automatically redirected.","style_changed":"Your style has been changed","style_choice":"Style","vdo_edit_vdo":"Edit Video","vdo_stills":"Video Stills","vdo_watch_video":"Watch Video","vdo_video_details":"Video Details","vdo_title":"Title","vdo_desc":"Description","vdo_cat":"Video Category","vdo_cat_msg":"You May Select Up To %s Categories","vdo_tags_msg":"Tags are separated by commas ie Arslan Hassan, Awesome, ClipBucket","vdo_br_opt":"Broadcast Options","vdo_br_opt1":"Public - Share your video with Everyone! (Recommended)","vdo_br_opt2":"Private - Viewable by you and your friends only.","vdo_date_loc":"Date And Location","vdo_date_rec":"Date Recorded","vdo_for_date":"format MM \/ DD \/ YYYY ","vdo_add_eg":"e.g London Greenland, Sialkot Mubarak Pura","vdo_share_opt":"Sharing and privacy options","vdo_allow_comm":"Allow Comments ","vdo_dallow_comm":"Do Not Allow Comments","vdo_comm_vote":"Comments Voting","vdo_allow_com_vote":"Allow Voting on Comments","vdo_dallow_com_vote":"Do Not Allow on Comments","vdo_allow_rating":"Yes, Allow Rating on this video","vdo_dallow_ratig":"No, Do Not Allow Rating on this video","vdo_embedding":"Embedding","vdo_embed_opt1":"Yes, People can play this video on other websites","vdo_embed_opt2":"No, People cannot play this video on other websites","vdo_update_title":"Update","vdo_inactive_msg":"Your Account is Inactive. Please Activate it to Upload Videos, To Activate your account Please","vdo_click_here":"Click Here","vdo_continue_upload":"Continue to Upload","vdo_upload_step1":"Video Upload","vdo_upload_step2":"Video Step %s\/2","vdo_upload_step3":"(Step 2\/2)","vdo_select_vdo":"Select a video to upload.","vdo_enter_remote_url":"Enter Url Of The Video.","vdo_enter_embed_code_msg":"Enter Embed Video Code from other websites ie Youtube or Metacafe.","vdo_enter_embed_code":"Enter Embed Code","vdo_enter_druation":"Enter Duration","vdo_select_vdo_thumb":"Select Video Thumb","vdo_having_trouble":"Having Trouble?","vdo_if_having_problem":"if you are having problems with the uploader","vdo_clic_to_manage_all":"Click Here To Manage All Videos","vdo_manage_vdeos":"Manage Videos ","vdo_status":"Status","vdo_rawfile":"RawFile","vdo_video_upload_complete":"Video Upload - Upload Complete","vdo_thanks_you_upload_complete_1":"Thank you! Your upload is complete","vdo_thanks_you_upload_complete_2":"This video will be available in","vdo_after_it_has_process":"after it has finished processing.","vdo_embed_this_video_on_web":"Embed this video on your website.","vdo_copy_and_paste_the_code":"Copy and paste the code below to embed this video.","vdo_upload_another_video":"Upload Another Video","vdo_goto_my_videos":"Goto My Videos","vdo_sperate_emails_by":"seperate emails by commas","vdo_personal_msg":"Personal Message","vdo_related_tags":"Related Tags","vdo_reply_to_this":"Reply To This ","vdo_add_reply":"Add Reply","vdo_share_video":"Share Video","vdo_about_this_video":"About This Video","vdo_post_to_a_services":"Post to an Aggregating Service","vdo_commentary":"Commentary","vdo_post_a_comment":"Post A Comment","grp_add_vdo_msg":"Add Videos To Group ","grp_no_vdo_msg":"You Don’t Have Any Video","grp_add_to":"Add To Group","grp_add_vdos":"Add Videos","grp_name_title":"Group name","grp_tag_title":"Tags:","grp_des_title":"Description:","grp_tags_msg":"Enter one or more tags, separated by spaces.","grp_tags_msg1":"Enter one or more tags, separated by spaces. Tags are keywords used to describe your group so it can be easily found by other users. For example, if you have a group for surfers, you might tag it: surfing, beach, waves.","grp_url_title":"Choose a unique group name URL:","grp_url_msg":"Enter 3-18 characters with no spaces (such as “skateboarding skates”), that will become part of your group’s web address. Please note, the group name URL you pick is permanent and can’t be changed.","grp_cat_tile":"Group Category:","grp_vdo_uploads":"Video Uploads:","grp_forum_posting":"Forum Posting:","grp_join_opt1":"Public, anyone can join.","grp_join_opt2":"Protected, requires founder approval to join.","grp_join_opt3":"Private, by founder invite only, only members can view group details.","grp_vdo_opt1":"Post videos immediately.","grp_vdo_opt2":"Founder approval required before video is available.","grp_vdo_opt3":"Only Founder can add new videos.","grp_post_opt1":"Post topics immediately.","grp_post_opt2":"Founder approval required before topic is available.","grp_post_opt3":"Only Founder can create a new topic.","grp_crt_grp":"Create Group","grp_thumb_title":"Group Thumb","grp_upl_thumb":"Upload Group Thumb","grp_must_be":"Must Be","grp_90x90":"90 x 90 Ratio Will Give Best Quality","grp_thumb_warn":"Do Not Upload Vulgar or Copyrighted Material","grp_del_confirm":"Are You Sure You Want To Delete This Group","grp_del_success":"You Have Successfully Deleted","grp_click_go_grps":"Click Here To Go To Groups","grp_edit_grp_title":"Edit Group","grp_manage_vdos":"Manage Videos","grp_manage_mems":"Manage Members","grp_del_group_title":"Delete Group","grp_add_vdos_title":"Add Videos","grp_join_grp_title":"Join Group","grp_leave_group_title":"Leave Group","grp_invite_grp_title":"Invite Members","grp_view_mems":"View Members","grp_view_vdos":"View Videos","grp_create_grp_title":"Create A New Group","grp_most_members":"Most Members","grp_most_discussed":"Most Discussed","grp_invite_msg":"Invite Users To This Group","grp_invite_msg1":"Has Invited You To Join","grp_invite_msg2":"Enter Emails or Usernames (seperate by commas)","grp_url_title1":"Group url","grp_invite_msg3":"Send Invitation","grp_join_confirm_msg":"Are You Sure You Want To Join This Group","grp_join_msg_succ":"You have successfully joined group","grp_click_here_to_go":"Click Here To Go To","grp_leave_confirm":"Are You Sure You Want To Leave This Group","grp_leave_succ_msg":"You have left the group","grp_manage_members_title":"Manage Members ","grp_for_approval":"For Approval","grp_rm_videos":"Remove Videos","grp_rm_mems":"Remove Members","grp_groups_title":"Manage Groups","grp_remove_group":"Remove Group","grp_bo_grp_found":"No Group Found","grp_joined_groups":"Joined Groups","grp_owned_groups":"Owned Groups","grp_edit_this_grp":"Edit This Group","grp_topics_title":"Topics","grp_topic_title":"Topic","grp_posts_title":"Posts","grp_discus_title":"Discussions","grp_author_title":"Author","grp_replies_title":"Replies","grp_last_post_title":"Last Post ","grp_viewl_all_videos":"View All Videos of This Group","grp_add_new_topic":"Add New Topic","grp_attach_video":"Attach Video ","grp_add_topic":"Add Topic","grp_please_login":"Please login to post topics","grp_please_join":"Please Join This Group To Post Topics","grp_inactive_account":"Your Account Is Inactive And Requires Activation From The Group Owner","grp_about_this_grp":"About This Group ","grp_no_vdo_err":"This Group Has No Vidoes","grp_posted_by":"Posted by","grp_add_new_comment":"Add New Comment","grp_add_comment":"Add Comment","grp_pls_login_comment":"Please Login To Post Comments","grp_pls_join_comment":"Please Join This Group To Post Comments","usr_activation_title":"User Activation","usr_actiavation_msg":"Enter Your Username and Activation Code that has been sent to your email.","usr_actiavation_msg1":"Request Activation Code","usr_activation_code_tl":"Activation Code","usr_compose_msg":"Compose Message","usr_inbox_title":"Inbox","usr_sent_title":"Sent","usr_to_title":"To: (Enter Username)","usr_or_select_frm_list":"or select from contact list","usr_attach_video":"Attach Video","user_attached_video":"Attached Video","usr_send_message":"Send Message","user_no_message":"No Message","user_delete_message_msg":"Delete This Message","user_forgot_message":"Forgot password","user_forgot_message_2":"Dont Worry, recover it now","user_pass_reset_msg":"Password Reset","user_pass_forgot_msg":"if you have forgot your password, please enter you username and verification code in the box, and password reset instructions will be sent to your mail box.","user_veri_code":"Verification Code","user_reocover_user":"Recover Username","user_user_forgot_msg":"Forgot Username?","user_recover":"Recover","user_reset":"Reset","user_inactive_msg":"Your account is inactive, please activate your account by going to activation page<\/a>","user_dashboard":"Dash Board","user_manage_prof_chnnl":"Manage Profile & Channel","user_manage_friends":"Manage Friends & Contacts","user_prof_channel":"Profile\/Channel","user_message_box":"Message Box","user_new_messages":"New Messages","user_goto_inbox":"Go to Inbox","user_goto_sentbox":"Go to Sent Box","user_compose_new":"Compose New Messages","user_total_subs_users":"Total Subscribed Users","user_you_have":"You Have","user_fav_videos":"Favorite Videos","user_your_vids_watched":"Your Videos Watched","user_times":"Times","user_you_have_watched":"You Have Watched","user_channel_profiles":"Channel & Profile","user_channel_views":"Channel Views","user_channel_comm":"Channel Comments ","user_manage_prof":"Manage Profile \/ Channel","user_you_created":"You Have Created","user_you_joined":"You Have Joined","user_create_group":"Create New Group","user_manage_my_account":"Manage My Account ","user_manage_my_videos":"Manage My Videos","user_manage_my_channel":"Manage My Channel","user_sent_box":"My sent items","user_manage_channel":"Manage Channel","user_manage_my_contacts":"Manage My Contacts","user_manage_contacts":"Manage Contacts","user_manage_favourites":"Manage Favourite Videos","user_mem_login":"Members Login","user_already_have":"Please Login Here if You Already have an account of","user_forgot_username":"Forgot Username","user_forgot_password":"Forgot Password","user_create_your":"Create Your ","user_all_fields_req":"All Fields Are Required","user_valid_email_addr":"Valid Email Address","user_allowed_format":"Letters A-Z or a-z , Numbers 0-9 and Underscores _","user_confirm_pass":"Confirm Password","user_reg_msg_0":"Register as ","user_reg_msg_1":"member, its free and easy just fill out the form below","user_date_of_birth":"Date Of Birth","user_enter_text_as_img":"Enter Text As Seen In The Image","user_refresh_img":"Refresh Image","user_i_agree_to_the":"I Agree to Terms of Service<\/a> and Privacy Policy","user_thanks_for_reg":"Thank You For Registering on ","user_email_has_sent":"An email has been sent to your inbox containing Your Account","user_and_activation":"& Activation","user_details_you_now":"Details. You may now do the following things on our network","user_upload_share_vds":"Upload, Share Videos","user_make_friends":"Make Friends","user_send_messages":"Send Messages","user_grow_your_network":"Grow Your Networks by Inviting more Friends","user_rate_comment":"Rate and Comment Videos","user_make_customize":"Make and Customize Your Channel","user_to_upload_vid":"To Upload Video, You Need to Activate your account first, activation details has been sent to your email account, it may take sometimes to reach your inbox","user_click_to_login":"Click here To Login To Your Account","user_view_my_channel":"View My Channel","user_change_pass":"Change Password","user_email_settings":"Email Settings","user_profile_settings":"Profile Settings","user_usr_prof_chnl_edit":"User Profile & Channel Edit","user_personal_info":"Personal Information","user_fname":"First Name","user_lname":"Last Name","user_gender":"Gender","user_relat_status":"Relationship Status","user_display_age":"Display Age","user_about_me":"About Me","user_website_url":"Website Url","user_eg_website":"e.g www.cafepixie.com","user_prof_info":"Professional Information","user_education":"Education","user_school_colleges":"Schools \/ Colleges","user_occupations":"Occupation(s)","user_companies":"Companies","user_sperate_by_commas":"seperate with commas","user_interests_hobbies":"Interests and Hobbies","user_fav_movs_shows":"Favorite Movies & Shows","user_fav_music":"Favorite Music","user_fav_books":"Favorite Books","user_user_avatar":"User Avatar","user_upload_avatar":"Upload Avatar","user_channel_info":"Channel Info","user_channel_title":"Channel Title","user_channel_description":"Channel Description","user_channel_permission":"Channel Permissions","user_allow_comments_msg":"users can comment","user_dallow_comments_msg":"users cannot comment","user_allow_rating":"Allow Rating","user_dallow_rating":"Do Not Allow Rating","user_allow_rating_msg1":"users can rate","user_dallow_rating_msg1":"users cannot rate","user_channel_feature_vid":"Channel Featured Video","user_select_vid_for_fr":"Select Video To set as Featured","user_chane_channel_bg":"Change Channel Background","user_remove_bg":"Remove Background","user_currently_you_d_have_pic":"Currently You Don’t Have a Background Picture","user_change_email":"Change Email","user_email_address":"Email Address","user_new_email":"New Email","user_notify_me":"Notify Me When User Sends Me A Message","user_old_pass":"Old Password","user_new_pass":"New Password","user_c_new_pass":"Confirm New Password","user_doesnt_exist":"User Doesn’t Exist","user_do_not_have_contact":"User Does Not Have Any Contacts","user_no_fav_video_exist":"User does not have any Favorite Videos selected","user_have_no_vide":"User doesn't have any videos","user_s_channel":"%s’s Channel ","user_last_login":"Last Login","user_send_message":"Send Message","user_add_contact":"Add Contact","user_dob":"DoB","user_movies_shows":"Movies & Shows","user_add_comment":"Add Comment ","user_view_all_comments":"View All Comments","user_no_fr_video":"User Has Not Selected Any Video To Set As Featured","user_view_all_video_of":"View All Videos of ","menu_home":"Home","menu_videos":"Videos","menu_upload":"Upload","menu_signup":"SignUp","menu_account":"Account","menu_groups":"Groups","menu_channels":"Channels","menu_community":"Community","menu_inbox":"Inbox","vdo_cat_err2":"You cannot select more than %d categories","user_subscribe_message":"Hello %subscriber%\nYou Have Subscribed To %user% and therefore this message is sent to you automatically, because %user% Has Uploaded a New Video\n\n%website_title%","user_subscribe_subject":"%user% has uploaded a new video","you_already_logged":"You are already logged in","you_not_logged_in":"You are not logged in","invalid_user":"Invalid User","vdo_cat_err3":"Please select at least 1 category","embed_code_invalid_err":"Invalid video embed code","invalid_duration":"Invalid duration","vid_thumb_changed":"Video default thumb has been changed","vid_thumb_change_err":"Video thumbnail was not found","upload_vid_thumbs_msg":"All video thumbs have been uploaded","video_thumb_delete_msg":"Video thumb has been deleted","video_thumb_delete_err":"Could not delete video thumb","no_comment_del_perm":"You dont have permission to delete this comment","my_text_context":"My test context","user_contains_disallow_err":"Username contains disallowed characters","add_cat_erro":"Category already exists","add_cat_no_name_err":"Please enter a name for the category","cat_default_err":"Default cannot be deleted, please choose another category as “default” and then delete this one","pic_upload_vali_err":"Please upload valid JPG, GIF or PNG image","cat_dir_make_err":"Unable to create the category thumb directory","cat_set_default_ok":"Category has been set as default","vid_thumb_removed_msg":"Video thumbs have been removed","vid_files_removed_msg":"Video files have been removed","vid_log_delete_msg":"Video log has been deleted","vdo_multi_del_erro":"Videos has have been deleted","add_fav_message":"This %s has been added to your favorites","obj_not_exists":"%s does not exist","already_fav_message":"This %s is already added to your favorites","obj_report_msg":"this %s has been reported","obj_report_err":"You have already reported this %s","user_no_exist_wid_username":"‘%s’ does not exist","share_video_no_user_err":"Please enter usernames or emails to send this %s","uploaded":"Uploaded","today":"Today","yesterday":"Yesterday","thisweek":"This Week","lastweek":"Last Week","thismonth":"This Month","lastmonth":"Last Month","thisyear":"This Year","lastyear":"Last Year","favorites":"Favorites","alltime":"All Time","insufficient_privileges_loggin":"You cannot access this page Click Here to Login or Register","profile_title":"Profile Title","show_dob":"Show Date of Birth","profile_tags":"Profile Tags","profile_desc":"Profile Description","online_status":"User Status","show_profile":"Show Profile","allow_ratings":"Allow Profile Ratings","postal_code":"Postal Code","temp_file_load_err":"Unable to load tempalte file ‘%s’ in directory ‘%s’","no_date_provided":"No date provided","second":"second","minute":"minute","bad_date":"Never","users_videos":"%s’s Videos","please_login_subscribe":"Please login to Subsribe %s","users_subscribers":"%s’s Subscribers","user_no_subscribers":"%s has no subsribers","user_subscriptions":"%s’s Subscriptions","user_no_subscriptions":"%s has no subscriptions","usr_avatar_bg_update":"User avatar and background have been updated","user_email_confirm_email_err":"Confirm email mismatched","email_change_msg":"Email has been changed successfully","no_edit_video":"You cannot edit this video","confirm_del_video":"Are you sure you want to delete this video ?","remove_fav_video_confirm":"Are you sure you want to remove this video from your favorites ?","fav_remove_msg":"%s has been removed from your favorites","unknown_favorite":"Unknown favorite %s","vdo_multi_del_fav_msg":"Videos have been removed from your favorites","unknown_sender":"Unknown Sender","please_enter_message":"Please enter something for message","unknown_reciever":"Unknown reciever","no_pm_exist":"Private message does not exist","pm_sent_success":"Private message has been sent successfully","msg_delete_inbox":"Message has been deleted from inbox","msg_delete_outbox":"Message has been deleted from your outbox","private_messags_deleted":"Private messages have been deleted","ban_users":"Ban Users","spe_users_by_comma":"separate usernames by comma","user_ban_msg":"User block list has been updated","no_user_ban_msg":"No user is banned from your account!","thnx_sharing_msg":"Thanks for sharing this %s","no_own_commen_rate":"You cannot rate your own comment","no_comment_exists":"Comment does not exist","thanks_rating_comment":"Thanks for rating comment","please_login_create_playlist":"Please login to creat playlists","play_list_with_this_name_arlready_exists":"Playlist with name ‘%s’ already exists","please_enter_playlist_name":"Please enter playlist name","new_playlist_created":"New playlist has been created","playlist_not_exist":"Playlist does not exist","playlist_item_not_exist":"Playlist item does not exist","playlist_item_delete":"Playlist item has been deleted","play_list_updated":"Playlist has been updated","you_dont_hv_permission_del_playlist":"You do not have permission to delete the playlist","playlist_delete_msg":"Playlist has been deleted","playlist_name":"Playlist Name","add_new_playlist":"Add Playlist","this_thing_added_playlist":"This %s has been added to playlist","this_already_exist_in_pl":"This %s already exists in your playlist","edit_playlist":"Edit Playlist","remove_playlist_item_confirm":"Are you sure you want to remove this from your playlist","remove_playlist_confirm":"Are you sure you want to delete this playlist?","avcode_incorrect":"Activation code is incorrect","group_join_login_err":"Please login in order to join this group","manage_playlist":"Manage playlist","my_notifications":"My notifications","users_contacts":"%s’s contacts","type_flags_removed":"%s flags have been removed","terms_of_serivce":"Terms of services","users":"Users","login_to_mark_as_spam":"Please login to mark as spam","no_own_commen_spam":"You cannot mark your own comment as spam","already_spammed_comment":"You have already marked this comment as spam","spam_comment_ok":"Comment has been marked as spam","arslan_hassan":"Arslan Hassan","you_not_allowed_add_grp_vids":"You are not member of this group so cannot add videos","sel_vids_updated":"Selected videos have been updated","unable_find_download_file":"Unable to find download file","you_cant_edit_group":"You cannot edit this group","you_cant_invite_mems":"You cannot invite members","you_cant_moderate_group":"You cannot moderate this group","page_doesnt_exist":"Page does not exist","pelase_select_img_file_for_vdo":"Please select image file for video thumb","new_mem_added":"New member has been added","this_vdo_not_working":"This video might not work properly","email_template_not_exist":"Email template does not exist","email_subj_empty":"Email subject was empty","email_msg_empty":"Email message was empty","email_tpl_has_updated":"Email Template has been updated","page_name_empty":"Page name was empty","page_title_empty":"Page title was empty","page_content_empty":"Page content was empty","new_page_added_successfully":"New page has been added successfully","page_updated":"Page has been updated","page_deleted":"Page has been deleted successfully","page_activated":"Page has been activated","page_deactivated":"Page has been deactivated","you_cant_delete_this_page":"You cannot delete this page","ad_placement_err4":"Placement does not exist","grp_details_updated":"Group details have been updated","you_cant_del_topic":"You cannot delete this topic","you_cant_del_user_topics":"You cannot delete user topics","topics_deleted":"Topics have been deleted","you_cant_delete_grp_topics":"You cannot delete group topics","you_not_allowed_post_topics":"You are not allowed to post topics","you_cant_add_this_vdo":"You cannot add this video","video_added":"Video has been added","you_cant_del_this_vdo":"You cannot remove this video","video_removed":"Video has been removed","user_not_grp_mem":"User is not group member","user_already_group_mem":"User has already joined this group","invitations_sent":"Invitations have been sent","you_not_grp_mem":"You are not a member of this group","you_cant_delete_this_grp":"You cannot delete this group","grp_deleted":"Group has been deleted","you_cant_del_grp_mems":"You cannot delete group members","mems_deleted":"Members have been deleted","you_cant_del_grp_vdos":"You cannot delete group videos","thnx_for_voting":"Thanks for voting","you_hv_already_rated_vdo":"You have already rated this video","please_login_to_rate":"Please login to rate","you_not_subscribed":"You are not subscribed","you_cant_delete_this_user":"You cannot delete this user”","you_dont_hv_perms":"You don't have sufficient permissions","user_subs_hv_been_removed":"User subscriptions have been removed","user_subsers_hv_removed":"User subscribers have been removed","you_already_sent_frend_request":"You have already sent friend request","friend_added":"Friend has been added","friend_request_sent":"Friend request has been sent","friend_confirm_error":"Either the user has not requested your friend request or you have already confirmed it","friend_confirmed":"Friend has been confirmed","friend_request_not_found":"No friend request found","you_cant_confirm_this_request":"You cannot confirm this request","friend_request_already_confirmed":"Friend request is already confirmed","user_no_in_contact_list":"User is not in your contact list","user_removed_from_contact_list":"User has been removed from your contact list","cant_find_level":"Cannot find level","please_enter_level_name":"Please enter level name","level_updated":"Level has been updated","level_del_sucess":"User level has been deleted, all users of this level has been transfered to %s","level_not_deleteable":"This level is not deletable","pass_mismatched":"Passwords Mismatched","user_blocked":"User has been blocked","user_already_blocked":"User is already blocked","you_cant_del_user":"You cannot block this user","user_vids_hv_deleted":"User videos have been deleted","user_contacts_hv_removed":"User contacts have been removed","all_user_inbox_deleted":"All User inbox messages have been deleted","all_user_sent_messages_deleted":"All user sent messages have been deleted","pelase_enter_something_for_comment":"Please type something in a comment box","please_enter_your_name":"Please enter your name","please_enter_your_email":"Please enter your email","template_activated":"Template has been activated","error_occured_changing_template":"An error occured while changing the template","phrase_code_empty":"Phrase code was empty","phrase_text_empty":"Phrase text was empty","language_does_not_exist":"Language does not exist","name_has_been_added":"%s has been added","name_already_exists":"‘%s’ already exist","lang_doesnt_exist":"language does not exist","no_file_was_selected":"No file was selected","err_reading_file_content":"Error reading file content","cant_find_lang_name":"Cant find language name","cant_find_lang_code":"Cant find language code","no_phrases_found":"No phrases were found","language_already_exists":"Language already exists","lang_added":"Language has been added successfully","error_while_upload_file":"Error occured while uploading language file","default_lang_del_error":"This is the default language, please select another language as “default” and then delete this pack","lang_deleted":"Language pack has been deleted","lang_name_empty":"Language name was empty","lang_code_empty":"Language code was empty","lang_regex_empty":"Language regular expression was empty","lang_code_already_exist":"Language code already exists","lang_updated":"Language has been updated","player_activated":"Player has been activated","error_occured_while_activating_player":"An error occured while activating player","plugin_has_been_s":"Plugin has been %s","plugin_uninstalled":"Plugin has been Uninstalled","perm_code_empty":"Permission code is empty","perm_name_empty":"Permission name is empty","perm_already_exist":"Permission already exists","perm_type_not_valid":"Permission type is not valid","perm_added":"New Permission has been added","perm_deleted":"Permission has been deleted","perm_doesnt_exist":"Permission does not exist","acitvation_html_message":"Please enter your username and activation code in order to activate your account, please check your inbox for the Activation code, if you didn't get one, please request it by filling the next form","acitvation_html_message2":"Please enter your email address to request your activation code","admin_panel":"Admin Panel","moderate_videos":"Moderate Videos","moderate_users":"Moderate Users","revert_back_to_admin":"Revert back to admin","more_options":"More Options","downloading_string":"Downloading %s ...","download_redirect_msg":"click here if you don't redirect automatically<\/a> - Click Here to Go Back to Video Page<\/a>","account_details":"Account Details","profile_details":"Profile Details","update_profile":"Update Profile","please_select_img_file":"Please select image file","or":"or","pelase_enter_image_url":"Please Enter Image URL","user_bg":"Channel Background","user_bg_img":"Channel Background Image","please_enter_bg_color":"Please Enter Background Color","bg_repeat_type":"Background Repeat Type (if using image as a background)","fix_bg":"Fix Background","delete_this_img":"Delete this image","current_email":"Current Email","confirm_new_email":"Confirm New Email","no_subs_found":"No subscriptions found","video_info_all_fields_req":"Video Information - All fields are required","update_group":"Update Group","default":"Default","grp_info_all_fields_req":"Group Information - All Fields Are Required","date_recorded_location":"Date recorded & Location","update_video":"Update Video","click_here_to_recover_user":"Click here to recover username","click_here_reset_pass":"Click here to reset password","remember_me":"Remember Me","howdy_user":"Howdy %s","notifications":"Notifications","playlists":"Playlists","friend_requests":"Friend Requests","after_meny_guest_msg":"Welcome Guest ! Please Login<\/a> or Register<\/a>","being_watched":"Being Watched","change_style_of_listing":"Change Style of Listing","website_members":"%s Members","guest_homeright_msg":"Watch, Upload, Share and more","reg_for_free":"Register for free","rand_vids":"Random Videos","t_10_users":"Top 10 Users","pending":"Pending","confirm":"Confirm","no_contacts":"No Contacts","you_dont_hv_any_grp":"You do not have any groups","leave_groups":"Leave Groups","manage_grp_mems":"Manage Group Members","pending_mems":"Pending Members","active_mems":"Active Members","disapprove":"Disapprove","manage_grp_vids":"Manage Group Videos","pending_vids":"Pending Videos","no_pending_vids":"No Pending Videos","no_active_videos":"No Active Videos","active_videos":"Active Videos","manage_playlists":"Manage Playlists","total_items":"Total Items","play_now":"PLAY NOW","no_video_in_playlist":"This playlist has no video","view":"View","you_dont_hv_fav_vids":"You do not have any favorite videos","private_messages":"Private Messages","new_private_msg":"New private message","search_for_s":"Search For %s","signup_success_usr_ok":"

    Just One More Step<\/h2> \t

    Your are just one step behind from becoming an official memeber of our website. Please check your email, we have sent you a confirmation email which contains a confirmation link from our website, Please click it to complete your registration.<\/p>","signup_success_usr_emailverify":"

    Welcome To our community<\/h2>\r\n \t

    Your email has been confirmed, Please click here to login<\/a><\/strong> and continue as our registered member.<\/p>","if_you_already_hv_account":"if you already have an account, please login here ","signup_message_under_login":"

    Our website is the home for video online:<\/p>\r\n \r\n

    • Watch<\/strong> millions of videos<\/li>
    • Share favorites<\/strong> with friends and family<\/li>\r\n
    • Connect with other users<\/strong> who share your interests<\/li>
    • Upload your videos<\/strong> to a worldwide audience\r\n\r\n<\/li><\/ul>","new_mems_signup_here":"New Members Signup Here","register_as_our_website_member":"Register as a member, it's free and easy just ","video_complete_msg":"

      Video Upload Has Been Completed<\/h2>\r\nThank you! Your upload is complete.<\/span>
      \r\nThis video will be available in
      My Videos<\/strong><\/a> after it has finished processing.<\/span> \r\n

    ";a.utils.setOuterHTML(f,v);t=document.getElementById(f.id)}else{var s=document.createElement("object");s.setAttribute("type","application/x-shockwave-flash");s.setAttribute("data",g.src);s.setAttribute("width","100%");s.setAttribute("height","100%");s.setAttribute("bgcolor","#000000");s.setAttribute("id",f.id);s.setAttribute("name",f.id);s.setAttribute("tabindex",0);m(s,"allowfullscreen","true");m(s,"allowscriptaccess","always");m(s,"seamlesstabbing","true");m(s,"wmode",p);m(s,"flashvars",c(q));f.parentNode.replaceChild(s,f);t=s}j.container=t;j.setPlayer(t,"flash")};this.supportsConfig=function(){if(a.utils.hasFlash()){if(l){var o=a.utils.getFirstPlaylistItemFromConfig(l);if(typeof o.file=="undefined"&&typeof o.levels=="undefined"){return true}else{if(o.file){return flashCanPlay(o.file,o.provider)}else{if(o.levels&&o.levels.length){for(var n=0;n0){j.skin=j.skin.replace(/\.zip/i,".xml")}var l=new (a.html5(c)).setup(j);f.container=document.getElementById(f.id);f.setPlayer(l,"html5")}else{return null}};this.supportsConfig=function(){if(!!a.vid.canPlayType){if(b){var j=a.utils.getFirstPlaylistItemFromConfig(b);if(typeof j.file=="undefined"&&typeof j.levels=="undefined"){return true}else{if(j.file){return html5CanPlay(a.vid,j.file,j.provider,j.playlistfile)}else{if(j.levels&&j.levels.length){for(var h=0;h0){D+=F.length;var J=F.indexOf("playlist"),I=F.indexOf("controlbar");if(J>=0&&I>=0){F[J]=F.splice(I,1,F[J])[0]}o(l,F,true)}}else{if(!(navigator&&navigator.vendor&&navigator.vendor.indexOf("Apple")==0)){o(B,G,true)}}y()}function o(J,G,H){var F=[];for(var E=0;E-1){percentage=parseFloat(x.width.substring(0,x.width.lastIndexOf("%")))/100;E=Math.round(window.innerWidth*percentage)}if(typeof x.height=="string"&&x.height.lastIndexOf("%")>-1){percentage=parseFloat(x.height.substring(0,x.height.lastIndexOf("%")))/100;F=Math.round(window.innerHeight*percentage)}return{position:"absolute",width:(E-d.parseDimension(s.style.left)-d.parseDimension(s.style.right)),height:(F-d.parseDimension(s.style.top)-d.parseDimension(s.style.bottom)),zIndex:H}}function B(E,F){return{position:"fixed",width:x.width,height:x.height,zIndex:F}}function y(){if(!d.exists(x.getMedia())){return}s.style.position="absolute";var H=x.getMedia().getDisplayElement();if(H&&H.tagName.toLowerCase()=="video"){H.style.position="absolute";var E,I;if(s.style.width.toString().lastIndexOf("%")>-1||s.style.width.toString().lastIndexOf("%")>-1){var F=s.getBoundingClientRect();E=Math.abs(F.left)+Math.abs(F.right);I=Math.abs(F.top)+Math.abs(F.bottom)}else{E=d.parseDimension(s.style.width);I=d.parseDimension(s.style.height)}if(H.parentNode){H.parentNode.style.left=s.style.left;H.parentNode.style.top=s.style.top}d.stretch(u.jwGetStretching(),H,E,I,H.videoWidth?H.videoWidth:400,H.videoHeight?H.videoHeight:300)}else{var G=x.plugins.object.display.getDisplayElement();if(G){x.getMedia().resize(d.parseDimension(G.style.width),d.parseDimension(G.style.height))}else{x.getMedia().resize(d.parseDimension(s.style.width),d.parseDimension(s.style.height))}}}function e(F){var G={position:"absolute",margin:0,padding:0,top:null};var E=x.plugins.config[F].currentPosition.toLowerCase();switch(E.toUpperCase()){case b.html5.view.positions.TOP:G.top=d.parseDimension(s.style.top);G.left=d.parseDimension(s.style.left);G.width=g-d.parseDimension(s.style.left)-d.parseDimension(s.style.right);G.height=x.plugins.object[F].height;s.style[E]=d.parseDimension(s.style[E])+x.plugins.object[F].height+"px";s.style.height=d.parseDimension(s.style.height)-G.height+"px";break;case b.html5.view.positions.RIGHT:G.top=d.parseDimension(s.style.top);G.right=d.parseDimension(s.style.right);G.width=x.plugins.object[F].width;G.height=C-d.parseDimension(s.style.top)-d.parseDimension(s.style.bottom);s.style[E]=d.parseDimension(s.style[E])+x.plugins.object[F].width+"px";s.style.width=d.parseDimension(s.style.width)-G.width+"px";break;case b.html5.view.positions.BOTTOM:G.bottom=d.parseDimension(s.style.bottom);G.left=d.parseDimension(s.style.left);G.width=g-d.parseDimension(s.style.left)-d.parseDimension(s.style.right);G.height=x.plugins.object[F].height;s.style[E]=d.parseDimension(s.style[E])+x.plugins.object[F].height+"px";s.style.height=d.parseDimension(s.style.height)-G.height+"px";break;case b.html5.view.positions.LEFT:G.top=d.parseDimension(s.style.top);G.left=d.parseDimension(s.style.left);G.width=x.plugins.object[F].width;G.height=C-d.parseDimension(s.style.top)-d.parseDimension(s.style.bottom);s.style[E]=d.parseDimension(s.style[E])+x.plugins.object[F].width+"px";s.style.width=d.parseDimension(s.style.width)-G.width+"px";break;default:break}return G}this.resize=j;this.fullscreen=function(H){if(navigator&&navigator.vendor&&navigator.vendor.indexOf("Apple")===0){if(x.getMedia().getDisplayElement().webkitSupportsFullscreen){if(H){try{x.getMedia().getDisplayElement().webkitEnterFullscreen()}catch(G){}}else{try{x.getMedia().getDisplayElement().webkitExitFullscreen()}catch(G){}}}}else{if(H){document.onkeydown=h;clearInterval(p);var F=document.body.getBoundingClientRect();x.width=Math.abs(F.left)+Math.abs(F.right);x.height=window.innerHeight;var E={position:"fixed",width:"100%",height:"100%",top:0,left:0,zIndex:2147483000};c(w,E);E.zIndex=1;if(x.getMedia()&&x.getMedia().getDisplayElement()){c(x.getMedia().getDisplayElement(),E)}E.zIndex=2;c(s,E)}else{document.onkeydown="";x.width=g;x.height=C;c(w,{position:"relative",height:x.height,width:x.width,zIndex:0})}j(x.width,x.height)}}};function a(e){return([b.html5.view.positions.TOP,b.html5.view.positions.RIGHT,b.html5.view.positions.BOTTOM,b.html5.view.positions.LEFT].toString().indexOf(e.toUpperCase())>-1)}b.html5.view.positions={TOP:"TOP",RIGHT:"RIGHT",BOTTOM:"BOTTOM",LEFT:"LEFT",OVER:"OVER",NONE:"NONE"}})(jwplayer);(function(a){var b={backgroundcolor:"",margin:10,font:"Arial,sans-serif",fontsize:10,fontcolor:parseInt("000000",16),fontstyle:"normal",fontweight:"bold",buttoncolor:parseInt("ffffff",16),position:a.html5.view.positions.BOTTOM,idlehide:false,layout:{left:{position:"left",elements:[{name:"play",type:"button"},{name:"divider",type:"divider"},{name:"prev",type:"button"},{name:"divider",type:"divider"},{name:"next",type:"button"},{name:"divider",type:"divider"},{name:"elapsed",type:"text"}]},center:{position:"center",elements:[{name:"time",type:"slider"}]},right:{position:"right",elements:[{name:"duration",type:"text"},{name:"blank",type:"button"},{name:"divider",type:"divider"},{name:"mute",type:"button"},{name:"volume",type:"slider"},{name:"divider",type:"divider"},{name:"fullscreen",type:"button"}]}}};_utils=a.utils;_css=_utils.css;_hide=function(c){_css(c,{display:"none"})};_show=function(c){_css(c,{display:"block"})};a.html5.controlbar=function(l,V){var k=l;var D=_utils.extend({},b,k.skin.getComponentSettings("controlbar"),V);if(D.position==a.html5.view.positions.NONE||typeof a.html5.view.positions[D.position]=="undefined"){return}if(_utils.mapLength(k.skin.getComponentLayout("controlbar"))>0){D.layout=k.skin.getComponentLayout("controlbar")}var ac;var P;var ab;var E;var v="none";var g;var j;var ad;var f;var e;var y;var Q={};var p=false;var c={};var Y;var h=false;var o;var d;var S=false;var G=false;var W=new a.html5.eventdispatcher();_utils.extend(this,W);function J(){if(!Y){Y=k.skin.getSkinElement("controlbar","background");if(!Y){Y={width:0,height:0,src:null}}}return Y}function N(){ab=0;E=0;P=0;if(!p){var ak={height:J().height,backgroundColor:D.backgroundcolor};ac=document.createElement("div");ac.id=k.id+"_jwplayer_controlbar";_css(ac,ak)}var aj=(k.skin.getSkinElement("controlbar","capLeft"));var ai=(k.skin.getSkinElement("controlbar","capRight"));if(aj){x("capLeft","left",false,ac)}var al={position:"absolute",height:J().height,left:(aj?aj.width:0),zIndex:0};Z("background",ac,al,"img");if(J().src){Q.background.src=J().src}al.zIndex=1;Z("elements",ac,al);if(ai){x("capRight","right",false,ac)}}this.getDisplayElement=function(){return ac};this.resize=function(ak,ai){_utils.cancelAnimation(ac);document.getElementById(k.id).onmousemove=A;e=ak;y=ai;if(G!=k.jwGetFullscreen()){G=k.jwGetFullscreen();d=undefined}var aj=w();A();I({id:k.id,duration:ad,position:j});u({id:k.id,bufferPercent:f});return aj};this.show=function(){if(h){h=false;_show(ac);T()}};this.hide=function(){if(!h){h=true;_hide(ac);aa()}};function q(){var aj=["timeSlider","volumeSlider","timeSliderRail","volumeSliderRail"];for(var ak in aj){var ai=aj[ak];if(typeof Q[ai]!="undefined"){c[ai]=Q[ai].getBoundingClientRect()}}}function A(ai){if(h){return}if(D.position==a.html5.view.positions.OVER||k.jwGetFullscreen()){clearTimeout(o);switch(k.jwGetState()){case a.api.events.state.PAUSED:case a.api.events.state.IDLE:if(!D.idlehide||_utils.exists(ai)){U()}if(D.idlehide){o=setTimeout(function(){z()},2000)}break;default:if(ai){U()}o=setTimeout(function(){z()},2000);break}}}function z(ai){aa();_utils.cancelAnimation(ac);_utils.fadeTo(ac,0,0.1,1,0)}function U(){T();_utils.cancelAnimation(ac);_utils.fadeTo(ac,1,0,1,0)}function H(ai){return function(){if(S&&d!=ai){d=ai;W.sendEvent(ai,{component:"controlbar",boundingRect:O()})}}}var T=H(a.api.events.JWPLAYER_COMPONENT_SHOW);var aa=H(a.api.events.JWPLAYER_COMPONENT_HIDE);function O(){if(D.position==a.html5.view.positions.OVER||k.jwGetFullscreen()){return _utils.getDimensions(ac)}else{return{x:0,y:0,width:0,height:0}}}function Z(am,al,ak,ai){var aj;if(!p){if(!ai){ai="div"}aj=document.createElement(ai);Q[am]=aj;aj.id=ac.id+"_"+am;al.appendChild(aj)}else{aj=document.getElementById(ac.id+"_"+am)}if(_utils.exists(ak)){_css(aj,ak)}return aj}function M(){ah(D.layout.left);ah(D.layout.right,-1);ah(D.layout.center)}function ah(al,ai){var am=al.position=="right"?"right":"left";var ak=_utils.extend([],al.elements);if(_utils.exists(ai)){ak.reverse()}for(var aj=0;aj0||al.indexOf("divider")===0){var an={height:J().height,position:"absolute",display:"block",top:0};if((al.indexOf("next")===0||al.indexOf("prev")===0)&&k.jwGetPlaylist().length<2){aj=false;an.display="none"}var at;if(al.indexOf("Text")>0){al.innerhtml="00:00";an.font=D.fontsize+"px/"+(J().height+1)+"px "+D.font;an.color=D.fontcolor;an.textAlign="center";an.fontWeight=D.fontweight;an.fontStyle=D.fontstyle;an.cursor="default";at=14+3*D.fontsize}else{if(al.indexOf("divider")===0){if(ai){if(!isNaN(parseInt(ai))){at=parseInt(ai)}}else{if(ak){var ap=k.skin.getSkinElement("controlbar",ak);if(ap){an.background="url("+ap.src+") repeat-x center left";at=ap.width}}else{an.background="url("+k.skin.getSkinElement("controlbar","divider").src+") repeat-x center left";at=k.skin.getSkinElement("controlbar","divider").width}}}else{an.background="url("+k.skin.getSkinElement("controlbar",al).src+") repeat-x center left";at=k.skin.getSkinElement("controlbar",al).width}}if(ao=="left"){an.left=isNaN(am)?ab:am;if(aj){ab+=at}}else{if(ao=="right"){an.right=isNaN(am)?E:am;if(aj){E+=at}}}if(_utils.typeOf(ar)=="undefined"){ar=Q.elements}an.width=at;if(p){_css(Q[al],an)}else{var aq=Z(al,ar,an);if(_utils.exists(k.skin.getSkinElement("controlbar",al+"Over"))){aq.onmouseover=function(au){aq.style.backgroundImage=["url(",k.skin.getSkinElement("controlbar",al+"Over").src,")"].join("")};aq.onmouseout=function(au){aq.style.backgroundImage=["url(",k.skin.getSkinElement("controlbar",al).src,")"].join("")}}}}}function F(){k.jwAddEventListener(a.api.events.JWPLAYER_PLAYLIST_LOADED,B);k.jwAddEventListener(a.api.events.JWPLAYER_PLAYLIST_ITEM,s);k.jwAddEventListener(a.api.events.JWPLAYER_MEDIA_BUFFER,u);k.jwAddEventListener(a.api.events.JWPLAYER_PLAYER_STATE,r);k.jwAddEventListener(a.api.events.JWPLAYER_MEDIA_TIME,I);k.jwAddEventListener(a.api.events.JWPLAYER_MEDIA_MUTE,ag);k.jwAddEventListener(a.api.events.JWPLAYER_MEDIA_VOLUME,m);k.jwAddEventListener(a.api.events.JWPLAYER_MEDIA_COMPLETE,L)}function B(){N();M();w();ae()}function s(ai){ad=k.jwGetPlaylist()[ai.index].duration;I({id:k.id,duration:ad,position:0});u({id:k.id,bufferProgress:0})}function ae(){I({id:k.id,duration:k.jwGetDuration(),position:0});u({id:k.id,bufferProgress:0});ag({id:k.id,mute:k.jwGetMute()});r({id:k.id,newstate:a.api.events.state.IDLE});m({id:k.id,volume:k.jwGetVolume()})}function R(ak,al,aj){if(p){return}if(_utils.exists(k.skin.getSkinElement("controlbar",ak))){var ai=Q[ak];if(_utils.exists(ai)){_css(ai,{cursor:"pointer"});if(al=="fullscreen"){ai.onmouseup=function(am){am.stopPropagation();k.jwSetFullscreen(!k.jwGetFullscreen())}}else{ai.onmouseup=function(am){am.stopPropagation();if(_utils.exists(aj)){k[al](aj)}else{k[al]()}}}}}}function X(ai){if(p){return}var aj=Q[ai+"Slider"];_css(Q.elements,{cursor:"pointer"});_css(aj,{cursor:"pointer"});aj.onmousedown=function(ak){v=ai};aj.onmouseup=function(ak){ak.stopPropagation();af(ak.pageX)};aj.onmousemove=function(ak){if(v=="time"){g=true;var al=ak.pageX-c[ai+"Slider"].left-window.pageXOffset;_css(Q.timeSliderThumb,{left:al})}}}function af(aj){g=false;var ai;if(v=="time"){ai=aj-c.timeSliderRail.left+window.pageXOffset;var al=ai/c.timeSliderRail.width*ad;if(al<0){al=0}else{if(al>ad){al=ad-3}}if(k.jwGetState()==a.api.events.state.PAUSED||k.jwGetState()==a.api.events.state.IDLE){k.jwPlay()}k.jwSeek(al)}else{if(v=="volume"){ai=aj-c.volumeSliderRail.left-window.pageXOffset;var ak=Math.round(ai/c.volumeSliderRail.width*100);if(ak<0){ak=0}else{if(ak>100){ak=100}}if(k.jwGetMute()){k.jwSetMute(false)}k.jwSetVolume(ak)}}v="none"}function u(aj){if(_utils.exists(aj.bufferPercent)){f=aj.bufferPercent}if(c.timeSliderRail){var ak=c.timeSliderRail.width;var ai=isNaN(Math.round(ak*f/100))?0:Math.round(ak*f/100);_css(Q.timeSliderBuffer,{width:ai})}}function ag(ai){if(ai.mute){_hide(Q.muteButton);_show(Q.unmuteButton);_hide(Q.volumeSliderProgress)}else{_show(Q.muteButton);_hide(Q.unmuteButton);_show(Q.volumeSliderProgress)}}function r(ai){if(ai.newstate==a.api.events.state.BUFFERING||ai.newstate==a.api.events.state.PLAYING){_show(Q.pauseButton);_hide(Q.playButton)}else{_hide(Q.pauseButton);_show(Q.playButton)}A();if(ai.newstate==a.api.events.state.IDLE){_hide(Q.timeSliderBuffer);_hide(Q.timeSliderProgress);_hide(Q.timeSliderThumb);I({id:k.id,duration:k.jwGetDuration(),position:0})}else{_show(Q.timeSliderBuffer);if(ai.newstate!=a.api.events.state.BUFFERING){_show(Q.timeSliderProgress);_show(Q.timeSliderThumb)}}}function L(ai){u({bufferPercent:0});I(_utils.extend(ai,{position:0,duration:ad}))}function I(al){if(_utils.exists(al.position)){j=al.position}if(_utils.exists(al.duration)){ad=al.duration}var aj=(j===ad===0)?0:j/ad;var am=c.timeSliderRail;if(am){var ai=isNaN(Math.round(am.width*aj))?0:Math.round(am.width*aj);var ak=ai;if(Q.timeSliderProgress){Q.timeSliderProgress.style.width=ai+"px";if(!g){if(Q.timeSliderThumb){Q.timeSliderThumb.style.left=ak+"px"}}}}if(Q.durationText){Q.durationText.innerHTML=_utils.timeFormat(ad)}if(Q.elapsedText){Q.elapsedText.innerHTML=_utils.timeFormat(j)}}function n(){var am,aj;var ak=document.getElementById(ac.id+"_elements");if(!ak){return}var al=ak.childNodes;for(var ai in ak.childNodes){if(isNaN(parseInt(ai,10))){continue}if(al[ai].id.indexOf(ac.id+"_divider")===0&&aj&&aj.id.indexOf(ac.id+"_divider")===0&&al[ai].style.backgroundImage==aj.style.backgroundImage){al[ai].style.display="none"}else{if(al[ai].id.indexOf(ac.id+"_divider")===0&&am&&am.style.display!="none"){al[ai].style.display="block"}}if(al[ai].style.display!="none"){aj=al[ai]}am=al[ai]}}function w(){n();if(k.jwGetFullscreen()){_show(Q.normalscreenButton);_hide(Q.fullscreenButton)}else{_hide(Q.normalscreenButton);_show(Q.fullscreenButton)}var aj={width:e};var ai={};if(D.position==a.html5.view.positions.OVER||k.jwGetFullscreen()){aj.left=D.margin;aj.width-=2*D.margin;aj.top=y-J().height-D.margin;aj.height=J().height}var al=k.skin.getSkinElement("controlbar","capLeft");var ak=k.skin.getSkinElement("controlbar","capRight");ai.left=al?al.width:0;ai.width=aj.width-ai.left-(ak?ak.width:0);var am=!_utils.exists(k.skin.getSkinElement("controlbar","timeSliderCapLeft"))?0:k.skin.getSkinElement("controlbar","timeSliderCapLeft").width;_css(Q.timeSliderRail,{width:(ai.width-ab-E),left:am});if(_utils.exists(Q.timeSliderCapRight)){_css(Q.timeSliderCapRight,{left:am+(ai.width-ab-E)})}_css(ac,aj);_css(Q.elements,ai);_css(Q.background,ai);q();return aj}function m(am){if(_utils.exists(Q.volumeSliderRail)){var ak=isNaN(am.volume/100)?1:am.volume/100;var al=_utils.parseDimension(Q.volumeSliderRail.style.width);var ai=isNaN(Math.round(al*ak))?0:Math.round(al*ak);var an=_utils.parseDimension(Q.volumeSliderRail.style.right);var aj=(!_utils.exists(k.skin.getSkinElement("controlbar","volumeSliderCapLeft")))?0:k.skin.getSkinElement("controlbar","volumeSliderCapLeft").width;_css(Q.volumeSliderProgress,{width:ai,left:aj});if(_utils.exists(Q.volumeSliderCapLeft)){_css(Q.volumeSliderCapLeft,{left:0})}}}function t(){N();M();q();p=true;F();D.idlehide=(D.idlehide.toString().toLowerCase()=="true");if(D.position==a.html5.view.positions.OVER&&D.idlehide){ac.style.opacity=0;S=true}else{setTimeout((function(){S=true;T()}),1)}ae()}t();return this}})(jwplayer);(function(b){var a=["width","height","state","playlist","item","position","buffer","duration","volume","mute","fullscreen"];var c=b.utils;b.html5.controller=function(z,w,h,v){var C=z;var G=h;var g=v;var o=w;var J=true;var e=-1;var A=c.exists(G.config.debug)&&(G.config.debug.toString().toLowerCase()=="console");var m=new b.html5.eventdispatcher(o.id,A);c.extend(this,m);var E=[];var d=false;function r(M){if(d){m.sendEvent(M.type,M)}else{E.push(M)}}function K(M){if(!d){m.sendEvent(b.api.events.JWPLAYER_READY,M);if(b.utils.exists(window.playerReady)){playerReady(M)}if(b.utils.exists(window[h.config.playerReady])){window[h.config.playerReady](M)}while(E.length>0){var O=E.shift();m.sendEvent(O.type,O)}if(h.config.autostart&&!b.utils.isIOS()){t(G.item)}while(p.length>0){var N=p.shift();x(N.method,N.arguments)}d=true}}G.addGlobalListener(r);G.addEventListener(b.api.events.JWPLAYER_MEDIA_BUFFER_FULL,function(){G.getMedia().play()});G.addEventListener(b.api.events.JWPLAYER_MEDIA_TIME,function(M){if(M.position>=G.playlist[G.item].start&&e>=0){G.playlist[G.item].start=e;e=-1}});G.addEventListener(b.api.events.JWPLAYER_MEDIA_COMPLETE,function(M){setTimeout(s,25)});function u(){try{f(G.item);if(G.playlist[G.item].levels[0].file.length>0){if(J||G.state==b.api.events.state.IDLE){G.getMedia().load(G.playlist[G.item]);J=false}else{if(G.state==b.api.events.state.PAUSED){G.getMedia().play()}}}return true}catch(M){m.sendEvent(b.api.events.JWPLAYER_ERROR,M)}return false}function I(){try{if(G.playlist[G.item].levels[0].file.length>0){switch(G.state){case b.api.events.state.PLAYING:case b.api.events.state.BUFFERING:G.getMedia().pause();break}}return true}catch(M){m.sendEvent(b.api.events.JWPLAYER_ERROR,M)}return false}function D(M){try{if(G.playlist[G.item].levels[0].file.length>0){if(typeof M!="number"){M=parseFloat(M)}switch(G.state){case b.api.events.state.IDLE:if(e<0){e=G.playlist[G.item].start;G.playlist[G.item].start=M}u();break;case b.api.events.state.PLAYING:case b.api.events.state.PAUSED:case b.api.events.state.BUFFERING:G.seek(M);break}}return true}catch(N){m.sendEvent(b.api.events.JWPLAYER_ERROR,N)}return false}function n(M){if(!c.exists(M)){M=true}try{G.getMedia().stop(M);return true}catch(N){m.sendEvent(b.api.events.JWPLAYER_ERROR,N)}return false}function k(){try{if(G.playlist[G.item].levels[0].file.length>0){if(G.config.shuffle){f(y())}else{if(G.item+1==G.playlist.length){f(0)}else{f(G.item+1)}}}if(G.state!=b.api.events.state.IDLE){var N=G.state;G.state=b.api.events.state.IDLE;m.sendEvent(b.api.events.JWPLAYER_PLAYER_STATE,{oldstate:N,newstate:b.api.events.state.IDLE})}u();return true}catch(M){m.sendEvent(b.api.events.JWPLAYER_ERROR,M)}return false}function j(){try{if(G.playlist[G.item].levels[0].file.length>0){if(G.config.shuffle){f(y())}else{if(G.item===0){f(G.playlist.length-1)}else{f(G.item-1)}}}if(G.state!=b.api.events.state.IDLE){var N=G.state;G.state=b.api.events.state.IDLE;m.sendEvent(b.api.events.JWPLAYER_PLAYER_STATE,{oldstate:N,newstate:b.api.events.state.IDLE})}u();return true}catch(M){m.sendEvent(b.api.events.JWPLAYER_ERROR,M)}return false}function y(){var M=null;if(G.playlist.length>1){while(!c.exists(M)){M=Math.floor(Math.random()*G.playlist.length);if(M==G.item){M=null}}}else{M=0}return M}function t(N){if(!G.playlist||!G.playlist[N]){return false}try{if(G.playlist[N].levels[0].file.length>0){var O=G.state;if(O!==b.api.events.state.IDLE){if(G.playlist[G.item].provider==G.playlist[N].provider){n(false)}else{n()}}f(N);u()}return true}catch(M){m.sendEvent(b.api.events.JWPLAYER_ERROR,M)}return false}function f(M){if(!G.playlist[M]){return}G.setActiveMediaProvider(G.playlist[M]);if(G.item!=M){G.item=M;J=true;m.sendEvent(b.api.events.JWPLAYER_PLAYLIST_ITEM,{index:M})}}function H(N){try{f(G.item);var O=G.getMedia();switch(typeof(N)){case"number":O.volume(N);break;case"string":O.volume(parseInt(N,10));break}return true}catch(M){m.sendEvent(b.api.events.JWPLAYER_ERROR,M)}return false}function q(N){try{f(G.item);var O=G.getMedia();if(typeof N=="undefined"){O.mute(!G.mute)}else{if(N.toString().toLowerCase()=="true"){O.mute(true)}else{O.mute(false)}}return true}catch(M){m.sendEvent(b.api.events.JWPLAYER_ERROR,M)}return false}function l(N,M){try{G.width=N;G.height=M;g.resize(N,M);m.sendEvent(b.api.events.JWPLAYER_RESIZE,{width:G.width,height:G.height});return true}catch(O){m.sendEvent(b.api.events.JWPLAYER_ERROR,O)}return false}function B(N){try{if(typeof N=="undefined"){G.fullscreen=!G.fullscreen;g.fullscreen(!G.fullscreen)}else{if(N.toString().toLowerCase()=="true"){G.fullscreen=true;g.fullscreen(true)}else{G.fullscreen=false;g.fullscreen(false)}}m.sendEvent(b.api.events.JWPLAYER_RESIZE,{width:G.width,height:G.height});m.sendEvent(b.api.events.JWPLAYER_FULLSCREEN,{fullscreen:N});return true}catch(M){m.sendEvent(b.api.events.JWPLAYER_ERROR,M)}return false}function L(M){try{n();G.loadPlaylist(M);f(G.item);return true}catch(N){m.sendEvent(b.api.events.JWPLAYER_ERROR,N)}return false}b.html5.controller.repeatoptions={LIST:"LIST",ALWAYS:"ALWAYS",SINGLE:"SINGLE",NONE:"NONE"};function s(){switch(G.config.repeat.toUpperCase()){case b.html5.controller.repeatoptions.SINGLE:u();break;case b.html5.controller.repeatoptions.ALWAYS:if(G.item==G.playlist.length-1&&!G.config.shuffle){t(0)}else{k()}break;case b.html5.controller.repeatoptions.LIST:if(G.item==G.playlist.length-1&&!G.config.shuffle){n();f(0)}else{k()}break;default:n();break}}var p=[];function F(M){return function(){if(d){x(M,arguments)}else{p.push({method:M,arguments:arguments})}}}function x(O,N){var M=[];for(i=0;i';this.xml=null;if(window.DOMParser){parser=new DOMParser();this.xml=parser.parseFromString(this.text,"text/xml")}else{this.xml=new ActiveXObject("Microsoft.XMLDOM");this.xml.async="false";this.xml.loadXML(this.text)}return this}})(jwplayer);(function(a){_utils=a.utils;_css=_utils.css;_hide=function(b){_css(b,{display:"none"})};_show=function(b){_css(b,{display:"block"})};a.html5.display=function(k,G){var j={icons:true,showmute:false};var Q=_utils.extend({},j,G);var h=k;var P={};var e;var u;var w;var N;var s;var I;var A;var J=!_utils.exists(h.skin.getComponentSettings("display").bufferrotation)?15:parseInt(h.skin.getComponentSettings("display").bufferrotation,10);var q=!_utils.exists(h.skin.getComponentSettings("display").bufferinterval)?100:parseInt(h.skin.getComponentSettings("display").bufferinterval,10);var z=-1;var t="";var K=true;var d;var g=false;var n=false;var H=new a.html5.eventdispatcher();_utils.extend(this,H);var D={display:{style:{cursor:"pointer",top:0,left:0,overflow:"hidden"},click:m},display_icon:{style:{cursor:"pointer",position:"absolute",top:((h.skin.getSkinElement("display","background").height-h.skin.getSkinElement("display","playIcon").height)/2),left:((h.skin.getSkinElement("display","background").width-h.skin.getSkinElement("display","playIcon").width)/2),border:0,margin:0,padding:0,zIndex:3,display:"none"}},display_iconBackground:{style:{cursor:"pointer",position:"absolute",top:((u-h.skin.getSkinElement("display","background").height)/2),left:((e-h.skin.getSkinElement("display","background").width)/2),border:0,backgroundImage:(["url(",h.skin.getSkinElement("display","background").src,")"]).join(""),width:h.skin.getSkinElement("display","background").width,height:h.skin.getSkinElement("display","background").height,margin:0,padding:0,zIndex:2,display:"none"}},display_image:{style:{display:"none",width:e,height:u,position:"absolute",cursor:"pointer",left:0,top:0,margin:0,padding:0,textDecoration:"none",zIndex:1}},display_text:{style:{zIndex:4,position:"relative",opacity:0.8,backgroundColor:parseInt("000000",16),color:parseInt("ffffff",16),textAlign:"center",fontFamily:"Arial,sans-serif",padding:"0 5px",fontSize:14}}};h.jwAddEventListener(a.api.events.JWPLAYER_PLAYER_STATE,p);h.jwAddEventListener(a.api.events.JWPLAYER_MEDIA_MUTE,p);h.jwAddEventListener(a.api.events.JWPLAYER_PLAYLIST_ITEM,p);h.jwAddEventListener(a.api.events.JWPLAYER_ERROR,o);L();function L(){P.display=C("div","display");P.display_text=C("div","display_text");P.display.appendChild(P.display_text);P.display_image=C("img","display_image");P.display_image.onerror=function(R){_hide(P.display_image)};P.display_image.onload=y;P.display_icon=C("div","display_icon");P.display_iconBackground=C("div","display_iconBackground");P.display.appendChild(P.display_image);P.display_iconBackground.appendChild(P.display_icon);P.display.appendChild(P.display_iconBackground);f();setTimeout((function(){n=true;if(Q.icons.toString()=="true"){F()}}),1)}this.getDisplayElement=function(){return P.display};this.resize=function(S,R){_css(P.display,{width:S,height:R});_css(P.display_text,{width:(S-10),top:((R-P.display_text.getBoundingClientRect().height)/2)});_css(P.display_iconBackground,{top:((R-h.skin.getSkinElement("display","background").height)/2),left:((S-h.skin.getSkinElement("display","background").width)/2)});if(e!=S||u!=R){e=S;u=R;d=undefined;F()}c();p({})};this.show=function(){if(g){g=false;r(h.jwGetState())}};this.hide=function(){if(!g){B();g=true}};function y(R){w=P.display_image.naturalWidth;N=P.display_image.naturalHeight;c()}function c(){_utils.stretch(h.jwGetStretching(),P.display_image,e,u,w,N)}function C(R,T){var S=document.createElement(R);S.id=h.id+"_jwplayer_"+T;_css(S,D[T].style);return S}function f(){for(var R in P){if(_utils.exists(D[R].click)){P[R].onclick=D[R].click}}}function m(R){if(typeof R.preventDefault!="undefined"){R.preventDefault()}else{R.returnValue=false}if(h.jwGetState()!=a.api.events.state.PLAYING){h.jwPlay()}else{h.jwPause()}}function O(R){if(A){B();return}P.display_icon.style.backgroundImage=(["url(",h.skin.getSkinElement("display",R).src,")"]).join("");_css(P.display_icon,{width:h.skin.getSkinElement("display",R).width,height:h.skin.getSkinElement("display",R).height,top:(h.skin.getSkinElement("display","background").height-h.skin.getSkinElement("display",R).height)/2,left:(h.skin.getSkinElement("display","background").width-h.skin.getSkinElement("display",R).width)/2});b();if(_utils.exists(h.skin.getSkinElement("display",R+"Over"))){P.display_icon.onmouseover=function(S){P.display_icon.style.backgroundImage=["url(",h.skin.getSkinElement("display",R+"Over").src,")"].join("")};P.display_icon.onmouseout=function(S){P.display_icon.style.backgroundImage=["url(",h.skin.getSkinElement("display",R).src,")"].join("")}}else{P.display_icon.onmouseover=null;P.display_icon.onmouseout=null}}function B(){if(Q.icons.toString()=="true"){_hide(P.display_icon);_hide(P.display_iconBackground);M()}}function b(){if(!g&&Q.icons.toString()=="true"){_show(P.display_icon);_show(P.display_iconBackground);F()}}function o(R){A=true;B();P.display_text.innerHTML=R.error;_show(P.display_text);P.display_text.style.top=((u-P.display_text.getBoundingClientRect().height)/2)+"px"}function E(){P.display_image.style.display="none"}function p(R){if((R.type==a.api.events.JWPLAYER_PLAYER_STATE||R.type==a.api.events.JWPLAYER_PLAYLIST_ITEM)&&A){A=false;_hide(P.display_text)}var S=h.jwGetState();if(S==t){return}t=S;if(z>=0){clearTimeout(z)}if(K||h.jwGetState()==a.api.events.state.PLAYING||h.jwGetState()==a.api.events.state.PAUSED){r(h.jwGetState())}else{z=setTimeout(l(h.jwGetState()),500)}}function l(R){return(function(){r(R)})}function r(R){if(_utils.exists(I)){clearInterval(I);I=null;_utils.animations.rotate(P.display_icon,0)}switch(R){case a.api.events.state.BUFFERING:if(_utils.isIOS()){E();B()}else{if(h.jwGetPlaylist()[h.jwGetItem()].provider=="sound"){v()}s=0;I=setInterval(function(){s+=J;_utils.animations.rotate(P.display_icon,s%360)},q);O("bufferIcon");K=true}break;case a.api.events.state.PAUSED:if(!_utils.isIOS()){if(h.jwGetPlaylist()[h.jwGetItem()].provider!="sound"){_css(P.display_image,{background:"transparent no-repeat center center"})}O("playIcon");K=true}break;case a.api.events.state.IDLE:if(h.jwGetPlaylist()[h.jwGetItem()]&&h.jwGetPlaylist()[h.jwGetItem()].image){v()}else{E()}O("playIcon");K=true;break;default:if(h.jwGetPlaylist()[h.jwGetItem()]&&h.jwGetPlaylist()[h.jwGetItem()].provider=="sound"){if(_utils.isIOS()){E();K=false}else{v()}}else{E();K=false}if(h.jwGetMute()&&Q.showmute){O("muteIcon")}else{B()}break}z=-1}function v(){if(h.jwGetPlaylist()[h.jwGetItem()]&&h.jwGetPlaylist()[h.jwGetItem()].image){_css(P.display_image,{display:"block"});P.display_image.src=_utils.getAbsolutePath(h.jwGetPlaylist()[h.jwGetItem()].image)}}function x(R){return function(){if(!n){return}if(!g&&d!=R){d=R;H.sendEvent(R,{component:"display",boundingRect:_utils.getDimensions(P.display_iconBackground)})}}}var F=x(a.api.events.JWPLAYER_COMPONENT_SHOW);var M=x(a.api.events.JWPLAYER_COMPONENT_HIDE);return this}})(jwplayer);(function(a){_css=a.utils.css;a.html5.dock=function(p,u){function q(){return{align:a.html5.view.positions.RIGHT}}var k=a.utils.extend({},q(),u);if(k.align=="FALSE"){return}var f={};var s=[];var g;var v;var d=false;var t=false;var e={x:0,y:0,width:0,height:0};var r;var j=new a.html5.eventdispatcher();_utils.extend(this,j);var m=document.createElement("div");m.id=p.id+"_jwplayer_dock";p.jwAddEventListener(a.api.events.JWPLAYER_PLAYER_STATE,l);this.getDisplayElement=function(){return m};this.setButton=function(A,x,y,z){if(!x&&f[A]){a.utils.arrays.remove(s,A);m.removeChild(f[A].div);delete f[A]}else{if(x){if(!f[A]){f[A]={}}f[A].handler=x;f[A].outGraphic=y;f[A].overGraphic=z;if(!f[A].div){s.push(A);f[A].div=document.createElement("div");f[A].div.style.position="relative";m.appendChild(f[A].div);f[A].div.appendChild(document.createElement("img"));f[A].div.childNodes[0].style.position="absolute";f[A].div.childNodes[0].style.left=0;f[A].div.childNodes[0].style.top=0;f[A].div.childNodes[0].style.zIndex=10;f[A].div.childNodes[0].style.cursor="pointer";f[A].div.appendChild(document.createElement("img"));f[A].div.childNodes[1].style.position="absolute";f[A].div.childNodes[1].style.left=0;f[A].div.childNodes[1].style.top=0;if(p.skin.getSkinElement("dock","button")){f[A].div.childNodes[1].src=p.skin.getSkinElement("dock","button").src}f[A].div.childNodes[1].style.zIndex=9;f[A].div.childNodes[1].style.cursor="pointer";f[A].div.onmouseover=function(){if(f[A].overGraphic){f[A].div.childNodes[0].src=f[A].overGraphic}if(p.skin.getSkinElement("dock","buttonOver")){f[A].div.childNodes[1].src=p.skin.getSkinElement("dock","buttonOver").src}};f[A].div.onmouseout=function(){if(f[A].outGraphic){f[A].div.childNodes[0].src=f[A].outGraphic}if(p.skin.getSkinElement("dock","button")){f[A].div.childNodes[1].src=p.skin.getSkinElement("dock","button").src}};if(f[A].overGraphic){f[A].div.childNodes[0].src=f[A].overGraphic}if(f[A].outGraphic){f[A].div.childNodes[0].src=f[A].outGraphic}if(p.skin.getSkinElement("dock","button")){f[A].div.childNodes[1].src=p.skin.getSkinElement("dock","button").src}}if(x){f[A].div.onclick=function(B){B.preventDefault();a(p.id).callback(A);if(f[A].overGraphic){f[A].div.childNodes[0].src=f[A].overGraphic}if(p.skin.getSkinElement("dock","button")){f[A].div.childNodes[1].src=p.skin.getSkinElement("dock","button").src}}}}}h(g,v)};function h(x,J){if(s.length>0){var y=10;var I=y;var F=-1;var G=p.skin.getSkinElement("dock","button").height;var E=p.skin.getSkinElement("dock","button").width;var C=x-E-y;var H,B;if(k.align==a.html5.view.positions.LEFT){F=1;C=y}for(var z=0;z((K+1)*J)){I=((K+1)*J)+y;K=Math.floor(I/J)}var A=f[s[z]].div;A.style.top=(I%J)+"px";A.style.left=(C+(p.skin.getSkinElement("dock","button").width+y)*K*F)+"px";var D={x:a.utils.parseDimension(A.style.left),y:a.utils.parseDimension(A.style.top),width:E,height:G};if(!H||(D.x<=H.x&&D.y<=H.y)){H=D}if(!B||(D.x>=B.x&&D.y>=B.y)){B=D}I+=p.skin.getSkinElement("dock","button").height+y}e={x:H.x,y:H.y,width:B.x-H.x+B.width,height:H.y-B.y+B.height}}if(t!=p.jwGetFullscreen()||g!=x||v!=J){g=x;v=J;t=p.jwGetFullscreen();r=undefined;setTimeout(n,1)}}function b(x){return function(){if(!d&&r!=x&&s.length>0){r=x;j.sendEvent(x,{component:"dock",boundingRect:e})}}}function l(x){if(a.utils.isIOS()){switch(x.newstate){case a.api.events.state.IDLE:o();break;default:c();break}}}var n=b(a.api.events.JWPLAYER_COMPONENT_SHOW);var w=b(a.api.events.JWPLAYER_COMPONENT_HIDE);this.resize=h;var o=function(){_css(m,{display:"block"});if(d){d=false;n()}};var c=function(){_css(m,{display:"none"});if(!d){w();d=true}};this.hide=c;this.show=o;return this}})(jwplayer);(function(a){a.html5.eventdispatcher=function(d,b){var c=new a.events.eventdispatcher(b);a.utils.extend(this,c);this.sendEvent=function(e,f){if(!a.utils.exists(f)){f={}}a.utils.extend(f,{id:d,version:a.version,type:e});c.sendEvent(e,f)}}})(jwplayer);(function(a){var b={prefix:"",file:"",link:"",margin:8,out:0.5,over:1,timeout:5,hide:true,position:"bottom-left"};_css=a.utils.css;a.html5.logo=function(n,r){var q=n;var u;var d;var t;var h=false;g();function g(){o();c();l()}function o(){if(b.prefix){var v=n.version.split(/\W/).splice(0,2).join("/");if(b.prefix.indexOf(v)<0){b.prefix+=v+"/"}}if(r.position==a.html5.view.positions.OVER){r.position=b.position}d=a.utils.extend({},b,r)}function c(){t=document.createElement("img");t.id=q.id+"_jwplayer_logo";t.style.display="none";t.onload=function(v){_css(t,k());q.jwAddEventListener(a.api.events.JWPLAYER_PLAYER_STATE,j);p()};if(!d.file){return}if(d.file.indexOf("http://")===0){t.src=d.file}else{t.src=d.prefix+d.file}}if(!d.file){return}this.resize=function(w,v){};this.getDisplayElement=function(){return t};function l(){if(d.link){t.onmouseover=f;t.onmouseout=p;t.onclick=s}else{this.mouseEnabled=false}}function s(v){if(typeof v!="undefined"){v.stopPropagation()}if(!h){return}q.jwPause();q.jwSetFullscreen(false);if(d.link){window.open(d.link,"_top")}return}function p(v){if(d.link&&h){t.style.opacity=d.out}return}function f(v){if(d.hide.toString()=="true"&&h){t.style.opacity=d.over}return}function k(){var x={textDecoration:"none",position:"absolute",cursor:"pointer"};x.display=(d.hide.toString()=="true")?"none":"block";var w=d.position.toLowerCase().split("-");for(var v in w){x[w[v]]=d.margin}return x}function m(){if(d.hide.toString()=="true"){t.style.display="block";t.style.opacity=0;a.utils.fadeTo(t,d.out,0.1,parseFloat(t.style.opacity));u=setTimeout(function(){e()},d.timeout*1000)}h=true}function e(){h=false;if(d.hide.toString()=="true"){a.utils.fadeTo(t,0,0.1,parseFloat(t.style.opacity))}}function j(v){if(v.newstate==a.api.events.state.BUFFERING){clearTimeout(u);m()}}return this}})(jwplayer);(function(a){var c={ended:a.api.events.state.IDLE,playing:a.api.events.state.PLAYING,pause:a.api.events.state.PAUSED,buffering:a.api.events.state.BUFFERING};var e=a.utils;var b=e.css;var d=e.isIOS();a.html5.mediavideo=function(h,s){var r={abort:n,canplay:k,canplaythrough:k,durationchange:G,emptied:n,ended:k,error:u,loadeddata:G,loadedmetadata:G,loadstart:k,pause:k,play:n,playing:k,progress:v,ratechange:n,seeked:k,seeking:k,stalled:k,suspend:k,timeupdate:D,volumechange:n,waiting:k,canshowcurrentframe:n,dataunavailable:n,empty:n,load:z,loadedfirstframe:n};var j=new a.html5.eventdispatcher();e.extend(this,j);var y=h,l=s,m,B,A,x,f,H=false,C,p,q;o();this.load=function(J,K){if(typeof K=="undefined"){K=true}x=J;e.empty(m);q=0;if(J.levels&&J.levels.length>0){if(J.levels.length==1){m.src=J.levels[0].file}else{if(m.src){m.removeAttribute("src")}for(var I=0;I0)){var I=m.buffered.length-1;if(I>=0){J=m.buffered.end(I)/m.duration*100}}}if(p===false&&B==a.api.events.state.BUFFERING){j.sendEvent(a.api.events.JWPLAYER_MEDIA_BUFFER_FULL);p=true}if(!C){if(J==100){C=true}if(e.exists(J)&&(J>y.buffer)){y.buffer=Math.round(J);j.sendEvent(a.api.events.JWPLAYER_MEDIA_BUFFER,{bufferPercent:Math.round(J)})}}}function D(J){if(e.exists(J)&&e.exists(J.target)){if(!isNaN(J.target.duration)&&(isNaN(y.duration)||y.duration<1)){if(J.target.duration==Infinity){y.duration=0}else{y.duration=Math.round(J.target.duration*10)/10}}if(!A&&m.readyState>0){m.style.display="block";E(a.api.events.state.PLAYING)}if(B==a.api.events.state.PLAYING){if(!A&&m.readyState>0){A=true;try{if(m.currentTime0?(Math.round(J.target.currentTime*10)/10):0;j.sendEvent(a.api.events.JWPLAYER_MEDIA_TIME,{position:y.position,duration:y.duration});if(y.position>=y.duration&&(y.position>0||y.duration>0)){w()}}}v(J)}function z(I){}function k(I){if(c[I.type]){if(I.type=="ended"){w()}else{E(c[I.type])}}}function G(I){var J={height:I.target.videoHeight,width:I.target.videoWidth,duration:Math.round(I.target.duration*10)/10};if((y.duration===0||isNaN(y.duration))&&I.target.duration!=Infinity){y.duration=Math.round(I.target.duration*10)/10}j.sendEvent(a.api.events.JWPLAYER_MEDIA_META,{metadata:J})}function u(K){if(B==a.api.events.state.IDLE){return}var J="There was an error: ";if((K.target.error&&K.target.tagName.toLowerCase()=="video")||K.target.parentNode.error&&K.target.parentNode.tagName.toLowerCase()=="video"){var I=!e.exists(K.target.error)?K.target.parentNode.error:K.target.error;switch(I.code){case I.MEDIA_ERR_ABORTED:J="You aborted the video playback: ";break;case I.MEDIA_ERR_NETWORK:J="A network error caused the video download to fail part-way: ";break;case I.MEDIA_ERR_DECODE:J="The video playback was aborted due to a corruption problem or because the video used features your browser did not support: ";break;case I.MEDIA_ERR_SRC_NOT_SUPPORTED:J="The video could not be loaded, either because the server or network failed or because the format is not supported: ";break;default:J="An unknown error occurred: ";break}}else{if(K.target.tagName.toLowerCase()=="source"){q--;if(q>0){return}J="The video could not be loaded, either because the server or network failed or because the format is not supported: "}else{e.log("An unknown error occurred. Continuing...");return}}_stop(false);J+=F();_error=true;j.sendEvent(a.api.events.JWPLAYER_ERROR,{error:J});return}function F(){var K="";for(var J in x.levels){var I=x.levels[J];var L=l.ownerDocument.createElement("source");K+=a.utils.getAbsolutePath(I.file);if(J<(x.levels.length-1)){K+=", "}}return K}function t(){if(!e.exists(f)){f=setInterval(function(){v()},100)}}function g(){clearInterval(f);f=null}function w(){if(B!=a.api.events.state.IDLE){_stop(false);j.sendEvent(a.api.events.JWPLAYER_MEDIA_COMPLETE)}}}})(jwplayer);(function(a){var c={ended:a.api.events.state.IDLE,playing:a.api.events.state.PLAYING,pause:a.api.events.state.PAUSED,buffering:a.api.events.state.BUFFERING};var b=a.utils.css;a.html5.mediayoutube=function(j,e){var f=new a.html5.eventdispatcher();a.utils.extend(this,f);var l=j;var h=document.getElementById(e.id);var g=a.api.events.state.IDLE;var n,m;function k(p){if(g!=p){var q=g;l.state=p;g=p;f.sendEvent(a.api.events.JWPLAYER_PLAYER_STATE,{oldstate:q,newstate:p})}}this.getDisplayElement=function(){return h};this.play=function(){if(g==a.api.events.state.IDLE){f.sendEvent(a.api.events.JWPLAYER_MEDIA_BUFFER,{bufferPercent:100});f.sendEvent(a.api.events.JWPLAYER_MEDIA_BUFFER_FULL);k(a.api.events.state.PLAYING)}else{if(g==a.api.events.state.PAUSED){k(a.api.events.state.PLAYING)}}};this.pause=function(){k(a.api.events.state.PAUSED)};this.seek=function(p){};this.stop=function(p){if(!_utils.exists(p)){p=true}l.position=0;k(a.api.events.state.IDLE);if(p){b(h,{display:"none"})}};this.volume=function(p){l.volume=p;f.sendEvent(a.api.events.JWPLAYER_MEDIA_VOLUME,{volume:Math.round(p)})};this.mute=function(p){h.muted=p;l.mute=p;f.sendEvent(a.api.events.JWPLAYER_MEDIA_MUTE,{mute:p})};this.resize=function(q,p){if(q*p>0&&n){n.width=m.width=q;n.height=m.height=p}f.sendEvent(a.api.events.JWPLAYER_MEDIA_RESIZE,{fullscreen:l.fullscreen,width:q,height:p})};this.fullscreen=function(p){if(p===true){this.resize("100%","100%")}else{this.resize(l.config.width,l.config.height)}};this.load=function(p){o(p);b(n,{display:"block"});k(a.api.events.state.BUFFERING);f.sendEvent(a.api.events.JWPLAYER_MEDIA_BUFFER,{bufferPercent:0});f.sendEvent(a.api.events.JWPLAYER_MEDIA_LOADED);this.play()};this.hasChrome=function(){return(g!=a.api.events.state.IDLE)};function o(v){var s=v.levels[0].file;s=["http://www.youtube.com/v/",d(s),"&hl=en_US&fs=1&autoplay=1"].join("");n=document.createElement("object");n.id=h.id;n.style.position="absolute";var u={movie:s,allowfullscreen:"true",allowscriptaccess:"always"};for(var p in u){var t=document.createElement("param");t.name=p;t.value=u[p];n.appendChild(t)}m=document.createElement("embed");n.appendChild(m);var q={src:s,type:"application/x-shockwave-flash",allowfullscreen:"true",allowscriptaccess:"always",width:n.width,height:n.height};for(var r in q){m.setAttribute(r,q[r])}n.appendChild(m);n.style.zIndex=2147483000;if(h!=n&&h.parentNode){h.parentNode.replaceChild(n,h)}h=n}function d(q){var p=q.split(/\?|\#\!/);var s="";for(var r=0;r=0){s=q.substr(q.indexOf("/v/")+3)}else{if(q.indexOf("youtu.be")>=0){s=q.substr(q.indexOf("youtu.be/")+9)}else{s=q}}}if(s.indexOf("?")>-1){s=s.substr(0,s.indexOf("?"))}if(s.indexOf("&")>-1){s=s.substr(0,s.indexOf("&"))}return s}this.embed=m;return this}})(jwplayer);(function(jwplayer){var _configurableStateVariables=["width","height","start","duration","volume","mute","fullscreen","item","plugins","stretching"];jwplayer.html5.model=function(api,container,options){var _api=api;var _container=container;var _model={id:_container.id,playlist:[],state:jwplayer.api.events.state.IDLE,position:0,buffer:0,config:{width:480,height:320,item:-1,skin:undefined,file:undefined,image:undefined,start:0,duration:0,bufferlength:5,volume:90,mute:false,fullscreen:false,repeat:"",stretching:jwplayer.utils.stretching.UNIFORM,autostart:false,debug:undefined,screencolor:undefined}};var _media;var _eventDispatcher=new jwplayer.html5.eventdispatcher();var _components=["display","logo","controlbar","playlist","dock"];jwplayer.utils.extend(_model,_eventDispatcher);for(var option in options){if(typeof options[option]=="string"){var type=/color$/.test(option)?"color":null;options[option]=jwplayer.utils.typechecker(options[option],type)}var config=_model.config;var path=option.split(".");for(var edge in path){if(edge==path.length-1){config[path[edge]]=options[option]}else{if(!jwplayer.utils.exists(config[path[edge]])){config[path[edge]]={}}config=config[path[edge]]}}}for(var index in _configurableStateVariables){var configurableStateVariable=_configurableStateVariables[index];_model[configurableStateVariable]=_model.config[configurableStateVariable]}var pluginorder=_components.concat([]);if(jwplayer.utils.exists(_model.plugins)){if(typeof _model.plugins=="string"){var userplugins=_model.plugins.split(",");for(var userplugin in userplugins){if(typeof userplugins[userplugin]=="string"){pluginorder.push(userplugins[userplugin].replace(/^\s+|\s+$/g,""))}}}}if(jwplayer.utils.isIOS()){pluginorder=["display","logo","dock","playlist"];if(!jwplayer.utils.exists(_model.config.repeat)){_model.config.repeat="list"}}else{if(_model.config.chromeless){pluginorder=["logo","dock","playlist"];if(!jwplayer.utils.exists(_model.config.repeat)){_model.config.repeat="list"}}}_model.plugins={order:pluginorder,config:{},object:{}};if(typeof _model.config.components!="undefined"){for(var component in _model.config.components){_model.plugins.config[component]=_model.config.components[component]}}for(var pluginIndex in _model.plugins.order){var pluginName=_model.plugins.order[pluginIndex];var pluginConfig=!jwplayer.utils.exists(_model.plugins.config[pluginName])?{}:_model.plugins.config[pluginName];_model.plugins.config[pluginName]=!jwplayer.utils.exists(_model.plugins.config[pluginName])?pluginConfig:jwplayer.utils.extend(_model.plugins.config[pluginName],pluginConfig);if(!jwplayer.utils.exists(_model.plugins.config[pluginName].position)){if(pluginName=="playlist"){_model.plugins.config[pluginName].position=jwplayer.html5.view.positions.NONE}else{_model.plugins.config[pluginName].position=jwplayer.html5.view.positions.OVER}}else{_model.plugins.config[pluginName].position=_model.plugins.config[pluginName].position.toString().toUpperCase()}}if(typeof _model.plugins.config.dock!="undefined"){if(typeof _model.plugins.config.dock!="object"){var position=_model.plugins.config.dock.toString().toUpperCase();_model.plugins.config.dock={position:position}}if(typeof _model.plugins.config.dock.position!="undefined"){_model.plugins.config.dock.align=_model.plugins.config.dock.position;_model.plugins.config.dock.position=jwplayer.html5.view.positions.OVER}}function _loadExternal(playlistfile){var loader=new jwplayer.html5.playlistloader();loader.addEventListener(jwplayer.api.events.JWPLAYER_PLAYLIST_LOADED,function(evt){_model.playlist=new jwplayer.html5.playlist(evt);_loadComplete(true)});loader.addEventListener(jwplayer.api.events.JWPLAYER_ERROR,function(evt){_model.playlist=new jwplayer.html5.playlist({playlist:[]});_loadComplete(false)});loader.load(playlistfile)}function _loadComplete(){if(_model.config.shuffle){_model.item=_getShuffleItem()}else{if(_model.config.item>=_model.playlist.length){_model.config.item=_model.playlist.length-1}else{if(_model.config.item<0){_model.config.item=0}}_model.item=_model.config.item}_eventDispatcher.sendEvent(jwplayer.api.events.JWPLAYER_PLAYLIST_LOADED,{playlist:_model.playlist});_eventDispatcher.sendEvent(jwplayer.api.events.JWPLAYER_PLAYLIST_ITEM,{index:_model.item})}_model.loadPlaylist=function(arg){var input;if(typeof arg=="string"){if(arg.indexOf("[")==0||arg.indexOf("{")=="0"){try{input=eval(arg)}catch(err){input=arg}}else{input=arg}}else{input=arg}var config;switch(jwplayer.utils.typeOf(input)){case"object":config=input;break;case"array":config={playlist:input};break;default:_loadExternal(input);return;break}_model.playlist=new jwplayer.html5.playlist(config);if(jwplayer.utils.extension(_model.playlist[0].file)=="xml"){_loadExternal(_model.playlist[0].file)}else{_loadComplete()}};function _getShuffleItem(){var result=null;if(_model.playlist.length>1){while(!jwplayer.utils.exists(result)){result=Math.floor(Math.random()*_model.playlist.length);if(result==_model.item){result=null}}}else{result=0}return result}function forward(evt){if(evt.type==jwplayer.api.events.JWPLAYER_MEDIA_LOADED){_container=_media.getDisplayElement()}_eventDispatcher.sendEvent(evt.type,evt)}var _mediaProviders={};_model.setActiveMediaProvider=function(playlistItem){if(playlistItem.provider=="audio"){playlistItem.provider="sound"}var provider=playlistItem.provider;var current=_media?_media.getDisplayElement():null;if(provider=="sound"||provider=="http"||provider==""){provider="video"}if(!jwplayer.utils.exists(_mediaProviders[provider])){switch(provider){case"video":_media=new jwplayer.html5.mediavideo(_model,current?current:_container);break;case"youtube":_media=new jwplayer.html5.mediayoutube(_model,current?current:_container);break}if(!jwplayer.utils.exists(_media)){return false}_media.addGlobalListener(forward);_mediaProviders[provider]=_media}else{if(_media!=_mediaProviders[provider]){if(_media){_media.stop()}_media=_mediaProviders[provider]}}return true};_model.getMedia=function(){return _media};_model.seek=function(pos){_eventDispatcher.sendEvent(jwplayer.api.events.JWPLAYER_MEDIA_SEEK,{position:_model.position,offset:pos});return _media.seek(pos)};_model.setupPlugins=function(){if(!jwplayer.utils.exists(_model.plugins)||!jwplayer.utils.exists(_model.plugins.order)||_model.plugins.order.length==0){jwplayer.utils.log("No plugins to set up");return _model}for(var i=0;i<_model.plugins.order.length;i++){try{var pluginName=_model.plugins.order[i];if(jwplayer.utils.exists(jwplayer.html5[pluginName])){if(pluginName=="playlist"){_model.plugins.object[pluginName]=new jwplayer.html5.playlistcomponent(_api,_model.plugins.config[pluginName])}else{_model.plugins.object[pluginName]=new jwplayer.html5[pluginName](_api,_model.plugins.config[pluginName])}}else{_model.plugins.order.splice(plugin,plugin+1)}if(typeof _model.plugins.object[pluginName].addGlobalListener=="function"){_model.plugins.object[pluginName].addGlobalListener(forward)}}catch(err){jwplayer.utils.log("Could not setup "+pluginName)}}};return _model}})(jwplayer);(function(a){a.html5.playlist=function(b){var d=[];if(b.playlist&&b.playlist instanceof Array&&b.playlist.length>0){for(var c in b.playlist){if(!isNaN(parseInt(c))){d.push(new a.html5.playlistitem(b.playlist[c]))}}}else{d.push(new a.html5.playlistitem(b))}return d}})(jwplayer);(function(a){var c={size:180,position:a.html5.view.positions.NONE,itemheight:60,thumbs:true,fontcolor:"#000000",overcolor:"",activecolor:"",backgroundcolor:"#f8f8f8",font:"_sans",fontsize:"",fontstyle:"",fontweight:""};var b={_sans:"Arial, Helvetica, sans-serif",_serif:"Times, Times New Roman, serif",_typewriter:"Courier New, Courier, monospace"};_utils=a.utils;_css=_utils.css;_hide=function(d){_css(d,{display:"none"})};_show=function(d){_css(d,{display:"block"})};a.html5.playlistcomponent=function(r,B){var w=r;var e=a.utils.extend({},c,w.skin.getComponentSettings("playlist"),B);if(e.position==a.html5.view.positions.NONE||typeof a.html5.view.positions[e.position]=="undefined"){return}var x;var l;var C;var d;var g;var f;var k=-1;var h={background:undefined,item:undefined,itemOver:undefined,itemImage:undefined,itemActive:undefined};this.getDisplayElement=function(){return x};this.resize=function(F,D){l=F;C=D;if(w.jwGetFullscreen()){_hide(x)}else{var E={display:"block",width:l,height:C};_css(x,E)}};this.show=function(){_show(x)};this.hide=function(){_hide(x)};function j(){x=document.createElement("div");x.id=w.id+"_jwplayer_playlistcomponent";switch(e.position){case a.html5.view.positions.RIGHT:case a.html5.view.positions.LEFT:x.style.width=e.size+"px";break;case a.html5.view.positions.TOP:case a.html5.view.positions.BOTTOM:x.style.height=e.size+"px";break}A();if(h.item){e.itemheight=h.item.height}x.style.backgroundColor="#C6C6C6";w.jwAddEventListener(a.api.events.JWPLAYER_PLAYLIST_LOADED,s);w.jwAddEventListener(a.api.events.JWPLAYER_PLAYLIST_ITEM,u);w.jwAddEventListener(a.api.events.JWPLAYER_PLAYER_STATE,m)}function p(){var D=document.createElement("ul");_css(D,{width:x.style.width,minWidth:x.style.width,height:x.style.height,backgroundColor:e.backgroundcolor,backgroundImage:h.background?"url("+h.background.src+")":"",color:e.fontcolor,listStyle:"none",margin:0,padding:0,fontFamily:b[e.font]?b[e.font]:b._sans,fontSize:(e.fontsize?e.fontsize:11)+"px",fontStyle:e.fontstyle,fontWeight:e.fontweight,overflowY:"auto"});return D}function y(D){return function(){var E=f.getElementsByClassName("item")[D];var F=e.fontcolor;var G=h.item?"url("+h.item.src+")":"";if(D==w.jwGetPlaylistIndex()){if(e.activecolor!==""){F=e.activecolor}if(h.itemActive){G="url("+h.itemActive.src+")"}}_css(E,{color:e.overcolor!==""?e.overcolor:F,backgroundImage:h.itemOver?"url("+h.itemOver.src+")":G})}}function o(D){return function(){var E=f.getElementsByClassName("item")[D];var F=e.fontcolor;var G=h.item?"url("+h.item.src+")":"";if(D==w.jwGetPlaylistIndex()){if(e.activecolor!==""){F=e.activecolor}if(h.itemActive){G="url("+h.itemActive.src+")"}}_css(E,{color:F,backgroundImage:G})}}function q(I){var P=d[I];var O=document.createElement("li");O.className="item";_css(O,{height:e.itemheight,display:"block",cursor:"pointer",backgroundImage:h.item?"url("+h.item.src+")":"",backgroundSize:"100% "+e.itemheight+"px"});O.onmouseover=y(I);O.onmouseout=o(I);var J=document.createElement("div");var F=new Image();var K=0;var L=0;var M=0;if(v()&&(P.image||P["playlist.image"]||h.itemImage)){F.className="image";if(h.itemImage){K=(e.itemheight-h.itemImage.height)/2;L=h.itemImage.width;M=h.itemImage.height}else{L=e.itemheight*4/3;M=e.itemheight}_css(J,{height:M,width:L,"float":"left",styleFloat:"left",cssFloat:"left",margin:"0 5px 0 0",background:"black",overflow:"hidden",margin:K+"px",position:"relative"});_css(F,{position:"relative"});J.appendChild(F);F.onload=function(){a.utils.stretch(a.utils.stretching.FILL,F,L,M,this.naturalWidth,this.naturalHeight)};if(P["playlist.image"]){F.src=P["playlist.image"]}else{if(P.image){F.src=P.image}else{if(h.itemImage){F.src=h.itemImage.src}}}O.appendChild(J)}var E=l-L-K*2;if(C0){G.className="duration";_css(G,{fontSize:(e.fontsize?e.fontsize:11)+"px",fontWeight:(e.fontweight?e.fontweight:"bold"),width:"40px",height:e.fontsize?e.fontsize+10:20,lineHeight:24,"float":"right",styleFloat:"right",cssFloat:"right"});G.innerHTML=_utils.timeFormat(P.duration);D.appendChild(G)}var N=document.createElement("span");N.className="title";_css(N,{padding:"5px 5px 0 "+(K?0:"5px"),height:e.fontsize?e.fontsize+10:20,lineHeight:e.fontsize?e.fontsize+10:20,overflow:"hidden","float":"left",styleFloat:"left",cssFloat:"left",width:((P.duration>0)?E-50:E)-10+"px",fontSize:(e.fontsize?e.fontsize:13)+"px",fontWeight:(e.fontweight?e.fontweight:"bold")});N.innerHTML=P?P.title:"";D.appendChild(N);if(P.description){var H=document.createElement("span");H.className="description";_css(H,{display:"block","float":"left",styleFloat:"left",cssFloat:"left",margin:0,paddingLeft:N.style.paddingLeft,paddingRight:N.style.paddingRight,lineHeight:(e.fontsize?e.fontsize+4:16)+"px",overflow:"hidden",position:"relative"});H.innerHTML=P.description;D.appendChild(H)}O.appendChild(D);return O}function s(E){x.innerHTML="";d=w.jwGetPlaylist();if(!d){return}items=[];f=p();for(var F=0;F=0){o(k)();k=D.index}o(D.index)();n()}function m(){if(e.position==a.html5.view.positions.OVER){switch(w.jwGetState()){case a.api.events.state.IDLE:_show(x);break;default:_hide(x);break}}}function A(){for(var D in h){h[D]=t(D)}}function t(D){return w.skin.getSkinElement("playlist",D)}j();return this}})(jwplayer);(function(b){b.html5.playlistitem=function(d){var e={author:"",date:"",description:"",image:"",link:"",mediaid:"",tags:"",title:"",provider:"",file:"",streamer:"",duration:-1,start:0,currentLevel:-1,levels:[]};var c=b.utils.extend({},e,d);if(c.type){c.provider=c.type;delete c.type}if(c.levels.length===0){c.levels[0]=new b.html5.playlistitemlevel(c)}if(!c.provider){c.provider=a(c.levels[0])}else{c.provider=c.provider.toLowerCase()}return c};function a(e){if(b.utils.isYouTube(e.file)){return"youtube"}else{var f=b.utils.extension(e.file);var c;if(f&&b.utils.extensionmap[f]){if(f=="m3u8"){return"video"}c=b.utils.extensionmap[f].html5}else{if(e.type){c=e.type}}if(c){var d=c.split("/")[0];if(d=="audio"){return"sound"}else{if(d=="video"){return d}}}}return""}})(jwplayer);(function(a){a.html5.playlistitemlevel=function(b){var d={file:"",streamer:"",bitrate:0,width:0};for(var c in d){if(a.utils.exists(b[c])){d[c]=b[c]}}return d}})(jwplayer);(function(a){a.html5.playlistloader=function(){var c=new a.html5.eventdispatcher();a.utils.extend(this,c);this.load=function(e){a.utils.ajax(e,d,b)};function d(g){var f=[];try{var f=a.utils.parsers.rssparser.parse(g.responseXML.firstChild);c.sendEvent(a.api.events.JWPLAYER_PLAYLIST_LOADED,{playlist:new a.html5.playlist({playlist:f})})}catch(h){b("Could not parse the playlist")}}function b(e){c.sendEvent(a.api.events.JWPLAYER_ERROR,{error:e?e:"could not load playlist for whatever reason. too bad"})}}})(jwplayer);(function(a){a.html5.skin=function(){var b={};var c=false;this.load=function(d,e){new a.html5.skinloader(d,function(f){c=true;b=f;e()},function(){new a.html5.skinloader("",function(f){c=true;b=f;e()})})};this.getSkinElement=function(d,e){if(c){try{return b[d].elements[e]}catch(f){a.utils.log("No such skin component / element: ",[d,e])}}return null};this.getComponentSettings=function(d){if(c){return b[d].settings}return null};this.getComponentLayout=function(d){if(c){return b[d].layout}return null}}})(jwplayer);(function(a){a.html5.skinloader=function(f,p,k){var o={};var c=p;var l=k;var e=true;var j;var n=f;var s=false;function m(){if(typeof n!="string"||n===""){d(a.html5.defaultSkin().xml)}else{a.utils.ajax(a.utils.getAbsolutePath(n),function(t){try{if(a.utils.exists(t.responseXML)){d(t.responseXML);return}}catch(u){h()}d(a.html5.defaultSkin().xml)},function(t){d(a.html5.defaultSkin().xml)})}}function d(y){var E=y.getElementsByTagName("component");if(E.length===0){return}for(var H=0;H0){var K=z.getElementsByTagName("setting");for(var P=0;P0){var M=L.getElementsByTagName("group");for(var w=0;w'; + return $code; + }else + return false; + } + + /** + * Writing CB Player function to play videos on facebook + */ + function cb_facebook_embed($params) + { + $vdetails = $params['video']; + $config = urlencode(BASEURL."/player/".CB_PLAYER."/embed_player.php?vid=" + .$vdetails['videoid']."&autoplay=".config('autoplay_embed')); + $embed_src = BASEURL.'/player/'.CB_PLAYER.'/player.swf?config='.$config; + return $embed_src; + } + + + register_embed_function('cbplayer_embed_src'); + register_actions_play_video('cb_player'); + cb_register_function('cb_facebook_embed','fb_embed_video'); + //include Pak Player JS File + $Cbucket->add_header(CB_PLAYER_DIR.'/cbplayer_header.html'); + $Cbucket->add_admin_header(CB_PLAYER_DIR.'/cbplayer_header.html'); + + /** + * Including plugin files + */ + include("cbplayer.plugin.php"); +} +?> \ No newline at end of file diff --git a/upload/player/cbplayer/cbplayer.plugin.php b/upload/player/cbplayer/cbplayer.plugin.php new file mode 100644 index 00000000..8dce5a57 --- /dev/null +++ b/upload/player/cbplayer/cbplayer.plugin.php @@ -0,0 +1,4 @@ + \ No newline at end of file diff --git a/upload/player/cbplayer/cbplayer_header.html b/upload/player/cbplayer/cbplayer_header.html new file mode 100644 index 00000000..081a7407 --- /dev/null +++ b/upload/player/cbplayer/cbplayer_header.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/upload/player/cbplayer/embed_player.php b/upload/player/cbplayer/embed_player.php new file mode 100644 index 00000000..3c3fec84 --- /dev/null +++ b/upload/player/cbplayer/embed_player.php @@ -0,0 +1,104 @@ +"no video details found"))); + +header('Content-Type: text/xml'); + +$video = $vdetails; + + +//Loading video files +$vid_file = get_video_file($vdetails,true,true); +$hd_file = get_hq_video_file($vdetails,false); + +/* Checking for youtube */ +$ref = $video['refer_url']; +//Trying other method +if(function_exists('get_refer_url_from_embed_code')) +{ + $ref_details = get_refer_url_from_embed_code(unhtmlentities(stripslashes($video['embed_code']))); + $ytcode = $ref_details['ytcode']; +} +?> + + + + + + http://youtube.com/watch?v= + + + + + + true + /skins/glow/glow.xml + hd-2,plugins/related/related.swf + + + + + + + + + + http + + youtube + + + + + + /plugins/related/related_videos.php?vid=&title=&tags= + false + More suggested videos + + + + + + + + + + 3 + 1 + 0.5 + + + + + + + + \ No newline at end of file diff --git a/upload/player/cbplayer/player.swf b/upload/player/cbplayer/player.swf new file mode 100644 index 0000000000000000000000000000000000000000..7d024bebdaa6cf7e23fbb2a63af662ed586d8d7a GIT binary patch literal 105207 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 literal 0 HcmV?d00001 diff --git a/upload/player/cbplayer/plugins/hd.swf b/upload/player/cbplayer/plugins/hd.swf new file mode 100644 index 0000000000000000000000000000000000000000..86718bc69e4293258f13d67bef0d5a72365cf162 GIT binary patch literal 5445 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 literal 0 HcmV?d00001 diff --git a/upload/player/cbplayer/plugins/related/related.js b/upload/player/cbplayer/plugins/related/related.js new file mode 100644 index 00000000..47160767 --- /dev/null +++ b/upload/player/cbplayer/plugins/related/related.js @@ -0,0 +1 @@ +(function(a){var b=function(e,t,w){var l;var g;var i;var q;var v;var u;var s;var j={cursor:"pointer",position:"absolute",left:"0px",top:"0px",margin:"0px",padding:"0px",display:"block",width:"50px",height:"50px"};var n={backgroundImage:"url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAGQCAYAAACJccGfAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJlJREFUeNrskksKwDAIRFV6/+v1Nv0sQymkBD+jVchGdOY5hIlop6GEHrXd75hOnNqNIA5Y0cQaPisLGiZgQbbzFdhrS0/ksUUhhb02aKW0Rh6w0i55OCqRdmLd6Mb4C7nzKJkYCqkPh4nLv0QXNIJsg9BRVkpz+Nj6oKOQ+qSuYZuH9HVCcka4qCEgiYnLtWze+Garfu0lwAArHE4YPfyZuAAAAABJRU5ErkJggg==)",backgroundRepeat:"no-repeat",backgroundSize:"100% 100%",opacity:0,webkitTransition:"opacity 150ms linear",MozTransition:"opacity 150ms linear",msTransition:"opacity 150ms linear",transition:"opacity 150ms linear",cursor:"pointer",visibility:"hidden"};var o={position:"absolute",border:"none",color:"#FFF",display:"block",font:"16px/24px Arial,sans-serif",overflow:"hidden",width:"240px",margin:"0 0 0 0",textAlign:"center",textTransform:"none",textShadow:"#000 1px 1px 0",padding:"0 0 0 0"};var z="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAArlJREFUeNrsWe1xozAQhZv8hw7sDkQH5CpwOnA6oATSQdIB7sC5CshVgFMBuQqcq0BZzT3N7SiAFiw7nol2ZkcyWi16Wn28xUkSJUqUKN9CtNYlaUPa68/So01BvXanjiddAGBFxY70lvRA+kz64piZtnvSNX6/oc+Q3R1pgbb7NE3/XCIKG9IjaWciIrTrUd94otv57EKC0FgKmdCuQr1FOQUmQx99NjBmOWG2Gqkd6RaD2rIBHrE0p3w0ErulQMyMdlI7FgkOorbREfjpJHZzQSgMoBTaNQMgKrYHtO+Uwp7xvnMukEYYjYYdq2MgSskSZVFpQgIxp04ttPOB6Oz9IfBXS+zmABGFmA18CkRnDwHhhatDgchmAuk8IOzSunogEhB2w68uBmTB0qo9IDp7DF80Igs3+xSI6is3+9zj1wdCf9XxWwovxJJR89FIzLwQVRJSZlIU7bBfC2IvoR44YMJTlIWkUTsgGikZPCtpXEjjWxaJ5ipo/AmJ1VGSMIVIrG5m5cVp+oteVNi0lepjqa6xeUeqWyDVLcj+3ZPqFhdJdQdoe6iPD2USJUqUKFFOSMLUGfyqKSZxDiClgBCaG79aQFi998yPmcRROQNfeSJUOlEyN3g+YJONTEwWerZ7psrSbJ498ogwrtWirFmOYZMvhf7Wz4ZNWM8+gPfBbn6e5FD5aJcHZrRnM2uBVGxgG/a8ZsA75lPZfAf+a+b/GHRpEZl7ZcvjCR8GODHkYojkLQDsRlyaPgf4OTAflkCad/5FWxIMCBMz+LsUYoBQ8duxeYHdQ/LvD58xPzn3w58zuzw4jWez/YAvNWvU145NDuqeAwyn72tsYuNnR/Wn5P+/Wz8RQeu/GIj2aTm783uLTbp31vkj3xdoN/U9s2nxLMOead2sk/WvsWdUEiVKlChRrlE+BBgA99ZhJqocsJoAAAAASUVORK5CYII=";var A="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAytJREFUeNrsWC2T2zAQdToBAQUGBYaGgYGBBgUGBwwPHAg8UFB4P+VgQMGBgoMGBQcLAw0NCgwKDAoMOpPuJk/TrWpL68S5Xue0Mxp/PUt6q11pd6MoSJAgQf4nmZ36436/T+myosbX2PrcUqupfcXz2oebzWbNsxIhAjyZAhPjwStMRoohGYsJ7wZwS2oJvj0SofbiRIjEEiR4sJIGrRW4d9R+YpKVY3VzEB/EueTNSBLXWIGth4TB8SosqP2gdoNvf2vz2NcW/1wP4c4mIsxpR4OyxjofDqbCWv5M7RvMpwCmj0zHfePfQdy5K3IwEwzkxcF3+P5R+MsnmE7htPXjGK0PN5oIaSbBZEolrsFKSBIlnPrg4MC6pAQunXJFeOtshnzCwr3FxG0SZge7h8+sPatSQyGrKYmkcEINbuEg8YCVmuO7TyolTk0k7tn/h3A+EhGcX+PItRI3bvtVytJDohzrxP+KSOohwedLJ7bqF0vki4dEa+KvU0ORc4i0Sqdj3HsPCT7srnCvWd12SiK1OAN8uLmHRC6wGn+rpyTCE0gUh9MOE75xkOD77yK8d6UIiQ83iggOp1po04dj03rqIVHB0WtX7kEkFsDXY3IUrbPz+RDTIIUCxxr/YJHYgYQ5a1ySK3HjiWCH4Y5XTAZac+FanPJXIipYuRIn7hOKWp2SYF06sYqFuV00sXqdqW5P2O4tKiiLDztFdB0kSJAgQV6J8KGpiMtUkQS19eQZIh+Cdk0KMVJqxV/xUOFgAG/I26lCgpjNK3MlgQ067JCbHOIhEVM1eP+AE3qD/zJ6frKiARPeM5lDDZmuHM5k/B4h0BaKyPBfPcnJz0R4UmK5zURvjRah5Vtxv+npJzMmh35irNBHs0JsStRygc8mWxErPZUF7MRoCpr1lUI5cGSl3CHYbGA+rP07eh+NSIVPJtInHWuSK+nQaOfDR8eyqTGbHNkkl2TvRYb47OUg1moB8yqiP0uri57aVQ6cId0hnV3AjFL4l9ypYg05LZFGaLvDsykwNNBuE/2u2DdwaLsIXeL/TDxHlnNXYoOo8D6NggQJEiTIS5RfAgwAwPzrJ/KrwvYAAAAASUVORK5CYII=";var B=function(){if(q){e.pause(true);w.style.visibility="visible";w.style.opacity=1;try{e.getPlugin("display").hide();e.getPlugin("dock").hide()}catch(C){}}};function y(C){if(t.oncomplete!==false){setTimeout(B,50)}}function k(C){if(C==q){console.log("RELATED: Failed to load "+C)}else{console.log("RELATED: "+C)}q=undefined;u.innerHTML="";d();if(t.usedock!==false){e.getPlugin("dock").setButton("related",B,A)}}function d(C){setTimeout(r,200);w.style.opacity=0;try{e.getPlugin("display").show();e.getPlugin("dock").show()}catch(D){}}function r(){w.style.visibility="hidden"}function p(D){q=undefined;u.innerHTML="";d();var C=e.getPlaylist()[D.index];if(C["related.file"]){q=C["related.file"]}else{if(t.file){q=t.file}}if(q){if(t.usedock!==false){e.getPlugin("dock").setButton("related",B,z)}a.utils.ajax(q,f,k)}else{k("No related videos file found")}}function f(D){var J=[];var K=[];try{J=a.utils.parsers.rssparser.parse(D.responseXML.firstChild)}catch(I){k("This feed is not valid XML and/or RSS.");return}for(var H=0;Hi[4]){if(L==i[3]-1||(i[1]+10)*(L+2)>i[5]-40){break}else{L++;E=0}}else{E++}}c(i[4],i[5])}else{k("RSS feed has 0 entries that contain title,link and image.")}}function h(){if(e.getRenderingMode()=="flash"){return}e.onPlaylistItem(p);e.onComplete(y);m(w,n);w.onclick=d;s=document.createElement("div");m(s,j);m(s,{background:"transparent url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAABKhJREFUeNrsWF1IY1cQvtGsVruSoCiKoqH+FVFvQClBxITimw/aLir4orCgxRfz5pOkqa9K1lSs+tCksKKomAgSlJImBRHqi0YRKihJ4y8oXuuu/z/TmXDvchH3p5uke6X3gyFzT85Jzndm5szMZRgZMmTIkCFDhoz/FwBAjfIM5bvHSkCJwgaDwd84jgOLxQI4vPSYCChQMq+vr394jUAdTk9Pwel0QklJCcTHx3/zGEh8jvLt1dXVKjwAsszY2Ngrq9X67FEQWVtbO4e34O7uDjY2NmBkZKRX8q6VmZkJZrMZDg4O3sYH1tfXoauryy51L2uOi4sDnU4Xio2TkxNwuVwwODgINzc3ISKXl5ehsZycnJeR+tPYKBDx3d7eBra3tw2zs7OfraysMKgzAwMDDF4CTFVVFRMbG8skJCQwaLXSxcVFNa6ZC/dPlVGyyi8o3uPjY83U1JRCqVQSCcDnL30+348syz5Rq9WMVquluVopxMRTlHKUr1G+QlG9Z36G2+3+ldzr4uICJicnKb94IrGXmDDXF+OG3Pjp3tra+qO9vf34PRu7zsrK+pMUhUIRcrFIIVwi15g3TklJSkpiCgoKSFW/Y74KA72CFIwj5uzsTDJEuL29vU2BSHl5OZOXl0c+zz7gVvEYJyXZ2dmhmDg/P2d2d3clkzeejo6O/oSnG7pW8YQBgxuQjI9OXzTvCYoBb689IZesrq5CZWVlxGIkbNTU1Jimp6ffJDt0NcDsDg6H43d8bEJ5jvIz5pBdYc7R0RH09vYSCekQSU9P/6Kpqekl5gv4EJDV6LZKS0sTKmJWMqk8MTHRgDkBMAG+kwRZor+/H5KTkwVr2KRYmthUKhU0NjbCzMwMbG5uwv7+PmBAh+JheHgYKioqAK9cgYRfHEdSgop3FfhAYRkZMmSIk6ceJWo5I+a/JOP1eg3RSoAx/+JEWRQLvUdAWeLHLHyK8KPU8mPNKCZ+jGB54LeaRd/TZw5vMZNoTq34OZIWoarWiE2RNzc3V9PZ2cnRGJbjLzAZajiOox6cyGiwgfoeC0hvfn5+AGGsr6+/T8bY1tbmxbUBbIc1VqvV29DQQC2AEdtfYfMtPT09VGCaIu7jHo9HyAF0gp7Dw0M/jZFOlqquriZrmfgXchw/z4SAvr6+Dn49zVW1trZyc3NzDrIIfU8bRt3W0dFBC2gdpKamkhs2R6vV9aL8RUp3d7dmeXmZVPJ9hvSJiQkDWoQe7cI8wvz8fF1paSmTkpJClg2YzWbv+Pi4lvoSEV4YjcYW7O+dWBU4saevw7G6aAe702AwMDs7O0bcoNFut1MvUqfT6ZZbWloYvV5/TL5PLrKwsOB801IWF5O7BIqKigxDQ0OBjIwMjfAduppPo9EsY6epRbcSDuPvaLmWh39WYVPlEF4k4ulSHPiDwaAFS3jw+0OxzOEa8nH/PdfyCIFOv2Gz2UCIBboI6K0kX4vVRusG1d+7PlV8BSvERLMQE6g7+M1wIj8Xr/eIikebUAnTepfLJaz7pIlPIGL6iLVkYa6srMz2yUt8igt+Ix9DhC0sLFwSbjwpVCQ5YWyElQoJGTJkSBD/CDAA0ma8tkQpWYgAAAAASUVORK5CYII=)"});s.onclick=x;w.appendChild(s);g=document.createElement("div");m(g,j);m(g,{background:"transparent url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA0xJREFUeNrsVz1IW1EUjtKtQyh0yRQr2kFCIlHB7cUMBhpCXKKY5UVBnfwZWgUppFvHOEUkg84ucXBxeg1ChiKmUCQ0EV+K1Q4BnyKImujtOem95fp8pvTHeIX7weHlnXNeON+955x7rs0mISEhISEhISEh0UgQQoIgOyBvfuPnBvkM8lZEEiHCYWpqioA6buHnrVQqVeY3MzODfglhiFxfX1eICX19fRikypF4fnV1VTX7oQnELgSR9fX198QC/f39p2D2wM+nZ2dnJbN9aGiIEVFE2RRlcHCQwIrfIjMxMVG+vLz8aNZHIhFGQigimBqK1+vNn5yckHo4Pz8n4McI5EQicYNQR0fHzt7eniWJ3d1d4na7eRJ2m8Cw+/3+L1ZEVFV9NCSwOz07PDwsWhEBPenu7r7RzUQl8bJarX6tVyMXFxckEAgUhN0RiNEP58mNtgUtl8RiMbK/v3+L0MjIiC4cGYjrlTlQbMVdXV21mnA6neTo6OguMuIAVv67Ocienh5W2Bis4nK5vlmlmlDnyNLS0ms+uPHxcRaggSc7dfOEQqFT3m92dla8AxGCJNvb23xwKGGTnxoMBkmhUCDz8/O8n1C1kuACs5x+KeImv4RNQkLiUd3ZNZAHaaPN//sPfT7fh4c4E5r/YfXjIAY91xJ17CjTnD5Bv9FBwlRnp7tJ6NPTqBTCO7gOc9Rya2uroes66e3txQA1RVHI5OTktNlOdQoI3kMSeC+Zm5vDUz8MujQckEhWQ30+n89x08C9EolvbGyk6QzlpKJDMDoSWV1d1Xg7+gOIgkbYoVwuhys/3dbWhsEjQTzp9a2tLYPtDOjTfxLTk78lk81mB+DxDgTvHs6mpqYX7e3tGry3mO3sm0wm40P74uJiaXh4eKFYLJbgu07QLYyNjbWwMqPPgUbUyBrcMWywwLX8xndN036NI5ubm7wddysGxNZGR0cxuBWHw9GZTCYXjo+PMfhP+D00iRrRaDS6kkqlShyhe08v1TB+1vrBwcEy3sGBDKZPbZLFdKJ2A1IG7TpNLVbUBqQgNgl08pTL5RxrApFIBPVaI7ueSsd0fvDTuPYbp3aDGyDt1IeN+Ozu7uH0ekOKXUJCQkJCguKHAAMAvduPUQLB93IAAAAASUVORK5CYII=)"});g.onclick=d;w.appendChild(g);v=document.createElement("div");if(t.heading){v.innerHTML=t.heading}else{v.innerHTML="Watch related videos"}m(v,o);w.appendChild(v);u=document.createElement("div");w.appendChild(u);m(u,{position:"absolute"})}e.onReady(h);this.resize=function(E,C){if(e.getRenderingMode()=="flash"){return}if(!i){i=[140,80,5,2,E,C,0,0];if(t.dimensions){var F=t.dimensions.split(",");for(var D=0;D<4;D++){i[D]=Number(F[D])}}}c(E,C)};function c(D,C){m(w,{height:C+"px",width:D+"px"});m(g,{left:(D-50)+"px"});m(u,{left:Math.round(D/2-i[6]/2)+"px",top:Math.round(C/2-i[7]/2)+"px"});m(v,{left:Math.round(D/2-i[6]/2)+"px",width:i[6]+"px",top:Math.round(C/2-i[7]/2-30)+"px"})}function x(C){e.seek(0)}function m(C,D){for(var E in D){C.style[E]=D[E]}}};a().registerPlugin("related",b,"./related.swf")})(jwplayer);(function(a){if(a.related){return}a.related={};a.related.thumb=function(e,g,j,i,p){var b;var d={border:"1px solid #000",webkitBoxShadow:"0 0 4px #000",MozBoxShadow:"0 0 4px #000",msBoxShadow:"0 0 4px #000",boxShadow:"0 0 4px #000",backgroundColor:"#000",backgroundSize:"cover",position:"absolute",textDecoration:"none",display:"block",margin:"0 0 0 0",padding:"0 0 0 0"};var l;var o={psition:"absolute",left:"0px",top:"0px",border:"none",margin:"0 0 0 0",padding:"0 0 0 0"};var n;var k={backgroundColor:"rgba(0,0,0,0.8)",left:"0px",position:"absolute",border:"none",color:"#FFF",display:"block",font:"12px/26px Arial,sans-serif",overflow:"hidden",margin:"0 0 0 0",textAlign:"center",textDecoration:"none",textTransform:"none",padding:"0 0 0 0",height:"26px"};function f(q){c(b,{border:"1px solid #FFF",webkitBoxShadow:"0 0 4px #FFF",MozBoxShadow:"0 0 4px #FFF",msBoxShadow:"0 0 4px #FFF",boxShadow:"0 0 4px #FFF"})}function m(q){c(b,{border:"1px solid #000",webkitBoxShadow:"0 0 4px #000",MozBoxShadow:"0 0 4px #000",msBoxShadow:"0 0 4px #000",boxShadow:"0 0 4px #000"})}function h(){b=document.createElement("a");b.setAttribute("href",i);b.setAttribute("target","_top");b.onmouseout=m;b.onmouseover=f;c(b,d);c(b,{backgroundImage:"url("+j+")",width:(e-2)+"px",height:(g-2)+"px"});l=document.createElement("img");l.setAttribute("src","data:image/png;base64,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");c(l,o);c(l,{width:e-2+"px",height:g-20+"px"});b.appendChild(l);if(p){n=document.createElement("div");n.innerHTML=p;c(n,k);c(n,{top:(g-28)+"px",width:(e-2)+"px"});b.appendChild(n)}return b}function c(q,r){for(var s in r){q.style[s]=r[s]}}return h()}})(jwplayer); \ No newline at end of file diff --git a/upload/player/cbplayer/plugins/related/related.swf b/upload/player/cbplayer/plugins/related/related.swf new file mode 100644 index 0000000000000000000000000000000000000000..2d0c11318242549efc8ff34ef1c0aa4a989e4d4d GIT binary patch literal 10868 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 + Related + related.swf + 1.0 + Compatible with 5.0 + LongTail Video + This plugin displays a menu with related videos. + http://developer.longtailvideo.com/trac/browser/plugins/related/ + + + + file + + + URL link to an mRSS playlist containing related video metadata. + If not set or empty, the "related videos" screen will display "No related videos found" + + + + oncomplete + true + Show the related videos screen when the video completes. + + + usedock + true + If false, the dock button for popping the related videos will not be shown. + + + + diff --git a/upload/player/cbplayer/plugins/related/related_videos.php b/upload/player/cbplayer/plugins/related/related_videos.php new file mode 100644 index 00000000..3f3ff426 --- /dev/null +++ b/upload/player/cbplayer/plugins/related/related_videos.php @@ -0,0 +1,28 @@ +$title,'tags'=>$tags, +'exclude'=>$videoid,'show_related'=>'yes','limit'=>8,'order'=>'date_added DESC')); +if(!$related_videos) + $related_videos = get_videos(array('exclude'=>$videoid,'limit'=>12,'order'=>'date_added DESC')); +?> + + + + + <?=$video['title']?> + + + + + + \ No newline at end of file diff --git a/upload/player/cbplayer/preview.jpg b/upload/player/cbplayer/preview.jpg new file mode 100644 index 0000000000000000000000000000000000000000..503abb323fc7b6d7db292747485649ca6678ba72 GIT binary patch literal 7286 zcma)d1yq#V_x4L8-5ooxC7-7e!u6DSdH$Z#9^kyY>SV%=CeQ8T5fCRMv%8SqY>NBo_qt zhQs`vKtXUXgs)tXBJZE%a##KzVKH9NpAbJ!MPAiEs)DTajX-Kh6bvK<78iwzOG7}? zl3<9WxU8hC2uMO4A}$7z5EGXXg^0^Z$;gRAKz|wURW+20tDK3t=3lk0MvA_2+{S7KkYU~ib13CtJikAlLk z;Cz21d&{YzU`~EWlo=A~_4h6sxgq_KzHUfwkeaC!7y`0%N4OvZegDMk>&xjNeEpmd zP?(OoBJULg*xlVlPE}J~QbJZjMnhHRHUy#}E~^UB(157QYD(Ugy&9_hovV(7`om!e zzrS-`{*!zAUvvLx1-SQBWpxVcR3F{0f-3+35f`a ziHL}=5np}eq{PIe

    CNhJv|3IJ39yWKZZv_LPAMF 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 literal 0 HcmV?d00001 diff --git a/upload/player/cbplayer/skins/glow/controlbar/blankButton.png b/upload/player/cbplayer/skins/glow/controlbar/blankButton.png new file mode 100644 index 0000000000000000000000000000000000000000..010159f3eb743d6e22d5c54b91c09ca40d8aaa39 GIT binary patch literal 82 zcmeAS@N?(olHy`uVBq!ia0vp^Qa~)r!3HF^_}7#HDM?Qk$B>F!Zx1r^0(plNelM@% eXXjyH_#wpol!0;1`W@*&VFpiEKbLh*2~7a7)DzqQ literal 0 HcmV?d00001 diff --git a/upload/player/cbplayer/skins/glow/controlbar/divider.png b/upload/player/cbplayer/skins/glow/controlbar/divider.png new file mode 100644 index 0000000000000000000000000000000000000000..77cd829a4b5ef36bbc68a9182d397e04db6e4792 GIT binary patch literal 118 zcmeAS@N?(olHy`uVBq!ia0vp^j6f{Q!2%=?a-4evq$EpRBT9nv(@M${i&7aJQ}UBi z6+Ckj(^G>|6H_V+Po~-c6-juyIEHY@CMQ}PHk!=X@^516zvRnPPcblT{wuv)<<&_x Ppc)2GS3j3^P66?0001zNkl6?0006*Nkl264`4BoI2aRR!sNov zz`(}8!N9=6z`(#jfB_N)^7V;%VlFpua^R$I@<~adee!{2)Pd9 z>^C6D5DiY?6}*O*puxSQYw|CTrLY<|AuA45!{CxaFtE;Td%V}Y29@=falq4R_gWox5;Gk zz1QnWp-_-aCL>q|Tls{6HyOw_a%T?LQ3Q5aeG4PQ8@NK8l5fZGA@Q$w!`S}R=oOZ=9@p0y1Ht`O}WDJMHukChQ z?2^f(U_IanRp41U-@Vrv7~n|m!71bhgTaqht0h*v#`ZZ0|D2$?y9>b%cXb9In$4zI z8HOROeRSTAoX$;U_2Zy78V#{aBoe~+H{IQySbdH##yTITQYkS_^Vd#vT^CK$gcotp z-3`}1LY9MVJb*ojTkaIfDxOz9UMCT@Ys>Ob47v+(Zlk*NW8S%q?!UM!|5fatTt5L! Wu9z}q${(fg`vovQBD>vg^sSfI>s5DMm$hv>`<1w^YhuvS<#I8A)ijO7&aSE| zey>c^BxbkUy- z=n$|-1|iTXG?k=HNSdbP@8$0NzVf^98m^@kaq5FF@7>*dpWp9(@BMy{vFrA~n{<`Q zrfEtxYt7*cNiwel7l4wDEVx0vDH@P236%vogfVYAX+TB{%YbwNRD@Y_LJH)foLieh#$%9&W{GkB@H^i^UtVEHfBJ&L%3BN29#;dU@*9r$z)hIn>_>XcDwB0 z;NU(sk~N!64X1>K!(mn^6!@GLWvg!08Ab4#f8Z19*re|qfIcuaHRT2HCC|8{qazjw z1b*c6`9!r^os7j|JOSDE_BQi+y;*Y3sxia*V8MAR*SYmnDwUx`8i!Y9z}}Y2Wqw+A zv7ui8d!r}{2bbV^U}qnng zE}GPKt6%o`K|?o>N{_|0_Z4686?0007CNkl(kA%!W?Vx-)PQ9>AMkulK#xYKbZs3<}E2 z8D8Mb?0mm*QjmeGvUA{f;RSqdHk+afg+hXQ1&`qtJK%t2HEh!Hw!wL>_DQ{7mr;>O zL{K4k2hYF*mtj*qAmf76Icade-EM!0#bT05r6iqBOD2<%TCMhr;j?V{Dpr$J;%q#pK`g}Q9hqf7K_Cn)oN8#(P&hBKA)hjvK!Wuw$IFdJ7AY{@N#A!E0v0< z!r`!Fv)QlwU~hBICNNBU6*=Jw9Kh>xxh$hlFX0|f;fg+|@j(pZ!&V;oEw;v6DwQN2 zk4rL{l;LX~YF`O5GiZE`d|fOtY=?K=VIU9?%%CY@3JV z4m^azL?ZFt?RJZ%X~GNHI(|lz=Vsv{+2HOp*yG*kn9%pJb)&(=@Upndd3z`JDt0000Z>Q|#Vo=~<6R!C$9;PA1)G71p_B*xT0r{JN zM*B^in^wMlaaicdO+0re&Wx-n>s+%*ev^rF8_&(3{6c)?^VUzdW_%#X`}vKdWcU(R QVW7DTp00i_>zopr0QFBdL;wH) literal 0 HcmV?d00001 diff --git a/upload/player/cbplayer/skins/glow/controlbar/pauseButtonOver.png b/upload/player/cbplayer/skins/glow/controlbar/pauseButtonOver.png new file mode 100644 index 0000000000000000000000000000000000000000..409d89d29a33e6bb6d80355102cc8cbf30980bde GIT binary patch literal 442 zcmV;r0Y(0aP)At56op&03B^|Ephbj&EoA9dQnDm-_ADXfSL82b&X9lR;^LAei;Ihki*S2{^TMOi zq6sP#4}84G&AlAGxp~RmP5)maa=(vr78Euw~?u4WPm;xfR_Ud zm}4lzCPpTB1|#qW-oXdgYR_vU=9(uN@*X_!*S-P^*uVuISAA~-i@AN)c8>a2G&9+v zDR8#ittg;y$FGY*sM=%7Rz~5{(qDYcNphS=PzAwxjvbKAyS&!`)gD()Q z*K1LvX(~{v$ATab=8jq0JJoCgzCpBFtwfP!nLwEyi=s%FJ85F}#6kze%jHrOd7cZD z>#;bFg}D>fHa9EFQb=W{#cF1)+E^5YkgAPZtW6v11F~2wgj55f#o7!=ee~z^xsYn~ zwOE_cuRqkY*-R8+7zz~XF~@Oa-$UK_xN==rJkOKes*bDO-nMPAEK6#~)g=$&E4^Z_ k|MG1AS#bUjo|`VEAFXAB6%Vs^kpKVy07*qoM6N<$f}~T*6aWAK literal 0 HcmV?d00001 diff --git a/upload/player/cbplayer/skins/glow/controlbar/playButton.png b/upload/player/cbplayer/skins/glow/controlbar/playButton.png new file mode 100644 index 0000000000000000000000000000000000000000..f8d9a0079af73379b28623ec23b89a45760675c7 GIT binary patch literal 251 zcmVW5*tlL}qe;Y)GbwpWs=X&M|= z*R{`?BtunIILh-p5RuQFA1sOjp9;eemSt^2V(h#;&#^B_61c7_Mq=(lvSe8XQ4j<$ z3}YMVxf{urrYWK*f^FO4&4V*ZA#f$7>j7*~O3eRsh#VB4 z0yR_docu>ZB|&N!f)N;JBRr=8rL@vsgN9)m7GRYv!7NOGp087g&`!e!LCH6ofpyph zGaSGk7-5w|M?nY5j#?|(3~CsIW!P;r8U*jnW;1}_b~u53*n~xx6jh4APFkpiDcFF+ zYPCv2tyX(M=r!gq;23sbjk_@1b|8l-V2E3^1*he5nWQR}$|r)K@ZS~KxV7uNzIy4# zX*X;ROmJ2x6sVO_sq~6UZ@8@{Zt0k)uH7&_hwZ|7KA)%W6pO`&dcA(g?KFV4>#$rd zN8bqsgXC~H?xWGDk&lE1HI# zI@F0of?}~4`FuXI+wJ6XxgOK$^bsHG1u$?oRAQ}qdR&>!X0li;Z-GGIvc=;{D?M9% rco6sh71R66v+th;y?^lhkA99XpkgF1bCqS*00000NkvXXu0mjf9wPgo literal 0 HcmV?d00001 diff --git a/upload/player/cbplayer/skins/glow/controlbar/timeSliderBuffer.png b/upload/player/cbplayer/skins/glow/controlbar/timeSliderBuffer.png new file mode 100644 index 0000000000000000000000000000000000000000..73b371abbcac1512d073d3c540884b39853a5170 GIT binary patch literal 112 zcmeAS@N?(olHy`uVBq!ia0vp^Ahs+A8<3p*@b5ezW$x+X7-DfcIYENeS;oN1+WNkl zn_~BzId{w#iF9>z{895#l$Mqb%u7j3PfuU4t}|qNl?YE514EV*%Sy#VQ;dN|FnGH9 KxvX*mdyE3=gzFY}%KuYcKYM-B#61JM-V{-K`g{VK?Jd}k#Rrjz(R@$YqR9RV?I-Sl5s2+ z%RjL1JH1l8Z5zQ)gui25SGwf#WmyC!=O@hbOd3&)DUhdWQV=;!Q)yg236v-( O0000I*v2b^k*2QCaQ`4kWEBH1!V+-L=Z#ZMi6EpSc_TACKnNi5VexPhKHFF zx^W?G1a}Wtt_3%4Tx1&;u0&8l6gho&I5%GMZVXe4pgHj4J}&Qm-+AZUd*94a{AWQ# zv(x-dQ4Jh3p&i;pE@UA)aDaK>wJOa6 zNg|O5A$G>&@oS7>uss@$USRaH!77)?W)^pFjW2`8olb|Wh{xju;XUy@7z~R2e*dd@ zu2!pW_zTv!2X>&%@FzIgbpvd*+ikKUl}Zs}52A*gGYsQfFc_p#spKc33$irR;%;uB zztw7y6`4$CU%cDx8gee1&C(|XH`^qx$h_HXk`;+WLNrzv&*gIYdoGvTpDz>&39GWG zYW`l=b;{@S)Mzw*5{*U)v0Ja#KZL_!N~hDGA^g$n^-?mK+?;Btdbbpd#dnoTMTgNB zh>;)^3K7B&o+9(0+=@cjYAdStxrYzWGY~-I-qvb0^7(v(xCb`miB%sW^$B%>br!h` z?#E)WmmZJsq>J4AmERwK_1&_-3tgPqc^=(7zj%O)OMNTyLMQiP*_5F}b>$xBCt+t4 j8UE?-Z92oF_-Eq>i1mB;XZF-300000NkvXXu0mjfvtTD6 literal 0 HcmV?d00001 diff --git a/upload/player/cbplayer/skins/glow/controlbar/volumeSliderBuffer.png b/upload/player/cbplayer/skins/glow/controlbar/volumeSliderBuffer.png new file mode 100644 index 0000000000000000000000000000000000000000..5074decc2dae88afe4b234ef84da72c56ed24113 GIT binary patch literal 216 zcmeAS@N?(olHy`uVBq!ia0vp^azHH0!3HGvF1f=4q~?3NIEGZ*dVAH7i&;^m<)KW{ zdxPaC=YH#HYV8GqRs{|>x!@%nitn<-#9AL}*T+3we68waSVe32k7W-7*G~zO{?Gk< zj$?N6d^tbOMmy=~;yjCE99oWD&*l_xForaVLu9u&i@#sIt!}w!+{5a&csoD)36q+C1^}JP N;OXk;vd$@?2>@)GQosNJ literal 0 HcmV?d00001 diff --git a/upload/player/cbplayer/skins/glow/controlbar/volumeSliderProgress.png b/upload/player/cbplayer/skins/glow/controlbar/volumeSliderProgress.png new file mode 100644 index 0000000000000000000000000000000000000000..033c2e54388910e1dbfd01df835e603b1d8a19c2 GIT binary patch literal 210 zcmeAS@N?(olHy`uVBq!ia0vp^azHH0!3HGvF1f=4q-J`$IEGZ*dV6&v7qg;3%R`%6 zwzq5+CnP3=fFj4Cc{;&MJUcFWKM0W6_bFXlUg^{Hw;%Z4fABrLIxgGSYCre&D95GE zrw=a`33w^mm&EFA^~+`NJ*;l?k7rGI^C@xl1fU}sJYD@<);T3K F0RSF_Rr>${ literal 0 HcmV?d00001 diff --git a/upload/player/cbplayer/skins/glow/controlbar/volumeSliderRail.png b/upload/player/cbplayer/skins/glow/controlbar/volumeSliderRail.png new file mode 100644 index 0000000000000000000000000000000000000000..d0b49dafe845776f95d5258ca33abbbac92da326 GIT binary patch literal 342 zcmV-c0jd6pP)0003UNkl+NP5)kar5D&^(VgfeXQ{h&wlKTsfnN3(+7Bh=^}sPZotz zC~Zv{#_u;HqzhF}|B9wc0rb(t@UGbj$O+Zo+Aro`Y+E$g+ILFw8SW zQRoNPb=wUmNiqai08td>mSx!|k|fcu9LH%V9LMnhTmVE>)f-@=>C z<`j&<)UvEO&-3>_Tn7=|M-fsZm1MR9>)82VefuJ0BOf?)L-yw$5=7;l=U ot#`E7jhAidw^JYP!^atZ2jMqfC}m|4!2kdN07*qoM6N<$f@Z&!d;kCd literal 0 HcmV?d00001 diff --git a/upload/player/cbplayer/skins/glow/display/background.png b/upload/player/cbplayer/skins/glow/display/background.png new file mode 100644 index 0000000000000000000000000000000000000000..391152f5e2f24e413f03ecef69ed2e88030a1f42 GIT binary patch literal 686 zcmV;f0#W^mP)40?p67Wi=Xpjj(7-?hr8gmN!O+;qM2uX(UB}(Pp+ST~a5L?f2=*_{4co78 z!5dk@d1^Q&_5XNr{JeL%r`|dkVEN0DxcA|3IDXCN^V?>#xgHJ&{T;*FVSoiD*j`~j zQ>oNtyWQUQ`~7*nUf*W3*>yA;>F*TQjJ3l63rw*6iT=P3yWQ@Jt23EQ^nSmu-Z>ax zfeAJkAMY$~J+1~$7!HS*UazMZf(0hnV1yOm6P|ZG0^{*m$B9hA1RIR70<3TqR;$&m z+wCgGV1p4>fE9MO>2!MSbUKPL*kF8skH_O>Fc|3Vc3Uw98;lR|>2$)CIJa6Y#TaZb zK7pIfCUpYbXf&9U;Cj8zoCMcuHRdF^TCFlC!IesdISDS8%gjk|sZ?U_8?1`OB6AX4 zC={5J;Cw#MoCN1`Ip!o-(=_HJIGfEfC&8IahB*mNr_;CQPJ*3ICvy_)a5$KgV7uMUoCMo!Hs)Tw!)L42 zsu+U}#-~pY?_0NSu~-yiu)+BBajB+hSF_oy7=sN)SRbDcFPF=k$z)QD!3HC&j}OFm zyWKey3h8WEm|%ku)~6AG^?H51?`RjJ(Wn@Ll?YB8EI( zjq%_SSS%J8fx#WeV}Aa}hqAC6U$9oJ8Ec0@jPZPBPz&2R{=?p(uMBGaccXZ}0X2s+ UFwXxpS^xk507*qoM6N<$f{ThjaR2}S literal 0 HcmV?d00001 diff --git a/upload/player/cbplayer/skins/glow/display/bufferIcon.png b/upload/player/cbplayer/skins/glow/display/bufferIcon.png new file mode 100644 index 0000000000000000000000000000000000000000..a3819c1ef199e6a2d583e777e3d2cc9d7411c7dd GIT binary patch literal 816 zcmV-01JC@4P)?y;sBd%rVy^WSc}4ZkOKv9mlWvp*~b#1RTk?~R2kGj12jp4zB2o` zN{Xgn6F3x7p}_ax7@U%0`kL&M;}}yl!3O80&$rhCpFtap0vgZTY-_Qv&#{I|Z#Ttc zlw-(#ps-oiW}h0z*u2M31=8_ifIf?C1Mh!qEqR^H{G_N1xC!!LkL2mgh$@Ik7Y{KE zf$&|mSf2tbpbnmqI=D|UyA*AaWy{03P*aTO(YzAjk?JQyv5&z4I07f+BX|Rza6R4O zgQk}K1K^TrB}+>iWI>73q{d^3ep}pk)w`!X ziaDXkDaPaRceK9(Wrm_9E117^8{F%3I)A|5;c)meyr$n>8^H+cbF{x!Q?PtU|K^6G z$?(gl71Hua>l@nMfk)sDa3nHnQb|jGS;D-%!0{6^bRCq$zF79bWR|5QHy+QyQ}BS< zc{jc!@jeT`I>>E2lHXe1Vp}@)aMJ|`ua^@}=v%|$fr9wJu`xD@^qnt+ZEIN`8u7Op zi3*PyHb=7brG;oEzXr~k_XV&Is$`!&UjfllncbtXhoA)xNsGQhbg5DOV_F(y`8Hql zdc7arZZ`-C&qE*Evg|vR#8mwPQ3Z!WtRVEoD=RHnhqO*w$=bDDmV{{8jfeVzf#lXw ueUm62Hp-^ULv7l$Y15`nn>KA5V*dc!CLt7N=?h^10000^XU=;OqaSX}0_x6TwSF-_w!^4yr zd!@r4MX?C3H?fVZQe6Kq&e7%1?39Z}!E5x=g0er^apZDtsdc#&p$Ies2og@3_@0`5 zBT?dtMPGN_tGbf=-@W>e^876-wA%LCYU%MJ>Gd4{Y_zuJMw_1he0{b3_X!V{W%6~J zF6lL2`?~7uC7vdScW0u1`-O!^tiQKeQ&`LV+4)M(_pE|7-x6xGeqG*Et{oG4_0=*l z*NG)Y75SHo^(^|5Ghbi%dT#c#FS;}4t2W(NweXyD*4Ldq{_9~ybAI`0`99a$JT8A( z#4jIS%<$9loZKGG)0?^@Gm9(lw_QHyHt+fVMRWPhx)$wluU@L-ts3)R_+K^9yMbkPQfSuE1Jt1w|22L~um#h3JU*Kzy9s zDK0pWs4+vBdvkv9ZwF2>A2UxxL_|bHL_|b%4*;g<{of2epU<#6olZ5;oA!f`$0IH~ z91ca%tG0vp`#ruXD|*px@NT!mwYJ->A$rzk@Mg2Yt=8+cB{H-ayjrdBgG`ay7k#;0 z;(=zOXS^) zJ{%6=X028Wi9`b8(cTm{{A@c5f-0Su5 zXt`Vtkw`=i&5FE#sk_}Sep;zix*S>*sq+!i>2z>!g+c+bSWFHz40?p67Wi=Xpjj(7-?hr8gmN!O+;qM2uX(UB}(Pp+ST~a5L?f2=*_{4co78 z!5dk@d1^Q&_5XNr{JeL%r`|dkVEN0DxcA|3IDXCN^V?>#xgHJ&{T;*FVSoiD*j`~j zQ>oNtyWQUQ`~7*nUf*W3*>yA;>F*TQjJ3l63rw*6iT=P3yWQ@Jt23EQ^nSmu-Z>ax zfeAJkAMY$~J+1~$7!HS*UazMZf(0hnV1yOm6P|ZG0^{*m$B9hA1RIR70<3TqR;$&m z+wCgGV1p4>fE9MO>2!MSbUKPL*kF8skH_O>Fc|3Vc3Uw98;lR|>2$)CIJa6Y#TaZb zK7pIfCUpYbXf&9U;Cj8zoCMcuHRdF^TCFlC!IesdISDS8%gjk|sZ?U_8?1`OB6AX4 zC={5J;Cw#MoCN1`Ip!o-(=_HJIGfEfC&8IahB*mNr_;CQPJ*3ICvy_)a5$KgV7uMUoCMo!Hs)Tw!)L42 zsu+U}#-~pY?_0NSu~-yiu)+BBajB+hSF_oy7=sN)SRbDcFPF=k$z)QD!3HC&j}OFm zyWKey3h8WEm|%ku)~6AG^?H51?`RjJ(Wn@Ll?YB8EI( zjq%_SSS%J8fx#WeV}Aa}hqAC6U$9oJ8Ec0@jPZPBPz&2R{=?p(uMBGaccXZ}0X2s+ UFwXxpS^xk507*qoM6N<$f{ThjaR2}S literal 0 HcmV?d00001 diff --git a/upload/player/cbplayer/skins/glow/glow.xml b/upload/player/cbplayer/skins/glow/glow.xml new file mode 100644 index 00000000..ff58439b --- /dev/null +++ b/upload/player/cbplayer/skins/glow/glow.xml @@ -0,0 +1,115 @@ + + + + + + + + + + + + + + + + + + + + + +

    '; + } + + + function get_announcement() + { + global $db; + $exec = $db->Execute('SELECT * FROM '.tbl("global_announcement")); + $ann = $exec->getrows(); + return $ann[0][0]; + } + + //Function used to update announcement + function update_announcement($text) + { + global $db; + $text = $text; + $db->Execute("UPDATE ".tbl("global_announcement")." SET announcement='$text'"); + } + +} + +//Function used to get annoucment for smarty +$Smarty->register_function('get_announcement','get_announcement'); +register_anchor_function(array('global_announcement'=>'global')); +add_admin_menu('Global Announcement','Edit Announcement','edit_announcement.php'); +?> \ No newline at end of file diff --git a/upload/plugins/global_announcement/install_global_announcement.php b/upload/plugins/global_announcement/install_global_announcement.php new file mode 100644 index 00000000..e11ef334 --- /dev/null +++ b/upload/plugins/global_announcement/install_global_announcement.php @@ -0,0 +1,23 @@ +Execute( + 'CREATE TABLE IF NOT EXISTS '.tbl("global_announcement").' ( + `announcement` text NOT NULL + ) ENGINE=MyISAM DEFAULT CHARSET=utf8;;' + ); + + //inserting new announcment + $db->Execute("INSERT INTO ".tbl('global_announcement')." (announcement) VALUES ('')"); +} + + +//This will first check if plugin is installed or not, if not this function will install the plugin details +install_global_announcement(); + +?> \ No newline at end of file diff --git a/upload/plugins/global_announcement/uninstall_global_announcement.php b/upload/plugins/global_announcement/uninstall_global_announcement.php new file mode 100644 index 00000000..7fe1fc10 --- /dev/null +++ b/upload/plugins/global_announcement/uninstall_global_announcement.php @@ -0,0 +1,12 @@ +Execute( + 'DROP TABLE '.tbl("global_announcement").'' + ); + } + + un_install_global_announcement(); +?> \ No newline at end of file diff --git a/upload/plugins/pakplayer/admin/pakplayer.html b/upload/plugins/pakplayer/admin/pakplayer.html new file mode 100644 index 00000000..50f20ca9 --- /dev/null +++ b/upload/plugins/pakplayer/admin/pakplayer.html @@ -0,0 +1,40 @@ +

    Pakplayer License


    +
    +
    +
    + +
    +
    +
    +
    + + + + + +{foreach from=$pakconfigs item=config key=name} + + + + +{/foreach} + + + + + + + + +
    Pakplayer license
    {$config.title} +
    + +
    +
      
     
    +
    +
    +
    + +{FlashPlayer width="520" height="300"} +
    +
    \ No newline at end of file diff --git a/upload/plugins/pakplayer/admin/pakplayer.php b/upload/plugins/pakplayer/admin/pakplayer.php new file mode 100644 index 00000000..6103e881 --- /dev/null +++ b/upload/plugins/pakplayer/admin/pakplayer.php @@ -0,0 +1,50 @@ + array("default"=>"#75dc18","type" => "textfield" , 'title' => 'Buffer Color','isColor'=>true), +'backgroundGradient' => array("default"=>"high","type" => "textfield" , 'title' => 'Background Gradient',), +'backgroundColor' => array("default"=>"#222222","type" => "textfield" , 'title' => 'Background Color','isColor'=>true), +'timeBgColor' => array("default"=>"#222222","type" => "textfield" , 'title' => 'Time bgcolor','isColor'=>true), +'autoHide' => array("default"=>"never","type" => "textfield" , 'title' => 'Auto hide'), +'volumeColor' => array("default"=>"#18dc73","type" => "textfield" , 'title' => 'Volume color','isColor'=>true), +'borderRadius' => array("default"=>"10","type" => "textfield" , 'title' => 'Border radius'), +'sliderColor' => array("default"=>"#e3bad0","type" => "textfield" , 'title' => 'Slider color','isColor'=>true), +'tooltipColor' => array("default"=>"#000000","type" => "textfield" , 'title' => 'Tooltip Color','isColor'=>true), +'timeColor' => array("default"=>"#ffffff","type" => "textfield" , 'title' => 'Time color','isColor'=>true), +'buttonOverColor' => array("default"=>"#e3bcba","type" => "textfield" , 'title' => 'Button over color','isColor'=>true), +'timeBorder' => array("default"=>"0px solid rgba(0, 0, 0, 0.3)","type" => "textfield" , 'title' => 'Time border','isGradient'=>true), +'progressColor' => array("default"=>"#babfe3","type" => "textfield" , 'title' => 'Progress color','isColor'=>true), +'buttonColor' => array("default"=>"#f6f0c6","type" => "textfield" , 'title' => 'Button color','isColor'=>true), +'sliderBorder' => array("default"=>"1px solid rgba(128, 128, 128, 0.7)","type" => "textfield" , 'title' => 'Slider Border','isGradient'=>true), +'timeSeparator' => array("default"=>" ","type" => "textfield" , 'title' => 'Time separator'), +'tooltipTextColor' => array("default"=>"#ffffff","type" => "textfield" , 'title' => 'Tooltip text color','isColor'=>true), +'sliderGradient' => array("default"=>"none","type" => "textfield" , 'title' => 'Slider Gradient'), +'bufferGradient' => array("default"=>"none","type" => "textfield" , 'title' => 'Buffer Gradient'), +'volumeBorder' => array("default"=>"1px solid rgba(128, 128, 128, 0.7)","type" => "textfield", 'title' => 'Volume Border' ,'isGradient'=>true), +'progressGradient' => array("default"=>"none","type" => "textfield" , 'title' => 'Progress Gradient'), +'volumeSliderGradient' => array("default"=>"none","type" => "textfield" , 'title' => 'Volume Slider Gradient'), +'volumeSliderColor' => array("default"=>"#f00023","type" => "textfield" , 'title' => 'Volume Slider Color','isColor'=>true), +'durationColor' => array("default"=>"#bae3d0","type" => "textfield" , 'title' => 'Duration Color','isColor'=>true), +); + +assign('pakconfigs',$pakconfigs); + + + +if(isset($_POST['update'])) +{ + $license = $_POST['pak_license']; + $db->update(tbl("config"),array("value"),array($license)," name='pak_license'"); + e("Player license has been updated","m"); +} +assign("configs",$Cbucket->get_configs()); + + +$Cbucket->add_admin_header(PLUG_DIR.'/pakplayer/header.html'); + +template_files('pakplayer.html',PAKPLAYER_PLUG_DIR.'/admin/'); + +?> \ No newline at end of file diff --git a/upload/plugins/pakplayer/header.html b/upload/plugins/pakplayer/header.html new file mode 100644 index 00000000..a4a8284c --- /dev/null +++ b/upload/plugins/pakplayer/header.html @@ -0,0 +1,22 @@ + + + \ No newline at end of file diff --git a/upload/plugins/pakplayer/install_pakplayer.php b/upload/plugins/pakplayer/install_pakplayer.php new file mode 100644 index 00000000..2426903c --- /dev/null +++ b/upload/plugins/pakplayer/install_pakplayer.php @@ -0,0 +1,6 @@ +insert(tbl("config"),array("name","value"),array("pak_license","")); + + +?> \ No newline at end of file diff --git a/upload/plugins/pakplayer/pakplayer.php b/upload/plugins/pakplayer/pakplayer.php new file mode 100644 index 00000000..83367b73 --- /dev/null +++ b/upload/plugins/pakplayer/pakplayer.php @@ -0,0 +1,13 @@ + \ No newline at end of file diff --git a/upload/plugins/pakplayer/uninstall_pakplayer.php b/upload/plugins/pakplayer/uninstall_pakplayer.php new file mode 100644 index 00000000..48889e79 --- /dev/null +++ b/upload/plugins/pakplayer/uninstall_pakplayer.php @@ -0,0 +1,3 @@ +Execute("DELETE FROM ".tbl("config")." WHERE name='pak_license' "); +?> \ No newline at end of file diff --git a/upload/plugins/recaptcha/captcha.html b/upload/plugins/recaptcha/captcha.html new file mode 100644 index 00000000..e69de29b diff --git a/upload/plugins/recaptcha/install_recaptcha.php b/upload/plugins/recaptcha/install_recaptcha.php new file mode 100644 index 00000000..f3c26346 --- /dev/null +++ b/upload/plugins/recaptcha/install_recaptcha.php @@ -0,0 +1,8 @@ +insert(tbl("config"),array("name","value"),array("reCaptcha_public_key","6LcQI8ESAAAAALN1vYQovst9c6nlU52iHdqWExp8")); +$db->insert(tbl("config"),array("name","value"),array("reCaptcha_private_key","6LcQI8ESAAAAALc_oz1xuNsBVRNx554CaJHjcoXt")); + +?> \ No newline at end of file diff --git a/upload/plugins/recaptcha/reCaptcha_header.html b/upload/plugins/recaptcha/reCaptcha_header.html new file mode 100644 index 00000000..c567f1f9 --- /dev/null +++ b/upload/plugins/recaptcha/reCaptcha_header.html @@ -0,0 +1,9 @@ +{literal} +{/literal} \ No newline at end of file diff --git a/upload/plugins/recaptcha/recaptcha.php b/upload/plugins/recaptcha/recaptcha.php new file mode 100644 index 00000000..b2a1aa62 --- /dev/null +++ b/upload/plugins/recaptcha/recaptcha.php @@ -0,0 +1,48 @@ +configs['reCaptcha_public_key']; +$privatekey = $Cbucket->configs['reCaptcha_private_key']; + +# the response from reCAPTCHA +$resp = null; +# the error code from reCAPTCHA, if any +$error = null; + +function cbRecaptcha(){ global $publickey, $privatekey, $error; return recaptcha_get_html($publickey, $error);} + +function validateCbRecaptcha($val=NULL) +{ + global $privatekey; + 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) + return true; + else + return false; + } +} + +register_cb_captcha('cbRecaptcha','validateCbRecaptcha',false); +register_anchor('; Recaptcha.reload ();','onClickAddComment'); +add_header(PLUG_DIR.'/recaptcha/reCaptcha_header.html'); +?> \ No newline at end of file diff --git a/upload/plugins/recaptcha/recaptchalib.php b/upload/plugins/recaptcha/recaptchalib.php new file mode 100644 index 00000000..d4927498 --- /dev/null +++ b/upload/plugins/recaptcha/recaptchalib.php @@ -0,0 +1,278 @@ + $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 $domain The domain where the page is hosted + * @param string $appname The name of your application + */ +function recaptcha_get_signup_url ($domain = null, $appname = null) { + return "https://www.google.com/recaptcha/admin/create?" . _recaptcha_qsencode (array ('domains' => $domain, 'app' => $appname)); +} + +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]); + +} + + +?> diff --git a/upload/plugins/recaptcha/uninstall_recaptcha.php b/upload/plugins/recaptcha/uninstall_recaptcha.php new file mode 100644 index 00000000..96440561 --- /dev/null +++ b/upload/plugins/recaptcha/uninstall_recaptcha.php @@ -0,0 +1,8 @@ +delete(tbl("config"),array("name"),array("reCaptcha_public_key")); +$db->delete(tbl("config"),array("name"),array("reCaptcha_private_key")); + +?> \ No newline at end of file diff --git a/upload/plugins/signup_captcha/captcha.php b/upload/plugins/signup_captcha/captcha.php new file mode 100644 index 00000000..43a3939a --- /dev/null +++ b/upload/plugins/signup_captcha/captcha.php @@ -0,0 +1,10 @@ +generates_image($word,true); +?> \ No newline at end of file diff --git a/upload/plugins/signup_captcha/captcha/class.files.php b/upload/plugins/signup_captcha/captcha/class.files.php new file mode 100644 index 00000000..5345dd1c --- /dev/null +++ b/upload/plugins/signup_captcha/captcha/class.files.php @@ -0,0 +1,116 @@ +_error("Invalid Directory: " . $diretorio, E_USER_ERROR); + } + + // File types regex + Switch($type) + { + Case "img_creation": + $types_regex = "jpeg|jpg|png"; + break; + + Case "img": + $types_regex = "gif|jpeg|jpg|png|bmp"; + break; + + Case "pag": + $types_regex = "txt|htm|html|php|asp|aspx"; + break; + + Case "vid": + $types_regex = "avi|swf|mpg|mpeg|wmv|asx|mov"; + break; + + Case "doc": + $types_regex = "txt|doc|rtf|xsl"; + break; + + Default: + $types_regex = false; + } + + // Open dir handle + if(!$dir_handle = @opendir($directory)) + { + $this->_error("I couldn't open the dir: " . $directory, E_USER_ERROR); + } + + // Initilization of the list array + $file_list = array(); + + // Starts dir navigation + while (false !== ($file = @readdir($dir_handle))) + { + if ($file == "." || $file == "..") + { + continue; + } + + // The list will be generate with specific types, according to the regex + if($types_regex) + { + if(eregi( "\.(" . $types_regex . ")$", $file)) + { + $file_list[] = $file; + } + } + + // The list will be generate with all dir's files + else + { + // Add only files to the list + if(is_file($directory . $file)) + { + $file_list[] = $file; + } + } + } + + // Close dir handle + @closedir($dir_handle); + + // Has no files in the dir + if(!sizeof($file_list)) + { + $this->_error("The directory: " . $directory . " is empty!", E_USER_NOTICE); + } + + // If debugging... + if($print_list) + { + echo "
    ";
    +            print_r($file_list);
    +            echo "
    "; + } + + // Returns file list + return $file_list; + } + + function _error($mensagem, $tipo) + { + if($tipo == E_USER_ERROR) + { + $topo = "Error!"; + } + else + { + $topo = "Notification"; + } + + echo "" . $topo . ": " . $mensagem . "

    "; + + if($tipo == E_USER_ERROR) + { + exit; + } + } +} +?> \ No newline at end of file diff --git a/upload/plugins/signup_captcha/captcha/class.img_validator.php b/upload/plugins/signup_captcha/captcha/class.img_validator.php new file mode 100644 index 00000000..3abd031a --- /dev/null +++ b/upload/plugins/signup_captcha/captcha/class.img_validator.php @@ -0,0 +1,329 @@ + background image color + * 1 => background image border + * 2 => text color + * @var array $themes + */ + var $themes = array ( + 1 => array(array(205, 255, 204), array(205, 255, 204), array(0, 0, 0)), + 2 => array(array(255, 255, 203), array(255, 255, 203), array(0, 0, 0)), + 3 => array(array(102, 203, 255), array(102, 203, 255), array(0, 0, 0)), + 4 => array(array(0, 0, 0), array(82, 82, 82), array(255, 255, 255)), + 5 => array(array(153, 1, 0), array(0, 0, 0), array(255, 255, 255)), + ); + /** + * Colors themes for the done BG images + * + * 0 => background image name + * 1 => Red, 2 => Green, 3 => Blue + * @var array $themes + */ + var $themes_bg_images = array ( + 1 => array("bg1.jpg", 0, 0, 0), + 2 => array("bg2.jpg", 0, 0, 0), + 3 => array("bg3.jpg", 0, 0, 0), + 4 => array("bg4.jpg", 0, 0, 0), + + ); + /** + * Fonts data + * 0 => font file, + * 1 => initial X position for a letter in size 14 texts + * 2 => initial X position for a letter in size 40 texts + * 3 => value to reduce of X each new letter in size 14 texts + * 4 => value to reduce of X each new letter in size 40 texts + * + * -> P.S.: The indexes 1, 2, 3 and 4 are used only when the text will be centralized + */ + var $fonts = array ( + /* With this font, all letters are uppercase and the characters limit decrease + array("acmesab.ttf", 84, 62, 7.0, 18.0),*/ + array("arial.ttf" , 85, 70, 5.1, 11.6), + array("verdana.ttf", 82, 67, 5.6, 12.9), + array("comicbd.ttf", 83, 68, 5.1, 11.5), + array("impact.ttf" , 80, 55, 5.7, 12.9) + ); + /** + * Image Width + * @var integer $_width + */ + var $_width = 180; + /** + * Image Height + * @var integer $_height + */ + var $_height = 50; + + /** + * Checks if the system has GD support + * + */ + function img_validator($folder = false, $img_folder = false) + { + // If doesn't given, uses the default fonts folder + if(!$folder) + { + $folder = "./img/fonts/"; + } + + // If doesn't given, uses the default background images folder + if(!$img_folder) + { + $img_folder = "./img/"; + } + + // Sets the background images and fonts dir + $this->folder = $folder; + $this->img_folder = $img_folder; + + // Checks if the system has GD loaded on PHP + if(!function_exists("ImageCreateTrueColor")) // gd 2.* + { + if(!function_exists("ImageCreate")) // gd 1.* + { + $this->_error("You can't run this script because your PHP doesn't have GD library (1.* or 2.*) loaded.", E_USER_ERROR); + } + } + } + + /** + * Encrypts a word to record the data + * + * @param string $word + */ + function encrypts_word($word) + { + return substr(md5($word), 1, 10); + } + + /** + * Record a word in SESSION + * + * @param string $word + */ + function records_word($word) + { + //session_register('word_validator'); + $_SESSION["word_validator"] = base64_encode($this->encrypts_word($word)); + if(empty($_SESSION['word_validator'])){ + setcookie('word_validator', base64_encode($this->encrypts_word($word))); + } + } + + /** + * Checks the recorded word with the given on + * + * @param string $wordc + */ + function checks_word($word) + { + if(isset($_SESSION["word_validator"])){ + $recorded = base64_decode($_SESSION["word_validator"]); + }else{ + $recorded = base64_decode($_COOKIE["word_validator"]); + } + + $given = $this->encrypts_word($word); + preg_match("/$given/",$recorded,$matches); + + if($matches) + { + $msg = true; + } + else + { + $msg = false; + } + return $msg; + } + + /** + * Generates a random text, whether a word isn't give or + * the given word is more than the letters limit + * + */ + function generates_text() + { + $temp = md5(uniqid(microtime())); + $temp = hexdec($temp); + $word = substr($temp, 2, 3) . "-" . substr($temp, 6, 3); + + return $word; + } + + /** + * Generates the validation imagem with a given word. + * If the word isn't provide generate a random word. + * + * @param string $word + * @param boolean $use_done_images + * @param string $align + */ + function generates_image($word = false, $use_done_images = false, $align = "center") + { + /** + * Didn't give a word, generates a random text + */ + if(!$word) + { + $word = $this->generates_text(); + } + else + { + $word_size = strlen($word); + + if($word_size > $this->letters_limit) + { + $word = $this->generates_text(); + } + } + + $this->records_word($word); + $word_size = strlen($word); + + srand((double) microtime() * 1000000); + + /** + * Chooses a random font + */ + $fnt = rand(0, count($this->fonts)-1); + $font = $this->folder . $this->fonts[$fnt][0]; + + /** + * Sets the X values according to the chosen alignment + */ + if($align == "center") + { + /** + * X position value for only 1 letter of the size 14 text + */ + $x_small = $this->fonts[$fnt][1]; + $d_small = $this->fonts[$fnt][3]; + /** + * X position value for only 1 letter of the size 40 text + */ + $x_big = $this->fonts[$fnt][2]; + $d_big = $this->fonts[$fnt][4]; + + /** + * For each letter of the given word, decreases $d_small of the size 14 text's X position + * and decreases $d_big of the size 40 text's X position. + * Remember: if you change the size of the background image, the font and the text's size + * you must manually recalculate those numbers ($d_small and $d_big), + * so the text will be always right centered + */ + for($i = 1; $i < $word_size; $x_small -= $d_small, $i++); + for($i = 1; $i < $word_size; $x_big -= $d_big, $i++); + } + /** + * Left + */ + else + { + $x_small = 2; + $x_big = 2; + } + + srand((double) microtime() * 1000000); + + /** + * The background is already done, so, create the image handle from done BG + */ + if($use_done_images) + { + // Chooses randomly a theme + $theme = rand(1, count($this->themes_bg_images)); + // Start image handle from file + $background_image = ImageCreateFromJPEG($this->img_folder . $this->themes_bg_images[$theme][0]); + // Text's colors + $R = $this->themes_bg_images[$theme][1]; + $G = $this->themes_bg_images[$theme][2]; + $B = $this->themes_bg_images[$theme][3]; + } + /** + * GD Creates the background rectangle + */ + else + { + // Chooses randomly a theme + $theme = rand(1, count($this->themes)); + // Start image handle + $background_image = imagecreatetruecolor($this->_width, $this->_height); + // Alocates the rectangle's colors + $fill = ImageColorAllocate($background_image, $this->themes[$theme][0][0], $this->themes[$theme][0][1], $this->themes[$theme][0][2]); + $border = ImageColorAllocate($background_image, $this->themes[$theme][1][0], $this->themes[$theme][1][1], $this->themes[$theme][1][2]); + // Creates the rectangle + ImageFilledRectangle($background_image, 2, 2, 177, 47, $fill); + ImageRectangle($background_image, 0, 0, 179, 49, $border); + // Text's colors + $R = $this->themes[$theme][2][0]; + $G = $this->themes[$theme][2][1]; + $B = $this->themes[$theme][2][2]; + } + + /** + * Allocate the texts' colors + */ + $transp_color = imagecolorallocatealpha($background_image, $R, $G, $B, 100); + $color = imagecolorallocate($background_image, $R, $G, $B); + + /** + * Writes the word with transparency in the background + */ + imagettftext($background_image, 40, 0, $x_big, 45, $transp_color, $font, $word); + /** + * Writes the main word + */ + imagettftext($background_image, 14, 0, $x_small, 30, $color, $font, $word); + + /** + * Prints header and the image + */ + if($this->image_type == "jpeg") + { + header("Content-type: image/jpeg"); + imagejpeg($background_image, false, 100); + } + else + { + header("Content-type: image/png"); + imagepng($background_image); + } + + imagedestroy($background_image); + } +} +?> \ No newline at end of file diff --git a/upload/plugins/signup_captcha/captcha/class.img_validator.php.bak b/upload/plugins/signup_captcha/captcha/class.img_validator.php.bak new file mode 100644 index 00000000..70c5a597 --- /dev/null +++ b/upload/plugins/signup_captcha/captcha/class.img_validator.php.bak @@ -0,0 +1,330 @@ + background image color + * 1 => background image border + * 2 => text color + * @var array $themes + */ + var $themes = array ( + 1 => array(array(205, 255, 204), array(205, 255, 204), array(0, 0, 0)), + 2 => array(array(255, 255, 203), array(255, 255, 203), array(0, 0, 0)), + 3 => array(array(102, 203, 255), array(102, 203, 255), array(0, 0, 0)), + 4 => array(array(0, 0, 0), array(82, 82, 82), array(255, 255, 255)), + 5 => array(array(153, 1, 0), array(0, 0, 0), array(255, 255, 255)), + ); + /** + * Colors themes for the done BG images + * + * 0 => background image name + * 1 => Red, 2 => Green, 3 => Blue + * @var array $themes + */ + var $themes_bg_images = array ( + 1 => array("bg1.jpg", 0, 0, 0), + 2 => array("bg2.jpg", 0, 0, 0), + 3 => array("bg3.jpg", 0, 0, 0), + 4 => array("bg4.jpg", 0, 0, 0), + + ); + /** + * Fonts data + * 0 => font file, + * 1 => initial X position for a letter in size 14 texts + * 2 => initial X position for a letter in size 40 texts + * 3 => value to reduce of X each new letter in size 14 texts + * 4 => value to reduce of X each new letter in size 40 texts + * + * -> P.S.: The indexes 1, 2, 3 and 4 are used only when the text will be centralized + */ + var $fonts = array ( + /* With this font, all letters are uppercase and the characters limit decrease + array("acmesab.ttf", 84, 62, 7.0, 18.0),*/ + array("arial.ttf" , 85, 70, 5.1, 11.6), + array("verdana.ttf", 82, 67, 5.6, 12.9), + array("comicbd.ttf", 83, 68, 5.1, 11.5), + array("impact.ttf" , 80, 55, 5.7, 12.9) + ); + /** + * Image Width + * @var integer $_width + */ + var $_width = 180; + /** + * Image Height + * @var integer $_height + */ + var $_height = 50; + + /** + * Checks if the system has GD support + * + */ + function img_validator($folder = false, $img_folder = false) + { + // If doesn't given, uses the default fonts folder + if(!$folder) + { + $folder = "./img/fonts/"; + } + + // If doesn't given, uses the default background images folder + if(!$img_folder) + { + $img_folder = "./img/"; + } + + // Sets the background images and fonts dir + $this->folder = $folder; + $this->img_folder = $img_folder; + + // Checks if the system has GD loaded on PHP + if(!function_exists("ImageCreateTrueColor")) // gd 2.* + { + if(!function_exists("ImageCreate")) // gd 1.* + { + $this->_error("You can't run this script because your PHP doesn't have GD library (1.* or 2.*) loaded.", E_USER_ERROR); + } + } + } + + /** + * Encrypts a word to record the data + * + * @param string $word + */ + function encrypts_word($word) + { + return substr(md5($word), 1, 10); + } + + /** + * Record a word in SESSION + * + * @param string $word + */ + function records_word($word) + { + //session_register('word_validator'); + $_SESSION["word_validator"] = base64_encode($this->encrypts_word($word)); + if(empty($_SESSION['word_validator'])){ + setcookie('word_validator', base64_encode($this->encrypts_word($word))); + } + } + + /** + * Checks the recorded word with the given on + * + * @param string $wordc + */ + function checks_word($word) + { + if(isset($_SESSION["word_validator"])){ + $recorded = base64_decode($_SESSION["word_validator"]); + }else{ + $recorded = base64_decode($_COOKIE["word_validator"]); + } + + $given = $this->encrypts_word($word); + preg_match("/$given/",$recorded,$matches); + + if($matches) + { + $msg = true; + } + else + { + $msg = false; + } + return $msg; + } + + /** + * Generates a random text, whether a word isn't give or + * the given word is more than the letters limit + * + */ + function generates_text() + { + $temp = md5(uniqid(microtime())); + $temp = hexdec($temp); + $word = substr($temp, 2, 3) . "-" . substr($temp, 6, 3); + + return $word; + } + + /** + * Generates the validation imagem with a given word. + * If the word isn't provide generate a random word. + * + * @param string $word + * @param boolean $use_done_images + * @param string $align + */ + function generates_image($word = false, $use_done_images = false, $align = "center") + { + /** + * Didn't give a word, generates a random text + */ + if(!$word) + { + $word = $this->generates_text(); + } + else + { + $word_size = strlen($word); + + if($word_size > $this->letters_limit) + { + $word = $this->generates_text(); + } + } + + $this->records_word($word); + $word_size = strlen($word); + + srand((double) microtime() * 1000000); + + /** + * Chooses a random font + */ + $fnt = rand(0, count($this->fonts)-1); + $font = $this->folder . $this->fonts[$fnt][0]; + + /** + * Sets the X values according to the chosen alignment + */ + if($align == "center") + { + /** + * X position value for only 1 letter of the size 14 text + */ + $x_small = $this->fonts[$fnt][1]; + $d_small = $this->fonts[$fnt][3]; + /** + * X position value for only 1 letter of the size 40 text + */ + $x_big = $this->fonts[$fnt][2]; + $d_big = $this->fonts[$fnt][4]; + + /** + * For each letter of the given word, decreases $d_small of the size 14 text's X position + * and decreases $d_big of the size 40 text's X position. + * Remember: if you change the size of the background image, the font and the text's size + * you must manually recalculate those numbers ($d_small and $d_big), + * so the text will be always right centered + */ + for($i = 1; $i < $word_size; $x_small -= $d_small, $i++); + for($i = 1; $i < $word_size; $x_big -= $d_big, $i++); + } + /** + * Left + */ + else + { + $x_small = 2; + $x_big = 2; + } + + srand((double) microtime() * 1000000); + + /** + * The background is already done, so, create the image handle from done BG + */ + if($use_done_images) + { + // Chooses randomly a theme + $theme = rand(1, count($this->themes_bg_images)); + // Start image handle from file + $background_image = ImageCreateFromJPEG($this->img_folder . $this->themes_bg_images[$theme][0]); + // Text's colors + $R = $this->themes_bg_images[$theme][1]; + $G = $this->themes_bg_images[$theme][2]; + $B = $this->themes_bg_images[$theme][3]; + } + /** + * GD Creates the background rectangle + */ + else + { + // Chooses randomly a theme + $theme = rand(1, count($this->themes)); + // Start image handle + $background_image = imagecreatetruecolor($this->_width, $this->_height); + // Alocates the rectangle's colors + $fill = ImageColorAllocate($background_image, $this->themes[$theme][0][0], $this->themes[$theme][0][1], $this->themes[$theme][0][2]); + $border = ImageColorAllocate($background_image, $this->themes[$theme][1][0], $this->themes[$theme][1][1], $this->themes[$theme][1][2]); + // Creates the rectangle + ImageFilledRectangle($background_image, 2, 2, 177, 47, $fill); + ImageRectangle($background_image, 0, 0, 179, 49, $border); + // Text's colors + $R = $this->themes[$theme][2][0]; + $G = $this->themes[$theme][2][1]; + $B = $this->themes[$theme][2][2]; + } + + /** + * Allocate the texts' colors + */ + $transp_color = imagecolorallocatealpha($background_image, $R, $G, $B, 100); + $color = imagecolorallocate($background_image, $R, $G, $B); + + /** + * Writes the word with transparency in the background + */ + imagettftext($background_image, 40, 0, $x_big, 45, $transp_color, $font, $word); + /** + * Writes the main word + */ + imagettftext($background_image, 14, 0, $x_small, 30, $color, $font, $word); + + /** + * Prints header and the image + */ + if($this->image_type == "jpeg") + { + //error_reporting(E_ALL); + header("Content-type: image/jpeg"); + imagejpeg($background_image); + } + else + { + header("Content-type: image/png"); + imagepng($background_image); + } + + imagedestroy($background_image); + } +} +?> \ No newline at end of file diff --git a/upload/plugins/signup_captcha/captcha/index.php b/upload/plugins/signup_captcha/captcha/index.php new file mode 100644 index 00000000..403f2e18 --- /dev/null +++ b/upload/plugins/signup_captcha/captcha/index.php @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/upload/plugins/signup_captcha/img/bg1.jpg b/upload/plugins/signup_captcha/img/bg1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..11a9448d1e9db0ee460f0767f302e5bf306166a0 GIT binary patch literal 3801 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 literal 0 HcmV?d00001 diff --git a/upload/plugins/signup_captcha/img/bg2.jpg b/upload/plugins/signup_captcha/img/bg2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..560d09c02d2c97264cad4620ea57bb2407e6f687 GIT binary patch literal 2558 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 literal 0 HcmV?d00001 diff --git a/upload/plugins/signup_captcha/img/fonts/arial.ttf b/upload/plugins/signup_captcha/img/fonts/arial.ttf new file mode 100644 index 0000000000000000000000000000000000000000..ff0815cd8c64b0a245ec780eb8d21867509155b5 GIT binary patch literal 367112 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≺9Wiv@#qpl#qL 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≪P+Tw+*$qa@!i>|Uj$m6(YG+< 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 VQlm?y$QD;A35 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 literal 0 HcmV?d00001 diff --git a/upload/plugins/signup_captcha/img/fonts/monofont.ttf b/upload/plugins/signup_captcha/img/fonts/monofont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..ec6c51b2640bafbf046060a8e2b594905dd5e7dc GIT binary patch literal 41036 zcmeHw349z!m43aRp6YsqmgEGU!&8Ot&wH)yK4%Ne^jgR9#%^$%`+-R$3;#P>V! zy<`88v18%u%a1U2Q8Qz-zz7N zoVaB6n-vc*cAF1;8TDJfdt~gAW2TT4!~ONRKX!EN$oO|^K5j-H z^+{`w%^W|mw{iSSjO}}#G1vNIv*X9k{98At2X(T8NJW&yQTuFVwb>joAGok| zFC+g@Hg9GQ_Ix(4Fe_QId98dCBiV|wIsIB*qhHHw^lN#Iel4%jujMuRwY)~ZmKWt$ z_t&&^cX!8z$1aTxj?Iqkn;MTb#Ac_pY-V!i#F4S7>BjvtM_4uMXEm&ab&G#7Hq6G@ zr7Xqy8f$56Zf4t1-Yh!~DtLu4w5Ji{ zqxn@H2lF$;>Q4>CK4PjGNQ_MuB_{W-Y?$9Y|9iSsTEj*`^e(mqE$d<%Suyp}esa~@>YYPDEQCP^ZK2)*@_G=KHLQqx_5$o+~>hYZA|Ea0xEWVuWVJ*$HcJfmw(z14P>?4`s9bMkePch5#>POu^HkgT$-=7JfVu@rElg$pdVzH1(GLb{C zw%2o(n$C*)8XL1UI+#DdMnA8yGvQ791FDj!NG03bI?}D-&`Y~^DGqmWvD*>lhp*D< zvoA(`!Jsb^sR{WxHK%Dig(RQg#89SGa6+R6>`=_A0{)w2&IhwbPgA%D|IcHAxd00& z(VkY3DAd||xTS@*Kk>v9sB`|ukdF^Yr7X(IX*lyF#bTK_D=Udc!Xcm6<#bprU`1J3 zxy@<|1w(eL-4XByyk4Kj?Fj}$4o9%Gq_oUhR({Ua+!GeN!|nFCT)COHx@m6rItl9|+KQ8?f?Gndn5Rm^79RPJ%hCUcphMv6nG zpu=u4sYI@99|@j#&W0f!B8wwk+i3Zs`1i8qiz1(Q=GXOWMt8ceh&Q{gg7 zw|2C*rIJFnJKNL2P&m;@i3%kc2#3NUnz*j<3foS(DpHzUvd^+)Ak%nC-C?STMiWcM z97`U0TXbZr|2m3PCQIu}n$?D_eHYlaZi!q~T2mdZDQ&hkGV}Z+^S`F&qz%wTP8Mcy zR>!W*ETQ`POapV+Y<4TOlG7~9Wu?_A+3!Q+tSs!36BRL4@~E|{8m&@oL8r~+utQ_{ z^x@mn+XJ!C+G`9OU4vZP==!4TWf$*Yy-R(pKA#Qs8XFQ7%cw2g8njcwuLksQ)ZUh; zD5XHUH81zvp{c1uXa1%6U+$U0hf3>eYwPCj=f`80UAFf0X}aa?1JaH!oIZ{G+&k9} z46GfXJ>tYn^FId<-Ysp!%pS*_c4MZGYHKrfED;L@C5#9g3kHHAODJ4a#KJg)ix_5Q zG*>E<9Tmm0uS&L5D{@qIyJcujB8$$3-X`ANT#-R{p5^VfTt-hC{&axhb!Jk~VO*}h`irory5Cma1m zi4GcG7Ar|EU)$2S;^Gx6mUgXM*}kd&_{iFww4=QwkZi4+`=={wdrBI)%s))q*$;(w zT%PffEN9G6lrp9TiMK5$*rH$c4kRY$6E1VY{ZNBHY;A=KM5!m|_fk|^2RZ9OsWw~2 z&SWOZs?}s>`f%y(1*>vGp)y;3nKoV~@dm5lLnlSIZ(lw+DS6&;-+gy3ef-m({$$}= zRFhd|7L&xtl~z>|7F7YC9Couw7lS4!fjnJyPJg@eo9GrzRKsdYO?9R^!>P2|Nvkg( ztxu=xM=$ptiFQSg&{w<@skgi(HQ`;p{?=R9^BxP~aGIWEc6KmRPYy@MiL8qhv&&>r zWvF=rrYxd#QlfRH5xejVsH?zv1~u zly^0IknE(QygYd{{}J+7#iwQaHP<{iic*C|0^85dIx}vKXUwcvL8p=xlO_nG&IF|Z z6FLJJme~>cGE9wVw796GwYaLPIFd}Eh9mPIrv#+L#MWj)Iv*sHmD_bD%)JIfxO^1Q ziG_GWri7mo*EU@%4V|5k?u0GV2;H?$=x;ycwoD+92{Mn{Y?kddvz7T2$*HI+?`~Na ze@!QyW6sGekl)P#(ana=RdYIb-(C2O!At0V^vNfG@Wd0}d1h+rnMt(wFxpim4KOp? zlSz`IWYA?WV* zwsiAGRkc`>PuUXOhFkP32yP$6p@v4wLDTnzEJ2ipPgKdoQV9T3(ch zMan8^`}p;tF2VQtUkSc@;LGmMR8u^jsbJi(bT}<`J2&WxWs6s4LDlIlRb+>qw?P-N zUXTyILcF-GVu6h&jPRU*#q(Pb&uam+U@xUrP_4pRMJt4X%B79QQ}yfC)u%d+PruP& zzj=?#TVC#UX~%~K+q;*xZP+;V-52PAcu{F-aXemJR$hd@XhDbUL0_2J?o5@YOSq3J zJQk=E=uX^#QO(sT%o9Vm!R`d-H8(_~K5szF1yl)FsEKyk^XZBAKPvT~eUiRE4#)_0 z|8HRT53wMtfZsd{8q(=Z8w=PRa*0n4mDI_WP(o(Ksyn5YHz_hV{B$;Aq;gqUFiLYg zOy~13y^x1__FX8|20m(LU1vx5T&_-}>NaesORZkEd1e3bvemm1u~?$2yv*;FJpPIp z{6-x8UOrgcT86eax2#*WYd3~w^ZoJG)_ANn8h$nrDJ_dsh$F@;@G3fp_WID?eVG&` z5}8T{vmcrpV1z75rl@T9%dA{At6>FpF6K$Qu0nZ(Us-JIERo;j1aC4yjV3yEt5yj6 zd4hAW^Y~$i%=)TCb^W^ab=7;^-m-G9+wCnc^SbHnLlfV7ftu?#47M#<(!L&YQ&wCd zWC*Phb35Gu-4kJ}GDQ@PW=deJnFAJCv4<6}m*A}E-6iz@0$bL?qWKg@ImHVwhLATm z^@l?*J6*-aE~jPza4P^`Xj>L>sIH#-QZ$*0M5;qRP<95kkp#*d%)?e>g5>pPe3-2j zvy;Ipb6F*F>(&RCpq{fi)#hg2e5$+}9}N>E95QjcNka7{C7cAQab+3ENNIJ?{q|el zZ=;jJ5i6adk1_=wZ9S=K#-hPLFyPVIRx_{<-rZ&y#*l(Znh!J%2x(+BH5p?or+vAW z%T1fa)O;EyXO9tqSi;&KC=48GvG*w9fIw;1!GQyHJ!y`FgIYd z!$x4L1WZbxQw9mp{X)~`jB0&!Q6W4g-X0Gk(doH&&;gz((EF3#SLFmZTCBR30W2k3 z!3~9(&D?VM(>PIOZU-~Wf)i12V%Ou3tUhz&>PNtdZs_jq(q?$!mBNCms>&oW5&B?& z1GF`ls|uz`pH~T1C?#$s7%a*8+q!We#8~sXa~713Rpoa`l_oe~t5OQEstpDK*VvjF zU=mPT)~KcJrBZw8uIZ9+o%urA(AT?Z%IS)536DhS@va)Fvpi-mZJVtOSM>C4+dkJ5 z^#!XT>D3%#D*?`RLfXxivGwfIOgjw@W;U<}OJg{&N_LdWEG4)3&5q?}7Vs-dv8t?5 z6#T`;J*8C} z`dS@b{k4^QJ%Q?$6&q{gS6gfzi?zC}+GD0myIV5F&i)k>-RXhW)Dx;wKG52-y1lPC zwX}1^wq={TO9qNEkFM!i)3jt$?-9ShSS>x;KN|-xBN&6HFdM=l1}{6vZqGQF)n>uW z2jR4E;Zz}<7%vj+DBP^#PK#o~*ug*+!#4|L_J%P-f|0o?a=|dpv!m?!ytH#(0*3&$ z=1-eaDxI3~?+Hwto(Px6cJG$@=Pr5pVT@pH7U_pi6%bZbon}SZ9A-<<%p%2JlLu3Z z$F0i6MXJvmjVORwg`t;o1^C$J1oCMdXALwnY;sdUE2@sXSrZnsW*r5AnuW6&SRe=A zao-14tlF^SNL^Dn*j#UINTyoiLI3^tOZ{8=H?>v2qp9kFswb1J50?}}E2LlrPQi~T zXFD<#6pLlz%*|i{S}jo1&TMLPor7dnQgkU&hbeF7O-3vdZTe$>mhI55^7ah5XjZ=6u%)2U4Fe z0X{APRRO{2AiTj8_zb4g)IINg?>&2+p7_d@%O8DM$~^L&XDTD{xf9@II|OkjD6+F7 znWii%f!djwEUKA+Fq_Qq;^FPU&`>0+1zh1v0GMmCDz-N(t02#i29XaNR03(qr&53u zH6%>vG|cEU?VS5IB|mff?VpkQcil3IrNA6rR#-aK8WLq?W=t{w{>>aGv8Y%Qv4AKO zs4}Sv8TeF=AWb$k%5;_$#H&CA2!T~kJ3n*JJ(HBAAKxGP%NqUQ`^hay4ENS6DCr z<613Xi~$yL0aJbjXs|UAyK^aSkoT zj6VXp9Ad;eof#L5Fu*pP1_#5Sz#y^1M=La9vsC1%8WVHoj|HbbV%xdX4?5B`^1+$I z#f_c!KJ&vvj?iwh?&2~CLiU0N8=J-`6*G&9dKuQC1j-Hm5T8e|B4&pDfk6vyi77?L zlQ5-dYh&R&k6bvvSsf^|LX(Nf3$}PMozUJxyC)~N9X?3zxnE!|IZLLw7eUz)P__+} znb}65tO8F0as;mrS_6ZV&wb}83rM=omR!G_4Q!s8uUO=heFC zJlc#dIv;9}Cqx(d!K(d-4j#N{>;P?^dl(FRh=#d^7l-zmf%fu1e{tkd=&xu5Go{aK z_ONnA4slJD=Nac*t^AqBQb;Fdmvo_&gmIIxmdAj@afuJG5zLeVD|CCY)Ctj2%yu*LdJNks z2a;#)CYYW=7v&JALMS1O5OgUp9AQGjAb}k+d4Jo)yM}6$Q)NXngzaqu@K1@qy|jHKZEr&JOTfQ!h@l zjr+ow7tU8PnhBsWUqjXm(LEoyhN+t6KXA>?HenLd(aR?$Z{O5dcig(ID7xkQ-#7F zFPv61iPv>bq17l^7r)kdF9*^n*02Bze~&Wcw%Q~GW}Zp z771oJUnW&8@FT$yKJnS@0&d0Xp$$f`YOz?XnxAR2V)836MD_R&eTkb#b0D7=%aH>m z9mo5dv-uvSp)2?Tq z<#m?ea6*i(!$8fn(UrxhFwDq8u#OaHXo(cq1q#eKzF>I{EX~am!!FQ3vz)#F^Ye)k z;Z$VeYfXTsPki=cbB}%QG0;@LkA5UplU_GJMuBt2yXIYiE{V`#kSA3VMv?*FagPdA zDs1sSk^=x1=^>1XB?*lZza(_%}oE}+b0b4GzIQhyY`NIGt#~cYA&Zeumz() zNP9DW4I!1VbO7<<_FmTN#d4Hb)i;DnE~EyyKy$OM``EGWD~D;%HP;{-j#%q_Kkc4> z1N)O#w9OpY+&%YAs(+G?>{Zh1$t=Bqa=Wpn%_BD?gguBZ$?K4u%&`Ki@BVZ+vFgb1 z7U_kfn6s0Z6%PTgwqt(Tm#GmJiKDdGRi>Ezz?kh=T1`5vswb*eNNTu3@{rR(R;Qb`<&x86uboIU2`tkZ__MdLL7yz(^44f{+XimJ5=rELIXIN`_jC zcI|R)?^<71v!tt{zr{Tg3YRr+On2Ssb9y4dlI3q0*tn{*yD}a-Ss!f)MN@TyXj2?* zn!(7?);g-Sx!w**k}XlY4XRJ9bI4)U>4YPM2nxzKVKIWTW-PZwc$5>oYhAOviYd#- zkyqHVS)))iR6~4drmQN{-*myQhQ7K)iOVtO_9v48w>yBN>r1P9*6)UwIQN^~H5JV@ zb@hqH#zaGXWm8inmnDHApofZuHjG3vQC94Pi6tvxMRF@P8;>N_Clj4=F`Z=l0hmI* z;)#ekSDSG))~nf05wz0Y_QBzn`udjP)#>(VqP92?D6XxEwl3>ix@}}>UwTb>D&E)- zPr><@SlRr4(JVO4S0g#r66dRtF3Af|ieViR=#+<*s&Y_uc-$t31U6$N>+3QQ96F1)M&AF%lR+KHc85>D*Bf5yV3L%&(g88_}=aU~&5%$N2gGv{lH3f^SYQh(^Ob@p+{s~x?x$gCEhxVz)2dlz@DW|kAT!%-REUDVd)S#+L#YIw3vJ>>2jz{Qnla(CE4QShjtF6TDlKZ4K!4hx$Q$`=a{F8?o-PFD&hA`@}?D zqNTe2s;=PnO;0x@nwk>z4T)xL%<9Of7qKc;8d8e|N!bgV8LWo}l5@I;uf6F*f*Ugs ztgJTW9iX?#QUI;RaDdi?U#=^jAnhD&>lz(x>#GaLnxJBU07QI2uNaUAuFpP zD|Sc=M}oKw??7a-$!QKc6f*#1IpD_{Wia420gr@>?DP91XnTZA>7rto7dhiT>n&$l zUr12=xwX^~j~L`}W#06Bq^KwwEh>tvncKGQ(Lu>poJ05y(o^g$3VWK=Bk8DUoPI@_U%wWK2&6xll8jE5elw zSLntRRg$k7ON61AA8Z~n1roI!AZ^tEwibu0s0d5Jpxbn@yT`eqYWQK0&V$bd@qd5k zSQqsQ`%TAmZ0xE`Paf`;wX|(EW(D?i9tZ~<0I@QKJ!Cj4kn|i1mv3w4=BUDGobZ>u zSR14LM-PvV?w_1~>M4lFdmiNRjyx2)9C|ztiGxoGlN+I2fK2(K0@vKS%cL2Zf}?rN ze1$+RFptW24L?Lb=4hlA$@q4bU>t|5tjtugk`Ts&-G<5%%;%N;9RKhmrY%w)k%9rq z@3UDE0+KU2#313ls1v|7mC#m(2Jo}W{C=(E{mMrR*S8oieAtM^QCPp4$-zUU!l59Y z9<^AV;Y`SBvyARAdwij)khQTm>2?0hUy|7U+|PzEjwJ)5KO5?<0A<^EzX2ns6v*9i*bHvqo~tv(6pLY%t4OwZWLBcc0ibq#F4nb< zZZzbgAqy^Q8RJ4T($3SH$LpFlZ*H!wZQi`Oscy`}Z5!Zq{P>lvOZ)qmZr!>Rk;z+Y z9&Oygl4N13tJ7bOu~W?wwh#7Sw7+ajjeXR1%bFP+@eTC zJv$vXfaFdsS_2-EJ_RG581aqb!{=RN+{vs!v~z{p4t8sMcRG_;((2wZS{bjl?Q+qr zySLBHK3CD*)U*@zuYlBUgw*CCbYXL;?1dA;5jrgBMAQI+^8x`5qv!wtq*qvxLLne9 zE9d?E;Rsy_5$Cy07aQ00TxP#Osq{zc*Q<2{UFkLE5w*fs)VR*pcyj5$MU7EkS+LR^ zThcYq*-Et$Z)vbX<=`h9oSy?~_Ir39$1`nW4-~RygpFh6(e1L6%)JkQpIE5HVkB0` z6)eMuT{qmRHmrEQ-ja=h$y#LEQdyp|RSImCGQ*o%#wRNtwT(5&0L-zKhnf&uzN@RN zwpU6t{bbwp^tO-IfYJ`|`a(Jb4Z-m|k0;~B!U9%4Tu#}|u+PQq!U_myv*B6fru;m^ zP+^{YMe7m1g_!S`A&eG57&y^|>sPN?H`?AldehqB;k9$W7#jKoD2Rb!$3TICwXq7# z3kR@M5UfKec%H`0hgb~z=+!{FW3$t<<11ItnYme{-}A{t!(^9NtXaQ5*4i55Ro`_No%uFCTuwwBg{Ymcs|bWp zN9Y9hCY=wDi~9Lc%b(~Atu}E)BE=y#l@5+~w@*#&-{00YF@EOE*FJy!^-uHKETGR;_-Z;VEOCkFyvs|quywkB?hRbl)#s;nfcMv5dns9VQ9 zh-1oHnp!Y3N8WSYo%ROp&YE{Ou5?5qj!aQ4w9rM)2J6;vf(EGATQk}k z_WOLkaO-G;CkR!;J~ZFYo`=O}5*S!+4-f~FFzWTG2@sgDtg`lUp-n(xDEH^Px}G#) z!)T6&wXoP5sID$kkBjk`)8sHK$tn|^pOUEG&iFHEZB$7asun>f)9ojF{*&#w5I^kX;1Dmfs-JvlsOs(eik~6U0=CLLmImU&$ zJDlE@chW_U2J4n^LT4E`<_F8_y}|S+B89FNdOH8h2H^urqv1XT41`Fht`62c)-Gl!0AtE-U?Z35SRP)YO-F!Px zHk=nUK}@sLx9$kp3rr_s=dCcA0oZ9cmcH{gs%^jh>fAMw3vsZBK=p^TowvQx8QLuU z2zoUvB&(<>Q*5%DO>Q`u*sDT8O|m#+#Cn=eK#&#X^Q4IL1feHz?Zg1-NaW?IG!QEf z24b<>v~#)iqhf!cs3_ns*3JPQVLk<{G_?RL1)Bs`s_#?cG~~2JAkRWxLDtm{a!zUUJyb779t)?mTe9d;YBKCjr=Atk)y47Fge#zhRtLx zurCM7TWfl%9gqc-1LWcxrNzrKHU5ZK30Kybm6DXJySmvFl*+@EkV+n1I)q)%9|GSK zBBq}ER=!+xX_*mS8dsu-E{#GBWc%V(gG*TfS1Jtbgby;z@L4Q3%>#^*e!iBU?X&Ll zLQA9B$kNDpfu;1tXiAGKouALH=)C|u8t^BqgMP*eT)jQ->QD812|JX|znAci2;=IH z^n2Nxb5~6c{VE+pof6jPwFm+?M$_9ftHfwhydE#s@5Ejwz7hm`&Zc51oB2F&>R{sm zWy5AHf^7%KPcb{}3g2XHLMT0lc=Bgau2O~73JC--AvV77xk8)CwAFk=KI8&JGu_S? z(zuPMC6n6uM1z0g^tXrb`EW_eC?RH(hr{io3-2}Y)~6u3JnAutf1Im#i>n$=#d!@l z(ctyDS2bR1S2?f6y;)vsS2U+$qVkkKR-tD=25hSgZLMS zR=4n$(Clw``?S~^&LOJF_cc!r_!*|D33GI|jW>StwvCZo-JF58RV~bo?7Q}9A z#5sG!GJ#=(@IBTXWEY!I__)b4@rWh!r;Q|^Hn0gStB1G}#kAVV?}FVpWAx+-^lrGA}jtNAXB3)}olbR)e3n!lQ*+2x2eZEMT47nk{6 zHdb3xSzhe6RY%O`M%i3liB~<;tCm((a;V-CRZ6PCpjWEE45mBO!m`%lokc7ZpQtsi zYgPUYs+VU8)rY?^^=Wz;nP+MQ$m<0_}G}sI>UUX=!Bu;rgj`P%i?2>-kQ#q z>O{0Ef55dS-hR}UNT?e_{~@Suet#RTZ-U2x`!QNo zIz0c9xXv}@X4rMOKF{xe^ZdNHE|5k+|7K3VAuj^&6W0;AmnVzMEM z$TN?0C2T2RdSn4S-AT&Z!J%2Ge!hSDm61r_bxqg45*kUFvp)h0?b8d?J4Q^`JIoGsubSV-3w|u4`Pz+Xx^HtLY|Y#jc^079FZZ zN?18uVo?#p&f}U9G7Bd{07*IBso5DEMbbd>{CJQ;5uy6>46PQ+GR9hr7xT(V*biZ> z*}Vbl8T|bju5ifjbDLe}qKY^GuHqtdFn}E(p`gN&io|zQVC#?1TdLSyPLmxTNO%Fp zC02ipsh4~5V(n48lA}{8u$q^Kj>&~G=Io%92Jz?ZwRkp?7>Y+C@u7;yJ*)6}Oj62Y ziXTNat44uURkPVli+Deb zFI-ZD7lJ4;zZ`dXN|*=BWNNG=s7A_ES4xo*ip^z{B6*AQJ=$ABxJuO;r_E;^s?04L zD+S&YvtR>dz79q6H5CdC%Tcz!DM{9q#p7jlsgm;Qy3z{iEf$|6u)2DAYJ;t)$g(k7 zQWA~TwJqJhe@RV!igNHCsE{w@5!d*w+Uu`;fGUlCZtG zuQ-qilkgSYvNb51e5&FAQA*B>(gFpbD0J;$E#NWwb?*acb2z)X7E^!n>10<|lBc4| zL~&6fVRE!oC0kmORW0S^MMX&A7~0z`U5`ll7vSBk1~vRW3sx&Bs?(!liwzdQu)k6F zUeRWZEc9c}f20C_oL{^?0JC0NfD@SSRHfG~ZLc`!uW+~;L!pXEZ`dYFH|%e3&lKA` z{0is$jr244liz>@>hIS;ln+1|!(Yp*wP1u#xHEMlUauiNiT7)uclGjA=xHYH0OxyA z!)j53%9drkBHm3=WW2sk>^sq0DLOXS!a^?u^P{eE>P+>bzJ9&VpjK}?YT1lhQp`R7 zKGe(W--I*G|B^jL@03QM(fSa9#orZ!ePVE$I0~ug3nSQy%1w=YU)fUNRWAN=Qo|_~ zZ&Ufw^1Du?uD&XM@mkRBCKs?p{e+*gCP)Xp+i*M;;VWAzU()_{8&QEubc z8EZPjSo0F3_cGRU31i&ZX#FT->C=q0WspA0SUZ^Afi`!bj!v9AA7rcxb#>u;H||-2 zYfHd~rISc6|L;jXpy`#;G8bd7DWNZy<)=A(e}%OC%Zx4mE)w|Ni$3TDuY1uSz3Uju zlpwVttwGw2bOH(ek+~1)<49jaLjU#MhV&t%&m%pH^mE2m$VicFYQ}jL(k`S~r0bCG z(Ng~*#`>>9x(n%1q`yK!nfVIA0bp0vmBY6It zv>v)dq^EISOp84DKPm%*MT`wXryA)d(=EuKrkmz}jB^dn zk0AXV`G=8CX46`nLr6CwU5&(_IfB%PbQq}~sT!#csUdrA!5QVTS|on|8KejjFNdGI zkxH_8eorc!+HvNo8HqpNhqN^NeF@IxNW6|X60eirQ;|(coOwCCd{6f5$C=mjIwVdr zKl3tLkyat`XLwn>zA~g@q~%Eb8mEJ|eGd|^^CBcpKW}#_62G4({_F~*L8K0(7!t3S zw~Lp<>EDg?q3qd*v(EoN_nG(2E78#VDt{~V%+xveUw+Q_{AYOo^L{Fn0=UlmQI`e% z+=*+vZ}^$Z9KWv;iSwBEDVGD@FI*0JUHrN(SNfUv3;$ahiT8b>WW#mdr(72D6Q`pe zsSSzK!OPKQf!CX#_}}<ih8@!-F=j)%Fmi+qFKan?u#^0fA znOr{e>srh&^5g%K3~*b6C%sL4EO7m+f6tzQ#$rxp61Qrw-f|gVr3YGe&PVDHR{@ye z^}}Z1JSz5);%yf|86DV3fS0Wx*4T@6eLtQLqP#FG!cLS3P~H+&iXA}ZKzrkeK}}%g zmaojEfc@4WVy_Ns(hZ0WYeJlC3v8=2R&Ux_2iC8<@Cyk`5YN`bmSIOuFUzn#wgPK{ zE7<^6pH^dyXf0dE*5j8GHsBWnhS(;y8S5xp@EZ>!_??BCcm>G*{|8J*h}o)?8Er=im$MT*gm$O-NX*Czh>j?Y4%s_@7UMa->|=BKf&)H`~&+s z`+N2b_l<@a2US;G0l#$`|#@v7qMgFml#gscOg!( zi`h@vC3uJMrR*|xIncLHvUjo9<99T!WN%>q&VJ4wCo?IeV&kn9c-&bwM|N_MlU!^b z5lwFLkeBd!H1bn`f)pa4$5c!aic$%cvj1Ygr7|j~7{#fA5>!c5l%y2i>Rdy$R7dsH zz<$U6ks7IqnyH0a5vAHj?bJb?)J5I2gqBhd`)Bqqw2YQhFJ-8YR!~2p>IP^P)?(Js zT3Scz*+#l=sm^h>br^C+H-dV$ZT4vTw8R zuDsGgu|QiEgI1(c9@3x|MFD+u6Nz2i-|`(cSb8dMDjO_tJgzE_ye;hu%x~<999I zPY=)s*zNQneGt(_chiUIA$piTLXXg+^ca1VK1Ls>PtYgnQ}j3}dV)SpPts@TDf%pZ zjy_LcpfA#w=*#pKdYZmUe?@;yU!%XFzooyUuhZYtH|QVeoAeBQi~f`Sj+t7Kf9L6LI#;26BA1s}^XDgUu&mxceqd^PddxDB&DhuE?z2zk^75K} zW3%!k4$9gSQ_}~=l__yj*Jdf5%2K*kqjXAR$J#7?Q`%X=+Z3h_+1KUDwI9mmE$ek^ z4reot!xOXP<432*jvkoWuMCduKY3zYnHDF@pnmgoHlqw`jh_}Ld5|}98V6;g_S{kJ zxsCdBNA>46YR?_jn09oG{~FQk%(2OF)4!Ood7mZ}8KbfU|M5F$sIGIOgr;bjTPx7O6M5o_+QqQR)*)BY(o$cFm6xlD% z%U_U}zciOuF4Wp~TAbtyd9R$t!8|>4bmF+JkJl^yWE(TGYTtmkq>hb?vwcX63N1gA z%bQQ&H;0Zp4@`~Ejvt>oF233NrjJdIiL7<(=*)@n>G7#C$H1}UQ>ai}whWxe{(bFC zHs=^RGQ|hA_`72y?`GT3k?{%bcJCB!Ur?7>)FrPNKQU%rJ$B^Cn3}Cez7Us8sK>l@ z5;>VyWL`gZ?ARED_{hEkW739`(#Dh0jwy(is9D-HWg4EGF>jfgI5KA1I(AacQeoOO zIc4fc+H`!%!OPJpaA$AOzuU%)hC9adT3`VI8ap`sA{RKR{at@lTr`X4<$bu_Ji!}d zJ}^FgVoc4JC7;G0O#F{0M3Z=7=EI^%(^`{`o|G<`QfIXGm}Vzul;gZHEoN~toj{wi z^_q^MJ^PVBhIxiF*ujg_$#I`Uo+DeP);rlhiZ3?tu*h1+4o*$AG&i@V^;~<4k!v+_ zxxcm<*V>I-hmq?va$QEQThDbg8#$wn4!w?+Hlw^2qm&k-loq3uR-=?wqm)*?l;&20 zzE-2WR)fA)qvTejDEoHlrnHtI+lb)=0t(ncL=qmHyuN1IVcn^8xb zQAe9mN1IVcjxTLS9c@M(ZAKk!MjagnRUO6?9mW$K#uFXJ6P*TCodzwP1}&WiEuBWm zokq!>M#-H<$(=^YT}H`WMti%AI=YNHx{Nxyj5@lEI=YNHx{Nxyj5@lFI=YQIx{W%z zjXJuGI=YQIx{W%zjXFAWrRa5Fgk)v6rCI-LOS4`_OS4`_OS4`_OS4`_OS4`_OS4`_ zOS9gNmS&@l7Nd?F&F%WN=I$ z69NAVK3QK>`%>VjmASwZmFoVdJyEIl&+dtGKlB>#=Q=vTZh+lvlN#ZV8XqYswMuF6 z^-ifxs+XFjCU%d6Xi9wEjnohS<1l<7%|Ak19Q>oZaXbzWXh1@=XF zB437&&b{)#&U)p4Cp_|Rz%%E*__x?U!f*U1_>J6a{62ifAHa)*U(3By?q>oS_z67m zpTXyT0bciiz>oihKm~pU9N;DP8}3QNQ|A6Gd~o4=BQ%Nd;;VfBT=&hhemVEb&-2L_ z_~YmJ;^+9`c|Q27``?9p?^pG?^F40iRlk}C{fGI_e~9<2`OdHAIsYa5&F6Z}++UUw zQl(TSRZBHegVcgwfJ7_{FtQjhxd_I`hk#VP4Lc%i|Jjazm*;Gki1LY zBOjM?$`d|@2P!>9MVJh_etq-{QIKxb^LqDG-%pqdfxOq z)623X%c$Rje*w8dPHO)^?*h&L7l%P=TKigd9kkdDKo8#n9eM`ZEMJ%14sCWP^x56e zXzv7msA;u#FVJfr_yaWC6AN_P=ND+Vul@o0O~b|hCpBCF+;M@9D}Xtkqvy`S8~?xR zx^vJ)9b3eXdks?rqWHf`_x(j8hEg#Q)QY?;_aLRo<+G?6ofy5 z177?rr@HuAfNxQ5UL(gAZ|5BFTPzH}+O+stvT$Gzd zQTQV`5VGQDYZpI@9C(c!2rtUbYvkDC?VJNe_;DrttoPz)kpr)Z1B|dc@+RyWX40pn z8xWXtqjsh*;T<9(=3BNJ0fc%CxVSLbH{6GPzlb+9Iq=I03~x1j5`WO*zs31V{`DsO z-UZvsq<-n-2JA~Z$hQ+ANRfZ=hS&Md`T4mGLmP*in?<48^C;u@?uN!a?w((x+<)VL zdF+wbJ)ocGAHi>pK4*&IJASMqTO*z^#qefe)QG=7LeCkL@W=4ME@|9@;~-kwi>OQq SyQDLSP-N_L`0;nd!2ds0@g5HV literal 0 HcmV?d00001 diff --git a/upload/plugins/signup_captcha/img/fonts/verdana.ttf b/upload/plugins/signup_captcha/img/fonts/verdana.ttf new file mode 100644 index 0000000000000000000000000000000000000000..8f25a642311b8dde62b6154184aea935999b7c15 GIT binary patch literal 171792 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 z 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 literal 0 HcmV?d00001 diff --git a/upload/plugins/signup_captcha/signup_captcha.php b/upload/plugins/signup_captcha/signup_captcha.php new file mode 100644 index 00000000..2eb809d3 --- /dev/null +++ b/upload/plugins/signup_captcha/signup_captcha.php @@ -0,0 +1,50 @@ +
    +
    Refresh'; + } + + $signup_captcha['signup_captcha'] = + array( + 'title'=> 'Varification Code', + 'type'=> "textfield", + 'name'=> "vcode", + 'id'=> "vcode", + 'required'=>'yes', + 'validate_function'=>'signup_captcha_check', + 'anchor_after'=>'signup_captcha', + 'invalid_err'=>lang('usr_ccode_err') + ); + + + function signup_captcha_check($val) + { + $img = new img_validator(); + return $img->checks_word($val); + } + + register_anchor(signup_captcha(),"signup_captcha"); + //register_signup_field($signup_captcha); + register_cb_captcha('signup_captcha','signup_captcha_check',TRUE); +} +?> \ No newline at end of file diff --git a/upload/privacy.php b/upload/privacy.php new file mode 100644 index 00000000..20c3bf03 --- /dev/null +++ b/upload/privacy.php @@ -0,0 +1,16 @@ +page_redir(); +subtitle('privacy'); +Template('header.html'); +Template('message.html'); +Template('privacy.html'); +Template('footer.html'); +?> \ No newline at end of file diff --git a/upload/private_message.php b/upload/private_message.php new file mode 100644 index 00000000..7efb89ac --- /dev/null +++ b/upload/private_message.php @@ -0,0 +1,169 @@ +logincheck(); +$udetails = $userquery->get_user_details(userid()); +assign('user',$udetails); +assign('p',$userquery->get_user_profile($udetails['userid'])); + + +$mode = $_GET['mode']; + +//Deleting Multple Message +if(isset($_POST['delete_pm'])) +{ + if($mode=='inbox' || $mode =='notification') + $box = 'in'; + else + $box = 'out'; + + $total = count($_POST['msg_id']); + for($pms=0;$pms<$total;$pms++) + { + if(!empty($_POST['msg_id'][$pms])) + { + $cbpm->delete_msg($_POST['msg_id'][$pms],userid(),$box); + } + + $eh->flush(); + e(lang('private_messags_deleted'),'m'); + } +} + + + +switch($mode) +{ + case 'inbox': + default: + { + + assign('mode','inbox'); + + //Deleting Message + if($_GET['delete_mid']) + { + $mid = mysql_clean($_GET['delete_mid']); + $cbpm->delete_msg($mid,userid()); + } + + //Getting Message + if($_GET['mid']) + { + $mid = mysql_clean($_GET['mid']); + $pr_msg = $cbpm->get_inbox_message($mid,userid()); + if($pr_msg['message_status'] =='unread') + $cbpm->set_message_status($mid,'read'); + assign('pr_msg',$pr_msg); + } + + //Get User Messages + assign('user_msgs',$cbpm->get_user_inbox_messages(userid())); + + subtitle(lang("com_my_inbox")); + } + break; + + case 'sent': + { + assign('mode','sent'); + + + //Deleting Message + if($_GET['delete_mid']) + { + $mid = mysql_clean($_GET['delete_mid']); + $cbpm->delete_msg($mid,userid(),'out'); + } + + //Getting Message + if($_GET['mid']) + { + $mid = mysql_clean($_GET['mid']); + assign('pr_msg',$cbpm->get_outbox_message($mid,userid())); + } + + //Get User Messages + assign('user_msgs',$cbpm->get_user_outbox_messages(userid())); + + subtitle(lang("user_sent_box")); + } + + break; + + case 'notification': + { + assign('mode','notification'); + + //Deleting Message + if($_GET['delete_mid']) + { + $mid = mysql_clean($_GET['delete_mid']); + $cbpm->delete_msg($mid,userid()); + } + + //Getting Message + if($_GET['mid']) + { + $mid = mysql_clean($_GET['mid']); + assign('pr_msg',$cbpm->get_inbox_message($mid,userid())); + } + + //Get User Messages + assign('user_msgs',$cbpm->get_user_notification_messages(userid())); + + subtitle(lang("my_notifications")); + } + break; + + case 'new_msg': + case 'compose': + { + assign('mode','new_msg'); + + //Checkking If reply + if($_GET['reply']!='') + { + $mid = mysql_clean($_GET['reply']); + if(!isset($_POST['send_message']) && $cbpm->is_reply($mid,userid())) + { + $reply_msg = $cbpm->get_inbox_message($mid,userid()); + $_POST['to'] = $userquery->get_user_field_only($reply_msg['message_from'],'username'); + $_POST['subj'] = "Re:".$reply_msg['message_subject']; + } + } + + //sending message + if(isset($_POST['send_message'])) + { + $array = $_POST; + $array['reply_to'] = mysql_clean($_GET['reply']); + $array['is_pm'] = true; + $array['from'] = userid(); + $cbpm->send_pm($array); + + if(!error()) + $_POST = ''; + } + + subtitle(lang("title_crt_new_msg")); + } + +} + +template_files('private_message.html'); +display_it(); +?> \ No newline at end of file diff --git a/upload/readme b/upload/readme new file mode 100644 index 00000000..8a6d4b13 --- /dev/null +++ b/upload/readme @@ -0,0 +1 @@ +something goes here.. \ No newline at end of file diff --git a/upload/rss.php b/upload/rss.php new file mode 100644 index 00000000..cf7f2fda --- /dev/null +++ b/upload/rss.php @@ -0,0 +1,140 @@ +'."\n"; + +$limit = 20; +$page = $_GET['page']; +if($page<1 || !is_numeric ) + $page = 1; + +if($page) +{ + $from = ($page-1)*$limit; + $limit = "$from,$limit"; +} + +$mode = $_GET['mode']; +switch($mode) +{ + case 'recent': + default: + { + $videos = get_videos(array('limit'=>$limit,'order'=>'date_added DESC')); + $title = "Recently Added Videos"; + } + break; + + case 'views': + { + + $videos = get_videos(array('limit'=>$limit,'order'=>'views DESC')); + $title = "Most Viewed Videos"; + } + break; + + case 'rating': + { + $videos = get_videos(array('limit'=>$limit,'order'=>'rating DESC')); + $title = "Top Rated Videos"; + } + break; + + case 'watching': + { + $videos = get_videos(array('limit'=>$limit,'order'=>'last_viewed DESC')); + $title = "Videos Being Watched"; + } + break; + case 'user': + { + $user = mysql_clean($_GET['username']); + //Get userid from username + $uid = $userquery->get_user_field_only($user,'userid'); + $uid = $uid ? $uid : 'x'; + $videos = get_videos(array('limit'=>$limit,'user'=>$uid,'order'=>'date_added DESC')); + //Count Total Videos of this user + $total_vids = get_videos(array('count_only'=>true,'user'=>$uid)); + $title = "Videos uploaded by ".$user; + } + + break; +} + +subtitle($title); +?> + + + +<?=cbtitle()?> + + + + + <?=cbtitle()?> + + configs['description']?> + + + + + + + <?=substr($video['title'],0,50)?> + + + + + + +
    + + + + Rating /10
    + Views
    + Duration + + + + +


    + ]]> + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/upload/search_result.php b/upload/search_result.php new file mode 100644 index 00000000..5f55fa73 --- /dev/null +++ b/upload/search_result.php @@ -0,0 +1,82 @@ +page_redir(); + +$page = mysql_clean($_GET['page']); +$type = mysql_clean($_GET['type']) ; +$type = $type ? $type : 'videos'; +$chkType = $type; +//Checking if search for specific section is allowed or not +if($type=='users') $chkType = 'channels'; +isSectionEnabled($chkType,true); + +$search = cbsearch::init_search($type); + +$search->key = mysql_clean($_GET['query']); + +if(!is_array($_GET['category'])) + $_GET['category'] = mysql_clean($_GET['category']); + +if($type!='videos') + $search->category = $_GET['category']; +else +{ + $child_ids = array(); + if($_GET['category']) + foreach($_GET['category'] as $category) + { + $childs = $cbvid->get_sub_categories(mysql_clean($category)); + if($childs) + foreach($childs as $child) + { + $child_ids[] = $child['category_id']; + $subchilds = $childs = $cbvid->get_sub_categories($child['category_id']); + if($subchilds) + foreach($subchilds as $subchild) + { + $child_ids[] = $subchild['category_id']; + } + } + $child_ids[] = mysql_clean($category); + } + + $search->category = $child_ids; +} +$search->date_margin = mysql_clean($_GET['datemargin']); +$search->sort_by = mysql_clean($_GET['sort']); +$search->limit = create_query_limit($page,$search->results_per_page); +$results = $search->search(); +//echo $db->db_query; +//Collecting Data for Pagination +$total_rows = $search->total_results; +$total_pages = count_pages($total_rows,$search->results_per_page); + +//Pagination +$pages->paginate($total_pages,$page); + + +Assign('results',$results ); +Assign('template_var',$search->template_var); +Assign('display_template',$search->display_template); +if(empty($search->key)) + Assign('search_type_title',$search->search_type[$type]['title']); +else + Assign('search_type_title',sprintf(lang('searching_keyword_in_obj'),mysql_clean(get('query')),$search->search_type[$type]['title'])); + +if(mysql_clean(get('query'))) +{ + subtitle($search->search_type[$type]['title'].' » '.mysql_clean(get('query'))); +} +//Displaying The Template +template_files('search.html'); +display_it(); +//pr($db); +?> \ No newline at end of file diff --git a/upload/signup.php b/upload/signup.php new file mode 100644 index 00000000..f25fcb73 --- /dev/null +++ b/upload/signup.php @@ -0,0 +1,79 @@ +login_check('',true)){ + redirect_to(BASEURL); +} + + /** + * Function used to call all signup functions + */ + if(cb_get_functions('signup_page')) cb_call_functions('signup_page'); + + + /** + * Signing up new user + */ + if(isset($_POST['signup'])){ + + if(!config('allow_registeration')) + e(lang('usr_reg_err')); + else + { + $signup = $userquery->signup_user($_POST); + if($signup) + { + $udetails = $userquery->get_user_details($signup); + $eh->flush(); + assign('udetails',$udetails); + assign('mode','signup_success'); + } + } + } + + +//Login User + +if(isset($_POST['login'])){ + $username = $_POST['username']; + $username = mysql_clean(clean($username)); + $password = mysql_clean(clean($_POST['password'])); + + $remember = false; + if($_POST['rememberme']) + $remember = true; + + if($userquery->login_user($username,$password,$remember)) + { + if($_COOKIE['pageredir']) + redirect_to($_COOKIE['pageredir']); + else + redirect_to(cblink(array('name'=>'my_account'))); + } + +} + +//Checking Ban Error +if(!isset($_POST['login']) && !isset($_POST['signup'])){ + if(@$_GET['ban'] == true){ + $msg = lang('usr_ban_err'); + } +} + +subtitle(lang("signup")); +//Displaying The Template +template_files('signup.html'); +display_it() +?> \ No newline at end of file diff --git a/upload/sitemap.php b/upload/sitemap.php new file mode 100644 index 00000000..3e813458 --- /dev/null +++ b/upload/sitemap.php @@ -0,0 +1,64 @@ +' . "\n"; + +$limit = 100; +$videos = get_videos(array('limit'=>$limit,'active'=>'yes','order'=>'date_added DESC')); + +?> + + + + + + + +/player/old_players/embed_player.swf?file= + +]]> +]]> + + + +'; + } +?> + +yes + + + + + \ No newline at end of file diff --git a/upload/styles/.htaccess b/upload/styles/.htaccess new file mode 100644 index 00000000..8c79ff9d --- /dev/null +++ b/upload/styles/.htaccess @@ -0,0 +1,4 @@ + +order allow,deny +satisfy all + diff --git a/upload/styles/cbv2new/images/ajax-loader-big.gif b/upload/styles/cbv2new/images/ajax-loader-big.gif new file mode 100644 index 0000000000000000000000000000000000000000..e66abbdb8aa93b3f7a7cbc98df82df7dedeeecaf GIT binary patch literal 2463 zcmeH{`B&2U8ppq1WHS*FH(UdA0k_1c)XD&{K$A4Ju+bUOOlcIYTst;{s3~YSGcChv ztjuNF$TmB53)IjV8_liFC2%P#Gu(IYb>`0P)H(fjf4!eS;B(%u=k>gwt*kAsZd@FI z1Ev80*!u*=`vc8yF*x`Xm(XgQ*lM2KW|7i{Pi?a~++i>1SS{?NWIdziz1Vi5%eSyA zptvXKbPq?;6IG^+E>p!;sNyR75-#^AUg=M~I*@X0AnnGWsOD|4{KMJ$;i{&Q>n)#d zx2x}VsPA=-)^&~7caJypO#JqGqNQ)LwSTJX-AwoUnZZwUAI9fDO)h+zS{R>MoSIvl znO~ZnU($+g)`@E|N@#Tubgs{SzCrZdBlpFY{8y}ku7FeBA!mET&%frLSMn~Y4qYEO za_4RCy&*~6hjWiV+-g(bZC5{fIVO8K*3diAq?~-BoNODIY9E|>F*N;hX!_N=nZA#+ zZ`5<|#^ygx%&Vss#-8%{C%lnxU%WvopyCi$EaeNu6LsI&Gf*hx#98o;feYA z#ibQ7&D#7Hr}R$mf-e74-Mi29?kiWNUK<#hoFAE7n3`RLM*m^^Q^&T#uHcfM;F4Z` zRo|WV(fiLvHGgbgm;Kyb^t@R$IjEj{KQ=!)y}&N&imU2x?46ifSXvhN|M$O4fbcIZ zwpU<)C(X~x#mQL%T>gu&$a)UkH+>Cb8B~Tb`1Mm>oyj$$+j#4mpY?SDD zt$hT*?8QEA3KSj;*oqJGrnJEP#T+BWX6aGamQ5mY5ECDm=Z&IJHf+z`Ra*oGv8=x* z{vK|H%w{bT9p9;x^6bn)&e}92d8a(Xz?dh;+FfiohW8Ykv8u~{J3(AF^`EgrzJ`D- zLkN?yazq*XqoenW^M&?kE*EWgJkupu$S*3ggz%$`ti%U+Ch-trI2RR8!hatUs#Tul z!b78@5+SjXdt!t4-o9;=<6`na{}CkdQShG7klTi$_$a+Nkp%(@{h>#cm>>?eh}g5w z>fmW{f)V07tr&HV1qdvJ49q}=U6orgrZRzsCWM*fCzBjrTmm!G%bN_HElkkW7cHAN z9Q_QD3HdL?mnM)hKm%#Ul$Odf;2LYWSmgP-^et1v1Ex)vSRYNvTZ}Y~KrxC111o{v~(n!wH&4>O_ z$Q+C2<{6o2dc350wpv;v%+p=RYQyq20R<3F;EB?UD^a)*L7?*r@DdPBOoc)+F9LW& zGN-K64%`)dCSax*f2WBdlqTROtwkUb-42taeg{QJ^+*5_N8bH&C}4T)A6X z$O*40%`@<)9*BQJ>szI@o*xozLROrxEz*WVztJ0H4FLOl<^HnsnJT{7${@+68oYU_ z369f!9S>4nWRjc$=C65$qg?MIfJ0Af_lgvtvFrJ6`RUE|Zq^-n#{C31-Q5ZEaJDv! zYNUhE^{ou+3xid#8yYc6%PPQK&y3L~y{&{*gw_;`TFbYcUKe7|5NDP<(6Cy__)&;u z77mW8FU0`18YXT?R!F6Q30TSmrdm1NWR;jHSXEW*%E~yx(l`GM^HqNye4)sq>=wiu zm8Dq$5W*r_^m5=N5R~c4&{Uk}wV^g$*-0z`v4!9__K$)>NW?Hn)UUfOeS1>OJ-s*9 zPqs4B{D>FoZJyu^k;KE)!My_8)I#hKq?QzD>RsjTWf!zPpdv6wJ*xMZC*RDcrX`98 z={Wf2^5W3iA;*kg*(F0MrV3xd*4S6LEL;S$N9$+e{uH$!<77Vhq=Ou*)PX7VsgkwT TQO9&|l221ok?xUHV8g!wwrPPZ literal 0 HcmV?d00001 diff --git a/upload/styles/cbv2new/images/ajax-loader.gif b/upload/styles/cbv2new/images/ajax-loader.gif new file mode 100644 index 0000000000000000000000000000000000000000..61e4993f1a20bcd3f516a46e72f6a50e0fd1cba8 GIT binary patch literal 1482 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 K282`2F~0-avx2?= literal 0 HcmV?d00001 diff --git a/upload/styles/cbv2new/images/buttons.png b/upload/styles/cbv2new/images/buttons.png new file mode 100644 index 0000000000000000000000000000000000000000..5532c97601522b31bc64d15c8f940739980f78dd GIT binary patch literal 2188 zcmchZdo+}J7{`C_JFbIC=oF!sl+jpLByu^gUF8;9tm`(KjFENAxa;<+EQ(C)ES02f z$>}nK+)6Gf7B$71lUteT42IV2RI@ZI+Ey)08nvpcJu-OVlCYYa`+0?Y{|tRn(;gR<>j;qG(~EUZFI4 zN^EDSEdUB8E{+a9$%B(aT@iUn+V@_SRa?oH#+7+Ftp10rp*`Kh-kTHhJ}r`(K17LR zGq#8696yGQi$c$&h%H0nL+v_KD-C0av+@cw*%m$bTV1?A_4c}ps%Bekk2Jn`kjEe4 zbrjCzS-c!LG<~#ZtD3oPoG~N#exmsX^YwA1vqR(637|+kS=3NKHQayo=862y!8T9R z07ADtqW)Ao@3Iv#ZJ``dsCui(K3wNme9Y&KdhICk)ZJW;lK|{ zd+J2Lv7rNHbHgosLnWKJ=H0(Cj5eEX79E}{c(Z+B4h+hTbpQT+=Zj!ZhQ5AtTh|7I zi1Lid+6z%(Mj|TLuO>*aNY_CPkCf{kemgc(E@;{}|LTxD-_`S)k88QQnRlT%WvsRYTr`gErlsiymIC@OI+~o z;H9?ki)D@E{1RgzvqS)bP!y1&|Ubkn99E5b8EUMsNFuq_R)si<=k&T3BN0+~mL;1CD8kE8c>n z%(IwZEqA%-QsdZkxqZK6xL{+fX0Ela`Mzz>o_KLjoTDfyDe-!tcVk!sgDmnF=Jzr# z!;qRdYJTj}4P|p-tCH`u3Ww z3Lyn`=G%DR^{J0mLFeR0CW3hrKHQTDBZ+F(Uh|7pn{I&mfZ!hg1vjy`@7cnk&cUer z>wO^&J!GD(?r`j%!#GAv zn;?{d(OJy6T^!^TeJKFyUVsAT$$59q(Iz?`6DZ&m6E{HS(m$rYT*O?18$L_S|Tn-_O|;A;@nRxivqWjl^Ap&x;<+6t-rG z>nS1{mqr<2hE4Mu4-IKyoK+qD{r;)$!M4Q}XP$fLJ6(Tz{aFC&HxXgsD@adxxP@6| z6L8l(`N0;9LvpSf*j@gS5BZ^Ds}1LM%>yEK1s^4ZhucWzqmytbGLHDfX|PgCIblR}eht`ZoyKib#xd#oL)}xUByB4el~;a?z1d!!QjlzW^xfNy z5ukoirl&rAn~t|fZ`0b7>^Edl^)`@hm8MK0H7&-as!6S5SIDpwC2~h463NBIzhC*IR*T^`}S&XCR(-5a9UMJ?X+Da1x7myH-=OMF``hLXxS=>7G@dFfQu*#s*%bW zXB=i6^}W|QcY2Sp=)mROd+zyu@7#0G6{xYP|!6}_b(_u zpM(emNGU1GfxEtr$eA8EyY?XcU<_~^4bgz9u6Qq{n2hyZhWhpy8=0?w3Sf2iH9>+T zUPHL;7+|l%Xxa_Cc`wpq_xSILuBo|kygYKy%|ChM7DsNni`^}*XW4=C?&8V)`s*3* za~#LBjx&%BrN~x!@eIne{DL+NKSn6ps=uBobBm5+b99ja$(6DwJ!zUyk$PlLMSa1x z(Wm~L{VGyNaTd%%u3A|Qki^LTf((SAf&{VZu+pEXy|D-K;SC5nmw98v7Zy*){W<%2U(xl-Vhuph z5lTcfLUe>s$QP8)o`BlftiOH{Y2Tnx$`|MaRe-n?-*>&Ev3{s6dH|-OV6T>{9Y#lj zQgr_|^+H9rvkF@%Z`hcf|A3inVX%Mh<1NNC4#!*i4mZ@_?ubWWnjvaF>OO8#ua$X4 znU>2H%%tY=CRez2HMKCt?c%)!4e2CE=b=^vBUbetc}7ud#S*69zQ^<*G2iT_$HWji z&XxA9){t(JzW{s#@A9R=fz+o_7XR}aJqV2!{NENlu?P4qzyNNT8~9r=WRd^?002ov JPDHLkV1fmNR7L;* literal 0 HcmV?d00001 diff --git a/upload/styles/cbv2new/images/cancel_upload.png b/upload/styles/cbv2new/images/cancel_upload.png new file mode 100644 index 0000000000000000000000000000000000000000..35682b010b0cd8758b2cedfd230aba50c4392996 GIT binary patch literal 2960 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 literal 0 HcmV?d00001 diff --git a/upload/styles/cbv2new/images/cb_button.png b/upload/styles/cbv2new/images/cb_button.png new file mode 100644 index 0000000000000000000000000000000000000000..f3bda1c6378da56f7cb807eb4fbac37f57304146 GIT binary patch literal 1510 zcmWlZdsI`00mf6=X`R(Mt8Nvy+OD2zrPV%JbqGa?3RMP}Vq9mHR}c?TeCyEBRYAp# z(uWqT$Fu6xS^}Pg5FP_TPUjsflBE_N$uD|2U7c54lv9*f zc=qT(QIbp+C(GKYkh^#>x6S#6#u{a5wFOof#*9(oNhtJJU?RC;=pX&#AQ?^8kDY(w zG7{7WIvXyDTN{U3ASlD&-rMPeC{o$sMk3e%BiQkXgQUhos2xLXDEvbJ3JF4r!BuHN z3I@RgfS(ow7t0N?LNCP`!x00)rZ$bTF^T6nmSgt!dKi|XX<}TIA|xJ)hAjxF^LjL1 z?;Ve~&f_}*fXOY+WUVzxYn`5+nwpA%8J%6M!*qHoSmIL)8ou)w$(ljv6C~?KmQzH zW4l{yFZ|n@qH|eUvD%8Yf^<}xg1N~Kh}H)vDmK0P{?j!NY!`=6?F4zz3|0K(6(k7? zqn{al7fj$m6J+puJ|CE<06eZByh%5b-#(Vx?)tdR5td@g|9XcIuxbeTP;0#~7*H7O z7fsOlKDQ`|5E04j@p*YMv(1Atv@eWN6kcXQ)Ey%(ni&kDuQyne3@$rCm`J9dWCT$_ zd7+2mAK(nev0WrfiXzD|Q6lVNmsIq?WOGq>T)%w$X=aV#c@EKNuv&rmqeF&s-#L|Eim zRqsUoSOf&YME$XBnQY#<^t4pP88=>6ynoSw7cZ^KSbb;pwP&{&AABtw!|S^iUpxBG zf{V9**rD5~+E(}w?-F0ro&Iujvv_NG-??YRS>Wu^rp0AlfBSoPq#|X@(|5TwRqK84 z|3P!QZ1cj8Hl6(SW{v-Q=aN_Aub;b`ue_}Pcx!e|sXe<^jg>DuKOigtc9bOWD*#!^ z%IP?uOm|-Xc5SIYtM*O*nq`%D)&0L+HZvgnUY=5tKs^JzT(XjW7Fb&nQ9duv*4fiu zQEy`7*N#zMD$Zq#qo3H89$Cb9d!`8a3eI8+XeS zULvlSd~*8Q8jrcU8I>o3OU`zfXZYFDea{B4hvvAuwsL%sq?V1Q={1H zu3o0EK#%{czTrx80Y2+KwMy96W415%-!EVPwVLi)^jztl#31cF)obb6-ftkkzq3`b z^rh@y)$Ar~8zuYFFK*_qWG|oGbnDhxg*$g+aZ_^WTW8hQ+y2Mg3qvc5n!ma*FK)Wv z26LHSJb$74&z6juh95Hz{q$;jV~yzuW$DOz?n%y}>&r_w?yQkLjHkffrc^u!XgY}Z z8b4j-G|fNPlDZ)SZ@Jplr|tfQbJaqMT)+gkxBgN{SiaMuJN#K*=i@&nJW8x$ZEv*t z*RCH_wOn$!D_>M^`))*~Us1cO^>?bP_f_q7W7+dQP0GB5vI57pVt+93|NoYy%QMrO IwjB8Ue+FFGhyVZp literal 0 HcmV?d00001 diff --git a/upload/styles/cbv2new/images/clean.png b/upload/styles/cbv2new/images/clean.png new file mode 100644 index 0000000000000000000000000000000000000000..3f4e60999cc057072ef0783bc86b98a6fc32ef08 GIT binary patch literal 3056 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 literal 0 HcmV?d00001 diff --git a/upload/styles/cbv2new/images/down.png b/upload/styles/cbv2new/images/down.png new file mode 100644 index 0000000000000000000000000000000000000000..347ccbf7ff6ff29d75862f9334f84bb81fb1dc05 GIT binary patch literal 1204 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh1|;P@bT0xa$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%nF$y5hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|8rl^i;0<`p{s#~vyqFFk-3qxshPQ{ zi;)XVuSMv>2~2MaLa!xGy`Y4UTL84#CABECEH%ZgC_h&L>|v`++-@<$X&zK> z3U0TUqWpsJ(+*6A_D`XmZytjNX4zB zKmY&RGXvA5;YOyQI)^p9M|vFoh;)=Qe4J*Se(q1(%H)93V3fqzo@ZV$FXdLj_Rc(cXt>7#N2Z@g7jJl5!Ow7!tu@vPo7|Jt$ zRFFtnEIMh~)&&j+7JZNt_|E)MUgJLZl0Y`kgQg39*EW8UQrT$j@P^@tbi)t*5T99` zCq)ESu%K0^Tr!&9lQ$z5AlV5pU(QqJ|%$Z3J+I{g~C7fBb*L4(z;#i znoZ_0Jo@dhrbA^S$B{h_HKJ0FUL@%1$R#(-IqK5(B56VRqXQo~Qgj%DVqG$m{2jbHH8qDO#XL&sKI@eY?2)n#4U7zahhm;bw(Q6Q Ol_Q?6elF{r5}E+h-j9F) literal 0 HcmV?d00001 diff --git a/upload/styles/cbv2new/images/error.png b/upload/styles/cbv2new/images/error.png new file mode 100644 index 0000000000000000000000000000000000000000..a9e4ff3991cb0ad2a99cc25e2d13c35e52c680c8 GIT binary patch literal 603 zcmV-h0;K(kP)J2V5SdEtMnl9PhCxc2Fa&}~V}o=Tx)35=bmuS|@d;cT zbY;Loz(q+`1+A}82tI&NTm%Y*7F^UoNilyn))L6H_Q1W1%i%j`bA(=?F!-5EVN!MFB_9*XAp~_l%n771CUH65fQk#;c9J-59jBDOQ<*CorDm33|CLV znm<0~VYP}<3Z)daS`C19yN!q-BK$Z#V4_~XOaDE<2tY)*Zne1F+TuNYlS3Fj19`yz=_l|J pl>P}02k>Sh;xD3f4Z|KZe*u@?eFz-1;S&G=002ovPDHLkV1mMw_G175 literal 0 HcmV?d00001 diff --git a/upload/styles/cbv2new/images/feature_bg.png b/upload/styles/cbv2new/images/feature_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..9a22a87c97e3b49120cd0d494bbdcf43fc43482e GIT binary patch literal 540 zcmeAS@N?(olHy`uVBq!ia0vp^DGUsZ@*GS+mW9xltw2h$#5JNMI6tkVJh3R1!7(L2 zDOJHUH!(dmC^a#qvhZZ84N%8EPZ!6Kid%249pq(D;9zzz$a}Jd@2Jl%rueg^E#AQ= zw)%VMZ(gNgVk~f=iS_l;#(od3S*+Y*IuRRK#B}^urX6fj-H>pw>FN1PI*kzVBlDL= zf`n8z?BN3|ZG0+~1=X;=8LWY450GN@PT1LoqTtAZY>+x08`iT;tlZNYuY-&PQ4vfK zY6A6%Z+i3Nal+kU}vXW`86z zKt=)009s~x1>{08o$CRc6F7lxhyz+A1oS|qtO=@uh&cAMAPG?L`~f)u=whJf?Y*HI lfFZ596zrH^2H_2i42-|nxqE~!uK-3jgQu&X%Q~loCIGIz%P{}| literal 0 HcmV?d00001 diff --git a/upload/styles/cbv2new/images/foot_search.png b/upload/styles/cbv2new/images/foot_search.png new file mode 100644 index 0000000000000000000000000000000000000000..54337e062bd7af644c182a589835db9f97b158b0 GIT binary patch literal 187 zcmeAS@N?(olHy`uVBq!ia0vp^OhD|!0U|&3Oppgsk|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5XVm)0PLn>}1-Pv4i&dkhw`tR;?$1C-00trl$d31RG|4-)n z$IkueLE^>sV~3Z`m8f<3yuoVT)9J-39lO3i64tvd*c7n-&+)T|*Rk9@Q=c-s>Gqlb jC-_`gEGMxwFfcRJ$7HS6`g=wbXc2>_tDnm{r-UW|Eu%&J literal 0 HcmV?d00001 diff --git a/upload/styles/cbv2new/images/forget.png b/upload/styles/cbv2new/images/forget.png new file mode 100644 index 0000000000000000000000000000000000000000..a121b8b56c16d9d230b983ec9206d74285c63f97 GIT binary patch literal 1993 zcmV;)2R8VLP)unXBmFZ-tU{uZ8zB@ zG?ELDN+Jk!um+l@q+_8fP1~`pVVW5-A`I$}V)LVFWir#Lh-1ZcbZliXpu_0s(27a1 zO(RmvCB4|BAtZ!s$c^1iHhVj}dv?z`zTdZLf`Hl|o}G8k`Sv^C^SzhneZCb`RmGjI z;?{%grX{N*DpoRc_lZ(^XIWt`a;z4JDG6aw#9TN&Z8aIX zw$)a3v^H*t+`Rd%V7eV0uXg4+Y`eFuuR(rZE)p`3$|w*7z^vCor)DrX>ciQAQACre z18+Xxc8J!gw}R=P{K<*qm0tIwo9otKDk32$N)Xc-$a3}_gH{8ZNe7S31gB2H@87dun`RV6O=^SwI0naxb0$)LC)QwV&4m_pyk zOg8bvi>B&g{><`te*6XxRZ6QoB|5#HJI%miDe?x)AB8+pZYS{$3U}j*eBzso_EVQI zPK5wp!M@l!g*{0OY$6mBVIi0GR1OUk@=jgyB0v;jIUJk`q4&x(dIl$!Hqq+@TBkuO zm0-hbn(0@c8xDkHvqnLM-KYc2^GXJzA_k}D$cr%E_;>;*`$y65^YieS3ACxzpoPb7 zf^R0kz`8j#>}KPMq47!NTa8E&zea9^FnVKw$S6T2ub$XYiRZU(z$10#d`xICQ#W`W z7L?^!aQeakgL#>QeR)&O!Q*}XKqgI;(D5EL64NOe+>4GsU%<}J(>Q$QeeMwpt%N{o zOLEco{vhU}@eYb`VyT^oZ+qN1_Rf7@X(0YYaCtU_0EHS)rID6dqYE(Vv~ZXV@VadH zTv-9+L>xbRt?wuSJ$;)55#Tc>gZ{;q`!~Yna$(fJK)GYBmEmA^>dE398_M(T=zZ^F z{B214d9zu!74M9pml~Sxhp)s0~Bxi>{ z`~V-FeGAEW^uV*PzsqI&Rxtg`tzSJ}TDj`cd$!yMIWURzLJ&$aK}5}D!_XU`wb)_E z_aJF<;IAjU5Dm>A-hZOIoxql5`{%oMyi!)Zru7T;TOeK=LVBKBCmDxA&CSTm!HD&O z)&QN&0fV~)g6A%rI{Hf_VzFIUFP_WF_OJGQZL0va_u;3WMrv#Tl79*^YhGf%wW=05 z>$j3eHi#2f5IWbx=X5qZOx_9vWC2INf1oELrLwY3vF}~i(1eWtI;6Q-WD?Ay44fMq zQT*6mSXS1+ShNDJO%K5P)OWb#q$6QOhx(Bxizr)Fla+0X)sRjmn~Ob#kmdu(h%v6R zTALGv4>a@eMBgxyGd})oEcC)sz8Zw--tG|C)whKziAdu^FA_h4vEef8D znb&{A0m2`ggOPGn-u68{PRACI49-w>O_0Jt6s@UPmTjBU1tpc_K&qUT?Q|rB(8XRX z9+=46+>}*U3NifQKlojdB*;{4yTPz5+Y;jv>ppe)z`gk@sNVs{-J57}5+gr-7UJ}H zwz?XXuUkAfva%fu%|mN46J=>g>hOtoY&ys{3!( bzXTWnu=>^O`svRr00000NkvXXu0mjf!pGC` literal 0 HcmV?d00001 diff --git a/upload/styles/cbv2new/images/gradients.png b/upload/styles/cbv2new/images/gradients.png new file mode 100644 index 0000000000000000000000000000000000000000..9d1fba6b1758079566ed4e3452c93ff104d704d5 GIT binary patch literal 376 zcmeAS@N?(olHy`uVBq!ia0y~yVEh7P+iU*!qZtVZwdE#0AU^3z!-9e}2NpAZEp&@Pgrh$h5?VK(gH| zcdxGpn+kNef%c2(#taU5)h;`j7*xXNFd&@Ya9;TU!@H?7EB&}nL;{17!PC{xWt~$( F699heZf*bo literal 0 HcmV?d00001 diff --git a/upload/styles/cbv2new/images/group/add.png b/upload/styles/cbv2new/images/group/add.png new file mode 100644 index 0000000000000000000000000000000000000000..61d25953c2f84175b9787cfa53e2edc08601d8d7 GIT binary patch literal 331 zcmV-R0kr;!P)>QTFvN&9 z;P>y}3_pMW#1O-3K*1CjYyrmb^VfG&1AhHt0IEd~@#!qTe*VhL4{yaV`OK{iDE!QT zdJHuaS5{}TfJ{DoWf=n@fK3fZFUSQ9-+z8*AP0c-LJjyvz5zgIOh0w<0!AR}8mgi2 zFQ31K&5Y@c*pjkej>3O!BV`n^tLN@AY?|_bk+^gK3><9HNSlO2lcWsHIMZ*Oe1MUi dv8e?JFaU&-kNmLq2fY9Q002ovPDHLkV1lw^iHiUL literal 0 HcmV?d00001 diff --git a/upload/styles/cbv2new/images/hq.png b/upload/styles/cbv2new/images/hq.png new file mode 100644 index 0000000000000000000000000000000000000000..4aadc57ef3ec1bb10fe6e80b0ebb1d2da19e8388 GIT binary patch literal 1617 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 literal 0 HcmV?d00001 diff --git a/upload/styles/cbv2new/images/icons.png b/upload/styles/cbv2new/images/icons.png new file mode 100644 index 0000000000000000000000000000000000000000..b3543142a20d291433a7dadc8cf563aaaef37665 GIT binary patch literal 9044 zcmc(Fd0f(4*YB^^1DQzI(5=7d*OQ zYACu>awh-)qSvlowg7-lT;coaj_pE}= zlR2-XtOQm%4^}>}pscQ?a$ZYGN#@Vj386OBZ4WJr%UAx?C47RMxa04CR|^ad3JOvT zQc*;rJi*GEnwlFj&YxEh&QL&yApBi}6%c6Iza(6Sq1{nlcm2JP2$>Cuu5QQxf5-`; zrT%X)m^PiD44515@m%%`uyd^8+VZYNc0`#U71Uksxr1-h}*~@^dGZL zOth{c(EhFnci6SdkP||FMK7=0S}OXQ`s(@`7nKYyDl01+C}|q#s~B8TQonLZU*)2K zzUE)NmyzxPzA%LUU%a>f=GFhVyc#2wz&r%zwKc+TqVp_!=6 za@+TI=N#tlTfDc~deQvAFE`Z0x5=hX-_z4yd7~?mD0nVB4?Z-G|1)PM+<=hnIj)pEZFa$Q*0vA#(@GMJ7&D^f zn&@%=G%GwS$BJW_*6+o4&8tgct>z^K-t@H3CtG4=s6&TUJhlS6K~ZrX5LB+d`&w;* zWM=Yn3|1mHd~CXJ9-i@PmGq|KXfrB1l6|&NbNLCD5jNboq#LwyQ!stwu!F6g^f#W> zE}Fe8p1ahz!i#5M^?Xfc-VKHwx2dS%vn!9O3Vy5W9rz8rd+NhVhiSLgLrhXnJ##(oS;*3!on>0(DQn2U%0gDpLp!e(>x5PRE6214*!4pd^c8ECq*Rh4pwAi-FJopo-=5q5% zk0)uZ($u8*pd6TK=u)a}P6kTyGd`;@E9!%sj~5ayZ<1FKdq=S__7X!!_84xi6W#se z_nlm#>)MU{IjM_S3&XeJ$Em(j&F^+CTub|~l5d5^`T!D1_vm(?*{k>hiXpK(XTgVt z$y1H;Q8bYc0x``+*;0K6+yb#7RsqeJZ1*da&8obi2hifW#R>p9btWtmK1%5G`6`(lO_H+Z0_+Q=rVFW)gb zY_ar(Sv-2!<^@N�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 literal 0 HcmV?d00001 diff --git a/upload/styles/cbv2new/images/icons/balloon-small.png b/upload/styles/cbv2new/images/icons/balloon-small.png new file mode 100644 index 0000000000000000000000000000000000000000..3b538de087a7eb37ec12623560ec144e08e012e8 GIT binary patch literal 472 zcmV;}0Vn>6P)4iW47;KE|huR!v6W8u$Vh9d{&7VP-;?(?Pm$v)O0%O5@Yy zz!T#L0bB&cC;wJkvy8PSAsCPYTzoF?+!3nrZ$!3)gx5sXRHq9tK{pEdK8V&NP5}J- zlwN_TjB>P96MDE*q!bryYr=_+QLb!4v;xT0{=j=!cfeJD@zNp}bp7=fqBT|kLe&wI zD+u$w3`l`|TA%%e0MSYhw%?53SZExM7C%3FJ8^5Fl|J&#w$=MFofhG-f2?MB8tlkp zz9aN&EdXG;3TPVX-~@x+1swKv`XSy9wPYl|!nHfay{DHNso4Xct}{JZp1MA5k^~`a z1*jgL_W?guWcN7!T+_#B$lf%UpUtw1*KGb-*>Vuyp-}Cx`ej$k;Tll#6oz_z$)a;mz#u?qc zsl2MgLV1bjBf;#~P5LJ~YGhyo?IXV?!04{3pnj;not^fc407*qoM6N<$ Ef<;0AUjP6A literal 0 HcmV?d00001 diff --git a/upload/styles/cbv2new/images/icons/black-user.png b/upload/styles/cbv2new/images/icons/black-user.png new file mode 100644 index 0000000000000000000000000000000000000000..f6e4dc8a31acd3e87e8d572f9a03c709bf0fff69 GIT binary patch literal 511 zcmVeK&Zflv<#x%tb-PTM5}&Cv@?Q!gL~HsBT+6Q5G7pLPN+pl`EBRe8%TMQT{z5r z_r81Py!-A`6}d%$9B?SsMc@|b%x}~d5abex#6>!tj&V_~R+G(UlkV00#?S(SBiD6f zs;cVnb^46SHp&S00NXGOJqQTj7P%Q)kq{KK+3c1M3x$68`~ALR+jg|oY8_yC^Ou50 zK$XN*k^A!qr=?QKpG+phAV9xdF8j-7%WFkLhn4c>o6 zwo%qZkN1rk*t9Im7>~yal!V&tHXHasLGz6XY#+D;c0JEavQX1Bo?jUbha^!7g~AK+ z55P5W|69RHBofIxj^k!BnROPhIOqY%y4|jlN~J9LPOsNH9t;NWNIeA#o>90>sXVu7 zno2kvo>73JDG3Ud(P%XGeV<3!;ai9RaZDTQr-d>C<}ljRFJhDyXDt<^fpg#t_!2LU z_~Z}@g<fo0A9ZZ7yv%Ul43kS-Pr&D002ovPDHLkV1m{x B-17hc literal 0 HcmV?d00001 diff --git a/upload/styles/cbv2new/images/icons/blue-document.png b/upload/styles/cbv2new/images/icons/blue-document.png new file mode 100644 index 0000000000000000000000000000000000000000..6b2545a5a31915b051147d705e8ae6563b08b8cd GIT binary patch literal 519 zcmV+i0{H!jP)YxP`S}Cpl{z#tpCQTb9DPFkb z=G}A7JNI3YJ1Afro0J*M4g#weC^b1S=)kX+&USM7Zhr*ZabVjDjzhgMxb#-RN#S*y zO2NNANpk^S>iyvejZP2sRu8rB4l1=aKEGP{s5a4Tb#Sq}mM7c>@v@-;LI`LY*)lXp zslzli=(+|zuh!}~zrMwKHg+u9)qP5E21n4@oF}4O5kCe4V0C4g?oh}qrf~Dzy`R2; zawau#i7aS#go@bq7^@s3AfToKWWgUJN(6k1Qbw2q={aC>vkYz0cq>s3q~`!LMY#V*Km{ClBk*dYM7*||2xyJ+BU~4(DufFV<1dT&Tk*c` zo;)mZn5z{p52<*7aE3|W!7LHCM_A@Cm!H-uULB<|>MaoK8FAR002ov JPDHLkV1n$i+Fbwu literal 0 HcmV?d00001 diff --git a/upload/styles/cbv2new/images/icons/calender.png b/upload/styles/cbv2new/images/icons/calender.png new file mode 100644 index 0000000000000000000000000000000000000000..8a3452a40b68b32dcc0114071e496d524b7f2a61 GIT binary patch literal 620 zcmV-y0+aoTP)fD~67s4rl+l|`MfpQAXlmU&CSeMUy8*G z9GAcSyx}#QIA}ERd0_#UCnw<^9}n_FIj$w1p&PW6;xpcDwUFJ|!0nwK#0&$!CMIC6 zulF0=nVQ1QbQ%{&M!>bii-#wm;NJ2w;={w}P~e2{(CBEt0k1KUNC2J(t_>!@E#F@# zGVh$u#vJBK<$oaBB`F?tFK=$bsn>DIG*OtJ*GZ0jrP#|tLE}gy0^&vWJ2zn961mgu z;?e9Zo-ZzsNt+LF%)eNn31o*F zoKit5mBQ-M5^~0=H6g&yR#r6TlW|BwZ;8^SB_13d z;q}@YlF1|<&&{Dtdf8r;N_{CDi&3rW$(JXjXNdl3R7#AEkE3MU_?L0562jm+B=?lM zk`}`JIB@IEV>Fw|TwbR&Cd3oER@eTg!71SUQ0na;0R{j$C{7a=)xyI700009OKpX`w(&=<^iB>9=mW##0 z1i|O?`6bre#A2~Fc`K^yhC-pUMx)`M&*v~6kD*vB{&@RjGJ$Tl3z10V)a&&U#Yn*7 za=HASP6wvbDHw(Ufk41iTrQXS86lBK+=j#91FB`DLWRTO5c>T-j7B5SbsY+Y0`~%f zCjqL-WHOJm1Kt6(P3>7M7M@7o!C;VkVS=YIsRnVvl?b(3?X_O7!)!L=iIg-L3_#N~ zXt&$YY&JPhIV%AsgeiDRrBYd(F^gN~iJCTmUhf^pGEj8MFC?BZ`D+Kw@uo|| znBb=b_xE@F5P#J*>~=fIvO@@1*8+;7aCPbi*8uzbhq#Y17A=4}B2esbIKgJyFn8ed z`NXm$#%$np%81|pi6#M6RYkm0sZ>Bwwtg*E)fe*!)oNA5d%0XvjPs+(vJ7swn?l=K zfEKi}4^-DZ9?!-X?wirWYqeTBo`0-4gnji2j}hkx&mRx+4RMWlKs2P)Jevq7{Lggi c`cr@b0F8e=vUz(16#xJL07*qoM6N<$g4r<$Qvd(} literal 0 HcmV?d00001 diff --git a/upload/styles/cbv2new/images/icons/collection.png b/upload/styles/cbv2new/images/icons/collection.png new file mode 100644 index 0000000000000000000000000000000000000000..97ef8389328b81c2c0bafc9df635058c940843db GIT binary patch literal 413 zcmV;O0b>4%P){*6Ad-i}`0g?xa zV|BrgA3wl+kb=E#=fHejU0nub3xHxQI9>4lJ1Ee;gAKUUSO+#>-@bhe=g*%9V~{vV z9;6Pd3oc%~$e^mK$_nzodPOx@%-Y%-t`H;+3}DvVw{N3{4J^QbfutZVF7Cs^!Xknz z(EwxS&C8cBw*&Ru#b$s2C^A4y0*UVjP|rII1BPy90thewJC?Zd1Fn)G00000NkvXX Hu0mjf-@UR> literal 0 HcmV?d00001 diff --git a/upload/styles/cbv2new/images/icons/comment.png b/upload/styles/cbv2new/images/icons/comment.png new file mode 100644 index 0000000000000000000000000000000000000000..9fde69bf0127a978ac0fe45b8f30abf7ee7b07b9 GIT binary patch literal 1537 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf4nJ za0`Jj+tIX_n~5oC^DMQ#CujeSKy zVsdtBi9%9pdS;%jl7fPQl0s&Rtx~wDuYqrYb81GWM^#a3aFt(3a#eP+Wr~u$9hXgo z6;N|-YDuC(MQ%=Bu~mhw64*>DAR8pCucQE0Qj%?}1aWkPZ-9bxeo?A|iJqZuvVpOQ zf{B@)k-3qjxtWeaaAJvqS7M%mk-37AfdP;(vNANZGBE@?1`L$!xPY`xQA(Oskc%7C zP9V=#DWjyMz)D}gyu4hm+*mKaC|%#s($Z4jz)0W7NEfI=x41H|B(Xv_uUHvk2+SOp z)Z*l#%mQ$5fy_-z$}cUkRZ;?31P4&hB^JOf$}5Hj9xxd7D-sLz4fPE4;U)t$+5iQu zz!8yO6q28xV}~WqY(P3u6d`Oy=udS?EJ?KkhKGf&fswAEd5D3Lm9d$XiD?v)euyG8 z?Y{XbnQ4_s+KqLMOhODTtqcsTOpKt~krY9-+vtM=0x4j?p$_sBnz#ai082@RhgU&q zQ4Tm-Qj+ykb5e6t^Gb?=VP=RLW+};5Y57IDi6wTKxryni`UQFEHu?xbyzYaz8kj7A z$x8Qly~<0PsAd0$=kw=#-`grb zyccCyv5Mj3OI-2G!(N`|XuMP_eK-*hc) zRn(o!CTBxTIT?ElE8g#n(VP11UUJXQ>Z=77EEB5ap0wJpyqFhV z`&ZJ&gxzDBPmgaMP)GVGa+kTee>+w9njShbV`WyKl>`i)b{|jq~ X+mpH#(-u4j7Q+mlu6{1-oD!M<5^&2) literal 0 HcmV?d00001 diff --git a/upload/styles/cbv2new/images/icons/comments_small.png b/upload/styles/cbv2new/images/icons/comments_small.png new file mode 100644 index 0000000000000000000000000000000000000000..f0bf0060f9682c2c0845838514ddae32042f65ae GIT binary patch literal 1657 zcmeAS@N?(olHy`uVBq!ia0vp^k|4~%1|*NXY)uAnN?apKg7ec#$`gxH85~pclTsBt za}(23gHjVyDhp4h+AuIMD`bX5ltlRYSS9D@>Lr5I=vCwv0Ch7k*w|MTBqnF4mMA2p zrf25aD!t#mUr8Y|#a1cY)Yrhbz&SM|)1#^=HMq(zB)KX(*)m1R-cG@$!U||WZfZ%Q zLPc&)Ua?h$trFN=Dp}Cc@k(Ggg0u(3#Z7WJivkG!?gW3h;*(zm}loVL$>z9|8 z>y;bp4_t_GII7Uqu5ZkCqjMkW@f z24*n5F8Rr&xv6<2Fuf@Vy^c8bf)YY*0nlcb)S}F?)D*X({9FaFhpjSkyTu%*c~HG6 zxZPrbQ?EYIG5VlrMT%ya5HRh4nD9gkJl}5a4bQTMYKfKi#2>#!D{Qm$9^K* ztb*pDj%#+qXjO)0l#jPu-Sf1(&dM#mmzd>^XIg*%Q=E2grnItLzqaA@ z(@T9WhqNVn+;`qBy{qyH=jsDNm9ty>KPXKSF z7HLHb=d^DAAfb0KVCl&;6REA%Yi_ZJ7u1Q)ntN5ZfpP7H?rxs9#ggkqI;HajvVyLr zJ$i1W)BIVLe``^^EK}>X_WgmkX16xG>4;?~&vtvke)ZCg@RnPd`_H;MvA9nUaL8d* zc~G_R#5$?DC+++X#NQNL$<*t-{2dD5@?{mPZ<9dkrWM15tNi|07DS=Rkx zJ`<_C{Y}!txv~Z-?E3a~;^|z;%{k|LWQ^EnJg9Wvc{-nQ@)_IY?u5IlQ>UHYJ2k&2 z?&3MCyoR?*Lg`auQ(ZOzOHGgavF#o1n;t31)=N%g>vYL~?jx&Y@A{RX=24?5ZsUZ1$IgdOsoVDZ+MbC8 z(l?@?U2%7uXnM%4ElNR&yFv5VwU^Z!n4Nyj72evlqNw%dpXNkApRE3WawjjbP0l+XkKTc&#f literal 0 HcmV?d00001 diff --git a/upload/styles/cbv2new/images/icons/cross.png b/upload/styles/cbv2new/images/icons/cross.png new file mode 100644 index 0000000000000000000000000000000000000000..a0fcee375c09e3c79c43f6fd66a51b6b99e2a5fb GIT binary patch literal 3426 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 Ef?$$=AOHXW literal 0 HcmV?d00001 diff --git a/upload/styles/cbv2new/images/icons/delete.png b/upload/styles/cbv2new/images/icons/delete.png new file mode 100644 index 0000000000000000000000000000000000000000..55e388b4ad0e8b65d52a4706493884c9b9324df0 GIT binary patch literal 150 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`v7RoDAr-gYPCCfNpupk$`SewN zeJ-}JNtbjp)S168Q=HoDvSik*J#tnv*Jjr4W|%F(xk0mW=H`EkRxukfUdl5*y3Hw# zYsv2V3ygai71sZ2P-nPa&fxKkDKPko%u2@i{<(rb6JO*5En@I=^>bP0l+XkKw!<{Z literal 0 HcmV?d00001 diff --git a/upload/styles/cbv2new/images/icons/embed_small.png b/upload/styles/cbv2new/images/icons/embed_small.png new file mode 100644 index 0000000000000000000000000000000000000000..9cf5db87d2eab2b8a09ec9768da70ccb87f0bfdf GIT binary patch literal 1495 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE;=WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2v2cW`)d{3jAFJg2T)jk)8oi3#0-$aN1{?c|g2d$P)DnfH z)bz|eTc!8A_bVx6rr0WloBA5~7C5J7WO`H;r3P2|g(O#HCtIc{+1n}DR9FEG$W1Lt zRH(?!$t$+1uvG$^YXxM3g!Ppaz)DK8ZIvL7itr6kaLzAERWQ{v&`mZlGf*%y)H5_T zF*i5YQ7|$vG|)FN(l<2HH8i&}HnK7>P=Ep@plwAdX;wilZcw{`JX@uVl9B=|ef{$C za=mh6z5JqdeM3u2OOP2xM!G;1y2X`wC5aWfdBw^w6I@b@lZ!G7N;32F6hI~>Cgqow z*eU^C3h_d20o>TUVrVb{15Cdnu|VHY&j92lm_lD){7Q3k;i`*Ef>IIg#cFVINM%8) zeo$(0erZuMFyhjbK~@!5ITxiSmgE($w6<)Y;9*+|tp|(AB`v)X>n`&C$ux#mvdY z&D;&9*Cju>G&eP`1g19yuGhr?r(RG($SnZc?2=lPS(cjOR+OKs0QRs|CT_R5;4}}a zHwC9#oLzD1)dxC89~7-f(F_v;rX3Iyo@jv_c(PB;1E%#NV4~JlyvNAEz~t-c;uunK zYs(aS9}!29W99kRV)Uwaw@>Wyn&9+-g)5mOB5|=;)C2)1W!dmxN#(U-9z9d1NcEa6 z_@N)@v*Exg32PyawVk>F2Xf2apSvG@f5OubE6(}uJF~|;f8Y1Fv&|oyN%1b9JO6gs zp`x8NXEJ*PLp-*HufHCjcD-oloh7e#$!?9x6_mOCdSgXK#MYkaid82}7=I_YI_GWr z#xjS=e&hb-tBhpgwnj}|voiQN_XJ($_~dixEMJ=W=IT3F@#YB3?wWW}gp2jKm4fx@ zA97zhc;8KY;@I{cnmZRIR{9!wh=Y}1XS z6V^LR8OSHz<6I~3ebz^ZBwvX(r)P`(<}6KBfomoA`j0yAkVpQ!|@e=IF8LI*Q{g+i=Okz#&Gkh zH|*bZPn4-nl<9i=iTML-%=Ld#iGG@szvjq)x|^EoC!Dj;=S1D>zvVp}ZZ#(y=5vgf ze0r{}NLiudN!yA|)(`eg`g>{jUfs?&j?2n_et7xwc6pKc@q@E$_bP0l+XkK6dN>( literal 0 HcmV?d00001 diff --git a/upload/styles/cbv2new/images/icons/group.png b/upload/styles/cbv2new/images/icons/group.png new file mode 100644 index 0000000000000000000000000000000000000000..7fb4e1f1e1cd6ee67d33ffd24f09ddd5c3478bec GIT binary patch literal 753 zcmV(G`SI(6vnfMgxg){D+Lwutc1Si0swhN#FwOv#}l83ts6rCW;r!9Q9l zl<41549yYiq6clJ;(J(YgF_14nmKFB@QK(mo6I~sr{BJxJ$rsp0HSt^ntND0Z;o48 z>O2Ckm9}n?$F`*>$L{;{zT>f+bCm7tpaqw^4q@%k z&cHHt3=3xZmt6rQ_dtDM#)Xwp66-Thu=<9?(zFvpy0gAr0U4Z3smE5f@pZNr!NoqT zEjSPuCQzMw(H;?yvf{+e;!7(;4hv)+d%cjKFiBL%egy0aeCof8z<>rLEjMsF|CBRH z86WcxAYvS6H;Yq)jY1Z-rrjWiu~m;clLmJlDAE7UhMJ*jBxp}s&nQkrZvqDXxsiv3 zSJ78>4W2GFIu$$+Ic&5Pq{1?zhIy(24enCZy35e>z6~XgVx$x%k(+>tPw)9SL~R?4 zs${`1bqjTFC3F)dxIIw>)!QP7$vk+;^#2c5r{lsjtwKYnfnn+j{~{GK;|I8rvPFU z5NbS#W7m)ofjNER&&ggR6fXi0xd4%4143#8JZlhXW+2TN#8b=5@L&-EUlY^cTT=>w zb_~+jfcRCYfdj}H0J49#sP#gtxE~%YBJiQ3AjMgoQJKuMITA}Iz|zizG7pw|7R*XF j=$D`QjOCK>V3B}dL4UFUkhgq600000NkvXXu0mjf1x-zB literal 0 HcmV?d00001 diff --git a/upload/styles/cbv2new/images/icons/heart.png b/upload/styles/cbv2new/images/icons/heart.png new file mode 100644 index 0000000000000000000000000000000000000000..d9ee53e590a68a95a9fa9483f0ebd14f3f25bb72 GIT binary patch literal 749 zcmV{UrO36YoGex>*KgTU04Sb0lNGJEiq?mmQbVHD$?08PR{#RY@(Jtf90i82`&dI!dW7jO<!P=IT3`*tHLxxjwl=}>+*)uJ zQXzyPPN^^yrLNn-L6|)gDrKnEAdbPP1a+KXt(F*+N-)2L{Eb_PQs+ab)QQT6Pw(ST zBha=K(orHRSCfHi4O9%(3e<(Lb`^!uF>+VB$3*L{zr`0-_;)Y*n?E-k7dr!rf-5ve?cY>d<{Q2T>(phfG`V$89Qfr0$5PaI$GcI;T;lseVaJa_ff4eP;K@^|hsa{cCz zXuY%j{{3s?^}(OQ^lJ0wCa2U<(RxpI&Wzye%Qu%q>x1omeM7&Az4w3Z$LrQ@df3^y f|6iKmf8+cE7K65BSFA1B00000NkvXXu0mjfxAtvo literal 0 HcmV?d00001 diff --git a/upload/styles/cbv2new/images/icons/heart_small.png b/upload/styles/cbv2new/images/icons/heart_small.png new file mode 100644 index 0000000000000000000000000000000000000000..1b32d7db8c81df61802b2e366e5288126f53b1cd GIT binary patch literal 1292 zcmb7DTWBLy7#=oVdM|0ahODKVaT1{xGq>E#G?z}2W*fSRAq}*?InA85V|Ol{IW=iT z(FJ=EqAx;Ox~!rvQWl?#wARZ$thYj4#eFDR5h3xRBC?3=+txGPrt5?qi^o+R;69Re7id3?`x%n)cmsjJlQ>H=G)1!%!@8LO=V3XT#!ni7s_Ei1mrEp1 zYN1(}n1xW|D5_X2l0^@x>N6A*34PoE+NrE!oE#H6FsdYI6hqSHmg>NC`oE#Fe2O+;4m|Yxufj%tQ3F&C80vyv zKo>XdG)rk*Tn7SF^}MQHuAgFdR)wlDt7>?B+=ov{il`QiV{|&rr4$1SN&%!2VFK|< zNfJ3PABgij<7Wdb%P=D}AM_@JF<&z7iFtes?W=PWYGFYJ3aoR*hulCzt{DVbLzNRi zm!1b=QdedCc*C63*o(KJ-U(N1?8VoROCd9qd9DAr=K2!KjyXIHEt;Ih9w;d5Itul# zju#(858`U}QhtOWh{3@@m&?`P-#;)gfTGyf*GEy5&1SRP?L9p`ZnxWNwRUxNwYRso zwzfJPj^^fOMNxKkb`A~>4i66_kw`~J$MW)Wxm;dfUtd{S85$bWb=~Xr`u+Z~v9VgM z*4x{=x3`zgW@E8frBbn2EIiNe?(VWIyT8A`y1F_%JiN8FwXw0Wy}eD6!}2vFa02Xd(n0!YfXIT|L_@?6Mwtgdz8j<2fuH>!QZ+0aYdx9--$p|j_n`mxK1UVHh*+Rb+~vgL`l+VrU&`fluI z^>$O_>ewr(S3kJ#e59%P*O&6`I~O(_H!9utep9NOA740g?VfW6cGrG+_m)*~yx{+| uyFCBg`OYu8D{s1T<)2$Bn|FlhSv&U4;|^Pr|K5$9VyTf#;{DjOSN;aOi^?Vd literal 0 HcmV?d00001 diff --git a/upload/styles/cbv2new/images/icons/image.png b/upload/styles/cbv2new/images/icons/image.png new file mode 100644 index 0000000000000000000000000000000000000000..fc3c393caa3bc4371d12d0c67ffd6d333ecf1d8e GIT binary patch literal 516 zcmV+f0{i`mP)0oSgT$J*kO*Aq9I~CW*s{G*(t$KS{OS+#aO%?udUme<*TTEO`Fr@r_QT zk=#}u-n~>Vm!+9S1PE{@3<)G~CPb<$Za;W?3+O}|+q)?*Pn355=}S(XIZmEANjZci zf5 zj<%@MX^bD1^BwlS^+AD|$dm-1wial0hwPI;CDM?Y9SXW#@w-UF0SQ8OgplRTleOB2 zUjkDS|0U9pI|lSN*EvXUa~*UIclJdZ#)Npbwh9>YT?Z;=B8|l&^t~P~om?<5Lre$+ z;%`P>SL7`djY#8Y9$wv9dv|3p)R5;6p zlih36P#lKyR|!_HEbWGst|FC=iQ<@LbGEBn!qA~>^`=bSiulnBr?QncO;#pi6;Zs= zE5Qp<+)W8it;X7qG?~p1m)CPnztUmZ#RJJX$@_cqa>9+wNjCzsvg!_rnj_d^tc!C} z)Q@x?#ZBGNBVH`Zj(sOsLg54o9R~-vBzft{d=Q_JF@P(P4aH z5rNrN_=Fq|1VyW#8F!Fu(8+xAESBFc;{Lk?9=^Ycld&v_8TK+`0d=x@@j(PDA8%px zLle(T2Gs0LSit9aqRaK$cs>_Jscym*k~J1kA&H)AE}TlnF?=b7!Sg8)Ww^pQID;9u zC$aGm@=IlOFc!dpyQG98;>{t z;K|p&h|8~-wr?s6WqcIHcEDgr+$@!=(1_vy38012hx0`X`ENTN=o;1bhSJE71W+tD z;G84@$9QRBXj*jSA^cvU--B7JvbhUf_1^bP? vP|eszjZh`mO}g5B1MG#;NxNxl+u!*If$Q>9A-V11`Rk^3yZue@k2l+$3WWmL=Wsau>7F2+PS+!mh$6s> zR;$JM58{^OQ>!C)Yh$;2Gw z^ZBS)ERuXWo%qo0cFAlubMR<1;y|?J_xm}Z)9G+)yWNf|l?vr@IXWB;gci7baI4iy zi^YPs5Rb?Cw(WMy30y80>GgW5R;!duCTYE1bBv5EZ~`|PjWiexxFT7Wsa!5ov)SYX z(P)%nu^8LnW3gB`<^iA0X2S=KM#JUXY&NRZYJ4Ng&g5G(KIvHp8+=x))wKnDP>#x% z%O!L4Jn_7zTDEW-?;A4pe^4+Oy!+e}s4YMVc|0DIPNySJIQ(pNlgU@M!AG6J!_y(c z0AM3_yPaPD`cC4nV?c%uHr07PfP4yAy z#w(}OsW==CkK65L2dog)Os7+lB#E?IEhj+f2*M>GvF^tCe14R|*FIl*wr>SK2)w)L jzX%isDo^L~TYv!o(Z*T%a9J|k00000NkvXXu0mjfjyovT literal 0 HcmV?d00001 diff --git a/upload/styles/cbv2new/images/icons/photos.png b/upload/styles/cbv2new/images/icons/photos.png new file mode 100644 index 0000000000000000000000000000000000000000..8836fe6c07911bcb04b4729c04304d8bcf513d66 GIT binary patch literal 647 zcmV;20(kw2P)uGbh)OD` zgcc!@P()C+7(|Syv{2NWl1}%|Ip23$OfzL^1Rl7H!-a?UPH0>AuIgq>Y&*abtHh}bOQd8rj^1=cFY2s6_~{FH~Pqa?m7MUmIL zXOcRvh_#B#q^Swkk*#g!jm7WXi&VJ<8 zrFU3SGIfR^Sgcm?D>^DRQrV;2ce{u!WPvAN_Ooa<6KaGN;mE)!NfIOa2cTl3sg$9s zVVo(vQNs))-_MaGw`pzK zMsTql`^! literal 0 HcmV?d00001 diff --git a/upload/styles/cbv2new/images/icons/playlist.png b/upload/styles/cbv2new/images/icons/playlist.png new file mode 100644 index 0000000000000000000000000000000000000000..bd9f3af7100b38752a9663879ae2b6ff6a216f46 GIT binary patch literal 267 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5X)_S@)hE&{2`t$$4J+o>Vl*p0qYLp5^D_8MwcF`zG`yys*$v*@h=6>&ru_X(u2<$aVd2sHA*<;R^ zjX!>0*JmqLwrrdIT&|JT+uNJ-*XrH7r3E|sHZ~RT{ubZAJYRu{MS@}dSudmAJ1+PF P9nRqC>gTe~DWM4fae`{% literal 0 HcmV?d00001 diff --git a/upload/styles/cbv2new/images/icons/playlist_small.png b/upload/styles/cbv2new/images/icons/playlist_small.png new file mode 100644 index 0000000000000000000000000000000000000000..ef525f694559bf613d5b6bc42da6309d149593ce GIT binary patch literal 1332 zcmbVLUrbw79KK7HG+VGSZor1h-6ip1toKh#Tewi0wzq7h6icZ>2q9j24{*coJ$Lt> z+6!?h8fqL5W+pz6Wib#peZb5BPunybM&poC9FSmmVKLDM6I_fCo>)C)l=&b&c#?b1 zpM2l<`_4Jvxg2XfS9!K?vEEfs|EjWcWnA_cM^pO(ba^~3EHf0j z2SI~g>Zz&DXp9U(9gr@XwI^9OOS(ClbJlu1p0lKb$Wlmo+3q zl`JTVy)cEm6n6S_3yO9is~Y>qgb$1{MUCNTwy>olFdF@DsG=O84HO5@{Qj%3kr>hd z69)!N=}CNXebt3h8Xwewh@hT;@IvtvV*?ODV*qMou-!#=$f^X>#vVEv<-@9hL^TP* zf|tU4T9zf=6A}c@&(=FU4j0FTSie8u5o+B{bxyz2<*o}AxdKe46riFaS9-?vAIdER zLD6t!0qF8OKx)#VLhfytmk;;iIaF_-D;@5o?ocj+%`k;){l_&ImvD9p!-LS`$wBOa zinFfcP>;Vmzlk5jbgU&2QWT}4qC%GC%F0Ts)w;aATvJnHu~F3_V#u-9BylCOQlk4YikIhm6a8r&)3t_qiNdg>})I+ zTU}iZ27|l1yOBs_dU`sS%bBK`&*ydbrEjqL1{7~?$J77Wh{^97Ud1w>hXsGaT>m8Z z{R`g`6_!W26XP?b8z0<>Y~<%gMz7@WWgq`s8-4hEmvk&puBm`pOqn%{l9f zSAYBH+IZl@Cr=)pZdkbf=f_{#9@#RZmNzfu6WJrfSKqpleQhgt=ErMap9x(4?5mdf zi@#@X9DDG`)Y{gs$34DZqFX=QSZ67RWAxOmn|IfL%D()bVw<0|KW9BV82QwG`riG& gRB7X-rZl3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|8Mv>2~2MaLaz}{y`Y4UTL84#CABECEH%ZgC_h&L>|v`+oNjS)!)YE= zZwhX=7~s^a4|I$^C|Z%C872fwJ0K=J(E>T}WS^P`OzTC!MD6*T0hq5CO+8&4Ln>~~ z3EG&|93WzQ%jMN1Eg=D;l+*8oJna^mJa{z4vRkE^^C#nS9==`WYq~Gk7jX2gt80?n z(p_?4&%W;&M*=iV#reJ$y|=wnF6VB*^O*Ml_phVJ7i7*7)ty%*6yCgRU7>%+6c34? z`WM0z_r@jL&5y5k`NN;N`R0L5IzG!UZ`0r8D8Bh7&*F<6*QcLm?R#7hG;0~h;SG0p z@64E`W^?}V!-9rYt8Tn4+mI{m8hD^Ic1r5acU-&HiHEE{#KP{_a5U-Q(fQ}odyXgX z+j2Lr&}#0k`rvypHgf%Q6g-90CUc(O_g=a0ar~`?8eWc$>mu}~tDH6p3Ki{K)R8gE zZP#ac5&pvuKTH+)svP?6&4>gTe~DWM4fqjjsv literal 0 HcmV?d00001 diff --git a/upload/styles/cbv2new/images/icons/quicklist_small.png b/upload/styles/cbv2new/images/icons/quicklist_small.png new file mode 100644 index 0000000000000000000000000000000000000000..d868892df73f276303b9c47670b2791042941241 GIT binary patch literal 1247 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh1|;P@bT0xa$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%nF$y5hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|8Mv>2~2MaLazx|v`++-@<%X&zK> z3U0R;;nb@Sbc{YIT9Kj|CIn17ASOJ~0y*$xpPC0u>qWpseS?3tC<6mysHcl#NX4zB z6pbpS0|yRF;5eejbEGlc;m)x`AKvqO1oI0R8w&8-Z7}%rH`R5Kn!pCOtUo`wV?*2; zrY2_X5Mj2~RzBQPn=ero^Sf!?6LIdt^XE$(Opk+W56>GLAD$eZ0}mQjvETZ^ylzF( zNme#pNjo-8MZY$teA5j#t`(n`M<_67!j{m>1Y zh2MW3=Mml>b6noS;J}~$xeq^ozklFGLfVgikJ*{cOc%UJa1`J3^@VD4+AAftum$z= z_x|O&@}!StJ;YG|O+kow=nSROEQN L`njxgN@xNAF~PPN literal 0 HcmV?d00001 diff --git a/upload/styles/cbv2new/images/icons/report_small.png b/upload/styles/cbv2new/images/icons/report_small.png new file mode 100644 index 0000000000000000000000000000000000000000..ea4a57e0e3d615511728c714332db85502d9ec85 GIT binary patch literal 1370 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc3?z4jzqJQak|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+m=!WZB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxKsVXI%s|1+P|wiV z#N6CmN5ROz&_Lh7NZ-&%*U;R`*vQJjKmiJrfVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8EkR}&8R-I5=oVMzl_XZ^<`pZ$OmImpPAEg{v+u2}(t{7puX=A(aKG z`a!A1`K3k4z=%sz23b{L$o& z6x?nx!>Lyv=oo!av?4__ObD2EKuma|1#;lYJ~a=R){B6Nx_)nY0x(1D3h)VWWnyBQ zFku2KD=P;F2RAo2A0MBfprD9|h`6}8tgP(k&!45GrO%u>qobo^VPWy&#fwLe9vK@O z>+9?H_xC3!Cx89=)zj0{-Q9iLwryHkS_ugWii(OpK0ak-Wxc(xK;*K79Dl)6>Jk!t&?OA4f;WFJHbG7#M_xhMqWaA}A{SA6nNkif_6Ei! z>#Pe?I+nfjnC1D;Tuxqf&-7K)ju$$KaQ-y(Y>l+%_Y%^{3ro78y-Ci!yLW?wN?G@> z?bgTJI*MXSBGkRMKaC1-D44zUMEKU284a8(ye3_r)zG_aYeZp8T(0|p{pB{S5)8sD WR)6fvc-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxKsVXI%s|1+P|wiV z#N6CmN5ROz&_Lh7NZ-&%*U;R`*vQJjKmiJrfVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8EkR}&8R-I5=oVMzl_XZ^<`pZ$OmImpPAEg{v+u2}(t{7puX=A(aKG z`a!A1`K3k4z=%sz23b{L$o& z6x?nx!>Lyv=oo!av?4__ObD2EKuma|1#;lYJ~a=R){B6NT8~j-IRgVDUw}`DtG>QI zGc&WGprDxf(0xrEKN;Kz|^{M;X*}4 zMI$4l)vH&lsi}#Gh%8&S44CYtq@=cP-8y;lWKB&?RaI3}Q`44~7Ck*Zb#--ld3gf^ z0|y6(#fukrbaa%KmZqenw70icRaNEWT6Fq=tru-@kuPojUcvfdiX1Z901NsI#;4_U+qqb949Z-J6=4YG`OUXU-g8 zuKM-s*OVz!cJ12r|Ns9r7Hv$xq9Up!$S)Ykr43-Xc&#fRXv<4a7srr_TPbJ5!w)$K zv_15{tMaAQql#ni_q6ae3liS{`EQ@p)*Q)iCtm#V+|1Y=kLU6xi?jVRoWRfB7Om$m zf4DMZ(uBxgRg>ECJa#PlA^K{O2>*-cBGDg(+)kRlUUqYF#cY{{@zFD! z@V52$U)5TiSyEeUn7&_Ti|}gu_kKc+W?Eje9z9Ge$9LPU(ER&EB{^QEFRhTDR-@#j}oC9BS-g{rdeWZEhhI3s$&G2PhqCd6eqH*w6VY wQSW<=*y9P?|D8(vt9W=#UjB+%_Dnns`&Q^&nEkuzDySItboFyt=akR{0CX5m+W-In literal 0 HcmV?d00001 diff --git a/upload/styles/cbv2new/images/icons/shield.png b/upload/styles/cbv2new/images/icons/shield.png new file mode 100644 index 0000000000000000000000000000000000000000..394c32d4fe790f4cf8bc8fa7d7265ef9147dc55a GIT binary patch literal 706 zcmV;z0zLhSP)JU~CT-VjrSu2g z2J0+E2D-u2BDhY*M0eS(2m}9u{Q(|5dKx==Q1B?8MA*ED;6>=zK@m28bnGCT*mm7I z(k^M5rb&F?HjBkMUwD!)@Ap1Wp7+fc!EqeC6a;WMgn>Vpq}x;UV#Nk_31A3r@&R!N z@K?A+QNmhwX=$3lYeK@t`8X4JLs%uG2~*_c*_FAu>#(_4p! zhi&HcJ5UV6=(O8yPrx)yG&Qa3hVrm1tDE=vd>Bn8JIv`9s8X>(_5!yH1(Zr9D2mc8 zmSq{#9sGWOZ`zp*nvF(_IES8q3H+#5tC}bX;bO6f4(UshbdJm+lc=t$P3H8^VEeFA zQPYtKzAr4`e-RYT2c1=?$=z8hMvOd*-N1uU%0~TejE5NOU z7)iiC3M^g*?&oDW%L1=8?c*Nsstmk4?0z(8e71;dp9!!ddO6~RAd`lvl{>&g{&nBe o-*^fbu4|e(jtIxZ?fe#C06qE|fT%pT+W-In07*qoM6N<$f^9-Y@c;k- literal 0 HcmV?d00001 diff --git a/upload/styles/cbv2new/images/icons/star.png b/upload/styles/cbv2new/images/icons/star.png new file mode 100644 index 0000000000000000000000000000000000000000..b88c8578956ceec4ff17f81995b8652f6aa2b58d GIT binary patch literal 670 zcmV;P0%84$P)rx?szq&Dw38OK zY!^{rCAFy_2z8TV&4=Ube7+y|oYO*02OOyb5BD7I^ZdAQt`ZS+tMaFrb6^=AxbXHx zH;=|4CCm%L{PZwSS3v3G^sH+#W3JcR_xs(&`Tqt8^J9}d0vU#im5^f#04JL4qMaI^seoYDXwB>7;oyw=|M z1!ayym?6XvqV3ae_f95{py8ukt2TxB^!VIzRRh4#rNu~y^X+P>L{SXo3_|Qqm>9wY zz(9!5s#OBElpmj4DRyjO`0`RiEIkUg%7D)8y}}Ye3}prow;JG>UQOIs{kfZSJ9bYz zskMPbH9)1H6FDf)1=ZKVfe+;jf`a(O{!9meiN~~d0iA$0qX=t0D6Ydx4#RO76h@#R z9_k7Z;$fv6G>QeZ{Yu0n&xL4%!?l}UPj4!j&Vs@?dl=y8#_IQ`5I-5a_T$dJtJ_~5 z4&186>klZh{hfbaz1iyEv%?$mbQ(# zwJpuiQJP8?X_`#S8b+U_G6=ziYB!xPAcq{)ZJ0bECH@ zYx#`n8^Wzn^J!4>=q^bltNO15ry?0ecSLkjpT@vlid!jk)Fjf7&)q_V5zGs#3N%6* zbW~7Hg=&P0&~Y(|g>$hC9FL?;ttzPDZbpZu9OLb33^e2;FNTGJxScp1&q4M+y2ntQ z?C(=hpU$3~`Thx0eHwi0x`q+!d5k@|0_WHe%sG3e-s^MM`xM-ig!VcIA7H}X1ot~L zg=MLB4w-Q;Bi!!u2|I+Qb;0{{4Q53YX6+4_aXena{nmt*!YG7ua~`qc>o=?@U?rOU znS7%>klzi*muXnbM6i@4FR@s^8vTjDgy&%J?w?`u>NYMDFa_2%0SQ(qJE<3=<8Bzo zfdU60e*y(^$RF%r$kl)p7=7tlCDa$+J7w>}DU(O#~fk>pYuRvHi1E9^msg{tLeV XM&GIRvfA7%00000NkvXXu0mjf&%8>| literal 0 HcmV?d00001 diff --git a/upload/styles/cbv2new/images/icons/user_add.png b/upload/styles/cbv2new/images/icons/user_add.png new file mode 100644 index 0000000000000000000000000000000000000000..deae99bcff9815d8530a920e754d743700ddd5fb GIT binary patch literal 746 zcmVR5;6} zkbg*1Q547RkCGx=+ZrJV#zL@SQK$qJV#CSW)Px1IG~1R7@Ce7&_JfOHMV?!rlp(uU_DLu%oT329{ zvd}^m>Zu}~l!lF)$vj*+!9ivWYi3=6E`B>+7|Su$tH+R~2!#ne6eorwU&M#{7<<90 zO$iMuFlR;n2z>v9nKwp!?XQQ|aSfBtZ^J)10wQ zP}rH=KSJQ4N-!Ms3A?4X%~8iSR-zylzlSXd_?|M%f3%_Vax4V#xlec^^VT&5JP8rX z6}RO@h&}Lqo`s_<751_e20DK|@e2`2FToK$y2KTlwyhFyPdYY*B{>w4$%B}fnn&9d zQ0xQp-T@b00q1)Ft+NxwMg`RMry#!}42Vk(RW1t-$ePmK0V@&mp4&IBO>%w~~-qNFem8*NKi5C3*h;eH{=}2kRqEdNlF-|c6B{jNg1xE|{xZ_qq=T?P)vCi#|P&Xm-dkucwL z3)87{8iWe96huvPHfK`KOdC2Z({T6vJ9pwDx$D4>d(Pqff6w7Lmj{5i6;ZyPPpPN; zroaW=6d#@oL2Fa53F~$Su10(RG%K0p3VTuP3?Z=nBA8z$uq+XLUL^QrC74`bU|!e| zr>hK{)%Q!vdmIO5Z3JIvaOyjOX`X@c8-ua03`Q&)f&%p*{(A$q`ZTTjk%q_T7>v^J zu!R-a9fFLScYlKkNBP_Cob=9m9JLVoC-?c{)eOtMnh7qNN{ejy2sM{pS^mgFHJm@(buuM4>=<5Vr$&Kzw{B?uPr; z(1Yf=#g)zADkWnx=MR%ykl| z3Ui42k+O2{bCn)01-s5Sxp|z{G2di&KT(_M6;$EI zDL57JFf}cw4bP1P$pgTRKH$0@h|~aA>j`qZ2*kU5t2EVD5#~@VNhqx{vz8ethDD-=+1vnemftUBA zF;N!Q%PBB5B=KLB#QO(CHe?;R+-C8M?ppDW>R$5`cCPq@YpusFRTaH1i9Kv;l<>I( Ze*oTy+;kdDB`N>_002ovPDHLkV1l3CM+g7_ literal 0 HcmV?d00001 diff --git a/upload/styles/cbv2new/images/icons/video.png b/upload/styles/cbv2new/images/icons/video.png new file mode 100644 index 0000000000000000000000000000000000000000..4471d5d0550dd382966847f8d6519575f049a25b GIT binary patch literal 1769 zcmaKtXH*ke6vwmr#pUSP-7kC2dR85SC@M)N2`wX`r9hO#m;?bEnIr>5m`s=%AYcP5 z2v&-Uy*C6bC`ywmiekZvASx;-f`Hfyx-SUqepsAyX5M>q?!E86`~ThZl9dXdQ8uG( z7!1ZJnXgy{#^0^)h~eOC&-zUbhQDY@Agv}s=opm57+wZKhe0wN4aHO#YKV=j!Q2>( z;gC@iNC(RO5IupjQL7Exf}4RigW=|3F{Ao$jD~brsL>>3b`_N}A)`Ua3~-Xea|WcI~Hz})(q!-V=w=x`zPM^b@u zB_tw9402+_EIsTDL(W__m+$D};^F}DU@pvoc^oc}#dSgWJOqZJ{)Y*6BMl*lN-XW) z3#^39Fq$?a98OG33_FI;Cdg0@S0E5rWAJz^V8NndO*Cp@nJC+V2x5%VlSVUbButPs zBB~>zXdx41`r`<=c`&Sr>Ms*07{`K|Ib1euJ<@=oT>f)Y93Ql%XchKvzW*DT(!`oE zjtZlQC{hoE3$e9sWky6KhSCJ7A&7{9Dk{SWnxMi6GbB%l9x`6PuVKhsB$6S0IUpI1Ro4H=Jn##! zW1S8{3l@XeVyv5p2=j|+S*Q-Fu~5wZsNp=lO|2Fx3`}> zdGeGgQ>IRx>fqqOVzJn4HiyH3VVKM1@_0NxpYQ1C=;Y+&?CcCW$JNypP>&$Uv}x1a z+}wmhp}V`ghlhu!r>B>fm$$dKNF)-A#S)1`DwX>9`1tzz%4D+X)2GjvF~iT#PcD}$ z6pEQMXDXG-S+i!TR4TPvtFh={;(++;El1YtItBO@b8 zlB6h#rs=4tsOacu(7P6kB{nuTE-r4-qD6}rFJ7`_$RehrlqBU%4cL` z0I`0kmYJCeL} zfn-OI9?ic6N47P7aV2$bI6(iIXQ!o;r0ZFE8)(>C(`V0~wY0RfwzfWh{`|#@7j12AFJHcFZ*TAD z=y>(&72p#<*xlXz`t|Fco*n?_+qZAuy?gim{re9eK79Q6@zbYIpFe;8^5x6duU~t6 zd%u1A2HO%twEcSFbqlu3Z?$RE~_2!r&e37 zEdRBcs_=&^7=<=cnx9#Rm*)(t9GPiXtI3n3C5T4bxW@k-584aO9T`+C&?i|hADKiU J&h^$N{saAa?>7Jd literal 0 HcmV?d00001 diff --git a/upload/styles/cbv2new/images/line_sps.png b/upload/styles/cbv2new/images/line_sps.png new file mode 100644 index 0000000000000000000000000000000000000000..4047efa4b7cf384ae7765e9243fd10d4d2e92872 GIT binary patch literal 129 zcmeAS@N?(olHy`uVBq!ia0vp^j6lrB!2~3Gi;~lTlw^r(L`iUdT1k0gQ7VIDN`6wR zf@f}GdTLN=VoGJ<$y6JlB4tk($B>F!Nw*4qX&#DSr z1<%~X^wgl##FWaylc_d9MRPq}978H@tqDBMcUXbPJK+ES^o6^5#oJR1wtDzTsh>V~ z*l<>{SheRPStbjog4kmke&MV!nKEYFQ@n! za<}LI_;#GH~(!R@AeyJ}3I+VfF)z4*}Q$iB}jFe|X literal 0 HcmV?d00001 diff --git a/upload/styles/cbv2new/images/login_button.png b/upload/styles/cbv2new/images/login_button.png new file mode 100644 index 0000000000000000000000000000000000000000..a6b2381c92601e6d45c6c03be7b51fd5f192b2ee GIT binary patch literal 176 zcmeAS@N?(olHy`uVBq!ia0vp^j6kf%!2~4JdY{+=DajJoh?3y^w370~qErUQl>DSr z1<%~X^wgl##FWaylc_d9MM0h}jv*Ddl6KX-mD=36PVaI(8=G3&|NjTS)GM52So&YN zv+?M~9|d1$R7vvNRh{4R;#9Fpsl%BM^IzVtpHauA@Y`OZ`N{u<-HtaoeoG|eG%zqT YOp;6du_}+Z4QM)pr>mdKI;Vst0N?CFg#Z8m literal 0 HcmV?d00001 diff --git a/upload/styles/cbv2new/images/login_grad.png b/upload/styles/cbv2new/images/login_grad.png new file mode 100644 index 0000000000000000000000000000000000000000..96f1be37e67e4e6ece7421150247ee22155cb91a GIT binary patch literal 183 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 Da|}<5 literal 0 HcmV?d00001 diff --git a/upload/styles/cbv2new/images/main_box.png b/upload/styles/cbv2new/images/main_box.png new file mode 100644 index 0000000000000000000000000000000000000000..a91fa886bed99ca0e4d051d0a220f21914efa7f5 GIT binary patch literal 6944 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 literal 0 HcmV?d00001 diff --git a/upload/styles/cbv2new/images/main_vid_bg.png b/upload/styles/cbv2new/images/main_vid_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..bb9fc3124c1618db283bf49cbe8c1de6e45ba76e GIT binary patch literal 133 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 ANdN!< literal 0 HcmV?d00001 diff --git a/upload/styles/cbv2new/images/ok.png b/upload/styles/cbv2new/images/ok.png new file mode 100644 index 0000000000000000000000000000000000000000..34ecbdaec429f7b7e7c282d6983024edc1e9a714 GIT binary patch literal 629 zcmV-*0*d{KP)Ij-xAxW&{zW zf{Hl~nbKn1)1JQin#Dw_=JMHgUD9G))68^4fiC%%Nso{%)1qBOkiFE-Sd8KNy>|>xUw`WEPCH7R0R_`d8U^{-Dr}5I7(RXd#c<-v z6NbP4{!9VM!41fpY8V2~%JV!XQlyht57>`19va%7n}_kKhJmPtl#M zB*VX&pO@__kX;AU3}jdHah9c{{MsF=KU`WuRnh7o0NTiE=&ze<|NGo4F$0r zLrp=3zkdZ8cAt3I2o(DZl>5%h&EDc*CdKgm*JlQXf4mImZrs`p6t6^fA<764Ck-EVfg&@TPslWdh{@2 znp1dh!PoCU(zhJG&cMYg$iT$N1hn-%!}mWQ!0b<-m>I6!f3^Uqt_E8Sfdg@V@xxhP zzJE*KeE2HZ5Dr#$23BSkAX|W8@0shs1oLM)t|*2_Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2igo3 z5F;zob@CJd00IL^L_t(I%VS`m7jUlR5ppc!u|OARCf0zM4A;3{HZJ`JZqnu~s?Sf} zJ^bSx0|NsC6ET`Sss&6`|U z*H4%4pPK@cBj|#_W@&F(31NpHzrHfCGVw87xqGv7Z^!4?M7hAFf{WQi-Mr)5&limU z{{Llo_3_8k8;`C`Kvn}cz`c-q;&kWq` z68}%#Ia|N4^UF7^1}G_OmaE8$WvehsG4f3pFuQX9QkjmDPQ&}JPZ${)85v%_`EvEi zs|O3vT?scpLQpLK>(950fBybtP?Hl+73Ome;N@lz{rvqm122d4|KqohSM2Nl_7`V5 zU{!y)RZ2+Bjf0g*_{;Y<3`|VlxPSco%)rFR!tnkh!-1K3XKJv86WoA%M}EFxQhB#)o|Ni}B;AE5hcl659@H>aUKf`MP0|NuY{iDBrd}DvUf=hr;L_$!~ z^xywK46on+UcIFJ`g8^c21Y^#Ff%YPaK5k)@QZ-L1;Fyx1 zl&avFo0y&&l$w}QS$HxPsEFyPr;B4q#jQ6t4)QiA2)H^LUfX(QA8#Pj3UOh}>Io@o z3ma|s{0UG>Vy?J7mtg{%gA_w1!xBbp44e{BJ$SSNrLda`*Mr}1Y|epe9ZOT%nIEnriGgK759e5&=z~B((XP>T791KkL44$rjF6*2U FngA)D$$0<( literal 0 HcmV?d00001 diff --git a/upload/styles/cbv2new/images/preview.png b/upload/styles/cbv2new/images/preview.png new file mode 100644 index 0000000000000000000000000000000000000000..1cb0b1f6b42f11be1df53c758b866d8f60ba48d6 GIT binary patch literal 15149 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 Q8UO$Q07*qoM6N<$g6DLU`Tzg` literal 0 HcmV?d00001 diff --git a/upload/styles/cbv2new/images/search_footer.png b/upload/styles/cbv2new/images/search_footer.png new file mode 100644 index 0000000000000000000000000000000000000000..b70b6f27ef5ca2965f9dbf04d1e80e4cf680beb1 GIT binary patch literal 150 zcmeAS@N?(olHy`uVBq!ia0vp^%s_0(!2~30RDSr z1<%~X^wgl##FWaylc_d9MHZeejv*Ddl5DEK=`c$e{QLi3{!r4-Pfxj9jvirPUa~pj w!Lz`mQw}%XtgrJQElAv1|KF}ki;=^CA@Q=Tr?TeFRG=9Qp00i_>zopr0FqHL*8l(j literal 0 HcmV?d00001 diff --git a/upload/styles/cbv2new/images/shadows.png b/upload/styles/cbv2new/images/shadows.png new file mode 100644 index 0000000000000000000000000000000000000000..ec9c9dec9ed02c52aced11e5da49d65d0b6c66b7 GIT binary patch literal 12395 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 literal 0 HcmV?d00001 diff --git a/upload/styles/cbv2new/images/side_bg.png b/upload/styles/cbv2new/images/side_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..54588ae532a78c6f7230ced6a65ba471ea672a22 GIT binary patch literal 155 zcmeAS@N?(olHy`uVBq!ia0vp^ObiT+6FGn+!-2rBT0lyJNMI6tkVJh3R1!7(L2 zDOJHUH!(dmC^a#qvhZZ84N#G-r;B4q#jQ6J6@?fScn(M9{r{i!RYpdt{q|BdtChQ> zgH$aeb}{Eq$@Q9$zU{5eMn|_f&4RO36rPB0V_;@ryTU2#J>|+opg|0tu6{1-oD!M< DccL+? literal 0 HcmV?d00001 diff --git a/upload/styles/cbv2new/images/simple_gradient.png b/upload/styles/cbv2new/images/simple_gradient.png new file mode 100644 index 0000000000000000000000000000000000000000..e267e826f53c4c771afc7abe17f51b3879a67c59 GIT binary patch literal 287 zcmeAS@N?(olHy`uVBq!ia0vp^DL_1pgBeK5r`;_9Qj#UE5hcO-X(i=}MX3yqDfvmM z3ZA)%>8U}fi7AzZCsS>Jii`t%LR>$5`0(Y+m#<&He*F0H{rmUdzJ2@j>C@-WpTB?q z{`>duA3uKl{Q2|OuU~)u{Q3L$@4tWl{{R2qUbP||sJ+S4#WAGf)|<1PoQDD!95%ks z-TQt1HNhtHHvFgoakYve!js)X`+XUP-lwoNo55vYl;6m#!irE-6S6%k=K*prp1)gS&YL=|W3@@ncc9?8%+HQhMJ|i20 YPS9fc)+wIXfv#cjboFyt=akR{01VKAod5s; literal 0 HcmV?d00001 diff --git a/upload/styles/cbv2new/images/small_stars.png b/upload/styles/cbv2new/images/small_stars.png new file mode 100644 index 0000000000000000000000000000000000000000..ccaf7908b379b566e22a0b766e9df46ecdb1b606 GIT binary patch literal 845 zcmV-T1G4;yP)e87@ z$7bqw?{@#}o_<#dvdAA??&18t^L@YbeTTx|)qA}SbdAAIF8}8?w+BQ8DmS;@6xw<& z!M+tc-y5C$W`v%+o(F%hat{Y66;&X(sv+9Z8oGApenV9-!pZ(X&KIsIZ|BybR1iUu z2_g5M4o6PLZ&XOU=$Ck~EfaQ38*(PVR>=gdRQhQxe7w!E7muEcx|$AqB?MWpZP=h9 zkk}STk_3=W&cL&WQmM0uJB71ztxs6mhF!O#Yy!QE>E_uDF!?Ck@Uv-6B@g3s``9iMr zT|TN=tk$%d;#$y%0W zx8Ls%p#?Pq0|OWP`}^;@TrRn;uC5uA+00}zI-ZlDtE;PiV`JlOKA$(Sn5JnA*GyGa zW*7!56be=3R%EeV~-mjA5VbS>)mY(4Gj%Cj1JrH z4-eWSBO{No&GWHXjNlw>dV2Z|`UR9y5Cj1%d>qbya&qzmI$-g52@kS*Iy*btooAKJ zW{b&Wat)gy=Th-_{6w)>RA@9B4WndJOG`^Pg2>p|*h{qL)$Hu-5=sg;+aN{C`?t45PP5Pk5W5)%ySgE4&&eK3abq9&SHX-FCfA=uyx!3X)VZH!G? zs!(aD2|og*1}X}>>_TB?c6Mj{?sj*BZGoGd+;h*p-#zEtbG}Qo_i)gM=TBmGL-@xX z$Qb+n3{m&Y8eN!PXG@VPju-eUp6wUk`|=H}Z5O83=%X9U^vclOqhJoA8$``zSxlAa z^t)$Evm~G8=<$!q|ThF@{=5FVTQN{&VAv-?5D;LUi7~F<|jvU{e>LIk%{MN#~rMao&I&=c#ZzKo5tXl zGoO}HdF|(Bhg9xzxk@CFr=VRVmsz0unoep$PtL2dMoQeEn5wMm_aig38Sdq&w{4ZQ zm{OG&D0wbNqH?c|oF;*`0Z`(45|A(qa)|S9U$wJWS=kKpYYF<5N zm0ZOZ0bv3p!=r*1jHM(FQ4D+^L)s6WZvl7%7&%?4IC5B1e;GKxyd47wxk6$|F-Sw$3cKXqoniW^_Z9;} z3{yix18=k0__?_`(^5`hE-PaUUeexJz6t0CdtI9|7|71%YieqES(eG<^?I#5&sze4 zfPdL3JtZJymUCE5kg91a34+B08*3oWYCDvLVYl05tJSKajJzB5^kI=}ak`3S0Joyi zkaOnx)skC7*Z(c3E?loXaU$l+J;GURIg%tD#`y$rVFtEi;YR2#QB$`a6GQ!_)0Zb5 z4oA%VL{>a+>&~ov`J2VN-h%vll`qvfJU%CLXc&gVH8wWpFwd&0dgJl9#8N;MFmZgU zU0F2}ilUH)A&TNA_QL>&O}ef}0Z@=f2)YQ6iM1_sn0XGffmz2s-p+_a*Wd)j(A9nD zOxB*Bo@ZKGS`IOa0!R@Jv$L}~^(AL=4~&eAoI3!hb$554WzUez zdDknm&MFFr!{Z1|dR)jG8ymOt^Yc$b{fo71hR=yaLO|O&_W~x1Z?`j6arO1}9Qe%h zjL$GKLIi4SYpZr2#)Zo6wb^X;m6es{G8QsihR^8LKwe&65)6jPV`F3EU0q$5Pz7sK zQ`4!+%F3rv4Y97Su6ki%VH3Eu44-kU7vWn+M@NTydwYM2#bS(lS|}8Xwzs!mM0rM< zo15!{!JubpX~_-Tc81R=z6UwGSoc^g7LL&|&1d#=AQ~MP#-VRxKa42WGkk`ZJ^2iq ij{O8c|Ksz20t^8EXKnG@6n|s@0000;!2~3K|6*MSq$EpRBT9nv(@M${i&7aJQ}UBi z6+Ckj(^G>|6H_V+Po~-c70vZ@aSW-r_2$|^P6h=5W=GNA`DUy~#NKK9cu7pVJU8WL z4m+bx#0I-tx!#VE8xjsSv7WAxox;j3rW5hZGz3U)kg4E01r$9SB&O5Mdb%+jB$K8I zRABBM$p)m@<03ckOq;zFsPv8wNGbO;=Jg<@ARQ5G5FJ1j*8@Q28%1mYn?H^BJBtKE Y%tGTrHhHJ%K!-ATy85}Sb4q9e0FDY$IRF3v literal 0 HcmV?d00001 diff --git a/upload/styles/cbv2new/images/tabs_sp.png b/upload/styles/cbv2new/images/tabs_sp.png new file mode 100644 index 0000000000000000000000000000000000000000..8a984338322cbe4caff452867da682252c37bdbd GIT binary patch literal 117 zcmeAS@N?(olHy`uVBq!ia0vp^OhC-c0V2&hJg)&M$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWw1G;+`&!Ar-fhEQ+6IqP)!8Fm6rp8!Gt#nIkpryMz zp+B}?XC}5O&{ALWcJ|HN&v)LwnNjFJERjgSbzK4=V?|LY5C|xp_*&C-9hS{dvux?r znuRm&@pv3U;N~!RY3T{2(`ib7`%0!+pt0NICUSx9Y4NH ztOfGj_mR&xD_SU<=<#^^m9632woonPKpXqeK9=No@;i%M_5j(#L*$PNP*qj@#mt3W z5OCeG!O8{D`X07E6fw8+1Do%UL92WCV;-SgDnm3@z=Dwiu~=+I7b`ms8mA=*hu@ia zxcd|HyBQfbDrH!e3XC4OEAS#3h2t>T)l<;ZB%ZxBv6#$Zfjh0g2AnGD%z>z|7w!r~ zxj?hg1hZ-YI|DsW;?bKtXpO@S2RsQwy9##&L_*^qxNR4$a|W~+XeGgOb?$BG1K?f( zDWa+oNOPO~(UPy4rVfNJ3rLYjT{fl9 jTxZqq+}W@S{t7SvZ+>sIY^)>m00000NkvXXu0mjfGrAAJ literal 0 HcmV?d00001 diff --git a/upload/styles/cbv2new/images/thumbs.png b/upload/styles/cbv2new/images/thumbs.png new file mode 100644 index 0000000000000000000000000000000000000000..7b921fc7a39c2127dd5bac813c37ce720ee9d246 GIT binary patch literal 1811 zcmaJ?c~BEq91bWd5gfH?MMP(f6^WW;a}g2=Cgk8~HimHO2qh#7EF{^OED+IJ6cId8 zDjrkOAOr;w@d65>BI1QwD56wtwK|S~SX!apVmB19f0XXb?)$wr-}n8_H@i`(2yi93 z6A1)@Yfzv>g|B@4rA-)ze^E(ReIPZGs6REgA;{L3(uptb*0rl`F2o zz68P;011o2q98e6gX(E&JBDV_8*w&);JesjRBMu942Xjh5QBi+TX&8OAX))Ak^_N| zQ4A*{f$1hVG+hyh&XNGp2$+#rvPa z=CGAUn684&Xo^XLH!gmT-Ib9qHo393oa z!v<`atNp~~jmotTg5HRGmcS+?71qj3s2&(hn2(Gei}$E{LtO3Xv2aJ_((z#E_O|}3 z&BI6d?AXnbp~W{NV-FkfSvTQBO`g2(27XsI21!I=mb*QBmL#?*Judg{+r7>!C#Juf zG%izpn;C#mvLZS}+Z!ax^`flbl*HiH24zIn=NH%M$}5j_A}#kK?$$0#LZ(rAO2#*2 zPWWz?7SvVyoug}E&!y1=x|-^-XWz%H`Cz-srT0F0BKERf2noy(RlU)>1jZtyRRk;gT*_>dY0meN-3+$**?9~B?Uzp}eE7VMOEHpidjojTN_ zu-2>ZIH?0)Pl*vOwsI1`5EqrWK=Z`let%ZMl7h?HLER`HemfKKRwcm)6jiuS3`QEpiH6fSmFPfEGyG{zK=}LE@R1}$33IYc+R)Z3eUYd<=CA? z7vev}9q)))JA2;z8{hBR(tW>_QhiTQws3Mqp|wyx#eyJ0X2m7LbRu;{=^B@v)? zy1ZMh62>bY7C7cb=E)tp#xSz0TOHRpPj+?cx!LCaLbs?ad9TB{(3E^({7)BUMz(jO;tPf;E=Ieyse_=uZKn(Ucs%jiGu6)M~locA=Zo>W;H z1TB9X_;_ab(Ga0qyHd!fBzXbyX3}=w{GP%Ls9<_SRK2Lk6)NfT(RK7wZg(7bs}LmV zlJ9Cxwd3~3A3IU#8eI9SwH1O&<~ZFdi@jd$s*H6(m(iD*R*D{S9h2$SVK< literal 0 HcmV?d00001 diff --git a/upload/styles/cbv2new/images/thumbs/group_thumb-small.png b/upload/styles/cbv2new/images/thumbs/group_thumb-small.png new file mode 100644 index 0000000000000000000000000000000000000000..361a02ef57de133b90787b4e6a65e8c70b72fe7e GIT binary patch literal 4002 zcmV;T4_)wyP)L`g(JRCwCtTU%@t*BSoL?Cjd>HMZ9_ zw!tTBwsWHBZ{u4!x>4?b--d_k^3$NU`UwD5C%?a!<2E#+ck9NJ+^*EC95P}}PZNT`T zZyY^()ZVja&w9{f;`4zB<67Zk;T_^=+qxCz=H^;@&i6bKi^YC^+kjDO)wQ*?nr+Dz z?gbW{M}aVx7N#+e?;LP_iH;d~nqhv2aXrhK+>Jy^p}M-7)>d^#RGLU8pnAJBI0Ta^ z2bg8a#R#F+z=afp;ObbdTQ8UkZ;p`r!Y7ogIYQ4-H`6%|xqF0~OZPJ2!UNlr(9&4% zo%hzq?-XEv(G1ZL*bkShk&OsR0fn#$HT{GsH_p9Ul^WJAJu%Vc3N-lF`c*o>*P{Qg6_)$Q^@u%+xtOSZ zyLl@VcNnm#+9c^r)>9)lv@kcIs^&sXVCuZFpF78MDs2LGJ%*(tvt%?V7t!>z2*mVuH_JI{v^MGewfk}P8R4C0PQ>>~Xg`faa z$YRzyI4#pVxKgFLTu8tkePD)d779b=ToW|+gelpy3`SXyVQ+}MjOz}ECE+VIEy}my zLY`KsV?IzQ?14=?4Y8UBREV5P`?|aiHk`|4JumI6be?^NR6As=I(cx7YXU-SvV3+u z+cky43?Zz8mo`&m(@VQWZ8ikh4TdHzg7�t6+ddp!82y>@w|SVm+LeVuC!URB0|( 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 IM6N<$f<}*>pa1{> literal 0 HcmV?d00001 diff --git a/upload/styles/cbv2new/images/thumbs/group_thumb.png b/upload/styles/cbv2new/images/thumbs/group_thumb.png new file mode 100644 index 0000000000000000000000000000000000000000..58522225ef5ac0fb5f37cdd543c37d71de4caf60 GIT binary patch literal 6633 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 O0000_4W7n_xJet`1ttv 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 ANdN!< literal 0 HcmV?d00001 diff --git a/upload/styles/cbv2new/images/thumbs/processing.png b/upload/styles/cbv2new/images/thumbs/processing.png new file mode 100644 index 0000000000000000000000000000000000000000..9815b2961a95b0038e9666ab164aa71af42c9b93 GIT binary patch literal 2157 zcmV-z2$J`SP)_!oq-of%NqB^YioA+S|Omy!ZF_*x1;+ySwM-=i=hxuhv z;Ogq?*Vos_$H!-AXv)gU*4Wu}bac_t(fa%Q&e77pzrWVj*6{G~{r>*sU3$>+9Uy+}+*X#l^+(@$tjM!`<>uz! z;Ni;5&gJFh-QVEi)zZ|~$;-^z+}zL4&&D$}d%gf8#-QD5i&VK>_V)G7 z&Cc=h^4Qwk^Yil8*xBFU;@#ih@$&NGu$q)z#3^(Yw67ySu!|$j80DzTDj1*xA{prl#fP*|Nkw*7Z?Bl1!hS^K~#9!?3smg;z|IAlaL_2 zyWVYu1dbMhL$MYLv`}}~tGoBy@1485J$H9^cX!wQTV6<@WZFkNZ*F@tZ{B?~u)nbK zWp|UE&J=^!73_xY|E(j8PJ{6}>GGLdeAO2k>E!F63k}p2l^QhtHN$1>;_3)Rp)Y%% zf5Jh)fE&=zv3NQn-{CE$ecp-H_FM?P0N6*IUSe@{3Z}j^aG}`?Vb~3B%ZHW2pr&N7 zp=&W_=NSkOmKwsNHG>cqc7W|(wk%*@+py8VqJA<7MORPuzR?~dk>8xN+5wIGKu$AV zy(4U36^P$EB0sci8|^FYx9>=Suo!@%P+5_wv8~t}B2d5P3TJ&?TVs(E!ah(_mXbW+ z2BUOCAKg=^Kz^zi2kHh(eG{g&`4DPyK)|^sx7ps9oolEh7UK{r?yolzL)+b@&{#MO zI_SRR)kAAMip4rJ>vt)j!2}u&^}dpt{vgOB zrdwZvaO1GQqmz3}J|I!(ay7;FFv~iQ0|1IWY-Kf9c2=^UY_4nzv7R9}04JPAHg|gx z3f;Co|B!<*oB+UGwWhw_swz?I;l#o)9Iutl}e5! zRgo5zN{VsU6&4l6m7h^Zjzq38)uBUrB)T+fRh8A67J^NIuBY9@h&&ebba$NHR1!{kIh@1vY*_)%qFTuVhTOHL6QTqf;wg zSN5JK(>W~bTh!@1*3GMgpi*vC2}zGgXCo~YiL#Tl4t*BwGb@In=C>i(dbAS zNv6y6kpZO_PpgEXWt*dcI;NzAbO4R+fO-b`#c@o^qdpf6Ph}Kr5Rx2?E;Ekg(e=la zJX@a>N@c;hvjsxBJq?8p%T&#Pjct0>mEp?BaJe4Nh+?zFk`;-Lilf^U)Jaxi*ho=Xmm+&?wvY(G$|of zD0IKe<4Cx_`Q(YP+=D`QaH)vL9$1OPK?9a_AJuXtaJXYmy@-?g0k2z~Rk zxOqNZDh|uFe4kVeu8D-KEXXuXM$%*}0~w)CXv~%Tb)==J0@pH8UAdWongw*JcuXe@ z!QHV*8%t2EGf(m@AcN;Iq6$1~GO806YJOdwIl7qT(I3QLP`uD|lh6jHnzgASod&0I zVb;uoIy}~Mx>dOI*zA}&vx_umVw)t=!Ms*ncn~<_Os@p9iw!BGFdo24P&V(x|sZen{h3_m>O;Dai*g>lQ0a^%C*$o j__xIk-G4y$w*UhGW#S3@(D_`V00000NkvXXu0mjfqh<8M literal 0 HcmV?d00001 diff --git a/upload/styles/cbv2new/images/top_user.png b/upload/styles/cbv2new/images/top_user.png new file mode 100644 index 0000000000000000000000000000000000000000..ea2ae28ac810d5cddd382a95bed8ad76fee3f225 GIT binary patch literal 518 zcmV+h0{Q)kP)002e^0{{R34Skk!0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUyz)(z7Mb*{S;o;%lWZ@%#Mk_V?)M=;7w(>GARP_4V1= z+3M=*;N;};^78Wi{_gJX@cR4G($eMS<qi z@A>)X?(XaK^zr=t6|JmEy-{0Tu?d|OK_T%a4;^*kq*4Eb6*6Q-}-QC^j z@9^a7>(J29^z`)9)YQ|{(>F%rGynhq+(|@1RCwC#+|ywI006|$)V6KgZuj4+gCuW+ z%m1+&9e$!ybYt}S=&%_b=Ay${beN3}+tJ}MI-Ev__2@7i9hRcQNOahX4kyuJGCB-I zhll8J8y!BP!)SCkj}B|m;V3%1MTZFeMyKe;=zq~+H#+P`hwtbV-5C8YIt)dJt>|za z9TuX)PIS144l~hVF*-a&hpXuD9vxPq!)J83j1D)^;VU{kM~9c_upAvWqQhWxIF1fe z(P1n)j7Nw2=x`VvhNHtoba;&p2hr(Ws&}a<-ldwr=U;#U0H=pHD^c@dHUIzs07*qo IM6N<$f}Q9yu>b%7 literal 0 HcmV?d00001 diff --git a/upload/styles/cbv2new/images/top_users_grad.png b/upload/styles/cbv2new/images/top_users_grad.png new file mode 100644 index 0000000000000000000000000000000000000000..5604d50aaa8a04b73e1462c434dc4393716523f9 GIT binary patch literal 198 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 IZSCpdZ?mpG^8f$< literal 0 HcmV?d00001 diff --git a/upload/styles/cbv2new/images/uploading_bar.png b/upload/styles/cbv2new/images/uploading_bar.png new file mode 100644 index 0000000000000000000000000000000000000000..d5b9d16bf427707a35d5c17c882469681a2333b7 GIT binary patch literal 1089 zcmaJ=TSyd97#=X90wE=kieQ*1OWL{Y=&n2LXzR{eTdpkYf?E(c&K%uAXU;TpY*(r1 zLQzCSQ4c-@*-Jf%5A{$+!eXExBostZQb9#3uImMYf;yw_+C$sGnRDU$zW@9G^Pj8H z=0l}hc5ERCqBMM1is88&kA0g;@P9OSd=O9DQ7D00UksNP$JSKC{U+m2ScZI6SE1zU!OK*r3)ak9dv4jNM(mdC{j~Js}%Ea~BBj<5E5y$47)%drgWW;nNt^9sCMU|DkQqi{4!?GR#8<611d6R9LZ zrob?%REkdVG_*Py&gb(v8g91>BV2Z`f#kHyuy^MbBw#C+W+Dw5q@yUe!yY73*y(Bt zx>=Al?6orCf-z~?WH_32Qpy7(k^e(=y@0k+46OV8r?4IGH31U?Htew!d~qGSolvF_ zw1AAD6^F1pU&Uw=B4{U}Nd{YL$X3lzVai@XMDjyj*>DY;ke1?#9P#Hk-@k#OojC=H~d*FRJt*x@UNHcGi1wa%pMFclp)K z%uM~w&;D!g=I7@Z78ZmnZz_`y58nFXyZm~3dOC3XtLOa0!0`A^93mc;0`c^_XD=U@ zjS|~Nqy7E4d%uMf=g!VnRJ}bm6u)1+`HA#>Yn5DaWT0%LT=qQkv;0%#`%Klg23L1x u|3qfruS-qIJx|YUzB_sJ(T|&Lxw1B5>dvl~4dTc*=TV14&C*~)+l4>zVtMia literal 0 HcmV?d00001 diff --git a/upload/styles/cbv2new/images/verticle_bg.png b/upload/styles/cbv2new/images/verticle_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..6ce8b341724d03589588b31dc670792319298127 GIT binary patch literal 1064 zcmaJ=O-vI(6kdZSgvh~*iFz59#Dk&T-Ilg=r4r~CDWRmc73xX1yHmP>-C1`BTkxQg zn7~036A#3g=tbj2qcO%14|*^r9@H3(CWf0QpirRv6dHoFr7a$;dzieL{l4#gZ{C}! zaR1rHhT{zsMKuO{ga}0)nkDgp`Z}`a&HH4fj^RKYM^O@|MFUcuGD<)YRK+0}fucNi z`6Fzns5+p;;y51a<0YipMGIrksJca`+B-73C=Ejl5^zY-e01*3TN)^`j~;Y|*pTjr zDWzxJfYI^(m^3~td1boe3~0~rL_mdD1Q~TiGx>~5z#)6O9@YX7M`mG`;snp|rTRGnlNprKrWa<_q0P%4;L zYI||k)GKr4+Fn{~av5TVvD*4qn=40TcC4^Ev}98qd#I6FH^@*w*g@~C2NCXz1$K9L zi^byh_V(7+*82K-p-|Y|+|1|m8yg$T%gc+4iz_QDOG``HY&Mt6&Ck!TuCA`Ftt~7p z%+1a9CVnS~&OlJ;jAedhzfT>x4h~c7#fKd?chaw(M0I&`q}X!%i+8r^QLJ}n;_By_ z0h&6W6z(K{yoMJZ|NL~Xo_=|XI`{PJjpB6E#N^2jN70FEP2cVo>RIaj^uZU;Pu~iX O3{)`CFFfnIH1P*eDtGw+ literal 0 HcmV?d00001 diff --git a/upload/styles/cbv2new/images/view_channel.png b/upload/styles/cbv2new/images/view_channel.png new file mode 100644 index 0000000000000000000000000000000000000000..cb8dad7973a1395571aef42da5f56771a14ebc7f GIT binary patch literal 740 zcmeAS@N?(olHy`uVBq!ia0y~yV4MKL9LzwG?TN?!0V&B6*NBqf{Irtt#G+IN$CUh} zR0Yr6#Prml)Wnp^!jq{sKt;L%J|V6QGtV&0IL$EqB*Ub`3=1h^YGI0P6Op&?37 zHZUgP_F`jyQSCS-6%y(eIyE-*X;|pYkkGWysllO7141K1L(M{`x`sXt3jMiK3n^Uy g!|cl~u(}dF;0um?9ZGUHx3vIVCg!0N`Dy_5c6? literal 0 HcmV?d00001 diff --git a/upload/styles/cbv2new/images/watch_video_bars.png b/upload/styles/cbv2new/images/watch_video_bars.png new file mode 100644 index 0000000000000000000000000000000000000000..2c3a79b2821f951c12b860847698460064342be8 GIT binary patch literal 1014 zcmV{{H^#?Ckvf{QCO({r&y<`T6ql^6u{L`1ttn@bK~R@$K#Hy1Kezptbe& z_4M@gbaZs~_Vxgo%tuE@0Eo2!inq45wg7^yv$L};EiG17Rw*edD=RA}Cnq*GHoLpK zNl8h#xVYZl-dkH+0BDO{U0pLXGoPQIKtMp;+}wYEe>*!nv9Yo1>+3^9Lx_lomzS4L zPEL!9iyU~D!otFDZ*OsNah;u=dU|@fxw*{D%wJz$t*x!m(b2TDw6e0YKR-Vxf1H)R z%i7x7<>lqi&(DsIj)#YbrlzLb+uI9okf*1ofPjFnudidEwQ#4pU!JpQ!r+>}%O0iD zXS~^Fxz$#y#vPu?XTRNKp|u^N&H$3b9h$>du+3Mx+W?KcSFg+fmdG$LFi}xaK|w)2 zK0Z%RPdq$4IXO8uH#bB?L{n2!CMG6EMn+dxS5;M2Dk>@{C@2Q9Jm3HT0vkz0K~#9! z?Acj!not~u@e?(PDYUh=Q8Ba>ca3J>lQ!M=ec$(86BQ}8eEOaP1UzRFnd!85@9%>7 zbNdcgJS5IY6~!#tu%Du-R3v95!XDFkL*3{T*iU~$HS*JYTg^3B`!LLEbI#prbE*9c zhHEcvvaK|uWm5IK*CsvpADbX(8Csmk*VPtvJ~1)i%1jG*swES>+@@xd6P!D35R`SI z%#TqQ4ht5?fH$v@sx?lnNRAg%uiQhrJPtgoM1gQQ)aLVq44+*XvL3 zylc_|flcflbIkST+h^~p^*}(k+F`QU?DvyC`ljuGfNr(Rq|@oQr+xJ8>MjWARvjjj z$=pn(Qa2h8=`%&&^bQEqBG9yOz5kut}tBP{&!~kA7Myj(B>UPpW zw{nlT&i}MK2hg3vx^n>CIjlPe(4E7&a{%2L-5K2(-5K2( k-5K2((4GITJO2@20O5Fw+`?9!RR91007*qoM6N<$g1x`_S^xk5 literal 0 HcmV?d00001 diff --git a/upload/styles/cbv2new/images/watch_video_details_bg.png b/upload/styles/cbv2new/images/watch_video_details_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..ceef40f4436a2cf1a5b40a709d944efc69479562 GIT binary patch literal 218 zcmeAS@N?(olHy`uVBq!ia0vp^nm{~_g9%8UnP|6H_V+Po~-c71emUIEGZ*dUNw6FM|RHi-WJ`6Fdu=}Z?70y3{L{h-46;9+1+B_fz5u#|!PC{xWt~$( F69CuKS$+Tj literal 0 HcmV?d00001 diff --git a/upload/styles/cbv2new/layout/403.html b/upload/styles/cbv2new/layout/403.html new file mode 100644 index 00000000..0555b021 --- /dev/null +++ b/upload/styles/cbv2new/layout/403.html @@ -0,0 +1,2 @@ +

    403 Error

    +

    Sorry, you cannot access this page.

    \ No newline at end of file diff --git a/upload/styles/cbv2new/layout/404.html b/upload/styles/cbv2new/layout/404.html new file mode 100644 index 00000000..21bf59ab --- /dev/null +++ b/upload/styles/cbv2new/layout/404.html @@ -0,0 +1,2 @@ +

    404 Error

    +

    Requested page not found.

    \ No newline at end of file diff --git a/upload/styles/cbv2new/layout/activation.html b/upload/styles/cbv2new/layout/activation.html new file mode 100644 index 00000000..651698de --- /dev/null +++ b/upload/styles/cbv2new/layout/activation.html @@ -0,0 +1,34 @@ + +
    +
    +

    {lang code='usr_activation_title'}

    +
    +
    {lang code='acitvation_html_message'}
    +
    + +
    +
    + + + +
    + + +
    +
    + + +
    +

    {lang code='usr_actiavation_msg1'}

    +
    +
    {lang code='acitvation_html_message2'}
    +
    + +
    +
    + + +
    +
    +
    + diff --git a/upload/styles/cbv2new/layout/add_group_videos.html b/upload/styles/cbv2new/layout/add_group_videos.html new file mode 100644 index 00000000..a17b8fb7 --- /dev/null +++ b/upload/styles/cbv2new/layout/add_group_videos.html @@ -0,0 +1,41 @@ +{include file="$style_dir/blocks/group/group_left.html"} +
    + +{include file="$style_dir/blocks/group/group_right.html"} \ No newline at end of file diff --git a/upload/styles/cbv2new/layout/blocked.html b/upload/styles/cbv2new/layout/blocked.html new file mode 100644 index 00000000..a2e328b8 --- /dev/null +++ b/upload/styles/cbv2new/layout/blocked.html @@ -0,0 +1,10 @@ +

    Content you are trying to access is blocked

    +

    This content is blocked by website adminstrator, there could be following possible reasons

    +
      +
    • You are not logged in or you do not have previliges to access this page
    • +
    • Website adminstrator has completely disabled this section
    • +
    • Content is removed by administrator
    • +
    • You have landed on planet "Pandora"
    • +
    +

    Please contact website adminstartor to resolve this issue.

    +
    \ No newline at end of file diff --git a/upload/styles/cbv2new/layout/blocks/category_list.html b/upload/styles/cbv2new/layout/blocks/category_list.html new file mode 100644 index 00000000..87a05de8 --- /dev/null +++ b/upload/styles/cbv2new/layout/blocks/category_list.html @@ -0,0 +1,8 @@ +
    +{lang code='categories'} +
    +
      + {cbCategories type=$type echo="TRUE" list_style="collapsed" output="list" with_all="TRUE"} +
    +
    +
    \ No newline at end of file diff --git a/upload/styles/cbv2new/layout/blocks/collection.html b/upload/styles/cbv2new/layout/blocks/collection.html new file mode 100644 index 00000000..38a128d0 --- /dev/null +++ b/upload/styles/cbv2new/layout/blocks/collection.html @@ -0,0 +1,41 @@ +{if $display_type == "" || $display_type == "normal"} +
    +
    + + {$collection.total_objects|number_format} {$collection.type|capitalize} +
    +
    +

    {$collection.collection_name|truncate:30}

    +

    {$collection.views} {lang code="views"}

    +

    {$collection.username|truncate:16}

    + +
    {show_rating class='rating' rating=$collection.rating ratings=$collection.rated_by total='10'}
    +
    +
    +{/if} + +{if $display_type == "view_collection"} +
    + {if $type == "videos"} +
    + + {$object.title} + +
    + {/if} + + {if $type == "photos"} + + {/if} +
    +{/if} + +{if $display_type == "user_collections"} +
    + +
    +{/if} \ No newline at end of file diff --git a/upload/styles/cbv2new/layout/blocks/collection_form.html b/upload/styles/cbv2new/layout/blocks/collection_form.html new file mode 100644 index 00000000..fd7a6ac6 --- /dev/null +++ b/upload/styles/cbv2new/layout/blocks/collection_form.html @@ -0,0 +1,22 @@ + +
    +
    Add this {$params.type} to collection {if $params.type=='video'} or playlist{/if}
    +
    + + + +
    + Please select collection name from following
    + + + +
    +
    +
    + diff --git a/upload/styles/cbv2new/layout/blocks/comments/add_comment.html b/upload/styles/cbv2new/layout/blocks/comments/add_comment.html new file mode 100644 index 00000000..9cab9d36 --- /dev/null +++ b/upload/styles/cbv2new/layout/blocks/comments/add_comment.html @@ -0,0 +1,61 @@ +
    +

    {lang code='grp_add_comment'}

    + + + +{if $userquery->login_check('',true) || $Cbucket->configs.anonym_comments == 'yes'} +
    + + + + {if !$userquery->login_check('',true) && $Cbucket->configs.anonym_comments == 'yes'} + +
    +
    + +
    +
    + {else} + Name : {$userquery->username}
    + {/if} + + {ANCHOR place='before_compose_box'} + + +
    + + + {if config('comments_captcha')=='all' || ( config('comments_captcha')=='guests' && !$userquery->login_check('',true) )} + +
    + {lang code='please_enter_confimation_ode'} + + {assign var=captcha value=func->get_captcha()} + {if $captcha} + {if $captcha.show_field} +
    + {load_captcha captcha=$captcha load=field field_params = ' id="captcha" class="input" '} +
    + {/if} + + + {load_captcha captcha=$captcha load=function} + +
    + {/if} + +
    + {/if} + +
    {ANCHOR place='after_compose_box'}
    + +
    + + +
    +
    +{else} + {lang code='please_login_to_comment'} +{/if} +
    \ No newline at end of file diff --git a/upload/styles/cbv2new/layout/blocks/comments/comment.html b/upload/styles/cbv2new/layout/blocks/comments/comment.html new file mode 100644 index 00000000..e6e6fbe7 --- /dev/null +++ b/upload/styles/cbv2new/layout/blocks/comments/comment.html @@ -0,0 +1,65 @@ +{if marked_spammed($comment)} + {assign var='comment_attr' value='style="display:none"'} + {assign var='spam_attr' value='style="display:block"'} +{else} +{assign var='comment_attr' value=''} + {assign var='spam_attr' value='style="display:none"'} +{/if} + +
    +
    + +
    +
    +
    +
    + {lang code='user_commented_time' assign='user_commented_time'} + {assign var="nicetime" value=$comment.date_added|niceTime} + {if $comment.userid !='' && $comment.userid!=0} + {assign var="comm_link" value=$userquery->profile_link($comment)} + {assign var="comm_owner" value=$comment.username} + {else} + {assign var="comm_id" value="#comment_"} + {assign var="comm_link" value=$comment.comment_id} + {assign var="comm_owner" value=$comment.anonym_name} + {/if} + + {$user_commented_time|sprintf:"$comm_id$comm_link":$comm_owner:$nicetime} + +
    +
    {lang code='reply'} | {lang code='spam'} + + {if has_access('admin_del_access') || $comment.userid==userid() || $comment.type_owner_id==userid()} | {lang code='delete'}{/if}
    +
    + +
    + + {if $comment.parent_id} + {assign var=parentid value=$comment.parent_id} + {assign var=thisParent value=$parents.$parentid} + + {if $thisParent} +
    + + {if $thisParent.username}@{$thisParent.username} : + {/if}{$thisParent.comment|comment} +
    + {/if} + {/if} + + {$comment.comment|comment} + +
    + + {if $type=='video' && $comments_voting=='yes' && $Cbucket->configs.comment_rating} +
    Thumbs UpThumbs Down{$comment.vote|comment_rating}
    + {/if} + +
    +
    + +
    + {lang code='marked_as_spam_comment_by_user' assign='marked_as_spam_comment_by_user'} + + {if $comment.username}{$marked_as_spam_comment_by_user|sprintf:$comment.username}{else}{$marked_as_spam_comment_by_user|sprintf:$comment.anonym_name}{/if} | {lang code='delete'} +
    \ No newline at end of file diff --git a/upload/styles/cbv2new/layout/blocks/comments/comments.html b/upload/styles/cbv2new/layout/blocks/comments/comments.html new file mode 100644 index 00000000..fccf0d68 --- /dev/null +++ b/upload/styles/cbv2new/layout/blocks/comments/comments.html @@ -0,0 +1,20 @@ +{if $comments} +
    + {foreach from=$comments.comments item=comment} + {include file="$style_dir/blocks/comments/comment.html" comment=$comment type=$type parents=$comments.parents} + {/foreach} + +
    + + +{else} +
    +
    + {lang code='no_comments' assign=no_comments} {$no_comments|sprintf:$object_type} +
    +
    + +{/if} +{if $comments} +
    +{/if} \ No newline at end of file diff --git a/upload/styles/cbv2new/layout/blocks/editor_pick/index_featured_video.html b/upload/styles/cbv2new/layout/blocks/editor_pick/index_featured_video.html new file mode 100644 index 00000000..ac7203bc --- /dev/null +++ b/upload/styles/cbv2new/layout/blocks/editor_pick/index_featured_video.html @@ -0,0 +1,8 @@ + \ No newline at end of file diff --git a/upload/styles/cbv2new/layout/blocks/editor_pick/video_block.html b/upload/styles/cbv2new/layout/blocks/editor_pick/video_block.html new file mode 100644 index 00000000..beb31447 --- /dev/null +++ b/upload/styles/cbv2new/layout/blocks/editor_pick/video_block.html @@ -0,0 +1,8 @@ +
    {$video.title}
    + + diff --git a/upload/styles/cbv2new/layout/blocks/feed.html b/upload/styles/cbv2new/layout/blocks/feed.html new file mode 100644 index 00000000..a449fa86 --- /dev/null +++ b/upload/styles/cbv2new/layout/blocks/feed.html @@ -0,0 +1,131 @@ + +{literal} + + +{/literal} + + +
    +
    + + {if $u.userid==userid() || has_access('admin_access',true)} + + + {/if} +
    +
    + + {$feed.user.username} +
    +
    +
    + {if !$feed.action_title} + {$feed.user.username} + {else} + {$feed.action_title} + {/if} +
    + +
    + + {if $feed.thumb} + {if $feed.link} + + {/if} + + {if $feed.link} + + {/if} + {/if} + +
    + {if $feed.link} + {$feed.title} + {elseif $feed.title} + {$feed.title} + {/if} + + {if $feed.object_content} +
    + {$feed.object_content} +
    + {/if} +
    + + +
    +
    + + +
    + {if $feed.icon} + + {/if} + {$feed.datetime} + + {if $feed.links} + {foreach from=$feed.links item=link} + . + {if $link.link}{/if}{$link.text}{if $link.link}{/if} + {/foreach} + {/if} + +
    + +
    +
    + + +
    + diff --git a/upload/styles/cbv2new/layout/blocks/flag_form.html b/upload/styles/cbv2new/layout/blocks/flag_form.html new file mode 100644 index 00000000..b34a29aa --- /dev/null +++ b/upload/styles/cbv2new/layout/blocks/flag_form.html @@ -0,0 +1,21 @@ + +
    +
    Flag this {$params.type} — cancel
    +
    + + + +
    + Please select the category that most closely reflects your concern about the video, so that we can review it and determine whether it violates our Community Guidelines or isn't appropriate for all viewers. Abusing this feature is also a violation of the Community Guidelines, so don't do it. + {assign var='flag_options' value=func->get_flag_options($type)} + +
    + +
    +
    +
    + diff --git a/upload/styles/cbv2new/layout/blocks/group.html b/upload/styles/cbv2new/layout/blocks/group.html new file mode 100644 index 00000000..0f652a93 --- /dev/null +++ b/upload/styles/cbv2new/layout/blocks/group.html @@ -0,0 +1,10 @@ + +
    + + {$group.group_name} + {lang code='views'} : {$group.total_views|number_format} + {lang code="total_members"}:{$group.total_members|number_format} + {lang code="total_videos"} : {$group.total_videos|number_format} + {lang code="total_topics"} : {$group.total_topics|number_format} + {lang code="owner"} : {$group.username} +
    \ No newline at end of file diff --git a/upload/styles/cbv2new/layout/blocks/group/add_topic.html b/upload/styles/cbv2new/layout/blocks/group/add_topic.html new file mode 100644 index 00000000..7e7d12b3 --- /dev/null +++ b/upload/styles/cbv2new/layout/blocks/group/add_topic.html @@ -0,0 +1,14 @@ +
    +
    + {assign var='form_fields' value=$cbgroup->load_add_topic_form_fields()} + + {foreach from=$form_fields item=field} +
    +
    +
    {$field.hint_1}{ANCHOR place=$field.anchor_before}{$formObj->createField($field)}{ANCHOR place=$field.anchor_after}
    +
    + {/foreach} + +
    +
    +
    \ No newline at end of file diff --git a/upload/styles/cbv2new/layout/blocks/group/group_header.html b/upload/styles/cbv2new/layout/blocks/group/group_header.html new file mode 100644 index 00000000..45a52109 --- /dev/null +++ b/upload/styles/cbv2new/layout/blocks/group/group_header.html @@ -0,0 +1,156 @@ + + +
    + +
    +
    +
    +
    + {lang code='group_options'} +
      + {assign var=join_link value=$cbgroup->group_opt_link($group,'join')} + {if $join_link}
    • {$join_link}
    • {/if} + + {assign var=invite_link value=$cbgroup->group_opt_link($group,'invite')} + {if $invite_link}
    • {$invite_link}
    • {/if} + + {assign var=leave_link value=$cbgroup->group_opt_link($group,'leave')} + {if $leave_link}
    • {$leave_link}
    • {/if} + + {if isSectionEnabled('videos')} + {assign var=add_videos_link value=$cbgroup->group_opt_link($group,'add_videos')} + {if $add_videos_link}
    • {$add_videos_link}
    • {/if} + {/if} + + {if isSectionEnabled('videos')} + {assign var=manage_videos_link value=$cbgroup->group_opt_link($group,'manage_videos')} + {if $manage_videos_link}
    • {$manage_videos_link}
    • {/if} + {/if} + + {if isSectionEnabled('channels')} + {assign var=manage_members_link value=$cbgroup->group_opt_link($group,'manage_members')} + {if $manage_members_link}
    • {$manage_members_link}
    • {/if} + {/if} + + {assign var=edit_group_link value=$cbgroup->group_opt_link($group,'edit_group')} + {if $edit_group_link}
    • {$edit_group_link}
    • {/if} + + {assign var=remove_group_link value=$cbgroup->group_opt_link($group,'remove_group')} + {if $remove_group_link}
    • {$remove_group_link}
    • {/if} + +
    +
    + +
    + + +
    +
    +
    +
      +
    • {lang code='info'}
    • + {if isSectionEnabled('channels') && $isviewable} +
    • {lang code='members'}
    • + {/if} + {if isSectionEnabled('videos') && $isviewable} +
    • {lang code='videos'}
    • + {/if} +
    • {lang code='report_this'}
    • +
    + +
    +
    +
    + + +
    + +
    + +
    +
    {lang code='basic_info'}
    +
    + {lang code='grp_name_title'} {$group.group_name} +
    + {assign var=owner value=$userquery->get_user_details($group.userid)} + {lang code='group_owner'} {$owner.username} +
    + + {lang code='total_mems'} {$group.total_members|number_format} +
    + + {lang code='com_total_vids'} {$group.total_videos|number_format} +
    + + {lang code='total_topics'} {$group.total_topics|number_format} +
    + + {lang code='views'} {$group.total_views|number_format} +
    + + {lang code='grp_url'} + +
    +
    +
    + +
    +
    {lang code='more_details'}
    + +
    +
    + + + + + + + + + + + + + +
    +
    +
    + + + +
    + + + + \ No newline at end of file diff --git a/upload/styles/cbv2new/layout/blocks/group/group_left.html b/upload/styles/cbv2new/layout/blocks/group/group_left.html new file mode 100644 index 00000000..cf57bffb --- /dev/null +++ b/upload/styles/cbv2new/layout/blocks/group/group_left.html @@ -0,0 +1,35 @@ +
    +
    + +
    + + {isGroupAdmin + groupid = $group.group_id + group = $group + user = $userquery->udetails + uid = $userquery->udetails.userid + checkowner = 'yes' + assign = isGroupAdmin} + + + {if $isGroupAdmin} +
    Admin Links
    + + {/if} +
    \ No newline at end of file diff --git a/upload/styles/cbv2new/layout/blocks/group/group_right.html b/upload/styles/cbv2new/layout/blocks/group/group_right.html new file mode 100644 index 00000000..de4c194e --- /dev/null +++ b/upload/styles/cbv2new/layout/blocks/group/group_right.html @@ -0,0 +1,29 @@ +
    +
    {lang code="members"}
    +
    + {assign var=users_items_group_page value=func->config(users_items_group_page)} + {assign var=members value=$cbgroup->get_members($group.group_id,"yes",$users_items_group_page)} + {if $members} + {foreach from=$members item=member} + {include file="$style_dir/blocks/user.html" user=$member block_type='friends'} + {/foreach} + {/if} +
    +
    +
    {lang code="Links"}
    + +
    \ No newline at end of file diff --git a/upload/styles/cbv2new/layout/blocks/group/group_topics.html b/upload/styles/cbv2new/layout/blocks/group/group_topics.html new file mode 100644 index 00000000..9963e2b3 --- /dev/null +++ b/upload/styles/cbv2new/layout/blocks/group/group_topics.html @@ -0,0 +1,29 @@ + +{if !$topics} + {assign var=topics value=$cbgroup->get_group_topics($group.group_id)} +{/if} + +{if $topics} +{foreach from=$topics item=topic} +{assign var=user value=$userquery->get_user_details($topic.userid)} +{if $topic.last_poster} + {assign var=last_poster value=$userquery->get_user_details($topic.last_poster)} +{else} + {assign var=last_poster value=''} +{/if} +
  • + +
    +

    {$user.username}

    +
    +

    {$topic.topic_title}

    +
    +
    {$topic.topic_post|description|strip_tags|truncate:100}
    +
    + {$topic.date_added|niceTime} – {if $last_poster}{lang code="last_reply"} {lang code="by"} {$last_poster.username} ({$topic.last_post_time|niceTime}){else}Participate{/if} {if has_access('admin_access') || $topic.userid == $userquery->userid} – Delete{/if} +
    +
  • +{/foreach} +{/if} \ No newline at end of file diff --git a/upload/styles/cbv2new/layout/blocks/manage/account_collections.html b/upload/styles/cbv2new/layout/blocks/manage/account_collections.html new file mode 100644 index 00000000..2990b716 --- /dev/null +++ b/upload/styles/cbv2new/layout/blocks/manage/account_collections.html @@ -0,0 +1,89 @@ +{if $mode ==''}{assign var='mode' value='manage'}{/if} +{if $display_type == "" || $display_type == "collections"} + +{/if} + +{if $display_type == "items"} + {if $type == "videos"} + + {/if} + + {if $type == "photos"} + + {/if} +{/if} + +{if $display_type == "favorite"} + +{/if} \ No newline at end of file diff --git a/upload/styles/cbv2new/layout/blocks/manage/account_group.html b/upload/styles/cbv2new/layout/blocks/manage/account_group.html new file mode 100644 index 00000000..185b931a --- /dev/null +++ b/upload/styles/cbv2new/layout/blocks/manage/account_group.html @@ -0,0 +1,38 @@ +{if $control =='full'} + +{/if} + +{if $control =='basic'} + +{/if} \ No newline at end of file diff --git a/upload/styles/cbv2new/layout/blocks/manage/account_head.html b/upload/styles/cbv2new/layout/blocks/manage/account_head.html new file mode 100644 index 00000000..a69732ce --- /dev/null +++ b/upload/styles/cbv2new/layout/blocks/manage/account_head.html @@ -0,0 +1,30 @@ + \ No newline at end of file diff --git a/upload/styles/cbv2new/layout/blocks/manage/account_left.html b/upload/styles/cbv2new/layout/blocks/manage/account_left.html new file mode 100644 index 00000000..4f653f92 --- /dev/null +++ b/upload/styles/cbv2new/layout/blocks/manage/account_left.html @@ -0,0 +1,14 @@ + \ No newline at end of file diff --git a/upload/styles/cbv2new/layout/blocks/manage/account_photo.html b/upload/styles/cbv2new/layout/blocks/manage/account_photo.html new file mode 100644 index 00000000..cf5c05a7 --- /dev/null +++ b/upload/styles/cbv2new/layout/blocks/manage/account_photo.html @@ -0,0 +1,69 @@ +{if $control == 'full'} + +{/if} + +{if $control == "partail"} + +{/if} + +{if $control == 'orphan'} + +{/if} \ No newline at end of file diff --git a/upload/styles/cbv2new/layout/blocks/manage/account_user.html b/upload/styles/cbv2new/layout/blocks/manage/account_user.html new file mode 100644 index 00000000..281f1c45 --- /dev/null +++ b/upload/styles/cbv2new/layout/blocks/manage/account_user.html @@ -0,0 +1,23 @@ +
    + + + + + + + + + +
    {$user.username}{$user.username} + {assign var=uid value=$user.userid} + {if ($makeAdmin=='yes' || $rmAdmins.$uid=='yes') && $makeAdmins.$uid!='yes'} + Make admin + {/if} + {if ($removeAdmin=='yes' || $makeAdmins.$uid=='yes') && $rmAdmins.$uid!='yes'} + Remove admin + {/if} + {$user.profile_hits|number_format}{$status} + {if $del_link}{/if} + +
    +
    \ No newline at end of file diff --git a/upload/styles/cbv2new/layout/blocks/manage/account_video.html b/upload/styles/cbv2new/layout/blocks/manage/account_video.html new file mode 100644 index 00000000..ec2e9d75 --- /dev/null +++ b/upload/styles/cbv2new/layout/blocks/manage/account_video.html @@ -0,0 +1,95 @@ +{if $control=='' || $control =='view'} +{if $mode ==''}{assign var='mode' value='favorites'}{/if} + +{/if} + +{if $control =='full'} + +{/if} + + +{if $control=='playlist'} + + +{/if} + + +{if $control=='basic'} + + +{/if} \ No newline at end of file diff --git a/upload/styles/cbv2new/layout/blocks/manage/group_manage_links.html b/upload/styles/cbv2new/layout/blocks/manage/group_manage_links.html new file mode 100644 index 00000000..04189353 --- /dev/null +++ b/upload/styles/cbv2new/layout/blocks/manage/group_manage_links.html @@ -0,0 +1,16 @@ + \ No newline at end of file diff --git a/upload/styles/cbv2new/layout/blocks/manage/user_account_pagination.html b/upload/styles/cbv2new/layout/blocks/manage/user_account_pagination.html new file mode 100644 index 00000000..1dc638d2 --- /dev/null +++ b/upload/styles/cbv2new/layout/blocks/manage/user_account_pagination.html @@ -0,0 +1,8 @@ + \ No newline at end of file diff --git a/upload/styles/cbv2new/layout/blocks/new_pagination.html b/upload/styles/cbv2new/layout/blocks/new_pagination.html new file mode 100644 index 00000000..6f6de447 --- /dev/null +++ b/upload/styles/cbv2new/layout/blocks/new_pagination.html @@ -0,0 +1,4 @@ +{if $page_no}{assign var=ajaxPage value=$page_no}{else}{assign var=ajaxPage value=2}{/if} +
    + +
    \ No newline at end of file diff --git a/upload/styles/cbv2new/layout/blocks/pagination.html b/upload/styles/cbv2new/layout/blocks/pagination.html new file mode 100644 index 00000000..1816e8ac --- /dev/null +++ b/upload/styles/cbv2new/layout/blocks/pagination.html @@ -0,0 +1,28 @@ + \ No newline at end of file diff --git a/upload/styles/cbv2new/layout/blocks/photo.html b/upload/styles/cbv2new/layout/blocks/photo.html new file mode 100644 index 00000000..2fa549a7 --- /dev/null +++ b/upload/styles/cbv2new/layout/blocks/photo.html @@ -0,0 +1,55 @@ +{if $display_type == ""} +
    + {get_photo details=$photo output='html' width="110" class='photoThumbBox moveL'} + + + {$photo.views|number_format} {lang code="views"} + +
    + {assign var=cName value=$photo.collection_id|get_collection_field} + {$cName|truncate:30} +
    + +
    +{/if} + +{if $display_type == 'related_photos'} +
    + {get_photo details=$photo output='html' width='120' class='photoThumbBox moveL' style='margin-right:5px;'} + + {$photo.views|number_format} {lang code="views"}
    {$photo.total_comments} {lang code="comments"}
    +
    + {show_rating rating=$photo.rating total='10' class='rating moveL'} +
    +{/if} + +{if $display_type == 'subscription'} +
    + {get_photo details=$photo output='html' class='photoThumbBox' width='110'} + + {show_rating rating=$photo.rating total='10' class='rating'} +
    {$photo.views|number_format} {lang code="views"}
    + {$photo.username|truncate:20} +
    +{/if} + +{if $display_type == "side_photos"} + +{/if} + +{if $display_type == "channel_page"} +
  • + {get_photo details=$photo output='html' width='110' height='64' size='m' style='display:block;margin:0px auto;'} +
  • +{/if} \ No newline at end of file diff --git a/upload/styles/cbv2new/layout/blocks/playlist_form.html b/upload/styles/cbv2new/layout/blocks/playlist_form.html new file mode 100644 index 00000000..78d62cd1 --- /dev/null +++ b/upload/styles/cbv2new/layout/blocks/playlist_form.html @@ -0,0 +1,26 @@ + + + \ No newline at end of file diff --git a/upload/styles/cbv2new/layout/blocks/pm/messages.html b/upload/styles/cbv2new/layout/blocks/pm/messages.html new file mode 100644 index 00000000..b910dae1 --- /dev/null +++ b/upload/styles/cbv2new/layout/blocks/pm/messages.html @@ -0,0 +1,86 @@ + + +
    +
    + +
    + + +
    +
    + + +
    + +
    + + + {assign var='bg' value='fff'} + {section name=msg loop=$user_msgs} + {if $user_msgs[msg].message_id == $smarty.get.mid} + {assign var='bg' value='c6d7e0'} + {/if} + + {if $bg=='fff'} + {assign var='bg' value='EFF5F8'} + {else} + {assign var='bg' value='fff'} + {/if} + + {sectionelse} +
    {lang code='you_dont_hv_any_pm'}
    + {/section} +
    + +
    + +
    + + + + +{if $pr_msg !=''} + +
    +
    + + +
    +
    +
    {lang code='from'} : {$pr_msg.username} - {$pr_msg.date_added|date_format:"%A, %B %e, %Y %I:%M %p"}
    +
    {lang code='Subject'} : {$pr_msg.message_subject}
    +
    +
    +
    + {private_message pm=$pr_msg} +
    +
    + +{/if} + +
    \ No newline at end of file diff --git a/upload/styles/cbv2new/layout/blocks/quicklist/block.html b/upload/styles/cbv2new/layout/blocks/quicklist/block.html new file mode 100644 index 00000000..8380348b --- /dev/null +++ b/upload/styles/cbv2new/layout/blocks/quicklist/block.html @@ -0,0 +1,29 @@ +
    +
    +{lang code='show_hide'} - {lang code='quicklists'}({$cbvid->total_quicklist()}) - {lang code='remove'}
    +
    \ No newline at end of file diff --git a/upload/styles/cbv2new/layout/blocks/quicklist/video_block.html b/upload/styles/cbv2new/layout/blocks/quicklist/video_block.html new file mode 100644 index 00000000..88b312f1 --- /dev/null +++ b/upload/styles/cbv2new/layout/blocks/quicklist/video_block.html @@ -0,0 +1,18 @@ + +{if !$videoLink} + {videoLink vdetails=$video assign='videoLink'} +{/if} +
    +
    {$smarty.section.item.iteration}
    +
    + + {if $show_delete=='yes'} +
    + quicklist
    + {/if} +
    {$video.duration|SetTime}
    + +
    +
    + + \ No newline at end of file diff --git a/upload/styles/cbv2new/layout/blocks/rating.html b/upload/styles/cbv2new/layout/blocks/rating.html new file mode 100644 index 00000000..6f40b6a4 --- /dev/null +++ b/upload/styles/cbv2new/layout/blocks/rating.html @@ -0,0 +1,34 @@ + + +
    +
    + Like
    +
    +
    +
    +
    + Dislike
    + +
    {if $rating_msg}{$rating_msg}{else}{$likes} Likes, {$dislikes} Dislikes{/if}
    + \ No newline at end of file diff --git a/upload/styles/cbv2new/layout/blocks/share_form.html b/upload/styles/cbv2new/layout/blocks/share_form.html new file mode 100644 index 00000000..987647b5 --- /dev/null +++ b/upload/styles/cbv2new/layout/blocks/share_form.html @@ -0,0 +1,81 @@ + + + diff --git a/upload/styles/cbv2new/layout/blocks/subscriptions.html b/upload/styles/cbv2new/layout/blocks/subscriptions.html new file mode 100644 index 00000000..41d6574e --- /dev/null +++ b/upload/styles/cbv2new/layout/blocks/subscriptions.html @@ -0,0 +1,38 @@ +{if userid()} +
    + {lang code='subscriptions'} + +
    + + {* assign var=subs_vids value=$userquery->get_subscribed_videos($userquery->userid,10)* } + {assign var=subs_uploads value=$userquery->getSubscriptionsUploadsWeek($userquery->userid,10)} + {if $subs_uploads} + {foreach from=$subs_uploads item=item key=type} + {if $type == 'videos'} +
    +

    {$item.title} ({$item.total} {$type})

    + {foreach from=$item.items item=videos} + {include file="$style_dir/blocks/video.html" video=$videos} + {/foreach} +
    + {/if} + {if $type == 'photos'} +
    +

    {$item.title} ({$item.total} {$type})

    + {foreach from=$item.items item=photos} + {include file="$style_dir/blocks/photo.html" photo=$photos display_type = "subscription"} + {/foreach} +
    + {/if} + {/foreach} + {else} + {lang code='no_new_subs_video'} + {/if} + +
    + + +
    +
    +
    {AD place='ad_468x60'}
    +{/if} \ No newline at end of file diff --git a/upload/styles/cbv2new/layout/blocks/upload/form.html b/upload/styles/cbv2new/layout/blocks/upload/form.html new file mode 100644 index 00000000..2cb7dda3 --- /dev/null +++ b/upload/styles/cbv2new/layout/blocks/upload/form.html @@ -0,0 +1,77 @@ +{assign var='video_fields' value=$Upload->load_video_fields($input)} + + +
    +

    {$vdo_upload_step|sprintf:1}

    +
    + + + + {foreach from=$video_fields item=field_group} +
    + {* Hide fields if group is not required *} + {if $field_group.group_id!='required_fields'} + {$field_group.group_name} + + {/if} +
    + {/foreach} + + +
    +
    +
    +
    \ No newline at end of file diff --git a/upload/styles/cbv2new/layout/blocks/upload/photo_form.html b/upload/styles/cbv2new/layout/blocks/upload/photo_form.html new file mode 100644 index 00000000..e966595b --- /dev/null +++ b/upload/styles/cbv2new/layout/blocks/upload/photo_form.html @@ -0,0 +1,43 @@ +{assign var='reqFields' value=$cbphoto->load_required_forms($photoArray)} +{assign var='otherFields' value=$cbphoto->load_other_forms($photoArray)} + + +
    + +
    +
    +
    + {foreach from=$reqFields item=item} +
    +
    + {$formObj->createField($item)} + {if $item.hint_1} +
    + {$item.hint_1} + {/if} +
    + {/foreach} +
    + +
    +
    + +
    +
    +
    + +
    + + +
    + +
    +
    \ No newline at end of file diff --git a/upload/styles/cbv2new/layout/blocks/upload_head.html b/upload/styles/cbv2new/layout/blocks/upload_head.html new file mode 100644 index 00000000..fd9579bc --- /dev/null +++ b/upload/styles/cbv2new/layout/blocks/upload_head.html @@ -0,0 +1,67 @@ +{if $c} + {if $cbphoto->is_addable($c)} +
    +
    You are about to add new photos in {$c.collection_name}
    +
    +
    + +
    +
    + +
    +
    + Total Items: {$c.total_objects}
    + Views: {$c.views|number_format}
    + Date Added: {$c.date_added|niceTime} +
    +
    +
    +
    +
    + {else} +
    +
    You can not add new photos in collection because of following reasons:
    +
    +
  • Collection does not exist.
  • +
  • It is unactive.
  • +
  • It is private.
  • +
  • Your are not owner of collection.
  • +
  • You can select collection once your photos have been uploaded.
  • +
    +
    + {/if} +{else} + +
    + + + +
    +
    + + +
    +
    + +
    + +{/if} \ No newline at end of file diff --git a/upload/styles/cbv2new/layout/blocks/user.html b/upload/styles/cbv2new/layout/blocks/user.html new file mode 100644 index 00000000..25e52064 --- /dev/null +++ b/upload/styles/cbv2new/layout/blocks/user.html @@ -0,0 +1,38 @@ +{if $block_type == '' || $block_type=='normal'} +
    +
    +
    + +{if isSectionEnabled('videos')}{$user.total_videos|number_format} {lang code="videos"}{/if} {$user.profile_hits|number_format} {lang code="views"}
    +{$user.subscribers|number_format} {lang code="subscribers"} +{if isSectionEnabled('photos')}{$user.total_photos|number_format} {lang code="photos"}{/if} +
    +{lang code="last_active"} : {$user.last_active|nicetime}
    +{/if} + +{if $block_type =='small'} + +{/if} + +{if $block_type =='medium'} +
    +
    +
    + +{$user.total_videos|number_format} {lang code="videos"} {$user.profile_hits|number_format} {lang code="views"}
    +{/if} + +{if $block_type == "friends"} +
    + {$user.username} +
    +{/if} + +{if $block_type == "topic_view"} + +{/if} \ No newline at end of file diff --git a/upload/styles/cbv2new/layout/blocks/video.html b/upload/styles/cbv2new/layout/blocks/video.html new file mode 100644 index 00000000..ef0935d3 --- /dev/null +++ b/upload/styles/cbv2new/layout/blocks/video.html @@ -0,0 +1,87 @@ +{if $cur_class==''} +{assign var=cur_class value=$smarty.cookies.current_style} +{/if} + + +{if $display_type =='normal' || $display_type==''} + +
    +
    + {$video.title} + {$video.duration|SetTime} + Quicklist + {if $video.broadcast=='private'} +   + {/if} + {ANCHOR place='in_video_thumb' data=$video} +
    +
    +

    {$video.title|truncate:40}

    + +
    + {show_rating class='rating' rating=$video.rating ratings=$video.rated_by total='10' } +
    +

    {$video.description|description|truncate:100}

    +

    {$video.views} View(s) | {$video.comments_count} Comment(s)

    +

    Uploaded By {$video.username} ({$video.date_added|niceTime})

    +
    +
    + +{if $only_once} +
    +{/if} + +{/if} + + +{if $display_type == "channel_page"} +
  • +
    {$video.title}
    +
  • +{/if} + +{if $display_type=='add_type'} +
    +
    + {ANCHOR place='in_video_thumb' data=$video} + + {if $check_type=='array'} + + {else} + + {/if} +
    {$video.duration|SetTime}
    + +
    +
    +
    + + + {show_rating class='rating' rating=$video.rating ratings=$video.rated_by total='10'} + +
    + +
    +
    {$video.description|description|strip_tags|truncate:100}
    +
    Time: {$video.duration|SetTime:false}
    +
    + +
    +
    {$video.views} view(s)
    +
    + + + + +
    +
    +
    +{if $only_once} +
    +{/if} + +{/if} \ No newline at end of file diff --git a/upload/styles/cbv2new/layout/blocks/view_channel/channel_global.html b/upload/styles/cbv2new/layout/blocks/view_channel/channel_global.html new file mode 100644 index 00000000..fbbfaa6a --- /dev/null +++ b/upload/styles/cbv2new/layout/blocks/view_channel/channel_global.html @@ -0,0 +1,12 @@ +
    getUserBg($u,true)} + style="background-position:center;background-image: + {if $userquery->getUserBg($u)} + url('{$userquery->getUserBg($u)}');background-repeat: {$u.background_repeat}; + {/if} + {if $u.background_color!=''} + background-color:{$u.background_color}{/if}; + {if $u.background_attachement=='yes'} + background-attachment:fixed + {/if}" + {/if}> \ No newline at end of file diff --git a/upload/styles/cbv2new/layout/blocks/view_channel/channel_item.html b/upload/styles/cbv2new/layout/blocks/view_channel/channel_item.html new file mode 100644 index 00000000..b2d8ae4f --- /dev/null +++ b/upload/styles/cbv2new/layout/blocks/view_channel/channel_item.html @@ -0,0 +1,32 @@ +{if $object.photo_id} +
    {$object.photo_title}
    +
    {get_photo details=$object output='html' size='l' width='370'}
    + +
    + +
    {show_rating class='rating' rating=$object.rating ratings=$object.rated_by total='10'}
    +
    {lang code='views'} {$object.views|number_format}
    +
    + {$object.photo_description|description|truncate:200}
    + +
    +{/if} + + +{if $object.videoid} +
    {$object.title}
    + {FlashPlayer vdetails=$object width='100%' height='280' autoplay=true} +
    + +
    {show_rating class='rating' rating=$object.rating ratings=$object.rated_by total='10'}
    +
    {lang code='views'} {$object.views|number_format}
    +
    + {$object.description|description|truncate:200}
    + +
    + +{/if} \ No newline at end of file diff --git a/upload/styles/cbv2new/layout/blocks/view_channel/channel_left.html b/upload/styles/cbv2new/layout/blocks/view_channel/channel_left.html new file mode 100644 index 00000000..a6e11856 --- /dev/null +++ b/upload/styles/cbv2new/layout/blocks/view_channel/channel_left.html @@ -0,0 +1,81 @@ +
    + +
    {if $userquery->perm_check('admin_access')=='yes'}
    {ANCHOR place=view_channel_admin_options data=$u}
    {/if}
    + + {assign var=isSubscribed value=$userquery->is_subscribed($u.userid)} +
    + +
    + +{if $p.show_my_friends!='no'} +
    +
    {lang code="friends"} {lang code="view_all"}
    + {assign var=userFriends value=$userquery->get_contacts($u.userid,'0','yes')} + {if $userFriends} + {foreach from=$userFriends item=friend} + {include file="$style_dir/blocks/user.html" user=$friend block_type="friends"} + {/foreach} + {else} + User dont any friends yet. + {/if} +
    +{/if} + +{if isSectionEnabled('collections') && $p.show_my_collections!='no'} +
    +
    {lang code="Collections"}
    + {assign var=climit value=func->config(collection_channel_page)} + {get_collections assign=userCollections user=$u.userid limit=10 order=" date_added DESC" limit=$climit} + {if $userCollections} + {foreach from=$userCollections item=collection} + {include file="$style_dir/blocks/collection.html" collection=$collection display_type="user_collections"} + {/foreach} + + {else} + {lang code='user_doesnt_any_collection'} + {/if} +
    +{/if} + +{if $p.show_my_subscriptions!='no'} +
    +
    {lang code='user_subscriptions' assign='users_videos'}{$users_videos|sprintf:$u.username}
    + {assign var=users_items_subscriptions value=func->config(users_items_subscriptions)} + {assign var='usr_subs' value=$userquery->get_user_subscriptions($u.userid,$users_items_subscriptions)} + {if $usr_subs} + {foreach from=$usr_subs item=sub} + {include file="$style_dir/blocks/user.html" user=$sub block_type="friends"} + {/foreach} + {else} + {lang code='user_no_subscriptions' assign='user_subs'}{$user_subs|sprintf:$u.username} + {/if} +
    +{/if} + +{if $userquery->userid!=$u.userid} + +{/if} +{show_flag_form id=$u.userid type=User} \ No newline at end of file diff --git a/upload/styles/cbv2new/layout/blocks/view_channel/channel_top.html b/upload/styles/cbv2new/layout/blocks/view_channel/channel_top.html new file mode 100644 index 00000000..1806f145 --- /dev/null +++ b/upload/styles/cbv2new/layout/blocks/view_channel/channel_top.html @@ -0,0 +1,17 @@ + +
    +
    +
    +
    {$u.username}
    +
    {lang code='user_s_channel' assign='usr_s'}{$usr_s|sprintf:$u.username}
    +
    + {assign var='channel_links' value=$userquery->get_inner_channel_top_links($u)} + +
    +
    +
    + \ No newline at end of file diff --git a/upload/styles/cbv2new/layout/blocks/view_channel/user_block.html b/upload/styles/cbv2new/layout/blocks/view_channel/user_block.html new file mode 100644 index 00000000..d85df61c --- /dev/null +++ b/upload/styles/cbv2new/layout/blocks/view_channel/user_block.html @@ -0,0 +1,34 @@ + +
    + +{/if} + {show_flag_form id=$u.userid type=User}
    +
    \ No newline at end of file diff --git a/upload/styles/cbv2new/layout/blocks/watch_video/playlist_box.html b/upload/styles/cbv2new/layout/blocks/watch_video/playlist_box.html new file mode 100644 index 00000000..ccf79474 --- /dev/null +++ b/upload/styles/cbv2new/layout/blocks/watch_video/playlist_box.html @@ -0,0 +1,43 @@ +{if $cb_playlist==''} + {assign var=cb_playlist value=$cbvid->action->get_playlist($smarty.get.play_list)} +{/if} + +{if $cb_playlist} +Playlist : {$cb_playlist.playlist_name} +
    + + +{if $cb_playlist_items==''} +{assign var=cb_playlist_items value=$cbvid->get_playlist_items($cb_playlist.playlist_id)} +{/if} +{assign var='bg' value='fff'} +{section name=item loop=$cb_playlist_items} + {include file="$style_dir/blocks/quicklist/video_block.html" video=$cb_playlist_items[item] selected=$selected bg=$bg} + + {if $bg=='fff'} + {assign var='bg' value='EFF5F8'} + {else} + {assign var='bg' value='fff'} + {/if} + + {if $selected==$cb_playlist_items[item].videoid} + {assign var='pre_lock' value='yes'} + {else} + {if !$pre_lock} + {videoLink vdetails=$cb_playlist_items[item] assign='pre_vid'} + {else} + {if !$next_lock} + {videoLink vdetails=$cb_playlist_items[item] assign='next_vid'} + {assign var='next_lock' value='yes'} + {/if} + {/if} + {/if} +{/section} +
    +
    +{/if} + + \ No newline at end of file diff --git a/upload/styles/cbv2new/layout/blocks/watch_video/video_box.html b/upload/styles/cbv2new/layout/blocks/watch_video/video_box.html new file mode 100644 index 00000000..5726fbb6 --- /dev/null +++ b/upload/styles/cbv2new/layout/blocks/watch_video/video_box.html @@ -0,0 +1,21 @@ + + +{if $display_type =='normal' || $display_type==''} +
    +
    + + +
    {$video.duration|SetTime}
    + quicklist +
    +
    + {$video.title|truncate:30}
    +{lang code='views'}: {$video.views|number_format}
    + +{$video.username} + +
    + +
    +{/if} + diff --git a/upload/styles/cbv2new/layout/blocks/watch_video/video_password.html b/upload/styles/cbv2new/layout/blocks/watch_video/video_password.html new file mode 100644 index 00000000..df99d80c --- /dev/null +++ b/upload/styles/cbv2new/layout/blocks/watch_video/video_password.html @@ -0,0 +1,15 @@ +
    + {lang code='video_is_password_protected' assign='pass_protect_phrase'} +

    {$pass_protect_phrase|sprintf:$vdo.title}

    + +
    + +
    +
    \ No newline at end of file diff --git a/upload/styles/cbv2new/layout/body.html b/upload/styles/cbv2new/layout/body.html new file mode 100644 index 00000000..fe7115df --- /dev/null +++ b/upload/styles/cbv2new/layout/body.html @@ -0,0 +1,42 @@ +{* Including Global Header *} +{include file="$style_dir/global_header.html"} + +{include_header file="admin_bar"} + + +
    + {include file="$style_dir/header.html" } +
    + + +
    + + {ANCHOR place='global'} + + + {include file="$style_dir/message.html"} + {foreach from=$template_files item=file} + {include_template_file file=$file} + {/foreach} +
    +
    + + +
    +
    + + \ No newline at end of file diff --git a/upload/styles/cbv2new/layout/channels.html b/upload/styles/cbv2new/layout/channels.html new file mode 100644 index 00000000..89e4c11a --- /dev/null +++ b/upload/styles/cbv2new/layout/channels.html @@ -0,0 +1,37 @@ + + + {include file="$style_dir/blocks/category_list.html" type='user'} + + +
    +
    + +
      +
    • {lang code='sort_by'} :
    • + {assign var=sorting_links value=func->sorting_links()} + {foreach from=$sorting_links item=name key=sort} +
    • {$name}
    • + {/foreach} +
    + + +
    + +
    +{assign var=time_links value=func->time_links()} +{foreach from=$time_links item=name key=sort name=times} + {$name} {if !$smarty.foreach.times.last}|{/if} +{/foreach} +
    + {section name=u_list loop=$users} + {include file="$style_dir/blocks/user.html" user=$users[u_list]} + {sectionelse} + {lang code='no_results_found'} + {/section} +
    +
    + +
    {AD place='ad_160x600'}
    +
    + +{include file="$style_dir/blocks/pagination.html"} \ No newline at end of file diff --git a/upload/styles/cbv2new/layout/collections.html b/upload/styles/cbv2new/layout/collections.html new file mode 100644 index 00000000..0f0caa4d --- /dev/null +++ b/upload/styles/cbv2new/layout/collections.html @@ -0,0 +1,45 @@ + + {include file="$style_dir/blocks/category_list.html" type='collections'} + + +
    + +
    +
      +
    • {lang code='sort_by'} :
    • + {assign var=sorting_links value=$cbcollection->sorting_links()} + {foreach from=$sorting_links item=name key=sort} +
    • {$name}
    • + {/foreach} +
    +
    + + +
    +{assign var=time_links value=func->time_links()} +{foreach from=$time_links item=name key=sort name=times} + {$name} {if !$smarty.foreach.times.last}|{/if} +{/foreach} +
    + + + +{section name=c_list loop=$collections} + {include file="$style_dir/blocks/collection.html" collection=$collections[c_list]} +{sectionelse} + {lang code='no_results_found'} +{/section} +
    + +
    +
    + {AD place='ad_160x600'} +
    + +
    + +
    + +{include file="$style_dir/blocks/pagination.html"} \ No newline at end of file diff --git a/upload/styles/cbv2new/layout/contact.html b/upload/styles/cbv2new/layout/contact.html new file mode 100644 index 00000000..53a9968c --- /dev/null +++ b/upload/styles/cbv2new/layout/contact.html @@ -0,0 +1,30 @@ +

    {lang code="contact_us"}

    + +

    {lang code="contact_us_msg"}

    +
    + + +
    + + +
    + + +
    + + +
    + +{assign var=captcha value=func->get_captcha()} +{if $captcha} + {if $captcha.show_field} + + {load_captcha captcha=$captcha load=field field_params = ' id="verification_code" '} + {/if} +
     {load_captcha captcha=$captcha load=function}
    +{/if} + +
    +
    +

     

    +
    \ No newline at end of file diff --git a/upload/styles/cbv2new/layout/create_group.html b/upload/styles/cbv2new/layout/create_group.html new file mode 100644 index 00000000..dce07dd3 --- /dev/null +++ b/upload/styles/cbv2new/layout/create_group.html @@ -0,0 +1,47 @@ +{assign var='requiredFields' value=$cbgroup->load_required_fields()} +{assign var='optionFields' value=$cbgroup->load_other_fields()} +{assign var='customFields' value=$cbgroup->custom_group_fields} + +
    +
    +

    {lang code='grp_crt_grp'}

    +
    + + +
    + required fields + {foreach from=$requiredFields item=field} +
    + + {if $field.hint_1}
    {$field.hint_1}

    {/if}{ANCHOR place=$field.anchor_before}{$formObj->createField($field)} + {if $field.hint_2}
    +
    {$field.hint_2}
    {/if} +
    + {/foreach} + +
    + + + + + {lang code='more_options'} + + +
    +
    +
    +
    diff --git a/upload/styles/cbv2new/layout/download.html b/upload/styles/cbv2new/layout/download.html new file mode 100644 index 00000000..9f3e9a69 --- /dev/null +++ b/upload/styles/cbv2new/layout/download.html @@ -0,0 +1,25 @@ + + + +
    + +{lang code='downloading_string' assign='downloadingstring'} + +

    {$downloadingstring|sprintf:$vdo.title}

    + +{lang code='download_redirect_msg' assign='redirectmsg'} +{videoLink vdetails=$vdo assign='vidlink'} +{assign value=$vdo.download_file var='downloadfile'} + +

    {$redirectmsg|sprintf:$downloadfile:$vidlink}

    \ No newline at end of file diff --git a/upload/styles/cbv2new/layout/edit_account.html b/upload/styles/cbv2new/layout/edit_account.html new file mode 100644 index 00000000..4a1b7482 --- /dev/null +++ b/upload/styles/cbv2new/layout/edit_account.html @@ -0,0 +1,344 @@ +
    + {include file="$style_dir/blocks/manage/account_left.html"} + + + + +{/if} + + + +{if $mode == 'avatar_bg'} + + +
    +
    + +{/if} + + + + +{if $mode == 'change_email'} + + + + + +{/if} + + + + +{if $mode == 'change_password'} + + + + +{/if} + +{if $mode == 'block_users'} + + + +{/if} + + +{if $mode=='subs'} +

    {lang code='com_manage_subs'}

    + + + {if $subs} + + + + + + + + + +
     Usernameviews 
    + + {foreach from=$subs item=sub} +
    + + + + + + + + + +
    {$sub.username}{$sub.username} | {lang code='grp_view_vdos'}{$sub.profile_hits|number_format}
    +
    + {/foreach} +{else} +
    {lang code='no_subs_found'}
    + {/if} + + + + + +{/if} +
    diff --git a/upload/styles/cbv2new/layout/edit_group.html b/upload/styles/cbv2new/layout/edit_group.html new file mode 100644 index 00000000..d7eeff1c --- /dev/null +++ b/upload/styles/cbv2new/layout/edit_group.html @@ -0,0 +1,91 @@ +
    + {include file="$style_dir/blocks/manage/account_left.html"} + + +
    +
    \ No newline at end of file diff --git a/upload/styles/cbv2new/layout/edit_photo.html b/upload/styles/cbv2new/layout/edit_photo.html new file mode 100644 index 00000000..58a280a2 --- /dev/null +++ b/upload/styles/cbv2new/layout/edit_photo.html @@ -0,0 +1,47 @@ +
    + {include file="$style_dir/blocks/manage/account_left.html"} + +
    \ No newline at end of file diff --git a/upload/styles/cbv2new/layout/edit_video.html b/upload/styles/cbv2new/layout/edit_video.html new file mode 100644 index 00000000..126d25e3 --- /dev/null +++ b/upload/styles/cbv2new/layout/edit_video.html @@ -0,0 +1,80 @@ +{assign var='video_fields' value=$Upload->load_video_fields($v)} +
    + {include file="$style_dir/blocks/manage/account_left.html"} + + +
    +
    \ No newline at end of file diff --git a/upload/styles/cbv2new/layout/footer.html b/upload/styles/cbv2new/layout/footer.html new file mode 100644 index 00000000..80b84541 --- /dev/null +++ b/upload/styles/cbv2new/layout/footer.html @@ -0,0 +1,29 @@ + \ No newline at end of file diff --git a/upload/styles/cbv2new/layout/forgot.html b/upload/styles/cbv2new/layout/forgot.html new file mode 100644 index 00000000..759a1051 --- /dev/null +++ b/upload/styles/cbv2new/layout/forgot.html @@ -0,0 +1,71 @@ +{if $pass_recover=='success'} + + +{lang code='pass_changed_success'} + +{else} + +
    + + {if $mode=='' || $mode=='reset_pass' } +
    +

    {lang code='user_forgot_message'}{lang code='click_here_to_recover_user'}

    +
    +
    {lang code=user_pass_forgot_msg'}
    +
    + +
    +
    + {assign var=captcha value=func->get_captcha()} + {if $captcha} + {if $captcha.show_field} + + {load_captcha captcha=$captcha load=field field_params = ' id="verification_code" '} + {/if} +
    + +
    + {load_captcha captcha=$captcha load=function} +
    + {/if} + +
    + + +
    +
    + {/if} + + {if $mode=='recover_username'} + + +
    +

    {lang code='user_reocover_user'}{lang code='click_here_reset_pass'}

    +
    + +
    +
    + {assign var=captcha value=func->get_captcha()} + {if $captcha} + {if $captcha.show_field} + + {load_captcha captcha=$captcha load=field field_params = ' id="verification_code" '} + {/if} +
    + +
    + {load_captcha captcha=$captcha load=function} +
    + {/if} + +
    + + +
    +
    + {/if} + +
    + + +{/if} \ No newline at end of file diff --git a/upload/styles/cbv2new/layout/global_header.html b/upload/styles/cbv2new/layout/global_header.html new file mode 100644 index 00000000..36aa00cc --- /dev/null +++ b/upload/styles/cbv2new/layout/global_header.html @@ -0,0 +1,206 @@ + + + + + + + + + + + +{rss_feeds link_tag=true} + + + + + + +{cbtitle} + + + + +{php} + if(!$_COOKIE['current_style']) + $_COOKIE['current_style'] = 'grid_view'; +{/php} + + + + + + +{include_header file='global_header'} + + +{if $smarty.const.THIS_PAGE =='private_message' && $smarty.get.mid} + +{/if} + + + + + +{literal} + +{/literal} +{literal} + +{/literal} + +{literal} + +{/literal} + + + + \ No newline at end of file diff --git a/upload/styles/cbv2new/layout/groups.html b/upload/styles/cbv2new/layout/groups.html new file mode 100644 index 00000000..242879d1 --- /dev/null +++ b/upload/styles/cbv2new/layout/groups.html @@ -0,0 +1,50 @@ + + + {include file="$style_dir/blocks/category_list.html" type='groups'} + + + +
    +
    + +
      +
    • {lang code='sort_by'} :
    • + {assign var=sorting_links value=func->sorting_links()} + {foreach from=$sorting_links item=name key=sort} +
    • {$name}
    • + {/foreach} +
    + + +
    + +
    +{assign var=time_links value=func->time_links()} +{foreach from=$time_links item=name key=sort name=times} + {$name} {if !$smarty.foreach.times.last}|{/if} +{/foreach} +
    + + + +{section name=glist loop=$groups} + {include file="$style_dir/blocks/group.html" group=$groups[glist]} +{sectionelse} + {lang code='no_results_found'} +{/section} + +
    + + +
    +
    + {AD place='ad_160x600'} +
    + +
    + +
    + +{include file="$style_dir/blocks/pagination.html"} \ No newline at end of file diff --git a/upload/styles/cbv2new/layout/header.html b/upload/styles/cbv2new/layout/header.html new file mode 100644 index 00000000..8ae993a3 --- /dev/null +++ b/upload/styles/cbv2new/layout/header.html @@ -0,0 +1,104 @@ +
    +
    + +
    + + +
    +
    +
      + {cbMenu echo='yes'} +
    + +
    + +
    + + + {ANCHOR place='anything'} \ No newline at end of file diff --git a/upload/styles/cbv2new/layout/index.html b/upload/styles/cbv2new/layout/index.html new file mode 100644 index 00000000..73e1f05c --- /dev/null +++ b/upload/styles/cbv2new/layout/index.html @@ -0,0 +1,153 @@ + +
    + + {if is_installed('editorspick')} +
    +
    + {section name=e_list loop=$editor_picks max=1} + {include file="$style_dir/blocks/editor_pick/video_block.html" video=$editor_picks[e_list]} + {sectionelse} +
    + There is no video in editor's pick, Please Add Videos In Editor's Pick
    + Videos Manager > Add to editor's pick +
    + {/section} +
    +
    + {section name=e_list loop=$editor_picks} + {include file="$style_dir/blocks/editor_pick/index_featured_video.html" video=$editor_picks[e_list]} + {/section} +
    +
    +
    + + {/if} + +
    {AD place='ad_468x60'}
    + + {if isSectionEnabled('videos') || isSectionEnabled('photos')} + {include file="$style_dir/blocks/subscriptions.html"} + {/if} + + {if isSectionEnabled('videos')} + +
    +
    +
    +
    + {lang code='change_style_of_listing'} +
    + +
    + +
    + + +
    +
    +
    + {/if} + {if isSectionEnabled('photos')} + +
    + +
    + +
    + + +
    +
    +
    + {/if} +
    + +
    + + + {AD place=ad_300x250} + + {if !$userquery->login_check('',true)} + + {/if} + + + + + {if isSectionEnabled('videos')} + + {assign var=videos_items_columns value=func->config(videos_items_columns)} + {get_videos assign=ran_vids limit=$videos_items_columns order=RAND()} + + {if $ran_vids} +
    + {lang code='rand_vids'} +
    + {section name=uvlist loop=$ran_vids} + {include file="$style_dir/blocks/watch_video/video_box.html" video=$ran_vids[uvlist]} + {/section} +
    +
    +
    +
    + {/if} + {/if} + + {if isSectionEnabled('photos')} + + {assign var=limit value=func->config(photo_other_limit)} + {get_photos assign=ran_ph limit=$limit order=RAND()} + + {if $ran_ph} +
    + {lang code='rand_photos'} +
    + {section name=plist loop=$ran_ph} + {include file="$style_dir/blocks/photo.html" photo=$ran_ph[plist] display_type="side_photos"} + {/section} +
    +
    +
    +
    + {/if} + {/if} + + {if isSectionEnabled('channels')} +
    +
    +

    {lang code='t_10_users'}

    + {get_users assign=topusers limit=10 order=' total_videos DESC '} + + {section name=tusers loop=$topusers} +
    +
    {$smarty.section.tusers.iteration}
    +
    +
    {$topusers[tusers].username}{lang code='views'} : {$topusers[tusers].profile_hits|number_format} - {lang code='videos'} : {$topusers[tusers].total_videos|number_format} +
    +
    +
    + {/section} +
    +
    + {/if} + + +
    \ No newline at end of file diff --git a/upload/styles/cbv2new/layout/manage_collections.html b/upload/styles/cbv2new/layout/manage_collections.html new file mode 100644 index 00000000..03139aab --- /dev/null +++ b/upload/styles/cbv2new/layout/manage_collections.html @@ -0,0 +1,166 @@ +
    + {include file="$style_dir/blocks/manage/account_left.html"} + + + +
    \ No newline at end of file diff --git a/upload/styles/cbv2new/layout/manage_contacts.html b/upload/styles/cbv2new/layout/manage_contacts.html new file mode 100644 index 00000000..5346a44d --- /dev/null +++ b/upload/styles/cbv2new/layout/manage_contacts.html @@ -0,0 +1,96 @@ +
    + {include file="$style_dir/blocks/manage/account_left.html"} + + + +
    \ No newline at end of file diff --git a/upload/styles/cbv2new/layout/manage_groups.html b/upload/styles/cbv2new/layout/manage_groups.html new file mode 100644 index 00000000..3afc459f --- /dev/null +++ b/upload/styles/cbv2new/layout/manage_groups.html @@ -0,0 +1,296 @@ +
    + {include file="$style_dir/blocks/manage/account_left.html"} + + + + + +
    \ No newline at end of file diff --git a/upload/styles/cbv2new/layout/manage_photos.html b/upload/styles/cbv2new/layout/manage_photos.html new file mode 100644 index 00000000..740fe773 --- /dev/null +++ b/upload/styles/cbv2new/layout/manage_photos.html @@ -0,0 +1,134 @@ +
    + {include file="$style_dir/blocks/manage/account_left.html"} + +
    diff --git a/upload/styles/cbv2new/layout/manage_playlists.html b/upload/styles/cbv2new/layout/manage_playlists.html new file mode 100644 index 00000000..fdec7c93 --- /dev/null +++ b/upload/styles/cbv2new/layout/manage_playlists.html @@ -0,0 +1,123 @@ +
    + {include file="$style_dir/blocks/manage/account_left.html"} + +
    \ No newline at end of file diff --git a/upload/styles/cbv2new/layout/manage_videos.html b/upload/styles/cbv2new/layout/manage_videos.html new file mode 100644 index 00000000..a7b02134 --- /dev/null +++ b/upload/styles/cbv2new/layout/manage_videos.html @@ -0,0 +1,121 @@ +
    + {include file="$style_dir/blocks/manage/account_left.html"} + + + +
    \ No newline at end of file diff --git a/upload/styles/cbv2new/layout/message.html b/upload/styles/cbv2new/layout/message.html new file mode 100644 index 00000000..a1996949 --- /dev/null +++ b/upload/styles/cbv2new/layout/message.html @@ -0,0 +1,37 @@ +{assign var=msg value=$eh->message_list} +{assign var=err value=$eh->error_list} +{assign var=war value=$eh->warning_list} + +{if $err.0 neq '' || $err.1 != ''} +
    +
      +{foreach from=$err item=show_msg} +
    • {$show_msg}
    • +{/foreach} +
    +
    +{/if} + + +{if $msg.0 neq ''} +
    +
      +{foreach from=$msg item=show_msg} +
    • {$show_msg}
    • +{/foreach} +
    +
    +{/if} + + +{if $war.0 neq ''} +
    +
      + +{foreach from=$war item=show_msg} +
    • {$show_msg}
    • +{/foreach} +
    +
    +
    +{/if} \ No newline at end of file diff --git a/upload/styles/cbv2new/layout/myaccount.html b/upload/styles/cbv2new/layout/myaccount.html new file mode 100644 index 00000000..5baec1a8 --- /dev/null +++ b/upload/styles/cbv2new/layout/myaccount.html @@ -0,0 +1,23 @@ +
    + {include file="$style_dir/blocks/manage/account_left.html"} + + +
    +
    \ No newline at end of file diff --git a/upload/styles/cbv2new/layout/photo_upload.html b/upload/styles/cbv2new/layout/photo_upload.html new file mode 100644 index 00000000..3d9adad3 --- /dev/null +++ b/upload/styles/cbv2new/layout/photo_upload.html @@ -0,0 +1,34 @@ +
    +
    +{if $step == 1 || $step == ""} +

    Select Photo Files

    + {loadPhotoUploadForm buttonClass='LoadMoreButton moveR'} +{/if} + +{if $step == 2} +

    Enter Information

    + {foreach item=item from=$photos} + {include file="$style_dir/blocks/upload/photo_form.html" photo=$item} + {/foreach} + +{/if} + +{if $step == 3} +
    +
    {lang code="photo_success_heading"}
    + +
    + You can manage your photos from {lang code='manage_photos'}. +
    +
    +{/if} +
    +
    + +
    +
    + {lang code='upload_right_guide_photo'} +
    +
    + {AD place='ad_300x250'} +
    \ No newline at end of file diff --git a/upload/styles/cbv2new/layout/photos.html b/upload/styles/cbv2new/layout/photos.html new file mode 100644 index 00000000..3798d4dc --- /dev/null +++ b/upload/styles/cbv2new/layout/photos.html @@ -0,0 +1,40 @@ +
    +
    + +
      +
    • {lang code='sort_by'} :
    • + {assign var=sorting_links value=func->sorting_links()} + {foreach from=$sorting_links item=name key=sort} +
    • {$name}
    • + {/foreach} +
    + + +
    + +
    +{assign var=time_links value=func->time_links()} +{foreach from=$time_links item=name key=sort name=times} + {$name} {if !$smarty.foreach.times.last}|{/if} +{/foreach} +
    +
    + {section name=p_list loop=$photos} + {include file="$style_dir/blocks/photo.html" photo=$photos[p_list]} + {sectionelse} + {lang code='no_results_found'} + {/section} +
    +
    +
    + +
    +
    + {AD place='ad_160x600'} +
    + +
    + +
    + +{include file="$style_dir/blocks/pagination.html"} \ No newline at end of file diff --git a/upload/styles/cbv2new/layout/private_message.html b/upload/styles/cbv2new/layout/private_message.html new file mode 100644 index 00000000..9141660d --- /dev/null +++ b/upload/styles/cbv2new/layout/private_message.html @@ -0,0 +1,50 @@ +
    + {include file="$style_dir/blocks/manage/account_left.html"} + + +
    \ No newline at end of file diff --git a/upload/styles/cbv2new/layout/search.html b/upload/styles/cbv2new/layout/search.html new file mode 100644 index 00000000..ccb07eef --- /dev/null +++ b/upload/styles/cbv2new/layout/search.html @@ -0,0 +1,77 @@ +
    + + + +{lang code='more_options'} + +
    +
    {$search_type_title}
    +
    + +
    + {if $results} + {foreach item=result from=$results} + {assign var=$template_var value =$result} + {include file="$display_template" } + {/foreach} + {else} + {lang code='no_results_found'} + {/if} +
    + +
    +
    + {AD place='ad_160x600'} +
    + +
    +
    + +{include file="$style_dir/blocks/pagination.html"} +
    \ No newline at end of file diff --git a/upload/styles/cbv2new/layout/signup.html b/upload/styles/cbv2new/layout/signup.html new file mode 100644 index 00000000..734a8741 --- /dev/null +++ b/upload/styles/cbv2new/layout/signup.html @@ -0,0 +1,113 @@ +{assign var='required_fields' value=$userquery->load_signup_fields()} +{assign var='custom_field' value=$userquery->custom_signup_fields} + +{if $mode == 'signup_success'} +
    + {if $udetails.usr_status !='Ok'} + {lang code='signup_success_usr_ok'} + {else} + {lang code='signup_success_usr_emailverify' assign='signupsuccessusremailverify'} + {link name='login' assign='login_link'} + {$signupsuccessusremailverify|sprintf:$login_link} +{/if}
    +{else} + + +{/if} +
    diff --git a/upload/styles/cbv2new/layout/upload.html b/upload/styles/cbv2new/layout/upload.html new file mode 100644 index 00000000..814a807f --- /dev/null +++ b/upload/styles/cbv2new/layout/upload.html @@ -0,0 +1,72 @@ +{lang code='vdo_upload_step2' assign='vdo_upload_step'} +
    + + + + {if $step =='1'} + + {assign var='no_upload' value='yes'} + {assign var=opt_list value=$Upload->load_upload_options()} +
      + {foreach from=$opt_list item=opt key=divid} + + {* Checking weather to show uploadin option to user or not *} + {assign var=uploadOptId value=$opt.load_func} + {if $Cbucket->configs.$uploadOptId=='yes'} + {assign var='no_upload' value='no'} +
    • {$opt.title}
    • + {/if} + {/foreach} +
    +
    +
    + {foreach from=$opt_list item=opt key=divid} + {* Checking weather to show uploadin option to user or not *} + {assign var=uploadOptId value=$opt.load_func} + {if $Cbucket->configs.$uploadOptId=='yes'} + + {/if} + {/foreach} + + {if $no_upload=='yes'} +
    + {lang code='no_upload_opt'} +
    + {/if} +
    + {literal} + + {/literal} + {/if} + + + + + + {if $step==3} +
    + {lang code='video_complete_msg' assign='video_complete_msg'} + {link name='upload' assign='uploadlink'} + {link name='my_videos' assign='myvidslink'} + {$video_complete_msg|sprintf:$myvidslink:$uploadlink:$myvidslink} +
    + {/if} + + +
    + +
    +
    + {lang code='upload_right_guide'} +
    +
    + {AD place='ad_300x250'} +
    +
    \ No newline at end of file diff --git a/upload/styles/cbv2new/layout/user_collections.html b/upload/styles/cbv2new/layout/user_collections.html new file mode 100644 index 00000000..bc6c986e --- /dev/null +++ b/upload/styles/cbv2new/layout/user_collections.html @@ -0,0 +1,30 @@ +{include file="$style_dir/global_header.html"} + +{include file="$style_dir/blocks/view_channel/channel_global.html" } +
    + {include file="$style_dir/header.html"} +
    + {include file="$style_dir/message.html"} + +
    + {include file="$style_dir/blocks/view_channel/channel_left.html"} +
    +
    +
    +

    {$the_title}

    + {section name=c_list loop=$collections} + {include file="$style_dir/blocks/collection.html" collection=$collections[c_list]} + {/section} +
    + {include file="$style_dir/blocks/pagination.html"} +
    +
    +
    +
    + + + \ No newline at end of file diff --git a/upload/styles/cbv2new/layout/user_contacts.html b/upload/styles/cbv2new/layout/user_contacts.html new file mode 100644 index 00000000..77f7bd62 --- /dev/null +++ b/upload/styles/cbv2new/layout/user_contacts.html @@ -0,0 +1,47 @@ +{include file="$style_dir/global_header.html"} + +{include file="$style_dir/blocks/view_channel/channel_global.html" } +
    + {include file="$style_dir/header.html"} +
    + {include file="$style_dir/message.html"} + +
    + {include file="$style_dir/blocks/view_channel/channel_left.html"} +
    +
    +
    + {if $mode == '' || $mode == 'contacts'} + {lang code='users_contacts' assign='users_contacts'} +

    {$users_contacts|sprintf:$u.username}

    + {if $friends} + {foreach from=$friends item=friend} + {if $u.userid!=$friend.userid} + {assign var=user_detail value=$userquery->get_user_details($friend.userid)} + {else} + {assign var=user_detail value=$userquery->get_user_details($friend.contact_userid)} + {/if} + {include file="$style_dir/blocks/user.html" user=$user_detail} + {/foreach} + {else} + This user has no contacts + {/if} + {else} +

    {$heading}

    + {if $userSubs} + {foreach from=$userSubs item=item} + {include file="$style_dir/blocks/user.html" user=$item} + {/foreach} + {/if} + {/if} +
    +
    +
    +
    + + + \ No newline at end of file diff --git a/upload/styles/cbv2new/layout/user_photos.html b/upload/styles/cbv2new/layout/user_photos.html new file mode 100644 index 00000000..ceb3a6c9 --- /dev/null +++ b/upload/styles/cbv2new/layout/user_photos.html @@ -0,0 +1,30 @@ +{include file="$style_dir/global_header.html"} + +{include file="$style_dir/blocks/view_channel/channel_global.html" } +
    + {include file="$style_dir/header.html"} +
    + {include file="$style_dir/message.html"} + +
    + {include file="$style_dir/blocks/view_channel/channel_left.html"} +
    +
    +
    +

    {$the_title}

    + {section name=p_list loop=$photos} + {include file="$style_dir/blocks/photo.html" photo=$photos[p_list]} + {/section} +
    + {include file="$style_dir/blocks/pagination.html"} +
    +
    +
    +
    + + + \ No newline at end of file diff --git a/upload/styles/cbv2new/layout/user_videos.html b/upload/styles/cbv2new/layout/user_videos.html new file mode 100644 index 00000000..243d6826 --- /dev/null +++ b/upload/styles/cbv2new/layout/user_videos.html @@ -0,0 +1,34 @@ +{lang code='channel' assign='object_type'} +{include file="$style_dir/global_header.html"} + +{include file="$style_dir/blocks/view_channel/channel_global.html" } +
    + {include file="$style_dir/header.html"} +
    + {include file="$style_dir/message.html"} + +
    + {include file="$style_dir/blocks/view_channel/channel_left.html"} +
    +
    +
    +

    {$the_title}

    + {section name=v_list loop=$videos} + {include file="$style_dir/blocks/video.html" video=$videos[v_list]} + {/section} + +
    + {include file="$style_dir/blocks/pagination.html"} +
    +
    + +
    + + \ No newline at end of file diff --git a/upload/styles/cbv2new/layout/videos.html b/upload/styles/cbv2new/layout/videos.html new file mode 100644 index 00000000..9ddee63a --- /dev/null +++ b/upload/styles/cbv2new/layout/videos.html @@ -0,0 +1,52 @@ + + + {include file="$style_dir/blocks/category_list.html" type='video'} + + +
    +
    + +
      +
    • {lang code='sort_by'} :
    • + {assign var=sorting_links value=func->sorting_links()} + {foreach from=$sorting_links item=name key=sort} +
    • {$name}
    • + {/foreach} +
    + + +
    + +
    +{assign var=time_links value=func->time_links()} +{foreach from=$time_links item=name key=sort name=times} + {$name} {if !$smarty.foreach.times.last}|{/if} +{/foreach} +
    + +
    +
    +
    + {lang code='change_style_of_listing'} +
    + +
    + {section name=v_list loop=$videos} + {include file="$style_dir/blocks/video.html" video=$videos[v_list]} + {sectionelse} + {lang code='no_results_found'} + {/section} +
    +
    +
    + +
    +
    + {AD place='ad_160x600'} +
    + +
    + +
    + +{include file="$style_dir/blocks/pagination.html"} \ No newline at end of file diff --git a/upload/styles/cbv2new/layout/view_channel.html b/upload/styles/cbv2new/layout/view_channel.html new file mode 100644 index 00000000..3b875952 --- /dev/null +++ b/upload/styles/cbv2new/layout/view_channel.html @@ -0,0 +1,325 @@ +{lang code='channel' assign='object_type'} +{include file="$style_dir/global_header.html"} + +{include file="$style_dir/blocks/view_channel/channel_global.html" } +
    + {include file="$style_dir/header.html"} +
    + {include file="$style_dir/message.html"} + + +
    + {include file="$style_dir/blocks/view_channel/channel_left.html"} +
    +
    + {if isSectionEnabled('photos') || isSectionEnabled('videos')} + + {if $p.show_my_photos !='no'} + {get_photos assign=latestP order=" date_added DESC" limit=10 user=$u.userid} + {/if} + + {get_videos assign=latestV order=" date_added DESC" limit=10 user=$u.userid status="Successful" broadcast="public"} + {if $latestP || $latestV} +
    + {if $p.show_my_photos !='no' && $latestP} + +
    + +
    +
      + {if $latestP} + test + {section name=plist loop=$latestP} + {if $smarty.section.plist.iteration==1} + {if !$profile_item} + {assign var='profile_item' value=$latestP[plist]} + {/if} + {/if} + {include file="$style_dir/blocks/photo.html" photo=$latestP[plist] display_type='channel_page'} + {/section} + {else} +
      {lang code='found_no_photos'}
      + {/if} +
    +
    + +
    + {/if} + + {if $p.show_my_photos !='no' || $p.show_my_videos !='no'} +
    +
    + +
    +
    + {/if} + + + {if $p.show_my_videos !='no' && $latestV} +
    + + +
    +
      + + {section name=vlist loop=$latestV} + {if !$profile_item} + {assign var='profile_item' value=$latestV[vlist]} + {/if} + {include file="$style_dir/blocks/video.html" video=$latestV[vlist] display_type='channel_page'} + {/section} + + +
    +
    + +
    + {/if} +
    + {/if} + {/if} + + {* Fetching Profile item File*} + + {if $profile_item} + + + {/if} + +
    + +
    + + + + {if isSectionEnabled('feeds')} + + {/if} +
    +
    + +
    +
    + {lang code="comments"} + + +
    + +
    + + {if $myquery->is_commentable($p,'u')} + {include file="$style_dir/blocks/comments/add_comment.html" id=$u.userid type=c} + {else} +
    {lang code='coments_disabled_profile'}
    + {/if} +
    +
    +
    +
    +
    + +
    + + + + + + + \ No newline at end of file diff --git a/upload/styles/cbv2new/layout/view_collection.html b/upload/styles/cbv2new/layout/view_collection.html new file mode 100644 index 00000000..37a62ca2 --- /dev/null +++ b/upload/styles/cbv2new/layout/view_collection.html @@ -0,0 +1,208 @@ +{literal} + +{/literal} + + +{lang code='collection' assign='object_type'} + +
    +{uploadButton details=$c output='link' target="_blank" class='moveR small_button non_button'} +
    {$c.collection_name}
    + + + +
    {lang code="by"|capitalize} {$c.username|capitalize} - {lang code="view"|capitalize} {$c.username|capitalize} {lang code="videos"|capitalize} {if $c.userid == $userquery->userid} - {lang code="edit_collection"} - {link name='manage_items' assign='miLink'} {lang code="manage_items"}{/if}
    + +
    + +
    {$c.type|capitalize} ({$c.total_objects})
    + +
    +
    +
    +
    + {section name=list loop=$objects} + {include file="$style_dir/blocks/collection.html" object=$objects[list] display_type=view_collection type=$c.type} + {sectionelse} +
    {$c.collection_name} has 0 items.
    + {/section} +
    +
    +
    + +
    {include file="$style_dir/blocks/new_pagination.html"}
    + + +
    +
    + + + {if $c.userid != userid()} + {if !$cbcollection->is_contributor($c.collection_id,userid())} + + + + {else} + + + + + + {/if} + + {/if} + + + + +
    + {lang code="date_added"} +
    + {$c.date_added|niceTime} +
    + + {lang code="views"} +
    + {$c.views|number_format} {lang code="views"} +
    + + {lang code="categories"} +
    + {$c.category|categories:collections} +
    + + {lang code="tags"} +
    + {$c.collection_tags|tags:collections} + + + +
    + +
    + {$c.collection_description|description} +
    +
    + {assign var=rating value=$cbcollection->collection_rating($c.collection_id,'collection')} + + {if $Cbucket->configs.collection_rating} +
    + {show_video_rating rating=$c.rating ratings=$c.rated_by total='10' id=$c.collection_id type=collection} +
    + {/if} + + + +
    +
    {AD place=ad_728x90}
    +
    + {show_share_form id=$c.collection_id type=Collection} + {show_flag_form id=$c.collection_id type=Collection} + +
    +
    + + {if $myquery->is_commentable($c,'collection')} +
    +

    {lang code="comments"} ({$c.total_comments})

    +
    + +
    + +
    + +
    +
    + {else} +
    + {lang code='comm_disabled_for_collection'} +
    + + {/if} + +
    + + + {if $myquery->is_commentable($c,'collection')} +
    + {include file="$style_dir/blocks/comments/add_comment.html" id=$c.collection_id type='cl'} + {/if} + +
    {AD place=ad_300x250}
    +
    +
    diff --git a/upload/styles/cbv2new/layout/view_group.html b/upload/styles/cbv2new/layout/view_group.html new file mode 100644 index 00000000..3f605b92 --- /dev/null +++ b/upload/styles/cbv2new/layout/view_group.html @@ -0,0 +1,120 @@ +{include file="$style_dir/blocks/group/group_left.html"} + +
    +
    {$group.group_name|htmlspecialchars_decode}
    +
    + +
    + {if $mode == "" || $mode == "main"} +
    {lang code="basic_info"}
    +
    +
    {lang code="vdo_desc"}
    +
    {$group.group_description}
    +
    +
    +
    {lang code="category"}
    +
    {$group.category|categories:group}
    +
    +
    +
    {lang code="tags"}
    +
    {$group.group_tags|tags:group}
    +
    +
    +
    {lang code="privacy"}
    +
    {$group.group_privacy|getGroupPrivacy}
    +
    +
    {lang code="Group Stats"}
    +
    +
    {lang code="Since"}
    +
    {$group.date_added|date_format:"%B %e, %Y"}
    +
    +
    +
    {lang code="total_mems"}
    +
    {$group.total_members|number_format} {lang code="members"}
    +
    +
    +
    {lang code="com_total_vids"}
    +
    {$group.total_videos|number_format} {lang code="videos"}
    +
    +
    +
    {lang code="total_topics"}
    +
    {$group.total_topics|number_format} {lang code="grp_topics_title"}
    +
    +
    +
    {lang code="viewed"}
    +
    {$group.total_views|number_format} {lang code="user_times"}
    +
    + {/if} + {if $mode=='invite_group'} +
    {lang code='grp_invite_grp_title'}
    + {if $friends} +
    + + + + + + + +
     Usernameviews
    + {foreach from=$friends item=friend} + {if userid()!=$friend.userid} + {assign var=user_detail value=$userquery->get_user_details($friend.userid)} + {else} + {assign var=user_detail value=$userquery->get_user_details($friend.contact_userid)} + {/if} + +
    + + + + + + + +
    {$user_detail.username}{$user_detail.username}{$user_detail.profile_hits|number_format}
    +
    + {/foreach} +
    +
    + {else} + No Contact + {/if} + {/if} + {if $mode == "view_members"} +
    {lang code="group"} {lang code="members"}
    + {section name=u_list loop=$users} + {include file="$style_dir/blocks/user.html" user=$users[u_list]} + {/section} + {/if} + + {if $mode == "view_videos"} +
    {lang code="group"} {lang code="videos"}
    + {section name=v_list loop=$videos} + {include file="$style_dir/blocks/video.html" video=$videos[v_list]} + {/section} + {/if} + + {if $mode == "view_topics"} +
    {lang code="group"} {lang code="grp_topics_title"} - {lang code="grp_add_new_topic"}
    +
    + {include file="$style_dir/blocks/group/add_topic.html"} +
    + {include file="$style_dir/blocks/group/group_topics.html" group=$group} + {/if} + + {if $mode == "view_report_form"} +
    {lang code="Report"} {lang code="group"}
    + {show_flag_form id=$group.group_id type=Group display="block"} + {/if} +
    +
    +
    + +{include file="$style_dir/blocks/group/group_right.html"} \ No newline at end of file diff --git a/upload/styles/cbv2new/layout/view_item.html b/upload/styles/cbv2new/layout/view_item.html new file mode 100644 index 00000000..01493d40 --- /dev/null +++ b/upload/styles/cbv2new/layout/view_item.html @@ -0,0 +1,46 @@ +
    + + +
    + {if $type !='videos'} + + + + +
    + {assign var=objctid value=$object.ci_id} + {assign var=collid value=$object.collection_id} +
  • + {assign var=preLink value=$cbphoto->collection->get_next_prev_item($objctid,$collid,'prev')} + Previous +
  • +
  • + {assign var=nextLink value=$cbphoto->collection->get_next_prev_item($objctid,$collid,'next')} + Next +
  • +
    + + + {/if} +
    +
    + {if $type == 'photos'} + {include file="$style_dir/view_photo.html" photo=$object user=$user} + {/if} + + {if $type == 'videos'} + {include file="$style_dir/watch_video.html" vdo=$object user=$user} + {/if} + +
    \ No newline at end of file diff --git a/upload/styles/cbv2new/layout/view_page.html b/upload/styles/cbv2new/layout/view_page.html new file mode 100644 index 00000000..2c241ac3 --- /dev/null +++ b/upload/styles/cbv2new/layout/view_page.html @@ -0,0 +1 @@ +
    {$page.page_content|page}
    \ No newline at end of file diff --git a/upload/styles/cbv2new/layout/view_photo.html b/upload/styles/cbv2new/layout/view_photo.html new file mode 100644 index 00000000..921821de --- /dev/null +++ b/upload/styles/cbv2new/layout/view_photo.html @@ -0,0 +1,110 @@ + +{lang code='photo' assign='object_type'} + +
    +{assign var=json value=$photo.photo_details|json_decode} + + {ANCHOR place="video_bookmarks" data=$photo} +
    +
    +
    + {show_video_rating rating=$photo.rating ratings=$photo.rated_by total='10' id=$photo.photo_id type=photo} +
    + +
    +
    + {show_share_form id=$photo.photo_id type=Photo} + {show_flag_form id=$photo.photo_id type=Photo} + + +
    +
    +
    +

    {lang code='comments'}

    + +
    + + {if $myquery->is_commentable($photo,'p')} + {include file="$style_dir/blocks/comments/add_comment.html" id=$photo.photo_id type=p} + {else} +
    {lang code='Comments disabled for this photo'}
    + {/if} +
    +
    + +
    +
    + {$user.username}
     
    + + {lang code="videos"} | {lang code="favorites"} | {lang code='contacts'} + +
     
    + +
    + +
    +
    +
    {$photo.photo_title}
    +
    + {$photo.photo_description} +
    +
    {$photo.photo_tags|tags:photos}
    +
    +{AD place="ad_300x250"} +
    +{if $userquery->userid == $photo.userid} + Edit Photo +{/if} +{DownloadButtonP details=$photo class='LoadMoreButton' style='display:inline-block; *display:inline; margin-left:5px;' output='div'} +{get_photos assign=uphotos user=$photo.userid exclude=$photo.photo_id order=RAND() limit='5'} +{if $uphotos} +
    +
    More Photos From {$user.username}
    +
    +{section name=list loop=$uphotos} + {include file="$style_dir/blocks/photo.html" display_type="related_photos" photo=$uphotos[list]} +{/section} +
    +{/if} + +{get_photos assign=related collection=$photo.collection_id show_related=TRUE title=$photo.photo_title tags=$photo.photo_tags exclude=$photo.photo_id limit='5'} +{if $related} +
    +
    Related Photos
    +
    +{section name=list loop=$related} + {include file="$style_dir/blocks/photo.html" display_type="related_photos" photo=$related[list]} +{/section} +
    +{/if} +
    \ No newline at end of file diff --git a/upload/styles/cbv2new/layout/view_topic.html b/upload/styles/cbv2new/layout/view_topic.html new file mode 100644 index 00000000..1ddef694 --- /dev/null +++ b/upload/styles/cbv2new/layout/view_topic.html @@ -0,0 +1,47 @@ + +{lang code='topic' assign='object_type'} + +{include file="$style_dir/blocks/group/group_left.html"} + +
    +
    {$group.group_name}
    +
    + +
    + +
    +
    +
    {$topic.topic_title}
    + {assign var=topic_starter value=$userquery->get_user_details($topic.userid)} + {include file="$style_dir/blocks/user.html" user=$topic_starter block_type="topic_view"} +
    + {$topic.topic_post|description} +
    +
    {lang code="Added"}: {$topic.date_added|niceTime}
    +
    +
    + +
    +Re-load Posts +
    + +
    +
    +{include file="$style_dir/blocks/comments/add_comment.html" id=$topic.topic_id type=t} +
    +
    +
    +{include file="$style_dir/blocks/group/group_right.html"} \ No newline at end of file diff --git a/upload/styles/cbv2new/layout/watch_video.html b/upload/styles/cbv2new/layout/watch_video.html new file mode 100644 index 00000000..bc9a2df4 --- /dev/null +++ b/upload/styles/cbv2new/layout/watch_video.html @@ -0,0 +1,269 @@ + +{lang code='video' assign='object_type'} + + +{assign var=videos_items_columns value=func->config(videos_items_columns)} +{get_videos nonuser=$vdo.userid exclude=$vdo.videoid limit=$videos_items_columns order="date_added ASC" assign=related_vids show_related=yes title=$vdo.title tags=$vdo.tags} + +
    +
    {$vdo.title}
    + {if $userquery->perm_check('admin_access')=='yes'}
    {ANCHOR place=watch_admin_options data=$vdo}
    {/if} + + + {ANCHOR place="before_watch_player" data=$vdo } + + + {if has_hq($vdo)} + + + + + + {/if} +
    + + +
    + +
    + {FlashPlayer vdetails = $vdo} +
    + + + +
    +
    + {show_video_rating rating=$vdo.rating ratings=$vdo.rated_by total='10' id=$vdo.videoid type=video} +
    + + +
    + + + +
    + {show_share_form id=$vdo.videoid type=Video} + {show_flag_form id=$vdo.videoid type=Video} + + {show_playlist_form id=$vdo.videoid type=Video} +
    + + + +
    + + +
    + + +
    {lang code='subscribe'}
    +
    + +
    {ANCHOR place="video_bookmarks" data=$vdo} +
    + {lang code='uploaded_by_s' assign='uploaded_by_s'} + {$uploaded_by_s|sprintf:$vdo.username} — {$vdo.date_added|nicetime} +
    +
    +
      +
    • {lang code='views'} : {$vdo.views|number_format}
    • +
    • {lang code='duration'} : {$vdo.duration|SetTime}
    • +
    • {lang code='comments'} : {$vdo.comments_count|number_format}
    • +
    +
    +
    + +
    +
    + {$vdo.description|description|truncate:200}{if strlen($vdo.description)>200}{lang code='more'}{/if} +
    + + +
    + + +
    +
    {$vdo.tags|tags:videos}
    +
    Category : {$vdo.category|categories:video}
    +
    + +
    + +
    + + + + +
    +

    {lang code='comments'} ({$vdo.comments_count})

    + +
    + + + {if $myquery->is_commentable($vdo,'v')} + {include file="$style_dir/blocks/comments/add_comment.html" id=$vdo.videoid type=v} + {else} +
    {lang code='comm_disabled_for_vid'}
    + {/if} +
    +
    + +
    + + + + + +
    +
    {AD place=ad_300x250}
    + + + {if $Cbucket->configs.video_download==1 && $cbvid->downloadable($vdo)} {/if} + + {ANCHOR place="watch_video_right" data=$vdo} + + +{if $open_collection} + + {$c.collection_name} +
    + +
    + {assign var=objctid value=$vdo.ci_id} + {assign var=collid value=$vdo.collection_id} +
  • + {assign var=preLink value=$cbvid->collection->get_next_prev_item($objctid,$collid,'prev')} + Previous +
  • +
  • + {assign var=nextLink value=$cbvid->collection->get_next_prev_item($objctid,$collid,'next')} + Next +
  • +
    + +
    + {foreach from=$items item=item} + {if $bg=='fff'} + {assign var='bg' value='EFF5F8'} + {else} + {assign var='bg' value='fff'} + {/if} + + {include file="$style_dir/blocks/quicklist/video_block.html" video=$item selected=$vdo.videoid bg=$bg + videoLink=$cbphoto->photo_links($item,'view_item')} + + {if $vdo.videoid==$item.videoid} + {assign var='pre_lock' value='yes'} + {else} + {if !$pre_lock} + {videoLink vdetails=$item assign='pre_vid'} + {else} + {if !$next_lock} + {videoLink vdetails=$item assign='next_vid'} + {assign var='next_lock' value='yes'} + {/if} + {/if} + {/if} + + + {/foreach} +
    +
    + +{/if} + + +{if userid()} + {lang code='collections'} + +{/if} + + + + {include file="$style_dir/blocks/watch_video/playlist_box.html" selected=$vdo.videoid } + + + + + +{assign var=videos_items_columns value=func->config(videos_items_columns)} +{get_videos user=$vdo.userid limit=$videos_items_columns assign=user_vids exclude=$vdo.videoid} +{if $user_vids} + + +{lang code='more_from' assign='more_from'} +{$more_from|sprintf:$vdo.username} +
    +{section name=uvlist loop=$user_vids} + {include file="$style_dir/blocks/watch_video/video_box.html" video=$user_vids[uvlist]} +{/section} +
    +
    +{/if} + + + +{* get_videos category=$vid_cat nonuser=$vdo.userid exclude=$vdo.videoid limit=$videos_items_columns order="date_added ASC" assign=related_vids show_related=yes title=$vdo.title*} + + +{if $related_vids} +{lang code='related_videos'} + +{/if} + + +
    + +
    \ No newline at end of file diff --git a/upload/styles/cbv2new/template.xml b/upload/styles/cbv2new/template.xml new file mode 100644 index 00000000..18d0f0bb --- /dev/null +++ b/upload/styles/cbv2new/template.xml @@ -0,0 +1,9 @@ + + \ No newline at end of file diff --git a/upload/styles/cbv2new/theme/ie7.css b/upload/styles/cbv2new/theme/ie7.css new file mode 100644 index 00000000..1ea7860d --- /dev/null +++ b/upload/styles/cbv2new/theme/ie7.css @@ -0,0 +1,35 @@ +/* + Stylesheet to make Clipbucket V2 Compatible with Shitty IE7 + If you are reading this, I beg you please update your browser to Firefox or Chrome or Safari or Opera. If you still insists using on Internet Explorer, please use Internet Explorer 8 +*/ + +body,html{overflow-x:hidden} +.clearfix { display:inline-block; } +.foot_s_con { margin:10px auto 0; padding:0px; } +.foot_s_con input[type=submit] { background:url(../images/foot_search.png) top repeat-x; border:1px solid #555555; height:35px; padding:0px 6px; margin:1px 0px 0px; color:#FFF; font-family:Verdana,Tahoma,Arial,sans-serif; } + +.searchbar { background:url(../images/dot.gif); width:200px; border:none; margin:2px 0px 0px 0px; font-size:11px; color:#323232; font-family:Verdana,Tahoma,sans-serif; padding:6px 5px 7px; float:left; border-right:1px solid #ccc; display:inline; } +.searchbutton { background:url(../images/dot.gif); text-indent:-5000px; border:0px; width:64px; height:26px; line-height:18px; cursor:pointer; margin-top:2px; margin-left:5px; font-weight:bold; font-family:tahoma; font-size:11px; display:block; } +.s_type { background:url(../images/dot.gif) repeat; float:left; margin:7px 9px 0px 1px; padding:0px 0px; font-size:10px; font-family:Verdana,Arial,sans-serif; border:0px none; color:#323232; } + + + +#add_comment h2, #commentsContainer h2, .group_view h2 { font-size:14px; margin:0px; padding:0px } +#commentsContainer h2, .group_view h2 { margin:10px 0; } + +.search_field_button{background:url(../images/blocks.png); width:25px; height:22px; border:0px; background-position:-160px -180px; padding:0px; margin:0px; text-indent:-50000000px; float:left; cursor:pointer; outline:none; } + +.top_tabs { z-index:100; position:relative; } +.collectItemBox { display:inline; zoom:1; } +#selectedSearch { position:relative; width:82px; margin:0px; padding:9px 0px 5px 0px; text-align:center; font:bold 11px Tahoma; overflow:hidden; color:#000;} +#selectedSearch:hover { cursor:pointer; } +#searchSelectWrapper { padding:0px; margin:0px; position:relative; display:none;} +#searchSelectWrapper ul { position:absolute; background:#EEE; width:104%; top:1px; text-align:center; list-style:none; z-index:999999; padding:0px; margin:0px; border:1px solid #ccc; border-top:0px none; left:-1px; } +#searchSelectWrapper ul li { padding:5px 0px; list-style:none; margin:0px; color:#000; display:block; float:none; border:0px none; position:relative; border:1px solid transparent; margin:0 -1px -1px -1px; } +#searchSelectWrapper ul li a { margin:0px; font:normal 11px Tahoma; color:#000; text-transform:none; display:block; } +#searchSelectWrapper ul li:hover, #searchSelectWrapper ul li.selected { background:#333; border-color:#000; } +#searchSelectWrapper ul li:hover a, #searchSelectWrapper ul li.selected a { color:#FFF; } + +/* + I'm still at your mercy please update your browsers T_T PLEASE +*/ diff --git a/upload/styles/cbv2new/theme/main.css b/upload/styles/cbv2new/theme/main.css new file mode 100644 index 00000000..85caa887 --- /dev/null +++ b/upload/styles/cbv2new/theme/main.css @@ -0,0 +1,1017 @@ +/* +ClipBucket 'ClipBucket v2(New)' Template Theme by Fawaz Tahir +-------------------------------------------------------------- +Style name: ClipBucket v2(New) +-------------------------------------------------------------- +*/ + +@import url("view_channel.css"); +@import url("rating.css"); + +body,html {background-color:#fff; margin:0px; padding:0px; +font-family:Arial, Helvetica, sans-serif; color:#333; font-size:11px; +word-wrap:break-word;} + +#content{} +/* CLEARS */ +.clearfix { } +.clearfix:after{ content: "."; display:block; height:0; font-size:0; clear:both; visibility:hidden; } + +/* GENERAL CSS */ +a{ color:#0066cc; text-decoration:underline; outline:none; } +a:hover,a:active { /*color:#464646; */ color:#d54e21; outline:none; } +a[rel=sponsors] { padding:5px; background:#0099cc; border:1px solid transparent; } +a[rel=sponsors]:hover { background:#555; border:1px solid #232323; } +img, a img { border:0px none; } +.video_thumb { background:#FFF; border:1px solid #ccc; padding:1px; float:left; margin-right:5px; margin-bottom:5px; position:relative } +.video_thumb .duration{ position:absolute; right:1px; bottom:1px; background-color:#333; color:#fff; font-size:9px; display:inline; padding:1px} +.video_thumb:hover { border:1px solid #aaa; } +.vid_sp { padding:5px 0px; margin-bottom:10px; border-bottom:1px solid #ccc; clear:both; } + +.moveL { float:left; } +.moveR { float:right; } + +.heading{font-size:12px; color:#003; background-image:url(../images/nav_grads.png); background-position:-0px -195px; background-repeat:repeat-x; height:28px; display:block; color:#fff; line-height:28px; font-weight:bold; padding-left:5px; +} + + + +/** +Rating +*/ +.rating{width:50px;height:15px;} +.rating .stars_blank { background:url(../images/small_stars.png) ;background-repeat:repeat-x; background-position:bottom; height:12px; width:100%; } +.rating .stars_filled { background:url(../images/small_stars.png);background-repeat:repeat-x; background-position:top left; height:12px; float:left; } + +.viewCollectionRating { width:140px; height:28px; } +.viewCollectionRating .stars_blank { background:url(../images/big_stars.png) ;background-repeat:repeat-x; background-position:bottom; height:28px; width:100%; } +.viewCollectionRating .stars_filled { background:url(../images/big_stars.png);background-repeat:repeat-x; background-position:top left; height:28px; float:left; } + +.big_stars{width:140px; height:28px; position:relative} +.big_stars .stars_blank { background:url(../images/big_stars.png) ;background-repeat:repeat-x; background-position:bottom; height:28px; width:100%; } +.big_stars .stars_filled { background:url(../images/big_stars.png);background-repeat:repeat-x; background-position:top left; height:28px; float:left; } +.big_stars li:hover,.big_stars .stars_highlight{background:url(../images/big_stars.png);background-repeat:repeat-x; background-position:center left; height:28px; float:left;} + +.big_stars ul{position:absolute; top:0px; left:0px} +.big_stars ul, .big_stars ul li{margin:0px; padding:0px; list-style:none; float:left; } +.big_stars li{display:block; float:left; width:28px; cursor:pointer; text-indent:-50000px} +.big_stars li:hover{} + +/* CONTAINERS */ +.container_container{} +.container { width:1000px; margin:0px auto; padding:0px; position:relative; } +.topHead{background:#FFF !important} +.content_con { width:660px; margin:0px auto; padding:0px; float:left; margin-left:8px; } +.login_con { width:325px; float:right; margin:0px; padding:0px; position:absolute; top:0px; right:0px; z-index:999; } +.side_con { top repeat-x; width:305px; min-height:391px; margin:0px 8px 0px 0px; padding:5px; float:right; } +.feature_con { background:url(../images/simple_gradient.png) bottom repeat-x; border:2px solid #ccc; background-color:#fff; min-height:287px; padding-bottom:4px;border-radius:5px;-webkit-border-radius:5px;-moz-border-radius:5px;} +.search_con { float:right; margin:0px; padding:0px;margin-right:4px; margin-top:3px; } +.foot_s_con { width:500px; margin:10px auto 0px; padding:10px 0px 0px; } + +/* HEADER */ +#header { margin:0px 0px 15px; padding:1px 0px 0px 5px; } + +/* LOGO */ +.logo { background:url(../images/logo.png) left bottom no-repeat; float:left; margin:2px 2px 10px 3px; padding:0px; } + +/* LOGIN FORM */ +#user_login{ background:url(../images/log_button.png) top repeat-x; border:1px solid #ccc; padding:0px 8px; margin:0px auto; height:25px; line-height:25px; border-top:0px none; position:relative; bottom:1px; float:right; margin-right:15px; -moz-border-radius-bottomright:5px; -webkit-border-bottom-right-radius:5px; z-index:2000; overflow:hidden; } +#user_login a { display:block; text-decoration:none; text-align:center; text-shadow:1px 1px 1px #FFF; color:#555; text-transform:uppercase; } +#user_login a:hover { color:#aaa; } +.user_login { background:#f3f3f3; border:1px solid #ccc; border-top:0px none; margin-right:5px; padding:2px 5px; margin:0px; margin-right:10px; position:relative; z-index:1100;} +.user_login input[type=text], .user_login input[type=password] { padding:4px; font-size:11px; margin-bottom:2px; border:1px solid #ccc; background:#fff; color:#aaa; width:125px; font-family:Calibri,Tahoma,Verdana,Arial,sans-serif; } +.user_login input[type=text]:hover, .user_login input[type=password]:hover, +.user_login input[type=text]:focus, .user_login input[type=password]:focus { color:#555; border:1px solid #aaa; } +.user_login input[type=submit] { background:url(../images/login_button.png) top repeat-x; height:23px; border:1px solid #555; padding:0px; line-height:19px; font-size:10px; color:#FFF; text-align:center; width:50px; margin:5px 0px 5px 3px; } +.user_login input[type=submit]:hover { background:url(../images/login_button.png) bottom repeat-x; height:23px; cursor:pointer; border:1px solid #228bb3; } +.user_login input[type=submit]:active { background:#2ba0cd; } +.user_login input[type=checkbox] { width:10px; height:10px; vertical-align:middle; } +.user_login a.forget { background:url(../images/forget.png) top no-repeat; width:19px; height:19px; margin-top:3px; padding:0px; float:right; } +.user_login a.forget:hover { background:url(../images/forget.png) bottom no-repeat; } +span.remember { font-size:10px; } +.user_login .avatar { padding:1px; width:40px; height:40px; background:#fff; margin:0px 5px 2px 0px; border:1px solid #ccc; float:left; } +.user_login .avatar:hover { border:1px solid #aaa; } +.user_login .txt { font-size:11px; margin-bottom:8px; } +.user_login .txt a { color:#cc0000; text-decoration:none; padding:1px; } +.user_login .txt a:hover { background:#cc0000; color:#fff; } +.user_login .links { font-size:10px; } + +/* TOP TABS */ +.top_tabs { margin:0px; padding:0px; clear:both;overflow:hidden;} +.top_tabs ul { margin:0px; padding:0px; list-style:none; float:left; position:relative; left:50%; } +.top_tabs ul li { margin:0px; padding:0px; float:left; list-style:none; position:relative; right:50%; top:1px; } +.top_tabs ul li a { width:120px; display:block; padding:5px 0px; background:#62b3ff; text-align:center; text-decoration:none; color:#FFF; margin-right:0px; font-size:13px; background:url(../images/nav_grads.png); background-position:-0px -169px; background-repeat:repeat-x; border-right:1px solid #115683} +.top_tabs ul li a:hover { background:#0099cc; } +.top_tabs ul li.selected a { background:url(../images/nav_grads.png) -0px -7px; repeat-x; border:1px solid #006699; border-bottom:0px none; font-weight:bold} +.top_tabs ul li:first-child a{ -moz-border-radius-topleft:5px; -webkit-border-top-left-radius:5px;} +.top_tabs ul li:last-child a{ -moz-border-radius-topright:5px; -webkit-border-top-right-radius:5px; border-right:none} + +/* NAVIGATION */ +#navi_con { background:#14669c; padding:5px; margin:0px; border-top:1px solid #006699; } +.navi { background:url(../images/nav_grads.png) 0px -33px repeat-x; height:35px; border:1px solid #444; margin:auto; padding:0px; line-height:35px; border-radius:5px; -moz-border-radius:5px; -webkit-border-radius:5px; width:1000px} +.navi ul { margin:0px; padding:0px; list-style:none; } +.navi ul li { margin:0px; padding:0px; float:left; padding-left:5px; list-style:none; font-size:11px; height:15px; margin-top:8px ; line-height:15px; padding-left:10px; color:#fff; border-left:1px solid #5f5f5f; padding-right:5px;border-right:1px solid #343434} +.navi ul li:first-child { margin-left:10px; border-left:none; padding-left:0px } +.navi ul li:last-child{border-right:none;} +.navi ul li a { color:#fff; text-decoration:none; font-family:tahoma; font-size:11px; font-weight:bold; text-transform:uppercase } +.navi ul li a:hover{color:#00bfff} +.nav_shadow { height:10px; margin:0px; margin-top:1px; padding:0px; } + +/* SEARCH */ +.s_bg { background:url(../images/search.png) no-repeat; width:359px; height:29px; margin:0px; padding:0px; -moz-border-radius:4px 0px 0px 4px; border:1px solid transparent; } +.searchbar { background:none; width:200px; border:none; margin:2px 0px 0px 0px; font-size:11px; color:#323232; font-family:Verdana,Tahoma,sans-serif; float:left; padding:6px 5px 7px; float:left; border-right:1px solid #ccc; } +.searchbutton { background:none; text-indent:-5000px; border:0px; width:59px; height:25px; line-height:18px; cursor:pointer; margin-top:2px; margin-left:5px; font-weight:bold; font-family:tahoma; font-size:11px; } +.s_type { background:url(../images/dot.gif) repeat; float:left; margin:7px 9px 0px 1px; padding:0px 0px; font-size:10px; font-family:Verdana,Arial,sans-serif; border:0px none; color:#323232; width:64px; } + + + + +/* FEATURED VIDEO SECTION */ +.feature_left { float:left; margin:0px; padding:0px; width:460px } +.feature_left .feature_heading{background-image:url(../images/nav_grads.png); background-position:0px -417px; height:24px; line-height:24px; color:#fff; text-shadow:0px 0px 8px #000; width:98%; display:block; margin-top:10px;border-radius:0px 8px 8px 0px; -moz-border-radius:0px 8px 8px 0px; -webkit-border-top-right-radius:8px; -webkit-border-bottom-right-radius:8px; padding-left:10px; font-weight:bold; text-transform:uppercase; font-family:Tahoma,Verdana,sans-serif; } +.feature_right { float:right; position:relative; width:28%; margin:4px 3px 0px 0px;font-size:10px; overflow:auto; height:360px;} +.feature_shadow { background:url(../images/shadows.png) 0px -31px no-repeat; width:660px; height:35px; margin:0px; padding:0px; } + + +/* FEATURED VIDEO HEADING */ +.feature_head { background:#88c5ff; width:100%; margin:0px 0px; padding:0px; height:20px; line-height:20px; position:relative; text-align:center; } +.feature_head h2 { font-size:18px; font-family:Tahoma; color:#fff; text-shadow:1px 1px 1px #44627f; } +.feature_head .left_side { background:url(../images/blocks.png) -277px -50px no-repeat; width:10px; height:57px; position:absolute; top:-6px; left:-6px; } +.feature_head .right_side { background:url(../images/blocks.png) -293px -56px no-repeat; width:9px; height:44px; position:absolute; right:-9px; } + +/* FEATURED VIDEO LEFT SIDE */ +.feature_vid { margin:3px auto; width:350px; padding:0px; font-weight:lighter; } +.feature_left .sp2 { background:url(line_sp2.png) repeat-x; height:2px; margin:6px 0px; padding:0px; } + +/* FEATURED VIDEO RIGHT SIDE */ +.feature_right ul { margin:0px; padding:0px; list-style:none; } +.feature_right ul li { padding:0px; margin:0px; margin-bottom:3px; color:#193f77; font-size:9px; } +.feature_right .sp { background:url(../images/line_sps.png) top repeat-x; margin:5px 0px; padding:0px; height:2px; } +.feature_right .details_block { float:left; width:50%; margin:0px; padding:0px; color:#999 } +.feature_right .title a{font-size:9px; font-weight:bold; text-decoration:none; color:#fff} +.feature_right .title { font-size:10px; clear:both; padding:0px; overflow:hidden} +.featured_vid_con{cursor:pointer; background:#FFF url(../images/nav_grads.png) -0px -260px; padding:5px; border-radius:5px 0px 0px 5px;-moz-border-radius:5px 0px 0px 5px; -webkit-border-top-left-radius:5px; -webkit-border-bottom-left-radius:5px; background-color:#FFF; margin:3px 0px 3px} +.featured_vid_con .video_thumb{border:0px; padding:0px; float:left; } +.featured_vid_con:hover{background-position:-0px -338px; } +.featured_video_details{width:440px; border-radius:5px;-moz-border-radius:5px;-webkit-border-radius:5px; background-color:#fff; padding:5px; margin:5px} +.featured_video_player{width:440px; height:250px; border-radius:5px;-moz-border-radius:5px;-webkit-border-radius:5px; background-color:#000; padding:5px; margin:5px} + +/* MAIN VIDEOS BLOCK */ +.tabs { background:url(../images/tabs_bg.png) top repeat-x; height:41px; margin:0px; line-height:41px; padding:0px; border:1px solid #ccc; border-radius:5px 5px 0px 0px ;-moz-border-radius:5px 5px 0px 0px ; -webkit-border-top-left-radius:5px; -webkit-border-top-right-radius:5px; } +.tabs ul { margin:0px; padding:0px; list-style:none; } +.tabs ul li { margin:0px; padding:0px 0px; list-style:none; float:left; } +.tabs ul li a { background:url(../images/tabs_sp.png) right repeat-y; padding:13px 12px 14px; text-decoration:none; } +.tabs ul li.selected { background:url(../images/tabs_bg.png) bottom repeat-x; } +.tabs ul li.selected a { color:#d36a4a; text-decoration:none; font-weight:bold } + +.main_vids { border:1px solid #ccc; border-top:0px none; background:url(../images/main_vid_bg.png) bottom repeat-x; padding:8px; } +.main_vid_shadow { background:url(../images/shadows.png) 0px -152px no-repeat; width:660px; height:6px; margin:0px; padding:0px; } + +/* CHANGE LIST STYLE */ +#style_change { border-bottom:1px solid #ccc; padding:0px 5px 8px; margin:0px 0px 15px; font-size:10px; color:#232323; } +#style_change a { text-decoration:none; } +#grid { float:right; background:url(../images/blocks.png) -325px -78px no-repeat; padding:1px; border:1px solid #ccc; width:11px; height:11px; } +#list { background:url(../images/blocks.png) -344px -78px no-repeat; padding:1px; border:1px solid #ccc; width:19px; height:11px; float:right; margin-right:10px; } +#grid:hover,#list:hover { cursor:pointer; border:1px solid #aaa; } + +/* SOME IMPORTANT CLASSES */ +.moveL { float:left; } +.moveR { float:right; } +.clear { clear:both; } + +/* NEW LISTING OF VIDEOS */ +#vid_wrap { maring:0px; padding:0px; } + +.grid_view { height:150px; padding:0px; width:114px; margin:0px 10px 12px 0px; float:left; } +.list_view { width:100%; border-bottom:1px solid #ccc; height:85px; } +.grid_view a, .list_view a { text-decoration:none; font-weight:bold; } +.grid_view h2.title, .list_view h2.title { font-size:11px; margin:2px 0px 3px 2px; padding:0px;} +.grid_view .vid_info, .list_view .vid_info { font-size:10px; margin:2px 2px; padding:0px; } + +.vid_thumb { margin:0px; background:#FFF; position:relative; } +.vid_thumb a img { width:110px; height:66px; border:1px solid #ccc; padding:1px;} +.vid_thumb:hover a img { border:1px solid #aaa; } +.vid_thumb .vid_time { position:absolute; bottom:2px; right:2px; padding:1px; background:#333; font-size:9px; color:#FFF;font-family:tahoma } + +.vid_info_wrap { width:100%; display:block; margin:0px; padding:0px; } + +.grid_view #desc { display:none; } +.grid_view span.info_list, .grid_view span.list_up_time { display:none; } +.grid_view span.list_commnets { display:none; } + +.list_view #desc { display:block; clear:both; font-size:11px; margin:2px 0px 3px 2px; text-align:left; } +.list_view span.info_list, .list_view span.list_up_time { display:inline; } +.list_view span.list_commnets { display:inline; } + +.list_view .vid_info_wrap { float:right; width:81%; } +.list_view h2.title { display:inline; float:left; } +.list_view .vid_thumb { float:left; } +.list_view .rating { float:right; } + +.vertical a,.horizantal a{text-decoration:none; font-weight:bold} + +/* VERTICAL LISTING STYLE */ + +.vertical { width:118px; margin:0px 6px 10px 0px; padding:0px 0px 10px; float:left; height:150px } + +.vertical .details_block { float:none; width:100%; } +.vertical .lvl1, .vertical .lvl2, .vertical .lvl3, .vertical .lvl4 { display:block; } + +.vertical .lvl1 .title { font-size:11px; } +.vertical .lvl1 .rating { margin-top:5px; width:50px; } +.vertical .lvl2 { display:none; } + +.vertical .lvl3 { font-size:10px; } +.vertical .lvl3 .views span { font-weight:lighter; } + + +.vertical .lvl4 { font-size:10px; } +.vertical .lvl5{display:none} + + +/* SIDEBAR INDEX */ +.box { background:#FFF; border:1px solid #b6e2fe; padding:2px; width:300px; margin:0px auto 10px; border-radius:5px;-moz-border-radius:5px;-webkit-border-radius:5px;-khtml-border-radius:5px } + + +/* LOGIN/REGISTER BOX */ +.login { background:url(../images/main_box.png) repeat-x; height:92px; width:300px; position:relative; margin:auto} +.login_box_cont{border-radius:10px;-moz-border-radius:10px;-webkit-border-radius:10px;} +.login .login_title{font-size:12px; font-weight:bold; text-transform:uppercase; font-family:tahoma; color:#0099cc; margin:9px 0px 0px 91px; height:23px; line-height:23px; text-align:center} +.login .some_info{ margin-left:91px; font-size:10px; font-weight:bold; text-transform:uppercase; font-family:tahoma; color:#333; height:30px; padding-top:15px} + +.login .regist_link{width:147px; height:16px; background-image:url(../images/main_box.png); background-position:-0px -92px; position:absolute; bottom:7px; left:87px; text-align:center; line-height:16px} +.login .regist_link a{color:#FFF; text-transform:uppercase; text-decoration:none; font-size:10px; font-weight:bold} + + +.login .login_link{width:54px; height:16px; background-image:url(../images/main_box.png); background-position:-152px -92px; position:absolute; bottom:7px; left:239px; text-align:center; line-height:16px} +.login .login_link a{color:#0099cc; text-transform:uppercase; text-decoration:none; font-size:10px; font-weight:bold} + + +/* TOP USERS */ +.top_bg { background: url(../images/simple_gradient.png) repeat-x bottom; min-height:81px; background-color:#fff; border:1px solid #85a8c8; margin:0px; padding:0px 2px; border-radius:5px;-moz-border-radius:5px;-webkit-border-radius:5px;-khtml-border-radius:5px } +.top_bg h2 { margin:5px 2px 8px; padding:0px; color:#21759b; font-size:18px; font-family:Tahoma; text-transform:uppercase; font-weight:bold; } +.top_user { background:url(../images/top_user.png) repeat-x; height:35px; border:1px solid #CCC; margin-bottom:15px; font-size:9px; padding:0px 8px; position:relative; background-color:#FFF; color:#666} +.top_user:hover{background-position:bottom} +.top_user a{font-size:12px; font-family:Arial, Helvetica, sans-serif; color:#333; text-decoration:none; font-weight:bold} +.top_user a:hover{color:#0099cc} +.avatar { width:30px; height:30px; padding:0px; margin:2px 5px 0px 20px; vertical-align:super; float:left; border:1px #ccc solid } +.top_user > .user_no { background:url(../images/blocks.png) -231px -56px no-repeat; width:19px; height:45px; position:absolute; top:-5px; left:5px; font-size:11px; color:#FFF; text-shadow:1px 1px 1px #6fa1b7; text-indent:4px; line-height:45px; } +.top_bg .utitle { margin-top:5px} +.top_bg .utitle a{display:block} + +/* FOOTER SEARCH */ +.search_footer { background:url(../images/search_footer.png) repeat-x; height:57px; margin:0px; padding:0px; clear:both; } +.advance { background:url(../images/blocks.png) left -123px no-repeat; width:33px; height:35px; text-indent:-9000px; float:left; margin:2px 6px 0px 0px; padding:0px; } +.foot_s_con form { margin:0px; padding:0px; display:inline; } +.foot_s_con input[type=text] { background:#fff; border:1px solid #CCC; width:280px; font-family:Verdana,Tahoma,Arial,sans-serif; color:#555; float:left; margin:0px 6px 0px 0px; padding:9px 12px; } +.foot_s_con input[type=text]:focus { border:1px solid #aaa; } +.foot_s_con input[type=submit] { background:url(../images/foot_search.png) top repeat-x; border:1px solid #555555; height:35px; padding:0px 18px; margin:1px 0px 0px; color:#FFF; font-family:Verdana,Tahoma,Arial,sans-serif; } +.foot_s_con input[type=submit]:hover { background:url(../images/foot_search.png) bottom repeat-x; border:1px solid #228bb3; cursor:pointer; } + +/* FOOTER */ +#footer { background:#333; padding:10px 0px; margin:0px; } +.footer_sp { background:url(../images/line_sps.png) bottom repeat-x; margin:12px 0px; padding:0px; clear:both; height:2px; } +.footer { padding:0px 8px; margin:5px 0px 0px; font-size:11px; color:#fff; font-weight:bold } +.footer ul { padding:0px; margin:0px; list-style:none; display:inline; float:right} +.footer ul li { margin:0px; margin-right:8px; padding:0px; float:left; list-style:none; border-left:1px solid #999; padding-left:9px} +.footer ul li:first-child{border-left:none} +.footer a { color:#eee; text-decoration:none; } +.footer a:hover { color:#06c; text-shadow:1px 1px 1px #000; } +.footer .footer_copyr{float:left; display:inherit} + +/* CHANGER LANGUAGE/TEMPLATE */ +.copyright { color:#fff; font-weight:bold; float:right; text-shadow:1px 1px 1px #555; font-size:10px; } +.changer { background:#0099cc; padding:0px 8px; margin:0px; position:relative; height:26px; line-height:24px; } +.changer select { font-size:11px; margin:4px 0px 0px; } +.ch_left { background:url(../images/blocks.png) -278px top no-repeat; width:9px; height:33px; margin:0px; padding:0px; position:absolute; left:-8px; top:0px; } +.ch_right { background:url(../images/blocks.png) -289px top no-repeat; width:9px; height:33px; position:absolute; right:-8px; top:0px; } +.ch_shadow { background:url(../images/shadows.png) top no-repeat; width:1000px; height:9px; margin:0px; padding:0px; } + +/* EXAMPLE ADS */ +.ads { background:#f3f3f3; width:300px; height:250px; text-align:center; line-height:250px; font-size:15px; border:1px solid #ccc; } +.ad { width:468px; height:60px; background:#f3f3f3; border:1px solid #ccc; margin:0px auto 25px; padding:0px; text-align:center; font-size:15px; } + + +/* My ACcount */ +.my_account_left{width:180px; float:left; } +.my_account_left ul{margin:0px; padding:0px; display:block;} +.my_account_left li{margin:0px; padding:0px; list-style:none; display:block; margin:5px; margin-left:0px} +.my_account_left .li{font-size:12px; font-weight:bold; display:block; margin-bottom:10px}.my_account_left .li .heading{ display:block; width:170px; background-image:url(../images/blocks.png); background-position:-0px -160px; background-repeat:no-repeat; height:20px; line-height:20px; padding-left:5px; color:#333; margin-left:5px; color:#fff; text-transform:none} +.my_account_left .li li{font-weight:normal; padding-left:5px; border-left:3px #ccc solid; margin-left:5px} +.my_account_left .li li:hover{border-left:3px #999 solid;} +.my_account_left .li a{display:block; text-decoration:none; font-family:tahoma; font-weight:bold; color:#333} +.my_account_left .li a:hover{color:#0066cc} +.account_box{float:right; width:780px;border-left:5px #999 solid; padding-left:10px; margin-right:10px} + +.account_option_box{display:block; width:200px; margin:10px; padding:10px;float:left; background-color:#EFF5F8; border-radius:5px; -moz-border-radius:5px;-webkit-border-radius:5px; height:150px;} +.account_option_box .its_title{font-size:13px; font-weight:bold;} +.account_option_box li{list-style:none; border-bottom:1px dotted #999; padding-bottom:2px; margin-bottom:2px} +.account_option_box ul{margin:0px; padding:0px; display:block; padding-left:15px} +.account_option_box a{text-decoration:none; font-size:14px} +.account_option_box a:hover{color:#009} + +.account_head_container{border-bottom:1px dotted #CCC; padding-bottom:10px} +.account_thumb{max-height:150px; max-width:150px;border:1px solid #999; padding:3px; display:inline-block;} +.account_thumb_container{margin-left:5px;display:inline-block; float:left; margin-right:10px} +.stats .account_stat{font-size:11px; font-family:tahoma; display:block;} +.stats{ width:300px; float:left} + +.account_head_right{float:right} +.pm_box{width:90px; height:70px; background-color:#EFF5F8; border-radius:5px; -moz-border-radius:5px;-webkit-border-radius:5px; display:block} +.pm_box .messages{font-size:10px; font-family:tahoma; font-weight:bold; text-transform:uppercase; color:#333; text-align:center; display:block; padding:6px} +.pm_box {text-align:center; font-size:25px; font-weight:bold} + + +.account_form fieldset{border:1px solid #ccc; border-radius:5px; -moz-border-radius:5px;-webkit-border-radius:5px; margin:10px} +.account_form legend{ text-transform:uppercase; font-family:Tahoma; font-weight:bold} +.account_form input, .account_form textarea, .account_form select{border:1px solid #ccc; width:300px; padding:3px;} +.account_form input[type="radio"],.account_form input[type="checkbox"] { display:inline; width:auto} +.account_form select{margin-bottom:10px} + +.account_field_block{ border-bottom:1px solid #CCC; margin:5px 0px 5px 0px; padding-bottom:0px; padding-top:5px} +.account_field_block:hover{background-color:#F5F5F5} +.account_field_block .account_field_label{width:200px; float:left} +.account_field_block .account_field{ float:left; width:400px; padding-left:10px; padding-bottom:10px} + +.avatar_bg label{margin-top:10px; display:block} + +.messages_container{max-height:200px; overflow:auto; padding-bottom:10px; border-bottom:1px dashed #999} + +.private_message_container{padding:10px; border-radius:5px; -webkit-border-radius:5px; -moz-border-radius:5px; border:1px solid #CCC; margin-top:15px; } + +.unread_msg, .unread_msg a{font-weight:bold; font-family:tahoma;} +.read_msg, .read_msg a{font-weight:normal; font-family:tahoma;} + +/** + my account + */ +.account_table{border:1px solid #c2c2c2; border-radius:5px;-moz-border-radius:5px;-webkit-border-radius:5px; background-image:url(../images/gradients.png); background-position:0px -36px; height:19px} +.account_table tr td{border-right:1px solid #c2c2c2; text-indent:10px; font-family:Tahoma; font-size:11px; text-transform:uppercase; font-weight:bold} +.account_table .last_td{border-right:0px} + +.account_vid_list{ margin:5px 0px 5px 0px;border-radius:5px;-moz-border-radius:5px;-webkit-border-radius:5px; } +.account_vid_list tr td{text-indent:10px; font-family:Tahoma; font-size:11px; text-transform:uppercase; font-weight:bold} +.account_vid_list .last_td{border-right:0px} +.acc_usr_video_thumb{border:1px solid #999; margin:1px; padding:1px; display:block; float:left; width:50px;} + +.search_field{background:url(../images/blocks.png); width:150px; height:22px; border:none; padding-left:8px; padding-top:6px; font-size:11px; font-family:tahoma; margin:0px; float:left; background-position:0px -180px} +.search_field_button{background:url(../images/blocks.png); width:25px; height:22px; border:0px; background-position:-160px -180px; padding:0px; margin:0px; text-indent:-50000000px; float:left; cursor:pointer; outline:none} + +/** + * icons */ +.arrow_pointing,.edit_icon,.delete_icon,.reply_icon{background-image:url(../images/icons.png); background-repeat:no-repeat; } +.reply_icon,.edit_icon,.delete_icon{height:15px; width:15px; } +.delete_icon{background-position:-0px -63px } +.edit_icon{background-position:-15px -63px } +.reply_icon{background-position:-30px -63px } + +.video_control{font-weight:normal; margin-left:10px; font-size:10px} +.arrow_pointing{background-position:-0px -78px; width:24px; height:14px;} + + + +/*** + BUTONS + ***/ + +.cbSubmitUpload,.cb_button,.cb_button_2,.small_button{background:url(../images/buttons.png)} + +.cbSubmitUpload,.cb_button,.cb_button_2{display:inline-block;height:31px; width:135px; color:#fff; line-height:31px; text-align:center; font-size:14px; font-weight:bold; border:none; font-family:Arial, Helvetica, sans-serif; cursor:pointer} +.cbSubmitUpload:hover,.cb_button:hover,.cb_button_2:hover{background-position:-0px -31px} +.cbSubmitUpload,.cb_button_2{font-size:12px} + +input[disabled].cbSubmitUpload{ background:#f2f2f2; cursor:default; color:#999; border:1px solid #ccc; font:normal 11px Tahoma;} + + + +.small_button{display:inline-block;height:21px; width:94px; color:#fff; text-align:center; font-size:11px; font-weight:bold; border:none; font-family:Arial, Helvetica, sans-serif; cursor:pointer; background-position:-0px -62px} +.small_button:hover{background-position:-0px -83px} +.non_button{line-height:21px} + +/** + * Categories + */ + +/*.category_list{display:block; width:180px; margin:0px 5px 5px 5px; float:left} + +.category_list .categories{padding:0px; background:#efefef;border-radius:5px;-moz-border-radius:5px;-webkit-border-radius:5px} +.categories ul{margin:0px; padding:0px} +.categories ul li{padding:0px; margin:0px; position:relative; } +.categories ul li{list-style:none; display:block; margin-bottom:6px;} +.categories ul li:last-child{border-bottom:none} +.categories .selected { background-color:#ccc; display:block;border-radius:5px;-moz-border-radius:5px;-webkit-border-radius:5px} +.categories ul a{font:bold 14px arial;color:#0066cc; text-decoration:none; display:block; padding:4px 15px; } +.categories ul.sub_categories { padding:0px; margin:0px 0px 0px 0px; background:white; } +.categories ul.sub_categories li { padding:1px; margin:0px; } +.categories ul.sub_categories li a { font:bold 11px Tahoma; }*/ + +.category_list { float:left; width:180px; margin:0px 5px 5px; } +.category_list .categories { background:#fff; overflow:visible; } +.categories ul, .categories li { padding:0px; list-style:none; overflow:visible; margin:0px} +.categories li { display:block; position:relative; padding:3px 0px} +.categories li a { display:block; font:bold 13px Arial; text-decoration:none; overflow:visible; color:#222} +.categories .selected, .categories ul.sub_categories .selected { color:#0066cc; } +.categories a:hover, .categories .selected > a, .categories ul.sub_categories .selected > a { color:#0066cc; } + +.categories ul.sub_categories { background:white; padding:0px 0px; border-bottom:1px solid #ddd; padding-left:5px} +ul.sub_categories ul.sub_categories{border:none} +.categories ul.sub_categories li { padding:3px 0px } +.categories ul.sub_categories a { font-size:12px; font-weight:normal; color:#333; padding-left:3px 5px} + +.categories ul.sub_categories ul.sub_categories a { padding:3px 10px; } + +.categories li:first-child.selected { -moz-border-radius:5px 5px 0 0; } +.categories li:last-child.selected { -moz-border-radius: 0 0 5px 5px } + +.categories ul.sub_categories li:first-child.selected { -moz-border-radius:0px; } +.categories ul.sub_categories li:last-child.selected { -moz-border-radius: 0px } + +.sort_cont,.cat_heading{border-bottom:3px #d4d4d4 solid; font-size:15px; font-weight:bold; font-family:Arial; display:block; padding-bottom:3px; margin-bottom:3px} +.time_cont{border-bottom:1px solid #CCC; margin-bottom:5px; padding:5px; font-size:10px} +.time_cont a{ font-size:10px; color:#666; text-decoration:none} +.time_cont .selected{font-weight:bold} + +.sort_cont ul{display:inline-block} +.sort_cont ul,.sort_cont ul li{margin:0px; padding:0px} +.sort_cont li{float:left; list-style:none; height:18px; line-height:18px;} +.sort_cont a{font-weight:bold; color:#000; padding:0px; margin:0px; height:15px; line-height:15px; text-decoration:none; display:block; padding:0px 5px; border-right:1px #CCC solid; margin-top:1px; color:#333} +.sort_cont li:last-child a{border:none} +.sort_cont .selected a, .sort_cont a:hover{color:#0066cc} +/** + * Ad Box + */ +.vert_add_box{display:block; width:180px; margin:0px 5px 5px 5px; float:left} + + + +/** + * Pagination Class + */ +.pagination +{ + height:23px; + width:99%; + margin:auto; + line-height:23px; + color:#000;font-weight:bold; font-size:12px; font-family:Arial, Helvetica, sans-serif; +} + + +.pagination a,.pagination .selected{ +-moz-border-radius:5px; +border-radius: 5px; +-webkit-border-radius: 5px; +display:inline-block; padding:0 3px; height:18px; line-height:18px; text-align:center; background-image:url(../images/nav_grads.png); background-position:-0px -223px; border:1px solid #CCC; text-decoration:none} + +.pagination .selected{ background-position:-0px -241px; color:#fff; border-color:#0066cc} + +/** + * Watch Video CSS + */ + +.vid_top_container{position:relative; margin-bottom:10px; padding-left:10px} +.hq_button_cont{position:absolute; left:620px; bottom:0px} +.watch_left{width:670px; float:left; padding:5px; padding-top:0px; } +.video_title{font-size:18px; font-weight:bold; font-family:arial} +.watch_right{width:310px; float:right; padding-left:5px; display:block} +.player_container{display:block; background-color:#ffffff; padding:8px} + +.video_actions_cont{margin-top:10px} + +.add_to_fav,.report_this,.share_this,.add_to_play,.photo_embed_code{height:20px; width:20px} +.add_to_fav{background-image:url(../images/icons/heart_small.png);} +.report_this{background-image:url(../images/icons/report_small.png);} +.share_this{background-image:url(../images/icons/share_small.png);} +.add_to_play{background-image:url(../images/icons/playlist_small.png); } +.photo_embed_code { background-image:url(../images/icons/embed_small.png);} + +.video_actions_cont .rating_container{ float:left} + +.video_actions_cont .actions{margin-top:10px; float:right} +.video_actions_cont .actions ul{margin-top:10px} +.video_actions_cont .actions ul, .video_actions_cont .actions ul li{margin:0px; padding:0px;} +.video_actions_cont .actions li{ display:block;list-style:none; height:20px; line-height:20px; display:block; float:left;} +.video_actions_cont .actions a{color:#333; font-weight:bold; font-size:14px; display:block; margin-right:18px; text-decoration:none} +.video_actions_cont .actions a:hover{text-decoration:underline} +.video_actions_cont .actions a img{margin-right:5px; float:left; border:none; } + +.watch_collect_item{margin:5px; margin-top:0px; border-bottom:1px solid #CCC; padding-bottom:5px} +.watch_collect_item a{font-size:12px; font-weight:bold; text-decoration:none} + +.playlist_item,.add_comment_box .input,.add_comment_box,.comment,.video_details,.form_container .form_result,.action_box{border-radius:10px;-moz-border-radius:10px;-khtml-border-radius:10px;-webkit-border-radius:10px; background-color:#F0F0F0; padding:10px} +.action_box{ margin:5px 0px;} +.action_box .action_box_title{color:#333; font-size:16px;font-weight:bold; text-transform:uppercase; font-family:arial; border-bottom:1px solid #CCC} +.form_container{border-top:1px solid #fff; padding-top:10px; font-size:11px} +.form_container .form_left{width:100%} +.form_container form{ margin:0px; padding:0px} +.form_container label{ display:block; font-size:11px; font-weight:bold; color:#333;margin-bottom:5px;} +.form_container label .example{font-weight:normal; } +.form_container .left_text_area{width:98%; border:1px #CCC solid; padding:3px; margin-bottom:5px} +.form_container .form_result{border:1px solid #0099cc; margin:5px; padding:5px;} +.action_box .error{color:#ed0000} +.action_box .msg{color:#0099cc} +.action_box .cancel a{font-size:10px; font-weight:bold; color:#333; text-decoration:none; } +.form_container select{border:1px solid #999; padding:2px; margin:5px} + +.ajaxMessages {border-radius:6px;-moz-border-radius:6px;-khtml-border-radius:6px;-webkit-border-radius:10px; background:url(../images/simple_gradient.png) bottom repeat-x; padding:6px; font:bold 11px Tahoma; margin-bottom:10px; } +.ajaxMessages.msg { color:#0099cc; border:1px solid #0099cc; } +.ajaxMessages.err { color:#ed0000; border:1px solid #ed0000; } + +.video_details{background:#fff url(../images/watch_video_details_bg.png) repeat-x bottom; border:1px solid #eee; margin-top:10px;} +.video_details .vd_user_container{margin-right:10px; float:left; width:120px;} +.video_details .vd_details{float:right; display:block; width:510px; z-index:10; font-size:11px; color:#333;} +.video_details .vd_stats{background-color:#333;border-radius:5px;-moz-border-radius:5px;-khtml-border-radius:5px;-webkit-border-radius:5px; padding:5px; margin-bottom:10px; color:#fff} + +.vd_stats{ overflow:hidden; } +.video_details .vd_stats ul{position:relative; left:50%; float:left;} +.video_details .vd_stats ul{margin:0px; padding:0px; list-style:none} +.vd_stats li{float:left;display:block;font-size:11px;margin-right:15px;position:relative;right:50%; font-family:tahoma;padding:0px; list-style:none} +.vd_details .uploading_detail{padding:5px; padding-left:0px;} +.vd_details .uploading_detail a,.vd_details .uploading_detail{font-size:14px; font-family:arial; color:#333; cursor:pointer; font-weight:bold; text-decoration:none} +.vd_details .uploading_detail a:hover,.vd_details .uploading_detail:hover{color:#09c} + +.vd_details .tags_cats{border-top:1px solid #ccc; padding:5px; margin-top:10px} +.tags_cats .tags{background-image:url(../images/tag_blue.png); background-repeat:no-repeat; line-height:15px; padding-left:20px} +.tags_cats .tags a{text-decoration:none; font-weight:bold; font-size:10px } +.tags_cats .category{margin-top:5px;font-weight:bold; font-size:11px}.tags_cats .category a{text-decoration:none; font-weight:bold; font-size:11px } +.vd_user_container .account_thumb{max-height:160px; max-width:120px;} +.vd_user_container ul{margin:0px; padding:0px; margin-bottom:5px} +.vd_user_container ul li{list-style:none; display:block; padding:0px; margin:0px} +.vd_user_container a{text-decoration:none; font-size:11px; color:#333} +.vd_user_container a:hover{color:#0099cc} + +.comment{ background:#fff url(../images/watch_video_details_bg.png) repeat-x; background-position:bottom; min-height:60px; padding:5px; border:1px solid #eee; font-family:tahoma; font-size:11px; margin-bottom:10px; } +.comment .user_com_thumb{ float:inherit; max-width:60px; max-height:80px; border:2px solid #fff; margin:0px;} +.comment .user_com_thumb_con{ float:left; margin:0px; } +.comment .comm_other{float:right; width:89.5%; } +.comment .user_bar{background:url(../images/nav_grads.png) 0px -240px repeat-x; height:18px; line-height:18px; padding:0px 5px 0px 5px; width:auto; } +.comment .user_bar, .comment .user_bar a{color:#fff; font-size:11px; text-decoration:none;} +.comment .comment_cont{float:left; width:515px; padding:3px;} +.comment .comment_rating_cont{ float:right; width:45px; margin-top:10px} +.comment .comment_rating_cont .comment_rating{font-size:16px; font-weight:bold;font-family:arial; text-align:center; display:block} +.comment .thumb_down{background:url(../images/up_down.png) ; width:19px; height:16px; display:inline-block; text-indent:-50000px; margin-right:0px; cursor:pointer; background-position:-21px 1px} +.comment .thumb_down:hover{background-position:-21px -16px} +.topic_comments .comment .comm_other{float:right; width:93%; } +.topic_comments .comment .comment_cont{ width:auto; max-width:835px; } + +.add_comment_result .error{color:#ed0000; padding:3px; border:1px solid #ed0000; margin:3px 0px} +.no_comments{ display:block; padding:5px; font-size:13px; font-weight:bold; margin:5px; border:1px solid #8F8059; background-color:#FFF6DF } +h2.commentHead{ padding-left:30px; background-image:url(../images/icons/comments_small.png); background-repeat:no-repeat; margin-bottom:0px; padding-bottom:5px} + +.comment .thumb_up{background:url(../images/up_down.png) ; width:19px; height:16px; display:inline-block; text-indent:-50000px; margin-right:0px; cursor:pointer;background-position:-0px 1px} +.comment .thumb_up:hover{background-position:-0px -16px} +.desc_cont{} +.upper_quote{background-image:url(../images/icons.png); background-position:0px -125px; height:32px; width:34px; display:inline-block; } +.lower_quote{background-image:url(../images/icons.png); background-position:0px -161px; height:32px; width:34px; display:inline-block; } + +.add_comment_box{background-color:#f0f0f0} +.add_comment_box .input{ border:1px solid #CCC; background-image:url(../images/watch_video_details_bg.png); background-position:10px; padding:5px; width:400px; background-repeat:repeat-x} + +#collectionComments .comment .comm_other{width:86%; } + +.cb_warning,.cb_error,.cb_message{border-radius:10px;-moz-border-radius:10px;-khtml-border-radius:10px;-webkit-border-radius:10px; padding:5px; border:1px #0099cc solid; margin:5px;background-image:url(../images/watch_video_details_bg.png); background-position:10px} +.cb_warning ul,.cb_error ul,.cb_message ul{display:block; margin:0px; padding:0px; padding-left:10px;} +.cb_warning ul li,.cb_error ul li,.cb_message ul li{border-left:3px solid #ccc; list-style:none; padding-left:10px; cursor:pointer} +.cb_error ul li{ color:#ed0000} +.cb_message ul li{ color:#0099cc} +.cb_warning ul li {color:#0066cc;border-left:none} +.cb_error ul li:hover{border-color:#ed0000} +.cb_message ul li:hover{border-color:#0099cc} + +.watch_video_box{width:90px; margin:2px 4px 0px 4px; float:left; height:110px; overflow:hidden} +.watch_video_box{ color:#999; font-size:10px;} +.watch_video_box a{font-size:10px; text-decoration:none; font-weight:bold;} +.watch_video_box .watch_video_box_thumb{border:1px solid #999; padding:2px; display:inline-block; margin:auto; position:relative} +.watch_video_box_thumb .duration{background-color:#333; color:#fff; font-size:8px; padding:1px; position:absolute; right:2px; bottom:2px} + +.watch_vids_head,.watch_vids_head_closed{background-image:url(../images/watch_video_bars.png); width:270px; height:26px; background-repeat:no-repeat; display:block; padding-left:30px; line-height:26px; color:#fff; font-size:14px; color:#fff; font-weight:bold; margin-top:10px; cursor:pointer;background-position:0px -26px;} +.watch_vids_head_closed{ background-position:0px -0px; color:#0099cc} + +.watch_vids_cont{width:300px; overflow:hidden; padding-bottom:10px; margin-bottom:10px; border-bottom:1px solid #CCC; padding-top:10px} + +.playlist_item{padding:5px; margin:3px 0px 3px 0px; height:30px;} +.playlist_item .pl_num{ width:25px; text-align:center; float:left; line-height:30px; height:30px;font-size:10px; color:#666} +.playlist_item .pl_thumb{width:45px; height:27px; border:2px solid #999;float:left; margin-right:5px } +.playlist_item .pl_details{font-size:10px; width:160px; float:left; cursor:pointer} +.playlist_item .pl_details a{font-size:10px; color:#0099cc; text-decoration:none; font-weight:bold} +.playlist_item .pl_duration{font-size:10px; color:#666; float:left} +.playlist_item .pl_delete{font-size:10px; color:#666;float:right} + + +.videosharing{width:280px;} +.videosharing input{border:1px solid #999; color:#999; font-size:10px} + +.user_block_small{width:70px; height:80px; margin:3px; float:left; padding:5px; font-size:10px; border:1px solid #CCC} +.user_block_small a{font-size:11px; font-weight:bold} +.user_mid_thumb{width:60px; height:60px;display:inline; border:1px solid #999; padding:2px;} + +/** UPLOAD CSS **/ +.upload_left{width:675px; float:left; padding:0px 5px} +.upload_opt,.upload_left .upload_info{ background:#fff url(../images/simple_gradient.png) repeat-x bottom;border-radius:5px;-moz-border-radius:5px;-webkit-border-radius:5px; padding:5px; border:1px solid #ccc;} +.upload_right{width:300px; float:right; margin-right:10px} +.upload_right .instructions{background:#fff url(../images/simple_gradient.png) repeat-x bottom; border-radius:5px;-moz-border-radius:5px;-webkit-border-radius:5px; padding:5px; border:1px solid #f0f0f0; } + + +.upload_form{padding:0px; margin:0px;} +.upload_form fieldset{padding:5px; border:none; } +.upload_form fieldset .form_head{display:block; background-color:#0099cc; padding:3px; color:#fff; font-size:13px; font-weight:bold; font-family:Arial, Helvetica, sans-serif; margin-bottom:10px} + +.upload_form .label{cursor:pointer; display:block; font-size:14px; text-transform:uppercase; font-family:Arial, Helvetica, sans-serif; font-weight:bold; margin-bottom:2px} +.upload_form input[type=text],.upload_form input[type=textfield],.upload_form textarea{border:1px solid #999; width:400px; resize:auto; } +.upload_form .field{margin-bottom:10px} +.upload_form .hint{font-size:11px} +.upload_form label{cursor:pointer} + +.more_button,.more_button_up {display:block; border-bottom:1px #CCC solid; border-top:1px #CCC solid; color:#999; background:#fff url(../images/nav_grads.png) no-repeat right -441px; padding:2px; height:13px } +.more_button_up{ background-position:right -458px} +.more_button_up a,.more_button a{color:#333; text-decoration:none; font-weight:bold; font-family:Arial, Helvetica, sans-serif;font-size:11px; display:block}.more_button_up a,.more_button a:hover{color:#0099cc} + +ul.upload_opts { list-style:none; margin:0px; padding:0px; } +ul.upload_opts li { padding:8px; margin:0px 10px; top:1px; position:relative; border:1px solid transparent; } +ul.upload_opts li:hover { color:#0099cc; cursor:pointer; } +ul.upload_opts li.selected { cursor:pointer; background:none; border:1px solid; border-color:#bbb #ccc #fff; color:#0099cc; -moz-border-radius:5px 5px 0px 0px; -webkit-border-top-left-radius:5px; -webkit-border-top-right-radius:5px; border-radius:5px 5px 0px 0px; } +.upload_opt{ margin-bottom:10px } +.upload_opt_head{ font-size:14px; font-weight:bold; font-family:Arial, Helvetica, sans-serif; } +.swfupload{margin:0px; margin-bottom:-5px} + +.upload_form_div{ margin:3px; border:1px solid #EAEAEA; background:#FFF; padding:4px; } +.progressWrapper { padding:8px; background:#d6f1ff; border:1px solid #0099ff; margin-top:5px;} +.progressBarStatus { padding:2px; font-size:10px; font-weight:bold; } +.divStatus{font-weight:bold; } + +.upload_link_button ul{margin:0px; padding:0px; display:block; padding:4px; margin-top:10px} +.upload_link_button ul li{list-style:none; float:left; display:block; margin-right:10px} +.upload_link_button a{text-decoration:none} + +/** SIGNUP CSS **/ +.signup_left{width:480px; float:left; padding:5px; padding-left:15px} +.signup_right{width:480px; float:right;padding:5px; padding-right:15px} +.signup_container{background:#FFF url(../images/simple_gradient.png) repeat-x bottom;border-radius:5px;-moz-border-radius:5px;-webkit-border-radius:5px; padding:5px; border:1px solid #f0f0f0;} +.signup_container .label{ width:170px; float:left; text-align:right; margin-right:5px} +.signup_container .input_container{float:left; width:220px; margin-bottom:5px} +.signup_container input[type=textfield],.signup_container input[type=text],.signup_container input[type=password]{width:220px; border:1px solid #999;} +.signup_container .hint{display:block; font-size:11px} + + +/** + * Channel and user + */ +.user_block{ display:block; width:120px; height:180px; float:left; margin:10px; font-size:10px} +.user_block_med{display:block; width:80px; height:130px; float:left; margin:0px 10px 10px 0px; font-size:10px} +.user_block .thumb_container,.user_block_med .thumb_container_medium{ width:120px; height:120px; overflow:hidden; border:1px solid #99ccff; padding:1px; display:inline-table; vertical-align:middle}.user_block_med .thumb_container_medium{width:80px; height:80px} +.user_thumb_normal{width:120px; height:120px} +.user_thumb_medium{width:80px; height:80px} +.prof_title a{font-weight:bold; text-decoration:none} + + + +/** + * QUCKLIST ICON + */ +.cross_icon,.check_icon,.add_icon{background-image:url(../images/icons/quicklist_small.png); height:14px; width:14px; background-repeat:no-repeat; cursor:pointer;position:absolute; left:2px; bottom:2px;} +.check_icon{background-image:url(../images/icons/quicklist_check_small.png); } +.cross_icon{ background-image:url(../images/icons/cross.png);position:relative; z-index:10} +.private_video{background-image:url(../images/private.png); width:110px; height:66px;position:absolute; top:2px; left:2px; border:0px} +.quicklist_box{bottom:0px; right:0px; padding:5px; background-color:#333; width:300px; color:#fff; position:fixed; z-index:1000; border-radius:5px 5px 0px 0px;-moz-border-radius:5px 5px 0px 0px;-webkit-border-radius:5px 5px 0px 0px} +.my_quicklist{max-height:325px; overflow:auto; padding-right:8px} +.quicklist_box_head{background-image:url(../images/simple_gradient.png); background-position:bottom; height:20px;border-radius:5px;-moz-border-radius:5px;-webkit-border-radius:5px; padding:5px; line-height:20px; color:#333; font-size:11px; font-weight:bold} +.quicklist_box_head a{color:#0099cc; font-size:11px; font-weight:bold; text-decoration:none} + +/** HQ BUTTONS **/ +.hq_button_sel,.hq_button{background-image:url(../images/hq.png); width:49px; height:26px; background-position:top} +.hq_button_sel{background-position:bottom} + + +.simple_container{background:#fff url(../images/simple_gradient.png) bottom repeat-x; border:1px solid #999;border-radius:5px;-webkit-border-radius:5px;-moz-border-radius:5px; padding:5px; margin:5px} + +.cbform .label{width:150px; float:left; display:block; text-align:right; margin-right:10px} +.cbform input[type=textfield],.cbform input[type=text]{border:1px solid #999; margin:0px; width:200px; float:left; margin-bottom:6px; height:23px; line-height:23px; padding-top:0px; padding-bottom:0px;} + +.h2_inner_link,.h2_inner_link a{font-size:13px; font-family:Georgia, "Times New Roman", Times, serif; font-style:italic; text-decoration:none; color:#0099cc} + + + + +/** + * Groups CSS + */ +.group_view{width:980px; margin:auto;} +.group_top_cont{background:#FFF url(../images/simple_gradient.png) repeat-x bottom; border:1px solid #f0f0f0; padding:5px;border-radius:5px; -moz-border-radius:5px; -webkit-border-radius:5px;} +.grp_left_column{float:left; width:150px; padding-right:10px} +.grp_right_column{float:right; width:800px;} +.group_thumb_cont{ margin:auto} +.group_thumb_cont img{border:#99ccff 2px solid;} +.group_title{display:block; background-color:#333; color:#fff;border-radius:5px; -moz-border-radius:5px; -webkit-border-radius:5px; padding:5px; font-size:14px; font-weight:bold; font-family:tahoma; margin-bottom:10px; padding-bottom:0px} + +.group_details{} +.group_option_container{} +.group_option_container ul{margin:0px; padding:0px} +.group_option_container .grp_opt_title{background-color:#0066cc; color:#fff; display:block; padding:4px; margin-top:5px} +.group_option_container ul li{list-style:none;} +.group_detail_tabs{} +.group_detail_tabs ul{padding:0px; margin:10px 0px 0px 0px;} +.group_detail_tabs ul li{float:left; display:inline-block; padding:2px 5px; list-style:none; text-align:center; margin:0px 5px; border-bottom:none; cursor:pointer; font-size:16px; font-weight:bold; font-family:Arial, Helvetica, sans-serif} +.group_detail_tabs ul .selected{color:#09c; background:#fff} + +.grp_info .info_cont{margin-bottom:10px} +.grp_info .info_title{border-bottom:1px solid #abc0c7; height:10px; margin-bottom:10px} +.grp_info .info_title span{line-height:20px; font-family:Tahoma; color:#333; font-weight:bold; background-color:#FFF; padding-right:8px; display:inline} +.info_cont span{display:block; margin-bottom:5px; cursor:pointer} +.info_cont span:hover{color:#06c} +.info_cont span span:first-child{width:100px; float:left; color:#666} +.info_cont span span:last-child{width:500px; float:left; color:#333} +.info_cont span .grp_url{border:1px solid #999; padding:0px; color:#999; width:300px} + +.group_info span{display:block} + +.topic_table_head{background:#FFF url(../images/simple_gradient.png) repeat-x bottom; border:1px solid #f0f0f0; font-weight:bold} +.topic_table td, .topic_table_head td{padding:4px 2px; color:#333; font-family:Tahoma;} +.topic_table:nth-child(2n+1){background-color:#f7f7f7} + +.topic_title{font-weight:bold; display:block; font-family:Tahoma, Geneva, sans-serif; border-bottom:1px solid #aaa; font-size:13px; padding-bottom:5px; margin-bottom:5px;} +.topic_title a{font-weight:bold; display:block; color:#333; text-decoration:none} +.topic_title a:hover{color:#06c} + +.add_topic{padding:5px; height:18px; line-height:16px; display:inline-block; border-radius:3px; -moz-border-radius:3px; -webkit-border-radius:3px; background-color:#E6F0FF; margin-bottom:5px; cursor:pointer;font-weight:bold;} +.add_topic:hover{color:#06c} +.add_topic img{display:inline; float:left; margin-right:5px 0px; } + +.add_topic_container{margin:auto;background:#FFF url(../images/simple_gradient.png) repeat-x bottom; border:1px solid #ccc; padding:5px; margin-bottom:10px} + +.topic_form .label{ display:block; font-size:12px; font-weight:bold; font-family:tahoma} +.topic_form input[type=text],.topic_form textarea,.topic_form input[type=select]{border:1px solid #999; padding:3px; margin-bottom:10px} +.topic_icon_cont{padding:3px} +.topic_icon_cont fieldset{margin:0px; border:1px solid #999;border-radius:5px; -moz-border-radius:5px; -webkit-border-radius:5px;} +.topic_icon_cont label{display:block; width:70px; text-align:center; float:left; margin-bottom:5px} + +.topic_container{margin-top:10px} +.topic_detail_cont{float:right; width:890px} +.topic_detail_cont .topic_title{font-size:14px; font-weight:bold; line-height:32px; border-bottom:1px solid #dedcdc} +.topic_detail_cont .topic_title img{ margin-right:10px} +.topic_detail_cont .topic_title .date{font-size:11px; font-weight:normal; color:#999} + +.topic_post{ border-bottom:1px dashed #b9b9b9 ; padding-bottom:5px; margin-bottom:5px} +.topic_post .topic_post_user{float:left; width:75px} +.topic_post .topic_post_cont{float:left} +.topic_post:last-child{border-bottom:none} +.topic_post .topic_poster{display:block; color:#999} +.topic_post .topic_poster a{font-weight:bold; font-family:tahoma; text-decoration:none} +.topic_content { font:normal 11px Tahoma; color:#464646; } + +.manage_contacts_tbl_head{border:1px solid #c2c2c2; border-radius:5px;-moz-border-radius:5px;-webkit-border-radius:5px; background-image:url(../images/gradients.png); background-position:0px -36px; height:19px} + +.manage_contacts_tbl{border-bottom:1px solid #999;} +.manage_contacts_tbl:nth-child(2n+1){background-color:#F5F5F5} + +.manage_contacts_tbl_head td{ padding-left:3px; font-weight:bold} +.manage_contacts_tbl_head td:nth-child(2),.manage_contacts_tbl_head td:nth-child(3){border-right:1px solid #c2c2c2;} +.manage_contacts_tbl_head td:last-child{border-right:none} + +.manage_contacts_tbl td{padding-left:3px; } + + +.grp_manage_links li, .cb_fb_style_button{background:url(../images/nav_grads.png) -0px -223px repeat-x; height:18px; line-height:18px; display:inline-block; padding:0px 5px; border:1px solid #999} +.grp_manage_links li a,.cb_fb_style_button,.cb_fb_style_button a{ color:#333;font-weight:bold; font-family:tahoma; font-size:11px; text-decoration:none} +.cb_pending{color:#333; font-style:italic; } + +.grp_manage_links li{border-right:none} +.grp_manage_links li:last-child{border-right:1px solid #999} + +.grp_manage_links ul{display:inline-block; float:right; padding:0px; margin:0x;} +.grp_manage_links li{float:left;} + + +/** + * Groups Block + */ +.group_block{float:left; width:45%; height:80px; margin:0px 20px 10px 0px; padding:5px} +.group_block:hover{background-color:#EEE} +.group_block:nth-child(2n){margin-right:0px; margin-left:15px} +.group_block .group_thumb{max-width:110px; max-height:80px; border:1px solid #333; padding:1px; display:block; float:left; margin-right:10px} +.group_block,.group_block a{font-size:10px; font-family:tahoma } +.group_block span{display:block;} +.group_block .group_name,.group_block .group_name a{font-size:12px; text-decoration:none} + +.search_type{display:block; float:left; width:31%; border-right:1px dotted #0099cc; padding-right:10px; margin-right:10px; height:100%; overflow:visible; position:relative} +.search_type:nth-child(3){border-right:none; margin-right:0px} +.search_type .label{display:block; font-size:11px; font:tahoma; font-weight:bold} +.search_type div{margin-bottom:10px} +.search_type input[type='textfied'],.search_type input[type='text'],.search_type select{width:200px; border:1px solid #999} + +.quick_search .title{font-size:15px; font-weight:bold} +.quick_search input[type=text],.quick_search select{width:200px; border:1px solid #939393; font-size:11px; padding:2px} + + + +.admin_bar{background-color:#1E1E1E; padding:5px; color:#fff; z-index:3000; position:relative; } +.admin_bar a{color:#53baff; font-weight:bold; text-decoration:none} + +.lang_selector{width:130px; border:none; padding:1px;} + +.spam{color:#999; font-family:verdana; font-size:11px; font-weight:bold; border-top:1px solid #999; border-bottom:1px solid #999; padding:2px 0px; margin:5px 0px 10px 0px} + +.contact_form label{font-size:16px; font-weight:bold; font-family:Arial, Helvetica, sans-serif; color:#333; display:inline-block; width:150px; text-align:right; vertical-align:top; padding-right:15px} +.contact_form input[type=text],.contact_form textarea{border:1px solid #999; padding:2px; font-size:14px; width:300px} + +.subsription a{text-decoration:none; font-size:14px; font-family:Arial, Helvetica, sans-serif; display:block; border-bottom:1px solid #CCC; padding-bottom:5px; margin-bottom:5px; color:#06c; font-weight:bold} + + +.remote_main_bar +{ + width:100%; + height:20px; + background-image:url(../images/uploading_bar.png); + border-width:0px 1px 0px 1px; border-color:#dedede; border-style:solid; +} +#rempteUploadFormDiv{padding-right:10px;} +.remote_prog_bar +{ + height:20px; + background-image:url(../images/uploading_bar.png); + background-position:-0px -20px; + text-align:center; + font:normal 13px "Arial Black", Gadget, sans-serif; + color:#fff; + line-height:20px; + width:0px +} + +.remoteDownloadStatus{ font-weight:bold; display:none } +#remote_upload_div .remoteUrlInput {width:100%; border-style:solid; border-color:#dedede; border-width:1px 1px 0px 1px; height:20px; color:#999999 } + +/* COLLECTION */ +.collect_grid { position:relative; } +.obj_title { width:110px; display:inline-block; } +.obj_title a { text-decoration:none; } + +.collectionTable { border-collapse:collapse; border-spacing:0px; width:100%; } +#collectionItemsList { } +.collectItemBox { vertical-align:middle; width:19%; display:inline-block; text-align:center; padding:10px 2px; } +a.CollectThumb { border:1px solid #ccc; display:inline-block; background:#FFF; } +.collect_grid img { display:block; margin:3px; } + +/* PHOTOS */ +.photoBox { background:url(../images/simple_gradient.png) repeat-x bottom; border:1px solid #ccc; margin-bottom:10px; border-radius:4px; -webkit-border-radius:4px; -moz-border-radius:4px; } +.photoBox .OptionalSettings { background:#f3f3f3; border:solid #ccc; border-width:1px 0px 0px; display:block;} +.photoBox .Heading a { padding:5px; display:block; border-bottom:1px solid #ccc; font:bold 11px Tahoma; text-decoration:none; } +.photoDetailsBox { padding:5px; } +.photoDetailsBox .field { margin-bottom:5px; } +.photoDetailsBox .field .label { font:bold 11px Tahoma; padding-top:6px; width:125px; display:inline-block; } +.photoDetailsBox input[type=text], .photoDetailsBox textarea, .photoDetailsBox select { font:normal 11px Tahoma; padding:4px; width:200px; } +.photoDetailsBox textarea { width:202px; height:50px; } +.photoDetailsBox select { width:212px; } +.photoDetailsBox .hint { color:#666; font:normal 10px Tahoma; float:right; } +.photoThumbBox { padding:1px; background:#FFF; border:1px solid #aaa; } +.OptionalBox { padding:5px; } +.PhotoHeading { margin:5px 0px; padding-bottom:5px; border-bottom:1px solid #ccc; font:bold 11px Tahoma; } +.PhotoHeading.hover:hover { cursor:pointer; } +.relatedPhotos { clear:both; margin-bottom:10px; } +.photoTitle { font:bold 11px Tahoma; } +.photoTitle a { text-decoration:none; } +.photoInfo { font:normal 10px Tahoma; color:#666; } +.photo_block { padding:0; width:114px; display:inline-block; vertical-align:middle; margin:0 10px 12px 0; *display:inline; } + +/* VIEW ITEM */ +.borderLine { border-bottom:1px solid #ccc; padding:5px 0px 0px; margin:0 0 5px; } +.NextPrevButtons { width:100%; margin-bottom:5px; } +.NextPrevButtons li { list-style:none; width:49%; } +.NextPrevButtons li a { font:bold 11px Tahoma, Geneva, sans-serif; text-decoration:none; } +.NextPrevButtons li a { display:block; text-align:center; padding:8px 0px; border:1px solid #ccc; background:url(../images/simple_gradient.png) repeat-x bottom; color:#000;} +.NextPrevButtons li a:hover { color:#FFF; background:#EEE url(../images/nav_grads.png) left top repeat-x; border:1px solid #053a5c } + +.LoadMoreButton { font:bold 11px Tahoma, Geneva, sans-serif; background:url(../images/simple_gradient.png) repeat-x bottom; border:1px solid #ccc; padding:6px; margin-top:5px; -moz-border-radius:4px; -webkit-border-radius:4px; border-radius:4px; } +.LoadMoreButton:hover { color:#FFF; background:#115582 url(../images/nav_grads.png) left top repeat-x; border:1px solid #053a5c; cursor:pointer; } +.LoadMoreButton:active { background:#115582; } +.LoadMoreButton[disabled], .LoadMoreButton[disabled]:hover, .LoadMoreButton[disabled]:active { background:#EEE; border:1px solid #ccc; cursor:default; color:#7b7b7b; } + +.CollectionResult { background:#FFF url(../images/simple_gradient.png) bottom repeat-x; border:1px solid #aaa; margin:8px 8px 0px; padding:5px; font:bold 11px Tahoma; color:#666; -moz-border-radius:5px; -webkit-border-radius:5px; border-radius:5px; } + +.CollectionResult .error { color:#ed0000; } +.CollectionResult .msg { color:#0099cc; } + +.PhotoRatingStats { list-style:none; float:left; margin-right: 15px; } + +.collectionComments input[type=text], .collectionComments textarea.input { width:95% } +.CollectionResult .msg { color:#0099cc; } + +.uploadErrorDiv, .uploadSuccessDiv{padding:2px 5px 5px 20px; background:url(../images/ok.png) no-repeat 0px 0px;} +.uploadErrorMsg, .uploadSuccessMsg{font-size:14px; font-weight:bold; color:#7fa534; display:inline-block;height:15px; vertical-align:middle} +.uploadErrorDiv{ background:url(../images/error.png) no-repeat 0px 0px;} +.uploadErrorMsg{color:#ed0000} + +.PhotoUploaderWrapper { border:1px solid #CCC; width:100%; background-color:#EEE; display:inline-block; padding:15px 0px; text-align:center; } + + +.updatedUpload { float:right; background:url(../images/upload_bg.png) top repeat-x; position:relative; top:-1px; height:25px; padding:0px 8px; border:solid #090909; margin:0 0px 0 0; border-width:0 1px 1px; display:block; text-decoration:none; text-align:center; color:#555; line-height:25px; overflow:visible; -moz-border-radius-bottomleft:5px; -webkit-border-bottom-left-radius:5px; z-index:1000; } +.updatedUpload a { display:inline-block; color:#fff; text-decoration:none; font-weight:bold; margin:0px 5px } +.updatedUpload a:hover{color:#53baff} + +#selectedSearch { position:relative; width:82px; margin:0px; padding:9px 0 5px 0px; text-align:center; font:bold 11px Tahoma; overflow:hidden; color:#000; } +#selectedSearch:hover { cursor:pointer; } +#searchSelectWrapper { padding:0px; margin:0px; position:relative; display:none;} +#searchSelectWrapper ul { position:absolute; background:#EEE; width:104%; top:1px; text-align:center; list-style:none; z-index:999999; padding:0px; margin:0px; border:1px solid #ccc; border-top:0px none; left:-1px; } +#searchSelectWrapper ul li { padding:5px 0px; list-style:none; margin:0px; color:#000; display:block; float:none; border:0px none; position:relative; border:1px solid transparent; margin:0 -1px -1px -1px; } +#searchSelectWrapper ul li a { margin:0px; font:normal 11px Tahoma; color:#000; text-transform:none; display:block; } +#searchSelectWrapper ul li:hover, #searchSelectWrapper ul li.selected { background:#333; border-color:#000; } +#searchSelectWrapper ul li:hover a, #searchSelectWrapper ul li.selected a { color:#FFF; } + +.CategoryToggler { position:absolute; width:14px; height:14px; right:1px; top:4px; } +.CategoryToggler:hover { cursor:pointer; } +.CategoryToggler.none { background:url(../images/down.png) } +.CategoryToggler.block { background:url(../images/up.png) } + +.channelFeatureBox { padding:6px 0px; } +.itemListing { display:inline-block; margin:0px; padding:0px; width:152px; overflow:hidden; min-height:250px; } +.listHeading { font:bold 11px Tahoma; text-align:center; padding:4px 0px; color:#464646; border-top:1px solid #ccc; margin-bottom:-1px; background:#f3f3f3} +.itemBox { padding:4px 0px; border:solid transparent; border-width:1px; margin:0 0 0px 0; } +.itemBox:hover { cursor:pointer; background:#f3f3f3; border-color:#ccc; } +.itemBox.selected { background:#006fb7; border-color:#053a5c; -moz-box-shadow: 0 0 4px 0px #000; -webkit-box-shadow: 0 0 4px 0px #000; box-shadow: 0 0 4px 0px #000; } +.viewItemBox { display:inline-block; *display:inline; margin:0px; padding:0px;width:375px; } +.viewingArea { padding:0px 15px; } +.itemTitle { text-align:center; font:bold 11px Tahoma; text-transform:uppercase; } + +.channelBox { padding:10px 6px; border-bottom:1px solid #ccc; } +.channelHeading { font:bold 14px Arial; margin-bottom:4px; } + +.carouselButton, .channelBar { border:solid #ccc; border-width:1px; width:100%; margin:0px 0px 0px 0px; font:bold 11px Tahoma; text-align:center; padding:2px 0px; background:url(../images/simple_gradient.png) repeat-x bottom; } + +.carouselButton:hover { background:#115582 url(../images/nav_grads.png) left top repeat-x; color:#FFF; border-color:#053a5c; cursor:pointer; } +.carouselButton:active { background:#0470b7; outline:none; } + +.channelBar { border-width:0 0 1px; margin:0 0 10px; width:100%; padding:0px; } +.channelBar li { float:left; list-style:none; display:block; } +.channelBar li a { font-weight:normal; padding:6px 10px; display:block; border-right:1px solid #ccc; border-left:1px solid #FFF; text-decoration:none; } +.channelBar li a.selected { font-weight:bold; } +.channelFieldset { border:0px none; padding-left:0px; padding-right:0px; } +.channelLegend { padding:4px 6px; background:#eee; font:bold 11px Tahoma; color:#464646; margin-bottom:5px; width:98%; border-top:1px solid #aaa; cursor:default; } +.channelRow { margin-bottom:10px; padding:0px 6px; } +.channelLabel { display:inline-block; width:18%; font:bold 11px Tahoma; color:#888; vertical-align:top; text-transform:capitalize; } +.channelDetail { display:inline-block; font:normal 11px Tahoma; width:80%; } +.channelInnerPadding { padding:0px 6px; } +.moreThings { clear:both; display:block; font:bold 11px Arial; margin-top:3px; } + +.watchMainWindow{border:#001853; background-color:#0066cc; font-weight:bold; padding:3px; margin-top:5px} +.watchMainWindow a{color:#fff; text-decoration:none; font-weight:bold} +.watchMainWindow a:hover{text-decoration:underline} + +/** + * View Channel + */ + + +.channel_action_links{display:block; text-align:left; margin:0px; padding:0px;line-height:normal} +.channel_action_links a{ line-height:normal; text-decoration:none; font-weight:bold; font-size:11px; font-family:tahoma } +.channel_action_links li{list-style:none;line-height:normal; margin:1px 0px} + +.viewChannelProfileThumb{background-color:#eaeaea; margin-bottom:2px; padding:5px} +.channelHeading a{text-decoration:none} +.viewChannelProfileThumb_outline{border:1px solid #eaeaea; padding:3px} + +.accntSettingHeadarrowup, .accntSettingHead{font-size:14px; font-weight:bold; background:url(../images/down.png) right no-repeat; display:block; margin:5px auto; padding:5px} +.accntSettingHeadarrowup{background-image:url(../images/up.png); !important} +.accntSettingHead:hover{background-color:#ECF8FD; cursor:pointer} + +.accountForm legend{background: #EEEEEE;border-top: 1px solid #AAAAAA; color: #464646; font: bold 11px Tahoma; padding: 4px 6px; width: 98%;} +.accountForm fieldset{border:none; !important} + +.channel_title{font-size:13px; font-weight:bold; margin-bottom:3px} +.channelCounts{font-size:16px; font-weight:bold; text-align:center;} +.channelBox{padding:0px 5px 5px 5px; background-color:#fff} + +/* NEW GROUP LAYOUT */ +.groupLeftSide { width:160px; float:left; padding:0 0px; } +.groupLeftSide .channelLegend, .groupContent .channelLegend, .groupRightSide .channelLegend { width:auto; } +.groupContent { width:588px; float:left; padding:0 0px; border:solid #aaa; border-width:0 1px; min-height:500px; height:500px; height:auto !important; } +.groupRightSide { width:250px; float:right; padding:0px 0px; } +.groupThumb { padding:0px 0px; margin-bottom:9px;} +.groupThumbBG { display:inline-block;padding:2px; background:#FFF; border:1px solid #ccc; margin:0px auto; } +.groupDropShadow { -moz-box-shadow:0 1px 0 rgba(0,0,0,0.1); -webkit-box-shadow:0 1px 0 rgba(0,0,0,0.1); box-shadow:0 1px 0 rgba(0,0,0,0.1); } +.groupTitle { background:#F0F2F7; border:solid #aaa; border-width:1px 0px; padding:8px; font:bold 14px Arial; } +.groupSep { background:#f3f3f3; text-align:center; margin-bottom:8px; } +.SepText { font:bold 11px 'Tahoma', Geneva, sans-serif; color:#787878; background:white; padding:3px 5px; text-transform:uppercase } +.groupsBar { margin:0px; padding:0px; list-style:none; padding:8px 0px; border-bottom:1px solid #ccc; margin-bottom:10px; } +.groupsBar li { font:bold 11px Tahoma; text-decoration:none; display:inline-block; margin-right:10px; margin-left:10px; } +.groupsBar li a { color:#00769d; text-decoration:none; vertical-align:middle; } +.groupsBar li.selected a { color:#232323; } +.topicRow { border-bottom:1px solid #ccc; padding:5px 5px; list-style:none; } +.topicStarter { margin:0px; padding:0px; text-transform:capitalize; text-decoration:none; font:bold 14px Arial; margin-bottom:4px; } +.topicStarter a { text-decoration:none; } +.topicTitle { font-size:11px; font-family:Tahoma; padding:0px; margin:0px; } +.topicTitle a { text-decoration:none; } +.topicStarterAvatar { padding:1px; border:1px solid #ccc; } +.topicStarterAvatarBG { display:block; text-indent:-9000px; } +.topicStarterAvatarBG a { display:block; height:100%;} +.topicPreview { font:normal 10px Tahoma; color:#787878; } +.topicPreviewContainer { padding:3px 5px 3px 5px; border-left:3px solid #eee; margin-bottom:6px; } +/* ICONS */ +.ballonBox, .camCorder, .blackUser, .blueDoc, .redShield, .ballonSmall { width:16px; height:16px; vertical-align:middle; padding-right:2px; } +.ballonBox { background:url(../images/icons/balloons-box.png) no-repeat } +.camCorder { background:url(../images/icons/camcorder.png) no-repeat } +.blackUser { background:url(../images/icons/black-user.png) no-repeat } +.blueDoc { background:url(../images/icons/blue-document.png) no-repeat } +.redShield { background:url(../images/icons/shield.png) no-repeat; } +.ballonSmall { background:url(../images/icons/balloon-small.png) no-repeat; } + +.play_now a{display:inline-block; padding:2px; text-decoration:none; float:right; margin:4px; background-color:#333; color:#fff; padding:5px; border:1px solid #000;border-radius:5px;-webkit-border-radius:5px;-moz-border-radius:5px; cursor:pointer; } + +.topic_comments .comm_other{width:88% !important} \ No newline at end of file diff --git a/upload/styles/cbv2new/theme/rating.css b/upload/styles/cbv2new/theme/rating.css new file mode 100644 index 00000000..02706cf3 --- /dev/null +++ b/upload/styles/cbv2new/theme/rating.css @@ -0,0 +1,107 @@ +/* $Id: rating_style.css 235 2009-08-25 12:39:17Z fwhite $ */ +.rating_container{width:140px; border-right:1px solid #CCC; height:40px; padding-right:10px} +.rating_container #rating_result_container{font-size:10px; font-weight:bold; color:#333} +.rating_container #rating_result_container .error{ color:#ed0000;} +.rating_container #rating_result_container .msg{ color:#0099cc;} + +.big_stars, +.big_stars a:hover, +.big_stars a:active, +.big_stars .current-rating{ + background: url(../images/big_stars.png) left -1000px repeat-x; +} +.big_stars{ + position:relative; + width:140px; + height:28px; + overflow:hidden; + list-style:none; + margin:0; + padding:0; + background-position: left bottom; +} +.big_stars li{ + display: inline; +} +.big_stars a, +.big_stars .current-rating{ + position:absolute; + top:0; + left:0; + text-indent:-1000em; + height:28px; + line-height:28px; + outline:none; + overflow:hidden; + border: none; + +} + +.big_stars a:hover{ + background-position: left center; +} +.big_stars a.one-star{ + width:20%; + z-index:6; +} +.big_stars a.two-stars{ + width:40%; + z-index:5; +} +.big_stars a.three-stars{ + width:60%; + z-index:4; +} +.big_stars a.four-stars{ + width:80%; + z-index:3; +} +.big_stars a.five-stars{ + width:100%; + z-index:2; +} +.big_stars .current-rating{ + z-index:1; + background-position: left top; +} + +.disabled a:hover{ + background: url(../images/big_stars.png) left -1000px repeat-x;!important width:inherit;!important +} + +/* Following is styles of new like and dislike buttons*/ +.newRating { border:1px solid #ccc; border-radius:4px; -moz-border-radius:4px; -webkit-border-radius:4px; background-color:#f3f3f3; + background-image: -webkit-gradient(linear,left bottom,left top,from(#eeeeee),to(#ffffff)); + background-image: -moz-linear-gradient(bottom, #eeeeee, #ffffff); + background-image: -o-linear-gradient(bottom, #eeeeee, #ffffff); + filter: progid:DXImageTransform.Microsoft.Gradient(startColorStr=#ffffff, endColorStr=#eeeeee); } +.newLike, .newDislike { background:none; border:0px; padding:0px; margin:0px; text-indent:-90000px; width:14px; height:14px; padding:5px; display:block;} +.newLike { background:url(../images/thumbs.png) -1px 1px no-repeat; float:left; border-right:1px solid #ccc; } +.newLike:hover { cursor:pointer; background-position:-1px -21px; } +.newLike:active { background-position:-1px -20px; } + +.newDislike { background:url(../images/thumbs.png) -31px 0px no-repeat; float:right; border-left:1px solid #ccc; } +.newDislike:hover { cursor:pointer; background-position:-31px -22px; } +.newDislike:active { background-position:-31px -21px; } +.greenBar { height:50%; background-color:#156200; + background-image: -webkit-gradient(linear,left bottom,left top,from(#156200),to(#1e8c01)); + background-image: -moz-linear-gradient(bottom, #156200, #1e8c01); + background-image: -o-linear-gradient(bottom, #156200, #1e8c01); + filter: progid:DXImageTransform.Microsoft.Gradient(startColorStr=#1e8c01, endColorStr=#156200); float:left; position:relative; border-right:1px solid white; } + + +.redBar { height:50%; background-color:#990000; + background-image: -webkit-gradient(linear,left bottom,left top,from(#990000),to(#c40000)); + background-image: -moz-linear-gradient(bottom, #990000, #c40000); + background-image: -o-linear-gradient(bottom, #990000, #c40000); + filter: progid:DXImageTransform.Microsoft.Gradient(startColorStr=#c40000, endColorStr=#990000); float:left; position:relative; margin-right:-1px; } + +.ratingText { font:normal 11px Arial; } +.UserDisliked, .UserLiked { background:url(../images/thumbs.png) -36px -28px no-repeat; width:14px; height:14px; display:inline-block; *display:inline; } +.UserLiked { background-position:-6px -26px; } + +.ratingContainer .LikeBar { height:4px; background:#060; margin-bottom:1px; } +.ratingContainer .DislikeBar { height:4px; background:#C00; } + +.LikeText, .DislikeText { display:block; margin-bottom:1px; } +.LikeText { color:green; } .DislikeText { color:red; } \ No newline at end of file diff --git a/upload/styles/cbv2new/theme/view_channel.css b/upload/styles/cbv2new/theme/view_channel.css new file mode 100644 index 00000000..a32ee996 --- /dev/null +++ b/upload/styles/cbv2new/theme/view_channel.css @@ -0,0 +1,71 @@ +@charset "utf-8"; +/* CSS Document */ + + +.channel_inner_box a{ font-weight:bold; text-decoration:none; color:#333 } + +.channel_box{background-color:#d7d8d8;} +.channel_inner_box{background-color:#fff;} + + +.channel_box +{ + + border-radius:5px; + -moz-border-radius:5px; + -webkit-border-radius:5px; + padding:5px; margin:auto; + margin-bottom:10px; + +} + +.channel_inner_box +{ + border-radius:3px; + -moz-border-radius:3px; + -webkit-border-radius:3px; + width:99%; margin:auto; + padding:5px; + font-size:12px; + background-color:#fff +} + +.channel_inner_box .error{color:#ed0000} +.channel_inner_box .msg{color:#0099cc} + +.channel_top{font-size:16px; font-weight:bold; font-family:Arial, Helvetica, sans-serif;} +.channel_heading_mid{font-size:12px; font-weight:bold; font-family:Arial, Helvetica, sans-serif;} + +.channel_heading{background-image:url(../images/view_channel.png); background-position:0px -375px; background-repeat:repeat-x; height:25px; display:block; margin-bottom:5px; padding-left:8px; line-height:25px; font-size:16px; color:#fff;border-radius:3px; + -moz-border-radius:3px; + -webkit-border-radius:3px; font-weight:bold; font-family:Arial, Helvetica, sans-serif; } +.channel_inner_box .usr_small_thumb +{ + width:40px; + float:left; +} + +.channel_top_user_box{float:left; display:inline-block} +.usr_channel{ display:inline-block; margin-right:15px } + +.top_channel_links{display:block; margin:0px; padding:0px; float:left; } +.top_channel_links li{list-style:none; padding:0px; margin:0px; display:block; float:left; width:100px; text-align:center; margin:0px 3px 0px 3px} +.top_channel_links li a{color:#fff; display:block; background-color:#0099cc;border-radius:5px; -webkit-border-radius:5px; -moz-border-radius:5px; height:20px} + +.usr_thumb_container{margin-bottom:10px} +.user_thumb{max-width:260px} + +.channel_action_links{display:block; text-align:center; margin:0px; padding:0px;line-height:normal} +.channel_action_links a{ line-height:normal} +.channel_action_links li{list-style:none;line-height:normal} + + +.show_info{clear:both} +.show_info .item_list{width:50%; display:block; font-size:11px; } +.show_info .item_list a{font-weight:normal} +.float_right{float:right} +.float_left{float:left} + + +.right_column{float:right; width:705px; margin-right:3px} +.right_column .channel_inner_box{margin-bottom:5px} \ No newline at end of file diff --git a/upload/styles/global/admin_bar.html b/upload/styles/global/admin_bar.html new file mode 100644 index 00000000..9528232a --- /dev/null +++ b/upload/styles/global/admin_bar.html @@ -0,0 +1,85 @@ + + + +{if $smarty.cookies.CBadminBar == 'hidden'} +
    Show Menu
    +{/if} \ No newline at end of file diff --git a/upload/styles/global/head.html b/upload/styles/global/head.html new file mode 100644 index 00000000..5a82d826 --- /dev/null +++ b/upload/styles/global/head.html @@ -0,0 +1,519 @@ + + +{if $Cbucket->configs.use_google_api} + + + +{else} + + +{/if} + + + + +{foreach from=$Cbucket->JSArray item=type} + {foreach from=$type item=scope key=file} + {include_js type=$scope file=$file} + {/foreach} +{/foreach} + + + +{foreach key=file item=type from=$Cbucket->header_files} + {include_header file=$file type=$type} +{/foreach} + + + + +{if $smarty.const.THIS_PAGE == 'upload'} + + + + + + + + +{else} + +{/if} + +{if $smarty.const.THIS_PAGE == 'photo_upload'} + + + + + +{/if} + +{if $smarty.const.THIS_PAGE == 'view_item'} + +{/if} + +{if $smarty.const.THIS_PAGE=='watch_video' || $object.videoid} + {if $object.videoid}{assign var=vdo value=$object} {/if} + + + + + {if $Cbucket->configs.facebook_embed=='yes'} + + + + + + {/if} + + + +{/if} + +{if $object.photo_id} + + + + +{/if} + + +{literal} + +{/literal} + + \ No newline at end of file diff --git a/upload/styles/global/jquery_ui.css b/upload/styles/global/jquery_ui.css new file mode 100644 index 00000000..e35be9b3 --- /dev/null +++ b/upload/styles/global/jquery_ui.css @@ -0,0 +1,572 @@ +/* + * jQuery UI CSS Framework 1.8.8 + * + * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Theming/API + */ + +/* Layout helpers +----------------------------------*/ +.ui-helper-hidden { display: none; } +.ui-helper-hidden-accessible { position: absolute !important; clip: rect(1px 1px 1px 1px); clip: rect(1px,1px,1px,1px); } +.ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; } +.ui-helper-clearfix:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; } +.ui-helper-clearfix { display: inline-block; } +/* required comment for clearfix to work in Opera \*/ +* html .ui-helper-clearfix { height:1%; } +.ui-helper-clearfix { display:block; } +/* end clearfix */ +.ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); } + + +/* Interaction Cues +----------------------------------*/ +.ui-state-disabled { cursor: default !important; } + + +/* Icons +----------------------------------*/ + +/* states and images */ +.ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; } + + +/* Misc visuals +----------------------------------*/ + +/* Overlays */ +.ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } + + +/* + * jQuery UI CSS Framework 1.8.8 + * + * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Theming/API + * + * To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Lucida%20Grande,%20Lucida%20Sans,%20Arial,%20sans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=5px&bgColorHeader=5c9ccc&bgTextureHeader=12_gloss_wave.png&bgImgOpacityHeader=55&borderColorHeader=4297d7&fcHeader=ffffff&iconColorHeader=d8e7f3&bgColorContent=fcfdfd&bgTextureContent=06_inset_hard.png&bgImgOpacityContent=100&borderColorContent=a6c9e2&fcContent=222222&iconColorContent=469bdd&bgColorDefault=dfeffc&bgTextureDefault=02_glass.png&bgImgOpacityDefault=85&borderColorDefault=c5dbec&fcDefault=2e6e9e&iconColorDefault=6da8d5&bgColorHover=d0e5f5&bgTextureHover=02_glass.png&bgImgOpacityHover=75&borderColorHover=79b7e7&fcHover=1d5987&iconColorHover=217bc0&bgColorActive=f5f8f9&bgTextureActive=06_inset_hard.png&bgImgOpacityActive=100&borderColorActive=79b7e7&fcActive=e17009&iconColorActive=f9bd01&bgColorHighlight=fbec88&bgTextureHighlight=01_flat.png&bgImgOpacityHighlight=55&borderColorHighlight=fad42e&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=fef1ec&bgTextureError=02_glass.png&bgImgOpacityError=95&borderColorError=cd0a0a&fcError=cd0a0a&iconColorError=cd0a0a&bgColorOverlay=aaaaaa&bgTextureOverlay=01_flat.png&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=01_flat.png&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px + */ + + +/* Component containers +----------------------------------*/ +.ui-widget { font-family: Lucida Grande, Lucida Sans, Arial, sans-serif; font-size: 1.1em; } +.ui-widget .ui-widget { font-size: 1em; } +.ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Lucida Grande, Lucida Sans, Arial, sans-serif; font-size: 1em; } +.ui-widget-content { border: 1px solid #a6c9e2; background: #fcfdfd url(images/ui-bg_inset-hard_100_fcfdfd_1x100.png) 50% bottom repeat-x; color: #222222; } +.ui-widget-content a { color: #222222; } +.ui-widget-header { border: 1px solid #4297d7; background: #5c9ccc url(images/ui-bg_gloss-wave_55_5c9ccc_500x100.png) 50% 50% repeat-x; color: #ffffff; font-weight: bold; } +.ui-widget-header a { color: #ffffff; } + +/* Interaction states +----------------------------------*/ +.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #c5dbec; background: #dfeffc url(images/ui-bg_glass_85_dfeffc_1x400.png) 50% 50% repeat-x; font-weight: bold; color: #2e6e9e; } +.ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #2e6e9e; text-decoration: none; } +.ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { border: 1px solid #79b7e7; background: #d0e5f5 url(images/ui-bg_glass_75_d0e5f5_1x400.png) 50% 50% repeat-x; font-weight: bold; color: #1d5987; } +.ui-state-hover a, .ui-state-hover a:hover { color: #1d5987; text-decoration: none; } +.ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #79b7e7; background: #f5f8f9 url(images/ui-bg_inset-hard_100_f5f8f9_1x100.png) 50% 50% repeat-x; font-weight: bold; color: #e17009; } +.ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #e17009; text-decoration: none; } +.ui-widget :active { outline: none; } + +/* Interaction Cues +----------------------------------*/ +.ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight {border: 1px solid #fad42e; background: #fbec88 url(images/ui-bg_flat_55_fbec88_40x100.png) 50% 50% repeat-x; color: #363636; } +.ui-state-highlight a, .ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a { color: #363636; } +.ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error {border: 1px solid #cd0a0a; background: #fef1ec url(images/ui-bg_glass_95_fef1ec_1x400.png) 50% 50% repeat-x; color: #cd0a0a; } +.ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #cd0a0a; } +.ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #cd0a0a; } +.ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary { font-weight: bold; } +.ui-priority-secondary, .ui-widget-content .ui-priority-secondary, .ui-widget-header .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; } +.ui-state-disabled, .ui-widget-content .ui-state-disabled, .ui-widget-header .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; } + +/* Icons +----------------------------------*/ + +/* states and images */ +.ui-icon { width: 16px; height: 16px; background-image: url(images/ui-icons_469bdd_256x240.png); } +.ui-widget-content .ui-icon {background-image: url(images/ui-icons_469bdd_256x240.png); } +.ui-widget-header .ui-icon {background-image: url(images/ui-icons_d8e7f3_256x240.png); } +.ui-state-default .ui-icon { background-image: url(images/ui-icons_6da8d5_256x240.png); } +.ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: url(images/ui-icons_217bc0_256x240.png); } +.ui-state-active .ui-icon {background-image: url(images/ui-icons_f9bd01_256x240.png); } +.ui-state-highlight .ui-icon {background-image: url(images/ui-icons_2e83ff_256x240.png); } +.ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-image: url(images/ui-icons_cd0a0a_256x240.png); } + +/* positioning */ +.ui-icon-carat-1-n { background-position: 0 0; } +.ui-icon-carat-1-ne { background-position: -16px 0; } +.ui-icon-carat-1-e { background-position: -32px 0; } +.ui-icon-carat-1-se { background-position: -48px 0; } +.ui-icon-carat-1-s { background-position: -64px 0; } +.ui-icon-carat-1-sw { background-position: -80px 0; } +.ui-icon-carat-1-w { background-position: -96px 0; } +.ui-icon-carat-1-nw { background-position: -112px 0; } +.ui-icon-carat-2-n-s { background-position: -128px 0; } +.ui-icon-carat-2-e-w { background-position: -144px 0; } +.ui-icon-triangle-1-n { background-position: 0 -16px; } +.ui-icon-triangle-1-ne { background-position: -16px -16px; } +.ui-icon-triangle-1-e { background-position: -32px -16px; } +.ui-icon-triangle-1-se { background-position: -48px -16px; } +.ui-icon-triangle-1-s { background-position: -64px -16px; } +.ui-icon-triangle-1-sw { background-position: -80px -16px; } +.ui-icon-triangle-1-w { background-position: -96px -16px; } +.ui-icon-triangle-1-nw { background-position: -112px -16px; } +.ui-icon-triangle-2-n-s { background-position: -128px -16px; } +.ui-icon-triangle-2-e-w { background-position: -144px -16px; } +.ui-icon-arrow-1-n { background-position: 0 -32px; } +.ui-icon-arrow-1-ne { background-position: -16px -32px; } +.ui-icon-arrow-1-e { background-position: -32px -32px; } +.ui-icon-arrow-1-se { background-position: -48px -32px; } +.ui-icon-arrow-1-s { background-position: -64px -32px; } +.ui-icon-arrow-1-sw { background-position: -80px -32px; } +.ui-icon-arrow-1-w { background-position: -96px -32px; } +.ui-icon-arrow-1-nw { background-position: -112px -32px; } +.ui-icon-arrow-2-n-s { background-position: -128px -32px; } +.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; } +.ui-icon-arrow-2-e-w { background-position: -160px -32px; } +.ui-icon-arrow-2-se-nw { background-position: -176px -32px; } +.ui-icon-arrowstop-1-n { background-position: -192px -32px; } +.ui-icon-arrowstop-1-e { background-position: -208px -32px; } +.ui-icon-arrowstop-1-s { background-position: -224px -32px; } +.ui-icon-arrowstop-1-w { background-position: -240px -32px; } +.ui-icon-arrowthick-1-n { background-position: 0 -48px; } +.ui-icon-arrowthick-1-ne { background-position: -16px -48px; } +.ui-icon-arrowthick-1-e { background-position: -32px -48px; } +.ui-icon-arrowthick-1-se { background-position: -48px -48px; } +.ui-icon-arrowthick-1-s { background-position: -64px -48px; } +.ui-icon-arrowthick-1-sw { background-position: -80px -48px; } +.ui-icon-arrowthick-1-w { background-position: -96px -48px; } +.ui-icon-arrowthick-1-nw { background-position: -112px -48px; } +.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; } +.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; } +.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; } +.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; } +.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; } +.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; } +.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; } +.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; } +.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; } +.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; } +.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; } +.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; } +.ui-icon-arrowreturn-1-w { background-position: -64px -64px; } +.ui-icon-arrowreturn-1-n { background-position: -80px -64px; } +.ui-icon-arrowreturn-1-e { background-position: -96px -64px; } +.ui-icon-arrowreturn-1-s { background-position: -112px -64px; } +.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; } +.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; } +.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; } +.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; } +.ui-icon-arrow-4 { background-position: 0 -80px; } +.ui-icon-arrow-4-diag { background-position: -16px -80px; } +.ui-icon-extlink { background-position: -32px -80px; } +.ui-icon-newwin { background-position: -48px -80px; } +.ui-icon-refresh { background-position: -64px -80px; } +.ui-icon-shuffle { background-position: -80px -80px; } +.ui-icon-transfer-e-w { background-position: -96px -80px; } +.ui-icon-transferthick-e-w { background-position: -112px -80px; } +.ui-icon-folder-collapsed { background-position: 0 -96px; } +.ui-icon-folder-open { background-position: -16px -96px; } +.ui-icon-document { background-position: -32px -96px; } +.ui-icon-document-b { background-position: -48px -96px; } +.ui-icon-note { background-position: -64px -96px; } +.ui-icon-mail-closed { background-position: -80px -96px; } +.ui-icon-mail-open { background-position: -96px -96px; } +.ui-icon-suitcase { background-position: -112px -96px; } +.ui-icon-comment { background-position: -128px -96px; } +.ui-icon-person { background-position: -144px -96px; } +.ui-icon-print { background-position: -160px -96px; } +.ui-icon-trash { background-position: -176px -96px; } +.ui-icon-locked { background-position: -192px -96px; } +.ui-icon-unlocked { background-position: -208px -96px; } +.ui-icon-bookmark { background-position: -224px -96px; } +.ui-icon-tag { background-position: -240px -96px; } +.ui-icon-home { background-position: 0 -112px; } +.ui-icon-flag { background-position: -16px -112px; } +.ui-icon-calendar { background-position: -32px -112px; } +.ui-icon-cart { background-position: -48px -112px; } +.ui-icon-pencil { background-position: -64px -112px; } +.ui-icon-clock { background-position: -80px -112px; } +.ui-icon-disk { background-position: -96px -112px; } +.ui-icon-calculator { background-position: -112px -112px; } +.ui-icon-zoomin { background-position: -128px -112px; } +.ui-icon-zoomout { background-position: -144px -112px; } +.ui-icon-search { background-position: -160px -112px; } +.ui-icon-wrench { background-position: -176px -112px; } +.ui-icon-gear { background-position: -192px -112px; } +.ui-icon-heart { background-position: -208px -112px; } +.ui-icon-star { background-position: -224px -112px; } +.ui-icon-link { background-position: -240px -112px; } +.ui-icon-cancel { background-position: 0 -128px; } +.ui-icon-plus { background-position: -16px -128px; } +.ui-icon-plusthick { background-position: -32px -128px; } +.ui-icon-minus { background-position: -48px -128px; } +.ui-icon-minusthick { background-position: -64px -128px; } +.ui-icon-close { background-position: -80px -128px; } +.ui-icon-closethick { background-position: -96px -128px; } +.ui-icon-key { background-position: -112px -128px; } +.ui-icon-lightbulb { background-position: -128px -128px; } +.ui-icon-scissors { background-position: -144px -128px; } +.ui-icon-clipboard { background-position: -160px -128px; } +.ui-icon-copy { background-position: -176px -128px; } +.ui-icon-contact { background-position: -192px -128px; } +.ui-icon-image { background-position: -208px -128px; } +.ui-icon-video { background-position: -224px -128px; } +.ui-icon-script { background-position: -240px -128px; } +.ui-icon-alert { background-position: 0 -144px; } +.ui-icon-info { background-position: -16px -144px; } +.ui-icon-notice { background-position: -32px -144px; } +.ui-icon-help { background-position: -48px -144px; } +.ui-icon-check { background-position: -64px -144px; } +.ui-icon-bullet { background-position: -80px -144px; } +.ui-icon-radio-off { background-position: -96px -144px; } +.ui-icon-radio-on { background-position: -112px -144px; } +.ui-icon-pin-w { background-position: -128px -144px; } +.ui-icon-pin-s { background-position: -144px -144px; } +.ui-icon-play { background-position: 0 -160px; } +.ui-icon-pause { background-position: -16px -160px; } +.ui-icon-seek-next { background-position: -32px -160px; } +.ui-icon-seek-prev { background-position: -48px -160px; } +.ui-icon-seek-end { background-position: -64px -160px; } +.ui-icon-seek-start { background-position: -80px -160px; } +/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */ +.ui-icon-seek-first { background-position: -80px -160px; } +.ui-icon-stop { background-position: -96px -160px; } +.ui-icon-eject { background-position: -112px -160px; } +.ui-icon-volume-off { background-position: -128px -160px; } +.ui-icon-volume-on { background-position: -144px -160px; } +.ui-icon-power { background-position: 0 -176px; } +.ui-icon-signal-diag { background-position: -16px -176px; } +.ui-icon-signal { background-position: -32px -176px; } +.ui-icon-battery-0 { background-position: -48px -176px; } +.ui-icon-battery-1 { background-position: -64px -176px; } +.ui-icon-battery-2 { background-position: -80px -176px; } +.ui-icon-battery-3 { background-position: -96px -176px; } +.ui-icon-circle-plus { background-position: 0 -192px; } +.ui-icon-circle-minus { background-position: -16px -192px; } +.ui-icon-circle-close { background-position: -32px -192px; } +.ui-icon-circle-triangle-e { background-position: -48px -192px; } +.ui-icon-circle-triangle-s { background-position: -64px -192px; } +.ui-icon-circle-triangle-w { background-position: -80px -192px; } +.ui-icon-circle-triangle-n { background-position: -96px -192px; } +.ui-icon-circle-arrow-e { background-position: -112px -192px; } +.ui-icon-circle-arrow-s { background-position: -128px -192px; } +.ui-icon-circle-arrow-w { background-position: -144px -192px; } +.ui-icon-circle-arrow-n { background-position: -160px -192px; } +.ui-icon-circle-zoomin { background-position: -176px -192px; } +.ui-icon-circle-zoomout { background-position: -192px -192px; } +.ui-icon-circle-check { background-position: -208px -192px; } +.ui-icon-circlesmall-plus { background-position: 0 -208px; } +.ui-icon-circlesmall-minus { background-position: -16px -208px; } +.ui-icon-circlesmall-close { background-position: -32px -208px; } +.ui-icon-squaresmall-plus { background-position: -48px -208px; } +.ui-icon-squaresmall-minus { background-position: -64px -208px; } +.ui-icon-squaresmall-close { background-position: -80px -208px; } +.ui-icon-grip-dotted-vertical { background-position: 0 -224px; } +.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; } +.ui-icon-grip-solid-vertical { background-position: -32px -224px; } +.ui-icon-grip-solid-horizontal { background-position: -48px -224px; } +.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; } +.ui-icon-grip-diagonal-se { background-position: -80px -224px; } + + +/* Misc visuals +----------------------------------*/ + +/* Corner radius */ +.ui-corner-tl { -moz-border-radius-topleft: 5px; -webkit-border-top-left-radius: 5px; border-top-left-radius: 5px; } +.ui-corner-tr { -moz-border-radius-topright: 5px; -webkit-border-top-right-radius: 5px; border-top-right-radius: 5px; } +.ui-corner-bl { -moz-border-radius-bottomleft: 5px; -webkit-border-bottom-left-radius: 5px; border-bottom-left-radius: 5px; } +.ui-corner-br { -moz-border-radius-bottomright: 5px; -webkit-border-bottom-right-radius: 5px; border-bottom-right-radius: 5px; } +.ui-corner-top { -moz-border-radius-topleft: 5px; -webkit-border-top-left-radius: 5px; border-top-left-radius: 5px; -moz-border-radius-topright: 5px; -webkit-border-top-right-radius: 5px; border-top-right-radius: 5px; } +.ui-corner-bottom { -moz-border-radius-bottomleft: 5px; -webkit-border-bottom-left-radius: 5px; border-bottom-left-radius: 5px; -moz-border-radius-bottomright: 5px; -webkit-border-bottom-right-radius: 5px; border-bottom-right-radius: 5px; } +.ui-corner-right { -moz-border-radius-topright: 5px; -webkit-border-top-right-radius: 5px; border-top-right-radius: 5px; -moz-border-radius-bottomright: 5px; -webkit-border-bottom-right-radius: 5px; border-bottom-right-radius: 5px; } +.ui-corner-left { -moz-border-radius-topleft: 5px; -webkit-border-top-left-radius: 5px; border-top-left-radius: 5px; -moz-border-radius-bottomleft: 5px; -webkit-border-bottom-left-radius: 5px; border-bottom-left-radius: 5px; } +.ui-corner-all { -moz-border-radius: 5px; -webkit-border-radius: 5px; border-radius: 5px; } + +/* Overlays */ +.ui-widget-overlay { background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; opacity: .30;filter:Alpha(Opacity=30); } +.ui-widget-shadow { margin: -8px 0 0 -8px; padding: 8px; background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; opacity: .30;filter:Alpha(Opacity=30); -moz-border-radius: 8px; -webkit-border-radius: 8px; border-radius: 8px; }/* + * jQuery UI Resizable 1.8.8 + * + * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Resizable#theming + */ +.ui-resizable { position: relative;} +.ui-resizable-handle { position: absolute;font-size: 0.1px;z-index: 99999; display: block;} +.ui-resizable-disabled .ui-resizable-handle, .ui-resizable-autohide .ui-resizable-handle { display: none; } +.ui-resizable-n { cursor: n-resize; height: 7px; width: 100%; top: -5px; left: 0; } +.ui-resizable-s { cursor: s-resize; height: 7px; width: 100%; bottom: -5px; left: 0; } +.ui-resizable-e { cursor: e-resize; width: 7px; right: -5px; top: 0; height: 100%; } +.ui-resizable-w { cursor: w-resize; width: 7px; left: -5px; top: 0; height: 100%; } +.ui-resizable-se { cursor: se-resize; width: 12px; height: 12px; right: 1px; bottom: 1px; } +.ui-resizable-sw { cursor: sw-resize; width: 9px; height: 9px; left: -5px; bottom: -5px; } +.ui-resizable-nw { cursor: nw-resize; width: 9px; height: 9px; left: -5px; top: -5px; } +.ui-resizable-ne { cursor: ne-resize; width: 9px; height: 9px; right: -5px; top: -5px;}/* + * jQuery UI Selectable 1.8.8 + * + * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Selectable#theming + */ +.ui-selectable-helper { position: absolute; z-index: 100; border:1px dotted black; } +/* + * jQuery UI Accordion 1.8.8 + * + * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Accordion#theming + */ +/* IE/Win - Fix animation bug - #4615 */ +.ui-accordion { width: 100%; } +.ui-accordion .ui-accordion-header { cursor: pointer; position: relative; margin-top: 1px; zoom: 1; } +.ui-accordion .ui-accordion-li-fix { display: inline; } +.ui-accordion .ui-accordion-header-active { border-bottom: 0 !important; } +.ui-accordion .ui-accordion-header a { display: block; font-size: 1em; padding: .5em .5em .5em .7em; } +.ui-accordion-icons .ui-accordion-header a { padding-left: 2.2em; } +.ui-accordion .ui-accordion-header .ui-icon { position: absolute; left: .5em; top: 50%; margin-top: -8px; } +.ui-accordion .ui-accordion-content { padding: 1em 2.2em; border-top: 0; margin-top: -2px; position: relative; top: 1px; margin-bottom: 2px; overflow: auto; display: none; zoom: 1; } +.ui-accordion .ui-accordion-content-active { display: block; }/* + * jQuery UI Autocomplete 1.8.8 + * + * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Autocomplete#theming + */ +.ui-autocomplete { position: absolute; cursor: default; } + +/* workarounds */ +* html .ui-autocomplete { width:1px; } /* without this, the menu expands to 100% in IE6 */ + +/* + * jQuery UI Menu 1.8.8 + * + * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Menu#theming + */ +.ui-menu { + list-style:none; + padding: 2px; + margin: 0; + display:block; + float: left; +} +.ui-menu .ui-menu { + margin-top: -3px; +} +.ui-menu .ui-menu-item { + margin:0; + padding: 0; + zoom: 1; + float: left; + clear: left; + width: 100%; +} +.ui-menu .ui-menu-item a { + text-decoration:none; + display:block; + padding:.2em .4em; + line-height:1.5; + zoom:1; +} +.ui-menu .ui-menu-item a.ui-state-hover, +.ui-menu .ui-menu-item a.ui-state-active { + font-weight: normal; + margin: -1px; +} +/* + * jQuery UI Button 1.8.8 + * + * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Button#theming + */ +.ui-button { display: inline-block; position: relative; padding: 0; margin-right: .1em; text-decoration: none !important; cursor: pointer; text-align: center; zoom: 1; overflow: visible; } /* the overflow property removes extra width in IE */ +.ui-button-icon-only { width: 2.2em; } /* to make room for the icon, a width needs to be set here */ +button.ui-button-icon-only { width: 2.4em; } /* button elements seem to need a little more width */ +.ui-button-icons-only { width: 3.4em; } +button.ui-button-icons-only { width: 3.7em; } + +/*button text element */ +.ui-button .ui-button-text { display: block; line-height: 1.4; } +.ui-button-text-only .ui-button-text { padding: .4em 1em; } +.ui-button-icon-only .ui-button-text, .ui-button-icons-only .ui-button-text { padding: .4em; text-indent: -9999999px; } +.ui-button-text-icon-primary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 1em .4em 2.1em; } +.ui-button-text-icon-secondary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 2.1em .4em 1em; } +.ui-button-text-icons .ui-button-text { padding-left: 2.1em; padding-right: 2.1em; } +/* no icon support for input elements, provide padding by default */ +input.ui-button { padding: .4em 1em; } + +/*button icon element(s) */ +.ui-button-icon-only .ui-icon, .ui-button-text-icon-primary .ui-icon, .ui-button-text-icon-secondary .ui-icon, .ui-button-text-icons .ui-icon, .ui-button-icons-only .ui-icon { position: absolute; top: 50%; margin-top: -8px; } +.ui-button-icon-only .ui-icon { left: 50%; margin-left: -8px; } +.ui-button-text-icon-primary .ui-button-icon-primary, .ui-button-text-icons .ui-button-icon-primary, .ui-button-icons-only .ui-button-icon-primary { left: .5em; } +.ui-button-text-icon-secondary .ui-button-icon-secondary, .ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; } +.ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; } + +/*button sets*/ +.ui-buttonset { margin-right: 7px; } +.ui-buttonset .ui-button { margin-left: 0; margin-right: -.3em; } + +/* workarounds */ +button.ui-button::-moz-focus-inner { border: 0; padding: 0; } /* reset extra padding in Firefox */ +/* + * jQuery UI Dialog 1.8.8 + * + * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Dialog#theming + */ +.ui-dialog { position: absolute; padding: .2em; width: 300px; overflow: hidden; } +.ui-dialog .ui-dialog-titlebar { padding: .4em 1em; position: relative; } +.ui-dialog .ui-dialog-title { float: left; margin: .1em 16px .1em 0; } +.ui-dialog .ui-dialog-titlebar-close { position: absolute; right: .3em; top: 50%; width: 19px; margin: -10px 0 0 0; padding: 1px; height: 18px; } +.ui-dialog .ui-dialog-titlebar-close span { display: block; margin: 1px; } +.ui-dialog .ui-dialog-titlebar-close:hover, .ui-dialog .ui-dialog-titlebar-close:focus { padding: 0; } +.ui-dialog .ui-dialog-content { position: relative; border: 0; padding: .5em 1em; background: none; overflow: auto; zoom: 1; } +.ui-dialog .ui-dialog-buttonpane { text-align: left; border-width: 1px 0 0 0; background-image: none; margin: .5em 0 0 0; padding: .3em 1em .5em .4em; } +.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset { float: right; } +.ui-dialog .ui-dialog-buttonpane button { margin: .5em .4em .5em 0; cursor: pointer; } +.ui-dialog .ui-resizable-se { width: 14px; height: 14px; right: 3px; bottom: 3px; } +.ui-draggable .ui-dialog-titlebar { cursor: move; } +/* + * jQuery UI Slider 1.8.8 + * + * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Slider#theming + */ +.ui-slider { position: relative; text-align: left; } +.ui-slider .ui-slider-handle { position: absolute; z-index: 2; width: 1.2em; height: 1.2em; cursor: default; } +.ui-slider .ui-slider-range { position: absolute; z-index: 1; font-size: .7em; display: block; border: 0; background-position: 0 0; } + +.ui-slider-horizontal { height: .8em; } +.ui-slider-horizontal .ui-slider-handle { top: -.3em; margin-left: -.6em; } +.ui-slider-horizontal .ui-slider-range { top: 0; height: 100%; } +.ui-slider-horizontal .ui-slider-range-min { left: 0; } +.ui-slider-horizontal .ui-slider-range-max { right: 0; } + +.ui-slider-vertical { width: .8em; height: 100px; } +.ui-slider-vertical .ui-slider-handle { left: -.3em; margin-left: 0; margin-bottom: -.6em; } +.ui-slider-vertical .ui-slider-range { left: 0; width: 100%; } +.ui-slider-vertical .ui-slider-range-min { bottom: 0; } +.ui-slider-vertical .ui-slider-range-max { top: 0; }/* + * jQuery UI Tabs 1.8.8 + * + * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Tabs#theming + */ +.ui-tabs { position: relative; padding: .2em; zoom: 1; } /* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */ +.ui-tabs .ui-tabs-nav { margin: 0; padding: .2em .2em 0; } +.ui-tabs .ui-tabs-nav li { list-style: none; float: left; position: relative; top: 1px; margin: 0 .2em 1px 0; border-bottom: 0 !important; padding: 0; white-space: nowrap; } +.ui-tabs .ui-tabs-nav li a { float: left; padding: .5em 1em; text-decoration: none; } +.ui-tabs .ui-tabs-nav li.ui-tabs-selected { margin-bottom: 0; padding-bottom: 1px; } +.ui-tabs .ui-tabs-nav li.ui-tabs-selected a, .ui-tabs .ui-tabs-nav li.ui-state-disabled a, .ui-tabs .ui-tabs-nav li.ui-state-processing a { cursor: text; } +.ui-tabs .ui-tabs-nav li a, .ui-tabs.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-selected a { cursor: pointer; } /* first selector in group seems obsolete, but required to overcome bug in Opera applying cursor: text overall if defined elsewhere... */ +.ui-tabs .ui-tabs-panel { display: block; border-width: 0; padding: 1em 1.4em; background: none; } +.ui-tabs .ui-tabs-hide { display: none !important; } +/* + * jQuery UI Datepicker 1.8.8 + * + * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Datepicker#theming + */ +.ui-datepicker { width: 17em; padding: .2em .2em 0; display: none; } +.ui-datepicker .ui-datepicker-header { position:relative; padding:.2em 0; } +.ui-datepicker .ui-datepicker-prev, .ui-datepicker .ui-datepicker-next { position:absolute; top: 2px; width: 1.8em; height: 1.8em; } +.ui-datepicker .ui-datepicker-prev-hover, .ui-datepicker .ui-datepicker-next-hover { top: 1px; } +.ui-datepicker .ui-datepicker-prev { left:2px; } +.ui-datepicker .ui-datepicker-next { right:2px; } +.ui-datepicker .ui-datepicker-prev-hover { left:1px; } +.ui-datepicker .ui-datepicker-next-hover { right:1px; } +.ui-datepicker .ui-datepicker-prev span, .ui-datepicker .ui-datepicker-next span { display: block; position: absolute; left: 50%; margin-left: -8px; top: 50%; margin-top: -8px; } +.ui-datepicker .ui-datepicker-title { margin: 0 2.3em; line-height: 1.8em; text-align: center; } +.ui-datepicker .ui-datepicker-title select { font-size:1em; margin:1px 0; } +.ui-datepicker select.ui-datepicker-month-year {width: 100%;} +.ui-datepicker select.ui-datepicker-month, +.ui-datepicker select.ui-datepicker-year { width: 49%;} +.ui-datepicker table {width: 100%; font-size: .9em; border-collapse: collapse; margin:0 0 .4em; } +.ui-datepicker th { padding: .7em .3em; text-align: center; font-weight: bold; border: 0; } +.ui-datepicker td { border: 0; padding: 1px; } +.ui-datepicker td span, .ui-datepicker td a { display: block; padding: .2em; text-align: right; text-decoration: none; } +.ui-datepicker .ui-datepicker-buttonpane { background-image: none; margin: .7em 0 0 0; padding:0 .2em; border-left: 0; border-right: 0; border-bottom: 0; } +.ui-datepicker .ui-datepicker-buttonpane button { float: right; margin: .5em .2em .4em; cursor: pointer; padding: .2em .6em .3em .6em; width:auto; overflow:visible; } +.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { float:left; } + +/* with multiple calendars */ +.ui-datepicker.ui-datepicker-multi { width:auto; } +.ui-datepicker-multi .ui-datepicker-group { float:left; } +.ui-datepicker-multi .ui-datepicker-group table { width:95%; margin:0 auto .4em; } +.ui-datepicker-multi-2 .ui-datepicker-group { width:50%; } +.ui-datepicker-multi-3 .ui-datepicker-group { width:33.3%; } +.ui-datepicker-multi-4 .ui-datepicker-group { width:25%; } +.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header { border-left-width:0; } +.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { border-left-width:0; } +.ui-datepicker-multi .ui-datepicker-buttonpane { clear:left; } +.ui-datepicker-row-break { clear:both; width:100%; } + +/* RTL support */ +.ui-datepicker-rtl { direction: rtl; } +.ui-datepicker-rtl .ui-datepicker-prev { right: 2px; left: auto; } +.ui-datepicker-rtl .ui-datepicker-next { left: 2px; right: auto; } +.ui-datepicker-rtl .ui-datepicker-prev:hover { right: 1px; left: auto; } +.ui-datepicker-rtl .ui-datepicker-next:hover { left: 1px; right: auto; } +.ui-datepicker-rtl .ui-datepicker-buttonpane { clear:right; } +.ui-datepicker-rtl .ui-datepicker-buttonpane button { float: left; } +.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current { float:right; } +.ui-datepicker-rtl .ui-datepicker-group { float:right; } +.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header { border-right-width:0; border-left-width:1px; } +.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { border-right-width:0; border-left-width:1px; } + +/* IE6 IFRAME FIX (taken from datepicker 1.5.3 */ +.ui-datepicker-cover { + display: none; /*sorry for IE5*/ + display/**/: block; /*sorry for IE5*/ + position: absolute; /*must have*/ + z-index: -1; /*must have*/ + filter: mask(); /*must have*/ + top: -4px; /*must have*/ + left: -4px; /*must have*/ + width: 200px; /*must have*/ + height: 200px; /*must have*/ +}/* + * jQuery UI Progressbar 1.8.8 + * + * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Progressbar#theming + */ +.ui-progressbar { height:2em; text-align: left; } +.ui-progressbar .ui-progressbar-value {margin: -1px; height:100%; } \ No newline at end of file diff --git a/upload/styles/global/upload_form.html b/upload/styles/global/upload_form.html new file mode 100644 index 00000000..13dcaed2 --- /dev/null +++ b/upload/styles/global/upload_form.html @@ -0,0 +1,16 @@ +
    + {lang code='upload_desktop_msg'} +
    + +
    + +
    +
    + {lang code='upload_videos_can_be' assign='uploadVidCanBe'} + {assign var=allowedSize value=$Cbucket->configs.max_upload_size} + {assign var=allowedDuration value=$Cbucket->configs.max_video_duration} + {$uploadVidCanBe|sprintf:"$allowedSize MB":"$allowedDuration minutes"} +
    +
    + +
    \ No newline at end of file diff --git a/upload/upload.php b/upload/upload.php new file mode 100644 index 00000000..67341b61 --- /dev/null +++ b/upload/upload.php @@ -0,0 +1,78 @@ +page_redir(); +subtitle('upload'); + +//Checking if user is guest +if(userid()) + $verify_logged_user = true; +else + $verify_logged_user = false; + +if(has_access('allow_video_upload',false,$verify_logged_user)) +{ + $file_name = time().RandomString(5); + assign('file_name',$file_name); + + $step = 1; + if(isset($_POST['submit_data'])) + { + $Upload->validate_video_upload_form(); + if(empty($eh->error_list)) + { + $step=2; + } + } + + if(isset($_POST['submit_upload'])) + { + if(!$_POST['file_name']) + $_POST['file_name'] = time().RandomString(5); + + //$Upload->validate_video_upload_form(NULL,TRUE); + if(empty($eh->error_list)) + { + $vid = $Upload->submit_upload(); + //echo $db->db_query; + //Call file so it can activate video + $Upload->do_after_video_upload($vid); + + if(!error()) + $step=3; + } + } + + //Assigning Form Name [RECOMMEND for submitting purpose] + Assign('upload_form_name','UploadForm'); + + //Adding Uploading JS Files + $Cbucket->add_js(array('swfupload/swfupload.js'=>'uploadactive')); + $Cbucket->add_js(array('swfupload/plugins/swfupload.queue.js'=>'uploadactive')); + $Cbucket->add_js(array('swfupload/plugins/handlers.js'=>'uploadactive')); + $Cbucket->add_js(array('swfupload/plugins/fileprogress.js'=>'uploadactive')); +}else +{ + $userquery->logincheck('allow_video_upload',true); +} + +Assign('step',$step); + +subtitle(lang('upload')); +//Displaying The Template +template_files('upload.html'); +display_it(); + +?> \ No newline at end of file diff --git a/upload/user_collections.php b/upload/user_collections.php new file mode 100644 index 00000000..87da1b5c --- /dev/null +++ b/upload/user_collections.php @@ -0,0 +1,74 @@ +page_redir(); +//$userquery->perm_check('view_videos',true); + +$u = $_GET['user']; +$u = $u ? $u : $_GET['userid']; +$u = $u ? $u : $_GET['username']; +$u = $u ? $u : $_GET['uid']; +$u = $u ? $u : $_GET['u']; + +$user = $userquery->get_user_details($u); +$page = mysql_clean($_GET['page']); + +if($user) +{ + assign('u',$user); + assign('p',$userquery->get_user_profile($udetails['userid'])); + + $mode = $_GET['mode']; + + switch($mode) + { + case "collections": + case "uploaded": + default: + { + $limit = create_query_limit($page,config('collection_user_collections')); + assign("the_title",$user['username']." ".lang('collections')); + $collections = get_collections(array("limit"=>$limit,"user"=>$user['userid'])); + $total_rows = get_collections(array("count_only"=>true,"user"=>$user['userid'])); + $total_pages = count_pages($total_rows,config('collection_user_collections')); + } + break; + + case "favorites": + case "fav_collections": + case "favorite": + { + $limit = create_query_limit($page,config('collection_user_favorites')); + assign("the_title",$user['username']." ".lang('favorite')." ".lang('collections')); + $favC = array("user"=>$user['userid'],"limit",$limit); + $collections = $cbcollection->action->get_favorites($favC); + $favC['count_only'] = true; + $total_rows = $cbcollection->action->get_favorites($favC); + $total_pages = count_pages($total_rows,config('collection_user_favorites')); + } + break; + } + + assign('collections',$collections); + + $pages->paginate($total_pages,$page); +} else { + e(lang("usr_exist_err")); + $Cbucket->show_page = false; +} + +if($Cbucket->show_page) +Template('user_collections.html'); +else +display_it(); +?> \ No newline at end of file diff --git a/upload/user_contacts.php b/upload/user_contacts.php new file mode 100644 index 00000000..e48fffdc --- /dev/null +++ b/upload/user_contacts.php @@ -0,0 +1,72 @@ +page_redir(); + + +$u = $_GET['user']; +$u = $u ? $u : $_GET['userid']; +$u = $u ? $u : $_GET['username']; +$u = $u ? $u : $_GET['uid']; +$u = $u ? $u : $_GET['u']; + +$u = mysql_clean($u); +$udetails = $userquery->get_user_details($u); +$page = mysql_clean($_GET['page']); +$get_limit = create_query_limit($page,CLISTPP); + +if($udetails) +{ + assign("u",$udetails); + assign('p',$userquery->get_user_profile($udetails['userid'])); + $mode = $_GET['mode']; + switch($mode) + { + case "contacts": + default: + { + //assign("u",$udetails); + assign('p',$userquery->get_user_profile($udetails['userid'])); + assign('mode',$mode); + assign('friends',$userquery->get_contacts($udetails['userid'],0,"yes")); + } + break; + + case "subscriptions": + { + assign('mode',$mode); + assign('heading',sprintf(lang('user_subscriptions'),$udetails['username'])); + assign('userSubs',$userquery->get_user_subscriptions($udetails['userid'],NULL)); + } + break; + + case "subscribers": + { + assign('mode',$mode); + assign('heading',sprintf(lang('users_subscribers'),$udetails['username'])); + assign('userSubs',$userquery->get_user_subscribers_detail($udetails['userid'],NULL)); + } + break; + } + +}else{ + e(lang("usr_exist_err")); + $Cbucket->show_page = false; +} + + +subtitle(sprintf(lang("users_contacts"),$udetails['username'])); +if($Cbucket->show_page) +Template('user_contacts.html'); +else +display_it(); +?> \ No newline at end of file diff --git a/upload/user_photos.php b/upload/user_photos.php new file mode 100644 index 00000000..1c8e7054 --- /dev/null +++ b/upload/user_photos.php @@ -0,0 +1,74 @@ +page_redir(); +//$userquery->perm_check('view_videos',true); + +$u = $_GET['user']; +$u = $u ? $u : $_GET['userid']; +$u = $u ? $u : $_GET['username']; +$u = $u ? $u : $_GET['uid']; +$u = $u ? $u : $_GET['u']; + +$user = $userquery->get_user_details($u); +$page = mysql_clean($_GET['page']); + +if($user) +{ + assign('u',$user); + assign('p',$userquery->get_user_profile($udetails['userid'])); + + $mode = $_GET['mode']; + + switch($mode) + { + case "photos": + case "uploaded": + default: + { + $limit = create_query_limit($page,config('photo_user_photos')); + assign("the_title",$user['username']." ".lang('photos')); + $photos = get_photos(array("limit"=>$limit,"user"=>$user['userid'])); + $total_rows = get_photos(array("count_only"=>true,"user"=>$user['userid'])); + $total_pages = count_pages($total_rows,config('photo_user_photos')); + } + break; + + case "favorites": + case "fav_photos": + case "favorite": + { + $limit = create_query_limit($page,config('photo_user_favorites')); + assign("the_title",$user['username']." ".lang('Favorite')." ".lang('photos')); + $favP = array("user"=>$user['userid'],"limit",$limit); + $photos = $cbphoto->action->get_favorites($favP); + $favP['count_only'] = true; + $total_rows = $cbphoto->action->get_favorites($favP); + $total_pages = count_pages($total_rows,config('photo_user_favorites')); + } + break; + } + + assign('photos',$photos); + + $pages->paginate($total_pages,$page); +} else { + e(lang("usr_exist_err")); + $Cbucket->show_page = false; +} + +if($Cbucket->show_page) +Template('user_photos.html'); +else +display_it(); +?> \ No newline at end of file diff --git a/upload/user_videos.php b/upload/user_videos.php new file mode 100644 index 00000000..4c980571 --- /dev/null +++ b/upload/user_videos.php @@ -0,0 +1,79 @@ +page_redir(); +$userquery->perm_check('view_videos',true); + +$u = $_GET['user']; +$u = $u ? $u : $_GET['userid']; +$u = $u ? $u : $_GET['username']; +$u = $u ? $u : $_GET['uid']; +$u = $u ? $u : $_GET['u']; + +$udetails = $userquery->get_user_details($u); +$page = mysql_clean($_GET['page']); + +if($udetails) +{ + assign("u",$udetails); + $mode = $_GET['mode']; + + assign("u",$udetails); + assign('p',$userquery->get_user_profile($udetails['userid'])); + + switch($mode) + { + case 'uploads': + case 'videos': + default: + { + $get_limit = create_query_limit($page,config('videos_items_uvid_page')); + assign("the_title",$udetails['username']." videos"); + $videos = get_videos(array('user'=>$udetails['userid'],'limit'=>$get_limit)); + $total_rows = get_videos(array('user'=>$udetails['userid'],'count_only'=>true)); + subtitle(sprintf(lang("users_videos"),$udetails['username'])); + $total_pages = count_pages($total_rows,config('videos_items_uvid_page')); + + } + break; + case 'favorites': + { + $get_limit = create_query_limit($page,config('videos_items_ufav_page')); + assign("the_title",$udetails['username']." favorites"); + $params = array('userid'=>$udetails['userid'],'limit'=>$get_limit); + $videos = $cbvid->action->get_favorites($params); + $params['count_only'] = "yes"; + $total_rows = $cbvid->action->get_favorites($params); + subtitle(sprintf(lang("title_usr_fav_vids"),$udetails['username'])); + $total_pages = count_pages($total_rows,config('videos_items_ufav_page')); + } + } + +Assign('videos', $videos); + + +//Pagination +$pages->paginate($total_pages,$page); + +}else{ + e(lang("usr_exist_err")); + $Cbucket->show_page = false; +} + + + +if($Cbucket->show_page) +Template('user_videos.html'); +else +display_it(); +?> \ No newline at end of file diff --git a/upload/videos.php b/upload/videos.php new file mode 100644 index 00000000..6f0c6e37 --- /dev/null +++ b/upload/videos.php @@ -0,0 +1,108 @@ +page_redir(); +$userquery->perm_check('view_videos',true); + +//Setting Sort +$sort = $_GET['sort']; +$child_ids = ""; + +if($_GET['cat'] && $_GET['cat']!='all') +{ + $childs = $cbvid->get_sub_categories(mysql_clean($_GET['cat'])); + $child_ids = array(); + if($childs) + foreach($childs as $child) + { + $child_ids[] = $child['category_id']; + $subchilds = $childs = $cbvid->get_sub_categories($child['category_id']); + if($subchilds) + foreach($subchilds as $subchild) + { + $child_ids[] = $subchild['category_id']; + } + } + $child_ids[] = mysql_clean($_GET['cat']); +} + +//$vid_cond = array('category'=>$child_ids,'date_span'=>$_GET['time'],'sub_cats'); +//Thanks to florin.mandache +$vid_cond = array('category'=>$child_ids,'date_span'=>mysql_clean($_GET['time']),'sub_cats'); + + +switch($sort) +{ + case "most_recent": + default: + { + $vid_cond['order'] = " date_added DESC "; + } + break; + case "most_viewed": + { + $vid_cond['order'] = " views DESC "; + $vid_cond['date_span_column'] = 'last_viewed'; + } + break; + case "most_viewed": + { + $vid_cond['order'] = " views DESC "; + } + break; + case "featured": + { + $vid_cond['featured'] = "yes"; + } + break; + case "top_rated": + { + $vid_cond['order'] = " rating DESC, rated_by DESC"; + } + break; + case "most_commented": + { + $vid_cond['order'] = " comments_count DESC"; + } + break; +} + +//Getting Video List +$page = mysql_clean($_GET['page']); +$get_limit = create_query_limit($page,VLISTPP); +$vlist = $vid_cond; +$count_query = $vid_cond; +$vlist['limit'] = $get_limit; +$videos = get_videos($vlist); +Assign('videos', $videos); + + +//Collecting Data for Pagination +$vcount = $vid_cond; +$counter = get_counter('video',$count_query); +if(!$counter) +{ + $vcount['count_only'] = true; + $total_rows = get_videos($vcount); + $total_pages = count_pages($total_rows,VLISTPP); + $counter = $total_rows; + update_counter('video',$count_query,$counter); +} + +$total_pages = count_pages($counter,VLISTPP); +//Pagination +$pages->paginate($total_pages,$page); + +subtitle(lang('videos')); +//Displaying The Template +template_files('videos.html'); +display_it(); +?> \ No newline at end of file diff --git a/upload/view_channel.php b/upload/view_channel.php new file mode 100644 index 00000000..36df34ff --- /dev/null +++ b/upload/view_channel.php @@ -0,0 +1,121 @@ +page_redir(); +$userquery->perm_check('view_channel',true); + + +$u = $_GET['user']; +$u = $u ? $u : $_GET['userid']; +$u = $u ? $u : $_GET['username']; +$u = $u ? $u : $_GET['uid']; +$u = $u ? $u : $_GET['u']; +$u = mysql_clean($u); + +$udetails = $userquery->get_user_details($u); +if($udetails) +{ + + //Subscribing User + if($_GET['subscribe']) + { + $userquery->subscribe_user($udetails['userid']); + } + + //Adding Comment + if(isset($_POST['add_comment'])) + { + $userquery->add_comment($_POST['comment'],$udetails['userid']); + } + //Calling view channel functions + call_view_channel_functions($udetails); + + assign("u",$udetails); + + //Getting profile details + $p = $userquery->get_user_profile($udetails['userid']); + assign('p',$p); + + //Checking Profile permissions + + $perms = $p['show_profile']; + if(userid()!=$udetails['userid']) + { + if(($perms == 'friends' || $perms == 'members') && !userid()) + { + e(lang('you_cant_view_profile')); + + if(!has_access('admin_access',true)) + $Cbucket->show_page = false; + }elseif($perms == 'friends' && !$userquery->is_confirmed_friend($udetails['userid'],userid())) + { + e(sprintf(lang('only_friends_view_channel'),$udetails['username'])); + + if(!has_access('admin_access',true)) + $Cbucket->show_page = false; + } + + //Checking if user is not banned by admin + if(userid()) + { + if($userquery->is_user_banned(username(),$udetails['userid'],$udetails['banned_users'])) + { + e(sprintf(lang('you_are_not_allowed_to_view_user_channel'),$udetails['username'])); + assign('isBlocked','yes'); + if(!has_access('admin_access',true)) + $Cbucket->show_page = false; + } + } + } + + + subtitle(sprintf(lang('user_s_channel'),$udetails['username'])); + + //Setting profilte item + $profileItem = $userquery->getProfileItem($udetails['userid'],true); + + assign('profile_item',$profileItem); +}else{ + + if($_GET['seo_diret']!='yes') + { + e(lang("usr_exist_err")); + $Cbucket->show_page = false; + }else{ + header("HTTP/1.0 404 Not Found"); + if(file_exists(LAYOUT."/404.html")) { + template_files('404.html'); + } else { + $data = "404_error"; + if(has_access('admin_access')) + e(sprintf(lang("err_warning"),"404","http://docs.clip-bucket.com/?p=154"),"w"); + e(lang($data)); + } + + display_it(); + exit(); + } +} +add_js(array('jquery_plugs/compressed/jquery.jCarousel.js'=>'view_channel')); + +if($Cbucket->show_page) + Template('view_channel.html'); +else +{ + $Cbucket->show_page = true; + if($udetails) + template_files('blocks/view_channel/user_block.html'); + display_it(); +} +?> \ No newline at end of file diff --git a/upload/view_collection.php b/upload/view_collection.php new file mode 100644 index 00000000..7af803c1 --- /dev/null +++ b/upload/view_collection.php @@ -0,0 +1,73 @@ +page_redir(); + +$c = mysql_clean($_GET['cid']); +$type = mysql_clean($_GET['type']); + +$page = mysql_clean($_GET['page']); +$get_limit = create_query_limit($page,COLLIP); +$order = tbl("collection_items").".ci_id DESC"; + +if($cbcollection->is_viewable($c)) +{ + $param = array("type"=>$type,"cid"=>$c); + $cdetails = $cbcollection->get_collection($c,"AND ".tbl($cbcollection->section_tbl).".type = '$type' "); + + if($cdetails) + { + switch($type) + { + case "videos": + case "video": + case "v": + { + $items = $cbvideo->collection->get_collection_items_with_details($c,$order,$get_limit); + //$count = $cbvideo->collection->get_collection_items_with_details($c,NULL,NULL,TRUE); + } + break; + + case "photos": + case "photo": + case "p": + { + $items = $cbphoto->collection->get_collection_items_with_details($c,$order,$get_limit); + //$count = $cbphoto->collection->get_collection_items_with_details($c,NULL,NULL,TRUE); + } + break; + } + + // Calling nesscary function for view collection + call_view_collection_functions($cdetails[0]); + $total_pages = count_pages($count,COLLIP); + + //Pagination + $pages->paginate($total_pages,$page); + + assign('objects',$items); + assign("c",$cdetails); + assign("type",$type); + assign("cid",$c); + subtitle($cdetails['collection_name']); + } else { + e(lang("collection_not_exists")); + $Cbucket->show_page = false; + } +} else { + $Cbucket->show_page = false; +} + + +template_files('view_collection.html'); +display_it(); +?> \ No newline at end of file diff --git a/upload/view_group.php b/upload/view_group.php new file mode 100644 index 00000000..22228098 --- /dev/null +++ b/upload/view_group.php @@ -0,0 +1,111 @@ +page_redir(); + +$url = mysql_clean($_GET['url']); +$mode = $_GET['mode']; + +$details = $cbgroup->group_details_url($url); + + +if($details) +{ + $shouldView = $cbgroup->is_viewable($details); + if(!$shouldView) + $Cbucket->show_page = false; + else + { + assign('isviewable',$shouldView); + if(isset($_POST['update_group'])) + { + //pr($_POST,true); + $_POST['group_id'] = $details['group_id']; + $cbgroup->update_group(); + $details = $cbgroup->get_group_details($details['group_id']); + } + //Joining Group + if($_GET['join']) + $cbgroup->join_group($details['group_id'],userid()); + //Leaving + if($_GET['leave']) + $cbgroup->leave_group($details['group_id'],userid()); + + //adding group topic + if(isset($_POST['add_topic'])) + { + $array = $_POST; + $array['group_id'] = $details['group_id']; + $cbgroup->add_topic($array); + if(!error()) $_POST = NULL; + } + + // Sending invitations + if(isset($_POST['invite_friends'])) + $cbgroup->invite_members($_POST['friend'],$details['group_id']); + + //Adding videos to group + if(isset($_POST['add_videos'])) + { + + $total = count($usr_vids); + for($i=0;$i<$total;$i++) + { + $videoid = $usr_vids[$i]['videoid']; + if($_POST['check_video_'.$videoid]=='yes') + $cbgroup->add_group_video($videoid,$details['group_id'],false); + else + $cbgroup->remove_group_video($videoid,$details['group_id'],false); + } + //Update Group Total Videos + $cbgroup->update_group_videos_count($details['group_id']); + + $eh->flush_msg(); + e(lang("sel_vids_updated"),"m"); + } + + //Calling all functions when a topic is called + call_view_group_functions($details); + + switch($mode) + { + case 'view_topics': + { + if($_GET['topic_action'] == "delete") + { + if(!empty($_GET['topic_id'])) { + $tid = $_GET['topic_id']; + $cbgroup->delete_topic($tid); + } + } + } + break; + } + + //Getting list of topics + $topics = $cbgroup->get_topics(array('group'=>$details['group_id'])); + assign('topics',$topics); + assign('mode',$mode); + assign('group',$details); + } + subtitle($details['group_name']); +}else +{ + e(lang("grp_exist_error")); + $Cbucket->show_page = false; +} + + +template_files('view_group.html'); +display_it(); +?> \ No newline at end of file diff --git a/upload/view_group_members.php b/upload/view_group_members.php new file mode 100644 index 00000000..371d23ad --- /dev/null +++ b/upload/view_group_members.php @@ -0,0 +1,33 @@ +page_redir(); + +$url = mysql_clean($_GET['url']); + + +$details = $cbgroup->group_details_url($url); +assign('group',$details); + +if($details) +{ + //Getting List of all videos + $videos = $cbgroup->get_members($details['group_id'],"yes"); + assign("users",$videos); + assign("mode","view_members"); + subtitle($details['group_name']); +} + +template_files('view_group.html'); +display_it(); +?> \ No newline at end of file diff --git a/upload/view_group_videos.php b/upload/view_group_videos.php new file mode 100644 index 00000000..9b4f9c37 --- /dev/null +++ b/upload/view_group_videos.php @@ -0,0 +1,44 @@ +page_redir(); + +$url = mysql_clean($_GET['url']); + + +$details = $cbgroup->group_details_url($url); +assign('group',$details); + +if($details) +{ + ///Getting User Videos + $page = mysql_clean($_GET['page']); + $get_limit = create_query_limit($page,28); + + //Getting List of all videos + $videos = $cbgroup->get_group_videos($details['group_id'],"yes",$get_limit); + + $total_rows = $details['total_videos']; + $total_pages = count_pages($total_rows,28); + //Pagination + $pages->paginate($total_pages,$page); + + + assign("videos",$videos); + assign("mode","view_videos"); + subtitle($details['group_name']); +} + +template_files('view_group.html'); +display_it(); +?> \ No newline at end of file diff --git a/upload/view_item.php b/upload/view_item.php new file mode 100644 index 00000000..5ca7d12f --- /dev/null +++ b/upload/view_item.php @@ -0,0 +1,115 @@ +is_viewable($cid)) +{ + if(empty($item)) + header('location:'.BASEURL); + else + { + if(empty($type)) + header('location:'.BASEURL); + else + { + assign('type',$type); + $param = array("type"=>$type,"cid"=>$cid); + $cdetails = $cbcollection->get_collections($param); + $collect = $cdetails[0]; + switch($type) + { + case "videos": + case "v": + { + global $cbvideo; + $video = $cbvideo->get_video($item); + + if(video_playable($video)) + { + //Getting list of collection items + $page = mysql_clean($_GET['page']); + $get_limit = create_query_limit($page,20); + $order = tbl("collection_items").".ci_id DESC"; + + $items = $cbvideo->collection->get_collection_items_with_details($cid,$order,$get_limit); + assign('items',$items); + + assign('open_collection','yes'); + $info = $cbvideo->collection->get_collection_item_fields($cid,$video['videoid'],'ci_id,collection_id'); + if($info) + { + $video = array_merge($video,$info[0]); + increment_views($video['videoid'],'video'); + + assign('object',$video); + assign('user',$userquery->get_user_details($video['userid'])); + assign('c',$collect); + + subtitle($video['title']); + + } else { + e(lang("item_not_exist")); + $Cbucket->show_page = false; + } + } else { + e(lang("item_not_exist")); + $Cbucket->show_page = false; + } + + + } + break; + + case "photos": + case "p": + { + global $cbphoto; + $photo = $cbphoto->get_photo($item); + if($photo) + { + $info = $cbphoto->collection->get_collection_item_fields($cid,$photo['photo_id'],'ci_id'); + if($info) + { + $photo = array_merge($photo,$info[0]); + increment_views($photo['photo_id'],'photo'); + + assign('object',$photo); + assign('user',$userquery->get_user_details($photo['userid'])); + assign('c',$collect); + + subtitle($photo['photo_title'].' « '.$collect['collection_name']); + } else { + e(lang("item_not_exist")); + $Cbucket->show_page = false; + } + } else { + e(lang("item_not_exist")); + $Cbucket->show_page = false; + } + } + break; + } + + } + } +} else + $Cbucket->show_page = false; + +template_files('view_item.html'); +display_it(); +?> \ No newline at end of file diff --git a/upload/view_page.php b/upload/view_page.php new file mode 100644 index 00000000..146725f8 --- /dev/null +++ b/upload/view_page.php @@ -0,0 +1,31 @@ +page_redir(); + +$pid = $_GET['pid']; +$pid = mysql_clean($pid); + +$page = $cbpage->get_page($pid); +if($page) +{ + assign('page',$page); + subtitle($page['page_title']); +}else{ + e(lang("page_doesnt_exist")); + $Cbucket->show_page = false; +} + +//Displaying The Template +template_files('view_page.html'); +display_it(); +?> \ No newline at end of file diff --git a/upload/view_topic.php b/upload/view_topic.php new file mode 100644 index 00000000..9d43ec6b --- /dev/null +++ b/upload/view_topic.php @@ -0,0 +1,41 @@ +page_redir(); + +$tid = $_GET['tid']; +$tid = mysql_clean($tid); + +$tdetails = $cbgroup->get_topic_details($tid); + +if($tdetails) +{ + $grp_details = $cbgroup->get_group_details($tdetails['group_id']); + if($grp_details['post_type'] == 1 && !$cbgroup->is_member(userid(),$grp_details['group_id'],TRUE)) { + if($cbgroup->is_member(userid(),$grp_details['group_id'])) + e(lang("view_tp_inactive_user")); + else + e(lang("view_tp_join")); + $Cbucket->show_page = false; + } else { + assign('group',$grp_details); + assign('topic',$tdetails); + subtitle($grp_details['group_name']); + //Calling all functions when a topic is called + call_view_topic_functions($tdetails); + } +} + +template_files('view_topic.html'); +display_it(); +?> \ No newline at end of file diff --git a/upload/watch_video.php b/upload/watch_video.php new file mode 100644 index 00000000..79577cdc --- /dev/null +++ b/upload/watch_video.php @@ -0,0 +1,82 @@ +perm_check('view_video',true); +$pages->page_redir(); + +//Getting Video Key +$vkey = @$_GET['v']; +$vkey = mysql_clean($vkey); + +$vdo = $cbvid->get_video($vkey); +assign('vdo',$vdo); +if(video_playable($vdo)) +{ + + /** + * Please check http://code.google.com/p/clipbucket/issues/detail?id=168 + * for more details about following code + */ + + if(SEO=='yes') + { + //Checking if Video URL is Exactly What we have created + $vid_link = videoLink($vdo); + $vid_link_seo = explode('/',$vid_link); + $vid_link_seo = $vid_link_seo[count($vid_link_seo) -1 ]; + + //What we are getting + $server_link = $_SERVER['REQUEST_URI']; + $server_link_seo = explode('/',$server_link); + $server_link_seo = $server_link_seo[count($server_link_seo) -1 ]; + + //Now finally Checking if both are equal else redirect to new link + if($vid_link_seo != $server_link_seo) + { + /*//Redirect to valid link leaving mark 301 Permanent Redirect + header ('HTTP/1.1 301 Moved Permanently'); + header ('Location: '.$vid_link); + exit();*/ + } + + } + + //Checking for playlist + $pid = $_GET['play_list']; + if(!empty($pid)) + { + $plist = $cbvid->action->get_playlist($pid,userid()); + if($plist) + $_SESSION['cur_playlist'] = $pid; + } + //Calling Functions When Video Is going to play + call_watch_video_function($vdo); + + subtitle($vdo['title']); + +}else + $Cbucket->show_page = false; + +//Return category id without '#' +$v_cat = $vdo['category']; +if($v_cat[2] =='#') { +$video_cat = $v_cat[1]; +}else{ +$video_cat = $v_cat[1].$v_cat[2];} +$vid_cat = str_replace('%#%','',$video_cat); +assign('vid_cat',$vid_cat); + + +//Displaying The Template +template_files('watch_video.html'); +display_it(); +?> \ No newline at end of file
    +
    {$group.group_name}
    +
    + +
    + {if $usr_vids} +
    {lang code='grp_add_vdo_msg'}
    +
    + + {foreach from=$usr_vids item=video} + {if $cbgroup->is_group_video($video.videoid,$group.group_id)} + {assign var='check_this' value='yes'} + {else} + {assign var='check_this' value=''} + {/if} + {include file="$style_dir/blocks/video.html" video=$video display_type='add_type'} + {/foreach} + +
    + {include file="$style_dir/blocks/pagination.html"} +
    + +
    +
    + + {else} +
    {lang code='you_dont_have_any_videos'}
    + {/if} + +
    +
    +