if (typeof GLB == "undefined") {
    var GLB = {};
}
GLB.namespace = function() {
	var object = null, arrObjects = [];
    for (var i=0; i<arguments.length; i++) {
		object = GLB;
		
        for (var objI = arguments[i].split("."), j=(objI[0]=="GLB")? 1 : 0; j<objI.length; j++) {
            object[ objI[j] ] 	= object[ objI[j] ] || {};
            object 				= object[ objI[j] ];
        }
		arrObjects.push(object);
    }
    return (arrObjects.length>1)? arrObjects : object;
};
/*
Captura de elementos
*/
GLB.$ = function(){
	return function(){
		var elements = [];
				
		for(var i=0; i<arguments.length; i++){
			var obj = null;
			
			if(typeof arguments[i] === "string")		var obj = document.getElementById(arguments[i]) || null;
			else if(typeof arguments[i] === "object")	var obj = arguments[i];
			if(obj==null && arguments[i]== "html")		var obj = document.getElementsByTagName("html")[0];
			if(obj==null && arguments[i]== "body")		var obj = document.body;
			if(obj==null && arguments[i]== "window")	var obj = window;
			
			if(obj!=null)elements.push(obj);
		}
		
		if(elements.length==1)return elements[0];
		if(elements.length>1) return elements;
			
		return null;
	}
}();
/*
Criação de elementos
*/
GLB.create = function(){
	return function(element, props){
		var el = document.createElement(element);
		if(!el) return null;
		
		for(var attr in props){
			if(attr=="innerHTML")
				el.innerHTML = props[attr];
			else
				el[attr] = props[attr];
		}
		
		return el;
	}
}();

GLB.queryString = function(){
	
	var _get = function(ID){
		var URL = document.location.href;
		if(URL.indexOf('?' + ID + '=')>-1){
			var qString = URL.split('?');
			var keyVal = qString[1].split('&');
			for(var i=0;i<keyVal.length;i++){
				if(keyVal[i].indexOf(ID + '=')==0){
					var val = keyVal[i].split('=');
					return val[1];
				}
			}
			return null;
		}else{
			return null;
		}
	}	
	
	var _set = function(ID, value){
	}
	
	return {
			get: _get, 
			set: _set
		   }
}();

/*
Eventos
*/
GLB.event = function() {
	/*
		.version: 1.0

		.date:
		26/09/2007
		
		.usage:
		GLB.event.add(window, 'load', _onload);
		or
		GLB.event.add(window, 'load', {scope: objeto, callback: "methodOfObject"});
	*/
	var _add = function(obj, evt, callback) {		
		if(callback && typeof(callback)==="function")var func =  callback;
		else if(typeof(callback)==="object"){
			if(typeof(callback.scope)==="object"){
				var func = GLB.util.delegate.create(callback.scope, callback.callback);
			}
		}
		if(obj.addEventListener) {
			obj.addEventListener(evt, func, false);
		} else if(obj.attachEvent) {
			obj.attachEvent('on' + evt, func);
		}
	}	

	return  {
		add: function(obj, event, callback) { 
			if(typeof obj==="object" && typeof event==="string" && (typeof callback==="function" || 
			  (typeof callback==="object" && typeof callback.scope==="object" && typeof callback.callback==="string")))
				return _add(obj, event, callback);
			else
				return null;
		}
	};		

}();

GLB.addDOMLoadEvent = (function(){
								
   var _callbacks = [];
   var _intervalVerify;
   var _isLoaded;
   
   var _doLoad = function () {
	   clearInterval(_intervalVerify);
	   
        _isLoaded = true;   
		var callback;
        while (callback = _callbacks.shift())
            callback();

        if(document.onreadystatechange) document.onreadystatechange = null;
    };

    return function (func) {
        if (_isLoaded) return func();        
        if (!_callbacks[0]) {
            //Mozilla/Opera9
            if(document.addEventListener)
               document.addEventListener("DOMContentLoaded", _doLoad, false);

			//Internet Explorer
            document.onreadystatechange = function(){
             	if(this.readyState == "complete")_doLoad();
            }

            //Safari
            if (/WebKit/i.test(navigator.userAgent)) { // sniff
                _intervalVerify = setInterval(function() {
                    if (/loaded|complete/.test(document.readyState))_doLoad();
                }, 10);
            }

            //Outros
            var oldOnload = window.onload;
            window.onload = function() {
                _doLoad();
                if(oldOnload)oldOnload();
            };
        }
        _callbacks.push(func);
    }
})();

