/*
 * Copyright 2009 - 2011 Horacio Daniel Ros
 * This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2 of the License, or any later version.
 * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied
 * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
 * You should have received a copy of the GNU General Public License along with this program;
 * if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
 */

/*
 * Project:       JavaScript Abstraction Layer -> Jabs.Project
 * Author:        Horacio Daniel Ros
 * E-mail:        horaciodrs@gmail.com
 * Site:          http://www.javabs.com.ar
 * Date:          2009/11/07
 * Last Update:   2011/06/25
 * Version:       0.11.4.21
 * Lo que haces con JavaScript, hacelo facil.
 */

var display_alerts = false;

/*
 * Jal.Project.kernel : Key Codes
 */

var _KEY_DOWN = 40;
var _KEY_UP = 38;
var _KEY_LEFT = 37;
var _KEY_RIGHT = 39;

var _KEY_backspace = 8;
var _KEY_tab = 9;
var _KEY_enter = 13;
var _KEY_shift = 16;
var _KEY_ctrl = 17;
var _KEY_alt = 18;
var _KEY_pause_break = 19;
var _KEY_caps_lock = 20;
var _KEY_escape = 27;
var _KEY_page_up = 33;
var _KEY_page_down = 34;
var _KEY_end = 35;
var _KEY_home = 36;
var _KEY_left_arrow = 37;
var _KEY_up_arrow = 38;
var _KEY_right_arrow = 39;
var _KEY_down_arrow = 40;
var _KEY_insert = 45;
var _KEY_delete = 46;
var _KEY_0 = 48;
var _KEY_1 = 49;
var _KEY_2 = 50;
var _KEY_3 = 51;
var _KEY_4 = 52;
var _KEY_5 = 53;
var _KEY_6 = 54;
var _KEY_7 = 55;
var _KEY_8 = 56;
var _KEY_9 = 57;
var _KEY_a = 65;
var _KEY_b = 66;
var _KEY_c = 67;
var _KEY_d = 68;
var _KEY_e = 69;
var _KEY_f = 70;
var _KEY_g = 71;
var _KEY_h = 72;
var _KEY_i = 73;
var _KEY_j = 74;
var _KEY_k = 75;
var _KEY_l = 76;
var _KEY_m = 77;
var _KEY_n = 78;
var _KEY_o = 79;
var _KEY_p = 80;
var _KEY_q = 81;
var _KEY_r = 82;
var _KEY_s = 83;
var _KEY_t = 84;
var _KEY_u = 85;
var _KEY_v = 86;
var _KEY_w = 87;
var _KEY_x = 88;
var _KEY_y = 89;
var _KEY_z = 90;
var _KEY_left_window_key = 91;
var _KEY_right_window_key = 92;
var _KEY_select_key = 93;
var _KEY_numpad_0 = 96;
var _KEY_numpad_1 = 97;
var _KEY_numpad_2 = 98;
var _KEY_numpad_3 = 99;
var _KEY_numpad_4 = 100;
var _KEY_numpad_5 = 101;
var _KEY_numpad_6 = 102;
var _KEY_numpad_7 = 103;
var _KEY_numpad_8 = 104;
var _KEY_numpad_9 = 105;
var _KEY_multiply = 106;
var _KEY_add = 107;
var _KEY_subtract = 109;
var _KEY_decimal_point = 110;
var _KEY_divide = 111;
var _KEY_f1 = 112;
var _KEY_f2 = 113;
var _KEY_f3 = 114;
var _KEY_f4 = 115;
var _KEY_f5 = 116;
var _KEY_f6 = 117;
var _KEY_f7 = 118;
var _KEY_f8 = 119;
var _KEY_f9 = 120;
var _KEY_f10 = 121;
var _KEY_f11 = 122;
var _KEY_f12 = 123;
var _KEY_num_lock = 144;
var _KEY_scroll_lock = 145;
var _KEY_semi_colon = 186;
var _KEY_equal_sign = 187;
var _KEY_comma = 188;
var _KEY_dash = 189;
var _KEY_period = 190;
var _KEY_forward_slash = 191;
var _KEY_grave_accent = 192;
var _KEY_open_bracket = 219;
var _KEY_back_slash = 220;
var _KEY_close_braket = 221;
var _KEY_single_quote = 222;

function Sum(arrToSum){
	var suma=0;
	for(var i=0;i<arrToSum.length; i++){
		suma+=parseFloat(IsNull(arrToSum[i]));
	}
	return Number(suma);
}

function IsNumeric(pValue){

	var v = new String(pValue);

	if(v.match(/^-?[0-9]+(\.[0-9]{1,6})?$/)){
		return true;
	}else{
		return false;
	}

}

function IsNull(pValue, pDefault){
	
	if(!pValue){
		if(!pDefault)
			return 0;
		return pDefault;
	}
	return pValue;
	
}

function IsZero(pValue, pDefault){
	
	if(pValue == 0){
		if(!pDefault)
			return 0;
		return pDefault;
	}
	
	return pValue;
	
}

/*
 * String: Aditionals Functions
 */

String.prototype.Left = function(n){
	if(n <= 0)
		return '';
	else if(n > String(this).length)
		return this;
	else
		return String(this).substring(0,n);
};

String.prototype.Right = function(n){
	if (n <= 0)
		return '';
	else if (n > String(this).length)
		return this;
	else {
		var iLen = String(this).length;
		return String(this).substring(iLen, iLen - n);
	}
};

String.prototype.lower = function(){
	return this.toLowerCase();
};

String.prototype.upper = function(){
	return this.toUpperCase();
};

Array.prototype.Walk = function(pFunction, pParameters){
	for(var i=0;i<this.length;i++){
		pFunction(i, this[i], pParameters);
	}
};

/*
 * Jal.Project.kernel : Browser
 */

var Browser = {

	Engine : {

		Trident : function(){
			if(navigator.userAgent.toLowerCase().indexOf('trident') > -1){
				return true;
			}else{
				if(navigator.appName.toLowerCase().indexOf('internet explorer') > -1){
					return true;
				}else{
					return false;
				}
			}
		},

		Gecko : function(){
			if(navigator.userAgent.toLowerCase().indexOf('gecko') > -1){
				return true;
			}else{
				return false;
			}
		},
		
		Presto : function(){
			if(window.opera){
				return true;
			}else{
				return false;
			}
		},
		
		Webkit : function(){
			if(navigator.userAgent.toLowerCase().indexOf('webkit') > -1){
				return true;
			}else{
				return false;
			}
		}
	
	},
	
	IE6 : function(){
		if(navigator.appVersion.toUpperCase().indexOf('MSIE 6.') >= 0){
			return true;
		}else{
			return false;
		}
	},
	
	IE7 : function(){
		if(navigator.appVersion.toUpperCase().indexOf('MSIE 7.') >= 0){
			return true;
		}else{
			return false;
		}
	},
	
	IE8 : function(){
		if(navigator.appVersion.toUpperCase().indexOf('MSIE 8.') >= 0){
			return true;
		}else{
			return false;
		}
	},
	
	IE9 : function(){
		if(navigator.appVersion.toUpperCase().indexOf('MSIE 9.') >= 0){
			return true;
		}else{
			return false;
		}
	}

};

var LEFT_CLICK = 1;
var RIGHT_CLICK = 3;

/*
 * Jal.Project.kernel : screen
 */

function jalScreen(){

	this.Width = 0;
	this.Height = 0;

	this.getWidth = function(){

		try{

			if(Browser.Engine.Trident()){
				this.Width = document.body.clientWidth;
			}

			if(Browser.Engine.Gecko()){
				this.Width = window.innerWidth;
			}

			if(Browser.Engine.Webkit()){
				this.Width = window.innerWidth;
			}

			if(Browser.Engine.Presto()){
				this.Width = document.body.clientWidth;
			}

		}catch(e){
			if(display_alerts)
				alert('An error has ocurred: kernel.functions.Screen.getWidth');
		}

	};
	this.getHeight = function(){

		//this.Height = window.outerHeight;
		/*
		var D = document;
		this.Height = Math.max(
	        //Math.max(D.body.scrollHeight, D.documentElement.scrollHeight),
	        Math.max(D.bo1dy.offsetHeight, D.documentElement.offsetHeight)//,
	        //Math.max(D.body.clientHeight, D.documentElement.clientHeight)
	    );*/


		try{

			if(Browser.Engine.Trident()){
				this.Height = document.body.clientHeight;
			}

			if(Browser.Engine.Gecko()){
				this.Height = window.innerHeight;
			}

			if(Browser.Engine.Webkit()){
				this.Height = window.innerHeight;
			}

			if(Browser.Engine.Presto()){
				this.Height = document.body.clientHeight;
			}

		}catch(e){
			if(display_alerts)
				alert('An error has ocurred: kernel.functions.Screen.getHeight');
		}

	};

}

