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

	Implements: [Options, Events],

	lightbox: false,
	container: false,
	stepHeadlines: [],
	stepContainers: [],
	messageStack: false,
	donationdID: false,

	options: {
		'ajaxBaseURL': '/',
		'stepHeadlinesCSSPath': 'ul.nxc-collections-donate-steps li',
		'stepHeadlineActiveClass': 'active',
		'stepContainersCSSPath': 'div.nxc-collections-donate-step-container div.nxc-collections-donate-step',
		'stepContainerActiveClass': 'active',
		'step1FormID': 'nxcCollectionsDonateStep1Form',
		'continueStep1ButtonID': 'nxcCollectionsDonateStep1Continue',
		'cancelStep1ButtonID': 'nxcCollectionsDonateStep1Cance',
		'continueStep2ButtonID': 'nxcCollectionsDonateStep2Continue',
		'cancelStep2ButtonID': 'nxcCollectionsDonateStep2Cance',
		'backStep2ButtonID': 'nxcCollectionsDonateStep2Back',
		'continueStep3ButtonID': 'nxcCollectionsDonateStep3Continue',
		'cancelStep3ButtonID': 'nxcCollectionsDonateStep3Cance',
		'collectionInputID': 'nxcCollectionsDonateColectionID',
		'collectionsStatisticsBlockID': 'nxcCollectionsStatistics',
		'activityStreamBlockID': 'nxcCollectionsActivityStream',
		'inputErrorClass': 'error',
		'paymentIFrameID': 'nxcCollectionsDonatePaymentIFrame',
		'inputElementsBase': 'nxc_collections_donate_',
		'messages': {
			'step1FormInputErrorHeader': 'Required data is either missing or is invalid',
			'donationSuccess': 'Thank you for your donation'
		}
	},

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

		this.lightbox       = lightbox;
		this.container      = this.lightbox.contentBlock;
		this.stepHeadlines  = this.container.getElements( this.options.stepHeadlinesCSSPath );
		this.stepContainers = this.container.getElements( this.options.stepContainersCSSPath );

		this.messageStack   = messageStack;

		this.installStep1Events();
		this.installStep2Events();
		this.installStep3Events();
	},

	installStep1Events: function() {
		var step1Form = document.id( this.options.step1FormID );
		step1Form.addEvent( 'click', function ( e ) { e.stop(); } );

		var inputs = step1Form.getElements( 'input[type=text]' );
		inputs.each( function( inputElement ) {
			inputElement.addEvent( 'focus', function( e ) {
				inputElement.removeClass( this.options.inputErrorClass );
			}.bind( this ) );
		}, this );

		document.id( this.options.continueStep1ButtonID ).addEvent( 'click', function ( e ) {
			e.stop();

			var ajaxURL = ( this.donationdID === false ) ? 'create' : 'edit/' + this.donationdID;
			new Request.JSON( {
				'url'      : this.options.ajaxBaseURL + '/donation/' + ajaxURL,
				'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.donationdID = response.get( 'donation_id' );
						this.setActiveStep( 2 );
						var paymentIFrame = new IFrame( this.options.paymentIFrameID, {
							src: this.options.ajaxBaseURL + '/donation/redirect_to_netaxept/' + this.donationdID
						} );
					} else {
						var errorMessage = '';
						response.get( 'errors' ).each( function( message, elementName ) {
							errorMessage += '<li>' + message + '</li>';

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

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

		document.id( this.options.cancelStep1ButtonID ).addEvent( 'click', function ( e ) {
			e.stop();
			this.emptyFormInputs();
			this.lightbox.close();
		}.bind( this ) );
	},

	installStep2Events: function() {
		document.id( this.options.backStep2ButtonID ).addEvent( 'click', function ( e ) {
			this.setActiveStep( 1 );
		}.bind( this ) );

		document.id( this.options.cancelStep2ButtonID ).addEvent( 'click', function ( e ) {
			e.stop();
			new Request.JSON( {
				'url'      : this.options.ajaxBaseURL + '/donation/cancel/' + this.donationdID,
				'method'   : 'post',
				'onSuccess': this.cancel.bind( this )
			} ).send();
		}.bind( this ) );
	},

	installStep3Events: function() {
		document.id( this.options.continueStep3ButtonID ).addEvent( 'click', function ( e ) {
			e.stop();

			new Request.JSON( {
				'url'      : this.options.ajaxBaseURL + '/donation/confirm/' + this.donationdID,
				'method'   : 'post',
				'onSuccess': function( response ) {
					if( response.status.toInt() === 1 ) {
						var statisticsBlock = document.id( this.options.collectionsStatisticsBlockID );
						if( $type( statisticsBlock ) == 'element' ) {
							var collectionID    = document.id( this.options.collectionInputID ).get( 'value' );
							new Request.HTML( {
								'url': this.options.ajaxBaseURL + '/dashboard/get_collection_statistics/' + collectionID,
								'update': statisticsBlock
							} ).send();
						}

						var activityStreamBlock = document.id( this.options.activityStreamBlockID );
						if( $type( activityStreamBlock ) == 'element' ) {
							var collectionID    = document.id( this.options.collectionInputID ).get( 'value' );
							new Request.HTML( {
								'url': this.options.ajaxBaseURL + '/dashboard/get_activity_messages/' + collectionID,
								'update': activityStreamBlock
							} ).send();
						}

						this.messageStack.showMessage( this.options.messages.donationSuccess, 'notice' );
					} else {
						this.messageStack.showMessage( response.error, 'error' );
					}

					this.cancel();
				}.bind( this )
			} ).send();
		}.bind( this ) );

		document.id( this.options.cancelStep3ButtonID ).addEvent( 'click', function ( e ) {
			e.stop();

			new Request.JSON( {
				'url'      : this.options.ajaxBaseURL + '/donation/cancel/' + this.donationdID,
				'method'   : 'post',
				'onSuccess': this.cancel.bind( this )
			} ).send();
		}.bind( this ) );
	},

	cancel: function() {
		this.donationdID = false;
		this.setActiveStep( 1 );
		this.emptyFormInputs();
		this.lightbox.close();
	},

	setActiveStep: function( stepIndex ) {
		this.stepHeadlines.removeClass( this.options.stepHeadlineActiveClass );
		this.stepHeadlines[ stepIndex - 1 ].addClass( this.options.stepHeadlineActiveClass );

		this.stepContainers.removeClass( this.options.stepContainerActiveClass );
		this.stepContainers[ stepIndex - 1 ].addClass( this.options.stepContainerActiveClass );
	},

	emptyFormInputs: function() {
		var inputs = document.id( this.options.step1FormID ).getElements( 'input[type=text]' );
		inputs.each( function( el ) {
			el.removeClass( this.options.inputErrorClass );
			el.set( 'value', '' );
		}, this );
	}
} );
