var RecaptchaOptions = {
   theme : 'clean',
   tabindex : 2
};


var SlideArea = new Class({
	
	initialize: function(sEl) {
		
		$$(sEl).each(function(el, i) {
			this._slider(el);
		}.bind(this));
		
	},
	
	_slider: function(wrapper) {
		
		// remove the no js class
		wrapper.removeClass('nojs');
		
		// @TODO: make this more generic / reusable
		this._createElements(wrapper);
		var el = $('track');
		var children = $('slider').getElements('li');
		
		var trackWidth = 0;
		for(var i = 0; i < children.length-1; i++) {
			trackWidth += children[i].getStyle('width').toInt();
		}
		// Create the new slider instance
		new Slider(el, el.getElement('.handle'), {
			steps: 100,
			range: [0, trackWidth],
		    
			onChange: function(value){
				// Everytime the value changes, we change update the slider
				var currentPos = $('slider').getStyle('left').toInt();
				var myFx= new Fx.Morph('slider', {duration: 100, transition: Fx.Transitions.Linear});

				if (currentPos != value) {
					myFx.start({
					    'left': [currentPos, "-" + value] 
					});
				}
			},
			onComplete: function() {
				//console.log('done');
			}
		});		
	},
	
	_createElements: function(el) {
		var wrap = el.getParent();
		var track = new Element('div', {'id': 'track', 'class': 'track'});
		var handle = new Element('div', {'class': 'handle'});
		wrap.grab(track, 'after');
		$('track').grab(handle);
	}
	
});

var InFieldLabel = new Class({
	initialize: function(sInputID) {
		this.input = $(sInputID);
		this.lbl = $$('label[for='+ sInputID +']')[0];
		if (this.input && this.lbl) {
			this.lbl.addClass('overlay');

			this.form = this.input.getParents('form');
			
			this.input.addEvent('focus', this.__Focus.bindWithEvent(this));
			this.input.addEvent('blur', this.__Blur.bindWithEvent(this));

	    	this.updateLabel();

		}
	},
	/**
	 * Hides the value for the field, if the text has not changed
	 */
	hideLabel: function() {
		if (this.input.value.trim() == this.lbl.get('text')) {
			this.input.set('value', ''); // removes the value
		}
	},
	/**
	 * Sets the value to the LABEL text, if no other value is in place.
	 */
	updateLabel: function() {
	    if (this.input.value.trim().length == 0) {
			this.input.set('value', this.lbl.get('text'));
	    }
	},
	__Focus: function(e) {
		this.hideLabel();
	},
	__Blur: function(e) {
		this.updateLabel();
	}
});

var GATrackEvents = new Class({
	/**
	 * @TODO: track more than just outgoing click events
	 */
	initialize: function(sEls, options) {
		this.options = $extend({
			category: 'outgoing', // category -- see Event Tracking in GA
			relOverwrite: true, // should a rel attribute overwrite the default category?
			event: 'click', // event
			dimension: 'click'
		}, options || {});
		
		var triggers = $$(sEls);
		for(var i = 0; i < triggers.length; i++) {
			triggers[i].addEvent('click', this.__evt.bindWithEvent(this, triggers[i]));
		}
	},
	
	__evt: function(e, el) {
		
		var href = el.getProperty('href');
		var rel = el.getProperty('rel');
		
		// check if link is external
		if ( (href.match(/^http/)) && (! href.match(document.domain)) ) {		
			
			if(this.options.relOverwrite === true && rel != null) {
				var category = rel;
			}
			
			else {
				var category = this.options.category;
			}
			
			if(pageTracker) {
				//console.log('fire!', category, this.options.event, href);
				pageTracker._trackEvent(category, this.options.event, href);
			}
		}
		/*else if(el.hasClass('audio')) {
			var category = "audio";
			if(pageTracker) {
				//e.stop()
				console.log('fire!', category, this.options.event, href);
				pageTracker._trackEvent(category, this.options.event, href);
			}
		}
		else{}*/
	}
});


