
///////////////////////////////////////////////////////////////////////////////
//
// Global variables to be initialised in data_config.js or data_autogen.js
//
///////////////////////////////////////////////////////////////////////////////

var deptarray = new Array();
var actgrouparray = new Array();
var equipmentarray = new Array();
var locgrouparray = new Array();
var staffarray = new Array();
var studentsetarray = new Array();

var weekarray = new Array();
var weekrangearray = new Array();
var weekdayarray = new Array();

var startMonday;
var startPeriod;
var endPeriod;
var firstDayInWeek;
var lastDayInWeek;

///////////////////////////////////////////////////////////////////////////////
//
// Classes, mainly used for menu generation
//
///////////////////////////////////////////////////////////////////////////////

//START Objects 
function  dept(name, description, hostkey) {
	this.name = name;
	this.description = description;
	this.hostkey = hostkey;
}

function  actgroup(name, description, hostkey, department) {
	this.name = name;
	this.description = description;
	this.hostkey = hostkey;
	this.department = department;
}

function  equipment(name, description, hostkey, department) {
	this.name = name;
	this.description = description;
	this.hostkey = hostkey;
	this.department = department;
}

function locgroup(name, description, hostkey, department) {
	this.name = name;
	this.description = description;
	this.hostkey = hostkey;
	this.department = department;
}

function  staff(name, description, hostkey, department) {
	this.name = name;
	this.description = description;
	this.hostkey = hostkey;
	this.department = department;
}

function  week(displayName, number, findFirstDay, findLastDay) {
	this.displayName = displayName;
	this.number = number;
	this.findFirstDay = findFirstDay;
	this.findLastDay = findLastDay;
}

function  weekrange(name, filter, weeks) {
	this.name = name;
	this.filter = filter;
	this.weeks = weeks;
}

function  weekday(name, days) {
	this.name = name;
	this.days = days;
}

///////////////////////////////////////////////////////////////////////////////
//
// Routines to populate menus
//
///////////////////////////////////////////////////////////////////////////////

function populateDepartmentFilter(ddlDepartments) {
	ddlDepartments.options.length = 0;
	ddlDepartments.options[0] = new Option();
	ddlDepartments.options[0].value = "all";
	ddlDepartments.options[0].text = "--- Alle Afdelingen ---";
	var j = 1;
    for (var i = 0; i < deptarray.length; i++) {
		ddlDepartments.options[j] = new Option();
		ddlDepartments.options[j].value = deptarray[i].hostkey;
		ddlDepartments.options[j].text = deptarray[i].name;
		j++;
    }
	if (ddlDepartments.options.length != 0) {
		ddlDepartments.options[0].selected = true;
	}
}

function populateActGroups(lbxActGroups) {
	lbxActGroups.options.length = 0;
    for (var i = 0; i < actgrouparray.length; i++) {
		lbxActGroups.options[i] = new Option();
		lbxActGroups.options[i].value = actgrouparray[i].hostkey;
		lbxActGroups.options[i].text = actgrouparray[i].name;
    } 
	if (lbxActGroups.options.length != 0) {
		lbxActGroups.options[0].selected = true;
	}
}

function populateEquipment(lbxEquipment) {
	lbxEquipment.options.length = 0;
    for (var i = 0; i < equipmentarray.length; i++) {
		lbxEquipment.options[i] = new Option();
		lbxEquipment.options[i].value = equipmentarray[i].hostkey;
		lbxEquipment.options[i].text = equipmentarray[i].name;
    } 
	if (lbxEquipment.options.length != 0) {
		lbxEquipment.options[0].selected = true;
	}
}

function populateLocGroups(lbxLocGroups) {
	lbxLocGroups.options.length = 0;
    for (var i = 0; i < locgrouparray.length; i++) {
		lbxLocGroups.options[i] = new Option();
		lbxLocGroups.options[i].value = locgrouparray[i].hostkey;
		lbxLocGroups.options[i].text = locgrouparray[i].name;
    } 
	if (lbxLocGroups.options.length != 0) {
		lbxLocGroups.options[0].selected = true;
	}
}

