var Common = {
	
	DOM : {
		 addClass: function(el, className) {
			if (this.hasClass(el, className)) { return; }
			
			el['className'] = [el['className'], className].join(' ');
		  },
		
		removeClass : function(el, className) {
         var re = new RegExp('(?:^|\\s+)' + className + '(?:\\s+|$)', 'g');

			if (!this.hasClass(el, className)) { return; } 


			var c = el['className'];
			el['className'] = c.replace(re, ' ');
			
			if ( this.hasClass(el, className) ) {
			   this.removeClass(el, className);
			}

         },
	  
		hasClass: function(el, className) {
			 var re = new RegExp('(?:^|\\s+)' + className + '(?:\\s+|$)');

			 return re.test(el['className']);
		}

	},
	
	Event: {
		
		aObserves: [],
		
		add: function(oElement, sEventType, fEventFunction){
			
			if(oElement.sort && oElement.length) {
				
				for(var i = 0; i < oElement.length; i++){
					this.add(oElement[i], sEventType, fEventFunction);
				}
				
				return;
				
			}
			
			if(!sEventType.match && sEventType.length){
				
				for(var i = 0; i < sEventType.length; i++){
					this.add(oElement, sEventType[i], fEventFunction);
				}
				
				return;
			}
			
			if(oElement.addEventListener) {
				oElement.addEventListener(sEventType, fEventFunction, false);
			}
			else if(oElement.attachEvent){
				
				if(this.aObserves.length == 0){
					
					this.aObserves.push([oElement, sEventType, fEventFunction]);
					
					this.add(window, 'unload', this.detachObserves);
				}
				else {
					this.aObserves.push([oElement, sEventType, fEventFunction]);
				}
				
				oElement.attachEvent('on'+sEventType, fEventFunction);
				
			}
			
		},
		
		remove: function(oElement, sEventType, fEventFunction){
			
			if(oElement.sort && oElement.length) {
				
				for(var i = 0; i < oElement.length; i++){
					this.remove(oElement[i], sEventType, fEventFunction);
				}
				
				return;
				
			}
			
			if(!sEventType.match && sEventType.length){
				
				for(var i = 0; i < sEventType.length; i++){
					this.remove(oElement, sEventType[i], fEventFunction);
				}
				
				return;
			}
			
			if(oElement.removeEventListener) {
				oElement.removeEventListener(sEventType, fEventFunction, false);
			}
			else if(oElement.detachEvent){
				
				oElement.detachEvent('on'+sEventType, fEventFunction);
				
			}
			
		},
		
		detachObserves: function() {}
	}
};
