//YAHOO.util.Event.addListener( window, 'load', function( e )
YAHOO.util.Event.onDOMReady( function( e )
{
	YAHOO.UP.util.each( Ext.query( 'select[valdi:widget="hierarchicalOptions"]' ), function( j, obj )
	{
		YAHOO.UP.widget.hierarchicalOptions.update.apply( obj, [] );
	} );

	YAHOO.UP.util.each( Ext.query( 'select[valdi:widget="hierarchicalOptions"]' ), function( j, obj )
	{
		var parentComponent = YAHOO.UP.widget.hierarchicalOptions.getParentComponent( obj );
		YAHOO.util.Event.addListener( parentComponent, YAHOO.UP.form.getHeavyEventType( parentComponent ), YAHOO.UP.widget.hierarchicalOptions.update, obj, true );
		YAHOO.UP.events.subscribe( 'form-resetall', function( fireArg, obj )
		{
			window.setTimeout( function() { YAHOO.UP.widget.hierarchicalOptions.update.apply( obj, [] ); }, 10*j );
			//YAHOO.UP.widget.hierarchicalOptions.update.apply( obj, [] );
		}, obj );
	} );

	// select none, select all, remove all options, set counter
	YAHOO.UP.util.each( Ext.query( 'div[valdi:widget="multipleOptionList"]' ), function( j, obj )
	{
		YAHOO.UP.events.subscribe( 'form-resetall', function( fireArg, obj )
		{
			YAHOO.UP.widget.multipleOptionList.clear( obj );
		}, obj );

		YAHOO.util.Event.addListener( Ext.query( 'input[valdi:widgetComponent="addButton"], a[valdi:widgetComponent="addButton"], button[valdi:widgetComponent="addButton"]', obj ), 'click', YAHOO.UP.widget.multipleOptionList.add, obj );
		YAHOO.util.Event.addListener( Ext.query( 'input[valdi:widgetComponent="removeButton"], a[valdi:widgetComponent="removeButton"], button[valdi:widgetComponent="removeButton"]', obj ), 'click', YAHOO.UP.widget.multipleOptionList.remove, obj );
		YAHOO.util.Event.addListener( Ext.query( 'input[valdi:widgetComponent="addSource"]', obj ), 'keypress', function( e, obj )
		{
			if( YAHOO.util.Event.getCharCode( e ) == 13 )
			{
				YAHOO.util.Event.stopEvent( e );
				YAHOO.UP.widget.multipleOptionList.add( e, obj );
			}
		}, obj );
		YAHOO.util.Event.addListener( Ext.query( 'select[valdi:widgetComponent="optionList"]', obj ), 'keydown', function( e, obj )
		{
			var keyCode = YAHOO.util.Event.getCharCode( e );
			var wrappedElement = YAHOO.UP.form.getElement( this );
			if( e.ctrlKey && keyCode == 65 ) // ctrl + (A=65)
			{
				// select all
				YAHOO.util.Event.stopEvent( e );
				YAHOO.UP.widget.multipleOptionList.selectAll.call( null, e, obj );
				/* var selectedValues = [];
				YAHOO.UP.util.each( Ext.query( 'option', this ), function( j, optionObj )
				{
					selectedValues.push( optionObj.getAttribute( 'value' ) );
				} );
				YAHOO.UP.form.setValue( wrappedElement, selectedValues ); */
			} else if( keyCode == 46 || keyCode == 8 ) { // delete=46, bksp=8
				YAHOO.util.Event.stopEvent( e );
				YAHOO.UP.widget.multipleOptionList.remove( e, obj );
			}
		}, obj );
		YAHOO.util.Event.addListener( Ext.query( 'div.note.quickLinks a[valdi:attribute="selectAll"]', obj ), 'click', YAHOO.UP.widget.multipleOptionList.selectAll, obj );
		YAHOO.util.Event.addListener( Ext.query( 'div.note.quickLinks a[valdi:attribute="selectNone"]', obj ), 'click', function( e, obj )
		{
			var targetElement = YAHOO.UP.widget.multipleOptionList.getTargetElement( obj );
			if( targetElement )
			{
				if( YAHOO.UP.widget.multipleOptionList.isTypeRadio( obj ) )
				{
					YAHOO.UP.form.setValue( targetElement, '' );
				} else {
					YAHOO.UP.form.setValue( targetElement, [] );
				}
			}
		}, obj );
		YAHOO.util.Event.addListener( Ext.query( 'div.note.quickLinks a[valdi:attribute="sort"]', obj ), 'click', YAHOO.UP.widget.multipleOptionList.sort, obj );
	} );

	YAHOO.UP.util.each( Ext.query( 'fieldset[valdi:widget="collapsible"], div[valdi:widget="collapsible"]' ), function( j, fieldsetObj )
	{
		if( fieldsetObj.getAttribute( 'valdi:defaultOpen' ) == 'true' )
		{
			if( !YAHOO.util.Dom.hasClass( fieldsetObj, 'collapsible-open' ) )
				YAHOO.util.Dom.addClass( fieldsetObj, 'collapsible-open' );
		} else {
			var defaultOpen = fieldsetObj.getAttribute( 'valdi:uriId' ) && YAHOO.UP.util.uri.getHashValue( fieldsetObj.getAttribute( 'valdi:uriId' ) ) != null;
			if( !YAHOO.util.Dom.hasClass( fieldsetObj, 'collapsible' ) )
			{
				if( !defaultOpen ) YAHOO.UP.widget.collapsible.toggle.call( fieldsetObj );
				else YAHOO.util.Dom.addClass( fieldsetObj, 'collapsible-open' );
			}/*  else {
				YAHOO.UP.util.hide( Ext.query( 'div.fieldset', fieldsetObj ) );
			} */
		}

		var legends = Ext.query( 'legend, div.legend', fieldsetObj );
		YAHOO.util.Dom.addClass( legends, 'clickable' );
		YAHOO.UP.util.each( legends, function( j, legendObj )
		{
			if( legendObj.getAttribute( 'valdi:accesskey' ) != null )
			{
				YAHOO.util.Event.addListener( document, 'keydown', function( e )
				{
					if( e.altKey && String.fromCharCode( YAHOO.util.Event.getCharCode( e ) ).toLowerCase() == this.getAttribute( 'valdi:accesskey' ).toLowerCase() )
					{
						var listeners = YAHOO.util.Event.getListeners( this, 'click' );
						for( var j = 0; j < listeners.length; j++ )
						{
							listeners[ j ].fn.apply( listeners[ j ].adjust );
						}
						YAHOO.util.Event.stopEvent( e );
					}
				}, legendObj, true );
			}
			YAHOO.util.Event.addListener( legendObj, 'click', YAHOO.UP.widget.collapsible.toggle, legendObj.parentNode, true );
		} );
		//YAHOO.UP.util.toggle( Ext.query( 'div.fieldset', fieldsetObj ) );
	} );

	YAHOO.UP.util.each( Ext.query( 'label[valdi:widget="labelAsValue"]' ), function( j, label )
	{
		if( label.htmlFor == null ) throw new Error( 'When using the labelAsValue widget, make sure your label has a for attribute set.' );
		var targetElement = YAHOO.util.Dom.get( label.htmlFor );
		if( targetElement )
		{
			YAHOO.util.Event.addListener( targetElement, 'focus', YAHOO.UP.widget.labelAsValue.focus, label );
			YAHOO.util.Event.addListener( targetElement, 'blur', YAHOO.UP.widget.labelAsValue.blur, label );
			YAHOO.UP.util.hide( label );
			YAHOO.UP.widget.labelAsValue.blur.call( targetElement, null, label );
		}
		YAHOO.UP.events.subscribe( 'form-resetall', function( fireArg, label )
		{
			window.setTimeout( function() { YAHOO.UP.widget.labelAsValue.blur.call( targetElement, null, label ); }, 100 );
		}, label );
	} );
} );

