/**
 * submit event handler for the email collection form
 */
function handleEmailForm(e) {
    e.stop();

    var form = Event.element( e );

    var setStatus = function( status ) {
        form.down( '.status' )
            .removeClassName( 'loading' )
            .removeClassName( 'error' )
            .removeClassName( 'success' )
            .addClassName( status );
    };

    var showError = function( error ) {
        form.down( 'p.success' ).hide();

        if( error ) {
            setStatus( 'error' );
            form.down( 'p.error' ).update( error ).show();
            new Effect.Highlight( form.down( 'p.error' ) );
        } else {
            form.down( 'p.error' ).hide();
        }
    };

    var showSuccess = function() {
        setStatus( 'success' );
        form.down( 'p.success' ).show();
        form.down( 'input[type=text]' ).value = '';
        form.down( 'input[type=text]' ).blur();
        new Effect.Highlight( form.down( 'p.success' ) );
    };

    // reset
    showError( '' );
    setStatus( 'loading' );

    new Ajax.Request( '/email.php', {
        method: 'post',
        postBody: Form.serialize( form ),
        evalJSON: true,
        onSuccess: function( response ) {
            var r = response.responseJSON;
            if( r === true ) {
                showSuccess();
            } else {
                showError( r || 'Please try again later' );
            }
        },
        onFailure: function() {
            showError( 'Please try again later' );
        }
    } );
}

/**
 *
 */
function initNavBehavior() {
    $$('#nav > li').each( function( nav_el ) {
        if( nav_el.down( 'ul' ) ) {
            var queue_name = nav_el.className.split( /\s+/ ).first();
          
            var opts = $H({
                duration: 0.3,
                queue: {
                    scope: queue_name,
                    position: 'end',
                    limit: 2
                }
            });

            nav_el.observe( 'mouseenter', function() {
                Effect.Queues.get('menus').invoke( 'cancel' );
                new Effect.BlindDown( nav_el.down( 'ul' ).up(), opts.toObject() );
            } ).observe( 'mouseleave', function() {
                Effect.Queues.get('menus').invoke( 'cancel' );
                new Effect.BlindUp( nav_el.down( 'ul' ).up(), opts.update( {
                    afterFinish: function() {
                        nav_el.down( 'ul' ).up().setStyle({ height: '' });
                    }
                } ).toObject() );
            } );
        }
    } );
}

/**
 * rotate through random facts, and display them in footer
 */
function rotateFacts( seconds ) {
    last_fact = "";

    var getFact = function() {
        do {
            var fact = facts[Math.floor( Math.random() * facts.length )];
        } while( fact == last_fact );

        last_fact = fact;
        return fact;
    };

    var showFact = function( fact ) {
        var fact = fact || getFact();
        var fact_el = $('fact').down();

        Effect.Fade( fact_el, {
            direction: 'center',
            afterFinish: function() {
                fact_el.update( fact );
                Effect.Appear( fact_el );
            }
        } );
    }

    showFact( facts[0] );
    setInterval( function() { showFact(); }, seconds * 1000 );
}

// navigation behavior
document.observe( 'dom:loaded', function() {
    initNavBehavior();
    $$('form#email').first().observe( 'submit', handleEmailForm.bindAsEventListener() );
    rotateFacts( 10 );
} );
