﻿// JScript File

function MapData(){
    this.nLoadPercentage=0;
    this.bLoadCompleted=false;
    this.nMetroLinesMask = 0;
    this.arMetroLines = new Array();
    this.arMetroStations = new Array();
    this.arMetroStationSchemas = new Array();
    this.arMetroStationExits = new Array();
    this.oXMLInitialData = null;
    this.nInitialCurrentLineDrawing=0;
    this.sImagePath = "App_Themes/Images/Metro/";
    this.sNamesLanguage="RU";
    this.sLoadedControlHelp="";
    this.arAvailableLanguages = new Array("RU", "EN");
    this.nSelectedLanguage = 0;
    this.arBusData = new Array();
    this.arBusRequestsByStation = new Array();
    this.arTrolleyData = new Array();
    this.arTrolleyRequestsByStation = new Array();
    this.arTramData = new Array();
    this.arTramRequestsByStation = new Array();
    this.arCBusData = new Array();
    this.arCBusRequestsByStation = new Array();
    this.oClickedStationMarker=null;
    this.oMaximizingInfoWindow=null;
}

MapData.prototype.getInitialData=function(){
    WriteLog("Sending request");
    var mapBounds = document.map.getBounds();
    var oNorthEast = mapBounds.getNorthEast();
    var oSouthWest = mapBounds.getSouthWest();
    var nZoomLevel = document.map.getZoom();
    //lm=0xffffffff
    GDownloadUrl("GetMapData.aspx?v=1&hl=" + this.arAvailableLanguages[this.nSelectedLanguage] + "&lm=4294967295&le=N&sm=2&ss=1&z=" + nZoomLevel + "&ne="+oNorthEast.lat().toString()+","+oNorthEast.lng().toString()+"&sw="+oSouthWest.lat().toString()+","+oSouthWest.lng().toString(), this.receiveInitialDecodedData);
    WriteLog("Request sent");

    GEvent.addListener(document.map, "moveend", function(){
        var mapBounds = document.map.getBounds();
        var oNorthEast = mapBounds.getNorthEast();
        var oSouthWest = mapBounds.getSouthWest();
        var nZoomLevel = document.map.getZoom();
        GDownloadUrl("GetMapData.aspx?v=1&ss=1&z=" + nZoomLevel + "&ne="+oNorthEast.lat().toString()+","+oNorthEast.lng().toString()+"&sw="+oSouthWest.lat().toString()+","+oSouthWest.lng().toString(), document.mapData.receiveDecodedData);
        if (document.mapData)
            document.mapData.saveCookies();

        if (document.mgr)
            if (arInitialStationMarkers)
                if (arInitialStationMarkers.length > 0)            
                {
                    var oMapBounds = null;
                    if (document.map)
                        oMapBounds = document.map.getBounds();
                    if (oMapBounds)
                    {
                        for(var i=arInitialStationMarkers.length-1; i >-1 ; i--) 
                            if (arInitialStationMarkers[i])
                                if (arInitialStationMarkers[i][1])
                                    if (oMapBounds.contains(arInitialStationMarkers[i][1].getPoint()))
                                    {
                                        document.mgr.addMarker(arInitialStationMarkers[i][1], 12, 17);
                                        document.mgr.addMarker(arInitialStationMarkers[i][2], 13, 17);
                                        arInitialStationMarkers.splice(i, 1);
                                    }
                    }
                }
            
        });
}

MapData.prototype.receiveInitialDecodedData=function(oData, nResponseCode){
    WriteLog("Received request");
    if(nResponseCode == 200) {
        this.oMapData.oXMLInitialData = GXml.parse(oData);
        WriteLog("Parsed request");
     
        var oRoot = this.oMapData.oXMLInitialData.documentElement.getElementsByTagName("Root");
        if (oRoot)
           if (oRoot.context)
              this.oMapData.sImagePath=oRoot.context.getAttribute("ImagePath");            

        this.oMapData.drawXMLLines(this.oMapData.oXMLInitialData);
        WriteLog("Line output");
        window.setTimeout("document.mapData.drawStationMarkers()", 20);
    }
}

MapData.prototype.receiveDecodedData=function(oData, nResponseCode){
    WriteLog("Received data");
    if(nResponseCode == 200) {
        this.oMapData.oXMLInitialData = GXml.parse(oData);
        WriteLog("Parsed request");
     
        var oRoot = this.oMapData.oXMLInitialData.documentElement.getElementsByTagName("Root");
        if (oRoot)
           if (oRoot.context)
              this.oMapData.sImagePath=oRoot.context.getAttribute("ImagePath");            

        document.mapData.drawStationSchemas();
    }
}