YAHOO.namespace( 'UP.widget' );
YAHOO.namespace( 'UP.widget.labelAsValue' );
YAHOO.UP.widget.labelAsValue.focus = function( e, label )
{
	if( label == null ) return;
	if( YAHOO.UP.form.getValue( this ) == label.innerHTML )
	{
		YAHOO.util.Dom.removeClass( this, 'labelAsValue' );
		YAHOO.UP.form.setValue( this, '' );
		this.select(); // otherwise cursor will not appear in ie6
		this.focus();
	}
};
YAHOO.UP.widget.labelAsValue.blur = function( e, label )
{
	if( label == null ) return;
	if( YAHOO.UP.form.getValue( this ) == '' || YAHOO.UP.form.getValue( this ) == label.innerHTML ) // checkEmpty function
	{
		YAHOO.util.Dom.addClass( this, 'labelAsValue' );
		YAHOO.UP.form.setValue( this, label.innerHTML );
	} else {
		YAHOO.util.Dom.removeClass( this, 'labelAsValue' );
	}
};
YAHOO.namespace( 'UP.widget.multipleOptionList' );
YAHOO.UP.widget.multipleOptionList.getTargetElement = function( multipleOptionList )
{
	var selectElement = Ext.queryOne( 'select[valdi:widgetComponent="optionList"]', multipleOptionList );
	if( selectElement ) return YAHOO.UP.form.getElement( selectElement );

	var checkboxElement = Ext.queryOne( 'div[valdi:widgetComponent="optionList"] input[type="checkbox"]', multipleOptionList );
	if( checkboxElement ) return YAHOO.UP.form.getElement( checkboxElement );

	var radioElement = Ext.queryOne( 'div[valdi:widgetComponent="optionList"] input[type="radio"]', multipleOptionList );
	if( radioElement ) return YAHOO.UP.form.getElement( radioElement );
	//else throw new Error( 'No target elements exist for the multiple option list widget.' );
};
YAHOO.UP.widget.multipleOptionList.getTarget = function( multipleOptionList )
{
	return Ext.queryOne( 'select[valdi:widgetComponent="optionList"], div[valdi:widgetComponent="optionList"]', multipleOptionList );
};
YAHOO.UP.widget.multipleOptionList._getType = function( multipleOptionList )
{
	var selectString;
	if( YAHOO.UP.widget.multipleOptionList.isTypeCheckBox( multipleOptionList ) ) selectString = 'checkbox';
	else if( YAHOO.UP.widget.multipleOptionList.isTypeRadio( multipleOptionList ) ) selectString = 'radio';
	else throw new Error( 'Invalid option type for multipleOptionList.' );

	return selectString;
};
YAHOO.UP.widget.multipleOptionList.isTypeSelect = function( multipleOptionList )
{
	var target = YAHOO.UP.widget.multipleOptionList.getTarget( multipleOptionList );
	return target.nodeName.toLowerCase() == 'select';
};
YAHOO.UP.widget.multipleOptionList.isTypeCheckBox = function( multipleOptionList )
{
	var target = YAHOO.UP.widget.multipleOptionList.getTarget( multipleOptionList );
	return target.nodeName.toLowerCase() == 'div' && target.getAttribute( 'valdi:optionType' ) && target.getAttribute( 'valdi:optionType' ) == 'checkbox';
};
YAHOO.UP.widget.multipleOptionList.isTypeRadio = function( multipleOptionList )
{
	var target = YAHOO.UP.widget.multipleOptionList.getTarget( multipleOptionList );
	return target.nodeName.toLowerCase() == 'div' && target.getAttribute( 'valdi:optionType' ) && target.getAttribute( 'valdi:optionType' ) == 'radio';
};
// obj is the multipleOptionList div
YAHOO.UP.widget.multipleOptionList.add = function( e, obj )
{
	if( e ) YAHOO.util.Event.preventDefault( e );
	var source = Ext.query( 'input[valdi:widgetComponent="addSource"]', obj )[ 0 ];

	if( source != null )
	{
		if( !YAHOO.UP.validation.isValid( source ) || YAHOO.UP.validation.isWhiteListed( source, e ) )
		{
			return;
		}

		var newValue = YAHOO.UP.form.getValueRaw( source );

		if( newValue != '' )
		{
			YAHOO.UP.widget.multipleOptionList.addManual( obj, newValue, newValue );

			YAHOO.UP.form.setValue( source, '' );
		}
		if( e != null ) source.focus();
	} else {
		var str = Ext.queryOne( '*[valdi:widgetComponent="addButton"]', obj ).getAttribute( 'valdi:prompt' );
		if( str == null ) str = 'What would you like to add?';
		var addition = window.prompt( str, '' );
		if( addition != null && addition != '' )
			YAHOO.valdi.widget.multipleOptionList.addManual( obj, addition, addition );
	}
};
/* obj is the valdi:widget="multipleOptionList" div. */
YAHOO.UP.widget.multipleOptionList.addManual = function( obj, value, text )
{
	var target = YAHOO.UP.widget.multipleOptionList.getTarget( obj );
	var optionNode, numberOfOptions;
	if( YAHOO.UP.widget.multipleOptionList.isTypeSelect( obj ) )
	{
		optionNode = document.createElement( 'option' );
		optionNode.setAttribute( 'value', value );
		optionNode.appendChild( document.createTextNode( text ) );

		numberOfOptions = Ext.query( 'option', target ).length + 1;
	} else {
		var typeString = YAHOO.UP.widget.multipleOptionList._getType( obj );
		numberOfOptions = Ext.query( 'input[type="' + typeString + '"]', target ).length + 1;

		var id = target.getAttribute( 'id' ).concat( numberOfOptions );
		optionNode = document.createElement( 'label' );
		optionNode.htmlFor = id;
		
		//var inputNode = document.createElement( 'input' );
		var inputNode = YAHOO.UP.widget.multipleOptionList.isTypeRadio( obj ) ? document.createNamedElement( 'input', target.getAttribute( 'id' ) + '__radio' ) : document.createElement( 'input' );
		inputNode.setAttribute( 'id', id );
		inputNode.setAttribute( 'type', typeString );
		inputNode.setAttribute( 'value', value );
		//inputNode.value = value;
		YAHOO.util.Dom.addClass( inputNode, typeString );
		optionNode.appendChild( inputNode );
		optionNode.appendChild( document.createTextNode( text ) );
		//YAHOO.UP.form.getAllElements
	}
	target.appendChild( optionNode );

	// update counter
	if( Ext.query( 'span[valdi:widgetComponent="counter"]', obj ).length > 0 )
	{
		var size = target.getAttribute( 'size' ) ? target.getAttribute( 'size' ) : 1;
		if( numberOfOptions > ( size - 1 ) )
		{
			Ext.query( 'span[valdi:widgetComponent="counter"]', obj )[ 0 ].innerHTML = '(' + numberOfOptions + ')';
		}
	}
};
YAHOO.UP.widget.multipleOptionList.addMultipleManual = function( obj, keyValues )
{
	YAHOO.UP.util.each( keyValues, function( key, text )
	{
		YAHOO.UP.widget.multipleOptionList.addManual( obj, key, text );
	} );
};
YAHOO.UP.widget.multipleOptionList.remove = function( e, obj )
{
	if( e ) YAHOO.util.Event.preventDefault( e );
	var target = YAHOO.UP.widget.multipleOptionList.getTarget( obj );

	var newValue;
	if( target.getAttribute( 'valdi:allowDelete' ) != null )
	{
		var numberOfOptions;
		var min;
		if( YAHOO.UP.widget.multipleOptionList.isTypeSelect( obj ) )
		{
			newValue = YAHOO.UP.form.getValueRaw( target );
			if( newValue == [] ) return;
			var previousIndex = target.selectedIndex;
			YAHOO.UP.util.each( newValue, function( k, selectedOption )
			{
				target.removeChild( Ext.queryOne( 'option[value="' + selectedOption + '"]', target ) );
			} );
			numberOfOptions = Ext.query( 'option', target ).length;
			min = target.getAttribute( 'size' );
		} else if( YAHOO.UP.widget.multipleOptionList.isTypeCheckBox( obj ) ) {
			newValue = YAHOO.UP.form.getValueRaw( Ext.query( 'input[type="checkbox"]', target ) );
			if( newValue == [] ) return;
			YAHOO.UP.util.each( newValue, function( k, selectedOption )
			{
				// remove the parent label
				target.removeChild( Ext.queryOne( 'input[value="' + selectedOption + '"]', target ).parentNode );
			} );
			numberOfOptions = Ext.query( 'input[type="checkbox"]', target ).length;
		} else if( YAHOO.UP.widget.multipleOptionList.isTypeRadio( obj ) ) {
			newValue = YAHOO.UP.form.getValueRaw( Ext.query( 'input[type="radio"]', target ) );
			if( newValue == '' ) return;
			target.removeChild( Ext.queryOne( 'input[value="' + newValue + '"]', target ).parentNode );
			numberOfOptions = Ext.query( 'input[type="radio"]', target ).length;
		}

		YAHOO.UP.widget.multipleOptionList.updateCounter( obj, numberOfOptions, min );

		if( YAHOO.UP.widget.multipleOptionList.isTypeSelect( obj ) )
		{
			if( ( previousIndex + 1 ) > numberOfOptions ) previousIndex = numberOfOptions - 1;
			target.selectedIndex = previousIndex;
		}
	}
};
YAHOO.UP.widget.multipleOptionList.updateCounter = function( widgetDiv, numberOfOptions, min )
{
	if( Ext.query( 'span[valdi:widgetComponent="counter"]', widgetDiv ).length > 0 )
	{
		var size = min || 1;
		Ext.query( 'span[valdi:widgetComponent="counter"]', widgetDiv )[ 0 ].innerHTML = numberOfOptions > ( size - 1 ) ? '(' + numberOfOptions + ')' : '';
	}
};
YAHOO.UP.widget.multipleOptionList.selectAll = function( e, obj )
{
	//var target = YAHOO.UP.widget.multipleOptionList.getTarget( obj );
	YAHOO.util.Event.stopEvent( e );
	var formElement = YAHOO.UP.widget.multipleOptionList.getTargetElement( obj );
	if( !formElement ) return;

	YAHOO.UP.form.setValue( formElement, YAHOO.UP.form.getAvailableValue( formElement ) );

	if( YAHOO.UP.widget.multipleOptionList.isTypeSelect( obj ) )
	{
		formElement.focus();
	}
};
YAHOO.UP.widget.multipleOptionList.clear = function( widgetDiv )
{
	var target = YAHOO.UP.widget.multipleOptionList.getTarget( widgetDiv );
	var min;
	if( YAHOO.UP.widget.multipleOptionList.isTypeSelect( widgetDiv ) )
	{
		if( target.getAttribute( 'valdi:allowDelete' ) == 'true' )
		{
			target.innerHTML = '';
			//YAHOO.UP.widget.multipleOptionList.getTarget( obj ).options.length = 0;
		}
		min = target.getAttribute( 'size' );
	} else {
		target.innerHTML = '';
	}
	YAHOO.UP.widget.multipleOptionList.updateCounter( widgetDiv, 0, min );
};

