var NXC = NXC || {};
NXC.PublishActivityMessage = new Class( {

	Implements: [Options, Events],

	container: false,
	messageStack: false,
	collectionID: 0,
	form: false,
	inputs: [],
	messageContentInput: false,
	publisButton: false,
	activityStreamBlock: false,
	facebookCheckbox: false,

	options: {
		'ajaxBaseURL': '/',
		'publishOnlyOnce': true,
		'formID': 'nxcPublishActivityMessageForm',
		'messageContentInputID': 'nxcPublishActivityMessageContent',
		'publisButtonID': 'nxcPublishActivityMessagePublish',
		'activityStreamBlockID': 'nxcCollectionsActivityStream',
		'facebookCheckboxID': 'nxcPublishActivityMessagePublishToFacebook',
		'inputErrorClass': 'error',
		'inputElementsBase': 'nxc_collections_donate_',
		'messages': {
			'errorHeader': 'Required data is either missing or is invalid',
			'publishSuccess': 'Activity message published'
		}
	},

	initialize: function( containerID, collectionID, messageStack, options ) {
		this.setOptions( options );

		this.container    = document.id( containerID );
		this.collectionID = collectionID;
		this.messageStack = messageStack;

		this.form                = document.id( this.options.formID );
		this.inputs              = this.form.getElements( 'input, textarea' );
		this.messageContentInput = document.id( this.options.messageContentInputID );
		this.publisButton        = document.id( this.options.publisButtonID );
		this.activityStreamBlock = document.id( this.options.activityStreamBlockID );
		this.facebookCheckbox    = document.id( this.options.facebookCheckboxID );

		this.installEvents();
	},

	installEvents: function() {
		this.publisButton.addEvent( 'click', function( e ) {
			new Request.JSON( {
				'url'      : this.form.get( 'action' ),
				'method'   : 'post',
				'onSuccess': function( response ) {
					var response = new Hash( response );
					response.set( 'errors', new Hash( response.get( 'errors' ) ) );

					if( response.get( 'status', 0 ).toInt() === 1 ) {
						this.messageStack.showMessage( this.options.messages.publishSuccess, 'notice' );
						var messageContent = this.messageContentInput.get( 'value' );

						if( this.options.publishOnlyOnce === true ) {
							this.container.setStyle( 'display', 'none' );
						} else {
							this.messageContentInput.set( 'value', '' );
						}

						new Request.HTML( {
							'url': this.options.ajaxBaseURL + '/dashboard/get_activity_messages/' + this.collectionID,
							'update': this.activityStreamBlock
						} ).send();

						if( this.facebookCheckbox.get( 'checked' ) ) {
							window.facebookHandler.publishActivity( messageContent );
						}
					} else {
						this.inputs.removeClass( this.options.inputErrorClass );

						var errorMessage = '';
						response.get( 'errors' ).each( function( message, elementName ) {
							errorMessage += '<li>' + message + '</li>';

							var name = this.options.inputElementsBase + elementName;
							this.inputs.each( function( el ) {
								if( el.get( 'name' ) === name ) {
									el.addClass( this.options.inputErrorClass );
								}
							}.bind( this ) );
						}.bind( this ) );

						this.messageStack.stackBlock.empty();
						errorMessage = this.options.messages.errorHeader + '<ul>' + errorMessage + '</ul>';
						this.messageStack.showMessage( errorMessage, this.options.inputErrorClass );
					}
				}.bind( this )
			} ).send( this.form.toQueryString() );
		}.bind( this ) );

		this.messageContentInput.addEvent( 'focus', function() {
			this.messageContentInput.removeClass( this.options.inputErrorClass );
		}.bind( this ) );
	}
} );
