
/*
 * Constants for from pages.
 */
var PAGEID_ERR =  6;// constant for error page
var PAGEID_VIDEO_PICKER = 2;// constant for page with video picker

var playAfterLoading = false;// id of video to be played onload (filled in onload callback below)

/*
 * onload callback
 *
 * Prepares keypress event for youtube login field and checks if there is videoid in incoming URL param.
 */
Event.observe(window, 'load', function() {
    if ($('f-ytl-login')) {
        $('f-ytl-login').observe('keypress', function(ev) {
            if (ev.keyCode == Event.KEY_RETURN) {
                useLogin();
            }
        });
    }

    var params = getUrlParams();
    if (params.playVideo && params.playVideo != '') {
        playAfterLoading = params.playVideo;
    }

    if (typeof loadVideosNow != 'undefined' && loadVideosNow) {
        loadVideosAPI();
    }
});



/**************************
 * Form handling functions
 *
 * Switching between form steps, reseting & submitting of form.
 **************************/


/**
 * Switches form from-to given step.
 */
function gotoStep(stepOld, stepNew) {
    var elOld = $('top-step'+stepOld);
    var elNew = $('top-step'+stepNew);

    if (elOld && elNew) {
        elOld.hide();
        elNew.show();
        if (stepNew == 2) {
            $('f-ytl-login').focus();
        }
    }
}

/**
 * Resets form fields
 */
function resetForm() {
    $('top-step'+PAGEID_ERR).hide();
    selectedVentryId = -1;
    updateSelectedVideo();
    $('f-ytl-login').setValue('');
    $('videos').innerHTML = '';
    $('in-rules').checked = false;
    $('in-name').setValue('');
    $('in-mail').setValue('');
    $('in-age').setValue('');
}

/**
 * Sends video picked using form.
 */
function sendVideo() {
    if (selectedVentryId < 0) {
        gotoStep(3, 2);
        alert("Nebylo vybráno žádné video. Vyberte jej prosím na této stránce.");
    } else {
        if (!checkForm(true)) {
//            alert("Pro přilášení videa je potřeba vyplnit formulář a souhlasit s výše uvedenými podmínkami účasti.");
        } else {
            gotoStep(3, 4);

            var url = baseUrl + 'api/save.php';
            new Ajax.Request(url, {
                metod: 'post',
                parameters: {'in-ytid': pickerEntries[selectedVentryId].ytid,
                            'in-title': pickerEntries[selectedVentryId].title,
                            'in-author': pickerEntries[selectedVentryId].author,
                            'in-duration': pickerEntries[selectedVentryId].duration,
                            'in-views': pickerEntries[selectedVentryId].views,
                            'in-description': pickerEntries[selectedVentryId].description,
                            'in-name': $('in-name').getValue(),
                            'in-mail': $('in-mail').getValue()},
                onSuccess: function(resp) {
                    if (resp.responseText == 'ok') {
                        gotoStep(4, 5);
                    } else if (resp.responseText == 'ERR_DUPLICATE_ENTRY') {
                        alert('Vybrané video již bylo do soutěže přihlášeno, vyberte prosím jiné video.');
                        gotoStep(4, 2);
                    } else {
                        gotoStep(4, 6);
                    }
                },
                onFailure: function(resp) {
                    gotoStep(4, 6);
                }
            });
        }
    }
}

/**
 * Checks wether the form is filled correctly.
 * If it isn't false is returned and submit button is disabled.
 */
