<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html
  PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  <head>
    <title> Test Date-Elements </title>
    <meta name="author" content="Administrator"/>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <link rel="stylesheet" type="text/css"
      href="html5-form-dates2.css" title="style1"/>
      

      <script type="text/javascript">
        // <![CDATA[
          "use strict;"
          function  showData( form ) {
          "use strict;"
          alert ("day: "+form.day.value +"\n"+
           "month: "+form.month.value+"\n"+
           "year: "+form.year.value+"\n"+
           "datetime: "+form.datetime.value+"\n"+
           "datetime_local: "+form.datetime_local.value+"\n"+
           "date: "+form.date.value+"\n"+
           "week: "+form.week.value+"\n"+
           "time: "+form.time.value) ;
          }

         function absolutDay(day, month, year) {
          var delta_tage = new Array(0,3,3,6,8,11,13,16,19,21,24,26);
          var j4, j100, j400;
          var f;
          if ( (day==0) || (month==0) ||(year==0) ) return 0;
          f=365.25*(year-1.0) +28.0*(month-1.0)+delta_tage[month-1]+day;
          if (month>2) {
            // 2000 ist Schaltjahr   1900 nicht
            j4=year % 4;    
            j100=year % 100; // Schaltjahr wenn = 0  1900 oder 2000
            j400=year % 400; // nun 2000  2400 
            if (  ((j4==0)&&(j100>0)) || (j400==0) ) f++;
          }
          return Math.floor(f);
         }  // absolutDay

         function isSchaltjahr(year) {
           var rest=year % 4;
           if (rest==0) {
              rest=year%100;
              if (rest==0) {
                rest=year%400;  // check 1900 2000
                if (rest==0) 
                  return true;
                else {
                  return false;
                }
              }
              else
                return true;
		}
            else {
              return false;
            }
          } // isSchaltjahr


	   function checkDate(day, month, year) {
            "use strict;"
            var maxtage=0;
	     if (day<=0 || day>31) return false;
	     if (month<=0 || month>12) return false;
	     if (year<1900 || year>2200) return false;
           switch (month) {
		case 1:
		case 3:
		case 4:
		case 7:
		case 8:
		case 10:
		case 12: maxtage=31;  
			  break;
		case 4:
		case                                                                                                                                                                                6:
		case 9:
		case 11: maxtage=30;  break;
		case 2: var rest=year % 4;
                     if (rest==0) {
                       rest=year%100;
			   if (rest==0) {
                         rest=year%400;  // check 1900 2000
                         if (rest==0) 
                           maxtage=29;
                         else
                           maxtage=28;
                       }
			   else {
                        maxtage=29;
                       }
			}
			else {
		         maxtage=28;
			}
		} // switch
	      // alert("maxtage: "+maxtage);
             return day<=maxtage;
          }  // checkDate

	   function checkYear(year) {
            "use strict;"
	     if (year<1900 || year>2200) 
              return false;
            else
	     return true;
          }

	 
	   function checkTime(hour, min, sec) {
            "use strict;"
            if (hour<0 || hour>23 ) return false;
            if (min<0 || min>59 ) return false;
            if (sec<0 || sec>59 ) return false;
	     return true;
          }


          function  checkFormDayDate( value) {
            "use strict;"
            var values = value.split(".");
            if (values.length<3) {
                 alert("Falsches Datumsformat: \n"+value);
                 return false;
            }
            else {
              var day, month, year;
 		 if ( isNaN(values[0]) ) {
                 alert("Falsches Datumsformat: \n"+value);
                 return false;
		 }
		 else {
                day = parseInt(values[0]);
		 }
 		 if ( isNaN(values[1]) ) {
                 alert("Falsches Datumsformat: \n"+value);
                 return false;
		 }
		 else {
                month = parseInt(values[1]);
		 }
 		 if ( isNaN(values[2]) ) {
                 alert("Falsches Datumsformat: \n"+value);
                 return false;
		 }
		 else {
                year = parseInt(values[2]);
		 }

              if (checkDate(day, month, year)) {
                 alert("Day: "+day+"   Month: "+month+"   Year: "+year);
                 return true;
              }
              else {
                alert("Falsches Datumsformat: \n"+value);
                 return false;
              }
            } // if (values.length<3) {
          }


          function  checkFormMonth( value) {
            "use strict;"
            var values = value.split(" ");
            if (values.length<2) {
                 alert("Falsches Monatsformat: \n"+value);
                 return false;
            }
            else {
              var month, year;
		month = values[0];
		if ( isNaN(values[1]) ) {
                 alert("Falsches Monatsformat: \n"+value);
                 return false;
		}
		else {
               year= parseInt(values[1]);
		}

              if (!checkYear(year)) {
                 alert("Falsches Monatsformat: \n"+value);
                 return false;
              }
              var month2 = month.toLowerCase();
              if (month2=="januar" || month2=="februar" || month2=="märz" || month2=="april" ||
               month2=="mai" || month2=="juni" || month2=="juli" || month2=="august" ||
               month2=="september" || month2=="oktober" || month2=="november" || month2=="dezember" ) {
                 alert("Korrektes Monatsformat: \n"+"Monat: "+month+"   Jahr: "+year);
                 return true;
              }
              else {
                 alert("Falsches Monatsformat: \n"+value);
                 return false;
              }
            } // if (values.length<2) {
          }  // checkFormMonth

          function  checkFormYear( value) {
            "use strict;"
            if ( isNaN(value) ) {
               alert("Falsches Jahresformat: \n"+value);
               return false;
            }
	     else {
              year = parseInt(value);
              if (checkYear(year)) {
                 alert("Year: "+year);
                 return true;
              }
              else {
                alert("Falsches Jahresformat: \n"+value);
                return false;
              }
            }
          }

          function  checkFormDatetime( value) {
            "use strict;"
            var values = value.split(" ");
            if (values.length<2) {
                 alert("Falsches DateTimeformat: \n"+value);
                 return false;
            }
            else {
              if (!checkFormDayDate(values[0])) return false;
              if (!checkFormTime(values[1])) return false;
	       return true;
            } // if (values.length<2) {
          }

          function checkWeek(week, year) {
            "use strict;"
	     if (week<0 || week>53) return false;
	     if (year<1900 || year>2200) return false;
            var zeit1, zeit2, zeit3;
            zeit1 = absolutDay(1, 1, 1900);  // dies ist ein Montag 
            zeit2 = absolutDay(1, 1, year);
            zeit3 = zeit2 - zeit1-1;
            var weekday = zeit3 %7;  // 0=montag
              // wenn 1.1.year auf einem Donnerstag liegt, gibt es 53 Wochen
            var countWeeks;
            if (weekday==3) 
              countWeeks=53;
            else
              countWeeks=52;
	     return week>0 && week<=countWeeks;
          }

          function checkWeek2(week, year) {
            "use strict;"
	     if (week<0 || week>53) return false;
	     if (year<1900 || year>2200) return false;
            var myDate = new Date(1,1,year);
            var weekday = myDate.getDay();  // 0=Montag
              // wenn 1.1.year auf einem Donnerstag liegt, gibt es 53 Wochen
            var countWeeks;
            if (weekday==3) 
              countWeeks=53;
            else
              countWeeks=52;
	     return week>0 && week<=countWeeks;
          }



           // Woche 56, 2015
		/*
		Die Kalenderwoche ist nach ISO 8601 so definiert:
		Kalenderwochen haben 7 Tage, beginnen an einem Montag und werden über das Jahr fortlaufend nummeriert.
		Die Kalenderwoche 1 eines Jahres ist diejenige, die den ersten Donnerstag enthält.
		Gleichwertig dazu kann man die Kalenderwoche 1 eines Jahres auch festlegen als
		diejenige, die als erste überwiegend im neuen Jahr liegt,
		diejenige, die als erste mindestens 4 Tage des neuen Jahres enthält, oder
		diejenige, die den 4. Januar enthält.
		Weitere Eigenschaften dieser Zählweise sind:
			Jedes Jahr hat entweder 52 oder 53 Kalenderwochen.
			Ein Jahr hat genau dann 53 Kalenderwochen, wenn es mit einem Donnerstag beginnt oder endet:
			Ein Gemeinjahr mit 53 Wochen beginnt und endet an einem Donnerstag.
			Ein Schaltjahr mit 53 Wochen beginnt entweder an einem Mittwoch und endet an einem Donnerstag oder es beginnt an einem Donnerstag und endet an einem Freitag.
		Der 29., 30. und 31. Dezember können schon zur Kalenderwoche 1 des Folgejahres gehören.
		Der 1., 2. und 3. Januar können noch zu der letzten Kalenderwoche des Vorjahres gehören.
		*/
          function  checkFormWeek( value) {
            "use strict;"
            var values = value.split(",");  // "Woche 56", und  "2015"
            if (values.length<2) {
                 alert("Falsches DateWochenformat: \n"+value);
                 return false;
            }
            var year;
            if ( isNaN(values[1]) ) {
                 alert("Falsches Jahresformat: \n"+value);
                 return false;
	      }
             year=parseInt(values[1]);
             if (!checkYear(year)) {
                 alert("Falsches Jahr: \n"+value);
                 return false;
             }
            var week=values[0]; // Woche 56
            var values = week.split(" ");  // "Woche 56"
            if ( isNaN(values[1]) ) {
                 alert("Falsches Monatsformat: \n"+value);
                 return false;
	      }
             week=parseInt(values[1]);
             if (checkWeek(week, year)) {                             // checkWeek
               alert("Woche: "+week+"    Jahr: "+year);
               return true;
             }
             else {
               alert("falsche Woche");
               return false;
             }
          } // checkFormWeek


          function  checkFormTime( value) {
            "use strict;"
            var values = value.split(":");
            if (values.length<2) {
                 alert("Falsches Zeitformat: \n"+value);
                 return false;
            }
            else {
              var hour, min, sec;
		if ( isNaN(values[0]) ) {
                 alert("Falsches Zeitformat: \n"+value);
                 return false;
		}
		else {
               hour= parseInt(values[0]);
		}
		if ( isNaN(values[1]) ) {
                 alert("Falsches Zeitformat: \n"+value);
                 return false;
		}
		else {
               min= parseInt(values[1]);
		}


              if (values.length==3) {
  		  if ( isNaN(values[2]) ) {
                 alert("Falsches Zeitformat: \n"+value);
                 return false;
               }
               else {
                 sec= parseInt(values[2]);
               }
              }
              else
                sec=0; 
              if (checkTime(hour, min, sec)) {
                 alert("Hour: "+hour+"   Min: "+min+"   Sec: "+sec);
                 return true;
              }
              else {
                alert("Falsches Zeitformat: \n"+value);
                 return false;
              }
            } // if (values.length<2) {
          }  // checkFormTime

          // ]]>
        </script>
        
      </head>
      
