var imageElement;
var imgOffsetTop;
var imgOffsetLeft;
var scrollOffsetTop;
var scrollOffsetLeft;
var parentOffsetTop;
var parentOffsetLeft;

var rubberBand = null;
var startX;
var startY;
var endX;
var endY;

var oldMouseMove = null;
var oldMouseUp = null;
var startTime = null;

var hasrubber;
var hasclick;
var rubberbandmagnify = false;

var mapdragtype;

function myGetElementById(id)
{
	if (!document.all && document.getElementById)
	{
		return document.getElementById(id);
	}
	else if (document.all)
	{
		return document.all[id];
	}
	return null;
}
function setImagePosition(imel, x, y)
{
	if (!imel.style.pixelLeft)
	{
		imel.style.left = x;
		imel.style.top = y;
	}
	else
	{
		imel.style.pixelLeft = x;
		imel.style.pixelTop = y;
	}
}
function startHasClick(ev)
{
	var e = ev;
	if (!e) e = window.event;
	hasrubber = false;
	hasclick = true;
	return startRubber(e); 
}
function startHasRubber(ev)
{
	var e = ev;
	if (!e) e = window.event;
	hasrubber = true;
	hasclick = false;
	return startRubber(e); 
}
function startHasClickHasRubber(ev)
{
	var e = ev;
	if (!e) e = window.event;
	hasrubber = true;
	hasclick = true;
	return startRubber(e); 
}
function getDragType(id)
{
	if (mapdragtype != 0 && mapdragtype != 1)
	{
		var dragattr = myGetElementById(id).getAttribute("DRAGTYPE");	
		if (dragattr == "RubberBandZoom") mapdragtype = 0;
		else mapdragtype = 1;
	}
	return mapdragtype;	
}
function startRubber(e)
{
	var targ;
	if (e.target) targ = e.target;
	else targ = e.srcElement;
	if (targ.tagName!="IMG") return true;
	imgOffsetTop = 0;
	imgOffsetLeft = 0;
	parentOffsetTop = 0;
	parentOffsetLeft = 0;
	scrollOffsetTop = document.body.scrollTop;
	scrollOffsetLeft = document.body.scrollLeft;
	imageElement = targ;
	var el = imageElement;
	
	while (el!=null)
	{
		imgOffsetTop += el.offsetTop;
		imgOffsetLeft += el.offsetLeft;
		if (el.style.position=='absolute' && el!=imageElement)
		{
			parentOffsetTop -= el.offsetTop;
			parentOffsetLeft -= el.offsetLeft;
		}
		if (el.tagName.toLowerCase()!="body") el = el.offsetParent;
		else break;
	}

	// Save in page for later use
	startY = e.clientY + scrollOffsetTop + parentOffsetTop;
	startX = e.clientX + scrollOffsetLeft + parentOffsetLeft;
	endX = startX;
	endY = startY;

	var dt = getDragType(imageElement.id);
	if (dt == 0)
	{
		imageElement.style.cursor = "crosshair";
		rubberBand = myGetElementById(imageElement.id + '_rubberBand');
		rubberBand.style.width = 0;
		rubberBand.style.height = 0;
		if (!rubberBand.style.pixelLeft)
		{
			rubberBand.style.left = startX - imgOffsetLeft;
			rubberBand.style.top = startY - imgOffsetTop;
		}
		else
		{
			rubberBand.style.pixelLeft = startX - imgOffsetLeft;
			rubberBand.style.pixelTop = startY - imgOffsetTop;
		}
		if (hasrubber) rubberBand.style.visibility = 'visible';
	}
	else if (dt == 1)
	{
		imageElement.style.position = "absolute";
		imageElement.style.cursor = "pointer";
	}
	oldMouseMove = document.onmousemove;
	oldMouseUp = document.onmouseup;	
	document.onmouseup = stopRubber;
	document.onmousemove = moveRubber;
	startTime = new Date();
	if (e.preventDefault) e.preventDefault();
}
function moveRubber(ev)
{
	var e = ev;
	if (!e) e = window.event;
	var newY = e.clientY + scrollOffsetTop + parentOffsetTop;
	var newX = e.clientX + scrollOffsetLeft + parentOffsetLeft;
	var minY = imgOffsetTop + scrollOffsetTop + parentOffsetTop;
	var minX = imgOffsetLeft + scrollOffsetLeft + parentOffsetLeft;
	var maxY = minY + imageElement.height;
	var maxX = minX + imageElement.width;

	if (newX < minX) newX = minX;
	if (newX > maxX) newX = maxX;
	if (newY < minY) newY = minY;
	if (newY > maxY) newY = maxY;

	endX = newX;
	endY = newY;

	var dt = getDragType(imageElement.id);
	// Set x-position
	if (dt == 0)
	{
		if (endX < startX)
		{
			if (!rubberBand.style.pixelLeft)
			{
				rubberBand.style.left = endX - imgOffsetLeft;
			}
			else
			{
				rubberBand.style.pixelLeft = endX - imgOffsetLeft;
			}
		}
		else if (endX >= startX)
		{
			if (!rubberBand.style.pixelLeft)
			{
				rubberBand.style.left = startX - imgOffsetLeft;
			}	
			else
			{
				rubberBand.style.pixelLeft = startX - imgOffsetLeft;
			}
		}
		rubberBand.style.width = Math.abs(endX - startX);
		// Set y-position
		if (endY < startY)
		{
			if (!rubberBand.style.pixelTop)
			{
				rubberBand.style.top = endY - imgOffsetTop;
			}
			else
			{
				rubberBand.style.pixelTop = endY - imgOffsetTop;
			}
		}
		else if (endY >= startY)
		{
			if (!rubberBand.style.pixelTop)
			{
				rubberBand.style.top = startY - imgOffsetTop;
			}	
			else
			{
				rubberBand.style.pixelTop = startY - imgOffsetTop;
			}
		}
		rubberBand.style.height = Math.abs(endY - startY);		
	}
	else if (dt == 1)
	{
	    var dx = endX - startX;
	    var dy = endY - startY;
		setImagePosition(imageElement, dx, dy);
	    imageElement.style.clip = "rect(" + (-dy) + " " + (imageElement.width - dx) + " " + (imageElement.height - dy) + " " + (-dx) + ")";
	}
	if (oldMouseMove) oldMouseMove(e);
	if (e.preventDefault) e.preventDefault();
	return false;
}
function stopRubber(ev) 
{
	var e = ev;
	if (!e) e = window.event;
	document.onmouseup = oldMouseUp;
	document.onmousemove = oldMouseMove;
	var endTime = new Date();
	var diffTime = endTime.getTime()-startTime.getTime();

	// Make coordinates relative to the map-image
	startX = startX - imgOffsetLeft - parentOffsetLeft;
	startY = startY - imgOffsetTop - parentOffsetTop;
	endX = endX - imgOffsetLeft - parentOffsetLeft;
	endY = endY - imgOffsetTop - parentOffsetTop;

	var rubberBandWidth = Math.abs(endX - startX);
	var rubberBandHeight = Math.abs(endY - startY);

	var stop = true;
	var dt = getDragType(imageElement.id);
	if ((rubberBandWidth > 10 || rubberBandHeight > 10) && hasrubber)
	{
		if (dt == 0)
		{
			// Swap coordinates if reversed
			var tmp;
			if (endX < startX)
			{
				tmp = endX;
				endX = startX;
				startX = tmp;
			}
			if (endY < startY)
			{
				tmp = endY;
				endY = startY;
				startY = tmp;
			}
	
			if (rubberbandmagnify) magnify(imageElement, startX, startY, endX, endY);
			__doPostBack(imageElement.id,"RubberBand(" + startX + "," + startY + "," + endX + "," + endY + ")" );
			rubberBand.style.visibility = 'hidden';
			rubberBand = null;
		}
		else if (dt == 1)
		{
			__doPostBack(imageElement.id,"DragPan(" + (startX - endX) + "," + (startY - endY) + ")" );
		}
	}
	else if (hasclick && diffTime<200)
	{
		__doPostBack(imageElement.id,"MapClick(" + startX + "," + startY + ")" );
	}
	else stop = false;
	if (stop)
	{
		imageElement.disabled = true;
		imageElement.style.cursor = 'wait';
		var loadControl = myGetElementById(imageElement.id+'_LoadControl');
		if (loadControl!=null)
		{
			loadControl.style.top = startY + 'px';
			loadControl.style.left = startX + 'px';
			loadControl.style.visibility = 'visible';
		}
	}
	imageElement = null;
	if (document.onmouseup) document.onmouseup(e);
	if (e.preventDefault) e.preventDefault();
}
function setmapcursor(ev)
{
	var e = ev;
	if (!e) e = window.event;
	var targ;
	if (e.target) targ = e.target;
	else targ = e.srcElement;
	if (targ.tagName!="IMG") return true;
	var dt = getDragType(targ.id);
	if (dt == 0) targ.style.cursor = "crosshair";
	else targ.style.cursor = "pointer";
}
function magnify(imel, newleft, newtop, newright, newbot)
{
	magnify2(imel, newleft, newtop, newright, newbot, imel.width, imel.height);
}

