source: trunk/modules/Dialogs/inline-dialog.js @ 999

Last change on this file since 999 was 999, checked in by ray, 11 years ago

#1195 Allow to specify an external url to load a plugin from

  • Property svn:eol-style set to native
  • Property svn:keywords set to LastChangedDate LastChangedRevision LastChangedBy HeadURL Id
File size: 8.5 KB
Line 
1
2  /*--------------------------------------:noTabs=true:tabSize=2:indentSize=2:--
3    --  Xinha (is not htmlArea) - http://xinha.org
4    --
5    --  Use of Xinha is granted by the terms of the htmlArea License (based on
6    --  BSD license)  please read license.txt in this package for details.
7    --
8    --  Copyright (c) 2005-2008 Xinha Developer Team and contributors
9    --
10    --  Xinha was originally based on work by Mihai Bazon which is:
11    --      Copyright (c) 2003-2004 dynarch.com.
12    --      Copyright (c) 2002-2003 interactivetools.com, inc.
13    --      This copyright notice MUST stay intact for use.
14    --
15    --  This is the implementation of the inline dialog (as use by the Linker plugin)
16    --
17    -- 
18    --
19    --
20    --  $HeadURL:http://svn.xinha.webfactional.com/trunk/modules/Dialogs/inline-dialog.js $
21    --  $LastChangedDate:2008-04-12 19:10:04 +0200 (Sa, 12 Apr 2008) $
22    --  $LastChangedRevision:990 $
23    --  $LastChangedBy:ray $
24    --------------------------------------------------------------------------*/
25Xinha.Dialog = function(editor, html, localizer)
26{
27  this.id    = { };
28  this.r_id  = { }; // reverse lookup id
29  this.editor   = editor;
30  this.document = document;
31
32  this.rootElem = document.createElement('div');
33  this.rootElem.className = 'dialog';
34  this.rootElem.style.position = 'absolute';
35  this.rootElem.style.display  = 'none';
36  this.editor._framework.ed_cell.insertBefore(this.rootElem, this.editor._framework.ed_cell.firstChild);
37  this.rootElem.style.width  = this.width  =  this.editor._framework.ed_cell.offsetWidth + 'px';
38  this.rootElem.style.height = this.height =  this.editor._framework.ed_cell.offsetHeight + 'px';
39
40  var dialog = this;
41  if(typeof localizer == 'function')
42  {
43    this._lc = localizer;
44  }
45  else if(localizer)
46  {
47    this._lc = function(string)
48    {
49      return Xinha._lc(string,localizer);
50    };
51  }
52  else
53  {
54    this._lc = function(string)
55    {
56      return string;
57    };
58  }
59
60  html = html.replace(/\[([a-z0-9_]+)\]/ig,
61                      function(fullString, id)
62                      {
63                        if(typeof dialog.id[id] == 'undefined')
64                        {
65                          dialog.id[id] = Xinha.uniq('Dialog');
66                          dialog.r_id[dialog.id[id]] = id;
67                        }
68                        return dialog.id[id];
69                      }
70             ).replace(/<l10n>(.*?)<\/l10n>/ig,
71                       function(fullString,translate)
72                       {
73                         return dialog._lc(translate) ;
74                       }
75             ).replace(/="_\((.*?)\)"/g,
76                       function(fullString, translate)
77                       {
78                         return '="' + dialog._lc(translate) + '"';
79                       }
80             );
81
82  this.rootElem.innerHTML = html;
83
84
85
86
87  this.editor.notifyOn
88   ('resize',
89      function(e, args)
90      {
91        dialog.rootElem.style.width  = dialog.width  =  dialog.editor._framework.ed_cell.offsetWidth + 'px';
92        dialog.rootElem.style.height = dialog.height =  dialog.editor._framework.ed_cell.offsetHeight + 'px';
93        dialog.onresize();
94      }
95    );
96};
97
98Xinha.Dialog.prototype.onresize = function()
99{
100  return true;
101};
102
103Xinha.Dialog.prototype.show = function(values)
104{
105  // We need to preserve the selection for IE
106  if(Xinha.is_ie)
107  {
108    this._lastRange = this.editor._createRange(this.editor._getSelection());
109  }
110
111  if(typeof values != 'undefined')
112  {
113    this.setValues(values);
114  }
115  this._restoreTo = [this.editor._textArea.style.display, this.editor._iframe.style.visibility, this.editor.hidePanels()];
116
117  this.editor._textArea.style.display = 'none';
118  this.editor._iframe.style.visibility   = 'hidden';
119  this.rootElem.style.display   = '';
120};
121
122Xinha.Dialog.prototype.hide = function()
123{
124  this.rootElem.style.display         = 'none';
125  this.editor._textArea.style.display = this._restoreTo[0];
126  this.editor._iframe.style.visibility   = this._restoreTo[1];
127  this.editor.showPanels(this._restoreTo[2]);
128
129  // Restore the selection
130  if(Xinha.is_ie)
131  {
132    this._lastRange.select();
133  }
134  this.editor.updateToolbar();
135  return this.getValues();
136};
137
138Xinha.Dialog.prototype.toggle = function()
139{
140  if(this.rootElem.style.display == 'none')
141  {
142    this.show();
143  }
144  else
145  {
146    this.hide();
147  }
148};
149
150Xinha.Dialog.prototype.setValues = function(values)
151{
152  for(var i in values)
153  {
154    var elems = this.getElementsByName(i);
155    if(!elems) continue;
156    for(var x = 0; x < elems.length; x++)
157    {
158      var e = elems[x];
159      switch(e.tagName.toLowerCase())
160      {
161        case 'select'  :
162        {
163          for(var j = 0; j < e.options.length; j++)
164          {
165            if(typeof values[i] == 'object')
166            {
167              for(var k = 0; k < values[i].length; k++)
168              {
169                if(values[i][k] == e.options[j].value)
170                {
171                  e.options[j].selected = true;
172                }
173              }
174            }
175            else if(values[i] == e.options[j].value)
176            {
177              e.options[j].selected = true;
178            }
179          }
180          break;
181        }
182
183
184        case 'textarea':
185        case 'input'   :
186        {
187          switch(e.getAttribute('type'))
188          {
189            case 'radio'   :
190            {
191              if(e.value == values[i])
192              {
193                e.checked = true;
194              }
195              break;
196            }
197
198            case 'checkbox':
199            {
200              if(typeof values[i] == 'object')
201              {
202                for(var j in values[i])
203                {
204                  if(values[i][j] == e.value)
205                  {
206                    e.checked = true;
207                  }
208                }
209              }
210              else
211              {
212                if(values[i] == e.value)
213                {
214                  e.checked = true;
215                }
216              }
217              break;
218            }
219
220            default    :
221            {
222              e.value = values[i];
223            }
224          }
225          break;
226        }
227
228        default        :
229        break;
230      }
231    }
232  }
233};
234
235Xinha.Dialog.prototype.getValues = function()
236{
237  var values = [ ];
238  var inputs = Xinha.collectionToArray(this.rootElem.getElementsByTagName('input'))
239              .append(Xinha.collectionToArray(this.rootElem.getElementsByTagName('textarea')))
240              .append(Xinha.collectionToArray(this.rootElem.getElementsByTagName('select')));
241
242  for(var x = 0; x < inputs.length; x++)
243  {
244    var i = inputs[x];
245    if(!(i.name && this.r_id[i.name])) continue;
246
247    if(typeof values[this.r_id[i.name]] == 'undefined')
248    {
249      values[this.r_id[i.name]] = null;
250    }
251    var v = values[this.r_id[i.name]];
252
253    switch(i.tagName.toLowerCase())
254    {
255      case 'select':
256      {
257        if(i.multiple)
258        {
259          if(!v.push)
260          {
261            if(v != null)
262            {
263              v = [v];
264            }
265            else
266            {
267              v = new Array();
268            }
269          }
270          for(var j = 0; j < i.options.length; j++)
271          {
272            if(i.options[j].selected)
273            {
274              v.push(i.options[j].value);
275            }
276          }
277        }
278        else
279        {
280          if(i.selectedIndex >= 0)
281          {
282            v = i.options[i.selectedIndex];
283          }
284        }
285        break;
286      }
287
288      case 'textarea':
289      case 'input'   :
290      default        :
291      {
292        switch(i.type.toLowerCase())
293        {
294          case  'radio':
295          {
296            if(i.checked)
297            {
298              v = i.value;
299              break;
300            }
301          }
302
303          case 'checkbox':
304          {
305            if(v == null)
306            {
307              if(this.getElementsByName(this.r_id[i.name]).length > 1)
308              {
309                v = new Array();
310              }
311            }
312
313            if(i.checked)
314            {
315              if(v != null && typeof v == 'object' && v.push)
316              {
317                v.push(i.value);
318              }
319              else
320              {
321                v = i.value;
322              }
323            }
324            break;
325          }
326
327          default   :
328          {
329            v = i.value;
330            break;
331          }
332        }
333      }
334
335    }
336
337    values[this.r_id[i.name]] = v;
338  }
339  return values;
340};
341
342Xinha.Dialog.prototype.getElementById = function(id)
343{
344  return this.document.getElementById(this.id[id] ? this.id[id] : id);
345};
346
347Xinha.Dialog.prototype.getElementsByName = function(name)
348{
349  return this.document.getElementsByName(this.id[name] ? this.id[name] : name);
350};
Note: See TracBrowser for help on using the repository browser.