MapData.prototype.drawXMLLines=function(oXMLData){
    WriteLog("drawXMLLines started");
    if (oXMLData)
        if (oXMLData.documentElement)
        {
           var oLinePoints = oXMLData.documentElement.getElementsByTagName("LinePoints");
           var sColor;
           var arPoints=new Array();

           for (var i=0; i < oLinePoints.length; i++)
           {
              sColor = oLinePoints[i].getAttribute("Color");
              arPoints.length = 0;
              var oChildren = oLinePoints[i].childNodes;
              for (var j=0; j < oChildren.length; j++){
                 var sLat = oChildren[j].getAttribute("Lat");
                 var sLng = oChildren[j].getAttribute("Lng");
                 var oLatLng = new GLatLng(parseFloat(sLat), parseFloat(sLng));
                 if (oLatLng)
                     arPoints.push(oLatLng);
              }

              if (arPoints.length > 0)
              {
                 var oPolyline = new GPolyline(arPoints, sColor, 4, 0.7); 
                 if (document.map)
                    document.map.addOverlay(oPolyline);
              }
           }
           arPoints.length = 0;
           arPoints=null;
        }
    WriteLog("DrawXMLLines ended");
}

MapData.prototype.drawStationMarkers=function(){
    WriteLog("drawStationMarkers started");
    var oXMLData = document.mapData.oXMLInitialData;
    if (oXMLData)
        if (oXMLData.documentElement)
        {
           var oLines = oXMLData.documentElement.getElementsByTagName("Line");
           var sColor = "";
           //var sLineShortName = "";
           var sTextColor = "";
           var sTextBackgroundColor = "";
              
           var nPercentageDelta = 50;
           if (oLines.length > 0)
              nPercentageDelta = 50 / oLines.length;

           var i = document.mapData.nInitialCurrentLineDrawing;
           WriteLog("drawStationMarkers Line = " + i.toString());
           if (i >= oLines.length)
           {
               if (document.oStationSelectionControl)
                    document.oStationSelectionControl.publishItems();
               
               window.setTimeout("document.mapData.drawStationSchemas()", 20);
               //document.mapData.bLoadCompleted=true;
                oLines=null;
                return;
           }
           
           var oMapBounds = null;
           if (document.map)
              oMapBounds = document.map.getBounds();
//           for (var i=0; i < oLines.length; i++)
//           {
              sColor = oLines[i].getAttribute("Color");
              var arLineShortName = new Array();
              for (var l=0; l < document.mapData.arAvailableLanguages.length; l++)
                  arLineShortName.push(oLines[i].getAttribute("Short" + document.mapData.arAvailableLanguages[l]));

              var sLineCode = oLines[i].getAttribute("Code");
              var sTextColor = oLines[i].getAttribute("TextColor");
              var sTextBackgroundColor = oLines[i].getAttribute("TextBackground");
              var sLineMarkerIcon = document.mapData.sImagePath + "SPLine" + sLineCode;
              var oChildren = oLines[i].childNodes;
              var oMarker=null;
              
              var sSIconPath = sLineMarkerIcon + 's.gif';
              var sTIconPath = sLineMarkerIcon + 't.gif';
                  
              var oSIcon = new GIcon();
              if (oSIcon){
                  oSIcon.image = sSIconPath;
                  oSIcon.iconSize = new GSize(13, 13);
                  oSIcon.shadowSize = new GSize(0, 0);
                  oSIcon.iconAnchor = new GPoint(6, 6);
                  oSIcon.infoWindowAnchor = new GPoint(5, 5);
                  oSIcon.printImage = sSIconPath;
                  oSIcon.mozPrintImage = sSIconPath;
                  oSIcon.shadow = '';
                  oSIcon.printShadow = '';
              }

              var oTIcon = new GIcon();
              if (oTIcon){
                  oTIcon.image = sTIconPath;
                  oTIcon.iconSize = new GSize(13, 13);
                  oTIcon.shadowSize = new GSize(0, 0);
                  oTIcon.iconAnchor = new GPoint(6, 6);
                  oTIcon.infoWindowAnchor = new GPoint(5, 5);
                  oTIcon.printImage = sTIconPath;
                  oTIcon.mozPrintImage = sTIconPath;
                  oTIcon.shadow = '';
                  oTIcon.printShadow = '';
              }

              var arStMarkers0 = new Array();
              var arStLabels0 = new Array();
              var oStMarker;
              if ((oSIcon) && (oTIcon))
                  for (var j=0; j < oChildren.length; j++){
                     var sID = oChildren[j].getAttribute("id");
                     var sLat = oChildren[j].getAttribute("MLat");
                     var sLng = oChildren[j].getAttribute("MLng");
                     var oLatLng = new GLatLng(parseFloat(sLat), parseFloat(sLng));
                     var sNameLat = oChildren[j].getAttribute("NLat");
                     var sNameLng = oChildren[j].getAttribute("NLng");
                     var oNameLatLng = new GLatLng(parseFloat(sNameLat), parseFloat(sNameLng));
                     var oLatLng = new GLatLng(parseFloat(sLat), parseFloat(sLng));
                     if (oLatLng)
                     {
                        //var sAppendedLine = "";
                        var arStationLabels = new Array();
                        var arStationTitles = new Array();
                        var sTemp = "";
                        for (var l=0; l < document.mapData.arAvailableLanguages.length; l++)
                        {
                            sTemp = oChildren[j].getAttribute(document.mapData.arAvailableLanguages[l]);
                            arStationLabels.push(sTemp);
                        }

                        var sCorner = oChildren[j].getAttribute("C");
                        var nCorner = parseInt(sCorner);
                        if ((nCorner < 1) || (nCorner > 9))
                            nCorner = 1;
                        if (!oNameLatLng)
                            oNameLatLng = oLatLng;
                            
//                        var oNameLabelE;
                        var oNameLabelE = new ELabel(oNameLatLng, arStationLabels[document.mapData.nSelectedLanguage].replace(/ /g,"&nbsp;"), "", GSize(0,0), 100, sTextColor, sTextBackgroundColor, null, nCorner);
                        oNameLabelE.arLabels = arStationLabels;

                        for (var l=0; l < document.mapData.arAvailableLanguages.length; l++)
                        {
                            if (oChildren[j].getAttribute("UniqueName")=='N')
                                arStationTitles.push(arStationLabels[l] + ' (' + arLineShortName[l] + ')');
                            else
                                arStationTitles.push(arStationLabels[l]);
                        }
                        
                        if (oChildren[j].getAttribute("T") != "")
                           oStMarker = new GMarker(oLatLng, {icon: oTIcon, draggable: false, id: sID, title: arStationTitles[document.mapData.nSelectedLanguage]});    //arStationTitles[document.mapData.nSelectedLanguage]
                        else
                           oStMarker = new GMarker(oLatLng, {icon: oSIcon, draggable: false, id: sID, title: arStationTitles[document.mapData.nSelectedLanguage]});    
                        
                        oStMarker.arTitles = arStationTitles;
                        GEvent.addListener(oStMarker, "click", function() {
                            if (document.mapData)
                                document.mapData.onClickStationMarker(this);
                        });
                        
                        var arStationData = new Array();
                        arStationData.push(sID);
                        arStationData.push(oStMarker);
                        arStationData.push(oNameLabelE);
                        document.mapData.arMetroStations.push(arStationData);

                        if (document.mgr)
                        {
                            if ((arInitialStationMarkers) && (oMapBounds))
                            {
                                if (oMapBounds.contains(oLatLng))
                                {
                                    arStMarkers0.push(oStMarker);
                                    arStLabels0.push(oNameLabelE);
                                }
                                else
                                {
                                    arInitialStationMarkers.push(arStationData);
                                }
                            }
                            else
                            {
                                arStMarkers0.push(oStMarker);
                                arStLabels0.push(oNameLabelE);
                            }
                        }
                        else {
                          if (document.map)
                            {
                                document.map.addOverlay(oStMarker);
                                document.map.addOverlay(oNameLabelE);
                            }
                        }

                        if (document.oStationSelectionControl){
                            var sStationTitleForSSC = arStationTitles[document.mapData.nSelectedLanguage];
                            var sStationIDForSSC = sID + '(' + sLat + ',' + sLng + ')';
                            document.oStationSelectionControl.addItem(sStationTitleForSSC, sStationIDForSSC, null);
                        }

                     }
                  }

                 if (document.mgr)
                 {
                    document.mgr.addMarkers(arStMarkers0, 12, 17);
                    document.mgr.addMarkers(arStLabels0, 13, 17);
                 }

                oSIcon = null;
                oTIcon = null;
                
                setLoadPercentage(Math.round(document.mapData.nLoadPercentage + nPercentageDelta));
//           }
           
           document.mapData.nInitialCurrentLineDrawing++;
           if (document.mapData.nInitialCurrentLineDrawing < oLines.length){
               window.setTimeout("document.mapData.drawStationMarkers()", 20);
           }
           else
           {
               if (document.mgr)
                    document.mgr.refresh();
               
               if (document.oStationSelectionControl)
                    document.oStationSelectionControl.publishItems();
               
               window.setTimeout("document.mapData.drawStationSchemas()", 20);
               //document.mapData.bLoadCompleted=true;
           }

           oLines = null;
        }

    WriteLog("drawStationMarkers endeded");
}