var Screen = new jalScreen();

/*
 * Jal.Project.kernel : mouse
 */

function jalMouse(){

	this.X;
	this.Y;

	this.getX = function(){
		return this.X;
	};
	this.getY = function(){
		return this.Y;
	};

}

var Mouse = new jalMouse();

function jalMouse_setXY(ev){

	try{

		if(Browser.Engine.Trident()){
			Mouse.X = window.event.x;
			Mouse.Y = window.event.y;
		}

		if(Browser.Engine.Presto()){
			Mouse.X = window.event.x;
			Mouse.Y = window.event.y;
		}

		if((Browser.Engine.Gecko()) || (Browser.Engine.Webkit())){
			Mouse.X = ev.clientX;
			Mouse.Y = ev.clientY;
		}

	}catch(e){
		if(display_alerts)
			alert('An error has ocurred: kernel.functions.jalMouse_setXY');
	}

}

/*
 * Jal.Project.kernel : ArrayList
 */

function ArrayList(){
	this.Objects = new Array();
	this.AddObjects = ArrayList_add;
	this.ClearObjects = ArrayList_clear_objects;
	this.ClearObjectByIndex = ArrayList_ClearObjectByIndex;
	this.Count = function(){return this.Objects.length;};
	this.Walk = function(pFunctionOnWalk, pParameters){
		for(var i=0;i<this.Count();i++){
			pFunctionOnWalk(i, this.Objects[i], pParameters);
		}
	};
}

function ArrayList_ClearObjectByIndex(pIndex){

	try{

		var Aux = new ArrayList();

		for(var i=0;i<this.Objects.length;i++){
			if(i!=pIndex){
				Aux.AddObjects(this.Objects[i]);
			}
		}

		this.ClearObjects();
		this.Objects = Aux.Objects;

	}catch(e){
		if(display_alerts)
			alert('An error has ocurred: kernel.functions.ArrayList.ClearObjectsByIndex');
	}

}

function ArrayList_clear_objects(){
	this.Objects = null;
	this.Objects = new Array();
}

function ArrayList_add(pObject){

	try{

		if(this.Objects.length > 0){

			var aux = new Array(this.Objects.length);

			for(var i=0;i<aux.length;i++){
				aux[i] = this.Objects[i];

			}

			this.Objects = null;
			this.Objects = new Array(aux.length + 1);

			for(i=0;i<aux.length;i++){
				this.Objects[i] = aux[i];
			}

			this.Objects[i] = pObject;

		}else{
			this.Objects = null;
			this.Objects = new Array(1);
			this.Objects[0] = pObject;
		}

	}catch(e){
		if(display_alerts)
			alert('An error has ocurred: kernel.functions.ArrayList.AddObjects');
	}

}

/*
 * Jal.Project.kernel : kernel objects list
 */

function ObjectsList(){

	this.GetObjectById = ObjectsList_GetObjectById;
	this.ClearObjectById = ObjectsList_ClearObjectById;
	this.GetIndexById = ObjectsList_GetIndexById;
	this.Add = ObjectsList_Add;

}

ObjectsList.prototype = new ArrayList();

function ObjectsList_Add(pObject){

	// no pueden existir dos objectos con el mismo id
	var id_to_find = pObject.Id;

	if(this.GetObjectById(id_to_find)){
		if(display_alerts)
			alert('Warning: Duplicated Object Ids. The object has been updated');
		this.Objects[this.GetIndexById(id_to_find)] = pObject; 
	}else{
		this.AddObjects(pObject);
	}

}

function ObjectsList_ClearObjectById(pId){

	try{

		var index_to_delete = this.GetIndexById(pId);

		if(index_to_delete >= 0){
			this.ClearObjectByIndex(index_to_delete);
		}

	}catch(e){
		if(display_alerts)
			alert('An error has ocurred: kernel.functions.ObjectsList.ClearObjectById');
	}

}

function ObjectsList_GetIndexById(pId){

	try{

		for(var i=0;i<this.Objects.length;i++){
			if(this.Objects[i].Id == pId){
				return i;
			}
		}

		return -1;

	}catch(e){
		if(display_alerts)
			alert('An error has ocurred: kernel.functions.ObjectsList.GetIndexById');
	}

}

function ObjectsList_GetObjectById(pId){

	try{

		for(var i=0;i<this.Objects.length;i++){
			if(this.Objects[i].Id == pId){
				return this.Objects[i];
			}
		}

		return null;

	}catch(e){
		if(display_alerts)
			alert('An error has ocurred: kernel.functions.ObjectsList.GetObjectById');
	}

}


/*
 * Jal.Project.kernel : AJAX Object
 */

function Ajax(pUrl, pFunction){
	var http;
	try{
		http=new XMLHttpRequest();
	}catch(e){
		try{
			http=new Activexobject("Msxml2.XMLHTTP");
		}catch(e){
			try{
				http=new Activexobject("MICROSOFT.XMLHTTP")
			}catch(e){
				alert("Your web browser don't support this method. Try with Chrome, Firefox, Opera, etc.");
				return false;
			}
		}
	}

	http.onreadystatechange = function(){
		if(http.readyState==4){
			pFunction(http.responseText); //responseXML para leer un archivo XML
		}
	}

	http.open("GET", pUrl, true);
	http.send(null);

	return http;
}

/*
 * Jal.Project.kernel : XML File Object
 */

function getXML(pFile){

	var xml_return = new XMLFileObject(pFile);

	return(xml_return.XML);

}

function XMLFileObject(pFile){

	this.XML;
	this.File = pFile;
	this.OnLoad = function(){
		return this.XML;	
	};
	this.Load = function(){

		if(Browser.Engine.Trident()){
			if (window.ActiveXObject) {
				this.XML = new ActiveXObject("Microsoft.XMLDOM");
				this.XML.async = false;
				this.XML.load(this.File);
				this.OnLoad();
			}
		}

		if(Browser.Engine.Gecko()){

			try{
				this.XML = document.implementation.createDocument("","",null);
				this.XML.async = false;
				if(this.XML.load(this.File)) {
					this.OnLoad();
				}
			}catch(err){
				try{
					var xmlhttp = new window.XMLHttpRequest();
					xmlhttp.open("GET", this.File, false);
					xmlhttp.send(null);
					this.XML = xmlhttp.responseXML.documentElement;
					this.OnLoad();
				}catch(err){
					if(display_alerts)
						alert ('An error has ocurred: kernel.functions.XMLFileObject.Load');
				}
			}

		}

	};

	this.Load();

}


/*
 * Jal.Project.Kernel: Pila de efectos 
 */

function Instruction(pId, pDelay, pFunction){
	this.Id = pId;
	this.Function = pFunction;
	this.Delay = pDelay;
}

function fxEvent(pId, pFunction){
	this.Id = pId;
	this.execEvent = pFunction;
}

