/**
 * @author Greg
 */

var greg = {
	
	setCurrentPage: function(currentPage, useSamePage)
	{
		var pages = $$('div.page');
		var firstPageId = pages[0].id;
		var lastPageId = pages.getLast().id;
		var currentPage = $pick(currentPage, firstPageId);
		var prevPage = false;
		var nextPage = false;
		pages.each(function(div, index){
			myId = div.id;
			//console.log("myId: %s", myId);
			if(currentPage == myId){
				if(useSamePage){
					prevPage = currentPage;
				} else {
					prevPageDiv = $pick(pages[index-1], pages[0]);
					prevPage = prevPageDiv.id;
				}
				nextPageDiv = $pick(pages[index+1], pages.getLast());
				nextPage = nextPageDiv.id;
			}
		})
		greg.setPageButtons(prevPage, nextPage);
		//console.log("currentPage: %s, prevPage: %s, nextPage: %s", currentPage, prevPage, nextPage);
	},
	
	makePageDetectors: function()
	{
		var pages = $$('div.page');
		var contentContainer = $('content');
		var contentContainerLeft = contentContainer.getPosition()['x'];
		pages.each(function(div){
			currPos = div.getLeft([contentContainer]) - contentContainerLeft;
			if (currPos <= 0) {
				greg.setCurrentPage(div.id, true);
			}
			//console.log("page.id: %s, currPos: %s", div.id, currPos);
		})
	},
	
	setPageButtons: function(prevPage, nextPage){
		var mooScroller = new Fx.Scroll('content');
		
		var prevPageId = prevPage;
		var prevPageObj = $(prevPage);
		prevPageButton = $('Scrollbar-Up');
		prevPageButton.removeEvents('click');
		prevPageButton.addEvent('click', function(){
			mooScroller.toElement(prevPageObj);
			greg.setCurrentPage(prevPageId, false);
			greg.adjustScrollbar(prevPageObj);
		});
		
		var nextPageId = nextPage;
		var nextPageObj = $(nextPage);
		nextPageButton = $('Scrollbar-Down');
		nextPageButton.removeEvents('click');
		nextPageButton.addEvent('click', function(){
			mooScroller.toElement(nextPageObj);
			greg.setCurrentPage(nextPageId, false);
			greg.adjustScrollbar(nextPageObj);
		});
	},
	
	/**
	 * repositions visible block to center of screen
	 */
	reposition: function()
	{
        /**
         * Get sizes of windows and centered element
         */
        windowSize = window.getSize();
        centeredSize = $('centered').getSize();
        /**
         * calculate new left and top offsets
         */
        newLeft = (windowSize.size.x - centeredSize.size.x) / 2;
        newTop = (windowSize.size.y - centeredSize.size.y) / 2;
        newLeft = newLeft < 0 ? 0 : newLeft;
        newTop = newTop < 0 ? 0 : newTop;
        /**
         * reposition centered element
         */
        var posChange = new Fx.Styles('centered');
        posChange.set({
            'top': newTop,
            'left': newLeft
        });
	},
	
	makeSlider: function(){
		this.sliders = $$('ul#mainMenu ul').map(function(div){
			return new Fx.Slide(div, {
				mode: 'horizontal'
			}).hide();
		});
		$$('ul#mainMenu a.sectionLink').each(function(lnk, index){
			lnk.addEvent('mouseover', function(){
				this.sliders.each(function(slider, sliderIndex){
					if (sliderIndex == index) this.sliders[sliderIndex].toggle();
					else this.sliders[sliderIndex].slideOut();
				}, this); 
			}.bind(this));
		}, this); 
	},
	

	intJumpLinks: function(){
		var mooScroller = new Fx.Scroll('content');
		/*
		var scrollHandle = $('Scrollbar-Handle');
		var scrollHandleTop = scrollHandle.getPosition()['y'];
		var scrollTrack = scrollHandle.getParent();
		var scrollTrackW = scrollTrack.getSize()['size']['x'] - scrollHandle.getSize()['size']['x'];
		var scrollTrackOffset = scrollTrack.getPosition()['x'];
		*/
		$$('.jumpLink').each(function(anchor){
			anchor.addEvent('click', function(){
				jumpToPage = anchor.className.match(/link_([0-9]_[0-9])/)[1];
				jumpToElement = $('page_' + jumpToPage);
				if (!jumpToElement) {
					alert("Element " + 'page_' + jumpToPage + " does not exist");
					return;
				}
				mooScroller.toElement(jumpToElement);
				greg.setCurrentPage('page_' + jumpToPage, false);
				greg.adjustScrollbar(jumpToElement);
				/*
				jumpToElementLeft = jumpToElement.getPosition()['x'] - $('centered').getPosition()['x'];
				percentScroll = jumpToElementLeft / ($('section').getSize()['size']['x'] - $('content').getSize()['size']['x']);
				currentScrollPos = scrollHandle.getPosition()['x'] - scrollTrackOffset;
				newScrollerPos = (scrollTrackW * percentScroll).round();
				scrollerMove = new Fx.Styles('Scrollbar-Handle');
				scrollerMove.start({
					left:[currentScrollPos,newScrollerPos]
				});
				*/
				//console.log("scrollsTo: %s, percent: %s, scrollerPos: %s", jumpToElementLeft, percentScroll, newScrollerPos);
			})
		});
	},

	adjustScrollbar: function(jumpToElement){
		var mooScroller = new Fx.Scroll('content');
		var scrollHandle = $('Scrollbar-Handle');
		var scrollHandleTop = scrollHandle.getPosition()['y'];
		var scrollTrack = scrollHandle.getParent();
		var scrollTrackW = scrollTrack.getSize()['size']['x'] - scrollHandle.getSize()['size']['x'];
		var scrollTrackOffset = scrollTrack.getPosition()['x'];
		
		jumpToElementLeft = jumpToElement.getPosition()['x'] - $('centered').getPosition()['x'];
		percentScroll = jumpToElementLeft / ($('section').getSize()['size']['x'] - $('content').getSize()['size']['x']);
		currentScrollPos = scrollHandle.getPosition()['x'] - scrollTrackOffset;
		newScrollerPos = (scrollTrackW * percentScroll).round();
		scrollerMove = new Fx.Styles('Scrollbar-Handle');
		scrollerMove.start({
			left:[currentScrollPos,newScrollerPos]
		});
	},
	
	makeScrollbar: function(){
		var scrollHandle = $('Scrollbar-Handle');
		var theParent = scrollHandle.getParent();
		var parentLeft = theParent.getLeft();
		var totalWidth = theParent.getSize()['size']['x'] - scrollHandle.getSize()['size']['x'];
		var contentObj = $('content');
		var sectionObjWidth = $('section').getSize()['size']['x'] - contentObj.getSize()['size']['x'];
		scrollHandle.makeDraggable({
			snap: 0,
			container: 'Scrollbar-Track',
			onDrag: function(){
				thisLeft = this.getLeft() - parentLeft;
				percentScroll = thisLeft / totalWidth;
				contentObjScrollTarget = (sectionObjWidth * percentScroll).round();
				contentObj.scrollTo(contentObjScrollTarget, 0);
				//console.log("left: %s; percent: %s, target: %s", thisLeft, percentScroll.round(2), contentObjScrollTarget);
			}.bind(scrollHandle),
			onComplete: function(){
				greg.makePageDetectors();
			}
		});
	},
	
	setRollovers: function(){
		
		$('Scrollbar-Up').addEvent('mouseover', function(){
			$('Scrollbar-Up').setStyle('background-image', 'url(img/leftArrow_on.gif)');
		});
		$('Scrollbar-Up').addEvent('mouseout', function(){
			$('Scrollbar-Up').setStyle('background-image', 'url(img/leftArrow_off.gif)');
		});
		$('Scrollbar-Down').addEvent('mouseover', function(){
			$('Scrollbar-Down').setStyle('background-image', 'url(img/rightArrow_on.gif)');
		});
		$('Scrollbar-Down').addEvent('mouseout', function(){
			$('Scrollbar-Down').setStyle('background-image', 'url(img/rightArrow_off.gif)');
		});
		
	},

	init:function()
	{
		this.reposition();
		this.intJumpLinks();
		this.makeScrollbar();
		this.setCurrentPage(null);
		this.makePageDetectors();
		this.setRollovers();
	}
}

