function lowercase(field)
{
	if (field.value != field.value.toLowerCase())
	{
		field.value = field.value.toLowerCase();
	}
	return true;
}

function checkboxes(box,myArray)
{
	for (var i = 0 ; i < myArray.length; i++)
	{
		var chkbox = myArray[i];
		if (chkbox != box)
		{
			chkbox.checked = false;
		}
  }
}

function getLeft(width)
{
	var result;
	if (document.all)
	{
		result = window.screenLeft + Math.round((document.body.clientWidth + 20 - width) / 2);
	}
	else
	{
		result = window.screenX + Math.round((window.outerWidth - width) / 2);
	}
	return result;
}

function getTop(height)
{
	var result;
	if (document.all)
	{
		result = window.screenTop + Math.round((document.body.clientHeight - 76 - height) / 2);
	}
	else
	{
		result = window.screenY + Math.round((window.outerHeight - height) / 2);
	}
	return result;
}

// Modal dialogs prevent interaction with parent, do not have a window.opener, and the function showModalDialog() does not return until the window is closed.
// This is useful for choosers, but they have to be rearchitected in order to pass values back to the parent in the window.returnValue.
// This only works in IE. Firefox doesn't support showModalDialog().
function openDialog(url,name,width,height)
{
	cancelOverlay();
	if (window.showModalDialog)
	{
		var options = 'resizable: yes';
		var left, top;
		if (width)
		{ 
			options += ';dialogWidth: ' + width + 'px';
			left = getLeft(width);
			if (left !== undefined)
				options += ';dialogLeft: ' + left + 'px';
		}
		if (height)
		{
			options += ';dialogHeight: ' + height + 'px';
			top = getTop(height);
			if (top !== undefined)
				options += ';dialogTop: ' + top + 'px';
		}
		window.showModalDialog(url,'',options);
	} 
	else
	{
		openPopupWindow(url,name,width,height);
	}
}

function openPopupWindow(url,name,width,height,custom_options)
{
	cancelOverlay();
	var options = 'toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=yes,resizable=yes,copyhistory=yes,dialog=yes,dependent=yes,alwaysRaised=yes,modal=yes';
	if (custom_options !== undefined)
	{
		options = custom_options;
	}
	var left, top;
	// Attempt to center the popup window on the parent window
	if (width !== undefined)
	{
		options += ',width=' + width + ',outerWidth=' + width;
		left = getLeft(width);
		if (left !== undefined)
			options += ',left=' + left + ',screenX=' + left; 
	}
	if (height !== undefined)
	{
		options += ',height=' + height + ',outerHeight=' + height;
		top = getTop(height);
		if (top !== undefined)
			options += ',top=' + top + ',screenY=' + top;
	}
	var win = window.open(url,name,options);
	if (!win.opener)
	{
		win.opener = window;
	}
	if (navigator.userAgent.indexOf('httpunit') < 0)
	{
		if (width !== undefined && height !== undefined)
		{
			win.resizeTo(width,height);
		}
		if (left !== undefined && top !== undefined)
		{
			win.moveTo(left,top);
		}
	}
	
	return win;
}

function openWindow(url,name)
{
	cancelOverlay();
	if (name)
	{
		var win = window.open(url,name);
	}
	else
	{
		var win = window.open(url, 'pop_up');
	}
	if (!win.opener)
	{
		win.opener = window;
	}
}

// handleSubmit() and handleBeforeUnload() are used for overlay on forms to protect against duplicate submit
// form_submitted_flag is used as redundant protection to short circuit submit button after 1st click

window.onbeforeunload = startOverlay;

var form_submitted_flag = false;
var overlay_timeout = null;

function handleSubmit()
{
	if (form_submitted_flag === false)
	{
		form_submitted_flag = true;
		if (navigator.userAgent.indexOf('httpunit') < 0)
		{
			document.body.style.cursor = "wait";
		}
		return true;
	}
	return false;
}

function startOverlay()
{
	if (navigator.userAgent.indexOf('httpunit') >= 0)
	{
		return;
	}
	overlay_timeout = window.setTimeout('displayOverlay()', 1000);
}