/* FIX SORT
	bugs: 	doesn't sort right when text != values */
YAHOO.UP.widget.multipleOptionList.sort = function( e, obj )
{
	var wrappedElement = YAHOO.UP.widget.multipleOptionList.getTargetElement( obj );
	//var wrappedElement = YAHOO.UP.form.getElement( Ext.queryOne( 'select[valdi:widgetComponent="optionList"]', obj ) );
	YAHOO.util.Event.stopEvent( e );
	var preSelectedValues = YAHOO.UP.form.getValue( wrappedElement );
	var preAvailableValues = YAHOO.UP.form.getAvailableValue( wrappedElement );
	YAHOO.UP.widget.multipleOptionList.clear( obj );

	var preOptions = new Array();
	preOptions = preOptions.concat( preAvailableValues );
	preAvailableValues.sort();
	if( preOptions.toString() == preAvailableValues.toString() )
	{
		preAvailableValues.reverse();
	}
	YAHOO.UP.util.each( preAvailableValues, function( j, value )
	{
		YAHOO.UP.widget.multipleOptionList.addManual( obj, value, value );
	} );
	var numberOfOptions = preAvailableValues.length;
	var size;
	if( YAHOO.UP.widget.multipleOptionList.isTypeSelect( obj ) )
	{
		size = wrappedElement.getAttribute( 'size' );
	} else {
		size = 1;
	}
	YAHOO.UP.form.setValue( YAHOO.UP.widget.multipleOptionList.getTargetElement( obj ), preSelectedValues );
	YAHOO.UP.widget.multipleOptionList.updateCounter( obj, numberOfOptions, size || 1 );
};

