﻿/////       Last Update @ 2006-05-26               /////
/////       Version: 5.2.1.28508                   /////
////////////////////////////////////////////////////////
//////  SuperMap IS WebControl Client JavaScript  //////
//////       For Netscape and Mozilla browser     //////
////////////////////////////////////////////////////////

function SetMVIMAGE(mapId)
{
	var drawlayerid = mapId +"_drawlayer";
	var drawlayer = document.getElementById(drawlayerid);
	if(!drawlayer){
		drawlayer = document.createElement(drawlayerid);
		var worklayer = SMISGetWorkLayer(mapId); 
		worklayer.appendChild(drawlayer);
		drawlayer.style.width =worklayer.style.width;
		drawlayer.style.height = worklayer.style.height;
		drawlayer.style.left = worklayer.style.left;
		drawlayer.style.top = worklayer.style.top;
		drawlayer.style.position = "absolute";
		drawlayer.style.visibility = "visible";
		drawlayer.id = drawlayerid;
		var jg = new jsGraphics(drawlayerid);
		drawlayer.jg = jg;
	}
	var map = document.getElementById(mapId +"_MVIMAGE");
	var mapcontrol = document.getElementById(mapId);
	mapcontrol.removeChild(map);
	mapcontrol.appendChild(map);
}

function SplitX(PointsValue, offsetX)
{
	if(typeof(offsetX) =="undefined"){offsetX = 0;}
	var Xpoints = new Array();
	var ArrPoints = PointsValue.split(",");
	for(var i=0; i<ArrPoints.length/2; i++){
		Xpoints[i] = parseInt(ArrPoints[2*i])+offsetX; 
	}
	return Xpoints;
}

function SplitY(PointsValue,offsetY )
{
	if(typeof(offsetY) =="undefined"){offsetY = 0;}
	var Ypoints = new Array();
	var ArrPoints = PointsValue.split(",");
	for(var i=0; i<ArrPoints.length/2; i++){
		Ypoints[i] =parseInt(ArrPoints[2*i+1])+offsetY; 
	}
	return Ypoints;
}

// 获取 map image 对象.  //
function SMISGetMap(mapId)
{
	var _map = document.getElementById(mapId +"_MVIMAGE");
	if(!_map)   _map = document.getElementById(mapId);
	if(!_map)   return null;
	if(!_map.mapId){ _map.mapId = mapId; }
	return _map;
}

function Map_DoCallback(methodName, methodParameters)
{
    showBusyFlag(this.mapId);
    // "PAN|33&33"
    var argument = methodName + "|" + methodParameters;
    WebForm_DoCallback(this.mapId, argument, MapControl_Callback, null, null, false);
}	

// Action 
function SMISActionStart(mapID, action)
{
	var editLineId = "SMISEditLine";
	var line = document.getElementById(editLineId);
	if(line){
		document.forms[0].removeChild(line);
	}
	mapID = mapID.replace("_MVIMAGE", "");
	
	var _map = SMISGetMap(mapID);
	if(!BeforeActionStart(_map)){ return; }
	// 用于解决在 MyIE2 中出现的 ActionStart 之后，地图图片消失的异常bug。 //
	//var v = _map.style.visibility;
	//_map.CurrentAction = "";
	eval(mapID + "_SMISMapActionStart(_map, action)");
	//_map.style.visibility = v;
	AfterActionStarted(_map);
	_map.DoCallback = Map_DoCallback;
}

function SMISMapActionStop(map)
{
	if(!BeforeActionStop(map)){ return; }
	
	map.onmousedown = null;
	map.onmousemove = null;
	map.onmouseup = null;
	map.onclick = null;
	map.ondblclick = null;
	map.style.cursor = "";
	map.bActionStarted = false;
	
	AfterActionStopped(map);
}

//***************************** Mouse Event ********************************

function SMISOnMouseDown(evt)
{
	this.bActionStarted = true;
	var relativePos = SMISGetMouseMapRelativePosition(evt,this.map?this.map:this);
	this.PointsParam.AddPoint(relativePos.x, relativePos.y);
	return false;
}

function SMISPanOnMouseDown(evt)
{
	this.bActionStarted = true;
	// hide the customLayer. --ahnan 2004-07-08
	var customLayerID = this.id.replace("_MVIMAGE","") + "_divCustomLayer";
	var customLayer = document.getElementById(customLayerID);
	if (customLayer){ customLayer.style.visibility = "hidden";}
	//hide the custompolygon --wangsui 2006-12-04
    var idValue=this.id.replace("_MVIMAGE","")+"_idValue";
    if(document.getElementById(idValue))
    {
        var id=document.getElementById(idValue).value.split("&");
	    for(var i=0;i<id.length;i++)
	    {
	        var line=document.getElementById(id[i]);
	        if(line){line.style.visibility="hidden";}
	    }
    }
	var relativePos = SMISGetMouseMapRelativePosition(evt,this.map?this.map:this);
	this.PointsParam.AddPoint(relativePos.x, relativePos.y);

	window.status = this.PointsParam.GeneratePointsString();
	
	// set to absolute
	//this.style.position = "absolute";
	return false;
}

function SMISOnMouseUp(evt)
{
	var map = this;
	if(this.map){map = this.map;}
	if(!this.bActionStarted){return;}

	SMISMapActionStop(map);
	var relativePos = SMISGetMouseMapRelativePosition(evt,map);
	this.PointsParam.AddPoint(relativePos.x, relativePos.y);
	var theform = document.forms[0];
	SMISCreateHiddenField(theform, map.id + "_Action", map.id + "_Action", map.CurrentAction);
	var pointsString = this.PointsParam.GeneratePointsString();
	SMISCreateHiddenField(theform, map.id + "_PointsParam", map.id + "_PointsParam",pointsString);
	//  debug script callback. --ahnan 2005-06-15
	map.DoPostBack();
	this.bActionStarted = false;
	return;

	var startPoint = this.PointsParam.GetPoint(0);
	
	var argument = "";
	var params = "";
	switch(map.CurrentAction){
		case "PAN"		: 
			argument = "PanByPixel"; 
			var offsetX = relativePos.x - startPoint.x;
			var offsetY = relativePos.y - startPoint.y;
			params = offsetX + "&" + offsetY;
			break;
		case "ZOOMIN"	: 
			argument = "ZoomIn";
			params = startPoint.x + "&" + startPoint.y + "&" + relativePos.x + "&" + relativePos.y;
			SMISRemoveRect(map);
			break;
		case "ZOOMOUT"	: 
			argument = "ZoomOut";
			params = startPoint.x + "&" + startPoint.y + "&" + relativePos.x + "&" + relativePos.y;
			SMISRemoveRect(map);
			break;
		default:
			map.DoPostBack();
			return;
			break;
	}
	
	map.DoCallback(argument, params);
	
	while(this.PointsParam.Points.length > 0){
		this.PointsParam.Points.pop();
	}
	SMISCreateHiddenField(theform, map.id + "_Action", map.id + "_Action", "");
	SMISCreateHiddenField(theform, map.id + "_PointsParam", map.id + "_PointsParam", "");

	SMISActionStart(evt,map.id, map.CurrentAction);
}

function SMISCircleOnMouseUp(evt)
{
	if(!this.bActionStarted){return;}
	var posEnd = SMISGetMouseMapRelativePosition(evt,this.map?this.map:this);
	SMISMapActionStop(this);
	this.PointsParam.AddPoint(posEnd.x, posEnd.y);
	var theform = document.forms[0];
	SMISCreateHiddenField(theform, this.id + "_Action", this.id + "_Action", this.CurrentAction);
	var pointsString = this.PointsParam.GeneratePointsString();
	SMISCreateHiddenField(theform, this.id + "_PointsParam", this.id + "_PointsParam",pointsString);
	
	this.DoPostBack();
}

function SMISRectOnMouseMove(evt)
{
	if(!this.bActionStarted){return false;}
	var startPoint = this.PointsParam.GetPoint(0);
	if(startPoint){
		startPoint.x += this.origin.x;
		startPoint.y += this.origin.y;
	}
	if((evt.button == 0|evt.button ==65535) &&  startPoint != null){
		var absolutePos = SMISGetMouseAbsolutePosition(evt);
		SMISDrawingRect(this, startPoint, absolutePos);
	}
	return false;
}

