/**
 *  planbord.js
 *  @author Henk Sch�fer
 *  
 */
var numfields; // Aantal planbord velden (hoeveel dagen per rij);
var acconamen = new Array(); // accommodatienamen 
var accoids = new Array();	// accomodatieids
var accodata = new Array(); // isSelected? (true wanneer geselecteerd.
var bloktypennamen = new Array();
var bloktypenids =  new Array();
var bloktypenkleuren = new Array();
var cellmatrix =  new Array; // bevat het type van alle zichtbare cellen
var vectorkleuren = new Array();
//var fieldsarray = new Array(); 
var alledata = new Array();
// popup menu
var posx = 0;
var posy = 0;
var menActive = false;
var kleurActive = false;
var blokset = false;
var scriptself;
var accosoortid;
var huidigtype = -1; // Bijhouden wat we aan het selecteren zijn
var aanEenGesloten = false; // aaneengeslotenrij? Alleen aaneengesloten rij kan worden gereserveerd.
var aantalselected = 0;
var mult; // meerdere rijen
var eerstecell;
var laatstecell = -1;
var mousedown = false;
var resmogelijk;
document.onselectstart = function () { return false; }; 
function disableSelection(element) {
	element.onselectstart = function() {
		return false;
	}
	element.unselectable = "on";
	element.style.MozUserSelect = "none";
	element.style.cursor = "default";
}
function mup(){
	mousedown = false;
}