MapData.prototype.drawStationSchemas=function(){
    WriteLog("drawStationSchemas started");
    var oXMLData = document.mapData.oXMLInitialData;
    if (oXMLData)
        if (oXMLData.documentElement)
        {
           var oSchemas = oXMLData.documentElement.getElementsByTagName("Schema");

           for (var i=0; i < oSchemas.length; i++)
           {
              var sID = oSchemas[i].getAttribute("StID");
              var sIconPath = this.sImagePath + oSchemas[i].getAttribute("IconPath");
              var oMarker=null;
              
              var bSchemaExists = false;
                 
              for (var j=0; j < document.mapData.arMetroStationSchemas.length; j++)
              {
                 if (document.mapData.arMetroStationSchemas[j].stationID == sID)
                 {
                     bSchemaExists = true;
                     break;
                 }
              }
                 
              if (!bSchemaExists)
              {
                  var sLat = oSchemas[i].getAttribute("Lat");
                  var sLng = oSchemas[i].getAttribute("Lng");
                  
                  var re = new RegExp("_Ru.","i");  
                  sIconPath = sIconPath.replace(re, "_" + document.mapData.arAvailableLanguages[document.mapData.nSelectedLanguage] + ".");  

                  var bi = new BAVImage();
                  bi.src = sIconPath;
                  bi.anchorTopLeft = new GLatLng(parseFloat(sLat), parseFloat(sLng))
                  bi.anchorBottomRight = null;
                  bi.width = parseInt(oSchemas[i].getAttribute("IconWidth"));
                  bi.height = parseInt(oSchemas[i].getAttribute("IconHeight"));
                  bi.stationID = sID;
                  document.map.addBAVImage(bi);
                  
                  document.mapData.arMetroStationSchemas.push(bi);
              }
           }           
            
           if (!this.bLoadCompleted)
              setLoadPercentage(document.mapData.nLoadPercentage + 5);

           window.setTimeout("document.mapData.drawStationExits()", 20);

           oSchemas = null;
        }
    WriteLog("drawStationSchemas ended");
}