function checkForm(msg) {
    var mailRegexp = /^([a-zA-Z0-9_.-])+@([a-zA-Z0-9-]+\.)+([a-zA-Z0-9]{2,4})+$/;
//    var ageRegexp = /[1-9]+[0-9]*/;

    var ok = true;
    var msgStr = "Video není možno přihlásit, ve formuláři byly nalezeny následující chyby:\n\n";

    if ($('in-name').getValue().strip() == '') {
        $('in-name').addClassName('err');
        msgStr += "- nebylo vyplněno Vaše jméno\n";
        ok = false;
    } else {
        $('in-name').removeClassName('err');
    }

    if (!mailRegexp.test($('in-mail').getValue())) {
        $('in-mail').addClassName('err');
        msgStr += "- nebyla zadána korektní e-mailová adresa\n";
        ok = false;
    } else {
        $('in-mail').removeClassName('err');
    }

    if ($('in-age').getValue() != 'on') {
        $('in-age').addClassName('err');
        msgStr += "- pro účast v soutěži musíte mít alespoň 18 let\n";
        ok = false;
    } else {
        $('in-age').removeClassName('err');
    }

    if ($('in-rules').getValue() != 'on') {
        $('in-rules').addClassName('err');
        msgStr += "- je potřeba souhlasit s výše uvedenými podmínkami\n";
        ok = false;
    } else {
        $('in-rules').removeClassName('err');
    }

    if (ok) {
        return true;
    } else {
        if (msg) {
            alert(msgStr);
        }
        return false;
    }
}



/*********************************
 * Video listing helper functions
 *********************************/


/**
 * Creates "entry" from data returned by ContestPlatform API.
 */
function createEntryCPAPI(entry) {
    if (entry.ytId) {
        return  {
            ytid: entry.ytId,
            thumbnail: "http://i.ytimg.com/vi/"+entry.ytId+"/2.jpg",
            title: entry.ytTitle,
            duration: 0,
            views: entry.ytViews,
            description: entry.ytDesc,
            author: entry.ytAuthor
        };
    } else {
        return false;
    }
}

/**
 * Creates "entry" from data returned by YouTube JSON listing.
 */
function createEntryYTplayer(entry) {
    return  {
        ytid: entry.media$group.media$player[0].url.gsub('http://www.youtube.com/watch?v=', '').gsub('&feature=youtube_gdata', ''),
        thumbnail: entry.media$group.media$thumbnail[0].url,
        title: entry.title.$t,
        duration: entry.media$group.yt$duration.seconds,
        views: (entry.yt$statistics && entry.yt$statistics.viewCount ? entry.yt$statistics.viewCount : 0),
        description: entry.media$group.media$description.$t,
        author: entry.author[0].name.$t
    };
}



/**********************
 * VideosPicker
 *
 * VideosPicker is used in input form to select user's video.
 **********************/



var selectedVentryId = -1;// currently selected video entry
/**
 * Marks video (identified by "entry" order) as selected.
 */
function selectVideo(ventryId) {
    var oldVentryId = selectedVentryId;
    if (selectedVentryId >= 0) {
        $('ventry-'+selectedVentryId).removeClassName('selected');
        selectedVentryId = -1;
        updateSelectedVideo();
    }

    if (oldVentryId != ventryId) {
        var ventry = $('ventry-'+ventryId);
        if (ventry) {
            ventry.addClassName('selected');
            selectedVentryId = ventryId;
            updateSelectedVideo();
        }
    }
}

/**
 * Chenges selected video.
 */
function updateSelectedVideo() {
    if (selectedVentryId >= 0) {
        var out = [pickerEntries[selectedVentryId].title];
        $('selected-video').innerHTML = out.join('');
        $('btn-video-picked').removeClassName('disabled');
    } else {
        $('btn-video-picked').addClassName('disabled');
        $('selected-video').innerHTML = '<em>není vybráno žádné video</em>';
    }
}

/**
 * Called after filling login into VideosPicker form.
 */
function useLogin() {
    var login = $('f-ytl-login') ? $('f-ytl-login').getValue() : false;
        login = login.gsub('"','');
        login = login.split('@')[0];

    // clear selected video
    selectedVentryId = -1;
    updateSelectedVideo();

    if (login) {
        $('f-ytl-login').setValue(login);
        var script = new Element('script', {'src':'http://gdata.youtube.com/feeds/users/'+login+'/uploads?alt=json-in-script&callback=renderVideosPicker', 'type': 'text/javascript'});
        $('videos').insert({'after': script});
    } else {
        $('videos').innerHTML = '';
        alert('Vaše YouTube přezdívka musí být pro vyhledání videí zadána.')
    }

    $('f-ytl-login').focus();
}

var pickerEntries;// list of currently loaded video entries in VideosPicker
/**
 * Renders VideosPicker table (this is called as callback from script inserted in useLogin()).
 */
