function GB_init(_debug)
{
	var debug = _debug;
	var namespace = 'GB';
	
	function got(f)
	{
		try {
			eval(f);
			return true;
		}
		catch(err)
		{
			if ( debug )
			{
				GB.console(f + '() not found', 'warn');
			}
			
			return false;
		}
	}
	
	function lazy(f, script)
	{
		try {
			typeof(eval(f));
			return true;
		}
		catch(err)
		{
			// GB.log(script);
	        $.getScript(script, function()
			{
            	return true;
			});
			
			return false;
		}
	}
	
	if ( ! got('$') )
	{
		var error_msg = 'jQuery needed for GB';
		throw error_msg;
	}
	
	// public methods
	var GB = {
		
		// wrapper for the firebug console
		console : function (what, msg_type, lia)
		{
			if (debug)
			{
				if (typeof(what) != 'undefined')
				{
					try {
						if (typeof(GB) != 'undefined')
						{
							what = namespace + ': ' + what;
						}
						
						if (typeof(msg_type) != 'undefined')
						{
							if (typeof(msg_type) == 'object')
							{
								GB.log(what+' (%o)', msg_type);
							}
							eval("console."+msg_type+"(what)");
						}
						else
						{console.debug(what);}
					}
					catch(err) {}}
			}
		},
		
		// wrapper for GB.log
		log : function (what)
		{
			if ( ! debug )
			{return;}
			
			try 
			{console.log(what);}
			catch(err) {}},
	
		// Externe Links mit Funktion versehen
		external_links : function ()
		{
			
			o = $("a[rel=external]");
			o_length = o.length;
			if (o_length > 0)
			{
				// GB.log("Anzahl a[rel=external]: "+o_length, o);
				
				o.each(function()
				{
					var $this = $(this);
							
					$(this).unbind('click');
					
					if (typeof($("base").attr("href")) != "undefined")
					{
				  		_base = $("base").attr("href");
					}
					else {
						_base = "";
					}
					
					$(this).attr('target', '_blank');
			
					if ($(this).attr('class') == 'pdf')
					{
						$(this).attr('title',"PDF-Dokument öffnet in neuem Fenster").addClass('external_links');
					}
					else
					{
						additional_txt = "[öffnet in neuem Fenster]";

						if ($(this).attr('title') !== '') {
							$(this).attr('title', $(this).attr('title')+" "+additional_txt);
						}
						else {
							if ($(this).attr('href').indexOf('http://') == -1) {
					   			$(this).attr('title', _base + $(this).attr('href') + " " + additional_txt).addClass('external');
					   		}
							else {
								$(this).attr('title', $(this).attr('href') + " " +additional_txt).addClass('external');
							}
						}				
					}
					$(this).attr('rel', '');
				});
			}
		},
	
		/* -----------------------------------------------------------------------------
		   scrollable...
		*/
		init_scrollables: function()
		{
			GB.log('init_scrollables');
			if ( ! got('$.tools') )
			{
				return false;
			}
			
			// var page_has_index_gallery = (
			// 	$("#references_preview_wrapper .scrollable").length &&
			// 	$("#references_preview > li").length > 1
			// );
			// var page_has_work_detail_gallery = (
			// 	$("#references_preview_wrapper.arbeiten_detail .item_first dt").length &&
			// 	$("#references_preview_wrapper.arbeiten_detail .item_first span > span").length > 1
			// );
			// var page_has_normal_gallery = (
			// 	$(".gallery_wrapper").find('.browse') &&
			// 	$(".gallery_wrapper > dl > dt span > span").length > 1
			// );
			
			var galleries = {
				// ...on index page
				index_gallery : {
					scrollable_wrapper	: $("#references_preview_wrapper .scrollable"),
					scrollable_items  	: $("#references_preview > li")
				},

				// ...on work detail page
				work_detail_gallery : {
					scrollable_wrapper	: $("#references_preview_wrapper.arbeiten_detail .item_first dt"),
					scrollable_items  	: $("#references_preview_wrapper.arbeiten_detail .item_first span > span")
				},
				
				// ...or pages with normal galleries
				normal_gallery : {
					scrollable_wrapper	: $(".gallery_wrapper > dl > dt"),
					scrollable_items  	: $(".gallery_wrapper > dl > dt span > span")
				}
			};
			GB.log(galleries);
			
			$.each(galleries, function(index, gallery)
			{
				GB.log(gallery);
				
				if (
					gallery.scrollable_wrapper.length &&
					gallery.scrollable_items.length > 1
				)
				{
					GB.log(gallery.scrollable_wrapper);
					GB.log(gallery.scrollable_items);
					var browse_links = $('#content').find('.browse');
					GB.log(browse_links);

					browse_links.show();
					gallery.scrollable_wrapper.scrollable(
					{
						getNaviButtons: function(event)
						{
							event.preventDefault();
							// console.dir(event);
						}

					}).navigator({});

					// add counter (e.g. "1/4")
					var api = gallery.scrollable_wrapper.data("scrollable");
					// GB.log(api);
					var items_count = api.getItems().length;
					GB.log(items_count);

					var span = '<span class="items_count"><span>/</span>' + items_count + '</span>';

					$('#content .navi').parent().append(span);

					$('#content .navi > a').each(function(el)
					{
						$(this).html(
							$(this).attr('href').replace(/#/, '') * 1 + 1
						);
					});

					return true;
				}
			});
			
			return false;
		},
	
		/* -----------------------------------------------------------------------------
		*  navigation
		*  - second levels scroll down on click
		*  - third levels scroll down on click (only on the according category page)
		*/
		init_navi: function()
		{
			// $("#navi").tabs("#navi ul", {tabs: '#navi > li > a', effect: 'default', initialIndex: null});
			
			$('#navi > li > a').click(function()
			{
				var first_submenu_item = $(this).parent('li').find('ul > li > a:first');
				// GB.log(first_submenu_item);
				
				first_submenu_item.click();
				
				return false;
			});
		},
	
		/* -----------------------------------------------------------------------------
		*  Cufon
		*/		
		cufonize: function()
		{
			this.console('cufonize()', 'info');
			if ( ! got('Cufon') || $('body').is('.webfont-test') )
			{
				return false;
			}
			
			Cufon.replace('#wrapper #navi a', {
				hover: true
			});
			
			return true;
		},
		
		/* -----------------------------------------------------------------------------
		*  Google Maps
		*/		
		draw_google_maps: function()
		{
			this.console('draw_google_maps()', 'info');
			
			lazy('google.maps', 'http://maps.google.com/maps/api/js?sensor=false');
			
			// this.lazy('', 'jquery.google-maps.tooltip.js',
			// });
			
			// return;
			
			// Map options
			var latlng = new google.maps.LatLng(60.215084, 24.972961);
			var options = {
			zoom: 11,
				center: latlng,
				mapTypeId: google.maps.MapTypeId.ROADMAP,
				mapTypeControl: false,
				navigationControl: true,
				navigationControlOptions: {style: google.maps.NavigationControlStyle.SMALL} // ZOOM_PAN
			};

			// The Google map
			var map = new google.maps.Map(document.getElementById("map"), options);
		}
	};
	
	return GB;
}

var GB = GB_init(1);
	
$(function()
{
	GB.external_links();
	GB.init_scrollables();
	// GB.init_navi();
	// GB.cufonize();
	
	if ( $('#map'.length) )
	{
		// GB.draw_google_maps();
	}
});
