// JavaScript Document
/***************************************************************
*【概要】
* クラス属性が mq〜 で指定されたタグを検索し滑らかにマーキー
* （ HTML 側はクラス属性の指定のみでＯＫ）
*【パラメータ（各々任意指定）】
* _d : 移動方向（top, bottom, right, left）指定のない場合 left
* _s : スピード（ 1 〜 5 ）指定のない場合 4 。5 が速い。
* _w : 動作範囲の幅を指定（ px ）
* _h : 動作範囲の高さを指定（ px ）
* _z : ？？
*【使用例】
* <em class="mqMessage_dtop_s2_z">メッセージ</em>
*【情報】
* 2008.01 created by 6lOezfNBvA＆ai＆jax_6＠TAG_INDEX
*
* ※ 下記の場合には「音楽と環境問題（http://otk.zatunen.com）」から引用したことを明記して下さい。
* ・ソース本体を利用する際。
* ・ html 側の属性でスクリプトの引数を持つアイデアをこのソースを見て使用する場合。
*　　　　　☆ あとはご自由にどうぞ ☆
***************************************************************/
WINDOWONLOAD();

function WINDOWONLOAD(){
    if(!document.body){
        setTimeout(WINDOWONLOAD,100);
    }else{
        setTimeout(function(){
            pickup();
        },50);
    }
}

function pickup(){
    var dir,speed,tim,ran,wid,hei,z;
    var speedTable = new Array();
    var seiki = /(?:(?:^mq)|(?:.*? mq))(.*)/i;
    var seiki_d = /.*(_d(?:top|bottom|right|left)).*/i;
    var seiki_s = /.*(_s[1-5]).*/i;
    var seiki_w = /.*(_w[0-9\.]{1,4}).*/i;
    var seiki_h = /.*(_h[0-9\.]{1,4}).*/i;
    var seiki_z = /.*(_z).*/i; //隠しコマンド（ポコポコする。縦だとウネウネ。）
    
    // [ tim:刻み時間, ran:一度に動くpx ]
    speedTable[1] = [55, 1];
    speedTable[2] = [35, 1];
    speedTable[3] = [20, 1];
    speedTable[4] = [10, 1];
    speedTable[5] = [10, 2];

    // class が mq 〜 で指定してあるタグを先頭から探し、発見次第 mq() を発動
    var mqElements = document.body.getElementsByTagName('*');
    var I = mqElements.length;
    // IE で (!document.body) をすり抜けた場合ここでかかる
    if(mqElements[I-1].tagName=='SCRIPT'){WINDOWONLOAD();return;}
    
    for(var i=0 ; i<I ; i++){
        if(mqclass=mqElements[i].className){
            if(args = mqclass.match(seiki)){
                //デフォルト値の設定
                dir = 'left';
                speed = 4;
                wid = -1;
                hei = -1;
                z = false;
                
                if(arg_d = args[1].match(seiki_d)) dir=arg_d[1].substring(2,arg_d[1].length);
                
                if(arg_s = args[1].match(seiki_s)){
                    speed = arg_s[1].substring(2,arg_s[1].length);
                }
                tim = speedTable[speed][0];
                ran = speedTable[speed][1];
                
                if(arg_w = args[1].match(seiki_w)) wid=arg_w[1].substring(2,arg_w[1].length)*1;
                
                if(arg_h = args[1].match(seiki_h)) hei=arg_h[1].substring(2,arg_h[1].length)*1;
                
                if(arg_z = args[1].match(seiki_z)) z=true;
                
                mq(mqElements[i],dir,tim,ran,wid,hei,z);

                i++; //注：mqElementsに追加されてずれるのでここでiとIを調整しておく
                I++;
            }
        }
    }
}

function zz(inX){ // パラメータ Z 計算用
    var outY = -parseInt((Math.abs((inX*2+10)%40-20)-12)/3.5) + "px";
    return outY;
}

