/*---------------------------------------------------------------scr.js-----------------------*/

var rPlaying = false;
var rPlayIndex;
var rAcceleration  = 1;
var rPlayDirection = 1;
var rPlayTimer;

var showModeCode = new Array();
showModeCode[0] = 'shortModeArea';
showModeCode[1] = 'shortModeObject';
showModeCode[2] = 'shortModeVision';
showModeCode[3] = 'shortModeHistory';

function changeReloadTime(time){
reloadTime=parseInt(time)*1000;
}

function changeShowParams(params){
if(showParams[params]){showParams[params]=false;}else{showParams[params]=true;}	
}

function changeInfoWindowParams(params){
if(infoWindowParams[params]){infoWindowParams[params]=false;}else{infoWindowParams[params]=true;}	
}




function loadXMLDoc (url)
{
    if(!request)request = createRequest();
    request.open("POST", url, true);
    request.onreadystatechange = processRequest;
	
    var xmlR = new XMLDocument;
    xmlR.loadXML('<?xml version="1.0" encoding="windows-1251"?><trace/>');
    xmlR.XMLDocument.documentElement.setAttribute('showMode',showMode);
    xmlR.XMLDocument.documentElement.setAttribute('timezone',getTimezone());
    xmlR.XMLDocument.documentElement.setAttribute('lng',Language);
    xmlR.XMLDocument.documentElement.setAttribute('session',SESSION);
    var filter = trakFilter();
    if(filter != '')
    {
       xmlR.XMLDocument.documentElement.setAttribute('filtertype', 'exclude');
       xmlR.XMLDocument.documentElement.setAttribute('filter', trakFilter());
    } 
    if(showMode == 3)
    {
      xmlR.XMLDocument.documentElement.setAttribute('filtertype', 'include');
      xmlR.XMLDocument.documentElement.setAttribute('stime',date2string(startShowDate));
      xmlR.XMLDocument.documentElement.setAttribute('etime',date2string(stopShowDate));

      xmlR.XMLDocument.documentElement.setAttribute('filter', top.idselectTrack);
      xmlR.XMLDocument.documentElement.setAttribute('mode', 8);
      xmlR.XMLDocument.documentElement.setAttribute('param', 10);
    }
    if(showMode == 4)
    {
//      xmlR.XMLDocument.documentElement.setAttribute('stime',date2string(getShowDate()));
    }
	//alert(xmlR.XMLDocument.xml) 
    request.send(xmlR.XMLDocument);
//  request.send(null);
} 

function trakFilter()
{
	var filter = new Array;
	
    if(xmlTrakFilter.XMLDocument.documentElement)
    {
       var traks = xmlTrakFilter.XMLDocument.getElementsByTagName('traks');
      
       for(var i = 0; i < traks.length; i++)
       { 
         if(Number(traks[i].getAttribute('show')) == 0 && Number(traks[i].getAttribute('id')) > 0)
         {
//           filter[filter.length] = "'"+traks[i].getAttribute('id')+"'";
           filter[filter.length] = traks[i].getAttribute('id');
         }
       }
       return filter.join(",");
    }
}
/*
function trakFilterNo(trak){
   traks=top.xmlMenu.XMLDocument.getElementsByTagName('traker')[1].getElementsByTagName('tr');	
  var filter = new Array;
  for(var i=0; i<traks.length; i++){  
  if(traks[i].getAttribute('id')!=''&&traks[i].getAttribute('id')!=trak){
 filter[filter.length] ="'"+traks[i].getAttribute('id')+"'"; 
  }  
  }
return filter.join(","); 
}

*/
function getShowDate()
{
   var now = new Date();

   if(!showDate)
   { 
      if(startShowDate)
      {
         showDate = startShowDate;
      }
      else
      {
         showDate = getBackTime(new Date()); 
         startShowDate = showDate;
      }
   }
   if(!stopShowDate )
   {
      stopShowDate = now;
   }

//   if(showDate >= stopShowDate || showDate >= now)
   if(addTime(showDate,getShowPeriod()) >= stopShowDate || addTime(showDate,getShowPeriod()) >= now)
   { 
      showDate = false; 
      setShowMode('0');
   }
   else
   {
      showDate = addTime(showDate,getShowPeriod());
   }

   return showDate;
}

function getShowPeriod()
{
   var period = stopShowDate.getTime() - startShowDate.getTime();
   period = Math.round(period/(48 * 1000 * 60));
   if(period < 2){period = 2;}
   return period;
}

function processRequest()
{
   if(!request)
   {
//      statusText("Запрос не выполнен!"); 
      statusText(getWordLang('selectnotcomplite'));
      return;
   }
   if (request.readyState == 4 )
   { 
      try{var test = request.status;}
      catch(e)
      {
          request = false;
//          statusText('Ошибка запроса!');
          statusText(getWordLang('errorselect'));
          responseLoading = false;
          showWorking = false;
          return;
      }

      if(request.status == 200)
      {
         if(request.responseXML != null)
         {
            xmlTrace.loadXML(request.responseText);
            if(xmlTrace.XMLDocument.documentElement)
            {
//               statusText('Данные загружены');
               statusText(getWordLang('downloadcomplete'));
               normalStatus();
               var message = xmlTrace.XMLDocument.documentElement.getElementsByTagName('message');
               if(message.length > 0)
               {
                  attentionStatus();
                  statusText(message.item(0).childNodes.item(0).nodeValue);
               }

               responseLoading = false;
               showTrace();

            }
            else
            {
               attentionStatus();
//               statusText('Ошибка при анализе данных!');
               statusText(getWordLang('erroranalist'));
            }
         }
         else
         {
             attentionStatus();
//             statusText('Данные отсутствуют!');
             statusText(getWordLang('datano'));
       }
      }
      else
      {
         errorStatus();
//         statusText(request.status + ' '+ request.statusText);
      }
//      request = false;
	  appEvents.dispatchEvent('stopLoad','stopLoad');	
      responseLoading = false;
   }
}

