﻿/*********************************************************/
/*				RDA Ajax JS Library	v2					 /*
/*				Last Update: 29/02/08					 /*
/*				Copyright 2008 RDA Comunicações			 /*
/*********************************************************/


if($extend == null) {
var $extend = function(destination, source) {
  for (var property in source) {
    destination[property] = source[property];
  }
  return destination;
}
$extend(Object,{
  copy:function(object){return Object.extend({}, object);},
  extend:function(destination, source){$extend(destination,source);}
  }
);
function Class(data){
  var ret = new Object();
  ret.$extend=new Function('var destination=arguments[0], source=arguments[1];for(var property in source)destination[property]=source[property]; return destination;');
  ret.setProperty=function(param,value) {
    if(value!=null && typeof value!='undefined')
	  this[param]=value;
  };
  return ret.$extend(ret,data||{});
}
Class.$extend=Function('var destination=arguments[0], source=arguments[1];for(var property in source)destination[property]=source[property]; return destination;');
Class.require = function() {
  for(var i=0; i<arguments.length;i++) {
    var library = arguments[i];
	if(!RDA.LIBS.exists(library)) {
      document.write('<script type="text/javascript" src="'+RDA.baseURL+library+'.js"></script>\n');
	  RDA.LIBS.push(library);
	}
  }
}
var Objects = {
  getHeight: function(object) {
    return $(object).offsetHeight;
  },
  getWidth: function(object) {
    return $(object).offsetWidth;
  },
  getPageviewSize: function() {
	var width, height;
	if (self.innerHeight) {
		width = self.innerWidth;
		height = self.innerHeight;
	} else if (document.documentElement && document.documentElement.clientHeight) {
		width = document.documentElement.clientWidth;
		height = document.documentElement.clientHeight;
	} else if (document.body) {
		width = document.body.clientWidth;
		height = document.body.clientHeight;
	}
	arrayPageSize = {pageWidth:width,pageHeight:height}
	return arrayPageSize;  
  },
  getPageSize: function() {
	var xScroll, yScroll;
	if (window.innerHeight && window.scrollMaxY){
		xScroll = document.body.scrollWidth;
		yScroll = window.innerHeight + window.scrollMaxY;
	} else if (document.body.scrollHeight > document.body.offsetHeight){
		xScroll = document.body.scrollWidth;
		yScroll = document.body.scrollHeight;
	} else {
		xScroll = document.body.offsetWidth;
		yScroll = document.body.offsetHeight;
	}
	var windowWidth, windowHeight;
	if (self.innerHeight) {
		windowWidth = self.innerWidth;
		windowHeight = self.innerHeight;
	} else if (document.documentElement && document.documentElement.clientHeight) {
		windowWidth = document.documentElement.clientWidth;
		windowHeight = document.documentElement.clientHeight;
	} else if (document.body) {
		windowWidth = document.body.clientWidth;
		windowHeight = document.body.clientHeight;
	}
	if(yScroll < windowHeight) pageHeight = windowHeight;
	else pageHeight = yScroll;
	if(xScroll < windowWidth) pageWidth = windowWidth;
	else pageWidth = xScroll;
	arrayPageSize = {pageWidth:pageWidth,pageHeight:pageHeight,windowWidth:windowWidth,windowHeight:windowHeight}
	return arrayPageSize;
  },
  getPageScroll: function(){
	var yScroll;
	if (self.pageYOffset) yScroll = self.pageYOffset;
	else if (document.documentElement && document.documentElement.scrollTop) yScroll = document.documentElement.scrollTop;
	else if (document.body) yScroll = document.body.scrollTop;
	arrayPageScroll = {yScroll:yScroll};
	return arrayPageScroll;
  },
  getPosition:function(element){
	element=$(element);
	var left=0,top=0;
	if(!element) return {x:left, y:top};
	while (element.offsetParent){ left += element.offsetLeft; top  += element.offsetTop; element = element.offsetParent; }
	left += element.offsetLeft;
	top  += element.offsetTop;
	return {x:left, y:top};
  },
  ShowHide: function(object) {
	object=$(object);
	if(object && object.style) {
	  object.style.display=object.style.display!='block'?'block':'none';
    }
  },
  extend: function(destination,source) {
    for (var property in source) destination[property] = source[property];
	return destination;
  }
}

Number.random = function() {
  return Math.ceil(Math.random()*999999);
}
String.cut = function(str,size) {
  if(str.length>size) return str.substr(0,size-3)+'...'; else return str;
}
if(!String.match) String.match = function(reg) {
  return RegExp(reg).test(this);
}

String.stripTags = function(html) {
  return html.replace(/(<([^>]+)>)/ig,"");
}

var $=function () {
  var elements = new Array();
  for (var i=0;i<arguments.length;i++) {
    var element=arguments[i];
    if (typeof element == 'string') element=document.getElementById(element);
    if (arguments.length == 1) return element;
    elements.push(element);
  }
  return elements;
}
}

