<?php
// Basic configuration
require_once(ROPPLUGINPATH."/inc/config.php");
// RopTwitterOAuth class
require_once(ROPPLUGINPATH."/inc/oAuth/twitteroauth.php");

// Added by Ash/Upwork
define("ROP_IS_TEST", false);
define("ROP_IS_DEBUG", false);
// Added by Ash/Upwork


if (!class_exists('CWP_TOP_Core')) {
	class CWP_TOP_Core {

		// All fields
		public static $fields;
		public static $networks;
		// Number of fields
		public static $noFields;
		public $notices;
		// Consumer key, Consumer Secret key, oAuth Callback Key
		public $consumer;
		public $lastID;
		public $consumerSecret;
		public $oAuthCallback;
		public $bitly_key;
		public $bitly_user;
		// Access token, oAuth Token, oAuth Token Secret and User Information
		private $cwp_top_access_token;
		private $cwp_top_oauth_token;
		private $cwp_top_oauth_token_secret;

		public $users;
		private $user_info;

		// Plugin Status
		public $pluginStatus;
		// Interval Set
		public $intervalSet;
		public $cwp_twitter;
		public static $date_format;
		public function __construct() {
            if (ROP_IS_DEBUG) @mkdir(ROPPLUGINPATH . "/tmp");
            if (ROP_IS_TEST) add_filter("rop_is_business_user", create_function('',  'return true;'));

			// Get all fields
			global $cwp_top_fields;
			global $cwp_top_networks;


			$this->setAlloAuthSettings();
			// Load all hooks
			$this->loadAllHooks();

			// Set all authentication settings
			// Check if the user added any account
			$this->afterAddAccountCheck();

			// Save all fields in static var
			self::$fields = $cwp_top_fields;
			self::$networks = $cwp_top_networks;

			// Save all number of fields in static var
			self::$noFields = count(self::$fields);
		}
		public static function addNotice($message,$type){
			$errors = get_option('rop_notice_active');
			if(count($errors)  > 30) $errors = array();
			$errors[] = array(
								"time"=>date('j-m-Y h:i:s A'),
								'message'=>$message,
								"type" => $type
							);
			update_option("rop_notice_active",$errors);

		}
		public static function clearLog(){
			if(!is_admin()) return false;
			update_option("rop_notice_active",array());

		}
		public static function addLog($m){
			$m .= date('l jS \of F Y h:i:s A')." - ".$m." \n\n  ";
			file_put_contents("rop.log",$m,FILE_APPEND);

		}
		public function addLocalization() {

			load_plugin_textdomain('tweet-old-post', false, dirname(ROPPLUGINBASENAME).'/languages/');
		}
		function checkUsers(){
			if(!is_array($this->users)) $this->users = array();
			if(count($this->users) == 0){

				self::addNotice(__("You have no account set to post !", 'tweet-old-post'),"error");
				die();
			}

		}
		public function startTweetOldPost( )
		{
			if(!is_admin()) return false;
			$this->checkUsers();
			if($this->pluginStatus !== 'true' ) {
				do_action("rop_start_posting");
			}
			die();
		}
		public function startPosting(){

			update_option('cwp_topnew_active_status', 'yes');
			update_option('top_opt_already_tweeted_posts',array());
			update_option('top_last_tweets',array());
			$timeNow =  $this->getTime();
			$timeNow = $timeNow+15;
            // Added by Ash/Upwork for advanced scheduling
            set_transient('top_firstpost_time', $timeNow, 15);
            //error_log("first post time " . date("g:i:s A", $timeNow));
            // Added by Ash/Upwork for advanced scheduling

			$this->clearScheduledTweets();
			$networks = $this->getAvailableNetworks();

			foreach($networks as $network){
				wp_schedule_single_event($timeNow,$network.'roptweetcron',array($network));
			}

		}

		public function stopPosting(){

			// Set it to inactive status
			update_option('cwp_topnew_active_status', 'no');
			update_option('cwp_topnew_notice', '');
			update_option('top_opt_already_tweeted_posts',array());

			// Clear all scheduled tweets
			$this->clearScheduledTweets();
		}
		public function stopTweetOldPost()
		{
			if(!is_admin()) return false;
			//echo $this->pluginStatus;
			// If the plugin is active
			if($this->pluginStatus !== 'false') {
				do_action("rop_stop_posting");
			}

			die(); // Required for AJAX
		}

		public function getExcludedPosts($ntk=null) {

			$postQueryPosts = "";
			$postPosts = get_option('top_opt_excluded_post');

			if(!empty($postPosts) && is_array($postPosts)) {
				 $postQueryPosts = implode(',',$postPosts);
			}
			else
				$postQueryPosts = get_option('top_opt_excluded_post');

            // Added by Ash/Upwork
            if($ntk){
                $excludePosts   = get_option("cwp_top_exclude_from_" . $ntk);
                if(!is_array($excludePosts)){
                    $excludePosts   = array();
                }
                if(!is_array($postQueryPosts)){
                    $postQueryPosts = explode(",", $postQueryPosts);
                }
                if(!is_array($postQueryPosts)){
                    $postQueryPosts = array();
                }
                $postQueryPosts = array_merge($postQueryPosts, $excludePosts);
                $postQueryPosts = implode(",", $postQueryPosts);
            }
            // Added by Ash/Upwork
			return $postQueryPosts;

		}

		public function getTweetsFromDBbyID($id)
		{
			global $wpdb;
			$query = "
			SELECT * FROM {$wpdb->prefix}posts where ID = '{$id}'";
			$returnedPost = $wpdb->get_results($query);
			//echo $query;
			return $returnedPost;
		}

        // Added by Ash/Upwork
        /**
        * This will get the postIDs for the particular network
        */
        private function getAlreadyTweetedPosts($ntk){
            $array      = array();
            if(!$ntk) return $array;

            $opt        = get_option("top_opt_posts_buffer_" . $ntk, array());
            if(!$opt || !is_array($opt)) return $array;
            
            return $opt;
        }

        /**
        * This will add the postID to the network buffer to note which post was posted on which network
        */
        public function setAlreadyTweetedPosts($ntk, $postID){
            if(!$ntk || !$postID) return;
            $opt        = get_option("top_opt_posts_buffer_" . $ntk, array());
            if(!$opt || !is_array($opt)){
                $opt    = array();
            }
            $opt[]      = $postID;


            update_option("top_opt_posts_buffer_" . $ntk, $opt);
        }

        /**
        * This will clear the network buffer
        */
        private function clearAlreadyTweetedPosts($ntk){
            if(!$ntk) return;
            delete_option("top_opt_posts_buffer_" . $ntk);
        }

        /**
        * This is a test method that will be fired on admin_init. Only to be used for testing.
        * In production, this function will just return harmlessly
        */
        public function doTestAction(){
            if(!ROP_IS_TEST) return;

            $networks   = array("twitter", "facebook", "linkedin", "tumblr");
            $ntk        = $networks[array_rand($networks)];
            for($x = 0; $x < rand(0,5); $x++) $this->setAlreadyTweetedPosts($ntk, rand(0,100));
            echo "<pre>network=".$ntk.print_r($this->getAlreadyTweetedPosts($ntk),true). "</pre>";
        }
        
        // Added by Ash/Upwork

		public function getTweetsFromDB($ntk=null, $clearNetworkBuffer=false, $tweetCount=null)
		{
			global $wpdb;
            $limit      = 50;
			// Generate the Tweet Post Date Range
			$dateQuery = $this->getTweetPostDateRange();
			if(!is_array($dateQuery)) return false;
			// Get the number of tweets to be tweeted each interval.
            if($tweetCount){
                $limit  = $tweetCount;
            }else{
			    $tweetCount = intval(get_option('top_opt_no_of_tweet'));
            }
			if($tweetCount == 0 ) {
				self::addNotice("Invalid number for  Number of Posts to share. It must be a value greater than 0 ",'error');
				return false;
			}
			// Get post categories set.
//			$postQueryCategories =  $this->getTweetCategories();
			$excludedIds = "";
            // Added by Ash/Upwork
            $tweetedPosts   = $this->getAlreadyTweetedPosts($ntk);
            /*
			$tweetedPosts = get_option("top_opt_already_tweeted_posts");
			if(!is_array($tweetedPosts)) $tweetedPosts = array();

			if (get_option('top_opt_tweet_multiple_times')=="on") {

				$tweetedPosts = array();
			}
            */
			$postQueryExcludedPosts = $this->getExcludedPosts($ntk);
			$postQueryExcludedPosts = explode (',',$postQueryExcludedPosts);
			$excluded = array_merge($tweetedPosts,$postQueryExcludedPosts);
			$excluded = array_unique($excluded);
			$excluded = array_filter($excluded);
			$specificCategories = $this->getExcludedCategories();
			$somePostType = $this->getTweetPostType();
			// Generate dynamic query.
			$query =   "
				SELECT {$wpdb->prefix}posts.ID
				FROM  {$wpdb->prefix}posts
				LEFT JOIN {$wpdb->prefix}term_relationships ON ({$wpdb->prefix}posts.ID = {$wpdb->prefix}term_relationships.object_id)
				WHERE 1=1 ";
             
            // Added by Ash/Upwork
            if(array_key_exists("before", $dateQuery)){
                $query  .= "AND post_date >= '{$dateQuery['before']}' ";
            }
            if(array_key_exists("after", $dateQuery)){
                $query  .= "AND post_date <= '{$dateQuery['after']}' ";
            }
            // Added by Ash/Upwork

			// If there are no categories set, select the post from all.
			//if(!empty($postQueryCategories)) {
			//		$query .= "AND (wp_term_relationships.term_taxonomy_id IN ({$postQueryCategories})) ";
			//	}

			if(!empty($specificCategories)) {
                $categoryFilter = get_option("top_opt_cat_filter", "exclude") == "exclude" ? "NOT IN" : "IN";
				$query          .= "AND ( {$wpdb->prefix}posts.ID {$categoryFilter} (
					SELECT object_id
					FROM {$wpdb->prefix}term_relationships
					INNER JOIN {$wpdb->prefix}term_taxonomy ON ( {$wpdb->prefix}term_relationships.term_taxonomy_id = {$wpdb->prefix}term_taxonomy.term_taxonomy_id )
                    WHERE    {$wpdb->prefix}term_taxonomy.term_id IN ({$specificCategories}))) ";
			}

			if(!empty($excluded)) {
				$excluded = implode(',',$excluded);
				$query .= "AND ( {$wpdb->prefix}posts.ID NOT IN ({$excluded})) ";
			}
			if(!empty($somePostType)){
				$somePostType = explode(',',$somePostType);
				$somePostType = "'".implode("','",$somePostType)."'";
			}

            // Added by Ash/Upwork
            // Use a more efficient = condition than a costly IN condition if only one type is present
            if(!empty($somePostType)){
                if(strpos($somePostType, ",") !== FALSE){
                    $query .= "AND {$wpdb->prefix}posts.post_type IN ({$somePostType}) ";
                }else{
                    $query .= "AND {$wpdb->prefix}posts.post_type = ({$somePostType}) ";
                }
            }
            // Added by Ash/Upwork

			$query .= "AND ({$wpdb->prefix}posts.post_status = 'publish')
						GROUP BY {$wpdb->prefix}posts.ID ";
            if(!ROP_IS_TEST){
                $query  .= "order by RAND() ";
            }
            $query  .= "limit {$limit}";

            $returnedPost = $wpdb->get_results( $query);

            self::writeDebug("rows " . count($returnedPost) . " from " . $query);

            // Added by Ash/Upwork
            // If the number of posts found is zero and a post can be shared multiple times, lets clear the buffer and fetch again
            if($ntk && !$clearNetworkBuffer && count($returnedPost) == 0 && get_option('top_opt_tweet_multiple_times') == "on"){
                //self::addLog("clearing for $ntk!!");
                $this->clearAlreadyTweetedPosts($ntk);
                return $this->getTweetsFromDB($ntk, true);
            }
            // Added by Ash/Upwork

			if(count($returnedPost) >   $tweetCount) {
				$rand_keys = array_rand( $returnedPost, $tweetCount );

				if ( is_int( $rand_keys ) ) {
					$rand_keys = array( $rand_keys );
				}
				$return = array();

				foreach ( $rand_keys as $rk ) {
					$return[] = $returnedPost[ $rk ];
				}
				$returnedPost = $return;
				if ( count( $returnedPost ) > $tweetCount ) {
					$returnedPost = array_slice( $returnedPost, 0, $tweetCount );
				}
			}
			$ids = array();
			foreach($returnedPost as $rp){
				$ids[] = $rp->ID;

			}


			$returnedPost  = array();
			if(!empty($ids))
				$returnedPost = $wpdb->get_results("select * from {$wpdb->prefix}posts where ID in (".implode(",",$ids).") ");

			return $returnedPost;

		}
		public function isPostWithImageEnabled ($ntk = "twitter") {
			$options = get_option("top_opt_post_formats");
			$format_fields = $this->getFormatFields();
			$value = isset($options[$ntk."_".$format_fields[$ntk]["use-image"]['option']]) ? $options[$ntk."_".$format_fields[$ntk]["use-image"]['option']] : get_option("top_opt_post_with_image")  ;
			if ($value !='on')
				return false;
			else
				return true;
		}
		public function getUsers(){
			$users = apply_filters("rop_users_filter",get_option('cwp_top_logged_in_users'));
			return is_array($users) ? $users : array();


		}
		public function checkNetworkLock($ntk){
			if ( wp_using_ext_object_cache() ) {
			    $value = wp_cache_get( $ntk.'roplock', 'transient', true );
				return ( false !== $value) ;
			} else {


				return (false !== ( $value = get_transient( $ntk.'roplock' ) ));
			}




		}
		public function setNetworkLock($ntk){
			if ( wp_using_ext_object_cache() ) {
				wp_cache_set(  $ntk.'roplock', "lock", 'transient', 5 * MINUTE_IN_SECONDS );
			} else {
				set_transient(  $ntk.'roplock' , "lock",5 * MINUTE_IN_SECONDS);
			}

		}
		public function deleteNetworkLock($ntk){
			if ( wp_using_ext_object_cache() ) {
				wp_cache_delete($ntk.'roplock','transient');
			} else {
				delete_transient($ntk.'roplock');
			}

		}

		public function tweetOldPost($ntk = "",$byID = false)

		{
			if ( $this->checkNetworkLock($ntk) && $byID === false ) return false;


			$this->setNetworkLock($ntk);
			if ($byID!==false) {

				$returnedPost = $this->getTweetsFromDBbyID($byID);
			}else{
				$returnedPost = $this->getTweetsFromDB($ntk);
				if(!is_array($returnedPost)) return false;
			}
			if (count($returnedPost) == 0 ) {
				self::addNotice(__('There is no suitable post to tweet make sure you excluded correct categories and selected the right dates.','tweet-old-post'),'error');
			}
			$users = $this->getUsers();
			foreach($returnedPost as $post){
					$oknet = false;
					foreach($users as $u){
						if($u['service'] == $ntk){
							$oknet = true;
							break;
						}
					}
					if(!$oknet) return false;
					$finalTweet = $this->generateTweetFromPost($post,$ntk);
				 	$this->tweetPost( $finalTweet, $ntk, $post );
                    $this->setAlreadyTweetedPosts($ntk, $post->ID);
			}
			if ($byID===false) {
				$this->scheduleTweet($ntk);
			}


			$this->deleteNetworkLock($ntk);
		}

		public function scheduleTweet($ntk){
			$time = $this->getNextTweetTime( $ntk );

			if($time != 0 && $time > $this->getTime()){
				if(wp_next_scheduled( $ntk.'roptweetcron',array($ntk) ) === false) {
					wp_schedule_single_event( $time, $ntk . 'roptweetcron', array( $ntk ) );
				}
			}else{
				self::addNotice(__("Invalid next schedule: ",'tweet-old-post').date (  'M j, Y @ G:i',$time),'error');
			}
		}
		public function getAvailableNetworks(){
			$networks = array();
			$users = is_array($this->users) ? $this->users : array();
			foreach($users  as $u){
				if(!in_array($u['service'],$networks))
					$networks[] = $u['service'];
			}

			return $networks;
		}

		public function getAllNetworks($all = false){
			global $cwp_rop_all_networks;
			if(empty($cwp_rop_all_networks)) return array();

			return ($all) ? $cwp_rop_all_networks : array_keys($cwp_rop_all_networks);
		}
		public function findInString($where,$what) {
			if (!is_string($where)) {
				return false;
			}
			else
				return strpos($where,$what);
		}

		public function getNotice() {
			if(!is_admin()) return false;
			$notice = get_option('rop_notice_active');
			if(!is_array($notice)) $notice = array();

			foreach($notice as $k=>$n){
				$notice[$k]['message'] = strip_tags($n['message']);
			}
            echo json_encode($notice);
			die();
		}

		public function tweetNow() {
			if(!is_admin()) return false;
			$networks = $this->getAvailableNetworks();
			foreach($networks as $net){

				$this->tweetOldPost($net,get_option('top_lastID'));
			}
			die();
		}

		public function viewSampleTweet()
		{

			if(!is_admin()) return false;
			$returnedTweets = $this->getTweetsFromDB();

			$messages = array();
			$networks = $this->getAvailableNetworks();

			if(count($returnedTweets) == 0) {
				foreach($networks as $net){
					$messages[$net] = __("No posts to share",'tweet-old-post');
				}
				$networks = array();
			}
			foreach($networks as $n) {

				$finalTweetsPreview = $this->generateTweetFromPost($returnedTweets[0],$n);
				if (is_array($finalTweetsPreview)){
					$finalTweetsPreview = $finalTweetsPreview['message']." ".$finalTweetsPreview['link'];
				}
				$messages[$n] = $finalTweetsPreview;
			}
			if(isset($returnedTweets[0]))
				update_option( 'top_lastID', $returnedTweets[0]->ID);

			foreach($networks as $n) {
                $image      = $this->getImageForPost($n, $returnedTweets[0]->ID);
                if(!empty($image)){
                    $messages[$n] =  $image.$messages[$n];
                }
			}

			echo json_encode($messages);


			die(); // required
		}

        // Added by Ash/Upwork
        function sortPosts($all){
            uasort($all, array($this, "sortPostsByTimeDesc"));
            return $all;
        }

        function sortPostsByTimeDesc($x, $y){
            if($x["time"] == $y["time"]) return 0;

            return $x["time"] < $y["time"] ? -1 : 1;
        }

        function getImageForPost($n, $postID){
            if (ROP_IS_TEST || (CWP_TOP_PRO && $this->isPostWithImageEnabled($n))) {
                if(defined('ROP_PRO_VERSION')){
                    global $CWP_TOP_Core_PRO;
                    $image = $CWP_TOP_Core_PRO->getPostImage($postID, $n);

                }else {
                    if ( has_post_thumbnail($postID) ) :

                        $image_array = wp_get_attachment_image_src( get_post_thumbnail_id($postID) );

                        $image       = $image_array[0];
                    else :
                        $post  = get_post($postID);
                        $image = '';
                        ob_start();
                        ob_end_clean();
                        $output = preg_match_all( '/<img.+src=[\'"]([^\'"]+)[\'"].*>/i', $post->post_content, $matches );
                        if(isset($matches [1] [0]))
                            $image = $matches [1] [0];

                    endif;
                }

                $top_opt_saved_images   = get_option("top_opt_saved_images");
                if($top_opt_saved_images && is_array($top_opt_saved_images) && in_array($postID, $top_opt_saved_images)){
                    $imageID            = get_post_meta($postID, "top_opt_saved_post_image_" . $n, true);
                    if($imageID){
                        $image          = wp_get_attachment_url($imageID);
                    }
                }

                if(!empty($image)){
                    return '<img class="top_preview" src="'.$image.'"/>';
                }
            }
            return null;
        }

        function getFutureTime($network_name, $time, $array){
            $firstPostTime  = get_transient('top_firstpost_time');
            if($firstPostTime !== false){
                delete_transient('top_firstpost_time');
                return $firstPostTime;
            }

            if(array_key_exists("time", $array)){
                $time       = $array["time"];
            }else{
                $time       = CWP_TOP_Core::getNextTweetTime($network_name, $time ? $time : $this->getTime());
            }
            return $time;
        }
        // Added by Ash/Upwork

		/**
		 * Returns if the post is already tweeted
		 * @param  [type]  $postId Post ID
		 * @return boolean         True if not already tweeted / False if already tweeted
		 */

		public function isNotAlreadyTweeted($postId) {
			// Get all already tweeted posts

			$tweetedPosts = get_option("top_opt_already_tweeted_posts");

			if (!$tweetedPosts) {
				add_option("top_opt_already_tweeted_posts");
				return true;
			}

			// If the new post ID is in the array, which means that is already tweeted
			if (!empty($tweetedPosts) && is_array($tweetedPosts) ) {

				if (in_array($postId, $tweetedPosts))
					return false;
				else
					return true;
			}
			else
			{
				return true;
			}
		}

		public function getStrLen($string) {
            // multibyte string support for multibyte strings: DO NOT REMOVE
			if (function_exists("mb_strlen"))
				return mb_strlen($string);
			else
				return strlen($string);
		}

		public function ropSubstr($string,$nr1,$nr2	) {
            // multibyte string support for multibyte strings: DO NOT REMOVE
            if (function_exists("mb_substr")) {
                return mb_substr($string, $nr1,$nr2);
            } else {
                return substr($string, $nr1, $nr2);
            }
		}

		/**
		 * Author Daniel Brown (contact info at http://ymb.tc/contact)
		 * Includes hashtag in $tweet_content if possible
		 * to save space, avoid redundancy, and allow more hashtags
		 * @param  [string] $tweetContent The regular text in the Tweet
		 * @param  [string] $hashtag The hashtag to include in $tweetContent, if possible
		 * @return [mixed]  The new $tweetContent or FALSE if the $tweetContent doesn't contain the hashtag
		 */

		public function tweetContentHashtag ($tweetContent, $hashtag) {
			$location = stripos($tweetContent, ' ' . $hashtag . ' ');
			if ( $location !== false ) $location++; // the actual # location will be past the space
			elseif ( stripos($tweetContent, $hashtag . ' ') === 0 ) { // see if the hashtag is at the beginning
				$location = 0;
			}
			elseif ( stripos($tweetContent, ' ' . $hashtag) !== FALSE && stripos($tweetContent, ' ' . $hashtag) + strlen(' ' . $hashtag) == strlen($tweetContent) ) { // see if the hashtag is at the end
				$location = stripos($tweetContent, ' ' . $hashtag) + 1;
			}
			if ( $location !== false ) {
				return substr_replace($tweetContent, '#', $location, 0);
			}
			else return false;
		}

		/**
		 * Generates the tweet based on the user settings
		 * @param  [type] $postQuery Returned post from database
		 * @return [type]            Generated Tweet
		 */

		public function generateTweetFromPost($postQuery, $network, $fromManageQueue=false)
		{

			$format_fields = $this->getFormatFields();
			$tweetedPosts 					= get_option("top_opt_already_tweeted_posts");
			$formats  = get_option('top_opt_post_formats');
			$tweet_content               = isset($formats[$network."_"."top_opt_tweet_type"]) ? $formats[$network."_"."top_opt_tweet_type"] : get_option( 'top_opt_tweet_type' );
			$tweet_content_custom_field  = isset($formats[$network."_"."top_opt_tweet_type_custom_field"]) ? $formats[$network."_"."top_opt_tweet_type_custom_field"] : get_option( 'top_opt_tweet_type_custom_field' );
			$additional_text             = isset($formats[$network."_"."top_opt_add_text"]) ? $formats[$network."_"."top_opt_add_text"] : get_option( 'top_opt_tweet_type_custom_field' );
			$additional_text_at          = isset($formats[$network."_"."top_opt_add_text_at"]) ? $formats[$network."_"."top_opt_add_text_at"] : get_option( 'top_opt_add_text_at' );
			$max_length         = isset($formats[$network."_"."top_opt_tweet_length"]) ? $formats[$network."_"."top_opt_tweet_length"] : $format_fields[$network]['top_opt_tweet_length']['default_value'];
			$include_link                = isset($formats[$network."_"."top_opt_include_link"]) ? $formats[$network."_"."top_opt_include_link"] : get_option( 'top_opt_include_link' );  get_option( 'top_opt_include_link' );
			$fetch_url_from_custom_field =  isset($formats[$network."_"."top_opt_custom_url_option"]) ? $formats[$network."_"."top_opt_custom_url_option"] : get_option( 'top_opt_custom_url_option' );
			$custom_field_url            =  isset($formats[$network."_"."top_opt_custom_url_field"]) ? $formats[$network."_"."top_opt_custom_url_field"] : get_option( 'top_opt_custom_url_field' );  get_option( 'top_opt_custom_url_field' );
			$use_url_shortner            =  isset($formats[$network."_"."top_opt_use_url_shortner"]) ? $formats[$network."_"."top_opt_use_url_shortner"] : get_option( 'top_opt_use_url_shortner' );
			$url_shortner_service        = isset($formats[$network."_"."top_opt_url_shortner"]) ? $formats[$network."_"."top_opt_url_shortner"] : get_option( 'top_opt_url_shortner' );
			$hashtags                    = isset($formats[$network."_"."top_opt_custom_hashtag_option"]) ? $formats[$network."_"."top_opt_custom_hashtag_option"] : get_option( 'top_opt_custom_hashtag_option' );
			$common_hashtags             = isset($formats[$network."_"."top_opt_hashtags"]) ? $formats[$network."_"."top_opt_hashtags"] : get_option( 'top_opt_hashtags' );
			$maximum_hashtag_length      = isset($formats[$network."_"."top_opt_hashtag_length"]) ? $formats[$network."_"."top_opt_hashtag_length"] : get_option( 'top_opt_hashtag_length' );
			$hashtag_custom_field        = isset($formats[$network."_"."top_opt_custom_hashtag_field"]) ? $formats[$network."_"."top_opt_custom_hashtag_field"] : get_option( 'top_opt_custom_hashtag_field' );
			$post_with_image             =  isset($formats[$network."_". 'top_opt_post_with_image']) ? $formats[$network."_". 'top_opt_post_with_image'] : get_option( 'top_opt_bitly_user' );
			$ga_tracking                 = get_option( 'top_opt_ga_tracking' );
			$additionalTextBeginning     = "";
			$additionalTextEnd           = "";

			// If the user set to not use hashtags, set it to empty variable.
			if ( $hashtags == 'nohashtag' ) {
				$newHashtags = "";
			}
			// Generate the tweet content.
			switch ( $tweet_content ) {
				case 'title':
					$tweetContent = $postQuery->post_title;
					break;
				case 'body':
					$tweetContent = get_post_field( 'post_content', $postQuery->ID );
					break;
				case 'titlenbody':
					$tweetContent = $postQuery->post_title . " " . get_post_field( 'post_content', $postQuery->ID );
					break;
				case 'custom-field':
					$tweetContent = get_post_meta( $postQuery->ID, $tweet_content_custom_field, true );
					break;
				default:
					$tweetContent = "";
					break;
			}
			// Trim new empty lines.
			if(!is_string($tweetContent)) $tweetContent = '';
			$tweetContent = strip_tags( html_entity_decode( $tweetContent,ENT_QUOTES ) );
			//$tweetContent = esc_html($tweetContent);
			//$tweetContent = esc_html($tweetContent);
			//$tweetContent = trim(preg_replace('/\s+/', ' ', $tweetContent));
			// Remove html entinies.
			//$tweetContent = preg_replace("/&#?[a-z0-9]+;/i","", $tweetContent);
			// Strip all shortcodes from content.
			$tweetContent   = strip_shortcodes( $tweetContent );
			$fTweet         = array();
			$post_url = get_permalink( $postQuery->ID );
			// Generate the post link.
			if ( $include_link == 'true' ) {
				if ( $fetch_url_from_custom_field == 'on' ) {
					//$post_url = preg_replace('/https?:\/\/[^\s"<>]+/', '$0', );
					preg_match_all('#\bhttps?://[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|/))#', get_post_meta( $postQuery->ID, $custom_field_url, true ), $match);
					if(isset($match[0])){
						if(isset($match[0][0]))
							$post_url = $match[0][0];
					}
				} else {
					$post_url = "" . get_permalink( $postQuery->ID );
				}
				if ( $post_url == "" ) {
					$post_url = "" . get_permalink( $postQuery->ID );
				}
				if ( $ga_tracking == "on" ) {
					$param    = 'utm_source=ReviveOldPost&utm_medium=social&utm_campaign=ReviveOldPost';
					$post_url = rtrim( $post_url );
					if ( strpos( $post_url, "?" ) === false ) {
						$post_url .= '?' . $param;
					} else {
						$post_url .= '&' . $param;
					}
				}
				if ( $use_url_shortner == 'on' ) {
                    if ($fromManageQueue) {
                        // Added by Ash/Upwork so that the pro version can use this to generate the shortened url when required
                        update_post_meta($postQuery->ID, "rop_post_url_" . $network, $post_url);
                        // Added by Ash/Upwork
                    }
                    // $fromManageQueue Added by Ash/Upwork
                    $post_url = "" . self::shortenURL( $post_url, $url_shortner_service, $postQuery->ID, $formats, $network, $fromManageQueue );
                    // $fromManageQueue Added by Ash/Upwork
				}
				if ( $post_url == "" ) {
					$post_url = "" . get_permalink( $postQuery->ID );
				}
				$post_url = $post_url . "";
			} else {
				$post_url = "";
			}
			// Generate the hashtags
			$newHashtags = "";
			if ( $hashtags != 'nohashtag' ) {
				switch ( $hashtags ) {
					case 'common':
						$newHashtags = $common_hashtags;
						break;
					case 'categories':
						if ( $postQuery->post_type == "post" ) {
							$postCategories = get_the_category( $postQuery->ID );
							foreach ( $postCategories as $category ) {
								$thisHashtag = $category->slug;
								if ( $this->tweetContentHashtag($tweetContent, $thisHashtag) !== false ) { // if the hashtag exists in $tweetContent
									$tweetContent = $this->tweetContentHashtag($tweetContent, $thisHashtag); // simply add a # there
									$maximum_hashtag_length--; // subtract 1 for the # we added to $tweetContent
								}
								elseif ( strlen( $thisHashtag . $newHashtags ) <= $maximum_hashtag_length || $maximum_hashtag_length == 0 ) {
									$newHashtags = $newHashtags . " #" . preg_replace( '/-/', '', strtolower( $thisHashtag ) );
								}
							}
						} else {
							if ( CWP_TOP_PRO ) {
								global $CWP_TOP_Core_PRO;
								$newHashtags = $CWP_TOP_Core_PRO->topProGetCustomCategories( $postQuery, $maximum_hashtag_length );
							}
						}
						break;
					case 'tags':
						$postTags = wp_get_post_tags( $postQuery->ID );
						foreach ( $postTags as $postTag ) {
							$thisHashtag = $postTag->slug;
							if ( $this->tweetContentHashtag($tweetContent, $thisHashtag) !== false ) { // if the hashtag exists in $tweetContent
								$tweetContent = $this->tweetContentHashtag($tweetContent, $thisHashtag); // simply add a # there
								$maximum_hashtag_length--; // subtract 1 for the # we added to $tweetContent
							}
							elseif ( strlen( $thisHashtag . $newHashtags ) <= $maximum_hashtag_length || $maximum_hashtag_length == 0 ) {
								$newHashtags = $newHashtags . " #" . preg_replace( '/-/', '', strtolower( $thisHashtag ) );
							}
						}
						break;
					case 'custom':
						if(empty($hashtag_custom_field)){
							self::addNotice("You need to add a custom field name in order to fetch the hashtags. Please set it from Post Format > $network > Hashtag Custom Field ",'error');
							break;
						}
						$newHashtags = get_post_meta( $postQuery->ID, $hashtag_custom_field, true );
						if($maximum_hashtag_length != 0){
							if(strlen(  $newHashtags ) <= $maximum_hashtag_length)
							{
								$newHashtags = $this->ropSubstr($newHashtags,0,$maximum_hashtag_length);
							}
						}
						break;
					default:
						break;
				}
			}
			// Generate the additional text
			if ( $additional_text_at == 'beginning' ) {
				$additionalTextBeginning = $additional_text . " ";
			}
			if ( $additional_text_at == 'end' ) {
				$additionalTextEnd = " " . $additional_text;
			}

			$fTweet['link'] = $post_url;
			$adTextELength = 0;
			if(is_string($additionalTextEnd)){
				$adTextELength = $this->getStrLen($additionalTextEnd);
			}
			$adTextBLength = 0;
			if(is_string($additionalTextBeginning)){
				$adTextBLength = $this->getStrLen($additionalTextBeginning);
			}
			$hashLength = 0;
			if(is_string($newHashtags) && $network != 'tumblr'){
				$hashLength = $this->getStrLen($newHashtags);
			}
			$finalTweetSize = $max_length - $hashLength - $adTextELength - $adTextBLength ;
			if($network == 'twitter' && !empty($fTweet['link']) ){
				$finalTweetSize = $finalTweetSize - 25;


			}
			if($network == 'twitter' && CWP_TOP_PRO && $this->isPostWithImageEnabled($network)){
				$finalTweetSize = $finalTweetSize - 25;
			}
			$tweetContent = $this->ropSubstr( $tweetContent,0,$finalTweetSize);

			if($network == 'twitter'){
				if(!empty($fTweet['link'])) $fTweet['link'] = " ".$fTweet['link']." ";
				$finalTweet = $additionalTextBeginning . $tweetContent  .$fTweet['link'].$newHashtags . $additionalTextEnd;
				$fTweet['link'] = '';
				$finalTweet =  preg_replace('/\s+/', ' ', trim( $finalTweet));
			}else{
				if($network === 'tumblr') {
					$fTweet['tags']  = implode(",",array_filter(explode("#", $newHashtags)));
					$finalTweet = $additionalTextBeginning . $tweetContent . $additionalTextEnd;
				}else{
					$finalTweet = $additionalTextBeginning . $tweetContent .$newHashtags . $additionalTextEnd;
				}
			}

            // Added by Ash/Upwork
            $top_opt_saved_posts    = get_option("top_opt_saved_posts");
            if($top_opt_saved_posts && is_array($top_opt_saved_posts) && in_array($postQuery->ID, $top_opt_saved_posts)){
                $newContent         = get_post_meta($postQuery->ID, "top_opt_saved_post_content_" . $network, true);
                if($newContent){
                    $finalTweet     = $newContent;
                }
            }
            // Added by Ash/Upwork

            $finalTweet         = apply_filters("rop_override_tweet", $finalTweet, $postQuery);
			$fTweet['message'] =  $finalTweet ;

			return $fTweet;
		}

		/**
		 * Tweets the returned post from generateTweetFromPost()
		 * @param  [type] $finalTweet Generated tweet
		 */

		public function tweetPost($finalTweet,$network = 'twitter',$post)
		{
            // Added by Ash/Upwork
            if(ROP_IS_TEST){
                self::addLog("Not posting because ROP_IS_TEST is set");
                return;
            }
            // Added by Ash/Upwork

			$users = $this->getUsers();
			foreach ($users as $user) {
				if($network == $user['service']  ){

					switch ($user['service']) {
						case 'twitter':
							// Create a new twitter connection using the stored user credentials.
							$connection = new RopTwitterOAuth($this->consumer, $this->consumerSecret, $user['oauth_token'], $user['oauth_token_secret']);
							$args = array('status' =>  $finalTweet['message'].$finalTweet['link']);
							$response = false;
							//self::addNotice(strlen($args["status"]),"error");
							if($this->isPostWithImageEnabled($network) && CWP_TOP_PRO) {
								global $CWP_TOP_Core_PRO;


								if(defined('ROP_IMAGE_CHECK')){
									$args = $CWP_TOP_Core_PRO->topProImage( $connection, $finalTweet, $post->ID, $network );
                                    // Added by Ash/Upwork: !empty($args['media[]'])
									if ( isset( $args['media[]'] ) && !empty($args['media[]'])) {
										$image = array("media"=>$args['media[]']);
										$response = $connection->upload( 'https://upload.twitter.com/1.1/media/upload.json', $image );
										unset($args['media[]']);
										$args["media_ids"] = $response->media_id_string;
										$response = $connection->post( 'statuses/update', $args );
									} else {
										$response = $connection->post( 'statuses/update', $args );
									}
								}else{
									$response = $CWP_TOP_Core_PRO->topProImage( $connection, $finalTweet['message']. " " .$finalTweet['link'], $post->ID, $network );
								}
							}else{

								$response = $connection->post('statuses/update',$args);
							}

							if($response !== false){
								$status = '';
								if(!is_object($response))
									$status = json_decode($response);
								if(!is_object($status)){

								//	self::addNotice("Error for post ".$post->post_title." when sending to Twitter: Invalid response - ".$response,'error');

								}
								else{

										if($status->errors[0]->code != 200) {
												//	self::addNotice("Error for post ".$post->post_title." when sending to Twitter: ".$status->errors[0]->message,'error');


										}
										else{

										}
								}
								if($connection->http_code == 200 ){
												self::addNotice("Post ".$post->post_title." has been successfully sent to Twitter.",'notice');

								}
							}
						break;
						case 'facebook':

							$args =  array(

								'body' => array( 'message' => $finalTweet['message'],'link' => $finalTweet['link']),
								'timeout'=>20

							);
							if($this->isPostWithImageEnabled($network) && CWP_TOP_PRO){
								global $CWP_TOP_Core_PRO;
								if(defined('ROP_IMAGE_CHECK'))
									$args = $CWP_TOP_Core_PRO->topProImage($connection, $finalTweet, $post->ID,$network);
							}

							$pp=wp_remote_post("https://graph.facebook.com/".ROP_TOP_FB_API_VERSION."/".$user['id']."/feed?access_token=".$user['oauth_token'],$args);
							if(is_wp_error( $pp )){
								self::addNotice(__("Error for posting on facebook for:",'tweet-old-post')." ".$post->post_title."".$pp->get_error_message(),'error' );

							}else{
								if($pp['response']['code'] == 200){

									self::addNotice(sprintf(__("Post %s has been successfully sent to facebook",'tweet-old-post'), $post->post_title),'notice');
								}else{
									$fb_error = "";
									$pp = json_decode($pp["body"]);

									if(isset($pp->error)){
										$fb_error = $pp->error->message;
									}
									self::addNotice(__("Error for facebook share on post ",'tweet-old-post'). $post->post_title." ".$fb_error." @".$user['oauth_user_details']->name,'error');


								}

							}

							break;

						case 'linkedin':

							$lk_message = str_replace("&", "&amp;",$finalTweet['message']);
							$sharedLink = str_replace("&", "&amp;",$finalTweet['link']);
							$content_xml = "";
							$visibility="anyone";
							$content_xml.="<content><title>".$lk_message."</title><submitted-url>".$sharedLink."</submitted-url></content>";
							$url = 'https://api.linkedin.com/v1/people/~/shares?oauth2_access_token='.$user["oauth_token"];


							$xml       = '<?xml version="1.0" encoding="UTF-8"?><share>
				             ' . $content_xml . '
				             <visibility>
				               <code>' . $visibility . '</code>
				             </visibility>
				           </share>';
							$headers = array(
								"Content-type: text/xml",
								"Content-length: " . strlen($xml),
								"Connection: close",
							);

							if (!function_exists('curl_version'))
								self::addNotice(__("Your host does not support CURL",'tweet-old-post'),'error');
							$ch = curl_init();
							curl_setopt($ch, CURLOPT_URL,$url);
							curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
							curl_setopt($ch, CURLOPT_TIMEOUT, 10);
							curl_setopt($ch, CURLOPT_POST, true);
							curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
							curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

							$data = curl_exec($ch);


							if(curl_errno($ch))
								{

									self::addNotice("Curl error: ". curl_error($ch),'error');
								}
							else{
								self::addNotice("Post ". $post->post_title." has been successfully sent to LinkedIN.",'notice');
								curl_close($ch);
							}
							break;
						default:
							if(CWP_TOP_PRO){
								global $CWP_TOP_Core_PRO;
								if(method_exists($CWP_TOP_Core_PRO,"tweetPostPro")){
									$CWP_TOP_Core_PRO->tweetPostPro($finalTweet,$network ,$post,$user);
								}

							}

							break;



					}

				}

			}
		}
        public function getRestrictedShowFields(){

	        global $cwp_rop_restricted_show;
	        return $cwp_rop_restricted_show;
        }
		public function system_info(){

			global $wpdb;
			$restricted = $this->getRestrictedShowFields();

			if(CWP_TOP_PRO){

				$pro  = get_plugin_data(ROPPROPLUGINPATH."/tweet-old-post-pro.php");
			}
			$lite  = get_plugin_data(ROPPLUGINPATH."/tweet-old-post.php");
			if ( get_bloginfo( 'version' ) < '3.4' ) {
				$theme_data = get_theme_data( get_stylesheet_directory() . '/style.css' );
				$theme      = $theme_data['Name'] . ' ' . $theme_data['Version'];
			} else {
				$theme_data = wp_get_theme();
				$theme      = $theme_data->Name . ' ' . $theme_data->Version;
			}

			// Try to identifty the hosting provider
			$host = false;
			if( defined( 'WPE_APIKEY' ) ) {
				$host = 'WP Engine';
			} elseif( defined( 'PAGELYBIN' ) ) {
				$host = 'Pagely';
			}

			?>
				<div class="wrap">
					<h2><?php _e( 'System Information', 'tweet-old-post'); ?></h2><br/>
					<form action="" method="post" dir="ltr">
						<textarea readonly="readonly" onclick="this.focus();this.select()" cols="100" id="system-info-textarea" name="cwp-top-sysinfo" rows="20" title="<?php _e( 'To copy the system info, click below then press Ctrl + C (PC) or Cmd + C (Mac).', 'tweet-old-post' ); ?>">

## Please include this information when posting support requests ##

## BEGIN ROP CONFIGS ##

<?php
				$options = $this->getPostFormatValues();
				$cwp_top_global_schedule = $this->getSchedule();
		         $cwp_rop_all_networks = $this->getFormatFields();
			echo "## ROP POST FORMAT";
				foreach($cwp_rop_all_networks as $n=>$d){
					echo "\n \n \n ##".$n." \n \n \n";




					foreach($d as $fname => $f){
						if(!in_array($fname,$restricted))
							echo $f['name']. " : ". $options[$n."_".$f['option']]." \n";
					}

				}
			?>

## END ROP CONFIGS ##


## Begin Remote Data

	Beta User: <?php  echo $this->getBetaUserStatus(); ?><?php echo "\n"; ?>
	Remote Check: <?php  echo $this->getRemoteCheck(); ?><?php echo "\n"; ?>

## End Remote Data



## Begin CRON Info

CRON Active:              <?php echo (defined("DISABLE_WP_CRON")  ? ((DISABLE_WP_CRON) ? "no" : "yes")  : "yes" ); ?><?php echo "\n"; ?>
Alternate WP Cron:        <?php echo defined("ALTERNATE_WP_CRON") ? ((ALTERNATE_WP_CRON) ? "yes" : "no" ) : "no"; ?><?php echo "\n";

			?>
Time now: <?php echo date ( 'M j, Y @ G:i',time()); ?> <?php echo "\n"; ?>
ROP Crons:
<?php
			$all = $this->getAllNetworks();
			foreach($all as $nn ){
				if(wp_next_scheduled($nn.'roptweetcron',array($nn)) === false) continue;
				echo date (  'M j, Y @ G:i', wp_next_scheduled($nn.'roptweetcron',array($nn)) );
			}

			?>

## End Cron Info

##Begin General Settings:

<?php
			$cwp_top_fields = $this->getGeneralFields();
			foreach($cwp_top_fields as $general_field){
				echo $general_field['name']. " : ";
				if(is_array(get_option($general_field['option'])))
					echo implode(",",get_option($general_field['option']))." \n" ;
				else
					echo get_option($general_field['option'])." \n";
			}
			?>

##End General Settings


<?php
			if(CWP_TOP_PRO):?>
##Begin Custom schedule settings:

<?php  foreach($all as $a) {

				if( $cwp_top_global_schedule[$a.'_schedule_type_selected'] == 'each')
				{
					echo strtoupper($a)." post on every ".$cwp_top_global_schedule[$a.'_top_opt_interval']." hours"." \n" ;
				}else{
					echo strtoupper($a)." post each ".$cwp_top_global_schedule[$a.'_top_opt_interval']['days']." days of the week at: "." \n" ;
					foreach($cwp_top_global_schedule[$a.'_top_opt_interval']['times'] as $time){
						echo ''.$time['hour']." : ".$time['minute']." \n  " ;


					}
				}
								?>
<?php } ?>

##End Custom schedule settings
<?php			endif;
			?>

### Begin System Info ###


Multisite:                <?php echo is_multisite() ? 'Yes' . "\n" : 'No' . "\n" ?>

SITE_URL:                 <?php echo site_url() . "\n"; ?>
HOME_URL:                 <?php echo home_url() . "\n"; ?>
<?php if(CWP_TOP_PRO): ?>
ROP PRO Version:              <?php echo $pro['Version'] . "\n"; ?>
<?php endif; ?>
ROP Lite Version:              <?php echo $lite['Version'] . "\n"; ?>
WordPress Version:        <?php echo get_bloginfo( 'version' ) . "\n"; ?>
Permalink Structure:      <?php echo get_option( 'permalink_structure' ) . "\n"; ?>
Active Theme:             <?php echo $theme . "\n"; ?>
<?php if( $host ) : ?>
	Host:                     <?php echo $host . "\n"; ?>
<?php endif; ?>
PHP Version:              <?php echo PHP_VERSION . "\n"; ?>
MySQL Version:            <?php echo mysqli_get_client_info() . "\n"; ?>
Web Server Info:          <?php echo $_SERVER['SERVER_SOFTWARE'] . "\n"; ?>
WordPress Memory Limit:   <?php echo  WP_MEMORY_LIMIT  ; ?><?php echo "\n"; ?>
PHP Safe Mode:            <?php echo ini_get( 'safe_mode' ) ? "Yes" : "No\n"; ?>
PHP Memory Limit:         <?php echo ini_get( 'memory_limit' ) . "\n"; ?>
PHP Upload Max Size:      <?php echo ini_get( 'upload_max_filesize' ) . "\n"; ?>
PHP Post Max Size:        <?php echo ini_get( 'post_max_size' ) . "\n"; ?>
PHP Upload Max Filesize:  <?php echo ini_get( 'upload_max_filesize' ) . "\n"; ?>
PHP Time Limit:           <?php echo ini_get( 'max_execution_time' ) . "\n"; ?>
PHP Max Input Vars:       <?php echo ini_get( 'max_input_vars' ) . "\n"; ?>
PHP Arg Separator:        <?php echo ini_get( 'arg_separator.output' ) . "\n"; ?>
PHP Allow URL File Open:  <?php echo (ini_get( 'allow_url_fopen' ) ? "Yes" : "No" ). "\n"; ?>
WP_DEBUG:                 <?php echo defined( 'WP_DEBUG' ) ? WP_DEBUG ? 'Enabled' . "\n" : 'Disabled' . "\n" : 'Not set' . "\n" ?>
WP Table Prefix:          <?php echo "Length: ". strlen( $wpdb->prefix ); echo " Status:"; if ( strlen( $wpdb->prefix )>16 ) {echo " ERROR: Too Long";} else {echo " Acceptable";} echo "\n"; ?>
Show On Front:            <?php echo get_option( 'show_on_front' ) . "\n" ?>
Page On Front:            <?php $id = get_option( 'page_on_front' ); echo get_the_title( $id ) . ' (#' . $id . ')' . "\n" ?>
Page For Posts:           <?php $id = get_option( 'page_for_posts' ); echo get_the_title( $id ) . ' (#' . $id . ')' . "\n" ?>
Session:                  <?php echo isset( $_SESSION ) ? 'Enabled' : 'Disabled'; ?><?php echo "\n"; ?>
Session Name:             <?php echo esc_html( ini_get( 'session.name' ) ); ?><?php echo "\n"; ?>
Cookie Path:              <?php echo esc_html( ini_get( 'session.cookie_path' ) ); ?><?php echo "\n"; ?>
Save Path:                <?php echo esc_html( ini_get( 'session.save_path' ) ); ?><?php echo "\n"; ?>
Use Cookies:              <?php echo ini_get( 'session.use_cookies' ) ? 'On' : 'Off'; ?><?php echo "\n"; ?>
Use Only Cookies:         <?php echo ini_get( 'session.use_only_cookies' ) ? 'On' : 'Off'; ?><?php echo "\n"; ?>
DISPLAY ERRORS:           <?php echo ( ini_get( 'display_errors' ) ) ? 'On (' . ini_get( 'display_errors' ) . ')' : 'N/A'; ?><?php echo "\n"; ?>
FSOCKOPEN:                <?php echo ( function_exists( 'fsockopen' ) ) ? 'Your server supports fsockopen.' : 'Your server does not support fsockopen.'; ?><?php echo "\n"; ?>
cURL:                     <?php echo ( function_exists( 'curl_init' ) ) ? 'Your server supports cURL.' : 'Your server does not support cURL.'; ?><?php echo "\n"; ?>
SOAP Client:              <?php echo ( class_exists( 'SoapClient' ) ) ? 'Your server has the SOAP Client enabled.' : 'Your server does not have the SOAP Client enabled.'; ?><?php echo "\n"; ?>

ACTIVE PLUGINS:


<?php
$plugins = get_plugins();
$active_plugins = get_option( 'active_plugins', array() );

foreach ( $plugins as $plugin_path => $plugin ) {
	// If the plugin isn't active, don't show it.
	if ( ! in_array( $plugin_path, $active_plugins ) )
		continue;

	echo $plugin['Name'] . ': ' . $plugin['Version'] ."\n";
}

if ( is_multisite() ) :
	?>

	NETWORK ACTIVE PLUGINS:

	<?php
	$plugins = wp_get_active_network_plugins();
	$active_plugins = get_site_option( 'active_sitewide_plugins', array() );

	foreach ( $plugins as $plugin_path ) {
		$plugin_base = plugin_basename( $plugin_path );

		// If the plugin isn't active, don't show it.
		if ( ! array_key_exists( $plugin_base, $active_plugins ) )
			continue;

		$plugin = get_plugin_data( $plugin_path );

		echo "\t"."\t"."\t"."\t".$plugin['Name'] . ' :' . $plugin['Version'] ."\n";
	}

endif;
?>



### End System Info ###

##Begin Log info

<?php       $logs = get_option('rop_notice_active');
			if(!is_array($logs)) $logs = array();
			foreach($logs as $log){
				echo strtoupper($log['type']). " @ ".$log['time']. ' - '. $log['message']." \n ";
			}
			?>
<?php ?>

#End log info

##Begin user info

<?php
			$users = $this->getUsers();
			foreach($all as $a ){
				if(!isset($$a)) $$a = 0;
				foreach($users  as $us){
					if($us['service'] == $a) $$a ++;

				}

			}
			foreach($all as $a){
				echo  strtoupper($a)." accounts - ".$$a." \n";

			}

			?>

##End user info

</textarea>
						<p class="submit">
							<input type="hidden" name="cwp-action" value="download_sysinfo" />
							<?php submit_button( __('Download System Info File','tweet-old-post'), 'primary', 'cwp-download-sysinfo', false ); ?>
						</p>
					</form>
					</div>
				</div>
			<?php
		}
		/*public function tweetPostwithImage($finalTweet, $id,$ntk =  'twitter')
		{

			$k=1;
			$tw=0;
			$nrOfUsers = count($this->users);
			$time = get_option("top_last_tweets");

			foreach ($this->users as $user) {

				if($ntk == $user['service']  ){
					if(isset($time[$ntk])){
						if(time() - $time[$ntk] < 60)
							return false;

					}

					$time[$ntk] = time();
					update_option("top_last_tweets",$time);
				switch ($user['service']) {
					case 'twitter':
						// Create a new twitter connection using the stored user credentials.
						$connection = new RopTwitterOAuth($this->consumer, $this->consumerSecret, $user['oauth_token'], $user['oauth_token_secret']);
						// Post the new tweet
						if (CWP_TOP_PRO){
							global $CWP_TOP_Core_PRO;
							$status = $CWP_TOP_Core_PRO->topProImage($connection, $finalTweet['message'], $id);
						}
						//var_dump($status);
						//$tw++;
						//} else {
						///	//$connection = new RopTwitterOAuth($this->consumer, $this->consumerSecret, $user['oauth_token'], $user['oauth_token_secret']);
						//$status = $connection->post('statuses/update', array('status' => "acesta e un tweet"));
						//$tw++;
						//}

						if ($nrOfUsers == $k)
							return $status;
						else
							$k++;

					case 'facebook':
						$args =  array(

							'body' => array( 'message' => $finalTweet['message'],'link' => $finalTweet['link']),

						);

						$pp=wp_remote_post("https://graph.facebook.com/".ROP_TOP_FB_API_VERSION."/$user[id]/feed?access_token=$user[oauth_token]",$args);
						if ($nrOfUsers == $k)
							return $pp['response']['message'];
						else
							$k++;

						break;

					case 'linkedin':

						$lk_message = str_replace("&", "&amp;",$finalTweet['message']);
						$sharedLink = str_replace("&", "&amp;",$finalTweet['link']);
						$content_xml = "";
						$visibility="anyone";
						$content_xml.="<content><title>".$lk_message."</title><submitted-url>".$sharedLink."</submitted-url></content>";
						$url = 'https://api.linkedin.com/v1/people/~/shares?oauth2_access_token='.$user["oauth_token"];


						$xml       = '<?xml version="1.0" encoding="UTF-8"?><share>
			             ' . $content_xml . '
			             <visibility>
			               <code>' . $visibility . '</code>
			             </visibility>
			           </share>';
						$headers = array(
							"Content-type: text/xml",
							"Content-length: " . strlen($xml),
							"Connection: close",
						);
						if (!function_exists('curl_version'))
							update_option('cwp_topnew_notice',"You host does not support CURL");
						$ch = curl_init();
						curl_setopt($ch, CURLOPT_URL,$url);
						curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
						curl_setopt($ch, CURLOPT_TIMEOUT, 10);
						curl_setopt($ch, CURLOPT_POST, true);
						curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
						curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

						$data = curl_exec($ch);

						if ($nrOfUsers == $k)
							return $data;
						else
							$k++;

						if(curl_errno($ch))
							print curl_error($ch);
						else
							curl_close($ch);

						break;
					default:
						$connection = new RopTwitterOAuth($this->consumer, $this->consumerSecret, $user['oauth_token'], $user['oauth_token_secret']);
						// Post the new tweet
						if (CWP_TOP_PRO) {
							global $$CWP_TOP_Core_PRO;
							$status = $CWP_TOP_Core_PRO->topProImage( $connection, $finalTweet['message'], $id );
						}
						if ($nrOfUsers == $k)
							return $status;
						else
							$k++;


				}
				}
				//sleep(100);
			}
		}*/

		// Generates the tweet date range based on the user input.
        // Corrected by Ash/Upwork: added a few efficiencies
		public function getTweetPostDateRange()
		{
			$max = intval(get_option('top_opt_max_age_limit'));

			if( !is_int($max) ) {
				self::addNotice(__("Incorect value for Maximum age of post to be eligible for sharing. Please check the value to be a number greater or equal than 0 ",'tweet-old-post'),'error');
				return false;
			}

			$min = intval(get_option('top_opt_age_limit'));

			if(!is_int($min)  ){
				self::addNotice(__("Incorect value for Minimum age of post to be eligible for sharing. Please check the value to be a number greater  or equal than 0 ",'tweet-old-post'),'error');
				return false;

			}
			if($max > 0 && $min > 0 && $max < $min){
				self::addNotice(__("Maximum age of post to be eligible for sharing must be greater than Minimum age of post to be eligible for sharing. Please check the value to be a number greater  or equal than 0 ",'tweet-old-post'),'error');
				return false;

			}

			$dateQuery = array();
            if($max > 0){
                $maxLimit       = time() - $max*24*60*60;
                $dateQuery['before'] = date("Y-m-d H:i:s", $maxLimit);
            }

            if($min > 0){
			    $minLimit       = time() - $min*24*60*60;
                $dateQuery['after'] = date("Y-m-d H:i:s", $minLimit);
            }

            return $dateQuery;


		}

		// Gets the omited tweet categories

		public function getExcludedCategories()
		{
			$postQueryCategories = "";
			$postCategories = get_option('top_opt_omit_cats');

			if(!empty($postCategories) && is_array($postCategories)) {
				$postQueryCategories = implode(',',$postCategories);
			}
			else
				$postQueryCategories = get_option('top_opt_omit_cats');

			return $postQueryCategories;
		}

		// Gets the tweet post type.
		public function getTweetPostType()
		{
			$postQueryPostTypes = "";
			$top_opt_post_type = get_option('top_opt_post_type');

			if(!empty($top_opt_post_type) && is_array($top_opt_post_type)) {
				$postQueryPostTypes = implode(',',$top_opt_post_type);
			}
			else
				$postQueryPostTypes = get_option('top_opt_post_type');

			return $postQueryPostTypes;

		}


		// Creates a custom Tweet Old Post schedule
		public function createCustomSchedule($schedules)
		{
			$schedules['cwp_top_schedule'] = array(
				'interval'	=> floatval($this->intervalSet) * 60 * 60,
				'display'	=> __("Custom Tweet User Interval", 'tweet-old-post')
			);

			return $schedules;
		}

		// Clears the custom Tweet Old Post cron job.
		public function clearScheduledTweets()
		{
			$all = $this->getAllNetworks();
			foreach($all as $n){
				wp_clear_scheduled_hook($n.'roptweetcron',array($n));
			}
		}

		// Deactivation hook
		public function deactivationHook()
		{
			$this->clearScheduledTweets();
			$this->deleteAllOptions();
		//	$this->remoteTrigger("off");
		}

		// Sets all authentication settings
		public function setAlloAuthSettings()
		{
			global $cwp_top_settings;

			$this->consumer = $cwp_top_settings['oAuth_settings']['consumer_key'];
			$this->consumerSecret = $cwp_top_settings['oAuth_settings']['consumer_secret'];
			$this->oAuthCallback = CURRENTURL;

			$this->cwp_top_access_token = get_option('cwp_top_access_token');
			$this->cwp_top_oauth_token = get_option('cwp_top_oauth_token');
			$this->cwp_top_oauth_token_secret = get_option('cwp_top_oauth_token_secret');

			$this->user_info = get_option('cwp_top_oauth_user_details');
			$this->users = apply_filters("rop_users_filter",get_option('cwp_top_logged_in_users'));
			$status = get_option('cwp_topnew_active_status', 'no');
			if($status == 'yes' || $status == 'no'){
				$this->pluginStatus = ($status=='yes') ? 'true' : 'false';
			}else{
				$this->pluginStatus = $status;
			}
			$this->intervalSet = get_option('top_opt_interval');

			self::$date_format = 'M j, Y @ G:i';
			//update_option('cwp_top_logged_in_users', '');
		}

		// Checks if twitter returned any temporary credentials to log in the user.
		public function afterAddAccountCheck()
		{
			if( time() - get_option("top_reauthorize") > 2592000 )
				$this->reAuthorize();
			global $cwp_top_settings;
			$code="";
			if(isset($_REQUEST['code']))
				$code = $_REQUEST["code"];
			$cnetwork = self::getCurrentNetwork();
			if(isset($_REQUEST['oauth_token'])  && $cnetwork == 'twitter') {

				if($_REQUEST['oauth_token'] == $this->cwp_top_oauth_token) {

					$twitter = new RopTwitterOAuth($this->consumer, $this->consumerSecret, $this->cwp_top_oauth_token, $this->cwp_top_oauth_token_secret );
					$access_token = $twitter->getAccessToken($_REQUEST['oauth_verifier']);
					$user_details = $twitter->get('account/verify_credentials');
					$user_details->status = array();
					$user_details->description = '';
					$user_details->name = preg_replace("/[^A-Za-z0-9 ]/", '', 	$user_details->name );
					$newUser = array(
						'user_id'				=> $user_details->id,
						'oauth_token'			=> $access_token['oauth_token'],
						'oauth_token_secret'	=> $access_token['oauth_token_secret'],
						'oauth_user_details'	=> $user_details,
						'service'				=> 'twitter'
					);

					$loggedInUsers = get_option('cwp_top_logged_in_users');
					if(empty($loggedInUsers)) { $loggedInUsers = array(); }


					if(in_array($newUser, $loggedInUsers)) {
						echo "You already added that user! no can do !";
					} else {
						array_push($loggedInUsers, $newUser);
						update_option('cwp_top_logged_in_users', $loggedInUsers);
					}

					header("Location: " . top_settings_url());
					exit;
				}
			}
			if(isset($_REQUEST['state']) && (get_option('top_fb_session_state') === $_REQUEST['state'])) {

				$token_url = "https://graph.facebook.com/".ROP_TOP_FB_API_VERSION."/oauth/access_token?"
				             . "client_id=" . get_option('cwp_top_app_id') . "&redirect_uri=" . top_settings_url()
				             . "&client_secret=" . get_option('cwp_top_app_secret') . "&code=" . $code;

				$params = null;$access_token="";
				$response = wp_remote_get($token_url);

				if(is_array($response))
				{
					if(isset($response['body']))
					{
						parse_str($response['body'], $params);
						if ( ! isset( $params['access_token'] ) ) {
                            // check if the body is in json
                            $params = json_decode( $response['body'], true );
                        }
						if(isset($params['access_token']))
							$access_token = $params['access_token'];
					}
				}

				if($access_token!="")
				{
					update_option('top_fb_token',$access_token);

				}
				header("Location: " . top_settings_url().'&fbadd');
			}

			if (isset($_GET['code'])&&isset($_GET['state'])&&get_option('top_lk_session_state') == $_GET['state']) {

				$lk_auth_token = get_option('cwp_top_lk_app_id');
				$lk_auth_secret = get_option('cwp_top_lk_app_secret');
				$params = array('grant_type' => 'authorization_code',
				                'client_id' => $lk_auth_token,
				                'client_secret' => $lk_auth_secret,
				                'code' => $_GET['code'],
				                'redirect_uri' => top_settings_url(),
				);

				$url = 'https://www.linkedin.com/uas/oauth2/accessToken?' . http_build_query($params);
				//echo $url;
				$response = wp_remote_post($url);
				$token = json_decode($response['body']);
				//print_r($response);
				//print_r($token);
				if($token->access_token) {
					// the request went through without an error, gather user's 'access' tokens
					//AQVBBQ6_ggJaUVFYmJ5oVF_kSH-wn6VNREGgC_sYPWp0YV0U4r2CFwptnLXUbJra5Glp0ZMax96CrD2azzf_HkJ2UdLp5q5zoiT_rbl5bmTMf50XnDfRcdm8Vl2k2XoYhGQ-LkYTnddFz1K-OBcW0CWsapzgZH2hepMVMhc1Lw7bhwTab04"
					update_option('top_linkedin_token',$token->access_token);
					update_option('top_linkedin_token_expires',$token->expires_in);
				}

				$url = 'https://api.linkedin.com/v1/people/~:(id,picture-url,first_name,last_name)?oauth2_access_token='.$token->access_token;
				//echo $url;
				$response = wp_remote_get($url);
				$response = wp_remote_retrieve_body($response);
				//print_r($response);
				$person = simplexml_load_string($response);

				if (isset($person->id)) {
					$user_details = array('profile_image_url' => (string)$person->{'picture-url'},'name'=> (string)$person->{'first-name'} );

					$newUser = array(
						'user_id'				=> (string)$person->id,
						'oauth_token'			=> $token->access_token,
						'oauth_token_secret'	=> '',
						'oauth_user_details'	=> (object)$user_details,
						'service'				=> 'linkedin'
					);

					$loggedInUsers = get_option('cwp_top_logged_in_users');
					if(empty($loggedInUsers)) { $loggedInUsers = array(); }

					foreach ($loggedInUsers as $key=>$user) {
						if ($user['user_id'] == $person->id)
							unset($loggedInUsers[$key]);
					}

					if(in_array($newUser, $loggedInUsers)) {
						echo "You already added that user! no can do !";
					} else {
						array_push($loggedInUsers, $newUser);
						update_option('cwp_top_logged_in_users', $loggedInUsers);
					}
				}



				header("Location: " . top_settings_url());
			}

			if(CWP_TOP_PRO){
				global $CWP_TOP_Core_PRO;
				if(method_exists($CWP_TOP_Core_PRO,"afterCheckPro")){
					$CWP_TOP_Core_PRO->afterCheckPro();
				}

			}
		}

		// Used to display the login buttons
		public function displayLoginButton($social_network)
		{
			// display the twitter login button
			if($this->userIsLoggedIn($social_network)) {
				$this->setAlloAuthSettings($social_network);
				return true;
			} else {
				return false;
			}
		}

		public function reAuthorize() {
			$top_session_state = uniqid('', true);
			update_option('top_reauthorize',time());
			$loggedInUsers = get_option('cwp_top_logged_in_users');
			if(empty($loggedInUsers)) { $loggedInUsers = array(); }
			$lk = 0;
			$fb = 0;

			foreach ($loggedInUsers as $key=>$user) {
				if ($user['service'] === "linkedin"&&$lk===0) {
					$lk++;
					$url = 'https://www.linkedin.com/uas/oauth2/authorization?response_type=code&client_id='.get_option("cwp_top_lk_app_id").'&scope=w_share&state='.$top_session_state.'&redirect_uri='.top_settings_url();
					header("Location: " . $url);

					update_option('top_lk_session_state',$top_session_state);

				}

				if ($user['service'] === "facebook"&&$fb===0) {
					$top_session_state_fb = md5(uniqid(rand(), TRUE));
					$fb++;
					update_option('top_fb_session_state',$top_session_state_fb);
					$dialog_url = "https://www.facebook.com/".ROP_TOP_FB_API_VERSION."/dialog/oauth?client_id="
					              . get_option("cwp_top_app_id") . "&redirect_uri=" . top_settings_url() . "&state="
					              . $top_session_state_fb . "&scope=publish_actions,manage_pages,publish_pages,user_posts,user_photos";

					header("Location: " . $dialog_url);
				}
			}

		}

		// Adds pages
		public function displayPages()
		{

			if(!is_admin()) return false;
			$social_network = $_POST['social_network'];
			$access_token = get_option('top_fb_token');

			switch ($social_network) {
				case 'facebook':
					$result1="";$pagearray1="";
					$pp=wp_remote_get("https://graph.facebook.com/".ROP_TOP_FB_API_VERSION."/me/accounts?access_token=$access_token&limit=100&offset=0");
					//print_r($pp);
					$me=wp_remote_get("https://graph.facebook.com/".ROP_TOP_FB_API_VERSION."/me/?access_token=$access_token&limit=100&offset=0");
					if(is_array($pp))
					{
						$result1=$pp['body'];
						$result2 = $me['body'];
						$pagearray2 = json_decode($result2);
						//print_r($pagearray2);
						$pagearray1 = json_decode($result1);
						$profile['name'] = $pagearray2->first_name.' '.$pagearray2->last_name;
						$profile['id'] = $pagearray2->id;
						$profile['category'] ='profile';
						$profile['access_token'] = $access_token;
						if(is_array($pagearray1->data))
							array_unshift($pagearray1->data, $profile);
						//$pagearray1->data[count($pagearray1->data)] = $profile;
						$result1 = json_encode($pagearray1);
						//print_r($results1);
						echo $result1;

					}
					break;
			}
			die(); // Required
		}
		public function adminNotice(){
			if(is_array($this->notices)){

				foreach($this->notices as $n){
					?>
					<div class="error">
       					 <p><?php _e( $n, 'tweet-old-post' ); ?></p>
   				 </div>
				<?php
				}
			}

		}
		public function checkVersion(){
			if(!defined("ROP_PRO_VERSION") && CWP_TOP_PRO) echo 'rop-not-version';

		}
		public function addPages()
		{

			if(!is_admin()) return false;
			$social_network = $_POST['social_network'];
			$access_token = $_POST['page_token'];
			$page_id= $_POST['page_id'];

			switch ($social_network) {
				case 'facebook':
					$user_details['profile_image_url'] = $_POST['picture_url'];
					$user_details['name'] = $_POST['page_name'];
					$user_details = (object) $user_details;
					$newUser = array(
						'user_id'				=> $page_id,
						'oauth_token'			=> $access_token,
						'oauth_token_secret'	=> "",
						'oauth_user_details'	=> $user_details,
						'service'				=> 'facebook'
					);

					$loggedInUsers = get_option('cwp_top_logged_in_users');
					if(empty($loggedInUsers)) { $loggedInUsers = array(); }

					foreach ($loggedInUsers as $key=>$user) {
						if ($user['user_id'] == $page_id)
							unset($loggedInUsers[$key]);
					}

					if(in_array($newUser, $loggedInUsers)) {
						echo "You already added that user! no can do !";
					} else {
						array_push($loggedInUsers, $newUser);
						update_option('cwp_top_logged_in_users', $loggedInUsers);
						echo top_settings_url();
					}


					break;
			}
			die(); // Required
		}
		public static function setCurrentNetwork($network){
			update_option("rop_current_network_oauth",$network);

		}
		public static function getCurrentNetwork(){
			$network = get_option("rop_current_network_oauth");
			if($network == false) return '';
			return $network;
		}
		// Adds new account
		public function addNewAccount()
		{

			if(!is_admin()) return false;
			if(!function_exists('curl_version')){

				self::addNotice(__("You need to have cURL library enabled in order to use our plugin! Please check it with your hosting company to enable this."),'tweet-old-post');
				return false;
			}
			global $cwp_top_settings;
			$social_network = $_POST['social_network'];
			self::setCurrentNetwork($social_network);
			$networks = $this->getAvailableNetworks();
			$allnetworks = $this->getAllNetworks(true);
			$response = array();

			if($allnetworks[$social_network] && !CWP_TOP_PRO){
				self::addNotice("You need to <a target='_blank' href='http://revive.social/plugins/revive-old-post/?utm_source=topplusacc&utm_medium=announce&utm_campaign=top&upgrade=true'>upgrade to the PRO version</a> in order to add a ".ucwords($social_network)." account, fellow pirate!",'error');

			}else if(in_array($social_network,$networks) && !CWP_TOP_PRO) {
				self::addNotice("You need to <a target='_blank' href='http://revive.social/plugins/revive-old-post/?utm_source=topplusacc&utm_medium=announce&utm_campaign=top&upgrade=true'>upgrade to the PRO version</a> in order to add more accounts, fellow pirate!",'error');


			}else{
				switch ($social_network) {
					case 'twitter':
						$this->oAuthCallback = $_POST['currentURL'];
						$twitter = new RopTwitterOAuth($this->consumer, $this->consumerSecret);
						$requestToken = $twitter->getRequestToken($this->oAuthCallback);

						update_option('cwp_top_oauth_token', $requestToken['oauth_token']);
						update_option('cwp_top_oauth_token_secret', $requestToken['oauth_token_secret']);

						switch ($twitter->http_code) {
							case 200:
								$url = $twitter->getAuthorizeURL($requestToken['oauth_token']);
								$response['url'] = $url;
								break;

							default:
								self::addNotice(__("Could not connect to Twitter!"),'tweet-old-post');

								break;
						}
						break;
					case 'facebook':
							if (empty($_POST['extra']['app_id'])){
								self::addNotice(__("Could not connect to Facebook! You need to add the App ID",'tweet-old-post'),'error');
							}else
							if (empty($_POST['extra']['app_secret'])){
								self::addNotice(__("Could not connect to Facebook! You need to add the App Secret",'tweet-old-post'),'error');

							}else{
								update_option('cwp_top_app_id', $_POST['extra']['app_id']);
								update_option('cwp_top_app_secret', $_POST['extra']['app_secret']);

								$top_session_state = md5(uniqid(rand(), TRUE));

								update_option('top_fb_session_state',$top_session_state);
								$dialog_url = "https://www.facebook.com/".ROP_TOP_FB_API_VERSION."/dialog/oauth?client_id="
								              . $_POST['extra']['app_id'] . "&redirect_uri=" . top_settings_url() . "&state="
	 							              . $top_session_state . "&scope=publish_actions,manage_pages,publish_pages,user_posts,user_photos";

								$response['url'] = $dialog_url;

							}

						break;
					default:
						if(CWP_TOP_PRO){
							global $CWP_TOP_Core_PRO;
							$CWP_TOP_Core_PRO->topProAddNewAccount();
						}
				}

			}

			echo json_encode($response);

			die(); // Required
		}

		// Adds more than one account
		public function addNewAccountPro()
		{

			if(!is_admin()) return false;
			if (CWP_TOP_PRO) {
				global $CWP_TOP_Core_PRO;
				$CWP_TOP_Core_PRO->topProAddNewAccount($_POST['social_network']);
			}
			else{
				update_option('cwp_topnew_notice',"You need to <a target='_blank' href='http://revive.sociahttp://revive.social/plugins/revive-old-post/?utm_source=topplusacc&utm_medium=announce&utm_campaign=top&upgrade=true'>upgrade to the PRO version</a> in order to add more accounts, fellow pirate!");
				echo "You need to <a target='_blank' href='http://revive.social/plugins/revive-old-post/?utm_source=topplusacc&utm_medium=announce&utm_campaign=top&upgrade=true'>upgrade to the PRO version</a> in order to add more accounts, fellow pirate!";

			}
			die(); // Required
		}

		// Gets the next tweet interval.
		public function getNextTweetInterval()
		{
			$timestamp = wp_next_scheduled( 'cwptoptweetcronnew' );

			//echo $timestamp;
			//$timestamp = date("Y-m-d H:i:s", $timestamp);
			//$timeLeft = get_date_from_gmt($timestamp);
			//$timeLeft = strtotime($timeLeft);
			echo $timestamp;
		}

		// Checks if the user is logged in/
		public function userIsLoggedIn()
		{
			if(!empty($this->cwp_top_oauth_token) && !empty($this->cwp_top_oauth_token_secret)) {
				return true;
			} else {
				return false;
			}
		}

		// Clears all Twitter user credentials.
		public function logOutUser()
		{
			if(!is_admin()) return false;
			$userID = $_POST['user_id'];

			$users = get_option('cwp_top_logged_in_users');

			foreach ($users as $id => $user) {
				foreach ($user as $key => $value) {
					if($userID == $value) {
						$user_id = array_search($user, $users);
						unset($users[$user_id]);
					}
				}
			}

			update_option('cwp_top_logged_in_users', $users);

			$this->setAlloAuthSettings();
			die();
		}

		function getUpperDays($day,$days){
			$tmp = array();
			foreach($days as $d){
				if($day <= $d){
					$tmp[] = $d;
				}
			}
			return $tmp;
		}
		public function getSchedule(){
			$db = get_option("cwp_top_global_schedule" ) ;
			if(!is_array($db)) $db = array();
			$networks = $this->getAllNetworks();
			foreach($networks as $network){
				if(!isset($db[$network.'_schedule_type_selected']))  $db[$network.'_schedule_type_selected'] = "each";
				if(!isset($db[$network.'_top_opt_interval']))  $db[$network.'_top_opt_interval'] = 8;

			}
			return $db;
		}
		function   getNextTweetTime($network, $nowTime=null){
			$time = 0;
			if(!CWP_TOP_PRO){
				 $time =  $this->getTime($nowTime) + ( floatval(get_option('top_opt_interval'))  * 3600 ) ;
				 if($time > $this->getTime($nowTime)) {
					 return $time;
				 }else{
					 return 0;
				 }
			}
			$cwp_top_global_schedule = $this->getSchedule();
			$type = $cwp_top_global_schedule[$network.'_schedule_type_selected'];
			if($type == 'each'){
				$time =  $this->getTime($nowTime) + floatval($cwp_top_global_schedule[$network.'_top_opt_interval']) * 3600;
				if($time > $this->getTime($nowTime)) {
					return $time;
				}else{
					return 0;
				}
			}else{
				if (date('N', $this->getTime($nowTime)) == 1){
					$start = strtotime("monday this week",$this->getTime($nowTime)) ;
				}else{
					$start = strtotime("last Monday",$this->getTime($nowTime)) ;
				}

				$days = explode(",",$cwp_top_global_schedule[$network.'_top_opt_interval']['days']);

				$times = $cwp_top_global_schedule[$network.'_top_opt_interval']['times'];
				$schedules_days = array();
				if(count($times) == 0 ) return false;
				if(count($days) == 0 ) return false;
				foreach($days as $rday){
					$schedules_days[] = $start +  ($rday-1) * 3600 * 24;

				}
				$schedules = array();
				foreach($schedules_days as $schedule){

					foreach($times as $time){

						$schedules[] = $schedule + floatval($time['hour']) * 3600 + floatval($time['minute']) * 60;

					}

				}
				sort($schedules,SORT_REGULAR);
				$ctime = $this->getTime($nowTime);

				foreach($schedules as $s ){
					if($s > $ctime ) {
						return $s;
					}

				}
				foreach($schedules  as $s){
					$s += 7 * 24 * 3600;
					if($s > $ctime) return $s;

				}
				return 0;
			}
			return 0;
		}
		public function getAllOptions(){
			$options = array();

			$format_fields = $this->getFormatFields();
			$all = $this->getAllNetworks();
			foreach($format_fields as $n=>$detail){
				foreach($detail  as $df){

					$options[] = $n."_".$df['option'];

				}
			}
			foreach($all as $a){

				$options[] = $a."_schedule_type_selected";
				$options[] = $a."_top_schedule_days";
				$options[] = $a."_time_choice_hour";
				$options[] = $a."_top_opt_interval";
				$options[] = $a."_time_choice_min";
			}
			$cwp_top_fields = $this->getGeneralFields();
			foreach ($cwp_top_fields as $field)
			{
				$options[] = $field['option'];
			}
			return $options;
		}
		public function sanitizeRequest(){

			$dataSent = $_POST['dataSent']['dataSent'];
			$valid = array();
			parse_str($dataSent, $options);
			$all_options = $this->getAllOptions();
			$invalid = array();
			foreach($options as $k => $option ){
				if(in_array($k,$all_options)){
					$valid[$k] = $option;

				}else{
					$invalid[] = $k;
				}

			}
			$_POST['dataSent']['dataSent'] = http_build_query($valid);
		}
		// Updates all options.
		public function updateAllOptions()
		{
			if(!is_admin()) return false;
			$dataSent = $_POST['dataSent']['dataSent'];
			$this->sanitizeRequest();
			$options = array();

			parse_str($dataSent, $options);
			foreach ($options as $option => $newValue) {
				//$newValue = sanitize_text_field($newValue);
				update_option($option, $newValue);
			}

			//update_option('top_opt_post_type', 'post');

			if(!array_key_exists('top_opt_custom_url_option', $options)) {
				update_option('top_opt_custom_url_option', 'off');
			}

			if(!array_key_exists('top_opt_use_url_shortner', $options)) {
				update_option('top_opt_use_url_shortner', 'off');
			}

			if(!array_key_exists('top_opt_post_with_image', $options)) {
				update_option('top_opt_post_with_image', 'off');
			}

			if(!array_key_exists('top_opt_tweet_multiple_times', $options)) {
				update_option('top_opt_tweet_multiple_times', 'off');
			}

			if(!array_key_exists('top_opt_ga_tracking', $options)) {
				update_option('top_opt_ga_tracking', 'off');
			}

			//if(!array_key_exists('top_opt_tweet_specific_category', $options)) {
			//	update_option('top_opt_tweet_specific_category', '');
			//}

			if(!array_key_exists('top_opt_omit_cats', $options)) {
				update_option('top_opt_omit_cats', '');
			}

			if(!array_key_exists('top_opt_post_type', $options)) {
				update_option('top_opt_post_type', 'post');
			}

			//update_option("top_opt_already_tweeted_posts", array());
			$this->updateAllPostFormat($options);
			if(CWP_TOP_PRO){

				global $CWP_TOP_Core_PRO;
				$CWP_TOP_Core_PRO->updateTopProAjax();
			}
			die();
		}

		private function updateAllPostFormat($options)
		{
			$all = $this->getAllNetworks();
			foreach($all as $n){

				if(!array_key_exists($n.'_top_opt_custom_url_option', $options)) {
					$options[$n.'_top_opt_custom_url_option'] =  'off';
				}

				if(!array_key_exists($n.'_top_opt_use_url_shortner', $options)) {
					$options[$n.'_top_opt_use_url_shortner'] =  'off';
				}

				if(!array_key_exists($n.'_top_opt_post_with_image', $options)) {
					$options[$n.'_top_opt_post_with_image'] =  'off';
				}

				if(!array_key_exists($n.'_top_opt_tweet_multiple_times', $options)) {
					$options[$n.'_top_opt_tweet_multiple_times'] =  'off';
				}

				if(!array_key_exists($n.'_top_opt_ga_tracking', $options)) {
					$options[$n.'_top_opt_ga_tracking'] = 'off';
				}

				//if(!array_key_exists('top_opt_tweet_specific_category', $options)) {
				//	update_option('top_opt_tweet_specific_category', '');
				//}

				if(!array_key_exists($n.'_top_opt_omit_cats', $options)) {
					$options[$n.'_top_opt_omit_cats'] =  '';
				}

				if(!array_key_exists($n.'_top_opt_post_type', $options)) {
					$options[$n.'_top_opt_post_type']  =  'post';
				}

			}

			update_option('top_opt_post_formats', $options);

		}

		public function top_admin_notice() {
			global $current_user ;
			$user_id = $current_user->ID;
			/* Check that the user hasn't already clicked to ignore the message */
			if ( ! get_user_meta($user_id, 'top_ignore_notice3') ) {
				//  echo '<div class="error"><p>';
				//  printf(__(' We just fixed the interrupted posting issue and scheduling issue, if you don\'t see any tweets you need to re-authentificate your twitter accounts. | <a href="'.SETTINGSURL.'&top_nag_ignore=0">Hide Notice</a>'));
				// echo "</p></div>";
			}
		}
		public function top_nag_ignore() {

			global $current_user;
			$user_id = $current_user->ID;
			/* If user clicks to ignore the notice, add that to their user meta */
			if ( isset($_GET['top_nag_ignore']) && '0' == $_GET['top_nag_ignore'] ) {
				add_user_meta($user_id, 'top_ignore_notice3', 'true', true);
			}
		}

		public function resetAllOptions()
		{

			if(!is_admin()) return false;

			$defaultOptions = array(
				'top_opt_tweet_type'				=> 'title',
				'top_opt_post_with_image'			=> 'off',
				'top_opt_bitly_user'				=>'',
				'top_opt_bitly_key'					=>'',
				'top_opt_post_type_custom_field'	=> '',
				'top_opt_add_text'					=> '',
				'top_opt_add_text_at'				=> 'beginning',
				'top_opt_include_link'				=> 'true',
				'top_opt_custom_url_option'			=> 'off',
				'top_opt_use_url_shortner'			=> 'on',
				'top_opt_ga_tracking'				=> 'on',
				'top_opt_url_shortner'				=> 'rviv.ly',
				'top_opt_custom_hashtag_option'		=> 'nohashtag',
				'top_opt_hashtags'			=> '',
				'top_opt_hashtag_length'			=> '0',
				'top_opt_custom_hashtag_field'		=> '',
				'top_opt_interval'					=> '8',
				'top_opt_age_limit'					=> '30',
				'top_opt_max_age_limit'				=> '0',
				'top_opt_no_of_tweet'				=> '1',
				'top_opt_post_type'					=> 'post',
				'top_opt_post_type_value'			=> 'post',
				'top_opt_custom_url_field'			=> '',
				'top_opt_omit_cats'					=> '',
				'cwp_topnew_active_status'			=> 'no',
				'cwp_topnew_notice'					=> '',
				'top_opt_excluded_post'				=> '',
				'top_opt_tweet-multiple-times'		=> 'off',
				'cwp_top_logged_in_users'			=> '',
				'top_fb_token'						=>'',
				'top_opt_post_formats'				=>'',
                // Added by Ash/Upwork
                'cwp_rop_custom_messages'           => 'off',
                'top_opt_posts_buffer_twitter'      => '',
                'top_opt_posts_buffer_facebook'     => '',
                'top_opt_posts_buffer_linkedin'     => '',
                'top_opt_posts_buffer_tumblr'       => '',
                'top_opt_posts_buffer_xing'         => '',
				'top_opt_shortest_key'              =>'',
				'top_opt_googl_key'                 =>'',
				'top_opt_owly_key'                  =>'',
				'top_opt_tweet_multiple_times'      => 'on',
				'rop_opt_cat_filter'                => 'exclude',
                // Added by Ash/Upwork
			);

			foreach ($defaultOptions as $option => $defaultValue) {
				update_option($option, $defaultValue);
			}


			update_option("top_opt_post_formats",array());
			update_option("cwp_top_global_schedule",array());
			$this->clearScheduledTweets();
			//die();
		}
		public function getPostFormatValues(){
			$cwp_rop_all_networks = $this->getFormatFields();
			$options = get_option("top_opt_post_formats");
			$return = array();
			foreach($cwp_rop_all_networks as $n=>$d){

				foreach($d as $fname => $f){

				    if(!isset($options[$n."_".$f['option']])){
					    $return[$n."_".$f['option']] = $f['default_value'];

				    }else{
					    $return[$n."_".$f['option']] = $options[$n."_".$f['option']];

				    }

				}

			}

			return $return;


		}
		public function deleteAllOptions()
		{
			global $defaultOptions;
			foreach ($defaultOptions as $option => $defaultValue) {
				delete_option($option);
			}
            // Added by Ash/Upwork
            do_action("rop_pro_deactivateFree");
            // Added by Ash/Upwork
		}

		// Generate all fields based on settings
		public static function generateFieldType($field)
		{
			$disabled = "";
			$pro = "";

			switch ($field['type']) {
				case 'image-list':
					$pro = "";
					$disabled = "";
					if (isset($field['available_pro'])) {


						if(!CWP_TOP_PRO){
							$pro = CWP_TOP_PRO_STRING;
							$disabled = "disabled='disabled'";
						}
					}
					if(isset($field['available_business'])){
						if(!apply_filters('rop_is_business_user', false)){
							$pro = $field["pro_text"];
							$disabled = "disabled='disabled'";
						}
					}
					$images = array();
					$images[] = "full";
					$images = array_merge($images,get_intermediate_image_sizes());

					echo "<select  name='".$field['option']."' id='".$field['option']."'   ".$disabled ." >";
							foreach($images as $image){
								echo "<option ".(($field["option_value"] == $image) ? "selected" : "")." value='".$image."'>".$image."</option>";
							}

					echo "</select><br/>".$pro;
					break;
				case 'text':
					if (isset($field['available_pro'])) {


						if(!CWP_TOP_PRO && $field['available_pro'] == 'yes') {
							if ( isset( $field["pro_text"] ) ) {
								$pro = __($field["pro_text"],'tweet-old-post');
							} else {
								$pro = CWP_TOP_PRO_STRING;
							}
							$disabled = "disabled='disabled'";
						}
					}

					if(isset($field['available_business'])){

						if(!apply_filters('rop_is_business_user', false)){
							$pro = $field["pro_text"];
							$disabled = "disabled='disabled'";

						}
					}
					echo "<input type='text' placeholder='".__($field['description'],'tweet-old-post')."' ".$disabled." value='".$field['option_value']."' name='".$field['option']."' id='".$field['option']."'><br/>".$pro;
					break;

				case 'number':
					if (isset($field['available_pro'])) {


						if(!CWP_TOP_PRO){
							$pro = CWP_TOP_PRO_STRING;
							$disabled = "disabled='disabled'";
						}
					}
					if(isset($field['available_business'])){
						if(!apply_filters('rop_is_business_user', false)){
							$pro = $field["pro_text"];
							$disabled = "disabled='disabled'";
						}
					}
					echo "<input type='number' placeholder='".__($field['description'],'tweet-old-post')."' ".$disabled." value='".$field['option_value']."' max='".$field['max-length']."' name='".$field['option']."' id='".$field['option']."'><br/>".$pro;
					break;

				case 'select':
					$noFieldOptions = intval(count($field['options']));
					$fieldOptions = array_keys($field['options']);
					if (isset($field['available_pro'])) {


						if(!CWP_TOP_PRO && $field['available_pro'] == 'yes'){
							$pro = CWP_TOP_PRO_STRING;
							$disabled = "disabled='disabled'";
						}
					}
					if(isset($field['available_business'])){
						if(!apply_filters('rop_is_business_user', false)){
							$pro = $field["pro_text"];
							$disabled = "disabled='disabled'";
						}
					}
					//if ($field['option']=='top_opt_post_type') $disabled = "disabled";
					print "<select id='".$field['option']."' name='".$field['option']."'".$disabled.">";
					for ($i=0; $i < $noFieldOptions; $i++) {
						print "<option value=".$fieldOptions[$i];
						if($field['option_value'] == $fieldOptions[$i]) { echo " selected='selected'"; }
						print ">".__($field['options'][$fieldOptions[$i]],'tweet-old-post')."</option>";
					}
					print "</select>".$pro;
					break;

				case 'checkbox':

					if (isset($field['available_pro'])) {

						if(!CWP_TOP_PRO){
							$pro = CWP_TOP_PRO_STRING;
							$disabled = "disabled='disabled'";
						}
					}
					if(isset($field['available_business'])){
						if(!apply_filters('rop_is_business_user', false)){
							$pro = $field["pro_text"];
							$disabled = "disabled='disabled'";
						}
					}
					print "<input id='".$field['option']."' type='checkbox' ".$disabled." name='".$field['option']."'";
					if($field['option_value'] == 'on') { echo "checked=checked"; }
					print " />".$pro;


					break;

				case 'categories-list':

					$taxs = get_taxonomies(array(
						'public'   => true
					),"object","and");

					$post_types = get_post_types( array(
						'public'   => true,
					), "object","and");
					$post_types["post"] = get_post_type_object( 'post' );
					$post_types["page"] = get_post_type_object( 'page' );

                    $taxonomies         = array();
					foreach($post_types as $pt=>$pd){
						foreach($taxs as $tx){

							if(in_array($pt,$tx->object_type)){

								$terms = get_terms($tx->name, array(
									'hide_empty'        => true,
									'number'            =>400

								) );
								if(!empty($terms)){
                                    // Added by Ash/Upwork
                                    $options                = array();
									foreach ($terms as $t) {
                                        $options[]          = array("label" => $t->name, "id" => $t->term_id);
                                    }
                                    $taxonomies[]           = array("label" => $tx->labels->name, "values" => $options);
                                    // Added by Ash/Upwork
								}
							}
						}
					}

                    // Added by Ash/Upwork
                    ob_start();
                    include_once ROPPLUGINPATH . "/inc/view-categories-list.php";
                    echo ob_get_clean();
                    // Added by Ash/Upwork

					break;

				case 'custom-post-type':
					print "<div class='post-type-list clearfix'>";
					$args = array(
						'public'   => true,
						'_builtin' => false
					);

					$output = 'names'; // names or objects, note names is the default
					$operator = 'and'; // 'and' or 'or'
					if (isset($field['available_pro'])) {
						if(!CWP_TOP_PRO){
							$pro = CWP_TOP_PRO_STRING;
							$disabled = "disabled='disabled'";
						}
					}
					if(isset($field['available_business'])){
						if(!apply_filters('rop_is_business_user', false)){
							$pro = $field["pro_text"];
							$disabled = "disabled='disabled'";
						}
					}
					$post_types = get_post_types( $args, $output, $operator );
					array_push($post_types,"post","page");
					foreach ($post_types as $post_type) {

						//$top_opt_tweet_specific_category = get_option('top_opt_tweet_specific_category');

						if (!is_array(get_option('top_opt_post_type')))
							$top_opt_post_types = explode(',',get_option('top_opt_post_type'));
						else
							$top_opt_post_types = get_option('top_opt_post_type');

						print "<div class='cwp-cat '>";
						print "<input ".$disabled." type='checkbox' class='cwp-cpt-checkbox' name='".$field['option']."[]'  value='".$post_type."' id='".$field['option']."_cat_".$post_type."'";

						if($field['option'] == 'top_opt_post_type') {
							if(is_array($top_opt_post_types)) {
								if(in_array($post_type, $top_opt_post_types)) {
									print "checked=checked";
								}
							}
						}


						print ">";
						print "<label for='".$field['option']."_cat_".$post_type."'>".$post_type."</label>";
						print "</div>";

					}
					print "</div> ".$pro;
					break;

			}

		}


		public function echoTime() {

			echo $this->getTime();

			die();
		}
		public function getTime($nowTime=null) {
            if($nowTime) return $nowTime;
			return time() ;

			//return  time() - 253214 + 2 * 3600 + 24 * 3600;
		}

		function top_plugin_action_links($links, $file) {

			if ($file == ROPPLUGINBASENAME) {
				// The "page" query string value must be equal to the slug
				// of the Settings admin page we defined earlier, which in
				// this case equals "myplugin-settings".
				$settings_link = '<a href="' . get_bloginfo('wpurl') . '/wp-admin/admin.php?page=TweetOldPost">Settings</a>';
				array_unshift($links, $settings_link);
			}

			return $links;
		}
		public function getRemoteCheck(){
			$remote_check = get_option("cwp_rop_remote_trigger");
			if($remote_check === false) $remote_check = "off";
			return $remote_check;
		}
		public function getBetaUserStatus(){
			$beta_user = get_option("cwp_rop_beta_user");
			if($beta_user === false) $beta_user  = "off";
			return $beta_user;
		}
		public function fixCron() {
			update_option('cwp_topnew_notice','');

			if ( defined( 'ALTERNATE_WP_CRON' ) ) {

				//delete_option( 'hmbkp_wp_cron_test_failed' );

				//echo 1;

				return 0;

			}
			else {

				$response = wp_remote_head( site_url( 'wp-cron.php' ), array( 'timeout' => 30 ) );

				if ( is_wp_error( $response ) ) {

					update_option('cwp_topnew_notice', "Looks like there is an issue with your WP Cron and Tweet Old Post relies on wp-cron to schedule tweets, see the <a href='http://wordpress.org/plugins/tweet-old-post/faq/'>FAQ</a> for more details!");

				} elseif ( wp_remote_retrieve_response_code( $response ) != 200 ) {

					update_option('cwp_topnew_notice', "Looks like there is an issue with your WP Cron and Tweet Old Post relies on wp-cron to schedule tweets, see the <a href='http://wordpress.org/plugins/tweet-old-post/faq/'>FAQ</a> for more details!");

				}



			}
		}
		public function clearOldCron(){
			if(isset($_POST['cwp-action'])){
				if($_POST['cwp-action'] == 'download_sysinfo'){
					header('Content-Disposition: attachment; filename="report.txt"');
					header('Content-type: text/plain');
					echo $_POST['cwp-top-sysinfo'];
					die();

				}

			}
			if ( false === ( $remote_calls = get_transient( 'rop_remote_calls' ) ) ) {
				$beta_user = $this->getBetaUserStatus();
				if($beta_user == "on" )	{
					$this->sendBetaUserTrigger($beta_user);
				}
				$remote_call = $this->getRemoteCheck();
				if($remote_call == "on" )	{
					$this->sendBetaUserTrigger($remote_call);
				}

				$this->remoteTrigger();
				set_transient( 'rop_remote_calls', "done", 24 * HOUR_IN_SECONDS );
			}
			if(!defined("VERSION_CHECK") && function_exists('topProImage')){
					$this->notices[] = "You need to have the latest version of the Revive Old Post Pro addon in order to use it. Please download it from the revive.social account";

			}
			$all = $this->getAllNetworks();

			if($this->pluginStatus !== 'true'){

				foreach($all as $a){

					wp_clear_scheduled_hook($a.'roptweetcron',array($a));


				}
				return false;
			}


			$networks = $this->getAvailableNetworks();
			if(wp_next_scheduled( 'cwp_top_tweet_cron' ) !== false) {

				$timestamp = wp_next_scheduled( 'cwp_top_tweet_cron' );
				wp_clear_scheduled_hook('cwp_top_tweet_cron');
				foreach($networks as $network){
					wp_schedule_single_event($timestamp,$network.'roptweetcron',array($network));
				}

			}else{

				if(wp_next_scheduled( 'cwptoptweetcronnew' ) !== false) {
					$timestamp = wp_next_scheduled( 'cwptoptweetcronnew' );
					wp_clear_scheduled_hook('cwptoptweetcronnew');
					foreach($networks as $network){
						wp_schedule_single_event($timestamp,$network.'roptweetcron',array($network));
					}
				}
				else{

						foreach($all as $a){
							if(wp_next_scheduled( $a.'cwptoptweetcron',array($a) ) !== false) {

								$timestamp = wp_next_scheduled($a.'cwptoptweetcron',array($a) );
								wp_clear_scheduled_hook($a.'cwptoptweetcron',array($a));
								wp_schedule_single_event($timestamp,$a.'roptweetcron',array($a));
							}
						}
						foreach($all as $a){
							if(!in_array($a,$networks)){
								wp_clear_scheduled_hook($a.'roptweetcron',array($a));
							}

						}

				}

			}

			if($this->pluginStatus === 'true'){
				foreach($networks as $avn){
					if(wp_next_scheduled( $avn.'roptweetcron',array($avn) ) === false) {
						$this->scheduleTweet($avn);
					}
				}
			}
		}

		public function clear_delete_type(){

			update_option('cwp_top_delete_type',-1);
		}
		public function loadAllHooks()
		{

			// loading all actions and filters
			add_action('admin_menu', array($this, 'addAdminMenuPage'));

			add_action('admin_enqueue_scripts', array($this, 'loadAllScriptsAndStyles'));

			add_action( 'admin_notices', array($this, 'adminNotice') );

			add_filter('plugin_action_links',array($this,'top_plugin_action_links'), 10, 2);

            // Added by Ash/Upwork
            add_filter('cwp_check_ajax_capability', array($this, 'checkAjaxCapability'), 10, 0);
            // Added by Ash/Upwork

			add_action( 'plugins_loaded', array($this, 'addLocalization') );

			//ajax actions

			// Update all options ajax action.
			add_action('wp_ajax_update_response', array($this, 'ajax'));

			// Reset all options ajax action.
			add_action('wp_ajax_reset_options', array($this, 'ajax'));

			// Add new twitter account ajax action
			add_action('wp_ajax_add_new_account', array($this, 'ajax'));

			// Display managed pages ajax action
			add_action('wp_ajax_display_pages', array($this, 'ajax'));

			// Add new account managed pages ajax action
			add_action('wp_ajax_add_pages', array($this, 'ajax'));

			// Add more than one twitter account ajax action
			add_action('wp_ajax_add_new_account_pro', array($this, 'ajax'));

			// Log Out Twitter user ajax action
			add_action('wp_ajax_log_out_user', array($this, 'ajax'));

			// get message queue
			add_action('wp_ajax_get_queue', array($this, 'ajax'));

			//
			add_action("rop_stop_posting", array($this,"clear_delete_type"));

			//start ROP
			add_action('wp_ajax_tweet_old_post_action', array($this, 'ajax'));

			//clear Log messages
			add_action('wp_ajax_rop_clear_log', array($this, 'ajax'));

			//remote trigger cron
			add_action('wp_ajax_remote_trigger', array($this, 'ajax'));
			add_action('wp_ajax_beta_user_trigger', array($this, 'ajax'));

			//sample tweet messages
			add_action('wp_ajax_view_sample_tweet_action', array($this, 'ajax'));

			// Tweet Old Post tweet now action.
			add_action('wp_ajax_tweet_now_action', array($this, 'ajax'));

			add_action('wp_ajax_gettime_action', array($this, 'ajax'));

			//get notice
			add_action('wp_ajax_getNotice_action', array($this, 'ajax'));

			//stop ROP
			add_action('wp_ajax_stop_tweet_old_post', array($this, 'ajax'));

			//custom actions

			add_action("rop_start_posting",array($this,"startPosting"));
			add_action("rop_stop_posting",array($this,"stopPosting"));
			$networks = $this->getAllNetworks();

			foreach($networks as $network){
				add_action($network.'roptweetcron',array($this,"tweetOldPost"));

			}

			//admin_init actions

			add_action('admin_init', array($this,'top_nag_ignore'));
			add_action('admin_init', array($this,'clearOldCron'));

            add_action("rest_api_init", array($this, "rop_endpoint_register"));

			//filters

			add_filter("rop_users_filter",array($this,"rop_users_filter_free"),1,1);

            // Added by Ash/Upwork
            // test action, only to be used for testing
            //if(ROP_IS_TEST) add_action("admin_init", array($this, "doTestAction"));
            // Added by Ash/Upwork

			if(isset($_GET['debug']) ) {
	 			//$this->getNextTweetTime('twitter');
			    //$this->tweetOldPost("twitter"); 	global $CWP_TOP_Core_PRO;
				$this->tweetOldPost("twitter");

				die();
			}

		}

        function rop_endpoint_trigger_schedule() {
            $this->processServerRequest();
            $networks           = $this->getAvailableNetworks();
            $users              = $this->getUsers();
            return new WP_REST_Response(
                array(
                    "networks"  => count($networks),
                    "accounts"  => count($users),
                    "free_version"  => defined("ROP_VERSION") ? ROP_VERSION : false,
                    "pro_version"  => defined("ROP_PRO_VERSION") ? ROP_PRO_VERSION : false ,
                    "started"   => true
                )
            );
        }

        function rop_endpoint_register() {
            register_rest_route(
                ROP_ENDPOINT_SLUG__ . "/v" . ROP_REST_VERSION,
                "/trigger_schedule/",
                array(
                    "methods" => "GET",
                    "callback" => array($this, "rop_endpoint_trigger_schedule"),
                )
            );
        }

        function rop_update_option($name, $value=false) {
            $main           = get_option("rop-settings", array());
            $main[$name]    = $value;
            update_option("rop-settings", $main);
        }

        function rop_get_option($name, $default=false) {
            $main       = get_option("rop-settings", array());
            if ($main && array_key_exists($name, $main)) {
                return $main[$name];
            }
            return $default;
        }

        function checkAjaxCapability() {
            $cap        = false;
			if (!current_user_can('manage_options') && $this->top_check_user_role( 'Administrator' )) {
				$cap    = true;
			} else {
				$cap    = current_user_can('manage_options');
            }
            return $cap;
        }

        function ajax() {
            if (!$this->checkAjaxCapability()) wp_die();
            check_ajax_referer("cwp-top-" . ROP_VERSION, "security");

            switch ($_POST["action"]) {
                case 'update_response':
                    $this->updateAllOptions();
                    break;
                case 'reset_options':
                    $this->resetAllOptions();
                    break;
                case 'add_new_account':
                    $this->addNewAccount();
                    break;
                case 'display_pages':
                    $this->displayPages();
                    break;
                case 'add_pages':
                    $this->addPages();
                    break;
                case 'add_new_account_pro':
                    $this->addNewAccountPro();
                    break;
                case 'log_out_user':
                    $this->logOutUser();
                    break;
                case 'tweet_old_post_action':
                    $this->startTweetOldPost();
                    break;
                case 'rop_clear_log':
                    $this->clearLog();
                    break;
                case 'remote_trigger':
                    $this->remoteTrigger(isset($_POST["state"]) ? $_POST["state"] : null);
                    break;
                case 'beta_user_trigger':
                    $this->betaUserTrigger();
                    break;
                case 'view_sample_tweet_action':
                    $this->viewSampleTweet();
                    break;
                case 'tweet_now_action':
                    $this->tweetNow();
                    break;
                case 'gettime_action':
                    $this->echoTime();
                    break;
                case 'getNotice_action':
                    $this->getNotice();
                    break;
                case 'stop_tweet_old_post':
                    $this->stopTweetOldPost();
                    break;
                case 'get_queue':
                    $this->getQueue();
                    break;

            }
            wp_die();
        }

        // Added by Ash/Upwork
        private function getQueue() {
            $available  = $this->getAvailableNetworks();
            if(empty($available)) $available[] = "twitter";

            ob_start();
            include_once ROPPLUGINPATH . "/inc/scrap-advancedscheduling.php";
            $html   = ob_get_clean();
            wp_send_json_success( array("html" => $html) );
        }

        private function processServerRequest(){
            if(
                !get_option("cwp_rop_remote_trigger", false)
                ||
                get_option("cwp_topnew_active_status", 'no') === 'no'
            ) return;

            $crons      = _get_cron_array();
            $this->clearScheduledTweets();

            foreach($crons as $time => $cron){
                foreach($cron as $hook => $dings){
                    if(strpos($hook, "roptweetcron") === FALSE) continue;

                    $network    = trim(str_replace("roptweetcron", "", $hook));
                    if($time > $this->getTime()){
                      //  echo "FUTURE $hook for $time (current time is " . $this->getTime() . ") <br>";
                        wp_schedule_single_event($time, $network.'roptweetcron', array($network));
                        continue;
                    }
                    
                    //echo "NOW $hook for $network for $time (current time is " . $this->getTime() . ") <br>";

                    foreach($dings as $hash => $data){
                        do_action($hook, $network);
                    }
                }
            }
        }
        // Added by Ash/Upwork

		public function rop_users_filter_free($users){

			if(!is_array($users)) $users = array();
			foreach($users as $k=>$user){
				if(!isset($user['service'])) {
					if ( strpos( $user['oauth_user_details']->profile_image_url, 'twimg' ) ) {

						$users[ $k ]['service'] = 'twitter';
					}
					if ( strpos( $user['oauth_user_details']->profile_image_url, 'facebook' ) ) {

						$users[ $k ]['service'] = 'facebook';
					}
				}
			}

			return $users;
		}

		// status will be on/off when its being toggled and null when the scheduled JS is calling
		public function remoteTrigger( $status = null ) {
			if ( is_null( $status ) && get_option( "cwp_rop_remote_trigger", 'off' ) == "off" ) {
				return;
			}
			if ( ! is_null( $status ) ) {
				update_option( "cwp_rop_remote_trigger", $status );
				wp_send_json_success( array() );
				return;
			}
			// when status is "on" we will call the api no matter the time
			if ( ! is_null( $status ) ) {
				$time_to_shake = $this->rop_get_option( "api-handshake-time", 0 );
				$time_to_shake = time() > $time_to_shake;
			} else {
				$time_to_shake = true;
			}
			if ( $time_to_shake ) {
				// call the api
				$rest_url  = rest_url( ROP_ENDPOINT_SLUG__ . "/v" . ROP_REST_VERSION . "/trigger_schedule/" );
				$hresponse = wp_remote_post( ROP_REMOTE_CHECK_URL, array(
					'method'      => 'POST',
					'timeout'     => 3,
					'redirection' => 5,
					'headers'     => array( "X-ThemeIsle-Event" => "add_ping" ),
					'body'        => array(
						'site' => urlencode( $rest_url )
					),
				) );
				$handshake = "no";
				if ( is_array( $hresponse ) ) {
					$body = $hresponse['body']; // use the content
					$body = json_decode( $body );
					if ( isset( $body->data ) ) {
						if ( $body->data->handshake ) {
							$handshake = $body->data->handshake;
						}
					}
				}
				$failed = $handshake === "no";
				$this->rop_update_option( "api-handshake-response", $handshake );
				if ( $failed ) {
					$this->rop_update_option( "api-handshake-time", time() + 24 * HOUR_IN_SECONDS );
					if ( $status === "on" ) {
						update_option( "cwp_rop_remote_trigger", "off" );
					}
					self::addNotice( __( "The remote check can not access your website. You need to whitelist this ip 107.170.26.57 in order for the schedule to work properly", "tweet-old-post" ), "error" );
				}
			}
			if ( ! is_null( $status ) ) {
				die();
			}
		}

		public function betaUserTrigger($status = ""){
			if(!is_admin()) return false;
			$state = $_POST["state"];
			if(!empty($status)) $state = $status;

			if(!empty($state) &&( $state == "on" || $state == "off")){

				update_option("cwp_rop_beta_user",$state);
				$this->sendBetaUserTrigger($state);

			}

			die();
		}


		public function sendBetaUserTrigger($state){

			global $cwp_rop_beta_trigger_url;
			$state = ($state == "on") ? "yes" : "no";

			wp_remote_post( $cwp_rop_beta_trigger_url, array(
					'method' => 'POST',
					'timeout' => 1,
					'redirection' => 5,
					'httpversion' => '1.0',
					'blocking' => true,
					'headers' => array(),
					'body' => array( 'email' =>  get_bloginfo('admin_email'), 'status' => $state ),
					'cookies' => array()
				)
			);

		}
		public function loadAllScriptsAndStyles()
		{
			global $cwp_top_settings; // Global Tweet Old Post Settings

			// Enqueue and register all scripts on plugin's page
			if(isset($_GET['page'])) {
				if ($_GET['page'] == $cwp_top_settings['slug'] || $_GET['page'] == "ExcludePosts") {

                    // Added by Ash/Upwork
                    wp_enqueue_script("jquery");
                    wp_enqueue_script("jquery-ui-button");
					wp_register_script("jquery.chosen", ROP_ROOT . "js/chosen.jquery.min.js", array("jquery"), time(), true);
					wp_enqueue_script("jquery.chosen");
					wp_register_style("jquery.chosen", ROP_ROOT . "css/chosen.min.css", array(), time());
					wp_enqueue_style("jquery.chosen");
                    wp_register_style("jquery.ui-smoothness", "//code.jquery.com/ui/1.11.4/themes/smoothness/jquery-ui.css");
                    wp_enqueue_style("jquery.ui-smoothness");
                    // Added by Ash/Upwork

                    // Enqueue and Register Main CSS File
					wp_register_style( 'cwp_top_stylesheet', ROPCSSFILE, array("jquery.chosen"), time());
					wp_enqueue_style( 'cwp_top_stylesheet' );

					// Register Main JS File
					wp_enqueue_script( 'cwp_top_js_countdown', ROPJSCOUNTDOWN, array(), time(), true );
					wp_enqueue_script( 'cwp_top_javascript', ROPJSFILE, array(), time(), true );
					wp_localize_script( 'cwp_top_javascript', 'cwp_top_ajaxload', array(
                        'ajaxurl'   => admin_url( 'admin-ajax.php' ),
                        'ajaxnonce' => wp_create_nonce("cwp-top-" . ROP_VERSION),
                    ) );
				}
			}

		}

		function top_check_user_role( $role, $user_id = null ) {

			if ( is_numeric( $user_id ) )
				$user = get_userdata( $user_id );
			else
				$user = wp_get_current_user();

			if ( empty( $user ) )
				return false;

			return in_array( $role, (array) $user->roles );
		}

		public function addAdminMenuPage()
		{
			global $cwp_top_settings; // Global Tweet Old Post Settings
			if (!current_user_can('manage_options') && $this->top_check_user_role( 'Administrator' ))
				$cap = 1;
			else
				$cap='manage_options';
			add_menu_page($cwp_top_settings['name'], $cwp_top_settings['name'], $cap, $cwp_top_settings['slug'], array($this, 'loadMainView'), '','99.87514');
			add_submenu_page($cwp_top_settings['slug'], __('Exclude Posts','tweet-old-post'), __('Exclude Posts','tweet-old-post'), 'manage_options', 'ExcludePosts', 'rop_exclude_posts');

			add_submenu_page($cwp_top_settings['slug'], __('System Info','tweet-old-post'), __('System Info','tweet-old-post'), 'manage_options', 'SystemInfo', array($this,'system_info'));

		}

		public function getFormatFields(){

			$all = $this->getAllNetworks(true);
			global $cwp_format_fields;
			$networks_fields = array();

			foreach($all as $network=>$pro){
				if(CWP_TOP_PRO == $pro) {
					$networks_fields[ $network ] = $cwp_format_fields;
				}else{
					foreach($cwp_format_fields as $k=>$v){
						$v[ "available_pro"] = "yes";
						$networks_fields[ $network][$k] = $v;
					}

				}
			}
			return $networks_fields;
		}
		public function getGeneralFields(){
			global $cwp_top_fields;

			return $cwp_top_fields;

		}
		public function loadMainView()
		{
			$cwp_top_fields = $this->getGeneralFields();
			foreach ($cwp_top_fields as $field => $value) {
				$cwp_top_fields[$field]['option_value'] = get_option($cwp_top_fields[$field]['option']);
			}
			$all_networks  = $this->getAllNetworks();
			$format_fields  = $this->getFormatFields();
			$options = get_option("top_opt_post_formats");
			global $cwp_top_global_schedule;
			$cwp_top_global_schedule = $this->getSchedule();
			if($options === false ) $options = array();
			if($cwp_top_global_schedule === false ) $cwp_top_global_schedule = array();

			$schedule = $cwp_top_fields["interval"]['option_value'];
			foreach ($format_fields as $network_name => $network_details) {
				foreach ($network_details as $field => $vvalue) {
					$value = isset($options[$network_name."_".$format_fields[$network_name][$field]['option']]) ? $options[$network_name."_".$format_fields[$network_name][$field]['option']] : false ;
					if($value === false) {
						$value = get_option($format_fields[$network_name][$field]['option']);
						if($value === false) {
							if(isset($vvalue['default_value']))
								$value =  $vvalue['default_value'];
						}
					}
					$format_fields[$network_name][$field]['option_value'] = $value;
				}
				if(!isset($cwp_top_global_schedule[$network_name."_schedule_type_selected"])){
					$cwp_top_global_schedule[$network_name."_schedule_type_selected"] = "each";
					$cwp_top_global_schedule[$network_name."_top_opt_interval"] = $schedule;
				}
			}
			require_once(plugin_dir_path( __FILE__ )."view.php");
		}

		// Shortens the url.
		public static function shortenURL($url, $service, $id, $formats, $network, $showPlaceholder=false) {
            // Added by Ash/Upwork
            if ($showPlaceholder) {
                return "[$service]";
            }
            // Added by Ash/Upwork
            if (ROP_IS_TEST) {
                $url = "http://www.google.com/" . time();
            }

            $shortURL   = trim($url);
			$url        = urlencode($shortURL);
            switch ($service) {
                case "rviv.ly":
                    $website        = get_bloginfo("url");
                    $response       = self::callAPI(
                        ROP_YOURLS_SITE,
                        array("method" => "post"),
                        array("action" => "shorturl", "format" => "simple", "signature" => substr(md5($website . md5(ROP_YOURLS_SALT)), 0, 10), "url" => $url, "website" => base64_encode($website)),
                        null
                    );

                    if (intval($response["error"]) == 200) {
                        $shortURL   = $response["response"];
                    }
                    break;
                case "bit.ly":
                    $key            = trim(isset($formats[$network."_"."top_opt_bitly_key"]) ? $formats[$network."_"."top_opt_bitly_key"] : get_option( 'top_opt_bitly_key' ));
                    $user           = trim(isset($formats[$network."_"."top_opt_bitly_user"]) ? $formats[$network."_"."top_opt_bitly_user"] : get_option( 'top_opt_bitly_user' ));
                    $response       = self::callAPI(
                        "http://api.bit.ly/v3/shorten",
                        array("method" => "get"),
                        array("longUrl" => $url, "format" => "txt", "login" => $user, "apiKey" => $key),
                        null
                    );

                    if (intval($response["error"]) == 200) {
                        $shortURL   = $response["response"];
                    }
                    break;
			    case "shorte.st":
                    $key            = trim(isset($formats[$network."_"."top_opt_shortest_key"]) ? $formats[$network."_"."top_opt_shortest_key"] : get_option( 'top_opt_shortest_key' ));
                    $response       = self::callAPI(
                        "https://api.shorte.st/v1/data/url",
                        array("method" => "put", "json" => true),
                        array("urlToShorten" => $url),
                        array("public-api-token" => $key)
                    );

                    if (intval($response["error"]) == 200 && $response["response"]["status"] == "ok") {
                        $shortURL   = $response["response"]["shortenedUrl"];
                    }
                    break;
			    case "goo.gl":
                    $key            = trim(isset($formats[$network."_"."top_opt_googl_key"]) ? $formats[$network."_"."top_opt_googl_key"] : get_option( 'top_opt_googl_key' ));
                    $response       = self::callAPI(
                        "https://www.googleapis.com/urlshortener/v1/url?key=" . $key,
                        array("method" => "json", "json" => true),
                        array("longUrl" => urldecode($url)),
                        array("Content-Type" => "application/json")
                    );

                    if (intval($response["error"]) == 200 && !isset($response["response"]["error"])) {
                        $shortURL   = $response["response"]["id"];
                    }
                    break;
			    case "ow.ly":
                    $key            = trim(isset($formats[$network."_"."top_opt_owly_key"]) ? $formats[$network."_"."top_opt_owly_key"] : get_option( 'top_opt_owly_key' ));
                    $response       = self::callAPI(
                        "http://ow.ly/api/1.1/url/shorten",
                        array("method" => "get", "json" => true),
                        array("longUrl" => $url, "apiKey" => $key),
                        null
                    );

                    if (intval($response["error"]) == 200 && !isset($response["response"]["error"])) {
                        $shortURL   = $response["response"]["results"]["shortUrl"];
                    }
                    break;
			    case "is.gd":
                    $response       = self::callAPI(
                        "https://is.gd/api.php",
                        array("method" => "get"),
                        array("longurl" => $url),
                        null
                    );

                    if (intval($response["error"]) == 200) {
                        $shortURL   = $response["response"];
                    }
                    break;
			    default:
				    $shortURL = wp_get_shortlink($id);
                    break;
			}
			if($shortURL != ' 400 '&& $shortURL!="500" && $shortURL!="0") {
				return $shortURL;
			}
			else
				update_option('cwp_topnew_notice','Looks like is an error with your url shortner');
		}

		public function rop_load_dashboard_icon()
		{
			wp_register_style( 'rop_custom_dashboard_icon', ROPCUSTOMDASHBOARDICON, false, ROP_VERSION );
		    wp_enqueue_style( 'rop_custom_dashboard_icon' );

		}

        private static function callAPI($url, $props=array(), $params=array(), $headers=array())
        {
            $body       = null;
            $error      = null;
            if ($props && isset($props["method"]) && $props["method"] === "get") {
                $url    .= "?";
                foreach ($params as $k=>$v) {
                    $url    .= "$k=$v&";
                }
            }
            $conn       = curl_init($url);

            curl_setopt($conn, CURLOPT_SSL_VERIFYPEER, false);
            curl_setopt($conn, CURLOPT_FRESH_CONNECT, true);
            curl_setopt($conn, CURLOPT_RETURNTRANSFER, 1);
            curl_setopt($conn, CURLOPT_FOLLOWLOCATION, 1);
            curl_setopt($conn, CURLOPT_HEADER, 0);
            curl_setopt($conn, CURLOPT_NOSIGNAL, 1);

            $header     = array();
            if ($headers) {
                foreach ($headers as $key=>$val) {
                    $header[]   = "$key: $val";
                }
                curl_setopt($conn, CURLOPT_HTTPHEADER, $header);
            }

            if ($props && isset($props["method"])) {
                if (in_array($props["method"], array("post", "put"))) {
                    curl_setopt($conn, CURLOPT_POSTFIELDS, urldecode(http_build_query($params)));
                }

                if ($props["method"] === "json") {
                    curl_setopt($conn, CURLOPT_POSTFIELDS, json_encode($params));
                }

                if (!in_array($props["method"], array("get", "post", "json"))) {
                    curl_setopt($conn, CURLOPT_CUSTOMREQUEST, strtoupper($props["method"]));
                }
            }

            try {
                $body           = curl_exec($conn);
                $error          = curl_getinfo($conn, CURLINFO_HTTP_CODE);
            } catch (Exception $e) {
                self::writeDebug("Exception " . $e->getMessage());
            }

            if (curl_errno($conn)) {
                self::addNotice("Error for request: " . $url . " : ". curl_error($conn), 'error');
                self::writeDebug("curl_errno ".curl_error($conn));
            }

            curl_close($conn);

            if ($props && isset($props["json"]) && $props["json"]) {
                $body   = json_decode($body, true);
            }

            $array          = array(
                "response"  => $body,
                "error"     => $error,
            );

            self::writeDebug("Calling ". $url. " with headers = " . print_r($header, true) . ", fields = " . print_r($params, true) . " returning raw response " . print_r($body,true) . " and finally returning " . print_r($array,true));

            return $array;
        }

        public static function writeDebug($msg)
        {
            if (ROP_IS_DEBUG) file_put_contents(ROPPLUGINPATH . "/tmp/log.log", date("F j, Y H:i:s", current_time("timestamp")) . " - " . $msg."\n", FILE_APPEND);
        }


	}
}

if(class_exists('CWP_TOP_Core')) {
	$CWP_TOP_Core = new CWP_TOP_Core;
}