YAHOO.namespace( 'UP.widget.hierarchicalOptions' );
YAHOO.UP.widget.hierarchicalOptions.update = function( e ) /* ~250ms per call */
{
	// the scope has been redefined to be the child object in the hierarchy (event was fired from parent)
	var dataStore;
	var cacheId = this.getAttribute( 'valdi:cacheId' ) ? this.getAttribute( 'valdi:cacheId' ) : 'hierarchicalOptions_' + this.getAttribute( 'id' );
	if( YAHOO.UP.cache.has( cacheId ) )
	{
		dataStore = YAHOO.UP.cache.get( cacheId );
	} else {
		dataStore = {};
		YAHOO.UP.util.each( this.options, function( k, optionObj )
		{
			if( optionObj.getAttribute( 'valdi:parentValue' ) )
			{
				if( dataStore[ optionObj.getAttribute( 'valdi:parentValue' ) ] == null )
				{
					dataStore[ optionObj.getAttribute( 'valdi:parentValue' ) ] = [];
				}
				var selected = optionObj[ 'defaultSelected' ];
				dataStore[ optionObj.getAttribute( 'valdi:parentValue' ) ][ optionObj.getAttribute( 'value' ) ] = { 'value': optionObj.innerHTML, 'selected': selected };
			}
		} );
		
		YAHOO.UP.cache.add( cacheId, dataStore );
	}

	var parentComponent = YAHOO.UP.widget.hierarchicalOptions.getParentComponent( this );
	var currentValue = YAHOO.UP.form.getValueRaw( parentComponent );

	if( dataStore[ currentValue ] )
	{
		if( this.getAttribute( 'valdi:hideParentDivWithNoOptions' ) && this.getAttribute( 'valdi:hideParentDivWithNoOptions' ) == 'true' )
		{
			YAHOO.UP.util.show( YAHOO.UP.form.callRaw( this, YAHOO.UP.form.getParentDivElement ) );
		} else {
			YAHOO.UP.util.show( this );
			YAHOO.UP.util.hide( Ext.query( 'span.emptyLabel', this.parentNode ) );
		}

		var selectedItems = YAHOO.UP.form.getValueRaw( this );
		this.innerHTML = '';
		var option = document.createElement( 'option' );
		option.value = '';
		option.innerHTML = '&nbsp;';
		this.appendChild( option );
		for( var j in dataStore[ currentValue ] )
		{
			var option = document.createElement( 'option' );
			option.value = j;
			option.innerHTML = dataStore[ currentValue ][ j ][ 'value' ] != '' ? dataStore[ currentValue ][ j ][ 'value' ] : j;
			if( !e && dataStore[ currentValue ][ j ][ 'selected' ] && !YAHOO.UP.util.Array.hasValue( selectedItems, j ) )
			{
				selectedItems.push( j ); //option.setAttribute( 'selected', 'selected' );
			}
			this.appendChild( option );
		}
		YAHOO.UP.form.setValueRaw( this, selectedItems );
	} else {
		if( this.getAttribute( 'valdi:hideParentDivWithNoOptions' ) && this.getAttribute( 'valdi:hideParentDivWithNoOptions' ) == 'true' )
		{
			YAHOO.UP.util.hide( YAHOO.UP.form.callRaw( this, YAHOO.UP.form.getParentDivElement ) );
		} else {
			YAHOO.UP.util.hide( this );
			YAHOO.UP.util.show( Ext.query( 'span.emptyLabel', this.parentNode ) );
		}
	}

	YAHOO.UP.widget.hierarchicalOptions.hideChildrenComponents( this );
};
YAHOO.UP.widget.hierarchicalOptions.getParentComponent = function( /* HTML element */childObject )
{
	try {
		return document.getElementById( childObject.getAttribute( 'valdi:parentComponent' ) );
	} catch(e) {
		throw new Error( 'Problem fetching parent component (' + childObject.getAttribute( 'valdi:parentComponent' ) + ') in hierarchical options widget.' );
	}
};
YAHOO.UP.widget.hierarchicalOptions.hideChildrenComponents = function( /* HTML element */parentObj )
{
	YAHOO.UP.util.each( Ext.query( 'select[valdi:parentComponent="' + parentObj.getAttribute( 'id' ) + '"]' ), function( j, obj )
	{
		if( obj.getAttribute( 'valdi:hideParentDivWithNoOptions' ) && obj.getAttribute( 'valdi:hideParentDivWithNoOptions' ) == 'true' )
		{
			YAHOO.UP.util.hide( YAHOO.UP.form.callRaw( obj, YAHOO.UP.form.getParentDivElement ) );
		} else {
			YAHOO.UP.util.hide( obj );
			YAHOO.UP.util.show( Ext.query( 'span.emptyLabel', obj.parentNode ) );
		}
		var childrensChildren = Ext.query( 'select[valdi:parentComponent="' + obj.getAttribute( 'id' ) + '"]' );
		if( childrensChildren.length > 0 ) YAHOO.UP.widget.hierarchicalOptions.hideChildrenComponents( obj );
	} );
};
YAHOO.namespace( 'UP.widget.collapsible' );
YAHOO.UP.widget.collapsible.show = function( e )
{
	YAHOO.UP.util.show( Ext.query( 'div.fieldset', this ) );
	if( !YAHOO.util.Dom.hasClass( this, 'collapsible-open' ) ) YAHOO.UP.util.toggle( [ this ], 'collapsible', 'collapsible-open' );
};
YAHOO.UP.widget.collapsible.hide = function( e )
{
	YAHOO.UP.util.hide( Ext.query( 'div.fieldset', this ) );
	if( !YAHOO.util.Dom.hasClass( this, 'collapsible' ) ) YAHOO.UP.util.toggle( [ this ], 'collapsible-open', 'collapsible' );
};
YAHOO.UP.widget.collapsible.toggle = function( e )
{
	// scope is the parent fieldset
	/* if( Ext.query( 'div.elements', this ).length > 0 ) YAHOO.UP.util.toggle( Ext.query( 'div.elements', this ) );
	else  */
	YAHOO.UP.util.toggle( Ext.query( 'div.fieldset', this ) );
	return YAHOO.UP.util.toggle( [ this ], 'collapsible', 'collapsible-open' );
};
YAHOO.UP.widget.collapsible.toggleAndSave = function( e )
{
	// scope is the parent fieldset
	var moreClosed = YAHOO.UP.widget.collapsible.toggle.call( this, e );
	if( this.getAttribute( 'valdi:uriId' ) )
	{
		if( moreClosed ) YAHOO.UP.util.uri.removeHashValue( this.getAttribute( 'valdi:uriId' ) );
		else YAHOO.UP.util.uri.setHashValue( this.getAttribute( 'valdi:uriId' ), 't' );
	}
};

