function ZeroMapLayerData()
{
	this.m_dx = 0;
	this.m_dy = 0;
	
	this.m_strMessage = "";
	this.m_nMesssageWidth = 0;
	
	this.m_strSymbolUrl = "";
	this.m_strUserData = "";
	
	this.m_nSymbolWidth = 0;
	this.m_nSymbolHeight = 0;
	
	this.m_dBack = null;
	this.m_bAppend = false;
};

function ZeroMapLayer(ZeroMap)
{
	this.m_ZeroMap = ZeroMap;
			
	this.m_dPopUp = null;
	this.m_aDisplay = new Array();
	this.m_aData = null;
};


ZeroMapLayer.prototype.GetStringLength = function(str) 
{
   	var retCode = 0;
   	var strLength = 0;

   	for (i = 0; i < str.length; i++)
   	{
     		var code = str.charCodeAt(i)
     		var ch = str.substr(i,1).toUpperCase()
     		code = parseInt(code)
     		if ((ch < "0" || ch > "9") && (ch < "A" || ch > "Z") && ((code > 255) || (code < 0))){
       		strLength = strLength + 2;
     		} else { 
       		strLength = strLength + 1;
     		}
   	}
   	return strLength;
 }
 
ZeroMapLayer.prototype.SetData = function(strData)
{
    var ZeroMap = this.m_ZeroMap;
    
	if(strData.length == 0)
	{
	    for(var n = 0 ; n < this.m_aDisplay.length ; n++)
	    {
	        this.m_aDisplay[n].m_bDraw = false;
	    }
	    
	    var aDisplay = new Array();
        while(this.m_aDisplay.length)
	    {
	        var obj = this.m_aDisplay.pop();
	        if(obj.m_bDraw == false)
	        {
	            if(obj.m_bAppend == true)
	            {
	                ZeroMap.m_dBack.removeChild(obj.m_dBack);
	                obj.m_bAppend = false;
	            }
	        }
	    }
		this.m_aData = null; 
	}
	else
	{	
		this.m_aData = new Array();
		var aData = strData.split("@");
		
		var nMem = 0;
		
		while(nMem + 6 < aData.length)
		{
			var Data = new ZeroMapLayerData();
			
			Data.m_nSymbolWidth = parseInt(aData[nMem]); nMem++;
		    Data.m_nSymbolHeight = parseInt(aData[nMem]); nMem++;
		    
			Data.m_dx = aData[nMem]; nMem++;
			Data.m_dy = aData[nMem]; nMem++;
			Data.name = aData[nMem]; nMem++;
			if(Data.name.length > 8)
			{
			    Data.name = Data.name.substring(0,8) + "..";
			}
			Data.m_nMesssageWidth = this.GetStringLength(Data.name) * 7.9;
			
			var strUrl = aData[nMem];
			
			Data.icon = strUrl; nMem++;
			Data.m_strUserData = aData[nMem]; nMem++;
			
			this.m_aData.push(Data);
		}
	}
	this.Draw();
};
ZeroMapLayer.prototype.AutoScale = function()
{
    var ZeroMap = this.m_ZeroMap;
    
    var lbx = 999.0;
    var lby = 999.0;
    var rtx = 0.0;
    var rty = 0.0;
    
    for(var n = 0 ; n < this.m_aData.length ; n++)
	{
	    var data = this.m_aData[n];
	    
	    lbx = Math.min(lbx , data.m_dx);
	    lby = Math.min(lby , data.m_dy);
	    rtx = Math.max(rtx , data.m_dx);
	    rty = Math.max(rty , data.m_dy);
    }
    
    var Scale = GetBoundaryToScale(lbx,lby,rtx,rty,ZeroMap);
    var newScale = GetRealScale(Scale , ZeroMap);
    
    if(newScale < 9)newScale = 9;
    
    ZeroMap.SetScale(newScale);
    ZeroMap.SetCenter((parseFloat(lbx) + parseFloat(rtx)) / 2.0 , (parseFloat(lby) + parseFloat(rty)) / 2.0);
};
ZeroMapLayer.prototype.Draw = function()
{
	var ZeroMap = this.m_ZeroMap;
	
	for(var n = 0 ; n < this.m_aDisplay.length ; n++)
	{
	    this.m_aDisplay[n].m_bDraw = false;
	}
	
	if(this.m_aData != null)
	{
		for(var n = 0 ; n < this.m_aData.length ; n++)
		{
		    var data = this.m_aData[n];
		    
		    var pt = WorldToScreen(data.m_dx , data.m_dy , ZeroMap);
		    
		    
		    var nWidth = (data.m_nMesssageWidth + 6 + data.m_nSymbolWidth);
		    var nHalfWidth = nWidth / 2; 
		    var nHeight = 13 + data.m_nSymbolHeight + 6;
		    		    
			var nx1 = pt.x - nHalfWidth;	
            var nx2 = nx1 + nWidth;	
            var ny1 = pt.y - (data.m_nSymbolHeight / 2);	
            var ny2 = ny1 + nHeight;	

            var ncx = (nx1 + nx2) / 2;	
            var ncy = (ny1 + ny2) / 2;	
            var nx = Math.abs(nx2 - nx1);	
            var ny = Math.abs(ny2 - ny1);	
            var ncx = parseInt(nx / 2);	
            var ncy = parseInt(ny / 2);	
            
            
            if( Math.abs(ZeroMap.m_nHalfScreenX - ncx) <= ZeroMap.m_nHalfScreenX + ncx &&
            Math.abs(ZeroMap.m_nHalfScreenY - ncy) <= ZeroMap.m_nHalfScreenY + ncy)
            {
                data.m_bDraw = true;
                
			    var dBack = data.m_dBack;
			    if(dBack == null)
			    {
			        data.m_dBack = document.createElement("div"); 
                    dBack = data.m_dBack;
                    dBack.style.cursor = "pointer";
                    dBack.style.position = "absolute";	
                    dBack.style.zIndex = 4;	
                    dBack.style.width = nWidth;	
                    dBack.style.height = nHeight;	
                
                    dBack.data = data;
                    
                    dBack.onmouseover = this.MouseOver;
	                dBack.onmouseout = this.MouseOut;
                    
                    
                    var img= new Image();
                    img.src = data.icon;	
                    img.style.position = "absolute";
                    img.style.left = nHalfWidth - (data.m_nSymbolWidth / 2) ;
                    img.style.top = 0;
                    img.style.width = data.m_nSymbolWidth; 
                    img.style.height = data.m_nSymbolHeight; 
                    img.style.zIndex = 2;
                    dBack.appendChild(img);
                                       
                    
                    if(data.name.length > 0)
                    {
                        var roundrect = document.createElement("v:roundrect");
                        roundrect.style.position = "absolute";	
                        roundrect.style.left = nHalfWidth - (data.m_nMesssageWidth / 2) ;
                        roundrect.style.top = data.m_nSymbolHeight + 2;	
                        roundrect.style.width = data.m_nMesssageWidth;	
                        roundrect.style.height = 13 + 6;	
                        roundrect.style.zIndex = 1;	
                        roundrect.arcsize = "0.2"
                        roundrect.fillcolor = "#FFFFFF";
                        roundrect.strokecolor = "#A1C1E3";
                        roundrect.strokeweight = "2px";
                        roundrect.style.display = "none";
                        
                        //roundrect.innerHTML += "<v:stroke  on = 'false'/>"
                        
                        dBack.appendChild(roundrect);
                                       
                                            
                        var dText = document.createElement("div");
                        dText.style.position = "absolute";	
                        dText.style.left = nHalfWidth - (data.m_nMesssageWidth / 2) ;
                        dText.style.top = data.m_nSymbolHeight + 5;	
                        dText.style.width = data.m_nMesssageWidth;	
                        dText.style.height = 13 + 6;	
                        dText.style.zIndex = 2;	
                        dText.style.verticalAlign = "middle";
                        dText.style.textAlign = "center";
                        dText.style.display = "none";

                         
                        var strString;	
                        strString = "<table name='CookUserTable'><tr>";
                        strString += "<td class='ZeroMaplayer' name='CookUserTableTD'>"; 
                        strString += data.name;
                        strString += "</td></tr></table>";
                        dText.innerHTML += strString;
                                        
                        dBack.appendChild(dText);
                    }
			    }
			    dBack.style.left = nx1;	
                dBack.style.top = ny1;	
                
                if(data.m_bAppend == false)
                {
                    this.m_ZeroMap.m_dBack.appendChild(dBack);	
	                this.m_aDisplay.push(data)        
	                data.m_bAppend = true;
                }
			}
		}
	}
	var aDisplay = new Array();
    while(this.m_aDisplay.length)
	{
	    var obj = this.m_aDisplay.pop();
	    if(obj.m_bDraw == false)
	    {
	        if(obj.m_bAppend == true)
	        {
	            ZeroMap.m_dBack.removeChild(obj.m_dBack);
	            obj.m_bAppend = false;
	        }
	    }
	    else
	    {
	        aDisplay.push(obj);
	    }
	}
	
	while(aDisplay.length)
	{
	    this.m_aDisplay.push(aDisplay.pop());
	}
};	