MapData.prototype.drawStationExits=function(){
    WriteLog("drawStationExits started");
    var oXMLData = document.mapData.oXMLInitialData;
    if (oXMLData)
        if (oXMLData.documentElement)
        {
           var oStations = oXMLData.documentElement.getElementsByTagName("StationForExit");
           var sIconPath = this.sImagePath + "M1.gif";

           for (var i=0; i < oStations.length; i++)
           {
              var sID = oStations[i].getAttribute("id");
              
              var bSchemaExists = false;
                 
              for (var j=0; j < document.mapData.arMetroStationExits.length; j++)
              {
                 if (document.mapData.arMetroStationExits[j][0] == sID)
                 {
                     bSchemaExists = true;
                     break;
                 }
              }
                 
              if (!bSchemaExists)
              {
                  var oExits = oStations[i].getElementsByTagName("Exit");
                  var arExits = new Array();
                  for (var j=0; j < oExits.length; j++){
                      var sLat = oExits[j].getAttribute("Lat");
                      var sLng = oExits[j].getAttribute("Lng");

                      var oIcon = new GIcon();
                      oIcon.iconSize = new GSize(14, 12);
                      oIcon.iconAnchor = new GPoint(0, 0);
                      oIcon.image = sIconPath;
                      oIcon.printImage = sIconPath;
                      oIcon.mozPrintImage = sIconPath;
                      oIcon.shadow = '';
                      oIcon.printShadow = '';
                      pt = new GLatLng(parseFloat(sLat), parseFloat(sLng));
                      var arTitlesL = new Array();
                      for (var l=0; l < document.mapData.arAvailableLanguages.length; l++)
                         arTitlesL.push(oExits[j].getAttribute("Title" + document.mapData.arAvailableLanguages[l]));

                      function orderOfExitMarkers(marker,b) {
                        return GOverlay.getZIndex(marker.getPoint().lat()) + 1000;
                      }

                      oMExit = new GMarker(pt, {icon: oIcon, draggable: false, title: arTitlesL[document.mapData.nSelectedLanguage], zIndexProcess:orderOfExitMarkers});
                      oMExit.arTitles = arTitlesL;

                      document.mgr.addMarker(oMExit, 16, 17);
                      arExits.push(oMExit);
                  }
                  
                  document.mapData.arMetroStationExits.push(new Array(sID, arExits));
              }
           }           

           if (!this.bLoadCompleted)
              setLoadPercentage(document.mapData.nLoadPercentage + 5);

           document.mapData.bLoadCompleted=true;
           //document.mgr.refresh();
           oExits = null;
        }
    WriteLog("drawStationExits ended");
}

MapData.prototype.setSelectedLanguage=function(sNewLanguage){
    if (this.arAvailableLanguages){
        var sNewLangUpper = sNewLanguage.toUpperCase();
        for (var i=0; i < this.arAvailableLanguages.length; i++)
            if (this.arAvailableLanguages[i] == sNewLangUpper)
            {
                this.nSelectedLanguage = i;
                break;
            }
    }
}

