/*
 * Copyright 2008 Savarese Software Research Corporation.  All rights reserved.
 */
var MapDrag={CursorGrab:(navigator.product!='Gecko'||navigator.userAgent.indexOf("WebKit")>-1?"pointer":"-moz-grab"),CursorGrabbing:(navigator.product!='Gecko'||navigator.userAgent.indexOf("WebKit")>-1?"move":"-moz-grabbing"),startX:0,startY:0,target:null,OnMouseMove:function(event){if(!event){event=window.event;}
var dx=Wispers.Event.pageX(event)-MapDrag.startX;var dy=Wispers.Event.pageY(event)-MapDrag.startY;MapDrag.Map.pan(dx,dy);MapDrag.startX+=dx;MapDrag.startY+=dy;return Wispers.Event.preventDefault(event);},StopDrag:function(){var target=MapDrag.target;if(target){MapDrag.target=null
target.style.cursor=MapDrag.CursorGrab;Wispers.Event.removeEventListener(target,'mouseout',MapDrag.OnMouseOut);Wispers.Event.removeEventListener(target,'mouseup',MapDrag.OnMouseUp);Wispers.Event.removeEventListener(target,'mousemove',MapDrag.OnMouseMove);}},OnMouseUp:function(event){MapDrag.StopDrag();},OnMouseOut:function(event){if(!Wispers.Event.withinClient(event,MapDrag.Map.map_clip)){MapDrag.StopDrag();}},OnMouseDown:function(event){if(!MapDrag.target){var target=MapDrag.Map.map_div;MapDrag.target=target;MapDrag.startX=Wispers.Event.pageX(event);MapDrag.startY=Wispers.Event.pageY(event);target.style.cursor=MapDrag.CursorGrabbing;Wispers.Event.addEventListener(target,'mousemove',MapDrag.OnMouseMove);Wispers.Event.addEventListener(target,'mouseup',MapDrag.OnMouseUp);Wispers.Event.addEventListener(target,'mouseout',MapDrag.OnMouseOut);}
return Wispers.Event.preventDefault(event);}};function MapViewer(init){for(var key in init){this[key]=init[key];}
this.scale=this.map_dimensions.length-1;this.calculate_tiles(this.map_dimensions);this.tile_rows=Math.ceil(this.map.offsetHeight/this.tile_height)+2;this.tile_columns=Math.ceil(this.map.offsetWidth/this.tile_width)+2;this.tile_row_height=this.tile_rows*this.tile_height;this.tile_column_width=this.tile_columns*this.tile_width;this.num_tiles=this.tile_rows*this.tile_columns;this.tiles=new Array(this.num_tiles);this.map_clip=document.createElement('div');this.map_clip.setAttribute("id","MapClip");this.map_clip.style.overflow="hidden";this.map_clip.style.position="absolute";this.map_clip.style.backgroundColor="transparent";this.map_clip.style.width=this.map.clientWidth+"px";this.map_clip.style.height=this.map.clientHeight+"px";this.map_div=document.createElement('div');this.map_div.setAttribute("id","Map");this.map_div.style.position="absolute";this.map_div.style.backgroundColor="transparent";this.map_div.style.left="0px",this.map_div.style.top="0px";this.map_div.style.cursor=MapDrag.CursorGrab;MapDrag.Map=this;Wispers.Event.addEventListener(this.map_div,'mousedown',MapDrag.OnMouseDown);for(var i=0;i<this.num_tiles;++i){var tile=this.tiles[i]=new Image(this.tile_width,this.tile_height);tile.className="tile";tile.style.position="absolute";tile.src=this.blank_tile;this.map_div.appendChild(tile);}
this.map_clip.appendChild(this.map_div);this.map.appendChild(this.map_clip);var dim=this.map_dimensions[this.scale];this.center={x:Math.floor(dim.width/2),y:Math.floor(dim.height/2)};}
MapViewer.prototype={retile:function(i,j){var index=0;var basename=this.root+"/"+this.scale+"/"+this.basename+"-"
var dim=this.map_dimensions[this.scale];var map_tile_columns=dim.tile_columns;var map_tile_rows=dim.tile_rows;var map_index=j*map_tile_columns+i;var num_map_tiles=dim.num_tiles;var y=0;for(var row=0,start_i=i;row<this.tile_rows;++row,++j,i=start_i)
{var x=0;for(var col=0;col<this.tile_columns;++col,++i){var img=this.tiles[index+col];if(img){if((index+col)<this.num_tiles&&i<map_tile_columns&&i>=0&&j>=0&&j<map_tile_rows&&map_index<num_map_tiles)
{img.src=basename+(map_index+col)+this.suffix;}else{img.src=this.blank_tile;}
img.style.top=y+"px",img.style.left=x+"px";}
x+=this.tile_width;}
map_index+=map_tile_columns;index+=this.tile_columns;y+=this.tile_height;}},draw:function(){var i=Math.floor(this.map.clientWidth/2);var j=Math.floor(this.map.clientHeight/2);i-=(Math.floor(this.tile_columns/2)*this.tile_width+(this.center.x%this.tile_width));j-=(Math.floor(this.tile_rows/2)*this.tile_height+(this.center.y%this.tile_height));this.map_div.style.left=i+"px",this.map_div.style.top=j+"px";i=Math.floor(this.center.x/this.tile_width)-Math.floor(this.tile_columns/2);j=Math.floor(this.center.y/this.tile_height)-Math.floor(this.tile_rows/2);this.retile(i,j);},valid_scale:function(scale){return(scale!=this.scale&&scale>=0&&scale<this.map_dimensions.length);},zoom:function(scale){if(this.valid_scale(scale)){var dim1=this.map_dimensions[this.scale];var dim2=this.map_dimensions[scale];this.center.x=Math.floor((this.center.x/dim1.width)*dim2.width);this.center.y=Math.floor((this.center.y/dim1.height)*dim2.height);this.scale=scale;this.draw();}},pan:function(dx,dy){var redraw=false,center_changed=false;var left=Wispers.Element.clientLeft(this.map_div)+dx;var top=Wispers.Element.clientTop(this.map_div)+dy;var cx=this.center.x-dx;var cy=this.center.y-dy;if(left>1||top>1||left<(this.map.clientWidth-this.tile_column_width-1)||top<(this.map.clientHeight-this.tile_row_height-1)){redraw=true;}
var dim=this.map_dimensions[this.scale];if(cx>=0&&cx<dim.width){this.center.x=cx;center_changed=true;if(!redraw){this.map_div.style.left=left+"px";}}
if(cy>=0&&cy<dim.height){this.center.y=cy;center_changed=true;if(!redraw){this.map_div.style.top=top+"px";}}
if(redraw&&center_changed){this.draw();}},set_root:function(root){this.root=root;},set_basename:function(basename){this.basename=basename;},set_map_dimensions:function(dimensions){var old_dimensions=this.map_dimensions;var dim1=old_dimensions[this.scale];var dim2=dimensions[this.scale];this.map_dimensions=dimensions;this.calculate_tiles(this.map_dimensions);this.center.x=Math.floor((this.center.x/dim1.width)*dim2.width);this.center.y=Math.floor((this.center.y/dim1.height)*dim2.height);},calculate_tiles:function(dimensions){for(var i=0;i<dimensions.length;++i){var d=dimensions[i];d.tile_rows=Math.ceil(d.height/this.tile_height);d.tile_columns=Math.ceil(d.width/this.tile_width);d.num_tiles=d.tile_rows*d.tile_columns;}}}
var Map;function init_mapview(map_container,root,basename,suffix,blank_tile,tile_width,tile_height,map_dimensions,key_delta)
{Map=new MapViewer({map:document.getElementById(map_container),root:root,basename:basename,suffix:suffix,blank_tile:blank_tile,tile_width:tile_width,tile_height:tile_height,map_dimensions:map_dimensions,key_delta:key_delta});Map.draw();}
function key_nav(event){var delta=Map.key_delta;var dx=0,dy=0;var key_code=event.keyCode;switch(key_code){case 33:dx=-delta;dy=delta;break;case 34:dx=-delta;dy=-delta;break;case 35:dx=delta;dy=-delta;break;case 36:dx=delta;dy=delta;break;case 37:dx=delta;break;case 38:dy=delta;break;case 39:dx=-delta;break;case 40:dy=-delta;break;case 107:Map.zoom(Map.scale-1);return Wispers.Event.preventDefault(event);case 109:Map.zoom(Map.scale+1);return Wispers.Event.preventDefault(event);};if(key_code<=40&&key_code>=33){Map.pan(dx,dy);return Wispers.Event.preventDefault(event);}}