//must return false ,otherwise mouseup event will not be invoked
function SMISPanOnMouseMove(evt)
{	
	if(!this.bActionStarted){return false;}
	var startPoint = this.PointsParam.GetPoint(0);
	if(startPoint){
		startPoint.x += this.origin.x;
		startPoint.y += this.origin.y;
	}
	//if(evt.button == 0 && startPoint != null)先设为65535,不知道为什么会变成65535 
	if((evt.button == 0|evt.button ==65535) && startPoint != null){
		var absolutePos = SMISGetMouseAbsolutePosition(evt);
		if(!SMISCheckMousePosition(evt,this)){
			return false;
		}
		SMISPaningImage(this,startPoint,absolutePos);
	}
	return false;
}

//must return false ,otherwise mouseup event will not be invoked
function SMISCircleOnMouseMove(evt)
{
	if(!this.bActionStarted){return false;}
	var startPoint = this.PointsParam.GetPoint(0);
	if(startPoint){
		startPoint.x += this.origin.x;
		startPoint.y += this.origin.y;
	}
	if((evt.button == 0|evt.button ==65535) &&  startPoint != null){
		var absolutePos = SMISGetMouseAbsolutePosition(evt);
		SMISDrawingCircle(this, startPoint, absolutePos);
	}
	return false;
}

function SMISPolygonOnMouseMove(evt)
{
	if(!this.bActionStarted){return false;}
	var map = SMISGetInnerMap(this);
	var absolutePos = SMISGetMouseAbsolutePosition(evt);
	SMISDrawingPolygon(map, absolutePos, map.PolygonClosed);
	return false;
}

function SMISPolygonOnMouseClick(evt)
{
	this.bActionStarted = true;
	var map = SMISGetInnerMap(this);
	var relativePos = SMISGetMouseMapRelativePosition(evt,map);
	map.PointsParam.AddPoint(relativePos.x, relativePos.y);
	return false;
}

function SMISPolygonOnDblClick(evt)
{
	var map = SMISGetInnerMap(this);
	SMISMapActionStop(this);
	SMISMapActionStop(map);
	var theform = document.forms[0];
	SMISCreateHiddenField(theform, map.id + "_Action", map.id + "_Action", map.CurrentAction);
	// OnMouseClick 会被调用两次，这里去掉最后的那一次。 
	map.PointsParam.Points.pop();
	var pointsString = map.PointsParam.GeneratePointsString();
	SMISCreateHiddenField(theform, map.id + "_PointsParam", map.id + "_PointsParam",pointsString);
	map.DoPostBack();
}

//***************************** End Mouse Event ****************************

//Paning Image
function SMISPaningImage(map, startPoint, curPoint)
{
	//PanWorkLayer(map, startPoint, curPoint);
	if(!map.map){
	    PanMapCells(map, startPoint, curPoint);
    	return;
	}
	var clipTop, clipRight, clipBottom, clipLeft;
	var currentLeft, currentTop, currentRight, currentBottom;
	
	// Calculate absolute current coordinates of the image
	currentLeft = map.offset.x + (curPoint.x - startPoint.x);
	currentTop = map.offset.y + (curPoint.y - startPoint.y);
	if(map.map){
		map.style.left = (currentLeft+map.origin.x)+"px";
		map.style.top = (currentTop+map.origin.y)+"px"; 
		SMISClipPolygon(map, true, curPoint.x - startPoint.x, curPoint.y - startPoint.y);
		return;
	}
	try{
		currentRight = currentLeft + map.width;
		currentBottom = currentTop + map.height;
	}
	catch(e){
		currentRight = currentLeft + map.map.width;
		currentBottom = currentTop + map.map.height;
	}
		// Check to see if image goes out of bounds, and if so, set the clipping parameters
	if ( currentTop > map.offset.y ) clipTop = 0;
	else clipTop = map.offset.y - currentTop;
			
	if (currentRight > (map.offset.x + map.width)) clipRight = (map.offset.x + map.width) - currentLeft;
	else clipRight = currentRight - currentLeft;
		
	if (currentBottom > (map.offset.y + map.height)) clipBottom = (map.offset.y + map.height) - currentTop;
	else clipBottom = currentBottom - currentTop;
			
	if (currentLeft > map.offset.x) clipLeft = 0;
	else clipLeft = map.offset.x - currentLeft;
	// Set the map image's style parameters to actually move the image	
	map.style.left = currentLeft + "px"; 
	map.style.top = currentTop + "px";	
	map.style.clip = 'rect(' + clipTop + ' ' +  clipRight + ' ' + clipBottom + ' ' + clipLeft +')';
}

//***************************** Drawing ************************************
//Enable VML support
function SMISEnableVML()
{
	// todo: support ie5.0, ie5.5
	if(document.namespaces)
	{
		document.namespaces.add("v", "urn:schemas-microsoft-com:vml")
	}
	if(document.styleSheets.length < 1)
	{
		var _oStyle = document.createElement("style");
		document.body.appendChild(_oStyle);
	}
	document.styleSheets.item(0).addRule("v\\:*", "behavior:url(#default#VML)");
}

function SMISDrawingRect(map, startPoint, curPoint)
{
	curPoint.x = Math.max(map.origin.x, Math.min(curPoint.x, map.origin.x + map.offsetWidth+2));
	curPoint.y = Math.max(map.origin.y, Math.min(curPoint.y, map.origin.y + map.offsetHeight+2));
	var left = Math.min(startPoint.x, curPoint.x);
	var top = Math.min(startPoint.y, curPoint.y);
	var width = Math.abs(curPoint.x - startPoint.x);
	var height =  Math.abs(curPoint.y - startPoint.y);
	
	var drawlayerId = map.id.replace("_MVIMAGE","") + "_drawlayer";
	var drawlayer =document.getElementById(drawlayerId);
	drawlayer.jg.clear();
	drawlayer.jg.setColor("#ff0000"); // red 
	drawlayer.jg.drawRect(left-map.origin.x,top-map.origin.y,width,height); 
	drawlayer.jg.paint();
	
	
}

function SMISRemoveRect(map)
{
	var rect = document.getElementById("SMISRect");
	if(rect) { document.body.removeChild(rect);	}
	rect = null;
}


function SMISDrawingCircle(map, startPoint, curPoint)
{
	
	curPoint.x = Math.max(map.origin.x, Math.min(curPoint.x, map.origin.x + map.offsetWidth+2));
	curPoint.y = Math.max(map.origin.y, Math.min(curPoint.y, map.origin.y + map.offsetHeight+2));
	var radius = Math.sqrt(Math.pow((curPoint.x - startPoint.x), 2) + Math.pow((curPoint.y - startPoint.y), 2))
	var left = startPoint.x - radius;
	var top = startPoint.y -radius;
	
	var drawlayerId = map.id.replace("_MVIMAGE","") + "_drawlayer";
	var drawlayer =document.getElementById(drawlayerId);
	drawlayer.jg.clear();
	drawlayer.jg.setColor("#ff0000"); // red 
	drawlayer.jg.drawEllipse(left-map.origin.x,top-map.origin.y,radius*2,radius*2);
	drawlayer.jg.paint();
}

function SMISRemoveCircle(map)
{
	var circle = document.getElementById("SMISCircle");
	if(circle) { document.body.removeChild(circle);	}
	circle = null;
}

function SMISDrawingPolygon(map,curPoint,polygonClosed)
{
	var pointsValue = map.PointsParam.GetPointsString(map.origin);
	var index = map.PointsParam.Points.length-1;
	var lastPoint = map.PointsParam.GetPoint(index);
	pointsValue += ","+ curPoint.x+","+curPoint.y; 
	var drawlayerId = map.id.replace("_MVIMAGE","") + "_drawlayer";
	var drawlayer =document.getElementById(drawlayerId);
	drawlayer.jg.clear();
	var Xpoints = SplitX(pointsValue,-map.origin.x);
	var Ypoints = SplitY(pointsValue,-map.origin.y);
	drawlayer.jg.setColor("#ff0000"); // red
	drawlayer.jg.setStroke(1);
	if (polygonClosed){
		drawlayer.jg.drawPolygon(Xpoints, Ypoints);
	}
	else{
		drawlayer.jg.drawPolyline(Xpoints, Ypoints);
	}
	drawlayer.jg.paint();
}

function SMISRemovePolygon(map)
{
	var line = document.getElementById("SMISLine");
	if(line) { document.body.removeChild(line);	}
	line = null;
}

//***************************** End Drawing ******************************

function hideBusyFlag(mapControlID)
{
	
	if(mapControlID == null || typeof(mapControlID) == "undefined") { return;}
	var divLoading = document.getElementById(mapControlID+"_divLoading");
	if( divLoading != null && divLoading.style != null){
		divLoading.style.visibility = "hidden";
		divLoading.style.zIndex = "-1";
	}
}

