/**
 * @author tfuhlroth maxomedia - agentur für crossmedia-kommunikation bsw
 */

var Page = new (new Class({
	
	Implements: Events,
	
	EVENTS: {
		URLCHANGE: 'urlchange',
		VIEWERSNAP: 'viewersnap',
		FILTERSELECT: 'filterselect',
		SLIDESHOWCLICK: 'slideshowclick',
		SLIDESHOWHIDE: 'slideshowhide'
	},
	
	initialize: function () {
		if (!MAXOMEDIA.debug.settings.get('javascript')) return false;
		
		window.addEvent('domready', this.setup.bind(this));
	},
	
	setup: function () {
		this.build();
		this.workData = new Hash(this.workData);
		this.menuData = new Hash(this.menuData);
		this.placeholderData = new Hash(this.placeholderData);
		
		this.initModules();
		Site.fireEvent('ready');
	},
	
	build: function () {
		// box-style
		$('body-container').addClass('box');
		
		// remove title
		$('body-container').getElement('h1').destroy();
		
		// viewport
		new Element('div', {
			'id': 'work-viewport',
			'class': 'flick-viewport'
		}).wraps($('work-element'));
		
		// flick
		$$('#work-element > li').addClass('flick-item');
		$('work-element').addClass('flick-element').removeProperty('id');
	},
	
	initModules: function () {
		this.container = $('work-viewport');
		
	    this.initSlideshow();
		this.initViewer();	
		this.initManager();
		this.initFilter();
		this.initJWPlayer();
		//this.initInstructions();
		this.attachEvents();
		
		// random
		if (!this.manager.getPattern()) this.viewer.scrollToItem(this.viewer.items.active.getRandom());
	},
		
	initViewer: function () {		
		// Viewer
		this.viewer = new MAXOMEDIA.Viewer(this.container, this.workData, {
			itemSize: {x: 520, y: 460},
			placeholderData: this.placeholderData
		});
		
		// Viewer Events
		this.viewer.addEvent('loaded', this.initInstructions.bind(this));
		this.viewer.relayEvent('snap', this.EVENTS.VIEWERSNAP, this);
	},
	
	initInstructions: function () {
		this.instructions = new Instructions();
		this.viewer.addEvents({
			'scrollByCursor': this.instructions.close.bind(this.instructions),
			'dragStart': this.instructions.close.bind(this.instructions)
		});
		this.viewer.radar.addEvent('navigate', this.instructions.close.bind(this.instructions));
		this.slideshow.addEvent('click', this.instructions.close.bind(this.instructions));
		this.jwplayer.addEvent('click', this.instructions.close.bind(this.instructions))          
	},
	
	initManager: function () {		
		// Manager
		this.manager = new URIFragmentManager([
			{key: 'client', regex: '^/([-\\w]+)/$', groups: ['CustomerSlug'], validators: {"CustomerSlug": this.clientDataValidator}},
			{key: 'work', regex: '^/([-\\w]+)/$', groups: ['Slug']},
			{key: 'work-slideshow', regex: '^/([-\\w]+)/slideshow/$', groups: ['Slug']},
			{key: 'client-work', regex: '^/([-\\w]+)/([-\\w]+)/$', groups: ['CustomerSlug', 'Slug']},
			{key: 'client-work-slideshow', regex: '^/([-\\w]+)/([-\\w]+)/slideshow/$', groups: ['CustomerSlug', 'Slug']}
		]);
				
		// Manager Events
		this.manager.relayEvent('change', this.EVENTS.URLCHANGE, this);
	},
	
	initFilter: function () {
		// Filter
		this.activeFilter = null;
		this.menuData.Nodes.splice(0, 0, {"Type": "Clear", "Label": "All"});
		this.filter = new MAXOMEDIA.Filter(this.container, this.menuData);
		this.filter.setLabel('All');
		
		// Filter Events
		this.filter.relayEvent('select', this.EVENTS.FILTERSELECT, this);
	},
	
	initSlideshow: function () {
		// Slideshow
		if (MAXOMEDIA.debug.settings.get('flash')) { // check for flash
			$$('.flick-item').forEach(function (item) {
				var data = $pick(this.workData.get(item.get('id')), this.placeholderData.get(item.get('id')));
				if (data.SlideShow) {
				//if (this.workData[item.get('id')].SlideShow) {
					new Element('a', {'text': Site.dict.get("ARBEITEN-LABEL_1"), 'class': 'flick-slideshow'}).inject(item.getElement('.flick-controls'));
				}
			}, this);
		}
		this.slideshow = new MAXOMEDIA.Slideshow(this.container, $$('.flick-slideshow'));
		//alert(this.container);
		
		// Slideshow Events
		this.slideshow.relayEvent('click', this.EVENTS.SLIDESHOWCLICK, this);
		this.slideshow.relayEvent('hide', this.EVENTS.SLIDESHOWHIDE, this);
	},
	
	initJWPlayer: function () {
	    if (MAXOMEDIA.debug.settings.get('flash')) 
	    {
	        $$('.flick-item').forEach(function (item) {
			    var data = $pick(this.workData.get(item.get('id')), this.placeholderData.get(item.get('id')));
	            if (data.Video!=null) 
	            {
				    new Element('a', {'text': 'Video', 'class': 'flick-slideshow', 'onclick': 'Page.jwplayer.load(\''+data.Video+'\');'}).inject(item.getElement('.flick-controls'));
			    }
			}, this);
		}
		
		this.jwplayer = new MAXOMEDIA.JWPlayer(this.container, $$('.flick-slideshow'));		
	},
	
	attachEvents: function () {
		// URLCHANGE
		this.addEvent(this.EVENTS.URLCHANGE, function (pattern) {
			
			var type = pattern[0];
			var match = pattern[1];
						
			// slideshow	
			switch (type) {
				case 'work-slideshow':
				case 'client-work-slideshow':
					this.slideshow.load(this.workData.get(match.Slug).Id);
					break;
			}
						
			// filter
			if (match.CustomerSlug && match.CustomerSlug != this.activeFilter) { // filter items
				if (this.clientDataValidator.contains(match.CustomerSlug)) { // is valid group input
					this.activeFilter = match.CustomerSlug;
					this.viewer.filter('CustomerSlug=' + this.activeFilter);
					this.filter.setLabel(this.clientData[this.clientDataValidator.indexOf(match.CustomerSlug)]);
				} else {
					this.manager.clear();
					this.filter.setLabel('All');
				}
			} else if (this.activeFilter && !match.CustomerSlug) { // clear filter
				this.activeFilter = false;
				this.viewer.filter();
				this.filter.setLabel('All');
			}
			
			if (match.Slug && $(match.Slug)) { // pan to work
				this.viewer.scrollToItem($(match.Slug));
			} else { // choose random
				this.viewer.scrollToItem(this.viewer.items.active.getRandom());
			}
			
		}.bind(this));
		
		// VIEWERSNAP
		this.addEvent(this.EVENTS.VIEWERSNAP, function (element) {
			
			if (element) {
				var pattern = this.manager.getPattern();
				//var data = this.viewer.data.get(element.get('id'));
				var data = $pick(this.workData.get(element.get('id')), this.placeholderData.get(element.get('id')));
				if (pattern) {
					if (pattern[0] == 'client') {
						this.manager.setPattern('client-work', data);
					} else {
						this.manager.setValue('Slug', data.Slug);
					}
				} else { // no pattern set yet
					this.manager.setPattern('work', data);
				}
			}
			
		}.bind(this));
		
		// FILTERSELECT
		this.addEvent(this.EVENTS.FILTERSELECT, function (data) {
			
			switch (data.Type) {
				case 'Clear':
					this.filter.setLabel(data.Label);
					this.filter.hide();
					this.manager.clear();
					this.viewer.filter();
					this.viewer.scrollToItem(this.viewer.items.active.getRandom());
					break;
				case 'Client':
					this.filter.hide();
					this.manager.setPattern('client', {"CustomerSlug": data.Slug});
					break;
				case 'Work':
					var pattern = this.manager.getPattern();
					if (pattern) {
						if ((pattern[0] === 'client' || pattern[0] === 'client-work') && pattern[1].CustomerSlug === data.ClientSlug.toLowerCase()) {
							this.manager.setPattern('client-work', {"CustomerSlug": data.ClientSlug, "Slug": data.Slug});
						} else {
							this.filter.setLabel('All');
							this.manager.setPattern('work', data);
						}
					} else {
						this.manager.setPattern('work', data);
					}
					break;
			}
			
		}.bind(this));
		
		// SLIDESHOWCLICK
		this.addEvent(this.EVENTS.SLIDESHOWCLICK, function () {
			var pattern = this.manager.getPattern();
			this.manager.setPattern(pattern[0] + '-slideshow', pattern[1]);
		}.bind(this));
		
		// SLIDESHOWHIDE
		this.addEvent(this.EVENTS.SLIDESHOWHIDE, function () {
			var pattern = this.manager.getPattern();
			this.manager.setPattern(pattern[0].replace('-slideshow', ''), pattern[1]);
		}.bind(this));
			
	}
	
}));