function populateStaffmembers(lbxStaffmembers) {
	lbxStaffmembers.options.length = 0;
    for (var i = 0; i < staffarray.length; i++) {
		lbxStaffmembers.options[i] = new Option();
		lbxStaffmembers.options[i].value = staffarray[i].hostkey;
		lbxStaffmembers.options[i].text = staffarray[i].name;
    } 
	if (lbxStaffmembers.options.length != 0) {
		lbxStaffmembers.options[0].selected = true;
	}
}

function populateWeeks(ddlWeeks) {
	var actWeek= getWeekNumber(new Date());
	ddlWeeks.options.length = 0;
	var selOption = 0;
	var j = 0;

	for (var i = 0; i < weekrangearray.length; i++) {
		ddlWeeks.options[j] = new Option();
		ddlWeeks.options[j].value = weekrangearray[i].weeks;
		ddlWeeks.options[j].text = weekrangearray[i].name;
		j++;
    }
    for (var i = 0; i < weekarray.length; i++) {
		ddlWeeks.options[j] = new Option();
		ddlWeeks.options[j].value = weekarray[i].number;
		ddlWeeks.options[j].text = weekarray[i].displayName;
		if (actWeek == weekarray[i].number) {
			selOption = j;
		}
		j++;
    } 
    ddlWeeks.options[selOption].selected = true;
}

function populateDays(ddlDays) {
	ddlDays.options.length = 0;
    for (var i = 0; i < weekdayarray.length; i++) {
		ddlDays.options[i] = new Option();
		ddlDays.options[i].value = weekdayarray[i].days;
		ddlDays.options[i].text = weekdayarray[i].name;
    } 
	if (ddlDays.options.length != 0) {
		ddlDays.options[0].selected = true;
	}
}