function showBusyFlag(mapControlID)
{
	if(mapControlID == null || typeof(mapControlID) == "undefined") { return;}
	var divLoading = document.getElementById(mapControlID+"_divLoading");
	if( divLoading != null && divLoading.style != null){
		divLoading.style.zIndex = "999";
		divLoading.style.visibility = "visible";
	}
}

function SetMapAbsPosition(mapID)
{
	//alert("SetMapAbsPosition");
	// offset 为内部元素定位所需要的相对偏移量 //
	// origin 为绝对座标 //
	
/*
	var mapControl = document.getElementById(mapID.replace("_MVIMAGE",""));
	var map = document.getElementById(mapID);
	map.origin = SMISGetAbsolutePosition(map);
	map.offset = SMISGetOffsetPosition(mapControl);
	*/
	var mapControl = document.getElementById(mapID.replace("_MVIMAGE",""));
	var map = document.getElementById(mapID);
	map.origin = SMISGetAbsolutePosition(map);
	if(mapControl.style.position.toLowerCase() != "absolute"){
		map.offset = map.origin; 
	}
	else{
		map.offset = new SMISPoint(0, 0);	
	}
}

// for layerControl 
function CheckVisibleAll(layerControlID)
{
	var layerCount = eval(document.getElementById(layerControlID + ":LayerCount").value);
	var layerVisible;
	for(var i=0; i<layerCount; i++){
		layerVisible = document.getElementById(layerControlID + ":V" + i);
		if(layerVisible && !layerVisible.disabled) {
			layerVisible.checked = eval(document.getElementById(layerControlID+"_CheckVisibleAll").checked);
		}
	}
}

function CheckQueryableAll(layerControlID)
{
	var layerCount = eval(document.getElementById(layerControlID + ":LayerCount").value);
	var layerQueryable;
	for(var i=0; i<layerCount; i++){
		layerQueryable = document.getElementById(layerControlID + ":Q" + i);
		if(layerQueryable) { layerQueryable.checked = document.getElementById(layerControlID+"_CheckQueryableAll").checked; }
	}
}

function SMISPrintMap(mapControlClientID, mapControlPage, printControlPage, mapUrl, imageHandlerEnabled)
{
	if( !mapControlClientID || !mapControlPage || !printControlPage ) { return false; }
	if ( !mapUrl ) { mapUrl = document.getElementById(mapControlClientID+"_MVIMAGE").src; }
	var address = document.getElementById(mapControlClientID+"_MapServer_Address").value;
	var port	= document.getElementById(mapControlClientID+"_MapServer_Port").value;
	printUrl = printControlPage + "?Address=" + address + "&Port=" + port + "&MapControlClientID=" + mapControlClientID + "&MapControlPage=" + mapControlPage + "&ImageHandlerEnabled=" + imageHandlerEnabled;
	var printWin = window.open(printUrl, "", "resizable,toolbar,menubar,scrollbars,status" );
}

function SMISAdjustCustomDivPosition(customDivID, alignStyle)
{
	var customDiv = document.getElementById(customDivID);
	var offsetX, offsetY;
	if(typeof(customDiv) != "undefined"){
		switch(alignStyle){
			case "LeftTop":		offsetX = 0;	offsetY = 0;	break;
			case "LeftMiddle":	offsetX = 0;	offsetY = customDiv.offsetHeight / 2;	break;
			case "LeftBottom":	offsetX = 0;	offsetY = customDiv.offsetHeight;		break;
			case "CenterTop":	offsetX = customDiv.offsetWidth / 2;	offsetY = 0;	break;
			case "CenterMiddle":offsetX = customDiv.offsetWidth / 2;	offsetY = customDiv.offsetHeight / 2;	break;
			case "CenterBottom":offsetX = customDiv.offsetWidth / 2;	offsetY = customDiv.offsetHeight;		break;
			case "RightTop":	offsetX = customDiv.offsetWidth;		offsetY = 0;	break;
			case "RightMiddle":	offsetX = customDiv.offsetWidth;		offsetY = customDiv.offsetHeight / 2;	break;
			case "RightBottom":	offsetX = customDiv.offsetWidth;		offsetY = customDiv.offsetHeight;		break;
			default:			offsetX = 0;	offsetY = 0;	break;
		}
		customDiv.style.zIndex = 1000;
		customDiv.style.left = (SMISGetNumFromPixel(customDiv.style.left)-offsetX)+"px";
		customDiv.style.top = (SMISGetNumFromPixel(customDiv.style.top)-offsetY)+"px"; 
	}
}

function SMISRegisterToolControl(toolControlID, mapControlID)
{
	var input = document.getElementById(mapControlID + "_ToolControls");
	if(typeof(input) != "undefined" && input.value.indexOf(toolControlID+",") < 0){	// 防止重复注册 //
		input.value += toolControlID + ",";
	}
}

function SMISSwitchCurrentTool(map, action)
{
	var toolControl;
	var toolControlsID = map.id.replace("_MVIMAGE","") + "_ToolControls";
	var toolControls = document.getElementById(toolControlsID);
	if(typeof(toolControls) != "undefined" && toolControls != null){
		var arrToolControls = toolControls.value.split(",");
		for(var i=0; i<arrToolControls.length; i++){
			if(arrToolControls[i] == ""){continue;}
			
			toolControl = document.getElementById(arrToolControls[i]);
			//alert(toolControl.attributes["activesrc"].value);
			if(typeof(toolControl) == "object" && toolControl.attributes["activesrc"].value != "" && toolControl.attributes["inactivesrc"].value != ""){
				if(toolControl.attributes["actionName"].value == action){
					toolControl.src = toolControl.attributes["activesrc"].value;
				}
				else{
					toolControl.src = toolControl.attributes["inactivesrc"].value;
				}
			}
		}
	}
}

function show_props(obj, objName) {
   var result = "";
   for (var i in obj) {
      result += objName + "." + i + " = " + obj[i] + "\n";
   }
   return result;
} 

function SMISGetAbsolutePosition(element, tagName, pos)
{
	var _i=0, _j=0;
	var __DEBUG	= false;
	if(typeof(pos) == "undefined" || pos == null){
		pos = new SMISPoint(0, 0);
	}
	
	while ( ! (element == null || element.tagName == "BODY" || element.tagName.toLowerCase() == tagName) ){
		_i+=1;
		
		pos.x += eval(element.offsetLeft);
		pos.y += eval(element.offsetTop);	

		var bFlag = typeof(element.style.borderLeftWidth) != "unknown";
		if(bFlag && element.style.borderLeftWidth != null && element.style.borderLeftWidth != ""){
			pos.x += SMISGetNumFromPixel(element.style.borderLeftWidth);
			pos.y += SMISGetNumFromPixel(element.style.borderTopWidth);
			if(__DEBUG) alert( "bFlag true & borderLeftWidth is not null. \n pos.Y = " + pos.y);
		}
				
		if(__DEBUG)	alert("current element id = " + element.id + "\n current element tagName = " + element.tagName);
		if(__DEBUG)	if(element.offsetParent != null) alert(element.offsetParent.tagName + "," + element.offsetLeft);

		element = element.offsetParent;
	}
	return pos;
}

//The point object
function SMISPoint(x,y)
{
	this.x = parseInt(x);
	this.y = parseInt(y);
}

//Get Current Mouse Absolute Position
function SMISGetMouseAbsolutePosition(event)
{
    var e=event;
    var posX=0; var posY=0;
    if(e.pageX){
        posX=e.pageX;
        posY=e.pageY;
    }
    else if(e.clientX){
        if(document.documentElement){
            posX=e.clientX+document.documentElement.scrollLeft;
            posY=e.clientY+document.documentElement.scrollTop;
        }
        else if(document.body){
            posX=e.clientX+document.body.scrollLeft;
            posY=e.clientY+document.body.scrollTop;
        }
    }
    return new SMISPoint(posX,posY);
}

//Get Current Mouse Map Relative Position 
function SMISGetMouseMapRelativePosition(event,map)
{
    var x = 0, y = 0;
    
    if(event.offsetX != null && map.id == event.srcElement.id){ //IE6
        x = event.offsetX;
        y = event.offsetY;
    }
//    else if(event.layerX != null && map.id == event.target.id){ //Firefox
//        x = event.layerX;
//        y = event.layerY;
//    }
    else{   //Others
        var mouseAbsPosition=SMISGetMouseAbsolutePosition(event);
        if(map.origin){
	        x = mouseAbsPosition.x - map.origin.x;
	        y = mouseAbsPosition.y - map.origin.y;
	    }
	    else{
	        var absPosition = SMISGetAbsolutePosition(map);
            x = mouseAbsPosition.x - absPosition.x;
            y = mouseAbsPosition.y - absPosition.y;
            absPosition = null;
        }
        mouseAbsPosition = null;
    }

	return new SMISPoint(x,y);
}

