


//-----------------------------------------------------------------------------------//
//     CC: jRuf |    Prod Module: Productivity in Javascript
//-----------------------------------------------------------------------------------//


var bmr_extend_batch=new Array();

//-----------------------------------------------------------------------------------//

var DomMethods = {

	list: [],

	add: function(ename, method)
		{this.list.push([ename, method]);},

	remove: function()
		{var args=arguments;
		for(var i=0; i<arguments.length; i++)
			{this.list.each(function(array, index){
				if(array && array[0]==args[i]){DomMethods.list[index]=null;}
			});}
		this.list=this.list.compact();}

}

function extendDomBatch()
	{var objs=objDom("*","tag");
	for(var i=0; i<objs.length; i++)
		{var obj=objs[i];
		extendDom(obj, true);}}

function extendDom(id, from_dom_helper)
	{if(!from_dom_helper){var alvo=objDom(id);}
	else{var alvo=id;}
	DomMethods.list.each(function(array){
			alvo[array[0]]=array[1];
	});}

function extendDomOnload(name, method)
	{DomMethods.add(name, method);
	document[name]=method;}

function executeBatchDom()
	{extendDomBatch();}

//-----------------------------------------------------------------------------------//

function isset(param)
	{try{eval("bmr_param="+param); return true;}
	catch(e){return false;}}

//-----------------------------------------------------------------------------------//

function getContent(id)
	{var alvo=objDom(id);
	return alvo[getContentType(alvo)];}

function setContent(id, conteudo)
	{var alvo=objDom(id);
	alvo[getContentType(alvo)]=conteudo;
	return alvo;}

function addContent(id, conteudo, before)
	{var alvo=objDom(id);
	if(!before){alvo[getContentType(alvo)]+=conteudo;}
	else{alvo[getContentType(alvo)]=conteudo+alvo[getContentType(alvo)];}
	return alvo;}

function alternateContent(id, conteudo1, conteudo2)
	{var alvo=objDom(id); var cType=getContentType(alvo);
	if(alvo[cType]==conteudo1){alvo[cType]=conteudo2;}
	else{alvo[cType]=conteudo1;}
	return alvo;}

function getText(obj)
	{var alvo=objDom(obj); var text;
	if(alvo.innerText){text=alvo.innerText;}
	else if(alvo.textContent){text=alvo.textContent;}
	else if(getContentType(alvo)=="value"){text=alvo.value;}
	else{text=alvo[getContentType(alvo)].stripTags();} return text;}

function getContentType(id)
	{var alvo=objDom(id); var typeOf;
	var tag=alvo.tagName.toLowerCase();
	var values=new Array("input", "textarea");
	var srcs=new Array("img", "iframe", "frame", "script");
	//var selects= new Array("select");
	if(values.find(tag)){typeOf="value";}
	else if(srcs.find(tag)){typeOf="src";}
	//else if(selects.find(tag)){typeOf="options["+alvo.selectedIndex+"].innerHTML";}
	else if(alvo.innerHTML || alvo.innerHTML==""){typeOf="innerHTML";}
	else {typeOf=false;}
	if(alvo.innerHTML && tag=="script"){typeOf="innerHTML";}
	return typeOf;}

var Content = {
	get: getContent,
	set: setContent,
	add: addContent,
	alternate: alternateContent,
	getType: getContentType,
	getText: getText
}

//-----------------------------------------------------------------------------------//

function valuesToQueryString(form, query)
	{var obj=objDom("*", "tag", objDom(form)); this.query=(query)?query:"";
	this.encodeQuery=function(n, v){this.query+=encodeURIComponent(n)+"="+encodeURIComponent(v)+"&";}
	for(var i=0; i<obj.length; i++)
		{var node=obj[i]; var tag=node.tagName.toLowerCase();
		try{var type=node.type.toLowerCase();}catch(e){}
		if (tag=="input")
			{if(type=="text" || type=="hidden" || type=="password" || type=="file")
				{this.encodeQuery(node.name, node.value);}
			else if(type=="checkbox" || type=="radio")
				{if(node.checked){this.encodeQuery(node.name, node.value);}}}
		else if(tag=="select"){this.encodeQuery(node.name, node.options[node.selectedIndex].value);}
		else if(tag=="textarea"){this.encodeQuery(node.name, node.value);}}
	return this.query.trimAnds();}

