function isValidDate(dateStr) {
// Checks for the following valid date formats:
// DD/MM/YYYY DD.MM.YYYY DD-MM-YYYY
var datePat = /^(\d{1,2})(\/|.|-)(\d{1,2})\2(\d{4})$/; // requires 4 digit year

var matchArray = dateStr.match(datePat); // is the format ok?
if (matchArray == null) {
alert("Ugyldig datoformat. Prøv igjen.")
return false;
}
month = matchArray[3]; // parse date into variables - modifisert BB
day = matchArray[1]; //modifisert BB
year = matchArray[4];
if (month < 1 || month > 12) { // check month range
alert("Måned må være mellom 1 og 12.");
return false;
}
if (day < 1 || day > 31) {
alert("Dag må være mellom 1 og 31.");
return false;
}
if ((month==4 || month==6 || month==9 || month==11) && day==31) {
alert("Måneden "+month+" har ikke 31 dager!")
return false;
}
if (month == 2) { // check for february 29th
var isleap = (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0));
if (day>29 || (day==29 && !isleap)) {
alert("Februar " + year + " har ikke " + day + " dager!");
return false;
   }
}
return true;
}

function dispDate(dateObj){
month=dateObj.getMonth()+1;
month=(month<10)?'0'+month:month;
day=dateObj.getDate();
day=(day<10)?'0'+day:day;
year=dateObj.getYear();
if(year<2000)year+=1900;
return('Termin dato: '+day+'.'+month+'.'+year);
}

function asDate(dateNo){	// gjør om fra norsk dato til amerikansk for bruk i datoobjekt
var datePat = /^(\d{1,2})(\/|.|-)(\d{1,2})\2(\d{4})$/; 
var matchArray=dateNo.match(datePat);
month=matchArray[3]; // parse date into variables
day=matchArray[1];
year=matchArray[4];
return month+'/'+day+'/'+year;
}

function pregnancyCalc(pregform) {
menstrual=new Date(); // creates new date objects
ovulation=new Date();
duedate=new Date();
today=new Date();
cycle=0, luteal=0; // sets variables to invalid state ==> 0

if(isValidDate(pregform.menstrual.value)){ // Validates menstual date 
menstrualinput=new Date(asDate(pregform.menstrual.value));
menstrual.setTime(menstrualinput.getTime())
}
else return false; // otherwise exits

cycle=(pregform.cycle.value==''?28:pregform.cycle.value); // defaults to 28
// validates cycle range, from 21 to 35
if(pregform.cycle.value!=''&&(pregform.cycle.value<21||pregform.cycle.value>35)) {
alert("Sykluslengden din er enten for kort eller for lang\n"
+"til at beregningen blir nøyaktig! Vi vil likevel\n"
+"gjøre beregningene med dine tall.");
}

luteal=(pregform.luteal.value==''?14:pregform.luteal.value); // defaults to 14
// validates luteal range, from 9 to 16
if(pregform.luteal.value!=''&&(pregform.luteal.value<9||pregform.luteal.value>16)) {
alert("Your luteal din er enten for kort eller for lang\n"
+"til at beregningen blir nøyaktig! Vi vil likevel\n"
+"gjøre beregningene med dine tall.");
}

// sets ovulation date to menstrual date + cycle days - luteal days
// the '*86400000' is necessary because date objects track time
// in milliseconds;  86400000 milliseconds equals one day
ovulation.setTime(menstrual.getTime() + (cycle*86400000) - (luteal*86400000));
pregform.conception.value = dispDate(ovulation);

// sets due date to ovulation date plus 269 days
duedate.setTime(ovulation.getTime() + 269*86400000);
pregform.duedate.value = dispDate(duedate);

// sets fetal age to 14 + 269 (pregnancy time) - time left
var fetalage = 14 + 269 - ((duedate - today) / 86400000);
weeks = parseInt(fetalage / 7); // sets weeks to whole number of weeks
days = Math.floor(fetalage % 7); // sets days to the whole number remainder

// fetal age message, automatically includes 's' on week and day if necessary
fetalage = weeks + " uker" + (weeks > 1 ? "" : "") + ", " + days + " dager";
pregform.fetalage.value = fetalage;

return false; // form should never submit, returns false
}