function SMISGetNumFromPixel(str)
{
	if(typeof(str) == "undefined" || str == null || str == "") return 0;

	var strResult = str.toString();
	try{
		// 1 pt = 4/3 px; 1 in = 72 pt = 96 px; 
		if(strResult.indexOf("pt") > 0){
			strResult = strResult.replace("pt", "");
			strResult = eval(strResult) * 4.0 / 3.0;
		}
		else if(strResult.indexOf("in") > 0){
			strResult = strResult.replace("in", "");
			strResult = eval(strResult) * 96;
		}
		else{
			strResult = strResult.replace("px", "");
			strResult = eval(strResult);
		}
	}catch(e){alert("error:" + e + ";strResult=" + strResult);}

	return strResult;
}

function SMISGetInnerMap(object)
{
	var _map = null;
	if (object.map) {
		_map = object.map;
	} else {
		_map = object;
	}
	return _map;
}

//Create input hidden field, if exists, then update its value.
function SMISCreateHiddenField(theform, elemID, elemName, elemValue)
{
	var ua = navigator.userAgent.toLowerCase();
	var isIE = ( ua.indexOf("msie") != -1 );
	var elem = document.getElementById(elemID);
	if(elem == null){
		if (isIE){
			elem = document.createElement("<input />");
		} else {
			elem = SMISAddElement("INPUT", elemID);
		}
		elem.type = "hidden";
		elem.id = elemID;
		elem.name = elemName;
		theform.appendChild(elem);
	}
	elem.value = elemValue;
	return elem;
}

function SMISPointsParam()
{
	this.Points = new Array();
	this.AddPoint = SMISPointsParamAddPoint;
	this.GetPoint = SMISPointsParamGetPoint;
	this.GetPolyPointsString = SMISGetPolyPointsString;
	this.GeneratePointsString = SMISGeneratePointsString;
	this.GetPointsString = SMISGetPointsString;
	//format:x,y x,y .......................
	function SMISGetPolyPointsString(offset)
	{
		var pointString = "";
		for (i = 0; i < this.Points.length; i++) {
			if (i>0){	pointString += " ";	}
			pointString += (this.Points[i].x + offset.x) + "," + (this.Points[i].y + offset.y);
		}
		return pointString;
	}

	//format: numofpoints,x y,x y,...........
	function SMISGeneratePointsString()
	{
		var pointString = "" + this.Points.length + ",";
		for (i = 0; i < this.Points.length; i++) {
			if (i>0) {	pointString += ",";	}
			pointString += this.Points[i].x + " " + this.Points[i].y;		
		}
		return pointString;	
	}
	function SMISGetPointsString(offset)
	{
		var pointString = "";
		for (i = 0; i < this.Points.length; i++) {
			if (i>0){	pointString += ",";	}
			pointString += (this.Points[i].x + offset.x) + "," + (this.Points[i].y + offset.y);
		}
		return pointString;
	}
}

function SMISPointsParamAddPoint(x,y)
{
	this.Points[this.Points.length] = new SMISPoint(x,y);
}

function SMISPointsParamGetPoint(indx)
{
	if (this.Points[indx] != null) {
		return new SMISPoint(this.Points[indx].x, this.Points[indx].y);
	} 
	else {
		return null;
	}
}

function SMISCreatePolygon(mapId, points)
{
	var pointsValue = SMISExtractPoints(points);
	var map = SMISGetMap(mapId);
	var mapDiv = document.getElementById(mapId);
	var editPolygonId = "SMISEditLine";
	var line = document.getElementById(editPolygonId);
	if (!line){
		//SMISEnableVML();
		//line = document.createElement("<v:polyline points=\"0,0\"/>");
		line = document.createElement("div");
		document.forms[0].appendChild(line);
		line.style.width =map.style.width;
		line.style.height =map.style.height;
		line.style.left =map.origin.x+"px";
		line.style.top = map.origin.y+"px";
		line.style.position = "absolute";
		line.style.visibility = "visible";
		line.id = editPolygonId;
		line.style.zIndex = 1002;
		//var fill = document.createElement("<v:fill opacity=0.1 color='blue'></v:fill>");
		//var stroke = document.createElement("<v:stroke dashstyle='solid' color='red'></v:stroke>");
		//mapDiv.appendChild(line);
		//line.appendChild(fill);		
		//line.appendChild(stroke);
		line.onmousedown = SMISPanOnMouseDown;
		line.onmousemove = SMISPanOnMouseMove;
		line.onmouseup = SMISOnMouseUp;
		line.PointsParam = new SMISPointsParam();
		line.origin = map.origin;
		line.offset = map.offset;
		line.origin.x = map.origin.x;
		line.origin.y = map.origin.y;
		line.offset.x = map.offset.x;
		line.offset.y = map.offset.y;
		line.DoPostBack = map.DoPostBack;
		line.map = map;
		//line.lineOffset = new SMISPoint(line.offsetLeft, line.offsetTop);
		//line.points = pointsValue;
		var Xpoints = SplitX(pointsValue);
		var Ypoints = SplitY(pointsValue);
		var jg = new jsGraphics(editPolygonId);
		jg.origin = map.origin;
		jg.origin.x = map.origin.x;
		jg.origin.y = map.origin.y;
		jg.setColor("#ff0000"); // red
		jg.setStroke(2);
		jg.drawPolygon(Xpoints, Ypoints);
		jg.paint();
	}
	// var relativePos = SMISGetMouseMapRelativePosition(map);
	//line.style.left = map.offset.x;
	//line.style.top = map.offset.y;
	SMISClipPolygon(line);
}

function SMISCreateLine(mapId, points)
{
	var pointsValue = SMISExtractPoints(points);
	var map = SMISGetMap(mapId);
	var mapDiv = document.getElementById(mapId);
	var editLineId = "SMISEditLine";
	var line = document.getElementById(editLineId);
	if (!line){
		line = document.createElement("div");
		document.forms[0].appendChild(line);
		line.style.width =map.style.width;
		line.style.height =map.style.height;
		line.style.left =map.origin.x+"px";
		line.style.top = map.origin.y+"px";
		line.style.position = "absolute";
		line.style.visibility = "visible";
		line.id = editLineId;
		//line.style.zIndex = map.parentNode.style.zIndex + 200;
		line.style.zIndex = 1002;
		
		line.onmousedown = SMISPanOnMouseDown;
		line.onmousemove = SMISPanOnMouseMove;
		line.onmouseup = SMISOnMouseUp;
		line.PointsParam = new SMISPointsParam();
		line.origin = map.origin;
		line.offset = map.offset;
		line.origin.x = map.origin.x;
		line.origin.y = map.origin.y;
		line.offset.x = map.offset.x;
		line.offset.y = map.offset.y;
		line.DoPostBack = map.DoPostBack;
		line.map = map;
		//line.lineOffset = new SMISPoint(line.offsetLeft, line.offsetTop);
		
		var Xpoints = SplitX(pointsValue);
		var Ypoints = SplitY(pointsValue);
		var jg = new jsGraphics(editLineId);
		jg.origin = map.origin;
		jg.origin.x = map.origin.x;
		jg.origin.y = map.origin.y;
		jg.setColor("#ff0000"); // red
		jg.setStroke(3);
		jg.drawPolyline(Xpoints, Ypoints);
		jg.paint();
	}
	SMISClipPolygon(line);
}

function SMISCreatePoint(mapId, points)
{
//	SMISCreatePoint_Img(mapId, points);
//	return;

	var pointsValue = SMISExtractPoints(points);
	var map = SMISGetMap(mapId);
	var mapDiv = document.getElementById(mapId);
	var editPointId = "SMISEditPoint";
	var point = document.getElementById(editPointId);
	if(!point)
	{
		point = document.createElement("div");
		document.forms[0].appendChild(point);
		point.style.width = map.style.width;
		point.style.height = map.style.height;
		point.style.left = map.origin.x+"px";
		point.style.top = map.origin.y+"px";
		point.style.position = "absolute";
		point.style.visibility = 'visible';
		point.id = editPointId;
		point.style.zIndex = 1002;

		point.onmousedown = SMISPanOnMouseDown;
		point.onmousemove = SMISPanOnMouseMove;
		point.onmouseup = SMISOnMouseUp;
		point.PointsParam = new SMISPointsParam();
		point.origin = map.origin;
		point.offset = map.offset;
		point.origin.x = map.origin.x;
		point.origin.y = map.origin.y;
		point.offset.x = map.offset.x;
		point.offset.y = map.offset.y;
		point.DoPostBack = map.DoPostBack;
		point.map = map;
		var radius = 30;
		var pointx = eval(pointsValue.split(",")[0]) - radius/2;
		var pointy = eval(pointsValue.split(",")[1]) - radius/2;
		var jg = new jsGraphics(editPointId);
		jg.origin = new SMISPoint();
		jg.origin.x = map.origin.x;
		jg.origin.y = map.origin.y;
		jg.setColor("#ff0000"); // red
		jg.setStroke(2);

		jg.fillEllipse(pointx, pointy,radius,radius);
		jg.paint();
	}
}

