//Postcode Anywhere Maps Version 1.2 Modified
var MOUSE_MOVE = 0, MOUSE_SELECT_RADIAL = 1, MOUSE_SELECT_AREA = 2;
function pcaMap(a, f) { var r = this, g = null, m = true, q = false, s = document, o = "undefined", k = "string", l = "number", j = "object", i = "boolean", p = "div", c = "img", d = "border:0px none;margin:0px;padding:0px;position:absolute;", e = "font:8pt arial;color:#000;", n = "2010", h = "http://services.postcodeanywhere.co.uk/", b = "JC51-RG27-ZR85-NM59"; r.Element = a; r.Container = g; r.SurfaceLayer = g; r.TileLayer = g; r.MarkerLayer = g; r.SelectLayer = g; r.RouteLayer = g; r.ShapeLayer = g; r.Properties = { X: 0, Y: 0, Height: 0, Width: 0, L: 0, T: 0, R: 0, B: 0, Bound: { X: 0, Y: 0, L: 0, T: 0, R: 0, B: 0, Elements: { L: 0, T: 0, R: 0, B: 0, Distance: 10 }, Tiles: 1 }, Zoom: { Level: 0, Supported: [0.5, 1, 2, 5, 10, 20, 50, 100, 200, 500, 1000, 2000] }, Tiles: { X: 0, Y: 0, Size: 200, Actual: 0, Renderer: "PCA"} }; r.Surface = { X: 0, Y: 0, DX: 0, DY: 0 }; r.Selection = { X: 0, Y: 0, DX: 0, DY: 0, Element: g }; r.Mouse = { Mode: MOUSE_MOVE, Scroll: q, Down: q, DragMap: q, DragTarget: g, OverMap: q, ElemX: 0, ElemY: 0, WinX: 0, WinY: 0, Delta: 0, DefaultDrag: g }; r.Marker = { Height: 36, Width: 18, L: 9, T: 31, Red: h + "maps/red-marker.png", Green: h + "maps/green-marker.png", Blue: h + "maps/blue-marker.png", Window: { Image: h + "maps/window.png", Height: 320, Width: 381, T: 5, B: 28, L: 5, R: 9, Close: h + "maps/close.png", Marker: g, Element: g} }; r.Shape = { Colour: "#0011EE", Weight: 2, Opacity: 0.2 }; r.Route = { Colour: "#0011EE", Weight: 5, Opacity: 0.7 }; r.Movement = { Speed: 20, Moving: q }; r.Markers = []; r.Listeners = []; r.Tiles = []; r.Controls = []; r.Shapes = []; r.Routes = []; r.Destinations = []; r.Browser = { IE: !!(window.attachEvent && navigator.userAgent.indexOf("Opera") === -1), Opera: navigator.userAgent.indexOf("Opera") > -1, WebKit: navigator.userAgent.indexOf("AppleWebKit/") > -1, Gecko: navigator.userAgent.indexOf("Gecko") > -1 && navigator.userAgent.indexOf("KHTML") === -1, MobileSafari: !!navigator.userAgent.match(/Apple.*Mobile.*Safari/) }; r.Initialise = function () { var E = r.Properties, G = E.Tiles, K = E.Bound.Tiles, D = r.Element, u = r.Surface, z = r.Browser, x = "position:absolute;", v = "left:0px;top:0px;", I = "height:100%;width:100%;", J = "z-index:0;", y = s.createElement(p), t = s.createElement(p), B = s.createElement(p), w = s.createElement(p), C = s.createElement(p), F = s.createElement(p), A = s.createElement(p); while (D.childNodes.length > 0) { D.removeChild(D.childNodes[0]) } G.Actual = G.Size * E.Zoom.Level; E.Height = D.offsetHeight; E.Width = D.offsetWidth; G.X = Math.ceil(E.Width / G.Size) + (K * 2); G.Y = Math.ceil(E.Height / G.Size) + (K * 2); D.style.position = "relative"; D.style.backgroundColor = "#E5E3DF"; y.id = "container"; y.style.cssText = x + v + I + "overflow:hidden;"; t.id = "surface"; t.style.cssText = x + "left:" + u.X + "px;top:" + u.Y + "px;"; B.id = "tilelayer"; B.style.cssText = x + J + v; F.id = "routelayer"; F.style.cssText = x + J + v; C.id = "shapelayer"; C.style.cssText = x + J + v; w.id = "markerlayer"; w.style.cssText = x + J + v; A.id = "selectlayer"; A.style.cssText = x + J + v; t.appendChild(B); t.appendChild(C); t.appendChild(F); t.appendChild(w); y.appendChild(t); y.appendChild(A); D.appendChild(y); if (window.addEventListener) { D.addEventListener("mousedown", r.MouseDown, q); D.addEventListener("mouseover", r.MouseOver, q); D.addEventListener("mouseout", r.MouseOut, q); D.addEventListener("click", r.MouseClick, q); D.addEventListener("dblclick", r.MouseDblClick, q); s.addEventListener("mousemove", r.MouseMove, q); s.addEventListener("mouseup", r.MouseUp, q); window.addEventListener("resize", r.Resize, q); if (z.Gecko) { D.addEventListener("DOMMouseScroll", r.MouseScroll, q) } if (z.WebKit) { D.addEventListener("mousewheel", r.MouseScroll, q) } } else { D.attachEvent("onmousedown", r.MouseDown); D.attachEvent("onmouseover", r.MouseOver); D.attachEvent("onmouseout", r.MouseOut); D.attachEvent("onclick", r.MouseClick); D.attachEvent("ondblclick", r.MouseDblClick); s.attachEvent("onmousemove", r.MouseMove); s.attachEvent("onmouseup", r.MouseUp); window.attachEvent("onresize", r.Resize); D.attachEvent("onmousewheel", r.MouseScroll) } r.Container = y; r.SurfaceLayer = t; r.TileLayer = B; r.ShapeLayer = C; r.MarkerLayer = w; r.RouteLayer = F; r.SelectLayer = A; if (z.IE) { if (!s.documentMode || s.documentMode < 8) { s.namespaces.add("v", "urn:schemas-microsoft-com:vml"); s.createStyleSheet().addRule("v\\:*", "behavior:url(#default#VML)") } else { s.namespaces.add("v", "urn:schemas-microsoft-com:vml"); var H = s.createStyleSheet(); H.addRule("v\\:shape", "behavior:url(#default#VML)"); H.addRule("v\\:stroke", "behavior:url(#default#VML)"); H.addRule("v\\:fill", "behavior:url(#default#VML)"); H.addRule("v\\:rect", "behavior:url(#default#VML)"); H.addRule("v\\:oval", "behavior:url(#default#VML)") } } }; r.LoadTile = function (u, C) { var A = s.createElement(c), v = r.Properties, z = v.Tiles, w = v.Zoom.Level, t = r.Browser, B = d; A.src = h + "maps/transparent.png"; if (z.Renderer == "MASTERMAP") { A.src = h + "AL2Anywhere/Maps/RetrieveTile/v1.10/image.ws?&key=" + b + "&topleft=" + u + "," + C + "&scale=" + w } else { A.src = h + "Maps/Maps/RetrieveTile/v1.10/image.ws?style=" + z.Renderer + "&key=" + b + "&topleft=" + u + "," + C + "&scale=" + w } B += "height:" + z.Size + "px;"; B += "width:" + z.Size + "px;"; B += "left:" + ((u - v.X) / w) + "px;"; B += "top:" + ((v.Y - C) / w) + "px;"; if (t.WebKit) { B += "-webkit-user-select: none;" } if (t.Gecko) { B += "-moz-user-select: none;" } A.style.cssText = B; return A }; r.LoadMarker = function (F, D, K) { var H = s.createElement(p), w = s.createElement(c), G = r.Marker, I = r.Properties, B = I.Zoom.Level, v = r.Browser, C = d, z = G.Height, t = G.Width, u = G.L, A = G.T, E = g; w.src = G.Red; if (typeof (K) == j) { if (typeof (K.Colour) == k) { w.src = h + "maps/" + K.Colour + "-marker.png" } if (typeof (K.Image) == k) { w.src = K.Image } if (typeof (K.Name) == k) { w.alt = K.Name; w.title = K.Name } if (typeof (K.Height) == l) { z = K.Height; A = z / 2 } if (typeof (K.Width) == l) { t = K.Width; u = t / 2 } if (typeof (K.Top) == l) { A = K.Top } if (typeof (K.Left) == l) { u = K.Left } if (typeof (K.Symbol) == k) { if (K.Symbol.length > 0) { E = K.Symbol } } } C += "height:" + z + "px;"; C += "width:" + t + "px;"; C += "left:" + (((F - I.X) / B) - u) + "px;"; C += "top:" + (((I.Y - D) / B) - A) + "px;"; C += "z-index:" + Math.round((I.Y - D) + (I.Tiles.Actual * I.Bound.Elements.Distance)) + ";"; C += "cursor:pointer;"; if (v.WebKit) { C += "-webkit-user-select: none;" } if (v.Gecko) { C += "-moz-user-select: none;" } H.style.cssText = C; w.style.cssText = d + "height:" + z + "px;width:" + t + "px;"; H.appendChild(w); if (r.Browser.IE) { r.ReRenderPNG(w) } if (E) { var J = document.createElement(p); J.innerHTML = E; J.style.cssText = d + "width:100%;text-align:center;top:1px;left:0px;font:bold 9pt arial;color:#000;"; H.appendChild(J) } return H }; r.LoadGraphic = function (G, B, y, t, z) { var H = r.Properties, D = r.Properties.Zoom.Level, v = G[0].X, F = G[0].Y, I = G[0].X, A = G[0].Y, J = g; for (var u in G) { if (G[u].X > I) { I = G[u].X } if (G[u].Y < F) { F = G[u].Y } if (G[u].X < v) { v = G[u].X } if (G[u].Y > A) { A = G[u].Y } } I += (5 * D); F -= (5 * D); v -= (5 * D); A += (5 * D); if (r.Browser.IE) { var E = "m" + Math.round((G[0].X - H.X) / D) + " " + Math.round((H.Y - G[0].Y) / D) + " l"; for (var u = 1; u < G.length; u++) { E += " " + Math.round((G[u].X - H.X) / D) + " " + Math.round((H.Y - G[u].Y) / D) } if (B) { E += " X" } E += " E"; var J = s.createElement("v:shape"), x = s.createElement("v:stroke"), C = s.createElement("v:fill"); J.setAttribute("unselectable", "on"); J.setAttribute("coordsize", "1,1"); J.setAttribute("coordorigin", Math.round((v - H.X) / D) + "," + Math.round((H.Y - A) / D)); J.setAttribute("path", E); J.style.cssText = "position:absolute;width:1px;height:1px;top:" + Math.round((H.Y - A) / D) + "px;left:" + Math.round((v - H.X) / D) + "px;"; if (B) { J.setAttribute("fillcolor", t); J.setAttribute("filled", "t"); x.setAttribute("on", "f"); C.setAttribute("opacity", z); J.appendChild(C) } else { J.setAttribute("strokecolor", t); J.setAttribute("strokeweight", y * 0.75); J.setAttribute("filled", "f"); x.setAttribute("opacity", z); x.setAttribute("joinstyle", "round"); x.setAttribute("endcap", "round") } J.appendChild(x) } else { var E = "M " + Math.round(((G[0].X - H.X) / D) - ((v - H.X) / D)) + " " + Math.round(((H.Y - G[0].Y) / D) - ((H.Y - A) / D)) + " L"; for (var u = 1; u < G.length; u++) { E += " " + Math.round(((G[u].X - H.X) / D) - ((v - H.X) / D)) + " " + Math.round(((H.Y - G[u].Y) / D) - ((H.Y - A) / D)) } if (B) { E += " Z" } var J = s.createElementNS("http://www.w3.org/2000/svg", "svg"), w = s.createElementNS("http://www.w3.org/2000/svg", "path"); J.setAttribute("version", "1.1"); J.setAttribute("height", Math.round((A - F) / D) + "px"); J.setAttribute("width", Math.round((I - v) / D) + "px"); J.setAttribute("viewbox", Math.round((v - H.X) / D) + " " + Math.round((H.Y - A) / D) + " " + Math.round((I - v) / D) + " " + Math.round((A - F) / D)); J.style.cssText = "position: absolute; left: " + Math.round((v - H.X) / D) + "px; top: " + Math.round((H.Y - A) / D) + "px;"; if (B) { w.setAttribute("fill", t); w.setAttribute("fill-opacity", z) } else { w.setAttribute("stroke-linejoin", "round"); w.setAttribute("stroke-linecap", "round"); w.setAttribute("stroke", t); w.setAttribute("stroke-opacity", z); w.setAttribute("stroke-width", y); w.setAttribute("fill", "none") } w.setAttribute("d", E); J.appendChild(w) } return J }; r.Draw = function () { r.DrawTiles(); r.DrawMarkers(); r.DrawRoutes(); r.DrawShapes(); r.FireEvent(r, "draw") }; r.DrawTiles = function () { var x = r.TileLayer, v = r.Properties, z = v.Tiles, A = z.Actual, w = s.createElement(c); while (x.childNodes.length > 0) { x.removeChild(x.childNodes[0]) } w.src = h + "maps/transparent.png"; x.appendChild(w); for (var u = 0; u < z.X; u++) { for (var t = 0; t < z.Y; t++) { var y = {}; y.X = v.Bound.L + (u * A); y.Y = v.Bound.T - (t * A); y.Image = r.LoadTile(y.X, y.Y); r.Tiles[u + (t * z.X)] = y; x.appendChild(r.Tiles[u + (t * z.X)].Image) } } r.FireEvent(r, "redraw") }; r.CreateMarker = function (w, v, t) { var u = { X: w, Y: v, Options: t, Image: g, Selected: m, Info: { Content: g, Height: 0, Width: 0} }; u.Image = r.LoadMarker(u.X, u.Y, u.Options); r.MarkerLayer.appendChild(u.Image); r.Markers.push(u); u.AddListener = function (x) { r.AddListener("click", x, this) }; u.SetInfo = function (A, z, x, y) { r.SetMarkerInfo(this, A, z, x, y) }; u.ShowInfo = function () { r.ShowMarkerInfo(this) }; return u }; r.DrawMarkers = function () { var u = r.MarkerLayer, x = r.Markers, v = r.Properties, w = v.Bound.Elements; r.ClearSelection(); while (u.childNodes.length > 0) { u.removeChild(u.childNodes[0]) } for (var t in x) { if (x[t].X > w.L && x[t].X < w.R && x[t].Y > w.B && x[t].Y < w.T) { x[t].Image = r.LoadMarker(x[t].X, x[t].Y, x[t].Options); u.appendChild(x[t].Image) } } r.DrawInfoWindow() }; r.ClearMarkers = function () { var t = r.MarkerLayer; r.Markers = []; while (t.childNodes.length > 0) { t.removeChild(t.childNodes[0]) } r.CloseInfoWindow() }; r.SetMarkerInfo = function (u, y, w, t, v) { var x = u.Info; x.Content = y; x.Height = t; x.Width = w; x.Options = v }; r.ShowMarkerInfo = function (t) { r.Marker.Window.Marker = t; r.DrawInfoWindow() }; r.DrawInfoWindow = function () { if (r.Marker.Window.Marker && r.Marker.Window.Marker.Image) { var E = s.createElement(p), C = s.createElement(p), u = s.createElement(c), D = [], y = [], K = r.Properties, J = K.Zoom.Level, x = r.Marker, M = x.Window.Marker, H = M.Info, P = H.Height, A = H.Width, O = x.Window, G = P + O.T + O.B, B = A + O.L + O.R, t = G / 2, I = B / 2, z = "position:absolute;", w = "height:" + t + "px;width:" + I + "px;overflow:hidden;", L = Math.round((K.Y - M.Y) + (K.Tiles.Actual * K.Bound.Elements.Distance)), v = m, F = m, Q = 0; r.RemoveInfoWindow(); if (typeof (H.Options) == j) { if (typeof (H.Options.Frame) == i) { v = H.Options.Frame } if (typeof (H.Options.Button) == i) { F = H.Options.Button } if (typeof (H.Options.Padding) == l) { Q = H.Options.Padding } } if (v) { for (var N = 0; N < 4; N++) { D[N] = s.createElement(p); E.appendChild(D[N]) } for (var N = 0; N < 4; N++) { y[N] = s.createElement(c); y[N].src = O.Image; D[N].appendChild(y[N]) } D[0].style.cssText = z + w + "top:0px;left:0px;"; y[0].style.cssText = z + "top:0px;left:0px;"; D[1].style.cssText = z + w + "top:0px;left:" + I + "px;"; y[1].style.cssText = z + "top:0px;left:" + -(O.Width - I) + "px;"; D[2].style.cssText = z + w + "top:" + t + "px;left:0px;"; y[2].style.cssText = z + "top:" + -(O.Height - t) + "px;left:0px;"; D[3].style.cssText = z + w + "top:" + t + "px;left:" + I + "px;"; y[3].style.cssText = z + "top:" + -(O.Height - t) + "px;left:" + -(O.Width - I) + "px;"; if (r.Browser.IE) { for (var N = 0; N < 4; N++) { r.ReRenderPNG(y[N]) } } } if (F) { u.src = O.Close; u.onclick = r.CloseInfoWindow; u.style.cssText = z + "top:" + (O.T + 2 + Q) + "px;left:" + (B - O.R - 15 - Q) + "px;z-index:" + L + ";cursor:pointer;"; E.appendChild(u); if (r.Browser.IE) { r.ReRenderPNG(u) } } E.style.cssText = z + "top:" + (((K.Y - M.Y) / J) - (G - 3)) + "px;left:" + (((M.X - K.X) / J) - (B - 4)) + "px;z-index:" + (L - 1) + ";"; C.style.cssText = z + "top:5px;left:6px;height:" + P + "px;width:" + A + "px;overflow:visible;"; E.appendChild(C); C.innerHTML = H.Content; r.MarkerLayer.appendChild(E); O.Element = E } }; r.RemoveInfoWindow = function () { var t = r.MarkerLayer, v = r.Marker.Window; if (v.Element) { for (var u in t.childNodes) { if (t.childNodes[u] == v.Element) { t.removeChild(v.Element) } } } }; r.CloseInfoWindow = function () { r.Marker.Window.Marker = g; r.RemoveInfoWindow() }; r.ParseShape = function (z, y, B, v) { var u = [], x = v.Colour, A = v.Weight, w = v.Opacity; if (typeof (B) == j) { if (typeof (B.Weight) == l) { A = B.Weight } if (typeof (B.Colour) == k) { x = B.Colour } if (typeof (B.Opacity) == l) { w = B.Opacity } } for (var t in z) { u.push({ X: z[t][0], Y: z[t][1] }) } return { Points: u, Solid: y, Weight: A, Colour: x, Opacity: w, Graphic: g} }; r.AddRoute = function (u, t) { r.Routes.push(r.ParseShape(u, q, t, r.Route)); r.DrawRoutes() }; r.DrawRoutes = function () { var t = r.RouteLayer, v = r.Properties.Bound.Elements; while (t.childNodes.length > 0) { t.removeChild(t.childNodes[0]) } for (var u in r.Routes) { var y = r.Routes[u], z = y.Points, w = []; for (var x in z) { if (z[x].X > v.L && z[x].X < v.R && z[x].Y > v.B && z[x].Y < v.T) { w.push(z[x]) } } if (w.length > 0) { y.Graphic = r.LoadGraphic(w, q, y.Weight, y.Colour, y.Opacity); t.appendChild(y.Graphic) } } }; r.ClearRoutes = function () { var t = r.RouteLayer; while (t.childNodes.length > 0) { t.removeChild(t.childNodes[0]) } r.Routes = [] }; r.AddShape = function (v, t, u) { r.Shapes.push(r.ParseShape(v, t, u, r.Shape)); r.DrawShapes() }; r.DrawShapes = function () { var v = r.Properties.Bound.Elements, u = r.ShapeLayer; while (u.childNodes.length > 0) { u.removeChild(u.childNodes[0]) } for (var t in r.Shapes) { var x = r.Shapes[t], y = x.Points; for (var w in y) { if (y[w].X > v.L && y[w].X < v.R && y[w].Y > v.B && y[w].Y < v.T) { x.Graphic = r.LoadGraphic(y, x.Solid, x.Weight, x.Colour, x.Opacity); u.appendChild(x.Graphic); break } } } }; r.ClearShapes = function () { var t = r.ShapeLayer; while (t.childNodes.length > 0) { t.removeChild(t.childNodes[0]) } r.Shapes = [] }; r.Resize = function () { var u = r.Properties, v = u.Tiles, w = u.Bound.Tiles, t = r.Element; v.Actual = v.Size * u.Zoom.Level; u.Height = t.offsetHeight; u.Width = t.offsetWidth; v.X = Math.ceil(u.Width / v.Size) + (w * 2); v.Y = Math.ceil(u.Height / v.Size) + (w * 2); r.Tiles = []; r.Draw(); r.FireEvent(r, "resize") }; r.CentreAndZoom = function (A, z, D) { var C = r.Properties, B = C.Tiles, w = C.Bound, u = w.Elements, t = r.Surface, v = r.SurfaceLayer.style; A = Math.round(A); z = Math.round(z); C.Zoom.Level = D; C.X = A - ((C.Width / 2) * C.Zoom.Level); C.Y = z + ((C.Height / 2) * C.Zoom.Level); C.L = C.X; C.T = C.Y; C.R = C.L + (C.Width * C.Zoom.Level); C.B = C.T - (C.Height * C.Zoom.Level); B.Actual = B.Size * C.Zoom.Level; w.X = (Math.floor(C.L / B.Actual) * B.Actual); w.Y = (Math.ceil(C.T / B.Actual) * B.Actual); w.L = w.X - (w.Tiles * B.Actual); w.T = w.Y + (w.Tiles * B.Actual); w.R = w.L + (C.Tiles.X * B.Actual); w.B = w.T - (C.Tiles.Y * B.Actual); u.L = w.L - (B.Actual * u.Distance); u.T = w.T + (B.Actual * u.Distance); u.R = w.R + (B.Actual * u.Distance); u.B = w.B - (B.Actual * u.Distance); t.X = 0; t.Y = 0; v.top = t.Y + "px"; v.left = t.X + "px"; r.Draw() }; r.ZoomMap = function (z) { var t = r.Properties, x = t.Zoom.Supported, w = t.L + ((t.Width / 2) * t.Zoom.Level), v = t.T - ((t.Height / 2) * t.Zoom.Level); for (var y in x) { if (t.Zoom.Level == x[y]) { var u = x[y - z]; if (typeof (u) != o) { r.FireEvent(r, "zoom"); r.CentreAndZoom(w, v, u); break } } } }; r.MouseZoom = function () { var u = r.Properties, z = r.Mouse, w = u.Zoom.Level, y = u.Zoom.Supported; for (var A in y) { if (w == y[A]) { var x = y[A - z.Delta]; if (typeof (x) == o) { return } } } var v = (u.L + ((u.Width / 2) * w)) + (z.ElemX - (u.Width / 2)) * (w - x), t = (u.T - ((u.Height / 2) * w)) - (z.ElemY - (u.Height / 2)) * (w - x); r.FireEvent(r, "zoom"); r.CentreAndZoom(v, t, x) }; r.MouseStartMove = function () { var t = r.Surface, u = r.Mouse; r.ClearDestinations(); t.DX = u.WinX - t.X; t.DY = u.WinY - t.Y }; r.MouseMoveSurface = function (t) { var u = r.Surface, v = r.Mouse; r.SetSurface(v.WinX - u.DX, v.WinY - u.DY) }; r.AddDestinations = function (u) { for (var t in u) { r.Destinations.push({ X: u[t][0], Y: u[t][1] }) } }; r.ClearDestinations = function () { r.Destinations = []; r.Movement.Moving = q }; r.AutoMoveSurface = function () { var C = r.Properties, y = C.Zoom.Level, t = r.Surface, w = r.Destinations, u = r.Movement, v = u.Speed, B, z, x; function A() { if (!(t.X == z && t.Y == x) && u.Moving) { var D = Math.sqrt(Math.pow((z - t.X), 2) + Math.pow((x - t.Y), 2)), H = (z - t.X) / D, G = (x - t.Y) / D, F = t.X + (H * v), E = t.Y + (G * v); if (Math.sqrt(Math.pow((z - t.X), 2) + Math.pow((x - t.Y), 2)) < v) { F = z; E = x } r.SetSurface(F, E); window.setTimeout(A, 20) } else { u.Moving = q; if (w.length > 0) { w.shift(); r.AutoMoveSurface() } } } if (w.length > 0 && !u.Moving) { B = w[0]; z = (C.X - (Math.round(B.X) - ((C.Width / 2) * y))) / y; x = ((Math.round(B.Y) + ((C.Height / 2) * y)) - C.Y) / y; u.Moving = m; A() } }; r.SetSurface = function (E, D) { var t = r.Surface, H = r.Properties, G = H.Tiles, C = H.Zoom.Level, F = G.Actual, A = r.SurfaceLayer.style, w = r.TileLayer, B = H.Bound, v = B.Elements, I = q, z = q; t.X = E; t.Y = D; H.L = H.X - (t.X * C); H.T = H.Y + (t.Y * C); H.R = H.L + (H.Width * C); H.B = H.T - (H.Height * C); A.top = t.Y + "px"; A.left = t.X + "px"; if (B.X > H.L || B.X < (H.L - G.Actual) || B.Y > (H.T + G.Actual) || B.Y < H.T) { B.X = (Math.floor(H.L / G.Actual) * G.Actual); B.Y = (Math.ceil(H.T / G.Actual) * G.Actual); B.L = B.X - (B.Tiles * G.Actual); B.T = B.Y + (B.Tiles * G.Actual); B.R = B.L + (H.Tiles.X * G.Actual); B.B = B.T - (H.Tiles.Y * G.Actual); for (var J in r.Tiles) { if ((r.Tiles[J].X > (H.R - F)) || (r.Tiles[J].X < H.L) || (r.Tiles[J].Y < H.B + F) || (r.Tiles[J].Y > (H.T))) { for (var u in w.childNodes) { if (w.childNodes[u] == r.Tiles[J].Image) { w.removeChild(w.childNodes[u]) } } if (r.Tiles[J].X > (B.R - F)) { r.Tiles[J].X -= F * G.X } if (r.Tiles[J].X < B.L) { r.Tiles[J].X += F * G.X } if (r.Tiles[J].Y < B.B + F) { r.Tiles[J].Y += F * G.Y } if (r.Tiles[J].Y > (B.T)) { r.Tiles[J].Y -= F * G.Y } r.Tiles[J].Image = r.LoadTile(r.Tiles[J].X, r.Tiles[J].Y); w.appendChild(r.Tiles[J].Image); I = m; if (B.L < v.L || B.T > v.T || B.R > v.R || B.B < v.B) { v.L = B.L - (F * v.Distance); v.T = B.T + (F * v.Distance); v.R = B.R + (F * v.Distance); v.B = B.B - (F * v.Distance); r.DrawMarkers(); r.DrawRoutes(); r.DrawShapes(); z = m } } } } r.FireEvent(r, "move"); if (I) { r.FireEvent(r, "tile_move") } if (z) { r.FireEvent(r, "element_move") } }; r.StartSelect = function () { var w = r.Selection, u = r.SelectLayer, y = r.Mouse, t = g; w.X = y.ElemX; w.Y = y.ElemY; r.ClearSelection(); r.CloseInfoWindow(); if (r.Browser.IE) { if (y.Mode == MOUSE_SELECT_AREA) { t = s.createElement("v:rect") } else { if (y.Mode == MOUSE_SELECT_RADIAL) { t = s.createElement("v:oval") } else { throw "Invalid selection type" } } t.setAttribute("fillcolor", "#7777FF"); t.setAttribute("unselectable", "on"); t.style.cssText = "position:absolute;left:" + w.X + "px;top:" + w.Y + "px;width:0;height:0;"; var x = s.createElement("v:fill"); x.setAttribute("opacity", "0.3"); t.appendChild(x); u.appendChild(t) } else { var v = s.createElementNS("http://www.w3.org/2000/svg", "svg"), x = s.createElementNS("http://www.w3.org/2000/svg", "g"); v.setAttribute("version", "1.1"); v.setAttribute("baseProfile", "full"); x.setAttribute("fill-opacity", "0.3"); x.setAttribute("stroke", "black"); x.setAttribute("stroke-width", "1px"); if (y.Mode == MOUSE_SELECT_AREA) { t = s.createElementNS("http://www.w3.org/2000/svg", "rect"); t.setAttribute("x", w.X + "px"); t.setAttribute("y", w.Y + "px"); t.setAttribute("width", "0"); t.setAttribute("height", "0") } else { if (y.Mode == MOUSE_SELECT_RADIAL) { t = s.createElementNS("http://www.w3.org/2000/svg", "circle"); t.setAttribute("cx", w.X + "px"); t.setAttribute("cy", w.Y + "px"); t.setAttribute("r", "0") } else { throw "Invalid selection type" } } t.setAttribute("fill", "#7777FF"); x.appendChild(t); v.appendChild(x); u.appendChild(v) } w.Element = t }; r.MoveSelection = function () { var E = r.Selection, x = E.Element, I = r.Properties, v = r.Markers, D = r.Mouse; E.DX = D.ElemX - E.X; E.DY = D.ElemY - E.Y; var C = E.X, B = E.Y, w = E.DX, y = E.DY; if (D.Mode == MOUSE_SELECT_AREA) { if (w < 0) { C = E.DX + E.X; w = 0 - E.DX } if (y < 0) { B = E.DY + E.Y; y = 0 - E.DY } if (r.Browser.IE) { x.style.left = C + "px"; x.style.top = B + "px"; x.style.width = w + "px"; x.style.height = y + "px" } else { x.setAttribute("x", C + "px"); x.setAttribute("y", B + "px"); x.setAttribute("width", w + "px"); x.setAttribute("height", y + "px") } var u = I.L + (C * I.Zoom.Level), J = I.L + ((C + w) * I.Zoom.Level), H = I.T - (B * I.Zoom.Level), A = I.T - ((B + y) * I.Zoom.Level); for (var z in v) { if ((v[z].X > u && v[z].X < J) && (v[z].Y < H && v[z].Y > A)) { v[z].Selected = m; v[z].Image.style.display = "" } else { v[z].Selected = q; v[z].Image.style.display = "none" } } } else { if (D.Mode == MOUSE_SELECT_RADIAL) { var t = Math.sqrt(Math.pow(w, 2) + Math.pow(y, 2)); if (r.Browser.IE) { x.style.left = (C - t) + "px"; x.style.top = (B - t) + "px"; x.style.width = (t * 2) + "px"; x.style.height = (t * 2) + "px" } else { x.setAttribute("r", t + "px") } for (var z in v) { var G = I.L + (E.X * I.Zoom.Level) - v[z].X, F = I.T - (E.Y * I.Zoom.Level) - v[z].Y; if ((Math.sqrt(Math.pow(G, 2) + Math.pow(F, 2))) <= (t * I.Zoom.Level)) { v[z].Selected = m; v[z].Image.style.display = "" } else { v[z].Selected = q; v[z].Image.style.display = "none" } } } } r.FireEvent(r, "Select") }; r.GetSelected = function () { var v = [], u = r.Markers; for (var t in u) { if (u[t].Selected) { v.push(u[t]) } } return v }; r.ClearSelection = function () { _markers = r.Markers, _selectlayer = r.SelectLayer; for (var t in _markers) { _markers[t].selected = m; _markers[t].Image.style.display = "" } while (_selectlayer.childNodes.length > 0) { _selectlayer.removeChild(_selectlayer.childNodes[0]) } }; r.CreateZoomControl = function () { var B = {}, w = s.createElement(p), v = s.createElement(c), t = s.createElement(c), C = s.createElement(c), F = d + "cursor:pointer;", z = r.Properties.Zoom.Supported.length, x = z * 9, A = 21 + x; B.SliderY = 30; B.SliderDY = 0; B.ZoomIndex = 0; w.id = "zoomControl"; w.style.cssText = d + "left:0px;top:0px;z-index:0;"; if (r.Browser.WebKit) { w.style.cssText += "-webkit-user-select: none" } if (r.Browser.Gecko) { w.style.cssText += "-moz-user-select: none" } v.src = h + "maps/zoom-in.png"; v.style.cssText = F + "top:10px;left:10px;"; t.src = h + "maps/zoom-out.png"; t.style.cssText = F + "top:" + (30 + x) + "px;left:10px;"; C.src = h + "maps/zoom-slider.png"; C.style.cssText = F + "top:" + B.SliderY + "px;left:11px;"; for (var y = 0; y < z; y++) { var H = s.createElement(c); H.src = h + "maps/zoom-bar-section.png"; H.style.cssText = F + "top:" + (B.SliderY + (y * 9)) + "px;left:10px;"; w.appendChild(H); if (r.Browser.IE) { r.ReRenderPNG(H) } r.Listeners.push({ Object: H, Event: "click", Code: u, System: m }) } r.Element.appendChild(w); w.appendChild(v); w.appendChild(t); w.appendChild(C); if (r.Browser.IE) { r.ReRenderPNG(v); r.ReRenderPNG(t); r.ReRenderPNG(C) } v.onclick = function () { r.ZoomMap(1) }; t.onclick = function () { r.ZoomMap(-1) }; function E() { var K = r.Properties.Zoom; for (var J in K.Supported) { if (K.Level == K.Supported[J]) { B.SliderY = 30 + (9 * J); B.ZoomIndex = J } } C.style.top = B.SliderY + "px" } function D() { B.SliderDY = r.Mouse.WinY - B.SliderY } function I() { B.SliderY = r.Mouse.WinY - B.SliderDY; if (B.SliderY < 30) { B.SliderY = 30 } if (B.SliderY > A) { B.SliderY = A } C.style.top = B.SliderY + "px" } function G() { var J = Math.round((B.SliderY - 30) / 9); if (J != B.ZoomIndex) { r.ZoomMap(B.ZoomIndex - J) } } function u() { var J = r.Mouse.ElemY, K = 0; if (J < 30) { J = 30 } if (J > A) { J = A } K = Math.round((J - 30) / 9); r.ZoomMap(B.ZoomIndex - K) } r.Listeners.push({ Object: r, Event: "redraw", Code: E, System: m }); r.Listeners.push({ Object: C, Event: "down", Code: D, System: m }); r.Listeners.push({ Object: C, Event: "drag", Code: I, System: m }); r.Listeners.push({ Object: C, Event: "up", Code: G, System: m }); B.Container = w; B.ButtonIn = v; B.ButtonOut = t; B.Slider = C; r.Controls.push(B); return B }; r.CreateCopyright = function () { var u = document.createElement(p), w = {}, t = d; t += "bottom:4px;right:4px;height:10px;"; t += e; u.style.cssText = t; if (r.Properties.Tiles.Renderer == "MASTERMAP") { var v = document.createElement(c); v.src = h + "maps/os_logo.png"; v.style.cssText = d + "bottom:14px;right:4px"; r.Element.appendChild(v); r.ReRenderPNG(v); u.innerHTML = "Map data &copy; " + n + " Crown Copyright" } else { u.innerHTML = "Map data &copy; " + n + " Tele Atlas" } r.Element.appendChild(u); w.Element = u; r.Controls.push(w); return w }; r.CreateLogo = function () { var v = document.createElement(c), t = {}, u = d; v.src = h + "maps/pca_logo.png"; u += "top:4px;right:4px;width:117px;height:19px"; v.style.cssText = u; r.Element.appendChild(v); r.ReRenderPNG(v); t.Element = v; r.Controls.push(t); return t }; r.CreateScaleView = function () { var v = document.createElement(p), u = document.createElement(p), z = {}, y = d, w = d, t = r.Properties.Tiles.Size / 2; w += "bottom:5px;left:4px;width:" + t + "px;text-align:center;"; w += e; u.style.cssText = w; y += "bottom:4px;left:4px;height:3px;width:" + t + "px;"; y += "border: 1px solid #000000;border-top:0;overflow:hidden;font-size:0;"; v.style.cssText = y; r.Element.appendChild(u); r.Element.appendChild(v); function x() { var A = r.Properties.Tiles.Actual / 2; if (A >= 1000) { A /= 1000; A += "k" } A += "m"; u.innerHTML = A } r.Listeners.push({ Object: r, Event: "redraw", Code: x, System: m }); z.Bar = v; z.Text = u; r.Controls.push(z); return z }; r.ClearControls = function () { var v = r.Element.childNodes, t = []; for (var u = 0; u < v.length; u++) { if (v[u] != r.Container) { t.push(v[u]) } } for (var u = 0; u < t.length; u++) { r.Element.removeChild(t[u]) } r.Controls = [] }; r.DrawDefaultControls = function () { r.CreateScaleView(); r.CreateCopyright(); r.CreateLogo() }; r.MouseOver = function (u) { var t = r.GetEvent(u); r.Mouse.OverMap = m; r.FireEvent(t.target || t.srcElement, "over") }; r.MouseOut = function (u) { var t = r.GetEvent(u); r.Mouse.OverMap = q; r.FireEvent(t.target || t.srcElement, "out") }; r.MouseDown = function (v) { var w = r.Mouse, t = r.GetEvent(v), u = r.GetLayer(t.target || t.srcElement); w.Down = m; if (r.Browser.IE) { w.DefaultDrag = s.ondragstart; s.ondragstart = function () { return q } } if (t.preventDefault) { t.preventDefault() } t.returnValue = q; r.UpdateMouse(t); if (u == r.TileLayer || u == r.ShapeLayer || u == r.RouteLayer || u == r.SelectLayer) { w.DragTarget = r; w.DragMap = m; w.Mode == MOUSE_MOVE ? r.MouseStartMove() : r.StartSelect() } else { w.DragTarget = (t.target || t.srcElement); r.FireEvent(w.DragTarget, "down") } }; r.MouseUp = function (t) { var u = r.Mouse; u.Down = q; u.DragMap = q; if (r.Browser.IE) { s.ondragstart = u.DefaultDrag } r.FireEvent(u.DragTarget, "up"); u.DragTarget = g }; r.MouseMove = function (u) { var v = r.Mouse, t = r.GetEvent(u); if (v.OverMap || v.Down) { t.returnValue = q; r.UpdateMouse(t); if (v.Down) { if (v.DragMap) { v.Mode == MOUSE_MOVE ? r.MouseMoveSurface() : r.MoveSelection() } else { r.FireEvent(v.DragTarget, "drag") } } } }; r.MouseClick = function (u) { var t = r.GetEvent(u); r.FireEvent((t.target || t.srcElement), "click") }; r.MouseDblClick = function (u) { var t = r.GetEvent(u); r.FireEvent((t.target || t.srcElement), "dblclick") }; r.MouseScroll = function (u) { if (r.Mouse.Scroll) { var t = r.GetEvent(u); if (t.preventDefault) { t.preventDefault() } t.returnValue = q; if (r.Browser.IE || r.Browser.WebKit) { r.Mouse.Delta = t.wheelDelta / 120 } else { r.Mouse.Delta = -t.detail / 3 } r.MouseZoom() } }; r.UpdateMouse = function (x) { var y = r.Mouse, w = r.Browser.IE, u = r.GetEvent(x); y.WinX = u.screenX; y.WinY = u.screenY; if (w) { y.ElemX = u.x; y.ElemY = u.y } else { y.ElemX = u.layerX; y.ElemY = u.layerY; var t = u.target, v = r.GetLayer(t); if (t.tagName == "path") { t = t.parentNode } if (v == r.MarkerLayer) { t = t.parentNode } if (t.style.right) { y.ElemX += r.Properties.Width - parseInt(t.style.right) - parseInt(t.offsetWidth) } else { if (t.style.left) { y.ElemX += parseInt(t.style.left) } } if (t.style.bottom) { y.ElemY += r.Properties.Height - parseInt(t.style.bottom) - parseInt(t.offsetHeight) } else { if (t.style.top) { y.ElemY += parseInt(t.style.top) } } if (v != r.Element && v != r.SelectLayer) { y.ElemX += r.Surface.X; y.ElemY += r.Surface.Y } } }; r.GetLayer = function (t) { while (t && t != r.Element && t != s.body) { if (t.parentNode == r.Container || t.parentNode == r.SurfaceLayer) { return t } else { t = t.parentNode } } return t }; r.GetEvent = function (t) { return (typeof (t) != o && t) ? t : ((typeof (event) != o && event) ? event : null) }; r.AddListener = function (v, u, t) { r.Listeners.push({ Event: v, Code: u, Object: t, System: q }) }; r.ClearListeners = function (t) { var v = []; for (var u in r.Listeners) { if (r.Listeners[u].System) { v.push(r.Listeners[u]) } else { if (t && r.Listeners[u].Object != t) { v.push(r.Listeners[u]) } } } r.Listeners = v }; r.FireEvent = function (u, w) { for (var v in r.Listeners) { if (r.Listeners[v].Event == w) { if (r.Listeners[v].Object) { var t = typeof (r.Listeners[v].Object.Image) != o ? r.Listeners[v].Object.Image : r.Listeners[v].Object, x = u != r ? r.GetLayer(u) : g; if (t == u || (x && x == r.MarkerLayer && t == u.parentNode)) { r.Listeners[v].Code() } } else { r.Listeners[v].Code() } } } }; r.SetMouseMode = function (u) { var t = r.SelectLayer.style; if (u == MOUSE_MOVE) { t.height = "0px"; t.width = "0px" } else { if (u == MOUSE_SELECT_AREA || u == MOUSE_SELECT_RADIAL) { t.height = "100%"; t.width = "100%" } else { throw "Select mode must be a valid type" } } r.Mouse.Mode = u }; r.GetRenderer = function () { return r.Properties.Tiles.Renderer }; r.SetRenderer = function (t) { var u = r.Properties.Zoom; r.Properties.Tiles.Renderer = t; if (t == "MASTERMAP") { u.Supported = [0.1, 0.2, 0.5, 1, 2, 5, 10, 20, 50, 100] } else { u.Supported = [0.5, 1, 2, 5, 10, 20, 50, 100, 200, 500, 1000, 2000] } }; r.GetCentre = function () { var t = r.Properties, u = t.Zoom.Level; return { X: t.L + ((t.Width / 2) * u), Y: t.T - ((t.Height / 2) * u)} }; r.SetCentre = function (t, u) { r.Destinations = [{ X: t, Y: u}]; r.AutoMoveSurface() }; r.GetZoom = function () { return r.Properties.Zoom.Level }; r.GetZoomLevels = function () { return r.Properties.Zoom.Supported }; r.GetVisibleArea = function () { var t = r.Properties; return { L: t.L, T: t.T, R: t.R, B: t.B} }; r.GetDrawnArea = function () { var t = r.Properties.Bound; return { L: t.L, T: t.T, R: t.R, B: t.B} }; r.GetObjectArea = function () { var t = r.Properties.Bound.Elements; return { L: t.L, T: t.T, R: t.R, B: t.B} }; r.GetMouse = function () { var t = r.Properties, u = t.Zoom.Level, v = r.Surface, w = r.Mouse; return { X: (t.X + ((w.ElemX - v.X) * u)), Y: (t.Y - ((w.ElemY - v.Y) * u))} }; r.EnableMouseScroll = function () { r.Mouse.Scroll = true }; r.DisableMouseScroll = function () { r.Mouse.Scroll = false }; r.ReRenderPNG = function (t) { if (/MSIE (5\.5|6)/.test(navigator.userAgent) && (/\.png/i).test(t.src)) { if (t.style.width == "auto" && t.style.height == "auto") { t.style.width = t.offsetWidth + "px"; t.style.height = t.clientHeight + "px" } t.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + t.src + "', sizingMethod='image')"; t.src = h + "maps/transparent.gif"; t.style.height = "1px"; t.style.width = "1px" } }; if (typeof (f) == k) { r.SetRenderer(f) } r.Initialise(); r.DrawDefaultControls() };

