http://www.mediawiki.org/wiki/Special:Code/MediaWiki/73046

Revision: 73046
Author:   tparscal
Date:     2010-09-15 02:03:24 +0000 (Wed, 15 Sep 2010)

Log Message:
-----------
Added collapsible tabs plugin, reworked tabIndex functions, and fixed some 
syntax errors.

Modified Paths:
--------------
    trunk/phase3/resources/Resources.php
    trunk/phase3/resources/jquery/jquery.client.js
    trunk/phase3/resources/jquery/jquery.tabIndex.js

Added Paths:
-----------
    trunk/phase3/resources/jquery/jquery.collapsibleTabs.js

Modified: trunk/phase3/resources/Resources.php
===================================================================
--- trunk/phase3/resources/Resources.php        2010-09-15 01:56:25 UTC (rev 
73045)
+++ trunk/phase3/resources/Resources.php        2010-09-15 02:03:24 UTC (rev 
73046)
@@ -30,6 +30,9 @@
        'jquery.client' => new ResourceLoaderFileModule(
                array( 'scripts' => 'resources/jquery/jquery.client.js' )
        ),
+       'jquery.collapsibleTabs' => new ResourceLoaderFileModule(
+               array( 'scripts' => 
'resources/jquery/jquery.collapsibleTabs.js' )
+       ),
        'jquery.color' => new ResourceLoaderFileModule(
                array( 'scripts' => 'resources/jquery/jquery.color.js' )
        ),

Modified: trunk/phase3/resources/jquery/jquery.client.js
===================================================================
--- trunk/phase3/resources/jquery/jquery.client.js      2010-09-15 01:56:25 UTC 
(rev 73045)
+++ trunk/phase3/resources/jquery/jquery.client.js      2010-09-15 02:03:24 UTC 
(rev 73046)
@@ -152,9 +152,9 @@
         * @return Boolean true if browser known or assumed to be supported, 