function Stack_Efects_Manager(){

	this.Instructions = new Array();
	this.InstruciontsOnEnd = new Array();

	this.fps = 20;

	this.isRuning = function(pId){

		for(var i=0; i<this.Instructions.length; i++){
			if(this.Instructions[i].Id.indexOf(pId) == 0){
				return true;
			}
		}

		return false;

	};

	this.freeIntructionsOnEnd = function(pId){
		var aux_InstruciontsOnEnd = new Array();
		for(var i=0;i<this.InstruciontsOnEnd.length; i++){
			if(this.InstruciontsOnEnd[i].Id != pId){
				aux_InstruciontsOnEnd.push(this.InstruciontsOnEnd[i]);
			}
		}
		this.InstruciontsOnEnd = null;
		this.InstruciontsOnEnd = new Array();
		this.InstruciontsOnEnd = aux_InstruciontsOnEnd;
	};

	this.execInstructionOnEnd = function(pId){
		for(var i=0;i<this.InstruciontsOnEnd.length; i++){
			if(this.InstruciontsOnEnd[i].Id == pId){
				this.InstruciontsOnEnd[i].execEvent();
				return;
			}
		}
	};

	this.Run = function(pId){
		var arraylocalInstructions = new Array();
		var bnd = false;
		var firstIndexToDelete = new Number(-1);
		for(var a=0;a<this.Instructions.length;a++){
			if(this.Instructions[a].Id == pId){
				if(bnd == false){
					firstIndexToDelete = a;
					bnd = true;
				}
				arraylocalInstructions.push(this.Instructions[a]);
			}
		}
		this.Instructions.splice(firstIndexToDelete, 1);

		if(arraylocalInstructions.length>0){         
			setTimeout(String(arraylocalInstructions[0].Function), 0);
			setTimeout('run_next(\'' + pId + '\')', arraylocalInstructions[0].Delay);
		}else{
			this.execInstructionOnEnd(pId);
			this.freeIntructionsOnEnd(pId);
		}
	};
}

function run_next(pId){
	EfectsManager.Run(pId);
}

var EfectsManager = new Stack_Efects_Manager();

/*
 * Jal.Project.Kernel: Extend Object
 */

function getCssFromJS(cssAttribute){

	var str = new String(cssAttribute);
	var index = str.indexOf('-');
	var aux_str = new String('');

	if(index > - 1){

		aux_str = str.Left(index);
		aux_str +=  str.charAt(index + 1).toUpperCase();
		aux_str +=  str.Right(str.length - index - 2);

		if(aux_str.indexOf('-') > -1){
			return getCssFromJS(aux_str);
		}

	}else{
		return str;
	}

	return aux_str;

}

function getMaxZindex(){
	var maxz = -1;
	for(var i=0;i<document.getElementsByTagName('div').length;i++){
		var d = document.getElementsByTagName('div')[i];
		if(parseInt(IsNull(d.style.zIndex)) > maxz){
			maxz = parseInt(IsNull(d.style.zIndex));
		}
	}
	return parseInt(IsNull(maxz));
}

var JabsDynamycObjects = new Array();

