Subway=function(){
	var suffix=null;
	var dragDivDepth=2;
	var isDebug=false;
	
	var imgWidth=2232;
	var imgHeight=1584;
	
	//--------------------------------
	var $dragObj=null;
	
	var $stationNames=null;//站点名称
	var $sttnDescr=null;//站点维护界面
	var $sdX=null;
	var $sdY=null;
	var $sdText=null;
	
	var $sttnCircle=null;//hit提示
	//--------------------------------
	
	var crclDim=40;
	var board=new Array();
	
	var moved=false;
	var canDrag=false;
	
	var offX=0;
	var offY=0;
	var dragObjPos=null;
	var absoluteOffset={};
	
	var chessArr=[{x:400,y:200,name:'pudong dadao station'}];
	
	var subwayData=null;
	var activeChess=null;
	//--------------------------------
	
	/**
	 * 因为initOffsetXY中针对ie的“background-position-x”在界面隐藏的时候失效，
	 * $dragObj.width()在隐藏情况下结果为0，
	 * 所以，需要在界面已经显示后调用initSubwayDrag()方法。
	 */
	this.initSubwayDrag=function(suffix2,dragDivDepth2,isDebug2){
		if(suffix2 != undefined){
			suffix=suffix2;
		}
		if(dragDivDepth2 != undefined){
			dragDivDepth=dragDivDepth2;
		}
		if(isDebug != undefined){
			isDebug=isDebug2;
		}
		
		$dragObj=$("#drag_"+suffix);
		
		//清除以前的注册方法，这样，方法initSubwayDrag就可以重复调用。
		$dragObj.unbind();
		var dlgId=$dragObj.parent().attr("id");
		if(dlgId.indexOf("subwaySelDlg_") != 0){
			alert("'subwaySelDlg_' needed,防止html修改后产生差错，因此提示");
			return;
		}
		$("#"+dlgId+" div").unbind();
		$("#"+dlgId+" span").unbind();
		$("#"+dlgId+" input").unbind();
		//------------------------------------------------------清除完毕。
		
		$stationNames=$("#stationNames_"+suffix);
		$sttnDescr=$("#stationDescr_"+suffix);
		$sdX=$("#sdX_"+suffix);
		$sdY=$("#sdY_"+suffix);
		$sdText=$("#sdText_"+suffix);
		
		$sttnCircle=$("#stationCircle_"+suffix);
		$sttnCircle.css({cursor:'pointer'});
		
		//$sttnDescr.css({position:'relative',float:'left'});
		//$sttnDescr.css({width:'100%','text-align':'left'});
		
		$sttnCircle.click(function(){
			if(activeChess == null){
				return;
			}
			var info=getLineInfoOf(activeChess.name);
			if(info == null){
				return;
			}
			subwayStationSel(info.stationId,  info.line+'.'+activeChess.name,suffix);
		});
		
		$("#sdCloseBtn_"+suffix).click(function(){
			var chess={x:$sdX.text(),y:$sdY.text(),name:$sdText.val()}
			if(chess.name.length <= 2){
				alert("Station's name should exceed 2 char.");
				return;
			}
			function clbk(json){
				if(!json.success){
					alert("Fail[SW001]:"+ json.resultMsg);
					return;
				}

				resetChesses();

				$sttnDescr.hide();
			}
			//clbk();
			$.getJSON("/ajax/AjaxSubwayMap.update",chess,clbk);
		});
		$("#sdDelBtn_"+suffix).click(function(){
			function clbk(json){
				if(!json.success){
					alert("Fail[SW002]:"+ json.resultMsg);
					return;
				}
				resetChesses();
				$sttnDescr.hide();
			}
			$.getJSON("/ajax/AjaxSubwayMap.delete",{x:$sdX.text(),y:$sdY.text()},clbk);
		});
		
		$sdText.keydown(function(e){
			//alert("e.which=["+e.which+"]");
			if(e.which == 27){
				$sttnDescr.hide();
				e.stopPropagation();//禁止繁衍，否则整个地铁导航对话框会关闭。
			}
		});
		
		$sttnDescr.hide();
		
		initBoard();
		function clbk(x,y){
			$("#xCoor_"+suffix).text(x);
			$("#yCoor_"+suffix).text(y);
		}
		
		$dragObj.drag(clbk,{width:imgWidth,height:imgHeight});
		initOffsetXY();
		$dragObj.mousedown(onmousedown);
		$dragObj.mouseup(onmouseup);
		$dragObj.mousemove(onmousemove);
		$dragObj.click(onmouseclick);
		
		if(!isDebug){
			$sttnDescr.hide();
			$stationNames.hide();
			$("#debugBlock_"+suffix).hide();
		}
	}
	
	
	
	function checkStationNames(){
		if((subwayData == null) || (subwayData == undefined)){
			function clbk(json){
				if(!json.success){
					alert("Fail[SW003]:"+ json.resultMsg);
					return;
				}
				subwayData=json.gsonMap.root;
				doNamesCheck();
			};
			$.getJSON("/ajax/AjaxSubwayMap.subwayData",{},clbk);
		}else{
			doNamesCheck();
		}
	}
	
	function doNamesCheck(){
		var arr=$stationNames.children();
		for(var i=0;i<arr.length;i++){
			doNamechk(arr[i]);
		}
	}
	function doNamechk(elem){
		elem=$.ensure(elem);
		var key=elem.text();
		var id=getLineInfoOf(key);
		if(id != null){
			elem.css({color:'red','font-size':12,'text-decoration':'underline'});
		}else{
			elem.css({color:'red','font-size':20,'text-decoration':'line-through'});
		}
	}
	
	function getLineInfoOf(stationName){
		for(var lineX in subwayData){
			var id=subwayData[lineX][stationName];
			if(id != null){
				return {stationId:id,line:lineX};
			}
		}
		return null;
	}
	
	function initBoard(){
		/*var bgimg = $('img',$dragObj);
		bgimg.show();//需要显示，否则ie下无法获得图片尺寸。
		
		imgWidth = bgimg.width();
		imgHeight = bgimg.height();
		bgimg.hide();*/
		
		var xSize=Math.ceil(imgWidth/crclDim);
		var ySize=Math.ceil(imgHeight/crclDim);
		//alert("xSize="+ xSize+";ySize="+ ySize);
		for(var x=0;x<xSize;x++){
			board[x]=new Array();
			for(var y=0;y<ySize;y++){
				board[x][y]=new Array();
			}
		}
	}
	
	function cleanBoard(){
		for(var x=0;x<board.length;x++){
			for(var y=0;y<board[x].length;y++){
				board[x][y].length=0;
			}
		}
	}
	
	function initOffsetXY(){
		var bgPos=$dragObj.css("background-position");
		if((bgPos == undefined) ||(bgPos == null)){
			var x=$dragObj.css("background-position-x");//ie不支持background-position
			var y=$dragObj.css("background-position-y");
			if(x == "center"){
				x="50%";
			}
			if(y == "center"){
				y="50%";
			}
			bgPos=x +" "+ y;
		}
		if(bgPos.indexOf('%')>1){
			offX = ($dragObj.width()/2) - (imgWidth/2);//如果$dragObj是hide()的则$dragObj.width()为0
			offY = ($dragObj.height()/2) - (imgHeight/2);
		}else{
			bgPos = bgPos.replace("px", "").replace("px", "").split(" ");
			offX = parseInt(bgPos[0]);
			offY = parseInt(bgPos[1]);	
		}
		
		resetChesses();
		
		//alert("offX="+ offX+",offY="+ offY);
	}
	
	function resetChesses(){
		function clbk(json){
			if(!json.success){
				alert("Fail[SW004]:"+ json.resultMsg);
				return;
			}
			chessArr=json.gsonMap.resultList;
			
			cleanBoard();
			initAbsoluteOffset();
			$stationNames.html("");//清除界面已有的站点名称。
			
			for(var i=0;i<chessArr.length;i++){
				enableChess(chessArr[i]);
			}
			
			checkStationNames();
		};
		$.getJSON("/ajax/AjaxSubwayMap.list_007",{},clbk);
	}
	
	function enableChess(chess){
		putChess(chess);
		showChessName(chess);
	}
	
	function putChess(chess){
		var xMin=Math.floor((chess.x-crclDim/2)/crclDim);
		var xMax=Math.ceil((chess.x+crclDim/2)/crclDim);
		var yMin=Math.floor((chess.y-crclDim/2)/crclDim);
		var yMax=Math.ceil((chess.y+crclDim/2)/crclDim);
		for(var x=xMin;x<=xMax;x++){
			for(var y=yMin;y<=yMax;y++){
				if((x < 0) || (x >= board.length)){
					//alert("x="+ x);
					continue;
				}
				if((y < 0) || (y >= board[x].length)){
					//alert("y="+ y);
					continue;
				}
				board[x][y].push(chess);
			}
		}
	}
	
	function showChessName(chess){
		if(!isDebug){
			return;
		}
		var elem=$("<span></span>").text(chess.name);
		elem.click(function(){
			modifyChess(chess)
		});
		elem.css({position:'absolute'});
		elem.css({left:(chess.x+offX+absoluteOffset.left)+"px", top:(chess.y+offY+absoluteOffset.top-10)+"px"});//#########offX,offY##########
		elem.css({color:'red','font-size':12,'text-decoration':'underline'});
		
		$stationNames.append(elem);
	}
	
	function modifyChess(chess){
		$sdX.text(chess.x);
		$sdY.text(chess.y);
		
		$sdText.val(chess.name);
		$sttnDescr.css({left:((chess.x+offX)+absoluteOffset.left)+"px", top:((chess.y+offY)+absoluteOffset.top)+"px"});
		$sttnDescr.show();
		$sdText.focus();
	}
	
	function findChess(cX,cY){
		var x=Math.round(cX/crclDim);
		var y=Math.round(cY/crclDim);
		if((x < 0) || (x >= board.length)){
			return null;
		}
		if((y < 0) || (y >= board[x].length)){
			return null;
		}
		var arr=board[x][y];
		for(var i=0;i<arr.length;i++){
			var chess=arr[i];
			var b=isOnChess({x:cX,y:cY},chess);
			if(b){
				return chess;
			}
		}
		return null;
	}
	
	function isOnChess(p,chess){
		var dX=p.x-chess.x;
		var dY=p.y-chess.y;
		var r2=dX*dX+dY*dY;
		return r2<Math.pow(crclDim/2,2);
	}
	
	//---------------------------------------------------------------------------------
	function onmousedown(e){
		moved=false;
		canDrag=true;
	}
	function onmouseup(e){
		initOffsetXY();
		canDrag=false;

		initAbsoluteOffset();
	}
	
	function initAbsoluteOffset(){
		var offA=$dragObj.offset()
		
		var p=$dragObj;
		for(var i=0;i<dragDivDepth;i++){
			var tmp=p.parent();
			if(tmp == null){
				break;
			}
			p=tmp;
		}
		
		var offB=p.offset();
		absoluteOffset.left=Math.round(offA.left-offB.left);
		absoluteOffset.top=Math.round(offA.top-offB.top);
	}
	
	function onmousemove(e){
		moved=true;
		if(canDrag){
			return;
		}
		
		dragObjPos=$dragObj.offset();
		dragObjPos.left=Math.round(dragObjPos.left);
		dragObjPos.top=Math.round(dragObjPos.top);
		$("#mx_"+suffix).text(e.pageX-dragObjPos.left);
		$("#my_"+suffix).text(e.pageY-dragObjPos.top);
		
		var chess=findChess(e.pageX-dragObjPos.left-offX,e.pageY-dragObjPos.top-offY);//#########offX,offY##########
		if(chess != null){
			$sttnCircle.css({left:(chess.x+offX+absoluteOffset.left-crclDim/2)+"px", top:(chess.y+offY+absoluteOffset.top-crclDim/2)+"px"});//#########offX,offY##########
			activeChess=chess;
			$sttnCircle.show();
			var s=(chess == null)?"":chess.name;
			$("#chessFinded_"+suffix).text(s);
		}else{
			activeChess=null;
			$sttnCircle.hide();
		}
	}
	
	function onmouseclick(e){
		//alert("click");
		if(moved){
			$sttnDescr.hide();
			return;
		}
		if(isDebug){
			var chess={x:(e.pageX-dragObjPos.left-offX),y:(e.pageY-dragObjPos.top-offY),name:""};//#########offX,offY##########
			modifyChess(chess);
		}
	}
}