// ----------------------------------------------------------------------------
// j(Universal?)TagEditor, JQuery plugin
// v 1.1.00
// ----------------------------------------------------------------------------
// Copyright (C) 2007 Jay Salvat
// http://www.jaysalvat.com/jquery/jtageditor/
// ----------------------------------------------------------------------------
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
// ----------------------------------------------------------------------------
(function($) {
$.fn.jTagEditor = function(settings) {
var field = this;
options = { editorClassName: "jTagEditor-editor",
toolBarClassName: "jTagEditor-toolBar",
buttonClassName: "jTagEditor-button",
resizeHandleClassName: "jTagEditor-resizeHandle",
insertOnEnter: {openTag:"", closeTag:"", callBack:"", preventDefault:true},
insertOnShiftEnter: {openTag:"
\n", closeTag:"", callBack:"", preventDefault:false},
insertOnCtrlEnter: {openTag:"
", closeTag:"
", callBack:"", preventDefault:false}, insertOnTab: {openTag:"", closeTag:"", callBack:"", preventDefault:false}, tagMask: "<(.*?)>", tagSet: "html/html-tags.js" }; var options = $.extend(options, settings); var openPos = 0; var closePos = 0; var scrollPos = 0; var openTags = new Array(); var keyCtrl = false; var keyShift = false; var keyAlt = false; return this.each(function() { var field = this; var $$ = $(field); var oId = $$.attr("id") || ""; var oClassName = $$.attr("class") || ""; var oTitle = $$.attr("title") || ""; var oName = $$.attr("name") || ""; // wrap textfield in a container div $(field).wrap(""); // add the toolbar et statusbar var toolbar = $(""},
{label:LB_JS_PREVIEW, callback : doPreview},
{label:LB_JS_COLOR, openTag:'', closeTag:''},
];
// fill the toolbar with tag buttons
$(options.tagSet).each(function(i) {
var button = this;
$("" + button.label + " ")
.click(function() {
if($(this).text()==LB_JS_COLOR&&!tagIsOpen(button.closeTag)){
colorPicker(button);
}
else{
if (!button.callback)
tag(button);
else
button.callback(options.contentType, oId);
}
return false;
})
.appendTo(toolbar);
});
// add the resize handle after textfield
var resizeHandle = $("")
.insertAfter($(this))
.bind("mousedown", function(evt) {
var height = $(field).height();
var y = evt.clientY;
var mouseMove = function(evt) {
$(field).height(Math.max(20, evt.clientY + height - y));
};
var mouseUp = function(evt) {
$("html").unbind("mousemove", mouseMove).unbind("mouseup", mouseUp);
};
$("html").bind("mousemove", mouseMove).bind("mouseup", mouseUp);
});
var previewBlock = $("
= 0; i--) {
lines[i] = (lines[i] != "") ? openTag + lines[i] + closeTag : "";
}
string = lines.join("\r\n");
start = openPos;
end = openPos + string.length - n + 1;
} else if (keyCtrl == true) {
start = openPos + openTag.length;
end = openPos + openTag.length + selection.length;
} else if (keyShift == true) {
start = openPos;
end = openPos + string.length;
} else {
start = openPos + openTag.length + selection.length + closeTag.length;
end = start;
}
// replace selection by the new string
if (document.selection) {
newSelection = document.selection.createRange();
newSelection.text = string;
} else if (openPos || openPos == "0") {
field.value = field.value.substring(0, openPos) + string + field.value.substring(closePos, field.value.length);
} else {
field.value += string;
}
set(start, end);
}
// set a selection
function set(start, end) {
if (field.createTextRange){
range = field.createTextRange();
range.collapse(true);
range.moveStart("character", start);
range.moveEnd("character", end - start);
range.select();
} else if (field.setSelectionRange ){
field.setSelectionRange(start, end);
}
field.scrollTop = scrollPos;
field.focus();
}
// get the selection
function get() {
field.focus();
scrollPos = field.scrollTop;
if (document.selection) {
selection = document.selection.createRange().text;
if ($.browser.msie) { // ie
var range = document.selection.createRange();
var rangeCopy = range.duplicate();
rangeCopy.moveToElementText(field);
openPos = -1;
while(rangeCopy.inRange(range)) { // fix most of the ie bugs with linefeeds... but not all :'(
rangeCopy.moveStart("character");
openPos ++;
}
} else { // opera
openPos = field.selectionStart;
closePos = field.selectionEnd;
}
} else if (field.selectionStart || field.selectionStart == "0") { // gecko
openPos = field.selectionStart;
closePos = field.selectionEnd;
selection = field.value.substring(openPos, closePos);
} else {
selection = "";
}
return selection;
}
// clear all tags
function cleanAll() {
get();
selection = selection.replace(new RegExp(options.tagMask, "g"), "");
wrap("", "");
}
// close all open tags
function closeAll() {
var tagsToClose = "";
n = openTags.length;
for (i = n - 1; i >= 0; i--) {
tagsToClose += openTags[i];
openTags.pop();
}
get();
wrap("", tagsToClose);
field.focus();
}
// check if tag is already open
function tagIsOpen(tag) {
var n = openTags.length;
for (var i = 0; i < n; i++) {
if (openTags[i] == tag) {
return true;
}
}
return false;
}
// set keys pressed
function keyUpDown(evt) { // safari doesn't fire event on shift and control key
keyCtrl = evt.ctrlKey;
keyShift = evt.shiftKey;
keyAlt = evt.altKey;
}
function keyPress(evt) {
get();
if (evt.keyCode == 13 || evt.keyCode == 10) {
if (keyCtrl == true) {
keyCtrl = false;
tag(options.insertOnCtrlEnter);
return options.insertOnCtrlEnter.preventDefault;
} else if (keyShift == true) {
keyShift = false;
tag(options.insertOnShiftEnter);
return options.insertOnShiftEnter.preventDefault;
} else {
tag(options.insertOnEnter);
return options.insertOnEnter.preventDefault;
}
}
if (evt.keyCode == 9) {
tag(options.insertOnTab);
return options.insertOnTab.preventDefault;
}
}
function colorPicker(button){
completeDialogBox({
content:'',
title:'Выберите цвет'
});
$('#colorPicker').colorPicker(
{
defaultColor: -1,
click:function(c){
$('#colorPicker').remove();
button.openTag='';
button.closeTag='';
tag(button);
}
});
}
});
};
})(jQuery);