~ubuntu-branches/ubuntu/natty/moin/natty-updates

« back to all changes in this revision

Viewing changes to MoinMoin/web/static/htdocs/applets/moinFCKplugins/selection/fckplugin.js

  • Committer: Bazaar Package Importer
  • Author(s): Jonas Smedegaard
  • Date: 2008-06-22 21:17:13 UTC
  • mto: This revision was merged to the branch mainline in revision 18.
  • Revision ID: james.westby@ubuntu.com-20080622211713-inlv5k4eifxckelr
ImportĀ upstreamĀ versionĀ 1.7.0

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
// debug function.
2
 
// TODO : make common javascript class and extract this one
3
 
function showObj(title, obj)
4
 
{ // show an object in a alert box
5
 
  var res = '';
6
 
  res += title+': '+obj+'\n\n';
7
 
  for (temp in obj)
8
 
  {
9
 
    res += temp+': '+obj[temp]+', ';
10
 
  }
11
 
  res += '\n';
12
 
  alert(res);
13
 
}
14
 
 
15
 
 
16
 
/* 
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.
20
 
 */
21
 
var sAlert = "";
22
 
 
23
 
var Alert = function(sText)
24
 
{
25
 
  if (sText!=sAlert)
26
 
  {
27
 
    sAlert = sText;
28
 
    alert(sText);
29
 
  }
30
 
}
31
 
 
32
 
 
33
 
 
34
 
/**
35
 
 * range usage is different on each browser
36
 
 * internet explorer use Microsoft Text Range and others use W3C Range
37
 
 * 
38
 
 * follow link describe that
39
 
 * http://www.quirksmode.org/dom/range_intro.html#t00
40
 
 *
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
46
 
 */
47
 
 
48
 
 
49
 
// --------------------------------
50
 
// IE
51
 
// --------------------------------
52
 
if (sSuffix == 'ie') {
53
 
  // initialize startNode and endNode
54
 
  function invalidSelection()
55
 
  {
56
 
      FCKSelection._startNode = null;
57
 
      FCKSelection._endNode = null;
58
 
  }
59
 
 
60
 
  // everytime selection changed. initialize internal variables 
61
 
  FCK.AttachToOnSelectionChange(invalidSelection);
62
 
 
63
 
  FCKSelection._startNode = null;
64
 
  FCKSelection._endNode = null;
65
 
 
66
 
 
67
 
  // get start node of seleced element
68
 
  FCKSelection.GetStartNode = function()
69
 
  {
70
 
    if (!FCKSelection._startNode) 
71
 
    {
72
 
      FCKSelection._startNode = FCKSelection._getStartNode()
73
 
    }
74
 
    return FCKSelection._startNode;
75
 
  }
76
 
 
77
 
  
78
 
  FCKSelection._getStartNode = function()
79
 
  {
80
 
    if (FCKSelection._startNode) return FCKSelection._startNode;
81
 
 
82
 
    var oRange = FCKSelection.GetSelection().createRange();
83
 
 
84
 
    if (FCKSelection.GetType()=="Control")
85
 
    {
86
 
      return oRange.item(0);
87
 
    }
88
 
    else // Text, None
89
 
    {
90
 
      var oTmpRange = FCKSelection.GetSelection().createRange();
91
 
      var parent = oRange.parentElement();
92
 
      var oNode = null;
93
 
      var following_text = 0;
94
 
 
95
 
      // selection in empty tag
96
 
      if ( !parent.hasChildNodes() ) 
97
 
        return parent; 
98
 
 
99
 
      // the first child of the parent of the selection
100
 
      oNode = parent.firstChild;
101
 
      var oLastText = oNode;
102
 
 
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)
107
 
      while (oNode)
108
 
      {
109
 
        if (oNode.nodeName != "#text") 
110
 
        {
111
 
          following_text = false;
112
 
          oTmpRange.moveToElementText(oNode);
113
 
          if (oRange.compareEndPoints('StartToEnd', oTmpRange)<0)
114
 
          {
115
 
            // found
116
 
            if (oRange.compareEndPoints('StartToStart', oTmpRange)<=0)
117
 
              return oLastText; // already inside selection
118
 
 
119
 
            oNode = oNode.firstChild;
120
 
          }
121
 
          else 
122
 
          {
123
 
            oNode = oNode.nextSibling;
124
 
          }
125
 
        }
126
 
        else // oNode.nodeName == '#text'
127
 
        {
128
 
          if (!following_text)
129
 
          {
130
 
            oLastText = oNode;
131
 
            following_text = true;
132
 
          }
133
 
 
134
 
          try {
135
 
            oNode = oNode.nextSibling;
136
 
          }
137
 
          catch (e) {
138
 
            if (parent.childNodes.length>=2)
139
 
            {
140
 
              oNode = parent.childNodes[1];
141
 
            }
142
 
            else 
143
 
            {
144
 
              return parent;
145
 
            }
146
 
          } // end of catch
147
 
        } // end of else
148
 
      } // end of while
149
 
      return oLastText;
150
 
    } // end of else
151
 
  }
