var loaded_tablednd = ( !! $.tableDnD );
var ie8 = ( $.browser.msie && $.browser.version.substr( 0,1 ) == '8' );

function add_spinner_to( target ) {
    target.append( '<img src="/images/misc/spinner.gif" alt="..." class="spinner"/>' );
};
function add_spinner_beside( target ) {
    target.after( '<img src="/images/misc/spinner.gif" alt="..." class="spinner"/>' );
};
function add_spinner_before( target ) {
    target.before( '<img src="/images/misc/spinner.gif" alt="..." class="spinner"/>' );
};

function show_message( message ) {
    $.prompt(
        message,
        {
            promptspeed: 300,
            overlayspeed: 300,
            timeout: 3000,
            top: '40%'
        }
    );
}

function submit_site_comments() {
    var submit = $( '#form-site-comments .submit' );
    var form = submit.closest( '#form-site-comments' );
    add_spinner_beside( submit );

    var email = $( ':input[name="email"]', form ).val();
    var text = $( ':input[name="text"]', form ).val();

    $.post(
        '/comments.json',
        { json: $.toJSON(
            {
                email: email,
                text: text
            }
        ) },
        function( response ) {
            $( '.spinner' ).remove();

            if( response.error ) {
                show_message( response.error );
            } else if( response.success && response.success != true ) {
                $( ':input:not(:button)', form ).val( '' );
                show_message( response.success );
            }
        },
        'json'
    );

    return false;
}

function submit_submittable( submittable ) {
    var submit = $( ':submit:first', submittable );
    add_spinner_beside( submit );

    var input_hash = {};
    $( ':input', submittable ).each( function() {
        input_hash[ $(this).attr( 'name' ) ] = $(this).val();
    } );

    $.post(
        submittable.attr( 'action' ),
        { json: $.toJSON( input_hash ) },
        function( response ) {
            $( '.spinner' ).remove();

            if( response.error ) {
                show_message( response.error );
            } else if( response.success ) {
                $( ':input:not(:button,:submit,:hidden)', submittable ).val( '' );
                if( response.success != true ) {
                    show_message( response.success );
                }
            }
            if( response.partial ) {
                submittable.after( $(response.partial) );
                if( loaded_tablednd ) {
                    $( '.draggable-rows' ).tableDnDUpdate();
                }
            }
        },
        'json'
    );

    return false;
}

function slideUp_tr( tr ) {
    tr.children( 'td' ).each( function() {
        var td = $(this);
        td.wrapInner("<div></div>").children( "div" ).slideUp();
        td.animate(
            { paddingTop: '0px', paddingBottom: '0px' },
            'normal',
            function() {
                if( $.browser.opera ) {
                    tr.remove();
                } else {
                    td.css( 'border', '0px' );
                }
            }
        );
    });
};

function transmit_row_order( table, row_data ) {
    var input_hash = {};
    input_hash[ 'row-data' ] = row_data;

    $.post(
        table.attr( 'action' ),
        { json: $.toJSON( input_hash ) },
        function( response ) {
            if( response.error ) {
                show_message( response.error );
            } else if( response.success ) {
                if( response.success != true ) {
                    show_message( response.success );
                }
            }
        },
        'json'
    );
}

function change_popularity_contest( clicked ) {
    var params = '';

    var c = $( '.contest-current' );
    var contest_id = '1';
    if( c.size() ) {
        contest_id = c.attr( 'contest-id' );
    }
    params = params + '&contest_id=' + contest_id;

    var m = $( 'select[name=municipality_id] :selected' );
    if( m.size() ) {
        params = params + '&municipality_id=' + m.val();
        var n = $( 'select[name=neighbourhood_id] :selected' );
        if( n.size() ) {
            params = params + '&neighbourhood_id=' + n.val();
        }
    }

    window.location = '?' + params;
};

var rotator_timeouts = new Array();

function rotator_set_timeout( rotator ) {
    clearTimeout( rotator_timeouts[ rotator ] );
    rotator_timeouts[ rotator ] = setTimeout(
        function() { rotate_image( rotator ); },
        6000
    );
};

function rotator_set_image( rotator, img ) {
    var main_image = $( '.main-image', rotator );
    if( ! ie8 ) {
        main_image.hide();
        img.hide();
    }
    rotator.find( '.thumbnail' ).removeClass( 'selected' );

    $( 'a', main_image ).attr( 'href', img.attr( 'href' ) );
    $( '.title span', rotator ).text( img.attr( 'title' ) );
    $( '.caption', rotator ).text( img.attr( 'caption' ) );
    $( 'img', main_image ).attr( 'src', img.attr( 'src' ) );

    var thumbnail = img.closest( '.thumbnail' );
    thumbnail.addClass( 'selected' );
    main_image.attr( 'element-index', thumbnail.attr( 'element-index' ) );

    if( ! ie8 ) {
        main_image.fadeIn();
        img.fadeIn();
    }

    rotator_set_timeout( rotator )
};