false if blacklisted
         */
        'test': function( map ) {
-               var client = this.client();
+               var profile = $.client.profile();
                // Check over each browser condition to determine if we are 
running in a compatible client
-               var browser = map[$( 'body' ).is( '.rtl' ) ? 'rtl' : 
'ltr'][client.browser];
+               var browser = map[$( 'body' ).is( '.rtl' ) ? 'rtl' : 
'ltr'][profile.browser];
                if ( typeof browser !== 'object' ) {
                        // Unknown, so we assume it's working
                        return true;
@@ -165,11 +165,11 @@
                        if ( val === false ) {
                                return false;
                        } else if ( typeof val == 'string' ) {
-                               if ( !( eval( 'client.version' + op + '"' + val 
+ '"' ) ) ) {
+                               if ( !( eval( 'profile.version' + op + '"' + 
val + '"' ) ) ) {
                                        return false;
                                }
                        } else if ( typeof val == 'number' ) {
-                               if ( !( eval( 'client.versionNumber' + op + val 
) ) ) {
+                               if ( !( eval( 'profile.versionNumber' + op + 
val ) ) ) {
                                        return false;
                                }
                        }

Added: trunk/phase3/resources/jquery/jquery.collapsibleTabs.js
===================================================================
--- trunk/phase3/resources/jquery/jquery.collapsibleTabs.js                     
        (rev 0)
+++ trunk/phase3/resources/jquery/jquery.collapsibleTabs.js     2010-09-15 
02:03:24 UTC (rev 73046)
@@ -0,0 +1,113 @@
+/*
+ * Collapsible tabs jQuery Plugin
+ */
+jQuery.fn.collapsibleTabs = function( options ) {
+       // return if the function is called on an empty jquery object
+       if( !this.length ) return this;
+       //merge options into the defaults
+       var $settings = $.extend( {}, $.collapsibleTabs.defaults, options );
+
+       this.each( function() {
+               var $this = $( this );
+               // add the element to our array of collapsible managers
+               $.collapsibleTabs.instances = ( 
$.collapsibleTabs.instances.length == 0 ?
+                       $this : $.collapsibleTabs.instances.add( $this ) );
+               // attach the settings to the elements
+               $this.data( 'collapsibleTabsSettings', $settings );
+               // attach data to our collapsible elements
+               $this.children( $settings.collapsible ).each( function() {
+                       $.collapsibleTabs.addData( $( this ) );
+               } );
+       } );
+       
+       // if we haven't already bound our resize hanlder, bind it now
+       if( !$.collapsibleTabs.boundEvent ) {
+               $( window )
+                       .delayedBind( '500', 'resize', function( ) { 
$.collapsibleTabs.handleResize(); } );
+       }
+       // call our resize handler to setup the page
+       $.collapsibleTabs.handleResize();
+       return this;
+};
+jQuery.collapsibleTabs = {
+       instances: [],
+       boundEvent: null,
+       defaults: {
+               expandedContainer: '#p-views ul',
+               collapsedContainer: '#p-cactions ul',
+               collapsible: 'li.collapsible',
+               shifting: false,
+               expandCondition: function( eleWidth ) {
+                       return ( $( '#left-navigation' ).position().left + $( 
'#left-navigation' ).width() )
+                               < ( $( '#right-navigation' ).position().left - 
eleWidth );
+               },
+               collapseCondition: function() {
+                       return ( $( '#left-navigation' ).position().left + $( 
'#left-navigation' ).width() )
+                               > $( '#right-navigation' ).position().left;
+               }
+       },
+       addData: function( $collapsible ) {
+               var $settings = $collapsible.parent().data( 
'collapsibleTabsSettings' );
+               $collapsible.data( 'collapsibleTabsSettings', {
+                       'expandedContainer': $settings.expandedContainer,
+                       'collapsedContainer': $settings.collapsedContainer,
+                       'expandedWidth': $collapsible.width(),
+                       'prevElement': $collapsible.prev()
+               } );
+       },
+       getSettings: function( $collapsible ) {
+               var $settings = $collapsible.data( 'collapsibleTabsSettings' );
+               if ( typeof $settings == 'undefined' ) {
+                       $.collapsibleTabs.addData( $collapsible );
+                       $settings = $collapsible.data( 
'collapsibleTabsSettings' );
+               }
+               return $settings;
+       },
+       handleResize: function( e ){
+               $.collapsibleTabs.instances.each( function() {
+                       var $this = $( this ), data = 
$.collapsibleTabs.getSettings( $this );
+                       if( data.shifting ) return;
+
+                       // if the two navigations are colliding
+                       if( $this.children( data.collapsible ).length > 0 && 
data.collapseCondition() ) {
+                               
+                               $this.trigger( "beforeTabCollapse" );
+                               // move the element to the dropdown menu
+                               $.collapsibleTabs.moveToCollapsed( 
$this.children( data.collapsible + ':last' ) );
+                       }
+
+                       // if there are still moveable items in the dropdown 
menu,
+                       // and there is sufficient space to place them in the 
tab container
+                       if( $( data.collapsedContainer + ' ' + data.collapsible 
).length > 0
+                                       && data.expandCondition( 
$.collapsibleTabs.getSettings( $( data.collapsedContainer ).children(
+                                                       
data.collapsible+":first" ) ).expandedWidth ) ) {
+                               //move the element from the dropdown to the tab
+                               $this.trigger( "beforeTabExpand" );
+                               $.collapsibleTabs
+                                       .moveToExpanded( 
data.collapsedContainer + " " + data.collapsible + ':first' );
+                       }
+               });
+       },
+       moveToCollapsed: function( ele ) {
+               var $moving = $( ele );
+               var data = $.collapsibleTabs.getSettings( $moving );
+               var dataExp = $.collapsibleTabs.getSettings( 
data.expandedContainer );
+               dataExp.shifting = true;
+               $moving
+                       .remove()
+                       .prependTo( data.collapsedContainer )
+                       .data( 'collapsibleTabsSettings', data );
+               dataExp.shifting = false;
+               $.collapsibleTabs.handleResize();
+       },
+       moveToExpanded: function( ele ) {
+               var $moving = $( ele );
+               var data = $.collapsibleTabs.getSettings( $moving );
+               var dataExp = $.collapsibleTabs.getSettings( 
data.expandedContainer );
+               dataExp.shifting = true;
+               // remove this element from where it's at and put it in the 
dropdown menu
+               $moving.remove().insertAfter( data.prevElement ).data( 
'collapsibleTabsSettings', data );
+               dataExp.shifting = false;
+               $.collapsibleTabs.handleResize();
+       }
+};
\ No newline at end of file


Property changes on: trunk/phase3/resources/jquery/jquery.collapsibleTabs.js
___________________________________________________________________
Added: svn:eol-style
   + native

Modified: trunk/phase3/resources/jquery/jquery.tabIndex.js
===================================================================
--- trunk/phase3/resources/jquery/jquery.tabIndex.js    2010-09-15 01:56:25 UTC 
(rev 73045)
+++ trunk/phase3/resources/jquery/jquery.tabIndex.js    2010-09-15 02:03:24 UTC 
(rev 73046)
@@ -1,11 +1,24 @@
-( function( $ ) {
-
 /**
- * Finds the highest tabindex in use.
+ * Finds the lowerst tabindex in use within a selection
  * 
+ * @return Integer of lowest tabindex on the page
+ */
+jQuery.fn.firstTabIndex = function() {
+       var minTabIndex = 0;
+       $(this).find( '[tabindex]' ).each( function() {
+               var tabIndex = parseInt( $(this).attr( 'tabindex' ) );
+               if ( tabIndex > minTabIndex ) {
+                       minTabIndex = tabIndex;
+               }
+       } );
+       return minTabIndex;
+};
+/**
+ * Finds the highest tabindex in use within a selection
+ * 
  * @return Integer of highest tabindex on the page
  */
-$.fn.maxTabIndex( function() {
+jQuery.fn.lastTabIndex = function() {
        var maxTabIndex = 0;
        $(this).find( '[tabindex]' ).each( function() {
                var tabIndex = parseInt( $(this).attr( 'tabindex' ) );
@@ -14,6 +27,4 @@
                }
        } );
        return maxTabIndex;
-} );
-
-} )();
\ No newline at end of file
+};
\ No newline at end of file



_______________________________________________
MediaWiki-CVS mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-cvs

Reply via email to