/** * Copyright (c) 2008, Canterbury City Council. All rights reserved. * aiwg@beerdragon.co.uk */ var _gis_area = document.getElementById ("gis_area"); var _gis_tilesW, _gis_tilesH; var _gis_tile, _gis_imageurl; var _gis_mousecapture, _gis_mouse_x, _gis_mouse_y, _gis_noclick; var _gis_easting, _gis_northing, _gis_scale; var _gis_pushpin_x, _gis_pushpin_y; var _gis_onclick_url = null, _gis_onclick_xenc, _gis_onclick_yenc, _gis_onclick_zenc; var _gis_onclick_ajax = null, _gis_onclick_js; var _gis_area_x = 0, _gis_area_y = 0; function _gis_compatible () { if (!document.documentElement && !document.body) return false; if (!_gis_area) return false; _gis_area.style.position = "relative"; if (!_gis_area.offsetWidth || !_gis_area.offsetHeight) return false; if (!_gis_area.offsetLeft || !_gis_area.offsetTop) return false; var p = _gis_area; while (p != null) { _gis_area_x += p.offsetLeft; _gis_area_y += p.offsetTop; p = p.offsetParent; } return true; } function _gis_idiv (i, j) { return Math.floor (i / j); } function _gis_imul (i, j) { return Math.floor (i * j); } function _gis_refresh () { if (_gis_easting < 500000) _gis_easting = 500000; else if (_gis_easting > 700000) _gis_easting = 700000; if (_gis_northing < 100000) _gis_northing = 100000; else if (_gis_northing > 200000) _gis_northing = 200000; if (_gis_scale < 1000) _gis_scale = 1000; else if (_gis_scale > 250000) _gis_scale = 250000; mpp = 0.00026458333333333 * _gis_scale; leftE = _gis_easting - _gis_imul (_gis_area.offsetWidth / 2, mpp); tileW = _gis_imul (256, mpp); leftE2 = leftE % tileW; leftE -= leftE2; leftX = -_gis_idiv (leftE2, mpp); topN = _gis_northing + _gis_imul (_gis_area.offsetHeight / 2, mpp); tileH = _gis_imul (256, mpp); topN2 = topN % tileH; topN = topN - topN2; topY = _gis_idiv (topN2, mpp) - 256; x = leftX; e = leftE; url = _gis_imageurl + "z=" + _gis_scale + "&"; urlPin = (_gis_pushpin_x && _gis_pushpin_y) ? url + "px=" + _gis_pushpin_x + "&py=" + _gis_pushpin_y + "&" : 0; for (i = 0; i < _gis_tilesW; i++) { y = topY; n = topN; for (j = 0; j < _gis_tilesH; j++) { t = _gis_tile[i][j]; if (urlPin) { mapurl = ((_gis_pushpin_x >= e - 30 * mpp) && (_gis_pushpin_x < e + tileW + 30 * mpp) && (_gis_pushpin_y >= n - 40 * mpp) && (_gis_pushpin_y < n + tileH + 40 * mpp)) ? urlPin : url; } else { mapurl = url; } if ((t.easting != e) || (t.northing != n) || (t.mapurl != mapurl)) { t.innerHTML = ""; } t.style.left = x + "px"; t.style.top = y + "px"; y += 256; n -= tileH; } x += 256; e += tileW; } } function _gis_mousedown (e) { if (e == null) if ((e = window.event) == null) return; var popup = document.getElementById ("gis_popup"); if (popup && (popup.style.display == "block")) popup.style.display = "none"; _gis_mousecapture = true; _gis_noclick = false; _gis_mouse_x = e.clientX; _gis_mouse_y = e.clientY; if (_gis_area.setCapture) _gis_area.setCapture (); _gis_area.style.cursor = "move"; } function _gis_mouseup (e) { _gis_mousecapture = false; if (_gis_area.releaseCapture) { _gis_area.releaseCapture (); } else if (_gis_area.setCapture) { _gis_area.setCapture (false); } _gis_area.style.cursor = "auto"; } function _gis_rotl (arr) { tmp = arr[0]; for (i = 0; i < arr.length - 1; i++) { arr[i] = arr[i + 1]; } arr[i] = tmp; } function _gis_rotr (arr) { tmp = arr[i = arr.length - 1]; for (; i > 0; i--) { arr[i] = arr[i - 1]; } arr[0] = tmp; } function _gis_mousemove (e) { if (!_gis_mousecapture) return; _gis_noclick = true; if (e == null) if ((e = window.event) == null) return; mpp = 0.00026458333333333 * _gis_scale; dx = _gis_imul (_gis_mouse_x - e.clientX, mpp); dy = _gis_imul (e.clientY - _gis_mouse_y, mpp); if ((dx == 0) || (dy == 0)) return; _gis_mouse_x = e.clientX; _gis_mouse_y = e.clientY; w1 = _gis_imul (_gis_area.offsetWidth / 2, mpp); xx = _gis_easting - w1; w2 = _gis_imul (256, mpp); x = _gis_idiv (xx - (xx % w2), w2); xx = (_gis_easting += dx) - w1; x -= _gis_idiv (xx - (xx % w2), w2); h1 = _gis_imul (_gis_area.offsetHeight / 2, mpp); yy = _gis_northing + h1; h2 = _gis_imul (256, mpp); y = _gis_idiv (yy - (yy % h2), h2); yy = (_gis_northing += dy) + h1; y -= _gis_idiv (yy - (yy % h2), h2); if (x < 0) { if (x > -_gis_tilesW) { while (x < 0) { _gis_rotl (_gis_tile); x++; } } } else if (x > 0) { if (x < _gis_tilesW) { while (x > 0) { _gis_rotr (_gis_tile); x--; } } } if (y < 0) { if (y > -_gis_tilesH) { while (y < 0) { for (j = 0; j < _gis_tilesW; j++) { _gis_rotr (_gis_tile[j]); } y++; } } } else if (y > 0) { if (y < _gis_tilesH) { while (y > 0) { for (j = 0; j < _gis_tilesW; j++) { _gis_rotl (_gis_tile[j]); } y--; } } } _gis_refresh (); } function _gis_onclick (e) { if (_gis_noclick) return; if (e == null) if ((e = window.event) == null) return; mpp = 0.00026458333333333 * _gis_scale; x = _gis_easting + _gis_imul ((e.pageX ? e.pageX : (e.clientX + (document.documentElement ? document.documentElement : document.body).scrollLeft)) - _gis_area_x - _gis_area.offsetWidth / 2, mpp); y = _gis_northing + _gis_imul (_gis_area.offsetHeight / 2 - ((e.pageY ? e.pageY : (e.clientY + (document.documentElement ? document.documentElement : document.body).scrollTop)) - _gis_area_y), mpp); gis_getdata (x, y); } function gis_getdata (easting, northing) { url = (_gis_onclick_url != null) ? _gis_onclick_url.replace (_gis_onclick_xenc, easting).replace (_gis_onclick_yenc, northing).replace (_gis_onclick_zenc, _gis_scale) : null; if (_gis_onclick_ajax != null) { req = null; if (typeof XMLHttpRequest != "undefined") { req = new XMLHttpRequest (); } else if (window.ActiveXObject) { req = new ActiveXObject ("Microsoft.XMLHTTP"); } else { _gis_onclick_ajax = null; } if (req != null) { req.onreadystatechange = function (_req) { return function () { if (_req.readyState == 4) { //document.write (_req.responsetext); // _gis_onclick_js (_req.responsetext); _gis_onclick_js (_req.responseXML.documentElement.childNodes[0].nodeValue, url); } }; } (req); req.open ("GET", _gis_onclick_ajax + "&x=" + easting + "&y=" + northing + "&z=" + _gis_scale, true); req.send (null); return; } } if (url != null) document.location = url; } function gis_zoomin () { if (_gis_scale > 250000) _gis_scale=250000; else if (_gis_scale > 200000) _gis_scale=200000; else if (_gis_scale > 150000) _gis_scale=150000; else if (_gis_scale > 100000) _gis_scale=100000; else if (_gis_scale > 50000) _gis_scale=50000; else if (_gis_scale > 25000) _gis_scale=25000; else if (_gis_scale > 10000) _gis_scale=10000; else if (_gis_scale > 5000) _gis_scale=5000; else if (_gis_scale > 2500) _gis_scale=2500; else if (_gis_scale > 1000) _gis_scale=1000; else return; _gis_refresh (); } function gis_setzoom (scale) { _gis_scale = scale + 1; gis_zoomin (); } function gis_getzoom () { return _gis_scale; } function gis_zoomout () { if (_gis_scale < 1000) _gis_scale=1000; else if (_gis_scale < 2500) _gis_scale=2500; else if (_gis_scale < 5000) _gis_scale=5000; else if (_gis_scale < 10000) _gis_scale=10000; else if (_gis_scale < 25000) _gis_scale=25000; else if (_gis_scale < 50000) _gis_scale=50000; else if (_gis_scale < 100000) _gis_scale=100000; else if (_gis_scale < 150000) _gis_scale=150000; else if (_gis_scale < 200000) _gis_scale=200000; else if (_gis_scale < 250000) _gis_scale=250000; else return; _gis_refresh (); } function _gis_init (params, easting, northing, scale, pushpin, search) { _gis_area.style.overflow = "hidden"; _gis_area.style.maxHeight = _gis_area.style.height = _gis_area.offsetHeight + "px"; _gis_imageurl = "/cgi-bin/authority/gis/planningapps?mode=map&" + params; _gis_easting = easting; _gis_northing = northing; _gis_scale = scale; _gis_pushpin_x = pushpin ? easting : 0; _gis_pushpin_y = pushpin ? northing : 0; html = "
\"Zoom
\"Zoom"; if (search) html = html + "
"; html = html + "
"; if (search) html = html + "
"; document.getElementById ("gis_control").innerHTML = html; html = ""; _gis_area.onmousedown = _gis_mousedown; _gis_area.onmouseup = _gis_mouseup; _gis_area.onmousemove = _gis_mousemove; _gis_area.onclick = _gis_onclick; _gis_tilesW = _gis_idiv (_gis_area.offsetWidth + 255, 256) + 1; _gis_tilesH = _gis_idiv (_gis_area.offsetHeight + 255, 256) + 1; n = 0; _gis_tile = new Array (_gis_tilesW); for (i = 0; i < _gis_tilesW; i++) { _gis_tile[i] = new Array (_gis_tilesH); for (j = 0; j < _gis_tilesH; j++) { html = html + "
" } } _gis_area.innerHTML = html; n = 0; for (i = 0; i < _gis_tilesW; i++) { for (j = 0; j < _gis_tilesH; j++) { t = document.getElementById ("gis_div" + (++n)); t.style.width = 256 + "px"; t.style.height = 256 + "px"; t.innerHTML = " "; _gis_tile[i][j] = t; } } _gis_refresh (); } function gis_setpushpin (easting, northing) { _gis_pushpin_x = easting; _gis_pushpin_y = northing; _gis_refresh (); } function gis_clearpushpin () { _gis_pushpin_x = 0; _gis_pushpin_y = 0; _gis_refresh (); } function _gis_search () { var popup = document.getElementById ("gis_popup"); if (popup) popup.style.display = "block"; var input = document.getElementById ("gis_search"); input.focus (); } function _gis_searchgo () { var popup = document.getElementById ("gis_popup"); if (popup) popup.style.display = "none"; var input = document.getElementById ("gis_search"); qstring = input.value; qstring = qstring.replace ("%", "%25").replace ("&", "%26").replace ("=", "%3D"); document.location = _gis_onclick_url.replace (_gis_onclick_xenc, _gis_easting).replace (_gis_onclick_yenc, _gis_northing).replace (_gis_onclick_zenc, _gis_scale) + "&search=" + qstring; //TODO: could use the ajaxsearch= callback to handle this if available and display the results return false; }