<?php

class RevSliderAdmin extends UniteBaseAdminClassRev
{

    const DEFAULT_VIEW = "sliders";

    const VIEW_SLIDER = "slider";
    const VIEW_SLIDER_TEMPLATE = "slider_template";
    const VIEW_SLIDERS = "sliders";

    const VIEW_SLIDES = "slides";
    const VIEW_SLIDE = "slide";


    /**
     *
     * the constructor
     */
    public function __construct($mainFilepath)
    {

        parent::__construct($mainFilepath, $this, self::DEFAULT_VIEW);


        //print globals
        /*
        $class = new ReflectionClass('GlobalsRevSlider');
        $arr = $class->getStaticProperties();
        dmp($arr);
        */

        $this->init();
        self::onAddScripts();
        self::adminPages();
    }


    /**
     *
     * init all actions
     */
    private function init()
    {

        //$this->checkCopyCaptionsCSS();

        //self::setDebugMode();

        self::createDBTables();        //update the captions file in db, the install done via sql file.

        //include general settings
        self::requireSettings("general_settings");

        //set role
        $generalSettings = self::getSettings("general");

        $role = $generalSettings->getSettingValue("role", UniteBaseAdminClassRev::ROLE_ADMIN);

        self::setMenuRole($role);

        self::addMenuPage('Unite Slider', "adminPages");

        //$this->addSliderMetaBox('post');

        //add common scripts there
        //self::addAction(self::ACTION_ADMIN_INIT, "onAdminInit");

        //ajax response to save slider options.
        self::onAjaxAction();
    }


    /**
     *
     * add wildcards metabox variables to posts
     */
    private function addSliderMetaBox($postTypes = null)
    { //null = all, post = only posts
        try {
            $settings = RevOperations::getWildcardsSettings();

            self::addMetaBox("Unite Slider Options", $settings, array("RevSliderAdmin", "customPostFieldsOutput"), $postTypes);
        } catch (Exception $e) {

        }
    }


    /**
     *  custom output function
     */
    public static function customPostFieldsOutput(UniteSettingsProductSidebarRev $output)
    {

        //$settings = $output->getArrSettingNames();

        ?>
        <ul class="revslider_settings">
            <?php
            $output->drawSettingsByNames("slide_template");
            ?>
        </ul>
        <?php
    }


    /**
     * a must function. please don't remove it.
     * process activate event - install the db (with delta).
     */
    public static function onActivate()
    {
        self::createDBTables();
    }

    /**
     *
     * create db tables
     */
    public static function createDBTables()
    {
        self::createTable(GlobalsRevSlider::TABLE_SLIDERS_NAME);

        /*
        self::createTable(GlobalsRevSlider::TABLE_SLIDES_NAME);
        self::createTable(GlobalsRevSlider::TABLE_SETTINGS_NAME);
        self::createTable(GlobalsRevSlider::TABLE_CSS_NAME);
        self::createTable(GlobalsRevSlider::TABLE_LAYER_ANIMS_NAME);
        */
    }


    /**
     * if caption file don't exists - copy it from the original file.
     */
    public static function checkCopyCaptionsCSS()
    {
        if (file_exists(GlobalsRevSlider::$filepath_captions) == false)
            copy(GlobalsRevSlider::$filepath_captions_original, GlobalsRevSlider::$filepath_captions);

        if (!file_exists(GlobalsRevSlider::$filepath_captions) == true) {
            self::setStartupError("Can't copy <b>captions-original.css </b> to <b>captions.css</b> in <b> plugins/revslider/rs-plugin/css </b> folder. Please try to copy the file by hand or turn to support.");
        }

    }


