/**
 * This set of methods and functions scan the page for any 'div' that are marked with the class
 * RMenuTop, RMenuRight, RMenuBottom, or RMenuLeft These are added to a local array and events are
 * added to these 'div' for mouseover and mouseout. When the mouse is moved over the div it will
 * expand to its fullest, and when the mouse is removed it shrinks to its minimum width (or height).
 * The expansion and contraction are done with 'clip', and hence won't work with the older
 * User-Agents (which should be retired anyway). Written with lots of help from the usual suspects
 * by Rand Huso on 24 July 2007 Intention for writing: to convince Paul Dupuy that we should
 * incorporate this into the next build of STIQ for the 'sandbox'.
 */
var SlideDiv = {
	// string constants
	menuContractTop:'rMenuTop',
	menuContractRight:'rMenuRight',
	menuContractBottom:'rMenuBottom',
	menuContractLeft:'rMenuLeft',
	currentSize:'currentSize',
	collapseDirection:'dir',
	maxSize:'maxSize',
	collapse:'collapse',
	expand:'expand',
	// adjustable numeric items
	minSize:18, // room only for one row or column for mouseover detection
	slideAmount:20, // number of pixels to change each time
	itemCount:0, // for creating unique id for those elements that don't have 'em
	slideRate:30, // ms between new value
	// methods
	getItemId:function( item ) {
		itemId = item.getAttribute( 'id' );
		if( null == itemId ) {
			itemId = 'SlideDiv_' + SlideDiv.itemCount++;
			item.setAttribute( 'id', itemId );
		}
		return itemId;
	},
	setClipSize:function( item, top, right, bottom, left ) {
		var clipString = 'rect(';
		if( 0 != top )		clipString += top + 'px ';		else clipString += 'auto ';
		if( 0 != right )	clipString += right + 'px ';	else clipString += 'auto ';
		if( 0 != bottom )	clipString += bottom + 'px ';	else clipString += 'auto ';
		if( 0 != left )		clipString += left + 'px';		else clipString += 'auto';
		clipString += ')';
//		Log.message( Log.debug, 'SlideDiv:setClipSize setting clip to[' + clipString + ']' );
		item.style.clip = clipString;
	},
	setItemSize:function( item, newSize ) {
		var direction = item.getAttribute( SlideDiv.collapseDirection );
		var clipSize = parseInt( item.getAttribute( SlideDiv.maxSize )) -newSize;
		switch( direction ) {
			case SlideDiv.menuContractTop:
				SlideDiv.setClipSize( item, 0, 0, newSize, 0 );
				break;
			case SlideDiv.menuContractRight:
				SlideDiv.setClipSize( item, 0, 0, 0, clipSize );
				break;
			case SlideDiv.menuContractBottom:
				SlideDiv.setClipSize( item, clipSize, 0, 0, 0 );
				break;
			case SlideDiv.menuContractLeft:
				SlideDiv.setClipSize( item, 0, newSize, 0, 0 );
				break;
		}
	},
	getCurrentSize:function( item, maxSize ) {
		var currentSize = parseInt( item.getAttribute( SlideDiv.currentSize ));
		if( currentSize < SlideDiv.minSize ) {
			currentSize = SlideDiv.minSize;
		} else if( maxSize < currentSize ) {
			currentSize = maxSize;
		}
		return currentSize;
	},
	setTimerForNextOperation:function( item, itemId ) {
		if( item.timeout ) clearTimeout( item.timeout );
		var moveDir = item.getAttribute( 'moveDir' );
		switch( moveDir ) {
			case SlideDiv.expand:
				item.timeout = setTimeout( function(){ SlideDiv.doMouseOver( itemId ); }, SlideDiv.slideRate );
				break;
			case SlideDiv.collapse:
				item.timeout = setTimeout( function(){ SlideDiv.doMouseOut( itemId ); }, SlideDiv.slideRate );
				break;
		}
	},
	doMouseOver:function( itemId ) {
		var item = document.getElementById( itemId );
		item.setAttribute( 'moveDir', SlideDiv.expand );
		var maxSize = item.getAttribute( SlideDiv.maxSize );
		var currentSize = SlideDiv.getCurrentSize( item, maxSize ); 
//		Log.message( Log.debug, 'SlideDiv:doMouseOver size[' + currentSize + '] max[' + maxSize + '] id[' + itemId + ']' );
		if( currentSize < maxSize ) {
			var newSize = currentSize +SlideDiv.slideAmount;
			if( maxSize < newSize ) newSize = maxSize;
			item.removeAttribute( SlideDiv.currentSize ); // also probably unnecessary
			item.setAttribute( SlideDiv.currentSize, newSize );
			SlideDiv.setTimerForNextOperation( item, itemId );
			SlideDiv.setItemSize( item, newSize );
		}
	},
	doMouseOut:function( itemId ) {
		var item = document.getElementById( itemId );
		item.setAttribute( 'moveDir', SlideDiv.collapse );
		var maxSize = parseInt( item.getAttribute( SlideDiv.maxSize ));
		var currentSize = SlideDiv.getCurrentSize( item, maxSize );
//		Log.message( Log.debug, 'SlideDiv:doMouseOut size[' + currentSize + '] min[' + SlideDiv.minSize + '] id[' + itemId + ']' );
		if( SlideDiv.minSize < currentSize ) {
			var newSize = currentSize -SlideDiv.slideAmount;
			if( newSize < SlideDiv.minSize ) newSize = SlideDiv.minSize;
			item.setAttribute( SlideDiv.currentSize, newSize );
			SlideDiv.setTimerForNextOperation( item, itemId );
			SlideDiv.setItemSize( item, newSize );
		}
	},
	setMouseOverAndOut:function( item, itemId ) {
		Events.addListener( item, 'mouseover', function(){ SlideDiv.doMouseOver( itemId ); } ); // Thank JavaScript for closures!
		Events.addListener( item, 'mouseout', function(){ SlideDiv.doMouseOut( itemId ); } );
	},
	addClipEvent:function( item, moveDir ) {
		var itemId = SlideDiv.getItemId( item );
		setTimeout( 'SlideDiv.doMouseOut(\''+itemId+'\')', SlideDiv.slideRate );
//		Log.message( Log.debug, 'SlideDiv:addClipEvent for[' + item + '] id[' + itemId + '] moving[' + moveDir + ']' );
		item.setAttribute( SlideDiv.collapseDirection, moveDir );
		item.setAttribute( 'moveDir', SlideDiv.collapse );
		var maxSize = 0;
		switch( moveDir ) {
			case SlideDiv.menuContractTop:
			case SlideDiv.menuContractBottom:
				maxSize = item.offsetHeight;
				break;
			case SlideDiv.menuContractRight:
			case SlideDiv.menuContractLeft:
				maxSize = item.offsetWidth;
				break;
		}
		item.setAttribute( SlideDiv.currentSize, maxSize );
		item.setAttribute( SlideDiv.maxSize, maxSize );
		SlideDiv.setMouseOverAndOut( item, itemId );
		SlideDiv.setTimerForNextOperation( item, itemId );
	},
	loadClipEvents:function() {
		var objS = document.getElementsByTagName( 'div' );
		for( var i=0; i<objS.length; ++i ) {
			if( objS[i].className.indexOf( SlideDiv.menuContractTop ) != -1 ) {
				SlideDiv.addClipEvent( objS[i], SlideDiv.menuContractTop );
			} else if( objS[i].className.indexOf( SlideDiv.menuContractRight ) != -1 ) {
				SlideDiv.addClipEvent( objS[i], SlideDiv.menuContractRight );
			} else if( objS[i].className.indexOf( SlideDiv.menuContractBottom ) != -1 ) {
				SlideDiv.addClipEvent( objS[i], SlideDiv.menuContractBottom );
			} else if( objS[i].className.indexOf( SlideDiv.menuContractLeft ) != -1 ) {
				SlideDiv.addClipEvent( objS[i], SlideDiv.menuContractLeft );
			}
		}
	}
};

Events.addListener( window, 'load', SlideDiv.loadClipEvents, false );