extendDomOnload("toQueryString", function(){return valuesToQueryString(this, "");})

//-----------------------------------------------------------------------------------//

function switchStyle(title, media)
	{var links=objDom("link", "tag");
	for(var i=0; i<links.length; i++)
		{var lnk=links[i];
		if(lnk.rel.toLowerCase().find("style") && lnk.title)
			{if(!media)
				{lnk.disabled=true;
				if(lnk.title==title){lnk.disabled=false;}}
			else if(lnk.media==media)
				{lnk.disabled=true;
				if(lnk.title==title){lnk.disabled=false;}}}}}

document.switchStyle=switchStyle; document.switchStyleSheet=switchStyle;

function applyCSS(content)
	{var head=objDom("head", "tag");
	style=document.createElement("style");
	style.type="text/css";
	if(style.styleSheet){style.styleSheet.cssText=content}
	else{style.appendChild(document.createTextNode(content));}
	head.appendChild(style);}

document.applyCSS=applyCSS; document.applyStyle=applyCSS;

function getStyle(id, style)
	{var alvo=objDom(id);
	var camelStyle=(style.charAt(0)!="-")?style.toCamelCase(null, true):style.toCamelCase();
	var value=alvo.style[camelStyle];
	if(!value) //Não é inline
		{if(window.getComputedStyle)
			{var def_css=document.defaultView.getComputedStyle(alvo, null);
			value=(def_css)?def_css.getPropertyValue(style):null;}
		else if(alvo.currentStyle){value=alvo.currentStyle[camelStyle];}}
	if(value && value instanceof String)
		{if(value.find("rgb") || value.find("#"))
			{value=value.toColorCode();}}
	return value;}

extendDomOnload("getStyle", function(s){return getStyle(this, s);})

function setStyle(id, style, value)
	{var alvo=objDom(id);
	var camelStyle=(style.charAt(0)!="-")?style.toCamelCase(null, true):style.toCamelCase();
	try{alvo.style[camelStyle]=value;}catch(e){}
	return alvo;}

extendDomOnload("setStyle", function(s, v){return setStyle(this, s, v);})

function css(id, style, value)
	{var alvo=objDom(id);
	if(value){return setStyle(alvo, style, value);}
	else{var type=typeof(style);
		if(type.toLowerCase()=="string"){return getStyle(id, style);}
		else if(type.toLowerCase()=="object")
			{for(property in style)
				{setStyle(alvo, property, style[property]);}}}
	return alvo;}

extendDomOnload("css", function(s,v){return css(this,s,v);})

function toHexColor(num)
	{var hex=num.toString(16);
	if(num<16){hex="0"+hex;}
	return hex;}

Number.prototype.toHexColor=function(){return toHexColor(this);};

function toColorCode(str)
	{var color_code="#";
	if(str.substr(0,3)=="rgb")
		{var rgb=str.substr(4,str.length-5).split(",");
		for(var i=0; i<rgb.length; i++)
			{color_code+=parseInt(rgb[i]).toHexColor()}}
	else if(str.find("#") && str.length==4)
		{str=str.substr(1);
		for(var i=0; i<3; i++)
			{color_code+=str.charAt(i)+str.charAt(i);}}
	else if(!str.find("#") && str.length==3)
		{for(var i=0; i<3; i++)
			{color_code+=str.charAt(i)+str.charAt(i);}}
	else if(str.length==7){color_code=str;}
	color_code=(color_code!="#"?color_code.toUpperCase():false);
	return color_code;}

String.prototype.toColorCode=function(){return toColorCode(this);};

function stripMeasure(str)
    {var vals=new Array("em", "ex", "px", "%", "pt", "pc", "mm", "cm", "in");
	for(var i=0; i<vals.length; i++)
		{str=str.replace(vals[i], "");}
	return str;}

