function open_maxed_window(link, name)
{
	var options = (document.all ? "fullscreen" : "screenX=0,screenY=0,scrollbars=yes,width=" + self.screen.availWidth + ",height=" + self.screen.availHeight);
	window.open(link, name, options);
}

function center_window(newWidth, newHeight)
{
	if (document.layers)
	{
		newWidth -= parent.outerWidth - parent.innerWidth;
		newHeight -= parent.outerHeight - parent.innerHeight;
	}
	parent.window.resizeTo(newWidth, newHeight);
	parent.window.moveTo((screen.width - newWidth) / 2, (screen.availHeight - newHeight) / 2);
}

function MM_preloadImages() { //v3.0
	var d=document; if(d.images){ if(!d.MM_p) d.MM_p=new Array();
	var i,j=d.MM_p.length,a=MM_preloadImages.arguments; for(i=0; i<a.length; i++)
	if (a[i].indexOf("#")!=0){ d.MM_p[j]=new Image; d.MM_p[j++].src=a[i];}}
}

function MM_swapImage() { //v3.0
	var i,j=0,x,a=MM_swapImage.arguments; document.MM_sr=new Array; for(i=0;i<(a.length-2);i+=3)
	if ((x=MM_findObj(a[i]))!=null){document.MM_sr[j++]=x; if(!x.oSrc) x.oSrc=x.src; x.src=a[i+2];}
}

function MM_swapImgRestore() { //v3.0
	var i,x,a=document.MM_sr; for(i=0;a&&i<a.length&&(x=a[i])&&x.oSrc;i++) x.src=x.oSrc;
}

function MM_findObj(n, d) { //v4.01
	var p,i,x;
	if (!d) d=document;
	if ((p=n.indexOf("?")) > 0 && parent.frames.length)
	{
		d=parent.frames[n.substring(p+1)].document;
		n=n.substring(0,p);
	}
	if (!(x=d[n]) && d.all) x=d.all[n];
	for (i=0; !x && i<d.forms.length; i++) x=d.forms[i][n];
	//for (i=0; !x && d.layers && i<d.layers.length; i++) x=MM_findObj(n,d.layers[i].document);
	if (!x && d.getElementById) x=d.getElementById(n);
	return x;
}

