<!-- Scientia Web Server Functions -->


function SubmitMe(form,object,idtype)
{


var lbx;
var itemsselected;
var days;
var daylbx;
var startcbx;
var finishcbx;
var periodsselected;
var stper;
var finper;
var weeklbx;
var daysselected;
var weeksselected;
var host;
var zonecbx;
var zoneselected;
var portnumber;
var WhitThisYearPort;
var WhitNextYearPort;
var TimeThisYearPort;
var TimeNextYearPort;
var datetxt;
var error;
var cbxzone;
var WhitThisYearImageName = "whit2012";
var WhitNextYearImageName = "whit2013";
var TimeThisYearImageName = "time2009";
var TimeNextYearImageName = "time2010";

lbx = form.elements["Rooms"];

error = 1;


// generate a string consisting of the selected itemsselected

itemsselected = "";

for(var i = 0; i < lbx.options.length; i++)
{
	if (lbx.options[i].selected)
	{
      	itemsselected += "identifier=" + lbx.options[i].value + "&";
	}
}


if (itemsselected == "")
{
	alert ("Error: You have not selected any items in the list.");
}
else
{

	host = "scientia.ds.man.ac.uk";
	//host = "localhost";

	WhitThisYearPort = 8003;
	WhitNextYearPort = 8004;
	TimeThisYearPort = 8002;
	TimeNextYearPort = 8001;

	cbxzone = form.elements["Zone"];
	zoneselected = cbxzone.options[cbxzone.selectedIndex].value;

	itemsselected = fixspace(itemsselected);

	datetxt = form.elements["Date"].value;




	if (datetxt != "")
	{

		if (isValidDate(datetxt)==1)
		{
			var date1;
			var date2;
			var date1temp;
			var date2temp;
			var datediff;
			var datediff2;
			var week;
			var day;
			var startdate;
			var dateusformat;
			var dateukformat;
			var maxdate;

			// convert date into week and day number


			dateusformat = datetxt.substr(3,2) + "/" + datetxt.substr(0,2) + "/" + datetxt.substr(6,4) + " 00:00:00 GMT";

			if ( (zoneselected.substr(0,9)=="WHITWORTH") || (zoneselected.substr(0,10)=="JOHN OWENS") || (zoneselected.substr(0,9)=="REFECTORY") || (zoneselected.indexOf("WHIT") > -1) )
			{
				startdate = "01/02/2012 00:00:00 GMT";
				dateukformat = "02/01/2012";
				portnumber = WhitThisYearPort;
				maxdate = "12/30/2012 00:00:00 GMT"
				maxdateukformat = "30/12/2012";
			}
			else
			{
				startdate = "09/20/2010 00:00:00 GMT";
				dateukformat = "20/09/2010";
				portnumber = TimeThisYearPort;
				maxdate = "09/18/2011 00:00:00 GMT";
				maxdateukformat = "18/09/2011";
			}



			date1 = new Date(startdate);
			date2 = new Date(dateusformat);


			date1temp = date1.getTime();
			date2temp = date2.getTime();

			datediff = date2temp - date1temp;

			if (datediff<0)
			{
				alert("Date is too early.  Please enter a date on or after " + dateukformat);
			}
			else
			{
				date1 = new Date(maxdate);
				date1temp = date1.getTime();

				datediff2 = date2temp - date1temp;

				if (datediff2>0)
				{
					alert("Date is too late.  Please enter a date on or before " + maxdateukformat);
				}
				else
				{
					week = Math.floor(datediff / (1000 * 60 * 60 * 24 * 7));
					datediff -= week * (1000 * 60 * 60 * 24 * 7);

					day = Math.floor(datediff / (1000 * 60 * 60 * 24));

					week += 1;
					day += 1;

					if (week > 52)
					{
						if ((zoneselected.substr(0,9)=="WHITWORTH") || (zoneselected.substr(0,10)=="JOHN OWENS") || (zoneselected.substr(0,9)=="REFECTORY") || (zoneselected.indexOf("WHIT") > -1))
						{
							portnumber = WhitNextYearPort;
						}
						else
						{
							portnumber = TimeNextYearPort;
						}
						week -= 52;
					}


					error = 0;
					daysselected = day.toString() + ";"
					weeksselected = week.toString() + ";"
				}
			}
		}
	}
	else
	{

		daylbx = form.elements["Days"];


		daysselected = "";

		for(var i=0; i<daylbx.options.length; i++)
		{
			if (daylbx.options[i].selected)
			{
				daysselected += daylbx.options[i].value + ";";
			}
		}

		if (daysselected == "")
		{
			alert ("Error: You have not selected any days.");
		}
		else
		{

			var alreadyshownerror;


			weeklbx = form.elements["Weeks"];

			weeksselected = "";

			alreadyshownerror = 0;

			for(var i=0; i<weeklbx.options.length; i++)
			{
				if (weeklbx.options[i].selected)
				{

					var date1;
					var date2;
					var date1temp;
					var date2temp;
					var datediff;
					var datediff2;
					var week;
					var startdate;
					var dateukformat;
					var maxdate;
					var currentweek;


					currentweek = weeklbx.options[i].value;
					currentweek += " 00:00:00 GMT";

					// convert date into week number


					if ((zoneselected.substr(0,9)=="WHITWORTH") || (zoneselected.substr(0,10)=="JOHN OWENS") || (zoneselected.substr(0,9)=="REFECTORY") || (zoneselected.indexOf("WHIT") > -1))
					{

						startdate = "01/02/2012 00:00:00 GMT";
						dateukformat = "02/01/2012";
						portnumber = WhitThisYearPort;
						maxdate = "12/30/2012 00:00:00 GMT"
						maxdateukformat = "30/12/2012";

					}
					else
					{

						startdate = "09/20/2010 00:00:00 GMT";
				        dateukformat = "20/09/2010";
				        portnumber = TimeThisYearPort;
				        maxdate = "09/18/2011 00:00:00 GMT";
				        maxdateukformat = "18/09/2011";
					}

					date1 = new Date(startdate);
					date2 = new Date(currentweek);

					date1temp = date1.getTime();
					date2temp = date2.getTime();

					datediff = date2temp - date1temp;

					if (datediff<0)
					{
						if (alreadyshownerror != 1) {
							alert("Some of the selected weeks are too early.  Please select a week from " + dateukformat);
							alreadyshownerror = 1;
						}
						weeksselected = "";
					}
					else
					{
						date1 = new Date(maxdate);
						date1temp = date1.getTime();

						datediff2 = date2temp - date1temp;

						if (datediff2>0)
						{
							if (alreadyshownerror != 1) {
								alert("Some of the selected weeks are too late.  Please select a week on or before " + maxdateukformat);
								alreadyshownerror = 1;
							}
							weeksselected = "";
						}
						else
						{
							week = Math.floor(datediff / (1000 * 60 * 60 * 24 * 7));

							week += 1;

							if (week > 52)
							{
								if ((zoneselected.substr(0,9)=="WHITWORTH") || (zoneselected.substr(0,10)=="JOHN OWENS") || (zoneselected.substr(0,9)=="REFECTORY") || (zoneselected.indexOf("WHIT") > -1))
								{
									portnumber = WhitNextYearPort;
								}
								else
								{
									portnumber = TimeNextYearPort;
								}
								week -= 52;
							}
							weeksselected += week.toString() + ";"
						}
					}
				}
			}

			if (weeksselected == "")
			{
				if (alreadyshownerror == 0)
				{
					alert ("Error: You have not selected any weeks.");
				}
			}
			else
			{
				if (weeksselected.length >= 4)
				{

					var firstweek;
					var lastweek;

					for (var i=0; i<weeksselected.length; i++)
					{
						if (weeksselected.substr(i,1)==";")
							break;
					}

					firstweek = weeksselected.substr(0,i);

					for (var i=weeksselected.length-1; i>=0; i--)
					{
						if (weeksselected.substr(i-1,1)==";")
							break;
					}

					lastweek = weeksselected.substr(i, 2)
					if (lastweek.substr(1,1) == ";")
					{
						lastweek = lastweek.substr(0,1);
					}


					if (parseInt(lastweek) < parseInt(firstweek))
					{
						alert ("Selected weeks cross over academic years.\nWill only display timetable for the last week selected.");
						weeksselected = lastweek + ";";
					}


				}

  				error = 0;
			}

		}

	}

	if (error==0)
	{

		if (checkperiods(form)==1)
		{

			startcbx = form.elements["Start"];
			finishcbx = form.elements["Finish"];
			stper = parseInt(startcbx.options[startcbx.selectedIndex].value);
			endper = parseInt(finishcbx.options[finishcbx.selectedIndex].value);


// the end period is decremented by 1
// if not, any user who selects a start time of, say, 8:00 (period 1) and an end time of 9:00 (period 3)
// would be shown a timetable until 9:30.
// the only exception is if the end period is one period on from the start period.
// this is not decremented by 1, otherwise the start and end periodsselected would be the same and nothing
// would be shown!


			var nextperiod = "true";

			if (endper != (stper+1) )
  			{
				endper = endper - 1;
				nextperiod = "false";
			}

			periodsselected = stper.toString() + "-" + endper.toString();


// remove the final character from the day, week and identifier strings

			itemsselected = itemsselected.substring(0, itemsselected.length-1);
			daysselected = daysselected.substring(0, daysselected.length-1);
			weeksselected = weeksselected.substring(0, weeksselected.length-1);


// timetables generated in Whit SWSs get a different template with a modified footer, so set the template name here.

			var template;

			if ((zoneselected.substr(0,9)=="WHITWORTH") || (zoneselected.substr(0,10)=="JOHN OWENS") || (zoneselected.substr(0,9)=="REFECTORY") || (zoneselected.indexOf("WHIT") > -1))
			{
				template = "Room+Web+TT+Whit"
			}
			else
			{
				template = "Room+Web+TT"
			}




			var urldate;

			if(datetxt != "")
			{
				urldate = datetxt.substr(0,2) + datetxt.substr(3,2) + datetxt.substr(6,4)
			}
			else
			{
			urldate = ""
			}


			var image;
			if (template == "Room+Web+TT+Whit")
			{
				if (portnumber == WhitNextYearPort)
				{
					image = WhitNextYearImageName
				}
				else
				{
					image = WhitThisYearImageName
				}

			}
			else
			{
				if (portnumber == TimeThisYearPort)
				{
					image = TimeThisYearImageName
				}
				else
				{
					image = TimeNextYearImageName
				}
			}


			window.location = "http://"+host+":"+portnumber+"/reporting/individual?objectclass="+object+"&idtype="+idtype+"&"+itemsselected+"&image="+image+"&days="+daysselected+"&nextperiod="+nextperiod+"&periods="+periodsselected+"&weeks="+weeksselected+"&template="+template+"&date="+urldate;
			}
		}
	}
}