function renderVideosPicker(data) {
    pickerEntries = [];
    var dataEntries = data.feed.entry || [];
    var html = ['<table width="282" cellspacing="0">'];
    var i = 0;
    for (i = 0; i < dataEntries.length; i++) {
        var entry = createEntryYTplayer(dataEntries[i]);
        pickerEntries.push(entry);
        if (i != 0) {
            html.push('<tr class="spacer"><td colspan="2"></td></tr>');
        }
        html.push('<tr id="ventry-', i, '" class="item" onclick="selectVideo(', i, ')">');

        html.push('<td valign="top"><img class="fl" src="', entry.thumbnail, '" width="70" /></td>');
        html.push('<td valign="top" align="left" width="100%">');
            html.push('<strong>', entry.title, '</strong><br />');
            html.push('délka: ', formatDuration(entry.duration), 's<br />');
            html.push('zobrazeno: ', entry.views, 'x');
        html.push('</td>');

        html.push('</tr>');
    }

    html.push('</table>');
    document.getElementById('videos').innerHTML = html.join('');
}



/*****************
 * VideosList
 *
 * Another list of videos similar to VideosPiceker. This one is used for choosing videos to be played
 *****************/


/**
 * Loads list of videos from Contest Platform API
 */
function loadVideos() {
//    var url = 'http://localhost:8080/list';
    var url = 'http://goo-ctvolby.appspot.com/list';
    new Ajax.Request(url, {
        method: 'get',
        onSuccess: function(transport) { renderVideosListCPAPI(transport); },
        onFailure: function(transport) { alert('Při načítání seznamu videí došlo k neočekávané chybě. Zkuste prosím načíst stránku znova.'); }
    });
}

/**
 * Loads videos list using YouTube API.
 */
function loadVideosYT() {
    var login = 'google';
    if (login) {
        var script = new Element('script', {'src':'http://gdata.youtube.com/feeds/users/'+login+'/uploads?alt=json-in-script&callback=renderVideosListYTAPI', 'type': 'text/javascript'});
        $('ender').insert({'after': script});
    }
}

/**
 * Loads list of videos from custom API
 */
function loadVideosAPI() {
//    var url = 'http://localhost:8080/list';
    var url = baseUrl+'/api/list.php';
    new Ajax.Request(url, {
        method: 'get',
        onSuccess: function(transport) { renderVideosListAPI(transport); },
        onFailure: function(transport) { alert('Při načítání seznamu videí došlo k neočekávané chybě. Zkuste prosím načíst stránku za chvíli znova.'); }
    });
}

/**
 * Renders list of videos by data from ContestPlatform API.
 */
function renderVideosListCPAPI(transport) {
    var dataEntries = eval( '(' + transport.responseText + ')');
    renderVideosListTable(dataEntries);
}

/**
 * Renders list of videos returned by YouTube JSON API itself.
 */
function renderVideosListYTAPI(data) {
    var dataEntries = data.feed.entry || [];
    renderVideosListList(dataEntries);
}

/**
 * Renders list of videos returned by custom API.
 */
function renderVideosListAPI(transport) {
    var tmp = eval( '(' + transport.responseText + ')');
    if (tmp.result == 'ok') {
        renderVideosListList(tmp.entries);
    } else {
        alert('Při načítání seznamu videí došlo k neočekávané chybě. Zkuste prosím načíst stránku za chvíli znova.');
    }
}


function formatDuration(dur) {
    var out = '';
    var sec = dur % 60;
    out += ((dur - sec) / 60) + ':' + (sec < 10 ? '0'+sec : sec);
    return out;
}