function loadXML(url)
{
   if(responseLoading == false && showWorking == false)
   {
//      statusText('Загрузка данных...');
      statusText(getWordLang('downloaddata')+'...');
      appEvents.dispatchEvent('startLoad','startLoad');	
      responseLoading = true;
      if(url)
      {
         loadXMLDoc(url);
      }
      else
      {
         loadXMLDoc('/cgi-bin/trackLib/trakPos.pl');
      }
//      loadXMLDoc('/cgi-bin/trakpos.pl');
   }
}



function dataTimer(interval)
{  
   if(responseLoading == false && showWorking == false)
   {
      appEvents.dispatchEvent('startLoad','startLoad');	
      loadXML();
      timer = setTimeout("showTimer();", reloadTime);
   }
   else
   {
      timer = setTimeout("dataTimer();", reloadTime);
   }
}


function showTimer()
{
   if(responseLoading == false && showWorking == false)
   {
      setTimeout("showTrace();", 100);
      timer = setTimeout("dataTimer();", reloadTime);
   }
   else
   {
//      statusText('Обработка данных...');
      statusText(getWordLang('dataprocessing')+'...');
      timer = setTimeout("showTimer();", reloadTime/10);
   }
}



function getParentElement(obj){if(navigator.appVersion.indexOf('MSIE')!=-1){return obj.parentElement;}else{return obj.parentNode;}}

