<?php

 

 class UniteBaseAdminClassRev extends UniteBaseClassRev{

 	

		const ACTION_ADMIN_MENU = "admin_menu";

		const ACTION_ADMIN_INIT = "admin_init";	

		const ACTION_ADD_SCRIPTS = "admin_enqueue_scripts";

		const ACTION_ADD_METABOXES = "add_meta_boxes";

		const ACTION_SAVE_POST = "save_post";

		

		const ROLE_ADMIN = "admin";

		const ROLE_EDITOR = "editor";

		const ROLE_AUTHOR = "author";

		

		protected static $master_view;

		protected static $view;

		

		private static $arrSettings = array();

		private static $arrMenuPages = array();

		private static $tempVars = array();

		private static $startupError = "";

		private static $menuRole = self::ROLE_ADMIN;

		private static $arrMetaBoxes = "";		//option boxes that will be added to post

		

		

		/**

		 * 

		 * main constructor		 

		 */

		public function __construct($mainFile,$t,$defaultView){

						

			parent::__construct($mainFile,$t);

			

			//set view

			self::$view = self::getGetVar("view");

			if(empty(self::$view))

				self::$view = $defaultView;

				

			//add internal hook for adding a menu in arrMenus

			self::addAction(self::ACTION_ADMIN_MENU, "addAdminMenu");

			self::addAction(self::ACTION_ADD_METABOXES, "onAddMetaboxes");

			self::addAction(self::ACTION_SAVE_POST, "onSavePost");

			

			//if not inside plugin don't continue

			if($this->isInsidePlugin() == true){

				self::addAction(self::ACTION_ADD_SCRIPTS, "addCommonScripts");

				self::addAction(self::ACTION_ADD_SCRIPTS, "onAddScripts");

			}

			

			//a must event for any admin. call onActivate function.

			$this->addEvent_onActivate();

			self::addActionAjax("show_image", "onShowImage");

			

			self::addCommonScripts();

		}		

		

		/**

		 * 

		 * add some meta box

		 * return metabox handle

		 */

		public static function addMetaBox($title,$content = null, $customDrawFunction = null,$location="post"){

			

			$box = array();

			$box["title"] = $title;

			$box["location"] = $location;

			$box["content"] = $content;

			$box["draw_function"] = $customDrawFunction;

			

			self::$arrMetaBoxes[] = $box;			

		}

		

		

		/**

		 * 

		 * on add metaboxes

		 */

		public static function onAddMetaboxes(){

			

			foreach(self::$arrMetaBoxes as $index=>$box){

				

				$title = $box["title"];

				$location = $box["location"];

				

				$boxID = "mymetabox_".self::$dir_plugin.'_'.$index;

				$function = array(self::$t, "onAddMetaBoxContent");

				

				if(is_array($location)){

					foreach($location as $loc)

						add_meta_box($boxID,$title,$function,$loc,'normal','default');

				}else

			    	add_meta_box($boxID,$title,$function,$location,'normal','default');

			}

		}

		

		/**

		 * 

		 * on save post meta. Update metaboxes data from post, add it to the post meta 

		 */

		public static function onSavePost(){

			

			//protection against autosave

			if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE ){

				$postID = UniteFunctionsRev::getPostVariable("ID");

	        	return $postID;

			}

			

			$postID = UniteFunctionsRev::getPostVariable("ID");

			if(empty($postID))

				return(false);

				

				

			foreach(self::$arrMetaBoxes as $box){

				$content = UniteFunctionsRev::getVal($box, "content");

				if(gettype($content) != "object")

					continue;

					

				$arrSettingNames = $content->getArrSettingNames();

				foreach($arrSettingNames as $name){

					$value = UniteFunctionsRev::getPostVariable($name);

					update_post_meta( $postID, $name, $value );

				}	//end foreach settings



			} //end foreach meta

			

		}

		

		/**

		 * 

		 * on add metabox content

		 */

		public static function onAddMetaBoxContent($post,$boxData){

			

			$postID = $post->ID;

			

			$boxID = UniteFunctionsRev::getVal($boxData, "id");

			$index = str_replace("mymetabox_".self::$dir_plugin.'_',"",$boxID);

			

			$arrMetabox = self::$arrMetaBoxes[$index];

			

			$content = UniteFunctionsRev::getVal($arrMetabox, "content");

			

			$contentType = getType($content);

			switch ($contentType){

				case "string":

					echo $content;

				break;

				default:		//settings object					

					$output = new UniteSettingsProductSidebarRev();

					$output->setDefaultInputClass(UniteSettingsProductSidebarRev::INPUT_CLASS_LONG);					

					$content->updateValuesFromPostMeta($postID);										

					$output->init($content);



					//draw element

					$drawFunction = UniteFunctionsRev::getVal($arrMetabox, "draw_function");

					if(!empty($drawFunction))

						call_user_func($drawFunction,$output);

					else

						$output->draw();

						

				break;

			}

			

		}

		

		

		

		/**

		 * 

		 * set the menu role - for viewing menus

		 */

		public static function setMenuRole($menuRole){

			self::$menuRole = $menuRole;

		}

		

		/**

		 * 

		 * set startup error to be shown in master view

		 */

		public static function setStartupError($errorMessage){

			self::$startupError = $errorMessage;

		}

		

		

		/**

		 * 

		 * tells if the the current plugin opened is this plugin or not 

		 * in the admin side.

		 */

		private function isInsidePlugin(){

			$page = self::getGetVar("page");

			if($page == self::$dir_plugin)

				return(true);

			return(false);

		} 

		

		

		/**

		 * 

		 * add common used scripts

		 */

		public static function addCommonScripts(){

			

			$isJoomla3 = UniteFunctionJoomlaRev::isJoomla3();

			

			$urlJQuery = "https://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js";

			

			if($isJoomla3 == false){

				self::addScriptAbsoluteUrl($urlJQuery,"jquery");

			}

			else{

				JHtml::_('bootstrap.framework');				

			}

			

			$urlJqueryUI = "https://ajax.googleapis.com/ajax/libs/jqueryui/1.10.1/jquery-ui.min.js";

			self::addScriptAbsoluteUrl($urlJqueryUI,"jquery-ui");

			

			self::addScriptCommon("jquery-migrate.min","jquery-migrate");

			

			//self::addStyle("jquery-ui-1.10.3.custom.min","jui-smoothness","css/jui/new");

			self::addStyleAbsoluteUrl('https://ajax.googleapis.com/ajax/libs/jqueryui/1.10.1/themes/base/jquery-ui.css', 'jui-smoothness');

			

			self::addScriptCommon("settings","unite_settings");

			self::addScriptCommon("admin","unite_admin");

			self::addScriptCommon("jquery.tipsy","tipsy");

			

			//--- add styles

			self::addStyleCommon("colors-fresh","wp-colors-fresh");

			self::addStyleCommon("buttons","wp-buttons");

			

			self::addStyleCommon("admin","unite_admin");

			self::addStyleCommon("admin-joomla","joomla admin additions");

			

			//add tipsy

			self::addStyleCommon("tipsy","tipsy");

			

			//include farbtastic

			self::addScriptCommon("my-farbtastic","my-farbtastic","js/farbtastic");

			self::addStyleCommon("farbtastic","farbtastic","js/farbtastic");

			

			//include codemirror

			self::addScriptCommon("codemirror","codemirror_js","js/codemirror");

			self::addScriptCommon("css","codemirror_js_css","js/codemirror");

			self::addStyleCommon("codemirror","codemirror_css","js/codemirror");

			

			//include fancybox:

			self::addScriptCommon("jquery.fancybox-1.3.4.pack","fancybox_js","js/fancybox");

			self::addStyleCommon("jquery.fancybox-1.3.4","fancybox_css","js/fancybox");

			

			//include dropdown checklist

			//self::addScriptCommon("ui.dropdownchecklist-1.4-min","dropdownchecklist_js","js/dropdownchecklist");

			self::addScriptCommon("ui.dropdownchecklist","dropdownchecklist_js","js/dropdownchecklist");

			//self::addStyleCommon("ui.dropdownchecklist.standalone","dropdownchecklist_css","js/dropdownchecklist");

						

		}

		

		

		

		/**

		 * 

		 * admin pages parent, includes all the admin files by default

		 */

		public static function adminPages(){

			//self::validateAdminPermissions();

		}

		

		

		/**

		 * 

		 * validate permission that the user is admin, and can manage options.

		 */

		protected static function isAdminPermissions(){

			

			if( is_admin() &&  current_user_can("manage_options") )

				return(true);

				

			return(false);

		}

		

		/**

		 * 

		 * validate admin permissions, if no pemissions - exit

		 */

		protected static function validateAdminPermissions(){

			if(!self::isAdminPermissions()){

				echo "access denied";

				return(false);

			}			

		}

		

		/**

		 * 

		 * set view that will be the master

		 */

		protected static function setMasterView($masterView){

			self::$master_view = $masterView;

		}

		

		/**

		 * 

		 * inlcude some view file

		 */

		protected static function requireView($view){

			try{

				//require master view file, and 

				if(!empty(self::$master_view) && !isset(self::$tempVars["is_masterView"]) ){

					$masterViewFilepath = self::$path_views.self::$master_view.".php";

					UniteFunctionsRev::validateFilepath($masterViewFilepath,"Master View");

					

					self::$tempVars["is_masterView"] = true;

					require $masterViewFilepath;

				}

				else{		//simple require the view file.

					$viewFilepath = self::$path_views.$view.".php";

					

					UniteFunctionsRev::validateFilepath($viewFilepath,"View");

					require $viewFilepath;

				}

				

			}catch (Exception $e){

				echo "<br><br>View ($view) Error: <b>".$e->getMessage()."</b>";

				

				if(self::$debugMode == true)

					dmp($e->getTraceAsString());

			}

		}

		

		/**

		 * require some template from "templates" folder

		 */

		protected static function getPathTemplate($templateName){

			

			$pathTemplate = self::$path_templates.$templateName.".php";

			UniteFunctionsRev::validateFilepath($pathTemplate,"Template");

			

			return($pathTemplate);

		}

		

		/**

		 * 

		 * require settings file, the filename without .php

		 */

		public static function requireSettings($settingsFile){

			

			try{

				require self::$path_plugin."settings/$settingsFile.php";

			}catch (Exception $e){

				echo "<br><br>Settings ($settingsFile) Error: <b>".$e->getMessage()."</b>";

				dmp($e->getTraceAsString());

			}

		}

		

		/**

		 * 

		 * get path to settings file

		 * @param $settingsFile

		 */

		protected static function getSettingsFilePath($settingsFile){

			

			$filepath = self::$path_plugin."settings/$settingsFile.php";

			return($filepath);

		}

		

		

		/**

		 * 

		 * add all js and css needed for media upload

		 */

		protected static function addMediaUploadIncludes(){

			

			self::addWPScript("thickbox");

			self::addWPStyle("thickbox");

			self::addWPScript("media-upload");

			

		}

		

		

		/**

		 * add admin menus from the list.

		 */

		public static function addAdminMenu(){

			

			$role = "manage_options";

			

			switch(self::$menuRole){

				case self::ROLE_AUTHOR:

					$role = "edit_published_posts";

				break;

				case self::ROLE_EDITOR:

					$role = "edit_pages";

				break;		

				default:		

				case self::ROLE_ADMIN:

					$role = "manage_options";

				break;

			}

			

			foreach(self::$arrMenuPages as $menu){

				$title = $menu["title"];

				$pageFunctionName = $menu["pageFunction"];

				add_menu_page( $title, $title, $role, self::$dir_plugin, array(self::$t, $pageFunctionName) );

			}

			

		}

		

		

		/**

		 * 

		 * add menu page

		 */

		protected static function addMenuPage($title,$pageFunctionName){

						

			self::$arrMenuPages[] = array("title"=>$title,"pageFunction"=>$pageFunctionName);

			

		}



		/**

		 * 

		 * get url to some view.

		 */

		public static function getViewUrl($viewName,$urlParams=""){

			$params = "&view=".$viewName;

			if(!empty($urlParams))

				$params .= "&".$urlParams;

						

			$link = self::$url_component. "&page=".self::$dir_plugin.$params;

			

			return($link);

		}



		

		/**

		 * 

		 * register the "onActivate" event

		 */

		protected function addEvent_onActivate($eventFunc = "onActivate"){

			register_activation_hook( self::$mainFile, array(self::$t, $eventFunc) );

		}

		

		/**

		 * 

		 * store settings in the object

		 */

		protected static function storeSettings($key,$settings){

			self::$arrSettings[$key] = $settings;

		}

		

		/**

		 * 

		 * get settings object

		 */

		protected static function getSettings($key){

			if(!isset(self::$arrSettings[$key]))

				UniteFunctionsRev::throwError("Settings $key not found");

			$settings = self::$arrSettings[$key];

			return($settings);

		}

		

		

		/**

		 * 

		 * add ajax back end callback, on some action to some function.

		 */

		protected static function addActionAjax($ajaxAction,$eventFunction){

			self::addAction('wp_ajax_'.self::$dir_plugin."_".$ajaxAction, $eventFunction);

			self::addAction('wp_ajax_nopriv_'.self::$dir_plugin."_".$ajaxAction, $eventFunction);

		}

		

		/**

		 * 

		 * echo json ajax response

		 */

		private static function ajaxResponse($success,$message,$arrData = null){

			

			$response = array();			

			$response["success"] = $success;				

			$response["message"] = $message;

			

			if(!empty($arrData)){

				

				if(gettype($arrData) == "string")

					$arrData = array("data"=>$arrData);				

				

				$response = array_merge($response,$arrData);

			}

				

			$json = json_encode($response);

			

			echo $json;

			exit();

		}



		/**

		 * 

		 * echo json ajax response, without message, only data

		 */

		protected static function ajaxResponseData($arrData){

			if(gettype($arrData) == "string")

				$arrData = array("data"=>$arrData);

			

			self::ajaxResponse(true,"",$arrData);

		}

		

		/**

		 * 

		 * echo json ajax response

		 */

		protected static function ajaxResponseError($message,$arrData = null){

			

			self::ajaxResponse(false,$message,$arrData,true);

		}

		

		/**

		 * echo ajax success response

		 */

		protected static function ajaxResponseSuccess($message,$arrData = null){

			

			self::ajaxResponse(true,$message,$arrData,true);

			

		}

		

		/**

		 * echo ajax success response

		 */

		protected static function ajaxResponseSuccessRedirect($message,$url){

			$arrData = array("is_redirect"=>true,"redirect_url"=>$url);

			

			self::ajaxResponse(true,$message,$arrData,true);

		}

		



		/**

		 * 

		 * Enter description here ...

		 */

		protected static function updatePlugin($viewBack = false){

			$linkBack = self::getViewUrl($viewBack);

			$htmlLinkBack = UniteFunctionsRev::getHtmlLink($linkBack, "Go Back");

			

			//check if css table exist, if not, we need to verify that the current captions.css can be parsed

			if(UniteFunctionsWPRev::isDBTableExists(GlobalsRevSlider::TABLE_CSS_NAME)){

				$captions = RevOperations::getCaptionsCssContentArray();

				if($captions === false){

					$message = "CSS parse error! Please make sure your captions.css is valid CSS before updating the plugin!";

					echo "<div style='color:#B80A0A;font-size:18px;'><b>Update Error: </b> $message</div><br>";

					echo $htmlLinkBack;

					exit();

				}

			}

			

			$zip = new UniteZipRev();

						

			try{

				

				if(function_exists("unzip_file") == false){					

					if( UniteZipRev::isZipExists() == false)

						UniteFunctionsRev::throwError("The ZipArchive php extension not exists, can't extract the update file. Please turn it on in php ini.");

				}

				

				dmp("Update in progress...");

				

				$arrFiles = UniteFunctionsRev::getVal($_FILES, "update_file");

				if(empty($arrFiles))

					UniteFunctionsRev::throwError("Update file don't found.");

					

				$filename = UniteFunctionsRev::getVal($arrFiles, "name");

				

				if(empty($filename))

					UniteFunctionsRev::throwError("Update filename not found.");

				

				$fileType = UniteFunctionsRev::getVal($arrFiles, "type");

				

				/*				

				$fileType = strtolower($fileType);

				

				if($fileType != "application/zip")

					UniteFunctionsRev::throwError("The file uploaded is not zip.");

				*/

				

				$filepathTemp = UniteFunctionsRev::getVal($arrFiles, "tmp_name");

				if(file_exists($filepathTemp) == false)

					UniteFunctionsRev::throwError("Can't find the uploaded file.");	



				//crate temp folder

				UniteFunctionsRev::checkCreateDir(self::$path_temp);



				//create the update folder

				$pathUpdate = self::$path_temp."update_extract/";				

				UniteFunctionsRev::checkCreateDir($pathUpdate);

								

				//remove all files in the update folder

				if(is_dir($pathUpdate)){ 

					$arrNotDeleted = UniteFunctionsRev::deleteDir($pathUpdate,false);

					if(!empty($arrNotDeleted)){

						$strNotDeleted = print_r($arrNotDeleted,true);

						UniteFunctionsRev::throwError("Could not delete those files from the update folder: $strNotDeleted");

					}

				}

				

				//copy the zip file.

				$filepathZip = $pathUpdate.$filename;

				

				$success = move_uploaded_file($filepathTemp, $filepathZip);

				if($success == false)

					UniteFunctionsRev::throwError("Can't move the uploaded file here: ".$filepathZip.".");

				

				if(function_exists("unzip_file") == true){

					WP_Filesystem();

					$response = unzip_file($filepathZip, $pathUpdate);

				}

				else					

					$zip->extract($filepathZip, $pathUpdate);

				

				//get extracted folder

				$arrFolders = UniteFunctionsRev::getFoldersList($pathUpdate);

				if(empty($arrFolders))

					UniteFunctionsRev::throwError("The update folder is not extracted");

				

				if(count($arrFolders) > 1)

					UniteFunctionsRev::throwError("Extracted folders are more then 1. Please check the update file.");

					

				//get product folder

				$productFolder = $arrFolders[0];

				if(empty($productFolder))

					UniteFunctionsRev::throwError("Wrong product folder.");

					

				if($productFolder != self::$dir_plugin)

					UniteFunctionsRev::throwError("The update folder don't match the product folder, please check the update file.");

				

				$pathUpdateProduct = $pathUpdate.$productFolder."/";				

				

				//check some file in folder to validate it's the real one:

				$checkFilepath = $pathUpdateProduct.$productFolder.".php";

				if(file_exists($checkFilepath) == false)

					UniteFunctionsRev::throwError("Wrong update extracted folder. The file: ".$checkFilepath." not found.");

				

				//copy the plugin without the captions file.

				//$pathOriginalPlugin = $pathUpdate."copy/";

				$pathOriginalPlugin = self::$path_plugin;

				

				$arrBlackList = array();

				$arrBlackList[] = "rs-plugin/css/captions.css";

				$arrBlackList[] = "rs-plugin/css/dynamic-captions.css";

				$arrBlackList[] = "rs-plugin/css/static-captions.css";

				

				UniteFunctionsRev::copyDir($pathUpdateProduct, $pathOriginalPlugin,"",$arrBlackList);

				

				//delete the update

				UniteFunctionsRev::deleteDir($pathUpdate);

				

				dmp("Updated Successfully, redirecting...");

				echo "<script>location.href='$linkBack'</script>";

				

			}catch(Exception $e){

				$message = $e->getMessage();

				$message .= " <br> Please update the plugin manually via the ftp";

				echo "<div style='color:#B80A0A;font-size:18px;'><b>Update Error: </b> $message</div><br>";

				echo $htmlLinkBack;

				exit();

			}

			

		}

		

 	

 }

 

 ?>