
var browser = new cBrowser();	// browser information
browser.getBrowser();

var query = {
	parse : function() {
		string = this.getQueryString();
		string = string.split('&');
		var ret = new Object();
		for (var i = 0; i < string.length; ++i) {
			var tmp = string[i].split('=');
			if (typeof tmp[0] == 'string')
				ret[tmp[0]] = tmp[1];
		}

		return ret;
	},
	update : function() {
		var text = 'x=' + Math.floor(mc.x)
			+ '&y=' + Math.floor(mc.y)
			+ '&map=' + mc.map
			+ '&zoom=' + mc.zoom
			+ '&voc=' + mc.voc
			+ '&vlc=' + mc.vlc;
		if (browser.client != 'saf')
			location.hash = '' + text;
	},
	// returns query string after #
	getQueryString : function() {
		return location.hash.substr(location.hash.indexOf('#')+1);
	}
};

// delayed page ajax synchronization
var delayTime = 500;
var opId = 1;
var objectsAndTilesDeleted = 1;
var tileMap = null;
var mapIsReloading = 0;


// arrow definitions

var arrowCrosshair = new Object();
	arrowCrosshair.coordX = 0; arrowCrosshair.coordY = 0;
	arrowCrosshair.visible = false;
	arrowCrosshair.divId = 'mapArrowStaticCrosshair';
	arrowCrosshair.x = 0; arrowCrosshair.y = 0;
	arrowCrosshair.iconShiftX = -20;
	arrowCrosshair.iconShiftY = -20;

var arrowPointer = new Object();
	arrowPointer.coordX = 0; arrowPointer.coordY = 0;
	arrowPointer.visible = false;
	arrowPointer.divId = 'mapArrowQuickPointer';
	arrowPointer.x = 0; arrowPointer.y = 0;
	arrowPointer.iconShiftX = -16;
	arrowPointer.iconShiftY = -16;
	
var arrowStaticPointer = new Object();
	arrowStaticPointer.coordX = 0;	arrowStaticPointer.coordY = 0;
	arrowStaticPointer.visible = false;
	arrowStaticPointer.divId = 'mapArrowStaticPointer';
	arrowStaticPointer.x = 0; arrowStaticPointer.y = 0;
	arrowStaticPointer.iconShiftX = 0;
	arrowStaticPointer.iconShiftY = -32;
	
var arrowSearchCenter = new Object();
	arrowSearchCenter.coordX = 0;	arrowSearchCenter.coordY = 0;
	arrowSearchCenter.visible = false;
	arrowSearchCenter.divId = 'mapArrowSearchCenter';
	arrowSearchCenter.x = 0; arrowStaticPointer.y = 0;
	arrowSearchCenter.iconShiftX = -20;
	arrowSearchCenter.iconShiftY = -20;
    
	
// arrow functions

function setStaticArrowCoordPos(arrow, coordX, coordY) {
	arrow.coordX = coordX;
	arrow.coordY = coordY;
	arrow.x = getScreenXFromS42(arrow.coordX);
	arrow.y = getScreenYFromS42(arrow.coordY);
	showStaticArrow(arrow);
	updateStaticArrowScreenPos(arrow);
}

function setStaticArrowScreenPos(arrow, screenX, screenY) {
	arrow.x = screenX;
	arrow.y = screenY;
	arrow.coordX = getS42XFromScreen(screenX);
	arrow.coordY = getS42YFromScreen(screenY);
	showStaticArrow(arrow);
	updateStaticArrowScreenPos(arrow);
}

function getMapObjectById(objectId) {
    for (var i = 0; i < vol.length; i++) {
	    if (vol[i][2] == objectId) {
	        return vol[i];
	    }
	}
	return null;
}

function setStaticArrowObjectPos(arrow, objectId) {
    for (var i = 0; i < vol.length; i++) {
	    if (vol[i][2] == objectId) {
	        objDef = vol[i];
	        setStaticArrowScreenPos(arrow, objDef[0] + objDef[3], objDef[1] + objDef[3]);
	        return;
	    }
	}
}

function showStaticArrow(arrow) {
    arrow.visible = true;
    var arrowDiv = gid(arrow.divId);
	if (arrowDiv != null) {
	    arrowDiv.style.display = "block";
	} 
}

function hideStaticArrow(arrow) {
    arrow.visible = false;
    var arrowDiv = gid(arrow.divId);
	if (arrowDiv != null) {
	    arrowDiv.style.display = "none";
	}
}

