var map = null;
var permalink = null;

/* Factory function for creating bug icons on demand */
function create_bug_icon(bug_type, bug_status)
{
	// validating and fixing input parameters
	var types = ["wrong_roundabout", "wrong_turn", "bad_routing", "oneway_road", "blocked_street", "missing_street", "missing_speedlimit",  "other"];
	if(typeof(bug_type) == 'undefined' || types.indexOf(bug_type) == -1){
		bug_type = 'other';
	}
	bug_status = (bug_status + '').toLowerCase();
	var statuses = ["open", "fixed", "invalid"];
	if(statuses.indexOf(bug_status) == -1){
		bug_status = 'open';
	}
	
	// icon attributes
	var icon_size = new OpenLayers.Size(22, 22);
	var icon_offset = new OpenLayers.Pixel(-icon_size.w/2, -icon_size.h/2);
	
	// creating and returning the icon object
	return new OpenLayers.Icon(osb_img_path + bug_status + '_' + bug_type + '.png', icon_size, icon_offset);
}

function init_map(div_id, lon, lat, zoom)
{
	map = new OpenLayers.Map(div_id, {
		controls: [
			new OpenLayers.Control.Navigation(),
			new OpenLayers.Control.PanZoomBar(),
			new OpenLayers.Control.ScaleLine(),
			new OpenLayers.Control.LayerSwitcher(),
			new OpenLayers.Control.Attribution()
		]
	});

	OpenLayers.Layer.MapQuestOSM = OpenLayers.Class(OpenLayers.Layer.XYZ, {
		name: "MapQuest",
		attribution: 'Map data <a href="http://creativecommons.org/licenses/by-sa/2.0/" target="_blank">CCBYSA</a> 2010 <a href="http://openstreetmap.org" target="_blank">OpenStreetMap.org</a> contributors - Tiles Courtesy of <a href="http://www.mapquest.com/" target="_blank">MapQuest</a> <img src="http://developer.mapquest.com/content/osm/mq_logo.png" border="0">',
		sphericalMercator: true,
		url: 'http://otile1.mqcdn.com/tiles/1.0.0/osm/${z}/${x}/${y}.png',
		clone: function(obj) {
			if (obj == null) {
				obj = new OpenLayers.Layer.OSM(this.name, this.url, this.getOptions());
			}
			obj = OpenLayers.Layer.XYZ.prototype.clone.apply(this, [obj]);
			return obj;
		},
		CLASS_NAME: "OpenLayers.Layer.MapQuestOSM"
	});

	var layerMapQuest = new OpenLayers.Layer.MapQuestOSM();
	map.addLayer(layerMapQuest);
	var layerMapnik = new OpenLayers.Layer.OSM.Mapnik("Mapnik");
	map.addLayer(layerMapnik);

	map.setCenter(new OpenLayers.LonLat(lon, lat).transform(new OpenLayers.Projection("EPSG:4326"), map.getProjectionObject()), zoom);

	map.addControl(permalink=new OpenLayers.Control.Permalink());

	return map;
}

function init()
{
	zoomlevel = 6;

	if(typeof(skobbler_CENTER_LON) == 'undefined' || typeof(skobbler_CENTER_LAT) == 'undefined' || typeof(zoomlevel) == 'undefined'){ // centering to Europe
		skobbler_CENTER_LON = 16.3;
		skobbler_CENTER_LAT = 46.53;
		zoomlevel = 4;
	}

	if(typeof(skobbler_MAP_SETTINGS_LAT) != 'undefined') {
		skobbler_CENTER_LAT = y2lat(skobbler_MAP_SETTINGS_LAT);
	}

	if(typeof(skobbler_MAP_SETTINGS_LON) != 'undefined') {
		skobbler_CENTER_LON = x2lon(skobbler_MAP_SETTINGS_LON);
	}
	
	if(typeof(skobbler_MAP_SETTINGS_ZOOM) != 'undefined') {
		zoomlevel = skobbler_MAP_SETTINGS_ZOOM;
	}

	var map = init_map('map', skobbler_CENTER_LON, skobbler_CENTER_LAT, zoomlevel);
	init_openstreetbugs(map, "osmbugs/");
}

function select_init()
{
    if(typeof(skobbler_MAP_PAGE_ID) == 'undefined')
    {
        init();
    }
    else
    {
        if(skobbler_MAP_PAGE_ID == 'bug_details' )
        {
            init_bug_details();
        }

        if(skobbler_MAP_PAGE_ID == 'my_bugs' )
        {
            init_my_bugs();
        }

    }
}

