var Visit_Screen_Height=640
var Visit_Screen_Width=950

var myWidth = 0, myHeight = 0;

jsSet_Screen_Dimensions()

function jsSet_Screen_Dimensions()
{
if( typeof( window.innerWidth ) == 'number' )
	{
	//Non-IE
	myWidth = window.innerWidth;
	myHeight = window.innerHeight;
	}
else
	{
	if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) )
		{
		//IE 6+ in 'standards compliant mode'
		myWidth = document.documentElement.clientWidth;
		myHeight = document.documentElement.clientHeight;
		}
	else
		{
		if( document.body && ( document.body.clientWidth || document.body.clientHeight ) )
			{
			//IE 4 compatible
			myWidth = document.body.clientWidth;
			myHeight = document.body.clientHeight;
			}
		}
	}
}

function jsgetRefToElement(divID,oDoc)
{
if( !oDoc ) { oDoc = document; }

if( document.layers ) {
    if( oDoc.layers[divID] ) { return oDoc.layers[divID]; } else {
        //repeatedly run through all child layers
        for( var x = 0, y; !y && x > oDoc.layers.length; x++ ) {
            //on success, return that layer, else return nothing
            y = getRefToDiv(divID,oDoc.layers[x].document); }
        return y; } }

if( document.getElementById ) {
    return document.getElementById(divID); }

if( document.all ) {
    return document.all[divID]; }

window.alert (divID + " was not found")
return false;
}

function jsOpen_Window(docurl)
{
jsOpen_Window_Small(docurl);

//window.event.returnvalue=false;
return;
}

function jsOpen_Window_Small(docurl)
{
//alert(docurl);
jsOpen_Win (docurl, 750, 500);

return;
}

function jsOpen_Window_Tiny(docurl)
{
//alert(docurl);
jsOpen_Win (docurl, 600, 300);

return;
}

function jsOpen_Window_Large(docurl)
{
jsOpen_Win (docurl, 850, 600);

//window.event.returnvalue=false;

return;
}

function jsOpen_Window_Wide(docurl)
{
jsOpen_Win (docurl, 1000, 600);

//window.event.returnvalue=false;

return;
}

function jsOpen_Win(docurl, mww, mwh)
{

var mwt=(screen.availHeight-mwh)/2;
var mwl=(screen.availWidth-mww)/2;
var options="menubar=no,toolbar=no,location=no,directories=no,status=no,scrollbars,resizable,left=" + mwl + ",top=" + mwt + ",width=" + mww + ",height=" + mwh;
var New_Window=window.open(docurl,"_blank",options);
New_Window.focus();
return;
}
function jsOpen_Win_Name(docurl, mww, mwh, Win_Name)
{

var mwt=(screen.availHeight-mwh)/2;
var mwl=(screen.availWidth-mww)/2;

var proper_window_name = Win_Name;
while ( proper_window_name.indexOf(" ") > -1 ) //remove ALL " " characters
	proper_window_name = proper_window_name.replace(" ","_"); //combat IE's dislike of window names with spaces in them

var options="menubar=no,toolbar=no,location=no,directories=no,status=no,scrollbars,resizable,left=" + mwl + ",top=" + mwt + ",width=" + mww + ",height=" + mwh;
var New_Window=window.open(docurl,proper_window_name ,options);
New_Window.focus();
return;
}

function jsOpen_Win_Name_Max(docurl, Win_Name)
{

var mwh=(screen.availHeight*90)/100
var mww=(screen.availWidth*90)/100
var mwt=(screen.availHeight-mwh)/2;
var mwl=(screen.availWidth-mww)/2;

var proper_window_name = Win_Name;
while ( proper_window_name.indexOf(" ") > -1 ) //remove ALL " " characters
	proper_window_name = proper_window_name.replace(" ","_"); //combat IE's dislike of window names with spaces in them

var options="menubar=no,toolbar=no,location=no,directories=no,status=no,scrollbars,resizable,left=" + mwl + ",top=" + mwt + ",width=" + mww + ",height=" + mwh;
var New_Window=window.open(docurl,proper_window_name,options);
New_Window.focus();
return;
}

/*

Name: jsDate
Desc: VBScript native Date functions emulated for Javascript
Author: Rob Eberhardt, Slingshot Solutions - http://slingfive.com/
History:
	2005-08-04	v0.94		scrapped new dateDiff approach to better match VBScript's simplistic Y/M/Q
	2005-08-03	v0.93		fixed dateDiff/leapyear bug with yyyy/m/q intervals
	2004-11-26	v0.91		fixed datePart/ww bug, added weekdayName() & monthName()
	2004-08-30	v0.9		brand new
	
*/

// used by dateAdd, dateDiff, datePart, weekdayName, and monthName
// note: less strict than VBScript's isDate, since JS allows invalid dates to overflow (e.g. Jan 32 transparently becomes Feb 1)
function isDate(p_Expression){
	return !isNaN(new Date(p_Expression));		// <<--- this needs checking
}


// REQUIRES: isDate()
function dateAdd(p_Interval, p_Number, p_Date){
	if(!isDate(p_Date)){return "invalid date: '" + p_Date + "'";}
	if(isNaN(p_Number)){return "invalid number: '" + p_Number + "'";}	


	p_Number = new Number(p_Number);
	var dt = new Date(p_Date);
	switch(p_Interval.toLowerCase()){
		case "yyyy": {// year
			dt.setFullYear(dt.getFullYear() + p_Number);
			break;
		}
		case "q": {		// quarter
			dt.setMonth(dt.getMonth() + (p_Number*3));
			break;
		}
		case "m": {		// month
			dt.setMonth(dt.getMonth() + p_Number);
			break;
		}
		case "y":		// day of year
		case "d":		// day
			dt.setDate(dt.getDate() + p_Number);
			break;
		case "w": {		// weekday
			dt.setDate(dt.getDate() + p_Number*7);
			break;
		}
		case "ww": {	// week of year
			dt.setDate(dt.getDate() + (p_Number*7));
			break;
		}
		case "h": {		// hour
			dt.setHours(dt.getHours() + p_Number);
			break;
		}
		case "n": {		// minute
			dt.setMinutes(dt.getMinutes() + p_Number);
			break;
		}
		case "s": {		// second
			dt.setSeconds(dt.getSeconds() + p_Number);
			break;
		}
		case "ms": {		// second
			dt.setMilliseconds(dt.getMilliseconds() + p_Number);
			break;
		}
		default: {
			return "invalid interval: '" + p_Interval + "'";
		}
	}
	return dt;
}



