function visage_maxlength( obj ) {
	
	if( obj.value.length > obj.maxLength ) {
		obj.value = obj.value.substring( 0, obj.maxLength );
		}
		
	setHTML(
		 obj.statusBar
		,'<strong>' + (d = (obj.maxLength - obj.value.length)) + '</strong>'
			+ ' Character' + (d==1?'':'s') + ' Remaining'
		);

	}
	
function show_definition( def ) {
/*	def.style.top	=
		(getObjY( this ) + getObjHeight( this ))
			+ 'px';

	def.style.left	=
		(getObjX( this ) + 24 + (isIE() ? 18 : 0))
			+ 'px';
		
	def.style.width =
		(getObjWidth( this ) - 20)
			+ 'px'*/
	
	def.style.display = 'block';
	
	if( isIE6( ) ) {
		this.style.color = '#3366FF';
		this.style.cursor = 'pointer';
	}
	
	if( isIE( ) ) {
		def.style.backgroundColor = 'white';
	}
}

function hide_definition( def ) {
	def.style.display = 'none';
	
	if( isIE6( ) ) {
		this.style.color = '';
		this.style.cursor = 'default';
	}
}

function visage_attach_attributes( ) {

	var txtArr = document.getElementsByTagName( 'textarea' );
	var iptArr = document.getElementsByTagName( 'input' );
	var divArr = document.getElementsByTagName( 'div' );
	var fldSetArr = document.getElementsByTagName( 'fieldset' );
	var lblArr = document.getElementsByTagName( 'label' );
	
	var ctlArr = [];

	for( var ii = 0; ii < txtArr.length; ii++ ) {
		ctlArr.push( txtArr[ii] );
		}

	for( var ii = 0; ii < iptArr.length; ii++ ) {
		ctlArr.push( iptArr[ii] );
		}
		
	for( var ii = 0; ii < divArr.length; ii++ ) {
		ctlArr.push( divArr[ii] );
		}
	
	for( var ii = 0; ii < fldSetArr.length; ii++ ) {
		ctlArr.push( fldSetArr[ ii ] );
	}
	
	for( var ii = 0; ii < lblArr.length; ii++ ) {
		ctlArr.push( lblArr[ ii ] );
	}
		
	if( ctlArr ) {
		for( var ii = 0; ii < ctlArr.length; ii++ ) {
			var attr = ctlArr[ii].className.split( ' ' );
			var ctl	 = ctlArr[ii];
			for( var jj = 0; jj < attr.length; jj++ ) {
				if( attr[jj].length > 1 ) {
					var p = attr[jj].split( ':' );
					if( p.length > 1 ) {
						switch( p[0] ) {
								
							case 'tab':
								var tabViewId = p[0]+':'+p[1];
								ctl = $( ctl );
								
								if( !$( tabViewId ) ) {
									var tabView = getSplayTabCollection( tabViewId );
									tabView.attach( ctl, 'before' );
								}
								
								tabView.add( new SplayTab(
									  decodeURIComponent( p[3] )
									, ctl
								) );
								
								break;
							
							case 'tabToggle':
								var tabView = getSplayTabCollection( 'tab:'+p[1] );
								var tabLabel = decodeURIComponent( p[2] );
								var checkBox = $( ctl.htmlFor );
								
								checkBox.onclick = bind(
									  checkBox
									, function( label ) {
										if( this.checked ) {
											tabView.showLabel( label );
										}
										else {
											tabView.hideLabel( label );
										}
									  }
									, tabLabel
								);
								
								if( !checkBox.checked ) {
									tabView.hideLabel( tabLabel );
								}
								break;
							
							case 'autosize':
								var yes	= (p[1] == 'yes');
								if( yes ) {
									if( !ctlArr[ii].style.height ) {
										var vlen = ctlArr[ii].value.length;
										ctlArr[ii].style.height =
											 parseInt( 6 + vlen / 66 )
											+'em';
										}
									}
								break;
								
							case 'maxlength':
								var maxlen = parseInt( p[1] );
								
								ctlArr[ii].statusBar =
									appendSibling(
										 ctlArr[ii]
										,document.createElement( 'div' )
										);

								ctlArr[ii].statusBar.className =
									'viStatusBar';
										
								ctlArr[ii].maxLength	= parseInt( p[1] );
								
								ctlArr[ii].onkeyup		=
								ctlArr[ii].onchange		=
									bind(
										 null
										,visage_maxlength
										,ctlArr[ii]
										);
									
								if( ctlArr[ii].tagName == 'textarea' ) {
									ctlArr[ii].style.height	=
										parseInt(
											 6 + ctlArr[ii].maxLength / 66
											) + 'em';
									}
										
										
								ctlArr[ii].onchange();
								
								break;
							}
						}
					else {
						switch( p[ 0 ] ) {
							case 'copy':
								$( ctl ).getFirst( ).addEvent(
									 'change'
									, function( ) {
										this.set( 'tween', { duration: 'short' } );
										this.tween( 'background-color', '#fff' );
									  }
								);
								break;
							
							case 'collapsable':
							case 'expandable':
								var lgnd = ctl.getElementsByTagName( 
									'legend'
								);
								if( lgnd ) {
									lgnd = lgnd[ 0 ];
									lgnd.onclick = bind(
										  lgnd
										, toggle_fieldset
										, ctl
									);
								}
								break;
							
							case 'definition':
								var lbl = ctl
									.parentNode
									.getElementsByTagName( 'label' )[ 0 ];
								
								var inpt = ctl
									.parentNode
									.getElementsByTagName( 'input' )[ 0 ];
								
								if( lbl ) {
//									ctl.parentNode.removeChild( ctl );
//									document.body.appendChild( ctl );
									ctl.className = 'viHoverDefinition';
									
/*									if( isIE6( ) ) {
										continue;
									}*/
									
									lbl.onfocus
										= lbl.onmouseover
										= inpt.onfocus
										= inpt.onmouseover
//										= ctl.onfocus
//										= ctl.onmouseover
										= bind( lbl, show_definition, ctl );

									lbl.onblur
										= lbl.onmouseout
										= lbl.onclick
										= inpt.onblur
										= inpt.onmouseout
										= inpt.onclick
//										= ctl.onblur
//										= ctl.onmouseout
//										= ctl.onclick
										= bind( lbl, hide_definition, ctl );
									}
								break;
							}
						}
					}
				}
			}
		}
	}

function toggle_fieldset( fldSet ) {
	var newClassName = 'collapsable';
	var oldClassName = 'expandable';
	
	if( hasClass( fldSet, 'collapsable' ) ) {
		newClassName = 'expandable';
		oldClassName = 'collapsable';
	}
	
	swapClass( fldSet, newClassName, oldClassName );
}

document.onload = chainHandlers( visage_attach_attributes, document.onload );