String.prototype.stripMeasure=function(){return stripMeasure(this);};

function getMeasure(str)
    {var vals=new Array("em", "ex", "px", "%", "pt", "pc", "mm", "cm", "in");
	for(var i=0; i<vals.length; i++)
		{if(str.find(vals[i])){var measure=vals[i];}}
	return measure;}

String.prototype.getMeasure=function(){return getMeasure(this);};

function preloadImages()
	{document.preloadedImages=new Array(); var results=false;
	var args=arguments;
	for(var i=0; i<args.length; i++)
		{document.preloadedImages[i]=new Image();
		document.preloadedImages[i].src=args[i];
		results=true;}
	return results;}

//-----------------------------------------------------------------------------------//

function insertAfter(new_obj, exi_obj)
	{exi_obj=objDom(exi_obj);
	exi_obj.parentNode.insertBefore(new_obj, exi_obj.nextSibling);}

function insertBefore(new_obj, exi_obj)
	{exi_obj=objDom(exi_obj);
	exi_obj.parentNode.insertBefore(new_obj, exi_obj);}

function createObj(opts)
	{var opts=json(opts); opts.style=json(opts.style);
	if(opts.after || opts.before || opts.append)
		{if(opts.after){opts.after=objDom(opts.after);}
		else if(opts.before){opts.before=objDom(opts.before);}
		else if(opts.append){opts.append=objDom(opts.append);}}
	else{var theBody=objDom("body", "tag")[0];}
	var obj=document.createElement(opts.tag);
		if(opts.id){obj.id=opts.id;}
		if(opts.className){obj.className=opts.className;}
		if(opts.content){setContent(obj, opts.content);}
	if(theBody){theBody.appendChild(obj);}
	else{if(opts.after){insertAfter(obj, opts.after);}
		else if(opts.before){insertBefore(obj, opts.before);}
		else if(opts.append){opts.append.appendChild(obj);}}
	css(obj, opts.style);
	//Atribui os eventos aos objetos Dom inclusive o recém criado
	executeBatchDom();
	return obj;}

//-----------------------------------------------------------------------------------//

function getElementsByAttributeValue(attr, value, container, tag)
	{if(!container){var container=document;}
	var tag=(tag)?tag.toLowerCase():"*"; var elems=new Array();
	var objs=container.getElementsByTagName(tag);
	for(var i=0; i<objs.length; i++)
		{var obj=objs[i]; var attrv=null;
		if(obj[attr]){attrv=obj[attr];}
		else if(obj.getAttribute(attr)){attrv=obj.getAttribute(attr);}
		if(attrv && attrv==value){elems.push(obj);}}
	if(elems.length==0){elems=null;}
	return elems;}

document.getElementsByAttributeValue=function(a, v, t){return getElementsByAttributeValue(a, v, document, t);};
extendDomOnload("getElementsByAttributeValue", function(a, v, t){return getElementsByAttributeValue(a, v, this, t);})

function getElementsByClassName(className, container, tag)
	{var elems=getElementsByAttributeValue("class", className, container, tag);
	var objs=getElementsByAttributeValue("className", className, container, tag);
	return (elems)?elems:objs;}

document.getElementsByClassName=function(c, t){return getElementsByClassName(c, document, t);};
extendDomOnload("getElementsByClassName", function(c, t){return getElementsByClassName(c, this, t);})

function objDom(obj, type, container, get_first)
	{var elem=null; var obj_type=typeof(obj); obj_type=obj_type.toLowerCase();
	var container=(container)?objDom(container):document;
	var type=(type)?type.toLowerCase():"id";
	if(obj_type=="object" && isDom(obj)){elem=obj;}
	else if(obj_type=="string")
		{if(type=="id")
			{if(document.all){elem=document.all[obj];}
			else{elem=document.getElementById(obj);}}
		else if(type=="tag"){elem=container.getElementsByTagName(obj);}
		else if(type=="class"){elem=getElementsByClassName(obj, container);}
		else{elem=getElementsByAttributeValue(type, obj, container);}}
	//Extending the methods of the object
	if(elem && elem[0])
		{if(elem.length==1)
			{extendDom(elem[0], true);}
		else{for(var i=0; i<elem.length; i++)
				{extendDom(elem[i], true);}}
		if(get_first){elem=elem[0];}}
	else if(elem && isDom(elem)){extendDom(elem, true);}
	return elem;}