YAHOO.namespace( 'UP.widget.smartLabel' );
YAHOO.util.Event.addListener( window, 'load', function( e )
{
	YAHOO.UP.util.each( Ext.query( 'span[valdi:widget="smartLabel"]' ), function( j, spanObj )
	{
		var target = spanObj.getAttribute( 'valdi:targetId' );
		if( target )
		{
			var targetObj = YAHOO.util.Dom.get( target );
			YAHOO.UP.validation.addGenericListener( [ targetObj ], YAHOO.UP.widget.smartLabel.update, spanObj );
			YAHOO.UP.widget.smartLabel.update.apply( targetObj, [ null, spanObj ] );
		}
	} );
} );
YAHOO.UP.widget.smartLabel.update = function( e, obj )
{
	// this = the form element that the label is monitoring
	// obj = the span element holding the label
	var value = YAHOO.UP.form.getValueRaw( this );
	if( YAHOO.lang.isArray( value ) && value.length == 1 ) value = value[ 0 ];
	if( YAHOO.UP.util.Math.parseInt( value ) == 1 )
	{
		YAHOO.UP.util.show( obj );
		YAHOO.UP.util.hide( Ext.query( 'span[valdi:type="plural"]', obj ) );
		YAHOO.UP.util.show( Ext.query( 'span[valdi:type="singular"]', obj ) );
	} else if( YAHOO.UP.util.Math.parseInt( value ) == 0 || YAHOO.UP.util.Math.parseInt( value ) > 1 ) {
		YAHOO.UP.util.show( obj );
		YAHOO.UP.util.hide( Ext.query( 'span[valdi:type="singular"]', obj ) );
		YAHOO.UP.util.show( Ext.query( 'span[valdi:type="plural"]', obj ) );
	} else {
		YAHOO.UP.util.hide( obj );
	}
};