function mdown(){
	mousedown = true;	
}
function fillRange(){
	n = eerstecell.split("|");
	astart = parseInt(n[1]);
	n = laatstecell.split("|");
	aeind = parseInt(n[1]);
	if(astart<aeind){
		start = eerstecell;
		eind = laatstecell;
	}else{
		start = laatstecell;
		eind = eerstecell;
	}
	tmp = start.split("|");
	u = parseInt(tmp[0]);
	ac = acconamen[u];
	//alert(ac);
	start = parseInt(tmp[1]);
	tmp = eind.split("|");
	eind = parseInt(tmp[1]);
	len = eind;
	for(bbb=start;bbb<len;bbb++){
	
		datumkey = alledata[bbb]; // dit is de datum van de cell
		i = ac+"["+datumkey+"]";
		selectCell(i);
	}
	eerstecell = -1;
}
function checkDrag(i){
	//if(mousedown){
	//	selectCell(i);
	//}
}
function initCelMatrix()
{
	/*
	rijen  = acconamen.length;
	dagen = alledata.length;
	for(t=0;t<rijen;t++)
	{
		cellmatrix[t] = new Array;
		for(y=0;y<dagen;y++)
		{
			accoid = acconamen[t]+"["+alledata[y]+"]";
			
			decell = $(accoid).getStyle('background-color');
			if (decell == "ff0000") {
				type = 1000;
			}
			else 
			{
				type = vectorkleuren.find(decell);
				cellmatrix[t][y] = type;
			}
		}	
	}
	//showCellMatrix();
	*/
}
function cellenActief(hettype)
{

	lenacco = accoids.length;
	for(t=0;t<lenacco;t++)
	{
		lendata = accodata[t].length;
		for(y=0;y<lendata;y++)
		{
			if(accodata[t][y])
			{
				return true;			
			}
		}	
	}
	return false;
}
function showCellMatrix(){
	len = cellmatrix.length;
	for(t=0;t<len;t++){
		len2 = cellmatrix[t].length;
		for(y=0;y<len2;y++){
			
		}
	}
}
function delBlok(){
	//document.getElementById("planpopup").style.display = "none";
	document.getElementById("deblokkeren_link").disabled = true;
	lenacco = accoids.length;
	lendata = alledata.length;
	aform = document.createElement("form");
	aform.id = "blok_verw";
	aform.method = "post";
	fdiv = document.getElementById("hidden_form");
	for(t=0;t<lenacco;t++)	{
		for(y=0;y<lendata;y++)
		{
			if(accodata[t][y])
			{
				el = document.createElement("input");
				el.type = "hidden";
				el.name = "deblok["+accoids[t]+"]["+y+"]";
				el.value = alledata[y];
				aform.appendChild(el);
			}		
		}	
	}
	el = document.createElement("input");
	el.name = "actie";
	el.value = "blok_verw";
	el.type = "hidden";
	aform.appendChild(el);
	fdiv.appendChild(aform);
	document.getElementById("blok_verw").submit();
}
function addReservering(){
	// Controleren van geselecteerde rij en data + locatieid doorgeven aan boekings module.
	
}
function addBlok(val){
	// Blokkeert geselecteerde periode
	// data en locatie id halen
	//document.getElementById("planpopup").style.display = "none";
	document.getElementById("blokkeren_link").disabled = true;
	len = accoids.length;
	// locatieid
	lc = 0;
	for(t=0;t<len;t++){
		if(accodata[t].find(true) > -1){
			lc = t;
			break;
		}	
	}
	// data
	locatie = accoids[lc];
	alldates = "";
	len = alledata.length;
	//alert(len);
	len2 = accoids.length;
	
	aform = document.createElement("form");
	aform.method = "post";
	fdiv = document.getElementById("hidden_form");
	aform.id = "bloktoev";
	loc = document.createElement("input");
	loc.type = "hidden";
	loc.name = "locatie_id";
	loc.value = locatie;
	deactie = document.createElement("input");
	deactie.type = "hidden";
	deactie.name = "actie";
	deactie.value = "blok_toev";
	deaccosoort = document.createElement("input");
	deaccosoort.type = "hidden";
	deaccosoort.name = "accosoortid";
	deaccosoort.value = accosoortid;
	hettype = document.createElement("input");
	hettype.type = "hidden";
	hettype.name = "blok_type";
	
	tmp4 = bloktypennamen.find(val);
	hettype.value = bloktypenids[tmp4];
	
	aform.appendChild(loc);

	for(y=0;y<len2;y++){  // voor iedere locatie
		for(t=0;t<len;t++) { // voor iedere dag
			if (accodata[y][t]){
				alldates = alldates + alledata[t] + ":";
			}
		}
		dedata = document.createElement("input");
		dedata.type="hidden";
		dedata.name = "blok_data["+accoids[y]+"]";
		dedata.value = alldates;
		aform.appendChild(dedata);
		alldates = "";
	}
	
	
	aform.appendChild(deactie);
	aform.appendChild(deaccosoort)
	aform.appendChild(hettype);
	fdiv.appendChild(aform);
	document.getElementById("bloktoev").submit();
	
	//parent.location.href = scriptself+"?actie=blokdit&loc="+loc+"&dedata="+alldates;
	
}
function initSelf(val)
{
	scriptself = val;
}
function initAccommodatiesoort_id(val)
{
	accosoortid = val;	
}
function get_mouse_pointer_coordinates(e)
{
	if (!e) var e = window.event;
	if (e.pageX || e.pageY) 
	{
		posx = e.pageX;
		posy = e.pageY;
	}
	else if (e.clientX || e.clientY) 
	{
		posx = e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft;
		posy = e.clientY + document.body.scrollTop + document.documentElement.scrollTop;
}
//You have the coordinates in the posx and posY variables
//You can do whatever you want with them after this point
}
function showReserveerInfo(resid, vletters, anaam,bdag,bdatum, acco,edag,edatum,kenmerken,opmerkres,opmerkgast, obj)
{
	//alert(resid+vletters+anaam+bdag+bdatum+acco+edag+edatum);
	document.getElementById("vletters").innerHTML = vletters;
	document.getElementById("anaam").innerHTML = anaam;
	document.getElementById("van").innerHTML = "Van: &nbsp;";
	document.getElementById("begindag").innerHTML = bdag;
	document.getElementById("bdatum").innerHTML = bdatum;
	document.getElementById("Accommodatiesoort").innerHTML = "Accommodatiesoort: &nbsp;";
	document.getElementById("accosoort").innerHTML = acco;
	document.getElementById("Reserveringsnummer").innerHTML = "Reserveernummer: &nbsp;";
	document.getElementById("resnummer").innerHTML = resid;
	document.getElementById("tot").innerHTML = "Tot: &nbsp;";
	document.getElementById("einddag").innerHTML = edag;
	document.getElementById("edatum").innerHTML = edatum;
	if(kenmerken != ""){
		document.getElementById("Kenmerken").innerHTML = "Kenmerken: &nbsp;";
		document.getElementById("kenmerken").innerHTML = kenmerken;
	}else{
		document.getElementById("Kenmerken").innerHTML = "";
		document.getElementById("kenmerken").innerHTML = '';
	}
		
	if(opmerkres != ""){
		document.getElementById("OpmerkingenReservering").innerHTML = "Opmerkingen reservering: &nbsp";
		document.getElementById("opmerkres").innerHTML = opmerkres;
	}else{
		document.getElementById("OpmerkingenReservering").innerHTML = "";
		document.getElementById("opmerkres").innerHTML = '';
	}
	if(opmerkgast != ""){
		document.getElementById("OpmerkingenGast").innerHTML = "Opmerkingen gast: &nbsp;";
		document.getElementById("opmerkgast").innerHTML = opmerkgast;	
	}else{
		document.getElementById("OpmerkingenGast").innerHTML = "";
		document.getElementById("opmerkgast").innerHTML = "";
	}
	//$('tooltip').style.top = ($(obj.id).positionedOffset().top - $('scollwindow').scrollTop + 10 - 205)+ 'px';
	//$('tooltip').style.bottom = (findPos(obj)- $('scollwindow').scrollTop + $('scollwindow').scrollBottom + 405) + 'px';
	//$('tooltip').style.bottom = ($(obj.id).positionedOffset().top - $('scollwindow').scrollTop + $('scollwindow').scrollBottom + 405) + 'px';
	var pos = getElementAbsolutePos(obj);     

	//$('tooltip').style.bottom = pos.y + 'px';
	//alert($(obj.id).positionedOffset().top);
	//alert(pos.y);
	//alert($('scollwindow').offset().top);
	//$('tooltip').style.bottom = ($(obj.id).positionedOffset().top - $(document).scrollTop() - $('scollwindow').offset().top) + 'px';
	//var winY = (document.all)?window.screenTop:window.screenY;
	//document.getElementById("opmerkgast").innerHTML = window.scrollheight;
	// is position from bottom
	//$('tooltip').style.bottom =(700 - pos.y) + "px";
	
	if ($(obj.id).positionedOffset().left > 600) {
		$('tooltip').style.left = ($(obj.id).positionedOffset().left + 20 - 600) + 'px';
	}
	else {
		$('tooltip').style.left = ($(obj.id).positionedOffset().left + 20) + 'px';
	}
	
	$('tooltip').show();
	
	winheight = document.getElementById("tooltip").offsetHeight;
	$('tooltip').style.top = pos.y  - winheight + 15 + "px";	
	
}
function blokeerInfo(id,date,locatie, obj)
{
	//alert(id);
	document.getElementById("locatie").innerHTML = locatie;
	document.getElementById("v_startDatum").value = date;
	document.getElementById("v_eindDatum").value = date;
	document.getElementById("locatie_id").value = locatie;

	$('tooltip2').style.top = ($(obj.id).positionedOffset().top + 10 - 75)+ 'px';
	$('tooltip2').style.left = ($(obj.id).positionedOffset().left + 20) + 'px';
	$('tooltip2').show();	
	
}
function clearResInfo()
{
	
	document.getElementById("vletters").innerHTML = "";
	document.getElementById("anaam").innerHTML = "";
	document.getElementById("tot").innerHTML = "";
	document.getElementById("begindag").innerHTML = "";
	document.getElementById("bdatum").innerHTML = "";
	document.getElementById("Accommodatiesoort").innerHTML = "";
	document.getElementById("accosoort").innerHTML = "";
	document.getElementById("resnummer").innerHTML = "";
	document.getElementById("van").innerHTML = "";
	document.getElementById("einddag").innerHTML = "";
	document.getElementById("edatum").innerHTML = "";
	
	document.getElementById("OpmerkingenReservering").innerHTML = "";
	document.getElementById("opmerkres").innerHTML = "";
	document.getElementById("OpmerkingenGast").innerHTML = "";
	document.getElementById("opmerkgast").innerHTML = "";
	
	
	$('tooltip').hide();
	$('tooltip2').hide();
}

