<?php
/*
  Plugin Name: TieLabs Page Widgets
  Plugin URI:
  Description: Allow users to customize Widgets per page.
  Author:
  Version: 1.0.0
  Author URI:
 */


 if( ! class_exists( 'JANNAH_BUILDER_WIDGETS' )){

 	class JANNAH_BUILDER_WIDGETS{



 		/**
 		 * __construct
 		 *
 		 * Class constructor where we will call our filter and action hooks.
 		 */
 		function __construct(){

		  # Hooks ----------
		  add_action( 'admin_print_scripts',      array( $this, '_print_scripts'          ));
		  add_action( 'widgets_admin_page',       array( $this, '_show_sections_sidebars' ));
			add_action( 'deleted_post',             array( $this, '_delete_widget_options'  ));
			add_action( 'save_post',                array( $this, '_save_widget_options'    ));
			add_action( 'wp_print_scripts',         array( $this, '_save_widgets_resources' ));
			add_action( 'admin_footer-post.php',    array( $this, '_page_footer' ), 99);

		  # AJAX Hooks ----------
		  add_action( 'wp_ajax_pw-widgets-order', array( $this, '_ajax_widgets_order' ));
		  add_action( 'wp_ajax_pw-save-widget',   array( $this, '_ajax_save_widget'   ));

 		}



 		/**
 		 * _print_scripts
 		 *
 		 * Print the widgets JS for the page builder
 		 *
 		 */
		function _print_scripts(){
	 		$screen = get_current_screen();

	 		if( ! empty( $screen->base ) && $screen->base == 'post' && $screen->id == 'page' ){

	 			wp_enqueue_script(
          'tie-builder-widgets',
          JANNAH_TEMPLATE_URL .'/framework/admin/assets/page-widgets.js',
          array(
            'jquery',
            'jquery-ui-sortable',
            'jquery-ui-draggable',
            'jquery-ui-droppable'
          ),
          JANNAH_DB_VERSION,
          false
        );

        //wp_enqueue_script('admin-widgets');


	 			# The Widgets resources ----------
        $widgets_resources = get_option( 'tie_widgets_resources' );

				if( $widgets_resources && is_array( $widgets_resources ) ){

					# Scripts ----------
					global $wp_scripts;

					if( ! empty( $widgets_resources['scripts'] ) && is_array( $widgets_resources['scripts'] )){
						foreach ( $widgets_resources['scripts'] as $script ){
							if( ! in_array( $script['handle'], $wp_scripts->queue ) && $script['handle'] != 'admin-widgets' ){
								wp_enqueue_script( $script['handle'], $script['src'], $script['deps'], $script['ver'] );

								if( ! empty( $script['data'] ) ){
									echo '<!-- Hi Fou2sh :) /-->';
									echo "<script type='text/javascript'>\n"; // CDATA and type='text/javascript' is not needed for HTML 5
									echo "/* <![CDATA[ */\n";
									echo ( $script['data'] ). "\n";
									echo "/* ]]> */\n";
									echo "</script>\n";
								}

							}
						}
					}

					# Styles ----------
					global $wp_styles;

					if( ! empty( $widgets_resources['styles'] ) && is_array( $widgets_resources['styles'] )){
						foreach ( $widgets_resources['styles'] as $styles ){
							if( ! in_array( $styles['handle'] , $wp_styles->queue ) ){
								wp_enqueue_style( $styles['handle'], $styles['src'], $styles['deps'], $styles['ver'] );
							}
						}
					}
				}

				do_action( 'admin_print_scripts-widgets.php' );
	 		}
		}



 		/**
 		 * _page_footer
 		 *
 		 * JS in the page Footer
 		 *
 		 */
		function _page_footer(){

			do_action( 'admin_footer-widgets.php' );
		}



		/**
 		 * _get_post_id
 		 *
 		 * Get the Post ID
 		 *
 		 */
		function _get_post_id(){

			$post = get_post();

			if( ! empty( $post->ID ) ){
				$post_id = $post->ID;
			}

			elseif( ! empty( $_GET['post'] ) ){
				$post_id = $_GET['post'];
			}

			return isset( $post_id ) ? $post_id : false;
		}



		/**
 		 * _ajax_widgets_order
 		 *
 		 * Save the order of the widgets
 		 *
 		 */
		function _ajax_widgets_order() {
			check_ajax_referer( 'save-sidebar-widgets', 'savewidgets' );

			if( ! current_user_can('edit_posts') || ! $_POST['post_id'] ){
				die('-1');
			}

			$post_id = stripslashes($_POST['post_id']);

			unset($_POST['savewidgets'], $_POST['action']);

			// save widgets order for all sidebars
			if( is_array( $_POST['sidebars'] )){
				$sidebars = array();

				foreach ( $_POST['sidebars'] as $key => $val ){
					$sb = array();

					if( ! empty( $val ) ){
						$val = explode(',', $val);

						foreach ($val as $k => $v) {

							if (strpos($v, 'widget-') === false){
								continue;
							}

							$sb[$k] = substr($v, strpos($v, '_') + 1);
						}
					}

					$sidebars[$key] = $sb;
				}

				if (! empty( $post_id )){
					$this->_set_sidebars_widgets( $sidebars, $post_id );
				}

				die('1');
			}

			die('-1');
		}



		/**
		 * _ajax_save_widget
		 *
		 * Save the Widget settings
		 *
		 */
		function _ajax_save_widget(){

			global $wp_registered_widget_controls, $wp_registered_widgets, $wp_registered_widget_updates;

			check_ajax_referer('save-sidebar-widgets', 'savewidgets');

			if ( ! current_user_can( 'edit_posts' ) || ! isset( $_POST['id_base'] ) || empty( $_POST['post_id'] ) ){
				die('-1');
			}

			$post_id = stripslashes($_POST['post_id']);

			unset( $_POST['savewidgets'], $_POST['action'] );

			do_action('load-widgets.php');
			do_action('widgets.php');
			do_action('sidebar_admin_setup');
			do_action('w3tc_pgcache_flush');

			$id_base      = $_POST['id_base'];
			$widget_id    = $_POST['widget-id'];
			$sidebar_id   = $_POST['sidebar'];
			$multi_number = ! empty( $_POST['multi_number']) ? (int) $_POST['multi_number'] : 0;
			$settings     = isset( $_POST['widget-' . $id_base]) && is_array($_POST['widget-' . $id_base]) ? $_POST['widget-' . $id_base] : false;
			$error        = '<p>' . esc_html__( 'An error has occured. Please reload the page and try again.', 'jannah' ) . '</p>';

			$sidebars = wp_get_sidebars_widgets();
			$sidebar  = isset( $sidebars[ $sidebar_id ] ) ? $sidebars[ $sidebar_id ] : array();

			// delete
			if ( isset($_POST['delete_widget']) && $_POST['delete_widget'] ){

				if ( ! isset($wp_registered_widgets[$widget_id]) ){
					die($error);
				}

				$sidebar = array_diff( $sidebar, array($widget_id) );
				$_POST   = array('sidebar' => $sidebar_id, 'widget-' . $id_base => array(), 'the-widget-id' => $widget_id, 'delete_widget' => '1');
			}

			elseif ($settings && preg_match('/__i__|%i%/', key($settings))) {
				if (!$multi_number){
					die($error);
				}

				$_POST['widget-' . $id_base] = array($multi_number => array_shift($settings));
				$widget_id = $id_base . '-' . $multi_number;
				$sidebar[] = $widget_id;
			}


			$_POST['widget-id'] = $sidebar;

			if (!isset($_POST['delete_widget']) || !$_POST['delete_widget']) {

				foreach ((array) $wp_registered_widget_updates as $name => $control) {

					if ( $name == $id_base ){

						if ( ! is_callable( $control['callback'] ) ){
							continue;
						}

						// do some hack
						$number = $multi_number > 0 ? $multi_number : (int) $_POST['widget_number'];
						if (is_object($control['callback'][0])) {
							$all_instance = $control['callback'][0]->get_settings();
						}

						ob_start();
						call_user_func_array($control['callback'], $control['params']);
						ob_end_clean();

						break;
					}
				}
			}

			if (isset($_POST['delete_widget']) && $_POST['delete_widget']) {
				$sidebars[$sidebar_id] = $sidebar;
				if (!empty($post_id)) {
					$this->_set_sidebars_widgets($sidebars, $post_id);
				}

				die();
			}

			if ( ! empty( $_POST['add_new'] )){
				die();
			}

			if ($form = $wp_registered_widget_controls[$widget_id]){
				call_user_func_array($form['callback'], $form['params']);
      }

			//	print 'Updated ajax save widget.';

			if ( function_exists( 'w3tc_pgcache_flush' ) ) {
				w3tc_pgcache_flush();
			}

			die();
		}



		/**
		 * _set_sidebars_widgets
		 *
		 * Update the Widget settings
		 *
		 */
		function _set_sidebars_widgets( $_sidebars_widgets = array(), $post_id ){

      if ( empty( $post_id ) ) {
        return;
      }

      $sidebars_widgets = get_option('sidebars_widgets');

      if( is_array( $sidebars_widgets ) && isset( $sidebars_widgets['array_version'] )){
        unset($sidebars_widgets['array_version']);
      }

      $sidebars_widgets = array_merge( $sidebars_widgets, $_sidebars_widgets );

      // Update the global Widgets options
      wp_set_sidebars_widgets( $sidebars_widgets );


      // Save the sections ID to remove these sidebars when removing the post.
      // And register these custom sidebars.
      $custom_widgets = get_option( 'tie_sidebars_widgets', array() );
      $custom_widgets[ $post_id ] = $_sidebars_widgets;
      update_option( 'tie_sidebars_widgets', $custom_widgets, 'no' );
		}



		/**
		 * _delete_widget_options
		 *
		 */
		function _delete_widget_options( $post_id ){

      $custom_widgets   = get_option( 'tie_sidebars_widgets', array() );
      $sidebars_widgets = get_option( 'sidebars_widgets' );

      if( ! empty( $custom_widgets[ $post_id ] ) && is_array( $custom_widgets[ $post_id ] )){

        foreach ( $custom_widgets[ $post_id ] as $section => $widgets ){
          unset( $sidebars_widgets[ $section ] );
        }
      }

      unset( $custom_widgets[ $post_id ] );
      update_option( 'tie_sidebars_widgets', $custom_widgets );

      wp_set_sidebars_widgets( $sidebars_widgets );
		}



		/**
		 * _save_widget_options
		 *
		 */
		function _save_widget_options( $post_id ){

      // Get the exists sidebars
      $sidebars_array = array();

  		if( ! empty( $_POST['tie_home_cats'] ) && is_array( $_POST['tie_home_cats']  ) ){

        $builder_data = $_POST['tie_home_cats'];
        if( ! empty( $builder_data ) && is_array( $builder_data ) ){
          foreach( $builder_data as $section ){
            if( ! empty( $section['settings']['sidebar_position'] ) && $section['settings']['sidebar_position'] != 'full' ){
              $sidebars_array[] = $section['settings']['section_id'];
            }
          }
        }
      }

      // Post Sidebars ------
      $custom_widgets = get_option( 'tie_sidebars_widgets', array() );
      if( ! empty( $custom_widgets[ $post_id ] ) && is_array( $custom_widgets[ $post_id ] )){
        foreach ( $custom_widgets[ $post_id ] as $section => $widgets ){
          if( ! in_array( $section, $sidebars_array ) ){
            unset( $custom_widgets[ $post_id ][ $section ] );
          }
        }
      }
      update_option( 'tie_sidebars_widgets', $custom_widgets );

      // Global Widgets ----------
      $sidebars_widgets = get_option( 'sidebars_widgets', array() );

			if( empty( $sidebars_widgets ) || ! is_array( $sidebars_widgets ) ){
				$sidebars_widgets = array();
			}

			$sidebar_keys = array_keys( $sidebars_widgets );
      $sections_sidebars = preg_grep( "/^tiepost-$post_id-section-\w*$/", $sidebar_keys );

      foreach ( $sections_sidebars as $section ){
        if( ! in_array( $section, $sidebars_array ) ){
          unset( $sidebars_widgets[ $section ] );
        }
      }

      wp_set_sidebars_widgets( $sidebars_widgets );
		}



		/**
		 * _show_sections_sidebars
		 *
		 */
		function _show_sections_sidebars(){
      echo "
        <div id=\"tie-show-sections-sidebars-wrap\">
          <h2>". esc_html__( 'TieLabs Page Builder widgets areas', 'jannah' )."</h2>
          <div>
            <input id=\"tie-show-sections-sidebars\" class=\"tie-js-switch\" type=\"checkbox\" value=\"true\">
          </div>
        </div>
      ";
    }



		/**
		 * _save_widgets_resources
		 * We need to get the all Js files of the Widgets page and load them in the Pages
		 *  Edit Page to prevent any Js issues may caused by the custom Plugin widgets.
     * We need a better Idea :)
		 */
		function _save_widgets_resources() {

			$current_screen = get_current_screen();

			$result = array();
			$result['scripts'] = array();
			$result['styles']  = array();

			if( ! empty( $current_screen ) && $current_screen->id == 'widgets' ){

				// Debug
				//echo ' ==========================| Yes you are here :) |==========================';

				global $wp_scripts;
				foreach( $wp_scripts->queue as $script ){

					$data = ! empty( $wp_scripts->registered[$script]->extra['data'] ) ? $wp_scripts->registered[$script]->extra['data'] : '';

					$result['scripts'][] =  array(
						'src'     => $wp_scripts->registered[$script]->src,
						'handle'  => $wp_scripts->registered[$script]->handle,
						'deps'    => $wp_scripts->registered[$script]->deps,
						'ver'     => $wp_scripts->registered[$script]->ver,
						'data'    => $data,
					);
				}

				global $wp_styles;
				foreach( $wp_styles->queue as $script ){
					$result['styles'][] =  array(
						'src'     => $wp_styles->registered[$script]->src,
						'handle'  => $wp_styles->registered[$script]->handle,
						'deps'    => $wp_styles->registered[$script]->deps,
						'ver'     => $wp_styles->registered[$script]->ver,
					);
				}

				update_option( 'tie_widgets_resources', $result );
			}
		}


 	}


 	# Instantiate the class ----------
 	new JANNAH_BUILDER_WIDGETS();
 }




