web/wp-content/plugins/ajax-calendar/ajax-calendar.php
changeset 194 32102edaa81b
parent 136 bde1974c263b
--- a/web/wp-content/plugins/ajax-calendar/ajax-calendar.php	Thu Sep 16 15:45:36 2010 +0000
+++ b/web/wp-content/plugins/ajax-calendar/ajax-calendar.php	Mon Nov 19 18:26:13 2012 +0100
@@ -1,88 +1,149 @@
-<?php
-/*
-Plugin Name: AJAX Calendar
-Plugin URI: http://urbangiraffe.com/plugins/ajax-calendar/
-Description: A version of the WordPress calendar that uses AJAX to allow the user to step through the months without updating the page.  Additionally, a click on the 'expand' link shows all the posts within that month, inside the calendar.  Caching of content can be enabled to increase speed.
-Version: 2.4.9
-Author: John Godley
-Author URI: http://urbangiraffe.com
-*/
-
-include_once (dirname (__FILE__).'/plugin.php');
-include_once (dirname (__FILE__).'/models/widget.php');
-
-if (!class_exists ('AJAX_Calendar'))
-{
-class AJAX_Calendar extends AJAX_Calendar_Plugin
-{
-	function AJAX_Calendar ()
-	{
-		$this->register_plugin ('ajax-calendar', __FILE__);
-
-		if (is_admin ())
-		{
-		  $this->add_action ('publish_post', 'cache_remove');
-		  $this->add_action ('save_post',    'cache_remove');
-		  $this->add_action ('delete_post',  'cache_remove');
-		}
-		else
-		  $this->add_action ('wp_head');
-
-		$this->widget = new AJAX_Calendar_Widget ('AJAX Calendar');
-	}
-
-	function show ($categories = '')
-	{
-		include_once (dirname (__FILE__).'/models/calendar.php');
-
-		$this->render ('calendar', array ('calendar' => new Calendar ($this->url (), $categories)));
-	}
-
-	function wp_head ()
-	{
-		$this->render ('head');
-	}
-
-	function cache_remove ($id)
-	{
-	  $post = wp_get_single_post ($id);
-
-	  $postmonth = substr ($post->post_date, 5, 2);
-	  $postyear  = substr ($post->post_date, 0, 4);
-	  $modmonth  = substr ($post->post_modified, 5, 2);
-	  $modyear   = substr ($post->post_modified, 0, 4);
-
-	  // Delete the cache files for the two dates, just in case something has changed
-	  for ($x = 0; $x < 2; $x++)
-	  {
-			wp_cache_delete ($postyear."_".$postmonth."_".$x);
-			wp_cache_delete ($modyear."_".$modmonth."_".$x);
-	  }
-	}
-
-	function &get ()
-	{
-    static $instance;
-
-    if (!isset ($instance))
-		{
-			$c = __CLASS__;
-			$instance = new $c;
-    }
-
-    return $instance;
-	}
-}
-
-
-function ajax_calendar ($categories = '')
-{
-	$calendar = AJAX_Calendar::get ();
-	$calendar->show ($categories);
-}
-}
-
-
-$ajax_calendar_plugin = AJAX_Calendar::get ();
-
-?>
\ No newline at end of file
+<?php
+/*
+Plugin Name: AJAX Calendar
+Plugin URI: http://urbangiraffe.com/plugins/ajax-calendar/
+Description: A version of the WordPress calendar that uses AJAX to allow the user to step through the months without updating the page. 
+Version: 2.5.1
+Author: John Godley
+Author URI: http://urbangiraffe.com
+*/
+
+class AJAX_Calendar_Widget extends WP_Widget {
+	var $category_ids = array();
+
+	function AJAX_Calendar_Widget() {
+		$widget_ops  = array( 'classname' => 'ajax_calendar_widget', 'description' => __( 'AJAX Powered Calendar', 'ajax-calendar' ) );
+		$control_ops = array( 'width' => 300, 'height' => 300 );
+
+		$this->WP_Widget( 'ajax-calendar', __( 'AJAX Calendar', 'ajax-calendar' ), $widget_ops, $control_ops );
+
+		add_action( 'template_redirect', array( &$this, 'template_redirect' ) );
+	}
+	
+	function template_redirect() {
+		if ( is_date() && isset( $_GET['ajax'] ) && $_GET['ajax'] == 'true' ) {
+			$settings = $this->get_settings();
+			$settings = $settings[$this->number];
+			
+			$instance     = wp_parse_args( $settings, array( 'title' => __( 'AJAX Calendar', 'ajax-calendar' ), 'category_id' => '' ) );
+			$this->category_ids = array_filter( explode( ',', $instance['category_id'] ) );
+			
+			echo $this->get_calendar();
+			die();
+		}
+	}
+	
+	/**
+	 * Display the widget
+	 *
+	 * @param string $args Widget arguments
+	 * @param string $instance Widget instance
+	 * @return void
+	 **/
+	function widget( $args, $instance ) {
+		extract( $args );
+	
+		$instance     = wp_parse_args( (array)$instance, array( 'title' => __( 'AJAX Calendar', 'ajax-calendar' ), 'category_id' => '' ) );
+		$title        = apply_filters( 'widget_title', $instance['title'] );
+		$category_id  = $instance['category_id'];
+
+		$this->category_ids = array_filter( explode( ',', $category_id ) );
+		
+		echo $before_widget;
+	
+		if ( $title )
+			echo $before_title . stripslashes( $title ) . $after_title;
+
+		echo $this->get_calendar();
+
+		// MicroAJAX: http://www.blackmac.de/index.php?/archives/31-Smallest-JavaScript-AJAX-library-ever!.html
+?>
+<script type="text/javascript">
+function show_micro_ajax(response){document.getElementById('wp-calendar').innerHTML=response;}
+function microAjax(url,cF){this.bF=function(caller,object){return function(){return caller.apply(object,new Array(object));}};
+this.sC=function(object){if(this.r.readyState==4){this.cF(this.r.responseText);}};
+this.gR=function(){if(window.ActiveXObject)
+return new ActiveXObject('Microsoft.XMLHTTP');else if(window.XMLHttpRequest)
+return new XMLHttpRequest();else return false;};
+if(arguments[2])this.pb=arguments[2];else this.pb="";this.cF=cF;this.url=url;this.r=this.gR();if(this.r){this.r.onreadystatechange=this.bF(this.sC,this);if(this.pb!=""){this.r.open("POST",url,true);this.r.setRequestHeader('Content-type','application/x-www-form-urlencoded');this.r.setRequestHeader('Connection','close');}else{this.r.open("GET",url,true);}
+this.r.send(this.pb);}}
+</script>
+<?php
+		// After
+		echo $after_widget;
+	}
+	
+	function get_calendar() {
+		global $wpdb, $m, $monthnum, $year, $wp_locale, $posts;
+
+		add_filter( 'query', array( &$this, 'modify_calendar_query' ) );
+		
+		$text = get_calendar( true, false );
+		
+		remove_filter( 'query', array( &$this, 'modify_calendar_query' ) );
+		
+		$text = str_replace( '<td colspan="3" id="next"><a', '<td colspan="3" id="next"><a onclick="microAjax(this.href + \'?ajax=true\',show_micro_ajax); return false"', $text );
+		$text = str_replace( '<td colspan="3" id="prev"><a', '<td colspan="3" id="prev"><a onclick="microAjax(this.href + \'?ajax=true\',show_micro_ajax); return false"', $text );
+		return $text;
+	}
+		
+	function modify_calendar_query( $query ) {
+		if ( !empty( $this->category_ids ) ) {
+			global $wpdb;
+			
+			$query = str_replace( 'WHERE', "LEFT JOIN {$wpdb->prefix}term_relationships ON {$wpdb->prefix}posts.ID = {$wpdb->prefix}term_relationships.object_id INNER JOIN {$wpdb->prefix}term_taxonomy ON ({$wpdb->prefix}term_relationships.term_taxonomy_id = {$wpdb->prefix}term_taxonomy.term_taxonomy_id AND {$wpdb->prefix}term_taxonomy.taxonomy='category') WHERE", $query );
+			if ( strpos( $query, 'ORDER' ) !== false )
+				$query = str_replace( "ORDER", "AND {$wpdb->prefix}term_taxonomy.term_id IN (".implode (',', $this->category_ids ).') ORDER', $query );
+			else
+				$query .= "AND {$wpdb->prefix}term_taxonomy.term_id IN (".implode (',', $this->category_ids ).')';
+		}
+
+		return $query;
+	}
+	
+	/**
+	 * Display config interface
+	 *
+	 * @param string $instance Widget instance
+	 * @return void
+	 **/
+	function form( $instance ) {
+		$instance = wp_parse_args( (array)$instance, array( 'title' => __( 'AJAX Calendar', 'ajax-calendar' ), 'category_id' => '' ) );
+
+		$title        = stripslashes( $instance['title'] );
+		$category_id  = $instance['category_id'];
+
+		?>
+<p><label for="<?php echo $this->get_field_id( 'title' ); ?>"><?php _e( 'Title:', 'ajax-calendar' ); ?> <input class="widefat" id="<?php echo $this->get_field_id( 'title' ); ?>" name="<?php echo $this->get_field_name( 'title' ); ?>" type="text" value="<?php echo esc_attr( $title ); ?>" /></label></p>
+<p><label for="<?php echo $this->get_field_id( 'category_id' ); ?>"><?php _e( 'Category IDs:', 'ajax-calendar' ); ?> <input class="widefat" id="<?php echo $this->get_field_id( 'category_id' ); ?>" name="<?php echo $this->get_field_name( 'category_id' ); ?>" type="text" value="<?php echo esc_attr( $category_id ); ?>" /></label></p>
+		<?php
+	}
+		
+	/**
+	 * Save widget data
+	 *
+	 * @param string $new_instance
+	 * @param string $old_instance
+	 * @return void
+	 **/
+	function update( $new_instance, $old_instance ) {
+		$instance     = $old_instance;
+		$new_instance = wp_parse_args( (array)$new_instance, array( 'title' => __( 'AJAX Calendar', 'ajax-calendar' ), 'category_id' => '' ) );
+
+		$instance['title']        = wp_filter_nohtml_kses( $new_instance['title'] );
+		$instance['category_id']  = implode( ',', array_filter( array_map( 'intval', explode( ',', $new_instance['category_id'] ) ) ) );
+		
+		return $instance;
+	}
+}
+
+function register_ajax_calendar_widget() {
+	register_widget( 'AJAX_Calendar_Widget' );
+}
+
+add_action( 'widgets_init', 'register_ajax_calendar_widget' );
+
+function ajax_calendar ($categories = '') {
+	// $calendar = AJAX_Calendar::get ();
+	// $calendar->show ( $categories );
+}