function updateStaticArrowScreenPos(arrow)
{
	if (arrow.visible) {
		//dbg(arrow.x + " " + arrow.y  + " : " + arrow.coordX + " " + arrow.coordY);
		var arrowDiv = gid(arrow.divId);
    	if (arrowDiv != null) {
    	    arrowDiv.style.left = (arrow.x + arrow.iconShiftX) + "px";
    	    arrowDiv.style.top = (arrow.y + arrow.iconShiftY) + "px";
    	}
	}
}

function recalculateArrowPosition(arrow, dx, dy) {
	arrow.x = getScreenXFromS42(arrow.coordX);
	arrow.y = getScreenYFromS42(arrow.coordY);
	updateStaticArrowScreenPos(arrow);
}

function recalculateArrowPositions()
{
    recalculateArrowPosition(arrowCrosshair);
    recalculateArrowPosition(arrowPointer);
    recalculateArrowPosition(arrowStaticPointer);
    recalculateArrowPosition(arrowSearchCenter);
}


/*dynamic arrow functions*/

function showArrowCoord(s42x, s42y) {
    setStaticArrowCoordPos(arrowPointer, s42x, s42y);
}

function showArrowObject(id) {
    for (var i = 0; i < vol.length; i++) {
	    if (vol[i][2] == id) {
	        objDef = vol[i];
	        setStaticArrowScreenPos(arrowPointer, objDef[0] + objDef[3], objDef[1] + objDef[3]);
	        return;
	    }
	}
}

function showArrowTimed(x, y, time) {
	setStaticArrowScreenPos(arrowPointer, x, y);
	setTimeout("hideArrow()", time);
}

function showArrow(x,y) {
	setStaticArrowScreenPos(arrowPointer, x, y);
}

function hideArrow() {
	hideStaticArrow(arrowPointer);
}

/* end dynamic arrow functions*/


function startReloadTimer() {
	opId = opId + 1;
	if (delayTime > 0) {
	    // this is added also to xajax.js to the beginning of his.call method
	    timer = setTimeout("onReloadTimer("+opId+")", delayTime);
	} else {
		// we call the update inmediatelly
		// we disable drag while reloading map context
		xajax_mapUpdate(mc);
	}
}

function mapSetCenterFromString(zoomText) {
	if (zoomText != '')
	{
	    var zoomParts = zoomText.split(';');
		if (zoomParts.length > 1)
		{
		    xajax_mapCenterAndZoomMax(mc, zoomParts[0], zoomParts[1]);
		    setStaticArrowCoordPos(arrowStaticPointer, zoomParts[0], zoomParts[1]);
		    return true;
		}
	}
	return false;
}

function stopReloadTimer() {
    opId = opId + 1;
}

function onReloadTimer(timerOpId) {
    if (timerOpId == opId) {
		xajax_mapReload(mc);
	}
}

function recreateMapAfterUpdate()
{
	objectsAndTilesDeleted=0;
	deleteVisibleObjectsAndTiles();
	recalculateArrowPositions();
	createTileMap();
	createObjects();
	createZooms();
	query.update();
}

// gets number value from a string like "450px"
function stripPx(text) {
    var pos = text.indexOf('p');
	if (pos != -1) {
		return parseInt(text.substr(0, pos));
	} else {
		return parseInt(text);
	}
}

function updateDragObjectsPosition(x, y)
{
    var dx = x - drag.prevX;
	var dy = y - drag.prevY;
    moveObjectPositionPxRel(dx, dy);
    
    recalculateArrowPositions();
}

function moveObjectPositionPxRel(dx, dy)
{
	var holder = gid('objectImageHolder');
	if (holder != null) {
		holder.style.left = stripPx(holder.style.left) + dx + 'px';
		holder.style.top = stripPx(holder.style.top) + dy + 'px';
	}
}

function Fcrel(elName, ats)
{
	var ret = null;
	var x, val;
    if (browser.client == 'ie') {
        var t = "<" + elName;
        if (elName == 'img') {
            for (x in ats)
	            if (x == 'src') {
	                t = t + ' src="../_images/empty.gif" ' +
	                	'style="filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src=\'' + ats[x] + '\', sizingMethod=\'scale\');"';
				} else
				if (x!='containsValue') t = t+ " " + x + '="' + ats[x] +'"';
		} else {
            for (x in ats) if (x!='containsValue') t = t+ " " + x + '="' + ats[x] +'"';
		}
        
		ret = document.createElement(t + " />");
    } else {
        ret = document.createElement(elName);
        for (x in ats) if (x!='containsValue') ret.setAttribute(x, ats[x]);
	}
	return ret;
}

