/** @author Pavel Chlad (Mopab)
  * @version 1.01 2007-04-06
  */

function scrollPos() {
	if(document.documentElement.scrollTop) {
		var ox=document.documentElement.scrollLeft;
		var oy=document.documentElement.scrollTop
	}
	else if(document.body.scrollTop) {
		var ox=document.body.scrollLeft;
		var oy=document.body.scrollTop
	}
	else {
		var ox=0;
		var oy=0
	}
	return {
		x: ox, y: oy
	}
}

function DynamicRequestObj() {
	this.allowXMLHTTPREQUEST=true;
	this.init=function(allowXMLHTTPREQUEST) {
		this.allowXMLHTTPREQUEST=allowXMLHTTPREQUEST
	};
	this.send=function(url,x,y,dataFold) {
		if(url!='') {
			url += '/getFields.php?x='+x+'&y='+(-y);
			try {
				var a=this.allowXMLHTTPREQUEST==true?
					this.httpRequestRoutine(url,dataFold): 
					this.scriptRoutine(url,dataFold)
			}
			catch(e) {
				this.scriptRoutine(url,dataFold);
				dataFold=null;
			}
		}
	};
	this.httpRequestRoutine=function(url,dataFold) {
		if(typeof(XMLHttpRequest)!='undefined') {			
			var XHR=new XMLHttpRequest();
		
		}else {			
			try {
				var XHR=new ActiveXObject("Msxml2.XMLHTTP")
			}
			catch(e) {
				XHR=null;
				return this.scriptRoutine(url,dataFold)
			}

		}
		try {
			XHR.open("GET",url,true);
		}
		catch(e) {
			XHR=null;
			return this.scriptRoutine(url,dataFold);
		}
		function stateAction() {
			if(XHR.readyState==4) {
				if(XHR.status==200) {
					//alert(XHR.responseText);
					//alert (XHR.responseXML);
					fields =  XHR.responseXML.getElementsByTagName("fields")[0].childNodes;
					var fieldsArray = XHR.responseXML.getElementsByTagName('field');
					var fieldsArrayLen = fieldsArray.length;
					
   				    for (var i=0; i<fieldsArrayLen; i++){						
						dom.addAnchor(map.domObj, 
							parseInt(fieldsArray[i].getElementsByTagName('x')[0].firstChild.nodeValue)*10 + Math.round(map.imgSize.x/2),
							(-parseInt(fieldsArray[i].getElementsByTagName('y')[0].firstChild.nodeValue)*10) + Math.round(map.imgSize.y/2),
							(fieldsArray[i].getElementsByTagName('url')[0].firstChild)?
							fieldsArray[i].getElementsByTagName('url')[0].firstChild.nodeValue:'',
							(fieldsArray[i].getElementsByTagName('descr')[0].firstChild)?
							fieldsArray[i].getElementsByTagName('descr')[0].firstChild.nodeValue:'',
							(fieldsArray[i].getElementsByTagName('id')[0].firstChild)?
							fieldsArray[i].getElementsByTagName('id')[0].firstChild.nodeValue:'',
							(fieldsArray[i].getElementsByTagName('size')[0].firstChild)?
							fieldsArray[i].getElementsByTagName('size')[0].firstChild.nodeValue:'');
					}
					XHR=null;
				}
			}
			else if(XHR.readyState==0) {
				this.scriptRoutine(url,dataFold);
				XHR=null;
			}
		}
		XHR.onreadystatechange=stateAction;
		if(this.allowXMLHTTPREQUEST==true) {
			XHR.send(null);
		}
		return 0;
	};
	this.scriptRoutine=function(url,dataFold) {
		var trg=dom.gEl(dataFold);
		this.loader=document.createElement('script');
		this.loader.type="text/javascript";
		this.loader.src=url;
		trg.appendChild(this.loader);
		return 0;
	}
};

