﻿var orionFetchedOnce = false;

function formatDateFromISO80601(dateStr){	
	//creates a date from ISO-format, 	
	var d = null;
	var ok = false;
	if (dateStr && dateStr != ""){
		d = new Date();
		try{
			//...'2007-12-06T12:01:00' -> TYPE: Unspecified
			//...'2007-12-06T12:01:00+01:00'TYPE: Local time 
			//...'2007-12-06T12:01:00Z' --> TYPE: UTC (Coordinated Universal Time)
			d.setISO8601(dateStr);					
			//setISO8601 will interpret that string as a UTC, unspecified time or local time and the date object will consider the client computers timezone and offset the time accordingly.
			//we want to show the same time as the local time (the dateStr must be either in unspecified och local time format, UTC makes no sense)			
			d.setISO8601asLocalTime();
			ok = true;
		}catch(e){
		}
	}
	if (ok)
		return formatDate(d, 'yyMMdd HH:mm');
	else
		return "";	
}


//if layerName is null, all layers will be updated
function updateOrion(layerName) {    
      
	var parseCoordFunc = function(row){
	  var obj = new Object();
	  
	  obj.ew = parseInt(getElementValue(row, "EW"));
	  obj.ns = parseInt(getElementValue(row, "NS"));	  
	  return obj;
	}	
	
	
	var parseTrissData2DescrFunc = function(row){		
	  var obj = new Object();
	  obj.name        = getElementValue(row, "Header");
	  obj.tooltip     = 
		"<b>" + orionLineBreakText(getElementValue(row, "Header")) + "</b>"
		+ "<br />" + orionLineBreakText(getElementValue(row, "Teaser"))
		+ "<br />" + orionLineBreakText(getElementValue(row, "Message")) 
		+ "<br /><b>Startar</b> " 
		+ orionLineBreakText(formatDateFromISO80601(getElementValue(row, "StartTime"))) 
		+ "  <b>Slutar</b> " 
		+ orionLineBreakText(formatDateFromISO80601(getElementValue(row, "EndTime"))) ;
	  return obj;
	}
	var parseWeatherDescrFunc = function(row){		
	  var obj = new Object();
	  obj.name        = getElementValue(row, "MeasurePoint");
	  obj.tooltip     = 
		"<b>Nederbörd</b> " + orionLineBreakText(getElementValue(row, "TypeOfPrecipitation"))
		+ "<br /><b>Temp. vägyta</b> " + orionLineBreakText(getElementValue(row, "RoadTemp")) + "º"
		+ "<br /><b>Temp. luft</b> " + orionLineBreakText(getElementValue(row, "AirTemp")) + "º"		
		+ "<br /><b>Tidpunkt</b> " + orionLineBreakText(formatDateFromISO80601(getElementValue(row, "MeasureTime")));	  
	  return obj;
	}
	
	var uniqueSuffix = new Date().getTime(); //for image url lite MyTrafficPic.jpg?123456789
	var parseCameraDescrFunc = function(row){		
	  var obj = new Object();
	  obj.name        = getElementValue(row, "Name");
	  obj.imageUrl    = getElementValue(row, "PhotoUrl", true)  + '?' + 	uniqueSuffix;  
	  return obj;
	}
	
	var parseCentralParkingDescrFunc = function(row){		
	  var obj = new Object();
	  obj.name    = getElementValue(row, "Area");
	  obj.tooltip = "<b>" + obj.name + "</b>"
	  var txt;	  
	  for (var i = 1; i <= 5; i++){
	        txt = getElementValue(row, "Note" + i)
	        if (txt != ""){
	            obj.tooltip += "<br />" + orionLineBreakText(txt);
	        }
	  }	  
	  return obj;
	}

	var parseLtfParkingDescrFunc = function(row) {
	    var obj = new Object();
	    obj.name = getElementValue(row, "SiteName");
	    obj.tooltip = "<b>" + obj.name + "</b>";
	    obj.tooltip += "<br />" + getElementValue(row, "ParkingPlaceType");
	    obj.tooltip += "<br />" + orionLineBreakText(getElementValue(row, "MaxParkingTime"));
	    if (getElementValue(row, "ParkableLength") != "")
	        obj.tooltip += "<br />Antal meter parkering: " + getElementValue(row, "ParkableLength");
	    if (getElementValue(row, "ParkingCost") != "-")
	        obj.tooltip += "<br />Kostnad: " + getElementValue(row, "ParkingCost");
	    if (getElementValue(row, "ParkingSpaceCount") != "")
	        obj.tooltip += "<br />Antal parkeringar: " + getElementValue(row, "ParkingSpaceCount");	        
	    
	        
	        
	    return obj;
	}
	
	var parseParkingLotFunc = function(row){		
	  var obj = new Object();	  
	  obj.name        = getElementValue(row, "Name");
	  obj.id          = getElementValue(row, "ExternalId");
	  obj.numberOfSpaces = getElementValue(row, "NumberOfSpaces");	
      obj.tooltip = obj.name + "<br />"  + obj.numberOfSpaces + " platser";	  
	  
	  //...to make the object selectable in the map
	  obj[RP_SELECTABLE_OBJ] =
				{
				  "id": obj.id,
				  "name":obj.name,
				  "numberOfSpaces":obj.numberOfSpaces
				}			  	
	  
	  return obj;
	}


	var nowUTC = new Date().getISO8601();
	var now_3d_ahead = new Date();
	now_3d_ahead.setDate(now_3d_ahead.getDate() + 3);
	var nowUTC_3d_ahead = now_3d_ahead.getISO8601();
	
    if (isLayerEnabled('warningLayer') && (!layerName || layerName == 'warningLayer'))       
		createGeneric2(
		  "TrissData2", 
		  "Deviations", 		  
		  "EW,NS,Header,Teaser,Message,StartTime,EndTime",
		  "MessageType in ('Akut trafikläge','Hinder','Olycka','Restriktion','Trafikmeddelande') and not (MessageType in ('Trafikmeddelande') and MessageCode in ('köbildning','långsam trafik')) and CountyNo in(13,14) and (StartTime &lt;='" + nowUTC_3d_ahead + "' and (EndTime &gt;= '" + nowUTC + "' or ValidUntilFurtherNotice=true) and (Deleted&lt;&gt;'true' or Deleted IS NULL))",		  
		  "ListElements",	  
		  "Deviation", 			  
		  parseCoordFunc,
		  parseTrissData2DescrFunc,
		  "warningLayer",
		  document.getElementById("warningList"), 
		  "li",
		  document.getElementById("warningUpdatingText"),
		  false		  
		 );		 			      
	
	
    if (isLayerEnabled('queueLayer') && (!layerName || layerName == 'queueLayer')){        
		createGeneric2(
		  "TrissData2", 
		  "Deviations", 		  
		  "EW,NS,Header,Teaser,Message,StartTime,EndTime", 
		  "MessageType in ('Trafikmeddelande') and MessageCode in ('köbildning','långsam trafik') and CountyNo in(13,14) and (StartTime &lt;='" + nowUTC + "' and (EndTime &gt;= '"+ nowUTC + "' or ValidUntilFurtherNotice=true)and (Deleted&lt;&gt;'true' or Deleted IS NULL))",		  
		  "ListElements",		  
		  "Deviation", 		  
		  parseCoordFunc,
		  parseTrissData2DescrFunc,
		  "queueLayer",
		  document.getElementById("queueList"), 
		  "li",
		  document.getElementById("queueUpdatingText"),
		  false
		 );		 		
    }    
    if (isLayerEnabled('workLayer') && (!layerName || layerName == 'workLayer') && (!workLayer.tnuUseLazyUpdate)){		
		
		createGeneric2(
		  "TrissData2", 
		  "Deviations", 		  
		  "EW,NS,Header,Teaser,Message,StartTime,EndTime", 
		  "MessageType in ('Vägarbete') and CountyNo in(13,14) and (StartTime &lt;='" + nowUTC + "' and (EndTime &gt;= '"+ nowUTC + "' or ValidUntilFurtherNotice=true)and (Deleted&lt;&gt;'true' or Deleted IS NULL))",		  
		  "ListElements", 		  
		  "Deviation",
		  parseCoordFunc,
		  parseTrissData2DescrFunc,
		  "workLayer",
		  document.getElementById("workList"), 
		  "li",
		  document.getElementById("workUpdatingText"),
		  false
		 );	
    }
    if (isLayerEnabled('weatherLayer') && (!layerName || layerName == 'weatherLayer')&& (!weatherLayer.tnuUseLazyUpdate)){
		createGeneric2(
		  "TrissData2", 
		  "Weather", 		  
		  "EW,NS,MeasurePoint,TypeOfPrecipitation,RoadTemp,AirTemp,MeasureTime", 
		  "CountyNo in(13,14)",
		  "MeasurePoint",
		  "MeasurePoint",
		  parseCoordFunc,
		  parseWeatherDescrFunc,
		  "weatherLayer",
		  document.getElementById("weatherList"), 
		  "li",
		  document.getElementById("weatherUpdatingText"),
		  false
		 );	
	}		
	
    
    if (isLayerEnabled('cameraLayer') && (!layerName || layerName == 'cameraLayer')&& (!cameraLayer.tnuUseLazyUpdate)){            
	    createGeneric2(
	      "CameraInfo", 
	      "Cameras", 		  
	      "EW,NS,Name,PhotoUrl", 
	      "CountyNo in(13,14)",
	      "Name",	  
	      "Camera", 
	      parseCoordFunc,
	      parseCameraDescrFunc,
	      "cameraLayer",
	      document.getElementById("cameraList"), 
	      "li",
		  document.getElementById("cameraUpdatingText")		  
	     );	
    }
    
    if (!orionFetchedOnce){        
        if (isLayerEnabled('centralParkingLayer') && (!layerName || layerName == 'centralParkingLayer')){      
            createGeneric2(
			  "CentralParkings", 
			  "CentralParkings", 		  
			  "EW,NS,Area,Note1,Note2,Note3,Note4,Note5", 
			  "Provider='GbgTrafikkontoret'",
			  "Area", 		  
			  "Parking",			  
			  parseCoordFunc,
			  parseCentralParkingDescrFunc,
			  "centralParkingLayer",
			  document.getElementById("centralParkingList"), 
			  "li",
			  document.getElementById("centralParkingUpdatingText"),
			  5000,
			  true
			 );
        }

        if (isLayerEnabled('centralMCParkingLayer') && (!layerName || layerName == 'centralMCParkingLayer')) {
            createGeneric2(
			  "CentralParkings",
			  "LtfParkings",
			  "EW,NS,SiteName,ParkingPlaceType,MaxParkingTime,ParkingCost,ParkableLength",
			  "ParkingPlaceType='P MC'",
			  "SiteName",
			  "Parking",
			  parseCoordFunc,
			  parseLtfParkingDescrFunc,
			  "centralMCParkingLayer",
			  document.getElementById("centralMCParkingList"),
			  "li",
			  document.getElementById("centralMCParkingUpdatingText"),
			  5000
			 );
        }

        if (isLayerEnabled('centralHandicapParkingLayer') && (!layerName || layerName == 'centralHandicapParkingLayer')) {
            createGeneric2(
			  "CentralParkings",
			  "LtfParkings",
			  "EW,NS,SiteName,ParkingPlaceType,MaxParkingTime,ParkingCost,ParkableLength",
			  "ParkingPlaceType='P Handikapp'",
			  "SiteName",
			  "Parking",
			  parseCoordFunc,
			  parseLtfParkingDescrFunc,
			  "centralHandicapParkingLayer",
			  document.getElementById("centralHandicapParkingList"),
			  "li",
			  document.getElementById("centralHandicapParkingUpdatingText"),
			  5000
			 );
        }

        if (isLayerEnabled('centralBusParkingLayer') && (!layerName || layerName == 'centralBusParkingLayer')) {
            createGeneric2(
			  "CentralParkings",
			  "LtfParkings",
			  "EW,NS,SiteName,ParkingPlaceType,MaxParkingTime,ParkingCost,ParkableLength",
			  "ParkingPlaceType='P Buss'",
			  "SiteName",
			  "Parking",
			  parseCoordFunc,
			  parseLtfParkingDescrFunc,
			  "centralBusParkingLayer",
			  document.getElementById("centralBusParkingList"),
			  "li",
			  document.getElementById("centralBusParkingUpdatingText"),
			  5000
			 );
        }

        if (isLayerEnabled('centralTruckParkingLayer') && (!layerName || layerName == 'centralTruckParkingLayer')) {
            createGeneric2(
			  "CentralParkings",
			  "LtfParkings",
			  "EW,NS,SiteName,ParkingPlaceType,MaxParkingTime,ParkingCost,ParkableLength",
			  "ParkingPlaceType='P LB'",
			  "SiteName",
			  "Parking",
			  parseCoordFunc,
			  parseLtfParkingDescrFunc,
			  "centralTruckParkingLayer",
			  document.getElementById("centralTruckParkingList"),
			  "li",
			  document.getElementById("centralTruckParkingUpdatingText"),
			  5000
			 );
        }
    }
    if (!orionFetchedOnce){ 
    	//this layer is only fetched once        
        if (isLayerEnabled('commuterParkingLayer')  && (!layerName || layerName == 'commuterParkingLayer')){      
			createGeneric2(
			  "Vasttrafik", 
			  "ParkingLots", 		  
			  "EW,NS,ExternalId,Name,NumberOfSpaces", 
			  "",
			  "Region,Municipality", 		  
			  "ParkingLot",			  
			  parseCoordFunc,
			  parseParkingLotFunc,
			  "commuterParkingLayer",
			  document.getElementById("commuterParkingList"), 
			  "li",
			  document.getElementById("commuterParkingUpdatingText") 
			 );				
			
        }
    }    
    orionFetchedOnce = true;
}



