// ==UserScript==
// @name           Smpl Nico Player Controller
// @author         noriaki
// @namespace      http://blog.fulltext-search.biz
// @description    Control NicoNicoPlayer Sample
// @license        MIT License
// @version        0.1.0
// @released       2008-08-24 12:00:00
// @updated        2008-08-24 12:40:00
// @compatible     Greasemonkey-0.8.20080609.0
// @include        http://www.nicovideo.jp/watch/*
// @require        http://svn.coderepos.org/share/lang/javascript/userscripts/GM_Libs/noriaki/NicoNicoPlayerWrapper/NNPW-20080824.1.js
// ==/UserScript==

var $ = document.getElementById;
var player = new NicoNicoPlayer();
player.onReady(main);

function main(videoinfo) {
    var player = this;
    buildButtons();
    $('gm_nicontroller_start').addEventListener('click', function(e) {
        player.start();
    }, false);
    $('gm_nicontroller_stop').addEventListener('click', function(e) {
        player.stop();
    }, false);
    $('gm_nicontroller_pause').addEventListener('click', function(e) {
        player.togglePause();
    }, false);
    $('gm_nicontroller_seek+10').addEventListener('click', function(e) {
        player.seek(player.seek() + 10);
    }, false);
    $('gm_nicontroller_seek-10').addEventListener('click', function(e) {
        player.seek(player.seek() - 10);
    }, false);
    $('gm_nicontroller_mute').addEventListener('click', function(e) {
        player.toggleMute();
    }, false);
    $('gm_nicontroller_volume+').addEventListener('click', function(e) {
        player.volume(player.volume() + 10);
    }, false);
    $('gm_nicontroller_volume-').addEventListener('click', function(e) {
        player.volume(player.volume() - 10);
    }, false);
    $('gm_nicontroller_toggle_comment').addEventListener('click', function(e) {
        player.toggleCommentVisible();
    }, false);
    $('gm_nicontroller_toggle_repeat').addEventListener('click', function(e) {
        player.toggleRepeat();
    }, false);
    $('gm_nicontroller_toggle_fullscreen').addEventListener('click', function(e) {
        player.toggleFullscreen();
    }, false);
}

function buildButtons() {
    var list = [
        ['start', '最初から再生(start)'],
        ['stop', '停止(stop)'],
        ['pause', '一時停止/再生(pause/play)'],
        ['seek+10', '10秒進める'],
        ['seek-10', '10秒戻す'],
        ['mute', 'ミュート(on/off)'],
        ['volume+', 'ボリュームを上げる'],
        ['volume-', 'ボリュームを下げる'],
        ['toggle_comment', 'コメント表示(on/off)'],
        ['toggle_repeat', 'リピート(on/off)'],
        ['toggle_fullscreen', '全画面表示(on/off)']
    ];
    var d = $N('div', {
            id: 'gm_nicontroller'
    }, map(list, function(val, i) {
        return $N('input', {
            id: 'gm_nicontroller_' + val[0],
            type: 'button',
            'class': 'submit',
            value: val[1]
        });
    }));
    $('WATCHFOOTER').parentNode.insertBefore(d, $('WATCHFOOTER'));

    function map(elems, callback) {
        var ret = [];
        for(var i=0,l=elems.length; i<l; i++) {
            var value = callback(elems[i], i);
            if(value !== null && value != undefined) {
                if(value.constructor != Array) value = [value];
                ret = ret.concat(value);
            }
        }
        return ret;
    }
}

GM_addStyle(<><![CDATA[
    #gm_nicontroller input.submit {
        margin: 0 3px;
    }
]]></>);

function $N(name, attr, childs) {
    var ret = document.createElement(name);
    for(k in attr) {
        if(!attr.hasOwnProperty(k)) continue;
        if(k == "class") {
            ret.className = attr[k];
        } else if(k == "style" && typeof(attr[k]) == "object") {
            for(j in attr[k]) ret.style[j] = attr[k][j];
        } else {
            ret.setAttribute(k, attr[k]);
        }
    }
    switch(typeof childs) {
    case "string": {
        ret.appendChild(document.createTextNode(childs));
        break;
    }
    case "object": {
        for(var i=0,len=childs.length; i<len; i++) {
            var child = childs[i];
            if(typeof child == "string") {
                ret.appendChild(document.createTextNode(child));
            } else {
                ret.appendChild(child);
            }
        }
        break;
    }
    }
    return ret;
}





