if(isNS4) {
	window.captureEvents(Event.BLUR | Event.FOCUS | Event.LOAD | Event.UNLOAD | Event.MOVE | Event.RESIZE | Event.DRAGDROP);
	document.captureEvents(Event.KEYPRESS | Event.KEYDOWN | Event.KEYUP | Event.CLICK | Event.DBLCLICK | Event.MOUSEDOWN | Event.MOUSEUP | Event.MOUSEMOVE | Event.MOUSEOVER | Event.MOUSEOUT);
}
if(document.addEventListener) {
	register_event('DOMContentLoaded',OnLoadInit);
} else if(isIE) {
	register_event('onload',OnLoadInit);
} else {
	setTimeout('OnLoadInit()',1000);
}
register_event('onunload',function(){window.onerror=function(){return false}});
register_event('onmouseover',StatusBar);
register_event('onmouseout',StatusBar);

// registra evento no navegador
function register_event(event_type,script_src,element) {
	event_type.toLowerCase();
	if(event_type.substr(0,2)=='on') {
		event_type=event_type.substr(2);
	}
	if(typeof(element)!='undefined') {
		if(document.addEventListener) { // NS
			element.addEventListener(event_type,script_src,false);
			return true;
		} else if(document.attachEvent) { // IE
			return element.attachEvent('on'+event_type,script_src);
		} else {
			fire_event(element,event_type,script_src);
		}
	} else if(/keypress|keydown|keyup|click|dblclick|mousedown|mouseup|mousemove|mouseover|mouseout|contexmenu|selectstart|dragstart|DOMContentLoaded/i.test(event_type)) {
		if(document.addEventListener) { // NS
			document.addEventListener(event_type,script_src,false);
			return true;
		} else if(document.attachEvent) { // IE
			return document.attachEvent('on'+event_type,script_src);
		} else {
			fire_event(document,event_type,script_src);
		}
	} else if(/blur|focus|load|unload|move|resize|scroll|dragdrop|error/i.test(event_type)) {
		if(window.addEventListener) { // NS
			window.addEventListener(event_type,script_src,false);
			return true;
		} else if(window.attachEvent) { // IE
			return window.attachEvent('on'+event_type,script_src);
		} else {
			fire_event(window,event_type,script_src);
		}
	} else {
		alert('ERROR: '+event_type+' is not supported in register_event()');
		throw('RUNTIME ERROR: event type '+event_type+' not supported');
	}
}

// dispara evento (para navegadores antigos)
function fire_event(elem,event_type,script_src) {
	if(!elem.eventList) elem.eventList=new Array();
	if(!elem.eventList[event_type]) {
		elem.eventList[event_type]=new Array();
	}
	var next_index=elem.eventList[event_type].length;
	elem.eventList[event_type][next_index]=script_src;
	elem['on'+event_type]=function() {
		for(var loop=0;loop<elem.eventList[event_type].length;loop++) {
			with(document) {
				elem.eventList[event_type][loop]();
			}
		}
	}
}

// funcao de inicializacao
function OnLoadInit() {
	document.loaded=true;
	var url_hash=window.location.hash.substr(1);
	if(/[0-9a-z_]+[:].+/i.test(url_hash)) {
		var remote_url=url_hash.split(':');
		get_remote(remote_url[0],remote_url[1]);
	}
}

// retorna o z-index seguinte
function zIndex() {
	return z_index++;
}

// determina o objeto de um elemento pelo seu id
function el(id_name) {
	if(document.getElementById) {
		return document.getElementById(id_name);
	} else if(document.all) {
		if(document.all[id_name]) {
			return document.all[id_name];
		} else return null;
	} else if(document.layers) {
		if(document.layers[id_name]) {
			return document.layers[id_name];
		} else return null;
	}
	return null;
}

// remove um elemento html da pagina
function removeElement(elem) {
	if(typeof(elem)=='string') {
  	elem=el(elem);
  	if(!elem) return;
	}
  if(typeof(elem)=='object') {
		elem.parentNode.removeChild(elem);
	}
}

