Changeset 984 for branches


Ignore:
Timestamp:
03/22/08 12:37:20 (12 years ago)
Author:
ray
Message:

updated branch with changes frum trunk

Location:
branches/ray
Files:
9 edited

Legend:

Unmodified
Added
Removed
  • branches/ray/Xinha.css

    r975 r984  
    11.htmlarea { background: #fff; } 
    22.htmlarea td { margin:0;padding:0; } 
     3 
     4.htmlarea .toolbarRow { 
     5  width:1px; 
     6} 
    37 
    48.htmlarea .toolbar { 
  • branches/ray/XinhaCore.js

    r983 r984  
    134134@type string  
    135135*/ 
    136 Xinha.opera_version = navigator.appVersion.substring(0, navigator.appVersion.indexOf(" "))*1; 
     136if(Xinha.is_opera && Xinha.agt.match(/opera[\/ ]([0-9.]+)/)) 
     137{ 
     138  Xinha.opera_version = parseFloat(RegExp.$1); 
     139} 
     140else 
     141{ 
     142  Xinha.opera_version = 0; 
     143} 
    137144/** Browserengine is KHTML (Konqueror, Safari) 
    138145@type string  
     
    143150*/ 
    144151Xinha.is_webkit  = (Xinha.agt.indexOf("applewebkit") != -1); 
     152Xinha.webkit_version = parseInt(navigator.appVersion.replace(/.*?AppleWebKit\/([\d]).*?/,'$1')); 
     153 
    145154/** Browser is Safari 
    146155@type string  
     
    159168*/ 
    160169Xinha.is_win_ie = (Xinha.is_ie && !Xinha.is_mac); 
    161 /** Browserengine is Gecko (Mozilla), applies also to Safari 
     170/** Browser engine is Gecko (Mozilla), applies also to Safari and Opera which work 
     171 *  largely similar. 
    162172@type string  
    163173*/ 
    164 Xinha.is_gecko  = (navigator.product == "Gecko"); 
     174Xinha.is_gecko  = (navigator.product == "Gecko") || Xinha.is_opera; 
    165175Xinha.is_real_gecko = (navigator.product == "Gecko" && !Xinha.is_webkit); 
    166 Xinha.is_ff3 = Xinha.is_real_gecko && parseInt(navigator.productSub) >= "2007121016"; 
    167 Xinha.is_ff2 = Xinha.is_real_gecko && parseInt(navigator.productSub) < "2007121016"; 
     176Xinha.is_ff3 = Xinha.is_real_gecko && parseInt(navigator.productSub) >= 2007121016; 
     177Xinha.is_ff2 = Xinha.is_real_gecko && parseInt(navigator.productSub) < 2007121016; 
    168178 
    169179/** File is opened locally opened ("file://" protocol) 
     
    184194Xinha.checkSupportedBrowser = function() 
    185195{ 
    186   if ( Xinha.is_opera ) 
    187   { 
    188     // alert("Sorry, Opera is not yet supported by Xinha."); 
    189       return false; 
    190     } 
    191   return Xinha.is_gecko || (Xinha.is_opera && 0 && Xinha.opera_version >= 9.1) || Xinha.ie_version >= 5.5; 
     196  return Xinha.is_real_gecko || (Xinha.is_opera && Xinha.opera_version >= 9.2) || Xinha.ie_version >= 5.5 || Xinha.webkit_version >= 522; 
    192197}; 
    193198/** Cache result of checking for browser support 
     
    454459* @type RegExp 
    455460*/ 
    456 Xinha.RE_email    = /[_a-z\d\-\.]{3,}@[_a-z\d\-]{2,}(\.[_a-z\d\-]{2,})+/i; 
     461Xinha.RE_email    = /^[_a-z\d\-\.]{3,}@[_a-z\d\-]{2,}(\.[_a-z\d\-]{2,})+$/i; 
    457462/** Identifies URLs 
    458463* @type RegExp 
     
    20552060    editor._browserSpecificPlugin = editor.registerPlugin('WebKit'); 
    20562061  } 
     2062  else if (Xinha.is_opera) 
     2063  { 
     2064    url = _editor_url + 'modules/Opera/Opera.js'; 
     2065    if ( !Xinha.loadPlugins(["Opera"], function() { editor.generate(); }, url ) ) 
     2066    {             
     2067      return false; 
     2068    } 
     2069    editor._browserSpecificPlugin = editor.registerPlugin('Opera'); 
     2070  } 
    20572071  else if (Xinha.is_gecko) 
    20582072  { 
     
    21352149    editor.registerPlugin('EnterParagraphs'); 
    21362150  } 
     2151  //TEMPORARY FIX FOR IE8 see #1175 
     2152  if (Xinha.ie_version == 8) 
     2153  { 
     2154    this.config.getHtmlMethod = 'TransformInnerHTML'; 
     2155  } 
    21372156 
    21382157  switch (this.config.getHtmlMethod) 
     
    23402359  if (Xinha.is_opera) 
    23412360    { 
    2342       Xinha._addEvent( 
    2343         this._iframe.contentWindow, 
    2344         'load', 
    2345         function(e) 
    2346         { 
    2347           if ( !editor._iframeLoadDone ) 
    2348           { 
    2349              editor._iframeLoadDone = true; 
    23502361             editor.initIframe(); 
    23512362          } 
    2352           return true; 
    2353         } 
    2354       ) 
    2355     } 
    23562363  else 
    23572364    Xinha._addEvent( 
     
    50245031    if ( typeof this.config.baseHref != 'undefined' && this.config.baseHref !== null ) 
    50255032    { 
    5026       baseRe = new RegExp( "((href|src|background)=\")(" + Xinha.escapeStringForRegExp(this.config.baseHref.replace(/([^\/]\/)(?=.+\.)[^\/]*$/, "$1")) + ")", 'g' ); 
     5033      baseRe = new RegExp( "((href|src|background|action)=\")(" + Xinha.escapeStringForRegExp(this.config.baseHref.replace(/([^\/]\/)(?=.+\.)[^\/]*$/, "$1")) + ")", 'g' ); 
    50275034    } 
    50285035    else 
    50295036    { 
    5030       baseRe = new RegExp( "((href|src|background)=\")(" +  Xinha.escapeStringForRegExp(document.location.href.replace( /^(https?:\/\/[^\/]*)(.*)/, '$1' )) + ")", 'g' ); 
     5037      baseRe = new RegExp( "((href|src|background|action)=\")(" +  Xinha.escapeStringForRegExp(document.location.href.replace( /^(https?:\/\/[^\/]*)(.*)/, '$1' )) + ")", 'g' ); 
    50315038    } 
    50325039 
     
    61286135      } 
    61296136      else  
     6137      { 
    61306138      s += prop + ' = ' + o[prop] + '\n'; 
    61316139    } 
     6140 
     6141    } 
    61326142    if (s)  
    61336143    { 
     6144      if (document.getElementById('errors')) 
     6145      { 
     6146        document.getElementById('errors').value += s; 
     6147      } 
     6148      else 
     6149      { 
    61346150    var x = window.open("", "debugger"); 
    61356151    x.document.write('<pre>' + s + '</pre>'); 
    61366152  } 
     6153} 
    61376154} 
    61386155} 
     
    71377154Xinha.init(); 
    71387155 
    7139 if (Xinha.is_ie) 
     7156if ( Xinha.ie_version < 8 ) 
    71407157{ 
    71417158  Xinha.addDom0Event(window,'unload',Xinha.collectGarbageForIE); 
  • branches/ray/modules/ColorPicker/ColorPicker.js

    r975 r984  
    9090  function ColorPicker()  
    9191  { 
    92         // dummy function for Xinha plugin api, note the different names 
     92  // dummy function for Xinha plugin api, note the different names 
    9393  } 
    94   if (window.opener && window.opener.Xinha) 
    95   { // this prevents that the Xinha.colorPicker object of the opening window is replaced by the one loaded in the popup 
    96         var openerColorPicker = window.opener.Xinha.colorPicker; 
    97         Xinha._addEvent(window,'unload', function() {Xinha.colorPicker = openerColorPicker;}); 
    98   } 
     94  try { 
     95    if (window.opener && window.opener.Xinha) 
     96    { // this prevents that the Xinha.colorPicker object of the opening window is replaced by the one loaded in the popup 
     97      var openerColorPicker = window.opener.Xinha.colorPicker; 
     98      Xinha._addEvent(window,'unload', function() {Xinha.colorPicker = openerColorPicker;}); 
     99    } 
     100  } catch(e) {} 
    99101  //the actual function is below 
    100102  Xinha.colorPicker = function (params) 
     
    105107      Xinha.colorPicker.loadColors(); 
    106108    } 
    107          
    108         this.is_ie_6 = (Xinha.is_ie && Xinha.ie_version < 7); 
     109 
     110    this.is_ie_6 = (Xinha.is_ie && Xinha.ie_version < 7); 
    109111    var picker = this; 
    110112    var enablepick = false; 
     
    128130    this.table.onmouseup = function() 
    129131    { 
    130         enablepick = false; 
    131         enablevalue = false; 
     132      enablepick = false; 
     133      enablevalue = false; 
    132134    }; 
    133135    this.tbody = document.createElement('tbody'); 
     
    197199    this.chosenColor.onchange = function() 
    198200      { 
    199         if(/#[0-9a-f]{6,6}/i.test(this.value)) 
    200         { 
    201               picker.backSample.style.backgroundColor = this.value; 
     201        if(/#[0-9a-f]{6,6}/i.test(this.value)) 
     202        { 
     203          picker.backSample.style.backgroundColor = this.value; 
    202204          picker.foreSample.style.color = this.value; 
    203         } 
     205        } 
    204206      }; 
    205207 
     
    353355      { 
    354356        this.chosenColor.value = initcolor; 
    355             this.backSample.style.backgroundColor = initcolor; 
     357        this.backSample.style.backgroundColor = initcolor; 
    356358        this.foreSample.style.color = initcolor; 
    357359      } 
     
    385387        else 
    386388        { 
    387                   this.table.style.top = 0; 
     389          this.table.style.top = 0; 
    388390        } 
    389391      } 
     
    401403        else 
    402404        { 
    403                   this.table.style.left = 0; 
     405          this.table.style.left = 0; 
    404406        } 
    405407      } 
     
    410412     // IE6 ONLY - prevent windowed elements (<SELECT>) to render above the colorpicker 
    411413      if (this.is_ie_6) 
    412           { 
     414      { 
    413415        this.iframe.style.top = this.table.style.top; 
    414416        this.iframe.style.left = this.table.style.left; 
     
    422424        picker.foreSample.style.color = cell.colorCode; 
    423425        if((cell.hue >= 195  && cell.saturation > 0.5) ||  
    424                         (cell.hue === 0 && cell.saturation === 0 && cell.value < 0.5) ||  
    425                         (cell.hue !== 0 && picker.value < 0.75)) 
     426           (cell.hue === 0 && cell.saturation === 0 && cell.value < 0.5) ||  
     427           (cell.hue !== 0 && picker.value < 0.75)) 
    426428        { 
    427429          cell.style.borderColor = '#fff'; 
     
    445447        else 
    446448        { 
    447                   cell.style.borderColor = '#000'; 
     449          cell.style.borderColor = '#000'; 
    448450        } 
    449451        valuerow = cell.thisrow; 
     
    456458    function unpickCell(row,col) 
    457459    { 
    458           picker.saved_cells[row][col].style.borderColor = picker.saved_cells[row][col].colorCode; 
     460      picker.saved_cells[row][col].style.borderColor = picker.saved_cells[row][col].colorCode; 
    459461    } 
    460462     
     
    510512            { 
    511513              enablepick = true; 
    512 //               unpickCell(pickrow,pickcol); 
     514//            unpickCell(pickrow,pickcol); 
    513515              picker.saved_cells[pickrow][pickcol].style.borderColor = picker.saved_cells[pickrow][pickcol].colorCode; 
    514516              pickCell(this); 
     
    516518            td.onmouseover = function() 
    517519            { 
    518                 if(enablepick) 
    519                 { 
    520                         pickCell(this); 
    521                 } 
     520              if(enablepick) 
     521              { 
     522                pickCell(this); 
     523              } 
    522524            }; 
    523525            td.onmouseout = function() 
    524526            { 
    525                 if(enablepick) 
    526                 { 
    527     //            this.style.borderColor = picker.saved_cells[this.thisrow][this.thiscol].colorCode; 
     527              if(enablepick) 
     528              { 
     529    //          this.style.borderColor = picker.saved_cells[this.thisrow][this.thiscol].colorCode; 
    528530                this.style.borderColor = this.colorCode; 
    529                 } 
     531              } 
    530532            }; 
    531533            td.ondblclick = function() { Xinha.colorPicker.remember(this.colorCode, picker.savecolors); picker.callback(this.colorCode); picker.close(); }; 
     
    566568          { 
    567569            enablevalue = true; 
    568 //            unpickCell(valuerow,valuecol); 
     570//          unpickCell(valuerow,valuecol); 
    569571            picker.saved_cells[valuerow][valuecol].style.borderColor = picker.saved_cells[valuerow][valuecol].colorCode; 
    570572            picker.value = this.hsv_value;  
     
    643645   //           this.style.borderColor = picker.saved_cells[this.thisrow][this.thiscol].colorCode; 
    644646              this.style.borderColor = this.colorCode; 
    645                    } 
     647            } 
    646648          }; 
    647649          td.ondblclick = function() { Xinha.colorPicker.remember(this.colorCode, picker.savecolors); picker.callback(this.colorCode); picker.close(); }; 
     
    786788        this.foreSample.style.color = pickcell.colorCode; 
    787789        if((pickcell.hue >= 195  && pickcell.saturation > 0.5) ||  
    788                         (pickcell.hue === 0 && pickcell.saturation === 0 && pickcell.value < 0.5) ||  
    789                         (pickcell.hue !== 0 && picker.value < 0.75)) 
     790           (pickcell.hue === 0 && pickcell.saturation === 0 && pickcell.value < 0.5) ||  
     791           (pickcell.hue !== 0 && picker.value < 0.75)) 
    790792        { 
    791793           pickcell.style.borderColor = '#fff'; 
     
    793795        else 
    794796        { 
    795                   pickcell.style.borderColor = '#000'; 
     797          pickcell.style.borderColor = '#000'; 
    796798        } 
    797799      } 
     
    892894  {  
    893895    var colPicker = new Xinha.colorPicker(pickerConfig); 
    894           colPicker.open("",chooser, input.value );  
     896    colPicker.open("",chooser, input.value );  
    895897  } 
    896898  Xinha.freeLater(this,"chooser"); 
  • branches/ray/modules/Dialogs/dialog.js

    r975 r984  
    2828                init = window;  // pass this window object by default 
    2929        } 
    30         if (typeof window.showModalDialog == 'function') 
     30        if (typeof window.showModalDialog == 'function' && !Xinha.is_webkit) // webkit easily looses the selection with window.showModalDialog 
    3131        { 
    3232                Dialog._return = function(retVal) { 
    3333                        if (typeof action == 'function') action (retVal); 
    3434                } 
    35                 var r = window.showModalDialog(url, init, "dialogheight=10;dialogwidth=10;resizable=yes"); 
     35                var r = window.showModalDialog(url, init, "dialogheight=300;dialogwidth=400;resizable=yes"); 
    3636        } 
    3737        else 
     
    6161// the dialog will read it's args from this variable 
    6262Dialog._arguments = null; 
     63 
     64Dialog._selection = null; 
    6365 
    6466Dialog._geckoOpenModal = function(url, action, init) { 
  • branches/ray/modules/Gecko/Gecko.js

    r975 r984  
    600600  var sel = this.getSelection(); 
    601601  range = this._doc.createRange(); 
     602  if ( !node ) 
     603  { 
     604     sel.removeAllRanges(); 
     605     return; 
     606  } 
    602607  // Tables and Images get selected as "objects" rather than the text contents 
    603608  if ( collapsed && node.tagName && node.tagName.toLowerCase().match(/table|img|input|textarea|select/) ) 
  • branches/ray/modules/InternetExplorer/InternetExplorer.js

    r975 r984  
    495495{ 
    496496  var sel = this.getSelection(); 
    497   if (this.selectionEmpty) return ''; 
     497  if (this.selectionEmpty(sel)) return ''; 
    498498  var range = this.createRange(sel); 
    499499   
     
    638638Xinha.getDoctype = function (doc) 
    639639{ 
    640   return (doc.compatMode == "CSS1Compat") ? '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">' : ''; 
    641 }; 
     640  return (doc.compatMode == "CSS1Compat" && Xinha.ie_version < 8 ) ? '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">' : ''; 
     641}; 
  • branches/ray/plugins/InsertAnchor/insert-anchor.css

    r761 r984  
    55  background-repeat: no-repeat; 
    66  background-position: left top; 
    7   padding-left: 19px; 
    87  border: 1px dotted blue; 
    98} 
  • branches/ray/plugins/InsertAnchor/insert-anchor.js

    r975 r984  
    44  var self = this; 
    55 
     6  this.placeholderImg = '<img class="IA_placeholder" src="'+_editor_url+'plugins/InsertAnchor/img/placeholder.gif" />'; 
     7   
    68  // register the toolbar buttons provided by this plugin 
    79  cfg.registerButton({ 
     
    3739}; 
    3840 
     41InsertAnchor.prototype.inwardHtml = function(html) 
     42{ 
     43        html= html.replace(/(<a[^>]*class="anchor"[^>]*>)/g,"$1"+this.placeholderImg); 
     44        return html; 
     45} 
     46InsertAnchor.prototype.outwardHtml = function(html) 
     47{ 
     48        html= html.replace(/(<img[^>]*class="?IA_placeholder"?[^>]*>)/ig,""); 
     49        return html; 
     50} 
    3951InsertAnchor.prototype.onGenerateOnce = function() 
    4052{ 
     
    101113        var anchor = param['name']; 
    102114        var a = this.a; 
     115        var self = this; 
    103116        if (anchor == "" || anchor == null) 
    104117        { 
    105118                if (a)  
    106119                { 
    107                         var child = a.innerHTML; 
     120                        var child = self.outwardHtml(a.innerHTML); 
    108121                        a.parentNode.removeChild(a); 
    109122                        editor.insertHTML(child); 
     
    119132                        a.id = anchor; 
    120133                        a.name = anchor; 
     134                        a.title = anchor; 
    121135                        a.className = "anchor"; 
    122                         a.innerHTML = this.selectedHTML; 
    123                         editor.insertNodeAtSelection(a); 
     136                        a.innerHTML = self.placeholderImg; 
     137                        var html = editor.getSelectedHTML(); 
     138                        if (html) a.innerHTML += html; 
     139                        if (Xinha.is_ie)  
     140                        { 
     141                range.pasteHTML(a.outerHTML); 
     142                } 
     143                        else  
     144                        { 
     145                                editor.insertNodeAtSelection(a); 
     146                        } 
    124147                } 
    125148                else  
     
    127150                        a.id = anchor; 
    128151                        a.name = anchor; 
     152                        a.title = anchor; 
    129153                        a.className = "anchor"; 
    130154                } 
  • branches/ray/plugins/SmartReplace/smart-replace.js

    r975 r984  
    6868         
    6969        var self = this; 
    70         Xinha._addEvents( 
     70        Xinha._addEvent( 
    7171        self.editor._doc, 
    72         [ "keypress"], 
     72                 "keypress", 
    7373        function (event) 
    7474        { 
     
    106106        if ( !this.active) return true; 
    107107        var editor = this.editor; 
    108         var charCode =  Xinha.is_ie ? ev.keyCode : ev.charCode; 
     108        var charCode =  Xinha.is_ie ? ev.keyCode : ev.which; 
    109109 
    110110        var key = String.fromCharCode(charCode); 
    111111 
    112         if (charCode == 32) //space bar 
    113         { 
    114                 return this.smartDash() 
    115         } 
    116112        if ( key == '"' || key == "'") 
    117113        { 
    118114                Xinha._stopEvent(ev); 
    119115                return this.smartQuotes(key); 
     116        } 
     117        if (charCode == 32) //space bar 
     118        { 
     119                return this.smartReplace(ev, 2, /^\s-/, ' –', false); // space-space -> dash  
     120        } 
     121        if ( key == '.' ) // ... -> ellipsis 
     122        { 
     123                return this.smartReplace(ev, 2, /\.\./, '
', true); 
    120124        } 
    121125        return true; 
     
    177181                else 
    178182                { 
    179                         r.deleteContents(); 
    180                         editor.insertNodeAtSelection(document.createTextNode(' '+opening));                              
     183                        editor.insertNodeAtSelection(document.createTextNode(opening));                          
    181184                } 
    182185                editor.getSelection().collapseToEnd(); 
    183186        } 
    184 } 
    185  
    186 SmartReplace.prototype.smartDash = function() 
     187        return false; 
     188} 
     189 
     190SmartReplace.prototype.smartReplace = function(ev, lookback, re, replace, stopEvent) 
    187191{ 
    188192        var editor = this.editor; 
     
    192196        if (Xinha.is_ie) 
    193197        { 
    194                 r.moveStart('character', -2); 
     198                r.moveStart('character', -lookback); 
    195199                 
    196                 if(r.text.match(/\s-/)) 
    197                 { 
    198                         r.text = ' '+ String.fromCharCode(8211); 
     200                if(r.text.match(re)) 
     201                { 
     202                        r.text = replace; 
     203                        if (stopEvent)  
     204                        { 
     205                                Xinha._stopEvent(ev); 
     206                                return false 
     207                        } 
    199208                } 
    200209        } 
    201210        else 
    202211        { 
    203                 if (r.startOffset > 1) r.setStart(r.startContainer, r.startOffset -2); 
    204  
    205                 if(r.toString().match(/^ -/)) 
    206                 { 
     212                if (r.startOffset > 1) r.setStart(r.startContainer, r.startOffset -lookback); 
     213 
     214                if(r.toString().match(re)) 
     215                { 
     216                        this.editor.insertNodeAtSelection(document.createTextNode(replace)); 
    207217                        r.deleteContents(); 
    208                         this.editor.insertNodeAtSelection(document.createTextNode(' '+String.fromCharCode(8211))); 
     218                        r.collapse(true); 
     219                        if (stopEvent)  
     220                        { 
     221                                Xinha._stopEvent(ev); 
     222                                return false 
     223                        } 
    209224                } 
    210225                editor.getSelection().collapseToEnd(); 
    211226        } 
     227        return true; 
    212228} 
    213229 
Note: See TracChangeset for help on using the changeset viewer.