<?php

/**

 * @author    ThemePunch <info@themepunch.com>

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

 * @copyright 2015 ThemePunch

 */



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



class RevSliderSlider extends RevSliderElementsBase{



	const DEFAULT_POST_SORTBY = "ID";

	const DEFAULT_POST_SORTDIR = "DESC";

	

	const VALIDATE_NUMERIC = "numeric";

	const VALIDATE_EMPTY = "empty";

	const FORCE_NUMERIC = "force_numeric";

	

	const SLIDER_TYPE_GALLERY = "gallery";

	const SLIDER_TYPE_POSTS = "posts";

	const SLIDER_TYPE_TEMPLATE = "template";

	const SLIDER_TYPE_ALL = "all";

	

	private $slider_version = 5;

	private $id;

	private $title;

	private $alias;

	private $arrParams;

	private $settings;

	private $arrSlides = array();

	

	public function __construct(){

		parent::__construct();

	}

	

	

	/**

	 * 

	 * return if the slider is inited or not

	 */

	public function isInited(){

		if(!empty($this->id))

			return(true);

			

		return(false);

	}

	

	

	/**

	 * 

	 * validate that the slider is inited. if not - throw error

	 */

	private function validateInited(){

		if(empty($this->id))

			RevSliderFunctions::throwError("The slider is not initialized!");

	}

	

	/**

	 * init slider by db data

	 */

	public function initByDBData($arrData){

		

		$this->id = $arrData["id"];

		$this->title = $arrData["title"];

		$this->alias = $arrData["alias"];

		

		$settings = $arrData["settings"];

		$settings = (array)json_decode($settings);

		

		$this->settings = $settings;

		

		$params = $arrData["params"];

		$params = (array)json_decode($params);

		$params = RevSliderBase::translate_settings_to_v5($params);

		

		$this->arrParams = $params;

	}

	

	

	/**

	 * 

	 * init the slider object by database id

	 */

	public function initByID($sliderID){

		RevSliderFunctions::validateNumeric($sliderID,"Slider ID");

		

		try{

			$sliderData = $this->db->fetchSingle(RevSliderGlobals::$table_sliders, $this->db->prepare("id = %s", array($sliderID)));

		}catch(Exception $e){

			$message = $e->getMessage();

			echo $message;

			exit;

		}

		

		$this->initByDBData($sliderData);

	}



	/**

	 * 

	 * init slider by alias

	 */

	public function initByAlias($alias){



		try{

			$where = $this->db->prepare("alias = %s  AND `type` != 'template'", array($alias));

			

			$sliderData = $this->db->fetchSingle(RevSliderGlobals::$table_sliders,$where);

			

		}catch(Exception $e){

			$arrAliases = $this->getAllSliderAliases();

			$strAliases = "";

			

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

				$arrAliases = array_slice($arrAliases, 0, 6); //show 6 other, will be enough

				

				$strAliases = "'".sanitize_text_field(implode("' or '", $arrAliases))."'";

			}

				

			$errorMessage = 'Slider with alias <strong>'.sanitize_text_field(esc_attr($alias)).'</strong> not found.';

			if(!empty($strAliases))

				$errorMessage .= ' <br>Maybe you mean: '.$strAliases;

				

			RevSliderFunctions::throwError($errorMessage);

		}

		

