
/*******************************************
********************************************
    * www.resident.ru * www.eatlas.ru *
Remote API Web Map Service javascript client
		    * Milok Zbrozek *
		milokz [doggy] gmail.com
		    * ZAO Resident *
   			   AJAX
********************************************
*******************************************/
<!--

// Create Class
function WMSClient(){
  this.hurl = "";
  this.request = "";
  this.response = "";
  return this;
}

// SetUrl
WMSClient.prototype.setUrl = function(url){
  this.hurl = url;
}

/***
**** METHODS
***/

// WebMethod wms.Version
WMSClient.prototype.Version = function(){ // return: string
    var msg = new XMLRPCMessage();
    msg.setMethod("wm.Version");
	this.request = msg.xml();

	this.response = makeRPCCall(this.hurl,this.request);
	var xmldata = this.response;
	var ff = CheckFault(xmldata);
	if (ff.error) return ff;
    return getXMLDoc(xmldata).getElementsByTagName("i4")[0].childNodes[0].nodeValue;
}

// WebMethod wm.Hello
WMSClient.prototype.Hello = function(MyName /*string*/){ // return: string
    var msg = new XMLRPCMessage();
    msg.setMethod("wm.Hello");
    msg.addParameter(MyName);
	this.request = msg.xml();

	this.response = makeRPCCall(this.hurl,this.request);
	var xmldata = this.response;
	var ff = CheckFault(xmldata);
	if (ff.error) return ff;
    return getXMLDoc(xmldata).getElementsByTagName("string")[0].childNodes[0].nodeValue;
}

// WebMethod wm.GetAddressFromId
WMSClient.prototype.GetAddressFromId = function(mapName /*string*/,layer_name /*string*/,house_id /*int*/){ // return: string
    var msg = new XMLRPCMessage();
    msg.setMethod("wm.GetAddressFromId");
    msg.addParameter(mapName);
	msg.addParameter(layer_name);
	msg.addParameter(house_id);
	this.request = msg.xml();

	this.response = makeRPCCall(this.hurl,this.request);
	var xmldata = this.response;
	var ff = CheckFault(xmldata);
	if (ff.error) return ff;
    return getXMLDoc(xmldata).getElementsByTagName("string")[0].childNodes[0].nodeValue;
}

// WebMethod wm.GetShortIDUrl
WMSClient.prototype.GetShortIDUrl = function(id /*string*/){ // return: string
    var msg = new XMLRPCMessage();
    msg.setMethod("wm.GetShortIDUrl");
    msg.addParameter(id);
	this.request = msg.xml();

	this.response = makeRPCCall(this.hurl,this.request);
	var xmldata = this.response;
	var ff = CheckFault(xmldata);
	if (ff.error) return ff;
    return getXMLDoc(xmldata).getElementsByTagName("string")[0].childNodes[0].nodeValue;
}

// WebMethod wm.GetShortUrlID
WMSClient.prototype.GetShortUrlID = function(url /*string*/){ // return: string
    var msg = new XMLRPCMessage();
    msg.setMethod("wm.GetShortUrlID");
    msg.addParameter(url);
	this.request = msg.xml();
	this.response = makeRPCCall(this.hurl,this.request);
	var xmldata = this.response;
	var ff = CheckFault(xmldata);
	if (ff.error) return ff;
    return getXMLDoc(xmldata).getElementsByTagName("string")[0].childNodes[0].nodeValue;
}

// WebMethod wm.GetPict
// WebMethod wm.GetPict.byUser
WMSClient.prototype.GetPict = function(mapName /*string*/,ZoomPnt /*sZoomPnt*/,PictSize /*sPictSize*/,layermask /*string*/, layers_ext /*array of int*/,ShowObj  /*sShowObj*/,ShowSign /*sShowSigned*/, byUser /*int*/){ // return string
    var msg = new XMLRPCMessage();
    if (byUser) msg.setMethod("wm.GetPict.byUser"); else msg.setMethod("wm.GetPict");
    msg.addParameter(mapName);
	msg.addParameter(ZoomPnt);
//	ZoomPnt.center_x = parseInt(ZoomPnt.center_x);
//	ZoomPnt.center_y = parseInt(ZoomPnt.center_y);
	msg.addParameter(PictSize);
	msg.addParameter(layermask);
	msg.addParameter(layers_ext);
	msg.addParameter(ShowObj);
	msg.addParameter(ShowSign);
	if (byUser) msg.addParameter(byUser);
	this.request = msg.xml();
	this.response = makeRPCCall(this.hurl,this.request);
	var xmldata = this.response;
	/*
	var ff = CheckFault(xmldata);
	if (ff.error) return ff;

	var url = getXMLDoc(xmldata).getElementsByTagName("string")[0].childNodes[0].nodeValue;
	while(url.indexOf("&amp;") > 0)
	{
		var str = url.substr(0,url.indexOf("&amp;")) + "&";
		str = str + url.substr(url.indexOf("&amp;")+5,url.length);
		url = str;
	};
    return url;
	*/
	var ff = CheckFault(xmldata);
	if (ff.error) return ff;

	var res = new Object();
	var nodes = getXMLDoc(xmldata).getElementsByTagName("member");
	for(x=0;x<nodes.length;x++)
	{
			var CN = 0;
			var CV = 1;
			if (document.implementation && document.implementation.createDocument) { CN = 1; CV = 3; };
			if(nodes[x].childNodes[CN].nodeName == 'name')
			{
				var str = nodes[x].childNodes[CV].childNodes[CN].childNodes[0].nodeValue;
				switch(nodes[x].childNodes[CN].childNodes[0].nodeValue)
				{
					case "center_x": res.center_x = parseInt(str); break;
					case "center_y": res.center_y = parseInt(str); break;
					case "markerx": res.markerx = parseInt(str); break;
					case "markery": res.markery = parseInt(str); break;
					case "zoom": res.zoom = parseInt(str); break;
					case "mapw": res.mapw = parseInt(str); break;
					case "maph": res.maph = parseInt(str); break;
					case "url": res.url = str; break;
				};
			};
	};
	return res;
}


	// структура
function sRetGetPict(center_x  /*int*/, center_y  /*int*/, zoom  /*int*/, mapw /*int*/, maph  /*int*/, url  /*string*/){
  this.center_x = center_x;
  this.center_y = center_y;
  this.zoom = zoom;
  this.mapw = mapw;
  this.maph = maph;
  this.url = url;
  return this;
}


	// структура
function sZoomPnt(x /*int*/,y /*int*/,zoom /*int*/){
  this.center_x = x; // integer
  this.center_y = y; // integer
  this.zoom = zoom; // integer
  this.squared = false;
  this.sqzoom = 0;
  return this;
}

	// структура
function sPictSize(w /*int*/,h /*int*/){
  this.width = w; //integer
  this.height = h; // integer
  return this;
}

	// структура
function sShowObj(layer /*string*/,id  /*int*/, showlabel /*bool*/,label /*string or space*/, cathegory /* string */){
   this.layer = layer; // string
   this.id = id;       // int
   this.showlabel = (showlabel) ? showlabel : false;
   this.label = (label) ? label : "";; // string // если не выводить - пробел
   this.cathegory = (cathegory) ? cathegory : "";
   return this;
}

	// структура
function sShowSigned(x /*int*/,y /*int*/,label /*string or space*/){
  this.x = x; // integer
  this.y = y; // integer
  this.label = label; // string // если не выводить - пробел
  return this;
}

// WebMethod wm.Request.MapInfo
WMSClient.prototype.RequestMapInfo = function(mapName /*string*/){  // return sMapInfo
    var msg = new XMLRPCMessage();
    msg.setMethod("wm.Request.MapInfo");
    msg.addParameter(mapName);
	this.request = msg.xml();
	this.response = makeRPCCall(this.hurl,this.request);
	var xmldata = this.response;

	var ff = CheckFault(xmldata);
	if (ff.error) return ff;

	var res = new Object();
	var nodes = getXMLDoc(xmldata).getElementsByTagName("member");
	for(x=0;x<nodes.length;x++)
	{
	   var CN = 0;
	   var CV = 1;
	   if (document.implementation && document.implementation.createDocument) { CN = 1; CV = 3; };
       if(nodes[x].childNodes[CN].nodeName == 'name')
	   {
	        var str = "";
			if(nodes[x].childNodes[CV].childNodes[CN].childNodes.length > 0) str = nodes[x].childNodes[CV].childNodes[CN].childNodes[0].nodeValue;
			switch (nodes[x].childNodes[CN].childNodes[0].nodeValue)
			{
				case "name":      res.name = str;      break;
				case "copyright": res.copyright = str; break;
				case "center_x":  res.center_x = parseInt(str); break;
				case "center_y":  res.center_y = parseInt(str); break;
				case "zoom":      res.zoom     = parseInt(str); break;
				case "zoom_min":  res.zoom_min = parseInt(str); break;
				case "zoom_max":  res.zoom_max = parseInt(str); break;
				case "zoom_sizes": 
				{
					res.zoom_sizes = new Array();
					var cnode = nodes[x].childNodes[CV].getElementsByTagName("i4");
					for(i=0;i<cnode.length;i++) res.zoom_sizes[i] = parseInt(cnode[i].childNodes[0].nodeValue);
				};
				break;
			};
	   };

	}
    return res;
}

	// структура
