﻿function googleToWgs(src) {
    var source = new Proj4js.Proj('EPSG:900913');
    var dest = new Proj4js.Proj('WGS84');
    var pointSource = new Proj4js.Point(src.lon, src.lat);
    var pointDest = Proj4js.transform(source, dest, pointSource);
    return new OpenLayers.LonLat(pointDest.x, pointDest.y);
}

function wgsToGoogle(src) {
    var source = new Proj4js.Proj('WGS84');
    var dest = new Proj4js.Proj('EPSG:900913');
    var pointSource = new Proj4js.Point(src.lon, src.lat);
    var pointDest = Proj4js.transform(source, dest, pointSource);
    return new OpenLayers.LonLat(pointDest.x, pointDest.y);
}

function parseHash(q) {
    var kvp = (q.length > 1) ? q.substring(1, q.length).split("&") : new Array();
    for (var i in kvp) kvp[i] = kvp[i].split("=");
    var ret = {};
    for (var j in kvp) ret[kvp[j][0]] = kvp[j][1];
    return ret;
}

function distance_render(meters) {
    if (meters < 1000)
        return Math.ceil(meters) + " м";
    return (Math.round(meters / 1000 * 100) / 100) + " kм";
}

function distVincenty(lat1, lon1, lat2, lon2) {
    var a = 6378137, b = 6356752.3142, f = 1 / 298.257223563;  // WGS-84 ellipsiod
    var L = (lon2 - lon1).toRad();
    var U1 = Math.atan((1 - f) * Math.tan(lat1.toRad()));
    var U2 = Math.atan((1 - f) * Math.tan(lat2.toRad()));
    var sinU1 = Math.sin(U1), cosU1 = Math.cos(U1);
    var sinU2 = Math.sin(U2), cosU2 = Math.cos(U2);

    var lambda = L, lambdaP, iterLimit = 100;
    do {
        var sinLambda = Math.sin(lambda), cosLambda = Math.cos(lambda);
        var sinSigma = Math.sqrt((cosU2 * sinLambda) * (cosU2 * sinLambda) +
			(cosU1 * sinU2 - sinU1 * cosU2 * cosLambda) * (cosU1 * sinU2 - sinU1 * cosU2 * cosLambda));
        if (sinSigma == 0) return 0;  // co-incident points
        var cosSigma = sinU1 * sinU2 + cosU1 * cosU2 * cosLambda;
        var sigma = Math.atan2(sinSigma, cosSigma);
        var sinAlpha = cosU1 * cosU2 * sinLambda / sinSigma;
        var cosSqAlpha = 1 - sinAlpha * sinAlpha;
        var cos2SigmaM = cosSigma - 2 * sinU1 * sinU2 / cosSqAlpha;
        if (isNaN(cos2SigmaM)) cos2SigmaM = 0;  // equatorial line: cosSqAlpha=0 (§6)
        var C = f / 16 * cosSqAlpha * (4 + f * (4 - 3 * cosSqAlpha));
        lambdaP = lambda;
        lambda = L + (1 - C) * f * sinAlpha *
			(sigma + C * sinSigma * (cos2SigmaM + C * cosSigma * (-1 + 2 * cos2SigmaM * cos2SigmaM)));
    } while (Math.abs(lambda - lambdaP) > 1e-12 && --iterLimit > 0);

    if (iterLimit == 0) return NaN;  // formula failed to converge

    var uSq = cosSqAlpha * (a * a - b * b) / (b * b);
    var A = 1 + uSq / 16384 * (4096 + uSq * (-768 + uSq * (320 - 175 * uSq)));
    var B = uSq / 1024 * (256 + uSq * (-128 + uSq * (74 - 47 * uSq)));
    var deltaSigma = B * sinSigma * (cos2SigmaM + B / 4 * (cosSigma * (-1 + 2 * cos2SigmaM * cos2SigmaM) -
		B / 6 * cos2SigmaM * (-3 + 4 * sinSigma * sinSigma) * (-3 + 4 * cos2SigmaM * cos2SigmaM)));
    var s = b * A * (sigma - deltaSigma);
    s = s.toFixed(3); // round to 1mm precision
    return s;
}
function getDistance(src, dst) {
    return distVincenty(src.lat, src.lon, dst.lat, dst.lon);
}
Number.prototype.toRad = function() {  // convert degrees to radians
    return this * Math.PI / 180;
}

function regetImages(mapDivId) {
    images = document.getElementById(mapDivId + "_OpenLayers_Container").getElementsByTagName("img");
    for (var i in images) {
        if (images[i] != null) {
            if ($("#" + images[i].id).css("display")=="none") {
                images[i].src = images[i].src;
            }
        }
    }
    setTimeout("regetImages('" + mapDivId + "');", 1000);
}

function Toggle(Sender) {
    var Container = $(Sender).next();
    if (Container.height() > 0) {
        Container.animate({ height: "0px" }, 250);
        $(Sender).removeClass("it_c");
    } else {
        var Height = Container.find("div").height();
        Container.animate({ height: Height + "px" }, 250, function() {
            Container.css("height", "auto");
        });
        $(Sender).addClass("it_c");
    }
}