function dateFromId(eenid){
	// Stript de datum van de id tag van de cell
	tmp1 = eenid.split("[");
	acco = tmp1[0];
	tmp2 = tmp1[1].split("]");
	return tmp2[0];
	
}
function accoFromId(eenid){
	// Stript de accorij van de id tag van de cell
	tmp1 = eenid.split("[");
	acco = tmp1[0];
	return acco;
}
function enableLink(anid,c)
{
	if (c) {
		document.getElementById(anid, c).className = c;
	}
	else {
		document.getElementById(anid, c).className = "actief";
	}
}
function disableLink(anid, c)
{
	if (c) {
		document.getElementById(anid).className = c;
	}
	else {
		document.getElementById(anid).className = "nonactief";
	}
}
function makeMenu(mul, resmogelijk, sd, ed){
	// Bouwt het rechtermuis menu voor het planbord op
	adiv = document.getElementById("planpopup");
	if (menActive){
		menActive = false;
		adiv.style.display = "none";
	}else {
		menActive = true;
		//document.getElementById("kleuren_menu").style.display = "none";
		adiv.style.display = ""	
		thediv = document.getElementById("subplanmenu");	
		oBlok = document.getElementById("blokkeren_link");
		oBlok.style.cursor = "pointer";
		oBlok.className = "";
		oKleuren = document.getElementById("kleuren_menu");
		 if (blokselect) {
			enableLink("blokkeren_link","navitem_nonactief");
			
		}else{
			oBlok.className = "";
			oBlok.onclick = function(){
				addBlok(this.id);
			}
		}
	
		//oRes = document.getElementById("reserveren_link");
		oDeblok = document.getElementById("deblokkeren_link");
		if(blokselect){
			document.getElementById("deblokkeren_link").className ="";
			oDeblok.onclick = function(){
				delBlok();								
			}		
		}else{
			disableLink("deblokkeren_link","navitem_nonactief");

		}
		
		// Reset knop (reset de huidige selectie
		//oReset = document.getElementById("resetselectie_link");
		//oReset.onclick = function(){
		//	resetFields();		
		//}
	
		//reslink = document.getElementById("reserveren_link");
		//reslink.className = "";
	                   
		thediv.style.position = "fixed";
		thediv.style.visibility = "hidden";
		thediv.style.display = "block";

		// On the fly menu links instellen		
		// Meerdere rijen ?
		
		
		// einde menu links
		var iPopHeight = thediv.offsetHeight;
		var iPopWidth = thediv.offsetWidth;
		var screenW = document.documentElement.clientWidth;
		var screenH = document.documentElement.clientHeight;
		var browserversion = "1";
		browsername = navigator.appName;
		
		// IE6 hack
		if (navigator.appVersion.indexOf("6.") != -1) {
			browserversion = "6"
		};
		if ((browserversion = "6") && (browsername.indexOf("Microsoft") != -1)) {
			var sHori = document.documentElement.scrollTop;
			var sVert = document.documentElement.scrollLeft;
			//iPosLeft = ((screenW - iPopWidth)/2)+sVert;
			iPosLeft = posx;
			//iPosTop = ((screenH - iPopHeight)/2)+sHori;
			iPosTop = posy;
			thediv.style.left = iPosLeft;
			thediv.style.top = iPosTop;
			thediv.style.position = 'absolute';
		}
		// all the normal browsers
		else {
			//iPosLeft = (screenW - iPopWidth)/2;
			iPosLeft = posx;
			//iPosTop = (screenH - iPopHeight)/2;
			iPosTop = posy;
			thediv.style.left = iPosLeft + 'px';
			thediv.style.top = (iPosTop-75) + 'px';
		}
		thediv.style.visibility = "";
	}
}