function sMapInfo(name /*string*/,copyright /*string*/,x /*int*/,y /*int*/,zoom /*int*/,minzoom /*int*/,maxzoom /*int*/){
   this.name = name; // string
   this.copyright = copyright; // string
   this.center_x = x; // integer
   this.center_y = y; // integer
   this.zoom = zoom; // integer
   this.zoom_min = minzoom; // integer
   this.zoom_max = maxzoom; // integer
   return this;
}

// WebMethod wm.Request.NearestObjects
WMSClient.prototype.RequestNearestObjects = function(mapName /*string*/,layer_name /*array of string*/,x /*int*/,y /*int*/,rad /*int*/,maxcount /*int*/){ // array of SearchGlb
	var msg = new XMLRPCMessage();
    msg.setMethod("wm.Request.NearestObjects");
    msg.addParameter(mapName);
	msg.addParameter(layer_name);
	msg.addParameter(x);
	msg.addParameter(y);
	msg.addParameter(rad);
	msg.addParameter(maxcount);
	this.request = msg.xml();
	this.response = makeRPCCall(this.hurl,this.request);
	var xmldata = this.response;

	return ParseSearchGlobal(xmldata);
}

// WebMethod wm.Request.ExtNearestObjectsQuick
// WebMethod wm.Request.ExtNearestObjectsQuick.byUser
WMSClient.prototype.RequestExtNearestObjectsQuick = function(mapName /*string*/,extlayers  /*array of int*/,x /*int*/,y /*int*/,rad /*int*/, byUser /*int*/){ // array of SearchGlb
	var msg = new XMLRPCMessage();
    if(byUser) msg.setMethod("wm.Request.ExtNearestObjectsQuick.byUser"); else msg.setMethod("wm.Request.ExtNearestObjectsQuick");
    msg.addParameter(mapName);
	msg.addParameter(extlayers );
	msg.addParameter(x);
	msg.addParameter(y);
	msg.addParameter(rad);
	if(byUser) msg.addParameter(byUser);
	this.request = msg.xml();
	this.response = makeRPCCall(this.hurl,this.request);
	var xmldata = this.response;

	return ParseSearchGlobal(xmldata);
}

// WebMethod wm.Request.ExtNearestObjects
// WebMethod wm.Request.ExtNearestObjects.byUser
WMSClient.prototype.RequestExtNearestObjects = function(mapName /*string*/,extlayers  /*array of int*/,x /*int*/,y /*int*/,rad /*int*/, maxcount /*int*/, byUser /*int*/){ // array of SearchGlb
	var msg = new XMLRPCMessage();
    if(byUser) msg.setMethod("wm.Request.ExtNearestObjects.byUser"); else msg.setMethod("wm.Request.ExtNearestObjects");
    msg.addParameter(mapName);
	msg.addParameter(extlayers );
	msg.addParameter(x);
	msg.addParameter(y);
	msg.addParameter(rad);
	msg.addParameter(maxcount);
	if(byUser) msg.addParameter(byUser);
	this.request = msg.xml();
	this.response = makeRPCCall(this.hurl,this.request);
	var xmldata = this.response;

	return ParseSearchGlobal(xmldata);
}

// WebMethod wm.Request.ExtNearestObjsMask
// WebMethod wm.Request.ExtNearestObjsMask.byUser
WMSClient.prototype.RequestExtNearestObjsMask = function(mapName /*string*/,layer_mask  /*string*/,x /*int*/,y /*int*/,rad /*int*/, byUser /*int*/){ // array of SearchGlb
	var msg = new XMLRPCMessage();
    if(byUser) msg.setMethod("wm.Request.ExtNearestObjsMask"); else msg.setMethod("wm.Request.ExtNearestObjsMask");
    msg.addParameter(mapName);
	msg.addParameter(layer_mask);
	msg.addParameter(x);
	msg.addParameter(y);
	msg.addParameter(rad);
	if(byUser) msg.addParameter(byUser);
	this.request = msg.xml();
	this.response = makeRPCCall(this.hurl,this.request);
	var xmldata = this.response;

	return ParseSearchGlobal(xmldata);
}

<!-- /* code by Milo[k] (milokz [doggy] gmail.com) */ --> 

// WebMethod wm.Traffic.Nearest
WMSClient.prototype.TrafficNearest = function(mapName /*string*/,layTrafficName /*string*/,fieldTrafficName /*string*/,typs /*aray of int*/,x /*int*/,y /*int*/,maxcount /*int*/){ // array of SearchGlb
	var msg = new XMLRPCMessage();
    msg.setMethod("wm.Traffic.Nearest");
    msg.addParameter(mapName);
	msg.addParameter(layTrafficName);
	msg.addParameter(fieldTrafficName);
	msg.addParameter(typs);
	msg.addParameter(x);
	msg.addParameter(y);
	msg.addParameter(maxcount);
	this.request = msg.xml();
	this.response = makeRPCCall(this.hurl,this.request);
	var xmldata = this.response;

	return ParseSearchGlobal(xmldata);
}

// WebMethod wm.Traffic.MemPermanent
WMSClient.prototype.MemPermanent = function(mapName /*string*/,layTrafficName /*string*/){ // return: bool
    var msg = new XMLRPCMessage();
    msg.setMethod("wm.Traffic.MemPermanent");
    msg.addParameter(mapName);
	msg.addParameter(layTrafficName);
	this.request = msg.xml();

	this.response = makeRPCCall(this.hurl,this.request);
	var xmldata = this.response;
	var ff = CheckFault(xmldata);
	if (ff.error) return ff;
    return getXMLDoc(xmldata).getElementsByTagName("boolean")[0].childNodes[0].nodeValue == 1;
}

// WebMethod wm.Street.OrderByID
WMSClient.prototype.StreetOrderByID = function(mapName /*string*/,layer_name /*string*/,street_id /*int*/){ // return: array of SearchGlb
    var msg = new XMLRPCMessage();
    msg.setMethod("wm.Street.OrderByID");
    msg.addParameter(mapName);
	msg.addParameter(layer_name);
	msg.addParameter(street_id);
	this.request = msg.xml();

	this.response = makeRPCCall(this.hurl,this.request);
	var xmldata = this.response;

	return ParseSearchGlobal(xmldata);
}

// WebMethod wm.Request.ObjectInfoLang
WMSClient.prototype.RequestObjectInfoLang = function(mapName /*string*/,xpos /*int*/,ypos /*int*/, lang /*string*/){ // return: string
    var msg = new XMLRPCMessage();
    msg.setMethod("wm.Request.ObjectInfoLang");
    msg.addParameter(mapName);
	msg.addParameter(xpos);
	msg.addParameter(ypos);
	msg.addParameter(lang);
	this.request = msg.xml();

	this.response = makeRPCCall(this.hurl,this.request);
	var xmldata = this.response;
	var ff = CheckFault(xmldata);
	if (ff.error) return ff;
    return getXMLDoc(xmldata).getElementsByTagName("string")[0].childNodes[0].nodeValue;
}

//
function ParseSearchGlobal(xmldata){
//ReplaceString(ReplaceString(str,"'","&#x27;"),'"','&quot;');
alert("Yahoo!!!");
	var ff = CheckFault(xmldata);
	if (ff.error) return ff;

	var res = new Array();
	var nodes = getXMLDoc(xmldata).getElementsByTagName("data")[0].childNodes;
	var cc_v = 0;
	for(x=0;x<nodes.length;x++)
	{
		if(nodes[x].nodeName != "#text")
		{
		res[cc_v] = new Object();
		var CN = 0;
		var CV = 1;
		if (window.ActiveXObject)
		{
			var nodes2 = nodes[x].getElementsByTagName("member");
		};
		if (document.implementation && document.implementation.createDocument)
		{
			var nodes2 = getElementsByTagName2(nodes[x],"member");
			CN = 1; CV = 3;
		};
		for(y=0;y<nodes2.length;y++)
		{
			if(nodes2[y].childNodes[CN].nodeName == 'name')
			{
			    var str = "";
			    try
				{
				   str = nodes2[y].childNodes[CV].childNodes[CN].childNodes[0].nodeValue;
				} catch (e) {};
				switch(nodes2[y].childNodes[CN].childNodes[0].nodeValue)
				{
					case "cathegory": res[cc_v].cathegory = str; break;
					case "layer_num": res[cc_v].layer_num = parseInt(str); break;
					case "layer_name": res[cc_v].layer_name = str; break;
					case "object_id": res[cc_v].object_id = parseInt(str); break;
					case "object_name": res[cc_v].object_name = str; break;
					case "object_fullname": res[cc_v].object_fullname = str; break;
					case "zoom_point": res[cc_v].zoom_point = new Object();
					  if (window.ActiveXObject) var nds = nodes2[y].childNodes[CV].childNodes[CN].getElementsByTagName("member");
					  if (document.implementation && document.implementation.createDocument) var nds = getElementsByTagName2(nodes2[y].childNodes[CV].childNodes[CN],"member");
					  for(z=0;z<nds.length;z++)
					  {
						if(nds[z].childNodes[CN].nodeName == 'name')
						{
							var str2 = nds[z].childNodes[CV].childNodes[CN].childNodes[0].nodeValue;
							switch(nds[z].childNodes[CN].childNodes[0].nodeValue)
							{
								case "center_x": res[cc_v].zoom_point.center_x = parseInt(str2); break;
								case "center_y": res[cc_v].zoom_point.center_y = parseInt(str2); break;
								case "zoom":     res[cc_v].zoom_point.zoom     = parseInt(str2); break;
							};
						};
					  };
					break;
					case "street": res[cc_v].street = parseInt(str); break;
					case "mapName": res[cc_v].mapName = str; break;
				};
			};
		};
		cc_v++;
		};
	};
	return res;
}