function showTrace()
{
   if(!map){return;}

   if(responseLoading == false)
   {
      showWorking = true;

      clearUsedPointers();

      clearLines();

/*
      if(lines.length > 0)
      {
         for(var i = 0; i < lines.length; i++)
         {
            map.removeOverlay(lines[i]);
         } 
         lines = new Array;
      }
*/

      var points = new Array;
      var m = '';
      var maxLat = '0';
      var minLat = '90';
      var maxLng = '0'
      var minLng = '180';

      var point = xmlTrace.XMLDocument.documentElement.getElementsByTagName('point');

     for (var i = 0; i < point.length; i++)
     {	 
//	 var parentPoint=getParentElement(point[i]);
	 var parentPoint=point[i].parentNode;
	 var trakid  = parentPoint.getAttribute('trakid');		 
         var ltime   = point[i].getAttribute('ltime');
	 var pointer = false;
         switch(Number(showMode))
         {
         case 0 : 
            pointer = getPointer(trakid);
            break;
         case 1 :
            pointer = getPointer(trakid);
            break;
         case 2:
            pointer = getPointer(trakid);
            break;
         case 3:
            pointer = getPointerByTime(trakid,ltime);
            break;
         case 4:
            pointer = getPointer(trakid);
            break;
         default:
            pointer = getPointer(trakid);
         }
         if(!pointer)
         {
            pointer = new createPointer(trakid);
            pointer.stime = point[i].getAttribute('ltime');
            pointer.image = parentPoint.getAttribute('pointer');
            pointers[pointers.length] = pointer;
         }
 
         if(pointer)
         {
            pointer.used  = 1;
            pointer.stime = point[i].getAttribute('ltime');
            pointer.name      = parentPoint.getAttribute('name');
            pointer.IMEI      = parentPoint.getAttribute('gprsid');

            var conn = point[i].getAttribute('conn');
            if(conn)
            {
            pointer.gsm       = conn.split(',')[0];
            pointer.gpsfix    = conn.split(',')[1];
            pointer.stop      = conn.split(',')[2];
            pointer.sos       = conn.split(',')[3];
            }
            pointer.ltime     = point[i].getAttribute('ltime');
            pointer.latitude  = point[i].getAttribute('latitude');
            pointer.longitude = point[i].getAttribute('longitude');
            pointer.speed     = point[i].getAttribute('kspeed');if(pointer.stop == 1){pointer.speed = '0.0';}
            pointer.dir       = point[i].getAttribute('dir');
            if(point[i].getAttribute('trun')) pointer.trun = point[i].getAttribute('trun');
            if(point[i].getAttribute('operation')) pointer.operation = point[i].getAttribute('operation');

            if(Number(pointer.latitude)  > Number(maxLat)) maxLat = pointer.latitude;
            if(Number(pointer.latitude)  < Number(minLat)) minLat = pointer.latitude;
            if(Number(pointer.longitude) > Number(maxLng)) maxLng = pointer.longitude;
            if(Number(pointer.longitude) < Number(minLng)) minLng = pointer.longitude;
            
            if(pointer.sos == 0) pointer.showSOS = true;
            
            var events = point[i].getElementsByTagName('event');
//            pointer.events = new Array;
            if(pointer.event.triggered != 'yes')
            {
               pointer.event = false;
            }

//            if(showMode == 0 && events.length > 0)
            if(events.length > 0)
            {
               if(pointer.events.length > 0)
               {
                  pointer.event = pointer.events[pointer.events.length];
               }
               pointer.events = new Array;
               for (var j = 0; j < events.length; j++)
               {
                  var event = new MEvent;

                  event.id   = events.item(j).getAttribute('id');
                  event.code = events.item(j).getAttribute('code');
                  event.type = events.item(j).getAttribute('type');
                  event.name = events.item(j).getAttribute('name');
                  if(!event.name)event.name = '';     
                  if(events.item(j).getAttribute('ltime'))
                  {
                     event.ltime     = events.item(j).getAttribute('ltime');
                  }
                  else
                  {
                     event.ltime     = pointer.ltime;
                  }
                  if(events.item(j).getAttribute('dtime'))
                  {
                     event.dtime     = events.item(j).getAttribute('dtime');
                  }
                  else
                  {
                     event.dtime     = pointer.dtime;
                  } 
                  event.latitude  = events.item(j).getAttribute('latitude');
                  event.longitude = events.item(j).getAttribute('longitude');
                  event.triggered = events.item(j).getAttribute('triggered');
                  event.message   = events.item(j).getAttribute('msg');
//                  event.message   = events.item(j).getAttribute('info');

                  pointer.events.push(event);
               }
               if(pointer.events.length > 5)
               {
                  pointer.events.splice(0,pointer.events.length - 5)
               }
               if(pointer.event && pointer.event.type == pointer.events[pointer.events.length -1].type && pointer.event.ltime == pointer.events[pointer.events.length -1].ltime)
               {
                  pointer.event = false; 
               }
               else
               { 
                  pointer.event = pointer.events[pointer.events.length -1];
               }
//               pointer.event = events.item(0).getAttribute('name') + '<br/>' + events.item(0).getAttribute('msg');
            }
//            else
//            {
//               pointer.event = false;
//            }
         } 		 

      }

      clearPointers();
//      statusText('Событий: ' + xmlTrace.XMLDocument.documentElement.getElementsByTagName('event').length + '  отображается: ' + pointers.length + ' режим: '+showMode);
//      statusText('Загружено: ' + xmlTrace.XMLDocument.documentElement.getElementsByTagName('trak').length + '  отображается: ' + pointers.length + '     cобытий: ' + xmlTrace.XMLDocument.documentElement.getElementsByTagName('event').length + ' режим: '+showMode);

//      statusText(getWordLang('load')+': ' + xmlTrace.XMLDocument.documentElement.getElementsByTagName('trak').length + ' '+getWordLang('represent')+': ' + pointers.length +' ' +getWordLang('events')+': ' + xmlTrace.XMLDocument.documentElement.getElementsByTagName('event').length +' ' +getWordLang('mode')+': '+showMode);

      statusText(getWordLang('load')+': ' + xmlTrace.XMLDocument.documentElement.getElementsByTagName('trak').length + ' '+getWordLang('represent')+': ' + pointers.length +' ' +getWordLang('mode')+': '+top.getWordLang(showModeCode[showMode]));


      if(pointers.length ==0){showWorking = false;return;}
      if( showMode == 3 && pointers.length > 0)
      {       
         var leftUpConer    = map.createLatLng(maxLat,minLng);
         var rightDownConer = map.createLatLng(minLat,maxLng);
         var pCenter = map.createLatLng((Number(maxLat) + Number(minLat))/2, (Number(maxLng) + Number(minLng))/2);
//         alert(maxLat+','+minLng+'; '+minLat+','+maxLng);

         var p = new Array;
         p[0] = leftUpConer;
         p[1] = rightDownConer;
//         alert(isAllPointsVisible(p));
         map.setCenter(pCenter);
         if(isAllPointsVisible(p))
         {
//            expandAllPoints(p,pCenter);
            expandAllPoints(p);
         }
         else
         {
//            viewAllPoints(p,pCenter);
            viewAllPoints(p);
         }
         createRoute();
         clearTimeout(timer);
	 pointerPos(0);
//	 pointerPos(1);
	 rPlayIndex = 0;
	 rPlaying = false;
	 showWorking = false;
      }
      else
      {
         pointersProcess();
      }
   }
//   document.title = 'xml : ' + xmlTrace.XMLDocument.documentElement.getElementsByTagName('trak').length + '  objects: ' + pointers.length + ' mode: '+showMode + ' showDate: '+ date2string(showDate);
   return;

}

function _createRoute()
{
   for(var i = 0; i < pointers.length; i++)
   {
     linePoints.push(new GLatLng(pointers[i].latitude,pointers[i].longitude));
   }
   if(linePoints.length >0)
   {
         while(linePoints.length > 0)
         { 
            var points = linePoints.splice(0,75);
            if(linePoints.length > 0) points[points.length] = linePoints[0];
            var line   = new GPolyline(points,'0000FF',3);
            map.addOverlay(line);
            line.setPoint();
            lines.push(line);
         }
         linePoints = new Array;
//         goAfterMarkers();
   }
}

