var jsonVideoList = null; // complete JSON video list
var jsonVideoFilter = null; // filtered JSON video list (used for UI)
var categories = [];
var player_visible = false;

/***************************************************************
 * EVENTS
 ***************************************************************/
function lsCategory_Change(event) {
    updateSelectBoxes();
    updateFilter();
}

function lsSubcategory_Change(event) {
    updateFilter();
}

function lsOrderby_Change(event) {
    updateFilter();
}

/***************************************************************
 * METHODS
 ***************************************************************/
function initVideoList(yt_username, q) {
        $.support.cors = true; // IE cross-site requests...
        $.ajax({
        "url":"http://gdata.youtube.com/feeds/api/users/"+yt_username+"/uploads?v=2&alt=jsonc&callback=?",
        "dataType": "json",
        "error":function(xhr, status, errorThrown) {
                alert(errorThrown+'\n'+status+'\n'+xhr.statusText);
        },
        "success": function(response) {
            jsonVideoList = [];
            var items = response.data.items;
            var sz = items.length;
            var api_v = null;
            for (var i=0; i<sz; i++) {
                api_v = items[i];
                
                // queries..
                var consider = true;
                if (q != null && q != "") {
                    consider = false;
                    var j=0;
                    while (j<api_v.tags.length && !consider) {
                        if (api_v.tags[j].toLowerCase().killAccents().indexOf(q.toLowerCase().killAccents())>-1) {
                            consider = true;
                        }
                        j++;
                    }
                }
                
                if (consider && api_v.tags.length >= 4 && api_v.tags[0].toLowerCase() == "grafixels" && api_v.tags[1].toLowerCase() == "studio") {
                    var cat = api_v.tags[2];
                    var subcat = api_v.tags[3];
                    if (api_v.tags.length > 4) {
                        var j=4;
                        var maj = true;
                        while (api_v.tags.length > j && maj) {
                            var charSubcat = api_v.tags[j].charAt(0);
                            if (charSubcat == charSubcat.toUpperCase() && (charSubcat<'0'||charSubcat>'9')) {
                                subcat += " "+api_v.tags[j];
                            } else {
                                maj = false;
                            }
                            j++;
                        }
                    }
                    jsonVideoList.push({
                        "id": api_v.id,
                        "thumbnail": api_v.thumbnail.sqDefault,
                        "category": cat,
                        "subcategory": subcat,
                        "title": api_v.title,
                        "uploaded": api_v.uploaded.split("T")[0],
                        "duration": api_v.duration,
                        "views": api_v.viewCount
                    });
                
                    if (category_index(cat) < 0) {
                        categories.push({
                            "name": cat,
                            "subcategories": []
                        });
                    }
                    if (subcategory_index(cat, subcat) < 0) {
                        categories[category_index(cat)].subcategories.push(subcat);
                    }
                }
            }
            
            updateSelectBoxes();
            updateFilter();
        }
    });
}

function updateFilter() {
    var c = _e("lsCategory").selectedValue();
    var s = _e("lsSubcategory").selectedValue();
    var o = _e("lsOrderby").selectedValue();
    applyFilter(c,s,o);
}

function applyFilter(cat, subcat, orderby) {
    jsonVideoFilter = [];
    if (cat != null && cat != "*") {
        var v = null;
        for (var i=0; i<jsonVideoList.length; i++) {
            v = jsonVideoList[i];
            if (v.category == cat) {
                jsonVideoFilter.push(v);
            }
        }
        if (subcat != null && subcat != "" && subcat != "--" && subcat != "*") {
            var tmp = [];
            var v = null;
            for (var i=0; i<jsonVideoFilter.length; i++) {
                v = jsonVideoFilter[i];
                if (v.subcategory == subcat) {
                    tmp.push(v);
                }
            }
            jsonVideoFilter = [];
            for (var i=0; i<tmp.length; i++) {
                v = tmp[i];
                jsonVideoFilter.push(v);
            }
        }
    } else {
        var v = null;
        for (var i=0; i<jsonVideoList.length; i++) {
            v = jsonVideoList[i];
            jsonVideoFilter.push(v);
        }
    }
    
    if (orderby != null) {
        try {
            jsonVideoFilter = jsonVideoFilter.sort(function(a,b) {
                switch(orderby) {
                    case "title":
                        return ((a.title > b.title) ? 1 : -1);
                        break;
                    case "category":
                        return ((a.category > b.category) ? 1 : -1);
                        break;
                    case "subcategory":
                        return ((a.subcategory > b.subcategory) ? 1 : -1);
                        break;
                    case "uploaded":
                        return ((a.uploaded < b.uploaded) ? 1 : -1);
                        break;
                    case "duration":
                        return ((a.duration > b.duration) ? 1 : -1);
                        break;
                    case "views":
                        return (parseInt(a.views) - parseInt(b.views));
                        break;
                }
            });
        } catch(e) {
            // For IE's self confidence... should not go there
        }
    }
    
    var html_content = [];
    var v = null;
    for (var i=0; i<jsonVideoFilter.length; i++) {
        v = jsonVideoFilter[i];
        html_content.push([
            '<li>',
                '<a href="#video-loc" onclick="playVideo(\'',v.id,'\')">',
                '<p class="tn"><img src="',v.thumbnail,'" /></p>',
                "<p class='classify'>",v.category," - ",v.subcategory,"</p>", // " " to prevent crash with names containing '
                "<p class='title'>",v.title,"</p>", // idem
                '<p class="details">Ajout&eacute; le ',v.uploaded,'</p>',
                '<p class="details">',v.duration/60>>0,':',v.duration%60,v.duration%60<10?"0":"",' | ',v.views,' vues</p>',
                '</a>',
            '</li>'
        ].join(""));
    }
    _e("ol-video-list").innerHTML = html_content.join("");
}