function jal_element_extend(Elemento){

	Elemento.Extended = true;
	Elemento.ialpha = 100;
	Elemento.iangle = 0;

	if(!Elemento.OnResize){
		Elemento.OnResize = new ArrayList();
	}

	if(!Elemento.OnScrollFunctions){
		Elemento.OnScrollFunctions = new ArrayList();
	}

	if(!Elemento.OnClickFuncions){
		Elemento.OnClickFuncions = new ArrayList();
	}

	if(!Elemento.OnMouseOverFunctions){
		Elemento.OnMouseOverFunctions = new ArrayList();
	}

	if(!Elemento.OnMouseDownFunctions){
		Elemento.OnMouseDownFunctions = new ArrayList();
	}

	if(!Elemento.OnMouseUpFunctions){
		Elemento.OnMouseUpFunctions = new ArrayList();
	}

	if(!Elemento.OnMouseOutFunctions){
		Elemento.OnMouseOutFunctions = new ArrayList();
	}

	if(!Elemento.OnKeyDownFunctions){
		Elemento.OnKeyDownFunctions = new ArrayList();
	}

	if(!Elemento.OnKeyUpFunctions){
		Elemento.OnKeyUpFunctions = new ArrayList();
	}

	if(!Elemento.OnKeyPressFunctions){
		Elemento.OnKeyPressFunctions = new ArrayList();
	}

	if(!Elemento.OnChangeFunctions){
		Elemento.OnChangeFunctions = new ArrayList();
	}

	Elemento.cursor = function(pCursor){
		Elemento.style.cursor = pCursor;    
	};

	Elemento.click = function click(fn) {
	    this.OnClickFuncions.AddObjects(fn);
	};

	Elemento.onclick = function(){
		for(var i=0;i<this.OnClickFuncions.Objects.length;i++){
			this.OnClickFuncions.Objects[i](this);
		}
	};

	Elemento.onscrolling = function(fn){
		Elemento.OnScrollFunctions.AddObjects(fn);
	};

	Elemento.onscroll = function(){
		if(!Elemento.OnScrollFunctions){return}
		for(var i=0;i<Elemento.OnScrollFunctions.Objects.length;i++){
			Elemento.OnScrollFunctions.Objects[i](this);
		}
	};

	Elemento.change = function(){
		Elemento.OnChangeFunctions.AddObjects(fn);
	};

	Elemento.onchange = function(){
		for(var i=0;i<this.OnChangeFunctions.Objects.length;i++){
			this.OnChangeFunctions.Objects[i](this);
		}   
	};

	Elemento.resize = function(){
		for(var i=0;i<this.OnResize.Objects.length;i++){
			this.OnResize.Objects[i](this);
		}
	};

	Elemento.mwheel = function(p){

		var fn = p;

		if((Browser.Engine.Trident() == true) || (Browser.Engine.Presto())){
			Elemento.onmousewheel = function(e){
				fn(this, -window.event.wheelDelta/120);
				return false;
			}
		}

		if(Browser.Engine.Gecko() == true){
			Elemento.addEventListener('DOMMouseScroll', function(e){
				fn(this, e.detail/3);
				if(e.preventDefault)
					e.preventDefault();
				e.returnValue = false;
			}, false);
		}

		if(Browser.Engine.Webkit() == true){
			Elemento.addEventListener('mousewheel', function(e){
				fn(this, -e.wheelDelta/120);
				if(e.preventDefault)
					e.preventDefault();
				e.returnValue = false;
			}, false);
		}

	};

	Elemento.rightclick = function(p){
		var fn = p;
		if(!Browser.Engine.Trident()){      
			Elemento.oncontextmenu = function(e){
				var ev = e;         
				if((ev.which == 3) || (ev.button == 2)){
					fn(this);
					return false;
				}
			};
		}else{
			Elemento.onmousedown = function(e){
				document.oncontextmenu = function(){return false;}
				var ev = e;
				ev = window.event;
				if(ev.button == 2){
					fn(this);
					document.onclick=function(){document.oncontextmenu = function(){return true;}}
					return false;
				}         
			}
		}
	};

	Elemento.mover = function mover(fn){
		Elemento.OnMouseOverFunctions.AddObjects(fn);
	};

	Elemento.onmouseover = function(){
		for(var i=0;i<this.OnMouseOverFunctions.Objects.length;i++){
			this.OnMouseOverFunctions.Objects[i](this);
		}
	};

	Elemento.mdown = function(fn){
		Elemento.OnMouseDownFunctions.AddObjects(fn);
	};

	Elemento.onmousedown = function(){
		for(var i=0;i<this.OnMouseDownFunctions.Objects.length;i++){
			this.OnMouseDownFunctions.Objects[i](this);
		}
	};

	Elemento.mup = function(fn){
		Elemento.OnMouseUpFunctions.AddObjects(fn);
	};

	Elemento.onmouseup = function(){
		for(var i=0;i<this.OnMouseUpFunctions.Objects.length;i++){
			this.OnMouseUpFunctions.Objects[i](this);
		}
	};

	Elemento.mout = function mout(fn){
		Elemento.OnMouseOutFunctions.AddObjects(fn);
	};

	Elemento.onmouseout = function(){
		for(var i=0;i<this.OnMouseOutFunctions.Objects.length;i++){
			this.OnMouseOutFunctions.Objects[i](this);
		}
	};

	Elemento.keydown = function keydown(fn){
		Elemento.OnKeyDownFunctions.AddObjects(fn);
	};

	Elemento.onkeydown = function(pEvent){
		for(var i=0;i<this.OnKeyDownFunctions.Objects.length;i++){
			this.OnKeyDownFunctions.Objects[i](pEvent);
		}
	};

	Elemento.keyup = function keyup(fn){
		Elemento.OnKeyUpFunctions.AddObjects(fn);
	};

	Elemento.onkeyup = function(pEvent){
		for(var i=0;i<this.OnKeyUpFunctions.Objects.length;i++){
			this.OnKeyUpFunctions.Objects[i](pEvent);
		}
	};

	Elemento.keypress = function keypress(fn){
		Elemento.OnKeyPressFunctions.AddObjects(fn);
	};

	Elemento.onkeypress = function(pEvent){
		for(var i=0;i<this.OnKeyPressFunctions.Objects.length;i++){
			this.OnKeyPressFunctions.Objects[i](pEvent);
		}
	};

	Elemento.html = function(p){
		this.innerHTML = p;
	};

	Elemento.ghtml = function(p){
		return this.innerHTML;
	};

	Elemento.raise = function(){
		var z = parseInt(IsNull(Elemento.style.zIndex)) + 1;
		Elemento.style.zIndex = z;
	};

	Elemento.raiseTop = function(){
		Elemento.style.zIndex = getMaxZindex() + 1;
	};

	Elemento.lower = function(){
		var z = parseInt(IsNull(Elemento.style.zIndex)) - 1;
		if(z<0){z=1;}
		Elemento.style.zIndex = z;
	};

	Elemento.lowerBottom = function(){
		Elemento.style.zIndex = 1;
	};

	Elemento.css = function(pAttributo, pValue){
		eval('Elemento.style.' + getCssFromJS(pAttributo) + ' = \'' + pValue + '\';');
		if(pAttributo=='left'){Elemento.iLeft = parseInt(pValue);}
		if(pAttributo=='top'){Elemento.iTop = parseInt(pValue);}
		if(pAttributo=='width'){Elemento.iWidth = parseInt(pValue);}
		if(pAttributo=='height'){Elemento.iHeight = parseInt(pValue);}
	};

	Elemento.cssClass = function(pClassName){
		if(Browser.Engine.Trident()){
			if((Browser.IE8()) || (Browser.IE9())){
				Elemento.className = pClassName;
			}else{
				//Elemento.setAttribute('class', pClassName);
				Elemento.className = pClassName;
			}
		}else{
			Elemento.className = pClassName;
		}
	};

	Elemento.Visible = function(){
		if(this.style.display != 'none'){
			return true;
		}
		return false;
	};

	Elemento.display = function(){
		this.style.display = '';
	};

	Elemento.hide = function(){
		this.style.display = 'none';
	};

	Elemento.alpha = function(pOpacity){
		var ffo = parseInt(pOpacity) / 100;
		var ie_fx1 = "alpha(opacity=" + pOpacity + ")";
		var ie_fx2 = "progid:DXImageTransform.Microsoft.Alpha(Opacity=" + pOpacity + ")";
		Elemento.ialpha = pOpacity;
		if(Browser.Engine.Trident()){
			Elemento.style.filter = ie_fx2;		//for internet explorer 8.
			Elemento.style.filter = ie_fx1;		//for internet explorer 6, 7.
			Elemento.style.zoom = 1; 		      //for internet explorer 6, 7.
		}else{
			Elemento.style.opacity = ffo;
		}
	};

	Elemento.childs = function(pTagName){
		pTagName = pTagName.toUpperCase();
		//if(!Browser.Engine.Trident()){
			var i;
			var return_array = new Array();
			var me = this;
			for(i=0;i<me.childNodes.length;i++){
				if(me.childNodes[i].tagName == pTagName){
					return_array.push(go(me.childNodes[i]));
				}
			}
			return return_array;
		/*}else{
			return this.childNodes;
		}*/
	};

	Elemento.actions = function (pEvent, pFunction){
		if(Browser.Engine.Trident()){
			this[pEvent] = new Function(pFunction);
		}
		if(Browser.Engine.Presto()){
			this[pEvent] = new Function(pFunction);
		}
		if(Browser.Engine.Gecko()){
			this.setAttribute(pEvent, pFunction);
		}
	};

	Elemento.newimg = function(id, psrc){
		if(!document.getElementById(id)){
			var i = document.createElement('img');
			i.id = id;
			if(psrc){i.src = psrc;}
			Elemento.appendChild(i);
			JabsDynamycObjects.push(i);
		}
		return go(id);
	};

	Elemento.newdiv = function(id, l, t, w, h, zIndex){
		if(!document.getElementById(id)){
			var d = document.createElement('div');
			d.id = id;
			if(l){d.style.left = l + 'px';}
			if(t){d.style.top = t + 'px';}
			if(w){d.style.width =  w + 'px';}
			if(h){d.style.height = h + 'px';}
			if(zIndex){d.style.zIndex = zIndex;}
			Elemento.appendChild(d);
			JabsDynamycObjects.push(d);
		}
		return go(id);
	};

	Elemento.del = function(pId){
		if(document.getElementById(pId)){
			Elemento.removeChild(document.getElementById(pId));
			var auxArr = new Array();
			for(var i=0;i<JabsDynamycObjects.length;i++){
				if(JabsDynamycObjects[i].id != pId){
					auxArr.push(JabsDynamycObjects[i]);
				}
			}
			JabsDynamycObjects = null;
			JabsDynamycObjects = new Array();
			JabsDynamycObjects = auxArr;
		}
	};

	Elemento.rx = function(){
		return getRX(this);
	};

	Elemento.ry = function(){
		return getRY(this);
	};

	Elemento.enableselection = function(){
		this.onmousedown = new Function("return true");
		this.onselectstart = new Function ("return true");
	};

	Elemento.disableselection = function(){
		this.onmousedown = new Function("return false");
		this.onselectstart = new Function ("return false");
	};

	Elemento.fadein = function(pDelay, to, pFunctionOnEnd){
		var topAlpha = to; 							//valor al que quiero llegar.
		var fps = EfectsManager.fps;				//cantidad de frames por segundo
		var steps = pDelay / fps;					//cantidad de ejecuciones para terminar el efecto.
		var addvalue = topAlpha/steps;				//incremento cada vez que se ejecuta la instruccion
		var callTime = (pDelay / (fps *topAlpha));	//tiempo entre ejecuciones.

		var fxTypeId = Elemento.id + '_fade';
		var fxId = fxTypeId + Date();

		if(EfectsManager.isRuning(fxTypeId)){return;}

		if(go(Elemento.id).ialpha == 100){
			go(Elemento.id).alpha(0);
		}
		for(var i=0;i<steps;i++){
			var f = new String('go(\''+Elemento.id+'\').alpha(go(\''+Elemento.id+'\').ialpha+=IsNull('+addvalue+'))');
			var Step = new Instruction(fxId, callTime, f);
			EfectsManager.Instructions.push(Step);
		}

		if(pFunctionOnEnd){
			var fxEventAux = new fxEvent(fxId, pFunctionOnEnd);
			EfectsManager.InstruciontsOnEnd.push(fxEventAux);
		}

		EfectsManager.Run(fxId);
	};

	Elemento.fadeout = function(pDelay, to, pFunction){
		var topAlpha = (-1)*to + 100; 					//valor al que quiero llegar.
		var fps = EfectsManager.fps;				//cantidad de frames por segundo
		var steps = pDelay / fps;					//cantidad de ejecuciones para terminar el efecto.
		var addvalue = topAlpha/steps;				//incremento cada vez que se ejecuta la instruccion
		var callTime = (pDelay / (fps *topAlpha));	//tiempo entre ejecuciones.

		var fxTypeId = Elemento.id + '_fade';
		var fxId = fxTypeId + Date();

		if(EfectsManager.isRuning(fxTypeId)){return;}

		go(Elemento.id).alpha(100);
		for(var i=0;i<steps;i++){
			var f = new String('go(\''+Elemento.id+'\').alpha(go(\''+Elemento.id+'\').ialpha-=IsNull('+addvalue+'))');
			var Step = new Instruction(fxId, callTime, f);
			EfectsManager.Instructions.push(Step);
		}

		if(pFunction){
			var fxEventAux = new fxEvent(fxId, pFunction);
			EfectsManager.InstruciontsOnEnd.push(fxEventAux);
		}

		EfectsManager.Run(fxId);
	};

	Elemento.iLeft = new Number(0);
	Elemento.iTop = new Number(0);
	Elemento.iWidth = new Number(0);
	Elemento.iHeight = new Number(0);

	Elemento.Configure = function(){
	
		try{
		
			if(IsNumeric(parseInt(Elemento.style.left))){
				Elemento.iLeft = parseInt(Elemento.style.left); 
			}else if(IsNumeric(parseInt(Elemento.offsetLeft))){
				Elemento.iLeft = parseInt(Elemento.offsetLeft);
			}else{
				Elemento.iLeft = 0;
			}

			if(IsNumeric(parseInt(Elemento.style.top))){
				Elemento.iTop = parseInt(Elemento.style.top); 
			}else if(IsNumeric(parseInt(Elemento.offsetTop))){
				Elemento.iTop = parseInt(Elemento.offsetTop);
			}else{
				Elemento.iTop = 0;
			}

			if(IsNumeric(parseInt(Elemento.style.width))){
				Elemento.iWidth = parseInt(Elemento.style.width); 
			}else if(IsNumeric(parseInt(Elemento.clientWidth))){
				Elemento.iWidth = parseInt(Elemento.clientWidth);
			}else if(IsNumeric(parseInt(Elemento.offsetWidth))){
				Elemento.iWidth = parseInt(Elemento.offsetWidth);
			}

			if(IsNumeric(parseInt(Elemento.style.height))){
				Elemento.iHeight = parseInt(Elemento.style.height); 
			}else if(IsNumeric(parseInt(Elemento.clientHeight))){
				Elemento.iHeight = parseInt(Elemento.clientHeight);
			}else if(IsNumeric(parseInt(Elemento.offsetHeight))){
				Elemento.iHeight = parseInt(Elemento.offsetHeight);
			}
		
		}catch(e){
			return;
		}
		
	};

	Elemento.setX = function(px){
		try{
		
			px = parseInt(px);
			Elemento.iLeft = px;
			Elemento.style.left = px + 'px';
			
		}catch(e){
			if(display_alerts == true){
				alert('Elemento.setX >> ' + e.message);
			}
		}
		
	};

	Elemento.setY = function(py){
		try{
			py = parseInt(py);
			Elemento.iTop = py;
			Elemento.style.top = py + 'px';	
		}catch(e){
			if(display_alerts == true){
				alert('Elemento('+Elemento.id+').setY >> ' + e.message);
			}
		}
	};

	Elemento.setW = function(pw){
		pw = parseInt(pw);
		if(IsNumeric(pw) == false){return;}
		if(parseInt(pw) < 1){return;}
		Elemento.iWidth = pw;
		Elemento.style.width = pw + 'px';
		if(Elemento.OnResize.Objects.length>0){
			Elemento.resize();
		}
	};

	Elemento.setH = function(ph){
		ph = parseInt(ph);
		if(IsNumeric(ph) == false){return;}
		if(parseInt(ph) < 1){return;}
		Elemento.iHeight = ph;
		Elemento.style.height = ph + 'px';
		if(Elemento.OnResize.Objects.length>0){
			Elemento.resize();
		}
	};

	Elemento.move = function(pDelay, pMoveDirection, pLength, pFunction){

		var to = 0; //posicion final del movimiento.
		var from = 0;

		var fps = EfectsManager.fps;			     //cantidad de frames por segundo
		var steps = pDelay / fps;				 	 //cantidad de ejecuciones para terminar el efecto.
		var addvalue = pLength/steps;				 //incremento cada vez que se ejecuta la instruccion
		var callTime = (pDelay / (pLength*fps));	 //tiempo entre ejecuciones.

		if(parseInt(addvalue)<1){
			addvalue=1;
			steps = pLength;
			callTime = pDelay / pLength;
		}

		var fxTypeId = Elemento.id + '_move_';
		var fxId = fxTypeId + pMoveDirection + Date();


		if(EfectsManager.isRuning(fxTypeId)){return;}

		switch (pMoveDirection){
		case 'left':
			to = parseInt(Elemento.iLeft) - parseInt(pLength);
			from = Elemento.iLeft;
			break;
		case 'top':
			to = parseInt(Elemento.iTop) - parseInt(pLength);
			from = Elemento.iTop;
			break;
		case 'right':
			to = parseInt(Elemento.iLeft) + parseInt(pLength);
			from = Elemento.iLeft;
			break;
		case 'bottom':
			to = parseInt(Elemento.iTop) + parseInt(pLength);
			from = Elemento.iTop;
			break;
		}

		for(var i=0;i<steps;i++){

			var f = new String('');

			if(pMoveDirection == 'left'){
				from-=addvalue;
				f = 'go(\''+Elemento.id+'\').setX(' + from + ');';
			}

			if(pMoveDirection == 'right'){
				from+=parseInt(addvalue);
				f = 'go(\''+Elemento.id+'\').setX(\'' + from + '\');';
			}

			if(pMoveDirection == 'top'){
				from-=addvalue;
				f = 'go(\''+Elemento.id+'\').setY(' + from + ');';
			}

			if(pMoveDirection == 'bottom'){
				from+=addvalue;
				f = 'go(\''+Elemento.id+'\').setY(' + from + ');';
			}

			var Step = new Instruction(fxId, callTime, f);
			EfectsManager.Instructions.push(Step);
		}

		var faux;

		if(pMoveDirection == 'top'){
			faux = 'go(\''+Elemento.id+'\').setY(' + to + ');';
		}

		if(pMoveDirection == 'bottom'){
			faux = 'go(\''+Elemento.id+'\').setY(' + to + ');';
		}

		if(pMoveDirection == 'left'){
			faux = 'go(\''+Elemento.id+'\').setX(' + to + ');';
		}

		if(pMoveDirection == 'right'){
			faux = 'go(\''+Elemento.id+'\').setX(' + to + ');';
		}

		var StepAux = new Instruction(fxId, callTime, String(faux));
		EfectsManager.Instructions.push(StepAux);

		if(pFunction){
			var fxEventAux = new fxEvent(fxId, pFunction);
			EfectsManager.InstruciontsOnEnd.push(fxEventAux);
		}

		EfectsManager.Run(fxId);

	};

	Elemento.show = function(pDelay, pMode, pFunctionOnEnd){
		/*
		switch(pMode){
			case 'left->right':
				break;
			case 'right->left':
				break;
			case 'right|top->left|bottom':
				break;
			case 'center->expand':
				break;
		}
		 */

		/*
		 * la idea para este efecto es ir incrementando la figura desde la hipotenusa que componen los
		 * dos triangulos que forman el rectangulo que se quiere mostrar.
		 * en este caso "addvalue" sera el modulo de la hipotenusa. es decir que el length de la animacion
		 * sera el modulo de la hipotenusa calculado antes de comensar el efecto tomando como lados el width y el height de la figura.
		 */

		var pLength = Math.pow(Math.pow(IsNull(Elemento.iWidth), 2) + Math.pow(IsNull(Elemento.iHeight), 2), 0.5); //calculo del modulo de la hipotenusa.
		var Angle = Math.atan(IsNull(Elemento.iWidth/IsNull(Elemento.iHeight)));
		var fps = EfectsManager.fps;			     								//cantidad de frames por segundo
		var steps = pDelay / fps;				 	 								    //cantidad de ejecuciones para terminar el efecto.
		var addvalue = pLength/steps;				 								  //incremento cada vez que se ejecuta la instruccion
		var callTime = (pDelay / (pLength*fps));	 						//tiempo entre ejecuciones.
		var currentHipotenusa = Math.pow(2, 0.5);
		var currentX = Elemento.iLeft;
		var currentY = Elemento.iTop;
		var currentHeight = 1;
		var currentWidth = 1;
		var endX;
		var endY;
		var endW;
		var endH;

		var limite_anchura = Elemento.iLeft + Elemento.iWidth;
		var limite_altura = Elemento.iTop + Elemento.iHeight;

		var fxTypeId = Elemento.id + '_show_' + pMode;
		var fxId = fxTypeId + Date();

		if(EfectsManager.isRuning(fxTypeId)){return;}

		if(pMode == 'left|top->right|bottom'){
			go(Elemento.id).setW(currentWidth);
			go(Elemento.id).setH(currentHeight);
		}
		
		if(pMode == 'center->expand'){
			go(Elemento.id).setW(currentWidth);
			go(Elemento.id).setH(currentHeight);
		}

		if(pMode == 'right|bottom->top|left'){
			endX = Elemento.iLeft;
			endY = Elemento.iTop;
			endW = Elemento.iWidth;
			endH = Elemento.iHeight;
			currentX = IsNull(currentX) + IsNull(Elemento.iWidth);
			currentY = IsNull(currentY) + IsNull(Elemento.iHeight);
			go(Elemento.id).setX(currentX);
			go(Elemento.id).setY(currentY);
			go(Elemento.id).setW(currentWidth);
			go(Elemento.id).setH(currentHeight);
		}

		if(pMode == 'left|bottom->top|right'){
			endX = Elemento.iLeft;
			endY = Elemento.iTop;
			endW = Elemento.iWidth;
			endH = Elemento.iHeight;
			currentX = IsNull(currentX);
			currentY = IsNull(currentY) + IsNull(Elemento.iHeight);
			go(Elemento.id).setX(currentX);
			go(Elemento.id).setY(currentY);
			go(Elemento.id).setW(currentWidth);
			go(Elemento.id).setH(currentHeight);
		}

		if(pMode == 'top->bottom'){
			addvalue = Elemento.iHeight / steps;
			endX = Elemento.iLeft;
			endY = Elemento.iTop;
			endW = Elemento.iWidth;
			endH = Elemento.iHeight;
			currentX = IsNull(currentX);
			currentY = IsNull(currentY);
			currentHeight = 1;
			currentWidth = endW;
			go(Elemento.id).setX(currentX);
			go(Elemento.id).setY(currentY);
			go(Elemento.id).setW(currentWidth);
			go(Elemento.id).setH(currentHeight);
		}

		if(pMode == 'left->right'){
			addvalue = Elemento.iWidth / steps;
			endX = Elemento.iLeft;
			endY = Elemento.iTop;
			endW = Elemento.iWidth;
			endH = Elemento.iHeight;
			currentX = IsNull(currentX);
			currentY = IsNull(currentY);
			currentHeight = endH;
			currentWidth = 1;
			go(Elemento.id).setX(currentX);
			go(Elemento.id).setY(currentY);
			go(Elemento.id).setW(currentWidth);
			go(Elemento.id).setH(currentHeight);
		}

		if(pMode == 'bottom->top'){
			addvalue = Elemento.iHeight / steps;
			endX = Elemento.iLeft;
			endY = Elemento.iTop;
			endW = Elemento.iWidth;
			endH = Elemento.iHeight;
			currentX = IsNull(currentX);
			currentY = IsNull(currentY) + IsNull(Elemento.iHeight);
			currentHeight = 1;
			currentWidth = endW;
			go(Elemento.id).setX(currentX);
			go(Elemento.id).setY(currentY);
			go(Elemento.id).setW(currentWidth);
			go(Elemento.id).setH(currentHeight);
		}

		go(Elemento.id).css('overflow','hidden');

		for(var i=0;i<steps;i++){

			var f = new String('');

			if(pMode == 'left|top->right|bottom'){
				currentHipotenusa += addvalue;
				currentHeight = currentHipotenusa * Math.cos(Angle);
				currentWidth = currentHipotenusa * Math.sin(Angle);
				f = 'go(\''+Elemento.id+'\').setW(' + parseInt(currentWidth) + ');go(\''+Elemento.id+'\').setH(' + parseInt(currentHeight) + ');';
			}
			
			if(pMode == 'center->expand'){
				currentHipotenusa += addvalue;
				currentHeight = currentHipotenusa * Math.cos(Angle);
				currentWidth = currentHipotenusa * Math.sin(Angle);
				f = 'go(\''+Elemento.id+'\').setW(' + parseInt(currentWidth) + ');go(\''+Elemento.id+'\').setH(' + parseInt(currentHeight) + ');go(\''+Elemento.id+'\').center()';
			}

			if(pMode == 'right|bottom->top|left'){
				currentHipotenusa += addvalue;
				currentHeight = Math.round(currentHipotenusa * Math.cos(Angle));
				currentWidth = Math.round(currentHipotenusa * Math.sin(Angle));
				currentX = limite_anchura - currentWidth;
				currentY = limite_altura - currentHeight;

				f = 'go(\''+Elemento.id+'\').setX(' + parseInt(currentX) + ');go(\''+Elemento.id+'\').setY(' + parseInt(currentY) + ');go(\''+Elemento.id+'\').setW(' + parseInt(currentWidth) + ');go(\''+Elemento.id+'\').setH(' + parseInt(currentHeight) + ');';	
			}

			if(pMode == 'left|bottom->top|right'){
				currentHipotenusa += addvalue;
				currentHeight = Math.round(currentHipotenusa * Math.cos(Angle));
				currentWidth = Math.round(currentHipotenusa * Math.sin(Angle));
				currentY = limite_altura - currentHeight;

				f = 'go(\''+Elemento.id+'\').setY(' + parseInt(currentY) + ');go(\''+Elemento.id+'\').setW(' + parseInt(currentWidth) + ');go(\''+Elemento.id+'\').setH(' + parseInt(currentHeight) + ');';	
			}

			if(pMode == 'top->bottom'){
				currentHeight += addvalue;
				f = 'go(\''+Elemento.id+'\').setH(' + parseInt(currentHeight) + ');';	
			}

			if(pMode == 'left->right'){
				currentWidth += addvalue;
				f = 'go(\''+Elemento.id+'\').setW(' + parseInt(currentWidth) + ');';	
			}

			if(pMode == 'bottom->top'){
				currentHeight += addvalue;
				currentY = limite_altura - currentHeight;
				f = 'go(\''+Elemento.id+'\').setY(' + parseInt(currentY) + ');go(\''+Elemento.id+'\').setH(' + parseInt(currentHeight) + ');';	
			}

			var Step = new Instruction(fxId, callTime, f);
			EfectsManager.Instructions.push(Step);
		}

		//Corregimos las coordenadas finales.		
		var fix = 'go(\''+Elemento.id+'\').setX(' + parseInt(endX) + ');go(\''+Elemento.id+'\').setY(' + parseInt(endY) + ');go(\''+Elemento.id+'\').setW(' + parseInt(endW) + ');go(\''+Elemento.id+'\').setH(' + parseInt(endH) + ');';
		var StepFix = new Instruction(fxId, callTime, fix);
		EfectsManager.Instructions.push(StepFix);
		
		if(pFunctionOnEnd){
			var fxEventAux = new fxEvent(fxId, pFunctionOnEnd);
			EfectsManager.InstruciontsOnEnd.push(fxEventAux);
		}

		EfectsManager.Run(fxId);

	};

	Elemento.center = function(){
		Elemento.setX((Screen.Width/2) - (Elemento.iWidth/2));
		Elemento.setY((Screen.Height/2) - (Elemento.iHeight/2));
	};

	Elemento.centery = function(){
		Elemento.setY((Screen.Height/2) - (Elemento.iHeight/2));
	};

	Elemento.centerx = function(){
		Elemento.setX((Screen.Width/2) - (Elemento.iWidth/2));
	};

	Elemento.roundedCorner = function(pRad){

		if(Browser.Engine.Gecko()){
			//Elemento.style['-moz-background-clip'] = 'padding';
			Elemento.style['background-clip'] = 'padding-box';
			//Elemento.style['-moz-border-radius'] = pRad + 'px';
			this.style.MozBorderRadius = '6px';
		}

		if(Browser.Engine.Webkit()){
			Elemento.style['-webkit-border-radius'] = pRad + 'px';
		}

		if(Browser.Engine.Presto()){
			Elemento.style['borderRadius'] = pRad + 'px';
		}

		if(Browser.Engine.Trident()){
			Elemento.style['border-radius'] = pRad + 'px';
		}

	};
	

	Elemento.scale = function(pDelay, pw, ph){
		alert('proximamente...');
	};

	Elemento.rotation = function(pAngle){

		if(Browser.Engine.Trident()){
			var deg2radians = Math.PI * 2 / 360;
			var rad = pAngle * deg2radians ;
			var costheta = Math.cos(rad);
			var sintheta = Math.sin(rad);
			Elemento.style.filter = "progid:DXImageTransform.Microsoft.Matrix(sizingMethod='auto expand', M11=" + costheta + ", M12=-" + sintheta + ", M21=" + sintheta + ", M22=" + costheta + ")";
		}

		if(Browser.Engine.Gecko()){
			Elemento.style['MozTransform'] = 'rotate(' + pAngle + 'deg)';
		}

		if(Browser.Engine.Presto()){
			Elemento.style['OTransform'] = 'rotate(' + pAngle + 'deg)';
		}

		if(Browser.Engine.Webkit()){
			Elemento.style['-webkit-transform'] = 'rotate(' + pAngle + 'deg)';
		}

		Elemento.iangle = pAngle;

	};

	Elemento.rotate = function(pDelay, pAngle, pFunctionOnEnd){

		var to = 0;
		var from = 0;

		var fps = EfectsManager.fps;
		var steps = pDelay / fps;
		var addvalue = Math.ceil((pAngle - Elemento.iangle)/steps);
		var callTime = Math.ceil(pDelay / steps);

		if(parseInt(addvalue)<1){
			addvalue=1;
			steps = pAngle;
			callTime = pDelay / pAngle;
		}

		var fxTypeId = Elemento.id + '_rotate_';
		var fxId = fxTypeId + Date();


		if(EfectsManager.isRuning(fxTypeId)){return;}

		to = pAngle;
		from = Elemento.iangle;

		for(var i=0;i<steps;i++){

			var f = new String('');

			from += parseInt(addvalue);
			if(parseInt(from) > parseInt(to)){break;}
			f = 'go(\''+Elemento.id+'\').rotation(' + from + ');';

			var Step = new Instruction(fxId, callTime, f);
			EfectsManager.Instructions.push(Step);
		}

		var faux;

		faux = 'go(\''+Elemento.id+'\').rotation(' + pAngle + ');';

		var StepAux = new Instruction(fxId, callTime, faux);
		EfectsManager.Instructions.push(StepAux);

		if(pFunctionOnEnd){
			var fxEventAux = new fxEvent(fxId, pFunctionOnEnd);
			EfectsManager.InstruciontsOnEnd.push(fxEventAux);
		}

		EfectsManager.Run(fxId);

	};

}

