var isDrag=false;
var radius=12;
var x1,x2,y1,y2,dx,dy;
var X0point, Y0point, Xpoint, Ypoint, ObjPos;
var wbig=1200, wmiddle=500, wsmall=320, hbig=450, hmiddle=168, hsmall=240;//hmiddle=195;
var pictWhalf=22, pictHhalf=42;
var ua = navigator.userAgent;
var ns = ((ua.indexOf("Netscape") > 0) || (ua.indexOf("Firefox") > 0));
var ie = (ua.indexOf("MSIE") > 0);
var op = (ua.indexOf("Opera") > 0);
if (ie) ns=false; else ns=true;
var markerFlag=false;
var objects=new Array();
var objW=22;
var npage=500;
var vacW=12, vacH=12;
var PageCount=0;
var page=1;

function CloseMarker()
{
   	getElement('marker').style.visibility='hidden';
  	getElement('marker').style.display='none';
	label='';
}

function getPos(el)
{
  for (var lxx=0,lyy=0;el!=null;)
	lxx+=el.offsetLeft,lyy+=el.offsetTop,el=el.offsetParent;
  return {x:lxx,y:lyy}
}

function getEventPos(evnt)
{
  var ex, ey;
  if (ns) {
    ex=evnt.clientX;
    ey=evnt.clientY;
  }
  else {
    ex=event.clientX;
    ey=event.clientY;
  }
  return {x:ex,y:ey}
}


function SetCursor(act)
{
	var cur='default';
	switch(act)
	{
	case "shift":
     cur='move';
     break;
	case "zoomin":
	case "zoomout":
     cur='crosshair';
     break;
	default:
    cur='default';
    break;
	}
	getElement("cover").style.cursor=cur;
	getElement("view_div").style.cursor=cur;
}

function SelTooll(act) 
{
  var doc=document;
  getElement(ACTION+'_li').className="";
  getElement(ACTION).src="../i/"+ACTION+".gif";
  ACTION=act;
  getElement(ACTION+'_li').className='select';
  getElement(ACTION).src="../i/"+ACTION+"_n"+".gif";
  SetCursor(ACTION);
}

function map1_click(evnt)
{
  if (markerFlag) return;
  ObjPos = getPos(getElement('view_div'));
  var e,cond;
  e=getEventPos(evnt);
  var scroll=getScroll();
  dx=scroll.x;
  dy=scroll.y;
  cond=e.x>ObjPos.x-dx && e.y>ObjPos.y-dy && e.x<ObjPos.x-dx+mapw && e.y<ObjPos.y-dy+maph;
  if (!cond) return true;
  if (ACTION == "shift") return false;
  var DragX=e.x;
  var DragY=e.y;
  return true;
}

function map1_dragstart(evnt)
{
  if (location.href.indexOf('print.asp')>0) return;
  if (markerFlag) return;
  ObjPos = getPos(getElement('view_div'));
  var e,cond;
  e=getEventPos(evnt);
  var scroll=getScroll();
  dx=scroll.x;
  dy=scroll.y;
  cond=e.x>ObjPos.x-dx && e.y>ObjPos.y-dy && e.x<ObjPos.x-dx+mapw && e.y<ObjPos.y-dy+maph;
  if ((ACTION=="zoomin" || ACTION=="zoomout" ||  ACTION=="shift") && cond) 
  {
    isDrag=true;
    Y0point = e.y;
    X0point = e.x;
    x1=X0point;
    x2=X0point;
    y1=Y0point;
    y2=Y0point;
  }
}

function map1_dragend(evnt)
{
  if (!isDrag) return true;
  isDrag=false;
  var dX, dY, M;
  if (ACTION=="zoomin" || ACTION=="zoomout") 
  {
	cx=Math.round(cx-zoom/2+zoom/mapw*((x1+x2-2*ObjPos.x)/2));
	cy=Math.round(cy-zoomh/2+zoomh-zoomh/maph*((y1+y2-2*ObjPos.y)/2));
	if (Math.abs(x1-x2)>10 && Math.abs(y1-y2)>10) 
	{
	  dX = mapw/Math.abs(x1-x2);
	  dY = maph/Math.abs(y1-y2);
	  if (dX>dY) 
		M=dY; 
	  else
		M=dX;
	}
	else 
	  M  = 2;
	if (ACTION=="zoomin") 
	  zoom=Math.round(zoom/M);
	if (ACTION=="zoomout") 
	zoom=Math.round(zoom*M);
    getElement('zoomrect').style.visibility='hidden';
    getElement('zoomrect').style.display='none';
  }
  if (ACTION=="shift") 
  {
	cx=Math.round(cx-zoom/2+zoom/mapw*(mapw/2-parseInt(getElement('view_div').style.left)));
	cy=Math.round(cy-zoomh/2+zoomh-zoomh/maph*(maph/2-parseInt(getElement('view_div').style.top)));
  }
  SetMap(false);
  SetCursor(ACTION);
}