function SMISCreatePoint_Img(mapId, points)
{
	var pointWidth = 30;
	var pointHeight = 30;

	var pointsValue = SMISExtractPoints(points);
	var map = SMISGetMap(mapId);
	var mapDiv = document.getElementById(mapId);
	var editPointId = "SMISEditPoint";
	var point = document.getElementById(editPointId);
	if(!point){
		point = document.createElement("IMG");
		point.src = "images/Edit_Point.gif";
		point.width = pointWidth;
		point.height = pointHeight;
		point.style.position = "absolute";
		point.style.visibility = "visible";
		point.id = editPointId;
		point.style.zIndex = map.parentNode.style.zIndex + 200;
		mapDiv.appendChild(point);

		point.onmousedown = SMISPanOnMouseDown;
		point.onmousemove = SMISPanOnMouseMove;
		point.onmouseup = SMISOnMouseUp;
		point.PointsParam = new SMISPointsParam();
		point.origin = new SMISPoint();
//		point.offset = map.offset;	// 传的是引用。ft。// 
		point.offset = new SMISPoint();
		point.origin.x = map.origin.x;
		point.origin.y = map.origin.y;
		point.offset.x = map.offset.x;
		point.offset.y = map.offset.y;
		point.DoPostBack = map.DoPostBack;
		point.map = map;
		point.lineOffset = new SMISPoint(point.offsetLeft, point.offsetTop);
	}

	var x = eval(pointsValue.split(",")[0]) + eval(map.offset.x) - pointWidth/2;	/* 为Edit_Point.gif图片的1/2宽度 */
	var y = eval(pointsValue.split(",")[1]) + eval(map.offset.y) - pointHeight/2;	/* 为Edit_Point.gif图片的1/2宽度 */

	point.style.left = x + "px";
	point.style.top = y + "px";
}

function SMISExtractPoints(points)
{
	var pointsValue = "";
	if(points){
		if( typeof(points) == "object") {
			for(var i=0; i<points.length - 1; i++) {
				pointsValue += points[i].x + "," + points[i].y + ",";
			}
			pointsValue += points[i].x + "," + points[i].y;
		}
		else {
			pointsValue = points;
		}
	}
	return pointsValue;
}

function SMISCheckMousePosition(evt,map)
{
	var __DEBUG = false;
	var absolutePos = SMISGetMouseAbsolutePosition(evt);
	var width, height;
	if(map.map){
		width = map.map.width;
		height = map.map.height;
	}
	else {
		width = map.width; 
		height = map.height;
	}
	if ( absolutePos.x <= map.origin.x ||
		absolutePos.y <= map.origin.y ||
		absolutePos.x >= map.origin.x + width ||
		absolutePos.y >= map.origin.y + height ){
		return false;
	}
	else{
		return true;
	}
}

function IsInAbsOrRelStyle(obj)
{
	var objTemp = obj;
	while(objTemp){
 		if(objTemp.style){
			var temp = objTemp.style.position.toLowerCase();
			if( temp == "absolute" || temp == "relative"){
				return true;
			}
		}
		objTemp = objTemp.parentNode;
	}
	return false;
}

function SMISGetOffsetPosition(element, tagName, pos)
{
	var _i = 0, _j = 0;
	if(typeof(pos) == "undefined" || pos == null){
		pos = new SMISPoint(0, 0);
	}
	
	while ( ! (element == null || element.tagName == "BODY" || element.tagName.toLowerCase() == tagName) ){
		if(element.style){
			var temp = element.style.position.toLowerCase();
			if(temp == "absolute" || temp == "relative"){
				if(_i > 0) { break;	}
				else {	element = element.offsetParent;	continue;}
			}
		}
		
		_i += 1;
		
		pos.x += eval(element.offsetLeft);
		pos.y += eval(element.offsetTop);	
		var bFlag = typeof(element.style.borderLeftWidth) != "unknown";
		if(bFlag && element.style.borderLeftWidth != null && element.style.borderLeftWidth != ""){
			pos.x += SMISGetNumFromPixel(element.style.borderLeftWidth);
			pos.y += SMISGetNumFromPixel(element.style.borderTopWidth);
		}
		element = element.offsetParent;
	}
	return pos;
}

function SMISClipPolygon(polygon, inMoving, offsetX, offsetY)
{
	if(!offsetX){offsetX=0;}
	if(!offsetY){offsetY=0;}

	clipTop = -offsetY;
	clipRight = polygon.map.width - offsetX;
	clipBottom = polygon.map.height - offsetY;
	clipLeft = -offsetX;

	polygon.style.clip = "rect(" + clipTop + "px " + clipRight + "px " + clipBottom + "px " + clipLeft + "px)";
}
 
