aboutsummaryrefslogtreecommitdiffstats
path: root/web/js
diff options
context:
space:
mode:
Diffstat (limited to 'web/js')
-rw-r--r--web/js/OpenLayers.Projection.OrdnanceSurvey.js489
-rw-r--r--web/js/map-OpenStreetMap.js150
-rw-r--r--web/js/map-bing-ol.js96
-rw-r--r--web/js/map-bing.js21
-rw-r--r--web/js/map-google.js22
-rw-r--r--web/js/map-streetview.js88
-rw-r--r--web/js/map-tilma-ol.js42
-rw-r--r--web/js/map-tilma.js320
8 files changed, 1228 insertions, 0 deletions
diff --git a/web/js/OpenLayers.Projection.OrdnanceSurvey.js b/web/js/OpenLayers.Projection.OrdnanceSurvey.js
new file mode 100644
index 000000000..bb596d3bf
--- /dev/null
+++ b/web/js/OpenLayers.Projection.OrdnanceSurvey.js
@@ -0,0 +1,489 @@
+/**
+ * OpenLayers OSGB Grid Projection Transformations
+ *
+ * Conversion to OpenLayers by Thomas Wood (grand.edgemaster@gmail.com)
+ *
+ * this program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * this program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * ---------------------------------------------------------------------------
+ *
+ * PLEASE DO NOT HOTLINK THIS, save this onto your own server
+ * - I cannot guarantee this file will remain here forever.
+ *
+ * ---------------------------------------------------------------------------
+ *
+ * Credits:
+ * Based from the geotools js library by Paul Dixon
+ * GeoTools javascript coordinate transformations
+ * http://files.dixo.net/geotools.html
+ *
+ * Portions of this file copyright (c)2005 Paul Dixon (paul@elphin.com)
+ *
+ * The algorithm used by the script for WGS84-OSGB36 conversions is derived
+ * from an OSGB spreadsheet (www.gps.gov.uk) with permission. This has been
+ * adapted into Perl by Ian Harris, and into PHP by Barry Hunter. Conversion
+ * accuracy is in the order of 7m for 90% of Great Britain, and should be
+ * be similar to the conversion made by a typical GPSr
+ *
+ */
+
+OpenLayers.Projection.OS = {
+
+ /**
+ * Method: projectForwardBritish
+ * Given an object with x and y properties in EPSG:4326, modify the x,y
+ * properties on the object to be the OSGB36 (transverse mercator)
+ * projected coordinates.
+ *
+ * Parameters:
+ * point - {Object} An object with x and y properties.
+ *
+ * Returns:
+ * {Object} The point, with the x and y properties transformed to spherical
+ * mercator.
+ */
+ projectForwardBritish: function(point) {
+ var x1 = OpenLayers.Projection.OS.Lat_Long_H_to_X(point.y,point.x,0,6378137.00,6356752.313);
+ var y1 = OpenLayers.Projection.OS.Lat_Long_H_to_Y(point.y,point.x,0,6378137.00,6356752.313);
+ var z1 = OpenLayers.Projection.OS.Lat_H_to_Z (point.y, 0,6378137.00,6356752.313);
+
+ var x2 = OpenLayers.Projection.OS.Helmert_X(x1,y1,z1,-446.448,-0.2470,-0.8421,20.4894);
+ var y2 = OpenLayers.Projection.OS.Helmert_Y(x1,y1,z1, 125.157,-0.1502,-0.8421,20.4894);
+ var z2 = OpenLayers.Projection.OS.Helmert_Z(x1,y1,z1,-542.060,-0.1502,-0.2470,20.4894);
+
+ var lat2 = OpenLayers.Projection.OS.XYZ_to_Lat (x2,y2,z2,6377563.396,6356256.910);
+ var lon2 = OpenLayers.Projection.OS.XYZ_to_Long(x2,y2);
+
+ point.x = OpenLayers.Projection.OS.Lat_Long_to_East (lat2,lon2,6377563.396,6356256.910,400000,0.999601272,49.00000,-2.00000);
+ point.y = OpenLayers.Projection.OS.Lat_Long_to_North(lat2,lon2,6377563.396,6356256.910,400000,-100000,0.999601272,49.00000,-2.00000);
+
+ return point;
+ },
+
+ /**
+ * Method: projectInverseBritish
+ * Given an object with x and y properties in OSGB36 (transverse mercator),
+ * modify the x,y properties on the object to be the unprojected coordinates.
+ *
+ * Parameters:
+ * point - {Object} An object with x and y properties.
+ *
+ * Returns:
+ * {Object} The point, with the x and y properties transformed from
+ * OSGB36 to unprojected coordinates..
+ */
+ projectInverseBritish: function(point) {
+ var lat1 = OpenLayers.Projection.OS.E_N_to_Lat (point.x,point.y,6377563.396,6356256.910,400000,-100000,0.999601272,49.00000,-2.00000);
+ var lon1 = OpenLayers.Projection.OS.E_N_to_Long(point.x,point.y,6377563.396,6356256.910,400000,-100000,0.999601272,49.00000,-2.00000);
+
+ var x1 = OpenLayers.Projection.OS.Lat_Long_H_to_X(lat1,lon1,0,6377563.396,6356256.910);
+ var y1 = OpenLayers.Projection.OS.Lat_Long_H_to_Y(lat1,lon1,0,6377563.396,6356256.910);
+ var z1 = OpenLayers.Projection.OS.Lat_H_to_Z (lat1, 0,6377563.396,6356256.910);
+
+ var x2 = OpenLayers.Projection.OS.Helmert_X(x1,y1,z1,446.448 ,0.2470,0.8421,-20.4894);
+ var y2 = OpenLayers.Projection.OS.Helmert_Y(x1,y1,z1,-125.157,0.1502,0.8421,-20.4894);
+ var z2 = OpenLayers.Projection.OS.Helmert_Z(x1,y1,z1,542.060 ,0.1502,0.2470,-20.4894);
+
+ var lat = OpenLayers.Projection.OS.XYZ_to_Lat(x2,y2,z2,6378137.000,6356752.313);
+ var lon = OpenLayers.Projection.OS.XYZ_to_Long(x2,y2);
+
+ point.x = lon;
+ point.y = lat;
+ return point;
+ },
+
+ goog2osgb: function(point) {
+ return OpenLayers.Projection.OS.projectForwardBritish(OpenLayers.Layer.SphericalMercator.projectInverse(point));
+ },
+
+ osgb2goog: function(point) {
+ return OpenLayers.Layer.SphericalMercator.projectForward(OpenLayers.Projection.OS.projectInverseBritish(point));
+ },
+
+ /*****
+ * Mathematical functions
+ *****/
+ E_N_to_Lat: function(East, North, a, b, e0, n0, f0, PHI0, LAM0) {
+ //Un-project Transverse Mercator eastings and northings back to latitude.
+ //eastings (East) and northings (North) in meters; _
+ //ellipsoid axis dimensions (a & b) in meters; _
+ //eastings (e0) and northings (n0) of false origin in meters; _
+ //central meridian scale factor (f0) and _
+ //latitude (PHI0) and longitude (LAM0) of false origin in decimal degrees.
+
+ //Convert angle measures to radians
+ var Pi = 3.14159265358979;
+ var RadPHI0 = PHI0 * (Pi / 180);
+ var RadLAM0 = LAM0 * (Pi / 180);
+
+ //Compute af0, bf0, e squared (e2), n and Et
+ var af0 = a * f0;
+ var bf0 = b * f0;
+ var e2 = (Math.pow(af0,2) - Math.pow(bf0,2)) / Math.pow(af0,2);
+ var n = (af0 - bf0) / (af0 + bf0);
+ var Et = East - e0;
+
+ //Compute initial value for latitude (PHI) in radians
+ var PHId = OpenLayers.Projection.OS.InitialLat(North, n0, af0, RadPHI0, n, bf0);
+
+ //Compute nu, rho and eta2 using value for PHId
+ var nu = af0 / (Math.sqrt(1 - (e2 * ( Math.pow(Math.sin(PHId),2)))));
+ var rho = (nu * (1 - e2)) / (1 - (e2 * Math.pow(Math.sin(PHId),2)));
+ var eta2 = (nu / rho) - 1;
+
+ //Compute Latitude
+ var VII = (Math.tan(PHId)) / (2 * rho * nu);
+ var VIII = ((Math.tan(PHId)) / (24 * rho * Math.pow(nu,3))) * (5 + (3 * (Math.pow(Math.tan(PHId),2))) + eta2 - (9 * eta2 * (Math.pow(Math.tan(PHId),2))));
+ var IX = ((Math.tan(PHId)) / (720 * rho * Math.pow(nu,5))) * (61 + (90 * ((Math.tan(PHId)) ^ 2)) + (45 * (Math.pow(Math.tan(PHId),4))));
+
+ var E_N_to_Lat = (180 / Pi) * (PHId - (Math.pow(Et,2) * VII) + (Math.pow(Et,4) * VIII) - ((Et ^ 6) * IX));
+
+ return (E_N_to_Lat);
+ },
+
+ E_N_to_Long: function(East, North, a, b, e0, n0, f0, PHI0, LAM0) {
+ //Un-project Transverse Mercator eastings and northings back to longitude.
+ //eastings (East) and northings (North) in meters; _
+ //ellipsoid axis dimensions (a & b) in meters; _
+ //eastings (e0) and northings (n0) of false origin in meters; _
+ //central meridian scale factor (f0) and _
+ //latitude (PHI0) and longitude (LAM0) of false origin in decimal degrees.
+
+ //Convert angle measures to radians
+ var Pi = 3.14159265358979;
+ var RadPHI0 = PHI0 * (Pi / 180);
+ var RadLAM0 = LAM0 * (Pi / 180);
+
+ //Compute af0, bf0, e squared (e2), n and Et
+ var af0 = a * f0;
+ var bf0 = b * f0;
+ var e2 = (Math.pow(af0,2) - Math.pow(bf0,2)) / Math.pow(af0,2);
+ var n = (af0 - bf0) / (af0 + bf0);
+ var Et = East - e0;
+
+ //Compute initial value for latitude (PHI) in radians
+ var PHId = OpenLayers.Projection.OS.InitialLat(North, n0, af0, RadPHI0, n, bf0);
+
+ //Compute nu, rho and eta2 using value for PHId
+ var nu = af0 / (Math.sqrt(1 - (e2 * (Math.pow(Math.sin(PHId),2)))));
+ var rho = (nu * (1 - e2)) / (1 - (e2 * Math.pow(Math.sin(PHId),2)));
+ var eta2 = (nu / rho) - 1;
+
+ //Compute Longitude
+ var X = (Math.pow(Math.cos(PHId),-1)) / nu;
+ var XI = ((Math.pow(Math.cos(PHId),-1)) / (6 * Math.pow(nu,3))) * ((nu / rho) + (2 * (Math.pow(Math.tan(PHId),2))));
+ var XII = ((Math.pow(Math.cos(PHId),-1)) / (120 * Math.pow(nu,5))) * (5 + (28 * (Math.pow(Math.tan(PHId),2))) + (24 * (Math.pow(Math.tan(PHId),4))));
+ var XIIA = ((Math.pow(Math.cos(PHId),-1)) / (5040 * Math.pow(nu,7))) * (61 + (662 * (Math.pow(Math.tan(PHId),2))) + (1320 * (Math.pow(Math.tan(PHId),4))) + (720 * (Math.pow(Math.tan(PHId),6))));
+
+ var E_N_to_Long = (180 / Pi) * (RadLAM0 + (Et * X) - (Math.pow(Et,3) * XI) + (Math.pow(Et,5) * XII) - (Math.pow(Et,7) * XIIA));
+
+ return E_N_to_Long;
+ },
+
+ InitialLat: function(North, n0, afo, PHI0, n, bfo) {
+ //Compute initial value for Latitude (PHI) IN RADIANS.
+ //northing of point (North) and northing of false origin (n0) in meters; _
+ //semi major axis multiplied by central meridian scale factor (af0) in meters; _
+ //latitude of false origin (PHI0) IN RADIANS; _
+ //n (computed from a, b and f0) and _
+ //ellipsoid semi major axis multiplied by central meridian scale factor (bf0) in meters.
+
+ //First PHI value (PHI1)
+ var PHI1 = ((North - n0) / afo) + PHI0;
+
+ //Calculate M
+ var M = OpenLayers.Projection.OS.Marc(bfo, n, PHI0, PHI1);
+
+ //Calculate new PHI value (PHI2)
+ var PHI2 = ((North - n0 - M) / afo) + PHI1;
+
+ //Iterate to get final value for InitialLat
+ while (Math.abs(North - n0 - M) > 0.00001)
+ {
+ PHI2 = ((North - n0 - M) / afo) + PHI1;
+ M = OpenLayers.Projection.OS.Marc(bfo, n, PHI0, PHI2);
+ PHI1 = PHI2;
+ }
+ return PHI2;
+ },
+
+ Lat_Long_H_to_X: function(PHI, LAM, H, a, b) {
+ // Convert geodetic coords lat (PHI), long (LAM) and height (H) to cartesian X coordinate.
+ // Input: - _
+ // Latitude (PHI)& Longitude (LAM) both in decimal degrees; _
+ // Ellipsoidal height (H) and ellipsoid axis dimensions (a & b) all in meters.
+
+ // Convert angle measures to radians
+ var Pi = 3.14159265358979;
+ var RadPHI = PHI * (Pi / 180);
+ var RadLAM = LAM * (Pi / 180);
+
+ // Compute eccentricity squared and nu
+ var e2 = (Math.pow(a,2) - Math.pow(b,2)) / Math.pow(a,2);
+ var V = a / (Math.sqrt(1 - (e2 * ( Math.pow(Math.sin(RadPHI),2)))));
+
+ // Compute X
+ return (V + H) * (Math.cos(RadPHI)) * (Math.cos(RadLAM));
+ },
+
+
+ Lat_Long_H_to_Y: function(PHI, LAM, H, a, b) {
+ // Convert geodetic coords lat (PHI), long (LAM) and height (H) to cartesian Y coordinate.
+ // Input: - _
+ // Latitude (PHI)& Longitude (LAM) both in decimal degrees; _
+ // Ellipsoidal height (H) and ellipsoid axis dimensions (a & b) all in meters.
+
+ // Convert angle measures to radians
+ var Pi = 3.14159265358979;
+ var RadPHI = PHI * (Pi / 180);
+ var RadLAM = LAM * (Pi / 180);
+
+ // Compute eccentricity squared and nu
+ var e2 = (Math.pow(a,2) - Math.pow(b,2)) / Math.pow(a,2);
+ var V = a / (Math.sqrt(1 - (e2 * ( Math.pow(Math.sin(RadPHI),2))) ));
+
+ // Compute Y
+ return (V + H) * (Math.cos(RadPHI)) * (Math.sin(RadLAM));
+ },
+
+
+ Lat_H_to_Z: function(PHI, H, a, b) {
+ // Convert geodetic coord components latitude (PHI) and height (H) to cartesian Z coordinate.
+ // Input: - _
+ // Latitude (PHI) decimal degrees; _
+ // Ellipsoidal height (H) and ellipsoid axis dimensions (a & b) all in meters.
+
+ // Convert angle measures to radians
+ var Pi = 3.14159265358979;
+ var RadPHI = PHI * (Pi / 180);
+
+ // Compute eccentricity squared and nu
+ var e2 = (Math.pow(a,2) - Math.pow(b,2)) / Math.pow(a,2);
+ var V = a / (Math.sqrt(1 - (e2 * ( Math.pow(Math.sin(RadPHI),2)) )));
+
+ // Compute X
+ return ((V * (1 - e2)) + H) * (Math.sin(RadPHI));
+ },
+
+
+ Helmert_X: function(X,Y,Z,DX,Y_Rot,Z_Rot,s) {
+
+ // (X, Y, Z, DX, Y_Rot, Z_Rot, s)
+ // Computed Helmert transformed X coordinate.
+ // Input: - _
+ // cartesian XYZ coords (X,Y,Z), X translation (DX) all in meters ; _
+ // Y and Z rotations in seconds of arc (Y_Rot, Z_Rot) and scale in ppm (s).
+
+ // Convert rotations to radians and ppm scale to a factor
+ var Pi = 3.14159265358979;
+ var sfactor = s * 0.000001;
+
+ var RadY_Rot = (Y_Rot / 3600) * (Pi / 180);
+
+ var RadZ_Rot = (Z_Rot / 3600) * (Pi / 180);
+
+ //Compute transformed X coord
+ return (X + (X * sfactor) - (Y * RadZ_Rot) + (Z * RadY_Rot) + DX);
+ },
+
+
+ Helmert_Y: function(X,Y,Z,DY,X_Rot,Z_Rot,s) {
+ // Computed Helmert transformed Y coordinate.
+ // Input: - _
+ // cartesian XYZ coords (X,Y,Z), Y translation (DY) all in meters ; _
+ // X and Z rotations in seconds of arc (X_Rot, Z_Rot) and scale in ppm (s).
+
+ // Convert rotations to radians and ppm scale to a factor
+ var Pi = 3.14159265358979;
+ var sfactor = s * 0.000001;
+ var RadX_Rot = (X_Rot / 3600) * (Pi / 180);
+ var RadZ_Rot = (Z_Rot / 3600) * (Pi / 180);
+
+ // Compute transformed Y coord
+ return (X * RadZ_Rot) + Y + (Y * sfactor) - (Z * RadX_Rot) + DY;
+ },
+
+
+
+ Helmert_Z: function(X, Y, Z, DZ, X_Rot, Y_Rot, s) {
+ // Computed Helmert transformed Z coordinate.
+ // Input: - _
+ // cartesian XYZ coords (X,Y,Z), Z translation (DZ) all in meters ; _
+ // X and Y rotations in seconds of arc (X_Rot, Y_Rot) and scale in ppm (s).
+ //
+ // Convert rotations to radians and ppm scale to a factor
+ var Pi = 3.14159265358979;
+ var sfactor = s * 0.000001;
+ var RadX_Rot = (X_Rot / 3600) * (Pi / 180);
+ var RadY_Rot = (Y_Rot / 3600) * (Pi / 180);
+
+ // Compute transformed Z coord
+ return (-1 * X * RadY_Rot) + (Y * RadX_Rot) + Z + (Z * sfactor) + DZ;
+ } ,
+
+ XYZ_to_Lat: function(X, Y, Z, a, b) {
+ // Convert XYZ to Latitude (PHI) in Dec Degrees.
+ // Input: - _
+ // XYZ cartesian coords (X,Y,Z) and ellipsoid axis dimensions (a & b), all in meters.
+
+ // this FUNCTION REQUIRES THE "Iterate_XYZ_to_Lat" FUNCTION
+ // this FUNCTION IS CALLED BY THE "XYZ_to_H" FUNCTION
+
+ var RootXYSqr = Math.sqrt(Math.pow(X,2) + Math.pow(Y,2));
+ var e2 = (Math.pow(a,2) - Math.pow(b,2)) / Math.pow(a,2);
+ var PHI1 = Math.atan2(Z , (RootXYSqr * (1 - e2)) );
+
+ var PHI = OpenLayers.Projection.OS.Iterate_XYZ_to_Lat(a, e2, PHI1, Z, RootXYSqr);
+
+ var Pi = 3.14159265358979;
+
+ return PHI * (180 / Pi);
+ },
+
+
+ Iterate_XYZ_to_Lat: function(a, e2, PHI1, Z, RootXYSqr) {
+ // Iteratively computes Latitude (PHI).
+ // Input: - _
+ // ellipsoid semi major axis (a) in meters; _
+ // eta squared (e2); _
+ // estimated value for latitude (PHI1) in radians; _
+ // cartesian Z coordinate (Z) in meters; _
+ // RootXYSqr computed from X & Y in meters.
+
+ // this FUNCTION IS CALLED BY THE "XYZ_to_PHI" FUNCTION
+ // this FUNCTION IS ALSO USED ON IT'S OWN IN THE _
+ // "Projection and Transformation Calculations.xls" SPREADSHEET
+
+
+ var V = a / (Math.sqrt(1 - (e2 * Math.pow(Math.sin(PHI1),2))));
+ var PHI2 = Math.atan2((Z + (e2 * V * (Math.sin(PHI1)))) , RootXYSqr);
+
+ while (Math.abs(PHI1 - PHI2) > 0.000000001) {
+ PHI1 = PHI2;
+ V = a / (Math.sqrt(1 - (e2 * Math.pow(Math.sin(PHI1),2))));
+ PHI2 = Math.atan2((Z + (e2 * V * (Math.sin(PHI1)))) , RootXYSqr);
+ }
+
+ return PHI2;
+ },
+
+
+ XYZ_to_Long: function (X, Y) {
+ // Convert XYZ to Longitude (LAM) in Dec Degrees.
+ // Input: - _
+ // X and Y cartesian coords in meters.
+
+ var Pi = 3.14159265358979;
+ return Math.atan2(Y , X) * (180 / Pi);
+ },
+
+ Marc: function (bf0, n, PHI0, PHI) {
+ //Compute meridional arc.
+ //Input: - _
+ // ellipsoid semi major axis multiplied by central meridian scale factor (bf0) in meters; _
+ // n (computed from a, b and f0); _
+ // lat of false origin (PHI0) and initial or final latitude of point (PHI) IN RADIANS.
+
+ //this FUNCTION IS CALLED BY THE - _
+ // "Lat_Long_to_North" and "InitialLat" FUNCTIONS
+ // this FUNCTION IS ALSO USED ON IT'S OWN IN THE "Projection and Transformation Calculations.xls" SPREADSHEET
+
+ return bf0 * (((1 + n + ((5 / 4) * Math.pow(n,2)) + ((5 / 4) * Math.pow(n,3))) * (PHI - PHI0)) - (((3 * n) + (3 * Math.pow(n,2)) + ((21 / 8) * Math.pow(n,3))) * (Math.sin(PHI - PHI0)) * (Math.cos(PHI + PHI0))) + ((((15 / 8
+ ) * Math.pow(n,2)) + ((15 / 8) * Math.pow(n,3))) * (Math.sin(2 * (PHI - PHI0))) * (Math.cos(2 * (PHI + PHI0)))) - (((35 / 24) * Math.pow(n,3)) * (Math.sin(3 * (PHI - PHI0))) * (Math.cos(3 * (PHI + PHI0)))));
+ },
+
+ Lat_Long_to_East: function (PHI, LAM, a, b, e0, f0, PHI0, LAM0) {
+ //Project Latitude and longitude to Transverse Mercator eastings.
+ //Input: - _
+ // Latitude (PHI) and Longitude (LAM) in decimal degrees; _
+ // ellipsoid axis dimensions (a & b) in meters; _
+ // eastings of false origin (e0) in meters; _
+ // central meridian scale factor (f0); _
+ // latitude (PHI0) and longitude (LAM0) of false origin in decimal degrees.
+
+ // Convert angle measures to radians
+ var Pi = 3.14159265358979;
+ var RadPHI = PHI * (Pi / 180);
+ var RadLAM = LAM * (Pi / 180);
+ var RadPHI0 = PHI0 * (Pi / 180);
+ var RadLAM0 = LAM0 * (Pi / 180);
+
+ var af0 = a * f0;
+ var bf0 = b * f0;
+ var e2 = (Math.pow(af0,2) - Math.pow(bf0,2)) / Math.pow(af0,2);
+ var n = (af0 - bf0) / (af0 + bf0);
+ var nu = af0 / (Math.sqrt(1 - (e2 * Math.pow(Math.sin(RadPHI),2) )));
+ var rho = (nu * (1 - e2)) / (1 - (e2 * Math.pow(Math.sin(RadPHI),2) ));
+ var eta2 = (nu / rho) - 1;
+ var p = RadLAM - RadLAM0;
+
+ var IV = nu * (Math.cos(RadPHI));
+ var V = (nu / 6) * ( Math.pow(Math.cos(RadPHI),3)) * ((nu / rho) - (Math.pow(Math.tan(RadPHI),2)));
+ var VI = (nu / 120) * (Math.pow(Math.cos(RadPHI),5)) * (5 - (18 * (Math.pow(Math.tan(RadPHI),2))) + (Math.pow(Math.tan(RadPHI),4)) + (14 * eta2) - (58 * (Math.pow(Math.tan(RadPHI),2)) * eta2));
+
+ return e0 + (p * IV) + (Math.pow(p,3) * V) + (Math.pow(p,5) * VI);
+ },
+
+ Lat_Long_to_North: function (PHI, LAM, a, b, e0, n0, f0, PHI0, LAM0) {
+ // Project Latitude and longitude to Transverse Mercator northings
+ // Input: - _
+ // Latitude (PHI) and Longitude (LAM) in decimal degrees; _
+ // ellipsoid axis dimensions (a & b) in meters; _
+ // eastings (e0) and northings (n0) of false origin in meters; _
+ // central meridian scale factor (f0); _
+ // latitude (PHI0) and longitude (LAM0) of false origin in decimal degrees.
+
+ // REQUIRES THE "Marc" FUNCTION
+
+ // Convert angle measures to radians
+ var Pi = 3.14159265358979;
+ var RadPHI = PHI * (Pi / 180);
+ var RadLAM = LAM * (Pi / 180);
+ var RadPHI0 = PHI0 * (Pi / 180);
+ var RadLAM0 = LAM0 * (Pi / 180);
+
+ var af0 = a * f0;
+ var bf0 = b * f0;
+ var e2 = (Math.pow(af0,2) - Math.pow(bf0,2)) / Math.pow(af0,2);
+ var n = (af0 - bf0) / (af0 + bf0);
+ var nu = af0 / (Math.sqrt(1 - (e2 * Math.pow(Math.sin(RadPHI),2))));
+ var rho = (nu * (1 - e2)) / (1 - (e2 * Math.pow(Math.sin(RadPHI),2)));
+ var eta2 = (nu / rho) - 1;
+ var p = RadLAM - RadLAM0;
+ var M = OpenLayers.Projection.OS.Marc(bf0, n, RadPHI0, RadPHI);
+
+ var I = M + n0;
+ var II = (nu / 2) * (Math.sin(RadPHI)) * (Math.cos(RadPHI));
+ var III = ((nu / 24) * (Math.sin(RadPHI)) * (Math.pow(Math.cos(RadPHI),3))) * (5 - (Math.pow(Math.tan(RadPHI),2)) + (9 * eta2));
+ var IIIA = ((nu / 720) * (Math.sin(RadPHI)) * (Math.pow(Math.cos(RadPHI),5))) * (61 - (58 * (Math.pow(Math.tan(RadPHI),2))) + (Math.pow(Math.tan(RadPHI),4)));
+
+ return I + (Math.pow(p,2) * II) + (Math.pow(p,4) * III) + (Math.pow(p,6) * IIIA);
+ }
+
+};
+
+/**
+ * Note: Two transforms declared
+ * Transforms from EPSG:4326 to EPSG:27700 and from EPSG:27700 to EPSG:4326
+ * are set by this class.
+ */
+OpenLayers.Projection.addTransform("EPSG:4326", "EPSG:27700",
+ OpenLayers.Projection.OS.projectForwardBritish);
+OpenLayers.Projection.addTransform("EPSG:27700", "EPSG:4326",
+ OpenLayers.Projection.OS.projectInverseBritish);
+OpenLayers.Projection.addTransform("EPSG:900913", "EPSG:27700",
+ OpenLayers.Projection.OS.goog2osgb);
+OpenLayers.Projection.addTransform("EPSG:27700", "EPSG:900913",
+ OpenLayers.Projection.OS.osgb2goog);
diff --git a/web/js/map-OpenStreetMap.js b/web/js/map-OpenStreetMap.js
new file mode 100644
index 000000000..04237e075
--- /dev/null
+++ b/web/js/map-OpenStreetMap.js
@@ -0,0 +1,150 @@
+YAHOO.util.Event.onContentReady('map', function() {
+ var map = new OpenLayers.Map("map", {
+ controls: [
+ new OpenLayers.Control.ArgParser(),
+ //new OpenLayers.Control.LayerSwitcher(),
+ new OpenLayers.Control.Navigation(),
+ new OpenLayers.Control.PanZoom()
+ ],
+ displayProjection: new OpenLayers.Projection("EPSG:4326")
+ });
+ var streetview = new fixmystreet.map_type("", {
+ zoomOffset: 14,
+ numZoomLevels: 4
+ });
+ map.addLayer(streetview);
+
+ var centre = new OpenLayers.LonLat( fixmystreet.easting, fixmystreet.northing );
+ centre.transform(
+ new OpenLayers.Projection("EPSG:27700"),
+ map.getProjectionObject()
+ );
+ map.setCenter(centre, 2);
+});
+
+
+// http://www.openstreetmap.org/openlayers/OpenStreetMap.js (added maxResolution)
+
+/**
+ * Namespace: Util.OSM
+ */
+OpenLayers.Util.OSM = {};
+
+/**
+ * Constant: MISSING_TILE_URL
+ * {String} URL of image to display for missing tiles
+ */
+OpenLayers.Util.OSM.MISSING_TILE_URL = "http://www.openstreetmap.org/openlayers/img/404.png";
+
+/**
+ * Property: originalOnImageLoadError
+ * {Function} Original onImageLoadError function.
+ */
+OpenLayers.Util.OSM.originalOnImageLoadError = OpenLayers.Util.onImageLoadError;
+
+/**
+ * Function: onImageLoadError
+ */
+OpenLayers.Util.onImageLoadError = function() {
+ if (this.src.match(/^http:\/\/[abc]\.[a-z]+\.openstreetmap\.org\//)) {
+ this.src = OpenLayers.Util.OSM.MISSING_TILE_URL;
+ } else if (this.src.match(/^http:\/\/[def]\.tah\.openstreetmap\.org\//)) {
+ // do nothing - this layer is transparent
+ } else {
+ OpenLayers.Util.OSM.originalOnImageLoadError;
+ }
+};
+
+/**
+ * Class: OpenLayers.Layer.OSM.Mapnik
+ *
+ * Inherits from:
+ * - <OpenLayers.Layer.OSM>
+ */
+OpenLayers.Layer.OSM.Mapnik = OpenLayers.Class(OpenLayers.Layer.OSM, {
+ /**
+ * Constructor: OpenLayers.Layer.OSM.Mapnik
+ *
+ * Parameters:
+ * name - {String}
+ * options - {Object} Hashtable of extra options to tag onto the layer
+ */
+ initialize: function(name, options) {
+ var url = [
+ "http://a.tile.openstreetmap.org/${z}/${x}/${y}.png",
+ "http://b.tile.openstreetmap.org/${z}/${x}/${y}.png",
+ "http://c.tile.openstreetmap.org/${z}/${x}/${y}.png"
+ ];
+ options = OpenLayers.Util.extend({
+ /* Below line added to OSM's file in order to allow minimum zoom level */
+ maxResolution: 156543.0339/Math.pow(2, options.zoomOffset || 0),
+ numZoomLevels: 19,
+ buffer: 0
+ }, options);
+ var newArguments = [name, url, options];
+ OpenLayers.Layer.OSM.prototype.initialize.apply(this, newArguments);
+ },
+
+ CLASS_NAME: "OpenLayers.Layer.OSM.Mapnik"
+});
+
+/**
+ * Class: OpenLayers.Layer.OSM.Osmarender
+ *
+ * Inherits from:
+ * - <OpenLayers.Layer.OSM>
+ */
+OpenLayers.Layer.OSM.Osmarender = OpenLayers.Class(OpenLayers.Layer.OSM, {
+ /**
+ * Constructor: OpenLayers.Layer.OSM.Osmarender
+ *
+ * Parameters:
+ * name - {String}
+ * options - {Object} Hashtable of extra options to tag onto the layer
+ */
+ initialize: function(name, options) {
+ var url = [
+ "http://a.tah.openstreetmap.org/Tiles/tile/${z}/${x}/${y}.png",
+ "http://b.tah.openstreetmap.org/Tiles/tile/${z}/${x}/${y}.png",
+ "http://c.tah.openstreetmap.org/Tiles/tile/${z}/${x}/${y}.png"
+ ];
+ options = OpenLayers.Util.extend({ numZoomLevels: 18, buffer: 0 }, options);
+ var newArguments = [name, url, options];
+ OpenLayers.Layer.OSM.prototype.initialize.apply(this, newArguments);
+ },
+
+ CLASS_NAME: "OpenLayers.Layer.OSM.Osmarender"
+});
+
+/**
+ * Class: OpenLayers.Layer.OSM.CycleMap
+ *
+ * Inherits from:
+ * - <OpenLayers.Layer.OSM>
+ */
+OpenLayers.Layer.OSM.CycleMap = OpenLayers.Class(OpenLayers.Layer.OSM, {
+ /**
+ * Constructor: OpenLayers.Layer.OSM.CycleMap
+ *
+ * Parameters:
+ * name - {String}
+ * options - {Object} Hashtable of extra options to tag onto the layer
+ */
+ initialize: function(name, options) {
+ var url = [
+ "http://a.tile.opencyclemap.org/cycle/${z}/${x}/${y}.png",
+ "http://b.tile.opencyclemap.org/cycle/${z}/${x}/${y}.png",
+ "http://c.tile.opencyclemap.org/cycle/${z}/${x}/${y}.png"
+ ];
+ options = OpenLayers.Util.extend({
+ /* Below line added to OSM's file in order to allow minimum zoom level */
+ maxResolution: 156543.0339/Math.pow(2, options.zoomOffset || 0),
+ numZoomLevels: 19,
+ buffer: 0
+ }, options);
+ var newArguments = [name, url, options];
+ OpenLayers.Layer.OSM.prototype.initialize.apply(this, newArguments);
+ },
+
+ CLASS_NAME: "OpenLayers.Layer.OSM.CycleMap"
+});
diff --git a/web/js/map-bing-ol.js b/web/js/map-bing-ol.js
new file mode 100644
index 000000000..ba9445326
--- /dev/null
+++ b/web/js/map-bing-ol.js
@@ -0,0 +1,96 @@
+YAHOO.util.Event.onContentReady('map', function() {
+ var map = new OpenLayers.Map("map", {
+ controls: [
+ new OpenLayers.Control.ArgParser(),
+ //new OpenLayers.Control.LayerSwitcher(),
+ new OpenLayers.Control.Navigation(),
+ new OpenLayers.Control.PanZoom()
+ ],
+ displayProjection: new OpenLayers.Projection("EPSG:4326")
+ });
+ var bing = new OpenLayers.Layer.Bing("", {
+ zoomOffset: 13,
+ numZoomLevels: 4
+ });
+ map.addLayer(bing);
+
+ var centre = new OpenLayers.LonLat( fixmystreet.easting, fixmystreet.northing );
+ centre.transform(
+ new OpenLayers.Projection("EPSG:27700"),
+ map.getProjectionObject()
+ );
+ map.setCenter(centre, 3);
+});
+
+OpenLayers.Util.OS = {};
+OpenLayers.Util.OS.MISSING_TILE_URL = "http://openstreetmap.org/openlayers/img/404.png";
+OpenLayers.Util.OS.originalOnImageLoadError = OpenLayers.Util.onImageLoadError;
+OpenLayers.Util.onImageLoadError = function() {
+ OpenLayers.Util.OS.originalOnImageLoadError;
+};
+
+OpenLayers.Layer.Bing = OpenLayers.Class(OpenLayers.Layer.XYZ, {
+ initialize: function(name, options) {
+ var url = [];
+ options = OpenLayers.Util.extend({
+ /* Below line added to OSM's file in order to allow minimum zoom level */
+ maxResolution: 156543.0339/Math.pow(2, options.zoomOffset || 0),
+ numZoomLevels: 18,
+ transitionEffect: "resize",
+ sphericalMercator: true,
+ attribution: "© Microsoft / OS 2010"
+ }, options);
+ var newArguments = [name, url, options];
+ OpenLayers.Layer.XYZ.prototype.initialize.apply(this, newArguments);
+ },
+
+ get_quadkey: function(x, y, level) {
+ var key = '';
+ for (var i = level; i > 0; i--) {
+ var digit = 0;
+ var mask = 1 << (i - 1);
+ if ((x & mask) != 0) {
+ digit++;
+ }
+ if ((y & mask) != 0) {
+ digit += 2;
+ }
+ key += digit;
+ }
+ return key;
+ },
+
+ getURL: function (bounds) {
+ var res = this.map.getResolution();
+ var x = Math.round((bounds.left - this.maxExtent.left)
+ / (res * this.tileSize.w));
+ var y = Math.round((this.maxExtent.top - bounds.top)
+ / (res * this.tileSize.h));
+ var z = this.serverResolutions != null ?
+ OpenLayers.Util.indexOf(this.serverResolutions, res) :
+ this.map.getZoom() + this.zoomOffset;
+
+ if (z == 16) {
+ var url = [
+ "http://a.os.openstreetmap.org/sv/${z}/${x}/${y}.png",
+ "http://b.os.openstreetmap.org/sv/${z}/${x}/${y}.png",
+ "http://c.os.openstreetmap.org/sv/${z}/${x}/${y}.png"
+ ];
+ } else {
+ var url = [
+ "http://ecn.t0.tiles.virtualearth.net/tiles/r${id}.png?g=587&productSet=mmOS",
+ "http://ecn.t1.tiles.virtualearth.net/tiles/r${id}.png?g=587&productSet=mmOS",
+ "http://ecn.t2.tiles.virtualearth.net/tiles/r${id}.png?g=587&productSet=mmOS",
+ "http://ecn.t3.tiles.virtualearth.net/tiles/r${id}.png?g=587&productSet=mmOS"
+ ];
+ }
+ var s = '' + x + y + z;
+ url = this.selectUrl(s, url);
+
+ var id = this.get_quadkey(x, y, z);
+ var path = OpenLayers.String.format(url, {'id': id, 'x': x, 'y': y, 'z': z});
+ return path;
+ },
+
+ CLASS_NAME: "OpenLayers.Layer.Bing"
+});
diff --git a/web/js/map-bing.js b/web/js/map-bing.js
new file mode 100644
index 000000000..fbbbcc676
--- /dev/null
+++ b/web/js/map-bing.js
@@ -0,0 +1,21 @@
+YAHOO.util.Event.onContentReady('map', function() {
+ var centre = new Microsoft.Maps.Location( fixmystreet.lat, fixmystreet.lon );
+ var map = new Microsoft.Maps.Map(document.getElementById("map"), {
+ mapTypeId: Microsoft.Maps.MapTypeId.ordnanceSurvey,
+ center: centre,
+ zoom: 15,
+ enableClickableLogo: false,
+ enableSearchLogo: false,
+ showCopyright: false,
+ showDashboard: true,
+ showLogo: false,
+ showScalebar: false
+ });
+ //minZoomLevel: 14,
+ //numZoomLevels: 4
+
+ Microsoft.Maps.Events.addHandler(map, "viewchangestart", function(e) {
+ /* Doesn't work */
+ if (map.getTargetZoom() < 12) return false;
+ });
+});
diff --git a/web/js/map-google.js b/web/js/map-google.js
new file mode 100644
index 000000000..77e54ab7c
--- /dev/null
+++ b/web/js/map-google.js
@@ -0,0 +1,22 @@
+YAHOO.util.Event.onContentReady('map', function() {
+ var centre = new google.maps.LatLng( fixmystreet.lat, fixmystreet.lon );
+ var map = new google.maps.Map(document.getElementById("map"), {
+ mapTypeId: google.maps.MapTypeId.ROADMAP,
+ center: centre,
+ zoom: 16,
+ disableDefaultUI: true,
+ navigationControl: true,
+ navigationControlOptions: {
+ style: google.maps.NavigationControlStyle.SMALL
+ },
+ mapTypeControl: true,
+ mapTypeControlOptions: {
+ style: google.maps.MapTypeControlStyle.DROPDOWN_MENU
+ }
+ });
+
+ google.maps.event.addListener(map, "zoom_changed", function() {
+ if (map.getZoom() < 13) map.setZoom(13);
+ if (map.getZoom() > 17) map.setZoom(17);
+ });
+});
diff --git a/web/js/map-streetview.js b/web/js/map-streetview.js
new file mode 100644
index 000000000..088e5b6a2
--- /dev/null
+++ b/web/js/map-streetview.js
@@ -0,0 +1,88 @@
+YAHOO.util.Event.onContentReady('map', function() {
+ var map = new OpenLayers.Map("map", {
+ controls: [
+ new OpenLayers.Control.ArgParser(),
+ //new OpenLayers.Control.LayerSwitcher(),
+ new OpenLayers.Control.Navigation(),
+ new OpenLayers.Control.PanZoom()
+ ],
+ displayProjection: new OpenLayers.Projection("EPSG:4326")
+ });
+ var streetview = new OpenLayers.Layer.StreetView("OS StreetView (1:10000)", {
+ zoomOffset: 14,
+ numZoomLevels: 4
+ });
+ map.addLayer(streetview);
+
+ var centre = new OpenLayers.LonLat( fixmystreet.easting, fixmystreet.northing );
+ centre.transform(
+ new OpenLayers.Projection("EPSG:27700"),
+ map.getProjectionObject()
+ );
+ map.setCenter(centre, 2);
+});
+
+
+// http://os.openstreetmap.org/openlayers/OS.js (added one line)
+
+/**
+ * Namespace: Util.OS
+ */
+OpenLayers.Util.OS = {};
+
+/**
+ * Constant: MISSING_TILE_URL
+ * {String} URL of image to display for missing tiles
+ */
+OpenLayers.Util.OS.MISSING_TILE_URL = "http://openstreetmap.org/openlayers/img/404.png";
+
+/**
+ * Property: originalOnImageLoadError
+ * {Function} Original onImageLoadError function.
+ */
+OpenLayers.Util.OS.originalOnImageLoadError = OpenLayers.Util.onImageLoadError;
+
+/**
+ * Function: onImageLoadError
+ */
+OpenLayers.Util.onImageLoadError = function() {
+ OpenLayers.Util.OS.originalOnImageLoadError;
+};
+
+/**
+ * @requires OpenLayers/Layer/XYZ.js
+ *
+ * Class: OpenLayers.Layer.StreetView
+ *
+ * Inherits from:
+ * - <OpenLayers.Layer.XYZ>
+ */
+OpenLayers.Layer.StreetView = OpenLayers.Class(OpenLayers.Layer.XYZ, {
+ /**
+ * Constructor: OpenLayers.Layer.StreetView
+ *
+ * Parameters:
+ * name - {String}
+ * url - {String}
+ * options - {Object} Hashtable of extra options to tag onto the layer
+ */
+ initialize: function(name, options) {
+ var url = [
+ "http://a.os.openstreetmap.org/sv/${z}/${x}/${y}.png",
+ "http://b.os.openstreetmap.org/sv/${z}/${x}/${y}.png",
+ "http://c.os.openstreetmap.org/sv/${z}/${x}/${y}.png"
+ ];
+ options = OpenLayers.Util.extend({
+ /* Below line added to OSM's file in order to allow minimum zoom level */
+ maxResolution: 156543.0339/Math.pow(2, options.zoomOffset || 0),
+ numZoomLevels: 18,
+ transitionEffect: "resize",
+ sphericalMercator: true,
+ attribution: "Contains Ordnance Survey data © Crown copyright and database right 2010"
+ }, options);
+ var newArguments = [name, url, options];
+ OpenLayers.Layer.XYZ.prototype.initialize.apply(this, newArguments);
+ },
+
+ CLASS_NAME: "OpenLayers.Layer.StreetView"
+});
diff --git a/web/js/map-tilma-ol.js b/web/js/map-tilma-ol.js
new file mode 100644
index 000000000..cfd196c1d
--- /dev/null
+++ b/web/js/map-tilma-ol.js
@@ -0,0 +1,42 @@
+YAHOO.util.Event.onContentReady('map', function() {
+ var map = new OpenLayers.Map("map", {
+ controls: [
+ new OpenLayers.Control.ArgParser(),
+ new OpenLayers.Control.Navigation(),
+ new OpenLayers.Control.PanPanel()
+ ]
+ });
+ var tilma = new OpenLayers.Layer.Tilma("Tilma", {
+ maxResolution: fixmystreet.maxResolution,
+ tileSize: new OpenLayers.Size(fixmystreet.tilewidth, fixmystreet.tileheight),
+ map_type: fixmystreet.tile_type
+ });
+ map.addLayer(tilma);
+
+ var centre = new OpenLayers.LonLat( fixmystreet.easting, fixmystreet.northing );
+ map.setCenter(centre);
+});
+
+OpenLayers.Layer.Tilma = OpenLayers.Class(OpenLayers.Layer.XYZ, {
+ initialize: function(name, options) {
+ var url = "http://tilma.mysociety.org/tileserver/${type}/${x},${y}/png";
+ options = OpenLayers.Util.extend({
+ transitionEffect: "resize",
+ numZoomLevels: 1,
+ units: "m",
+ maxExtent: new OpenLayers.Bounds(0, 0, 700000, 1300000),
+ }, options);
+ var newArguments = [name, url, options];
+ OpenLayers.Layer.XYZ.prototype.initialize.apply(this, newArguments);
+ },
+
+ getURL: function (bounds) {
+ var res = this.map.getResolution();
+ var x = Math.round(bounds.left / (res * this.tileSize.w));
+ var y = Math.round(bounds.bottom / (res * this.tileSize.h));
+ var path = OpenLayers.String.format(this.url, {'x': x, 'y': y, 'type': this.map_type});
+ return path;
+ },
+
+ CLASS_NAME: "OpenLayers.Layer.Tilma"
+});
diff --git a/web/js/map-tilma.js b/web/js/map-tilma.js
new file mode 100644
index 000000000..1ae38cff1
--- /dev/null
+++ b/web/js/map-tilma.js
@@ -0,0 +1,320 @@
+/*
+ * map-tilma.js
+ * JavaScript specifically for the tilma based maps
+ */
+
+function compass_pan(e, a) {
+ YAHOO.util.Event.preventDefault(e);
+ if (a.home) {
+ a.x = a.orig_x-drag_x;
+ a.y = a.orig_y-drag_y;
+ }
+ pan(a.x, a.y);
+}
+
+YAHOO.util.Event.onContentReady('compass', function() {
+ var ua=navigator.userAgent.toLowerCase();
+ // if (document.getElementById('mapForm') && (/safari/.test(ua) || /Konqueror/.test(ua))) return;
+ if (document.getElementById('map').offsetWidth > 510) return;
+
+ var points = this.getElementsByTagName('a');
+ YAHOO.util.Event.addListener(points[1], 'click', compass_pan, { x:0, y:fixmystreet.tileheight });
+ YAHOO.util.Event.addListener(points[3], 'click', compass_pan, { x:fixmystreet.tilewidth, y:0 });
+ YAHOO.util.Event.addListener(points[5], 'click', compass_pan, { x:-fixmystreet.tilewidth, y:0 });
+ YAHOO.util.Event.addListener(points[7], 'click', compass_pan, { x:0, y:-fixmystreet.tileheight });
+ YAHOO.util.Event.addListener(points[0], 'click', compass_pan, { x:fixmystreet.tilewidth, y:fixmystreet.tileheight });
+ YAHOO.util.Event.addListener(points[2], 'click', compass_pan, { x:-fixmystreet.tilewidth, y:fixmystreet.tileheight });
+ YAHOO.util.Event.addListener(points[6], 'click', compass_pan, { x:fixmystreet.tilewidth, y:-fixmystreet.tileheight });
+ YAHOO.util.Event.addListener(points[8], 'click', compass_pan, { x:-fixmystreet.tilewidth, y:-fixmystreet.tileheight });
+ YAHOO.util.Event.addListener(points[4], 'click', compass_pan, { home:1, orig_x:drag_x, orig_y:drag_y });
+});
+
+YAHOO.util.Event.onContentReady('map', function() {
+ var ua=navigator.userAgent.toLowerCase();
+ // if (document.getElementById('mapForm') && (/safari/.test(ua) || /Konqueror/.test(ua))) return;
+ if (document.getElementById('map').offsetWidth > 510) return;
+ new YAHOO.util.DDMap('map');
+ update_tiles(fixmystreet.start_x, fixmystreet.start_y, true);
+});
+
+
+YAHOO.util.Event.addListener('hide_pins_link', 'click', function(e) {
+ YAHOO.util.Event.preventDefault(e);
+ if (this.innerHTML == 'Show pins') {
+ YAHOO.util.Dom.setStyle('pins', 'display', 'block');
+ this.innerHTML = 'Hide pins';
+ } else if (this.innerHTML == 'Dangos pinnau') {
+ YAHOO.util.Dom.setStyle('pins', 'display', 'block');
+ this.innerHTML = 'Cuddio pinnau';
+ } else if (this.innerHTML == 'Cuddio pinnau') {
+ YAHOO.util.Dom.setStyle('pins', 'display', 'none');
+ this.innerHTML = 'Dangos pinnau';
+ } else if (this.innerHTML == 'Hide pins') {
+ YAHOO.util.Dom.setStyle('pins', 'display', 'none');
+ this.innerHTML = 'Show pins';
+ }
+});
+YAHOO.util.Event.addListener('all_pins_link', 'click', function(e) {
+ YAHOO.util.Event.preventDefault(e);
+ YAHOO.util.Dom.setStyle('pins', 'display', 'block');
+ var welsh = 0;
+ if (this.innerHTML == 'Include stale reports') {
+ this.innerHTML = 'Hide stale reports';
+ document.getElementById('all_pins').value = '1';
+ load_pins(fixmystreet.x, fixmystreet.y);
+ } else if (this.innerHTML == 'Cynnwys hen adroddiadau') {
+ this.innerHTML = 'Cuddio hen adroddiadau';
+ document.getElementById('all_pins').value = '1';
+ welsh = 1;
+ load_pins(fixmystreet.x, fixmystreet.y);
+ } else if (this.innerHTML == 'Cuddio hen adroddiadau') {
+ this.innerHTML = 'Cynnwys hen adroddiadau';
+ welsh = 1;
+ document.getElementById('all_pins').value = '';
+ load_pins(fixmystreet.x, fixmystreet.y);
+ } else if (this.innerHTML == 'Hide stale reports') {
+ this.innerHTML = 'Include stale reports';
+ document.getElementById('all_pins').value = '';
+ load_pins(fixmystreet.x, fixmystreet.y);
+ }
+ if (welsh) {
+ document.getElementById('hide_pins_link').innerHTML = 'Cuddio pinnau';
+ } else {
+ document.getElementById('hide_pins_link').innerHTML = 'Hide pins';
+ }
+});
+
+// I love the global
+var tile_x = 0;
+var tile_y = 0;
+
+var myAnim;
+function pan(x, y) {
+ if (!myAnim || !myAnim.isAnimated()) {
+ myAnim = new YAHOO.util.Motion('drag', { points:{by:[x,y]} }, 10, YAHOO.util.Easing.easeOut);
+ myAnim.useSeconds = false;
+ //myAnim.onTween.subscribe(function(){ update_tiles(x/10, y/10, false); });
+ myAnim.onComplete.subscribe(function(){
+ update_tiles(x, y, false);
+ cleanCache();
+ });
+ myAnim.animate();
+ }
+}
+
+var drag_x = 0;
+var drag_y = 0;
+function update_tiles(dx, dy, force) {
+ dx = getInt(dx); dy = getInt(dy);
+ if (!dx && !dy && !force) return;
+ var old_drag_x = drag_x;
+ var old_drag_y = drag_y;
+ drag_x += dx;
+ drag_y += dy;
+
+ var drag = document.getElementById('drag');
+ drag.style.left = drag_x + 'px';
+ drag.style.top = drag_y + 'px';
+
+ var horizontal = Math.floor(old_drag_x/fixmystreet.tilewidth) - Math.floor(drag_x/fixmystreet.tilewidth);
+ var vertical = Math.floor(old_drag_y/fixmystreet.tileheight) - Math.floor(drag_y/fixmystreet.tileheight);
+ if (!horizontal && !vertical && !force) return;
+ fixmystreet.x += horizontal;
+
+ tile_x += horizontal;
+ fixmystreet.y -= vertical;
+ tile_y += vertical;
+ var url = [ root_path + '/tilma/tileserver/' + fixmystreet.tile_type + '/', fixmystreet.x, '-', (fixmystreet.x+5), ',', fixmystreet.y, '-', (fixmystreet.y+5), '/JSON' ].join('');
+ YAHOO.util.Connect.asyncRequest('GET', url, {
+ success: urls_loaded, failure: urls_not_loaded,
+ argument: [tile_x, tile_y]
+ });
+
+ if (force) return;
+ load_pins(fixmystreet.x, fixmystreet.y);
+}
+
+function load_pins(x, y) {
+ if (document.getElementById('formX')) {
+ all_pins = '';
+ if (document.getElementById('all_pins')) {
+ all_pins = document.getElementById('all_pins').value;
+ }
+ var ajax_params = [ 'sx=' + document.getElementById('formX').value,
+ 'sy=' + document.getElementById('formY').value,
+ 'x=' + (x+3),
+ 'y=' + (y+3),
+ 'all_pins=' + all_pins ];
+
+ if (document.getElementById('extra_param')) {
+ ajax_params.push(document.getElementById('extra_param').name + '=' + document.getElementById('extra_param').value);
+ }
+
+ var url = [ root_path , '/ajax?', ajax_params.join(';')].join('');
+ YAHOO.util.Connect.asyncRequest('GET', url, {
+ success: pins_loaded
+ });
+ }
+}
+
+function pins_loaded(o) {
+ var data = eval(o.responseText);
+ document.getElementById('pins').innerHTML = data.pins;
+ if (typeof(data.current) != 'undefined')
+ document.getElementById('current').innerHTML = data.current;
+ if (typeof(data.current_near) != 'undefined')
+ document.getElementById('current_near').innerHTML = data.current_near;
+ if (typeof(data.fixed_near) != 'undefined')
+ document.getElementById('fixed_near').innerHTML = data.fixed_near;
+}
+
+function urls_not_loaded(o) { /* Nothing yet */ }
+
+// Load 6x6 grid of tiles around current 2x2
+function urls_loaded(o) {
+ var tiles = eval(o.responseText);
+ var drag = document.getElementById('drag');
+ for (var i=0; i<6; i++) {
+ var ii = (i + o.argument[1]);
+ for (var j=0; j<6; j++) {
+ if (tiles[i][j] == null) continue;
+ var jj = (j + o.argument[0]);
+ var id = [ 't', ii, '.', jj ].join('');
+ var xx = fixmystreet.x+j;
+ var yy = fixmystreet.y+5-i;
+ var img = document.getElementById(id);
+ if (img) {
+ if (!img.galleryimg) { img.galleryimg = false; }
+ img.onclick = drag_check;
+ tileCache[id] = { x: xx, y: yy, t: img };
+ continue;
+ }
+ img = cloneNode();
+ img.style.top = ((ii-2)*fixmystreet.tileheight) + 'px';
+ img.style.left = ((jj-2)*fixmystreet.tilewidth) + 'px';
+ img.name = [ 'tile_', xx, '.', yy ].join('')
+ img.id = id;
+ if (browser) {
+ img.style.visibility = 'hidden';
+ img.onload=function() { this.style.visibility = 'visible'; }
+ }
+ img.src = 'http://tilma.mysociety.org/tileserver/' + fixmystreet.tile_type + '/' + tiles[i][j];
+ tileCache[id] = { x: xx, y: yy, t: img };
+ drag.appendChild(img);
+ }
+ }
+}
+
+var imgElCache;
+function cloneNode() {
+ var img = null;
+ if (!imgElCache) {
+ var form = document.getElementById('mapForm');
+ if (form) {
+ img = imgElCache = document.createElement('input');
+ img.type = 'image';
+ } else {
+ img = imgElCache = document.createElement('img');
+ }
+ img.onclick = drag_check;
+ img.style.position = 'absolute';
+ img.style.width = fixmystreet.tilewidth + 'px';
+ img.style.height = fixmystreet.tileheight + 'px';
+ img.galleryimg = false;
+ img.alt = 'Loading...';
+ } else {
+ img = imgElCache.cloneNode(true);
+ }
+ return img;
+}
+
+var tileCache=[];
+function cleanCache() {
+ for (var i in tileCache) {
+ if (tileCache[i].x < fixmystreet.x || tileCache[i].x > fixmystreet.x+5 || tileCache[i].y < fixmystreet.y || tileCache[i].y > fixmystreet.y+5) {
+ var t = tileCache[i].t;
+ t.parentNode.removeChild(t); // de-leak?
+ delete tileCache[i];
+ }
+ }
+}
+
+/* Called every mousemove, so on first call, overwrite itself with quicker version */
+function get_posn(ev) {
+ var posx, posy;
+ if (ev.pageX || ev.pageY) {
+ get_posn = function(e) {
+ return { x: e.pageX, y: e.pageY };
+ };
+ } else if (ev.clientX || ev.clientY) {
+ get_posn = function(e) {
+ return {
+ x: e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft,
+ y: e.clientY + document.body.scrollTop + document.documentElement.scrollTop
+ };
+ };
+ } else {
+ get_posn = function(e) {
+ return { x: undef, y: undef };
+ };
+ }
+ return get_posn(ev);
+}
+
+function setCursor(s) {
+ var drag = document.getElementById('drag');
+ var inputs = drag.getElementsByTagName('input');
+ for (var i=0; i<inputs.length; i++) {
+ inputs[i].style.cursor = s;
+ }
+}
+
+var in_drag = false;
+function drag_check(e) {
+ if (in_drag) {
+ in_drag = false;
+ return false;
+ }
+ return true;
+}
+
+/* Simpler version of DDProxy */
+var mouse_pos = {};
+YAHOO.util.DDMap = function(id, sGroup, config) {
+ this.init(id, sGroup, config);
+};
+YAHOO.extend(YAHOO.util.DDMap, YAHOO.util.DD, {
+ scroll: false,
+ b4MouseDown: function(e) { },
+ startDrag: function(x, y) {
+ mouse_pos = { x: x, y: y };
+ setCursor('move');
+ in_drag = true;
+ },
+ b4Drag: function(e) { },
+ onDrag: function(e) {
+ var point = get_posn(e);
+ if (point == mouse_pos) return false;
+ var dx = point.x-mouse_pos.x;
+ var dy = point.y-mouse_pos.y;
+ mouse_pos = point;
+ update_tiles(dx, dy, false);
+ },
+ endDrag: function(e) {
+ setCursor('crosshair');
+ cleanCache();
+ },
+ toString: function() {
+ return ("DDMap " + this.id);
+ }
+});
+
+var browser = 1;
+var ua=navigator.userAgent.toLowerCase();
+if (!/opera|safari|gecko/.test(ua) && typeof document.all!='undefined')
+ browser=0;
+
+function getInt(n) {
+ n = parseInt(n); return (isNaN(n) ? 0 : n);
+}
+