//Constants - Meaningful dates for which different values are used in the calculation
var JAN2004=new Date(2004,0,1);
var MAR2004=new Date(2004,2,1);
//Calculates the COLA for the period specified in the drop-down lists
function calculate(e)
{
	var rows,rowsLength,i,addition,floor,
		percentage,ceiling,max,extra,
		dateArray,currentDate,
		startYear,startMonth,endYear,
		endMonth,startDate,endDate,
		initialSalaryTextBox,initialSalary,
		adhereToCeiling,calculatedSalary,
		requiredValidator,RXValidator,
		datesValidator,args;
	requiredValidator=document.getElementById(IDPREFIX+'InitialSalaryRequiredValidator');
	RXvalidator=document.getElementById(IDPREFIX+'InitialSalaryRXValidator');
	datesValidator=document.getElementById(IDPREFIX+'DatesValidator');
	ValidatorValidate(requiredValidator);
	ValidatorValidate(RXvalidator);
	valid=true;
	args = { IsValid: false };

	while(null!=datesValidator.firstChild)
	{
		datesValidator.removeChild(datesValidator.firstChild);
	}
	if(!requiredValidator.isvalid)
	{
		valid=false;
		datesValidator.insertBefore(document.createTextNode(requiredValidator.title),datesValidator.firstChild);
	}
	else if(!(RXvalidator.isvalid))
	{
		valid=false;
		datesValidator.insertBefore(document.createTextNode(RXvalidator.title),datesValidator.firstChild);
	}
	validateDates(null,args);
	if(!args.IsValid)
	{
		if(!valid)
		{
			datesValidator.appendChild(document.createElement('br'));
		}
		datesValidator.appendChild(document.createTextNode(datesValidator.title));
		valid=false;
	}
	rows=document.getElementById('COLATableBody').rows;
	startYear=document.getElementById(IDPREFIX+'StartYearDropDownList');
	startMonth=document.getElementById(IDPREFIX+'StartMonthDropDownList');
	endYear=document.getElementById(IDPREFIX+'EndYearDropDownList');
	endMonth=document.getElementById(IDPREFIX+'EndMonthDropDownList');
	initialSalaryTextBox=document.getElementById(IDPREFIX+'InitialSalaryTextBox');
	initialSalary=Number(initialSalaryTextBox.value.replace(/,/g,''));
	adhereToCeiling=document.forms[0][NAMEPREFIX+'CeilingRadioButtonList'][0].checked;
	startDate=new Date(Number(startYear.value),Number(startMonth.value)-1,1);
	endDate=new Date(Number(endYear.value),Number(endMonth.value)-1,1);
	rowsLength=rows.length;
	calculatedSalary=initialSalary;
	datesValidator.style.display='none';
	if(valid)
	{
		for(i=rowsLength-1;i>=0;i--)
		{
			dateArray=rows[i].cells[0].firstChild.nodeValue.split('/');
			currentDate=new Date(Number(dateArray[1]),Number(dateArray[0])-1,1);//Holds the date for the currently inspected row
			if((startDate<=currentDate)&&(endDate>=currentDate))
			{
				//Parse values stored in current row
				percentage=Number(rows[i].cells[1].firstChild.nodeValue);
				ceiling=Number(rows[i].cells[2].firstChild.nodeValue.replace(/,/g,''));
				max=Number(rows[i].cells[3].firstChild.nodeValue);

				addition=0;//Prevent garbage from collecting across iterations

				//These remain the same for everything except JAN&MAR 2004
				floor=0;
				extra=0;

				addClass('Highlight',rows[i],false);

				if(0===(currentDate-endDate))
				{
					rows[i].scrollIntoView();
				}

				//01/2004 & 03/2004 get special treatment
				if(0===(currentDate-MAR2004))
				{
					floor=3335.18;
					extra=87.3;
				}
				else if(0===(currentDate-JAN2004))
				{
					floor=3335.18;
				}

				if((adhereToCeiling)&&(calculatedSalary>(ceiling+extra)))
				{
					addition=max;
				}
				else if(0!==(currentDate-MAR2004))
				{
					addition=(calculatedSalary-floor)*percentage/100;
				}
				else if(calculatedSalary>(7700+extra))
				{
					addition=((calculatedSalary-extra-floor)*percentage/100-extra);
				}

				if (addition < 0)
				{
				  addition = 0;
				}
        
				calculatedSalary+= addition;
			}
			else
			{
				removeClass('Highlight',rows[i],true);
			}
		}
		calculatedSalary=Number.beautify(calculatedSalary);
		document.getElementById(IDPREFIX+'CalculatedSalaryTextBox').value=calculatedSalary;
	}
	else
	{
		datesValidator.style.display='inline';
	}
}
//Page init
function body_Load()
{
	var initialSalaryTextBox,disclaimer,
	startYear,startMonth,
	endYear,endMonth,calculateButton,
	ceilingRadioButtonList,
	ceilingRadioButtonListLength,i;
	if('function'===typeof ieLoader)
	{
		ieLoader();
	}
	else
	{
		disclaimer=document.getElementById('Disclaimer');
		setInterval(function()
		{
			var indexTable,height;
			indexTable=document.getElementById('COLATable');
			height=document.documentElement.clientHeight-disclaimer.offsetHeight-indexTable.offsetTop-indexTable.tHead.offsetHeight;
			if((height>50)&&(indexTable.tBodies[0].style.height!==(height+'px')))
			{
				indexTable.tBodies[0].style.height=height+'px';
			}
		},0);
		disclaimer.setAttribute('style','position:absolute;bottom:0px;');

	}
	initialSalaryTextBox=document.getElementById(IDPREFIX+'InitialSalaryTextBox');
	startYear=document.getElementById(IDPREFIX+'StartYearDropDownList');
	startMonth=document.getElementById(IDPREFIX+'StartMonthDropDownList');
	endYear=document.getElementById(IDPREFIX+'EndYearDropDownList');
	endMonth=document.getElementById(IDPREFIX+'EndMonthDropDownList');
	ceilingRadioButtonList=document.forms[0][NAMEPREFIX+'CeilingRadioButtonList'];
	calculateButton=document.getElementById(IDPREFIX+'CalculateButton');
	ceilingRadioButtonListLength=ceilingRadioButtonList.length;

	attachEventListener('focus',initialSalaryTextBox,textBox_Focus);
	attachEventListener('blur',initialSalaryTextBox,textBox_Blur);
	attachEventListener('change',initialSalaryTextBox,calculate);
	attachEventListener('change',startYear,calculate);
	attachEventListener('change',startMonth,calculate);
	attachEventListener('change',endYear,calculate);
	attachEventListener('change',endMonth,calculate);
	for(i=0;i<ceilingRadioButtonListLength;i++)
	{
		attachEventListener('click',ceilingRadioButtonList[i],calculate);
	}
	attachEventListener('submit',calculateButton.form,function(e)
	{//Gecko needs this, it allows us to prevent doing a form.submit() when doing async calls
		var evt=new CommonEvent(e);
		evt.cancel();
		return false;
	});
	attachEventListener('click',calculateButton,calculate);
}
function validateDates(source,args)
{
	var startYear,startMonth,startDate,endYear,endMonth,endDate;
	startYear=Number(document.getElementById(IDPREFIX+'StartYearDropDownList').value);
	startMonth=Number(document.getElementById(IDPREFIX+'StartMonthDropDownList').value);
	startDate=new Date(startYear,startMonth-1,1);
	endYear=Number(document.getElementById(IDPREFIX+'EndYearDropDownList').value);
	endMonth=Number(document.getElementById(IDPREFIX+'EndMonthDropDownList').value);
	endDate=new Date(endYear,endMonth-1,1);	
	args.IsValid=endDate>startDate;
}