var pca_map = null,
    pca_key = "JC51-RG27-ZR85-NM59",
    pca_fileurl = "http://www.postcodeanywhere.co.uk/severntrent/",
    pca_worksicon = { Image: pca_fileurl + "images/at-work.png", Height: 26, Width: 28, Top: 21, Left: 14 },
    pca_warningicon = { Image: pca_fileurl + "images/warning.png", Height: 26, Width: 28, Top: 21, Left: 14 },
    pca_loaded = false;

function pcaInit() {
    var _imagecache = document.createElement("div"),
        _redicon = document.createElement("img"),
        _worksicon = document.createElement("img"),
        _warningicon = document.createElement("img");

    _imagecache.style.display = "none";
    _redicon.src = "http://services.postcodeanywhere.co.uk/maps/red-marker.png";
    _worksicon.src = pca_worksicon.Image;
    _warningicon.src = pca_warningicon.Image;

    _imagecache.appendChild(_redicon);
    _imagecache.appendChild(_worksicon);
    _imagecache.appendChild(_warningicon);
    document.body.appendChild(_imagecache);

    document.getElementById("rw_map").style.border = "1px solid #DBE8F9";

    pca_map = new pcaMap(document.getElementById("rw_map"));
    pca_map.CreateZoomControl();
    pca_map.EnableMouseScroll();
    pca_map.CentreAndZoom(430174, 276645, 1000);
    //pca_map.AddListener("redraw", pcaGetRoadWorks);
    pca_map.AddListener("element_move", pcaGetRoadWorks);
    pcaGetRoadWorks();
}