// define opacidade de um elemento (0 a 100)
function setOpacity(elem,opacity) {
	if(typeof(elem)=='string') {
		elem=el(elem);
	}
	if(isNS || isFF || isOpera) {
		elem.style.opacity=(opacity/100);
	} else if(isIE) {
		elem.style.filter='alpha(opacity='+opacity+')';
	} else if(elem.style.MozOpacity) {
		elem.style.MozOpacity=(opacity/100);
	}
}

// fade in
function fadeIn(id,amount) {
	var elem=el(id);
	if(typeof(amount)=='undefined') {
		amount=0;
		setOpacity(elem,0);
		elem.style.visibility='visible';
		elem.style.display='';
	}
	amount+=10;
	if(amount<101) {
		setOpacity(elem,amount);
		setTimeout(function(){fadeIn(id,amount);},100);
	}
}

// fade out
function fadeOut(id,amount) {
	var elem=el(id);
	if(typeof(amount)=='undefined') {
		amount=100;
		setOpacity(elem,100);
		elem.style.visibility='visible';
		elem.style.display='';
	}
	amount-=10;
	if(amount>-1) {
		setOpacity(elem,amount);
		setTimeout(function(){fadeOut(id,amount);},100);
	} else {
		elem.style.visibility='hidden';
		elem.style.display='none';
		amount=100;
	}
}

// faz elemento piscar
function blinkElement(elem,color,counter,elem_color) {
	if(typeof(elem)=='string') {
		elem=el(elem);
	}
	if(typeof(color)=='undefined' || !color) {
		color='red';
	}
	if(typeof(counter)=='undefined' || !counter) {
		counter=11;
	}
	if(typeof(elem_color)=='undefined' || !elem_color) {
		elem_color=elem.style.backgroundColor;
		if(!elem_color) elem_color='white';
	}
	if(counter<2) {
		elem_color=null;
		counter=null;
		return;
	}
	if(elem.style.backgroundColor!=color) {
		elem.style.backgroundColor=color;
	} else {
		elem.style.backgroundColor=elem_color;
	}
	//alert(counter+': '+elem.style.backgroundColor);
	setTimeout(function(){blinkElement(elem,color,counter-1,elem_color)},200);
}

// obtém propriedade de um estilo de um objeto
function getStyle(elem,cssRule) {
	if(typeof(elem)=='string') {
		var elem=el(elem);
	}
	var cssValue=null;
	if(document.defaultView && document.defaultView.getComputedStyle) {
		cssValue=document.defaultView.getComputedStyle(elem,'').getPropertyValue(cssRule);
	} else if(elem.currentStyle) {
		cssRule=cssRule.replace(/\-(\w)/g,function(strMatch,p1){return p1.toUpperCase();});
		cssValue=elem.currentStyle[cssRule];
	}
	return cssValue;
}

// determina posicao absoluta de um elemento html
function findPos(elem) {
	if(typeof(elem)=='string') {
		elem=el(elem);
	}
	var xpos=0,ypos=0,spos='';
	while(elem.offsetParent) {
		spos=getStyle(elem,'position');
		if(spos!='relative' && spos!='absolute') {
			if(elem.offsetLeft) xpos+=elem.offsetLeft;
			if(elem.offsetTop) ypos+=elem.offsetTop;
		}
		if(elem.scrollLeft) xpos-=elem.scrollLeft;
		if(elem.scrollTop) ypos-=elem.scrollTop;
		elem=elem.offsetParent;
	};
	return {x:xpos,y:ypos};
}

// retorna posicao no centro da area visivel
function getPageCenter(width,height) {
	var innerSize=getInnerSize();
	var innerWidth=innerSize.width;
	var innerHeight=innerSize.height;
	var pageScroll=getPageScroll();
	var xScroll=pageScroll.x;
	var yScroll=pageScroll.y;
	var xpos=(innerWidth/2)-(width/2)+xScroll;
	var ypos=(innerHeight/2)-(height/2)+yScroll;
	if(xpos<0) xpos=0;
	if(ypos<0) ypos=0;
	return {x:xpos,y:ypos};
}

