// 
// @name marquee.js
// @author miya2000
// @namespace http://d.hatena.ne.jp/miya2000/
// @version 1.0.0
// 


var loopflg = 0;
var loopEnd = -200;
var Marquee = function ( id, opt ){
    if( ! document.getElementById(id) ) throw 'invalid id. [' + id + ']';
    var option = opt || {};
    this.id     = id;
    this.top = 0;
    this.amount = option.amount || 10;
    this.delay  = option.delay  || 100;
    this.position = Number.POSITIVE_INFINITY; // means out of range.
    this._wrap();
    this.start();
}

Marquee.prototype = {
    /* wrap child nodes */
    _wrap : function() {
        var t = document.getElementById( this.id );
        with ( t.style ){
            position = 'relative'; // for ie6.
            overflow = 'hidden';
        }
        var w = document.createElement( 'div' );
        with ( w.style ){
            margin     = '0';
            padding    = '0';
            background = 'transparent';
            border     = 'none';
        }
        t.normalize();
        while( t.firstChild ){
            w.appendChild( t.removeChild( t.firstChild ) );
        }
        t.appendChild(w);
        /* get minimum width. */
        w.style.position = 'absolute';
        this.minWidth = w.offsetWidth;
        /* put back */
        w.style.position = 'relative';
        w.style.width = '100%'; // for ie6.
    }
    , start : function() {
        this.stop();
        this._next();
    }
    , _next : function() {
        var t = document.getElementById( this.id );
        this.curWidth = Math.min(t.offsetWidth,t.parentNode.offsetWidth); // dirty. (for "overflow:hidden" parent)
        this.position = this.position - this.amount;
        if ( this._isOutOfRange() ) {
            this.position = this._startPosition();
        }
        var w = t.firstChild;
        w.style.left = this.position + 'px';
        var self = this;
		if (this.position == 0){
			JSSleep(2);
			loopflg = 1;
			this.amount = this.amount * 15;
		}

		if (this.position >= 850){
			this.top = this.top + (-25);
			if (this.top < loopEnd){
				this.top = -25;
			}
			w.style.top = this.top + 'px';
			if (loopflg == 1){
				this.amount = this.amount / 15;
			}
		}

        this.tid = window.setTimeout(
            function(){ self._next(); },
            this.delay
        );
    }
    , _startPosition : function() {
        return ( this.amount > 0 ) ?  this.curWidth
                                   : -this.minWidth;
    }
    , _isOutOfRange : function() {
        return this.position < -this.minWidth || this.curWidth < this.position;
    }
    , stop : function() {
        if ( this.tid ) window.clearTimeout( this.tid );
        this.tid = null;
    }
    , isMarqueeing : function() {
        return ( this.tid ) ? true : false;
    }
}

function JSSleep(sec) {
var start = new Date;
while (1) {
var cur = new Date;
if (sec * 1000 <= cur.getTime() - start.getTime()) {
break;
}
}
}


