
/*
    FFW Javascript Core
*/

try{if(FFW)alert('FFWjs: Loaded again?');}catch(e){};
var FFW={    
    g:function(i){return document.getElementById(i);},
    gv:function(i){return document.getElementById(i).value;},
    sv:function(i,v){return document.getElementById(i).value=v;},
    a:function(i){return document.getElementsByTagName(i);},
    ss:function(i,v,n){return eval('document.getElementById(\''+i+'\').style.'+v+'=\''+n+'\';');},
    misc:{},
    effect:{},
    event:{},
    browser:{},
    number:{},
    form:{},
    ajax:{},
    string:{},
	dbm:false
};
FFW.ssfaiw=function(style,stylename,whereitem,wherevalue,tag,findcontext){
    var fc = findcontext?document.getElementById(findcontext):document;
    var fe = fc.getElementsByTagName(tag);
    for(var i=0;i<fe.length;i++){
        if(eval('fe['+i+'].'+whereitem+'==\''+wherevalue+'\'')){
            eval('fe['+i+'].style.'+style+'=\''+stylename+'\'');
        }
    }
}
FFW.ssfai=function(style,stylename,tag,findcontext){
    var fc = findcontext?document.getElementById(findcontext):document;
    var fe = fc.getElementsByTagName(tag);
    for(var i=0;i<fe.length;i++){
        eval('fe['+i+'].style.'+style+'=\''+stylename+'\'');
    }
}
FFW.ssfawonly=function(style,stylename,stylenotname,whereitem,wherevalue,tag,findcontext){
    FFW.ssfai(style,stylenotname,tag,findcontext);
    FFW.ssfaiw(style,stylename,whereitem,wherevalue,tag,findcontext);
}

// BROWSER
FFW.browser.scroll=function(){
	if(self.pageYOffset)
        return {x:self.pageXOffset,y:self.pageYOffset};
	if(document.documentElement && document.documentElement.scrollTop)
        return {x:document.documentElement.scrollLeft,y:document.documentElement.scrollTop};
	if (document.body)
        return {x:document.body.scrollLeft,y:document.body.scrollTop};	
}/*
function getPageSize(){
	
	var xScroll, yScroll;
	
	if (window.innerHeight && window.scrollMaxY) {	
		xScroll = window.innerWidth + window.scrollMaxX;
		yScroll = window.innerHeight + window.scrollMaxY;
	} else if (document.body.scrollHeight > document.body.offsetHeight){ // all but Explorer Mac
		xScroll = document.body.scrollWidth;
		yScroll = document.body.scrollHeight;
	} else { // Explorer Mac...would also work in Explorer 6 Strict, Mozilla and Safari
		xScroll = document.body.offsetWidth;
		yScroll = document.body.offsetHeight;
	}
	
	var windowWidth, windowHeight;
	
//	console.log(self.innerWidth);
//	console.log(document.documentElement.clientWidth);

	if (self.innerHeight) {	// all except Explorer
		if(document.documentElement.clientWidth){
			windowWidth = document.documentElement.clientWidth; 
		} else {
			windowWidth = self.innerWidth;
		}
		windowHeight = self.innerHeight;
	} else if (document.documentElement && document.documentElement.clientHeight) { // Explorer 6 Strict Mode
		windowWidth = document.documentElement.clientWidth;
		windowHeight = document.documentElement.clientHeight;
	} else if (document.body) { // other Explorers
		windowWidth = document.body.clientWidth;
		windowHeight = document.body.clientHeight;
	}	
	
	// for small pages with total height less then height of the viewport
	if(yScroll < windowHeight){
		pageHeight = windowHeight;
	} else { 
		pageHeight = yScroll;
	}

//	console.log("xScroll " + xScroll)
//	console.log("windowWidth " + windowWidth)

	// for small pages with total width less then width of the viewport
	if(xScroll < windowWidth){	
		pageWidth = xScroll;		
	} else {
		pageWidth = windowWidth;
	}
//	console.log("pageWidth " + pageWidth)

	arrayPageSize = new Array(pageWidth,pageHeight,windowWidth,windowHeight) 
	return arrayPageSize;
}*/
FFW.browser.type = {
	detect: function () {
		this.browser = this.searchString(this.dataBrowser) || "An unknown browser";
		this.version = this.searchVersion(navigator.userAgent)
			|| this.searchVersion(navigator.appVersion)
			|| "an unknown version";
		this.OS = this.searchString(this.dataOS) || "an unknown OS";
	},
	searchString: function (data) {
		for (var i=0;i<data.length;i++)	{
			var dataString = data[i].string;
			var dataProp = data[i].prop;
			this.versionSearchString = data[i].versionSearch || data[i].identity;
			if (dataString) {
				if (dataString.indexOf(data[i].subString) != -1)
					return data[i].identity;
			}
			else if (dataProp)
				return data[i].identity;
		}
	},
	searchVersion: function (dataString) {
		var index = dataString.indexOf(this.versionSearchString);
		if (index == -1) return;
		return parseFloat(dataString.substring(index+this.versionSearchString.length+1));
	},
	dataBrowser:[
		{ string: navigator.userAgent, subString: "Chrome", identity: "Chrome" },
		{ string: navigator.userAgent, subString: "OmniWeb", versionSearch: "OmniWeb/", identity: "OmniWeb" },
		{ string: navigator.vendor, subString: "Apple", identity: "Safari" },
		{ prop: window.opera, identity: "Opera" },
		{ string: navigator.vendor, subString: "iCab", identity: "iCab" },
		{ string: navigator.vendor, subString: "KDE", identity: "Konqueror" },
		{ string: navigator.userAgent, subString: "Firefox", identity: "Firefox" },
		{ string: navigator.vendor, subString: "Camino", identity: "Camino" },
		{ string: navigator.userAgent, subString: "Netscape", identity: "Netscape" },
		{ string: navigator.userAgent, subString: "MSIE", identity: "Explorer", versionSearch: "MSIE" },
		{ string: navigator.userAgent, subString: "Gecko", identity: "Mozilla", versionSearch: "rv" },
		{ string: navigator.userAgent, subString: "Mozilla", identity: "Netscape", versionSearch: "Mozilla" }],
	dataOS:[
		{ string: navigator.platform, subString: "Win", identity: "Windows" },
		{ string: navigator.platform, subString: "Mac", identity: "Mac" },
		{ string: navigator.platform, subString: "Linux", identity: "Linux" }]

};

