//----------------------------------------------------------
//Hover JavaScript for www.stadtplandienst.de
//Based on:
//http://webpages.charter.net/mmmbeer/code/arbitrary-hover/
//----------------------------------------------------------

/* this method is called onmouseover */
function eventHover(event){
	// get the element which initiated this event call
	var element = getElementFromEvent(event);
	// do not change the className, but rather append another
	element.src = element.src.replace('\_off', '_on');
}

/* this method is called onmouseout */
function eventUnHover(event){
	// get the element which initiated this event call
	var element = getElementFromEvent(event);
	// remove any reference to the "hover" class
	element.src = element.src.replace('\_on', '_off');
}

// generic element fetcher
function getElement(id){
	if (document.getElementById)
		return document.getElementById(id);
	if (document.all)
		return document.all[id];
	
	return null;
}

function getElementFromEvent(event) {
	if (event.srcElement)
		return event.srcElement;
	if (event.currentTarget)
		return event.currentTarget;
	return null;
}

//	generic event add method element,  [string],  [function name]
function addEventHandler(element, eventName, functionName){
	if (element.attachEvent)
		element.attachEvent('on' + eventName, functionName);
	if (element.addEventListener)
		element.addEventListener(eventName, functionName, false);
}

function arbitraryHoverHandlers(){
	// thanks Boki #javascript for clueing me into the wildcard
	// you can also replace the * with any specific element if you do not want to hover
	// everything
	var bodyElements;
	if (document.body.getElementsByTagName)	
	{
		bodyElements = document.body.getElementsByTagName("img");		
		attachArbitraryHoverHandlers(bodyElements);
		bodyElements = document.body.getElementsByTagName("input");		
		attachArbitraryHoverHandlers(bodyElements);
	}
	else
		return;
	
}

function attachArbitraryHoverHandlers(bodyElements){
	var preloadElements = new Array();
	for(var i=0; i<bodyElements.length; i++){
		if ( (bodyElements[i].tagName == "IMG" || bodyElements[i].tagName == "INPUT" && bodyElements[i].type == "image") && bodyElements[i].className == 'RollOver') {
			observeEvent(bodyElements[i], "mouseover", eventHover);
			observeEvent(bodyElements[i], "mouseout", eventUnHover);
			
			preloadElements[i] = new Image();
			preloadElements[i].src=bodyElements[i].src.replace('\_off', '_on');
		}
	}
}

// add the hovering onload
window.onload = startup;
var sid;

function poiHoverHandlers()
{
	var a=document.getElementsByTagName('input');
	var m = new String();
	for (var i=0;i<a.length;i++)
	{
		m = a[i].name;
		if (m.match("Map[0-9]{1,4}\_[0-9]{1,4}"))
		{
			observeEvent(a[i], "mousemove", Movens.bindAsEventListener(a[i]));
			observeEvent(a[i], "click", Clickns.bindAsEventListener(a[i]));
			//a[i].onmousemove=Movens;
			//a[i].onclick = Clickns;
		}
	}
}


function startup()
{
	//RollOver effect:
	arbitraryHoverHandlers();
	//POI RollOver Effect:
	if (typeof(poi_arr) != 'undefined')	poiHoverHandlers();
	if (window.jsmb && jsmb.length>0)	multihl();
	if(sid)
	    loadTooltipTemplate("poi");
}

// --- disable right clicks ------------
function RightClick(e)
{
	if (!document.all)
	{
		if (e.which == 3)
			return false;
	}

	return true;
}


function spdOpenWin(url, name, options)
{
	window.open(url, name, options);
	return true;
}

//document.onmousedown = RightClick;
//document.oncontextmenu = new Function("return false");
// -------------------------------------

/*
 *  Common JS Functions
 */