function Ajax(){}
var objAjax = {
	getTransport: function () {
		var requestElements = ["MSXML2.XMLHTTP.5.0","MSXML2.XMLHTTP.4.0","MSXML2.XMLHTTP.3.0","MSXML2.XMLHTTP","MICROSOFT.XMLHTTP.1.0","MICROSOFT.XMLHTTP.1","MICROSOFT.XMLHTTP"];
		var requestElement;
		if(typeof XMLHttpRequest == 'undefined' && typeof ActiveXObject != 'undefined') {
			for (var a=0;a<requestElements.length;a++) {
				var b=requestElements[a];
				try {
					new ActiveXObject(b);
					requestElement=b;
					break;
				} catch(c){}
			}
			if (typeof requestElement == 'undefined') {
				throw "Could not create ActiveXObject. ActiveX might be disabled, or msxml might not be installed";
			}
		}
		if(typeof requestElement != 'undefined') return new ActiveXObject(requestElement); else return new XMLHttpRequest;
	},
	Get: function (page,vars,target,method,callback) {
		var req=Ajax.getTransport();
		var rnd=parseInt(Math.random()*99999999);
		if(req) {
			var isGet = new RegExp(/undefined|get/i).test(method);
			var isPost = new RegExp(/post/i).test(method);
			req.open(isPost?"POST":"GET",page+(isGet ? '?'+vars+'&rand='+rnd : ''),true);
			if(isPost) req.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
			req.onreadystatechange = function () { Ajax.loadContent(target,req); }
			req.send(isGet?null:vars);
			return req;
		} else {alert('Erro!\n Este navegador não suporta as funcionalidades desta página. Atualize-o.'); return false;}		
	},
	loadContent: function (target,request) {
		var loader = $('ajax_loader');
		if(loader == null) {
			loader = document.createElement('DIV');loader.innerHTML="Carregando...";loader.id='ajax_loader';
			var ll=(navigator.appName.indexOf("Netscape") != -1)?innerWidth : (document.documentElement && document.documentElement.clientWidth ? document.documentElement.clientWidth : document.body.clientWidth);
			with (loader.style) {
				display='none';		position='absolute';	left=Math.ceil((ll-100)/2)+'px';top='40%';
				zIndex='10000';		color='#FFFFFF';		fontSize='8pt';				height='15px';
				width='100px';		textAlign='center';		backgroundColor='#DD0000';	padding='4px';
				fontFamily='Tahoma,Verdana,Arial,sans-serif';				
			}
			document.body.appendChild(loader);			
		}
		if(request.readyState<4 && request.readyState>0) {
			loader.style.display='block';
		}
		if(request.readyState==4) {
			var content = request.responseText;
			if(target) {
				target = $(target);
				if(target.tagName && new RegExp(/input|textarea/i).test(target.tagName)){target.value = content; }
				else{target.innerHTML=content;}
			}
			Ajax.JSRun(content);
			loader.style.display='none';
		}
		if(typeof callback == 'function') { callback(); }
	},
	JSRun: function (text){
		var start = 0;
		var end = 0;
		var code = "";
		var script = document.createElement('script');
		while (start!=-1){
			start = text.indexOf('<scr'+'ipt', start);
			if (start >=0){
				start  = text.indexOf('>', start)+1;
				end = text.indexOf('</scr'+'ipt>', start);
				code = text.substring(start,end);
				script.type		= 'text/javascript';
				script.language	= 'javascript';
				script.text = code;
				document.body.appendChild(script);
			}
		}
	}
};