		$this->initByDBData($sliderData);

	}

	

	

	/**

	 * 

	 * init by id or alias

	 */

	public function initByMixed($mixed){

		if(is_numeric($mixed))

			$this->initByID($mixed);

		else

			$this->initByAlias($mixed);

	}

	

	

	/**

	 * 

	 * get data functions

	 */

	public function getTitle(){

		return($this->title);

	}

	

	public function getID(){

		return($this->id);

	}

	

	public function getParams(){

		return($this->arrParams);

	}

	

	/*

	 * return Slider settings

	 * @since: 5.0

	 */

	public function getSettings(){

		return($this->settings);

	}

	

	/*

	 * return true if slider is favorite

	 * @since: 5.0

	 */

	public function isFavorite(){

		if(!empty($this->settings)){

			if(isset($this->settings['favorite']) && $this->settings['favorite'] == 'true') return true;

		}

		

		return false;

	}

	

	/**

	 * 

	 * set slider params

	 */

	public function setParams($arrParams){

		$this->arrParams = $arrParams;

	}

	

	

	/**

	 * set specific slider param

	 * @since: 5.1.1

	 */

	public function setParam($param, $value){

		$this->arrParams[$param] = $value;

	}

	

	

	/**

	 * 

	 * get parameter from params array. if no default, then the param is a must!

	 */

	function getParam($name,$default=null,$validateType = null,$title=""){

		

		if($default === null){

			$default = "";

		}

		

		$value = RevSliderFunctions::getVal($this->arrParams, $name,$default);

		

		//validation:

		switch($validateType){

			case self::VALIDATE_NUMERIC:

			case self::VALIDATE_EMPTY:

				$paramTitle = !empty($title)?$title:$name;

				if($value !== "0" && $value !== 0 && empty($value))

					RevSliderFunctions::throwError("The param <strong>$paramTitle</strong> should not be empty.");

			break;

			case self::VALIDATE_NUMERIC:

				$paramTitle = !empty($title)?$title:$name;

				if(!is_numeric($value))

					RevSliderFunctions::throwError("The param <strong>$paramTitle</strong> should be numeric. Now it's: $value");

			break;

			case self::FORCE_NUMERIC:

				if(!is_numeric($value)){

					$value = 0;

					if(!empty($default))

						$value = $default;

				}

			break; 

		}

		

		return $value;

	}

	

	public function getAlias(){

		return($this->alias);

	}

	

	/**

	 * get combination of title (alias)

	 */

	public function getShowTitle(){

		$showTitle = $this->title;

		return($showTitle);

	}

	

	/**

	 * 

	 * get slider shortcode

	 */

	public function getShortcode(){

		$shortCode = '[rev_slider alias="'.$this->alias.'"]';

		return($shortCode);

	}

	

	

	/**

	 * 

	 * check if alias exists in DB

	 */

	public function isAliasExistsInDB($alias){

		

		$where = $this->db->prepare("alias = %s ", array($alias));

		if(!empty($this->id)){

			

			$where .= $this->db->prepare(" and id != %s  AND `type` != 'template'", array($this->id));

		}

		

		

		$response = $this->db->fetch(RevSliderGlobals::$table_sliders,$where);

		

		return(!empty($response));

		

	}

	

	

	/**

	 * 

	 * check if alias exists in DB

	 */

	public static function isAliasExists($alias){

		global $wpdb;

		

		$response = $wpdb->get_row($wpdb->prepare("SELECT * FROM ".RevSliderGlobals::$table_sliders." WHERE alias = %s AND `type` != 'template'", $alias));

		

		return(!empty($response));

	}

	

	

	/**

	 * 

	 * validate settings for add

	 */

	private function validateInputSettings($title,$alias,$params){

		RevSliderFunctions::validateNotEmpty($title,"title");

		RevSliderFunctions::validateNotEmpty($alias,"alias");

		

		if($this->isAliasExistsInDB($alias))

			RevSliderFunctions::throwError("Some other slider with alias '$alias' already exists");

		

	}

	

	

	/**

	 * set new hero slide id for the Slider

	 * @since: 5.0

	 */

	public function setHeroSlide($data){

		$sliderID = RevSliderFunctions::getVal($data, "slider_id");

		RevSliderFunctions::validateNotEmpty($sliderID,"Slider ID");

		$this->initByID($sliderID);



		$new_slide_id = RevSliderFunctions::getVal($data, "slide_id");

		RevSliderFunctions::validateNotEmpty($new_slide_id,"Hero Slide ID");

		

		$this->updateParam(array('hero_active' => intval($new_slide_id)));

		

		return($new_slide_id);

	}

	

	/**

	 * 

	 * create / update slider from options

	 */

	private function createUpdateSliderFromOptions($options, $sliderID = null){

		

		$arrMain = RevSliderFunctions::getVal($options, "main");

		$params = RevSliderFunctions::getVal($options, "params");

		

		//trim all input data

		$arrMain = RevSliderFunctions::trimArrayItems($arrMain);

		

		$params = RevSliderFunctions::trimArrayItems($params);

		

		$params = array_merge($arrMain,$params);

		

		$title = sanitize_text_field(RevSliderFunctions::getVal($arrMain, "title"));

		$alias = sanitize_text_field(RevSliderFunctions::getVal($arrMain, "alias"));

		

		//params css and js check

		if(!RevSliderFunctionsWP::isAdminUser() && apply_filters('revslider_restrict_role', true)){

			//dont allow css and javascript from users other than administrator

			unset($params['custom_css']);

			unset($params['custom_javascript']);

		}

		

		if(!empty($sliderID)){

			$this->initByID($sliderID);

			

			if(!RevSliderFunctionsWP::isAdminUser() && apply_filters('revslider_restrict_role', true)){

				//check for js and css, add it to $params

				$params['custom_css'] = $this->getParam('custom_css', '');

				$params['custom_javascript'] = $this->getParam('custom_javascript', '');

			}

			

		}

		

		$this->validateInputSettings($title, $alias, $params);

		

		$jsonParams = json_encode($params);

		

		//insert slider to database

		$arrData = array();

		$arrData["title"] = $title;

		$arrData["alias"] = $alias;

		$arrData["params"] = $jsonParams;

		$arrData["type"] = '';

		

		if(empty($sliderID)){	//create slider	

			

			$arrData['settings'] = json_encode(array('version' => 5.0));

			

			$sliderID = $this->db->insert(RevSliderGlobals::$table_sliders,$arrData);

			return($sliderID);

			

		}else{	//update slider

			$this->initByID($sliderID);

			

			$settings = $this->getSettings();

			$settings['version'] = 5.0;

			$arrData['settings'] = json_encode($settings);

			

			$sliderID = $this->db->update(RevSliderGlobals::$table_sliders,$arrData,array("id"=>$sliderID));

		}

	}

	

	

	/**

	 * delete slider from datatase

	 */

	public function deleteSlider(){

		

		$this->validateInited();

		

		//delete slider

		$this->db->delete(RevSliderGlobals::$table_sliders, $this->db->prepare("id = %s", array($this->id)));

		

		//delete slides

		$this->deleteAllSlides();

		$this->deleteStaticSlide();

	}



	/**

	 * 

	 * delete all slides

	 */

	private function deleteAllSlides(){

		$this->validateInited();

		

		$this->db->delete(RevSliderGlobals::$table_slides, $this->db->prepare("slider_id = %s", array($this->id)));

		

		do_action('revslider_slider_deleteAllSlides', $this->id);

	}

	



	/**

	 * 

	 * delete all slides

	 */

	public function deleteStaticSlide(){

		$this->validateInited();

		

		$this->db->delete(RevSliderGlobals::$table_static_slides, $this->db->prepare("slider_id = %s", array($this->id)));

	}

	

	

	/**

	 * 

	 * get all slide children

	 */

	public function getArrSlideChildren($slideID){

	

		$this->validateInited();

		$arrSlides = $this->getSlidesFromGallery();

		if(!isset($arrSlides[$slideID]))

			RevSliderFunctions::throwError("Slide with id: $slideID not found in the main slides of the slider. Maybe it's child slide.");

		

		$slide = $arrSlides[$slideID];

		$arrChildren = $slide->getArrChildren();

		

		return($arrChildren);

	}

	

	

	/**

	 * 

	 * duplicate slider in datatase

	 */

	private function duplicateSlider($title = false, $prefix = false){

		

		$this->validateInited();

		

		//insert a new slider

		$sqlSelect = $this->db->prepare("select ".RevSliderGlobals::FIELDS_SLIDER." from ".RevSliderGlobals::$table_sliders." where id = %s", array($this->id));

		$sqlInsert = "insert into ".RevSliderGlobals::$table_sliders." (".RevSliderGlobals::FIELDS_SLIDER.") ($sqlSelect)";

		

		$this->db->runSql($sqlInsert);

		$lastID = $this->db->getLastInsertID();

		RevSliderFunctions::validateNotEmpty($lastID);

		

		

		$params = $this->arrParams;

		

		if($title === false){

			//get slider number:

			$response = $this->db->fetch(RevSliderGlobals::$table_sliders);

			$numSliders = count($response);

			$newSliderSerial = $numSliders+1;

			

			$newSliderTitle = "Slider".$newSliderSerial;

			$newSliderAlias = "slider".$newSliderSerial;

		}else{

			if($prefix !== false){

				$newSliderTitle = sanitize_text_field($title.' '.$params['title']);

				$newSliderAlias = sanitize_title($title.' '.$params['title']);

			}else{

				$newSliderTitle = sanitize_text_field($title);

				$newSliderAlias = sanitize_title($title);

			}

			// Check Duplicate Alias

			$sqlTitle = $this->db->fetch(RevSliderGlobals::$table_sliders, $this->db->prepare("alias = %s", array($newSliderAlias)));

			if(!empty($sqlTitle)){

				$response = $this->db->fetch(RevSliderGlobals::$table_sliders);

				$numSliders = count($response);

				$newSliderSerial = $numSliders+1;

				$newSliderTitle .= $newSliderSerial;

				$newSliderAlias .= $newSliderSerial;	

			}

		}

		

		//update params

		

		$params["title"] = $newSliderTitle;

		$params["alias"] = $newSliderAlias;

		$params["shortcode"] = "[rev_slider alias=\"". $newSliderAlias ."\"]";

		

		//update the new slider with the title and the alias values

		$arrUpdate = array();

		$arrUpdate["title"] = $newSliderTitle;

		$arrUpdate["alias"] = $newSliderAlias;

		

		



		$jsonParams = json_encode($params);

		$arrUpdate["params"] = $jsonParams;



		$arrUpdate["type"] = '';//remove the type as we do not want it to be template if it was



		$this->db->update(RevSliderGlobals::$table_sliders, $arrUpdate, array("id"=>$lastID));

		

		//duplicate Slides

		$slides = $this->db->fetch(RevSliderGlobals::$table_slides, $this->db->prepare("slider_id = %s", array($this->id)));

		if(!empty($slides)){

			foreach($slides as $slide){

				$slide['slider_id'] = $lastID;

				$myID = $slide['id'];

				unset($slide['id']);

				$last_id = $this->db->insert(RevSliderGlobals::$table_slides,$slide);

				

				if(isset($myID)){

					$slider_map[$myID] = $last_id;

				}

			}

		}

		

		//duplicate static slide if exists

		$slide = new RevSlide();

		$staticID = $slide->getStaticSlideID($this->id);

		$static_id = 0;

		if($staticID !== false){

			$record = $this->db->fetchSingle(RevSliderGlobals::$table_static_slides, $this->db->prepare("id = %s", array($staticID)));

			unset($record['id']);

			$record['slider_id'] = $lastID;

			

			$static_id = $this->db->insert(RevSliderGlobals::$table_static_slides, $record);

		}

		

		

		//update actions

		$slides = $this->db->fetch(RevSliderGlobals::$table_slides, $this->db->prepare("slider_id = %s", array($lastID)));

		if($static_id > 0){

			$slides_static = $this->db->fetch(RevSliderGlobals::$table_static_slides, $this->db->prepare("id = %s", array($static_id)));

			$slides = array_merge($slides, $slides_static);

		}

		if(!empty($slides)){

			foreach($slides as $slide){

				$c_slide = new RevSlide();

				$c_slide->initByData($slide);

				

				$layers = $c_slide->getLayers();

				$did_change = false;

				foreach($layers as $key => $value){

					if(isset($value['layer_action'])){

						if(isset($value['layer_action']->jump_to_slide) && !empty($value['layer_action']->jump_to_slide)){

							foreach($value['layer_action']->jump_to_slide as $jtsk => $jtsval){

								if(isset($slider_map[$jtsval])){

									

									$layers[$key]['layer_action']->jump_to_slide[$jtsk] = $slider_map[$jtsval];

									$did_change = true;

								}

							}

						}

					}

				}

				

				if($did_change === true){

					

					$arrCreate = array();

					$my_layers = json_encode($layers);

					if(empty($my_layers))

						$my_layers = stripslashes(json_encode($layers));

					

					$arrCreate['layers'] = $my_layers;

					

					if($slide['id'] == $static_id){

						$this->db->update(RevSliderGlobals::$table_static_slides,$arrCreate,array("id"=>$static_id));

					}else{

						$this->db->update(RevSliderGlobals::$table_slides,$arrCreate,array("id"=>$slide['id']));

					}

					

				}

			}

		}

		

		//change the javascript api ID to the correct one

		$c_slider = new RevSliderSlider();

		$c_slider->initByID($lastID);

		

		$cus_js = $c_slider->getParam('custom_javascript', '');

		

		if(strpos($cus_js, 'revapi') !== false){

			if(preg_match_all('/revapi[0-9]*/', $cus_js, $results)){

				

				if(isset($results[0]) && !empty($results[0])){

					foreach($results[0] as $replace){

						$cus_js = str_replace($replace, 'revapi'.$lastID, $cus_js);

					}

				}

				

				$c_slider->updateParam(array('custom_javascript' => $cus_js));

				

			}

		}

		

		return $lastID;

	}

	

	

	/**

	 * duplicate slide

	 */

	public function duplicateSlide($slideID){

		$slide = new RevSlide();

		$slide->initByID($slideID);

		$order = $slide->getOrder();

		$slides = $this->getSlidesFromGallery();

		$newOrder = $order+1;

		$this->shiftOrder($newOrder);

		

		//do duplication

		$sqlSelect = $this->db->prepare("select ".RevSliderGlobals::FIELDS_SLIDE." from ".RevSliderGlobals::$table_slides." where id = %s", array(intval($slideID)));

		$sqlInsert = "insert into ".RevSliderGlobals::$table_slides." (".RevSliderGlobals::FIELDS_SLIDE.") ($sqlSelect)";

		

		$this->db->runSql($sqlInsert);

		$lastID = $this->db->getLastInsertID();

		RevSliderFunctions::validateNotEmpty($lastID);

		

		//update order

		$arrUpdate = array("slide_order"=>$newOrder);

		

		$this->db->update(RevSliderGlobals::$table_slides,$arrUpdate, array("id"=>$lastID));

		

		return($lastID);

	}

	

	

	/**

	 * 

	 * copy / move slide

	 */		

	private function copyMoveSlide($slideID,$targetSliderID,$operation){

		

		if($operation == "move"){

			

			$targetSlider = new RevSlider();

			$targetSlider->initByID($targetSliderID);

			$maxOrder = $targetSlider->getMaxOrder();

			$newOrder = $maxOrder+1;

			$arrUpdate = array("slider_id"=>$targetSliderID,"slide_order"=>$newOrder);	

			

			//update children

			$arrChildren = $this->getArrSlideChildren($slideID);

			foreach($arrChildren as $child){

				$childID = $child->getID();

				$this->db->update(RevSliderGlobals::$table_slides,$arrUpdate,array("id"=>$childID));

			}

			

			$this->db->update(RevSliderGlobals::$table_slides,$arrUpdate,array("id"=>$slideID));

			

		}else{	//in place of copy

			$newSlideID = $this->duplicateSlide($slideID);

			$this->duplicateChildren($slideID, $newSlideID);

			

			$this->copyMoveSlide($newSlideID,$targetSliderID,"move");

		}

	}

	

	

	/**

	 * 

	 * shift order of the slides from specific order

	 */

	private function shiftOrder($fromOrder){

		

		$where = $this->db->prepare(" slider_id = %s and slide_order >= %s", array($this->id, $fromOrder));

		$sql = "update ".RevSliderGlobals::$table_slides." set slide_order=(slide_order+1) where $where";

		$this->db->runSql($sql);

		

	}

	

	

	/**

	 * 

	 * create slider in database from options

	 */

	public function createSliderFromOptions($options){

		$sliderID = $this->createUpdateSliderFromOptions($options,null);

		return($sliderID);			

	}

	

	

	/**

	 * 

	 * export slider from data, output a file for download

	 */

	public function exportSlider($useDummy = false){

		

		$this->validateInited();

		

		$sliderParams = $this->getParamsForExport();

		$arrSlides = $this->getSlidesForExport($useDummy);

		$arrStaticSlide = $this->getStaticSlideForExport($useDummy);

		

		$usedCaptions = array();

		$usedAnimations = array();

		$usedImages = array();

		$usedSVG = array();

		$usedVideos = array();

		$usedNavigations = array();

		

		$cfw = array();

		if(!empty($arrSlides) && count($arrSlides) > 0) $cfw = array_merge($cfw, $arrSlides);

		if(!empty($arrStaticSlide) && count($arrStaticSlide) > 0) $cfw = array_merge($cfw, $arrStaticSlide);

		

		

		//remove image_id as it is not needed in export

		//plus remove background image if solid color or transparent 

		if(!empty($arrSlides)){

			foreach($arrSlides as $k => $s){

				if(isset($arrSlides[$k]['params']['image_id'])) unset($arrSlides[$k]['params']['image_id']);

				if(isset($arrSlides[$k]['params']["background_type"]) && ($arrSlides[$k]['params']["background_type"] == 'solid' || $arrSlides[$k]['params']["background_type"] == "trans" || $arrSlides[$k]['params']["background_type"] == "transparent")){

					if(isset($arrSlides[$k]['params']['background_image']))

						$arrSlides[$k]['params']['background_image'] = '';

				}

			}

		}

		if(!empty($arrStaticSlide)){

			foreach($arrStaticSlide as $k => $s){

				if(isset($arrStaticSlide[$k]['params']['image_id'])) unset($arrStaticSlide[$k]['params']['image_id']);

				if(isset($arrStaticSlide[$k]['params']["background_type"]) && ($arrStaticSlide[$k]['params']["background_type"] == 'solid' || $arrStaticSlide[$k]['params']["background_type"] == "trans" || $arrStaticSlide[$k]['params']["background_type"] == "transparent")){

					if(isset($arrStaticSlide[$k]['params']['background_image']))

						$arrStaticSlide[$k]['params']['background_image'] = '';

				}

			}

		}

		

		if(!empty($cfw) && count($cfw) > 0){

			foreach($cfw as $key => $slide){

				//check if we are transparent and so on

				if(isset($slide['params']['image']) && $slide['params']['image'] != '') $usedImages[$slide['params']['image']] = true; //['params']['image'] background url

				if(isset($slide['params']['background_image']) && $slide['params']['background_image'] != '') $usedImages[$slide['params']['background_image']] = true; //['params']['image'] background url

				if(isset($slide['params']['slide_thumb']) && $slide['params']['slide_thumb'] != '') $usedImages[$slide['params']['slide_thumb']] = true; //['params']['image'] background url

				

				//html5 video

				if(isset($slide['params']['background_type']) && $slide['params']['background_type'] == 'html5'){

					if(isset($slide['params']['slide_bg_html_mpeg']) && $slide['params']['slide_bg_html_mpeg'] != '') $usedVideos[$slide['params']['slide_bg_html_mpeg']] = true;

					if(isset($slide['params']['slide_bg_html_webm']) && $slide['params']['slide_bg_html_webm'] != '') $usedVideos[$slide['params']['slide_bg_html_webm']] = true;

					if(isset($slide['params']['slide_bg_html_ogv']) && $slide['params']['slide_bg_html_ogv'] != '') $usedVideos[$slide['params']['slide_bg_html_ogv']] = true;

				}else{

					if(isset($slide['params']['slide_bg_html_mpeg']) && $slide['params']['slide_bg_html_mpeg'] != '') $slide['params']['slide_bg_html_mpeg'] = '';

					if(isset($slide['params']['slide_bg_html_webm']) && $slide['params']['slide_bg_html_webm'] != '') $slide['params']['slide_bg_html_webm'] = '';

					if(isset($slide['params']['slide_bg_html_ogv']) && $slide['params']['slide_bg_html_ogv'] != '') $slide['params']['slide_bg_html_ogv'] = '';

				}

				

				//image thumbnail

				if(isset($slide['layers']) && !empty($slide['layers']) && count($slide['layers']) > 0){

					foreach($slide['layers'] as $lKey => $layer){

						if(isset($layer['style']) && $layer['style'] != '') $usedCaptions[$layer['style']] = true;

						if(isset($layer['animation']) && $layer['animation'] != '' && strpos($layer['animation'], 'customin') !== false) $usedAnimations[str_replace('customin-', '', $layer['animation'])] = true;

						if(isset($layer['endanimation']) && $layer['endanimation'] != '' && strpos($layer['endanimation'], 'customout') !== false) $usedAnimations[str_replace('customout-', '', $layer['endanimation'])] = true;

						if(isset($layer['image_url']) && $layer['image_url'] != '') $usedImages[$layer['image_url']] = true; //image_url if image caption

						if(isset($layer['bgimage_url']) && $layer['bgimage_url'] != '') $usedImages[$layer['bgimage_url']] = true; //image_url if background layer image

						

						if(isset($layer['type']) && ($layer['type'] == 'video' || $layer['type'] == 'audio')){

							

							$video_data = (isset($layer['video_data'])) ? (array) $layer['video_data'] : array();

							

							if(!empty($video_data) && isset($video_data['video_type']) && $video_data['video_type'] == 'html5'){



								if(isset($video_data['urlPoster']) && $video_data['urlPoster'] != '') $usedImages[$video_data['urlPoster']] = true;

								

								if(isset($video_data['urlMp4']) && $video_data['urlMp4'] != '') $usedVideos[$video_data['urlMp4']] = true;

								if(isset($video_data['urlWebm']) && $video_data['urlWebm'] != '') $usedVideos[$video_data['urlWebm']] = true;

								if(isset($video_data['urlOgv']) && $video_data['urlOgv'] != '') $usedVideos[$video_data['urlOgv']] = true;

								

							}elseif(!empty($video_data) && isset($video_data['video_type']) && $video_data['video_type'] != 'html5'){ //video cover image

								if($video_data['video_type'] == 'audio'){

									if(isset($video_data['urlAudio']) && $video_data['urlAudio'] != '') $usedVideos[$video_data['urlAudio']] = true;

								}else{

									if(isset($video_data['previewimage']) && $video_data['previewimage'] != '') $usedImages[$video_data['previewimage']] = true;

								}

							}

							

							if($video_data['video_type'] != 'html5'){

								$video_data['urlMp4'] = '';

								$video_data['urlWebm'] = '';

								$video_data['urlOgv'] = '';

							}

							if($video_data['video_type'] != 'audio'){

								$video_data['urlAudio'] = '';

							}

							if(isset($layer['video_image_url']) && $layer['video_image_url'] != '') $usedImages[$layer['video_image_url']] = true;

						}

						

						if(isset($layer['type']) && $layer['type'] == 'svg'){

							if(isset($layer['svg']) && isset($layer['svg']->src)){

								$usedSVG[$layer['svg']->src] = true;

							}

						}

					}

				}

			}

			

			$d = array('usedSVG' => $usedSVG, 'usedImages' => $usedImages, 'usedVideos' => $usedVideos);

			$d = apply_filters('revslider_exportSlider_usedMedia', $d, $cfw, $sliderParams, $useDummy); //  $arrSlides, $arrStaticSlide, 

			

			$usedSVG = $d['usedSVG'];

			$usedImages = $d['usedImages'];

			$usedVideos = $d['usedVideos'];

		}

		

		$arrSliderExport = array("params"=>$sliderParams,"slides"=>$arrSlides);

		if(!empty($arrStaticSlide))

			$arrSliderExport['static_slides'] = $arrStaticSlide;

		

		$strExport = serialize($arrSliderExport);

		

		//$strExportAnim = serialize(RevSliderOperations::getFullCustomAnimations());

		

		$exportname = (!empty($this->alias)) ? $this->alias.'.zip' : "slider_export.zip";

		

		//add navigations if not default animation

		if(isset($sliderParams['navigation_arrow_style'])) $usedNavigations[$sliderParams['navigation_arrow_style']] = true;

		if(isset($sliderParams['navigation_bullets_style'])) $usedNavigations[$sliderParams['navigation_bullets_style']] = true;

		if(isset($sliderParams['thumbnails_style'])) $usedNavigations[$sliderParams['thumbnails_style']] = true;

		if(isset($sliderParams['tabs_style'])) $usedNavigations[$sliderParams['tabs_style']] = true;

		$navs = false;

		if(!empty($usedNavigations)){

			$navs = RevSliderNavigation::export_navigation($usedNavigations);

			if($navs !== false) $navs = serialize($navs);

		}

		

		

		$styles = '';

		if(!empty($usedCaptions)){

			$captions = array();

			foreach($usedCaptions as $class => $val){

				$cap = RevSliderOperations::getCaptionsContentArray($class);

				//set also advanced styles here...

				if(!empty($cap))

					$captions[] = $cap;

			}

			$styles = RevSliderCssParser::parseArrayToCss($captions, "\n", true);

		}

		

		$animations = '';

		if(!empty($usedAnimations)){

			$animation = array();

			foreach($usedAnimations as $anim => $val){

				$anima = RevSliderOperations::getFullCustomAnimationByID($anim);

				if($anima !== false) $animation[] = $anima;

				

			}

			if(!empty($animation)) $animations = serialize($animation);

		}

		

		$usedImages = array_merge($usedImages, $usedVideos);

		

		$usepcl = false;

		if(class_exists('ZipArchive')){

			$zip = new ZipArchive;

			$success = $zip->open(RevSliderGlobals::$uploadsUrlExportZip, ZIPARCHIVE::CREATE | ZipArchive::OVERWRITE);

			

			if($success !== true)

				throwError("Can't create zip file: ".RevSliderGlobals::$uploadsUrlExportZip);

			

		}else{

			//fallback to pclzip

			require_once(ABSPATH . 'wp-admin/includes/class-pclzip.php');

			

			$pclzip = new PclZip(RevSliderGlobals::$uploadsUrlExportZip);

			

			//either the function uses die() or all is cool

			$usepcl = true;

		}

		

		//add svg to the zip

		if(!empty($usedSVG)){

			$content_url = content_url();

			$content_path = ABSPATH . 'wp-content';

			$ud = wp_upload_dir();

			$up_dir = $ud['baseurl'];

			foreach($usedSVG as $file => $val){

				if(strpos($file, 'http') !== false){ //remove all up to wp-content folder

					$checkpath = str_replace($content_url, '', $file);



					$checkpath2 = str_replace($up_dir, '', $file);

					if($checkpath2 === $file){ //we have an SVG like whiteboard, fallback to older export

						$checkpath2 = $checkpath;

					}

					if(is_file($content_path.$checkpath)){

						$strExport = str_replace($file, str_replace('/revslider/assets/svg', '', $checkpath2), $strExport);

					}

				}

			}

		}

		

		//add images to zip

		if(!empty($usedImages)){

			$upload_dir = RevSliderFunctionsWP::getPathUploads();

			$upload_dir_multisiteless = wp_upload_dir();

			$cont_url = $upload_dir_multisiteless['baseurl'];

			$cont_url_no_www = str_replace('www.', '', $upload_dir_multisiteless['baseurl']);

			$upload_dir_multisiteless = $upload_dir_multisiteless['basedir'].'/';

			

			foreach($usedImages as $file => $val){

				if($useDummy == "true"){ //only use dummy images

					

				}else{ //use the real images

					if(strpos($file, 'http') !== false){

						//check if we are in objects folder, if yes take the original image into the zip-

						

						$remove = false;

						$checkpath = str_replace(array($cont_url, $cont_url_no_www), '', $file);

						

						if(is_file($upload_dir.$checkpath)){

							if(!$usepcl){

								$zip->addFile($upload_dir.$checkpath, 'images/'.$checkpath);

							}else{

								$v_list = $pclzip->add($upload_dir.$checkpath, PCLZIP_OPT_REMOVE_PATH, $upload_dir, PCLZIP_OPT_ADD_PATH, 'images/');

							}

							$remove = true;

						}elseif(is_file($upload_dir_multisiteless.$checkpath)){

							if(!$usepcl){

								$zip->addFile($upload_dir_multisiteless.$checkpath, 'images/'.$checkpath);

							}else{

								$v_list = $pclzip->add($upload_dir_multisiteless.$checkpath, PCLZIP_OPT_REMOVE_PATH, $upload_dir_multisiteless, PCLZIP_OPT_ADD_PATH, 'images/');

							}

							$remove = true;

						}

						

						if($remove){ //as its http, remove this from strexport

							$strExport = str_replace(array($cont_url.$checkpath, $cont_url_no_www.$checkpath), $checkpath, $strExport);

						}

					}else{

						if(is_file($upload_dir.$file)){

							if(!$usepcl){

								$zip->addFile($upload_dir.$file, 'images/'.$file);

							}else{

								$v_list = $pclzip->add($upload_dir.$file, PCLZIP_OPT_REMOVE_PATH, $upload_dir, PCLZIP_OPT_ADD_PATH, 'images/');

							}

						}elseif(is_file($upload_dir_multisiteless.$file)){

							if(!$usepcl){

								$zip->addFile($upload_dir_multisiteless.$file, 'images/'.$file);

							}else{

								$v_list = $pclzip->add($upload_dir_multisiteless.$file, PCLZIP_OPT_REMOVE_PATH, $upload_dir_multisiteless, PCLZIP_OPT_ADD_PATH, 'images/');

							}

						}

					}

				}

			}

		}

		

		if(!$usepcl){

			$zip->addFromString("slider_export.txt", $strExport); //add slider settings

		}else{

			$list = $pclzip->add(array(array( PCLZIP_ATT_FILE_NAME => 'slider_export.txt',PCLZIP_ATT_FILE_CONTENT => $strExport)));

			if ($list == 0) { die("ERROR : '".$pclzip->errorInfo(true)."'"); }

			

		}

		if(strlen(trim($animations)) > 0){

			if(!$usepcl){

				$zip->addFromString("custom_animations.txt", $animations); //add custom animations

			}else{

				$list = $pclzip->add(array(array( PCLZIP_ATT_FILE_NAME => 'custom_animations.txt',PCLZIP_ATT_FILE_CONTENT => $animations)));

				if ($list == 0) { die("ERROR : '".$pclzip->errorInfo(true)."'"); }

			}

		}

		if(strlen(trim($styles)) > 0){

			if(!$usepcl){

				$zip->addFromString("dynamic-captions.css", $styles); //add dynamic styles

			}else{

				$list = $pclzip->add(array(array( PCLZIP_ATT_FILE_NAME => 'dynamic-captions.css',PCLZIP_ATT_FILE_CONTENT => $styles)));

				if ($list == 0) { die("ERROR : '".$pclzip->errorInfo(true)."'"); }

			}

		}

		if(strlen(trim($navs)) > 0){

			if(!$usepcl){

				$zip->addFromString("navigation.txt", $navs); //add dynamic styles

			}else{

				$list = $pclzip->add(array(array( PCLZIP_ATT_FILE_NAME => 'navigation.txt',PCLZIP_ATT_FILE_CONTENT => $navs)));

				if ($list == 0) { die("ERROR : '".$pclzip->errorInfo(true)."'"); }

			}

		}

		

		$static_css = RevSliderOperations::getStaticCss();

		if(trim($static_css) !== ''){

			if(!$usepcl){

				$zip->addFromString("static-captions.css", $static_css); //add slider settings

			}else{

				$list = $pclzip->add(array(array( PCLZIP_ATT_FILE_NAME => 'static-captions.css',PCLZIP_ATT_FILE_CONTENT => $static_css)));

				if ($list == 0) { die("ERROR : '".$pclzip->errorInfo(true)."'"); }

			}

		}

		$enable_slider_pack = apply_filters('revslider_slider_pack_export', false);

		

		if($enable_slider_pack){ //allow for slider packs the automatic creation of the info.cfg

			if(!$usepcl){

				$zip->addFromString('info.cfg', md5($this->alias)); //add slider settings

			}else{

				$list = $pclzip->add(array(array( PCLZIP_ATT_FILE_NAME => 'info.cfg',PCLZIP_ATT_FILE_CONTENT => md5($this->alias))));

				if ($list == 0) { die("ERROR : '".$pclzip->errorInfo(true)."'"); }

			}

		}

		

		if(!$usepcl){

			$zip->close();

		}else{

			//do nothing

		}

		

		

		header("Content-type: application/zip");

		header("Content-Disposition: attachment; filename=".$exportname);

		header("Pragma: no-cache");

		header("Expires: 0");

		readfile(RevSliderGlobals::$uploadsUrlExportZip);

		

		@unlink(RevSliderGlobals::$uploadsUrlExportZip); //delete file after sending it to user

		

		exit();

	}

	

	

	/**

	 * import slider from multipart form

	 * @since: 5.3.1: $updateStatic is now deprecated

	 */

	public function importSliderFromPost($updateAnim = true, $updateStatic = true, $exactfilepath = false, $is_template = false, $single_slide = false, $updateNavigation = true){

		

		$real_slider_id = '';

		try{

			$upload_dir = wp_upload_dir();

			$rem_path = $upload_dir['basedir'].'/rstemp/';

			$d_path = $rem_path;

			

			$sliderID = RevSliderFunctions::getPostVariable("sliderid");

			$sliderExists = !empty($sliderID);

			

			if($sliderExists)

				$this->initByID($sliderID);

			

			if($exactfilepath !== false){

				$filepath = $exactfilepath;

			}else{

				switch ($_FILES['import_file']['error']) {

					case UPLOAD_ERR_OK:

						break;

					case UPLOAD_ERR_NO_FILE:

						RevSliderFunctions::throwError(__('No file sent.', 'revslider'));

					case UPLOAD_ERR_INI_SIZE:

					case UPLOAD_ERR_FORM_SIZE:

						RevSliderFunctions::throwError(__('Exceeded filesize limit.', 'revslider'));

						

					default:

					break;

				}

				$filepath = $_FILES["import_file"]["tmp_name"];

			}

			

			if(file_exists($filepath) == false)

				RevSliderFunctions::throwError(__('Import file not found!!!', 'revslider'));

			

			$importZip = false;

			

			WP_Filesystem();

			

			global $wp_filesystem;

			

			$unzipfile = unzip_file( $filepath, $d_path);

			

			if( is_wp_error($unzipfile) ){

				define('FS_METHOD', 'direct'); //lets try direct. 

				

				WP_Filesystem();  //WP_Filesystem() needs to be called again since now we use direct !

				

				//@chmod($filepath, 0775);

				

				$unzipfile = unzip_file( $filepath, $d_path);

				if( is_wp_error($unzipfile) ){

					$d_path = RS_PLUGIN_PATH.'rstemp/';

					$rem_path = $d_path;

					$unzipfile = unzip_file( $filepath, $d_path);

					

					if( is_wp_error($unzipfile) ){

						$f = basename($filepath);

						$d_path = str_replace($f, '', $filepath);

						

						$unzipfile = unzip_file( $filepath, $d_path);

					}

				}

			}

			

			if( !is_wp_error($unzipfile) ){

				$importZip = true; //raus damit..

				

				//read all files needed

				$content = ( $wp_filesystem->exists( $d_path.'slider_export.txt' ) ) ? $wp_filesystem->get_contents( $d_path.'slider_export.txt' ) : '';

				if($content == ''){

					RevSliderFunctions::throwError(__('slider_export.txt does not exist!', 'revslider'));

				}

				$animations = ( $wp_filesystem->exists( $d_path.'custom_animations.txt' ) ) ? $wp_filesystem->get_contents( $d_path.'custom_animations.txt' ) : '';

				$dynamic = ( $wp_filesystem->exists( $d_path.'dynamic-captions.css' ) ) ? $wp_filesystem->get_contents( $d_path.'dynamic-captions.css' ) : '';

				//$static = ( $wp_filesystem->exists( $d_path.'static-captions.css' ) ) ? $wp_filesystem->get_contents( $d_path.'static-captions.css' ) : '';

				$navigations = ( $wp_filesystem->exists( $d_path.'navigation.txt' ) ) ? $wp_filesystem->get_contents( $d_path.'navigation.txt' ) : '';

				

				$uid_check = ( $wp_filesystem->exists( $d_path.'info.cfg' ) ) ? $wp_filesystem->get_contents( $d_path.'info.cfg' ) : '';

				$version_check = ( $wp_filesystem->exists( $d_path.'version.cfg' ) ) ? $wp_filesystem->get_contents( $d_path.'version.cfg' ) : '';

				

				if($is_template !== false){

					if($uid_check != $is_template){

						return(array("success"=>false,"error"=>__('Please select the correct zip file, checksum failed!', 'revslider')));

					}

				}else{ //someone imported a template base Slider, check if it is existing in Base Sliders, if yes, check if it was imported

					if($uid_check !== ''){

						$tmpl = new RevSliderTemplate();

						$tmpl_slider = $tmpl->getThemePunchTemplateSliders();

						

						foreach($tmpl_slider as $tp_slider){

							if(!isset($tp_slider['installed'])) continue;

							

							if($tp_slider['uid'] == $uid_check){

								$is_template = $uid_check;

								break;

							}

						}

					}

				}

				

				$db = new RevSliderDB();

				

				//update/insert custom animations

				$animations = @unserialize($animations);

				if(!empty($animations)){

					foreach($animations as $key => $animation){ //$animation['id'], $animation['handle'], $animation['params']

						$exist = $db->fetch(RevSliderGlobals::$table_layer_anims, $db->prepare("handle = %s", array($animation['handle'])));

						if(!empty($exist)){ //update the animation, get the ID

							if($updateAnim == "true"){ //overwrite animation if exists

								$arrUpdate = array();

								$arrUpdate['params'] = stripslashes(json_encode(str_replace("'", '"', $animation['params'])));

								$db->update(RevSliderGlobals::$table_layer_anims, $arrUpdate, array('handle' => $animation['handle']));

								

								$anim_id = $exist['0']['id'];

							}else{ //insert with new handle

								$arrInsert = array();

								$arrInsert["handle"] = 'copy_'.$animation['handle'];

								$arrInsert["params"] = stripslashes(json_encode(str_replace("'", '"', $animation['params'])));

								

								$anim_id = $db->insert(RevSliderGlobals::$table_layer_anims, $arrInsert);

							}

						}else{ //insert the animation, get the ID

							$arrInsert = array();

							$arrInsert["handle"] = $animation['handle'];

							$arrInsert["params"] = stripslashes(json_encode(str_replace("'", '"', $animation['params'])));

							

							$anim_id = $db->insert(RevSliderGlobals::$table_layer_anims, $arrInsert);

						}

						

						//and set the current customin-oldID and customout-oldID in slider params to new ID from $id

						$content = str_replace(array('customin-'.$animation['id'].'"', 'customout-'.$animation['id'].'"'), array('customin-'.$anim_id.'"', 'customout-'.$anim_id.'"'), $content);	

					}

					//dmp(__("animations imported!",'revslider'));

				}

				

				//overwrite/append static-captions.css

				/*if(!empty($static)){

					if($updateStatic == "true"){ //overwrite file

						RevSliderOperations::updateStaticCss($static);

					}elseif($updateStatic == 'none'){

						//do nothing

					}else{//append

						$static_cur = RevSliderOperations::getStaticCss();

						$static = $static_cur."\n".$static;

						RevSliderOperations::updateStaticCss($static);

					}

				}*/

				

				//overwrite/create dynamic-captions.css

				//parse css to classes

				$dynamicCss = RevSliderCssParser::parseCssToArray($dynamic);

				if(is_array($dynamicCss) && $dynamicCss !== false && count($dynamicCss) > 0){

					foreach($dynamicCss as $class => $styles){

						//check if static style or dynamic style

						$class = trim($class);

						

						if(strpos($class, ',') !== false && strpos($class, '.tp-caption') !== false){ //we have something like .tp-caption.redclass, .redclass

							$class_t = explode(',', $class);

							foreach($class_t as $k => $cl){

								if(strpos($cl, '.tp-caption') !== false) $class = $cl;

							}

						}

						

						if((strpos($class, ':hover') === false && strpos($class, ':') !== false) || //before, after

							strpos($class," ") !== false || // .tp-caption.imageclass img or .tp-caption .imageclass or .tp-caption.imageclass .img

							strpos($class,".tp-caption") === false || // everything that is not tp-caption

							(strpos($class,".") === false || strpos($class,"#") !== false) || // no class -> #ID or img

							strpos($class,">") !== false){ //.tp-caption>.imageclass or .tp-caption.imageclass>img or .tp-caption.imageclass .img

							continue;

						}

						

						//is a dynamic style

						if(strpos($class, ':hover') !== false){

							$class = trim(str_replace(':hover', '', $class));

							$arrInsert = array();

							$arrInsert["hover"] = json_encode($styles);

							$arrInsert["settings"] = json_encode(array('hover' => 'true'));

						}else{

							$arrInsert = array();

							$arrInsert["params"] = json_encode($styles);

							$arrInsert["settings"] = '';

						}

						//check if class exists

						$result = $db->fetch(RevSliderGlobals::$table_css, $db->prepare("handle = %s", array($class)));

						

						if(!empty($result)){ //update

							$db->update(RevSliderGlobals::$table_css, $arrInsert, array('handle' => $class));

						}else{ //insert

							$arrInsert["handle"] = $class;

							$db->insert(RevSliderGlobals::$table_css, $arrInsert);

						}

					}

					//dmp(__("dynamic styles imported!",'revslider'));

				}

				

				//update/insert custom animations

				$navigations = @unserialize($navigations);

				if(!empty($navigations)){

					

					foreach($navigations as $key => $navigation){

						$exist = $db->fetch(RevSliderGlobals::$table_navigation, $db->prepare("handle = %s", array($navigation['handle'])));

						unset($navigation['id']);

						

						$rh = $navigation["handle"];

						if(!empty($exist)){ //create new navigation, get the ID

							if($updateNavigation == "true"){ //overwrite navigation if exists

								unset($navigation['handle']);

								$db->update(RevSliderGlobals::$table_navigation, $navigation, array('handle' => $rh));

								

							}else{

								//insert with new handle

								$navigation["handle"] = $navigation['handle'].'-'.date('is');

								$navigation["name"] = $navigation['name'].'-'.date('is');

								$content = str_replace($rh.'"', $navigation["handle"].'"', $content);

								$navigation["css"] = str_replace('.'.$rh, '.'.$navigation["handle"], $navigation["css"]); //change css class to the correct new class

								$navi_id = $db->insert(RevSliderGlobals::$table_navigation, $navigation);

								

							}

						}else{

							$navi_id = $db->insert(RevSliderGlobals::$table_navigation, $navigation);

						}

					}

					//dmp(__("navigations imported!",'revslider'));

				}

			}else{

				$message = $unzipfile->get_error_message();

				

				$wp_filesystem->delete($rem_path, true);

				

				return(array("success"=>false,"error"=>$message));

			}

			

			//$content = preg_replace('!s:(\d+):"(.*?)";!e', "'s:'.strlen('$2').':\"$2\";'", $content); //clear errors in string //deprecated in newest php version

			$content = preg_replace_callback('!s:(\d+):"(.*?)";!', array('RevSliderSlider', 'clear_error_in_string') , $content); //clear errors in string

			

			$arrSlider = @unserialize($content);

			if(empty($arrSlider)){

				$wp_filesystem->delete($rem_path, true);

				RevSliderFunctions::throwError(__('Wrong export slider file format! Please make sure that the uploaded file is either a zip file with a correct slider_export.txt in the root of it or an valid slider_export.txt file.', 'revslider'));

			}

			

			//update slider params

			$sliderParams = $arrSlider["params"];

			

			if($sliderExists){

				$sliderParams["title"] = $this->arrParams["title"];

				$sliderParams["alias"] = $this->arrParams["alias"];

				$sliderParams["shortcode"] = $this->arrParams["shortcode"];

			}

			

			if(isset($sliderParams["background_image"]))

				$sliderParams["background_image"] = RevSliderFunctionsWP::getImageUrlFromPath($sliderParams["background_image"]);

			

			$import_statics = true;

			if(isset($sliderParams['enable_static_layers'])){

				if($sliderParams['enable_static_layers'] == 'off') $import_statics = false;

				unset($sliderParams['enable_static_layers']);

			}

			

			$sliderParams['version'] = $version_check;

			

			$json_params = json_encode($sliderParams);

			

			//update slider or create new

			if($sliderExists){

				$arrUpdate = array("params"=>$json_params);	

				$this->db->update(RevSliderGlobals::$table_sliders,$arrUpdate,array("id"=>$sliderID));

			}else{	//new slider

				$arrInsert = array();

				$arrInsert['params'] = $json_params;

				//check if Slider with title and/or alias exists, if yes change both to stay unique

				

				

				$arrInsert['title'] = RevSliderFunctions::getVal($sliderParams, 'title', 'Slider1');

				$arrInsert['alias'] = RevSliderFunctions::getVal($sliderParams, 'alias', 'slider1');	

				if($is_template === false){ //we want to stay at the given alias if we are a template

					$talias = $arrInsert['alias'];

					$ti = 1;

					while($this->isAliasExistsInDB($talias)){ //set a new alias and title if its existing in database

						$talias = $arrInsert['alias'] . $ti;

						$ti++;

					}

					

					if($talias !== $arrInsert['alias']){

						$sliderParams['title'] = $talias;

						$sliderParams['alias'] = $talias;

						$arrInsert['title'] = $talias;

						$arrInsert['alias'] = $talias;

						$json_params = json_encode($sliderParams);

						$arrInsert['params'] = $json_params;

					}

				}

				

				if($is_template !== false){ //add that we are an template

					$arrInsert['type'] = 'template';

					$sliderParams['uid'] = $is_template;

					$json_params = json_encode($sliderParams);

					$arrInsert['params'] = $json_params;

				}

				

				

				

				$sliderID = $this->db->insert(RevSliderGlobals::$table_sliders,$arrInsert);

			}

			

			//-------- Slides Handle -----------

			

			//delete current slides

			if($sliderExists)

				$this->deleteAllSlides();

			

			//create all slides

			$arrSlides = $arrSlider["slides"];

			

			$alreadyImported = array();

			

			$content_url = content_url();

			

			//wpml compatibility

			$slider_map = array();

			foreach($arrSlides as $sl_key => $slide){

				$params = $slide["params"];

				$layers = $slide["layers"];

				$settings = (isset($slide["settings"])) ? $slide["settings"] : '';

				

				//convert params images:

				if($importZip === true){ //we have a zip, check if exists

					//remove image_id as it is not needed in import

					if(isset($params['image_id'])) unset($params['image_id']);

					

					if(isset($params["image"])){

						$params["image"] = RevSliderBase::check_file_in_zip($d_path, $params["image"], $sliderParams["alias"], $alreadyImported);

						$params["image"] = RevSliderFunctionsWP::getImageUrlFromPath($params["image"]);

					}

					

					if(isset($params["background_image"])){

						$params["background_image"] = RevSliderBase::check_file_in_zip($d_path, $params["background_image"], $sliderParams["alias"], $alreadyImported);

						$params["background_image"] = RevSliderFunctionsWP::getImageUrlFromPath($params["background_image"]);

					}

					

					if(isset($params["slide_thumb"])){

						$params["slide_thumb"] = RevSliderBase::check_file_in_zip($d_path, $params["slide_thumb"], $sliderParams["alias"], $alreadyImported);

						$params["slide_thumb"] = RevSliderFunctionsWP::getImageUrlFromPath($params["slide_thumb"]);

					}

					

					if(isset($params["show_alternate_image"])){

						$params["show_alternate_image"] = RevSliderBase::check_file_in_zip($d_path, $params["show_alternate_image"], $sliderParams["alias"], $alreadyImported);

						$params["show_alternate_image"] = RevSliderFunctionsWP::getImageUrlFromPath($params["show_alternate_image"]);

					}

					if(isset($params['background_type']) && $params['background_type'] == 'html5'){

						if(isset($params['slide_bg_html_mpeg']) && $params['slide_bg_html_mpeg'] != ''){

							$params['slide_bg_html_mpeg'] = RevSliderFunctionsWP::getImageUrlFromPath(RevSliderBase::check_file_in_zip($d_path, $params["slide_bg_html_mpeg"], $sliderParams["alias"], $alreadyImported, true));

						}

						if(isset($params['slide_bg_html_webm']) && $params['slide_bg_html_webm'] != ''){

							$params['slide_bg_html_webm'] = RevSliderFunctionsWP::getImageUrlFromPath(RevSliderBase::check_file_in_zip($d_path, $params["slide_bg_html_webm"], $sliderParams["alias"], $alreadyImported, true));

						}

						if(isset($params['slide_bg_html_ogv'])  && $params['slide_bg_html_ogv'] != ''){

							$params['slide_bg_html_ogv'] = RevSliderFunctionsWP::getImageUrlFromPath(RevSliderBase::check_file_in_zip($d_path, $params["slide_bg_html_ogv"], $sliderParams["alias"], $alreadyImported, true));

						}

					}

				}

				

				//convert layers images:

				foreach($layers as $key=>$layer){					

					//import if exists in zip folder

					if($importZip === true){ //we have a zip, check if exists

						if(isset($layer["image_url"])){

							$layer["image_url"] = RevSliderBase::check_file_in_zip($d_path, $layer["image_url"], $sliderParams["alias"], $alreadyImported);

							$layer["image_url"] = RevSliderFunctionsWP::getImageUrlFromPath($layer["image_url"]);

						}

						if(isset($layer["bgimage_url"])){

							$layer["bgimage_url"] = RevSliderBase::check_file_in_zip($d_path, $layer["bgimage_url"], $sliderParams["alias"], $alreadyImported);

							$layer["bgimage_url"] = RevSliderFunctionsWP::getImageUrlFromPath($layer["bgimage_url"]);

						}

						if(isset($layer['type']) && ($layer['type'] == 'video' || $layer['type'] == 'audio')){

							

							$video_data = (isset($layer['video_data'])) ? (array) $layer['video_data'] : array();

							

							if(!empty($video_data) && isset($video_data['video_type']) && $video_data['video_type'] == 'html5'){



								if(isset($video_data['urlPoster']) && $video_data['urlPoster'] != ''){

									$video_data['urlPoster'] = RevSliderFunctionsWP::getImageUrlFromPath(RevSliderBase::check_file_in_zip($d_path, $video_data["urlPoster"], $sliderParams["alias"], $alreadyImported));

								}

								

								if(isset($video_data['urlMp4']) && $video_data['urlMp4'] != ''){

									$video_data['urlMp4'] = RevSliderFunctionsWP::getImageUrlFromPath(RevSliderBase::check_file_in_zip($d_path, $video_data["urlMp4"], $sliderParams["alias"], $alreadyImported, true));

								}

								if(isset($video_data['urlWebm']) && $video_data['urlWebm'] != ''){

									$video_data['urlWebm'] = RevSliderFunctionsWP::getImageUrlFromPath(RevSliderBase::check_file_in_zip($d_path, $video_data["urlWebm"], $sliderParams["alias"], $alreadyImported, true));

								}

								if(isset($video_data['urlOgv']) && $video_data['urlOgv'] != ''){

									$video_data['urlOgv'] = RevSliderFunctionsWP::getImageUrlFromPath(RevSliderBase::check_file_in_zip($d_path, $video_data["urlOgv"], $sliderParams["alias"], $alreadyImported, true));

								}

								

							}elseif(!empty($video_data) && isset($video_data['video_type']) && $video_data['video_type'] != 'html5'){ //video cover image

								if($video_data['video_type'] == 'audio'){

									if(isset($video_data['urlAudio']) && $video_data['urlAudio'] != ''){

										$video_data['urlAudio'] = RevSliderFunctionsWP::getImageUrlFromPath(RevSliderBase::check_file_in_zip($d_path, $video_data["urlAudio"], $sliderParams["alias"], $alreadyImported, true));

									}

								}else{

									if(isset($video_data['previewimage']) && $video_data['previewimage'] != ''){

										$video_data['previewimage'] = RevSliderFunctionsWP::getImageUrlFromPath(RevSliderBase::check_file_in_zip($d_path, $video_data["previewimage"], $sliderParams["alias"], $alreadyImported));

									}

								}

							}

							

							$layer['video_data'] = $video_data;

							

							if(isset($layer['video_image_url']) && $layer['video_image_url'] != ''){

								$layer['video_image_url'] = RevSliderFunctionsWP::getImageUrlFromPath(RevSliderBase::check_file_in_zip($d_path, $layer["video_image_url"], $sliderParams["alias"], $alreadyImported));

							}

						}

						

						if(isset($layer['type']) && $layer['type'] == 'svg'){

							if(isset($layer['svg']) && isset($layer['svg']->src)){

								$layer['svg']->src = $content_url.$layer['svg']->src;

							}

						}

						

					}

					

					$layer['text'] = stripslashes($layer['text']);

					$layers[$key] = $layer;

				}

				$arrSlides[$sl_key]['layers'] = $layers;

				

				//create new slide

				$arrCreate = array();

				$arrCreate["slider_id"] = $sliderID;

				$arrCreate["slide_order"] = $slide["slide_order"];

				

				$d = array('params' => $params, 'sliderParams' => $sliderParams, 'layers' => $layers, 'settings' => $settings, 'alreadyImported' => $alreadyImported);

				$d = apply_filters('revslider_importSliderFromPost_modify_data', $d, 'normal', $d_path);

				

				$params = $d['params'];

				$sliderParams = $d['sliderParams'];

				$layers = $d['layers'];

				$settings = $d['settings'];

				$alreadyImported = $d['alreadyImported'];

				

				$my_layers = json_encode($layers);

				if(empty($my_layers))

					$my_layers = stripslashes(json_encode($layers));

				$my_params = json_encode($params);

				if(empty($my_params))

					$my_params = stripslashes(json_encode($params));

				$my_settings = json_encode($settings);

				if(empty($my_settings))

					$my_settings = stripslashes(json_encode($settings));

				

				$arrCreate["layers"] = $my_layers;

				$arrCreate["params"] = $my_params;

				$arrCreate["settings"] = $my_settings;

				

				$last_id = $this->db->insert(RevSliderGlobals::$table_slides,$arrCreate);

				

				if(isset($slide['id'])){

					$slider_map[$slide['id']] = $last_id;

				}

			}

			

			//change for WPML the parent IDs if necessary

			if(!empty($slider_map)){

				foreach($arrSlides as $sl_key => $slide){

					if(isset($slide['params']['parentid']) && isset($slider_map[$slide['params']['parentid']])){

						$update_id = $slider_map[$slide['id']];

						$parent_id = $slider_map[$slide['params']['parentid']];

						

						$arrCreate = array();

						

						$arrCreate["params"] = $slide['params'];

						$arrCreate["params"]['parentid'] = $parent_id;

						$my_params = json_encode($arrCreate["params"]);

						if(empty($my_params))

							$my_params = stripslashes(json_encode($arrCreate["params"]));

						

						$arrCreate["params"] = $my_params;

						

						$this->db->update(RevSliderGlobals::$table_slides,$arrCreate,array("id"=>$update_id));

					}

					

					$did_change = false;

					foreach($slide['layers'] as $key => $value){

						if(isset($value['layer_action'])){

							if(isset($value['layer_action']->jump_to_slide) && !empty($value['layer_action']->jump_to_slide)){

								$value['layer_action']->jump_to_slide = (array)$value['layer_action']->jump_to_slide;

								foreach($value['layer_action']->jump_to_slide as $jtsk => $jtsval){

									if(isset($slider_map[$jtsval])){

										$slide['layers'][$key]['layer_action']->jump_to_slide[$jtsk] = $slider_map[$jtsval];

										$did_change = true;

									}

								}

							}

						}

						

						$link_slide = RevSliderFunctions::getVal($value, 'link_slide', false);

						if($link_slide != false && $link_slide !== 'nothing'){ //link to slide/scrollunder is set, move it to actions

							if(!isset($slide['layers'][$key]['layer_action'])) $slide['layers'][$key]['layer_action'] = new stdClass();

							switch($link_slide){

								case 'link':

									$link = RevSliderFunctions::getVal($value, 'link');

									$link_open_in = RevSliderFunctions::getVal($value, 'link_open_in');

									$slide['layers'][$key]['layer_action']->action = array('a' => 'link');

									$slide['layers'][$key]['layer_action']->link_type = array('a' => 'a');

									$slide['layers'][$key]['layer_action']->image_link = array('a' => $link);

									$slide['layers'][$key]['layer_action']->link_open_in = array('a' => $link_open_in);

									

									unset($slide['layers'][$key]['link']);

									unset($slide['layers'][$key]['link_open_in']);

								case 'next':

									$slide['layers'][$key]['layer_action']->action = array('a' => 'next');

								break;

								case 'prev':

									$slide['layers'][$key]['layer_action']->action = array('a' => 'prev');

								break;

								case 'scroll_under':

									$scrollunder_offset = RevSliderFunctions::getVal($value, 'scrollunder_offset');

									$slide['layers'][$key]['layer_action']->action = array('a' => 'scroll_under');

									$slide['layers'][$key]['layer_action']->scrollunder_offset = array('a' => $scrollunder_offset);

									

									unset($slide['layers'][$key]['scrollunder_offset']);

								break;

								default: //its an ID, so its a slide ID

									$slide['layers'][$key]['layer_action']->action = array('a' => 'jumpto');

									$slide['layers'][$key]['layer_action']->jump_to_slide = array('a' => $slider_map[$link_slide]);

								break;

								

							}

							$slide['layers'][$key]['layer_action']->tooltip_event = array('a' => 'click');

							

							unset($slide['layers'][$key]['link_slide']);

							

							$did_change = true;

						}

						

						

						if($did_change === true){

							

							$arrCreate = array();

							$my_layers = json_encode($slide['layers']);

							if(empty($my_layers))

								$my_layers = stripslashes(json_encode($layers));

							

							$arrCreate['layers'] = $my_layers;

							

							$this->db->update(RevSliderGlobals::$table_slides,$arrCreate,array("id"=>$slider_map[$slide['id']]));

						}

					}

				}

			}

			

			//check if static slide exists and import

			if(isset($arrSlider['static_slides']) && !empty($arrSlider['static_slides']) && $import_statics){

				$static_slide = $arrSlider['static_slides'];

				foreach($static_slide as $slide){

					

					$params = $slide["params"];

					$layers = $slide["layers"];

					$settings = (isset($slide["settings"])) ? $slide["settings"] : '';

					

					//remove image_id as it is not needed in import

					if(isset($params['image_id'])) unset($params['image_id']);

					

					//convert params images:

					if(isset($params["image"])){

						//import if exists in zip folder

						if(strpos($params["image"], 'http') !== false){

						}else{

							if(trim($params["image"]) !== ''){

								if($importZip === true){ //we have a zip, check if exists

									$image = $wp_filesystem->exists( $d_path.'images/'.$params["image"] );

									if(!$image){

										echo $params["image"].__(' not found!<br>', 'revslider');

									}else{

										if(!isset($alreadyImported['images/'.$params["image"]])){

											$importImage = RevSliderFunctionsWP::import_media($d_path.'images/'.$params["image"], $sliderParams["alias"].'/');



											if($importImage !== false){

												$alreadyImported['images/'.$params["image"]] = $importImage['path'];

												

												$params["image"] = $importImage['path'];

											}

										}else{

											$params["image"] = $alreadyImported['images/'.$params["image"]];

										}





									}

								}

							}

							$params["image"] = RevSliderFunctionsWP::getImageUrlFromPath($params["image"]);

						}

					}

					

					//convert layers images:

					foreach($layers as $key=>$layer){

						if(isset($layer["image_url"])){

							//import if exists in zip folder

							if(trim($layer["image_url"]) !== ''){

								if(strpos($layer["image_url"], 'http') !== false){

								}else{

									if($importZip === true){ //we have a zip, check if exists

										$image_url = $wp_filesystem->exists( $d_path.'images/'.$layer["image_url"] );

										if(!$image_url){

											echo $layer["image_url"].__(' not found!<br>');

										}else{

											if(!isset($alreadyImported['images/'.$layer["image_url"]])){

												$importImage = RevSliderFunctionsWP::import_media($d_path.'images/'.$layer["image_url"], $sliderParams["alias"].'/');

												

												if($importImage !== false){

													$alreadyImported['images/'.$layer["image_url"]] = $importImage['path'];

													

													$layer["image_url"] = $importImage['path'];

												}

											}else{

												$layer["image_url"] = $alreadyImported['images/'.$layer["image_url"]];

											}

										}

									}

								}

							}

							$layer["image_url"] = RevSliderFunctionsWP::getImageUrlFromPath($layer["image_url"]);

						}

						if(isset($layer["bgimage_url"])){

							//import if exists in zip folder

							if(trim($layer["bgimage_url"]) !== ''){

								if(strpos($layer["bgimage_url"], 'http') !== false){

								}else{

									if($importZip === true){ //we have a zip, check if exists

										$bgimage_url = $wp_filesystem->exists( $d_path.'images/'.$layer["bgimage_url"] );

										if(!$bgimage_url){

											echo $layer["bgimage_url"].__(' not found!<br>');

										}else{

											if(!isset($alreadyImported['images/'.$layer["bgimage_url"]])){

												$importImage = RevSliderFunctionsWP::import_media($d_path.'images/'.$layer["bgimage_url"], $sliderParams["alias"].'/');

												

												if($importImage !== false){

													$alreadyImported['images/'.$layer["bgimage_url"]] = $importImage['path'];

													

													$layer["bgimage_url"] = $importImage['path'];

												}

											}else{

												$layer["bgimage_url"] = $alreadyImported['images/'.$layer["bgimage_url"]];

											}

										}

									}

								}

							}

							$layer["bgimage_url"] = RevSliderFunctionsWP::getImageUrlFromPath($layer["bgimage_url"]);

						}

						

						$layer['text'] = stripslashes($layer['text']);

							

						if(isset($layer['type']) && ($layer['type'] == 'video' || $layer['type'] == 'audio')){

							

							$video_data = (isset($layer['video_data'])) ? (array) $layer['video_data'] : array();

							

							if(!empty($video_data) && isset($video_data['video_type']) && $video_data['video_type'] == 'html5'){



								if(isset($video_data['urlPoster']) && $video_data['urlPoster'] != ''){

									$video_data['urlPoster'] = RevSliderFunctionsWP::getImageUrlFromPath(RevSliderBase::check_file_in_zip($d_path, $video_data["urlPoster"], $sliderParams["alias"], $alreadyImported));

								}

								if(isset($video_data['urlMp4']) && $video_data['urlMp4'] != ''){

									$video_data['urlMp4'] = RevSliderFunctionsWP::getImageUrlFromPath(RevSliderBase::check_file_in_zip($d_path, $video_data["urlMp4"], $sliderParams["alias"], $alreadyImported, true));

								}

								if(isset($video_data['urlWebm']) && $video_data['urlWebm'] != ''){

									$video_data['urlWebm'] = RevSliderFunctionsWP::getImageUrlFromPath(RevSliderBase::check_file_in_zip($d_path, $video_data["urlWebm"], $sliderParams["alias"], $alreadyImported, true));

								}

								if(isset($video_data['urlOgv']) && $video_data['urlOgv'] != ''){

									$video_data['urlOgv'] = RevSliderFunctionsWP::getImageUrlFromPath(RevSliderBase::check_file_in_zip($d_path, $video_data["urlOgv"], $sliderParams["alias"], $alreadyImported, true));

								}

								

							}elseif(!empty($video_data) && isset($video_data['video_type']) && $video_data['video_type'] != 'html5'){ //video cover image

								if($video_data['video_type'] == 'audio'){

									if(isset($video_data['urlAudio']) && $video_data['urlAudio'] != ''){

										$video_data['urlAudio'] = RevSliderFunctionsWP::getImageUrlFromPath(RevSliderBase::check_file_in_zip($d_path, $video_data["urlAudio"], $sliderParams["alias"], $alreadyImported, true));

									}

								}else{

									if(isset($video_data['previewimage']) && $video_data['previewimage'] != ''){

										$video_data['previewimage'] = RevSliderFunctionsWP::getImageUrlFromPath(RevSliderBase::check_file_in_zip($d_path, $video_data["previewimage"], $sliderParams["alias"], $alreadyImported));

									}

								}

							}

							

							$layer['video_data'] = $video_data;

							

							if(isset($layer['video_image_url']) && $layer['video_image_url'] != ''){

								$layer['video_image_url'] = RevSliderFunctionsWP::getImageUrlFromPath(RevSliderBase::check_file_in_zip($d_path, $layer["video_image_url"], $sliderParams["alias"], $alreadyImported));

							}

						}

						

						if(isset($layer['type']) && $layer['type'] == 'svg'){

							if(isset($layer['svg']) && isset($layer['svg']->src)){

								$layer['svg']->src = $content_url.$layer['svg']->src;

							}

						}

						

						if(isset($layer['layer_action'])){

							if(isset($layer['layer_action']->jump_to_slide) && !empty($layer['layer_action']->jump_to_slide)){

								foreach($layer['layer_action']->jump_to_slide as $jtsk => $jtsval){

									if(isset($slider_map[$jtsval])){

										$layer['layer_action']->jump_to_slide[$jtsk] = $slider_map[$jtsval];

									}

								}

							}

						}

						

						$link_slide = RevSliderFunctions::getVal($layer, 'link_slide', false);

						if($link_slide != false && $link_slide !== 'nothing'){ //link to slide/scrollunder is set, move it to actions

							if(!isset($layer['layer_action'])) $layer['layer_action'] = new stdClass();

							

							switch($link_slide){

								case 'link':

									$link = RevSliderFunctions::getVal($layer, 'link');

									$link_open_in = RevSliderFunctions::getVal($layer, 'link_open_in');

									$layer['layer_action']->action = array('a' => 'link');

									$layer['layer_action']->link_type = array('a' => 'a');

									$layer['layer_action']->image_link = array('a' => $link);

									$layer['layer_action']->link_open_in = array('a' => $link_open_in);

									

									unset($layer['link']);

									unset($layer['link_open_in']);

								case 'next':

									$layer['layer_action']->action = array('a' => 'next');

								break;

								case 'prev':

									$layer['layer_action']->action = array('a' => 'prev');

								break;

								case 'scroll_under':

									$scrollunder_offset = RevSliderFunctions::getVal($value, 'scrollunder_offset');

									$layer['layer_action']->action = array('a' => 'scroll_under');

									$layer['layer_action']->scrollunder_offset = array('a' => $scrollunder_offset);

									

									unset($layer['scrollunder_offset']);

								break;

								default: //its an ID, so its a slide ID

									$layer['layer_action']->action = array('a' => 'jumpto');

									$layer['layer_action']->jump_to_slide = array('a' => $slider_map[$link_slide]);

								break;

								

							}

							$layer['layer_action']->tooltip_event = array('a' => 'click');

							

							unset($layer['link_slide']);

							

							$did_change = true;

						}

						

						$layers[$key] = $layer;

					}

					

					$d = array('params' => $params, 'layers' => $layers, 'settings' => $settings);

					$d = apply_filters('revslider_importSliderFromPost_modify_data', $d, 'static', $d_path);

					

					$params = $d['params'];

					$layers = $d['layers'];

					$settings = $d['settings'];

					

					

					//create new slide

					$arrCreate = array();

					$arrCreate["slider_id"] = $sliderID;

					

					$my_layers = json_encode($layers);

					if(empty($my_layers))

						$my_layers = stripslashes(json_encode($layers));

					$my_params = json_encode($params);

					if(empty($my_params))

						$my_params = stripslashes(json_encode($params));

					$my_settings = json_encode($settings);

					if(empty($my_settings))

						$my_settings = stripslashes(json_encode($settings));

						

						

					$arrCreate["layers"] = $my_layers;

					$arrCreate["params"] = $my_params;

					$arrCreate["settings"] = $my_settings;

					

					if($sliderExists){

						unset($arrCreate["slider_id"]);

						$this->db->update(RevSliderGlobals::$table_static_slides,$arrCreate,array("slider_id"=>$sliderID));

					}else{

						$this->db->insert(RevSliderGlobals::$table_static_slides,$arrCreate);

					}

				}

			}

			

			$c_slider = new RevSliderSlider();

			$c_slider->initByID($sliderID);

			

			//check to convert styles to latest versions

			RevSliderPluginUpdate::update_css_styles(); //set to version 5

			RevSliderPluginUpdate::add_animation_settings_to_layer($c_slider); //set to version 5

			RevSliderPluginUpdate::add_style_settings_to_layer($c_slider); //set to version 5

			RevSliderPluginUpdate::change_settings_on_layers($c_slider); //set to version 5

			RevSliderPluginUpdate::add_general_settings($c_slider); //set to version 5

			RevSliderPluginUpdate::change_general_settings_5_0_7($c_slider); //set to version 5.0.7

			RevSliderPluginUpdate::change_layers_svg_5_2_5_5($c_slider); //set to version 5.2.5.5

			

			$cus_js = $c_slider->getParam('custom_javascript', '');

			

			if(strpos($cus_js, 'revapi') !== false){

				if(preg_match_all('/revapi[0-9]*/', $cus_js, $results)){

					

					if(isset($results[0]) && !empty($results[0])){

						foreach($results[0] as $replace){

							$cus_js = str_replace($replace, 'revapi'.$sliderID, $cus_js);

						}

					}

					

					$c_slider->updateParam(array('custom_javascript' => $cus_js));

					

				}

				

			}

			

			$real_slider_id = $sliderID;

			

			if($is_template !== false){ //duplicate the slider now, as we just imported the "template"

				if($single_slide !== false){ //add now one Slide to the current Slider

					$mslider = new RevSlider();

					

					//change slide_id to correct, as it currently is just a number beginning from 0 as we did not have a correct slide ID yet.

					$i = 0;

					$changed = false;

					foreach($slider_map as $value){

						if($i == $single_slide['slide_id']){

							$single_slide['slide_id'] = $value;

							$changed = true;

							break;

						}

						$i++;

					}

					

					if($changed){

						$return = $mslider->copySlideToSlider($single_slide);

					}else{

						return(array("success"=>false,"error"=>__('could not find correct Slide to copy, please try again.', 'revslider'),"sliderID"=>$sliderID));

					}

					

				}else{

					$mslider = new RevSlider();

					$title = RevSliderFunctions::getVal($sliderParams, 'title', 'slider1');	

					$talias = $title;

					$ti = 1;

					while($this->isAliasExistsInDB($talias)){ //set a new alias and title if its existing in database

						$talias = $title . $ti;

						$ti++;

					}

					$real_slider_id = $mslider->duplicateSliderFromData(array('sliderid' => $sliderID, 'title' => $talias));

				}

			}

			

			$wp_filesystem->delete($rem_path, true);

			

			

		}catch(Exception $e){

			$errorMessage = $e->getMessage();

			

			if(isset($rem_path)){

				$wp_filesystem->delete($rem_path, true);

			}

			return(array("success"=>false,"error"=>$errorMessage,"sliderID"=>$sliderID));

		}

		

		do_action('revslider_slider_imported', $real_slider_id);

		

		return(array("success"=>true,"sliderID"=>$real_slider_id));

	}

	

	

	/**

	 * 

	 * update slider from options

	 */

	public function updateSliderFromOptions($options){

		

		$sliderID = RevSliderFunctions::getVal($options, "sliderid");

		RevSliderFunctions::validateNotEmpty($sliderID,"Slider ID");

		

		$this->createUpdateSliderFromOptions($options,$sliderID);

	}

	

	/**

	 * 

	 * update some params in the slider

	 */

	public function updateParam($arrUpdate){

		$this->validateInited();

		

		$this->arrParams = array_merge($this->arrParams,$arrUpdate);

		$jsonParams = json_encode($this->arrParams);

		$arrUpdateDB = array();

		$arrUpdateDB["params"] = $jsonParams;

		

		$this->db->update(RevSliderGlobals::$table_sliders,$arrUpdateDB,array("id"=>$this->id));

	}

	

	/**

	 * update some settings in the slider

	 */

	public function updateSetting($arrUpdate){

		$this->validateInited();

		

		$this->settings = array_merge($this->settings,$arrUpdate);

		$jsonParams = json_encode($this->settings);

		$arrUpdateDB = array();

		$arrUpdateDB["settings"] = $jsonParams;

		

		$this->db->update(RevSliderGlobals::$table_sliders,$arrUpdateDB,array("id"=>$this->id));

	}

	

	

	/**

	 * 

	 * delete slider from input data

	 */

	public function deleteSliderFromData($data){

		$sliderID = RevSliderFunctions::getVal($data, "sliderid");

		RevSliderFunctions::validateNotEmpty($sliderID,"Slider ID");

		$this->initByID($sliderID);

		

		$this->deleteSlider();

		

		return true;

	}



	

	/**

	 * 

	 * delete slider from input data

	 */

	public function duplicateSliderFromData($data){

		$sliderID = RevSliderFunctions::getVal($data, "sliderid");

		RevSliderFunctions::validateNotEmpty($sliderID,"Slider ID");

		$this->initByID($sliderID);

		$slider_id = $this->duplicateSlider(RevSliderFunctions::getVal($data, "title"));

		return $slider_id;

	}



	

	/**

	 * delete slider from input data

	 * @since: 5.2.5

	 */

	public function duplicateSliderPackageFromData($data){

		$tmpl = new RevSliderTemplate();

		

		$slider_uid = RevSliderFunctions::getVal($data, "slideruid");

		

		$uids = $tmpl->get_package_uids($slider_uid);

		

		foreach($uids as $sid => $uid){

			if($sid < 0){ //one or more still needs to be downloaded...

				return __('Please install Package first to use this feature', 'revslider');

			}

		}

		

		foreach($uids as $sliderID => $uid){

			$slider = new RevSlider();

			$slider->initByID($sliderID);

			$slider_id = $slider->duplicateSlider(RevSliderFunctions::getVal($data, "title"), true);

		}

		

		return true;

	}

	

	

	/**

	 * 

	 * duplicate slide from input data

	 */

	public function duplicateSlideFromData($data){

		

		//init the slider

		$sliderID = RevSliderFunctions::getVal($data, "sliderID");

		RevSliderFunctions::validateNotEmpty($sliderID,"Slider ID");

		$this->initByID($sliderID);

		

		//get the slide id

		$slideID = RevSliderFunctions::getVal($data, "slideID");

		RevSliderFunctions::validateNotEmpty($slideID,"Slide ID");

		$newSlideID = $this->duplicateSlide($slideID);

		

		$this->duplicateChildren($slideID, $newSlideID);

		

		return(array($sliderID, $newSlideID));

	}

	

	

	/**

	 * duplicate slide children

	 * @param $slideID

	 */

	private function duplicateChildren($slideID,$newSlideID){

		

		$arrChildren = $this->getArrSlideChildren($slideID);

		

		foreach($arrChildren as $childSlide){

			$childSlideID = $childSlide->getID();

			//duplicate

			$duplicatedSlideID = $this->duplicateSlide($childSlideID);

			

			//update parent id

			$duplicatedSlide = new RevSlide();

			$duplicatedSlide->initByID($duplicatedSlideID);

			$duplicatedSlide->updateParentSlideID($newSlideID);

		}

		

	}

	

	

	/**

	 * copy slide from one Slider to the given Slider ID

	 * @since: 5.0

	 */

	public function copySlideToSlider($data){

		global $wpdb;

		

		$sliderID = intval(RevSliderFunctions::getVal($data, "slider_id"));

		RevSliderFunctions::validateNotEmpty($sliderID,"Slider ID");

		$slideID = intval(RevSliderFunctions::getVal($data, "slide_id"));

		RevSliderFunctions::validateNotEmpty($slideID,"Slide ID");

		

		$tableSliders = $wpdb->prefix . RevSliderGlobals::TABLE_SLIDERS_NAME;

		$tableSlides = $wpdb->prefix . RevSliderGlobals::TABLE_SLIDES_NAME;



		//check if ID exists

		$add_to_slider = $wpdb->get_row($wpdb->prepare("SELECT * FROM $tableSliders WHERE id = %s", $sliderID), ARRAY_A);

		

		if(empty($add_to_slider))

			return __('Slide could not be duplicated', 'revslider');

		

		//get last slide in slider for the order

		$slide_order = $wpdb->get_row($wpdb->prepare("SELECT * FROM $tableSlides WHERE slider_id = %s ORDER BY slide_order DESC", $sliderID), ARRAY_A);

		$order = (empty($slide_order)) ? 1 : $slide_order['slide_order'] + 1;

		

		$slide_to_copy = $wpdb->get_row($wpdb->prepare("SELECT * FROM $tableSlides WHERE id = %s", $slideID), ARRAY_A);

		

		if(empty($slide_to_copy))

			return __('Slide could not be duplicated', 'revslider');

		

		unset($slide_to_copy['id']); //remove the ID of Slide, as it will be a new Slide

		$slide_to_copy['slider_id'] = $sliderID; //set the new Slider ID to the Slide

		$slide_to_copy['slide_order'] = $order; //set the next slide order, to set slide to the end

		

		$response = $wpdb->insert($tableSlides, $slide_to_copy);

		

		if($response === false) return __('Slide could not be copied', 'revslider');

		

		return true;

	}

	

	

	/**

	 * copy / move slide from data

	 */

	public function copyMoveSlideFromData($data){

		

		$sliderID = RevSliderFunctions::getVal($data, "sliderID");

		RevSliderFunctions::validateNotEmpty($sliderID,"Slider ID");

		$this->initByID($sliderID);



		$targetSliderID = RevSliderFunctions::getVal($data, "targetSliderID");

		RevSliderFunctions::validateNotEmpty($sliderID,"Target Slider ID");

		$this->initByID($sliderID);

		

		if($targetSliderID == $sliderID)

			RevSliderFunctions::throwError("The target slider can't be equal to the source slider");

		

		$slideID = RevSliderFunctions::getVal($data, "slideID");

		RevSliderFunctions::validateNotEmpty($slideID,"Slide ID");

		

		$operation = RevSliderFunctions::getVal($data, "operation");

		

		$this->copyMoveSlide($slideID,$targetSliderID,$operation);

		

		return($sliderID);

	}

	

	

	/**

	 * create a slide from input data

	 */

	public function createSlideFromData($data,$returnSlideID = false){

		

		$sliderID = RevSliderFunctions::getVal($data, "sliderid");

		$obj = RevSliderFunctions::getVal($data, "obj");

		

		RevSliderFunctions::validateNotEmpty($sliderID,"Slider ID");

		$this->initByID($sliderID);

		

		if(is_array($obj)){	//multiple

			foreach($obj as $item){

				$slide = new RevSlide();

				$slideID = $slide->createSlide($sliderID, $item);

			}

			

			return(count($obj));

			

		}else{	//signle

			$urlImage = $obj;

			$slide = new RevSlide();

			$slideID = $slide->createSlide($sliderID, $urlImage);

			if($returnSlideID == true)

				return($slideID);

			else 

				return(1);	//num slides -1 slide created

		}

	}

	

	

	

	/**

	 * update slides order from data

	 */

	public function updateSlidesOrderFromData($data){

		$sliderID = RevSliderFunctions::getVal($data, "sliderID");

		$arrIDs = RevSliderFunctions::getVal($data, "arrIDs");

		RevSliderFunctions::validateNotEmpty($arrIDs,"slides");

		

		$this->initByID($sliderID);

		

		$isFromPosts = $this->isSlidesFromPosts();

		

		foreach($arrIDs as $index=>$slideID){

			

			$order = $index+1;

			

			if($isFromPosts){

				RevSliderFunctionsWP::updatePostOrder($slideID, $order);

			}else{

				

				$arrUpdate = array("slide_order"=>$order);

				$where = array("id"=>$slideID);

				$this->db->update(RevSliderGlobals::$table_slides,$arrUpdate,$where);

			}							

		}//end foreach

		

		//update sortby			

		if($isFromPosts){

			$arrUpdate = array();

			$arrUpdate["post_sortby"] = RevSliderFunctionsWP::SORTBY_MENU_ORDER;

			$this->updateParam($arrUpdate);

		} 

		

	}

	

	/**

	 * 

	 * get the "main" and "settings" arrays, for dealing with the settings.

	 */

	public function getSettingsFields(){

		$this->validateInited();

		

		$arrMain = array();

		$arrMain["title"] = $this->title;

		$arrMain["alias"] = $this->alias;

		

		$arrRespose = array("main"=>$arrMain, "params"=>$this->arrParams);

		

		return($arrRespose);

	}

	

	

	/**

	 * get all used fonts in the current Slider

	 * @since: 5.1.0

	 */

	public function getUsedFonts($full = false){

		$this->validateInited();

		$gf = array();

		

		$sl = new RevSliderSlide();

		

		$mslides = $this->getSlides(true);

		

		$staticID = $sl->getStaticSlideID($this->getID());

		if($staticID !== false){

			$msl = new RevSliderSlide();

			if(strpos($staticID, 'static_') === false){

				$staticID = 'static_'.$this->getID();

			}

			$msl->initByID($staticID);

			if($msl->getID() !== ''){

				$mslides = array_merge($mslides, array($msl));

			}

		}

		

		if(!empty($mslides)){

			foreach($mslides as $ms){

				$mf = $ms->getUsedFonts($full);

				if(!empty($mf)){

					foreach($mf as $mfk => $mfv){

						if(!isset($gf[$mfk])){

							$gf[$mfk] = $mfv;

						}else{

							foreach($mfv['variants'] as $mfvk => $mfvv){

								$gf[$mfk]['variants'][$mfvk] = true;

							}

						}

						$gf[$mfk]['slide'][] = array('id' => $ms->getID(), 'title' => $ms->getTitle());

					}

				}

			}

		}

		

		return apply_filters('revslider_getUsedFonts', $gf);

	}

	

	

	/**

	 * get slides from gallery

	 * force from gallery - get the slide from the gallery only

	 */

	public function getSlides($publishedOnly = false){

		

		$arrSlides = $this->getSlidesFromGallery($publishedOnly);

		

		return($arrSlides);

	}

	

	

	/**

	 * get slides from gallery

	 * get the slides raw, do not initialize them

	 * @since: 5.3.0

	 */

	public function getSlidesCountRaw($publishedOnly = false){

		

		$arrSlides = $this->getSlidesCountFromGallery($publishedOnly);

		

		return($arrSlides);

	}

	

	

	/**

	 * get first slide from gallery

	 * @since: 5.3.0

	 */

	public function getFirstSlide($publishedOnly = false){

		

		$arrSlides = $this->getSlidesFromGallery($publishedOnly, false, true);

		

		return($arrSlides);

	}

	

	

	/**

	 * get slides from gallery respecting wpml

	 * force from gallery - get the slide from the gallery only

	 */

	public function getSlidesWPML($publishedOnly = false, $slide){

		

		$arrSlides = $this->getSlides($publishedOnly);

		

		$mslide_list = array();

		

		//check if WPML is active and change the ID of Slide depending on that.

		if(RevSliderWpml::isWpmlExists() && $this->getParam('use_wpml', 'off') == 'on'){

			$lang = $slide->getParam('lang', 'all');

			

			if(!empty($arrSlides)){

				foreach($arrSlides as $at_slide){

					$langs = $at_slide->getArrChildrenLangs();

					

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

						foreach($langs as $l){

							if($l['lang'] == $lang){

								$mslide_list[] = array('id' => $l['slideid'], 'title' => $at_slide->getParam('title', 'Slide'));

							}

						}

					}

				}

			}

			//get cur lang of slide

		}else{

			if(!empty($arrSlides)){

				foreach($arrSlides as $at_slide){

					$mslID = $at_slide->getID();

					

					$mslide_list[] = array('id' => $mslID, 'title' => $at_slide->getParam('title', 'Slide'));

				}

			}

		}

		

		return($mslide_list);

	}

	

	

	/**

	 * get slides from posts

	 */

	public function getSlidesFromPosts($publishedOnly = false, $gal_ids = array()){

		

		$slideTemplates = $this->getSlidesFromGallery($publishedOnly);

		$slideTemplates = RevSliderFunctions::assocToArray($slideTemplates);

		

		if(count($slideTemplates) == 0) return array();

		

		$sourceType = $this->getParam("source_type","gallery");

		

		if(!empty($gal_ids)) $sourceType = 'specific_posts'; //change to specific posts, give the gal_ids to the list

		

		switch($sourceType){

			case "posts":

				//check where to get posts from

				$sourceType = $this->getParam("fetch_type","cat_tag");

				switch($sourceType){

					case 'cat_tag':

					default:

						$arrPosts = $this->getPostsFromCategories($publishedOnly);

					break;

					case 'related':

						$arrPosts = $this->getPostsFromRelated();

					break;

					case 'popular':

						$arrPosts = $this->getPostsFromPopular();

					break;

					case 'recent':

						$arrPosts = $this->getPostsFromRecent();

					break;

					case 'next_prev':

						$arrPosts = $this->getPostsNextPrevious();

					break;

				}

			break;

			case "current_post":

				global $post;

				$arrPosts = $this->getPostsFromSpecificList(array("",$post->ID));

			break;

			case "specific_posts":

				$arrPosts = $this->getPostsFromSpecificList($gal_ids);

			break;

			case 'woocommerce':

				$arrPosts = $this->getProductsFromCategories($publishedOnly);

			break;

			default:

				RevSliderFunctions::throwError("getSlidesFromPosts error: This source type must be from posts.");

			break;

		}

		

		$arrSlides = array();

		

		$templateKey = 0;

		$numTemplates = count($slideTemplates);

		

		

		foreach($arrPosts as $postData){

			$slideTemplate = clone $slideTemplates[$templateKey];

			

			//advance the templates

			$templateKey++;

			if($templateKey == $numTemplates){

				$templateKey = 0;

				$slideTemplates = $this->getSlidesFromGallery($publishedOnly); //reset as clone did not work properly

				$slideTemplates = RevSliderFunctions::assocToArray($slideTemplates);

			}

			

			$slide = new RevSlide();

			$slide->initByPostData($postData, $slideTemplate, $this->id);

			$arrSlides[] = $slide;

		}

		

		$this->arrSlides = $arrSlides;

		

		

		return($arrSlides);

	}

	

	

	/**

	 * get slides from posts

	 */

	public function getSlidesFromStream($publishedOnly = false){

		

		$slideTemplates = $this->getSlidesFromGallery($publishedOnly);

		$slideTemplates = RevSliderFunctions::assocToArray($slideTemplates);

		

		if(count($slideTemplates) == 0) return array();

		

		$arrPosts = array();

		

		$max_allowed = 999999;

		$sourceType = $this->getParam("source_type","gallery");

		$additions = array('fb_type' => 'album');

		switch($sourceType){

			case "facebook":

				$facebook = new RevSliderFacebook($this->getParam('facebook-transient','1200'));

				if($this->getParam('facebook-type-source','timeline') == "album"){

					$arrPosts = $facebook->get_photo_set_photos($this->getParam('facebook-album'),$this->getParam('facebook-count',10),$this->getParam('facebook-app-id'),$this->getParam('facebook-app-secret'));

				}

				else{

					$user_id = $facebook->get_user_from_url($this->getParam('facebook-page-url'));

					$arrPosts = $facebook->get_photo_feed($user_id,$this->getParam('facebook-app-id'),$this->getParam('facebook-app-secret'),$this->getParam('facebook-count',10));

					$additions['fb_type'] = $this->getParam('facebook-type-source','timeline');

					$additions['fb_user_id'] = $user_id;

				}

				

				if(!empty($arrPosts)){

					foreach($arrPosts as $k => $p){

						if(!isset($p->status_type)) continue;

						

						if(in_array($p->status_type, array("wall_post"))) unset($arrPosts[$k]);

					}

				}

				$max_posts = $this->getParam('facebook-count', '25', self::FORCE_NUMERIC);

				$max_allowed = 25;

			break;

			case "twitter":

				$twitter = new RevSliderTwitter($this->getParam('twitter-consumer-key'),$this->getParam('twitter-consumer-secret'),$this->getParam('twitter-access-token'),$this->getParam('twitter-access-secret'),$this->getParam('twitter-transient','1200'));

				$arrPosts = $twitter->get_public_photos($this->getParam('twitter-user-id'),$this->getParam('twitter-include-retweets'),$this->getParam( 'twitter-exclude-replies'),$this->getParam('twitter-count'),$this->getParam('twitter-image-only'));	

				$max_posts = $this->getParam('twitter-count', '500', self::FORCE_NUMERIC);

				$max_allowed = 500;

				$additions['twitter_user'] = $this->getParam('twitter-user-id');

			break;

			case "instagram":

				$instagram = new RevSliderInstagram($this->getParam('instagram-transient','1200'));

				if($this->getParam('instagram-type','user')!="hash"){

					$search_user_id = $this->getParam('instagram-user-id');

					$arrPosts = $instagram->get_public_photos($search_user_id,$this->getParam('instagram-count'));

				}

				else{

					$search_hash_tag = $this->getParam('instagram-hash-tag');

					$arrPosts = $instagram->get_tag_photos($search_hash_tag,$this->getParam('instagram-count'));

				}

				

				$max_posts = $this->getParam('instagram-count', '33', self::FORCE_NUMERIC);

				$max_allowed = 33;

			break;

			case "flickr":

				$flickr = new RevSliderFlickr($this->getParam('flickr-api-key'),$this->getParam('flickr-transient','1200'));

				switch($this->getParam('flickr-type')){

					case 'publicphotos':

						$user_id = $flickr->get_user_from_url($this->getParam('flickr-user-url'));

						$arrPosts = $flickr->get_public_photos($user_id,$this->getParam('flickr-count'));

					break;

					case 'gallery':

						$gallery_id = $flickr->get_gallery_from_url($this->getParam('flickr-gallery-url'));

						$arrPosts = $flickr->get_gallery_photos($gallery_id,$this->getParam('flickr-count'));

					break;

					case 'group':

						$group_id = $flickr->get_group_from_url($this->getParam('flickr-group-url'));

						$arrPosts = $flickr->get_group_photos($group_id,$this->getParam('flickr-count'));

					break;

					case 'photosets':

						$arrPosts = $flickr->get_photo_set_photos($this->getParam('flickr-photoset'),$this->getParam('flickr-count'));

					break;

				}

				$max_posts = $this->getParam('flickr-count', '99', self::FORCE_NUMERIC);

			break;

			case 'youtube':

				$channel_id = $this->getParam('youtube-channel-id');

				$youtube = new RevSliderYoutube($this->getParam('youtube-api'),$channel_id,$this->getParam('youtube-transient','1200'));

				

				if($this->getParam('youtube-type-source')=="playlist"){

					$arrPosts = $youtube->show_playlist_videos($this->getParam('youtube-playlist'),$this->getParam('youtube-count'));

				}

				else{

					$arrPosts = $youtube->show_channel_videos($this->getParam('youtube-count'));

				}

				$additions['yt_type'] = $this->getParam('youtube-type-source','channel');

				$max_posts = $this->getParam('youtube-count', '25', self::FORCE_NUMERIC);

				$max_allowed = 50;

				break;

			case 'vimeo':

				$vimeo = new RevSliderVimeo($this->getParam('vimeo-transient','1200'));

				$vimeo_type = $this->getParam('vimeo-type-source');

				

				switch ($vimeo_type) {

					case 'user':

						$arrPosts = $vimeo->get_vimeo_videos($vimeo_type,$this->getParam('vimeo-username'));

						break;

					case 'channel':

						$arrPosts = $vimeo->get_vimeo_videos($vimeo_type,$this->getParam('vimeo-channelname'));

						break;

					case 'group':

						$arrPosts = $vimeo->get_vimeo_videos($vimeo_type,$this->getParam('vimeo-groupname'));

						break;

					case 'album':

						$arrPosts = $vimeo->get_vimeo_videos($vimeo_type,$this->getParam('vimeo-albumid'));

						break;

					default:

						break;



				}

				$additions['vim_type'] = $this->getParam('vimeo-type-source','user');

				$max_posts = $this->getParam('vimeo-count', '25', self::FORCE_NUMERIC);

				$max_allowed = 60;

				break;

			default:

				RevSliderFunctions::throwError("getSlidesFromStream error: This source type must be from stream.");

			break;

		}

		

		if($max_posts < 0) $max_posts *= -1;

		

		$arrPosts = apply_filters('revslider_pre_mod_stream_data', $arrPosts, $sourceType, $this->id);

		

		while(count($arrPosts) > $max_posts || count($arrPosts) > $max_allowed){

			array_pop($arrPosts);

		}

		

		$arrPosts = apply_filters('revslider_post_mod_stream_data', $arrPosts, $sourceType, $this->id);

		

		$arrSlides = array();

		

		$templateKey = 0;

		$numTemplates = count($slideTemplates);

		

		if(empty($arrPosts)) RevSliderFunctions::throwError(__('Failed to load Stream', 'revslider'));

		

		foreach($arrPosts as $postData){

			if(empty($postData)) continue; //ignore empty entries, like from instagram

			

			$slideTemplate = $slideTemplates[$templateKey];

			

			//advance the templates

			$templateKey++;

			if($templateKey == $numTemplates)

				$templateKey = 0;

			

			$slide = new RevSlide();

			$slide->initByStreamData($postData, $slideTemplate, $this->id, $sourceType, $additions);

			$arrSlides[] = $slide;

		}

		

		$this->arrSlides = $arrSlides;

		

		return($arrSlides);

	}

	

	

	/**

	 * get the first slide ID of the current slider

	 */

	public function getFirstSlideIdFromGallery(){

		$this->validateInited();

		

		$arrSlides = array();

		$arrSlideRecords = $this->db->fetch(RevSliderGlobals::$table_slides,$this->db->prepare("slider_id = %s", array($this->id)),"slide_order",'',' LIMIT 0,1');

		

		foreach ($arrSlideRecords as $record){

			$slide = new RevSlide();

			$slide->initByData($record);

			$slideID = $slide->getID();

			$arrSlides[$slideID] = $slide;

			return $arrSlides;

		}

		

		return false;

	}

	

	

	/**

	 * get slides of the current slider

	 */

	public function getSlidesFromGallery($publishedOnly = false, $allwpml = false, $first = false){

		//global $rs_slide_template;

		$this->validateInited();

		

		$arrSlides = array();

		$arrSlideRecords = $this->db->fetch(RevSliderGlobals::$table_slides,$this->db->prepare("slider_id = %s", array($this->id)),"slide_order");

		

		//add Slides set by postsettings, so slide_template

		/*if(!empty($rs_slide_template)){

			foreach($rs_slide_template as $rs_s_t){

				$rs_s_t_d = $this->db->fetch(RevSliderGlobals::$table_slides,$this->db->prepare("id = %s", array($rs_s_t)),"slide_order");

				foreach($rs_s_t_d as $rs_s_t_d_v){

					$arrSlideRecords[] = $rs_s_t_d_v;

				}

			}

		}*/

		

		$arrChildren = array();

		

		foreach ($arrSlideRecords as $record){

			$slide = new RevSlide();

			$slide->initByData($record);

			

			$slideID = $slide->getID();

			$arrIdsAssoc[$slideID] = true;



			if($publishedOnly == true){

				$state = $slide->getParam("state", "published");

				if($state == "unpublished"){

					continue;

				}

			}

			

			$parentID = $slide->getParam("parentid","");

			if(!empty($parentID)){

				$lang = $slide->getParam("lang","");

				if(!isset($arrChildren[$parentID]))

					$arrChildren[$parentID] = array();

				$arrChildren[$parentID][] = $slide;

				if(!$allwpml)

					continue;	//skip adding to main list

			}

			

			//init the children array

			$slide->setArrChildren(array());

			

			$arrSlides[$slideID] = $slide;

			

			if($first) break; //we only want the first slide!

		}

		

		//add children array to the parent slides

		foreach($arrChildren as $parentID=>$arr){

			if(!isset($arrSlides[$parentID])){

				continue;

			}

			$arrSlides[$parentID]->setArrChildren($arr);

		}

		

		$this->arrSlides = $arrSlides;



		return($arrSlides);

	}

	

	

	/**

	 * get slides of the current slider

	 * @since: 5.3.0

	 */

	public function getSlidesFromGalleryRaw($publishedOnly = false){

	

		$this->validateInited();

		

		$arrSlideRecords = $this->db->fetch(RevSliderGlobals::$table_slides,$this->db->prepare("slider_id = %s", array($this->id)),"slide_order");

		

		return $arrSlideRecords;

	}

	

	

	/**

	 * get slides of the current slider

	 * @since: 5.3.0

	 */

	public function getSlidesCountFromGallery($publishedOnly = false){

	

		$this->validateInited();

		

		$sqlSelect = $this->db->prepare("select `id` from ".RevSliderGlobals::$table_slides." where `slider_id` = %s", array($this->id));

		$arrSlideRecords = $this->db->runSqlR($sqlSelect);

		

		return $arrSlideRecords;

	}

	

	

	

	/**

	 * 

	 * get slide id and slide title from gallery

	 */

	public function getArrSlidesFromGalleryShort(){

		$arrSlides = $this->getSlidesFromGallery();

		

		$arrOutput = array();

		$counter = 0;

		foreach($arrSlides as $slide){

			$slideID = $slide->getID();

			$outputName = 'Slide '.$counter;

			$title = $slide->getParam('title','');

			$counter++;

			

			if(!empty($title))

				$outputName .= ' - ('.$title.')';

				

			$arrOutput[$slideID] = $outputName;

		}

		

		return($arrOutput);

	}

	

	

	/**

	 * 

	 * get slides for output

	 * one level only without children

	 */

	public function getSlidesForOutput($publishedOnly = false, $lang = 'all',$gal_ids = array()){

		

		$isSlidesFromPosts = $this->isSlidesFromPosts();

		$isSlidesFromStream = $this->isSlidesFromStream();

		

		

		if(RevSliderWpml::isWpmlExists() && $this->getParam('use_wpml', 'off') == 'on'){

			$cur_lang = apply_filters( 'wpml_current_language', null );

			$wpml_current_language = apply_filters( 'wpml_current_language', null );

			do_action( 'wpml_switch_language', $lang );

		}

		

		if($isSlidesFromPosts){

			$arrParentSlides = $this->getSlidesFromPosts($publishedOnly, $gal_ids);

		}elseif($isSlidesFromStream !== false){

			$arrParentSlides = $this->getSlidesFromStream($publishedOnly);

		}else{

			$arrParentSlides = $this->getSlides($publishedOnly);

		}

		

		if(RevSliderWpml::isWpmlExists() && $this->getParam('use_wpml', 'off') == 'on'){ //switch language back

			do_action( 'wpml_switch_language', $cur_lang );

		}

		

		if($lang == 'all' || $isSlidesFromStream) // || $isSlidesFromPosts

			return($arrParentSlides);

		

		$arrSlides = array();

		foreach($arrParentSlides as $parentSlide){

			$parentLang = $parentSlide->getLang();

			if($parentLang == $lang)

				$arrSlides[] = $parentSlide;

				

			$childAdded = false;

			$arrChildren = $parentSlide->getArrChildren();

			foreach($arrChildren as $child){

				$childLang = $child->getLang();

				

				

				//echo $childLang .'||'. $lang.'--';

				

				

				if($childLang == $lang){

					$arrSlides[] = $child;

					$childAdded = true;

					break;

				}

			}

			

			if($childAdded == false && $parentLang == "all")

				$arrSlides[] = $parentSlide;

		}

		

		return($arrSlides);

	}

	

	

	/**

	 * 

	 * get array of slide names

	 */

	public function getArrSlideNames(){

		if(empty($this->arrSlides))

			$this->getSlidesFromGallery();

		

		$arrSlideNames = array();



		foreach($this->arrSlides as $number=>$slide){

			$slideID = $slide->getID();

			$filename = $slide->getImageFilename();	

			$slideTitle = $slide->getParam("title","Slide");

			$slideName = $slideTitle;

			if(!empty($filename))

				$slideName .= " ($filename)";

			

			$arrChildrenIDs = $slide->getArrChildrenIDs();

			 

			$arrSlideNames[$slideID] = array("name"=>$slideName,"arrChildrenIDs"=>$arrChildrenIDs,"title"=>$slideTitle);

		}

		return($arrSlideNames);

	}

	

	

	/**

	 * 

	 * get array of slides numbers by id's

	 */

	public function getSlidesNumbersByIDs($publishedOnly = false){

		

		if(empty($this->arrSlides))

			$this->getSlides($publishedOnly);

		

		$arrSlideNumbers = array();

		

		$counter = 0;

		

		if(empty($this->arrSlides)) return $arrSlideNumbers;

		

		foreach($this->arrSlides as $slide){

			$counter++;

			$slideID = $slide->getID();

			$arrSlideNumbers[$slideID] = $counter;				

		}

		return($arrSlideNumbers);

	}

	

	

	/**

	 * 

	 * get slider params for export slider

	 */

	private function getParamsForExport(){

		$exportParams = $this->arrParams;

		

		//modify background image

		$urlImage = RevSliderFunctions::getVal($exportParams, "background_image");

		if(!empty($urlImage))

			$exportParams["background_image"] = $urlImage;

		

		return($exportParams);

	}



	

	/**

	 * 

	 * get slides for export

	 */

	public function getSlidesForExport($useDummy = false){

		$arrSlides = $this->getSlidesFromGallery(false, true);

		$arrSlidesExport = array();

		

		foreach($arrSlides as $slide){

			$slideNew = array();

			$slideNew["id"] = $slide->getID();

			$slideNew["params"] = $slide->getParamsForExport();

			$slideNew["slide_order"] = $slide->getOrder();

			$slideNew["layers"] = $slide->getLayersForExport($useDummy);

			$slideNew["settings"] = $slide->getSettings();

			

			$arrSlidesExport[] = $slideNew;

		}

		

		return apply_filters('revslider_getSlidesForExport', $arrSlidesExport);

	}



	

	/**

	 * 

	 * get slides for export

	 */

	public function getStaticSlideForExport($useDummy = false){

		$arrSlidesExport = array();

		

		$slide = new RevSlide();

		

		$staticID = $slide->getStaticSlideID($this->id);

		if($staticID !== false){

			$slideNew = array();

			$slide->initByStaticID($staticID);

			$slideNew["params"] = $slide->getParamsForExport();

			$slideNew["slide_order"] = $slide->getOrder();

			$slideNew["layers"] = $slide->getLayersForExport($useDummy);

			$slideNew["settings"] = $slide->getSettings();

			$arrSlidesExport[] = $slideNew;

		}

		

		return apply_filters('revslider_getStaticSlideForExport', $arrSlidesExport);

	}

	

	

	/**

	 * get slides number

	 */

	public function getNumSlides($publishedOnly = false){

		

		if(empty($this->arrSlides))

			$this->getSlides($publishedOnly);

		

		$numSlides = count($this->arrSlides);

		return($numSlides);

	}

	

	

	/**

	 * get slides number

	 */

	public function getNumSlidesRaw($publishedOnly = false){

		

		if(empty($this->arrSlides)){

			$ret = $this->getSlidesCountRaw($publishedOnly);

			$numSlides = count($ret);

		}else{

			$numSlides = count($this->arrSlides);

		}

		return($numSlides);

	}

	

	

	/**

	 * get real slides number, from posts, social streams ect.

	 */

	public function getNumRealSlides($publishedOnly = false, $type = 'post'){

		$numSlides = count($this->arrSlides);

		

		switch($type){

			case 'post':

				if($this->getParam('fetch_type', 'cat_tag') == 'next_prev'){

					$numSlides = 2;

				}else{

					$numSlides = $this->getParam('max_slider_posts', count($this->arrSlides));

					if(intval($numSlides) == 0) $numSlides = '∞';

					//$this->getSlidesFromPosts($publishedOnly);

					//$numSlides = count($this->arrSlides);

				}

			break;

			case 'facebook':

				$numSlides = $this->getParam('facebook-count', count($this->arrSlides));

			break;

			case 'twitter':

				$numSlides = $this->getParam('twitter-count', count($this->arrSlides));

			break;

			case 'instagram':

				$numSlides = $this->getParam('instagram-count', count($this->arrSlides));

			break;

			case 'flickr':

				$numSlides = $this->getParam('flickr-count', count($this->arrSlides));

			break;

			case 'youtube':

				$numSlides = $this->getParam('youtube-count', count($this->arrSlides));

			break;

			case 'vimeo':

				$numSlides = $this->getParam('vimeo-count', count($this->arrSlides));

			break;

		}

		

		return($numSlides);

	}

	

	

	/**

	 * get real slides number, from posts, social streams ect.

	 */

	public function getNumRealStreamSlides($publishedOnly = false){

		

		$this->getSlidesFromStream($publishedOnly);

		

		$numSlides = count($this->arrSlides);

		return($numSlides);

	}

	

	

	/**

	 * get sliders array - function don't belong to the object!

	 */

	public function getArrSliders($orders = false, $templates = 'neither'){

		$order_fav = false;

		if($orders !== false && key($orders) != 'favorite'){

			$order_direction = reset($orders);

			$do_order = key($orders);

		}else{

			$do_order = 'id';

			$order_direction = 'ASC';

			if(is_array($orders) && key($orders) == 'favorite'){

				$order_direction = reset($orders);

				$order_fav = true;

			}

		}

		//$where = "`type` != 'template' ";

		$where = "`type` != 'template' OR `type` IS NULL";

		

		$response = $this->db->fetch(RevSliderGlobals::$table_sliders,$where,$do_order,'',$order_direction);

		

		$arrSliders = array();

		foreach($response as $arrData){

			$slider = new RevSlider();

			$slider->initByDBData($arrData);

			

			/*

			This part needs to stay for backwards compatibility. It is used in the update process from v4x to v5x

			*/

			if($templates === true){

				if($slider->getParam("template","false") == "false") continue;

			}elseif($templates === false){

				if($slider->getParam("template","false") == "true") continue;

			}

			

			$arrSliders[] = $slider;

		}

		

		if($order_fav === true){

			$temp = array();

			$temp_not = array();

			foreach($arrSliders as $key => $slider){

				if($slider->isFavorite()){

					$temp_not[] = $slider;

				}else{

					$temp[] = $slider;

				}

			}

			$arrSliders = array();

			$arrSliders = ($order_direction == 'ASC') ? array_merge($temp, $temp_not) : array_merge($temp_not, $temp);

		}

		

		return($arrSliders);

	}



	

	/**

	 * get array of alias

	 */

	public function getAllSliderAliases(){

		$where = "`type` != 'template'";

		

		$response = $this->db->fetch(RevSliderGlobals::$table_sliders,$where,"id");

		

		$arrAliases = array();

		foreach($response as $arrSlider){

			$arrAliases[] = $arrSlider["alias"];

		}

		

		return($arrAliases);

	}



	/**

	 * get array of alias

	 */

	public function getAllSliderForAdminMenu(){

		$arrSliders = $this->getArrSliders();

		$arrShort = array();

		if(!empty($arrSliders)){

			foreach($arrSliders as $slider){

				$id = $slider->getID();

				$title = $slider->getTitle();

				$alias = $slider->getAlias();

				

				$arrShort[$id] = array('title' => $title, 'alias' => $alias);

			}

		}

		

		return($arrShort);

	}	

	

	

	/**

	 * 

	 * get array of slider id -> title

	 */		

	public function getArrSlidersShort($exceptID = null,$filterType = self::SLIDER_TYPE_ALL){

		$arrSliders = $this->getArrSliders();

		$arrShort = array();

		foreach($arrSliders as $slider){

			$id = $slider->getID();

			$isFromPosts = $slider->isSlidesFromPosts();

			$isTemplate = $slider->getParam("template","false");

			

			//filter by gallery only

			if($filterType == self::SLIDER_TYPE_POSTS && $isFromPosts == false)

				continue;

				

			if($filterType == self::SLIDER_TYPE_GALLERY && $isFromPosts == true)

				continue;

			

			//filter by template type

			if($filterType == self::SLIDER_TYPE_TEMPLATE && $isFromPosts == false)

				continue;

			

			//filter by except

			if(!empty($exceptID) && $exceptID == $id)

				continue;

				

			$title = $slider->getTitle();

			$arrShort[$id] = $title;

		}

		return($arrShort);

	}

	

	/**

	 * 

	 * get array of sliders with slides, short, assoc.

	 */

	public function getArrSlidersWithSlidesShort($filterType = self::SLIDER_TYPE_ALL){

		$arrSliders = self::getArrSlidersShort(null, $filterType);

		

		$output = array();

		foreach($arrSliders as $sliderID=>$sliderName){

			$slider = new RevSlider();

			$slider->initByID($sliderID);

			

			$isFromPosts = $slider->isSlidesFromPosts();

			$isTemplate = $slider->getParam("template","false");

			

			//filter by gallery only

			if($filterType == self::SLIDER_TYPE_POSTS && $isFromPosts == false)

				continue;

				

			if($filterType == self::SLIDER_TYPE_GALLERY && $isFromPosts == true)

				continue;

			

			//filter by template type

			if($filterType == self::SLIDER_TYPE_TEMPLATE && $isFromPosts == false) //$isTemplate == "false")

				continue;

				

			$sliderTitle = $slider->getTitle();

			$arrSlides = $slider->getArrSlidesFromGalleryShort();

			

			foreach($arrSlides as $slideID=>$slideName){

				$output[$slideID] = $sliderName.", ".$slideName;

			}

		}

		

		return($output);

	}

	

	

	/**

	 * 

	 * get max order

	 */

	public function getMaxOrder(){

		$this->validateInited();

		$maxOrder = 0;

		$arrSlideRecords = $this->db->fetch(RevSliderGlobals::$table_slides,$this->db->prepare("slider_id = %s", array($this->id)),"slide_order desc","","limit 1");

		if(empty($arrSlideRecords))

			return($maxOrder);

		$maxOrder = $arrSlideRecords[0]["slide_order"];

		

		return($maxOrder);

	}

	

	/**

	 * 

	 * get setting - start with slide

	 */

	public function getStartWithSlideSetting(){

		

		$numSlides = $this->getNumSlides();

		

		$startWithSlide = $this->getParam("start_with_slide","1");

		if(is_numeric($startWithSlide)){

			$startWithSlide = (int)$startWithSlide - 1;

			if($startWithSlide < 0)

				$startWithSlide = 0;

				

			if($startWithSlide >= $numSlides)

				$startWithSlide = 0;

			

		}else

			$startWithSlide = 0;

		

		return($startWithSlide);

	}

	

	

	/**

	 * return if the slides source is from posts

	 */

	public function isSlidesFromPosts(){

		$this->validateInited();

		$sourceType = $this->getParam("source_type","gallery");

		if($sourceType == "posts" || $sourceType == "specific_posts" || $sourceType == "current_post" || $sourceType == "woocommerce")

			return(true);

		

		return(false);

	}

	

	

	/**

	 * return if the slides source is from stream

	 */

	public function isSlidesFromStream(){

		$this->validateInited();

		$sourceType = $this->getParam("source_type","gallery");

		if($sourceType != "posts" && $sourceType != "specific_posts" && $sourceType != "current_post" && $sourceType != "woocommerce" && $sourceType != "gallery")

			return($sourceType);

		

		return(false);

	}

	

	

	/**

	 * 

	 * get posts from categories (by the slider params).

	 */

	private function getPostsFromCategories($publishedOnly = false){

		$this->validateInited();

		

		$catIDs = $this->getParam("post_category");

		$data = RevSliderFunctionsWP::getCatAndTaxData($catIDs);

		

		$taxonomies = $data["tax"];

		$catIDs = $data["cats"];

		

		$sortBy = $this->getParam("post_sortby",self::DEFAULT_POST_SORTBY);

		$sortDir = $this->getParam("posts_sort_direction",self::DEFAULT_POST_SORTDIR);

		$maxPosts = $this->getParam("max_slider_posts","30");

		if(empty($maxPosts) || !is_numeric($maxPosts))

			$maxPosts = -1;

		

		$postTypes = $this->getParam("post_types","any");

			

		//set direction for custom order

		if($sortBy == RevSliderFunctionsWP::SORTBY_MENU_ORDER)

			$sortDir = RevSliderFunctionsWP::ORDER_DIRECTION_ASC;

		

		//Events integration

		$arrAddition = array();

		if($publishedOnly == true)			

			$arrAddition["post_status"] = RevSliderFunctionsWP::STATE_PUBLISHED;

		

		if(RevSliderEventsManager::isEventsExists()){

			

			$filterType = $this->getParam("events_filter",RevSliderEventsManager::DEFAULT_FILTER);				

			$arrAddition = RevSliderEventsManager::getWPQuery($filterType, $sortBy);

		}

		

		$slider_id = $this->getID();

		$arrPosts = RevSliderFunctionsWP::getPostsByCategory($slider_id, $catIDs,$sortBy,$sortDir,$maxPosts,$postTypes,$taxonomies,$arrAddition);

		

		return($arrPosts);

	}  

	

	

	/**

	 * get related posts from current one

	 * @since: 5.1.1

	 */

	public function getPostsFromRelated(){

		$my_posts = array();

		

		$sortBy = $this->getParam("post_sortby",self::DEFAULT_POST_SORTBY);

		$sortDir = $this->getParam("posts_sort_direction",self::DEFAULT_POST_SORTDIR);

		$max_posts = $this->getParam("max_slider_posts","30");

		if(empty($max_posts) || !is_numeric($max_posts))

			$max_posts = -1;

		

		$post_id = get_the_ID();

		

		$tags_string = '';

		$post_tags = get_the_tags();

		

		if ($post_tags) {

			foreach ($post_tags as $post_tag) {

				$tags_string .= $post_tag->slug . ',';

			}

		}

		

		$query = array(

						'exclude' => $post_id,

						'numberposts' => $max_posts,

						'order' => $sortDir,

						'tag' => $tags_string

					  );

					  

		if(strpos($sortBy, "meta_num_") === 0){

			$metaKey = str_replace("meta_num_", "", $sortBy);

			$query["orderby"] = "meta_value_num";

			$query["meta_key"] = $metaKey;

		}else

		if(strpos($sortBy, "meta_") === 0){

			$metaKey = str_replace("meta_", "", $sortBy);

			$query["orderby"] = "meta_value";

			$query["meta_key"] = $metaKey;

		}else

			$query["orderby"] = $sortBy;

		

		$get_relateds = apply_filters('revslider_get_related_posts', $query, $post_id);

		

		$tag_related_posts = get_posts($get_relateds);		

		

		

		if(count($tag_related_posts) < $max_posts){

			$ignore = array();

			foreach($tag_related_posts as $tag_related_post){

				$ignore[] = $tag_related_post->ID;

			}

			$article_categories = get_the_category($post_id);

			$category_string = '';

			foreach($article_categories as $category) { 

				$category_string .= $category->cat_ID . ',';

			}

			$max = $max_posts - count($tag_related_posts);

			

			$excl = implode(',', $ignore);

			$query = array(

							'exclude' => $excl,

							'numberposts' => $max,

							'category' => $category_string

						  );

						  

			if(strpos($sortBy, "meta_num_") === 0){

				$metaKey = str_replace("meta_num_", "", $sortBy);

				$query["orderby"] = "meta_value_num";

				$query["meta_key"] = $metaKey;

			}else

			if(strpos($sortBy, "meta_") === 0){

				$metaKey = str_replace("meta_", "", $sortBy);

				$query["orderby"] = "meta_value";

				$query["meta_key"] = $metaKey;

			}else

				$query["orderby"] = $sortBy;

			

			$get_relateds = apply_filters('revslider_get_related_posts', $query, $post_id);

			$cat_related_posts = get_posts($get_relateds);

			

			$tag_related_posts = $tag_related_posts + $cat_related_posts;

		}

		

		foreach($tag_related_posts as $post){

			$the_post = array();

			

			if(method_exists($post, "to_array"))

				$the_post = $post->to_array();

			else

				$the_post = (array)$post;

			

			if($the_post['ID'] == $post_id) continue;

			

			$my_posts[] = $the_post;

		}

		

		return $my_posts;

	}

	

	

	/**

	 * get popular posts

	 * @since: 5.1.1

	 */

	public function getPostsFromPopular($max_posts = false){

		$post_id = get_the_ID();

		

		if($max_posts == false){

			$max_posts = $this->getParam("max_slider_posts","30");

			if(empty($max_posts) || !is_numeric($max_posts))

				$max_posts = -1;

		}else{

			$max_posts = intval($max_posts);

		}

		$my_posts = array();

		

		$args = array(

			'post_type' => 'any',

			'posts_per_page' => $max_posts,

			'suppress_filters' => 0,

			'meta_key'    => '_thumbnail_id',

			'orderby'     => 'comment_count',

			'order'       => 'DESC'

		);

		

		$args = apply_filters('revslider_get_popular_posts', $args, $post_id);

		$posts = get_posts($args);

		

		foreach($posts as $post){

		

			if(method_exists($post, "to_array"))

				$my_posts[] = $post->to_array();

			else

				$my_posts[] = (array)$post;

		}

		

		return $my_posts;

	}

	

	

	/**

	 * get recent posts

	 * @since: 5.1.1

	 */

	public function getPostsFromRecent($max_posts = false){

		$post_id = get_the_ID();

		

		if($max_posts == false){

			$max_posts = $this->getParam("max_slider_posts","30");

			if(empty($max_posts) || !is_numeric($max_posts))

				$max_posts = -1;

		}else{

			$max_posts = intval($max_posts);

		}

		

		$my_posts = array();

		

		$args = array(

			'post_type' => 'any',

			'posts_per_page' => $max_posts,

			'suppress_filters' => 0,

			'meta_key'    => '_thumbnail_id',

			'orderby'     => 'date',

			'order'       => 'DESC'

		);

		$args = apply_filters('revslider_get_latest_posts', $args, $post_id);

		

		$posts = get_posts($args);

		

		foreach($posts as $post){

		

			if(method_exists($post, "to_array"))

				$my_posts[] = $post->to_array();

			else

				$my_posts[] = (array)$post;

		}

		

		return $my_posts;

	}

	

	/**

	 * get recent posts

	 * @since: 5.1.1

	 */

	public function getPostsNextPrevious(){

		$my_posts = array();

		

		$startup_next_post = get_next_post();

		if (!empty( $startup_next_post )){

			if(method_exists($startup_next_post, "to_array"))

				$my_posts[] = $startup_next_post->to_array();

			else

				$my_posts[] = (array)$startup_next_post;

		}    



		$startup_previous_post = get_previous_post();

		if (!empty( $startup_previous_post )){

			if(method_exists($startup_previous_post, "to_array"))

				$my_posts[] = $startup_previous_post->to_array();

			else

				$my_posts[] = (array)$startup_previous_post;

		}

		

		return $my_posts;

	}

	

	

	/**

	 * get products from categories (by the slider params).

	 * @since: 5.1.0

	 */

	private function getProductsFromCategories($publishedOnly = false){

		$this->validateInited();

		

		$catIDs = $this->getParam("product_category");

		$data = RevSliderFunctionsWP::getCatAndTaxData($catIDs);

		

		$taxonomies = $data["tax"];

		$catIDs = $data["cats"];

		

		$sortBy = $this->getParam("product_sortby",self::DEFAULT_POST_SORTBY);

		$sortDir = $this->getParam("product_sort_direction",self::DEFAULT_POST_SORTDIR);

		$maxPosts = $this->getParam("max_slider_products","30");

		if(empty($maxPosts) || !is_numeric($maxPosts))

			$maxPosts = -1;

		

		$postTypes = $this->getParam("product_types","any");

			

		//set direction for custom order

		if($sortBy == RevSliderFunctionsWP::SORTBY_MENU_ORDER)

			$sortDir = RevSliderFunctionsWP::ORDER_DIRECTION_ASC;

		

		//Events integration

		$arrAddition = array();

		if($publishedOnly == true)			

			$arrAddition["post_status"] = RevSliderFunctionsWP::STATE_PUBLISHED;

		

		

		$arrAddition = array_merge($arrAddition, RevSliderWooCommerce::getMetaQuery($this->getParams()));

		$tax_addition = array();

		

		if(isset($arrAddition['tax_query'])){

			$tax_addition = $arrAddition['tax_query'];

			unset($arrAddition['tax_query']);

		}

		

		

		$slider_id = $this->getID();

		$arrPosts = RevSliderFunctionsWP::getPostsByCategory($slider_id, $catIDs,$sortBy,$sortDir,$maxPosts,$postTypes,$taxonomies,$arrAddition,$tax_addition);

		

		return($arrPosts);

	}

	

	

	/**

	 * 

	 * get posts from specific posts list

	 */

	private function getPostsFromSpecificList($gal_ids = array()){

		

		$is_gal = false;

		$additional = array();



		if(!empty($gal_ids) && $gal_ids[0]){

			$strPosts = $gal_ids;

			$strPosts = apply_filters('revslider_set_posts_list_gal', $strPosts, $this->getID());

			$is_gal = true;

		}else{

			if(isset($gal_ids[0])){

				unset($gal_ids[0]);

				$strPosts = implode(",", $gal_ids);

				$additional['order'] = "none";

				$additional['orderby'] = "post__in";

			}else {

				$strPosts = $this->getParam("posts_list", "");	

				$additional['order'] = $this->getParam("posts_sort_direction", "DESC");

				$additional['orderby'] = $this->getParam("post_sortby", "");

			}

			$strPosts = apply_filters('revslider_set_posts_list', $strPosts, $this->getID());

		}

		

		$slider_id = $this->getID();

		

		$arrPosts = RevSliderFunctionsWP::getPostsByIDs($strPosts, $slider_id, $is_gal, $additional);



		return($arrPosts);

	}

	

	/**

	 * update sortby option

	 */

	public function updatePostsSortbyFromData($data){

		

		$sliderID = RevSliderFunctions::getVal($data, "sliderID");

		$sortBy = RevSliderFunctions::getVal($data, "sortby");

		RevSliderFunctions::validateNotEmpty($sortBy,"sortby");

		

		$this->initByID($sliderID);

		$arrUpdate = array();

		$arrUpdate["post_sortby"] = $sortBy;

		

		$this->updateParam($arrUpdate); 

	}



	/**

	 * 

	 * replace image urls

	 */

	public function replaceImageUrlsFromData($data){

		

		$sliderID = RevSliderFunctions::getVal($data, "sliderid");

		$urlFrom = RevSliderFunctions::getVal($data, "url_from");

		RevSliderFunctions::validateNotEmpty($urlFrom,"url from");

		$urlTo = RevSliderFunctions::getVal($data, "url_to");

		

		$this->initByID($sliderID);

		

		$arrSildes = $this->getSlides();

		foreach($arrSildes as $slide){

			$slide->replaceImageUrls($urlFrom, $urlTo);

		}

		

		

		

		$slide = new RevSlide();

		$staticID = $slide->getStaticSlideID($sliderID);

		

		if($staticID !== false){

			$slide->initByStaticID($staticID);

			$slide->replaceImageUrls($urlFrom, $urlTo, $staticID);

		}

	}

	

	public function resetSlideSettings($data){

		$sliderID = RevSliderFunctions::getVal($data, "sliderid");

		

		$this->initByID($sliderID);

		

		$arrSildes = $this->getSlides();

		foreach($arrSildes as $slide){

			$slide->reset_slide_values($data);

		}

	}

	

	public static function clear_error_in_string($m){

		return 's:'.strlen($m[2]).':"'.$m[2].'";';

	}

	

}



/**

 * old classname extends new one (old classnames will be obsolete soon)

 * @since: 5.0

 **/

class RevSlider extends RevSliderSlider {}

?>