var proj4326  = new OpenLayers.Projection('EPSG:4326'), projmerc = new OpenLayers.Projection('EPSG:900913');
var map, marker, markers, clickControl, icon, bbox, home_lonlat;
var old_marker_lonlat = null;
var features = {};

function setCookie(c_name, value, expiredays) {
    var exdate=new Date();
    exdate.setDate(exdate.getDate()+expiredays);
    document.cookie = c_name + "=" + escape(value) + ((expiredays==null) ? "" : ";path=/; expires=" + exdate.toGMTString());
}

function getCookie(c_name) {
    if (document.cookie.length > 0) {
        c_start=document.cookie.indexOf(c_name + "=");
        if (c_start!=-1) {
            c_start = c_start + c_name.length + 1;
            c_end = document.cookie.indexOf(";", c_start);
            if (c_end == -1) c_end = document.cookie.length;
            return unescape(document.cookie.substring(c_start,c_end));
        }
    }
    return "";
}

function remove_marker() {
    if (marker) {
        markers.removeMarker(marker);
        marker.destroy();
        marker = null;
    }
}

function edit_marker(event) {
    event.stop();
    if (marker) {
        old_marker_lonlat = marker.lonlat.clone();
    }
    remove_marker();
    clickControl.activate();
    $('orga_map_edit').hide();
    $('orga_map_save').show();
}

function cancel_edit_marker(event) {
    event.stop();
    remove_marker();
    if (old_marker_lonlat) {
        marker = new OpenLayers.Marker(old_marker_lonlat, icon.clone());
        markers.addMarker(marker);
        map.moveTo(old_marker_lonlat);
    }
    clickControl.deactivate();
    $('orga_map_edit').show();
    $('orga_map_save').hide();
}

function save_marker(organisation_id) {
    var lonlat = marker.lonlat.clone();
    map.moveTo(lonlat);
    lonlat.transform(projmerc, proj4326);
    new Ajax.Request('/organisations/' + organisation_id + '/update_location', { parameters : { lon: lonlat.lon.toFixed(5), lat: lonlat.lat.toFixed(5), authenticity_token: AUTH_TOKEN }});
    clickControl.deactivate();
    $('orga_map_edit').show();
    $('orga_map_save').hide();
    $('nolocwarning').hide();
}

OpenLayers.Control.Click = OpenLayers.Class(OpenLayers.Control, {                
    defaultHandlerOptions: {
        'single': true,
        'double': false,
        'pixelTolerance': 0,
        'stopSingle': false,
        'stopDouble': false
    },

    initialize: function(options) {
        this.handlerOptions = OpenLayers.Util.extend(
            {}, this.defaultHandlerOptions
        );
        OpenLayers.Control.prototype.initialize.apply(
            this, arguments
        ); 
        this.handler = new OpenLayers.Handler.Click(
            this, {
                'click': this.trigger
            }, this.handlerOptions
        );
    }, 

    trigger: function(e) {
        remove_marker();
        var lonlat = map.getLonLatFromViewPortPx(e.xy);
        marker = new OpenLayers.Marker(lonlat, icon.clone());
        markers.addMarker(marker);
    }
});

function selectFeature(feature) {
    popup = feature.createPopup(false);
    popup.setContentHTML($(feature.data.thing_id).innerHTML);
    popup.contentSize = new OpenLayers.Size(300, 60);
    popup.setBackgroundColor("#fafbb0");
    markers.map.addPopup(popup);
}

function unSelectFeature(feature) {
    if (feature && feature.popup) {
        map.removePopup(feature.popup);
        feature.destroyPopup();
    }
}

function onMarkerSelect(evt) {
    var feature = evt.object.feature;
    selectFeature(feature);
    OpenLayers.Event.stop(evt);
}

function onMarkerUnSelect(evt) {
    var feature = evt.object.feature;
    unSelectFeature(feature);
}