// WebMethod wm.Request.UserLayers
WMSClient.prototype.RequestUserLayers = function(mapName /*string*/){ // return array of sUserLayer
    var msg = new XMLRPCMessage();
    msg.setMethod("wm.Request.UserLayers");
    msg.addParameter(mapName);
	this.request = msg.xml();
	this.response = makeRPCCall(this.hurl,this.request);
	var xmldata = this.response;

	var ff = CheckFault(xmldata);
	if (ff.error) return ff;

	var res = new Array();
	var nodes = getXMLDoc(xmldata).getElementsByTagName("data")[0].childNodes;
	var cc_v = 0;
	for(x=0;x<nodes.length;x++)
	{
	    if(nodes[x].nodeName != "#text"){
	    res[cc_v] = new Object();
		var CN = 0;
		var CV = 1;
		if (window.ActiveXObject)
		{
			var nodes2 = nodes[x].getElementsByTagName("member");
		};
		if (document.implementation && document.implementation.createDocument)
		{
			var nodes2 = getElementsByTagName2(nodes[x],"member");
			CN = 1; CV = 3;
		};
		for(y=0;y<nodes2.length;y++)
		{
			if(nodes2[y].childNodes[CN].nodeName == 'name')
			{
			    var str = "";
				try
				{
					var str = nodes2[y].childNodes[CV].childNodes[CN].childNodes[0].nodeValue;
				} catch (e) {};
				switch(nodes2[y].childNodes[CN].childNodes[0].nodeValue)
				{
					case "external": res[cc_v].external = str == "1"; break;
					case "table_name": res[cc_v].table_name = str; break;
					case "layer_name": res[cc_v].layer_name = str; break;
					case "layer_id": res[cc_v].layer_id = parseInt(str); break;
					case "layer_group": res[cc_v].layer_group = str; break;
					case "layer_visible": res[cc_v].layer_visible = str == "1" ; break;
					case "image_name": res[cc_v].image_name = str;
				};
			};
		};
		cc_v++;
		}; // #text
	};
		alert(res[0].table_name);
	if (nodes.length > 0) return res;
	return 0;
}

// test for FF -->  Content-type: text/xml
function legend_From_File(filename)
{
	var xmlDoc;
		if(ie)
		{
			xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
			xmlDoc.async="false";
			xmlDoc.load(filename);
		} 
		else if(ns)
		{
			myXMLHTTPRequest = new XMLHttpRequest();
			myXMLHTTPRequest.open("GET", filename, false);
			myXMLHTTPRequest.send(null);
			xmlDoc = myXMLHTTPRequest.responseXML;
		}
		else
		{
			xmlDoc = getXMLDoc(getXMLfile(filename));
		};
	var res = new Array();
		var nodes = xmlDoc.getElementsByTagName("data")[0].childNodes;
	var cc_v = 0;
	for(x=0;x<nodes.length;x++)
	{
	    if(nodes[x].nodeName != "#text"){
	    res[cc_v] = new Object();
		var CN = 0;
		var CV = 1;
		if (window.ActiveXObject)
		{
			var nodes2 = nodes[x].getElementsByTagName("member");
		};
		if (document.implementation && document.implementation.createDocument)
		{
			var nodes2 = getElementsByTagName2(nodes[x],"member");
			CN = 1; CV = 3;
		};
		for(y=0;y<nodes2.length;y++)
		{
			if(nodes2[y].childNodes[CN].nodeName == 'name')
			{
			    var str = "";
				try
				{
					var str = nodes2[y].childNodes[CV].childNodes[CN].childNodes[0].nodeValue;
				} catch (e) {};
				switch(nodes2[y].childNodes[CN].childNodes[0].nodeValue)
				{
					case "external": res[cc_v].external = str == "1"; break;
					case "table_name": res[cc_v].table_name = str; break;
					case "layer_name": res[cc_v].layer_name = str; break;
					case "layer_id": res[cc_v].layer_id = parseInt(str); break;
					case "layer_group": res[cc_v].layer_group = str; break;
					case "layer_visible": res[cc_v].layer_visible = str == "1" ; break;
					case "image_name": res[cc_v].image_name = str;
				};
			};
		};
		cc_v++;
		}; // #text
	};
	if (nodes.length > 0) return res;
	return 0;
};


// WebMethod wm.Request.UserLayers.byUser
// WebMethod wm.Request.UserLayers.byUser.byUser
WMSClient.prototype.RequestUserLayersByUser = function(mapName /*string*/, cUserID /*int*/){ // return array of sUserLayer
    var msg = new XMLRPCMessage();
    msg.setMethod("wm.Request.UserLayers.byUser");
    msg.addParameter(mapName);
	msg.addParameter(cUserID);
	this.request = msg.xml();
	this.response = makeRPCCall(this.hurl,this.request);
	var xmldata = this.response;

	var ff = CheckFault(xmldata);
	if (ff.error) return ff;

	var res = new Array();
	var nodes = getXMLDoc(xmldata).getElementsByTagName("data")[0].childNodes;
	var cc_v = 0;
	for(x=0;x<nodes.length;x++)
	{
	    if(nodes[x].nodeName != "#text"){
	    res[cc_v] = new Object();
		var CN = 0;
		var CV = 1;
		if (window.ActiveXObject)
		{
			var nodes2 = nodes[x].getElementsByTagName("member");
		};
		if (document.implementation && document.implementation.createDocument)
		{
			var nodes2 = getElementsByTagName2(nodes[x],"member");
			CN = 1; CV = 3;
		};
		for(y=0;y<nodes2.length;y++)
		{
			if(nodes2[y].childNodes[CN].nodeName == 'name')
			{
			    var str = "";
				try
				{
					var str = nodes2[y].childNodes[CV].childNodes[CN].childNodes[0].nodeValue;
				} catch (e) {};
				switch(nodes2[y].childNodes[CN].childNodes[0].nodeValue)
				{
					case "external": res[cc_v].external = str == "1"; break;
					case "table_name": res[cc_v].table_name = str; break;
					case "layer_name": res[cc_v].layer_name = str; break;
					case "layer_id": res[cc_v].layer_id = parseInt(str); break;
					case "layer_group": res[cc_v].layer_group = str; break;
					case "layer_visible": res[cc_v].layer_visible = str == "1" ; break;
					case "image_name": res[cc_v].image_name = str;
				};
			};
		};
		cc_v++;
		}; // #text
	};
	if (nodes.length > 0) return res;
	return 0;
}

	// структура
function sUserLayer(external /*boolean*/,table /*string*/,layer /*string*/,id /*int*/,group /*string*/,visible /*boolean*/,image_name /*string*/){
	this.external	   = external; // boolean
	this.table_name    = table; // string
	this.layer_name    = layer; // string
	this.layer_id      = id; // integer
	this.layer_group   = group; // string
	this.layer_visible = visible; // boolean
	this.image_name    = image_name; // string 
	return this;
}

// WebMethod wm.Request.ZoomPoint
WMSClient.prototype.RequestZoomPoint = function (mapName /*string*/, layer_name /*string*/, obj_id /*int*/){ // return sZoomPnt
	var msg = new XMLRPCMessage();
    msg.setMethod("wm.Request.ZoomPoint");
	msg.addParameter(mapName);
    msg.addParameter(layer_name);
	msg.addParameter(obj_id);
	this.request = msg.xml();
	this.response = makeRPCCall(this.hurl,this.request);
	var xmldata = this.response;

	return ParseZoomPntRes(xmldata);
}