//created by Ingemar Nilsson
function enableLayer(layerName, on){
    var elem = null;
    elem = layerName2EnableElem(layerName);
    if (elem){
        if (on)
            elem.style.display = 'block';
        else
            elem.style.display = 'none';
        
    }
}

//created by Ingemar Nilsson
function enableServerLayer(layerName, on, inMap){
    var elem = null;    
    switch(layerName){        
        case 'vaglagLayer':                                
			setLayerVisible(layerName, on, inMap);
            elem = layerName2EnableElem(layerName);
            break;
    }
    if (elem){                                
        if (on)
            elem.style.display = 'block';
        else
            elem.style.display = 'none';    
    }           
}

function getLayerVisible(layerId){
	var isVisible = false;
	var lyr = map.getObjectLayerById(layerId);	
	if(lyr){
		isVisible = lyr.isHidden ? false : true;
	}else if (layerId == 'vaglagLayer'){
		isVisible = serverLayerIsVisible(map, 'Vaglag');
	}    
	return isVisible;
}

function setLayerVisible(layerName, visible, inMap, runLazyUpdate){	
	var on = visible ? true : false;
    switch(layerName){
        case 'cameraLayer' : 			
            showHideLayer(cameraLayer, !on, 'cameraImageId', 'pic/camera16.gif', 'pic/camera16-off.gif', 'cameraBoxSub');            
			if (on && cameraLayer.tnuUseLazyUpdate && runLazyUpdate){				
				cameraLayer.tnuUseLazyUpdate = false;
				updateOrion('cameraLayer');				
			}
            break;
        case 'workLayer' : 
            showHideLayer(workLayer, !on, 'workImageId', 'pic/roadWork16.gif', 'pic/roadWork16-off.gif', 'workBoxSub');            			
			if (on && workLayer.tnuUseLazyUpdate && runLazyUpdate){				
				workLayer.tnuUseLazyUpdate = false;
				updateOrion('workLayer');				
			}
            break;
        case 'queueLayer' : 
            showHideLayer(queueLayer, !on, 'queueImageId', 'pic/trafficJam16.gif', 'pic/trafficJam16-off.gif', 'queueBoxSub');            
            break;
        case 'weatherLayer' : 
            showHideLayer(weatherLayer, !on, 'weatherImageId', 'pic/vvis16.gif', 'pic/vvis16-off.gif', 'weatherBoxSub');            
			if (on && weatherLayer.tnuUseLazyUpdate && runLazyUpdate){				
				weatherLayer.tnuUseLazyUpdate = false;
				updateOrion('weatherLayer');				
			}
            break;
        case 'warningLayer' : 
            showHideLayer(warningLayer, !on, 'warningImageId', 'pic/roadTraffic16.gif', 'pic/roadTraffic16-off.gif', 'warningBoxSub');            
            break;
        case 'centralParkingLayer':
            showHideLayer(centralParkingLayer, !on, 'centralParkingImageId', 'pic/parking16.gif', 'pic/parking16-off.gif', 'centralParkingBoxSub');
            zoomToLayer(centralParkingLayer, on);
            break;
        case 'centralMCParkingLayer':
            showHideLayer(centralMCParkingLayer, !on, 'centralMCParkingImageId', 'pic/mc_parking.gif', 'pic/mc_parking-off.gif', 'centralMCParkingBoxSub');
            zoomToLayer(centralMCParkingLayer, on);
            break;
        case 'centralHandicapParkingLayer':
            showHideLayer(centralHandicapParkingLayer, !on, 'centralHandicapParkingImageId', 'pic/handicap_parking.gif', 'pic/handicap_parking-off.gif', 'centralHandicapParkingBoxSub');
            zoomToLayer(centralHandicapParkingLayer, on);
            break;
        case 'centralBusParkingLayer':
            showHideLayer(centralBusParkingLayer, !on, 'centralBusParkingImageId', 'pic/bus_parking.gif', 'pic/bus_parking-off.gif', 'centralBusParkingBoxSub');
            zoomToLayer(centralBusParkingLayer, on);
            break;
        case 'centralTruckParkingLayer':
            showHideLayer(centralTruckParkingLayer, !on, 'centralTruckParkingImageId', 'pic/truck_parking.gif', 'pic/truck_parking-off.gif', 'centralTruckParkingBoxSub');
            zoomToLayer(centralTruckParkingLayer, on);
            break;            
        case 'commuterParkingLayer' : 
            showHideLayer(commuterParkingLayer, !on, 'commuterParkingImageId', 'pic/parking16.gif', 'pic/parking16-off.gif', 'commuterParkingBoxSub');
            break;
		case 'vaglagLayer' : 
            showHideServerLayer(inMap, 'Vaglag', on, 'roadImageId', 'pic/vaglag16.gif', 'pic/vaglag16-off.gif', 'vaglagBoxSub');
            break;
    }
}

