2
// TODO : make common javascript class and extract this one
3
function showObj(title, obj)
4
{ // show an object in a alert box
6
res += title+': '+obj+'\n\n';
9
res += temp+': '+obj[temp]+', ';
17
* Checks if the name of any of the selected nodes or the nodes surrounding
18
* the selection match the pattern RE.
19
* Returns FCK_TRISTATE_DISABLED insted of true.
23
var Alert = function(sText)
35
* range usage is different on each browser
36
* internet explorer use Microsoft Text Range and others use W3C Range
38
* follow link describe that
39
* http://www.quirksmode.org/dom/range_intro.html#t00
41
* because of this reason getting something on selected node is divided 2 part
42
* first for internet explorer and second for others
43
* each codes implement same function do same behavior
44
* to understand following code. it's better others part first.
45
* it's more easy and short
49
// --------------------------------
51
// --------------------------------
52
if (sSuffix == 'ie') {
53
// initialize startNode and endNode
54
function invalidSelection()
56
FCKSelection._startNode = null;
57
FCKSelection._endNode = null;
60
// everytime selection changed. initialize internal variables
61
FCK.AttachToOnSelectionChange(invalidSelection);
63
FCKSelection._startNode = null;
64
FCKSelection._endNode = null;
67
// get start node of seleced element
68
FCKSelection.GetStartNode = function()
70
if (!FCKSelection._startNode)
72
FCKSelection._startNode = FCKSelection._getStartNode()
74
return FCKSelection._startNode;
78
FCKSelection._getStartNode = function()
80
if (FCKSelection._startNode) return FCKSelection._startNode;
82
var oRange = FCKSelection.GetSelection().createRange();
84
if (FCKSelection.GetType()=="Control")
86
return oRange.item(0);
90
var oTmpRange = FCKSelection.GetSelection().createRange();
91
var parent = oRange.parentElement();
93
var following_text = 0;
95
// selection in empty tag
96
if ( !parent.hasChildNodes() )
99
// the first child of the parent of the selection
100
oNode = parent.firstChild;
101
var oLastText = oNode;
103
// looping all lower nodes of the parent of selected object
104
// and compare it with first selected node
105
// if oNode is not a text compare start of oRange and end of oTmpRange
106
// and then compare start of both range(oRange, oTmpRange)
109
if (oNode.nodeName != "#text")
111
following_text = false;
112
oTmpRange.moveToElementText(oNode);
113
if (oRange.compareEndPoints('StartToEnd', oTmpRange)<0)
116
if (oRange.compareEndPoints('StartToStart', oTmpRange)<=0)
117
return oLastText; // already inside selection
119
oNode = oNode.firstChild;
123
oNode = oNode.nextSibling;
126
else // oNode.nodeName == '#text'
131
following_text = true;
135
oNode = oNode.nextSibling;
138
if (parent.childNodes.length>=2)
140
oNode = parent.childNodes[1];
153
// getting start node offset
154
FCKSelection.GetStartOffset = function()
156
// XXX does not work yet!
157
var oNode = FCKSelection.GetStartNode();
160
if (oNode.nodeType != 3)
164
var selrange = FCKSelection.GetSelection().createRange();
165
var elrange = selrange.duplicate();
167
if (oNode.previousSilbing)
169
elrange.moveToElementText(oNode.previousSibling);
170
while (selrange.compareEndPoints('StartToEnd', elrange) > 0)
173
elrange.moveEnd('character', 1);
178
elrange.moveToElementText(oNode.parentNode);
179
while (selrange.compareEndPoints('StartToStart', elrange) > 0)
182
elrange.moveStart('character', 1);
188
// get end node of seleced element
189
FCKSelection.GetEndNode = function()
191
if (!FCKSelection._endNode)
193
FCKSelection._endNode = FCKSelection._getEndNode()
195
return FCKSelection._endNode;
199
FCKSelection._getEndNode = function()
201
FCKSelection.sEnd = "";
202
var oRange = FCKSelection.GetSelection().createRange();
204
if (FCKSelection.GetType()=="Control")
206
return oRange.item(oRange.length-1);
210
var oTmpRange = FCKSelection.GetSelection().createRange();
211
var oNode = oRange.parentElement()
212
var following_text = false;
214
// selection in empty tag
215
if (!oNode.hasChildNodes())
218
oNode = oNode.lastChild;
220
var oLastText = oNode;
224
if (oNode.nodeName!="#text")
226
following_text = false;
227
oTmpRange.moveToElementText(oNode);
229
if (oRange.compareEndPoints('EndToStart', oTmpRange)>0)
231
if (oRange.compareEndPoints('EndToEnd', oTmpRange)>=0)
232
return oLastText; // already in selection
235
FCKSelection.sEnd += oNode.nodeName + "->";
236
oNode = oNode.lastChild;
239
FCKSelection.sEnd += oNode.nodeName + ";";
243
oNode = oNode.previousSibling;
251
following_text = true;
256
oNode = oNode.previousSibling;
260
return oRange.parentElement();
269
// getting offset of end node
270
FCKSelection.GetEndOffset = function()
272
var oNode = FCKSelection.GetEndNode();
275
if (oNode.nodeType != 3)
279
var selrange = FCKSelection.GetSelection().createRange();
280
var elrange = selrange.duplicate();
282
if (oNode.nextSilbing)
284
elrange.moveToElementText(oNode.nextSibling);
285
while (selrange.compareEndPoints('EndToStart', elrange) < 0)
288
elrange.moveStart('character', -1);
293
elrange.moveToElementText(oNode.parentNode);
294
while (selrange.compareEndPoints('EndToEnd', elrange) < 0)
297
elrange.moveStart('character', -11);
303
// return selected node's text
304
FCKSelection.GetText = function()
306
var oRange = FCKSelection.GetSelection().createRange();
310
// return true if selected node's type is None
311
FCKSelection.IsCollapsed = function()
313
return FCKSelection.GetType() == 'None';
316
// --------------------------------
317
// Others (firefox, safari, opera, ..)
318
// --------------------------------
320
// assume exactly one selection. only first selection accepted.
321
FCKSelection.GetStartNode = function()
323
var oSelection = FCKSelection.GetSelection();
324
// startContainer returns the parent of the first node in the selection
325
var oContainer = oSelection.getRangeAt(0).startContainer;
326
// The offset within the startContainer where the range starts
327
var iOffset = oSelection.getRangeAt(0).startOffset;
329
// if oContainer has children return child at iOffset
330
// otherwise return oContainer
331
if (oContainer.childNodes.length > iOffset)
332
return oContainer.childNodes[iOffset];
337
FCKSelection.GetStartOffset = function()
339
var oSelection = FCKSelection.GetSelection();
340
return oSelection.getRangeAt(0).startOffset;
343
FCKSelection.GetEndNode = function()
345
var oSelection = FCKSelection.GetSelection();
346
var oContainer = oSelection.getRangeAt(0).endContainer;
347
var iOffset = oSelection.getRangeAt(0).startEndset;
349
if (oContainer.childNodes.length>iOffset)
350
return oContainer.childNodes[iOffset];
355
FCKSelection.GetEndOffset = function()
357
var oSelection = FCKSelection.GetSelection();
358
return oSelection.getRangeAt(0).endOffset;
361
FCKSelection.IsCollapsed = function()
363
var oSelection = FCKSelection.GetSelection();
364
return oSelection.getRangeAt(0).collapsed;
367
FCKSelection.GetText = function()
369
return FCKSelection.GetSelection().toString();
375
// this function make toolbar's button enable/disable using inserted pattern.
376
// check coverage contains its parent and children.
377
FCKSelection.CheckForNodeNames = function(pattern)
379
var oStart = FCKSelection.GetStartNode();
380
var oEnd = FCKSelection.GetEndNode();
382
// filtering invalid input and selection
383
if (!oStart || !oEnd || !pattern){
388
if ((FCKSelection.GetType()=="None") && (oStart!=oEnd))
390
FCKSelection.GetParentElement().normalize();
391
var oStart = FCKSelection.GetStartNode();
392
var oEnd = FCKSelection.GetEndNode();
396
// Check surrounding nodes
397
var oElement = oStart;
401
if (pattern.test(oElement.nodeName))
403
//Alert("Start:" + oStart.nodeName + ':' + oElement.nodeName +
404
// ':' + oEnd.nodeName);
405
return FCK_TRISTATE_DISABLED;
407
oElement = oElement.parentNode;
413
if (pattern.test(oElement.nodeName))
415
//Alert("End:" + oStart.nodeName + ':' + oElement.nodeName +
416
// ':' + oEnd.nodeName);
417
return FCK_TRISTATE_DISABLED;
419
oElement = oElement.parentNode;
422
if (FCKSelection.IsCollapsed())
427
// check selected nodes
432
if (pattern.test(oNode.nodeName))
435
Alert("Down:" + oStart.nodeName + ':' + oNode.nodeName + ':' +
436
oEnd.nodeName + FCKSelection.GetStartOffset() + ":" +
437
FCKSelection.GetEndOffset());
439
return FCK_TRISTATE_DISABLED;
442
if (oNode==oEnd && oNode!=oStart)
447
if (oNode.hasChildNodes())
449
oNode = oNode.firstChild;
453
// happens if oStart==oEnd && no children
457
while (!oNode.nextSibling)
459
oNode = oNode.parentNode;
461
if (!oNode) return 0;
463
if (pattern.test(oNode.nodeName))
465
//Alert("Up:" + oStart.nodeName +':'+ oNode.nodeName + ':' +
467
return FCK_TRISTATE_DISABLED;
470
if (oNode==oEnd) return 0;
472
oNode = oNode.nextSibling;