/* MarkerClusterer 1.0 */eval(function(p,a,c,k,e,r){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)r[e(c)]=k[c]||e(c);k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('7 37(n,v,w){4 o=[];4 m=n;4 t=z;4 q=3;4 r=20;4 x=[36,30,2R,2E,2z];4 s=[];4 u=[];4 p=z;4 i=0;A(i=1;i<=5;++i){s.O({\'18\':"1V://35-31-2Z.2W.2Q/2K/2C/2B/2y/m"+i+".2u",\'S\':x[i-1],\'Z\':x[i-1]})}6(F w==="X"&&w!==z){6(F w.1f==="13"&&w.1f>0){r=w.1f}6(F w.1y==="13"){t=w.1y}6(F w.14==="X"&&w.14!==z&&w.14.9!==0){s=w.14}}7 1t(){6(u.9===0){8}4 a=[];A(i=0;i<u.9;++i){q.Q(u[i],G,z,z,G)}u=a}3.1s=7(){8 s};3.12=7(){A(4 i=0;i<o.9;++i){6(F o[i]!=="1Y"&&o[i]!==z){o[i].12()}}o=[];u=[];17.1W(p)};7 1p(a){8 m.1b().34(a.1o())}7 1S(a){4 c=a.9;4 b=[];A(4 i=c-1;i>=0;--i){q.Q(a[i].C,G,a[i].I,b,G)}1t()}3.Q=7(g,j,b,h,a){6(a!==G){6(!1p(g)){u.O(g);8}}4 f=b;4 d=h;4 e=m.M(g.1o());6(F f!=="2A"){f=T}6(F d!=="X"||d===z){d=o}4 k=d.9;4 c=z;A(4 i=k-1;i>=0;i--){c=d[i];4 l=c.1L();6(l===z){1I}l=m.M(l);6(e.x>=l.x-r&&e.x<=l.x+r&&e.y>=l.y-r&&e.y<=l.y+r){c.Q({\'I\':f,\'C\':g});6(!j){c.L()}8}}c=R 1J(3,n);c.Q({\'I\':f,\'C\':g});6(!j){c.L()}d.O(c);6(d!==o){o.O(c)}};3.1C=7(a){A(4 i=0;i<o.9;++i){6(o[i].1K(a)){o[i].L();8}}};3.L=7(){4 a=3.1j();A(4 i=0;i<a.9;++i){a[i].L(G)}};3.1j=7(){4 b=[];4 a=m.1b();A(4 i=0;i<o.9;i++){6(o[i].1n(a)){b.O(o[i])}}8 b};3.1N=7(){8 t};3.1M=7(){8 m};3.1e=7(){8 r};3.Y=7(){4 a=0;A(4 i=0;i<o.9;++i){a+=o[i].Y()}8 a};3.29=7(){8 o.9};3.1A=7(){4 d=3.1j();4 e=[];4 f=0;A(4 i=0;i<d.9;++i){4 c=d[i];4 b=c.1x();6(b===z){1I}4 a=m.W();6(a!==b){4 h=c.1w();A(4 j=0;j<h.9;++j){4 g={\'I\':T,\'C\':h[j].C};e.O(g)}c.12();f++;A(j=0;j<o.9;++j){6(c===o[j]){o.1v(j,1)}}}}1S(e);3.L()};3.1u=7(a){A(4 i=0;i<a.9;++i){3.Q(a[i],G)}3.L()};6(F v==="X"&&v!==z){3.1u(v)}p=17.27(m,"26",7(){q.1A()})}7 1J(h){4 o=z;4 n=[];4 m=h;4 j=h.1M();4 l=z;4 k=j.W();3.1w=7(){8 n};3.1n=7(c){6(o===z){8 T}6(!c){c=j.1b()}4 g=j.M(c.25());4 a=j.M(c.24());4 b=j.M(o);4 e=G;4 f=h.1e();6(k!==j.W()){4 d=j.W()-k;f=23.22(2,d)*f}6(a.x!==g.x&&(b.x+f<g.x||b.x-f>a.x)){e=T}6(e&&(b.y+f<a.y||b.y-f>g.y)){e=T}8 e};3.1L=7(){8 o};3.Q=7(a){6(o===z){o=a.C.1o()}n.O(a)};3.1C=7(a){A(4 i=0;i<n.9;++i){6(a===n[i].C){6(n[i].I){j.1c(n[i].C)}n.1v(i,1);8 G}}8 T};3.1x=7(){8 k};3.L=7(b){6(!b&&!3.1n()){8}k=j.W();4 i=0;4 a=h.1N();6(a===z){a=j.21().1Z()}6(k>=a||3.Y()===1){A(i=0;i<n.9;++i){6(n[i].I){6(n[i].C.11()){n[i].C.1a()}}N{j.1r(n[i].C);n[i].I=G}}6(l!==z){l.1k()}}N{A(i=0;i<n.9;++i){6(n[i].I&&(!n[i].C.11())){n[i].C.1k()}}6(l===z){l=R E(o,3.Y(),m.1s(),m.1e());j.1r(l)}N{6(l.11()){l.1a()}l.1q(G)}}};3.12=7(){6(l!==z){j.1c(l)}A(4 i=0;i<n.9;++i){6(n[i].I){j.1c(n[i].C)}}n=[]};3.Y=7(){8 n.9}}7 E(a,c,d,b){4 f=0;4 e=c;1X(e!==0){e=V(e/10,10);f++}6(d.9<f){f=d.9}3.16=d[f-1].18;3.H=d[f-1].S;3.P=d[f-1].Z;3.19=d[f-1].1U;3.D=d[f-1].32;3.15=a;3.1T=f;3.1R=d;3.1m=c;3.1l=b}E.J=R 2Y();E.J.2X=7(i){3.1P=i;4 j=1O.2V("2U");4 h=3.15;4 f=i.M(h);f.x-=V(3.P/2,10);f.y-=V(3.H/2,10);4 g="";6(1O.2T){g=\'2S:2P:2O.2M.2L(2J=2I,2H="\'+3.16+\'");\'}N{g="2G:18("+3.16+");"}6(F 3.D==="X"){6(F 3.D[0]==="13"&&3.D[0]>0&&3.D[0]<3.H){g+=\'S:\'+(3.H-3.D[0])+\'B;1H-1g:\'+3.D[0]+\'B;\'}N{g+=\'S:\'+3.H+\'B;1G-S:\'+3.H+\'B;\'}6(F 3.D[1]==="13"&&3.D[1]>0&&3.D[1]<3.P){g+=\'Z:\'+(3.P-3.D[1])+\'B;1H-1i:\'+3.D[1]+\'B;\'}N{g+=\'Z:\'+3.P+\'B;1F-1E:1D;\'}}N{g+=\'S:\'+3.H+\'B;1G-S:\'+3.H+\'B;\';g+=\'Z:\'+3.P+\'B;1F-1E:1D;\'}4 k=3.19?3.19:\'2x\';j.U.2w=g+\'2v:2t;1g:\'+f.y+"B;1i:"+f.x+"B;2D:"+k+";2s:2F;1h-2r:2q;"+\'1h-2p:2o,2n-2m;1h-2N:2l\';j.2k=3.1m;i.2j(2i).2h(j);4 e=3.1l;17.2g(j,"2f",7(){4 a=i.M(h);4 d=R 1Q(a.x-e,a.y+e);d=i.1B(d);4 b=R 1Q(a.x+e,a.y-e);b=i.1B(b);4 c=i.2e(R 2d(d,b),i.2c());i.2b(h,c)});3.K=j};E.J.1K=7(){3.K.2a.33(3.K)};E.J.28=7(){8 R E(3.15,3.1T,3.1m,3.1R,3.1l)};E.J.1q=7(a){6(!a){8}4 b=3.1P.M(3.15);b.x-=V(3.P/2,10);b.y-=V(3.H/2,10);3.K.U.1g=b.y+"B";3.K.U.1i=b.x+"B"};E.J.1k=7(){3.K.U.1d="1z"};E.J.1a=7(){3.K.U.1d=""};E.J.11=7(){8 3.K.U.1d==="1z"};',62,194,'|||this|var||if|function|return|length||||||||||||||||||||||||||null|for|px|marker|anchor_|ClusterMarker_|typeof|true|height_|isAdded|prototype|div_|redraw_|fromLatLngToDivPixel|else|push|width_|addMarker|new|height|false|style|parseInt|getZoom|object|getTotalMarkers|width||isHidden|clearMarkers|number|styles|latlng_|url_|GEvent|url|textColor_|show|getBounds|removeOverlay|display|getGridSize_|gridSize|top|font|left|getClustersInViewport_|hide|padding_|text_|isInBounds|getLatLng|isMarkerInViewport_|redraw|addOverlay|getStyles_|addLeftMarkers_|addMarkers|splice|getMarkers|getCurrentZoom|maxZoom|none|resetViewport|fromDivPixelToLatLng|removeMarker|center|align|text|line|padding|continue|Cluster|remove|getCenter|getMap_|getMaxZoom_|document|map_|GPoint|styles_|reAddMarkers_|index_|opt_textColor|http|removeListener|while|undefined|getMaximumResolution|60|getCurrentMapType|pow|Math|getNorthEast|getSouthWest|moveend|addListener|copy|getTotalClusters|parentNode|setCenter|getSize|GLatLngBounds|getBoundsZoomLevel|click|addDomListener|appendChild|G_MAP_MAP_PANE|getPane|innerHTML|bold|serif|sans|Arial|family|11px|size|position|pointer|png|cursor|cssText|black|images|90|boolean|markerclusterer|trunk|color|78|absolute|background|src|scale|sizingMethod|svn|AlphaImageLoader|Microsoft|weight|DXImageTransform|progid|com|66|filter|all|div|createElement|googlecode|initialize|GOverlay|library|56|utility|opt_anchor|removeChild|containsLatLng|gmaps|53|MarkerClusterer'.split('|'),0,{}))/* MapIconMaker 1.1 */eval(function(p,a,c,k,e,r){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)r[e(c)]=k[c]||e(c);k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('3 w={};w.1K=K(h){3 f=h.1a||A;3 b=h.1g||A;3 e=h.P||"#15";3 a=h.13||"#G";3 g=h.20||"#1W";3 d="N://z.L.Q.O/z?R=1B";3 j=d+"&U="+f+"x"+b+"&T="+g.4("#","")+","+e.4("#","")+","+a.4("#","")+"&F=.E";3 c=u 10(Y);c.X=j;c.V=u B(f,b);c.19=u B(y.1e(f*1.6),b);c.14=u H(f/2,b);c.17=u H(f/2,y.1e(b/12));c.18=j+"&J=I";c.1m=j+"&D=S,s,1h"+"&J=I";j=d+"&U="+f+"x"+b+"&T="+g.4("#","")+","+e.4("#","")+","+a.4("#","");c.1l=j+"&D=a,s,1p&F=.E";c.v=[f/2,b,(7/16)*f,(5/8)*b,(5/16)*f,(7/16)*b,(7/A)*f,(5/16)*b,(5/16)*f,(1/8)*b,(1/2)*f,0,(11/16)*f,(1/8)*b,(25/A)*f,(5/16)*b,(11/16)*f,(7/16)*b,(9/16)*f,(5/8)*b];1k(3 i=0;i<c.v.1Z;i++){c.v[i]=Z(c.v[i])}C c};w.1V=K(k){3 h=k.1a||A;3 j=k.1g||A;3 d=k.P||"#15";3 i=k.1T||"#G";3 m=w.W(k.1j)||"";3 c=k.1i||"#G";3 l=k.1S||0;3 s=k.1R||"1f";3 f=(s==="1f")?"1Q":"1d";3 t="N://z.L.Q.O/z?R="+f;3 n=t+"&U="+h+"x"+j+"&T="+d.4("#","")+","+i.4("#","")+"1P,1c"+"&1b="+m+"&1O="+c.4("#","")+","+l;3 e=u 10(Y);e.X=n+"&D=S,s,1M"+"&F=.E";e.V=u B(h,j);e.19=u B(0,0);e.14=u H(h/2,j/2);e.17=u H(h/2,j/2);e.18=n+"&J=I";e.1m=n+"&D=S,s,1h"+"&J=I";e.1l=n+"&D=a,s,1c&F=.E";e.v=[];M(f==="1d"){e.v=[0,0,h,0,h,j,0,j]}1J{3 o=8;3 r=1I/o;3 b=y.1H(h,j)/2;1k(3 a=0;a<(o+1);a++){3 g=r*a*(y.1G/1F);3 p=b+b*y.1E(g);3 q=b+b*y.1D(g);e.v.1A(Z(p),Z(q))}}C e};w.1L=K(k){3 j=k.P||"#1z";3 b=k.13||"#G";3 f=k.1N||"#1y";3 a=k.1x||"#1w";3 e=w.W(k.1j)||"";3 d=k.1i||"#G";3 i=k.1v||1u;3 c=(i)?"1t":"1s";3 h="N://z.L.Q.O/z?R=d&1U=1r&1b=";3 l=h+c+"\'i\\\\"+"\'["+e+"\'-2\'f\\\\"+"1q\'a\\\\]"+"h\\\\]o\\\\"+j.4("#","")+"\'1X\\\\"+d.4("#","")+"\'1Y\\\\"+b.4("#","")+"\'1o\\\\";M(i){l+=f.4("#","")+"\'1C\\\\"+a.4("#","")+"\'1n\\\\"}l+="22\'f\\\\";3 g=u 10(Y);g.X=l+"&F=.E";g.V=(i)?u B(23,29):u B(21,28);C g};w.W=K(a){M(a===27){C 26}a=a.4(/@/,"@@");a=a.4(/\\\\/,"@\\\\");a=a.4(/\'/,"@\'");a=a.4(/\\[/,"@[");a=a.4(/\\]/,"@]");C 24(a)};',62,134,'|||var|replace||||||||||||||||||||||||||new|imageMap|MapIconMaker||Math|chart|32|GSize|return|chf|png|ext|000000|GPoint|gif|chof|function|apis|if|http|com|primaryColor|google|cht|bg|chco|chs|iconSize|escapeUserText_|image|G_DEFAULT_ICON|parseInt|GIcon|||strokeColor|iconAnchor|ff0000||infoWindowAnchor|printImage|shadowSize|width|chl|ffffff01|itr|floor|circle|height|ECECD8|labelColor|label|for|transparent|mozPrintImage|0C|eC|ffffff11|hv|mapsapi|pin|pin_star|false|addStar|0000FF|starStrokeColor|FFFF00|DA7187|push|mm||sin|cos|180|PI|min|360|else|createMarkerIcon|createLabeledMarkerIcon|00000000|starPrimaryColor|chx|ff|it|shape|labelSize|shadowColor|chdp|createFlatIcon|ffffff|fC|tC|length|cornerColor||Lauto||encodeURIComponent||null|undefined|34|39'.split('|'),0,{}))/* ace.map */if (typeof(ace) == 'undefined') { ace = {}; };ace.map = function () {    var gmap, markerCluster, geocoder;    var type, artform, lastQueryBounds = new GLatLngBounds();    var minimumZoomLevel = 6;    var infoWindowOpts = {};    var allowedBounds = new GLatLngBounds(        new GLatLng(49.5,-10), new GLatLng(59,2.6)    );    /**     * Specifies whether loading is occurring and shows/hides a message     * @param {Boolean} isLoading     */    var setLoading = function(isLoading) {        if (!document.getElementById('loading')) {            $('<div id="loading" style="padding:10px 20px;font-size:20px;' +               'color:#fff;background:#000;position:fixed;top:10px;' +               'right:0;">Loading</div>').appendTo('body');        };        if (isLoading === true) {            $('#loading').show();        } else {            $('#loading').fadeOut(1000);        }    };        /**     * Creates a GMarker for a given search result     * @param {Object} A result as returned by getSearchResultsInViewport()     * @return {GMarker} The initialised marker object     */    var createMarker = function (searchResult, color) {        var icon = MapIconMaker.createMarkerIcon({primaryColor: color});        var latlng = new GLatLng(searchResult[2], searchResult[3]);        var marker = new GMarker(latlng, icon);        marker.href = searchResult[0];        GEvent.addListener(marker, 'click', function () {            gmap.panTo(this.getLatLng());            setLoading(true);            GDownloadUrl(searchResult[0], function (data, statusCode) {                setLoading(false);                if (statusCode != 200) { };                marker.openInfoWindowHtml('<div style="overflow:auto;margin:7px;width:400px;height:200px;">'+data+'</div>', infoWindowOpts);            });        });        return marker;    };        /**     * Creates a marker for a cluster of map points based on the Charts API     * @param {String} color a hex color string for the circle     * @param {String} textColor a hex color string for the text label     * @param {Number} width The width of the marker to generate     * @param {Number} height The height of the marker to generate     * @return An object for a cluster marker style     */    var createClusterMarker = function(color, textColor, width, height) {        color = color.replace('#', '');        var url = "http://chart.apis.google.com/chart?" +             "cht=it&chs="+width+"x"+height+"&chco="+color+","+            "00000000,FF000000&chf=bg,s,FFFFFF00&ext=.png"        return {            width: width * 0.90,            height: height * 0.90,            opt_textColor: textColor,            url: url        };    };        /**     * Converts a searchResults array to an array or GMarkers     * @param {Array} searchResults An array of search results     * @return An array of GMarkers     */    var searchResultsToMarkers = function (searchResults, color) {        var markers = [];        for (i in searchResults) {            markers.push(createMarker(searchResults[i], color));        };        return markers;    };        /**     * Handles map move events and prevents moving out of allowedBounds     */    var onMapMove = function () {        if (allowedBounds.contains(gmap.getCenter())) { return };        var C = gmap.getCenter();        var X = C.lng();        var Y = C.lat();        var AmaxX = allowedBounds.getNorthEast().lng();        var AmaxY = allowedBounds.getNorthEast().lat();        var AminX = allowedBounds.getSouthWest().lng();        var AminY = allowedBounds.getSouthWest().lat();        if (X < AminX) {X = AminX;}        if (X > AmaxX) {X = AmaxX;}        if (Y < AminY) {Y = AminY;}        if (Y > AmaxY) {Y = AmaxY;}        gmap.setCenter(new GLatLng(Y, X));    };        var getSearchResults = function () {        // Get the selected type and artform        type = $('input[name=type]:checked').val()        artform = $('option:selected').val()        var bounds = gmap.getBounds();        var span = bounds.toSpan();        var ne = bounds.getNorthEast();        var sw = bounds.getSouthWest();        bounds = new GLatLngBounds(            new GLatLng(sw.lat()-span.lat(), sw.lng()-span.lng()),             new GLatLng(ne.lat()+span.lat(), ne.lng()+span.lng())             );        var args = {            artform: artform,            type: type,            span: bounds.toSpan(),            center: bounds.getCenter(),            format: 'json'        };        var url = [];        for (k in args) {            url.push(k + '=' + ((typeof args[k].toUrlValue == 'undefined') ?                    args[k] : args[k].toUrlValue()));        };        url = '/map/?' + url.join('&');        setLoading(true);        GDownloadUrl(url, function (data, statusCode) {            setLoading(false);            if (statusCode != 200) { };            lastQueryBounds = bounds;            searchResults = eval(data);            var regionalOfficeVisible = false;            for (var i = 0; regionalOffices.length > i; i++) {                var latlng = new GLatLng(regionalOffices[i][2], regionalOffices[i][3]);                if (bounds.containsLatLng(latlng)) {                    regionalOfficeVisible = true;                    break;                };            };            if (searchResults.length == 0 && regionalOfficeVisible == false) {                $('#no-results').show();                $('#no-location').hide();            } else {                $('#no-results').hide();            };            markerClusterer.clearMarkers();            markerClusterer.addMarkers(searchResultsToMarkers(searchResults, '#E30079'));        });    };            /**     * Handles moveend events and fetches new search results if necessary     */    var onMapMoveEnd = function () {        updateListURL();        var bounds = gmap.getBounds();        if (lastQueryBounds.containsBounds(bounds)) {            markerClusterer.resetViewport();            return false;        };        getSearchResults();    };        var onGetLocations = function (response) {        if (response.Status.code != 200) {            $('#no-location').show();            return false;        };        var place = response['Placemark'][0];        if (place['AddressDetails']['Country']['CountryNameCode'] != 'GB') {            $('#no-location').show()              return false;        };        $('#no-location').hide();        var center = place['Point']['coordinates'];        center = new GLatLng(center[1], center[0]);        gmap.setCenter(center);        gmap.setZoom([1,5,6,8,11,13,15,16,17][place['AddressDetails']['Accuracy']]);        gmap.savePosition();        updateListURL();    };        /**     * Initialises input placeholders     */    var initPlaceholder = function () {        var placeholder = 'Enter your postcode or location';        var q = $('input#q');        if (String(q.val()).length == 0) {            q.val(placeholder);        };        q.blur(function () {            if (String(q.val()).length == 0) {                q.val(placeholder);            };        });        q.focus(function () {            if (String(q.val()) === placeholder) {                q.val('');            };        });    };        var updateListURL = function () {        var center = gmap.getCenter();        var span = gmap.getBounds().toSpan();        var url = "/map/list/?artform=" + artform + "&type=" + type +             "&center=" + center.lat() + "," + center.lng() +            "&zoom=" + gmap.getZoom();        var q = $("#q").val();        if ('Enter your postcode or location' !== q) {            url += "&q=" + q;        };        $('a.view-in-list').each(function () {            $(this).attr('href', url);        });    };        /**     * Initialises the map interface     * @param {GLatLng} center The initial center point     * @param {Number} zoom The initial zoom level     * @param {Array} searchResults An array of search results     * @return      */    var init = function (center, zoom, searchResults) {        initPlaceholder();                // Get the selected type and artform        type = $('input[name=type]:checked').val();        artform = $('select[name=artform] option:selected').val();        // Initalise the geocoder        geocoder = new GClientGeocoder();        geocoder.setBaseCountryCode('GB');        $('form#geosearch').submit(function (event) {            event.preventDefault();            var q = $('#q').val();            // If the filters have changed lastquerybounds is invalid            var newType = $('input[name=type]:checked').val();            var newArtform = $('input[name=artform]:checked').val();            if (artform != newArtform || type != newType) {                artform = newArtform;                type = newType;                lastQueryBounds = new GLatLngBounds();            };            geocoder.getLocations(q, onGetLocations);        });                // Initialise the map        gmap = new GMap2($('#map').get(0));        // Make sure we have a zoom level        if (zoom == null) {            var center = initialCenter;            var span = initialSpan;            var sw = new GLatLng(center.lat() - (span.lat() / 3), center.lng() - (span.lng() / 3));            var ne = new GLatLng(sw.lat() + span.lat(), sw.lng() + span.lng());            var bounds = new GLatLngBounds(sw, ne);            zoom = gmap.getBoundsZoomLevel(bounds);            alert(zoom);        };        // Initialise everything else        gmap.setUIToDefault();        gmap.enableContinuousZoom();        gmap.setCenter(center);        gmap.setZoom(zoom);        gmap.savePosition();        infowindow = gmap.getInfoWindow();        // Attach event listeners        GEvent.addListener(gmap, "move", onMapMove);        GEvent.addListener(gmap, "moveend", onMapMoveEnd);        // Set lastQueryBounds so we re-query when moving out of this bounds        lastQueryBounds = gmap.getBounds();                // Create the markerClusterer and add the initial searchResults        var markers = searchResultsToMarkers(searchResults, '#E30079');        markerClusterer = new MarkerClusterer(gmap, markers, {            styles: [                createClusterMarker('#E30079', '#FFFFFF', 36, 35),                createClusterMarker('#E30079', '#FFFFFF', 46, 45),                createClusterMarker('#E30079', '#FFFFFF', 56, 55)            ]        });                // Always plot the regional offices        markers = searchResultsToMarkers(regionalOffices, '#000000');        for (var i = 0; markers.length > i; i++) {            gmap.addOverlay(markers[i]);        }                updateListURL();                // Flush        $(document).unload(function () {            GUnload();        });    };    return {        init: init    };}();jQuery(function ($) {    ace.map.init(initialCenter, initialZoom, searchResults); });