$extend(Ajax,objAjax);
/*for (var property in objAjax) {
  Ajax[property] = Ajax.prototype[property];
}*/


var Form = {
  serialize: function(form) {
    var elements = Form.getElements($(form));
    var queryComponents = new Array();

    for (var i = 0; i < elements.length; i++) {
      var queryComponent = Form.Element.serialize(elements[i]);
      if (queryComponent)
        queryComponents.push(queryComponent);
    }
    return queryComponents.join('&');
  },

  getElements: function(form) {
    form = $(form);
    var elements = new Array();

    for (tagName in Form.Element.Serializers) {
      var tagElements = form.getElementsByTagName(tagName);
      for (var j = 0; j < tagElements.length; j++)
        elements.push(tagElements[j]);
    }
    return elements;
 	},

  getInputs: function(form, typeName, name) {
    form = $(form);
    var inputs = form.getElementsByTagName('input');

    if (!typeName && !name)
      return inputs;

    var matchingInputs = new Array();
    for (var i = 0; i < inputs.length; i++) {
      var input = inputs[i];
      if ((typeName && input.type != typeName) ||
          (name && input.name != name))
        continue;
      matchingInputs.push(input);
    }

    return matchingInputs;
  },

  disable: function(form) {
    var elements = Form.getElements(form);
    for (var i = 0; i < elements.length; i++) {
      var element = elements[i];
      element.blur();
      element.disabled = 'true';
    }
  },

  enable: function(form) {
    var elements = Form.getElements(form);
    for (var i = 0; i < elements.length; i++) {
      var element = elements[i];
      element.disabled = '';
    }
  },

  findFirstElement: function(form) {
    return Form.getElements(form).find(function(element) {
      return element.type != 'hidden' && !element.disabled &&
        ['input', 'select', 'textarea'].include(element.tagName.toLowerCase());
    });
  },

  focusFirstElement: function(form) {
    Field.activate(Form.findFirstElement(form));
  },

  reset: function(form) {
    $(form).reset();
  }
}

Form.Element = {
  serialize: function(element) {
    element = $(element);
    var method = element.tagName.toLowerCase();
    var parameter = Form.Element.Serializers[method](element);

    if (parameter) {
      var key = encodeURIComponent(parameter[0]);
      if (key.length == 0) return;
      if (parameter[1].constructor != Array) parameter[1] = [parameter[1]];
      return parameter[1].map(function(value) {
        return key + '=' + encodeURIComponent(value);
      }).join('|');
    }
  },

  getValue: function(element) {
    element = $(element);
    var method = element.tagName.toLowerCase();
    var parameter = Form.Element.Serializers[method](element);

    if (parameter)
      return parameter[1];
  }
}

Form.Element.Serializers = {
  input: function(element) {
    switch (element.type.toLowerCase()) {
      case 'submit':
      case 'hidden':
      case 'password':
      case 'text':
        return Form.Element.Serializers.textarea(element);
      case 'checkbox':
      case 'radio':
        return Form.Element.Serializers.inputSelector(element);
    }
    return false;
  },

  inputSelector: function(element) {
    if (element.checked)
      return [element.name, element.value];
  },

  textarea: function(element) {
    return [element.name, element.value];
  },

  select: function(element) {
    return Form.Element.Serializers[element.type == 'select-one' ?
      'selectOne' : 'selectMany'](element);
  },

  selectOne: function(element) {
    var value = '', opt, index = element.selectedIndex;
    if (index >= 0) {
      opt = element.options[index];
      value = opt.value;
      if (!value && !('value' in opt))
        value = opt.text;
    }
    return [element.name, value];
  },

  selectMany: function(element) {
    var value = new Array();
    for (var i = 0; i < element.length; i++) {
      var opt = element.options[i];
      if (opt.selected) {
        var optValue = opt.value;
        if (!optValue && !('value' in opt))
          optValue = opt.text;
        value.push(optValue);
      }
    }
    return [element.name, value];
  }
}
function sendForm(element,target) {
	var form = $(element);
	if(!form.method && form.method == 'undefined') form.method = 'post';
	if(!target && typeof target == 'undefined') target = form.target;
	AjaxGet(form.action,Form.serialize(element),target,form.method);
	return false;
}