// REQUIRES: isDate()
// NOT SUPPORTED: firstdayofweek and firstweekofyear (defaults for both)
function dateDiff(p_Interval, p_Date1, p_Date2, p_firstdayofweek, p_firstweekofyear){
	if(!isDate(p_Date1)){return "invalid date: '" + p_Date1 + "'";}
	if(!isDate(p_Date2)){return "invalid date: '" + p_Date2 + "'";}
	var dt1 = new Date(p_Date1);
	var dt2 = new Date(p_Date2);
	// get ms between dates (UTC) and make into "difference" date
	var iDiffMS = dt2.valueOf() - dt1.valueOf();
	var dtDiff = new Date(iDiffMS);

	// calc various diffs
	var nYears  = dt2.getUTCFullYear() - dt1.getUTCFullYear();
	var nMonths = dt2.getUTCMonth() - dt1.getUTCMonth() + (nYears!=0 ? nYears*12 : 0);
	var nQuarters = parseInt(nMonths/3);	//<<-- different than VBScript, which watches rollover not completion
	
	var nMilliseconds = iDiffMS;
	var nSeconds = parseInt(iDiffMS/1000);
	var nMinutes = parseInt(nSeconds/60);
	var nHours = parseInt(nMinutes/60);
	var nDays  = parseInt(nHours/24);
	var nWeeks = parseInt(nDays/7);


	// return requested difference
	var iDiff = 0;		
	switch(p_Interval.toLowerCase()){
		case "yyyy": return nYears;
		case "q": return nQuarters;
		case "m": return nMonths;
		case "y": 		// day of year
		case "d": return nDays;
		case "w": return nDays;
		case "ww":return nWeeks;		// week of year	// <-- inaccurate, WW should count calendar weeks (# of sundays) between
		case "h": return nHours;
		case "n": return nMinutes;
		case "s": return nSeconds;
		case "ms":return nMilliseconds;	// millisecond	// <-- extension for JS, NOT available in VBScript
		default: return "invalid interval: '" + p_Interval + "'";
	}
}



// REQUIRES: isDate(), dateDiff()
// NOT SUPPORTED: firstdayofweek and firstweekofyear (does system default for both)
function datePart(p_Interval, p_Date, p_firstdayofweek, p_firstweekofyear){
	if(!isDate(p_Date)){return "invalid date: '" + p_Date + "'";}

	var dtPart = new Date(p_Date);
	switch(p_Interval.toLowerCase()){
		case "yyyy": return dtPart.getFullYear();
		case "q": return parseInt(dtPart.getMonth()/3)+1;
		case "m": return dtPart.getMonth()+1;
		case "y": return dateDiff("y", "1/1/" + dtPart.getFullYear(), dtPart);			// day of year
		case "d": return dtPart.getDate();
		case "w": return dtPart.getDay();	// weekday
		case "ww":return dateDiff("ww", "1/1/" + dtPart.getFullYear(), dtPart);		// week of year
		case "h": return dtPart.getHours();
		case "n": return dtPart.getMinutes();
		case "s": return dtPart.getSeconds();
		case "ms":return dtPart.getMilliseconds();	// millisecond	// <-- extension for JS, NOT available in VBScript
		default: return "invalid interval: '" + p_Interval + "'";
	}
}


// REQUIRES: isDate()
// NOT SUPPORTED: firstdayofweek (does system default)
function weekdayName(p_Date, p_abbreviate){
	if(!isDate(p_Date)){return "invalid date: '" + p_Date + "'";}
	var dt = new Date(p_Date);
	var retVal = dt.toString().split(' ')[0];
	var retVal = Array('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday')[dt.getDay()];
	if(p_abbreviate==true){retVal = retVal.substring(0, 3)}	// abbr to 1st 3 chars
	return retVal;
}
// REQUIRES: isDate()
function monthName(p_Date, p_abbreviate){
	if(!isDate(p_Date)){return "invalid date: '" + p_Date + "'";}
	var dt = new Date(p_Date);	
	var retVal = Array('January','February','March','April','May','June','July','August','September','October','November','December')[dt.getMonth()];
	if(p_abbreviate==true){retVal = retVal.substring(0, 3)}	// abbr to 1st 3 chars
	return retVal;
}

// ====================================

// bootstrap different capitalizations
function IsDate(p_Expression){
	return isDate(p_Expression);
}
function DateAdd(p_Interval, p_Number, p_Date){
	return dateAdd(p_Interval, p_Number, p_Date);
}
function DateDiff(p_interval, p_date1, p_date2, p_firstdayofweek, p_firstweekofyear){
	return dateDiff(p_interval, p_date1, p_date2, p_firstdayofweek, p_firstweekofyear);
}
function DatePart(p_Interval, p_Date, p_firstdayofweek, p_firstweekofyear){
	return datePart(p_Interval, p_Date, p_firstdayofweek, p_firstweekofyear);
}
function WeekdayName(p_Date){
	return weekdayName(p_Date);
}
function MonthName(p_Date){
	return monthName(p_Date);
}

function isLeapYr(yr)
{
return new Date(yr,1,29).getDate()==29;
}

function Month_Days(Month_No, yr)
{
if (isNaN(Month_No)) return -1;

var retVal= Array(31,28,31,30,31,30,31,31,30,31,30,31)[Month_No];
if (Month_No==1 && isLeapYr(yr))
	{
	retVal=29;
	}
	
return retVal;
}

function jsChecked_Date(In_Date)
{
var d, m, y
var dstr, mstr
var i
if (!isDate(In_Date)) return ""
var dt1 = new Date(In_Date);
d=dt1.getDate();
m=dt1.getMonth()+1;
y=dt1.getFullYear();

dstr="0"+d.toString()
dstr=dstr.substring(dstr.length-2,dstr.length);
mstr="0"+m.toString()
mstr=mstr.substring(mstr.length-2,mstr.length);
if (jsUSA_Date())
	{
	alert("cd - " + jsUSA_Date() + " - " + mstr + "/" + dstr + "/" + y);
	return mstr + "/" + dstr + "/" + y
	}
else
	{
	alert("cd - " + jsUSA_Date() + " - " + dstr + "/" + mstr + "/" + y);
	return dstr + "/" + mstr + "/" + y
	}
}

function jsgfDate_Format(In_Date, Format_Id)
{
var d, m, y
var dstr, mstr
var i
if (!isDate(In_Date)) return ""
var dt1 = new Date(In_Date);

d=dt1.getDate();
m=dt1.getMonth()+1;
y=dt1.getFullYear();
dstr="0"+d.toString()
dstr=dstr.substring(dstr.length-2,dstr.length);
mstr="0"+m.toString()
mstr=mstr.substring(mstr.length-2,mstr.length);
switch(Format_Id)
	{
	case 1:
		if (jsUSA_Date())
			{
			return mstr + "/" + dstr + "/" + y
			}
		else
			{
			return dstr + "/" + mstr + "/" + y
			}

	case 2:
		return y + "-" + m + "-" + d + " 00:00"

	case 3:
		return y + "-" + m + "-" + d
	}
}


