カレンダーから年月日を入力するってのを複数設置・改

  1. <!DOCTYPE html>
  2. <html lang="ja">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>カレンダーから年月日を入力するってのを複数設置・改</title>
  6. <script type="text/javascript" src="jquery-1.5.1.min.js"></script>
  7. <script type="text/javascript" src="knockout-2.1.0beta.js"></script>
  8. <script type="text/javascript">
  9.   /* ==============================================================
  10.    ▼カレンダークラス
  11.   ============================================================== */
  12.   var ClassCalendar = function(argY, argM, argD) {
  13.     // 指定がなければ今日
  14.     var now = new Date();
  15.     var year  = argY || now.getFullYear();
  16.     var month = argM || now.getMonth() + 1;
  17.     var day   = argD || now.getDate();
  18.     // 週単位で分割した日にち配列
  19.     var weekAry = new Array();
  20.     var fstWeek = 0;  // 週初めの曜日(0:日曜~6:土曜)
  21.     var fill    = "";  // 日にちの入っていないとこにいれる文字
  22.     // 曜日配列
  23.     var weekLabelAry = new Array("日", "月", "火", "水", "木", "金", "土");
  24.     /**
  25.      * 年月日をdate()からセット
  26.      * dateData 年月日
  27.      */
  28.     this.setYMDForDate = function(dateData)
  29.     {
  30.       year  = dateData.getFullYear();
  31.       month = dateData.getMonth() + 1;
  32.       day   = dateData.getDate();
  33.       weekAry = new Array(); // 対象となる年月日が変わるなら配列は初期化
  34.     }
  35.     /**
  36.      * 年月日のセット
  37.      * argY, argM, argD 年月日
  38.      */
  39.     this.setYMD = function(argY, argM, argD)
  40.     {
  41.       year  = argY;
  42.       month = argM;
  43.       day   = argD;
  44.       weekAry = new Array(); // 対象となる年月日が変わるなら配列は初期化
  45.     }
  46.     /**
  47.      * 指定数だけ前後する
  48.      * num    nヶ月前 or 後ろ(負の値で前の月、正の値で次の月)
  49.      * target 対象を「y(=n年)、m(=nヶ月)、d(=n日)」
  50.      */
  51.     this.setMoveYMD = function(num, target)
  52.     {
  53.       var target = target || "m";
  54.       var moveMonth = addDate(new Date(year, month-1, day), target, num);
  55.       year  = moveMonth.getFullYear();
  56.       month = moveMonth.getMonth() + 1;
  57.       day   = moveMonth.getDate();
  58.       weekAry = new Array(); // 対象となる年月日が変わるなら配列は初期化
  59.     }
  60.     /**
  61.      * 曜日をセット
  62.      * weekKindAry 曜日のラベル配列
  63.      */
  64.     this.setWeekLabel = function(weekKindAry)
  65.     {
  66.       weekLabelAry = weekKindAry;
  67.     }
  68.     /**
  69.      * スタートなる曜日を決める
  70.      * start   スタートとなる曜日を決める(0:日曜~6:土曜)
  71.      */
  72.     this.setStartWeekDay = function(start)
  73.     {
  74.       start = start || 0;
  75.       if (0 <= parseFloat(start) && parseFloat(start) <= 6) {
  76.         fstWeek = start;
  77.       }
  78.       else {
  79.         // 曜日指定が0~6じゃないなら強制的に0
  80.         fstWeek = 0;
  81.       }
  82.       weekAry = new Array(); // スタートなる曜日が変わるなら配列は初期化
  83.     }
  84.     /**
  85.      * 空白日に埋める文字のセット
  86.      * start   スタートとなる曜日を決める(0:日曜~6:土曜)
  87.      */
  88.     this.setFill = function(addChar)
  89.     {
  90.       addChar = addChar || "";
  91.       fill = addChar;
  92.       weekAry = new Array(); // 区切り文字が変わるなら配列は初期化
  93.     }
  94.     /**
  95.      * 現在の年月日の各値を取得
  96.      * needVal 欲しい値(y,m,d)
  97.      */
  98.     this.getValueForDate = function (needVal)
  99.     {
  100.       var tempVal = "";
  101.       if (needVal == "y") {
  102.         tempVal = year;
  103.       }
  104.       else if (needVal == "m") {
  105.         tempVal = month;
  106.       }
  107.       else {
  108.         tempVal = day;
  109.       }
  110.       return tempVal;
  111.     }
  112.     /**
  113.      * カレンダー用に変換した週の配列を取得:配列だけ欲しいとき用に。
  114.      * addChar 「1日まで」と「月末以降」を埋める文字
  115.      * start   スタートとなる曜日を決める(0:日曜~6:土曜)
  116.      */
  117.     this.getWeekAry = function (addChar, start)
  118.     {
  119.       if (weekAry.length == 0)
  120.       {
  121.         this.setStartWeekDay(start);
  122.         this.setFill(addChar);
  123.         dayAryForCalendar();
  124.       }
  125.       return weekAry;
  126.     }
  127.     /**
  128.      * 年月日の書式(yyyy/mm/dd等)を整えて返す
  129.      * type 年月日の書式
  130.      */
  131.     this.convertDateFormat = function(type)
  132.     {
  133.       type = type || "yyyy/mm/dd";
  134.       // いずれ各書式に対応させる予定
  135.       if (type == "yyyy/mm") {
  136.         tempM = convertNumberDigits(2, month);
  137.         convertDate = year + "/" + tempM;
  138.       }
  139.       else {
  140.         // 未対応記述とyyyy/mm/ddの場合
  141.         tempM = convertNumberDigits(2, month);
  142.         tempD = convertNumberDigits(2, day);
  143.         convertDate = year + "/" + tempM + "/" + tempD;
  144.       }
  145.       return convertDate;
  146.     }
  147.     /**
  148.      * カレンダー用の週配列をtableタグにする
  149.      * weekKindAry 週単位にした日にちの配列
  150.      */
  151.     this.makeTableForCalendar = function(weekKindAry)
  152.     {
  153.       weekKindAry = weekKindAry || weekLabelAry;
  154.       if (weekAry.length == 0) {
  155.         dayAryForCalendar();
  156.       }
  157.       var tableTag = "";
  158.       tableTag += '<table class="calendarTable">';
  159.       // 年月
  160.       tableTag += '<caption>';
  161.       tableTag += year + "年" + month + "月";
  162.       tableTag += '</caption>';
  163.       // 曜日:指定された週初めから曜日を並び替え
  164.       useWeekAry = convertWeekLabelOfCalendar(weekKindAry);
  165.       tableTag += '<tr>';
  166.         for (var i=0; i<useWeekAry.length; i++) {
  167.           tableTag += '<th>';
  168.           tableTag += useWeekAry[i];
  169.           tableTag += '</th>';
  170.         }
  171.       tableTag += '</tr>';
  172.       // 日にち
  173.       var styleHol = "";
  174.       var styleTod = "";
  175.       for (var i=0; i<weekAry.length; i++) {
  176.         tableTag += '<tr>';
  177.         for (var j=0; j<weekAry[i].length; j++) {
  178.           calClass = "";
  179.           classHol = "";
  180.           classTod = "";
  181.           if (weekAry[i][j]["num"] == 0) {
  182.             // 日曜
  183.             classHol = 'calHol';
  184.           }
  185.           if (weekAry[i][j]["day"] == day) {
  186.             // 今日
  187.             classTod = ' calTod';
  188.           }
  189.           if (classHol != "" || classTod != "") {
  190.             calClass = ' class="' + classHol + classTod + '"';
  191.           }
  192.           tableTag += '<td' + calClass + '>';
  193.           tableTag += weekAry[i][j]["day"];
  194.           tableTag += '</td>';
  195.         }
  196.         tableTag += '</tr>';
  197.       }
  198.       tableTag += '</table>';
  199.       return tableTag;
  200.     }
  201.     /**
  202.      * カレンダー用の配列を返す
  203.      */
  204.     var dayAryForCalendar = function()
  205.     {
  206.       // 「週初めから1日まで」と「月末から週末まで」を文字を埋める
  207.       var dayAry = convertDayOfCalendar();
  208.       // 1週ずつ分割していく
  209.       weekAry = convertWeekOfCalendar(dayAry);
  210.     }
  211.     // 桁数をそろえるために0を埋める
  212.     var convertNumberDigits = function(digit, num)
  213.     {
  214.       var src = new String(num);
  215.       var cnt = digit - src.length;  // 桁数(digit)から足りない文字数を調査
  216.       if (0 < cnt) {
  217.         while (cnt-- > 0) {
  218.           src = "0" + src;
  219.         }
  220.       }
  221.       return src;
  222.     }
  223.     // 指定された曜日を週初めとして空白日を埋める
  224.     var convertDayOfCalendar = function ()
  225.     {
  226.       // 月初と月末のDate()
  227.       var startMonth = new Date(year, month-1, 1);
  228.       var endMonth   = new Date(year, month, 0);
  229.       // 指定された週初めの曜日から週末の曜日を求めておく
  230.       endEeek = (fstWeek != 0) ? fstWeek - 1: 6;
  231.       // カレンダー用に日にちを配列化:
  232.       var DayArray = new Array();
  233.       // 日曜(指定された週初めの曜日)~1日の空白を埋める。
  234.       if (startMonth.getDay() < fstWeek) {
  235.         diffWeekToFst = 7 - Math.abs(startMonth.getDay() - fstWeek);
  236.       }
  237.       else {
  238.         diffWeekToFst = Math.abs(startMonth.getDay() - fstWeek);
  239.       }
  240.       for (i=0; i<diffWeekToFst; i++) {
  241.         DayArray.push(fill);
  242.       }
  243.       // 月初め(1日)~月末までを埋める
  244.       for (i=0; i<endMonth.getDate(); i++) {
  245.         DayArray.push(i+1);
  246.       }
  247.       // 月末~土曜(指定された週末の曜日)の空白を埋める
  248.       if (endMonth.getDay() != endEeek) {
  249.         // 週初めから何日目か
  250.         if (endMonth.getDay() < fstWeek) {
  251.           diffWeekForEnd = 7 - Math.abs(endMonth.getDay() - fstWeek);
  252.         }
  253.         else {
  254.           diffWeekForEnd = Math.abs(endMonth.getDay() - fstWeek);
  255.         }
  256.         // 週末まで何日あるか
  257.         diffWeekFromEnd = 6 - diffWeekForEnd;
  258.         for (i=0; i<diffWeekFromEnd; i++) {
  259.           DayArray.push(fill);
  260.         }
  261.       }
  262.       return DayArray;
  263.     }
  264.     // 年月日に指定された数値を足して返す
  265.     var addDate = function (ymd, target, add)
  266.     {
  267.       var addNum = parseFloat(add);
  268.       var addY = ymd.getFullYear();
  269.       var addM = ymd.getMonth() + 1;
  270.       var addD = ymd.getDate();
  271.       // ymdが月末のときに使う
  272.       var endMonthDay = new Date(addY , addM, 0).getDate();
  273.       var tempD = addD;
  274.       if(target == "y") {
  275.         addY += addNum;
  276.       }
  277.       else if(target == "m") {
  278.         addM += addNum;
  279.       }
  280.       else if(target == "d") {
  281.         addD += addNum;
  282.       }
  283.       // 月末で、年・月を足したとき:月初めに変更して足し、最後に月末をセットする
  284.       if ((target == "y" || target == "m") && tempD == endMonthDay) {
  285.         // 月初めで年月を移動
  286.         dateNoDay = new Date(addY, addM-1, 1);
  287.         // 移動した年月の月末を取得
  288.         var nextY = dateNoDay.getFullYear();
  289.         var nextM = dateNoDay.getMonth() + 1;
  290.         dateLast = new Date(nextY, nextM, 0).getDate();
  291.         // 移動した年月の月末でDate()に変換
  292.         tempDate = new Date(nextY, nextM-1, dateLast);
  293.       }
  294.       else {
  295.         tempDate = new Date(addY , addM-1, addD);
  296.       }
  297.       return tempDate;
  298.     }
  299.     // カレンダー用に週単位で配列にして返す
  300.     var convertWeekOfCalendar = function(dayAry)
  301.     {
  302.       var ary = new Array();
  303.       for (var i=0, j=0, k=fstWeek; i<dayAry.length; i++, k++) {
  304.         j = parseInt(i/7);
  305.         if (i%7 == 0) {
  306.           ary[j] = new Array();
  307.         }
  308.         if (6 < k) {
  309.           k = 0;
  310.         }
  311.         // kが曜日、dayが日にち
  312.         ary[j].push({"num": k, "day": dayAry[i]});
  313.       }
  314.       return ary;
  315.     }
  316.     // 指定されている週初めに合わせて曜日配列を入れ替える
  317.     var convertWeekLabelOfCalendar = function(weekKindAry)
  318.     {
  319.       var ary = new Array();
  320.       for (var i=0, j=fstWeek; i<7; i++, j++) {
  321.         if (6 < j) {
  322.           j = 0;
  323.         }
  324.         ary.push(weekKindAry[j]);
  325.       }
  326.       return ary;
  327.     }
  328.   }
  329.   /* ==============================================================
  330.    ▲カレンダークラス
  331.   ============================================================== */
  332.   
  333.   /* ==============================================================
  334.    ▼カスタムバインディング
  335.   ============================================================== */
  336.   // モーダルウィンドウのマスク
  337.   ko.bindingHandlers.koModalMask = {
  338.     update: function(element, valueAccessor, allBindingsAccessor)
  339.     {
  340.       // 現状の値と、サブプロパティ一覧の取得
  341.       var value = valueAccessor(), allBindings = allBindingsAccessor();
  342.       var valueUnwrapped = ko.utils.unwrapObservable(value);
  343.       
  344.       // サブプロパティ:
  345.       var maskBgColor = allBindings.maskBgColor || "#000"; // maskBgColor:マスクの背景色
  346.       var maskOpacity = allBindings.maskOpacity || "0.3";  // maskOpacity:maskOpacityマスクの不透明度
  347.       
  348.       // DOMをいじる
  349.       if (valueUnwrapped == false) {
  350.         $(element).hide();
  351.       }
  352.       else {
  353.         $(element).css({'width':$(window).width(), 'height':$(document).height()});
  354.         $(element).css({'backgroundColor': maskBgColor});
  355.         $(element).css({'position': 'absolute', 'left': '0', 'top': '0'});
  356.         $(element).css({'z-index': '9000'});
  357.         $(element).fadeTo(0, maskOpacity);
  358.       }
  359.     }
  360.   };
  361.   
  362.   // モーダルウィンドウ
  363.   ko.bindingHandlers.koModalWindow = {
  364.     update: function(element, valueAccessor, allBindingsAccessor)
  365.     {
  366.       // 現状の値と、サブプロパティ一覧の取得
  367.       var value = valueAccessor(), allBindings = allBindingsAccessor();
  368.       var valueUnwrapped = ko.utils.unwrapObservable(value);
  369.       
  370.       // サブプロパティ:modalBgColorの値をセット
  371.       var modalBgColor = allBindings.modalBgColor || "#fff";
  372.       
  373.       // DOMをいじる
  374.       if (valueUnwrapped == false) {
  375.         $(element).hide();
  376.       }
  377.       else {
  378.         $(element).css({'backgroundColor': modalBgColor});
  379.         $(element).css({'z-index': '9999'});
  380.         $(element).fadeIn(500);
  381.       }
  382.     }
  383.   };
  384.   /* ==============================================================
  385.    ▲カスタムバインディング
  386.   ============================================================== */
  387.   
  388.   /* ==============================================================
  389.    ▼日付入力補助オブジェクト
  390.   ============================================================== */
  391.   var ClassInputdateArea = function()
  392.   {
  393.     var self = this;
  394.     self.inputData = ko.observable("");        // 日付を入力するinputタグの値
  395.     self.windowModal = ko.observable(false);  // ウィンドウ
  396.     // カレンダーのクラス
  397.     self.calendar = new ClassCalendar();
  398.     // カレンダーで使うヤツ
  399.     var now = new Date();
  400.     self.year = ko.observable(now.getFullYear());
  401.     self.mont = ko.observable(now.getMonth() + 1);
  402.     // clickバインディング: モーダルウィンドウを開く(今月を表示)
  403.     self.openModal = function()
  404.     {
  405.       var now = new Date();
  406.       self.year(now.getFullYear());
  407.       self.mont(now.getMonth()+1);
  408.       
  409.       self.windowModal(true);
  410.       $("#ModalMask").trigger("openMask");
  411.     }
  412.     // clickバインディング:前月・翌月・今月([move]を月に足し引きする)
  413.     self.moveCal = function(move)
  414.     {
  415.       move = move || 0;
  416.       if (move == 0) {
  417.         // 「0」だったら今月にする
  418.         self.calendar.setYMDForDate(new Date());
  419.       }
  420.       else {
  421.         // 「0」じゃないんだったら[move]を月に足し引きする
  422.         self.calendar.setYMD(self.year(), self.mont(), 1);
  423.         self.calendar.setMoveYMD(move);
  424.       }
  425.       
  426.       self.year(self.calendar.getValueForDate("y"));
  427.       self.mont(self.calendar.getValueForDate("m"));
  428.     }
  429.     // カレンダーの年月の表示
  430.     self.valYearMonth = ko.computed( function()
  431.     {
  432.       self.calendar.setYMD(self.year(), self.mont(), 1);
  433.       return self.calendar.convertDateFormat("yyyy/mm");
  434.     }, this);
  435.     // カレンダー用に週ごとに配列化
  436.     self.weekData = ko.computed( function()
  437.     {
  438.       self.calendar.setYMD(self.year(), self.mont(), 1);
  439.       return self.calendar.getWeekAry();
  440.     }, this);
  441.     // clickバインディング: モーダルウィンドウを閉じるボタン
  442.     self.closeModal = function()
  443.     {
  444.       self.windowModal(false);
  445.       $("#ModalMask").trigger("closeMask");
  446.     }
  447.     // クリックされた日にちを入力:日にちの無いトコがクリックされたら何もしない。
  448.     self.addData = function(koData)
  449.     {
  450.       if (koData.day.toString().match(/^[0-9]+$/) != null) {
  451.         self.calendar.setYMD(self.year(), self.mont(), parseFloat(koData.day));
  452.         var ymd = self.calendar.convertDateFormat("yyyy/mm/dd");
  453.         self.inputData(ymd);
  454.         self.windowModal(false);
  455.         $("#ModalMask").trigger("closeMask");
  456.       }
  457.     }
  458.     // 「今日」だけCSS追加
  459.     self.cToday = function(koDataDay)
  460.     {
  461.       // 表示されたカレンダーの日にち:数字以外ならfalse
  462.       var ymd = "";
  463.       if (koDataDay.toString().match(/^[0-9]+$/) != null) {
  464.         self.calendar.setYMD(self.year(), self.mont(), parseFloat(koDataDay));
  465.         ymd = self.calendar.convertDateFormat("yyyy/mm/dd");
  466.       }
  467.       else {
  468.         return false;
  469.       }
  470.       
  471.       // 今日の年月日
  472.       self.calendar.setYMDForDate(new Date());
  473.       var today = self.calendar.convertDateFormat("yyyy/mm/dd");
  474.       
  475.       // 表示されたカレンダーの日にちと今日の年月日が同じかチェック
  476.       if (ymd == today) {
  477.         return true;
  478.       }
  479.       return false;
  480.     }
  481.     
  482.   }
  483.   /* ==============================================================
  484.    ▲日付入力補助のオブジェクト
  485.   ============================================================== */
  486.   
  487.   // knockout.js ===============================================
  488.   function ViewModel() {
  489.     var self = this;
  490.     self.flagMask = ko.observable();
  491.     self.inputDateArea01 = new ClassInputdateArea();
  492.     self.inputDateArea02 = new ClassInputdateArea();
  493.     self.inputDateArea03 = new ClassInputdateArea();
  494.     self.inputDateArea04 = new ClassInputdateArea();
  495.     self.inputDateArea05 = new ClassInputdateArea();
  496.     self.inputDateArea06 = new ClassInputdateArea();
  497.     $("#ModalMask").bind("openMask", function() {
  498.       self.flagMask(true);
  499.     });
  500.     
  501.     $("#ModalMask").bind("closeMask", function() {
  502.       self.flagMask(false);
  503.     });
  504.     // モーダルウィンドウで使うヤツ
  505.     self.maskModal = ko.computed( function() {
  506.       if (self.flagMask() == true) {
  507.         return true;
  508.       } 
  509.       return false;
  510.     }, this);
  511.     // clickバインディング: マスクがクリックされたとき
  512.     self.clickMask = function() {
  513.       self.flagMask(false);
  514.       $(".closeBtn").trigger("click");
  515.     }
  516.     self.runEntry = function()
  517.     {
  518.       var mes = "";
  519.       
  520.       mes += "ひとつめ「" + self.inputDateArea01.inputData() + "」\n";
  521.       mes += "ふたつめ「" + self.inputDateArea02.inputData() + "」\n";
  522.       
  523.       alert(mes);
  524.     }
  525.   }
  526.   $(document).ready(function () {
  527.     ko.applyBindings(new ViewModel());
  528.   });
  529. </script>
  530. <style type="text/css">
  531. .inData
  532. {
  533.   position:absolute;
  534.   top:3px;
  535.   left:80px;
  536. }
  537. .inData:before{
  538.   content: "";
  539.   position: absolute;
  540.   top: 2px;
  541.   left: 0px;
  542.   border-top: 7px solid transparent;
  543.   border-bottom: 7px solid transparent;
  544.   border-right: 11px solid #999;
  545. }
  546. .inDataBox
  547. {
  548.   background:#fff;
  549.   border:1px solid #999;
  550.   padding:30px 10px 10px;
  551.   margin-left:10px;
  552. }
  553. .closeBtn
  554. {
  555.   position:absolute;
  556.   top:5px;
  557.   right:5px;
  558.   background:#666;
  559.   color:#fff;
  560.   font-weight:bold;
  561.   cursor:pointer;
  562.   font-size:10px;
  563. }
  564. .closeBtn:hover
  565. {
  566.   background:#ff0000;
  567. }
  568. .calendar
  569. {
  570.   border-collapse:collapse;
  571.   margin:0;
  572. }
  573. .calendar th, .calendar td
  574. {
  575.   border:1px solid #ccc;
  576.   padding:3px;
  577.   text-align:center;
  578.   cursor:pointer;
  579.   font-size:10pt;
  580. }
  581. .calendar th
  582. {
  583.   background:#ffddff;
  584. }
  585. .cToday
  586. {
  587.   font-weight:bold;
  588. }
  589. .calendar td:hover
  590. {
  591.   background:#ffddff;
  592. }
  593. .moveCal
  594. {
  595.   color:#0000ff;
  596.   cursor:pointer;
  597. }
  598. .moveCal:hover, .nowCal:hover
  599. {
  600.   color:#ff0000;
  601.   cursor:pointer;
  602. }
  603. .nowCal
  604. {
  605.   position:absolute;
  606.   bottom:0;
  607.   left:3px;
  608.   color:#0000ff;
  609.   cursor:pointer;
  610.   font-size:10pt;
  611. }
  612. </style>
  613. </head>
  614. <body>
  615. <!-- モーダルウィンドウのマスク用 -->
  616. <div id="ModalMask" data-bind="koModalMask: maskModal, maskOpacity: 0.15, click: clickMask"></div>
  617. <h1>カレンダーから年月日を入力するってのを複数設置・改</h1>
  618. <p>カレンダーの個数が増えたときに記述する内容を減らしてみた。</p>
  619. <div data-bind="with: inputDateArea01">
  620. <h2>カレンダーから日付入力1</h2>
  621. <!-- ko template: {name: 'SupportCalendar'}  --><!-- /ko -->
  622. </div>
  623. <div data-bind="with: inputDateArea02">
  624. <h2>カレンダーから日付入力2</h2>
  625. <!-- ko template: {name: 'SupportCalendar'}  --><!-- /ko -->
  626. </div>
  627. <div data-bind="with: inputDateArea03">
  628. <h2>カレンダーから日付入力3</h2>
  629. <!-- ko template: {name: 'SupportCalendar'}  --><!-- /ko -->
  630. </div>
  631. <div data-bind="with: inputDateArea04">
  632. <h2>カレンダーから日付入力4</h2>
  633. <!-- ko template: {name: 'SupportCalendar'}  --><!-- /ko -->
  634. </div>
  635. <div data-bind="with: inputDateArea05">
  636. <h2>カレンダーから日付入力5</h2>
  637. <!-- ko template: {name: 'SupportCalendar'}  --><!-- /ko -->
  638. </div>
  639. <div data-bind="with: inputDateArea06">
  640. <h2>カレンダーから日付入力6</h2>
  641. <!-- ko template: {name: 'SupportCalendar'}  --><!-- /ko -->
  642. </div>
  643. <script type="text/html" id="SupportCalendar">
  644.   <div style="position:relative;top:0;left:0;">
  645.     <input type="text" data-bind="value: inputData" />
  646.     <button data-bind="click: openModal">モーダル・カレンダー</button><br />
  647.     <!-- ▼モーダルウィンドウ内 -->
  648.     <div class="inData" data-bind="koModalWindow: windowModal, modalBgColor: 'transparent'">
  649.       <div class="inDataBox">
  650.         <table class="calendar">
  651.         <caption>
  652.         <div style="position:relative;top:0;left:0;">
  653.         <span class="moveCal" data-bind="click: function(){moveCal(-1);}">&laquo;</span>
  654.         <span data-bind="text: valYearMonth"></span>
  655.         <span class="moveCal" data-bind="click: function(){moveCal(1);}">&raquo;</span>
  656.         <span class="nowCal" data-bind="click: function(){moveCal(0);}">今月</span>
  657.         </div>
  658.         </caption>
  659.         <thead><tr><th>日</th><th>月</th><th>火</th><th>水</th><th>木</th><th>金</th><th>土</th></tr></thead>
  660.         <tbody data-bind="foreach: weekData()">
  661.         <tr data-bind="foreach: $data">
  662.         <td data-bind="text: day, click: $parents[1].addData, css: {'cToday': $parents[1].cToday(day)}, style: num==0 ? {'color': 'red'}: {}"></td>
  663.         </tr>
  664.         </tbody>
  665.         </table>
  666.         <span class="closeBtn" data-bind="event: {click: closeModal }, clickBubble: false">×</span>
  667.       </div>
  668.     </div>
  669.     <!-- ▲モーダルウィンドウ内 -->
  670.   </div>
  671. </script>
  672. <button tabindex="2" data-bind="click: runEntry" />登録完了</button><br />
  673. <div style="font-size:10pt;text-align:right;margin-top:0.5em;">
  674. <a href="//tips.recatnap.info/" target="_top">PCスキルの小技・忘却防止メモ</a> -
  675. <a href="//tips.recatnap.info/wiki/" target="_top">PCスキルの小技・忘却防止メモのまとめ(wiki)</a>
  676. </div>
  677. <div style="font-size:10pt;text-align:center;margin-top:0.5em;padding:0.5em;border-top:1px solid #ccc;">
  678. Copyright &copy; 2009 by PCスキルの小技・忘却防止メモ. All rights reserved.
  679. </div>
  680. </body>
  681. </html>