<body>
  <h1>Test date-Elements</h1>
      
  <form> 
    day: <input type="day" name="day" value="31.02.2015" /><br /><br />
    month: <input type="month" name="month" value="Maerz 2015" /><br /><br />
    year: <input type="year" name="year" value="-1955" /><br /><br />
    datetime: <input type="datetime" name="datetime" value="31.02.2015 10:66" /> <br /><br />
    datetime_local: <input type="datetime_local" name="datetime_local" value="31.02.2015 10:66" /> <br /><br />
    date: <input type="date"  name="date" value="31.02.2015" /> <br /><br />
    week: <input type="week" name="week" value="Woche 56, 2015" /><br /><br />
    time: <input type="time" name="time" value="25:66" /> <br /><br />
    
   <input type="button" value="Show Data" onclick="showData(this.form)"/>
   <br />
   <br />
   <input type="button" value="Check Day" onclick="checkFormDayDate(day.value)"/>
   <input type="button" value="Check Date" onclick="checkFormDayDate(date.value)"/>
   <input type="button" value="Check Month" onclick="checkFormMonth(month.value)"/>
   <input type="button" value="Check Year" onclick="checkFormYear(year.value)"/>
   <input type="button" value="Check datetime" onclick="checkFormDatetime(datetime.value)"/>
   <input type="button" value="Check datetime_local" onclick="checkFormDatetime(datetime_local.value)"/>
   <input type="button" value="Check Week" onclick="checkFormWeek(week.value)"/>
   <input type="button" value="Check Time" onclick="checkFormTime(time.value)"/>

    
  </form>
  
</body>


</html>


