extendDomOnload("dom", function(o, t, g){return objDom(o, t, this, g);})

function $()
	{var objs=new Array; var args=arguments;
	if(args.length>1)
		{for(var i=0; i<args.length; i++)
			{objs.push(objDom(args[i]));}}
	else{return objDom(args[0]);}
	return objs;}

function $tag()
	{var objs=new Array; var args=arguments;
	if(args.length>1)
		{for(var i=0; i<args.length; i++)
			{objs.push(objDom(args[i], "tag"));}}
	else{return objDom(args[0], "tag");}
	return objs;}

function $class()
	{var objs=new Array; var args=arguments;
	if(args.length>1)
		{for(var i=0; i<args.length; i++)
			{objs.push(objDom(args[i], "class"));}}
	else{return objDom(args[0], "class");}
	return objs;}

function isDom(obj)
	{var results=false;	if(obj.tagName){results=true}
	return results;}

function remove(id)
	{var alvo=objDom(id);
	alvo.parentNode.removeChild(alvo);}

//-----------------------------------------------------------------------------------//

//Retirado de Cau Guanabara: http://cauguanabara.blogsome.com/2006/11/26/editinplace-editando-qualquer-elemento-html
function getPosition(id)
	{var alvo=objDom(id); var parent=alvo;
	for(var ol=alvo.offsetLeft, ot=alvo.offsetTop; parent=parent.offsetParent; )
		{ol+=parent.offsetLeft; ot+=parent.offsetTop;}
	return {x:parseInt(ol),y:parseInt(ot)};}

//-----------------------------------------------------------------------------------//

function addEvent(obj, type, fn)
	{if(obj.addEventListener)
		{obj.addEventListener(type, fn, false);
		//Last flag: Bubbling => false, Capturing => true
		results=true;}
	else if(obj.attachEvent)
		{results=obj.attachEvent("on"+type, fn);}
	else{if(obj["on"+type])
			{var old_ev=(obj["on"+type])?obj["on"+type]:function(){};
			obj["on"+type]=function(e){old_ev(e); fn(e);}
			results=true}}
	return results;}

function Event(e)
	{if(!e && window.event){var e=window.event;}
	if(e)
		{var source=(e.target)?e.target:e.srcElement;
		this.source=(source.nodeType==3)?source.parentNode:source;
		this.event=e; this.type=e.type;
		this.button=(e.button)?e.button:(e.which)?e.which-1:null;
		var x=0; var y=0; var doc=document;
		var abody=objDom("body", "tag");
		if(e.pageX && e.pageY)
			{x=e.pageX; y=e.pageY;}
		else if(e.clientX && e.clientY)
			{x=e.clientX; y=e.clientY;
			if(Browser.ie)
				{x+=(doc.documentElement)?doc.documentElement.scrollLeft:abody.scrollLeft;
				y+=(doc.documentElement)?doc.documentElement.scrollTop:abody.scrollTop;}}
		this.x=x; this.y=y;
		this.key={};
		this.key.code=(e.keyCode)?e.keyCode:(e.which)?e.which:(e.charCode)?e.charCode:null;
		this.key.character=(this.key.code && String.fromCharCode(this.key.code) && String.fromCharCode(this.key.code)!="")?String.fromCharCode(this.key.code):null;
		if(e.modifiers)
			{this.key.alt=Event.ALT_MASK;
			this.key.ctrl=Event.CONTROL_MASK;
			this.key.shift=Event.SHIFT_MASK;}
		else{this.key.alt=e.altKey;
			this.key.ctrl=e.ctrlKey;
			this.key.shift=e.shiftKey;}}}

