function DirectionSign(){
    this.points = null;
    this.markers = new Array();
}  

DirectionSign.prototype.SetPoints = function(_points){
   this.points = _points;
}

DirectionSign.prototype.Length = function(){
    var l = 0;
    if(this.points == null)
        return l;
        
    for(var i = 0; i < this.points.length-1;i++){
        var p1 = this.points[i];
        var p2 = this.points[i+1];
        l += parseFloat(p1.distanceTo(p2));
    }
    return l;
} 

DirectionSign.prototype.GeneratePoints = function(step){
    this.ClearMarkers();

    var ar2 = new Array();
    var offset = 0;
    
   for (var i = 0; i < this.points.length - 1; i++) {
       var p1 = new LatLon(this.points[i].lat(), this.points[i].lng());
       var p2 = new LatLon(this.points[i + 1].lat(), this.points[i + 1].lng());
       var p3;
       
       var ok = true;
       while (ok) {
            var dist = parseFloat(p1.distanceTo(p2));
            var distance = step - offset;
            if (distance < dist) {
               
                var brng = p1.bearingTo(p2);           // in degrees clockwise from north
                p3 = p1.destinationPoint(brng, distance);

                ar2.push(new google.maps.LatLng(p1._lat, p1._lon));
                ar2.push(new google.maps.LatLng(p3._lat, p3._lon));

                offset = 0;
                p1 = p3;
                
            }
            else{
                offset += parseFloat(dist);
                ok = false;
            }
      }
   }

   this.MidPoint(ar2);

   return this.markers;
}

DirectionSign.prototype.degreesPerRadian = 180.0 / Math.PI;
	
DirectionSign.prototype.degreesToRadians = function(deg) {
        return deg * (Math.PI / 180);
    }

DirectionSign.prototype.bearing = function(from, to) {
        var lat1 = this.degreesToRadians(from.lat());
        var lon1 = this.degreesToRadians(from.lng());
        var lat2 = this.degreesToRadians(to.lat());
        var lon2 = this.degreesToRadians(to.lng());
        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;

        angle = angle * this.degreesPerRadian;
        angle = angle.toFixed(1);

        return angle;
    }
    
DirectionSign.prototype.MidPoint = function(points){
        for (var i = 1; i < points.length; i = i+2) {
            var p1 = points[i - 1];
            var p2 = points[i];
            var dir = this.bearing(p1, p2);
            // == 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 

            var marker = new google.maps.Marker();
            marker.setPosition(points[i]);
            marker.setMap(null);
            marker.setIcon(this.CreateMarkerImage("http://www.google.com/intl/en_ALL/mapfiles/dir_" + dir + ".png"));
            marker.direction = dir;

            this.markers.push(marker);
        }
    }
    
DirectionSign.prototype.CreateMarkerImage = function (url) {
        var size = new google.maps.Size(24, 24);
        var origin = new google.maps.Point(1, 1);
        var anchor = new google.maps.Point(12, 12);
        var scaledSize = new google.maps.Size(24, 24);

        var markerImage = new google.maps.MarkerImage(url, size, origin, anchor, scaledSize);
        return markerImage;
}

DirectionSign.prototype.DrawMarkers = function(map){
    for(var i=0;i< this.markers.length;i++){
        this.markers[i].setMap(map);
    }
}
DirectionSign.prototype.DrawMarkersEditable = function(inputString, map){
	if(inputString == null || inputString == '' || inputString.toLowerCase() == 'null')
		return;
	
	
	this.string = inputString;
	
	var items = inputString.split('|');
	for(var i=0;i<items.length;i++){
		var item = items[i];
		
		var p = item.split(';');
		
		var point = p[0].split(',');
		var directionId = p[1];
		
		var pointLatLng = new google.maps.LatLng(point[0], point[1]);
		
		var marker = new google.maps.Marker({
			position: pointLatLng,
			map: map
		});
		marker.customizationIcon("http://www.google.com/intl/en_ALL/mapfiles/dir_" + directionId + ".png");
		
		marker.direction = directionId;
		this.markers.push(marker);
	}
}


DirectionSign.prototype.ClearMarkers = function(){
     for(var i=0;i< this.markers.length;i++){
        this.markers[i].setMap(null);
    }
    this.markers = new Array();
}

DirectionSign.prototype.GetJSON = function(){
    var points = new Array();
    for(var i=0; i< this.markers.length;i++){
        var latLng = this.markers[i].getPosition();
        points.push({ lat: latLng.lat(), lng: latLng.lng() });
    }
    if(points.length == 0)
        return null;
    return points;
}

DirectionSign.prototype.GetPoints = function(){
    var points = '';
     for(var i=0; i< this.markers.length;i++){
        var latLng = this.markers[i].getPosition();
        points += latLng.lat() + ',' + latLng.lng() + ';' +  this.markers[i].direction + '|';
     }
     if(points != null && points.length > 0)
    	 points = points.substring(0, points.length - 1);
     //alert(this.markers.length);
     return points;
}