var i=0

function map1_drag(evnt)
{
  var e,cond;
  e=getEventPos(evnt);
  if(!isDrag) return true;
  if (ACTION=="zoomin" || ACTION=="zoomout") 
  {
    Xpoint = e.x;
    Ypoint = e.y;

    if (Xpoint-ObjPos.x+dx>mapw) Xpoint=mapw+ObjPos.x-dx;
    if (Xpoint-ObjPos.x+dx<0)    Xpoint=ObjPos.x-dx;
    if (Ypoint-ObjPos.y+dy>maph) Ypoint=maph+ObjPos.y-dy;
    if (Ypoint-ObjPos.y+dy<0)    Ypoint=ObjPos.y-dy;

    x1 = (Xpoint-X0point>0) ? (X0point) : (Xpoint);
    x2 = (Xpoint-X0point>0) ? (Xpoint) : (X0point);
    y1 = (Ypoint-Y0point>0) ? (Y0point) : (Ypoint);
    y2 = (Ypoint-Y0point>0) ? (Ypoint) : (Y0point);

    x1+=dx; x2+=dx; y1+=dy; y2+=dy;

    getElement('zoomrect').style.left=x1+'px';
    getElement('zoomrect').style.top=y1+'px';
    getElement('zoomrect').style.width=x2-x1+'px';
	var h=y2-y1;
	if (h==0) h=1;
    getElement('zoomrect').style.height=h+'px';
    getElement('zoomrect').style.visibility='visible';
    getElement('zoomrect').style.display='block';
  }
  if (ACTION=="shift") 
  {
    Xpoint = e.x;
    Ypoint = e.y;
    getElement('view_div').style.left=(Xpoint-X0point)+'px';
    getElement('view_div').style.top=(Ypoint-Y0point)+'px';
  }
  return !isDrag;
}

function getElement(id) 
{
	if(document.getElementById)return document.getElementById(id);
	if(document.all)return document.all(id);
	if(document.layers)return document.layers(id);
}

function SetMap(f)
{
  page=1;
  var s, sm;
  if (zoom>maxzoom) zoom=maxzoom;
  if (zoom<minzoom) zoom=minzoom;
  if (cx>xx+maxzoom/2) cx=Math.round(xx+maxzoom/2);
  if (cx<xx-maxzoom/2) cx=Math.round(xx-maxzoom/2);
  if (cy>yy+maxzoomh) cy=Math.round(yy+maxzoomh);
  if (cy<yy-maxzoomh) cy=Math.round(yy-maxzoomh);
  zoomh=zoom*maph/mapw;
  //s='x='+cx+'&y='+cy+'&zoom='+zoom+'&lay='+lay+'&id='+id+'&label='+label+TrackURL+TypeURL+'&markerx='+markerx+'&markery='+markery+'&w='+mapw+'&h='+maph+'&vis='+vis+bankurl+typeurl+wo+'&page='+page+'&npage='+npage;
  sm='x='+cx+'&y='+cy+'&zoom='+zoom+'&w='+mapw+'&h='+maph;
  document.images["map1"].src = URL+'&'+sm;
  if (!f) ObjectList(GetURL());
}

function VisibilityOnOff(ob,flag)
{
	if (flag)
	{
	 	ob.visibility="visible";
	 	ob.display="block";
	}
	else
	{
	 	ob.visibility="hidden";
	 	ob.display="none";
	}
}

function ObjectList(s)
{
  var Response = "";
  var showFlag=true;
  if (s.indexOf('=objects')>0) showFlag=false;
  if (s.indexOf('type')>0)
  	Response=makeRPCCall('http://'+hostname+'/db/Default.asp?'+s);
  var ol="", ff="";
  if (Response!='')
  {
    var xml=getXMLDoc(Response);
//	var count=xml.getElementsByTagName("count")[0].childNodes[0].nodeValue;
	ol=ObjectListPrint(xml, showFlag);
  }
  else
  {
	for (var i=0; i<npage; i++)
    {
	  var a=getElement(i+'object');
	  a.style.display='none';
	  a.style.visibility='hidden';
    }
  }
}