// WebMethod wm.GetLatLonXYPoint
WMSClient.prototype.GetLatLonXYPoint = function (mapName /*string*/, lat /*double*/, lon /*double*/){ // return sZoomPnt
	var msg = new XMLRPCMessage();
    msg.setMethod("wm.GetLatLonXYPoint");
	msg.addParameter(mapName);
    msg.addParameter(lat);
	msg.addParameter(lon);
	this.request = msg.xml();
	this.response = makeRPCCall(this.hurl,this.request);
	var xmldata = this.response;

	return ParseZoomPntRes(xmldata);
}

// Parse
function ParseZoomPntRes(xmldata)
{
	var ff = CheckFault(xmldata);
	if (ff.error) return ff;

	var res = new Object();
	var nodes = getXMLDoc(xmldata).getElementsByTagName("member");
	for(x=0;x<nodes.length;x++)
	{
			var CN = 0;
			var CV = 1;
			if (document.implementation && document.implementation.createDocument) { CN = 1; CV = 3; };
			if(nodes[x].childNodes[CN].nodeName == 'name')
			{
				var str = nodes[x].childNodes[CV].childNodes[CN].childNodes[0].nodeValue;
				switch(nodes[x].childNodes[CN].childNodes[0].nodeValue)
				{
					case "center_x": res.center_x = parseInt(str); break;
					case "center_y": res.center_y = parseInt(str); break;
					case "zoom": res.zoom = parseInt(str); break;
					
					case "squared": res.squared = parseInt(str) == 1; break;
					case "sqzoom": res.sqzoom = parseInt(str); break;
				};
			};
	};
	return res;
}

// WebMethod wm.GetXYLatLonPoint
WMSClient.prototype.GetXYLatLonPoint = function (mapName /*string*/, x /*int*/, y /*int*/){ // return array 0..1 of double; 0 - lat, 1 - lon
	var msg = new XMLRPCMessage();
    msg.setMethod("wm.GetXYLatLonPoint");
	msg.addParameter(mapName);
    msg.addParameter(x);
	msg.addParameter(y);
	this.request = msg.xml();
	this.response = makeRPCCall(this.hurl,this.request);
	var xmldata = this.response;
	var ff = CheckFault(xmldata);
	if (ff.error) return ff;

	var res = new Array();
	var nodes = getXMLDoc(xmldata).getElementsByTagName("double");
	for(x=0;x<nodes.length;x++)
	{
		res[x] = nodes[x].childNodes[0].nodeValue;
	};
	if (nodes.length > 0) return res;
	return res;
}

// WebMethod wm.Request.ZoomPoints
WMSClient.prototype.RequestZoomPoints = function (mapName /*string*/, layer_names /*array of string*/, obj_ids /*array if int*/){ // return array of ReqZoomPoint
	var msg = new XMLRPCMessage();
    msg.setMethod("wm.Request.ZoomPoints");
	msg.addParameter(mapName);
    msg.addParameter(layer_names);
	msg.addParameter(obj_ids);
	this.request = msg.xml();
	this.response = makeRPCCall(this.hurl,this.request);
	var xmldata = this.response;

	var ff = CheckFault(xmldata);
	if (ff.error) return ff;

	var res = new Array();
	if(getXMLDoc(xmldata).getElementsByTagName("data")[0].childNodes.length == 0) return 0;

	var nodes = getXMLDoc(xmldata).getElementsByTagName("data")[0].childNodes;
	var cc_v = 0;
	for(x=0;x<nodes.length;x++)
	{
		if(nodes[x].nodeName != "#text")
		{
		res[cc_v] = new Object();
		var CN = 0;
		var CV = 1;
		if (window.ActiveXObject)
		{
			var nodes2 = nodes[x].getElementsByTagName("member");
		};
		if (document.implementation && document.implementation.createDocument)
		{
			var nodes2 = getElementsByTagName2(nodes[x],"member");
			CN = 1; CV = 3;
		};
		for(y=0;y<nodes2.length;y++)
		{
			if(nodes2[y].childNodes[CN].nodeName == 'name')
			{
				var nd = nodes2[y].childNodes[CV].childNodes[CN].childNodes[0].nodeValue;
				switch(nodes2[y].childNodes[CN].childNodes[0].nodeValue)
				{
					case "layer_name": res[cc_v].layer_name  = nd; break;
					case "object_id": res[cc_v].object_id  = nd;	break;
					case "zoompnt":
					    res[cc_v].zoompnt = new Object();
						if (window.ActiveXObject)
							var nodes3 = nodes2[y].childNodes[CV].getElementsByTagName("member");
						if (document.implementation && document.implementation.createDocument)
							var nodes3 = getElementsByTagName2(nodes2[y].childNodes[CV],"member");
						for(z=0;z<nodes3.length;z++)
						{
							if(nodes3[z].childNodes[CN].nodeName == 'name')
							{
								var str3 = nodes3[z].childNodes[CV].childNodes[CN].childNodes[0].nodeValue;
								switch(nodes3[z].childNodes[CN].childNodes[0].nodeValue)
								{
									case "center_x": res[cc_v].zoompnt.center_x = parseInt(str3); break;
									case "center_y": res[cc_v].zoompnt.center_y = parseInt(str3); break;
									case "zoom": res[cc_v].zoompnt.zoom = parseInt(str3); break;
								};
							};
						};
					break;
				};
			};
		};
		cc_v++;
		}; // #text
	};
    return res;
}

	// структура
function ReqZoomPoint(layer_name /*string*/,object_id /*int*/, zoompnt /*ZoomPoint*/){
	this.layer_name = layer_name;
	this.object_id = object_id;
	this.zoompnt = zoompnt;
	return this;
}

// WebMethod wm.Request.LayerNum
WMSClient.prototype.RequestLayerNum = function (mapName /*string*/, layer_names /*array of string*/){ // return array of int
	var msg = new XMLRPCMessage();
    msg.setMethod("wm.Request.LayerNum");
	msg.addParameter(mapName);
    msg.addParameter(layer_names);
	this.request = msg.xml();
	this.response = makeRPCCall(this.hurl,this.request);
	var xmldata = this.response;

	var ff = CheckFault(xmldata);
	if (ff.error) return ff;

	var res = new Array();
	var nodes = getXMLDoc(xmldata).getElementsByTagName("i4");
	for(x=0;x<nodes.length;x++)
	{
		res[x] = nodes[x].childNodes[0].nodeValue;
	};
	if (nodes.length > 0) return res;
	return 0;
}

// WebMethod wm.Request.ExtLayerNum
// WebMethod wm.Request.ExtLayerNum.byUser
WMSClient.prototype.RequestExtLayerNum = function (mapName /*string*/, layer_names /*array of string*/, byUser /*int*/){ // return array of int
	var msg = new XMLRPCMessage();
    if(byUser) msg.setMethod("wm.Request.ExtLayerNum.byUser"); else msg.setMethod("wm.Request.ExtLayerNum");
	msg.addParameter(mapName);
    msg.addParameter(layer_names);
	if(byUser) msg.addParameter(byUser);
	this.request = msg.xml();
	this.response = makeRPCCall(this.hurl,this.request);
	var xmldata = this.response;

	var ff = CheckFault(xmldata);
	if (ff.error) return ff;

	var res = new Array();
	var nodes = getXMLDoc(xmldata).getElementsByTagName("i4");
	for(x=0;x<nodes.length;x++)
	{
		res[x] = nodes[x].childNodes[0].nodeValue;
	};
	if (nodes.length > 0) return res;
	return 0;
}

// WebMethod wm.Request.ExtLayersNameByObjectId
// WebMethod wm.Request.ExtLayersNameByObjectId.byUser
WMSClient.prototype.ExtLayersNameByObjectId = function (mapName /*string*/, object_id /*int*/, byUser /*int*/){ // return array of string
	var msg = new XMLRPCMessage();
    if(byUser) msg.setMethod("wm.Request.ExtLayersNameByObjectId.byUser"); else msg.setMethod("wm.Request.ExtLayersNameByObjectId");
	msg.addParameter(mapName);
    msg.addParameter(object_id);
	if(byUser) msg.addParameter(byUser);
	this.request = msg.xml();
	this.response = makeRPCCall(this.hurl,this.request);
	var xmldata = this.response;

	var ff = CheckFault(xmldata);
	if (ff.error) return ff;

	var res = new Array();
	var nodes = getXMLDoc(xmldata).getElementsByTagName("string");
	for(x=0;x<nodes.length;x++)
	{
		res[x] = nodes[x].childNodes[0].nodeValue;
	};
	if (nodes.length > 0) return res;
	return 0;
}

