<?php

add_action( 'widgets_init', 'tie_latest_tweet_widget' );
function tie_latest_tweet_widget() {
	register_widget( 'tie_Latest_Tweets' );
}
class tie_Latest_Tweets extends WP_Widget {

	public function __construct(){
		$widget_ops 	= array( 'classname' => 'twitter-widget'  );
		$control_ops 	= array( 'width' => 250, 'height' => 350, 'id_base' => 'latest_tweets_widget' );
		parent::__construct( 'latest_tweets_widget', THEME_NAME .' - '.__( 'Twitter' , 'tie') , $widget_ops, $control_ops );
	}

	public function widget( $args, $instance ) {
		extract( $args );

		$title      = apply_filters( 'widget_title', empty( $instance['title'] ) ? '' : $instance['title'], $instance, $this->id_base );
		$no_of_tweets 		= $instance['no_of_tweets'];
		$twitter_username 	= $instance['username'];
		$consumer_key 		= $instance['consumer_key'];
		$consumer_secret	= $instance['consumer_secret'];
		$widget_id 			= $args['widget_id'];
		$cacheTime			= 30;

	if( !empty($twitter_username) && !empty($consumer_key) && !empty($consumer_secret) ){

	    $token 			= get_option( 'tie_TwitterToken'.$widget_id );
		$twitter_data 	= get_transient( 'list_tweets'.$widget_id );

		if( empty( $twitter_data ) ){

			if( !$token ) {
				// preparing credentials
				$credentials = $consumer_key . ':' . $consumer_secret;
				$toSend = base64_encode($credentials);

				// http post arguments
				$args = array(
					'method' 		=> 'POST',
					'httpversion' 	=> '1.1',
					'blocking' 		=> true,
					'headers' 		=> array(
							'Authorization' => 'Basic ' . $toSend,
							'Content-Type' 	=> 'application/x-www-form-urlencoded;charset=UTF-8'
					),
					'body' => array( 'grant_type' => 'client_credentials' )
				);

				add_filter('https_ssl_verify', '__return_false');
				$response 	= wp_remote_post('https://api.twitter.com/oauth2/token', $args);
				$keys 		= json_decode(wp_remote_retrieve_body($response));

				if($keys) {
					// saving token to wp_options table
					update_option( 'tie_TwitterToken'.$widget_id , $keys->access_token);
					$token = $keys->access_token;
				}
			}

			// we have bearer token wether we obtained it from API or from options
			$args = array(
				'httpversion' 	=> '1.1',
				'blocking' 		=> true,
				'headers' 		=> array(
						'Authorization' => "Bearer $token"
				)
			);

			add_filter('https_ssl_verify', '__return_false');
			$api_url 	= "https://api.twitter.com/1.1/statuses/user_timeline.json?screen_name=$twitter_username&count=$no_of_tweets";
			$response 	= wp_remote_get($api_url, $args);

			if (!is_wp_error($response)) {
				$twitter_data = json_decode(wp_remote_retrieve_body($response));
				set_transient( 'list_tweets'.$widget_id  , $twitter_data, 60 * $cacheTime);
			}

	    }

		echo $before_widget;
			echo $before_title; ?>
			<a href="http://twitter.com/<?php echo $twitter_username  ?>"><?php echo $title ; ?></a>
		<?php echo $after_title;

			if( is_array($twitter_data)){
            		$i=0;
					$hyperlinks 	= true;
					$twitter_users 	= true;
					$update 		= true;
					echo '
<div class="twitter-widget-content" >
<ul class="twitter_update_list">';
		            foreach($twitter_data as $item){
		                    $msg 		= $item->text;
		                    $permalink 	= 'http://twitter.com/#!/'. $twitter_username .'/status/'. $item->id_str;
		                    $link 		= $permalink;
		                     echo '
<li class="twitter-item">
	<i class="fa fa-twitter"></i>';
		                      if ($hyperlinks){    $msg = $this->hyperlinks($msg); }
		                      if ($twitter_users){ $msg = $this->twitter_users($msg); }
		                      echo $msg;
		                    if($update) {
		                      $time = strtotime($item->created_at);
		                      if ( ( abs( time() - $time) ) < 86400 ){
		                        $h_time = sprintf( __ti( '%s ago' ), human_time_diff( $time ) );

		                      }else{
		                        $h_time = date( 'Y/m/d' , $time);
		                      }
							  echo '<small class="twitter-timestamp"><abbr title="' . date( 'Y/m/d H:i:s' , $time ) . '">' . $h_time . '</abbr></small>';
		                     }
		                    echo '</li>
';
		                    $i++;
		                    if ( $i >= $no_of_tweets ) break;
		            }
					echo '</ul> </div>
';
            	}
				else{
					?> <a href="http://twitter.com/<?php echo $twitter_username  ?>"><?php echo $title ; ?></a>
<?php			}
            ?>
		<?php

		echo $after_widget;
	}
	else{
		echo $before_widget;
		echo $before_title; ?>
			<a href="http://twitter.com/<?php echo $twitter_username  ?>"><?php echo $title ; ?></a>
		<?php echo $after_title;
		echo "Error Can't Get Tweets ... incorrect account info .";
		echo $after_widget;
	}
}

