/**
 * @file
 * @brief JavaScript stuff for version #2 of the the 5-star voting system.
 * @author Marc-Andre Disnard <madisnard@gmail.com>
 * @version $Id: vote-v2.js 357 2007-01-21 21:20:33Z mad $
 */

var EMPTY_STAR_IMG = 'imgs/etoile_0.jpg';
var FULL_STAR_IMG  = 'imgs/etoile_1.jpg';
var HALF_STAR_IMG  = 'star-16px-half.gif';
var NUM_STARS      = 5;
var UPDATE_FREQ    = 4;
var RESET_DELAY    = 3;
var SAVING_MSG     = 'Enregistrement...';
var SAVED_MSG      = 'Vote enregistr&eacute;. Merci.';
var ERROR_MSG      = 'Erreur!';
var DELAY_MSG      = 'Vous avez d&eacute;j&agrave; vot&eacute; pour ce clip.';
var VOTE_MESSAGES  = new Array('Pourri',
                               'Correct',
                               'Bon',
                               'Super bon',
                               'Fabuleux');

var can_vote      = true;
var ajax_req      = null;
var reset_counter = 0;
var preloaded     = new Array();

/** Callback function for body-onload. */
function star_init() {
    // Preload star images...
    var urls = new Array(EMPTY_STAR_IMG, FULL_STAR_IMG, HALF_STAR_IMG);
    for (var i = 0; i < urls.length; i++) {
        preloaded[i] = new Image();
        preloaded[i].src = urls[i];
    }

    star_update();
}

/** Callback function for timer. */
function star_update() {
    setTimeout('star_update();', Math.floor(1000 / UPDATE_FREQ));

    if (!can_vote)
        return;

    if (reset_counter) {
        if (!--reset_counter) {
            fill_stars(avg_score);
            set_vote_msg(num_votes_f + ' vote' + (1 < num_votes ? 's' : '') + ' &nbsp;/&nbsp; ' +
                         num_views_f + ' visionnement' + (1 < num_views ? 's' : ''));
        }
    }
}

/** Callback function for star mouseover. */
function star_over(score) {
    if (!can_vote)
        return;

    fill_stars(score);
    set_vote_msg(VOTE_MESSAGES[score - 1]);

    reset_counter = 0;
}

/** Callback function for star mouseout. */
function star_out(score) {
    if (!can_vote)
        return;

    reset_counter = RESET_DELAY;
}

/** Callback function for star click. */
function star_click(id, score) {
    if (!can_vote)
        return;

    // Internet Explorer.
    var objs = new Array('Msxml2.XMLHTTP.5.0', 'Msxml2.XMLHTTP.4.0', 'Msxml2.XMLHTTP.3.0',
                         'Msxml2.XMLHTTP', 'Microsoft.XMLHTTP');
    for (var i = 0; !ajax_req && i < objs.length; i++) {
        try {
            ajax_req = new ActiveXObject(objs[i]);
        } catch (e) {
            ajax_req = null;
        }
    }

    // ICEbrowser.
    if (!ajax_req && 'undefined' != typeof(window.createRequest))
        ajax_req = window.createRequest();

    // Firefox and other standard browsers.
    if (!ajax_req && 'undefined' != typeof(XMLHttpRequest))
        ajax_req = new XMLHttpRequest();

    if (!ajax_req)
        return;

    can_vote = false;
    set_vote_msg(SAVING_MSG);

    ajax_req.open('GET', 'vote.php?id=' + escape(id) + '&score=' + escape(score), true);
    ajax_req.onreadystatechange = req_change;
    ajax_req.send(null);
}

/** Updates the star images with a new score. */
function fill_stars(score) {
    if ('undefined' == typeof(document.images))
        return;

    var delta = NUM_STARS / (NUM_STARS * 2 + 1);
    var pos = 0;
    for (var i = 1; i <= NUM_STARS; i++) {
        var src = EMPTY_STAR_IMG;
        pos += delta;
        if (score > pos)
            src = HALF_STAR_IMG;
        pos += delta;
        if (score > pos)
            src = FULL_STAR_IMG;
        document.images['star' + i].src = src;
    }
}

/** Updates the vote message span. */
function set_vote_msg(msg) {
    if ('undefined' == typeof(document.images))
        return;

    var vs = document.getElementById('vote_span');
    if (vs)
        vs.innerHTML = msg;
}

/** Callback function for AJAX ready state change. */
function req_change() {
    if (4 != ajax_req.readyState)
        return;

    if (200 != ajax_req.status || -1 != ajax_req.responseText.indexOf('ERROR')) {
        set_vote_msg(ERROR_MSG);
        return;
    }

    if (-1 != ajax_req.responseText.indexOf('DELAY')) {
        set_vote_msg(DELAY_MSG);
        return;
    }

    set_vote_msg(SAVED_MSG);
}