function getRX(obj){

	try{
		var rectCollection = obj.getClientRects();
		
		return parseInt(Math.round(rectCollection[0].left));
		
	}catch(e){
	
		var curleft = 0;

		if(obj.offsetParent){
			while(1){
				curleft += obj.offsetLeft;
				if(!obj.offsetParent)
					break;
				obj = obj.offsetParent;
			}
		}else if(obj.x){
			curleft += obj.x;
		}

		return curleft;
	
	}
	
	/*
		if(obj.parentNode){
			cordx = IsNull(getRX(obj.parentNode));
		}

		if(obj.tagName == 'DIV'){
			return cordx + IsNull(obj.offsetLeft);
		}else{
			return cordx;
		}
	*/

}

function getRY(obj){

	try{
		var rectCollection = obj.getClientRects();
		return rectCollection[0].top;
	}catch(e){
		var curtop = 0;

		if(obj.offsetParent){
			while(1){
				curtop += obj.offsetTop;
				if(!obj.offsetParent)
					break;
				obj = obj.offsetParent;
			}
		}else if(obj.y){
			curtop += obj.y;
		}

		return curtop;
	}
/*
	if(obj.parentNode){
		cordy = IsNull(getRY(obj.parentNode));
	}

	if(obj.tagName == 'DIV'){
		return cordy + IsNull(obj.offsetTop);
	}else{
		return cordy;
	}
	*/
}