Event.prototype.preventDefault=function()
	{if(this.event.preventDefault){this.event.preventDefault();}
	else{this.event.returnValue=false;}}

function link2event(findWhat, fnc, id, attr)
	{var container=(id)?objDom(id):objDom("body", "tag");
	var links=objDom("a", "tag", container);
	var attr=(attr)?attr:"href"; var results=false;
	for(var i=0;i<links.length; i++)
		{attr_value=links[i].getAttribute(attr);
		if(attr_value && attr_value.find(findWhat))
			{results=addEvent(links[i], "click", fnc);}}
	return results;}

//-----------------------------------------------------------------------------------//

function json(json)
	{if(!json){json={};}
	else if(typeof(json)=="string"){json=eval("("+json+")");}
	return json;}

//-----------------------------------------------------------------------------------//

function upto(init, end, iterator)
	{while(init<end){iterator(init); init++;}}

Number.prototype.upto=function(n,i){return upto(this,n,i);};

function stripTags(str)
	{return str.replace(/<\/?[^>]+>/gi, "");}

String.prototype.stripTags=function(){return stripTags(this);};

function trimAnds(query)
	{var last=query.charAt(query.length-1);
	if(last=="&"){query=query.substring(0, query.length-1);}
	if(query[0]=="&"){query=query.substring(1, query.length);}
	return query;}

String.prototype.trimAnds=function(){return trimAnds(this);};

function html2entities(str)
	{var keys=new Array("&", " ", "¡", "¢", "£", "¤", "¥", "¦", "§", "¨", "©", "ª", "«", "¬", "­", "®", "¯", "°", "±", "²", "³", "´", "µ", "¶", "·", "¸", "¹", "º", "»", "¼", "½", "¾", "¿", "À", "Á", "Â", "Ã", "Ä", "Å", "Æ", "Ç", "È", "É", "Ê", "Ë", "Ì", "Í", "Î", "Ï", "Ð", "Ñ", "Ò", "Ó", "Ô", "Õ", "Ö", "×", "Ø", "Ù", "Ú", "Û", "Ü", "Ý", "Þ", "ß", "à", "á", "â", "ã", "ä", "å", "æ", "ç", "è", "é", "ê", "ë", "ì", "í", "î", "ï", "ð", "ñ", "ò", "ó", "ô", "õ", "ö", "÷", "ø", "ù", "ú", "û", "ü", "ý", "þ", "ÿ", "\"", "<", ">", "");
	var values=new Array("&amp;", "&nbsp;", "&iexcl;", "&cent;", "&pound;", "&curren;", "&yen;", "&brvbar;", "&sect;", "&uml;", "&copy;", "&ordf;", "&laquo;", "&not;", "&shy;", "&reg;", "&macr;", "&deg;", "&plusmn;", "&sup2;", "&sup3;", "&acute;", "&micro;", "&para;", "&middot;", "&cedil;", "&sup1;", "&ordm;", "&raquo;", "&frac14;", "&frac12;", "&frac34;", "&iquest;", "&Agrave;", "&Aacute;", "&Acirc;", "&Atilde;", "&Auml;", "&Aring;", "&AElig;", "&Ccedil;", "&Egrave;", "&Eacute;", "&Ecirc;", "&Euml;", "&Igrave;", "&Iacute;", "&Icirc;", "&Iuml;", "&ETH;", "&Ntilde;", "&Ograve;", "&Oacute;", "&Ocirc;", "&Otilde;", "&Ouml;", "&times;", "&Oslash;", "&Ugrave;", "&Uacute;", "&Ucirc;", "&Uuml;", "&Yacute;", "&THORN;", "&szlig;", "&agrave;", "&aacute;", "&acirc;", "&atilde;", "&auml;", "&aring;", "&aelig;", "&ccedil;", "&egrave;", "&eacute;", "&ecirc;", "&euml;", "&igrave;", "&iacute;", "&icirc;", "&iuml;", "&eth;", "&ntilde;", "&ograve;", "&oacute;", "&ocirc;", "&otilde;", "&ouml;", "&divide;", "&oslash;", "&ugrave;", "&uacute;", "&ucirc;", "&uuml;", "&yacute;", "&thorn;", "&yuml;", "&quot;", "&lt;", "&gt;", "");
	for(var i=0; i<keys.length; i++)
		{if(values[i]!="&nbsp;"){str=str.replace(keys[i], values[i]);}}
	return str;}