function ObjectListPrint(xml, flag)
{
	var ol="";
  	var objs=xml.getElementsByTagName("object");
	var str, _id_obj, _name, _type, _address, _url;
	objects=new Array();
  	for (var i=0; i<objs.length; i++)
	{
		var obj = new Object();
		_url='';
		for (var j=0; j<objs[i].childNodes.length; j++)
		{
			str='';
			if (objs[i].childNodes[j].childNodes[0]!=null)
				str=objs[i].childNodes[j].childNodes[0].nodeValue;
			switch (objs[i].childNodes[j].nodeName)
			{
				case "id":    _id_obj = parseInt(str);      break;
				case "name": 	  _name = str; break;
				case "address": 	  _address = str; break;
				case "type":  	  _type = str; break;
				case "x":	  _x = str; break;
				case "y":	  _y = str; break;
				case "url":	  _url = str; break;
			}
		}
	
		obj.id_obj=_id_obj;
		obj.name=_name;
		obj.type=_type;
		obj.address=_address;
		obj.url=_url;
		obj.x=_x;
		obj.y=_y;
		obj.ind=0;
		objects[i]=obj;
	}
	//if (gst.toLowerCase().indexOf('russia')<0) AddIndex();
	for (i=0; i<objects.length; i++)
	{
		if (ShowOBJ && id-objects[i].id_obj==0)
		{
			zoom=1500;
  		    zoomh=zoom*maph/mapw;
			cx=objects[i].x*1;
			cy=objects[i].y*1;
			if (main==0)
			{
				markerx=objects[i].x*1;
				markery=objects[i].y*1;
				if (objects[i].url!='') label='<a onmouseover="markerFlag=true" onmouseout="markerFlag=false" href="'+objects[i].url+'">'+objects[i].address+'</a>';
				else label=objects[i].address;
			}
			ShowOBJ=false;
			SetMap(true);
		}
	}
	for (i=0; i<objects.length; i++)
		SetObject(objects[i], i, 0, 0);
	for (var i=objects.length; i<npage; i++)
    {
	  var a=getElement(i+'object');
	  a.style.display='none';
	  a.style.visibility='hidden';
    }
	return ol;
}

function SetObject(obj, i, dx, dy)
{
	if (i>=npage) return;
	var a=getElement(i+'object');
	a.style.display='block';
	a.style.visibility='visible';
	var scale=zoom/mapw;
    var vx=mapw/2-Math.round((cx-obj.x)/scale)+dx;
    var vy=maph/2+Math.round((cy-obj.y)/scale)+dy;
    var rx=0; ry=0;
	if (objects[i].ind>0)
    {
        rx=radius*Math.cos(objects[i].ind*2*Math.PI/9);
        ry=radius*Math.sin(objects[i].ind*2*Math.PI/9);
        rx=Math.round(rx);
        ry=Math.round(ry);
    }
	a.style.left=vx+rx-pictWhalf+'px';
	a.style.top=vy+ry-pictHhalf+'px';
//	var a=getElement('imobj'+i);
	a.className='minibubble '+obj.type;
//	a.src="../legend/"+obj.type+".png";
}

function DrawObjects()
{
  for (var i=0; i<npage; i++)
  {
	var a=document.createElement("div");
//	a.className='obj';
	a.id=i+'object';
	a.style.top='0px';
	a.style.left='0px';
	a.style.position='absolute';
	a.style.visibility='hidden';
	a.style.display='none';
	a.style.cursor='pointer';

	a.onmouseover=ShowHint2;
	a.onmouseout=CloseHint;
	a.onclick=ShowObj;

	//var h='<img id="imobj'+i+'"/>';
	//a.innerHTML=h;
//	var b=new Image;
//	b.id='imobj'+i;
//	b.className='png';
//	a.appendChild(b);
	a.style.zIndex=npage-i;
	getElement('view_div').appendChild(a);
  }	
}

function AddIndex()
{
	var sss='';
	var scale=(zoom/mapw)*(vacW/2);
    for (var i=1; i<objects.length; i++)
        for (var j=0; j<i; j++)
        {
            if (Math.abs(objects[i].x-objects[j].x)<scale && Math.abs(objects[i].y-objects[j].y)<scale)
                objects[i].ind++;
        }
}

