<?php
/**
 * @package Unlimited Elements
 * @author unlimited-elements.com
 * @copyright (C) 2021 Unlimited Elements, All Rights Reserved. 
 * @license GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 * */
if ( ! defined( 'ABSPATH' ) ) exit;

class UniteCreatorUniteGallery{

		private $arrParams = array();
		private $arrOriginalParams;		//params as they came originally from the database
		private $skipJsOptions = array();
		private $arrJsParamsAssoc = array();
		private $arrJsParams = array();
		private $galleryType = "";
		
		
		const TYPE_NUMBER = "number";
		const TYPE_BOOLEAN = "boolean";
		const TYPE_OBJECT = "object";
		const TYPE_SIZE = "size";
		
		const VALIDATE_EXISTS = "validate";
		const VALIDATE_NUMERIC = "numeric";
		const VALIDATE_SIZE = "size";
		const FORCE_NUMERIC = "force_numeric";
		const FORCE_BOOLEAN = "force_boolean";
		const FORCE_SIZE = "force_size";
		const TRIM = "trim";
		
		const THEME_DEFAULT = "default";
		const THEME_COMPACT = "compact";
		const THEME_SLIDER = "slider";
		const THEME_GRID = "grid";
		const THEME_VIDEO = "video";
		const THEME_TILES = "tiles";
		const THEME_TILESGRID = "tilesgrid";
		const THEME_CAROUSEL = "carousel";
		
		const TYPE_TILES_COLUMNS = "tiles_columns";
		const TYPE_TILES_JUSTIFIED = "tiles_justified";
		const TYPE_TILES_NESTED = "tiles_nested";
		
		
		
		/**
		 * validate gallery theme
		 */
		private function validateGalleryType($type){
					
			$type = esc_html($type);
			
			switch($type){
				case self::THEME_DEFAULT:
				case self::THEME_COMPACT:
				case self::THEME_SLIDER:
				case self::THEME_GRID:
				case self::THEME_VIDEO:
				case self::THEME_TILESGRID:
				case self::THEME_CAROUSEL:
				case self::TYPE_TILES_COLUMNS:
				case self::TYPE_TILES_JUSTIFIED:
				case self::TYPE_TILES_NESTED:
					return(true);
				break;
				default:
					
					UniteFunctionsUC::throwError("Wrong gallery type: $type");
					
				break;
			}
			
		}
		
		
		/**
		 * get must fields that will be thrown from the settings anyway
		 */
		private function getArrMustFields(){
			$arrMustKeys = array(
					"gallery_theme",
					"full_width",
					"gallery_width",
					"gallery_height",
					"position",
					"margin_top",
					"margin_bottom",
					"margin_left",
					"margin_right"
			);

			return($arrMustKeys);
		}
		
		/**
		 * check if some param exists in params array
		 */
		private function isParamExists($name){
			$exists = array_key_exists($name, $this->arrParams);
			return $exists;				
		}
		
		
		/**
		 *
		 * get some param
		 */
		protected function getParam($name, $validateMode = null){
			
			if(is_array($this->arrParams) == false)
				$this->arrParams = array();
			
			if(array_key_exists($name, $this->arrParams)){
				$arrParams = $this->arrParams;
				$value = $this->arrParams[$name];				
			}
			else{
				if(is_array($this->arrOriginalParams) == false)
					$this->arrOriginalParams = array();
				
				$arrParams = $this->arrOriginalParams;
				$value = UniteFunctionsUC::getVal($this->arrOriginalParams, $name);				
			}
			
			switch ($validateMode) {
				case self::VALIDATE_EXISTS:
					if (array_key_exists($name, $arrParams) == false)
						UniteFunctionsUC::throwError("The param: {$name} don't exists");
				break;
				case self::VALIDATE_NUMERIC:
					
					if (is_numeric($value) == false)
						UniteFunctionsUC::throwError("The param: {$name} is not numeric ($value)");
				break;
				case self::VALIDATE_SIZE:
					if(strpos($value, "%") === false && is_numeric($value) == false)
						UniteFunctionsUC::throwError("The param: {$name} is not size");
				break;
				case self::FORCE_SIZE:
					$isPercent = (strpos($value, "%") !== false);
					if($isPercent == false && is_numeric($value) == false)
						UniteFunctionsUC::throwError("The param: {$name} is not size");
					
					if($isPercent == false)
						$value .= "px";
				break;
				case self::FORCE_NUMERIC:
					$value = floatval($value);
					$value = (double) $value;
				break;			
				case self::FORCE_BOOLEAN:
					$value = UniteFunctionsUC::strToBool($value);
				break;
				case self::TRIM:
					$value = trim($value);
				break;
			}
			
			return($value);
		}
		
		
		
		/**
		 * build javascript param
		 */
		private function buildJsParam($paramName, $validate = null, $type = null, $replaceParamName = null){
			
			if(array_key_exists($paramName, $this->arrJsParamsAssoc))
				UniteFunctionsUC::throwError("Unable to biuld js param: <b>$paramName</b> already exists");
			
			$output = array("name"=>$paramName, "validate"=>$validate, "type"=>$type, "replace"=>$replaceParamName);
			
			$this->arrJsParamsAssoc[$paramName] = true;
			
			$this->arrJsParams[] = $output;
			
		}
		
		
		
