﻿/**
 *  Yahho Calendar - Japanized Popup Calendar
 *  @see       http://0-oo.net/sbox/javascript/yahho-calendar
 *  @version   0.2.3 beta 8
 *  @copyright 2008 dgbadmin@gmail.com
 *  @license   http://0-oo.net/pryn/MIT_license.txt (The MIT license)
 */



var numID = -1;
var counter = false;

//ウインドウのリサイズでカレンダーの位置も移動
window.onresize = function() {
var moveID = "yui-gen" + String(numID);
	if (document.getElementById(moveID) != null)
	{
	for (var m in YAHOO.util.Dom.getRegion(YahhoCal.TARGET_CAL.TID)) {
	YahhoCal.TARGET_CAL[m] = YAHOO.util.Dom.getRegion(YahhoCal.TARGET_CAL.TID)[m]; 
	}             

	var moveX = YahhoCal.TARGET_CAL.left + "px";
	document.getElementById(moveID).style.left = String(moveX);
	}
};

//カレンダーウィンドウ以外クリックで閉じる
function checkID(element){
	if((element.id.indexOf("yui-gen") > -1) && (element.id.length == 8)) return true; else false;
}

closeCalender = function (ev){
	if (counter == true){
		var X = YAHOO.util.Event.getPageX(ev);
		var Y = YAHOO.util.Event.getPageY(ev);
		
		var cID = YAHOO.util.Dom.getElementsBy(checkID, "div");
		mID = cID.length - 1;
		var Safearea = YAHOO.util.Dom.getRegion("yui-gen" + mID);
			if (((X > Safearea.left) && (Safearea.right > X)) && ((Y > Safearea.top) && (Safearea.bottom > Y))) return false; else YahhoCal.hidecalendar();
	}
};

	YAHOO.util.Event.addListener(document,'mouseup',closeCalender);


var YahhoCal = {
    /** YUIカレンダー日本語化設定 */
    YUI_CAL_CONFIG_JP: {
        close: true,
        title: "日時を選択してください",
        my_label_year_position: 1,
        my_label_year_suffix: "年 ",
        my_label_month_suffix: "月",
        months_long: ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"],
        weekdays_short: ["日", "月", "火", "水", "木", "金", "土"],
        hide_blank_weeks: false
    },

    /** loadYUI()で読み込むYUIのURL（@see http://developer.yahoo.com/yui/articles/hosting/ ） */
    YUI_URL: {
        SERVER: "http://yui.yahooapis.com/",
        VERSION: "2.5.2",
        DIR: "/build/"
    },

    // カレンダーの表示領域設定をラップするアダプタ
    TARGET_CAL: {},

    // カレンダーの休日情報を格納する配列
	holiday_cal:[],

    //入力要素をラップするアダプタ
    adapters: {}
};

/**
 *  カレンダーを表示する
 *  @param  String  inputId 入力要素のid or 年の入力要素のid
 *  @param  String  monthId (optional) 月の入力要素のid
 *  @param  String  dateId  (optional) 日の入力要素のid
 *  @return Boolean カレンダーの表示ができたかどうか
 */

YahhoCal.render = function(inputId, monthId, dateId, CalTarget) {

	YahhoCal.TARGET_CAL.TID = CalTarget;
	
	if (counter == true){
		YahhoCal.hidecalendar();
	}
	
    if (!window.YAHOO || !YAHOO.widget.CalendarGroup) {    //YUIを読み込んでいない場合
        return false;
    }

	for (var i in Caloption) {
		YahhoCal.YUI_CAL_CONFIG_JP[i] = Caloption[i]; //YUIカレンダーの場合によって異なるオプションを読み込む（設定はHTMLに記述）
	}

	for (var m in YAHOO.util.Dom.getRegion(CalTarget)) {
		YahhoCal.TARGET_CAL[m] = YAHOO.util.Dom.getRegion(CalTarget)[m]; //カレンダーの表示領域の開始座標情報の取得
	}

    var currentId = (this.currentId = dateId || inputId); //入力要素を特定するID

    //アダプタを取得
    if (!this.adapters[currentId]) {
        this.adapters[currentId] = this.createAdapter(inputId, monthId, dateId);
    }
    var adapter = this.adapters[currentId];



    //入力済みの日付を取得
    var val = adapter.getDate();
    var y = val[0], m = val[1], d = val[2];
    var shown = new Date(y, m - 1, d);

    //表示設定
    var pagedate = "", selected = "";
    if ((shown.getFullYear() == y && shown.getMonth() + 1 == m && shown.getDate() == d)) {
        //日付として正しい場合
        pagedate = m + "/" + y;
        selected = m + "/" + d + "/" + y;
    } else {
        shown = new Date();
    }




    for (var i in holidays) {
    YahhoCal.holiday_cal.push(holidays[i]);
    }

			var cal = YahhoCal.cal;
//			if (cal) {    //再表示の場合
//			YAHOO.util.Dom.insertAfter(YahhoCal.place, currentId);
//			cal.show();
//			} else {    //初めて表示する場合
			cal = YahhoCal.cal = YahhoCal.createCalendar(currentId);
//			}

			cal.cfg.setProperty("pagedate", pagedate);    //表示する年月
			cal.cfg.setProperty("selected", selected);    //選択状態の日付
			
			//休日をカレンダーに反映する
			for (var i in YahhoCal.holiday_cal) {
			cal.addRenderer(YahhoCal.holiday_cal[i], cal.renderCellStyleHighlight4);
			}

			cal.render();
			
			numID++;

		counter = true;

return true;

};