function magnify2(imel, newleft, newtop, newright, newbot, imelwidth, imelheight)
{
	var hfactor = imelwidth / (newright - newleft);
	var vfactor = imelheight / (newbot - newtop);
	var factor = (hfactor < vfactor) ? hfactor : vfactor;

	if (hfactor < vfactor)
	{
		/* Horisontal is the longest side */	
		var rb_adjusted_height = imelheight / factor;
		var tmpnewtop = (newbot + newtop - rb_adjusted_height) / 2;
		var tmpnewbot = (newbot + newtop + rb_adjusted_height) / 2;
		newtop = tmpnewtop;
		newbot = tmpnewbot;
	}
	else
	{
		/* Vertical is the longest side */
		var rb_adjusted_width = imelwidth / factor;
		var tmpnewleft = (newleft + newright - rb_adjusted_width) / 2;
		var tmpnewright = (newright + newleft + rb_adjusted_width) / 2;
		newleft = tmpnewleft;
		newright = tmpnewright;
	}
	
	imel.style.width = imelwidth*factor;
	imel.style.height = imelheight*factor;

	if (!imel.style.pixelTop)
	{
		imel.style.left = -newleft*factor;
		imel.style.top = -newtop*factor;
	}
	else
	{
		imel.style.pixelLeft = -newleft*factor;
		imel.style.pixelTop = -newtop*factor;
	}

    imel.style.clip = "rect(" + (newtop*factor) + " " + (newright*factor) + " " + (newbot*factor) + " " + (newleft*factor) + ")";	
    imel.style.position = "absolute";
}

