//==UserScript==
//@name ldr_qt_player
//@namespace http://zeroglab.jp.land.to/
//@include http://reader.livedoor.com/reader/
//@version 0.0.4
//==/UserScript==

(function(){
    /*
     * var init
     */

    var mp3data = [];
    var setindex = 0;

	var w = unsafeWindow;

    /*
     * html init
     */

    var controlUl = document.getElementById('control_buttons_ul');
    var playerbox = document.createElement('li');
    playerbox.setAttribute('id','playerbox');
    playerbox.setAttribute('class','button');
    controlUl.appendChild(playerbox);

    var player = document.createElement('embed');
    player.setAttribute('id','player');
    player.setAttribute('type','audio/mp3');
    player.setAttribute('enablejavascript','true');
    player.setAttribute('autostart','true');
    player.setAttribute('width','150px');
    player.setAttribute('height','22px');
    player.style.display = 'block';
    playerbox.appendChild(player);
    
    var control = document.getElementById('control');

    var listbox = document.createElement('div');
    listbox.setAttribute('id','listbox');

    var h4txt = ['Play List','Record List'];
    var idtxt = ['playlist','recordlist'];

    for(var i=0; i<2; i++){
        var h4 = document.createElement('h4');
        h4.innerHTML = h4txt[i];
        listbox.appendChild(h4);

        var ol = document.createElement('ol');
        ol.setAttribute('id',idtxt[i]);
        listbox.appendChild(ol);
    }

    control.appendChild(listbox);

    /*
     * style
     */

    w.LDR_addStyle('#playerbox',
    'margin: 0; padding: 0 5px; position: relative; height: 100%; border-bottom: 2px solid #a5c5ff;'
    );

    w.LDR_addStyle('#listbox',
    'margin: .5em 0 0 0; padding: .7em .5em; position: absolute; top: 27px; right: 5%;'+
    'z-index: 10; display: none; overflow: auto; max-width: 340px; max-height: 400px;'+
    'color: #000000; background: #f8f8f8; border: 2px solid #0098d8; font-size: 90%;'+
    'outline: 2px solid #ffffff; -moz-opacity: .9;'
    );

    w.LDR_addStyle('#listbox h4','color: #0088c8; border-bottom: 1px solid #0098d8;');

    w.LDR_addStyle('#playlist',
    'margin: .5em 0 1.5em; padding: 0; list-style-type: none;'
    );

    w.LDR_addStyle('#playlist li',
    'margin: .5em 0; padding: .5em; display: inline; font-weight: bold; border-right: 1px dashed #cccccc;'
    );

    w.LDR_addStyle('#recordlist',
    'margin: .5em 0 1.5em; padding: 0; list-style-type: none; counter-reset: record;'
    );

    w.LDR_addStyle('#recordlist li',
    'margin: .5em 0; padding: .5em 1em .5em .5em; font-weight: bold; border-bottom: 1px dashed #cccccc;'
    );

    w.LDR_addStyle('#recordlist li span','font-weight: normal;');

    w.LDR_addStyle('#recordlist li:before','content: counter(record) ; counter-increment: record;');

    /*
     * toggle listbox 
     */

    document.addEventListener('keyup',function(){
        var vi = document.getElementById('vi');

        document.getElementById('listbox').style.display =
        (!vi)  ? 'none' :
        (vi.value.indexOf(':play') != -1)  ? 'block' :
        (vi.value.indexOf(':add') != -1)  ? 'block' :
        'none';
    },false);

    /*
     * qt function
     */

    var p = w.$('player');
    var qt = {
        Play: function (){
            p.Play();
        },
        Stop: function(){
            p.Stop();
        },
        SetURL: function(url){
            p.SetURL(url);
        },
        GetQTNEXTUrl: function(index){
            return p.GetQTNEXTUrl(index);
        },
        SetQTNEXTUrl: function(index,url){
            p.SetQTNEXTUrl(index,url);
        },
        GetVolume: function(){
            return p.GetVolume();
        },
        SetVolume: function(v){
            p.SetVolume(v);
        },
        GetRate: function(){
            return p.GetRate();
        },
        Step: function(count){
            p.Step(count);
        }
    };

    /*
     * function
     */

    function listUpEntry(itemId){
        var list = [];
        var itemBody = document.getElementById('item_body_' + itemId);
        var anchors = itemBody.getElementsByTagName('a');
        var anchorsLen = anchors.length;

        for(var i=0; i<anchorsLen; i++){
            var a = anchors[i];
            var href = a.getAttribute('href');
            if(!href) continue;
            if(href.match(/.*\.mp3$/i)){
                list[list.length] = href;
            }
        }

        list.txt = (mp3data.length + 1) + '(' + list.length + '\u66f2)';

        return list;
    }

    function listUpData(args){
        var list = [];
        var argstxt = [];
        var argsLen = args.length;

        for(var i=0; i<argsLen; i++){
            if(args[i].indexOf('-') != -1){
                if(!mp3data['track' + args[i]]) continue;
                var track = mp3data['track' + args[i]].mp3;
                list[list.length] = track; 
            }else{
                if(!mp3data[args[i] - 1]) continue;
                var record = mp3data[args[i] - 1].mp3;
                var recordLen = record.length;

                for(var j=0; j<recordLen; j++){
                    list[list.length] = record[j];
                }

                args[i] += '(' + list.length + '\u66f2)';
            }
            argstxt[argstxt.length] = args[i];
        }

        list.txt = argstxt.join(', ');

        return list;
    }

    function setPlaylist(listTxt,clear){
        var playlist = document.getElementById('playlist');
        if(clear) playlist.innerHTML = '';

        var li = document.createElement('li');
        li.innerHTML = listTxt;
        playlist.appendChild(li);
    }

    function setFile(list){

        for(var i=0; i<list.length; i++){
            if(setindex==0){
                qt.SetURL(list[0]);
            }else{
                var url = '<' + list[i] + '>T<myself>';
                qt.SetQTNEXTUrl(setindex,url);
            }
            setindex ++;
        }

        qt.SetQTNEXTUrl(setindex,'javascript:document.getElementById("player").Stop();');
    }

    function inputData(item,list,listLen){
        var itemId = item.item_id;

        var objRecord = {title: item.title, num: listLen, mp3: list};
        mp3data['record' + itemId] = mp3data[mp3data.length] = objRecord;

        var recordlist = document.getElementById('recordlist');
        var recordlistLi = document.createElement('li');
        recordlistLi.innerHTML = '(' + mp3data['record' + itemId].num + '\u66f2) ' +
            '<span>' + mp3data['record' + itemId].title + '</span>';
        recordlist.appendChild(recordlistLi);

        for(var i=0; i<listLen; i++){
            mp3data['track' + mp3data.length + '-' + (i+1)] = {mp3: list[i]};
        }

        w.LDR_addStyle('#item_' + itemId,'background: #e0ffff;');
        w.LDR_addStyle('#item_' + itemId + ' div.item_info:after',
            'content: " | :play '+ mp3data.length +'('+ listLen +'\u66f2)";');
    }

    function main(args,item,clear,resTxt){
        var argsLen = args.length;
        var itemId = item.item_id;
        var list = (!argsLen && !mp3data['record'+itemId]) ? listUpEntry(itemId) :
                   (!argsLen) ? mp3data['record'+itemId].mp3 :
                   listUpData(args);
        var listLen = list.length;
        var listTxt = list.txt;

        var res = (!listLen) ? 'mp3\u30d5\u30a1\u30a4\u30eb\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093\u3067\u3057\u305f' :
                  (!mp3data['record' + itemId]) ? listLen + '\u500b\u306emp3\u304c\u898b\u3064\u304b\u308a\u307e\u3057\u305f' :
                  listLen + resTxt + listTxt;
        w.message(res);

        if(!listLen) return;

        if(!argsLen && !mp3data['record' + itemId]) inputData(item,list,listLen);

        setPlaylist(listTxt,clear);

        if(clear) setindex = 0;
        setFile(list);

        document.getElementById('listbox').style.display = 'block';
    }

    /*
     * command
     */

    w.register_command('play',function(){
        var args = arguments;
        var item = w.get_active_item(true);
        if(!item) return;

        var clear = true;
        var resTxt = '\u500b\u306emp3\u3092\u518d\u751f\u3057\u307e\u3059 ';

        main(args,item,clear,resTxt);
    });

    w.register_command('add',function(){
        var args = arguments;
        var item = w.get_active_item(true);
        if(!item) return;

        var clear = false;
        var resTxt = '\u500b\u306emp3\u3092\u30d7\u30ec\u30a4\u30ea\u30b9\u30c8\u306b\u8ffd\u52a0\u3057\u307e\u3057\u305f ';

        main(args,item,clear,resTxt);
    });

    w.register_command('pause',function(){
        var rate = qt.GetRate();

        if(rate != 0){
            qt.Stop();
            var res = '\u4e00\u6642\u505c\u6b62\u3057\u307e\u3057\u305f (:pause\u3067\u518d\u958b)';
        }else{
            qt.Play();
            var res = '\u518d\u751f\u3057\u307e\u3059';
        }

        w.message(res);
    });

    w.register_command('vol',function(volume){
        if(volume){
            var v = (volume == 'max' || volume > 255) ? 255 :
                    (volume == 'half') ? 128 :
                    (volume == 'min' || volume == 'mute') ? 0 :
                    volume;
            qt.SetVolume(v);
        }

        var res = '\u73fe\u5728\u306e\u97f3\u91cf\u306f ' + qt.GetVolume() + '/255 \u3067\u3059';
        w.message(res);
    });

    w.register_command('rate',function(){
        var rate = qt.GetRate();
        w.message('rate: ' + rate);
    });

    w.register_command('step',function(count){
        count = (!count) ? 60 : count;
        qt.Step(count);
        w.message('step: ' + count);
        qt.Play();
    });
})();