String.prototype.html2entities=function(){return html2entities(this);};
String.prototype.replaceEntities=function(){return html2entities(this);};

function toCamelCase(string, separator, first_lower)
	{var sep=false; var camelString="";
	var separators=new Array('-', ' ', '_');
	var orig_str=string.toString();
	string=string.toLowerCase();
	if(separator==null)
		{for(var i=0; i<separators.length; i++)
    		{if(string.find(separators[i])){sep=separators[i];}}}
	else{sep=separator;}
	if(!sep){camelString=orig_str;}
	else{string=string.split(sep);
		for(var i=0; i<string.length; i++)
			{var str=string[i];
			camelString+=str.charAt(0).toUpperCase()+str.substring(1);}}
	if(first_lower){camelString=camelString.charAt(0).toLowerCase()+camelString.substring(1);}
	return camelString;}

String.prototype.toCamelCase=function(s,f){return toCamelCase(this,s,f);};

function searchStr(busca, str)
	{if(str.replace(busca,"[%20]%e%r%r%o%r[%20]")==str){return false;}
	else{return true;}}

String.prototype.searchStr=function(s){return searchStr(s, this);};
String.prototype.find=function(s){return searchStr(s, this);};

function substrCount(str, search)
	{matches=0; match=true;
	while(match)
		{if(!str.find(search))
			{match=false;}
    	else{matches++;}
		str=str.replace(search,"error");}
	return matches;}

String.prototype.substrCount=function(s){return substrCount(this,s);};

String.prototype.last=function(){return this.charAt(this.length-1);};

//-----------------------------------------------------------------------------------//

function searchItem(array, witchItem)
	{var results=false;
	for(var i=0; i<array.length; i++)
		{var each=array[i];
		if (each==witchItem)
			{results=true;}}
	return results;}

Array.prototype.find=function(i){return searchItem(this, i);};

function lastArray(array)
	{return array[array.length-1];}

Array.prototype.last=function(){return lastArray(this);};

function firstArray(array)
	{return array[0];}

Array.prototype.first=function(){return firstArray(this);};

function indexOfArray(array, witchItem)
	{var results;
	if(array.find(witchItem))
		{for(var i=0; i<array.length; i++)
			{if(array[i]==witchItem)
				{indexNo=i;}}
		results=indexNo;}
	else{results=-1;} return results;}

Array.prototype.indexOf=function(i){return indexOfArray(this,i);};

function forEach(array, iterator)
	{if(!iterator){return [];}
	for(var i=0; i<array.length; i++)
		{var res=iterator(array[i], i);}
	return res;}

Array.prototype.each=function(i){return forEach(this,i);};

Array.prototype.add=function()
	{var array=this;
	var arrays=$A(arguments);
	for(var i=0; i<arrays.length; i++)
		{var arrayn=arrays[i];
		arrayn.each(function(elem, index){
			array.push(elem);
		});}
	return array;}

Array.prototype.flatten=function()
	{var results=new Array();
	for(var i=0; i<this.length; i++)
		{var elem=this[i];
		if(elem instanceof Array){results=results.add(elem.flatten())}
		else{results.push(elem);}}
	return results;}

function arrayCompact(array)
	{var new_array=new Array();
	for(var i=0; i<array.length; i++)
		{var elem=array[i];
		if(elem || elem===false){new_array.push(elem);}}
	return new_array;}

Array.prototype.compact=function(){return arrayCompact(this);};

