<?php
/**
 * Your Inspiration Themes Panel
 *
 * @author Your Inspiration Themes
 * @version 0.1.0
 */

if ( ! class_exists( 'YITH_Panel' ) ) {
	/*
	 * The class manages the theme options for the Plugin
	 */

	class YITH_Panel {

		/**
		 * Class version
		 *
		 * @var string
		 */
		public $version = '0.1.0';

		/**
		 * Parameters for add_submenu_page
		 *
		 *  add_submenu_page(
		 *      'themes.php',        // The file name of a standard WordPress admin page
		 *      'Theme Options',    // The text to be displayed in the title tags of the page when the menu is selected
		 *      'Theme Options',    // The text to be used for the menu
		 *      'administrator',    // The capability (or role) required for this menu to be displayed to the user.
		 *      'theme-options',    // The slug name to refer to this menu by (should be unique for this menu).
		 *      'theme_options_display_page' // The function to be called to output the content for this page.
		 *  );
		 *
		 * @access protected
		 */
		protected $_submenu = array();

		/**
		 * Initial Options definition:
		 *   'tab' => array(
		 *      'label',
		 *      'sections' => array(
		 *          'fields' => array(
		 *             'option1',
		 *             'option2',
		 *              ...
		 *          )
		 *      )
		 *   )
		 *
		 * @var array
		 * @access public
		 */
		public $options = array();

		/**
		 * Options group name
		 *
		 * @var string
		 * @access public
		 */
		public $option_group = 'panel_group';

		/**
		 * Option name
		 *
		 * @var string
		 * @access public
		 */
		public $option_name = 'panel_options';

		/**
		 * Banner links
		 *
		 * @var string
		 * @access public
		 */
		public $banner_url = 'http://yithemes.com/?ap_id=plugin';
		public $banner_img = '';

		/**
		 * Constructor
		 *
		 * @param array $submenu Parameters for add_submenu_page
		 * @param array $options Array of plugin options
		 *
		 */
		public function __construct( $submenu, $options, $banner = array(), $option_group = false, $option_name = false ) {
			$this->_submenu = apply_filters( 'yith_panel_submenu', $submenu );
			$this->options  = apply_filters( 'yith_panel_options', $options );

			if ( ! empty( $banner ) ) {
				$this->banner_url = $banner['url'];
				$this->banner_img = $banner['img'];
			}

			if ( $option_group ) {
				$this->option_group = $option_group;
			}

			if ( $option_name ) {
				$this->option_name = $option_name;
			}

			//add new menu item
			//register new settings option group
			//include js and css files
			//print browser
			add_action( 'admin_menu', array( $this, 'add_submenu_page' ) );
			add_action( 'admin_init', array( $this, 'panel_register_setting' ) );
			add_action( 'admin_enqueue_scripts', array( $this, 'panel_enqueue' ) );

			// add the typography javascript vars
			add_action( 'yith_panel_after_panel', array( $this, 'js_typo_vars' ) );
		}

		/**
		 * Create new submenu page
		 *
		 * @return void
		 * @access public
		 * @link http://codex.wordpress.org/Function_Reference/add_submenu_page
		 */
		public function add_submenu_page() {
			$submenu = $this->_submenu;
			add_submenu_page(
				$submenu[0],
				$submenu[1],
				$submenu[2],
				$submenu[3],
				$submenu[4],
				array( $this, isset( $submenu[5] ) ? $submenu[5] : 'display_panel_page' )
			);
		}

		/**
		 * Print the Panel page
		 *
		 * @return void
		 * @access public
		 */
		public function display_panel_page() {
			// Create a header in the default WordPress 'wrap' container
			$page = $this->_get_tab();
			?>
			<div id="icon-themes" class="icon32"><br/></div>
			<h2 class="nav-tab-wrapper">
				<?php foreach ( $this->options as $k => $tab ): ?>
					<a class="nav-tab<?php if ( $page == $k ): ?> nav-tab-active<?php endif ?>"
					   href="<?php echo esc_url( add_query_arg( 'panel_page', $k ) ); ?>"><?php echo $tab['label'] ?></a>
				<?php endforeach ?>
				<?php do_action( 'yith_panel_after_tabs' ); ?>
			</h2>

			<div class="wrap">
				<?php $this->printBanner() ?>
				<?php do_action( 'yith_panel_before_panel' ); ?>
				<form action="options.php" method="post">

					<?php do_settings_sections( $this->option_name ); ?>
					<?php settings_fields( $this->option_group ) ?>

					<p class="submit">
						<input type="hidden" name="panel_page" value="<?php echo $page ?>"/>
						<input class="button-primary" type="submit" name="save_options" value="Save Options"/>
					</p>
				</form>
				<?php do_action( 'yith_panel_after_panel' ); ?>
			</div>
		<?php
		}

		/**
		 * Add the vars for the typography options
		 */
		public function js_typo_vars() {
			global $yith_panel_if_typography;
			if ( ! isset( $yith_panel_if_typography ) || ! $yith_panel_if_typography ) {
				return;
			}

			$web_fonts = array(
				"Arial",
				"Arial Black",
				"Comic Sans MS",
				"Courier New",
				"Georgia",
				"Impact",
				"Lucida Console",
				"Lucida Sans Unicode",
				"Thaoma",
				"Trebuchet MS",
				"Verdana"
			);

			// http://niubbys.altervista.org/google_fonts.php
			$google_fonts = file_get_contents( dirname( __FILE__ ) . '/assets/js/google_fonts.json' );
			?>
			<script type="text/javascript">
				var yit_google_fonts = '<?php echo $google_fonts ?>',
					yit_web_fonts = '{"items":<?php echo json_encode( $web_fonts ) ?>}',
					yit_family_string = '';
			</script>
		<?php
		}

		/**
		 * Register a new settings option group
		 *
		 * @return void
		 * @access public
		 * @link http://codex.wordpress.org/Function_Reference/register_setting
		 * @link http://codex.wordpress.org/Function_Reference/add_settings_section
		 * @link http://codex.wordpress.org/Function_Reference/add_settings_field
		 */
		public function panel_register_setting() {
			$page = $this->_get_tab();
			$tab  = isset( $this->options[ $page ] ) ? $this->options[ $page ] : array();

			if ( ! empty( $tab['sections'] ) ) {
				//add sections and fields
				foreach ( $tab['sections'] as $section_name => $section ) {
					//add the section
					add_settings_section(
						$section_name,
						$section['title'],
						array( $this, 'panel_section_content' ),
						$this->option_name
					);

					//add the fields
					foreach ( $section['fields'] as $option_name => $option ) {
						$option['id']        = $option_name;
						$option['label_for'] = $option_name;

						//register settings group
						register_setting(
							$this->option_group,
							$option_name,
							array( $this, 'panel_sanitize' )
						);

						add_settings_field(
							$option_name,
							$option['title'],
							array( $this, 'panel_field_content' ),
							$this->option_name,
							$section_name,
							$option
						);
					}
				}
			}
		}

		/**
		 * Display sections content
		 *
		 * @return void
		 * @access public
		 */
		public function panel_section_content( $section ) {
			$page = $this->_get_tab();
			if ( isset( $this->options[ $page ]['sections'][ $section['id'] ]['description'] ) ) {
				echo "<p class='section-description'>" . $this->options[ $page ]['sections'][ $section['id'] ]['description'] . "</p>";
			}
		}

		/**
		 * Sanitize the option's value
		 *
		 * @param array $input
		 *
		 * @return array
		 * @access public
		 */
		public function panel_sanitize( $input ) {
			return apply_filters( 'yith_panel_sanitize', $input );
		}

		/**
		 * Get the active tab. If the page isn't provided, the function
		 * will return the first tab name
		 *
		 * @return string
		 * @access protected
		 */
		public function _get_tab() {
			if ( isset( $_POST['panel_page'] ) && $_POST['panel_page'] != '' ) {
				return $_POST['panel_page'];
			} elseif ( isset( $_GET['panel_page'] ) && $_GET['panel_page'] != '' ) {
				return $_GET['panel_page'];
			} else {
				$tabs = array_keys( $this->options );

				return $tabs[0];
			}
		}

		/**
		 * Enqueue scripts and styles
		 *
		 * @return void
		 * @access public
		 */
		public function panel_enqueue( $hook ) {
			global $pagenow;

			if ( $pagenow == $this->_submenu[0] && isset( $_GET['page'] ) && $_GET['page'] == $this->_submenu[4] ) {
				wp_enqueue_style( 'wp-color-picker' );
				wp_enqueue_style( 'jquery-ui', 'http://code.jquery.com/ui/1.10.3/themes/smoothness/jquery-ui.css' );
				wp_enqueue_script( 'jquery-ui-datepicker' );

				wp_enqueue_style( 'yith-panel-css', plugin_dir_url( __FILE__ ) . 'assets/css/yith-panel.css', array( 'wp-color-picker' ), $this->version );
				wp_enqueue_script( 'yith-panel-js', plugin_dir_url( __FILE__ ) . 'assets/js/yith-panel.js', array(
					'jquery',
					'wp-color-picker'
				), $this->version, true );

				wp_enqueue_media();

				do_action( 'yith_panel_enqueue' );
			}
		}


		/**
		 * Display field content
		 *
		 * @return void
		 * @access public
		 */
		public function panel_field_content( $field ) {
			$value = get_option( $field['id'], isset( $field['std'] ) ? $field['std'] : '' );
			$id    = $field['id'];
			$name  = $field['id'];

			$echo = '';

			switch ( $field['type'] ) {
				case 'text':
					$echo = "<input type='text' id='{$id}' name='{$name}' value='{$value}' class='regular-text code' />";

					if ( isset( $field['description'] ) && $field['description'] != '' ) {
						$echo .= "<p class='description'>{$field['description']}</p>";
					}
					break;

				case 'textarea':
					$echo = "<textarea name='{$name}' id='{$id}' class='large-text code' rows='10' cols='50'>{$value}</textarea>";
					if ( isset( $field['description'] ) && $field['description'] != '' ) {
						$echo .= "<p class='description'>{$field['description']}</p>";
					}
					break;

				case 'checkbox':
					$echo = "<input type='checkbox' id='{$id}' name='{$name}' value='1' " . checked( $value, true, false ) . " />";
					if ( isset( $field['description'] ) && $field['description'] != '' ) {
						$echo .= " <label for='{$id}'><span class='description'>{$field['description']}</span></label>";
					}
					break;

				case 'select':
					$echo = "<select name='{$name}' id='{$id}'>";
					foreach ( $field['options'] as $v => $label ) {
						$echo .= "<option value='{$v}'" . selected( $value, $v, false ) . ">{$label}</option>";
					}
					$echo .= "</select>";
					if ( isset( $field['description'] ) && $field['description'] != '' ) {
						$echo .= "<p class='description'>{$field['description']}</p>";
					}
					break;

				case 'skin':
					$echo = "<select name='{$name}' id='{$id}' class='skin' data-path='{$field['path']}'>";
					foreach ( $field['options'] as $v => $label ) {
						$echo .= "<option value='{$v}'" . selected( $value, $v, false ) . ">{$label}</option>";
					}
					$echo .= "</select>";
					if ( isset( $field['description'] ) && $field['description'] != '' ) {
						$echo .= "<p class='description'>{$field['description']}</p><div class='skin-preview'></div>";
					}
					break;

				case 'number':
					$mms = '';
					if ( isset( $field['min'] ) ) {
						$mms .= " min='{$field['min']}'";
					}

					if ( isset( $field['max'] ) ) {
						$mms .= " max='{$field['max']}'";
					}

					if ( isset( $field['step'] ) ) {
						$mms .= " step='{$field['step']}'";
					}

					$echo = "<input type='number' id='{$id}' name='{$name}' value='{$value}' class='small-text' {$mms} />";
					if ( isset( $field['description'] ) && $field['description'] != '' ) {
						$echo .= "<p class='description'>{$field['description']}</p>";
					}
					break;

				case 'colorpicker':
					$std = isset( $field['std'] ) ? $field['std'] : '';

					$echo = "<input type='text' id='{$id}' name='{$name}' value='{$value}' class='medium-text code panel-colorpicker' data-default-color='{$std}' />";
					if ( isset( $field['description'] ) && $field['description'] != '' ) {
						$echo .= "<p class='description'>{$field['description']}</p>";
					}
					break;

				case 'datepicker':
					$std   = isset( $field['std'] ) ? $field['std'] : array(
						'date' => '',
						'hh'   => 0,
						'mm'   => 0,
						'ss'   => 0
					);
					$value = ! empty( $value ) ? $value : array( 'date' => '', 'hh' => 0, 'mm' => 0, 'ss' => 0 );

					$echo = "<input type='text' id='{$id}_date' name='{$name}[date]' value='{$value['date']}' class='medium-text code panel-datepicker' colorpicker='" . __( 'Select a date', 'yit' ) . "' /> - ";
					$echo .= "<input type='text' id='{$id}_hh' name='{$name}[hh]' value='{$value['hh']}' class='small-text code' colorpicker='" . __( 'Hours', 'yit' ) . "' /> : ";
					$echo .= "<input type='text' id='{$id}_mm' name='{$name}[mm]' value='{$value['mm']}' class='small-text code' colorpicker='" . __( 'Minutes', 'yit' ) . "' /> : ";
					$echo .= "<input type='text' id='{$id}_ss' name='{$name}[ss]' value='{$value['ss']}' class='small-text code' colorpicker='" . __( 'Minutes', 'yit' ) . "' />";
					if ( isset( $field['description'] ) && $field['description'] != '' ) {
						$echo .= "<p class='description'>{$field['description']}</p>";
					}
					break;

				case 'upload':
					$echo = '<div class="uploader">';
					$echo .= "  <input type='text' id='{$id}' name='{$name}' value='{$value}' class='regular-text code' /> <input type='button' name='' id='{$id}_button' class='button' value='" . __( 'Upload', 'yit' ) . "'>";
					$echo .= '</div>';
					if ( isset( $field['description'] ) && $field['description'] != '' ) {
						$echo .= "<p class='description'>{$field['description']}</p>";
					}
					break;

				case 'checkboxes':
					$echo = '<div class="checkboxes">';
					foreach ( $field['options'] as $check_value => $check_label ) {
						$echo .= "<label><input type='checkbox' id='{$id}_{$check_value}' name='{$name}[]' value='$check_value' " . checked( in_array( $check_value, $value ), true, false ) . " /> {$check_label}</label><br />";
					}

					$echo .= " <p class='description'>{$field['description']}</p>";
					break;

				case 'typography':
					$value                    = wp_parse_args( $value, $field['std'] ); ?>
					<div class="typography_container typography">
						<div class="option">
							<!-- Size -->
							<div class="spinner_container">
								<input class="typography_size number small-text" type="number"
								       name="<?php echo $name ?>[size]" id="<?php echo $id ?>-size"
								       value="<?php echo $value['size'] ?>"
								       data-min="<?php if ( isset( $field['min'] ) ) {
									       echo $field['min'];
								       } ?>" data-max="<?php if ( isset( $field['max'] ) ) {
									echo $field['max'];
								} ?>"/>
							</div>

							<!-- Unit -->
							<div class="select-wrapper font-unit">
								<select class="typography_unit" name="<?php echo $name ?>[unit]"
								        id="<?php echo $id ?>-unit">
									<option
										value="px" <?php selected( $value['unit'], 'px' ) ?>><?php _e( 'px', 'yit' ) ?></option>
									<option
										value="em" <?php selected( $value['unit'], 'em' ) ?>><?php _e( 'em', 'yit' ) ?></option>
									<option
										value="pt" <?php selected( $value['unit'], 'pt' ) ?>><?php _e( 'pt', 'yit' ) ?></option>
									<option
										value="rem" <?php selected( $value['unit'], 'rem' ) ?>><?php _e( 'rem', 'yit' ) ?></option>
								</select>
							</div>

							<!-- Family -->
							<div class="select-wrapper font-family">
								<select class="typography_family" name="<?php echo $name ?>[family]"
								        id="<?php echo $id ?>-family" data-instance="false">
									<?php if ( $value['family'] ): ?>
										<option
											value="<?php echo stripslashes( $value['family'] ) ?>"><?php echo $value['family'] ?></option>
									<?php else: ?>
										<option value=""><?php _e( 'Select a font family', 'yit' ) ?></option>
									<?php endif ?>
								</select>
							</div>

							<!-- Style -->
							<div class="select-wrapper font-style">
								<select class="typography_style" name="<?php echo $name ?>[style]"
								        id="<?php echo $id ?>-style">
									<option
										value="regular" <?php selected( $value['style'], 'regular' ) ?>><?php _e( 'Regular', 'yit' ) ?></option>
									<option
										value="bold" <?php selected( $value['style'], 'bold' ) ?>><?php _e( 'Bold', 'yit' ) ?></option>
									<option
										value="extra-bold" <?php selected( $value['style'], 'extra-bold' ) ?>><?php _e( 'Extra bold', 'yit' ) ?></option>
									<option
										value="italic" <?php selected( $value['style'], 'italic' ) ?>><?php _e( 'Italic', 'yit' ) ?></option>
									<option
										value="bold-italic" <?php selected( $value['style'], 'bold-italic' ) ?>><?php _e( 'Italic bold', 'yit' ) ?></option>
								</select>
							</div>

							<!-- Color -->
							<input type='text' id='<?php echo $id ?>-color' name='<?php echo $name ?>[color]'
							       value='<?php echo $value['color'] ?>'
							       class='medium-text code panel-colorpicker typography_color'
							       data-default-color='<?php echo $field['std']['color'] ?>'/>

						</div>
						<div class="clear"></div>
						<div class="font-preview">
							<p>The quick brown fox jumps over the lazy dog</p>
							<!-- Refresh -->
							<div class="refresh_container">
								<button class="refresh"><?php _e( 'Click to preview', 'yit' ) ?></button>
							</div>
						</div>
					</div>
					<?php
					global $yith_panel_if_typography;
					$yith_panel_if_typography = true;
					break;

				default:
					do_action( 'yith_panel_field_' . $field['type'] );
					break;
			}

			echo $echo;
		}

		/**
		 * Print the banner
		 *
		 * @access protected
		 * @return void
		 */
		public function printBanner() {
			if ( ! $this->banner_url || ! $this->banner_img ) {
				return;
			}
			?>
			<div class="yith_banner">
				<a href="<?php echo $this->banner_url ?>" target="_blank">
					<img src="<?php echo $this->banner_img ?>" alt=""/>
				</a>
			</div>
		<?php
		}
	}
}