YAHOO.namespace( 'UP.widget.inlineEdit' );
YAHOO.util.Event.addListener( window, 'load', function( e )
{
	YAHOO.UP.util.each( Ext.query( 'div[valdi:widget="inlineEdit"]' ), function( j, divObj )
	{
		var target = divObj.getAttribute( 'valdi:targetId' );
		if( target )
		{
			var targetObj = YAHOO.util.Dom.get( target );
			YAHOO.UP.validation.addHeavyListener( [ targetObj ], YAHOO.UP.widget.inlineEdit.update, divObj );
			//YAHOO.UP.widget.inlineEdit.update.apply( targetObj, [ null, divObj ] );
			YAHOO.util.Event.addListener( divObj, 'click', function( e, obj )
			{
				YAHOO.UP.util.hide( this );
				YAHOO.UP.form.setValueRaw( obj, YAHOO.UP.util.String.trim( this.innerHTML ) );
				YAHOO.UP.util.show( obj );
				obj.focus();
			}, targetObj );
			YAHOO.util.Event.addListener( divObj, 'mouseover', function( e )
			{
				YAHOO.util.Dom.addClass( this, 'inlineEditHover' );
			} );
			YAHOO.util.Event.addListener( divObj, 'mouseout', function( e )
			{
				YAHOO.util.Dom.removeClass( this, 'inlineEditHover' );
			} );
		}
	} );
} );
YAHOO.UP.widget.inlineEdit.update = function( e, obj )
{
	// this = the form element that the label is monitoring
	// obj = the div element holding the text
	var value = YAHOO.UP.form.getValueRaw( this );
	YAHOO.UP.util.hide( this );
	YAHOO.UP.util.show( obj );
	obj.innerHTML = value;
};