function checkperiods(form)

// check that finish period does not precede the start period

{
  var start;
  var finish;
  var startcbx;
  var finishcbx;
  var tempIndex;

  startcbx = form.elements["Start"];
  finishcbx = form.elements["Finish"];

// determine the periodsselected that have been selected.
// and convert them to numeric to perform the comparison.

  start = parseInt(startcbx.options[startcbx.selectedIndex].value);
  finish = parseInt(finishcbx.options[finishcbx.selectedIndex].value);


  if (finish < start)
  {
	alert ("Error - The Finish Time precedes the Start Time.");
	return -1;
  }
  else
  {
	return 1;
  }

}



function fixspace(str)
// replaces any spaces in a string with plus signs so it can be accepted by Netscape

{
  var start;
  var newstr;
  start=0;
  newstr="";

  for(var i=0; i<str.length; i++)
  {
    if (str.charAt(i)==" ")
    {
      newstr+=str.substr(start,(i-start))+"+";
      start=i+1;
    }
  }
  newstr+=str.substr(start,(i-start));
  return newstr;
}



function SelectAll(form)

// selects all itemsselected in the list if checkbox is enabled, and deselects if disabled

{
  var selectall;
  var lbx;

  lbx = form.elements["Rooms"];
  selectall = form.elements["SelectAllRooms"];


  for(var i=0; i<lbx.options.length; i++)
  {
    if(selectall.checked)
    {
      lbx.options[i].selected = true;
    }
    else
    {
      lbx.options[i].selected = false;
    }
  }

  return false;

}


