window.addEvent('domready', function() {
	// Author: Hallvard Kristiansen
	// Copyright: Fleshmx ltd. 2010
	
	// Setup
	var carousel = {
		Fx:false,
		Els:false,
		cur:false,
		prevEl:false,
		curindex:0,
		prev:false,
		next:false,
		status:1,
		animTime: 2000,
		animTrans: new Fx.Transition(Fx.Transitions.Expo.easeInOut, 2),
		ssInt: false,
		info_open:true,
		autorotate:true
	};
	var calendar = {
		Fx:false,
		Els:false,
		Els_width:0,
		cur:false,
		prev:false,
		next:false,
		bordercolor:20,
		scroller:false,
		scrolling:false,
		curPos:0,
		animTime: 1000,
		open:false,
		openheight:'80px',
		closedheight:'5px'
	};
	var uiData;
	var uiCookie;
	var window_size;
	var mousepos;
	var i = 0;
	var stopcal = false;
	var animTransition = new Fx.Transition(Fx.Transitions.Expo.easeOut, 3);
	var animDuration = 200;
	var searchopen = false;
	var searchwidth = '205px';
	var slideshow = {
		func:false,
		interval:{},
		children:{},
		index:{},
		current:{},
		previous:{},
		classnm:'.ss_main-img'
	};
	
	// Sends the carousel to a specific element. Takes an integer as value.
	function carousel_goto(which) {
		var clicked = which.replace('c', 'e');
		if ($(clicked) != carousel.cur) {
			carousel.status = 0;
			carousel.curindex = carousel.Els.indexOf($$('#c_carousel li.sel')[0]);
			if (carousel.curindex == -1) {
				carousel.curindex = 0;
			}
			carousel.prevEl = carousel.Els[carousel.curindex];
			if (calendar.Els[carousel.curindex]) {
				calendar.Els[carousel.curindex].clicked = false;
				calendar.Els[carousel.curindex].morph({
					'opacity': 0.5,
					'border-color': '#840000'
				});
			}
			carousel.prev = carousel.curindex-1;
			carousel.next = carousel.curindex+1;
			carousel.Els.removeClass('sel');
			switch (which) {
				case 'prev':
					if (carousel.prev >= 0) {
				        carousel.cur = carousel.Els[carousel.prev];
				        carousel.curindex = carousel.prev;
					} else {
				        carousel.cur = carousel.Els[carousel.Els.length-1];
				        carousel.curindex = carousel.Els.length-1;
					}
				break;
				case 'next':
					if (carousel.next < carousel.Els.length) {
				        carousel.cur = carousel.Els[carousel.next];
				        carousel.curindex = carousel.next;
					} else {
				        carousel.cur = carousel.Els[0];
				        carousel.curindex = 0;
					}
				break
				default:
			        carousel.cur = $(clicked);
				    carousel.curindex = carousel.Els.indexOf($(clicked));
				break;
			}
			if (calendar.Els[0]) {
				calendar.Els[carousel.curindex].clicked = true;
			    carousel.cur.addClass('sel');
				carousel.prevEl.get('tween').start('opacity', 0.4);
			    $('c_data').get('tween').start('opacity', 0).chain(function(){
			    	$('c_title').set('html', carousel.cur.getChildren()[1].get('html'));
			    	$('c_info').set('html', '<span id="c_dates">'+carousel.cur.getChildren()[2].get('html')+'</span><br/>'+carousel.cur.getChildren()[3].get('html'));
				    carousel.Fx.start('left', -carousel.cur.offsetLeft).chain(function() {
						if (calendar.Els[carousel.curindex]) {
							calendar.Els[carousel.curindex].morph({
								'opacity': 1,
								'border-color': '#cc0000'
							});
						}
				    	carousel.cur.get('tween').start('opacity', 0.7);
						$('c_data').get('tween').start('opacity', 1);
				    });
			    });
			}
		}
		do_interface_cookie('write');
	}
	
	// Autoscroll the calendar on mouseover
	function autoScroll() {
		if (calendar.Els_width > window_size.x) {
			// Preparing the mouseover zones
			var leftzone_1 = (window_size.x/2)-150;
			var rightzone_1 = (window_size.x/2)+150;
			var leftzone_2 = (window_size.x/2)-250;
			var rightzone_2 = (window_size.x/2)+250;
			var leftzone_3 = leftzone_1/2;
			var rightzone_3 = window_size.x - ((window_size.x-rightzone_1)/2);
			// Check if either edge is reached, returns true or false
			var maxleft = (calendar.curPos+i >= 0);
			var maxright = (calendar.curPos+calendar.Els_width+i <= window_size.x);
			// Increase or decrease the calendar.scrolling speed based on mouse position
			if (mousepos < leftzone_1 && stopcal == false || mousepos > rightzone_1 && stopcal == false) {
				window_size = window.getSize();
				if (maxleft == true && mousepos < leftzone_1) {
					calendar.Fx.set('left', 0);
					i = 0;
					calendar.curPos = 0;
				} else if (mousepos < leftzone_1) {
					if (mousepos < leftzone_3) {
						calendar.curPos += i;
						if (i < 40) {
							i++;
						}
					} else if (mousepos < leftzone_2) {
						calendar.curPos += i;
						if (i > 20) {
							i--;
						} else if (i < 20) {
							i++;
						}
					} else {
						calendar.curPos += i;
						if (i > 10) {
							i--;
						} else if (i < 10) {
							i++;
						}
					}
					calendar.Fx.set('left', calendar.curPos);
				}
				if (maxright == true && mousepos > rightzone_1) {
					calendar.Fx.set('left', -(calendar.Els_width-window_size.x));
					i = 0;
					calendar.curPos = -(calendar.Els_width-window_size.x);
				} else if (mousepos > rightzone_1) {
					if (mousepos > rightzone_3) {
						calendar.curPos += i;
						if (i > -40) {
							i--;
						}
					} else if (mousepos > rightzone_2) {
						calendar.curPos += i;
						if (i < -20) {
							i++;
						} else if (i > -20) {
							i--;
						}
					} else {
						calendar.curPos += i;
						if (i < -10) {
							i++;
						} else if (i > -10) {
							i--;
						}
					}
					calendar.Fx.set('left', calendar.curPos);
				}
			// If stopcal is set to true, this brakes the calendar.scrolling and then clears the periodical function call
			} else if (maxleft == false && maxright == false || stopcal == true) {
				if (i > 1 && maxleft == false && maxright == false) {
					i -= 2;
				} else if (i < -1 && maxleft == false && maxright == false) {
					i += 2;
				} else if (i == 0 || i == 1 || i == -1 || maxleft == true || maxright == true) {
					$clear(calendar.scroller);
					calendar.scrolling = false;
					stopcal = false;
					return true;
				}
				calendar.curPos += i;
				calendar.Fx.set('left', calendar.curPos);
			}
		}
	}
	
	// Center the clicked calendar item on iphones and ipads
	function calendar_goto(where) {
		$clear(calendar.scroller);
		calendar.scrolling = true;
		stopcal = true;
		window_size = window.getSize();
		var destination = window_size.x/2 - $(where).offsetLeft - $(where).offsetWidth/2;
		calendar.Fx.start('left', destination).wait(2000).chain(function() {
			calendar.scrolling = false;
			stopcal = false;
		});
	}
	
	// Sets and modifies interface cookies for storing what you where up to on the last pageBreakAfter
	function do_interface_cookie(what) {
		switch (what) {
			case 'read':
				uiData = JSON.decode(Cookie.read('uiCookie'));
				if (uiData != null) {
					carousel.info_open = uiData.info_open;
					calendar.open = uiData.cal_open;
					searchopen = uiData.search_open;
				}
			break;
			case 'write':
				uiData = {
					info_open:carousel.info_open,
					cal_open:calendar.open,
					search_open:searchopen
				};
				uiCookie = Cookie.write('uiCookie', JSON.encode(uiData));
			break;
		}
	}
	
	// Sets the UI to the remembered settings
	function restore_cookie_settings() {
		if (searchopen == true) {
			$('searchtoggle').getNext().setStyle('width', searchwidth);
		} else {
			$('searchtoggle').getNext().setStyle('width', '0px');
		}
		if (calendar.open == true) {
			$('c_nav').setStyle('height', calendar.openheight);
			$$('li.caltoggle')[0].addClass('calclose');
		} else {
			$('c_nav').setStyle('height', calendar.closedheight);
			$$('li.caltoggle')[0].addClass('calopen');
		}
		if (carousel.info_open == true) {
			$('c_info').show();
			$('c_toggleimg').hide();
		} else {
			$('c_info').hide();
			$('c_toggleimg').show();
		}
	}
	slideshow.func = function() {
		var i = $$(slideshow.classnm).indexOf(this);
		if (slideshow.children[i][slideshow.index[i]]) {
			slideshow.current[i] = slideshow.children[i][slideshow.index[i]];
			slideshow.current[i].get('tween').start('opacity', 1).chain(function() {
				if (slideshow.previous[i]) {
					slideshow.previous[i].get('tween').start('opacity', 0);
				}
				slideshow.previous[i] = slideshow.current[i];
			});
			slideshow.index[i]++;
		} else if (slideshow.index[i]>=slideshow.children[i].length) {
			slideshow.index[i] = 0;
		}
	}


	do_interface_cookie('read');
	window_size = window.getSize();
	carousel.Fx = new Fx.Tween($('c_carousel').getFirst(), {
		duration: carousel.animTime,
		transition: carousel.animTrans,
		link: 'cancel'
	});
	carousel.Els = $$('#c_carousel ul li');
	calendar.Fx = new Fx.Tween($('rail'), {
		duration: calendar.animTime,
		link: 'cancel'
	});
	calendar.Els = $$('#c_nav li ul li');
	calendar.Els.each(function(element) {
		calendar.Els_width += element.offsetWidth;
		if (element.hasClass('sel')) {
			element.clicked = true;
		}
	});

	$('c_info').set('reveal',{
		duration: animDuration,
		transition: animTransition,
		transitionOpacity: false
	});
	$('c_box').addEvents({
		'click':function() {
			if (carousel.info_open == false) {
				$('c_info').reveal();
				$('c_toggleimg').hide();
				carousel.info_open = true;
			} else {
				$('c_info').dissolve();
				$('c_toggleimg').show();
				carousel.info_open = false;
			}
			do_interface_cookie('write');
		}
	});
	if ($$('#c_carousel ul li.sel')[0]) {
		$$('#c_carousel ul li.sel')[0].setStyle('opacity', 0.7);
	} else if ($$('#c_carousel ul li')[0]) {
		$$('#c_carousel ul li')[0].setStyle('opacity', 0.7);
	}
		
	$('searchtoggle').getNext().set('tween',{
		duration: animDuration,
		transition: animTransition
	});
	$('searchtoggle').addEvents({
		'click':function() {
			if (searchopen == false) {
				$('searchtoggle').getNext().tween('width', searchwidth);
				searchopen = true;
			} else {
				$('searchtoggle').getNext().tween('width', '0px');
				searchopen = false;
			}
			do_interface_cookie('write');
		}
	});
	
	$('calendar').addEvents({
		'mouseenter': function(event) {
			mousepos = event.page.x;
			carousel.autorotate = false;
			if (calendar.scrolling == false && !Browser.Platform.ipod) {
				calendar.scroller = autoScroll.periodical(40);
				calendar.scrolling = true;
			}
		},
		'mousemove':function(event){
			mousepos = event.page.x;
		},
		'mouseleave':function() {
			if (calendar.scrolling == true) {
				stopcal = true;
			}
		}
	});
	$('c_nav').set('tween', {
		duration: animDuration,
		transition: animTransition
	});
	$('c_data').set('tween', {
		duration: 'normal',
		transition: animTransition
	});
	calendar.Els.set('tween', {
		duration: animDuration,
		transition: animTransition
	});
	calendar.Els.each(function(el) {
		el.clicked = false;
	});
	calendar.Els.addEvents({
		'mouseenter': function() {
			this.tween('opacity', 1);
		},
		'mouseleave': function() {
			if (this.clicked == false) {
				this.tween('opacity', 0.5);
			}
		},
		'click': function() {
			carousel_goto(this.id);
			if (Browser.Platform.ipod) {
				calendar_goto(this.id);
			}
		}
	});
	$('c_prev').addEvents({
		'click': function() {
			carousel_goto('prev');
		}
	});
	$('c_next').addEvents({
		'click': function() {
			carousel_goto('next');
		}
	});
	if (calendar.Els[0]) {
		$$('#access .menu').getLast().getLast('li.caltoggle').addEvents({
			'click': function() {
				if (calendar.open == false) {
					$('c_nav').tween('height', calendar.openheight);
					this.removeClass('calopen');
					this.addClass('calclose');
					calendar.open = true;
				} else {
					$('c_nav').tween('height', calendar.closedheight);
					this.removeClass('calclose');
					this.addClass('calopen');
					calendar.open = false;
				}
				do_interface_cookie('write');
			}
		});
		if ($('monthlist')) {
			$('monthlist').addEvents({
				'click': function() {
					$$('#access .menu').getLast().getLast('li.caltoggle').fireEvent('click');
				}
			});
		}
	} else {
		$$('#access .menu').getLast().getLast('li.caltoggle').hide();
	}
	restore_cookie_settings();
	
	if ($$(slideshow.classnm)) {
		var i = 0;
		$$(slideshow.classnm).each(function(el) {
			var timing = Math.floor(Math.random()*4000+3000);
			slideshow.index[i] = 0;
			slideshow.children[i] = el.getChildren('li');
			slideshow.current[i] = el.getFirst('li');
			slideshow.previous[i] = el.getLast('li');
			if (slideshow.children[i].length > 1) {
				slideshow.interval[i] = slideshow.func.periodical(timing, el);
			}
			i++;
		});
	}
	$('header').addEvents({
		'mouseenter': function() {
			carousel.autorotate = false;
		}
	});
	$('main').addEvents({
		'mouseenter': function() {
			carousel.autorotate = true;
		}	
	});
	var autocarousel = function() {
		if (carousel.autorotate == true) {
			carousel_goto('next');
		}
	}
	var carouselinterval = autocarousel.periodical(9000);
	
	if ($$('.accordion')) {
		myAccordion = new Fx.Accordion($$('.trigger'), $$('.contractor'), {
			opacity: false,
			duration: 'short',
			alwaysHide: true
		});
	}
	if ($('ticketiframe') && Browser.safari) {
		iframeUrl = $('ticketiframe').get('src');
		window.open(iframeUrl,'Dansens Hus Tickets','width=650,height=400');
		$('ticketiframe').destroy();
		$$('.dh_inner')[0].set({'html':'Billettluken er &aring;pnet i nytt vindu. Dersom dette ble blokkert, kan du &aring;pne det ved &aring; <a href="'+iframeUrl+'" target="_blank">klikke her</a>.'});
	}	
	Shadowbox.init();
});