function init_bug_details()
{
	zoomlevel = 15;

	if(typeof(skobbler_CENTER_LON) == 'undefined' || typeof(skobbler_CENTER_LAT) == 'undefined'){ // centering to Europe
		skobbler_CENTER_LON = 16.3;
		skobbler_CENTER_LAT = 46.53;
		zoomlevel = 6;
	}

	map = init_map('map_bug_details', skobbler_CENTER_LON, skobbler_CENTER_LAT, zoomlevel);

	var markers = new OpenLayers.Layer.Markers("BugMarker");
	map.addLayer(markers);

	var icon = create_bug_icon(skobbler_BUG_TYPE, skobbler_BUG_STATUS);

    //test if  kml exist
    if(!(typeof(skobbler_OSMBUGS_DETAIL_KML) == 'undefined')){
        loadKML();
	}

    markers.addMarker(new OpenLayers.Marker(new OpenLayers.LonLat(lon2x(skobbler_CENTER_LON), lat2y(skobbler_CENTER_LAT)),icon));
    markers.setZIndex(map.Z_INDEX_BASE['Popup'] - 1);
    
}

function loadKML()
{
    // KML layer styles
    var myStyles = new OpenLayers.StyleMap({
            "default": new OpenLayers.Style({
                graphicZIndex: 1,
                fillOpacity: 0.6,
                strokeOpacity: 0.6,
				cursor: "pointer",
				labelAlign: "lm",
                fontFamily: "Calibri, Tw Cen MT, Trebuchet MS, Tahoma, Helvetica",
                fontSize: "11px",
                fontWeight: "bold",
				fontColor: "black"
            }),
            "select": new OpenLayers.Style({
                graphicZIndex: 3,
                fillOpacity: 1,
                strokeOpacity: 1
            })
        });

    var lookup_default = {
		"#requested_route_line": {strokeWidth: 8, strokeColor: "#134878"},
		"#reroute_line": {strokeWidth: 6, strokeColor: "#2be9d5", strokeOpacity: 0.3},
		"#gps_line": {strokeWidth: 7, strokeColor: "#52a000"},
		"#gps_point": {strokeWidth: 1, pointRadius: 4, strokeColor: "black", fillColor: "#52a000"},
		"#advice_point": {pointRadius: 13, externalGraphic: skobbler_STYLE_DETAIL_KML + "advice.png", fillOpacity: 1},
        "#ending_point": {pointRadius: 9, graphicZIndex: 2, externalGraphic: skobbler_STYLE_DETAIL_KML + "${routeEnding}.png"}
	}
	var lookup_selected = {
		"#requested_route_line": {strokeWidth: 8, strokeColor: "#134878"},
		"#reroute_line": {strokeWidth: 6, strokeColor: "#2be9d5", fontColor: "#165a53", label: ". . ${name}"},
		"#gps_line": {strokeWidth: 7, strokeColor: "#52a000"},
		"#gps_point": {strokeWidth: 1, pointRadius: 4, strokeColor: "black", fillColor: "#52a000"},
		"#advice_point": {pointRadius: 12, externalGraphic: skobbler_STYLE_DETAIL_KML + "advice.png"},
        "#ending_point": { pointRadius: 9, graphicZIndex: 4, externalGraphic: skobbler_STYLE_DETAIL_KML + "${routeEnding}.png"}
	}
	myStyles.addUniqueValueRules("default", "styleUrl", lookup_default);
	myStyles.addUniqueValueRules("select", "styleUrl", lookup_selected);

	kmlLayer = new OpenLayers.Layer.GML("Route", skobbler_OSMBUGS_DETAIL_KML,
	{
		format: OpenLayers.Format.KML,
		formatOptions: {
			extractAttributes: true,
			maxDepth: 2
		},
		styleMap: myStyles,
		rendererOptions: {zIndexing: true},
	
		// overriding requestSuccess to inject routing
		requestSuccess:function(request) {
			var doc = request.responseXML;
			if(!doc || !doc.documentElement){
				doc = request.responseText;
			}
			var options = {};
			OpenLayers.Util.extend(options, this.formatOptions);
			if(this.map && !this.projection.equals(this.map.getProjectionObject())){
				options.externalProjection = this.projection;
				options.internalProjection = this.map.getProjectionObject();
			}
			var gml = this.format ? new this.format(options) : new OpenLayers.Format.GML(options);
			this.addFeatures(gml.read(doc));
			this.events.triggerEvent("loadend");
			
			// extracting main route start and end points
			var f = kmlLayer.features;
			var start = false;
			var end = false;
			for(var i=0;i<f.length;i++){
				if(f[i].data.name == 'Main Route Start Point'){
					start = [x2lon(f[i].geometry.x), y2lat(f[i].geometry.y)];
				}
				if(f[i].data.name == 'Main Route End Point'){
					end = [x2lon(f[i].geometry.x), y2lat(f[i].geometry.y)];
				}
			}
			if(start !== false && end !== false){
				addMapQuestRoutingDraggableMarkers(start, end);
				drawMapQuestRouting(start, end);
				map.layers[4].setVisibility(false);
			}
		}
	});
		
	map.addLayer(kmlLayer);

	selectControl = new OpenLayers.Control.SelectFeature( kmlLayer,{
		multiple: false,
		hover: false,
		clickout: false,
		onSelect: onFeatureSelect,
		onUnselect: onFeatureUnselect
	});

	map.addControl(selectControl);

	selectControl.activate();
	
}