function search_results_to_map(map_area_only) {
    /* remove any existing markers from map */
    markers.markers.clone().each(function(m) {
        markers.removeMarker(m);
    });
    var size = new OpenLayers.Size(28, 24);
    var offset = new OpenLayers.Pixel(12, 12);
    $('search_hits_list').childElements().each(function(obj) {
        if (obj.readAttribute('lon') != '') {
            var lonlat = new OpenLayers.LonLat(obj.readAttribute('lon'), obj.readAttribute('lat'));
            lonlat.transform(proj4326, projmerc);

            var icon = new OpenLayers.Icon(obj.down('img').readAttribute('src'), size, offset);

            var feature = new OpenLayers.Feature(markers, lonlat);
            features[obj.down('div.search-result-popup').id] = feature;
            feature.data.icon = icon.clone();
            feature.data.thing_id = obj.down('div.search-result-popup').id;
            feature.data.href = obj.down('a').href;
            var marker = feature.createMarker();
            marker.feature = feature;
            markers.addMarker(marker);
            marker.events.register("mouseover", marker, onMarkerSelect);
            marker.events.register("mouseout", marker, onMarkerUnSelect);
            marker.events.register("mouseup", feature, function() {
                location.href = feature.data.href;
            });
        }
    });

    var bbox = getCookie('bbox');

    if (bbox) {
        map.zoomToExtent(OpenLayers.Bounds.fromString(bbox).transform(proj4326, projmerc));
    } else {
        if (map_area_only) {
            var pbbox = getBboxFromParams();
            map.zoomToExtent(OpenLayers.Bounds.fromString(pbbox).transform(proj4326, projmerc));
        } else {
            if (markers.markers.size() > 0) {
                map.zoomToExtent(markers.getDataExtent());
            } else {
                var pbbox = getBboxFromParams();
                if (pbbox) {
                    map.zoomToExtent(OpenLayers.Bounds.fromString(pbbox).transform(proj4326, projmerc));
                } else {
                    map.setCenter(home_lonlat, 8);
                }
            }
        }
    }
    updateBboxWithoutCookie();
}

function getBboxFromParams() {
    var paras = location.search.substr(1).split('&');
    for (var i = 0; i < paras.length; i++) {
        var p = paras[i].split('=');
        if (p[0] == 'bbox') {
            return(unescape(p[1]));
        }
    }
    return null;
}

function init() {
    flash = $$('div.flash')[0];
    if (flash) {
        setTimeout(function() {
            flash.hide();
            flash.update('');
        }, 5 * 60 * 1000);
    }
}

function updateBboxWithoutCookie() {
    bbox = map.getExtent().transform(projmerc, proj4326).toArray();
    bbox[0] = bbox[0] + 0.0000001;
    bbox[1] = bbox[1] + 0.0000001;
    bbox[2] = bbox[2] - 0.0000001;
    bbox[3] = bbox[3] - 0.0000001;
    $('bbox').value = bbox.join(',');
}

function updateBbox() {
    updateBboxWithoutCookie();
    setCookie('bbox', bbox, 3);
}

function makeIcon(url, x, y) {
    var size = new OpenLayers.Size(x, y);
    var offset = new OpenLayers.Pixel(-(size.w/2), -(size.h/2));
    return new OpenLayers.Icon(url, size, offset);
}

function updateMarker(url, x, y) {
    if (marker) {
        old_marker_lonlat = marker.lonlat;
        icon = makeIcon(url, x, y);
        remove_marker();
        marker = new OpenLayers.Marker(old_marker_lonlat, icon.clone());
        markers.addMarker(marker);
    }
}

// For Admin Page
function setAdminTab(tab) {
	for(i=1;i<6;i++){
		if ($('tab'+i)){
			$('tab'+i).removeClassName('aktiv');
		}
	}
	if ($('tab'+tab)){
		$('tab'+tab).addClassName('aktiv');
	}
	return true;
}

function toggleExtendedSearch() {
	if ($('search_toggler').innerHTML=="Extended Search"){
		$('search_toggler').innerHTML="Standard Search";
		$('extended_search_options').value = "1";
	}else{
	 	$('search_toggler').innerHTML="Extended Search";
		$('extended_search_options').value = "0";
	}
	$('search_extended').toggle();
}

