var Nihohon = Class.create();
Nihohon.prototype = {
	initialize: function( aOption ){
		this.myResult = null;

		Event.observe( $('nihohonForm'), 'submit', this.onsubmit_form.bindAsEventListener( this ) );
		Event.observe( $('nihohonForm'), 'reset', this.onreset_form.bindAsEventListener(this) );
		Event.observe( $('nihohonForm').text, 'focus', this.onfocus_text.bindAsEventListener( this ) );
		Event.observe( $('postTwitter'), 'submit', this.onsubmit_post_twitter.bindAsEventListener( this ) );
		Event.observe( $('postTwitterLink'), "click", this.onclick_post_twitter_link.bindAsEventListener( this ) );
		Event.observe( $('tryAgainLink'), "click", this.onclick_try_again_link.bindAsEventListener( this ) );
		
		this.initTextForm();
	},

	initTextForm: function(){
		var textElem = $('nihohonForm').text;
		textElem.addClassName( 'NOINPUT' );
		textElem.value = 'ここに余計な翻訳をしたい日本語を入力してください。';
	},

	disableForm: function(){
		var formElem = $( 'nihohonForm' );
		formElem.disable();
		Effect.Fade( formElem, { duration: 0.15 } );
	},

	restoreForm: function(){
		var formElem = $( 'nihohonForm' );
		Effect.Appear( formElem, { duration: 0.15 } );
		$( 'nihohonForm' ).enable();
	},

	onreset_form: function( aEvent ){
		setTimeout( ( function(){
			this.initTextForm();
		} ).bind( this ), 1 );
	},

	onsubmit_form: function( aEvent ){
		var formElem = $('nihohonForm');
		var textElem = formElem.text;

		if( textElem.hasClassName( 'NOINPUT' ) || $F( textElem ).strip() == "" ){
			Event.stop( aEvent );
			return false;
		}

		var srcElem = $('src');
		srcElem.innerHTML = $F(textElem).escapeHTML();
		srcElem.show();

		var processElem = $('process');
		processElem.innerHTML = 'ほんやく中<br><img src="indicator_kit.gif" />';
		processElem.show();

		var resultElem =  $('result');
		resultElem.hide();
		resultElem.value = '';

		$('afterResult').hide();
		$('postTwitterResult').innerHTML = '';

		var failureFunc = (function(){
			this.restoreForm();
			$('src').hide();
			$('process').innerHTML = '通信に失敗しました...';
		} ).bind( this );

		if( $F( formElem.mode ) == 10 ){
			new Ajax.Request( './nihohon.php', { 
				method:'post', 
				postBody: Form.serialize( formElem ), 
				onSuccess: ( function( aReq ){
				
					var obj = null;

					try{
						obj = aReq.responseText.evalJSON();
					}
					catch(e){}

					if( obj && obj.value.items ){
						var t = obj.value.items[0].description;

						this.myResult = {
							process: [t]
						};

						new Ajax.Request( './nihohon.php', { 
							method:'post', 
							postBody: $H( {
								text: t,
								mode: 11
							} ).toQueryString(),
							onSuccess: ( function( aReq ){
								var obj =  null;
								try{
									obj = aReq.responseText.evalJSON();
								}
								catch(e){}

								if( obj && obj.value.items ){
									var t = obj.value.items[0].description;
									this.myResult.result = t;
									this.onsuccess_request( null, true );
								}
								else {
									failureFunc();
								}
							} ).bind( this ),
							onFailure: failureFunc
						} );
					}
					else {
						failureFunc();
					}
				} ).bind( this ),
				onFailure: failureFunc
			} );
		}
		else {

			new Ajax.Request( './nihohon.php', { 
				method:'post', 
				postBody: Form.serialize( formElem ), 
				onSuccess: this.onsuccess_request.bind(this),
				onFailure: failureFunc
			} );
		}

		this.disableForm();
		Event.stop( aEvent );
		return false;
	},

	onfocus_text: function( aEvent ){
		var textElem = $( 'nihohonForm' ).text;
		if( textElem.hasClassName( 'NOINPUT' ) ){
			textElem.removeClassName( 'NOINPUT' );
			textElem.value = '';
		}
	},

	onsuccess_request: function( req, aCreated ){
		var processElem = $('process');
		processElem.innerHTML = '';

		if( ! aCreated ){
			this.myResult = null;
			try {
				this.myResult = req.responseText.evalJSON();
			}
			catch( e ){
			}
		}
		this.myResult.src = $('nihohonForm').text.value;

		if( this.myResult ) {
			if( this.myResult['err_msg'] ) {
				if( this.myResult['err_msg'] == 'server error' ) {
				  processElem.innerHTML = '翻訳サーバが混んでるっぽいです。';
				}
				else {
				  processElem.innerHTML = this.myResult['err_msg'];
				}

				this.restoreForm();
				this.myResult = null;
			}
			else if ( this.myResult.result == "" ){
				  processElem.innerHTML = '翻訳に失敗しました...';
				this.restoreForm();
			}
			else {
				var html = '';

				this.myResult.process.each( function( value ){ 
					html += '<p>↓</p><p>' + value.replace(/\n/, '&nbsp;' ).escapeHTML() + '</p>'; 
				} ); 

				processElem.innerHTML = html + '<p>↓</p>';

				var resultElem = $('result');
				resultElem.innerHTML = this.myResult.result.escapeHTML().replace(/\n/, '&nbsp;' );
				resultElem.show();

				$('nihohonForm').enable();
				$('postTwitterForms').hide();
				$('postTwitter').enable();
				$('postTwitter').show();
				$('tryAgain').show();
				$('afterResult').show();
			}
		}
		else {
			processElem.innerHTML = '通信に失敗しました...';
			this.restoreForm();
		}
	},

	onsubmit_post_twitter: function( aEvent ){
		if( ! this.myResult.twittered ){
			this.myResult.twittered = true;

			var form = $('postTwitter');
			var text = this.myResult.result + ' *NHHN*';
			if( ! form.ro.checked ){
				text = this.myResult.src + ' → ' + text;
			}

			var param = $H( {
				account: $F( form.account ),
				password: $F( form.password ),
				text: text
			} ).toQueryString();

			new Ajax.Request( './post_twitter.php', {
				method: "post",
				postBody: param,
				onSuccess: function( aReq ){
					$('postTwitterResult').innerHTML = "Twitterに投稿できました。";
					$('postTwitter').hide();
				},
				onFailure: ( function(){
					$('postTwitterResult').innerHTML = "Twitterへの投稿に失敗しちゃいました。";
					this.myResult.twittered = false;
					form.enable();
				} ).bind( this )
			} );

			form.disable();
			$('postTwitterResult').innerHTML = 'Twitterへ投稿中... <img src="indicator_kit.gif" />';
		}
		Event.stop( aEvent );
		return false;
	},

	onclick_post_twitter_link: function(){
		var formsElem = $("postTwitterForms");
		formsElem.visible() ? formsElem.hide() : formsElem.show();
	},

	onclick_try_again_link: function(){
		//$('src').hide();
		//$('process').hide();
		//$('result').hide();
		//$('afterResult').hide();
		this.restoreForm();
		$('nihohonForm').reset();
		$('tryAgain').hide();
		//this.initTextForm();
		$('main').scrollIntoView(true);
	}
};

(function(){
	var img = new Image();
	img.src = 'indicator_kit.gif';
})();

Event.observe( window, 'load', function(){
	new Nihohon();
} );