/* 在 SmartNavigation 开启的情况下，建议直接在 HTML 页面中使用 <Body ... Onload="functionName"> 的方式进行注册。 */
function SMISAddFuncToWindowEvent(functionName, eventName)
{
	var p_szLoad = functionName;
	var eventRef = window.onload;
	if(eventName == "OnResize"){
		eventRef = window.onresize;
	}

	// Geneaology :: derived from technique at: http://devshed.com 
	if(eventRef){
		var szLoad 		=	eventRef.toString()							;
		var szFunc		=	p_szLoad.replace("()","");
		if(szLoad.indexOf(szFunc) >= 0)	// 已经注册到 onload 中了。
		{
			return;
		}
		var szMergeLoad;
		if(szLoad.indexOf('{')>0){ 
		                    szMergeLoad	=  	''									
							+	szLoad.substring(	szLoad.indexOf(     '{' ) + 1
												  , szLoad.lastIndexOf( '}' ) ) 
							+	';\n'											
							+	p_szLoad+"()" + ';\n'	}
		else{
		                    szMergeLoad	=  	''									
		                    +   szLoad 
		                    +	';\n'											
							+	p_szLoad+"()" + ';\n'	}
		eventRef	=	new Function( szMergeLoad )							;
	}
	else{
		eventRef	=	p_szLoad.replace("()","") 									;
	}

	if(eventName == "OnResize"){
		window.onresize = eval(eventRef);
	}
	else{
		window.onload = eval(eventRef);
	}
}
/** 
 *  当页面采用相对定位时，浏览器窗口的缩放会导致 MapControl 的绝对位置发生变化从而导致索引框位置错误。
 *  为解决这个问题，建议 body.onresize 事件被触发时调用该函数。 例如：
 *  修改页面的 <body> 元素，往其中加入 <body onresize="SMISMapSetPosition('MapControl1')">
 *  对 OverviewControl 也要做类似的处理：
 *  <body onresize="SMISMapSetPosition('MapControl1'); SMISOverviewSetPosition('OverviewControl1')">
**/
function SMISMapSetPosition(mapID)
{
	if(mapID == null) {	return;	}
	
	var mapImageID			= mapID + '_MVIMAGE';
	var mapLoadingID		= mapID + '_divLoading';
	var mapQuickPanLeftID	= mapID + '_QuickPanDiv_L';
	var mapQuickPanRightID	= mapID + '_QuickPanDiv_R';
	var mapQuickPanUpID		= mapID + '_QuickPanDiv_U';
	var mapQuickPanDownID	= mapID + '_QuickPanDiv_D';
	
	SetMapAbsPosition(mapImageID);
	
	var mapDiv = document.getElementById(mapID);
	var map = document.getElementById(mapImageID);
	if(mapDiv.style.position != "absolute")
	{
		mapDiv.style.position = "relative";
//		mapDiv.style.left = map.offset.x+"px";
//		mapDiv.style.top = map.offset.y+"px";
		map.offset = new SMISPoint(0,0);
	}
	mapDiv = null;
	map.style.position = "absolute";
	map.style.left = map.offset.x;
	map.style.top = map.offset.y;
	var workLayer = SMISGetWorkLayer(mapID);
	if(workLayer){
	    workLayer.style.left = map.offset.x+"px";
	    workLayer.style.top  = map.offset.y+"px";
	}
	workLayer = null;

	var mapLoading = document.getElementById(mapLoadingID);
	if(mapLoading){
	    mapLoading.style.left = map.offset.x + (SMISGetNumFromPixel(map.style.width) - SMISGetNumFromPixel(mapLoading.scrollWidth))/2 +"px";
	    mapLoading.style.top  = map.offset.y + (SMISGetNumFromPixel(map.style.height) - SMISGetNumFromPixel(mapLoading.scrollHeight))/2 +"px";
	}
	mapLoading = null;

	var divQuickPan_L = document.getElementById(mapQuickPanLeftID);
	var divQuickPan_R = document.getElementById(mapQuickPanRightID);
	var divQuickPan_U = document.getElementById(mapQuickPanUpID);
	var divQuickPan_D = document.getElementById(mapQuickPanDownID);
	// Firefox和NetScape下对clientHeight与clientWidth属性支持得不是很好，在第一次加载时clientHeight与clientWidth为0，  
	// 所以当其为0时，需要将其修改一下.  
	
	
	

	if(divQuickPan_L){
		var hl = divQuickPan_L.clientHeight;
		var wl = divQuickPan_L.clientWidth;
		if(divQuickPan_L.clientHeight == 0){hl = 12;}
		if(divQuickPan_L.clientWidth == 0){wl = 12;}
		divQuickPan_L.style.visibility = 'visible';
		divQuickPan_L.style.zIndex = map.style.zIndex + 10;
		divQuickPan_L.style.left = map.offset.x +"px";
		divQuickPan_L.style.top  = map.offset.y + (SMISGetNumFromPixel(map.style.height))/2 - hl/2 +"px";
	}
	if(divQuickPan_R){
		var hr = divQuickPan_R.clientHeight;
		var wr = divQuickPan_R.clientWidth;
		if(divQuickPan_R.clientHeight == 0){hr = 12;}
		if(divQuickPan_R.clientWidth == 0){wr = 12;}
		divQuickPan_R.style.visibility = 'visible';
		divQuickPan_R.style.zIndex = map.style.zIndex + 10;
		divQuickPan_R.style.left = map.offset.x + (SMISGetNumFromPixel(map.style.width)) - wr+"px";
		divQuickPan_R.style.top  = map.offset.y + (SMISGetNumFromPixel(map.style.height))/2 - hr/2+"px";
	}
	if(divQuickPan_U){
		var hu = divQuickPan_U.clientHeight;
		var wu = divQuickPan_U.clientWidth;
		if(divQuickPan_U.clientHeight == 0){hu = 12;}
		if(divQuickPan_U.clientWidth == 0){wu = 12;}
		divQuickPan_U.style.visibility = 'visible';
		divQuickPan_U.style.zIndex = map.style.zIndex + 10;
		divQuickPan_U.style.left = map.offset.x + (SMISGetNumFromPixel(map.style.width))/2 - wu/2+"px";
		divQuickPan_U.style.top  = map.offset.y+"px";
	}
	if(divQuickPan_D){
		var hd = divQuickPan_D.clientHeight;
		var wd = divQuickPan_D.clientWidth;
	    if(divQuickPan_D.clientHeight == 0){hd = 12;}
	    if(divQuickPan_D.clientWidth == 0){wd = 12;}
		divQuickPan_D.style.visibility = 'visible';
		divQuickPan_D.style.zIndex = map.style.zIndex + 10;
		divQuickPan_D.style.left = map.offset.x + (SMISGetNumFromPixel(map.style.width))/2 - wd/2+"px";
		divQuickPan_D.style.top  = map.offset.y + (SMISGetNumFromPixel(map.style.height)) - hd+"px";
	}

	try
	{
		eval( mapID + "_SetDivCustomLayer()" );
		eval(mapID+"_attachOnload()");
	}
	catch(e)
	{
		// alert(show_props(e));
	}

	map = null;
	divQuickPan_L = null;
	divQuickPan_R = null;
	divQuickPan_U = null;
	divQuickPan_D = null;
}

function AddImageCellsToWorkLayer(mapId)
{
	//by zhangwl
	// Format: "{'cellLTX':cellLTX, 'cellLTY':cellLTY, 'countX':countX, 'countY':countY, 'cellWidth':cellWidth, 'cellHeight':cellHeight, 'offsetLTX':offsetLTX, 'offsetLTY':offsetLTY, 
    //					'offsetRBX':offsetRBX, 'offsetRBY':offsetRBY, 'urls':url1|url2|url3|...}"
	//	 or:	"url"
	var __DEBUG__ = false;
	
	var map = SMISGetMap(mapId);
	if(map.ImageCellsAdded)
	{
		return;
	}
	map.ImageCellsAdded = true;
	
	var mapUrl = document.getElementById(mapId + "_MapUrl");
	if(!mapUrl || !mapUrl.value) { return; }
	mapUrl = mapUrl.value;
	map.bActionStarted = true;

	// mapUrl = "3;2;200;200;0,52;20,52;http://huzhn/output/127550932750756928.png|http://huzhn/output/127550932751858512.png|http://huzhn/output/127550939948506784.png|http://huzhn/output/127550939949608368.png|http://huzhn/output/127550939950910240.png|http://huzhn/output/127550939952111968.png|";
	// mapUrl = "4;3;200;200;69,188;149,11;http://AHNAN/output/127550989867586896.png|http://AHNAN/output/127550989868888768.png|http://AHNAN/output/127550989869890208.png|http://AHNAN/output/127550989870991792.png|http://AHNAN/output/127550989872093376.png|http://AHNAN/output/127550989873094816.png|http://AHNAN/output/127550989874296544.png|http://AHNAN/output/127550989876199280.png|http://AHNAN/output/127550989877401008.png|http://AHNAN/output/127550989878302304.png|http://AHNAN/output/127550989879403888.png|http://AHNAN/output/127550989880405328.png|";
	// when ImageHandlerEnabled, mapUrl = "ImageHandler.ashx?IU=" + mapUrl.
	var handler = "";
	if(mapUrl.indexOf("ImageHandler.ashx?URL=") == 0) {	handler = "ImageHandler.ashx?IU=";	}
	mapUrl = mapUrl.replace(handler, "");
	mapUrl = mapUrl.replace(/localhost/g, document.getElementById(mapId + "_MapServer_Address").value);
	var workLayer = SMISGetWorkLayer(mapId);
	with(workLayer.style) {
		position = "absolute";
		overflow = "hidden"; 
		pixelLeft = map.offset.x;
		pixelTop = map.offset.y;
		//zIndex = -100; 
		width = map.style.width;
		height = map.style.height;
		// border = "1px dotted red";
	}
	var div = document.createElement("DIV"); 
	div.id = mapId + "_ImageCellContainer";
	div.style.position = "absolute";
	workLayer.appendChild(div);
	var img = document.getElementById(mapId + "_Cells_" + "-1");
	if(mapUrl.indexOf("{") == -1) {	// 只有图片地址。 //
		div.style.left = 0;
		div.style.top = 0;
		if(!img) {
			img = document.createElement("IMG");
			img.id = mapId + "_Cells_" + "-1";
//			div.appendChild(img);
		}
		// 如果图片已经被IE缓存过，img.onload 事件将可能在指定img.src之后立刻触发，所以应当把事件注册写在前面。 
		img.onload = function anonymous() { hideBusyFlag(mapId); }
		img.src = mapUrl;
		img.style.position = "absolute";
		// img.style.border = "1px dotted gray";
		img.style.left = 0;
		img.style.top  = 0;
		div.appendChild(img);
		img = null;
		div = null;
		SetMVIMAGE(mapId);
		HideObsoleteCells(0, mapId + "_Cells_");	// 隐藏自-1以后的Cells. 
		return;
	}
	if(img) {
		img.style.visibility = "hidden";
		img = null;
	}

	eval("var objMapUrl = " + mapUrl);

	var countX, countY, cellWidth, cellHeight, leftBottomOffset, rightTopOffset, arrUrls;
	countX = objMapUrl.countX;
	countY = objMapUrl.countY;
	if(countX > 20 || countY > 20) { if(!confirm("Too many pictures, are you sure?")) return; }
	map.MapUrlCount = countX*countY;

	cellWidth = objMapUrl.cellWidth;
	cellHeight = objMapUrl.cellHeight;
	offsetLT = new SMISPoint(objMapUrl.offsetLTX, objMapUrl.offsetLTY);
	offsetRB = new SMISPoint(objMapUrl.offsetRBX, objMapUrl.offsetRBY);

	div.style.left = -offsetLT.x + "px";
	div.style.top = -offsetLT.y + "px";
	if(div.origin){
//		alert(div.origin.x);
		div.origin.x = div.style.pixelLeft;
		div.origin.y = div.style.pixelTop;
//		alert(div.origin.x);
	}
	offsetLT.x = 0;
	offsetLT.y = 0;
	
	arrUrls = objMapUrl.urls.split("|");

	var arrImg = new Array();
	var img;
	for(var i=0; i<countX; i++) {
		for(var j=0; j<countY; j++) {
			img = document.getElementById(mapId + "_Cells_" + (i*countY+j));	// reuse old image element.  
			if(!img) {
				img = document.createElement("IMG");
				img.id = mapId + "_Cells_" + (i*countY+j);
//				div.appendChild(img);
			}
			img.onload = function anonymous() { this.style.visibility = "visible"; };
			img.style.visibility = "hidden";
			img.src = handler + arrUrls[i*countY+j];
			with(img.style) {
				if(__DEBUG__){	border = "1px dotted blue";	}
				position = "absolute";
				var pixelLeft = cellWidth * i - offsetLT.x;
				var pixelTop = cellHeight * j - offsetLT.y;
				var pixelWidth = cellWidth;
				var pixelHeight = cellHeight;
				left = (cellWidth * i - offsetLT.x) + "px";
				top = (cellHeight * j - offsetLT.y) + "px";
				width = cellWidth+"px";
				height = cellHeight+"px";
				
				if(pixelLeft + pixelWidth < 0 || pixelTop + pixelHeight < 0 || 
					pixelLeft - map.style.pixelWidth > 0 || pixelTop - map.style.pixelHeight > 0) 
				{
					visibility = "hidden";
				}
				// window.status += "(" + i + "" + j + ":" + pixelLeft + "," + pixelTop + ")";
			}
			arrImg[arrImg.length] = img;
			
		}
	}
	img = null;
/**/if(__DEBUG__){	window.status = "ALL:" + (countX * countY);	}
	// 先显示中间的...
	var middle = Math.round(countX * countY / 2);
	var createdImg;
	var createdImgID;
	for(var i=0; i<=middle; i++) {
		createdImgID = mapId + "_Cells_" + (middle - i);
		if(__DEBUG__){ window.status += ";" + (middle - i);}
		createdImg = arrImg[middle - i];
		if(createdImg) {
			createdImg.style.visibility = ""; 
			div.appendChild(arrImg[middle - i]);
		}

		createdImgID = mapId + "_Cells_" + (middle + i);
		if(__DEBUG__){window.status += "," + (middle + i);}
		createdImg = arrImg[middle + i];
		if(createdImg) {
			createdImg.style.visibility = ""; 
			div.appendChild(arrImg[middle + i]);
		}
	}

	HideObsoleteCells(countX*countY, mapId + "_Cells_");

	if(__DEBUG__){	window.status = "ALL:" + (countX * countY);	}
	while(arrImg && arrImg.length > 0) { arrImg.pop(); }
	arrImg = null;
	div = null;
	workLayer = null;
	if(__DEBUG__ && arr.length > 7)	{
		window.status = (arr[7]);
	}
	hideBusyFlag(mapId);
	SetMVIMAGE(mapId);
}