FFW.browser.width=function(){    
    if(window.innerWidth)return window.innerWidth; 
    if(FFW.capability.browser.ie)return document.documentElement.clientWidth;
    return false;
}
FFW.browser.height=function(){    
    if(window.innerHeight)return window.innerHeight; 
    if(FFW.capability.browser.ie)return document.documentElement.clientHeight;
    return false;
}
FFW.browser.setCookie=function(cookieName, cookieValue, expires, path, domain, secure) {
    document.cookie = escape(cookieName) + '=' + escape(cookieValue) + (expires ? '; expires=' + expires.toGMTString() : '') + (path ? '; path=' + path : '')        + (domain ? '; domain=' + domain : '') + (secure ? '; secure' : '');
}

    // Gets a value from a cookie
FFW.browser.getCookie=function(cookieName) {
    var cookieValue = '';
    var posName = document.cookie.indexOf(escape(cookieName) + '=');
    if (posName != -1){
        var posValue = posName + (escape(cookieName) + '=').length;
        var endPos = document.cookie.indexOf(';', posValue);
        if (endPos != -1)
            cookieValue = unescape(document.cookie.substring(posValue, endPos));
        else
            cookieValue = unescape(document.cookie.substring(posValue));
    }
    return cookieValue;
}
FFW.event.clickPosition=function(event){ 
    if(event)return{x:event.clientX,y:event.clientY}; 
    return{x:window.event.clientX,y:window.event.clientY}; 
}
// MISC
FFW.misc.type={
    Null:function(a){return a===null;},
    Undefined:function(a){return a===undefined;},
    Function:function(a){return(typeof(a)==='function')?a.constructor.toString().match(/Function/)!==null:false;},
    String:function(a){return(typeof(a)==='string')?true:(typeof(a)==='object')?a.constructor.toString().match(/string/i)!==null:false;},
    Array:function(a){return(typeof(a)==='object')?a.constructor.toString().match(/array/i)!==null||a.length!==undefined:false;},
    Boolean:function(a){return(typeof(a)==='boolean')?true:(typeof(a)==='object')?a.constructor.toString().match(/boolean/i)!==null:false;},
    Date:function(a){return(typeof(a)==='date')?true:(typeof(a)==='object')?a.constructor.toString().match(/date/i)!==null:false;},
    HTML:function(a){return(typeof(a)==='object')?a.constructor.toString().match(/html/i)!==null:false;},
    Number:function(a){return(typeof(a)==='number')?true:(typeof(a)==='object')?a.constructor.toString().match(/Number/)!==null:false;},
    Object:function(a){return(typeof(a)==='object')?a.constructor.toString().match(/object/i)!==null:false;},
    RegExp:function(a){return(typeof(a)==='function')?a.constructor.toString().match(/regexp/i)!==null:false;}
}
FFW.misc.or=function(a,b){return a||b;}
FFW.misc.and=function(a,b){return a&&b;}
FFW.misc.xor=function(a,b){return(a&&!b)||(!a&&b);}
FFW.misc.showLayered=function(){
    var flashObjects=FFW.a("object");
	for(i=0;i<flashObjects.length;i++)flashObjects[i].style.visibility="visible";
	var flashEmbeds=FFW.a("embed");
	for(i=0;i<flashEmbeds.length;i++)flashEmbeds[i].style.visibility="visible";
}
FFW.misc.hideLayered=function(){
	var flashObjects=FFW.a("object");
	for(i=0;i<flashObjects.length;i++)flashObjects[i].style.visibility="hidden";
	var flashEmbeds=FFW.a("embed");
	for(i=0;i<flashEmbeds.length;i++)flashEmbeds[i].style.visibility="hidden";
}
FFW.misc.showSelectBoxes=function(){
	var selects=FFW.a("select");
	for (i=0;i<selects.length;i++)selects[i].style.visibility="visible";
}
FFW.misc.hideSelectBoxes=function(){
	var selects=FFW.a("select");
	for (i=0;i<selects.length;i++)selects[i].style.visibility="hidden";
}
FFW.misc.popup=function(dest,id,property){
    var janela = window.open(dest,id,property);
    if(janela) janela.focus();
    else alert('Não foi possível abrir uma janela popup!\n\nPor favor desabilite seu bloqueador de popups e execute a ação novamente!');
}
FFW.string.trim=function(str){
   return str.replace(/^\s+/g,"").replace(/\s+$/g,"");
}
FFW.set=function(id,value){
    try{var element=FFW.g(id);}
    catch(e){
        alert('FFWjs: Element id:\''+id+'\' not found!');
        return false;
    }
    try{
        switch(element.tagName.toLowerCase()){
            case 'input':
                switch(element.type){
                    case 'text': case 'hidden': case 'password': case 'button': case 'submit': case 'reset': 
                        element.value = value;
                        return true;
                    case 'checkbox': case 'radio':
                        element.checked = value==element.value?true:false;
                        return true;
                }
            case 'select':
                if(!FFW.misc.type.Array(value)){values=[value];}else{values=value;}
                var options = element.options;
                for(var i=0;i<options.length;i++){
                    try{
                        if(values.hasValue(options[i].value)) options[i].selected=true; else options[i].selected=false;
                    }catch(e){
                        if(values.hasValue(options[i].text)) options[i].selected=true; else options[i].selected=false;
                        alert(e);
                    }
                }
                return true;    
            case 'textarea':
                element.value = value;
                return true;
            default:
                element.innerHTML = value;
        }
    }catch(e){alert('FFW.set:'+e)}
}
FFW.getValue=function(id){
    try{var element=FFW.g(id);}
    catch(e){
        alert('FFWjs: Element id:\''+id+'\' not found!');
        return false;
    }
    try{
        switch(element.tagName.toLowerCase()){
            case 'input':
                switch(element.type){
                    case 'text': case 'hidden': case 'password': case 'button': case 'submit': case 'reset': 
                        return element.value;
                    case 'checkbox': case 'radio':
                        return element.checked?true:false;
                }
            case 'select':
				var options = element.options;
				var selecteds = [];
				for(var i=0;i<options.length;i++){
					try{
						if(options[i].selected) selecteds[selecteds.length]=options.value?options.value:options.text;
					}catch(e){}
				}
                return selecteds;    
            case 'textarea':
                return element.value;
            default:
                return element.innerHTML;
        }
    }catch(e){alert('FFW.getValue:'+e)}
}
FFW.misc.setValues=function(o){
    for(var field in o){
        FFW.set(field,eval('o.'+field));
    }
    return true;
}
FFW.misc.setOpenerValues=function(o){
    if(!window.opener.FFW.misc.setValues){
        alert('FFWjs:setOpenerValues: Opener not has FFW!');
        return false;
    }
    return window.opener.FFW.misc.setValues(o);
    return true;
}
// EFFECTS
FFW.effect.setOpacity=function(element, level){
    try{
        element.style.opacity=(level/100);
        element.style.MozOpacity=(level/100);
        element.style.KhtmlOpacity=(level/100);
        element.style.filter="alpha(opacity="+level+")";
        return true;
    }catch(e){return false;}
}
FFW.effect.getOpacity=function(id){
    var element=id.style; var opacity;
    if(element.opacity)return parseFloat(element.opacity); 
    if(opacity=(element.filter||'').match(/alpha\(opacity=(.*)\)/))  
    if(opacity[1])return parseFloat(opacity[1])/100;  
    return 1.0;  
}
// EVENT
FFW.event.getKey=function(e){
	if(e==null)keycode=event.keyCode;
	else keycode=e.which;
	return String.fromCharCode(keycode).toLowerCase();
}
// NUMBER
FFW.number.parseReal=function(valor){
    if(/,/.test(valor))return parseFloat(valor.replace(/\./,"").replace(/,/,"."));return parseFloat(valor);
}