function jal_init_html_elements(){

	return;
	
	/*
	 * este codigo es obsoleto. Antes inicializabamos todos los elementos sin importar si estos serian utilizados o no.
	 * ahora cada vez que queremos utilizar un elemento extendido go(element|element.id);
	 */

	var Tags = new Array();
	var x = 0;
	var Elementos = new Array();
	Tags.push('div');Tags.push('span');Tags.push('ul');Tags.push('li');Tags.push('table');Tags.push('tr');Tags.push('td');Tags.push('a');
	Tags.push('tbody');Tags.push('body');Tags.push('html');
	for(x=0;x<Tags.length;x++){
		Elementos = document.getElementsByTagName(Tags[x]);
		for(var i=0;i<Elementos.length;i++){
			jal_element_extend(Elementos[i]);
		}
	}
}

/*
 * Jal.Project.kernel : go -> extend for document.getElementById  
 */

function IsTag(pStr){

	if((pStr.indexOf('[') >= 0) || (pStr.indexOf(']') >= 0)){
		return false;
	}

	if((pStr.indexOf('(') >= 0) || (pStr.indexOf(')') >= 0)){
		return false;
	}
	
	if(pStr.indexOf('->') >= 0){
		return false;
	}

	var tagList = new Array('body','document','table','tr','td','div','span','a','iframe','ul','li');
	
	for(var i=0; i<tagList.length; i++){
		if(tagList[i].toLowerCase() == pStr.toLowerCase()){
			return true;
		}
	}

	return false;
	
}