var KCreateShowFilters = new Class({
	initialize: function(args) {	
		this.args = $extend({
			filter: 'filter',
			triggers: '',
			displayType: 'table', /* @TODO: create more display types, i.e. ul / ol / dl / plain / whatever */
			displayID: 'shows-table'
		}, args || {});
		
		var path = window.location.pathname;

		var triggers = $$(this.args.triggers);
		for(var i = 0; i < triggers.length; i++) {
			triggers[i].addEvent('click', this.__Click.bindWithEvent(this));
		}
	},

	__Click: function (evt) {
		evt.stop();
		// extend target (for IE's sake)
		$(evt.target);
		if(evt.target.getParents('ul#shows-archive').length > 0) {
			if(evt.target.getParent().get('rel') == 'old') {
				var archives = $(this.args.filter).getElements('ul#shows-archive a:not([rel="old"]).selected');
				archives.each(function(el, i) {
					el.removeClass('selected');
				});
			}
			else if(evt.target.getParent().get('rel') == 'upcoming') {
				var archives = $(this.args.filter).getElements('ul#shows-archive a:not([rel="upcoming"]).selected');
				archives.each(function(el, i) {
					el.removeClass('selected');
				});			
			}
			else {
				var archives = $$('ul#shows-archive a[rel="old"]', 'ul#shows-archive a[rel="upcoming"]');
				archives.each(function(el, i) {
					el.removeClass('selected');
				});
			}
		}	
		evt.target.getParent().toggleClass('selected');
		this._collect();
	},
	
	_collect: function() {
		var calls = new Hash();
		var collectionArtists = $(this.args.filter).getElements('ul#shows-artists a.selected');
		var collectionYears = $(this.args.filter).getElements('ul#shows-archive a.selected');
		collectionArtists.each(function(el, i) {
			calls.set('aids[' + i +']', el.get('rel'));
		});
		collectionYears.each(function(el, i) {
			calls.set('archives[' + i +']', el.get('rel'));
		});	
		this._call(calls);
	}, 
	
	_call: function(aIDs) {
		var url = window.rootVirtual + '/wp-content/plugins/k-create/__ajax/kcshows.php';
		var jsonRequest = new Request.JSON({url: url, 
			noCache: true,
			onRequest: function(e) {
				$('loader').setStyle('display', 'block');
			},
			onComplete: function(e) {
				$('loader').setStyle('display', 'none');
			},
			onSuccess: function(responseJSON, responseText) {		    
				if(this.args.displayType === 'table') {
					this._displayTable(responseText);
				}	
			}.bind(this)
		}).get(aIDs);		
	},
	
	_displayTable: function(responseText) {
		//console.log('should update');
		var showsObj = JSON.decode(responseText);
		var tbody = $(this.args.displayID).getElement('tbody');
		tbody.empty();
		var html = '';
		for(var i = 0; i < showsObj.shows.length; i++) {					
			if(!showsObj.shows[i].nullresult) {
				if (i % 2 == 0) {	
					html += "<tr class=\"shows-alternate show-" + showsObj.shows[i].id +  " vevent\">";
				}
				else {
					html += "<tr class=\"show-" + showsObj.shows[i].id + " vevent\">";
				}
				
				//console.log(showsObj.shows[i].date, showsObj.shows[i].artist, showsObj.shows[i].location, showsObj.shows[i].venue, showsObj.shows[i].description);
				
				if (showsObj.shows[i].cancelled != 0) {
					html += "<td class=\"shows-cell-date cancelled\">" + showsObj.shows[i].date + "</td>";
					html += "<td class=\"shows-cell-artist cancelled\">" + showsObj.shows[i].artist + "</td>";
					html += "<td class=\"shows-cell-location cancelled\">" + showsObj.shows[i].location + "</td>";
					html += "<td class=\"shows-cell-venue cancelled\">" + showsObj.shows[i].venue + "</td>";
					html += "<td class=\"shows-cell-description cancelled\"><span class=\"cancel-desc\">Cancelled</span> " + showsObj.shows[i].description + "</td>";
				}
				else {
					html += "<td class=\"shows-cell-date dtstart\" title=\"" + showsObj.shows[i].dtstartdate + "\">" + showsObj.shows[i].date + "</td>";
					html += "<td class=\"shows-cell-artist\">" + showsObj.shows[i].artist + "</td>";
					html += "<td class=\"shows-cell-location location\">" + showsObj.shows[i].location + "</td>";
					html += "<td class=\"shows-cell-venue summary\"><span class=\"hide\">" + showsObj.shows[i].artist +  " @ </span>" + showsObj.shows[i].venue + "</td>";
					html += "<td class=\"shows-cell-description description\">" + showsObj.shows[i].description + "</td>";													
				}
				html += "</tr>";
			}
			else {
				html += "<tr><td colspan='5'>" + showsObj.shows[i].nullresult + "</td></tr>";
			}
		}
		tbody.set({html: html});		
	}	
});