MapData.prototype.setLanguage=function(sNewLanguage){
    var nOldLanguage = this.nSelectedLanguage;
    var sOldLanguage = this.arAvailableLanguages[nOldLanguage];
//    for (var i=0; i < this.arAvailableLanguages.length; i++)
//        if (this.arAvailableLanguages[i] == sNewLanguage)
//        {
//            this.nSelectedLanguage = i;
//            break;
//        }
    this.setSelectedLanguage(sNewLanguage);
        
    if ((this.nSelectedLanguage != nOldLanguage) && (this.arMetroStations.length > 0))
    {
        if (this.arMetroStations[0])
            if (this.arMetroStations[0][1])
            {
                var sVarGMarkerOptions="";
                for (var d in this.arMetroStations[0][1])
                {
                    for (var e in this.arMetroStations[0][1][d])
                        if (e=="title")
                        {   
                            sVarGMarkerOptions=d;
                            break;
                        }
                    
                    if (sVarGMarkerOptions != "")
                        break;
                }
                
                document.oStationSelectionControl.oSelect.options.length=0;

                if (sVarGMarkerOptions != "")   
                {             
                    for (var i=0; i < this.arMetroStations.length; i++)
                    {
                        this.arMetroStations[i][2].setContents(this.arMetroStations[i][2].arLabels[this.nSelectedLanguage]);
                        this.arMetroStations[i][1][sVarGMarkerOptions].title=this.arMetroStations[i][1].arTitles[this.nSelectedLanguage];
                        var oLatLng = this.arMetroStations[i][1].getPoint();
                        if (oLatLng)
                            document.oStationSelectionControl.addItem(this.arMetroStations[i][1].arTitles[this.nSelectedLanguage], this.arMetroStations[i][0] + '(' + oLatLng.lat().toString() + ',' + oLatLng.lng().toString() + ')');
                    }
                    
                    for (var i=0; i < this.arMetroStationExits.length; i++)
                        if (this.arMetroStationExits[i])
                            if (this.arMetroStationExits[i][1])
                                for (var j=0; j < this.arMetroStationExits[i][1].length; j++)
                                    this.arMetroStationExits[i][1][j][sVarGMarkerOptions].title = this.arMetroStationExits[i][1][j].arTitles[this.nSelectedLanguage];
                }
                else
                {
                    for (var i=0; i < this.arMetroStations.length; i++)
                    {
                        this.arMetroStations[i][2].setContents(this.arMetroStations[i][2].arLabels[this.nSelectedLanguage]);
                        var oLatLng = this.arMetroStations[i][1].getPoint();
                        if (oLatLng)
                            document.oStationSelectionControl.addItem(this.arMetroStations[i][1].arTitles[this.nSelectedLanguage], this.arMetroStations[i][0] + '(' + oLatLng.lat().toString() + ',' + oLatLng.lng().toString() + ')');
                    }
                    
                    for (var i=0; i < this.arMetroStationExits.length; i++)
                        if (this.arMetroStationExits[i])
                            if (this.arMetroStationExits[i][1])
                                for (var j=0; j < this.arMetroStationExits[i][1].length; j++)
                                    this.arMetroStationExits[i][1][j][sVarGMarkerOptions].title = this.arMetroStationExits[i][1][j].arTitles[this.nSelectedLanguage];
                }
                document.oStationSelectionControl.publishItems();

                var re = new RegExp("_" + sOldLanguage + ".","i");  
                for (var i=0; i < this.arMetroStationSchemas.length; i++)
                {
                    this.arMetroStationSchemas[i].setImage(this.arMetroStationSchemas[i].src.replace(re, "_" + sNewLanguage + "."));
                }
                
                document.mgr.refresh();
        }
        //clear control help, to request it again for new language
        this.sLoadedControlHelp = "";
    }
}

MapData.prototype.saveCookies=function(){
   if (document.map)
   {
      var oCenter = document.map.getCenter();
      var nZoomLevel = document.map.getZoom();
      var sTypeName = document.map.getCurrentMapType().getUrlArg();
      var sHumanLanguage = document.mapData.arAvailableLanguages[document.mapData.nSelectedLanguage];
      
      var dDate = new Date();
      dDate.setFullYear(dDate.getFullYear(), dDate.getMonth() + 1, dDate.getDate());
                
      document.cookie = 'cLat=' + escape(oCenter.lat().toString()) + ';' + ' expires=' + dDate.toGMTString();
      document.cookie = 'cLng=' + escape(oCenter.lng().toString()) + ';' + ' expires=' + dDate.toGMTString();
      document.cookie = 'cZm=' + escape(nZoomLevel.toString()) + ';' + ' expires=' + dDate.toGMTString();
      document.cookie = 'cMT=' + escape(sTypeName) + ';' + ' expires=' + dDate.toGMTString();
      document.cookie = 'cHL=' + escape(sHumanLanguage) + ';' + ' expires=' + dDate.toGMTString();
   }
}