		/**
		 * build theme related js params
		 */
		private function buildThemeRelatedJSParams($arr){
			
			
			//----- tiles grid --------
			
			switch($this->galleryType){
				
				case self::THEME_TILESGRID:
					
					$arr[] = $this->buildJsParam("theme_gallery_padding", self::VALIDATE_NUMERIC, self::TYPE_NUMBER);
					$arr[] = $this->buildJsParam("grid_padding", self::VALIDATE_NUMERIC, self::TYPE_NUMBER);
					$arr[] = $this->buildJsParam("grid_num_rows", self::VALIDATE_NUMERIC, self::TYPE_NUMBER);
					
					$arr[] = $this->buildJsParam("grid_space_between_mobile", self::VALIDATE_NUMERIC, self::TYPE_NUMBER);
					$arr[] = $this->buildJsParam("grid_min_cols", self::VALIDATE_NUMERIC, self::TYPE_NUMBER);
					
					$arr[] = $this->buildJsParam("theme_navigation_type");
					$arr[] = $this->buildJsParam("theme_arrows_margin_top", self::VALIDATE_NUMERIC, self::TYPE_NUMBER);
					$arr[] = $this->buildJsParam("theme_space_between_arrows", self::VALIDATE_NUMERIC, self::TYPE_NUMBER);
					$arr[] = $this->buildJsParam("theme_bullets_color");
					$arr[] = $this->buildJsParam("bullets_space_between", self::VALIDATE_NUMERIC, self::TYPE_NUMBER);
					$arr[] = $this->buildJsParam("theme_bullets_margin_top", self::VALIDATE_NUMERIC, self::TYPE_NUMBER);
					
					$arr[] = $this->buildJsParam("theme_open_lightbox_at_start", null, self::TYPE_BOOLEAN);
					$arr[] = $this->buildJsParam("theme_grid_align");
					
				break;
				case self::TYPE_TILES_COLUMNS:
					
					$arr[] = $this->buildJsParam("theme_open_lightbox_at_start_columns", null, self::TYPE_BOOLEAN, "theme_open_lightbox_at_start");
					
					$arr[] = $this->buildJsParam("theme_gallery_padding_columns", self::VALIDATE_NUMERIC, self::TYPE_NUMBER,"theme_gallery_padding");
					$arr[] = $this->buildJsParam("tiles_include_padding", null, self::TYPE_BOOLEAN);
					$arr[] = $this->buildJsParam("tiles_col_width", self::VALIDATE_NUMERIC, self::TYPE_NUMBER);
					$arr[] = $this->buildJsParam("tiles_space_between_cols", self::VALIDATE_NUMERIC, self::TYPE_NUMBER);
					$arr[] = $this->buildJsParam("tiles_set_initial_height", null, self::TYPE_BOOLEAN);
					$arr[] = $this->buildJsParam("tiles_space_between_cols_mobile", self::VALIDATE_NUMERIC, self::TYPE_NUMBER);
					$arr[] = $this->buildJsParam("tiles_exact_width", null, self::TYPE_BOOLEAN);
					$arr[] = $this->buildJsParam("tiles_min_columns", self::VALIDATE_NUMERIC, self::TYPE_NUMBER);
					$arr[] = $this->buildJsParam("tiles_max_columns", self::VALIDATE_NUMERIC, self::TYPE_NUMBER);
					
					$arr[] = $this->buildJsParam("theme_enable_preloader", null, self::TYPE_BOOLEAN);
					$arr[] = $this->buildJsParam("theme_preloading_height", self::VALIDATE_NUMERIC, self::TYPE_NUMBER);
					$arr[] = $this->buildJsParam("theme_preloader_vertpos", self::VALIDATE_NUMERIC, self::TYPE_NUMBER);
					$arr[] = $this->buildJsParam("tiles_enable_transition", null, self::TYPE_BOOLEAN);
					$arr[] = $this->buildJsParam("theme_appearance_order");
					
					$arr[] = $this->buildJsParam("tiles_align");	//param not in settings
					
					$arr[] = $this->buildJsParam("theme_auto_open", self::VALIDATE_NUMERIC, self::TYPE_NUMBER);
					
				break;
				default:
					
					UniteFunctionsUC::throwError("buildThemeRelatedJSParams: no options for this type yet: ".$this->galleryType);
					
				break;
			}
						
			
			
			return($arr);
		}
		
	
		/**
		 * get params array defenitions that shouls be put as is from the settings
		 */
		private function buildJSOptions(){
			
			$arr = array();
			$arr[] = $this->buildJsParam("gallery_theme");
			$arr[] = $this->buildJsParam("tiles_type");
			$arr[] = $this->buildJsParam("gallery_width", self::VALIDATE_SIZE, self::TYPE_SIZE);
			$arr[] = $this->buildJsParam("gallery_height", self::VALIDATE_SIZE, self::TYPE_SIZE);
			$arr[] = $this->buildJsParam("gallery_min_width", self::VALIDATE_NUMERIC, self::TYPE_NUMBER);
			$arr[] = $this->buildJsParam("gallery_min_height", self::VALIDATE_NUMERIC, self::TYPE_NUMBER);
			$arr[] = $this->buildJsParam("gallery_skin");
			$arr[] = $this->buildJsParam("gallery_images_preload_type");
			$arr[] = $this->buildJsParam("gallery_autoplay", null, self::TYPE_BOOLEAN);
			$arr[] = $this->buildJsParam("gallery_play_interval", self::VALIDATE_NUMERIC, self::TYPE_NUMBER);
			$arr[] = $this->buildJsParam("gallery_pause_on_mouseover", null, self::TYPE_BOOLEAN);
			$arr[] = $this->buildJsParam("gallery_mousewheel_role");
			$arr[] = $this->buildJsParam("gallery_control_keyboard", null, self::TYPE_BOOLEAN);
			$arr[] = $this->buildJsParam("gallery_preserve_ratio", null, self::TYPE_BOOLEAN);
			$arr[] = $this->buildJsParam("gallery_shuffle", null, self::TYPE_BOOLEAN);
			$arr[] = $this->buildJsParam("gallery_debug_errors", null, self::TYPE_BOOLEAN);
			$arr[] = $this->buildJsParam("slider_background_color");
			$arr[] = $this->buildJsParam("slider_background_opacity", self::FORCE_NUMERIC, self::TYPE_NUMBER);
			
			$arr[] = $this->buildJsParam("slider_scale_mode");
			$arr[] = $this->buildJsParam("slider_scale_mode_media");
			$arr[] = $this->buildJsParam("slider_scale_mode_fullscreen");
			
			$arr[] = $this->buildJsParam("slider_transition");
			$arr[] = $this->buildJsParam("slider_transition_speed", self::VALIDATE_NUMERIC, self::TYPE_NUMBER);
			$arr[] = $this->buildJsParam("slider_transition_easing");
			$arr[] = $this->buildJsParam("slider_control_swipe", null, self::TYPE_BOOLEAN);
			$arr[] = $this->buildJsParam("slider_control_zoom", null, self::TYPE_BOOLEAN);
			$arr[] = $this->buildJsParam("slider_zoom_max_ratio", self::VALIDATE_NUMERIC, self::TYPE_NUMBER);
			$arr[] = $this->buildJsParam("slider_enable_links", null, self::TYPE_BOOLEAN);
			$arr[] = $this->buildJsParam("slider_links_newpage", null, self::TYPE_BOOLEAN);
			
			$arr[] = $this->buildJsParam("slider_video_enable_closebutton", null, self::TYPE_BOOLEAN);
			
			$arr[] = $this->buildJsParam("slider_controls_always_on", null, self::TYPE_BOOLEAN);
			$arr[] = $this->buildJsParam("slider_controls_appear_ontap", null, self::TYPE_BOOLEAN);
			$arr[] = $this->buildJsParam("slider_controls_appear_duration", self::VALIDATE_NUMERIC, self::TYPE_NUMBER);
			
			$arr[] = $this->buildJsParam("slider_loader_type", self::VALIDATE_NUMERIC, self::TYPE_NUMBER);
			$arr[] = $this->buildJsParam("slider_loader_color");
			
			$arr[] = $this->buildJsParam("slider_enable_bullets", null, self::TYPE_BOOLEAN);
			$arr[] = $this->buildJsParam("slider_bullets_skin");
			$arr[] = $this->buildJsParam("slider_bullets_space_between", self::VALIDATE_NUMERIC, self::TYPE_NUMBER);
			$arr[] = $this->buildJsParam("slider_bullets_align_hor");
			$arr[] = $this->buildJsParam("slider_bullets_align_vert");
			$arr[] = $this->buildJsParam("slider_bullets_offset_hor", self::VALIDATE_NUMERIC, self::TYPE_NUMBER);
			$arr[] = $this->buildJsParam("slider_bullets_offset_vert", self::VALIDATE_NUMERIC, self::TYPE_NUMBER);

			$arr[] = $this->buildJsParam("slider_enable_arrows", null, self::TYPE_BOOLEAN);
			$arr[] = $this->buildJsParam("slider_arrows_skin");
			$arr[] = $this->buildJsParam("slider_arrow_left_align_hor");
			$arr[] = $this->buildJsParam("slider_arrow_left_align_vert");
			$arr[] = $this->buildJsParam("slider_arrow_left_offset_hor", self::VALIDATE_NUMERIC, self::TYPE_NUMBER);
			$arr[] = $this->buildJsParam("slider_arrow_left_offset_vert", self::VALIDATE_NUMERIC, self::TYPE_NUMBER);
			$arr[] = $this->buildJsParam("slider_arrow_right_align_hor");
			$arr[] = $this->buildJsParam("slider_arrow_right_align_vert");
			$arr[] = $this->buildJsParam("slider_arrow_right_offset_hor", self::VALIDATE_NUMERIC, self::TYPE_NUMBER);
			$arr[] = $this->buildJsParam("slider_arrow_right_offset_vert", self::VALIDATE_NUMERIC, self::TYPE_NUMBER);

			$arr[] = $this->buildJsParam("slider_enable_progress_indicator", null, self::TYPE_BOOLEAN);
			$arr[] = $this->buildJsParam("slider_progress_indicator_type");
			$arr[] = $this->buildJsParam("slider_progress_indicator_align_hor");
			$arr[] = $this->buildJsParam("slider_progress_indicator_align_vert");
			$arr[] = $this->buildJsParam("slider_progress_indicator_offset_hor", self::VALIDATE_NUMERIC, self::TYPE_NUMBER);
			$arr[] = $this->buildJsParam("slider_progress_indicator_offset_vert", self::VALIDATE_NUMERIC, self::TYPE_NUMBER);
			
			$arr[] = $this->buildJsParam("slider_progressbar_color");
			$arr[] = $this->buildJsParam("slider_progressbar_opacity", self::FORCE_NUMERIC, self::TYPE_NUMBER);
			$arr[] = $this->buildJsParam("slider_progressbar_line_width", self::VALIDATE_NUMERIC, self::TYPE_NUMBER);
			
			$arr[] = $this->buildJsParam("slider_progresspie_color1");
			$arr[] = $this->buildJsParam("slider_progresspie_color2");
			$arr[] = $this->buildJsParam("slider_progresspie_stroke_width", self::VALIDATE_NUMERIC, self::TYPE_NUMBER);
			$arr[] = $this->buildJsParam("slider_progresspie_width", self::VALIDATE_NUMERIC, self::TYPE_NUMBER);
			$arr[] = $this->buildJsParam("slider_progresspie_height", self::VALIDATE_NUMERIC, self::TYPE_NUMBER);
			
			$arr[] = $this->buildJsParam("slider_enable_play_button", null, self::TYPE_BOOLEAN);
			$arr[] = $this->buildJsParam("slider_play_button_skin");
			$arr[] = $this->buildJsParam("slider_play_button_align_hor");
			$arr[] = $this->buildJsParam("slider_play_button_align_vert");
			$arr[] = $this->buildJsParam("slider_play_button_offset_hor", self::VALIDATE_NUMERIC, self::TYPE_NUMBER);
			$arr[] = $this->buildJsParam("slider_play_button_offset_vert", self::VALIDATE_NUMERIC, self::TYPE_NUMBER);

			$arr[] = $this->buildJsParam("slider_enable_fullscreen_button", null, self::TYPE_BOOLEAN);
			$arr[] = $this->buildJsParam("slider_fullscreen_button_skin");
			$arr[] = $this->buildJsParam("slider_fullscreen_button_align_hor");
			$arr[] = $this->buildJsParam("slider_fullscreen_button_align_vert");
			$arr[] = $this->buildJsParam("slider_fullscreen_button_offset_hor", self::VALIDATE_NUMERIC, self::TYPE_NUMBER);
			$arr[] = $this->buildJsParam("slider_fullscreen_button_offset_vert", self::VALIDATE_NUMERIC, self::TYPE_NUMBER);

			$arr[] = $this->buildJsParam("slider_enable_zoom_panel", null, self::TYPE_BOOLEAN);
			$arr[] = $this->buildJsParam("slider_zoompanel_skin");
			$arr[] = $this->buildJsParam("slider_zoompanel_align_hor");
			$arr[] = $this->buildJsParam("slider_zoompanel_align_vert");
			$arr[] = $this->buildJsParam("slider_zoompanel_offset_hor", self::VALIDATE_NUMERIC, self::TYPE_NUMBER);
			$arr[] = $this->buildJsParam("slider_zoompanel_offset_vert", self::VALIDATE_NUMERIC, self::TYPE_NUMBER);
			
			$arr[] = $this->buildJsParam("slider_enable_text_panel", null, self::TYPE_BOOLEAN);
			$arr[] = $this->buildJsParam("slider_textpanel_always_on", null, self::TYPE_BOOLEAN);
			$arr[] = $this->buildJsParam("slider_textpanel_align");
			$arr[] = $this->buildJsParam("slider_textpanel_margin", self::VALIDATE_NUMERIC, self::TYPE_NUMBER);
			$arr[] = $this->buildJsParam("slider_textpanel_text_valign");
			$arr[] = $this->buildJsParam("slider_textpanel_padding_top", self::VALIDATE_NUMERIC, self::TYPE_NUMBER);
			$arr[] = $this->buildJsParam("slider_textpanel_padding_bottom", self::VALIDATE_NUMERIC, self::TYPE_NUMBER);
			$arr[] = $this->buildJsParam("slider_textpanel_height", self::VALIDATE_NUMERIC, self::TYPE_NUMBER);
			$arr[] = $this->buildJsParam("slider_textpanel_padding_title_description", self::VALIDATE_NUMERIC, self::TYPE_NUMBER);
			$arr[] = $this->buildJsParam("slider_textpanel_padding_right", self::VALIDATE_NUMERIC, self::TYPE_NUMBER);
			$arr[] = $this->buildJsParam("slider_textpanel_padding_left", self::VALIDATE_NUMERIC, self::TYPE_NUMBER);
			$arr[] = $this->buildJsParam("slider_textpanel_fade_duration", self::VALIDATE_NUMERIC, self::TYPE_NUMBER);
			$arr[] = $this->buildJsParam("slider_textpanel_enable_title", null, self::TYPE_BOOLEAN);
			$arr[] = $this->buildJsParam("slider_textpanel_title_as_link", null, self::TYPE_BOOLEAN);
			$arr[] = $this->buildJsParam("slider_textpanel_enable_description", null, self::TYPE_BOOLEAN);
			$arr[] = $this->buildJsParam("slider_textpanel_enable_bg", null, self::TYPE_BOOLEAN);
			$arr[] = $this->buildJsParam("slider_textpanel_bg_color");
			$arr[] = $this->buildJsParam("slider_textpanel_bg_opacity", self::FORCE_NUMERIC, self::TYPE_NUMBER);
			
			$arr[] = $this->buildJsParam("thumb_width", self::VALIDATE_NUMERIC, self::TYPE_NUMBER);
			$arr[] = $this->buildJsParam("thumb_height", self::VALIDATE_NUMERIC, self::TYPE_NUMBER);
			$arr[] = $this->buildJsParam("thumb_fixed_size", null, self::TYPE_BOOLEAN);
			$arr[] = $this->buildJsParam("thumb_border_effect", null, self::TYPE_BOOLEAN);
			$arr[] = $this->buildJsParam("thumb_border_width", self::VALIDATE_NUMERIC, self::TYPE_NUMBER);
			$arr[] = $this->buildJsParam("thumb_border_color");
			$arr[] = $this->buildJsParam("thumb_over_border_width", self::VALIDATE_NUMERIC, self::TYPE_NUMBER);
			$arr[] = $this->buildJsParam("thumb_over_border_color");
			$arr[] = $this->buildJsParam("thumb_selected_border_width", self::VALIDATE_NUMERIC, self::TYPE_NUMBER);
			$arr[] = $this->buildJsParam("thumb_selected_border_color");
			$arr[] = $this->buildJsParam("thumb_round_corners_radius", self::VALIDATE_NUMERIC, self::TYPE_NUMBER);
			$arr[] = $this->buildJsParam("thumb_color_overlay_effect", null, self::TYPE_BOOLEAN);
			$arr[] = $this->buildJsParam("thumb_overlay_color");
			$arr[] = $this->buildJsParam("thumb_overlay_opacity", self::FORCE_NUMERIC, self::TYPE_NUMBER);
			$arr[] = $this->buildJsParam("thumb_overlay_reverse", null, self::TYPE_BOOLEAN);
			$arr[] = $this->buildJsParam("thumb_image_overlay_effect", null, self::TYPE_BOOLEAN);
			$arr[] = $this->buildJsParam("thumb_image_overlay_type");
			$arr[] = $this->buildJsParam("thumb_transition_duration", self::VALIDATE_NUMERIC, self::TYPE_NUMBER);
			$arr[] = $this->buildJsParam("thumb_transition_easing");
			$arr[] = $this->buildJsParam("thumb_show_loader", null, self::TYPE_BOOLEAN);
			$arr[] = $this->buildJsParam("thumb_loader_type");
			
			$arr[] = $this->buildJsParam("strippanel_padding_top", self::VALIDATE_NUMERIC, self::TYPE_NUMBER);
			$arr[] = $this->buildJsParam("strippanel_padding_bottom", self::VALIDATE_NUMERIC, self::TYPE_NUMBER);
			$arr[] = $this->buildJsParam("strippanel_padding_left", self::VALIDATE_NUMERIC, self::TYPE_NUMBER);
			$arr[] = $this->buildJsParam("strippanel_padding_right", self::VALIDATE_NUMERIC, self::TYPE_NUMBER);
			$arr[] = $this->buildJsParam("strippanel_enable_buttons", null, self::TYPE_BOOLEAN);
			$arr[] = $this->buildJsParam("strippanel_buttons_skin");
			$arr[] = $this->buildJsParam("strippanel_padding_buttons", self::VALIDATE_NUMERIC, self::TYPE_NUMBER);
			$arr[] = $this->buildJsParam("strippanel_buttons_role");
			$arr[] = $this->buildJsParam("strippanel_enable_handle", null, self::TYPE_BOOLEAN);
			$arr[] = $this->buildJsParam("strippanel_handle_align");
			$arr[] = $this->buildJsParam("strippanel_handle_offset", self::VALIDATE_NUMERIC, self::TYPE_NUMBER);
			$arr[] = $this->buildJsParam("strippanel_handle_skin");
			$arr[] = $this->buildJsParam("strippanel_background_color");
			$arr[] = $this->buildJsParam("strip_thumbs_align");
			$arr[] = $this->buildJsParam("strip_space_between_thumbs", self::VALIDATE_NUMERIC, self::TYPE_NUMBER);
			$arr[] = $this->buildJsParam("strip_thumb_touch_sensetivity", self::VALIDATE_NUMERIC, self::TYPE_NUMBER);
			$arr[] = $this->buildJsParam("strip_scroll_to_thumb_duration", self::VALIDATE_NUMERIC, self::TYPE_NUMBER);
			$arr[] = $this->buildJsParam("strip_scroll_to_thumb_easing");
			$arr[] = $this->buildJsParam("strip_control_avia", null, self::TYPE_BOOLEAN);
			$arr[] = $this->buildJsParam("strip_control_touch", null, self::TYPE_BOOLEAN);
			
			$arr[] = $this->buildJsParam("gridpanel_vertical_scroll", null, self::TYPE_BOOLEAN);
			$arr[] = $this->buildJsParam("gridpanel_grid_align");
			$arr[] = $this->buildJsParam("gridpanel_padding_border_top", self::VALIDATE_NUMERIC, self::TYPE_NUMBER);
			$arr[] = $this->buildJsParam("gridpanel_padding_border_bottom", self::VALIDATE_NUMERIC, self::TYPE_NUMBER);
			$arr[] = $this->buildJsParam("gridpanel_padding_border_left", self::VALIDATE_NUMERIC, self::TYPE_NUMBER);
			$arr[] = $this->buildJsParam("gridpanel_padding_border_right", self::VALIDATE_NUMERIC, self::TYPE_NUMBER);
			$arr[] = $this->buildJsParam("gridpanel_arrows_skin");
			$arr[] = $this->buildJsParam("gridpanel_arrows_align_vert");
			$arr[] = $this->buildJsParam("gridpanel_arrows_padding_vert", self::VALIDATE_NUMERIC, self::TYPE_NUMBER);
			$arr[] = $this->buildJsParam("gridpanel_arrows_align_hor");
			$arr[] = $this->buildJsParam("gridpanel_arrows_padding_hor", self::VALIDATE_NUMERIC, self::TYPE_NUMBER);
			$arr[] = $this->buildJsParam("gridpanel_space_between_arrows", self::VALIDATE_NUMERIC, self::TYPE_NUMBER);
			$arr[] = $this->buildJsParam("gridpanel_arrows_always_on", null, self::TYPE_BOOLEAN);
			$arr[] = $this->buildJsParam("gridpanel_enable_handle", null, self::TYPE_BOOLEAN);
			$arr[] = $this->buildJsParam("gridpanel_handle_align");
			$arr[] = $this->buildJsParam("gridpanel_handle_offset", self::VALIDATE_NUMERIC, self::TYPE_NUMBER);
			$arr[] = $this->buildJsParam("gridpanel_handle_skin");
			$arr[] = $this->buildJsParam("gridpanel_background_color");
			
			$arr[] = $this->buildJsParam("grid_panes_direction");
			$arr[] = $this->buildJsParam("grid_num_cols", self::VALIDATE_NUMERIC, self::TYPE_NUMBER);
			$arr[] = $this->buildJsParam("grid_space_between_cols", self::VALIDATE_NUMERIC, self::TYPE_NUMBER);
			$arr[] = $this->buildJsParam("grid_space_between_rows", self::VALIDATE_NUMERIC, self::TYPE_NUMBER);
			$arr[] = $this->buildJsParam("grid_transition_duration", self::VALIDATE_NUMERIC, self::TYPE_NUMBER);
			$arr[] = $this->buildJsParam("grid_transition_easing");
			$arr[] = $this->buildJsParam("grid_carousel", null, self::TYPE_BOOLEAN);

			//category tabs related
			$arr[] = $this->buildJsParam("gallery_urlajax");
			$arr[] = $this->buildJsParam("gallery_enable_tabs", null, self::TYPE_BOOLEAN);
			$arr[] = $this->buildJsParam("tabs_type");
			$arr[] = $this->buildJsParam("tabs_container");
			$arr[] = $this->buildJsParam("gallery_initial_catid");
			$arr[] = $this->buildJsParam("load_api_externally", null, self::TYPE_BOOLEAN);
			
			$arr[] = $this->buildJsParam("gallery_enable_loadmore", null, self::TYPE_BOOLEAN);
			$arr[] = $this->buildJsParam("loadmore_container");
			
				
			$arr[] = $this->buildJsParam("tile_width", self::VALIDATE_NUMERIC, self::TYPE_NUMBER);
			$arr[] = $this->buildJsParam("tile_height", self::VALIDATE_NUMERIC, self::TYPE_NUMBER);
			$arr[] = $this->buildJsParam("tile_enable_background", null, self::TYPE_BOOLEAN);
			$arr[] = $this->buildJsParam("tile_background_color");
			$arr[] = $this->buildJsParam("tile_enable_border", null, self::TYPE_BOOLEAN);
			$arr[] = $this->buildJsParam("tile_border_width", self::VALIDATE_NUMERIC, self::TYPE_NUMBER);
			$arr[] = $this->buildJsParam("tile_border_color");
			$arr[] = $this->buildJsParam("tile_border_radius", self::VALIDATE_NUMERIC, self::TYPE_NUMBER);
			$arr[] = $this->buildJsParam("tile_enable_outline", null, self::TYPE_BOOLEAN);
			$arr[] = $this->buildJsParam("tile_outline_color");
			$arr[] = $this->buildJsParam("tile_enable_shadow", null, self::TYPE_BOOLEAN);
			$arr[] = $this->buildJsParam("tile_shadow_h", self::VALIDATE_NUMERIC, self::TYPE_NUMBER);
			$arr[] = $this->buildJsParam("tile_shadow_v", self::VALIDATE_NUMERIC, self::TYPE_NUMBER);
			$arr[] = $this->buildJsParam("tile_shadow_blur", self::VALIDATE_NUMERIC, self::TYPE_NUMBER);
			$arr[] = $this->buildJsParam("tile_shadow_spread", self::VALIDATE_NUMERIC, self::TYPE_NUMBER);
			$arr[] = $this->buildJsParam("tile_shadow_color");
			$arr[] = $this->buildJsParam("tile_enable_action");
			$arr[] = $this->buildJsParam("tile_as_link", null, self::TYPE_BOOLEAN);
			$arr[] = $this->buildJsParam("tile_link_newpage", null, self::TYPE_BOOLEAN);
			$arr[] = $this->buildJsParam("tile_enable_overlay", null, self::TYPE_BOOLEAN);
			$arr[] = $this->buildJsParam("tile_overlay_opacity", self::FORCE_NUMERIC, self::TYPE_NUMBER);
			$arr[] = $this->buildJsParam("tile_overlay_color");
			$arr[] = $this->buildJsParam("tile_enable_icons", null, self::TYPE_BOOLEAN);
			$arr[] = $this->buildJsParam("tile_show_link_icon", null, self::TYPE_BOOLEAN);
			$arr[] = $this->buildJsParam("tile_space_between_icons");
			$arr[] = $this->buildJsParam("tile_videoplay_icon_always_on");
			$arr[] = $this->buildJsParam("tile_enable_image_effect", null, self::TYPE_BOOLEAN);
			$arr[] = $this->buildJsParam("tile_image_effect_type");
			$arr[] = $this->buildJsParam("tile_image_effect_reverse", null, self::TYPE_BOOLEAN);
			$arr[] = $this->buildJsParam("tile_enable_textpanel", null, self::TYPE_BOOLEAN);
			$arr[] = $this->buildJsParam("tile_textpanel_source");
			$arr[] = $this->buildJsParam("tile_textpanel_position");
			
			$arr[] = $this->buildJsParam("tile_textpanel_always_on", null, self::TYPE_BOOLEAN);
			$arr[] = $this->buildJsParam("tile_textpanel_appear_type");
			$arr[] = $this->buildJsParam("tile_textpanel_offset", self::VALIDATE_NUMERIC, self::TYPE_NUMBER);
			$arr[] = $this->buildJsParam("tile_textpanel_padding_top", self::VALIDATE_NUMERIC, self::TYPE_NUMBER);
			$arr[] = $this->buildJsParam("tile_textpanel_padding_bottom", self::VALIDATE_NUMERIC, self::TYPE_NUMBER);
			$arr[] = $this->buildJsParam("tile_textpanel_padding_left", self::VALIDATE_NUMERIC, self::TYPE_NUMBER);
			$arr[] = $this->buildJsParam("tile_textpanel_padding_right", self::VALIDATE_NUMERIC, self::TYPE_NUMBER);
			$arr[] = $this->buildJsParam("tile_textpanel_bg_color");
			$arr[] = $this->buildJsParam("tile_textpanel_bg_opacity", self::FORCE_NUMERIC, self::TYPE_NUMBER);
			$arr[] = $this->buildJsParam("tile_textpanel_title_color");
			$arr[] = $this->buildJsParam("tile_textpanel_title_text_align");
			$arr[] = $this->buildJsParam("tile_textpanel_title_font_size", self::VALIDATE_NUMERIC, self::TYPE_NUMBER);
			$arr[] = $this->buildJsParam("tile_textpanel_title_bold", null, self::TYPE_BOOLEAN);
			$arr[] = $this->buildJsParam("tile_textpanel_desc_bold", null, self::TYPE_BOOLEAN);

			$arr[] = $this->buildJsParam("lightbox_hide_arrows_onvideoplay", null, self::TYPE_BOOLEAN);
			$arr[] = $this->buildJsParam("lightbox_slider_control_swipe", null, self::TYPE_BOOLEAN);
			$arr[] = $this->buildJsParam("lightbox_slider_control_zoom", null, self::TYPE_BOOLEAN);
			$arr[] = $this->buildJsParam("lightbox_close_on_emptyspace", null, self::TYPE_BOOLEAN);
			
			$arr[] = $this->buildJsParam("lightbox_slider_zoom_max_ratio", self::VALIDATE_NUMERIC, self::TYPE_NUMBER);
			$arr[] = $this->buildJsParam("lightbox_slider_transition");
			$arr[] = $this->buildJsParam("lightbox_overlay_opacity", self::FORCE_NUMERIC, self::TYPE_NUMBER);
			$arr[] = $this->buildJsParam("lightbox_overlay_color");
			
			$arr[] = $this->buildJsParam("lightbox_top_panel_opacity", self::FORCE_NUMERIC, self::TYPE_NUMBER);
			$arr[] = $this->buildJsParam("lightbox_show_numbers", null, self::TYPE_BOOLEAN);
			$arr[] = $this->buildJsParam("lightbox_numbers_size", self::VALIDATE_NUMERIC, self::TYPE_NUMBER);
			$arr[] = $this->buildJsParam("lightbox_numbers_color");
			$arr[] = $this->buildJsParam("lightbox_show_textpanel", null, self::TYPE_BOOLEAN);
			
			$arr[] = $this->buildJsParam("lightbox_textpanel_width", self::VALIDATE_NUMERIC, self::TYPE_NUMBER);
			$arr[] = $this->buildJsParam("lightbox_textpanel_enable_title", null, self::TYPE_BOOLEAN);
			$arr[] = $this->buildJsParam("lightbox_textpanel_enable_description", null, self::TYPE_BOOLEAN);
			
			$arr[] = $this->buildJsParam("lightbox_textpanel_title_color");
			$arr[] = $this->buildJsParam("lightbox_textpanel_title_text_align");
			$arr[] = $this->buildJsParam("lightbox_textpanel_title_font_size", self::VALIDATE_NUMERIC, self::TYPE_NUMBER);
			$arr[] = $this->buildJsParam("lightbox_textpanel_title_bold", null, self::TYPE_BOOLEAN);
			
			$arr[] = $this->buildJsParam("lightbox_textpanel_desc_color");
			$arr[] = $this->buildJsParam("lightbox_textpanel_desc_text_align");
			$arr[] = $this->buildJsParam("lightbox_textpanel_desc_font_size", self::VALIDATE_NUMERIC, self::TYPE_NUMBER);
			$arr[] = $this->buildJsParam("lightbox_textpanel_desc_bold", null, self::TYPE_BOOLEAN);
			
			//lightbox compact related styles
			$arr[] = $this->buildJsParam("lightbox_type");
			$arr[] = $this->buildJsParam("lightbox_arrows_position");
			$arr[] = $this->buildJsParam("lightbox_arrows_inside_alwayson", null, self::TYPE_BOOLEAN);
			$arr[] = $this->buildJsParam("lightbox_numbers_padding_top", self::VALIDATE_NUMERIC, self::TYPE_NUMBER);
			$arr[] = $this->buildJsParam("lightbox_numbers_padding_right", self::VALIDATE_NUMERIC, self::TYPE_NUMBER);
			$arr[] = $this->buildJsParam("lightbox_textpanel_padding_left", self::VALIDATE_NUMERIC, self::TYPE_NUMBER);
			$arr[] = $this->buildJsParam("lightbox_textpanel_padding_right", self::VALIDATE_NUMERIC, self::TYPE_NUMBER);
			$arr[] = $this->buildJsParam("lightbox_textpanel_padding_top", self::VALIDATE_NUMERIC, self::TYPE_NUMBER);
			$arr[] = $this->buildJsParam("lightbox_slider_image_border", null, self::TYPE_BOOLEAN);
			$arr[] = $this->buildJsParam("lightbox_slider_image_border_width", self::VALIDATE_NUMERIC, self::TYPE_NUMBER);
			$arr[] = $this->buildJsParam("lightbox_slider_image_border_color");
			$arr[] = $this->buildJsParam("lightbox_slider_image_border_radius", self::VALIDATE_NUMERIC, self::TYPE_NUMBER);
			$arr[] = $this->buildJsParam("lightbox_slider_image_shadow", null, self::TYPE_BOOLEAN);

			
			$arr = $this->buildThemeRelatedJSParams($arr);
			
			
			
			return($arr);
		}
		
	
		/**
		 * get original params
		 */
		private function getOriginalParams($data){
					
			$arrParams = array();
			
			foreach($data as $key => $value){
			
				if(array_key_exists($key, $this->arrJsParamsAssoc) == false)
					continue;
					
				$arrParams[$key] = $value;
			}
			
			return($arrParams);
		}

	
	/**
	 * modify the params
	 */
	private function modifyParams(){
		
		$galleryTheme = UniteFunctionsUC::getVal($this->arrParams, "gallery_theme");
		
		switch($galleryTheme){
			case "tiles_columns":
				$this->arrParams["gallery_theme"] = "tiles";
				$this->arrParams["tiles_type"] = "columns";
			break;
			case "tiles_justified":
				$this->arrParams["gallery_theme"] = "tiles";
				$this->arrParams["tiles_type"] = "justified";
			break;
		}
		
	}
	
	
	/**
	 * set params by original params, and that not default
	 */
	private function setParams($data, $addon){
		
		//set the gallery theme
		
		$this->galleryType = UniteFunctionsUC::getVal($data, "gallery_theme");
		
		$this->validateGalleryType($this->galleryType);
				
		$this->buildJSOptions();
		
		$arrDefaultValues = $addon->getParamsDefaultValuesAssoc();
		
		$arrMustKeys = $this->getArrMustFields();
		
		$arrOriginalParams = $this->getOriginalParams($data);
				
		$this->arrParams = UniteFunctionsUC::getDiffArrItems($arrOriginalParams, $arrDefaultValues, $arrMustKeys);

		$this->modifyParams();
		
	}
	