function MM_dragLayer(objName,x,hL,hT,hW,hH,toFront,dropBack,cU,cD,cL,cR,targL,targT,tol,dropJS,et,dragJS) { //v4.01
	//Copyright 1998 Macromedia, Inc. All rights reserved.
	var i,j,aLayer,retVal,curDrag=null,curLeft,curTop,IE=document.all,NS4=document.layers;
	var NS6=(!IE&&document.getElementById), NS=(NS4||NS6); if (!IE && !NS) return false;
	retVal = true; if(IE && event) event.returnValue = true;
	if (MM_dragLayer.arguments.length > 1) {
	curDrag = MM_findObj(objName); if (!curDrag) return false;
	if (!document.allLayers) { document.allLayers = new Array();
		with (document) if (NS4) { for (i=0; i<layers.length; i++) allLayers[i]=layers[i];
	for (i=0; i<allLayers.length; i++) if (allLayers[i].document && allLayers[i].document.layers)
		with (allLayers[i].document) for (j=0; j<layers.length; j++) allLayers[allLayers.length]=layers[j];
		} else {
	if (NS6) { var spns = getElementsByTagName("span"); var all = getElementsByTagName("div");
		for (i=0;i<spns.length;i++) if (spns[i].style&&spns[i].style.position) allLayers[allLayers.length]=spns[i];}
	for (i=0;i<all.length;i++) if (all[i].style&&all[i].style.position) allLayers[allLayers.length]=all[i];
	} }
	curDrag.MM_dragOk=true; curDrag.MM_targL=targL; curDrag.MM_targT=targT;
	curDrag.MM_tol=Math.pow(tol,2); curDrag.MM_hLeft=hL; curDrag.MM_hTop=hT;
	curDrag.MM_hWidth=hW; curDrag.MM_hHeight=hH; curDrag.MM_toFront=toFront;
	curDrag.MM_dropBack=dropBack; curDrag.MM_dropJS=dropJS;
	curDrag.MM_everyTime=et; curDrag.MM_dragJS=dragJS;
	curDrag.MM_oldZ = (NS4)?curDrag.zIndex:curDrag.style.zIndex;
	curLeft= (NS4)?curDrag.left:(NS6)?parseInt(curDrag.style.left):curDrag.style.pixelLeft;
	if (String(curLeft)=="NaN") curLeft=0; curDrag.MM_startL = curLeft;
	curTop = (NS4)?curDrag.top:(NS6)?parseInt(curDrag.style.top):curDrag.style.pixelTop;
	if (String(curTop)=="NaN") curTop=0; curDrag.MM_startT = curTop;
	curDrag.MM_bL=(cL<0)?null:curLeft-cL; curDrag.MM_bT=(cU<0)?null:curTop-cU;
	curDrag.MM_bR=(cR<0)?null:curLeft+cR; curDrag.MM_bB=(cD<0)?null:curTop+cD;
	curDrag.MM_LEFTRIGHT=0; curDrag.MM_UPDOWN=0; curDrag.MM_SNAPPED=false; //use in your JS!
	document.onmousedown = MM_dragLayer; document.onmouseup = MM_dragLayer;
	if (NS) document.captureEvents(Event.MOUSEDOWN|Event.MOUSEUP);
	} else {
	var theEvent = ((NS)?objName.type:event.type);
	if (theEvent == 'mousedown') {
		var mouseX = (NS)?objName.pageX : event.clientX + document.body.scrollLeft;
		var mouseY = (NS)?objName.pageY : event.clientY + document.body.scrollTop;
		var maxDragZ=null; document.MM_maxZ = 0;
		for (i=0; i<document.allLayers.length; i++) { aLayer = document.allLayers[i];
	var aLayerZ = (NS4)?aLayer.zIndex:parseInt(aLayer.style.zIndex);
	if (aLayerZ > document.MM_maxZ) document.MM_maxZ = aLayerZ;
	var isVisible = (((NS4)?aLayer.visibility:aLayer.style.visibility).indexOf('hid') == -1);
	if (aLayer.MM_dragOk != null && isVisible) with (aLayer) {
		var parentL=0; var parentT=0;
		if (NS6) { parentLayer = aLayer.parentNode;
		while (parentLayer != null && parentLayer.style.position) {
			parentL += parseInt(parentLayer.offsetLeft); parentT += parseInt(parentLayer.offsetTop);
			parentLayer = parentLayer.parentNode;
		} } else if (IE) { parentLayer = aLayer.parentElement;
		while (parentLayer != null && parentLayer.style.position) {
			parentL += parentLayer.offsetLeft; parentT += parentLayer.offsetTop;
			parentLayer = parentLayer.parentElement; } }
		var tmpX=mouseX-(((NS4)?pageX:((NS6)?parseInt(style.left):style.pixelLeft)+parentL)+MM_hLeft);
		var tmpY=mouseY-(((NS4)?pageY:((NS6)?parseInt(style.top):style.pixelTop) +parentT)+MM_hTop);
		if (String(tmpX)=="NaN") tmpX=0; if (String(tmpY)=="NaN") tmpY=0;
		var tmpW = MM_hWidth;	if (tmpW <= 0) tmpW += ((NS4)?clip.width :offsetWidth);
		var tmpH = MM_hHeight; if (tmpH <= 0) tmpH += ((NS4)?clip.height:offsetHeight);
		if ((0 <= tmpX && tmpX < tmpW && 0 <= tmpY && tmpY < tmpH) && (maxDragZ == null
			|| maxDragZ <= aLayerZ)) { curDrag = aLayer; maxDragZ = aLayerZ; } } }
		if (curDrag) {
	document.onmousemove = MM_dragLayer; if (NS4) document.captureEvents(Event.MOUSEMOVE);
	curLeft = (NS4)?curDrag.left:(NS6)?parseInt(curDrag.style.left):curDrag.style.pixelLeft;
	curTop = (NS4)?curDrag.top:(NS6)?parseInt(curDrag.style.top):curDrag.style.pixelTop;
	if (String(curLeft)=="NaN") curLeft=0; if (String(curTop)=="NaN") curTop=0;
	MM_oldX = mouseX - curLeft; MM_oldY = mouseY - curTop;
	document.MM_curDrag = curDrag;	curDrag.MM_SNAPPED=false;
	if(curDrag.MM_toFront) {
		eval('curDrag.'+((NS4)?'':'style.')+'zIndex=document.MM_maxZ+1');
		if (!curDrag.MM_dropBack) document.MM_maxZ++; }
	retVal = false; if(!NS4&&!NS6) event.returnValue = false;
	} } else if (theEvent == 'mousemove') {
		if (document.MM_curDrag) with (document.MM_curDrag) {
	var mouseX = (NS)?objName.pageX : event.clientX + document.body.scrollLeft;
	var mouseY = (NS)?objName.pageY : event.clientY + document.body.scrollTop;
	newLeft = mouseX-MM_oldX; newTop	= mouseY-MM_oldY;
	if (MM_bL!=null) newLeft = Math.max(newLeft,MM_bL);
	if (MM_bR!=null) newLeft = Math.min(newLeft,MM_bR);
	if (MM_bT!=null) newTop	= Math.max(newTop ,MM_bT);
	if (MM_bB!=null) newTop	= Math.min(newTop ,MM_bB);
	MM_LEFTRIGHT = newLeft-MM_startL; MM_UPDOWN = newTop-MM_startT;
	if (NS4) {left = newLeft; top = newTop;}
	else if (NS6){style.left = newLeft; style.top = newTop;}
	else {style.pixelLeft = newLeft; style.pixelTop = newTop;}
	if (MM_dragJS) eval(MM_dragJS);
	retVal = false; if(!NS) event.returnValue = false;
	} } else if (theEvent == 'mouseup') {
		document.onmousemove = null;
		if (NS) document.releaseEvents(Event.MOUSEMOVE);
		if (NS) document.captureEvents(Event.MOUSEDOWN); //for mac NS
		if (document.MM_curDrag) with (document.MM_curDrag) {
	if (typeof MM_targL =='number' && typeof MM_targT == 'number' &&
		(Math.pow(MM_targL-((NS4)?left:(NS6)?parseInt(style.left):style.pixelLeft),2)+
		 Math.pow(MM_targT-((NS4)?top:(NS6)?parseInt(style.top):style.pixelTop),2))<=MM_tol) {
		if (NS4) {left = MM_targL; top = MM_targT;}
		else if (NS6) {style.left = MM_targL; style.top = MM_targT;}
		else {style.pixelLeft = MM_targL; style.pixelTop = MM_targT;}
		MM_SNAPPED = true; MM_LEFTRIGHT = MM_startL-MM_targL; MM_UPDOWN = MM_startT-MM_targT; }
	if (MM_everyTime || MM_SNAPPED) eval(MM_dropJS);
	if(MM_dropBack) {if (NS4) zIndex = MM_oldZ; else style.zIndex = MM_oldZ;}
	retVal = false; if(!NS) event.returnValue = false; }
		document.MM_curDrag = null;
	}
	if (NS) document.routeEvent(objName);
	} return retVal;
}