function pcaSearch(search) {
    var _req = "/Geocoding/UK/Geocode/v1.00/json.ws?";
    _req += "&Key=" + escape(pca_key);
    _req += "&Location=" + escape(search);
    _req += "&CallbackFunction=pcaSearchEnd";
    pcaFetch(_req);
}

function pcaSearchEnd(response) {
    if (response.length == 1 && typeof (response[0].Error) != 'undefined')
        alert(response[0].Description);
    else {
        if (response.length == 0)
            alert("Could not find specified postcode");
        else {
            pca_map.CentreAndZoom(response[0].Easting, response[0].Northing, 10);
            pcaGetRoadWorks();
        }
    }
}

function pcaGetRoadWorks() {
    var _bounds = pca_map.GetObjectArea(),
        _zoom = pca_map.GetZoom(),
        _req = "";

    if (_zoom <= 20) {
        _req = "/SEVER11112/RoadWorks/Select/v1.00/json.ws?";
        _req += "&Key=" + escape(pca_key);
        _req += "&Where=" + escape("GridRefE > " + _bounds.L + " and GridRefE < " + _bounds.R + " and GridRefN > " + _bounds.B + " and GridRefN < " + _bounds.T);
        _req += "&CallbackFunction=pcaGetRoadWorksEnd";
        pcaFetch(_req);
    }
}