function createZooms()
{
    var zH = gid('mapZoomMenu');
    zH.innerHTML = '';
    var zD, imgEl;
    var iA=new Array();
    iA['class'] = 'ZoomIcon';
    for (var i = 0; i < mzd.length; i++)
	{
	    zD = mzd[i];
	    iA['alt'] = zD[1];
	    iA['title'] = zD[1];
	    if (zD[0] == 1) {
	        iA['src'] = '../_images/zoom_out.png';
	        iA['onclick'] = 'xajax_mapZoomOut(mc);return false;';
	        iA['width'] = 20; iA['height'] = 20;
		} else if (zD[0] == 2) {
            iA['src'] = '../_images/zoom_in.png';
	        iA['onclick'] = 'xajax_mapZoomIn(mc);return false;';
	        iA['width'] = 20; iA['height'] = 20;
		} else if (zD[0] == 4) {
            iA['src'] = '../_images/zoom_selected.png';
            iA['onclick'] = '';
	        iA['width'] = 20; iA['height'] = 11;
		} else if (zD[0] == 3) {
            iA['src'] = '../_images/zoom.png';
	        iA['onclick'] = 'xajax_mapSetZoom(mc, \'' + zD[2] + '\', \'' + zD[3] +'\');return false;';
	        iA['width'] = 20; iA['height'] = 11;
		} else if (zD[0] == 0) {
		    iA['src'] = '../_images/zoom_map_separator.png';
		    iA['onclick'] = '';
	        iA['width'] = 20; iA['height'] = 5;
		}
		imgEl = Fcrel('img', iA);
		zH.appendChild(imgEl);
	}
}

function createObjects()
{
    var mapHolder = gid('mapImageHolder');
    
    var objDef = null;
    
    //mapHolder.innerHTML = '';
    
    var divEl;
    var hrefEl;
    var imgEl;
    var diam;
    var dA=new Array();
    var dH=new Array();
    var iA=new Array();
    var count = 0;
    
    dH['id'] = "objectHolder";
    dH['style'] = "width: " + mc.sx + "px; height: "+ mc.sy + ";";
    var outObjDivEl = Fcrel('div', dH);
    mapHolder.appendChild(outObjDivEl);
    
    dH['id'] = "objectImageHolder";
    dH['style'] = dH['style'] + "left: 0px; top: 0px;";
    var inObjDivEl = Fcrel('div', dH);
    outObjDivEl.appendChild(inObjDivEl);
    
    if (mc.eurl != '')
	{
	    dH['id'] = "mapExtras";
	    dH['style'] = "width: " + mc.sx + "px; height: "+ mc.sy + ";";
	    var stamp = new Date();
	    iA['src'] = mc.eurl + "?context=" + mc.id + "&rand=" + stamp.getTime();
	    iA['width'] = mc.sx;
		iA['height'] = mc.sy;
		divEl = Fcrel('div', dH);
		imgEl = Fcrel('img', iA);
		divEl.appendChild(imgEl);
	    inObjDivEl.appendChild(divEl);
	}
    
    dA['class'] = "mapObject";
	for (var i = 0; i < vol.length; i++)
	{
	    
	    objDef = vol[i];
	    if (objDef.length == 6) {
			iA['width'] = diam = objDef[3] * 2;
			iA['height'] = diam = objDef[3] * 2;
		    dA['style']= "left: " + (objDef[0]) + "px; top: "+ (objDef[1]) + ";";
            iA['title']= objDef[4];
			iA['alt']= objDef[4];
			iA['id']= "mapObject" + objDef[2];
			iA['src']= mc.iconUrl + objDef[5] + diam + ".png";
			
		    divEl = Fcrel('div', dA);
		    imgEl = Fcrel('img', iA);
	        divEl.appendChild(imgEl);
	        vol[i][6] = divEl;
	        
	        if (mc.sbocl) {
	        	events.addEvent(imgEl, 'mousedown', bubleOpen, false);
	        } else {
                events.addEvent(imgEl, 'mousedown', mapObjectClick, false);
			}
	        count++;
	        
	        inObjDivEl.appendChild(divEl);
	   	} 
	}
	
	// create map list
	var listHolder = gid('objectsInMapList');
	if (listHolder != null)
	{
	    var ulAr = new Array();
	    var liAr = new Array();
	    var aAr = new Array();
		var ulEl;
		var liEl;
		var aEl;
	
	    listHolder.innerHTML = 'V mapě je celkem ' + count + ' objektů';
	    
	    ulAr['class'] = 'searchResultList';
	    ulEl = Fcrel('ul', ulAr);
	    for (var i = 0; i < vol.length; i++)
		{
		    objDef = vol[i];
		    if (objDef.length >= 6) {
				liAr['style'] = 'background: url('+ mc.iconUrl + objDef[5] + '16.png ) no-repeat 0 0;';
				liEl = Fcrel('li', liAr);
				aAr['href'] = '#';
				aAr['onclick'] = 'return mapObjectClickDetail(\''+ objDef[2] +'\'); return false;';
				aAr['onmouseover'] = 'showArrowObject(\''+ objDef[2] +'\');';
				aAr['onmouseout'] = 'hideArrow();';
				aEl = Fcrel('a', aAr);
				
				aEl.appendChild(document.createTextNode(objDef[4]));
				liEl.appendChild(aEl);

		        ulEl.appendChild(liEl);
		   	}
		}
		listHolder.appendChild(ulEl);
	}
}

