/* 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>|&nbsp;)*$/,'');};$.fn.wysiwyg=function(userOptions){var editor=this,selectedRange,options,toolbarBtnSelector,updateToolbar=function(){if(options.activeToolbarClass){$(options.toolbarSelector).find(toolbarBtnSelector).each(function(){var command=$(this).data(options.commandRole);if(document.queryCommandState(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||'');document.execCommand(command,0,args);updateToolbar();},bindHotkeys=function(hotKeys){$.each(hotKeys,function(hotkey,command){editor.keydown(hotkey,function(e){if(editor.attr('contenteditable')&&editor.is(':visible')){e.preventDefault();e.stopPropagation();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;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);}});};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();}});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'},toolbarSelector:'[data-role=editor-toolbar]',commandRole:'edit',activeToolbarClass:'btn-primary',selectionMarker:'edit-focus-marker',selectionColor:'darkgrey',dragAndDropImages:true,fileUploadError:function(reason,detail){console.log("File upload error",reason,detail);}};}(window.jQuery));