// forked from tgaisho's "カウントダウンタイマー" 	
/**
 * 
 */
var CountdownTimer = {

    setCountdownTimer : function(fields){
        this.changeDisplay(fields)();
        setInterval(this.changeDisplay(fields), fields.interval);
    },
    
    changeDisplay: function(fields){
        return function(){
            
            var millisecond = 1;
            var second = 1 * 1000;
            var target = document.getElementById(fields.displayTargetId);
            var descTarget = document.getElementById(fields.descTargetId);
            
            if (!fields.mode || fields.mode === 1) {
                changeDisplayBySpecificDaysMode();
            }
            else 
                if (fields.mode === 2) {
                    changeDisplayByWeekdayModeInOnlyOneDay();
                }
                else 
                    if (fields.mode === 3) {
                        changeDisplayByWeekdayModeInMultiDay();
                    }
            
            function changeDisplayBySpecificDaysMode(){
                var times = fields.specifiedMode.times;
                var mostCloseDate;
                var mostCloseDateIdx = -7;
                for (var i = 0; i < times.length; i++) {
                    var t = new Date(times[i]);
                    if (t.getTime() > new Date().getTime()) {
                        if (!mostCloseDate || mostCloseDate.getTime() > t.getTime()) {
                            mostCloseDate = t;
                            mostCloseDateIdx = i;
                        }
                    }
                }

                var dispstr,descstr;
                if(mostCloseDate){
                    var diffTime = getDiffTime(mostCloseDate);
                    dispstr = formatTime(diffTime);
                    descstr = fields.specifiedMode.messages[mostCloseDateIdx];
                }else{
                    dispstr = "";
                    descstr = fields.specifiedMode.endMessage;
                }

                setDisplayString(dispstr, descstr);
            }

            function changeDisplayByWeekdayModeInOnlyOneDay(){
                
                var f = fields.weekdayModeInOneday;
                var targetWeekDays = f.targetDay;
                var weekdayTarget;
                var todayIsTarget;
                var now = new Date();
                var today = now.getDay();
                for(var i=0; i<targetWeekDays.length; i++){
                    if(targetWeekDays[i] === today){
                        todayIsTarget = true; break;
                    }
                }
                
                var started, ended, limitDayOver, disp = false;
                if(todayIsTarget){
                    var startTime = setTime(new Date(),f.startTime);
                    var endTime = setTime(new Date(), f.endTime);
                    var limitDay = new Date(f.limitDay + " 23:59:59");
                    started = startTime.getTime() <= now.getTime();
                    ended = endTime.getTime() < now.getTime();
                    limitDayOver = limitDay.getTime() < now.getTime();    
                    
                    disp = todayIsTarget && started && !ended && !limitDayOver;
                }
                
                var dispstr = "",desc = "　";
                if(disp === true){
                    var diffTime = getDiffTime(endTime);
                    dispstr = formatTime(diffTime);
                    desc = f.messages[now.getDay()];
                }else{
                    if(todayIsTarget){
                        if(ended){
                            desc = f.endMessages[now.getDay()];
                        }
                    }
                }
                setDisplayString(dispstr, desc);

            }
            
            
            function changeDisplayByWeekdayModeInMultiDay(){
                
                var f = fields.weekdayModeInMultiday;
                var startDate, endDate;
                var diffNowToEnd, diffStartToEnd;
                var notStarted, limitDayOver;
                var now = new Date();
                var limitDay = new Date(f.limitDay + " 23:59:59");

                limitDayOver = limitDay.getTime() < now.getTime();
                
                if(!limitDayOver){
                    
                    diffNowToEnd = getDayDiff(f.endDay, now.getDay());
                    endDate = new Date();
                    endDate.setTime(endDate.getTime() + ((1 * 1000 * 60 * 60 * 24) * diffNowToEnd));
                    endDate = setTime(endDate, f.endTime);
                                        
                    diffStartToEnd = getDayDiff(f.endDay, f.startDay);
                    startDate = new Date(endDate.getTime());
                    startDate.setTime(startDate.getTime() - ((1 * 1000 * 60 * 60 * 24) * diffStartToEnd));
                    startDate = setTime(startDate, f.startTime);
                    
                    if(now.getTime() < startDate.getTime() && now.getTime() < endDate.getTime()){
                        startDate = new Date(startDate.getTime() - (1 * 1000 * 60 * 60 * 24) * 7);
                    }
                    
                    if(startDate.getTime() >= endDate.getTime()){
                        endDate = new Date(endDate.getTime() + (1 * 1000 * 60 * 60 * 24) * 7);
                    }
                    
                    notStarted = (now.getTime() < startDate.getTime());
                                        
                }
                
                var dispstr = "",desc = "　";
                if(limitDayOver){
                    desc = f.limitOverMessage; 
                }else{
                    if(!notStarted){
                        dispstr = formatTime(getDiffTime(endDate));
                        desc = f.message;                        
                    }else{
                        desc = f.endMessage;
                    }
                }
                setDisplayString(dispstr, desc);


                function getDayDiff(day1, day2){
                    var dayDiff;
                    if(day1 >= day2){
                         dayDiff = day1 - day2;
                    }else{    
                         dayDiff = day1 + 7 - day2;
                    }
                    return dayDiff;
                }
                
            }
            
            function setDisplayString(timerdisp, desc){
                if(typeof target.textContent != "undefined") {
                    target.textContent = timerdisp;
                    descTarget.textContent =desc;
					descTarget.innerText =desc;
					descTarget.innerHTML = desc;
					
                }else{
                    target.innerText = timerdisp;
                    descTarget.innerText =desc;
	               
                }

            }
            
            function getDiffTime(targetDate){
                var diffTime = targetDate.getTime() - new Date().getTime();
                var seconds, milliseconds;
                

                
                seconds = Math.floor(diffTime / second);
                diffTime -= seconds * second;
                
                milliseconds = Math.floor(diffTime / 10);
                
                return {
                    seconds: seconds,
                    milliseconds: milliseconds
                };
            }
            
            function setTime(date,str){
                var arrays = str.split(":");
                date.setSeconds(arrays[2]);
                date.setMilliseconds("0");
                return date;                
            }
            
            function formatTime(timeInfo){
                var str = 
                padLeftString(timeInfo.seconds, "0") +
                "";
                
                if (fields.dispMillisecond) {
                    str += padLeftString(timeInfo.milliseconds, "0");
                }
                return str;
            }
            function padLeftString(val, char){
                if (!val) {
                    val = "";
                }
                else {
                    val = val.toString();
                }
                while (val.length < 2) {
                    val = char + val;
                }
                
                return val;
            }
            
        };
    }

};