var zboldmousemove;
var zboldmouseup;
var zbimageelement;

var zbimgstartop;
var zbimgstartleft;

var zbstartclienttop;
var zbstartclientleft;

var zbhorizontal;
var zbpixelsize;
var zbminlevel;
var zbmaxlevel;
var zblevelsize;

var zbstartlevel;
var zbcurlevel;
var zbstartpos;
var zbcurpos;
var zbmapimageid;
var zbmapwidth;
var zbmapheight;
var zbinitdone = false;


function zbstart(ev)
{
	var e = ev;
	if (!e) e = window.event;
	var zbimg;
	if (e.target) zbimg = e.target;
	else zbimg = e.srcElement;
	if (zbimg.tagName!="IMG") return true;
	
	if (!zbinitdone) zbinit();
	
	zbimageelement = zbimg;
	zbimgstarttop = zbimageelement.offsetTop;
	zbimgstartleft = zbimageelement.offsetLeft;
	zbstartclienttop = e.clientY;
	zbstartclientleft = e.clientX;
	zbstartpos =  (!zbhorizontal) ? (zbimgstarttop + (e.clientY - zbstartclienttop)) : (zbimgstartleft + (e.clientX - zbstartclientleft));
	zbstartlevel = zbminlevel + zblevelsize*(zbstartpos/zbpixelsize);

	zboldmousemove = document.onmousemove;
	zboldmouseup = document.onmouseup;	
	document.onmouseup = zbstop;
	document.onmousemove = zbmove;
	zbstarttime = new Date();
	if (e.preventDefault) e.preventDefault();
	return false;
}