function layerName2EnableElem(layerName){
    var elem = null;
    switch(layerName){
        case 'cameraLayer' : 
            elem = document.getElementById('cameraBox');
            break;
        case 'workLayer' : 
            elem = document.getElementById('workBox');
            break;
        case 'queueLayer' : 
            elem = document.getElementById('queueBox');
            break;
        case 'weatherLayer' : 
            elem = document.getElementById('weatherBox');
            break;
        case 'warningLayer' : 
            elem = document.getElementById('warningBox');
            break;
        case 'centralParkingLayer' : 
            elem = document.getElementById('centralParkingBox');
            break;
        case 'centralMCParkingLayer':
            elem = document.getElementById('centralMCParkingBox');
            break;
        case 'centralHandicapParkingLayer':
            elem = document.getElementById('centralHandicapParkingBox');
            break;
        case 'centralBusParkingLayer':
            elem = document.getElementById('centralBusParkingBox');
            break;
        case 'centralTruckParkingLayer':
            elem = document.getElementById('centralTruckParkingBox');
            break;
        case 'commuterParkingLayer' : 
            elem = document.getElementById('commuterParkingBox');
            break;
		case 'vaglagLayer' : 
            elem = document.getElementById('vaglagBox');
            break;
            
    }
    return elem;
}

//created by Ingemar Nilsson
function isLayerEnabled(layerName){
    var isEnabled = false;
    var elem = null;
    elem = layerName2EnableElem(layerName);
    if (elem){    
        isEnabled = elem.style.display == 'block' ? true :  false;        
    }
    return isEnabled;
}

function zoomToLayer(layer, on) {
    if (on && layer.getGeoObjectArray() != null)
        map.zoomToObjects(layer.getGeoObjectArray(), 50);
}