// retorna o tamanho da area interna do navegador
function getInnerSize() {
	if(window.innerHeight) {	// all except IE
		var innerWidth=window.innerWidth;
		var innerHeight=window.innerHeight;
	} else if(document.documentElement && document.documentElement.clientHeight) {
		// Explorer 6 Strict Mode
		var innerWidth=document.documentElement.clientWidth;
		var innerHeight=document.documentElement.clientHeight;
	} else if(document.body) { // other browsers
		var innerWidth=document.body.clientWidth;
		var innerHeight=document.body.clientHeight;
	}
	return {width:innerWidth,height:innerHeight};
}

// determina o tamanho da página
function getPageSize() {
	var pageWidth=document.offsetWidth;
	var pageHeight=document.offsetHeight;
	return {width:pageWidth,height:pageHeight};
}

// retorna posição das barras de rolagem
function getPageScroll() {
	if(document.pageXOffset) {
		var xScroll=document.pageXOffset;
		var yScroll=document.pageYOffset;
	} else if(document.documentElement && document.compatMode=='CSS1Compat') {
		var xScroll=document.documentElement.scrollLeft;
		var yScroll=document.documentElement.scrollTop;
	} else if(document.body) {
		var xScroll=document.body.scrollLeft;
		var yScroll=document.body.scrollTop;
	} else {
		var xScroll=0;
		var yScroll=0;
	}
	return {x:xScroll,y:yScroll};
}

// ajusta posicao das barras de rolagem da pagina
function setPageScroll(xpos,ypos) {
	if(document.pageXOffset) {
		document.pageXOffset=xpos;
		document.pageYOffset=ypos;
	} else if(document.documentElement && document.compatMode=='CSS1Compat') {
		document.documentElement.scrollLeft=xpos;
		document.documentElement.scrollTop=ypos;
	} else if(document.body) {
		document.body.scrollLeft=xpos;
		document.body.scrollTop=ypos;
	}
}

// define um cookie
function setCookie(id,value,expire) {
	if(expire) {
		var tob=new Date();
		tob.setTime(tob.getTime()+(expire*1e3));
		var exp='; expires='+tob.toGMTString();
	} else var exp='';
	document.cookie=id+'='+escape(value)+exp+'; path=/';
}

// obtem um cookie
function getCookie(id) {
	var id=id+"=";
	var cookies=document.cookie.split(';');
	for(var loop=0;loop<cookies.length;loop++) {
		var cookie=cookies[loop];
		while(cookie.charAt(0)==' ') {
			cookie=cookie.substring(1,cookie.length);
		}
		if(cookie.indexOf(id)==0) {
			return unescape(cookie.substring(id.length,cookie.length));
		}
	}
	return null;
}

// dump de variaveis e objetos
function dump(arr,level) {
  var dumped_text='';
  if(!level) level=0;
  var padding='';
  for(var loop=0;loop<level;loop++) {
    padding+='    ';
  }
  if(typeof(arr)=='object') {
    for(var item in arr) {
      var value=arr[item];
      if(typeof(value)=='object') {
        dumped_text+=padding+'"'+item+'": {\n';
        dumped_text+=dump(value,level+1)+padding+'},\n';
      } else {
        dumped_text+=padding+'"'+item+'": "'+value+'",\n';
      }
    }
  } else {
    dumped_text='"'+arr+'" ('+typeof(arr)+')';
  }
  return dumped_text;
}

// retorna o tempo decorrido
function elapse() {
	var rightnow=new Date().getTime();
	var ret=rightnow-ElapsedTime;
	ElapsedTime=rightnow;
	return ret;
}

// retorna caractere
function chr(charcode) {
	return String.fromCharCode(charcode);
}

// gera numero aleatorio
function rand(min,max) {
	if(typeof(min)=='undefined') min=0;
	if(typeof(max)=='undefined') max=100;
	return Math.round((max-min)*Math.random())+min;
}

