__construct(); } /** * Setup frontend functionality for WordPress * * @return none * @since 3.0.0.0 */ function __construct () { Shadowbox::__construct (); // Only add these actions when we have options in the database // This allows for selecting to delete options from the admin page if ( ! empty ( $this->options ) ) { add_action ( 'plugins_loaded' , array ( &$this , 'styles' ) , 7 ); add_action ( 'plugins_loaded' , array ( &$this , 'scripts' ) , 8 ); if ( $this->get_option ( 'smartLoad' ) == 'false' ) add_action ( 'wp_footer' , array ( &$this , 'configure' ) , 11 ); // Automatically add Shadowbox to links if ( $this->is_automatic ( 'any' ) ) { if ( $this->get_option ( 'smartLoad' ) == 'false' ) add_filter ( 'the_content', array ( &$this, 'add_attr_to_link' ) , 12 , 2 ); else add_filter ( 'the_posts' , array ( &$this , 'process_posts_early' ) , 10 , 2 ); add_filter ( 'wp_get_attachment_link' , array ( &$this , 'add_attr_to_link' ) , 12 , 2 ); } // If we are automating for images make sure we link directly to the attachment if ( $this->is_automatic ( 'img' ) ) add_filter ( 'attachment_link' , array ( &$this , 'attachment_direct_linkage' ) , 10 , 2 ); if ( ! function_exists ( 'get_admin_url' ) ) add_filter ( 'admin_url' , array ( &$this , 'admin_url_scheme' ) ); } } /** * Do processing on the_posts instead of the_content, this allows us to determine * if we should enqueue JS and CSS early enough to not have to perform "hacks" to * get JS to load in the footer and to keep the CSS from loading when we don't * need it * * @since 3.0.3.3 * @param array $posts posts * @param object $context provided context from the apply_filters call * @return array */ function process_posts_early ( $posts, $context ) { if ( ! empty ( $posts ) ) { for ( $i = 0; $i < count ( $posts ); $i++ ) { $posts[$i]->post_content = $this->add_attr_to_link ( $posts[$i]->post_content , $posts[$i] ); if ( preg_match ( '%(?post_content ) && $this->get_option ( 'smartLoad' ) == 'true' ) $this->possibly_enqueue ( 'shadowbox' ); if ( ! empty ( $posts[$i]->post_excerpt ) ) { $posts[$i]->post_excerpt = $this->add_attr_to_link ( $posts[$i]->post_excerpt , $posts[$i] ); if ( preg_match ( '%(?post_excerpt ) && $this->get_option ( 'smartLoad' ) == 'true' ) $this->possibly_enqueue ( 'shadowbox' ); } } } return $posts; } /** * Replace the URL scheme with the correct scheme. * * Versions of WP before 3.0 do not support telling admin_url which scheme to use, * so we filter it, to make sure it is using the correct one. * * @since 3.0.3.3 * @param string $url The url to filter * @return string */ function admin_url_scheme ( $url ) { $scheme = is_ssl() ? 'https' : 'http'; return str_replace ( array ( 'http://' , 'https://' ) , "$scheme://" , $url ); } /** * Enqueue Shadowbox CSS * * @return none * @since 2.0.3 */ function styles () { $plugin_url = $this->plugin_url (); $shadowbox_css = apply_filters ( 'shadowbox-css' , $plugin_url . '/shadowbox/shadowbox.css' ); wp_register_style ( 'shadowbox-css' , $shadowbox_css , false , $this->sbversion , 'screen' ); wp_register_style ( 'shadowbox-extras' , apply_filters ( 'shadowbox-extras' , $plugin_url . '/css/extras.css' ) , false , $this->version , 'screen' ); if ( $this->get_option ( 'smartLoad' ) != 'true' ) { wp_enqueue_style ( 'shadowbox-css' ); wp_enqueue_style ( 'shadowbox-extras' ); } } /** * Enqueue Shadowbox javascript and dependencies * * @return none * @since 2.0.3 */ function scripts () { $plugin_url = $this->plugin_url (); $adapter = $this->get_option ( 'library' ); $language = $this->get_option ( 'language' ); $players = $this->get_option ( 'players' ); // Make sure we don't run into cross site scripting or similar errors by calling from the correct scheme $scheme = is_ssl() ? 'https' : 'http'; $md5 = $this->md5 (); $uploads = wp_upload_dir (); if ( empty( $uploads['error'] ) && ! empty( $uploads['basedir'] ) ) { $baseurl = $uploads['baseurl']; $basedir = $uploads['basedir']; } else { $baseurl = WP_CONTENT_URL . '/uploads'; $basedir = WP_CONTENT_DIR . '/uploads'; } $shadowbox_url = "$baseurl/shadowbox-js/$md5.js"; $shadowbox_file = "$basedir/shadowbox-js/$md5.js"; wp_register_script ( 'yui' , apply_filters ( 'yui ' , "$scheme://ajax.googleapis.com/ajax/libs/yui/2.8.0r4/build/yahoo-dom-event/yahoo-dom-event.js" ) , false , apply_filters ( 'yui-version' , '2.8.0' ) , true ); wp_register_script ( 'mootools' , apply_filters ( 'mootools' , "$scheme://ajax.googleapis.com/ajax/libs/mootools/1.2.4/mootools-yui-compressed.js" ) , false , apply_filters ( 'mootools-version' , '1.2.4' ) , true ); // Check if we have a cached shadowbox.js from build_shadowbox, else use admin-ajax.php and build and delivery on the fly if ( $this->is_world_readable ( $shadowbox_file ) && $this->get_option ( 'useCache' ) == 'true' ) { $shadowbox = $shadowbox_url; } else { $shadowbox = add_query_arg ( array ( 'action' => 'shadowboxjs' , 'cache' => $md5) , admin_url ( 'admin-ajax.php' , $scheme ) ); } $dependency = $adapter != 'base' ? array ( $adapter ) : false; wp_register_script ( 'shadowbox' , apply_filters ( 'shadowbox-js' , $shadowbox ) , $dependency , $this->sbversion , true ); // If we aren't smart loading go ahead and enqueue, otherwise we will enqueue later if ( $this->get_option ( 'smartLoad' ) != 'true' ) wp_enqueue_script ( 'shadowbox' ); } /** * Possibly enqueue a script to the footer if it is not already enqueued * * Used to enqueue a script to the footer in mid page as long as the * script is not already enqueued. * * @return none * @since 3.0.0.0 */ function possibly_enqueue ( $script ) { if ( did_action ( 'wp_head' ) ) return; wp_enqueue_style ( 'shadowbox-css' ); wp_enqueue_style ( 'shadowbox-extras' ); wp_enqueue_script ( $this->get_option ( 'library' ) ); wp_enqueue_script ( $script ); add_action ( 'wp_footer' , array ( &$this , 'configure' ) , 11 ); } /** * Echo Shadowbox configuration and initialization scripts * * @return none * @since 0.1 */ function configure () { $plugin_url = $this->plugin_url(); $library = $this->get_option ( 'library' ); $start = "\n\n"; $start .= "\n"; $end = "\n\n"; // Shadowbox initialization options foreach ( array_keys ( $this->options ) as $key ) if ( ! in_array ( $key , $this->protected_options () ) ) $params[$key] = $this->get_option ( $key ); $init_vars = apply_filters ( 'shadowbox_conf' , $params ); $init_opts = ''; foreach ( $init_vars as $key => $value ) { if ( in_array ( $key , array ( 'flashParams' , 'flashVars' ) ) ) { $init_opts .= "\t\t$key: " . $this->esc ( $value , 'htmledit' ) . ",\n"; } else if ( in_array ( $value , array ( 'true' , 'false' ) ) || is_int ( $value ) ) { $init_opts .= "\t\t$key: " . $this->esc ( $value ) . ",\n"; } else if ( is_string ( $value ) ) { $init_opts .= "\t\t$key: \"" . $this->esc ( $value ) . "\",\n"; } } // The full Shadowbox configuration $init = "\n"; echo $start . $init . $end; } /** * This function is called by the add_filter WordPress function to * link the gallery images directly to their full size counterpart * * @param string $link The link of the attachment * @param integer $id The id of the post * @return string * @since 2.0.1 */ function attachment_direct_linkage ( $link , $id ) { $mimetypes = array ( 'image/jpeg' , 'image/png' , 'image/gif' ); $post = get_post ( $id ); if ( in_array ( $post->post_mime_type , $mimetypes ) ) return wp_get_attachment_url ( $id ); else return $link; } /** * This function is called by the add_filter WordPress function to add * the rel="shadowbox[post-123]" attribute to all links of a specified * type. * * @param string $content The content of the post * @return string * @since 2.0.3 */ function add_attr_to_link ( $content , $post_or_id = null ) { if ( empty ( $content ) ) return $content; // Set the album ID, if the image is coming from a gallery use the gallery ID, otherwise use the ID of the post if ( is_object ( $post_or_id ) ) { $albumid = "sbpost-{$post_or_id->ID}"; } elseif ( is_int ( $post_or_id ) && $post_or_id != 0 ) { $p = get_post ( $post_or_id ); $albumid = "sbalbum-{$p->post_parent}"; } else { global $post; if ( isset ( $post) && is_object ( $post ) && is_int ( $post->ID ) ) $albumid = "sbpost-{$post->ID}"; else $albumid = "sbgroup-" . time(); } $img_pattern = '/]*)\.(bmp|gif|jpe|jpe?g|png)\\2(.*?)>/i'; $mov_pattern = '/]*)\.(swf|dv|moo?v|movie|asf|wmv?|avi|mpe?g)\\2(.*?)>/i'; $aud_pattern = '/]*)\.(mp3|aac)\\2(.*?)>/i'; $tube_pattern = '/]*)(youtube\.com\/(watch|v\/)|video\.google\.com\/googleplayer.swf)(.*?)\\2(.*?)>/i'; $flv_pattern = '/]*)\.(flv|f4v|mp4)\\2(.*?)>/i'; $master_pattern = '/]*)(\.(bmp|gif|jpe|jpe?g|png|swf|flv|f4v|dv|moo?v|movie|mp4|asf|wmv?|avi|mpe?g|mp3|aac)\\2|(youtube\.com\/(watch|v\/)|video\.google\.com\/googleplayer.swf))(.*?)>/i'; // Rel attrs for different file types $img_rel_attr = 'rel=$2shadowbox[' . $albumid . '];player=img;$2'; $mov_rel_attr = 'rel=$2shadowbox[' . $albumid . '];width=' . $this->get_option ( 'genericVideoWidth' ) . ';height=' . $this->get_option ( 'genericVideoHeight' ) . ';$2'; $aud_rel_attr = 'rel=$2shadowbox[' . $albumid . '];player=flv;width=500;height=0;$2'; $tube_rel_attr = 'rel=$2shadowbox[' . $albumid . '];player=swf;width=' . $this->get_option ( 'genericVideoWidth' ) . ';height=' . $this->get_option ( 'genericVideoHeight' ) . ';$2'; $flv_rel_attr = 'rel=$2shadowbox[' . $albumid . '];player=flv;width=' . $this->get_option ( 'genericVideoWidth' ) . ';height=' . $this->get_option ( 'genericVideoHeight' ) . ';$2'; // Replacement patterns $img_replace = ''; $mov_replace = ''; $aud_replace = ''; $tube_replace = ''; $flv_replace = ''; // Non specific search patterns $rel_pattern = '/\ rel=([\'"])(.*?)\\1/i'; $box_rel_pattern = '/\ rel=([\'"])(.*?)(shadow|light|no)box(.*?)\\1/i'; $slbox_rel_pattern = '/\ rel=([\'"])(.*?)(shadow|light)box(.*?)\\1/i'; if ( preg_match_all ( $master_pattern , $content , $links ) ) { $modify = false; foreach ( $links[0] as $link ) { if ( preg_match ( $img_pattern , $link ) && $this->get_option ( 'autoimg' ) == "true" ) { $link_pattern = $img_pattern; $rel_attr = $img_rel_attr; $link_replace = $img_replace; $modify = true; } else if ( preg_match ( $mov_pattern , $link ) && $this->get_option ( 'automov' ) == "true" ) { $link_pattern = $mov_pattern; $rel_attr = $mov_rel_attr; $link_replace = $mov_replace; $modify = true; } else if ( preg_match ( $aud_pattern , $link ) && $this->get_option ( 'autoaud' ) == "true" ) { $link_pattern = $aud_pattern; $rel_attr = $aud_rel_attr; $link_replace = $aud_replace; $modify = true; } else if ( preg_match ( $tube_pattern , $link ) && $this->get_option ( 'autotube' ) == "true" ) { $link_pattern = $tube_pattern; $rel_attr = $tube_rel_attr; $link_replace = $tube_replace; $modify = true; } else if ( preg_match ( $flv_pattern , $link ) && $this->get_option ( 'autoflv' ) == "true" ) { $link_pattern = $flv_pattern; $rel_attr = $flv_rel_attr; $link_replace = $flv_replace; $modify = true; } if ( ! preg_match ( $rel_pattern , $link ) && $modify === true ) { $link_replace = preg_replace ( $link_pattern , $link_replace , $link ); $content = str_replace ( $link , $link_replace , $content ); } else if ( ! preg_match ( $box_rel_pattern , $link ) && $modify === true ) { preg_match ( $rel_pattern , $link , $link_rel ); $link_no_rel = preg_replace( $rel_pattern , '' , $link ); $link_replace = preg_replace ( $link_pattern , $link_replace , $link_no_rel ); $content = str_replace ( $link , $link_replace , $content ); } $modify = false; } } // Check to see if we need to try to load shadowbox and dependencies into the footer if ( preg_match ( $slbox_rel_pattern , $content ) && $this->get_option ( 'smartLoad' ) == 'true' ) { $this->possibly_enqueue ( 'shadowbox' ); } return $content; } }