    /**
     *
     * a must function. adds scripts on the page
     * add all page scripts and styles here.
     * pelase don't remove this function
     * common scripts even if the plugin not load, use this function only if no choise.
     */
    public static function onAddScripts()
    {
        self::addStyle("edit_layers", "edit_layers");
        self::addStyle("font-awesome", "font-awesome");

        //add google font
        //$urlGoogleFont = "http://fonts.googleapis.com/css?family=PT+Sans+Narrow:400,700";
        //self::addStyleAbsoluteUrl($urlGoogleFont,"google-font-pt-sans-narrow");

        self::addScriptCommon("edit_layers", "unite_layers");
        self::addScriptCommon("css_editor", "unite_css_editor");
        self::addScript("rev_admin");

        //include themepunch plugins
        $urlPlugins = GlobalsRevSlider::$url_item_plugin . "js/jquery.themepunch.tools.min.js";
        self::addScriptAbsoluteUrl($urlPlugins, "themepunch_plugins");

        //include all media upload scripts
        //self::addMediaUploadIncludes();

        //add rs css:
        self::addStyleAbsoluteUrl(self::$url_item_plugin . "css/settings.css", "rs-plugin-settings");
        self::addStyleAbsoluteUrl(GlobalsRevSlider::$urlCaptionsCSSAdmin, "rs-plugin-captions");
        self::addStyleAbsoluteUrl(self::$url_item_plugin . "css/static-captions.css", "rs-plugin-static captions");
    }


    /**
     *
     * admin main page function.
     */
    public static function adminPages()
    {

        parent::adminPages();

        //require styles by view
        switch (self::$view) {
            case self::VIEW_SLIDERS:
            case self::VIEW_SLIDER:
            case self::VIEW_SLIDER_TEMPLATE:
                self::requireSettings("slider_settings");
                break;
            case self::VIEW_SLIDES:
                break;
            case self::VIEW_SLIDE:
                break;
        }

        self::setMasterView("master_view");
        self::requireView(self::$view);
    }

    /**
     *
     * craete tables
     */
    public static function createTable($tableName)
    {
        global $wpdb;

        $parseCssToDb = false;

        //check if database is empty
        $result = $wpdb->get_row("SELECT COUNT( DISTINCT id ) AS NumberOfEntrys FROM " . self::$table_prefix . GlobalsRevSlider::TABLE_CSS_NAME);
        if ($result->NumberOfEntrys == 0) $parseCssToDb = true;

        if ($parseCssToDb) {
            $revOperations = new RevOperations();
            $revOperations->importCaptionsCssContentArray();
            $revOperations->moveOldCaptionsCss();

            $revOperations->updateDynamicCaptions(true);
        }

        /*

        //if table exists - don't create it.
        $tableRealName = self::$table_prefix.$tableName;
        if(UniteFunctionsWPRev::isDBTableExists($tableRealName))
            return(false);

        $charset_collate = '';
        if(method_exists($wpdb, "get_charset_collate"))
            $charset_collate = $wpdb->get_charset_collate();
        else{
            if ( ! empty($wpdb->charset) )
                $charset_collate = "DEFAULT CHARACTER SET $wpdb->charset";
            if ( ! empty($wpdb->collate) )
                $charset_collate .= " COLLATE $wpdb->collate";
        }

        switch($tableName){
            case GlobalsRevSlider::TABLE_SLIDERS_NAME:
            $sql = "CREATE TABLE " .self::$table_prefix.$tableName ." (
                          id int(9) NOT NULL AUTO_INCREMENT,
                          title tinytext NOT NULL,
                          alias tinytext,
                          params text NOT NULL,
                          PRIMARY KEY (id)
                        )$charset_collate;";
            break;
            case GlobalsRevSlider::TABLE_SLIDES_NAME:
                $sql = "CREATE TABLE " .self::$table_prefix.$tableName ." (
                              id int(9) NOT NULL AUTO_INCREMENT,
                              slider_id int(9) NOT NULL,
                              slide_order int not NULL,
                              params text NOT NULL,
                              layers text NOT NULL,
                              PRIMARY KEY (id)
                            )$charset_collate;";
            break;
            case GlobalsRevSlider::TABLE_SETTINGS_NAME:
                $sql = "CREATE TABLE " .self::$table_prefix.$tableName ." (
                              id int(9) NOT NULL AUTO_INCREMENT,
                              general TEXT NOT NULL,
                              params TEXT NOT NULL,
                              PRIMARY KEY (id)
                            )$charset_collate;";
            break;
            case GlobalsRevSlider::TABLE_CSS_NAME:
                $sql = "CREATE TABLE " .self::$table_prefix.$tableName ." (
                              id int(9) NOT NULL AUTO_INCREMENT,
                              handle TEXT NOT NULL,
                              settings TEXT,
                              hover TEXT,
                              params TEXT NOT NULL,
                              PRIMARY KEY (id)
                            )$charset_collate;";
                $parseCssToDb = true;
            break;
            case GlobalsRevSlider::TABLE_LAYER_ANIMS_NAME:
                $sql = "CREATE TABLE " .self::$table_prefix.$tableName ." (
                              id int(9) NOT NULL AUTO_INCREMENT,
                              handle TEXT NOT NULL,
                              params TEXT NOT NULL,
                              PRIMARY KEY (id)
                            )$charset_collate;";
            break;

            default:
                UniteFunctionsRev::throwError("table: $tableName not found");
            break;
        }

        require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
        dbDelta($sql);
        */

    }

