Changeset 782 for branches


Ignore:
Timestamp:
03/14/07 20:24:45 (12 years ago)
Author:
ray
Message:

upated branch

Location:
branches/ray
Files:
1 added
8 edited

Legend:

Unmodified
Added
Removed
  • branches/ray/Xinha.css

    r775 r782  
    287287.loading 
    288288{ 
    289   background-color:#666; 
    290289  position:absolute; 
    291290  z-index:998; 
     291  text-align:center; 
     292  width:212px; 
     293  padding: 55px 0 5px 0; 
     294  border:2px solid #ccc; 
     295  /* border-color: ButtonHighlight ButtonShadow ButtonShadow ButtonHighlight;*/ 
     296  background: url(images/xinha_logo.gif) no-repeat #fff center 5px; 
    292297} 
    293298.loading_main 
    294299{ 
    295   font-size:1.6em; 
    296   color:#ff6; 
    297   text-align:center; 
     300  font-size:11px; 
     301  color:#000; 
     302  
    298303} 
    299304.loading_sub 
    300305{ 
    301   font-size:1.0em; 
    302   color:#fff; 
    303   text-align:center; 
    304 } 
     306  font-size:9px; 
     307  color:#666; 
     308} 
  • branches/ray/XinhaCore.js

    r775 r782  
    182182    h: textarea.style.height ? textarea.style.height : ( textarea.offsetHeight ? ( textarea.offsetHeight + 'px' ) : ( textarea.rows + 'em') ) 
    183183  }; 
    184   // Create the loading message elements 
    185   if ( this.config.showLoading ) 
    186   { 
    187     // Create and show the main loading message and the sub loading message for details of loading actions 
    188     // global element 
    189     var loading_message = document.createElement("div"); 
    190     loading_message.id = "loading_" + textarea.name; 
    191     loading_message.className = "loading"; 
    192     try 
    193     { 
    194       // how can i find the real width in pixels without % or em *and* with no visual errors ? 
    195       // for instance, a textarea with a style="width:100%" and the body padding > 0 result in a horizontal scrollingbar while loading 
    196       // A few lines above seems to indicate offsetWidth is not always set 
    197       loading_message.style.width = textarea.offsetWidth + 'px'; 
    198     } 
    199     catch (ex) 
    200     { 
    201       // offsetWidth seems not set, so let's use this._initial_ta_size.w, but sometimes it may be too huge width 
    202       loading_message.style.width = this._initial_ta_size.w; 
    203     } 
    204     loading_message.style.left = Xinha.findPosX(textarea) +  'px'; 
    205     loading_message.style.top = (Xinha.findPosY(textarea) + parseInt(this._initial_ta_size.h, 10) / 2) +  'px'; 
    206     // main static message 
    207     var loading_main = document.createElement("div"); 
    208     loading_main.className = "loading_main"; 
    209     loading_main.id = "loading_main_" + textarea.name; 
    210     loading_main.appendChild(document.createTextNode(Xinha._lc("Loading in progress. Please wait !"))); 
    211     // sub dynamic message 
    212     var loading_sub = document.createElement("div"); 
    213     loading_sub.className = "loading_sub"; 
    214     loading_sub.id = "loading_sub_" + textarea.name; 
    215     loading_sub.appendChild(document.createTextNode(Xinha._lc("Constructing main object"))); 
    216     loading_message.appendChild(loading_main); 
    217     loading_message.appendChild(loading_sub); 
    218     document.body.appendChild(loading_message); 
    219     this.setLoadingMessage("Constructing object"); 
     184 
     185  if ( document.getElementById("loading_" + textarea.id) || this.config.showLoading ) 
     186  { 
     187    if (!document.getElementById("loading_" + textarea.id)) 
     188    { 
     189        Xinha.createLoadingMessage(textarea); 
     190    } 
     191    this.setLoadingMessage(Xinha._lc("Constructing object")); 
    220192  } 
    221193 
     
    732704    side = 'right'; 
    733705  } 
    734   this.setLoadingMessage('Register panel ' + side); 
     706  this.setLoadingMessage(Xinha._lc('Register '+ side + 'panel')); 
    735707  var panel = this.addPanel(side); 
    736708  if ( object ) 
     
    982954Xinha.prototype._createToolbar = function () 
    983955{ 
    984   this.setLoadingMessage('Create Toolbar'); 
     956  this.setLoadingMessage(Xinha._lc('Create Toolbar')); 
    985957  var editor = this;    // to access this in nested functions 
    986958 
     
    15021474Xinha.prototype._createStatusBar = function() 
    15031475{ 
    1504   this.setLoadingMessage('Create StatusBar'); 
     1476  this.setLoadingMessage(Xinha._lc('Create StatusBar')); 
    15051477  var statusbar = document.createElement("div"); 
    15061478  statusbar.className = "statusBar"; 
     
    15401512  var i; 
    15411513  var editor = this;  // we'll need "this" in some nested functions 
     1514  var url; 
     1515   
     1516  if (!document.getElementById("XinhaCoreDesign")) 
     1517  { 
     1518    Xinha.loadStyle(typeof _editor_css == "string" ? _editor_css : "Xinha.css",null,"XinhaCoreDesign"); 
     1519  } 
    15421520   
    15431521  // Now load a specific browser plugin which will implement the above for us. 
    15441522  if (Xinha.is_ie) 
    15451523  { 
    1546     if ( typeof InternetExplorer == 'undefined' ) 
     1524    url = _editor_url + 'modules/InternetExplorer/InternetExplorer.js'; 
     1525    if ( typeof InternetExplorer == 'undefined' && !document.getElementById(url) ) 
    15471526    {             
    1548       Xinha.loadPlugin("InternetExplorer", function() { editor.generate(); }, _editor_url + 'modules/InternetExplorer/InternetExplorer.js' ); 
     1527      Xinha.loadPlugin("InternetExplorer", function() { editor.generate(); }, url ); 
    15491528      return false; 
    15501529    } 
     
    15531532  else 
    15541533  { 
    1555     if ( typeof Gecko == 'undefined' ) 
     1534    url = _editor_url + 'modules/Gecko/Gecko.js'; 
     1535    if ( typeof Gecko == 'undefined' && !document.getElementById(url) ) 
    15561536    {             
    1557       Xinha.loadPlugin("Gecko", function() { editor.generate(); }, _editor_url + 'modules/Gecko/Gecko.js' ); 
     1537      Xinha.loadPlugin("Gecko", function() { editor.generate(); }, url ); 
    15581538      return false; 
    15591539    } 
     
    15611541  } 
    15621542 
    1563   this.setLoadingMessage('Generate Xinha object'); 
    1564  
    1565   if ( typeof Dialog == 'undefined' ) 
    1566   { 
    1567     Xinha._loadback(_editor_url + 'modules/Dialogs/dialog.js', this.generate, this ); 
     1543  url = _editor_url + 'modules/Dialogs/dialog.js'; 
     1544  if ( typeof Dialog == 'undefined' && !document.getElementById(url) ) 
     1545  { 
     1546    Xinha._loadback( url, this.generate, this ); 
    15681547    return false; 
    15691548  } 
    15701549 
    1571   if ( typeof Xinha.Dialog == 'undefined' ) 
    1572   { 
    1573     Xinha._loadback(_editor_url + 'modules/Dialogs/inline-dialog.js', this.generate, this ); 
     1550  url = _editor_url + 'modules/Dialogs/inline-dialog.js'; 
     1551  if ( typeof Xinha.Dialog == 'undefined' && !document.getElementById(url) ) 
     1552  { 
     1553    Xinha._loadback( url , this.generate, this ); 
    15741554    return false; 
    15751555  } 
    15761556   
    1577   if ( typeof FullScreen == "undefined" ) 
    1578   { 
    1579     Xinha.loadPlugin("FullScreen", function() { editor.generate(); }, _editor_url + 'modules/FullScreen/full-screen.js' ); 
     1557  url = _editor_url + 'modules/FullScreen/full-screen.js'; 
     1558  if ( typeof FullScreen == "undefined" && !document.getElementById(url) ) 
     1559  { 
     1560    Xinha.loadPlugin("FullScreen", function() { editor.generate(); }, url ); 
    15801561    return false; 
    15811562  } 
     1563   
     1564  url = _editor_url + 'modules/ColorPicker/ColorPicker.js'; 
     1565  if ( typeof ColorPicker == 'undefined' && !document.getElementById(url) ) 
     1566  { 
     1567    Xinha.loadPlugin("ColorPicker", function() { editor.generate(); } , url ); 
     1568    return false; 
     1569  } 
     1570  else if ( typeof ColorPicker != 'undefined') editor.registerPlugin('ColorPicker'); 
    15821571 
    15831572  var toolbar = editor.config.toolbar; 
     
    15921581        break; 
    15931582        case "insertimage": 
    1594           if ( typeof InsertImage == 'undefined' && typeof Xinha.prototype._insertImage == 'undefined' ) 
     1583          url = _editor_url + 'modules/InsertImage/InsertImage.js'; 
     1584          if ( typeof InsertImage == 'undefined' && typeof Xinha.prototype._insertImage == 'undefined' && !document.getElementById(url) ) 
    15951585          { 
    1596             var url = (this.config.URIs.insert_image != _editor_url + "modules/InsertImage/insert_image.html") ? _editor_url + "modules/InsertImage/insert_image.js" : _editor_url + "modules/InsertImage/InsertImage.js"; 
    1597             Xinha.loadPlugin("InsertImage", function() { editor.generate(); } , _editor_url + 'modules/InsertImage/InsertImage.js'); 
     1586            Xinha.loadPlugin("InsertImage", function() { editor.generate(); } , url ); 
    15981587            return false; 
    15991588          } 
     
    16011590        break; 
    16021591        case "createlink": 
    1603           if ( typeof CreateLink == 'undefined' && typeof Xinha.prototype._createLink == 'undefined' &&  typeof Linker == 'undefined' ) 
     1592          url = _editor_url + 'modules/CreateLink/CreateLink.js'; 
     1593          if ( typeof CreateLink == 'undefined' && typeof Xinha.prototype._createLink == 'undefined' &&  typeof Linker == 'undefined' && !document.getElementById(url)) 
    16041594          { 
    1605             var url = (this.config.URIs.link != _editor_url + "modules/CreateLink/link.html") ? _editor_url + "modules/CreateLink/link.js" : _editor_url + "modules/CreateLink/CreateLink.js"; 
    1606                 Xinha.loadPlugin("CreateLink", function() { editor.generate(); } , url); 
     1595            Xinha.loadPlugin("CreateLink", function() { editor.generate(); } , url ); 
    16071596            return false; 
    16081597          } 
     
    16101599        break; 
    16111600        case "inserttable": 
    1612           if ( typeof InsertTable == 'undefined' && typeof Xinha.prototype._insertTable == 'undefined' ) 
     1601          url = _editor_url + 'modules/InsertTable/InsertTable.js'; 
     1602          if ( typeof InsertTable == 'undefined' && typeof Xinha.prototype._insertTable == 'undefined' && !document.getElementById(url) ) 
    16131603          { 
    1614             var url = (this.config.URIs.insert_table != _editor_url + "modules/InsertTable/insert_table.html") ? _editor_url + "modules/InsertTable/insert_table.js" : _editor_url + "modules/InsertTable/InsertTable.js"; 
    1615                 Xinha.loadPlugin("InsertTable", function() { editor.generate(); } , url); 
     1604            Xinha.loadPlugin("InsertTable", function() { editor.generate(); } , url ); 
    16161605            return false; 
    16171606          } 
    16181607          else if ( typeof InsertTable != 'undefined') editor.registerPlugin('InsertTable'); 
    1619         break; 
    1620         case "hilitecolor": 
    1621         case "forecolor": 
    1622           if ( typeof ColorPicker == 'undefined') 
    1623           { 
    1624             Xinha.loadPlugin("ColorPicker", function() { editor.generate(); } , _editor_url + 'modules/ColorPicker/ColorPicker.js'); 
    1625             return false; 
    1626           } 
    1627           else if ( typeof ColorPicker != 'undefined') editor.registerPlugin('ColorPicker'); 
    1628         break; 
    1629          
     1608        break;         
    16301609      } 
    16311610    } 
     
    16441623      break; 
    16451624    } 
    1646     if ( typeof EnterParagraphs == 'undefined' ) 
     1625    if ( typeof EnterParagraphs == 'undefined'  && !document.getElementById(ParaHandlerPlugin) ) 
    16471626    { 
    16481627      Xinha.loadPlugin("EnterParagraphs", function() { editor.generate(); }, ParaHandlerPlugin ); 
     
    16621641  } 
    16631642   
    1664   if (typeof GetHtmlImplementation == 'undefined') 
     1643  if (typeof GetHtmlImplementation == 'undefined'  && !document.getElementById(getHtmlMethodPlugin)) 
    16651644  { 
    16661645    Xinha.loadPlugin("GetHtmlImplementation", function() { editor.generate(); } , getHtmlMethodPlugin); 
     
    16941673  // create the editor framework, yah, table layout I know, but much easier 
    16951674  // to get it working correctly this way, sorry about that, patches welcome. 
    1696  
     1675   
     1676  this.setLoadingMessage(Xinha._lc('Generate Xinha framework')); 
     1677   
    16971678  this._framework = 
    16981679  { 
     
    18711852  // Initalize size 
    18721853  editor.initSize(); 
    1873  
     1854  this.setLoadingMessage(Xinha._lc('Finishing')); 
    18741855  // Add an event to initialize the iframe once loaded. 
    18751856  editor._iframeLoadDone = false; 
     
    19271908Xinha.prototype.initSize = function() 
    19281909{ 
    1929   this.setLoadingMessage('Init editor size'); 
     1910  this.setLoadingMessage(Xinha._lc('Init editor size')); 
    19301911  var editor = this; 
    19311912  var width = null; 
     
    21782159      
    21792160  this.notifyOf('resize', {width:this._htmlArea.offsetWidth, height:this._htmlArea.offsetHeight}); 
    2180 }; 
    2181  
    2182 Xinha.prototype.addPanel = function(side) 
    2183 { 
    2184   var div = document.createElement('div'); 
    2185   div.side = side; 
    2186   if ( side == 'left' || side == 'right' ) 
    2187   { 
    2188     div.style.width  = this.config.panel_dimensions[side]; 
    2189     if(this._iframe) div.style.height = this._iframe.style.height;      
    2190   } 
    2191   Xinha.addClasses(div, 'panel'); 
    2192   this._panels[side].panels.push(div); 
    2193   this._panels[side].div.appendChild(div); 
    2194  
    2195   this.notifyOf('panel_change', {'action':'add','panel':div}); 
    2196  
    2197   return div; 
    2198 }; 
    2199  
    2200  
    2201 Xinha.prototype.removePanel = function(panel) 
    2202 { 
    2203   this._panels[panel.side].div.removeChild(panel); 
    2204   var clean = []; 
    2205   for ( var i = 0; i < this._panels[panel.side].panels.length; i++ ) 
    2206   { 
    2207     if ( this._panels[panel.side].panels[i] != panel ) 
    2208     { 
    2209       clean.push(this._panels[panel.side].panels[i]); 
    2210     } 
    2211   } 
    2212   this._panels[panel.side].panels = clean; 
    2213   this.notifyOf('panel_change', {'action':'remove','panel':panel}); 
    2214 }; 
    2215  
    2216 Xinha.prototype.hidePanel = function(panel) 
    2217 { 
    2218   if ( panel && panel.style.display != 'none' ) 
    2219   { 
    2220     try { var pos = this.scrollPos(this._iframe.contentWindow); } catch(e) { } 
    2221     panel.style.display = 'none'; 
    2222     this.notifyOf('panel_change', {'action':'hide','panel':panel}); 
    2223     try { this._iframe.contentWindow.scrollTo(pos.x,pos.y)} catch(e) { } 
    2224   } 
    2225 }; 
    2226  
    2227 Xinha.prototype.showPanel = function(panel) 
    2228 { 
    2229   if ( panel && panel.style.display == 'none' ) 
    2230   { 
    2231     try { var pos = this.scrollPos(this._iframe.contentWindow); } catch(e) { } 
    2232         panel.style.display = '';     
    2233     this.notifyOf('panel_change', {'action':'show','panel':panel}); 
    2234     try { this._iframe.contentWindow.scrollTo(pos.x,pos.y)} catch(e) { } 
    2235   } 
    2236 }; 
    2237  
    2238 Xinha.prototype.hidePanels = function(sides) 
    2239 { 
    2240   if ( typeof sides == 'undefined' ) 
    2241   { 
    2242     sides = ['left','right','top','bottom']; 
    2243   } 
    2244  
    2245   var reShow = []; 
    2246   for ( var i = 0; i < sides.length;i++ ) 
    2247   { 
    2248     if ( this._panels[sides[i]].on ) 
    2249     { 
    2250       reShow.push(sides[i]); 
    2251       this._panels[sides[i]].on = false; 
    2252     } 
    2253   } 
    2254   this.notifyOf('panel_change', {'action':'multi_hide','sides':sides}); 
    2255 }; 
    2256  
    2257 Xinha.prototype.showPanels = function(sides) 
    2258 { 
    2259   if ( typeof sides == 'undefined' ) 
    2260   { 
    2261     sides = ['left','right','top','bottom']; 
    2262   } 
    2263  
    2264   var reHide = []; 
    2265   for ( var i = 0; i < sides.length; i++ ) 
    2266   { 
    2267     if ( !this._panels[sides[i]].on ) 
    2268     { 
    2269       reHide.push(sides[i]); 
    2270       this._panels[sides[i]].on = true; 
    2271     } 
    2272   } 
    2273   this.notifyOf('panel_change', {'action':'multi_show','sides':sides}); 
    22742161}; 
    22752162 
     
    23792266Xinha.prototype.initIframe = function() 
    23802267{ 
    2381   this.setLoadingMessage('Init IFrame'); 
    23822268  this.disableToolbar(); 
    23832269  var doc = null; 
     
    27402626  if ( !Xinha.isSupportedBrowser ) return; 
    27412627   
     2628  Xinha.setLoadingMessage (Xinha._lc("Loading plugin $plugin="+pluginName+"$")); 
    27422629  // @todo : try to avoid the use of eval() 
    27432630  // Might already be loaded 
     
    29002787} 
    29012788 
    2902 Xinha.loadStyle = function(style, plugin) 
     2789Xinha.loadStyle = function(style, plugin, id) 
    29032790{ 
    29042791  var url = _editor_url || ''; 
    2905   if ( typeof plugin != "undefined" ) 
     2792  if ( plugin ) 
    29062793  { 
    29072794    url += "plugins/" + plugin + "/"; 
     
    29212808  link.rel = "stylesheet"; 
    29222809  link.href = url; 
     2810  if (id) link.id = id; 
    29232811  head.appendChild(link); 
    2924   //document.write("<style type='text/css'>@import url(" + url + ");</style>"); 
    2925 }; 
    2926 Xinha.loadStyle(typeof _editor_css == "string" ? _editor_css : "Xinha.css"); 
     2812}; 
     2813 
    29272814 
    29282815/*************************************************** 
     
    50684955        } 
    50694956      } 
    5070       else if (req.status == 404) 
    5071       { 
    5072         alert('File not found: ' + url); 
    5073       } 
    50744957      else 
    50754958      { 
     
    50994982      { 
    51004983        handler(req.responseText, req); 
    5101       } 
    5102       else if (req.status == 404) 
    5103       { 
    5104         alert('File not found: ' + url); 
    51054984      } 
    51064985      else 
     
    52215100    else 
    52225101    { 
     5102      Xinha.setLoadingMessage("Language is loaded"); 
    52235103      url = _editor_url+"lang/"+_editor_lang+".js"; 
    52245104    } 
     
    53935273  S.type = "text/javascript"; 
    53945274  S.src = Url; 
     5275  S.id = Url; 
    53955276  if ( Callback ) 
    53965277  { 
     
    54765357    for ( var i = 0; i < plugin_names.length; i++ ) 
    54775358    { 
    5478       this.setLoadingMessage('Register plugin $plugin', 'Xinha', {'plugin': plugin_names[i]}); 
     5359      this.setLoadingMessage(Xinha._lc('Register plugin $plugin', 'Xinha', {'plugin': plugin_names[i]})); 
    54795360      this.registerPlugin(eval(plugin_names[i])); 
    54805361    } 
     
    56875568}; 
    56885569 
    5689 Xinha.prototype.setLoadingMessage = function(string, context, replace) 
    5690 { 
    5691   if ( !this.config.showLoading || !document.getElementById("loading_sub_" + this._textArea.name) ) 
     5570Xinha.createLoadingMessages = function(xinha_editors) 
     5571{ 
     5572  if ( Xinha.loadingMessages || !Xinha.isSupportedBrowser )  
    56925573  { 
    56935574    return; 
    56945575  } 
    5695   var elt = document.getElementById("loading_sub_" + this._textArea.name); 
    5696   elt.innerHTML = Xinha._lc(string, context, replace); 
     5576  Xinha.loadingMessages = []; 
     5577   
     5578  for (var i=0;i<xinha_editors.length;i++) 
     5579  { 
     5580     Xinha.loadingMessages.push(Xinha.createLoadingMessage(Xinha.getElementById('textarea', xinha_editors[i]))); 
     5581  } 
     5582}; 
     5583 
     5584Xinha.createLoadingMessage = function(textarea,text) 
     5585{  
     5586  if ( document.getElementById("loading_" + textarea.id) || !Xinha.isSupportedBrowser) 
     5587  { 
     5588    return; 
     5589  } 
     5590  // Create and show the main loading message and the sub loading message for details of loading actions 
     5591  // global element 
     5592  var loading_message = document.createElement("div"); 
     5593  loading_message.id = "loading_" + textarea.id; 
     5594  loading_message.className = "loading"; 
     5595   
     5596  loading_message.style.left = (Xinha.findPosX(textarea) + textarea.offsetWidth / 2) - 106 +  'px'; 
     5597  loading_message.style.top = (Xinha.findPosY(textarea) + textarea.offsetHeight / 2) - 50 +  'px'; 
     5598  // main static message 
     5599  var loading_main = document.createElement("div"); 
     5600  loading_main.className = "loading_main"; 
     5601  loading_main.id = "loading_main_" + textarea.id; 
     5602  loading_main.appendChild(document.createTextNode(Xinha._lc("Loading in progress. Please wait!"))); 
     5603  // sub dynamic message 
     5604  var loading_sub = document.createElement("div"); 
     5605  loading_sub.className = "loading_sub"; 
     5606  loading_sub.id = "loading_sub_" + textarea.id; 
     5607  text = text ? text : Xinha._lc("Constructing main object"); 
     5608  loading_sub.appendChild(document.createTextNode(text)); 
     5609  loading_message.appendChild(loading_main); 
     5610  loading_message.appendChild(loading_sub); 
     5611  document.body.appendChild(loading_message); 
     5612   
     5613  return loading_sub; 
     5614}; 
     5615 
     5616Xinha.prototype.setLoadingMessage = function(string) 
     5617{ 
     5618  if ( !document.getElementById("loading_sub_" + this._textArea.id) ) 
     5619  { 
     5620    return; 
     5621  } 
     5622  document.getElementById("loading_main_" + this._textArea.id).innerHTML = Xinha._lc("Loading in progress. Please wait!"); 
     5623  document.getElementById("loading_sub_" + this._textArea.id).innerHTML = string; 
     5624}; 
     5625 
     5626Xinha.setLoadingMessage = function(string) 
     5627{ 
     5628  if (!Xinha.loadingMessages) return;   
     5629  for ( var i = 0; i < Xinha.loadingMessages.length; i++ ) 
     5630  { 
     5631    Xinha.loadingMessages[i].innerHTML = string; 
     5632  } 
    56975633}; 
    56985634 
    56995635Xinha.prototype.removeLoadingMessage = function() 
    57005636{ 
    5701   if ( !this.config.showLoading || !document.getElementById("loading_" + this._textArea.name) ) 
    5702   { 
    5703     return ; 
    5704   } 
    5705   document.body.removeChild(document.getElementById("loading_" + this._textArea.name)); 
     5637  if (document.getElementById("loading_" + this._textArea.id) ) 
     5638  { 
     5639   document.body.removeChild(document.getElementById("loading_" + this._textArea.id)); 
     5640  } 
     5641}; 
     5642 
     5643Xinha.removeLoadingMessages = function(xinha_editors) 
     5644{ 
     5645  for (var i=0;i< xinha_editors.length;i++) 
     5646  { 
     5647     var main = document.getElementById("loading_" + document.getElementById(xinha_editors[i]).id); 
     5648     main.parentNode.removeChild(main); 
     5649  } 
     5650  Xinha.loadingMessages = null; 
    57065651}; 
    57075652 
     
    57385683 
    57395684Xinha.collectGarbageForIE = function()  
    5740 {   
     5685{ 
    57415686  Xinha.flushEvents();    
    57425687  for ( var x = 0; x < Xinha.toFree.length; x++ ) 
  • branches/ray/examples/testbed.html

    r774 r782  
    3131    // in this example we do a little regular expression to find the absolute path. 
    3232    _editor_url  = document.location.href.replace(/examples\/.*/, '') 
    33     _editor_lang = "en";      // And the language we need to use in the editor. 
     33    _editor_lang = "de";      // And the language we need to use in the editor. 
    3434  </script> 
    3535 
    3636  <!-- Load up the actual editor core --> 
    37   <script type="text/javascript" src="../htmlarea.js"></script> 
     37  <script type="text/javascript" src="../XinhaLoader.js"></script> 
    3838 
    3939  <script type="text/javascript"> 
     
    4747    { 
    4848      /** STEP 1 *************************************************************** 
    49        * First, what are the plugins you will be using in the editors on this 
    50        * page.  List all the plugins you will need, even if not all the editors 
     49       * First, specify the textareas that shall be turned into Xinhas.  
     50       * For each one add the respective id to the xinha_editors array. 
     51       ************************************************************************/ 
     52       
     53      xinha_editors = xinha_editors ? xinha_editors : 
     54      [ 
     55        'myTextArea' 
     56      ]; 
     57     
     58      /** STEP 2 *************************************************************** 
     59       * Now, what are the plugins you will be using in the editors on this 
     60       * page. List all the plugins you will need, even if not all the editors 
    5161       * will use all the plugins. 
    5262       ************************************************************************/ 
    53  
    54       xinha_plugins = xinha_plugins ? xinha_plugins : 
    55       [ 
    56         //'CharacterMap',  
    57         //'SpellChecker',  
    58        //'SmartReplace'//, 
    59         //'PasteText'//,'SuperClean', 
    60         'Linker'//,'GetHtml' 
    61       ]; 
     63       xinha_plugins = xinha_plugins ? xinha_plugins : 
     64       [ 
     65         'CharacterMap',  
     66         'Linker' 
     67       ]; 
    6268             // THIS BIT OF JAVASCRIPT LOADS THE PLUGINS, NO TOUCHING  :) 
    6369             if(!Xinha.loadPlugins(xinha_plugins, xinha_init)) return; 
    64  
    65       /** STEP 2 *************************************************************** 
    66        * Now, what are the names of the textareas you will be turning into 
    67        * editors? 
    68        ************************************************************************/ 
    69  
    70       xinha_editors = xinha_editors ? xinha_editors : 
    71       [ 
    72       'HAllo',   
    73       'myTextArea' 
    74          
    75       ]; 
    76  
     70              
    7771      /** STEP 3 *************************************************************** 
    7872       * We create a default configuration to be used by all the editors. 
     
    8983 
    9084       xinha_config = xinha_config ? xinha_config : new Xinha.Config(); 
    91    xinha_config.width  = 300; 
    92    xinha_config.height = 300; 
    93        xinha_config.fullPage = false; 
    94       // xinha_config.CharacterMap.mode = 'panel'; 
    95        xinha_config.toolbar = 
    96   [ 
    97    ["htmlmode","formatblock"] 
    98   ]; 
     85    
     86       //  xinha_config.stylistLoadStylesheet(document.location.href.replace(/[^\/]*\.html/, 'stylist.css')); 
     87          
     88      xinha_config.CharacterMap.mode = 'panel'; 
     89 
    9990/* 
    10091       // We can load an external stylesheet like this - NOTE : YOU MUST GIVE AN ABSOLUTE URL 
     
    153144</head> 
    154145 
    155 <body bgcolor="Aqua"> 
     146<body> 
    156147 
    157148  <form action="test_dest.php" id="editors_here" onsubmit="alert(this.myTextArea.value);"> 
     
    160151<option>Test</option> 
    161152</select> 
    162   <textarea id="myTextArea" name="myTextArea" style="width:100%;height:320px;"> 
    163     <table cellspacing="1" cellpadding="1" border="1" style="width: 100%;"><tbody><tr><td style="width: 25%;">&nbsp;</td><td style="width: 25%;">&nbsp;</td><td style="width: 25%;">&nbsp;</td><td style="width: 25%;">&nbsp;</td></tr><tr><td style="width: 25%;">&nbsp;</td><td style="width: 25%;">&nbsp;</td><td style="width: 25%;">&nbsp;</td><td style="width: 25%;">&nbsp;</td></tr></tbody></table><br /></textarea> 
    164  
    165     <input type="submit" /> <input type="reset" /><input type="checkbox" name="hallo" /> 
    166 <select> 
    167 <option>Test</option> 
    168 </select> 
    169   <textarea name="myTextArea" style="width:100%;height:320px;"> 
    170     <table cellspacing="1" cellpadding="1" border="1" style="width: 100%;"><tbody><tr><td style="width: 25%;">&nbsp;</td><td style="width: 25%;">&nbsp;</td><td style="width: 25%;">&nbsp;</td><td style="width: 25%;">&nbsp;</td></tr><tr><td style="width: 25%;">&nbsp;</td><td style="width: 25%;">&nbsp;</td><td style="width: 25%;">&nbsp;</td><td style="width: 25%;">&nbsp;</td></tr></tbody></table><br /></textarea> 
    171  
    172     <input type="submit" /> <input type="reset" /><input type="checkbox" name="hallo" /> 
    173 <select> 
    174 <option>Test</option> 
    175 </select> 
    176   <textarea name="myTextArea" style="width:100%;height:320px;"> 
    177     <table cellspacing="1" cellpadding="1" border="1" style="width: 100%;"><tbody><tr><td style="width: 25%;">&nbsp;</td><td style="width: 25%;">&nbsp;</td><td style="width: 25%;">&nbsp;</td><td style="width: 25%;">&nbsp;</td></tr><tr><td style="width: 25%;">&nbsp;</td><td style="width: 25%;">&nbsp;</td><td style="width: 25%;">&nbsp;</td><td style="width: 25%;">&nbsp;</td></tr></tbody></table><br /></textarea> 
    178  
    179     <input type="submit" /> <input type="reset" /><input type="checkbox" name="hallo" /> 
    180 <select> 
    181 <option>Test</option> 
    182 </select> 
    183   <textarea id="myTextArea" name="myTextArea" style="width:100%;height:320px;"> 
     153<br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /> 
     154  <textarea id="myTextArea" name="myTextArea" style="width:100%;height:200px;"> 
    184155    <table cellspacing="1" cellpadding="1" border="1" style="width: 100%;"><tbody><tr><td style="width: 25%;">&nbsp;</td><td style="width: 25%;">&nbsp;</td><td style="width: 25%;">&nbsp;</td><td style="width: 25%;">&nbsp;</td></tr><tr><td style="width: 25%;">&nbsp;</td><td style="width: 25%;">&nbsp;</td><td style="width: 25%;">&nbsp;</td><td style="width: 25%;">&nbsp;</td></tr></tbody></table><br /></textarea> 
    185156 
  • branches/ray/modules/Dialogs/inline-dialog.js

    r774 r782  
    2121    --  $LastChangedBy$ 
    2222    --------------------------------------------------------------------------*/ 
    23 Xinha.Dialog = function(editor, html, localizer, size, layer) 
     23Xinha.Dialog = function(editor, html, localizer, size, modal, layer) 
    2424{ 
    2525  var dialog = this; 
     
    2828  this.editor   = editor; 
    2929  this.document = document; 
     30  this.modal = (modal === false) ? false : true; 
    3031  this.layer = (layer) ? layer : 0; 
    3132   
    32   if ( !Xinha.Dialog.background[this.layer] ) 
    33   { 
    34         Xinha.Dialog.background[this.layer] = []; 
     33  if ( !this.background ) 
     34  { 
     35        this.background = []; 
    3536         
    3637    if (Xinha.is_ie) 
     
    5758    } 
    5859    document.body.appendChild(backG); 
    59     Xinha.Dialog.background[this.layer].push(backG); 
     60    this.background.push(backG); 
    6061     
    6162    backG = document.createElement("div"); 
     
    7071    }  
    7172    document.body.appendChild(backG); 
    72     Xinha.Dialog.background[this.layer].push(backG); 
     73    this.background.push(backG); 
    7374    backG = null; 
    74     Xinha.freeLater(Xinha.Dialog.background[this.layer]); 
     75    Xinha.freeLater(this.background); 
    7576  } 
    7677  var rootElem = document.createElement('div'); 
     
    8485  rootElem.className = 'dialog'; 
    8586   
    86  // Xinha.Dialog.background[this.layer][1].appendChild(rootElem); 
     87 // this.background[1].appendChild(rootElem); 
    8788  document.body.appendChild(rootElem); 
    8889 
     
    104105  } 
    105106 
     107  if(typeof localizer == 'function') 
     108  { 
     109    this._lc = localizer; 
     110  } 
     111  else if(localizer) 
     112  { 
     113    this._lc = function(string) 
     114    { 
     115      return Xinha._lc(string,localizer); 
     116    }; 
     117  } 
     118  else 
     119  { 
     120    this._lc = function(string) 
     121    { 
     122      return string; 
     123    }; 
     124  } 
     125 
     126  html = this.translateHtml(html) 
     127 
     128  var main = document.createElement('div'); 
     129  rootElem.appendChild(main); 
     130  main.innerHTML = html; 
     131 
     132  //make the first h1 to drag&drop the rootElem 
     133  var captionBar = main.removeChild( main.getElementsByTagName("h1")[0]); 
     134  rootElem.insertBefore(captionBar,main); 
     135  captionBar.onmousedown = function(ev) { dialog._dragStart(ev); }; 
     136  captionBar.style.MozUserSelect = "none"; 
     137   
     138  var closer = document.createElement('div'); 
     139  closer.className= 'closeButton';  
     140   
     141  closer.onmousedown = function(ev) { this.className = "closeButton buttonClick"; Xinha._stopEvent((ev) ? ev : window.event); return false;}; 
     142  closer.onmouseout = function(ev) { this.className = "closeButton"; Xinha._stopEvent((ev) ? ev : window.event); return false;}; 
     143  closer.onmouseup = function() { this.className = "closeButton"; dialog.hide(); return false;}; 
     144  captionBar.appendChild(closer); 
     145 
     146  var butX = document.createElement('span'); 
     147  butX.className = 'innerX'; 
     148  butX.style.position = 'relative'; 
     149  butX.style.top = '-3px'; 
     150 
     151  butX.appendChild(document.createTextNode('\u00D7')); 
     152  closer.appendChild(butX); 
     153  butX = null; 
     154 
     155  var icon = document.createElement('img'); 
     156  icon.className = 'icon'; 
     157  icon.src = _editor_url + 'images/xinha-small-icon.gif'; 
     158  icon.style.position = 'absolute'; 
     159  icon.style.top = '3px'; 
     160  icon.style.left = '2px'; 
     161  captionBar.style.paddingLeft = '30px'; 
     162  captionBar.appendChild(icon); 
     163   
     164   
     165  var all = rootElem.getElementsByTagName("*"); 
     166 
     167  for (var i=0; i<all.length;i++) 
     168  { 
     169        var el = all[i];  
     170    if (el.tagName.toLowerCase() == 'textarea' || el.tagName.toLowerCase() == 'input') 
     171    { 
     172      // FIXME: this doesn't work 
     173      //el.style.MozUserSelect = "text"; 
     174    } 
     175    else 
     176    { 
     177      el.unselectable = "on"; 
     178    } 
     179  } 
     180 
     181  var resizeHandle = document.createElement('div'); 
     182  resizeHandle.className = "resizeHandle"; 
     183  with (resizeHandle.style) 
     184  { 
     185    position = "absolute"; 
     186    bottom = "0px"; 
     187    right= "0px"; 
     188  } 
     189  resizeHandle.onmousedown = function(ev) { dialog._resizeStart(ev); }; 
     190  rootElem.appendChild(resizeHandle); 
     191   
     192  this.rootElem = rootElem; 
     193  this.captionBar = captionBar; 
     194  this.main = main; 
     195  this.closer = closer; 
     196  this.icon = icon; 
     197  this.resizer = resizeHandle; 
     198   
     199  captionBar =  
     200  rootElem =  
     201  rootElem = 
     202  main =  
     203  closer =  
     204  icon =  
     205  resizeHandle = null; 
     206   
     207  Xinha.freeLater(this,'rootElem'); 
     208   
     209  // for caching size & position after dragging & resizing 
     210  this.size = {}; 
     211 
     212}; 
     213 
     214Xinha.Dialog.background = []; 
     215Xinha.Dialog.prototype.sizeBackground = function() 
     216{ 
     217  var win_dim = Xinha.viewportSize(); 
     218  if ( this.modal ) 
     219  { 
     220    this.background[0].style.width = win_dim.x + 'px'; 
     221    this.background[0].style.height = win_dim.y + 'px'; 
     222    this.background[1].style.width = win_dim.x + 'px'; 
     223    this.background[1].style.height = win_dim.y + 'px'; 
     224  } 
     225  window.scroll(this.scrollPos.x, this.scrollPos.y); 
     226  return win_dim; 
     227} 
     228 
     229Xinha.Dialog.prototype.onresize = function() 
     230{ 
     231  return true; 
     232}; 
     233 
     234Xinha.Dialog.prototype.show = function(values) 
     235{ 
     236  var rootElem = this.rootElem; 
     237  var scrollPos = this.scrollPos = this.editor.scrollPos(); 
     238  var dialog = this; 
     239   
     240  if ( this.modal ) 
     241  { 
     242    function resetScroll() 
     243    { 
     244      if ( dialog.dialogShown ) 
     245      { 
     246        window.scroll(scrollPos.x,scrollPos.y); 
     247        window.setTimeout(resetScroll,150); 
     248      } 
     249    } 
     250    this.background[0].style.left = this.scrollPos.x + 'px'; 
     251    this.background[0].style.top = this.scrollPos.y + 'px'; 
     252    this.background[1].style.left = this.scrollPos.x + 'px'; 
     253    this.background[1].style.top = this.scrollPos.y + 'px'; 
     254  } 
     255  
     256  // We need to preserve the selection 
     257  this._lastRange = this.editor.saveSelection(); 
     258   
     259  if (Xinha.is_ie && !this.modal) 
     260  { 
     261    dialog.saveSelection = function() { dialog._lastRange = dialog.editor.saveSelection();}; 
     262    Xinha._addEvent(this.editor._doc.body,'mouseup', dialog.saveSelection); 
     263  } 
     264 
     265  this.editor.deactivateEditor(); 
     266 
     267  // unfortunately we have to hide the editor (iframe/caret bug) 
     268  if (Xinha.is_gecko && this.modal) 
     269  { 
     270    this._restoreTo = [this.editor._textArea.style.display, this.editor._iframe.style.visibility, this.editor.hidePanels()]; 
     271    this.editor._textArea.style.display = 'none'; 
     272    this.editor._iframe.style.visibility   = 'hidden'; 
     273  } 
     274  if (!this.editor._isFullScreen && this.modal) 
     275  { 
     276    if(Xinha.is_ie && document.compatMode == 'CSS1Compat') 
     277    { 
     278      var bod = document.getElementsByTagName('html'); 
     279    } 
     280    else 
     281    { 
     282      var bod = document.getElementsByTagName('body'); 
     283    } 
     284   
     285    bod[0].style.overflow='hidden'; 
     286    window.scroll(this.scrollPos.x, this.scrollPos.y); 
     287  } 
     288 
     289  this.background[0].style.display = ''; 
     290  this.background[1].style.display = ''; 
     291   
     292  var backgroundSize = this.sizeBackground(); 
     293  var backgroundHeight = backgroundSize.y; 
     294  var backgroundWidth = backgroundSize.x; 
     295   
     296  this.onResizeWin = function () {dialog.sizeBackground()}; 
     297  Xinha._addEvent(window, 'resize', this.onResizeWin ); 
     298   
     299 
     300   
     301  var rootElemStyle = rootElem.style; 
     302  rootElemStyle.display   = ''; 
     303   
     304  var dialogHeight = rootElem.offsetHeight; 
     305  var dialogWidth = rootElem.offsetWidth; 
     306   
     307  if (dialogHeight >  backgroundHeight) 
     308  { 
     309        rootElemStyle.height =  backgroundHeight + "px"; 
     310        if (rootElem.scrollHeight > dialogHeight) 
     311        { 
     312          rootElemStyle.overflowY = "auto"; 
     313        } 
     314  } 
     315 
     316  if(this.size.top && this.size.left) 
     317  { 
     318    rootElemStyle.top =  parseInt(this.size.top,10) + 'px'; 
     319    rootElemStyle.left = parseInt(this.size.left,10) + 'px'; 
     320  } 
     321  else 
     322  { 
     323    if (this.editor.btnClickEvent) 
     324    { 
     325      var btnClickEvent = this.editor.btnClickEvent;  
     326      rootElemStyle.top =  btnClickEvent.clientY + this.scrollPos.y +'px'; 
     327      
     328      if (dialogHeight + rootElem.offsetTop >  backgroundHeight) 
     329      { 
     330        rootElemStyle.top = this.scrollPos.y; 
     331      } 
     332      rootElemStyle.left = btnClickEvent.clientX +  this.scrollPos.x +'px'; 
     333      if (dialogWidth + rootElem.offsetLeft >  backgroundWidth) 
     334      { 
     335        rootElemStyle.left =  btnClickEvent.clientX - dialogWidth   + 'px'; 
     336        if (rootElem.offsetLeft < 0)  
     337        { 
     338                rootElemStyle.left = 0; 
     339        } 
     340      } 
     341      this.editor.btnClickEvent = null; 
     342    } 
     343    else 
     344    { 
     345    var top =  ( backgroundHeight - dialogHeight) / 2; 
     346    var left = ( backgroundWidth - dialogWidth) / 2; 
     347    rootElemStyle.top =  ((top > 0) ? top : 0) +'px'; 
     348    rootElemStyle.left = ((left > 0) ? left : 0)+'px';           
     349    } 
     350         
     351  } 
     352  this.width = dialogWidth; 
     353  this.height = dialogHeight;   
     354   
     355  if (!this.modal) 
     356  { 
     357    this.background[0].style.left =  rootElemStyle.left; 
     358    this.background[0].style.top  =  rootElemStyle.top; 
     359    this.background[1].style.left =  rootElemStyle.left; 
     360    this.background[1].style.top  =  rootElemStyle.top; 
     361 
     362    this.background[0].style.width  = dialogWidth + 'px'; 
     363    this.background[0].style.height = dialogHeight + 'px'; 
     364    this.background[1].style.width  = dialogWidth + 'px'; 
     365    this.background[1].style.height = dialogHeight + 'px'; 
     366  } 
     367   
     368  if(typeof values != 'undefined') 
     369  { 
     370    this.setValues(values); 
     371  } 
     372  this.dialogShown = true; 
     373  if (this.modal) resetScroll(); 
     374}; 
     375 
     376Xinha.Dialog.prototype.hide = function() 
     377{ 
     378  this.rootElem.style.display = 'none'; 
     379  this.background[0].style.display = 'none'; 
     380  this.background[1].style.display = 'none'; 
     381  var dialog = this; 
     382 
     383  Xinha._removeEvent(window, 'resize', this.onResizeWin); 
     384   
     385  if (Xinha.is_gecko && this.modal) 
     386  { 
     387    this.editor._textArea.style.display = this._restoreTo[0]; 
     388    this.editor._iframe.style.visibility   = this._restoreTo[1]; 
     389    this.editor.showPanels(this._restoreTo[2]);   
     390  } 
     391   
     392  if (!this.editor._isFullScreen && this.modal) 
     393  { 
     394    if(Xinha.is_ie && document.compatMode == 'CSS1Compat') 
     395    { 
     396      var bod = document.getElementsByTagName('html'); 
     397    } 
     398    else 
     399    { 
     400      var bod = document.getElementsByTagName('body'); 
     401    } 
     402    bod[0].style.overflow=''; 
     403    window.scroll(this.scrollPos.x, this.scrollPos.y); 
     404  } 
     405  // Restore the selection 
     406  this.editor.restoreSelection(this._lastRange); 
     407  if (Xinha.is_ie && !this.modal) 
     408  { 
     409    Xinha._removeEvent(this.editor._doc.body,'mouseup', dialog.saveSelection); 
     410  } 
     411   
     412  if (this.modal) 
     413  { 
     414    this.editor.activateEditor(); 
     415  } 
     416  this.dialogShown = false; 
     417  this.editor.updateToolbar(); 
     418  return this.getValues(); 
     419}; 
     420 
     421Xinha.Dialog.prototype.toggle = function() 
     422{ 
     423  if(this.rootElem.style.display == 'none') 
     424  { 
     425    this.show(); 
     426  } 
     427  else 
     428  { 
     429    this.hide(); 
     430  } 
     431}; 
     432 
     433Xinha.Dialog.prototype.getElementById = function(id) 
     434{ 
     435  return this.document.getElementById(this.id[id] ? this.id[id] : id); 
     436}; 
     437 
     438Xinha.Dialog.prototype.getElementsByName = function(name) 
     439{ 
     440  return this.document.getElementsByName(this.id[name] ? this.id[name] : name); 
     441}; 
     442 
     443Xinha.Dialog.prototype._dragStart = function (ev)  
     444{ 
     445 
     446  var dialog = this; 
     447  if (dialog.dragging)  
     448  { 
     449    return; 
     450  } 
     451  dialog.dragging = true; 
     452 
     453  var st = dialog.rootElem.style; 
     454 
     455  dialog.xOffs = ((Xinha.is_ie) ? window.event.offsetX : ev.layerX); 
     456  dialog.yOffs = ((Xinha.is_ie) ? window.event.offsetY : ev.layerY); 
     457 
     458  Xinha._addEvent(document, "mousemove", function(ev) { dialog.dragIt(ev); } ); 
     459  Xinha._addEvent(document, "mouseup", function (ev) { dialog.dragEnd(ev); } ); 
     460}; 
     461 
     462Xinha.Dialog.prototype.dragIt = function(ev) 
     463{ 
     464  var dialog = this; 
     465 
     466  if (!dialog.dragging)  
     467  { 
     468    return false; 
     469  } 
     470  ev = (Xinha.is_ie) ? window.event : ev; 
     471 
     472  var posY = ev.clientY + this.scrollPos.y; 
     473  var posX = ev.clientX + this.scrollPos.x; 
     474 
     475  var st = dialog.rootElem.style; 
     476 
     477  st.left = (posX - dialog.xOffs) + "px"; 
     478  st.top = (posY - dialog.yOffs) + "px"; 
     479   
     480  if (!this.modal) 
     481  { 
     482    this.background[0].style.left =  st.left; 
     483    this.background[0].style.top  =  st.top; 
     484    this.background[1].style.left =  st.left; 
     485    this.background[1].style.top  =  st.top; 
     486  } 
     487}; 
     488 
     489Xinha.Dialog.prototype.dragEnd = function(ev) 
     490{ 
     491  var dialog = this; 
     492  dialog.dragging = false; 
     493 
     494  Xinha._removeEvent(document, "mousemove", function(ev) { dialog.dragIt(ev); } ); 
     495  Xinha._removeEvent(document, "mouseup", function (ev) { dialog.dragEnd(ev); } ); 
     496 
     497  dialog.size.top  = dialog.rootElem.style.top; 
     498  dialog.size.left =dialog.rootElem.style.left; 
     499}; 
     500 
     501Xinha.Dialog.prototype._resizeStart = function (ev) { 
     502  var dialog = this; 
     503 
     504  if (dialog.resizing) 
     505  { 
     506    return; 
     507  } 
     508  dialog.resizing = true; 
     509 
     510  var st = dialog.rootElem.style; 
     511  st.minHeight = ''; 
     512  st.overflow  =  'hidden'; 
     513  dialog.xOffs = parseInt(st.left,10); 
     514  dialog.yOffs = parseInt(st.top,10); 
     515 
     516  Xinha._addEvent(document, "mousemove", function(ev) { dialog.resizeIt(ev); } ); 
     517  Xinha._addEvent(document, "mouseup", function (ev) { dialog.resizeEnd(ev); } ); 
     518}; 
     519 
     520Xinha.Dialog.prototype.resizeIt = function(ev) 
     521{ 
     522  var dialog = this; 
     523 
     524  if (!dialog.resizing) { 
     525    return false; 
     526  } 
     527 
     528  var posY = ev.clientY + dialog.scrollPos.y; 
     529  var posX = ev.clientX + dialog.scrollPos.x; 
     530 
     531  var st = dialog.rootElem.style; 
     532 
     533  posX = posX - dialog.xOffs; 
     534  posY = posY - dialog.yOffs; 
     535 
     536  st.width  = (( posX > 10) ? posX : 10) + "px"; 
     537  st.height = (( posY > 10) ? posY : 10) + "px"; 
     538 
     539  dialog.width = dialog.rootElem.offsetWidth; 
     540  dialog.height = dialog.rootElem.offsetHeight; 
     541 
     542  if (!this.modal) 
     543  { 
     544    this.background[0].style.width  = st.width ; 
     545    this.background[0].style.height = st.height; 
     546    this.background[1].style.width  = st.width ; 
     547    this.background[1].style.height = st.height; 
     548  } 
     549  dialog.onresize(); 
     550}; 
     551 
     552Xinha.Dialog.prototype.resizeEnd = function(ev) 
     553{ 
     554  var dialog = this; 
     555  dialog.resizing = false; 
     556 
     557  Xinha._removeEvent(document, "mousemove", function(ev) { dialog.resizeIt(ev); } ); 
     558  Xinha._removeEvent(document, "mouseup", function (ev) { dialog.resizeEnd(ev); } ); 
     559 
     560  dialog.size.width  = dialog.rootElem.offsetWidth; 
     561  dialog.size.height = dialog.rootElem.offsetHeight; 
     562}; 
     563 
     564Xinha.Dialog.prototype.setValues = function(values) 
     565{ 
     566  for(var i in values) 
     567  { 
     568    var elems = this.getElementsByName(i); 
     569    if(!elems) continue; 
     570    for(var x = 0; x < elems.length; x++) 
     571    { 
     572      var e = elems[x]; 
     573      switch(e.tagName.toLowerCase()) 
     574      { 
     575        case 'select'  : 
     576        { 
     577          for(var j = 0; j < e.options.length; j++) 
     578          { 
     579            if(typeof values[i] == 'object') 
     580            { 
     581              for(var k = 0; k < values[i].length; k++) 
     582              { 
     583                if(values[i][k] == e.options[j].value) 
     584                { 
     585                  e.options[j].selected = true; 
     586                } 
     587              } 
     588            } 
     589            else if(values[i] == e.options[j].value) 
     590            { 
     591              e.options[j].selected = true; 
     592            } 
     593          } 
     594          break; 
     595        } 
     596 
     597 
     598        case 'textarea': 
     599        case 'input'   : 
     600        { 
     601          switch(e.getAttribute('type')) 
     602          { 
     603            case 'radio'   : 
     604            { 
     605              if(e.value == values[i]) 
     606              { 
     607                e.checked = true; 
     608              } 
     609              break; 
     610            } 
     611 
     612            case 'checkbox': 
     613            { 
     614              if(typeof values[i] == 'object') 
     615              { 
     616                for(var j in values[i]) 
     617                { 
     618                  if(values[i][j] == e.value) 
     619                  { 
     620                    e.checked = true; 
     621                  } 
     622                } 
     623              } 
     624              else 
     625              { 
     626                if(values[i] == e.value) 
     627                { 
     628                  e.checked = true; 
     629                } 
     630              } 
     631              break; 
     632            } 
     633 
     634            default    : 
     635            { 
     636              e.value = values[i]; 
     637            } 
     638          } 
     639          break; 
     640        } 
     641 
     642        default        : 
     643        break; 
     644      } 
     645    } 
     646  } 
     647}; 
     648 
     649Xinha.Dialog.prototype.getValues = function() 
     650{ 
     651  var values = [ ]; 
     652  var inputs = Xinha.collectionToArray(this.rootElem.getElementsByTagName('input')) 
     653              .append(Xinha.collectionToArray(this.rootElem.getElementsByTagName('textarea'))) 
     654              .append(Xinha.collectionToArray(this.rootElem.getElementsByTagName('select'))); 
     655 
     656  for(var x = 0; x < inputs.length; x++) 
     657  { 
     658    var i = inputs[x]; 
     659    if(!(i.name && this.r_id[i.name])) continue; 
     660 
     661    if(typeof values[this.r_id[i.name]] == 'undefined') 
     662    { 
     663      values[this.r_id[i.name]] = null; 
     664    } 
     665    var v = values[this.r_id[i.name]]; 
     666 
     667    switch(i.tagName.toLowerCase()) 
     668    { 
     669      case 'select': 
     670      { 
     671        if(i.multiple) 
     672        { 
     673          if(!v.push) 
     674          { 
     675            if(v != null) 
     676            { 
     677              v = [v]; 
     678            } 
     679            else 
     680            { 
     681              v = new Array(); 
     682            } 
     683          } 
     684          for(var j = 0; j < i.options.length; j++) 
     685          { 
     686            if(i.options[j].selected) 
     687            { 
     688              v.push(i.options[j].value); 
     689            } 
     690          } 
     691        } 
     692        else 
     693        { 
     694          if(i.selectedIndex >= 0) 
     695          { 
     696            v = i.options[i.selectedIndex]; 
     697          } 
     698        } 
     699        break; 
     700      } 
     701 
     702      case 'textarea': 
     703      case 'input'   : 
     704      default        : 
     705      { 
     706        switch(i.type.toLowerCase()) 
     707        { 
     708          case  'radio': 
     709          { 
     710            if(i.checked) 
     711            { 
     712              v = i.value; 
     713              break; 
     714            } 
     715          } 
     716 
     717          case 'checkbox': 
     718          { 
     719            if(v == null) 
     720            { 
     721              if(this.getElementsByName(this.r_id[i.name]).length > 1) 
     722              { 
     723                v = new Array(); 
     724              } 
     725            } 
     726 
     727            if(i.checked) 
     728            { 
     729              if(v != null && typeof v == 'object' && v.push) 
     730              { 
     731                v.push(i.value); 
     732              } 
     733              else 
     734              { 
     735                v = i.value; 
     736              } 
     737            } 
     738            break; 
     739          } 
     740 
     741          default   : 
     742          { 
     743            v = i.value; 
     744            break; 
     745          } 
     746        } 
     747      } 
     748 
     749    } 
     750 
     751    values[this.r_id[i.name]] = v; 
     752  } 
     753  return values; 
     754}; 
     755 
     756Xinha.Dialog.prototype.translateHtml = function(html) 
     757{ 
     758  var dialog = this; 
     759  html = html.replace(/\[([a-z0-9_]+)\]/ig, 
     760    function(fullString, id) 
     761    { 
     762      if(typeof dialog.id[id] == 'undefined') 
     763      { 
     764        dialog.id[id] = Xinha.uniq('Dialog'); 
     765        dialog.r_id[dialog.id[id]] = id; 
     766      } 
     767      return dialog.id[id]; 
     768    } 
     769    ).replace(/<l10n>(.*?)<\/l10n>/ig, 
     770    function(fullString,translate) 
     771    { 
     772      return dialog._lc(translate) ; 
     773    } 
     774    ).replace(/="_\((.*?)\)"/g, 
     775    function(fullString, translate) 
     776    { 
     777      return '="' + dialog._lc(translate) + '"'; 
     778    } 
     779  ); 
     780  return html; 
     781} 
     782 
     783 
     784Xinha.prototype.addPanel = function(side) 
     785{ 
     786  var div = document.createElement('div'); 
     787  div.side = side; 
     788  if ( side == 'left' || side == 'right' ) 
     789  { 
     790    div.style.width  = this.config.panel_dimensions[side]; 
     791    if(this._iframe) div.style.height = this._iframe.style.height;      
     792  } 
     793  Xinha.addClasses(div, 'panel'); 
     794  this._panels[side].panels.push(div); 
     795  this._panels[side].div.appendChild(div); 
     796 
     797  this.notifyOf('panel_change', {'action':'add','panel':div}); 
     798 
     799  return div; 
     800}; 
     801 
     802 
     803Xinha.prototype.removePanel = function(panel) 
     804{ 
     805  this._panels[panel.side].div.removeChild(panel); 
     806  var clean = []; 
     807  for ( var i = 0; i < this._panels[panel.side].panels.length; i++ ) 
     808  { 
     809    if ( this._panels[panel.side].panels[i] != panel ) 
     810    { 
     811      clean.push(this._panels[panel.side].panels[i]); 
     812    } 
     813  } 
     814  this._panels[panel.side].panels = clean; 
     815  this.notifyOf('panel_change', {'action':'remove','panel':panel}); 
     816}; 
     817 
     818Xinha.prototype.hidePanel = function(panel) 
     819{ 
     820  if ( panel && panel.style.display != 'none' ) 
     821  { 
     822    try { var pos = this.scrollPos(this._iframe.contentWindow); } catch(e) { } 
     823    panel.style.display = 'none'; 
     824    this.notifyOf('panel_change', {'action':'hide','panel':panel}); 
     825    try { this._iframe.contentWindow.scrollTo(pos.x,pos.y)} catch(e) { } 
     826  } 
     827}; 
     828 
     829Xinha.prototype.showPanel = function(panel) 
     830{ 
     831  if ( panel && panel.style.display == 'none' ) 
     832  { 
     833    try { var pos = this.scrollPos(this._iframe.contentWindow); } catch(e) { } 
     834        panel.style.display = '';     
     835    this.notifyOf('panel_change', {'action':'show','panel':panel}); 
     836    try { this._iframe.contentWindow.scrollTo(pos.x,pos.y)} catch(e) { } 
     837  } 
     838}; 
     839 
     840Xinha.prototype.hidePanels = function(sides) 
     841{ 
     842  if ( typeof sides == 'undefined' ) 
     843  { 
     844    sides = ['left','right','top','bottom']; 
     845  } 
     846 
     847  var reShow = []; 
     848  for ( var i = 0; i < sides.length;i++ ) 
     849  { 
     850    if ( this._panels[sides[i]].on ) 
     851    { 
     852      reShow.push(sides[i]); 
     853      this._panels[sides[i]].on = false; 
     854    } 
     855  } 
     856  this.notifyOf('panel_change', {'action':'multi_hide','sides':sides}); 
     857}; 
     858 
     859Xinha.prototype.showPanels = function(sides) 
     860{ 
     861  if ( typeof sides == 'undefined' ) 
     862  { 
     863    sides = ['left','right','top','bottom']; 
     864  } 
     865 
     866  var reHide = []; 
     867  for ( var i = 0; i < sides.length; i++ ) 
     868  { 
     869    if ( !this._panels[sides[i]].on ) 
     870    { 
     871      reHide.push(sides[i]); 
     872      this._panels[sides[i]].on = true; 
     873    } 
     874  } 
     875  this.notifyOf('panel_change', {'action':'multi_show','sides':sides}); 
     876}; 
     877 
     878Xinha.PanelDialog = function(editor, side, html, localizer) 
     879{ 
     880  this.id    = { }; 
     881  this.r_id  = { }; // reverse lookup id 
     882  this.editor   = editor; 
     883  this.document = document; 
     884  this.rootElem = editor.addPanel(side); 
     885 
     886  var dialog = this; 
    106887  if(typeof localizer == 'function') 
    107888  { 
     
    145926             ); 
    146927 
    147   rootElem.innerHTML = html; 
    148  
    149   //make the first h1 to drag&drop the rootElem 
    150   var titleBar = rootElem.getElementsByTagName("h1")[0]; 
    151   titleBar.onmousedown = function(ev) { dialog._dragStart(ev); }; 
    152   titleBar.style.MozUserSelect = "none"; 
    153    
    154   var but = document.createElement('div'); 
    155   but.className= 'closeButton';  
    156    
    157   but.onmousedown = function(ev) { this.className = "closeButton buttonClick"; Xinha._stopEvent((ev) ? ev : window.event); return false;}; 
    158   but.onmouseout = function(ev) { this.className = "closeButton"; Xinha._stopEvent((ev) ? ev : window.event); return false;}; 
    159   but.onmouseup = function() { this.className = "closeButton"; dialog.hide(); return false;}; 
    160   titleBar.appendChild(but); 
    161  
    162   var butX = document.createElement('span'); 
    163   butX.className = 'innerX'; 
    164   butX.style.position = 'relative'; 
    165   butX.style.top = '-3px'; 
    166  
    167   butX.appendChild(document.createTextNode('\u00D7')); 
    168   but.appendChild(butX); 
    169   butX = null; 
    170   but = null; 
    171   var icon = document.createElement('img'); 
    172   icon.className = 'icon'; 
    173   icon.src = _editor_url + 'images/xinha-small-icon.gif'; 
    174   icon.style.position = 'absolute'; 
    175   icon.style.top = '3px'; 
    176   icon.style.left = '2px'; 
    177   titleBar.style.paddingLeft = '30px'; 
    178   titleBar.appendChild(icon); 
    179   icon = null; 
    180    
    181   var all = rootElem.getElementsByTagName("*"); 
    182  
    183   for (var i=0; i<all.length;i++) 
    184   { 
    185         var el = all[i];  
    186     if (el.tagName.toLowerCase() == 'textarea' || el.tagName.toLowerCase() == 'input') 
    187     { 
    188       // FIXME: this doesn't work 
    189       //el.style.MozUserSelect = "text"; 
    190     } 
    191     else 
    192     { 
    193       el.unselectable = "on"; 
    194     } 
    195   } 
    196  
    197   var resizeHandle = document.createElement('div'); 
    198   resizeHandle.className = "resizeHandle"; 
    199   with (resizeHandle.style) 
    200   { 
    201     position = "absolute"; 
    202     bottom = "0px"; 
    203     right= "0px"; 
    204   } 
    205   resizeHandle.onmousedown = function(ev) { dialog._resizeStart(ev); }; 
    206   rootElem.appendChild(resizeHandle); 
    207   resizeHandle = null; 
    208   this.rootElem = rootElem; 
    209   // for caching size & position after dragging & resizing 
    210   this.size = {}; 
    211   titleBar = null; 
    212   rootElem = null; 
    213   Xinha.freeLater(this,'rootElem'); 
    214 }; 
    215  
    216 Xinha.Dialog.background = []; 
    217 Xinha.Dialog.prototype.sizeBackground = function() 
    218 { 
    219   var win_dim = Xinha.viewportSize(); 
    220   Xinha.Dialog.background[this.layer][0].style.width = win_dim.x + 'px'; 
    221   Xinha.Dialog.background[this.layer][0].style.height = win_dim.y + 'px'; 
    222   Xinha.Dialog.background[this.layer][1].style.width = win_dim.x + 'px'; 
    223   Xinha.Dialog.background[this.layer][1].style.height = win_dim.y + 'px'; 
    224   window.scroll(this.scrollPos.x, this.scrollPos.y); 
    225   return win_dim; 
    226 } 
    227  
    228 Xinha.Dialog.prototype.onresize = function() 
    229 { 
    230   return true; 
    231 }; 
    232  
    233 Xinha.Dialog.prototype.show = function(values) 
    234 { 
    235   var rootElem = this.rootElem; 
    236   var scrollPos = this.scrollPos = this.editor.scrollPos(); 
    237   var dialog = this; 
    238    
    239   function resetScroll() 
    240   { 
    241     if ( dialog.dialogShown ) 
    242     { 
    243       window.scroll(scrollPos.x,scrollPos.y); 
    244       window.setTimeout(resetScroll,150); 
    245     } 
    246   } 
    247   Xinha.Dialog.background[this.layer][0].style.left = this.scrollPos.x + 'px'; 
    248   Xinha.Dialog.background[this.layer][0].style.top = this.scrollPos.y + 'px'; 
    249   Xinha.Dialog.background[this.layer][1].style.left = this.scrollPos.x + 'px'; 
    250   Xinha.Dialog.background[this.layer][1].style.top = this.scrollPos.y + 'px'; 
    251    
    252   // We need to preserve the selection 
    253   if(Xinha.is_ie) 
    254   {       
    255     this._lastRange = this.editor._createRange(this.editor._getSelection()); 
    256   } 
    257   else 
    258   { 
    259         this._lastRange = this.editor._createRange(this.editor._getSelection()).cloneRange(); 
    260   } 
    261   this.editor.deactivateEditor(); 
    262    
    263   // unfortunately we have to hide the editor (iframe/caret bug) 
    264   if (Xinha.is_gecko) 
    265   { 
    266     this._restoreTo = [this.editor._textArea.style.display, this.editor._iframe.style.visibility, this.editor.hidePanels()]; 
    267     this.editor._textArea.style.display = 'none'; 
    268     this.editor._iframe.style.visibility   = 'hidden'; 
    269   } 
    270   if (!this.editor._isFullScreen) 
    271   { 
    272     if(Xinha.is_ie && document.compatMode == 'CSS1Compat') 
    273     { 
    274       var bod = document.getElementsByTagName('html'); 
    275     } 
    276     else 
    277     { 
    278       var bod = document.getElementsByTagName('body'); 
    279     } 
    280    
    281     bod[0].style.overflow='hidden'; 
    282     window.scroll(this.scrollPos.x, this.scrollPos.y); 
    283   } 
    284  
    285   Xinha.Dialog.background[this.layer][0].style.display = ''; 
    286   Xinha.Dialog.background[this.layer][1].style.display = ''; 
    287    
    288   var backgroundSize = this.sizeBackground(); 
    289   var backgroundHeight = backgroundSize.y; 
    290   var backgroundWidth = backgroundSize.x; 
    291    
    292   this.onResizeWin = function () {dialog.sizeBackground()}; 
    293   Xinha._addEvent(window, 'resize', this.onResizeWin ); 
    294    
    295  
    296    
    297   var rootElemStyle = rootElem.style; 
    298   rootElemStyle.display   = ''; 
    299    
    300   var dialogHeight = rootElem.offsetHeight; 
    301   var dialogWidth = rootElem.offsetWidth; 
    302    
    303   if (dialogHeight >  backgroundHeight) 
    304   { 
    305         rootElemStyle.height =  backgroundHeight + "px"; 
    306         if (rootElem.scrollHeight > dialogHeight) 
    307         { 
    308           rootElemStyle.overflowY = "auto"; 
    309         } 
    310   } 
    311  
    312   if(this.size.top && this.size.left) 
    313   { 
    314     rootElemStyle.top =  parseInt(this.size.top,10) + 'px'; 
    315     rootElemStyle.left = parseInt(this.size.left,10) + 'px'; 
    316   } 
    317   else 
    318   { 
    319     if (this.editor.btnClickEvent) 
    320     { 
    321       var btnClickEvent = this.editor.btnClickEvent;  
    322       rootElemStyle.top =  btnClickEvent.clientY + this.scrollPos.y +'px'; 
    323       
    324       if (dialogHeight + rootElem.offsetTop >  backgroundHeight) 
    325       { 
    326         rootElemStyle.top = this.scrollPos.y; 
    327       } 
    328       rootElemStyle.left = btnClickEvent.clientX +  this.scrollPos.x +'px'; 
    329       if (dialogWidth + rootElem.offsetLeft >  backgroundWidth) 
    330       { 
    331         rootElemStyle.left =  btnClickEvent.clientX - dialogWidth   + 'px'; 
    332         if (rootElem.offsetLeft < 0)  
    333         { 
    334                 rootElemStyle.left = 0; 
    335         } 
    336       } 
    337       this.editor.btnClickEvent = null; 
    338     } 
    339     else 
    340     { 
    341     var top =  ( backgroundHeight - dialogHeight) / 2; 
    342     var left = ( backgroundWidth - dialogWidth) / 2; 
    343     rootElemStyle.top =  ((top > 0) ? top : 0) +'px'; 
    344     rootElemStyle.left = ((left > 0) ? left : 0)+'px';           
    345     } 
    346          
    347   } 
    348   this.width = dialogWidth; 
    349   this.height = dialogHeight;   
    350    
    351   if(typeof values != 'undefined') 
    352   { 
    353     this.setValues(values); 
    354   } 
    355   this.dialogShown = true; 
    356   resetScroll(); 
    357 }; 
    358  
    359 Xinha.Dialog.prototype.hide = function() 
    360 { 
    361   this.rootElem.style.display = 'none'; 
    362   Xinha.Dialog.background[this.layer][0].style.display = 'none'; 
    363   Xinha.Dialog.background[this.layer][1].style.display = 'none'; 
    364   var dialog = this; 
    365  
    366   Xinha._removeEvent(window, 'resize', this.onResizeWin); 
    367    
    368   if (Xinha.is_gecko) 
    369   { 
    370     this.editor._textArea.style.display = this._restoreTo[0]; 
    371     this.editor._iframe.style.visibility   = this._restoreTo[1]; 
    372     this.editor.showPanels(this._restoreTo[2]);   
    373   } 
    374    
    375   if (!this.editor._isFullScreen) 
    376   { 
    377     if(Xinha.is_ie && document.compatMode == 'CSS1Compat') 
    378     { 
    379       var bod = document.getElementsByTagName('html'); 
    380     } 
    381     else 
    382     { 
    383       var bod = document.getElementsByTagName('body'); 
    384     } 
    385     bod[0].style.overflow=''; 
    386     window.scroll(this.scrollPos.x, this.scrollPos.y); 
    387   } 
    388 // Restore the selection 
    389   this.editor.activateEditor(); 
    390   if (Xinha.is_gecko) 
    391   {              
    392     var sel = this.editor.getSelection(); 
    393     sel.removeAllRanges(); 
    394     sel.addRange(this._lastRange); 
    395   } 
    396   else 
    397   {  
    398     this._lastRange.select(); 
    399   } 
    400   this.dialogShown = false; 
    401   this.editor.updateToolbar(); 
     928  this.rootElem.innerHTML = html; 
     929}; 
     930 
     931Xinha.PanelDialog.prototype.show = function(values) 
     932{ 
     933  this.editor.showPanel(this.rootElem); 
     934}; 
     935 
     936Xinha.PanelDialog.prototype.hide = function() 
     937{ 
     938  this.editor.hidePanel(this.rootElem); 
    402939  return this.getValues(); 
    403940}; 
    404941 
    405 Xinha.Dialog.prototype.toggle = function() 
    406 { 
    407   if(this.rootElem.style.display == 'none') 
    408   { 
    409     this.show(); 
    410   } 
    411   else 
    412   { 
    413     this.hide(); 
    414   } 
    415 }; 
    416  
    417 Xinha.Dialog.prototype.getElementById = function(id) 
    418 { 
    419   return this.document.getElementById(this.id[id] ? this.id[id] : id); 
    420 }; 
    421  
    422 Xinha.Dialog.prototype.getElementsByName = function(name) 
    423 { 
    424   return this.document.getElementsByName(this.id[name] ? this.id[name] : name); 
    425 }; 
    426  
    427 Xinha.Dialog.prototype._dragStart = function (ev)  
    428 { 
    429  
    430   var dialog = this; 
    431   if (dialog.dragging)  
    432   { 
    433     return; 
    434   } 
    435   dialog.dragging = true; 
    436  
    437   var st = dialog.rootElem.style; 
    438  
    439   dialog.xOffs = ((Xinha.is_ie) ? window.event.offsetX : ev.layerX); 
    440   dialog.yOffs = ((Xinha.is_ie) ? window.event.offsetY : ev.layerY); 
    441  
    442   Xinha._addEvent(document, "mousemove", function(ev) { dialog.dragIt(ev); } ); 
    443   Xinha._addEvent(document, "mouseup", function (ev) { dialog.dragEnd(ev); } ); 
    444 }; 
    445  
    446 Xinha.Dialog.prototype.dragIt = function(ev) 
    447 { 
    448   var dialog = this; 
    449  
    450   if (!dialog.dragging)  
    451   { 
    452     return false; 
    453   } 
    454   ev = (Xinha.is_ie) ? window.event : ev; 
    455  
    456   var posY = ev.clientY + this.scrollPos.y; 
    457   var posX = ev.clientX + this.scrollPos.x; 
    458  
    459   var st = dialog.rootElem.style; 
    460  
    461   st.left = (posX - dialog.xOffs) + "px"; 
    462   st.top = (posY - dialog.yOffs) + "px"; 
    463 }; 
    464  
    465 Xinha.Dialog.prototype.dragEnd = function(ev) 
    466 { 
    467   var dialog = this; 
    468   dialog.dragging = false; 
    469  
    470   Xinha._removeEvent(document, "mousemove", function(ev) { dialog.dragIt(ev); } ); 
    471   Xinha._removeEvent(document, "mouseup", function (ev) { dialog.dragEnd(ev); } ); 
    472  
    473   dialog.size.top  = dialog.rootElem.style.top; 
    474   dialog.size.left =dialog.rootElem.style.left; 
    475 }; 
    476  
    477 Xinha.Dialog.prototype._resizeStart = function (ev) { 
    478   var dialog = this; 
    479  
    480   if (dialog.resizing) 
    481   { 
    482     return; 
    483   } 
    484   dialog.resizing = true; 
    485  
    486   var st = dialog.rootElem.style; 
    487   st.minHeight = ''; 
    488   st.overflow  =  'hidden'; 
    489   dialog.xOffs = parseInt(st.left,10); 
    490   dialog.yOffs = parseInt(st.top,10); 
    491  
    492   Xinha._addEvent(document, "mousemove", function(ev) { dialog.resizeIt(ev); } ); 
    493   Xinha._addEvent(document, "mouseup", function (ev) { dialog.resizeEnd(ev); } ); 
    494 }; 
    495  
    496 Xinha.Dialog.prototype.resizeIt = function(ev) 
    497 { 
    498   var dialog = this; 
    499  
    500   if (!dialog.resizing) { 
    501     return false; 
    502   } 
    503  
    504   var posY = ev.clientY + dialog.scrollPos.y; 
    505   var posX = ev.clientX + dialog.scrollPos.x; 
    506  
    507   var st = dialog.rootElem.style; 
    508  
    509   posX = posX - dialog.xOffs; 
    510   posY = posY - dialog.yOffs; 
    511  
    512   st.width  = (( posX > 10) ? posX : 10) + "px"; 
    513   st.height = (( posY > 10) ? posY : 10) + "px"; 
    514  
    515   dialog.width = dialog.rootElem.offsetWidth; 
    516   dialog.height = dialog.rootElem.offsetHeight; 
    517  
    518   dialog.onresize(); 
    519 }; 
    520  
    521 Xinha.Dialog.prototype.resizeEnd = function(ev) 
    522 { 
    523   var dialog = this; 
    524   dialog.resizing = false; 
    525  
    526   Xinha._removeEvent(document, "mousemove", function(ev) { dialog.resizeIt(ev); } ); 
    527   Xinha._removeEvent(document, "mouseup", function (ev) { dialog.resizeEnd(ev); } ); 
    528  
    529   dialog.size.width  = dialog.rootElem.offsetWidth; 
    530   dialog.size.height = dialog.rootElem.offsetHeight; 
    531 }; 
    532  
    533 Xinha.Dialog.prototype.setValues = function(values) 
    534 { 
    535   for(var i in values) 
    536   { 
    537     var elems = this.getElementsByName(i); 
    538     if(!elems) continue; 
    539     for(var x = 0; x < elems.length; x++) 
    540     { 
    541       var e = elems[x]; 
    542       switch(e.tagName.toLowerCase()) 
    543       { 
    544         case 'select'  : 
    545         { 
    546           for(var j = 0; j < e.options.length; j++) 
    547           { 
    548             if(typeof values[i] == 'object') 
    549             { 
    550               for(var k = 0; k < values[i].length; k++) 
    551               { 
    552                 if(values[i][k] == e.options[j].value) 
    553                 { 
    554                   e.options[j].selected = true; 
    555                 } 
    556               } 
    557             } 
    558             else if(values[i] == e.options[j].value) 
    559             { 
    560               e.options[j].selected = true; 
    561             } 
    562           } 
    563           break; 
    564         } 
    565  
    566  
    567         case 'textarea': 
    568         case 'input'   : 
    569         { 
    570           switch(e.getAttribute('type')) 
    571           { 
    572             case 'radio'   : 
    573             { 
    574               if(e.value == values[i]) 
    575               { 
    576                 e.checked = true; 
    577               } 
    578               break; 
    579             } 
    580  
    581             case 'checkbox': 
    582             { 
    583               if(typeof values[i] == 'object') 
    584               { 
    585                 for(var j in values[i]) 
    586                 { 
    587                   if(values[i][j] == e.value) 
    588                   { 
    589                     e.checked = true; 
    590                   } 
    591                 } 
    592               } 
    593               else 
    594               { 
    595                 if(values[i] == e.value) 
    596                 { 
    597                   e.checked = true; 
    598                 } 
    599               } 
    600               break; 
    601             } 
    602  
    603             default    : 
    604             { 
    605               e.value = values[i]; 
    606             } 
    607           } 
    608           break; 
    609         } 
    610  
    611         default        : 
    612         break; 
    613       } 
    614     } 
    615   } 
    616 }; 
    617  
    618 Xinha.Dialog.prototype.getValues = function() 
    619 { 
    620   var values = [ ]; 
    621   var inputs = Xinha.collectionToArray(this.rootElem.getElementsByTagName('input')) 
    622               .append(Xinha.collectionToArray(this.rootElem.getElementsByTagName('textarea'))) 
    623               .append(Xinha.collectionToArray(this.rootElem.getElementsByTagName('select'))); 
    624  
    625   for(var x = 0; x < inputs.length; x++) 
    626   { 
    627     var i = inputs[x]; 
    628     if(!(i.name && this.r_id[i.name])) continue; 
    629  
    630     if(typeof values[this.r_id[i.name]] == 'undefined') 
    631     { 
    632       values[this.r_id[i.name]] = null; 
    633     } 
    634     var v = values[this.r_id[i.name]]; 
    635  
    636     switch(i.tagName.toLowerCase()) 
    637     { 
    638       case 'select': 
    639       { 
    640         if(i.multiple) 
    641         { 
    642           if(!v.push) 
    643           { 
    644             if(v != null) 
    645             { 
    646               v = [v]; 
    647             } 
    648             else 
    649             { 
    650               v = new Array(); 
    651             } 
    652           } 
    653           for(var j = 0; j < i.options.length; j++) 
    654           { 
    655             if(i.options[j].selected) 
    656             { 
    657               v.push(i.options[j].value); 
    658             } 
    659           } 
    660         } 
    661         else 
    662         { 
    663           if(i.selectedIndex >= 0) 
    664           { 
    665             v = i.options[i.selectedIndex]; 
    666           } 
    667         } 
    668         break; 
    669       } 
    670  
    671       case 'textarea': 
    672       case 'input'   : 
    673       default        : 
    674       { 
    675         switch(i.type.toLowerCase()) 
    676         { 
    677           case  'radio': 
    678           { 
    679             if(i.checked) 
    680             { 
    681               v = i.value; 
    682               break; 
    683             } 
    684           } 
    685  
    686           case 'checkbox': 
    687           { 
    688             if(v == null) 
    689             { 
    690               if(this.getElementsByName(this.r_id[i.name]).length > 1) 
    691               { 
    692                 v = new Array(); 
    693               } 
    694             } 
    695  
    696             if(i.checked) 
    697             { 
    698               if(v != null && typeof v == 'object' && v.push) 
    699               { 
    700                 v.push(i.value); 
    701               } 
    702               else 
    703               { 
    704                 v = i.value; 
    705               } 
    706             } 
    707             break; 
    708           } 
    709  
    710           default   : 
    711           { 
    712             v = i.value; 
    713             break; 
    714           } 
    715         } 
    716       } 
    717  
    718     } 
    719  
    720     values[this.r_id[i.name]] = v; 
    721   } 
    722   return values; 
    723 }; 
     942Xinha.PanelDialog.prototype.onresize   = Xinha.Dialog.prototype.onresize; 
     943 
     944Xinha.PanelDialog.prototype.toggle     = Xinha.Dialog.prototype.toggle; 
     945 
     946Xinha.PanelDialog.prototype.setValues  = Xinha.Dialog.prototype.setValues; 
     947 
     948Xinha.PanelDialog.prototype.getValues  = Xinha.Dialog.prototype.getValues; 
     949 
     950Xinha.PanelDialog.prototype.getElementById    = Xinha.Dialog.prototype.getElementById; 
     951 
     952Xinha.PanelDialog.prototype.getElementsByName = Xinha.Dialog.prototype.getElementsByName; 
  • branches/ray/modules/FullScreen/full-screen.js

    r762 r782  
    7272   */ 
    7373  function resetScroll() 
    74   {console.log('resetScroll'); 
     74  { 
    7575    if(e._isFullScreen) 
    7676    { 
  • branches/ray/modules/Gecko/Gecko.js

    r775 r782  
    758758  return d; 
    759759}; 
     760 
     761Xinha.prototype.saveSelection = function() 
     762{ 
     763  return this.createRange(this.getSelection()).cloneRange(); 
     764} 
     765Xinha.prototype.restoreSelection = function(savedSelection) 
     766{ 
     767  var sel = this.getSelection(); 
     768  sel.removeAllRanges(); 
     769  sel.addRange(savedSelection); 
     770} 
  • branches/ray/modules/InternetExplorer/InternetExplorer.js

    r775 r782  
    469469  return (doc.compatMode == "CSS1Compat") ? '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">' : ''; 
    470470}; 
     471 
     472Xinha.prototype.saveSelection = function() 
     473{ 
     474  return this.createRange(this._getSelection()) 
     475} 
     476Xinha.prototype.restoreSelection = function(savedSelection) 
     477{ 
     478  savedSelection.select(); 
     479} 
  • branches/ray/plugins/CharacterMap/character-map.js

    r775 r782  
    1414      image    : editor.imgURL( 'ed_charmap.gif', 'CharacterMap' ), 
    1515      textMode : false, 
    16       action   : function( editor ) { self.buttonPress( editor ); } 
     16      action   : function() { self.show(); } 
    1717    } 
    1818  ); 
     
    2121  if ( cfg.CharacterMap.mode == 'panel' ) 
    2222  { 
    23     editor._CharacterMap = editor.addPanel( 'right' ); 
    24     HTMLArea._addClass( editor._CharacterMap, 'CharacterMap' ); 
     23    //editor._CharacterMap = editor.addPanel( 'right' ); 
     24   // HTMLArea._addClass( editor._CharacterMap, 'CharacterMap' ); 
    2525 
    26     editor.notifyOn( 'modechange', 
     26 
     27/*    editor.notifyOn( 'modechange', 
    2728      function( e, args ) 
    2829      { 
    2930        if ( args.mode == 'text' ) editor.hidePanel( editor._CharacterMap ); 
    3031      } 
    31     ); 
     32    );*/ 
    3233 
    33     var entites = 
    34     [ 
    35       '&Yuml;', '&scaron;', '&#064;', '&quot;', '&iexcl;', '&cent;', '&pound;', '&curren;', '&yen;', '&brvbar;', 
    36       '&sect;', '&uml;', '&copy;', '&ordf;', '&laquo;', '&not;', '&macr;', '&deg;', '&plusmn;', '&sup2;', 
    37       '&sup3;', '&acute;', '&micro;', '&para;', '&middot;', '&cedil;', '&sup1;', '&ordm;', '&raquo;', '&frac14;', 
    38       '&frac12;', '&frac34;', '&iquest;', '&times;', '&Oslash;', '&divide;', '&oslash;', '&fnof;', '&circ;', 
    39       '&tilde;', '&ndash;', '&mdash;', '&lsquo;', '&rsquo;', '&sbquo;', '&ldquo;', '&rdquo;', '&bdquo;', 
    40       '&dagger;', '&Dagger;', '&bull;', '&hellip;', '&permil;', '&lsaquo;', '&rsaquo;', '&euro;', '&trade;', 
    41       '&Agrave;', '&Aacute;', '&Acirc;', '&Atilde;', '&Auml;', '&Aring;', '&AElig;', '&Ccedil;', '&Egrave;', 
    42       '&Eacute;', '&Ecirc;', '&Euml;', '&Igrave;', '&Iacute;', '&Icirc;', '&Iuml;', '&ETH;', '&Ntilde;', 
    43       '&Ograve;', '&Oacute;', '&Ocirc;', '&Otilde;', '&Ouml;', '&reg;', '&times;', '&Ugrave;', '&Uacute;', 
    44       '&Ucirc;', '&Uuml;', '&Yacute;', '&THORN;', '&szlig;', '&agrave;', '&aacute;', '&acirc;', '&atilde;', 
    45       '&auml;', '&aring;', '&aelig;', '&ccedil;', '&egrave;', '&eacute;', '&ecirc;', '&euml;', '&igrave;', 
    46       '&iacute;', '&icirc;', '&iuml;', '&eth;', '&ntilde;', '&ograve;', '&oacute;', '&ocirc;', '&otilde;', 
    47       '&ouml;', '&divide;', '&oslash;', '&ugrave;', '&uacute;', '&ucirc;', '&uuml;', '&yacute;', '&thorn;', 
    48       '&yuml;', '&OElig;', '&oelig;', '&Scaron;' 
    49     ]; 
    50  
    51     for ( var i=0; i<entites.length; i++ ) 
    52       this.addEntity( entites[i], i ); 
    53  
    54     editor.hidePanel( editor._CharacterMap ); 
     34    
     35    //editor.hidePanel( editor._CharacterMap ); 
    5536  } 
    5637} 
     
    120101    return false; 
    121102  }; 
    122   editor._CharacterMap.appendChild( a ); 
     103  this.dialog.rootElem.appendChild( a ); 
    123104  a = null; 
    124105}; 
     106 
     107CharacterMap.prototype.onGenerateOnce = function() 
     108{ 
     109        this._prepareDialog(); 
     110}; 
     111 
     112CharacterMap.prototype._prepareDialog = function() 
     113{ 
     114        var self = this; 
     115        var editor = this.editor; 
     116 
     117        if(!this.html) // retrieve the raw dialog contents 
     118        { 
     119                Xinha._getback(_editor_url + 'plugins/CharacterMap/dialog.html', function(getback) { self.html = getback; self._prepareDialog(); }); 
     120                return; 
     121        } 
     122 
     123        // Now we have everything we need, so we can build the dialog. 
     124        this.dialog = new Xinha.Dialog(editor, this.html, 'CharacterMap',{width:300},false); 
     125        HTMLArea._addClass( this.dialog.rootElem, 'CharacterMap' ); 
     126        var entites = 
     127        [ 
     128        '&Yuml;', '&scaron;', '&#064;', '&quot;', '&iexcl;', '&cent;', '&pound;', '&curren;', '&yen;', '&brvbar;', 
     129        '&sect;', '&uml;', '&copy;', '&ordf;', '&laquo;', '&not;', '&macr;', '&deg;', '&plusmn;', '&sup2;', 
     130        '&sup3;', '&acute;', '&micro;', '&para;', '&middot;', '&cedil;', '&sup1;', '&ordm;', '&raquo;', '&frac14;', 
     131        '&frac12;', '&frac34;', '&iquest;', '&times;', '&Oslash;', '&divide;', '&oslash;', '&fnof;', '&circ;', 
     132        '&tilde;', '&ndash;', '&mdash;', '&lsquo;', '&rsquo;', '&sbquo;', '&ldquo;', '&rdquo;', '&bdquo;', 
     133        '&dagger;', '&Dagger;', '&bull;', '&hellip;', '&permil;', '&lsaquo;', '&rsaquo;', '&euro;', '&trade;', 
     134        '&Agrave;', '&Aacute;', '&Acirc;', '&Atilde;', '&Auml;', '&Aring;', '&AElig;', '&Ccedil;', '&Egrave;', 
     135        '&Eacute;', '&Ecirc;', '&Euml;', '&Igrave;', '&Iacute;', '&Icirc;', '&Iuml;', '&ETH;', '&Ntilde;', 
     136        '&Ograve;', '&Oacute;', '&Ocirc;', '&Otilde;', '&Ouml;', '&reg;', '&times;', '&Ugrave;', '&Uacute;', 
     137        '&Ucirc;', '&Uuml;', '&Yacute;', '&THORN;', '&szlig;', '&agrave;', '&aacute;', '&acirc;', '&atilde;', 
     138        '&auml;', '&aring;', '&aelig;', '&ccedil;', '&egrave;', '&eacute;', '&ecirc;', '&euml;', '&igrave;', 
     139        '&iacute;', '&icirc;', '&iuml;', '&eth;', '&ntilde;', '&ograve;', '&oacute;', '&ocirc;', '&otilde;', 
     140        '&ouml;', '&divide;', '&oslash;', '&ugrave;', '&uacute;', '&ucirc;', '&uuml;', '&yacute;', '&thorn;', 
     141        '&yuml;', '&OElig;', '&oelig;', '&Scaron;' 
     142        ]; 
     143 
     144        for ( var i=0; i<entites.length; i++ ) 
     145        { 
     146          this.addEntity( entites[i], i ); 
     147        } 
     148         
     149        this.ready = true; 
     150        //this.hide(); 
     151}; 
     152 
     153CharacterMap.prototype.show = function() 
     154{ 
     155        if(!this.ready) // if the user is too fast clicking the, we have to make them wait 
     156        { 
     157                var self = this; 
     158                window.setTimeout(function() {self.show();},100); 
     159                return; 
     160        } 
     161 
     162        this.dialog.show(); 
     163 
     164}; 
     165CharacterMap.prototype.hide = function() 
     166{ 
     167        this.dialog.hide(); 
     168}; 
     169 
Note: See TracChangeset for help on using the changeset viewer.