// Copyright 1999-2010 Maptuit Inc, All Rights Reserved

function HotSpotCanvas(nid,onetip)
{this.HotSpotHover=new Object();this.HotSpotClick=new Object();this.HotSpotBoth=new Object();this.HotSpotIds=new Object();this.disableEvents=false;this.blobCounter=0;this.installedCss=false;this.MyMap;this.MyCanvasId;this.id=nid;this.sta_tic=false;this.onetip=onetip?(this.onetip=onetip):false;this.lastTipID=null;}
HotSpotCanvas.prototype.init=function(mydivId,damap)
{this.MyMap=damap;this.MyCanvasId=mydivId;if(!this.installedCss){var href=this.MyMap.csspath.replace(/nc.css$/,"canvases/CanvasHotspots.css");var l=document.createElement('LINK');l.type='text/css';l.rel='stylesheet';l.media='screen';l.href=href;document.getElementsByTagName('HEAD')[0].appendChild(l);this.installedCss=true;}}
HotSpotCanvas.prototype.reInit=function(mydivId)
{var xc;var yc;var i=0;var hsc_tmp=this.HotSpotClick;var hsh_tmp=this.HotSpotHover;var hsb_tmp=this.HotSpotBoth;this.MyCanvasId=mydivId;this.ClearObj();this._reindex_collection("HotSpotClick",hsc_tmp,"Click");this._reindex_collection("HotSpotHover",hsh_tmp,"Hover");this._reindex_collection("HotSpotBoth",hsb_tmp,"Both");this.Redraw();}
HotSpotCanvas.prototype.singleClickCallback=function(vpx,vpy,aidx)
{if(this.disableEvents){return true;}
var tp=this.MyMap.xy_tray(vpx,vpy);if(!aidx)aidx=0;var hotspot;hotspot=this._find_hotspot(this.HotSpotBoth,tp.x,tp.y,aidx);if(hotspot){this._perform_click_action(hotspot);return false;}
hotspot=this._find_hotspot(this.HotSpotClick,tp.x,tp.y,aidx);if(hotspot){this._perform_click_action(hotspot);return false;}
return true;}
HotSpotCanvas.prototype.hoverCallback=function(vpx,vpy,aidx)
{if(this.disableEvents){return true;}
var tp=this.MyMap.xy_tray(vpx,vpy);if(!aidx)aidx=0;var hotspot;hotspot=this._find_hotspot(this.HotSpotBoth,tp.x,tp.y,aidx);if(hotspot){this._perform_hover_action(hotspot);return false;}
hotspot=this._find_hotspot(this.HotSpotHover,tp.x,tp.y,aidx);if(hotspot){this._perform_hover_action(hotspot);return false;}
return true;}
HotSpotCanvas.prototype.doubleClickCallback=function(vpx,vpy){return true;}
HotSpotCanvas.prototype.trayMoveCallback=function(dx,dy){return true;}
HotSpotCanvas.prototype.resizeCallback=function(w,h){return true;}
HotSpotCanvas.prototype.showCallback=function(visi)
{this.disableEvents=visi?false:true;return true;}
HotSpotCanvas.prototype.triggerClickEvent=function(id)
{var hs,hsid;if((hsid=this.HotSpotIds[id]))
{if(hsid.type=="Click")
{hs=this.HotSpotClick[hsid.x][hsid.y][hsid.i];}
else if(hsid.type=="Both")
{hs=this.HotSpotBoth[hsid.x][hsid.y][hsid.i];}
else
{return false;}
this._perform_click_action(hs);return true;}
return false;}
HotSpotCanvas.prototype.Delete=function(id)
{var hsid;if((hsid=this.HotSpotIds[id]))
{var cname="HotSpotBoth";if(hsid.type=="Click")cname="HotSpotClick";if(hsid.type=="Hover")cname="HotSpotHover";if(this._remove_from_collection(cname,id,hsid.type))
{this.Redraw();}}}
HotSpotCanvas.prototype.CreateBothJS=function(id,lon,lat,img,imgw,imgh,scriptClick,scriptHover)
{var myobj=this._create_hotspot_obj(id,lon,lat,img,imgw,imgh);myobj.scriptClick=scriptClick;myobj.scriptHover=scriptHover;this._add_to_collection("HotSpotBoth",myobj,"Both");}
HotSpotCanvas.prototype.CreateBoth=function(id,lon,lat,img,imgw,imgh,divw,divh,html,cssClass,divwH,divhH,htmlH,cssClassH)
{var myobj=this._create_hotspot_obj(id,lon,lat,img,imgw,imgh);myobj.divw=divw;myobj.divh=divh;myobj.html=html;if((!cssClass)||(cssClass==''))
{myobj.className='';}
else
{myobj.className=cssClass;}
if(divwH&&divhH&&htmlH)
{myobj.divwH=divwH;myobj.divhH=divhH;myobj.htmlH=htmlH;if((!cssClassH)||(cssClassH==''))
{myobj.classNameH='';}
{myobj.classNameH=cssClassH;}}
this._add_to_collection("HotSpotBoth",myobj,"Both");}
HotSpotCanvas.prototype.CreateClickJS=function(id,lon,lat,img,imgw,imgh,scriptClick)
{var myobj=this._create_hotspot_obj(id,lon,lat,img,imgw,imgh);myobj.scriptClick=scriptClick;this._add_to_collection("HotSpotClick",myobj,"Click");}
HotSpotCanvas.prototype.CreateClick=function(id,lon,lat,img,imgw,imgh,divw,divh,html,cssClass)
{var myobj=this._create_hotspot_obj(id,lon,lat,img,imgw,imgh);myobj.divw=divw;myobj.divh=divh;myobj.html=html;if((!cssClass)||(cssClass==''))
{myobj.className='';}
else
{myobj.className=cssClass;}
this._add_to_collection("HotSpotClick",myobj,"Click");}
HotSpotCanvas.prototype.CreateHoverJS=function(id,lon,lat,img,imgw,imgh,scriptHover)
{var myobj=this._create_hotspot_obj(id,lon,lat,img,imgw,imgh);myobj.scriptHover=scriptHover;this._add_to_collection("HotSpotHover",myobj,"Hover");}
HotSpotCanvas.prototype.CreateHover=function(id,lon,lat,img,imgw,imgh,divw,divh,html,cssClass)
{var myobj=this._create_hotspot_obj(id,lon,lat,img,imgw,imgh);myobj.divw=divw;myobj.divh=divh;myobj.html=html;if((!cssClass)||(cssClass==''))
{myobj.className='';}
else
{myobj.className=cssClass;}
this._add_to_collection("HotSpotHover",myobj,"Hover");}
HotSpotCanvas.prototype.ClearObj=function()
{this.HotSpotClick=new Object();this.HotSpotHover=new Object();this.HotSpotBoth=new Object();this.HotSpotIds=new Object();return true;}
HotSpotCanvas.prototype.ClearCanvas=function()
{var cvs=$(this.MyCanvasId);while(cvs.firstChild)
{cvs.removeChild(this.purge(cvs.firstChild));}
this.MyMap.clearTips(this.id);this.ClearObj();return true;}
HotSpotCanvas.prototype.Draw=function(xc,yc,i,datype)
{var hd=$(this.MyCanvasId);if(hd)
{var hs=this["HotSpot"+datype][xc][yc][i];this._draw_marker(hs,xc,yc,hd);}}
HotSpotCanvas.prototype.Redraw=function()
{var hd=$(this.MyCanvasId);var xc;var yc;var i=0;while(hd.firstChild)
{hd.removeChild(this.purge(hd.firstChild));}
for(xc in this.HotSpotClick)
{if(this.HotSpotClick.hasOwnProperty(xc)){for(yc in this.HotSpotClick[xc])
{if(this.HotSpotClick[xc].hasOwnProperty(yc)){var hss=this.HotSpotClick[xc][yc];for(i=0;i<hss.length;i++)
{this._draw_marker(hss[i],xc,yc,hd);}}}}}
for(xc in this.HotSpotHover)
{if(this.HotSpotHover.hasOwnProperty(xc)){for(yc in this.HotSpotHover[xc])
{if(this.HotSpotHover[xc].hasOwnProperty(yc)){var hss=this.HotSpotHover[xc][yc];for(var i=0;i<hss.length;i++)
{this._draw_marker(hss[i],xc,yc,hd);}}}}}
for(xc in this.HotSpotBoth)
{if(this.HotSpotBoth.hasOwnProperty(xc)){for(yc in this.HotSpotBoth[xc])
{if(this.HotSpotBoth[xc].hasOwnProperty(yc)){var hss=this.HotSpotBoth[xc][yc];for(var i=0;i<hss.length;i++)
{this._draw_marker(hss[i],xc,yc,hd);}}}}}}
HotSpotCanvas.prototype.searchPosition=function(colltype,x,y)
{var tp=this.MyMap.xy_tray(x,y);if(colltype=='Click')
{return this._find_all_hotspots(this.HotSpotClick,tp.x,tp.y);}
if(colltype=='Hover')
{return this._find_all_hotspots(this.HotSpotHover,tp.x,tp.y);}
if(colltype=='Both')
{return this._find_all_hotspots(this.HotSpotBoth,tp.x,tp.y);}};HotSpotCanvas.prototype._find_all_hotspots=function(collection,x,y){var xc,yc,idxx,idxy;var ret_arr=[];for(xc in collection)
{if(collection.hasOwnProperty(xc)){idxx=Math.abs(parseInt(xc)-x);if(idxx<12)
{for(yc in collection[xc])
{if(collection[xc].hasOwnProperty(yc)){idxy=Math.abs(parseInt(yc)-y);if(idxy<12)
{for(var i=0;i<collection[xc][yc].length;i++)
{ret_arr.push(collection[xc][yc][i]);}}}}}}}
return ret_arr;};HotSpotCanvas.prototype._find_hotspot=function(collection,x,y,aidx){var xc,yc,idxx,idxy;for(xc in collection)
{if(collection.hasOwnProperty(xc)){idxx=Math.abs(parseInt(xc)-x);if(idxx<12)
{for(yc in collection[xc])
{if(collection[xc].hasOwnProperty(yc)){idxy=Math.abs(parseInt(yc)-y);if(idxy<12)
{return collection[xc][yc][aidx];}}}}}}
return null;}
HotSpotCanvas.prototype._perform_hover_action=function(hotspot){if('scriptHover'in hotspot)
{if(typeof(hotspot.scriptHover)=='function')
{hotspot.scriptHover();}
else
{eval(hotspot.scriptHover);}}
else
{var width,height,cN,hot;if('htmlH'in hotspot)
{if(typeof(hotspot.htmlH)=='function')
{hot=hotspot.htmlH();}
else
{hot=document.createElement('DIV');hot.innerHTML=hotspot.htmlH;}
width=hotspot.divwH;height=hotspot.divhH;cN=hotspot.classNameH;}
else
{if(typeof(hotspot.html)=='function')
{hot=hotspot.html();}
else
{hot=document.createElement('DIV');hot.innerHTML=hotspot.html;}
width=hotspot.divw;height=hotspot.divh;cN=hotspot.className;}
hot.style.width=width;hot.style.height=height;hot.style.background='#FFFFFF';this.MyMap.toolTip(this.id+'_'+hotspot.id,'hover',hotspot.lon,hotspot.lat,width,height,hot,cN);}
return false;}
HotSpotCanvas.prototype._perform_click_action=function(hotspot){if('scriptClick'in hotspot)
{if(typeof(hotspot.scriptClick)=='function')
{hotspot.scriptClick();}
else
{eval(hotspot.scriptClick);}}
else
{var hot;if(typeof(hotspot.html)=='function')
{hot=hotspot.html();}
else
{hot=document.createElement('DIV');hot.innerHTML=hotspot.html;}
hot.style.width=hotspot.divw;hot.style.height=hotspot.divh;hot.style.background='#FFFFFF';if(this.lastTipID&&this.onetip){this.MyMap.closeTip(this.lastTipID);}
this.lastTipID=this.MyMap.toolTip(this.id+'_'+hotspot.id,'click',hotspot.lon,hotspot.lat,parseInt(hotspot.divw),parseInt(hotspot.divh),hot,hotspot.className);}}
HotSpotCanvas.prototype._allocate_in_collection=function(cname,x,y){if(!this[cname])this[cname]=new Object();if(!this[cname][x])this[cname][x]=new Object();if(!this[cname][x][y])this[cname][x][y]=new Array();return this[cname][x][y];}
HotSpotCanvas.prototype._draw_marker=function(hotspot,x,y,domnode){var nd=document.createElement('DIV');if(hotspot.premade)
{nd=hotspot.blob;}
else
{nd.innerHTML='<IMG src="'+hotspot.img+'" galleryimg="no" border="0">';}
nd.id=this.MyMap.NAME+'_'+hotspot.id+'_marker';nd.style.position='absolute';nd.style.left=Math.round(parseInt(x)-(hotspot.imgW/2))+'px';nd.style.top=Math.round(parseInt(y)-(hotspot.imgH/2))+'px';domnode.appendChild(nd);}
HotSpotCanvas.prototype._reindex_collection=function(cname,tempobj,type){var xc,yc,i;for(xc in tempobj)for(yc in tempobj[xc])for(i=0;i<tempobj[xc][yc].length;i++){if(tempobj[xc].hasOwnProperty(yc)){var tp=this.MyMap.g2c(tempobj[xc][yc][i].lon,tempobj[xc][yc][i].lat);var coll=this._allocate_in_collection(cname,tp.x,tp.y);coll.push(tempobj[xc][yc][i]);var hs=this.HotSpotIds[tempobj[xc][yc][i].id]={};hs.type=type;hs.x=tp.x;hs.y=tp.y;hs.i=coll.length-1;}}}
HotSpotCanvas.prototype._add_to_collection=function(cname,myobj,type){var tp=this.MyMap.g2c(myobj.lon,myobj.lat);var coll=this._allocate_in_collection(cname,tp.x,tp.y);coll.push(myobj);var hsid=this.HotSpotIds[myobj.id]={};hsid.type=type;hsid.x=tp.x;hsid.y=tp.y;var i=hsid.i=coll.length-1;this.Draw(tp.x,tp.y,i,type);}
HotSpotCanvas.prototype._remove_from_collection=function(cname,hsid,type)
{var hs=this.HotSpotIds[hsid];if(this[cname]&&this[cname][hs.x]&&this[cname][hs.x][hs.y])
{var coll=this[cname][hs.x][hs.y];for(var i=0;i<coll.length;i++)
{if(coll[i].id==hsid)
{coll.splice(i,1);}}
this[cname][hs.x][hs.y]=coll;}
else
{return false;}
delete(this.HotSpotIds[hsid]);return true;}
HotSpotCanvas.prototype._create_hotspot_obj=function(id,lon,lat,img,imgw,imgh){var myobj=new Object();myobj.id=id;myobj.lon=parseFloat(lon);myobj.lat=parseFloat(lat);if(typeof img==='function')
{myobj.blob=img();myobj.premade=true;if(myobj.blob.style.width&&myobj.blob.style.height)
{myobj.imgW=parseInt(myobj.blob.style.width);myobj.imgH=parseInt(myobj.blob.style.height);}
else
{myobj.imgW=imgw;myobj.imgH=imgh;myobj.blob.style.width=myobj.imgW+'px';myobj.blob.style.height=myobj.imgH+'px';}}
else
{myobj.img=img;myobj.imgW=imgw;myobj.imgH=imgh;}
myobj.raised=false;return myobj;}
HotSpotCanvas.prototype.CreateIndexedBlob=function(cssClass,index){var newBlob=document.createElement('DIV');newBlob.className=cssClass;if(!index)
{newBlob.innerHTML=this.blobCounter;this.blobCounter++;}
else
{newBlob.innerHTML=index;}
return newBlob;}
HotSpotCanvas.prototype.purge=function(d,childOnly){var a=d.attributes,i,n;if(a&&!childOnly){for(i=0;i<a.length;i++){if(a[i]){n=a[i].name;if(typeof d[n]==='function'){d[n]=null;}}}}
a=d.childNodes;if(a){for(i=0;i<a.length;i++){this.purge(d.childNodes[i]);}}
return d;}