/*
* disables a submit button. shows a warning first, if required
*/
function disable_submit(button_object, preWarning)
{
	preWarning = preWarning ? preWarning : false;
	button_object.value = 'Aguarde...';

	if (preWarning)
	{
		alert("O formulário vai ser processado. Por favor aguarde");
	}

	button_object.onmousedown = new Function('alert(\'O formulário está a ser processado. Aguarde por favor...\');return false');
	//button_object.disabled = true;
}

/*
* rounds a number to specified decimal places
*/
function RoundIt(Num, Places)
{
	if (Places > 0)
	{
		if ((Num.toString().length - Num.toString().lastIndexOf('.')) > (Places + 1))
		{
			var Rounder = Math.pow(10, Places);
			return Math.round(Num * Rounder) / Rounder;
		}
		else return Num;
	}
	else return Math.round(Num);
}

// checks if is a number, a minus or a decimal point
// ex: onkeypress="return (checkNum(event,1,1))" onkeyup="checkMinus(event)" when a minus is allowed
// or onkeypress="return (checkNum(event,0,1))"
function checkNum(e, allows_minus, allows_comma)
{
	var key_code = (document.all ? window.event.keyCode : e.which);
	var keyChar = String.fromCharCode(key_code);
	var src_element = (document.all ? window.event.srcElement : e.target);

	//for (var i in e.srcElement.attributes)
	//alert(i + ' - ' + e.srcElement.attributes[i]);

	return (key_code == 0 || key_code == 8 || key_code >= 48 && key_code <= 57 || allows_minus && (key_code == 45) && src_element.value.lastIndexOf('-') == -1 || allows_comma && (key_code == 46) && src_element.value.lastIndexOf('.') == -1)
	//if (key_code == 0 || key_code == 8 || key_code == 9 || key_code == 13 || key_code == 27 || key_code >= 35 && key_code <= 39 || key_code == 46 || key_code >= 48 && key_code <= 57 || allows_minus && (key_code == 109 || key_code == 189) && src_element.value.lastIndexOf('-') == -1 || allows_comma && (key_code == 110 || key_code == 190) && src_element.value.lastIndexOf('.') == -1)
}

// checks if a minus is already present in a textbox
function checkMinus(e)
{
	var src_element = (document.all ? window.event.srcElement : e.target);

	if(src_element.value.lastIndexOf('-') > 0)
	{
		src_element.value = '-' + src_element.value.replace(/\-/g, '');
	}
}

// copies text to clipboard. a hidden span must be defined to contain the text
// ex: <span id="holdtext" style="display:none"></span>
//		copyToClipBoard("blah blah", "holdtext");
function copyToClipBoard(text_to_copy, the_container)
{
	var the_container_obj = document.getElementById(the_container);
	the_container_obj.innerText = text_to_copy;
	var the_container_range = the_container_obj.createTextRange();
	the_container_range.execCommand("Copy");
}