ZeroMapLayer.prototype.MouseOver = function(event)
{
	if(!event) event = window.event;
	var ZeroMap = this.m_ZeroMap;
	
	if(this.childNodes.length > 1)
	{
	    this.childNodes[1].style.display = "";
	    this.childNodes[2].style.display = "";
	    this.style.zIndex = 3;

	}
		
};

ZeroMapLayer.prototype.MouseOut = function(event)
{
	if(!event) event = window.event;
	var ZeroMap = this.m_ZeroMap;
	
	if(this.childNodes.length > 1)
	{
	    this.childNodes[1].style.display = "none";
	    this.childNodes[2].style.display = "none";
	    this.style.zIndex = 2;
	}
};

ZeroMapLayer.prototype.MouseClick = function(event)
{
	if(!event) event = window.event;
	var ZeroMap = this.m_ZeroMap;
		
	var x = event.clientX;
	var y = event.clientY;
	
	var strMessage = x +"@" + y + "@" + this.m_Data.m_dx +"@" + this.m_Data.m_dy + "@" + this.m_Data.m_strUserData + "@";
	if(ZeroMap.m_cCallBack != null)
	{
		ZeroMap.m_cCallBack("click" , strMessage);
	}
};

ZeroMapLayer.prototype.OpenPopup = function(dx , dy , offsetx , offsety , width , height , strhtml)
{
	var ZeroMap = this.m_ZeroMap;
	
	this.ClosePopup();

	var pt = WorldToScreen(parseFloat(dx) , parseFloat(dy) , ZeroMap);
		
	this.m_dPopUp = document.createElement("v:rect");
	this.m_dPopUp.style.position = "absolute";
	this.m_dPopUp.m_dx = dx;
	this.m_dPopUp.m_dy = dy;
	this.m_dPopUp.m_offsetx = offsetx;
	this.m_dPopUp.m_offsety = offsety;		
	
	
	this.m_dPopUp.style.left = pt.x + offsetx;
    this.m_dPopUp.style.top =  pt.y + offsety;
    this.m_dPopUp.style.width = width;
    this.m_dPopUp.style.height = height;
    
    this.m_dPopUp.innerHTML += strhtml;
    ZeroMap.m_dBack.appendChild(this.m_dPopUp);
};

ZeroMapLayer.prototype.ClosePopup = function()
{
	var ZeroMap = this.m_ZeroMap;
	if(ZeroMap.m_dBack != null)
	{
	    if(this.m_dPopUp != null)
	    {
			ZeroMap.m_dBack.removeChild(this.m_dPopUp);
		}
		this.m_dPopUp = null;
	}
};
	