(function(){

    dojo.require( 'dojox.validate.regexp' );
    dojo.require( 'dojox.fx.scroll' );

    var FORM = '<form method="post" action="./recommend" id="recommend_form" style="display: none">' +
    '<h2>Produktion empfehlen</h2>' +
    '<label>E-Mail des Empf&auml;ngers:</label>' +
    '<br />' +
    '<input name="email" type="text" />' +
    '<br />' +
    '<label>Ihr Name:</label>' +
    '<br />' +
    '<input name="name" type="text" />' +
    '<br />' +
    '<label>Zusatztext:</label>' +
    '<br />' +
    '<textarea name="text"></textarea>' +
    '<br />' +
    '<input type="submit" value="Abschicken" />' +
    '</form>';

    var SHOW_LINK = '<a href="#">Produktion empfehlen</a>';

    function RecommendForm( ref_node, production_content ) {
        var self = {};
        function init( ) {
            self.production_content_html = production_content.as_string( );
            self.node = dojo._toDom( FORM );
            dojo.place( self.node, ref_node, 'before' );

            self.validate_re = new RegExp( '^' + dojox.validate.regexp.emailAddress() + "$", "i");

            self.header_node = dojo.query( 'h2', self.node )[ 0 ];
            self.email_node = dojo.query( '[name="email"]', self.node )[ 0 ];
            self.name_node = dojo.query( '[name="name"]', self.node )[ 0 ];
            self.text_node = dojo.query( '[name="text"]', self.node )[ 0 ];

            dojo.connect( self.node, 'submit', self.onSubmit );

            self.show_link = dojo._toDom( SHOW_LINK );
            self.show_link_container = dojo._toDom( '<div class="actions"></div>' );
            dojo.place( self.show_link_container, dojo.byId( 'contentMain' ), 'first' );
            dojo.place( self.show_link, self.show_link_container, 'first' );
            dojo.connect( self.show_link, 'click', self.onShow );

            return self;
        }
        self.onShow = function( e ) {
            dojo.stopEvent( e );
            dojo.style( self.show_link, 'display', 'none' );
            dojo.style( self.node, 'display', 'block' );
            var scrollAnim = dojox.fx.smoothScroll( {
                    'node': dojo.byId( 'recommend_form' ),
                    'win': window
            } ).play( );
	    dojo.connect( scrollAnim, 'onEnd', function( ) {
		dojo.anim( self.node, {
		    backgroundColor: { start: '#bbbbbb', end: '#424242' }
		}, 800 ).play( );
	    } );
        };
        self.isValidEmail = function( email ) {
            return email.replace( /^\s\s*/, '' ).replace( /\s\s*$/, '' ).match( self.validate_re );
        };
        self.onSubmit = function( e ) {
            dojo.stopEvent( e );
            self.clearErrors( );
            if( !self.isValidEmail( self.email_node.value ) ) {
                self.showError( 'Bitte geben Sie eine korrekte E-Mailadresse des Empf&auml;ngers ein.' );
            } else if( self.name_node.value.replace( /^\s\s*/, '' ).replace( /\s\s*$/, '' ) == '' ) {
                self.showError( 'Bitte geben Sie Ihren Namen ein.' );
            } else {
                var d = dojo.xhrPost( {
                    form: self.node,
                    content: { productionContent: self.production_content_html }
                } );
                d.addCallback( self.onResult );
            }
        };
        self.onResult = function( result ) {
            if( result.indexOf( 'Fehler' ) == 0 ) {
                self.showError( result );
            } else {
                self.email_node.value = '';
                self.name_node.value = '';
                self.text_node.value = '';
                self.showSuccess( );
            }
        };
        self.clearSuccess = function( ) {
            dojo.query( '.success', self.node ).forEach( dojo.destroy );
        };
        self.showSuccess = function( ) {
            self.clearErrors( );
            self.clearSuccess( );
            var success_node = dojo._toDom( '<div class="success">Danke, die Empfehlung wurde verschickt.</div>' );
            dojo.place( success_node, self.header_node, 'after' );
        };
        self.clearErrors = function( ) {
            dojo.query( '.error', self.node ).forEach( dojo.destroy );
        };
        self.showError = function( errorMsg ) {
            self.clearSuccess( );
            self.clearErrors( );
            var error_node = dojo._toDom( '<div class="error"></div>' );
            error_node.innerHTML = errorMsg;
            dojo.place( error_node, self.header_node, 'after' );
        };
        return init( );
    }

    function ProductionContent( ) {
        var self = {};
        function init( ) {
            self.node = dojo.byId( 'productionContent' );
            return self;
        }
        self.relative_to_absolute = function( node ) {
            var href = dojo.attr( node, 'href' );
            if( href && href.indexOf( 'http://' ) == -1 ) {
                dojo.attr( node, 'href', 'http://dastag.at' + href );
            }
        };
        self.as_string = function( ) {
            var content = dojo._toDom( '<div>' + self.node.innerHTML + '</div>' );
            dojo.query( 'a', content ).forEach( self.relative_to_absolute );
            return content.innerHTML;
        };
        return init( );
    }

    dojo.addOnLoad( function( ) {
        var render_recommend_form = dojo.byId( 'render_recommend_form' );
        if( render_recommend_form ) {
            RecommendForm( render_recommend_form, ProductionContent( ) );
        }
    } );

})();