function SMISGetWorkLayer(mapId)
{
	var workLayer = document.getElementById(mapId + "_WorkLayer");
	if(!workLayer) {
		workLayer = document.createElement("DIV");
		workLayer.id = mapId + "_WorkLayer";
		var mapDiv = document.getElementById(mapId);
		var img = document.getElementById(mapId +"_MVIMAGE");
		mapDiv.insertBefore(workLayer,img);
	}
	return workLayer;
}

function PanMapCells(map, startPoint, curPoint)
{
	if(!map) { return; }
	if(!map.MapUrlCount) { map.MapUrlCount = 1; }
	var workLayer = SMISGetWorkLayer(map.mapId);
	var container = workLayer.childNodes[0];
	map.style.left = (curPoint.x-startPoint.x)+"px";
	map.style.top = (curPoint.y-startPoint.y)+"px";
	map.style.opacity =0.5;
	with(container.style){
		if(!container.origin) { container.origin = new SMISPoint(left, top); }
		left = (container.origin.x + curPoint.x - startPoint.x) + "px";
		top = (container.origin.y + curPoint.y - startPoint.y) + "px";
	}
	return;

	var img;
	for(var i=0; i<map.MapUrlCount; i++){
		img = document.getElementById(map.id.split('_')[0] + "_Cells_" + i);
		if(!img) { continue; }
		with(img.style){
			if(!img.origin) { img.origin = new SMISPoint(pixelLeft, pixelTop); }
			pixelLeft = img.origin.x + curPoint.x - startPoint.x;
			pixelTop = img.origin.y + curPoint.y - startPoint.y;
		}
	}
	img = null;
}

function PanWorkLayer(map, startPoint, curPoint)
{
	if(!map) { return; }
	var workLayer = SMISGetWorkLayer(map.mapId);
	if(!workLayer) { return; }
	with(workLayer.style){
		if(!workLayer.origin) { workLayer.origin = new SMISPoint(pixelLeft, pixelTop); }
		pixelLeft = workLayer.origin.x + curPoint.x - startPoint.x;
		pixelTop = workLayer.origin.y + curPoint.y - startPoint.y;
	}
}

// 在CustomLayer中画线和面对象
function SMISOnCustomLayerLoad(mapControlID)
{
	var hiddenPoints=document.getElementById(mapControlID+"_pointsValue");
    var hiddenStrokes=document.getElementById(mapControlID+"_stylesValue");
    var hiddenId=document.getElementById(mapControlID+"_idValue");
    var hiddenPolygonType=document.getElementById(mapControlID+"_polygonType");
    if(!hiddenPoints||!hiddenStrokes||!hiddenPolygonType||!hiddenId)
    {
        return;
    }
    var pointsValue=hiddenPoints.value.split("&");
    var style=hiddenStrokes.value.split("&");
    var id=hiddenId.value.split("&");
    var polygonType=hiddenPolygonType.value.split("&");
    for(var i=0;i<pointsValue.length-1;i++)
    {
        SMISDrawPolygon(mapControlID,id[i],pointsValue[i],style[i],polygonType[i]);
    }
}


function SMISDrawPolygon(mapId,id,points,styleValue,closed)
{
    var pointsValue = SMISExtractPoints(points);
	var map = SMISGetMap(mapId);
	var mapDiv = document.getElementById(mapId);
	var editLineId = id;
	var line = document.getElementById(editLineId);
	if (!line){
	    var style=styleValue.split("@");
		line = document.createElement("div");
		document.forms[0].appendChild(line);
		line.style.left =map.origin.x+"px";
		line.style.top = map.origin.y+"px";
		line.style.position = "absolute";
		line.style.visibility = "visible";
		line.style.opacity=style[3]; // 通过css来控制透明度
		line.id = editLineId;
		line.style.zIndex = 1002;
		
		line.PointsParam = new SMISPointsParam();
		line.origin = map.origin;
		line.offset = map.offset;
		line.origin.x = map.origin.x;
		line.origin.y = map.origin.y;
		line.offset.x = map.offset.x;
		line.offset.y = map.offset.y;
		line.map = map;

		var Xpoints = SplitX(pointsValue);
		var Ypoints = SplitY(pointsValue);
		var jg = new jsGraphics(editLineId);
		jg.origin = map.origin;
		jg.origin.x = map.origin.x;
		jg.origin.y = map.origin.y;
		
		
		jg.setColor(style[2]);
		var pxs=SplitX(points);
		var pys=SplitY(points);
		jg.fillPolygon(pxs, pys);
		if(closed=="True") // 如果是面对象就要再画一遍边线
		{
		    jg.drawPolygon(Xpoints, Ypoints);
		    lineTemp = document.createElement("div");
	        document.forms[0].appendChild(lineTemp);
	        lineTemp.style.left =map.origin.x+"px";
	        lineTemp.style.top = map.origin.y+"px";
	        lineTemp.style.position = "absolute";
	        lineTemp.style.visibility = "visible";
	        lineTemp.style.zIndex = 1003;
	        lineTemp.id=editLineId+"Temp";
	        var hiddenId=document.getElementById(mapId+"_idValue");
	        if(hiddenId){hiddenId.value=hiddenId.value+"&"+lineTemp.id;}
	        lineTemp.PointsParam = new SMISPointsParam();
		    lineTemp.origin = map.origin;
		    lineTemp.offset = map.offset;
		    lineTemp.origin.x = map.origin.x;
		    lineTemp.origin.y = map.origin.y;
		    lineTemp.offset.x = map.offset.x;
		    lineTemp.offset.y = map.offset.y;
		    lineTemp.map = map;

	        var jgTemp = new jsGraphics(lineTemp.id);
		    jgTemp.origin = map.origin;
		    jgTemp.origin.x = map.origin.x;
		    jgTemp.origin.y = map.origin.y;
            jgTemp.setColor(style[1]);
            jgTemp.setStroke(parseInt(style[0]));
            jgTemp.drawPolyline(Xpoints, Ypoints);
            jgTemp.paint();
            SMISClipPolygon(lineTemp);
		}
		else
		{
			jg.setColor(style[1]);
			jg.setStroke(parseInt(style[0]));
			jg.drawPolyline(Xpoints, Ypoints);
		}
		jg.paint();
	}
	SMISClipPolygon(line);
}

