﻿

Array.prototype.sortNum = function() {
    return this.sort(function(a, b) { return a - b; });
}

// Array.unique( strict ) - Remove duplicate values
Array.prototype.unique = function(b) {
    var a = [], i, l = this.length;
    for (i = 0; i < l; i++) {
        if (a.indexOf(this[i], 0, b) < 0) { a.push(this[i]); }
    }
    return a;
};

Array.prototype.indexOf = function(o) {
    for (var i = 0, len = this.length; i < len; i++) {
        if (this[i] == o) return i;
    }
    return -1;
};
Number.prototype.addCommas = function(){
    if( this != null){
        var nStr = this + '';
	    x = nStr.split('.');
	    x1 = x[0];
	    x2 = x.length > 1 ? '.' + x[1] : '';
	    var rgx = /(\d+)(\d{3})/;
	    while (rgx.test(x1)) {
		    x1 = x1.replace(rgx, '$1' + ',' + '$2');
	    }
	    return x1 + x2;
    }

};
String.prototype.splitCSV = function(sep) {
    for (var foo = this.split(sep = sep || ","), x = foo.length - 1, tl; x >= 0; x--) {
        if (foo[x].replace(/"\s+$/, '"').charAt(foo[x].length - 1) == '"') {
            if ((tl = foo[x].replace(/^\s+"/, '"')).length > 1 && tl.charAt(0) == '"') {
                foo[x] = foo[x].replace(/^\s*"|"\s*$/g, '').replace(/""/g, '"');
            } else if (x) {
                foo.splice(x - 1, 2, [foo[x - 1], foo[x]].join(sep));
            } else foo = foo.shift().split(sep).concat(foo);
        } else foo[x].replace(/""/g, '"');
    } return foo;
};


var CUR = window.CUR || {};

CUR.convertSPToLL = function (uX,uY) {
    var a = 20925604.48;   		//major radius of ellipsoid, map units (NAD 83)
    var ec = 0.08181905782;  		//eccentricity of ellipsoid (NAD 83)
    var angRad = 0.01745329252;  	//number of radians in a degree
    var pi4 = 3.141592653582 / 4;  	//Pi / 4
    var p0 = 40.166667 * angRad; 	 	//latitude of origin
    var p1 = 40.666667 * angRad;  		//latitude of first standard parallel
    var p2 = 41.033333 * angRad;  	//latitude of second standard parallel
    var m0 = -74.0000 * angRad;  	//central meridian
    var x0 = 984250.00; 		//False easting of central meridian, map units

    // Calculate the coordinate system constants.
    with (Math) {
    var m1 = cos(p1) / sqrt(1 - (pow(ec,2)) * pow(sin(p1),2));  
    var m2 = cos(p2) / sqrt(1 - (pow(ec,2)) * pow(sin(p2),2));
    var t0 = tan(pi4 - (p0 / 2));
    var t1 = tan(pi4 - (p1 / 2));
    var t2 = tan(pi4 - (p2 / 2));
    t0 = t0 / pow(((1 - (ec * (sin(p0)))) / (1 + (ec * (sin(p0))))),ec/2);  
    t1 = t1 / pow(((1 - (ec * (sin(p1)))) / (1 + (ec * (sin(p1))))),ec/2);
    t2 = t2 / pow(((1 - (ec * (sin(p2)))) / (1 + (ec * (sin(p2))))),ec/2);
    var n = log(m1 / m2) / log(t1 / t2);
    var f = m1 / (n * pow(t1,n)); 
    var rho0 = a * f * pow(t0,n);

    // Convert the coordinate to Latitude/Longitude.

    // Calculate the Longitude.
    var uX = uX - x0;
    var pi2 = pi4 * 2;

    var rho = sqrt(pow(uX,2) + pow((rho0 - uY),2));  
    var theta = atan(uX / (rho0 - uY));
    var txy = pow((rho / (a * f)),(1 / n));
    var lon = (theta / n) + m0;
    uX = uX + x0;

    // Estimate the Latitude
    var lat0 = pi2 - (2 * atan(txy));

    // Substitute the estimate into the iterative calculation that
    // converges on the correct Latitude value.
    var part1 = (1 - (ec * sin(lat0))) / (1 + (ec * sin(lat0)));
    var lat1 = pi2 - (2 * atan(txy * pow(part1,(ec/2))));

    while ((abs(lat1 - lat0)) > 0.000000002) {
      lat0 = lat1;
      part1 = (1 - (ec * sin(lat0))) / (1 + (ec * sin(lat0)));
      lat1 = pi2 - (2 * atan(txy * pow(part1,(ec/2))));
    }

    // Convert from radians to degrees.
    var Lat = lat1 / angRad;
    var Lon = lon / angRad;

    //alert(lat);
    //alert(lon);

    //Round the latitude and longitude
    //lat = (CLng(lat * 100000)) / 100000;
    //lon = (CLng(lon * 100000)) / 100000;

    //Lat = lat.toPrecision(7);
    //Lon = lon.toPrecision(8);

    return {lon:Lon, lat:Lat};
    //return Lon + "|" + Lat;

    }
};

CUR.convertLLToSP = function(lat, lon) {
//    var a = 20925604.48;   		//major radius of ellipsoid, map units (NAD 83)
//    var ec = 0.08181905782;  		//eccentricity of ellipsoid (NAD 83)
//    var angRad = 0.01745329252;  	//number of radians in a degree
//    var pi4 = 3.141592653582 / 4;  	//Pi / 4
//    var p0 = 40.166667 * angRad; 	 	//latitude of origin
//    var p1 = 40.666667 * angRad;  		//latitude of first standard parallel
//    var p2 = 41.033333 * angRad;  	//latitude of second standard parallel
//    var m0 = -74.0000 * angRad;  	//central meridian
//    var x0 = 984250.00; 		//False easting of central meridian, map units
//    var y0 = 0; 		//False northing of central meridian, map units


        var a = 20925604.48;              // major radius of ellipsoid, map units (NAD 83) CA ZONE 0405
        var e = 0.08181905782;        // eccentricity of ellipsoid (NAD 83) for ca zone 0405
        var angRad = 0.01745329252;    // number of radians in a degree
        var pi4 = 3.141592653582 / 4;  // Pi / 4
       var p0 = 40.166667 * angRad; 	 	//latitude of origin
        var p1 = 40.666667 * angRad;  		//latitude of first standard parallel
        var p2 = 41.033333 * angRad;  	//latitude of second standard parallel
        var m0 = -74.0000 * angRad;  	//central meridian
        var X0 = 984250.00;              // False easting of central meridian, map units
        var Y0 = 0;                // False Northing of central meridian map units

    // Calculate the coordinate system constants.
    with (Math) {
        var m1 = cos(p1) / sqrt(1 - (pow(e, 2)) * pow(sin(p1), 2));
        var m2 = cos(p2) / sqrt(1 - (pow(e, 2)) * pow(sin(p2), 2));
        var t0 = tan(pi4 - (p0 / 2));
        var t1 = tan(pi4 - (p1 / 2));
        var t2 = tan(pi4 - (p2 / 2));
        t0 = t0 / pow(((1 - (e * (sin(p0)))) / (1 + (e * (sin(p0))))), e / 2);
        t1 = t1 / pow(((1 - (e * (sin(p1)))) / (1 + (e * (sin(p1))))), e / 2);
        t2 = t2 / pow(((1 - (e * (sin(p2)))) / (1 + (e * (sin(p2))))), e / 2);
        var n = log(m1 / m2) / log(t1 / t2);
        var f = m1 / (n * pow(t1, n));
        var rho0 = a * f * pow(t0, n);


//            // Calculate the coordinate system constants.
//            var m1 = cos(p1) / sqrt(1 - ((e ^ 2) * sin(p1) ^ 2));
//            var m2 = cos(p2) / sqrt(1 - ((e ^ 2) * sin(p2) ^ 2));
//            var t0 = tan(pi4 - (p0 / 2));
//            var t1 = tan(pi4 - (p1 / 2));
//            var t2 = tan(pi4 - (p2 / 2));
//            t0 = t0 / (((1 - (e * (sin(p0)))) / (1 + (e * (sin(p0))))) ^ (e / 2));
//            t1 = t1 / (((1 - (e * (sin(p1)))) / (1 + (e * (sin(p1))))) ^ (e / 2));
//            t2 = t2 / (((1 - (e * (sin(p2)))) / (1 + (e * (sin(p2))))) ^ (e / 2));
//            var n = log(m1 / m2) / log(t1 / t2);
//            var f = m1 / (n * (t1 ^ n));
//            var rho0 = a * f * (t0 ^ n);

        // Convert the latitude/longitude to a coordinate.
        lat = lat * angRad;
        lon = lon * angRad;
        var t = tan(pi4 - (lat / 2));
        //t = t / (((1 - (e * (sin(lat)))) / (1 + (e * (sin(lat))))) ^ (e / 2));
        t = t / pow((((1 - (e * (sin(lat)))) / (1 + (e * (sin(lat)))))), (e / 2));
        //var rho = a * f * (t ^ n);
        var rho = a * f * (pow(t, n));
        var theta = n * (lon - m0);
        //  false easting
        var x = (rho * sin(theta)) + X0;
        //  false northing
        var y = rho0 - (rho * cos(theta)) + Y0;

        lat = lat / angRad;
        lon = lon / angRad;

        //Round the coordinates
        //x = (CLng(x * 100)) / 100;
        //y = (CLng(y * 100)) / 100;

        //        lat = (CLng(lat * 100000)) / 100000;
        //        lon = (CLng(lon * 100000)) / 100000;


    }
    return { x: x, y: y };
};