function mapObjectClick(event)
{
	var event = events.getEvent(event);
	
	var elemId = events.getElement(event).id;
	var objectId = elemId.substr(9);
	gid('objectDetail').innerHTML = '';
	xajax_mapObjectClick(mc, objectId);
	document.getElementById('tabContainer').tabber.tabShow(2);

	events.stopEvent(event);
 	return false;
}

function mapObjectClickDetail(id) {
    gid('objectDetail').innerHTML = '';
	xajax_mapObjectClick(mc, id);
	document.getElementById('tabContainer').tabber.tabShow(2);
}

function deleteVisibleObjectsAndTiles() {
	if (!objectsAndTilesDeleted) {
    	document.getElementById('mapImageHolder').innerHTML = '';
    	objectsAndTilesDeleted = 1;
    	tileMap = new Array();
    }
}

// centering functions

function getS42XFromScreen(x)
{
   var iw = 1.0 / mc.sx;
   return mc.vl + (x * iw) * (mc.vr - mc.vl);
}

function getS42YFromScreen(x)
{
   var iw = 1.0 / mc.sy;
   return mc.vb + (1-(x * iw)) * (mc.vt - mc.vb);
}

function getScreenXFromS42(x)
{
   return Math.floor((x - mc.vl) / (mc.vr - mc.vl) * mc.sx);
}

function getScreenYFromS42(y)
{
   return Math.floor((y - mc.vt) / (mc.vb - mc.vt) * mc.sy);
}

function getDragS42XFromScreen(x)
{
   var iw = 1.0 / mc.sx;
   return drag.viewLeft + (x * iw) * (drag.viewRight - drag.viewLeft);
}

function getDragS42YFromScreen(x)
{
   var iw = 1.0 / mc.sy;
   return drag.viewBottom + (1-(x * iw)) * (drag.viewTop - drag.viewBottom);
}

function moveView(dx, dy)
{
    mc.vl = mc.vl + dx;
	mc.vr = mc.vr + dx;
	mc.vt = mc.vt + dy;
	mc.vb = mc.vb + dy;
}

function checkMapCenter()
{
    if (mc.x < mz.tlx)
        mc.x = mz.tlx;
    if (mc.x > mz.brx)
        mc.x = mz.brx;
    
    if (mc.y < mz.tly)
        mc.y = mz.tly;
    if (mc.y > mz.bry)
        mc.y = mz.bry;

    var dx = mc.x - (mc.vl + mc.vr) / 2;
	var dy = mc.y - (mc.vt + mc.vb) / 2;

	moveView(dx, dy);
}

function setMapCenterByScreen(x, y) {
	var s42x = getS42XFromScreen(x);
	var s42y = getS42YFromScreen(y);

    setMapCenterByCoord(s42x, s42y);

	startReloadTimer();
}