function populateFilteredObjects(lbxObjects,ddlSearchby,strObjectClass,ddlWeeks) {
	var selValue = ddlSearchby.options[ddlSearchby.selectedIndex].value;
	var selObjectClass = strObjectClass;
	lbxObjects.options.length = 0;
	switch(selObjectClass) {
		case "actgroups":
			var j = 0;
			for (var i = 0; i < actgrouparray.length; i++) {
				if(selValue == "all" || actgrouparray[i].department == selValue) {
					lbxObjects.options[j] = new Option();
					lbxObjects.options[j].value = actgrouparray[i].hostkey;
					lbxObjects.options[j].text = actgrouparray[i].name;
					j++;
				}
			} 
			break;
		case "equipment":
			var j = 0;
			for (var i = 0; i < equipmentarray.length; i++) {
				if(selValue == "all" || equipmentarray[i].department == selValue) {
					lbxObjects.options[j] = new Option();
					lbxObjects.options[j].value = equipmentarray[i].hostkey;
					lbxObjects.options[j].text = equipmentarray[i].name;
					j++;
				}
			} 
			break;
		case "locgroups":
			var j = 0;
			for (var i = 0; i < posarray.length; i++) {
				if(selValue == "all" || posarray[i].department == selValue) {
					lbxObjects.options[j] = new Option();
					lbxObjects.options[j].value = posarray[i].hostkey;
					lbxObjects.options[j].text = posarray[i].name;
					j++;
				}
			} 
			break;
		case "staff":
			var j = 0;
			for (var i = 0; i < staffarray.length; i++) {
				if(selValue == "all" || staffarray[i].department == selValue) {
					lbxObjects.options[j] = new Option();
					lbxObjects.options[j].value = staffarray[i].hostkey;
					lbxObjects.options[j].text = staffarray[i].name;
					j++;
				}
			}
			break;
	}
	if (lbxObjects.options.length != 0) {
		lbxObjects.options[0].selected = true;
	}
	var actWeek= getWeekNumber(new Date());
	switch(selValue){
		case "MET":
			ddlWeeks.options.length = 0;
			var selOption = 0;
			var j = 0;
			for (var i = 0; i < weekrangearray.length; i++) {
				if (weekrangearray[i].filter == selValue) {
					ddlWeeks.options[j] = new Option();
					ddlWeeks.options[j].value = weekrangearray[i].weeks;
					ddlWeeks.options[j].text = weekrangearray[i].name;
					j++;
				}
			}
			for (var i = 0; i < weekarray.length; i++) {
				ddlWeeks.options[j] = new Option();
				ddlWeeks.options[j].value = weekarray[i].number;
				ddlWeeks.options[j].text = weekarray[i].displayName;
				if (actWeek == weekarray[i].number) {
					selOption = j;
				}
				j++;
			} 
			ddlWeeks.options[selOption].selected = true;
			break;
		case "OCE":
			ddlWeeks.options.length = 0;
			var selOption = 0;
			var j = 0;
			for (var i = 0; i < weekrangearray.length; i++) {
				if (weekrangearray[i].filter == selValue) {
					ddlWeeks.options[j] = new Option();
					ddlWeeks.options[j].value = weekrangearray[i].weeks;
					ddlWeeks.options[j].text = weekrangearray[i].name;
					j++;
				}
			}
			for (var i = 0; i < weekarray.length; i++) {
				ddlWeeks.options[j] = new Option();
				ddlWeeks.options[j].value = weekarray[i].number;
				ddlWeeks.options[j].text = weekarray[i].displayName;
				if (actWeek == weekarray[i].number) {
					selOption = j;
				}
				j++;
			} 
			ddlWeeks.options[selOption].selected = true;
			break;
		default:
			ddlWeeks.options.length = 0;
			var selOption = 0;
			var j = 0;
			for (var i = 0; i < weekrangearray.length; i++) {
				ddlWeeks.options[j] = new Option();
				ddlWeeks.options[j].value = weekrangearray[i].weeks;
				ddlWeeks.options[j].text = weekrangearray[i].name;
				j++;
			}
			for (var i = 0; i < weekarray.length; i++) {
				ddlWeeks.options[j] = new Option();
				ddlWeeks.options[j].value = weekarray[i].number;
				ddlWeeks.options[j].text = weekarray[i].displayName;
				if (actWeek == weekarray[i].number) {
					selOption = j;
				}
				j++;
			} 
			ddlWeeks.options[selOption].selected = true;
			break;
	}
}

function openWindow(url){
	window.location = url.value;
}
///////////////////////////////////////////////////////////////////////////////
//
// Utility routine, used to define the sort order for a sort done 
// in data_autogen.js.
//
///////////////////////////////////////////////////////////////////////////////

function NameOrder (a, b) {
    if (a.name < b.name) {
        return -1;
    } else if (a.name > b.name) {
        return +1;
    } else {
        return 0;
    }
}

function DescriptionOrder (a, b) {
    if (a.description < b.description) {
        return -1;
    } else if (a.description > b.description) {
        return +1;
    } else {
        return 0;
    }
}

function TimestampOrder (a, b) {
    if (a.timestamp > b.timestamp) {
        return -1;
    } else if (a.timestamp < b.timestamp) {
        return +1;
    } else {
        return 0;
    }
}
///////////////////////////////////////////////////////////////////////////////
//
// Functions called directly 
//
///////////////////////////////////////////////////////////////////////////////


function initActGroupMenus(){
	//initDepartments();
	initActivityGroups();
	initWeeks();
	initWeekranges();
	initWeekdays();
	//populateDepartmentFilter(document.selForm.ddlDepartments);
	populateActGroups(document.selForm.lbxActGroup);
	populateWeeks(document.selForm.ddlWeeks);
	populateDays(document.selForm.ddlDays);
}