// WebMethod wm.Request.ExtLayersNumByObjectId
// WebMethod wm.Request.ExtLayersNumByObjectId.byUser
WMSClient.prototype.ExtLayersNumByObjectId = function (mapName /*string*/, object_id /*int*/, byUser /*int*/){ // return array of int
	var msg = new XMLRPCMessage();
    if(byUser) msg.setMethod("wm.Request.ExtLayersNumByObjectId.byUser"); else msg.setMethod("wm.Request.ExtLayersNumByObjectId");
	msg.addParameter(mapName);
    msg.addParameter(object_id);
	if(byUser) msg.addParameter(byUser);
	this.request = msg.xml();
	this.response = makeRPCCall(this.hurl,this.request);
	var xmldata = this.response;

	var ff = CheckFault(xmldata);
	if (ff.error) return ff;

	var res = new Array();
	var nodes = getXMLDoc(xmldata).getElementsByTagName("i4");
	for(x=0;x<nodes.length;x++)
	{
		res[x] = nodes[x].childNodes[0].nodeValue;
	};
	if (nodes.length > 0) return res;
	return 0;
}

// WebMethod wm.Request.ExtLayerName
// WebMethod wm.Request.ExtLayerName.byUser
WMSClient.prototype.RequestExtLayerName = function (mapName /*string*/, layer_ids /*array of int*/, byUser /*int*/){ // return array of string
	var msg = new XMLRPCMessage();
    if(byUser) msg.setMethod("wm.Request.ExtLayerName.byUser"); else msg.setMethod("wm.Request.ExtLayerName");
	msg.addParameter(mapName);
    msg.addParameter(layer_ids);
	if(byUser) msg.addParameter(byUser);
	this.request = msg.xml();
	this.response = makeRPCCall(this.hurl,this.request);
	var xmldata = this.response;

	var ff = CheckFault(xmldata);
	if (ff.error) return ff;

	var res = new Array();
	var nodes = getXMLDoc(xmldata).getElementsByTagName("string");
	for(x=0;x<nodes.length;x++)
	{
		res[x] = nodes[x].childNodes[0].nodeValue;
	};
	if (nodes.length > 0) return res;
	return 0;
}

// WebMethod wm.Request.ObjectInfo
// WebMethod wm.Request.ObjectInfo.byUser
WMSClient.prototype.RequestObjectInfo = function(mapName /*string*/,ZoomPnt /*sZoomPnt*/,PictSize /*sPictSize*/,layermask /*string*/,layers_ext /*int[]*/, xpos /*int*/, ypos /*int*/, byUser /*int*/){ // return array of sKeyValue
	var msg = new XMLRPCMessage();
    if(byUser) msg.setMethod("wm.Request.ObjectInfo.byUser"); else msg.setMethod("wm.Request.ObjectInfo");
    msg.addParameter(mapName);
	msg.addParameter(ZoomPnt);
	msg.addParameter(PictSize);
	msg.addParameter(layermask);
	msg.addParameter(layers_ext);
	msg.addParameter(xpos);
	msg.addParameter(ypos);
	if(byUser) msg.addParameter(byUser);
	this.request = msg.xml();
	this.response = makeRPCCall(this.hurl,this.request);
	var xmldata = this.response;

	var ff = CheckFault(xmldata);
	if (ff.error) return ff;

	var res = new Array();
	var nodes = getXMLDoc(xmldata).getElementsByTagName("data")[0].childNodes;
	var cc_v = 0;
	for(x=0;x<nodes.length;x++)
	{
		if(nodes[x].nodeName != "#text")
		{
		res[cc_v] = new Object();
		var CN = 0;
		var CV = 1;
		if (window.ActiveXObject)
		{
			var nodes2 = nodes[x].getElementsByTagName("member");
		};
		if (document.implementation && document.implementation.createDocument)
		{
			var nodes2 = getElementsByTagName2(nodes[x],"member");
			CN = 1; CV = 3;
		};
		for(y=0;y<nodes2.length;y++)
		{
			if(nodes2[y].childNodes[CN].nodeName == 'name')
			{
	            if (nodes2[y].childNodes[CV].childNodes[CN].childNodes.length != 0)
				{
					//inte = nodes2[y].childNodes[CV].childNodes[CN].childNodes.length;
					var str = "";
					try
					{
						str = nodes2[y].childNodes[CV].childNodes[CN].childNodes[0].nodeValue;
					} catch (e) {};
					switch(nodes2[y].childNodes[CN].childNodes[0].nodeValue)
					{
						case "key": res[cc_v].key = str; break;
						case "value": res[cc_v].value = str; break;
					};
				};
			};
		};
		cc_v++;
		}; // #text
	};
    return res;
}

function sKeyValue(Key /*string*/,Value /*string*/){
  this.key = key;
  this.value = value;
  return this;
}

// WebMethod wm.Search.InLayer
WMSClient.prototype.SearchInLayer = function(mapName /*string*/, layer_name /*array of string*/, search_text /*string*/){ // array of sSearchGlb
	var msg = new XMLRPCMessage();
    msg.setMethod("wm.Search.InLayer");
    msg.addParameter(mapName);
	msg.addParameter(layer_name);
	msg.addParameter(search_text);
	this.request = msg.xml();
	this.response = makeRPCCall(this.hurl,this.request);
	var xmldata = this.response;
    return ParseSearchGlobal(xmldata);
}

	// структура
function sSearchResult(layer /*string*/,object_id /*array of int*/, object_name /*array of string*/){
    this.layer = layer;
	this.object_id = object_id;
	this.object_name = object_name;
	return this;
}

// WebMethod SearchGEOB
// WebMethod SearchGEOB.byUser
WMSClient.prototype.SearchGEOB  = function(mapName /*string*/, search_text /*string*/, maxcount /*int*/, sWhat /*int -  bit маска */, byUser /*int*/){ // array of sSearchGlb
	var msg = new XMLRPCMessage();
    if(byUser) msg.setMethod("wm.Search.GEOB.byUser"); else msg.setMethod("wm.Search.GEOB");
    msg.addParameter(mapName);
	msg.addParameter(search_text);
	if (maxcount) msg.addParameter(maxcount); else msg.addParameter(0);
	if (sWhat) msg.addParameter(sWhat); else msg.addParameter(55);
	if (byUser) msg.addParameter(byUser);
	this.request = msg.xml();
	this.response = makeRPCCall(this.hurl,this.request);
	var xmldata = this.response;
	
	var ff = CheckFault(xmldata);
	if (ff.error) return ff;
	
	// для большедлинных string
	var tmplen = getXMLDoc(xmldata).getElementsByTagName("string")[0].childNodes.length;
	var tmptxt = '';
	for(i=0;i<tmplen;i++) 
	{
		tmptxt += getXMLDoc(xmldata).getElementsByTagName("string")[0].childNodes[i].nodeValue;
	};
	return getXMLDoc( tmptxt );
	//return getXMLDoc( getXMLDoc(xmldata).getElementsByTagName("string")[0].childNodes[0].nodeValue );
}

function Search_From_File(filename)
{
	var xmlDoc;
		if(ie)
		{
			xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
			xmlDoc.async="false";
			xmlDoc.load(filename);
		} 
		else if(ns)
		{
			myXMLHTTPRequest = new XMLHttpRequest();
			myXMLHTTPRequest.open("GET", filename, false);
			myXMLHTTPRequest.send(null);
			xmlDoc = myXMLHTTPRequest.responseXML;
		}
		else
		{
			xmlDoc = getXMLDoc(getXMLfile(filename));
		};
	
	// для большедлинных string
	var tmplen = xmlDoc.getElementsByTagName("string")[0].childNodes.length;
	var tmptxt = '';
	for(i=0;i<tmplen;i++) 
	{
		tmptxt += xmlDoc.getElementsByTagName("string")[0].childNodes[i].nodeValue;
	};
	return getXMLDoc( tmptxt );
	//return getXMLDoc( getXMLDoc(xmldata).getElementsByTagName("string")[0].childNodes[0].nodeValue );
}


// WebMethod wm.Search.Global
WMSClient.prototype.SearchInLayersGEOB = function(mapName /*string*/, search_text /*string*/, maxcount /*int*/){ // array of sSearchGlb
	var msg = new XMLRPCMessage();
    msg.setMethod("wm.Search.InLayersGEOB");
    msg.addParameter(mapName);
	msg.addParameter(search_text);
	msg.addParameter(maxcount);
	this.request = msg.xml();
	this.response = makeRPCCall(this.hurl,this.request);
	var xmldata = this.response;

	return ParseSearchGlobal(xmldata);
}

// WebMethod wm.Search.Global
// WebMethod wm.Search.Global.byUser
WMSClient.prototype.SearchGlobal = function(mapName /*string*/, search_text /*string*/, maxcount /*int*/, byUser /*int*/){ // array of sSearchGlb
	var msg = new XMLRPCMessage();
    if(byUser) msg.setMethod("wm.Search.Global.byUser"); else msg.setMethod("wm.Search.Global");
    msg.addParameter(mapName);
	msg.addParameter(search_text);
	msg.addParameter(maxcount);
	if(byUser) msg.addParameter(byUser);
	this.request = msg.xml();
	this.response = makeRPCCall(this.hurl,this.request);
	var xmldata = this.response;

	return ParseSearchGlobal(xmldata);
}

