Message = function( status, text ) {
	this.status = status;
	this.text = text;
}

Message.STATUS_ERR = 'error';
Message.STATUS_OK = 'ok';
Message.STATUS_EMPTY = 'empty';

Message.GetByXMLStatus = function( xmlStatus ){
	switch( xmlStatus ){
		case 'ok':
			return Message.STATUS_OK;
		break;
		default:
			return Message.STATUS_ERR;
	}
};

MessageError = function( text ) {
	MessageError.superclass.constructor.call( this, Message.STATUS_ERR, text );
}
MessageOk = function( text ) {
	MessageOk.superclass.constructor.call( this, Message.STATUS_OK, text );
}

MessageFormError = function( text, oField ) {
	MessageFormError.superclass.constructor.call( this, text );
	this.oField = oField;
}

YAHOO.lang.extend( MessageError, Message );
YAHOO.lang.extend( MessageOk, Message );
YAHOO.lang.extend( MessageFormError, MessageError );


var MessageQueue =  function() { 
	var _ref = this;
	var _oM = new Message( Message.STATUS_EMPTY, '' );
	
	this.add = function( oMess ) {
		if( !( oMess instanceof Message ) ) {
			throw "MessageQueue.add: argument must be instance of Message.";
		}
		_oM = oMess;
		_ref.addEvent.fire( _oM );
	}
	
	this.get = function() {
		return _oM;
	}

	this.addEvent = new YAHOO.util.CustomEvent( "addEvent", this );
	 
	this.subscribeRepresentation = function( oMR ) {
		if( !( oMR instanceof MessageRepresentationBase ) ) {
			throw "MessageQueue.subscribeRepresentation: argument must be instance of MessageRepresentation.";
		}
		_ref.addEvent.subscribe( oMR.show, oMR, true );
	}
}

var MessageRepresentationBase = function() {
	this.classname = 'MessageRepresentationBase';
	this.show = function( oEvent, arrArgs ) {
		var _oMess = arrArgs[0];
		alert( 'Method show is not implemented for this representation( ' + this.classname + ' ). Message text was: ' + _oMess.text );
	}
}


var MessageRepresentation = function( affixed, classCssError, classCssOk, oQue ) {
	this.classname = 'MessageRepresentation';
	var _idTarget = "message";
	var _ref = this;
	var _affixed = affixed;
	if( !( _affixed instanceof Object ) ) {
		_affixed = document.getElementById( _affixed );
	}
	var _classCssError = classCssError;
	var _classCssOk = classCssOk;
	var _module = new YAHOO.widget.Module( _idTarget ,{ width : "auto",  visible: false } );
	
//	MessageRepresentation.superclass.constructor.call( this,  );
	_module.setBody( '' );
	_module.render( _affixed );
	
	
	var attributes_messHide = {
		//height: {  to: 0 },
		opacity: {  to: 100 }
	};
	
	var messHide = new YAHOO.util.Anim( _idTarget, attributes_messHide, 0.2 );
	
	this.hide = function() {
		messHide.animate();
		setTimeout( function() { _module.hide(); }, 400 );
	}
	
	this.show = function( oEvent, arrArgs ) {
		YAHOO.util.Dom.removeClass( _idTarget, _classCssError );
		YAHOO.util.Dom.removeClass( _idTarget, _classCssOk );
		
//		YAHOO.util.Dom.setStyle( _idTarget, 'height', "41px" );
//		YAHOO.util.Dom.setStyle( _idTarget, 'opacity', '100' );
	
		var _oMess = arrArgs[0];
		var cssClass = '';
		_module.setBody( "<a class='close' id='close' href='#' onclick='return false;'> </a><div class='text'>" + _oMess.text + "</div>" );
		if ( _oMess.status == Message.STATUS_EMPTY ) {
			return;
		}
		if ( _oMess.status == Message.STATUS_ERR ) {
			cssClass = _classCssError;
		}
		if ( _oMess.status == Message.STATUS_OK ) {
			cssClass = _classCssOk;
		}
		YAHOO.util.Dom.addClass( _idTarget, cssClass ); 
		_module.show();
		window.scroll(0,0);
		YAHOO.util.Event.on( 'close', 'click', _ref.hide, null, _ref );		
	}

	
	oQue.subscribeRepresentation( this );
	
/*
	var attributes_messShow = {
		height: {  to: 2.3 ,unit: 'em'},
		opacity:{  from:0, to: 1 }
		};
	var messShow = new YAHOO.util.Anim('message', attributes_messShow, 0.5 );

	this.showEvent.subscribe( messShow.animate, null, messShow );
*/
}

YAHOO.lang.extend( MessageRepresentation, MessageRepresentationBase );

