var Bubble = function(){
	
    return {
    	
    	bubbleCordinates: new Array(),
    	objCordinates:    new Array(),
    	objSizes:		  new Array(),
    	bubbleClasses:    new Array(),
    	bubbleSizes:	  new Array(),
    	objPositions:     new Array(),
    	closeButtons:	  new Array(),
    	positions:		  new Array(),
    	container:		  new Array(),
    	
    	cacheImage: function() {
			var cd = new Element ( 'div' , { 'id' : 'img-cache' }) ;
			$(cd).inject('site');
			var images = new Array('/template/new/images/right-top.png',
								   '/template/new/images/left-top.png',
								   '/template/new/images/close.gif');
			for (i = 0; i < images.length; i++) {
				var img = new Element ( 'img' , { 'src' : images[i] , 'width' : '1' , 'height' : '1' , 'border' : '0' }) ;
				$(img).inject('img-cache');
			}
    	},
    	
		showBubble: function(obj, bubbleID) {
			this.init(obj, bubbleID);

			if (arguments[2]) { this.closeButtons[bubbleID]				     = arguments[2]; }
			if ((arguments[3]) && (arguments[4])) { this.positions[bubbleID] = arguments[3]+'|'+arguments[4]; }
			if (arguments[5]) { this.container[bubbleID]				     = $(arguments[5]).getCoordinates(); }
			
			if ((typeof $(bubbleID).getStyle('visibility')) == 'string') {
				var visibility = $(bubbleID).getStyle('visibility');
			} else {
				var visibility = 'visible';
			}
			
			if (visibility == 'hidden') {
				$(bubbleID).setStyle('visibility', 'visible');
				if (this.closeButtons[bubbleID]) {
					if ($(bubbleID).getElements('div.hb-close').length) {
						$(bubbleID).getElements('div.hb-close').setStyle('visibility', 'visible');
						$(bubbleID).getElements('div.hb-close').addEvent('click', function(){
						    Bubble.hideBubble(bubbleID);
						});
					} else {
						alert(bubbleID+" has no contain div.hb-close div!");
					}
				}
				this.calculateAndSetPositions(obj, bubbleID);
			} else if (visibility == 'visible') {
				this.hideBubble(bubbleID);
			}
		},
		
		hideBubble: function(bubbleID) {
			this.unsetBubble(bubbleID);
			$(bubbleID).getElements('div.hb-close').setStyle('visibility', 'hidden');
			$(bubbleID).setStyle('visibility', 'hidden');
		},
		
		init: function(obj, bubbleID) {
			this.bubbleCordinates[bubbleID] = $(bubbleID).getCoordinates();
			this.objCordinates[bubbleID]    = $(obj).getCoordinates();
			this.objSizes[bubbleID]			= $(obj).getSize();
			/*
			if (this.objSizes[bubbleID].x == 0 || this.objSizes[bubbleID].y == 0) {
				var temp = new Element ( 'span' , { 'id' : 'temp' , 'style' : 'display: table' }) ;
				$(temp).inject('site');
				$('temp').innerHTML 		 = $(obj).innerHTML;
				this.objSizes[bubbleID].x 	 = $('temp').offsetWidth;
				this.objSizes[bubbleID].y 	 = $('temp').offsetHeight;
				this.objSizes[bubbleID].hack = true;
			}
			*/
			this.bubbleClasses[bubbleID]    = $(bubbleID).get('class').split(' ')[1];
		},
		
		calculateAndSetPositions: function(obj, bubbleID) {
			if (this.positions[bubbleID]) {
				var positions = this.positions[bubbleID].split('|');
				var x = positions[0];
				var y = positions[1];
				$(bubbleID).setStyle('top',  parseInt(y));
				$(bubbleID).setStyle('left', parseInt(x));
			} else {
				this.bubbleSizes[bubbleID] = $(bubbleID).getSize();
				if (this.container[bubbleID]) {
					var y = (this.objCordinates[bubbleID].top-this.container[bubbleID].top)-12;
					var x = ((this.objCordinates[bubbleID].left - this.container[bubbleID].left)-this.bubbleSizes[bubbleID].x)+20;
				} else {
					var y = this.objCordinates[bubbleID].top;
					var x = this.objCordinates[bubbleID].left;
				}
				switch(this.bubbleClasses[bubbleID]) {
					
					case 'hb-left-top' :
						$(bubbleID).setStyle('top', y + 5);
						$(bubbleID).setStyle('left',  (this.objCordinates[bubbleID].left - this.container[bubbleID].left) + this.objCordinates[bubbleID].width - 20);
					break;
					case 'hb-right-top' :
						$(bubbleID).setStyle('top',  y);
						$(bubbleID).setStyle('left', x);
					break;
					default:
						alert("Can't recognized the classname of bubble (id: "+bubbleID+")!");
					break;
				}
			}
		},
		
		unsetBubble: function(bubbleID) {
			this.objCordinates[bubbleID]    = null;
			this.objSizes[bubbleID]			= null;
			this.bubbleCordinates[bubbleID] = null;
			this.closeButtons[bubbleID]		= null;
			this.positions[bubbleID]		= null;
		}
    	
    };
    
}();

window.addEvent('domready', function(e) {
	Bubble.cacheImage();
});