/* common */

/* 
 * Image Loader
 */


var ImageLoader = function(id, url, s){
	var elm = document.getElementById(id);
	if (elm){
		this.elm = elm;
		this.url = url;
		if (s > 0) this.interval = s;
		var target = this;
		this.timer = setInterval(
				function(){
					target.start();
				}, this.interval);
		this.start();
	}
}

ImageLoader.prototype = {
	elm : null,
	url : null,
	num : 0,
	interval : 1000,
	timer: null,
	start : function(){
		var target = this;
		target.elm.src = this.url + "&n=" + this.num++;
	}
}


/* 
 * Usage: new CountDownTimer(ElementID, TimeToCountDown, callback)
 */
var CountDownTimer = function(id, sec, callback){
	var elm = document.getElementById(id);
	if (elm){
		this.targetelm = elm;
		this.callback = callback
		this.set(sec);
		this.start();
	}
};
CountDownTimer.prototype = {
	start_ts: null,
	timer: null,
	targetelm: null,
	callback: null,
	set: function(sec){
		this.start_ts = this.getUnixTime() + sec;
	},
	show: function(){
		this.targetelm.innerHTML = this.getstr();
		if (!this.timer && this.callback){
			this.callback();
		}
	},
	start: function(){
		if (this.targetelm){
			var target = this;
			this.timer = setInterval(function(){target.show()}, 10);
		}
	},
	getUnixTime: function(){
		return ((new Date)/1000);
	},
	getstr: function(){
		ts = this.start_ts - this.getUnixTime();
		if (ts <= 0){
			if (this.timer){
				clearInterval(this.timer);
				this.timer = null;
			}
			return '<span class="countzero">00:00<span class="micro">.00</span></span>';
		}
		var h = "";
		var min = parseInt(ts / 60);
		var sec = parseInt(ts - min * 60);
		var flo = parseInt((ts - min * 60 - sec) * 100)

		if (min > 60){
			h = parseInt(min / 60);
			min = min - h * 60;
			h = h + ":";
		}
		
		if (min < 10) min = "0" + min;
		if (sec < 10) sec = "0" + sec;
		if (flo < 10) flo = "0" + flo;
		return '<span class="timer">' + h + min + ":" + sec + '<span class="micro">.' + flo + '</span></span>';
	}
};


/* 
 * ISO 8601 Date (without T)
 */

Date.W3CDTF = function ( dtf ) {
    var dd = new Date();
    dd.setW3CDTF = Date.W3CDTF.prototype.setW3CDTF;
    dd.getW3CDTF = Date.W3CDTF.prototype.getW3CDTF;
    if ( dtf ) this.setW3CDTF( dtf );
    return dd;
};

Date.W3CDTF.prototype.setW3CDTF = function( dtf ) {
    var sp = dtf.split( /[^0-9]/ );

    // invalid format
    if ( sp.length < 6 || sp.length > 8 ) return;

    // invalid time zone
    if ( sp.length == 7 ) {
        if ( dtf.charAt( dtf.length-1 ) != "Z" ) return;
    }

    // to numeric
    for( var i=0; i<sp.length; i++ ) sp[i] = sp[i]-0;

    // invalid range
    if ( sp[0] < 1970 ||                // year
         sp[1] < 1 || sp[1] > 12 ||     // month
         sp[2] < 1 || sp[2] > 31 ||     // day
         sp[3] < 0 || sp[3] > 23 ||     // hour
         sp[4] < 0 || sp[4] > 59 ||     // min
         sp[5] < 0 || sp[5] > 60 ) {    // sec
        return;                         // invalid date 
    }

    // get UTC milli-second
    var msec = Date.UTC( sp[0], sp[1]-1, sp[2], sp[3], sp[4], sp[5] );

    // time zene offset
    if ( sp.length == 8 ) {
        if ( dtf.indexOf("+") < 0 ) sp[6] *= -1;
        if ( sp[6] < -12 || sp[6] > 13 ) return;    // time zone offset hour
        if ( sp[7] < 0 || sp[7] > 59 ) return;      // time zone offset min
        msec -= (sp[6]*60+sp[7]) * 60000;
    }

    // set by milli-second;
    return this.setTime( msec );
};

Date.W3CDTF.prototype.getW3CDTF = function() {
    var year = this.getFullYear();
    var mon  = this.getMonth()+1;
    var day  = this.getDate();
    var hour = this.getHours();
    var min  = this.getMinutes();
    var sec  = this.getSeconds();

    // time zone
    var tzos = this.getTimezoneOffset();
    var tzpm = ( tzos > 0 ) ? "-" : "+";
    if ( tzos < 0 ) tzos *= -1;
    var tzhour = tzos / 60;
    var tzmin  = tzos % 60;

    // sprintf( "%02d", ... )
    if ( mon  < 10 ) mon  = "0"+mon;
    if ( day  < 10 ) day  = "0"+day;
    if ( hour < 10 ) hour = "0"+hour;
    if ( min  < 10 ) min  = "0"+min;
    if ( sec  < 10 ) sec  = "0"+sec;
    if ( tzhour < 10 ) tzhour = "0"+tzhour;
    if ( tzmin  < 10 ) tzmin  = "0"+tzmin;
    var dtf = year+"-"+mon+"-"+day+" "+hour+":"+min+":"+sec+tzpm+tzhour+":"+tzmin;
    return dtf;
};

