// -*- mode: espresso; espresso-indent-level: 4; indent-tabs-mode: nil -*- // This function might be passed either an OpenLayers.LonLat (so has // lon and lat) or an OpenLayers.Geometry.Point (so has x and y) function fixmystreet_update_pin(lonlat) { lonlat.transform( fixmystreet.map.getProjectionObject(), new OpenLayers.Projection("EPSG:4326") ); document.getElementById('fixmystreet.latitude').value = lonlat.lat || lonlat.y; document.getElementById('fixmystreet.longitude').value = lonlat.lon || lonlat.x; } function fixmystreet_activate_drag() { fixmystreet.drag = new OpenLayers.Control.DragFeature( fixmystreet.markers, { onComplete: function(feature, e) { fixmystreet_update_pin( feature.geometry.clone() ); } } ); fixmystreet.map.addControl( fixmystreet.drag ); fixmystreet.drag.activate(); } function fms_markers_list(pins, transform) { var markers = []; for (var i=0; iMore details", { size: new OpenLayers.Size(0,0), offset: new OpenLayers.Pixel(0,-40) }, true, onPopupClose); feature.popup = popup; fixmystreet.map.addPopup(popup); }); fixmystreet.map.addControl( fixmystreet.select_feature ); fixmystreet.select_feature.activate(); } else if (fixmystreet.page == 'new') { fixmystreet_activate_drag(); } fixmystreet.map.addLayer(fixmystreet.markers); if ( fixmystreet.zoomToBounds ) { var bounds = fixmystreet.markers.getDataExtent(); if (bounds) { fixmystreet.map.zoomToExtent( bounds ); } } $('#hide_pins_link').click(function(e) { e.preventDefault(); var showhide = [ 'Show pins', 'Hide pins', 'Dangos pinnau', 'Cuddio pinnau', "Vis nåler", "Gjem nåler" ]; for (var i=0; i div[data-role='footer']"), header = $("div[id='" + containerid + "'] > div[data-role='header']"), content = $("div[id='" + containerid + "'] > div[data-role='content']"), viewHeight = $(window).height(), contentHeight = viewHeight - footer.outerHeight() - header.outerHeight(); if ((content.outerHeight() + footer.outerHeight() + header.outerHeight()) !== viewHeight) { contentHeight -= (content.outerHeight() - content.height() + 1); content.height(contentHeight); content.width($(window).width()); } } function show_map(event) { ensureNonZeroHeight(); set_map_config(); $('#mark-here').hide(); fixmystreet.map = new OpenLayers.Map("map", { controls: fixmystreet.controls, displayProjection: new OpenLayers.Projection("EPSG:4326") }); if ($('html').hasClass('mobile') && fixmystreet.page == 'around') { $('#fms_pan_zoom').css({ top: '2.75em !important' }); } fixContentHeight(fixmystreet.map); fixmystreet.layer_options = OpenLayers.Util.extend({ zoomOffset: fixmystreet.zoomOffset, transitionEffect: 'resize', numZoomLevels: fixmystreet.numZoomLevels }, fixmystreet.layer_options); var layer = new fixmystreet.map_type("", fixmystreet.layer_options); fixmystreet.map.addLayer(layer); if (!fixmystreet.map.getCenter()) { var centre = new OpenLayers.LonLat( fixmystreet.longitude, fixmystreet.latitude ); centre.transform( new OpenLayers.Projection("EPSG:4326"), fixmystreet.map.getProjectionObject() ); fixmystreet.map.setCenter(centre, fixmystreet.zoom || 3); } if (fixmystreet.state_map && fixmystreet.state_map == 'full') { console.log('full page'); // TODO Work better with window resizing, this is pretty 'set up' only at present var $content = $('.content'), q = ( $content.offset().left + $content.width() ) / 2; // Need to try and fake the 'centre' being 75% from the left fixmystreet.map.pan(-q, -25, { animate: false }); fixmystreet.map.events.register("movestart", null, function(e){ fixmystreet.map.moveStart = { zoom: this.getZoom(), center: this.getCenter() }; }); fixmystreet.map.events.register("zoomend", null, function(e){ if ( fixmystreet.map.moveStart && !fixmystreet.map.moveStart.zoom && fixmystreet.map.moveStart.zoom !== 0 ) { return true; // getZoom() on Firefox appears to return null at first? } if ( !fixmystreet.map.moveStart || !this.getCenter().equals(fixmystreet.map.moveStart.center) ) { // Centre has moved, e.g. by double-click. Same whether zoom in or out fixmystreet.map.pan(-q, -25, { animate: false }); return; } var zoom_change = this.getZoom() - fixmystreet.map.moveStart.zoom; if (zoom_change == -1) { // Zoomed out, need to re'centre' fixmystreet.map.pan(-q/2, 0, { animate: false }); } else if (zoom_change == 1) { // Using a zoom button fixmystreet.map.pan(q, 0, { animate: false }); } }); } fixmystreet_onload(); fixContentHeight(fixmystreet.map); if ( fixmystreet.page == 'around' ) { if ( localStorage.currentReport ) { mark_here(); } else { $('#mark-here').show(); } } } $(document).delegate('#around-page', 'pageshow', show_map ); $(document).delegate('#report-page', 'pageshow', show_map ); OpenLayers.Control.Crosshairs = OpenLayers.Class.create(); OpenLayers.Control.Crosshairs.CROSSHAIR_SIDE = 100; OpenLayers.Control.Crosshairs.DIV_ID = "OpenLayers_Control_Crosshairs_crosshairs"; OpenLayers.Control.Crosshairs.prototype = OpenLayers.Class.inherit( OpenLayers.Control, { element: null, position: null, initialize: function(element) { OpenLayers.Control.prototype.initialize.apply(this, arguments); this.element = OpenLayers.Util.getElement(element); this.imageSize = new OpenLayers.Size(OpenLayers.Control.Crosshairs.CROSSHAIR_SIDE, OpenLayers.Control.Crosshairs.CROSSHAIR_SIDE); }, draw: function() { var position; OpenLayers.Control.prototype.draw.apply(this, arguments); position = this.getIdealPosition(); this.buttons = new Array(); var imgLocation = OpenLayers.Util.getImagesLocation() + "crosshairs-100.png"; return OpenLayers.Util.createAlphaImageDiv(OpenLayers.Control.Crosshairs.DIV_ID, position, this.imageSize, imgLocation, "absolute"); }, getIdealPosition: function() { this.map.updateSize(); var mapSize = this.map.getSize(); return new OpenLayers.Pixel((mapSize.w / 2) - (this.imageSize.w / 2), (2 * mapSize.h / 5) - (this.imageSize.h / 2)); }, getMapPosition: function() { var left = parseInt( $('#' + OpenLayers.Control.Crosshairs.DIV_ID).css('left') ); var top = parseInt( $('#' + OpenLayers.Control.Crosshairs.DIV_ID).css('top') ); left += ( this.imageSize.w / 2 ); top += ( this.imageSize.h / 2 ); var pos = this.map.getLonLatFromViewPortPx( new OpenLayers.Pixel( left, top ) ); return pos; }, reposition: function() { var position = this.getIdealPosition(); $('#' + OpenLayers.Control.Crosshairs.DIV_ID).css({ left: position.x, top: position.y}); }, CLASS_NAME: "OpenLayers.Control.Crosshairs" }); /* Overriding Permalink so that it can pass the correct zoom to OSM */ OpenLayers.Control.PermalinkFMS = OpenLayers.Class(OpenLayers.Control.Permalink, { updateLink: function() { var separator = this.anchor ? '#' : '?'; var href = this.base; if (href.indexOf(separator) != -1) { href = href.substring( 0, href.indexOf(separator) ); } href += separator + OpenLayers.Util.getParameterString(this.createParams(null, this.map.getZoom()+fixmystreet.zoomOffset)); // Could use mlat/mlon here as well if we are on a page with a marker if (this.anchor && !this.element) { window.location.href = href; } else { this.element.href = href; } } }); /* Pan data handler */ OpenLayers.Format.FixMyStreet = OpenLayers.Class(OpenLayers.Format.JSON, { read: function(json, filter) { if (typeof json == 'string') { obj = OpenLayers.Format.JSON.prototype.read.apply(this, [json, filter]); } else { obj = json; } var current, current_near; if (typeof(obj.current) != 'undefined' && (current = document.getElementById('current'))) { current.innerHTML = obj.current; } if (typeof(obj.current_near) != 'undefined' && (current_near = document.getElementById('current_near'))) { current_near.innerHTML = obj.current_near; } var markers = fms_markers_list( obj.pins, false ); return markers; }, CLASS_NAME: "OpenLayers.Format.FixMyStreet" });