function createMap(url, attribution, zoombar) {
    map = new OpenLayers.Map('map', {
       	maxExtent: new OpenLayers.Bounds(-20037508.34,-20037508.34, 20037508.34, 20037508.34),
	    numZoomLevels: 17,
        maxResolution: 156543,
        units: 'm',
        projection: projmerc,
        displayProjection: proj4326,
        controls: [
            new OpenLayers.Control.Navigation(),
            zoombar ? new OpenLayers.Control.PanZoomBar() : new OpenLayers.Control.PanZoom(),
            new OpenLayers.Control.Attribution()
        ]
    });

    map.addLayer(new OpenLayers.Layer.XYZ('OpenStreetMap', url + '${z}/${x}/${y}.png', {
        transitionEffect: 'resize',
        attribution: attribution
    }));

    markers = new OpenLayers.Layer.Markers('Markers');
    map.addLayer(markers);
}

function createHomeMap(x, y, zoom, zoom_to_default_center) {
    home_lonlat = new OpenLayers.LonLat(x, y);
    home_lonlat.transform(proj4326, projmerc);
    if (zoom_to_default_center) {
        map.setCenter(home_lonlat, zoom);
    }
    bbox = getCookie('bbox');
    map.events.register('moveend', null, updateBbox);
}

function createOrganisationMap(organisation_id, x, y, zoom, cat_icon, create_marker) {
    var lonlat = new OpenLayers.LonLat(x, y);
    lonlat.transform(proj4326, projmerc);

    icon = makeIcon(cat_icon, 28, 24);
    if (create_marker) {
        marker = new OpenLayers.Marker(lonlat, icon.clone());
        markers.addMarker(marker);
    } else {
        marker = null;
    }

    map.setCenter(lonlat, zoom);
    clickControl = new OpenLayers.Control.Click();
    map.addControl(clickControl);
    if ($("orga_map_edit")) { $("orga_map_edit").observe("click", edit_marker) };
    $("orga_map_save_button").observe("click", save_marker.bind(this, organisation_id));
    $("orga_map_cancel_button").observe("click", cancel_edit_marker);
}

function ExtendedSearchOptions(field) {
    // Controls the multiple options for post code, sub region and local authority
    // Only one of them should have a value
    if (field == 'sub_region_ferret'){
	$('local_authority_ferret').value = '';
	$('city').value = '';
	$('post_code').value = '';
    }

    if (field == 'local_authority_ferret'){
	$('sub_region_ferret').value = '';
	$('city').value = '';
	$('post_code').value = '';
    }

    if (field == 'city' || field == 'post_code'){
	$('sub_region_ferret').value = '';
	$('local_authority_ferret').value = '';
    }
}

function move_to_postcode(response) {
    var loc = new OpenLayers.LonLat(response.responseJSON.x, response.responseJSON.y);
    loc.transform(proj4326, projmerc);
    map.setCenter(loc, 14);
}

function extended_search_toggle_sub_fields(attr){
  // for toggling groups of dependant fields in extended search form
  if($(attr).checked){
    $("sub_fields_"+attr).show();
    $(attr).checked=true;
  }else{
    // uncheck all sub elements and hide them all
    boxes = $$("#sub_fields_"+attr+" input");
    for(i=0;i<boxes.length;i++){
      boxes[i].checked = false;
    }
    $("sub_fields_"+attr).hide();
    $(attr).checked=false;
  }
}

function edit_data_toggle_sub_fields(attr, data_grp){
  // for toggling groups of dependant fields in DataXXX edit_form
  if($(data_grp+"_"+attr).checked){
    $("sub_fields_"+attr).show();
    $(data_grp+"_"+attr).checked = true;	
  }else{
    // uncheck all sub elements and hide them all
    boxes = $$("#sub_fields_"+attr+" input");
    for(i=0;i<boxes.length;i++){
      boxes[i].checked = false;
    }
    $("sub_fields_"+attr).hide();
    $(data_grp+"_"+attr).checked = false;	
  }
}