function ShowHint2(e)
{
	var i=parseInt(this.id);
	ShowHint(i);
}

function ShowObj(e)
{
	var i=parseInt(this.id);
	if (main==1)
	{
		if (objects[i].url!='')
		{
			if (parent) parent.location.href=objects[i].url;
			else location.href=objects[i].url;
		}
	}
	else
	{
		markerx=objects[i].x;
		markery=objects[i].y;
		if (objects[i].url!='') label='<a target="_parent" onmouseover="markerFlag=true" onmouseout="markerFlag=false" href="'+objects[i].url+'">'+objects[i].address+'</a>';
		else label=objects[i].address;
		ShowMarker();
	}
}

var currentHint=-1;
function ShowHint(i)
{
	var div=getElement(i+'object');
	div.style.zIndex=1000;
	currentHint=div;
}

function CloseHint(e)
{
	currentHint.style.zIndex=npage-parseInt(currentHint.id);
}

function getScroll()
{
  var dx = document.documentElement.scrollLeft;
  var dy = document.documentElement.scrollTop;
  if (dx==0 && dy==0)
  {
	  dx = document.body.scrollLeft-2;
	  dy = document.body.scrollTop-2;
  }
  dx-=2;
  dy-=2;
  return {x:dx,y:dy}
}

var markerLength=126, markerHeight=114;
function ShowMarker()
{
  ObjPos = getPos(getElement('view_div'));
  var scroll=getScroll();
  dx=scroll.x;
  dy=scroll.y;
  if (label!='' && markerx<cx+zoom/2 && markerx>cx-zoom/2 && markery<cy+zoomh/2 && markery>cy-zoomh/2)
  {
	var scale=zoom/mapw;
    markerscrx=mapw/2-Math.round((cx-markerx)/scale);
    markerscry=maph/2+Math.round((cy-markery)/scale);
	
	markerscry-=pictHhalf;
	if (markerscry>maph/2)
		markerscry-=markerHeight/2;
	if (markerscrx>mapw/2)
		markerscrx-=markerLength+pictWhalf;
	else
		if (markerscrx<=mapw/2)
			markerscrx+=pictWhalf;

  	getElement('marker').style.left=markerscrx+'px';
  	getElement('marker').style.top=markerscry+'px';
  	getElement('marker').style.visibility='visible';
  	getElement('marker').style.display='block';
	getElement('marker_text').innerHTML=label;
  }
  else
  {
   	getElement('marker').style.visibility='hidden';
  	getElement('marker').style.display='none';
  }
}

function cutParam(s,param) 
{
  if(s==null) return null;
  j=s.indexOf(param);
  if(j>-1) 
  {
	s=s.substr(0,j)+s.substr(j+param.length)
  }
  return s;
}

function mapLoad()
{
  getElement('view_div').style.left='0px';
  getElement('view_div').style.top='0px';
  ObjPos = getPos(getElement('view_div'));
  if (location.href.indexOf('print.asp')>0)
  {
  	if (objects.length>1 || objects.length==0) ShowMarker();
	else CloseMarker();
  }
  else
	ShowMarker();
  if (location.href.indexOf('print.asp')>0) return;
  SetCursor(ACTION);
    waitnext_scroll = false;
}

function getParam(s,param,delim) {
    if (s==null) return null;

    var params=s.split(delim);
    for(j=0;j<params.length;j++) {
      var v=params[j];
      var pos=v.indexOf(param+'=');
      if(pos!=0) continue;

      v=v.substring(param.length+1);
      if(v.length==0) return null;
      return unescape(v);
    }
    return null;
}

function GetURL()
{
	//var s='x='+cx+'&y='+cy+'&zoom='+zoom+'&lay='+lay+'&id='+id+'&label='+strEncode(label)+TrackURL+TypeURL+'&markerx='+markerx+'&markery='+markery+'&w='+mapw+'&h='+maph+'&vis='+vis+bankurl+typeurl+wo+'&page='+page+'&npage='+npage+'&address='+address;
	var s='x='+cx+'&y='+cy+'&zoom='+zoom+'&lay='+lay+'&id='+id+TypeURL+'&w='+mapw+'&h='+maph+typeurl+'&gst='+gst;
	return s;
}

