
function urlencode_obj(d) { var s = ''; for (p in d) { s = s + encodeURIComponent(p) + "=" + d[encodeURIComponent(p)] + "&"; } return s; }


function newIcon($count)
{
    var FINDA_DEFAULT_ICON = new GIcon(G_DEFAULT_ICON, '/media/img/mapicons/marker.png');
    if(typeof($count) == 'undefined')
    {
        return FINDA_DEFAULT_ICON;
    }

    if($count>=20){ $count="20plus"; }

    var Icon = new GIcon(FINDA_DEFAULT_ICON, '/media/img/mapicons/marker' + $count + '.png');
    //Icon.image = ;

    return Icon
}

////////////////////////////////////////////////////

function EventTabManager($url, $renderer, $placeholder, $options)
{
    this._callback._this = this;
    this.renderer = $renderer;
    this._url = $url;
    this.placeholder = $placeholder;
    this.options = $options || {};

    this.options.summary = this.options.summary || false;
    this.options.resultcount = this.options.resultcount || false;
    this.options.populate_callback = this.options.populate_callback || false;
    this.options.related_news = this.options.related_news || false;
    this.options.view_type = this.options.view_type || false;
    this.options.geo = this.options.geo || false;
    this.options.distance = this.options.distance || 50;
}

EventTabManager.prototype._callback = {
    success: function(o){
        var mngr = this._this;
        var data = YAHOO.lang.JSON.parse(o.responseText);

	if (data.reset) {
	    tree.uncheckAll();
	}

        $("div[id=spin]").remove();
        $("#showEvents").removeAttr("disabled");
        // Check for errors here
        mngr.renderer.render(data.data);

        if (mngr.options.summary != false){$(mngr.options.summary).html(data.terms);}
        if (mngr.options.resultcount != false){

        	if (data.count == '0') {
        		$("p[id='taberror']").css('visibility', 'visible');
        		data.count = 'No'
        	} else {
                        $("p[id='taberror']").css('visibility', 'hidden');
        	}
        	$(mngr.options.resultcount).html(data.count);
        }

        if (mngr.options.populate_callback != false){ mngr.options.populate_callback(data.params); }
        if (mngr.options.related_news != false) { $(mngr.options.related_news).html(data.related_news_html); }
    },
    failure: function(o) {
           
	   $("div[id=spin]").remove();
	   $("#showEvents").removeAttr("disabled");
    },
    arguments:[]
}

EventTabManager.prototype.get_events = function($params)
{
	if (! $params) {
		$params = {};
	}

	if (this.options.view_type != 'undefined') { $params['view_type'] = this.options.view_type }
	if (this.options.geo != 'undefined' && this.options.geo != false) { $params['geo'] = this.options.geo }
	if (this.options.distance != 'undefined' && this.options.distance != false) { $params['distance'] = this.options.distance }

	$(this.placeholder).before("<div id=\"spin\" style=\"position:absolute;left:300px; top:130px; z-index:5000;\" ><div><img src=\"/media/images/loader.gif\" /></div></div>");
	var transaction = YAHOO.util.Connect.asyncRequest('GET', this._url + '?' + urlencode_obj($params), this._callback, null);
}

////////////////////////////////////////////////////

function EventDataMapRenderer($map, $coords, $zoom_level)
{
	var options = {
        clusterMarkerIconCallback:newIcon,
        coords:$coords,
        fitMapMaxZoom:16
    }

    this._map = $map;
    this._cluster = new ClusterMarker(this._map, options);
    this._cluster.intersectPadding = 2;
}

