OpenLayers.Format.KML.prototype.fromEPSG = "EPSG:4326";
OpenLayers.Format.KML.prototype.toEPSG   = "EPSG:900913";

var debug_flag=false;

OpenLayers.Format.KML.prototype.parseGeometry.point = function(node) {
    var nodeList = this.getElementsByTagNameNS(node, this.internalns,
                                               "coordinates");
    var coords = [];
    if(nodeList.length > 0) {
        var coordString = nodeList[0].firstChild.nodeValue;
        coordString = coordString.replace(this.regExes.removeSpace, "");
        coords = coordString.split(",");
    }

    var point = null;
    if(coords.length > 1) {
        // preserve third dimension
        if(coords.length == 2) {
            coords[2] = null;
        }

        var x = parseFloat(coords[0]);
        var y = parseFloat(coords[1]);
        var normal = false;

        if(this.fromEPSG=="EPSG:900913" && this.toEPSG=="EPSG:4326")
            var pointA = OpenLayers.Layer.SphericalMercator.inverseMercator(x, y);
        else if(this.fromEPSG=="EPSG:4326" && this.toEPSG=="EPSG:900913")
            var pointA = OpenLayers.Layer.SphericalMercator.forwardMercator(x, y);
        else
            normal = true;

        if(normal)
            point = new OpenLayers.Geometry.Point(coords[0], coords[1], coords[2]);
        else
            point = new OpenLayers.Geometry.Point(pointA.lon, pointA.lat, coords[2]);

    } else {
        throw "Bad coordinate string: " + coordString;
    }
    return point;
}

OpenLayers.Format.KML.prototype.parseGeometry.linestring = function(node, ring) {

    var nodeList = this.getElementsByTagNameNS(node, this.internalns,
                                               "coordinates");
if(debug_flag)
    debugProcess.document.getElementById("TextArea2").value += "Line:" + this.fromEPSG + ", " + this.toEPSG + "\r\n";

    var line = null;
    if(nodeList.length > 0) {
        var coordString = nodeList[0].firstChild.nodeValue;
        coordString = coordString.replace(this.regExes.trimSpace,
                                          "");
        coordString = coordString.replace(this.regExes.trimComma,
                                          ",");
        var pointList = coordString.split(this.regExes.splitSpace);
        var numPoints = pointList.length;
        var points = new Array(numPoints);
        var coords, numCoords;
        for(var i=0; i<numPoints; ++i) {
            coords = pointList[i].split(",");
            numCoords = coords.length;
            if(numCoords > 1) {
                if(coords.length == 2) {
                    coords[2] = null;
                }

                var x = parseFloat(coords[0]);
                var y = parseFloat(coords[1]);
                var normal = false;

                if(this.fromEPSG=="EPSG:900913" && this.toEPSG=="EPSG:4326")
                    var pointA = OpenLayers.Layer.SphericalMercator.inverseMercator(x, y);
                else if(this.fromEPSG=="EPSG:4326" && this.toEPSG=="EPSG:900913")
                    var pointA = OpenLayers.Layer.SphericalMercator.forwardMercator(x, y);
                else
                    normal = true;

                if(normal)
                    points[i] = new OpenLayers.Geometry.Point(coords[0], coords[1], coords[2]);
                else
                    points[i] = new OpenLayers.Geometry.Point(pointA.lon, pointA.lat, coords[2]);

            } else {
                throw "Bad LineString point coordinates: " +
                      pointList[i];
            }
        }
        if(numPoints) {
            if(ring) {
                line = new OpenLayers.Geometry.LinearRing(points);
            } else {
                line = new OpenLayers.Geometry.LineString(points);
            }
        } else {
            throw "Bad LineString coordinates: " + coordString;
        }
    }

    return line;
}

OpenLayers.Format.KML.prototype.buildCoordinatesNode = function(geometry) {
    var coordinatesNode = this.createElementNS(this.kmlns, "coordinates");

    var path;
    var points = geometry.components;
    if(points) {
        // LineString or LinearRing
        var point;
        var numPoints = points.length;
        var parts = new Array(numPoints);
        for(var i=0; i<numPoints; ++i) {
            point = points[i];

            var normal = false;

            if(this.fromEPSG=="EPSG:900913" && this.toEPSG=="EPSG:4326")
                point = OpenLayers.Layer.SphericalMercator.inverseMercator(point.x, point.y);
            else if(this.fromEPSG=="EPSG:4326" && this.toEPSG=="EPSG:900913")
                point = OpenLayers.Layer.SphericalMercator.forwardMercator(point.x, point.y);
            else
                normal = true;
                //point = OpenLayers.Point(x, y);

            if(normal)
                parts[i] = point.x + "," + point.x;
            else
                parts[i] = point.lon + "," + point.lat;

        }
        path = parts.join(" ");
    } else {
        // Point

        var normal = false;

        if(this.fromEPSG=="EPSG:900913" && this.toEPSG=="EPSG:4326")
            point = OpenLayers.Layer.SphericalMercator.inverseMercator(geometry.x, geometry.y);
        else if(this.fromEPSG=="EPSG:4326" && this.toEPSG=="EPSG:900913")
            point = OpenLayers.Layer.SphericalMercator.forwardMercator(geometry.x, geometry.y);
        else
            normal = true;
            //point = OpenLayers.Point(geometry.x, geometry.y);

        if(normal)
            path = point.x + "," + point.y;
        else
            path = point.lon + "," + point.lat;

    }

    var txtNode = this.createTextNode(path);
    coordinatesNode.appendChild(txtNode);

    return coordinatesNode;
}

