
	/*
		WGS_to_HK1980: Convert WGS coordinates to Hong Kong 1980 grid coordinates

		Version History -
		1.0		Reconstructed from the converter: http://www.hydro.gov.hk/useful/datum/JDatum.html

		Parameters -
		d: Projection reference
			1:	Latitude_of_Projection_Origin: 22.312133333333335 
				Longitude_of_Central_Meridian: 114.17855555555556 
			2:	Latitude_of_Projection_Origin: 22.310602777777778 
				Longitude_of_Central_Meridian: 114.1810138888889 
		d1: Latitude in WGS
		d2: Longitude in WGS
	 */

	function WGS_to_HK1980(d, d1, d2) {

        var radiusdata = new RadiusData();
        var d3 = Math.PI / 180.0;
        var d4;
        var d5;

        if(d == 1.0) {
            d4 = 22.312133333333335 * d3;
            d5 = 114.17855555555556 * d3;
        } 
		else {
            d4 = 22.310602777777778 * d3;
            d5 = 114.1810138888889 * d3;
        }

        var d6 = d1 * d3;
        var d7 = d2 * d3;
        var d8 = SMER(d, 0.0, d4);
        var d9 = SMER(d, 0.0, d6);
        radiusdata = RADIUS(d, d6);
        var d34 = radiusdata.rho;
        var d35 = radiusdata.rmu;
        var d10 = (d7 - d5) * Math.cos(d6);
        var d11 = Math.tan(d6);
        var d12 = d11 * d11;
        var d13 = d12 * d12;
        var d14 = d12 * d13;
        var d15 = d35 / d34;
        var d16 = Math.pow(d15, 2.0);
        var d17 = Math.pow(d15, 3.0);
        var d18 = Math.pow(d15, 4.0);
        var d19 = d9 - d8;
        var d20 = (d35 / 2.0) * Math.pow(d10, 2.0) * d11;
        var d21 = (d20 / 12.0) * Math.pow(d10, 2.0) * ((4.0 * d16 + d15) - d12);
        var d22 = (d21 / 30.0) * Math.pow(d10, 2.0) * ((((8.0 * d18 * (11.0 - 24.0 * d12) - 28.0 * d17 * (1.0 - 6.0 * d12)) + d16 * (1.0 - 32.0 * d12)) - 2.0 * d15 * d12) + d13);
        var d23 = (d22 / 56.0) * Math.pow(d10, 2.0) * (((1385.0 - 3111.0 * d12) + 543.0 * d13) - d14);
        var d36 = d19 + d20 + d21 + d22 + d23 + 819069.80000000005;
        var d24 = d35 * d10;
        var d25 = (d24 / 6.0) * Math.pow(d10, 2.0);
        var d26 = (d25 / 20.0) * Math.pow(d10, 2.0);
        var d27 = (d26 / 42.0) * Math.pow(d10, 2.0);
        d25 *= d15 - d12;
        d26 *= ((4.0 * d17 * (1.0 - 6.0 * d12) + d16 * (1.0 + 8.0 * d12)) - d15 * 2.0 * d12) + d13;
        d27 *= ((61.0 - 479.0 * d12) + 179.0 * d13) - d14;
        var d37 = d24 + d25 + d26 + d27 + 836694.05000000005;

        if (d == 2.0) {
            var d28 = d36;
            var d29 = d37;
            var d30 = 0.99999983729999997;
            var d31 = -2.7858E-005;
            var d32 = -23.098331000000002;
            var d33 = 23.149764999999999;
            d36 = (d30 * d28 - d31 * d29) + d32;
            d37 = d31 * d28 + d30 * d29 + d33;
        }

		return new GridData(d36,d37);
    }

    function SMER(d, d1, d2)
    {
        var d3;
        var d4;

        if (d == 1.0)
        {
            d3 = 6378388.0;
            d4 = 0.0033670033670033669;
        } 
		else {
            d3 = 6378137.0;
            d4 = 0.0033528106647429845;
        }

        var d5 = 2.0 * d4 - Math.pow(d4, 2.0);
        d5 = Math.sqrt(d5);
        var d6 = 1.0 + 0.75 * Math.pow(d5, 2.0) + 0.703125 * Math.pow(d5, 4.0) + 0.68359375 * Math.pow(d5, 6.0);
        var d7 = 0.75 * Math.pow(d5, 2.0) + 0.9375 * Math.pow(d5, 4.0) + 1.025390625 * Math.pow(d5, 6.0);
        var d8 = 0.234375 * Math.pow(d5, 4.0) + 0.41015625 * Math.pow(d5, 6.0);
        var d9 = 0.068359375 * Math.pow(d5, 6.0);
        var d10 = d2 - d1;
        var d11 = Math.sin(2.0 * d2) - Math.sin(2.0 * d1);
        var d12 = Math.sin(4.0 * d2) - Math.sin(4.0 * d1);
        var d13 = Math.sin(6.0 * d2) - Math.sin(6.0 * d1);
        var d14 = d3 * (1.0 - Math.pow(d5, 2.0));
        d14 *= ((d6 * d10 - (d7 * d11) / 2.0) + (d8 * d12) / 4.0) - (d9 * d13) / 6.0;

        return d14;
    }

    function RADIUS(d, d1)
    {
        var d2;
        var d3;

		if (d == 1.0)
        {
            d2 = 6378388;
            d3 = 0.0033670033670033669;
        } 
		else {
            d2 = 6378137;
            d3 = 0.0033528106647429845;
        }

        var d4 = 2.0 * d3 - Math.pow(d3, 2.0);
        var d5 = 1.0 - d4 * Math.pow(Math.sin(d1), 2.0);
        var d6 = (d2 * (1.0 - d4)) / Math.pow(d5, 1.5);
        var d7 = d2 / Math.sqrt(d5);

		return new RadiusData(d6,d7);
    }

	function RadiusData(rho, rmu) {
		this.rho = rho;
		this.rmu = rmu;
	}

	function GridData(N, E) {
		this.N = N;
		this.E = E;
	}