//replaces document.getElementById()
function $( element )   {
    if( typeof element == 'string' )
        return document.getElementById(element);
    else
        return element;
}
//useful method - still not included in all browsers
document.getElementsByClassName = function(className, parentElement) {
    var children = ($(parentElement) || document.body).getElementsByTagName('*'); var elements = new Array();
    for( var i = 0; i < children.length; i++ )  {
        var child = children[i];
        if(child.className.match(new RegExp("(^|\\s)" + className + "(\\s|$)")))
            elements.push(child);
    }
    return elements;
}
function removeChildrenRecursively(node)
{
    if (!node) return;
    while (node.hasChildNodes()) {
        removeChildrenRecursively(node.firstChild);
        node.removeChild(node.firstChild);
    }
}

//caching events as they may produce errors at unload, events are being stopped at unload
var EventCache = new Array();
//assigns an event handler
function observeEvent(element, type, listener, useCapture)  {
    var element = $(element);
    useCapture = useCapture || false;
    
    if(element.addEventListener)    {
        element.addEventListener(type, listener, useCapture);
        EventCache.push(new Array(element, type, listener, useCapture));
    }
    else if(element.attachEvent)    {
        element.attachEvent('on'+type, listener);
        EventCache.push(new Array(element, type, listener, useCapture));
    }
}

//removes an event handler
function stopObserving( element, type, listener, useCapture )   {
    var element = $(element);
    useCapture = useCapture || false;
    
    if(element.removeEventListener)
        element.removeEventListener(type, listener, useCapture);
    else
        element.detachEvent('on'+type, listener);
}
//stops the propagation of an event
function stopEvent(event) {
    if (event.preventDefault) {
      event.preventDefault();
      event.stopPropagation();
    } else {
      event.returnValue = false;
      event.cancelBubble = true;
    }
  }
function getEventObject(event)   {
    return event.target || event.srcElement;
}
function pointerX(event) {
    return event.pageX || (event.clientX +
      (document.documentElement.scrollLeft || document.body.scrollLeft));
  }

function pointerY(event) {
    return event.pageY || (event.clientY +
        (document.documentElement.scrollTop || document.body.scrollTop));
}
function unloadEventCache() {
    for( var i = 0; i < EventCache.length; i++ )    {
        stopObserving.apply(this, EventCache[i]);
        EventCache[i][0] = null; //cleans up the DOM Element
    }
    EventCache = false;
}
observeEvent(window, 'unload', unloadEventCache);

function pix( number )  {
    return parseInt(number) + 'px';
}

function newElement(tag, parent, attributes)    {
	var el = document.createElement(tag);	

	for (var att in attributes) {
		el.setAttribute (att, attributes[att]);
	}

    if(parent)
		parent.appendChild(el);
		
	return el;
}

Function.prototype.bindAsEventListener = function(object) {
  var __method = this;
  return function(event) {
    return __method.call(object, event || window.event);
  }
}

Function.prototype.bind = function() {
var __method = this, object = arguments[0]; args = new Array();
for( var i = 1; i < arguments.length; i++ )    {
    args.push(arguments[1]);
}
return function() {
    return __method.apply(object, args.concat(arguments));
  }
}
function cumulativeOffset(element) {
    var valueT = 0, valueL = 0;
    do {
      valueT += element.offsetTop  || 0;
      valueL += element.offsetLeft || 0;
      element = element.offsetParent;
    } while (element);
    return new Array(valueL, valueT);
  }
  
String.prototype.getQueryAttribute = function(attr)   {
    var matrix = new RegExp(attr + "=(\\w)&{0,1}", "i");
    var url = decodeURIComponent(this);
        try {
            return url.match(matrix)[1];
        }catch(e){
            return null;
        }
};
String.prototype.setQueryAttribute = function(name, value)   {
    var matrix = new RegExp("[\\?|&](" + name + "=\\w)&{0,1}", "i");
    var url = decodeURIComponent(this);
    var pairStr = name + "=" + value;
    if( m = url.match(matrix) )
        url = url.replace(m[1], pairStr);
    else
        url = url + (url.indexOf("?") == -1 ? "?" : "&") + pairStr;
        return url;
};

/*
 *  Ajax Library
 */
function createXMLHttpRequest() {
    try { return new ActiveXObject("Msxml2.XMLHTTP");    } catch(e) {}
    try { return new ActiveXObject("Microsoft.XMLHTTP"); } catch(e) {}
    try { return new XMLHttpRequest();                   } catch(e) {}
    alert("XMLHttpRequest not supported");
    return null;
}

