GLB.namespace("GLB.util");
GLB.util.css = function(){
	/*
		.version: 1.0
		
		.date:
		20/09/2007
		
		.usage:
		obj1.function = GLB.util.Delegate(obj2, "method");
		
		.required
		GLB.util.html
		
	*/
	var _isIe 		= GLB.browserVersion.ie;
	var _isOpera 	= GLB.browserVersion.opera;
	
	var _getStyle	= function(element, style) {
		element = (typeof element === "object")? element: GLB.$(element);
		var value = undefined;
		
		style = (style == 'float' || style == 'cssFloat') ? (_isIe? 'styleFloat' : 'cssFloat') : GLB.util.html.camelize(style);
		if (!value && !_isIe) {
			var css = document.defaultView.getComputedStyle(element, null);
			value = css ? css[style] : null;
		}		
		
		if (!value && element.currentStyle && _isIe) value = element.currentStyle[style];
		
		if (style == 'opacity' && _isIe) {
			if(value = (GLB.util.css.getStyle(element, 'filter') || '').match(/alpha\(opacity=(.*)\)/))
				if (value[1])return parseFloat(value[1]) / 100;
		 
			return 1.0;
		}else if(style == 'opacity'){
			return value ? parseFloat(value) : 1.0;
		}
		
		if (value == 'auto' && _isIe) {
		  if ((style == 'width' || style == 'height') && (GLB.util.css.getStyle('display') != 'none'))
			return element['offset'+GLB.util.html.capitalize(style)] + 'px';
		  
		  return null;
		}
		
		return value == 'auto' ? null : value;		  
	}
	
	var _setStyle = function(element, styles, camelized) {
		element = (typeof element === "object")? element: GLB.$(element);
		
		var elementStyle = element.style, match;
		if (typeof styles === "string") {
			element.style.cssText += ';' + styles;
			return styles.indexOf('opacity') > -1 ? _setOpacity(element, styles.match(/opacity:\s*(\d?\.?\d*)/)[1]) : element;
		}
	
		for (var property in styles)
			if (property == 'opacity')
				element.setOpacity(styles[property])
			else
				elementStyle[(property == 'float' || property == 'cssFloat') ?
					(elementStyle.styleFloat === undefined ? 'cssFloat' : 'styleFloat') : (camelized ? property : GLB.util.html.camelize(property))] = styles[property];
	
		return element;
	}
	
	var _setOpacity = function(element, value) {
		
		
		element = (typeof element === "object")? element: GLB.$(element);	
		
		if(!_isIe){
			element.style.opacity = (value == 1 || value === '') ? '' :  (value < 0.00001) ? 0 : value;	
			//alert(" OPACITY ::: "+element.style.opacity);
		}else {
			
			var filter = _getStyle(element, 'filter') || "", style = element.style;
			if (value == 1 || value === '') {
				style.filter = filter.replace(/alpha\([^)]*\)/,'');
				return element;
			}else if(value < 0.00001){
				value = 0;
			}
			style.filter = filter.replace(/alpha\([^)]*\)/, '') + 'alpha(opacity=' + (value * 100) + ')';
		}
		
		return element;
	}
	
	var _getDimensions = function(element) {
		element = (typeof element === "object")? element: GLB.$(element);
				
		var display = GLB.util.css.getStyle(element, 'display');
		
		// Safari bug
		if (display != 'none' && display != null)return{width: element.offsetWidth, height: element.offsetHeight};
		
		// All *Width and *Height properties give 0 on elements with display none,
		// so enable the element temporarily
		var els = element.style;
		
		var originalVisibility = els.visibility;
		var originalPosition = els.position;
		var originalDisplay = els.display;
		
		els.visibility = 'hidden';
		els.position = 'absolute';
		els.display = 'block';
		
		var originalWidth = element.clientWidth;
		var originalHeight = element.clientHeight;
		
		els.display = originalDisplay;
		els.position = originalPosition;
		els.visibility = originalVisibility;
		
		return {width: originalWidth, height: originalHeight};
	}
	
	var _getPosition = function(element){
		var x = 0, y = 0;
		if (!document.layers) {
			
			var onWindows = navigator.platform ? navigator.platform == "Win32" : false;
			var mac = document.all && !onWindows && getExplorerVersion() == 4.5;
			var par = element;
			var lastOffsetTop = 0;
			var lastOffsetLeft = 0;
			
			while(par){
				if(par.leftMargin && !onWindows) x += parseInt(par.leftMargin);
				if(par.topMargin && !onWindows ) y += parseInt(par.topMargin);
				
				if((par.offsetLeft != lastOffsetLeft) && par.offsetLeft) 	x += parseInt(par.offsetLeft);
				if((par.offsetTop != lastOffsetTop) && par.offsetTop) 		y += parseInt(par.offsetTop);
				
				if(par.offsetLeft != 0) lastOffsetLeft 	= par.offsetLeft;
				if(par.offsetTop != 0 ) lastOffsetTop 	= par.offsetTop;
				
				par = mac ? par.parentElement : par.offsetParent;
			}
			
		} else if(element.x && element.y){
			x += element.x;
			y += element.y;
		}
		
		return {x: x, y: y};
	}
	
	var _addClass = function(element, _class){
		if(typeof element === "string") element = GLB.$(element);
		
		if (!element.className) element.className = ''; 
		var className = element.className;		
		if (!className.match(RegExp("\\b"+_class+"\\b"))) className = className.replace(/(\S$)/,'$1 ')+_class;		
		element.className = className;
	}
	var _removeClass = function(element, _class){
		
		if(typeof element === "string") element = GLB.$(element);
		
		if (!element.className) element.className = ''; 
		var className = element.className; 
		className = className.replace(RegExp("(\\s*\\b"+_class+"\\b(\\s*))*","g"),'$2');
		element.className = className;
		
	}
	
	var _replaceClass = function(element, _classOld, _classNew){
		if(typeof element === "string") element = GLB.$(element);
		
		if( _checkClass( element, _classOld ) )_removeClass(element, _classOld);
		_addClass(element, _classNew);		
	}
	
	var _checkClass = function(element, _class){
		var bkp = element;
		if(typeof element === "string") element = GLB.$(element);
		
		try{
			if (!element.className) element.className = ''; 
			var className = element.className; 
			
			return className.match(RegExp("\\b"+_class+"\\b"));
		}catch(e){
			alert(" ERRO "+ element +" - "+bkp);
		}
	}
	
	var _log = function(message){
	}
			
	return {
		getStyle:function(element, style){
			if(!GLB.util.html)_log("Erro: O uso desse método (GLB.util.css.getStyle) exige o pacote GLB.util.html já carregado");
			
			if(_isOpera){
				switch(style) {
				  case 'left':
				  case 'top':
				  case 'right':
				  case 'bottom':
					if (_getStyle(element, 'position') == 'static') return null;
				  default: return _getStyle(element, style);
				}
			}else{
				return _getStyle(element, style);
			}			
		},
		setStyle:function(element, styles, camelized){
			if(!GLB.util.html)_log("Erro: O uso desse método (GLB.util.css.setStyle) exige o pacote GLB.util.html já carregado");			
			return 	_setStyle(element, styles, camelized);
		},
		getHeight: function(element) {
			return _getDimensions(element).height;
		},		
		getWidth: function(element) {
			return _getDimensions(element).width;
		},
		getPosition:function(element){
			return _getPosition(element);
		},
		addClass:function(element, _class){
			return _addClass(element, _class);
		},
		removeClass:function(element, _class){
			return _removeClass(element, _class);
		},
		replaceClass:function(element, _classOld, _classNew){
			return _replaceClass(element, _classOld, _classNew);
		},
		checkClass:function(element, _class){
			return _checkClass(element, _class);
		}
	}
}();