FFW.number.formataMoeda=function(fld, milSep, decSep, e,precision,size) {
  var sign = "";
  var i,j = 0;
  var key = '';
  var len = len2 = 0;
  var strCheck = new Array();
  var aux = aux2 = '';
  if (!e) var e = window.event;
  if (e.keyCode)
	var whichCode = e.keyCode;
  else if (e.which)
	var whichCode = e.which;
  strCheck[48] = strCheck[96] = 0;
  strCheck[49] = strCheck[97] = 1;
  strCheck[50] = strCheck[98] = 2;
  strCheck[51] = strCheck[99] = 3;
  strCheck[52] = strCheck[100] = 4;
  strCheck[53] = strCheck[101] = 5;
  strCheck[54] = strCheck[102] = 6;
  strCheck[55] = strCheck[103] = 7;
  strCheck[56] = strCheck[104] = 8;
  strCheck[57] = strCheck[105] = 9;
  if (!(whichCode < 48 || whichCode > 57) || !(whichCode < 96 || whichCode > 105) || whichCode == 8 || whichCode == 45 || whichCode == 43 ) {
	  key = strCheck[whichCode];
	  aux = fld.value;
	  if (whichCode == 43 || whichCode == 45) {
		  if (whichCode == 45) {
			  if (aux.charAt(0) == "-") {
				  sign = "";
			  } else {
				  sign = "-";
			  }
		  } else {
			  sign = "";
		  }
	  } else if (aux.charAt(0) == "" || aux.charAt(0) == "-") {
		sign = aux.charAt(0); 
	  }
	  aux = FFW.string.cleanNotAllowed(aux, '0123456789');
	  if (whichCode != 8 && whichCode != 43 && whichCode != 45) {
	     if (aux.length >= fld.maxLength && fld.maxLength>0) return false;
		 else aux += key;
	  } else if (whichCode == 8 && aux.length > 1) {
	  	aux = aux.substr(0,aux.length-1);
	  }
	  while (aux != "0" && aux.charAt(0) == '0') {
		  aux = aux.replace(/0([0-9]+)/,'$1')
	  }
	  if (aux.length > 0) {
		  if (aux.length == 1) {
			  aux2 = "0"+decSep+"0"+aux;
		  } else if (aux.length == precision) {
			  aux2 = "0"+decSep+aux;
		  } else {
			  for (j = 0,i = aux.length; i >= 0; i--) {
				  if (j == 3 && aux2.length > precision) {
					  aux2 = milSep + aux2;
					  j = 1;
				  } else if (aux2.length > precision) {
					  j++;
				  }
				  aux2 = aux.charAt(i) + aux2;
				  if (aux2.length == precision) {
					  aux2 = decSep + aux2;
				  }
			  }
		  }
	  } else {
		aux2 = "0"+decSep+"00";
	  }
	  fld.value = sign+aux2;
  }
  if(whichCode==9||whichCode==13) return true;
  return false;
}
FFW.number.formatBytes=function(size){
     if(size>1048576)return (Math.floor(size/10485.76)/100).toString().replace('.',',') + ' MBytes';
     if(size>1024)return (Math.floor(size/10.24)/100).toString().replace('.',',') + ' KBytes';
     return size+' Bytes';
}
// FORM
FFW.form.getQueryString=function(f) {
   form = FFW.g(f);
   var str="";
   for(var i=0;i<form.elements.length;i++) {
      try{
          if(form.elements[i].name.length>0){
             str+=i==0?'':'&';
             str+=form.elements[i].name+'='+form.elements[i].value;
          }
      }catch(e){}
   }
   return str;
}
FFW.form.getCaretPosition=function(control){
    var CaretPos = 0;
    if (document.selection){
        control.focus();
        var Sel = document.selection.createRange ();
        var Sel2 = Sel.duplicate();
        Sel2.moveToElementText(control);
        var CaretPos = -1;
        while(Sel2.inRange(Sel)){
            Sel2.moveStart('character');
            CaretPos++;
        }
    }else if (control.selectionStart || control.selectionStart == '0')
        CaretPos = control.selectionStart;
    return CaretPos;
}
FFW.form.setCaretPosition=function(ctrl, pos){
	if(ctrl.setSelectionRange){
		ctrl.focus();
		ctrl.setSelectionRange(pos,pos);
	}else if (ctrl.createTextRange) {
		var range = ctrl.createTextRange();
		range.collapse(true);
		range.moveEnd('character', pos);
		range.moveStart('character', pos);
		range.select();
	}
}
FFW.form.select={};
FFW.form.select.selectAllMatches=function(al,regex){
    for(var i=0;i<al.length;i++)if(regex.test(al.options[i].text))al.options[i].selected=true;
}
FFW.form.select.unselectAllMatches=function(al,regex){
    for(var i=0;i<al.length;i++)if(regex.test(al.options[i].text))al.options[i].selected=false;
}
FFW.form.select.selectAll=function(al){for(var i=0;i<al.length;i++)al.options[i].selected=true;}
FFW.form.select.unselectAll=function(al){for(var i=0;i<al.length;i++)al.options[i].selected=false;}
FFW.form.select.addOption=function(select,value,text){
     var noption=document.createElement('option');
     noption.text=text;
     noption.value=value;
     try{select.add(noption,null);}catch(e){select.add(noption);}
}
/**
 *  @autor Gustavo Dutra
 *  Toggle the option (If selected, unselect it and vice versa)
 */