function initEquipmentMenus(){
	initEquipment();
	initWeeks();
	initWeekranges();
	initWeekdays();
	populateEquipment(document.selForm.lbxEquipment);
	populateWeeks(document.selForm.ddlWeeks);
	populateDays(document.selForm.ddlDays);
}

function initLocGroupMenus(){
	initLocationGroups();
	initWeeks();
	initWeekranges();
	initWeekdays();
	populateLocGroups(document.selForm.lbxLocGroup);
	populateWeeks(document.selForm.ddlWeeks);
	populateDays(document.selForm.ddlDays);
}

function initStaffMenus(){
	//initDepartments();
	initStaffmembers();
	initWeeks();
	initWeekranges();
	initWeekdays();
	//populateDepartmentFilter(document.selForm.ddlDepartments);
	populateStaffmembers(document.selForm.lbxStaff);
	populateWeeks(document.selForm.ddlWeeks);
	populateDays(document.selForm.ddlDays);
}

function displayTimetable(ObjectClass, lbxObjects, ddlWeeks, ddlDays, rbtStyle, rbtLanguage) {
	var swsUrl = "";
	var selTemplateStyleStr = "";
	var selObject = ""; 
	var selObjectsStr = "";
	var selWeeksStr = "";
	var selTempStr = "";
	var selStyleStr = "";
	var selDaysStr = "";
	var selPeriods = "1-" + endPeriod;
	var selLanguage = "nl";
	selObjectClass = ObjectClass.value;

	for (i = 0; i < rbtStyle.length; i++) {
	    if (rbtStyle[i].checked) {
          	selTemplateStyleStr = rbtStyle[i].value;
	    }
    }
	if (selTemplateStyleStr == "") {
		selTemplateStyleStr = rbtStyle.value;
	}
	switch (selTemplateStyleStr) {
		case 'individual':
			selStyleStr = "Individual";
			break;
		case 'textspreadsheet':
			selStyleStr = "TextSpreadsheet";
			break;
		case 'master':
			selStyleStr = "Master";
			break;
	}

	switch(selObjectClass)
	{
		case 'actgroup':
			selObject = swsURLActivityGroups;
				switch (selTemplateStyleStr) {
				case 'individual':
					selTempStr = "SWSCUST+ActivityGroup+Individual";
					break;
				case 'textspreadsheet':
					selTempStr = "SWSCUST+ActivityGroup+TextSpreadsheet";
					break;
				case 'master':
					selTempStr = "SWSCUST+ActivityGroup+Master";
					break;
			}
			break;
		case 'equipment':
			selObject = swsURLEquipment;
				switch (selTemplateStyleStr) {
				case 'individual':
					selTempStr = "SWSCUST+Equipment+Individual";
					break;
				case 'textspreadsheet':
					selTempStr = "SWSCUST+Equipment+TextSpreadsheet";
					break;
				case 'master':
					selTempStr = "SWSCUST+Equipment+Master";
					break;
			}
			break;
		case 'locgroup':
			selObject = swsURLLocationGroups;
				switch (selTemplateStyleStr) {
				case 'individual':
					selTempStr = "SWSCUST+LocationGroup+Individual";
					break;
				case 'textspreadsheet':
					selTempStr = "SWSCUST+LocationGroup+TextSpreadsheet";
					break;
				case 'master':
					selTempStr = "SWSCUST+LocationGroup+Master";
					break;
			}
			break;
		case 'staff':
			selObject = swsURLStaff;
				switch (selTemplateStyleStr) {
				case 'individual':
					selTempStr = "SWSCUST+Staff+Individual";
					break;
				case 'textspreadsheet':
					selTempStr = "SWSCUST+Staff+TextSpreadsheet";
					break;
				case 'master':
					selTempStr = "SWSCUST+Staff+Master";
					break;
			}
			break;
	}
    for (i = 0; i < rbtLanguage.length; i++) {
	    if (rbtLanguage[i].checked) {
          	selLanguage = rbtLanguage[i].value;
	    }
    }
	switch(selLanguage){
		case 'en':
			selTempStr = selTempStr + "+EN";
			break;
		default:
			selTempStr = selTempStr;
			break;
	}


    for (i = 0; i < lbxObjects.options.length; i++) {
	    if (lbxObjects.options[i].selected) {
	        id = lbxObjects.options[i].value;
          	selObjectsStr += "identifier=" + escapeForUrl(id) + "&";
	    }
    }

	if (selObjectsStr=="")
	{
		alert("You have not selected any Object!");
		return;
	}

	for (i = 0; i < ddlWeeks.options.length; i++) {
	    if (ddlWeeks.options[i].selected) {
          	selWeeksStr += ddlWeeks.options[i].value + ";";
	    }
    }

	if (selWeeksStr=="")
	{
		alert("You have not selected any Week!");
		return;
	}
	
	for (i = 0; i < ddlDays.options.length; i++) {
	    if (ddlDays.options[i].selected) {
          	selDaysStr += ddlDays.options[i].value + ";";
	    }
    }

	if (selDaysStr=="")
	{
		alert("You have not selected any Dayrange!");
		return;
	}

    swsUrl = swsUrlRoot + 
	swsURLReporting + "/" + selStyleStr +
	"?objectclass=" + selObject + 
	"&idtype=id&" + selObjectsStr +
    "days=" + selDaysStr + 
	"&periods=" + selPeriods +
	"&t=" + selTempStr +
    "&weeks=" + selWeeksStr +
	"&template=" + selTempStr;
	
	//alert(swsUrl);
	window.open(swsUrl);
}

