<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" /><style type="text/css"><!--
#msg dl { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fc0 solid; padding: 6px; }
#msg ul, pre { overflow: auto; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<title>[13131] trunk: Allow tab intents in plugin/theme editors.</title>
</head>
<body>

<div id="msg">
<dl>
<dt>Revision</dt> <dd><a href="http://trac.wordpress.org/changeset/13131">13131</a></dd>
<dt>Author</dt> <dd>nacin</dd>
<dt>Date</dt> <dd>2010-02-14 02:14:59 +0000 (Sun, 14 Feb 2010)</dd>
</dl>

<h3>Log Message</h3>
<pre>Allow tab intents in plugin/theme editors. Utilizes the Tabby jQuery plugin, see <a href="http://trac.wordpress.org/ticket/12204">#12204</a></pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkwpadminplugineditorphp">trunk/wp-admin/plugin-editor.php</a></li>
<li><a href="#trunkwpadminthemeeditorphp">trunk/wp-admin/theme-editor.php</a></li>
<li><a href="#trunkwpincludesscriptloaderphp">trunk/wp-includes/script-loader.php</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkwpincludesjsjquerytabbydevjs">trunk/wp-includes/js/jquery/tabby.dev.js</a></li>
<li><a href="#trunkwpincludesjsjquerytabbyjs">trunk/wp-includes/js/jquery/tabby.js</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkwpadminplugineditorphp"></a>
<div class="modfile"><h4>Modified: trunk/wp-admin/plugin-editor.php (13130 => 13131)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/wp-admin/plugin-editor.php        2010-02-14 01:16:58 UTC (rev 13130)
+++ trunk/wp-admin/plugin-editor.php        2010-02-14 02:14:59 UTC (rev 13131)
</span><span class="lines">@@ -18,6 +18,7 @@
</span><span class="cx"> wp_reset_vars(array('action', 'redirect', 'profile', 'error', 'warning', 'a', 'file', 'plugin'));
</span><span class="cx"> 
</span><span class="cx"> wp_admin_css( 'theme-editor' );
</span><ins>+wp_enqueue_script( 'tabby' );
</ins><span class="cx"> 
</span><span class="cx"> $plugins = get_plugins();
</span><span class="cx"> 
</span><span class="lines">@@ -229,7 +230,7 @@
</span><span class="cx"> /* &lt;![CDATA[ */
</span><span class="cx"> jQuery(document).ready(function($){
</span><span class="cx">         $('#template').submit(function(){ $('#scrollto').val( $('#newcontent').scrollTop() ); });
</span><del>-        $('#newcontent').scrollTop( $('#scrollto').val() );
</del><ins>+        $('#newcontent').scrollTop( $('#scrollto').val() ).tabby();
</ins><span class="cx"> });
</span><span class="cx"> /* ]]&gt; */
</span><span class="cx"> &lt;/script&gt;
</span></span></pre></div>
<a id="trunkwpadminthemeeditorphp"></a>
<div class="modfile"><h4>Modified: trunk/wp-admin/theme-editor.php (13130 => 13131)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/wp-admin/theme-editor.php        2010-02-14 01:16:58 UTC (rev 13130)
+++ trunk/wp-admin/theme-editor.php        2010-02-14 02:14:59 UTC (rev 13131)
</span><span class="lines">@@ -18,6 +18,7 @@
</span><span class="cx"> wp_reset_vars(array('action', 'redirect', 'profile', 'error', 'warning', 'a', 'file', 'theme', 'dir'));
</span><span class="cx"> 
</span><span class="cx"> wp_admin_css( 'theme-editor' );
</span><ins>+wp_enqueue_script( 'tabby' );
</ins><span class="cx"> 
</span><span class="cx"> $themes = get_themes();
</span><span class="cx"> 
</span><span class="lines">@@ -232,7 +233,7 @@
</span><span class="cx"> /* &lt;![CDATA[ */
</span><span class="cx"> jQuery(document).ready(function($){
</span><span class="cx">         $('#template').submit(function(){ $('#scrollto').val( $('#newcontent').scrollTop() ); });
</span><del>-        $('#newcontent').scrollTop( $('#scrollto').val() );
</del><ins>+        $('#newcontent').scrollTop( $('#scrollto').val() ).tabby();
</ins><span class="cx"> });
</span><span class="cx"> /* ]]&gt; */
</span><span class="cx"> &lt;/script&gt;
</span></span></pre></div>
<a id="trunkwpincludesjsjquerytabbydevjs"></a>
<div class="addfile"><h4>Added: trunk/wp-includes/js/jquery/tabby.dev.js (0 => 13131)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/wp-includes/js/jquery/tabby.dev.js                                (rev 0)
+++ trunk/wp-includes/js/jquery/tabby.dev.js        2010-02-14 02:14:59 UTC (rev 13131)
</span><span class="lines">@@ -0,0 +1,254 @@
</span><ins>+/*
+ *        Tabby jQuery plugin version 0.12
+ *
+ *        Ted Devito - http://teddevito.com/demos/textarea.html
+ *
+ *        You should have received a copy of the GNU General Public License
+ *        along with Easy Widgets. If not, see &lt;http://www.gnu.org/licenses/&gt;
+ *
+ *        Plugin development pattern based on:        http://www.learningjquery.com/2007/10/a-plugin-development-pattern
+ *
+ */