FFW.form.select.toggleSelected=function(option) {
	if (option.selected) option.selected=false;
	else option.selected=true;
}
/**
 *  @author Gustavo Dutra
 *  Inverts the selections of a select element (All selected became unselected and vice versa)
 */
FFW.form.select.invertSelected=function(select) {
	for(var i=0;i < select.length; i++) {
		FFW.form.select.toggleSelected(select.options[i]);
	}
}
FFW.form.select.selectValues=function (select, values) {
	for (var i = 0; i < select.length; i++) {
		if (values.hasValue(select.options[i].value))
			select.options[i].selected=true;
	}
}
FFW.form.select.copySelected=function(from,to){
     for(var i=0;i<from.length;i++){
        if(from.options[i].selected)
          FFW.form.select.addOption(to,from.options[i].value,from.options[i].text);
     }
}
FFW.form.select.removeSelected=function(from){
     for(var i=0;i<from.length;i++){
        if(from.options[i].selected){ from.remove(i); i--;  }
     }
}
FFW.form.select.moveSelected=function(from,to){
    FFW.form.select.copySelected(from,to);
    FFW.form.select.removeSelected(from);
}
FFW.form.select.sort=function(select){
     var i, j,vt,vv;
     for(i=1;i<select.length;i++){
        vt = select.options[i].text;
        vv = select.options[i].value;
        j = i-1;
        while(j>=0 && select.options[j].text > vt){
           select.options[j+1].text = select.options[j].text;
           select.options[j+1].value = select.options[j].value;
           j--;
        }
        select.options[j+1].text = vt;
        select.options[j+1].value = vv;
     }
}
FFW.form.select.dumpValue=function(select){
     var i;
     var r=[];
     for(i=0;i<select.length;i++) r[i]=select.options[i].value;
     return r;
}
FFW.form.select.dumpSelected=function(select){
     var i;
     var r=[];
     for(i=0;i<select.length;i++){
		if(select.options[i].selected)
			r[r.length]=select.options[i].value;
	 }
     return r;
}
FFW.form.select.dumpText=function(select){
     var i,r=[];
     for(i=0;i<select.length;i++)r[i]=select.options[i].text; 
     return r;
}
FFW.form.select.reset=function(from){
     for(var i=0;i<from.length;i++){
        from.remove(i); 
		i--;
     }
}
FFW.form.select.populate=function(f,da){
	FFW.form.select.reset(f);
	for(var i=0;i<da.length;i++){
		FFW.form.select.addOption(f,da[i][0],da[i][1]);
    }
}
FFW.form.checkbox={};
FFW.form.checkbox.toggleCheck=function(el){if(el.checked)el.checked=false;else el.checked=true; }
FFW.form.checkbox.uncheckRange=function(id,init,end){for(var i=init;i<=end;i++)FWW.g(id+""+i).checked=false;}
FFW.form.checkbox.checkRange=function(id,init,end){for(var i=init;i<=end;i++)FWW.g(id+""+i).checked=true;}
// AJAX
FFW.ajax.strout=0;
FFW.ajax.strin=0;
FFW.ajax.primitive=function(){
   var xml;
   /*@cc_on
        @if (@_jscript_version >= 5)
         try {
           xml = new ActiveXObject("Msxml2.XMLHTTP");
         } catch (e) {
           try {
             xml = new ActiveXObject("Microsoft.XMLHTTP");
           } catch (e) {
             xml = false;
             alert(erro);
           }
         }
         @else
         xml = false;
         alert(erro);
   @end @*/
   if (!xml && typeof XMLHttpRequest != 'undefined') {
       try{xml=new XMLHttpRequest();
       }catch(e){xml=false;alert(erro);}
   }
   return xml;
}

