/* Copyright (C) 2006 ALPS Mapping K.K. */
function Mapsvr(){};Mapsvr.POI=1;Mapsvr.LINE=2;Mapsvr.AREA=3;Mapsvr.CIRCLE=4;function MapsvrPOI(id,name,pos,cat,popup,property){this.type=Mapsvr.POI;this.id=id;this.name=name;this.pos=pos;this.cat=cat;this.popup=popup;this.status=0;this.property=property || new Object();this.node=null;};function MapsvrLine(id,name,pos,cat){this.type=Mapsvr.LINE;this.id=id;this.name=name;this.pos=pos;this.cat=cat;this.status=0;this.points=new Array();};MapsvrLine.prototype.release=function(){if(this.pos) this.pos.release();if(this.points) this.points.release();this._release();};function MapsvrArea(id,name,pos,cat){this.type=Mapsvr.AREA;this.id=id;this.name=name;this.pos=pos;this.cat=cat;this.status=0;this.points=new Array();};MapsvrArea.prototype.release=function(){if(this.pos) this.pos.release();if(this.points) this.points.release();this._release();};function MapsvrCircle(id,name,pos,radius,cat){this.type=Mapsvr.CIRCLE;this.id=id;this.name=name;this.pos=pos;this.radius=radius;this.cat=cat;this.status=0;};function MapsvrCategory(id,name,image,size){this.id=id;this.name=name;this.iconImage=image?[image]:new Array();this.iconSize=size?[size]:new Array();this.iconDiff=new Array();this.expandImage=new Array();this.expandSize=new Array();this.expandDiff=new Array();this.style=new Array();};MapsvrCategory.prototype.release=function(){this.iconImage.release();this.iconSize.release();this.iconDiff.release();this.expandImage.release();this.expandSize.release();this.expandDiff.release();this.style.release();this._release();};function MapsvrParameter(name,value,type){this.name=name;this.value=value;this.type=type;};function MapsvrCtrl(map,param){this.map=map;this.loadParam(param);this.contents=new Array();this.source=new Array();this.icon=new Array();this.opacity=100;this.itimer=new Array();this.ptimer=null;this.ctimer=null;this.category=new Array();this.expand=true;this.popup=true;this.fixPopup=false;this.popupIndex=-1;this.threshold=null;this.canvas=null;this.canvasPos=null;this.background=null;this.backgroundPos=null;this.queryParameter=new Array();this.resultProperty=new Object();this.width=map.getContainer().offsetWidth;this.height=map.getContainer().offsetHeight;AlpsEvent.addEvent(map,"mapMoving",this.eventHandler("mapMoving"));AlpsEvent.addEvent(map,"mapMoved",this.eventHandler("mapMoved"));AlpsEvent.addEvent(map,"layerChanged",this.eventHandler("layerChanged"));AlpsEvent.addEvent(map,"smoothLayerChanging",this.eventHandler("smoothLayerChanging"));AlpsEvent.addEvent(map,"magnifyChanged",this.eventHandler("magnifyChanged"));AlpsEvent.addEvent(map,"angleChanged",this.eventHandler("angleChanged"));AlpsEvent.addEvent(map,"smoothAngleChanging",this.eventHandler("smoothAngleChanging"));AlpsEvent.addEvent(map,"packageChanged",this.eventHandler("packageChanged"));AlpsEvent.addEvent(map,"resize",this.eventHandler("onResize"));};MapsvrCtrl.prototype.release=function(){if(_bi.type!=1) return;this.contents.release();this.source.release();this.icon.release();this.itimer.release();this.category.release();this.queryParameter.release();this.resultProperty.release();if(this.categoryList){for(var i=0;i<this.categoryList.length;i++){var c=this.categoryList[i];this.categoryMap[c].release();}this.categoryList.release();}this._release();};MapsvrCtrl.prototype.loadParam=function(param){if(typeof(param)!="string") return this.loadParamObject(param);this.contentsServer=null;this.drawServer=null;this.categoryList=new Array();this.categoryMap=new Object();var doc=AlpsUtil.getXMLDOM(param);if(!doc) return;var n=doc.getElementsByTagName("poi")[0];if(n){this.contentsServer=n.getAttribute("server");var popup=AlpsUtil.getElementAttribute(n,"popup","href");if(popup){if(typeof(XSLTProcessor)!="undefined"){this.popupxsl=new XSLTProcessor();this.popupxsl.importStylesheet(AlpsUtil.getXMLDOM(popup));}else{this.popupxsl=AlpsUtil.getXMLDOM(popup);}}this.popupxslServer=AlpsUtil.getElementAttribute(n,"popup","server");var nl0=n.getElementsByTagName("category");for(var i=0;i<nl0.length;i++){var n0=nl0[i];var c=new MapsvrCategory(n0.getAttribute("id"),n0.getAttribute("name"));var nl1=n0.childNodes;for(var j=0;j<nl1.length;j++){var n1=nl1[j];if(n1.nodeType!=1) continue;if(n1.nodeName=="icon"){var s=parseInt(n1.getAttribute("status")||"0");c.iconImage[s]=n1.getAttribute("src");c.iconSize[s]=parseInt(n1.getAttribute("size")||"16");var dx=parseInt(n1.getAttribute("dx")||"0");var dy=parseInt(n1.getAttribute("dy")||"0");c.iconDiff[s]=new Point(dx,dy);}else if(n1.nodeName=="expand"){var s=parseInt(n1.getAttribute("status")||"0");c.expandImage[s]=n1.getAttribute("src");c.expandSize[s]=parseInt(n1.getAttribute("size")||"16");var dx=parseInt(n1.getAttribute("dx")||"0");var dy=parseInt(n1.getAttribute("dy")||"0");c.expandDiff[s]=new Point(dx,dy);}}this.addCategory(c);}}n=doc.getElementsByTagName("shape")[0];if(n){this.drawServer=n.getAttribute("server");var nl0=n.getElementsByTagName("category");for(var i=0;i<nl0.length;i++){var n0=nl0[i];var c=new MapsvrCategory(n0.getAttribute("id"),n0.getAttribute("name"));var nl1=n0.childNodes;for(var j=0;j<nl1.length;j++){var n1=nl1[j];if(n1.nodeType!=1) continue;if(n1.nodeName=="line"){var s=parseInt(n1.getAttribute("status")||"0");var style=n1.getAttribute("style");c.style[s]=style?("line:"+style):"line";}else if(n1.nodeName=="area"){var s=parseInt(n1.getAttribute("status")||"0");var style=n1.getAttribute("style");c.style[s]=style?("area:"+style):"area";}else if(n1.nodeName=="circle"){var s=parseInt(n1.getAttribute("status")||"0");var style=n1.getAttribute("style");c.style[s]=style?("circle:"+style):"circle";}}this.addCategory(c);}}};MapsvrCtrl.prototype.loadParamObject=function(param){this.contentsServer=param.contentsServer;this.drawServer=null;this.categoryList=new Array();this.categoryMap=new Object();for(var i=0;i<param.catList.length;i++){var c=param.catList[i];this.addCategory(new MapsvrCategory(c,param.catName[c],param.iconImage[c],param.iconSize[c]));}};MapsvrCtrl.prototype.addCategory=function(c){var index=this.categoryList.find(c.id);if(index>=0){this.categoryList.splice(index,1);}this.categoryList.push(c.id);this.categoryMap[c.id]=c;};MapsvrCtrl.prototype.showCategories=function(cat){this.category=cat || new Array();this.findContents();};MapsvrCtrl.prototype.getCategoryList=function(){var a=new Array();for(var i=0;i<this.categoryList.length;i++){var c=this.categoryList[i];a.push(this.categoryMap[c]);}return a;};MapsvrCtrl.prototype.getCategory=function(id){return this.categoryMap[id];};MapsvrCtrl.prototype.getPOIList=function(){var a=new Array();for(var i=0;i<this.contents.length;i++){if(this.contents[i].type==Mapsvr.POI){a.push(this.contents[i]);}}if(this.map){var c=this.map.getCenterLatLon();a.sort(function(x,y){return x.pos.distance(c)-y.pos.distance(c)});}return a;};MapsvrCtrl.prototype.getContentsList=function(){var a=new Array();for(var i=0;i<this.source.length;i++){a.push(this.source[i]);}return a;};MapsvrCtrl.prototype.getContents=function(id){var i=this.getContentsIndex(id,this.source);if(i>=0) return this.source[i];i=this.getContentsIndex(id);if(i>=0) return this.contents[i];};MapsvrCtrl.prototype.addContents=function(contents,addonly){for(var i=0;i<this.source.length;i++){if(this.source[i].id==contents.id){this.source.splice(i,1);i--;}}this.pointsConvert(contents);this.source.push(contents);this.source.sort(function(a,b){return (a.id<b.id)?-1:((a.id>b.id)?1:0)});if(!addonly) this.findContents();};MapsvrCtrl.prototype.removeContents=function(id){for(var i=0;i<this.source.length;i++){if(this.source[i].id==id){this.source[i].release();this.source.splice(i,1);i--;}}this.findContents();};MapsvrCtrl.prototype.clearContents=function(){this.source.clear();this.findContents();};MapsvrCtrl.prototype.addQueryParameter=function(name,value,type){this.removeQueryParameter(name);this.queryParameter.push(new MapsvrParameter(name,value,type));};MapsvrCtrl.prototype.removeQueryParameter=function(name){for(var i=0;i<this.queryParameter.length;i++){if(this.queryParameter[i].name==name){this.queryParameter[i].release();this.queryParameter.splice(i,1);i--;}}};MapsvrCtrl.prototype.clearQueryParameter=function(){this.queryParameter.clear();};MapsvrCtrl.prototype.getResultProperty=function(name){return this.resultProperty[name];};MapsvrCtrl.prototype.setContentsStatus=function(id,status){var i=this.getContentsIndex(id);if(i<0){i=this.getContentsIndex(id,this.source);if(i>=0) this.source[i].status=status;return;}var c=this.contents[i];c.status=status;var icon=this.icon[i];if(!icon){this.dispShape();return;}icon.src=this.categoryMap[c.cat].iconImage[c.status];var size=this.categoryMap[c.cat].iconSize[c.status];icon.width=size;icon.height=size;this.dispIcon(i);};MapsvrCtrl.prototype.getIconElement=function(id){var i=this.getContentsIndex(id);if(i>=0) return this.icon[i];};MapsvrCtrl.prototype.setIconOpacity=function(opacity){this.opacity=opacity;for(var i=0;i<this.contents.length;i++){this.dispIcon(i);}};MapsvrCtrl.prototype.getIconOpacity=function(){return this.opacity;};MapsvrCtrl.prototype.setEnableExpand=function(newVal){this.expand=newVal;this.showContents();};MapsvrCtrl.prototype.getEnableExpand=function(){return this.expand;};MapsvrCtrl.prototype.setEnablePopup=function(newVal){this.popup=newVal;this.showContents();};MapsvrCtrl.prototype.getEnablePopup=function(){return this.popup;};MapsvrCtrl.prototype.setIconThreshold=function(threshold){this.threshold=threshold;this.findContents();};MapsvrCtrl.prototype.getIconThreshold=function(){return this.threshold;};MapsvrCtrl.prototype.setFixPopup=function(newVal){this.fixPopup=newVal};MapsvrCtrl.prototype.getFixPopup=function(){return this.fixPopup;};MapsvrCtrl.prototype.closePopup=function(){this.popupIndex=-1;this.hidePopup();};MapsvrCtrl.prototype.getContentsIndex=function(id,src){if(!src) src=this.contents;var start=0,end=src.length;while(start<end){var h=Math.floor((start+end)/2);var hid=src[h].id;if(id==hid) return h;if(id<hid){end=h;}else if(start==h){start=h+1;}else{start=h;}}return -1;};MapsvrCtrl.prototype.overThreshold=function(){if(!this.map) return;if(!this.threshold) return;return this.map.getCurrentScale()>this.threshold;};MapsvrCtrl.prototype.findContents=function(){var num=this.contents.length;this.contents.clear();this.resultProperty=new Object();if (!this.category.length||this.overThreshold()){this.pourContents();this.showContents();if(num) AlpsEvent.triggerEvent(this,"POIListChanged");return;}if (!this.contentsServer){this.pourContents();this.showContents();return;}if (!this.map) return;var pos=new Array();pos.push(this.map.log2LatLon(new Point(0,0)));pos.push(this.map.log2LatLon(new Point(this.width,0)));pos.push(this.map.log2LatLon(new Point(this.width,this.height)));pos.push(this.map.log2LatLon(new Point(0,this.height)));var bl=pos[3],tr=pos[1];for(var i=0;i<pos.length;i++){if(pos[i].lat<bl.lat) bl.lat=pos[i].lat;if(pos[i].lon<bl.lon) bl.lon=pos[i].lon;if(pos[i].lat>tr.lat) tr.lat=pos[i].lat;if(pos[i].lon>tr.lon) tr.lon=pos[i].lon;}var ms=this;var xmlhttp=AlpsUtil.getXMLHttp();if (!xmlhttp) return;xmlhttp.open("POST", this.contentsServer, true);xmlhttp.onreadystatechange=function() {if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {ms.contents.clear();ms.resultProperty=new Object();if(ms.overThreshold()) return;var ver=parseFloat(xmlhttp.responseXML.documentElement.getAttribute("version")||"1.0");if(ver<2.0){var pois=xmlhttp.responseXML.getElementsByTagName("poi");for(var i=0;i<pois.length;i++){var prop=AlpsUtil.getProperties(pois[i]);var id=prop["iconid"];var name=AlpsUtil.getElementAttribute(pois[i],"title","name");var cat=AlpsUtil.getElementAttribute(pois[i],"category","xml:id");if(!cat) cat=AlpsUtil.getElementAttribute(pois[i],"category","id");if(!cat) cat=AlpsUtil.getElementAttribute(pois[i],"category","type");var place=pois[i].getElementsByTagName("place")[0];var pos=AlpsUtil.getElementAttribute(place,"variation","placeID");var popup=AlpsUtil.getElementContent(pois[i],"popup");ms.contents.push(new MapsvrPOI(id,name,new LLPoint(pos),cat,popup,prop));}}else{var pois=xmlhttp.responseXML.getElementsByTagName("poiArray");for(var i=0;i<pois.length;i++){var prop=AlpsUtil.getProperties(pois[i]);var id=prop["iconid"];var name=AlpsUtil.getElementAttribute(pois[i],"title","name");var cat=AlpsUtil.getElementAttribute(pois[i],"category","xml:id");if(!cat) cat=AlpsUtil.getElementAttribute(pois[i],"category","id");var pos=prop["DMS"];var poi=new MapsvrPOI(id,name,new LLPoint(pos),cat,null,prop);poi.node=AlpsUtil.createXMLDOM();if(typeof(poi.node.importNode)!="undefined"){poi.node.appendChild(poi.node.importNode(pois[i],true));}else{poi.node.appendChild(pois[i].cloneNode(true));}ms.contents.push(poi);}}var props=xmlhttp.responseXML.getElementsByTagName("properties")[0];if(props) ms.resultProperty=AlpsUtil.getProperties(props);ms.pourContents();ms.showContents();AlpsEvent.triggerEvent(ms,"POIListChanged");}};var doc=AlpsUtil.createXMLDOM();var query=doc.createElement("query");doc.appendChild(query);var bottomleft=doc.createElement("bottomleft");query.appendChild(bottomleft);bottomleft.appendChild(doc.createTextNode(bl));var topright=doc.createElement("topright");query.appendChild(topright);topright.appendChild(doc.createTextNode(tr));for(var i=0;i<this.category.length;i++){var c=this.categoryMap[this.category[i]];if(c&&c.style[0]) continue;var category=doc.createElement("category");category.appendChild(doc.createTextNode(this.category[i]));query.appendChild(category);}for(var i=0;i<this.queryParameter.length;i++){var p=this.queryParameter[i];var e=doc.createElement("parameter");query.appendChild(e);e.setAttribute("name",p.name);if(p.type=="text"){e.appendChild(doc.createTextNode(p.value));}else if(p.type=="cdata"){e.appendChild(doc.createCDATASection(p.value));}else{e.setAttribute("value",p.value);}}if(!doc.getElementsByTagName("category").length){this.pourContents();this.showContents();return;}xmlhttp.send(doc)};MapsvrCtrl.prototype.pourContents=function(){if(this.category.length){for(var i=0;i<this.source.length;i++){if(this.source[i].type==Mapsvr.POI&&this.overThreshold()) continue;if(this.category.find(this.source[i].cat)>=0){this.contents.push(this.source[i]);}}}this.contents.sort(function(a,b){return (a.id<b.id)?-1:((a.id>b.id)?1:0)});};MapsvrCtrl.prototype.showContents=function(){for(var i=0;i<this.icon.length;i++){window.clearTimeout(this.itimer[i]);}this.itimer.clear();this.icon.clear();if(!this.contents.length) return this.removeCanvas();this.clearCanvas();var shapeCount=0;for(var i=0;i<this.contents.length;i++){var cnt=this.contents[i];if(cnt.type!=Mapsvr.POI){shapeCount++;continue;}if(!this.categoryMap[cnt.cat]) continue;var icon=document.createElement("img");icon.src=this.categoryMap[cnt.cat].iconImage[cnt.status];icon.onmouseover=this.expandIcon(i);icon.onmouseout=this.deflateIcon(i);icon.onclick=this.onClick(i);var size=this.categoryMap[cnt.cat].iconSize[cnt.status];icon.width=size;icon.height=size;icon.style.position="absolute";icon.style.display='none';icon.style.zIndex=0;var order=this.resultProperty["order"];if(order=="reverse"){this.canvas.insertBefore(icon,this.canvas.firstChild);}else if(order=="random"){var nl=this.canvas.childNodes;var index=Math.floor(Math.random()*nl.length);this.canvas.insertBefore(icon,nl[index]);}else{this.canvas.appendChild(icon);}this.icon[i]=icon;this.dispIcon(i);}if(shapeCount){this.dispShape();}else if(this.background){this.background.style.filter="";this.background.style.backgroundImage="";}};MapsvrCtrl.prototype.dispShape=function(){if(!this.background) return;if(this.drawServer){var bl=this.map.log2LatLon(new Point(0,this.height));var tr=this.map.log2LatLon(new Point(this.width,0));var url=this.drawServer+"?w="+this.width+"&h="+this.height+"&p="+this.makePath();var bp=this.map.log2LatLon(new Point(0,0));if(_bi.type==1){this.background.style.filter="progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+url+"')";this.backgroundPos=bp;this.moveContents();}else{var ms=this;var timer=null;var func=function(){if(timer) window.clearTimeout(timer);if(ms.background){ms.background.style.backgroundImage="url("+url+")";ms.background.style.backgroundPosition="0px 0px";ms.background.style.backgroundRepeat="no-repeat";ms.backgroundPos=bp;}ms.moveContents();};var img=new Image();img.onload=func;timer=window.setTimeout(func,2000);img.src=url;}}else{this.background.style.filter="";this.background.style.backgroundImage="";}};MapsvrCtrl.prototype.makePath=function(){var ret=new Array();var points=0;var pstyle=null;for(var i=0;i<this.contents.length;i++){var cnt=this.contents[i];if(cnt.type==Mapsvr.POI) continue;if(!this.categoryMap[cnt.cat]) continue;var style=this.categoryMap[cnt.cat].style[cnt.status];if(!style) continue;if(cnt.type==Mapsvr.CIRCLE){var p=this.map.latLon2Log(cnt.pos);var r=(cnt.radius>0)?(cnt.radius*10000/this.map.getCurrentScale()):(-cnt.radius);if(!this.isValidCircle(p,r)) continue;if(style!=pstyle){ret.push("s"+style);pstyle=style;}var b=this.makeDword(Math.floor(p.x))+this.makeDword(Math.floor(p.y))+this.makeDword(Math.floor(r));ret.push("c"+b);}else if(cnt.type==Mapsvr.AREA){var ss=new Array();var org=this.map.latLon2Log(this.map.getProjOrigin());for(var j=0;j<cnt.points.length;j++){ss.push(new Point(org.x+cnt.points[j].x,org.y+cnt.points[j].y));}if(!this.isValidArea(ss)) continue;var s="";for(var j=0;j<ss.length;j++){if(j>0&&this.isSamePixel(ss[j-1],ss[j])) continue;s+=this.makeDword(Math.floor(ss[j].x))+this.makeDword(Math.floor(ss[j].y));}var num=s.length/8;if(num<2) continue;if(style!=pstyle){ret.push("s"+style);pstyle=style;}points+=num;ret.push("a"+s);}else if(cnt.type==Mapsvr.LINE){var s="";var ss=new Array();var pp=null;var pb=null;var org=this.map.latLon2Log(this.map.getProjOrigin());for(var j=0;j<cnt.points.length;j++){var p=new Point(org.x+cnt.points[j].x,org.y+cnt.points[j].y);var b=this.makeDword(Math.floor(p.x))+this.makeDword(Math.floor(p.y));if(pp&&!this.isSamePixel(pp,p)){if(this.isValidLine(pp,p)){if(pb){s+=pb;pb=null;}s+=b;}else{if(s){ss.push(s);s="";}pb=b;}}else{pb=b;}pp=p;}if(s){ss.push(s);s="";}if(ss.length){if(style!=pstyle){ret.push("s"+style);pstyle=style;}for(var j=0;j<ss.length;j++){var num=ss[j].length/8;if(num<2) continue;points+=num;ret.push("l"+ss[j]);}}}}var reduce=null;if(points>600){reduce=0;var c=Math.ceil(points/600.0);for(var i=0;i<ret.length;i++){if(ret[i].charAt(0)=="l"||ret[i].charAt(0)=="a"){var num=(ret[i].length-1)/8;var s=ret[i].charAt(0);for(var j=0;j<num;j++){if(j==0||j==num-1||j%c==0){s+=ret[i].substr(1+j*8,8);reduce++;}}ret[i]=s;}}}var s="";for(var i=0;i<ret.length;i++){if(s) s+=",";if(ret[i].charAt(0)=="s"){s+=":"+ret[i].substring(1);}else if(ret[i].charAt(0)=="l"){s+=this.fake64encode(this.byterleComp(this.rearrange(ret[i].substring(1))));}else if(ret[i].charAt(0)=="a"){s+=this.fake64encode(this.byterleComp(this.rearrange(ret[i].substring(1))));}else if(ret[i].charAt(0)=="c"){s+=this.fake64encode(ret[i].substring(1));}}return s;};MapsvrCtrl.prototype.isSamePixel=function(p1,p2){return Math.floor(p1.x)==Math.floor(p2.x)&&Math.floor(p1.y)==Math.floor(p2.y);};MapsvrCtrl.prototype.isValidLine=function(p1,p2){var margin=20;var mleft=-margin;var mright=this.width+margin;var mtop=-margin;var mbottom=this.height+margin;var left=Math.min(p1.x,p2.x);var right=Math.max(p1.x,p2.x);var top=Math.min(p1.y,p2.y);var bottom=Math.max(p1.y,p2.y);return (left<=mright)&&(top<=mbottom)&&(right>=mleft)&&(bottom>=mtop);};MapsvrCtrl.prototype.isValidArea=function(points){if(!points.length) return false;var margin=20;var mleft=-margin;var mright=this.width+margin;var mtop=-margin;var mbottom=this.height+margin;var left=null;var right=null;var top=null;var bottom=null;for(var i=0;i<points.length;i++){var p=points[i];if(left==null||p.x<left) left=p.x;if(right==null||p.x>right) right=p.x;if(top==null||p.y<top) top=p.y;if(bottom==null||p.y>bottom) bottom=p.y;}return (left<=mright)&&(top<=mbottom)&&(right>=mleft)&&(bottom>=mtop);};MapsvrCtrl.prototype.isValidCircle=function(p,r){if(!r) return false;var margin=20;var mleft=-margin;var mright=this.width+margin;var mtop=-margin;var mbottom=this.height+margin;var left=p.x-r;var right=p.x+r;var top=p.y-r;var bottom=p.y+r;return (left<=mright)&&(top<=mbottom)&&(right>=mleft)&&(bottom>=mtop);};MapsvrCtrl.prototype.makeDword=function(val){var ret="";for(var i=0;i<4;i++){var c=(val>>((3-i)*8))&0xff;if(val<0&&i==0) c=c|0x80;ret+=String.fromCharCode(c);}return ret;};MapsvrCtrl.prototype.pointsConvert=function(c){if(!c){for(var i=0;i<this.source.length;i++){this.pointsConvert(this.source[i]);}}else if(c.type==Mapsvr.LINE||c.type==Mapsvr.AREA){var org=this.map.latLon2Log(this.map.getProjOrigin());c.points.clear();for(var i=0;i<c.pos.length;i++){var p=this.map.latLon2Log(c.pos[i]);c.points.push(new Point(p.x-org.x,p.y-org.y));}}};MapsvrCtrl.prototype.dispIcon=function(index){if(!this.map)return;var c=this.contents[index];if(!c) return;if(c.type!=Mapsvr.POI) return;var p=this.map.latLon2Log(c.pos);var icon=this.icon[index];if(_bi.type==1){icon.style.filter='alpha(opacity='+this.opacity+')';}else{icon.style.opacity=this.opacity/100.0;icon.style.MozOpacity=this.opacity/100.0;}icon.style.visibility="hidden";if(p.x>0&&p.x<this.width&&p.y>0&&p.y<this.height){icon.style.display='block';}else{icon.style.display='none';}var d=this.categoryMap[c.cat].iconDiff[c.status]||new Point(0,0);var cp=this.canvasPos?this.map.latLon2Log(this.canvasPos):new Point(0,0);if(this.expand&&this.categoryMap[c.cat].expandSize[c.status]){icon.style.left=Math.floor(p.x-cp.x-icon.width/2+d.x)+"px";icon.style.top=Math.floor(p.y-cp.y-icon.height/2+d.y)+"px";}else{var hs=(this.categoryMap[c.cat].iconSize[c.status]||16)/2;icon.style.left=Math.floor(p.x-cp.x-hs+d.x)+"px";icon.style.top=Math.floor(p.y-cp.y-hs+d.y)+"px";}icon.style.visibility="visible";};MapsvrCtrl.prototype.moveContents=function(){if(this.background&&this.backgroundPos){var p=this.map.latLon2Log(this.backgroundPos);this.background.style.width=this.width+"px";this.background.style.height=this.height+"px";this.background.style.left=Math.floor(p.x)+"px";this.background.style.top=Math.floor(p.y)+"px";}if(this.canvas&&this.canvasPos){var p=this.map.latLon2Log(this.canvasPos);this.canvas.style.left=Math.floor(p.x)+"px";this.canvas.style.top=Math.floor(p.y)+"px";}};MapsvrCtrl.prototype.resizeCanvas=function(){if(this.canvas){this.canvas.style.width=this.width+"px";this.canvas.style.height=this.height+"px";this.canvas.style.left="0px";this.canvas.style.top="0px";this.canvasPos=this.map.log2LatLon(new Point(0,0));}};MapsvrCtrl.prototype.createCanvas=function(){this.removeCanvas();this.background=document.createElement("div");this.background.style.position="absolute";this.background.style.display="block";this.map.getContainer().appendChild(this.background);this.canvas=document.createElement("div");this.canvas.style.position="absolute";this.canvas.style.display="block";this.map.getContainer().appendChild(this.canvas);};MapsvrCtrl.prototype.clearCanvas=function(){if(!this.canvas) this.createCanvas();while(this.canvas.hasChildNodes()){this.canvas.removeChild(this.canvas.firstChild);}this.resizeCanvas();};MapsvrCtrl.prototype.removeCanvas=function(){if(this.background) this.map.getContainer().removeChild(this.background);this.background=null;if(this.canvas) this.map.getContainer().removeChild(this.canvas);this.canvas=null;};MapsvrCtrl.prototype.onClick=function(index){var ms=this;return function(e){if(!ms.contents.length) return;AlpsEvent.triggerEvent(ms,"click",ms.contents[index].id);CancelBubble(e);};};MapsvrCtrl.prototype.expandIcon=function(index){var ms=this;return function(){if(!ms.contents.length) return;ms.icon[index].style.zIndex=1;if(ms.expand){window.clearTimeout(ms.itimer[index]);ms.itimer[index]=window.setTimeout(ms.gidle(index,true),20);if(!ms.fixPopup) ms.closePopup();}else{ms.showPopup(index);}AlpsEvent.triggerEvent(ms,"mouseOver",ms.contents[index].id);};};MapsvrCtrl.prototype.deflateIcon=function(index){var ms=this;return function(){if(!ms.contents.length) return;ms.icon[index].style.zIndex=0;if(ms.expand){window.clearTimeout(ms.itimer[index]);ms.itimer[index]=window.setTimeout(ms.gidle(index,false),20);}if(!ms.fixPopup) ms.ptimer=window.setTimeout(ms.eventHandler("closePopup"),10);AlpsEvent.triggerEvent(ms,"mouseOut",ms.contents[index].id);};};MapsvrCtrl.prototype.gidle=function(index,xp){var ms=this;return function(e){if(!ms.contents[index]) return;var c=ms.contents[index].cat;var s=ms.contents[index].status;var gidle_min=ms.categoryMap[c].iconSize[s];var gidle_max=ms.categoryMap[c].expandSize[s]||gidle_min;if(gidle_min>gidle_max) gidle_max=gidle_min;var p=ms.icon[index];var size=p.width+(xp?2:-2);if(xp&&size>=gidle_max){size=gidle_max;}else if(!xp&&size<=gidle_min){size=gidle_min;}var icon_min=ms.categoryMap[c].iconImage[s];var icon_max=ms.categoryMap[c].expandImage[s]||icon_min;var diff_min=ms.categoryMap[c].iconDiff[s]||new Point(0,0);var diff_max=ms.categoryMap[c].expandDiff[s]||new Point(0,0);var d=new Point(0,0);var f=1;if(xp){if(size<(gidle_max+gidle_min)/2.0){p.src=icon_min;d=diff_min;f=size/gidle_min;}else{p.src=icon_max;d=diff_max;f=size/gidle_max;}}else{if(size>(gidle_max+gidle_min)/2.0){p.src=icon_max;d=diff_max;f=size/gidle_max;}else{p.src=icon_min;d=diff_min;f=size/gidle_min;}}if(p.width!=size){p.width=size;p.height=size;var center=ms.map.latLon2Log(ms.contents[index].pos);var cp=ms.canvasPos?ms.map.latLon2Log(ms.canvasPos):new Point(0,0);p.style.left=Math.floor(center.x-cp.x-p.width/2+d.x*f)+"px";p.style.top=Math.floor(center.y-cp.y-p.height/2+d.y*f)+"px";}if((xp&&size<gidle_max)||(!xp&&size>gidle_min)){ms.itimer[index]=window.setTimeout(ms.gidle(index,xp),20);}else if(xp){ms.showPopup(index);}};};MapsvrCtrl.prototype.hidePopup=function(){window.clearTimeout(this.ptimer);var a=["popup","popup_topleft","popup_topright","popup_bottomleft","popup_bottomright"];for(var i=0;i<a.length;i++){var p=document.getElementById(a[i]);if(p) p.style.display='none';}};MapsvrCtrl.prototype.showPopup=function(index){if(!this.map) return;if(!this.popup) return;if(index<0){index=this.popupIndex;if(index<0) return;}else{if(this.fixPopup&&this.popupIndex>=0) return;}this.popupIndex=index;var c=this.contents[index];if(!c.popup){if(!c.node) return;if(!this.popupxsl&&!this.popupxslServer) return;}var i=this.icon[index];if(i.style.display=="none") return;window.clearTimeout(this.ptimer);var center=this.map.latLon2Log(c.pos);var type="";if(center.y<this.height/3){if(center.x<this.width/2){type="bottomright";}else{type="bottomleft";}}else{if(center.x<this.width/2){type="topright";}else{type="topleft";}}var p=document.getElementById("popup_"+type);if(!p) p=document.getElementById("popup");if(!p){p=document.createElement("div");p.id="popup";p.style.display="none";p.style.backgroundColor="#eef";p.style.color="#000";p.style.borderStyle="solid";p.style.borderColor="#000";p.style.borderWidth="1px 2px 2px 1px";p.style.fontSize="11px";p.style.padding="1px 2px";p.innerHTML='<span id="popup_message"></span>';document.body.appendChild(p);}p.style.position="absolute";p.style.zIndex=1;var ms=this;var pm=document.getElementById(p.id+"_message");if(pm){if(!c.popup&&c.node&&this.popupxsl){if(typeof(XSLTProcessor)!="undefined"){c.popup=this.popupxsl.transformToFragment(c.node,document);}else if(typeof(c.node.transformNode)!="undefined"){c.popup=c.node.transformNode(this.popupxsl);}}if(c.popup){if(typeof(c.popup)=="string"){pm.innerHTML=c.popup;}else{pm.innerHTML="";if(typeof(document.importNode)!="undefined"){pm.appendChild(document.importNode(c.popup,true));}else{pm.appendChild(c.popup.cloneNode(true));}}}else if(c.node&&this.popupxslServer){var xmlhttp=AlpsUtil.getXMLHttp();if(xmlhttp){xmlhttp.open("POST",this.popupxslServer,true);xmlhttp.onreadystatechange=function() {if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {c.popup=xmlhttp.responseText;if(c.popup) ms.showPopup(index);}};xmlhttp.send(c.node);pm.innerHTML=c.name;}}}p.onmouseover=function(){window.clearTimeout(ms.ptimer);};p.onmouseout=function(){window.clearTimeout(ms.ptimer);if(!ms.fixPopup) ms.ptimer=window.setTimeout(ms.eventHandler("closePopup"),10);};var pos=(p.getAttribute("pos")||"right:top").split(":");var dx=parseInt(p.getAttribute("dx")||"0");var dy=parseInt(p.getAttribute("dy")||"0");var op=getObjPos2(i);p.style.visibility="hidden";p.style.left=p.style.right=p.style.top=p.style.bottom="";p.style.display='block';var pw=p.offsetWidth;var ph=p.offsetHeight;if(pos[0]=="top"){p.style.top=Math.floor(op.y-ph+dy)+"px";}else if(pos[0]=="bottom"){p.style.top=Math.floor(op.y+i.height+dy)+"px";}else if(pos[0]=="left"){p.style.left=Math.floor(op.x-pw+dx)+"px";}else if(pos[0]=="right"){p.style.left=Math.floor(op.x+i.width+dx)+"px";}if(pos[1]=="top"){p.style.top=Math.floor(op.y+dy)+"px";}else if(pos[1]=="bottom"){p.style.top=Math.floor(op.y+i.height-ph+dy)+"px";}else if(pos[1]=="left"){p.style.left=Math.floor(op.x+dx)+"px";}else if(pos[1]=="right"){p.style.left=Math.floor(op.x+i.width-pw+dx)+"px";}else if(pos[1]=="ctop"){p.style.top=Math.floor(op.y+i.height/2+dy)+"px";}else if(pos[1]=="cbottom"){p.style.top=Math.floor(op.y+i.height/2-ph+dy)+"px";}else if(pos[1]=="cleft"){p.style.left=Math.floor(op.x+i.width/2+dx)+"px";}else if(pos[1]=="cright"){p.style.left=Math.floor(op.x+i.width/2-pw+dx)+"px";}p.style.visibility="visible";};MapsvrCtrl.prototype.fake64encode=function(str){var b64="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789@/";var len=str.length;var ret="";    for(var i=0;i<len;) {var c1 = str.charCodeAt(i++) & 0xff;if(i == len){     ret += b64.charAt(c1 >> 2);     ret += b64.charAt((c1 & 0x3) << 4);     break;}var c2 = str.charCodeAt(i++);if(i == len){     ret += b64.charAt(c1 >> 2);     ret += b64.charAt(((c1 & 0x3)<< 4) | ((c2 & 0xF0) >> 4));     ret += b64.charAt((c2 & 0xF) << 2);     break;}var c3 = str.charCodeAt(i++);ret += b64.charAt(c1 >> 2);ret += b64.charAt(((c1 & 0x3)<< 4) | ((c2 & 0xF0) >> 4));ret += b64.charAt(((c2 & 0xF) << 2) | ((c3 & 0xC0) >>6));ret += b64.charAt(c3 & 0x3F);    }return ret;};MapsvrCtrl.prototype.rearrange=function(str){var ret="";for(var i=0;i<4;i++){for(var j=0;j<2;j++){for(var k=0;k<str.length/8;k++){ret+=str.charAt(k*8+j*4+i);}}}return ret;};MapsvrCtrl.prototype.byterleComp=function(str){var Raw_Rle_Sep=192;var Equal_Data_Max=(Raw_Rle_Sep+3);var Raw_Data_Max=(256 - Raw_Rle_Sep);switch(str.length){case 0:return "";case 1:return String.fromCharCode(1+Raw_Rle_Sep)+str;}var ret="";var inend=str.length;var raw_data="";for(var inbuff=0;inbuff<inend;){var max_cnt = inend - inbuff;if(max_cnt > Equal_Data_Max) max_cnt=Equal_Data_Max;var cnt=0;for(var i=1;i<max_cnt;i++){if(str.charCodeAt(inbuff)==str.charCodeAt(inbuff+i)){cnt=i+1;}else{break;}}if(cnt<3){raw_data+=str.charAt(inbuff++);if(raw_data.length>=(Raw_Data_Max-1)){ret+=String.fromCharCode(raw_data.length+Raw_Rle_Sep)+raw_data;raw_data="";}}else{if(raw_data){ret+=String.fromCharCode(raw_data.length+Raw_Rle_Sep)+raw_data;raw_data="";}ret+=String.fromCharCode(cnt-3)+str.charAt(inbuff);inbuff+=cnt;}}if(raw_data){ret+=String.fromCharCode(raw_data.length+Raw_Rle_Sep)+raw_data;}return ret;};MapsvrCtrl.prototype.mapMoving=function(){if(this.ctimer) window.clearTimeout(this.ctimer);this.hidePopup();this.moveContents();this.showPopup(-1);};MapsvrCtrl.prototype.mapMoved=function(){this.closePopup();if(this.ctimer) window.clearTimeout(this.ctimer);this.ctimer=window.setTimeout(this.eventHandler("findContents"),_delaytime);};MapsvrCtrl.prototype.layerChanged=function(){this.pointsConvert();if(this.ctimer) window.clearTimeout(this.ctimer);this.ctimer=window.setTimeout(this.eventHandler("findContents"),_delaytime);};MapsvrCtrl.prototype.smoothLayerChanging=function(){if(this.ctimer) window.clearTimeout(this.ctimer);if(this.contents.length){this.contents.clear();this.showContents();}};MapsvrCtrl.prototype.magnifyChanged=function(){this.pointsConvert();if(this.ctimer) window.clearTimeout(this.ctimer);this.ctimer=window.setTimeout(this.eventHandler("findContents"),_delaytime);};MapsvrCtrl.prototype.angleChanged=function(){this.pointsConvert();if(this.ctimer) window.clearTimeout(this.ctimer);this.ctimer=window.setTimeout(this.eventHandler("findContents"),_delaytime);};MapsvrCtrl.prototype.smoothAngleChanging=function(){if(this.ctimer) window.clearTimeout(this.ctimer);if(this.contents.length){this.contents.clear();this.showContents();}};MapsvrCtrl.prototype.packageChanged=function(){this.pointsConvert();};MapsvrCtrl.prototype.onResize=function(){this.width=this.map.getContainer().offsetWidth;this.height=this.map.getContainer().offsetHeight;if(this.canvas){this.moveContents();this.resizeCanvas();for(var i=0;i<this.contents.length;i++){if(this.contents[i].type==Mapsvr.POI){this.dispIcon(i);}}}this.findContents();};