//
function createRoute()
{
//alert('createRoute');

var first = true;

   var interrupts = new Array();
   for(var i = 0; i < pointers.length; i++)
   {
      var temp = new GLatLng(pointers[i].latitude,pointers[i].longitude);
      linePoints.push(temp);

//      linePoints.push(new GLatLng(pointers[i].latitude,pointers[i].longitude));
      if(pointers[i].stop > 0)
      {
         stopPoints.push(map.createLatLng(pointers[i].latitude,pointers[i].longitude));
      }

//      var speed = Number(pointers[i].speed);
//      if(i < pointers.length - 2 && Number(pointers[i+1].speed) > speed) speed = Number(pointers[i+1].speed);

      if( 
         (i < pointers.length - 2) 
         && 
         (
            (
//               (Number(pointers[i+1].trun) - Number(pointers[i].trun) > speed * (str2date(pointers[i+1].ltime) - str2date(pointers[i].ltime)) / (1000 * 60 * 60)  )  
               (Number(pointers[i+1].trun) - Number(pointers[i].trun) > 5  )  
               &&
////               ( Math.abs(Number(pointers[i+1].dir) - Number(pointers[i].dir)) > 10 && pointers[i].dir != '' && pointers[i+1].dir != '')  
               ( Math.abs(Number(pointers[i+1].dir) - Number(pointers[i].dir)) > 10 || pointers[i].dir == '' || pointers[i+1].dir == '' )  
            )
            ||
            (
               pointers[i].stop > 0 && pointers[i+1].stop > 0
            )
            ||
            (
               pointers[i].operation == 'LAST' && Number(pointers[i+1].trun) - Number(pointers[i].trun) > 0.2
            )
//            ||
//            (
//               pointers[i].stop > 0 && i > 0 //&& (Number(pointers[i+1].trun) - Number(pointers[i-1].trun) > 0.5  )  
//            )
            ||
            (
               pointers[i+1].operation == 'GPSLOST' 
            )
            ||
            (
               pointers[i+1].operation == 'HOP' 
            )
            ||
            (
               pointers[i].operation == 'STOPINTERVAL' 
            )
//            ||
//            (
//               str2date(pointers[i+1].ltime) - str2date(pointers[i].ltime) > 1000 * 60 * 10
//            )
         )
        )
      {
         interrupts.push(temp);
      }

//if(pointers[i].operation !== '') alert(pointers[i].operation);
//if (i < 5) {alert( Math.abs(Number(pointers[i+1].dir) - Number(pointers[i].dir)) );first=false;}
//if (i < 5) {alert( str2date(pointers[i+1].ltime) - str2date(pointers[i].ltime) );first=false;}

   }

//alert(interrupts.length);

   if(linePoints.length >0)
   {
       while(linePoints.length > 0)
       {
          var points = new Array();
          var interrupt = false;
          while(linePoints.length > 0 && points.length < 25 )
          {
             var point  = linePoints.shift();
	     if(Number(point.latitude) == 0 && Number(point.longitude) == 0) loop;
             points.push(point);
             
             if(interrupts.length > 0 && point == interrupts[0]) // && Number(linePoints[0].trun) - Number(point.trun) > 0.5)
             {
                interrupt = true;
                interrupts.shift();
//alert('interrupt');
//if (first) {alert(Number(linePoints[0].trun) - Number(point.trun));first=false;}
                break;
             }
//first = false;             

          }
          if(linePoints.length > 0 && ! interrupt) points[points.length] = linePoints[0];
          var line   = new GPolyline(points,'0000FF',3);
          map.addOverlay(line);
          line.setPoint();
          lines.push(line);
          if(interrupt && linePoints.length > 0)
          {
             var line   = new GPolyline(new Array(points[points.length - 1],linePoints[0]),'0000FF',0);
             map.addOverlay(line);
             line.setPoint();
             lines.push(line);
          }
      }
      linePoints = new Array;
   }


   if(stopPoints.length >0)
   {
//alert(stopPoints[0]);
      for(var i = 0; i < stopPoints.length; i++)
      {
       var icon   = map.createIcon('/pointers/stop.gif');
       var marker = map.createMarker(stopPoints[i],icon);
       map.addOverlay(marker);
       marker.setPoint(stopPoints[i]);
       stops.push(marker);
      }
      stopPoints = new Array;
   }


}
//

function clearLines()
{
      if(lines.length > 0)
      {
         for(var i = 0; i < lines.length; i++)
         {
            map.removeOverlay(lines[i]);
         } 
         lines = new Array;
      }

      if(typeof(stops) != 'undefined' )
      { 
         if(stops.length > 0)
         {
            for(var i = 0; i < stops.length; i++)
            {
               map.removeOverlay(stops[i]);
            } 
            stops = new Array;
         }
      }
}


function pointersProcess()
{
   setTimeout("pointerPos(0)",10);
   return;
}
//var points1 = new Array;

function chkSecurity(pointer)
{
   if(typeof(security) == 'boolean')
   {
      if(security)
      {
        if(pointer.sos > 0) 
        {
            return true;
        }
        if(pointer.marker){map.removeOverlay(pointer.marker); pointer.marker = false;}
        return false;
      }
      else
      {
         return true;
      }
   }
   else
   {
      return true;
   }
}


