﻿/////////////////////
//Custom projection
/////////////////////
    function CustomProjection(a,b)
    {
	    this.imageDimension=65536;
	    this.pixelsPerLonDegree=[];
	    this.pixelOrigin=[];
	    this.tileBounds=[];
	    this.tileSize=256;
            this.isWrapped=b;
	    var b=this.tileSize;
	    var c=1;
	    for(var d=0;d<a;d++)
	    {
            var e=b/2;
            this.pixelsPerLonDegree.push(b/360);
            this.pixelOrigin.push(new GPoint(e,e));
            this.tileBounds.push(c);
            b*=2;
            c*=2
        }
    }
 
    CustomProjection.prototype=new GProjection();
  
    CustomProjection.prototype.fromLatLngToPixel=function(latlng,zoom){
        var c=Math.round(this.pixelOrigin[zoom].x+latlng.lng()*this.pixelsPerLonDegree[zoom]);
        var d=Math.round(this.pixelOrigin[zoom].y+(-2*latlng.lat())*this.pixelsPerLonDegree[zoom]);
        return new GPoint(c,d)
    };

    CustomProjection.prototype.fromPixelToLatLng=function(pixel,zoom,unbounded){
        var d=(pixel.x-this.pixelOrigin[zoom].x)/this.pixelsPerLonDegree[zoom];
        var e=-0.5*(pixel.y-this.pixelOrigin[zoom].y)/this.pixelsPerLonDegree[zoom];
        return new GLatLng(e,d,unbounded)
    };

    CustomProjection.prototype.tileCheckRange=function(tile,zoom,tilesize){
        var tileBounds=this.tileBounds[zoom];
	if (tile.y<0 || tile.y >= tileBounds) {return false;}
        if (this.isWrapped) {
		if (tile.x<0 || tile.x>=tileBounds) { 
			tile.x = tile.x%tileBounds; 
			if (tile.x < 0) {tile.x+=tileBounds} 
		}
	}
	else { 
        	if (tile.x<0 || tile.x>=tileBounds) {return false;}
	}  
  	return true;
    }
      
    CustomProjection.prototype.getWrapWidth=function(zoom) {
        return this.tileBounds[zoom]*this.tileSize;
    }
