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( value ) {
		return ( 0 == 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();

		var sNodeValue	= false;

		for( i = 0; i < obj.elements.length; i++ ) {
			
			el	= obj.elements[ i ];

			if( 'submit' == el.type )
				continue;

			sNodeValue	= false;
			bTemp		= false;
			sValidator	= false;
			sTarget		= false;
			sMessage	= false;

			for( j = 0; j < el.attributes.length; j++ ) {

				if( 'meta:validator' == el.attributes[ j ].name )
					sValidator	= el.attributes[ j ].value

				if( 'meta:node' == el.attributes[ j ].name )
					sNodeValue	= el.attributes[ j ].value;

				if( 'meta:target' == el.attributes[ j ].name )
					sTarget	= el.attributes[ j ].value;

				if( 'meta:message' == el.attributes[ j ].name )
					sMessage	= el.attributes[ j ].value;
			}

			if( false == sValidator )
				continue;

			switch( sValidator ) {
				case 'filled':
					bTemp	= this.filled( el.value );
					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;
					break;
			}


			if(
				false == sNodeValue
				&&
				(
					false == sTarget
					&&
					false == sMessage
				)
			)
				continue;

			if( false != sTarget )
				var a	= {
					'type'		: 'target',
					'target'	: sTarget,
					'value'		: sMessage
				};
			else
				var a	= {
					'type'	: 'node'
				};

			if( 'undefined' == typeof( aNodes[ el.name ] ) ) {

				// Если элемент не виден, отключаем показывание сообщения о проверке
				// Спасибо Sergey Ilinsky, www.ilinsky.com, за этот хак
				if( el.offsetHeight <= 0 )
					bTemp	= true;

				aNodes[ el.name ]	= { 'flag' : bTemp, 'data' : a };
			} else if( true == bTemp ) {
				aNodes[ el.name ]	= { '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 ] );

				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;
}