	/**
	 * get the js output of the params
	 */
	private function getJSOutput(){

		if(empty($this->arrParams))
			return("");
		
		
		$jsOutput = "";
		$counter = 0;
		$tabs = "								";
		
		foreach($this->arrJsParams as $arrParam){
			
			$name = $arrParam["name"];
			$validate = $arrParam["validate"];
			$type = $arrParam["type"];
			$replaceName = $arrParam["replace"];
			
			if(array_key_exists($name, $this->skipJsOptions) == true)
				continue;

			$isExists = $this->isParamExists($name);
			
			if($isExists == false)
				continue;
			
			$value = $this->getParam($name, $validate);
			
			$putInBrackets = false;
			switch($type){
				case self::TYPE_NUMBER:
				case self::TYPE_BOOLEAN:
				case self::TYPE_OBJECT:
				break;
				case self::TYPE_SIZE:
					if(strpos($value, "%") !== 0)
						$putInBrackets = true;
				break;
				default:	//string
					$putInBrackets = true;						
				break;
			}

			if($putInBrackets == true){
				$value = str_replace('"','\\"', $value);
				$value = '"'.$value.'"';
			}
			
			if($counter > 0)
				$jsOutput .= ",\n".$tabs;
				
			if(!empty($replaceName))
				$name = $replaceName;
			
			$jsOutput .= "{$name}:{$value}";

			$counter++;
		}
	
		$jsOutput .= "\n";
		
		
		return($jsOutput);
	}
	
	
	/**
	 * get gallery js settings from data
	 */
	public function getUniteGalleryJsSettings($data, UniteCreatorAddon $addon){
		
		$this->setParams($data, $addon);
		
		$jsOutput = $this->getJSOutput();
		
		return($jsOutput);
	}
	