/** objekt pro praci s DOM - vytvareni a ruseni objektu
*/
var dom={
	/** vyhleda objekt
	*/
	gEl:function(el){
		if(document.getElementById && document.getElementById(el)) {
		// W3C DOM
		return document.getElementById(el);
		} 
		else if (document.all && document.all(el)) {
		// MSIE 4 DOM
		return document.all(el);
			} else if (document.layers && document.layers[el]) {
		// NN 4 DOM
		return document.layers[el];
			} else {
		return false;
			}

	},
	/** vbybere styl objektu
	*/
	gSt:function(el){
	    if(document.getElementById && document.getElementById(el)) {
		// W3C DOM
		return document.getElementById(el).style;
			} 
		else if (document.all && document.all(el)) {
		// MSIE 4 DOM
		return document.all(el).style;
			} else if (document.layers && document.layers[el]) {
		// NN 4 DOM
		return document.layers[el];
			} else {
		return false;
			}
	},
	cTxt:function(txt){
		return document.createTextNode(txt)
	},
	cEl:function(el){
		return document.createElement(el)
	},
	appC:function(p,c){
		return p.appendChild(c)
	},
	remC:function(p,c){
		return p.removeChild(c)
	},

	appImg:function(p,src){
		var obr = dom.cEl('img');
		obr.src = src;
		obr.style.position='absolute';
		p.appendChild(obr);
		return obr;
	},
	addDiv:function(p,x,y,color){
		x = Math.floor(x/10)*10;
		y = Math.floor(y/10)*10;
		var divek = dom.cEl('div');
		divek.style.width='10px';
		divek.style.height='10px';
		divek.style.fontSize='1px';
		divek.style.position='absolute';	
		divek.style.left=x  + "px";	
		divek.style.top=y + "px";	
		divek.style.backgroundColor=color;
		divek.style.zIndex='10';
		p.appendChild(divek);
		return divek;
	},
	addAnchor:function(p,x,y,href,alt,id,size){
		var xy = size.split("_");
		x = Math.floor(x/10)*10;
		y = Math.floor(y/10)*10 - (parseInt(xy[1] -1)*10);
		var divek = dom.cEl('div');
		divek.style.width='' + (parseInt(xy[0]*10)) + 'px';
		divek.style.height='' + (parseInt(xy[1]*10)) + 'px';
		divek.style.fontSize='1px';
		divek.style.position='absolute';	
		divek.style.left=x + "px";	
		divek.style.top=y + "px";	
		//divek.style.backgroundColor='black';
		divek.style.zIndex='10';	
		var obrazek = null;	
		if (id.length>0){
			obrazek = dom.cEl('img');
			obrazek.src = url_xml + '/show_preview.php?id='+id;
			obrazek.alt = alt;
		}
		else {
			divek.style.backgroundColor='black';
		}

		if (href.length>0) {
			var anchor = dom.cEl('a');
			anchor.href = href;
			anchor.target = '_blank';
			if (obrazek){anchor.appendChild(obrazek);}
			divek.appendChild(anchor);
		} else {
			var anchor = dom.cEl('a');
			anchor.href = '#';
			anchor.title = '... reserved ...';
			anchor.style.width='' + (parseInt(xy[0]*10)) + 'px';
			anchor.style.height='' + (parseInt(xy[1]*10)) + 'px';
			if (obrazek){anchor.appendChild(obrazek);}
			divek.appendChild(anchor);
		}	
		
		p.appendChild(divek);
		return divek;
	}
};