////////////////////////////////////////////////////////////////////////////

    function customGetTileURL(a,b) {
      //converts tile x,y into keyhole string

      var c=Math.pow(2,b);

        var d=a.x;
        var e=a.y;
        var f="t";
        for(var g=0;g<b;g++){
            c=c/2;
            if(e<c){
                if(d<c){f+="q"}
                else{f+="r";d-=c}
            }
            else{
                if(d<c){f+="t";e-=c}
                else{f+="s";d-=c;e-=c}
            }
        }
        return "/assets/images/map-tiles-v6/"+f+".gif"
    }
	
	
	
	
    function addPoint(MapType,GMap, GPoint)	// Add a click listener
    {
        // Add a point to the array of coordinates...
	    if(MapType=="Google")
	    {
            GooPointArray.push(GPoint.toUrlValue());
            GMap.clearOverlays() ;
            for(var n=0;n<GooPointArray.length;n++)
            {
                xy = GooPointArray[n].split(",",2) ;	// Break each point into x and y
                GooMarker[n] = new GMarker(new GLatLng(parseFloat(xy[0]), parseFloat(xy[1])), {icon:redicon, draggable: true});
                GMap.addOverlay(GooMarker[n]);
                GooMarker[n].enableDragging();
                GEvent.addListener(GooMarker[n],'dragend',function(){updatePoints(MapType); drawLine(0, MapType); });
                
            }
	    }
	    if(MapType=="Gautrain")
	    {
            GauPointArray.push(GPoint.toUrlValue());
            GMap.clearOverlays() ;
            for(var n=0;n<GauPointArray.length;n++)
            {
                xy = GauPointArray[n].split(",",2) ;	// Break each point into x and y
                GauMarker[n] = new GMarker(new GLatLng(parseFloat(xy[0]), parseFloat(xy[1])), {icon:redicon, draggable: true});
                GMap.addOverlay(GauMarker[n]);
                GauMarker[n].enableDragging();
                GEvent.addListener(GauMarker[n],'dragend',function(){updatePoints(MapType); drawLine(0, MapType); });
                
            }
	    }
        drawLine(n-1, MapType);
    }
	
	function drawLine(start, MapType)
	{
	    if(MapType=="Google")
	    {
 	        var length = new Number(); 
            GooPoly.length=start; 
            for(var i=start;i<GooMarker.length;i++)
            {
                if(GooLine[i]){GoogleMap.removeOverlay(GooLine[i])};
                GooPoly.push(GooMarker[i].getPoint());
                GooLine[i]=new GPolyline(GooPoly,'#FF0000', 3, 1);
                GoogleMap.addOverlay(GooLine[i]);
                length += parseFloat(GooLine[i].getLength()); 
            }    
	    $("#ctl00_cph1_hidGooPolyLength").val(length);
	    }
	    if(MapType=="Gautrain")
	    {
            GauPoly.length=start; 
            for(var i=start;i<GauMarker.length;i++)
            {
                if(GauLine[i]){GautrainMap.removeOverlay(GauLine[i])};
                GauPoly.push(GauMarker[i].getPoint());
                GauLine[i]=new GPolyline(GauPoly,'#F4BB26', 4, 1);
                GautrainMap.addOverlay(GauLine[i]);
            }
	    }
	}
	
	function updatePoints(MapType)
	{
 	    if(MapType=="Gautrain")
	    {
            GauPointArray=[];
            for(var i=0;i<GauMarker.length;i++)
            {
                GauPointArray.push(GauMarker[i].getLatLng().toUrlValue());
            }	
	    }
	    if(MapType=="Google")
	    {
            GooPointArray=[];
            for(var i=0;i<GooMarker.length;i++)
            {
                GooPointArray.push(GooMarker[i].getLatLng().toUrlValue());
            }	
	    }
	}
	
	function resetMap(MapType)
	{
	    if(MapType=="Google")
	    {
        GoogleMap.clearOverlays() ;
        GooPointArray=[];
        GooMarker=[];
        GooPoly=[];
        GooLine=[];
        }
 	    if(MapType=="Gautrain")
	    {
        GautrainMap.clearOverlays() ;
        GauPointArray=[];
        GauMarker=[];
        GauPoly=[];
        GauLine=[];
	    }
	}
	
	function finalise()
	{
	    tinyMCE.triggerSave(false,true);
	    var pointList=[];
        for(var n=0;n<GooPointArray.length;n++)
        {
            if(GooPointArray[n]!="NaN,NaN" && GooPointArray[n] !=",undefined" && GooPointArray[n] !="")
            {
                xy = GooPointArray[n].split(",",2) ;	// Break each point into x and y
                pointList+=xy[0]+","+xy[1]+"~";
            }
        }
	    $("#ctl00_cph1_hidGooMapCOords").val(pointList);
	    pointList=[];
        for(var n=0;n<GauPointArray.length;n++)
        {
            if(GauPointArray[n]!="NaN,NaN" && GauPointArray[n] !=",undefined" && GauPointArray[n] !="")
            {
                xy = GauPointArray[n].split(",",2) ;	// Break each point into x and y
                pointList+=xy[0]+","+xy[1]+"~";
            }
        }
	    $("#ctl00_cph1_hidGauMapCOords").val(pointList);
	}
	
	function initialiseMarkers()
	{
	try{
        if($("#ctl00_cph1_hidGooMapCOords").val()!="")
        {
            tempArray = $("#ctl00_cph1_hidGooMapCOords").val();
            GooPointArray = tempArray.split("~");
            //for(var n=0;n<tempArray.length;n++)
            //{
            //    GooPointArray.push(tempArray[n]);
            //}
            for(var n=0;n<GooPointArray.length-1;n++)
            {
                if(GooPointArray[n]!="NaN,NaN" && GooPointArray[n] !=",undefined" && GooPointArray[n] !="")
                {
                    xy = GooPointArray[n].split(",",2) ;	// Break each point into x and y
                    GooMarker[n] = new GMarker(new GLatLng(parseFloat(xy[0]), parseFloat(xy[1])), {icon:redicon, draggable: true});
                    GoogleMap.addOverlay(GooMarker[n]);
                    GooMarker[n].enableDragging();
                    GEvent.addListener(GooMarker[n],'dragend',function(){updatePoints("Google"); drawLine(0,"Google"); });
                
                }
                
            }
            drawLine(0,"Google");
        }

        if($("#ctl00_cph1_hidGauMapCOords").val()!="")
        {
            tempArray = $("#ctl00_cph1_hidGauMapCOords").val();
            GauPointArray = tempArray.split("~");
            //for(var n=0;n<tempArray.length;n++)
            //{
            //    GauPointArray.push(tempArray[n]);
            //}
            for(var n=0;n<GauPointArray.length-1;n++)
            {
                if(GauPointArray[n]!="NaN,NaN" && GauPointArray[n] !=",undefined" && GauPointArray[n] !="")
                {
                    xy = GauPointArray[n].split(",",2) ;	// Break each point into x and y
                    GauMarker[n] = new GMarker(new GLatLng(parseFloat(xy[0]), parseFloat(xy[1])), {icon:redicon, draggable: true});
                    GautrainMap.addOverlay(GauMarker[n]);
                    GauMarker[n].enableDragging();
                    GEvent.addListener(GauMarker[n],'dragend',function(){updatePoints("Gautrain"); drawLine(0, "Gautrain"); });
                }
            }
            drawLine(0, "Gautrain");

        }
        }
        catch(ex)
        {
        
        }
	}