function pcaGetRoadWorksEnd(response) {
    if (response.length != 0 && !(response.length == 1 && typeof (response[0].Error) != 'undefined')) {
        pca_loaded = true;
        pca_map.ClearMarkers();

        var _today = new Date();
        _today.setDate(_today.getDate() - 1);

        for (var i in response) {
            var _result = response[i],
                _info = "",
                _loc = "",
                _traffic = "",
                _job = "",
                _style = 'width:100%;font-size:12;font-family:verdana;font-weight:bold;color:#FFFFFF;';

            _loc = _result.LocationDesc ? _result.LocationDesc + ", " : "";
            _loc += _result.StreetName + ",<br/>";
            _loc += _result.StreetLocation ? _result.StreetLocation : _result.StreetTown;

            switch (_result.CwayRestrictionDesc) {
                case "":
                case "None / signing only":
                    _traffic = "None";
                    break;
                case "Traffic control (two-way signals)":
                case "Traffic control (multi-way signals)":
                case "Traffic control (stop/go boards)":
                case "Traffic control (give and take)":
                case "Traffic control (convoy working)":
                    _traffic = "Traffic control";
                    break;
                default:
                    _traffic = _result.CwayRestrictionDesc;
            }

            _result.PhaseDescription = _result.PhaseDescription.toUpperCase();
            _result.PhasePropStartDate = _result.PhasePropStartDate.replace(/-/g, "/");
            _result.PhaseEstEndDate = _result.PhaseEstEndDate.replace(/-/g, "/");

            if (_result.PhaseDescription.indexOf("PIPE") >= 0 && _result.PhaseDescription.indexOf("SEWER") == -1 && _result.PhaseDescription.indexOf("MANHOLE") == -1)
                _job = "Working on individual<br/>customers water supply.";
            else if (_result.PhaseDescription.indexOf("REIN") >= 0 && _result.PhaseDescription.indexOf("METER") == -1)
                _job = "Restoring the public highway to nationally<br/>agreed standards following work on<br/>our water and sewerage network.";
            else if (_result.PhaseDescription.indexOf("SEWER") >= 0 || _result.PhaseDescription.indexOf("CCTV") >= 0 || _result.PhaseDescription.indexOf("MANHOLE") >= 0)
                _job = "Carrying out work to maintain our<br/>sewerage network to ensure 24/7<br/>service is available to our customers.";
            else if ((_result.PhaseDescription.indexOf("REPAIR") >= 0 && _result.PhaseDescription.indexOf("MAIN") >= 0 && _result.PhaseDescription.indexOf("MAINTAIN") == -1) || (_result.PhaseDescription.indexOf("LEAK") >= 0 && _result.PhaseDescription.indexOf("PIPE") == -1))
                _job = "Repairing a burst water main on our<br/>network so we can restore service to<br/>any customers affected and stop leakage.";
            else
                _job = "Carrying out work to maintain our<br/>water supply network to ensure 24/7<br/>service is available to our customers.";

            _info = "<div style='background-color:#FFFFFF;height:100%'><table style='" + _style + "height:100%;'>";
            _info += "<tr style='background-color:#044693;height:44px'><td><table style='" + _style + "height:100%;'><tr><td>At;</td><td style='font-weight:normal'>" + pcaCorrectCase(_loc) + "</td></tr></table></td></tr>";
            _info += "<tr style='background-color:#7CDA87;border-bottom:none;'>"
            _info += "<td style='vertical-align:top;'>";
            _info += "<table style='" + _style + "color:#000000'>";
            _info += "<tr><td colspan='2'>We are;</td>";
            _info += "<tr><td style='width:40px'></td><td style='font-weight:normal'>" + _job + "</td></tr>";
            _info += "<tr><td colspan='2'>Proposed to start on;</td>";
            _info += "<tr><td style='width:40px'></td><td style='font-weight:normal'>" + pcaFormatDate(_result.PhasePropStartDate) + "</td></tr>";
            _info += "<tr><td colspan='2'>Estimated completion by;</td>";
            _info += "<tr><td style='width:40px'></td><td style='font-weight:normal'>" + pcaFormatDate(_result.PhaseEstEndDate) + "</td></tr>";
            _info += "<tr><td colspan='2'>Traffic impact;</td>";
            _info += "<tr><td style='width:40px'></td><td style='font-weight:normal'>" + _traffic + "</td></tr>";
            _info += "<tr><td colspan='2'>Work reference number;</td>";
            _info += "<tr><td style='width:40px'></td><td style='font-weight:normal'>" + _result.JobRef + "</td></tr>";
            _info += "</table>";
            _info += "</td></tr>";
            _info += "<tr style='background-color:#044693;height:44px;'><td><table style='" + _style + "width:250px;float:left'><tr><td colspan='2'>Current status;</td></tr><tr><td style='width:40px'></td><td style='font-weight:normal'>" + pcaFormatSentence(_result.JobStatus) + "</td></tr></table>";
            _info += "</td></tr>";
            _info += "</table></div>";

            pcaFixOverlap(_result.GridRefE, _result.GridRefN, response);

            var _startdate = new Date(_result.PhasePropStartDate);

            if (_result.GridRefE > 0 && _result.GridRefN > 0 && !(_result.JobStatus == "Planned Work About To Start" && _today > _startdate)) {
                if (_traffic == "None")
                    pcaCreateMarker(_result.GridRefE, _result.GridRefN, pca_warningicon, _info);
                else
                    pcaCreateMarker(_result.GridRefE, _result.GridRefN, pca_worksicon, _info);
            }
        }
    }
}