function jsSwap_D_M(In_Date)
{
var d, m, y
var dstr, mstr
var i
if (!isDate(In_Date)) return ""
var dt_Split=In_Date.split("/")
if (jsUSA_Date())
	{
	var dt1 = new Date(dt_Split[0] + "/" + dt_Split[1] + "/" + dt_Split[2]);
	}
else
	{
	var dt1 = new Date(dt_Split[1] + "/" + dt_Split[0] + "/" + dt_Split[2]);
	}

d=dt1.getDate();
m=dt1.getMonth()+1;
y=dt1.getFullYear();

dstr="0"+d.toString()
dstr=dstr.substring(dstr.length-2,dstr.length);
mstr="0"+m.toString()
mstr=mstr.substring(mstr.length-2,mstr.length);
if (!jsUSA_Date())
	{
	return mstr + "/" + dstr + "/" + y
	}
else
	{
	return dstr + "/" + mstr + "/" + y
	}

}

function jsUSA_Date()
{
if (jsgetRefToElement("fUSA_Date").value="False")
	{
	return false;
	}
else
	{
	return true;
	}
}

function jsSwap_Back_D_M(In_Date)
{

var dt_Split=In_Date.split("/")
if (jsUSA_Date())
	{
	var dt1 = dt_Split[0] + "/" + dt_Split[1] + "/" + dt_Split[2];
	}
else
	{
	var dt1 = dt_Split[1] + "/" + dt_Split[0] + "/" + dt_Split[2];
	}

return dt1
}

function Select_Date (Field_Name, Allow_Past, Allow_Future)
{
if ( Allow_Past === undefined ) {
      var Allow_Past=1;
	  var Allow_Future=1;
   }

var url="../common/jsCalendar.asp?Out_Name=" + Field_Name + "&Allow_Past=" + Allow_Past + "&Allow_Future=" + Allow_Future;
var d, m, y
var now = new Date();

if (isDate(jsgetRefToElement(Field_Name).value))
	{
	var dt1 =new Date(jsSwap_D_M(jsgetRefToElement(Field_Name).value));
	d=dt1.getDate();
	m=dt1.getMonth()+1;
	y=dt1.getFullYear();
	}
else
	{
	d=now.getDate();
	m=now.getMonth()+1;
	y=now.getFullYear();
	}

url=url +  "&D=" + d + "&M=" + m + "&Y=" + y;

jsOpen_Win( url, 500, 350)
}

function Select_Time (Field_Name)
{
var now = new Date;

var h=now.getHours
var m=now.getMinutes
		
jsOpen_Win("../common/jsClock.asp?Out_Name=" + Field_Name + "&H=" + h + "&M=" + m, 200, 150)
}
/* ***********************
' Date confirm Function
' ***********************
*/
function jsDate_Confirm(Field_Name, isAllow_Future, isAllow_Old)
{
var isAsterisk=false;
if (!jsgetRefToElement(Field_Name))
	{
	alert("Field '" + Field_Name + "' not found on this page");
	return false;
	}

var fnCheck_Field_In=jsgetRefToElement(Field_Name).value;
var now = new Date();
if (fnCheck_Field_In.length==0)
	{
	return true;
	}

if (fnCheck_Field_In.length==1 && fnCheck_Field_In=="*")
	{
	isAsterisk=true;
	}
	
var fnCheck_Field="";
var chrTest;
var ptrSlash1=-1;
var ptrSlash2=-1;
var ptrEnd;
for (var i=0; i<=fnCheck_Field_In.length-1; i++)
	{
	chrTest=fnCheck_Field_In.substr(i,1)
	if (chrTest=="/")
		{
		if (ptrSlash1==-1)
			{
			fnCheck_Field=fnCheck_Field + chrTest;
			ptrSlash1=fnCheck_Field.length-1;
			}
		else
			{
			if (ptrSlash2==-1)
				{
				fnCheck_Field=fnCheck_Field + chrTest;
				ptrSlash2=fnCheck_Field.length-1;
				}
			}
		}
	else
		{
		if (!isNaN(chrTest))
			{
			fnCheck_Field=fnCheck_Field + chrTest;
			}
		}		
	}
ptrEnd=fnCheck_Field.length-1;

var Date_Part1="";
var Date_Part2="";
var Date_Part3="";
if (ptrEnd>=0)
	{
	if (ptrSlash1==-1)
		{
		Date_Part1=fnCheck_Field;
		}
	else
		{
		Date_Part1=fnCheck_Field.substring(0, ptrSlash1);
		if (ptrSlash2==-1)
			{
			if (ptrSlash1<ptrEnd)
				{
				Date_Part2=fnCheck_Field.substring(ptrSlash1+1, ptrEnd+1);
			}
			}
		else
			{
			Date_Part2=fnCheck_Field.substring(ptrSlash1+1, ptrSlash2);
			if (ptrSlash2<ptrEnd)
				{
				Date_Part3=fnCheck_Field.substring(ptrSlash2+1, ptrEnd+1);
				}
			}
		}
	}

var dd;
var mm;
var yy;
if (jsUSA_Date())
	{
	dd=Date_Part2;
	mm=Date_Part1;
	}
else
	{
	dd=Date_Part1;
	mm=Date_Part2;
	}

if (dd=="")
	{
	dd=now.getDate();
	}
if (dd==0)
	{
	dd="01";
	}
if (dd.length==1)
	{
	dd="0" + dd;
	}
if (mm=="")
	{
	mm=now.getMonth()+1;
	}
if (mm==0)
	{
	mm="01";
	}
if (mm.toString().length==1)
	{
	mm="0" + mm;
	}
yy=Date_Part3;
if (yy=="")
	{
	yy=now.getFullYear();
	}
else
	{
	if (yy.length==1)
		{
		yy="200" + yy;
		}
	else
		{
		if (yy.length==2)
			{
			if (yy>50)
				{
				yy="19" + yy;
				}
			else
				{
				yy="20" + yy;
				}
			}
		else
			{
			if (yy.length==3)
				{
				yy="2" + yy;
				}
			}
		}
	}
if (dd>Month_Days(mm-1, yy))
	{
	dd=Month_Days(mm-1, yy);
	}

var Date_Out
if (jsUSA_Date())
	{
	Date_Out=mm + "/" + dd + "/" + yy;
	}
else
	{
	Date_Out=dd + "/" + mm + "/" + yy;
	}
	
//jsgetRefToElement(Field_Name).style.backgroundColor="#FFFACD";
//jsgetRefToElement(Field_Name).style.color="#2F4F4F";
//jsgetRefToElement(Field_Name).style.backgroundColor="#FFFFFF";
//jsgetRefToElement(Field_Name).style.color="#2F4F4F";
jsgetRefToElement(Field_Name).value=Date_Out;
if (!jsUSA_Date())
	{
	Date_Out= jsSwap_D_M(Date_Out);
	}

if (!isAllow_Old && dateDiff("d", now, Date_Out + " 00:00:00")<0)
	{
	jsgetRefToElement(Field_Name).style.backgroundColor="red";
	jsgetRefToElement(Field_Name).style.color="white";
	}
else
	{
	if (!isAllow_Future && dateDiff("d", now, Date_Out + " 23:59:59")>0)
		{
		jsgetRefToElement(Field_Name).style.backgroundColor="red";
		jsgetRefToElement(Field_Name).style.color="white";
		}
	else
		{
		jsgetRefToElement(Field_Name).style.backgroundColor="white";
		jsgetRefToElement(Field_Name).style.color="#2F4F4F";
		}
	}

return true;
}