		/**
		 * put unite gallery item html
		 */
		public static function getUniteGalleryHtmlItem($item){
			
			$type = UniteFunctionsUC::getVal($item, "type");
			$title = UniteFunctionsUC::getVal($item, "title");
			$link = UniteFunctionsUC::getVal($item, "link");
			$image = UniteFunctionsUC::getVal($item, "image");
			$thumb = UniteFunctionsUC::getVal($item, "thumb");
			$description = UniteFunctionsUC::getVal($item, "description");
			
			$linkStart = "";
			$linkEnd = "";
			
			if(!empty($link)){
				$link = esc_url($link);
				$linkStart = "<a href=\"{$link}\">";
				$linkEnd = "</a>";
			}

			$nl = "\n";
			
			$html = "";
			
			if($linkStart)
				$html .= $nl.$linkStart;
			
			$title = UniteFunctionsUC::sanitize($title, UniteFunctionsUC::SANITIZE_ATTR);
			$description = UniteFunctionsUC::sanitize($description, UniteFunctionsUC::SANITIZE_ATTR);
			
			$image = UniteFunctionsUC::sanitize($image, UniteFunctionsUC::SANITIZE_URL);
			$thumb = UniteFunctionsUC::sanitize($thumb, UniteFunctionsUC::SANITIZE_URL);
			
			$html .= $nl."<img alt=\"{$title}\"";
			$html .= $nl."   src=\"$thumb\"";
			
			if(!empty($image)){
				$image = esc_attr($image);
				$html .= $nl."    data-image=\"$image\"";
			}
			
			if(!empty($title)){
								
				$title = esc_attr($title);
				$html .= $nl."    data-title=\"$title\"";
			}
			
			if(!empty($description)){
								
				$html .= $nl."    data-description=\"$description\"";
			}
			
			if($type != "image"){
				$type = esc_attr($type);
				$html .= $nl."    data-type=\"$type\"";
			}

			$videoID = null;
			
			switch($type){
				
				case "youtube":
					$videoID = UniteFunctionsUC::getVal($item, "videoid");
					$videoID = UniteFunctionsUC::sanitize($videoID, UniteFunctionsUC::SANITIZE_YOUTUBE);
										
				break;
				case "vimeo":
					$videoID = UniteFunctionsUC::getVal($item, "videoid");
					$videoID = UniteFunctionsUC::sanitize($videoID, UniteFunctionsUC::SANITIZE_VIMEO);
										
				break;
				case "wistia":
										
					$videoID = UniteFunctionsUC::getVal($item, "videoid");
					$videoID = UniteFunctionsUC::sanitize($videoID, UniteFunctionsUC::SANITIZE_WISTIA);
					
				break;
				case "html5video":
					
					$urlMp4 = UniteFunctionsUC::getVal($item, "url_mp4");
					
					$urlMp4 = UniteFunctionsUC::sanitize($urlMp4, UniteFunctionsUC::SANITIZE_URL);
					$urlMp4 = esc_attr($urlMp4);
					
					if(!empty($urlMp4))
						$html .= $nl."    data-videomp4=\"$urlMp4\"";
					
				break;
				case "iframe":
					
					$urlVideo = UniteFunctionsUC::getVal($item, "url_video");
										
					$urlVideo = UniteFunctionsUC::sanitize($urlVideo, UniteFunctionsUC::SANITIZE_URL);
										
					$urlVideo = esc_attr($urlVideo);
					
					if(!empty($urlVideo))
						$html .= $nl."    data-videourl=\"$urlVideo\"";
						
				break;
			}

			
			//youtube / vimeo / wistia
			
			if(!empty($videoID))
				$html .= $nl."    data-videoid=\"$videoID\"";
			
			
			$html .= ">";	//image end
							
			if(!empty($linkEnd))	
				$html .= $linkEnd;
							
			return($html);
		}
	
	
}