function setMapCenterByCoord(s42x, s42y) {
	var dx = s42x - (mc.vl + mc.vr) / 2;
	var dy = s42y - (mc.vt + mc.vb) / 2;

    mc.x = s42x;
	mc.y = s42y;

	moveView(dx, dy);

    checkMapCenter();
	createTileMap();
}

function mapMove(ddx, ddy) {
	var dx = (mc.vr - mc.vl) * ddx;
	var dy = (mc.vt - mc.vb) * ddy;

    moveView(dx, dy);

    mc.x = mc.vl + (mc.vr - mc.vl) / 2;
	mc.y = mc.vb + (mc.vt - mc.vb) / 2;
	
	moveObjectPositionPxRel(
		Math.floor(mc.sx * (-ddx)),
		Math.floor(mc.sy * (ddy))
		);
	checkMapCenter();
	deleteVisibleObjectsAndTiles();
	createTileMap();
	startReloadTimer();
}

function listObjectClick(id, coordX, coordY) {
	hideArrow();
	setStaticArrowCoordPos(arrowStaticPointer, coordX, coordY);
	
	xajax_mapCenterToObject(mc, id);
	
	return false;
}

function listStreetClick(id, coordX, coordY) {
	hideArrow();
	xajax_mapCenterToStreet(mc, id);
	setStaticArrowCoordPos(arrowStaticPointer, coordX, coordY);
	return false;
}

function mapSetSearchForm(searchText) {
	gid('tabSearchString').value = searchText;
    gid('tabContainer').tabber.tabShow(0);
}

function mapSetMap(mapId) {
    xajax_mapSetMap(mc, mapId);
    xajax_setMapLegend(mc, mapId);
}

function mapSelectChange() {
	var sel = gid('mapSelect');
	var mapId = sel.options[sel.selectedIndex].value;
	if (mapId != '') {
		xajax_mapSetMap(mc, mapId);
	}
}

function openPrintWindow() {
	var url = 'print.php?context=' + mc['id']
	if (arrowSearchCenter.visible) {
		url += '&cx='+ Math.floor(arrowSearchCenter.coordX) + '&cy=' + Math.floor(arrowSearchCenter.coordY);
	}
	if (arrowStaticPointer.visible) {
		url += '&ax='+ Math.floor(arrowStaticPointer.coordX) + '&ay=' + Math.floor(arrowStaticPointer.coordY);
	}
	var wnd = window.open(url);
	wnd.print();
}

// tile map generation

function getTileIndexX(s42x)
{
    var coef = (s42x - mz.tlx) / mz.dx;
    return Math.floor(coef);
}

function getTileIndexY(s42y)
{
    var coef = (mz.bry - s42y) / mz.dy;
    return Math.floor(coef);
}

function getTilePixelOffsetX(s42x)
{
    var coef = (s42x - mz.tlx) / mz.dx;
    coef -= Math.floor(coef);
    return Math.floor(mz.tw * coef);
}

/// Returns y pixel offset to specified s42 y coordinate in corresponding tile.
function getTilePixelOffsetY(s42y)
{
    var coef = (mz.bry - s42y) / mz.dy;
    coef -= Math.floor(coef);
    return Math.floor(mz.th * coef);
}