    /**
     *
     * import slideer handle (not ajax response)
     */
    private static function importSliderHandle($viewBack = null, $updateAnim = true, $updateStatic = true)
    {

        dmp(__ug("importing slider setings and data...", REVSLIDER_TEXTDOMAIN));

        $slider = new RevSlider();
        $response = $slider->importSliderFromPost($updateAnim, $updateStatic);
        $sliderID = $response["sliderID"];

        if (empty($viewBack)) {
            $viewBack = self::getViewUrl(self::VIEW_SLIDER, "id=" . $sliderID);
            if (empty($sliderID))
                $viewBack = self::getViewUrl(self::VIEW_SLIDERS);
        }

        //handle error
        if ($response["success"] == false) {
            $message = $response["error"];
            dmp("<b>Error: " . $message . "</b>");
            echo UniteFunctionsRev::getHtmlLink($viewBack, __ug("Go Back", REVSLIDER_TEXTDOMAIN));
        } else {    //handle success, js redirect.
            dmp(__ug("Slider Import Success, redirecting...", REVSLIDER_TEXTDOMAIN));
            echo "<script>location.href='$viewBack'</script>";
        }
        exit();
    }


    /**
     *
     * onAjax action handler
     */
    public static function onAjaxAction()
    {

        $actionIndicator = self::getPostGetVar("action");

        if ($actionIndicator != "uniterevolution_ajax_action")
            return (false);

        $action = self::getPostGetVar("client_action");

        $data = self::getPostGetVar("data");
        $nonce = self::getPostGetVar("nonce");

        $slider = new RevSlider();
        $slide = new RevSlide();
        $operations = new RevOperations();

        try {

            //verify the nonce
            $isVerified = wp_verify_nonce($nonce, "revslider_actions");

            if ($isVerified == false)
                UniteFunctionsRev::throwError("Wrong request");

            switch ($action) {
                case "export_slider":
                    RevOperations::validatePermission(GlobalsRevSlider::PERMISSION_SLIDER_OPERATIONS);

                    $sliderID = self::getGetVar("sliderid");
                    $dummy = self::getGetVar("dummy");
                    $nozip = self::getGetVar("nozip");
                    $nozip = UniteFunctionsRev::strToBool($nozip);

                    $slider->initByID($sliderID);
                    $slider->exportSlider($dummy, $nozip);
                    break;
                case "import_slider":
                    RevOperations::validatePermission(GlobalsRevSlider::PERMISSION_SLIDER_OPERATIONS);

                    $updateAnim = self::getPostGetVar("update_animations");
                    $updateStatic = self::getPostGetVar("update_static_captions");
                    self::importSliderHandle(null, $updateAnim, $updateStatic);
                    break;
                case "import_slider_slidersview":
                    RevOperations::validatePermission(GlobalsRevSlider::PERMISSION_SLIDER_OPERATIONS);

                    $viewBack = self::getViewUrl(self::VIEW_SLIDERS);
                    $updateAnim = self::getPostGetVar("update_animations");
                    $updateStatic = self::getPostGetVar("update_static_captions");
                    self::importSliderHandle($viewBack, $updateAnim, $updateStatic);
                    break;
                case "create_slider":
                    RevOperations::validatePermission(GlobalsRevSlider::PERMISSION_SLIDER_OPERATIONS);

                    self::requireSettings("slider_settings");
                    $settingsMain = self::getSettings("slider_main");
                    $settingsParams = self::getSettings("slider_params");

                    $data = $operations->modifyCustomSliderParams($data);

                    $newSliderID = $slider->createSliderFromOptions($data, $settingsMain, $settingsParams);

                    self::ajaxResponseSuccessRedirect(
                        __ug("The slider successfully created", REVSLIDER_TEXTDOMAIN),
                        self::getViewUrl("sliders"));

                    break;
                case "update_slider":
                    RevOperations::validatePermission(GlobalsRevSlider::PERMISSION_SLIDER_SETTINGS);

                    self::requireSettings("slider_settings");
                    $settingsMain = self::getSettings("slider_main");
                    $settingsParams = self::getSettings("slider_params");
			
                    $data = $operations->modifyCustomSliderParams($data);
		
                    $slider->updateSliderFromOptions($data, $settingsMain, $settingsParams);
                    self::ajaxResponseSuccess(__ug("Slider updated", REVSLIDER_TEXTDOMAIN));
                    break;
                case "update_slider_title":
                    RevOperations::validatePermission(GlobalsRevSlider::PERMISSION_SLIDER_SETTINGS);

                    self::requireSettings("slider_settings");
                    $settingsMain = self::getSettings("slider_main");
                    $settingsParams = self::getSettings("slider_params");
			
                    $data = $operations->modifyCustomSliderParams($data);
		//var_dump($data); die;
                    $slider->updateSliderFromOptions($data, $settingsMain, $settingsParams);
                    self::ajaxResponseSuccess(__ug("Slider updated", REVSLIDER_TEXTDOMAIN));
                    break;

                case "delete_slider":
                    RevOperations::validatePermission(GlobalsRevSlider::PERMISSION_SLIDER_OPERATIONS);

                    $isDeleted = $slider->deleteSliderFromData($data);

                    if (is_array($isDeleted)) {
                        $isDeleted = implode(', ', $isDeleted);
                        self::ajaxResponseError("Template can't be deleted, it is still being used by the following Sliders: " . $isDeleted);
                    } else {
                        self::ajaxResponseSuccessRedirect(
                            __ug("The slider deleted", REVSLIDER_TEXTDOMAIN),
                            self::getViewUrl(self::VIEW_SLIDERS));
                    }
                    break;
                case "duplicate_slider":
                    RevOperations::validatePermission(GlobalsRevSlider::PERMISSION_SLIDER_OPERATIONS);

                    $slider->duplicateSliderFromData($data);

                    self::ajaxResponseSuccessRedirect(
                        __ug("The duplicate successfully, refreshing page...", REVSLIDER_TEXTDOMAIN),
                        self::getViewUrl(self::VIEW_SLIDERS));
                    break;
                case "add_slide":
                    RevOperations::validatePermission(GlobalsRevSlider::PERMISSION_SLIDE_OPERATIONS);

                    $numSlides = $slider->createSlideFromData($data);
                    $sliderID = $data["sliderid"];

                    if ($numSlides == 1) {
                        $responseText = __ug("Slide Created", REVSLIDER_TEXTDOMAIN);
                    } else
                        $responseText = $numSlides . " " . __ug("Slides Created", REVSLIDER_TEXTDOMAIN);

                    $urlRedirect = self::getViewUrl(self::VIEW_SLIDES, "id=$sliderID");
                    self::ajaxResponseSuccessRedirect($responseText, $urlRedirect);

                    break;
                case "add_slide_fromslideview":
                    RevOperations::validatePermission(GlobalsRevSlider::PERMISSION_SLIDE_OPERATIONS);

                    $slideID = $slider->createSlideFromData($data, true);
                    $urlRedirect = self::getViewUrl(self::VIEW_SLIDE, "id=$slideID");
                    $responseText = __ug("Slide Created, redirecting...", REVSLIDER_TEXTDOMAIN);
                    self::ajaxResponseSuccessRedirect($responseText, $urlRedirect);
                    break;
                case "update_slide":
                    RevOperations::validatePermission(GlobalsRevSlider::PERMISSION_EDIT_SLIDE);

                    require self::getSettingsFilePath("slide_settings");

                    $slide->updateSlideFromData($data, $slideSettings);
                    self::ajaxResponseSuccess(__ug("Slide updated", REVSLIDER_TEXTDOMAIN));
                    break;
                case "delete_slide":
                   
                    RevOperations::validatePermission(GlobalsRevSlider::PERMISSION_SLIDE_OPERATIONS);

                    $isPost = $slide->deleteSlideFromData($data);
                    if ($isPost)
                        $message = __ug("Post Deleted Successfully", REVSLIDER_TEXTDOMAIN);
                    else
                        $message = __ug("Slide Deleted Successfully", REVSLIDER_TEXTDOMAIN);
	
                    $sliderID = UniteFunctionsRev::getVal($data, "sliderID");
                    $SlideGoNumId = UniteFunctionsRev::getVal($data, "SlideGoNumId");
                    $SlideViewSlider = UniteFunctionsRev::getVal($data, "SlideViewSlider");
                    
                    if(empty($SlideGoNumId))
                    	self::ajaxResponseSuccessRedirect($message, self::getViewUrl(self::VIEW_SLIDES, "id=$sliderID"));
                    else
                    	self::ajaxResponseSuccessRedirect($message, self::getViewUrl($SlideViewSlider, "id=$SlideGoNumId"));
                    
                break;
                case "update_static_slide":
                    $slide->updateStaticSlideFromData($data);
                    self::ajaxResponseSuccess(__ug("Static Global Layers updated", REVSLIDER_TEXTDOMAIN));
                    break;
                case "duplicate_slide":
                    RevOperations::validatePermission(GlobalsRevSlider::PERMISSION_SLIDE_OPERATIONS);

                    $sliderID = $slider->duplicateSlideFromData($data);
                    self::ajaxResponseSuccessRedirect(
                        __ug("Slide Duplicated Successfully", REVSLIDER_TEXTDOMAIN),
                        self::getViewUrl(self::VIEW_SLIDES, "id=$sliderID"));
                    break;
                case "copy_move_slide":
                    RevOperations::validatePermission(GlobalsRevSlider::PERMISSION_SLIDE_OPERATIONS);

                    $sliderID = $slider->copyMoveSlideFromData($data);

                    self::ajaxResponseSuccessRedirect(
                        __ug("The operation successfully, refreshing page...", REVSLIDER_TEXTDOMAIN),
                        self::getViewUrl(self::VIEW_SLIDES, "id=$sliderID"));
                    break;
                case "get_static_css":
                    $contentCSS = $operations->getStaticCss();
                    self::ajaxResponseData($contentCSS);
                    break;
                case "get_dynamic_css":
                    $contentCSS = $operations->getDynamicCss();
                    self::ajaxResponseData($contentCSS);
                    break;
                case "insert_captions_css":
                    $arrCaptions = $operations->insertCaptionsContentData($data);
                    self::ajaxResponseSuccess(__ug("CSS saved succesfully!", REVSLIDER_TEXTDOMAIN), array("arrCaptions" => $arrCaptions));
                    break;
                case "update_captions_css":
                    $arrCaptions = $operations->updateCaptionsContentData($data);
                    self::ajaxResponseSuccess(__ug("CSS saved succesfully!", REVSLIDER_TEXTDOMAIN), array("arrCaptions" => $arrCaptions));
                    break;
                case "delete_captions_css":
                    $arrCaptions = $operations->deleteCaptionsContentData($data);
                    self::ajaxResponseSuccess(__ug("Style deleted succesfully!", REVSLIDER_TEXTDOMAIN), array("arrCaptions" => $arrCaptions));
                    break;
                case "update_static_css":
                    $staticCss = $operations->updateStaticCss($data);
                    self::ajaxResponseSuccess(__ug("CSS saved succesfully!", REVSLIDER_TEXTDOMAIN), array("css" => $staticCss));
                    break;
                case "insert_custom_anim":
                    $arrAnims = $operations->insertCustomAnim($data); //$arrCaptions =
                    self::ajaxResponseSuccess(__ug("Animation saved succesfully!", REVSLIDER_TEXTDOMAIN), $arrAnims); //,array("arrCaptions"=>$arrCaptions)
                    break;
                case "update_custom_anim":
                    $arrAnims = $operations->updateCustomAnim($data);
                    self::ajaxResponseSuccess(__ug("Animation saved succesfully!", REVSLIDER_TEXTDOMAIN), $arrAnims); //,array("arrCaptions"=>$arrCaptions)
                    break;
                case "delete_custom_anim":
                    $arrAnims = $operations->deleteCustomAnim($data);
                    self::ajaxResponseSuccess(__ug("Animation saved succesfully!", REVSLIDER_TEXTDOMAIN), $arrAnims); //,array("arrCaptions"=>$arrCaptions)
                    break;
                case "update_slides_order":
                    RevOperations::validatePermission(GlobalsRevSlider::PERMISSION_SLIDE_OPERATIONS);

                    $slider->updateSlidesOrderFromData($data);
                    self::ajaxResponseSuccess(__ug("Order updated successfully", REVSLIDER_TEXTDOMAIN));
                    break;
                case "change_slide_image":
                    RevOperations::validatePermission(GlobalsRevSlider::PERMISSION_SLIDE_OPERATIONS);

                    $slide->updateSlideImageFromData($data);
                    $sliderID = UniteFunctionsRev::getVal($data, "slider_id");
                    self::ajaxResponseSuccessRedirect(
                        __ug("Slide Changed Successfully", REVSLIDER_TEXTDOMAIN),
                        self::getViewUrl(self::VIEW_SLIDES, "id=$sliderID"));
                    break;
                case "preview_slide":
                    $operations->putSlidePreviewByData($data);
                    break;
                case "preview_slider":
                    $sliderID = UniteFunctionsRev::getPostGetVariable("sliderid");
                    $do_markup = UniteFunctionsRev::getPostGetVariable("only_markup");

                    if ($do_markup == 'true')
                        $operations->previewOutputMarkup($sliderID);
                    else
                        $operations->previewOutput($sliderID);
                    break;
                case "toggle_slide_state":
                    $currentState = $slide->toggleSlideStatFromData($data);
                    self::ajaxResponseData(array("state" => $currentState));
                    break;
                case "slide_lang_operation":
                    $responseData = $slide->doSlideLangOperation($data);
                    self::ajaxResponseData($responseData);
                    break;
                case "update_plugin":
                    self::updatePlugin(self::DEFAULT_VIEW);
                    break;
                case "update_text":
                    self::updateSettingsText();
                    self::ajaxResponseSuccess(__ug("All files successfully updated", REVSLIDER_TEXTDOMAIN));
                    break;
                case "update_general_settings":
                    $operations->updateGeneralSettings($data);
                    self::ajaxResponseSuccess(__ug("General settings updated", REVSLIDER_TEXTDOMAIN));
                    break;
                case "update_posts_sortby":
                    $slider->updatePostsSortbyFromData($data);
                    self::ajaxResponseSuccess(__ug("Sortby updated", REVSLIDER_TEXTDOMAIN));
                    break;
                case "replace_image_urls":
                    RevOperations::validatePermission(GlobalsRevSlider::PERMISSION_SLIDER_OPERATIONS);

                    $slider->replaceImageUrlsFromData($data);
                    self::ajaxResponseSuccess(__ug("Image urls replaced", REVSLIDER_TEXTDOMAIN));
                    break;
                case "reset_slide_settings":
                    RevOperations::validatePermission(GlobalsRevSlider::PERMISSION_SLIDE_OPERATIONS);

                    $slider->resetSlideSettings($data);
                    self::ajaxResponseSuccess(__ug("Settings in all Slides changed", REVSLIDER_TEXTDOMAIN));
                    break;

                default:
                    self::ajaxResponseError("wrong ajax action: $action ");
                    break;
            }

        } catch (Exception $e) {

            $message = $e->getMessage();
            if ($action == "preview_slide" || $action == "preview_slider") {
                echo $message;
                exit();
            }

            self::ajaxResponseError($message);
        }

        //it's an ajax action, so exit
        self::ajaxResponseError("No response output on <b> $action </b> action. please check with the developer.");
        exit();
    }

}


?>