File: //home/temp/yarustone.ru/bitrix/components/bitrix/main.post.form/templates/.default/script.js
;(function(){
if (window["LHEPostForm"])
return;
var repo = { controller : {}, handler : {}};
BX.addCustomEvent(window, "BFileDLoadFormControllerWasBound", function(obj) { repo.controller[obj.id] = true;});
BX.addCustomEvent(window, "WDLoadFormControllerInit", function(obj) { repo.controller[obj.CID] = obj; });
BX.addCustomEvent(window, "WDLoadFormControllerWasBound", function(obj) { repo.controller[obj.CID] = true; });
BX.addCustomEvent(window, "DiskDLoadFormControllerInit", function(obj) { repo.controller[obj.CID] = obj; });
BX.addCustomEvent(window, "DiskLoadFormControllerWasBound", function(obj) { repo.controller[obj.CID] = true; });
BX.addCustomEvent(window, 'OnEditorInitedBefore', function(editor) {
if (repo.handler[editor.id])
{
editor.__lhe_flags = ['OnEditorInitedBefore'];
if (repo.handler[editor.id]["params"] && repo.handler[editor.id]["params"]['LHEJsObjName']) // for custom templates
window[repo.handler[editor.id].params['LHEJsObjName']] = editor;
repo.handler[editor.id].OnEditorInitedBefore(editor);
}
});
var OnCreateIframeAfter = function(editor){
if (repo.handler[editor.id] && repo.handler[editor.id].editorIsLoaded !== true)
{
repo.handler[editor.id].editorIsLoaded = true;
repo.handler[editor.id].exec();
BX.onCustomEvent(repo.handler[editor.id], 'OnEditorIsLoaded', [repo.handler[editor.id], editor]);
}
};
BX.addCustomEvent(window, 'OnCreateIframeAfter', OnCreateIframeAfter);
BX.addCustomEvent(window, 'OnEditorInitedAfter', function(editor, forced){
if (repo.handler[editor.id])
{
editor.__lhe_flags.push('OnEditorInitedAfter');
repo.handler[editor.id].OnEditorInitedAfter(editor);
if (repo.handler[editor.id].editorIsLoaded !== true && forced && editor.sandbox && editor.sandbox.inited)
OnCreateIframeAfter.apply(editor, [editor]);
}
});
BX.util.object_search = function(needle, haystack)
{
for(var i in haystack)
{
if (haystack.hasOwnProperty(i))
{
if (haystack[i] == needle)
return true;
else if (typeof haystack[i] == "object" && haystack[i] !== null)
{
var result = BX.util.object_search_key(needle, haystack[i]);
if (result !== false)
return result;
}
}
}
return false;
};
var parserClass = function(bxTag, tag, additionalTags)
{
additionalTags = (additionalTags && additionalTags.length > 0 ? additionalTags : []);
if (typeof tag == "object" && tag.length > 0)
{
var res;
while((res = tag.pop()) && res && tag.length > 0)
{
additionalTags.push(res);
}
tag = res;
}
additionalTags.push(tag);
this.exist = true;
this.bxTag = bxTag;
this.tag = tag;
this.tags = additionalTags;
this.regexp = new RegExp("\\[(" + additionalTags.join("|") + ")=((?:\\s|\\S)*?)(?:\\s*?WIDTH=(\\d+)\\s*?HEIGHT=(\\d+))?\\]", "ig");
this.code = '[' + tag + '=#ID##ADDITIONAL#]';
this.wysiwyg = '<span style="color: #2067B0; border-bottom: 1px dashed #2067B0; margin:0 2px;" id="#ID#"#ADDITIONAL#>#NAME#</span>';
},
diskController = function(manager, id, params)
{
this.CID = this.id = id;
this.parser = (manager.parser['disk_file'] || null);
this.params = params;
this.node = BX('diskuf-selectdialog-' + id);
this.handler = repo.controller[id]; // BX.Disk.UF
this.manager = manager;
this.eventNode = this.manager.eventNode;
this.parserName = 'disk_file';
this.prefixNode = 'disk-edit-attach';
this.prefixHTMLNode = 'disk-attach-';
this.props = {
valueEditClassName : 'wd-inline-file',
securityCID : 'disk-upload-cid'
};
this.storage = 'disk';
this.fileToAttach = {};
this.xmlToAttach = {};
this.events = {
onInit : 'DiskDLoadFormControllerInit',
onShow : 'DiskLoadFormController',
onBound : 'DiskLoadFormControllerWasBound'};
};
diskController.prototype = {
parser : false,
eventNode : null,
values : {},
initialized : false,
functionsToExec : [],
exec : function(func, args)
{
if (typeof func == "function")
this.functionsToExec.push([func, args]);
if (this.handler && this.handler !== true)
{
var res;
while((res = this.functionsToExec.shift()) && res)
res[0].apply(this, res[1]);
}
},
init : function()
{
if (this.initialized !== true)
{
this.values = {};
this.functionsToExec = [];
this.initialized = true;
this.bindMainEvents(this.manager);
if (this.parser !== null)
{
this.bindEvents(this.manager);
return this.initValues();
}
}
return false;
},
initValues : function()
{
var values = BX.findChildren(this.node, {'className' : this.props.valueEditClassName}, true);
if (values && values.length > 0)
{
this.exec(this.runCheckText);
return true;
}
return false;
},
bindMainEvents : function(manager)
{
var __status = null;
BX.addCustomEvent(manager.eventNode, 'onReinitializeBefore', BX.proxy(this.clean, this));
// Pass event to show/hide controller
BX.addCustomEvent(manager.eventNode, 'onShowControllers', BX.proxy(function(status) {
__status = status;
BX.onCustomEvent(manager.eventNode, this.events.onShow, [status]);
}, this));
if (!repo.controller[this.id]) // in case controller has not bound yet
{
var func = BX.delegate(function(obj) {
if (obj["UID"] == this.id || obj["id"] == this.id)
{
if (__status === 'show' || __status === 'hide')
{
BX.onCustomEvent(manager.eventNode, this.events.onShow, [__status]);
__status = null;
}
BX.removeCustomEvent(window, this.events.onBound, func);
}
}, this);
BX.addCustomEvent(window, this.events.onBound, func);
}
if (BX["DD"] && this.storage == 'disk')
{
var dndF = BX.delegate(function(params)
{
if ((params["UID"] == this.id || params["id"] == this.id) &&
this.manager["dropZoneExists"] !== true)
{
BX.removeCustomEvent(window, this.events.onBound, dndF);
this.manager["dropZoneExists"] = true;
var controller = this.eventNode,
id = this.id;
diskController.dndCatcher = (diskController.dndCatcher || {});
diskController.dndCatcher[id] = {
"catch" : true,
files : [],
dropZone : null,
dropZoneMicro : null,
initdrag : BX.delegate(function()
{
diskController.dndCatcher[id].dropZone = new BX.DD.dropFiles(manager.eventNode);
BX.addCustomEvent(manager.eventNode, "OnImageDataUriHandle", BX.delegate(function(editor, imageBase64)
{
if (BX["UploaderUtils"])
{
var blob = BX.UploaderUtils.dataURLToBlob(imageBase64.src);
if (blob && blob.size > 0 && blob.type.indexOf("image/") == 0)
{
blob.name = (blob.name || imageBase64.title || ("image." + blob.type.substr(6)));
blob.referrerToEditor = imageBase64;
if (diskController.dndCatcher[id]["catch"] === true)
diskController.dndCatcher[id]["drop"]([blob]);
else if (this.handler && this.handler["addFile"])
this.handler.addFile(blob);
BX.onCustomEvent(editor, "OnImageDataUriCaught", [imageBase64]);
}
}
}, this));
BX.addCustomEvent(diskController.dndCatcher[id].dropZone, "dropFiles", diskController.dndCatcher[id]["drop"]);
BX.addCustomEvent(diskController.dndCatcher[id].dropZone, "dragEnter", diskController.dndCatcher[id]["dragover"]);
BX.addCustomEvent(diskController.dndCatcher[id].dropZone, "dragLeave", diskController.dndCatcher[id]["dragleave"]);
if (BX('micro' + manager.__divId))
{
diskController.dndCatcher[id].dropZoneMicro = new BX.DD.dropFiles(BX('micro' + manager.__divId));
BX.addCustomEvent(diskController.dndCatcher[id].dropZoneMicro, "dragEnter", function(){
BX.onCustomEvent(manager.eventNode, 'OnShowLHE', ['justShow'])
});
}
BX.unbind(document, "dragover", diskController.dndCatcher[id]["initdrag"]);
BX.onCustomEvent(manager.eventNode, "onDropZoneExists", []);
}, this),
dragover : BX.delegate(function() {
BX.addClass(manager.eventNode, "feed-add-post-dnd-over");
BX.onCustomEvent(manager.eventNode, "dragover", []);
}, this),
dragleave : BX.delegate(function() {
BX.removeClass(manager.eventNode, "feed-add-post-dnd-over");
BX.onCustomEvent(manager.eventNode, "dragleave", []);
}, this),
dragenterwindow : BX.delegate(function() {
BX.addClass(manager.eventNode, "feed-add-post-dnd-ready");
if (BX('micro' + manager.__divId)) {
BX.addClass(BX('micro' + manager.__divId), "feed-add-post-micro-dnd-ready");
}
BX.onCustomEvent(manager.eventNode, "dragenterwindow", []);
}, this),
dragleavewindow : BX.delegate(function(e) {
BX.removeClass(manager.eventNode, "feed-add-post-dnd-ready");
if (BX('micro' + manager.__divId)) {
BX.removeClass(BX('micro' + manager.__divId), "feed-add-post-micro-dnd-ready");
}
BX.onCustomEvent(manager.eventNode, "dragleavewindow", []);
}, this),
drop : BX.delegate(function(files)
{
BX.onCustomEvent(manager.eventNode, "drop", []);
BX.onCustomEvent(window, "dragWindowLeave");
BX.onCustomEvent(window, "__dragWindowLeave");
var result = 0;
if (files && files.length > 0)
{
if (diskController.dndCatcher[id]["catch"] === true)
{
diskController.dndCatcher[id].files = files;
result = 1
}
else
{
result = 2;
}
BX.onCustomEvent(manager.eventNode, this.events.onShow, ['show']);
BX.removeClass(manager.eventNode, "feed-add-post-dnd-ready feed-add-post-dnd-over");
}
return result;
}, this)
};
BX.ready(function(){ diskController.dndCatcher[id]["initdrag"](); } );
BX.addCustomEvent(controller, "OnIframeDrop", BX.delegate(function(e) {
BX.PreventDefault(e);
if (e["dataTransfer"] && e["dataTransfer"]["files"])
{
if (diskController.dndCatcher[id].drop(e["dataTransfer"]["files"]) === 2)
{
this.handler.agent.onChange(e["dataTransfer"]["files"]);
}
}
}, this));
BX.addCustomEvent(controller, "OnIframeDragOver", diskController.dndCatcher[id].dragover);
BX.addCustomEvent(controller, "OnIframeDragLeave", diskController.dndCatcher[id].dragleave);
if (!window["bxMpfDndCatcher"])
{
window["bxMpfDndCatcher"] = true;
var
isStarted = false,
start = function()
{
if (isStarted === false)
{
isStarted = true;
BX.bind(document, "dragleave", mousemove);
BX.bind(document, "dragover", mousemove);
BX.bind(document, "mouseout", stop);
BX.onCustomEvent(window, "dragWindowEnter");
}
},
stop = function(e)
{
BX.unbind(document, "dragleave", mousemove);
BX.unbind(document, "dragover", mousemove);
BX.unbind(document, "mouseout", stop);
isStarted = false;
BX.onCustomEvent(window, "dragWindowLeave");
},
mousemove = function(e)
{
if (mouseTimeout > 0)
{
clearTimeout(mouseTimeout);
mouseTimeout = 0;
}
BX.fixEventPageXY(e);
var fire = true;
if (e.pageX > 0 && e.pageY > 0)
{
var pos = BX.GetWindowSize();
if (e.pageY < pos.scrollHeight && e.pageX < pos.scrollWidth)
{
var top = (e.pageY - pos.scrollTop),
left = (e.pageX - pos.scrollLeft);
if (0 < top && top < (pos.innerHeight - 20) &&
0 < left && left < (pos.innerWidth - 20))
{
fire = false;
}
}
}
if (fire)
{
stop(e);
}
else
{
mouseTimeout = setTimeout(function(){mousemove({type : 'intervalLimit'});}, 100);
}
},
mouseTimeout = 0;
BX.bind(document, "dragenter", function(e)
{
if (window["bxMpfDndCatcher"] > 0)
{
clearTimeout(window["bxMpfDndCatcher"]);
}
var isFileTransfer = true;
if (e && e["dataTransfer"] && e["dataTransfer"]["types"])
{
for (var i = 0; i < e["dataTransfer"]["types"].length; i++)
{
if (e["dataTransfer"]["types"][i] == "Files")
{
isFileTransfer = true;
break;
}
}
}
if (isFileTransfer)
{
start();
}
});
BX.addCustomEvent(window, "__dragWindowLeave", stop);
BX.bind(document, "dragover", function(e)
{
return BX.PreventDefault(e);
});
BX.bind(document, "drop", function(e)
{
stop(e);
return BX.PreventDefault(e);
});
}
BX.addCustomEvent(window, "dragWindowEnter", diskController.dndCatcher[id].dragenterwindow);
BX.addCustomEvent(window, "dragWindowLeave", diskController.dndCatcher[id].dragleavewindow);
this.__initCatcher = BX.delegate(function(id, uploader) {
if (id == this.id)
{
BX.removeCustomEvent(manager.eventNode, 'onControllerInitialized', this.__initCatcher);
uploader.agent.initDropZone(manager.eventNode);
if (diskController.dndCatcher[id].files.length > 0)
{
uploader.agent.onChange(diskController.dndCatcher[id].files);
diskController.dndCatcher[id].files = [];
}
diskController.dndCatcher[id]["catch"] = false;
this.__initCatcher = null;
}
}, this);
BX.addCustomEvent(manager.eventNode, 'onControllerInitialized', this.__initCatcher);
}
}, this);
BX.addCustomEvent(window, this.events.onBound, dndF);
if (repo.controller[this.id])
dndF(repo.controller[this.id]);
}
},
bindEvents : function(manager)
{
this._catchHandler = BX.delegate(function(handler)
{
BX.removeCustomEvent(this.eventNode, this.events.onInit, this._catchHandler);
this.handler = handler;
var node = BX.findChild(BX(manager.formID), {attr: {id: this.props.securityCID}}, true, false);
if (node)
node.value = this.handler.CID;
this.exec();
var func = BX.delegate(function() { BX.onCustomEvent(manager.eventNode, "onUploadsHasBeenChanged", arguments); }, this);
BX.addCustomEvent(this.handler.agent, "onFileIsInited", func); // new uploader
BX.addCustomEvent(this.handler.agent, "ChangeFileInput", func); // old uploader
BX.onCustomEvent(manager.eventNode, 'onControllerInitialized', [this.id, handler]);
}, this);
if (typeof this.handler != "object" || !this.handler)
BX.addCustomEvent(manager.eventNode, this.events.onInit, this._catchHandler);
else
this._catchHandler(this.handler);
BX.addCustomEvent(manager.eventNode, 'OnFileUploadSuccess', BX.delegate(function(result, obj, blob) {if (this.id == obj.CID || this.id == obj.id) { blob = (blob || {}); blob.usePostfix = true; this.addFile(result, blob, obj); } }, this));
BX.addCustomEvent(manager.eventNode, 'OnFileUploadFailed', BX.delegate(function(result, obj, blob) { if (this.id == obj.CID || this.id == obj.id) { this.failFile(result, blob, obj); } }, this));
BX.addCustomEvent(manager.eventNode, 'OnFileUploadRemove', BX.delegate(function(result, obj) { if (this.id == obj.CID || this.id == obj.id) { this.deleteFile(result, {usePostfix : true}, obj); } }, this));
BX.addCustomEvent(this, "onFileIsInText", BX.proxy(function(file, inText) { this.adjustFile(this.checkFile(file), inText) }, this));
},
addFile : function(result, blob, obj)
{
var file = this.checkFile(result.element_id, result, blob);
if (file)
{
setTimeout(BX.proxy(function(){
this.bindFile(file);
this.adjustFile(file, false);
}, this), 100);
BX.onCustomEvent(this.eventNode, 'onFileIsAdded', [file, this, obj, blob]);
}
else
{
this.failFile(this, blob, obj);
}
return true;
},
failFile : function(node, blob, obj)
{
BX.onCustomEvent(this.eventNode, 'onFileIsFailed', [this, obj, blob]);
},
checkFile : function(id, result)
{
id = '' + (typeof id == "object" ? id.id : id);
if (typeof result == "object" &&
result !== null && id &&
result.element_name &&
BX(result.place))
{
var data = {
id : id,
name : result.element_name,
url : result.element_url,
type : 'isnotimage/xyz',
isImage : false,
place : BX(result.place, true),
xmlID : BX(result.place, true).getAttribute("bx-attach-xml-id"),
fileID : BX(result.place, true).getAttribute("bx-attach-file-id"),
fileType: BX(result.place, true).getAttribute("bx-attach-file-type")
},
preview;
if (/(\.png|\.jpg|\.jpeg|\.gif|\.bmp)$/i.test(result.element_name) &&
(preview = BX.findChild(data.place, {'className': 'files-preview', 'tagName' : 'IMG'}, true, false)) && preview)
{
data.type = 'image/xyz';
data.lowsrc = preview.src;
data.element_url = data.src = preview.src.replace(/\Wwidth=(\d+)/, '').replace(/\Wheight=(\d+)/, '');
data.isImage = true;
data.width = parseInt(preview.getAttribute("data-bx-full-width") || preview.getAttribute("data-bx-width"));
data.height = parseInt(preview.getAttribute("data-bx-full-height") || preview.getAttribute("data-bx-height"));
}
if (data.xmlID)
this.xmlToAttach[data.xmlID + ''] = id;
if (data.fileID)
this.fileToAttach[data.fileID + ''] = id;
this.values[id] = data;
}
return (this.values[id] || false);
},
bindFile : function(file)
{
var node = file.place;
if (typeof file == "object" && node && !node.hasAttribute("bx-file-is-bound"))
{
var name_wrap = BX.findChild(node, {className: 'f-wrap'}, true, false),
img_wrap = BX.findChild(node, {className: 'files-preview'}, true, false);
if (name_wrap)
{
BX.bind(name_wrap, "click", BX.delegate(function(){this.insertFile(file.id);}, this));
name_wrap.style.cursor = "pointer";
name_wrap.title = BX.message('MPF_FILE');
}
if (img_wrap)
{
BX.bind(img_wrap, "click", BX.delegate(function(){this.insertFile(file.id);}, this));
}
}
},
adjustFile : function(file, inText)
{
var node = file.place;
if (inText === true || inText === false)
{
if (!file.info)
file.info = BX.findChild(file.place, {className: 'files-info'}, true, false);
node = file.info;
if (BX.type.isDomNode(node))
{
var id = 'check-in-text-' + file.id,
button = BX(id),
props = (inText === false ? {
attrs : {
'bx-file-is-in-text' : "N"
},
props : {
className : 'insert-btn'
},
html : '<span class="insert-btn-text">' + BX.message("MPF_FILE_INSERT_IN_TEXT") + '</span>'
} : {
attrs : {
'bx-file-is-in-text' : "Y"
},
props : {
className : 'insert-text'
},
html : '<span class="insert-btn-text">' + BX.message("MPF_FILE_IN_TEXT") + '</span>'
});
if (!button)
{
props.attrs.id = id;
props.events = {
click : BX.proxy(function(){this.insertFile(file.id);}, this)
};
node.appendChild(BX.create('SPAN', props));
}
else
{
BX.adjust(button, props);
}
}
}
},
insertFile : function(file)
{
BX.onCustomEvent(this.eventNode, 'onFileIsInserted', [this.checkFile(file), this]);
},
deleteFile : function(file, params)
{
file = this.checkFile(file, params);
if (file)
{
BX.onCustomEvent(this.eventNode, 'onFileIsDeleted', [file, this]);
this.values[file.id].place = null;
delete this.values[file.id].place;
this.values[file.id] = null;
delete this.values[file.id];
file = null;
return true;
}
return false;
},
reinitValues : function(text, files) // when data needs to be generated
{
var id, node, data = {};
while ((id = files.pop()) && id)
{
node = BX(this.prefixHTMLNode + id);
node = (node ? (node.tagName == "A" ? node : BX.findChild(node, {tagName : "IMG"}, true)) : null);
if (node)
{
data['E' + id] = {
type: 'file',
id: id,
name: node.getAttribute("data-bx-title") || node.getAttribute("data-title"),
size: node.getAttribute("data-bx-size") || '',
sizeInt: node.getAttribute("data-bx-size") || '',
width: node.getAttribute("data-bx-width"),
height: node.getAttribute("data-bx-height"),
storage: 'disk',
previewUrl: (node.tagName == "A" ? '' : node.getAttribute("data-bx-src") || node.getAttribute("data-src")),
fileId: node.getAttribute("bx-attach-file-id")
};
if (node.hasAttribute("bx-attach-xml-id"))
data['E' + id]["xmlId"] = node.getAttribute("bx-attach-xml-id");
if (node.hasAttribute("bx-attach-file-type"))
data['E' + id]["fileType"] = node.getAttribute("bx-attach-file-type");
}
}
this.handler.selectFile({}, {}, data);
this.runCheckText();
},
runCheckText : function()
{
if (!this._checkText)
this._checkText = BX.delegate(this.checkText, this);
this.manager.exec(this._checkText);
},
checkText : function()
{
var
text1, text = this.manager.getContent(),
needToReparse = [], reg, ii;
if (text != '')
{
text1 = text;
for (ii in this.xmlToAttach)
{
if (this.xmlToAttach.hasOwnProperty(ii))
{
text = text.
replace(
new RegExp('\\&\\#91\\;DOCUMENT ID=(' + ii + ')([WIDTHHEIGHT=0-9 ]*)\\&\\#93\\;','gim'),
'[' + this.parser["tag"] + '=' + this.xmlToAttach[ii] + "$2]").
replace(
new RegExp('\\[DOCUMENT ID=(' + ii + ')([WIDTHHEIGHT=0-9 ]*)\\]','gim'),
'[' + this.parser["tag"] + '=' + this.xmlToAttach[ii] + "$2]");
}
}
for (ii in this.fileToAttach)
{
if (this.fileToAttach.hasOwnProperty(ii))
{
text = text.
replace(
new RegExp('\\&\\#91\\;' + this.parser["tag"] + '=(' + ii + ')([WIDTHHEIGHT=0-9 ]*)\\&\\#93\\;','gim'),
'[' + this.parser["tag"] + '=' + this.fileToAttach[ii] + "$2]").
replace(
new RegExp('\\[' + this.parser["tag"] + '=(' + ii + ')([WIDTHHEIGHT=0-9 ]*)\\]','gim'),
'[' + this.parser["tag"] + '=' + this.fileToAttach[ii] + "$2]");
}
}
reg = new RegExp('(?:\\&\\#91\\;)(' + this.parser["tags"].join("|") + ')=([a-z=0-9 ]+)(?:\\&\\#93\\;)','gim');
if (reg.test(text))
{
for (ii in this.values)
{
if (this.values.hasOwnProperty(ii))
{
needToReparse.push(ii);
}
}
if (needToReparse.length > 0)
{
reg = new RegExp('(?:\\&\\#91\\;|\\[)(' + this.parser["tags"].join("|") + ')=(' + needToReparse.join("|") + ')([WIDTHHEIGHT=0-9 ]*)(?:\\&\\#93\\;|\\])','gim');
if (reg.test(text))
text = text.replace(reg, BX.delegate(function(str, tagName, id, add) { return '[' + tagName + '=' + id + add + ']'; }, this));
}
}
if (text1 != text)
BX.onCustomEvent(this.eventNode, 'onFileIsDetected', [text, this]);
}
return text;
},
clean : function()
{
if (this.handler && this.handler.values)
{
var res, files, ii, form = BX(this.manager.formID);
while ((res = this.handler.values.pop()) && res)
{
BX.remove(res);
}
if (this.handler.params && this.handler.params.controlName)
{
files = BX.findChildren(form, {
tagName : "INPUT",
attribute : {
name : this.handler.params.controlName
}
}, true);
}
if (files)
{
for (ii = 0; ii < files.length; ii++)
{
BX.remove(files[ii]);
}
}
}
},
reinit : function(text, data)
{
var files = [], name, ii;
for (name in data)
{
if (data.hasOwnProperty(name))
{
if (data[name]['USER_TYPE_ID'] == this.parserName && data[name]['VALUE'])
{
for (ii in data[name]['VALUE'])
{
if (data[name]['VALUE'].hasOwnProperty(ii))
{
files.push(data[name]['VALUE'][ii]);
}
}
}
}
}
if (files.length > 0)
{
this.exec(this.reinitValues, [text, files]);
return true;
}
return false;
}
};
var webdavController = function(manager, id, params)
{
webdavController.superclass.constructor.apply(this, arguments);
this.parser = (manager.parser['webdav_element'] || null);
this.node = BX('wduf-selectdialog-' + id);
this.manager = manager;
this.parserName = 'webdav_element';
this.prefixNode = 'wd-doc';
this.prefixHTMLNode = 'wdif-doc-';
this.storage = 'webdav';
this.events = {
onInit : 'WDLoadFormControllerInit',
onShow : 'WDLoadFormController',
onBound : 'WDLoadFormControllerWasBound'};
};
BX.extend(webdavController, diskController);
webdavController.prototype.reinitValues = function(text, files) // when data needs to be generated
{
var id, node, data = {};
this.waitAnswerFromServer = [];
while ((id = files.pop()) && id)
{
node = BX(this.prefixHTMLNode + id);
node = (node ? (node.tagName == "A" ? node : BX.findChild(node, {tagName : "IMG"}, true)) : null);
if (node)
{
data['E' + id] = {
type: 'file',
id: id,
name: node.getAttribute("alt"),
storage: 'webdav',
size: node.getAttribute("data-bx-size"),
sizeInt: 1,
ext: '',
link: node.getAttribute("data-bx-document")
};
if (node.hasAttribute("bx-attach-xml-id"))
data['E' + id]["xmlId"] = node.getAttribute("bx-attach-xml-id");
this.waitAnswerFromServer.push(id);
}
}
if (this.waitAnswerFromServer.length > 0)
{
if (!this._defferCheckText)
this._defferCheckText = BX.delegate(this.defferCheckText, this);
BX.addCustomEvent(this.eventNode, 'OnFileUploadSuccess', this._defferCheckText);
this.handler.WDFD_SelectFile({}, {}, data);
}
};
webdavController.prototype.defferCheckText = function(result)
{
var key = BX.util.array_search(result.element_id, this.waitAnswerFromServer);
if (key >= 0)
{
this.runCheckText();
this.waitAnswerFromServer = BX.util.deleteFromArray(this.waitAnswerFromServer, key);
}
if (this.waitAnswerFromServer.length <= 0)
BX.removeCustomEvent(this.eventNode, 'OnFileUploadSuccess', this._defferCheckText);
};
var fileController = function(manager, id, params)
{
fileController.superclass.constructor.apply(this, arguments);
this.parser = (manager.parser['file'] ? manager.parser['file'] : (manager.parser['postimage']['exist'] ? manager.parser['postimage'] : null));
this.postfix = (params['postfix'] || '');
this.node = BX('file-selectdialog-' + id);
this.parserName = 'file';
this.prefixNode = 'wd-doc';
this.prefixHTMLNode = 'file-doc-';
this.props = {
valueEditClassName : 'file-inline-file',
securityCID : 'upload-cid'
};
this.storage = 'bfile';
this.events = {
onInit : 'BFileDLoadFormControllerInit',
onShow : 'BFileDLoadFormController',
onBound : 'BFileDLoadFormControllerWasBound'};
};
BX.extend(fileController, diskController);
fileController.prototype.initValues = function(result)
{
var values;
if (result !== true)
{
values = BX.findChildren(this.node, {'className' : this.props.valueEditClassName}, true);
if (values && values.length > 1)
{
this.exec(this.initValues, [true]);
return true;
}
return false;
}
values = (this.handler.agent.values || []);
var
file, node, data, id,
ID = {},
url = '/bitrix/components/bitrix/main.file.input/file.php?mfi_mode=down&cid='+this.handler.CID + '&sessid='+BX.bitrix_sessid();
for (var ii = 0; ii < values.length; ii++)
{
id = parseInt(values[ii].getAttribute("id").replace(this.prefixNode, ""));
if (ID['id' + id])
continue;
ID['id' + id] = "Y";
if (id > 0)
{
node = BX.findChild(values[ii], {'className': 'f-wrap'}, true, false);
if(!node)
continue;
data = {
element_id : id,
element_name : node.innerHTML,
parser : this.parser.bxTag,
storage : 'bfile',
element_url : (url + '&fileID=' + id)
};
file = this.addFile(data, {usePostfix : true, hasPreview : false});
}
}
this.runCheckText();
return true;
};
fileController.prototype.checkFile = function(id, result, param)
{
id = '' + (typeof id == "object" ? id.id : id);
id = id + (param && param["usePostfix"] === true ? this.postfix : '');
if (typeof result == "object" &&
result !== null && id &&
result.element_name &&
BX(this.prefixNode + result.element_id, true))
{
var data = {
id : id,
name : result.element_name,
url : result.element_url,
type : 'isnotimage/xyz',
isImage : false,
place : BX(this.prefixNode + result.element_id, true)
},
preview;
if ((result['element_type'] && result['element_type'].indexOf('image/') === 0 || /(\.png|\.jpg|\.jpeg|\.gif|\.bmp)$/i.test(result.element_name)) &&
((preview = BX.findChild(data.place, {'tagName' : 'IMG'}, true, false)) && preview || (param && param["hasPreview"] === false)))
{
data.type = 'image/xyz';
data.src = (result['element_thumbnail'] || result['element_url']);
data.isImage = true;
data.hasPreview = false;
data.lowsrc = '';
data.width = '';
data.height = '';
if (BX(preview))
{
data.hasPreview = true;
data.lowsrc = (result['element_thumbnail'] || preview['src']);
data.width = parseInt(preview.getAttribute("data-bx-full-width"));
data.height = parseInt(preview.getAttribute("data-bx-full-height"));
}
}
else if (this.parser.bxTag == 'postimage')
{
return false;
}
if(BX(data.place, true).getAttribute("bx-attach-file-type"))
{
data.fileType = BX(data.place, true).getAttribute("bx-attach-file-type");
}
this.values[id] = data;
}
return (this.values[id] || false);
};
fileController.prototype.bindFile = function(file)
{
var node = (file && file['place'] ? file['place'] : null);
if (typeof file == "object" && node && !node.hasAttribute("bx-file-is-bound"))
{
if (file.isImage && file.hasPreview)
{
var
img_title = BX.findChild(node, {className: 'feed-add-img-title'}, true, false),
img_wrap = BX.findChild(node, {className: 'feed-add-img-wrap'}, true, false);
if (img_wrap)
{
BX.bind(img_wrap, "click", BX.proxy(function(){this.insertFile(file);}, this));
img_wrap.style.cursor = "pointer";
img_wrap.title = BX.message('MPF_IMAGE');
}
if (img_title)
{
BX.bind(img_title, "click", BX.delegate(function(){this.insertFile(file);}, this));
img_title.style.cursor = "pointer";
img_title.title = BX.message('MPF_IMAGE');
}
}
else
fileController.superclass.bindFile.apply(this, arguments);
}
};
fileController.prototype.clean = function()
{
fileController.superclass.clean.apply(this, arguments);
if (this["handler"] && this.handler["agent"] && this.handler.agent["inputName"])
{
var files, ii, form = BX(this.manager.formID);
files = BX.findChildren(form, {
tagName : "INPUT",
attribute : {
name : this.handler.agent.inputName + "[]"
}
}, true);
if (files)
{
for (ii = 0; ii < files.length; ii++)
{
BX.remove(files[ii]);
}
}
}
};
var LHEPostForm = function(formID, params)
{
this.params = params;
this.formID = formID;
this.showPinButton = !!BX('lhe_button_editor_' + this.formID);
if(this.showPinButton)
{
this.params.showPanelEditor = !!this.params.pinEditorPanel;
}
this.oEditorId = params['LHEJsObjId'];
this.__divId = (params['LHEJsObjName'] || params['LHEJsObjId']);
repo.handler[this.oEditorId] = this;
this.oEditor = LHEPostForm.getEditor(this.oEditorId);
this.urlPreview = this.initUrlPreview(params);
this.eventNode = BX('div' + this.__divId);
BX.addCustomEvent(this.eventNode, 'OnShowLHE', BX.delegate(this.OnShowLHE, this));
BX.addCustomEvent(this.eventNode, 'OnButtonClick', BX.delegate(this.OnButtonClick, this));
BX.addCustomEvent(this.eventNode, 'OnAfterShowLHE', function(status, handler) {
if (handler.oEditor && handler.oEditor["AllowBeforeUnloadHandler"])
handler.oEditor.AllowBeforeUnloadHandler();
if (handler.monitoringWakeUp === true)
handler.monitoringStart();
});
BX.addCustomEvent(this.eventNode, 'OnAfterHideLHE', function(status, handler) {
handler.monitoringWakeUp = handler.monitoringStop();
if (handler.oEditor && handler.oEditor["DenyBeforeUnloadHandler"])
handler.oEditor.DenyBeforeUnloadHandler();
});
this.initParsers(params);
this.initFiles(formID, params);
BX.ready(
BX.delegate(
function()
{
if (BX('lhe_button_submit_' + formID, true))
{
BX.bind(BX('lhe_button_submit_' + formID, true), 'click', BX.proxy(function(e){
BX.onCustomEvent(this.eventNode, 'OnButtonClick', ['submit']);
return BX.PreventDefault(e);
}, this));
}
if (BX('lhe_button_cancel_' + formID, true))
{
BX.bind(BX('lhe_button_cancel_' + formID, true), 'click', BX.proxy(function(e){
BX.onCustomEvent(this.eventNode, 'OnButtonClick', ['cancel']);
return BX.PreventDefault(e);
}, this));
}
},
this
)
);
this.inited = true;
BX.addCustomEvent(BX(this.formID), 'onAutoSavePrepare', function(ob) { ob.FORM.setAttribute("bx-lhe-autosave-prepared", "Y"); });
BX.onCustomEvent(this, "onInitialized", [this, formID, params, this.parsers]);
BX.onCustomEvent(this.eventNode, "onInitialized", [this, formID, params, this.parsers]);
if (this.oEditor && this.oEditor.inited && !this.oEditor['__lhe_flags'])
{
BX.onCustomEvent(this.oEditor, "OnEditorInitedBefore", [this.oEditor]);
BX.onCustomEvent(this.oEditor, "OnEditorInitedAfter", [this.oEditor, true]);
}
};
LHEPostForm.prototype = {
editorIsLoaded : false,
arFiles : {},
parser : {},
controllers : {},
exec : function(func, args)
{
this.functionsToExec = (this.functionsToExec || []);
if (typeof func == "function")
this.functionsToExec.push([func, args]);
if (this.editorIsLoaded === true)
{
var res;
while((res = this.functionsToExec.shift()) && res)
res[0].apply(this, res[1]);
}
},
initParsers : function(params)
{
this.parser = {
postimage : {
exist : false,
bxTag : 'postimage',
tag : "IMG ID",
tags : ["IMG ID"],
regexp : /\[(IMG ID)=((?:\s|\S)*?)(?:\s*?WIDTH=(\d+)\s*?HEIGHT=(\d+))?\]/ig,
code : '[IMG ID=#ID##ADDITIONAL#]',
wysiwyg : '<img id="#ID#" src="' + '#SRC#" lowsrc="' + '#LOWSRC#" title=""#ADDITIONAL# />'
},
player : {
exist : false,
bxTag : 'player',
tag : "FILE ID",
tags : ["FILE ID"],
regexp : /\[(FILE ID)=((?:\s|\S)*?)?\]/ig,
code : '[FILE ID=#ID##ADDITIONAL#]',
wysiwyg : '<img class="bxhtmled-player-surrogate" id="#ID#" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" contenteditable="false" title=""#ADDITIONAL# />'
}
};
var parsers = (params["parsers"] ? params["parsers"] : {});
for (var ii in parsers)
{
if (parsers.hasOwnProperty(ii) && /[a-z]/gi.test(ii+''))
{
this.parser[ii] = new parserClass(ii, parsers[ii]);
}
}
if (BX.util.object_search('UploadImage', parsers))
{
this.parser['postimage']['exist'] = true;
}
if (typeof params['arSize'] == "object")
{
var style = '';
if (params['arSize']['width'])
style += 'max-width:' + params['arSize']['width'] + 'px;';
if (params['arSize']['height'])
style += 'max-height:' + params['arSize']['height'] + 'px;';
if (style !== '')
this.parser['postimage']['wysiwyg'] = this.parser['postimage']['wysiwyg'].replace('#ADDITIONAL#', ' style="' + style + '" #ADDITIONAL#');
}
},
initFiles : function(formID, params)
{
this.arFiles = {};
this.controllers = {
common : {
postfix : "",
storage : "bfile",
parser : "postimage",
node : window,
obj : null,
init : false
}
};
this.monitoring = {
interval : null,
text : '',
savedText : '',
files : [],
savedFiles : []
};
if (!params["CID"] || typeof params["CID"] !== "object")
return;
BX.addCustomEvent(this.eventNode, 'onFileIsAdded', BX.delegate(this.OnFileUploadSuccess, this));
BX.addCustomEvent(this.eventNode, 'onFileIsFailed', BX.delegate(this.OnFileUploadFailed, this));
BX.addCustomEvent(this.eventNode, 'onFileIsDeleted', BX.delegate(this.OnFileUploadRemove, this));
BX.addCustomEvent(this.eventNode, 'onFileIsDetected', BX.delegate(this.setContent, this));
BX.addCustomEvent(this.eventNode, 'onFileIsInserted', BX.delegate(this.insertFile, this));
var parser, cid, init;
for (cid in params["CID"])
{
if (params["CID"].hasOwnProperty(cid))
{
parser = params["CID"][cid]["parser"];
if (parser == 'disk_file')
this.controllers[cid] = new diskController(this, cid, params["CID"][cid]);
else if (parser == 'webdav_element')
this.controllers[cid] = new webdavController(this, cid, params["CID"][cid]);
else if (parser == 'file')
this.controllers[cid] = new fileController(this, cid, params["CID"][cid]);
if (this.controllers[cid] && this.controllers[cid].init() && !init)
init = true;
}
}
BX.ready(
BX.delegate(
function()
{
BX.bind(BX('bx-b-uploadfile-' + formID), 'click', BX.proxy(this.controllerInit, this));
if (init)
this.controllerInit('show');
},
this
)
);
},
controllerInit : function(status)
{
this.controllerInitStatus = (status == 'show' || status == 'hide' ? status : (this.controllerInitStatus == 'show' ? 'hide' : 'show'));
BX.onCustomEvent(this.eventNode, "onShowControllers", [this.controllerInitStatus]);
},
initUrlPreview: function()
{
if(this.params['urlPreviewId'] && window['BXUrlPreview'] && BX(this.params['urlPreviewId']))
{
return new BXUrlPreview(BX(this.params['urlPreviewId']));
}
return null;
},
getContent : function()
{
return (this.oEditor ? this.oEditor.GetContent() : '');
},
setContent : function(text)
{
if (this.oEditor)
this.oEditor.SetContent(text);
},
OnFileUploadSuccess : function(file, controller, uploaded, blob)
{
if (this.controllers[controller.id])
{
var id = controller.parser.bxTag + file.id;
this.arFiles[id] = (this.arFiles[id] || []);
this.arFiles[id].push(controller.id);
if (blob && blob["referrerToEditor"])
{
var regs = this.getFileToInsert(file, controller);
BX.onCustomEvent(blob["referrerToEditor"], "OnImageDataUriCaughtUploaded", [regs]);
BX.onCustomEvent(this.oEditor, "OnImageDataUriCaughtUploaded", [blob["referrerToEditor"], file, regs]);
}
else if (uploaded === true && file.isImage && this.insertImageAfterUpload)
{
if (!this._insertFile)
this._insertFile = BX.delegate(this.insertFile, this);
this.exec(this._insertFile, arguments);
}
}
},
OnFileUploadFailed : function(file, controller, blob)
{
if (blob && blob["referrerToEditor"])
{
BX.onCustomEvent(blob["referrerToEditor"], "OnImageDataUriCaughtFailed", []);
BX.onCustomEvent(this.editor, "OnImageDataUriCaughtFailed", [blob["referrerToEditor"]]);
}
},
OnFileUploadRemove : function(file, controller)
{
if (this.controllers[controller.id])
{
var id = controller.parser.bxTag + file.id;
if (this.arFiles[id])
{
var key = BX.util.array_search(controller.id, this.arFiles[id]);
this.arFiles[id] = BX.util.deleteFromArray(this.arFiles[id], key);
if (!this.arFiles[id] || this.arFiles[id].length <= 0)
{
this.arFiles[id] = null;
delete this.arFiles[id];
if (!this._deleteFile)
this._deleteFile = BX.delegate(this.deleteFile, this);
this.exec(this._deleteFile, arguments);
}
}
}
},
showPanelEditor : function(show, save)
{
if (show == undefined)
show = !this.oEditor.toolbar.IsShown();
this.params.showPanelEditor = show;
var
button = BX('lhe_button_editor_' + this.formID),
panelClose = BX('panel-close' + this.__divId);
if (panelClose)
{
this.oEditor.dom.cont.appendChild(panelClose);
}
if(show)
{
this.oEditor.dom.toolbarCont.style.opacity = 'inherit';
this.oEditor.toolbar.Show();
if (button)
BX.addClass(button, 'feed-add-post-form-btn-active');
if (panelClose)
panelClose.style.display = '';
}
else
{
this.oEditor.toolbar.Hide();
if (button)
BX.removeClass(button, 'feed-add-post-form-btn-active');
if (panelClose)
panelClose.style.display = 'none';
}
if (save !== false)
BX.userOptions.save('main.post.form', 'postEdit', 'showBBCode', show ? "Y" : "N");
},
monitoring : {},
monitoringStart : function()
{
if (this.monitoring.interval === null)
{
if (!this._monitoringStart)
{
this._monitoringStart = BX.delegate(this.checkFilesInText, this);
BX.addCustomEvent(this.oEditor, 'OnContentChanged', BX.proxy(function(text) {
this.monitoring.text = text;
}, this));
}
this.monitoring.interval = setInterval(this._monitoringStart, 1000);
}
},
monitoringStop : function()
{
var ret = (this.monitoring.interval !== null);
if (this.monitoring.interval !== null)
clearInterval(this.monitoring.interval);
this.monitoring.interval = null;
return ret;
},
monitoringSetStatus: function(parser, file, inText)
{
if (this.arFiles[parser + file])
{
var cid;
for (var ii = 0; ii < this.arFiles[parser + file].length; ii++)
{
//this.monitoring.files.push([parser, file].join('/'));
cid = this.arFiles[parser + file][ii];
BX.onCustomEvent(this.controllers[cid], "onFileIsInText", [file, inText]);
}
}
},
checkFilesInText: function()
{
if (this.monitoring.text !== this.monitoring.savedText)
{
this.monitoring.savedText = this.monitoring.text;
this.monitoring.files = [];
var text = this.monitoring.savedText,
ii, closure = function(a,parser) {return function(str, tagName, id) { a.monitoring.files.push([parser, id].join('/')); } };
for (ii in this.parser)
{
if (this.parser.hasOwnProperty(ii))
{
if (!this.parser[ii]["checkFilesInText"])
{
this.parser[ii]["checkFilesInText"] = closure(this, ii);
}
text.replace(
this.parser[ii]["regexp"],
this.parser[ii]["checkFilesInText"]
);
}
}
if (this.monitoring.savedFiles.join(',') !== this.monitoring.files.join(','))
{
var files = {}, id;
while (id = this.monitoring.savedFiles.pop())
{
files[id] = null;
}
for (ii = 0; ii < this.monitoring.files.length; ii++)
{
id = this.monitoring.files[ii];
files[id] = (files[id] >= 0 ? (files[id] + 1) : 1);
}
for (ii in files)
{
if (files.hasOwnProperty(ii))
{
id = ii.split('/');
this.monitoringSetStatus(id[0], id[1], (files[ii] > 0));
}
}
}
this.monitoring.savedFiles = this.monitoring.files;
if (this.monitoring.savedFiles.length <= 0)
this.monitoringStop();
}
},
checkFile : function(file, controller) // or fileId and controller or fileId and parser
{
var r = false;
if (typeof file == 'string')
{
var parser = (typeof controller == 'string' ? controller : controller.parser);
if (!!this.arFiles[parser + file])
{
var fileController = this.arFiles[parser + file][0];
controller = this.controllers[fileController];
r = {
file : controller.values[file],
controller : controller
};
}
}
else if (this.controllers[controller.id])
{
r = {
file : file,
controller : controller
};
}
return r
},
insertFile : function(file, controller)
{
var editor = this.oEditor;
if (editor && file)
{
var editorMode = editor.GetViewMode(),
res = this.getFileToInsert(file, controller);
if (editorMode == 'wysiwyg') // WYSIWYG
{
editor.InsertHtml(res.replacement);
setTimeout(BX.delegate(editor.AutoResizeSceleton, editor), 500);
setTimeout(BX.delegate(editor.AutoResizeSceleton, editor), 1000);
}
else if (editorMode == 'code')
{
editor.textareaView.Focus();
if (!editor.bbCode)
{
var editorDoc = editor.GetIframeDoc();
var dummy = editorDoc.createElement('DIV');
dummy.style.display = 'none';
dummy.innerHTML = res.replacement;
editorDoc.body.appendChild(dummy);
res.replacement = editor.Parse(res.replacement, true, false);
dummy.parentNode.removeChild(dummy);
}
editor.textareaView.WrapWith('', '', res.replacement);
}
else
{
return;
}
res["callback"]();
}
},
getFileToInsert : function(file, controller)
{
var editor = this.oEditor;
if (editor && file)
{
var
fileID = file['id'],
params = '',
parser = controller.parser,
editorMode = editor.bbCode ? editor.GetViewMode() : 'wysiwyg',
pattern = this.parser[parser.bxTag][editorMode];
if (file['fileType'] && this.parser[file['fileType']] && editorMode == "wysiwyg")
{
pattern = this.parser[file['fileType']][editorMode];
}
if (file['isImage'])
{
pattern = (editorMode == "wysiwyg" ? this.parser["postimage"][editorMode] : pattern);
if (file.width > 0 && file.height > 0 && editor.sEditorMode == "html" )
{
params = ' style="width:' + file.width + 'px;height:' + file.height + 'px;" onload="this.style.width=\'auto\';this.style.height=\'auto\';"';
}
}
if (editorMode == 'wysiwyg') // WYSIWYG
{
pattern = pattern.
replace("#ID#", editor.SetBxTag(false, {'tag': parser.bxTag, params: {'value' : fileID}})).
replace("#SRC#", file.src).replace("#URL#", file.url).
replace("#LOWSRC#", (file.lowsrc || '')).
replace("#NAME#", file.name).replace("#ADDITIONAL#", params) + '<span> </span>';
}
else if (editorMode == 'code' && editor.bbCode) // BB Codes
{
pattern = pattern.replace("#ID#", fileID).replace("#ADDITIONAL#", "");
}
return {
replacement : pattern,
"callback" : BX.proxy(function(){
this.monitoringSetStatus(controller.parser.bxTag, file.id, true);
this.monitoringStart();
}, this)
}
}
return {
replacement : "",
"callback" : BX.DoNothing
};
},
deleteFile: function(file, controller)
{
var
editor = this.oEditor,
parser = controller.parser,
id = file.id,
content = editor.GetContent();
if (parser && content.indexOf('=' + id) >= 0)
{
if(editor.GetViewMode() == 'wysiwyg') // WYSIWYG
{
var doc = editor.GetIframeDoc(), ii, n;
for (ii in editor["bxTags"])
{
if (editor["bxTags"].hasOwnProperty(ii))
{
if (typeof editor.bxTags[ii] == "object" &&
editor.bxTags[ii]["params"] &&
editor.bxTags[ii]["params"]["value"] == file.id)
{
n = doc.getElementById(ii);
if (n)
n.parentNode.removeChild(n);
}
}
}
editor.SaveContent();
}
else
{
content = content.replace(parser.regexp, function(str, tagName, id) { return (id == file.id ? '' : str); } );
editor.SetContent(content);
editor.Focus();
}
this.monitoringSetStatus(parser.bxTag, file.id, false);
}
},
reinit : function(text, data)
{
BX.onCustomEvent(this.eventNode, "onReinitializeBefore", [this, text, data]);
this.arFiles = {};
delete this.monitoringWakeUp;
this.monitoringStop();
this.oEditor.CheckAndReInit(text || '');
BX.onCustomEvent(this.eventNode, "onReinitialize", [this, text, data]);
var cid, needsToInit = false;
for (cid in this.controllers)
{
if (this.controllers.hasOwnProperty(cid))
{
if (this.controllers[cid]['init'] && this.controllers[cid].reinit(text, data))
needsToInit = true;
}
}
this.controllerInit((needsToInit ? 'show' : 'hide'));
if (this.params["~height"])
{
this.oEditor.SetConfigHeight(this.params["~height"]);
this.oEditor.ResizeSceleton();
}
if (this.urlPreview)
{
this.urlPreview.detachUrlPreview();
var urlPreviewId;
for(var uf in data)
{
if(data.hasOwnProperty(uf) && data[uf].hasOwnProperty('USER_TYPE_ID') && data[uf]['USER_TYPE_ID'] === 'url_preview')
{
urlPreviewId = data[uf]['VALUE'];
}
}
if(urlPreviewId)
this.urlPreview.attachUrlPreview({id: urlPreviewId});
}
},
Parse : function(parser, content, editor)
{
var
arParser = this.parser[parser],
obj = this;
if (arParser)
{
content = content.replace(
arParser.regexp,
function(str, tagName, id, width, height)
{
var file = obj.checkFile(id, parser);
if (file && (file = file.file) && file)
{
var
strAdditional = "",
template = (file.isImage ? obj.parser.postimage.wysiwyg : arParser.wysiwyg);
obj.monitoringStart();
if (file.fileType && obj.parser[file.fileType] && obj.parser[file.fileType].wysiwyg)
{
template = obj.parser[file.fileType].wysiwyg;
}
if (file.isImage)
{
width = parseInt(width);
height = parseInt(height);
strAdditional = ((width && height) ?
(" width=\"" + width + "\" height=\"" + height + "\"") : "");
if (strAdditional === "" && file["width"] > 0 && file["height"] > 0)
{
strAdditional = ' style="width:' + file["width"] + 'px;height:' + file["height"] + 'px;" onload="this.style.width=\'auto\';this.style.height=\'auto\';"';
}
}
return template.
replace("#ID#", editor.SetBxTag(false, {tag: parser, params: {value : id}})).
replace("#NAME#", file.name).
replace("#SRC#", file.src).
replace("#LOWSRC#", file.lowsrc).
replace("#ADDITIONAL#", strAdditional).
replace("#WIDTH#", parseInt(width)).
replace("#HEIGHT#", parseInt(height));
}
return str;
}
)
}
return content;
},
/**
* @return {string}
*/
Unparse: function(bxTag, oNode/*, editor*/)
{
var res = "", parser = bxTag.tag;
if (this.parser[parser])
{
var
width = parseInt(oNode.node.hasAttribute("width") ? oNode.node.getAttribute("width") : 0),
height = parseInt(oNode.node.hasAttribute("height") ? oNode.node.getAttribute("height") : 0),
strSize = "";
if (width > 0 && height > 0)
{
strSize = ' WIDTH=' + width + ' HEIGHT=' + height;
}
res = this.parser[parser]["code"].
replace("#ID#", bxTag.params.value).
replace("#ADDITIONAL#", strSize).
replace("#WIDTH#", width).
replace("#HEIGHT#", height);
}
return res;
},
OnShowLHE : function(show, editor, setFocus)
{
var lheName = this.__divId;
show = (show === false ? false : (show === 'hide' ? 'hide' : (show === 'justShow' ? 'justShow' : true)));
this.oEditor = (this.oEditor || LHEPostForm.getEditor(this.oEditorId));
if (!this.oEditor)
return;
this.oEditor.Init();
var
micro = BX('micro' + lheName),
div = this.eventNode;
if (micro)
{
micro.style.display = ((show === true || show === 'justShow') ? "none" : "block");
}
if (show == 'hide')
{
BX.onCustomEvent(this.eventNode, 'OnBeforeHideLHE', [show, this]);
if (this.eventNode.style.display == "none")
{
BX.onCustomEvent(this.eventNode, 'OnAfterHideLHE', [show, this]);
}
else
{
(new BX["easing"]({
duration : 200,
start : { opacity: 100, height : this.eventNode.scrollHeight},
finish : { opacity : 0, height : 20},
transition : BX.easing.makeEaseOut(BX.easing.transitions.quad),
step : function(state)
{
div.style.height = state.height + "px";
div.style.opacity = state.opacity / 100;
},
complete : BX.proxy(function()
{
this.eventNode.style.cssText = "";
this.eventNode.style.display = "none";
BX.onCustomEvent(div, 'OnAfterHideLHE', [show, this]);
}, this)
})).animate();
}
}
else if (show)
{
BX.onCustomEvent(this.eventNode, 'OnBeforeShowLHE', [show, this]);
if (show == "justShow")
{
this.eventNode.style.display = "block";
BX.onCustomEvent(this.eventNode, 'OnAfterShowLHE', [show, this]);
if (setFocus !== false)
this.oEditor.Focus();
}
else if (this.eventNode.style.display == "block")
{
BX.onCustomEvent(this.eventNode, 'OnAfterShowLHE', [show, this]);
if (setFocus !== false)
this.oEditor.Focus();
}
else
{
BX.adjust(this.eventNode, {style:{display:"block", overflow:"hidden", height:"20px", opacity:0.1}});
(new BX["easing"]({
duration : 200,
start : { opacity : 10, height : 20 },
finish : { opacity: 100, height : div.scrollHeight},
transition : BX["easing"].makeEaseOut(BX.easing.transitions.quad),
step : function(state)
{
div.style.height = state.height + "px";
div.style.opacity = state.opacity / 100;
},
complete : BX.proxy(function()
{
BX.onCustomEvent(div, 'OnAfterShowLHE', [show, this]);
this.oEditor.Focus();
this.eventNode.style.cssText = "";
}, this)
})).animate();
}
}
else
{
BX.onCustomEvent(this.eventNode, 'OnBeforeHideLHE', [show, this]);
this.eventNode.style.display = "none";
BX.onCustomEvent(this.eventNode, 'OnAfterHideLHE', [show, this]);
}
},
OnButtonClick : function(type)
{
if(type !== 'cancel')
{
var res = {result : true};
BX.onCustomEvent(this.eventNode, 'OnClickBeforeSubmit', [this, res]);
if (res["result"] !== false)
BX.onCustomEvent(this.eventNode, 'OnClickSubmit', [this]);
}
else
{
BX.onCustomEvent(this.eventNode, 'OnClickCancel', [this]);
BX.onCustomEvent(this.eventNode, 'OnShowLHE', ['hide']);
}
},
OnEditorInitedBefore : function(editor)
{
var _this = this;
this.oEditor = editor;
editor.formID = this.formID;
if (this.params)
this.params["~height"] = editor.config["height"];
BX.addCustomEvent(editor, 'OnCtrlEnter', function() {
editor.SaveContent();
if (_this.params && _this.params['ctrlEnterHandler'] && typeof window[_this.params['ctrlEnterHandler']] == 'function')
window[_this.params['ctrlEnterHandler']]();
else
BX.submit(BX(_this.formID));
});
var parsers = (this.params.parsers ? this.params.parsers : []);
if (BX.util.object_search('Spoiler', parsers))
{
editor.AddButton({
id : 'spoiler',
name : BX.message('spoilerText'),
iconClassName : 'spoiler',
disabledForTextarea : false,
src : BX.message('MPF_TEMPLATE_FOLDER') + '/images/lhespoiler.png',
toolbarSort : 205,
handler : function()
{
var
_this = this,
res = false;
// Iframe
if (!_this.editor.bbCode || !_this.editor.synchro.IsFocusedOnTextarea())
{
res = _this.editor.action.actions.formatBlock.exec('formatBlock', 'blockquote', 'bx-spoiler', false, {bxTagParams : {tag: "spoiler"}});
}
else // bbcode + textarea
{
res = _this.editor.action.actions.formatBbCode.exec('quote', {tag: 'SPOILER'});
}
return res;
}
});
editor.AddParser({
name : 'spoiler',
obj : {
Parse: function(sName, content, pLEditor)
{
if (/\[(cut|spoiler)(([^\]])*)\]/gi.test(content))
{
content = content.
replace(/[\001-\006]/gi, '').
replace(/\[cut(((?:=)[^\]]*)|)\]/gi, '\001$1\001').
replace(/\[\/cut]/gi, '\002').
replace(/\[spoiler([^\]]*)\]/gi, '\003$1\003').
replace(/\[\/spoiler]/gi, '\004');
var
reg1 = /(?:\001([^\001]*)\001)([^\001-\004]+)\002/gi,
reg2 = /(?:\003([^\003]*)\003)([^\001-\004]+)\004/gi,
__replace_reg = function(title, body){
title = title.replace(/^(="|='|=)/gi, '').replace(/("|')?$/gi, '');
return '<blockquote class="bx-spoiler" id="' + pLEditor.SetBxTag(false, {tag: "spoiler"}) + '" title="' + title + '">' + body + '</blockquote>';
},
func = function(str, title, body){return __replace_reg(title, body);};
while (content.match(reg1) || content.match(reg2))
{
content = content.
replace(reg1, func).
replace(reg2, func);
}
}
content = content.
replace(/\001([^\001]*)\001/gi, '[cut$1]').
replace(/\003([^\003]*)\003/gi, '[spoiler$1]').
replace(/\002/gi, '[/cut]').
replace(/\004/gi, '[/spoiler]');
return content;
},
/**
* @return {string}
*/
UnParse: function(bxTag, oNode)
{
if (bxTag.tag == 'spoiler')
{
var name = '', i;
// Handle childs
for (i = 0; i < oNode.node.childNodes.length; i++)
{
name += editor.bbParser.GetNodeHtml(oNode.node.childNodes[i]);
}
name = BX.util.trim(name);
if (name != '')
return "[SPOILER" + (oNode.node.hasAttribute("title") ? '=' + oNode.node.getAttribute("title") : '')+ "]" + name +"[/SPOILER]";
}
return "";
}
}
});
}
if (BX.util.object_search('MentionUser', parsers))
{
editor.AddParser(
{
name: 'postuser',
obj: {
Parse: function(parserName, content)
{
content = content.replace(/\[USER\s*=\s*(\d+)\]((?:\s|\S)*?)\[\/USER\]/ig,
function(str, id, name)
{
name = BX.util.trim(name);
if (name == '')
return '';
return '<span id="' + editor.SetBxTag(false, {tag: "postuser", params: {value : parseInt(id)}}) + '" class="bxhtmled-metion">' + name + '</span>';
});
return content;
},
/**
* @return {string}
*/
UnParse: function(bxTag, oNode)
{
if (bxTag.tag == 'postuser')
{
var name = '', i;
// Handle childs
for (i = 0; i < oNode.node.childNodes.length; i++)
{
name += editor.bbParser.GetNodeHtml(oNode.node.childNodes[i]);
}
name = BX.util.trim(name);
if (name != '')
return "[USER=" + bxTag.params.value + "]" + name +"[/USER]";
}
return "";
}
}
}
);
}
var funcParse = function(parserName, content) {
return _this.Parse(parserName, content, editor);
},
funcUnparse = function(bxTag, oNode) {
return _this.Unparse(bxTag, oNode/*, editor*/);
};
for (var parser in this.parser)
{
if (this.parser.hasOwnProperty(parser))
{
editor.AddParser({
name: parser,
obj: {
Parse: funcParse,
UnParse: funcUnparse
}
});
}
}
if (this.showPinButton)
{
this.pinEditorPanel = this.params && this.params.pinEditorPanel === true;
var pinId = 'toolbar_pin';
var but = function (editor, wrap)
{
// Call parrent constructor
but.superclass.constructor.apply(this, arguments);
this.id = pinId;
this.title = BX.message('MPF_PIN_EDITOR_PANNEL');
this.className += ' ' + (_this.pinEditorPanel ? 'bxhtmled-button-toolbar-pined' : 'bxhtmled-button-toolbar-pin');
this.Create();
if (wrap)
wrap.appendChild(this.GetCont());
};
BX.extend(but, window.BXHtmlEditor.Button);
but.prototype.OnClick = function ()
{
BX.removeClass(this.pCont, 'bxhtmled-button-toolbar-pined');
BX.removeClass(this.pCont, 'bxhtmled-button-toolbar-pin');
if (_this.pinEditorPanel)
{
_this.pinEditorPanel = false;
BX.addClass(this.pCont, 'bxhtmled-button-toolbar-pin');
}
else
{
_this.pinEditorPanel = true;
BX.addClass(this.pCont, 'bxhtmled-button-toolbar-pined');
}
BX.userOptions.save('main.post.form', 'postEdit', 'pinEditorPanel', _this.pinEditorPanel ? "Y" : "N");
};
window.BXHtmlEditor.Controls[pinId] = but;
BX.addCustomEvent(editor, "GetControlsMap", function (controlsMap)
{
controlsMap.push({
id: pinId, compact: true, hidden: false, sort: 500, checkWidth: true, offsetWidth: 32, wrap: 'right'
});
});
}
},
OnEditorInitedAfter : function(editor)
{
BX.addCustomEvent(editor, "OnIframeDrop", BX.proxy(function(){BX.onCustomEvent(this.eventNode, "OnIframeDrop", arguments);}, this));
BX.addCustomEvent(editor, "OnIframeDragOver", BX.proxy(function(){BX.onCustomEvent(this.eventNode, "OnIframeDragOver", arguments);}, this));
BX.addCustomEvent(editor, "OnIframeDragLeave", BX.proxy(function(){BX.onCustomEvent(this.eventNode, "OnIframeDragLeave", arguments);}, this));
BX.addCustomEvent(editor, "OnImageDataUriHandle", BX.proxy(function(){BX.onCustomEvent(this.eventNode, "OnImageDataUriHandle", arguments);}, this));
BX.addCustomEvent(editor, "OnAfterUrlConvert", this.OnAfterUrlConvert.bind(this));
BX.addCustomEvent(editor, "OnAfterLinkInserted", this.OnAfterUrlConvert.bind(this));
BX.addCustomEvent(editor, "OnBeforeCommandExec", this.OnBeforeCommandExec.bind(this));
// Contextmenu changing for images/files
editor.contextMenu.items['postimage'] =
editor.contextMenu.items['postdocument'] =
editor.contextMenu.items['postfile'] =
[
{
TEXT: BX.message('BXEdDelFromText'),
bbMode: true,
ACTION: function()
{
var node = editor.contextMenu.GetTargetItem('postimage');
if (!node)
node = editor.contextMenu.GetTargetItem('postdocument');
if (!node)
node = editor.contextMenu.GetTargetItem('postfile');
if (node && node.element)
{
editor.selection.RemoveNode(node.element);
}
editor.contextMenu.Hide();
}
}
];
if (!this.params["lazyLoad"])
{
BX.onCustomEvent(this.eventNode, 'OnShowLHE', ["justShow", editor, false])
}
if (editor.toolbar.controls && editor.toolbar.controls.FontSelector)
{
editor.toolbar.controls.FontSelector.SetWidth(45);
}
BX.addCustomEvent(BX(this.formID), 'onAutoSavePrepare', function (ob) {
var _ob=ob;
setTimeout(function() {
BX.addCustomEvent(editor, 'OnContentChanged', BX.proxy(function(text) {
this["mpfTextContent"] = text;
this.Init();
}, _ob));
},1500);
});
BX.addCustomEvent(BX(this.formID), 'onAutoSave', BX.proxy(function(ob, form_data)
{
if (BX.type.isNotEmptyString(ob['mpfTextContent']))
form_data['text' + this.formID] = ob['mpfTextContent'];
}, this));
BX.addCustomEvent(BX(this.formID), 'onAutoSaveRestore', BX.proxy(function(ob, form_data)
{
if (repo.handler[editor.id])
{
for (var ii in repo.handler[editor.id].controllers)
{
if (repo.handler[editor.id].controllers.hasOwnProperty(ii) &&
repo.handler[editor.id].controllers[ii].handler &&
repo.handler[editor.id].controllers[ii].handler.params &&
repo.handler[editor.id].controllers[ii].handler.params.controlName &&
repo.handler[editor.id].controllers[ii].handler.params.controlName)
{
delete form_data[repo.handler[editor.id].controllers[ii].handler.params.controlName];
}
}
}
if (form_data['text' + this.formID] && /[^\s]+/gi.test(form_data['text' + this.formID]))
{
editor.CheckAndReInit(form_data['text' + this.formID]);
}
}, this));
if (BX(this.formID) && BX(this.formID).hasAttribute("bx-lhe-autosave-prepared") && BX(this.formID).BXAUTOSAVE)
{
BX(this.formID).removeAttribute("bx-lhe-autosave-prepared");
setTimeout(BX.proxy(function(){ BX(this.formID).BXAUTOSAVE.Prepare(); }, this), 100);
}
var
formID = this.formID,
settings = this.params;
this.showPanelEditor(settings.showPanelEditor, false);
if (!editor.mainPostFormCustomized)
{
editor.mainPostFormCustomized = true;
BX.addCustomEvent(
editor,
'OnIframeKeydown',
function(e)
{
if (window.onKeyDownHandler)
{
window.onKeyDownHandler(e, editor, formID);
}
}
);
BX.addCustomEvent(
editor,
'OnIframeKeyup',
function(e)
{
if (window.onKeyUpHandler)
{
window.onKeyUpHandler(e, editor, formID);
}
}
);
if (window['BXfpdStopMent' + formID])
{
BX.addCustomEvent(
editor,
'OnIframeClick',
function()
{
window['BXfpdStopMent' + formID]();
}
);
}
// Just to avoid version dependence from fileman
if (editor && editor.textareaView.GetCursorPosition)
{
BX.addCustomEvent(
editor,
'OnTextareaKeyup',
function(e)
{
if (window.onTextareaKeyUpHandler)
{
window.onTextareaKeyUpHandler(e, editor, formID);
}
}
);
BX.addCustomEvent(
editor,
'OnTextareaKeydown',
function(e)
{
if (window.onTextareaKeyDownHandler)
{
window.onTextareaKeyDownHandler(e, editor, formID);
}
}
);
}
}
},
OnAfterUrlConvert: function(url)
{
if(this.urlPreview)
{
this.urlPreview.attachUrlPreview({url: url});
}
},
OnBeforeCommandExec: function(isContentAction, action, oAction, value)
{
if(this.urlPreview && action == 'createLink' && BX.type.isPlainObject(value) && value.hasOwnProperty('href'))
{
this.urlPreview.attachUrlPreview({url: value.href});
}
}
};
LHEPostForm.getEditor = function(editor)
{
return (window["BXHtmlEditor"] ? window["BXHtmlEditor"].Get((typeof editor == "object" ? editor.id : editor)) : null);
};
LHEPostForm.getHandler = function(editor)
{
return repo.handler[(typeof editor == "object" ? editor.id : editor)];
};
LHEPostForm.unsetHandler = function(editor)
{
var editorId = (typeof editor == "object" ? editor.id : editor);
if (!repo.handler[editorId])
return;
if (repo.handler[editorId].oEditor)
repo.handler[editorId].oEditor.Destroy();
// TODO: unregister event handlers here
repo.handler[editorId] = null;
};
LHEPostForm.reinitData = function(editorID, text, data)
{
var handler = LHEPostForm.getHandler(editorID);
if (handler)
handler.exec(handler.reinit, [text, data]);
return false;
};
LHEPostForm.reinitDataBefore = function(editorID)
{
var handler = LHEPostForm.getHandler(editorID);
if (handler && handler["eventNode"])
BX.onCustomEvent(handler.eventNode, "onReinitializeBefore", [handler]);
};
window.LHEPostForm = LHEPostForm;
window.BXPostFormTags = function(formID, buttonID)
{
this.popup = null;
this.formID = formID;
this.buttonID = buttonID;
this.sharpButton = null;
this.addNewLink = null;
this.tagsArea = null;
this.hiddenField = null;
this.popupContent = null;
BX.ready(BX.proxy(this.init, this));
};
window.BXPostFormTags.prototype.init = function()
{
this.sharpButton = BX(this.buttonID);
this.addNewLink = BX("post-tags-add-new-" + this.formID);
this.tagsArea = BX("post-tags-block-" + this.formID);
this.tagsContainer = BX("post-tags-container-" + this.formID);
this.hiddenField = BX("post-tags-hidden-" + this.formID);
this.popupContent = BX("post-tags-popup-content-" + this.formID);
this.popupInput = BX.findChild(this.popupContent, { tag : "input" });
var tags = BX.findChildren(this.tagsContainer, { className : "feed-add-post-del-but" }, true);
for (var i = 0, cnt = tags.length; i < cnt; i++ )
{
BX.bind(tags[i], "click", BX.proxy(this.onTagDelete, {
obj : this,
tagBox : tags[i].parentNode,
tagValue : tags[i].parentNode.getAttribute("data-tag")
}));
}
BX.bind(this.sharpButton, "click", BX.proxy(this.onButtonClick, this));
BX.bind(this.addNewLink, "click", BX.proxy(this.onAddNewClick, this));
};
window.BXPostFormTags.prototype.onTagDelete = function()
{
BX.remove(this.tagBox);
this.obj.hiddenField.value = this.obj.hiddenField.value.replace(this.tagValue + ',', '').replace(' ', ' ');
};
window.BXPostFormTags.prototype.show = function()
{
if (this.popup === null)
{
this.popup = new BX.PopupWindow("bx-post-tag-popup", this.addNewLink, {
content : this.popupContent,
lightShadow : false,
offsetTop: 8,
offsetLeft: 10,
autoHide: true,
angle : true,
closeByEsc: true,
zIndex: -840,
buttons: [
new BX.PopupWindowButton({
text : BX.message("TAG_ADD"),
events : {
click : BX.proxy(this.onTagAdd, this)
}
})
]
});
BX.bind(this.popupInput, "keydown", BX.proxy(this.onKeyPress, this));
BX.bind(this.popupInput, "keyup", BX.proxy(this.onKeyPress, this));
}
this.popup.show();
BX.focus(this.popupInput);
};
window.BXPostFormTags.prototype.addTag = function(tagStr)
{
var tags = BX.type.isNotEmptyString(tagStr) ? tagStr.split(",") : this.popupInput.value.split(",");
var result = [];
for (var i = 0; i < tags.length; i++ )
{
var tag = BX.util.trim(tags[i]);
if(tag.length > 0)
{
var allTags = this.hiddenField.value.split(",");
if(!BX.util.in_array(tag, allTags))
{
var newTagDelete;
var newTag = BX.create("span", {
children : [
(newTagDelete = BX.create("span", { attrs : { "class": "feed-add-post-del-but" }}))
],
attrs : { "class": "feed-add-post-tags" }
});
newTag.insertBefore(document.createTextNode(tag), newTagDelete);
this.tagsContainer.insertBefore(newTag, this.addNewLink);
BX.bind(newTagDelete, "click", BX.proxy(this.onTagDelete, {
obj : this,
tagBox : newTag,
tagValue : tag
}));
this.hiddenField.value += tag + ',';
result.push(tag);
}
}
}
return result;
};
window.BXPostFormTags.prototype.onTagAdd = function()
{
this.addTag();
this.popupInput.value = "";
this.popup.close();
};
window.BXPostFormTags.prototype.onAddNewClick = function(event)
{
event = event || window.event;
this.show();
BX.PreventDefault(event);
};
window.BXPostFormTags.prototype.onButtonClick = function(event)
{
event = event || window.event;
BX.show(this.tagsArea);
this.show();
BX.PreventDefault(event);
};
window.BXPostFormTags.prototype.onKeyPress = function(event)
{
event = event || window.event;
var key = (event.keyCode ? event.keyCode : (event.which ? event.which : null));
if (key == 13)
{
setTimeout(BX.proxy(this.onTagAdd, this), 0);
}
};
window.BXPostFormImportant = function(formID, buttonID, inputName)
{
if (inputName)
{
this.formID = formID;
this.buttonID = buttonID;
this.inputName = inputName;
this.fireButton = null;
this.activeBlock = null;
this.hiddenField = null;
BX.ready(BX.proxy(this.init, this));
}
return false;
};
window.BXPostFormImportant.prototype.init = function()
{
this.fireButton = BX(this.buttonID);
this.activeBlock = BX(this.buttonID + '-active');
var form = BX(this.formID);
if (form)
{
this.hiddenField = form[this.inputName];
if (
this.hiddenField
&& this.hiddenField.value == 1
)
{
this.showActive();
}
}
BX.bind(this.fireButton, "click", BX.proxy(function(event) {
event = event || window.event;
this.showActive();
BX.PreventDefault(event);
}, this));
BX.bind(this.activeBlock, "click", BX.proxy(function(event) {
event = event || window.event;
this.hideActive();
BX.PreventDefault(event);
}, this));
};
window.BXPostFormImportant.prototype.showActive = function(event)
{
BX.hide(this.fireButton);
BX.show(this.activeBlock, 'inline-block');
if (this.hiddenField)
{
this.hiddenField.value = 1;
}
return false;
};
window.BXPostFormImportant.prototype.hideActive = function(event)
{
BX.hide(this.activeBlock);
BX.show(this.fireButton, 'inline-block');
if (this.hiddenField)
{
this.hiddenField.value = 0;
}
return false;
};
var lastWaitElement = null;
window.MPFbuttonShowWait = function(el)
{
if (el && !BX.type.isElementNode(el))
el = null;
el = el || this;
el = (el ? (el.tagName == "A" ? el : el.parentNode) : el);
if (el)
{
BX.addClass(el, "ui-btn-clock");
lastWaitElement = el;
BX.defer(function(){el.disabled = true})();
}
};
window.MPFbuttonCloseWait = function(el)
{
if (el && !BX.type.isElementNode(el))
el = null;
el = el || lastWaitElement || this;
if (el)
{
el.disabled = false ;
BX.removeClass(el, 'ui-btn-clock');
lastWaitElement = null;
}
};
window.__mpf_wd_getinfofromnode = function(result, obj)
{
var preview = BX.findChild(BX((result["prefixNode"] || 'wd-doc') + result.element_id), {'className': 'files-preview', 'tagName' : 'IMG'}, true, false);
if (preview)
{
result.lowsrc = preview.src;
result.element_url = preview.src.replace(/\Wwidth=(\d+)/, '').replace(/\Wheight\=(\d+)/, '');
result.width = parseInt(preview.getAttribute("data-bx-full-width"));
result.height = parseInt(preview.getAttribute("data-bx-full-height"));
}
else if (obj.urlGet)
{
result.element_url = obj.urlGet.
replace("#element_id#", result.element_id).
replace("#ELEMENT_ID#", result.element_id).
replace("#element_name#", result.element_name).
replace("#ELEMENT_NAME#", result.element_name);
}
};
var MPFMention = {
listen: false,
plus : false,
text : '',
bSearch: false,
node: null,
mode: null
};
window.onKeyDownHandler = function(e, editor, formID)
{
var keyCode = e.keyCode;
if (!window['BXfpdStopMent' + formID])
return true;
var selectorId = window.MPFgetSelectorId('bx-mention-' + formID + '-id');
if (keyCode === editor.KEY_CODES['backspace'])
{
var mentText = BX.util.trim(editor.util.GetTextContent(MPFMention.node));
if (
mentText === '+'
|| mentText === '@'
|| (
MPFMention.mode == 'button'
&& mentText.length == 1
)
)
{
window['BXfpdStopMent' + formID]();
}
}
if (
BX.util.in_array(keyCode, [107, 187])
|| (
(e.shiftKey || e.modifiers > 3)
&& BX.util.in_array(keyCode, [50, 43, 61])
)
|| (
e.altKey
&& BX.util.in_array(keyCode, [76])
) /* German @ == Alt + L*/
|| (
typeof e.getModifierState === 'function'
&& !!e.getModifierState('AltGraph')
&& BX.util.in_array(keyCode, [81])
) /* German @ == AltGr + Q*/
)
{
setTimeout(function()
{
var
range = editor.selection.GetRange(),
doc = editor.GetIframeDoc(),
txt = (range ? range.endContainer.textContent : ''),
determiner = (txt ? txt.slice(range.endOffset - 1, range.endOffset) : ''),
prevS = (txt ? txt.slice(range.endOffset - 2, range.endOffset-1) : '');
if (
(determiner == "@" || determiner == "+")
&& (
!prevS
|| BX.util.in_array(prevS, ["+", "@", ",", "("])
|| (
prevS.length == 1
&& BX.util.trim(prevS) === ""
)
)
)
{
MPFMention.listen = true;
MPFMention.listenFlag = true;
MPFMention.text = '';
MPFMention.leaveContent = true;
MPFMention.mode = 'plus';
range.setStart(range.endContainer, range.endOffset - 1);
range.setEnd(range.endContainer, range.endOffset);
editor.selection.SetSelection(range);
MPFMention.node = BX.create("SPAN", {props: {id: "bx-mention-node"}}, doc);
editor.selection.Surround(MPFMention.node, range);
range.setStart(MPFMention.node, 1);
range.setEnd(MPFMention.node, 1);
editor.selection.SetSelection(range);
if (BX.type.isNotEmptyString(selectorId))
{
BX.onCustomEvent(window, 'BX.MPF.MentionSelector:open', [{
id: selectorId,
bindPosition: getMentionNodePosition(MPFMention.node, editor)
}]);
}
}
}, 10);
}
if(MPFMention.listen)
{
var selectorInstance = null;
if (BX.type.isNotEmptyString(selectorId))
{
selectorInstance = BX.UI.SelectorManager.instances[selectorId];
}
var navigationResult = false;
if (selectorInstance)
{
navigationResult = selectorInstance.getNavigationInstance().checkKeyboardNavigation({
keyCode: keyCode,
tab: (
MPFMention.bSearch
? 'search'
: (selectorInstance ? selectorInstance.tabs.selected : false)
)
});
}
if (navigationResult)
{
editor.iframeKeyDownPreventDefault = true;
e.stopPropagation();
e.preventDefault();
}
}
if (!MPFMention.listen && MPFMention.listenFlag && keyCode === editor.KEY_CODES["enter"])
{
var range = editor.selection.GetRange();
if (range.collapsed)
{
var
node = range.endContainer,
doc = editor.GetIframeDoc();
if (node)
{
if (node.className !== 'bxhtmled-metion')
{
node = BX.findParent(node, function(n)
{
return n.className == 'bxhtmled-metion';
}, doc.body);
}
if (node && node.className == 'bxhtmled-metion')
{
editor.selection.SetAfter(node);
}
}
}
}
};
window.onKeyUpHandler = function(e, editor, formID)
{
var
keyCode = e.keyCode,
range, mentText;
if (!window['BXfpdStopMent' + formID])
return true;
if(MPFMention.listen === true)
{
if(keyCode == editor.KEY_CODES["escape"]) //ESC
{
window['BXfpdStopMent' + formID]();
}
else if(
keyCode !== editor.KEY_CODES["enter"]
&& keyCode !== editor.KEY_CODES["left"]
&& keyCode !== editor.KEY_CODES["right"]
&& keyCode !== editor.KEY_CODES["up"]
&& keyCode !== editor.KEY_CODES["down"]
)
{
if (BX(MPFMention.node))
{
mentText = BX.util.trim(editor.util.GetTextContent(MPFMention.node));
var mentTextOrig = mentText;
mentText = mentText.replace(/^[\+@]*/, '');
MPFMention.bSearch = (mentText.length > 0);
var selectorId = window.MPFgetSelectorId('bx-mention-' + formID + '-id');
if (BX.type.isNotEmptyString(selectorId))
{
var selectorInstance = BX.UI.SelectorManager.instances[selectorId];
if (BX.type.isNotEmptyObject(selectorInstance))
{
selectorInstance.getSearchInstance().runSearch({
text: mentText
});
}
}
if (MPFMention.leaveContent && MPFMention._lastText && mentTextOrig === '')
{
window['BXfpdStopMent' + formID]();
}
else if (MPFMention.leaveContent && MPFMention.lastText && mentTextOrig !== '' && mentText === '')
{
MPFMention.bSearch = false;
window['BXfpdStopMent' + formID]();
if (BX.type.isNotEmptyString(selectorId))
{
BX.onCustomEvent(window, 'BX.MPF.MentionSelector:open', [{
id: selectorId,
bindPosition: getMentionNodePosition(MPFMention.node, editor)
}]);
}
}
MPFMention.lastText = mentText;
MPFMention._lastText = mentTextOrig;
}
else
{
window['BXfpdStopMent' + formID]();
}
}
}
else
{
if (
!e.shiftKey &&
(keyCode === editor.KEY_CODES["space"] ||
keyCode === editor.KEY_CODES["escape"] ||
keyCode === 188 ||
keyCode === 190
))
{
range = editor.selection.GetRange();
if (range.collapsed)
{
var
node = range.endContainer,
doc = editor.GetIframeDoc();
if (node)
{
if (node.className !== 'bxhtmled-metion')
{
node = BX.findParent(node, function(n)
{
return n.className == 'bxhtmled-metion';
}, doc.body);
}
if (node && node.className == 'bxhtmled-metion')
{
mentText = editor.util.GetTextContent(node);
var matchSep = mentText.match(/[\s\.\,]$/);
if (matchSep || keyCode === editor.KEY_CODES["escape"])
{
node.innerHTML = mentText.replace(/[\s\.\,]$/, '');
var sepNode = BX.create('SPAN', {html: matchSep || editor.INVISIBLE_SPACE}, doc);
editor.util.InsertAfter(sepNode, node);
editor.selection.SetAfter(sepNode);
}
}
}
}
}
}
};
window.onTextareaKeyDownHandler = function(e, editor, formID)
{
var keyCode = e.keyCode;
if(MPFMention.listen && keyCode == editor.KEY_CODES["enter"])
{
var selectorId = window.MPFgetSelectorId('bx-mention-' + formID + '-id');
if (BX.type.isNotEmptyString(selectorId))
{
var selectorInstance = BX.UI.SelectorManager.instances[selectorId];
if (BX.type.isNotEmptyObject(selectorInstance))
{
selectorInstance.getNavigationInstance().selectFirstItem({
tab: (MPFMention.bSearch ? 'search' : selectorInstance.tabs.selected)
});
}
}
editor.textareaKeyDownPreventDefault = true;
e.stopPropagation();
e.preventDefault();
}
};
window.onTextareaKeyUpHandler = function(e, editor, formID)
{
var
cursor, value,
keyCode = e.keyCode;
var selectorId = window.MPFgetSelectorId('bx-mention-' + formID + '-id');
if(MPFMention.listen === true)
{
if(keyCode == 27) //ESC
{
window['BXfpdStopMent' + formID]();
}
else if(keyCode !== 13)
{
value = editor.textareaView.GetValue(false);
cursor = editor.textareaView.GetCursorPosition();
if (value.indexOf('+') !== -1 || value.indexOf('@') !== -1)
{
var
valueBefore = value.substr(0, cursor),
charPos = Math.max(valueBefore.lastIndexOf('+'), valueBefore.lastIndexOf('@'));
if (charPos >= 0)
{
var
mentText = valueBefore.substr(charPos),
mentTextOrig = mentText;
mentText = mentText.replace(/^[\+@]*/, '');
MPFMention.bSearch = (mentText.length > 0);
var selectorInstance = null;
if (BX.type.isNotEmptyString(selectorId))
{
selectorInstance = BX.UI.SelectorManager.instances[selectorId];
}
if (BX.type.isNotEmptyObject(selectorInstance))
{
selectorInstance.getSearchInstance().runSearch({
text: mentText
});
}
if (
MPFMention.leaveContent
&& MPFMention._lastText
&& (
mentTextOrig === ''
|| mentText === ''
)
)
{
window['BXfpdStopMent' + formID]();
}
MPFMention.lastText = mentText;
MPFMention._lastText = mentTextOrig;
}
}
}
}
else
{
if (keyCode == 16)
{
var _this = this;
this.shiftPressed = true;
if (this.shiftTimeout)
this.shiftTimeout = clearTimeout(this.shiftTimeout);
this.shiftTimeout = setTimeout(function()
{
_this.shiftPressed = false;
}, 100);
}
if (keyCode == 107 || (e.shiftKey || e.modifiers > 3 || this.shiftPressed) &&
BX.util.in_array(keyCode, [187, 50, 107, 43, 61]))
{
cursor = editor.textareaView.element.selectionStart;
if (cursor > 0)
{
value = editor.textareaView.element.value;
var
lastChar = value.substr(cursor - 1, 1);
if (lastChar && (lastChar === '+' || lastChar === '@'))
{
MPFMention.listen = true;
MPFMention.listenFlag = true;
MPFMention.text = '';
MPFMention.textarea = true;
MPFMention.bSearch = false;
MPFMention.mode = 'plus';
if (BX.type.isNotEmptyString(selectorId))
{
BX.onCustomEvent(window, 'BX.MPF.MentionSelector:open', [{
id: selectorId
}]);
}
}
}
}
}
};
var getMentionNodePosition = function(mention, editor)
{
var
mentPos = BX.pos(mention),
editorPos = BX.pos(editor.dom.areaCont),
editorDocScroll = BX.GetWindowScrollPos(editor.GetIframeDoc()),
top = editorPos.top + mentPos.bottom - editorDocScroll.scrollTop + 2,
left = editorPos.left + mentPos.right - editorDocScroll.scrollLeft;
return {top: top, left: left};
};
window.BxInsertMention = function (params)
{
var
item = params.item,
type = params.type,
formID = params.formID,
editorId = params.editorId,
bNeedComa = params.bNeedComa,
editor = LHEPostForm.getEditor(editorId),
spaceNode;
if(type == 'users' && item && item.entityId > 0 && editor)
{
if(editor.GetViewMode() == 'wysiwyg') // WYSIWYG
{
var
doc = editor.GetIframeDoc(),
range = editor.selection.GetRange(),
mention = BX.create('SPAN',
{
props: {className: 'bxhtmled-metion'},
text: BX.util.htmlspecialcharsback(item.name)
}, doc);
// - for chrome
spaceNode = BX.create('SPAN', {html: (bNeedComa ? ', ' : ' ')}, doc);
editor.SetBxTag(mention, {tag: "postuser", params: {value : item.entityId}});
if (BX(MPFMention.node))
{
editor.util.ReplaceNode(MPFMention.node, mention);
}
else
{
editor.selection.InsertNode(mention, range);
}
if (mention && mention.parentNode)
{
var parentMention = BX.findParent(mention, {className: 'bxhtmled-metion'}, doc.body);
if (parentMention)
{
editor.util.InsertAfter(mention, parentMention);
}
}
if (mention && mention.parentNode)
{
editor.util.InsertAfter(spaceNode, mention);
editor.selection.SetAfter(spaceNode);
}
}
else if (editor.GetViewMode() == 'code' && editor.bbCode) // BB Codes
{
editor.textareaView.Focus();
var
value = editor.textareaView.GetValue(false),
cursor = editor.textareaView.GetCursorPosition(),
valueBefore = value.substr(0, cursor),
charPos = Math.max(valueBefore.lastIndexOf('+'), valueBefore.lastIndexOf('@'));
if (charPos >= 0 && cursor > charPos)
{
editor.textareaView.SetValue(value.substr(0, charPos) + value.substr(cursor));
editor.textareaView.element.setSelectionRange(charPos, charPos);
}
editor.textareaView.WrapWith(false, false, "[USER=" + item.entityId + "]" + item.name + "[/USER]" + (bNeedComa ? ', ' : ' '));
}
if (params.fireAddEvent === true)
{
BX.onCustomEvent(window, 'onMentionAdd', [ item ]);
}
var selectorId = window.MPFgetSelectorId('bx-mention-' + formID + '-id');
if (BX.type.isNotEmptyString(selectorId))
{
var selectorInstance = BX.UI.SelectorManager.instances[selectorId];
if (BX.type.isNotEmptyObject(selectorInstance))
{
if (typeof selectorInstance.itemsSelected[item.id] != 'undefined')
{
delete selectorInstance.itemsSelected[item.id];
}
}
}
window['BXfpdStopMent' + formID]();
MPFMention["text"] = '';
if(editor.GetViewMode() == 'wysiwyg') // WYSIWYG
{
editor.Focus();
editor.selection.SetAfter(spaceNode);
}
}
};
window.MPFgetSelectorId = function(formId)
{
var result = false;
var formNode = BX(formId);
if (!formNode)
{
return result;
}
result = formNode.getAttribute('data-bx-selector-id');
return result;
};
window.MPFMentionInit = function(formId, params)
{
if (params.initDestination === true)
{
BX.addCustomEvent('onAutoSaveRestoreDestination', function(params) {
if (
BX.type.isNotEmptyObject(params)
&& BX.type.isNotEmptyObject(params.data)
&& BX.type.isNotEmptyObject(params.data['DEST_CODES[]'])
&& BX.type.isNotEmptyString(params.formId)
&& params.formId == formId
&& BX.UI.SelectorManager
)
{
var selectorId = window.MPFgetSelectorId(params.formId);
var selectorInstance = BX.UI.SelectorManager.instances[selectorId];
if (!BX.type.isNotEmptyObject(selectorInstance))
{
return;
}
var
val = null,
email = null,
selectedItems = {},
invitedUsers = [],
found = false;
for (var i = 0; i < params.data['DEST_CODES[]'].length; i++)
{
val = params.data['DEST_CODES[]'][i];
if (val == 'UA')
{
selectedItems[val] = 'groups';
}
found = val.match(/^U(\d+)$/i);
if (found)
{
selectedItems[val] = 'users';
continue;
}
found = val.match(/^SG(\d+)$/i);
if (found)
{
selectedItems[val] = 'sonetgroups';
continue;
}
found = val.match(/^DR(\d+)$/i);
if (found)
{
selectedItems[val] = 'departments';
continue
}
found = val.match(/^UE(.+)$/i);
if (
found
&& BX.SocialnetworkUISelector
)
{
email = found[1];
invitedUsers.push({
selectorId: selectorId,
name: (BX.type.isNotEmptyString(params.data['INVITED_USER_NAME[' + email + ']']) ? params.data['INVITED_USER_NAME[' + email + ']'] : ''),
lastName: (BX.type.isNotEmptyString(params.data['INVITED_USER_LAST_NAME[' + email + ']']) ? params.data['INVITED_USER_LAST_NAME[' + email + ']'] : ''),
email: email,
createCrmContact: (BX.type.isNotEmptyString(params.data['INVITED_USER_CREATE_CRM_CONTACT[' + email + ']']) ? params.data['INVITED_USER_CREATE_CRM_CONTACT[' + email + ']'] : '')
});
}
}
selectorInstance.itemsSelected = selectedItems;
BX.addCustomEvent(window, 'BX.Main.SelectorV2:afterInitDialog', function(params) {
if (
params.id == selectorId
&& BX.SocialnetworkUISelector
)
{
for (var i = 0; i < invitedUsers.length; i++)
{
BX.SocialnetworkUISelector.inviteEmailAddUser(invitedUsers[i]);
}
}
});
}
});
BX.addCustomEvent(window, "onMentionAdd", function(item) {
var selectorId = window.MPFgetSelectorId(formId);
var selectorInstance = BX.UI.SelectorManager.instances[selectorId];
if (!BX.type.isNotEmptyObject(selectorInstance))
{
return;
}
var componentSelector = BX.Main.selectorManagerV2.getById(selectorInstance.id);
if (
BX.type.isNotEmptyObject(componentSelector)
&& BX.type.isBoolean(componentSelector.initialized)
)
{
if (componentSelector.initialized)
{
if (!BX.type.isNotEmptyObject(selectorInstance.entities.USERS.items[item.id]))
{
selectorInstance.entities.USERS.items[item.id] = item;
}
selectorInstance.setOption('focusInputOnSelectItem', 'N');
if (!BX.type.isNotEmptyString(selectorInstance.itemsSelected[item.id]))
{
selectorInstance.selectItem({
itemId: item.id,
entityType: 'USERS'
});
}
}
else
{
selectorInstance.itemsSelected[item.id] = 'users';
componentSelector.initDialog();
}
}
});
}
window["BXfpdSelectCallbackMent" + formId] = function(callbackParams) // item, type, search
{
window.BxInsertMention({
item: callbackParams.item,
type: callbackParams.entityType.toLowerCase(),
formID: formId,
editorId: params.editorId,
fireAddEvent: params.initDestination
});
};
window["BXfpdStopMent" + formId] = function ()
{
var selectorId = window.MPFgetSelectorId('bx-mention-' + formId + '-id');
if (BX.type.isNotEmptyString(selectorId))
{
var selectorInstance = BX.UI.SelectorManager.instances[selectorId];
if (BX.type.isNotEmptyObject(selectorInstance))
{
selectorInstance.closeAllPopups();
selectorInstance.getSearchInstance().abortSearchRequest();
}
}
};
BX.ready(function() {
var ment = BX('bx-b-mention-' + formId);
var selectorId = window.MPFgetSelectorId('bx-mention-' + formId + '-id');
if (selectorId)
{
BX.onCustomEvent(window, 'BX.MPF.MentionSelector:init', [{
id: selectorId,
openDialogWhenInit: false
}]);
}
BX.bind(
ment,
"mousedown",
function(e)
{
if(MPFMention.listen !== true)
{
var
editor = LHEPostForm.getEditor(params.editorId),
doc = editor.GetIframeDoc();
if(editor.GetViewMode() == 'wysiwyg' && doc)
{
MPFMention.listen = true;
MPFMention.listenFlag = true;
MPFMention.text = '';
MPFMention.leaveContent = false;
MPFMention.mode = 'button';
var
range = editor.selection.GetRange();
if (BX(MPFMention.node))
{
BX.remove(BX(MPFMention.node));
}
editor.InsertHtml('<span id="bx-mention-node">' + editor.INVISIBLE_SPACE + '</span>', range);
setTimeout(function()
{
if (selectorId)
{
BX.onCustomEvent(window, 'BX.MPF.MentionSelector:open', [{
id: selectorId,
bindNode: ment
}]);
}
MPFMention.node = doc.getElementById('bx-mention-node');
if (MPFMention.node)
{
range.setStart(MPFMention.node, 0);
if (
MPFMention.node.firstChild
&& MPFMention.node.firstChild.nodeType == 3
&& MPFMention.node.firstChild.nodeValue.length > 0
)
{
range.setEnd(MPFMention.node, 1);
}
else
{
range.setEnd(MPFMention.node, 0);
}
editor.selection.SetSelection(range);
}
editor.Focus();
}, 100);
}
else if (editor.GetViewMode() == 'code')
{
MPFMention.listen = true;
MPFMention.listenFlag = true;
MPFMention.text = '';
MPFMention.leaveContent = false;
MPFMention.mode = 'button';
// TODO: get current cusrsor position
setTimeout(function()
{
if (selectorId)
{
BX.onCustomEvent(window, 'BX.MPF.MentionSelector:open', [{
id: selectorId,
bindNode: ment
}]);
}
}, 100);
}
BX.onCustomEvent(ment, 'mentionClick');
}
}
);
}
);
};
window.BXfpdOnDialogOpen = function ()
{
MPFMention.listen = true;
MPFMention.listenFlag = true;
};
window.BXfpdOnDialogClose = function (params)
{
MPFMention.listen = false;
setTimeout(function()
{
MPFMention.listenFlag = false;
if (!MPFMention.listen)
{
var editor = LHEPostForm.getEditor(params.editorId);
if(editor)
{
var
doc = editor.GetIframeDoc();
if (BX(MPFMention.node))
{
editor.selection.SetAfter(MPFMention.node);
if (MPFMention.leaveContent)
{
editor.util.ReplaceWithOwnChildren(MPFMention.node);
}
else
{
BX.remove(BX(MPFMention.node));
}
}
editor.Focus();
}
}
}, 100);
};
})();