MapData.prototype.requestControlHelp=function(){
    var sLanguage="";
    if (document.mapData)
        if (document.mapData.arAvailableLanguages)
            sLanguage=document.mapData.arAvailableLanguages[document.mapData.nSelectedLanguage];

    if (this.sLoadedControlHelp != sLanguage){
        GDownloadUrl("GetMapData.aspx?v=1&dt=1&hl=" + sLanguage, function(oData, nResponseCode){
            WriteLog("Request with Control Help received");
            if(nResponseCode == 200) {
                eval(oData);
                if (document.mapData)
                document.mapData.sLoadedControlHelp = document.mapData.arAvailableLanguages[document.mapData.nSelectedLanguage];
            }
        });
        WriteLog("Request sent for Control Help");
    }
}

MapData.prototype.onClickStationMarker=function(oMarker){
    var bFlag = false;
    var bInserted = false;
    var arMetroStationBuses;
    var arMetroStationTrolleys;
    var arMetroStationTrams;
    var arMetroStationCBuses;
    var sLanguage="";
    if (document.mapData){
    
        if (document.mapData.arAvailableLanguages)
            sLanguage=document.mapData.arAvailableLanguages[document.mapData.nSelectedLanguage];

        document.mapData.oClickedStationMarker = oMarker;
        
        for (var i=0; i < document.mapData.arBusRequestsByStation.length; i++){
            if (document.mapData.arBusRequestsByStation[i] == oMarker.id){
                bFlag = true;
                break;
            }    
        }
        
        if (!bFlag)
            GDownloadUrl("GetMapData.aspx?v=1&dt=4&hl=" + sLanguage + "&ms=" + oMarker.id, function(oData, nResponseCode){
                WriteLog("Received marker info window data");
                if(nResponseCode == 200) {
                    WriteLog("oData.length=" + oData.length);
                    WriteLog("oData=" + oData);
                    eval(oData);   
                    WriteLog("after eval(oData)");
                    if ((arMetroStationBuses) && (sMetroStationID))
                        if (arMetroStationBuses.length > 0){
                            WriteLog("arMetroStationBuses.length = " + arMetroStationBuses.length.toString());
                            if (sMetroStationID != "")
                                document.mapData.arBusRequestsByStation.push(sMetroStationID);
                                
                            WriteLog("before adding buses to global array");
                            for (var i=0; i < arMetroStationBuses.length; i++){
                                WriteLog("adding buses to global array, i=" + i.toString());
                                if (document.mapData.arBusData.length > 0){
                                    bInserted = false;
                                    for (var j=0; j < document.mapData.arBusData.length; j++)
                                        if (arMetroStationBuses[i][0] == document.mapData.arBusData[j][0]){
                                            bInserted = true;
                                            break;
                                        }
                                        else
                                            if (arMetroStationBuses[i][0] < document.mapData.arBusData[j][0]){
                                                var arTemp = new Array(arMetroStationBuses[i]);
                                                if (j == 0)
                                                    document.mapData.arBusData = arTemp.concat(document.mapData.arBusData);
                                                else
                                                    document.mapData.arBusData = document.mapData.arBusData.slice(0, j).concat(arTemp, document.mapData.arBusData.slice(j));
                                                bInserted = true;
                                                break;
                                            }
                                    if (!bInserted)
                                        document.mapData.arBusData.push(arMetroStationBuses[i]);
                                }
                                else
                                    document.mapData.arBusData.push(arMetroStationBuses[i]);
                        }
                    }
                    WriteLog("Added buses to the array");
                    
                    if ((arMetroStationTrolleys) && (sMetroStationID))
                        if (arMetroStationTrolleys.length > 0){
                            if (sMetroStationID != "")
                                document.mapData.arTrolleyRequestsByStation.push(sMetroStationID);
                                
                            for (var i=0; i < arMetroStationTrolleys.length; i++){
                                if (document.mapData.arTrolleyData.length > 0){
                                    bInserted = false;
                                    for (var j=0; j < document.mapData.arTrolleyData.length; j++)
                                        if (arMetroStationTrolleys[i][0] == document.mapData.arTrolleyData[j][0]){
                                            bInserted = true;
                                            break;
                                        }
                                        else
                                            if (arMetroStationTrolleys[i][0] < document.mapData.arTrolleyData[j][0]){
                                                var arTemp = new Array(arMetroStationTrolleys[i]);
                                                if (j == 0)
                                                    document.mapData.arTrolleyData = arTemp.concat(document.mapData.arTrolleyData);
                                                else
                                                    document.mapData.arTrolleyData = document.mapData.arTrolleyData.slice(0, j).concat(arTemp, document.mapData.arTrolleyData.slice(j));
                                                bInserted = true;
                                                break;
                                            }
                                    if (!bInserted)
                                        document.mapData.arTrolleyData.push(arMetroStationTrolleys[i]);
                                }
                                else
                                    document.mapData.arTrolleyData.push(arMetroStationTrolleys[i]);
                        }
                    }
                    WriteLog("Added trolley to the array");
                    
                    if ((arMetroStationTrams) && (sMetroStationID))
                        if (arMetroStationTrams.length > 0){
                            if (sMetroStationID != "")
                                document.mapData.arTramRequestsByStation.push(sMetroStationID);
                                
                            for (var i=0; i < arMetroStationTrams.length; i++){
                                if (document.mapData.arTramData.length > 0){
                                    bInserted = false;
                                    for (var j=0; j < document.mapData.arTramData.length; j++)
                                        if (arMetroStationTrams[i][0] == document.mapData.arTramData[j][0]){
                                            bInserted = true;
                                            break;
                                        }
                                        else
                                            if (arMetroStationTrams[i][0] < document.mapData.arTramData[j][0]){
                                                var arTemp = new Array(arMetroStationTrams[i]);
                                                if (j == 0)
                                                    document.mapData.arTramData = arTemp.concat(document.mapData.arTramData);
                                                else
                                                    document.mapData.arTramData = document.mapData.arTramData.slice(0, j).concat(arTemp, document.mapData.arTramData.slice(j));
                                                bInserted = true;
                                                break;
                                            }
                                    if (!bInserted)
                                        document.mapData.arTramData.push(arMetroStationTrams[i]);
                                }
                                else
                                    document.mapData.arTramData.push(arMetroStationTrams[i]);
                        }
                    }
                    WriteLog("Added trams to the array");
                    
                    if ((arMetroStationCBuses) && (sMetroStationID))
                        if (arMetroStationCBuses.length > 0){
                            if (sMetroStationID != "")
                                document.mapData.arCBusRequestsByStation.push(sMetroStationID);
                                
                            for (var i=0; i < arMetroStationCBuses.length; i++){
                                if (document.mapData.arCBusData.length > 0){
                                    bInserted = false;
                                    for (var j=0; j < document.mapData.arCBusData.length; j++)
                                        if (arMetroStationCBuses[i][0] == document.mapData.arCBusData[j][0]){
                                            bInserted = true;
                                            break;
                                        }
                                        else
                                            if (arMetroStationCBuses[i][0] < document.mapData.arCBusData[j][0]){
                                                var arTemp = new Array(arMetroStationCBuses[i]);
                                                if (j == 0)
                                                    document.mapData.arCBusData = arTemp.concat(document.mapData.arCBusData);
                                                else
                                                    document.mapData.arCBusData = document.mapData.arCBusData.slice(0, j).concat(arTemp, document.mapData.arCBusData.slice(j));
                                                bInserted = true;
                                                break;
                                            }
                                    if (!bInserted)
                                        document.mapData.arCBusData.push(arMetroStationCBuses[i]);
                                }
                                else
                                    document.mapData.arCBusData.push(arMetroStationCBuses[i]);
                        }
                    }
                    WriteLog("Added buses to the array");
                    
                    document.mapData.displayStationInfoWindow(sMetroStationID);
                }
                else
                    WriteLog("ResponseCode=" + nResponseCode);
                });
         else
            document.mapData.displayStationInfoWindow(oMarker.id);
    }
}
  