function pcaFetch(request) {
    var _script = document.getElementById("pcaScript"),
        _head = document.getElementsByTagName("head").item(0);

    if (_script)
        try { _head.removeChild(_script) } catch (e) { };

    _script = document.createElement("script");
    _script.src = "http://services.postcodeanywhere.co.uk" + request;
    _script.type = "text/javascript";
    _script.id = "pcaScript";
    _head.appendChild(_script);
}

function pcaFixOverlap(easting, northing, response) {
    var _overlapping = false;
    
    for (var i in response) {
        if (easting < (parseInt(response[i].GridRefE) + 20) && easting > (parseInt(response[i].GridRefE) - 20) && northing < (parseInt(response[i].GridRefN) + 20) && northing > (parseInt(response[i].GridRefN) - 20)) {
            if (_overlapping) {
                var _dx = parseInt(response[i].GridRefE) - parseInt(easting),
                    _dy = parseInt(response[i].GridRefN) - parseInt(northing),
                    _distance = Math.sqrt(Math.pow(_dx, 2) + Math.pow(_dy, 2)),
                    _nx = _dx / _distance,
                    _ny = _dy / _distance;

                if (_distance) {
                    response[i].GridRefE = parseInt(response[i].GridRefE) + (_nx * 20);
                    response[i].GridRefN = parseInt(response[i].GridRefN) + (_ny * 20);
                }
                else
                    response[i].GridRefE = parseInt(response[i].GridRefE) + 20;
            }
            else
                _overlapping = true;
        }
    }
}