/*
* Parses html query strings
* ex: http://someone.com/test.html?id=23&p=12
* Returns qsPArm["id"] = 23
*		  qsParm["p"] = 12
*/
function html_qs()
{
	var qsParm = new Array(),
		query = window.location.search.substring(1),
		parms = query.split('&'),
		pos, key, val;

	for (var i = 0; i < parms.length; i++)
	{
		pos = parms[i].indexOf('=');

		if (pos > 0)
		{
			key = parms[i].substring(0, pos);
			val = parms[i].substring(pos + 1);
		}
		else
		{
			key = parms[i];
			val = "";
		}
		qsParm[key] = val;
	}

	return qsParm;
}

/*
* resets a checkbox/radio list to default selection
*/
function restoreDefault(listObject)
{
	for(var i = 0; i < listObject.length; i++)
	{
		if (listObject.options[i].defaultSelected == true)
		{
			listObject.options[i].selected=true;
		}
	}
}

/*
* returns the position and dimension of an object in a page (left, top, width, height)
*/
function elementPosition(object_ref)
{
	var objLeft = objTop = objWidth = objHeight = 0;

	objWidth = object_ref.offsetWidth;
	objHeight = object_ref.offsetHeight;

	if (object_ref.offsetParent)
	{
		while (object_ref.offsetParent != null)
		{
			objLeft += object_ref.offsetLeft;
			objTop += object_ref.offsetTop;
			object_ref = object_ref.offsetParent;
		}
	}
	else if(object_ref.x)
	{
		objLeft = object_ref.x;
		objTop = object_ref.y;
	}
	return [objLeft, objTop, objWidth, objHeight];
}

/*
* returns mouse position
*/
function getMouseXY(e)
{
	if (document.all)
	{ // grab the x-y pos.s if browser is IE
		tempX = event.clientX + (document.documentElement.scrollLeft ?document.documentElement.scrollLeft : document.body.scrollTop);
		tempY = event.clientY + (document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollLeft);
	}
	else
	{  // grab the x-y pos.s if browser is NS
		tempX = e.pageX
		tempY = e.pageY
	}
	return [tempX, tempY];
}

/*
* hides selects below div's (for IE only)
*/
function hideElement(div_id)
{
	if (navigator.appVersion.indexOf('MSIE') < 0) return;

	var document_selects = document.getElementsByTagName("select"),
		obj, objParent, objLeft, objHeight, objWidth,
		i, n;

	// gets select tags inside the div
	var inner_selects = div_id.getElementsByTagName("select");

	loop_document_selects :
	for(i = 0; i < document_selects.length; i++)
	{
		obj = objParent = document_selects[i];

		// if there is a select inside the div, it is not hidden
		for (n = 0; n < inner_selects.length; n++)
		{
			if (obj.name && inner_selects[n].name == obj.name || obj.id && inner_selects[n].id == obj.id) continue loop_document_selects;
		}

 		objLeft = objTop = 0;
		objHeight = obj.offsetHeight;
		objWidth = obj.offsetWidth;

		while (objParent.offsetParent != null)
		{
			objLeft += objParent.offsetLeft;
			objTop += objParent.offsetTop;
			objParent = objParent.offsetParent;
		}

		if(div_id.offsetLeft + div_id.offsetWidth <= objLeft);
		else if(div_id.offsetTop + div_id.offsetHeight <= objTop);
		else if(div_id.offsetTop >= objTop + objHeight);
		else if(div_id.offsetLeft >= objLeft + objWidth);
		else
		{
			obj.style.visibility = 'hidden';
		}
	}
}

/*
* unhides selects (for IE only)
*/
function showElement(div_id)
{
	if (navigator.appVersion.indexOf('MSIE') < 0) return;

	var document_selects = document.getElementsByTagName("select"),
		obj;

	// gets select tags inside the div
	var inner_selects = div_id.getElementsByTagName("select");

	loop_document_selects :
	for(var i = 0; i < document_selects.length; i++)
	{
		obj = document_selects[i];

		// if there is a select inside the div, it is not shown
		for (n = 0; n < inner_selects.length; n++)
		{
			if (obj.name && inner_selects[n].name == obj.name || obj.id && inner_selects[n].id == obj.id) continue loop_document_selects;
		}

		obj.style.visibility = 'visible';
	}
}

/*
 * Searches haystack for needle and returns TRUE if it is found in the array, FALSE otherwise.
*/
function in_array(needle, haystack)
{
	for (var x=0; x<haystack.length; x++)
	{
		if (haystack[x].value == needle) return true;
	}
	return false;
}