window.onDomReady(greg.init.bind(greg));

var SimpleSlideShowDemo = new Class({
	options: {
		slides: [],
		startIndex: 0,
		wrap: true,
		onShow: Class.empty //Mootools 1.2: $empty
	},
	initialize: function(options){
		this.setOptions(options)
		this.slides = [];
		this.effects = [];
		this.addSlides(this.options.slides);
		if(this.slides.length) this.showSlide(this.options.startIndex);
	},
	addSlides: function(slides){
		$$(slides).each(function(slide){
			this.slides.include($(slide));
			slide.addEvent('click', this.cycleForward.bind(this));
			//console.log('added event to slide: %s', $(slide).src);
			this.effects[this.slides.indexOf(slide)] = new Fx.Style(slide, 'opacity');
			//console.log('slide: %s', $(slide).src);
		}, this);
	},
	addSlide: function(slide){
		this.addSlides([slide]);
	},
	cycleForward: function(){
		if ($chk(this.now) && this.now < this.slides.length - 1) {
			this.showSlide(this.now + 1);
			//console.log('first step');
			//console.log('this.effects: %s', this.effects);
		}
		else 
		if ((this.now) && this.options.wrap) {
			this.showSlide(0);
			//console.log('second step');
		}
		else 
		if (!$defined(this.now)) {
			this.showSlide(this.options.startIndex);
			//console.log('third step');
		}
		console.log('this.now: %s', this.now);
	},
	cycleBack: function(){
		if(this.now > 0) this.showSlide(this.now-1);
		else if(this.options.wrap) this.showSlide(this.slides.length-1);
	},
	showSlide: function(iToShow){
		var now = this.now;		
		var currentSlide = this.slides[now];
		var slide = this.slides[iToShow];
		function fadeIn(s){
			s.setStyles({
				display:'block',
				visibility: 'visible',
				opacity: 0
			});
			this.effects[this.slides.indexOf(s)].start(1);
			this.fireEvent('onShow', [slide, iToShow]);
		};
		if(slide) {
			if($chk(now) && now != iToShow){
				this.effects[now].start(0).chain(function(){
					this.slides[now].setStyle('display', 'none');
					fadeIn.apply(this, [slide]);
				}.bind(this));
			} else fadeIn.apply(this, [slide]);
			this.now = iToShow;
		}
	}
});
SimpleSlideShowDemo.implement(new Options, new Events);



var SimpleImageSlideShowDemo = SimpleSlideShowDemo.extend({
	options: {
		imgUrls: [],
		container: false
	},
	initialize: function(options){
		this.parent(options);
		this.container = $(this.options.container);
		if(!this.container) return;
		this.options.imgUrls.each(this.addImg.bind(this));
		this.showSlide(this.options.startIndex);
	},
	addImg: function(url){
		var img = new Element('img', {
				src: url,
				styles: {
					display: 'none'
				},
				events: {
					click: this.cycleForward.bind(this)
				}
			}).injectInside($(this.options.container))
		this.addSlide(img);
	}
});