MapData.prototype.displayStationInfoWindow=function(sStationID){
    var bIsFirst = true;
    //Check if the stored marker corresponds received data
    if (document.mapData)
        if (document.mapData.oClickedStationMarker){
            if (document.mapData.oClickedStationMarker.id == sStationID){
                var sTabTransport = 'Transp.';
                var sTabTransportLabelBuses = 'Buses.';
                var sTabTransportLabelTrolleys = 'Trolleys.';
                var sTabTransportLabelTrams = 'Trams.';
                var sTabTransportLabelCBuses = 'Commertial buses.';
                var sTabTransportText = '';
                var sMaximizeWindowText = '';
                var reStation = new RegExp(sStationID, "g");
                var sTemp = '';
                if (oInterfaceText){
                    sTabTransport = oInterfaceText.getItemValue('SMIWndTabTransportTabName',1);
                    sTabTransportLabelBuses = oInterfaceText.getItemValue('SMIWndTabTransportLabelBuses',1);
                    sTabTransportLabelTrolleys = oInterfaceText.getItemValue('SMIWndTabTransportLabelTrolleys',1);
                    sTabTransportLabelTrams = oInterfaceText.getItemValue('SMIWndTabTransportLabelTrams',1);
                    sTabTransportLabelCBuses = oInterfaceText.getItemValue('SMIWndTabTransportLabelCBuses',1);
                    sMaximizeWindowText = oInterfaceText.getItemValue('SMIWndTabMaximizeText',1);
                }
                
                sTemp=''; bIsFirst = true;
                for (var i=0; i < this.arBusData.length; i++){
                    if (this.arBusData[i][2].search(reStation) > -1){
                        //add bus to the list
                        if (!bIsFirst)
                            sTemp += ", ";
                        else
                            bIsFirst = false;
                        sTemp += this.arBusData[i][1];
                    }    
                }
                if (sTemp != '')
                    sTabTransportText += "<b>" + sTabTransportLabelBuses + ":</b><br/>" + sTemp + "<br />";

                sTemp=''; bIsFirst = true;
                for (var i=0; i < this.arTrolleyData.length; i++){
                    if (this.arTrolleyData[i][2].search(reStation) > -1){
                        //add bus to the list
                        if (!bIsFirst)
                            sTemp += ", ";
                        else
                            bIsFirst = false;
                        sTemp += this.arTrolleyData[i][1];
                    }    
                }
                if (sTemp != '')
                    sTabTransportText += "<b>" + sTabTransportLabelTrolleys + ":</b><br/>" + sTemp + "<br />";

                sTemp=''; bIsFirst = true;
                for (var i=0; i < this.arTramData.length; i++){
                    if (this.arTramData[i][2].search(reStation) > -1){
                        //add bus to the list
                        if (!bIsFirst)
                            sTemp += ", ";
                        else
                            bIsFirst = false;
                        sTemp += this.arTramData[i][1];
                    }    
                }
                if (sTemp != '')
                    sTabTransportText += "<b>" + sTabTransportLabelTrams + ":</b><br/>" + sTemp + "<br />";

                sTemp=''; bIsFirst = true;
                for (var i=0; i < this.arCBusData.length; i++){
                    if (this.arCBusData[i][2].search(reStation) > -1){
                        //add bus to the list
                        if (!bIsFirst)
                            sTemp += ", ";
                        else
                            bIsFirst = false;
                        sTemp += this.arCBusData[i][1];
                    }    
                }
                if (sTemp != '')
                    sTabTransportText += "<b>" + sTabTransportLabelCBuses + ":</b><br/>" + sTemp + "<br />";

                if (sTabTransportText != ''){
                    sTabTransportText += "<div onclick='if (document.mapData) document.mapData.maximizeWindow();' style='cursor:pointer; color:#0000FF; text-decoration:underline;'>" + sMaximizeWindowText + "</div>";
                    sTabTransportText += "<hr/>";
                    
                }


                var oMaxContentDiv = document.createElement("div");
                oMaxContentDiv.innerHTML = "<iframe FRAMEBORDER=0 style='width:100%; height:100%' src='GetHTMLData.aspx?v=1&dt=1&hl=RU&ms=" + sStationID + "'></iframe>";
                document.mapData.oClickedStationMarker.openInfoWindowTabsHtml(
                    [new GInfoWindowTab(sTabTransport, sTabTransportText)
                    ], {maxWidth:300, maxContent: oMaxContentDiv});
//                    ], {maxWidth:300, maxUrl: "GetHTMLData.aspx?v=1&dt=1&hl=RU&ms=" + sStationID});
                    //, maxUrl: "InfoPage_RU.htm"
                    
                var oIW = document.map.getInfoWindow();
//                GEvent.addListener(oIW, "maximizeclick", function() {
//                  GDownloadUrl("GetHTMLData.aspx?v=1&dt=1&hl=RU&ms=" + sStationID, function(data) {
//                    oMaxContentDiv.innerHTML = data;
//                  });
//                });
            }
      }
}

MapData.prototype.maximizeWindow=function(){
    if (document.map){
        var oInfoWindow = document.map.getInfoWindow(); 
        if (oInfoWindow){
            oInfoWindow.maximize();
            var oParentDivs = oInfoWindow.getContentContainers();
            if (oParentDivs)
                if (oParentDivs[0])
                    if (oParentDivs[0].firstChild)
                        if (oInterfaceText){
                            oParentDivs[0].firstChild.innerHTML += "<br/>" + oInterfaceText.getItemValue('SMIWndTabMaximizeLoadingData',1);
                            this.oMaximizingInfoWindow=oParentDivs[0].firstChild;
                            window.setTimeout("if (document) if (document.mapData) if (document.mapData.oMaximizingInfoWindow) {var nPos = document.mapData.oMaximizingInfoWindow.innerHTML.lastIndexOf('<BR'); if (nPos > 0) document.mapData.oMaximizingInfoWindow.innerHTML = document.mapData.oMaximizingInfoWindow.innerHTML.substring(0, nPos); }", 3000);
                        }
        }
    }
}