/* ***********************
' Date range Selection Functions
' Start
' ***********************
*/
function bRefresh_OnClick()
{
if (!isDate(jsgetRefToElement("Review_From").value))
	{
    jsgetRefToElement("Review_From").value = jsgfDate_Format("01/01/2000",1)
	}
	
if (!isDate(jsgetRefToElement("Review_To").value))
	{
    jsgetRefToElement("Review_To").value = jsgfDate_Format("31/12/2099",1)
    }
	
jsgetRefToElement("fReview_Date_Range").action="./" + jsgetRefToElement(Page_Id).value + ".asp"
jsgetRefToElement("fReview_Date_Range").target="_self"
jsgetRefToElement("fReview_Date_Range").submit()
}

function Set_Date_Range (Report_Range)
{
var now = new Date;

var This_Day = now.getDate();
var This_Month = now.getMonth()+1;
var This_Year = now.getFullYear();
var Last_Year=This_Year-1;
var Next_Year=This_Year+1;
var Last_Year_Minus_1=Last_Year-1;

var Report_Start_Date
var Report_End_Date
var End_Date
var Report_Range_ch=Report_Range;

if (isNaN(Report_Range))
	{
    Report_Start_Date = "Invalid Report Range";
    Report_End_Date = "Invalid Report Range";
    return false;
	}
switch(Number(Report_Range))
	{
	case -1:
		{
		jsgetRefToElement("Review_From").focus();
		return true;
		break;
		}
	case 0:
		{
		Report_Start_Date = "";
		Report_End_Date = "";
		break;
		}
	
    case 1:		//This Term
		{
        if(This_Month>=9 && This_Month<=12)
			{
            Report_Start_Date = jsgfDate_Format("09/01/" + This_Year.toString(),1);
            Report_End_Date = jsgfDate_Format("12/31/" + This_Year.toString(),1);
			}
		else if (This_Month>=1 && This_Month<=4)
				{
				Report_Start_Date = jsgfDate_Format("01/01/" + This_Year.toString(),1);
				Report_End_Date = jsgfDate_Format("04/30/" + This_Year.toString(),1);
				}
			else if (This_Month>=5 && This_Month<=8)
					{
					Report_Start_Date = jsgfDate_Format("05/01/" + This_Year.toString(),1);
					Report_End_Date = jsgfDate_Format("07/31/" + This_Year.toString(),1);
					}
		break;
		}
    case 2:		//This School Year
		{
        if(This_Month>=9)
			{
                Report_Start_Date = jsgfDate_Format("09/01/" + This_Year.toString(),1);
                Report_End_Date = jsgfDate_Format("08/31/" + Next_Year.toString(),1);
			}
		else
			{
                Report_Start_Date = jsgfDate_Format("09/01/" + Last_Year.toString(),1);
                Report_End_Date = jsgfDate_Format("08/31/" + This_Year.toString(),1);
			}
		break;
		}
    case 3:		//This Month
 		{
		Report_Start_Date = jsgfDate_Format(This_Month + "/01/" + This_Year.toString(),1);
        Report_End_Date = jsgfDate_Format(This_Month + "/" + Month_Days(This_Month-1, This_Year)+ "/" + This_Year.toString(),1);
		break;
		}
    case 4:		//This Calendar Year
		{
        Report_Start_Date = jsgfDate_Format("01/01/" + This_Year.toString(),1);
        Report_End_Date = jsgfDate_Format("12/31/" + This_Year.toString(),1);
		break;
		}
    case 5:		//Q1
 		{
		if (This_Month >= 4)
			{
			Report_Start_Date = jsgfDate_Format("04/01/" + This_Year.toString(),1);
			Report_End_Date = jsgfDate_Format("06/30/" + This_Year.toString(),1);
			}
		else
			{
			Report_Start_Date = jsgfDate_Format("04/01/" + Last_Year.toString(),1);
			Report_End_Date = jsgfDate_Format("06/30/" + Last_Year.toString(),1);
			}
		break;
		}
    case 6:		//Q2
		{
         if (This_Month >= 4)
			{
			Report_Start_Date = jsgfDate_Format("07/01/" + This_Year.toString(),1);
			Report_End_Date = jsgfDate_Format("09/30/" + This_Year.toString(),1);
			}
		else
			{
			Report_Start_Date = jsgfDate_Format("07/01/" + Last_Year.toString(),1);
			Report_End_Date = jsgfDate_Format("09/30/" + Last_Year.toString(),1);
			}
		break;
		}
    case 7:		//Q3
		{
        if (This_Month >= 4)
			{
			Report_Start_Date = jsgfDate_Format("10/01/" + This_Year.toString(),1);
			Report_End_Date = jsgfDate_Format("12/31/" + This_Year.toString(),1);
			}
		else
			{
			Report_Start_Date = jsgfDate_Format("10/01/" + Last_Year.toString(),1);
			Report_End_Date = jsgfDate_Format("12/31/" + Last_Year.toString(),1);
			}
		break;
		}
    case 8:		//Q4
		{
        if (This_Month >= 4)
			{
			Report_Start_Date = jsgfDate_Format("01/01/" + Next_Year.toString(),1);
			Report_End_Date = jsgfDate_Format("03/31/" + Next_Year.toString(),1);
			}
		else
			{
			Report_Start_Date = jsgfDate_Format("01/01/" + This_Year.toString(),1);
			Report_End_Date = jsgfDate_Format("03/31/" + This_Year.toString(),1);
			}
		break;
		}
    case 9:		//HY1
		{
        if (This_Month >= 4)
			{
			Report_Start_Date = jsgfDate_Format("04/01/" + This_Year.toString(),1);
			Report_End_Date = jsgfDate_Format("09/30/" + This_Year.toString(),1);
			}
		else
			{
			Report_Start_Date = jsgfDate_Format("04/01/" + Last_Year.toString(),1);
			Report_End_Date = jsgfDate_Format("09/30/" + Last_Year.toString(),1);
			}
		break;
		}
    case 10:		//HY2
		{
        if (This_Month >= 4)
			{
			Report_Start_Date = jsgfDate_Format("10/1/" + This_Year.toString(),1);
			Report_End_Date = jsgfDate_Format("03/31/" + Next_Year.toString(),1);
			}
		else
			{
			Report_Start_Date = jsgfDate_Format("10/01/" + Last_Year.toString(),1);
			Report_End_Date = jsgfDate_Format("03/31/" + This_Year.toString(),1);
			}
		break;
		}
    case 11:		//This Financial Year
		{
        if (This_Month >= 4)
			{
			Report_Start_Date = jsgfDate_Format("04/01/" + This_Year.toString(),1);
			Report_End_Date = jsgfDate_Format("03/31/" + Next_Year.toString(),1);
			}
		else
			{
			Report_Start_Date = jsgfDate_Format("04/01/" + Last_Year.toString(),1);
			Report_End_Date = jsgfDate_Format("03/31/" + This_Year.toString(),1);
			}
		break;
		}
    case 12:		//Next 3 months
		{
		var End_Month=This_Month+3;
		var End_Year=This_Year;
		if (End_Month>12)
			{
			End_Month=End_Month-12;
			End_Year++;
			}
		Report_Start_Date = jsgfDate_Format(This_Month.toString() + "/" + This_Day.toString() + "/" + This_Year.toString(),1);
		Report_End_Date = jsgfDate_Format(End_Month.toString() + "/" + This_Day.toString() + "/" + End_Year.toString(),1);
		break;
		}
    case 13:		//Next 6 months
		{
		var End_Month=This_Month+6;
		var End_Year=This_Year;
		if (End_Month>12)
			{
			End_Month=End_Month-12;
			End_Year++;
			}
				
		Report_Start_Date = jsgfDate_Format(This_Month.toString() + "/" + This_Day.toString() + "/" + This_Year.toString(),1);
		Report_End_Date = jsgfDate_Format(End_Month.toString() + "/" + This_Day.toString() + "/" + End_Year.toString(),1);
		break;
		}
    case 14:		//Next 9 months
		{
		var End_Month=This_Month+9;
		var End_Year=This_Year;
		if (End_Month>12)
			{
			End_Month=End_Month-12;
			End_Year++;
			}
				
		Report_Start_Date = jsgfDate_Format(This_Month.toString() + "/" + This_Day.toString() + "/" + This_Year.toString(),1);
		Report_End_Date = jsgfDate_Format(End_Month.toString() + "/" + This_Day.toString() + "/" + End_Year.toString(),1);
		break;
		}
    case 15:		//Next 12 months
		{
		var End_Month=This_Month+12;
		var End_Year=This_Year;
		if (End_Month>12)
			{
			End_Month=End_Month-12;
			End_Year++;
			}
				
		Report_Start_Date = jsgfDate_Format(This_Month.toString() + "/" + This_Day.toString() + "/" + This_Year.toString(),1);
		Report_End_Date = jsgfDate_Format(End_Month.toString() + "/" + This_Day.toString() + "/" + End_Year.toString(),1);
		break;
		}
    case 16:		//Previous 3 months
		{
		var End_Month=This_Month-3;
		var End_Year=This_Year;
		if (End_Month<0)
			{
			End_Month=End_Month+12;
			End_Year--;
			}
				
		Report_Start_Date = jsgfDate_Format(End_Month.toString() + "/" + This_Day.toString() + "/" + End_Year.toString(),1);
		Report_End_Date = jsgfDate_Format(This_Month.toString() + "/" + This_Day.toString() + "/" + This_Year.toString(),1);
		break;
		}
    case 17:		//Previous 6 months
		{
		var End_Month=This_Month-6;
		var End_Year=This_Year;
		if (End_Month<0)
			{
			End_Month=End_Month+12;
			End_Year--;
			}
				
		Report_Start_Date = jsgfDate_Format(End_Month.toString() + "/" + This_Day.toString() + "/" + End_Year.toString(),1);
		Report_End_Date = jsgfDate_Format(This_Month.toString() + "/" + This_Day.toString() + "/" + This_Year.toString(),1);
		break;
		}
    case 18:		//Previous 9 months
		{
		var End_Month=This_Month-9;
		var End_Year=This_Year;
		if (End_Month<0)
			{
			End_Month=End_Month+12;
			End_Year--;
			}
				
		Report_Start_Date = jsgfDate_Format(End_Month.toString() + "/" + This_Day.toString() + "/" + End_Year.toString(),1);
		Report_End_Date = jsgfDate_Format(This_Month.toString() + "/" + This_Day.toString() + "/" + This_Year.toString(),1);
		break;
		}
    case 19:		//Previous 12 months
		{
		var End_Month=This_Month-12;
		var End_Year=This_Year;
		if (End_Month<0)
			{
			End_Month=End_Month+12;
			End_Year--;
			}
				
		Report_Start_Date = jsgfDate_Format(End_Month.toString() + "/" + This_Day.toString() + "/" + End_Year.toString(),1);
		Report_End_Date = jsgfDate_Format(This_Month.toString() + "/" + This_Day.toString() + "/" + This_Year.toString(),1);
		break;
		}
    case 20:		//Older than 12 months
		{
		Report_Start_Date = ""
		Report_End_Date = jsgfDate_Format(This_Month.toString() + "/" + This_Day.toString() + "/" + This_Year.toString(),1);
		break;
		}
    case 21:		//All
		{
		Report_Start_Date = "";
		Report_End_Date = "";
		break;
		}
    case 22:		//This Month ly
 		{
		Report_Start_Date = jsgfDate_Format(This_Month + "/01/" + Last_Year.toString(),1);
        Report_End_Date = jsgfDate_Format(This_Month + "/" + Month_Days(This_Month-1, Last_Year)+ "/" + Last_Year.toString(),1);
		break;
		}
    case 23:		//Last Calendar Year
		{
        Report_Start_Date = jsgfDate_Format("01/01/" + Last_Year.toString(),1);
        Report_End_Date = jsgfDate_Format("12/31/" + Last_Year.toString(),1);
		break;
		}
    case 24:		//Greater than 12 months
		{
		Report_Start_Date = jsgfDate_Format(This_Month.toString() + "/" + This_Day.toString() + "/" + This_Year.toString(),1);
		Report_End_Date = ""
		break;
		}
    case 25:		//Last School Year
		{
        if(This_Month>=9)
			{
                Report_Start_Date = jsgfDate_Format("09/01/" + Last_Year.toString(),1);
                Report_End_Date = jsgfDate_Format("08/31/" + This_Year.toString(),1);
			}
		else
			{
                Report_Start_Date = jsgfDate_Format("09/01/" + Last_Year_Minus_1.toString(),1);
                Report_End_Date = jsgfDate_Format("08/31/" + Last_Year.toString(),1);
			}
		break;
		}
    case 26:		//Next month
		{
		var End_Month=This_Month+1;
		var End_Year=This_Year;
		if (End_Month>12)
			{
			End_Month=End_Month-12;
			End_Year++;
			}

		Report_Start_Date = jsgfDate_Format(This_Month.toString() + "/" + This_Day.toString() + "/" + This_Year.toString(),1);
		Report_End_Date = jsgfDate_Format(End_Month.toString() + "/" + This_Day.toString() + "/" + End_Year.toString(),1);
		break;
		}
    case 27:		//Previous Month
		{
		var End_Month=This_Month-1;
		var End_Year=This_Year;
		if (End_Month<1)
			{
			End_Month=End_Month+12;
			End_Year--;
			}
		Report_Start_Date = jsgfDate_Format(This_Month.toString() + "/" + This_Day.toString() + "/" + This_Year.toString(),1);
		Report_End_Date = jsgfDate_Format(End_Month.toString() + "/" + This_Day.toString() + "/" + End_Year.toString(),1);
		break;
		}
	}
	
jsgetRefToElement("Review_From").value=Report_Start_Date;
jsgetRefToElement("Review_To").value=Report_End_Date;
return false;
}