function jannah_builder_widgets( $sections = array() ) {
	global $wp_registered_widgets, $sidebars_widgets;

	$sidebars_widgets = wp_get_sidebars_widgets();
	if ( empty( $sidebars_widgets ) ){
		$sidebars_widgets = wp_get_widget_defaults();
	}


	// include widgets function
	if ( ! function_exists('wp_list_widgets') ){
		require_once(ABSPATH . '/wp-admin/includes/widgets.php');
	}

	?>

	<form style="display: none;" action="" method="post"></form>

	<div id="tie-sidebars-customize" class="tie-popup-block tie-popup-window">

		<div class="tie-builder-item-top-container">
			<h2><?php esc_html_e( 'Manage Widgets', 'jannah' ) ?></h2>
			<a class="tie-primary-button button button-primary button-hero tie-edit-block-done" href="#"><?php esc_html_e( 'Done', 'jannah' ) ?></a>
		</div>

    <div class="customize-widgets-container">

      <div id="section-sidebar-options">
        <?php

          if( ! empty( $sections ) && is_array( $sections ) ){

            $section_number = 1;
            foreach( $sections as $section ){

              $section_settings = wp_parse_args( $section['settings'], array(
                'predefined_sidebar' => '',
                'sidebar_id'         => '',
              ));

              jannah_get_section_sidebar_options( $section_settings['section_id'], $section_number, $section_settings );

              $section_number++;
            }
          }

        ?>
      </div>

  		<input type="hidden" name="pw-sidebar-customize" value="0" />

      <div id="custom-widgtes-settings">
    		<div class="widget-liquid-left">
    			<div id="widgets-left">
    				<div id="available-widgets" class="widgets-holder-wrap">
    					<div class="sidebar-name">
    						<div class="sidebar-name-arrow"><br /></div>
    						<h3><?php esc_html__('Available Widgets', 'jannah'); ?> <span id="removing-widget"><?php esc_html__('Deactivate', 'jannah'); ?> <span></span></span></h3>
    					</div>
    					<div class="widget-holder">
    						<p class="description"><?php esc_html__('Drag widgets from here to a sidebar on the right to activate them. Drag widgets back here to deactivate them and delete their settings.', 'jannah'); ?></p>
    						<div id="widget-list">
    							<?php wp_list_widgets(); ?>
    						</div>
    						<br class='clear' />
    					</div>
    					<br class="clear" />
    				</div>
    			</div>
    		</div>

    		<div class="widget-liquid-right">
    			<div id="widgets-right">

    				<?php
              if( ! empty( $sections ) && is_array( $sections ) ){
      					foreach ( $sections as $section ){
                  $section_id = $section['settings']['section_id'];

                  echo '<div id="wrap-'. $section_id .'" class="widgets-holder-wrap">';
                    wp_list_widget_controls( $section_id, esc_html__('Section Widgets Area', 'jannah' ) );
                  echo '</div>';
      					}
              }
    				?>

    			</div>
    		</div>
      </div>

    </div> <!-- .customize-widgets-container /-->

		<form action="" method="post">
			<?php wp_nonce_field('save-sidebar-widgets', '_wpnonce_widgets', false); ?>
		</form>
		<br class="clear" />

	</div><!-- End #pw-sidebars-customize -->

	<div class="widgets-chooser">
		<ul class="widgets-chooser-sidebars"></ul>
		<div class="widgets-chooser-actions">
			<button class="button-secondary"><?php esc_html_e( 'Cancel', 'jannah'  ); ?></button>
			<button class="button-primary"><?php esc_html_e( 'Add Widget', 'jannah'  ); ?></button>
		</div>
	</div>
	<?php
}