var listEntries;//currently listed entries
function renderVideosListList(dataEntries) {
    listEntries = [];
    var html = ['<table width="100%" cellspacing="0">'];
    var i = 0;
    for (i = 0; i < dataEntries.length; i++) {
//        var entry = createEntryYTplayer(dataEntries[i]);
        var entry = dataEntries[i];
            entry.thumbnail = 'http://i.ytimg.com/vi/'+entry.ytid+'/2.jpg';
        listEntries.push(entry);
        if (i != 0) {
            html.push('<tr class="spacer"><td colspan="2"></td></tr>');
        }
        html.push('<tr id="ventry-', i, '" class="item" onclick="playEntry(', i, ')">');

        html.push('<td valign="top"><img class="fl" src="', entry.thumbnail, '" width="70" /></td>');
        html.push('<td valign="top" align="left" width="100%">');
            html.push('<strong>', entry.title, '</strong><br />');
            html.push('autor: ', entry.author, '<br />');
            html.push('délka: ', formatDuration(entry.duration));
        html.push('</td>');

        html.push('</tr>');
    }

    html.push('</table>');
    document.getElementById('videos-list').innerHTML = html.join('');

    if (listEntries.length > 0) {
        playEntry(0);
    }
}
/**
 * Renders list of playable videos (similar to renderVideosPicker).
 */
function renderVideosListTable(dataEntries) {
    listEntries = [];
    var html = ['<table width="100%">'];
    var playIdx = -1;
    for (var i = 0; i < dataEntries.length; i++) {
        var entry = createEntryCPAPI(dataEntries[i]);
        if (entry) {
            // skiping invalid entries
            listEntries.push(entry);
            if (entry.ytid == playAfterLoading) {
                playIdx = i;
            }

            if (i % 3 == 0) {
                if (i == 0) {
                    html.push('</tr>');
                }
                html.push('<tr>');
            }

            html.push('<td width="252" class="vlist-cell" onclick="playEntry(', i, ');">');

            html.push('<div style="width: 122px; margin-right: 3px;" class="fl"><img src="', entry.thumbnail, '" /></div>');
            html.push('<div>');
                html.push('<strong>', entry.title, '</strong>');
            html.push('<br />autor: ', entry.author);
            html.push('<br />zobrazeno: ', entry.views, 'x');
//            html.push('<br />délka: ', entry.duration, 's');
            html.push('</div>');
        }
    }
    if (i % 3 == 0) {
        html.push('</tr>');
    } else {
        html.push('<td colspan="'+(3-(i%3))+'" class="vlist-cell dis"></td>');
    }
    html.push('</table>');

    if (playIdx > -1) {
        // if we've found video to be played after loading list, we'll play it right now
        playEntry(playIdx);
    }
    document.getElementById('box-list').innerHTML = html.join('');
}

var lastEntry = -1;
var playerInitialized = false;
/**
 * Plays video given by order in listEntries array (eg. array of currently listed videos).
 * (shows video player box instead of videos listing)
 */
function playEntry(idx) {
    if (lastEntry == idx) {
        return;
    }

    var oldVentryId = lastEntry;
    if (lastEntry >= 0) {
        $('ventry-'+lastEntry).removeClassName('selected');
        lastEntry = -1;
    }

    if (oldVentryId != idx) {
        var ventry = $('ventry-'+idx);
        if (ventry) {
            ventry.addClassName('selected');
            lastEntry = idx;
        }
    }

    var entry = listEntries[idx];

    if (!playerInitialized) {
        var params = { allowScriptAccess: "always" };
        var atts = { id: "yt_player" };
        swfobject.embedSWF("http://www.youtube.com/v/"+entry.ytid+"&enablejsapi=1",
                           "player-box", "380", "307", "8", null, null, params, atts);

//        var out = ['<div style="padding: 0; margin: 0; overflow: auto; ">'];
//        out.push('<h2>', entry.title,'</h2>');
//        out.push('<p>', entry.description,'</p><p>');
//        out.push('<strong>autor:</strong> ', entry.author);
//        out.push('<br /><strong>zobrazeno:</strong> ', entry.views,'x');
//    //    out.push('<br />délka: ',entry.duration,'s');
//        out.push('</p></div>');
//        $('video-info').innerHTML = out.join('');
        playerInitialized = true;
    } else {
        $('yt_player').loadVideoById(entry.ytid);
    }
}

/**
 * Hides video player box and shows video listing box instead.
 */
function showVideoList() {
    ytplayer = null;
    $('player-box-holder').innerHTML = '<div class="player-box-holder-content"><div id="player-box">K přehrání videa z YouTube musíte mít nainstalován Flash plugin ve verzi 8 (a více).</div></div>';
    $('box-player').hide();
    $('box-list').show();
}