var _gaq = _gaq || [];
var _ga = _ga || {};

$(document).ready(function(){
	$('a.route').click(UIE.routeDescription);
	$('div.dropdown').each(UIE.dropdown);
	UIE.tipRotator();
	initEventTracking();
});


function initEventTracking() {
	
	var BASE_URL = document.location.protocol + '//' +  document.location.host + '/';
	$(document).on('click','a',function(){
		var baseLength = BASE_URL.length;
		if(this.className == 'twitter icon') {
			_gaq.push(['_trackSocial', 'twitter', 'share',UIE.util.getCanonical()]);
		} else if(this.className == 'linkedin icon') {
			_gaq.push(['_trackSocial', 'linkedin', 'share',UIE.util.getCanonical()]);
		} else if(this.href.substr(0,baseLength) != BASE_URL) {
			UIE.tracknow('Outbound link',this.href);
			setTimeout('document.location = "' + this.href + '"', 100);
			return false;	
		}
	});
	
	//newsletter subscription	
	$('.subscribe form').submit(function(e){
		var form = this;
  		e.preventDefault(); // disable the default submit action
		UIE.tracknow('newsletter','subscribe',$('input[name=email]',this).val());

		$(':input', this).attr('disabled', true);
		setTimeout(function() {
			form.submit();
		}, 100);
	});

	//newsletter unsubscribe
	$('.unsubscribe form').submit(function(){
		var form = this;
  		e.preventDefault(); // disable the default submit action
		UIE.tracknow('newsletter','unsubscribe',$('input[name=email]',this).val());

		$(':input', this).attr('disabled', true);
		setTimeout(function() {
			form.submit();
		}, 100);
	});
	
	//track scrolling on page
	var is50p;
	$(window).on('scroll',function(){
		var bottom = $(window).height() + $(window).scrollTop();
		var height = $(document).height();
		var p = 100*bottom/height;
		if(p > 50) {
			if(!is50p) {
				is50p = 1;
				UIE.trackev('Content Engagement','scrolled 50%',document.location.pathname);
			}
			if(p > 90) {
				$(window).off('scroll');
				UIE.trackev('Content Engagement','scrolled 90%',document.location.pathname);
			}
		}
	}); 
}