function zbmove(ev)
{
	var e = ev;
	if (!e) e = window.event;

	if (zbhorizontal)
	{
		var newleft =  zbimgstartleft + (e.clientX - zbstartclientleft);
		if (newleft < 0) newleft = 0;
		if (newleft > zbpixelsize) newleft = zbpixelsize;
		zbcurpos = newleft;
		if (!zbimageelement.style.pixelLeft)
		{
			zbimageelement.style.left = newleft;
		}
		else
		{
			zbimageelement.style.pixelLeft = newleft;
		}
	}
	else
	{
		var newtop =  zbimgstarttop + (e.clientY - zbstartclienttop);
		if (newtop < 0) newtop = 0;
		if (newtop > zbpixelsize) newtop = zbpixelsize;
		zbcurpos = newtop;
		if (!zbimageelement.style.pixelTop)
		{
			zbimageelement.style.top = newtop;
		}
		else
		{
			zbimageelement.style.pixelTop = newtop;
		}
	}

	zbcurlevel = zbminlevel + zblevelsize*(zbcurpos/zbpixelsize);

	slidermagnify(myGetElementById(zbmapimageid), zbstartlevel, zbcurlevel);

	if (zboldmousemove) zboldmousemove(e);
	if (e.preventDefault) e.preventDefault();
	return false;
}

function zbstop(ev)
{
	var e = ev;
	if (!e) e = window.event;
	document.onmouseup = zboldmouseup;
	document.onmousemove = zboldmousemove;
	var endTime = new Date();
	var diffTime = endTime.getTime()-zbstarttime.getTime();

	var newpos;
	if (zbhorizontal)
	{
		newpos =  zbimgstartleft + (e.clientX - zbstartclientleft);
		if (newpos < 0) newpos = 0;
		if (newpos > zbpixelsize) newpos = zbpixelsize;
	}
	else
	{
		newpos =  zbimgstarttop + (e.clientY - zbstartclienttop);
		if (newpos < 0) newpos = 0;
		if (newpos > zbpixelsize) newpos = zbpixelsize;
	}
	var targetid = zbimageelement.id.split("_").join("$");
	
	__doPostBack(targetid,"ZoomSlide(" + newpos + ")" );
	if (document.onmouseup) document.onmouseup(e);
	if (e.preventDefault) e.preventDefault();
	return false;
}

function slidermagnify(imel, startlevel, curlevel)
{
	if (!zbmagnify) return;
	if (!imel) return;
	var factor = Math.pow(2, (curlevel - startlevel));
	if (factor > 32) factor = 32.0;
	else if (factor < 0.01) factor = 0.01;
	var newheight = zbmapheight/factor;
	var newwidth = zbmapwidth/factor;
	var newtop = (zbmapheight - newheight) / 2;
	var newleft = (zbmapwidth - newwidth) / 2;
	var newright = (zbmapwidth + newwidth) / 2;
	var newbottom = (zbmapheight + newheight) / 2;
	magnify2(imel, newleft, newtop, newright, newbottom, zbmapwidth, zbmapheight);
}
function showMapRights(url)
{
	popup = window.open(url, 'FlexiMap', 'width=510,height=510,toolbar=0,location=0,status=0,menubar=0,scrollbars=0,resizable=0');
	popup.focus();
}