function createTileMap()
{
    var w = mc.sx;
    var h = mc.sy;

    var s42x = mc.vl;
	var s42y = mc.vt;

    var tileUrl = "";
    var tileDivDefinition = "";

    // Get visible tile origin.
    var tilexoriginal = getTileIndexX(s42x);
    var tiley = getTileIndexY(s42y);
    var srcxoriginal = getTilePixelOffsetX(s42x);
    var srcy = getTilePixelOffsetY(s42y);

	var tileHolder = document.getElementById('mapImageHolder');

	var tileEl = null;
	var imgEl = null;
	

	var visibleTileCount = 0;
	var newTileMap = new Array();
    var y = 0;
    while (y < h)
    {
        var tilex = tilexoriginal;
        var srcx = srcxoriginal;
        var x = 0;

        var availableh = Math.min(mz.th - srcy, h - y);

        while (x < w)
        {
            var availablew = Math.min(mz.tw - srcx, w - x);
            if (tilex >= 0 && tiley >= 0 && tilex < mz.cx && tiley < mz.cy)
            {
                var newTileId = tilex + tiley * mz.cx;
                var styleDef = "left: " + (x - srcx) + "px; top: " + (y - srcy)+ "px; " +
						" width: " + mz.tw + "px; height: " + mz.th + "px; display: block;";

					if (mz.fm == 'o') {
					    	tileUrl = mz.up + newTileId + "." + mz.ft;
					    } else {
					    	if (mz.cc == 0) {
					        	tileUrl = mz.up + "0/"  + mz.tb + '_' + tilex + '_' + (mz.cy - tiley - 1) + '.' + mz.ft;
					        } else {
					            tileUrl = mz.up + Math.floor(tilex / mz.cc) + "/"  + mz.tb + '_' + tilex + '_' + (mz.cy - tiley - 1) + '.' + mz.ft;
						}
					}

                if ((tileEl = gid('mapTile_' + newTileId)) != null) {
                    tileEl.style.left = x - srcx;
                    tileEl.style.top = y - srcy;
                    tileEl.style.display = 'block';
                } else {
                    if (browser.client == 'ie') {
                        tileEl = document.createElement("<div id=\"mapTile_"+newTileId+"\" class=\"mapTile\" style=\"" + styleDef + "\" />");
                    		imgEl = document.createElement("<img src=\"" + tileUrl + "\" />");
                    } else {
                        tileEl = document.createElement("div");
								tileEl.setAttribute("class", "mapTile");
								tileEl.setAttribute("style", styleDef);
	                    	tileEl.setAttribute("id", "mapTile_" + newTileId);
							
								imgEl = document.createElement("img");
								imgEl.setAttribute("src", tileUrl);
							}
                    
                		tileEl.appendChild(imgEl);
							tileHolder.appendChild(tileEl);
					}
					newTileMap[visibleTileCount] = newTileId;
               visibleTileCount += 1;
				}

            tilex++;
            srcx = 0;
            x += availablew;
        }

        tiley++;
        srcy = 0;
        y += availableh;
    }
    
    for(var i=0; i<tileMap.length;i++) {
        // we hide the tiles which are no longer visible
        var found = false;
        var j = 0;
        while (j < visibleTileCount) {
            if (newTileMap[j] == tileMap[i]) {
				found = true;
				break;
			}
			if (newTileMap[j] > tileMap[i]) {
			    break;
			}
			j++;
		}
		
		if (!found) {
		    if ((tileEl = gid('mapTile_' + tileMap[i])) != null) {
	            tileHolder.removeChild(tileEl);
			}
		}
	}
	
	tileMap = newTileMap;
};



function setObjectListMapVisibility() {
	var chck = gid('visibleInMapOnly');
	var showVisibleOnly = 0;
	if (chck.checked) {
		showVisibleOnly = 1;
	} 
	
	xajax_setObjectListMapVisibility(mc, showVisibleOnly);
}

// position
function findPosX(obj){
	var curleft=0;
	if(obj.offsetParent){
		while(obj.offsetParent)
			{curleft+=obj.offsetLeft;obj=obj.offsetParent;}
	}
	else if(obj.x)
		curleft += obj.x;

	return curleft;
	}

function findPosY(obj){
	var curtop=0;
	if(obj.offsetParent){
		while(obj.offsetParent)
			{curtop+=obj.offsetTop;obj=obj.offsetParent;}
	}
	else if(obj.y)
		curtop+=obj.y;

	return curtop;
	}

function getX(e, obj) {
	var posx;
	if (e.pageX || e.pageY) {
		posx = e.pageX;
	}
	else if (e.clientX || e.clientY) {
		posx = e.clientX;
		if (browser.client == 'ie') {
			posx += document.body.scrollLeft;
		}
	}
	else
		return -1;

	return posx - findPosX(obj);
}

function getY(e, obj) {
	var posy;
	if (e.pageX || e.pageY) {
		posy = e.pageY;
	}
	else if (e.clientX || e.clientY) {
		posy = e.clientY;
		if (browser.client == 'ie') {
			posy += document.body.scrollTop;
		}
	}
	else
		return -1;

	return posy - findPosY(obj);
}

// EVENTS
window['events'] = new cEvent();
var drag = new Object;
resetDrag();

function resetDrag() {
	drag.s42x = 0;
	drag.s42y = 0;
	drag.isDraging = 0;
	drag.mouseDown = 0;
	drag.centerX = 0;
	drag.centerY = 0;
	drag.x = 0;
	drag.y = 0;
	drag.viewLeft = 0;
	drag.viewRight = 0;
	drag.viewBottom = 0;
	drag.viewTop = 0;
	drag.prevX = 0;
    drag.prevY = 0;
}