function Review_From_Changed()
{
jsDate_Confirm("Review_From", true, true);
jsgetRefToElement("ddlSelect_Date_Range").value=-1;
}

function Select_Review_From_Clicked()
{
jsgetRefToElement("ddlSelect_Date_Range").value=-1;
Select_Date("Review_From");
}

function Review_To_Changed()
{
jsDate_Confirm("Review_To", true, true);
jsgetRefToElement("ddlSelect_Date_Range").value=-1;
}

function Select_Review_To_Clicked()
{
jsgetRefToElement("ddlSelect_Date_Range").value=-1;
Select_Date("Review_To")
}

function ddlSelect_Date_Range_changed()
{
Set_Date_Range(jsgetRefToElement("ddlSelect_Date_Range").value);
}

function bReset_clicked()
{
var Reset_Range=3;

if (jsgetRefToElement("Page_Id").value=="Offsite_menu")
	{
	Reset_Range=13;
	}
Set_Date_Range(Reset_Range);
jsgetRefToElement("ddlSelect_Date_Range").value=Reset_Range;
jsgetRefToElement("fReview_Date_Range").action="./" + jsgetRefToElement("Page_Id").value + ".asp?Reset=1";
jsgetRefToElement("fReview_Date_Range").submit();
}

function bPrint_clicked()
{
jsgetRefToElement("fReview_Date_Range").action="./" + jsgetRefToElement("Page_Id").value + ".asp?fprint=1";
jsgetRefToElement("fReview_Date_Range").target="_blank";
jsgetRefToElement("fReview_Date_Range").submit();
}