function initKleuren()
{
	tmp = document.createElement("p");
	vectorkleuren[0] = "yellow";
	tmp.style.backgroundColor = "#ff0000";
	vectorkleuren[1000] = tmp.style.backgroundColor; // Rood: reservering
	tmp.style.backgroundColor = "#008000";
	vectorkleuren[1001] = tmp.style.backgroundColor; // Groen: niet geselecteerd
	tmp.style.backgroundColor = "#0000ff";
	vectorkleuren[1002] = tmp.style.backgroundColor; // Blauw: geselecteerd
}
function rightClick(theid)
{
	
	// Contextmenu openen voor planbord	
	eendatum = dateFromId(theid);
	// Positie van de mousecursor
	// Kijk of er selecties zijn gemaakt in 1 van de rijen
	len = acconamen.length;
	selecties = false;
	multiple = 0; // aantal rijen
	for(t=0;t<len;t++)
	{
		if(accodata[t].find(true) > -1)
		{
			selecties = true;
			multiple++;
		}
	}
	// startdatum en einddatum init
	startdatum = 0;
	einddatum = 0;

	if(selecties){
		// kijken of het een aaneengesloten rij is.
		if(multiple<2 && selecties){ // Alleen reserveren bij enkele rij
			ac = accoFromId(theid);
			rij = acconamen.find(ac);
			resmogelijk = accoids[rij];// is reserveren mogelijk (aaneengesloten rij), dan accoid meegeven;
			len = accodata[rij].length;

			selectie = false;
			emptiecell = false;
			gap = false;
			for(t=0;t<len;t++){
				if(accodata[rij][t]){ // is deze cell geselecteerd?
					if(!selectie){
						selectie = true;
						startdatum = alledata[t];
					}else{
						if(emptiecell){ // zijn we een lege cel tegengekomen?
							gap = true;
							break;
						}else{
							einddatum = alledata[t];
						}
					}
				}else{ // cell niet geselecteerd
					if(selectie){ // Zijn we al geselecteerde cellen tegengekomen?
						emptiecell = true;
					}
				}
			}
			if(gap){
				resmogelijk = -1;
			}		
		}
	}
	mult = multiple;
	makeMenu(multiple, resmogelijk, startdatum,einddatum)
}