FFW.ajax.ajse=function(serve,func,charse){
	var here = this;
	here.server = serve;
	here.busy = false;
	here.charset = charse==undefined || charse==null || charse==false? "UTF-8" : charse ;
	here.cbf = func==undefined || func==null || func==false? function(non){ } : func ;
	here.httpObject = FFW.ajax.primitive();
	this.cancel = function() {
		if (here.busy) {
			here.httpObject.onreadystatechange = function(){};
			here.httpObject.abort();
			here.busy = false;
			return true;
		}
		return false;
	}
	this.query=function(dat,metho,sinc,force){
		if (here.busy && (force==undefined || force==null)) {
			return false;
		}else if(here.busy){
			here.cancel();
		}
		here.busy = true;
		var data = dat==undefined || dat==null || dat==false ? "" : dat ;
		var sync = sinc == true? false : true;		
		var funcrev = function() {
			if (here.httpObject.readyState == 4) {
				here.busy = false;
                FFW.ajax.strin += here.httpObject.responseText.length; 
				here.cbf(here.httpObject);
			}
		}        
        FFW.ajax.strout += data.length;
		if (metho=="POST") {
			here.httpObject.open("POST", here.server, sync);
			here.httpObject.onreadystatechange = funcrev;
    		here.httpObject.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset="+here.charset);
    		here.httpObject.setRequestHeader("Cache-Control", "post-check=0, pre-check=0");
    		here.httpObject.setRequestHeader("Pragma", "no-cache");
			here.httpObject.setRequestHeader("Content-Length", data.length);
			here.httpObject.send(data);
			if(sync==false)	here.cbf(here.httpObject);
		} else {
			here.httpObject.open("GET", here.server+'?nocache='+Math.random()+'&'+data, sync);
			here.httpObject.onreadystatechange = funcrev;
			here.httpObject.send(null);
			if(sync==false)	here.cbf(here.httpObject);
		}
		return true;
	}
}