// WebMethod wm.Search.InAddress
WMSClient.prototype.SearchInAddress = function(mapName /*string*/, search_text /*string*/, maxcount /*int*/){ // array of sSearchGlb
	var msg = new XMLRPCMessage();
    msg.setMethod("wm.Search.InAddress");
    msg.addParameter(mapName);
	msg.addParameter(search_text);
	msg.addParameter(maxcount);
	this.request = msg.xml();
	this.response = makeRPCCall(this.hurl,this.request);
	var xmldata = this.response;

	return ParseSearchGlobal(xmldata);
}


// WebMethod wm.Search.InLayers
WMSClient.prototype.SearchInLayers = function(mapName /*string*/, search_text /*string*/, maxcount /*int*/){ // array of sSearchGlb
	var msg = new XMLRPCMessage();
    msg.setMethod("wm.Search.InLayers");
    msg.addParameter(mapName);
	msg.addParameter(search_text);
	msg.addParameter(maxcount);
	this.request = msg.xml();
	this.response = makeRPCCall(this.hurl,this.request);
	var xmldata = this.response;

	return ParseSearchGlobal(xmldata);
}

// WebMethod wm.Search.InExtLayers
// WebMethod wm.Search.InExtLayers.byUser
WMSClient.prototype.SearchInExtLayers = function(mapName /*string*/, search_text /*string*/, maxcount /*int*/,byUser /*int*/){ // array of sSearchGlb
	var msg = new XMLRPCMessage();
    if(byUser) msg.setMethod("wm.Search.InExtLayers.byUser"); else msg.setMethod("wm.Search.InExtLayers");
    msg.addParameter(mapName);
	msg.addParameter(search_text);
	msg.addParameter(maxcount);
	if(byUser) msg.addParameter(byUser);
	this.request = msg.xml();
	this.response = makeRPCCall(this.hurl,this.request);
	var xmldata = this.response;

	return ParseSearchGlobal(xmldata);
}

	// Структура
function sSearchGlb(cathegory /*string*/, layer_num /*int*/, layer_name /*string*/,object_id /*array of int*/, object_name /*array of string*/, object_fullname /*array of string*/, zoom_point /*sZoomPoint*/, street /*int*/, mapName /*string*/){
	this.cathegory  = cathegory ;
	this.layer_num  = layer_num ;
	this.layer_name = layer_name;
	this.object_id = object_id;
	this.object_name = object_name;
	this.object_name = object_fullname;
	this.zoom_point = zoom_point;
	this.street = street;
	this.mapName = mapName;
	return this;
}


// WebMethod wm.Route.Calculate
WMSClient.prototype.RouteCalculate = function(mapName /*string*/, graphName /*string*/, x1 /*int*/,y1 /*int*/,x2 /*int*/,y2 /*int*/, getRouteXML /*bool*/){ // DrawRouteRes
	var msg = new XMLRPCMessage();
    msg.setMethod("wm.Route.Calculate");
    msg.addParameter(mapName);
	msg.addParameter(graphName);
	msg.addParameter(x1);
	msg.addParameter(y1);
	msg.addParameter(x2);
	msg.addParameter(y2);
	if(getRouteXML) msg.addParameter(getRouteXML); else msg.addParameter(false);
	this.request = msg.xml();
	this.response = makeRPCCall(this.hurl,this.request);
	var xmldata = this.response;

    var ff = CheckFault(xmldata);
	if (ff.error) return ff;

	var res = new Object();
	res.url_params = "";
	var nodes = getXMLDoc(xmldata).getElementsByTagName("member");
	for(x=0;x<nodes.length;x++)
	{
			var CN = 0;
			var CV = 1;
			if (document.implementation && document.implementation.createDocument) { CN = 1; CV = 3; };
			if(nodes[x].childNodes[CN].nodeName == 'name')
			{
				var str = "";
				try 
				{ 
					// для большедлинных str
					var tmplen = nodes[x].childNodes[CV].childNodes[CN].childNodes.length;
					for(tmpil=0;tmpil<tmplen;tmpil++) str += nodes[x].childNodes[CV].childNodes[CN].childNodes[tmpil].nodeValue; 
				} 
				catch (e) {};
				switch(nodes[x].childNodes[CN].childNodes[0].nodeValue)
				{
					case "ok":   res.ok = parseInt(str) == 1; break;
					case "time": res.time = str; break;
					case "length":     res.length = str; break;
					case "url_params": res.url_params = str; break;
					case "maxx": res.maxx= parseInt(str); break;
					case "maxy": res.maxy= parseInt(str); break;
					case "minx": res.minx= parseInt(str); break;
					case "miny": res.miny= parseInt(str); break;
					case "RouteXML" : 
					{
						res.RouteXML = new Array();
						
						try
						{
							var rnode = getXMLDoc(str).getElementsByTagName("waypoints");
							var cnt = 0;
							try
							{
								var cna = parseInt(rnode[0].getAttribute("count"));
							} catch (e) { var cna = 0; };
						if(cna > 0) 
						{
							rnode = getXMLDoc(str).getElementsByTagName("point");
							for(z=0;z<cna;z++)
							{
								res.RouteXML[z] = new Object();
								res.RouteXML[z].dist = rnode[z].getAttribute("dist");
								res.RouteXML[z].lastdist = rnode[z].getAttribute("lastdist");
								res.RouteXML[z].time = rnode[z].getAttribute("time");
								res.RouteXML[z].lasttime = rnode[z].getAttribute("lasttime");
								res.RouteXML[z].type = rnode[z].getAttribute("type");
								res.RouteXML[z].road = rnode[z].getAttribute("road");
								res.RouteXML[z].roadtype = rnode[z].getAttribute("roadtype");
								res.RouteXML[z].img1 = rnode[z].getAttribute("img1");
								res.RouteXML[z].img2 = rnode[z].getAttribute("img2");
								res.RouteXML[z].text = rnode[z].getAttribute("text");
								res.RouteXML[z].x = rnode[z].getAttribute("x");
								res.RouteXML[z].y = rnode[z].getAttribute("y");
								res.RouteXML[z].zoom = rnode[z].getAttribute("zoom");
							};
						};
						}catch (e) {};
					};
					break;
				};
			};
	};
	return res;
}

	//Структура
function sDrawRouteRes(ok /*bool*/, time /*double*/, length /*double*/, url_params /*string*/, maxx /*int*/, maxy /*int*/, minx /*int*/, miny /*int*/){
	this.ok = ok;
	this.time = time;
	this.length = length;
	this.url_params = url_params;
	this.maxx = maxx;
	this.maxy = maxy;
	this.minx = minx;
	this.miny = miny;
	return this;
}

// WebMethod wm.Route.StartMarker
WMSClient.prototype.RouteStartMarker = function(mapName /*string*/, graphName /*string*/,x1 /*int*/,y1 /*string*/){ // return: string
    var msg = new XMLRPCMessage();
    msg.setMethod("wm.Route.StartMarker");
	msg.addParameter(mapName);
	msg.addParameter(graphName);
    msg.addParameter(x1);
	msg.addParameter(y1);
	this.request = msg.xml();

	this.response = makeRPCCall(this.hurl,this.request);
	var xmldata = this.response;
	var ff = CheckFault(xmldata);
	if (ff.error) return ff;
    return getXMLDoc(xmldata).getElementsByTagName("string")[0].childNodes[0].nodeValue;

}

// WebMethod wm.Route.FinishMarker
WMSClient.prototype.RouteFinishMarker = function(mapName /*string*/, graphName /*string*/,x2 /*int*/,y2 /*string*/){ // return: string
    var msg = new XMLRPCMessage();
    msg.setMethod("wm.Route.FinishMarker");
	msg.addParameter(mapName);
	msg.addParameter(graphName);
    msg.addParameter(x2);
	msg.addParameter(y2);
	this.request = msg.xml();

	this.response = makeRPCCall(this.hurl,this.request);
	var xmldata = this.response;
	var ff = CheckFault(xmldata);
	if (ff.error) return ff;
    return getXMLDoc(xmldata).getElementsByTagName("string")[0].childNodes[0].nodeValue;
}

// WebMethod wm.GetPict.Dots
WMSClient.prototype.GetPictDots = function(mapName /*string*/, x_arr /*array of int*/, y_arr /*array of int*/, bmp_arr /*array of string*/){ // return: string
    var msg = new XMLRPCMessage();
    msg.setMethod("wm.GetPict.Dots");
    msg.addParameter(mapName);
	msg.addParameter(x_arr);
	msg.addParameter(y_arr);
	msg.addParameter(bmp_arr);
	this.request = msg.xml();

	this.response = makeRPCCall(this.hurl,this.request);
	var xmldata = this.response;
	var ff = CheckFault(xmldata);
	if (ff.error) return ff;
	try
	{
		return s = getXMLDoc(xmldata).getElementsByTagName("string")[0].childNodes[0].nodeValue;
	} catch (e) {return "";};
}