function mq(mqC, d, t, r, w, h, z) {
// mqC：文字を流す箇所のnode
// d：流す方向（"top" or "bottom" or "right" or "left"）
// t：刻み時間
// r: 一度に動く距離
// w：アニメーションする横幅
// h：アニメーションする縦幅
// z: ？？（ブーリアン）

    var sv_mqC = mqC;
    var mqP;
    var mqCoffsetH;
    var mqCoffsetW;
    var wid;
    var hei;
    
    //後で親にするためのクローンを作成。画像だったらスタイルをコピーしたDIVを親にする。
    if(mqC.tagName!='IMG'){
        mqP = mqC.cloneNode(false);
    }else{
        mqP = document.createElement('div');
        //スタイル要素で指定されている場合の対策として id と class を移動（ img に指定された場合は諦める）
        mqP.id = mqC.id;
        mqP.className = mqC.className;
        mqC.removeAttribute('id');
        mqC.removeAttribute('class');
        mqP.style.cssText = sv_mqC.style.cssText;
        mqC.style.cssText = ""; //子のスタイルは消す
    }
    
    //囲む前にもともとインラインで指定されている可能性を考慮
    mqP.style.display='block';
    
    //作った mqP で外側を囲む（動作範囲）
    try{
        /*@cc_on
        @if(@_jscript)
            mqC.applyElement(mqP,'outside');
        @else*/
             var ran = document.createRange();
         ran.selectNode(mqC);
         ran.surroundContents(mqP);
         mqC = mqP.firstChild; //mqCを再取得
        //@end
    }catch(err){
        try{
            mqP.appendChild(mqC.cloneNode(true));
            mqC.parentNode.replaceChild(mqP, mqC);
            mqC = mqP.firstChild; //mqCを再取得
        }catch(err){
            alert(sv_mqC.tagName + " を動かすのは我慢して下さい。");
        }
    }
    
    //IMG 以外は mqC を div に変えておく。
    if(mqC.tagName!='IMG'){
        mqP.replaceChild(document.createElement('div'),mqC);
        mqC = mqP.firstChild;
        mqCC = sv_mqC.childNodes;
        for(var i=0, I=mqCC.length; i<I; i++){
            mqC.appendChild(mqCC[i].cloneNode(true));
        }
        mqC.width = sv_mqC.width;
        mqC.height = sv_mqC.height;
        /*@if(@_jscript)
            mqC.style.width = sv_mqC.currentStyle.width;
            mqC.style.height = sv_mqC.currentStyle.height;
        @else*/
            mqC.style.width = document.defaultView.getComputedStyle(sv_mqC, null).width;
            mqC.style.height = document.defaultView.getComputedStyle(sv_mqC, null).height;
        //@end
    }

    /*@if(@_jscript)
    if(mqP.currentStyle.position!='absolute'){
    @else*/
    if(document.defaultView.getComputedStyle(mqP, null).position!='absolute'){
    //@end
        mqP.style.position = 'relative';
    }
    
    mqP.style.overflow = 'hidden';

    mqC.style.position = 'absolute';
    mqC.style.whiteSpace = 'nowrap';
    
    mqCoffsetH = mqC.offsetHeight;
    mqCoffsetW = mqC.offsetWidth;

    if(w==-1){wid = mqCoffsetW}else{wid = w;}
    if(h==-1){hei = mqCoffsetH}else{hei = h;}
    mqP.style.width = wid + 'px';
    mqP.style.height = hei + 'px';    

    var counter = 0;
    var mqArray = new Array();
    var mqArrayZ = new Array();
    var mqArray_length = 0;
    
    switch(d){
        case 'top':
            //まず初期配置に。
            counter= -1 * mqCoffsetH;
            mqC.style.bottom = counter + 'px';
            if(!z){
                //移動先のリストを予め作成しておく。
                for(var i=0 ; counter<hei ; counter+=r, i++){
                    mqArray[i] = counter + 'px';
                }
                counter = 0; //submq のカウンターとして再利用する。
                mqArray_length = mqArray.length; //ループの外で計算しておく。
                var submq = function(){
                    mqC.style.bottom = mqArray[counter++];
                    if(counter >= mqArray_length)counter=0;
                }
            }else{
                //移動先のリストを予め作成しておく。
                for(var i=0 ; counter<hei ; counter+=r, i++){
                    mqArray[i] = counter + 'px';
                    mqArrayZ[i] = zz(i);
                }
                counter = 0;
                mqArray_length = mqArray.length;
                var submq = function(){
                    mqC.style.bottom = mqArray[counter];
                    mqC.style.left = mqArrayZ[counter];
                    counter++;
                    if(counter >= mqArray_length)counter=0;
                }
            }
            break;
        case 'bottom':
            counter= -1 * mqCoffsetH;
            mqC.style.top = counter + 'px';
            if(!z){
                for(var i=0 ; counter<hei ; counter+=r, i++){
                    mqArray[i] = counter + 'px';
                }
                counter = 0;
                mqArray_length = mqArray.length;
                var submq = function(){
                    mqC.style.top = mqArray[counter++];
                    if(counter >= mqArray_length)counter=0;
                }
            }else{
                for(var i=0 ; counter<hei ; counter+=r, i++){
                    mqArray[i] = counter + 'px';
                    mqArrayZ[i] = zz(i);
                }
                counter = 0;
                mqArray_length = mqArray.length;
                var submq = function(){
                    mqC.style.top = mqArray[counter];
                    mqC.style.left = mqArrayZ[counter];
                    counter++;
                    if(counter >= mqArray_length)counter=0;
                }
            }
            break;
        case 'right':
            counter= -1 * mqCoffsetW;
            mqC.style.left = counter + 'px';
            if(!z){
                for(var i=0 ; counter<wid ; counter+=r, i++){
                    mqArray[i] = counter + 'px';
                }
                counter = 0;
                mqArray_length = mqArray.length;
                var submq = function(){
                    mqC.style.left = mqArray[counter++];
                    if(counter >= mqArray_length)counter=0;
                }
            }else{
                for(var i=0 ; counter<wid ; counter+=r, i++){
                    mqArray[i] = counter + 'px';
                    mqArrayZ[i] = zz(i);
                }
                counter = 0;
                mqArray_length = mqArray.length;
                var submq = function(){
                    mqC.style.left = mqArray[counter];
                    mqC.style.top = mqArrayZ[counter];
                    counter++;
                    if(counter >= mqArray_length)counter=0;
                }
            }
            break;
        default: // left
            counter= -1 * mqCoffsetW;
            mqC.style.right = counter + 'px';
            if(!z){
                for(var i=0 ; counter<wid ; counter+=r, i++){
                    mqArray[i] = counter + 'px';
                }
                counter = 0;
                mqArray_length = mqArray.length;
                var submq = function(){
                    mqC.style.right = mqArray[counter++];
                    if(counter >= mqArray_length)counter=0;
                }
            }else{
                for(var i=0 ; counter<wid ; counter+=r, i++){
                    mqArray[i] = counter + 'px';
                    mqArrayZ[i] = zz(i);
                }
                counter = 0;
                mqArray_length = mqArray.length;
                var submq = function(){
                    mqC.style.right = mqArray[counter];
                    mqC.style.top = mqArrayZ[counter];
                    counter++;
                    if(counter >= mqArray_length)counter=0;
                }
            }
            break;
    }
    setInterval(submq, t);
    
    //参照を切っておく
    mqCoffsetH = null;
    mqCoffsetW = null;
    wid = null;
    hei = null;
    sv_mqC = null;
    mqP = null;
}