function rotate_image( rotator ) {
    var index_current = parseInt( rotator.find( '.main-image' ).attr( 'element-index' ) );
    var num_elements = parseInt( rotator.attr( 'num-elements' ) );
    var index_next = ( index_current + 1 ) % num_elements;
    rotator_set_image(
        rotator,
        rotator.find( 'div[element-index=' + index_next + '] img' )
    );
};

/* -------------------------------------------------------- */

$( document ).ready( function() {
    $( '#form-site-comments .submit' ).click( function() {
        return submit_site_comments();
    } );

    $( '#form-site-comments :input' ).bind( 'keypress', function(e) {
        var code = e.keyCode || e.which;
        if( code == 13 ) {
            return submit_site_comments();
        }
    } );

    $( 'a.popup-feedback' ).click( function() {
        $.get( '/popup-feedback.php', function( html ) {
            $.prompt(
                html,
                {
                    buttons: { 'Submit': true, 'Cancel': false },
                    submit: function( value, message, hash ) {
                        if( value ) {
                            submit_submittable( message.find( '.submittable' ) );
                        }
                    }
                }
            );
        });
        return false;
    } );

    $( ':input.close' ).click( function() {
        self.close;
        return false;
    } );

    $( '.submittable :submit' ).click( function() {
        return submit_submittable( $(this).closest( '.submittable' ) );
    } );

    $( '.submittable :input' ).live( 'keypress', function(e) {
        var code = e.keyCode || e.which;
        if( code == 13 ) {
            var result = submit_submittable( $(this).closest( '.submittable' ) );
            $.prompt.close();
            return result;
        }
    } );

    $( ':button[action]' ).live( 'click', function() {
        var button = $(this);
        add_spinner_beside( button );

        var data_attributes = button[ 0 ].attributes;
        var input_hash = {};
        for( var i = 0; i < data_attributes.length; i++ ) {
            var key = data_attributes[ i ].nodeName;
            if( key.substring( 0, 5 ) == 'data-' ) {
                input_hash[ key.substring( 5 ) ] = data_attributes[ i ].nodeValue;
            }
        }

        $.post(
            button.attr( 'action' ),
            { json: $.toJSON( input_hash ) },
            function( response ) {
                $( '.spinner' ).remove();

                if( response.error ) {
                    show_message( response.error );
                } else if( response.success ) {
                    if( button.hasClass( 'deleter' ) ) {
                        slideUp_tr( button.closest( 'tr' ) );
                    }
                    if( response.success != true ) {
                        show_message( response.success );
                    }
                }
            },
            'json'
        );
    } );

    $( '#popularity-contests a' ).click( function() {
        add_spinner_beside( $(this) );
        $( '.contest-current' ).removeClass( 'contest-current' );
        $(this).addClass( 'contest-current' );
        change_popularity_contest();
        return false;
    } );
    $( '.popularity-filters select[name=municipality_id]' ).change( function() {
        add_spinner_beside( $(this) );
        change_popularity_contest();
    } );
    $( '.popularity-filters select[name=neighbourhood_id]' ).change( function() {
        add_spinner_beside( $(this) );
        change_popularity_contest();
    } );

    $( '.feed-item-hide' ).click( function() {
        var item = $(this).closest( 'tr.feed-item' );
        item.removeClass( 'visible' );
        item.addClass( 'hidden' );
    } );
    $( '.feed-item-unhide' ).click( function() {
        var item = $(this).closest( 'tr.feed-item' );
        item.removeClass( 'hidden' );
        item.addClass( 'visible' );
    } );

    $( '.rotator .thumbnail img' ).click( function() {
        var rotator = $(this).closest( '.rotator' );
        rotator_set_image( rotator, $(this) );
    } );

    $( '.rotator' ).each( function() {
        var rotator = $(this);
        rotator_set_timeout( rotator );
    } );

    $( 'table.ad-livehigh td' ).click( function() {
        window.location = '/register.php';
        return false;
    } );

    if( loaded_tablednd ) {
        $( '.draggable-rows' ).tableDnD( {
            onDrop: function( table, row ) {
                transmit_row_order( $(table), $.tableDnD.serialize() );
            },
            onDragClass: 'dragged'
        } );
    }

} );
