if( typeof nameSpace == 'undefined' ){
	var nameSpace = {};
}

if( typeof nameSpace.modules == 'undefined' ){
	nameSpace.modules = {};
}

if( typeof $ == 'function' && typeof $$ == 'undefined' ){
	$(document).ready(function(){
		if( nameSpace.modules.balloon.autoInit ){
			nameSpace.modules.balloon.init();
		}
	});
}

nameSpace.modules.balloonStyle = [{name:'whiteBalloon', config:{maxWidth:155, stemHeight:51, padding:2, stemOverlap:2, vOffset:2, delayTime:0, allowFade:true, closeTop:8}}];

/////////////////////////////////////////////
// Class - nameSpace.modules.balloon
// Description - 
/////////////////////////////////////////////
nameSpace.modules.balloon = 
{

	/////////////////////////////////////////////
	// Define the properties of the class
	/////////////////////////////////////////////
	autoInit				: true,
	_objBalloonStyles		: {},
	_strSelector			: '.balloonTarget',
	_strBalloonId			: 'balloonPopup',
	_strBalloonSelector		: '#balloonPopup',
	_strBalloonInfoSelector	: '#balloonPopup .balloon',
	_strInfoSelector		: '.ballonInfo',
	_balloonInstance		: 0,
	_idTimeout				: '',
	_balloonActionInit		: false,
	_bolIsBalloonOver		: false,
	_eCurrent				: null,
	
	/////////////////////////////////////////////
	// Function - nameSpace.modules.balloon.init
	/////////////////////////////////////////////
	//init : function( elementId, options )
	init : function( objOverride )
	{
		if(nameSpace.modules.balloon.checkRequirements()){
			if( typeof objOverride == 'object' ){
				nameSpace.modules.balloon.overrideParams( objOverride );
			}
			nameSpace.modules.balloon.loadBalloonStyles();
			nameSpace.modules.balloon.setActions();
		}
	},
	
	/////////////////////////////////////////////
	// Function - nameSpace.modules.balloon.checkRequirements
	/////////////////////////////////////////////
	checkRequirements : function() 
	{
		var message = '';
		
		if( typeof $ != 'function' || typeof $$ != 'undefined' ){
			message += '* File is missing: jquery\n';
		}
		
		if( typeof Balloon != 'function' ){
			message += '* File is missing: balloon.js\n';
		}
		
		if( message != '' ){
			alert(message);
			return false;
		}
		
		return true;
	},
	
	/////////////////////////////////////////////
	// Function - nameSpace.modules.balloon.overrideParams
	/////////////////////////////////////////////
	overrideParams : function( e ) 
	{
		for( var i in e ){
			if( typeof e[i] == typeof nameSpace.modules.balloon[i] ){
				nameSpace.modules.balloon[i] = e[i];
			}
		}
	},
	
	/////////////////////////////////////////////
	// Function - nameSpace.modules.balloon.loadBalloonStyles
	/////////////////////////////////////////////
	loadBalloonStyles : function() 
	{
		var s = nameSpace.modules.balloonStyle, o,c,n,i,j;
		for( i in s ){
			n = s[i].name;
			c = s[i].config;
			o = new Balloon;
			for( j in c ){
				o[j] = c[j];
			}
			nameSpace.modules.balloon._objBalloonStyles[n] = o;
		}
	},
	
	/////////////////////////////////////////////
	// Function - nameSpace.modules.balloon.setActions
	/////////////////////////////////////////////
	setActions : function() 
	{
		var i = 0;
		$(nameSpace.modules.balloon._strSelector).each( function(){
			i++;
			$(this)
				.attr('balloonInstance', i)
				.mouseover( function(e){
					nameSpace.modules.balloon.onItemOver(e,$(this));
				})
				.mouseout( function(e){
					nameSpace.modules.balloon.onItemOut(e,$(this));
				});
		});
	},
	
	/////////////////////////////////////////////
	// Function - nameSpace.modules.balloon.setBalloonActions
	/////////////////////////////////////////////
	setBalloonActions : function(e)
	{
		$('#balloon')
			.mouseover(nameSpace.modules.balloon.onBalloonOver)
			.mouseout(nameSpace.modules.balloon.onBalloonOut);
	},
	
	/////////////////////////////////////////////
	// Function - nameSpace.modules.balloon.checkShowBalloon
	/////////////////////////////////////////////
	checkShowBalloon : function(event, element)
	{
		nameSpace.modules.balloon.showBalloon(event, element);
	},
	
	/////////////////////////////////////////////
	// Function - nameSpace.modules.balloon.checkHideBalloon
	/////////////////////////////////////////////
	checkHideBalloon : function(event, element)
	{
		if(!nameSpace.modules.balloon._bolIsBalloonOver && nameSpace.modules.balloon.currentElement.get() == null){
			nameSpace.modules.balloon.hideBalloon(event, element);
		}
	},
	
	/////////////////////////////////////////////
	// Function - nameSpace.modules.balloon.showBalloon
	/////////////////////////////////////////////
	showBalloon : function(event, element)
	{
		var c, s = nameSpace.modules.balloon._objBalloonStyles[element.attr('balloonStyle')];
		if( typeof s != 'undefined' ){
			c = element.attr('balloonInstance');
			if( c != nameSpace.modules.balloon.current.get() ){
				nameSpace.modules.balloon.timeout.clear();
				nameSpace.modules.balloon.current.set(element.attr('balloonInstance'));
				nameSpace.modules.balloon.setContent(element);
				s.showTooltip(event,'load:' + nameSpace.modules.balloon._strBalloonId,1);
			}
		}
	},
	
	/////////////////////////////////////////////
	// Function - nameSpace.modules.balloon.hideBalloon
	/////////////////////////////////////////////
	hideBalloon : function(event, element)
	{
		Balloon.prototype.hideTooltip(1);
		nameSpace.modules.balloon.currentElement.clear();
		nameSpace.modules.balloon.current.clear();
		nameSpace.modules.balloon.timeout.clear();
	},
	
	/////////////////////////////////////////////
	// Function - nameSpace.modules.balloon.setContent
	/////////////////////////////////////////////
	setContent : function(e)
	{
		var c;
		c = e.find(nameSpace.modules.balloon._strInfoSelector).html();
		$(nameSpace.modules.balloon._strBalloonInfoSelector).html(c);
	},
	
	/////////////////////////////////////////////
	
	// Function - nameSpace.modules.balloon.current
	/////////////////////////////////////////////
	current : {
		set : function(i){
			nameSpace.modules.balloon._balloonInstance = i;
		},
		
		get : function(){
			return nameSpace.modules.balloon._balloonInstance;
		},
		
		clear : function(){
			nameSpace.modules.balloon._balloonInstance = null;
		}
	},
	
	/////////////////////////////////////////////
	
	// Function - nameSpace.modules.balloon.currentElement
	/////////////////////////////////////////////
	currentElement : {
		set : function(e){
			nameSpace.modules.balloon._eCurrent = e;
		},
		
		get : function(){
			return nameSpace.modules.balloon._eCurrent;
		},
		
		clear : function(){
			nameSpace.modules.balloon._eCurrent = null;
		}
	},
	
	/////////////////////////////////////////////
	// Function - nameSpace.modules.balloon.timeout
	/////////////////////////////////////////////
	timeout : {
		set : function(i){
			nameSpace.modules.balloon.timeout.clear();
			nameSpace.modules.balloon._idTimeout = i;
		},
		
		get : function(){
			return nameSpace.modules.balloon._idTimeout;
		},
		
		clear : function(){
			clearTimeout( nameSpace.modules.balloon._idTimeout )
			nameSpace.modules.balloon._idTimeout = null;
		}
	},
	
	/////////////////////////////////////////////
	// Function - nameSpace.modules.balloon.onItemOver
	/////////////////////////////////////////////
	onItemOver : function(event, element)
	{
		nameSpace.modules.balloon.currentElement.set(element);
		nameSpace.modules.balloon.checkShowBalloon(event, element);
	},
	
	/////////////////////////////////////////////
	// Function - nameSpace.modules.balloon.onItemOut
	/////////////////////////////////////////////
	onItemOut : function(event, element)
	{
		var i;
		nameSpace.modules.balloon.setBalloonActions();
		nameSpace.modules.balloon.currentElement.clear();
		nameSpace.modules.balloon.timeout.clear();
		i = setTimeout( function(){ nameSpace.modules.balloon.checkHideBalloon(event, element) }, 500);
		nameSpace.modules.balloon.timeout.set(i);
	},
	
	/////////////////////////////////////////////
	// Function - nameSpace.modules.balloon.onBalloonOver
	/////////////////////////////////////////////
	onBalloonOver : function()
	{
		nameSpace.modules.balloon._bolIsBalloonOver = true;
	},
	
	/////////////////////////////////////////////
	// Function - nameSpace.modules.balloon.onBalloonOut
	/////////////////////////////////////////////
	onBalloonOut : function(event)
	{
		var i, element = nameSpace.modules.balloon.currentElement.get();
		nameSpace.modules.balloon._bolIsBalloonOver = false;
		nameSpace.modules.balloon.timeout.clear();
		i = setTimeout( function(){ nameSpace.modules.balloon.checkHideBalloon(event, element) }, 500);
		nameSpace.modules.balloon.timeout.set(i);
	}
};