From 6a73f4354f300b9377cefd9d114bbe5e8db8ea12 Mon Sep 17 00:00:00 2001 From: Nikolai R Kristiansen Date: Mon, 15 Sep 2014 21:54:26 +0200 Subject: [PATCH] Plugins update --- .../google-calendar-events/admin/add.php | 376 ------ .../google-calendar-events/admin/delete.php | 39 - .../google-calendar-events/admin/edit.php | 389 ------ .../google-calendar-events/admin/main.php | 120 -- .../google-calendar-events/admin/refresh.php | 40 - .../assets/banner-772x250.jpg | Bin 0 -> 65178 bytes .../assets/gcal-icon-16x16.png | Bin 0 -> 4474 bytes .../assets/icon-128x128.png | Bin 0 -> 10900 bytes .../assets/icon-256x256.png | Bin 0 -> 18985 bytes .../class-google-calendar-events-admin.php | 158 +++ .../class-google-calendar-events.php | 223 ++++ .../google-calendar-events/css/admin.css | 52 + .../css/gce-old-style.css | 28 - .../google-calendar-events/css/gce-style.css | 425 +++---- .../css/images/animated-overlay.gif | Bin 0 -> 1738 bytes .../css/images/ui-bg_flat_0_aaaaaa_40x100.png | Bin 0 -> 212 bytes .../images/ui-bg_flat_75_ffffff_40x100.png | Bin 0 -> 208 bytes .../images/ui-bg_glass_55_fbf9ee_1x400.png | Bin 0 -> 335 bytes .../images/ui-bg_glass_65_ffffff_1x400.png | Bin 0 -> 207 bytes .../images/ui-bg_glass_75_dadada_1x400.png | Bin 0 -> 262 bytes .../images/ui-bg_glass_75_e6e6e6_1x400.png | Bin 0 -> 262 bytes .../images/ui-bg_glass_95_fef1ec_1x400.png | Bin 0 -> 332 bytes .../ui-bg_highlight-soft_75_cccccc_1x100.png | Bin 0 -> 280 bytes .../css/images/ui-icons_222222_256x240.png | Bin 0 -> 6922 bytes .../css/images/ui-icons_2e83ff_256x240.png | Bin 0 -> 4549 bytes .../css/images/ui-icons_454545_256x240.png | Bin 0 -> 6992 bytes .../css/images/ui-icons_888888_256x240.png | Bin 0 -> 6999 bytes .../css/images/ui-icons_cd0a0a_256x240.png | Bin 0 -> 4549 bytes .../css/jquery-ui-1.10.4.custom.min.css | 7 + .../google-calendar-events.php | 779 +----------- .../google-calendar-events/inc/gce-feed.php | 248 ---- .../google-calendar-events/inc/gce-parser.php | 355 ------ .../inc/upgrade-notice.php | 31 - .../includes/admin/admin-functions.php | 62 + .../includes/admin/upgrade.php | 261 ++++ .../includes/class-gce-display.php | 259 ++++ .../class-gce-event.php} | 1068 +++++++++-------- .../includes/class-gce-feed.php | 273 +++++ .../includes/gce-feed-cpt.php | 289 +++++ .../includes/misc-functions.php | 117 ++ .../{inc => includes}/php-calendar.php | 175 +-- .../includes/register-settings.php | 157 +++ .../includes/shortcodes.php | 79 ++ .../google-calendar-events/js/admin.js | 41 + .../js/gce-admin-script.js | 29 - .../google-calendar-events/js/gce-script.js | 101 +- .../google-calendar-events/js/jquery-qtip.js | 28 +- .../languages/google-calendar-events-de_DE.mo | Bin 34661 -> 0 bytes .../languages/google-calendar-events-de_DE.po | 1016 ---------------- .../languages/google-calendar-events-hu_HU.mo | Bin 14084 -> 0 bytes .../languages/google-calendar-events-hu_HU.po | 500 -------- .../languages/google-calendar-events.pot | 1053 ---------------- .../google-calendar-events/license.txt | 627 +++++----- .../plugins/google-calendar-events/readme.txt | 380 +++--- .../google-calendar-events/screenshot-1.jpg | Bin 22609 -> 0 bytes .../google-calendar-events/screenshot-1.png | Bin 0 -> 39398 bytes .../google-calendar-events/screenshot-2.jpg | Bin 22381 -> 0 bytes .../google-calendar-events/screenshot-2.png | Bin 0 -> 16542 bytes .../google-calendar-events/screenshot-3.jpg | Bin 28653 -> 0 bytes .../google-calendar-events/screenshot-3.png | Bin 0 -> 58284 bytes .../google-calendar-events/screenshot-4.png | Bin 0 -> 77672 bytes .../google-calendar-events/screenshot-5.png | Bin 0 -> 133765 bytes .../google-calendar-events/screenshot-6.png | Bin 0 -> 41717 bytes .../google-calendar-events/screenshot-7.png | Bin 0 -> 45823 bytes .../google-calendar-events/uninstall.php | 93 +- .../views/admin/admin.php | 39 + .../views/admin/display-options-meta.php | 112 ++ .../views/admin/gce-feed-meta-display.php | 230 ++++ .../views/admin/gce-feed-sidebar-help.php | 27 + .../{ => views}/admin/timezone-choices.php | 872 +++++++------- .../google-calendar-events/views/widgets.php | 198 +++ .../widget/gce-widget.php | 242 ---- .../user-role-editor/css/ure-admin.css | 5 + .../includes/class-ure-lib.php | 82 +- .../includes/class-user-role-editor.php | 10 +- .../plugins/user-role-editor/js/ure-js.js | 60 +- .../plugins/user-role-editor/lang/ure-ca.mo | Bin 8579 -> 8579 bytes .../plugins/user-role-editor/lang/ure-ca.po | 484 +++++--- .../user-role-editor/lang/ure-es_ES.mo | Bin 10276 -> 10276 bytes .../user-role-editor/lang/ure-es_ES.po | 336 +++--- .../user-role-editor/lang/ure-fa_IR.mo | Bin 18396 -> 18396 bytes .../user-role-editor/lang/ure-fa_IR.po | 336 +++--- .../user-role-editor/lang/ure-he_IL.mo | Bin 10079 -> 10079 bytes .../user-role-editor/lang/ure-he_IL.po | 348 +++--- .../user-role-editor/lang/ure-id_ID.mo | Bin 13142 -> 13142 bytes .../user-role-editor/lang/ure-id_ID.po | 336 +++--- .../user-role-editor/lang/ure-ru_RU.mo | Bin 19925 -> 20491 bytes .../user-role-editor/lang/ure-ru_RU.po | 335 +++--- .../user-role-editor/lang/ure-tr_TR.mo | Bin 9208 -> 9208 bytes .../user-role-editor/lang/ure-tr_TR.po | 336 +++--- .../plugins/user-role-editor/lang/ure.mo | Bin 554 -> 554 bytes .../plugins/user-role-editor/lang/ure.pot | 335 +++--- .../plugins/user-role-editor/readme.txt | 10 + .../plugins/user-role-editor/screenshot-1.png | Bin 170393 -> 149460 bytes .../user-role-editor/user-role-editor.php | 4 +- wp-content/themes/aktiv2014/index.php | 2 +- 96 files changed, 6385 insertions(+), 8232 deletions(-) delete mode 100644 wp-content/plugins/google-calendar-events/admin/add.php delete mode 100644 wp-content/plugins/google-calendar-events/admin/delete.php delete mode 100644 wp-content/plugins/google-calendar-events/admin/edit.php delete mode 100644 wp-content/plugins/google-calendar-events/admin/main.php delete mode 100644 wp-content/plugins/google-calendar-events/admin/refresh.php create mode 100644 wp-content/plugins/google-calendar-events/assets/banner-772x250.jpg create mode 100644 wp-content/plugins/google-calendar-events/assets/gcal-icon-16x16.png create mode 100644 wp-content/plugins/google-calendar-events/assets/icon-128x128.png create mode 100644 wp-content/plugins/google-calendar-events/assets/icon-256x256.png create mode 100644 wp-content/plugins/google-calendar-events/class-google-calendar-events-admin.php create mode 100644 wp-content/plugins/google-calendar-events/class-google-calendar-events.php create mode 100644 wp-content/plugins/google-calendar-events/css/admin.css delete mode 100644 wp-content/plugins/google-calendar-events/css/gce-old-style.css create mode 100644 wp-content/plugins/google-calendar-events/css/images/animated-overlay.gif create mode 100644 wp-content/plugins/google-calendar-events/css/images/ui-bg_flat_0_aaaaaa_40x100.png create mode 100644 wp-content/plugins/google-calendar-events/css/images/ui-bg_flat_75_ffffff_40x100.png create mode 100644 wp-content/plugins/google-calendar-events/css/images/ui-bg_glass_55_fbf9ee_1x400.png create mode 100644 wp-content/plugins/google-calendar-events/css/images/ui-bg_glass_65_ffffff_1x400.png create mode 100644 wp-content/plugins/google-calendar-events/css/images/ui-bg_glass_75_dadada_1x400.png create mode 100644 wp-content/plugins/google-calendar-events/css/images/ui-bg_glass_75_e6e6e6_1x400.png create mode 100644 wp-content/plugins/google-calendar-events/css/images/ui-bg_glass_95_fef1ec_1x400.png create mode 100644 wp-content/plugins/google-calendar-events/css/images/ui-bg_highlight-soft_75_cccccc_1x100.png create mode 100644 wp-content/plugins/google-calendar-events/css/images/ui-icons_222222_256x240.png create mode 100644 wp-content/plugins/google-calendar-events/css/images/ui-icons_2e83ff_256x240.png create mode 100644 wp-content/plugins/google-calendar-events/css/images/ui-icons_454545_256x240.png create mode 100644 wp-content/plugins/google-calendar-events/css/images/ui-icons_888888_256x240.png create mode 100644 wp-content/plugins/google-calendar-events/css/images/ui-icons_cd0a0a_256x240.png create mode 100644 wp-content/plugins/google-calendar-events/css/jquery-ui-1.10.4.custom.min.css delete mode 100644 wp-content/plugins/google-calendar-events/inc/gce-feed.php delete mode 100644 wp-content/plugins/google-calendar-events/inc/gce-parser.php delete mode 100644 wp-content/plugins/google-calendar-events/inc/upgrade-notice.php create mode 100644 wp-content/plugins/google-calendar-events/includes/admin/admin-functions.php create mode 100644 wp-content/plugins/google-calendar-events/includes/admin/upgrade.php create mode 100644 wp-content/plugins/google-calendar-events/includes/class-gce-display.php rename wp-content/plugins/google-calendar-events/{inc/gce-event.php => includes/class-gce-event.php} (74%) create mode 100644 wp-content/plugins/google-calendar-events/includes/class-gce-feed.php create mode 100644 wp-content/plugins/google-calendar-events/includes/gce-feed-cpt.php create mode 100644 wp-content/plugins/google-calendar-events/includes/misc-functions.php rename wp-content/plugins/google-calendar-events/{inc => includes}/php-calendar.php (82%) create mode 100644 wp-content/plugins/google-calendar-events/includes/register-settings.php create mode 100644 wp-content/plugins/google-calendar-events/includes/shortcodes.php create mode 100644 wp-content/plugins/google-calendar-events/js/admin.js delete mode 100644 wp-content/plugins/google-calendar-events/js/gce-admin-script.js delete mode 100644 wp-content/plugins/google-calendar-events/languages/google-calendar-events-de_DE.mo delete mode 100644 wp-content/plugins/google-calendar-events/languages/google-calendar-events-de_DE.po delete mode 100644 wp-content/plugins/google-calendar-events/languages/google-calendar-events-hu_HU.mo delete mode 100644 wp-content/plugins/google-calendar-events/languages/google-calendar-events-hu_HU.po delete mode 100644 wp-content/plugins/google-calendar-events/languages/google-calendar-events.pot delete mode 100644 wp-content/plugins/google-calendar-events/screenshot-1.jpg create mode 100644 wp-content/plugins/google-calendar-events/screenshot-1.png delete mode 100644 wp-content/plugins/google-calendar-events/screenshot-2.jpg create mode 100644 wp-content/plugins/google-calendar-events/screenshot-2.png delete mode 100644 wp-content/plugins/google-calendar-events/screenshot-3.jpg create mode 100644 wp-content/plugins/google-calendar-events/screenshot-3.png create mode 100644 wp-content/plugins/google-calendar-events/screenshot-4.png create mode 100644 wp-content/plugins/google-calendar-events/screenshot-5.png create mode 100644 wp-content/plugins/google-calendar-events/screenshot-6.png create mode 100644 wp-content/plugins/google-calendar-events/screenshot-7.png create mode 100644 wp-content/plugins/google-calendar-events/views/admin/admin.php create mode 100644 wp-content/plugins/google-calendar-events/views/admin/display-options-meta.php create mode 100644 wp-content/plugins/google-calendar-events/views/admin/gce-feed-meta-display.php create mode 100644 wp-content/plugins/google-calendar-events/views/admin/gce-feed-sidebar-help.php rename wp-content/plugins/google-calendar-events/{ => views}/admin/timezone-choices.php (97%) create mode 100644 wp-content/plugins/google-calendar-events/views/widgets.php delete mode 100644 wp-content/plugins/google-calendar-events/widget/gce-widget.php diff --git a/wp-content/plugins/google-calendar-events/admin/add.php b/wp-content/plugins/google-calendar-events/admin/add.php deleted file mode 100644 index 1c58e04..0000000 --- a/wp-content/plugins/google-calendar-events/admin/add.php +++ /dev/null @@ -1,376 +0,0 @@ - -

- - - - - -
- - - http://www.google.com/calendar/feeds/your-email@gmail.com/public/basic. -
- http://www.google.com/calendar/feeds/your-email@gmail.com/private-d65741b037h695ff274247f90746b2ty/basic. -
- - - - - - - -
- - - - -
- - - - -
- - - PHP date format. Leave this blank if you\'d rather stick with the default format for your blog.', GCE_TEXT_DOMAIN ); ?> -
- - - PHP date format. Again, leave this blank to stick with the default.', GCE_TEXT_DOMAIN ); ?> -
- - Default', '', $timezone_list ); - ?> - -
- - - -
- - - -
- -

- -

- - -
- - -

- - -

- - -
-

- - ) -

-

- -

- -

-

- -

-

- - -

- - -
- -

- -
- - - -
- -

- -
- - - -
- - - - -

- -
- - - - -

- -
- -

- -
- - - - -
- - -

- -
- - \ No newline at end of file diff --git a/wp-content/plugins/google-calendar-events/admin/delete.php b/wp-content/plugins/google-calendar-events/admin/delete.php deleted file mode 100644 index 1e43e73..0000000 --- a/wp-content/plugins/google-calendar-events/admin/delete.php +++ /dev/null @@ -1,39 +0,0 @@ - -

- - - - - - \ No newline at end of file diff --git a/wp-content/plugins/google-calendar-events/admin/edit.php b/wp-content/plugins/google-calendar-events/admin/edit.php deleted file mode 100644 index c90a542..0000000 --- a/wp-content/plugins/google-calendar-events/admin/edit.php +++ /dev/null @@ -1,389 +0,0 @@ - -

- - - - - -
- - - http://www.google.com/calendar/feeds/your-email@gmail.com/public/full.', GCE_TEXT_DOMAIN); ?> -
- http://www.google.com/calendar/feeds/your-email@gmail.com/private-d65741b037h695ff274247f90746b2ty/basic.', GCE_TEXT_DOMAIN); ?> -
- - - UNIX timestamp in the text-box.', GCE_TEXT_DOMAIN); ?> -
- - - - -
- - - - -
- - - PHP date format. Leave this blank if you\'d rather stick with the default format for your blog.', GCE_TEXT_DOMAIN); ?> -
- - - PHP date format. Again, leave this blank to stick with the default.', GCE_TEXT_DOMAIN); ?> -
- - - -
- - - -
- - - -
- /> -

- -

- - -
- - -

event display builder guide.', GCE_TEXT_DOMAIN); ?>

- - -
-

event display builder guide)', GCE_TEXT_DOMAIN); ?>

-

- -

- -

-

- -

-

- - -

- - -
- -

- -
- - - -
- -

- -
- - - -
- - - value="on" /> - -

- -
- - - value="on" /> - -

- -
- -

- -
- - - value="on" /> - -
- value="on" /> - -

- -
- - \ No newline at end of file diff --git a/wp-content/plugins/google-calendar-events/admin/main.php b/wp-content/plugins/google-calendar-events/admin/main.php deleted file mode 100644 index 23333b4..0000000 --- a/wp-content/plugins/google-calendar-events/admin/main.php +++ /dev/null @@ -1,120 +0,0 @@ -
-

- - - -

-

- - - -

- - - - - - - - - - - - - - - - - - - - - - - - $event){ ?> - - - - - - - - - -
-  |  |  -
- - - -
-

- - - - - - - - - - - - - - - - - - - - - - - - - -
- google-calendar-events directory) and then enter its URL below.', GCE_TEXT_DOMAIN); ?> -
- -
- -
- value="on" /> -
- -
- -
- -
- -
- -
- value="on" /> -
- -
- value="on" /> -
- -
- value="on" /> -
- -
- - -
\ No newline at end of file diff --git a/wp-content/plugins/google-calendar-events/admin/refresh.php b/wp-content/plugins/google-calendar-events/admin/refresh.php deleted file mode 100644 index b74c32a..0000000 --- a/wp-content/plugins/google-calendar-events/admin/refresh.php +++ /dev/null @@ -1,40 +0,0 @@ - -

-

