
function remove(elem) { elem.parentNode.removeChild(elem); }

function removeClass(el, classn) {
  if (!(el && el.className)) return;
var cls = el.className.split(" ");
var ar = new Array();
  for (var i = cls.length; i > 0;) {
    if (cls[--i] != classn) {
      ar[ar.length] = cls[i];
    }
  }
el.className = ar.join(" ");
}

function addClass(el, classn) {
  removeClass(el, classn);
  el.className += ' '+classn;
}

function getNextTag(elem) {
var nex = elem.nextSibling;
    while((nex || false) && nex.nodeType != 1) nex = nex.nextSibling;
return nex;
}

function getPreviousTag(elem) {
var prev = elem.previousSibling;
    while(prev.nodeType != 1) prev = prev.previousSibling;
return prev;
}

// mostra ou esconde o elemento seguinte ao que foi clicado
function showHideNext(elem, scrl) {
var nex = getNextTag(elem);
_elementScroll = nex;
nex.style.display = nex.style.display == 'none' ? '' : 'none';
  if(scrl) {
		if(nex.style.display != 'none') {
			if(/^#[a-z]{3,}/.test(scrl)) setTimeout('location.href = \''+scrl+'\';',100);
			else setTimeout('_elementScroll.scrollIntoView();',100);
		}
	}
}

function $(id,doc) { return (doc || document).getElementById(id); }

function getOrNew(id,tag,targetId) {
var ret = document.getElementById(id) || false;
	if(!ret) {
	ret = document.createElement(tag);
	ret.id = id;
	(($(targetId) || false) || document.getElementsByTagName('body')[0]).appendChild(ret);
	}
return ret;
}

function absPos(el) {
  for(var lx = 0, ly = 0; el != null; lx += el.offsetLeft, ly += el.offsetTop, el = el.offsetParent);
return { 'x': lx, 'y': ly }
}

function ASCIIEncode(s) {
var l = s.length, cooked = "";
  for (var i = 0; i < l; i++) {
    switch (s.charAt(i)) {
      case "'": cooked += "&apos;"; break;
      case '"': cooked += "&quot;"; break;
      case '<': cooked += "&lt;"; break;
      case '>': cooked += "&gt;"; break;
      case '&': cooked += "&amp;"; break;
      default:  
        if(s.charCodeAt(i) >= 192 && s.charCodeAt(i) <= 255) 
          cooked += '&#'+s.charCodeAt(i)+';';
        else cooked += s.charAt(i); 
    }
  }
return cooked.replace(/[\r\n]{1,2}/g,'<br />');
}

function ASCIIDecode(s) {
s = s.replace(/&apos;/g,"'").replace(/&quot;/g,'"');
s = s.replace(/&lt;/g,'<').replace(/&gt;/g,'>');
s = s.replace(/&amp;/g,'&').replace(/<br(\s*\/)?>/ig,'\n');
s = s.replace(/&#(\d+);/g, String.fromCharCode(RegExp.$1));
return s;
}

function getBodyHeight() {
  if(self.innerHeight)  return self.innerHeight; 
  else if(document.documentElement && document.documentElement.clientHeight) 
    return document.documentElement.clientHeight;
  else if (document.body)  return document.body.clientHeight;  
  else return 0;
}

function addFunc(func, com) {
  if(String(func).indexOf(com) != -1) return func;
var ar1 = String(func).split('{');
ar1.shift();
var ar2 = ar1.join('{').split('}');
ar2.pop();
return new Function(com+'\n'+ar2.join('}'));
}

function bodyContents(htm) {
var arr = htm.split(/<\/?body[^>]*>/i);
return arr[1] ? arr[1] : htm;
}

function addOption(selec,val,tex) {
var opt = document.createElement('option');
opt.value = val;
opt.text = tex;
  try { selec.add(opt, null); } // NS FF
  catch(e) { selec.add(opt); } // IE
}

function toVarName(str) {
var des = {'a': /[áàâã]/gi, 'e': /[éê]/gi, 'i': /í/gi, 'o': /[óôõ]/gi, 'u': /[úü]/gi, 'c': /ç/gi};
  for(var ind in des) str = str.replace(des[ind],ind);
str = str.replace(/\s+/g,'_');
str = str.replace(/[^a-zA-Z0-9_]/g,'');
return str.toLowerCase();
}

function addEvent(el, name, func) {
  if(document.all) el.attachEvent("on"+name, func);
  else el.addEventListener(name, func, true);
}

function setKeyAction(key, act, persist) { 
  if(typeof(key) != 'number' || !(/(string|function)/.test(typeof(act)))) return false;
_keypress_code = key;
_keypress_action = typeof(act) == 'function' ? act : new Function(act);
_keypress_persistent = persist ? true : false;
var el = document.all ? document.body : window;
addEvent(el, 'keypress', function(ev) { if(!_keypress_code) return;
                         ev || (ev = window.event); 
                           if(ev.keyCode == _keypress_code) { 
                           _keypress_action(); 
                             if(!_keypress_persistent) _keypress_code = false;
                           return false; 
                           } 
                         return true; 
                         });
return true;
}

// adiciona um elemento LINK ao HEAD da página
function appendLink(name, hrf, tit) {
var hd = document.getElementsByTagName('head')[0];
var lnk = document.createElement('link');
lnk.rel = 'stylesheet';
lnk.type = 'text/css';
lnk.href = hrf;
lnk.title = tit;
lnk.id = name;
hd.appendChild(lnk);
}

// reorganiza a 'pilha' definida pelos z-index declarados na página,
// trazendo o elemento (obj) recebido para o topo
function toTop(obj) {
obj = typeof(obj) == 'object' ? obj : (document.getElementById(obj) || false);
var allel = document.getElementsByTagName('*'), withz = {}, oz = obj.style.zIndex, mx = 0, cnt = 0;
  for(var i = 0; i < allel.length; i++) {
    if(allel[i].style.position == 'absolute' && allel[i].style.zIndex) {
    cnt++;
    withz[allel[i].style.zIndex] = allel[i];
      if(allel[i].style.zIndex > mx) mx = allel[i].style.zIndex;
    }
  }
  if(cnt > 1) {
    for(var i in withz) if(i > oz) withz[i].style.zIndex = i - 1;
  withz[oz].style.zIndex = mx;
  }
}

// retorna o maior z-index utilizado na página + 1
function topZ() {
var allel = document.getElementsByTagName('*'), mx = 0;
  for(var i = 0; i < allel.length; i++) if(allel[i].style.zIndex > mx) mx = allel[i].style.zIndex;
return mx + 1;
}

// marca/desmarca um elemento radio e/ou checkbox pelo valor
// val -> valor para a comparação
// typ -> especifica um tipo ('radio' ou 'checkbox'). Por padrão, aceita os dois.
// elem -> um elemento que contenha os input (o formulário ou um fieldset ou div, etc ...)
function checkByVal(val, elem, typ) { // sem uso aqui - era do userdir.php
var typs = (typ && /^(radio|checkbox)$/.test(typ)) ? typ : '(radio|checkbox)';
var checkable = (elem || document).getElementsByTagName('input');
  for(var i = 0; i < checkable.length; i++) {
    if(new RegExp('^'+typs+'$').test(checkable[i].type) && checkable[i].value == val) {
      checkable[i].checked = !(checkable[i].checked);
		}
  }
}

// procura por um dado valor nos elementos de um Array
// icompare -> se não for enviado, a comparação será 'case sensitive'
//          -> se for enviado qualquer valor não nulo (que não seja function),
//             a comparação será 'case insensitive' (ignora diferenças entre maiúsculas e min.)
//          -> se for uma function, a comparação será da seguinte forma:
//             o valor colhido do array e o valor enviado para comparação
//             serão enviados como poarâmetros à sua função. Ela deve retornar um boleano.
function inArray(arr, val, icompare) {
  for(var i = 0; i < arr.length; i++) {
    if(_typeof(icompare) == 'function') return icompare(arr[i], val);
    else if(icompare && (arr[i].toLowerCase() == val.toLowerCase())) return true;
    else if(arr[i] == val) return true;
  }
return false;
}

// adiciona os tipos 'array', 'regexp', 'date' e 'null' a typeof()
function _typeof(x) { 
	if(typeof(x) != 'object' && typeof(x) != 'function') return typeof x;
	if(typeof(x) == 'object' && !x) return 'null';

_varToTest = x;
// function tem q ser o ultimo - em alguns casos, (/regexp/ instanceof Function) é true...
var types = {'RegExp': 'regexp', 'Array': 'array', 'Date': 'date', 'Function': 'function'}, 
    ret = 'object';
	for(var i in types) if(isinst(i)) ret = types[i];
return ret;

  function isinst(objName) {
	return new Function('return (_varToTest instanceof '+objName+');')(); 
	}
}

/* var obj = { ['element name', /er to test/, 'msg to alert'], 
               ['element2 name', /er2 to test/, 'msg2 to alert'] [, ...] }
*/
function formChecker(frm, obj, dual) { // IMCOMPLETA!!!
var dualChecked = 0;
	for(var i in obj) {// alert(i+' ');
		if(frm.elements[i] || false) { //alert(i+' existe'); // o elemento existe no form
		  if(!obj[i][0].test(frm.elements[i].value)) { 
			//alert(i+' '+obj[i][0]+' nao testou ('+frm.elements[i].value+')'); // nao testou...
			alert(obj[i][1]);
			  try { frm.elements[i].focus(); }
				catch(e) {}
			return false;
			}
		}
	}
return true;
}

// mostra um objeto
function printObj(obj, notype) {
  if(typeof(obj) != 'object') return 'It is not an object';

var ret = notype ? '' : '(object): \n';
  for(var i in obj) {
  var tpo = typeof(obj[i]);
  ret += '['+i+'] '+(notype ? '' : '('+tpo+')')+': ';
  ret += returnStr(obj[i],i);
  }
  return ret;
  
    function returnStr(elem,nam) {
      switch(typeof(elem)) {
        case 'array': return elem.join(", ")+'\n'; 
        case 'object': var rt = '\n'; 
					for(var j in elem) 
						if(typeof(elem[j]) == 'object') rt += returnStr(elem[j]); 
						else rt += '['+nam+'] ['+j+']'+(notype ? '' : ' ('+typeof(elem[j])+')')+': '+elem[j]+'\n'; 
				return rt;
        default: return elem+'\n'; 
      }
    };
}


function iniMessage(elem) {
addClass(elem, 'dis');
elem.onfocus = function() { removeClass(this, 'dis'); this.title = this.defaultValue;
                if(this.value == this.defaultValue) this.value = ''; };
elem.onblur = function() {
                if(this.value == this.defaultValue || !/\w/.test(this.value)) {
								this.value = this.defaultValue; addClass(this, 'dis'); this.title = '';
								} };
}