function cancelOverlay()
{
	if (navigator.userAgent.indexOf('httpunit') >= 0)
	{
		return;
	}
	if (overlay_timeout !== null)
	{
		window.clearTimeout(overlay_timeout);
		overlay_timeout = null;
	}
}

function hideOverlay()
{
	if (navigator.userAgent.indexOf('httpunit') >= 0)
	{
		return;
	}

	cancelOverlay();

	var ol_waitBox = document.getElementById('ol_waitBox');
	if (ol_waitBox)
	{
		ol_waitBox.parentNode.removeChild(ol_waitBox);
		var ol_innerDiv = document.getElementById('ol_innerDiv');
		ol_innerDiv.parentNode.removeChild(ol_innerDiv);
		var ol_outterDiv = document.getElementById('ol_outterDiv');
		ol_outterDiv.parentNode.removeChild(ol_outterDiv);
	}
	if (navigator.userAgent.toLowerCase().indexOf("msie") != -1 && navigator.userAgent.toLowerCase().indexOf("opera") == -1)
	{
		window.detachEvent('onresize', reportResizeEvent);
		window.detachEvent('onscroll', reportScrollEvent);
	}
}

function displayOverlay()
{
	if (navigator.userAgent.indexOf('httpunit') >= 0)
	{
		return;
	}
	overlay_timeout = null;
	var allSelects = document.getElementsByTagName('select');
	// disable all selects, since we don't want to use iframe as overlay object
	for (var i = 0; i < allSelects.length; i++)
	{
		allSelects[i].disabled = true;
	}
	//build div tags to cover form
	var outterDiv = document.createElement('div');
	var innerDiv = document.createElement('div');
	var waitboxDiv = document.createElement('div');
	var spinnerImage = document.createElement('img');
	outterDiv.setAttribute("id", "ol_outterDiv");
	innerDiv.setAttribute("id", "ol_innerDiv");
	waitboxDiv.setAttribute("id", "ol_waitBox");
	spinnerImage.setAttribute("id", "busy_spinner");	
	spinnerImage.setAttribute("src", "/service/images/busy.gif");	
	waitboxDiv.appendChild(spinnerImage);
	innerDiv.appendChild(waitboxDiv);
	document.getElementsByTagName('body')[0].firstChild.parentNode.insertBefore(innerDiv, document.getElementsByTagName('body')[0].firstChild);
	innerDiv.parentNode.insertBefore(outterDiv, innerDiv);
	// I.E. 6 and before does not support position: fixed, thus need the below work-around
	if (navigator.userAgent.toLowerCase().indexOf("msie") != -1 && navigator.userAgent.toLowerCase().indexOf("opera") == -1)
	{
		outterDiv.style.top = f_scrollTop();
		outterDiv.style.position = 'absolute';
		var height = (f_clientHeight() / 2) + f_scrollTop();
		var width = (f_clientWidth() / 2) + f_scrollLeft();
		innerDiv.style.top = height;
		innerDiv.style.left = width;
		//if (typeof window.addEventListener !== undefined)
		//{
		//	//alert('adding eventListener');
		//	window.addEventListener('resize', function (evt) {reportResizeEvent(); }, false);
		//	window.addEventListener('scroll', function (evt) {reportScrollEvent(); }, false);
	  //}
		//else
		//alert('adding attachEvent');
		window.attachEvent('onresize', reportResizeEvent);
		window.attachEvent('onscroll', reportScrollEvent);
	}
	else
	{
		outterDiv.style.top = 0;
		outterDiv.style.position = 'fixed';
		innerDiv.style.left = '50%';
		innerDiv.style.top = '50%';
	}
}

function f_clientWidth()
{
	return f_filterResults (
		window.innerWidth ? window.innerWidth : 0,
		document.documentElement ? document.documentElement.clientWidth : 0,
		document.body ? document.body.clientWidth : 0);
}

function f_clientHeight()
{
	return f_filterResults (
		window.innerHeight ? window.innerHeight : 0,
		document.documentElement ? document.documentElement.clientHeight : 0,
		document.body ? document.body.clientHeight : 0);
}