function pointerPos(i,direction)
{
   if(!direction)direction = 1;

   if(!pointers[i])
   {
      if(showMode == 3)
      {
         rStop();
         showWorking = false;
	 return;
      }


      goAfterMarkers();
/*
      if(linePoints.length >0)
      {
         while(linePoints.length > 0)
         { 
            var points = linePoints.splice(0,75);
            if(linePoints.length > 0) points[points.length] = linePoints[0];
            var line   = new GPolyline(points,'#FF0000',2);
            map.addOverlay(line);
            line.setPoint();
            lines.push(line);
         }
         linePoints = new Array;
      }
*/
//   bottomPanel.systemStatus( 'xml : ' + xmlTrace.XMLDocument.documentElement.getElementsByTagName('trak').length + '  objects: ' + pointers.length + ' mode: '+showMode + ' overlays: '+ map.original.overlayContainer.childNodes.length + ' - ' + map.original.overlays.length);

      showWorking = false;
      return;
   }

   var pointer = pointers[i];
   
//   try
//   {
//      if(security && pointer.gsm > 0){return;}
//   }
//   catch(e)
//   {
//   }
   
   
   if(Number(pointer.latitude) > 0 && Number(pointer.longitude) && chkSecurity(pointer) )
   {
      if(!pointer.marker)
      {
         var icon;
         if( showMode == 3 )
         {       


/////////            linePoints.push(new GLatLng(pointer.latitude,pointer.longitude));
/////////////////////////////////////////
//               if(i > 1)map.removeOverlay(pointers[i-1].marker);
//               icon   = map.createIcon(pointer.image);

//            if(i < 2  || i == pointers.length -1)
//            if(rPlaying == true)direction = rPlayDirection;
            if((i < 2 && rPlayDirection > 0 && direction > 0) || (i == pointers.length - 2 && direction < 0) )
//            if((i < 2 && rPlayDirection > 0 && direction > 0)  )
            {
               if (i == 0)
	       {
                  icon   = map.createIcon('/pointers/startRoute.gif',32,32);
	       }
	       else
	       {
                  icon   = map.createIcon(pointer.image);
	       }
               var marker = map.createMarker(map.createLatLng(pointer.latitude,pointer.longitude),icon);
               pointer.marker = marker;
               map.addOverlay(marker);
            }
            else
            {
               if(i != pointers.length - 1 ) 
	       {
                  if(pointers[i - direction].marker)
                  {
                     pointer.marker = pointers[i - direction].marker;
                     pointers[i - direction].marker = false;
		  }
		  else
		  {
                     icon   = map.createIcon(pointer.image);
                     var marker = map.createMarker(map.createLatLng(pointer.latitude,pointer.longitude),icon);
                     pointer.marker = marker;
                     map.addOverlay(marker);
		  }
	       }
	       afterMarker(pointer.marker);
//               icon   = map.createIcon('/pointers/point.ico');
            }

            if(i == 0 && pointers.length > 1 && !pointers[pointers.length - 1].marker)
	    {
               var lpointer = pointers[pointers.length - 1];
//               var licon   = map.createIcon(lpointer.image);
               var licon   = map.createIcon('/pointers/stopRoute.gif',32,32);
               var lmarker = map.createMarker(map.createLatLng(lpointer.latitude,lpointer.longitude),licon);
               lpointer.marker = lmarker;
               map.addOverlay(lmarker);	                 	       
               lpointer.marker.setPoint(map.createLatLng(lpointer.latitude,lpointer.longitude));
               goAfterMarkers();
	    }



/////////////////////////////////////////

//            if(i == 0 || i == pointers.length -1)
//            {
//               icon   = map.createIcon(pointer.image);
//            }
//            else
//            {
//               icon   = map.createIcon('/pointers/point.ico');
//            }


         }
         else
         {
            icon   = map.createIcon(pointer.image);
            var marker = map.createMarker(map.createLatLng(pointer.latitude,pointer.longitude),icon);
            pointer.marker = marker;
            map.addOverlay(marker);
         }
//         var marker = map.createMarker(map.createLatLng(pointer.latitude,pointer.longitude),icon);
//         pointer.marker = marker;
//         map.addOverlay(marker);
      }

      if(pointer.marker) pointer.marker.setPoint(map.createLatLng(pointer.latitude,pointer.longitude));

      if(showMode != 3)
      {
         var image='/pointers/empty.ico';

	 if(pointer.dir && pointer.dir != '')
	 {
            var temp = dirImage(pointer.dir);
	    if(temp) image = '/pointers/' + temp;
	 }


         if(pointer.stop > 0)
         {
            image='/pointers/stop.gif';
         }
         if(pointer.gpsfix < 1)
         {
           image='/pointers/gps.gif';
         }
         if(pointer.gsm < 1)
         {
            image='/pointers/gsm.gif';
         }
         if(pointer.sos > 0 && pointer.showSOS == true)
         {
            image='/pointers/sos.gif';
            if(playSound){playSound(soundFile['SOS']);}
         }

	 
         if(pointer.event)appEvents.dispatchEvent('markerEvent',pointer);

         if(pointer.marker.image) 
         {
	    if(pointer.marker.image.src!=image)
            {
	       pointer.marker.setImage(image);
            }
          }
          else
          {
	     pointer.marker.setImage(image);
          }
      }
      else
      {
         if(i == pointers.length - 2)
	 {
            map.removeOverlay(pointer.marker);
	    pointer.marker = false;
	 }
      }

   }


   var t = 100;
   if(showMode == 3)
   {
      rPlayIndex = i;
      if(rPlaying == true)direction = rPlayDirection;

//      if(i == 0)
//      {
//         t = 2000;
//      }
//      else
      {
         t = 60* 1000 / pointers.length * 1/rAcceleration;
         if(t < 20)   t = 20;
         if(t > 1000) t = 1000;
      }
      if(rPlayIndex >= pointers.length - 1)
      {
//         rStop();
      }
   }
   
   if(showMode != 3 || rPlaying == true)
   {
      i = i + direction;
      rPlayTimer = setTimeout("pointerPos(" + i + "," + direction + ")",t);
   }
}

function dirImage(dir)
{
   if(!dir) return;
   dir = Number(dir);
   if(dir >= 337.5 || dir < 22.5)  return '000.gif';
   if(dir >= 22.5  && dir < 67.5)  return '045.gif';
   if(dir >= 67.5  && dir < 112.5) return '090.gif';
   if(dir >= 112.5 && dir < 157.5) return '135.gif';
   if(dir >= 157.5 && dir < 202.5) return '180.gif';
   if(dir >= 202.5 && dir < 247.5) return '225.gif';
   if(dir >= 247.5 && dir < 292.5) return '270.gif';
   if(dir >= 292.5 && dir < 337.5) return '315.gif';
}