function strEncode(s) 
{
    var res='',c,c0='À'.charCodeAt(0);
    for(j=0;j<s.length;j++) {
      c=s.charCodeAt(j);
	  if (s.charAt(j)=='¹')
	  	res=res+'%B9';
	  else
	  {
	  	if (s.charAt(j)=='¸')
	  	 res=res+'%B8';
		else
		{
	      if (c>=c0) {
    	    c=c-c0+192;
        	res=res+'%'+c.toString(16);
	      }
    	  else
        	res=res+escape(s.charAt(j));
		}
	  }
    }

    return res;
}
  
function makeRPCCall(url){
    var httpReq = false;
    if (typeof XMLHttpRequest!='undefined') {
        httpReq = new XMLHttpRequest();
    } else {
        try {
            httpReq = new ActiveXObject("Msxml2.XMLHTTP.4.0");
        } catch (e) {
            try {
                httpReq = new ActiveXObject("Msxml2.XMLHTTP");
            } catch (ee) {
                try {
                    httpReq = new ActiveXObject("Microsoft.XMLHTTP");
                } catch (eee) {
                    httpReq = false;
                }
            }
        }
    }
    httpReq.open("GET", url, false);
	httpReq.setRequestHeader('Content-Type', 'text/xml');
	httpReq.send(null);
	if (httpReq.status == 200) {return httpReq.responseText;} else
	{
		if (httpReq.status == 500) alert("Server Exception: "+httpReq.status);
		return httpReq.status;
	}
  }

  // Get XML Parser for this browser
function getXMLDoc(xmldata){
	var xmlDoc = false;
	// Internet Explorer
	if (window.ActiveXObject)
	{
		xmlDoc = new ActiveXObject("Microsoft.XMLDOM"); //new ActiveXObject("Msxml­2.DOMDocument.3.0");+
		xmlDoc.loadXML(xmldata);
		if (xmlDoc.parseError.errorCode)
		{
			alert('IE XML ERROR: '+xmlDoc.parseError.reason+' ('+xmlDoc.parseError.errorCode+')');
			return false;
		};
		return xmlDoc;
	}
	// Mozilla, Opera
	if (document.implementation && document.implementation.createDocument)
	{
		// xmlDoc = document.implementation.createDocument("","",null);
		var parser = new DOMParser();
		xmlDoc = parser.parseFromString(xmldata, "text/xml");
		return xmlDoc;
	};
	alert('Your browser cannot handle this script!');
    return false;
}

function tl() {	cx-=Math.round(zoomh/4);cy+=Math.round(zoomh/4);SetMap(false);}
function t() {	cy+=Math.round(zoomh/2);SetMap(false);}
function tr() {	cx+=Math.round(zoomh/4);cy+=Math.round(zoomh/4);SetMap(false);}
function l() {	cx-=Math.round(zoomh/2);SetMap(false);}
function r() {	cx+=Math.round(zoomh/2);SetMap(false);}
function bl() {	cx-=Math.round(zoomh/4);cy-=Math.round(zoomh/4);SetMap(false);}
function b() {	cy-=Math.round(zoomh/2);SetMap(false);}
function br() {	cx+=Math.round(zoomh/4);cy-=Math.round(zoomh/4);SetMap(false);}

function CreateTypeURL(n1,n2,p)
{
	var t='';
	for (var i=n1; i<=n2; i++)
	{
		var ch=getElement('ch'+i);
		if (ch.checked)
			t+='&type='+p+'_'+ch.value;
	}
	typeurl=t;
}

function countSize()
{
	var t=getPos(getElement("pixel")).x-mapw-getPos(getElement("plus")).x;
	if (mapw==wbig) t-=50;
	getElement("view_container").style.left=(t)/2+'px';
}

function addHandler(object, event, handler, useCapture) {
	if (object.addEventListener) {
		object.addEventListener(event, handler, useCapture ? useCapture : false);
	} else if (object.attachEvent) {
		object.attachEvent('on' + event, handler);
	} else alert("Add handler is not supported");
}

function wOpen(str,u,flag,w,h)
{
  var sname='../'+str+'.asp?'+GetURL();
  if (flag) sname+='&name='+new Date().getTime();
  var s='resizable=yes,scrollbars=yes,menubar=yes';
  if (w>0 && h>0) s+=',width='+w+',height='+h;
  window.open(sname,str,s);
}

function GetPrintURL(f)
{
	var s='';
	for (i=0; i<objects.length; i++)
		if (objects[i].id>-1)
		{
			s+="&px="+objects[i].x+"&py="+objects[i].y;
			if (f) s+="&pn="+strEncode(objects[i].name)+"&pc="+strEncode(objects[i].comment);
		}
	return s+'&lang='+lang;
}