function bRefresh_clicked()
{
jsgetRefToElement("fReview_Date_Range").action="./" + jsgetRefToElement("Page_Id").value + ".asp";
jsgetRefToElement("fReview_Date_Range").target="_self";
jsgetRefToElement("fReview_Date_Range").submit();
}

function jsSelect_BU_Id()
{
Clear_Estab();

var Bu_Name="BU_Id";
var Bu_Description_Name="BU_Id_Description";
var SID=jsgetRefToElement("SID").value;
var AID=jsgetRefToElement("sys_Auth_Id").value;
var url= "../admin/jsselect_bus_Unit.asp?SID=" + SID + "&AID=" + AID + "&Bu_Name=" + Bu_Name + "&Bu_Description_Name=" + Bu_Description_Name;

jsOpen_Window(url);
}

function Own_BU_Id()
{
Clear_Estab();

jsgetRefToElement("BU_Id").value=jsgetRefToElement("sys_User_Bu_Id").value;
jsgetRefToElement("BU_Id_Description").value=jsgetRefToElement("sys_User_Bu_Id_Description").value;
}

function Own_Dir()
{
Clear_Estab();
	
jsgetRefToElement("BU_Id").value=jsgetRefToElement("sys_User_Directorate_Bu_Id").value;
jsgetRefToElement("BU_Id_Description").value="Own Directorate";
}

function Own_Auth()
{
Clear_Estab();
	
jsgetRefToElement("BU_Id").value=0;
jsgetRefToElement("BU_Id_Description").value="Own Authority";
}

function jsSelectEstablishments()
{
Clear_BU_Id()

var url= "../admin/jsSelect_addr.asp?SID=" + jsgetRefToElement("SID").value + "&AID=" + jsgetRefToElement("sys_Auth_Id").value + "&IncLocType=-1"

jsOpen_Window(url);
}

function Own_Estab()
{
Clear_BU_Id();
jsgetRefToElement("Estab_Name").value=jsgetRefToElement("sys_Estab_Name").value;
}

function Clear_BU_Id()
{
isAuto_Clear_BU_Estab=jsgetRefToElement("isAuto_Clear_BU_Estab").value;
if (isAuto_Clear_BU_Estab==1)
	{
	jsgetRefToElement("BU_Id").value=0;
	jsgetRefToElement("BU_Id_Description").value="";
	}
}

function Clear_Estab()
{
isAuto_Clear_BU_Estab=jsgetRefToElement("isAuto_Clear_BU_Estab").value;
if (isAuto_Clear_BU_Estab==1)
	{
	jsgetRefToElement("Estab_Name").value="";
	}
}

/* ***********************
' End
' Date range Selection Functions
' ***********************
*/
function Show_Secure_Menu()
{
jsgetRefToElement("Secure_Menur1").style.display="inline";
jsgetRefToElement("Secure_Menurtd1").style.height="25px";
jsgetRefToElement("Secure_Menur2").style.display="inline";
jsgetRefToElement("Secure_Menurtd2").style.height="25px";
jsgetRefToElement("Secure_Menur3").style.display="inline";
jsgetRefToElement("Secure_Menurtd3").style.height="25px";
}