function arrayFrom(list)
	{var results=[];
	if(list)
		{if(list.toArray){results=list.toArray();}
		else{for(var i=0; i<list.length; i++)
				{results.push(list[i]);}}}
	return results;}

function $a(l){return arrayFrom(l);}
function $A(l){return $a(l);}

Array.prototype.from=function(l){return arrayFrom(l);};

//-----------------------------------------------------------------------------------//

function tryThese()
	{var results=false; var args=arguments;
	for(var i=0; i<args.length; i++)
		{var fnc=args[i];
		try{results=fnc(); break;}
		catch(e){}}
	return results;}

var Try = {
	these: tryThese,
	each: tryThese
}



//-----------------------------------------------------------------------------------//

var bmr_nav=navigator.userAgent.toLowerCase();

var Browser = {
	name: navigator.appName,
	ie: bmr_nav.find("msie") && !bmr_nav.find("opera"),
	moz: bmr_nav.find("mozilla"),
	mozilla: bmr_nav.find("mozilla") && !bmr_nav.find(/(compatible|webkit)/),
	opera: bmr_nav.find("opera"),
	safari: bmr_nav.find("safari")
}

//-----------------------------------------------------------------------------------//

addEvent(window, "load", extendDomBatch);

//-----------------------------------------------------------------------------------//
//     CC: jRuf |    Dynamic Module: Dynamism (Ajax, Drag and Drop)
//-----------------------------------------------------------------------------------//


var ajax_loading_text="<p class=\"ajax-carregando\"><img src=\"http://i85.photobucket.com/albums/k43/bermonruf/net/carregando.gif\" width=\"16\" height=\"16\" /> Carregando... Aguarde</p>";

//-----------------------------------------------------------------------------------//

function requestAjax(url, opts)
	{var results=false;
	opts=executeOptions(opts, "get");
	var com=setUrlParams(url, opts, false);
	opts.params=com.params; url=com.url;
	var xmlhttp=getTransfer();
	if(xmlhttp)
		{xmlhttp.onreadystatechange=function(){treatRequest(xmlhttp, opts);}
		xmlhttp.open(opts.method, url, true);
		setRequestHeaders(xmlhttp, opts);
		xmlhttp.send(opts.params);
		results=true;}
	return results;}

function getAjax(url, opts)
	{var results=false;
	opts=executeOptions(opts, "get");
	var com=setUrlParams(url, opts, false);
	opts.params=com.params; url=com.url;
	var xmlhttp=getTransfer();
	if(xmlhttp)
		{xmlhttp.onreadystatechange=function(){treatRequest(xmlhttp, opts);}
		xmlhttp.open("get", url, true);
		setRequestHeaders(xmlhttp, opts);
		xmlhttp.send(null);
		results=true;}
	return results;}

function postAjax(url, opts)
	{var results=false;
	opts=executeOptions(opts, "post");
	var com=setUrlParams(url, opts, false);
	opts.params=com.params; url=com.url;
	var xmlhttp=getTransfer();
	if(xmlhttp)
		{xmlhttp.open("post", url, true);
		setRequestHeaders(xmlhttp, opts);
		xmlhttp.send(opts.params);
		xmlhttp.onreadystatechange=function(){treatRequest(xmlhttp, opts);}
		results=true;}
	return results;}

function getTransfer()
	{var xmlhttp=null; //Ou coloque false
	if(typeof(XMLHttpRequest)!="undefined"){xmlhttp=new XMLHttpRequest();}
    var opts=new Array('Microsoft.XMLHTTP','Msxml2.XMLHTTP','Msxml2.XMLHTTP.6.0','Msxml2.XMLHTTP.4.0','Msxml2.XMLHTTP.3.0');
    for(var i=0;i<opts.length;i++)
		{try{xmlhttp=new ActiveXObject(opts[i]);}
		catch(e){}}
    return xmlhttp;}

Browser.ajax=(!getTransfer)?false:true;

//-----------------------------------------------------------------------------------//