function IsQuery(pStr){

	if((pStr.indexOf('[') >= 0) || (pStr.indexOf(']') >= 0)){
		return true;
	}

	if((pStr.indexOf('(') >= 0) || (pStr.indexOf(')') >= 0)){
		return true;
	}
	
	if((pStr.indexOf('{') >= 0) || (pStr.indexOf('}') >= 0)){
		return true;
	}
	
	if(pStr.indexOf('->') >= 0){
		return true;
	}
	
	if(IsTag(pStr) == true){
		return true;
	}
	
	return false;
	
}

function QueryObject(pStr, pParent){

	this.strCommand = pStr;
	this.ParentObject = pParent;
	this.Object;
	
	this.Init = function(){
		
		if(this.ParentObject == undefined){
			this.ParentObject = go(document);
		}
	
		if(IsTag(this.strCommand) == true){
			this.Object = this.ParentObject.getElementsByTagName(this.strCommand);
		}
		
		if(IsTagByAttribute(this.strCommand) == true){
		
			var search_atributo = getAttributeByQueryByTagAttribute(this.strCommand);
			var search_tag = getTagByQueryByTagAttribute(this.strCommand);
			var search_value = getValueByQueryByTagAttribute(this.strCommand);
			
			var arrObjs = this.ParentObject.getElementsByTagName(search_tag);
			var return_array = new Array();
			
			for(var i=0; i<arrObjs.length; i++){
				if(arrObjs[i].getAttribute(search_atributo) == search_value){
					return_array.push(arrObjs[i]);
				}
			}
			
			this.Object = return_array;
			
		}
		
		if(IsTagById(this.strCommand) == true){
			this.Object = go(getIdFromTagQuery(this.strCommand));
		}
		
		if(IsTagByIndex(this.strCommand) == true){
			this.Object = go(this.ParentObject.childs(getTagByQueryByTagIndex(this.strCommand))[getIndexByQueryByTagIndex(this.strCommand)]);
		}
	
	}
	
	this.Init();

}

function IsTagById(pStr){

	if((pStr.indexOf('[') >= 0) && (pStr.indexOf(']') >= 0)){
		return true;
	}
	
	return false;
}

function IsTagByAttribute(pStr){

	if((pStr.indexOf('{') >= 0) && (pStr.indexOf('}') >= 0)){
		return true;
	}
	
	return false;
}

function IsTagByIndex(pStr){

	if((pStr.indexOf('(') >= 0) && (pStr.indexOf(')') >= 0)){
		return true;
	}
	
	return false;
}