var Slides = new Class({
	
	initialize: function(args) {
	
		this.args = $extend({
			wrapper: '',
			target: '',
			navContainer: '',
			navItems: '',
			showNav: true,
			stickyNav: false
		}, args || {});
		
		var navHeight = '';
		
		var sticky = this.args.stickyNav;
		var container = $(this.args.navContainer);
		
		if(sticky == false) {
			navHeight = container.getStyle('height').toInt();
			container.setStyle('height', 0);
		}
		
		var slideShow = new SlideShow(this.args.target, {
				delay: 7000,
				autoplay: true,
				transition: 'fade', //'blindLeftFade',
				duration: 500
		});
		
		slideShow.addEvents({
			onShowComplete: function() {
				this.active(slideShow.slides.indexOf(slideShow.current));
			}.bind(this)
		
		});
		
		var effect = new Fx.Morph(container, {duration: 500, transition: Fx.Transitions.Sine.easeOut});
		
		
		$(this.args.wrapper).addEvents({
			'mouseenter': function(e) {
				if(sticky == false) {
					if(effect) {
						effect.cancel();
					}
					effect.start({
						'height': [0, navHeight]
					});	
				}
				slideShow.pause();
			},
			'mouseleave': function(e) {
				if(sticky == false) {
					if(effect) {
						effect.cancel();
					}
					effect.start({
						'height': [navHeight, 0]
					});	
				}
				slideShow.play();
			}	
		});
		
		var slideNav = this.slideNav = $$(this.args.navItems);
		var opacity = this.opacity = 0.6;
		
		slideNav.each(function(el, index){
		  el.store('slide', slideShow.slides[index]);
		  if(index == 0) {
		  	//el.setStyle('opacity', 1);
		  	el.addClass('active');
		  }	
		  else {
		  	el.setStyle('opacity', opacity);
		  }
		  el.addEvents({
		  	'click': function() {
		    	slideShow.show(el.retrieve('slide'));
		    	for(var i = 0; i < slideNav.length; i++) {
		    		slideNav[i].removeClass('active');
		    		slideNav[i].setStyle('opacity', opacity);
		    	}
		    	el.addClass('active');
		    	el.setStyle('opacity', 1);
		    },
		    'mouseenter': function(e) {
		    	el.fade('in');
		    },
		    'mouseleave': function(e) {
		    	if(!el.hasClass('active')) {
		    		el.fade(opacity);
		    	}	
		    }	
		  });
		
		});
		
		if(this.args.showNav != true || slideNav.length < 2) {
			$(this.args.navContainer).setStyle('display', 'none');
		}
		
	}, 
	
	active: function(j) {
		el = this.slideNav[j];
		for(var i = 0; i < this.slideNav.length; i++) {
			this.slideNav[i].removeClass('active');
			this.slideNav[i].setStyle('opacity', this.opacity);
		}
		el.addClass('active');
		el.setStyle('opacity', 1);
		//el.fade('in');	
	}

});

var Deets = new Class({

	initialize: function(wrapper, targets) {
		
		var els = $(wrapper).getElements(targets);
		els.each(function(el, i) {
			el.removeClass('nojs');
			el.getElement('dl').setStyle('display', 'block');
			el.getElement('dl').fade('hide');
			el.addEvents({
				'mouseenter': function(e) {
					el.getElement('dl').fade(0.99999);
				},
				'mouseleave': function(e) {
					el.getElement('dl').fade('out');
				}
			
			});
		});
	
	}

});


// Set external links to target = '_blank'
var External = new Class({

	initialize: function(lnks) {
		var els = $$(lnks);	
		for (var i = 0; i < els.length; i++) {
			els[i].setProperty('target', '_blank');
		}
	}

});

var Tooltips = new Class({
	initialize: function(els) {
		var tips = new Tips(els,{
						className: 'tipsy',
						//fixed: true,
						hideDelay: 50,
						showDelay: 50,
						offset: {'x': -180, 'y': -15}
					});
		
		tips.addEvents({
			'show': function(e) {
				e.fade(0.9);
			},
			'hide': function(e) {
				e.fade('out');
			}
		});						
	}
});


window.addEvent('domready', function() {
    var gatrackevents = new GATrackEvents('a');
    var external = new External('ul.external-links a, a[rel~=external], ul.tweets li a');
    var slidearea = new SlideArea('body#home div.releases');
	var infieldlabel = new InFieldLabel('newsletter-signup');
	if($('shows-table')) {
		/*var table = new HtmlTable($('shows-table'), {
		        sortIndex: null,
		        sortable: true
		        });
		*/
		var filters = new KCreateShowFilters({filter:'show-filter', triggers: 'div#show-filter a'});	
	}
	if($('releases')) {
		var releaseDeets = new Deets('releases', 'a.cover');
	}
	if($('all-artists')) {
		var artistDeets = new Deets('all-artists', 'a.cover');
	}
	
	var tooltips = new Tooltips('ul.discography-thumbs li img[title]');
	
	var moozoom = new MooZoom({
		duration: 200,
		linkSelector: 'a.zoom',
		imageRoot: rootTemplateVirtual + "/_img/misc/"
	});
	
	if($('billboard-wrapper')) {
		var slides = new Slides({wrapper: 'billboard-wrapper', target: 'billboard', navContainer: 'billboard-nav', navItems: '#billboard-nav li img', showNav: true});
	}
	
	if($('artist-billboard-wrapper')) {
		var slides = new Slides({wrapper: 'artist-billboard-wrapper', target: 'artist-billboard', navContainer: 'artist-billboard-nav', navItems: '#artist-billboard-nav li img', showNav: true});
	}
			
	
});