- - - - - - \ No newline at end of file diff --git a/wp-content/plugins/google-calendar-events/assets/banner-772x250.jpg b/wp-content/plugins/google-calendar-events/assets/banner-772x250.jpg new file mode 100644 index 0000000000000000000000000000000000000000..bbe92b16c236dc08861da4163e425c649117f9f2 GIT binary patch literal 65178 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 literal 0 HcmV?d00001 diff --git a/wp-content/plugins/google-calendar-events/assets/gcal-icon-16x16.png b/wp-content/plugins/google-calendar-events/assets/gcal-icon-16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..6524ff78543ccdac9a98b8c13939a745cfda4f9c GIT binary patch literal 4474 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 literal 0 HcmV?d00001 diff --git a/wp-content/plugins/google-calendar-events/assets/icon-128x128.png b/wp-content/plugins/google-calendar-events/assets/icon-128x128.png new file mode 100644 index 0000000000000000000000000000000000000000..7466b61977cba7182f28b7db713e14462595eb34 GIT binary patch literal 10900 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 literal 0 HcmV?d00001 diff --git a/wp-content/plugins/google-calendar-events/class-google-calendar-events-admin.php b/wp-content/plugins/google-calendar-events/class-google-calendar-events-admin.php new file mode 100644 index 0000000..41de3b0 --- /dev/null +++ b/wp-content/plugins/google-calendar-events/class-google-calendar-events-admin.php @@ -0,0 +1,158 @@ +, Nick Young + * @license GPL-2.0+ + * @link http://philderksen.com + * @copyright 2014 Phil Derksen + */ + + +class Google_Calendar_Events_Admin { + + /** + * Instance of this class. + * + * @since 2.0.0 + * + * @var object + */ + protected static $instance = null; + + protected $version = ''; + + /** + * Slug of the plugin screen. + * + * @since 2.0.0 + * + * @var string + */ + protected $plugin_screen_hook_suffix = null; + + /** + * Initialize the plugin by loading admin scripts & styles and adding a + * settings page and menu. + * + * @since 2.0.0 + */ + private function __construct() { + + $plugin = Google_Calendar_Events::get_instance(); + $this->plugin_slug = $plugin->get_plugin_slug(); + + $this->version = $plugin->get_plugin_version(); + + add_filter( 'plugin_action_links_' . plugin_basename( plugin_dir_path( __FILE__ ) . $this->plugin_slug . '.php' ), array( $this, 'add_action_links' ) ); + + // Setup admin side constants + add_action( 'init', array( $this, 'define_admin_constants' ) ); + + // Add admin styles + add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_admin_styles' ) ); + + // Add admin scripts + add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_admin_scripts' ) ); + + // Add the options page and menu item. + add_action( 'admin_menu', array( $this, 'add_plugin_admin_menu' ), 2 ); + } + + public function add_plugin_admin_menu() { + // Add Help submenu page + $this->plugin_screen_hook_suffix[] = add_submenu_page( + 'edit.php?post_type=gce_feed', + __( 'General Settings', 'gce' ), + __( 'General Settings', 'gce' ), + 'manage_options', + $this->plugin_slug . '_general_settings', + array( $this, 'display_admin_page' ) + ); + } + + public function display_admin_page() { + include_once( 'views/admin/admin.php' ); + } + + /** + * Enqueue scripts for the admin area + * + * @since 2.0.0 + */ + public function enqueue_admin_scripts() { + + wp_enqueue_script( 'jquery' ); + + wp_enqueue_script( 'jquery-ui-datepicker' ); + + wp_enqueue_script( 'gce-admin', plugins_url( 'js/admin.js', __FILE__ ), array( 'jquery' ), $this->version, true ); + } + + /** + * Enqueue styles for the admin area + * + * @since 2.0.0 + */ + public function enqueue_admin_styles() { + + wp_enqueue_style( 'jquery-ui-datepicker-css', plugins_url( 'css/jquery-ui-1.10.4.custom.min.css', __FILE__ ), array(), $this->version ); + + wp_enqueue_style( 'gce-admin', plugins_url( 'css/admin.css', __FILE__ ), array(), $this->version, 'all' ); + } + + /** + * Define constants that will be used throughout admin specific code + * + * @since 2.0.0 + */ + public function define_admin_constants() { + if( ! defined( 'GCE_DIR' ) ) { + define( 'GCE_DIR', dirname( __FILE__ ) ); + } + } + + /** + * Return an instance of this class. + * + * @since 2.0.0 + * + * @return object A single instance of this class. + */ + public static function get_instance() { + + // If the single instance hasn't been set, set it now. + if ( null == self::$instance ) { + self::$instance = new self; + } + + return self::$instance; + } + + /** + * Return plugin name + * + * @since 2.0.0 + */ + public function get_plugin_title() { + return __( 'Google Calendar Events', 'gce' ); + } + + /** + * Add settings action link to the plugins page. + * + * @since 2.0.0 + */ + public function add_action_links( $links ) { + + return array_merge( + array( + 'feeds' => '' . __( 'Feeds', 'gce' ) . '' + //'settings' => '' . __( 'Settings', 'gce' ) . '', + ), + $links + ); + + } +} diff --git a/wp-content/plugins/google-calendar-events/class-google-calendar-events.php b/wp-content/plugins/google-calendar-events/class-google-calendar-events.php new file mode 100644 index 0000000..4307deb --- /dev/null +++ b/wp-content/plugins/google-calendar-events/class-google-calendar-events.php @@ -0,0 +1,223 @@ +, Nick Young + * @license GPL-2.0+ + * @copyright 2014 Phil Derksen + */ + + +class Google_Calendar_Events { + + /** + * Plugin version, used for cache-busting of style and script file references. + * + * @since 2.0.0 + * + * @var string + */ + protected $version = '2.0.1'; + + /** + * Unique identifier for the plugin. + * + * @since 2.0.0 + * + * @var string + */ + protected $plugin_slug = 'google-calendar-events'; + + /** + * Instance of this class. + * + * @since 2.0.0 + * + * @var object + */ + protected static $instance = null; + + /** + * Initialize the plugin by setting localization and loading public scripts + * and styles. + * + * @since 2.0.0 + */ + private function __construct() { + + $this->includes(); + + $old = get_option( 'gce_version' ); + + if( version_compare( $old, $this->version, '<' ) ) { + delete_option( 'gce_upgrade_has_run' ); + } + + if( false === get_option( 'gce_upgrade_has_run' ) ) { + $this->upgrade(); + } + + + $this->setup_constants(); + + add_action( 'wp_enqueue_scripts', array( $this, 'enqueue_public_scripts' ) ); + add_action( 'wp_enqueue_scripts', array( $this, 'enqueue_public_styles' ) ); + + // AJAX + + + // Load plugin text domain + add_action( 'plugins_loaded', array( $this, 'plugin_textdomain' ) ); + + } + + /** + * Load the upgrade file + * + * @since 2.0.0 + */ + private function upgrade() { + include_once( 'includes/admin/upgrade.php' ); + } + + /** + * Setup public constants + * + * @since 2.0.0 + */ + public function setup_constants() { + if( ! defined( 'GCE_DIR' ) ) { + define( 'GCE_DIR', dirname( __FILE__ ) ); + } + + if( ! defined( 'GCE_PLUGIN_SLUG' ) ) { + define( 'GCE_PLUGIN_SLUG', $this->plugin_slug ); + } + } + + /** + * Include all necessary files + * + * @since 2.0.0 + */ + public static function includes() { + global $gce_options; + + // First include common files between admin and public + include_once( 'includes/misc-functions.php' ); + include_once( 'includes/gce-feed-cpt.php' ); + include_once( 'includes/class-gce-feed.php' ); + include_once( 'includes/class-gce-event.php' ); + include_once( 'includes/shortcodes.php' ); + include_once( 'includes/class-gce-display.php' ); + + include_once( 'views/widgets.php' ); + + // Now include files specifically for public or admin + if( is_admin() ) { + // Admin includes + include_once( 'includes/admin/admin-functions.php' ); + } else { + // Public includes + } + + // Setup our main settings options + include_once( 'includes/register-settings.php' ); + + $gce_options = gce_get_settings(); + } + + /** + * Load public facing scripts + * + * @since 2.0.0 + */ + public function enqueue_public_scripts() { + + wp_enqueue_script( $this->plugin_slug . '-qtip', plugins_url( 'js/jquery-qtip.js', __FILE__ ), array( 'jquery' ), $this->version, true ); + wp_enqueue_script( $this->plugin_slug . '-public', plugins_url( 'js/gce-script.js', __FILE__ ), array( 'jquery', $this->plugin_slug . '-qtip' ), $this->version, true ); + + wp_localize_script( $this->plugin_slug . '-public', 'gce', + array( + 'ajaxurl' => admin_url( 'admin-ajax.php' ) + ) ); + } + + /* + * Load public facing styles + * + * @since 2.0.0 + */ + public function enqueue_public_styles() { + wp_enqueue_style( $this->plugin_slug . '-public', plugins_url( 'css/gce-style.css', __FILE__ ), array(), $this->version ); + } + + /** + * Return the plugin slug. + * + * @since 2.0.0 + * + * @return Plugin version variable. + */ + public function get_plugin_slug() { + return $this->plugin_slug; + } + + /** + * Return the plugin version. + * + * @since 1.0.0 + * + * @return Plugin slug variable. + */ + public function get_plugin_version() { + return $this->version; + } + + /** + * Return an instance of this class. + * + * @since 1.0.0 + * + * @return object A single instance of this class. + */ + public static function get_instance() { + + // If the single instance hasn't been set, set it now. + if ( null == self::$instance ) { + self::$instance = new self; + } + + return self::$instance; + } + + /** + * Load the plugin text domain for translation. + * + * @since 2.0.0 + */ + public function plugin_textdomain() { + // Set filter for plugin's languages directory + $gce_lang_dir = dirname( plugin_basename( GCE_MAIN_FILE ) ) . '/languages/'; + $gce_lang_dir = apply_filters( 'gce_languages_directory', $gce_lang_dir ); + + // Traditional WordPress plugin locale filter + $locale = apply_filters( 'plugin_locale', get_locale(), 'gce' ); + $mofile = sprintf( '%1$s-%2$s.mo', 'gce', $locale ); + + // Setup paths to current locale file + $mofile_local = $gce_lang_dir . $mofile; + $mofile_global = WP_LANG_DIR . '/gce/' . $mofile; + + if ( file_exists( $mofile_global ) ) { + load_textdomain( 'gce', $mofile_global ); + } elseif ( file_exists( $mofile_local ) ) { + load_textdomain( 'gce', $mofile_local ); + } else { + // Load the default language files + load_plugin_textdomain( 'gce', false, $gce_lang_dir ); + } + + } +} diff --git a/wp-content/plugins/google-calendar-events/css/admin.css b/wp-content/plugins/google-calendar-events/css/admin.css new file mode 100644 index 0000000..b9052f5 --- /dev/null +++ b/wp-content/plugins/google-calendar-events/css/admin.css @@ -0,0 +1,52 @@ +/** + * Admin CSS file + * + * @package GCE + * @author Phil Derksen , Nick Young + * @license GPL-2.0+ + * @copyright 2014 Phil Derksen + */ + +.gce-meta-control { + margin-bottom: 15px; +} + +.gce-meta-control label { + display: block; + font-weight: bold; +} + +#gce-display-options-wrap .gce-meta-control label { + font-weight: normal; + margin-top: 10px; + margin-bottom: 5px; +} + +#gce-display-options-wrap .gce-meta-control p label { + display: inline; +} + +#gce-display-options-wrap .gce-meta-control label#gce-simple-display-label { + font-weight: bold; + color: #cb4d4d; +} + +.gce-admin-hidden { + display: none; +} + +#gce-display-options-wrap .gce-meta-control span.description { + display: block; + margin-top: 5px; +} + +#gce-display-options-wrap .gce-meta-control span.description p { + margin-top: 5px; +} + +#gce-admin-promo { + background-color: #fcf8e3; + border: 1px solid #faebbe; + color: #8a6d3b; + padding: 15px; +} diff --git a/wp-content/plugins/google-calendar-events/css/gce-old-style.css b/wp-content/plugins/google-calendar-events/css/gce-old-style.css deleted file mode 100644 index 75e343d..0000000 --- a/wp-content/plugins/google-calendar-events/css/gce-old-style.css +++ /dev/null @@ -1,28 +0,0 @@ -.gce-page-grid .gce-calendar th{ - padding:0 !important; -} - -.gce-page-grid .gce-calendar th abbr, -.gce-widget-grid .gce-calendar th abbr{ - border-bottom:none !important; -} - -.gce-page-list .gce-list p{ - margin:0 !important; -} - -.gce-page-list .gce-list ul, -.gce-widget-list .gce-list ul{ - margin:0 !important; - padding:0 !important; -} - -.gce-event-info .gce-tooltip-title{ - margin:5px !important; -} - -.gce-event-info ul{ - padding:0 !important; - margin:5px !important; - list-style-type:none !important; -} \ No newline at end of file diff --git a/wp-content/plugins/google-calendar-events/css/gce-style.css b/wp-content/plugins/google-calendar-events/css/gce-style.css index fd36360..cc8b528 100644 --- a/wp-content/plugins/google-calendar-events/css/gce-style.css +++ b/wp-content/plugins/google-calendar-events/css/gce-style.css @@ -1,203 +1,222 @@ -/* PAGE GRID */ - -.gce-page-grid .gce-calendar .gce-caption{ /* Caption at top of calendar */ - color:#333333; - text-align:center; -} - -.gce-page-grid .gce-calendar{ /* Main calendar table */ - width:100%; - border-collapse:collapse; - border:1px solid #CCCCCC; - color:#CCCCCC; -} - -.gce-page-grid .gce-calendar th{ /* Day headings (S, M etc.) */ - border:1px solid #CCCCCC; - text-align:center; - width:14.29%; - padding:0; -} - -.gce-page-grid .gce-calendar td{ /* Day table cells */ - border:1px solid #CCCCCC; - text-align:center; - height:80px; - vertical-align:middle; - padding:0; -} - -.gce-page-grid .gce-calendar .gce-has-events{ /* Table cells with events */ - color:#333333; - cursor:pointer; -} - -.gce-page-grid .gce-calendar .gce-event-info{ /* Event information */ - display:none; /* Important! */ -} - -.gce-page-grid .gce-calendar .gce-day-number{ /* Day number span */ - font-size:2em; -} - -.gce-page-grid .gce-calendar .gce-today{ /* Table cell that represents today */ - background-color:#DDDDDD; -} - -.gce-page-grid .gce-calendar .gce-next, -.gce-page-grid .gce-calendar .gce-prev{ /* Previous and next month links */ - cursor:pointer; - display:inline-block; - width:3%; -} - -.gce-page-grid .gce-calendar .gce-month-title{ /* Month title */ - display:inline-block; - width:90%; -} - -.gce-page-grid .gce-calendar th abbr{ /* Day letter abbreviation */ - border-bottom:none; -} - -/* PAGE LIST */ - -.gce-page-list .gce-list p{ /* Each piece of information in the list */ - margin:0; -} - -.gce-page-list .gce-list p span, -.gce-page-list .gce-list div span{ /* The text displayed before each piece of info, 'Starts:' for example */ - color:#999999; -} - -.gce-page-list .gce-list .gce-list-event{ /* The event title */ - background-color:#DDDDDD; -} - -.gce-page-list .gce-list .gce-list-title{ /* The title (not the same as event title) */ - font-weight:bold; -} - -.gce-page-list .gce-list ul{ - list-style-type:none; - margin:0; - padding:0; -} - -/* WIDGET GRID */ - -.gce-widget-grid .gce-calendar .gce-caption{ - text-align:center; -} - -.gce-widget-grid .gce-calendar{ /* Main calendar table */ - width:100%; - border:1px solid #CCCCCC; - border-collapse:collapse; -} - -.gce-widget-grid .gce-calendar th{ /* Day headings (S, M etc.) */ - width:14.29%; - border:1px solid #CCCCCC; - text-align:center; -} - -.gce-widget-grid .gce-calendar td{ /* Day table cells */ - color:#CCCCCC; - width:14.29%; - border:1px solid #CCCCCC; - text-align:center; -} - -.gce-widget-grid .gce-calendar .gce-has-events{ /* Table cells with events */ - cursor:pointer; - color:#666666; -} - -.gce-widget-grid .gce-calendar .gce-today{ /* Table cell that represents today */ - background-color:#DDDDDD; -} - -.gce-widget-grid .gce-calendar .gce-event-info{ /* Event information */ - display:none; /* Important! */ -} - -.gce-widget-grid .gce-calendar .gce-next, -.gce-widget-grid .gce-calendar .gce-prev{ /* Prev and next month links */ - cursor:pointer; - display:inline-block; - width:5%; -} - -.gce-widget-grid .gce-calendar .gce-month-title{ /* Month title in caption at top of table */ - display:inline-block; - width:80%; -} - -.gce-widget-grid .gce-calendar th abbr{ /* Day name abbreviations */ - border-bottom:none; -} - -/* WIDGET LIST */ - -.gce-widget-list .gce-list p{ /* Each piece of information in the list */ - margin:0; -} - -.gce-widget-list .gce-list p span, -.gce-widget-list .gce-list div span{ /* The text displayed before each piece of info, 'Starts:' for example */ - color:#999999; -} - -.gce-widget-list .gce-list .gce-list-event{ /* The event title */ - background-color:#DDDDDD; -} - -.gce-widget-list .gce-list .gce-list-title{ /* The title (not the same as event title) */ - font-weight:bold; -} - -.gce-widget-list .gce-list ul{ - list-style-type:none; - margin:0; - padding:0; -} - -/* TOOLTIP */ - -.gce-event-info{ /* Tooltip container */ - background-color:#FFFFFF; - border:1px solid #333333; - max-width:300px; -} - -.gce-event-info .gce-tooltip-title{ /* 'Events on...' text */ - margin:5px; - font-weight:bold; - font-size:1.2em; -} - -.gce-event-info ul{ /* Events list */ - padding:0; - margin:5px; - list-style-type:none; -} - -.gce-event-info ul li{ /* Event list item */ - margin:10px 0 0 0; -} - -.gce-event-info ul li p{ /* Each piece of information */ - margin:0; -} - -.gce-event-info ul li p span, -.gce-event-info ul li div span{ /* The text displayed before each piece of info, 'Starts:' for example */ - color:#999999; -} - -.gce-event-info .gce-tooltip-event{ /* The event title */ - background-color:#DDDDDD; - font-weight:bold; -} \ No newline at end of file +/** + * Public facing CSS file + * + * @package GCE + * @author Phil Derksen , Nick Young + * @license GPL-2.0+ + * @copyright 2014 Phil Derksen + */ + +/* PAGE GRID */ + +.gce-page-grid .gce-calendar .gce-caption{ /* Caption at top of calendar */ + color:#333333; + text-align:center; +} + +.gce-page-grid .gce-calendar{ /* Main calendar table */ + width:100%; + border-collapse:collapse; + border:1px solid #CCCCCC; + color:#CCCCCC; +} + +.gce-page-grid .gce-calendar th{ /* Day headings (S, M etc.) */ + border:1px solid #CCCCCC; + text-align:center; + width:14.29%; + padding:0; +} + +.gce-page-grid .gce-calendar td{ /* Day table cells */ + border:1px solid #CCCCCC; + text-align:center; + height:80px; + vertical-align:middle; + padding:0; +} + +.gce-page-grid .gce-calendar .gce-has-events{ /* Table cells with events */ + color:#333333; + cursor:pointer; +} + +.gce-page-grid .gce-calendar .gce-event-info{ /* Event information */ + display:none; /* Important! */ +} + +.gce-page-grid .gce-calendar .gce-day-number{ /* Day number span */ + font-size:2em; +} + +.gce-page-grid .gce-calendar .gce-today{ /* Table cell that represents today */ + background-color:#DDDDDD; +} + +.gce-page-grid .gce-calendar .gce-next, +.gce-page-grid .gce-calendar .gce-prev{ /* Previous and next month links */ + cursor:pointer; + display:inline-block; + width:5%; + white-space: nowrap; +} + +.gce-page-grid .gce-calendar .gce-prev{ + float: left; +} + +.gce-page-grid .gce-calendar .gce-month-title{ /* Month title */ + display:inline-block; + width:80%; +} + +.gce-page-grid .gce-calendar th abbr{ /* Day letter abbreviation */ + border-bottom:none; +} + +/* PAGE LIST */ + +.gce-page-list .gce-list p{ /* Each piece of information in the list */ + margin:0; +} + +.gce-page-list .gce-list p span, +.gce-page-list .gce-list div span{ /* The text displayed before each piece of info, 'Starts:' for example */ + color:#999999; +} + +.gce-page-list .gce-list .gce-list-event{ /* The event title */ + background-color:#DDDDDD; +} + +.gce-page-list .gce-list .gce-list-title{ /* The title (not the same as event title) */ + font-weight:bold; +} + +.gce-page-list .gce-list ul{ + list-style-type:none; + margin:0; + padding:0; +} + +/* WIDGET GRID */ + +.gce-widget-grid .gce-calendar .gce-caption{ + text-align:center; +} + +.gce-widget-grid .gce-calendar{ /* Main calendar table */ + width:100%; + border:1px solid #CCCCCC; + border-collapse:collapse; +} + +.gce-widget-grid .gce-calendar th{ /* Day headings (S, M etc.) */ + width:14.29%; + border:1px solid #CCCCCC; + text-align:center; +} + +.gce-widget-grid .gce-calendar td{ /* Day table cells */ + color:#CCCCCC; + width:14.29%; + border:1px solid #CCCCCC; + text-align:center; +} + +.gce-widget-grid .gce-calendar .gce-has-events{ /* Table cells with events */ + cursor:pointer; + color:#666666; +} + +.gce-widget-grid .gce-calendar .gce-today{ /* Table cell that represents today */ + background-color:#DDDDDD; +} + +.gce-widget-grid .gce-calendar .gce-event-info{ /* Event information */ + display:none; /* Important! */ +} + +.gce-widget-grid .gce-calendar .gce-next, +.gce-widget-grid .gce-calendar .gce-prev{ /* Prev and next month links */ + cursor:pointer; + display:inline-block; + width:5%; + white-space: nowrap; +} + +.gce-widget-grid .gce-calendar .gce-prev{ + float: left; +} + +.gce-widget-grid .gce-calendar .gce-month-title{ /* Month title in caption at top of table */ + display:inline-block; + width:80%; +} + +.gce-widget-grid .gce-calendar th abbr{ /* Day name abbreviations */ + border-bottom:none; +} + +/* WIDGET LIST */ + +.gce-widget-list .gce-list p{ /* Each piece of information in the list */ + margin:0; +} + +.gce-widget-list .gce-list p span, +.gce-widget-list .gce-list div span{ /* The text displayed before each piece of info, 'Starts:' for example */ + color:#999999; +} + +.gce-widget-list .gce-list .gce-list-event{ /* The event title */ + background-color:#DDDDDD; +} + +.gce-widget-list .gce-list .gce-list-title{ /* The title (not the same as event title) */ + font-weight:bold; +} + +.gce-widget-list .gce-list ul{ + list-style-type:none; + margin:0; + padding:0; +} + +/* TOOLTIP */ + +.gce-event-info{ /* Tooltip container */ + background-color:#FFFFFF; + border:1px solid #333333; + max-width:300px; +} + +.gce-event-info .gce-tooltip-title{ /* 'Events on...' text */ + margin:5px; + font-weight:bold; + font-size:1.2em; +} + +.gce-event-info ul{ /* Events list */ + padding:0; + margin:5px; + list-style-type:none; +} + +.gce-event-info ul li{ /* Event list item */ + margin:10px 0 0 0; +} + +.gce-event-info ul li p{ /* Each piece of information */ + margin:0; +} + +.gce-event-info ul li p span, +.gce-event-info ul li div span{ /* The text displayed before each piece of info, 'Starts:' for example */ + color:#999999; +} + +.gce-event-info .gce-tooltip-event{ /* The event title */ + background-color:#DDDDDD; + font-weight:bold; +} diff --git a/wp-content/plugins/google-calendar-events/css/images/animated-overlay.gif b/wp-content/plugins/google-calendar-events/css/images/animated-overlay.gif new file mode 100644 index 0000000000000000000000000000000000000000..d441f75ebfbdf26a265dfccd670120d25c0a341c GIT binary patch literal 1738 zcmZ|OX;ji_6b5ixNYt8>l?gOuO)6lU%W(mxn(`>1S(XO;u`D+P%xqBvMr|w-Vyr1s z7R|Cn0b8|Hu<=Zmv1mFqh9Fj!NuZfKB2MP$e75`XJ@>=!y!Ux9xR3x;EW!q1^V>X| znVFuRUN`NqJ2)ybXh%e__h!!pv(M|S3+?9F%(K}zyE40MGyhWF5-IDgL&=%2-9`Nk z!1@8uk4t%_{(K~>N;sK&dzJbwJ=$kYTlL=$%#0Pfh>U{%i@~wWbvYsD_K-D`&+u1( z#Ma`>%q<^UhzGvi(hyE`zCD{-=2|zL5>wnB=DE!U?(CZG%q4@lDnCq_%&3DCla#(X zmBhDD+RN$aMWWHm?ig*>1Onn6~r?Ma~N2JKAxN>H%UtRyRqS)6Um!-Tz%-r=& zQmTb^JFIe3W^-kAm`}`2P|niMh>RYyd)S^f(dbrx965?rzbhP|XeP}o&&DSZ4|oYQ z)I{f!SfycYw?3=9W;o-B%U5xs(pP267X~9-7L|4WzaYexC0GtG8wWygm63rF{llCEraxzkc=IxvFQ-y37=_;e5 zJLq^gsSO0Ayz?a>E_?{dmUc+t#qv$)XN8$<<}rQ#)lsiw+pmL&J>~+hgpo>i$m+;l zZIa_ZRIfSeT$~v5d`EBV&*k`apPgjv&B|+d`Q!nyu{L4rs%ZfoF0*Kq8I%ByOcFpL zK=>wzofZo<+0GZLCnWM3oQ^pb(gRSf02;~cEn@LJ>~XB9IkEX{$N#Z`m%>S!U{uPx zloI%bLdo$Adxlh(Uv^yX7s5G&C zLwNRG>~T?G{kzupp8EcyLGPoPf)@&9Wqfw_l&uU-6cexk%5;uQg%wb=0k_733{i#& z1a2p)gV3S2+QG1-K9tZ}E~I<(P0r2aFFY-c{o?TUOz3Xjod#TLE2A_c?*T7t z=1>~%YW450{Qqno4t`}gvLnuMrcu8+#xEBoY%2_+Mb#Z6S38+r*M4O`-+!zl(@m`D zQsi|GA2l3gEy}LFe<#Hv8?$_L#u8E|3-bP$*La*E>B{X!Sy4i6?TKam!49aXCAW4S*P_O^H4^*DpiA40o}Uqw~Eo&veh1`|8i zD2$x+>_b^bXE4N;AW=5>iYak2%!JAh0j1*k1{p#iRCjbB7!cSws~U{1IA@acLII$t z$>X#A+^s6iJ5~DFG!xa?>z{=lxtdi1rzbM-(nqAu3D8h-&64xo6|E!p?pK0xT;qoK z`6%+SpBk+~M?nO}>2mTw!A{yZ6O>Z@kwSd4;8aWU5z!P~tQl?u==^+R`{OmOS}oZh zOXQ3{6kuz?Is^n^L7;9ieB9C+8B{>t+pDrlq4xGDDn#T#3T5$l1g`FTQkU;b-981j zNm{zC`$wn7etklM#qHI4=3m5gwa6DNS{?Z!vSObi_od{4eUo=_S2BKNpkSdiqe(k9WtkeM79;2-%CFbb)aB=&H1?i1}uwFzoZQ(38Kn1zBP ORn*B%u*Wk|4g3!*Rv{Mv literal 0 HcmV?d00001 diff --git a/wp-content/plugins/google-calendar-events/css/images/ui-bg_flat_0_aaaaaa_40x100.png b/wp-content/plugins/google-calendar-events/css/images/ui-bg_flat_0_aaaaaa_40x100.png new file mode 100644 index 0000000000000000000000000000000000000000..4fa0418fc14fb567f0add8925f7a72cedd9f90c0 GIT binary patch literal 212 zcmeAS@N?(olHy`uVBq!ia0vp^8bF-F1SA+{?>A)!QcOwS?k)_>#w|r1Kptm-M`SUO z_5fqIli7AahM1>|V~EA+ zRdP`(kYX@0Ff`FMFx53Q3NbXcGB&g_HPbaPw=yu$<3A5_0zyM>eoAIqC2kGzLFH3` P8W=oX{an^LB{Ts5R)R8q literal 0 HcmV?d00001 diff --git a/wp-content/plugins/google-calendar-events/css/images/ui-bg_flat_75_ffffff_40x100.png b/wp-content/plugins/google-calendar-events/css/images/ui-bg_flat_75_ffffff_40x100.png new file mode 100644 index 0000000000000000000000000000000000000000..cb911e72e407c462b218eea6b286e52c0257f6f8 GIT binary patch literal 208 zcmeAS@N?(olHy`uVBq!ia0vp^8bF-F2qYNp$opRhQcOwS?k)_Bce{j_0C}7R9+AaB z+5?Q;PG;Ky8A6^ejv*T7lYj6t@hpC#;TbB#aBAWwna#KLs)4eqC9V-ADTyViR>?)F zK#IZ0z|ch3z*N`JD8$g%%Gl7#)LhrV+{(b9qvFUM6b-rgDVb@NxHbG#tx*7KVDNPH Kb6Mw<&;$VWc{Gjy literal 0 HcmV?d00001 diff --git a/wp-content/plugins/google-calendar-events/css/images/ui-bg_glass_55_fbf9ee_1x400.png b/wp-content/plugins/google-calendar-events/css/images/ui-bg_glass_55_fbf9ee_1x400.png new file mode 100644 index 0000000000000000000000000000000000000000..44b629d4d92b1aed0d951e2f1043f6999abbd6d2 GIT binary patch literal 335 zcmeAS@N?(olHy`uVBq!ia0vp^j6gI&fCnc6a#?2AmP!?*K(O3p^r= zfwTu0yPeFo12TF&T^vI^j=w#x$i?I+((tf;UXnmgbH|3oY>pC!)f}(GR!16S-u+#{ ze6YEqRkW=8vGl=5qArKM<9}TC-}iEvB{zdaTcX5$wyRTK&ALKYn_7#dp{8(Ntf=^B_@85rDhcx{cMAvZrIGp!Q0hSjpc?LZ9-p00i_ I>zopr00*Ko2mk;8 literal 0 HcmV?d00001 diff --git a/wp-content/plugins/google-calendar-events/css/images/ui-bg_glass_75_dadada_1x400.png b/wp-content/plugins/google-calendar-events/css/images/ui-bg_glass_75_dadada_1x400.png new file mode 100644 index 0000000000000000000000000000000000000000..20fbc66e2f2252acb6a3c76d6b4d65921eafa3f1 GIT binary patch literal 262 zcmeAS@N?(olHy`uVBq!ia0vp^j6gI&0LWmFTHNUZq?nSt-Ch3w7g=q17Rci)@Q5r1 z(jH*!b~4)z#PD=+46!(!T=8puqDZgOs>RXUCGx5b?-VBQkUm|IuXOmYJrBRJgj{Vx zMbNnqUkncy+qa2-mWYc>swkcIuvGK#>(0d)B7)5f`@$Ei28nH~0h*~=;u=wsl30>z zm0Xkxq!^403{7+mOmz*7LJW4nC}Q!>*kaclUgTB88e Oz~JfX=d#Wzp$P!CyiT70 literal 0 HcmV?d00001 diff --git a/wp-content/plugins/google-calendar-events/css/images/ui-bg_glass_95_fef1ec_1x400.png b/wp-content/plugins/google-calendar-events/css/images/ui-bg_glass_95_fef1ec_1x400.png new file mode 100644 index 0000000000000000000000000000000000000000..f595883780eb75b17b6f7ce81d3a209ebb55aa51 GIT binary patch literal 332 zcmeAS@N?(olHy`uVBq!ia0vp^j6gI&fCnc6a#?2AmP!?*K(O3p^r= zfwTu0yPeFo12VciT^vI^j=w#>k(V)1qW$CZ|6)SVV-&*#dav<$DMuV&n0Dbpw@aKYn_7#dp{8(NuK=o*+?85q9nO2Eg1Ai{hNuUM>Pgg&ebxsLQ0G`-#mH+?% literal 0 HcmV?d00001 diff --git a/wp-content/plugins/google-calendar-events/css/images/ui-bg_highlight-soft_75_cccccc_1x100.png b/wp-content/plugins/google-calendar-events/css/images/ui-bg_highlight-soft_75_cccccc_1x100.png new file mode 100644 index 0000000000000000000000000000000000000000..98a24317facedf7c7794da0ed65f64ef646d44cc GIT binary patch literal 280 zcmeAS@N?(olHy`uVBq!ia0vp^j6j?s03;ZUuHXC*q?nSt-Ch3w7g=q17Rci)@Q5r1 z(jH*!b~4)z$cXZEaSV~ToLo`U+vu0Ue0cG9p8hWqa?gxxGLm=1A1u)Cewe3oSeCaf zI$k30UHXoTXA5lSJe(zTcE%W-S*bfB&J`pw9sa4-R?IGW?p~6`>jMSP&M+u3 zY@9al)zrvpHlQu4C9V-ADTyViR>?)FK#IZ0z|ch3z*N`JD8$g%%Gk)tz)07?+{(b9 ia(Y}0iiX_$l+3hB+!{DeJ$nGuz~JfX=d#Wzp$PyZPFk)2 literal 0 HcmV?d00001 diff --git a/wp-content/plugins/google-calendar-events/css/images/ui-icons_222222_256x240.png b/wp-content/plugins/google-calendar-events/css/images/ui-icons_222222_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..c1cb1170c8b3795835b8831ab81fa9ae63b606b1 GIT binary patch literal 6922 zcmZ`;WmH_vmTkHN1c$~6PLSXdG!Wd~-644J0KpoEKyY{W4-dg<+(RQB2-YOHH692$ zJef7`y_xw@_uN|doK?4Wtva>Ot{4q9c^pg%OaK6Yqo^RG1puHty#h|2KYM!0=6gsy z8K9N2ybORo_{i$}QxC&U!O-)`D*V04jXAvq04SIhWh8ZcmyYuM?QKT_N5t*AU(|QC z`lq$EU`=GRI-njZ~u1-;J zSpxW8s+8ZMNsT7C(ScC@%+dXT2`5OBK{NYzHIl}|fVm<#cVSZaTx4gZ#=ndYA?trE z*6TOz8pLN8)cZ%(jWU6016qi+&ST(E3poFxz)GO7?ns4Wd{sg6kxQTmL$*&wk(S=K$M@P?Munwuq zWpM@@uUSqtb(TBVY*0%vp-ci{#N|Bp1#gR2R88&G%GMTNt4dmpUv5q&(y??C+EdGx z^JMZn!W*sC`$Pq%Yy~Hv?6x_%KeSn<0q?>=uGu^SY6-q%nd(JuwichK;boIJ_-fyGyo^c4iY)A4BFhl?YQfV)08Q5_obCJr8fY>U@@(?vtN5m8P`}$qD`_kA>55yU-@P^ZRLJ_laU~!}(Rt(~B z*Pf<2{k90cRH&ln57cc5VTw3tSO#TgPA~;0XZw3MpoF>RcKil}aXxZB{o!lMAco5S zcLq5TI|R6H8NCl?4tr-bwWQr#pSefD;oreJ`lvswaSON4i10%-7mk0?(AG-4immor z9H;RPv``uPMyYGv35PQ3#I&K80$TUcafx9gc$5^QWtc^hKQ^>_pb{zK6I)3dha47l zMOh(I%FYcqR#kVuh}Mk)^S;D)Cxuc!zlK%Dv`iIyE8&+nf*5rtP1BTlyDn^><9K;4 z86HgzNU+-iY)M0k26h`GJbr$2v|jnk6BISCO0}8%9!|oIBbm{1ob>!^6i=MlT|7=*X+;ne9tR&Tj43aU9ArmELhOGSph*ju7e0 zYHszpZ43?at3oE&I`=O4aO;k3@bXQ_KNgrzV&Erv;lH7G_7gT}xW8_3g}$cV)&hx@ zYcUdC{$amhqC{s6*|bQF?YwftfxXdDp3w97O2XZqJ=NlFU1lx+aeT9&2iH2yn07J^ ztU-gzPxI4j#y;Uy{$)I>mqUAdBrF5*7pj+E+*bTTeA=fxIFu=5pGuXB5|)+_+1{r8 zm8$PM6~1?KX=8>&M*M0-XZPlN+&wr&nAHNBaL18_-*@5a^O&O4CPT|wZ3FZnZd-C_ zH%chjeO1Zgy;R2Ck=^a(pJl6MGUyuGHf{?aBrD`Kwg!@e)(OJO8Y`h7o%fL?F#D`N zw01>z0l$1@#M+TJtVZm4=9#)x^#Y(Zl@Ebaem?a_E4>Asn;+5z;n78y2x$|mIz;O> z=LA-DK)*rCDV(<`6`a%5`f$pTt4j6V?re;<6#zlcYS=z~zbMxCn4|Aq`ybn;`Yu(M zRQ7aw=ZAaHH2QDR@p;~L^Ee>-Xs`)p+LnQLdTty4iF-cE$Ip`0&1|%;cot!b=382q zjoCNIppu|H;KaMDM0mG7o<*plHL^)L)BbRn3O93K^U5vlkFT$V*n{J-g=v8HK1iyS zkcDIddGxjI2MhJ*+7Gv159IhVUw>#_3=zn^)~PspO+}59SBd0bC9Yfmh?IbudsuTQ zs>wKH7)IU;lwDck|EfN~QWDkOsu@QFHTkh5@jz->*n>j?y!t-Q25xPj+jMj}qE|L^ zdz)(LOe}E7P|?r?N(=*viyJWUmfwRL*o+Up#fQ*J&V!{MbRu@ASoF4Nl@p4R2!9bJ zR!QjqMZqUY?HLrta{d5Pm)=#eaPlk;$Wm$l%EgbDrB|HE;n+%AL-@KljyJ$BA_iaM zP)Kd7-V-ch+1BL1t>6*m6ZBwdjNj|Fyld1F!?5V>)ldXR>P!Rj3LED89~o@qgh#^3 zKtM4kL=@Dv*QCmt1Bup$INwW$t zL+1r$`czGIu8vi{pV4iS$b6q#J&lwt4t|X@10PiH(e5m&>|mPY|Y-yP{%yD$l=)8rL4gJOpu`d(OFrMe~mjf(@;A$NnP)fU0ZrvGrh5_ zR+kH}c)V1D6I!>%^(53m>chfOlFRwCR6=|mLMblmWoE|kgs%d~H)HWXF|MSZ;o2_} zXoxip6j`P0QN=B~cDr@!Ny#S|(6ZMufMpw&*m_O!&Dzsk0pne$HmbGFW6h>xHpL0$ z^PKoZn-a8}b=lFAzh#=Z&GFFT%|`1$BYV{nbjK7gUq#u^DBp_(fwj`7A>Q4e3i$5gx_ar5~?}| z$Ub&(Fa@w&P3KB4DbMsJCZe}JYcT)=?domj_Rh)E`4#PU_DO`Cgba05#QNE}FioF( z=4Md%aF7NiUxK~b!>ebhc5L^qFwByIXttRI$WT7mp9ikZw?ahlNbP2Ca>QLStmNsM z(!auaRz=i>{(u2B*`{rbsA09d5x7{{z_?Px2h0}Pe2D~p`VlaJ0ES_Thk>=0Rmd3S zYJ5h-tSsZ?2*M(q0V*^3yu+ivH1wBIwn)Zw4qcOPwpKsj#c73oBpt~g@JZl@xaF3p zjp^nk{3z_k9p5BBP@tTLBoD(FE5thlRi{Ke`0dw4x+q_U`=IV7Z27i)h!b{M*PH~O zvP84UTa8k!_`Ve6qw0fXK<<>SsWK2@SAj3bDK!WviJbS^KywBI^3@G#Z6bGw>A)l` zAA-a6kj(}iFX9+o&KZz^9z|pFU@9#Vtqcp^be)t4j2eVO$DsA#jGtLC8C)q?tUev<+IIJeJw3T9Jq6P!x9#p1GC%eb8^%g7!6 z?OZ}**`n3EA`CDV)#}py(4D`5*ptAEAD}=RshDW-m-R z`F&t(TUAhng?~RKl(X|XU0jvrKIhxaj;9yAJf)IDd<|U$T420XAzk6oX*$Au{cOQd zYKnKl`Aj+h$9cvUY@ofkUGFB}1-j%`rnFWpY77eX{szQS;pUo|@Pny%-FjRr_Ph}P ztkuc*^^$OJfH0S1&<8&9HN<|S;_Bk13Sd&{H!grmkE{$UZg#4-ey$jc{p8tsF6!2w z7`t{H-*|Ju7Nm1m*6R`0`WS3{@8D8ZwkC;DU!-W@kL7`q^KhCi_qXF4qELoxv}}t! zhjdI4vD4iOR`iU6<=!d(_Q6*VG3ImELiV0niI9|tyq-8*vfX;O2x&_F*_7=95Q%cD zg_NlR{D?lVr!d@H16ixqJV-g=MHu!%lPcG_qK?OKOf%M=t?)bL+BlQ=I>I-PlwYI| z<9nv1Va@DcVZA$ICZ$ud@3&~a6cu-0v?g&L8;-XXHxMf&#`VZDdh0my=WRtSE&Y;< zVg_7+N=`2pt=<@ea??J{Eo8pV^xkcl5-{y>cEat<*1+zqU+dD*-Jg1CAKeS$qcHW@o|oG89!xPQPd zU=J4_*A#&=u=9@msmvJUmw0|kA;Abe(w2}A7>H21@&B*2Xv#@1)UZ_1d$xdR=0Du(XO=y~j*0KU{3=idQ*cV;P@94qdtTkab}qSRStk zo+LnSpdmLX9#Z+hF1a+r2!UVIgkoiOtHEa4+i+h@1;_N`br*+EPYDDIvIAL;9`fgW zv`3n!m25FWgg%{relJHjtU51_W2G0p+ww`G-U@Nn^$)AGn5R;YH}- zkx2bCjV%Q>D-`$(=xy7mye}|whf8=0p*U|y;s@c3{nM893||#oww%UZ zKGQqQ0mNF-f;|?j+jiJYOcP>u+`YlenadQp5O%s6&_VJyM7x9xowxNLpArM|3nz$W zqvav(0Vew1Cu7%_BPEDk2{Vvh=OCW-FRIfDQR;xNSZ=Uqww6=-hw$Jeo>+WT0KnmlNYsak$hb_KIdXVRrq|4 zc?l!EgE{dGxxYZ+E8~BK2SBtVuHRh|`#D8+iAg8D$Ko*^l`dx{Rx}5xH}$awqp;5^ z!Sjb?OiUDikL(Ag%PyI0zkKmYHH~FQ7P)QGg{VW|i4WHh`CulLA`rhuK6S%n^Q~e8 zGB&(6yFYe{h|U~)r+u3!T?^r}}eT&_*XZsk)gDqoI#goBdqU$eB&8 zADcQBiq`C0s8z}2f24R-qf;lpq5g&SMm1;>_sw1A*VKy&12j49ya&fUirm5+vlz`( zPz+V7TI72^(gP#-&3A4!TVRXUwP_sRH=)Ng(b1O@qu3L<)|}g3&0?{f{sgw05M(5f zfEl$_N3qf~^pkf|C)P#RTMlulrarg046JtX@ezPQ8Au7^WxnrUKcf;<}H4s$6v(9)V1%S6QX+2kM5j_wN&$+H&Ll?PU?h`gC3q=8_Gr}pfn6( zD^qHZLJ|)R9Ni^U0gpI$sh~Sbt`oNlgH*tB%dc|dBJI9SEbHfjVa(dN0vIQ<5489B zUt?1`&EX-;?dI2)ugv&1>#Q2=;~t(t*o-g=&*_OgR6bIl8A$@8&lqNp(u_eX*mukT z@kt{=LVp({=X0XDT9{_0j4hklmuc72Dpr}qTf6dVkHzRWT(_L`dk+e7E5prT{=J7+ zau}%_SG)z*oDcekL5mhi=#Z!wJqlUp=BdY1fjX`H^@0|m#kO=Ozci8%WR%*YFaDk{WIi==sHQdKM-E@nZ~$zoYV{Z$zAr@SXm=Ieg4AiPmFfNJjWYzvFdG zA&;;NZ(4#%_Mm0Y6z5<**tK(1@Fz^J9=6KaPtb7id=(!4(3LBi=!pTkIsw-=m${TB z(u#26e%y8`PZas8ha=O(#@(E-<;+P8}A(sQ|tN^1Y-XY_6{ z4i@bvxR}9%cAo0U4bL#nF8RP{@Vb}iO@(kCmbcx~{SVw#yEH9}&#-l-Q@BB>SM63) z)M8*Q#?r;=@5^PuXzT_+9Iw);!3epn349KNTgXw2BDl^#39d=z40T?)ZeH?j#TWR< zV#2R^_)Br>O6;>UrqGn&SbXGapKO)o>qac~!#5!uLw%~`V?2s}8z1z}lKspGrb(>Q zW!28Hzj|t>gyu;57~@?)?sZ--dTUOT zgPs0iapE~VL7vqWW~T1ynETw ze|$G{1Wj+g$^n`e7_2wkNYt{pviHdQwo*m1pLa=ghj3e}7EV^h=0K($(9ZvciWCNbHa4$!5H} z@Uag+U45D?uq;cWYMb%vf!|+SckQdvN`Hz*nZG)Wu|iV6Eht%=ASH4asU_QSO%V&> zK)P9&^FpxR+ldG$hmRQOv6p6t4D&)pdcqgb1pb9FMGpL3kf2S7AIf>8_5@gljRK0a zuo8%h_4TE&G3_|i8s5kmN5sREEvF^ZpV&;TN}=4aD2EFsm7bNVbW|D;YwS?4zHnOk zRh2=*`eU(1sNXiurRQ-FX-&CUNLT&(^BU3Gm1MX-A#Ry3-5;_0%2QzBK$!bRmR9DD za|pF*NMS730`zczmK)~$ig`Y;iJ{UA_P=mTvIEThFi!YeO={FwGykGpbHhn|wppyS=;NW{OKezi zj!2ZSoc@n7mvY}Y^gR(1mL&a*$(=g3OoVMm6xx^^OnCd6{fh7mACHiAl}_HiQD$Uc zrFFMj=+XE?>Z0qD4*{rUx2f;dx@5j(nsN*OS8cAdS7z1`@!P;TmfUguONB$VdwhK% zos$YG4>4D_?sYd))nMrZb@Ae(!C=;edumLXZ^h~WQh*iL8L7QzF?Z-vu2qt7JdbpS zFf~Wo-1403{&H{q=g0Ys=>hLk#IokWMm?&W^-bk*fc_?<#IrBY6r}2ShlICVkcn{c zdPW(7i&(}tc#oPw25ga|D>6A8Rc`0dT-}~TZxP8Df0p_)yc-j%EA_U!r^X8pCt23Q zi)I*&v@KR({{@KG3Gzy#Qg&#jSDk(PxA>sb2K6WNXBmF>EL?FXyPz(yCvnUh<==#| zQ8MTU8VS>zBhlVdeTVXCxM#c!iv++wbZS7eNcIu#53%vURlwJ;_@D zBDxn|woIw|J7?|q1}EDLG((i=_duGUnx`2+m{fttG2`%ejStF5eEX@wrz&{?7KV8` z&9YImZ&%Z6@NjmzP!{IUan00WfazVIDzm0ryF}hHmFB!n`==y5?-{3R zb-DvwqBJ)Q9&0F+DLhI89+Z}Y#^$uUB-C-MVz6ls7GhBwW>WkFa}wYM}(!*H8ZZ;s71H_{Q&d>X1aCe{>Lo>BgRnjU+x#Iub%bWrCk?Eo8)94 zGN3I@nIw1gGVfjzabx9H+z@G)4<1bDs}yBF7c4twl5_?uWjy}f1szOl^lS+Uaw|cA z*qg|L3HN?s8CLqSeKTRPHf>}sncYz2z-S9R@^7mEAOTC?iE=`egZF42l9-R z2qCk%SD^mlA^bv9^gf%_4@ayP|1p%er#h(hCU%SKh4^t-H9J*ecyEWk(ywYw zi2gO++su-c3H`Za?>+JL;5G*N-UO~Aif+W^i`U&~^k@*}+NLT0jf#X*W_HD&`?Cc* zon5kT9xfLGw084X3;(gEk%G@1gt`R&Z*ja5+oM-BP-u^unAQm-KkNEt9Ok`8EgkiX zNTdGXL+z`l-6wfOB>Hlb9Qr-v%^}%dj6WKcGgamJRvv9_<-rwdBPI&i-=o`j##)=IO5~R!mtE2BOMpe$Ck|v1uyKkgw0yCudF6`J zk$H>43vwO~4vTQ{x8vLxM?C%%nFGj+fEobk8aA1U^E@sd%qN-bCDeC`f6QE%u1n8X%chuzE|55OZ1tEqgxVtWCFJ-41*!|2 zkGcm&d8~?;W9(>R)`2YqEs{B_kylO->cRzZp}AgX3~W01<9zrP9?b2~)D$AGe)9NP z#X#Drknh{m-4Uagtbvz}rI)RUwTJDK0q}D3@NsbSa&YtLaPy1s@rm$ob8riZaC5)1 zfF}Q2fQze*!#ltKKfplDm-8ur{BI*@yT0@CvGlM7NZPns+0rVySlZcY*;?B8xsTb3 QJ~;stWz}Trq%1=J3#jBGg8%>k literal 0 HcmV?d00001 diff --git a/wp-content/plugins/google-calendar-events/css/images/ui-icons_2e83ff_256x240.png b/wp-content/plugins/google-calendar-events/css/images/ui-icons_2e83ff_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..84b601bf0f726bf95801da487deaf2344a32e4b8 GIT binary patch literal 4549 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 F{{S81aohj^ literal 0 HcmV?d00001 diff --git a/wp-content/plugins/google-calendar-events/css/images/ui-icons_454545_256x240.png b/wp-content/plugins/google-calendar-events/css/images/ui-icons_454545_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..b6db1acdd433be80a472b045018f25c7f2cf7e08 GIT binary patch literal 6992 zcmZ{Jbx<76vhMDpfgr(y1`QHmaR~%lf_s1jS=@pJ3$lb=+yex64eoA%#UZ#ua0rVB z4KA18y{BHibKiM?%ydsxclFFS(>*ocgsQ8`;o(r?0000y1$l@j004Yc0Y}*AkG*V$ zv*e=ynJURa0J5d86F477Pd>?iaCwyS|J~jW*uDV(DD4#>Qtv!|9i+qTEablQNm$h= z&CE0X2ukQD(>|w9dGqdIX)YvBF@CS!Mo^03TqmwrllgV%KEo6shFx2oEehu^_cs!f zI;sw@aCA*YlEb$oWY?7%>bM;vUhxUi8np5~I@-VX^5GP5$Q`;Z0hf{15s`~)=nCIT z{KYcN=k)##CFFtF75!TrmQf$AG#Q`<^mG!=GIt&I#)o3-O*Wp{;A<1pI!eg?%2!!r z+zIv$wg$i}8}QOLFS=Xh+Qf4z6c-3wKnenV={H5)s729tL?tzQ^60h+rL#RDkR9~+ z^_M@C6WcitD=p^@wd$vx=;$W_mKfVOT6DDpbQ*tH$WpY5W`$H_qLZA(#re#!6)VtF zU@=7mmXUgOhjUus3l*37VNtNse7@B=>Cbiybh7iER2KOM?LhHBd$Upgt#lg+ZJO>l zxu833ex$XTUzvt!1q~LKA%ec^+*T{O{SPQ(pFDup!nZyM z??tIZc$9{v1Y+SUAeG0mvyl#&=ASO^c8)eTyrwZPrzrpP0P9l?A~{ukG)rOFeYVzq zzu|jZ{LNIs8{QUR*bR_jTemA#oduSf;ShdMO^19Z>hkCO(lWs5*T9y%kfQN0f&ePMv;kDisnr5y%7Wrrkwm3!>`zkB=ovcMAt8MEi~kp?m~ zfWU+~+`1LPuo*U~q+a~EcRcReTnZNxiS+zq!!}lR zeC}vfalp8A^dS5nePlmnMN9rV3866Yi&80me{+~71G`Bj)*jfaXC->#4ZTZKVig!J z1sxFCsdnX?F1@QQ!y+DnQc#eV>Noq!Bo%`R zCQ(53=NDNlW2@k8qW!H~j_$u4zW?zk{Da=f+F198-BsfYtYx*vT12>Pt)AGzy!EVs zB0VwU_wS7GmWz*gW3S&S4eB^Ikb#?0hD)7@zncvPpPsoT6)u8I%Ht5%p9-&@W`@hc zq>oG88M2fHhXn%KZXGzY2F)1UTR-Q#+b_iw#CvyW?X`v|_ZA%MNpC*Dt{+LRUQnfk zJ#pQcGi+Q?`h$vw+Vikh3-*uOV-5153P)ZBY5uhIuNpC?A?bRAZMWn_lu^$clDy-R zkAAPp*&jG%+0HBqQ(;%y7q1e^@eJH5@ngdrb>fH-qIkxR_W}0#N*2|w#hXUD=x0r8 zy;J7sx_ljR@Mt|^G`#6J=g;0tKIqUStGERM$dkQD1x7457!u%4xHiuJPXhk?nT47~qxNz753wpc%qyIWt|2Ng z_jZkTS6_=NSpP0`k-*q*!1RwZ7kAa1iYPUBI`_{S`|0r!((875#MsbVYZpzro`{uf z(1NYO8h`jJw@%C5!ogzs0E3AdeT3r!-m5A%6m)WJd@OVqIw|h!g`c(HYFw{tAtMv7 zf~zrF<(N8g1IBi$`-{PxQGBAk=_oNT7T1q1DM*sgATLMGy?22&M;JYSQcROI(mCZO zrNL>`KU*`J9mvW29TSQ zkoggZFYh@$?q0|Ls(JrF-t`htX7Yi_9`gjWYB?yFY$yG)m>;!D;Qm<7oB`IQ9R!DfGF|6|Lc08UQd%kf4i5$?|TTc-!(vs0SxuxHT<;OjH9i4e{GK~!f`;xI@rxNGkLi8b55(Sd*g+p zGjYqlGqEGPtnp91>kXd2jVuJ>OJu~$i8odw^qZQlVq(9gxX?It0+90@^LE$XUvX3N zYFylu(xzXrg!cz0Z87@>Rw6x%oMv6t3g%g*5|s+smzs5B@4 zQdQajJm^V%qeYzAG{oijbDQ8&j8RHRdk2HC?b zV<;R)jv?Sl!c;LWU_We`Z2jWOd+kH_J@Z$95xP9)r;Ax6!_6saYmjYY5Ks9y`#?!k zN(oS#K)=3{j>W@Q1mz)BlkO5`Z<%b-vMvUXFp7AHB>gGW@fzDRUCUnD!`So=6d|Lx>37E~b1{9RyEuRtrtcuQJ^tUmgo zhb<0OkTo!V02@;9VB8iT-7pVBircZJI_{zQv?gH7!;RKgHSi>Kq}dA!W_^Sl#=qD3 z+`y>QW9Mh)Kx+}|p_#5tl!}lt8|Ut%A7{&Df`k(5UFz^Sxr^&`POLSj#4?sBGE@Io zflPsOi(#MK73=H=>0!Q6?-LnsJiBoV%J;ha!$zCs9vHjNbcB1uI!*6LsM0VJl1w#n z5?fA%styL%3a)f+`4tZgo4#lE(`KyN(YKX|x8Xr>C4LmVGyxeye;oqGOyZrIk-|&2 zH=>-)NFueW{txOInI0Jnh>Fv_pqcb2@>sI>8v+^thI6@@+8peFs$AVKr}Hy7xu*ei zzZKr}$BOlvrC_F*`hU>D5fne(E?~z>+*@ex;50yyJakvscvIIlNy{S#Iu(uHVm&?6 z_3)RW)}4q&837WM>W!rh6^9QPzEl|p7-^Q5j#PJo$hTRj93U>As?(ZBT$$xK*P+0= z%_E)qOWKFt3r__z;xyBA5iV<$X1Ak@)>Nh1rtY%aT)}s>3Cn^Ln*vJD9a+zDnB~1z zs=tYH)ulLW1$s5~MB=Lf-k?YHb(w{y+u?uG(Ni(9`c+vb6HN1Yd%{8v*0`5>Mbq|E z%*ec`G8>KPyaGI(XtBDo{#^BxS@qO&vo|soFnQG3KEWrXDu70Yp^|fwmaALR}Dq>mmq6--TcV!Y%+e{!D*vU9fGS z<%;Ey>wOvVc?qn&@oRaC76jk2xictE><+gzs=!l1?bIh@Gom*TLZu$L_WX|B$26~G z!^+GtV9NzY__{Q|E^PPZC`eDFOfL;BiRPYPdABimd$v_@e zG63JrX4tQK$UbZ4J&&9Rg31G7d#N=dU#s9l2w#YhP&YS2$_a)Jy`D>#pZ4bAm+kPBOTt7`F=X)SbvJ!-6(%(D{u+KCqiJ zRGXraN!wWAdGBZD@S=-~Q!Xj=W$ns`%vFnK^T|l<&L0 zzF7Bc?KnKf0A%D0QiTyl0dcPy%TcSb$9qw7?c=_!DSw`zfME>V7ij#{%VhudH28{o zB55x8hm|#bDh?JaBPy!D^5#_j6%KNs7O1MDTG0$gG+RG&=DPP$Z7Eq>o5QTqBlKM{ zj^|5TOK*)mJW>iw(%AE6x@TT?rCuXBr2nns!2DZ0jlEl_rK11Pvj5PEb;6$B64$f; zERSKwc2z;}!v;6PLa%7PCMhJGW8i+@E7K}jP*->$-&BM7r)M%uguJ3*Z?-Gyn7t>y zlX2%l=&H(;(=~bPefDs?FpX!~vID-_KFsht{e0^=C3~s=l0nFeCDxkqPn%S{T;1}+ z^U0WV=8@02j-Yz`tg4+)X$O%kr*=8Kg)FuQPj0kXW^<1Vev#ZU`V4Wk+$IUdpKUb) zA_@fW>Lvt)rG$PE1PXAZ^+Nm?i#{6T`AW$d z2??rAo9}!(Wd%cbqQ(jLCvX=k4{J}kTh9o-)w`Lz<*y@X9U>0Aq+4ScSd{uv43}>L z9fmRPY!UcoY6o0`0USeBojif~*aKg`lf9lIIa)!gi6BRh8KNLjvUrs;91hLeqNMfS zCQsMu*9PMJRnWW>B;?z-E_w#`b$O1M=!ks8f7%8uYJ5zV zb;bZW_aSz$O%y-~?coWMpn7I_3YtpxTCDF?i7SbIPWAJOUt0~A??@T?@A$N|MeKTq z2HV2r=je7q7CfLiEc=-zX_E8siX%3%b-3(#7t5d+wwN^kB&%sK&3#nEr}z`}huWTw z-a3Q95`#gv;|I&a5zK|hXwC?#MqesKYAoSAA>mbf2=v=88JipZkQESDO_4Ps$kz*|4RJ3yvIWZ(OZC(W-A(zud&mfCZK^;Oi|X%ZRX1hZBT zqnpyTnlv%DBQlFDxy!t{M-l2Xl*0Y9l6-ouT0IY94V$H?@y|jxP{!KLsQjeY)MhU; zRB8L00(@^S1y`)}7ZmBGyr3^6hQ)>|Drp@DQc*@O`bt)$FjkAiFIR-J!9I!)7|YbJ z*6qbWVtG3~rx7*O;o9L3n^rgsEYi$?9HB0seONi*k)4n`wFA-;{p&gOwG}Y*@h)&> z_-g8#>+&|yv>BaL26{Od*MPOvzmx8GU@;c!aw-e=P=hW9Q<&!B{)6h4^iq1Ygnsr- zo+fT7G36pt8>MaZ*E)l9LRgerM@rjlo6ilV1|R|9)XPS@C!8Bm;w6fKDOV=9F{-Up zBpQZC1*Q|aZxzho42Yz~(N!V&AXawORuO{-EV$yGAFpg_WD7IDS7lL>Ig6rEpO3DAu^g-j&ztiixx<2cgQT(plWMHMwg?kpj!iiHLN+#}^m>=I zbNlI`>K~il&*C=+LlPd(HgkH`v{IVAU4(GnChq5-B*) z;$OjD*q;8{KjVAe>{Bn7YQw9A^jCAzbKCS(uX<__ZYp#YUc~*;3`Bsx;;@{QmMFEY z!i&@AvT67wy~hi+nMg8sVemK5s^3C#WCL?2v4OgBUW#uo4x&%KQy=X=&{olMee1*U zOc6w-6bVAzCQuG%yo7@uGq8s2v(dv}QSNSy_#_&t+<-idI-bpVK$@6JE?B4)kEKs+uQfI> zB!h$3d-=Xs_RoXFn?X|KM&-Wq!BWOq^O~xKjMWT<8ECHW>y|gm!V|%I`?=XiQ>7-~ zNL&kxvvV{_+NV`)R%AEI!D?9LY5sN`)*Q7&Ro6LFK4LjCpC&l^Y$^1sDkT0(Y=?PA; zvnObr1IRdBOGnJZ%fn9FE#yM)@?qA5Pb9;+Qqw@R>$as%$@QquyB4&Y0y;a^T;Ryg zB5&=eoyRGGbQeSJvQRXLx-Ej~ zHzi-1nbaQshcckghwHloKb%AEB^iHtwEfDr!B>}KXJYm<{6d=Ok5`07247mGu1Tol zmXG5;+oO>=5yet))qw1u?8xh0gq;xbDeF*<=^5#YYAmpzH;U>>o|7y zGX#Cr;a*1yMqm`yKK*@xTID=-`S2Pq1&TIK80~pa9;K45;Y}PK^H<8-O=+M zg~JK=P)9YRP5cD`AH+4{!~1o2);!I;2YLYfyM6ob9X4p*%it*pF#2Gx2Q;@m(3l$8 zw~IL=5G{TunViCbw!f2#k>zuPzH|EVEY(xP7_NrCYJA6pehay57n3e|3ziZ43S|zI zyeuV>a1F8Li~WL>Y)Kv@x`FvY34o_a&td}LU+va5?;eukqEA}a4wT*b*{)YBLl&WT z;$whurm@d-2&%g`#>tzPsq*AT{n9;?quB4LXc%dj4Y}a&J+AX0RpTY~YMSkpymzvp zce@5k3`B@shWuaKcSI#kiSLMK_rJ)y|IRvkO8-S}H9FO1IgI`pWYyV1 zIj^f>bKh9DF#43)Qn^5&m$*=2x?gZWD`1YIaj-llqtR-tqgOJW`w-nkR=+(M(-TO6 z#)#HO!8gH3K;spVB&3|gJq)he8Y+k<{<5S=iM3Et0shdrf% z04s}TObTG{5JuP^|I^H>;26f8+}M9X)qp7@E8JuT^WwwJ4CC;Dwyg<3KM4H%0gtkN znWhR38|$IQ=m%AjKH!nnFCWaW$TWULM2B`7i39|~KSK7W!%aGUB(S!hn467}0rgW_ z>cZih-~$qNlZU*Rwu3Fe55HFc7CdlrHOm!8LBK4oT9`CHeO?6-Px74);WjWx0nOu_ z08mbu^=6-3IL_=LfF(_i?J>p=ghET<+~F2LT(UwyviW|3BiL~@R>lcpuyb<3>FAZ zkmbGIJ!jwU+aLE<-@aAd=d0V*UG?1rZ7pRYd>VWJ06?UwqVNg;KznQgj&U&`?~3_8 zGLHh?MqOC}08>3;XMB9Z^HMSPeUvKyyp#rAr2qgLKUD=;y`Y7|yihm$-tc~D$9W=G zs$KsH?0L0bDFu}Lv_-8Byl|sU^Fyr4w-ruJ{qi&-r)73d7M0A3qE}E(mwUW%g);Mu z%CD(UI7oWi*)@exJxXw4CgFWb9-_BFs&A_*oPYD&^)RYvJ&4xi`2O-AZJoVbaO|2n zZ@s*A_%%HITLh6Kh{##REa>|@I45#I7(_^I0iYq~0|>C<<~$8x4R~S!P|&Ewa}!p@ zyx{@#cuJGUWZHV5r|&8-ss>-#A3V21192ficY@z$BF;{Fu2AF)pk_xljY@;pushQ_ z-0W8?^5Sw7&!wHuREAa(P%zm-Bp~q@3W1Zgr`n5}_%xftb8@}Rc4lg`4?u~)r}+D8~y!MZhPHlf%HERSaTF*T`sTBYB&!#+@6`1T+jdF zRnZ6@t7W*j6zkj@KBR7T*|JVj6>d7vdwNKbg-w7K|c_r-sJ$5Xkhb zW5L&t(Z{`l(40g&077&Tk}^_9wWo+4_68u*T@gC+RM6Ut#46%-o}~W_#@xud&dOy* zN`@)Pngg1k;ir7r^bfzQofqdk)x!k?r%SsW4KOHXF|w1sZgZo%WIxL&_7G^!=3LFZ z+naJPDbXCcG$#s{gmwmbFvE#$JqvjE(KMLXvP8`Hnu$jh8hVEtfpFeO(7goW72ic@qZ`tGbA*1fBpI)1X{U%_ zF8dce|M~6z6D}XY*mJrKGnu!f%nEUYjM7(g;VkZSjG| zw_IBtV^A~vrbOB5PE_#mC$w&Fjea2Juv(}rznb)0sLC=>bR?i%STt%8cMAo;ixMG* zk}sSsZX{x`+r$nl{eC$x{t|%JM_@rp}w^x@{ON1W&MDsvN?n-~`-&9PJUt*O0Vn*We}MzmHUzW>$-Lzzdg zOafa8Yd_0ljkJVwc)76^L$7bS22V(W@FhL}2A zb(v1FsgC%u-a^SwEwj>O{-#XQm$6AvjO}$krsCWc-37%$Y`KH*|>DL zKnd%O{0Qdc=?Kk0mQQo|au=4xQ^&{EZB+pX2H0|TiTRc=f0!Uma-tQ2sYV&HJv8lx#&dMtO4We+8rk;O4FM zhXyW21Q3ax-ua_=mmGY!9IbS>gq1aTM8?(r!?+R18k#xO)veq(PXRO4_!oF1Tv3nbyn>9h_0)&%U1kh55Vz+rFetsKj zRwM|)v}^8gp)G3w`I~F&g;txw#HFOLp&9@MR};!-&BmJteKTzp{G>uK6Zru{eb{}Y z%`~~)A-_O~+yQ!hzHujuGc)gp2-(-plF+2O=_6qG8{{0pVujRx%-M=!T8gY{#Z#Li zv(YbAQMqyGZFE_1d|Tn>ACL)MIkSw)!B{nVlIP3>L$4Hn4Afe(0k&~edDm~O-TYNQ z-F!f&CM(NrCyOq?%cvtTHX`|-8^V9>e@`XRoZkLmaTZLW28ft8589E7>-aO7_yun1 zyUj(ADq(Lg^|t5O^to=8sx!0j*tS&g?h77#B1i7aPytT4n}VBPI#2VosgdDMCcHXd z=~OvSE@f)_a5ebVMQeKGWi~BL17H{UThZ>qD{trw%IFXYx#n(gN!E)@_U>7k-$L!} z3~}NADQ{^_cA|S?Dq~>pkUT4_ZqR+dcNa7^X!h9#k^MF7KE2oNSvUzjnk7yGfJL9{ z-jJ!NTH4d}chw}rpUKnU6cRc1UtWSlnOi>pRLTKsR|+hDXm+#C7^)-SYzb;$C{;Fk zs>~8+)nphUCVl6_wF<}xCaC3cZDbgd=J9u@jv4ss!8mPikH`q`1-cuwcP z&yz=Yzw2ZH=%O@wrer2o$G%;8PQ{IaN%4?wX5L)G23jblq~g`Ml*tK~sCtc$HavG- zC2u74)g>-Ysb(8SglA8)USXD0wo23JCcET+DqXbc#_^5(#a3j7FGa6^e`khi!c7p> zU|2tYc2Bn>r0V#0k4mg6M}sPrgn!HzoxnP(;njBab~mKK;x+G%c4qtM4)!~#KJ|&; z(Pm@Vwn$-ji#30DqOt-VH>whhLJY^mr_5i1O`lDcpDLvBq1RUA#F`r54sZ(Y)|L$- zjc(lAWlT4`&y1e?aFbc5r+`s-t{UphpuEqECxt2P?D5xEv~Rp|vlFpo-$Swuw3jaR ziCj)A**Bck5&&-B4ZWYmWp5`T3EXH)ok{v;Cl^R@2zhO6 z!S?}GuR~z!jq`v7vkm%KewmdtlW7d7`OihUTQp1FrKCB;0MlA7Ko#fcp2o;7vI}bH zg=GlpqcnLDEcV`44DMpBPIb|PIR@&d8*|F?)vD{|ZgA75+etndI$1ShiX`tyN||+< zbYNimEx^l>Hv@X8J^s1QC_E<@rs~c2y+UdfbuBO5$QLd4`wWA&N` zws@aacvH&KriK~8A2?#DGo`km@SNEg(veO?x!5hgM^jLI zAc6-KP2=IrWB&W_ai_>qFaNmk1)Tw`{=+3Hj05;MM~=?gXkJAbu2RGrPa{a z_$dxvm_n7Y{zqs$rlp|-1sl5C%me7-K6BYs@k4{T9@(!dC*5ru7SrES5D%sl>J@L`rgjV2n1M`_yAcxOT>(XWQ)#c*BIGwW z;Uh2P(BDxz+z5zU!4cnc>DJ29^7S6jYxU}}$@gqrJg8Bn_)1rb+rxX@L)>2PJnGk! zgmBm<%Uv}LeWsYJDYZ?BJ+0FjPCPq)_|oLAQMe9!Yq?HTMI&~W&EO+g9_tKEp9)*g znp1hljDG~_))}zNPTXW=OnH~j_;K+~ec`G0Z^7_l009G&c|zu&t~CnfcJ(z{8^;q% zhWMc-COwXB93$TU78nyT=H}jo#@r2Q5ZTdONrvT-hb57R8Mk_Eh9DcI1wP?mnw1nY ztic`DhdRDr-I_(PIYicn)|}CZQvOU8XV5F)}nF#@6HTsw|iDHwsrxfBkZa9ic(#a3) z3-pT-_g9!AfZFjWIR-WYXwIFFth+jM$dC5OZl$)Zc zFAAo&g26}VX=&TfmeSi`%zsS*5=2XCl`Fnu$v5}NQ zv$6Xv9>%CW9xDld9bN9|;FRpMg9n>obNUb&Co2SJJg2frDsI^dU}XqPYIqaLai2(j zo2QWHnD7@>pOKvF4DeR9p~U7@!!pu~tD_&Zak+C{Vu2wwvHm{rTNJ4a-%6CghY+W= zVsFdkEoBKk;+^CLl-IMhEb&l+vriCuI5#V@fe8MeyWO za6zAlz3J(VZ>FS++Yuk9Di5+_r4_6~m?fA5;rr%4;}t@+d~J~tAJ zI}t13if`D(v?=#y>SLZWl*k}wosI#n2&p4?xH3W)&UVDelm+LwLgs1&T7mCsTy)R& zJH81oc6>8cyCMIG(Wjex?}B|1XyMFg#>~U#nJ8lbaaES)f1i&1o=~F{NJgX{%r0_C94ZkcJky>+< zX=~DK##TB&sG~U8hr_=(9Q@Qr5bzdNZMo%B(PJ!u960!86QU>?`KT?1-_Nr1be3n>Ftv@(9WATydpeFu7emOJl8R zR$-3^li`aoFOvip!_gG($mTD8yhZcCyeEe;I5y>$cM9`_NPOew@}p2MtS75k*!db{ zNXa~Kms4KB=JtJfs4GcjjsXQT4OS~;Jt(mLC^H|ycOpi$fnfe?9sS}62gpL>O!4z` z|HFweukO)WL9^&wOBz>j4p%GZy=R<@XRSM-7ti08IM){J7Jj@`f3(zxq}>ty zJs(5i?l=U6K;}j(c0}VuL0n8uBsRHwZKgLOuUlWk614H4yCYtt`}thR$GrTfgef#0 zlMnFE%KbSXpur?^JpE3{~LbXA0`~QV<9DSFdRA+Uxudj zy(%(`yj44}=wQrYSL(|Yx@!!!NCIC!O_A-$d&%#kwwkpizZ+{-qhu+didG-J6Bos` zI5#Vfw4%Q0?5|(7*$nC{*I8lw+Wb*4+t(0V`%`|sEP*+x6ucS;uIF9DTxDIP33y3e zl=$;I?^4|uW-|q?h&{_9%XY$I@SyrHV?_y5Sa6o;xAdhxEKPh5;$`<2OZtz2Gqq=W zLU&ro+HttGtSG<4e#g6)$Cr0jVT0&E%6B59OiK8H?Uvduju2wgbiOsF#`3E#Iy58MYiz-7x%ZMa$+8w-%heWX|8%D(mca18T z7|EbThNC7eRRspNnaCe)Io&pKutTnQu+}XYg%zC}io(f^x80E)lqN4P)9(%Xeh7uhtuYahWVK8kK^Z5eY6noTl7h2L zegI$aj1bi>+1i%E+Q$k`mzTr%dpc!Rvx|QI6yB3~&h2U5L0LE-QTH~k+g$K8jl!>N z^tLcQdT*|Z9**vUW@O(Nl+i%^Wf&x{Co9`)oE!S6R@=M!?10HtMh9TPW#IFq zrWao@)}HAL=5VdtP)gTg`j=mj3t4!{=+n)_soL%Yyytk=9Z-FskUNlhRSby?w6_IA=vXdEUmgH>PfKgVEK|aR%t-?(I;5}GQT)1siE)~31oDP zTHpYg3HM~3csfrT=jcNg{R`p`k2)-mqquot9INKrWhOO(OLh59NNZ~4lzpMj6k6L~ zLbwA;BcLK;+Q+5zKHwVfrZq2f%}C9Ch;*TQKSO4J1PKVn8S6$*7=}=T0`s99bd$3 zV8%Z%;=UQ}nOlDpl}Uz&q`$3teG$<`8Tm#1tJnuRq44o-TH#LYLSDwxTRx9m@$xHHW(a~UkGYLa z8KJAf(7XInf6#STHuj1w^F)8UA=7d=^7?9jqEE;?jNE)U_5;_8)IdsFiikl!eI*5) zxb}6*|9Go;^jCMZy3;yXBTeNk5-TkXZBtC6oC0Ii(%;7 z{IhoB$jWLfbFBGEl8o|J0c3ucF<@^NlCn~xgh+M7y0}yXT+Bk`kdWAiZ88(^>t`DQ zXPg|c=69SY^6@Rgg7fi2jkK-obqK!QKxz=l$KnubZOh*MQ$vkUAMizrf0xL*(WqVC z{!@j7hLHwyVHCsb^C}T{9YrKLYJE9g{-1I3Kh)4H$&xZmmHl(j)-uaMNLJ+gX53q;z3%Watu14E4+4r7vXEZQO0B^lo za_(k(@}E*}_4U1pf_0n@#h3TzB4Kh?V_M@l=3Um4Ts?fa&Y~UQ+J8$rI}!RwON0xd zfRv1;82uBTi$BKwQNZW%Hq_e5{);mddrfAD!^*J%0_fYQMK@YhLMS%98(|~;CeWbq zJk%+L8p;n6@Os1lT=LKOCuLahw-^+Xx|Xl(m_5OU8f3skDb_3&8*(_yDg%7MM1t;q z7ir$sKOjp1$aSIjZ&Sv)N`U`cTDRR0z00FLwIw{>#-yMEmuL9 zP*TMRx*$QTrh!Wx;D~0}KE$woROV=Lf#yL~+so#D_XEOZ5MU(S;E+{KI`X^>&lu3W zF}BMzZYJqsbGd*nar62CCu7Gc(}fVz^YKU23qM68KRatbdvRMI`$qu~0Pzd*fCP9z z{CXg;xS*goKZpk;Dh>j1SRvE?#lYRu&ec=nGObUhvX0uk5Yug1rarB_5Rks)||))pAy^{{xH72U-9C literal 0 HcmV?d00001 diff --git a/wp-content/plugins/google-calendar-events/css/images/ui-icons_cd0a0a_256x240.png b/wp-content/plugins/google-calendar-events/css/images/ui-icons_cd0a0a_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..ed5b6b0930f672fa08e9b9bdbe5e55370fd1dc30 GIT binary patch literal 4549 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 DTfr$v literal 0 HcmV?d00001 diff --git a/wp-content/plugins/google-calendar-events/css/jquery-ui-1.10.4.custom.min.css b/wp-content/plugins/google-calendar-events/css/jquery-ui-1.10.4.custom.min.css new file mode 100644 index 0000000..ffbd04d --- /dev/null +++ b/wp-content/plugins/google-calendar-events/css/jquery-ui-1.10.4.custom.min.css @@ -0,0 +1,7 @@ +/*! jQuery UI - v1.10.4 - 2014-05-14 +* http://jqueryui.com +* Includes: jquery.ui.core.css, jquery.ui.datepicker.css, jquery.ui.theme.css +* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Verdana%2CArial%2Csans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=cccccc&bgTextureHeader=highlight_soft&bgImgOpacityHeader=75&borderColorHeader=aaaaaa&fcHeader=222222&iconColorHeader=222222&bgColorContent=ffffff&bgTextureContent=flat&bgImgOpacityContent=75&borderColorContent=aaaaaa&fcContent=222222&iconColorContent=222222&bgColorDefault=e6e6e6&bgTextureDefault=glass&bgImgOpacityDefault=75&borderColorDefault=d3d3d3&fcDefault=555555&iconColorDefault=888888&bgColorHover=dadada&bgTextureHover=glass&bgImgOpacityHover=75&borderColorHover=999999&fcHover=212121&iconColorHover=454545&bgColorActive=ffffff&bgTextureActive=glass&bgImgOpacityActive=65&borderColorActive=aaaaaa&fcActive=212121&iconColorActive=454545&bgColorHighlight=fbf9ee&bgTextureHighlight=glass&bgImgOpacityHighlight=55&borderColorHighlight=fcefa1&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=fef1ec&bgTextureError=glass&bgImgOpacityError=95&borderColorError=cd0a0a&fcError=cd0a0a&iconColorError=cd0a0a&bgColorOverlay=aaaaaa&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px +* Copyright 2014 jQuery Foundation and other contributors; Licensed MIT */ + +.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-clearfix{min-height:0}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important}.ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-datepicker{width:17em;padding:.2em .2em 0;display:none}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-datepicker-next-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-prev span,.ui-datepicker .ui-datepicker-next span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width: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}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-widget{font-family:Verdana,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:Verdana,Arial,sans-serif;font-size:1em}.ui-widget-content{border:1px solid #aaa;background:#fff url("images/ui-bg_flat_75_ffffff_40x100.png") 50% 50% repeat-x;color:#222}.ui-widget-content a{color:#222}.ui-widget-header{border:1px solid #aaa;background:#ccc url("images/ui-bg_highlight-soft_75_cccccc_1x100.png") 50% 50% repeat-x;color:#222;font-weight:bold}.ui-widget-header a{color:#222}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default{border:1px solid #d3d3d3;background:#e6e6e6 url("images/ui-bg_glass_75_e6e6e6_1x400.png") 50% 50% repeat-x;font-weight:normal;color:#555}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited{color:#555;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 #999;background:#dadada url("images/ui-bg_glass_75_dadada_1x400.png") 50% 50% repeat-x;font-weight:normal;color:#212121}.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited,.ui-state-focus a,.ui-state-focus a:hover,.ui-state-focus a:link,.ui-state-focus a:visited{color:#212121;text-decoration:none}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active{border:1px solid #aaa;background:#fff url("images/ui-bg_glass_65_ffffff_1x400.png") 50% 50% repeat-x;font-weight:normal;color:#212121}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#212121;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #fcefa1;background:#fbf9ee url("images/ui-bg_glass_55_fbf9ee_1x400.png") 50% 50% repeat-x;color:#363636}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.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}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px}.ui-icon,.ui-widget-content .ui-icon{background-image:url("images/ui-icons_222222_256x240.png")}.ui-widget-header .ui-icon{background-image:url("images/ui-icons_222222_256x240.png")}.ui-state-default .ui-icon{background-image:url("images/ui-icons_888888_256x240.png")}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon{background-image:url("images/ui-icons_454545_256x240.png")}.ui-state-active .ui-icon{background-image:url("images/ui-icons_454545_256x240.png")}.ui-state-highlight .ui-icon{background-image:url("images/ui-icons_2e83ff_256x240.png")}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url("images/ui-icons_cd0a0a_256x240.png")}.ui-icon-blank{background-position:16px 16px}.ui-icon-carat-1-n{background-position:0 0}.ui-icon-carat-1-ne{background-position:-16px 0}.ui-icon-carat-1-e{background-position:-32px 0}.ui-icon-carat-1-se{background-position:-48px 0}.ui-icon-carat-1-s{background-position:-64px 0}.ui-icon-carat-1-sw{background-position:-80px 0}.ui-icon-carat-1-w{background-position:-96px 0}.ui-icon-carat-1-nw{background-position:-112px 0}.ui-icon-carat-2-n-s{background-position:-128px 0}.ui-icon-carat-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-64px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-64px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:0 -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{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}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{border-top-left-radius:4px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-right-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-left-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-right-radius:4px}.ui-widget-overlay{background:#aaa url("images/ui-bg_flat_0_aaaaaa_40x100.png") 50% 50% repeat-x;opacity:.3;filter:Alpha(Opacity=30)}.ui-widget-shadow{margin:-8px 0 0 -8px;padding:8px;background:#aaa url("images/ui-bg_flat_0_aaaaaa_40x100.png") 50% 50% repeat-x;opacity:.3;filter:Alpha(Opacity=30);border-radius:8px} \ No newline at end of file diff --git a/wp-content/plugins/google-calendar-events/google-calendar-events.php b/wp-content/plugins/google-calendar-events/google-calendar-events.php index 754b033..585506d 100644 --- a/wp-content/plugins/google-calendar-events/google-calendar-events.php +++ b/wp-content/plugins/google-calendar-events/google-calendar-events.php @@ -1,719 +1,60 @@ -, Nick Young - * @license GPL-2.0+ - * @link http://philderksen.com - * @copyright 2014 Phil Derksen - * - * @wordpress-plugin - * Plugin Name: Google Calendar Events - * Plugin URI: http://philderksen.com/google-calendar-events-version-2/ - * Description: Parses Google Calendar feeds and displays the events as a calendar grid or list on a page, post or widget. - * Version: 0.7.3.1 - * Author: Phil Derksen - * Author URI: http://philderksen.com - * License: GPL-2.0+ - * License URI: http://www.gnu.org/licenses/gpl-2.0.txt - */ - -define( 'GCE_PLUGIN_NAME', str_replace( '.php', '', basename( __FILE__ ) ) ); -define( 'GCE_TEXT_DOMAIN', 'google-calendar-events' ); -define( 'GCE_OPTIONS_NAME', 'gce_options' ); -define( 'GCE_GENERAL_OPTIONS_NAME', 'gce_general' ); -define( 'GCE_VERSION', '0.7.3' ); - -if ( ! class_exists( 'Google_Calendar_Events' ) ) { - class Google_Calendar_Events { - function __construct() { - - register_activation_hook( __FILE__, array( $this, 'activate_plugin' ) ); - - register_deactivation_hook( __FILE__, array( $this, 'deactivate_plugin' ) ); - - add_action( 'init', array( $this, 'init_plugin' ) ); - add_action( 'wp_ajax_gce_ajax', array( $this, 'gce_ajax' ) ); - add_action( 'wp_ajax_nopriv_gce_ajax', array( $this, 'gce_ajax' ) ); - add_action( 'widgets_init', array( $this, 'add_widget' ) ); - - //No point doing any of this if currently processing an AJAX request - if ( ! defined( 'DOING_AJAX' ) || !DOING_AJAX ) { - add_action( 'admin_menu', array( $this, 'setup_admin' ) ); - add_action( 'admin_init', array( $this, 'init_admin' ) ); - add_action( 'wp_enqueue_scripts', array( $this, 'add_styles' ) ); - add_action( 'wp_enqueue_scripts', array( $this, 'add_scripts' ) ); - add_filter( 'plugin_action_links_' . plugin_basename( __FILE__ ), array( $this, 'add_settings_link' ) ); - add_shortcode( 'google-calendar-events', array( $this, 'shortcode_handler' ) ); - - if( false === get_option( 'gce_show_upgrade_notice' ) ) { - add_action( 'admin_notices', array( $this, 'show_upgrade_notice' ) ); - } - } - } - - // Show an upgrade warning notice to users for the 2.0.0 release - function show_upgrade_notice() { - - if ( ! empty( $_REQUEST['gce-dismiss-install-nag'] ) ) { - add_option( 'gce_show_upgrade_notice', 1 ); - remove_action( 'admin_notices', array( $this, 'show_upgrade_notice' ) ); - return; - } - - include_once( 'inc/upgrade-notice.php' ); - } - - function deactivate_plugin(){ - delete_option( 'gce_show_upgrade_notice' ); - } - - //PHP 5.2 is required (json_decode), so if PHP version is lower then 5.2, display an error message and deactivate the plugin - function activate_plugin(){ - if( version_compare( PHP_VERSION, '5.2', '<' ) ) { - if( is_admin() && ( ! defined('DOING_AJAX') || ! DOING_AJAX ) ) { - require_once ABSPATH . '/wp-admin/includes/plugin.php'; - deactivate_plugins( basename( __FILE__ ) ); - wp_die( 'Google Calendar Events requires the server on which your site resides to be running PHP 5.2 or higher. As of version 3.2, WordPress itself will also have this requirement. You should get in touch with your web hosting provider and ask them to update PHP.