function AjaxRequest(url, options)  {
    this.options = {
        method: options.method || "post",
        contentType: "application/x-www-form-urlencoded",
        asynchronous: options.asynchronous && true,
        parameters: options.parameters || '',
        onComplete: options.onComplete
    }
    if (this.options.parameters && this.options.parameters.length > 0) this.options.parameters += '&_=';
    this.url = url;
    if(this.options.method == "get")
        this.url += (this.url.match(/\?/) ? '&' : '?') + this.options.parameters;
    
    this.transport = createXMLHttpRequest();
    this.transport.open(this.options.method, this.url, this.options.asynchronous);
    
    if(this.options.asynchronous)
        this.transport.onreadystatechange = this.onStateChange.bind(this);
    if(this.options.method == "post")
        this.transport.setRequestHeader("Content-type", this.options.contentType);
    this.transport.send(this.options.parameters);
}

AjaxRequest.prototype = {
    onStateChange: function()   {
        var readyState = this.transport.readyState;
        if(readyState == 4) {
            this.options.onComplete(this.transport);
        }
    }
}

var PoiType = {Poi: "poi",
               Slot: "slot",
               SlotApotheken: "slotApotheken",
               SlotHRS: "slotHRS",
               SlotEventim: "slotEventim"
               };
var TooltipVisible = {PoiID: 0, Type: PoiType.Poi};
var TooltipThumbNailSize = 100;
var TooltipTemplate = {};
var isIE = navigator.userAgent.toLowerCase().match("msie");
var isSafari = navigator.userAgent.toLowerCase().match("safari");

function loadTooltipTemplate(type)
{	
    switch(type)
    {
        case PoiType.Poi:
            newElement("link", document.getElementsByTagName("head")[0], {id:"tooltipCss" + type,type:"text/css",rel:"stylesheet",href:TooltipAppDomain + "/TooltipTemplates/pois/tooltip.css?v=86"});                
            break;	        
        case PoiType.Slot:
            
            break;	                        
        case PoiType.SlotApotheken:
            newElement("link", document.getElementsByTagName("head")[0], {id:"tooltipCss" + type,type:"text/css",rel:"stylesheet",href:TooltipAppDomain + "/TooltipTemplates/apotheken/tooltip.css?v=86"});    
            break;	
        case PoiType.SlotHRS:
            newElement("link", document.getElementsByTagName("head")[0], {id:"tooltipCss" + type,type:"text/css",rel:"stylesheet",href:TooltipAppDomain + "/TooltipTemplates/HRS/tooltip.css?v=86"});    
            break;            	        
        case PoiType.SlotEventim:
            newElement("link", document.getElementsByTagName("head")[0], {id:"tooltipCss" + type,type:"text/css",rel:"stylesheet",href:TooltipAppDomain + "/TooltipTemplates/eventim/tooltip.css?v=86"});    
            break;	
    }

	var options = {
	    method: "get",
	    parameters: "sid="+sid+"&type="+type, 
	    asynchronous: false
	};    
    var req = new AjaxRequest(AppRootDir + "/gettooltiptemplate.asp",options);
    TooltipTemplate[type] = req.transport.responseText;
}

function requestTooltip(poi)   {
    if (TooltipVisible.PoiID == poi.id && TootipVisible.PoiType == poi.type) 
        return;
    
    if (!(PoiType.Poi == poi.type || TooltipTemplate[poi.type]))
        loadTooltipTemplate(poi.type);
    var tooltip = getPoiTooltipsByPoi(poi);
        
    if(!tooltip)   {
        var options = {
            method: "get",
            parameters: "sid="+sid+"&poiid="+poi.id+"&type="+poi.type,
            asynchronous: false
        }
        
        var req = new AjaxRequest(AppRootDir + "tooltip.asp", options);
        var tooltip = eval("("+req.transport.responseText+")");
        PoiTooltips.push(tooltip);
    }

    if(TooltipVisible)  {
        CloseTooltip();
    }
    
    switch(poi.type)
    {
        case PoiType.Poi:
            displayTooltipPoi(poi, tooltip);
            break;	        
        case PoiType.Slot:

            break;	                        
        case PoiType.SlotApotheken:
            displayTooltipSlotApotheken(poi, tooltip);
            break;	        	        
        case PoiType.SlotHRS:
            displayTooltipSlotHRS(poi, tooltip);
            break;	             
        case PoiType.SlotEventim:
            displayTooltipSlotEventim(poi, tooltip);
            break;	        	        
    }
    
}


