/**
 * @author igor@dlma.nl
 * @projectDescription JS used to manage jams for Google Maps (polyline)
 */
var jams = new Array();
var lat_lang = new Array();
var points = new Array();
var start = null;
var poly = null;
var icon_start = null;
var center_index = null;

var flag = getFlagValue();

function stripslashes(str){
    str = str.replace(/\\'/g, '\'');
    str = str.replace(/\\"/g, '"');
    str = str.replace(/\\\\/g, '\\');
    str = str.replace(/\\0/g, '\0');
    return str;
}

function showJams(){

    if (inMap != null) {
        updateData(true);
    }
}

function hideJams(){

    if (inMap != null) {
        $.each(jams, function(i, jam){
            inMap.GMap.removeOverlay(jam);
        });
    }
}

 var arrowIcon = new GIcon();
 arrowIcon.iconSize = new GSize(24,24);
 arrowIcon.shadowSize = new GSize(1,1);
 arrowIcon.iconAnchor = new GPoint(12,12);
 arrowIcon.infoWindowAnchor = new GPoint(0,0);
 
 // === Returns the bearing in degrees between two points. ===
 // North = 0, East = 90, South = 180, West = 270.
 var degreesPerRadian = 180.0 / Math.PI;
 function bearing( from, to ) {
   // See T. Vincenty, Survey Review, 23, No 176, p 88-93,1975.
   // Convert to radians.
   var lat1 = from.latRadians();
   var lon1 = from.lngRadians();
   var lat2 = to.latRadians();
   var lon2 = to.lngRadians();

   // Compute the angle.
   var angle = - Math.atan2( Math.sin( lon1 - lon2 ) * Math.cos( lat2 ), Math.cos( lat1 ) * Math.sin( lat2 ) - Math.sin( lat1 ) * Math.cos( lat2 ) * Math.cos( lon1 - lon2 ) );
   if ( angle < 0.0 )
    angle  += Math.PI * 2.0;

   // And convert result to degrees.
   angle = angle * degreesPerRadian;
   angle = angle.toFixed(1);

   return angle;
 }
  
 // === A function to create the arrow head at the end of the polyline ===
 function arrowHead(points) {
   // == obtain the bearing between the last two points
   var p1=points[points.length-1];
   var p2=points[points.length-2];
   if ( p1 && p2 ) {
	   var dir = bearing(p2,p1);
	   // == round it to a multiple of 3 and cast out 120s
	   var dir = Math.round(dir/3) * 3;
	   while (dir >= 120) {dir -= 120;}
	   // == use the corresponding triangle marker 
	   arrowIcon.image = "images/arrows/dir_"+dir+".png";
	   return new GMarker(p1, arrowIcon);
   }
  else {
    return false;
  }

 }



function updateData(){
    flag = getFlagValue();
    
    hideJams();

    $.getJSON('./jam_json.php', function(data){
    
    $("#jam_summary").html(data.tekst);

    $.each(data.jams, function(i, item){
        icon_start          = new GIcon(G_DEFAULT_ICON);
        icon_start.image = "images/icons-jam.png";
        icon_start.iconSize             = new GSize( 30, 31 );
        icon_start.iconAnchor       = new GPoint( 14, 33 );
        icon_start.infoWindowAnchor     = new GPoint( 30, 5 );
        if (item.enc_points != "" && item.enc_points != "??" && item.enc_points != "BB"){
	        poly = new GPolyline.fromEncoded({
	                    color: "#FF0000",
	                    weight: 6,
						opacity : 0.9,
	                    points: item.enc_points,
	                    levels: item.enc_levels,
	                    zoomFactor: 32,
	                    numLevels: 4
	              });
            var iVertecsCount = poly.getVertexCount();
            var points = new Array();
            if (parseInt(iVertecsCount) > 2){
            	if (poly.getVertex(iVertecsCount-2)){
            		points[0] = poly.getVertex(iVertecsCount-2);	
            	}
                
                if (poly.getVertex(iVertecsCount-1)){
                	points[1] = poly.getVertex(iVertecsCount-1);	
                }
                
            }
           
            	var oArrowHead = arrowHead(points);
	        try{
			jams.push(poly);
			if ( oArrowHead){
			    jams.push(oArrowHead);
	 		}
		        if (polybounds = poly.getBounds()){
			        start = new GMarker(polybounds.getCenter(), {
			                title:  item.gevolg,
			                icon: icon_start
			            });
			        
			        jams.push(start);
			        
			        
			        if (flag) {
			            inMap.GMap.addOverlay(start);
                        
			        }
			        
			        if(item.oorzaak == "") {
			            item.oorzaak = "onbekend.";
			        }
			        
			        GEvent.addListener(start, 'click', function(para){
			            inMap.GMap.openInfoWindowHtml(para, "<div class='jam_popup'><h4>" + item.wegnr + ": van " + item.van + ", " + item.vansub  + " naar " + item.naar  + ", " + item.naarsub + "</h4>" + 
			            "<div>" + item.gevolg + ". " + item.trendtekst + "</div>" + 
			            "<div>Lengte: " + item.afstand + " km, " +
			            "van hectometerpaal " + item.hectostart + " tot " + item.hectoeind + ".</div>" +
			            "<div>Oorzaak: " + item.oorzaak + "</div>" +
			            "<div>Melding sinds: " + item.starttijd + "</div></div>");
			        });
			    }
			    
			    if (flag) {
                    inMap.GMap.addOverlay(poly);
                    inMap.GMap.addOverlay(oArrowHead);
                }
		    }
		    catch(exception){
		        //alert('111');
		    }
	                
	              
	        
        }
    });
});
}

function getFlagValue()
{
  if (is_home())
  {
      return true;
  }
  else
  {
      return ($("input#u_jams:checked").length > 0);    
  }
  
}

function update_jams(){
    flag = getFlagValue();
    //alert(flag);
    if (inMap) {
        if (flag) {
            showJams();
        }
        else {
            hideJams();
        }
    }
}
/*
$(document).ready(function(){
    updateData();
});
*/