function rPlay()
{
//   alert('rplay');
   rPlaying = true;
   if(!pointers[rPlayIndex].marker)rPlayIndex = 0;
   pointerPos(rPlayIndex + rPlayDirection, rPlayDirection);
   
}

function rPause()
{
//   alert('rPause');
   rAcceleration = 1;
   rPlaying = false;
   clearTimeout(rPlayTimer);
}

function rStop(end)
{
//   alert('rStop');
   rPlaying = false;
   clearTimeout(rPlayTimer);

//   pointer.marker = pointers[i-1].marker;
//   pointers[i-1].marker = false;

//  pointers[1].marker = pointers[rPlayIndex].marker;
   if(rPlayIndex != pointers.length - 1 && rPlayIndex != 0 && pointers[rPlayIndex])
   {
   map.removeOverlay(pointers[rPlayIndex].marker);
   pointers[rPlayIndex].marker = false;
   }
//  pointers[1].marker.setPoint(map.createLatLng(pointers[1].latitude,pointers[1].longitude));
//   pointerPos(1);
   if(pointers[1] && pointers[1].marker)
   {
   map.removeOverlay(pointers[1].marker);
   pointers[1].marker = false;
   }
   
   if(end == 1)
   {
//      rShow(pointers.length - 2); 
      rPlayIndex = pointers.length - 1;
   }
   else
   {
      rPlayIndex = 0;
   }
   rAcceleration = 1;
   rPlayDirection = 1;
   rChange('pause');
   if(pointers[rPlayIndex]) afterMarker(pointers[rPlayIndex].marker);
}

function rStep(step)
{
//   alert('rStep('+step+')' + ' rPlayIndex = '+rPlayIndex);
//   statusText('rStep('+step+')' + ' rPlayIndex = '+rPlayIndex+' length='+pointers.length);
   if(!step)    step =  1;
   if(step >= 0)step =  1;
   if(step < 0) step = -1;

//   if(!pointers[rPlayIndex].marker )
//   {
//       rPlayIndex = 0;
//       if(step < 0) rPlayIndex = pointers.length - 1;
//   }

   pointerPos(rPlayIndex + step,step);  
}

function rSpeed(speed)
{
//   alert('rSpeed(' + speed +')');
//   rStep(speed);
   if(!speed)    speed =  1;
   if(speed >= 0)speed =  1;
   if(speed < 0) speed = -1;

   if(speed == rPlayDirection)
   {
      rAcceleration =rAcceleration * 2;
      if(rAcceleration > 32)rAcceleration = 1;
   }

   rPlayDirection = speed;
//   pointerPos(rPlayIndex + speed,speed);
}

function rShow(index)
{
   rPlaying = false;
   clearTimeout(rPlayTimer);
   if(!index){return;}
   if(index == rPlayIndex){return;}
   if(index == 0 || index == pointers.length - 1)return;
   if(rPlayIndex == 0 || rPlayIndex == pointers.length - 1)
   {
      pointerPos(1,1);
   }
   if(rPlayIndex != index)
   {
   pointers[index].marker = pointers[rPlayIndex].marker;
   pointers[rPlayIndex].marker = false;
   if(pointers[index].marker) pointers[index].marker.setPoint(map.createLatLng(pointers[index].latitude,pointers[index].longitude));
   rPlayIndex = index;
   }

   rAcceleration = 1;
   rPlayDirection = 1;
   afterMarker(pointers[rPlayIndex].marker);
   rChange('pause');
}


function pointersPlay()
{
   clearTimeout(playTimer);
   playTimer = setTimeout("pointerDisplay(0)",100);
   return;
}


function pointerDisplay(i)
{
   if(showMode == 3 || showMode == 4 ){}else{clearTimeout(playTimer);return;}

   if(!pointers[i])
   {
      playTimer = setTimeout("pointerDisplay(0)",100);
      return;
   }

   var pointer = pointers[i];
   if(pointer.marker)
   {
         if(i > 1) 
         {
            pointers[i-1].marker.hide();
            if(pointers[i-1].point){pointers[i-1].point.show();}
         }
         if(pointer.point){pointer.point.hide();}
         pointer.marker.show();
   }

   i++;
   playTimer = setTimeout("pointerDisplay(" + i + ")",500);
}


function goAfterMarkers()
{
      switch(showMode)
      {
      case 0 : 
         break;
      case 1 :
         if(pointers.length == 1 && pointers[0].marker){afterMarker(pointers[0].marker);}
         break;
      case 2:
         viewAllMarkers();
         break;
      case 3:
         if(pointers.length > 0)
         {
         viewAllMarkers();
         }
         break;
      case 4 :
         if(pointers.length == 1 && pointers[0].marker){afterMarker(pointers[0].marker);}
         break;
      case 5:
         if(pointers.length == 1 && pointers[0].marker){afterMarker(pointers[0].marker);}
         break;
      default:;
      }
}


function afterMarker(marker)
{
  if(!isMarkerVisible(marker))
  {
     map.setCenter(marker.getPoint());  
  }
}

function viewAllMarkers()
{
//   var center = map.getCenter();
   var zoom   = map.getZoom();
   while(!isAllMarkersVisible())
   {
      zoom--;
      if(zoom < 1){return;}
//      map.setCenter(center,zoom);
      map.setZoom(zoom);
      setTimeout('viewAllMarkers()',10);
      return;
   }
}

