﻿function CFrame(){
    this.config={
        headHeight:144,
        infoWidth:297,
        width:980,
        height:600
    };
}
function CMap(div){
    this.holder=div;
    this.config={
        areaid:11,
        schName:"北京大学",
        imgsize:256,
        extent:1152,
        multiple:2,
        marginTop:144,
		left:0,
		top:0
        };
    this.icon={
        width:83,
        height:52
        };
    this.menulist=["当前位置居中","|",["做记号","b"],["纠错","f"],["放大","g"],["缩小","s"],"|","关于6D校园"];
    this.menuconfig={
        tagdis:"visible",
        x:0,
        y:0
        };
    this.binfoconfig={
        ti:"",
        con:""
    };
    this._center;
    this.label;
    this.bInfo;
    this.tag;
    this.marker;
    this.menu;
    this.mvl;
    this.cover;
    this.zoomState=0;
    this.mapMoveConfig={
        state:false,
        count:0,
        stepX:0,
        stepY:0,
        setX:5,
        setY:5
        }
    this.mapPanoConfig={
        id:0,
        t:new Date().getTime(),
        s:undefined
    }
    this.mapHotSpotConfig={
        id:-1,
        x:0,
        y:0
    }
    this.labelConfig={
        type:0
    }
    this.mouseopt={
        down:false,
        move:false,
        dx:0,dy:0,
        ex:0,ey:0
        };
    this.mapdiv=new Array();
    this.cacheimage=new Array();
    this.mark={
        t:new Array(),
        d:new Array(),
        v:0
        }
    this.debug={
        t:"",
        d:""
        }
	this.bust=new Array(); 
    this.markconfig={
        p:0
    }
	this.builds=new Array();
}
CMap.prototype={
    _getimage:function(){
        var img=document.createElement("IMG");
        return img;
    },
    _getdiv:function(){
        var div=document.createElement("div");
        return div;
    },
    _loadmap:function(){
        var bounds=this.getBounds();
        var x1=Math.floor(bounds.minX/this.config.imgsize);
        var x2=Math.ceil(bounds.maxX/this.config.imgsize);
        var y1=Math.floor(bounds.minY/this.config.imgsize);
        var y2=Math.ceil(bounds.maxY/this.config.imgsize);
        var m=this.config.multiple;
        var imgsize=this.config.imgsize;
        var maxV=this.config.extent*Math.pow(2,m)/this.config.imgsize;
        if(x1<0) x1=0; else if(x1>maxV) x1=maxV;
        if(x2<0) x2=0; else if(x2>maxV) x2=maxV;
        if(y1<0) y1=0; else if(y1>maxV) y1=maxV;
        if(y2<0) y2=0; else if(y2>maxV) y2=maxV;
        this.mvl.style.left=-bounds.minX+"px";
        this.mvl.style.top=-bounds.minY+"px";
        var zoomState;
        if((zoomState=this.zoomState)!=0 && this.cacheimage.length>0){
            var cacheimage=this.cacheimage[this.cacheimage.length-1];
            for(var i=0;i<cacheimage.length;i++){
                var curImg=cacheimage[i];
                curImg.style.left=(curImg.offsetLeft/imgsize*zoomState)*imgsize+"px";
                curImg.style.top=(curImg.offsetTop/imgsize*zoomState)*imgsize+"px";
                curImg.style.width=curImg.width*zoomState+"px";
                curImg.style.height=curImg.height*zoomState+"px";
            }
        }
            for(var y=y1;y<y2;y++){
                for(var x=x1;x<x2;x++){
		            var div=this._getdiv();
                    div.style.position="absolute";
                    div.style.left=x*imgsize+"px";
                    div.style.top=y*imgsize+"px";
                    div.style.width=imgsize+"px";
                    div.style.height=imgsize+"px";
		            div.style.background="url(http://map.6dxy.com/"+map.config.areaid+"/map"+(m+1)+"/"+x+","+y+".jpg) no-repeat";
                    this.mapdiv.push(div);
                    this.mvl.appendChild(div);
                }
        }
        this._mapimageLoad();
    },
    _mapimageLoad:function(){
        while(this.cacheimage.constructor==Array && this.cacheimage.length>1){
            var cacheimage=new Array();
            var cacheimage=this.cacheimage.shift();
            var tm;
            while((tm=cacheimage.pop())!=null){
                try{
                    this.mvl.removeChild(tm);
                }
                catch(exp){}
            }
        }
    },
    _mapimageRemove:function(cacheimage){
    },
    _resize:function(evt){
        this.onresize();
        this._clearmap();
        this._loadmap();
        fit();
    },
    _mapmousedown:function(evt){
        switch(evt.button){
            case 0:
                break;
            case 1:
                if(nav()!=1){
                    this.mouseopt.down=false;
                    return false;
                }
                break;
            default:
                this.mouseopt.down=false;
                return false;
		}
        this.mouseopt.down=true;
        this.mvl.style.cursor="move";
        this.mouseopt.ex=evt.clientX;
        this.mouseopt.ey=evt.clientY;
        this.mouseopt.dx=this.mvl.offsetLeft;
        this.mouseopt.dy=this.mvl.offsetTop;
        if(this.mvl.setCapture){this.mvl.setCapture();}
        else if(window.captureEvents){window.captureEvents(Event.MOUSEMOVE|Event.MOUSEUP);}
    },
    _mapmove:function(evt){
        var tx=evt.clientX+document.documentElement.scrollLeft+document.body.scrollLeft;
        var ty=evt.clientY+document.documentElement.scrollTop+document.body.scrollTop-this.config.marginTop-20;
        if(this.mouseopt.down==false){
            var tw=this.tag.offsetWidth;
            this.tag.style.left=((tx+tw)>this.holder.offsetWidth ? tx-tw : tx)+"px";
            this.tag.style.top=ty+"px";
            var m=this.config.multiple;
            var p=this._mapcoordinate(evt.clientX,evt.clientY);
            var x1=0,y1=0;
            var x2=Math.floor(p.x/Math.pow(2,m-1)),y2=Math.floor(p.y/Math.pow(2,m-1));
            var x3,y3;
            var x4,y4;
            var p1213,p1214,p3431,p3432;
            if(this.mapHotSpotConfig.id!=-1){
                var h=this.mapHotSpotConfig.id;
                var j=0;
                for(var i=0;i<hSpot[h].length;i+=2){
                    x3=hSpot[h][i],y3=hSpot[h][i+1];
                    x4=hSpot[h][i+2],y4=hSpot[h][i+3];
                    p1213=(x2-x1)*(y3-y1)-(x3-x1)*(y2-y1);
                    p1214=(x2-x1)*(y4-y1)-(x4-x1)*(y2-y1);
                    p3431=(x4-x3)*(y1-y3)-(x1-x3)*(y4-y3);
                    p3432=(x4-x3)*(y2-y3)-(x2-x3)*(y4-y3);
                    if((p1213*p1214<=0) && (p3431*p3432<=0)) { j++; }
                    this.mvl.style.cursor="pointer";
                    this.tag.style.visibility=this.menuconfig.tagdis;
                }
                if(j%2==0){
                    this.mapHotSpotConfig.id=-1;
                    this.mvl.style.cursor="default";
                    this.tag.style.visibility="hidden";
                }
            }
            else{
                try{
                    var x=Math.floor(x2/64);
                    var y=Math.floor(y2/64);
                    for(var ha=0;ha<hArea[x][y].length;ha++){
                        var j=0;
                        var h=hArea[x][y][ha];
                        for(var i=0;i<hSpot[h].length;i+=2){
                            x3=hSpot[h][i],y3=hSpot[h][i+1];
                            x4=hSpot[h][i+2],y4=hSpot[h][i+3];
                            p1213=(x2-x1)*(y3-y1)-(x3-x1)*(y2-y1);
                            p1214=(x2-x1)*(y4-y1)-(x4-x1)*(y2-y1);
                            p3431=(x4-x3)*(y1-y3)-(x1-x3)*(y4-y3);
                            p3432=(x4-x3)*(y2-y3)-(x2-x3)*(y4-y3);
                            if((p1213*p1214<=0) && (p3431*p3432<=0)) { j++; }
                        }
                        if(j%2==1){
                            this.tag.innerHTML=hData[h][1];
                            this.mapHotSpotConfig.id=h;
                            this.mvl.style.cursor="pointer";
                            this.tag.style.visibility=this.menuconfig.tagdis;
                            break;
                        }
                    }
                    if(this.mapHotSpotConfig.id==-1){
                        this.mvl.style.cursor="default";
                        this.tag.style.visibility="hidden";
                    }
                }
                catch(exp){
                    this.mapHotSpotConfig.id=-1
                    this.mvl.style.cursor="default";
                    this.tag.style.visibility="hidden";
                }
            }
        }
        else{
            this.mouseopt.move=true;
            this.tag.style.visibility="hidden";
            this._displayMenu(0);
            this.mvl.style.left=this.mouseopt.dx+(evt.clientX-this.mouseopt.ex)+"px";
            this.mvl.style.top=this.mouseopt.dy+(evt.clientY-this.mouseopt.ey)+"px";
        }
        if(this.labelConfig.type>0){
            this.label.style.left=(tx+15)+"px";
            this.label.style.top=(ty+20)+"px";
            this.label.style.visibility="visible";
        }
    },
    _menumousemove:function(){
        this.menuconfig.tagdis="hidden";
    },
    _menumouseout:function(){
        this.menuconfig.tagdis="visible";
    },
    _mapbuild:function(iData){
        if(typeof iData=="object"){
            this._binfohidden();
            this.binfoconfig.con.src="/tool/view.htm?id="+iData[0];
            var m=Math.pow(2,this.config.multiple-1)
            HidePano();
            this.bInfo.style.left=(iData[2]*m-48)+"px";
            this.bInfo.style.top=(iData[3]*m-364)+"px";
            this.bInfo.style.visibility="visible";
            this.tag.style.visibility="hidden";
            this._mapMovesStep(iData[2]+240/m,iData[3]-180/m);
        }
    },
    _mapmouseclick:function(x,y){
        switch(this.labelConfig.type){
            case 0:
                if(this.tag.style.visibility=="visible"){
                    this._binfohidden();
                    var iData=hData[this.mapHotSpotConfig.id];
					_Map.IntroDataBind(iData[0],onIntroDataBindSucceeded);
                }
                break;
            case 1:
                this._binfohidden();
                var m=Math.pow(2,this.config.multiple-1)
                var p=map._mapcoordinate(x,y);
                var mark=this.binfoconfig.con;
                mark.src="/tool/mark.htm";
                p.x=Math.round(p.x/m);
                p.y=Math.round(p.y/m);
                this.markconfig.p=p;
                setTimeout(function(){
                    mark.contentWindow.a=map.config.areaid;                    
                    mark.contentWindow.p=p;
                    try{mark.contentWindow.pageInit();}catch(e){}
                    },1);
                this.bInfo.style.left=(p.x*m-48)+"px";
                this.bInfo.style.top=(p.y*m-364)+"px";
                this.bInfo.style.visibility="visible";
                this.mvl.style.cursor="default";
                this.tag.style.visibility="hidden";
                this._mapMovesStep(p.x+240/m,p.y-180/m);
                break;
            case 2:
                this._binfohidden();
                var m=Math.pow(2,this.config.multiple-1)
                var p=map._mapcoordinate(x,y);
                var mark=this.binfoconfig.con;
                mark.src="/tool/debug.htm";
                p.x=Math.round(p.x/m);
                p.y=Math.round(p.y/m);
                setTimeout(function(){
                    mark.contentWindow.a=map.config.areaid;                    
                    mark.contentWindow.p=p;
                    try{mark.contentWindow.pageInit();}catch(e){}
                    },1);
                this.bInfo.style.left=(p.x*m-48)+"px";
                this.bInfo.style.top=(p.y*m-364)+"px";
                this.bInfo.style.visibility="visible";
                this.mvl.style.cursor="default";
                this.tag.style.visibility="hidden";
                this._mapMovesStep(p.x+240/m,p.y-180/m);
                break;
        }
    },
    _mapmouseclick1:function(evt){
        switch(this.labelConfig.type){
            case 0:
                if(this.tag.style.visibility=="visible"){
                    this._binfohidden();
                    var iData=hData[this.mapHotSpotConfig.id];
					_Map.IntroDataBind(iData[0],onIntroDataBindSucceeded);
                }
                break;
            case 1:
                this._binfohidden();
                var m=Math.pow(2,this.config.multiple-1);
                var p=map._mapcoordinate(evt.clientX,evt.clientY);
                var mark=this.binfoconfig.con;
                mark.src="/tool/mark.htm";
                p.x=Math.round(p.x/m);
                p.y=Math.round(p.y/m);
                this.markconfig.p=p;
                setTimeout(function(){
                    mark.contentWindow.a=map.config.areaid;                    
                    mark.contentWindow.p=p;
                    try{mark.contentWindow.pageInit();}catch(e){}
                    },1);
                this.bInfo.style.left=(p.x*m-48)+"px";
                this.bInfo.style.top=(p.y*m-364)+"px";
                this.bInfo.style.visibility="visible";
                this.mvl.style.cursor="default";
                this.tag.style.visibility="hidden";
                this._mapMovesStep(p.x+240/m,p.y-180/m);
                break;
            case 2:
                this._binfohidden();
                var m=Math.pow(2,this.config.multiple-1);
                var p=map._mapcoordinate(evt.clientX,evt.clientY);
                var mark=this.binfoconfig.con;
                mark.src="/tool/debug.htm";
                p.x=Math.round(p.x/m);
                p.y=Math.round(p.y/m);
				this.markconfig.p=p;
                setTimeout(function(){
                    mark.contentWindow.a=map.config.areaid;                    
                    mark.contentWindow.p=p;
                    try{mark.contentWindow.pageInit();}catch(e){}
                    },1);
                this.bInfo.style.left=(p.x*m-48)+"px";
                this.bInfo.style.top=(p.y*m-364)+"px";
                this.bInfo.style.visibility="visible";
                this.mvl.style.cursor="default";
                this.tag.style.visibility="hidden";
                this._mapMovesStep(p.x+240/m,p.y-180/m);
                break;
        }
    },
    _markcreate:function(t,d){
        this.labelConfig.type=0;
        var mod=0;
        if(d.length>0) mod=1;
        var mark=new this._newmark(this.markconfig.p,t,d);
        var tag=new this._newtag(this.markconfig.p,mark,mod);
        this.mark.t.push(tag);
        this.mark.d.push(mark);
        this.mvl.appendChild(mark);
        this.mvl.appendChild(tag);
        this._binfohidden();
    },
    _newtag:function(p,mark,mod){
        var m=Math.pow(2,map.config.multiple-1);
        var tag=document.createElement("div");
        if(mod==0) tag.className="mark"; else tag.className="debug";
        tag.style.left=(p.x*m-12)+"px";
        tag.style.top=(p.y*m-15)+"px";
        CEvent.addListener(tag,"click",function(){
            mark.style.visibility="visible";
            });
        CEvent.addListener(tag,"mousemove",function(){map._menumousemove();});
        CEvent.addListener(tag,"mouseout",function(){map._menumouseout();});
        return tag;
    },
 _newbust:function(p,n,ps,cid)
    {
        var m=Math.pow(2,map.config.multiple-1);
        var bust=document.createElement("div");
        bust.className="bust";
        bust.style.left=(p.x*m-15)+"px";
        bust.style.top=(p.y*m-59)+"px";
        CEvent.addListener(bust,"click",function(){
            map._binfohidden(); 
            map.binfoconfig.con.getElementsByTagName("iframe")[0].src="/bust.aspx?cid="+cid;
            var m=Math.pow(2,map.config.multiple-1)
            HidePano();
            map.bInfo.style.left=(iData[2]*m-48)+"px";
            map.bInfo.style.top=(iData[3]*m-364)+"px";
            map.bInfo.style.visibility="visible";
            map.tag.style.visibility="hidden";
            map._mapMovesStep(iData[2]+240/m,iData[3]-180/m);
            });
        CEvent.addListener(bust,"mousemove",function(){map._menumousemove();});
        CEvent.addListener(bust,"mouseout",function(){map._menumouseout();});
        return bust;
    },
    _newmark:function(p,t,d,mod){
        var m=Math.pow(2,map.config.multiple-1);
        var mark=document.createElement("div");
        mark.className="bInfo";
        mark.style.left=(p.x*m-5)+"px";
        mark.style.top=(p.y*m-184)+"px";
        var bg=document.createElement("div");
        bg.className="bg";
        mark.appendChild(bg);
        var ti=document.createElement("div");
        ti.className="ti";
        var txt=document.createElement("span");
        txt.style.cssText="float:left";
        txt.innerHTML=t;
        var closeimg=document.createElement("img");
        closeimg.src=static+"image/info/close.gif";
        closeimg.alt="关闭";
        closeimg.style.cssText="float:right;margin-top:4px;cursor:pointer";
        ti.appendChild(txt);
        ti.appendChild(closeimg);
        var con=document.createElement("div");
        con.className="con";
        var txts=document.createElement("div");
        txts.className="txts";
        txts.innerHTML=d;
        con.appendChild(txts);
        CEvent.addListener(closeimg,"click",function(){
            if(nav()==1) setTimeout(function(){mark.style.visibility="hidden";},300);
            else mark.style.visibility="hidden";
            });
        mark.appendChild(ti);
        mark.appendChild(con);
        mark.style.zIndex="2";
        mark.style.visibility="visible";
        CEvent.addListener(mark,"mousemove",function(){map._menumousemove();});
        CEvent.addListener(mark,"mouseout",function(){map._menumouseout();});
        return mark;
    },
    _newdebug:function(p,d,ps){
        var m=Math.pow(2,map.config.multiple-1);
        var debug=document.createElement("div");
        debug.className="bInfo";
        debug.style.left=(p.x*m-48)+"px";
        debug.style.top=(p.y*m-364)+"px";
        var bg=document.createElement("div");
        bg.className="bg";
        debug.appendChild(bg);
        var ti=document.createElement("div");
        ti.className="ti";
        var txt=document.createElement("span");
        txt.style.cssText="float:left";
        txt.innerHTML="错误描述";
        var closeimg=document.createElement("img");
        closeimg.src=static+"image/info/close.gif";
        closeimg.alt="关闭";
        closeimg.style.cssText="float:right;margin-top:4px;cursor:pointer";
        ti.appendChild(txt);
        ti.appendChild(closeimg);
        var con=document.createElement("div");
        con.className="con";
        var txts=document.createElement("div");
        txts.className="txts";
        txts.innerHTML=d;
        if(ps.length>0) {txts.innerHTML+="<br /><a href=\"http://upload.6dxy.com"+ps+"\" target=\"_blank\"><img src=\"http://upload.6dxy.com"+ps+"\" width=\"80\" height=\"60\" /></a>";}
        con.appendChild(txts);
        CEvent.addListener(closeimg,"click",function(){
            if(nav()==1) setTimeout(function(){debug.style.visibility="hidden";},300);
            else debug.style.visibility="hidden";
            });
        debug.appendChild(ti);
        debug.appendChild(con);
        debug.style.zIndex="2";
        debug.style.visibility="visible";
        CEvent.addListener(debug,"mousemove",function(){map._menumousemove();});
        CEvent.addListener(debug,"mouseout",function(){map._menumouseout();});
        return debug;
    },
    _inforemove:function(){
        while(this.binfoconfig.con.childNodes.length>0)
            this.binfoconfig.con.removeChild(this.binfoconfig.con.childNodes[0]);
    },
    _mapmouseout:function(){
        this.label.style.visibility="hidden";
        this.tag.style.visibility="hidden";
    },
    _mapmouseup:function(evt){
        window.focus();
        this.mvl.style.cursor="default";
        if(this.mvl.releaseCapture)
            this.mvl.releaseCapture();
        else if(window.releaseEvents)
            window.releaseEvents(Event.MOUSEMOVE|Event.MOUSEUP);

        if(this.mouseopt.down==true&&this.mouseopt.move==true)
        {
            this._clearmap();
            this._center.x=this.holder.offsetWidth/2-this.mvl.offsetLeft;
            this._center.y=this.holder.offsetHeight/2-this.mvl.offsetTop;
            this._loadmap();
        }
        if(evt.button==2){
            this.menuconfig.x=evt.clientX;
            this.menuconfig.y=evt.clientY;
            this._addMenu(evt);
            var x=evt.clientX+document.documentElement.scrollLeft+document.body.scrollLeft;
            var y=evt.clientY-ifr.config.headHeight+document.documentElement.scrollTop+document.body.scrollTop;
            var xc=150,yc=152;
            if((x+xc)>this.holder.offsetWidth) x-=xc;
            if((y+yc)>this.holder.offsetHeight) y-=yc;
            if(nav()==1){x-=3,y-=3;}else{x-=1,y-=1;}
            this.menu.style.left=x+"px";
            this.menu.style.top=y+"px";
            this._displayMenu(1);
            this.mouseopt.down=false;
            return false;
		}
        this.mouseopt.down=false;
        this.mouseopt.move=false;
    },
    _mapcontextmenu:function(evt){
        return false;
    },
    _displayMenu:function(val){
        if(val==1){
            this._labelhidden();
            this.menu.style.display="block";
        }
        else{
            this.menu.style.display="none";
        }
    },
    _mapmark:function(evt){
        this._binfohidden();
        HidePano();
        this.label.style.left="-1000em";
        this.label.innerHTML="点击左键做记号,右键结束";
        this.label.style.color="#000";
        this.label.style.border="1px solid #333";
        this.label.style.visibility="hidden";
        setTimeout(function(){
            try{
                var tx=evt.clientX+document.documentElement.scrollLeft+document.body.scrollLeft;
                var ty=evt.clientY+document.documentElement.scrollTop+document.body.scrollTop-map.config.marginTop;
                map.label.style.left=(tx+15)+"px";
                map.label.style.top=ty+"px";
            }
            catch(e){}
            map.label.style.visibility="visible";
        },0);
        this.label.style.visibility="visible";
        this._displayMenu(0);
        this.labelConfig.type=3;
        setTimeout(function(){map.labelConfig.type=1;},310);
    },
    _mapdebug:function(evt){
        this._binfohidden();
        HidePano();
        this.label.style.left="-1000em";
        this.label.innerHTML="点击左键纠正地图错误,右键结束";
        this.label.style.color="#ff3300";
        this.label.style.border="1px solid #ff3300";
        this.label.style.visibility="hidden";
        setTimeout(function(){
            try{
                var tx=evt.clientX+document.documentElement.scrollLeft+document.body.scrollLeft;
                var ty=evt.clientY+document.documentElement.scrollTop+document.body.scrollTop-map.config.marginTop;
                map.label.style.left=(tx+15)+"px";
                map.label.style.top=ty+"px";
            }
            catch(e){}
            map.label.style.visibility="visible";
        },0);
        this.label.style.visibility="visible";
        this._displayMenu(0);
        this.labelConfig.type=3;
        setTimeout(function(){map.labelConfig.type=2;},310);
    },
    _addMenu:function(evt){
        this._removeMenu();
        for(var i=0;i<this.menulist.length;i++){
            var line=new function(){
                var line=document.createElement("div");
                CEvent.addListener(line,"mouseover",function(){line.style.cursor="pointer"; line.style.color="#fff"; line.style.backgroundColor="#0a246a";});
                CEvent.addListener(line,"mouseout",function(){line.style.cursor="pointer"; line.style.color="#000"; line.style.backgroundColor="";});
                switch(i){
                    case 0:
                        CEvent.addListener(line,"click",function(){
                            setTimeout(function(){
                                var m=Math.pow(2,map.config.multiple-1);
                                var p=map._mapcoordinate(map.menuconfig.x,map.menuconfig.y);
                                map._mapMovesStep(Math.floor(p.x/m),Math.floor(p.y/m));},310);
                            });
                        break;
                    case 2:
                        CEvent.addListener(line,"click",function(evt){map._mapmark(evt)});
                        break;
                    case 3:
                        CEvent.addListener(line,"click",function(evt){map._mapdebug(evt)});
                        break;
                    case 4:
                        CEvent.addListener(line,"click",function(){
                            setTimeout(function(){
                                scale._scalezoom(1);
                                map._displayMenu(0);
                                },310);
                            });
                        break;
                    case 5:
                        CEvent.addListener(line,"click",function(){
                            setTimeout(function(){
                                scale._scalezoom(-1);
                                map._displayMenu(0);
                                },310);
                            });
                        break;
                    case 7:
                        CEvent.addListener(line,"click",function(){map._displayMenu(0);window.open("http://www.6dxy.com/about/about.shtml","_blank","");});
                        break;
                }
                return line;
                };
            var txt;
            if(typeof this.menulist[i]=="object"){
                txt=document.createTextNode(this.menulist[i][0]);
                line.className=this.menulist[i][1];
                line.appendChild(txt);
            }
            else if(this.menulist[i]!="|"){
                txt=document.createTextNode(this.menulist[i]);
                line.appendChild(txt);
            }
            else{
                line=document.createElement("div");
                line.className="line";
            }
            this.menu.appendChild(line);
        }
    },
    _mapmousewheel:function(evt){
        var delta;
        if(evt.wheelDelta){
            delta=evt.wheelDelta/120;
        }
        else if(evt.detail){
            delta=-evt.detail/3;
        }
        if (delta && this.zoomState==false){
            if (delta<0)
                scale._scalezoom(-1);
            else
                scale._scalezoom(1);
        }
    },
    _mappano:function(evt){
        this._labelhidden();
        var m=Math.pow(2,this.config.multiple-1);
        var p=this._mapcoordinate(evt.clientX,evt.clientY);
        var sx=Math.floor(p.x/m);
        var sy=Math.floor(p.y/m);
        var x=Math.floor(sx/this.config.imgsize);
        var y=Math.floor(sy/this.config.imgsize);
        var line=new Array();
        if(typeof pano[x]=="object" && typeof pano[x][y]=="object"){
            for(var i=0;i<pano[x][y].length;i+=4){
                line.push(Math.pow((pano[x][y][i]-sx),2)+Math.pow((pano[x][y][i+1]-sy),2));
            }
            this._markerMove(x,y,array_min(line));
        }
        else if(typeof panoMin.x!="undefined" && typeof panoMin.y!="undefined"){
            var min=Math.pow((pano[panoMin.x][panoMin.y][0]-sx),2)+Math.pow((pano[panoMin.x][panoMin.y][1]-sy),2);
            x=panoMin.x,y=panoMin.y;
            var id=0;
            for(var i=0;i<pano.length;i++){
                if(typeof pano[i]=="object")
                    for(var j=0;j<pano[i].length;j++){
                        if(typeof pano[i][j]=="object")
                            for(var k=0;k<pano[i][j].length;k+=4){
                                line=Math.pow((pano[i][j][k]-sx),2)+Math.pow((pano[i][j][k+1]-sy),2);
                                if(min>line){
                                    min=line;
                                    x=i;
                                    y=j;
                                    id=k/4;
                                }
                            }
                        else
                            continue;
                    }
                else
                    continue;
            }
            this._markerMove(x,y,id);
        }
    },
    _sharelink:function(x,y,id){
        var url="http://panoshare.6dxy.com/?param="+base64encode(utf16to8("id="+id+"&area="+this.config.areaid+"&x="+x+"&y="+y));
        $("sharelink").href=url;
    },
    _markerorientation:function(x,y,id){
        for(var i=0;i<pano.length;i++){
            
        }
    },
    _markerMove:function(x,y,id){
        this._binfohidden();
        var m=Math.pow(2,this.config.multiple-1);
        var mx=pano[x][y][id*4]*m;
        var my=pano[x][y][id*4+1]*m;
        var o=pano[x][y][id*4+3];
        var pid=pano[x][y][id*4+2];
        var cssText=this.marker.style.cssText;
        var val=cssText.substr(cssText.indexOf("marker")+6,1);
        cssText=cssText.replace("marker"+val,"marker"+o);
        this.marker.style.cssText=cssText;
        this.marker.style.left=(mx-this.icon.width/2)+"px";
        this.marker.style.top=(my-this.icon.height+18)+"px";
        visiPano();
        var px=pano[x][y][id*4],py=pano[x][y][id*4+1];
        this._mapMovesStep(px,py)
        if(pano[x][y][id*4+2]!=this.mapPanoConfig.id){
            this.mapPanoConfig.id=pano[x][y][id*4+2];
            setTimeout(function(){requestCube(pid,map.config.areaid);},1000);
			this._sharelink(mx/m,my/m,pid);
        }
    },
    _markerUpDown:function(x,y,id){
        this._binfohidden();
        var m=Math.pow(2,this.config.multiple-1);
        var mx=pano[x][y][id*4]*m-this.icon.width/2;
        var my=pano[x][y][id*4+1]*m-this.icon.height+18;
        var o=pano[x][y][id*4+3];
        var cssText=this.marker.style.cssText;
        var val=cssText.substr(cssText.indexOf("marker")+6,1);
        cssText=cssText.replace("marker"+val,"marker"+o);
        this.marker.style.cssText=cssText;
        this.marker.style.left=mx+"px";
        this.marker.style.top=my+"px";
        visiPano();
        var px=pano[x][y][id*4],py=pano[x][y][id*4+1];
        this._mapMovesStep(px,py)
        this.mapPanoConfig.id=pano[x][y][id*4+2];
    },
    _markerResize:function(){
        var zoomState=this.zoomState;
        this.marker.style.left=(this.marker.offsetLeft+this.icon.width/2)*zoomState-this.icon.width/2+"px";
        this.marker.style.top=(this.marker.offsetTop+this.icon.height)*zoomState-this.icon.height+"px";
        this.bInfo.style.left=(this.bInfo.offsetLeft+48)*zoomState-48+"px";
        this.bInfo.style.top=(this.bInfo.offsetTop+364)*zoomState-364+"px";
        for(var i=0;i<this.mark.d.length;i++){
            this.mark.t[i].style.left=((this.mark.t[i].offsetLeft+12)*zoomState-12)+"px";
            this.mark.t[i].style.top=((this.mark.t[i].offsetTop+15)*zoomState-15)+"px";
            this.mark.d[i].style.left=((this.mark.d[i].offsetLeft+48)*zoomState-48)+"px";
            this.mark.d[i].style.top=((this.mark.d[i].offsetTop+364)*zoomState-364)+"px";
        }
        if(this.debug.t!="" && this.debug.d!=""){
            this.debug.t.style.left=((this.debug.t.offsetLeft+12)*zoomState-12)+"px";
            this.debug.t.style.top=((this.debug.t.offsetTop+15)*zoomState-15)+"px";
            this.debug.d.style.left=((this.debug.d.offsetLeft+48)*zoomState-48)+"px";
            this.debug.d.style.top=((this.debug.d.offsetTop+364)*zoomState-364)+"px";
        }
    },
    _mapMovesStep:function(x,y){
        var m=Math.pow(2,this.config.multiple-1);
        var point=this._mvlcoordinate(x,y);
        this.setCenter(point);
        var starX=this.mvl.offsetLeft;
        var starY=this.mvl.offsetTop;
        var stopX=-(x*m-this.holder.offsetWidth/2);
        var stopY=-(y*m-this.holder.offsetHeight/2);
        if(Math.abs(stopX-starX)<this.mapMoveConfig.setX){
            this.mapMoveConfig.stepX=1;
            this.mapMoveConfig.setX=Math.floor(Math.abs(stopX-starX));
        }
        else{
            this.mapMoveConfig.stepX=Math.floor((stopX-starX)/this.mapMoveConfig.setX);
        }
        if(Math.abs(stopY-starY)<this.mapMoveConfig.setY){
            this.mapMoveConfig.stepY=1;
            this.mapMoveConfig.setY=Math.floor(Math.abs(stopY-starY));
        }
        else{
            this.mapMoveConfig.stepY=Math.floor((stopY-starY)/this.mapMoveConfig.setY);
        }
        
        this.mapMoveConfig.count=0;
        this.mapMoveConfig.state=setInterval(function(){map._mapMoves();},1);
        this._displayMenu(0);
    },
    _mapMoves:function(){
        this.mapMoveConfig.count++;
        var cssText=this.mvl.style.cssText;
        if(this.mapMoveConfig.count<this.mapMoveConfig.setX){
            cssText=cssText.replace(this.mvl.style.left,(this.mvl.offsetLeft+this.mapMoveConfig.stepX)+"px");
        }
        if(this.mapMoveConfig.count<this.mapMoveConfig.setY){
            cssText=cssText.replace(this.mvl.style.top,(this.mvl.offsetTop+this.mapMoveConfig.stepY)+"px");
        }
        this.mvl.style.cssText=cssText;
        if(this.mapMoveConfig.count>=this.mapMoveConfig.setX && this.mapMoveConfig.count>=this.mapMoveConfig.setY){
            clearInterval(this.mapMoveConfig.state);
            this.mapMoveConfig.count=0;
            this.mapMoveConfig.stepX=0;
            this.mapMoveConfig.stepY=0;
            this._clearmap();
            this._loadmap();
            this.mapMoveConfig.setX=5;
            this.mapMoveConfig.setY=5;
        }
    },
    _mapkeydown:function(evt){
        if(!$("LngDiv")){
            var num=scale.moveConfig.number;
            if(evt.keyCode>36 && evt.keyCode<41 && scale.moveConfig.state==0){
                this.mvl.style.cursor="default";
                this.tag.style.visibility="hidden";
                switch(evt.keyCode){
                    case 37:
                        scale._scaleMove(1,num,0);
                        break;
                    case 38:
                        scale._scaleMove(1,0,num);
                        break;
                    case 39:
                        scale._scaleMove(1,-num,0);
                        break;
                    case 40:
                        scale._scaleMove(1,0,-num);
                        break;
                }
            }
        }
    },
    _mapkeyup:function(evt){
        if(!$("LngDiv")){
            if(evt.keyCode>36 && evt.keyCode<41 && scale.moveConfig.state!=0){
                scale._scaleMove(0);
            }
        }
    },
    _mapinfoinit:function(){
        this.binfoconfig.ti=document.createElement("div");
        this.binfoconfig.con=document.createElement("iframe");
        this.binfoconfig.con.src="about:blank";
        this.binfoconfig.con.scrolling="no";
        this.binfoconfig.con.width="442px";
        this.binfoconfig.con.height="364px";
        this.binfoconfig.con.frameBorder="no";
        this.binfoconfig.con.allowTransparency="true";
        if(nav()==1) this.binfoconfig.con.frameBorder="auto";
        this.bInfo.appendChild(this.binfoconfig.con);
    },
    _binfohidden:function(){
        this.bInfo.style.visibility="hidden";
        this._menumouseout();
    },
    _labelhidden:function(){
        this.labelConfig.type=0;
        this.label.style.visibility="hidden";
    },
    _removeMenu:function(){
        while(this.menu.childNodes.length){
            this.menu.removeChild(this.menu.childNodes[0]);
        }
    },
    _clearmap:function(){
        var imgsize=this.config.imgsize;
        var img;
        var tm;
        var cacheimage=new Array();
        while((tm=this.mapdiv.shift())!=null){
            var img = this._getimage();
            img.style.position="absolute";
            img.style.left=tm.offsetLeft+"px";
            img.style.top=tm.offsetTop+"px";
            img.style.width=imgsize+"px";
            img.style.height=imgsize+"px";
	        img.src=tm.style.backgroundImage.replace(/url\(|\)/g,"");
	        cacheimage.push(img);
	        this.mvl.appendChild(img);
	        this.mvl.removeChild(tm);
        }
        this.cacheimage.push(cacheimage);
    },
    _mapcoordinate:function(cx,cy){
        var m=Math.pow(2,this.config.multiple-1);
        if(nav()==1){
            cx+=document.documentElement.scrollLeft+document.body.scrollLeft-2;
            cy+=document.documentElement.scrollTop+document.body.scrollTop-(this.config.marginTop+2)
        }
        else{
            cx+=document.documentElement.scrollLeft+document.body.scrollLeft;
            cy+=document.documentElement.scrollTop+document.body.scrollTop-this.config.marginTop
        }
        var mx=(cx-this.mvl.offsetLeft);
        var my=(cy-this.mvl.offsetTop);
        return new CPoint(mx,my);
    },
    _screencoordinate:function(mx,my){
        var m=Math.pow(2,this.config.multiple-1);
        var cx=mx*m+this.mvl.offsetLeft;
        var cy=my*m+this.mvl.offsetTop;
        if(nav()==1){cx+=2;cy+=this.config.marginTop+2;}else{cy+=this.config.marginTop;}
        return new CPoint(cx,cy);
    },
    _mvlcoordinate:function(mx,my){
        var m=Math.pow(2,this.config.multiple-1);
        var mvlx=mx*m;
        var mvly=my*m;
        return new CPoint(mvlx,mvly);
    },
    _orientationmap:function(v){
        var e=this.config.extent;
        var m=this.config.multiple;
        var cx=this.holder.offsetWidth/2-this.mvl.offsetLeft;
        var cy=this.holder.offsetHeight/2-this.mvl.offsetTop;
        if(!v){
			if(this.config.left==0 && this.config.top==0){
				cx=e*Math.pow(2,m-1),cy=e*Math.pow(2,m-1);
			}
			else{
				cx=this.config.left*Math.pow(2,m-1),cy=this.config.top*Math.pow(2,m-1);
			}
        }
        else if(v>0){cx*=(2*v),cy*=(2*v);} else {cx/=(2*Math.abs(v)),cy/=(2*Math.abs(v));}
        return new CPoint(cx,cy);
    },
    _mapcenter:function(v){
        var e=this.config.extent;
        var m=this.config.multiple;
        this.setCenter(this._orientationmap(v));
    },
    _mapclickdelay:function(evt){
        var ntime=new Date().getTime();
        var otime=this.mapPanoConfig.t;
        this.mapPanoConfig.t=ntime;
        if(ntime-otime<300){
            clearTimeout(this.mapPanoConfig.s);
            this._mappano(evt);
        }
        else{
            var x=evt.clientX;
            var y=evt.clientY;
            this.mapPanoConfig.s=setTimeout(function(){map._mapmouseclick(x,y);},300);
        }
    }
}
CMap.prototype.init=function(){
    var e=this.config.extent;
    var m=this.config.multiple;
    this.holder.style.overflow="hidden";
    this.mvl=document.createElement("div");
    this.mvl.style.cssText="position:absolute;left:0;top:0;z-index:1";
    this.marker=document.createElement("div");
    this.marker.style.cssText="background: url(http://static.6dxy.com/image/marker0.png) no-repeat !important; background: none; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled=true, sizingMethod=scale, src=http://static.6dxy.com/image/marker0.png); width: 83px; height: 52px; position: absolute; z-index: 4; visibility: hidden;";
    this.mvl.appendChild(this.marker);
    this.holder.appendChild(this.mvl);
    this.label=document.createElement("div");
    this.label.className="label";
    this.holder.appendChild(map.label);
    this.tag=document.createElement("tag");
    this.tag.className="tag";
    this.holder.appendChild(this.tag);
    this._mapcenter();
    this.menu=document.createElement("div");
    this.menu.className="menu";
    this.holder.appendChild(this.menu);
    
    this.bInfo=document.createElement("div");
    this.bInfo.className="bInfo";
    this._mapinfoinit();
    this.mvl.appendChild(this.bInfo);
    this._loadmap();
    buslist();
    setTimeout(function(){CEvent.addListener(window,"resize",function(){map._resize();});},0);
    CEvent.addListener(this.holder,"mousedown",this._mapmousedown.bindAsEventListener(this));
    CEvent.addListener(this.holder,"mouseup",this._mapmouseup.bindAsEventListener(this));
    if(nav()==1){
        CEvent.addListener(this.holder,"click",this._mapclickdelay.bindAsEventListener(this));
        CEvent.addListener(this.holder,"dblclick",this._mapclickdelay.bindAsEventListener(this));
    }
    else{
        CEvent.addListener(this.holder,"click",this._mapmouseclick1.bindAsEventListener(this));
        CEvent.addListener(this.holder,"dblclick",this._mappano.bindAsEventListener(this));
    }
    CEvent.addListener(this.holder,"mousemove",this._mapmove.bindAsEventListener(this));
    CEvent.addListener(this.holder,"mouseout",function(){map._mapmouseout();});
    CEvent.addListener(this.holder,"mousewheel",this._mapmousewheel.bindAsEventListener(this));
    CEvent.addListener(this.holder,"DOMMouseScroll",this._mapmousewheel.bindAsEventListener(this));
    this.holder.oncontextmenu=function(){return false;};
    CEvent.addListener(document,"keydown",this._mapkeydown.bindAsEventListener(this));
    CEvent.addListener(document,"keyup",this._mapkeyup.bindAsEventListener(this));
    
    CEvent.addListener(this.menu,"mousemove",function(){map._menumousemove();});
    CEvent.addListener(this.menu,"mouseout",function(){map._menumouseout();});
    CEvent.addListener(this.bInfo,"mousemove",function(){map._menumousemove();});
    CEvent.addListener(this.bInfo,"mouseout",function(){map._menumouseout();});
}
CMap.prototype.reload=function(){
    this._loadmap();
}
CMap.prototype.onresize=function(evt){
    fit();
}
CMap.prototype.setCenter=function(p){
    this._center = p;
}
CMap.prototype.getCenter=function(){
    return this._center;
}
CMap.prototype.getBounds=function(){
    var p1= new CPoint(this._center.x-this.holder.offsetWidth/2,this._center.y-this.holder.offsetHeight/2);
    var p2= new CPoint(this._center.x+this.holder.offsetWidth/2,this._center.y+this.holder.offsetHeight/2)
    return new CBounds(p1,p2);
}
function CScale(div){
    this.holder=div;
    this.scaleBackground;
    this.scaleZoomIn;
    this.scaleSlider;
    this.scaleZoomOut;
    this.scaleTop;
    this.scaleRight;
    this.scaleBottom;
    this.scaleLeft;
    
    this.position=74;
    this.multiple=13;
    this.config={
        width:51,
        height:160
    }
    this.moveConfig={
        state:0,
        count:0,
        number:10
    }
}
CScale.prototype={
    _scalezoom:function(v){
        if((map.config.multiple+v)<1||(map.config.multiple+v)>3) return false;
        var m=map.config.multiple;
        map.config.multiple+=v;
        if(v>0) map.zoomState=2; else map.zoomState=0.5;
        map.tag.style.visibility="hidden";
        map._mapcenter(v);
        map._resize();
        map._markerResize();
        setTimeout(function(){map.zoomState=false;},0);
		for(var i=0;i<map.bust.length;i++){
            var tm=map.bust[i];
            var p=new CPoint(tm.offsetLeft,tm.offsetTop);
            tm.style.left=((p.x+15)*map.zoomState-15)+"px";
            tm.style.top=((p.y+59)*map.zoomState-59)+"px";
            }
        this.scaleSlider.style.top=(parseInt(this.scaleSlider.style.top)-this.multiple*v)+"px";
		if(map.builds.length>0){
			remBuilds();
			appBuilds();
		}
    },
    _scaleMove:function(s,x,y){
        this.moveConfig.count=0;
        if(s=="1"){
            this.moveConfig.state=setInterval(function(){scale._scaleMoveState(x,y);},1);
        }
        else{
            clearInterval(this.moveConfig.state);
            this.moveConfig.state=0;
            this.moveConfig.count=0;
            
            map._clearmap();
            map._center.x=map.holder.offsetWidth/2-map.mvl.offsetLeft;
            map._center.y=map.holder.offsetHeight/2-map.mvl.offsetTop;
            map._loadmap();
        }
    },
    _scaleMoveState:function(x,y){
        map.mvl.style.left=(map.mvl.offsetLeft+x)+"px";
        map.mvl.style.top=(map.mvl.offsetTop+y)+"px";
    }
}
CScale.prototype.init=function(){
    this.scaleBackground=document.createElement("div");
    this.scaleBackground.className="bg";
    this.scaleZoomIn=document.createElement("div");
    this.scaleZoomIn.className="zoomin";
    CEvent.addListener(this.scaleZoomIn,"click",function(){scale._scalezoom(1);});
    this.scaleSlider=document.createElement("div");
    this.scaleSlider.className="slider";
    var m=map.config.multiple;
    this.scaleSlider.style.top=(this.position-this.multiple*m)+"px";
    this.scaleZoomOut=document.createElement("div");
    this.scaleZoomOut.className="zoomout";
    CEvent.addListener(this.scaleZoomOut,"click",function(){scale._scalezoom(-1);});
    var num=this.moveConfig.number;
    this.scaleTop=document.createElement("div");
    this.scaleTop.className="zoomtop";
    CEvent.addListener(this.scaleTop,"mousedown",function(){scale._scaleMove(1,0,num);});
    CEvent.addListener(this.scaleTop,"mouseout",function(){scale._scaleMove(0);});
    CEvent.addListener(this.scaleTop,"mouseup",function(){scale._scaleMove(0);});
    this.scaleRight=document.createElement("div");
    this.scaleRight.className="zoomright";
    CEvent.addListener(this.scaleRight,"mousedown",function(){scale._scaleMove(1,-num,0);});
    CEvent.addListener(this.scaleRight,"mouseout",function(){scale._scaleMove(0);});
    CEvent.addListener(this.scaleRight,"mouseup",function(){scale._scaleMove(0);});
    this.scaleBottom=document.createElement("div");
    this.scaleBottom.className="zoombottom";
    CEvent.addListener(this.scaleBottom,"mousedown",function(){scale._scaleMove(1,num,0);});
    CEvent.addListener(this.scaleBottom,"mouseout",function(){scale._scaleMove(0);});
    CEvent.addListener(this.scaleBottom,"mouseup",function(){scale._scaleMove(0);});
    this.scaleLeft=document.createElement("div");
    this.scaleLeft.className="zoomleft";
    CEvent.addListener(this.scaleLeft,"mousedown",function(){scale._scaleMove(1,0,-num);});
    CEvent.addListener(this.scaleLeft,"mouseout",function(){scale._scaleMove(0);});
    CEvent.addListener(this.scaleLeft,"mouseup",function(){scale._scaleMove(0);});
    this.holder.appendChild(this.scaleBackground);
    this.holder.appendChild(this.scaleZoomIn);
    this.holder.appendChild(this.scaleSlider);
    this.holder.appendChild(this.scaleZoomOut);
    this.holder.appendChild(this.scaleTop);
    this.holder.appendChild(this.scaleRight);
    this.holder.appendChild(this.scaleBottom);
    this.holder.appendChild(this.scaleLeft);
    this.holder.oncontextmenu=function(){return false;};
}