function StartDefaultAction(map, actionName)
{
	switch(actionName){
	    // DrawRect
		case 'ZOOMIN':
		case 'ZOOMOUT':
		case 'RECTQUERY':
			map.style.cursor = 'crosshair';
			map.onmousedown	= SMISOnMouseDown;
			map.onmousemove	= SMISRectOnMouseMove;
			map.onmouseup	= SMISOnMouseUp;
			map.onclick = null;
			map.ondblclick = null;
			break;
		// Pan
		case 'PAN':
			map.style.cursor = 'move';
			map.onmousedown = SMISPanOnMouseDown;
			map.onmousemove = SMISPanOnMouseMove;
			map.onmouseup = SMISOnMouseUp;
			map.onclick = null;
			map.ondblclick = null;
			break;
		// DrawLines
		case 'MEASUREDIS':
		case 'FINDPATH':
			map.style.cursor = 'default';
			map.PolygonClosed = false;
			map.onmousedown = null;
			map.onmousemove = SMISPolygonOnMouseMove;
			map.onmouseup = null;
			map.onclick = SMISPolygonOnMouseClick;
			map.ondblclick = SMISPolygonOnDblClick;
			break;
		// DrawPolygon
		case 'MEASUREAREA':
		case 'POLYGONQUERY':
			map.style.cursor = 'default';
			map.PolygonClosed = true;
			map.onmousedown = null;
			map.onmousemove = SMISPolygonOnMouseMove;
			map.onmouseup = null;
			map.onclick = SMISPolygonOnMouseClick;
			map.ondblclick = SMISPolygonOnDblClick;
			break;
		// Click
		case 'POINTQUERY':
		case 'CLOSESTFACILITY':
			map.style.cursor = 'default';
			map.bActionStarted = true;
			map.onmousedown = null;
			map.onmousemove = null;
			map.onmouseup = SMISOnMouseUp;
			map.onclick = null;
			map.ondblclick = null;
			break;
		// DrawCircle
		case 'CIRCLEQUERY':
			map.style.cursor = 'default';
			map.onmousedown = SMISOnMouseDown;
			map.onmousemove = SMISCircleOnMouseMove;
			map.onmouseup = SMISCircleOnMouseUp;
			map.onclick = null;
			map.ondblclick = null;
			break;
	}
}

//TODO.
function RenderQuickPan(mapId, description, quickPanWidth, quickPanHeight, prefix)
{
	var mapDiv = document.getElementById(mapId);
	var theform = document.forms[0];
	var quickPanInputId = mapId + "_QuickPanInput";

	SMISCreateHiddenField(theform, quickPanInputId, quickPanInputId, "");

	var quickPanDescs = description.split(",");	// left, up, right, down
	if(!quickPanDescs) { quickPanDescs = new Array(4); }
	for(var i=4; i<quickPanDescs.length; i--) { quickPanDescs.push(""); }

	var StrDivFormat = "<div id={0} width=" + quickPanWidth + " height=" + quickPanHeight + " border=0 cellspacing=0 cellpadding=0 style='position:absolute; cursor:pointer; visibility:hidden;' title='{1}'>";
	StrDivFormat += "<img src=\"{2}\" onclick=\"document.getElementById('" + quickPanInputId + "').value='{3}'; " + mapId + "_DoPostBack();\">";
	StrDivFormat += "</div>";

	var strDivLeft = StrDivFormat.replace("{0}", mapId + "_QuickPanDiv_L");
	strDivLeft = strDivLeft.replace("{1}", quickPanDescs[0]);
	strDivLeft = strDivLeft.replace("{2}", prefix.replace("{0}", "L"));
	strDivLeft = strDivLeft.replace("{3}", "L");
	var divLeft = document.createElement("DIV");
	divLeft.innerHTML = strDivLeft;
	mapDiv.appendChild(divLeft);

	var strDivUp = StrDivFormat.replace("{0}", mapId + "_QuickPanDiv_U");
	strDivUp = strDivUp.replace("{1}", quickPanDescs[1]);
	strDivUp = strDivUp.replace("{2}", prefix.replace("{0}", "U"));
	strDivUp = strDivUp.replace("{3}", "U");
	var divUp = document.createElement("DIV");
	divUp.innerHTML = strDivUp;
	mapDiv.appendChild(divUp);

	var strDivRight = StrDivFormat.replace("{0}", mapId + "_QuickPanDiv_R");
	strDivRight = strDivRight.replace("{1}", quickPanDescs[2]);
	strDivRight = strDivRight.replace("{2}", prefix.replace("{0}", "R"));
	strDivRight = strDivRight.replace("{3}", "R");
	var divRight = document.createElement("DIV");
	divRight.innerHTML = strDivRight;
	mapDiv.appendChild(divRight);

	var strDivDown = StrDivFormat.replace("{0}", mapId + "_QuickPanDiv_D");
	strDivDown = strDivDown.replace("{1}", quickPanDescs[3]);
	strDivDown = strDivDown.replace("{2}", prefix.replace("{0}", "D"));
	strDivDown = strDivDown.replace("{3}", "D");
	var divDown = document.createElement("DIV");
	divDown.innerHTML = strDivDown;
	mapDiv.appendChild(divDown);

//	SMISMapSetPosition(mapId);
}

function MapControl_Callback(argument)
{
	var mapId = "MapControl1";
	var mapUrl = document.getElementById(mapId + "_MapUrl");
	if(!mapUrl) return;
	mapUrl.value = argument;
	var map = SMISGetMap(mapId);
	map.ImageCellsAdded = false;
	var workLayer = SMISGetWorkLayer(mapId);
	if(workLayer){
		workLayer.innerHTML = "";
	}
	AddImageCellsToWorkLayer(mapId);
//	hideBusyFlag(mapId);
    if(map.bActionStarted){
        map.bActionStarted = false;
    }
	
	map = null;
	workLayer = null;
}

function GetMouseScrollDelta(e)
{
	if(e.wheelDelta){return e.wheelDelta;}
	else if(e.detail){return -e.detail;}
	return 0;
}

function SMISOnMouseWheel(e)
{
	if(!e)e=window.event;
	var map = this;
	if(!map){return false;}
	if(map.bWheeling){return false;}
	map.bWheeling = true;
	var delta=GetMouseScrollDelta(e);
	var argument = "ZoomByPixel";
	var params = "";
	var relativePos = SMISGetMouseMapRelativePosition(event, map);
	if(delta>0){
		params = relativePos.x + "&" + relativePos.y + "&0.5";
		map.DoCallback(argument, params);
	}
	else if(delta<0){
		params = relativePos.x + "&" + relativePos.y + "&2";
		map.DoCallback(argument, params);
	}
	map.bWheeling = false;
	e.cancelBubble=true;
	return false;
}

function GetTarget(e)
{
	if(!e)e=window.event;var t=null;
	if(e.srcElement)t=e.srcElement;
	else if(e.target)t=e.target;
	if(t.nodeType==3)t=targ.parentNode;
	return t;
}

function AddOnMouseWheelFunction(mapId)
{
	//debug.
  return;
	var map = SMISGetMap(mapId);
	if(!map.DoCallback)	{ map.DoCallback = Map_DoCallback; }
	map.onmousewheel = SMISOnMouseWheel;
}

// zhangwl修改 
function SMISAddElement(element, id)
{
	var obj = document.createElement(element);
	obj.id = id;
	return(obj);
}

function HideObsoleteCells(endIndex, prefix)
{
	var start = parseInt(endIndex);
	var img;
	while(true){
		img = document.getElementById(prefix + start);
		if(!img){break;}
		img.style.visibility = "hidden";
		img.src = "images/spacer.gif";
		start++;
	}
	img = null;
}
