Index: dmin/js/ie7/ie7-hashchange.js
===================================================================
--- admin/js/ie7/ie7-hashchange.js	(revision 1700)
+++ 	(revision )
@@ -1,390 +1,0 @@
-/*!
- * jQuery hashchange event - v1.3 - 7/21/2010
- * http://benalman.com/projects/jquery-hashchange-plugin/
- * 
- * Copyright (c) 2010 "Cowboy" Ben Alman
- * Dual licensed under the MIT and GPL licenses.
- * http://benalman.com/about/license/
- */
-
-// Script: jQuery hashchange event
-//
-// *Version: 1.3, Last updated: 7/21/2010*
-// 
-// Project Home - http://benalman.com/projects/jquery-hashchange-plugin/
-// GitHub       - http://github.com/cowboy/jquery-hashchange/
-// Source       - http://github.com/cowboy/jquery-hashchange/raw/master/jquery.ba-hashchange.js
-// (Minified)   - http://github.com/cowboy/jquery-hashchange/raw/master/jquery.ba-hashchange.min.js (0.8kb gzipped)
-// 
-// About: License
-// 
-// Copyright (c) 2010 "Cowboy" Ben Alman,
-// Dual licensed under the MIT and GPL licenses.
-// http://benalman.com/about/license/
-// 
-// About: Examples
-// 
-// These working examples, complete with fully commented code, illustrate a few
-// ways in which this plugin can be used.
-// 
-// hashchange event - http://benalman.com/code/projects/jquery-hashchange/examples/hashchange/
-// document.domain - http://benalman.com/code/projects/jquery-hashchange/examples/document_domain/
-// 
-// About: Support and Testing
-// 
-// Information about what version or versions of jQuery this plugin has been
-// tested with, what browsers it has been tested in, and where the unit tests
-// reside (so you can test it yourself).
-// 
-// jQuery Versions - 1.2.6, 1.3.2, 1.4.1, 1.4.2
-// Browsers Tested - Internet Explorer 6-8, Firefox 2-4, Chrome 5-6, Safari 3.2-5,
-//                   Opera 9.6-10.60, iPhone 3.1, Android 1.6-2.2, BlackBerry 4.6-5.
-// Unit Tests      - http://benalman.com/code/projects/jquery-hashchange/unit/
-// 
-// About: Known issues
-// 
-// While this jQuery hashchange event implementation is quite stable and
-// robust, there are a few unfortunate browser bugs surrounding expected
-// hashchange event-based behaviors, independent of any JavaScript
-// window.onhashchange abstraction. See the following examples for more
-// information:
-// 
-// Chrome: Back Button - http://benalman.com/code/projects/jquery-hashchange/examples/bug-chrome-back-button/
-// Firefox: Remote XMLHttpRequest - http://benalman.com/code/projects/jquery-hashchange/examples/bug-firefox-remote-xhr/
-// WebKit: Back Button in an Iframe - http://benalman.com/code/projects/jquery-hashchange/examples/bug-webkit-hash-iframe/
-// Safari: Back Button from a different domain - http://benalman.com/code/projects/jquery-hashchange/examples/bug-safari-back-from-diff-domain/
-// 
-// Also note that should a browser natively support the window.onhashchange 
-// event, but not report that it does, the fallback polling loop will be used.
-// 
-// About: Release History
-// 
-// 1.3   - (7/21/2010) Reorganized IE6/7 Iframe code to make it more
-//         "removable" for mobile-only development. Added IE6/7 document.title
-//         support. Attempted to make Iframe as hidden as possible by using
-//         techniques from http://www.paciellogroup.com/blog/?p=604. Added 
-//         support for the "shortcut" format $(window).hashchange( fn ) and
-//         $(window).hashchange() like jQuery provides for built-in events.
-//         Renamed jQuery.hashchangeDelay to <jQuery.fn.hashchange.delay> and
-//         lowered its default value to 50. Added <jQuery.fn.hashchange.domain>
-//         and <jQuery.fn.hashchange.src> properties plus document-domain.html
-//         file to address access denied issues when setting document.domain in
-//         IE6/7.
-// 1.2   - (2/11/2010) Fixed a bug where coming back to a page using this plugin
-//         from a page on another domain would cause an error in Safari 4. Also,
-//         IE6/7 Iframe is now inserted after the body (this actually works),
-//         which prevents the page from scrolling when the event is first bound.
-//         Event can also now be bound before DOM ready, but it won't be usable
-//         before then in IE6/7.
-// 1.1   - (1/21/2010) Incorporated document.documentMode test to fix IE8 bug
-//         where browser version is incorrectly reported as 8.0, despite
-//         inclusion of the X-UA-Compatible IE=EmulateIE7 meta tag.
-// 1.0   - (1/9/2010) Initial Release. Broke out the jQuery BBQ event.special
-//         window.onhashchange functionality into a separate plugin for users
-//         who want just the basic event & back button support, without all the
-//         extra awesomeness that BBQ provides. This plugin will be included as
-//         part of jQuery BBQ, but also be available separately.
-
-(function($,window,undefined){
-  '$:nomunge'; // Used by YUI compressor.
-  
-  // Reused string.
-  var str_hashchange = 'hashchange',
-    
-    // Method / object references.
-    doc = document,
-    fake_onhashchange,
-    special = $.event.special,
-    
-    // Does the browser support window.onhashchange? Note that IE8 running in
-    // IE7 compatibility mode reports true for 'onhashchange' in window, even
-    // though the event isn't supported, so also test document.documentMode.
-    doc_mode = doc.documentMode,
-    supports_onhashchange = 'on' + str_hashchange in window && ( doc_mode === undefined || doc_mode > 7 );
-  
-  // Get location.hash (or what you'd expect location.hash to be) sans any
-  // leading #. Thanks for making this necessary, Firefox!
-  function get_fragment( url ) {
-    url = url || location.href;
-    return '#' + url.replace( /^[^#]*#?(.*)$/, '$1' );
-  };
-  
-  // Method: jQuery.fn.hashchange
-  // 
-  // Bind a handler to the window.onhashchange event or trigger all bound
-  // window.onhashchange event handlers. This behavior is consistent with
-  // jQuery's built-in event handlers.
-  // 
-  // Usage:
-  // 
-  // > jQuery(window).hashchange( [ handler ] );
-  // 
-  // Arguments:
-  // 
-  //  handler - (Function) Optional handler to be bound to the hashchange
-  //    event. This is a "shortcut" for the more verbose form:
-  //    jQuery(window).bind( 'hashchange', handler ). If handler is omitted,
-  //    all bound window.onhashchange event handlers will be triggered. This
-  //    is a shortcut for the more verbose
-  //    jQuery(window).trigger( 'hashchange' ). These forms are described in
-  //    the <hashchange event> section.
-  // 
-  // Returns:
-  // 
-  //  (jQuery) The initial jQuery collection of elements.
-  
-  // Allow the "shortcut" format $(elem).hashchange( fn ) for binding and
-  // $(elem).hashchange() for triggering, like jQuery does for built-in events.
-  $.fn[ str_hashchange ] = function( fn ) {
-    return fn ? this.bind( str_hashchange, fn ) : this.trigger( str_hashchange );
-  };
-  
-  // Property: jQuery.fn.hashchange.delay
-  // 
-  // The numeric interval (in milliseconds) at which the <hashchange event>
-  // polling loop executes. Defaults to 50.
-  
-  // Property: jQuery.fn.hashchange.domain
-  // 
-  // If you're setting document.domain in your JavaScript, and you want hash
-  // history to work in IE6/7, not only must this property be set, but you must
-  // also set document.domain BEFORE jQuery is loaded into the page. This
-  // property is only applicable if you are supporting IE6/7 (or IE8 operating
-  // in "IE7 compatibility" mode).
-  // 
-  // In addition, the <jQuery.fn.hashchange.src> property must be set to the
-  // path of the included "document-domain.html" file, which can be renamed or
-  // modified if necessary (note that the document.domain specified must be the
-  // same in both your main JavaScript as well as in this file).
-  // 
-  // Usage:
-  // 
-  // jQuery.fn.hashchange.domain = document.domain;
-  
-  // Property: jQuery.fn.hashchange.src
-  // 
-  // If, for some reason, you need to specify an Iframe src file (for example,
-  // when setting document.domain as in <jQuery.fn.hashchange.domain>), you can
-  // do so using this property. Note that when using this property, history
-  // won't be recorded in IE6/7 until the Iframe src file loads. This property
-  // is only applicable if you are supporting IE6/7 (or IE8 operating in "IE7
-  // compatibility" mode).
-  // 
-  // Usage:
-  // 
-  // jQuery.fn.hashchange.src = 'path/to/file.html';
-  
-  $.fn[ str_hashchange ].delay = 50;
-  /*
-  $.fn[ str_hashchange ].domain = null;
-  $.fn[ str_hashchange ].src = null;
-  */
-  
-  // Event: hashchange event
-  // 
-  // Fired when location.hash changes. In browsers that support it, the native
-  // HTML5 window.onhashchange event is used, otherwise a polling loop is
-  // initialized, running every <jQuery.fn.hashchange.delay> milliseconds to
-  // see if the hash has changed. In IE6/7 (and IE8 operating in "IE7
-  // compatibility" mode), a hidden Iframe is created to allow the back button
-  // and hash-based history to work.
-  // 
-  // Usage as described in <jQuery.fn.hashchange>:
-  // 
-  // > // Bind an event handler.
-  // > jQuery(window).hashchange( function(e) {
-  // >   var hash = location.hash;
-  // >   ...
-  // > });
-  // > 
-  // > // Manually trigger the event handler.
-  // > jQuery(window).hashchange();
-  // 
-  // A more verbose usage that allows for event namespacing:
-  // 
-  // > // Bind an event handler.
-  // > jQuery(window).bind( 'hashchange', function(e) {
-  // >   var hash = location.hash;
-  // >   ...
-  // > });
-  // > 
-  // > // Manually trigger the event handler.
-  // > jQuery(window).trigger( 'hashchange' );
-  // 
-  // Additional Notes:
-  // 
-  // * The polling loop and Iframe are not created until at least one handler
-  //   is actually bound to the 'hashchange' event.
-  // * If you need the bound handler(s) to execute immediately, in cases where
-  //   a location.hash exists on page load, via bookmark or page refresh for
-  //   example, use jQuery(window).hashchange() or the more verbose 
-  //   jQuery(window).trigger( 'hashchange' ).
-  // * The event can be bound before DOM ready, but since it won't be usable
-  //   before then in IE6/7 (due to the necessary Iframe), recommended usage is
-  //   to bind it inside a DOM ready handler.
-  
-  // Override existing $.event.special.hashchange methods (allowing this plugin
-  // to be defined after jQuery BBQ in BBQ's source code).
-  special[ str_hashchange ] = $.extend( special[ str_hashchange ], {
-    
-    // Called only when the first 'hashchange' event is bound to window.
-    setup: function() {
-      // If window.onhashchange is supported natively, there's nothing to do..
-      if ( supports_onhashchange ) { return false; }
-      
-      // Otherwise, we need to create our own. And we don't want to call this
-      // until the user binds to the event, just in case they never do, since it
-      // will create a polling loop and possibly even a hidden Iframe.
-      $( fake_onhashchange.start );
-    },
-    
-    // Called only when the last 'hashchange' event is unbound from window.
-    teardown: function() {
-      // If window.onhashchange is supported natively, there's nothing to do..
-      if ( supports_onhashchange ) { return false; }
-      
-      // Otherwise, we need to stop ours (if possible).
-      $( fake_onhashchange.stop );
-    }
-    
-  });
-  
-  // fake_onhashchange does all the work of triggering the window.onhashchange
-  // event for browsers that don't natively support it, including creating a
-  // polling loop to watch for hash changes and in IE 6/7 creating a hidden
-  // Iframe to enable back and forward.
-  fake_onhashchange = (function(){
-    var self = {},
-      timeout_id,
-      
-      // Remember the initial hash so it doesn't get triggered immediately.
-      last_hash = get_fragment(),
-      
-      fn_retval = function(val){ return val; },
-      history_set = fn_retval,
-      history_get = fn_retval;
-    
-    // Start the polling loop.
-    self.start = function() {
-      timeout_id || poll();
-    };
-    
-    // Stop the polling loop.
-    self.stop = function() {
-      timeout_id && clearTimeout( timeout_id );
-      timeout_id = undefined;
-    };
-    
-    // This polling loop checks every $.fn.hashchange.delay milliseconds to see
-    // if location.hash has changed, and triggers the 'hashchange' event on
-    // window when necessary.
-    function poll() {
-      var hash = get_fragment(),
-        history_hash = history_get( last_hash );
-      
-      if ( hash !== last_hash ) {
-        history_set( last_hash = hash, history_hash );
-        
-        $(window).trigger( str_hashchange );
-        
-      } else if ( history_hash !== last_hash ) {
-        location.href = location.href.replace( /#.*/, '' ) + history_hash;
-      }
-      
-      timeout_id = setTimeout( poll, $.fn[ str_hashchange ].delay );
-    };
-    
-    // vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
-    // vvvvvvvvvvvvvvvvvvv REMOVE IF NOT SUPPORTING IE6/7/8 vvvvvvvvvvvvvvvvvvv
-    // vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
-    $.browser.msie && !supports_onhashchange && (function(){
-      // Not only do IE6/7 need the "magical" Iframe treatment, but so does IE8
-      // when running in "IE7 compatibility" mode.
-      
-      var iframe,
-        iframe_src;
-      
-      // When the event is bound and polling starts in IE 6/7, create a hidden
-      // Iframe for history handling.
-      self.start = function(){
-        if ( !iframe ) {
-          iframe_src = $.fn[ str_hashchange ].src;
-          iframe_src = iframe_src && iframe_src + get_fragment();
-          
-          // Create hidden Iframe. Attempt to make Iframe as hidden as possible
-          // by using techniques from http://www.paciellogroup.com/blog/?p=604.
-          iframe = $('<iframe tabindex="-1" title="empty"/>').hide()
-            
-            // When Iframe has completely loaded, initialize the history and
-            // start polling.
-            .one( 'load', function(){
-              iframe_src || history_set( get_fragment() );
-              poll();
-            })
-            
-            // Load Iframe src if specified, otherwise nothing.
-            .attr( 'src', iframe_src || 'javascript:0' )
-            
-            // Append Iframe after the end of the body to prevent unnecessary
-            // initial page scrolling (yes, this works).
-            .insertAfter( 'body' )[0].contentWindow;
-          
-          // Whenever `document.title` changes, update the Iframe's title to
-          // prettify the back/next history menu entries. Since IE sometimes
-          // errors with "Unspecified error" the very first time this is set
-          // (yes, very useful) wrap this with a try/catch block.
-          doc.onpropertychange = function(){
-            try {
-              if ( event.propertyName === 'title' ) {
-                iframe.document.title = doc.title;
-              }
-            } catch(e) {}
-          };
-          
-        }
-      };
-      
-      // Override the "stop" method since an IE6/7 Iframe was created. Even
-      // if there are no longer any bound event handlers, the polling loop
-      // is still necessary for back/next to work at all!
-      self.stop = fn_retval;
-      
-      // Get history by looking at the hidden Iframe's location.hash.
-      history_get = function() {
-        return get_fragment( iframe.location.href );
-      };
-      
-      // Set a new history item by opening and then closing the Iframe
-      // document, *then* setting its location.hash. If document.domain has
-      // been set, update that as well.
-      history_set = function( hash, history_hash ) {
-        var iframe_doc = iframe.document,
-          domain = $.fn[ str_hashchange ].domain;
-        
-        if ( hash !== history_hash ) {
-          // Update Iframe with any initial `document.title` that might be set.
-          iframe_doc.title = doc.title;
-          
-          // Opening the Iframe's document after it has been closed is what
-          // actually adds a history entry.
-          iframe_doc.open();
-          
-          // Set document.domain for the Iframe document as well, if necessary.
-          domain && iframe_doc.write( '<script>document.domain="' + domain + '"</script>' );
-          
-          iframe_doc.close();
-          
-          // Update the Iframe's hash, for great justice.
-          iframe.location.hash = hash;
-        }
-      };
-      
-    })();
-    // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-    // ^^^^^^^^^^^^^^^^^^^ REMOVE IF NOT SUPPORTING IE6/7/8 ^^^^^^^^^^^^^^^^^^^
-    // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-    
-    return self;
-  })();
-  
-})(jQuery,this);
Index: admin/js/jquery/jquery.pageTabs.js
===================================================================
--- admin/js/jquery/jquery.pageTabs.js	(revision 1792)
+++ admin/js/jquery/jquery.pageTabs.js	(revision 2010)
@@ -1,113 +1,72 @@
-jQuery.pageTabs = function(start_tab,settings) {
-	return new jQuery._pageTabs(start_tab,settings);
-};
+(function($) {
+	'use strict';
+    
+	$.pageTabs = function(start_tab, opts) {
+		var defaults = {
+			containerClass: 'part-tabs',
+			partPrefix: 'part-',
+			contentClass: 'multi-part',
+			activeClass: 'part-tabs-active',
+			idTabPrefix: 'part-tabs-'
+		};
+		
+		var options = $.extend({}, defaults, opts);
+		var active_tab = start_tab || '';
+		var hash = $.pageTabsGetHash();
 
-jQuery._pageTabs = function(start_tab,settings) {
-	var defaults = {
-		className: 'multi-part',
-		listClassName: 'part-tabs',
-		breakerClassName: 'clear'
+		if (hash !== undefined && hash) {
+			$('ul li a[href$="#'+hash+'"]').parent().trigger('click');
+			active_tab = hash;
+		} else { // open first part
+			active_tab = $('.'+options.contentClass+':eq(0)').attr('id');
+		}
+		
+		createTabs(active_tab, options);
+		
+		$('ul li', '.'+options.containerClass).click(function(e) {
+			$(this).parent().find('li.'+options.activeClass).removeClass(options.activeClass);
+			$(this).addClass(options.activeClass);
+			$('.'+options.contentClass+'.active').removeClass('active').hide();
+			$('#'+options.partPrefix+getId($(this).find('a').attr('href'))).addClass('active').show();
+		});
+		
+		return this;
+	};
+	
+	var createTabs = function createTabs(start_tab, options) {
+		var lis = [], li_class = '', to_trigger = null;
+		
+		$('.'+options.contentClass).each(function() {
+			if (start_tab != $(this).attr('id')) {
+				$(this).hide();
+				li_class = '';
+			} else {
+				$(this).addClass('active');
+				to_trigger = $(this);
+				li_class = ' class="'+options.activeClass+'"';
+			}
+			lis.push('<li id="'+options.idTabPrefix+$(this).attr('id')+'"'+li_class
+				 +'><a href="#'+$(this).attr('id')+'">'+$(this).attr('title')+'</a></li>');
+			$(this).attr('id', options.partPrefix + $(this).attr('id'));
+		});
+		
+		$('<div class="'+options.containerClass+'"><ul>'+lis.join('')+'</ul></div>')
+			.insertBefore($('.'+options.contentClass).get(0));	
+
+		if (to_trigger != null) {
+			$(to_trigger).onetabload();
+			$(to_trigger).tabload();	
+		}
+
+	};
+	
+	var getId = function getId(href) {
+		return href.split('#').join('');
 	};
 
-	var index = start_tab ? start_tab : 0;
-	var hash = document.location.hash.split('#').join('');
-	if( hash != '' ) {
-		var index = hash;
-	}
-	
-	this.params = jQuery.extend(defaults,settings);
-	this.divs = jQuery('div.'+this.params.className);
-	this.createList();
-	this.showDiv(index);
-	var pageTabs = this;
-	
-	window.onhashchange = function (event) {
-		pageTabs.showDiv(document.location.hash.split('#').join(''));
-    }
-};
-
-jQuery._pageTabs.prototype = {
-	items: new Array(),
-
-	createList: function() {
-		if (this.divs.length <= 0) {
-			return;
-		}
-
-		this.block = document.createElement('div');
-		this.block.className = this.params.listClassName;
-		this.list = document.createElement('ul');
-		//this.list.className = this.params.listClassName;
-		this.block.appendChild(this.list);
-		var li, a;
-
-		var This = this;
-		var i=0;
-		jQuery('.'+this.params.className).each(function() {
-			if (this.tagName == "DIV") {
-				li = document.createElement('li');
-				a = document.createElement('a');
-				$(a).html(this.title);
-				this.title = '';
-				a.fn = This.showDiv;
-				a.index = this.id || i;
-				a.href = '#'+a.index;
-				li.id = "part-tabs-"+a.index;
-				a.obj = This;
-				li.appendChild(a);
-				This.list.appendChild(li);
-				This.items[i] = li;
-				i++;
-			} else {
-				li = document.createElement('li');
-				li.className = This.params.listClassName+'-link';
-				li.appendChild(this);
-				This.list.appendChild(li);
-			}
-		});
-
-		this.breaker = document.createElement('br');
-		this.breaker.className = this.params.breakerClassName;
-
-		jQuery(this.divs.get(0)).before(this.block);
-		jQuery(this.block).after(this.breaker);
-	},
-
-	showDiv: function(index) {
-		var This = this;
-		var i = 0;
-		var to_trigger = null;
-		var exists = false;
-
-		this.divs.each(function() {
-			if ((this.id != '' && this.id == index) || i == index) {
-				exists = true;
-			}
-			i++;
-		});
-		
-		i = 0;
-		
-		if( exists ) {
-			this.divs.each(function() {
-				if ((this.id != '' && this.id == index) || i == index) {
-					jQuery(this).show(0);
-					This.items[i].className = This.params.listClassName+'-active';
-					to_trigger = i;
-				} else {
-					jQuery(this).hide(0);
-					This.items[i].className = '';
-				}
-	
-				i++;
-			});
-		}
-
-		if (to_trigger != null) {
-			jQuery(this.divs[to_trigger]).onetabload();
-			jQuery(this.divs[to_trigger]).tabload();
-		}
-	}
-};
+	$.pageTabsGetHash = function() {
+		return document.location.hash.split('#').join('');
+	};
+})(jQuery);
 
 jQuery.fn.tabload = function(f) {
@@ -122,4 +81,5 @@
 	return this;
 };
+
 jQuery.fn.onetabload = function(f) {
 	this.each(function() {
Index: inc/admin/lib.dc.page.php
===================================================================
--- inc/admin/lib.dc.page.php	(revision 2005)
+++ inc/admin/lib.dc.page.php	(revision 2010)
@@ -649,22 +649,10 @@
 		'<script type="text/javascript">'."\n".
 		"//<![CDATA[\n".
-		"\$(function() {\n".
-			"	pagetabs = \$.pageTabs(".$default.");\n".
-			"});\n".
-"\n//]]>\n".
-"</script>\n".
-		"<!--[if lt IE 8]>\n".
-		self::jsLoad('js/ie7/ie7-hashchange.js').
-		'<script type="text/javascript">'."\n".
-		"//<![CDATA[\n".
-		"\$(function() {".
-			"\$(window).hashchange( function(){".
-				"pagetabs.showDiv(document.location.hash.split('#').join(''));".
-			"});".
-		"});".
+		'$(function() {'."\n".
+		'$.pageTabs(".$default.");'."\n".
+		'});'."\n".
 		"\n//]]>\n".
-		"</script>\n".
-		"<![endif]-->\n";
-}
+		"</script>\n";
+	}
 
 public static function jsModal()
Index: tests/functional/fixtures/form_permissions.html
===================================================================
--- tests/functional/fixtures/form_permissions.html	(revision 2010)
+++ tests/functional/fixtures/form_permissions.html	(revision 2010)
@@ -0,0 +1,13 @@
+<form id="permissions-form" action="users_actions.php" method="post">
+  <input type="checkbox" name="perm[default][admin]" value="1" id="permdefaultadmin"  />
+  <input type="checkbox" name="perm[default][usage]" value="1" id="permdefaultusage"  />
+  <input type="checkbox" name="perm[default][publish]" value="1" id="permdefaultpublish"  />
+  <input type="checkbox" name="perm[default][delete]" value="1" id="permdefaultdelete"  />
+  <input type="checkbox" name="perm[default][contentadmin]" value="1" id="permdefaultcontentadmin"  />
+  <input type="checkbox" name="perm[default][categories]" value="1" id="permdefaultcategories"  />
+  <input type="checkbox" name="perm[default][media]" value="1" id="permdefaultmedia"  />
+  <input type="checkbox" name="perm[default][media_admin]" value="1" id="permdefaultmedia_admin"  />
+  <input type="checkbox" name="perm[default][pages]" value="1" id="permdefaultpages"  />
+  <input type="checkbox" name="perm[default][blogroll]" value="1" id="permdefaultblogroll"  />
+  <input type="submit" accesskey="s" value="Enregistrer" />
+</form>
Index: ests/functional/fixtures/normal.html
===================================================================
--- tests/functional/fixtures/normal.html	(revision 1602)
+++ 	(revision )
@@ -1,13 +1,0 @@
-<form id="permissions-form" action="users_actions.php" method="post">
-  <input type="checkbox" name="perm[default][admin]" value="1" id="permdefaultadmin"  />
-  <input type="checkbox" name="perm[default][usage]" value="1" id="permdefaultusage"  />
-  <input type="checkbox" name="perm[default][publish]" value="1" id="permdefaultpublish"  />
-  <input type="checkbox" name="perm[default][delete]" value="1" id="permdefaultdelete"  />
-  <input type="checkbox" name="perm[default][contentadmin]" value="1" id="permdefaultcontentadmin"  />
-  <input type="checkbox" name="perm[default][categories]" value="1" id="permdefaultcategories"  />
-  <input type="checkbox" name="perm[default][media]" value="1" id="permdefaultmedia"  />
-  <input type="checkbox" name="perm[default][media_admin]" value="1" id="permdefaultmedia_admin"  />
-  <input type="checkbox" name="perm[default][pages]" value="1" id="permdefaultpages"  />
-  <input type="checkbox" name="perm[default][blogroll]" value="1" id="permdefaultblogroll"  />
-  <input type="submit" accesskey="s" value="Enregistrer" />
-</form>
Index: ests/functional/fixtures/tabs-iframe.html
===================================================================
--- tests/functional/fixtures/tabs-iframe.html	(revision 1737)
+++ 	(revision )
@@ -1,1 +1,0 @@
-<iframe id="testtab" src="fixtures/tabs-inframe.html"/>
Index: ests/functional/fixtures/tabs-inframe.html
===================================================================
--- tests/functional/fixtures/tabs-inframe.html	(revision 1737)
+++ 	(revision )
@@ -1,14 +1,0 @@
-
-<!-- page tabs -->
-<script type="text/javascript" src="../../../admin/js/jquery/jquery.js"></script>
-<script type="text/javascript" src="../../../admin/js/jquery/jquery.pageTabs.js"></script>   
-
-<div id="tab-1" class="multi-part" title="Tab 1">
-	<h3>Tab 1 - content</h3>
-</div>
-<div id="tab-2" class="multi-part" title="Tab 2">
-	<h3>Tab 2 - content</h3>
-</div>
-<div id="tab-3" class="multi-part" title="Tab 3">
-	<h3>Tab 3 - content</h3>
-</div>
Index: tests/functional/fixtures/tabs.html
===================================================================
--- tests/functional/fixtures/tabs.html	(revision 1737)
+++ tests/functional/fixtures/tabs.html	(revision 2010)
@@ -1,13 +1,9 @@
-
-<!-- page tabs -->
-<script type="text/javascript" src="../../admin/js/jquery/jquery.pageTabs.js"></script>   
-
-<div id="tab-1" class="multi-part" title="Tab 1">
-	<h3>Tab 1 - content</h3>
+<div class="multi-part" id="user-options" title="My options">
+  <p>My options</p>
 </div>
-<div id="tab-2" class="multi-part" title="Tab 2">
-	<h3>Tab 2 - content</h3>
+<div class="multi-part" id="user-profile" title="My profile">
+  <p>My profile</p>
 </div>
-<div id="tab-3" class="multi-part" title="Tab 3">
-	<h3>Tab 3 - content</h3>
-</div>
+<div class="multi-part" id="user-favorites" title="My favorites">
+  <p>My favorites</p>
+</div
Index: tests/functional/index.html
===================================================================
--- tests/functional/index.html	(revision 1737)
+++ tests/functional/index.html	(revision 2010)
@@ -7,4 +7,5 @@
     <script type="text/javascript" src="lib/jasmine.js"></script>
     <script type="text/javascript" src="lib/jasmine-html.js"></script>
+
     <!-- use same jquery -->
     <script type="text/javascript" src="../../admin/js/jquery/jquery.js"></script>
@@ -14,4 +15,5 @@
     <script type="text/javascript" src="../../admin/js/_users_actions.js"></script>
     <script type="text/javascript" src="../../admin/js/common.js"></script>
+    <script type="text/javascript" src="../../admin/js/jquery/jquery.pageTabs.js"></script>    
 
     <script type="text/javascript" src="js/fix_include.js"></script>
@@ -28,6 +30,6 @@
     <script type="text/javascript" src="../../admin/js/jsUpload/jquery.fileupload-resize.js"></script> 
     <script type="text/javascript" src="../../admin/js/jsUpload/jquery.fileupload-ui.js"></script>
-    <script type="text/javascript" src="../../admin/js/_media.js"></script>    
-
+    <script type="text/javascript" src="../../admin/js/_media.js"></script>
+ 
     <!-- <script type="text/javascript" src="spec/users_actions.js"></script> -->
     <script type="text/javascript" src="spec/toggle_with_legend.js"></script>
Index: tests/functional/spec/media_manager.js
===================================================================
--- tests/functional/spec/media_manager.js	(revision 1724)
+++ tests/functional/spec/media_manager.js	(revision 2010)
@@ -3,5 +3,5 @@
 		it("Enhanced uploader can be temporarily enabled", function() {
 			loadFixtures('form_media_disabled.html');
-			loadStyleFixtures('jsUpload/style.css');
+			loadStyleFixtures('default.css');
 			
 			$('#fileupload').enhancedUploader();
@@ -18,5 +18,5 @@
 		it("Enhanced uploader can be temporarily disabled", function() {
 			loadFixtures('form_media_enabled.html');
-			loadStyleFixtures('jsUpload/style.css');
+			loadStyleFixtures('default.css');
 
 			$('#fileupload').enhancedUploader();
Index: tests/functional/spec/page_tabs.js
===================================================================
--- tests/functional/spec/page_tabs.js	(revision 1737)
+++ tests/functional/spec/page_tabs.js	(revision 2010)
@@ -1,92 +1,60 @@
 describe("tabs method (admin/js/pageTabs.js)", function() {
-	
-	it("Construct tabs using div content", function() {
+	it("Must construct tabs using div content", function() {
+		loadFixtures('tabs.html');
+		loadStyleFixtures('default.css');
+
+		expect($('#user-options')).toBeVisible();
+		expect($('#user-profile')).toBeVisible();
+		expect($('#user-favorites')).toBeVisible();
+		expect($('.part-tabs')).not.toExist();
+ 
+		$.pageTabs('user-options');
+		expect($('#part-user-options')).toBeVisible();
+		expect($('#part-user-profile')).not.toBeVisible();
+		expect($('#part-user-favorites')).not.toBeVisible();
+ 
+		expect($('.part-tabs')).toExist();
+		expect($('.part-tabs ul li#part-tabs-user-options')).toExist();
+		expect($('.part-tabs ul li#part-tabs-user-profile')).toExist();
+		expect($('.part-tabs ul li#part-tabs-user-favorites')).toExist();
+		expect($('#part-tabs-user-options')).toHaveClass('part-tabs-active');
+	});
+
+	it("Must open first part if pageTabs called without argument", function() {
+		loadFixtures('tabs.html');
+		loadStyleFixtures('default.css');
+
+		$.pageTabs();
+		expect($('#part-user-options')).toBeVisible();
+		expect($('#part-user-profile')).not.toBeVisible();
+		expect($('#part-user-favorites')).not.toBeVisible();		
+		expect($('#part-tabs-user-options')).toHaveClass('part-tabs-active');
+	});
+ 
+	it("Must change visible part when clicking another tab", function() {
+		loadFixtures('tabs.html');
+		loadStyleFixtures('default.css');
 		
+		$.pageTabs('user-options');
+		expect($('#part-user-options')).toBeVisible();
+		expect($('#part-user-profile')).not.toBeVisible();
+		expect($('#part-user-favorites')).not.toBeVisible();
+
+		$('.part-tabs ul li a[href="#user-profile"]').click();
+		expect($('#part-tabs-user-profile')).toHaveClass('part-tabs-active');		
+		expect($('#part-user-options')).not.toBeVisible();
+		expect($('#part-user-profile')).toBeVisible();
+	});
+
+	it("Must change opened part if corresponding anchor is in url", function() {
 		loadFixtures('tabs.html');
-		
-		expect($('#tab-1')).toBeVisible();
-		expect($('#tab-2')).toBeVisible();
-		expect($('#tab-3')).toBeVisible();
-		
-		expect($('.part-tabs')).not.toExist();
-		
-		$.pageTabs('tab-1');
-		
-		expect($('#tab-1')).toBeVisible();
-		expect($('#tab-2')).not.toBeVisible();
-		expect($('#tab-3')).not.toBeVisible();
-		
-		expect($('.part-tabs ul li#part-tabs-tab-1 a[href=#tab-1]')).toExist();
-		expect($('.part-tabs ul li#part-tabs-tab-2 a[href=#tab-2]')).toExist();
-		expect($('.part-tabs ul li#part-tabs-tab-3 a[href=#tab-3]')).toExist();
-	
-		expect($('.part-tabs ul li#part-tabs-tab-1')).toHaveClass('part-tabs-active');
-		
-	});
-	
-	it("Change tabs when changing the hash", function() {
-		
-		runs(function() {        
-            loadFixtures('tabs-iframe.html');
-        });
-		
-		waitsFor(function() {
-            return $("#testtab").contents().find('#tab-3').get(0);
-        }, 10000);
-		
-		runs(function() {
-			f$ = $("#testtab").get(0).contentWindow.$;
-			f$.pageTabs('tab-1');
+		loadStyleFixtures('default.css');
 
-			expect(f$('#tab-1').get(0)).toBeVisible();
-			expect(f$('#tab-2').get(0)).not.toBeVisible();
-			
-			expect(f$('.part-tabs ul li#part-tabs-tab-1').get(0)).toHaveClass('part-tabs-active');
-			expect(f$('.part-tabs ul li#part-tabs-tab-2').get(0)).not.toHaveClass('part-tabs-active');
-
-            $("#testtab").attr('src', $("#testtab").attr('src')+'#tab-2');
-        });
-		
-		waitsFor(function() {
-			f$ = $("#testtab").get(0).contentWindow.$;
-            return f$('#tab-1').is(':not(:visible)');
-        }, 10000);
-		
-		runs(function() {
-			f$ = $("#testtab").get(0).contentWindow.$;
-			
-    		expect(f$('#tab-2').get(0)).toBeVisible();
-
-			expect(f$('.part-tabs ul li#part-tabs-tab-1').get(0)).not.toHaveClass('part-tabs-active');
-			expect(f$('.part-tabs ul li#part-tabs-tab-2').get(0)).toHaveClass('part-tabs-active');
-			
-        });
-		
-	});
-	
-	it("Load the correct tab with the correct hash", function() {
-		
-		runs(function() {        
-            loadFixtures('tabs-iframe.html');
-            $("#testtab").attr('src', $("#testtab").attr('src')+'#tab-3');
-        });
-		
-		waitsFor(function() {
-			cond1 = $("#testtab").attr('src').split('#')[1] != '';
-			cond2 = $("#testtab").contents().find('#tab-3').get(0);
-            return cond1 && cond2;
-        }, 10000);
-		
-		runs(function() {
-			f$ = $("#testtab").get(0).contentWindow.$;
-			f$.pageTabs('tab-1');
-			
-			expect(f$('#tab-1').get(0)).not.toBeVisible();
-			expect(f$('#tab-3').get(0)).toBeVisible();
-			
-			expect(f$('.part-tabs ul li#part-tabs-tab-1').get(0)).not.toHaveClass('part-tabs-active');
-			expect(f$('.part-tabs ul li#part-tabs-tab-3').get(0)).toHaveClass('part-tabs-active');
-        });
-		
+		spyOn(jQuery, 'pageTabsGetHash').andReturn('user-favorites');
+		$.pageTabs();
+		expect($('#part-user-options')).not.toBeVisible();
+		expect($('#part-user-profile')).not.toBeVisible();
+		expect($('#part-user-favorites')).toBeVisible();		
 	});
 });
+
Index: tests/functional/spec/users_actions.js
===================================================================
--- tests/functional/spec/users_actions.js	(revision 1724)
+++ tests/functional/spec/users_actions.js	(revision 2010)
@@ -1,5 +1,5 @@
 describe("updatePermissionsForm method (admin/js/_users_actions.js)", function() {
 	it("Click admin persmission must checked all associated permissions", function() {
-		loadFixtures('normal.html');
+		loadFixtures('form_permissions.html');
 		$('#permissions-form').updatePermissionsForm();
 		var permissions = ['usage','publish','delete','contentadmin','categories'];
@@ -13,5 +13,5 @@
 
 	it("Click contentadmin persmission must checked all associated permissions", function() {
-		loadFixtures('normal.html');
+		loadFixtures('form_persmissions.html');
 		$('#permissions-form').updatePermissionsForm();
 		var permissions = ['usage','publish','delete'];