152
 
 
153
 
  // getting start node offset
154
 
  FCKSelection.GetStartOffset = function() 
155
 
  {
156
 
    // XXX does not work yet!
157
 
    var oNode = FCKSelection.GetStartNode();
158
 
    
159
 
    // not a text node 
160
 
    if (oNode.nodeType != 3) 
161
 
      return 0; 
162
 
 
163
 
    var startoffset = 0;
164
 
    var selrange = FCKSelection.GetSelection().createRange();
165
 
    var elrange = selrange.duplicate();
166
 
 
167
 
    if (oNode.previousSilbing)
168
 
    {
169
 
      elrange.moveToElementText(oNode.previousSibling);
170
 
      while (selrange.compareEndPoints('StartToEnd', elrange) > 0) 
171
 
      {
172
 
        startoffset++;
173
 
        elrange.moveEnd('character', 1);
174
 
      }
175
 
    }
176
 
    else
177
 
    { 
178
 
      elrange.moveToElementText(oNode.parentNode);
179
 
      while (selrange.compareEndPoints('StartToStart', elrange) > 0) 
180
 
      {
181
 
        startoffset++;
182
 
        elrange.moveStart('character', 1);
183
 
      }
184
 
    }
185
 
    return startoffset;
186
 
  }
187
 
 
188
 
  // get end node of seleced element
189
 
  FCKSelection.GetEndNode = function()
190
 
  {
191
 
    if (!FCKSelection._endNode) 
192
 
    {
193
 
      FCKSelection._endNode = FCKSelection._getEndNode()
194
 
    }
195
 
    return FCKSelection._endNode;
196
 
  }
197
 
 
198
 
 
199
 
  FCKSelection._getEndNode = function()
200
 
  {
201
 
    FCKSelection.sEnd = "";
202
 
    var oRange = FCKSelection.GetSelection().createRange();
203
 
 
204
 
    if (FCKSelection.GetType()=="Control")
205
 
    {
206
 
      return oRange.item(oRange.length-1);
207
 
    }
208
 
    else // Text, None
209
 
    {
210
 
      var oTmpRange = FCKSelection.GetSelection().createRange();
211
 
      var oNode = oRange.parentElement()
212
 
      var following_text = false;
213
 
 
214
 
      // selection in empty tag
215
 
      if (!oNode.hasChildNodes()) 
216
 
        return oNode; 
217
 
 
218
 
      oNode = oNode.lastChild;
219
 
 
220
 
      var oLastText = oNode;
221
 
 
222
 
      while (oNode)
223
 
      {
224
 
        if (oNode.nodeName!="#text") 
225
 
        {
226
 
          following_text = false;
227
 
          oTmpRange.moveToElementText(oNode);
228
 
 
229
 
          if (oRange.compareEndPoints('EndToStart', oTmpRange)>0)
230
 
          {
231
 
            if (oRange.compareEndPoints('EndToEnd', oTmpRange)>=0)
232
 
              return oLastText; // already in selection
233
 
              
234
 
            // found
235
 
            FCKSelection.sEnd += oNode.nodeName + "->";
236
 
            oNode = oNode.lastChild;
237
 
 
238
 
            if (oNode) 
239
 
              FCKSelection.sEnd += oNode.nodeName + ";";
240
 
          }
241
 
          else 
242
 
          {
243
 
            oNode = oNode.previousSibling;
244
 
          }
245
 
        }
246
 
        else
247
 
        {
248
 
          if (!following_text)
249
 
          {
250
 
            oLastText = oNode;
251
 
            following_text = true;
252
 
          }
253
 
 
254
 
          try
255
 
          {
256
 
            oNode = oNode.previousSibling;
257
 
          } 
258
 
          catch (e) 
259
 
          {
260
 
            return oRange.parentElement();
261
 
          } // end of catch
262
 
        } // end of else
263
 
      } // end of while
264
 
      return oLastText;
265
 
    } // end of else
266
 
  } // end of function
