summaryrefslogtreecommitdiff
path: root/lib/dijit/_editor/plugins/ViewSource.js
diff options
context:
space:
mode:
Diffstat (limited to 'lib/dijit/_editor/plugins/ViewSource.js')
-rw-r--r--lib/dijit/_editor/plugins/ViewSource.js844
1 files changed, 541 insertions, 303 deletions
diff --git a/lib/dijit/_editor/plugins/ViewSource.js b/lib/dijit/_editor/plugins/ViewSource.js
index 41ea2970f..e655ad21d 100644
--- a/lib/dijit/_editor/plugins/ViewSource.js
+++ b/lib/dijit/_editor/plugins/ViewSource.js
@@ -1,317 +1,555 @@
/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
Available via Academic Free License >= 2.1 OR the modified BSD license.
see: http://dojotoolkit.org/license for details
*/
-if(!dojo._hasResource["dijit._editor.plugins.ViewSource"]){
-dojo._hasResource["dijit._editor.plugins.ViewSource"]=true;
+if(!dojo._hasResource["dijit._editor.plugins.ViewSource"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit._editor.plugins.ViewSource"] = true;
dojo.provide("dijit._editor.plugins.ViewSource");
dojo.require("dojo.window");
dojo.require("dojo.i18n");
dojo.require("dijit._editor._Plugin");
dojo.require("dijit.form.Button");
-dojo.requireLocalization("dijit._editor","commands",null,"ROOT,ar,ca,cs,da,de,el,es,fi,fr,he,hu,it,ja,ko,nb,nl,pl,pt,pt-pt,ro,ru,sk,sl,sv,th,tr,zh,zh-tw");
-dojo.declare("dijit._editor.plugins.ViewSource",dijit._editor._Plugin,{stripScripts:true,stripComments:true,stripIFrames:true,readOnly:false,_fsPlugin:null,toggle:function(){
-if(dojo.isWebKit){
-this._vsFocused=true;
-}
-this.button.set("checked",!this.button.get("checked"));
-},_initButton:function(){
-var _1=dojo.i18n.getLocalization("dijit._editor","commands"),_2=this.editor;
-this.button=new dijit.form.ToggleButton({label:_1["viewSource"],dir:_2.dir,lang:_2.lang,showLabel:false,iconClass:this.iconClassPrefix+" "+this.iconClassPrefix+"ViewSource",tabIndex:"-1",onChange:dojo.hitch(this,"_showSource")});
-if(dojo.isIE==7){
-this._ieFixNode=dojo.create("div",{style:{opacity:"0",zIndex:"-1000",position:"absolute",top:"-1000px"}},dojo.body());
-}
-this.button.set("readOnly",false);
-},setEditor:function(_3){
-this.editor=_3;
-this._initButton();
-this.editor.addKeyHandler(dojo.keys.F12,true,true,dojo.hitch(this,function(e){
-this.button.focus();
-this.toggle();
-dojo.stopEvent(e);
-setTimeout(dojo.hitch(this,function(){
-this.editor.focus();
-}),100);
-}));
-},_showSource:function(_4){
-var ed=this.editor;
-var _5=ed._plugins;
-var _6;
-this._sourceShown=_4;
-var _7=this;
-try{
-if(!this.sourceArea){
-this._createSourceView();
-}
-if(_4){
-ed._sourceQueryCommandEnabled=ed.queryCommandEnabled;
-ed.queryCommandEnabled=function(_8){
-var _9=_8.toLowerCase();
-if(_9==="viewsource"){
-return true;
-}else{
-return false;
-}
-};
-this.editor.onDisplayChanged();
-_6=ed.get("value");
-_6=this._filter(_6);
-ed.set("value",_6);
-this._pluginList=[];
-this._disabledPlugins=dojo.filter(_5,function(p){
-if(p&&p.button&&!p.button.get("disabled")&&!(p instanceof dijit._editor.plugins.ViewSource)){
-p._vs_updateState=p.updateState;
-p.updateState=function(){
-return false;
-};
-p.button.set("disabled",true);
-if(p.command){
-switch(p.command){
-case "bold":
-case "italic":
-case "underline":
-case "strikethrough":
-case "superscript":
-case "subscript":
-p.button.set("checked",false);
-break;
-default:
-break;
-}
-}
-return true;
-}
-});
-if(this._fsPlugin){
-this._fsPlugin._getAltViewNode=function(){
-return _7.sourceArea;
-};
-}
-this.sourceArea.value=_6;
-var is=dojo.marginBox(ed.iframe.parentNode);
-dojo.marginBox(this.sourceArea,{w:is.w,h:is.h});
-dojo.style(ed.iframe,"display","none");
-dojo.style(this.sourceArea,{display:"block"});
-var _a=function(){
-var vp=dojo.window.getBox();
-if("_prevW" in this&&"_prevH" in this){
-if(vp.w===this._prevW&&vp.h===this._prevH){
-return;
-}else{
-this._prevW=vp.w;
-this._prevH=vp.h;
-}
-}else{
-this._prevW=vp.w;
-this._prevH=vp.h;
-}
-if(this._resizer){
-clearTimeout(this._resizer);
-delete this._resizer;
-}
-this._resizer=setTimeout(dojo.hitch(this,function(){
-delete this._resizer;
-this._resize();
-}),10);
-};
-this._resizeHandle=dojo.connect(window,"onresize",this,_a);
-setTimeout(dojo.hitch(this,this._resize),100);
-this.editor.onNormalizedDisplayChanged();
-}else{
-if(!ed._sourceQueryCommandEnabled){
-return;
-}
-dojo.disconnect(this._resizeHandle);
-delete this._resizeHandle;
-ed.queryCommandEnabled=ed._sourceQueryCommandEnabled;
-if(!this._readOnly){
-_6=this.sourceArea.value;
-_6=this._filter(_6);
-ed.beginEditing();
-ed.set("value",_6);
-ed.endEditing();
-}
-dojo.forEach(this._disabledPlugins,function(p){
-p.button.set("disabled",false);
-if(p._vs_updateState){
-p.updateState=p._vs_updateState;
-}
+dojo.requireLocalization("dijit._editor", "commands", null, "ROOT,ar,ca,cs,da,de,el,es,fi,fr,he,hu,it,ja,kk,ko,nb,nl,pl,pt,pt-pt,ro,ru,sk,sl,sv,th,tr,zh,zh-tw");
+
+
+dojo.declare("dijit._editor.plugins.ViewSource",dijit._editor._Plugin,{
+ // summary:
+ // This plugin provides a simple view source capability. When view
+ // source mode is enabled, it disables all other buttons/plugins on the RTE.
+ // It also binds to the hotkey: CTRL-SHIFT-F11 for toggling ViewSource mode.
+
+ // stripScripts: [public] Boolean
+ // Boolean flag used to indicate if script tags should be stripped from the document.
+ // Defaults to true.
+ stripScripts: true,
+
+ // stripComments: [public] Boolean
+ // Boolean flag used to indicate if comment tags should be stripped from the document.
+ // Defaults to true.
+ stripComments: true,
+
+ // stripComments: [public] Boolean
+ // Boolean flag used to indicate if iframe tags should be stripped from the document.
+ // Defaults to true.
+ stripIFrames: true,
+
+ // readOnly: [const] Boolean
+ // Boolean flag used to indicate if the source view should be readonly or not.
+ // Cannot be changed after initialization of the plugin.
+ // Defaults to false.
+ readOnly: false,
+
+ // _fsPlugin: [private] Object
+ // Reference to a registered fullscreen plugin so that viewSource knows
+ // how to scale.
+ _fsPlugin: null,
+
+ toggle: function(){
+ // summary:
+ // Function to allow programmatic toggling of the view.
+
+ // For Webkit, we have to focus a very particular way.
+ // when swapping views, otherwise focus doesn't shift right
+ // but can't focus this way all the time, only for VS changes.
+ // If we did it all the time, buttons like bold, italic, etc
+ // break.
+ if(dojo.isWebKit){this._vsFocused = true;}
+ this.button.set("checked", !this.button.get("checked"));
+
+ },
+
+ _initButton: function(){
+ // summary:
+ // Over-ride for creation of the resize button.
+ var strings = dojo.i18n.getLocalization("dijit._editor", "commands"),
+ editor = this.editor;
+ this.button = new dijit.form.ToggleButton({
+ label: strings["viewSource"],
+ dir: editor.dir,
+ lang: editor.lang,
+ showLabel: false,
+ iconClass: this.iconClassPrefix + " " + this.iconClassPrefix + "ViewSource",
+ tabIndex: "-1",
+ onChange: dojo.hitch(this, "_showSource")
+ });
+
+ // IE 7 has a horrible bug with zoom, so we have to create this node
+ // to cross-check later. Sigh.
+ if(dojo.isIE == 7){
+ this._ieFixNode = dojo.create("div", {
+ style: {
+ opacity: "0",
+ zIndex: "-1000",
+ position: "absolute",
+ top: "-1000px"
+ }
+ }, dojo.body());
+ }
+ // Make sure readonly mode doesn't make the wrong cursor appear over the button.
+ this.button.set("readOnly", false);
+ },
+
+
+ setEditor: function(/*dijit.Editor*/ editor){
+ // summary:
+ // Tell the plugin which Editor it is associated with.
+ // editor: Object
+ // The editor object to attach the print capability to.
+ this.editor = editor;
+ this._initButton();
+
+ this.editor.addKeyHandler(dojo.keys.F12, true, true, dojo.hitch(this, function(e){
+ // Move the focus before switching
+ // It'll focus back. Hiding a focused
+ // node causes issues.
+ this.button.focus();
+ this.toggle();
+ dojo.stopEvent(e);
+
+ // Call the focus shift outside of the handler.
+ setTimeout(dojo.hitch(this, function(){
+ // We over-ride focus, so we just need to call.
+ this.editor.focus();
+ }), 100);
+ }));
+ },
+
+ _showSource: function(source){
+ // summary:
+ // Function to toggle between the source and RTE views.
+ // source: boolean
+ // Boolean value indicating if it should be in source mode or not.
+ // tags:
+ // private
+ var ed = this.editor;
+ var edPlugins = ed._plugins;
+ var html;
+ this._sourceShown = source;
+ var self = this;
+ try{
+ if(!this.sourceArea){
+ this._createSourceView();
+ }
+ if(source){
+ // Update the QueryCommandEnabled function to disable everything but
+ // the source view mode. Have to over-ride a function, then kick all
+ // plugins to check their state.
+ ed._sourceQueryCommandEnabled = ed.queryCommandEnabled;
+ ed.queryCommandEnabled = function(cmd){
+ var lcmd = cmd.toLowerCase();
+ if(lcmd === "viewsource"){
+ return true;
+ }else{
+ return false;
+ }
+ };
+ this.editor.onDisplayChanged();
+ html = ed.get("value");
+ html = this._filter(html);
+ ed.set("value", html);
+ this._pluginList = [];
+ dojo.forEach(edPlugins, function(p){
+ // Turn off any plugins not controlled by queryCommandenabled.
+ if(!(p instanceof dijit._editor.plugins.ViewSource)){
+ p.set("disabled", true)
+ }
+ });
+
+ // We actually do need to trap this plugin and adjust how we
+ // display the textarea.
+ if(this._fsPlugin){
+ this._fsPlugin._getAltViewNode = function(){
+ return self.sourceArea;
+ };
+ }
+
+ this.sourceArea.value = html;
+ var is = dojo._getMarginSize(ed.iframe.parentNode);
+
+ dojo.marginBox(this.sourceArea, {
+ w: is.w,
+ h: is.h
+ });
+
+ dojo.style(ed.iframe, "display", "none");
+ dojo.style(this.sourceArea, {
+ display: "block"
+ });
+
+ var resizer = function(){
+ // function to handle resize events.
+ // Will check current VP and only resize if
+ // different.
+ var vp = dojo.window.getBox();
+
+ if("_prevW" in this && "_prevH" in this){
+ // No actual size change, ignore.
+ if(vp.w === this._prevW && vp.h === this._prevH){
+ return;
+ }else{
+ this._prevW = vp.w;
+ this._prevH = vp.h;
+ }
+ }else{
+ this._prevW = vp.w;
+ this._prevH = vp.h;
+ }
+ if(this._resizer){
+ clearTimeout(this._resizer);
+ delete this._resizer;
+ }
+ // Timeout it to help avoid spamming resize on IE.
+ // Works for all browsers.
+ this._resizer = setTimeout(dojo.hitch(this, function(){
+ delete this._resizer;
+ this._resize();
+ }), 10);
+ };
+ this._resizeHandle = dojo.connect(window, "onresize", this, resizer);
+
+ //Call this on a delay once to deal with IE glitchiness on initial size.
+ setTimeout(dojo.hitch(this, this._resize), 100);
+
+ //Trigger a check for command enablement/disablement.
+ this.editor.onNormalizedDisplayChanged();
+
+ this.editor.__oldGetValue = this.editor.getValue;
+ this.editor.getValue = dojo.hitch(this, function() {
+ var txt = this.sourceArea.value;
+ txt = this._filter(txt);
+ return txt;
+ });
+ }else{
+ // First check that we were in source view before doing anything.
+ // corner case for being called with a value of false and we hadn't
+ // actually been in source display mode.
+ if(!ed._sourceQueryCommandEnabled){
+ return;
+ }
+ dojo.disconnect(this._resizeHandle);
+ delete this._resizeHandle;
+
+ if(this.editor.__oldGetValue){
+ this.editor.getValue = this.editor.__oldGetValue;
+ delete this.editor.__oldGetValue;
+ }
+
+ // Restore all the plugin buttons state.
+ ed.queryCommandEnabled = ed._sourceQueryCommandEnabled;
+ if(!this._readOnly){
+ html = this.sourceArea.value;
+ html = this._filter(html);
+ ed.beginEditing();
+ ed.set("value", html);
+ ed.endEditing();
+ }
+
+ dojo.forEach(edPlugins, function(p){
+ // Turn back on any plugins we turned off.
+ p.set("disabled", false);
+ });
+
+ dojo.style(this.sourceArea, "display", "none");
+ dojo.style(ed.iframe, "display", "block");
+ delete ed._sourceQueryCommandEnabled;
+
+ //Trigger a check for command enablement/disablement.
+ this.editor.onDisplayChanged();
+ }
+ // Call a delayed resize to wait for some things to display in header/footer.
+ setTimeout(dojo.hitch(this, function(){
+ // Make resize calls.
+ var parent = ed.domNode.parentNode;
+ if(parent){
+ var container = dijit.getEnclosingWidget(parent);
+ if(container && container.resize){
+ container.resize();
+ }
+ }
+ ed.resize();
+ }), 300);
+ }catch(e){
+ console.log(e);
+ }
+ },
+
+ updateState: function(){
+ // summary:
+ // Over-ride for button state control for disabled to work.
+ this.button.set("disabled", this.get("disabled"));
+ },
+
+ _resize: function(){
+ // summary:
+ // Internal function to resize the source view
+ // tags:
+ // private
+ var ed = this.editor;
+ var tbH = ed.getHeaderHeight();
+ var fH = ed.getFooterHeight();
+ var eb = dojo.position(ed.domNode);
+
+ // Styles are now applied to the internal source container, so we have
+ // to subtract them off.
+ var containerPadding = dojo._getPadBorderExtents(ed.iframe.parentNode);
+ var containerMargin = dojo._getMarginExtents(ed.iframe.parentNode);
+
+ var extents = dojo._getPadBorderExtents(ed.domNode);
+ var mExtents = dojo._getMarginExtents(ed.domNode);
+ var edb = {
+ w: eb.w - (extents.w + mExtents.w),
+ h: eb.h - (tbH + extents.h + mExtents.h + fH)
+ };
+
+ // Fullscreen gets odd, so we need to check for the FS plugin and
+ // adapt.
+ if(this._fsPlugin && this._fsPlugin.isFullscreen){
+ //Okay, probably in FS, adjust.
+ var vp = dojo.window.getBox();
+ edb.w = (vp.w - extents.w);
+ edb.h = (vp.h - (tbH + extents.h + fH));
+ }
+
+ if(dojo.isIE){
+ // IE is always off by 2px, so we have to adjust here
+ // Note that IE ZOOM is broken here. I can't get
+ //it to scale right.
+ edb.h -= 2;
+ }
+
+ // IE has a horrible zoom bug. So, we have to try and account for
+ // it and fix up the scaling.
+ if(this._ieFixNode){
+ var _ie7zoom = -this._ieFixNode.offsetTop / 1000;
+ edb.w = Math.floor((edb.w + 0.9) / _ie7zoom);
+ edb.h = Math.floor((edb.h + 0.9) / _ie7zoom);
+ }
+
+ dojo.marginBox(this.sourceArea, {
+ w: edb.w - (containerPadding.w + containerMargin.w),
+ h: edb.h - (containerPadding.h + containerMargin.h)
+ });
+
+ // Scale the parent container too in this case.
+ dojo.marginBox(ed.iframe.parentNode, {
+ h: edb.h
+ });
+ },
+
+ _createSourceView: function(){
+ // summary:
+ // Internal function for creating the source view area.
+ // tags:
+ // private
+ var ed = this.editor;
+ var edPlugins = ed._plugins;
+ this.sourceArea = dojo.create("textarea");
+ if(this.readOnly){
+ dojo.attr(this.sourceArea, "readOnly", true);
+ this._readOnly = true;
+ }
+ dojo.style(this.sourceArea, {
+ padding: "0px",
+ margin: "0px",
+ borderWidth: "0px",
+ borderStyle: "none"
+ });
+ dojo.place(this.sourceArea, ed.iframe, "before");
+
+ if(dojo.isIE && ed.iframe.parentNode.lastChild !== ed.iframe){
+ // There's some weirdo div in IE used for focus control
+ // But is messed up scaling the textarea if we don't config
+ // it some so it doesn't have a varying height.
+ dojo.style(ed.iframe.parentNode.lastChild,{
+ width: "0px",
+ height: "0px",
+ padding: "0px",
+ margin: "0px",
+ borderWidth: "0px",
+ borderStyle: "none"
+ });
+ }
+
+ // We also need to take over editor focus a bit here, so that focus calls to
+ // focus the editor will focus to the right node when VS is active.
+ ed._viewsource_oldFocus = ed.focus;
+ var self = this;
+ ed.focus = function(){
+ if(self._sourceShown){
+ self.setSourceAreaCaret();
+ }else{
+ try{
+ if(this._vsFocused){
+ delete this._vsFocused;
+ // Must focus edit node in this case (webkit only) or
+ // focus doesn't shift right, but in normal
+ // cases we focus with the regular function.
+ dijit.focus(ed.editNode);
+ }else{
+ ed._viewsource_oldFocus();
+ }
+ }catch(e){
+ console.log(e);
+ }
+ }
+ };
+
+ var i, p;
+ for(i = 0; i < edPlugins.length; i++){
+ // We actually do need to trap this plugin and adjust how we
+ // display the textarea.
+ p = edPlugins[i];
+ if(p && (p.declaredClass === "dijit._editor.plugins.FullScreen" ||
+ p.declaredClass === (dijit._scopeName +
+ "._editor.plugins.FullScreen"))){
+ this._fsPlugin = p;
+ break;
+ }
+ }
+ if(this._fsPlugin){
+ // Found, we need to over-ride the alt-view node function
+ // on FullScreen with our own, chain up to parent call when appropriate.
+ this._fsPlugin._viewsource_getAltViewNode = this._fsPlugin._getAltViewNode;
+ this._fsPlugin._getAltViewNode = function(){
+ return self._sourceShown?self.sourceArea:this._viewsource_getAltViewNode();
+ };
+ }
+
+ // Listen to the source area for key events as well, as we need to be able to hotkey toggle
+ // it from there too.
+ this.connect(this.sourceArea, "onkeydown", dojo.hitch(this, function(e){
+ if(this._sourceShown && e.keyCode == dojo.keys.F12 && e.ctrlKey && e.shiftKey){
+ this.button.focus();
+ this.button.set("checked", false);
+ setTimeout(dojo.hitch(this, function(){ed.focus();}), 100);
+ dojo.stopEvent(e);
+ }
+ }));
+ },
+
+ _stripScripts: function(html){
+ // summary:
+ // Strips out script tags from the HTML used in editor.
+ // html: String
+ // The HTML to filter
+ // tags:
+ // private
+ if(html){
+ // Look for closed and unclosed (malformed) script attacks.
+ html = html.replace(/<\s*script[^>]*>((.|\s)*?)<\\?\/\s*script\s*>/ig, "");
+ html = html.replace(/<\s*script\b([^<>]|\s)*>?/ig, "");
+ html = html.replace(/<[^>]*=(\s|)*[("|')]javascript:[^$1][(\s|.)]*[$1][^>]*>/ig, "");
+ }
+ return html;
+ },
+
+ _stripComments: function(html){
+ // summary:
+ // Strips out comments from the HTML used in editor.
+ // html: String
+ // The HTML to filter
+ // tags:
+ // private
+ if(html){
+ html = html.replace(/<!--(.|\s){1,}?-->/g, "");
+ }
+ return html;
+ },
+
+ _stripIFrames: function(html){
+ // summary:
+ // Strips out iframe tags from the content, to avoid iframe script
+ // style injection attacks.
+ // html: String
+ // The HTML to filter
+ // tags:
+ // private
+ if(html){
+ html = html.replace(/<\s*iframe[^>]*>((.|\s)*?)<\\?\/\s*iframe\s*>/ig, "");
+ }
+ return html;
+ },
+
+ _filter: function(html){
+ // summary:
+ // Internal function to perform some filtering on the HTML.
+ // html: String
+ // The HTML to filter
+ // tags:
+ // private
+ if(html){
+ if(this.stripScripts){
+ html = this._stripScripts(html);
+ }
+ if(this.stripComments){
+ html = this._stripComments(html);
+ }
+ if(this.stripIFrames){
+ html = this._stripIFrames(html);
+ }
+ }
+ return html;
+ },
+
+ setSourceAreaCaret: function(){
+ // summary:
+ // Internal function to set the caret in the sourceArea
+ // to 0x0
+ var win = dojo.global;
+ var elem = this.sourceArea;
+ dijit.focus(elem);
+ if(this._sourceShown && !this.readOnly){
+ if(dojo.isIE){
+ if(this.sourceArea.createTextRange){
+ var range = elem.createTextRange();
+ range.collapse(true);
+ range.moveStart("character", -99999); // move to 0
+ range.moveStart("character", 0); // delta from 0 is the correct position
+ range.moveEnd("character", 0);
+ range.select();
+ }
+ }else if(win.getSelection){
+ if(elem.setSelectionRange){
+ elem.setSelectionRange(0,0);
+ }
+ }
+ }
+ },
+
+ destroy: function(){
+ // summary:
+ // Over-ride to remove the node used to correct for IE's
+ // zoom bug.
+ if(this._ieFixNode){
+ dojo.body().removeChild(this._ieFixNode);
+ }
+ if(this._resizer){
+ clearTimeout(this._resizer);
+ delete this._resizer;
+ }
+ if(this._resizeHandle){
+ dojo.disconnect(this._resizeHandle);
+ delete this._resizeHandle;
+ }
+ this.inherited(arguments);
+ }
});
-this._disabledPlugins=null;
-dojo.style(this.sourceArea,"display","none");
-dojo.style(ed.iframe,"display","block");
-delete ed._sourceQueryCommandEnabled;
-this.editor.onDisplayChanged();
-}
-setTimeout(dojo.hitch(this,function(){
-var _b=ed.domNode.parentNode;
-if(_b){
-var _c=dijit.getEnclosingWidget(_b);
-if(_c&&_c.resize){
-_c.resize();
-}
-}
-ed.resize();
-}),300);
-}
-catch(e){
-}
-},_resize:function(){
-var ed=this.editor;
-var _d=ed.getHeaderHeight();
-var fH=ed.getFooterHeight();
-var eb=dojo.position(ed.domNode);
-var _e=dojo._getPadBorderExtents(ed.iframe.parentNode);
-var _f=dojo._getMarginExtents(ed.iframe.parentNode);
-var _10=dojo._getPadBorderExtents(ed.domNode);
-var _11=dojo._getMarginExtents(ed.domNode);
-var edb={w:eb.w-(_10.w+_11.w),h:eb.h-(_d+_10.h+_11.h+fH)};
-if(this._fsPlugin&&this._fsPlugin.isFullscreen){
-var vp=dojo.window.getBox();
-edb.w=(vp.w-_10.w);
-edb.h=(vp.h-(_d+_10.h+fH));
-}
-if(dojo.isIE){
-edb.h-=2;
-}
-if(this._ieFixNode){
-var _12=-this._ieFixNode.offsetTop/1000;
-edb.w=Math.floor((edb.w+0.9)/_12);
-edb.h=Math.floor((edb.h+0.9)/_12);
-}
-dojo.marginBox(this.sourceArea,{w:edb.w-(_e.w+_f.w),h:edb.h-(_e.h+_f.h)});
-dojo.marginBox(ed.iframe.parentNode,{h:edb.h});
-},_createSourceView:function(){
-var ed=this.editor;
-var _13=ed._plugins;
-this.sourceArea=dojo.create("textarea");
-if(this.readOnly){
-dojo.attr(this.sourceArea,"readOnly",true);
-this._readOnly=true;
-}
-dojo.style(this.sourceArea,{padding:"0px",margin:"0px",borderWidth:"0px",borderStyle:"none"});
-dojo.place(this.sourceArea,ed.iframe,"before");
-if(dojo.isIE&&ed.iframe.parentNode.lastChild!==ed.iframe){
-dojo.style(ed.iframe.parentNode.lastChild,{width:"0px",height:"0px",padding:"0px",margin:"0px",borderWidth:"0px",borderStyle:"none"});
-}
-ed._viewsource_oldFocus=ed.focus;
-var _14=this;
-ed.focus=function(){
-if(_14._sourceShown){
-_14.setSourceAreaCaret();
-}else{
-try{
-if(this._vsFocused){
-delete this._vsFocused;
-dijit.focus(ed.editNode);
-}else{
-ed._viewsource_oldFocus();
-}
-}
-catch(e){
-}
-}
-};
-var i,p;
-for(i=0;i<_13.length;i++){
-p=_13[i];
-if(p&&(p.declaredClass==="dijit._editor.plugins.FullScreen"||p.declaredClass===(dijit._scopeName+"._editor.plugins.FullScreen"))){
-this._fsPlugin=p;
-break;
-}
-}
-if(this._fsPlugin){
-this._fsPlugin._viewsource_getAltViewNode=this._fsPlugin._getAltViewNode;
-this._fsPlugin._getAltViewNode=function(){
-return _14._sourceShown?_14.sourceArea:this._viewsource_getAltViewNode();
-};
-}
-this.connect(this.sourceArea,"onkeydown",dojo.hitch(this,function(e){
-if(this._sourceShown&&e.keyCode==dojo.keys.F12&&e.ctrlKey&&e.shiftKey){
-this.button.focus();
-this.button.set("checked",false);
-setTimeout(dojo.hitch(this,function(){
-ed.focus();
-}),100);
-dojo.stopEvent(e);
-}
-}));
-},_stripScripts:function(_15){
-if(_15){
-_15=_15.replace(/<\s*script[^>]*>((.|\s)*?)<\\?\/\s*script\s*>/ig,"");
-_15=_15.replace(/<\s*script\b([^<>]|\s)*>?/ig,"");
-_15=_15.replace(/<[^>]*=(\s|)*[("|')]javascript:[^$1][(\s|.)]*[$1][^>]*>/ig,"");
-}
-return _15;
-},_stripComments:function(_16){
-if(_16){
-_16=_16.replace(/<!--(.|\s){1,}?-->/g,"");
-}
-return _16;
-},_stripIFrames:function(_17){
-if(_17){
-_17=_17.replace(/<\s*iframe[^>]*>((.|\s)*?)<\\?\/\s*iframe\s*>/ig,"");
-}
-return _17;
-},_filter:function(_18){
-if(_18){
-if(this.stripScripts){
-_18=this._stripScripts(_18);
-}
-if(this.stripComments){
-_18=this._stripComments(_18);
-}
-if(this.stripIFrames){
-_18=this._stripIFrames(_18);
-}
-}
-return _18;
-},setSourceAreaCaret:function(){
-var win=dojo.global;
-var _19=this.sourceArea;
-dijit.focus(_19);
-if(this._sourceShown&&!this.readOnly){
-if(dojo.isIE){
-if(this.sourceArea.createTextRange){
-var _1a=_19.createTextRange();
-_1a.collapse(true);
-_1a.moveStart("character",-99999);
-_1a.moveStart("character",0);
-_1a.moveEnd("character",0);
-_1a.select();
-}
-}else{
-if(win.getSelection){
-if(_19.setSelectionRange){
-_19.setSelectionRange(0,0);
-}
-}
-}
-}
-},destroy:function(){
-if(this._ieFixNode){
-dojo.body().removeChild(this._ieFixNode);
-}
-if(this._resizer){
-clearTimeout(this._resizer);
-delete this._resizer;
-}
-if(this._resizeHandle){
-dojo.disconnect(this._resizeHandle);
-delete this._resizeHandle;
-}
-this.inherited(arguments);
-}});
-dojo.subscribe(dijit._scopeName+".Editor.getPlugin",null,function(o){
-if(o.plugin){
-return;
-}
-var _1b=o.args.name.toLowerCase();
-if(_1b==="viewsource"){
-o.plugin=new dijit._editor.plugins.ViewSource({readOnly:("readOnly" in o.args)?o.args.readOnly:false,stripComments:("stripComments" in o.args)?o.args.stripComments:true,stripScripts:("stripScripts" in o.args)?o.args.stripScripts:true,stripIFrames:("stripIFrames" in o.args)?o.args.stripIFrames:true});
-}
+
+// Register this plugin.
+dojo.subscribe(dijit._scopeName + ".Editor.getPlugin",null,function(o){
+ if(o.plugin){ return; }
+ var name = o.args.name.toLowerCase();
+ if(name === "viewsource"){
+ o.plugin = new dijit._editor.plugins.ViewSource({
+ readOnly: ("readOnly" in o.args)?o.args.readOnly:false,
+ stripComments: ("stripComments" in o.args)?o.args.stripComments:true,
+ stripScripts: ("stripScripts" in o.args)?o.args.stripScripts:true,
+ stripIFrames: ("stripIFrames" in o.args)?o.args.stripIFrames:true
+ });
+ }
});
+
}