diff --git a/jquery.modal.js b/jquery.modal.js
index 9add4fd..d5fc367 100644
--- a/jquery.modal.js
+++ b/jquery.modal.js
@@ -1,6 +1,6 @@
 /*
     A simple jQuery modal (http://github.com/kylefox/jquery-modal)
-    Version 0.9.2
+    Version 0.9.1
 */
 
 (function (factory) {
@@ -113,17 +113,11 @@
     },
 
     block: function() {
+      var div = document.createElement('div');
+      div.setAttribute('class', this.options.blockerClass + ' blocker current');
       this.$elm.trigger($.modal.BEFORE_BLOCK, [this._ctx()]);
       this.$body.css('overflow','hidden');
-      if (window.trustedTypes && window.trustedTypes.createPolicy) {
-        const policy = self.trustedTypes.createPolicy('jquery-modal-fix-1', {
-          createHTML: function(_ignored) { return this.$body }
-        });
-        safeBody = policy.createHTML('_ignored');
-      } else {
-        safeBody = this.$body;
-      }
-      this.$blocker = $('<div></div>').addClass(this.options.blockerClass + ' blocker current').appendTo(safeBody);
+      this.$blocker = $(this.$body[0].appendChild(div));
       selectCurrent();
       if(this.options.doFade) {
         this.$blocker.css('opacity',0).animate({opacity: 1}, this.options.fadeDuration);
@@ -177,16 +171,26 @@
 
     showSpinner: function() {
       if (!this.options.showSpinner) return;
-      if (window.trustedTypes && window.trustedTypes.createPolicy) {
-        const policy = self.trustedTypes.createPolicy('jquery-modal-fix-2', {
-          createHTML: function(_ignored) { return this.options.spinnerHtml }
-        });
-        safeSpinnerHtml = policy.createHTML('_ignored');
-      } else {
-        safeSpinnerHtml = this.options.spinnerHtml;
-      }
-      this.spinner = this.spinner || $('<div></div>').addClass(this.options.modalClass + '-spinner')
-        .append(safeSpinnerHtml);
+      var div = document.createElement('div');
+      div.setAttribute('class', this.options.modalClass + '-spinner');
+
+      var divSpinner1 = document.createElement('div');
+      divSpinner1.setAttribute('class','rect1');
+      div.appendChild(divSpinner1);
+
+      var divSpinner2 = document.createElement('div');
+      divSpinner2.setAttribute('class','rect2');
+      div.appendChild(divSpinner2);
+
+      var divSpinner3 = document.createElement('div');
+      divSpinner3.setAttribute('class','rect3');
+      div.appendChild(divSpinner3);
+
+      var divSpinner4 = document.createElement('div');
+      divSpinner4.setAttribute('class','rect4');
+      div.appendChild(divSpinner4);
+
+      this.spinner = this.spinner || $(div);
       this.$body.append(this.spinner);
       this.spinner.show();
     },
@@ -197,7 +201,7 @@
 
     //Return context for custom events
     _ctx: function() {
-      return { elm: this.$elm, $elm: this.$elm, $blocker: this.$blocker, options: this.options, $anchor: this.anchor };
+      return { elm: this.$elm, $elm: this.$elm, $blocker: this.$blocker, options: this.options };
     }
   };
 
diff --git a/jquery.modal.min.js b/jquery.modal.min.js
index ef7168a..f2b0f11 100644
--- a/jquery.modal.min.js
+++ b/jquery.modal.min.js
@@ -1,5 +1,5 @@
 /*
     A simple jQuery modal (http://github.com/kylefox/jquery-modal)
-    Version 0.9.2
+    Version 0.9.1
 */
-!function(o){"object"==typeof module&&"object"==typeof module.exports?o(require("jquery"),window,document):o(jQuery,window,document)}(function(o,e,t,i){var s=[],l=function(){return s.length?s[s.length-1]:null},n=function(){var o,e=!1;for(o=s.length-1;o>=0;o--)s[o].$blocker&&(s[o].$blocker.toggleClass("current",!e).toggleClass("behind",e),e=!0)};o.modal=function(e,t){var i,n;if(this.$body=o("body"),this.options=o.extend({},o.modal.defaults,t),this.options.doFade=!isNaN(parseInt(this.options.fadeDuration,10)),this.$blocker=null,this.options.closeExisting)for(;o.modal.isActive();)o.modal.close();if(s.push(this),e.is("a"))if(n=e.attr("href"),this.anchor=e,/^#/.test(n)){if(this.$elm=o(n),1!==this.$elm.length)return null;this.$body.append(this.$elm),this.open()}else this.$elm=o("<div>"),this.$body.append(this.$elm),i=function(o,e){e.elm.remove()},this.showSpinner(),e.trigger(o.modal.AJAX_SEND),o.get(n).done(function(t){if(o.modal.isActive()){e.trigger(o.modal.AJAX_SUCCESS);var s=l();s.$elm.empty().append(t).on(o.modal.CLOSE,i),s.hideSpinner(),s.open(),e.trigger(o.modal.AJAX_COMPLETE)}}).fail(function(){e.trigger(o.modal.AJAX_FAIL);var t=l();t.hideSpinner(),s.pop(),e.trigger(o.modal.AJAX_COMPLETE)});else this.$elm=e,this.anchor=e,this.$body.append(this.$elm),this.open()},o.modal.prototype={constructor:o.modal,open:function(){var e=this;this.block(),this.anchor.blur(),this.options.doFade?setTimeout(function(){e.show()},this.options.fadeDuration*this.options.fadeDelay):this.show(),o(t).off("keydown.modal").on("keydown.modal",function(o){var e=l();27===o.which&&e.options.escapeClose&&e.close()}),this.options.clickClose&&this.$blocker.click(function(e){e.target===this&&o.modal.close()})},close:function(){s.pop(),this.unblock(),this.hide(),o.modal.isActive()||o(t).off("keydown.modal")},block:function(){if(this.$elm.trigger(o.modal.BEFORE_BLOCK,[this._ctx()]),this.$body.css("overflow","hidden"),e.trustedTypes&&e.trustedTypes.createPolicy){const t=self.trustedTypes.createPolicy("jquery-modal-fix-1",{createHTML:function(o){return this.$body}});safeBody=t.createHTML("_ignored")}else safeBody=this.$body;this.$blocker=o("<div></div>").addClass(this.options.blockerClass+" blocker current").appendTo(safeBody),n(),this.options.doFade&&this.$blocker.css("opacity",0).animate({opacity:1},this.options.fadeDuration),this.$elm.trigger(o.modal.BLOCK,[this._ctx()])},unblock:function(e){!e&&this.options.doFade?this.$blocker.fadeOut(this.options.fadeDuration,this.unblock.bind(this,!0)):(this.$blocker.children().appendTo(this.$body),this.$blocker.remove(),this.$blocker=null,n(),o.modal.isActive()||this.$body.css("overflow",""))},show:function(){this.$elm.trigger(o.modal.BEFORE_OPEN,[this._ctx()]),this.options.showClose&&(this.closeButton=o('<a href="#close-modal" rel="modal:close" class="close-modal '+this.options.closeClass+'">'+this.options.closeText+"</a>"),this.$elm.append(this.closeButton)),this.$elm.addClass(this.options.modalClass).appendTo(this.$blocker),this.options.doFade?this.$elm.css({opacity:0,display:"inline-block"}).animate({opacity:1},this.options.fadeDuration):this.$elm.css("display","inline-block"),this.$elm.trigger(o.modal.OPEN,[this._ctx()])},hide:function(){this.$elm.trigger(o.modal.BEFORE_CLOSE,[this._ctx()]),this.closeButton&&this.closeButton.remove();var e=this;this.options.doFade?this.$elm.fadeOut(this.options.fadeDuration,function(){e.$elm.trigger(o.modal.AFTER_CLOSE,[e._ctx()])}):this.$elm.hide(0,function(){e.$elm.trigger(o.modal.AFTER_CLOSE,[e._ctx()])}),this.$elm.trigger(o.modal.CLOSE,[this._ctx()])},showSpinner:function(){if(this.options.showSpinner){if(e.trustedTypes&&e.trustedTypes.createPolicy){const t=self.trustedTypes.createPolicy("jquery-modal-fix-2",{createHTML:function(o){return this.options.spinnerHtml}});safeSpinnerHtml=t.createHTML("_ignored")}else safeSpinnerHtml=this.options.spinnerHtml;this.spinner=this.spinner||o("<div></div>").addClass(this.options.modalClass+"-spinner").append(safeSpinnerHtml),this.$body.append(this.spinner),this.spinner.show()}},hideSpinner:function(){this.spinner&&this.spinner.remove()},_ctx:function(){return{elm:this.$elm,$elm:this.$elm,$blocker:this.$blocker,options:this.options,$anchor:this.anchor}}},o.modal.close=function(e){if(o.modal.isActive()){e&&e.preventDefault();var t=l();return t.close(),t.$elm}},o.modal.isActive=function(){return s.length>0},o.modal.getCurrent=l,o.modal.defaults={closeExisting:!0,escapeClose:!0,clickClose:!0,closeText:"Close",closeClass:"",modalClass:"modal",blockerClass:"jquery-modal",spinnerHtml:'<div class="rect1"></div><div class="rect2"></div><div class="rect3"></div><div class="rect4"></div>',showSpinner:!0,showClose:!0,fadeDuration:null,fadeDelay:1},o.modal.BEFORE_BLOCK="modal:before-block",o.modal.BLOCK="modal:block",o.modal.BEFORE_OPEN="modal:before-open",o.modal.OPEN="modal:open",o.modal.BEFORE_CLOSE="modal:before-close",o.modal.CLOSE="modal:close",o.modal.AFTER_CLOSE="modal:after-close",o.modal.AJAX_SEND="modal:ajax:send",o.modal.AJAX_SUCCESS="modal:ajax:success",o.modal.AJAX_FAIL="modal:ajax:fail",o.modal.AJAX_COMPLETE="modal:ajax:complete",o.fn.modal=function(e){return 1===this.length&&new o.modal(this,e),this},o(t).on("click.modal",'a[rel~="modal:close"]',o.modal.close),o(t).on("click.modal",'a[rel~="modal:open"]',function(e){e.preventDefault(),o(this).modal()})});
\ No newline at end of file
+!function(o){"object"==typeof module&&"object"==typeof module.exports?o(require("jquery"),window,document):o(jQuery,window,document)}(function(o,t,e,i){var s=[],l=function(){return s.length?s[s.length-1]:null},n=function(){var o,t=!1;for(o=s.length-1;o>=0;o--)s[o].$blocker&&(s[o].$blocker.toggleClass("current",!t).toggleClass("behind",t),t=!0)};o.modal=function(t,e){var i,n;if(this.$body=o("body"),this.options=o.extend({},o.modal.defaults,e),this.options.doFade=!isNaN(parseInt(this.options.fadeDuration,10)),this.$blocker=null,this.options.closeExisting)for(;o.modal.isActive();)o.modal.close();if(s.push(this),t.is("a"))if(n=t.attr("href"),this.anchor=t,/^#/.test(n)){if(this.$elm=o(n),1!==this.$elm.length)return null;this.$body.append(this.$elm),this.open()}else this.$elm=o("<div>"),this.$body.append(this.$elm),i=function(o,t){t.elm.remove()},this.showSpinner(),t.trigger(o.modal.AJAX_SEND),o.get(n).done(function(e){if(o.modal.isActive()){t.trigger(o.modal.AJAX_SUCCESS);var s=l();s.$elm.empty().append(e).on(o.modal.CLOSE,i),s.hideSpinner(),s.open(),t.trigger(o.modal.AJAX_COMPLETE)}}).fail(function(){t.trigger(o.modal.AJAX_FAIL);var e=l();e.hideSpinner(),s.pop(),t.trigger(o.modal.AJAX_COMPLETE)});else this.$elm=t,this.anchor=t,this.$body.append(this.$elm),this.open()},o.modal.prototype={constructor:o.modal,open:function(){var t=this;this.block(),this.anchor.blur(),this.options.doFade?setTimeout(function(){t.show()},this.options.fadeDuration*this.options.fadeDelay):this.show(),o(e).off("keydown.modal").on("keydown.modal",function(o){var t=l();27===o.which&&t.options.escapeClose&&t.close()}),this.options.clickClose&&this.$blocker.click(function(t){t.target===this&&o.modal.close()})},close:function(){s.pop(),this.unblock(),this.hide(),o.modal.isActive()||o(e).off("keydown.modal")},block:function(){var t=e.createElement("div");t.setAttribute("class",this.options.blockerClass+" blocker current"),this.$elm.trigger(o.modal.BEFORE_BLOCK,[this._ctx()]),this.$body.css("overflow","hidden"),this.$blocker=o(this.$body[0].appendChild(t)),n(),this.options.doFade&&this.$blocker.css("opacity",0).animate({opacity:1},this.options.fadeDuration),this.$elm.trigger(o.modal.BLOCK,[this._ctx()])},unblock:function(t){!t&&this.options.doFade?this.$blocker.fadeOut(this.options.fadeDuration,this.unblock.bind(this,!0)):(this.$blocker.children().appendTo(this.$body),this.$blocker.remove(),this.$blocker=null,n(),o.modal.isActive()||this.$body.css("overflow",""))},show:function(){this.$elm.trigger(o.modal.BEFORE_OPEN,[this._ctx()]),this.options.showClose&&(this.closeButton=o('<a href="#close-modal" rel="modal:close" class="close-modal '+this.options.closeClass+'">'+this.options.closeText+"</a>"),this.$elm.append(this.closeButton)),this.$elm.addClass(this.options.modalClass).appendTo(this.$blocker),this.options.doFade?this.$elm.css({opacity:0,display:"inline-block"}).animate({opacity:1},this.options.fadeDuration):this.$elm.css("display","inline-block"),this.$elm.trigger(o.modal.OPEN,[this._ctx()])},hide:function(){this.$elm.trigger(o.modal.BEFORE_CLOSE,[this._ctx()]),this.closeButton&&this.closeButton.remove();var t=this;this.options.doFade?this.$elm.fadeOut(this.options.fadeDuration,function(){t.$elm.trigger(o.modal.AFTER_CLOSE,[t._ctx()])}):this.$elm.hide(0,function(){t.$elm.trigger(o.modal.AFTER_CLOSE,[t._ctx()])}),this.$elm.trigger(o.modal.CLOSE,[this._ctx()])},showSpinner:function(){if(this.options.showSpinner){var t=e.createElement("div");t.setAttribute("class",this.options.modalClass+"-spinner");var i=e.createElement("div");i.setAttribute("class","rect1"),t.appendChild(i);var s=e.createElement("div");s.setAttribute("class","rect2"),t.appendChild(s);var l=e.createElement("div");l.setAttribute("class","rect3"),t.appendChild(l);var n=e.createElement("div");n.setAttribute("class","rect4"),t.appendChild(n),this.spinner=this.spinner||o(t),this.$body.append(this.spinner),this.spinner.show()}},hideSpinner:function(){this.spinner&&this.spinner.remove()},_ctx:function(){return{elm:this.$elm,$elm:this.$elm,$blocker:this.$blocker,options:this.options}}},o.modal.close=function(t){if(o.modal.isActive()){t&&t.preventDefault();var e=l();return e.close(),e.$elm}},o.modal.isActive=function(){return s.length>0},o.modal.getCurrent=l,o.modal.defaults={closeExisting:!0,escapeClose:!0,clickClose:!0,closeText:"Close",closeClass:"",modalClass:"modal",blockerClass:"jquery-modal",spinnerHtml:'<div class="rect1"></div><div class="rect2"></div><div class="rect3"></div><div class="rect4"></div>',showSpinner:!0,showClose:!0,fadeDuration:null,fadeDelay:1},o.modal.BEFORE_BLOCK="modal:before-block",o.modal.BLOCK="modal:block",o.modal.BEFORE_OPEN="modal:before-open",o.modal.OPEN="modal:open",o.modal.BEFORE_CLOSE="modal:before-close",o.modal.CLOSE="modal:close",o.modal.AFTER_CLOSE="modal:after-close",o.modal.AJAX_SEND="modal:ajax:send",o.modal.AJAX_SUCCESS="modal:ajax:success",o.modal.AJAX_FAIL="modal:ajax:fail",o.modal.AJAX_COMPLETE="modal:ajax:complete",o.fn.modal=function(t){return 1===this.length&&new o.modal(this,t),this},o(e).on("click.modal",'a[rel~="modal:close"]',o.modal.close),o(e).on("click.modal",'a[rel~="modal:open"]',function(t){t.preventDefault(),o(this).modal()})});
\ No newline at end of file
