//   -----------
//  | bubble    |
//  |  -------  |
//  | | text  | |
//  | |       | |
//  |  -------  |
//   -----------

// Nazev CSS tridy, ktera bude prirazena bubline. CSS vlastnosti display, position, top a left jsou rizeny pomoci tohoto skriptu.
var BE_bubbleClassName = 'bubble';

// Nazev CSS tridy, ktera bude prirazena preloaderu. Preloader je DIV, ktery se zobrazi uvnitr bubble pred nactenim textu.
var BE_bubblePreloaderClassName = 'bubblePreloader';

// Adresa obrazku preloaderu
var BE_bubblePreloaderSrc = '/images/style/default/preloader.gif';

// Nazev CSS tridy, ktera bude prirazena textu v bubline.
var BE_bubbleTextClassName = 'bubbleText';

// Defaultne se bublina zobrazi presne v poloze mysi. Lze pridat pocet pixelu pro posun oproti leve strane (x) a vrsku (y)
var BE_xOffset = -20;
var BE_yOffset = 10;

// Jak bublinu schovavat. Varianty jsou:
//  auto  - automaticky po odjeti kurzorem pryc
var BE_bubbleHide = 'auto';

// Pocet milisekund pro zmizeni napovedy od sjeti z elementu. Ma efekt pouze pokud je BE_bubbleHide = 'auto'.
var BE_bubbleHideDelay = 400;

// Zobrazovat log dole na strance?
var BE_showLog = false;


//////////////////////////////////////
//                                  //
//    FUNKCE PRO BUDOUCI POUZITI    //
//                                  //
//////////////////////////////////////

function getPosition(e) {
	var x = 0;
	var y = 0;
	
	if (e.offsetParent) {
		while (e != null) {
			x += e.offsetLeft;
			y += e.offsetTop;
			e = e.offsetParent;
		}
	}
	
	return [x,y];
}

function getSize(e) {
	var x = 0;
	var y = 0;
	
	x += e.offsetWidth;
	y += e.offsetHeight;
	
	return [x,y];
}

//////////////////////////////////////
//                                  //
//   TADY POD TIM UZ NEUPRAVOVAT!   //
//                                  //
//////////////////////////////////////

var BE_timers = new Array;
var BE_events = new Array;
var BE_mousePosition = [0,0];
var BE_lastZindex = 0;

document.onmousemove = BE_setMousePosition;

function BE_addListener(element, type, expression) {
	if (window.addEventListener) {
		element.addEventListener(type, expression, false);
		return true;
	} else if (window.attachEvent) {
		element.attachEvent('on' + type, expression);
		return true;
	} else {
		return false;
	}
}

function BE_bubbleExists(id) {
	return document.getElementById(BE_getBubbleId(id)) ? true : false;
}

function BE_createBubble(id) {
	BE_writeLog('Vytvarim bublinu #'+id);
	var bubble = document.createElement('div');
	bubble.setAttribute('id', BE_getBubbleId(id));
	bubble.className = BE_bubbleClassName;
	BE_setBubblePosition(bubble);
	BE_writeLog('Zobrazuji bublinu #'+id);
	document.getElementsByTagName('body')[0].appendChild(bubble);
	
	BE_createPreloader(bubble);
	BE_createText(id);
	
	return bubble;
}

function BE_createPreloader(bubble) {
	var div = document.createElement('div');
	div.className = BE_bubblePreloaderClassName;
	div.innerHTML = '<img src="'+ BE_bubblePreloaderSrc +'" alt="loading" />';
	bubble.appendChild(div);
}

function BE_createText(id) {
	var bubble = BE_getBubble(id);
	var bubbleText = document.createElement('div');
	var response = AX_postRequest('getBubbleHelp', 'id='+id);
	var patt = new RegExp(/^OK /);
	if (patt.test(response)) {
		bubbleText.innerHTML = response.substr(3);
	} else {
		bubbleText.innerHTML = 'ERROR!';
	}
	bubbleText.className = BE_bubbleTextClassName;
	bubble.innerHTML = '';
	bubble.appendChild(bubbleText);
}

function BE_getBubble(id) {
	var bubble = document.getElementById(BE_getBubbleId(id));
	if (!bubble) {
		bubble = BE_createBubble(id);
	}
	
	return bubble;
}

function BE_getBubbleId(id) {
	return 'BE_bubbleID_'+id;
}

function BE_hideBubble(id) {
	if (BE_bubbleHide == 'auto') {
		if (BE_bubbleHideDelay > 0) {
			BE_writeLog('Casovani pro #'+id+' zapnuto');
			BE_timers[BE_getBubbleId(id)] = setTimeout('BE_hideBubbleNow("'+id+'")', BE_bubbleHideDelay);
		} else {
			BE_hideBubbleNow(id);
		}
	}
}

function BE_hideBubbleNow(id) {
	BE_writeLog('Schovavam bublinu #'+id);
	BE_timers[BE_getBubbleId(id)] = false;
	BE_getBubble(id).style.display = 'none';
}

function BE_isVisible(id) {
	var bubble = BE_getBubble(id);
	return bubble.style.display != 'none';
}

function BE_registerEvents(e, id) {
	var register = true;
	
	for (var i in BE_events) {
		if (BE_events[i] == e) {
			register = false;
			break;
		}
	}
	
	if (register) {
		BE_writeLog('Registrace eventu pro #'+id);
		BE_addListener(e, 'mouseout', function () { BE_hideBubble(id); });
		BE_addListener(BE_getBubble(id), 'mouseover', function () { BE_unhideBubble(id); });
		BE_addListener(BE_getBubble(id), 'mouseout', function () { BE_hideBubble(id); });
		BE_events[BE_events.length] = e;
	}
}

function BE_setBubblePosition(bubble) {
	BE_writeLog('Nastavuji pozici DIVu #'+bubble.getAttribute('id'));
	bubble.style.position = 'absolute';
	bubble.style.top = (BE_mousePosition[1]+BE_yOffset) +'px';
	bubble.style.left = (BE_mousePosition[0]+BE_xOffset) +'px';
}

function BE_setBubbleToTop(bubble) {
	if (BE_lastZindex>bubble.style.zIndex || BE_lastZindex==0) {
		BE_writeLog('Nastavuji DIV #'+bubble.getAttribute('id')+' do popredi');
		BE_lastZindex++;
		bubble.style.zIndex = BE_lastZindex;
	}
}

function BE_setMousePosition(event) {
	var x = 0;
	var y = 0;
	
	if (!event) {
		event = window.event;
	}
	if (document.all) {
		x = event.clientX + document.body.scrollLeft;
		y = event.clientY + document.body.scrollTop;
	} else {
		x = event.pageX;
		y = event.pageY;
	}
	
	BE_mousePosition = [x,y];
}

function BE_showBubble(e, id) {
	BE_unhideBubble(id);
	BE_registerEvents(e, id);
}

function BE_unhideBubble(id) {
	var bubble = BE_getBubble(id);
	if (BE_timers[BE_getBubbleId(id)]) {
		BE_writeLog('Casovani pro #'+id+' vypnuto');
		clearTimeout(BE_timers[BE_getBubbleId(id)]);
	}
	if (!BE_isVisible(id)) {
		BE_setBubblePosition(bubble);		
		BE_writeLog('Zobrazuji bublinu #'+id);
		bubble.style.display = 'block';
	}
	BE_setBubbleToTop(bubble);
}

function BE_writeLog(text) {
	if (BE_showLog) {
		var div = document.createElement('div');
		var str = document.createTextNode(text);
		
		div.appendChild(str);
		document.getElementsByTagName('body')[0].appendChild(div);
	}
}