function AjaxGet(page,vars,target,method) {
	Class(Ajax).Get(page,vars,target,method);
}

function marcar(table,id,value,field) {
	return AjaxGet('marcar.php','table='+table+'&field='+field+'&id='+id+'&value='+(value?'Y':'N'),'messagebox','GET');
}
function publicar(table,id,isPublic) {
	return marcar(table,id,isPublic,'public');
}

var Messages = {
  FClose: function(){
	if(Messages.last!=null && Messages.list.length>0) {
	  window.clearTimeout(Messages.last.tAutoClose);	  
	  Messages.list.shift();
	}
  },
  infoproto:{
	object:null,
	isRunning:false,	
	text:'',
	autoClose:false,
	delay:4000,
	tAutoClose: null,
	background:'#FFC',
	foreground:'#600',
	border:'#666',
	icon:'',
	exec:function() {
	  this.object = document.createElement('div');
	  this.object.id = 'line-message'+Math.ceil(Number.random());
	  var closefunc = new Function('var v=$("'+this.object.id+'");v.parentNode.removeChild(v);Messages.FClose();');
	  this.object.onclick = closefunc;
	  var anc = document.createElement('a');
	  var txtobj = document.createElement('div');
	  txtobj.innerHTML=this.text;
	  Style(txtobj).apply({float:'left'});	  
	  this.object.appendChild(txtobj);
	  var auto = function(width,sample) {
		var nsz = Math.ceil((sample-width)/2);
		return nsz>0?nsz:0;
	  }
	  var ww = Objects.getPageviewSize().pageWidth;
	  var top = Objects.getPageScroll().yScroll;
	  if(top>0) top+=20; else top=20;
	  Style(this.object).apply({width:(this.text.length*10+30)+'px',top:top+'px',background:this.background,padding:'10px',color:this.foreground,fontSize:'8pt',fontWeight:'bold',position:'absolute',left:(auto(300,ww)+'px'),border:'1px solid '+this.border});
	  if(this.icon!='') Style(this.object).apply({background:this.background+' url('+this.icon+') no-repeat 5px center',paddingLeft:'30px'});
	  
	  if(this.autoClose==true) this.tAutoClose = window.setTimeout(closefunc,this.delay);
	  document.body.insertBefore(this.object,document.body.firstChild);
	  this.isRunning = true;
	  Messages.last=this;
	}
  },
  msgproto: {
	object:null,
	isRunning:false,
	icon:'',
	text:'',
	winID:null,
	autoClose:false,
	delay:3000,
	tAutoClose: null,
	background:'#FFFFCC',
	foreground:'#000000',
	exec:function() {
	  var win = WindowManager.create({W:550,H:200,T:'auto',L:'auto',title:'Mensagem',onDestroy:Messages.FClose,closeable:true});
	  this.winID = win.ID;
	  this.object = document.createElement('div');
	  var txt = document.createElement('div');
	  txt.innerHTML = this.text;
	  Style(txt).apply({background:this.background,height:'70px',padding:'10px',margin:'0',color:this.foreground,fontSize:'8pt'});
	  if(this.icon!='') Style(txt).apply({background:this.background+' url('+this.icon+') no-repeat 10px center',paddingLeft:'50px'});
	  this.object.appendChild(txt);
	  win.client.appendChild(this.object);
	  var top = Objects.getPageScroll().yScroll || 50;
	  if(top>0) top+=50;
	  Style(win.object).apply({height:'auto'});
	  Style(win.client).apply({height:'auto',top:top+'px',background:'#FFFFFF',color:this.foreground,padding:'0',fontSize:'9pt',fontFamily:'Verdana,Arial,Helvetica'});
	  if(this.autoClose==true) this.tAutoClose = window.setTimeout(function(){Windows.destroy(Messages.last.winID);Messages.FClose();},this.delay);
	  var cmdbar = document.createElement('div');
	  Style(cmdbar).apply({padding:'10px'});
	  cmdbar.style.textAlign='center';
	  var but = document.createElement('input');
	  but.className = 'cmdbutton';
	  but.type = 'button';
	  but.value = ' OK ';
	  but.onclick = function(){Windows.destroy(Messages.last.winID);Messages.FClose;}
	  cmdbar.appendChild(but);
	  win.client.appendChild(cmdbar);
	  this.isRunning = true;
	  Messages.last=this;	  
	}
  },
  last:null,
  list:[],
  verify:function(){
	if(Messages.list.length>0 && Messages.list[0].isRunning==false) {
	  Messages.list[0].exec();	  
    }
  },
  _message:function(data) {
	var m = Class(Messages.msgproto);
	Class.$extend(m,data);
	if(Messages.verifier==null) Messages.verifier = setInterval(Messages.verify,250);
    Messages.list.push(m);
  },
  infobox:function(value) {
	var m = Class(Messages.infoproto);
	var data = {text:value,autoClose:true,foreground:'#235',background:'#FFF',border:'#F60'};
	Class.$extend(m,data);
	if(Messages.verifier==null) Messages.verifier = setInterval(Messages.verify,250);
    Messages.list.push(m);
  },
  warnbox:function(value) {
	var m = Class(Messages.infoproto);
	var data = {text:value,icon:'/img/warning16.gif',autoClose:true,foreground:'#FF6600',background:'#FFFFCC'};
	Class.$extend(m,data);
	if(Messages.verifier==null) Messages.verifier = setInterval(Messages.verify,250);
    Messages.list.push(m);
  },
  warn:function(value) {
	Messages._message({text:value,icon:'/img/message-warning32.gif',autoClose:true,foreground:'#FF6600',background:'#FFFFCC'});
  },
  error:function(value) {
	Messages._message({text:value,icon:'/img/message-error32.gif',autoClose:true,foreground:'#000000',background:'#FFCCCC'});
  },
  info:function(value) {
	Messages._message({text:value,icon:'/img/message-info32.gif',autoClose:true,foreground:'#FF6600',background:'#FFFFFF'});
  }
}