// WebMethod wm.GetPict.Circles
WMSClient.prototype.GetPictCircles = function(mapName /*string*/, x_arr /*array of int*/, y_arr /*array of int*/, r_arr /*array of int*/, c_arr /*array of int*/, w_arr /*array of int*/, s_arr /*array of string*/){ // return: string
    var msg = new XMLRPCMessage();
    msg.setMethod("wm.GetPict.Circles");
    msg.addParameter(mapName);
	msg.addParameter(x_arr);
	msg.addParameter(y_arr);
	msg.addParameter(r_arr);
	msg.addParameter(c_arr);
	msg.addParameter(w_arr);
	msg.addParameter(s_arr);
	this.request = msg.xml();

	this.response = makeRPCCall(this.hurl,this.request);
	var xmldata = this.response;
	var ff = CheckFault(xmldata);
	if (ff.error) return ff;
	try
	{
     return s = getXMLDoc(xmldata).getElementsByTagName("string")[0].childNodes[0].nodeValue;
	} catch (e) {return "";};
}

// WebMethod wm.Odometer
WMSClient.prototype.Odometer = function(mapName /*string*/,xmap_prev /*int[]*/,ymap_prev /*int[]*/,ZoomPnt /*sZoomPnt*/,PictSize /*sPictSize*/, xscr_curr /*int*/, yscr_curr  /*int*/){ // return TOdometer
	var msg = new XMLRPCMessage();
    msg.setMethod("wm.Odometer");
    msg.addParameter(mapName);
	msg.addParameter(xmap_prev);
	msg.addParameter(ymap_prev);
	msg.addParameter(ZoomPnt);
	msg.addParameter(PictSize);
	msg.addParameter(xscr_curr);
	msg.addParameter(yscr_curr);
	this.request = msg.xml();
	this.response = makeRPCCall(this.hurl,this.request);
	var xmldata = this.response;

	var ff = CheckFault(xmldata);
	if (ff.error) return ff;

	var res 			= new Object();
	res.URL_part 		= "";
	res.bystep_length 	= new Array();
	res.xmap_prev 		= new Array();
	res.ymap_prev 		= new Array();
	var nodes = getXMLDoc(xmldata).getElementsByTagName("struct")[0].childNodes;
	var cc_v = 0;
	for(x=0;x<nodes.length;x++)
	{
		if(nodes[x].nodeName != "#text")
		{
			var CN = 0;
			var CV = 1;
			if (document.implementation && document.implementation.createDocument)
			{
				CN = 1; CV = 3;
			};
			switch(nodes[x].childNodes[CN].childNodes[0].nodeValue)
			{
				case "URL_Part": res.URL_Part = nodes[x].childNodes[CV].childNodes[CN].childNodes[0].nodeValue; break;
				case "bystep_length": 
				{
					var cnode = nodes[x].childNodes[CV].getElementsByTagName("double");
					for(i=0;i<cnode.length;i++) res.bystep_length[i] = parseFloat(cnode[i].childNodes[0].nodeValue);
				};
				case "xmap_prev": 
				{
					var cnode = nodes[x].childNodes[CV].getElementsByTagName("i4");
					for(i=0;i<cnode.length;i++) res.xmap_prev[i] = parseFloat(cnode[i].childNodes[0].nodeValue);
				};
				case "ymap_prev": 
				{
					var cnode = nodes[x].childNodes[CV].getElementsByTagName("i4");
					for(i=0;i<cnode.length;i++) res.ymap_prev[i] = parseFloat(cnode[i].childNodes[0].nodeValue);
				};
			};
		}; // #texx
	};
	res.ttl = 0.0;
	for(i=0;i<res.bystep_length.length;i++) res.ttl += res.bystep_length[i];
    return res;
}

	//TOdometer
function TOdometer(URL_Part /*string*/, bystep_length /*double[]*/, xmap_prev  /*int[]*/, ymap_prev  /*int[]*/){
	this.URL_Part  = URL_Part ;
	this.bystep_length = bystep_length;
	this.xmap_prev  = xmap_prev ;
	this.ymap_prev  = ymap_prev ;
	// CLIENT ONLY 
  	  this.ttl = 0.0;
	  for(i=0;i<this.bystep_length.length;i++) this.ttl += this.bystep_length[i];
	return this;
}

/***
****
**** GetResponseDoc
****
***/

// !!! You don't need any text after this line to use in your web pages !!! //

// Example HTML: <a href="#" onclick="makeRPCSend('http://192.168.0.211/','',function makeRPCSendOK(obj,status,text){alert(text);},'wolf')">click me</a>
// retFunc = Function(objFor_retFunc_1stParam, status, receivedText) {};
function makeRPCSend(url,postdata,retFunc,objFor_retFunc_1stParam)
{
	try 
	{
		netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");
		//netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserAccess");
	} 
	catch (e) 
	{
		//alert("Permission UniversalBrowserRead denied.");
	};
	
    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.onreadystatechange = function()
	{
	    // if(httpReq.readyState == 1) retFunc("Loading");
		// if(httpReq.readyState == 2) retFunc("Loaded");
		// if(httpReq.readyState == 3) retFunc("Interactive");
		// if(httpReq.readyState == 3) retFunc("Complete");
		if(httpReq.readyState == 4) retFunc(objFor_retFunc_1stParam,httpReq.status, httpReq.responseText);
	};
	
	httpReq.open("POST", url, true);
	httpReq.setRequestHeader('Content-Type', 'text/xml');
	//httpReq.setRequestHeader("Cookie","a=b");
	//httpReq.abort() отменяет текущий запрос 
	//httpReq.getAllResponseHeaders() возвращает полный список HTTP-заголовков в виде строки 
	//httpReq.getResponseHeader(headerName) возвращает значение указанного заголовка 
	
	//httpReq.open(method, URL, async, userName, password) определяет метод, URL и другие опциональные параметры запроса;
		//httpReq.параметр async определяет, происходит ли работа в асинхронном режиме 
	
	//httpReq.send(content) отправляет запрос на сервер 
	//httpReq.setRequestHeader(label, value) добавляет HTTP-заголовок к запросу 
	//httpReq.overrideMimeType(mimeType) 
	
	// onreadystatechange Sets or retrieves the event handler for asynchronous requests. 
	// readyState Retrieves the current state of the request operation. 
	// responseBody Retrieves the response body as an array of unsigned bytes. 
	// responseText Retrieves the response body as a string. 
	// responseXML Retrieves the response body as an XML Document Object Model (DOM) object.  
	// status Retrieves the HTTP status code of the request. 
	// statusText Retrieves the friendly HTTP status of the request. 
	httpReq.send(postdata);
}

// Post text & get response
var myReq;
function makeRPCCall(url,xmldata){

	try 
	{
		netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");
		//netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserAccess");
	} 
	catch (e) 
	{
		//alert("Permission UniversalBrowserRead denied.");
	};
	
    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;
                }
            }
        }
    }
	myReq = httpReq;
	window.status = 'Загрузка данных...';
	//httpReq.onreadystatechange = new Function('','return true;');
	
    httpReq.open("POST", url, false);
	httpReq.setRequestHeader('Content-Type', 'text/xml');
	//httpReq.setRequestHeader("Cookie","a=b");
	//httpReq.abort() отменяет текущий запрос 
	//httpReq.getAllResponseHeaders() возвращает полный список HTTP-заголовков в виде строки 
	//httpReq.getResponseHeader(headerName) возвращает значение указанного заголовка 
	//httpReq.open(method, URL, async, userName, password) определяет метод, URL и другие опциональные параметры запроса;
	//httpReq.параметр async определяет, происходит ли работа в асинхронном режиме 
	//httpReq.send(content) отправляет запрос на сервер 
	//httpReq.setRequestHeader(label, value) добавляет HTTP-заголовок к запросу 
	//httpReq.overrideMimeType(mimeType) 
	//
	// onreadystatechange Sets or retrieves the event handler for asynchronous requests. 
	// readyState Retrieves the current state of the request operation. 
	// responseBody Retrieves the response body as an array of unsigned bytes. 
	// responseText Retrieves the response body as a string. 
	// responseXML Retrieves the response body as an XML Document Object Model (DOM) object.  
	// status Retrieves the HTTP status code of the request. 
	// statusText Retrieves the friendly HTTP status of the request. 
	httpReq.send(xmldata);	
	if (httpReq.status == 200) {return httpReq.responseText;} else
	{
		if (httpReq.status == 500) alert("Server Exception: "+httpReq.status);
		return httpReq.status;
	};
  }
  