function domLoadAjax(url, id, opts)
	{opts=executeOptions(opts, "get"); var alvo=objDom(id);
	var old_fnc=opts.onsucess;
	this.showAt=function(xmlhttp){setContent(alvo, xmlhttp.responseText); executeBatchDom(); old_fnc(xmlhttp);}
	opts.onsucess=this.showAt; return requestAjax(url, opts);}

extendDomOnload("load", function(u, o){domLoadAjax(u, this, o);})

//-----------------------------------------------------------------------------------//

function executeOptions(provided, prmethod)
	{var opts={}; var provided=json(provided);
	opts.onreadystate=(provided.onreadystate)?provided.onreadystate:function(){};
	opts.onloading=(provided.onloading)?provided.onloading:function(){};
	opts.onloaded=(provided.onloaded)?provided.onloaded:function(){};
	opts.oninteractive=(provided.oninteractive)?provided.oninteractive:function(){};
	opts.oncompleted=(provided.oncompleted)?provided.oncompleted:(provided.oncomplete)?provided.oncomplete:function(){};
	opts.onsucess=(provided.onsucess)?provided.onsucess:function(){};
	opts.onfailure=(provided.onfailure)?provided.onfailure:treatError;
	opts.params=(provided.params)?provided.params:null;
	opts.method=(provided.method)?provided.method.toLowerCase():prmethod.toLowerCase();
	opts.form=(provided.form)?provided.form:false;
	return opts;}

function setRequestHeaders(xmlhttp, opts)
	{var requestHeaders=new Array(
		"Pragma", "no-cache",
		"Cache-Control", "no-cache",
		"X-Requested-With", "XMLHttpRequest");
	if(opts.method=="post")
		{requestHeaders.push("Content-type", "application/x-www-form-urlencoded");
		requestHeaders.push("Content-length", opts.params.length);}
	for(var i=0; i<requestHeaders.length; i+=2)
		{xmlhttp.setRequestHeader(requestHeaders[i], requestHeaders[i+1]);}}

function setUrlParams(url, opts, anticache)
	{opts.params=(opts.params)?opts.params.trimAnds()+"&":""; url=url.trimAnds();
	if(opts.form){opts.params+=objDom(opts.form).toQueryString();}
	if(opts.method=="get")
		{if(opts.params!="")
			{if(url.last()!="?"){url+=((url.find("?"))?"&":"?")+opts.params;}
			else{url+=opts.params;}}
		opts.params=null;}
	if(anticache)
		{var complx="complx"+encodeURI(Math.random().toString().replace(".","")+"="+(new Date()).getTime());
		if(url.last()!="?"){url+=((url.find("?"))?"&":"?")+complx;}
		else{url+=complx;}}
	return {url:url, params:opts.params}}


//-----------------------------------------------------------------------------------//

function treatError(xmlhttp)
	{var erro=xmlhttp.status;
	switch(erro)
		{case 0: erro="Erro indefinido de Javascript"; break;
         case 400: erro="Erro 400: Solicitação incompreensível"; break;
         case 403: case 404: erro="404: A página solicitada não foi encontrada"; break;
         case 405: erro="Erro 405: O servidor não suporta a requisição solicitada"; break;
         case 500: erro="Erro 500: Erro desconhecido do servidor"; break;
         case 503: erro="Erro 503: Servidor sobrecarregado"; break;
         default: erro="Erro "+erro; break;}
	alert(erro);}

function treatRequest(xmlhttp, opts)
	{opts.onreadystate(xmlhttp);
	if(xmlhttp.readyState==1)
		{opts.onloading(xmlhttp);}
	else if(xmlhttp.readyState==2)
		{opts.onloaded(xmlhttp);}
	else if(xmlhttp.readyState==3)
		{opts.oninteractive(xmlhttp);}
	else if(xmlhttp.readyState==4)
		{if(xmlhttp.status==200){opts.onsucess(xmlhttp);}
		else{opts.onfailure(xmlhttp);}
		opts.oncompleted(xmlhttp);}}

//-----------------------------------------------------------------------------------//

var Ajax = {
	get: getAjax,
	post: postAjax,
	request: requestAjax
}