function isAllMarkersVisible()
{
   var ret = true;
   for(var i = 0; i <pointers.length; i++)
   {
      ret = ret && isMarkerVisible(pointers[i].marker);
   }
   return ret;
}

function isMarkerVisible(marker) 
{
   if(!marker) return true;
   var bounds = map.getBounds();
//   alert(D(bounds.Top) +"\n"+ D(bounds.Bottom) +"\n"+D(marker.getPoint()));
   var rc = bounds.contains(marker.getPoint());
   return rc;
}

function isPointVisible(point)
{
  if(!point) return true;
   var bounds = map.getBounds();
   var rc = bounds.contains(point);
   return rc;
}

function isAllPointsVisible(points)
{
   var ret = true;
   for(var i = 0; i <points.length; i++)
   {
      ret = ret && isPointVisible(points[i]);
   }
   return ret;
}

function viewAllPoints(points,pCenter)
{
   if(pCenter) map.setCenter(pCenter);
   var zoom   = map.getZoom();
   while(!isAllPointsVisible(points))
   {
      zoom--;
      if(zoom < 1){return;}
//      map.setCenter(center,zoom);
      map.setZoom(zoom);
//      setTimeout('viewAllMarkers()',10);
//      return;
   }
}

function expandAllPoints(points,pCenter)
{
   if(pCenter) map.setCenter(pCenter);
   var zoom   = map.getZoom();
   while(isAllPointsVisible(points))
   {
      zoom++;
      if(zoom > 16){return;}
//      map.setCenter(center,zoom);
      map.setZoom(zoom);
//      setTimeout('viewAllMarkers()',10);
//      return;
   }
   map.setZoom(zoom - 1);
}



//function createIcon(url)
//{
//   var icon;
//
//   icon = new GIcon();
//   icon.image = "http://gps.vi-tel.ru"+url;
//   icon.shadow = "http://gps.vi-tel.ru"+url;
//   icon.iconSize = new GSize(24, 24);
//   icon.shadowSize = new GSize(24, 24);
//   icon.iconAnchor = new GPoint(12, 12);
//   icon.infoWindowAnchor = new GPoint(12, 12);
//   return icon;
//}


//function createMarker(point,icon) 
//{  
//   var marker = new GMarker(point,{icon: icon, draggable: false});  
//
//   GEvent.addListener(marker, "click", function() {marker.openInfoWindowHtml(getDescription(marker)); });  
//   return marker;
//}

/*function createPoint(point,icon) 
{  
   var marker = new VMarker(point,icon);  
   GEvent.addListener(marker, "click", function() {marker.openInfoWindowHtml(getPointDescription(marker)); });  
   return marker;
}*/

function MListener()
{
   this.events = new Array;
   this.trakid;
   this.icon;
   this.name;
}


function MEvent()
{
   this.id;
   this.type;
   this.triggered;
   this.message;
   this.name;
   this.ltime;
   this.latitude;
   this.longitude;
   this.trakid;
}



function createPointer(trakid,marker)
{
   this.marker      = marker;

   this.trakid      = trakid;
   this.IMEI        = false;
   this.stime       = '0000-00-00 00:00:00';
   this.ltime       = '0000-00-00 00:00:00';
   this.gpsfix      = '1';
   this.gsm         = '1';
   this.stop        = '0';
   this.sos         = '0';
   this.showSOS     = true;
   this.latitude    = '';
   this.longitude   = '';
   this.altitude    = '';
   this.speed       = '';
   this.dir         = '';
   this.trun        = '';
   this.image       = '';
   this.line        = false;
   this.point       = false;
   this.event       = false;
   this.events      = new Array;

   this.operation   = '';

   this.name        = '';
   this.description = '';

   this.used        = 0;
}

function setShowMode(mode)
{
   if(mode!='')
   {
      if(mode != showMode)
      {
         showMode = Number(mode);
         if(request)request.abort();
         clearTimeout(timer);
         clearLines();
         clearUsedPointers();
         clearPointers();  
//         if(Number(mode)==5){xmlTrakFilter.loadXML('<xml><traks /></xml>');}
         if(Number(mode) == 0 || Number(mode) == 1 || Number(mode) == 2 )
         {
             dataTimer();         
         }
         appEvents.dispatchEvent('changeMode','changeMode');	
      }

      if(Number(mode) == 5)
      {
         setReportMode(true);
         clearTimeout(timer);
      }
      else
      {
         if(showMode == 5)
         {
            setReportMode();
         }
      }
      
 

//      if(Number(mode) == 0 || Number(mode) == 1 || Number(mode) == 2 )
//      {
//          clearTimeout(timer);
//          dataTimer();         
//      }


//      showMode = Number(mode);
   }
//   appEvents.dispatchEvent('changeMode','changeMode');	
   return showMode;
}


function setReportMode(visible)
{
   if(visible)
   {
      e('map').style.width = 50+'%';
      e('map').style.left  = 50+'%';
      map.checkResize();
      e('report').style.display  = '';
      e('report').src  = '/objs/report.html?startShowDate='+date2string(startShowDate)+'&stopShowDate='+date2string(stopShowDate); //+'&filter='+trakFilter();
   }
   else
   {
      e('map').style.width = 100+'%';
      e('map').style.left  = 0+'px';
      map.checkResize();
      e('report').style.display  = 'none';
      e('report').src  = '/empty.html';
   }
   capclick();
}