function mapMouseDragUp(e) {
    if (!e) e = window.event;
    var x = getX(e, gid('mapImageHolder')) ;
    var y = getY(e, gid('mapImageHolder')) ;

    if (drag.isDraging == 0) {
		xajax_mapCenterToPointAndZoom(mc, x, y);
	} else {
	    startReloadTimer();
	}

    events.removeEvent(document, 'mousemove', mapMouseDragMove, false);
    events.removeEvent(document, 'mousemove', mapMouseDragMove, false);
	events.removeEvent(document, 'mouseup', mapMouseDragUp, false);
	events.removeEvent(document, 'mousemove', events.preventDefault, false);
	events.stopEvent(e);
	resetDrag();
}

function mapMouseDragMove(event)
{
	var event = events.getEvent(event);
    drag.isDraging = 1;
    var x = getX(event, gid('mapImageHolder')) ;
    var y = getY(event, gid('mapImageHolder')) ;
    
	var s42x = getDragS42XFromScreen(x);
	var s42y = getDragS42YFromScreen(y);
    setMapCenterByCoord(
		Math.floor(drag.centerS42X - (s42x - drag.s42x)),
		Math.floor(drag.centerS42Y - (s42y - drag.s42y))
	);
	
    updateDragObjectsPosition(x, y);

    drag.prevX = x;
    drag.prevY = y;
    
	events.stopEvent(event);
}

function mapMouseSelectMove(event)
{
    var event = events.getEvent(event);
    drag.isDraging = 1;
    
    var maskEl = gid('mapSelectMask');
    
    var x = getX(event, gid('mapImageHolder')) ;
	var y = getY(event, gid('mapImageHolder')) ;
	
	x = Math.max(0, x);//, mc.sx);
	y = Math.max(0, y);//, mc.sy);
	
	var startX = Math.max(Math.min(x, drag.x), 0);
	var startY = Math.max(Math.min(y, drag.y), 0);
	
	var width = Math.abs(x - drag.x);
	var height = Math.abs(y - drag.y);
	
	if (startX + width > mc.sx) {
		width = mc.sx - (startX + 6);
	}
	
	if (startY + height > mc.sy) {
		height = mc.sy - (startY + 6);
	}
	
    maskEl.style.left = startX;
    maskEl.style.top = startY;
    maskEl.style.width = width;
    maskEl.style.height = height;
    maskEl.style.display = 'block';
    
    events.stopEvent(event);
}

function mapMouseSelectUp(event)
{
    var event = events.getEvent(event);
    var x = getX(event, gid('mapImageHolder')) ;
	var y = getY(event, gid('mapImageHolder')) ;

	if (!drag.isDraging) {
		xajax_mapCenterToPointAndZoom(mc, x, y);
	} else {
	    xajax_mapZoomToRect(mc, drag.x, drag.y, x, y);

	    var maskEl = gid('mapSelectMask');
	    maskEl.style.display = 'none';
	}
	
	events.removeEvent(document, 'mousemove', mapMouseSelectMove, false);
	events.removeEvent(document, 'mouseup', mapMouseSelectUp, false);
	events.removeEvent(document, 'mousemove', events.preventDefault, false);
	events.stopEvent(event);
    resetDrag();
}

function mapMouseUp(event) {
	events.removeEvent(document, 'mouseup', mapMouseUp, false);
	events.removeEvent(document, 'mousemove', events.preventDefault, false);
	events.stopEvent(event);
}