function selectCell(theid)
{
	/*
	el = document.getElementById(theid);
	// id string knippen
	tmp1 = theid.split("[");
	acco = tmp1[0];
	tmp2 = tmp1[1].split("]");
	thedate = tmp2[0];
	accokey = acconamen.find(acco); // Dit is de locatie van de rij
	datumkey = alledata.find(thedate); // dit is de datum van de cell
	// Indien submenu, uitzetten
	if (menActive) {
		menActive = false;
		kleurActive = false;
		adiv = document.getElementById("planpopup");
		//removeChilds(adiv);
		adiv.style.display = "none";
	} else {
		// Start
		// type  van de cell bepalen
		kleur = el.style.backgroundColor;
		hettype = vectorkleuren.find(kleur);
		
		if (kleur == vectorkleuren[1002]){ // is de cell geselecteerd?
			el.style.backgroundColor = vectorkleuren[cellmatrix[accokey][datumkey]];
			accodata[accokey][datumkey] = false;
		}
		else {
			if (huidigtype == -1){ // niet geselecteerd, type niet gezet?
				eerstecell = accokey+"|"+datumkey; // eerste cell instellen voor range selectie
				huidigtype = hettype;
			}
			if (huidigtype == hettype){ // Type gelijk aan cel type? Dan selecteren
				accodata[accokey][datumkey] = true;
				if(eerstecell == -1){
					eerstecell = accokey+"|"+datumkey;
				}
				laatstecell=accokey+"|"+datumkey; // laatste cell instellen voor range selectie
				el.style.backgroundColor = vectorkleuren[1002];
				if (huidigtype != 1001 && huidigtype != 1002 && huidigtype != -1) {
					blokselect = true;
				}
				else {
					blokselect = false;
				}
			}
		}
		// kijken of er nog cellen actief zijn
		
		test = cellenActief(hettype);
		if (!test) // Wanneer er geen cellen meer zijn geselecteerd, type resetten.
		{
			huidigtype = -1;
			blokselect = false;
		}
	}
	*/
}
function initBlokTypen(btypen){
	bloktypenkleuren[1] = "yellow";
	bloktypenkleuren[1001] = "#008000";
	bloktypenkleuren[1002] = "#0000ff";

}
function initAccos(avar)
{
	actmp = avar.split("|");
	len = actmp.length;
	for(t=0;t<len;t++)
	{
		if (actmp[t]) {
			tmp = actmp[t].split(":");
			acconamen[t] = tmp[1];
			accoids[t] = tmp[0];
			accodata[t] = new Array;
			len = alledata.length;
			for (y = 0; y < len; y++) {
				accodata[t][y] = false;
			}
		}
	}
}
function initDates(data)
{
	alledata = data.split("|");
}
function initFields(aantal)
{

}
function resetFields()
{
	// reset de huidige selectie
	rijen = acconamen.length;
	dagen = alledata.length;
	huidigtype = -1;
	for(t=0;t<rijen;t++)
	{
		for(y=0;y<dagen;y++)
		{
			accoid = acconamen[t]+"["+alledata[y]+"]";
			type = cellmatrix[t][y];
			kleur = vectorkleuren[type];
			accodata[t][y] = false;
			//$(accoid).setStyle('background-color', bloktypenkleuren[type]);
			document.getElementById(accoid).style.backgroundColor = bloktypenkleuren[type];	
		}	
	}
	document.getElementById("planpopup").style.display = "none";
}
function showBlokInfo(eenId)
{
	// Laat blokkeringinfo zien bij mouseover.
	tmp = eenId.split("[");
	denaam = tmp[0];
	tmp2 = tmp[1].split("]");
	dedatum = tmp2[0];	

}
// Functies voor het gehele systeem, later verplaatsen naar een 'tommywide' include
function removeChilds(cell)
{
	if ( cell.hasChildNodes() )
	{
		while ( cell.childNodes.length >= 1 )
		{
			cell.removeChild( cell.firstChild );       
		} 
	}
}
Array.prototype.find = function (element)
{
	for (var keys in this)
	{
		if (this[keys] == element)
		{
			return keys;
			break;
		}
	}
	return -1;
}