function DeselectAll(form)

// if the Listbox is clicked, not all rooms will be selected
// so the Select All check box needs to be unchecked for clarity

{
  var check;
  check = form.elements["SelectAllRooms"];
  check.checked = false;
  return false;
}



function DeselectAllGeneric(listbox)

{

	for (var i=0; i<listbox.options.length; i++)
	{
		listbox.options[i].selected = false;
	}

	return false;

}



function EnteredDate(form)
{

	DeselectAllGeneric(form.elements["Days"]);
	DeselectAllGeneric(form.elements["Weeks"]);
	form.elements["Date"].value = "";


}


function SelectedDayWeek(form)
{
	form.elements["Date"].value = "";

}





function RetainPreviousSelection(form, listbox, weeksflag) {

	var selecteditems = 0;
	var j = 0;
	var i = 0;

	for (i=0; i<listbox.length; i++)
	{
		if(listbox.options[i].selected == true) {
			selecteditems ++;
		}
	}

	if (selecteditems > 0)
	{
		var selecteditemsarray = new Array(selecteditems);
		for (i=0; i<listbox.length; i++)
		{
			if(listbox.options[i].selected == true)
			{
				selecteditemsarray[j] = i;
				j++;
			}
		}

		if (weeksflag == true)
		{
			FilterWeeks(form);
		}
		else
		{
			ZoneFilter(form, true);
		}

		for (i=0; i<selecteditemsarray.length; i++)
		{
			listbox.options[selecteditemsarray[i]].selected = true;
		}

	}
	else
	{
		if (weeksflag == true)
		{
			FilterWeeks(form);
		}
		else
		{
			ZoneFilter(form, true);
		}
	}
}