function mapMouseDown(event)
{
    var event = events.getEvent(event);
    
    bubleClose();
    
	if (mapIsReloading) {
        events.stopEvent(event);
        return;
	}
	
	var x = getX(e, gid('mapImageHolder'));
    var y = getY(e, gid('mapImageHolder'));
	
	resetDrag();

    if (event.button == 2 
		|| (browser.client == 'saf' && event.altKey)
		|| (browser.client == 'ie' && event.button == 0)
	 ) 
	 {
		if (mc.sctm) {
        	contextMenu.changeDisplay(x, y);
		} else {
			xajax_mapZoomOut(mc);
		}
		events.stopEvent(event);
      
      return;  
	}
	
	if (contextMenu.display) {
		contextMenu.close();
		return;
	}
	
   var event = events.getEvent(event);
	var targetElem = null;
	
   if (browser.client == 'ie') {
        targetElem = event.srcElement;
	} else {
		targetElem = event.target;
   }
   if (targetElem.id.lastIndexOf("mapObject") != -1) {
    	events.stopEvent(event);
    	return;
   }
    
   stopReloadTimer();
    
   drag.x = x;
   drag.y = y;
   drag.s42x = getS42XFromScreen(x);
   drag.s42y = getS42YFromScreen(y);
   drag.centerS42X = mc.x;
   drag.centerS42Y = mc.y;
   drag.viewLeft = mc.vl;
	drag.viewRight = mc.vr;
	drag.viewBottom = mc.vb;
	drag.viewTop = mc.vt;
	drag.prevX = x;
    drag.prevY = y;

	if (event.ctrlKey || e.metaKey) {
		events.addEvent(document, 'mouseup', mapMouseSelectUp, false);
		events.addEvent(document, 'mousemove', mapMouseSelectMove, false);
	} else {
	    events.addEvent(document,'mouseup', mapMouseDragUp, false);
		events.addEvent(document,'mousemove', mapMouseDragMove, false);
		events.addEvent(document,'mousemove', mapMouseDragMove, false);
	}
	
    events.addEvent(document, 'mousemove', events.preventDefault, false);
	events.stopEvent(event);
}

function minimapMouseDown(event)
{
    var x = getX(event, gid('minimapImageHolder'));
    var y = getY(event, gid('minimapImageHolder'));
    xajax_mapCenterToMinimapPoint(mc, x, y);

    events.addEvent(document, 'mousemove', events.preventDefault, false);
    events.addEvent(document,'mouseup', minimapMouseUp, false);
    events.stopEvent(event);
}

function minimapMouseUp(event)
{
	events.removeEvent(document, 'mousemove', events.preventDefault, false);
	events.removeEvent(document, 'mouseup', minimapMouseUp, false);
	events.stopEvent(event);
}

function initEvents()
{
	events.addEvent(document, 'keypress', DocumentOnKeyPress, false);
	events.addEvent(document, 'keydown', DocumentOnKeyPress, false);
	
	initEventsOnMapDiv(gid('mapImageHolder'));
	events.addEvent(gid('mapHolder'), 'contextmenu', events.preventDefault, false);
	initEventsOnMinimapDiv(gid('minimapImageHolder'));
	initEventsOnMinimapDiv(gid('minimapSelectMask'));	
}

function initEventsOnMapDiv(div)
{
   events.addEvent(div, 'mousedown', mapMouseDown, false);
	events.addEvent(div, 'contextmenu', events.preventDefault, false);
	events.addEvent(div, 'mousedown', events.preventDefault, false);
	events.addEvent(div, 'mousedown', events.preventDefault, false);
	events.addEvent(div, 'contextmenu', events.preventDefault, false);
}

function initEventsOnMinimapDiv(div)
{
   events.addEvent(div, 'mousedown', minimapMouseDown, false);
	events.addEvent(div, 'contextmenu', events.preventDefault, false);
	events.addEvent(div, 'mousedown', events.preventDefault, false);
	events.addEvent(div, 'mousedown', events.preventDefault, false);
	events.addEvent(div, 'contextmenu', events.preventDefault,false);
}

// ovladani z klacesnice
document.onkeypress = DocumentOnKeyPress;

function DocumentOnKeyPress(e) {
	var keyCode = -1;
	if (window.event) {
		keyCode = window.event.keyCode;
		if (window.event.srcElement.tagName == 'INPUT') {return;}
	}
	if (e) {
		keyCode = e.charCode;
		if (e.target.tagName == 'INPUT') {return;};
	}
	var delta = 0.2;
	if (keyCode == -1) {
		return;
	}

	switch (keyCode) {
		case 43: xajax_mapZoomIn(mc); break;
		case 45: xajax_mapZoomOut(mc); break;
		case 55: mapMove(-delta, delta); break;
		case 56: mapMove(0, delta); break;
		case 57: mapMove(delta, delta); break;
		case 52: mapMove(-delta, 0); break;
		case 53: mapMove(0, -delta); break;
		//case 53: xajax_mapZoomIn(mc); break;
		case 54: mapMove(delta, 0); break;
		case 49: mapMove(-delta, -delta); break;
		case 50: mapMove(0, -delta); break;
		case 51: mapMove(delta, -delta); break;
	}
	

}
