function fireIceCheck()
{
	this.aSelectedNames;

	function setRequired( obj )
	{
		if( 'string' == typeof( obj ) )
		{
			obj	= document.getElementById( obj );
		}

		inputs	= obj.getElementsByTagName( 'input' );

		for( i = 0; i < inputs.length; i++ )
		{
			el	= inputs[ i ];

			if(
				'text' != el.type
				&&
				'password' != el.type
			)
			{
				continue;
			}

			for( j = 0; j < el.attributes.length; j++ )
			{
				if( 'meta:validator' == el.attributes[ j ].name )
				{
					el.className	= 'required';
				}
			}
		}
	}

	function filled( el )
	{
		if( el.title == el.value )
		{
			return false;
		}
		return 0 == el.value.length ? false : true;
	}

	function selected( obj )
	{
		if( 'undefined' == typeof( this.aSelectedNames[ obj.name ] ) )
		{
			this.aSelectedNames[ obj.name ]	= false;
		}

		if( true == obj.checked )
		{
			this.aSelectedNames[ obj.name ]	= obj.checked;
		}

		return this.aSelectedNames[ obj.name ];
	}

	function checked( obj )
	{
		if( 'undefined' == typeof( this.aSelectedNames[ obj.name ] ) )
		{
			this.aSelectedNames[ obj.name ]	= '';
		}

		if( 0 != obj.value.length )
		{
			this.aSelectedNames[ obj.name ]	= obj.value;
		}

		return this.aSelectedNames[ obj.name ];
	}

	function check( obj )
	{
		this.aSelectedNames	= new Array();

		var aNodes	= new Array();

		for( i = 0; i < obj.elements.length; i++ )
		{
			var el	= obj.elements[ i ];

			if( 'submit' == el.type )
			{
				continue;
			}

			var sNodeValue	= false;
			var sNodeName	= false;
			var bTemp		= false;
			var sValidator	= false;
			var sTarget		= false;
			var sMessage	= false;
			var sDefault	= false;

			for( j = 0; j < el.attributes.length; j++ )
			{
				var v	= el.attributes[ j ].value;

				switch( el.attributes[ j ].name )
				{
					case 'meta:validator':
						sValidator	= v;
						break;

					case 'meta:node':
						sNodeValue	= v;
						break;

					case 'meta:orgroup':
					case 'meta:name':
						sNodeName	= v;
						break;

					case 'meta:target':
						sTarget	= v;
						break;

					case 'meta:message':
						sMessage	= v;
						break;

					case 'meta:default':
						sDefault	= v;
						break;
				}
			}

			if( false == sValidator )
			{
				continue;
			}

			switch( sValidator )
			{
				case 'filled':
					if(
						false != sDefault
						&&
						sDefault == el.value
					)
					{
						bTemp	= false;
					}
					else
					{
						bTemp	= this.filled( el );
					}
					break;

				case 'selected':
					bTemp	= this.selected( el );
					break;

				case 'checked':
					bTemp	= this.checked( el );
					break;

				default:
					alert( 'No validator function for ' + sValidator + ' rule found' );
					continue;
			}


			if(
				false == sNodeValue
				&&
				(
					false == sTarget
					&&
					false == sMessage
				)
			)
			{
				continue;
			}

			if( false != sTarget )
			{
				var a	= {
					'type'		: 'target',
					'target'	: sTarget,
					'value'		: sMessage
				};
			}
			else
			{
				var a	= {
					'type'	: 'node',
					'node'	: sNodeValue
				};
			}

			sNodeName	= false == sNodeName ? el.name : sNodeName;

			if( 'undefined' == typeof( aNodes[ sNodeName ] ) )
			{

				// Если элемент не виден, отключаем показывание сообщения о проверке
				// Спасибо Sergey Ilinsky, www.ilinsky.com, за этот хак
				if( el.offsetHeight <= 0 )
				{
					bTemp	= true;
				}
				
				aNodes[ sNodeName ]	= { 'flag' : bTemp, 'data' : a };
			}
			else if( true == bTemp )
			{
				aNodes[ sNodeName ]	= { 'flag' : true, 'data' : a };
			}
		}
		
		var bShowNodes	= new Array();
		var bHideNodes	= new Array();

		for( sNode in aNodes )
		{
			if( false == aNodes[ sNode ][ 'flag' ] )
			{
				bShowNodes[ bShowNodes.length ]	= aNodes[ sNode ][ 'data' ];
			}
			else
			{
				bHideNodes[ bHideNodes.length ]	= aNodes[ sNode ][ 'data' ];
			}
		}

		if(
			0 != bShowNodes.length
			||
			0 != bHideNodes.length
		)
		{
			var bFirst	= true;
			for( i = 0; i < bShowNodes.length; i++ )
			{
				if( 'target' == bShowNodes[ i ].type )
				{
					obj	= document.getElementById( bShowNodes[ i ].target );

					if( true == bFirst )
					{
						var length	= obj.childNodes.length;
						for( j = 0; j < length; j++ )
						{
							obj.removeChild( obj.childNodes[ 0 ] );
						}

						bFirst	= false;
					}

				}
				else
				{
					obj	= document.getElementById( bShowNodes[ i ].node );
				}

				if( null != obj )
				{
					obj.style.display	= 'block';
				}

				if( 'target' == bShowNodes[ i ].type )
				{
					var el	= document.createElement( 'div' );
					el.innerHTML	= bShowNodes[ i ].value;
					el.className	= 'element';
					obj.appendChild( el );
				}

			}
			for( i = 0; i < bHideNodes.length; i++ )
			{
				obj	= document.getElementById( bHideNodes[ i ] );
				if( null != obj )
				{
					obj.style.display	= 'none';
				}
			}
		}

		return ( 0 == bShowNodes.length ? true : false );
	}

	this.check			= check;
	this.selected		= selected;
	this.checked		= checked;
	this.filled			= filled;
	this.setRequired	= setRequired;
}

function fillEmptiness( o, method, v )
{
	if( 'string' == typeof( o ) )
	{
		o	= document.getElementById( o );
	}

	if( null == o )
	{
		return null;
	}

	if( undefined == v )
	{
		v	= o.id;
	}

	if(
		undefined == method
		||
		'text' == method
	)
	{
		o.onfocus	= function()
		{
			if( this[ 'meta:default' ] === this.value )
				this.value	= '';
		}
		o.onblur	= function()
		{
			if( !this.value )
				this.value	= this[ 'meta:default' ]	= v;
		}
	}

	if( 'background' == method )
	{
		o.onfocus	= function()
		{
			pattern	= new RegExp( this.id );
			this.className	= this.className.replace( pattern, '' );
		}
		o.onblur	= function()
		{
			pattern	= new RegExp( this.id );
			if(
				!this.value
				&&
				!pattern.test( this.className )
			)
			{
				this.className	= this.className + ' ' + this.id;
			}
		}
	}

	o.onblur();
}