function Styler() {}
Styler.prototype = {
  tag:null,
  apply:function(data) {
    if(data && this.tag && this.tag.style) {
      for(var k in data)
	this.tag.style[k] = data[k];
	return true;
    } else return false;
  },
  addCSS:function(text){
	var style = document.createElement('style');
    style.type='text/css';
	style.appendChild(document.createTextNode(text));
    document.body.appendChild(style);
  },
  applyCSS:function(text) {
    if(text == '') return false;
    var list = text.split(';');
    var obj = {};
    for(var i=0;i<list.length;i++) {
      var item = list[i].split(':');
      var key=String(item[0]).trim();
      var value = String(item[1]).trim();
      if(key&&value) obj[key] = value;
    }
    if(this.tag && this.tag.style) {
      for(var k in obj)
	this.tag.style[k] = obj[k];
    }
    return true;
  },
  addClass:function(name) {
    if(!this.tag) return false;
    var list = this.tag.className;
    if(list.indexOf(' ',0)>0) list = list.split(' '); else list = [list];
    if(!list.exists(name)) list.push(name);
    this.tag.className = list.join(' ');
    return true;
  },
  removeClass:function(name) {
    if(!this.tag) return false;
    var list = this.tag.className;
	if(list.trim()!=name) {
      if(list.indexOf(' ',0)>0)
	    list = list.split(' ');
	  else
	    list = [list];
	  var newclass=[];
	  for(i=0;i<list.length;i++)
	    if(list[i]!=name) newclass.push(list[i]);
      this.tag.className = newclass.length==1?newclass[0]:newclass.join(' ');
	} else {
	  this.tag.className = '';
	}
    return true;
  },
  haveClass:function(name) {
    if(!this.tag) return false;
    var list = this.tag.className || '';
    if(list.indexOf(' ',0)>0) list = list.split(' '); else list = [list];
    return list.exists(name);
  }
}

var Style = function(element) {
  element = $(element);
  var s = new Styler();
  s.tag = element;
  return s;
}