EventDataMapRenderer.prototype.render = function($data)
{
    this._cluster.removeMarkers();
    var marker;
    var node_data;
    var arrayOfMarkers = [];
    var latlongs = {};

    for (node in $data)
    {
        node_data = $data[node];
        if ( latlongs[node_data.venue_latitude + "," + node_data.venue_longitude] )
        {
            latlongs[node_data.venue_latitude + "," + node_data.venue_longitude].push(node_data);
        } else {
            latlongs[node_data.venue_latitude + "," + node_data.venue_longitude] = [node_data];
        }
    }

    for (i in latlongs)
    {
        arrayOfMarkers.push( this.newMarker(latlongs[i]) );
    }
    this._cluster.addMarkers(arrayOfMarkers);
    this._cluster.fitMapToMarkers();
    this._cluster.refresh();
}

EventDataMapRenderer.prototype.newMarker = function(node_list)
{
    _this = this;

    var node;
    var popup_str = '';
    var popup_element;
    var marker_title;

    if (node_list.length <= 1) {
	      node = node_list[0];
//        //popup_element.html("<h2><a href='javascript:RenderEventDetailBox("+node.id+");'>" + node.title + "</a></h2><p><strong>Where:</strong> " + node.venue_name + "</p><p><strong>When:</strong> " + node.next_occurrence + "</p>");
    } else {

      popup_element = $(document.createElement('div'));
      popup_element.css('overflow','auto');
      popup_element.css('height','100px');
	  popup_element.css('width', '400px');
	  popup_element.css('margin-top', '10px');
        for ( i in node_list )
        {
            node = node_list[i];
			popup_str = popup_str + "<div><h3><a href='javascript:RenderEventDetailBox("+node.id+");'>" + node.title + "</a></h3><p><strong>Where:</strong> " + node.venue_name + "</p><p><strong>When:</strong> " + node.next_occurrence + "</p></div>";
        }
		popup_element.html(popup_str);
        marker_title = node_list.length + " Events";
    }

    var marker = new GMarker(new GLatLng(parseFloat(node.venue_latitude), parseFloat(node.venue_longitude)), {icon:newIcon(),title:marker_title});

 	GEvent.addListener(marker, 'click', function(){
		if (popup_element) {
	    	marker.openInfoWindow(popup_element.get(0));
    	    if(node_list.length <= 1){RenderEventDetailBox(node.id);}
    	} else {
    		RenderEventDetailBox(node.id);
    	}
    });
    return marker;
}

////////////////////////////////////////////////////

function EventDataListRenderer(div)
{
    this._div = div;
    this._$div = $(div);

    this._template = this._$div.children().eq(0).clone(true);
    this._$div.empty();
}

EventDataListRenderer.prototype.render = function($data)
{
    var node;
    this._$div.empty();

    function ClickHandler() { RenderEventDetailBox( $(this).attr('event_id') ); }

	if ($data == '') {
		$('#listViewError').css('visibility','visible');
	} else {
		$('#listViewError').css('visibility','hidden');
	}

    for ( i in $data )
    {
        node = $data[i];
        domelement = this._template.clone(true);
        domelement.children('.eventSumLink').attr('event_id', node.id).click(ClickHandler);;
        domelement.children('.thumbnail').attr('src', node.image).attr('event_id', node.id).click(ClickHandler);;
        domelement.children('.eventTitle').html(node.title).attr('event_id', node.id).click(ClickHandler);;
        domelement.children('.where-event').html('Where: '+node.venue_name+'');
	domelement.children('.when-event').html( 'When: '+node.next_occurrence +'.');
        domelement.show();
        this._$div.append(domelement);
    }
}

////////////////////////////////////////////////////

function RenderEventDetailBox(event_id)
{
    var detail_div = $('#featureEventsExpand');
    detail_div.slideUp('fast');
    var callback = {
        success: function(o)
        {
            var data = YAHOO.lang.JSON.parse(o.responseText);
            detail_div.html(data.html);
            detail_div.slideDown('fast');
        },
        failure: function(o) {
            alert("Apologies, An error has occurred. Staff have been notified and we hope to fix this problem soon.");
        },
        arguments:[]
    };

    var url = '/events/json/eventdetail/?event_id=' +event_id ;
    var transaction = YAHOO.util.Connect.asyncRequest('GET', url, callback, null);
}