var routingMarkersLayer = null;
var routingStart = null;
var routingEnd = null;

function addMapQuestRoutingDraggableMarkers(start, end){
	
	routingStart = start;
	routingEnd = end;
	
	routingMarkersLayer = new OpenLayers.Layer.Vector("MapQuest Directions endpoints");
	
	var p1 = new OpenLayers.Geometry.Point(lon2x(start[0]), lat2y(start[1]));
	var p2 = new OpenLayers.Geometry.Point(lon2x(end[0]), lat2y(end[1]));
	
	var v1 = new OpenLayers.Feature.Vector(p1, {name:'start'}, {pointRadius: 16, externalGraphic: 'js/lib/osm_bugs/marker1.gif', graphicXOffset: -16, graphicYOffset: -33});
	var v2 = new OpenLayers.Feature.Vector(p2, {name:'end'}, {pointRadius: 16, externalGraphic: 'js/lib/osm_bugs/marker2.gif', graphicXOffset: -16, graphicYOffset: -33});
	
	routingMarkersLayer.addFeatures([v1, v2]);
	
	map.addLayer(routingMarkersLayer);
	
	var dragFeature = new OpenLayers.Control.DragFeature(routingMarkersLayer, {onComplete: redrawMapQuestRouting});
	map.addControl(dragFeature);
	dragFeature.activate();
}

var lineFeature = false;
var routingLineLayer = false;
var firstRouting  = true;

function drawMapQuestRouting(start, end){

	var url = 'http://open.mapquestapi.com/directions/v0/route?outFormat=json&from='+start[1]+','+start[0]+'&to='+end[1]+','+end[0]+'&routeType=' + routeType + '&unit=k&shapeFormat=raw&generalize=0&narrativeType=none';
	
	jQuery.ajax({
		url: url,
		dataType: "jsonp",
		success: function(data) {
			if (data.info.statuscode == 0) {
				var shapePoints = data.route.shape.shapePoints;
				var points = [];
				if(typeof shapePoints !== 'undefined' && shapePoints.length > 0){
					for(i=0;i<shapePoints.length;i=i+2){
						points.push(new OpenLayers.Geometry.Point(lon2x(shapePoints[i+1]), lat2y(shapePoints[i])));
					}
				}
				
				if(points.length == 0){
					return;
				}
				
				lineString = new OpenLayers.Geometry.LineString(points);
				
				if(lineFeature != false){
					routingLineLayer.removeFeatures([lineFeature]);
				}
				
				lineFeature = new OpenLayers.Feature.Vector(lineString, null, {strokeWidth: 7, strokeColor: "#FF766A"});
				
				if(routingLineLayer == false){
					routingLineLayer = new OpenLayers.Layer.Vector("MapQuest Directions");
					map.addLayer(routingLineLayer);
				}
				routingLineLayer.addFeatures([lineFeature]);
				routingLineLayer.redraw();
				if (firstRouting) {
					if (routingMarkersLayer.getVisibility() == false) {
						routingLineLayer.setVisibility(false);
					}
					firstRouting = false;
				}
			}
		}
	});
}

function redrawMapQuestRouting(feature){
	if (feature == null){
		return;
	}
	
	var pointX = feature.geometry.x;
	var pointY = feature.geometry.y;
	
	if(feature.attributes.name == 'start'){
		routingStart = [x2lon(pointX), y2lat(pointY)];
	} else{
		routingEnd = [x2lon(pointX), y2lat(pointY)];
	}
	drawMapQuestRouting(routingStart, routingEnd);
}