267
 
 
268
 
 
269
 
  // getting offset of end node
270
 
  FCKSelection.GetEndOffset = function() 
271
 
  {
272
 
    var oNode = FCKSelection.GetEndNode();
273
 
 
274
 
    // not a text node 
275
 
    if (oNode.nodeType != 3)
276
 
      return 0; 
277
 
 
278
 
    var endoffset = 0;
279
 
    var selrange = FCKSelection.GetSelection().createRange();
280
 
    var elrange = selrange.duplicate();
281
 
 
282
 
    if (oNode.nextSilbing)
283
 
    {
284
 
      elrange.moveToElementText(oNode.nextSibling);
285
 
      while (selrange.compareEndPoints('EndToStart', elrange) < 0) 
286
 
      {
287
 
        endoffset++;
288
 
        elrange.moveStart('character', -1);
289
 
      }
290
 
    }
291
 
    else 
292
 
    {
293
 
      elrange.moveToElementText(oNode.parentNode);
294
 
      while (selrange.compareEndPoints('EndToEnd', elrange) < 0) 
295
 
      {
296
 
        endoffset++;
297
 
        elrange.moveStart('character', -11);
298
 
      }
299
 
    }
300
 
    return endoffset;
301
 
  }
302
 
 
303
 
  // return selected node's text
304
 
  FCKSelection.GetText = function()
305
 
  {
306
 
    var oRange = FCKSelection.GetSelection().createRange();
307
 
    return oRange.text;
308
 
  }
309
 
 
310
 
  // return true if selected node's type is None
311
 
  FCKSelection.IsCollapsed = function()
312
 
  {
313
 
    return FCKSelection.GetType() == 'None';
314
 
  }
315
 
}
316
 
// --------------------------------
317
 
// Others (firefox, safari, opera, ..)
318
 
// --------------------------------
319
 
else {
320
 
  // assume exactly one selection. only first selection accepted.
321
 
  FCKSelection.GetStartNode = function()
322
 
    {
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;
328
 
 
329
 
      // if oContainer has children return child at iOffset
330
 
      // otherwise return oContainer
331
 
      if (oContainer.childNodes.length > iOffset) 
332
 
        return oContainer.childNodes[iOffset];
333
 
      else
334
 
        return oContainer;
335
 
    }
336
 
 
337
 
  FCKSelection.GetStartOffset = function()
338
 
  {
339
 
    var oSelection = FCKSelection.GetSelection();
340
 
    return oSelection.getRangeAt(0).startOffset;
341
 
  }
342
 
 
343
 
  FCKSelection.GetEndNode = function()
344
 
  {
345
 
    var oSelection = FCKSelection.GetSelection();
346
 
    var oContainer = oSelection.getRangeAt(0).endContainer;
347
 
    var iOffset = oSelection.getRangeAt(0).startEndset;
348
 
 
349
 
    if (oContainer.childNodes.length>iOffset) 
350
 
      return oContainer.childNodes[iOffset];
351
 
    else
352
 
      return oContainer;
353
 
  }
354
 
 
355
 
  FCKSelection.GetEndOffset = function()
356
 
  {
357
 
    var oSelection = FCKSelection.GetSelection();
358
 
    return oSelection.getRangeAt(0).endOffset;    
359
 
  }
360
 
 
361
 
  FCKSelection.IsCollapsed = function()
362
 
  {
363
 
    var oSelection = FCKSelection.GetSelection();
364
 
    return oSelection.getRangeAt(0).collapsed;
365
 
  }
366
 
 
367
 
  FCKSelection.GetText = function()
368
 
  {
369
 
    return FCKSelection.GetSelection().toString();
370
 
  }
371
 
}
372
 
 
373
 
 
374
 
 
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)
378
 