/** objekt pro praci s mapou
*/
var map = {
	timeoutMap: null,
	domObj: null,
	pole: null,
	style: null,
	moving: false, moved : false,
	imgSize: {x:2500, y:2500},
	offset : {x:  24, y:  74},
	start  : {x:   0, y:   0},
	startMapY: 0,
	startMapX: 0,
	imgs: null,
	orderArray: null,
	dynReqObj: null,

	init:function() {
		newInst(window,'events',evnt);
		map.dynReqObj = new DynamicRequestObj();
		map.domObj = dom.gEl('mapa');
		map.pole = dom.gEl('okno');
		map.style = map.domObj.style;		
		map.imgs = new map.ImagesObj();
		
		//if (enableClick){
			events.addEvent(map.domObj,'click',map.mouseCilck,false,1);
		//}
		events.addEvent(map.domObj,'mouseover',map.mouseOver,false,1);
		events.addEvent(map.domObj,'mousedown',map.startMove,true,1);	
		events.addEvent(document,'mousemove',map.move,false,1);
		events.addEvent(document,'mouseup',map.stopMove,false,1);		
		map.imgs.init();
		map.toCenter();

		/*map.dynReqObj.send(url_xml,0,0);

		// parse and add selected fields 
		if (dom.gEl('fields') || dom.gEl('xfields')) {
			var order = '';
			if (dom.gEl('fields')) 
			{order = dom.gEl('fields').value;}
			else 
			{order = dom.gEl('xfields').value;}

			if (order.length>0) {
				var filds = order.split(/[\]\[]+/);
				if (filds.length>0) {
					center = map.imgs.getCenterPos();
					for (var i=0,j=filds.length; i<j; i++){
						xy = filds[i].split(",");
						var divecek = dom.addDiv(map.domObj,
						(xy[0]*10+center.x),
						(-(xy[1]*10)+center.y),'#CC0000');
						map.orderArray[''+xy[0] +','+xy[1]] = {d:divecek,x:xy[0],y:xy[1]};
					}
				}
			}
		}
		*/

	},

    mouseCilck:function (e) {
		var tg = (window.event) ? e.srcElement : e.target;
		if (!map.moved && (tg.tagName == 'A' || tg.parentNode.tagName == 'A')) {
			if (dom.gEl('fields')){
				events.stopEvent(e);
				events.cancelDef(e);	
			}
		}
		else if (!map.moved && dom.gEl('fields')) {
			events.stopEvent(e);
			events.cancelDef(e);	
			var order = dom.gEl('fields');
			center = map.imgs.getCenterPos();			
			
			var tmpX = (Math.floor(( e.clientX - map.offset.x - map.getInt(map.style.left) - center.x )/10));
			var tmpY = -(Math.floor(( e.clientY - map.offset.y - map.getInt(map.style.top) - center.y )/10));
			if (map.orderArray[''+tmpX +','+tmpY]){///delete
				dom.remC(map.domObj,map.orderArray[''+tmpX +','+tmpY].d);
				map.orderArray[''+tmpX +','+tmpY] = null;
				order.value = '';
				for (var i in map.orderArray){
					if (map.orderArray[i] != null){
						order.value += '['+map.orderArray[i].x +','+map.orderArray[i].y +']';
					}
				}
			} else {
				var divecek = dom.addDiv(map.domObj,
				e.clientX-map.offset.x-map.getInt(map.style.left),
				e.clientY-map.offset.y-map.getInt(map.style.top),'#CC0000');
				order.value += '['+tmpX +','+tmpY +']';
				map.orderArray[''+tmpX +','+tmpY] = {d:divecek,x:tmpX,y:tmpY};
			}
		} else {
			if ((map.moved)){
				events.stopEvent(e);
			    events.cancelDef(e);	
			}
		}
	},

	mouseOver:function (e) {
		if (map.moving) {
			//alert(navigator.userAgent);
			if (navigator.userAgent.indexOf('MSIE') > 0){	
				map.style.cursor='url(' + url_files + '/design/closedhand.cur)';//'Move';
			} else {
				map.style.cursor="-moz-grabbing";
			}
		} else {
			if (navigator.userAgent.indexOf('MSIE') > 0){	
				map.style.cursor='url(' + url_files + '/design/openhand.cur)';//'Crosshair';
			} else {
				map.style.cursor="-moz-grab";
			}
		}		
	},
	startMove:function(e) {	
		if (navigator.userAgent.indexOf('MSIE') > 0){	
			map.style.cursor='url(' + url_files + '/design/closedhand.cur)';//'Move';
		} else {
			map.style.cursor="-moz-grabbing";
		}
		map.moving = true;
		map.moved = false;
		map.start.x = e.clientX;
		map.start.y = e.clientY;
		map.startMapY = map.getInt(map.style.top);
		map.startMapX = map.getInt(map.style.left);
		events.stopEvent(e);
		events.cancelDef(e);		
	},
	stopMove:function() {	
		if (navigator.userAgent.indexOf('MSIE') > 0){	
			map.style.cursor='url(' + url_files + '/design/openhand.cur)';//'Crosshair';
		} else {
			map.style.cursor="-moz-grab";
		}
		map.moving = false;			
		map.moveArrowStop();
	},
	move:function(e) {	
		//var theWidth=getBrowserWidth(); 
		events.stopEvent(e);
		events.cancelDef(e);		
		if (map.moving) {	
			newTopPos = map.startMapY + e.clientY - map.start.y;
			if (newTopPos<=0 && newTopPos>=-(map.imgSize.y-map.pole.clientHeight))
			{
				map.style.top = (newTopPos) + "px";
			}

			newLeftPos = map.startMapX + e.clientX - map.start.x;
			if (newLeftPos<=0 && newLeftPos>=-(map.imgSize.x-map.pole.clientWidth))
			{
				map.style.left = (newLeftPos) + "px";
			}
			//map.pole.clientWidth


			//map.update(map.startMapY + e.clientY - map.start.y, map.startMapX + e.clientX - map.start.x);			
			if(map.start.x != e.clientX || map.start.y != e.clientY){
				map.moved = true;
			}
		}
		//map.updatePosition(e.clientX-map.offset.x,e.clientY-map.offset.y);
	},
	occ:1,slide:50,pos:0,
	/** 
	 * @param int pos : 1 - topleft, 2 - top, 3 - topright, 4 - right, 5 - bottomright, 6 - bottom, 7 - bottomleft, 8 - left
	 */
	moveArrowProcess:function(pos) { 
		if (pos){map.pos = pos;}
		newX  = map.getInt(map.style.left) + ((map.pos>6 || map.pos==1)?Math.ceil(map.occ/300):((map.pos>2 && map.pos<6) ? (-Math.ceil(map.occ/300)):0));		
		newY  = map.getInt(map.style.top) + ((map.pos<4)?Math.ceil(map.occ/300):((map.pos>4 && map.pos<8) ? (-Math.ceil(map.occ/300)):0));		
		map.style.top = newY;
		map.style.left = newX;
		map.update(newY, newX);
		if(map.occ <= 1500) {			
			map.occ += map.slide;
		}
		map.timeoutMap=setTimeout("map.moveArrowProcess()",10)
	},
	moveArrowStopProcess:function() {
		if (map.occ > 1){
			newX  = map.getInt(map.style.left)+ ((map.pos>6 || map.pos==1)?Math.ceil(map.occ/300):((map.pos>2 && map.pos<6) ? (-Math.ceil(map.occ/300)):0));		
			newY  = map.getInt(map.style.top) + ((map.pos<4)?Math.ceil(map.occ/300):((map.pos>4 && map.pos<8) ? (-Math.ceil(map.occ/300)):0));		
			map.style.top = newY;
			map.style.left = newX;
			map.update(newY, newX);
			map.occ -= map.slide;			
			map.timeoutMap=setTimeout("map.moveArrowStopProcess()",10)
		}
		else {
			if(map.timeoutMap) {
				clearTimeout(map.timeoutMap)
			}
			map.occ = 1;
		}
	},
	moveArrowStop:function() {
		if(map.timeoutMap) {
			clearTimeout(map.timeoutMap);
			map.moveArrowStopProcess();
		}
		map.timeoutMap = null;
	},
	getInt: function(str) {		
		var val = 0;
		if (str.length>0) {
			val = parseInt(str.substring(0,str.indexOf('p')));
			if (isNaN(val)){
				val = 0;
			}
		} 
		return val;
	},
	toCenter: function() {		
		map.domObj.style.left = (Math.round(map.pole.clientWidth/2) - Math.round(map.imgSize.x/2) - 5) + "px";
		map.domObj.style.top = (Math.round(map.pole.clientHeight/2) - Math.round(map.imgSize.y/2) - 5) + "px";			
		//dom.gEl('location').value = 'X:0 Y:0';
	},
	updatePosition: function(x, y) {
		center = map.imgs.getCenterPos();
		mapY = map.getInt(map.style.top);
		mapX = map.getInt(map.style.left);		
		
		relX = - Math.ceil((center.x + mapX - x)/10);
		relY = Math.ceil((center.y + mapY - y)/10);

		dom.gEl('location').value = 'X:'+relX+' Y:'+relY;
		//dom.gEl('location').value = 'Y:'+y +' CY:'+center.y+ ' MY:'+mapY + ' YY:'+ relY;
	},
	update: function(top, left) {
		//dom.gEl('location').value = 'X:'+left+' Y:'+top;
		map.imgs.update(top, left);
	},
	ImagesObj:function() {
		this.imgs = null;
		this.min = {x:0,y:0};
		this.max = {x:0,y:0};
		this.center = {x:0,y:0};
		this.akt = {A:{x:0,y:0},B:{x:0,y:0},C:{x:0,y:0},D:{x:0,y:0}};
		this.init = function () {
			this.max.x = map.imgSize.x;
			this.max.y = map.imgSize.y;
			this.imgs = new Array();
			obr = dom.cEl('img');
			obr.src = url_files + '/design/bg4.gif';			
			obr.style.position='absolute';			
			dom.appC(map.domObj,obr);	
			//this.imgsY[0] = new Array();
			this.imgs['0#0'] = obr;
			this.center.x = Math.round(map.imgSize.x/2);
			this.center.y = Math.round(map.imgSize.y/2);
		}
		this.update = function (top, left) {
			// deltekce prechodu
			A = {x: Math.ceil((left/map.imgSize.x)), y: Math.ceil(top/map.imgSize.y)};
			D = {x: Math.ceil(((left-map.pole.clientWidth)/map.imgSize.x)), y: Math.ceil((top-map.pole.clientHeight)/map.imgSize.y)};
			B = {x: A.x, y: D.y};
			C = {x: D.x, y: A.y};
			if (this.akt.A.x != A.x || this.akt.A.y != A.y){
				this.addToPosition(A.x,A.y);
				this.akt.A.x = A.x;
				this.akt.A.y = A.y;
			}
			if (this.akt.B.x != B.x || this.akt.B.y != B.y){
				this.addToPosition(B.x,B.y);
				this.akt.B.x = B.x;
				this.akt.B.y = B.y;
			}
			if (this.akt.C.x != C.x || this.akt.C.y != C.y){
				this.addToPosition(C.x,C.y);
				this.akt.C.x = C.x;
				this.akt.C.y = C.y;
			}
			if (this.akt.D.x != D.x || this.akt.D.y != D.y){
				this.addToPosition(D.x,D.y);
				this.akt.D.x = D.x;
				this.akt.D.y = D.y;
			}
			//dom.gEl('location').value = 'A:'+A.x + 'D:'+D.x;
			return false;	
		}
		this.addToPosition = function (x, y) {
			//dom.gEl('location').value = 'test:' + x +':' + y;
			if (!this.imgs[''+x+'#'+y])	{
				obr = dom.appImg(map.domObj,url_files + '/design/bg.gif');
				obr.style.left = '' + (-x*map.imgSize.x) + 'px';	
				obr.style.top = '' + (-y*map.imgSize.y) + 'px';	
				this.imgs[''+x+'#'+y] = obr;
				map.dynReqObj.send(url_xml,(-x*map.imgSize.x/10),(-y*map.imgSize.y/10));
			} 
		}

		this.getCenterPos = function() {
			return this.center;
		}
	} 
}

