Index: Web/src/mapviewerjava/mainframe.jsp
===================================================================
--- Web/src/mapviewerjava/mainframe.jsp	(revision 4021)
+++ Web/src/mapviewerjava/mainframe.jsp	(working copy)
@@ -482,6 +482,8 @@
     String int1 = "1";
     String[] vals = {
                       webLayout.GetTitle(),
+                      GetRootVirtualFolder(request) + "/mapagent/mapagent.fcgi",
+                      webLayout.GetEnablePingServer()? int1 : int0,
                       locale,
                       showToolbar ? int1 : int0,
                       showStatusbar ? int1 : int0,
Index: Web/src/mapviewernet/mainframe.aspx
===================================================================
--- Web/src/mapviewernet/mainframe.aspx	(revision 4021)
+++ Web/src/mapviewernet/mainframe.aspx	(working copy)
@@ -483,6 +483,8 @@
         String template = MgLocalizer.Localize(LoadTemplate(Request, "../viewerfiles/mainframe.templ"), locale, GetClientOS(Request));
         String[] args = {
                     webLayout.GetTitle(),
+                    GetRootVirtualFolder(Request) + "/mapagent/mapagent.fcgi",
+                    webLayout.GetEnablePingServer()? "1" : "0",
                     locale,
                     showToolbar? "1" : "0",
                     showStatusbar? "1" : "0",
Index: Web/src/mapviewerphp/mainframe.php
===================================================================
--- Web/src/mapviewerphp/mainframe.php	(revision 4021)
+++ Web/src/mapviewerphp/mainframe.php	(working copy)
@@ -142,6 +142,7 @@
         }
         $mapDefinitionUrl = urlencode($mapDef);
         $title = $webLayout->GetTitle();
+        $enablePingServer = $webLayout->GetEnablePingServer();
 
         $showLegend = $infoPane->IsLegendBandVisible();
         $showProperties = $infoPane->IsPropertiesBandVisible();
@@ -478,6 +479,8 @@
         $templ = Localize(file_get_contents("../viewerfiles/mainframe.templ"), $locale, GetClientOS());
         print sprintf($templ,
                     $title,
+                    GetRootVirtualFolder() . "/mapagent/mapagent.fcgi",
+                    $enablePingServer? 1: 0,
                     $locale,
                     $showToolbar? 1: 0,
                     $showStatusbar? 1: 0,
Index: Web/src/viewerfiles/mainframe.templ
===================================================================
--- Web/src/viewerfiles/mainframe.templ	(revision 4021)
+++ Web/src/viewerfiles/mainframe.templ	(working copy)
@@ -8,6 +8,9 @@
 <script language="javascript" src="../viewerfiles/contextmenu.js"></script>
 <script language=javascript>
 
+var clientAgent = 'Ajax Viewer';
+var webAgent = '%s';
+var enablePingServer = %s;
 var locale = '%s';
 var hasToolbar = %s;
 var hasStatusbar = %s;
@@ -38,6 +41,12 @@
 var taskItems = new Array();
 var ctxMenuItems = new Array();
 
+var intervalID;
+var pingServerFailTime;
+var isStartPingServer;
+var thousandSeparator = "__#THOUSANDSEPARATOR#__";
+var decimalSeparator = "__#DECIMALSEPARATOR#__";
+
 function BasicCommand(name, action, icon, iconDisabled, tooltip, description)
 {
     this.name = name;
@@ -385,8 +394,85 @@
     RestoreView();
     OnSelectionChanged();
     DisplayMapSize();
+    //ping server 
+    pingServerFailTime = 0;
+    isStartPingServer = false;
+    if(enablePingServer)
+    {    
+        GetSeverSessionTimeout();
+    }
 }
 
+function encodeComponent(str)
+{
+    op = /\(/g; cp = /\)/g;
+    return encodeURIComponent(str).replace(op, "%%28").replace(cp, "%%29");
+}
+
+function ParseLocalizedFloat(floatString)
+{
+    if(thousandSeparator.length > 0)
+    {
+        floatString = floatString.replace(thousandSeparator, "");
+    }
+    if(decimalSeparator != "." && decimalSeparator.length > 0)
+    {
+        floatString = floatString.replace(decimalSeparator, ".");
+    }
+    return parseFloat(floatString);
+}
+
+function handler() 
+{    
+    if(this.readyState == 4 && this.status == 200) 
+    {  
+        if(!isStartPingServer)
+        {
+            var num = ParseLocalizedFloat(this.responseText);
+            if(!isNaN(num) && num != 0)
+            {
+                var pingServerInterval = num / 5 * 1000;
+                intervalID = window.setInterval(GetSeverSessionTimeout, pingServerInterval);
+                isStartPingServer = true;
+            }
+        }
+    }
+    else if (this.readyState == 4 && this.status != 200) 
+    {        
+        // error happens
+        if(pingServerFailTime < 6)
+        {
+            pingServerFailTime++;
+        }
+        else
+        {
+            if(isStartPingServer)
+                window.clearInterval(intervalID);
+        }
+    }
+}
+
+function GetSeverSessionTimeout()
+{
+    var url = webAgent + "?OPERATION=GETSESSIONTIMEOUT&VERSION=2.2.0&SESSION=" + GetMapFrame().GetSessionId() + "&LOCALE=" + locale + "&CLIENTAGENT=" + encodeComponent(clientAgent); 
+    var request;
+    var agent = navigator.userAgent.toLowerCase();
+    var msie = agent.indexOf("msie") != -1;
+    if(msie)
+    {
+       request=new ActiveXObject("Microsoft.XMLHTTP");
+    }
+    else
+    {
+       request= new XMLHttpRequest();
+    }
+    
+    request.onreadystatechange = handler;
+    
+    request.open('GET', url);
+    request.send(null);
+}
+
 function OnCursorPosChanged(x, y)
 {
     if(menuOpen || hasStatusbar == 0)

