<?php
/**
 * @copyright	Copyright (C) 2016 Cédric KEIFLIN alias ced1870
 * https://www.joomlack.fr
 * @license		GNU/GPL
 * */

defined('_JEXEC') or die;
//if (! defined('CK_LOADED')) define('CK_LOADED', 1);

require_once JPATH_ADMINISTRATOR . '/components/com_pagebuilderck/helpers/ckfof.php';
use Pagebuilderck\CKFof;

/**
 * Editor Pagebuilderckeditor button
 *
 */
class PlgButtonPagebuilderckeditor extends JPlugin
{
	/**
	 * Load the language file on instantiation.
	 *
	 * @var    boolean
	 * @since  3.1
	 */
	protected $autoloadLanguage = true;

	protected $elements;

	/**
	 * Pagebuilderckeditor button
	 *
	 * @param   string  $name  The name of the button to add
	 *
	 */
	public function onDisplay($name)
	{

		// check the name of the editor, if ckeditor then we must not load this button because we are already in the pagebuilder
		if ($name == 'ckeditor') return;

		$doc = JFactory::getDocument();
		$app = JFactory::getApplication();
		$input = $app->input;
		$conf = JFactory::getConfig();
		$css = "";

		$user = JFactory::getUser();

		// authorize only in article edition admin and front, if the page builder ck editor has been allowed, comes from the system plugin
		if ($conf->get('pagebuilderck_allowed') != '1')
			return;

		// loads the language files from the component frontend
		$lang = JFactory::getLanguage();
		$lang->load('com_pagebuilderck', JPATH_SITE . '/components/com_pagebuilderck', $lang->getTag(), false);
		$lang->load('com_pagebuilderck', JPATH_SITE, $lang->getTag(), false);

		// for 3rd party integration
		$thirdPartyIntegrations = PagebuilderckHelper::getThirdPartyIntegrations();
		$attribsVar = $thirdPartyIntegrations['attribs'];
		$adminForm = $thirdPartyIntegrations['adminForm'];
		$fieldsname = $thirdPartyIntegrations['fieldsname'];

		if ($input->get('option', '') !== 'com_content'
			&& $input->get('option', '') !== 'com_flexicontent'
			) {
			// if the field is not allowed in the list, don't show the button
			if ($name !== 'jform_' . $fieldsname) return;
			// if the integration params of PBCK does not allow, don't show the button
			if ($conf->get('pagebuilderck_allowed_' . $fieldsname, '1') == '0') return;
		}

		// if the page builder ck editor must be used
		if ($input->get('pbck', '0') == '1') {
			$short_name = str_replace('jform_', '', $name);
			if ($conf->get('pagebuilderck_allowed_' . $short_name) != '1')
				return;

			$conf = JFactory::getConfig();
			// Get the text filter data
			$params          = JComponentHelper::getParams('com_config');
			$filters = CKFof::convertObjectToArray($params->get('filters'));
			// check if the user has the correct rights on the filters to save the article
			if (! in_array('8', $user->groups)) { // checks for super user group
				foreach($user->groups as $g) {
					if (isset($filters[$g])) {
						$filters[$g] = CKFof::convertObjectToArray($filters[$g]);
						if ($filters[$g]['filter_type'] === 'BL') $app->enqueueMessage('PAGE BUILDER CK  : ' . JText::_('CK_WARNING_USERGROUP_FILTERTYPE_BLACKLIST'), 'error');
					}
//					if ($filters[$g]['filter_type'] === 'WL' && strpos($filters[$g]['filter_tags'], 'style') === false) $app->enqueueMessage('PAGE BUILDER CK  : ' . JText::_('CK_WARNING_USERGROUP_FILTERTYPE_WHITELIST_NOSTYLE'), 'error');
				}
			}

			include_once JPATH_ADMINISTRATOR . '/components/com_pagebuilderck/helpers/menustyles.php';
			include_once JPATH_ADMINISTRATOR . '/components/com_pagebuilderck/helpers/stylescss.php';
//			include_once JPATH_ADMINISTRATOR . '/components/com_pagebuilderck/helpers/ckeditor.php';
			include_once JPATH_ADMINISTRATOR . '/components/com_pagebuilderck/helpers/pagebuilderck.php';
			include_once JPATH_ADMINISTRATOR . '/components/com_pagebuilderck/helpers/ckmodel.php';

			// get instance of the editor to load the css / js in the page
			// $this->ckeditor = PagebuilderckHelper::loadEditor();
			// need the tinymce instance for the items edition
			// Load the editor Tinymce or JCE
			$editor = $conf->get('pagebuilderck_replaced_editor') == 'jce' ? 'jce' : 'tinymce';
			$editor = JEditor::getInstance($editor);
			$editor->display('ckeditor', $html = '', $width = '', $height = '200px', $col='', $row='', $buttons = true, $id = 'ckeditor');
			// Get an instance of the model
//			JModelLegacy::addIncludePath(JPATH_SITE . '/administrator/components/com_pagebuilderck/models', 'PagebuilderckModel');
			$model = Pagebuilderck\CKModel::getInstance('Elements', 'Pagebuilderck');
			// $model = $this->getModel('Elements', '', array());
			$this->elements = $model->getItems();

			str_replace('"', '\"', include_once(JPATH_ADMINISTRATOR . '/components/com_pagebuilderck/views/page/tmpl/include.php'));
			str_replace('"', '\"', include_once(JPATH_ADMINISTRATOR . '/components/com_pagebuilderck/views/page/tmpl/submitform.php'));
			str_replace('"', '\"', include_once(JPATH_ADMINISTRATOR . '/components/com_pagebuilderck/views/page/tmpl/menu.php'));
			str_replace('"', '\"', include_once(JPATH_ADMINISTRATOR . '/components/com_pagebuilderck/views/page/tmpl/toolbar.php'));
			str_replace('"', '\"', include_once(JPATH_ADMINISTRATOR . '/components/com_pagebuilderck/views/page/tmpl/contextmenu.php'));

			// force the inclusion of the field with the value 1
			echo '<input id="jform_attribs_pagebuilderck_editor" type="hidden" value="1" name="jform[attribs][pagebuilderck_editor]">';

			// section specific to content types
			$iscontenttype = $input->get('iscontenttype', 0, 'int');
			// force state with url variable, for debugging purposes
			$iscontenttype = isset($_GET['iscontenttype']) ? $_GET['iscontenttype'] : $iscontenttype;

			echo '<input id="jform_attribs_pagebuilderck_iscontenttype" type="hidden" value="' . $iscontenttype . '" name="jform[attribs][pagebuilderck_iscontenttype]">';
			$contenttype = $input->get('contenttype', '', 'string');
			/*if ($iscontenttype === 1) {
				JPluginHelper::importPlugin( 'pagebuilderck' );
				ob_start();
				Pagebuilderck\CKFof::triggerEvent( 'onPagebuilderckLoadItemContent' . ucfirst($contenttype) );
				$contenttypehtml = ob_get_contents();
				ob_end_clean();
				$contenttypehtml = str_replace("'", "\'", $contenttypehtml);
				$contenttypehtml = str_replace("\n", "", $contenttypehtml);
				$contenttypehtml = str_replace("\r", "", $contenttypehtml);
			} else {
				$contenttypehtml = '';
			}*/

			$js1 = "
			function pbckeditorLoadEditor(name) {
				var cont = jQuery(name).parent();
				// cont.css('display', 'none');
				var html = '<div id=\"workspaceparentck\">'
								+'<div id=\"workspaceck\" class=\"pagebuilderck workspaceck" . ($input->get('iscontenttype', 0, 'int') === 1 ? ' ckiscontenttype' : '') ."\">'
								+'</div>'
							+'</div>';
				// load the page builder workspace and hide the textarea
				//cont.children().hide();
				cont.append(html);

				// fix for RSFirewall
				jQuery(name).val(jQuery(name).val().replace(/<s-tyle/g, '<style'));
				jQuery(name).val(jQuery(name).val().replace(/s-tyle>/g, 'style>'));

				var injectContentToPbck = false;
				// test if this is a new content or already created with page builder
				if (jQuery(name).length && ! jQuery(name).val().includes('rowck')) {
					injectContentToPbck = true;
				}

				jQuery('#workspaceparentck').prepend(jQuery('#context-menu-ck'));
				if (jQuery(name).length && ! injectContentToPbck) {
					jQuery('#workspaceck').html(jQuery(name).val().replace(/\|URIROOT\|/g, '" . JUri::root(true) . "'));
				}

				ckInitWorkspace();
				// manage content creation if is a content type
				if (PAGEBUILDERCK.ISCONTENTTYPE == '1' && injectContentToPbck) {
					var workspace = ckGetWorkspace();
					var newrowid = ckGetUniqueId('row_');
					var newrow = ckHtmlRow(newrowid);
					workspace.append(newrow);
					var newblockid = ckGetUniqueId('block_');
					var newblock = ckHtmlBlock(newblockid);
					jQuery('> .inner', newrow).append(newblock);
					ckInitBlocksSize(newrow);

					jQuery('#workspaceck .blockck > .inner > .innercontent').addClass('ckfocus');
					ckAddItem('" . $contenttype . "');
				}
				// manage content creation for a standard article
				else if (injectContentToPbck) {
					jQuery('#workspaceck .blockck > .inner > .innercontent').addClass('ckfocus');
					ckAddItem('text');
					
					// Override to get the appended text ID and update the data
					/*function ckTriggerAfterAdditem(id) {
						var content = jQuery('#" . $name . "').val();
						content = ckEditorToContent(content);
						jQuery('#'+id+' > .inner').html(content);
					}*/
				}
				
				cont.css('display', '');
				
				// adds the settings in JS to be sure that it is at the end of the front end form
				jQuery('#" . $adminForm . "').append('<input id=\"jform_" . $attribsVar . "_pagebuilderck_editor\" type=\"hidden\" value=\"1\" name=\"jform[" . $attribsVar . "][pagebuilderck_editor]\">');
				jQuery('#adminForm').append('<input id=\"jform_attribs_pagebuilderck_editor\" type=\"hidden\" value=\"1\" name=\"jform[attribs][pagebuilderck_editor]\">');
				jQuery('#adminForm').append('<input id=\"jform_attribs_pagebuilderck_iscontenttype\" type=\"hidden\" value=\"" . $iscontenttype . "\" name=\"jform[attribs][pagebuilderck_iscontenttype]\">');
			}
			
			
			// Override to get the appended text ID and update the data
			function ckTriggerAfterAdditem(id) {
				var content = jQuery('#" . $name . "').val();
				content = ckEditorToContent(content);
				jQuery('#'+id+' > .inner').html(content);
			}

			JoomlaCK.beforesubmitbutton = function(task) {
				// check if the function exists, loads it
				if (typeof ckBeforeSaveWorkspace == 'function') { ckBeforeSaveWorkspace(); }

				var workspace = jQuery('#workspaceck');
			
				jQuery('#" . $name . "').val(workspace.html());

				// JoomlaCK.submitbutton(task);
			}
			";

			echo "<script>" . $js1 . "</script>";
			
			$css .= "#" . $name . ",
#" . $name . " + #editor-xtd-buttons,
#editor-xtd-buttons,
.editor-xtd-buttons
 {
	display: none;
}";
		}

		// construct the JS code to manage the operations
		$js2 = "
			jQuery(document).ready(function (){
				if (" . $input->get('pbck', '0') . " != '1') pbckeditorLoadEditorButton('#" . $name . "');
				if (" . $input->get('pbck', '0') . " == '1') pbckeditorLoadEditor('#" . $name . "');
			});

			function pbckeditorLoadEditorButton(name) {
				var cont = jQuery(name).parent();
				cont.before('<a class=\"btn pbckswitch btn-secondary\" onclick=\"pbckLoadPagebuilderckEditor()\"><i class=\"icon icon-loop\"></i>&nbsp;" . JText::_('CK_LOAD_PAGEBUILDERCK_EDITOR', true) . "</a>');
			}

			function pbckLoadPagebuilderckEditor() {				
				var beSure = confirm('" . JText::_('CK_CONFIRM_PAGEBUILDERCK_EDITOR', true) . "');
				if (!beSure) return;

				window.location.search += '&pbck=1';
			}
			";
		$doc->addScriptDeclaration($js2);

		$css .= ".pbckswitch {
	margin: 5px 0;
}";
		$doc->addStyleDeclaration($css);

if ($input->get('option', '') == 'com_flexicontent') $editor = $conf->set('editor', $conf->get('pagebuilderck_replaced_editor'));
		return;
	}
}