function onPopupClose(evt)
{
	selectControl.unselect(selectedFeature);
}

function selectFeatures(groupCategory)
{
	for(i=0;i<kmlLayer.features.length;i++){
		if(kmlLayer.features[i].data.groupCategory == groupCategory){
			kmlLayer.features[i].renderIntent = 'select';
		} else{
			kmlLayer.features[i].renderIntent = 'default';
		}
		kmlLayer.drawFeature(kmlLayer.features[i]);
	}
}

function onFeatureSelect(feature)
{
	if(typeof(feature.data.groupCategory) != 'undefined') {
		selectFeatures(feature.data.groupCategory);
	}

	if(feature.data.styleUrl == '#advice_point') {
		selectedFeature = feature;
		popup = new OpenLayers.Popup.FramedCloud("advice",
			map.getLonLatFromViewPortPx(this.handlers.feature.evt.xy),
			new OpenLayers.Size(50,50),
			"<h2>"+  (typeof(feature.data.name)!='undefined' ? feature.data.name:'') + "</h2>" +
			(typeof(feature.data.description)!='undefined' ? feature.data.description:''),
			null, true, onPopupClose
		);
		selectedFeature.popupClass = OpenLayers.Class(popup);
		selectedFeature.maxSize =  new OpenLayers.Size(250,250);
		popup.maxSize =  new OpenLayers.Size(250,250);
		feature.popup = popup;
		map.addPopup(popup);
	}
}

function onFeatureUnselect(feature)
{
    if( feature.popup  )
    {
        map.removePopup(feature.popup);
        feature.popup.destroy();
        feature.popup = null;

    }
   
}


function init_my_bugs(){
	
	zoomlevel = 10;

	if(typeof(skobbler_CENTER_LON) == 'undefined' || typeof(skobbler_CENTER_LAT) == 'undefined'){ // centering to Europe
		skobbler_CENTER_LON = 16.3;
		skobbler_CENTER_LAT = 46.53;
		zoomlevel = 6;
	}
	init_map('map_my_bugs', skobbler_CENTER_LON, skobbler_CENTER_LAT, zoomlevel);
	
	map = new OpenLayers.Map('map_my_bugs', {
		controls: [
			new OpenLayers.Control.Navigation(),
			new OpenLayers.Control.Attribution()
		]
	});
	
	OpenLayers.Layer.MapQuestOSM = OpenLayers.Class(OpenLayers.Layer.XYZ, {
		name: "MapQuest",
		attribution: 'Map data <a href="http://creativecommons.org/licenses/by-sa/2.0/" target="_blank">CCBYSA</a> 2010 <a href="http://openstreetmap.org" target="_blank">OpenStreetMap.org</a> contributors - Tiles Courtesy of <a href="http://www.mapquest.com/" target="_blank">MapQuest</a> <img src="http://developer.mapquest.com/content/osm/mq_logo.png" border="0">',
		sphericalMercator: true,
		url: ' http://otile1.mqcdn.com/tiles/1.0.0/osm/${z}/${x}/${y}.png',
		clone: function(obj) {
			if (obj == null) {
				obj = new OpenLayers.Layer.OSM(this.name, this.url, this.getOptions());
			}
			obj = OpenLayers.Layer.XYZ.prototype.clone.apply(this, [obj]);
			return obj;
		},
		CLASS_NAME: "OpenLayers.Layer.MapQuestOSM"
	});

	var layerMapQuest = new OpenLayers.Layer.MapQuestOSM();
	map.addLayer(layerMapQuest);
}

function getMapSettings()
{
	var mapSettings = new Object();


    mapSettings.toJSON =  function()
	{
		var details = new Object();

		details.center_lon = map.getCenter().lon;
		details.center_lat = map.getCenter().lat;
		details.zoom = map.getZoom();

		return details;

	}

	var map_settings =  JSON.stringify(mapSettings);
	var map_filters = JSON.stringify(getFilters());

	set_cookie("map_settings" ,  map_settings  );
	set_cookie("map_filters" ,  map_filters  );


	return true;
}
function JOSMSubmit()
{
	var form = $('josm_yes');
	form.target = "hiddenIframe";
	form.submit();
	
	//check if do not show is checked
	if( jQuery('#do_not_show_JOSMmsg').attr('checked'))
	{
		setTimeout ( "JOSMDescriptionHideEvent()", 1000 );
	}

	return false;
}

//window.onload = init;
//Event.onReady(select_init);
jQuery(function () {
	select_init();
});