function Show_Journal(Case_Id)
{
var url="../forms_case/Case_Journal.asp?SID=" + jsgetRefToElement("SID").value + "&Case_Id=" + Case_Id;
//var mwh=screen.availHeight;
//var mww=screen.availWidth;
var mwh=700;
var mww=1100;
var mwt=screen.availTop;
var mwl=screen.availLeft;
var options="menubar=no,toolbar=no,location=no,directories=no,status=no,scrollbars,resizable,left=" + mwl + ",top=" + mwt + ",width=" + mww + ",height=" + mwh;
window.open(url,"Journal",options);
}

//*******************************************************
//Handle the crlf to <br> conversion
//*******************************************************

function Replace_CRLF_BR(In_Text)
{
var Out_Text=In_Text;

Out_Text=Out_Text.replace(/\n/g, "<br>")

return Out_Text;
	
}

//*******************************************************
//Handle the Audio Help window
//*******************************************************

function Audio_Help(Help_Name)
{
var Audio_Help_url="http://www.schoolshealthandsafety.co.uk/CYPD/Misc_html/Presentation_Files/" + Help_Name;
jsOpen_Win_Name_Max(Audio_Help_url, "Audio_Help")
}

//*******************************************************
//Handle the Help window
//*******************************************************

function EEC_Help(Help_Type, Help_Name)
{
var Help_url="./" + Help_Type + "/" + Help_Name + ".html";
jsOpen_Win_Name_Max(Help_url, "EEC_Help")
}


function addEvent(elem, evtType, func, capture)
{
capture= (capture) ? capture: false;
if (elem.addEventListener)
	{
	elem.addEventListener(evtType, func, capture);
	}
else
	{
	if (elem.attachEvent)
		{
		elem.attachEvent("on"+ evtType, func);
		}
	else
		{
		elem["on"+ evtType]= func;
		}
	}
}

function removeEvent(elem, evtType, func, capture)
{
capture= (capture) ? capture: false;
if (elem.removeEventListener)
	{
	elem.removeEventListener(evtType, func, capture);
	}
else
	{
	if (elem.attachEvent)
		{
		elem.detachEvent("on"+ evtType, func);
		}
	else
		{
		elem["on"+ evtType]= null;
		}
	}
}

// the following routine is courtesy of QuirksWeb

var BrowserDetect = {
	init: function () {
		this.browser = this.searchString(this.dataBrowser) || "An unknown browser";
		this.version = this.searchVersion(navigator.userAgent)
			|| this.searchVersion(navigator.appVersion)
			|| "an unknown version";
		this.OS = this.searchString(this.dataOS) || "an unknown OS";
	},
	searchString: function (data) {
		for (var i=0;i<data.length;i++)	{
			var dataString = data[i].string;
			var dataProp = data[i].prop;
			this.versionSearchString = data[i].versionSearch || data[i].identity;
			if (dataString) {
				if (dataString.indexOf(data[i].subString) != -1)
					return data[i].identity;
			}
			else if (dataProp)
				return data[i].identity;
		}
	},
	searchVersion: function (dataString) {
		var index = dataString.indexOf(this.versionSearchString);
		if (index == -1) return;
		return parseFloat(dataString.substring(index+this.versionSearchString.length+1));
	},
	dataBrowser: [
		{
			string: navigator.userAgent,
			subString: "Chrome",
			identity: "Chrome"
		},
		{ 	string: navigator.userAgent,
			subString: "OmniWeb",
			versionSearch: "OmniWeb/",
			identity: "OmniWeb"
		},
		{
			string: navigator.vendor,
			subString: "Apple",
			identity: "Safari",
			versionSearch: "Version"
		},
		{
			prop: window.opera,
			identity: "Opera"
		},
		{
			string: navigator.vendor,
			subString: "iCab",
			identity: "iCab"
		},
		{
			string: navigator.vendor,
			subString: "KDE",
			identity: "Konqueror"
		},
		{
			string: navigator.userAgent,
			subString: "Firefox",
			identity: "Firefox"
		},
		{
			string: navigator.vendor,
			subString: "Camino",
			identity: "Camino"
		},
		{		// for newer Netscapes (6+)
			string: navigator.userAgent,
			subString: "Netscape",
			identity: "Netscape"
		},
		{
			string: navigator.userAgent,
			subString: "MSIE",
			identity: "Explorer",
			versionSearch: "MSIE"
		},
		{
			string: navigator.userAgent,
			subString: "Gecko",
			identity: "Mozilla",
			versionSearch: "rv"
		},
		{ 		// for older Netscapes (4-)
			string: navigator.userAgent,
			subString: "Mozilla",
			identity: "Netscape",
			versionSearch: "Mozilla"
		}
	],
	dataOS : [
		{
			string: navigator.platform,
			subString: "Win",
			identity: "Windows"
		},
		{
			string: navigator.platform,
			subString: "Mac",
			identity: "Mac"
		},
		{
			string: navigator.userAgent,
			subString: "iPhone",
			identity: "iPhone/iPod"
	    },
		{
			string: navigator.platform,
			subString: "Linux",
			identity: "Linux"
		}
	]

};
BrowserDetect.init();

//alert("Browser name: " + BrowserDetect.browser);
//alert("Browser version: " + BrowserDetect.version);
//alert("OS name: " + BrowserDetect.OS);

Check_Browser()

function Check_Browser()
{
if (BrowserDetect.browser!="Explorer")
	{
	if (jsgetRefToElement("cssExplorer"))
		{
		jsgetRefToElement("cssExplorer").disabled=true;
		}
	}
else
	{
	var added = false;
	for (var S = 0; S < document.styleSheets.length; S++){
	
		var cssRules = 'rules';
			
		for (var R = 0; R < document.styleSheets[S][cssRules].length; R++) {
			if (document.styleSheets[S][cssRules][R].selectorText == "button") {
				try{
					document.styleSheets[S].insertRule('button { padding: 1px 4px; }',document.styleSheets[S][cssRules].length);
					}
					catch(err){
					}
		
	
				added =true;
				break;
				}
			}
	
		if (added )
			{
				break;
			}
		}
	}
}



// *****************************************************
// Handle the Field Info areas
// *****************************************************

function Field_Info_Clear()
{
Field_Put_Info("");
}

function Field_Info(Field_Name_Info)
{
Field_Put_Info(Field_Name_Info);
}

function Field_Put_Info(Info)
{
if (parent.parent.document.getElementById("Info_Box"))
	{
	parent.parent.document.getElementById("Info_Box").innerHTML=Info;
	}
else
	{
	if (parent.document.getElementById("Info_Box"))
		{
		parent.document.getElementById("Info_Box").innerHTML=Info;
		}
	else
		{
		if (jsgetRefToElement("Info_Box"))
			{
			jsgetRefToElement("Info_Box").innerHTML=Info;
			}
		}
	}
}