function pcaCreateMarker(easting, northing, icon, info) {
    var _marker = pca_map.CreateMarker(easting, northing, icon);

    _marker.SetInfo(info, 350, 310, { Padding: 2 });
    _marker.AddListener(function () { pcaCentreOnMarker(_marker); _marker.ShowInfo(); });
}

function pcaCentreOnMarker(marker) {
    var _zoom = pca_map.GetZoom(),
        _x = parseInt(marker.X) - ((marker.Info.Width / 2) * _zoom) + (60 * _zoom),
        _y = parseInt(marker.Y) + ((marker.Info.Height / 2) * _zoom) - (40 * _zoom);

    pca_map.SetCentre(_x, _y);
}

function pcaCorrectCase(input) {
    var _separator = " .-(/>",
        _result = "";

    input = input.toLowerCase();

    for (var i = 0; i < input.length; i++) {
        if (i == 0 || _separator.indexOf(input.charAt(i - 1)) >= 0)
            _result += input.charAt(i).toUpperCase();
        else
            _result += input.charAt(i);
    }

    return _result;
}

function pcaFormatSentence(input) {
    return input.charAt(0).toUpperCase() + input.substring(1, input.length).toLowerCase();
}

function pcaFormatDate(date) {
    var _date = new Date(date),
        _months = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
    
    return _date.getDate() + " " + _months[_date.getMonth()] + " " + _date.getFullYear();
}

if (window.addEventListener)
    window.addEventListener('load', pcaInit, false);
else
    window.attachEvent('onload', pcaInit);
    
