(function(){
/****************************************************************************************
 *				 START: CORE FUNCTIONS 					*
 ****************************************************************************************/
var MyJSLib = window.MyJSLib = function() {
	return new MyJSLib.fn.init();
};

MyJSLib.fn = MyJSLib.prototype = {
	init: function() {
		return this;
	},
	
	toString: Object.prototype.toString,
	
	isFunction: function(obj) {
		return this.toString.call(obj) === "[object Function]";
	},

	isArray: function(obj) {
		return this.toString.call(obj) == "[object Array]";
	},

	isString: function(obj) {
		return this.toString.call(obj) == "[object String]";
	},

	isNumber: function(obj) {
		return this.toString.call(obj) == "[object Number]";
	},

	isObject: function(obj) {
		return this.toString.call(obj) == "[object Object]";
	},
	
	test: "test works!"
	
	//TODO: core functions
};

MyJSLib.fn.init.prototype = MyJSLib.fn;
/****************************************************************************************
 *				 END: CORE FUNCTIONS 					*
 ****************************************************************************************/


/****************************************************************************************
 *				 START: COOKIE HANDLER 					*
 ****************************************************************************************/
MyJSLib.CookieHandler = MyJSLib.fn.CookieHandler = ({

	getCookie: function(c_name) {
		if (document.cookie.length > 0) {
			c_start = document.cookie.indexOf(c_name + "=");
			if (c_start != -1) { 
				c_start = c_start + c_name.length + 1; 
				c_end = document.cookie.indexOf(";", c_start);
				if (c_end == -1) 
					c_end = document.cookie.length;
			
				return unescape(document.cookie.substring(c_start,c_end));
			} 
		}
		return "";
	},

	setCookie: function(c_name, value, expiredays) {
		var exdate = new Date();
		exdate.setDate(exdate.getDate() + expiredays);
		document.cookie = c_name + "=" +escape(value) + ( (expiredays==null) ? "" : ";expires=" + exdate.toGMTString() );
	},
	
	eraseCookie: function(c_name) {
		MyJSLib.CookieHandler.setCookie(c_name,"",-1);
	},
	
	browseCookiesExists: function() {
		return document.cookie ? true : false;
	}
});
/****************************************************************************************
 *				 END: COOKIE HANDLER 					*
 ****************************************************************************************/



/****************************************************************************************
 *				 START: AJAX HANDLER 					*
 ****************************************************************************************/
MyJSLib.AjaxHandler = MyJSLib.fn.AjaxHandler = ({

	requestObject: function() {
		var XMLRequestObject = null; /* XMLHttpRequest Object */
		
		if(window.XMLHttpRequest) { /* Mozilla, Safari,...*/
			XMLRequestObject = new XMLHttpRequest();
			if(XMLRequestObject.overrideMimeType)
				XMLRequestObject.overrideMimeType("text/xml");
		
		} else if(window.ActiveXObject) { /* IE */
			try {
				XMLRequestObject = new ActiveXObject("Msxml2.XMLHTTP");
			} catch (e) {
				try {
					XMLRequestObject = new ActiveXObject("Microsoft.XMLHTTP");
				} catch (e) {}
			}
		}
		
		if(!XMLRequestObject)
			alert("Giving up :( Cannot create an XMLHTTP instance");
	
		return XMLRequestObject;
	},
	
	send: function(method, url, options) {
		if(!options) options = {};
		
		method = method ? method.toUpperCase() : false;
		var assync = options && options.assync ? true : false;
		var parameters = options && method == "POST" ? options.parameters : false;
		
		var result_type = options ? options.result_type : false;
		var callback_func = options ? options.callback_func : false;
		var callback_func_args = options ? options.callback_func_args : false;
	
		var requestObj = MyJSLib.AjaxHandler.requestObject();
		requestObj.open(method, url, assync);
		
		if(method == "POST") {
			requestObj.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
			if(parameters)
				requestObj.setRequestHeader("Content-length", parameters.length);
			requestObj.setRequestHeader("Connection", "close");
		}
		
		requestObj.onreadystatechange = function(){
			if(requestObj.readyState == 4) {
				if(MyJSLib.fn.isFunction(callback_func))
					callback_func( MyJSLib.AjaxHandler.getResult(requestObj, result_type), callback_func_args);
			}
		};
		
		requestObj.send(parameters ? parameters : null);
		
		return !assync ? MyJSLib.AjaxHandler.getResult(requestObj, result_type) : true;
	},
	
	get: function(url, options) {
		if(!options) options = {};
		
		options.assync = true;
		url = MyJSLib.AjaxHandler.getURLWidthParameters(url, options ? options.parameters : false);
		
		return MyJSLib.AjaxHandler.send("GET", url, options);
	},
	
	gets: function(url, options) {
		if(!options) options = {};
		
		options.assync = false;
		url = MyJSLib.AjaxHandler.getURLWidthParameters(url, options ? options.parameters : false);
		
		return MyJSLib.AjaxHandler.send("GET", url, options);
	},
	
	post: function(url, options) {
		if(!options) options = {};
		
		options.assync = true;
		
		return MyJSLib.AjaxHandler.send("POST", url, options);
	},
	
	posts: function(url, options) {
		if(!options) options = {};
		
		options.assync = false;
		
		return MyJSLib.AjaxHandler.send("POST", url, options);
	},
	
	getResult: function(requestObj, result_type) {
		if(result_type == 1)
			return requestObj.responseXML;
		else if(result_type == 2) 
			return requestObj.responseText;
		
		return requestObj;
	},
	
	getURLWidthParameters: function(url, parameters) {
		if(parameters) {
			url += url.indexOf("?") > -1 ? "" : "?";
			url += "&" + MyJSLib.AjaxHandler.prepareParameters(parameters);
		}
		return url;
	},
	
	prepareParameters: function(parameters) {//TODO: check this function
		try {
			if(MyJSLib.fn.isArray(parameters)) {
				var str = "", item;
				for(var i = 0; i < parameters.length; ++i) {
					item = parameters[i];
					if(str != "")
						str += "&";
					str += encodeURIComponent(item.name) + "=" + encodeURIComponent(item.value);
				}
				return str;
			}
			else if(MyJSLib.fn.isObject(parameters)) {
				var str = "";
				for(name in parameters) {
					if(str != "")
						str += "&";
					str += encodeURIComponent(name) + "=" + encodeURIComponent( parameters[name] );
				}
				return str;
			}
		} catch(e) {
			alert(e && e.message ? e.message : e);
		}
		return parameters;
	}
});
/****************************************************************************************
 *				 END: AJAX HANDLER 					*
 ****************************************************************************************/



/****************************************************************************************
 *				 START: XML HANDLER 					*
 ****************************************************************************************/
MyJSLib.XMLHandler = MyJSLib.fn.XMLHandler = ({
	
	loadXMLFile: function(fname) {
		var xmlDoc;
		
		try {
			if (window.ActiveXObject) { // code for IE
				xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
			}
			else if(document.implementation && document.implementation.createDocument) { // code for Mozilla, Firefox, Opera, etc.
				xmlDoc = document.implementation.createDocument("","",null);
			}
			else {
				alert('Your browser cannot handle this script');
			}
			xmlDoc.async = "false";
			xmlDoc.load(fname);
		}
		catch(e) {
			alert(e && e.message ? e.message : e);
			return;
		}
		return(xmlDoc);
	},
	
	loadXMLString: function(text) {
		var xmlDoc;
		
		try {
			if(window.ActiveXObject) { //Internet Explorer
				xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
				xmlDoc.async = "false";
				xmlDoc.loadXML(text);
			}  
			else { // Firefox, Mozilla, Opera, etc.
				parser = new DOMParser();
				xmlDoc = parser.parseFromString(text, "text/xml");
			}
		}
		catch(e) {
			alert(e && e.message ? e.message : e);
			return;
		}
		return xmlDoc;
	}
});
/****************************************************************************************
 *				 END: XML HANDLER 					*
 ****************************************************************************************/



/****************************************************************************************
 *				 START: XSLT HANDLER 					*
 ****************************************************************************************/
MyJSLib.XSLTHandler = MyJSLib.fn.XSLTHandler = ({
	
	getNodeValue: function(xmldoc, path, index) {
		var values = MyJSLib.XSLTHandler.getNodeValues(xmldoc, path);
		return index ? values[index] : values[0];
	},
	
	getNodeValues: function(xmldoc, path) {
		var values = new Array();
		
		var nodes = MyJSLib.XSLTHandler.getNodes(xmldoc, path);
		if(nodes) {
			var root = nodes.childNodes ? nodes.childNodes[0] : false;
			if(root && root.childNodes) {
				var node_value;
				for(var i = 0; i < root.childNodes.length; ++i) {
					node_value = root.childNodes[i];
					if(node_value.nodeName == "VALUE")
						values.push(node_value.firstChild ? node_value.firstChild.data : "");
				}
			}
		}
		return values;
	},
	
	getNodes: function(xmldoc, path) {
		if(xmldoc && path) {
			path = MyJSLib.XSLTHandler.configurePath(path);
		
			var xslt = '<?xml version="1.0"?>' +
					'<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:myNS="http://devedge.netscape.com/2002/de">' +
					'<xsl:output method="html" />' +
						'<xsl:template match="/">' +
							'<ROOT>' +
								'<xsl:for-each select="' + path + '">' +
									'<VALUE><xsl:value-of select="." /></VALUE>' +
								'</xsl:for-each>' +
							'</ROOT>' +
						'</xsl:template>' +
					'</xsl:stylesheet>';
		
		
			return MyJSLib.XSLTHandler.displayResult(xmldoc, xslt);
		}
		else
			return null;
	},
	
	displayResult: function(xml, xslt) {
		var resultDocument;
	
		if(MyJSLib.fn.isString(xml)) xml = MyJSLib.XMLHandler.loadXMLString(xml);
		if(MyJSLib.fn.isString(xslt)) xslt = MyJSLib.XMLHandler.loadXMLString(xslt);
		
		try {
			if(window.ActiveXObject) { // code for IE
				resultDocument = xml.transformNode(xslt);
			}
			else if(document.implementation && document.implementation.createDocument) { // code for Mozilla, Firefox, Opera, etc.
				xsltProcessor = new XSLTProcessor();
				xsltProcessor.importStylesheet(xslt);
				resultDocument = xsltProcessor.transformToFragment(xml, document);
			}
		}
		catch(e) {
			alert(e && e.message ? e.message : e);
			return false;
		}
		
		if(MyJSLib.fn.isString(resultDocument)) {
			resultDocument = MyJSLib.XMLHandler.loadXMLString(resultDocument);
		}
		
		return resultDocument;
	},
	
	configurePath: function(path) {
		return path ? path.replace(/[\/]+/g, "/") : path;
	}
});
/****************************************************************************************
 *				 END: XSLT HANDLER 					*
 ****************************************************************************************/


/****************************************************************************************
 *				 START: FORM HANDLER 					*
 ****************************************************************************************/
MyJSLib.FormHandler = MyJSLib.fn.FormHandler = ({
	
	formCheck: function(cform) {
		if(!cform) {
			alert("Empty form object detected!");
			return false;
		}
		
		var confirm_element = false;
		var errors = 0;
		var wrong_elms = new Array();
		var message_exists = false;
		
		var elm, type, name, nametoshow, value, value_aux, confirmed, checked, checkmessage, checkallownull, checktype, checkminlen, checkmaxlen, checkminvalue, checkmaxvalue, checkmandatorycheckbox, checkminwords, checkmaxwords, error_message, aux;
		for(i = 0; i < cform.elements.length; i++) {
			elm = cform.elements[i];
			type = elm.type;
			name = elm.name;
			nametoshow = name ? name.replace(/_/gi," ").toUpperCase() : "";
			confirmed = elm.getAttribute('confirmed');
			
			if(type == "select") {
				value = elm.options[elm.selectedIndex] ? elm.options[elm.selectedIndex].value : false;
			}
			else {
				value = elm.value;
			}
			
			if(type == 'submit' && confirmed == 1) {
				confirm_element = elm;
				break;
			}
			else {
				checked = elm.checked ? elm.checked : elm.getAttribute('checked');
				checkmessage = elm.getAttribute('checkmessage');
				checkallownull = elm.getAttribute('checkallownull');
				checktype = elm.getAttribute('checktype');
				checkminlen = elm.getAttribute('checkminlen');
				checkmaxlen = elm.getAttribute('checkmaxlen');
				checkminvalue = elm.getAttribute('checkminvalue');
				checkmaxvalue = elm.getAttribute('checkmaxvalue');
				checkmandatorycheckbox = elm.getAttribute('checkmandatorycheckbox');
				checkminwords = elm.getAttribute('checkminwords');
				checkmaxwords = elm.getAttribute('checkmaxwords');
			
				message_exists = false;
				error_message = "";
				aux = false;
				
				// 1. NULL CONTROL
				if(checkallownull && checkallownull=='false') {
					value_aux = value ? value.toString().replace(/ /g, "") : false;
					
					if(!value_aux || value_aux == '' || (type == "checkbox" && !checked)) {
						if(!message_exists) {
							errors++;
						
							if(checkmessage) {
								error_message = checkmessage;
								message_exists = true;
							}
							else {
								error_message = "Field '"+nametoshow+"' cannot be blank.";
							}
							wrong_elms.push({"element" : elm, "error" : "checkallownull", "message" : error_message});
						}
					}		
				}
				// END OF NULL CONTROL
	
				// 2. TYPE CONTROL
				if(checktype && value && !MyJSLib.FormHandler.inputCheck(value,checktype)) {
					if(!message_exists) {
						errors++;
					
						if(checkmessage) {
							error_message = checkmessage;
							message_exists = true;
						}
						else {
							error_message = "Invalid "+checktype+" format in '"+nametoshow+"'.";
						}
						wrong_elms.push({"element" : elm, "error" : "checktype", "message" : error_message});
					}
				}
				// END OF TYPE CONTROL


				// 3. LENGTH CONTROL
				if(checkminlen && value && value.length < checkminlen) {
					if(!message_exists) {
						errors++;
					
						if(checkmessage) {
							error_message = checkmessage;
							message_exists = true;
						}
						else {
							error_message = "Length of '"+nametoshow+"' cannot be less than "+checkminlen+" characters.";
						}
						wrong_elms.push({"element" : elm, "error" : "checkminlen", "message" : error_message});
					}
				}

				if(checkmaxlen && value && value.length > checkmaxlen) {
					if(!message_exists) {
						errors++;
					
						if(checkmessage) {
							error_message = checkmessage;
							message_exists = true;
						}
						else {
							error_message = "Length of '"+nametoshow+"' cannot be more than "+checkmaxlen+" characters.";
						}
						wrong_elms.push({"element" : elm, "error" : "checkmaxlen", "message" : error_message});
					}
				}
				// END OF LENGTH CONTROL
	

				// 4. MIN/MAX VALUE CONTROL FOR NUMBERS
				if(checkminvalue && value && value < checkminvalue) {
					if(!message_exists) {
						errors++;
					
						if(checkmessage) {
							error_message = checkmessage;
							message_exists = true;
						}
						else {
							error_message = "Value of '"+nametoshow+"' cannot be less than "+checkminvalue+".";
						}
						wrong_elms.push({"element" : elm, "error" : "checkminvalue", "message" : error_message});
					}
				}

				if(checkmaxvalue && value && value > checkmaxvalue) {
					if(!message_exists) {
						errors++;
					
						if(checkmessage) {
							error_message = checkmessage;
							message_exists = true;
						}
						else {
							error_message = "Value of '"+nametoshow+"' cannot be great than "+checkmaxvalue+".";
						}
						wrong_elms.push({"element" : elm, "error" : "checkmaxvalue", "message" : error_message});
					}
				}
				// END OF MIN/MAX VALUE CONTROL


				// 5. CHECK MANDATORY CHECKBOX
				if(checkmandatorycheckbox && !checked) {
					if(!message_exists) {
						errors++;
					
						if(checkmessage) {
							error_message = checkmessage;
							message_exists = true;
						}
						else {
							error_message = "Please checked the field '"+nametoshow+"'.";
						}
						wrong_elms.push({"element" : elm, "error" : "checkmandatorycheckbox", "message" : error_message});
					}
				}
				// END CHECK MANDATORY CHECKBOX
		

				// 6. MIN NUMBER OF WORDS
				if(checkminwords && checkminwords >= 0 && value) {
					aux = MyJSLib.FormHandler.strCountValue(value);
					if(aux < checkminwords) {
						if(!message_exists) {
							errors++;
						
							if(checkmessage) {
								error_message = checkmessage;
								message_exists = true;
							}
							else {
								error_message = "Value of '"+nametoshow+"' need to have more than "+checkminwords+" word(s).";
							}
							wrong_elms.push({"element" : elm, "error" : "checkminwords", "message" : error_message});
						}
					}
				}
				// END MIN NUMBER OF WORDS


				// 7. MAX NUMBER OF WORDS
				if(checkmaxwords && checkmaxwords >= 0 && value) {
					aux = MyJSLib.FormHandler.strCountValue(value);
					if(aux > checkmaxwords) {
						if(!message_exists) {
							errors++;
						
							if(checkmessage) {
								error_message = checkmessage;
								message_exists = true;
							}
							else {
								error_message = "Value of '"+nametoshow+"' need to have less than "+checkmaxwords+" word(s).";
							}
							wrong_elms.push({"element" : elm, "error" : "checkmaxwords", "message" : error_message});
						}
					}
				}
				// END MAX NUMBER OF WORDS

			}
		} // END OF THE FOR LOOP
		
		//gets the second argument of this function
		var oncheckfunction = arguments.length > 1 && arguments[1] ? arguments[1] : MyJSLib.FormHandler.onFormCheck;
		
		if(oncheckfunction && MyJSLib.fn.isFunction(oncheckfunction)) {
			return oncheckfunction(cform, {"errors" : errors, "confirm_element" : confirm_element, "wrong_elms" : wrong_elms});
		}
		return true;
	},
	
	onFormCheck: function(cform, attrs) {
		var errors = attrs.errors;
		var confirm_element = attrs.confirm_element;
		var wrong_elms = attrs.wrong_elms;
	
		if(errors == 0) {
			MyJSLib.FormHandler.checkFormSecurity(cform);
		
			if(confirm_element && confirm_element.confirmed == 1) {
				confirm_element.confirmed = false;
				if(confirm('Do you want continue?') == true)
					return true;
				else return false;
			}
			else return true;
		}else {
			var elm;
			var message = "Please check the following input(s): \n";
			for(var i = 0; i < wrong_elms.length; ++i) {
				elm = wrong_elms[i];
				if(elm.message) {
					message += "- " + elm.message + "\n";
				}
			}
			
			alert(message);
			return false;
		}
		return false;
	},

	inputCheck: function(input, type)  {
		var errors = 0;
		var expression;

		if(type == 'int' || type == 'bigint' || type == 'number')
			expression	= /^-*\d+$/;
		else if(type == 'double' || type == 'float' || type == 'decimal')
			expression	= /(^-*\d+$)|(^-*\d+\.\d+$)/;
		else if(type == 'phone' || type == 'fax')
			expression	= /(^\++\d+$)|(^\d+$)|(^\+)(\d*\-\d*\-\d*$)|(\d*\-\d*\-\d*$)/;
		else {
			switch(type) {
				case 'email':
					expression	= /^.+\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,10})(\]?)$/;
					break;
				case 'date':
					expression	= /^\d{1,2}(\-|\/|\.)\d{1,2}\1\d{4}$/;
					break;
				case 'datedb':
					expression	= /^([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})$/;
					break;
				case 'datemysql':
					expression	= /^([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})$/;
					break;
				case 'ipaddress':
					expression	= /^((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/;
					break;
				case 'smallint':
					expression	= /^[0,1]{1}$/;
					break;
				case 'filename':
					expression	= /^[A-z0-9\-\_\.]*$/;
					break;
				default:
					expression	= "";
					sbreak;
			}
		}
	
		if((errors == 0) && (expression != '')) 
			if(!expression.exec(input))//if(!expression.test(input))
				errors++;
	
		return errors == 0;
	},

	strCountValue: function(value) {
		var value_splited = value.split(" ");
		var counter = 0;
		for(j = 0; j < value_splited.length; j++)
			if(value_splited[j])
				++counter;
		return counter;
	},

	checkAndSubmitForm: function(form, options) {
		var cform;
		if(MyJSLib.fn.isString(form)) {
			eval("cform = document." + form + ";");
		
			if(!cform) {
				cform = document.getElementById(form);
			}
		}
		else {
			cform = form;
		}
		
		var oncheck_func = options && options.oncheck_func ? options.oncheck_func : false;
		if(cform && MyJSLib.FormHandler.formCheck(cform, oncheck_func)) {
			var status = true
			if(options && MyJSLib.fn.isFunction(options.callfront_func)) {
				status = options.callfront_func(cform);
			}
			
			if(status) {
				var is_ajax = cform.getAttribute("ajax");
				if(is_ajax) {
					MyJSLib.FormHandler.submitFormViaAjax(cform, options);
					return false;
				} else {
					try {
						cform.submit();
					}
					catch(e) {}
				}
				return true;
			}
		}
		return false;
	},

	submitFormViaAjax: function(cform, options) {
		var method = cform.method;
		var query = MyJSLib.FormHandler.getFormQuery(cform);
		var action = MyJSLib.FormHandler.getFormAction(cform);
		
		try {
			if(MyJSLib.AjaxHandler) {
				var callback_func = options ? options.callback_func : false;
				var result_type = options ? options.ajax_result_type : false;
				var settings = { callback_func : callback_func, callback_func_args : cform, result_type : result_type, parameters : query };
				var status = method.toLowerCase() == "get" ? MyJSLib.AjaxHandler.get(action, settings) : MyJSLib.AjaxHandler.post(action, settings);
				return status;
			}
		} catch(e) {
			alert("System error. Please contact the system administrator!");
		}
		return false;
	},

	getFormQuery: function(cform) {
		var query = ""; 
		
		var formElem, name;
		for (var i = 0; i < cform.elements.length; i++) {
			formElem = cform.elements[i];
			name = formElem.name;
			switch (formElem.type) {
			        case 'text':
			        case 'select':
			        case 'select-one':
			        case 'hidden':
			        case 'submit':
			        case 'password':
			        case 'textarea':
			                query += encodeURIComponent(name) + '=' + encodeURIComponent(formElem.value) + '&';
			        	break;
			        	
			  	case 'select-multiple': 
					for(var j = 0; j < formElem.length; j++) 
						if(formElem[j].selected) 
							query += encodeURIComponent(name) + '=' + encodeURIComponent(formElem[j].value) + '&';
					break;
				
				case 'radio': 
				case 'checkbox': 
					if(formElem.checked)
						query += encodeURIComponent(name) + '=' + encodeURIComponent(formElem.value) + '&';
					break;
			
				default: 
					query += encodeURIComponent(name) + '=' + encodeURIComponent(formElem.value) + '&';
			}	
		}
		return query;
	},
	
	getFormAction: function(cform) {
		var action = cform.action;
		if(action == "") {
			action = location.search;
		}
		return action;
	},
	
	checkFormSecurity: function(cform) {
		var security_code = cform.getAttribute("securitycode");
		
		if(security_code) {
			var security_code_value = MyJSLib.CookieHandler.getCookie(security_code);
			
			var input = document.createElement("input");
			input.setAttribute("type", "hidden");
			input.setAttribute("name", security_code);
			input.setAttribute("value", security_code_value ? security_code_value : "");
			
			cform.appendChild(input);
		}
	}
});
/****************************************************************************************
 *				 END: FORM HANDLER 					*
 ****************************************************************************************/



/****************************************************************************************
 *				 START: LOADING BAR HANDLER 				*
 ****************************************************************************************/
MyJSLib.LoadingBarHandler = MyJSLib.fn.LoadingBarHandler = ({
	loadingBarHtml : '<div id="subloadingbar">Loading ...</div>',
	
	showLoadingBar : function() {
		var loadingbar = document.getElementById('loadingbar');
		if(!loadingbar) {
			MyJSLib.LoadingBarHandler.createLoadingBar();
			loadingbar = document.getElementById('loadingbar');
		}
	
		if(loadingbar)
			loadingbar.style.display = 'block';
		
		return true;
	},

	hideLoadingBar : function() {
		var loadingbar = document.getElementById('loadingbar');
		if(loadingbar)
			loadingbar.style.display = 'none';
		
		return true;
	},

	createLoadingBar : function() {
		var div = document.createElement("div");
		div.setAttribute("id", "loadingbar");
		div.innerHTML = MyJSLib.LoadingBarHandler.loadingBarHtml;
	
		document.body.insertBefore(div, null);
		
		return true;
	}
});
/****************************************************************************************
 *				 END: LOADING BAR HANDLER 				*
 ****************************************************************************************/



/****************************************************************************************
 *				 START: DEBUG HANDLER 					*
 ****************************************************************************************/
MyJSLib.DebugHandler = MyJSLib.fn.DebugHandler = ({
	active : false,
	type : "log", /*log info warning debug, error*/
	
	showException : function(e) {
		if(MyJSLib.DebugHandler.active) {
			if(typeof e == "object") {
				var message = e.name + ": " + e.message + " in " + e.stack;
			
				var type_aux = MyJSLib.DebugHandler.type;
				MyJSLib.DebugHandler.type = "warning";
				MyJSLib.DebugHandler.showMessage(message);
				MyJSLib.DebugHandler.type = type_aux;
				
				var console = MyJSLib.DebugHandler.getConsole();
				if(console) {
					console.trace();
				}
			}
		}
	},
	
	showMessage : function(message) {
		if(MyJSLib.DebugHandler.active) {
			var console = MyJSLib.DebugHandler.getConsole();
			if(console) {
				switch(MyJSLib.DebugHandler.type.toString().toLowerCase()) {
					case "info": console.info(message); break;
					case "warning": console.warn(message); break;
					case "debug": console.debug(message); break;
					case "error": console.error(message); break;
				
					default: console.log(message);
				}
			}
			else {
				alert(message);
			}
		}
	},
	
	getConsole : function() {
		return console ? console : (window.console ? window.console : false);
	}
});
/****************************************************************************************
 *				 END: DEBUG HANDLER 					*
 ****************************************************************************************/



/****************************************************************************************
 *				 START: FUNCTION HANDLER 				*
 ****************************************************************************************/
MyJSLib.FunctionHandler = MyJSLib.fn.FunctionHandler = ({
	
	callFunction : function(func, params) {
		var result = false;
		try {
			var func = MyJSLib.FunctionHandler.getFunction(func);
		
			if(typeof func == "function") {
				var script = "result = func(";
				if(params && typeof params != "undefined") {
					if(params instanceof Array) {
						for(var i = 0; i < params.length; ++i) {
							script += (i > 0 ? ", " : "") + "params["+i+"]";
						}
					}
					else {
						script += "params";
					}
				}
				script += ");";
				
				/*MyJSLib.DebugHandler.showMessage("Call MyJSLib.FunctionHandler.callFunction ==> script: " + script);*/
				
				eval(script);
			}
		}
		catch(e) {
			MyJSLib.DebugHandler.showException(e);
		}
		return result;
	},
	
	getFunction : function(func) {
		if(typeof func != "function" && func) {
			eval("func = "+func+";")
		}
		return func;
	}
});
/****************************************************************************************
 *				 END: FUNCTION HANDLER 					*
 ****************************************************************************************/



/****************************************************************************************
 *				 START: FLASH HANDLER 					*
 ****************************************************************************************/
MyJSLib.FlashHandler = MyJSLib.fn.FlashHandler = ({
	
	removeAllFlashObjects : function() { 
		var removed_objects = new Array();
		var removed_embeds = new Array();
		
		var elem = arguments && arguments.length >= 1 && typeof arguments[0] != "undefined" && arguments[0] ? arguments[0] : document.body;
		
		var objects = elem.getElementsByTagName("object");
	
		var object, width, height, object_parent, removed_object, new_object, next_object;
		for(var i = 0; i < objects.length; ++i) {
			object = objects[i];
			width = object.width ? object.width : object.getAttribute("width");
			height = object.height ? object.height : object.getAttribute("height");
		
			object_parent = object.parentNode;
			if(object_parent) {
				new_object = document.createElement("div");
				new_object.style.display = "block";
				new_object.style.overflow = "hidden";
				new_object.innerHTML = "&nbsp;";
			
				if(width > 0) {
					new_object.style.width = width + "px";
				}
				if(height) {
					new_object.style.height = height + "px";
				}
			
				next_object = object_parent.insertBefore(new_object, object);
				removed_object = object_parent.removeChild(object);
			
				removed_objects.push({"object" : removed_object, "parent" : object_parent, "next_object" : next_object});
			}
		}

		var embeds = document.getElementsByTagName("embed");
		
		var embed, embed_parent, removed_embed, new_embed, next_embed;
		for(var i = 0; i < embeds.length; ++i) {
			embed = embeds[i];
		
			embed_parent = embed.parentNode;
			if(embed_parent) {
				new_embed = document.createElement("div");
				next_embed = embed_parent.insertBefore(new_embed, embed);
				removed_embed = embed_parent.removeChild(embed);
			
				removed_embeds.push({"embed" : removed_embed, "parent" : embed_parent, "next_embed" : next_embed});
			}
		}
		
		return {"objects" : removed_objects, "embeds" : removed_embeds};
	},

	addRemovedFlashObjects : function(removed_elms) {
		if(removed_elms && typeof removed_elms == "object") {
			if(removed_elms.objects) {
				var objects = removed_elms.objects;
				var object_item, object, parent;
				for(var i = 0; i < objects.length; ++i) {
					object_item = objects[i];
					object = object_item.object;
					parent = object_item.parent;
					next_object = object_item.next_object;
			
					if(parent && object) {
						if(next_object) {
							parent.insertBefore(object, next_object);
							parent.removeChild(next_object);
						}
						else {
							parent.appendChild(object);
						}
					}
				}
			}
	
			if(removed_elms.embeds) {
				var embeds = removed_elms.embeds;
				var embed_item, embed, parent;
				for(var i = 0; i < embeds.length; ++i) {
					embed_item = embeds[i];
					embed = embed_item.embed;
					parent = embed_item.parent;
					next_embed = embed_item.next_embed;
			
					if(parent && embed) {
						if(next_embed) {
							parent.insertBefore(embed, next_embed);
							parent.removeChild(next_embed);
						}
						else {
							parent.appendChild(embed);
						}
					}
			
				}
			}
		}
	}
});
/****************************************************************************************
 *				 END: FLASH HANDLER 					*
 ****************************************************************************************/

})();