var UIE = new function() {

	this.API_URL = '';
	this.API_LANG = '';
	var _rqId = 10;
	this.loadFromApi = function(method,params,callback) {
		if(!params.lang) {
			params.lang = UIE.API_LANG
		}
		var rqid = _rqId++;
		var rq = {
			REQUEST: JSON.stringify({
				'method' : method,
				'params' : [params],
				'id'     : rqid
			})
		};
		
		$.ajax({
			url: UIE.API_URL,
			dataType: 'json',
			data: rq,
 			 success: function(rsp) {
				if(rsp.id != rqid) {
					alert('Error: Unexpected response id');
				} else if(rsp.error) {
					alert('Error: '+rsp.error);
				} else if(typeof callback == 'function') {
					callback.call(rq,rsp.result); 
				}
			}
		});
	}
	
	
	this.tracknow = function(category,action,label) {
		if(_gat && typeof _gat._getTrackerByName == 'function') {
			_gat._getTrackerByName()._trackEvent(category,action,label);
		}
	}
	
	this.trackev = function(category,action,label) {
		_gaq.push(['_trackEvent', category,action,label]);
	}

	this.dropdown = function(){
		$div = $(this).click(function(){
			$(this).toggleClass('open');
		});
		if($div.hasClass('linkselect')) {
			var text = $('a.current',$div).text();
			if(text) {
				$str = $('strong',$div);
				$new = $('<strong>'+text+'</strong>').insertAfter($str).css('width',$str.width()+'px');
				$str.css('width',$str.width()+'px').addClass('base');
				$new.addClass('selected');
								
			}
		}
	}	
	
	this.calendarBrowse = function($calendar) {
		var _load = function(month) {
		 	var dt = month.split('-')
			var params = {
				'year' 		: dt[0],
				'month'		: dt[1],
				'period'	: $calendar.data('period')
			}
			$calendar.fadeTo(200,0.3);
			UIE.loadFromApi('getCalendar',params,function(result){
				$calendar.replaceWith(result.calendar);
			});
		}
		$calendar.prepend(
			$('<span class="prev" />').click(function(){
				_load($calendar.data('prev'));
			})
		).prepend(
			$('<span class="next" />').click(function(){
				_load($calendar.data('next'));
			})
		);
	}

	this.tipRotator = function() {
		$ol = $('aside.tips ol');
		$li = $('li',$ol);
		
	 	var num = $li.size()
		if(num > 1) {
			var moving = false;
			var cur = 0;
			$ol.css({
				position	: 'relative',
				overflow	: 'hidden',
				height		: '140px' 
			});
			$li.css({
				'position' 	: 'absolute',
				'top'		: '0',
				'left'		: '0',
				'zIndex'	: 5,
				'width'		: '634px'
			}).eq(cur).css('zIndex',6);
			
			var move = function(n,dir) {
				$li.eq(n).css({
					'left' : dir,
					'zIndex' : '7'
				}).animate({
					'left' : 0
				}, function(){ 
					$li.eq(cur).css('zIndex',5).removeClass('cur');
					$li.eq(n).css('zIndex',6).addClass('cur');
					cur = n;
					moving = false;
				});
			}
			
			var next = function() {
				if(moving) { return; }
				moving = true;
				var n = (cur+1) % num;
				move(n,'465px');
			}
			var prev = function() {
				if(moving) { return; }
				moving = true;
				var n = (cur+num-1) % num;
				move(n,'-465px');
			}
			$ol = $('aside.tips header').append(
				$('<div class="prevnext" />').append(
					$('<span class="prev">'+LANG.PREV+'</span>').click(prev)
				).append(
					'|'
				).append(
					$('<span class="next">'+LANG.NEXT+'</span>').click(next)
				)
			);
		}
	}
	
	this.programAccordion = function () {
		var $ol = $('section.program ol');
		var $head = $('article', $ol);
		if($head.size() <= 1) return;

		$head.addClass('js').click(function(){
			if(!$(this).hasClass('visible')) {
				$('.ct',$ol).css({
					'height'	: 0,
					'padding'	: '0 50px 0 0',
					'overflow'	: 'hidden'
				});	
				$('.visible',$ol).removeClass('visible');
				$(this).addClass('visible').children('.ct').css({
					'height' : 'auto',
					'padding'	: '9px 50px 18px 0'
				});
				$(this).closest('li').addClass('visible')
			}
		});
		$head.eq(0).click();
	}
	
	
	this.routeDescription = function () {
		var title = $(this).attr('title');
		var base = $(this).attr('href');
	
		//button handlers
		var redirectToMaps = function() {
			var city = $('input.city',$html).val();
			var dirflag = $('input[name=routetype]:checked').val();
			UIE.trackev('Route', 'Stad',city.toLowerCase());
			window.location = base +
						'&saddr=' +encodeURIComponent($('input.address',$html).val())+','
						+ encodeURIComponent(city)
						+'&dirflg='+dirflag;
		}

		$html = $('<div class="routedescription">\
					<p>'+LANG.ROUTE_INTRO+'</p>\
					<form>\
					<ul class="struct">\
					 <li>\
					  <label>'+LANG.ROUTE_ADDRESS+'</label>\
					  <input type="text" class="text address"></label>\
					 <li>\
					   <label>'+LANG.ROUTE_CITY+'</label>\
					   <input type="text" class="text city">\
					 <li>\
					   <label>&nbsp;</label>\
					   <label class="inline"><input type="radio" checked="checked" name="routetype" value="w">'+LANG.ROUTE_WALK+'</label>\
					   <label class="inline"><input type="radio" name="routetype" value="">'+LANG.ROUTE_CAR+'</label>\
					   <label class="inline"><input type="radio" name="routetype" value="r">'+LANG.ROUTE_PUB_TRANS+'</label>\
					</ul>\
				   </div>'
				).append(
				   $('<div class="buttonbar" />').append(
						$('<a class="btn">'+LANG.ROUTE_SHOW+'</a>').click(redirectToMaps)
					).append(
						$('<a class="btn">'+LANG.CANCEL+'</a>').click(UIE.closeModal)
					)
				);

		//display dialog
		UIE.showModal(title,$html);

		//prevent link default
		return false;
	}


	/**
	 * Modal dialogs!
	 */
	var _modals = [];
	this.showModal = function(title, content) {
		$node = $('<div class="modal"><div class="window"><div class="header"><h1>' 
					+ title + '</h1><span class="close" /></div> <div class="content" /></div>');
		$('span.close',$node).click(UIE.closeModal);

		$window = $('.window',$node);
		$('.header h1',$window).mousedown(function(e){
			
			var i = 0;

			window.onmouseup = function(){
				window.onmousemove = null;
				window.onmouseup = null;
			}
			var offset = $window.position();
			var offX = e.pageX - offset.left;
			var offY = e.pageY - offset.top;
			

			window.onmousemove = function(ev){
				if(!ev) { ev = window.event; }
				mx = Math.min(Math.max(-500,ev.pageX - offX), $node.width()-100);
				my = Math.min(Math.max(-100,ev.pageY - offY), $node.height()-100);
				$window.css({
					left: mx + 'px',
					top: my +'px'
				});
			}
			return false;
		}); 

		$node.appendTo('body');
		$('.content',$node).html(content);
		
		_modals.push($node);
		
		var wwidth  =  $node.width();
		var wheight =  $node.height();
		if($window.height() > wheight) {
			$('.content',$window).css({
				'overflow'	: 'auto',
				'height'	: (wheight-100)+'px'	
			});
		}
		var x = (wwidth - $window.width())/2;
		var y = (wheight - $window.height())/2;
		$window.css({
			'left'	: x +'px',
			'top'	: y +'px'
		});
	}
	this.closeModal = function() {
		if(_modals.length) {
			var m = _modals.pop();
			m.remove();
		}
	}
	
	
	
	
	this.twitterFeed = function($node,str,num) {
		if(!num || num < 1) { num = 5; }
		
		var urlrgx = /(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig;
		var namergx = /@{1}([a-z0-9_-]+)/ig;
		var hashrgx = /#{1}([a-z0-9_-]+)/ig;
	
		var type = str.charAt(0);
		var q,link;
		switch(type) {
			case '@' :
					q = 'from:'+str.substring(1);
					link = str.replace(namergx,"<a href='http://twitter.com/$1' target='_blank'>@$1</a>");
				break;
			case '#' :
					q = str;
					link = str.replace(hashrgx, "<a href='http://search.twitter.com/search?q=$1' target='_blank'>#$1</a>");
				break;
			//we only support # and @ searches...
			default:
				return;	
		}
		
		$node.append('<h3 class="main">Twitter <span class="type">'+link+'</span></h2><div class="tweetwrap"></div>');
		$target = $('<div class="tweets loading" />').appendTo('.tweetwrap',$node);
		
		
		var tweets = [];
		var margin = 0;
		
		var appendTweet = function(tweet) {
			var srcDate = new Date(tweet.created_at);
			$('\
			<div class="tweet">\
			 <img src="' + tweet.profile_image_url + '" width="48" alt="' + tweet.from_user + '" title="' + tweet.from_user + '">\
			  <span class="tw-user"><a href="http://twitter.com/'+tweet.from_user+'" target="_blank">'+tweet.from_user+'</a></span>\
			 ' +
				tweet.text.replace(urlrgx,"<a href='$1' target='_blank'>$1</a>")
				.replace(namergx,"<a href='http://twitter.com/$1' target='_blank'>@$1</a>")
				.replace(hashrgx, "<a href='http://search.twitter.com/search?q=$1' target='_blank'>#$1</a>") + '\
			<span class="tw-date">'+srcDate.toLocaleDateString()+' '+srcDate.getHours()+':'+srcDate.getMinutes()+'</span>\
			</div>').appendTo($target);
		}
			
		var url = 'http://search.twitter.com/search.json?' + [
			'q='+escape(q),
			'rpp='+num,
			'callback=?'
		].join('&');
		
		$.getJSON(url,function(data){
			$target.removeClass('loading');
			var tweets = data.results;
			if(tweets.length) {
				for(i=0; i<tweets.length; ++i) {
					appendTweet(tweets[i]);
				}
				$target.addClass('loaded');
			}
		});
	}


	this.gallery = function ($node) {
		var cur = 0;
		var block = false;
		$node.css('overflow','hidden');
		$images = $('img',$node).css({
			position: 'absolute',
			top:	  '0',
			left:	  '0',
			zIndex:	  '2',
		});
		var n = $images.length;
		$images.eq(0).css('zIndex',3);
		
		var showNext = function() {
			if(!block) {
				block = true;
				var toShow = (cur + 1)%n;
				$images.eq(toShow).css({
					left: '395px',
					zIndex: 4
				}).animate({'left': 0},200,function(){
					$images.eq(cur).css({zIndex: 2});
					cur = toShow
					$images.eq(cur).css({zIndex: 3});
					block = false;
				});
			}
		}
		var showPrev = function() {
			if(!block) {
				block = true;
				var toShow = (n + cur - 1)%n;
				$images.eq(toShow).css({
					left: '-395px',
					zIndex: 4
				}).animate({'left': 0},200,function(){
					$images.eq(cur).css({zIndex: 2});
					cur = toShow
					$images.eq(cur).css({zIndex: 3});
					block = false;
				});
			}
		}
		
		$('<span class="prev" />').click(showPrev).insertBefore($images.eq(0));
		$('<span class="next" />').click(showNext).insertBefore($images.eq(0));

	}



	this.initPointerMap = function(node,pointers) {
		UIE.maps.enabled(function(){
			var info = UIE.util.getPointerInfo(pointers);

			var $p = $(node).parent();
			var makeBig = function() {
				if(!$p.hasClass('bigmap')) {
					$p.addClass('bigmap');
					google.maps.event.trigger(map, 'resize')
					map.setCenter(info.center);
				}
			}
			var makeSmall = function() {
				if($p.hasClass('bigmap')) {
					$p.removeClass('bigmap');
					google.maps.event.trigger(map, 'resize')
					map.setCenter(info.center);
				}
			}
			if(!$p.hasClass('big')) {
				$('<span class="enlarge">'+LANG.ENLARGE_MAP+'</span>').click(makeBig).appendTo($p);
				$('<span class="shrink">'+LANG.SHRINK_MAP+'</span>').click(makeSmall).appendTo($p);
			}
			

        	var map = new google.maps.Map(node,{
          		zoom: info.zoom,
          		center: info.center,
          		mapTypeId: google.maps.MapTypeId.ROADMAP,
          		disableDefaultUI: true
        	});
        	
			var infobox;
			var showInfoBox = function(m) {
				makeBig();
				var options = {
					map: map,
					latlng: m.postion,
					content: m.title
				}
				infobox = new google.maps.InfoWindow(options);
				infobox.open(map,m);
			}
			
			var createMarker = function(p,box) {
				var m = new google.maps.Marker({
					clickable : true,
					position	: new google.maps.LatLng(p.lat,p.lng),
					title		: p.title
				});
				if(box) {
					google.maps.event.addListener(m, 'click',function() {
						showInfoBox(m);
    				});
    			}
				m.setMap(map);
			}

        	var len = pointers.length;
        	for(var i=0; i<len; ++i) {
        		createMarker(pointers[i],len>1);
        	}
		});		
	}

	this.util = new function(){
		this.getPointerInfo = function(pArray) {
			var info = {
				center: new google.maps.LatLng(52.222752, 6.897182), 
				zoom: 12
			}
			if(pArray.length == 1) {
				info.center = new google.maps.LatLng(pArray[0].lat, pArray[0].lng);
				info.zoom = 15;
			} else {
				var lat = 0;
				var lng = 0;
				var len = pArray.length; 
				for(i=0;i<len;++i) {
					lat += pArray[i].lat;
					lng += pArray[i].lng;
				}
				info.center = new google.maps.LatLng(lat/len,lng/len);
			}
			return info;
		}

		this.getCanonical = function() {
			$link = $('head link[rel=canonical]');
			if($link.length) {
				return $link.attr('href');
			}
			return document.location.href;
		}
	}();

	/**
	 * Utility for lazyloading google maps
	 * If you need google maps functionality. Pass a function that needs
	 * it UIT.maps.enabled(). Any function passed in is queued until google
	 * maps is loaded
	 */
	this.maps = new function() {
		var _cbQueue = [];
		var _mapsLoading = false;
		var _mapsLoaded = false;

		this.enabled = function(cb) {
			if(_mapsLoaded) {
				cb.apply();
			} else {
				_cbQueue.push(cb);
				if(!_mapsLoading) {
					_mapsLoading = true;
					UIE.loadScript("http://maps.google.com/maps/api/js?sensor=false&callback=UIE.maps.callback",true);
				}
			}
		}
		this.callback = function(){
			if(!_mapsLoaded) {
				_mapsLoaded = true;
				while(cb = _cbQueue.shift()) {
					cb.apply();
				}
			}
		}
	}();
	
	var _loaded = [];
	/**
	 * Dynamic script loader, loads javascript on the fly
	 * @param string url SOurce of teh script
	 * @param bool defer, whether script execution may be deferref. This
	 *        option should be used when possible for performance
	 */
	this.loadScript = function(url,defer) {
		var script = document.createElement("script");
		script.type = "text/javascript";
		script.src = url;
		if(defer) {
			script.defer = true;
			script.async = true;
		}
		$('head').append(script);
		_loaded[url] = 1;
	}
}();

//load a json implementation when native implementation is absent 
if( (!window.JSON) || typeof window.JSON.stringify != 'function') {
	UIE.loadScript('resource/json.js');
}

_ga.trackFacebook = function(opt_pageUrl) {
  var trackerName = '';
  try {
    if (FB && FB.Event && FB.Event.subscribe) {
      FB.Event.subscribe('edge.create', function(targetUrl) {
        _gaq.push([trackerName + '_trackSocial', 'facebook', 'like',
            targetUrl, opt_pageUrl]);
      });
      FB.Event.subscribe('edge.remove', function(targetUrl) {
        _gaq.push([trackerName + '_trackSocial', 'facebook', 'unlike',
            targetUrl, opt_pageUrl]);
      });
      FB.Event.subscribe('message.send', function(targetUrl) {
        _gaq.push([trackerName + '_trackSocial', 'facebook', 'send',
            targetUrl, opt_pageUrl]);
      });
    }
  } catch (e) {}
};