/********************** dynamicke metody a objekty ***********************************/
	


function newInst(parentObject,instName,instConstructor) {
	parentObject[instName]=new instConstructor(instName)
}

function evnt(nam) {
	this.eventFolder=new Array();
	this.getEvent=function() {
		e=arguments[0];
		e=e?e: window.event;
		return e
	};
	this.getTarget=function(e) {
		e=window[nam].getEvent(e);
	if(!e.currentTarget) {
		e.currentTarget=e.srcElement
	}
		return e.currentTarget
	}
		;
	this.addEvent=function(elm,eventType,fn,set) {
		if(arguments[4]) {
			var num=window[nam].eventFolder.length;
			window[nam].eventFolder[num]=new Object();
			window[nam].eventFolder[num].trg=elm;
			window[nam].eventFolder[num].typ=eventType;
			window[nam].eventFolder[num].action=fn;
			window[nam].eventFolder[num].bool=set
		}
		if(document.addEventListener) {
			if(window.opera&&(elm==window)) {
				elm=document
			}
			elm.addEventListener(eventType,fn,set)
		}
		else if(document.attachEvent) {
			elm.attachEvent('on'+eventType,fn)
		}
	};
	this.clearEvents=function() {
		for(var i=0;i<window[nam].eventFolder.length;i++) {
			try {
				dom.removeEvent(window[nam].eventFolder[i].trg,window[nam].eventFolder[i].typ,window[nam].eventFolder[i].action,window[nam].eventFolder[i].bool)
			}
			catch(e) {
			}
				window[nam].eventFolder[i]=null
		}
		window[nam].eventFolder=null
	};
	this.removeEvent=function(elm,eventType,fn,set) {
		if(document.removeEventListener) {
		if(window.opera&&(elm==window)) {
			elm=document
		}
			elm.removeEventListener(eventType,fn,set)
		}
		else if(document.detachEvent) {
			elm.detachEvent('on'+eventType,fn)
		}
	};
	this.stopEvent=function(e) {
		var e=window[nam].getEvent(e);
		if((document.attachEvent&&!window.opera)&&(typeof(clickTracker)!='undefined')&&(e.type=='click')) {
			clickTracker.logger()
		}
		if(e.stopPropagation) {
			e.stopPropagation()
		}
		else {
			e.cancelBubble=true
		}
	};
	this.cancelDef=function(e) {
		e=window[nam].getEvent(e);
		if(e.preventDefault) {
			e.preventDefault()
		}
		else {
			e.returnValue=false
		}
	}
}

window.onload = map.init;