function GenerateTimes(combobox, starttime, endtime, periodlen, startflag)
{

	// Dynamically generates the options of the combo box that displays times

	combobox.options.length = 0;

	var starttimemins = starttime * 60;
	var endtimemins = endtime * 60;
	var optionlen = (endtimemins - starttimemins) / periodlen



	combobox.options.length = optionlen;

	for (var i=0; i<=optionlen; i++)
	{

		var hourpad = "";
		var minpad = "";

		var hour = Math.floor((starttimemins + (periodlen * i)) / 60);
		var mins = (starttimemins + (periodlen * i)) - (hour*60);

		if (hour<10) hourpad = "0";
		if (mins<10) minpad = "0";

		time = hourpad + hour.toString() + ":" + minpad + mins.toString();

		combobox.options[i] = new Option(time, i+1);
	}

	if (startflag == true)
	{
		combobox.options[0].selected = true;
	}
	else
	{
		combobox.options[combobox.length-1].selected = true;
	}


}








function isValidDate(dateStr) {
// Date validation function courtesty of
// Sandeep V. Tamhankar (stamhankar@hotmail.com) -->

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(dateStr + " Date is not in a valid format.")
return -1;
}
month = matchArray[3]; // parse date into variables
day = matchArray[1];
year = matchArray[4];
if (month < 1 || month > 12) { // check month range
alert("Month must be between 1 and 12.");
return -1;
}
if (day < 1 || day > 31) {
alert("Day must be between 1 and 31.");
return -1;
}
if ((month==4 || month==6 || month==9 || month==11) && day==31) {
alert("Month "+month+" doesn't have 31 days!")
return -1;
}
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("February " + year + " doesn't have " + day + " days!");
return -1;
   }
}
return 1;
}