	public function update( $new_instance, $old_instance ) {
		$id = explode("-", $this->get_field_id("widget_id"));
		$widget_id =  $id[1] . "-" . $id[2];

		$instance = $old_instance;
		$instance['title'] 				    = strip_tags( $new_instance['title'] );
		$instance['no_of_tweets'] 		= strip_tags( $new_instance['no_of_tweets'] );
		$instance['username'] 			  = strip_tags( $new_instance['username'] );
		$instance['consumer_key'] 		= strip_tags( $new_instance['consumer_key'] );
		$instance['consumer_secret'] 	= strip_tags( $new_instance['consumer_secret'] );

		delete_option(    'tie_TwitterToken'.$widget_id );
		delete_transient( 'list_tweets'.$widget_id );
		return $instance;
	}

	public function form( $instance ) {

		$defaults = array(
			'title'           =>__('@Follow Me' , 'tie'),
			'no_of_tweets'    => '5',
			'username'        => '',
			'consumer_key'    => '',
			'consumer_secret' => '',
		);

		$instance = wp_parse_args( (array) $instance, $defaults );

		?>
		<p>
			<label for="<?php echo $this->get_field_id( 'title' ); ?>"><?php _e( 'Title:' , 'tie') ?></label>
			<input id="<?php echo $this->get_field_id( 'title' ); ?>" name="<?php echo $this->get_field_name( 'title' ); ?>" value="<?php echo $instance['title']; ?>" class="widefat" type="text" />
		</p>

		<p>
			<label for="<?php echo $this->get_field_id( 'username' ); ?>"><?php _e( 'Twitter Username:' , 'tie') ?></label>
			<input id="<?php echo $this->get_field_id( 'username' ); ?>" name="<?php echo $this->get_field_name( 'username' ); ?>" value="<?php echo $instance['username']; ?>" class="widefat" type="text" />
		</p>
		<p>
			<label for="<?php echo $this->get_field_id( 'consumer_key' ); ?>"><?php _e( 'Consumer key:' , 'tie') ?> </label>
			<input id="<?php echo $this->get_field_id( 'consumer_key' ); ?>" name="<?php echo $this->get_field_name( 'consumer_key' ); ?>" value="<?php echo $instance['consumer_key']; ?>" class="widefat" type="text" />
		</p>		<p>
			<label for="<?php echo $this->get_field_id( 'consumer_secret' ); ?>"><?php _e( 'Consumer secret:' , 'tie') ?></label>
			<input id="<?php echo $this->get_field_id( 'consumer_secret' ); ?>" name="<?php echo $this->get_field_name( 'consumer_secret' ); ?>" value="<?php echo $instance['consumer_secret']; ?>" class="widefat" type="text" />
		</p>
		<p>
			<label for="<?php echo $this->get_field_id( 'no_of_tweets' ); ?>"><?php _e( 'Number of Tweets to show:' , 'tie') ?></label>
			<input id="<?php echo $this->get_field_id( 'no_of_tweets' ); ?>" name="<?php echo $this->get_field_name( 'no_of_tweets' ); ?>" value="<?php echo $instance['no_of_tweets']; ?>" type="text" size="3" />
		</p>

	<?php
	}

		/**
	 * Find links and create the hyperlinks
	 */
	private function hyperlinks($text) {
	    $text = preg_replace('/\b([a-zA-Z]+:\/\/[\w_.\-]+\.[a-zA-Z]{2,6}[\/\w\-~.?=&%#+$*!]*)\b/i',"<a href=\"$1\" class=\"twitter-link\">$1</a>", $text);
	    $text = preg_replace('/\b(?<!:\/\/)(www\.[\w_.\-]+\.[a-zA-Z]{2,6}[\/\w\-~.?=&%#+$*!]*)\b/i',"<a href=\"http://$1\" class=\"twitter-link\">$1</a>", $text);
	    // match name@address
	    $text = preg_replace("/\b([a-zA-Z][a-zA-Z0-9\_\.\-]*[a-zA-Z]*\@[a-zA-Z][a-zA-Z0-9\_\.\-]*[a-zA-Z]{2,6})\b/i","<a href=\"mailto://$1\" class=\"twitter-link\">$1</a>", $text);
	        //mach #trendingtopics. Props to Michael Voigt
	    $text = preg_replace('/([\.|\,|\:|\?|\?|\>|\{|\(]?)#{1}(\w*)([\.|\,|\:|\!|\?|\>|\}|\)]?)\s/i', "$1<a href=\"http://twitter.com/#search?q=$2\" class=\"twitter-link\">#$2</a>$3 ", $text);
	    return $text;
	}
	/**
	 * Find twitter usernames and link to them
	 */
	private function twitter_users($text) {
	       $text = preg_replace('/([\.|\,|\:|\?|\?|\>|\{|\(]?)@{1}(\w*)([\.|\,|\:|\!|\?|\>|\}|\)]?)\s/i', "$1<a href=\"http://twitter.com/$2\" class=\"twitter-user\">@$2</a>$3 ", $text);
	       return $text;
	}

}
?>