YahhoCal.hidecalendar = function (){
	YahhoCal.cal.hide()
}


/**
 *  入力要素とカレンダーとのポリモフィズムなアダプタを生成する
 */
YahhoCal.createAdapter = function(inputId, monthId, dateId) {
    var adapter = {};

    if (!monthId) {    //テキストボックス1つの場合
        var ymd = document.getElementById(inputId);
        adapter.getDate = function() { return ymd.value.split("/"); };
        adapter.setDate = function(y, m, d) { ymd.value = y + "/" + m + "/" + d; };
        return adapter;
    }
    
    //年・月・日が分かれている場合
    var ey = document.getElementById(inputId);
    var em = document.getElementById(monthId);
    var ed = document.getElementById(dateId);
 
    if (ey.tagName == "INPUT") {    //テキストボックスの場合
        adapter.getDate = function() { return [ey.value, em.value, ed.value]; };
        adapter.setDate = function(y, m, d) { ey.value = y; em.value = m; ed.value = d; };
        return adapter;
    }
    
    //選択リストの場合
    var getValue = function(sel) { return sel.options[sel.selectedIndex].text; };
    var setValue = function(sel, value) {
        for (var i = 0; i < sel.length; i++) {
            if (sel.options[i].text == value) {
                sel.options[i].selected = true;
                return;
            }
        }
    };
    adapter.getDate = function() { return [getValue(ey), getValue(em), getValue(ed)]; };
    adapter.setDate = function(y, m, d) { setValue(ey, y); setValue(em, m); setValue(ed, d); };
    return adapter;
};
/**
 *  カレンダーを生成する
 */
YahhoCal.createCalendar = function(insertId) {
    //YUI skinを適用
    YAHOO.util.Dom.addClass(document.getElementsByTagName("body")[0], "yui-skin-sam");

    //カレンダーの場所を作る
    var place = (this.place = document.createElement("div"));
    YAHOO.util.Dom.setStyle(place, "position", "absolute");
    YAHOO.util.Dom.setStyle(place, "top", YahhoCal.TARGET_CAL.bottom + "px");//0911 ike
    YAHOO.util.Dom.setStyle(place, "left", YahhoCal.TARGET_CAL.left + "px");//0911 ike

    	var windowXpos = YahhoCal.YUI_CAL_CONFIG_JP.pages * 11 //IE6でtableの値が固定できないので、pageを乗算して固定する

    	    YAHOO.util.Dom.setStyle(place, "width", windowXpos + 0.9 + (0.7*(YahhoCal.YUI_CAL_CONFIG_JP.pages -1)) + "em");


    YAHOO.util.Dom.insertAfter(place, insertId);



    //カレンダー生成
    var cal = new YAHOO.widget.CalendarGroup(place, this.YUI_CAL_CONFIG_JP);

    //日付を選択された時のイベント
    cal.selectEvent.subscribe(function(eventName, date) {
        var dateStr = date[0][0];
        YahhoCal.adapters[YahhoCal.currentId].setDate(dateStr[0], dateStr[1], dateStr[2]);
        cal.hide();
    }, cal, true);

    return cal;

};

/**
 *  必要なYUIのJavaScriptとCSSを読み込む
 *  @param  String  yuiBase (optional) yui.yahooapis.comを使わない場合、YUIのベースとなるURL
 */
YahhoCal.loadYUI = function(yuiBase) {
    if (!yuiBase) {
        yuiBase = this.YUI_URL.SERVER + this.YUI_URL.VERSION + this.YUI_URL.DIR;
    }

    //YUI Loaderをload
    var script = document.createElement("script");
    script.type = "text/javascript";
    script.src = yuiBase + "yuiloader-dom-event/yuiloader-dom-event.js";
    document.getElementsByTagName("head")[0].appendChild(script);
    
    //YUI Loaderがloadされるまで待つ
    var limit = 3000, interval = 100, time = 0;
    var loadedId = setInterval(function(){
        if (window.YAHOO) {
            clearInterval(loadedId);
            //YUI Calendarをload
            new YAHOO.util.YUILoader({ require: ["calendar"], base: yuiBase }).insert();
        } else if ((time += interval) > limit) {    //タイムアウト
            clearInterval(loadedId);
        }
    }, interval);
};
/**
 *    週の初めを月曜日にする
 */
YahhoCal.setMondayAs1st = function() {
    this.YUI_CAL_CONFIG_JP.start_weekday = 1;
};