function getIdFromTagQuery(pStr){
	return pStr.substr(indexOf('['), pStr.indexOf(']') - pStr.indexOf('['));
}

function getTagByQueryByTagIndex(pStr){
	//go('tr(1)') en este caso debe devolver 'tr'
	return pStr.Left(pStr.indexOf('('));
}

function getIndexByQueryByTagIndex(){
	return pStr.substr(indexOf('('), pStr.indexOf(')') - pStr.indexOf('('));
}

function getTagByQueryByTagAttribute(pStr){
	return pStr.Left(pStr.indexOf('{'));
}

function getAttributeByQueryByTagAttribute(pStr){
	return pStr.substr(Sum([pStr.indexOf('{'), 1]), pStr.indexOf('}') - pStr.indexOf('{') - 1);
}

/*function getValueByQueryByTagAttribute(pStr){
	return pStr.substr(Sum([pStr.indexOf('}{'), 2]), pStr.Right(Sum([pStr.indexOf('}{'), 2])).indexOf('}'));
}*/
function getValueByQueryByTagAttribute(pStr){
	var aux = pStr.Right(Sum([pStr.length, (-1)*pStr.indexOf('}{'), -2]));
	return aux.Left(aux.length-1);
}

function GetObjectsByQuery(pQuery){
	var arrStrObjetos = new Array();		//Contiene las partes que componen el query tomando como separador la secuencia '->'
	var arrObjetos = new Array();			//Contiene los objetos que forman parte de las diferentes fases del query.
	var current_parent = undefined;

	arrStrObjetos = pQuery.split('->');
	
	for(var i=0; i<arrStrObjetos.length; i++){

		if(i>1){
			current_parent = arrObjetos[i-1];
		}

		var qryObject = new QueryObject(arrStrObjetos[i], current_parent);
		
		arrObjetos.push(qryObject.Object); //En cada posicion del array voy a tener una clase con las diferentes partes del query.

	}

	//de esta forma cuando recorro todas las partes del query en la ultima pocicion del array tengo el resultado del query.
	if(arrObjetos.length > 0){
		return arrObjetos[arrObjetos.length-1];
	}

	return false;
}
 
function go(pId){

	/*
	implementacion para que 'go' pueda soportar la busqueda de objetos similar a como lo hace jquery.
	go('table[tblGrid]->tr') 			- devuelve todos las filas de la tabla con id tblGrid.
	go('table[tblGrid]->tr(5)') 		- devuelve todos la fila cinco de la tabla con id tblGrid.
	go('table[tblGrid]->tr(5)->td') 	- devuelve las columnas de la fila cinco de la tabla con id tblGrid.
	go('div{type}{slideshow}')			- devuelve todos los div con el atributo type igual a slideshow.
	-> 									- seria como el separador de elementos. podriamos decir que a la izquierda de este simbolo tenemos el padre y a la derecha el hijo.
	() 									- indica un elemento de un array.
	*/

	if(typeof pId == 'object'){
		if(!pId.Extended){
			jal_element_extend(pId);
		}
		pId.Configure();
		return pId;
	}

	if(typeof pId == 'string'){
	
		if(IsQuery(pId) == true){
			return GetObjectsByQuery(pId);
		}else{
			if(document.getElementById(pId)){
				if(!document.getElementById(pId).Extended){
					jal_element_extend(document.getElementById(pId));
				}
				document.getElementById(pId).Configure();
				return document.getElementById(pId);
			}else{
				for(var i=0;i<JabsDynamycObjects.length;i++){
					if(JabsDynamycObjects[i].id == pId){
						return JabsDynamycObjects[i];
					}
				}
			}
		}

	}

	return false;

}

function get(pTagName){

	return go(pTagName);

	/*
	if(document.getElementsByTagName(pTagName)){
		return document.getElementsByTagName(pTagName);
	}

	return false;
	*/
}

function gotourl(purl){
	window.location = purl;
}

var RunOnLoad = new Array();
var RunOnResize = new Array();
var RunOnUnload = new Array();

function jalPage(){

	this.OnLoad = function(p){
		RunOnLoad.push(p);
	};

	this.OnResize = function(p){
		RunOnResize.push(p);
	};

	this.OnUnload = function(p){
		RunOnUnload.push(p);
	};
	
	this.AddStyleSheet = function(pFile){
		var fileref=document.createElement("link")
		fileref.setAttribute("rel", "stylesheet")
		fileref.setAttribute("type", "text/css")
		fileref.setAttribute("href", pFile)
		document.getElementsByTagName("head")[0].appendChild(fileref)
	};

	this.QuitStyleSheet = function(pFile){
		var links = get('link');
		for(var i=0;i<links.length;i++){
			if(links[i].getAttribute('href') == pFile){
				links[i].parentNode.removeChild(links[i]);
			}
		}
	};

	this.AddClass = function(pName, pCss){

		if(Browser.Engine.Trident()){
			var newClass = document.createStyleSheet();
			newStyle.setAttribute('id', pName);
			newStyle.addRule(pName, pCss);
		}else{
			var txtcss;
			var newStyle = document.createElement('style');
			newStyle.type = 'text/css';
			newStyle.setAttribute('id', pName);
			txtcss = document.createTextNode(pName + '{' + pCss + '}');
			newStyle.appendChild(txtcss);
			document.body.appendChild(newStyle);
		}

	};

	this.QuitClass = function(pId){
		var remove = go(pId);//Recordar que si en el momento en que agregamos la clase con el metodo AddClass la llamamos .myclassname, cuando llamamos a esta funcion el id debe ser '.myclassname'
		remove.parentNode.removeChild(remove);
	};

}

var Page = new jalPage();

function execute_functions_onload(){

	if(Browser.Engine.Trident()){
		var newStyle = document.createStyleSheet();
		newStyle.addRule("html", "margin:0;padding:0;height:100%;border:none");
		newStyle.addRule("body", "margin:0;padding:0;height:100%;border:none");

		for(var i=0;i<document.getElementsByTagName('img').length;i++){
			var imgAux = document.getElementsByTagName('img')[i];
			if(imgAux.src.indexOf('png') >= 0){
				imgAux.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + imgAux.src + "', sizingMethod='scale')";
			}
		}

	}

	if(Browser.Engine.Presto()){
		var txtcss = 'html,body{margin:0;padding:0;height:100%;border:none}';
		var newStyle = document.createElement('style');
		newStyle.type = 'text/css';
		txtcss = document.createTextNode(txtcss);
		newStyle.appendChild(txtcss);
		document.body.appendChild(newStyle);
	}

	if((Browser.Engine.Gecko()) || (Browser.Engine.Webkit())){
		var txtcss = 'html,body{margin:0;padding:0;height:100%;border:none}';
		var newStyle = document.createElement('style');
		newStyle.type = 'text/css';
		txtcss = document.createTextNode(txtcss);
		newStyle.appendChild(txtcss);
		document.body.appendChild(newStyle);
	}

	Screen.getWidth();
	Screen.getHeight();

	for(var i=0;i<RunOnLoad.length;i++){
		RunOnLoad[i]();
	}

}

function execute_functions_onresize(){
	Screen.getWidth();
	Screen.getHeight();
	for(var i=0;i<RunOnResize.length;i++){
		RunOnResize[i]();
	}
}

function execute_functions_onunload(){
	for(var i=0;i<RunOnUnload.length;i++){
		RunOnUnload[i]();
	}
}

if(Browser.Engine.Trident()){
	document.onreadystatechange = function(){
		if(document.readyState == 'complete'){
			execute_functions_onload();
		}
	};
}else{
	window.onload = execute_functions_onload;
}

if(window.onbeforeunload){
	window.onbeforeunload = execute_functions_onunload;
}else{
	if(window.onunload){
		window.onunload = execute_functions_onunload;
	}else{
		if(Browser.Engine.Presto()){
			//opera.io.webserver.addEventListener('_close', execute_functions_onunload, false);
			if(display_alerts == true){
				alert('Not implemented for opera web browsers. Please contact with horaciodrs@gmail.com if you have a solution.');
			}
		}
	}
}

window.onresize = execute_functions_onresize;
document.onmousemove = jalMouse_setXY;