function displayDetails(ObjectClass, lbxObjects) {
	var swsUrl = "";
	var selObject = ""; 
	var selObjectsStr = "";

	selObjectClass = ObjectClass;
	switch(selObjectClass)
	{
		case 'department':
			selObject = swsURLDepartments;
			break;
		case 'location':
			selObject = swsURLLocations;
			break;
		case 'staff':
			selObject = swsURLStaff;
			break;
		case 'pos':
			selObject = swsURLPOS;
			break;
		case 'studentset':
			selObject = swsURLStudentSets;
			break;
		case 'module':
			selObject = swsURLModules;
			break;
	}
    for (i = 0; i < lbxObjects.options.length; i++) {
	    if (lbxObjects.options[i].selected) {
	        id = lbxObjects.options[i].value;
          	selObjectsStr += "identifier=" + escapeForUrl(id) + "&";
	    }
    }

	if (selObjectsStr=="")
	{
		alert("You have not selected any Object!");
		return;
	}

    swsUrl = swsUrlRoot + 
	swsURLReporting + "/DataReport" +
	"?objectclass=" + selObject + 
	"&idtype=id&" + selObjectsStr +
	"&template=Locatie - Datareport" ;
	
	window.open(swsUrl);
}

function PrevNextWks(myurl,previous) {

	var query = location.search.substring(1);


	myurl = myurl.replace(/weeks/,"");
	myurl = myurl.replace(/template/,"");
	myurl = myurl.replace(/#/g,"%23");


	if (query != "")
	{
		var values = query.split("&");

		for (var i=0; i<values.length; i++)
		{
			var pos = values[i].indexOf('=');
			if (pos == -1) continue;
			var argument = values[i].substring(0,pos);


			if (argument == "t") {
				var template = values[i].substring(pos+1);
			}

			if (argument == "weeks") {


				var weekrange = values[i].substring(pos+1);

				if (weekrange.length < 1) {

					var date1 = new Date(startdate);
					var date2 = new Date();

					var date1temp = date1.getTime();
					var date2temp = date2.getTime();

					var datediff = date2temp - date1temp;


					weekrange = Math.floor(datediff / (1000 * 60 * 60 * 24 * 7));

					weekrange ++;

					if (weekrange < 1) {
						weekrange = 1;
					} else {
						if (weekrange > 52) {
							weekrange = 52;
						}
					}

				}

				weekrange = weekrange + ";";

				var weeklen = weekrange.length;
				var i = 0;

				var stweek;
				var enweek;

				var current = "";

				for (var j=i; j<weeklen; j++) {
					if (weekrange.substr(j,1) == ";") {
						break;
					}
					current = current + weekrange.substr(j,1);
				}

				if (current.length < 3) {
					stweek = parseInt(current);
					enweek = stweek;
				}
				else {
					if (current.length == 3) {
						stweek = parseInt(current.substr(0,1));
						enweek = parseInt(current.substr(2,1));
					}
					else {
						if (current.length == 4) {
							stweek = parseInt(current.substr(0,1));
							enweek = parseInt(current.substr(2,2));
						}
						else {
							stweek = parseInt(current.substr(0,2));
							enweek = parseInt(current.substr(3,2));
						}
					}
				}

				if (previous == true) {
					stweek = stweek -1;
					if (stweek < 1) stweek = 52;
				} else {
					stweek = stweek + 1
					if (stweek > 52) stweek = 1;
				}

				window.location = myurl + "&weeks="+ stweek + "&template=" + template;

				break;

			}
		}
	}
}
///////////////////////////////////////////////////////////////////////////////
//
// Utility routines
//
///////////////////////////////////////////////////////////////////////////////


/* Diese Funktion decodiert die Angaben im Pfad */

function decode(formular, url) {
	var returnArray = new Array();
	var url = url;
	if (url != "") {
		url = url.substring(1,url.length);                      // Die Daten werden aus der
       															// Url extrahiert und in
		liste = url.split("&");                                 // Wertepaare am & getrennen
		for (i=0;i<=liste.length-1;i++) {
			temp = liste[i].split("=");
				    											  // Feld und Daten jedes
			formular.splice(formular.length,2,temp[0],temp[1]);   // Paares werden zerlegt
		}
		if (temp.length>1) {
			for (i=0;i<=formular.length-1;i++) {
				formular[i] = formular[i].replace(/\+/g," ");			// Ersetzen des + durch Blank
				formular[i] = unEscapeForUrl(formular[i]);  	           // Escapesequenzen rekonstruieren
			}
			returnArray = formular
		}
	}
	return returnArray;
}

function escapeForRegExp(str){
	str = str.replace(/\(/g, "&");
	str = str.replace(/\)/g, "&");
	return(str);
}

function escapeForUrl(str) {
    str = str.replace(/%/g,  "%25");
    str = str.replace(/ /g,  "%20");
    str = str.replace(/"/g,  "%22");
    str = str.replace(/#/g,  "%23");
    str = str.replace(/&/g,  "%26");
    str = str.replace(/\//g, "%2F");
    str = str.replace(/:/g,  "%3A");
    str = str.replace(/;/g,  "%3B");
    str = str.replace(/`/g,  "%60");
    str = str.replace(/</g,  "%3C");
    str = str.replace(/=/g,  "%3D");
    str = str.replace(/>/g,  "%3E");
    str = str.replace(/\?/g, "%3F");
    str = str.replace(/\[/g, "%5B");
    str = str.replace(/\\/g, "%5C");
    str = str.replace(/\]/g, "%5D");
    str = str.replace(/\^/g, "%5E");
    str = str.replace(/{/g,  "%7B");
    str = str.replace(/\|/g, "%7C");
    str = str.replace(/}/g,  "%7D");
    str = str.replace(/~/g,  "%7E");
    //str = str.replace(/£/g,  "%A3");
    return str;
}

function unEscapeForUrl(str) {
    str = str.replace(/%25/g, "%");
    str = str.replace(/%20/g, " ");
	
    str = str.replace(/%22/g, "\"");
    str = str.replace(/%23/g, "#");
    str = str.replace(/%26/g, "&");
    str = str.replace(/%2F/g, "/");
    str = str.replace(/%3A/g, ":");
    str = str.replace(/%3B/g, ";");
    str = str.replace(/%60/g, "`");
    str = str.replace(/%3C/g, "<");
    str = str.replace(/%3D/g, "=");
    str = str.replace(/%3E/g, ">");
    str = str.replace(/%3F/g, "?");
    str = str.replace(/%5B/g, "[");
    str = str.replace(/%5C/g, "\\");
    str = str.replace(/%5D/g, "]");
    str = str.replace(/%5E/g, "^");
    str = str.replace(/%7B/g, "{");
    str = str.replace(/%7C/g, "|");
    str = str.replace(/%7D/g, "}");
    str = str.replace(/%7E/g, "~");
    str = str.replace(/%A3/g, "£");
	str = str.replace(/%2C/g, ",");
    return str;
}

function unEscapePlus(str){
	str = str.replace(/\+/g," ");
	return str;
}

function isoFormat(date) {
    var year = date.getUTCFullYear();
    var month = padDateElement(date.getUTCMonth() + 1);
    var day = padDateElement(date.getUTCDate());
    var hour = padDateElement(date.getUTCHours());
    var minute = padDateElement(date.getUTCMinutes());
    var second = padDateElement(date.getUTCSeconds());
    return year + "-" + month + "-" + day + " " + hour + ":" + minute + ":" + second;
}

function findActDateFormat(date) {
	var year = date.getUTCFullYear();
    var month = padDateElement(date.getUTCMonth() + 1);
    var day = padDateElement(date.getUTCDate());
    return year + month + day;
}

function padDateElement(element) {
    if (element >= 10) { 
        return element;
    } else {
        return "0" + element;
    }
}

function getWeekNumber(date) {
    var millisecondsPerWeek = 1000 * 60 * 60 * 24 * 7;
    var startMondayAsMilliseconds = startMonday.getTime();
    var dateAsMilliseconds = date.getTime();
    return Math.floor((dateAsMilliseconds - startMondayAsMilliseconds) / millisecondsPerWeek) + 1;
}

function getDayNumber(date) {
    var swsDayNumber;
    var usDayNumber = date.getDay();
    if (usDayNumber == 0) {
        swsDayNumber = 7; // Sunday
    } else {
        swsDayNumber = usDayNumber;
    }
    return swsDayNumber;
}

function isValidDate(dateStr) {
    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("Error: " + dateStr + " is not in a valid format")
        return 0;
    }
    month = matchArray[3]; // parse date into variables
    day = matchArray[1];
    year = matchArray[4];
    if (month < 1 || month > 12) { // check month range
        alert("Error: Month must be between 1 and 12.");
        return 0;
    }
    if (day < 1 || day > 31) {
        alert("Error: Day must be between 1 and 31");
        return 0;
    }
    if ((month==4 || month==6 || month==9 || month==11) && day==31) {
        alert("Error: Month " + month + " does not have 31 days")
        return 0;
    }
    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("Error: February " + year + " does not have " + day + " days!");
            return 0;
        }
    }
    return 1;
}

function isValidWeekNumber(weekNumber) {
	for (var i = 0; i < weeks.length; i++) {
	    if (weekNumber == weeks[i].weekNumber) {
	        return 1;
	    }
	}
    return 0;
}

function isValidDayNumber(dayNumber) {    
	for (var i = 0; i < days.length; i++) {
	    if (dayNumber == days[i].dayNumber) {
	        return 1;
	    }
	}
    return 0;
}

function isValidStartAndEndPeriod(selStartPeriodStr, selEndPeriodStr) {
    var end;
    var finish;
    start = parseInt(selStartPeriodStr);
    end = parseInt(selEndPeriodStr);
    if (end < start) {
	    return 0;
    } else {
	    return 1;
    }
}