{
379
 
  var oStart = FCKSelection.GetStartNode();
380
 
  var oEnd = FCKSelection.GetEndNode();
381
 
 
382
 
  // filtering invalid input and selection
383
 
  if (!oStart || !oEnd || !pattern){
384
 
    return 0;
385
 
  }
386
 
  
387
 
  /* Crashes IE
388
 
  if ((FCKSelection.GetType()=="None") && (oStart!=oEnd))
389
 
  {
390
 
    FCKSelection.GetParentElement().normalize();
391
 
    var oStart = FCKSelection.GetStartNode();
392
 
    var oEnd = FCKSelection.GetEndNode();
393
 
  }
394
 
  */
395
 
 
396
 
  // Check surrounding nodes
397
 
  var oElement = oStart;
398
 
 
399
 
  while (oElement)
400
 
  {
401
 
    if (pattern.test(oElement.nodeName))
402
 
    { 
403
 
      //Alert("Start:" + oStart.nodeName + ':' + oElement.nodeName + 
404
 
      //      ':' + oEnd.nodeName);
405
 
      return FCK_TRISTATE_DISABLED;
406
 
    }
407
 
    oElement = oElement.parentNode;
408
 
  }
409
 
 
410
 
  oElement = oEnd;
411
 
  while (oElement)
412
 
  {
413
 
    if (pattern.test(oElement.nodeName))
414
 
    { 
415
 
      //Alert("End:" + oStart.nodeName + ':' + oElement.nodeName + 
416
 
      //      ':' + oEnd.nodeName);
417
 
      return FCK_TRISTATE_DISABLED;
418
 
    }
419
 
    oElement = oElement.parentNode;
420
 
  }
421
 
 
422
 
  if (FCKSelection.IsCollapsed()) 
423
 
  {
424
 
    return 0;
425
 
  }
426
 
 
427
 
  // check selected nodes
428
 
  var oNode = oStart;
429
 
 
430
 
  while (oNode)
431
 
  {
432
 
    if (pattern.test(oNode.nodeName))
433
 
    {
434
 
      /*
435
 
      Alert("Down:" + oStart.nodeName + ':' + oNode.nodeName + ':' + 
436
 
            oEnd.nodeName + FCKSelection.GetStartOffset() + ":" +
437
 
            FCKSelection.GetEndOffset());
438
 
      */
439
 
      return FCK_TRISTATE_DISABLED;
440
 
    }
441
 
 
442
 
    if (oNode==oEnd && oNode!=oStart)
443
 
    {
444
 
      return 0;
445
 
    }
446
 
 
447
 
    if (oNode.hasChildNodes()) 
448
 
    {
449
 
      oNode = oNode.firstChild;
450
 
    }
451
 
    else
452
 
    {
453
 
      // happens if oStart==oEnd && no children
454
 
      if (oNode==oEnd) 
455
 
        return 0; 
456
 
 
457
 
      while (!oNode.nextSibling) 
458
 
      {
459
 
        oNode = oNode.parentNode;
460
 
 
461
 
        if (!oNode) return 0;
462
 
 
463
 
        if (pattern.test(oNode.nodeName))
464
 
        {
465
 
          //Alert("Up:" + oStart.nodeName +':'+ oNode.nodeName + ':' + 
466
 
          //          oEnd.nodeName);
467
 
          return FCK_TRISTATE_DISABLED;
468
 
        }
469
 
 
470
 
        if (oNode==oEnd) return 0;
471
 
      }
472
 
      oNode = oNode.nextSibling;
473
 
    }
474
 
  }
475
 
  return 0;
476
 
}