function Set_Mouseovers()
{

var e=document.getElementsByTagName("span");
for	(var i=0;i<e.length;i++)
	{
	if (e[i].className.indexOf("label")!=-1)
		{
		addEvent(e[i], "mouseover", Section_Hover, false)
		addEvent(e[i], "mouseout", Section_Normal, false)
		}
	}
var e=document.getElementsByTagName("td");
for	(var i=0;i<e.length;i++)
	{
	if (e[i].className=="Section")
		{
		addEvent(e[i], "mouseover", Section_Hover, false)
		addEvent(e[i], "mouseout", Section_Normal, false)
		}
	}
var e=document.getElementsByTagName("a");
for	(var i=0;i<e.length;i++)
	{
	if (e[i].className=="aCS")
		{
		addEvent(e[i], "mouseover", Section_Hover, false)
		addEvent(e[i], "mouseout", Section_Normal, false)
		}
	}

}




//encrypt a given string then return //uses Sha1
function doEncrypt(pInput)
{
	return pInput;
	
    var vInput, vResult

    //grab password to be encrypted
    vInput = pInput;

    //encrypt password
    vResult = Sha1.hash(vInput, false);

    return vResult;
}
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  */
/*  SHA-1 implementation in JavaScript | (c) Chris Veness 2002-2010 | www.movable-type.co.uk      */
/*   - see http://csrc.nist.gov/groups/ST/toolkit/secure_hashing.html                             */
/*         http://csrc.nist.gov/groups/ST/toolkit/examples.html                                   */
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  */
var Sha1 = {};  // Sha1 namespace
/**
* Generates SHA-1 hash of string
*
* @param {String} msg                String to be hashed
* @param {Boolean} [utf8encode=true] Encode msg as UTF-8 before generating hash
* @returns {String}                  Hash of msg as hex character string
*/
Sha1.hash = function (msg, utf8encode)
{
    utf8encode = (typeof utf8encode == 'undefined') ? true : utf8encode;

    // convert string to UTF-8, as SHA only deals with byte-streams
    if (utf8encode) msg = Utf8.encode(msg);

    // constants [§4.2.1]
    var K = [0x5a827999, 0x6ed9eba1, 0x8f1bbcdc, 0xca62c1d6];

    // PREPROCESSING 

    msg += String.fromCharCode(0x80);  // add trailing '1' bit (+ 0's padding) to string [§5.1.1]

    // convert string msg into 512-bit/16-integer blocks arrays of ints [§5.2.1]
    var l = msg.length / 4 + 2;  // length (in 32-bit integers) of msg + ‘1’ + appended length
    var N = Math.ceil(l / 16);   // number of 16-integer-blocks required to hold 'l' ints
    var M = new Array(N);

    for (var i = 0; i < N; i++)
    {
        M[i] = new Array(16);
        for (var j = 0; j < 16; j++)
        {  // encode 4 chars per integer, big-endian encoding
            M[i][j] = (msg.charCodeAt(i * 64 + j * 4) << 24) | (msg.charCodeAt(i * 64 + j * 4 + 1) << 16) |
        (msg.charCodeAt(i * 64 + j * 4 + 2) << 8) | (msg.charCodeAt(i * 64 + j * 4 + 3));
        } // note running off the end of msg is ok 'cos bitwise ops on NaN return 0
    }
    // add length (in bits) into final pair of 32-bit integers (big-endian) [§5.1.1]
    // note: most significant word would be (len-1)*8 >>> 32, but since JS converts
    // bitwise-op args to 32 bits, we need to simulate this by arithmetic operators
    M[N - 1][14] = ((msg.length - 1) * 8) / Math.pow(2, 32); M[N - 1][14] = Math.floor(M[N - 1][14])
    M[N - 1][15] = ((msg.length - 1) * 8) & 0xffffffff;

    // set initial hash value [§5.3.1]
    var H0 = 0x67452301;
    var H1 = 0xefcdab89;
    var H2 = 0x98badcfe;
    var H3 = 0x10325476;
    var H4 = 0xc3d2e1f0;

    // HASH COMPUTATION [§6.1.2]

    var W = new Array(80); var a, b, c, d, e;
    for (var i = 0; i < N; i++)
    {

        // 1 - prepare message schedule 'W'
        for (var t = 0; t < 16; t++) W[t] = M[i][t];
        for (var t = 16; t < 80; t++) W[t] = Sha1.ROTL(W[t - 3] ^ W[t - 8] ^ W[t - 14] ^ W[t - 16], 1);

        // 2 - initialise five working variables a, b, c, d, e with previous hash value
        a = H0; b = H1; c = H2; d = H3; e = H4;

        // 3 - main loop
        for (var t = 0; t < 80; t++)
        {
            var s = Math.floor(t / 20); // seq for blocks of 'f' functions and 'K' constants
            var T = (Sha1.ROTL(a, 5) + Sha1.f(s, b, c, d) + e + K[s] + W[t]) & 0xffffffff;
            e = d;
            d = c;
            c = Sha1.ROTL(b, 30);
            b = a;
            a = T;
        }

        // 4 - compute the new intermediate hash value
        H0 = (H0 + a) & 0xffffffff;  // note 'addition modulo 2^32'
        H1 = (H1 + b) & 0xffffffff;
        H2 = (H2 + c) & 0xffffffff;
        H3 = (H3 + d) & 0xffffffff;
        H4 = (H4 + e) & 0xffffffff;
    }

    return Sha1.toHexStr(H0) + Sha1.toHexStr(H1) +
    Sha1.toHexStr(H2) + Sha1.toHexStr(H3) + Sha1.toHexStr(H4);
}
//
// function 'f' [§4.1.1]
//
Sha1.f = function (s, x, y, z)
{
    switch (s)
    {
        case 0: return (x & y) ^ (~x & z);           // Ch()
        case 1: return x ^ y ^ z;                    // Parity()
        case 2: return (x & y) ^ (x & z) ^ (y & z);  // Maj()
        case 3: return x ^ y ^ z;                    // Parity()
    }
}
//
// rotate left (circular left shift) value x by n positions [§3.2.5]
//
Sha1.ROTL = function (x, n)
{
    return (x << n) | (x >>> (32 - n));
}
//
// hexadecimal representation of a number 
//   (note toString(16) is implementation-dependant, and  
//   in IE returns signed numbers when used on full words)
//
Sha1.toHexStr = function (n)
{
    var s = "", v;
    for (var i = 7; i >= 0; i--) { v = (n >>> (i * 4)) & 0xf; s += v.toString(16); }
    return s;
}
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  */