function displayTooltipSlotApotheken(poi, json)   {
    var pos = cumulativeOffset($("map"));
    var wrap = newElement('div', document.getElementsByTagName("body")[0], {id:"tooltips"});
        wrap.innerHTML = TooltipTemplate[poi.type] || TooltipTemplate[PoiType.SlotApotheken];
                
    var divName = document.getElementsByClassName("tooltip-name", wrap)[0];
        divName.appendChild(document.createTextNode(json.Name));

    var divAddress = document.getElementsByClassName("tooltip-address", wrap)[0];
        divAddress.appendChild(document.createTextNode(json.Address));            
    
    if (json.Phone != null)
    {
        var divPhone = document.getElementsByClassName("tooltip-phone", wrap)[0];
        divPhone.appendChild(document.createTextNode(json.Phone));            
    }  
                        
    if (json.HomePageUrl == null)
    {
        var divRoom = document.getElementsByClassName("tooltip-room-bottom", wrap)[0];
        divRoom.parentNode.removeChild(divRoom);            
    }
    else
    {
        var divLink = document.getElementsByClassName("tooltip-homepageurl", wrap)[0];    
        var aLink = newElement("a",divLink, {});
        aLink.innerHTML = "&raquo; mehr Informationen";
        var extLinkURL = json.HomePageUrl;
        if (!/^(http:\/\/)/.test(extLinkURL))
            extLinkURL = "http://" + extLinkURL;            
        observeEvent(aLink, "click", function(){window.open(extLinkURL);return false;}.bind(this)); 
    }                
                
    var imgClose = document.getElementsByClassName("close-button", wrap)[0];        
    // Style the image button
	imgClose.style.cursor = 'pointer';
	imgClose.style.zIndex = '1000';
	// Attach close button event
	observeEvent(imgClose, 'click', function(event) { CloseTooltip(); stopEvent(event); }.bindAsEventListener(this));

    var content = wrap.lastChild;        
	// check if the dimensions of the whole window exceed the maximum width		
	var dimensions = {width: content.offsetWidth, height: content.offsetHeight};
	// force the size of the content box, since it tends to collapse when it's re-added to the DOM	
	content.style.width = pix(dimensions.width);
	content.style.height = pix(dimensions.height);				
	// Calculate box dimensions for further use
    wrap.style.width = pix(content.offsetWidth + 3);
    wrap.style.height = pix(content.offsetHeight + 3);
    
    wrap.style.position = "absolute";
    
    var startpos = new Array(pos[0] + poi.x, pos[1] + poi.y);

    var left = startpos[0] - 150;
    var top = startpos[1] - wrap.offsetHeight - poi.t;
        if( left + wrap.offsetWidth > pos[0] + $("map").offsetWidth )
            left -= (left + wrap.offsetWidth) - (pos[0] + $("map").offsetWidth);
        else if( left < pos[0] )
            left += pos[0] - left + 5;
    
    if(isIE) top += 3;

    wrap.style.left = pix(left);
    wrap.style.top = pix(top);
    
    TooltipVisible.PoiID = json.id;
    TooltipVisible.PoiType = json.type;       
    
    //log statistics
    
    var options = {
	    method: "get",
	    parameters: "sid="+sid+"&slotid=1&cid=203", 
	    asynchronous: false
	};    
    var req = new AjaxRequest(AppRootDir + "/slotgateway.asp",options); 
}


