blob: bcc0ada1efa28667bcbbd08d941448a59a71f0a1 [file] [log] [blame]
/**
* The ImageManager plugin javascript.
* @author $Author:(local) $
* @version $Id:image-manager.js 856M 2007-06-13 18:34:34Z (local) $
* @package ImageManager
*/
/**
* To Enable the plug-in add the following line before Xinha is initialised.
*
* Xinha.loadPlugin("ImageManager");
*
* Then configure the config.inc.php file, that is all.
* For up-to-date documentation, please visit http://www.zhuo.org/htmlarea/
*/
/**
* It is pretty simple, this file over rides the Xinha.prototype._insertImage
* function with our own, only difference is the popupDialog url
* point that to the php script.
*/
function ImageManager(editor)
{
}
ImageManager._pluginInfo = {
name : "ImageManager",
version : "1.0",
developer : "Xiang Wei Zhuo",
developer_url : "http://www.zhuo.org/htmlarea/",
license : "htmlArea"
};
// CONFIGURATION README:
//
// It's useful to pass the configuration to the backend through javascript
// (this saves editing the backend config itself), this needs to be done
// in a trusted/secure manner... here is how to do it..
//
// 1. You need to be able to put PHP in your xinha_config setup
// 2. In step 3 write something like
// --------------------------------------------------------------
// with (xinha_config.ImageManager)
// {
// <?php
// require_once('/path/to/xinha/contrib/php-xinha.php');
// xinha_pass_to_php_backend
// (
// array
// (
// 'images_dir' => '/home/your/directory',
// 'images_url' => '/directory'
// )
// )
// ?>
// }
// --------------------------------------------------------------
//
// this will work provided you are using normal file-based PHP sessions
// (most likely), if not, you may need to modify the php-xinha.php
// file to suit your setup.
Xinha.Config.prototype.ImageManager =
{
'backend' : Xinha.getPluginDir("ImageManager") + '/backend.php?__plugin=ImageManager&',
'backend_data' : null,
// Deprecated method for passing config, use above instead!
//---------------------------------------------------------
'backend_config' : null,
'backend_config_hash': null,
'backend_config_secret_key_location': 'Xinha:ImageManager'
//---------------------------------------------------------
};
// Over ride the _insertImage function in htmlarea.js.
// Open up the ImageManger script instead.
Xinha.prototype._insertImage = function(image) {
var editor = this; // for nested functions
var outparam = null;
if (typeof image == "undefined") {
image = this.getParentElement();
if (image && !/^img$/i.test(image.tagName))
image = null;
}
// the selection will have the absolute url to the image.
// coerce it to be relative to the images directory.
//
// FIXME: we have the correct URL, but how to get it to select?
// FIXME: need to do the same for MSIE.
if ( image )
{
outparam =
{
f_url : Xinha.is_ie ? image.src : image.src,
f_alt : image.alt,
f_border : image.style.borderWidth ? image.style.borderWidth : image.border,
f_align : image.align,
f_padding: image.style.padding,
f_margin : image.style.margin,
f_width : image.width,
f_height : image.height,
f_backgroundColor: image.style.backgroundColor,
f_borderColor: image.style.borderColor,
f_hspace: image.hspace && image.hspace != '-1' ? parseInt(image.hspace) : '',
f_vspace: image.vspace && image.vspace != '-1' ? parseInt(image.vspace) : ''
};
function shortSize(cssSize)
{
if(/ /.test(cssSize))
{
var sizes = cssSize.split(' ');
var useFirstSize = true;
for(var i = 1; i < sizes.length; i++)
{
if(sizes[0] != sizes[i])
{
useFirstSize = false;
break;
}
}
if(useFirstSize) cssSize = sizes[0];
}
return cssSize;
}
outparam.f_border = shortSize(outparam.f_border);
outparam.f_padding = shortSize(outparam.f_padding);
outparam.f_margin = shortSize(outparam.f_margin);
function convertToHex(color) {
if (typeof color == "string" && /, /.test.color)
color = color.replace(/, /, ','); // rgb(a, b) => rgb(a,b)
if (typeof color == "string" && / /.test.color) { // multiple values
var colors = color.split(' ');
var colorstring = '';
for (var i = 0; i < colors.length; i++) {
colorstring += Xinha._colorToRgb(colors[i]);
if (i + 1 < colors.length)
colorstring += " ";
}
return colorstring;
}
return Xinha._colorToRgb(color);
}
outparam.f_backgroundColor = convertToHex(outparam.f_backgroundColor);
outparam.f_borderColor = convertToHex(outparam.f_borderColor);
} // end of if we selected an image before raising the dialog.
// the "manager" var is legacy code. Should probably reference the
// actual config variable in each place .. for now this is good enough.
// alert( "backend is '" + editor.config.ImageManager.backend + "'" );
var manager = editor.config.ImageManager.backend + '__function=manager';
if(editor.config.ImageManager.backend_config != null)
{
manager += '&backend_config='
+ encodeURIComponent(editor.config.ImageManager.backend_config);
manager += '&backend_config_hash='
+ encodeURIComponent(editor.config.ImageManager.backend_config_hash);
manager += '&backend_config_secret_key_location='
+ encodeURIComponent(editor.config.ImageManager.backend_config_secret_key_location);
}
if(editor.config.ImageManager.backend_data != null)
{
for ( var i in editor.config.ImageManager.backend_data )
{
manager += '&' + i + '=' + encodeURIComponent(editor.config.ImageManager.backend_data[i]);
}
}
Dialog(manager, function(param) {
if (!param) { // user must have pressed Cancel
return false;
}
var img = image;
if (!img) {
if (Xinha.is_ie) {
var sel = editor._getSelection();
var range = editor._createRange(sel);
editor._doc.execCommand("insertimage", false, param.f_url);
img = range.parentElement();
// wonder if this works...
if (img.tagName.toLowerCase() != "img") {
img = img.previousSibling;
}
} else {
img = document.createElement('img');
img.src = param.f_url;
editor.insertNodeAtSelection(img);
}
} else {
img.src = param.f_url;
}
for (field in param) {
var value = param[field];
switch (field) {
case "f_alt" : img.alt = value; break;
case "f_border" :
if(value.length)
{
img.style.borderWidth = /[^0-9]/.test(value) ? value : (parseInt(value) + 'px');
if(img.style.borderWidth && !img.style.borderStyle)
{
img.style.borderStyle = 'solid';
}
}
else
{
img.style.borderWidth = '';
img.style.borderStyle = '';
}
break;
case "f_borderColor": img.style.borderColor = value; break;
case "f_backgroundColor": img.style.backgroundColor = value; break;
case "f_padding":
{
if(value.length)
{
img.style.padding = /[^0-9]/.test(value) ? value : (parseInt(value) + 'px');
}
else
{
img.style.padding = '';
}
}
break;
case "f_margin":
{
if(value.length)
{
img.style.margin = /[^0-9]/.test(value) ? value : (parseInt(value) + 'px');
}
else
{
img.style.margin = '';
}
}
break;
case "f_align" : img.align = value; break;
case "f_width" :
{
if(!isNaN(parseInt(value))) { img.width = parseInt(value); } else { img.width = ''; }
}
break;
case "f_height":
{
if(!isNaN(parseInt(value))) { img.height = parseInt(value); } else { img.height = ''; }
}
break;
case "f_hspace" :
{
if(!isNaN(parseInt(value))) { img.hspace = parseInt(value); } else { img.hspace = ''; }
}
break;
case "f_vspace" :
{
if(!isNaN(parseInt(value))) { img.vspace = parseInt(value); } else { img.vspace = ''; }
}
break;
}
}
}, outparam);
};