Back to Plugins' ); - } - } - } - - //If any new options have been added between versions, this will update any saved feeds with defaults for new options (shouldn't overwrite anything saved) - function update_settings() { - //If there are some plugin options in the database, but no version info, then this must be an upgrade from version 0.5 or below, so add flag that will provide user with option to clear old transients - if ( get_option( GCE_OPTIONS_NAME ) && ! get_option( 'gce_version' ) ) - add_option( 'gce_clear_old_transients', true ); - - add_option( 'gce_version', GCE_VERSION ); - - add_option( GCE_OPTIONS_NAME ); - add_option( GCE_GENERAL_OPTIONS_NAME ); - - //Get feed options - $options = get_option( GCE_OPTIONS_NAME ); - - if ( ! empty( $options ) ) { - foreach ( $options as $key => $saved_feed_options ) { - $defaults = array( - 'id' => 1, - 'title' => '', - 'url' => '', - 'retrieve_from' => 'today', - 'retrieve_from_value' => 0, - 'retrieve_until' => 'any', - 'retrieve_until_value' => 0, - 'max_events' => 25, - 'date_format' => '', - 'time_format' => '', - 'timezone' => 'default', - 'cache_duration' => 43200, - 'multiple_day' => 'false', - 'display_start' => 'time', - 'display_end' => 'time-date', - 'display_location' => '', - 'display_desc' => '', - 'display_link' => 'on', - 'display_start_text' => 'Starts:', - 'display_end_text' => 'Ends:', - 'display_location_text' => 'Location:', - 'display_desc_text' => 'Description:', - 'display_desc_limit' => '', - 'display_link_text' => 'More details', - 'display_link_target' => '', - 'display_separator' => ', ', - 'use_builder' => 'false', - 'builder' => '' - ); - - //If necessary, copy saved behaviour of old show_past_events and day_limit options into the new from / until options - if ( isset( $saved_feed_options['show_past_events'] ) ) { - if ( 'true' == $saved_feed_options['show_past_events'] ) { - $saved_feed_options['retrieve_from'] = 'month-start'; - } else { - $saved_feed_options['retrieve_from'] = 'today'; - } - } - - if ( isset( $saved_feed_options['day_limit'] ) && '' != $saved_feed_options['day_limit'] ) { - $saved_feed_options['retrieve_until'] = 'today'; - $saved_feed_options['retrieve_until_value'] = (int) $saved_feed_options['day_limit'] * 86400; - } - - //Update old display_start / display_end values - if ( ! isset( $saved_feed_options['display_start'] ) ) - $saved_feed_options['display_start'] = 'none'; - elseif ( 'on' == $saved_feed_options['display_start'] ) - $saved_feed_options['display_start'] = 'time'; - - if( ! isset( $saved_feed_options['display_end'] ) ) - $saved_feed_options['display_end'] = 'none'; - elseif ( 'on' == $saved_feed_options['display_end'] ) - $saved_feed_options['display_end'] = 'time-date'; - - //Merge saved options with defaults - foreach ( $saved_feed_options as $option_name => $option ) { - $defaults[$option_name] = $saved_feed_options[$option_name]; - } - - $options[$key] = $defaults; - } - } - - //Save feed options - update_option( GCE_OPTIONS_NAME, $options ); - - //Get general options - $options = get_option( GCE_GENERAL_OPTIONS_NAME ); - - $defaults = array( - 'stylesheet' => '', - 'javascript' => false, - 'loading' => 'Loading...', - 'error' => 'Events cannot currently be displayed, sorry! Please check back later.', - 'fields' => true, - 'old_stylesheet' => false, - 'save_settings' => true - ); - - $old_stylesheet_option = get_option( 'gce_stylesheet' ); - - //If old custom stylesheet option was set, add it to general options, then delete old option - if( false !== $old_stylesheet_option ) { - $defaults['stylesheet'] = $old_stylesheet_option; - delete_option( 'gce_stylesheet' ); - } elseif ( isset($options['stylesheet'] ) ) { - $defaults['stylesheet'] = $options['stylesheet']; - } - - if ( isset($options['javascript'] ) ) - $defaults['javascript'] = $options['javascript']; - - if ( isset( $options['loading'] ) ) - $defaults['loading'] = $options['loading']; - - if ( isset($options['error'] ) ) - $defaults['error'] = $options['error']; - - if ( isset($options['fields'] ) ) - $defaults['fields'] = $options['fields']; - - if( isset( $options['old_stylesheet'] ) ) - $defaults['old_stylesheet'] = $options['old_stylesheet']; - - if( isset( $options['save_settings'] ) ) - $defaults['save_settings'] = $options['save_settings']; - - //Save general options - update_option( GCE_GENERAL_OPTIONS_NAME, $defaults ); - } - - function init_plugin() { - //Load text domain for i18n - load_plugin_textdomain( GCE_TEXT_DOMAIN, false, dirname( plugin_basename( __FILE__ ) ) . '/languages' ); - } - - //Adds 'Settings' link to main WordPress Plugins page - function add_settings_link( $links ) { - array_unshift( $links, '' . __( 'Settings', GCE_TEXT_DOMAIN ) . '' ); - return $links; - } - - //Setup admin settings page - function setup_admin(){ - global $gce_settings_page; - - $gce_settings_page = add_options_page( 'Google Calendar Events', 'Google Calendar Events', 'manage_options', basename( __FILE__ ), array( $this, 'admin_page' ) ); - - add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_admin_scripts' ) ); - } - - //Add admin JavaScript (to GCE settings page only) - function enqueue_admin_scripts( $hook_suffix ) { - global $gce_settings_page; - - if ( $gce_settings_page == $hook_suffix ) - wp_enqueue_script( 'gce_scripts', WP_PLUGIN_URL . '/' . GCE_PLUGIN_NAME . '/js/gce-admin-script.js', array( 'jquery' ) ); - } - - //Prints admin settings page - function admin_page() { - ?> -
-

- -

- - -
-

-

-

-

-
- - -
-

-

-

-

-

-
-
- update_settings(); - - //If the message about old transients was displayed, check authority and intention, and then either clear transients or clear flag - if ( isset( $_GET['gce_action'] ) && current_user_can( 'manage_options' ) ) { - switch ( $_GET['gce_action'] ) { - case 'clear_old_transients': - check_admin_referer( 'gce_action_clear_old_transients' ); - $this->clear_old_transients(); - add_settings_error( 'gce_options', 'gce_cleared_old_transients', __( 'Old cached data cleared.', GCE_TEXT_DOMAIN ), 'updated' ); - break; - case 'ignore_old_transients': - check_admin_referer( 'gce_action_ignore_old_transients' ); - delete_option( 'gce_clear_old_transients' ); - } - } - - register_setting( 'gce_options', 'gce_options', array( $this, 'validate_feed_options' ) ); - register_setting( 'gce_general', 'gce_general', array( $this, 'validate_general_options' ) ); - - require_once 'admin/add.php'; - require_once 'admin/edit.php'; - require_once 'admin/delete.php'; - require_once 'admin/refresh.php'; - } - - //Clears any expired transients from the database - function clear_old_transients() { - global $wpdb; - - //Retrieve names of all transients - $transients = $wpdb->get_results( "SELECT option_name FROM $wpdb->options WHERE option_name LIKE '%transient%' AND option_name NOT LIKE '%transient_timeout%'" ); - - if ( ! empty( $transients ) ) { - foreach ( $transients as $transient ) { - //Attempt to retrieve the transient. If it has expired, it will be deleted - get_transient( str_replace( '_transient_', '', $transient->option_name ) ); - } - } - - //Remove the flag - delete_option( 'gce_clear_old_transients' ); - } - - //Register the widget - function add_widget() { - require_once 'widget/gce-widget.php'; - return register_widget( 'GCE_Widget' ); - } - - //Check / validate submitted feed options data before being stored - function validate_feed_options( $input ) { - //Get saved options - $options = get_option( GCE_OPTIONS_NAME ); - - if ( isset( $input['submit_delete'] ) ) { - //If delete button was clicked, delete feed from options array and remove associated transients - unset( $options[$input['id']] ); - $this->delete_feed_transients( (int) $input['id'] ); - add_settings_error( 'gce_options', 'gce_deleted', __( sprintf('Feed %s deleted.', absint( $input['id'] ) ), GCE_TEXT_DOMAIN ), 'updated' ); - } elseif ( isset($input['submit_refresh'] ) ) { - //If refresh button was clicked, delete transients associated with feed - $this->delete_feed_transients( (int) $input['id'] ); - add_settings_error( 'gce_options', 'gce_refreshed', __( sprintf('Cached data for feed %s cleared.', absint( $input['id'] ) ), GCE_TEXT_DOMAIN ), 'updated' ); - } else { - //Otherwise, validate options and add / update them - - //Check id is positive integer - $id = absint( $input['id'] ); - //Escape title text - $title = esc_html( $input['title'] ); - //Escape feed url - $url = esc_url( $input['url'] ); - - //Array of valid options for retrieve_from and retrieve_until settings - $valid_retrieve_options = array( 'now', 'today', 'week', 'month-start', 'month-end', 'any', 'date' ); - - $retrieve_from = 'today'; - $retrieve_from_value = 0; - - //Ensure retrieve_from is valid - if( in_array( $input['retrieve_from'], $valid_retrieve_options ) ) { - $retrieve_from = $input['retrieve_from']; - $retrieve_from_value = (int) $input['retrieve_from_value']; - } - - $retrieve_until = 'any'; - $retrieve_until_value = 0; - - //Ensure retrieve_until is valid - if ( in_array( $input['retrieve_until'], $valid_retrieve_options ) ) { - $retrieve_until = $input['retrieve_until']; - $retrieve_until_value = (int) $input['retrieve_until_value']; - } - - //Check max events is a positive integer. If absint returns 0, reset to default (25) - $max_events = ( 0 == absint($input['max_events'] ) ) ? 25 : absint( $input['max_events'] ); - - $date_format = wp_filter_kses( $input['date_format'] ); - $time_format = wp_filter_kses( $input['time_format'] ); - - //Escape timezone - $timezone = esc_html( $input['timezone'] ); - - //Make sure cache duration is a positive integer or 0. If user has typed 0, leave as 0 but if 0 is returned from absint, set to default (43200) - $cache_duration = $input['cache_duration']; - if ( '0' != $cache_duration ) - $cache_duration = ( 0 == absint( $cache_duration ) ) ? 43200 : absint( $cache_duration ); - - $multiple_day = ( isset( $input['multiple_day'] ) ) ? 'true' : 'false'; - - $display_start = esc_html( $input['display_start'] ); - $display_end = esc_html( $input['display_end'] ); - - //Display options must be 'on' or null - $display_location = ( isset( $input['display_location'] ) ) ? 'on' : null; - $display_desc = ( isset( $input['display_desc'] ) ) ? 'on' : null; - $display_link = ( isset( $input['display_link'] ) ) ? 'on' : null; - $display_link_target = ( isset( $input['display_link_target'] ) ) ? 'on' : null; - - //Filter display text - $display_start_text = wp_filter_kses( $input['display_start_text'] ); - $display_end_text = wp_filter_kses( $input['display_end_text'] ); - $display_location_text = wp_filter_kses( $input['display_location_text'] ); - $display_desc_text = wp_filter_kses( $input['display_desc_text'] ); - $display_link_text = wp_filter_kses( $input['display_link_text'] ); - - $display_separator = wp_filter_kses( $input['display_separator'] ); - - $display_desc_limit = ( 0 == absint( $input['display_desc_limit'] ) ) ? '' : absint( $input['display_desc_limit'] ); - - $use_builder = ( 'false' == $input['use_builder'] ) ? 'false' : 'true'; - $builder = wp_kses_post( $input['builder'] ); - - //Fill options array with validated values - $options[$id] = array( - 'id' => $id, - 'title' => $title, - 'url' => $url, - 'retrieve_from' => $retrieve_from, - 'retrieve_until' => $retrieve_until, - 'retrieve_from_value' => $retrieve_from_value, - 'retrieve_until_value' => $retrieve_until_value, - 'max_events' => $max_events, - 'date_format' => $date_format, - 'time_format' => $time_format, - 'timezone' => $timezone, - 'cache_duration' => $cache_duration, - 'multiple_day' => $multiple_day, - 'display_start' => $display_start, - 'display_end' => $display_end, - 'display_location' => $display_location, - 'display_desc' => $display_desc, - 'display_link' => $display_link, - 'display_start_text' => $display_start_text, - 'display_end_text' => $display_end_text, - 'display_location_text' => $display_location_text, - 'display_desc_text' => $display_desc_text, - 'display_desc_limit' => $display_desc_limit, - 'display_link_text' => $display_link_text, - 'display_link_target' => $display_link_target, - 'display_separator' => $display_separator, - 'use_builder' => $use_builder, - 'builder' => $builder - ); - - if ( isset( $input['submit_add'] ) ) - add_settings_error( 'gce_options', 'gce_added', __( sprintf( 'Feed %s added.', absint( $input['id'] ) ), GCE_TEXT_DOMAIN ), 'updated' ); - else - add_settings_error( 'gce_options', 'gce_edited', __( sprintf( 'Settings for feed %s updated.', absint( $input['id'] ) ), GCE_TEXT_DOMAIN ), 'updated' ); - } - - return $options; - } - - //Validate submitted general options - function validate_general_options( $input ) { - $options = get_option(GCE_GENERAL_OPTIONS_NAME); - - $options['stylesheet'] = esc_url( $input['stylesheet'] ); - $options['javascript'] = ( isset( $input['javascript'] ) ) ? true : false; - $options['loading'] = esc_html( $input['loading'] ); - $options['error'] = wp_filter_kses( $input['error'] ); - $options['fields'] = ( isset( $input['fields'] ) ) ? true : false; - $options['old_stylesheet'] = ( isset( $input['old_stylesheet'] ) ) ? true : false; - $options['save_settings'] = ( isset( $input['save_settings'] ) ) ? true : false; - - add_settings_error( 'gce_general', 'gce_general_updated', __( 'General options updated.', GCE_TEXT_DOMAIN ), 'updated' ); - - return $options; - } - - //Delete all transients (cached feed data) associated with feed specified - function delete_feed_transients( $id ) { - delete_transient( 'gce_feed_' . $id ); - delete_transient( 'gce_feed_' . $id . '_url' ); - } - - //Handles the shortcode stuff - function shortcode_handler( $atts ) { - $options = get_option( GCE_OPTIONS_NAME ); - - //Check that any feeds have been added - if ( is_array( $options ) && ! empty( $options ) ) { - extract( shortcode_atts( array( - 'id' => '', - 'type' => 'grid', - 'title' => null, - 'max' => 0, - 'order' => 'asc' - ), $atts ) ); - - $no_feeds_exist = true; - $feed_ids = array(); - - if ( '' != $id ) { - //Break comma delimited list of feed ids into array - $feed_ids = explode( ',', str_replace( ' ', '', $id ) ); - - //Check each id is an integer, if not, remove it from the array - foreach ( $feed_ids as $key => $feed_id ) { - if ( 0 == absint( $feed_id ) ) - unset( $feed_ids[$key] ); - } - - //If at least one of the feed ids entered exists, set no_feeds_exist to false - foreach ( $feed_ids as $feed_id ) { - if ( isset($options[$feed_id] ) ) - $no_feeds_exist = false; - } - } else { - foreach ( $options as $feed ) { - $feed_ids[] = $feed['id']; - } - - $no_feeds_exist = false; - } - - //Ensure max events is a positive integer - $max_events = absint( $max ); - - //Ensure sort order is asc or desc - $sort_order = ( 'desc' == $order ) ? 'desc' : 'asc'; - - //Check that at least one valid feed id has been entered - if ( empty( $feed_ids ) || $no_feeds_exist ) { - return __( 'No valid Feed IDs have been entered for this shortcode. Please check that you have entered the IDs correctly and that the Feeds have not been deleted.', GCE_TEXT_DOMAIN ); - } else { - //Turns feed_ids back into string of feed ids delimited by '-' ('1-2-3-4' for example) - $feed_ids = implode( '-', $feed_ids ); - - //If title has been omitted from shortcode, set title_text to null, otherwise set to title (even if empty string) - $title_text = ( false === $title ) ? null : $title; - - switch ( $type ) { - case 'grid': - return gce_print_grid( $feed_ids, $title_text, $max_events ); - case 'ajax': - return gce_print_grid( $feed_ids, $title_text, $max_events, true ); - case 'list': - return gce_print_list( $feed_ids, $title_text, $max_events, $sort_order ); - case 'list-grouped': - return gce_print_list( $feed_ids, $title_text, $max_events, $sort_order, true ); - } - } - } else { - return __( 'No feeds have been added yet. You can add a feed in the Google Calendar Events settings.', GCE_TEXT_DOMAIN ); - } - } - - //Adds the required CSS - function add_styles() { - wp_enqueue_style( 'gce_styles', WP_PLUGIN_URL . '/' . GCE_PLUGIN_NAME . '/css/gce-style.css' ); - - $options = get_option( GCE_GENERAL_OPTIONS_NAME ); - - //If old stylesheet option is enabled, enqueue old styles - if ( $options['old_stylesheet'] ) - wp_enqueue_style( 'gce_old_styles', WP_PLUGIN_URL . '/' . GCE_PLUGIN_NAME . '/css/gce-old-style.css' ); - - //If user has entered a URL to a custom stylesheet, enqueue it too - if( '' != $options['stylesheet'] ) - wp_enqueue_style( 'gce_custom_styles', $options['stylesheet'] ); - } - - //Adds the required scripts - function add_scripts() { - $options = get_option( GCE_GENERAL_OPTIONS_NAME ); - $add_to_footer = (bool) $options['javascript']; - - wp_enqueue_script( 'jquery' ); - wp_enqueue_script( 'gce_jquery_qtip', WP_PLUGIN_URL . '/' . GCE_PLUGIN_NAME . '/js/jquery-qtip.js', array( 'jquery' ), null, $add_to_footer ); - wp_enqueue_script( 'gce_scripts', WP_PLUGIN_URL . '/' . GCE_PLUGIN_NAME . '/js/gce-script.js', array( 'jquery' ), null, $add_to_footer ); - wp_localize_script( 'gce_scripts', 'GoogleCalendarEvents', array( - 'ajaxurl' => admin_url( 'admin-ajax.php', is_ssl() ? 'https' : 'http' ), - 'loading' => $options['loading'] - ) ); - } - - //AJAX stuffs - function gce_ajax() { - if ( isset( $_GET['gce_feed_ids'] ) ) { - $ids = $_GET['gce_feed_ids']; - $title = $_GET['gce_title_text']; - $max = $_GET['gce_max_events']; - $month = $_GET['gce_month']; - $year = $_GET['gce_year']; - - $title = ( 'null' == $title ) ? null : $title; - - if ( 'page' == $_GET['gce_type'] ) { - //The page grid markup to be returned via AJAX - echo gce_print_grid( $ids, $title, $max, true, $month, $year ); - } elseif ( 'widget' == $_GET['gce_type'] ) { - $widget = esc_html( $_GET['gce_widget_id'] ); - - //The widget grid markup to be returned via AJAX - gce_widget_content_grid( $ids, $title, $max, $widget, true, $month, $year ); - } - } - die(); - } - } -} - -function gce_print_list( $feed_ids, $title_text, $max_events, $sort_order, $grouped = false ) { - require_once 'inc/gce-parser.php'; - - $ids = explode( '-', $feed_ids ); - - //Create new GCE_Parser object, passing array of feed id(s) - $list = new GCE_Parser( $ids, $title_text, $max_events, $sort_order ); - - $num_errors = $list->get_num_errors(); - - //If there are less errors than feeds parsed, at least one feed must have parsed successfully so continue to display the list - if ( $num_errors < count( $ids ) ) { - $markup = '
' . $list->get_list( $grouped ) . '
'; - - //If there was at least one error, return the list markup with error messages (for admins only) - if ( $num_errors > 0 && current_user_can( 'manage_options' ) ) - return $list->error_messages() . $markup; - - //Otherwise just return the list markup - return $markup; - } else { - //If current user is an admin, display an error message explaining problem(s). Otherwise, display a 'nice' error messsage - if ( current_user_can( 'manage_options' ) ) { - return $list->error_messages(); - } else { - $options = get_option( GCE_GENERAL_OPTIONS_NAME ); - return wp_kses_post( $options['error'] ); - } - } -} - -function gce_print_grid( $feed_ids, $title_text, $max_events, $ajaxified = false, $month = null, $year = null ) { - require_once 'inc/gce-parser.php'; - - $ids = explode( '-', $feed_ids ); - - //Create new GCE_Parser object, passing array of feed id(s) returned from gce_get_feed_ids() - $grid = new GCE_Parser( $ids, $title_text, $max_events ); - - $num_errors = $grid->get_num_errors(); - - //If there are less errors than feeds parsed, at least one feed must have parsed successfully so continue to display the grid - if ( $num_errors < count( $ids ) ) { - $feed_ids = esc_attr( $feed_ids ); - $title_text = isset( $title_text ) ? esc_html( $title_text) : 'null'; - - $markup = '
'; - - //Add AJAX script if required - if ( $ajaxified ) - $markup .= ''; - - $markup .= $grid->get_grid( $year, $month, $ajaxified ) . '
'; - - //If there was at least one error, return the grid markup with an error message (for admins only) - if ( $num_errors > 0 && current_user_can( 'manage_options' ) ) - return $grid->error_messages() . $markup; - - //Otherwise just return the grid markup - return $markup; - } else { - //If current user is an admin, display an error message explaining problem. Otherwise, display a 'nice' error messsage - if ( current_user_can( 'manage_options' ) ) { - return $grid->error_messages(); - } else { - $options = get_option( GCE_GENERAL_OPTIONS_NAME ); - return wp_kses_post( $options['error'] ); - } - } -} - -$gce = new Google_Calendar_Events(); - - - - - -?> +, Nick Young + * @license GPL-2.0+ + * @link http://philderksen.com + * @copyright 2014 Phil Derksen + * + * @wordpress-plugin + * Plugin Name: Google Calendar Events + * Plugin URI: https://github.com/pderksen/WP-Google-Calendar-Events + * Description: Parses Google Calendar feeds and displays the events as a calendar grid or list on a page, post or widget. + * Version: 2.0.1 + * Author: Phil Derksen + * Author URI: http://philderksen.com + * License: GPL-2.0+ + * License URI: http://www.gnu.org/licenses/gpl-2.0.txt + * Text Domain: gce + * Domain Path: /languages + */ + +// If this file is called directly, abort. +if ( ! defined( 'WPINC' ) ) { + die; +} + +/* + * Include the main plugin file + * + * @since 2.0.0 + */ +require_once( 'class-google-calendar-events.php' ); + +/** + * Define constant pointing to this file + * + * @since 2.0.0 + */ +if( ! defined( 'GCE_MAIN_FILE' ) ) { + define( 'GCE_MAIN_FILE', __FILE__ ); +} + +/* + * Get instance of our plugin + * + * @since 2.0.0 + */ +add_action( 'plugins_loaded', array( 'Google_Calendar_Events', 'get_instance' ) ); + +/* + * If we are in admin then load the Admin class + * + * @since 2.0.0 + */ +if ( is_admin() && ( ! defined( 'DOING_AJAX' ) || ! DOING_AJAX ) ) { + require_once( 'class-google-calendar-events-admin.php' ); + add_action( 'plugins_loaded', array( 'Google_Calendar_Events_Admin', 'get_instance' ) ); +} diff --git a/wp-content/plugins/google-calendar-events/inc/gce-feed.php b/wp-content/plugins/google-calendar-events/inc/gce-feed.php deleted file mode 100644 index d7a277b..0000000 --- a/wp-content/plugins/google-calendar-events/inc/gce-feed.php +++ /dev/null @@ -1,248 +0,0 @@ -feed_url ); - - $scheme_and_host = $url_parts['scheme'] . '://' . $url_parts['host']; - - //Remove the exisitng projection from the path, and replace it with '/full-noattendees' - $path = substr( $url_parts['path'], 0, strrpos( $url_parts['path'], '/' ) ) . '/full-noattendees'; - - //Add the default parameters to the querystring (retrieving JSON, not XML) - $query = '?alt=json&singleevents=true&sortorder=ascending&orderby=starttime'; - - $gmt_offset = get_option( 'gmt_offset' ) * 3600; - - //Append the feed specific parameters to the querystring - $query .= '&start-min=' . date( 'Y-m-d\TH:i:s', $this->feed_start - $gmt_offset ); - $query .= '&start-max=' . date( 'Y-m-d\TH:i:s', $this->feed_end - $gmt_offset ); - $query .= '&max-results=' . $this->max_events; - - if ( ! empty( $this->timezone ) ) - $query .= '&ctz=' . $this->timezone; - - //If enabled, use experimental 'fields' parameter of Google Data API, so that only necessary data is retrieved. This *significantly* reduces amount of data to retrieve and process - $general_options = get_option( GCE_GENERAL_OPTIONS_NAME ); - if ( $general_options['fields'] ) - $query .= '&fields=entry(title,link[@rel="alternate"],content,gd:where,gd:when,gCal:uid)'; - - //Put the URL back together - $url = $scheme_and_host . $path . $query; - - //Attempt to retrieve the cached feed data - $this->events = get_transient( 'gce_feed_' . $this->feed_id ); - - //If the cached feed data isn't valid any more (has expired), or the URL has changed (settings have changed), then the feed data needs to be retrieved and decoded again - if ( false === $this->events || 0 == $this->cache_duration || get_transient( 'gce_feed_' . $this->feed_id . '_url' ) != $url ) { - $this->events = array(); - - //Retrieve the feed data - $raw_data = wp_remote_get( $url, array( - 'sslverify' => false, //sslverify is set to false to ensure https URLs work reliably. Data source is Google's servers, so is trustworthy - 'timeout' => 10 //Increase timeout from the default 5 seconds to ensure even large feeds are retrieved successfully - ) ); - - //If $raw_data is a WP_Error, something went wrong - if ( ! is_wp_error( $raw_data ) ) { - //If response code isn't 200, something went wrong - if ( 200 == $raw_data['response']['code'] ) { - //Attempt to convert the returned JSON into an array - $raw_data = json_decode( $raw_data['body'], true ); - - //If decoding was successful - if ( ! empty( $raw_data ) ) { - //If there are some entries (events) to process - if ( isset( $raw_data['feed']['entry'] ) ) { - //Loop through each event, extracting the relevant information - foreach ( $raw_data['feed']['entry'] as $event ) { - $id = esc_html( substr( $event['gCal$uid']['value'], 0, strpos( $event['gCal$uid']['value'], '@' ) ) ); - $title = esc_html( $event['title']['$t'] ); - $description = esc_html( $event['content']['$t'] ); - $link = esc_url( $event['link'][0]['href'] ); - $location = esc_html( $event['gd$where'][0]['valueString'] ); - $start_time = $this->iso_to_ts( $event['gd$when'][0]['startTime'] ); - $end_time = $this->iso_to_ts( $event['gd$when'][0]['endTime'] ); - - //Create a GCE_Event using the above data. Add it to the array of events - $this->events[] = new GCE_Event( $id, $title, $description, $location, $start_time, $end_time, $link ); - } - } - - if ( 0 != $this->cache_duration ) { - //Cache the feed data - set_transient( 'gce_feed_' . $this->feed_id, $this->events, $this->cache_duration ); - set_transient( 'gce_feed_' . $this->feed_id . '_url', $url, $this->cache_duration ); - } - } else { - //json_decode failed - $this->error = __( 'Some data was retrieved, but could not be parsed successfully. Please ensure your feed URL is correct.', GCE_TEXT_DOMAIN ); - } - } else { - //The response code wasn't 200, so generate a helpful(ish) error message depending on error code - switch ( $raw_data['response']['code'] ) { - case 404: - $this->error = __( 'The feed could not be found (404). Please ensure your feed URL is correct.', GCE_TEXT_DOMAIN ); - break; - case 403: - $this->error = __( 'Access to this feed was denied (403). Please ensure you have public sharing enabled for your calendar.', GCE_TEXT_DOMAIN ); - break; - default: - $this->error = sprintf( __( 'The feed data could not be retrieved. Error code: %s. Please ensure your feed URL is correct.', GCE_TEXT_DOMAIN ), $raw_data['response']['code'] ); - } - } - }else{ - //Generate an error message from the returned WP_Error - $this->error = $raw_data->get_error_message() . ' Please ensure your feed URL is correct.'; - } - } - - //Makes sure each event knows it came from this feed - foreach ( $this->events as $event ) { - $event->set_feed( $this ); - } - } - - //Convert an ISO date/time to a UNIX timestamp - function iso_to_ts( $iso ) { - sscanf( $iso, "%u-%u-%uT%u:%u:%uZ", $year, $month, $day, $hour, $minute, $second ); - return mktime( $hour, $minute, $second, $month, $day, $year ); - } - - //Return error message, or false if no error occurred - function error() { - return $this->error; - } - - //Setters - - function set_feed_id( $v ) { - $this->feed_id = $v; - } - - function set_feed_title( $v ) { - $this->feed_title = $v; - } - - function set_feed_url( $v ) { - $this->feed_url = $v; - } - - function set_max_events( $v ) { - $this->max_events = $v; - } - - function set_cache_duration( $v ) { - $this->cache_duration = $v; - } - - function set_date_format( $v ) { - $this->date_format = $v; - } - - function set_time_format( $v ) { - $this->time_format = $v; - } - - function set_timezone( $v ) { - $this->timezone = $v; - } - - function set_display_options( $v ) { - $this->display_opts = $v; - } - - function set_multi_day( $v ) { - $this->multi_day = $v; - } - - function set_feed_start( $v ) { - $this->feed_start = $v; - } - - function set_feed_end( $v ) { - $this->feed_end = $v; - } - - function set_use_builder( $v ) { - $this->use_builder = $v; - } - - function set_builder( $v ) { - $this->builder = $v; - } - - //Getters - - function get_events() { - return $this->events; - } - - function get_feed_id() { - return $this->feed_id; - } - - function get_feed_title() { - return $this->feed_title; - } - - function get_feed_url() { - return $this->feed_url; - } - - function get_date_format() { - return $this->date_format; - } - - function get_time_format() { - return $this->time_format; - } - - function get_display_options() { - return $this->display_opts; - } - - function get_multi_day() { - return $this->multi_day; - } - - function get_feed_start() { - return $this->feed_start; - } - - function get_feed_end() { - return $this->feed_end; - } - - function get_timezone() { - return $this->timezone; - } - - function get_use_builder() { - return $this->use_builder; - } - - function get_builder() { - return $this->builder; - } -} -?> \ No newline at end of file diff --git a/wp-content/plugins/google-calendar-events/inc/gce-parser.php b/wp-content/plugins/google-calendar-events/inc/gce-parser.php deleted file mode 100644 index bff4c3f..0000000 --- a/wp-content/plugins/google-calendar-events/inc/gce-parser.php +++ /dev/null @@ -1,355 +0,0 @@ -title = $title_text; - $this->max_events_display = $max_events; - $this->sort_order = $sort_order; - - //Get the feed options - $options = get_option( GCE_OPTIONS_NAME ); - - $this->start_of_week = get_option( 'start_of_week' ); - - foreach ( $feed_ids as $single_feed ) { - //Get the options for this particular feed - if ( isset( $options[$single_feed] ) ) { - $feed_options = $options[$single_feed]; - - $feed = new GCE_Feed(); - - $feed->set_feed_id( $feed_options['id'] ); - $feed->set_feed_title( $feed_options['title'] ); - $feed->set_feed_url( $feed_options['url'] ); - $feed->set_max_events( $feed_options['max_events'] ); - $feed->set_cache_duration( $feed_options['cache_duration'] ); - - //Set the timezone if anything other than default - if ( 'default' != $feed_options['timezone'] ) - $feed->set_timezone( $feed_options['timezone'] ); - - //Set the start date to the appropriate value based on the retrieve_from option - switch ( $feed_options['retrieve_from'] ) { - //Don't just use time() for 'now', as this will effectively make cache duration 1 second. Instead set to previous minute. Events in Google Calendar cannot be set to precision of seconds anyway - case 'now': - $feed->set_feed_start( mktime( date( 'H' ), date( 'i' ), 0, date( 'm' ), date( 'j' ), date( 'Y' ) ) + $feed_options['retrieve_from_value'] ); - break; - case 'today': - $feed->set_feed_start( mktime( 0, 0, 0, date( 'm' ), date( 'j' ), date( 'Y' ) ) + $feed_options['retrieve_from_value'] ); - break; - case 'week': - $feed->set_feed_start( mktime( 0, 0, 0, date( 'm' ), ( date( 'j' ) - date( 'w' ) + $this->start_of_week ), date( 'Y' ) ) + $feed_options['retrieve_from_value'] ); - break; - case 'month-start': - $feed->set_feed_start( mktime( 0, 0, 0, date( 'm' ), 1, date( 'Y' ) ) + $feed_options['retrieve_from_value'] ); - break; - case 'month-end': - $feed->set_feed_start( mktime( 0, 0, 0, date( 'm' ) + 1, 1, date( 'Y' ) ) + $feed_options['retrieve_from_value'] ); - break; - case 'date': - $feed->set_feed_start( $feed_options['retrieve_from_value'] ); - break; - default: - $feed->set_feed_start( 0 ); //any - 1970-01-01 00:00 - } - - //Set the end date to the appropriate value based on the retrieve_until option - switch ( $feed_options['retrieve_until'] ) { - case 'now': - $feed->set_feed_end( mktime( date( 'H' ), date( 'i' ), 0, date( 'm' ), date( 'j' ), date( 'Y' ) ) + $feed_options['retrieve_until_value'] ); - break; - case 'today': - $feed->set_feed_end( mktime( 0, 0, 0, date( 'm' ), date( 'j' ), date( 'Y' ) ) + $feed_options['retrieve_until_value'] ); - break; - case 'week': - $feed->set_feed_end( mktime( 0, 0, 0, date( 'm' ), ( date( 'j' ) - date( 'w' ) + $this->start_of_week ), date( 'Y' ) ) + $feed_options['retrieve_until_value'] ); - break; - case 'month-start': - $feed->set_feed_end( mktime( 0, 0, 0, date( 'm' ), 1, date( 'Y' ) ) + $feed_options['retrieve_until_value'] ); - break; - case 'month-end': - $feed->set_feed_end( mktime( 0, 0, 0, date( 'm' ) + 1, 1, date( 'Y' ) ) + $feed_options['retrieve_until_value'] ); - break; - case 'date': - $feed->set_feed_end( $feed_options['retrieve_until_value'] ); - break; - case 'any': - $feed->set_feed_end( 2145916800 ); //any - 2038-01-01 00:00 - } - - //Set date and time formats. If they have not been set by user, set to global WordPress formats - $feed->set_date_format( ( empty( $feed_options['date_format'] ) ) ? get_option( 'date_format' ) : $feed_options['date_format'] ); - $feed->set_time_format( ( empty( $feed_options['time_format'] ) ) ? get_option( 'time_format' ) : $feed_options['time_format'] ); - //Set whether to handle multiple day events - $feed->set_multi_day( ( 'true' == $feed_options['multiple_day'] ) ? true : false ); - - //Sets all display options - $feed->set_display_options( array( - 'display_start' => $feed_options['display_start'], - 'display_end' => $feed_options['display_end'], - 'display_location' => $feed_options['display_location'], - 'display_desc' => $feed_options['display_desc'], - 'display_link' => $feed_options['display_link'], - 'display_start_text' => $feed_options['display_start_text'], - 'display_end_text' => $feed_options['display_end_text'], - 'display_location_text' => $feed_options['display_location_text'], - 'display_desc_text' => $feed_options['display_desc_text'], - 'display_desc_limit' => $feed_options['display_desc_limit'], - 'display_link_text' => $feed_options['display_link_text'], - 'display_link_target' => $feed_options['display_link_target'], - 'display_separator' => $feed_options['display_separator'] - ) ); - - $feed->set_use_builder( ( 'true' == $feed_options['use_builder'] ) ? true : false ); - $feed->set_builder( $feed_options['builder'] ); - - //Parse the feed - $feed->init(); - - //Add feed object to array of feeds - $this->feeds[$single_feed] = $feed; - } - } - - $this->merged_feed_data = array(); - - //Merge the feeds together into one array of events - foreach ( $this->feeds as $feed_id => $feed ) { - $errors_occurred = $feed->error(); - - if ( false === $errors_occurred ) - $this->merged_feed_data = array_merge( $this->merged_feed_data, $feed->get_events() ); - else - $this->errors[$feed_id] = $errors_occurred; - } - - //Sort the items into date order - if ( ! empty( $this->merged_feed_data ) ) - usort( $this->merged_feed_data, array( $this, 'compare' ) ); - } - - //Comparison function for use when sorting merged feed data (with usort) - function compare( $event1, $event2 ) { - //Sort ascending or descending - if ( 'asc' == $this->sort_order ) - return $event1->get_start_time() - $event2->get_start_time(); - - return $event2->get_start_time() - $event1->get_start_time(); - } - - //Returns number of errors that have occurred - function get_num_errors() { - return count( $this->errors ); - } - - //Outputs a message describing each error that has occurred - function error_messages() { - $message = '

' . __( '1 or more of your feeds could not be displayed. The following errors occurred:', GCE_TEXT_DOMAIN ) . '

    '; - - foreach ( $this->errors as $feed_id => $error ) { - $message .= '
  • ' . sprintf( __( 'Feed %s:', GCE_TEXT_DOMAIN ), $feed_id ) . ' ' . $error . '
  • '; - } - - return $message . '
'; - } - - //Returns array of days with events, with sub-arrays of events for that day - function get_event_days() { - $event_days = array(); - - //Total number of events retrieved - $count = count( $this->merged_feed_data ); - - //If maximum events to display is 0 (unlimited) set $max to 1, otherwise use maximum of events specified by user - $max = ( 0 == $this->max_events_display ) ? 1 : $this->max_events_display; - - //Loop through entire array of events, or until maximum number of events to be displayed has been reached - for ( $i = 0; $i < $count && $max > 0; $i++ ) { - $event = $this->merged_feed_data[$i]; - - //Check that event ends, or starts (or both) within the required date range. This prevents all-day events from before / after date range from showing up. - if ( $event->get_end_time() > $event->get_feed()->get_feed_start() && $event->get_start_time() < $event->get_feed()->get_feed_end() ) { - foreach ( $event->get_days() as $day ) { - $event_days[$day][] = $event; - } - - //If maximum events to display isn't 0 (unlimited) decrement $max counter - if ( 0 != $this->max_events_display ) - $max--; - } - } - - return $event_days; - } - - //Returns grid markup - function get_grid ( $year = null, $month = null, $ajaxified = false ) { - require_once 'php-calendar.php'; - - $time_now = current_time( 'timestamp' ); - - //If year and month have not been passed as paramaters, use current month and year - if( ! isset( $year ) ) - $year = date( 'Y', $time_now ); - - if( ! isset( $month ) ) - $month = date( 'm', $time_now ); - - //Get timestamps for the start and end of current month - $current_month_start = mktime( 0, 0, 0, date( 'm', $time_now ), 1, date( 'Y', $time_now ) ); - $current_month_end = mktime( 0, 0, 0, date( 'm', $time_now ) + 1, 1, date( 'Y', $time_now ) ); - - //Get timestamps for the start and end of the month to be displayed in the grid - $display_month_start = mktime( 0, 0, 0, $month, 1, $year ); - $display_month_end = mktime( 0, 0, 0, $month + 1, 1, $year ); - - //It should always be possible to navigate to the current month, even if it doesn't have any events - //So, if the display month is before the current month, set $nav_next to true, otherwise false - //If the display month is after the current month, set $nav_prev to true, otherwise false - $nav_next = ( $display_month_start < $current_month_start ); - $nav_prev = ( $display_month_start >= $current_month_end ); - - //Get events data - $event_days = $this->get_event_days(); - - //If event_days is empty, then there are no events in the feed(s), so set ajaxified to false (Prevents AJAX calendar from allowing to endlessly click through months with no events) - if ( empty( $event_days ) ) - $ajaxified = false; - - $today = mktime( 0, 0, 0, date( 'm', $time_now ), date( 'd', $time_now ), date( 'Y', $time_now ) ); - - $i = 1; - - foreach ( $event_days as $key => $event_day ) { - //If event day is in the month and year specified (by $month and $year) - if ( $key >= $display_month_start && $key < $display_month_end ) { - //Create array of CSS classes. Add gce-has-events - $css_classes = array( 'gce-has-events' ); - - //Create markup for display - $markup = '
'; - - //If title option has been set for display, add it - if ( isset( $this->title ) ) - $markup .= '
' . esc_html( $this->title ) . ' ' . date_i18n( $event_day[0]->get_feed()->get_date_format(), $key ) . '
'; - - $markup .= '
    '; - - foreach ( $event_day as $num_in_day => $event ) { - $feed_id = absint( $event->get_feed()->get_feed_id() ); - $markup .= '
  • ' . $event->get_event_markup( 'tooltip', $num_in_day, $i ) . '
  • '; - - //Add CSS class for the feed from which this event comes. If there are multiple events from the same feed on the same day, the CSS class will only be added once. - $css_classes['feed-' . $feed_id] = 'gce-feed-' . $feed_id; - - $i++; - } - - $markup .= '
