Файл: static/plugins/base/js/suitup.jquery.js
Строк: 467
<?php
"use strict";
( function( win, doc, $ )
{
//-- protected functions -- //
/**
* Create a tag
*
* @return object
*/
var create = function(tagName, props)
{
return $($.extend( doc.createElement( tagName ), props ));
};
/**
* Save html
*
* @param object suitUpBlock
* @param string type
* @return void
*/
var saveHtml = function(textarea, suitUpBlock)
{
textarea.value = suitUpBlock.html();
};
/**
* Wyswyg
*/
$.suitUp = {
/**
* Default controls
*
* @var array
*/
controls: [ 'italic', 'bold', 'undeline', 'link', 'image', 'video' ],
/**
* Image upload url
*
* @var string
*/
imageUploadUrl: '',
/**
* Commands
*
* @var object
*/
commands: {
},
/**
* Custom buttons
*
* @var object
*/
custom: {
/**
* Image uploader
*
* @param object textarea
* @param object suitUpBlock
* @return void
*/
image: function(textarea, suitUpBlock)
{
var oldSelection = '';
// create the upload image input
var $uploadImage = $('<input type="file" class="suitup_upload_image" style="display:none" accept="image/*" />' ).html5_upload({
url: $.suitUp.getImageUploadUrl(),
sendBoundary: window.FormData || $.browser.mozilla,
fieldName : 'file',
extraFields : {
'command' : 'image-upload'
},
onStartOne: function(event, name, number, total)
{
suitUpBlock.focus();
oldSelection = $.suitUp.getSelection();
suitUpBlock.addClass("peepm_preloader");
return true;
},
onFinishOne: function(event, response, name, number, total)
{
suitUpBlock.removeClass("peepm_preloader");
var result = jQuery.parseJSON(response);
// show an error message
if ( typeof result.error_message != "undefined" && result.error_message )
{
PEEPM.message(result.error_message, 'error');
return;
}
suitUpBlock.focus();
$.suitUp.restoreSelection(oldSelection);
// show the image
var content = '<br /><a href="' + result.file_url +
'" target="_blank"><img src="' + result.file_url + '"></a><br /><br />';
document.execCommand('insertHTML', false, content);
saveHtml(textarea, suitUpBlock);
},
onError: function(event, name, error) {
suitUpBlock.removeClass("peepm_preloader");
}
});
$($uploadImage).insertAfter(suitUpBlock);
// create a new button
return create("a", {
className: "peepm_suitup-control",
href: "javascript://"
}).attr({
"data-command": "insertImage"
}).on("click", function() {
// show the file choose window
$uploadImage.trigger("click");
});
},
link: function(textarea, suitUpBlock)
{
return create("a", {
className: "peepm_suitup-control",
href: "javascript://"
}).attr({
"data-command": "createlink"
}).on("click", function() {
if (!$.suitUp.hasSelectedNodeParent("a")) {
suitUpBlock.focus();
var oldSelection = $.suitUp.getSelection();
var floatBox = PEEPM.ajaxFloatBox("BASE_MCMP_InsertLink", [{ "linkText" : $.suitUp.getSelectedText() }], {
"title" : PEEP.getLanguageText('base', 'ws_button_label_link'),
"scope" : {
"success" : function(data) {
floatBox.close();
suitUpBlock.focus();
$.suitUp.restoreSelection(oldSelection);
document.execCommand('insertHTML', false, '<a href="' + data.link + '" rel="nofollow" target="_blank">' + data.title + '</a>');
saveHtml(textarea, suitUpBlock);
}
}
});
} else {
doc.execCommand('unlink', false, null);
saveHtml(textarea, suitUpBlock);
}
});
},
video: function(textarea, suitUpBlock)
{
return create("a", {
className: "peepm_suitup-control",
href: "javascript://"
}).attr({
"data-command": "insertVideo"
}).on("click", function() {
suitUpBlock.focus();
var oldSelection = $.suitUp.getSelection();
var floatBox = PEEPM.ajaxFloatBox("BASE_MCMP_InsertVideo", [], {
"title" : PEEP.getLanguageText('base', 'ws_button_label_video'),
"scope" : {
"success" : function(data) {
$.ajax({
url: $.suitUp.embedUrl,
data: { url: data.link },
cache: false,
success: function(response) {
var data = jQuery.parseJSON(response);
if (typeof data.type == "undefined"
|| typeof data.html == "undefined"
|| data.type != "video") {
PEEPM.message(PEEP.getLanguageText('base', 'ws_error_video'), 'error');
return;
}
floatBox.close();
suitUpBlock.focus();
$.suitUp.restoreSelection(oldSelection);
document.execCommand('insertHTML', false, '<br />' + data.html + '<br /><br />');
saveHtml(textarea, suitUpBlock);
},
'error' : function() {
PEEPM.message(PEEP.getLanguageText('base', 'ws_error_video'), 'error');
}
});
}
}
});
});
}
},
/**
* Get selected text in editable area
*
* @return string
*/
getSelectedText: function()
{
return this.getSelection().toString();
},
/**
* Get image upload url
*
* @return string
*/
getImageUploadUrl: function()
{
return this.imageUploadUrl;
},
/**
* Get current selection
*
* @return object
*/
getSelection: function()
{
var range;
if (win.getSelection) {
try {
range = win.getSelection().getRangeAt( 0 );
} catch(e) {
}
} else if (doc.selection) {
range = doc.selection.createRange();
}
return range;
},
/**
* Restore selection
*
* @param object range
* @retrun void
*/
restoreSelection: function(range)
{
var s;
if (range) {
if (win.getSelection) {
s = win.getSelection();
if (s.rangeCount > 0) {
s.removeAllRanges();
}
s.addRange(range);
} else if (doc.createRange) {
win.getSelection().addRange(range);
} else if (doc.selection) {
range.select();
}
}
},
/**
* Get selected node
*
* @return object
*/
getSelectedNode: function()
{
if (doc.selection) {
return doc.selection.createRange().parentElement();
} else {
var selection = win.getSelection();
if (selection.rangeCount > 0) {
return selection.getRangeAt(0).endContainer;
}
}
},
/**
* Has selected node parent
*
* @param strign tagName
* @return boolean
*/
hasSelectedNodeParent: function(tagName)
{
var node = this.getSelectedNode(), has = false;
tagName = tagName.toUpperCase();
while (node && node.tagName !== 'BODY') {
if (node.tagName === tagName) {
has = true;
break;
}
node = node.parentNode;
}
return has;
}
};
/**
* Suitup jquery plugin
*
* @param array controls
* @param string imageUploadUrl
* @param string embedUrl
*/
$.fn.suitUp = function(controls, imageUploadUrl, embedUrl)
{
var suitUp = $.suitUp,
lastSelectionRange,
lastSelectionElement,
commands = $.suitUp.commands,
custom = $.suitUp.custom,
restoreSelection = suitUp.restoreSelection;
controls = controls || $.suitUp.controls;
controls = controls instanceof Array ? controls : Array.prototype.slice.call( arguments ); // IE changes the arguments object when one of the arguments is redefined
$.suitUp.imageUploadUrl = imageUploadUrl || '';
$.suitUp.embedUrl = embedUrl || '';
return this.each( function() {
var that = this,
self = $( this ).hide(),
buttonControls,
selectControls,
typeofCommandValue,
commandValue,
select,
mainBlock = create( 'div', {
className: 'peepm_suitup'
}),
containerBlock = create( 'div', {
className: 'peepm_suitup-editor',
contentEditable: true
}).keyup( function(){
updateTextarea();
highlightActiveControls();
}).focus( function(){
lastSelectionElement = this;
//document.execCommand('styleWithCSS', null, false);
}).mouseup( function(){
highlightActiveControls();
})
.html( that.value )
.appendTo( mainBlock ),
controlsBlock = create( 'div', {
className: 'peepm_suitup-controls'
}).appendTo( mainBlock ),
updateTextarea = function() {
saveHtml(that, containerBlock);
},
highlightActiveControls = function() {
buttonControls = buttonControls || $( 'a.peepm_suitup-control', controlsBlock );
buttonControls
.removeClass( 'active' )
.each( function(){
var self = $( this ),
command = self.data( 'command' ),
value = self.data( 'value' );
try {
value = value ? value.replace( '<', '' ).replace( '>', '' ) : value; // for formatBlock
doc.queryCommandValue( command ) === ( value || 'true' ) && self.addClass( 'active' );
} catch( e ) {}
try {
doc.queryCommandState( command ) && self.addClass( 'active' );
} catch( e ) {}
});
selectControls = selectControls || $( 'select.peepm_suitup-control', controlsBlock );
selectControls.each( function(){
var self = $( this ),
command = self.data( 'command' ),
value = doc.queryCommandValue( command ),
option = self.children( 'option' ).filter( function() {
return value && this.value.toLowerCase() === value.toLowerCase();
});
if( option.length ) {
this.value = option.val();
}
});
}
for( var splittedControl, i = 0, control = controls[ 0 ]; i < controls.length; control = controls[ ++i ] ) {
splittedControl = control.split( '#' );
control = splittedControl[ 0 ];
commandValue = splittedControl[ 1 ];
if( control === '|' ) {
create( 'span', {
className: 'peepm_suitup-separator'
}).appendTo( controlsBlock );
} else if( control in custom ) {
custom[ control ]( that, containerBlock ).appendTo( controlsBlock );
} else {
commandValue = commandValue || commands[ control ] || null;
typeofCommandValue = typeof commandValue;
if( commandValue && typeofCommandValue === 'object' ) {
select = create( 'select', {
className: 'peepm_suitup-control'
})
.attr( 'data-command', control )
.appendTo( controlsBlock )
.on( 'change', { command: control }, function( event ) {
var command = event.data.command;
doc.execCommand( command, null, this.value );
updateTextarea();
});
$.each( commandValue, function( displayName, commandValue ) {
create( 'option', {
value: commandValue
}).html( displayName )
.appendTo( select );
});
} else {
create( 'a', {
href: '#',
className: 'peepm_suitup-control'
})
.attr({
'data-command': control,
'data-value': typeofCommandValue === 'function' ? '_DYNAMIC_' : commandValue
})
.appendTo( controlsBlock )
.on( 'click', { command: control, value: commandValue, typeofValue: typeofCommandValue }, function( event ){
var command = event.data.command,
value = event.data.value,
typeofValue = event.data.typeofValue,
resultValue;
if( lastSelectionElement !== containerBlock[ 0 ] || !lastSelectionRange ) {
containerBlock.focus();
}
if( typeofValue === 'function' ) {
lastSelectionRange = getSelection();
value( function( resultValue ) {
lastSelectionElement.focus();
restoreSelection( lastSelectionRange );
doc.execCommand( command, null, resultValue );
updateTextarea();
});
} else {
resultValue = value;
doc.execCommand( command, null, resultValue );
updateTextarea();
highlightActiveControls();
}
return false;
});
}
}
}
mainBlock.insertBefore(that);
});
};
})( window, document, jQuery );
?>