
  //construct body
  jQuery.fn.devices = function(options,clientScriptPath,map,s) 
  { 
      var activeAddressArray  = [];
      var identToNameArray    = [];
      var gpshandler = new gpsHandler();
      gpshandler.setMap(map);
      var connection  = new Connection(gpsSettings['jmsConnection'], gpshandler);
      dm = this;
     
     
      var settings = jQuery.extend(
      {   
          classDevicePanel        :"slDevPan",   
          classDevice             :"slDev",
          classDeviceName         :"slDevName",
          classTrackButton        :"slTrackButton",
          classActiveTrackButton  :"slActiveTrackButton",
          classAddressBar         :"slAddressBar",
          classActiveAddressBar   :"slActiveAddressBar",
          classStatusBarSenzor    :"slStatusBarSenzor" ,
          classStatusBarGps       :"slStatusBarGps" ,
          classSenzorBit          :"slSenzorBit" ,
          classSenzorBitActive    :"slSenzorActive",
          classSenzorBitNotActive :"slSenzorInActive",
          classGpsStatus          :"slGpsStatus" ,
          classGpsStatusActive    :"slGpsStatusActive" ,
          classGpsStatusNotActive :"slGpsStatusInActive" ,
          classSenzorHint         :"slSenzorHint" ,
          classSubMenu            :"slSubMenu",
          classMenuAutoZoom       :"slMenuAutoZoom",
          classMenuActiveAutoZoom :"slMenuActiveAutoZoom",
          classMenuSelectDevices  :"slMenuSelectDevices"
                   
      }
      , options);
      
      addSubMenu();
      
     gpshandler.addUserStatus(s);
       
      //parse devices load from xml
      $jq.get(clientScriptPath,{},function(xml)
      {
          
          if (window.ActiveXObject)
          {
            			var xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
            			xmlDoc.async="false";
            			xmlDoc.loadXML(xml);
          }
          // code for Mozilla, Firefox, Opera, etc.
          else if (document.implementation && document.implementation.createDocument)
          {
            		  var parser	=	new DOMParser();
            			var xmlDoc =	parser.parseFromString(xml,"text/xml");
          }
          myNodes = xmlDoc.getElementsByTagName("devicelist"); 
          for(var counter=0;counter<myNodes.length;counter++) 
          {
              itemNode = myNodes.item(counter);
              var dev_ident = itemNode.getElementsByTagName("deviceident").item(0).firstChild.nodeValue; 
              var dev_name  = itemNode.getElementsByTagName("devicename").item(0).firstChild.nodeValue;
              if (itemNode.getElementsByTagName("deviceehis").item(0) != null)
                  var dev_ehis  = itemNode.getElementsByTagName("deviceehis").item(0).firstChild.nodeValue;
              else
                  dev_ehis  = "Neznan naslov";    
              identToNameArray[dev_ident] = dev_name;    
              adddevice(dev_ident,dev_name,dev_ehis);
             
          }
          if (counter > 0)
          {            
              gpshandler.setIdentToNameArray(identToNameArray);
          }    
      });
      
      function addSubMenu()
      {
           var activeAutoZoom = false;
           var activeSelectAll = false;
           var menu = document.createElement('div');
           var oTextAutoZoom = document.createElement('div');
           jQuery(oTextAutoZoom).html("auto zoom");
           var oTextSelectDevices = document.createElement('div');
           jQuery(oTextSelectDevices).html("select all");
           
           dm.append(menu);
           jQuery(menu).append(oTextAutoZoom);
           jQuery(menu).append(oTextSelectDevices);
           
            
           jQuery(menu).addClass(settings.classSubMenu);
           jQuery(oTextAutoZoom).addClass(settings.classMenuAutoZoom);
           jQuery(oTextSelectDevices).addClass(settings.classMenuSelectDevices);  
           
           
           
           // auto zoom on click
           jQuery(oTextAutoZoom).click(function() 
           {
                if  (! activeAutoZoom)
                {
                  activeAutoZoom = true;
                  jQuery(oTextAutoZoom).addClass(settings.classMenuActiveAutoZoom);
                  jQuery(oTextAutoZoom).removeClass(settings.classMenuAutoZoom);
                  gpshandler.autozoom(true);
                 
          
                }
                else
                {
                  activeAutoZoom = false;
                  jQuery(oTextAutoZoom).addClass(settings.classMenuAutoZoom);
                  jQuery(oTextAutoZoom).removeClass(settings.classMenuActiveAutoZoom);
                  gpshandler.autozoom(false);
                }
                  
           });
           
           //select devices on click
           jQuery(oTextSelectDevices).click(function()
           {
                if  (! activeSelectAll)
                {
                  activeSelectAll = true;
                  jQuery(this).html("unselect all");
                  jQuery("div[@id*=trackbutton_]").each(function(){
                       
                      if (jQuery(this).attr("className") == settings.classTrackButton)
                      {
                            jQuery(this).click();
                      } 
                      
                        
                  });   
                }
                else
                {
                  activeSelectAll = false;
                  jQuery(this).html("select all");
                  jQuery("div[@id*=trackbutton_]").each(function(){
                       
                      if (jQuery(this).attr("className") == settings.classActiveTrackButton)
                      {
                            jQuery(this).click();
                      } 
                      
                        
                  });   
                }
            
           });
      }
      
       
      //private func add device
      function adddevice (id,name,dev_ehis)
      {
           var device = document.createElement('div');
           var oText = document.createElement('div');
           device.id = id;
           oText.id  = "dev_name_"+id;
           
           
           jQuery(oText).addClass(settings.classDeviceName);
           jQuery(device).append(oText);
           jQuery(oText).html(name);
           
           jQuery(device).addClass(settings.classDevice);
           dm.append(device);  
           dm.addClass(settings.classDevicePanel);
           
           addTrackButon(device,id);
           addAddressBar(device,dev_ehis,id);
           addStatusBarSenzor(device,id);
           addStatusBarGps(device,id);
           
           // device on click
           jQuery(device).click(function() 
           {
                
           });
      }
      
      function addStatusBarGps(device,id)
      {
          var statBarGps = document.createElement('div');
          var s1      = document.createElement('div');
          var s2      = document.createElement('div');
          statBarGps.id = 'statussbar_gps_'+id;
          s1.id      = 'senzor_gps1_'+id;   
          s2.id      = 'senzor_gps2_'+id;
          jQuery(s1).html('gps');
          jQuery(s2).html('tetra');
          jQuery(statBarGps).append(s1);
          jQuery(statBarGps).append(s2);
          jQuery(s1).addClass(settings.classGpsStatus);
          jQuery(s2).addClass(settings.classGpsStatus);
          jQuery(statBarGps).addClass(settings.classStatusBarGps);
          jQuery(device).append(statBarGps);
          
      }
      
      jQuery.fn.devices.setGpsColor = function(deviceid,type,stat)
      {
          if ( jQuery(document.getElementById('senzor_gps1_'+deviceid)) != null &&  jQuery(document.getElementById('senzor_gps2_'+deviceid)) != null  )
          {
              if (type=='GPS')
              {
                  if (stat == 0)
                  {
                    jQuery(document.getElementById('senzor_gps1_'+deviceid)).addClass(settings.classGpsStatusNotActive);
                    jQuery(document.getElementById('senzor_gps1_'+deviceid)).removeClass(settings.classGpsStatusActive);
                  }
                  else
                  {
                    jQuery(document.getElementById('senzor_gps1_'+deviceid)).addClass(settings.classGpsStatusActive);
                    jQuery(document.getElementById('senzor_gps1_'+deviceid)).removeClass(settings.classGpsStatusNotActive);
                  }  
              }
              
              if (type=='TETRA')
              {
                  if (stat == 0)
                  {
                    jQuery(document.getElementById('senzor_gps2_'+deviceid)).addClass(settings.classGpsStatusNotActive);
                    jQuery(document.getElementById('senzor_gps2_'+deviceid)).removeClass(settings.classGpsStatusActive);
                  }
                  else
                  {
                    jQuery(document.getElementById('senzor_gps2_'+deviceid)).addClass(settings.classGpsStatusActive);
                    jQuery(document.getElementById('senzor_gps2_'+deviceid)).removeClass(settings.classGpsStatusNotActive);
                  }  
              }
          }         
      }
      
      function gpsOff(deviceid)
      {  
          jQuery(document.getElementById('senzor_gps1_'+deviceid)).addClass(settings.classGpsStatus);
          jQuery(document.getElementById('senzor_gps1_'+deviceid)).removeClass(settings.classGpsStatusActive);
          jQuery(document.getElementById('senzor_gps1_'+deviceid)).removeClass(settings.classGpsStatusNotActive);
          jQuery(document.getElementById('senzor_gps2_'+deviceid)).addClass(settings.classGpsStatus);
          jQuery(document.getElementById('senzor_gps2_'+deviceid)).removeClass(settings.classGpsStatusActive);
          jQuery(document.getElementById('senzor_gps2_'+deviceid)).removeClass(settings.classGpsStatusNotActive);
      }
      
      //senzor status
      function addStatusBarSenzor(device,id)
      {
          
           
           var statBarSenzor = document.createElement('div');
           var hint    = document.createElement('div');
           var s1      = document.createElement('div');
           var s2      = document.createElement('div');
           var s3      = document.createElement('div');
           var s4      = document.createElement('div');
           var s5      = document.createElement('div');
           var s6      = document.createElement('div');
           var s7      = document.createElement('div');
           var s8      = document.createElement('div');
          
           hint.id          = 'statussbar_hint_'+id;
           statBarSenzor.id = 'statussbar_'+id;
           
           s1.id      = 'senzor_1_'+id;   
           s2.id      = 'senzor_2_'+id;
           s3.id      = 'senzor_3_'+id;
           s4.id      = 'senzor_4_'+id;
           s5.id      = 'senzor_5_'+id;
           s6.id      = 'senzor_6_'+id;
           s7.id      = 'senzor_7_'+id;
           s8.id      = 'senzor_8_'+id;
           
           
           jQuery(statBarSenzor).append(hint);
           jQuery(statBarSenzor).append(s1);
           jQuery(statBarSenzor).append(s2);
           jQuery(statBarSenzor).append(s3);
           jQuery(statBarSenzor).append(s4);
           jQuery(statBarSenzor).append(s5);
           jQuery(statBarSenzor).append(s6);
           jQuery(statBarSenzor).append(s7);
           jQuery(statBarSenzor).append(s8);
           
           jQuery(s1).addClass(settings.classSenzorBit);
           jQuery(s2).addClass(settings.classSenzorBit);
           jQuery(s3).addClass(settings.classSenzorBit);
           jQuery(s4).addClass(settings.classSenzorBit);
           jQuery(s5).addClass(settings.classSenzorBit);
           jQuery(s6).addClass(settings.classSenzorBit);
           jQuery(s7).addClass(settings.classSenzorBit);
           jQuery(s8).addClass(settings.classSenzorBit);
            
           jQuery(hint).addClass(settings.classSenzorHint);
           jQuery(statBarSenzor).addClass(settings.classStatusBarSenzor);
           jQuery(device).append(statBarSenzor);
           
           jQuery(statBarSenzor).mouseover(function()
           {
                 //alert("mo");
                 jQuery(hint).show();
                 
           })
           
           jQuery(statBarSenzor).mouseout(function()
           {
                 //alert("mot");
                 jQuery(hint).hide();
           })  
      }
      
      function senzorsOff(deviceid)
      {  
          
           jQuery(document.getElementById('statussbar_hint_'+deviceid)).html('');
           for (var i=1; i<9; i++) 
           {
              jQuery(document.getElementById('senzor_'+i+'_'+deviceid)).removeClass(settings.classSenzorBitActive);
              jQuery(document.getElementById('senzor_'+i+'_'+deviceid)).removeClass(settings.classSenzorBitNotActive);
              jQuery(document.getElementById('senzor_'+i+'_'+deviceid)).addClass(settings.classSenzorBit);
              
              
           }
      }
      
      jQuery.fn.devices.setSenzorColor = function(deviceid,bitnum,bitstat)
      {
          if (bitstat == 0)
          {
              jQuery(document.getElementById('senzor_'+bitnum+'_'+deviceid )).addClass(settings.classSenzorBitNotActive);
              jQuery(document.getElementById('senzor_'+bitnum+'_'+deviceid )).removeClass(settings.classSenzorBitActive);
          }
              
          else if (bitstat == 1)  
          {
              jQuery(document.getElementById('senzor_'+bitnum+'_'+deviceid )).addClass(settings.classSenzorBitActive);
              jQuery(document.getElementById('senzor_'+bitnum+'_'+deviceid )).removeClass(settings.classSenzorBitNotActive);
          }  
              
          else
          alert('Napačen status bita !');
      }
      
      
      jQuery.fn.devices.setSenzorHint = function(deviceid,hint)
      {
          jQuery(document.getElementById('statussbar_hint_'+deviceid )).html(hint); 
      }
      
      //private func add addtess ehis bar     
      function addAddressBar(device,dev_ehis,id)
      {  
           
           var activeAddressBar = false;
           var addressBar = document.createElement('div');
            
           addressBar.id = 'addressbar_'+id;
           jQuery(addressBar).addClass(settings.classAddressBar);
           jQuery(addressBar).html(dev_ehis);
           jQuery(device).append(addressBar);
           
           jQuery(addressBar).click(function() 
           {
                
                for (var i=0; i<activeAddressArray.length; i++) 
                {
                      jQuery("#addressbar_"+activeAddressArray[i]).removeClass(settings.classActiveAddressBar);
                      jQuery("#addressbar_"+activeAddressArray[i]).addClass(settings.classAddressBar);
                      if ("addressbar_"+activeAddressArray[i] != this.id) 
                      {
                            activeAddressBar = false;
                      }
                      else
                      {
                          activeAddressBar = true;
                      }
                      gpshandler.removeInfoDevice(activeAddressArray[i]);    
                      activeAddressArray.splice(i,1);
                }
                   
                if  (! activeAddressBar)
                {
                  
                  //alert("add");
                  activeAddressBar = true;
                  jQuery(addressBar).addClass(settings.classActiveAddressBar);
                  jQuery(addressBar).removeClass(settings.classAddressBar);
                  activeAddressArray.push(id);
                  gpshandler.addInfoDevice(id);
                }
                else
                {
                  //alert("remove");
                  activeAddressBar = false;
                  jQuery(addressBar).addClass(settings.classAddressBar);
                  jQuery(addressBar).removeClass(settings.classActiveAddressBar);
                  //activeAddressArray.pop(id);
                  for (var i = 0; i < activeAddressArray.length; i++)
                  {
                      if (activeAddressArray[i] == id)
                      {
                          activeAddressArray.splice(i,1);
                      }
                  }
                  gpshandler.removeInfoDevice(id);
                  $jq("#mytabs").toggle('slow');;
                   
                }
           });
           
      }

      //privete function add track mode
      function addTrackButon(device,id)
      {
          var active = false;
          var trckbtn = document.createElement('div');
          trckbtn.id = 'trackbutton_'+id;
          jQuery(trckbtn).addClass(settings.classTrackButton);
          jQuery(device).append(trckbtn);
          
          //track btn on click
          jQuery(trckbtn).click(function() 
          {
              if  (! active)
              {
                  active = true;
                  jQuery(trckbtn).addClass(settings.classActiveTrackButton);
                  jQuery(trckbtn).removeClass(settings.classTrackButton);
                  if (gpshandler.getNumberOfActiveDevices() == 0)
                    connection.start(); //  = new Connection(gpsSettings['jmsConnection'], gpshandler);
                    
                  gpshandler.addDevice(device.id);
                  //var d = gpshandler.getDevice(device.id);
                  connection.sendMessage('topic://' + device.id, device.id, 'listen');
              }
              else
              {
                  active = false;
                  jQuery(trckbtn).addClass(settings.classTrackButton);
                  jQuery(trckbtn).removeClass(settings.classActiveTrackButton);
                  connection.sendMessage('topic://' + device.id, device.id, 'unlisten');
                  gpshandler.removeDevice(device.id);
                  if (gpshandler.getNumberOfActiveDevices() == 0)
                    connection.stop();
                    
                  senzorsOff(device.id);
                  gpsOff(device.id);
              }
          });
           
      }
  
  }
      
  // position handler
  function gpsHandler()
  {
      //var connection  = new Connection(gpsSettings['jmsConnection'], this);
      //alert('this = ' + this);
      var trackvehiclesLayer = null;
      var map = null;
      var positionsArrayLength = 3; // dolzina sledi (stevilo shranjenih pozicij)
      var devicesArray  = new Array();
      var autozoomOn = false;
      var deviceIdentToNameArray = null;
      var arrayInfoDevices = [];
      var sensorToDescriptionArray = null;
      var sensorToColorArray = null;
      var userstatus = null;
      
      this.handleGpsPosition = handleGpsPosition;
      this.addDevice = addDevice;
      this.removeDevice = removeDevice;
      this.getDevice = getDevice;
      this.setMap = setMap;
      this.autozoom = autozoom;
      this.createInfoTable = createInfoTable;
      this.addInfoDevice = addInfoDevice; 
      this.removeInfoDevice = removeInfoDevice;
      this.setIdentToNameArray = setIdentToNameArray;
      this.getLastPositionFromDatabase = getLastPositionFromDatabase;
      this.getNumberOfActiveDevices = getNumberOfActiveDevices;
      this.addUserStatus = addUserStatus;
     
      function addUserStatus(s)
      {
          userstatus = s;
      }
      
      function device(ident, positions)
      {
          var markerInf = null;
          var markerIndex = 0;
          
          this.ident = ident;
          this.positions = positions;
          
          this.createMarkers = createMarkers;
          this.moveMarkers = moveMarkers;
          this.destroyMarkers = destroyMarkers;
          this.addPositionToDevice = addPositionToDevice;
          this.setDigitalSensor = setDigitalSensor;
          this.setInfoPopUp = setInfoPopUp;
          this.rotateImg = rotateImg;
          this.setMarkerLabelBgColor = setMarkerLabelBgColor;
          this.setMarkerLabelBorder = setMarkerLabelBorder;
         
          
          var markersArray = new Array();  

          popupInfoOn    = false;
        
          
          function addPositionToDevice(position)
          {
              positions.addPosition(position);
          }
          
          function createMarkers()
          {
            //createMarker(OpenLayers.Util.getImagesLocation() + 'marker-uparrow.gif', 21, 35);
            createMarker(OpenLayers.Util.getImagesLocation() + 'marker-uparrow.png', 21, 35);
            //createMarker('../image/trace_icons/marker-uparrow.png', 21, 25);
            //createMarker('../image/trace_icons/marker-uparrow.png', 21, 25);
            createMarkerLabel(ident);
            setInfoPopUp();
            
          }
          
          function createMarker(icon_url, icon_w, icon_h)
          {
            var size = new OpenLayers.Size(icon_w,icon_h);
            var offset = new OpenLayers.Pixel(-(size.w/2), -(size.h/2));
            var icon = new OpenLayers.Icon(icon_url,size,offset);
            var marker = new OpenLayers.Marker(new OpenLayers.LonLat(0,0),icon);
            markersArray.push(marker);
            /*//testno
            var mrkTst = markersArray[0];
            markersArray[0] = markersArray[1];
            markersArray[1] = mrkTst;
            //testno end
            */
      	    trackvehiclesLayer.addMarker(marker);
          }
          
          function createMarkerLabel(ident)
          {
            var markerLabel = new OpenLayers.Marker.MarkerLabel(new OpenLayers.LonLat(0,0),'red',1,'white');
            markerLabel.setText(deviceIdentToNameArray[ident]);
            markerLabel.setMargin(8);
            markersArray.push(markerLabel);
      	    trackvehiclesLayer.addMarker(markerLabel);
          }
          
          function moveMarkers()
          {
            var firstPos = positions.getPosition(0);
            moveMarkerLabel(firstPos);
            
            if (markerIndex > 0)
              markerIndex = 0;
              
            firstPos.marker = markersArray[markerIndex];
            rotateImg(markerIndex);
            moveMarker(markerIndex,firstPos);
              
            markerIndex++;
          }
          
          function moveMarker(markerPos, position)
          {
            var point = new OpenLayers.Geometry.Point(position.x, position.y);
            var point_merc = OpenLayers.Projection.transform(point, "epsg:4326", "epsg:54004");
            
            markersArray[markerPos].moveToLonLat(new OpenLayers.LonLat(point_merc.x,point_merc.y));
          }
          
          function moveMarkerLabel(position)
          {
            var point = new OpenLayers.Geometry.Point(position.x, position.y);
            var point_merc = OpenLayers.Projection.transform(point, "epsg:4326", "epsg:54004");
            
            markersArray[markersArray.length - 1].moveToLonLat(new OpenLayers.LonLat(point_merc.x,point_merc.y));
          }
          
          function rotateImg(markerPos)
          {
              if (positions.getPosition(1) != null)
              {
                var myimgrotate = document.getElementById(markersArray[markerPos].getIcon().imageDiv.id ).getElementsByTagName("img");
                if (myimgrotate[0] == null)
                   myimgrotate = document.getElementById(markersArray[markerPos].getIcon().imageDiv.id ).getElementsByTagName("canvas");
                   
                var angle = calculateAngle(positions.getPosition(1).x,positions.getPosition(1).y,positions.getPosition(0).x,positions.getPosition(0).y);
    
                $jq('#'+myimgrotate[0].id).rotate(angle,'rel');
              }
          }
          
          //TODO uporabi isto fukncijo kot jo pri risanju zgodovine
          function calculateAngle(x1,y1,x2,y2)
          {
            var a = x2 - x1;
            var b = y2 - y1;
            
            if (a >= 0 && b >= 0)
            {
              if (a == 0)
                return 0;
              else
                return 90 - (Math.atan(b/a) * 180 / Math.PI);
            }
            else if (a >=0 && b < 0)
            {
              if (a == 0)
                return 180;
              else
                return 90 - (Math.atan(b/a) * 180 / Math.PI);
            }
            else if (a < 0 && b < 0)
            {
              return 270 - (Math.atan(b/a) * 180 / Math.PI);
            }
            else
            {
              return 270 - (Math.atan(b/a) * 180 / Math.PI)
            }
          }
          
          function destroyMarkers()
          {
            for (var i = 0; i < markersArray.length; i++)
            {
              trackvehiclesLayer.removeMarker(markersArray[i]);
              markersArray[i].destroy();
              markersArray[i] = null;
            }
          }
          
          function setDigitalSensor(digitalSensor,digitalSensorText)
          {
              var counter = 0;
              for (var i = digitalSensor.length - 1; i >= 0; i--)
              {
                 counter++;
                 $jq("#devicemanager").devices.setSenzorColor(ident,counter,digitalSensor.charAt(i));
              }
              var sensorTextArray = digitalSensorText.split(";");
              var sensorText = '';
              for (var j = 0; j < sensorTextArray.length; j++)
              {
                sensorText += sensorTextArray[j] + '\n';
              }
              $jq("#devicemanager").devices.setSenzorHint(ident,sensorText);
          }
          
          function setInfoPopUp()
          {
              var markerInf = markersArray[markersArray.length - 1];
              markerInf.events.register('mousedown', markerInf, function(evt) 
        			{ 
        			    var info = positions.getPosition(0).time + ",\n";
        			    info += positions.getPosition(0).address + ",\n";
        			    info += positions.getPosition(0).addressDistance + "m,\n";
        			    info += positions.getPosition(0).speed + "km/h,\n";
        			    info += positions.getPosition(0).digitalSensorText;
        			   
                  var point = new OpenLayers.Geometry.Point(positions.getPosition(0).x,positions.getPosition(0).y);
                  var point_merc = OpenLayers.Projection.transform(point, "epsg:4326", "epsg:54004");
                  
                  var oif = jQuery('#'+positions.getPosition(0).ident).clone();
                  
                  var popupInfo = new OpenLayers.Popup.Anchored("popupdev", 
                                 new OpenLayers.LonLat(point_merc.x,point_merc.y),
                                 new OpenLayers.Size(600,400),
                                 '<div style="margin:5px">'+oif.html()+'</div>',null,true);
                 
                
                  map.addPopup(popupInfo);
        					OpenLayers.Event.stop(evt); 
        					
                   
        			});
        			
          }		
      		
      		function setMarkerLabelBgColor(color)
      		{
      		  markersArray[markersArray.length - 1].setBgColor(color);
          }
          
          function setMarkerLabelBorder(color, width)
          {
            markersArray[markersArray.length - 1].setBorder(color, width);
          }
    		
      }
      
      function position_obj(x,y,time,address,addressDistance,speed,isPositionValid,isTravel,digitalSensor,digitalSensorText,ident)
      {
          this.x = x;
          this.y = y;
          this.time = time;
          this.address = address;
          this.addressDistance = addressDistance;
          this.speed = speed;
          this.isPositionValid = isPositionValid;
          this.isTravel = isTravel;
          this.digitalSensor = digitalSensor;
          this.digitalSensorText = digitalSensorText;
          this.marker = null;
          this.markerLabel = null;
          this.ident = ident;
          this.centerPosition = centerPosition;
          this.deviceName     = deviceIdentToNameArray[ident];
          
          //this is maybe appropriate functon to update this
          if ($jq("#devicesInfoTable").attr("id")!= null )
          {  
            $jq("#devicesInfoTable").devicesTableView.updateTable(this);
          }
          
          function centerPosition()
          {
              var point = new OpenLayers.Geometry.Point(this.x, this.y);
        		  var point_merc = OpenLayers.Projection.transform(point, "epsg:4326", "epsg:54004");
              map.setCenter(new OpenLayers.LonLat(point_merc.x,point_merc.y),map.getZoom(),false,false);
          }
      }
      
      
      function positions()
      {
          var positionsArray = null;
       
          this.addPosition = addPosition;
          this.getPosition = getPosition;
          this.size = size;
          
          function addPosition(position)
          {
              if (positionsArray != null)
              {
                  var len = positionsArray.length;
                  if (len < positionsArrayLength)
                  {
                      for (var i = positionsArray.length; i > 0; i--)
                      {
                          positionsArray[i] = null;
                          positionsArray[i] = positionsArray[i-1];
                      }
                      positionsArray[0] = position;
                  }
                  else
                  {
                      for (var i = positionsArrayLength - 1; i > 0; i--)
                      {
                          positionsArray[i] = null;
                          positionsArray[i] = positionsArray[i-1];
                      }
                      positionsArray[0] = position;
                  }
              }
              else
              {
                  positionsArray = new Array();
                  positionsArray[0] = position;
              }
          }
          
          function removeOldestPosition()
          {
            positionsArray.splice(positionsArray.length - 1, 1);
          }
          
          function getPosition(positionPlace)
          {
            if (positionsArray != null && positionsArray.length > positionPlace)
              return positionsArray[positionPlace];
            else
              return null;
          }
          
          function size()
          {
            if (positionsArray != null)
              return positionsArray.length;
            else
              return 0;
          }
          
      }
      
      
      function addInfoDevice(ident)
      {
            arrayInfoDevices.push(ident);
            createInfoTable(ident);
            
            var device = getDevice(ident);
            if (device != null)
            {
              device.setMarkerLabelBorder('blue',4);
              
              var position = device.positions.getPosition(0);
              if (!autozoomOn && position != null)
              {
                position.centerPosition();
              }
            }
      }
      
      function removeInfoDevice(ident)
      {
            for(var i=0;i<arrayInfoDevices.length;i++)
            {
              if(ident == arrayInfoDevices[i]) 
              {
                var device = getDevice(ident);
                if (device != null)
                {
                  device.setMarkerLabelBorder('black',1);
                }
              
                arrayInfoDevices.splice(i, 1);
              }
            }
      }
      
      function autozoom(az)
      {
          autozoomOn = az;
          if (autozoomOn && devicesArray.length > 0 && trackvehiclesLayer.getDataExtent() != null)
          {
              map.zoomToExtent(trackvehiclesLayer.getDataExtent()); 
          }
      }
      
      function handleGpsPosition(ident,x,y,time,address,addressDistance,speed,isPositionValid,isTravel,digitalSensor,digitalSensorText,dataFromDatabase)
      {
          //debugMsg('#debug1','Handle devicesArray.length = ' + devicesArray.length);
          var device = getDevice(ident);
          //debugMsg('#debug1','Handle device = ' + device);
          
          if (device != null && !eval(isPositionValid) && !dataFromDatabase)
          {
              $jq("#devicemanager").devices.setGpsColor(ident,'GPS',0);
          }
          else if (device != null && eval(isPositionValid) && !dataFromDatabase)
          {
              $jq("#devicemanager").devices.setGpsColor(ident,'GPS',1);
          }

          if (device != null && eval(isPositionValid) && (eval(isTravel) || userstatus == 4))
          {
              //alert(userstatus);
              var position = new position_obj(x,y,time,address,addressDistance,speed,isPositionValid,isTravel,digitalSensor,digitalSensorText,ident);
              
              device.addPositionToDevice(position);
              device.moveMarkers();
              
              $jq('#addressbar_'+ident).html(position.address);
              $jq('#dev_name_'+ident).html(position.deviceName+"  ["+position.time+"]");
              

              device.setDigitalSensor(digitalSensor,digitalSensorText);
              
              if (dataFromDatabase)
                device.setMarkerLabelBgColor('gray');
              else if (speed < 10)
                device.setMarkerLabelBgColor('red');
              else
                device.setMarkerLabelBgColor('white');
              
              if (autozoomOn)
    	        {
                map.zoomToExtent(trackvehiclesLayer.getDataExtent());          
              }
              
              for (var i = 0; i < arrayInfoDevices.length ; i++)
              {
                if (arrayInfoDevices[i] == ident)
                {
                    createInfoTable(arrayInfoDevices[i]);
                    
                    if (!autozoomOn && !position.marker.onScreen())
                      position.centerPosition();
                }
              }
               
          }
      }
      
      function addDevice(ident)
      {
          var napravaObstaja = false;
          
          for (var i = 0; i < devicesArray.length; i++)
          {
              if (devicesArray[i].ident == ident)
              {
                  napravaObstaja = true;
              }
          }
          if (!napravaObstaja)
          {
              var positionsVar = new positions();
              var dev = new device(ident,positionsVar);
              dev.createMarkers();
              devicesArray.push(dev);
              getLastPositionFromDatabase(ident);
          }
          else
          {
              //TODO
              alert('Naprava z identom ' + ident + ' ze obsataja!');
          }
      }
      
      function removeDevice(ident)
      {
          var dev = getDevice(ident);
          dev.destroyMarkers();
          
          for (var i = 0; i < devicesArray.length; i++)
          {
              if (devicesArray[i].ident == ident)
              {
                  devicesArray.splice(i,1);
              }
          }
      }
      
      function getNumberOfActiveDevices()
      {
        return devicesArray.length;
      }
      
      function getDevice(ident)
      {
          for (var i = 0; i < devicesArray.length; i++)
          {
              //debugMsg('#debug1','getDevice ident = ' + ident + ' = ' + devicesArray[i].ident);
              if (devicesArray[i].ident == ident)
              {
                  return devicesArray[i];
              }
          }
      }

      function setMap(mapIn)
      {
          map = mapIn.getMap();
          trackvehiclesLayer = new OpenLayers.Layer.Markers("trackvehicles");
          map.addLayer(trackvehiclesLayer);
      }

      function createInfoTable(ident)
      {
          var table = document.createElement('table');
          var tr1 = document.createElement('tr');
          var thDevice = document.createElement('th');
          var thTime = document.createElement('th');
          var thAddress = document.createElement('th');
          var thDistanceFromAddress = document.createElement('th');
          var thSpeed = document.createElement('th');
          var thDigitalSensor = document.createElement('th');
          
          jQuery(table).addClass('tableInfo');
          jQuery(table).append(tr1);
          jQuery(tr1).append(thDevice);
          jQuery(thDevice).html(getMessage('tabDevice'));
          jQuery(tr1).append(thTime);
          jQuery(thTime).html(getMessage('tabTime'));
          jQuery(tr1).append(thAddress);
          jQuery(thAddress).html(getMessage('tabAddress'));
          jQuery(tr1).append(thDistanceFromAddress);
          jQuery(thDistanceFromAddress).html(getMessage('tabDistance'));
          jQuery(tr1).append(thSpeed);
          jQuery(thSpeed).html(getMessage('tabSpeed'));
          jQuery(tr1).append(thDigitalSensor);
          jQuery(thDigitalSensor).html(getMessage('tabSenzor'));
      
          var device = getDevice(ident);
          
          if (device != null)
          {
              position = device.positions.getPosition(0);
              
              if (position != null)
              {
                  var tr = document.createElement('tr');
                  var tdDevice = document.createElement('td');
                  var tdTime = document.createElement('td');
                  var tdAddress = document.createElement('td');
                  var tdDistanceFromAddress = document.createElement('td');
                  var tdSpeed = document.createElement('td');
                  var tdDigitalSensor = document.createElement('td');
              
                  jQuery(table).append(tr);
                  jQuery(tr).append(tdDevice);
                  jQuery(tdDevice).html(deviceIdentToNameArray[ident]);
                  jQuery(tr).append(tdTime);
                  jQuery(tdTime).html(position.time);
                  jQuery(tr).append(tdAddress);
                  jQuery(tdAddress).html(position.address);
                  jQuery(tr).append(tdDistanceFromAddress);
                  jQuery(tdDistanceFromAddress).html(position.addressDistance + " m");
                  jQuery(tr).append(tdSpeed);
                  if (position.speed != -1)
                  {
                    jQuery(tdSpeed).html(position.speed + " km/h");
                  }
                  jQuery(tr).append(tdDigitalSensor);
                  jQuery(tdDigitalSensor).html(position.digitalSensor);
                  //$jq("#mytabs").tabs.addMsg("tab_info",table);
              }
          }
         
          $jq("#mytabs").tabs.addMsg("tab_info",table);
      }
      
      function setIdentToNameArray(identToName)
      {
          deviceIdentToNameArray = identToName;
      }
      
      function getLastPositionFromDatabase(ident)
      {
      	jQuery.get(gpsSettings['getLastPositionFromDB'], { deviceIdent: ident,userStatus:userstatus },function(data){
          if (data != null)
        	{
      	  	var response = data.documentElement;
      	    var header = response.tagName;
      	    var numOfChildren = response.childNodes.length;
      	    
      	    for (var i = 0; i < numOfChildren; i++)
      	    {
      	       if (response.childNodes[i].tagName == "device")
      	       {
      	          var deviceIdent = response.childNodes[i].getAttribute("ident");
      	          var time = response.childNodes[i].childNodes[0].firstChild.data;
      	          var coordinateX = response.childNodes[i].childNodes[1].firstChild.data;
      	          var coordinateY = response.childNodes[i].childNodes[2].firstChild.data;
      	          var isPositionValid = response.childNodes[i].childNodes[3].firstChild.data;
      	          var address = response.childNodes[i].childNodes[4].firstChild.data;
      	          var addressDistance = response.childNodes[i].childNodes[5].firstChild.data;
      	          var speed = response.childNodes[i].childNodes[6].firstChild.data;
      	          var isTravel = response.childNodes[i].childNodes[7].firstChild.data;
      	          var digitalSensor = response.childNodes[i].childNodes[8].firstChild.data;
      	          var digitalSensorText = response.childNodes[i].childNodes[9].firstChild.data;
      	          
      	          handleGpsPosition(deviceIdent,coordinateX,coordinateY,time,address,addressDistance,speed,isPositionValid,isTravel,digitalSensor,digitalSensorText,true);
      	       }
      	    }
      	  }
      	});
      }
      
  }
  
  function debugMsg(divid,m)
  {
      var tnode = document.createTextNode(m);
      $jq(divid).append(m) ;
      $jq(divid).append(document.createElement("br"))
  }