'; - - //If number of CSS classes is greater than 2 ('gce-has-events' plus one specific feed class) then there must be events from multiple feeds on this day, so add gce-multiple CSS class - if ( count( $css_classes ) > 2 ) - $css_classes[] = 'gce-multiple'; - - //If event day is today, add gce-today CSS class, otherwise add past or future class - if ( $key == $today ) - $css_classes[] = 'gce-today gce-today-has-events'; - elseif ( $key < $today ) - $css_classes[] = 'gce-day-past'; - else - $css_classes[] = 'gce-day-future'; - - //Change array entry to array of link href, CSS classes, and markup for use in gce_generate_calendar (below) - $event_days[$key] = array( null, implode( ' ', $css_classes ), $markup ); - } elseif ( $key < $display_month_start ) { - //This day is before the display month, so set $nav_prev to true. Remove the day from $event_days, as it's no use for displaying this month - $nav_prev = true; - unset( $event_days[$key] ); - } else { - //This day is after the display month, so set $nav_next to true. Remove the day from $event_days, as it's no use for displaying this month - $nav_next = true; - unset( $event_days[$key] ); - } - } - - //Ensures that gce-today CSS class is added even if there are no events for 'today'. A bit messy :( - if ( ! isset( $event_days[$today] ) ) - $event_days[$today] = array( null, 'gce-today gce-today-no-events', null ); - - $pn = array(); - - //Only add previous / next functionality if AJAX grid is enabled - if ( $ajaxified ) { - //If there are events to display in a previous month, add previous month link - $prev_key = ( $nav_prev ) ? '«' : ' '; - $prev = ( $nav_prev ) ? date( 'm-Y', mktime( 0, 0, 0, $month - 1, 1, $year ) ) : null; - - //If there are events to display in a future month, add next month link - $next_key = ( $nav_next ) ? '»' : ' '; - $next = ( $nav_next ) ? date( 'm-Y', mktime( 0, 0, 0, $month + 1, 1, $year ) ) : null; - - //Array of previous and next link stuff for use in gce_generate_calendar (below) - $pn = array( $prev_key => $prev, $next_key => $next ); - } - - //Generate the calendar markup and return it - return gce_generate_calendar( $year, $month, $event_days, 1, null, $this->start_of_week, $pn ); - } - - function get_list( $grouped = false ) { - $time_now = current_time( 'timestamp' ); - - $event_days = $this->get_event_days(); - - //If event_days is empty, there are no events in the feed(s), so return a message indicating this - if( empty( $event_days) ) - return '

' . __( 'There are currently no events to display.', GCE_TEXT_DOMAIN ) . '

'; - - $today = mktime( 0, 0, 0, date( 'm', $time_now ), date( 'd', $time_now ), date( 'Y', $time_now ) ); - - $i = 1; - - $markup = '
    '; - - foreach ( $event_days as $key => $event_day ) { - //If this is a grouped list, add the date title and begin the nested list for this day - if ( $grouped ) { - $markup .= - '' . - '
    ' . esc_html( $this->title ) . ' ' . date_i18n( $event_day[0]->get_feed()->get_date_format(), $key ) . '
    ' . - '
      '; - } - - foreach ( $event_day as $num_in_day => $event ) { - //Create the markup for this event - $markup .= - '
    • ' . - //If this isn't a grouped list and a date title should be displayed, add the date title - ( ( ! $grouped && isset( $this->title ) ) ? '
      ' . esc_html( $this->title ) . ' ' . date_i18n( $event->get_feed()->get_date_format(), $key ) . '
      ' : '' ) . - //Add the event markup - $event->get_event_markup( 'list', $num_in_day, $i ) . - '
    • '; - - $i++; - } - - //If this is a grouped list, close the nested list for this day - if ( $grouped ) - $markup .= '
    '; - } - - $markup .= '
'; - - return $markup; - } -} -?> \ No newline at end of file diff --git a/wp-content/plugins/google-calendar-events/inc/upgrade-notice.php b/wp-content/plugins/google-calendar-events/inc/upgrade-notice.php deleted file mode 100644 index d243d07..0000000 --- a/wp-content/plugins/google-calendar-events/inc/upgrade-notice.php +++ /dev/null @@ -1,31 +0,0 @@ -, Nick Young - */ - -// Exit if accessed directly. -if ( ! defined( 'ABSPATH' ) ) { - exit; -} - -?> - - - - diff --git a/wp-content/plugins/google-calendar-events/includes/admin/admin-functions.php b/wp-content/plugins/google-calendar-events/includes/admin/admin-functions.php new file mode 100644 index 0000000..5889e87 --- /dev/null +++ b/wp-content/plugins/google-calendar-events/includes/admin/admin-functions.php @@ -0,0 +1,62 @@ +, Nick Young + * @license GPL-2.0+ + * @copyright 2014 Phil Derksen + */ + +/** + * Function to clear the cache out + * + * @since 2.0.0 + */ +function gce_clear_cache( $id ) { + + delete_transient( 'gce_feed_' . $id ); + + add_settings_error( 'gce-notices', 'gce-cache-updated', __( 'Cache has been cleared for this feed.', 'gce' ), 'updated' ); +} + +/** + * Function that runs when a new Feed CPT is made + * Adds the default editor content for the event builder + * Adds default post meta options + * + * @since 2.0.0 + */ + +function gce_default_editor_content( $content, $post ) { + + if( $post->post_type == 'gce_feed' ) { + $content = '
[event-title]
' . "\n"; + $content .= '
Starts: [start-time]
' . "\n"; + $content .= '
Ends: [end-date] - [end-time]
' . "\n"; + $content .= '[if-location]
Location: [location]
[/if-location]' . "\n"; + $content .= '[if-description]
Description: [description]
[/if-description]' . "\n"; + $content .= '
[link newwindow="true"]More details...[/link]
' . "\n"; + + // Default Post Meta Options + add_post_meta( $post->ID, 'gce_expand_recurring', 1 ); + add_post_meta( $post->ID, 'gce_retrieve_from', 'today' ); + add_post_meta( $post->ID, 'gce_retrieve_until', 'end_time' ); + add_post_meta( $post->ID, 'gce_cache', 43200 ); + + // Default Simple Display Options + add_post_meta( $post->ID, 'gce_display_start', 'time' ); + add_post_meta( $post->ID, 'gce_display_start_text', 'Starts:' ); + add_post_meta( $post->ID, 'gce_display_end', 'time-date' ); + add_post_meta( $post->ID, 'gce_display_end_text', 'Ends:' ); + add_post_meta( $post->ID, 'gce_display_separator', ', ' ); + add_post_meta( $post->ID, 'gce_display_location_text', 'Location:' ); + add_post_meta( $post->ID, 'gce_display_description_text', 'Description:' ); + add_post_meta( $post->ID, 'gce_display_link', 1 ); + add_post_meta( $post->ID, 'gce_display_link_text', 'More Details' ); + + } + + return $content; +} +add_filter( 'default_content', 'gce_default_editor_content', 10, 2 ); diff --git a/wp-content/plugins/google-calendar-events/includes/admin/upgrade.php b/wp-content/plugins/google-calendar-events/includes/admin/upgrade.php new file mode 100644 index 0000000..11a57fe --- /dev/null +++ b/wp-content/plugins/google-calendar-events/includes/admin/upgrade.php @@ -0,0 +1,261 @@ +, Nick Young + * @license GPL-2.0+ + * @copyright 2014 Phil Derksen + */ + +// I put the priority to 20 here so it runs after the gce_feed CPT code and we don't get errors +add_action( 'init', 'gce_upgrade', 20 ); + +/** + * Main GCE Upgrade function. Call this and branch of from here depending on what we need to do + * + * @since 2.0.0 + */ +function gce_upgrade() { + + $version = get_option( 'gce_version' ); + + if( ! empty( $version ) ) { + // Check if under version 2 and run the v2 upgrade if we are + if( version_compare( $version, '2.0.0-beta1', '<' ) && false === get_option( 'gce_upgrade_has_run' ) ) { + gce_v2_upgrade(); + } + } + + $new_version = Google_Calendar_Events::get_instance()->get_plugin_version(); + update_option( 'gce_version', $new_version ); + + add_option( 'gce_upgrade_has_run', 1 ); +} + +/* + * Run the upgrade to version 2.0.0 + * + * @since 2.0.0 + */ +function gce_v2_upgrade() { + $old_options = get_option( 'gce_options' ); + + if( false !== $old_options ) { + + foreach( $old_options as $key => $value ) { + convert_to_cpt_posts( $value ); + } + + update_widget_feed_ids(); + } +} + +/** + * Converts the old database options to the new CPT layout for 2.0.0+ + * + * @since 2.0.0 + */ +function convert_to_cpt_posts( $args ) { + // Setup our new post + $post = array( + 'post_name' => $args['title'], + 'post_title' => $args['title'], + 'post_status' => 'publish', + 'post_type' => 'gce_feed' + ); + + if( $args['use_builder'] == true ) { + $post['post_content'] = $args['builder']; + } + + $post_id = wp_insert_post( $post ); + + create_cpt_meta( $post_id, $args ); + + clear_old_transients( $args['id'] ); +} + +/** + * Add the CPT post meta based on options set for the old feeds prior to v2 + * + * @since 2.0.0 + */ +function create_cpt_meta( $id, $args ) { + + // Convert the dropdown values to the new values for "Retrieve Events From" + switch( $args['retrieve_from'] ) { + case 'now': + case 'today': + $from = 'today'; + break; + case 'week': + $from = 'start_week'; + break; + case 'month-start': + $from = 'start_month'; + break; + case 'month-end': + $from = 'end_month'; + break; + case 'date': + $from = 'custom_date'; + break; + default: + $from = 'start_time'; + break; + } + + // Convert the dropdown values to the new values for "Retrieve Events Until" + switch( $args['retrieve_until'] ) { + case 'now': + case 'today': + $until = 'today'; + break; + case 'week': + $until = 'start_week'; + break; + case 'month-start': + $until = 'start_month'; + break; + case 'month-end': + $until = 'end_month'; + break; + case 'date': + $until = 'custom_date'; + break; + default: + $until = 'end_time'; + break; + } + + $gce_expand_recurring = ( isset( $args['expand_recurring'] ) ? ( $args['expand_recurring'] == 'true' ? '1' : '0' ) : '1' ); + + // An array to hold all of our post meta ids and values so that we can loop through and add as post meta easily + $post_meta_fields = array( + 'gce_feed_url' => $args['url'], + 'gce_retrieve_from' => $from, + 'gce_retrieve_until' => $until, + 'gce_retrieve_max' => $args['max_events'], + 'gce_date_format' => $args['date_format'], + 'gce_time_format' => $args['time_format'], + 'gce_timezone_offset' => $args['timezone'], + 'gce_cache' => $args['cache_duration'], + 'gce_multi_day_events' => ( $args['multiple_day'] == 'true' || $args['multiple_day'] == true ? '1' : '0' ), + 'gce_display_mode' => 'grid', + 'gce_custom_from' => gce_convert_timestamp( $args['retrieve_from_value'] ), + 'gce_custom_until' => gce_convert_timestamp( $args['retrieve_until_value'] ), + 'old_gce_id' => $args['id'], + 'gce_search_query' => ( isset( $args['query'] ) ? $args['query'] : '' ), + 'gce_expand_recurring' => $gce_expand_recurring + ); + + if( $args['use_builder'] == 'false' || $args['use_builder'] == false ) { + $display_meta = array( + 'gce_display_simple' => 1, + 'gce_display_start' => $args['display_start'], + 'gce_display_start_text' => $args['display_start_text'], + 'gce_display_end' => $args['display_end'], + 'gce_display_end_text' => $args['display_end_text'], + 'gce_display_separator' => $args['display_separator'], + 'gce_display_location' => ( $args['display_location'] == 'on' ? '1' : '0' ), + 'gce_display_location_text' => $args['display_location_text'], + 'gce_display_description' => ( $args['display_desc'] == 'on' ? '1' : '0' ), + 'gce_display_description_text' => $args['display_desc_text'], + 'gce_display_description_max' => $args['display_desc_limit'], + 'gce_display_link' => ( $args['display_link'] == 'on' ? '1' : '0' ), + 'gce_display_link_tab' => ( $args['display_link_target'] == 'on' ? '1' : '0' ), + 'gce_display_link_text' => $args['display_link_text'] + ); + + $post_meta_fields = array_merge( $post_meta_fields, $display_meta ); + } + + // Loop through each $post_meta_field and add as an entry + foreach( $post_meta_fields as $k => $v ) { + update_post_meta( $id, $k, $v ); + } +} + +function gce_convert_timestamp( $t ) { + // mm/dd/yyyy + return date( 'm/d/Y', $t ); +} + +/** + * Remove the old transient values from the database + * + * @since 2.0.0 + */ +function clear_old_transients( $id ) { + + delete_transient( 'gce_feed_' . $id ); + delete_transient( 'gce_feed_' . $id . '_url' ); +} + +/** + * Update widget IDs + * + * @since 2.0.0 + */ +function update_widget_feed_ids() { + + $widget = get_option( 'widget_gce_widget' ); + + if( is_array( $widget ) && ! empty( $widget ) ) { + foreach( $widget as $a => $b ) { + if( ! is_array( $b ) ) { + continue; + } + + foreach( $b as $k => $v ) { + + if( $k != 'id' ) { + continue; + } + + $id = $v; + + $multi = str_replace( ' ', '', $v ); + + $multi = explode( ',', $id ); + + if( is_array( $multi ) ) { + + $new_ids = ''; + + foreach( $multi as $m ) { + $q = new WP_Query( "post_type=gce_feed&meta_key=old_gce_id&meta_value=$m&order=ASC" ); + + if( $q->have_posts() ) { + + $q->the_post(); + // Set our ID to the old ID if found + $m = get_the_ID(); + + $new_ids .= $m . ','; + } + } + + $widget[$a][$k] = substr( $new_ids, 0, -1 ); + } else { + + $q = new WP_Query( "post_type=gce_feed&meta_key=old_gce_id&meta_value=$id&order=ASC" ); + + if( $q->have_posts() ) { + + $q->the_post(); + // Set our ID to the old ID if found + $id = get_the_ID(); + } + + $widget[$a][$k] = $id; + } + } + } + + update_option( 'widget_gce_widget', $widget ); + } + +} \ No newline at end of file diff --git a/wp-content/plugins/google-calendar-events/includes/class-gce-display.php b/wp-content/plugins/google-calendar-events/includes/class-gce-display.php new file mode 100644 index 0000000..a3a74cf --- /dev/null +++ b/wp-content/plugins/google-calendar-events/includes/class-gce-display.php @@ -0,0 +1,259 @@ +, Nick Young + * @license GPL-2.0+ + * @copyright 2014 Phil Derksen + */ + +class GCE_Display { + + private $feeds, $merged_feeds; + + public function __construct( $ids, $title_text = null, $max_events = 0, $sort_order = 'asc' ) { + + $this->id = $ids; + $this->title = $title_text; + $this->max_events = $max_events; + $this->sort = $sort_order; + + foreach( $ids as $id ) { + $this->feeds[$id] = new GCE_Feed( $id ); + } + + $this->merged_feeds = array(); + + //Merge the feeds together into one array of events + foreach ( $this->feeds as $feed_id => $feed ) { + $this->merged_feeds = array_merge( $this->merged_feeds, $feed->events ); + } + + // Sort the items into date order + if ( ! empty( $this->merged_feeds ) ) { + usort( $this->merged_feeds, array( $this, 'compare' ) ); + } + } + + /** + * Comparison function for use when sorting merged feed data (with usort) + * + * @since 2.0.0 + */ + function compare( $event1, $event2 ) { + //Sort ascending or descending + if ( 'asc' == $this->sort ) + return $event1->start_time - $event2->start_time; + + return $event2->start_time - $event1->start_time; + } + + /** + * Returns array of days with events, with sub-arrays of events for that day + * + * @since 2.0.0 + */ + private function get_event_days() { + $event_days = array(); + + //Total number of events retrieved + $count = count( $this->merged_feeds ); + + //If maximum events to display is 0 (unlimited) set $max to 1, otherwise use maximum of events specified by user + $max = ( 0 == $this->max_events ) ? 1 : $this->max_events; + + //Loop through entire array of events, or until maximum number of events to be displayed has been reached + for ( $i = 0; $i < $count && $max > 0; $i++ ) { + $event = $this->merged_feeds[$i]; + + //Check that event ends, or starts (or both) within the required date range. This prevents all-day events from before / after date range from showing up. + if ( $event->end_time > $event->start_time && $event->start_time < $event->end_time ) { + foreach ( $event->get_days() as $day ) { + $event_days[$day][] = $event; + } + + //If maximum events to display isn't 0 (unlimited) decrement $max counter + if ( 0 != $this->max_events ) + $max--; + } + } + + return $event_days; + } + + /** + * Return the markup for the 'Grid' display + * + * @since 2.0.0 + */ + public function get_grid ( $year = null, $month = null, $widget = false ) { + require_once 'php-calendar.php'; + + $time_now = current_time( 'timestamp' ); + + //If year and month have not been passed as paramaters, use current month and year + if( ! isset( $year ) ) { + $year = date( 'Y', $time_now ); + } + + if( ! isset( $month ) ) { + $month = date( 'm', $time_now ); + } + + //Get timestamps for the start and end of current month + $current_month_start = mktime( 0, 0, 0, date( 'm', $time_now ), 1, date( 'Y', $time_now ) ); + $current_month_end = mktime( 0, 0, 0, date( 'm', $time_now ) + 1, 1, date( 'Y', $time_now ) ); + + //Get timestamps for the start and end of the month to be displayed in the grid + $display_month_start = mktime( 0, 0, 0, $month, 1, $year ); + $display_month_end = mktime( 0, 0, 0, $month + 1, 1, $year ); + + //It should always be possible to navigate to the current month, even if it doesn't have any events + //So, if the display month is before the current month, set $nav_next to true, otherwise false + //If the display month is after the current month, set $nav_prev to true, otherwise false + $nav_next = ( $display_month_start < $current_month_start ); + $nav_prev = ( $display_month_start >= $current_month_end ); + + //Get events data + $event_days = $this->get_event_days(); + + $today = mktime( 0, 0, 0, date( 'm', $time_now ), date( 'd', $time_now ), date( 'Y', $time_now ) ); + + $i = 1; + + foreach ( $event_days as $key => $event_day ) { + //If event day is in the month and year specified (by $month and $year) + if ( $key >= $display_month_start && $key < $display_month_end ) { + //Create array of CSS classes. Add gce-has-events + $css_classes = array( 'gce-has-events' ); + + //Create markup for display + $markup = '
'; + + //If title option has been set for display, add it + if ( isset( $this->title ) ) { + $markup .= '
' . esc_html( $this->title ) . ' ' . date_i18n( $event_day[0]->feed->date_format, $key ) . '
'; + } + + $markup .= '
    '; + + foreach ( $event_day as $num_in_day => $event ) { + $feed_id = absint( $event->feed->id ); + $markup .= '
  • ' . $event->get_event_markup( 'tooltip', $num_in_day, $i ) . '
  • '; + + //Add CSS class for the feed from which this event comes. If there are multiple events from the same feed on the same day, the CSS class will only be added once. + $css_classes['feed-' . $feed_id] = 'gce-feed-' . $feed_id; + + $i++; + } + + $markup .= '
'; + + //If number of CSS classes is greater than 2 ('gce-has-events' plus one specific feed class) then there must be events from multiple feeds on this day, so add gce-multiple CSS class + if ( count( $css_classes ) > 2 ) + $css_classes[] = 'gce-multiple'; + + //If event day is today, add gce-today CSS class, otherwise add past or future class + if ( $key == $today ) { + $css_classes[] = 'gce-today gce-today-has-events'; + } elseif ( $key < $today ) { + $css_classes[] = 'gce-day-past'; + } else { + $css_classes[] = 'gce-day-future'; + } + + //Change array entry to array of link href, CSS classes, and markup for use in gce_generate_calendar (below) + $event_days[$key] = array( null, implode( ' ', $css_classes ), $markup ); + } elseif ( $key < $display_month_start ) { + //This day is before the display month, so set $nav_prev to true. Remove the day from $event_days, as it's no use for displaying this month + $nav_prev = true; + unset( $event_days[$key] ); + } else { + //This day is after the display month, so set $nav_next to true. Remove the day from $event_days, as it's no use for displaying this month + $nav_next = true; + unset( $event_days[$key] ); + } + } + + //Ensures that gce-today CSS class is added even if there are no events for 'today'. A bit messy :( + if ( ! isset( $event_days[$today] ) ) + $event_days[$today] = array( null, 'gce-today gce-today-no-events', null ); + + $pn = array(); + + // Add previous / next functionality + //If there are events to display in a previous month, add previous month link + $prev_key = ( $nav_prev ) ? '«' : ' '; + $prev = ( $nav_prev ) ? date( 'm-Y', mktime( 0, 0, 0, $month - 1, 1, $year ) ) : null; + + //If there are events to display in a future month, add next month link + $next_key = ( $nav_next ) ? '»' : ' '; + $next = ( $nav_next ) ? date( 'm-Y', mktime( 0, 0, 0, $month + 1, 1, $year ) ) : null; + + //Array of previous and next link stuff for use in gce_generate_calendar (below) + $pn = array( $prev_key => $prev, $next_key => $next ); + + + $start_day = get_option( 'start_of_week' ); + + //Generate the calendar markup and return it + return gce_generate_calendar( $year, $month, $event_days, 1, null, $start_day, $pn, $widget ); + } + + /** + * Return the markup for the 'List' display + * + * @since 2.0.0 + */ + public function get_list( $grouped = false ) { + $time_now = current_time( 'timestamp' ); + + // Get all the event days + $event_days = $this->get_event_days(); + + //If event_days is empty, there are no events in the feed(s), so return a message indicating this + if( empty( $event_days) ) { + return '

' . __( 'There are currently no events to display.', 'gce' ) . '

'; + } + + $today = mktime( 0, 0, 0, date( 'm', $time_now ), date( 'd', $time_now ), date( 'Y', $time_now ) ); + + $i = 1; + + $markup = '
    '; + + foreach ( $event_days as $key => $event_day ) { + //If this is a grouped list, add the date title and begin the nested list for this day + if ( $grouped ) { + $markup .= + '' . + '
    ' . date_i18n( $event_day[0]->feed->date_format, $key ) . '
    ' . + '
      '; + } + + foreach ( $event_day as $num_in_day => $event ) { + //Create the markup for this event + $markup .= + '
    • ' . + //If this isn't a grouped list and a date title should be displayed, add the date title + ( ( ! $grouped && isset( $event->title ) ) ? '
      ' . esc_html( $this->title ) . ' ' . date_i18n( $event->feed->date_format, $key ) . '
      ' : '' ) . + //Add the event markup + $event->get_event_markup( 'list', $num_in_day, $i ) . + '
    • '; + + $i++; + } + + //If this is a grouped list, close the nested list for this day + if ( $grouped ) { + $markup .= '
    '; + } + } + + $markup .= '
'; + + return $markup; + } +} diff --git a/wp-content/plugins/google-calendar-events/inc/gce-event.php b/wp-content/plugins/google-calendar-events/includes/class-gce-event.php similarity index 74% rename from wp-content/plugins/google-calendar-events/inc/gce-event.php rename to wp-content/plugins/google-calendar-events/includes/class-gce-event.php index e0765b5..2352e35 100644 --- a/wp-content/plugins/google-calendar-events/inc/gce-event.php +++ b/wp-content/plugins/google-calendar-events/includes/class-gce-event.php @@ -1,527 +1,541 @@ -id = $id; - $this->title = $title; - $this->description = $description; - $this->location = $location; - $this->start_time = $start_time; - $this->end_time = $end_time; - $this->link = $link; - - //Calculate which day type this event is (SWD = single whole day, SPD = single part day, MWD = multiple whole day, MPD = multiple part day) - if ( ( $start_time + 86400 ) <= $end_time ) { - if ( ( $start_time + 86400 ) == $end_time ) { - $this->day_type = 'SWD'; - } else { - if ( ( '12:00 am' == date( 'g:i a', $start_time ) ) && ( '12:00 am' == date( 'g:i a', $end_time ) ) ) { - $this->day_type = 'MWD'; - } else { - $this->day_type = 'MPD'; - } - } - } else { - $this->day_type = 'SPD'; - } - } - - function set_feed( $feed ) { - $this->feed = $feed; - } - - function get_feed() { - return $this->feed; - } - - function get_start_time() { - return $this->start_time; - } - - function get_end_time() { - return $this->end_time; - } - - function get_day_type() { - return $this->day_type; - } - - //Returns an array of days (as UNIX timestamps) that this events spans - function get_days() { - //Round start date to nearest day - $start_time = mktime( 0, 0, 0, date( 'm', $this->start_time ), date( 'd', $this->start_time ) , date( 'Y', $this->start_time ) ); - - $days = array(); - - //If multiple day events should be handled, and this event is a multi-day event, add multiple day event to required days - if ( $this->feed->get_multi_day() && ( 'MPD' == $this->day_type || 'MWD' == $this->day_type ) ) { - $on_next_day = true; - $next_day = $start_time; - - while ( $on_next_day ) { - //If the end time of the event is after 00:00 on the next day (therefore, not doesn't end on this day) - if ( $this->end_time > $next_day ) { - //If $next_day is within the event retrieval date range (specified by retrieve events from / until settings) - if ( $next_day >= $this->feed->get_feed_start() && $next_day < $this->feed->get_feed_end() ) { - $days[] = $next_day; - } - } else { - $on_next_day = false; - } - $next_day += 86400; - } - } else { - //Add event into array of events for that day - $days[] = $start_time; - } - - return $days; - } - - //Returns the markup for this event, so that it can be used in the construction of a grid / list - function get_event_markup( $display_type, $num_in_day, $num ) { - //Set the display type (either tooltip or list) - $this->type = $display_type; - - //Set which number event this is in day (first in day etc) - $this->num_in_day = $num_in_day; - - //Set the position of this event in array of events currently being processed - $this->pos = $num; - - $this->time_now = current_time( 'timestamp' ); - - //Use the builder or the old display options to create the markup, depending on user choice - if ( $this->feed->get_use_builder() ) - return $this->use_builder(); - - return $this->use_old_display_options(); - } - - //Return the event markup using the builder - function use_builder() { - //Array of valid shortcodes - $shortcodes = array( - //Event / feed information shortcodes - - 'event-title', //The event title - 'start-time', //The start time of the event (uses the time format from the feed options, if it is set. Otherwise uses the default WordPress time format) - 'start-date', //The start date of the event (uses the date format from the feed options, if it is set. Otherwise uses the default WordPress date format) - 'start-custom', //The start time / date of the event (uses a custom PHP date format, specified in the 'format' attribute) - 'start-human', //The difference between the start time of the event and the time now, in human-readable format, such as '1 hour', '4 days', '15 mins' - 'end-time', //The end time of the event (uses the time format from the feed options, if it is set. Otherwise uses the default WordPress time format) - 'end-date', //The end date of the event (uses the date format from the feed options, if it is set. Otherwise uses the default WordPress date format) - 'end-custom', //The end time / date of the event (uses a custom PHP date format, specified in the 'format' attribute) - 'end-human', //The difference between the end time of the event and the time now, in human-readable format, such as '1 hour', '4 days', '15 mins' - 'location', //The event location - 'description', //The event deescription (number of words can be limited by the 'limit' attribute) - 'link', //Anything within this shortcode (including further shortcodes) will be linked to the Google Calendar page for this event - 'url', //The raw link URL to the Google Calendar page for this event (can be used to construct more customized links) - 'feed-id', //The ID of this feed (Can be useful for constructing feed specific CSS classes) - 'feed-title', //The feed title - 'maps-link', //Anything within this shortcode (including further shortcodes) will be linked to a Google Maps page based on whatever is specified for the event location - 'length', //How long the events lasts, in human-readable format - 'event-num', //The position of the event in the current list, or the position of the event in the current month (for grids) - 'event-id', //The event UID (unique identifier assigned by Google) - 'cal-id', //The calendar ID - - //Anything between the opening and closing tags of the following logical shortcodes (including further shortcodes) will only be displayed if: - - 'if-all-day', //This is an all-day event - 'if-not-all-day', //This is not an all-day event - 'if-title', //The event has a title - 'if-description', //The event has a description - 'if-location', //The event has a location - 'if-tooltip', //The current display type is 'tooltip' - 'if-list', //The current display type is 'list' - 'if-now', //The event is taking place now (after the start time, but before the end time) - 'if-not-now', //The event is not taking place now (may have ended or not yet started) - 'if-started', //The event has started (and even if it has ended) - 'if-not-started', //The event has not yet started - 'if-ended', //The event has ended - 'if-not-ended', //The event has not ended (and even if it hasn't started) - 'if-first', //The event is the first in the day - 'if-not-first', //The event is not the first in the day - 'if-multi-day', //The event spans multiple days - 'if-single-day' //The event does not span multiple days - ); - - $this->regex = '/(.?)\[(' . implode( '|', $shortcodes ) . ')\b(.*?)(?:(\/))?\](?:(.+?)\[\/\2\])?(.?)/s'; - - return $this->look_for_shortcodes( $this->feed->get_builder() ); - } - - //Look through the EDB markup for shortcodes - function look_for_shortcodes( $markup ) { - return preg_replace_callback( $this->regex, array( $this, 'process_shortcode' ), $markup ); - } - - //Parse a shortcode, returning the appropriate event information - //Much of this code is 'borrowed' from WordPress' own shortcode handling stuff! - function process_shortcode( $m ) { - if ( '[' == $m[1] && ']' == $m[6] ) - return substr( $m[0], 1, -1 ); - - //Extract any attributes contained in the shortcode - extract( shortcode_atts( array( - 'newwindow' => 'false', - 'format' => '', - 'limit' => '0', - 'html' => 'false', - 'markdown' => 'false', - 'precision' => '1', - 'offset' => '0', - 'autolink' => 'true' - ), shortcode_parse_atts( $m[3] ) ) ); - - //Sanitize the attributes - $newwindow = ( 'true' === $newwindow ); - $format = esc_attr( $format ); - $limit = absint( $limit ); - $html = ( 'true' === $html ); - $markdown = ( 'true' === $markdown ); - $precision = absint( $precision ); - $offset = intval( $offset ); - $autolink = ( 'true' === $autolink ); - - //Do the appropriate stuff depending on which shortcode we're looking at. See valid shortcode list (above) for explanation of each shortcode - switch ( $m[2] ) { - case 'event-title': - $title = esc_html( trim( $this->title ) ); - - if ( $markdown && function_exists( 'Markdown' ) ) - $title = Markdown( $title ); - - if ( $html ) - $title = wp_kses_post( html_entity_decode( $title ) ); - - return $m[1] . $title . $m[6]; - - case 'start-time': - return $m[1] . date_i18n( $this->feed->get_time_format(), $this->start_time + $offset ) . $m[6]; - - case 'start-date': - return $m[1] . date_i18n( $this->feed->get_date_format(), $this->start_time + $offset ) . $m[6]; - - case 'start-custom': - return $m[1] . date_i18n( $format, $this->start_time + $offset ) . $m[6]; - - case 'start-human': - return $m[1] . $this->gce_human_time_diff( $this->start_time + $offset, $this->time_now, $precision ) . $m[6]; - - case 'end-time': - return $m[1] . date_i18n( $this->feed->get_time_format(), $this->end_time + $offset ) . $m[6]; - - case 'end-date': - return $m[1] . date_i18n( $this->feed->get_date_format(), $this->end_time + $offset ) . $m[6]; - - case 'end-custom': - return $m[1] . date_i18n( $format, $this->end_time + $offset ) . $m[6]; - - case 'end-human': - return $m[1] . $this->gce_human_time_diff( $this->end_time + $offset, $this->time_now, $precision ) . $m[6]; - - case 'location': - $location = esc_html( trim( $this->location ) ); - - if ( $markdown && function_exists( 'Markdown' ) ) - $location = Markdown( $location ); - - if ( $html ) - $location = wp_kses_post( html_entity_decode( $location ) ); - - return $m[1] . $location . $m[6]; - - case 'description': - $description = esc_html( trim( $this->description ) ); - - //If a word limit has been set, trim the description to the required length - if ( 0 != $limit ) { - preg_match( '/([\S]+\s*){0,' . $limit . '}/', esc_html( $this->description ), $description ); - $description = trim( $description[0] ); - } - - if ( $markdown || $html ) { - if ( $markdown && function_exists( 'Markdown' ) ) - $description = Markdown( $description ); - - if ( $html ) - $description = wp_kses_post( html_entity_decode( $description ) ); - }else{ - //Otherwise, preserve line breaks - $description = nl2br( $description ); - - //Make URLs clickable if required - if ( $autolink ) - $description = make_clickable( $description ); - } - - return $m[1] . $description . $m[6]; - - case 'link': - $new_window = ( $newwindow ) ? ' target="_blank"' : ''; - return $m[1] . '' . $this->look_for_shortcodes( $m[5] ) . '' . $m[6]; - - case 'url': - return $m[1] . esc_url( $this->link . '&ctz=' . $this->feed->get_timezone() ) . $m[6]; - - case 'feed-id': - return $m[1] . intval( $this->feed->get_feed_id() ) . $m[6]; - - case 'feed-title': - return $m[1] . esc_html( $this->feed->get_feed_title() ) . $m[6]; - - case 'maps-link': - $new_window = ( $newwindow ) ? ' target="_blank"' : ''; - return $m[1] . '' . $this->look_for_shortcodes( $m[5] ) . '' . $m[6]; - - case 'length': - return $m[1] . $this->gce_human_time_diff( $this->start_time, $this->end_time, $precision ) . $m[6]; - - case 'event-num': - return $m[1] . intval( $this->pos ) . $m[6]; - - case 'event-id': - return $m[1] . esc_html( $this->id ) . $m[6]; - - case 'cal-id': - $cal_id = explode( '/', $this->feed->get_feed_url() ); - return $m[1] . esc_html( $cal_id[5] ) . $m[6]; - - case 'if-all-day': - if ( 'SWD' == $this->day_type || 'MWD' == $this->day_type ) - return $m[1] . $this->look_for_shortcodes( $m[5] ) . $m[6]; - - return ''; - - case 'if-not-all-day': - if ( 'SPD' == $this->day_type || 'MPD' == $this->day_type ) - return $m[1] . $this->look_for_shortcodes( $m[5] ) . $m[6]; - - return ''; - - case 'if-title': - if ( '' != $this->title ) - return $m[1] . $this->look_for_shortcodes( $m[5] ) . $m[6]; - - return ''; - - case 'if-description': - if ( '' != $this->description ) - return $m[1] . $this->look_for_shortcodes( $m[5] ) . $m[6]; - - return ''; - - case 'if-location': - if ( '' != $this->location ) - return $m[1] . $this->look_for_shortcodes( $m[5] ) . $m[6]; - - return ''; - - case 'if-tooltip': - if ( 'tooltip' == $this->type ) - return $m[1] . $this->look_for_shortcodes( $m[5] ) . $m[6]; - - return ''; - - case 'if-list': - if ( 'list' == $this->type ) - return $m[1] . $this->look_for_shortcodes( $m[5] ) . $m[6]; - - return ''; - - case 'if-now': - if ( $this->time_now >= $this->start_time && $this->time_now < $this->end_time ) - return $m[1] . $this->look_for_shortcodes( $m[5] ) . $m[6]; - - return ''; - - case 'if-not-now': - if ( $this->end_time < $this->time_now || $this->start_time > $this->time_now ) - return $m[1] . $this->look_for_shortcodes( $m[5] ) . $m[6]; - - return ''; - - case 'if-started': - if ( $this->start_time < $this->time_now ) - return $m[1] . $this->look_for_shortcodes( $m[5] ) . $m[6]; - - return ''; - - case 'if-not-started': - if ( $this->start_time > $this->time_now ) - return $m[1] . $this->look_for_shortcodes( $m[5] ) . $m[6]; - - return ''; - - case 'if-ended': - if ( $this->end_time < $this->time_now ) - return $m[1] . $this->look_for_shortcodes( $m[5] ) . $m[6]; - - return ''; - - case 'if-not-ended': - if ( $this->end_time > $this->time_now ) - return $m[1] . $this->look_for_shortcodes( $m[5] ) . $m[6]; - - return ''; - - case 'if-first': - if ( 0 == $this->num_in_day ) - return $m[1] . $this->look_for_shortcodes( $m[5] ) . $m[6]; - - return ''; - - case 'if-not-first': - if ( 0 != $this->num_in_day ) - return $m[1] . $this->look_for_shortcodes( $m[5] ) . $m[6]; - - return ''; - - case 'if-multi-day': - if ( 'MPD' == $this->day_type || 'MWD' == $this->day_type ) - return $m[1] . $this->look_for_shortcodes( $m[5] ) . $m[6]; - - return ''; - - case 'if-single-day': - if ( 'SPD' == $this->day_type || 'SWD' == $this->day_type ) - return $m[1] . $this->look_for_shortcodes( $m[5] ) . $m[6]; - - return ''; - } - } - - //Return the event markup using the old display options - function use_old_display_options() { - $display_options = $this->feed->get_display_options(); - - $markup = '

' . esc_html( $this->title ) . '

'; - - $start_end = array(); - - //If start date / time should be displayed, set up array of start date and time - if ( 'none' != $display_options['display_start'] ) { - $sd = $this->start_time; - $start_end['start'] = array( - 'time' => date_i18n( $this->feed->get_time_format(), $sd ), - 'date' => date_i18n( $this->feed->get_date_format(), $sd ) - ); - } - - //If end date / time should be displayed, set up array of end date and time - if ( 'none' != $display_options['display_end'] ) { - $ed = $this->end_time; - $start_end['end'] = array( - 'time' => date_i18n( $this->feed->get_time_format(), $ed ), - 'date' => date_i18n( $this->feed->get_date_format(), $ed ) - ); - } - - //Add the correct start / end, date / time information to $markup - foreach ( $start_end as $start_or_end => $info ) { - $markup .= '

' . esc_html( $display_options['display_' . $start_or_end . '_text'] ) . ' '; - - switch ( $display_options['display_' . $start_or_end] ) { - case 'time': $markup .= esc_html( $info['time'] ); - break; - case 'date': $markup .= esc_html( $info['date'] ); - break; - case 'time-date': $markup .= esc_html( $info['time'] . $display_options['display_separator'] . $info['date'] ); - break; - case 'date-time': $markup .= esc_html( $info['date'] . $display_options['display_separator'] . $info['time'] ); - } - - $markup .= '

'; - } - - //If location should be displayed (and is not empty) add to $markup - if ( isset( $display_options['display_location'] ) ) { - $event_location = $this->location; - if ( '' != $event_location ) - $markup .= '

' . esc_html( $display_options['display_location_text'] ) . ' ' . esc_html( $event_location ) . '

'; - } - - //If description should be displayed (and is not empty) add to $markup - if ( isset($display_options['display_desc'] ) ) { - $event_desc = $this->description; - - if ( '' != $event_desc ) { - //Limit number of words of description to display, if required - if ( '' != $display_options['display_desc_limit'] ) { - preg_match( '/([\S]+\s*){0,' . $display_options['display_desc_limit'] . '}/', $this->description, $event_desc ); - $event_desc = trim( $event_desc[0] ); - } - - $markup .= '

' . $display_options['display_desc_text'] . ' ' . make_clickable( nl2br( esc_html( $event_desc ) ) ) . '

'; - } - } - - //If link should be displayed add to $markup - if ( isset($display_options['display_link'] ) ) - $markup .= ''; - - return $markup; - } - - //Returns the difference between two times in human-readable format. Based on a patch for human_time_diff posted in the WordPress trac (http://core.trac.wordpress.org/ticket/9272) by Viper007Bond - function gce_human_time_diff( $from, $to = '', $limit = 1 ) { - $units = array( - 31556926 => array( __( '%s year', GCE_TEXT_DOMAIN ), __( '%s years', GCE_TEXT_DOMAIN ) ), - 2629744 => array( __( '%s month', GCE_TEXT_DOMAIN ), __( '%s months', GCE_TEXT_DOMAIN ) ), - 604800 => array( __( '%s week', GCE_TEXT_DOMAIN ), __( '%s weeks', GCE_TEXT_DOMAIN ) ), - 86400 => array( __( '%s day', GCE_TEXT_DOMAIN ), __( '%s days', GCE_TEXT_DOMAIN ) ), - 3600 => array( __( '%s hour', GCE_TEXT_DOMAIN ), __( '%s hours', GCE_TEXT_DOMAIN ) ), - 60 => array( __( '%s min', GCE_TEXT_DOMAIN ), __( '%s mins', GCE_TEXT_DOMAIN ) ), - ); - - if ( empty( $to ) ) - $to = time(); - - $from = (int) $from; - $to = (int) $to; - $diff = (int) abs( $to - $from ); - - $items = 0; - $output = array(); - - foreach ( $units as $unitsec => $unitnames ) { - if ( $items >= $limit ) - break; - - if ( $diff < $unitsec ) - continue; - - $numthisunits = floor( $diff / $unitsec ); - $diff = $diff - ( $numthisunits * $unitsec ); - $items++; - - if ( $numthisunits > 0 ) - $output[] = sprintf( _n( $unitnames[0], $unitnames[1], $numthisunits ), $numthisunits ); - } - - $seperator = _x( ', ', 'human_time_diff' ); - - if ( ! empty( $output ) ) { - return implode( $seperator, $output ); - } else { - $smallest = array_pop( $units ); - return sprintf( $smallest[0], 1 ); - } - } -} -?> \ No newline at end of file +, Nick Young + * @license GPL-2.0+ + * @copyright 2014 Phil Derksen + */ + +class GCE_Event { + + public $feed; + + /** + * Class constructor + * + * @since 2.0.0 + */ + function __construct( GCE_Feed $feed, $id, $title, $description, $location, $start_time, $end_time, $link ) { + + $this->feed = $feed; + $this->id = $id; + $this->title = $title; + $this->description = $description; + $this->location = $location; + $this->start_time = $start_time; + $this->end_time = $end_time; + $this->link = $link; + + //Calculate which day type this event is (SWD = single whole day, SPD = single part day, MWD = multiple whole day, MPD = multiple part day) + if ( ( $start_time + 86400 ) <= $end_time ) { + if ( ( $start_time + 86400 ) == $end_time ) { + $this->day_type = 'SWD'; + } else { + if ( ( '12:00 am' == date( 'g:i a', $start_time ) ) && ( '12:00 am' == date( 'g:i a', $end_time ) ) ) { + $this->day_type = 'MWD'; + } else { + $this->day_type = 'MPD'; + } + } + } else { + $this->day_type = 'SPD'; + } + } + + /** + * Returns an array of days (as UNIX timestamps) that this events spans + * + * @since 2.0.0 + */ + function get_days() { + //Round start date to nearest day + $start_time = mktime( 0, 0, 0, date( 'm', $this->start_time ), date( 'd', $this->start_time ) , date( 'Y', $this->start_time ) ); + + $days = array(); + + //If multiple day events should be handled, and this event is a multi-day event, add multiple day event to required days + if ( $this->feed->multiple_day_events && ( 'MPD' == $this->day_type || 'MWD' == $this->day_type ) ) { + $on_next_day = true; + $next_day = $start_time; + + while ( $on_next_day ) { + //If the end time of the event is after 00:00 on the next day (therefore, not doesn't end on this day) + if ( $this->end_time > $next_day ) { + //If $next_day is within the event retrieval date range (specified by retrieve events from / until settings) + if ( $next_day >= $this->feed->start && $next_day < $this->feed->end ) { + $days[] = $next_day; + } + } else { + $on_next_day = false; + } + $next_day += 86400; + } + } else { + //Add event into array of events for that day + $days[] = $start_time; + } + + return $days; + } + + /** + * Returns the markup for this event, so that it can be used in the construction of a grid / list + * + * @since 2.0.0 + */ + function get_event_markup( $display_type, $num_in_day, $num ) { + + + + + //Set the display type (either tooltip or list) + $this->type = $display_type; + + //Set which number event this is in day (first in day etc) + $this->num_in_day = $num_in_day; + + //Set the position of this event in array of events currently being processed + $this->pos = $num; + + $this->time_now = current_time( 'timestamp' ); + + // First check if we use the builder or not + $use_simple = get_post_meta( $this->feed->id, 'gce_display_simple', true ); + + if( empty( $use_simple ) ) { + return $this->use_builder(); + } + + // Setup the markup to return + //$display_options = get_option( 'gce_settings_general' ); + + $display_options['display_start'] = get_post_meta( $this->feed->id, 'gce_display_start', true ); + $display_options['display_start_text'] = get_post_meta( $this->feed->id, 'gce_display_start_text', true ); + $display_options['display_end'] = get_post_meta( $this->feed->id, 'gce_display_end', true ); + $display_options['display_end_text'] = get_post_meta( $this->feed->id, 'gce_display_end_text', true ); + $display_options['display_location'] = get_post_meta( $this->feed->id, 'gce_display_location', true ); + $display_options['display_location_text'] = get_post_meta( $this->feed->id, 'gce_display_location_text', true ); + $display_options['display_desc'] = get_post_meta( $this->feed->id, 'gce_display_description', true ); + $display_options['display_desc_text'] = get_post_meta( $this->feed->id, 'gce_display_description_text', true ); + $display_options['display_desc_limit'] = get_post_meta( $this->feed->id, 'gce_display_description_max', true ); + $display_options['display_link'] = get_post_meta( $this->feed->id, 'gce_display_link', true ); + $display_options['display_link_text'] = get_post_meta( $this->feed->id, 'gce_display_link_text', true ); + $display_options['display_separator'] = get_post_meta( $this->feed->id, 'gce_display_separator', true ); + $display_options['display_link_target'] = get_post_meta( $this->feed->id, 'gce_display_link_tab', true ); + + $markup = '

' . esc_html( $this->title ) . '

'; + + $start_end = array(); + + //If start date / time should be displayed, set up array of start date and time + if ( ! empty( $display_options['display_start'] ) && 'none' != $display_options['display_start'] ) { + $sd = $this->start_time; + $start_end['start'] = array( + 'time' => date_i18n( $this->feed->time_format, $sd ), + 'date' => date_i18n( $this->feed->date_format, $sd ) + ); + } + + //If end date / time should be displayed, set up array of end date and time + if ( ! empty( $display_options['display_end'] ) && 'none' != $display_options['display_end'] ) { + $ed = $this->end_time; + $start_end['end'] = array( + 'time' => date_i18n( $this->feed->time_format, $ed ), + 'date' => date_i18n( $this->feed->date_format, $ed ) + ); + } + + //Add the correct start / end, date / time information to $markup + foreach ( $start_end as $start_or_end => $info ) { + $markup .= '

' . esc_html( $display_options['display_' . $start_or_end . '_text'] ) . ' '; + + if( ! empty( $display_options['display_' . $start_or_end] ) ) { + switch ( $display_options['display_' . $start_or_end] ) { + case 'time': $markup .= esc_html( $info['time'] ); + break; + case 'date': $markup .= esc_html( $info['date'] ); + break; + case 'time-date': $markup .= esc_html( $info['time'] . $display_options['display_separator'] . $info['date'] ); + break; + case 'date-time': $markup .= esc_html( $info['date'] . $display_options['display_separator'] . $info['time'] ); + } + } + + $markup .= '

'; + } + + //If location should be displayed (and is not empty) add to $markup + if ( isset( $display_options['display_location'] ) ) { + $event_location = $this->location; + if ( '' != $event_location ) + $markup .= '

' . esc_html( $display_options['display_location_text'] ) . ' ' . esc_html( $event_location ) . '

'; + } + + //If description should be displayed (and is not empty) add to $markup + if ( isset($display_options['display_desc'] ) ) { + $event_desc = $this->description; + + if ( '' != $event_desc ) { + //Limit number of words of description to display, if required + if ( '' != $display_options['display_desc_limit'] ) { + preg_match( '/([\S]+\s*){0,' . $display_options['display_desc_limit'] . '}/', $this->description, $event_desc ); + $event_desc = trim( $event_desc[0] ); + } + + $markup .= '

' . $display_options['display_desc_text'] . ' ' . make_clickable( nl2br( esc_html( $event_desc ) ) ) . '

'; + } + } + + //If link should be displayed add to $markup + if ( isset($display_options['display_link'] ) ) { + $target = ( ! empty( $display_options['display_link_target'] ) ? 'target="blank"' : '' ); + $markup .= ''; + } + + return $markup; + + } + + //Return the event markup using the builder + function use_builder() { + //Array of valid shortcodes + $shortcodes = array( + //Event / feed information shortcodes + + 'event-title', //The event title + 'start-time', //The start time of the event (uses the time format from the feed options, if it is set. Otherwise uses the default WordPress time format) + 'start-date', //The start date of the event (uses the date format from the feed options, if it is set. Otherwise uses the default WordPress date format) + 'start-custom', //The start time / date of the event (uses a custom PHP date format, specified in the 'format' attribute) + 'start-human', //The difference between the start time of the event and the time now, in human-readable format, such as '1 hour', '4 days', '15 mins' + 'end-time', //The end time of the event (uses the time format from the feed options, if it is set. Otherwise uses the default WordPress time format) + 'end-date', //The end date of the event (uses the date format from the feed options, if it is set. Otherwise uses the default WordPress date format) + 'end-custom', //The end time / date of the event (uses a custom PHP date format, specified in the 'format' attribute) + 'end-human', //The difference between the end time of the event and the time now, in human-readable format, such as '1 hour', '4 days', '15 mins' + 'location', //The event location + 'description', //The event deescription (number of words can be limited by the 'limit' attribute) + 'link', //Anything within this shortcode (including further shortcodes) will be linked to the Google Calendar page for this event + 'url', //The raw link URL to the Google Calendar page for this event (can be used to construct more customized links) + 'feed-id', //The ID of this feed (Can be useful for constructing feed specific CSS classes) + 'feed-title', //The feed title + 'maps-link', //Anything within this shortcode (including further shortcodes) will be linked to a Google Maps page based on whatever is specified for the event location + 'length', //How long the events lasts, in human-readable format + 'event-num', //The position of the event in the current list, or the position of the event in the current month (for grids) + 'event-id', //The event UID (unique identifier assigned by Google) + 'cal-id', //The calendar ID + + //Anything between the opening and closing tags of the following logical shortcodes (including further shortcodes) will only be displayed if: + + 'if-all-day', //This is an all-day event + 'if-not-all-day', //This is not an all-day event + 'if-title', //The event has a title + 'if-description', //The event has a description + 'if-location', //The event has a location + 'if-tooltip', //The current display type is 'tooltip' + 'if-list', //The current display type is 'list' + 'if-now', //The event is taking place now (after the start time, but before the end time) + 'if-not-now', //The event is not taking place now (may have ended or not yet started) + 'if-started', //The event has started (and even if it has ended) + 'if-not-started', //The event has not yet started + 'if-ended', //The event has ended + 'if-not-ended', //The event has not ended (and even if it hasn't started) + 'if-first', //The event is the first in the day + 'if-not-first', //The event is not the first in the day + 'if-multi-day', //The event spans multiple days + 'if-single-day' //The event does not span multiple days + ); + + $this->regex = '/(.?)\[(' . implode( '|', $shortcodes ) . ')\b(.*?)(?:(\/))?\](?:(.+?)\[\/\2\])?(.?)/s'; + + return $this->look_for_shortcodes( $this->feed->get_builder() ); + } + + //Look through the EDB markup for shortcodes + function look_for_shortcodes( $markup ) { + return preg_replace_callback( $this->regex, array( $this, 'process_shortcode' ), $markup ); + } + + //Parse a shortcode, returning the appropriate event information + //Much of this code is 'borrowed' from WordPress' own shortcode handling stuff! + function process_shortcode( $m ) { + if ( '[' == $m[1] && ']' == $m[6] ) + return substr( $m[0], 1, -1 ); + + //Extract any attributes contained in the shortcode + extract( shortcode_atts( array( + 'newwindow' => 'false', + 'format' => '', + 'limit' => '0', + 'html' => 'false', + 'markdown' => 'false', + 'precision' => '1', + 'offset' => '0', + 'autolink' => 'true' + ), shortcode_parse_atts( $m[3] ) ) ); + + //Sanitize the attributes + $newwindow = ( 'true' === $newwindow ); + $format = esc_attr( $format ); + $limit = absint( $limit ); + $html = ( 'true' === $html ); + $markdown = ( 'true' === $markdown ); + $precision = absint( $precision ); + $offset = intval( $offset ); + $autolink = ( 'true' === $autolink ); + + //Do the appropriate stuff depending on which shortcode we're looking at. See valid shortcode list (above) for explanation of each shortcode + switch ( $m[2] ) { + case 'event-title': + $title = esc_html( trim( $this->title ) ); + + if ( $markdown && function_exists( 'Markdown' ) ) + $title = Markdown( $title ); + + if ( $html ) + $title = wp_kses_post( html_entity_decode( $title ) ); + + return $m[1] . $title . $m[6]; + + case 'start-time': + return $m[1] . date_i18n( $this->feed->time_format, $this->start_time + $offset ) . $m[6]; + + case 'start-date': + return $m[1] . date_i18n( $this->feed->date_format, $this->start_time + $offset ) . $m[6]; + + case 'start-custom': + return $m[1] . date_i18n( $format, $this->start_time + $offset ) . $m[6]; + + case 'start-human': + return $m[1] . $this->gce_human_time_diff( $this->start_time + $offset, $this->time_now, $precision ) . $m[6]; + + case 'end-time': + return $m[1] . date_i18n( $this->feed->time_format, $this->end_time + $offset ) . $m[6]; + + case 'end-date': + return $m[1] . date_i18n( $this->feed->date_format, $this->end_time + $offset ) . $m[6]; + + case 'end-custom': + return $m[1] . date_i18n( $format, $this->end_time + $offset ) . $m[6]; + + case 'end-human': + return $m[1] . $this->gce_human_time_diff( $this->end_time + $offset, $this->time_now, $precision ) . $m[6]; + + case 'location': + $location = esc_html( trim( $this->location ) ); + + if ( $markdown && function_exists( 'Markdown' ) ) + $location = Markdown( $location ); + + if ( $html ) + $location = wp_kses_post( html_entity_decode( $location ) ); + + return $m[1] . $location . $m[6]; + + case 'description': + $description = esc_html( trim( $this->description ) ); + + //If a word limit has been set, trim the description to the required length + if ( 0 != $limit ) { + preg_match( '/([\S]+\s*){0,' . $limit . '}/', esc_html( $this->description ), $description ); + $description = trim( $description[0] ); + } + + if ( $markdown || $html ) { + if ( $markdown && function_exists( 'Markdown' ) ) + $description = Markdown( $description ); + + if ( $html ) + $description = wp_kses_post( html_entity_decode( $description ) ); + }else{ + //Otherwise, preserve line breaks + $description = nl2br( $description ); + + //Make URLs clickable if required + if ( $autolink ) + $description = make_clickable( $description ); + } + + return $m[1] . $description . $m[6]; + + case 'link': + $new_window = ( $newwindow ) ? ' target="_blank"' : ''; + return $m[1] . '' . $this->look_for_shortcodes( $m[5] ) . '' . $m[6]; + + case 'url': + return $m[1] . esc_url( $this->link . '&ctz=' . $this->feed->timezone_offset ) . $m[6]; + + case 'feed-id': + return $m[1] . intval( $this->feed->id ) . $m[6]; + + case 'feed-title': + return $m[1] . esc_html( $this->feed->title ) . $m[6]; + + case 'maps-link': + $new_window = ( $newwindow ) ? ' target="_blank"' : ''; + return $m[1] . '' . $this->look_for_shortcodes( $m[5] ) . '' . $m[6]; + + case 'length': + return $m[1] . $this->gce_human_time_diff( $this->start_time, $this->end_time, $precision ) . $m[6]; + + case 'event-num': + return $m[1] . intval( $this->pos ) . $m[6]; + + case 'event-id': + return $m[1] . esc_html( $this->id ) . $m[6]; + + case 'cal-id': + $cal_id = explode( '/', $this->feed->feed_url ); + return $m[1] . esc_html( $cal_id[5] ) . $m[6]; + + case 'if-all-day': + if ( 'SWD' == $this->day_type || 'MWD' == $this->day_type ) + return $m[1] . $this->look_for_shortcodes( $m[5] ) . $m[6]; + + return ''; + + case 'if-not-all-day': + if ( 'SPD' == $this->day_type || 'MPD' == $this->day_type ) + return $m[1] . $this->look_for_shortcodes( $m[5] ) . $m[6]; + + return ''; + + case 'if-title': + if ( '' != $this->title ) + return $m[1] . $this->look_for_shortcodes( $m[5] ) . $m[6]; + + return ''; + + case 'if-description': + if ( '' != $this->description ) + return $m[1] . $this->look_for_shortcodes( $m[5] ) . $m[6]; + + return ''; + + case 'if-location': + if ( '' != $this->location ) + return $m[1] . $this->look_for_shortcodes( $m[5] ) . $m[6]; + + return ''; + + case 'if-tooltip': + if ( 'tooltip' == $this->type ) + return $m[1] . $this->look_for_shortcodes( $m[5] ) . $m[6]; + + return ''; + + case 'if-list': + if ( 'list' == $this->type ) + return $m[1] . $this->look_for_shortcodes( $m[5] ) . $m[6]; + + return ''; + + case 'if-now': + if ( $this->time_now >= $this->start_time && $this->time_now < $this->end_time ) + return $m[1] . $this->look_for_shortcodes( $m[5] ) . $m[6]; + + return ''; + + case 'if-not-now': + if ( $this->end_time < $this->time_now || $this->start_time > $this->time_now ) + return $m[1] . $this->look_for_shortcodes( $m[5] ) . $m[6]; + + return ''; + + case 'if-started': + if ( $this->start_time < $this->time_now ) + return $m[1] . $this->look_for_shortcodes( $m[5] ) . $m[6]; + + return ''; + + case 'if-not-started': + if ( $this->start_time > $this->time_now ) + return $m[1] . $this->look_for_shortcodes( $m[5] ) . $m[6]; + + return ''; + + case 'if-ended': + if ( $this->end_time < $this->time_now ) + return $m[1] . $this->look_for_shortcodes( $m[5] ) . $m[6]; + + return ''; + + case 'if-not-ended': + if ( $this->end_time > $this->time_now ) + return $m[1] . $this->look_for_shortcodes( $m[5] ) . $m[6]; + + return ''; + + case 'if-first': + if ( 0 == $this->num_in_day ) + return $m[1] . $this->look_for_shortcodes( $m[5] ) . $m[6]; + + return ''; + + case 'if-not-first': + if ( 0 != $this->num_in_day ) + return $m[1] . $this->look_for_shortcodes( $m[5] ) . $m[6]; + + return ''; + + case 'if-multi-day': + if ( 'MPD' == $this->day_type || 'MWD' == $this->day_type ) + return $m[1] . $this->look_for_shortcodes( $m[5] ) . $m[6]; + + return ''; + + case 'if-single-day': + if ( 'SPD' == $this->day_type || 'SWD' == $this->day_type ) + return $m[1] . $this->look_for_shortcodes( $m[5] ) . $m[6]; + + return ''; + } + } + + //Returns the difference between two times in human-readable format. Based on a patch for human_time_diff posted in the WordPress trac (http://core.trac.wordpress.org/ticket/9272) by Viper007Bond + function gce_human_time_diff( $from, $to = '', $limit = 1 ) { + $units = array( + 31556926 => array( __( '%s year', 'gce' ), __( '%s years', 'gce' ) ), + 2629744 => array( __( '%s month', 'gce' ), __( '%s months', 'gce' ) ), + 604800 => array( __( '%s week', 'gce' ), __( '%s weeks', 'gce' ) ), + 86400 => array( __( '%s day', 'gce' ), __( '%s days', 'gce' ) ), + 3600 => array( __( '%s hour', 'gce' ), __( '%s hours', 'gce' ) ), + 60 => array( __( '%s min', 'gce' ), __( '%s mins', 'gce' ) ), + ); + + if ( empty( $to ) ) + $to = time(); + + $from = (int) $from; + $to = (int) $to; + $diff = (int) abs( $to - $from ); + + $items = 0; + $output = array(); + + foreach ( $units as $unitsec => $unitnames ) { + if ( $items >= $limit ) + break; + + if ( $diff < $unitsec ) + continue; + + $numthisunits = floor( $diff / $unitsec ); + $diff = $diff - ( $numthisunits * $unitsec ); + $items++; + + if ( $numthisunits > 0 ) + $output[] = sprintf( _n( $unitnames[0], $unitnames[1], $numthisunits ), $numthisunits ); + } + + $seperator = _x( ', ', 'human_time_diff' ); + + if ( ! empty( $output ) ) { + return implode( $seperator, $output ); + } else { + $smallest = array_pop( $units ); + return sprintf( $smallest[0], 1 ); + } + } +} \ No newline at end of file diff --git a/wp-content/plugins/google-calendar-events/includes/class-gce-feed.php b/wp-content/plugins/google-calendar-events/includes/class-gce-feed.php new file mode 100644 index 0000000..50db4a4 --- /dev/null +++ b/wp-content/plugins/google-calendar-events/includes/class-gce-feed.php @@ -0,0 +1,273 @@ +, Nick Young + * @license GPL-2.0+ + * @copyright 2014 Phil Derksen + */ + +class GCE_Feed { + + public $id, + $feed_url, + $start, + $end, + $max, + $date_format, + $time_format, + $timezone_offset, + $cache, + $multiple_day_events, + $display_url, + $search_query, + $expand_recurring, + $title; + + public $events = array(); + + /** + * Class constructor + * + * @since 2.0.0 + */ + public function __construct( $id ) { + // Set the ID + $this->id = $id; + + // Set up all other data based on the ID + $this->setup_attributes(); + + // Now create the Feed + $this->create_feed(); + + if( $this->cache > 0 ) { + $this->cache_events(); + } + } + + /** + * Set the transient to cache the events + * + * @since 2.0.0 + */ + private function cache_events() { + set_transient( 'gce_feed_' . $this->id, $this->events, $this->cache ); + } + + /** + * Set all of the feed attributes from the post meta options + * + * @since 2.0.0 + */ + private function setup_attributes() { + $date_format = get_post_meta( $this->id, 'gce_date_format', true ); + $time_format = get_post_meta( $this->id, 'gce_time_format', true ); + + $this->feed_url = get_post_meta( $this->id, 'gce_feed_url', true ); + $this->start = $this->set_feed_length( get_post_meta( $this->id, 'gce_retrieve_from', true ), 'start' ); + $this->end = $this->set_feed_length( get_post_meta( $this->id, 'gce_retrieve_until', true ), 'end' ); + $this->max = get_post_meta( $this->id, 'gce_retrieve_max', true ); + $this->date_format = ( ! empty( $date_format ) ? $date_format : get_option( 'date_format' ) ); + $this->time_format = ( ! empty( $time_format ) ? $time_format : get_option( 'time_format' ) ); + $this->timezone_offset = get_post_meta( $this->id, 'gce_timezone_offset', true ); + $this->cache = get_post_meta( $this->id, 'gce_cache', true ); + $this->multiple_day_events = get_post_meta( $this->id, 'gce_multi_day_events', true ); + $this->search_query = get_post_meta( $this->id, 'gce_search_query', true ); + $this->expand_recurring = get_post_meta( $this->id, 'gce_expand_recurring', true ); + $this->title = get_the_title( $this->id ); + } + + /** + * Create the feed URL + * + * @since 2.0.0 + */ + private function create_feed() { + //Break the feed URL up into its parts (scheme, host, path, query) + + if( empty( $this->feed_url ) ) { + if( current_user_can( 'manage_options' ) ) { + echo '

' . __( 'The feed URL has not been set. Please make sure to set it correctly in the Feed settings.', 'gce' ) . '

'; + } + + return; + } + + $url_parts = parse_url( $this->feed_url ); + + $scheme = ( is_ssl() ? 'https://' : 'http://' ); + + $scheme_and_host = $scheme . $url_parts['host']; + + //Remove the exisitng projection from the path, and replace it with '/full-noattendees' + $path = substr( $url_parts['path'], 0, strrpos( $url_parts['path'], '/' ) ) . '/full-noattendees'; + + //Add the default parameters to the querystring (retrieving JSON, not XML) + $query = '?alt=json&singleevents=true&sortorder=ascending&orderby=starttime'; + + $gmt_offset = $this->timezone_offset * 3600; + + //Append the feed specific parameters to the querystring + $query .= '&start-min=' . date( 'Y-m-d\TH:i:s', $this->start - $gmt_offset ); + $query .= '&start-max=' . date( 'Y-m-d\TH:i:s', $this->end - $gmt_offset ); + $query .= '&max-results=' . $this->max; + + // Set the timezone offset + if ( ! empty( $this->timezone_offset ) && $this->timezone_offset != 'default' ) { + $query .= '&ctz=' . $this->timezone_offset; + } + + if ( ! empty( $this->search_query ) ) { + $query .= '&q=' . rawurlencode( $this->search_query ); + } + + if ( $this->expand_recurring ) { + $query .= '&singleevents=true'; + } + + //Put the URL back together + $this->display_url = $scheme_and_host . $path . $query; + + // Get all the feed data + $this->get_feed_data( $this->display_url ); + } + + /** + * Make remote call to get the feed data + * + * @since 2.0.0 + */ + private function get_feed_data( $url ) { + $raw_data = wp_remote_get( $url, array( + 'sslverify' => false, //sslverify is set to false to ensure https URLs work reliably. Data source is Google's servers, so is trustworthy + 'timeout' => 10 //Increase timeout from the default 5 seconds to ensure even large feeds are retrieved successfully + ) ); + + // First check for transient data to use + if( false !== get_transient( 'gce_feed_' . $this->id ) ) { + $this->events = get_transient( 'gce_feed_' . $this->id ); + } else { + //If $raw_data is a WP_Error, something went wrong + if ( ! is_wp_error( $raw_data ) ) { + //If response code isn't 200, something went wrong + if ( 200 == $raw_data['response']['code'] ) { + //Attempt to convert the returned JSON into an array + $raw_data = json_decode( $raw_data['body'], true ); + + //If decoding was successful + if ( ! empty( $raw_data ) ) { + //If there are some entries (events) to process + if ( isset( $raw_data['feed']['entry'] ) ) { + //Loop through each event, extracting the relevant information + foreach ( $raw_data['feed']['entry'] as $event ) { + $id = ( isset( $event['gCal$uid']['value'] ) ? esc_html( substr( $event['gCal$uid']['value'], 0, strpos( $event['gCal$uid']['value'], '@' ) ) ) : '' ); + $title = ( isset( $event['title']['$t'] ) ? esc_html( $event['title']['$t'] ) : '' ); + $description = ( isset( $event['content']['$t'] ) ? esc_html( $event['content']['$t'] ) : '' ); + $link = ( isset( $event['link'][0]['href'] ) ? esc_url( $event['link'][0]['href'] ) : '' ); + $location = ( isset( $event['gd$where'][0]['valueString'] ) ? esc_html( $event['gd$where'][0]['valueString'] ) : '' ); + $start_time = ( isset( $event['gd$when'][0]['startTime'] ) ? $this->iso_to_ts( $event['gd$when'][0]['startTime'] ) : '' ); + $end_time = ( isset( $event['gd$when'][0]['endTime'] ) ? $this->iso_to_ts( $event['gd$when'][0]['endTime'] ) : '' ); + + //Create a GCE_Event using the above data. Add it to the array of events + $this->events[] = new GCE_Event( $this, $id, $title, $description, $location, $start_time, $end_time, $link ); + } + } + } else { + //json_decode failed + $this->error = __( 'Some data was retrieved, but could not be parsed successfully. Please ensure your feed URL is correct.', 'gce' ); + } + } else { + //The response code wasn't 200, so generate a helpful(ish) error message depending on error code + switch ( $raw_data['response']['code'] ) { + case 404: + $this->error = __( 'The feed could not be found (404). Please ensure your feed URL is correct.', 'gce' ); + break; + case 403: + $this->error = __( 'Access to this feed was denied (403). Please ensure you have public sharing enabled for your calendar.', 'gce' ); + break; + default: + $this->error = sprintf( __( 'The feed data could not be retrieved. Error code: %s. Please ensure your feed URL is correct.', 'gce' ), $raw_data['response']['code'] ); + } + } + }else{ + //Generate an error message from the returned WP_Error + $this->error = $raw_data->get_error_message() . __( ' Please ensure your feed URL is correct.', 'gce' ); + } + } + + if( ! empty( $this->error ) ) { + if( current_user_can( 'manage_options' ) ) { + echo $this->error; + return; + } + } + } + + /** + * Convert an ISO date/time to a UNIX timestamp + * + * @since 2.0.0 + */ + private function iso_to_ts( $iso ) { + sscanf( $iso, "%u-%u-%uT%u:%u:%uZ", $year, $month, $day, $hour, $minute, $second ); + return mktime( $hour, $minute, $second, $month, $day, $year ); + } + + /** + * Return feed start/end + * + * @since 2.0.0 + */ + private function set_feed_length( $value, $type ) { + // All times start at 00:00 + switch ( $value ) { + case 'today': + $return = mktime( 0, 0, 0, date( 'm' ), date( 'j' ), date( 'Y' ) ); + break; + case 'start_week': + $return = mktime( 0, 0, 0, date( 'm' ), ( date( 'j' ) - date( 'w' ) ), date( 'Y' ) ); + break; + case 'start_month': + $return = mktime( 0, 0, 0, date( 'm' ), 1, date( 'Y' ) ); + break; + case 'end_month': + $return = mktime( 0, 0, 0, date( 'm' ) + 1, 1, date( 'Y' ) ); + break; + case 'custom_date': + if( $type == 'start' ) { + $date = get_post_meta( $this->id, 'gce_custom_from', true ); + $fallback = mktime( 0, 0, 0, date( 'm' ), 1, date( 'Y' ) ); + } else { + $date = get_post_meta( $this->id, 'gce_custom_until', true ); + $fallback = mktime( 0, 0, 0, date( 'm' ) + 1, 1, date( 'Y' ) ); + } + + if( ! empty( $date ) ) { + $date = explode( '/', $date ); + $return = mktime( 0, 0, 0, $date[0], $date[1], $date[2] ); + } else { + $return = $fallback; + } + break; + default: + if( $type == 'start' ) { + $return = 0; //any - 1970-01-01 00:00 + } else { + // Set default end time + $return = 2145916800; + } + } + + return $return; + } + + function get_builder() { + + $this->builder = get_post( $this->id )->post_content; + + return $this->builder; + } +} diff --git a/wp-content/plugins/google-calendar-events/includes/gce-feed-cpt.php b/wp-content/plugins/google-calendar-events/includes/gce-feed-cpt.php new file mode 100644 index 0000000..f3917dc --- /dev/null +++ b/wp-content/plugins/google-calendar-events/includes/gce-feed-cpt.php @@ -0,0 +1,289 @@ +, Nick Young + * @license GPL-2.0+ + * @copyright 2014 Phil Derksen + */ + + +/** + * Register Google Calendar Events custom post type + * + * @since 2.0.0 + */ +function gce_setup_cpt() { + + $labels = array( + 'name' => __( 'Google Calendar Feeds', 'gce' ), + 'singular_name' => __( 'Feed', 'gce' ), + 'menu_name' => __( 'GCal Events', 'gce' ), + 'name_admin_bar' => __( 'Feed', 'gce' ), + 'add_new' => __( 'Add New', 'gce' ), + 'add_new_item' => __( 'Add New Feed', 'gce' ), + 'new_item' => __( 'New Feed', 'gce' ), + 'edit_item' => __( 'Edit Feed', 'gce' ), + 'view_item' => __( 'View Feed', 'gce' ), + 'all_items' => __( 'All GCal Feeds', 'gce' ), + 'search_items' => __( 'Search GCal Feeds', 'gce' ), + 'not_found' => __( 'No feeds found.', 'gce' ), + 'not_found_in_trash' => __( 'No feeds found in Trash.', 'gce' ) + ); + + $args = array( + 'labels' => $labels, + 'public' => true, // This removes the 'view' and 'preview' links from what I can tell + 'publicly_queryable' => true, + 'show_ui' => true, + 'show_in_menu' => true, + 'query_var' => true, + 'capability_type' => 'post', + 'has_archive' => false, + 'hierarchical' => false, + 'menu_icon' => plugins_url( '/assets/gcal-icon-16x16.png', GCE_MAIN_FILE ), + 'supports' => array( 'title', 'editor' ) + ); + + register_post_type( 'gce_feed', $args ); + + // MUST ONLY RUN ONCE! + if( false === get_option( 'gce_cpt_setup' ) ) { + flush_rewrite_rules(); + update_option( 'gce_cpt_setup', 1 ); + } + +} +add_action( 'init', 'gce_setup_cpt' ); + +/** + * Messages for Feed actions + * + * @since 2.0.0 + */ +function gce_feed_messages( $messages ) { + global $post, $post_ID; + + $url1 = ''; + $url2 = 'feed'; + $url3 = ''; + $s1 = 'Feed'; + + $messages['gce_feed'] = array( + 1 => sprintf( __( '%4$s updated. %1$sView %2$s%3$s', 'gce' ), $url1, $url2, $url3, $s1 ), + 4 => sprintf( __( '%4$s updated. %1$sView %2$s%3$s', 'gce' ), $url1, $url2, $url3, $s1 ), + 6 => sprintf( __( '%4$s published. %1$sView %2$s%3$s', 'gce' ), $url1, $url2, $url3, $s1 ), + 7 => sprintf( __( '%4$s saved. %1$sView %2$s%3$s', 'gce' ), $url1, $url2, $url3, $s1 ), + 8 => sprintf( __( '%4$s submitted. %1$sView %2$s%3$s', 'gce' ), $url1, $url2, $url3, $s1 ), + 10 => sprintf( __( '%4$s draft updated. %1$sView %2$s%3$s', 'gce' ), $url1, $url2, $url3, $s1 ) + ); + + return $messages; +} +add_filter( 'post_updated_messages', 'gce_feed_messages' ); + + +/** + * Add post meta to tie in with the Google Calendar Events custom post type + * + * @since 2.0.0 + */ +function gce_cpt_meta() { + add_meta_box( 'gce_feed_meta', 'Feed Settings', 'gce_display_meta', 'gce_feed', 'advanced', 'core' ); + + // Sidebar meta box below publish section. + add_meta_box( 'gce_feed_sidebar_help', 'Helpful Links', 'gce_feed_sidebar_help', 'gce_feed', 'side', 'core' ); + + add_meta_box( 'gce_display_options_meta', 'Display Options', 'gce_display_options_meta', 'gce_feed', 'side', 'core' ); +} +add_action( 'add_meta_boxes', 'gce_cpt_meta' ); + +/** + * Function called to display post meta + * + * @since 2.0.0 + */ +function gce_display_meta() { + include_once( GCE_DIR . '/views/admin/gce-feed-meta-display.php' ); +} + +/** + * Function called to display help in sidebar. + * + * @since 2.0.0 + */ +function gce_feed_sidebar_help() { + include_once( GCE_DIR . '/views/admin/gce-feed-sidebar-help.php' ); +} + +/** + * Function called to display post meta + * + * @since 2.0.0 + */ +function gce_display_options_meta() { + include_once( GCE_DIR . '/views/admin/display-options-meta.php' ); +} + +/** + * Function to save post meta for the feed CPT + * + * @since 2.0.0 + */ +function gce_save_meta( $post_id ) { + if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) { + return $post_id; + } + + // An array to hold all of our post meta ids so we can run them through a loop + $post_meta_fields = array( + 'gce_feed_url', + 'gce_retrieve_from', + 'gce_retrieve_until', + 'gce_retrieve_max', + 'gce_date_format', + 'gce_time_format', + 'gce_timezone_offset', + 'gce_cache', + 'gce_multi_day_events', + 'gce_display_mode', + 'gce_custom_from', + 'gce_custom_until', + 'gce_search_query', + 'gce_expand_recurring', + // Display options + 'gce_display_start', + 'gce_display_start_text', + 'gce_display_end', + 'gce_display_end_text', + 'gce_display_separator', + 'gce_display_location', + 'gce_display_location_text', + 'gce_display_description', + 'gce_display_description_text', + 'gce_display_description_max', + 'gce_display_link', + 'gce_display_link_tab', + 'gce_display_link_text', + 'gce_display_simple' + ); + + $post_meta_fields = apply_filters( 'gce_feed_meta', $post_meta_fields ); + + if ( current_user_can( 'edit_post', $post_id ) ) { + // Loop through our array and make sure it is posted and not empty in order to update it, otherwise we delete it + foreach ( $post_meta_fields as $pmf ) { + if ( isset( $_POST[$pmf] ) && ! empty( $_POST[$pmf] ) ) { + if( $pmf == 'gce_feed_url' ) { + update_post_meta( $post_id, $pmf, esc_url( $_POST[$pmf] ) ); + } else { + update_post_meta( $post_id, $pmf, stripslashes( $_POST[$pmf] ) ); + } + } else { + // We want max to be set to 25 by default if nothing is entered + if( $pmf == 'gce_retrieve_max' ) { + update_post_meta( $post_id, $pmf, 25 ); + } else { + delete_post_meta( $post_id, $pmf ); + } + } + } + } + + return $post_id; +} +add_action( 'save_post', 'gce_save_meta' ); + + +/** + * Add column headers to our "All Feeds" CPT page + * + * @since 2.0.0 + */ +function gce_add_column_headers( $defaults ) { + + $new_columns = array( + 'cb' => $defaults['cb'], + 'feed-id' => 'Feed ID', + 'feed-sc' => 'Feed Shortcode', + 'max-events' => 'Max Events', + 'display-type' => 'Display Type' + ); + + return array_merge( $defaults, $new_columns ); +} +add_filter( 'manage_gce_feed_posts_columns', 'gce_add_column_headers' ); + + +/** + * Fill out the columns + * + * @since 2.0.0 + */ +function gce_column_content( $column_name, $post_ID ) { + + switch ( $column_name ) { + + case 'feed-id': + echo $post_ID; + break; + case 'feed-sc': + echo '[gcal id="' . $post_ID . '"]'; + break; + case 'max-events': + $max = get_post_meta( $post_ID, 'gce_retrieve_max', true ); + echo $max; + break; + case 'display-type': + $display = get_post_meta( $post_ID, 'gce_display_mode', true ); + + if( $display == 'grid' ) { + echo 'Grid'; + } else if( $display == 'list' ) { + echo 'List'; + } else { + echo 'Grouped List'; + } + break; + } +} +add_action( 'manage_gce_feed_posts_custom_column', 'gce_column_content', 10, 2 ); + +/** + * Add the "Clear Cache" action to the CPT action links + * + * @since 2.0.0 + */ +function gce_cpt_actions( $actions, $post ) { + if( $post->post_type == 'gce_feed' ) { + $actions['clear_cache'] = 'Clear Cache'; + } + + return $actions; +} +add_filter( 'post_row_actions', 'gce_cpt_actions', 10, 2 ); + + +/** + * Function to clear cache if on the post listing page + * + * @since 2.0.0 + */ +function gce_clear_cache_link() { + if( isset( $_REQUEST['clear_cache'] ) ) { + $post_id = absint( $_REQUEST['clear_cache'] ); + + gce_clear_cache( $post_id ); + + settings_errors( 'gce-notices' ); + } +} +add_action( 'admin_init', 'gce_clear_cache_link' ); + + +function gce_clear_cache_on_save( $post_id ) { + delete_transient( 'gce_feed_' . $post_id ); +} +add_action( 'save_post_gce_feed', 'gce_clear_cache_on_save' ); diff --git a/wp-content/plugins/google-calendar-events/includes/misc-functions.php b/wp-content/plugins/google-calendar-events/includes/misc-functions.php new file mode 100644 index 0000000..ee5dbd1 --- /dev/null +++ b/wp-content/plugins/google-calendar-events/includes/misc-functions.php @@ -0,0 +1,117 @@ + '', + 'max_events' => 25, + 'sort' => 'asc', + 'grouped' => 0, + 'month' => null, + 'year' => null, + 'widget' => 0 + ); + + $args = array_merge( $defaults, $args ); + + extract( $args ); + + $ids = explode( '-', $feed_ids ); + + //Create new display object, passing array of feed id(s) + $d = new GCE_Display( $ids, $title_text, $max_events, $sort ); + $markup = ''; + + if( 'grid' == $display ) { + + $markup = ''; + + if( $widget == 1 ) { + $markup .= '
'; + } else { + $markup .= '
'; + } + + $markup .= $d->get_grid( $year, $month, $widget ); + $markup .= '
'; + + } else if( 'list' == $display || 'list-grouped' == $display ) { + $markup = '
' . $d->get_list( $grouped ) . '
'; + } + + return $markup; +} + +/** +* AJAX function for grid pagination +* +* @since 2.0.0 +*/ +function gce_ajax() { + if ( isset( $_GET['gce_feed_ids'] ) ) { + $ids = $_GET['gce_feed_ids']; + $title = $_GET['gce_title_text']; + $max = $_GET['gce_max_events']; + $month = $_GET['gce_month']; + $year = $_GET['gce_year']; + + $title = ( 'null' == $title ) ? null : $title; + + $args = array( + 'title_text' => $title, + 'max_events' => $max, + 'month' => $month, + 'year' => $year, + ); + + if ( 'page' == $_GET['gce_type'] ) { + echo gce_print_calendar( $ids, 'grid', $args ); + } elseif ( 'widget' == $_GET['gce_type'] ) { + $args['widget'] = 1; + echo gce_print_calendar( $ids, 'grid', $args ); + } + } + die(); +} +add_action( 'wp_ajax_nopriv_gce_ajax', 'gce_ajax' ); +add_action( 'wp_ajax_gce_ajax', 'gce_ajax' ); + +function gce_feed_content( $content ) { + global $post; + + if( $post->post_type == 'gce_feed' ) { + $content = '[gcal id="' . $post->ID . '"]'; + } + + return $content; +} +add_filter( 'the_content', 'gce_feed_content' ); + +/** + * Google Analytics campaign URL. + * + * @since 2.0.0 + * + * @param string $base_url Plain URL to navigate to + * @param string $source GA "source" tracking value + * @param string $medium GA "medium" tracking value + * @param string $campaign GA "campaign" tracking value + * @return string $url Full Google Analytics campaign URL + */ +function gce_ga_campaign_url( $base_url, $source, $medium, $campaign ) { + // $medium examples: 'sidebar_link', 'banner_image' + + $url = add_query_arg( array( + 'utm_source' => $source, + 'utm_medium' => $medium, + 'utm_campaign' => $campaign + ), $base_url ); + + return $url; +} diff --git a/wp-content/plugins/google-calendar-events/inc/php-calendar.php b/wp-content/plugins/google-calendar-events/includes/php-calendar.php similarity index 82% rename from wp-content/plugins/google-calendar-events/inc/php-calendar.php rename to wp-content/plugins/google-calendar-events/includes/php-calendar.php index 87fc946..16f1ee1 100644 --- a/wp-content/plugins/google-calendar-events/inc/php-calendar.php +++ b/wp-content/plugins/google-calendar-events/includes/php-calendar.php @@ -1,83 +1,94 @@ -get_weekday_initial( date_i18n( 'l', $t, true ) ); - } - - list( $month, $year, $month_name, $weekday ) = explode( ',', date_i18n( 'm, Y, F, w', $first_of_month ) ); - $weekday = ( $weekday + 7 - $first_day ) % 7; #adjust for $first_day - $title = esc_html( $month_name ) . ' ' . $year; #note that some locales don't capitalize month and day names - - #Begin calendar. Uses a real . See http://diveintomark.org/archives/2002/07/03 - list( $p, $pl ) = each( $pn ); - list( $n, $nl ) = each( $pn ); #previous and next links, if applicable - - if ( $p ) - $p = '' . ( ( $pl ) ? ( '' . $p . '' ) : $p ) . ' '; - if ( $n ) - $n = ' ' . ( ( $nl ) ? ( '' . $n . '' ) : $n ) . ''; - - $calendar = '' . "\n" . '\n"; - - if ( $day_name_length ) { #if the day names should be shown ($day_name_length > 0) - #if day_name_length is >3, the full name of the day will be printed - foreach ( $day_names as $d ) { - $calendar .= ''; - } - - $calendar .= "\n"; - } - - $time_now = current_time( 'timestamp' ); - $today = mktime( 0, 0, 0, date( 'm', $time_now ), date( 'd', $time_now ), date( 'Y', $time_now ) ); - - if ( $weekday > 0 ) $calendar .= ''; #initial 'empty' days - for ( $day = 1, $days_in_month = date( 't', $first_of_month ); $day <= $days_in_month; $day++, $weekday++ ) { - if ( 7 == $weekday ) { - $weekday = 0; #start a new week - $calendar .= "\n"; - } - - $timestamp = mktime( 0, 0, 0, $month, $day, $year ); - - if ( isset( $days[$timestamp] ) && is_array( $days[$timestamp] ) ) { - list( $link, $classes, $content ) = $days[$timestamp]; - $calendar .= '' ) : '>' ) . ( ( $link ) ? ( '' . $day . '' . $content ) : '' . $day . '' . $content ) . ''; - }else{ - $css_class = ( $timestamp < $time_now ) ? 'gce-day-past' : 'gce-day-future'; - $calendar .= ''; - } - } - - if ( 7 != $weekday ) $calendar .= ''; #remaining "empty" days - - return $calendar . "\n
' . $p . '' . ( ( $month_href ) ? ( '' . $title . '' ) : $title ) . '' . $n . "
' . esc_html( $d['initial'] ) . '
 
' . $day . ' 
\n"; -} +get_weekday_initial( date_i18n( 'l', $t, true ) ); + } + + list( $month, $year, $month_name, $weekday ) = explode( ',', date_i18n( 'm, Y, F, w', $first_of_month ) ); + $weekday = ( $weekday + 7 - $first_day ) % 7; #adjust for $first_day + $title = esc_html( $month_name ) . ' ' . $year; #note that some locales don't capitalize month and day names + + #Begin calendar. Uses a real . See http://diveintomark.org/archives/2002/07/03 + list( $p, $pl ) = each( $pn ); + list( $n, $nl ) = each( $pn ); #previous and next links, if applicable + + if ( $p ) { + if( $widget ) { + $p = '' . ( ( $pl ) ? ( '' . $p . '' ) : $p ) . ' '; + } else { + $p = '' . ( ( $pl ) ? ( '' . $p . ' Back' ) : $p ) . ' '; + } + } + + if ( $n ) { + if( $widget ) { + $n = ' ' . ( ( $nl ) ? ( '' . $n . '' ) : $n ) . ''; + } else { + $n = ' ' . ( ( $nl ) ? ( 'Next ' . $n . '' ) : $n ) . ''; + } + } + + $calendar = '' . "\n" . '\n"; + + if ( $day_name_length ) { #if the day names should be shown ($day_name_length > 0) + #if day_name_length is >3, the full name of the day will be printed + foreach ( $day_names as $d ) { + $calendar .= ''; + } + + $calendar .= "\n"; + } + + $time_now = current_time( 'timestamp' ); + $today = mktime( 0, 0, 0, date( 'm', $time_now ), date( 'd', $time_now ), date( 'Y', $time_now ) ); + + if ( $weekday > 0 ) $calendar .= ''; #initial 'empty' days + for ( $day = 1, $days_in_month = date( 't', $first_of_month ); $day <= $days_in_month; $day++, $weekday++ ) { + if ( 7 == $weekday ) { + $weekday = 0; #start a new week + $calendar .= "\n"; + } + + $timestamp = mktime( 0, 0, 0, $month, $day, $year ); + + if ( isset( $days[$timestamp] ) && is_array( $days[$timestamp] ) ) { + list( $link, $classes, $content ) = $days[$timestamp]; + $calendar .= '' ) : '>' ) . ( ( $link ) ? ( '' . $day . '' . $content ) : '' . $day . '' . $content ) . ''; + }else{ + $css_class = ( $timestamp < $time_now ) ? 'gce-day-past' : 'gce-day-future'; + $calendar .= ''; + } + } + + if ( 7 != $weekday ) $calendar .= ''; #remaining "empty" days + + return $calendar . "\n
' . $p . '' . ( ( $month_href ) ? ( '' . $title . '' ) : $title ) . '' . $n . "
' . esc_html( $d['initial'] ) . '
 
' . $day . ' 
\n"; +} ?> \ No newline at end of file diff --git a/wp-content/plugins/google-calendar-events/includes/register-settings.php b/wp-content/plugins/google-calendar-events/includes/register-settings.php new file mode 100644 index 0000000..1b9732b --- /dev/null +++ b/wp-content/plugins/google-calendar-events/includes/register-settings.php @@ -0,0 +1,157 @@ +, Nick Young + */ + +// Exit if accessed directly. +if ( ! defined( 'ABSPATH' ) ) { + exit; +} + +/** + * Main function to register all of the plugin settings + * + * @since 2.0.0 + */ +function gce_register_settings() { + + $gce_settings = array( + + /* General Settings */ + 'general' => array( + 'save_settings' => array( + 'id' => 'save_settings', + 'name' => __( 'Save Settings', 'gce' ), + 'desc' => __( 'Save your settings when uninstalling this plugin. Useful when upgrading or re-installing.', 'gce' ), + 'type' => 'checkbox' + ) + ) + ); + + /* If the options do not exist then create them for each section */ + if ( false == get_option( 'gce_settings_general' ) ) { + add_option( 'gce_settings_general' ); + } + + /* Add the General Settings section */ + add_settings_section( + 'gce_settings_general', + __( 'General Settings', 'gce' ), + '__return_false', + 'gce_settings_general' + ); + + foreach ( $gce_settings['general'] as $option ) { + add_settings_field( + 'gce_settings_general[' . $option['id'] . ']', + $option['name'], + function_exists( 'gce_' . $option['type'] . '_callback' ) ? 'gce_' . $option['type'] . '_callback' : 'gce_missing_callback', + 'gce_settings_general', + 'gce_settings_general', + gce_get_settings_field_args( $option, 'general' ) + ); + } + + /* Register all settings or we will get an error when trying to save */ + register_setting( 'gce_settings_general', 'gce_settings_general', 'gce_settings_sanitize' ); + +} +add_action( 'admin_init', 'gce_register_settings' ); + +/* + * Return generic add_settings_field $args parameter array. + * + * @since 2.0.0 + * + * @param string $option Single settings option key. + * @param string $section Section of settings apge. + * @return array $args parameter to use with add_settings_field call. + */ +function gce_get_settings_field_args( $option, $section ) { + $settings_args = array( + 'id' => $option['id'], + 'desc' => $option['desc'], + 'name' => $option['name'], + 'section' => $section, + 'size' => isset( $option['size'] ) ? $option['size'] : null, + 'options' => isset( $option['options'] ) ? $option['options'] : '', + 'std' => isset( $option['std'] ) ? $option['std'] : '' + ); + + // Link label to input using 'label_for' argument if text, textarea, password, select, or variations of. + // Just add to existing settings args array if needed. + if ( in_array( $option['type'], array( 'text', 'select', 'textarea', 'password', 'number' ) ) ) { + $settings_args = array_merge( $settings_args, array( 'label_for' => 'gce_settings_' . $section . '[' . $option['id'] . ']' ) ); + } + + return $settings_args; +} + +/* + * Single checkbox callback function + * + * @since 2.0.0 + * + */ +function gce_checkbox_callback( $args ) { + global $gce_options; + + $checked = isset( $gce_options[$args['id']] ) ? checked( 1, $gce_options[$args['id']], false ) : ''; + $html = "\n" . '' . "\n"; + + // Render description text directly to the right in a label if it exists. + if ( ! empty( $args['desc'] ) ) + $html .= '' . "\n"; + + echo $html; +} + +/* + * Function we can use to sanitize the input data and return it when saving options + * + * @since 2.0.0 + * + */ +function gce_settings_sanitize( $input ) { + //add_settings_error( 'gce-notices', '', '', '' ); + return $input; +} + +/* + * Default callback function if correct one does not exist + * + * @since 2.0.0 + * + */ +function gce_missing_callback( $args ) { + printf( __( 'The callback function used for the %s setting is missing.', 'gce' ), $args['id'] ); +} + +/* + * Function used to return an array of all of the plugin settings + * + * @since 2.0.0 + * + */ +function gce_get_settings() { + + // Set default settings + // If this is the first time running we need to set the defaults + if ( ! get_option( 'gce_upgrade_has_run' ) ) { + + $general = get_option( 'gce_settings_general' ); + + $general['save_settings'] = 1; + + update_option( 'gce_settings_general', $general ); + } + + $general_settings = is_array( get_option( 'gce_settings_general' ) ) ? get_option( 'gce_settings_general' ) : array(); + + return $general_settings; +} \ No newline at end of file diff --git a/wp-content/plugins/google-calendar-events/includes/shortcodes.php b/wp-content/plugins/google-calendar-events/includes/shortcodes.php new file mode 100644 index 0000000..e43ee8a --- /dev/null +++ b/wp-content/plugins/google-calendar-events/includes/shortcodes.php @@ -0,0 +1,79 @@ +, Nick Young + * @license GPL-2.0+ + * @copyright 2014 Phil Derksen + */ + + +/** + * Adds support for the new [gcal] shortcode + * + * Supports the old [google-calendar-events] shortcode + * + * @since 2.0.0 + */ +function gce_gcal_shortcode( $attr ) { + + extract( shortcode_atts( array( + 'id' => null, + 'display' => '', + 'max' => 0, + 'order' => 'asc', + 'title' => null, + 'type' => null, + ), $attr, 'gce_feed' ) ); + + // If no ID is specified then return + if( empty( $id ) ) { + return; + } + + $feed_ids = explode( ',', $id ); + + foreach( $feed_ids as $k => $v ) { + // Check for an old ID attached to this feed ID first + $q = new WP_Query( "post_type=gce_feed&meta_key=old_gce_id&meta_value=$v&order=ASC" ); + + if( $q->have_posts() ) { + $q->the_post(); + // Set our ID to the old ID if found + $feed_ids[$k] = get_the_ID(); + $v = get_the_ID(); + } + + if( empty( $display ) ) { + $display = get_post_meta( $v, 'gce_display_mode', true ); + } + } + + // Port over old options + if( $type != null ) { + if( 'ajax' == $type ) { + $display = 'grid'; + } else { + $display = $type; + } + } + + $args = array( + 'title_text' => $title, + 'max_events' => $max, + 'sort' => $order, + 'grouped' => ( $display == 'list-grouped' ? 1 : 0 ), + 'month' => null, + 'year' => null, + 'widget' => 0 + ); + + $feed_ids = implode( '-', $feed_ids ); + + return gce_print_calendar( $feed_ids, $display, $args ); + +} +add_shortcode( 'gcal', 'gce_gcal_shortcode' ); +add_shortcode( 'google-calendar-events', 'gce_gcal_shortcode' ); diff --git a/wp-content/plugins/google-calendar-events/js/admin.js b/wp-content/plugins/google-calendar-events/js/admin.js new file mode 100644 index 0000000..1dc7676 --- /dev/null +++ b/wp-content/plugins/google-calendar-events/js/admin.js @@ -0,0 +1,41 @@ +/** + * Admin JavaScript functions + * + * @package GCE + * @author Phil Derksen , Nick Young + * @license GPL-2.0+ + * @copyright 2014 Phil Derksen + */ + +(function ($) { + "use strict"; + $(function () { + + // Show the hidden text box if custom date is selected (Retrieve From) + $('#gce_retrieve_from').on('change', function() { + + if( $(this).val() == 'custom_date' ) { + $('#gce_custom_from').show(); + } else { + $('#gce_custom_from').hide(); + } + }); + + // Show the hidden text box if custom date is selected (Retrieve Until) + $('#gce_retrieve_until').on('change', function() { + + if( $(this).val() == 'custom_date' ) { + $('#gce_custom_until').show(); + } else { + $('#gce_custom_until').hide(); + } + }); + + // Add jQuery date picker to our 2 custom date fields + $('#gce_custom_from').datepicker(); + $('#gce_custom_until').datepicker(); + + }); +}(jQuery)); + + diff --git a/wp-content/plugins/google-calendar-events/js/gce-admin-script.js b/wp-content/plugins/google-calendar-events/js/gce-admin-script.js deleted file mode 100644 index 94ecd1d..0000000 --- a/wp-content/plugins/google-calendar-events/js/gce-admin-script.js +++ /dev/null @@ -1,29 +0,0 @@ -function correct_options(){ - val = jQuery('select[name="gce_options[use_builder]"]').val(); - - if(val == 'true'){ - jQuery('.gce-simple-display-options').next('.form-table').hide(); - jQuery('.gce-simple-display-options').hide(); - jQuery('.gce-simple-display-options').prev('h3').hide(); - - jQuery('.gce-event-builder').next('.form-table').show(); - jQuery('.gce-event-builder').show(); - jQuery('.gce-event-builder').prev('h3').show(); - }else{ - jQuery('.gce-simple-display-options').next('.form-table').show(); - jQuery('.gce-simple-display-options').show(); - jQuery('.gce-simple-display-options').prev('h3').show(); - - jQuery('.gce-event-builder').next('.form-table').hide(); - jQuery('.gce-event-builder').hide(); - jQuery('.gce-event-builder').prev('h3').hide(); - } -} - -jQuery(document).ready(function(){ - correct_options(); - - jQuery('select[name="gce_options[use_builder]"]').change(function(e){ - correct_options(); - }); -}); \ No newline at end of file diff --git a/wp-content/plugins/google-calendar-events/js/gce-script.js b/wp-content/plugins/google-calendar-events/js/gce-script.js index 5f5ae87..f8453dd 100644 --- a/wp-content/plugins/google-calendar-events/js/gce-script.js +++ b/wp-content/plugins/google-calendar-events/js/gce-script.js @@ -1,45 +1,58 @@ -function gce_ajaxify(target, feed_ids, max_events, title_text, type){ - //Add click event to change month links - jQuery('#' + target + ' .gce-change-month').click(function(){ - //Extract month and year - var month_year = jQuery(this).attr('name').split('-', 2); - //Add loading text to table caption - jQuery('#' + target + ' caption').html(GoogleCalendarEvents.loading); - //Send AJAX request - jQuery.get(GoogleCalendarEvents.ajaxurl,{ - action:'gce_ajax', - gce_type:type, - gce_feed_ids:feed_ids, - gce_title_text:title_text, - gce_widget_id:target, - gce_max_events:max_events, - gce_month:month_year[0], - gce_year:month_year[1] - }, function(data){ - //Replace existing data with returned AJAX data - if(type == 'widget'){ - jQuery('#' + target).html(data); - }else{ - jQuery('#' + target).replaceWith(data); - } - gce_tooltips('#' + target + ' .gce-has-events'); - }); - }); -} - -function gce_tooltips(target_items){ - jQuery(target_items).each(function(){ - //Add qtip to all target items - jQuery(this).qtip({ - content: jQuery(this).children('.gce-event-info'), - position: { corner: { target: 'center', tooltip: 'bottomLeft' }, adjust: { screen: true } }, - hide: { fixed: true, delay: 100, effect: { length: 0 } }, - show: { solo: true, delay: 0, effect: { length: 0 } }, - style: { padding: "0", classes: { tooltip: 'gce-qtip', tip: 'gce-qtip-tip', title: 'gce-qtip-title', content: 'gce-qtip-content', active: 'gce-qtip-active' }, border: { width: 0 } } - }); - }); -} - -jQuery(document).ready(function(){ - gce_tooltips('.gce-has-events'); + +/** + * Public JS functions + * + * @package GCE + * @author Phil Derksen , Nick Young + * @license GPL-2.0+ + * @copyright 2014 Phil Derksen + */ + + +function gce_ajaxify(target, feed_ids, max_events, title_text, type){ + + //Add click event to change month links + jQuery('#' + target + ' .gce-change-month').click(function(){ + //Extract month and year + var month_year = jQuery(this).attr('name').split('-', 2); + //Add loading text to table caption + jQuery('#' + target + ' caption').html('Loading...'); + //Send AJAX request + jQuery.get(gce.ajaxurl,{ + action:'gce_ajax', + gce_type:type, + gce_feed_ids:feed_ids, + gce_title_text:title_text, + gce_widget_id:target, + gce_max_events:max_events, + gce_month:month_year[0], + gce_year:month_year[1] + }, function(data){ + //Replace existing data with returned AJAX data + if(type == 'widget'){ + jQuery('#' + target).html(data); + }else{ + //console.log( 'Replacing content...' ); + jQuery('#' + target).replaceWith(data); + } + gce_tooltips('#' + target + ' .gce-has-events'); + }); + }); +} + +function gce_tooltips(target_items){ + jQuery(target_items).each(function(){ + //Add qtip to all target items + jQuery(this).qtip({ + content: jQuery(this).children('.gce-event-info'), + position: { corner: { target: 'center', tooltip: 'bottomLeft' }, adjust: { screen: true } }, + hide: { fixed: true, delay: 100, effect: { length: 0 } }, + show: { solo: true, delay: 0, effect: { length: 0 } }, + style: { padding: "0", classes: { tooltip: 'gce-qtip', tip: 'gce-qtip-tip', title: 'gce-qtip-title', content: 'gce-qtip-content', active: 'gce-qtip-active' }, border: { width: 0 } } + }); + }); +} + +jQuery(document).ready(function(){ + gce_tooltips('.gce-has-events'); }); \ No newline at end of file diff --git a/wp-content/plugins/google-calendar-events/js/jquery-qtip.js b/wp-content/plugins/google-calendar-events/js/jquery-qtip.js index 1b9e74a..26a8c77 100644 --- a/wp-content/plugins/google-calendar-events/js/jquery-qtip.js +++ b/wp-content/plugins/google-calendar-events/js/jquery-qtip.js @@ -1,15 +1,15 @@ -/*! - * jquery.qtip. The jQuery tooltip plugin - * - * Copyright (c) 2009 Craig Thompson - * http://craigsworks.com - * - * Licensed under MIT - * http://www.opensource.org/licenses/mit-license.php - * - * Launch : February 2009 - * Version : 1.0.0-rc3 - * Released: Tuesday 12th May, 2009 - 00:00 - * Debug: jquery.qtip.debug.js - */ +/*! + * jquery.qtip. The jQuery tooltip plugin + * + * Copyright (c) 2009 Craig Thompson + * http://craigsworks.com + * + * Licensed under MIT + * http://www.opensource.org/licenses/mit-license.php + * + * Launch : February 2009 + * Version : 1.0.0-rc3 + * Released: Tuesday 12th May, 2009 - 00:00 + * Debug: jquery.qtip.debug.js + */ (function(f){f.fn.qtip=function(B,u){var y,t,A,s,x,w,v,z;if(typeof B=="string"){if(typeof f(this).data("qtip")!=="object"){f.fn.qtip.log.error.call(self,1,f.fn.qtip.constants.NO_TOOLTIP_PRESENT,false)}if(B=="api"){return f(this).data("qtip").interfaces[f(this).data("qtip").current]}else{if(B=="interfaces"){return f(this).data("qtip").interfaces}}}else{if(!B){B={}}if(typeof B.content!=="object"||(B.content.jquery&&B.content.length>0)){B.content={text:B.content}}if(typeof B.content.title!=="object"){B.content.title={text:B.content.title}}if(typeof B.position!=="object"){B.position={corner:B.position}}if(typeof B.position.corner!=="object"){B.position.corner={target:B.position.corner,tooltip:B.position.corner}}if(typeof B.show!=="object"){B.show={when:B.show}}if(typeof B.show.when!=="object"){B.show.when={event:B.show.when}}if(typeof B.show.effect!=="object"){B.show.effect={type:B.show.effect}}if(typeof B.hide!=="object"){B.hide={when:B.hide}}if(typeof B.hide.when!=="object"){B.hide.when={event:B.hide.when}}if(typeof B.hide.effect!=="object"){B.hide.effect={type:B.hide.effect}}if(typeof B.style!=="object"){B.style={name:B.style}}B.style=c(B.style);s=f.extend(true,{},f.fn.qtip.defaults,B);s.style=a.call({options:s},s.style);s.user=f.extend(true,{},B)}return f(this).each(function(){if(typeof B=="string"){w=B.toLowerCase();A=f(this).qtip("interfaces");if(typeof A=="object"){if(u===true&&w=="destroy"){while(A.length>0){A[A.length-1].destroy()}}else{if(u!==true){A=[f(this).qtip("api")]}for(y=0;y0))}if(typeof s.options.show.solo=="object"){z=f(s.options.show.solo)}else{if(s.options.show.solo===true){z=f("div.qtip").not(s.elements.tooltip)}}if(z){z.each(function(){if(f(this).qtip("api").status.rendered===true){f(this).qtip("api").hide()}})}if(typeof s.options.show.effect.type=="function"){s.options.show.effect.type.call(s.elements.tooltip,s.options.show.effect.length);s.elements.tooltip.queue(function(){w();f(this).dequeue()})}else{switch(s.options.show.effect.type.toLowerCase()){case"fade":s.elements.tooltip.fadeIn(s.options.show.effect.length,w);break;case"slide":s.elements.tooltip.slideDown(s.options.show.effect.length,function(){w();if(s.options.position.type!=="static"){s.updatePosition(y,true)}});break;case"grow":s.elements.tooltip.show(s.options.show.effect.length,w);break;default:s.elements.tooltip.show(null,w);break}s.elements.tooltip.addClass(s.options.style.classes.active)}return f.fn.qtip.log.error.call(s,1,f.fn.qtip.constants.EVENT_SHOWN,"show")},hide:function(y){var x;if(!s.status.rendered){return f.fn.qtip.log.error.call(s,2,f.fn.qtip.constants.TOOLTIP_NOT_RENDERED,"hide")}else{if(s.elements.tooltip.css("display")==="none"){return s}}clearTimeout(s.timers.show);s.elements.tooltip.stop(true,false);x=s.beforeHide.call(s,y);if(x===false){return s}function w(){s.onHide.call(s,y)}s.cache.toggle=0;if(typeof s.options.hide.effect.type=="function"){s.options.hide.effect.type.call(s.elements.tooltip,s.options.hide.effect.length);s.elements.tooltip.queue(function(){w();f(this).dequeue()})}else{switch(s.options.hide.effect.type.toLowerCase()){case"fade":s.elements.tooltip.fadeOut(s.options.hide.effect.length,w);break;case"slide":s.elements.tooltip.slideUp(s.options.hide.effect.length,w);break;case"grow":s.elements.tooltip.hide(s.options.hide.effect.length,w);break;default:s.elements.tooltip.hide(null,w);break}s.elements.tooltip.removeClass(s.options.style.classes.active)}return f.fn.qtip.log.error.call(s,1,f.fn.qtip.constants.EVENT_HIDDEN,"hide")},updatePosition:function(w,x){var C,G,L,J,H,E,y,I,B,D,K,A,F,z;if(!s.status.rendered){return f.fn.qtip.log.error.call(s,2,f.fn.qtip.constants.TOOLTIP_NOT_RENDERED,"updatePosition")}else{if(s.options.position.type=="static"){return f.fn.qtip.log.error.call(s,1,f.fn.qtip.constants.CANNOT_POSITION_STATIC,"updatePosition")}}G={position:{left:0,top:0},dimensions:{height:0,width:0},corner:s.options.position.corner.target};L={position:s.getPosition(),dimensions:s.getDimensions(),corner:s.options.position.corner.tooltip};if(s.options.position.target!=="mouse"){if(s.options.position.target.get(0).nodeName.toLowerCase()=="area"){J=s.options.position.target.attr("coords").split(",");for(C=0;CG.dimensions.width){G.dimensions.width=J[C]}if(J[C]G.dimensions.height){G.dimensions.height=J[C]}if(J[C]0){if(L.corner.search(/Left/)!==-1){y.left-=s.options.style.border.radius}else{if(L.corner.search(/Right/)!==-1){y.left+=s.options.style.border.radius}}if(L.corner.search(/Top/)!==-1){y.top-=s.options.style.border.radius}else{if(L.corner.search(/Bottom/)!==-1){y.top+=s.options.style.border.radius}}}if(I){if(L.corner.search(/top/)!==-1){y.top-=I}else{if(L.corner.search(/bottom/)!==-1){y.top+=I}}if(L.corner.search(/left/)!==-1){y.left-=I}else{if(L.corner.search(/right/)!==-1){y.left+=I}}if(L.corner.search(/leftMiddle|rightMiddle/)!==-1){y.top-=1}}if(s.options.position.adjust.screen===true){y=o.call(s,y,G,L)}if(s.options.position.target==="mouse"&&s.options.position.adjust.mouse===true){if(s.options.position.adjust.screen===true&&s.elements.tip){K=s.elements.tip.attr("rel")}else{K=s.options.position.corner.tooltip}y.left+=(K.search(/right/i)!==-1)?-6:6;y.top+=(K.search(/bottom/i)!==-1)?-6:6}if(!s.elements.bgiframe&&f.browser.msie&&parseInt(f.browser.version.charAt(0))==6){f("select, object").each(function(){A=f(this).offset();A.bottom=A.top+f(this).height();A.right=A.left+f(this).width();if(y.top+L.dimensions.height>=A.top&&y.left+L.dimensions.width>=A.left){k.call(s)}})}y.left+=s.options.position.adjust.x;y.top+=s.options.position.adjust.y;F=s.getPosition();if(y.left!=F.left||y.top!=F.top){z=s.beforePositionUpdate.call(s,w);if(z===false){return s}s.cache.position=y;if(x===true){s.status.animated=true;s.elements.tooltip.animate(y,200,"swing",function(){s.status.animated=false})}else{s.elements.tooltip.css(y)}s.onPositionUpdate.call(s,w);if(typeof w!=="undefined"&&w.type&&w.type!=="mousemove"){f.fn.qtip.log.error.call(s,1,f.fn.qtip.constants.EVENT_POSITION_UPDATED,"updatePosition")}}return s},updateWidth:function(w){var x;if(!s.status.rendered){return f.fn.qtip.log.error.call(s,2,f.fn.qtip.constants.TOOLTIP_NOT_RENDERED,"updateWidth")}else{if(w&&typeof w!=="number"){return f.fn.qtip.log.error.call(s,2,"newWidth must be of type number","updateWidth")}}x=s.elements.contentWrapper.siblings().add(s.elements.tip).add(s.elements.button);if(!w){if(typeof s.options.style.width.value=="number"){w=s.options.style.width.value}else{s.elements.tooltip.css({width:"auto"});x.hide();if(f.browser.msie){s.elements.wrapper.add(s.elements.contentWrapper.children()).css({zoom:"normal"})}w=s.getDimensions().width+1;if(!s.options.style.width.value){if(w>s.options.style.width.max){w=s.options.style.width.max}if(w").get(0).getContext){z=s.elements.tooltip.find(".qtip-tip canvas:first");x=z.get(0).getContext("2d");x.clearRect(0,0,300,300);y=z.parent("div[rel]:first").attr("rel");B=b(y,s.options.style.tip.size.width,s.options.style.tip.size.height);h.call(s,z,B,s.options.style.tip.color||s.options.style.border.color)}else{if(f.browser.msie){z=s.elements.tooltip.find('.qtip-tip [nodeName="shape"]');z.attr("fillcolor",s.options.style.tip.color||s.options.style.border.color)}}}if(s.options.style.border.radius>0){s.elements.tooltip.find(".qtip-betweenCorners").css({backgroundColor:s.options.style.border.color});if(f("").get(0).getContext){A=g(s.options.style.border.radius);s.elements.tooltip.find(".qtip-wrapper canvas").each(function(){x=f(this).get(0).getContext("2d");x.clearRect(0,0,300,300);y=f(this).parent("div[rel]:first").attr("rel");r.call(s,f(this),A[y],s.options.style.border.radius,s.options.style.border.color)})}else{if(f.browser.msie){s.elements.tooltip.find('.qtip-wrapper [nodeName="arc"]').each(function(){f(this).attr("fillcolor",s.options.style.border.color)})}}}return f.fn.qtip.log.error.call(s,1,f.fn.qtip.constants.EVENT_STYLE_UPDATED,"updateStyle")},updateContent:function(A,y){var z,x,w;if(!s.status.rendered){return f.fn.qtip.log.error.call(s,2,f.fn.qtip.constants.TOOLTIP_NOT_RENDERED,"updateContent")}else{if(!A){return f.fn.qtip.log.error.call(s,2,f.fn.qtip.constants.NO_CONTENT_PROVIDED,"updateContent")}}z=s.beforeContentUpdate.call(s,A);if(typeof z=="string"){A=z}else{if(z===false){return}}if(f.browser.msie){s.elements.contentWrapper.children().css({zoom:"normal"})}if(A.jquery&&A.length>0){A.clone(true).appendTo(s.elements.content).show()}else{s.elements.content.html(A)}x=s.elements.content.find("img[complete=false]");if(x.length>0){w=0;x.each(function(C){f('').load(function(){if(++w==x.length){B()}})})}else{B()}function B(){s.updateWidth();if(y!==false){if(s.options.position.type!=="static"){s.updatePosition(s.elements.tooltip.is(":visible"),true)}if(s.options.style.tip.corner!==false){n.call(s)}}}s.onContentUpdate.call(s);return f.fn.qtip.log.error.call(s,1,f.fn.qtip.constants.EVENT_CONTENT_UPDATED,"loadContent")},loadContent:function(w,z,A){var y;if(!s.status.rendered){return f.fn.qtip.log.error.call(s,2,f.fn.qtip.constants.TOOLTIP_NOT_RENDERED,"loadContent")}y=s.beforeContentLoad.call(s);if(y===false){return s}if(A=="post"){f.post(w,z,x)}else{f.get(w,z,x)}function x(B){s.onContentLoad.call(s);f.fn.qtip.log.error.call(s,1,f.fn.qtip.constants.EVENT_CONTENT_LOADED,"loadContent");s.updateContent(B)}return s},updateTitle:function(w){if(!s.status.rendered){return f.fn.qtip.log.error.call(s,2,f.fn.qtip.constants.TOOLTIP_NOT_RENDERED,"updateTitle")}else{if(!w){return f.fn.qtip.log.error.call(s,2,f.fn.qtip.constants.NO_CONTENT_PROVIDED,"updateTitle")}}returned=s.beforeTitleUpdate.call(s);if(returned===false){return s}if(s.elements.button){s.elements.button=s.elements.button.clone(true)}s.elements.title.html(w);if(s.elements.button){s.elements.title.prepend(s.elements.button)}s.onTitleUpdate.call(s);return f.fn.qtip.log.error.call(s,1,f.fn.qtip.constants.EVENT_TITLE_UPDATED,"updateTitle")},focus:function(A){var y,x,w,z;if(!s.status.rendered){return f.fn.qtip.log.error.call(s,2,f.fn.qtip.constants.TOOLTIP_NOT_RENDERED,"focus")}else{if(s.options.position.type=="static"){return f.fn.qtip.log.error.call(s,1,f.fn.qtip.constants.CANNOT_FOCUS_STATIC,"focus")}}y=parseInt(s.elements.tooltip.css("z-index"));x=6000+f("div.qtip[qtip]").length-1;if(!s.status.focused&&y!==x){z=s.beforeFocus.call(s,A);if(z===false){return s}f("div.qtip[qtip]").not(s.elements.tooltip).each(function(){if(f(this).qtip("api").status.rendered===true){w=parseInt(f(this).css("z-index"));if(typeof w=="number"&&w>-1){f(this).css({zIndex:parseInt(f(this).css("z-index"))-1})}f(this).qtip("api").status.focused=false}});s.elements.tooltip.css({zIndex:x});s.status.focused=true;s.onFocus.call(s,A);f.fn.qtip.log.error.call(s,1,f.fn.qtip.constants.EVENT_FOCUSED,"focus")}return s},disable:function(w){if(!s.status.rendered){return f.fn.qtip.log.error.call(s,2,f.fn.qtip.constants.TOOLTIP_NOT_RENDERED,"disable")}if(w){if(!s.status.disabled){s.status.disabled=true;f.fn.qtip.log.error.call(s,1,f.fn.qtip.constants.EVENT_DISABLED,"disable")}else{f.fn.qtip.log.error.call(s,1,f.fn.qtip.constants.TOOLTIP_ALREADY_DISABLED,"disable")}}else{if(s.status.disabled){s.status.disabled=false;f.fn.qtip.log.error.call(s,1,f.fn.qtip.constants.EVENT_ENABLED,"disable")}else{f.fn.qtip.log.error.call(s,1,f.fn.qtip.constants.TOOLTIP_ALREADY_ENABLED,"disable")}}return s},destroy:function(){var w,x,y;x=s.beforeDestroy.call(s);if(x===false){return s}if(s.status.rendered){s.options.show.when.target.unbind("mousemove.qtip",s.updatePosition);s.options.show.when.target.unbind("mouseout.qtip",s.hide);s.options.show.when.target.unbind(s.options.show.when.event+".qtip");s.options.hide.when.target.unbind(s.options.hide.when.event+".qtip");s.elements.tooltip.unbind(s.options.hide.when.event+".qtip");s.elements.tooltip.unbind("mouseover.qtip",s.focus);s.elements.tooltip.remove()}else{s.options.show.when.target.unbind(s.options.show.when.event+".qtip-create")}if(typeof s.elements.target.data("qtip")=="object"){y=s.elements.target.data("qtip").interfaces;if(typeof y=="object"&&y.length>0){for(w=0;w0){s.elements.target.data("qtip").current=y.length-1}else{s.elements.target.removeData("qtip")}s.onDestroy.call(s);f.fn.qtip.log.error.call(s,1,f.fn.qtip.constants.EVENT_DESTROYED,"destroy");return s.elements.target},getPosition:function(){var w,x;if(!s.status.rendered){return f.fn.qtip.log.error.call(s,2,f.fn.qtip.constants.TOOLTIP_NOT_RENDERED,"getPosition")}w=(s.elements.tooltip.css("display")!=="none")?false:true;if(w){s.elements.tooltip.css({visiblity:"hidden"}).show()}x=s.elements.tooltip.offset();if(w){s.elements.tooltip.css({visiblity:"visible"}).hide()}return x},getDimensions:function(){var w,x;if(!s.status.rendered){return f.fn.qtip.log.error.call(s,2,f.fn.qtip.constants.TOOLTIP_NOT_RENDERED,"getDimensions")}w=(!s.elements.tooltip.is(":visible"))?true:false;if(w){s.elements.tooltip.css({visiblity:"hidden"}).show()}x={height:s.elements.tooltip.outerHeight(),width:s.elements.tooltip.outerWidth()};if(w){s.elements.tooltip.css({visiblity:"visible"}).hide()}return x}})}function p(){var s,w,u,t,v,y,x;s=this;s.beforeRender.call(s);s.status.rendered=true;s.elements.tooltip='';s.elements.tooltip=f(s.elements.tooltip);s.elements.tooltip.appendTo(s.options.position.container);s.elements.tooltip.data("qtip",{current:0,interfaces:[s]});s.elements.wrapper=s.elements.tooltip.children("div:first");s.elements.contentWrapper=s.elements.wrapper.children("div:first").css({background:s.options.style.background});s.elements.content=s.elements.contentWrapper.children("div:first").css(q(s.options.style));if(f.browser.msie){s.elements.wrapper.add(s.elements.content).css({zoom:1})}if(s.options.hide.when.event=="unfocus"){s.elements.tooltip.attr("unfocus",true)}if(typeof s.options.style.width.value=="number"){s.updateWidth()}if(f("").get(0).getContext||f.browser.msie){if(s.options.style.border.radius>0){m.call(s)}else{s.elements.contentWrapper.css({border:s.options.style.border.width+"px solid "+s.options.style.border.color})}if(s.options.style.tip.corner!==false){e.call(s)}}else{s.elements.contentWrapper.css({border:s.options.style.border.width+"px solid "+s.options.style.border.color});s.options.style.border.radius=0;s.options.style.tip.corner=false;f.fn.qtip.log.error.call(s,2,f.fn.qtip.constants.CANVAS_VML_NOT_SUPPORTED,"render")}if((typeof s.options.content.text=="string"&&s.options.content.text.length>0)||(s.options.content.text.jquery&&s.options.content.text.length>0)){u=s.options.content.text}else{if(typeof s.elements.target.attr("title")=="string"&&s.elements.target.attr("title").length>0){u=s.elements.target.attr("title").replace("\\n","
");s.elements.target.attr("title","")}else{if(typeof s.elements.target.attr("alt")=="string"&&s.elements.target.attr("alt").length>0){u=s.elements.target.attr("alt").replace("\\n","
");s.elements.target.attr("alt","")}else{u=" ";f.fn.qtip.log.error.call(s,1,f.fn.qtip.constants.NO_VALID_CONTENT,"render")}}}if(s.options.content.title.text!==false){j.call(s)}s.updateContent(u);l.call(s);if(s.options.show.ready===true){s.show()}if(s.options.content.url!==false){t=s.options.content.url;v=s.options.content.data;y=s.options.content.method||"get";s.loadContent(t,v,y)}s.onRender.call(s);f.fn.qtip.log.error.call(s,1,f.fn.qtip.constants.EVENT_RENDERED,"render")}function m(){var F,z,t,B,x,E,u,G,D,y,w,C,A,s,v;F=this;F.elements.wrapper.find(".qtip-borderBottom, .qtip-borderTop").remove();t=F.options.style.border.width;B=F.options.style.border.radius;x=F.options.style.border.color||F.options.style.tip.color;E=g(B);u={};for(z in E){u[z]='
';if(f("").get(0).getContext){u[z]+=''}else{if(f.browser.msie){G=B*2+3;u[z]+=''}}u[z]+="
"}D=F.getDimensions().width-(Math.max(t,B)*2);y='
';w='
'+u.topLeft+u.topRight+y;F.elements.wrapper.prepend(w);C='
'+u.bottomLeft+u.bottomRight+y;F.elements.wrapper.append(C);if(f("").get(0).getContext){F.elements.wrapper.find("canvas").each(function(){A=E[f(this).parent("[rel]:first").attr("rel")];r.call(F,f(this),A,B,x)})}else{if(f.browser.msie){F.elements.tooltip.append('')}}s=Math.max(B,(B+(t-B)));v=Math.max(t-B,0);F.elements.contentWrapper.css({border:"0px solid "+x,borderWidth:v+"px "+s+"px"})}function r(u,w,s,t){var v=u.get(0).getContext("2d");v.fillStyle=t;v.beginPath();v.arc(w[0],w[1],s,0,Math.PI*2,false);v.fill()}function e(v){var t,s,x,u,w;t=this;if(t.elements.tip!==null){t.elements.tip.remove()}s=t.options.style.tip.color||t.options.style.border.color;if(t.options.style.tip.corner===false){return}else{if(!v){v=t.options.style.tip.corner}}x=b(v,t.options.style.tip.size.width,t.options.style.tip.size.height);t.elements.tip='
';if(f("").get(0).getContext){t.elements.tip+=''}else{if(f.browser.msie){u=t.options.style.tip.size.width+","+t.options.style.tip.size.height;w="m"+x[0][0]+","+x[0][1];w+=" l"+x[1][0]+","+x[1][1];w+=" "+x[2][0]+","+x[2][1];w+=" xe";t.elements.tip+='';t.elements.tip+='';t.elements.contentWrapper.css("position","relative")}}t.elements.tooltip.prepend(t.elements.tip+"
");t.elements.tip=t.elements.tooltip.find("."+t.options.style.classes.tip).eq(0);if(f("").get(0).getContext){h.call(t,t.elements.tip.find("canvas:first"),x,s)}if(v.search(/top/)!==-1&&f.browser.msie&&parseInt(f.browser.version.charAt(0))===6){t.elements.tip.css({marginTop:-4})}n.call(t,v)}function h(t,v,s){var u=t.get(0).getContext("2d");u.fillStyle=s;u.beginPath();u.moveTo(v[0][0],v[0][1]);u.lineTo(v[1][0],v[1][1]);u.lineTo(v[2][0],v[2][1]);u.fill()}function n(u){var t,w,s,x,v;t=this;if(t.options.style.tip.corner===false||!t.elements.tip){return}if(!u){u=t.elements.tip.attr("rel")}w=positionAdjust=(f.browser.msie)?1:0;t.elements.tip.css(u.match(/left|right|top|bottom/)[0],0);if(u.search(/top|bottom/)!==-1){if(f.browser.msie){if(parseInt(f.browser.version.charAt(0))===6){positionAdjust=(u.search(/top/)!==-1)?-3:1}else{positionAdjust=(u.search(/top/)!==-1)?1:2}}if(u.search(/Middle/)!==-1){t.elements.tip.css({left:"50%",marginLeft:-(t.options.style.tip.size.width/2)})}else{if(u.search(/Left/)!==-1){t.elements.tip.css({left:t.options.style.border.radius-w})}else{if(u.search(/Right/)!==-1){t.elements.tip.css({right:t.options.style.border.radius+w})}}}if(u.search(/top/)!==-1){t.elements.tip.css({top:-positionAdjust})}else{t.elements.tip.css({bottom:positionAdjust})}}else{if(u.search(/left|right/)!==-1){if(f.browser.msie){positionAdjust=(parseInt(f.browser.version.charAt(0))===6)?1:((u.search(/left/)!==-1)?1:2)}if(u.search(/Middle/)!==-1){t.elements.tip.css({top:"50%",marginTop:-(t.options.style.tip.size.height/2)})}else{if(u.search(/Top/)!==-1){t.elements.tip.css({top:t.options.style.border.radius-w})}else{if(u.search(/Bottom/)!==-1){t.elements.tip.css({bottom:t.options.style.border.radius+w})}}}if(u.search(/left/)!==-1){t.elements.tip.css({left:-positionAdjust})}else{t.elements.tip.css({right:positionAdjust})}}}s="padding-"+u.match(/left|right|top|bottom/)[0];x=t.options.style.tip.size[(s.search(/left|right/)!==-1)?"width":"height"];t.elements.tooltip.css("padding",0);t.elements.tooltip.css(s,x);if(f.browser.msie&&parseInt(f.browser.version.charAt(0))==6){v=parseInt(t.elements.tip.css("margin-top"))||0;v+=parseInt(t.elements.content.css("margin-top"))||0;t.elements.tip.css({marginTop:v})}}function j(){var s=this;if(s.elements.title!==null){s.elements.title.remove()}s.elements.title=f('
').css(q(s.options.style.title,true)).css({zoom:(f.browser.msie)?1:0}).prependTo(s.elements.contentWrapper);if(s.options.content.title.text){s.updateTitle.call(s,s.options.content.title.text)}if(s.options.content.title.button!==false&&typeof s.options.content.title.button=="string"){s.elements.button=f('').css(q(s.options.style.button,true)).html(s.options.content.title.button).prependTo(s.elements.title).click(function(t){if(!s.status.disabled){s.hide(t)}})}}function l(){var t,v,u,s;t=this;v=t.options.show.when.target;u=t.options.hide.when.target;if(t.options.hide.fixed){u=u.add(t.elements.tooltip)}if(t.options.hide.when.event=="inactive"){s=["click","dblclick","mousedown","mouseup","mousemove","mouseout","mouseenter","mouseleave","mouseover"];function y(z){if(t.status.disabled===true){return}clearTimeout(t.timers.inactive);t.timers.inactive=setTimeout(function(){f(s).each(function(){u.unbind(this+".qtip-inactive");t.elements.content.unbind(this+".qtip-inactive")});t.hide(z)},t.options.hide.delay)}}else{if(t.options.hide.fixed===true){t.elements.tooltip.bind("mouseover.qtip",function(){if(t.status.disabled===true){return}clearTimeout(t.timers.hide)})}}function x(z){if(t.status.disabled===true){return}if(t.options.hide.when.event=="inactive"){f(s).each(function(){u.bind(this+".qtip-inactive",y);t.elements.content.bind(this+".qtip-inactive",y)});y()}clearTimeout(t.timers.show);clearTimeout(t.timers.hide);t.timers.show=setTimeout(function(){t.show(z)},t.options.show.delay)}function w(z){if(t.status.disabled===true){return}if(t.options.hide.fixed===true&&t.options.hide.when.event.search(/mouse(out|leave)/i)!==-1&&f(z.relatedTarget).parents("div.qtip[qtip]").length>0){z.stopPropagation();z.preventDefault();clearTimeout(t.timers.hide);return false}clearTimeout(t.timers.show);clearTimeout(t.timers.hide);t.elements.tooltip.stop(true,true);t.timers.hide=setTimeout(function(){t.hide(z)},t.options.hide.delay)}if((t.options.show.when.target.add(t.options.hide.when.target).length===1&&t.options.show.when.event==t.options.hide.when.event&&t.options.hide.when.event!=="inactive")||t.options.hide.when.event=="unfocus"){t.cache.toggle=0;v.bind(t.options.show.when.event+".qtip",function(z){if(t.cache.toggle==0){x(z)}else{w(z)}})}else{v.bind(t.options.show.when.event+".qtip",x);if(t.options.hide.when.event!=="inactive"){u.bind(t.options.hide.when.event+".qtip",w)}}if(t.options.position.type.search(/(fixed|absolute)/)!==-1){t.elements.tooltip.bind("mouseover.qtip",t.focus)}if(t.options.position.target==="mouse"&&t.options.position.type!=="static"){v.bind("mousemove.qtip",function(z){t.cache.mouse={x:z.pageX,y:z.pageY};if(t.status.disabled===false&&t.options.position.adjust.mouse===true&&t.options.position.type!=="static"&&t.elements.tooltip.css("display")!=="none"){t.updatePosition(z)}})}}function o(u,v,A){var z,s,x,y,t,w;z=this;if(A.corner=="center"){return v.position}s=f.extend({},u);y={x:false,y:false};t={left:(s.left=f.fn.qtip.cache.screen.width+f.fn.qtip.cache.screen.scroll.left),top:(s.top=f.fn.qtip.cache.screen.height+f.fn.qtip.cache.screen.scroll.top)};x={left:(t.left&&(A.corner.search(/right/i)!=-1||(A.corner.search(/right/i)==-1&&!t.right))),right:(t.right&&(A.corner.search(/left/i)!=-1||(A.corner.search(/left/i)==-1&&!t.left))),top:(t.top&&A.corner.search(/top/i)==-1),bottom:(t.bottom&&A.corner.search(/bottom/i)==-1)};if(x.left){if(z.options.position.target!=="mouse"){s.left=v.position.left+v.dimensions.width}else{s.left=z.cache.mouse.x}y.x="Left"}else{if(x.right){if(z.options.position.target!=="mouse"){s.left=v.position.left-A.dimensions.width}else{s.left=z.cache.mouse.x-A.dimensions.width}y.x="Right"}}if(x.top){if(z.options.position.target!=="mouse"){s.top=v.position.top+v.dimensions.height}else{s.top=z.cache.mouse.y}y.y="top"}else{if(x.bottom){if(z.options.position.target!=="mouse"){s.top=v.position.top-A.dimensions.height}else{s.top=z.cache.mouse.y-A.dimensions.height}y.y="bottom"}}if(s.left<0){s.left=u.left;y.x=false}if(s.top<0){s.top=u.top;y.y=false}if(z.options.style.tip.corner!==false){s.corner=new String(A.corner);if(y.x!==false){s.corner=s.corner.replace(/Left|Right|Middle/,y.x)}if(y.y!==false){s.corner=s.corner.replace(/top|bottom/,y.y)}if(s.corner!==z.elements.tip.attr("rel")){e.call(z,s.corner)}}return s}function q(u,t){var v,s;v=f.extend(true,{},u);for(s in v){if(t===true&&s.search(/(tip|classes)/i)!==-1){delete v[s]}else{if(!t&&s.search(/(width|border|tip|title|classes|user)/i)!==-1){delete v[s]}}}return v}function c(s){if(typeof s.tip!=="object"){s.tip={corner:s.tip}}if(typeof s.tip.size!=="object"){s.tip.size={width:s.tip.size,height:s.tip.size}}if(typeof s.border!=="object"){s.border={width:s.border}}if(typeof s.width!=="object"){s.width={value:s.width}}if(typeof s.width.max=="string"){s.width.max=parseInt(s.width.max.replace(/([0-9]+)/i,"$1"))}if(typeof s.width.min=="string"){s.width.min=parseInt(s.width.min.replace(/([0-9]+)/i,"$1"))}if(typeof s.tip.size.x=="number"){s.tip.size.width=s.tip.size.x;delete s.tip.size.x}if(typeof s.tip.size.y=="number"){s.tip.size.height=s.tip.size.y;delete s.tip.size.y}return s}function a(){var s,t,u,x,v,w;s=this;u=[true,{}];for(t=0;t0){v.tip.size.width+=1}if(v.tip.size.height%2>0){v.tip.size.height+=1}if(v.tip.corner===true){v.tip.corner=(s.options.position.corner.tooltip==="center")?false:s.options.position.corner.tooltip}return v}function b(v,u,t){var s={bottomRight:[[0,0],[u,t],[u,0]],bottomLeft:[[0,0],[u,0],[0,t]],topRight:[[0,t],[u,0],[u,t]],topLeft:[[0,0],[0,t],[u,t]],topMiddle:[[0,t],[u/2,0],[u,t]],bottomMiddle:[[0,0],[u,0],[u/2,t]],rightMiddle:[[0,0],[u,t/2],[0,t]],leftMiddle:[[u,0],[u,t],[0,t/2]]};s.leftTop=s.bottomRight;s.rightTop=s.bottomLeft;s.leftBottom=s.topRight;s.rightBottom=s.topLeft;return s[v]}function g(s){var t;if(f("").get(0).getContext){t={topLeft:[s,s],topRight:[0,s],bottomLeft:[s,0],bottomRight:[0,0]}}else{if(f.browser.msie){t={topLeft:[-90,90,0],topRight:[-90,90,-s],bottomLeft:[90,270,0],bottomRight:[90,270,-s]}}}return t}function k(){var s,t,u;s=this;u=s.getDimensions();t='