function sleep(milliseconds)
{    
	var now = new Date();    
	var exitTime = now.getTime() + milliseconds;     
	while(true)    
	{        
		now = new Date();        
		if(now.getTime() > exitTime) return;    
	};
}

function getXMLfile(url)
{

	try 
	{
		netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");
		//netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserAccess");
	} 
	catch (e) 
	{
		//alert("Permission UniversalBrowserRead denied.");
	};

   
    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.setRequestHeader("Content-length", 0);
	//httpReq.setRequestHeader("Cookie","a=b");
	//httpReq.abort() отменяет текущий запрос 
	//httpReq.getAllResponseHeaders() возвращает полный список HTTP-заголовков в виде строки 
	//httpReq.getResponseHeader(headerName) возвращает значение указанного заголовка 
	//httpReq.open(method, URL, async, userName, password) определяет метод, URL и другие опциональные параметры запроса;
	//httpReq.параметр async определяет, происходит ли работа в асинхронном режиме 
	//httpReq.send(content) отправляет запрос на сервер 
	//httpReq.setRequestHeader(label, value) добавляет HTTP-заголовок к запросу 
	//httpReq.overrideMimeType(mimeType) 
	//
	// onreadystatechange Sets or retrieves the event handler for asynchronous requests. 
	// readyState Retrieves the current state of the request operation. 
	// responseBody Retrieves the response body as an array of unsigned bytes. 
	// responseText Retrieves the response body as a string. 
	// responseXML Retrieves the response body as an XML Document Object Model (DOM) object.  
	// status Retrieves the HTTP status code of the request. 
	// statusText Retrieves the friendly HTTP status of the request. 

	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: '+xml.parseError.reason+' ('+xml.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;
};

/***
****
**** Create Request
****
***/

// return xml-data
function XMLRPCMessage(methodname){
  this.method = methodname||"system.listMethods";
  this.params = [];
  return this;
}

XMLRPCMessage.prototype.setMethod = function(methodName){
  if (!methodName) return;
  this.method = methodName;
}

XMLRPCMessage.prototype.addParameter = function(data){
  if (arguments.length==0) return;
  this.params[this.params.length] = data;
}

XMLRPCMessage.prototype.xml = function(){

  var method = this.method;

  // assemble the XML message header
  var xml = "";

  xml += "<?xml version=\"1.0\"?>\n";
  xml += "<methodCall>\n";
  xml += "<methodName>" + method+ "</methodName>\n";
  xml += "<params>\n";

  // do individual parameters
  for (var i = 0; i < this.params.length; i++){
    var data = this.params[i];
    xml += "<param>\n";

    xml += "<value>" + XMLRPCMessage.getParamXML(XMLRPCMessage.dataTypeOf(data),data) + "</value>\n";

    xml += "</param>\n";
  }

  xml += "</params>\n";
  xml += "</methodCall>";

  return xml; // for now
} 

XMLRPCMessage.dataTypeOf = function (o){
  var type = typeof(o);
  type = type.toLowerCase();
  switch(type){
    case "number":
      if (Math.round(o) == o) type = "i4";
      else type = "double";
      break;
    case "object":
      var con = o.constructor;
      if (con == Date) type = "date";
      else if (con == Array) type = "array";
      else type = "struct";
      break;
  }
  return type;
}

XMLRPCMessage.doValueXML = function(type,data){
  var txt = data;
  if(typeof(data) == "string")
  {
  	while(txt.indexOf("&amp;") > 0)
	{
	 	x = txt.indexOf("&amp;");
		txt = txt.substr(0,x) + "%AMP%" + txt.substr(x+5,txt.length);
	};
	while(txt.indexOf("&") > 0)
	{
	 	x = txt.indexOf("&");
		txt = txt.substr(0,x) + "%AMP%" + txt.substr(x+1,txt.length);
	};
	while(txt.indexOf("%AMP%") > 0)
	{
	 	x = txt.indexOf("%AMP%");
		txt = txt.substr(0,x) + "&amp;" + txt.substr(x+5,txt.length);
	};
  };
  var xml = "<" + type + ">" + txt + "</" + type + ">";
  return xml;
}

XMLRPCMessage.doBooleanXML = function(data){
  var value = (data==true)?1:0;
  var xml = "<boolean>" + value + "</boolean>";
  return xml;
}

XMLRPCMessage.doDateXML = function(data){
  var xml = "<dateTime.iso8601>";
  xml += dateToISO8601(data);
  xml += "</dateTime.iso8601>";
  return xml;
}

XMLRPCMessage.doArrayXML = function(data){
  var xml = "<array><data>\n";
  for (var i = 0; i < data.length; i++){
    xml += "<value>" + XMLRPCMessage.getParamXML(XMLRPCMessage.dataTypeOf(data[i]),data[i]) + "</value>\n";
  }
  xml += "</data></array>\n";
  return xml;
}

XMLRPCMessage.doStructXML = function(data){
  var xml = "<struct>\n";
  for (var i in data){
    xml += "<member>\n";
    xml += "<name>" + i + "</name>\n";
    xml += "<value>" + XMLRPCMessage.getParamXML(XMLRPCMessage.dataTypeOf(data[i]),data[i]) + "</value>\n";
    xml += "</member>\n";
  }
  xml += "</struct>\n";
  return xml;
}

XMLRPCMessage.getParamXML = function(type,data){
  var xml;
  switch (type){
    case "date":
      xml = XMLRPCMessage.doDateXML(data);
      break;
    case "array":
      xml = XMLRPCMessage.doArrayXML(data);
      break;
    case "struct":
      xml = XMLRPCMessage.doStructXML(data);
      break;
	  case "boolean":
      xml = XMLRPCMessage.doBooleanXML(data);
      break;
    default:
      xml = XMLRPCMessage.doValueXML(type,data);
      break;
  }
  return xml;
}

function dateToISO8601(date){
  var year = new String(date.getYear());
  var month = leadingZero(new String(date.getMonth()));
  var day = leadingZero(new String(date.getDate()));
  var time = leadingZero(new String(date.getHours())) + ":" + leadingZero(new String(date.getMinutes())) + ":" + leadingZero(new String(date.getSeconds()));

  var converted = year+month+day+"T"+time;
  return converted;
}

function leadingZero(n){
  if (n.length==1) n = "0" + n;
  return n;
}

function CheckFault(data) // obj.code & obj.string
{
    var res    = new Object();
	res.error  = false;
	res.code   = 0;
	res.string = "";

	var fault = getXMLDoc(data).getElementsByTagName("fault");
	if (fault.length > 0)
	{
		var nodes = getXMLDoc(data).getElementsByTagName("member");
		for(x=0;x<nodes.length;x++)
		{
			var CN = 0;
			var CV = 1;
			if (document.implementation && document.implementation.createDocument) { CN = 1; CV = 3; };
			if(nodes[x].childNodes[CN].nodeName == 'name')
			{
				var str = nodes[x].childNodes[CV].childNodes[CN].childNodes[0].nodeValue;
				switch(nodes[x].childNodes[CN].childNodes[0].nodeValue)
				{
					case "faultCode": res.code = parseInt(str); res.error = true; break;
					case "faultString": res.string = str; res.error = true; break;
				};
			};
		};
	};
	return res;
}

function getElementsByTagName2(root,tagname)
{
	var res = new Array();
	var cc = 0;
	try{
	  if(!root.hasChildNodes()) return res;
	} catch (e) {};
	var x = 0;
	while(x < root.childNodes.length)
	{
	    if(root.childNodes[x].nodeName == "#text") { x++; continue; };
		if(root.childNodes[x].nodeName == tagname) { res[cc++] = root.childNodes[x]; x++; continue; }
		if(root.childNodes[x].hasChildNodes)
		{
		  var tmp = getElementsByTagName2(root.childNodes[x],tagname);
		  for(y=0;y<tmp.length;y++) res[cc++] = tmp[y];
		};
		x++;
	};
	return res;
}

function ReplaceQuotes(sString) 
{ 
	if (sString.indexOf("°") >= 0) return ReplaceString(ReplaceString(sString,'"','&quot;'),"'",'&#146;');
	return ReplaceString(ReplaceString(sString,'"','&quot;'),"'",'&rsquo;');
} 

function ReplaceString(sString, sReplaceThis, sWithThis) 
{ 
	if (sReplaceThis != "" && sReplaceThis != sWithThis)
	{  
		var counter = 0;  
		var start = 0;  
		var before = "";  
		var after = "";   
		while (counter<sString.length) 
		{    
			start = sString.indexOf(sReplaceThis, counter);    
			if (start == -1)
			{
				break;
			}
			else 
			{
				before = sString.substr(0, start);     
				after = sString.substr(start + sReplaceThis.length, sString.length);     
				sString = before + sWithThis + after;     
				counter = before.length + sWithThis.length;    
			} ;
		}  
	} 
	return sString;
} 

-->