+// create closure
+
+(function($) {

+        // plugin definition
+
+        $.fn.tabby = function(options) {
+                //debug(this);
+                // build main options before element iteration
+                var opts = $.extend({}, $.fn.tabby.defaults, options);
+                var pressed = $.fn.tabby.pressed; 
+                
+                // iterate and reformat each matched element
+                return this.each(function() {
+                        $this = $(this);
+                        
+                        // build element specific options
+                        var options = $.meta ? $.extend({}, opts, $this.data()) : opts;
+                        
+                        $this.bind('keydown',function (e) {
+                                var kc = $.fn.tabby.catch_kc(e);
+                                if (16 == kc) pressed.shft = true;
+                                /*
+                                because both CTRL+TAB and ALT+TAB default to an event (changing tab/window) that 
+                                will prevent js from capturing the keyup event, we'll set a timer on releasing them.
+                                */
+                                if (17 == kc) {pressed.ctrl = true;        setTimeout(&quot;$.fn.tabby.pressed.ctrl = false;&quot;,1000);}
+                                if (18 == kc) {pressed.alt = true;         setTimeout(&quot;$.fn.tabby.pressed.alt = false;&quot;,1000);}
+                                        
+                                if (9 == kc &amp;&amp; !pressed.ctrl &amp;&amp; !pressed.alt) {
+                                        e.preventDefault; // does not work in O9.63 ??
+                                        pressed.last = kc;        setTimeout(&quot;$.fn.tabby.pressed.last = null;&quot;,0);
+                                        process_keypress ($(e.target).get(0), pressed.shft, options);
+                                        return false;
+                                }
+                                
+                        }).bind('keyup',function (e) {
+                                if (16 == $.fn.tabby.catch_kc(e)) pressed.shft = false;
+                        }).bind('blur',function (e) { // workaround for Opera -- http://www.webdeveloper.com/forum/showthread.php?p=806588
+                                if (9 == pressed.last) $(e.target).one('focus',function (e) {pressed.last = null;}).get(0).focus();
+                        });
+                
+                });
+        };
+        
+        // define and expose any extra methods
+        $.fn.tabby.catch_kc = function(e) { return e.keyCode ? e.keyCode : e.charCode ? e.charCode : e.which; };
+        $.fn.tabby.pressed = {shft : false, ctrl : false, alt : false, last: null};
+        
+        // private function for debugging
+        function debug($obj) {
+                if (window.console &amp;&amp; window.console.log)
+                window.console.log('textarea count: ' + $obj.size());
+        };
+
+        function process_keypress (o,shft,options) {
+                var scrollTo = o.scrollTop;
+                //var tabString = String.fromCharCode(9);
+                
+                // gecko; o.setSelectionRange is only available when the text box has focus
+                if (o.setSelectionRange) gecko_tab (o, shft, options);
+                
+                // ie; document.selection is always available
+                else if (document.selection) ie_tab (o, shft, options);
+                
+                o.scrollTop = scrollTo;
+        }
+        
+        // plugin defaults
+        $.fn.tabby.defaults = {tabString : String.fromCharCode(9)};
+        
+        function gecko_tab (o, shft, options) {
+                var ss = o.selectionStart;
+                var es = o.selectionEnd;        
+                                
+                // when there's no selection and we're just working with the caret, we'll add/remove the tabs at the caret, providing more control
+                if(ss == es) {
+                        // SHIFT+TAB
+                        if (shft) {
+                                // check to the left of the caret first
+                                if (&quot;\t&quot; == o.value.substring(ss-options.tabString.length, ss)) {
+                                        o.value = o.value.substring(0, ss-options.tabString.length) + o.value.substring(ss); // put it back together omitting one character to the left
+                                        o.focus();
+                                        o.setSelectionRange(ss - options.tabString.length, ss - options.tabString.length);
+                                } 
+                                // then check to the right of the caret
+                                else if (&quot;\t&quot; == o.value.substring(ss, ss + options.tabString.length)) {
+                                        o.value = o.value.substring(0, ss) + o.value.substring(ss + options.tabString.length); // put it back together omitting one character to the right
+                                        o.focus();
+                                        o.setSelectionRange(ss,ss);
+                                }
+                        }
+                        // TAB
+                        else {                        
+                                o.value = o.value.substring(0, ss) + options.tabString + o.value.substring(ss);
+                                o.focus();
+                            o.setSelectionRange(ss + options.tabString.length, ss + options.tabString.length);
+                        }
+                } 
+                // selections will always add/remove tabs from the start of the line
+                else {
+                        // split the textarea up into lines and figure out which lines are included in the selection
+                        var lines = o.value.split(&quot;\n&quot;);
+                        var indices = new Array();
+                        var sl = 0; // start of the line
+                        var el = 0; // end of the line
+                        var sel = false;
+                        for (var i in lines) {
+                                el = sl + lines[i].length;
+                                indices.push({start: sl, end: el, selected: (sl &lt;= ss &amp;&amp; el &gt; ss) || (el &gt;= es &amp;&amp; sl &lt; es) || (sl &gt; ss &amp;&amp; el &lt; es)});
+                                sl = el + 1;// for &quot;\n&quot;
+                        }
+                        
+                        // walk through the array of lines (indices) and add tabs where appropriate                                                
+                        var modifier = 0;
+                        for (var i in indices) {
+                                if (indices[i].selected) {
+                                        var pos = indices[i].start + modifier; // adjust for tabs already inserted/removed
+                                        // SHIFT+TAB
+                                        if (shft &amp;&amp; options.tabString == o.value.substring(pos,pos+options.tabString.length)) { // only SHIFT+TAB if there's a tab at the start of the line
+                                                o.value = o.value.substring(0,pos) + o.value.substring(pos + options.tabString.length); // omit the tabstring to the right
+                                                modifier -= options.tabString.length;
+                                        }
+                                        // TAB
+                                        else if (!shft) {
+                                                o.value = o.value.substring(0,pos) + options.tabString + o.value.substring(pos); // insert the tabstring
+                                                modifier += options.tabString.length;
+                                        }
+                                }
+                        }
+                        o.focus();
+                        var ns = ss + ((modifier &gt; 0) ? options.tabString.length : (modifier &lt; 0) ? -options.tabString.length : 0);
+                        var ne = es + modifier;
+                        o.setSelectionRange(ns,ne);
+                }
+        }
+        
+        function ie_tab (o, shft, options) {
+                var range = document.selection.createRange();
+                
+                if (o == range.parentElement()) {
+                        // when there's no selection and we're just working with the caret, we'll add/remove the tabs at the caret, providing more control
+                        if ('' == range.text) {
+                                // SHIFT+TAB
+                                if (shft) {
+                                        var bookmark = range.getBookmark();
+                                        //first try to the left by moving opening up our empty range to the left
+                                    range.moveStart('character', -options.tabString.length);
+                                    if (options.tabString == range.text) {
+                                            range.text = '';
+                                    } else {
+                                            // if that didn't work then reset the range and try opening it to the right
+                                            range.moveToBookmark(bookmark);
+                                            range.moveEnd('character', options.tabString.length);
+                                            if (options.tabString == range.text) 
+                                                    range.text = '';
+                                    }
+                                    // move the pointer to the start of them empty range and select it
+                                    range.collapse(true);
+                                        range.select();
+                                }
+                                
+                                else {
+                                        // very simple here. just insert the tab into the range and put the pointer at the end
+                                        range.text = options.tabString; 
+                                        range.collapse(false);
+                                        range.select();
+                                }
+                        }
+                        // selections will always add/remove tabs from the start of the line
+                        else {
+                        
+                                var selection_text = range.text;
+                                var selection_len = selection_text.length;
+                                var selection_arr = selection_text.split(&quot;\r\n&quot;);
+                                
+                                var before_range = document.body.createTextRange();
+                                before_range.moveToElementText(o);
+                                before_range.setEndPoint(&quot;EndToStart&quot;, range);
+                                var before_text = before_range.text;
+                                var before_arr = before_text.split(&quot;\r\n&quot;);
+                                var before_len = before_text.length; // - before_arr.length + 1;
+                                
+                                var after_range = document.body.createTextRange();
+                                after_range.moveToElementText(o);
+                                after_range.setEndPoint(&quot;StartToEnd&quot;, range);
+                                var after_text = after_range.text; // we can accurately calculate distance to the end because we're not worried about MSIE trimming a \r\n
+                                
+                                var end_range = document.body.createTextRange();
+                                end_range.moveToElementText(o);
+                                end_range.setEndPoint(&quot;StartToEnd&quot;, before_range);
+                                var end_text = end_range.text; // we can accurately calculate distance to the end because we're not worried about MSIE trimming a \r\n
+                                                                
+                                var check_html = $(o).html();
+                                $(&quot;#r3&quot;).text(before_len + &quot; + &quot; + selection_len + &quot; + &quot; + after_text.length + &quot; = &quot; + check_html.length);                                
+                                if((before_len + end_text.length) &lt; check_html.length) {
+                                        before_arr.push(&quot;&quot;);
+                                        before_len += 2; // for the \r\n that was trimmed        
+                                        if (shft &amp;&amp; options.tabString == selection_arr[0].substring(0,options.tabString.length))
+                                                selection_arr[0] = selection_arr[0].substring(options.tabString.length);
+                                        else if (!shft) selection_arr[0] = options.tabString + selection_arr[0];        
+                                } else {
+                                        if (shft &amp;&amp; options.tabString == before_arr[before_arr.length-1].substring(0,options.tabString.length)) 
+                                                before_arr[before_arr.length-1] = before_arr[before_arr.length-1].substring(options.tabString.length);
+                                        else if (!shft) before_arr[before_arr.length-1] = options.tabString + before_arr[before_arr.length-1];
+                                }
+                                
+                                for (var i = 1; i &lt; selection_arr.length; i++) {
+                                        if (shft &amp;&amp; options.tabString == selection_arr[i].substring(0,options.tabString.length))
+                                                selection_arr[i] = selection_arr[i].substring(options.tabString.length);
+                                        else if (!shft) selection_arr[i] = options.tabString + selection_arr[i];
+                                }
+                                
+                                if (1 == before_arr.length &amp;&amp; 0 == before_len) {
+                                        if (shft &amp;&amp; options.tabString == selection_arr[0].substring(0,options.tabString.length))
+                                                selection_arr[0] = selection_arr[0].substring(options.tabString.length);
+                                        else if (!shft) selection_arr[0] = options.tabString + selection_arr[0];
+                                }
+
+                                if ((before_len + selection_len + after_text.length) &lt; check_html.length) {
+                                        selection_arr.push(&quot;&quot;);
+                                        selection_len += 2; // for the \r\n that was trimmed
+                                }
+                                
+                                before_range.text = before_arr.join(&quot;\r\n&quot;);
+                                range.text = selection_arr.join(&quot;\r\n&quot;);
+                                
+                                var new_range = document.body.createTextRange();
+                                new_range.moveToElementText(o);
+                                
+                                if (0 &lt; before_len)        new_range.setEndPoint(&quot;StartToEnd&quot;, before_range);
+                                else new_range.setEndPoint(&quot;StartToStart&quot;, before_range);
+                                new_range.setEndPoint(&quot;EndToEnd&quot;, range);
+                                
+                                new_range.select();
+                                
+                        } 
+                }
+        }
+
+// end of closure
+})(jQuery);
</ins></span></pre></div>
<a id="trunkwpincludesjsjquerytabbyjs"></a>
<div class="addfile"><h4>Added: trunk/wp-includes/js/jquery/tabby.js (0 => 13131)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/wp-includes/js/jquery/tabby.js                                (rev 0)
+++ trunk/wp-includes/js/jquery/tabby.js        2010-02-14 02:14:59 UTC (rev 13131)
</span><span class="lines">@@ -0,0 +1 @@
</span><ins>+(function(d){d.fn.tabby=function(f){var g=d.extend({},d.fn.tabby.defaults,f);var h=d.fn.tabby.pressed;return this.each(function(){$this=d(this);var i=d.meta?d.extend({},g,$this.data()):g;$this.bind(&quot;keydown&quot;,function(k){var j=d.fn.tabby.catch_kc(k);if(16==j){h.shft=true}if(17==j){h.ctrl=true;setTimeout(&quot;$.fn.tabby.pressed.ctrl = false;&quot;,1000)}if(18==j){h.alt=true;setTimeout(&quot;$.fn.tabby.pressed.alt = false;&quot;,1000)}if(9==j&amp;&amp;!h.ctrl&amp;&amp;!h.alt){k.preventDefault;h.last=j;setTimeout(&quot;$.fn.tabby.pressed.last = null;&quot;,0);e(d(k.target).get(0),h.shft,i);return false}}).bind(&quot;keyup&quot;,function(j){if(16==d.fn.tabby.catch_kc(j)){h.shft=false}}).bind(&quot;blur&quot;,function(j){if(9==h.last){d(j.target).one(&quot;focus&quot;,function(k){h.last=null}).get(0).focus()}})})};d.fn.tabby.catch_kc=function(f){return f.keyCode?f.keyCode:f.charCode?f.charCode:f.which};d.fn.tabby.pressed={shft:false,ctrl:false,alt:false,last:null};function b(f){if(window.console&amp;&amp;window.console.log){window.console.log(&quot;textarea count: &quot;+f.size())}}function e(i,h,g){var f=i.scrollTop;if(i.setSelectionRange){a(i,h,g)}else{if(document.selection){c(i,h,g)}}i.scrollTop=f}d.fn.tabby.defaults={tabString:String.fromCharCode(9)};function a(j,f,u){var t=j.selectionStart;var r=j.selectionEnd;if(t==r){if(f){if(&quot;\t&quot;==j.value.substring(t-u.tabString.length,t)){j.value=j.value.substring(0,t-u.tabString.length)+j.value.substring(t);j.focus();j.setSelectionRange(t-u.tabString.length,t-u.tabString.length)}else{if(&quot;\t&quot;==j.value.substring(t,t+u.tabString.length)){j.value=j.value.substring(0,t)+j.value.substring(t+u.tabString.length);j.focus();j.setSelectionRange(t,t)}}}else{j.value=j.value.substring(0,t)+u.tabString+j.value.substring(t);j.focus();j.setSelectionRange(t+u.tabString.length,t+u.tabString.length)}}else{var v=j.value.split(&quot;\n&quot;);var s=new Array();var l=0;var h=0;var g=false;for(var n in v){h=l+v[n].length;s.push({start:l,end:h,selected:(l&lt;=t&amp;&amp;h&gt;t)||(h&gt;=r&amp;&amp;l&lt;r)||(l&gt;t&amp;&amp;h&lt;r)});l=h+1}var k=0;for(var n in s){if(s[n].selected){var q=s[n].start+k;if(f&amp;&amp;u.tabString==j.value.substring(q,q+u.tabString.length)){j.value=j.value.substring(0,q)+j.value.substring(q+u.tabString.length);k-=u.tabString.length}else{if(!f){j.value=j.value.substring(0,q)+u.tabString+j.value.substring(q);k+=u.tabString.length}}}}j.focus();var p=t+((k&gt;0)?u.tabString.length:(k&lt;0)?-u.tabString.length:0);var m=r+k;j.setSelectionRange(p,m)}}function c(q,w,f){var p=document.selection.createRange();if(q==p.parentElement()){if(&quot;&quot;==p.text){if(w){var l=p.getBookmark();p.moveStart(&quot;character&quot;,-f.tabString.length);if(f.tabString==p.text){p.text=&quot;&quot;}else{p.moveToBookmark(l);p.moveEnd(&quot;character&quot;,f.tabString.length);if(f.tabString==p.text){p.text=&quot;&quot;}}p.collapse(true);p.select()}else{p.text=f.tabString;p.collapse(false);p.select()}}else{var k=p.text;var n=k.length;var u=k.split(&quot;\r\n&quot;);var z=document.body.createTextRange();z.moveToElementText(q);z.setEndPoint(&quot;EndToStart&quot;,p);var m=z.text;var x=m.split(&quot;\r\n&quot;);var r=m.length;var y=document.body.createTextRange();y.moveToElementText(q);y.setEndPoint(&quot;StartToEnd&quot;,p);var v=y.text;var g=document.body.createTextRange();g.moveToElementText(q);g.setEndPoint(&quot;StartToEnd&quot;,z);var s=g.text;var h=d(q).html();d(&quot;#r3&quot;).text(r+&quot; + &quot;+n+&quot; + &quot;+v.length+&quot; = &quot;+h.length);if((r+s.length)&lt;h.length){x.push(&quot;&quot;);r+=2;if(w&amp;&amp;f.tabString==u[0].substring(0,f.tabString.length)){u[0]=u[0].substring(f.tabString.length)}else{if(!w){u[0]=f.tabString+u[0]}}}else{if(w&amp;&amp;f.tabString==x[x.length-1].substring(0,f.tabString.length)){x[x.length-1]=x[x.length-1].substring(f.tabString.length)}else{if(!w){x[x.length-1]=f.tabString+x[x.length-1]}}}for(var t=1;t&lt;u.length;t++){if(w&amp;&amp;f.tabString==u[t].substring(0,f.tabString.length)){u[t]=u[t].substring(f.tabString.length)}else{if(!w){u[t]=f.tabString+u[t]}}}if(1==x.length&amp;&amp;0==r){if(w&amp;&amp;f.tabString==u[0].substring(0,f.tabString.length)){u[0]=u[0].substring(f.tabString.length)}else{if(!w){u[0]=f.tabString+u[0]}}}if((r+n+v.length)&lt;h.length){u.push(&quot;&quot;);n+=2}z.text=x.join(&quot;\r\n&quot;);p.text=u.join(&quot;\r\n&quot;);var j=document.body.createTextRange();j.moveToElementText(q);if(0&lt;r){j.setEndPoint(&quot;StartToEnd&quot;,z)}else{j.setEndPoint(&quot;StartToStart&quot;,z)}j.setEndPoint(&quot;EndToEnd&quot;,p);j.select()}}}})(jQuery);
</ins><span class="cx">\ No newline at end of file
</span></span></pre></div>
<a id="trunkwpincludesscriptloaderphp"></a>
<div class="modfile"><h4>Modified: trunk/wp-includes/script-loader.php (13130 => 13131)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/wp-includes/script-loader.php        2010-02-14 01:16:58 UTC (rev 13130)
+++ trunk/wp-includes/script-loader.php        2010-02-14 02:14:59 UTC (rev 13131)
</span><span class="lines">@@ -156,6 +156,9 @@
</span><span class="cx">         $scripts-&gt;add( 'suggest', &quot;/wp-includes/js/jquery/suggest$suffix.js&quot;, array('jquery'), '1.1-20090125');
</span><span class="cx">         $scripts-&gt;add_data( 'suggest', 'group', 1 );
</span><span class="cx"> 
</span><ins>+        $scripts-&gt;add( 'tabby', &quot;/wp-includes/js/jquery/tabby$suffix.js&quot;, array('jquery'), '0.12');
+        $scripts-&gt;add_data( 'tabby', 'group', 1 );
+
</ins><span class="cx">         $scripts-&gt;add( 'schedule', '/wp-includes/js/jquery/jquery.schedule.js', array('jquery'), '20m');
</span><span class="cx">         $scripts-&gt;add_data( 'schedule', 'group', 1 );
</span><span class="cx"> 
</span></span></pre>
</div>
</div>

</body>
</html>