FFW.ajax.putIn=function(conteiner, addr, method, variables, encode) {
	var encode = encode||'utf-8';
	var variables = variables||{};
	var method = method||'GET';
	var c = FFW.ajax.getLoadObj(conteiner);
	var conteiner = conteiner;
	try {
		if (!c) {
			c = FFW.ajax.primitive();
			FFW.ajax.setLoadObj(conteiner, c);
		}
		c.onreadystatechange=function(){}
		c.abort();
	} catch (e) {
		//debug
		if (FFW.dbm) alert(e);
	}
	var tec = function(){
		if (c.readyState==4) {
			var content = ""+c.responseText;
			if(document.getElementById(conteiner).childNodes[0])
				document.getElementById(conteiner).removeChild(document.getElementById(conteiner).childNodes[0]);
			var newdiv = document.createElement('div');
			newdiv.innerHTML=content;
			document.getElementById(conteiner).appendChild(newdiv);
		}
	}
	c.onreadystatechange=tec;
	c.open(method.toUpperCase(), addr);
	c.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset="+encode);
	c.setRequestHeader("Cache-Control","post-check=0, pre-check=0")
	c.send(null);
}

FFW.ajax.loadlist=[];
FFW.ajax.getLoadObj=function(id){
	for(var i=0;i<FFW.ajax.loadlist.length;i++){
		if(id==FFW.ajax.loadlist[i][0])
			return FFW.ajax.loadlist[i][1];
	}
	return false;
}
FFW.ajax.setLoadObj=function(id,obj){
	for(var i=0;i<FFW.ajax.loadlist.length;i++){
		if(id==FFW.ajax.loadlist[i][0])
			return false;
	}
	var ni = FFW.ajax.loadlist.length;
	FFW.ajax.loadlist[ni] = [id,obj];
	return true;
}
FFW.ajax.loadSelect=function(idselect,from){
	var a = FFW.ajax.getLoadObj(idselect);
	try{
		if(!a){
			a = FFW.ajax.primitive();
			FFW.ajax.setLoadObj(idselect,a);
		}
		a.onreadystatechange=function(){}
		a.abort();
	}catch(e){if(FFW.dbm)alert(e);}
	
	var val_r = FFW.form.select.dumpSelected(FFW.g(idselect)); 
	FFW.form.select.reset(FFW.g(idselect));
	FFW.form.select.addOption(FFW.g(idselect),'0','Aguarde...');
	FFW.g(idselect).disabled = true;
	a.onreadystatechange=function(){
		if(a.readyState==4){
			try{
				var x = eval(a.responseText);
				var id = idselect;
				var val_d = val_r;
				FFW.g(idselect).disabled = false;
				FFW.form.select.populate(FFW.g(idselect),x);
				FFW.set(id,val_d);
				if(!FFW.misc.type.Array(x))
					throw new Exception('adasds');
			}catch(e){
				if(FFW.dbm)
					alert('FFWjs:loadSelect:unknown response:\n  '+a.responseText);
			}
		}
	}
	a.open("GET", from);
	a.send(null);	
}

