def next_due(now = DateTime.now)
time = now
orig_time = time
while !ready?(time)
unless min.include?(time.min)
ind = (min + [time.min]).sort.index(time.min)
if min.length == ind
time += (60 - time.min + min.first)/ (60*24.0)
else
time += (min[ind] - time.min) / (60 * 24.0)
end
end
unless hour.include?(time.hour)
ind = (hour + [time.hour]).sort.index(time.hour)
if hour.length == ind
time += (24 - time.hour + hour.first)/ 24.0
else
time += (hour[ind] - time.hour) / 24.0
end
end
unless mday.include?(time.mday)
ind = (mday + [time.mday]).sort.index(time.mday)
if mday.length == ind
time = (time >> 1) - time.mday + mday.first
else
time += mday[ind] - time.mday
end
end
unless mon.include?(time.mon)
ind = (mon + [time.mon]).sort.index(time.mon)
if mon.length == ind
time = time >> (12 - time.mon + mon.first)
else
time = time >> (mon.first - time.mon)
end
end
unless wday.include?(time.wday)
ind = (wday + [time.wday]).sort.index(time.wday)
if wday.length == ind
time = time + (7 - time.wday + wday.first)
else
time = time + (wday.first - time.wday)
end
end
if time > (orig_time >> 360)
time = nil
break
end
end
time
end