function _getPointer(IMEI)
{
   for(var i = 0; i < pointers.length; i++)
   {
      if(pointers[i].IMEI == IMEI)
      {
         return pointers[i];
      }
   }
   return false;
}

function getPointer(trakid)
{
   for(var i = 0; i < pointers.length; i++)
   {
      if(pointers[i].trakid == trakid)
      {
         return pointers[i];
      }
   }
   return false;
}



function _getPointerByTime(IMEI,stime)
{
   for(var i = 0; i < pointers.length; i++)
   {
      if((pointers[i].IMEI == IMEI) && (pointers[i].stime == stime))
      {
         return pointers[i];
      }
   }
   return false;
}

function getPointerByTime(trakid,ltime)
{
   for(var i = 0; i < pointers.length; i++)
   {
      if((pointers[i].trakid == trakid) && (pointers[i].ltime == ltime))
      {
         return pointers[i];
      }
   }
   return false;
}


function getPointerByMarker(marker)
{
   for(var i = 0; i < pointers.length; i++)
   {
      if(pointers[i].marker == marker)
      {
         return pointers[i];
      }
   }
   return false;
}

function getPointerByPoint(point)
{
   for(var i = 0; i < pointers.length; i++)
   {
      if(pointers[i].point == point)
      {
         return pointers[i];
      }
   }
   return false;
}


function clearUsedPointers()
{
   for(var i = 0; i < pointers.length; i++)
   {
      pointers[i].used = 0;
   }
}

function clearPointers()
{
   var tmp = new Array;
   for(var i = 0; i < pointers.length; i++)
   {
      if(pointers[i].used == 0)
      {
         if(pointers[i].marker) pointers[i].marker.removeInfoWindow();
         map.removeOverlay(pointers[i].marker);
         pointers[i].marker = false;

         if(pointers[i].line)
         {
            map.removeOverlay(pointers[i].line);
            pointers[i].line = false;
         }

         if(pointers[i].point)
         {
            map.removeOverlay(pointers[i].point);
            pointers[i].point = false;
         }


         pointers[i].trakid = '';
      }
      else
      {
         tmp[tmp.length] = pointers[i];
      }
   }
   pointers = tmp;
}

function markerClick(marker)
{
   var pointer = getPointerByMarker(marker);
   if(typeof(getDescription) == 'function')
   {
      getDescription(pointer);
   }
   else
   {
      __getDescription(pointer);
   }
   appEvents.dispatchEvent('markerClick',pointer);
}


function __getDescription(pointer)
{
//   var pointer = getPointerByMarker(marker);
   if(pointer)
   {
   	  var markerDescription = '<span style="font-size:8pt;"> <br/>'+pointer.stime+'<br/>';
   	  if(infoWindowParams['name']){markerDescription += pointer.name+'<br/>';}
   	  if(infoWindowParams['description']){markerDescription += pointer.description+'<br/>';}
   	  if(infoWindowParams['address']){markerDescription += pointer.IMEI+'<br/>';}
   	  if(infoWindowParams['coords']){markerDescription +=pointer.latitude+'<br/>'+pointer.longitude+'<br/>';}
   	  markerDescription +='<br/>conn='+pointer.gsm+pointer.gpsfix+pointer.stop;
   	  markerDescription +='<br/>'+pointer.event;
   	  markerDescription +='</span>';
          pointer.marker.openInfoWindow(markerDescription);
   	  return markerDescription;
   }
   else
   {
      return 'UNKN0WN';
   }
}

function getPointDescription(point)
{
   var pointer = getPointerByPoint(point);
   if(pointer)
   {
      return '<span style="font-size:8pt;"><br/>IMEI='+pointer.IMEI+'<br/>'+pointer.stime+'<br/>'+
             pointer.name+'<br/>'+pointer.description+'<br/>'+
             pointer.latitude+'<br/>'+pointer.longitude+
             '</span>';
   }
   else
   {
      return 'UNKN0WN';
   }
}




function selectMap(type)
{
alert(parseInt(type));
//   alert(map.getCurrentMapType());
   if(!map)
   {
      createGMap(type);
   }

   var center = map.getCenter();
   var zoom   = map.getZoom();
   switch(type)
   {
      case 'G_NORMAL_MAP':
         map.setCenter(center, zoom, G_NORMAL_MAP);
         break;
      case 'G_SATELLITE_MAP':
         map.setCenter(center, zoom, G_SATELLITE_MAP);
         break;
      case 'G_HYBRID_MAP':
         map.setCenter(center, zoom, G_HYBRID_MAP);
         break;
      case 'I_NORMAL_MAP':
         map.setCenter(center, zoom, G_NORMAL_MAP);
         break;
      default:
         map.setCenter(center, zoom, G_NORMAL_MAP);
   }
}
function GUnload()
{
  return 0;
}

function resizeApp() 
{
	var offsetTop = 0;
	var offsetLeft = 0;
	var mapElem = e("map");

	for (var elem = mapElem; elem; elem = elem.offsetParent) {
		offsetTop += elem.offsetTop;
	}
	var height = getWindowHeight() - offsetTop - 10;
	var width = getWindowWidth() - offsetLeft - 15;

	if (height >= 0) {
		mapElem.style.height = height + "px";
	}

	if (width >= 0) {
		mapElem.style.width = width + "px";
	}
}

function statusText(text)
{
  if(typeof(bottomPanel.systemStatus) == 'function')  bottomPanel.systemStatus(text);
}

