docs: function w3calgo(s, d) {
          var carry, temp, tempDays, e = {};
          //months
          temp = s.M + d.M;
          e.M = modulo(temp, 1, 13);
          carry = fQuotient(temp, 1, 13);
          // years
          e.Y = s.Y + d.Y + carry;
          // zone
          // e.Z = s.Z;
          // seconds 
          temp = s.S + d.S;
          e.S = modulo(temp, 60);
          carry = fQuotient(temp, 60);
          // minutes
          temp = s.m + d.m + carry;
          e.m = modulo(temp, 60);
          carry = fQuotient(temp, 60);
          // hours	
          temp = s.H + d.H + carry;
          e.H = modulo(temp, 24);
          carry = fQuotient(temp, 24);
          // days
          if (s.D > maximumDayInMonthFor(e.Y, e.M)) {
              tempDays = maximumDayInMonthFor(e.Y, e.M);
          } else if (s.D < 1) {
              tempDays = 1;
          } else {
              tempDays = s.D;
          }
          e.D = tempDays + d.D + carry;
          // start loop
          while (true) {
              if (e.D < 1) {
                  e.D = e.D + maximumDayInMonthFor(e.D, e.M - 1);
                  carry = -1;
              } else if (e.D > maximumDayInMonthFor(e.Y, e.M)) {
                  e.D = e.D - maximumDayInMonthFor(e.Y, e.M);
                  carry = 1;
              } else {
                  break;
              }
              temp = e.M + carry;
              e.M = modulo(temp, 1, 13);
              e.Y = e.Y + fQuotient(temp, 1, 13);
          }
          e.Y = e.Y | 0;
          // in js dates month start at 0.
          e.M = e.M - 1 | 0;
          e.D = e.D | 0;
          e.H = e.H | 0;
          e.m = e.m | 0;
          e.S = e.S | 0;
          return new Date(e.Y, e.M, e.D, e.H, e.m, e.S);
      }