FFW.ajax.populateForm=function(lname,itens,from,msg,poscallback){
	var waitmsg = msg?msg:'Aguarde...';
	var a = FFW.ajax.getLoadObj(lname);
	try{
		if(!a){
			a = FFW.ajax.primitive();
			FFW.ajax.setLoadObj(lname,a);
		}
		a.onreadystatechange=function(){}
		a.abort();
	}catch(e){if(FFW.dbm)alert(e);}
	var restore = [];
	for(var i=0;i<itens.length;i++){
		try{
			var disabled = FFW.g(itens[i]).disabled?true:false;
			switch(FFW.g(itens[i]).tagName.toLowerCase()){
				case 'input':var type = FFW.g(itens[i]).type;break;
				case 'select': case 'textarea': var type = FFW.g(itens[i]).tagName.toLowerCase();break
			}
		}catch(e){alert(itens[i]+' Não é um campo válido!');}
		FFW.g(itens[i]).disabled = false;
		var actual = FFW.getValue(itens[i]);
		FFW.set(itens[i],waitmsg);
		FFW.g(itens[i]).disabled = true;
		restore[restore.length] = [itens[i],type,disabled,actual];
	}
	a.onreadystatechange=function(){
		if(a.readyState==4){
			try{
				var dados = restore;
				var rdados = eval(a.responseText);
				for(var i=0;i<dados.length;i++){
					FFW.g(dados[i][0]).disabled = false;
					var j=0;
					for(j=0;j<rdados.length;j++){
						if(rdados[j][0]==dados[i][0]){
							FFW.set(dados[i][0],rdados[j][1]);
							break;
						}
					}
					if(j==rdados.length) FFW.set(dados[i][0],dados[i][3]);
					FFW.g(dados[i][0]).disabled = dados[i][2];
				}
				if (poscallback) {
					poscallback(a);
				}
			}catch(e){
				if(FFW.dbm)
					alert('FFWjs:loadForm:\n'+e+'\n  '+a.responseText);
				try{for(var i=0;i<dados.length;i++){
					FFW.g(dados[i][0]).disabled = false;
					FFW.set(dados[i][0],dados[i][3]);
					FFW.g(dados[i][0]).disabled = dados[i][2];
				}}catch(e){alert(e);}
			}
		}
	}
	a.open("GET", from);
	a.send(null);		
}
// STRING
FFW.string.applyMask=function(string,mask){
    var i=0;
    var j=0;
    var masked="";
    for(;string.length>i && mask.length>j;j++){
       if(mask.charAt(j)=='0'){
           masked += string.charAt(i);
           i++;
       }else{
           masked += mask.charAt(j);
       }
    }
    return masked;
}
FFW.string.calcCaret=function(mask,pos){
    var j=0;
    for(;mask.length>j;j++){
       if(mask.charAt(j)=='0'&& pos<j) break;       
    }
    return j;
}
FFW.string.cleanNotAllowed=function(old,valids){
    var i, n="";
    for(i=0;i<old.length;i++) 
        if(valids.indexOf(old.charAt(i))>=0) 
            n += old.charAt(i);
    return n;
}
FFW.string.applyValidMask=function(string,mask,valid){
    return FFW.string.applyMask(FFW.string.cleanNotAllowed(string,valid),mask);
}
FFW.form.applyValidMaskCaret=function(field,mask,valid){
    var caretPosition = FFW.form.getCaretPosition(field);
    field.value = FFW.string.applyMask(FFW.string.cleanNotAllowed(field.value,valid),mask);
    FFW.form.setCaretPosition(field,FFW.string.calcCaret(mask,caretPosition));
    return true;
}
FFW.form.applyValidCaret=function(field,valids){
    var caretPosition = FFW.form.getCaretPosition(field);
	var i, n="",old=field.value;
    for(i=0;i<old.length;i++) {
        if(valids.indexOf(old.charAt(i))>=0) 
            n += old.charAt(i);
		//else if(caretPosition>)
	}
    field.value = n;
    FFW.form.setCaretPosition(field,caretPosition);
    return true;
}
// Prototypes
Array.prototype.hasValue=function(e){
    for(var i=0;i<this.length;i++){
        if(this[i]==e) return true;
    }
    return false;
}
// Alias

try{
if(typeof(g) == 'undefined'){
    function g(i){return FFW.g(i);}
}
}catch(e){}
