root/trunk/campsite/implementation/management/priv/articles/editor_load_xinha.php

Revision 4395 (by paul, 01/25/06 21:35:19)

Fix for bug #1675 – Permissions for font face and size should work. This fix was also partially implemented in the last checkin.

<?php
/**
 * @param array p_dbColumns
 * @param User p_user
 * @return void
 */
function editor_load_xinha($p_dbColumns, $p_user) {
	global $Campsite;
	$stylesheetFile = $Campsite['HTML_COMMON_DIR'] 
		."/priv/articles/article_stylesheet.css";
	?>	
<script type="text/javascript">
	//<![CDATA[
      _editor_url = "/javascript/xinha/";
      _editor_lang = "<?php p($_REQUEST['TOL_Language']); ?>";
      _campsite_article_id = <?php echo $_REQUEST['f_article_number']; ?>;
	//]]>
</script>    
<!-- Load the HTMLArea file -->
<script type="text/javascript" src="/javascript/xinha/htmlarea.js"></script>
<!-- Special Campsite functionality -->
<script type="text/javascript">
function CampsiteSubhead(editor, objectName, object) {
	if (!HTMLArea.is_ie) {
		// This statement crashes in the most bizarre way on IE.
		// If you remove the "parent = " here, then it doesnt crash.
		// So IE will allow subheads within subheads (bad), while
		// the code below will prevent that for the other browsers.
		parent = editor.getParentElement();
		if ((parent.tagName.toLowerCase() == "span") && 
			(parent.className.toLowerCase()=="campsite_subhead")) {
			editor.selectNodeContents(parent);
			editor.updateToolbar();
			return false;
		} else {
			editor.surroundHTML('<span class="campsite_subhead">', '</span>');
		}
	} else {
		editor.surroundHTML('<span class="campsite_subhead">', '</span>');		
	}
} // fn CampsiteSubhead
/** 
 * Handler for creating an internal campsite link.
 * This is a copy of the _createlink function, except that it calls 
 * a different popup window.
 */
function CampsiteInternalLink(editor, objectName, object, link) {
	var outparam = null;
	if (typeof link == "undefined") {
		link = editor.getParentElement();
		if (link) {
			if (/^img$/i.test(link.tagName)) {
				link = link.parentNode;
			}
			if (!/^a$/i.test(link.tagName)) {
				link = null;
			}
		}
	}
	popupWindowTarget = "campsite_internal_link.php?TOL_Language=<?php p($_REQUEST["TOL_Language"]); ?>";
	if (!link) {
    	var sel = editor._getSelection();
    	var range = editor._createRange(sel);
    	var compare = 0;
    	if (HTMLArea.is_ie) {
      		compare = range.compareEndPoints("StartToEnd", range);
    	} 
    	else {
      		compare = range.compareBoundaryPoints(range.START_TO_END, range);
    	}
    	if (compare == 0) {
      		alert(HTMLArea._lc("You need to select some text before creating a link"));
      		return;
    	}
	    outparam = {
		      f_href : '',
		      f_title : '',
		      f_target : '',
		      f_usetarget : editor.config.makeLinkShowsTarget
		    };
	} 
	else {
	    outparam = {
	      f_href   : HTMLArea.is_ie ? editor.stripBaseURL(link.href) : link.getAttribute("href"),
	      f_title  : link.title,
	      f_target : link.target,
	      f_usetarget : editor.config.makeLinkShowsTarget
	    };
		// Pass the arguments to the popup window so that it
		// can populate the dropdown controls.
		popupWindowTarget += "&" + outparam["f_href"].replace("campsite_internal_link?", "");
	}
	editor._popupDialog(popupWindowTarget, function(param) {
    	if (!param) {
      		return false;
    	}
    	var a = link;
    	if (!a) {
    		try {
      			editor._doc.execCommand("createlink", false, param.f_href);
      			a = editor.getParentElement();
      			var sel = editor._getSelection();
      			var range = editor._createRange(sel);
      			if (!HTMLArea.is_ie) {
        			a = range.startContainer;
        			if (!/^a$/i.test(a.tagName)) {
          				a = a.nextSibling;
          				if (a == null) {
            				a = range.startContainer.parentNode;
          				}
        			}
      			}
    		} 
    		catch(e) {}
    	}
    	else {
      		var href = param.f_href.trim();
      		editor.selectNodeContents(a);
      		if (href == "") {
        		editor._doc.execCommand("unlink", false, null);
        		editor.updateToolbar();
        		return false;
      		}
      		else {
        		a.href = href;
      		}
    	}
    	if (!(a && /^a$/i.test(a.tagName))) {
      		return false;
    	}
    	a.target = param.f_target.trim();
    	a.title = param.f_title.trim();
    	editor.selectNodeContents(a);
    	editor.updateToolbar();
  	}, outparam);
};
xinha_editors = null;
xinha_init    = null;
xinha_config  = null;
xinha_plugins = null;
// This contains the names of textareas we will make into Xinha editors
xinha_init = xinha_init ? xinha_init : function()
{
  /** STEP 1 ***************************************************************
   * First, what are the plugins you will be using in the editors on this
   * page.  List all the plugins you will need, even if not all the editors
   * will use all the plugins.
   ************************************************************************/
  xinha_plugins = xinha_plugins ? xinha_plugins :
  [
  	<?php if ($p_user->hasPermission("EditorImage")) { ?>
	'ImageManager',
	<?php } ?>
	<?php if ($p_user->hasPermission('EditorTable')) { ?>
	'TableOperations',
	<?php } ?>
	<?php if ($p_user->hasPermission('EditorListNumber')) { ?>
	'ListType',
	<?php } ?>
	<?php if ($p_user->hasPermission("EditorEnlarge")) { ?>
    'FullScreen',
    <?php } ?>
    'WordPaste',
    'CharacterMap',
    'FindReplace',
    //'RemoveParagraphs'
  ];
	// THIS BIT OF JAVASCRIPT LOADS THE PLUGINS, NO TOUCHING  :)
	if(!HTMLArea.loadPlugins(xinha_plugins, xinha_init)) return;
  /** STEP 2 ***************************************************************
   * Now, what are the names of the textareas you will be turning into
   * editors?
   ************************************************************************/
  xinha_editors = xinha_editors ? xinha_editors :
  [
  	<?php
  	$xinhaEditors = array();
	foreach ($p_dbColumns as $dbColumn) {	
		if (stristr($dbColumn->getType(), "blob")) {
			$xinhaEditors[] = "'".$dbColumn->getName()."'";
		}
	}
	echo implode(",", $xinhaEditors);
	?>
  ];
  /** STEP 3 ***************************************************************
   * We create a default configuration to be used by all the editors.
   * If you wish to configure some of the editors differently this will be
   * done in step 4.
   *
   * If you want to modify the default config you might do something like this.
   *
   *   xinha_config = new HTMLArea.Config();
   *   xinha_config.width  = 640;
   *   xinha_config.height = 420;
   *
   *************************************************************************/
   xinha_config = xinha_config ? xinha_config : new HTMLArea.Config();
   xinha_config.statusBar = false;
   xinha_config.htmlareaPaste =  true;
   xinha_config.killWordOnPaste =  true;
   xinha_config.flowToolbars = false;
   xinha_config.mozParaHandler = "built-in";
   // Change the built-in icon for "web link"
   linkIcon = _editor_url + xinha_config.imgURL + "ed_campsite_link.gif";
   xinha_config.btnList["createlink"] = [ "Insert Web Link", linkIcon, false, function(e) {e._createLink();} ],
   // Change the removeformat button to work in text mode.
   xinha_config.btnList["removeformat"] = [ "Remove formatting", ["ed_buttons_main.gif",4,4], true, function(e) {e.execCommand("removeformat");} ],
   // Put the "find-replace" plugin in a better location
   xinha_config.addToolbarElement([], ["FR-findreplace"], 0);
   // Add in our style sheet for the "subheads".
   xinha_config.pageStyle = "<?php echo str_replace("n", "", file_get_contents($stylesheetFile)); ?>";
   <?php if ($p_user->hasPermission('EditorSubhead')) { ?>
   subheadTooltip = HTMLArea._lc('Subhead', 'Campsite');
   xinha_config.registerButton({
       // The ID of the button.
       id        : "campsite-subhead",
       // The tooltip.
       tooltip   : subheadTooltip,
       // Image to be displayed in the toolbar.
       image     : "/javascript/xinha/images/campsite_subhead.gif",
       // TRUE = enabled in text mode
       // FALSE = disabled in text mode
       textMode  : false,
       // Called when the button is clicked.
       action    : CampsiteSubhead,
       // The button will be disabled if outside
       // the specified element.
       context   : ''
   });
   <?php } ?>
   <?php if ($p_user->hasPermission('EditorLink')) { ?>
   internalLinkTooltip = HTMLArea._lc('Insert Internal Link', 'Campsite');
   xinha_config.registerButton({
       // The ID of the button.
       id        : "campsite-internal-link",
       // The tooltip.
       tooltip   : internalLinkTooltip,
       // Image to be displayed in the toolbar.
       image     : "/javascript/xinha/images/campsite_internal_link.gif",
       // TRUE = enabled in text mode
       // FALSE = disabled in text mode
       textMode  : false,
       // Called when the button is clicked.
       action    : CampsiteInternalLink,
       // The button will be disabled if outside
       // the specified element.
       context   : ''
   });
   <?php } 
    $toolbar1 = array();
    if ($p_user->hasPermission('EditorBold')) { 
	  	$toolbar1[] = ""bold""; 
	}
	if ($p_user->hasPermission('EditorItalic')) { 
		$toolbar1[] = ""italic""; 
	}
	if ($p_user->hasPermission('EditorUnderline')) { 
		$toolbar1[] = ""underline""; 
	}
	if ($p_user->hasPermission('EditorStrikethrough')) { 
		$toolbar1[] = ""strikethrough""; 
	} 
	if ($p_user->hasPermission('EditorTextAlignment')) { 
		$toolbar1[] = ""justifyleft"";
		$toolbar1[] = ""justifycenter""; 
		$toolbar1[] = ""justifyright""; 
		$toolbar1[] = ""justifyfull""; 
	} 
	if ($p_user->hasPermission('EditorIndent')) { 
		$toolbar1[] = ""outdent""; 
		$toolbar1[] = ""indent""; 
	} 
	if ($p_user->hasPermission('EditorCopyCutPaste')) { 
		$toolbar1[] = ""copy""; 
		$toolbar1[] = ""cut""; 
		$toolbar1[] = ""paste""; 
		$toolbar1[] = ""space""; 
	} 
	if ($p_user->hasPermission('EditorUndoRedo')) { 
		$toolbar1[] = ""undo""; 
		$toolbar1[] = ""redo""; 
	} 
	if ($p_user->hasPermission('EditorTextDirection')) { 
		 $toolbar1[] = ""lefttoright""; 
		 $toolbar1[] = ""righttoleft""; 
	}
	if ($p_user->hasPermission('EditorLink')) { 
		$toolbar1[] = ""campsite-internal-link""; 
		$toolbar1[] = ""createlink""; 
	}
	if ($p_user->hasPermission('EditorSubhead')) {
		$toolbar1[] = ""campsite-subhead""; 
	} 
	if ($p_user->hasPermission('EditorImage')) { 
		$toolbar1[] = ""insertimage"";
	} 
	if ($p_user->hasPermission('EditorSourceView')) { 
		$toolbar1[] = ""htmlmode""; 
	} 
	if ($p_user->hasPermission('EditorEnlarge')) { 
		$toolbar1[] = ""popupeditor"";
	}
	if ($p_user->hasPermission('EditorHorizontalRule')) { 
		$toolbar1[] = ""inserthorizontalrule"";
	} 
	if ($p_user->hasPermission('EditorFontColor')) { 
		$toolbar1[] = ""forecolor"";
		$toolbar1[] = ""hilitecolor"";
	} 
	if ($p_user->hasPermission('EditorSubscript')) { 
		$toolbar1[] = ""subscript"";
	}
	if ($p_user->hasPermission('EditorSuperscript')) {
		$toolbar1[] = ""superscript"";
	}
	$toolbar2 = array();
	// Slice up the first toolbar if it is too long.
	if (count($toolbar1) > 24) {
		$toolbar2 = array_splice($toolbar1, 24);
	}
	// This is to put the bulleted and numbered list controls
	// on the most appropriate line of the toolbar.
	if ($p_user->hasPermission('EditorListBullet') && $p_user->hasPermission('EditorListNumber') && count($toolbar1) < 15) { 
		$toolbar1[] = ""insertunorderedlist"";
		$toolbar1[] = ""insertorderedlist"";
	}		
	elseif ($p_user->hasPermission('EditorListBullet') && !$p_user->hasPermission('EditorListNumber') && count($toolbar1) < 24) {
		$toolbar1[] = ""insertunorderedlist"";
	}
	elseif (!$p_user->hasPermission('EditorListBullet') && $p_user->hasPermission('EditorListNumber') && count($toolbar1) < 16) {
		$toolbar1[] = ""insertorderedlist"";
	}
	else {
		if ($p_user->hasPermission('EditorListBullet')) { 
			$toolbar2[] = ""insertunorderedlist"";
		}
		if ($p_user->hasPermission('EditorListNumber')) { 
			$toolbar2[] = ""insertorderedlist"";
	 	}
	}
	if ($p_user->hasPermission('EditorFontFace')) {
		$toolbar2[] = ""formatblock"";
		$toolbar2[] = ""fontname"";
	}
	if ($p_user->hasPermission('EditorFontSize')) {
		$toolbar2[] = ""fontsize"";
	}
	// This is to fix ticket #1602.  You only want the line break if
	// there is more than one line in the toolbar.
	if (count($toolbar2) > 0 || $p_user->hasPermission('EditorTable'))  { 
		$toolbar1[] = ""linebreak"";
	}
   ?>
   xinha_config.toolbar = [
		[ <?php echo implode(",", $toolbar1); ?> ],
		<?php if (count($toolbar2) > 0) { ?>
		[ <?php echo implode(",", $toolbar2); ?> ],
		<?php } ?>
		<?php if ($p_user->hasPermission('EditorTable')) { ?>
		[ "linebreak", "inserttable" ],
		<?php } ?>
	];
  /** STEP 3 ***************************************************************
   * We first create editors for the textareas.
   *
   * You can do this in two ways, either
   *
   *   xinha_editors   = HTMLArea.makeEditors(xinha_editors, xinha_config, xinha_plugins);
   *
   * if you want all the editor objects to use the same set of plugins, OR;
   *
   *   xinha_editors = HTMLArea.makeEditors(xinha_editors, xinha_config);
   *   xinha_editors['myTextArea'].registerPlugins(['Stylist','FullScreen']);
   *   xinha_editors['anotherOne'].registerPlugins(['CSS','SuperClean']);
   *
   * if you want to use a different set of plugins for one or more of the
   * editors.
   ************************************************************************/
  xinha_editors   = HTMLArea.makeEditors(xinha_editors, xinha_config, xinha_plugins);
  /** STEP 4 ***************************************************************
   * If you want to change the configuration variables of any of the
   * editors,  this is the place to do that, for example you might want to
   * change the width and height of one of the editors, like this...
   *
   *   xinha_editors.myTextArea.config.width  = 640;
   *   xinha_editors.myTextArea.config.height = 480;
   *
   ************************************************************************/
  /** STEP 5 ***************************************************************
   * Finally we "start" the editors, this turns the textareas into
   * Xinha editors.
   ************************************************************************/
  HTMLArea.startEditors(xinha_editors);
}
window.onload = xinha_init;
</script>
  <!--<link href="/javascript/xinha/skins/xp-blue/skin.css" rel="Stylesheet" />-->
<?php
} // fn editor_load_xinha
?>
Note: See TracBrowser for help on using the browser.