function displayTooltipSlotHRS(poi, json)   {       
    var pos = cumulativeOffset($("map"));
    var wrap = newElement('div', document.getElementsByTagName("body")[0], {id:"tooltips"});
        wrap.innerHTML = TooltipTemplate[poi.type] || TooltipTemplate[PoiType.SlotApotheken];
        
    if (json.PictureUrl != null)    
    {
        var divPic = document.getElementsByClassName("tooltip-pic", wrap)[0];
        var pic = newElement("img", divPic);
        pic.src = json.PictureUrl;  
        pic.title = "Mehr Informationen";      
        pic.alt = "Mehr Informationen";
        observeEvent(pic, "load", function() {
            var wrapOldHeight = wrap.offsetHeight;
            var element = document.getElementsByClassName("tooltip-container", wrap)[0];
            var th = document.getElementsByClassName("tooltip-title1", wrap)[0].offsetHeight;
            var ch = document.getElementsByClassName("tooltip-body", wrap)[0].offsetHeight;
            element.style.height = pix(th + ch + 12);
            wrap.style.height = pix(th + ch + 12);
            if( wrap.style.top )    //if loading is fast(image is cached) - will skip positioning
                wrap.style.top = pix(parseInt(wrap.style.top) + (wrapOldHeight - wrap.offsetHeight));
        });                               
    }
        
                
    var divTitle1 = document.getElementsByClassName("tooltip-title1", wrap)[0];
        divTitle1.appendChild(document.createTextNode(json.Title1));
       
    if (json.Title2 != null)
    {    
        var divTitle2 = document.getElementsByClassName("tooltip-title2", wrap)[0];
            divTitle2.appendChild(document.createTextNode(json.Title2));
    }
        
    var divAddress = document.getElementsByClassName("tooltip-address", wrap)[0];
        divAddress.appendChild(document.createTextNode(json.Address));            

    if (json.Price == null)
    {
        var divPrice = document.getElementsByClassName("tooltip-price-parent", wrap)[0];
        divPrice.parentNode.removeChild(divPrice);            
    }
    else
    {
        var spanPrice = document.getElementsByClassName("tooltip-price", wrap)[0];
            spanPrice.appendChild(document.createTextNode(json.Price.toFixed(2)));            
    }
                        
    if (json.HomePageUrl == null)
    {
        var divRoom = document.getElementsByClassName("tooltip-room-bottom", wrap)[0];
        divRoom.parentNode.removeChild(divRoom);            
    }
    else
    {
        var divLink = document.getElementsByClassName("tooltip-homepageurl", wrap)[0];    
        var aLink = newElement("a",divLink, {});
        aLink.innerHTML = "&raquo; mehr Informationen";
        var extLinkURL = json.HomePageUrl;
        if (!/^(http:\/\/)/.test(extLinkURL))
            extLinkURL = "http://" + extLinkURL;            
        observeEvent(aLink, "click", function(){window.open(extLinkURL);return false;}.bind(this)); 
        
        if (json.PictureUrl != null)
            observeEvent(pic, "click", function(){window.open(extLinkURL);return false;}.bind(this));
    }                
                
    var imgClose = document.getElementsByClassName("close-button", wrap)[0];        
    // Style the image button
	imgClose.style.cursor = 'pointer';
	imgClose.style.zIndex = '1000';
	// Attach close button event
	observeEvent(imgClose, 'click', function(event) { CloseTooltip(); stopEvent(event); }.bindAsEventListener(this));

    var content = wrap.lastChild;        
	// check if the dimensions of the whole window exceed the maximum width		
	var dimensions = {width: content.offsetWidth, height: content.offsetHeight};
	// force the size of the content box, since it tends to collapse when it's re-added to the DOM	
	content.style.width = pix(dimensions.width);
	content.style.height = pix(dimensions.height);				
	// Calculate box dimensions for further use
    wrap.style.width = pix(content.offsetWidth + 3);
    wrap.style.height = pix(content.offsetHeight + 3);
    
    wrap.style.position = "absolute";
    
    var startpos = new Array(pos[0] + poi.x, pos[1] + poi.y);

    var left = startpos[0] - 150;
    var top = startpos[1] - wrap.offsetHeight - poi.t;
        if( left + wrap.offsetWidth > pos[0] + $("map").offsetWidth )
            left -= (left + wrap.offsetWidth) - (pos[0] + $("map").offsetWidth);
        else if( left < pos[0] )
            left += pos[0] - left + 5;
    
    if(isIE) top += 3;

    wrap.style.left = pix(left);
    wrap.style.top = pix(top);
    
    TooltipVisible.PoiID = json.id;
    TooltipVisible.PoiType = json.type;       
    
    //log statistics    
    var options = {
	    method: "get",
	    parameters: "sid="+sid+"&slotid=2&cid=203", 
	    asynchronous: false
	};    
    var req = new AjaxRequest(AppRootDir + "/slotgateway.asp",options); 
}

