    function Today() {
        var today = new Date();
        this.year = today.getYear();
        if (this.year < 2000) this.year = this.year + 1900;
        this.month = today.getMonth() + 1;
        this.day = today.getDate();
    }

    function BaseDate(year, month, day) {
        this.year = year;
        this.month = month;
        this.day = day;
    }

    function displayAge(birth) {
        return computeAgeDifference(new Today(), birth);
    }

    function computeAgeDifference(death, birth) {
        return computeAge(death.year, death.month, death.day,
                          birth.year, birth.month, birth.day);
    }

    function computeAge(yd, md, dd, yb, mb, db) {

        if (yd == null || yd.length == 0 ||
                md == null || md.length == 0 ||
                dd == null || dd.length == 0 ||
                yb == null || yb.length == 0 ||
                mb == null || mb.length == 0 ||
                db == null || db.length == 0) {
            alert("Invalid death and birth date specified");
            return;
       }

       // 0 if Gregorian, 1 is Julian
       var isJulian = 0;

       if (!checkNumber(dd, 1, getMonthLength(md,yd,isJulian),"Day of death") ||
           !checkNumber(db, 1, getMonthLength(mb,yb,isJulian), "Day of birth")) {
          return;
       }

       var ma=0;
       var ya=0;

       var da = dd-db;

        // This is the all-important day borrowing code.
        if (da<0) {
            md--;
            // Borrow months from the year if necesssary.
            if (md < 1) {
                yd--;
                md = md + 12;
            }

            ml = getMonthLength(md, yd, isJulian);
            da=da+ml;
        }

        ma = md - mb;
        // Month borrowing code - borrows months from years.
        if (ma < 0) {
            yd--;
            ma=ma+12;
        }

        ya = yd - yb;

        return ya + " years " + ma + " months " + da + " days"
    }

    // Gets the length of the specified month.
    // month      = 1 for January through 12 for December
    // year       = the four digit year
    // julianFlag = 0 if Gregorian, 1 if Julian
    function getMonthLength(month, year, julianFlag) {

       var ml;

       if (month==1 || month==3 || month==5 || month==7 ||
               month==8 || month==10||month==12) {
           ml = 31;
       } else {
           if (month==2) {
              ml = 28;
              if (!(year%4) && (julianFlag==1 || year%100 || !(year%400))) {
                 ml++;
              }
           } else {
               ml = 30;
           }
       }
       return ml;    
    }

    function checkNumber(str, min, max, msg) {

        msg = msg + " field has invalid data: " + str;

        for (var i = 0; i < str.length; i++) {
            var ch = str.substring(i, i + 1)
            if ((ch < "0" || "9" < ch) && ch != '.') {
                alert(msg);
                return false;
            }
        }
        var num = 0 + str;
        if (num < min || max < num) {
            alert(msg + " not in range [" + min + ".." + max + "]");
            return false;
        }
        return true;
    }