function updateSelectBoxes() {
    if (_e("lsCategory").innerHTML == "") { // only need to update categories once
        try {
            categories = categories.sort(function(a,b) {
                return ((a.name > b.name) ? 1 : -1);
            });
        } catch(e) {
            // For IE's self confidence
        }
        _e("lsCategory").clear();
        _e("lsCategory").addOption("*", "Catégorie -- Tous");
        var cat = null;
        for (var i=0; i<categories.length; i++) {
            cat = categories[i].name;
            _e("lsCategory").addOption(cat, "Catégorie -- "+cat);

        }
        _e("lsCategory").selectedIndex = 0; // selectedIndex is 0 by default
    }
    if (_e("lsCategory").selectedValue() != null && _e("lsCategory").selectedIndex != 0) { // if all categories are selected, cannot select a subcategory
        var category = categories[_e("lsCategory").selectedIndex-1]; // -1 'cause first option is '*'
        var subcategories = category.subcategories;
        try {
            category.subcategories = subcategories.sort(function(a,b){
                (a.name > b.name) ? 1 : -1;
            });
        } catch(e) {
            // For IE's self confidence
        }
        _e("lsSubcategory").clear();
        _e("lsSubcategory").addOption("*", "Sous-catégorie -- Tous");
        var subcat = null;
        for (var i=0; i<subcategories.length; i++) {
            subcat = subcategories[i];
            _e("lsSubcategory").addOption(subcat, "Sous-catégorie -- "+subcat);
        }
    } else {
        _e("lsSubcategory").clear();
        _e("lsSubcategory").addOption("*", "Sous-catégorie -- Tous");
        _e("lsSubcategory").selectedIndex = 0; // all subcategories selected by default if all categories are selected
    }
}

function playVideo(id) {
    var YT_PLAYER_WIDTH = "800px";
    var YT_PLAYER_HEIGHT = "454px";
    var YT_PLAYER_API_PARAMS = [
        "hd=1",
        "version=3",
        "autoplay=1",
        "autohide=1",
        "fs=1",
        "showinfo=1",
        "rel=0",
        "enablejsapi=1"
    ];
    
    _e("video-play-zone").style.display = "";
    _e("vid").style.display = "";
    player_visible = true;
    
    var videoUrl = ["http://www.youtube.com/e/",id,"?",YT_PLAYER_API_PARAMS.join("&")].join("");
    _e("vid").innerHTML = [
        "<object width='",YT_PLAYER_WIDTH,"' height='",YT_PLAYER_HEIGHT,"'>",
        "   <param name='movie' value='",videoUrl,"'></param>",
        "   <param name='allowFullScreen' value='true'></param>",
        "   <param name='allowScriptAccess' value='always'></param>",
        "   <embed id='ytplayer' src='",videoUrl,"' ",
        "       type='application/x-shockwave-flash' ",
        "       allowfullscreen='true' ",
        "       allowscriptaccess='always' ",
        "       width='",YT_PLAYER_WIDTH,"' height='",YT_PLAYER_HEIGHT,"'>",
        "   </embed>",
        "</object>"
    ].join("");
}

function showHidePlayer() {
    _e("vid").style.display = player_visible ? "none" : "";
    player_visible = !player_visible;
}

/***************************************************************
 * UTILS
 ***************************************************************/
function category_index(cat) {
    var i=0;
    while (i<categories.length) {
        if (categories[i].name == cat) {
            return i;
        }
        i++;
    }
    return -1;
}

function subcategory_index(cat, subcat) {
    var cat_index = category_index(cat);
    if (cat_index > -1) {
        var subcategories = categories[cat_index].subcategories;
        var i=0;
        while (i<subcategories.length) {
            if (subcategories[i] == subcat) {
                return i;
            }
            i++;
        }
        return -1;
    }
    return -1;
}