function f_scrollLeft()
{
	return f_filterResults (
		window.pageXOffset ? window.pageXOffset : 0,
		document.documentElement ? document.documentElement.scrollLeft : 0,
		document.body ? document.body.scrollLeft : 0);
}

function f_scrollTop()
{
	return f_filterResults (
		window.pageYOffset ? window.pageYOffset : 0,
		document.documentElement ? document.documentElement.scrollTop : 0,
		document.body ? document.body.scrollTop : 0);
}

function f_filterResults(n_win, n_docel, n_body)
{
	var n_result = n_win ? n_win : 0;
	if (n_docel && (!n_result || (n_result > n_docel)))
	{
		n_result = n_docel;
	}
	return n_body && (!n_result || (n_result > n_body)) ? n_body : n_result;
}

function reportScrollEvent()
{
	//alert('moving');
	//testNow();
	var ol_outterDiv = document.getElementById('ol_outterDiv');
	ol_outterDiv.style.left = f_scrollLeft();
	ol_outterDiv.style.top = f_scrollTop();

	var ol_innerDiv = document.getElementById('ol_innerDiv');
	var top = (f_clientHeight() / 2) + f_scrollTop();
	var left = (f_clientWidth() / 2) + f_scrollLeft();
	
	// for I.E. 7 don't want to add the f_scrollLeft();
	if (navigator.appVersion.indexOf("MSIE") != -1)
	{
		var temp = navigator.appVersion.split("MSIE");
		var version = parseFloat(temp[1]);
		if (version >= 7.0)
		{
			var left = (f_clientWidth() / 2);
		}
	}	

	ol_innerDiv.style.top = top;
	ol_innerDiv.style.left = left;
}

function reportResizeEvent()
{
	// for now this is enough
	return reportScrollEvent();
}

function testNow()
{
	window.alert('client width = ' + f_clientWidth() + ' client height = ' + f_clientHeight() + ' scroll left = ' + f_scrollLeft() + ' scroll top = ' + f_scrollTop());
	return false;
}

function go(refreshOpener, newUser, templatePath)
{
	if (newUser == undefined && templatePath == undefined && refreshOpener == undefined)
	{
		alert(window.opener.location);
	}
	else if (newUser != undefined && newUser.length > 0)
	{
		window.location = templatePath + 'multi_subscribe.html';
	}
	else if (refreshOpener == 'YES')
	{
		if (window.opener && window.opener.location)
		{
			window.opener.location.reload();
		}
		window.close();
	}
	else
	{
		window.close();
	}
}

function goClose(type, origin, refreshOpener)
{
	if (type.toLowerCase == 'custom')
	{
		window.location = origin;
		return;
	}
	else if (refreshOpener == 'YES')
	{
		if (window.opener && window.opener.location)
		{
			window.opener.location.reload();
		}
	}
	if (origin == '')
	{
		if (type.toLowerCase == 'normal')
		{
			window.opener = top;
		}
		window.close();
	}
	else
	{
		window.location = origin;
	}
}

function loginOnPropertyChange()
{
	return lowercase(document.getElementById('login'));
}

function forgotLoginOnPropertyChange()
{
	return lowercase(document.forgot.login);
}

function subscribersOnPropertyChange()
{
	return lowercase(document.getElementById('subscribers'));
}

function addLoginEvent()
{
	if(navigator.userAgent.toLowerCase().indexOf('firefox') < 0 && navigator.userAgent.indexOf('httpunit') < 0)
	{
		document.getElementById('login').attachEvent("onpropertychange", loginOnPropertyChange);
	}
}

function addForgotLoginEvent()
{
	if(navigator.userAgent.toLowerCase().indexOf('firefox') < 0 && navigator.userAgent.indexOf('httpunit') < 0)
	{
		document.forgot.login.attachEvent("onpropertychange", forgotLoginOnPropertyChange);
	}
}

function addSubscribersEvent()
{
	if(navigator.userAgent.toLowerCase().indexOf('firefox') < 0 && navigator.userAgent.indexOf('httpunit') < 0 && document.getElementById('subscribers'))
	{
		document.getElementById('subscribers').attachEvent("onpropertychange", subscribersOnPropertyChange);
	}
}