| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350 | /* jshint expr: true */!(function($, wysi) {  'use strict';  var templates = function(key, locale, options) {    return wysi.tpl[key]({locale: locale, options: options});  };  var Wysihtml5 = function(el, options) {    this.el = el;    var toolbarOpts = options || defaultOptions;    for(var t in toolbarOpts.customTemplates) {      wysi.tpl[t] = toolbarOpts.customTemplates[t];    }    this.toolbar = this.createToolbar(el, toolbarOpts);    this.editor =  this.createEditor(options);    window.editor = this.editor;    $('iframe.wysihtml5-sandbox').each(function(i, el){      $(el.contentWindow).off('focus.wysihtml5').on({        'focus.wysihtml5' : function(){          $('li.dropdown').removeClass('open');        }      });    });  };  Wysihtml5.prototype = {    constructor: Wysihtml5,    createEditor: function(options) {      options = options || {};      // Add the toolbar to a clone of the options object so multiple instances      // of the WYISYWG don't break because 'toolbar' is already defined      options = $.extend(true, {}, options);      options.toolbar = this.toolbar[0];      var editor = new wysi.Editor(this.el[0], options);      if(options && options.events) {        for(var eventName in options.events) {          editor.on(eventName, options.events[eventName]);        }      }      return editor;    },    createToolbar: function(el, options) {      var self = this;      var toolbar = $('<ul/>', {        'class' : 'wysihtml5-toolbar',        'style': 'display:none'      });      var culture = options.locale || defaultOptions.locale || 'en';      for(var key in defaultOptions) {        var value = false;        if(options[key] !== undefined) {          if(options[key] === true) {            value = true;          }        } else {          value = defaultOptions[key];        }        if(value === true) {          toolbar.append(templates(key, locale[culture], options));          if(key === 'html') {            this.initHtml(toolbar);          }          if(key === 'link') {            this.initInsertLink(toolbar);          }          if(key === 'image') {            this.initInsertImage(toolbar);          }        }      }      if(options.toolbar) {        for(key in options.toolbar) {          toolbar.append(options.toolbar[key]);        }      }      toolbar.find('a[data-wysihtml5-command="formatBlock"]').click(function(e) {        var target = e.target || e.srcElement;        var el = $(target);        self.toolbar.find('.current-font').text(el.html());      });      toolbar.find('a[data-wysihtml5-command="foreColor"]').click(function(e) {        var target = e.target || e.srcElement;        var el = $(target);        self.toolbar.find('.current-color').text(el.html());      });      this.el.before(toolbar);      return toolbar;    },    initHtml: function(toolbar) {      var changeViewSelector = 'a[data-wysihtml5-action="change_view"]';      toolbar.find(changeViewSelector).click(function(e) {        toolbar.find('a.btn').not(changeViewSelector).toggleClass('disabled');      });    },    initInsertImage: function(toolbar) {      var self = this;      var insertImageModal = toolbar.find('.bootstrap-wysihtml5-insert-image-modal');      var urlInput = insertImageModal.find('.bootstrap-wysihtml5-insert-image-url');      var insertButton = insertImageModal.find('a.btn-primary');      var initialValue = urlInput.val();      var caretBookmark;      var insertImage = function() {        var url = urlInput.val();        urlInput.val(initialValue);        self.editor.currentView.element.focus();        if (caretBookmark) {          self.editor.composer.selection.setBookmark(caretBookmark);          caretBookmark = null;        }        self.editor.composer.commands.exec('insertImage', url);      };      urlInput.keypress(function(e) {        if(e.which == 13) {          insertImage();          insertImageModal.modal('hide');        }      });      insertButton.click(insertImage);      insertImageModal.on('shown', function() {        urlInput.focus();      });      insertImageModal.on('hide', function() {        self.editor.currentView.element.focus();      });      toolbar.find('a[data-wysihtml5-command=insertImage]').click(function() {        var activeButton = $(this).hasClass('wysihtml5-command-active');        if (!activeButton) {          self.editor.currentView.element.focus(false);          caretBookmark = self.editor.composer.selection.getBookmark();          insertImageModal.appendTo('body').modal('show');          insertImageModal.on('click.dismiss.modal', '[data-dismiss="modal"]', function(e) {            e.stopPropagation();          });          return false;        }        else {          return true;        }      });    },    initInsertLink: function(toolbar) {      var self = this;      var insertLinkModal = toolbar.find('.bootstrap-wysihtml5-insert-link-modal');      var urlInput = insertLinkModal.find('.bootstrap-wysihtml5-insert-link-url');      var targetInput = insertLinkModal.find('.bootstrap-wysihtml5-insert-link-target');      var insertButton = insertLinkModal.find('a.btn-primary');      var initialValue = urlInput.val();      var caretBookmark;      var insertLink = function() {        var url = urlInput.val();        urlInput.val(initialValue);        self.editor.currentView.element.focus();        if (caretBookmark) {          self.editor.composer.selection.setBookmark(caretBookmark);          caretBookmark = null;        }        var newWindow = targetInput.prop('checked');        self.editor.composer.commands.exec('createLink', {          'href' : url,          'target' : (newWindow ? '_blank' : '_self'),          'rel' : (newWindow ? 'nofollow' : '')        });      };      var pressedEnter = false;      urlInput.keypress(function(e) {        if(e.which == 13) {          insertLink();          insertLinkModal.modal('hide');        }      });      insertButton.click(insertLink);      insertLinkModal.on('shown', function() {        urlInput.focus();      });      insertLinkModal.on('hide', function() {        self.editor.currentView.element.focus();      });      toolbar.find('a[data-wysihtml5-command=createLink]').click(function() {        var activeButton = $(this).hasClass('wysihtml5-command-active');        if (!activeButton) {          self.editor.currentView.element.focus(false);          caretBookmark = self.editor.composer.selection.getBookmark();          insertLinkModal.appendTo('body').modal('show');          insertLinkModal.on('click.dismiss.modal', '[data-dismiss="modal"]', function(e) {            e.stopPropagation();          });          return false;        }        else {          return true;        }      });    }  };  // these define our public api  var methods = {    resetDefaults: function() {      $.fn.wysihtml5.defaultOptions = $.extend(true, {}, $.fn.wysihtml5.defaultOptionsCache);    },    bypassDefaults: function(options) {      return this.each(function () {        var $this = $(this);        $this.data('wysihtml5', new Wysihtml5($this, options));      });    },    shallowExtend: function (options) {      var settings = $.extend({}, $.fn.wysihtml5.defaultOptions, options || {}, $(this).data());      var that = this;      return methods.bypassDefaults.apply(that, [settings]);    },    deepExtend: function(options) {      var settings = $.extend(true, {}, $.fn.wysihtml5.defaultOptions, options || {});      var that = this;      return methods.bypassDefaults.apply(that, [settings]);    },    init: function(options) {      var that = this;      return methods.shallowExtend.apply(that, [options]);    }  };  $.fn.wysihtml5 = function ( method ) {    if ( methods[method] ) {      return methods[method].apply( this, Array.prototype.slice.call( arguments, 1 ));    } else if ( typeof method === 'object' || ! method ) {      return methods.init.apply( this, arguments );    } else {      $.error( 'Method ' +  method + ' does not exist on jQuery.wysihtml5' );    }      };  $.fn.wysihtml5.Constructor = Wysihtml5;  var defaultOptions = $.fn.wysihtml5.defaultOptions = {    'font-styles': true,    'color': false,    'emphasis': true,    'lists': true,    'html': false,    'link': true,    'image': true,    events: {},    parserRules: {      classes: {        'wysiwyg-color-silver' : 1,        'wysiwyg-color-gray' : 1,        'wysiwyg-color-white' : 1,        'wysiwyg-color-maroon' : 1,        'wysiwyg-color-red' : 1,        'wysiwyg-color-purple' : 1,        'wysiwyg-color-fuchsia' : 1,        'wysiwyg-color-green' : 1,        'wysiwyg-color-lime' : 1,        'wysiwyg-color-olive' : 1,        'wysiwyg-color-yellow' : 1,        'wysiwyg-color-navy' : 1,        'wysiwyg-color-blue' : 1,        'wysiwyg-color-teal' : 1,        'wysiwyg-color-aqua' : 1,        'wysiwyg-color-orange' : 1      },      tags: {        'b':  {},        'i':  {},        'strong': {},        'em': {},        'p': {},        'br': {},        'ol': {},        'ul': {},        'li': {},        'h1': {},        'h2': {},        'h3': {},        'h4': {},        'h5': {},        'h6': {},        'blockquote': {},        'u': 1,        'img': {          'check_attributes': {            'width': 'numbers',            'alt': 'alt',            'src': 'url',            'height': 'numbers'          }        },        'a':  {          check_attributes: {            'href': 'url' // important to avoid XSS          },          'set_attributes': {            'target': '_blank',            'rel': 'nofollow'          }        },        'span': 1,        'div': 1,        // to allow save and edit files with code tag hacks        'code': 1,        'pre': 1      }    },    locale: 'en'  };  if (typeof $.fn.wysihtml5.defaultOptionsCache === 'undefined') {    $.fn.wysihtml5.defaultOptionsCache = $.extend(true, {}, $.fn.wysihtml5.defaultOptions);  }  var locale = $.fn.wysihtml5.locale = {};})(window.jQuery, window.wysihtml5);
 |