// remove acentos
function removeAccents(str) {
	str=str.replace('á','a').replace('Á','A').replace('à','a').replace('À','A').replace('ã','a').replace('Ã','A').replace('â','a').replace('Â','A').replace('é','e').replace('É','E').replace('ê','e').replace('Ê','E').replace('í','i').replace('Í','I').replace('ó','o').replace('Ó','O').replace('ô','o').replace('Ô','O').replace('ú','u').replace('Ú','U').replace('ü','u').replace('Ü','U').replace('ç','c').replace('Ç','C').replace('ñ','n').replace('Ñ','N');
	return str;
}

function display(msg) {
	window.status=msg;
}

function StatusBar() {
	window.status=siteurl;
	return true;
}

function execute(cmd) {
	document.location=self+'?'+cmd+'&'+session_name+'='+session_id+'&session_name='+session_name;
}
function ajax_execute(target,cmd) {
	get_remote(target,self+'?'+cmd);
}

function gourl(url) {
	if(url.indexOf('?')<0) {
		document.location=url+'?'+session_name+'='+session_id+'&session_name='+session_name;
	} else {
		document.location=url+'&'+session_name+'='+session_id+'&session_name='+session_name;
	}
}

function reload() {
	document.location=self+'?'+session_name+'='+session_id+'&session_name='+session_name;
}
function ajax_reload(target) {
	get_remote(target,self);
}

function send(form,field,value) {
	field.value=value;
	form.submit();
}
function ajax_send(target,form,field,value) {
	field.value=value;
	submit_form(target,form);
}

function post(url) {
	document.post.hrefvars.value=url;
	document.post.submit();
}

function askfor(msg,cmd) {
	if(confirm(msg)) {
		document.location=self+'?'+cmd+'&'+session_name+'='+session_id+'&session_name='+session_name;
	}
}
function ajax_askfor(target,msg,cmd) {
	if(confirm(msg)) {
		get_remote(target,cmd);
	}
}

function asksend(msg,form,field,value) {
	if(confirm(msg)) {
		field.value=value;
		form.submit();
	}
}
function ajax_asksend(target,msg,form,field,value) {
	if(confirm(msg)) {
		field.value=value;
		submit_form(target,form);
	}
}

function askpop(msg,width,height,cmd) {
	if(confirm(msg)) {
		popup(width,height,cmd);
	}
}

function javachat(form) {
	var chatnick=form.nickname.value;
	if(chatnick) {
		popup(1024,750,libpath+'javachat.php?'+session_name+'='+session_id+'&session_name='+session_name+'&nickname='+chatnick,'no');
	} else {
		if(language=='portuguese') alert("Por favor forneça um nickname.");
		else if(language=='spanish') alert("Por favor provea un nickname.");
		else alert("Please provide a nickname.");
	}
}

// gera uma senha
function make_password(total,numbers,mix) {
	if(typeof(numbers)=='undefined') numbers=4;
	if(typeof(mix)=='undefined') mix=false;
	if(total-numbers<1) {
		alert('Total lenght is not enough in make_password('+total+','+numbers+')');
		throw('RUNTIME ERROR: make_password()');
	}
	var flag=true;
	var password='';
	var vogals='AEIOUaeiou';
	var consoants='BCDFGHJKLMNPRSTVWXZbcdfghjklmnprstvwxz';
	for(var loop=0;loop<(total-numbers);loop++) {
		flag=(flag==false)?true:false;
		if(flag) {
			password=password+vogals.charAt(rand(0,9));
		} else {
			password=password+consoants.charAt(rand(0,37));
		}
	}
	if(numbers && numbers<total) {
		for(var loop=0;loop<numbers;loop++) {
			if(mix) {
				inspos=rand(1,password.length-2);
				password=password.substr(0,inspos)+rand(0,9).toString()+password.substr(inspos);
			} else {
				password=password+rand(0,9).toString();
			}
		}
	}
	while(!validate(password,'password*') || /(buceta|cacete|babaca|xoxota|putedo|puta|puto|fode|pica)/i.test(password)) {
		password=make_password(total,numbers,mix);
	}
	return password;
}