CountdownTimer.setCountdownTimer(
    {
        //////////////////共通設定//////////////////
        displayTargetId : "timer_display1",        //時間を表示する箇所のID
        descTargetId : "timer_desc1",            //メッセージを表示する箇所のID
        mode : 1,                                //1:特定日付指定 2:曜日指定（一日限定） 3:曜日指定（複数日付）
        dispMillisecond : false,                //true: ミリ秒を表示  false:表示しない
        interval : 10,                            //固定
        //////////////////固有設定//////////////////
        specifiedMode : 
            {
                times :[                        
                    "2012/03/21 00:00:00"       
                ],
                messages :[                        //日付と同じ数の分メッセージを記述
                    " "                ],
                endMessage : "<a href='http://www.lunasea.jp/'>Please Reload</a>"    //すべて終了した場合のメッセージ
            }
    }
);
CountdownTimer.setCountdownTimer(
    {
        //////////////////共通設定//////////////////
        displayTargetId : "timer_display2",        //時間を表示する箇所のID
        descTargetId : "timer_desc2",            //メッセージを表示する箇所のID
        mode : 1,                                //1:特定日付指定 2:曜日指定（一日限定） 3:曜日指定（複数日付）
        dispMillisecond : true,                //true: ミリ秒を表示  false:表示しない
        interval : 10,                            //固定
        //////////////////固有設定//////////////////
        specifiedMode : 
            {
                times :[                        //特定日時を指定 いくつでも追加可能
                    "2011/12/24 00:00:00",        
                    "2012/01/01 00:00:00",
                ],
                messages :[                        //日付と同じ数の分メッセージを記述
                    "クリスマスまであと ",
                    "正月まであと ",

                ],
                endMessage : "終了メッセージ"    //すべて終了した場合のメッセージ
            }
    }
);

CountdownTimer.setCountdownTimer(
    {
        //////////////////共通設定//////////////////
        displayTargetId : "timer_display3",        //時間を表示する箇所のID
        descTargetId : "timer_desc3",            //メッセージを表示する箇所のID
        mode : 1,                                //1:特定日付指定 2:曜日指定（一日限定） 3:曜日指定（複数日付）
        dispMillisecond : false,                //true: ミリ秒を表示  false:表示しない
        interval : 1000,                            //固定
        //////////////////固有設定//////////////////
        specifiedMode : 
            {
                times :[                        //特定日時を指定 いくつでも追加可能
                    "2012/01/20 00:00:00",        
                ],
                messages :[                        //日付と同じ数の分メッセージを記述
					"",

                ],
				endMessage : "<!---終了メッセージ---->"    //すべて終了した場合のメッセージ
            }
    }
);


