jQuery.fn._height = jQuery.fn.height;
jQuery.fn._width  = jQuery.fn.width;
jQuery.fn.height = function() {
if ( this.get(0) == window )
return self.innerHeight ||
jQuery.boxModel && document.documentElement.clientHeight ||
document.body.clientHeight;
if ( this.get(0) == document ) 
return Math.max( document.body.scrollHeight, document.body.offsetHeight );
return this._height(arguments[0]);
};
jQuery.fn.width = function() {
if ( this.get(0) == window )
return self.innerWidth ||
jQuery.boxModel && document.documentElement.clientWidth ||
document.body.clientWidth;
if ( this.get(0) == document )
return Math.max( document.body.scrollWidth, document.body.offsetWidth );
return this._width(arguments[0]);
};
jQuery.fn.innerHeight = function() {
return this.get(0) == window || this.get(0) == document ?
this.height() :
this.get(0).offsetHeight - (parseInt(this.css("borderTopWidth")) || 0) - (parseInt(this.css("borderBottomWidth")) || 0);
};
jQuery.fn.innerWidth = function() {
return this.get(0) == window || this.get(0) == document ?
this.width() :
this.get(0).offsetWidth - (parseInt(this.css("borderLeftWidth")) || 0) - (parseInt(this.css("borderRightWidth")) || 0);
};
jQuery.fn.outerHeight = function() {
return this.get(0) == window || this.get(0) == document ?
this.height() :
this.get(0).offsetHeight;	
};
jQuery.fn.outerWidth = function() {
return this.get(0) == window || this.get(0) == document ?
this.width() :
this.get(0).offsetWidth;
};
jQuery.fn.scrollLeft = function() {
if ( this.get(0) == window || this.get(0) == document )
return self.pageXOffset ||
jQuery.boxModel && document.documentElement.scrollLeft ||
document.body.scrollLeft;
return this.get(0).scrollLeft;
};
jQuery.fn.scrollTop = function() {
if ( this.get(0) == window || this.get(0) == document )
return self.pageYOffset ||
jQuery.boxModel && document.documentElement.scrollTop ||
document.body.scrollTop;
return this.get(0).scrollTop;
};
jQuery.fn.offset = function(options, returnObject) {
var x = 0, y = 0, elem = this[0], parent = this[0], sl = 0, st = 0, options = jQuery.extend({ margin: true, border: true, padding: false, scroll: true }, options || {});
do {
x += parent.offsetLeft || 0;
y += parent.offsetTop  || 0;
if (jQuery.browser.mozilla || jQuery.browser.msie) {
var bt = parseInt(jQuery.css(parent, 'borderTopWidth')) || 0;
var bl = parseInt(jQuery.css(parent, 'borderLeftWidth')) || 0;
x += bl;
y += bt;
if (jQuery.browser.mozilla && jQuery.css(parent, 'overflow') != 'visible' && parent != elem) {
x += bl;
y += bt;
}
}
var op = parent.offsetParent;
if (op && (op.tagName == 'BODY' || op.tagName == 'HTML')) {
if ((jQuery.browser.safari || jQuery.browser.msie) && jQuery.css(parent, 'position') != 'absolute') {
x += parseInt(jQuery.css(op, 'marginLeft')) || 0;
y += parseInt(jQuery.css(op, 'marginTop'))  || 0;
}
break;
}
if (options.scroll) {
var op = parent.offsetParent;
do {
sl += parent.scrollLeft || 0;
st += parent.scrollTop  || 0;
parent = parent.parentNode;
} while (parent != op);
} else {
parent = parent.offsetParent;
}
} while (parent);

if ( !options.margin) {
x -= parseInt(jQuery.css(elem, 'marginLeft')) || 0;
y -= parseInt(jQuery.css(elem, 'marginTop'))  || 0;
}
if ( options.border && (jQuery.browser.safari || jQuery.browser.opera) ) {
x += parseInt(jQuery.css(elem, 'borderLeftWidth')) || 0;
y += parseInt(jQuery.css(elem, 'borderTopWidth'))  || 0;
} else if ( !options.border && !(jQuery.browser.safari || jQuery.browser.opera) ) {
x -= parseInt(jQuery.css(elem, 'borderLeftWidth')) || 0;
y -= parseInt(jQuery.css(elem, 'borderTopWidth'))  || 0;
}
if ( options.padding ) {
x += parseInt(jQuery.css(elem, 'paddingLeft')) || 0;
y += parseInt(jQuery.css(elem, 'paddingTop'))  || 0;
}
var returnValue = options.scroll ? { top: y - st, left: x - sl, scrollTop:  st, scrollLeft: sl }
: { top: y, left: x };
if (returnObject) { jQuery.extend(returnObject, returnValue); return this; }
else  { return returnValue; }
};
jQuery.fn.jScrollPane = function(settings){
settings = jQuery.extend({scrollbarWidth : 10,scrollbarMargin : 5,wheelSpeed : 18,showArrows : false,arrowSize : undefined}, settings);
return this.each(
function()	{
var $this = jQuery(this);
if (jQuery(this).parent().is('.jScrollPaneContainer')) {
var $c = jQuery(this).parent();
var paneWidth = $c.innerWidth();
var paneHeight = $c.outerHeight();
var trackHeight = paneHeight;
if ($c.unmousewheel) {
$c.unmousewheel();}
jQuery('>.jScrollPaneTrack', $c).remove();
$this.css({'top':0});
} else {
this.originalPadding = $this.css('paddingTop') + ' ' + $this.css('paddingRight') + ' ' + $this.css('paddingBottom') + ' ' + $this.css('paddingLeft');
this.originalSidePaddingTotal = (parseInt($this.css('paddingLeft')) || 0) + (parseInt($this.css('paddingRight')) || 0);
var paneWidth = $this.innerWidth();
var paneHeight = $this.innerHeight();
var trackHeight = paneHeight;
$this.wrap(
jQuery('<div>').attr(
{'className':'jScrollPaneContainer'}
).css({'height':paneHeight+'px', 'width':paneWidth+'px'}));}
var p = this.originalSidePaddingTotal;
$this.css({'height':'auto','width':paneWidth - settings.scrollbarWidth - settings.scrollbarMargin - p + 'px','paddingRight':settings.scrollbarMargin + 'px'});
var contentHeight = $this.outerHeight();
var percentInView = paneHeight / contentHeight;
if (percentInView < .98) {
var $container = $this.parent();
$container.append(
jQuery('<div>').attr({'className':'jScrollPaneTrack'}).css({'width':settings.scrollbarWidth+'px'}).append(
jQuery('<div>').attr({'className':'jScrollPaneDrag'}).css({'width':settings.scrollbarWidth+'px'}).append(
jQuery('<div>').attr({'className':'jScrollPaneDragTop'}).css({'width':settings.scrollbarWidth+'px'}),
jQuery('<div>').attr({'className':'jScrollPaneDragBottom'}).css({'width':settings.scrollbarWidth+'px'})
)
)
);
var $track = jQuery('>.jScrollPaneTrack', $container);
var $drag = jQuery('>.jScrollPaneTrack .jScrollPaneDrag', $container);
if (settings.showArrows) {
var currentArrowButton;
var currentArrowDirection;
var currentArrowInterval;
var currentArrowInc;
var whileArrowButtonDown = function(){
if (currentArrowInc > 4 || currentArrowInc%4==0) {
positionDrag(dragPosition + currentArrowDirection * mouseWheelMultiplier);}
currentArrowInc ++;
};
var onArrowMouseUp = function(event){
jQuery('body').unbind('mouseup', onArrowMouseUp);
currentArrowButton.removeClass('jScrollActiveArrowButton');
clearInterval(currentArrowInterval);};
var onArrowMouseDown = function() {
jQuery('body').bind('mouseup', onArrowMouseUp);
currentArrowButton.addClass('jScrollActiveArrowButton');
currentArrowInc = 0;
whileArrowButtonDown();
currentArrowInterval = setInterval(whileArrowButtonDown, 100);};
$container
.append(jQuery('<a>').attr({'href':'javascript:;', 'className':'jScrollArrowUp'}).css({'width':settings.scrollbarWidth+'px'}).html('Scroll up').bind('mousedown', function(){
currentArrowButton = $(this);
currentArrowDirection = -1;
onArrowMouseDown();
this.blur();
return false;
}),
jQuery('<a>').attr({'href':'javascript:;', 'className':'jScrollArrowDown'}).css({'width':settings.scrollbarWidth+'px'}).html('Scroll down').bind('mousedown', function(){
currentArrowButton = $(this);
currentArrowDirection = 1;
onArrowMouseDown();
this.blur();
return false;
})
);
if (settings.arrowSize) {
trackHeight = paneHeight - settings.arrowSize - settings.arrowSize;
$track
.css({'height': trackHeight+'px', top:settings.arrowSize+'px'})
} else {
var topArrowHeight = jQuery('>.jScrollArrowUp', $container).height();
trackHeight = paneHeight - topArrowHeight - jQuery('>.jScrollArrowDown', $container).height();
$track
.css({'height': trackHeight+'px', top:topArrowHeight+'px'})}}
var $pane = jQuery(this).css({'position':'absolute', 'overflow':'visible'});
var currentOffset;
var maxY;
var mouseWheelMultiplier;
var dragPosition = 0;
var dragMiddle = percentInView*paneHeight/2;
var getPos = function (event, c) {
var p = c == 'X' ? 'Left' : 'Top';
return event['page' + c] || (event['client' + c] + (document.documentElement['scroll' + p] || document.body['scroll' + p])) || 0;};
var ignoreNativeDrag = function() {	return false; };
var initDrag = function()	{
currentOffset = $drag.offset(false);
currentOffset.top -= dragPosition;
maxY = trackHeight - $drag[0].offsetHeight;
mouseWheelMultiplier = 2 * settings.wheelSpeed * maxY / contentHeight;
};
var onStartDrag = function(event)	{
initDrag();
dragMiddle = getPos(event, 'Y') - dragPosition - currentOffset.top;
jQuery('body').bind('mouseup', onStopDrag).bind('mousemove', updateScroll);
if (jQuery.browser.msie) {
jQuery('body').bind('dragstart', ignoreNativeDrag).bind('selectstart', ignoreNativeDrag);}
return false;
};
var onStopDrag = function(){
jQuery('body').unbind('mouseup', onStopDrag).unbind('mousemove', updateScroll);
dragMiddle = percentInView*paneHeight/2;
if (jQuery.browser.msie) {
jQuery('body').unbind('dragstart', ignoreNativeDrag).unbind('selectstart', ignoreNativeDrag);}};
var positionDrag = function(destY){
destY = destY < 0 ? 0 : (destY > maxY ? maxY : destY);
dragPosition = destY;
$drag.css({'top':destY+'px'});
var p = destY / maxY;
$pane.css({'top':((paneHeight-contentHeight)*p) + 'px'});};
var updateScroll = function(e){
positionDrag(getPos(e, 'Y') - currentOffset.top - dragMiddle);
};
$drag.css({'height':(percentInView*paneHeight)+'px'}).bind('mousedown', onStartDrag);
var trackScrollInterval;
var trackScrollInc;
var trackScrollMousePos;
var doTrackScroll = function(){
if (trackScrollInc > 8 || trackScrollInc%4==0) {
positionDrag((dragPosition - ((dragPosition - trackScrollMousePos) / 2)));}
trackScrollInc ++;
};
var onStopTrackClick = function(){
clearInterval(trackScrollInterval);
jQuery('body').unbind('mouseup', onStopTrackClick).unbind('mousemove', onTrackMouseMove);};
var onTrackMouseMove = function(event){
trackScrollMousePos = getPos(event, 'Y') - currentOffset.top - dragMiddle;};
var onTrackClick = function(event){
initDrag();
onTrackMouseMove(event);
trackScrollInc = 0;
trackScrollInterval = setInterval(doTrackScroll, 100);
jQuery('body').bind('mouseup', onStopTrackClick).bind('mousemove', onTrackMouseMove);};
$track.bind('mousedown', onTrackClick);
if ($container.mousewheel) {
$container.mousewheel(
function (event, delta) {
initDrag();
var d = dragPosition;
positionDrag(dragPosition - delta * mouseWheelMultiplier);
var dragOccured = d != dragPosition;
if (!dragOccured) {
var $p = $(this).parent();
if ($p.length == 0) {
return true;
}
var p = $p[0];
var r = p != document;
while (r) {
if (p._mwHandlers) {
r = p._mwHandlers[0](event, delta);
}
p = $(p).parent()[0];
if (p == document) {
break;
}
}
} else {
if (event.preventDefault) {
event.preventDefault();
} else {
event.returnValue = false;
}
return false;
}
return true;
},
false
);					
}
initDrag();
} else {
$this.css({'height':paneHeight+'px','width':paneWidth-this.originalSidePaddingTotal+'px','padding':this.originalPadding});
}
}
)
}
jQuery.fn.gmaps = function(settings){
	return this.each(function(){
		new jQuery.gmaps(this, settings);
	});
}
jQuery.gmaps = function(obj, settings){
	var map = false;
	var gitems = new Array();
	var gp,sel,ltext,ostanesh,activetab;
	var pointz = new Array();
	var tabz = new Array();
	
	req = document.location.href;
	ostanesh='news';
	activetab=0;
	if (req.indexOf('4to7') != -1) gp = '4to7';
	else if (req.indexOf('8to10') != -1) gp = '8to10';
	else if (req.indexOf('11to13') != -1) gp = '11to13';
	else gp = '14to17';
	
	settings = jQuery.extend({
		data: {locations:[]},
		infopanel: "none",
		maptype: G_HYBRID_MAP,
		center: [52.04415035295719, -0.7396888732910156],
		zoom: 14,
		relativepath: "http://www.campbell-park-youth.org.uk/"
	},settings);
	
	function handleTabClick(a,b){
		iw = $('#map-frame')[0].gmap.getInfoWindow();
		txt = $(b).html();
		if (txt.indexOf('news')!=-1) {
			c = 'news';
			ac = 0;
		} else if (txt.indexOf('events')!=-1) {
			c = 'events';
			ac = 1;
		} else {
			c = 'gallery';
			ac = 2;
		}
		ostanesh = c;
		activetab=ac;
		iw.selectTab(ac);
		getFilteredContent(gp,c,ac);
		return false;
	}			
	function getFilteredContent(gp,c,ac){
		$('#map-frame img[@src$=close.gif]').css('top', '16px')
		var iw = $('#map-frame')[0].gmap.getInfoWindow();
		var containers = iw.getContentContainers();
		$div = $('div.gcontent', containers[ac]);
		var plejs;
		$.each(sel, function(i,e) { if (typeof e == 'object' && e && e.title) plejs=e.title; });
		$('#location_list a.active').removeClass('active');
		$('#location_list a:contains('+plejs+')').addClass('active');
		if ($div.length  == 1) {
			$div.html('<strong>loading..</strong>');
			$.getJSON('/map.php', {group: gp, cat: c, place: plejs}, function(data){
				$div.empty();
				if (data.length==0) $div.html('nothing..');
				else 
					$.each(data, function(i,e){
						if (c=='events') $div.append('<h2><a href="http://'+document.location.hostname+e.data+'">'+e.title+"</a></h2><small>"+e.start_format+" - "+e.end_format+"</small><p>"+e.teaser+"</p>");
						else if (c=='gallery') {
							gal_link = '/gallery.php?gid='+e.nid+'&amp;KeepThis=true&amp;TB_iframe=true&amp;width=775&amp;height=505';
							$div.append('<h2><a class="thickbox" href="'+gal_link+'">'+e.title+'</a></h2><p><a class="thickbox" href="'+gal_link+'"><img width="75" height="75" src="'+e.thumbnail+'" alt="'+e.title+'" /></a>'+e.teaser+'</p><br clear="all" />');
							TB_init();
						} else $div.append('<h2><a href="http://'+document.location.hostname+e.data+'">'+e.title+"</a></h2><p>"+e.teaser+"</p>");	
					});
				$div.jScrollPane();
			});
		} else setTimeout(function(){getFilteredContent(gp,c,ac)}, 200);
	}
	
	if (GBrowserIsCompatible()) {	
	  var map = new GMap2(obj);
		map.addControl(new GLargeMapControl());
		map.addControl(new GMapTypeControl());
		//map.addControl(new GOverviewMapControl());
		var kml = new GGeoXml("http://www.campbell-park-youth.org.uk/campbell.kml");
		map.addOverlay(kml)
		
		if (typeof(settings.infopanel) != Boolean){
			GEvent.addListener(map, "moveend", function() {
				var center = map.getCenter();
				var zoom = map.getZoom();
				$(settings.infopanel).html(center.toString() + " zoom: " + zoom);
			});
		}
		
		map.setCenter(new GLatLng(settings.center[0],settings.center[1]), settings.zoom, settings.maptype);		
		
		ltext = '<div style="width:360px; height: 125px;"><div style="width: 350px; height: 125px; overflow: hidden;" class="gcontent"><strong>loading..</strong></div></div>';
			
		tabz[0] = new GInfoWindowTab('news',ltext, handleTabClick );
		tabz[1] = new GInfoWindowTab('events',ltext, handleTabClick );
		tabz[2] = new GInfoWindowTab('galleries',ltext, handleTabClick );
		
    function createMarker(point, number) {
			var icon = new GIcon();
			if (settings.data.locations[number].icon) {
				icon.image = (settings.data.locations[number].icon.indexOf("http:") < 0) ?	settings.relativepath + settings.data.locations[number].icon:settings.data.locations[number].icon;
				icon.iconSize = new GSize(18, 18);
				icon.iconAnchor = new GPoint(6, 18);
				icon.infoWindowAnchor = new GPoint(5, 1);
				var marker = new GMarker(point, icon);
			} else {
				var marker = new GMarker(point, {title: settings.data.locations[number].simpleContent});
			}
			
      GEvent.addListener(marker, "click", function() {
				var objekat;
				window.konj = this;
				$.each(this, function(i,e) { if (typeof e == 'object' && e && e.lng) { objekat=e; return false  } });
        $("#"+obj.id)[0].gmap.openInfoWindowTabsHtml(objekat, tabz);
				sel = this;
				getFilteredContent(gp,ostanesh,activetab);
      });
			
			gitems.push(marker);    
			return marker;
    }

		$.each(settings.data.locations,function(i,e){
			pointz[i]=new GLatLng(e.latitude,e.longitude);
			map.addOverlay(createMarker(pointz[i],i));
			$('#location_list').append('<a href="#">'+e.simpleContent+'</a><br />');
			$('#location_list a').each(function(i){
				this.num=i;
			});
			$('#location_list a').eq(i).click(function(){
				$("#"+obj.id)[0].gmap.openInfoWindowTabsHtml(pointz[this.num],tabz,{selectedTab: activetab});
				sel={D: {title: $(this).text()} };
				getFilteredContent(gp,ostanesh,activetab);
				return false;
			});
		});
		$(window).bind('unload', GUnload);
	}
	
	obj.gmap = map;
}

$(document).ready(function(){
	$.getJSON('/locations.php', function(data){
		var locations_data = {
			locations: []
		};
		$.each(data, function(index, element){
			locations_data.locations[index] = {
				simpleContent: element.name,
				maximizedContent: "locations.php",
				latitude: element.latitude,
				longitude: element.longitude
			};
		});
		$("#map-frame").gmaps({
			data: locations_data
		});
	});
});