// Polyline with arrows
//
// Bill Chadwick May 2008
//
// Free for any use
//
// Constructor params exactly as GPolyline then 
// 1) arrow spacing in pixels, 
// 2) arrow head length in pixels
// 3) arrow colour
// 4) arrow thickness in pixels
// 5) arrow opacity
//var heads = new array();

function BDCCArrowedPolyline(points, color, weight, opacity, opts, gapPx, headLength, headColor, headWeight, headOpacity,kategoria) {   
    this.gapPx = gapPx;
    this.points = points;
    this.color = color;
    this.weight = weight;
    this.opacity = opacity;
    this.headLength = headLength;
    this.headColor = headColor;
    this.headWeight = headWeight;
    this.headOpacity = headOpacity;
    this.opts = opts;
    this.heads = new Array();
	this.heads_return = new Array();
    this.line = null;
	this.widocznosc = 1; 
	this.kategoria = kategoria;
}
BDCCArrowedPolyline.prototype = new GOverlay();

BDCCArrowedPolyline.prototype.initialize = function(map) {
    this.map = map;   
    this.prj = map.getCurrentMapType().getProjection();
    var rdrw = GEvent.callback(this,this.recalc );
  	this.lstnMoveEnd = GEvent.addListener(map,"zoomend",function(){rdrw ();});
  	this.lstnType = GEvent.addListener(map,"maptypechanged",function(){rdrw ();});
  	this.recalc();//first draw
  	return this.heads;
}

BDCCArrowedPolyline.prototype.remove = function() {
    try{
        for(var i=0; i<this.heads.length; i++)
            this.map.removeOverlay(this.heads[i]); 
    }
    catch(ex){}
}

BDCCArrowedPolyline.prototype.redraw = function(force){
		return;//do nothing, the GPolyline line and heads draw themselves
}


BDCCArrowedPolyline.prototype.hide = function(force) {
   // this.line.hide();
	//this.widocznosc = 0;
	//alert(this.heads.length);
	for(var i=0; i<this.heads.length; i++)
		this.heads[0].hide();
          //  this.map.removeOverlay(this.heads[i]); 
}

BDCCArrowedPolyline.prototype.show = function(force) {
    //this.line.show();
	//this.widocznosc = 1;
	//var polylineEncoder = new PolylineEncoder();
	//polyline = polylineEncoder.dpEncodeToGPolyline(points);
	for(var i=0; i<this.heads.length; i++)
		this.heads[i].show();
      		//this.map.addOverlay(this.heads[i]); 
}


BDCCArrowedPolyline.prototype.copy = function(map) {
    return new BDCCArrowedPolyline(this.points,this.color,this.weight,this.opacity,this.opts,this.gapPx, this.headLength, this.headColor, this.headWeight, this.headOpacity);
}


BDCCArrowedPolyline.prototype.recalc = function() {
//if(this.widocznosc == 0) return;
   var zoom = this.map.getZoom();

   this.remove();

   //the main polyline
  // this.line = new GPolyline(this.points,this.color,this.weight,this.opacity,this.opts);
  // var polylineEncoder = new PolylineEncoder();
   //this.line = polylineEncoder.dpEncodeToGPolyline(this.points);
  // this.points_new = this.line.pointsToGLatLngs();
   //line.pointsToGLatLngs

   // the arrow heads
   this.heads = new Array();
   this.heads_return = new Array();

   var p1 = this.prj.fromLatLngToPixel(this.points[0],  zoom);//first point
   var p2;//next point
   var dx;
   var dy;
   var sl;//segment length
   var theta;//segment angle
   var ta;//distance along segment for placing arrows
  

   for (var i=1; i<this.points.length; i++){
            
      p2 = this.prj.fromLatLngToPixel(this.points[i],  zoom)
      dx = p2.x-p1.x;
      dy = p2.y-p1.y;

	  if (Math.abs(this.points[i - 1].lng() - this.points[i].lng()) > 180.0) {
		dx = -dx;
	  }
      
	  sl = Math.sqrt((dx*dx)+(dy*dy)); 
      theta = Math.atan2(-dy,dx);

	// nie rysuje, poniewaz rysuje wczesniej 
	 //this.map.addOverlay(this.line);
	 
	 //if(this.gapPx == 1) {	//just put one arrow in the middle of the line
        var x = p1.x + ((sl/2) * Math.cos(theta)); 
        var y = p1.y - ((sl/2) * Math.sin(theta));
        this.addHead(x,y,theta,zoom);        
	//}
      
      p1 = p2;   
   }
  // alert(this.points.length);
  alert("tee");
   //$.dump(this.heads.length);
	//this.redraw();	
	
}

BDCCArrowedPolyline.prototype.addHead = function(x,y,theta,zoom) {

    //add an arrow head at the specified point
    var t = theta + (Math.PI/4) ;
    if(t > Math.PI)
        t -= 2*Math.PI;
    
	var t2 = theta - (Math.PI/4) ;
	
    if(t2 <= (-Math.PI))
        t2 += 2*Math.PI;
    var pts = new Array();
	
    var x1 = x - Math.cos(t)*this.headLength;
    var y1 = y + Math.sin(t)*this.headLength;
    var x2 = x - Math.cos(t2)*this.headLength;
    var y2 = y + Math.sin(t2)*this.headLength;
    
	pts.push(this.prj.fromPixelToLatLng(new GPoint(x1,y1), zoom));
    pts.push(this.prj.fromPixelToLatLng(new GPoint(x,y), zoom));    
    pts.push(this.prj.fromPixelToLatLng(new GPoint(x2,y2), zoom));
	//pts.push(this.prj.fromPixelToLatLng(new GPoint(x1,y1), zoom));
    //this.heads_return.push(pts);
	
	this.heads.push(new GPolyline(pts,this.headColor,this.headWeight,this.headOpacity,this.opts));
	this.heads_return.push(new GPolyline(pts,this.headColor,this.headWeight,this.headOpacity,this.opts));
    
	//this.heads_return[this.heads.length-1].hide();
	//this.map.addOverlay(this.heads[this.heads.length-1]);
}