/**
Version
**/
GLB.namespace("Browser");
GLB.Browser.version = function(){
	var o={
	    ie:0,
	    opera:0,
        gecko:0,
        webkit:0
    };
    var ua=navigator.userAgent, m;

    // Modern KHTML browsers should qualify as Safari X-Grade
    if ((/KHTML/).test(ua)) {
        o.webkit=1;
    }
    // Modern WebKit browsers are at least X-Grade
    m=ua.match(/AppleWebKit\/([^\s]*)/);
    if (m&&m[1]) {
        o.webkit=parseFloat(m[1]);
    }

    if (!o.webkit) { // not webkit
        // @todo check Opera/8.01 (J2ME/MIDP; Opera Mini/2.0.4509/1316; fi; U; ssr)
        m=ua.match(/Opera[\s\/]([^\s]*)/);
        if (m&&m[1]) {
            o.opera=parseFloat(m[1]);
        } else { // not opera or webkit
            m=ua.match(/MSIE\s([^;]*)/);
            if (m&&m[1]) {
                o.ie=parseFloat(m[1]);
            } else { // not opera, webkit, or ie
                m=ua.match(/Gecko\/([^\s]*)/);
                if (m) {
                    o.gecko=1; // Gecko detected, look for revision
                    m=ua.match(/rv:([^\s\)]*)/);
                    if (m&&m[1]) {
                        o.gecko=parseFloat(m[1]);
                    }
                }
            }
        }
    }
    return o;
}();

/**
Version
**/
GLB.jsPathDefault = "../js";
GLB.setJsPath = function(path){
	if(!typeof path === "string")return;
	GLB.jsPathDefault = (path.lastIndexOf("/")>=path.length)? path.substring(0, path.length-1) : path;
}
/**
Version
**/
GLB.controlPackage = function(){
	/*
		.version: 1.0
		
		.date:
		20/09/2007
		
		.usage:
		GLB.controlPackage.include("../js/arquivo.js");
		GLB.controlPackage.loadScript("../js/arquivo.js", callBack);
		
		.required
		GLB.util.httpRequest
		GLB.util.delegate
	*/
	GLB.namespace("GLB.util");
	
	var _onLoadScript = function(args){
		var scriptElement = document.createElement("script");
		scriptElement.setAttribute('type', 'text/javascript');
		scriptElement.innerHTML = args.result.responseText;
				
		document.getElementsByTagName('head')[0].appendChild(scriptElement);
		
		var callback = args.callback;	
		if(typeof(callback)==="object" && typeof(callback.arguments)==="object")callback.arguments.result = args.result.responseText;
		
		if(callback && typeof(callback)==="function")callback();
		else if(typeof(callback)==="object"){
			if(typeof(callback.scope)==="object"){
				var func = GLB.util.delegate.create(callback.scope, typeof(callback.callback)==="string" ? callback.callback : 'onLoadScript');
				if(func)func((callback.arguments)? callback.arguments : args.result.responseText);
			}
		}		
	}
	
	var _log = function(message){
		alert(" >> "+message);
	}
	
	return {
		include: function(path){
			if(typeof(path) != "string") return null;
			
			var scriptElement = document.createElement("script");
			scriptElement.setAttribute('type', 'text/javascript');
			scriptElement.setAttribute('src', path);
			
			document.getElementsByTagName('head')[0].appendChild(scriptElement);
		},
		loadScript: function(path, callBack){
			if(typeof(path) != "string") return null;
				
			if(!GLB.util.delegate){
				_log("Erro: O uso do método GLB.controlPackage.loadScript exige o pacote GLB.util.delegate já carregado");
				return null;
			}
			if(!GLB.util.httpRequest){
				_log("Erro: O uso do método GLB.controlPackage.loadScript exige o pacote GLB.util.httpRequest já carregado");
				return null;
			}
			
			var callbackLoad = {
				onComplete: _onLoadScript,
				arguments: {
					callback: callBack,
					path: path
				}
			}
			GLB.util.httpRequest.get(path, "", callbackLoad, false);			
		}
	}
}();