function displayTooltipSlotEventim(poi, json)   {
    var pos = cumulativeOffset($("map"));
    var wrap = newElement('div', document.getElementsByTagName("body")[0], {id:"tooltips"});
        wrap.innerHTML = TooltipTemplate[poi.type] || TooltipTemplate[PoiType.SlotApotheken];
    
    var title = document.getElementsByClassName("tooltip-title", wrap)[0];
            title.appendChild(document.createTextNode(json.location + " - " + json.performer));

    for(var key in json)    {
        var domElements = document.getElementsByClassName("tooltip-" + key, wrap);
        for(var i = 0; i < domElements.length; i++) {
            var domElement = domElements[i];
            if(/url/.test(key)) {
                var url = json[key];
                /*observeEvent(domElement, "click", function(event)   {
                    window.open(url);
                });*/
                domElement.href = url;
                domElement.target = "_blank";
            }
            else
                domElement.appendChild(document.createTextNode(json[key]));
        }
    }
    
    if(json.pic)    {
        var pic = document.getElementsByClassName("tooltip-pic", wrap)[0];
        removeChildrenRecursively(pic);
        var img = newElement("img", pic);
            img.width = 100;
            img.height = 100;
            img.src = json.pic;
    }
    
    var desc = document.getElementsByClassName("tooltip-desc", wrap)[0];
    if(desc)
        desc.innerHTML = json.desc;
    
    /*var divAddress = document.getElementsByClassName("tooltip-address", wrap)[0];
        divAddress.appendChild(document.createTextNode(json.Address));            
    
    if (json.Phone != null)
    {
        var divPhone = document.getElementsByClassName("tooltip-phone", wrap)[0];
        divPhone.appendChild(document.createTextNode(json.Phone));            
    }  
                        
    if (json.HomePageUrl == null)
    {
        var divRoom = document.getElementsByClassName("tooltip-room-bottom", wrap)[0];
        divRoom.parentNode.removeChild(divRoom);            
    }
    else
    {
        var divLink = document.getElementsByClassName("tooltip-homepageurl", wrap)[0];    
        var aLink = newElement("a",divLink, {});
        aLink.innerHTML = "&raquo; mehr Informationen";
        var extLinkURL = json.HomePageUrl;
        if (!/^(http:\/\/)/.test(extLinkURL))
            extLinkURL = "http://" + extLinkURL;            
        observeEvent(aLink, "click", function(){window.open(extLinkURL);return false;}.bind(this)); 
    }   */             
                
    var imgClose = document.getElementsByClassName("close-button", wrap)[0];        
    // Style the image button
	imgClose.style.cursor = 'pointer';
	imgClose.style.zIndex = '1000';
	// Attach close button event
	observeEvent(imgClose, 'click', function(event) { CloseTooltip(); stopEvent(event); }.bindAsEventListener(this));

    var content = wrap.lastChild;        
	// check if the dimensions of the whole window exceed the maximum width		
	var dimensions = {width: content.offsetWidth, height: content.offsetHeight};
	// force the size of the content box, since it tends to collapse when it's re-added to the DOM	
	content.style.width = pix(dimensions.width);
	content.style.height = pix(dimensions.height);				
	// Calculate box dimensions for further use
    wrap.style.width = pix(content.offsetWidth + 3);
    wrap.style.height = pix(content.offsetHeight + 3);
    
    wrap.style.position = "absolute";
    
    var startpos = new Array(pos[0] + poi.x, pos[1] + poi.y);

    var left = startpos[0] - 150;
    var top = startpos[1] - wrap.offsetHeight - poi.t;
        if( left + wrap.offsetWidth > pos[0] + $("map").offsetWidth )
            left -= (left + wrap.offsetWidth) - (pos[0] + $("map").offsetWidth);
        else if( left < pos[0] )
            left += pos[0] - left + 5;
    
    if(isIE) top += 3;

    wrap.style.left = pix(left);
    wrap.style.top = pix(top);
    
    TooltipVisible.PoiID = json.id;
    TooltipVisible.PoiType = json.type;       
    
    //log statistics
    
    var options = {
	    method: "get",
	    parameters: "sid="+sid+"&slotid=3&cid=203", 
	    asynchronous: false
	};    
    var req = new AjaxRequest(AppRootDir + "/slotgateway.asp",options); 
}

    
function displayTooltipPoi(poi, json)   {
    var pos = cumulativeOffset($("map"));
    var wrap = newElement('div', document.getElementsByTagName("body")[0], {id:"tooltips"});
        wrap.innerHTML = TooltipTemplate[poi.type] || TooltipTemplate[PoiType.Poi];
    var divTitle = document.getElementsByClassName("tooltip-title1", wrap)[0];
        divTitle.appendChild(document.createTextNode(json.title1));
    
    if (json.hasphoto == true)
    {            
        var divPic = document.getElementsByClassName("tooltip-pic", wrap)[0];
        var pic = newElement("img", divPic);
        observeEvent(pic, "load", function(){
            var wrapOldHeight = wrap.offsetHeight;
            if(pic.offsetHeight > TooltipThumbNailSize)   {
                pic.style.height = pix(TooltipThumbNailSize);
            }
            var element = document.getElementsByClassName("tooltip-container", wrap)[0];
            var th = document.getElementsByClassName("tooltip-title1", wrap)[0].offsetHeight;
            var ch = document.getElementsByClassName("tooltip-body", wrap)[0].offsetHeight;
                element.style.height = pix(th + ch + 12);
                wrap.style.height = pix(th + ch + 12);
                if( wrap.style.top )    //if loading is fast(image is cached) - will skip positioning
                    wrap.style.top = pix(parseInt(wrap.style.top) + (wrapOldHeight - wrap.offsetHeight));
        });
        pic.src = AppRootDir + 'poiphoto.asp?sid=' + sid + '&POIID=' + json.id;
        pic.style.width = pix(TooltipThumbNailSize);
        var photoLink = newElement('a', divPic);
            photoLink.className = "red-logo-link";
            photoLink.innerHTML = "Jetzt klicken, um<br/>Bild zu vergr&ouml;&szlig;ern!";
            observeEvent(photoLink, "click", function(){window.open(AppRootDir + 'poiinfo.asp?sid=' + sid + '&poiid=' + json.id);return false;});
        
        observeEvent(pic, "click", function(){window.open(AppRootDir + 'poiinfo.asp?sid=' + sid + '&poiid=' + json.id);return false;});
    }            

    if (json.title2 != null)
    {
        var divInfo1 = document.getElementsByClassName("tooltip-title2", wrap)[0];
        divInfo1.appendChild(document.createTextNode(json.title2));            
    }  
    
    if (json.value1 != null)
    {
        var divValue1 = document.getElementsByClassName("tooltip-value1", wrap)[0];
        divValue1.appendChild(document.createTextNode(json.value1));            
    } 
    
    if (json.value2 != null)
    {
        var divValue1 = document.getElementsByClassName("tooltip-value2", wrap)[0];
        divValue1.appendChild(document.createTextNode(json.info2));            
    }  
                 
    if (json.desc != null)
    {
       var divDesc = document.getElementsByClassName("tooltip-desc", wrap)[0];
       divDesc.innerHTML = json.desc;              
    }
        
    if (json.moreinfo == true)
    {
        var divLink = document.getElementsByClassName("tooltip-link2", wrap)[0];    
        var aLink = newElement("a",divLink);
        aLink.innerHTML = "&raquo; mehr Informationen";
        observeEvent(aLink, "click", function(){
            window.open(AppRootDir + 'poiinfo.asp?sid=' + sid + '&poiid=' + json.id);
            return false;
        }.bind(this));
    }                

    if (json.link1 != null)
    {
        var divExtLink = document.getElementsByClassName("tooltip-link1", wrap)[0];
        var aExtLink = newElement("a",divExtLink);
        aExtLink.innerHTML = "&raquo; " + json.link1;
        var extLinkURL = json.link1;
        if (!/^(http:\/\/)/.test(extLinkURL))
            extLinkURL = "http://" + extLinkURL;            
        observeEvent(aExtLink, "click", function(){window.open(extLinkURL);return false;}.bind(this)); 
    }        
    
    //remove the space between infos and description
    if (json.title2 == null && json.value1 == null && json.value2 == null)
    {            
        var divDesc = document.getElementsByClassName("tooltip-desc-room-top", wrap)[0];
        divDesc.parentNode.removeChild(divDesc);            
    }
    //remove the space between description and links
    if (json.desc == null || !json.moreinfo && json.link1 == null)
    {            
        var divDesc = document.getElementsByClassName("tooltip-desc-room-bottom", wrap)[0];
        divDesc.parentNode.removeChild(divDesc);            
    }       
    
    var imgClose = document.getElementsByClassName("close-button", wrap)[0];        
    // Style the image button
	imgClose.style.cursor = 'pointer';
	imgClose.style.zIndex = '1000';
	// Attach close button event
	observeEvent(imgClose, 'click', function(event) { CloseTooltip(); stopEvent(event); }.bindAsEventListener(this));

    var content = wrap.lastChild;        
	// check if the dimensions of the whole window exceed the maximum width		
	var dimensions = {width: content.offsetWidth, height: content.offsetHeight};
	// force the size of the content box, since it tends to collapse when it's re-added to the DOM	
	content.style.width = pix(dimensions.width);
	content.style.height = pix(dimensions.height);				
	// Calculate box dimensions for further use
    wrap.style.width = pix(content.offsetWidth + 3);
    wrap.style.height = pix(content.offsetHeight + 3);    
    
    wrap.style.position = "absolute";
    
    var startpos = new Array(pos[0] + poi.x, pos[1] + poi.y);

    var left = startpos[0] - 150;
    var top = startpos[1] - wrap.offsetHeight - poi.t;
        if( left + wrap.offsetWidth > pos[0] + $("map").offsetWidth )
            left -= (left + wrap.offsetWidth) - (pos[0] + $("map").offsetWidth);
        else if( left < pos[0] )
            left += pos[0] - left + 5;
    
    if(isIE) top += 3;

    wrap.style.left = pix(left);
    wrap.style.top = pix(top);
    
    TooltipVisible.PoiID = json.id;
    TooltipVisible.PoiType = json.type;
}

function CloseTooltip() {
    var tt = $("tooltips");
    if(tt)
        tt.parentNode.removeChild(tt);
    tt = null;
    removePoiTooltipFromCache(TooltipVisible);
    TooltipVisible.PoiID = 0;
    TooltipVisible.PoiType = PoiType.Poi;
}

PoiTooltips = new Array();
function getPoiTooltipsByPoi(poi) {
    for( var i in PoiTooltips) {
        if( PoiTooltips[i].id == poi.id && PoiTooltips[i].type == poi.type)
            return PoiTooltips[i];
    }
    return null;
}
function removePoiTooltipFromCache(tooltip)   {
    for( var i in PoiTooltips) {
        if( PoiTooltips[i].id == tooltip.id && PoiTooltips[i].type == tooltip.type) {
            PoiTooltips.splice(i,1);
            return;
        }
    }
    return;
}

//cookies
function setCookieValue(key, value)
{
    var expires=new Date();
    expires.setFullYear(expires.getFullYear() + 1);
    
    document.cookie=key+'='+value+';path=/;expires='+expires.toUTCString();
}
