| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292 | /* http://github.com/mindmup/bootstrap-wysiwyg *//*global jQuery, $, FileReader*//*jslint browser:true*/(function ($) {	'use strict';	var readFileIntoDataUrl = function (fileInfo) {		var loader = $.Deferred(),			fReader = new FileReader();		fReader.onload = function (e) {			loader.resolve(e.target.result);		};		fReader.onerror = loader.reject;		fReader.onprogress = loader.notify;		fReader.readAsDataURL(fileInfo);		return loader.promise();	};	$.fn.cleanHtml = function () {		var html = $(this).html();		return html && html.replace(/(<br>|\s|<div><br><\/div>| )*$/, '');	};	$.fn.wysiwyg = function (userOptions) {		var editor = this,			selectedRange,			options,			toolbarBtnSelector,			updateToolbar = function () {				if (options.activeToolbarClass) {					var selection = window.getSelection();					try {                        var tag = 'formatBlock ' + selection.focusNode.parentNode.nodeName.toLowerCase();                    }catch (e){						console.log(e);						tag = '';					}					$(options.toolbarSelector).find(toolbarBtnSelector).each(function () {						var command = $(this).data(options.commandRole);						if (document.queryCommandState(command) || tag === command) {							$(this).addClass(options.activeToolbarClass);						} else {							$(this).removeClass(options.activeToolbarClass);						}					});				}			},			execCommand = function (commandWithArgs, valueArg) {				var commandArr = commandWithArgs.split(' '),					command = commandArr.shift(),					args = commandArr.join(' ') + (valueArg || '');				if(command === 'formatBlock'){                    var selection = window.getSelection();                    if(selection.focusNode.parentNode.nodeName.toLowerCase() === args){                    	args = '<p>';					}else{                        args = '<' + args + '>';					}				}else if(command === 'enterAction'){				}				document.execCommand(command, 0, args);				updateToolbar();                editor.change && editor.change();			},            insertEmpty = function ($selectionElem) {				insertHtml('\r\n');         		return true;        	},			codeHandler = function () {                var selection = window.getSelection();                try{                    var nodeName = selection.parentNode.nodeName;                    console.log(nodeName)                    if(nodeName !== 'CODE' && nodeName !== 'PRE'){                    }                    if (!document.queryCommandSupported('insertHTML')) {                    }                }catch (e){                    console.log(e)                }            },            enterKeyHandle = function (e) {                var selection = getCurrentRange();                try {                    var nodeName = selection.commonAncestorContainer.parentNode.nodeName;                    if(nodeName === 'CODE' || nodeName === 'PRE'){                        return insertEmpty(selection.parentNode);                    }else if(nodeName === "DIV" || nodeName === "P"){                    	return insertHtml('<br/>');					}					console.log(nodeName);                }catch (e){                	console.log(selection)                	console.log("enterKeyHandle:" + e);				}            },			bindHotkeys = function (hotKeys) {				$.each(hotKeys, function (hotkey, command) {					editor.keydown(hotkey, function (e) {						if (editor.attr('contenteditable') && editor.is(':visible')) {							e.preventDefault();							e.stopPropagation();							if(hotkey === 'return'){								return enterKeyHandle(e);							}							execCommand(command);						}					}).keyup(hotkey, function (e) {						if (editor.attr('contenteditable') && editor.is(':visible')) {							e.preventDefault();							e.stopPropagation();						}					});				});			},			getCurrentRange = function () {				var sel = window.getSelection();				if (sel.getRangeAt && sel.rangeCount) {					return sel.getRangeAt(0);				}			},			saveSelection = function () {				selectedRange = getCurrentRange();			},			restoreSelection = function () {				var selection = window.getSelection();				if (selectedRange) {					try {						selection.removeAllRanges();					} catch (ex) {						document.body.createTextRange().select();						document.selection.empty();					}					selection.addRange(selectedRange);				}			},			insertFiles = function (files) {				editor.focus();				$.each(files, function (idx, fileInfo) {					if (/^image\//.test(fileInfo.type)) {						$.when(readFileIntoDataUrl(fileInfo)).done(function (dataUrl) {							execCommand('insertimage', dataUrl);						}).fail(function (e) {							options.fileUploadError("file-reader", e);						});					} else {						options.fileUploadError("unsupported-file-type", fileInfo.type);					}				});			},			markSelection = function (input, color) {				restoreSelection();				if (document.queryCommandSupported('hiliteColor')) {					document.execCommand('hiliteColor', 0, color || 'transparent');				}				saveSelection();				input.data(options.selectionMarker, color);			},			bindToolbar = function (toolbar, options) {				toolbar.find(toolbarBtnSelector).click(function () {					restoreSelection();					editor.focus();					execCommand($(this).data(options.commandRole));					saveSelection();				});				toolbar.find('[data-toggle=dropdown]').click(restoreSelection);				toolbar.find('input[type=text][data-' + options.commandRole + ']').on('webkitspeechchange change', function () {					var newValue = this.value; /* ugly but prevents fake double-calls due to selection restoration */					this.value = '';					restoreSelection();					if (newValue) {						editor.focus();						execCommand($(this).data(options.commandRole), newValue);					}					saveSelection();				}).on('focus', function () {					var input = $(this);					if (!input.data(options.selectionMarker)) {						markSelection(input, options.selectionColor);						input.focus();					}				}).on('blur', function () {					var input = $(this);					if (input.data(options.selectionMarker)) {						markSelection(input, false);					}				});				toolbar.find('input[type=file][data-' + options.commandRole + ']').change(function () {					restoreSelection();					if (this.type === 'file' && this.files && this.files.length > 0) {						insertFiles(this.files);					}					saveSelection();					this.value = '';				});			},			initFileDrops = function () {				editor.on('dragenter dragover', false)					.on('drop', function (e) {						var dataTransfer = e.originalEvent.dataTransfer;						e.stopPropagation();						e.preventDefault();						if (dataTransfer && dataTransfer.files && dataTransfer.files.length > 0) {							insertFiles(dataTransfer.files);						}					});			},			insertHtml = function (html) {                if(!document.queryCommandSupported('insertHTML')){                    var range = window.getSelection().getRangeAt(0);                    if (range.insertNode) {                        // IE                        range.deleteContents();                        range.insertNode($(args)[0]);                        updateToolbar();                        editor.change && editor.change();                    } else if (range.pasteHTML) {                        // IE <= 10                        range.pasteHTML(args);                        updateToolbar();                        editor.change && editor.change();                    }                }else{                    console.log(html)                	execCommand('insertHTML',html);				}            };		options = $.extend({}, $.fn.wysiwyg.defaults, userOptions);		toolbarBtnSelector = 'a[data-' + options.commandRole + '],button[data-' + options.commandRole + '],input[type=button][data-' + options.commandRole + ']';		bindHotkeys(options.hotKeys);		if (options.dragAndDropImages) {			initFileDrops();		}		bindToolbar($(options.toolbarSelector), options);		editor.attr('contenteditable', true)			.on('mouseup keyup mouseout', function () {				saveSelection();				updateToolbar();			});		$(window).bind('touchend', function (e) {			var isInside = (editor.is(e.target) || editor.has(e.target).length > 0),				currentRange = getCurrentRange(),				clear = currentRange && (currentRange.startContainer === currentRange.endContainer && currentRange.startOffset === currentRange.endOffset);			if (!clear || isInside) {				saveSelection();				updateToolbar();			}		});		this.insertLink = function (linkUrl,linkTitle) {            restoreSelection();            editor.focus();            var args = '<a href="'+linkUrl+'" target="_blank">'+linkTitle+'</a>';            insertHtml(args);            saveSelection();        };		this.insertHtml = insertHtml;		return this;	};	$.fn.wysiwyg.defaults = {		hotKeys: {			'ctrl+b meta+b': 'bold',			'ctrl+i meta+i': 'italic',			'ctrl+u meta+u': 'underline',			'ctrl+z meta+z': 'undo',			'ctrl+y meta+y meta+shift+z': 'redo',			'ctrl+l meta+l': 'justifyleft',			'ctrl+r meta+r': 'justifyright',			'ctrl+e meta+e': 'justifycenter',			'ctrl+j meta+j': 'justifyfull',			'shift+tab': 'outdent',			'tab': 'indent',            'return':'enterAction'		},		toolbarSelector: '[data-role=editor-toolbar]',		commandRole: 'edit',		activeToolbarClass: 'btn-info',		selectionMarker: 'edit-focus-marker',		selectionColor: 'darkgrey',		dragAndDropImages: true,		fileUploadError: function (reason, detail) { console.log("File upload error", reason, detail); }	};}(window.jQuery));
 |