function doHide(el){
	document.getElementById(el).style.display = 'none';
}


function __getIEVersion() {
    var rv = -1; // Return value assumes failure.
    if (navigator.appName == 'Microsoft Internet Explorer') {
        var ua = navigator.userAgent;
        var re = new RegExp("MSIE ([0-9]{1,}[\.0-9]{0,})");
        if (re.exec(ua) != null)
            rv = parseFloat(RegExp.$1);
    }
    return rv;
}

function __getOperaVersion() {
    var rv = 0; // Default value
    if (window.opera) {
        var sver = window.opera.version();
        rv = parseFloat(sver);
    }
    return rv;
}

var __userAgent = navigator.userAgent;
var __isIE =  navigator.appVersion.match(/MSIE/) != null;
var __IEVersion = __getIEVersion();
var __isIENew = __isIE && __IEVersion >= 8;
var __isIEOld = __isIE && !__isIENew;

var __isFireFox = __userAgent.match(/firefox/i) != null;
var __isFireFoxOld = __isFireFox && ((__userAgent.match(/firefox\/2./i) != null) || 
	(__userAgent.match(/firefox\/1./i) != null));
var __isFireFoxNew = __isFireFox && !__isFireFoxOld;

var __isWebKit =  navigator.appVersion.match(/WebKit/) != null;
var __isChrome =  navigator.appVersion.match(/Chrome/) != null;
var __isOpera =  window.opera != null;
var __operaVersion = __getOperaVersion();
var __isOperaOld = __isOpera && (__operaVersion < 10);

