mirror of
https://git.tt-rss.org/git/tt-rss.git
synced 2025-12-16 05:46:00 +00:00
upgrade Dojo to 1.6.1
This commit is contained in:
@@ -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;
|
||||
}
|
||||
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);
|
||||
}
|
||||
});
|
||||
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;
|
||||
}
|
||||
});
|
||||
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
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user