<?php

/**

 * @author    ThemePunch <info@themepunch.com>

 * @link      http://www.themepunch.com/

 * @version: 1.0.5 (13.6.2018)

 * @copyright 2017 ThemePunch

 */



if( !defined( 'ABSPATH') ) exit();



if(!class_exists('TPColorpicker')){

	class TPColorpicker {

		

		

		/**

		 * @since 5.3.1.6

		 */

		public function __construct(){	

			add_filter(AJAX_ACTION, array($this, 'init_ajax'), 10, 6);

		}

		

		/**

		 * @since 5.3.1.6

		 */

		public static $isColor = '/(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i';



		/**

		 * best option for frontend

		 * @since 5.3.1.6

		 */

		public static function get($val) {

	        

	        if(!$val || empty($val)) return 'transparent';

	        $process = TPColorpicker::process($val, true);

	        return $process[0];

	        

	    }

		

		/**

		 * return usable CSS value from stored color data value

		 * @since 5.3.1.6

		 */

		public static function parse($val, $prop, $returnColorType){

			

			$val = TPColorpicker::process($val, true);

			$ar = array();

				

			if(!$prop) $ar[0] = $val[0];	

			else $ar[0] = $prop + ': ' + $val[0] + ';';

				

			if($returnColorType) $ar[1] = $val[1];

			return $ar;

		

		}





		/**

		 * convert hex and opacity to rgba

		 * @since 5.3.1.6

		 */

		public static function convert($color, $opacity){

			if( $opacity == "transparent" ){

				return 'rgba(0,0,0,0)';

			} 

			if($color=="" ) return '';

			if(strpos($color, "[{") !== false  || strpos($color,'gradient') !== false ) return TPColorpicker::get($color);

			

			if(!is_bool($opacity) && "".$opacity === "0"){

				return 'transparent';

			} 



			if($opacity==-1 || !$opacity || empty($opacity) || !is_numeric($opacity) || $color == "transparent" || $opacity === 1 || $opacity == 100 ) {

				if(strpos($color,'rgba') === false && strpos($color,'#') !== false) {

					return TPColorpicker::processRgba(TPColorpicker::sanitizeHex($color), $opacity);

				}

				else {

					$color = TPColorpicker::process($color, true);

					return $color[0];

				}

			}



			$opacity = floatval($opacity);

			if($opacity < 1) $opacity = $opacity * 100;

			$opacity = round($opacity);

			$opacity = $opacity > 100 ? 100 : $opacity;

			$opacity = $opacity < -1 ? 0 : $opacity;



			if($opacity === 0) return 'transparent';



			if(strpos($color,'#') !== false ) {

				

				return TPColorpicker::processRgba(TPColorpicker::sanitizeHex($color), $opacity);

				

			}

			else if(strpos($color, 'rgb') !== false) {		



				$color = TPColorpicker::rgbValues($color, 3);

				return TPColorpicker::rgbaString($color[0], $color[1], $color[2], $opacity);

				

			}

			

			return 'transparent';

			

		}





		/**

		 * core function for converting ColorPicker input values

		 * @since 5.3.1.6

		 */

		public static function process($clr, $processColor = false){

			

			if(empty($clr)) return array('transparent', 'transparent');



			if(!is_string($clr) ) {

				if($processColor) $clr = TPColorpicker::sanatizeGradient($clr);

				return array( TPColorpicker::processGradient($clr), 'gradient', $clr );

			}

			else if( trim($clr) == 'transparent' ) {

				

				return array('transparent', 'transparent');

				

			}

			else if( strpos( $clr, "[{" ) !== false ) {

				try {

					$clr = json_decode( str_replace("amp;", '',str_replace("&", '"', $clr)) );



					if($processColor) $clr = TPColorpicker::sanatizeGradient($clr);



					return array(TPColorpicker::processGradient($clr), 'gradient', $clr);

				}

				catch (Exception $e) {

					return '{"type":"linear","angle":"0","colors":[{"r":"255","g":"255","b":"255","a":"1","position":"0","align":"bottom"},{"r":"0","g":"0","b":"0","a":"1","position":"100","align":"bottom"}]}';

				}

			}



			else if( strpos($clr,'#') !== false ) {

				

				return array(TPColorpicker::sanitizeHex($clr), 'hex');

				

			}

			else if( strpos($clr,'rgba') !== false ) {

				$clr = preg_replace( '/\s+/', '', $clr ) ;

				return array($clr, 'rgba');

				

			}

			else if( strpos($clr,'rgb') !== false ) {

				$clr = preg_replace('/\s+/', '', $clr);

				return array($clr, 'rgb');

				

			}

			else if(preg_match(TPColorpicker::$isColor, $clr) !== false) {

				$clr = preg_replace('/\s+/', '', $clr);

				return array($clr, 'hex');

			}

			

			return array('transparent', 'transparent');



		}



		/**

		 * clean up duplicate values in gradient

		 * @since 5.3.1.6

		 */

		public static function sanatizeGradient($obj) {



			$colors = $obj->colors;

			$len = sizeof($colors);

			$ar = array();



			for($i = 0; $i < $len; $i++) {

				

				$cur = $colors[$i];

				unset($cur->align);

				

				if( isset($prev) ) {

					

					if(json_encode($cur) !== json_encode($prev)) {

						

						$ar[sizeof($ar)] = $cur;

						

					}

					

				}

				else {

					

					$ar[sizeof($ar)] = $cur;

					

				}

				

				$prev = $cur;

				

			}

			

			$obj->colors = $ar;

			return $obj;

			

		}



		/**

		 * convert gradient object to CSS background gradient value

		 * @since 5.3.1.6

		 */

		public static function processGradient($obj){

			$tpe = $obj->type;

			$begin = $tpe . '-gradient(';

			$middle = $tpe === 'linear' ? $obj->angle . 'deg, ' : 'ellipse at center, ';

			$colors = $obj->colors;

			$len = sizeof($colors);	

			$end = '';

			

			for($i = 0; $i < $len; $i++) {

				

				if($i > 0) $end .= ', ';

				$clr = $colors[$i];

				$end .= 'rgba(' . $clr->r . ',' . $clr->g . ',' . $clr->b . ',' . $clr->a . ') ' . $clr->position . '%';

				

			}

			

			return $begin . $middle . $end . ')';

		}





		/**

		 * convert rgb values to CSS value

		 * @since 5.3.1.6

		 */

		public static function rgbValues($values, $num) {

		

			$values = substr( $values, strpos($values, '(') + 1  , strpos($values, ')')-strpos($values, '(') - 1 );

			$values = explode(",", $values);

			

			if(sizeof($values) == 3 && $num == 4) $values[3] = '1';

			for($i = 0; $i < $num; $i++) {

				if(isset($values[$i])) $values[$i] = trim($values[$i]);

			}

			

			return $values;

			

		}



		/**

		 * convert rgba data values to CSS value

		 * @since 5.3.1.6

		 */

		public static function rgbaString($r, $g, $b, $a) {

			if($a > 1){

				$a = "".number_format($a * 0.01 ,  2);

	      		$a = str_replace(".00", "", $a);

	      	}

			return 'rgba(' . $r . ',' . $g . ',' . $b . ',' . $a . ')';

			

		}



		/**

		 * convert rgb to hex

		 * @since 5.3.1.6

		 */

		public static function rgbToHex($clr) {

			

			$values = TPColorpicker::rgbValues($clr, 3);

			return TPColorpicker::getRgbToHex($values[0], $values[1], $values[2]);

			

		}



		/**

		 * convert rgba to hex

		 * @since 5.3.1.6

		 */

		public static function rgbaToHex($clr) {

			

			$values = TPColorpicker::rgbValues($clr, 4);



			return array(TPColorpicker::getRgbToHex($values[0], $values[1], $values[2]), $values[3]);

			

		}



		/**

		 * get opacity value from rgba

		 * @since 5.3.1.6

		 */

		public static function getOpacity($val){

			$rgb = TPColorpicker::rgbValues($val, 4);

			return intval($rgb[3] * 100, 10) + '%';

		}



		/**

		 * convert rgb to hex

		 * @since 5.3.1.6

		 */

		public static function getRgbToHex($r, $g, $b){

			$rgb = array($r, $g, $b);

			$hex = "#";

	   		$hex .= str_pad(dechex($rgb[0]), 2, "0", STR_PAD_LEFT);

	   		$hex .= str_pad(dechex($rgb[1]), 2, "0", STR_PAD_LEFT);

	   		$hex .= str_pad(dechex($rgb[2]), 2, "0", STR_PAD_LEFT);

	   		return $hex;

		}



		/**

		 * convert hex and opacity values to rgba

		 * @since 5.3.1.6

		 */

		public static function joinToRgba($val){

			$val = explode('||', $val);

			return TPColorpicker::convert($val[0], $val[1]);

		}



		/**

		 * convert hex to rgba

		 * @since 5.3.1.6

		 */

		public static function processRgba($hex, $opacity=false){

			

			$hex = trim(str_replace('#', '' , $hex));

			

			$rgb = $opacity!==false ? 'rgba' : 'rgb';  

			$r = hexdec(substr($hex,0,2));

	      	$g = hexdec(substr($hex,2,2));

	      	$b = hexdec(substr($hex,4,2));

	      	

	      	$color = $rgb . "(" . $r . "," . $g . "," . $b ;



	      	if($opacity!==false){

	      		if($opacity > 1)

	      			$opacity = "".number_format($opacity * 0.01 ,  2);

	      		$opacity = str_replace(".00", "", $opacity);

	      		$color .= ',' . $opacity;

	      	}



	      	$color .= ')';



	      	return $color;

		}



		/**

		 * sanitize hex color values

		 * @since 5.3.1.6

		 */

		public static function sanitizeHex($hex){

			$hex = trim(str_replace('#', '' , $hex));

			if (strlen($hex) == 3) {

			    $hex[5] = $hex[2]; // f60##0

			    $hex[4] = $hex[2]; // f60#00

			    $hex[3] = $hex[1]; // f60600

			    $hex[2] = $hex[1]; // f66600

			    $hex[1] = $hex[0]; // ff6600

			}

			return '#'.$hex;

		}

		

		

		/**

		 * Save presets

		 * @since 5.3.2

		 */

		public static function save_color_presets($presets){

			

			update_option('tp_colorpicker_presets', $presets);

			

			return self::get_color_presets();

		}

		

		

		/**

		 * Load presets

		 * @since 5.3.2

		 */

		public static function get_color_presets(){

			

			return get_option('tp_colorpicker_presets', array());

			

		}

		

	}

}

?>