function __parseBorderWidth(width) {
    var res = 0;
    if (typeof(width) == "string" && width != null && width != "" ) {
        var p = width.indexOf("px");
        if (p >= 0) {
            res = parseInt(width.substring(0, p));
        }
        else {
     		//do not know how to calculate other values 
		//(such as 0.5em or 0.1cm) correctly now
    		//so just set the width to 1 pixel
            res = 1; 
        }
    }
    return res;
}

//returns border width for some element
function __getBorderWidth(element) {
	var res = new Object();
	res.left = 0; res.top = 0; res.right = 0; res.bottom = 0;
	if (window.getComputedStyle) {
		//for Firefox
		var elStyle = window.getComputedStyle(element, null);
		res.left = parseInt(elStyle.borderLeftWidth.slice(0, -2));  
		res.top = parseInt(elStyle.borderTopWidth.slice(0, -2));  
		res.right = parseInt(elStyle.borderRightWidth.slice(0, -2));  
		res.bottom = parseInt(elStyle.borderBottomWidth.slice(0, -2));  
	}
	else {
		//for other browsers
		res.left = __parseBorderWidth(element.style.borderLeftWidth);
		res.top = __parseBorderWidth(element.style.borderTopWidth);
		res.right = __parseBorderWidth(element.style.borderRightWidth);
		res.bottom = __parseBorderWidth(element.style.borderBottomWidth);
	}
   
	return res;
}

//returns the absolute position of some element within document
function getElementAbsolutePos(element) {
	var res = new Object();
	res.x = 0; res.y = 0;
	if (element !== null) { 
		if (element.getBoundingClientRect) {
			var viewportElement = document.documentElement;  
 	        var box = element.getBoundingClientRect();
		    var scrollLeft = viewportElement.scrollLeft;
 		    var scrollTop = viewportElement.scrollTop;

		    res.x = box.left + scrollLeft;
		    res.y = box.top + scrollTop;

		}
		else { //for old browsers
			res.x = element.offsetLeft;
			res.y = element.offsetTop;

			var parentNode = element.parentNode;
			var borderWidth = null;

			while (offsetParent != null) {
				res.x += offsetParent.offsetLeft;
				res.y += offsetParent.offsetTop;
				
				var parentTagName = 
					offsetParent.tagName.toLowerCase();	

				if ((__isIEOld && parentTagName != "table") || 
					((__isFireFoxNew || __isChrome) && 
						parentTagName == "td")) {		    
					borderWidth = kGetBorderWidth
							(offsetParent);
					res.x += borderWidth.left;
					res.y += borderWidth.top;
				}
				
				if (offsetParent != document.body && 
				offsetParent != document.documentElement) {
					res.x -= offsetParent.scrollLeft;
					res.y -= offsetParent.scrollTop;
				}


				//next lines are necessary to fix the problem 
				//with offsetParent
				if (!__isIE && !__isOperaOld || __isIENew) {
					while (offsetParent != parentNode && 
						parentNode !== null) {
						res.x -= parentNode.scrollLeft;
						res.y -= parentNode.scrollTop;
						if (__isFireFoxOld || __isWebKit) 
						{
						    borderWidth = 
						     kGetBorderWidth(parentNode);
						    res.x += borderWidth.left;
						    res.y += borderWidth.top;
						}
						parentNode = parentNode.parentNode;
					}    
				}

				parentNode = offsetParent.parentNode;
				offsetParent = offsetParent.offsetParent;
			}
		}
	}
    return res;
}

