/* Nick Harvey (holding page)
*  global.js
*  Main site javascript
*  Author: l.barker, london
*  Date: 12-2009 */

var FlashVersion = 10;

var correctSafariTabbing = function(){
	if (document.id('skip-nav')) {
		document.id('skip-nav').addEvents({
			'focus': function(){document.id('skip-nav').setStyle('left', '0')},
			'blur': function(){document.id('skip-nav').setStyle('left', '-10000px')},
			'click': function(){
				if ((navigator.appVersion).match(/safari/i)) {
					var hrf = document.id('skip-nav').getProperty('href');
					if (hrf.indexOf('#') == 0) hrf = hrf.substring(1, hrf.length);
					if (!document.id('faux-target')) {
						var a = new Element('a').setStyles({position: 'absolute', left: '-10000px'
						}).set('html', '&nbsp;').setProperties({
							id: 'faux-target', title: 'Entered main content of page', href: ''}).injectTop(document.id(hrf));
					}
					document.id('faux-target').focus();
				}
			}
		});
	}
	
	if ((navigator.appVersion).match(/safari/i)) {
		$$('.target-top').each(function(e){
			e.addEvent('click', function(){
				if (!document.id('faux-target-top')) {
					var a = new Element('a').setStyles({position: 'absolute', left: '-10000px'
					}).set('html', '&nbsp;').setProperties({
						id: 'faux-target-top', title: 'Top of the page', href: ''
					}).injectTop(document.id('top'));
				}
				document.id('faux-target-top').focus();
			});
		});
	}
};



var Utilities = new Class({
	Implements:[Log],
		ErrorHelper: function(errorObject) {
		/* Object Schema
		* errorObject : {
		* 	method:"MyClass : myFunction()", // string to help you identify which js file and function caused the error
		* 	error:e // the captured error object
		* }
		*/
		if (errorObject.error instanceof TypeError) {
			this.log("JS ERROR : "+errorObject.method+" : TypeError; the type of a variable is not as expected : "+errorObject.error.message);
		} else if (errorObject.error instanceof RangeError) {
			this.log("JS ERROR : "+errorObject.method+" : RangeError; numeric variable has exceeded its allowed range : "+errorObject.error.message);
		} else if (errorObject.error instanceof SyntaxError) {
			this.log("JS ERROR : "+errorObject.method+" : SyntaxError; syntax error occurred while parsing : "+errorObject.error.message);
		} else if (errorObject.error instanceof ReferenceError) {
			this.log("JS ERROR : "+errorObject.method+" : ReferenceError; invalid reference used : "+errorObject.error.message);
		} else {
			this.log("JS ERROR : "+errorObject.method+" : Unidentified Error Type : "+errorObject.error.message);
		}
	}
});



var TargetBlankReplacement = new Class({
	// call <a href="http://www.website-url.com" title="A title" rel="external">Link text</a>
	Implements: [Utilities,Options],
	options: {
		warning: 'Opens in a new window',
		warningseparator: ': '
	},
	initialize: function(options){
		try {
			this.setOptions(options);
			$$('a[rel*="external"]').each(function(a) {
				var title = '';
				(a.getProperty('title') != null) ? title = a.getProperty('title') + this.options.warningseparator + this.options.warning.toLowerCase() : title = this.options.warning;
				a.setProperties({
					'title':  title,
					'target': '_blank'
				});
			}, this);	
		} catch(e) {
			this.ErrorHelper({method:"TargetBlankReplacement Class : initialize()", error:e});
		}
	}
});


var FlashUpdateWarning = new Class({
	Implements: [Utilities, Options],
	options: {
		id: 'flash-warning',
		css: 'warning',
		version: FlashVersion,
		warning: '<p>In order to play examples my recent work, you will need to download the latest version of the Adobe Flash Player. <a href="http://get.adobe.com/flashplayer/" title="Flash download: opens in a new window" target="_blank">Download the Flash Player</a> and follow the instructions.</p>',
		inject: {
			el: null,
			loc: null
		}
	},
	initialize: function(options){
		try {
			this.setOptions(options);
			if (Browser.Plugins.Flash.version == 0 || Browser.Plugins.Flash.version < this.options.version) {
				var div = new Element('div', {
					'id': this.options.id,
					'class': this.options.css,
					'html': this.options.warning
				}).inject(this.options.inject.el, this.options.inject.loc);
			}
		} catch(e) {
			this.ErrorHelper({method:"FlashUpdateWarning Class : initialize()", error:e});
		}
	}
});



var MP3Player = new Class({
	Implements: [Utilities, Options],
	options: {
		container: null,
		id: null,
		version: FlashVersion,
		width: 278,
		height: 146,
		params:{
			bgcolor: '#fff',
			play:'false', 
			loop:'false', 
			quality:'high', 
			wmode:'opaque', 
			allowfullscreen:'false', 
			allowscriptaccess:'sameDomain',
			pluginspage: 'http://get.adobe.com/flashplayer/'	
		},
		flashvars: {
			file: null,
			duration: 0,
			skin: 'static/swf/mediaplayer/skins/beelden/beelden.xml',
			screencolor: '#fff',
			stretching: 'none',
			controlbar: {
				position: 'bottom'	
			}
		}
	},
	initialize: function(options){
		try {
			this.setOptions(options);
			this.container = document.id(this.options.container);
			
			// check/alert all compulsory attributes exist
			if(!this.container) alert('One of the MP3Player\'s container id names is missing!');
			if(!this.options.flashvars.file) alert('One of the MP3Player\'s mp3 filepath/filenames is missing!');
			if(!this.container.getElement('img')) alert('One of the MP3Player\'s images is missing from the HTML!');

			if (Browser.Plugins.Flash.version >= this.options.version) {
				
				this.container.setStyle('visibility', 'hidden');
				
				var flashvars = 'file=' + this.options.flashvars.file;
				flashvars+='&duration=' + this.options.flashvars.duration;
				flashvars+='&image=' + this.container.getElement('img').getProperty('src');
				flashvars+='&skin=' + this.options.flashvars.skin;
				flashvars+='&stretching=' + this.options.flashvars.stretching;
				flashvars+='&screencolor=' + this.options.flashvars.screencolor;
				flashvars+='&controlbar.position=' + this.options.flashvars.controlbar.position;
				
				this.obj = new Swiff('static/swf/mediaplayer/player.swf', {
	                container: this.container,
	                id: 'mp3-' + this.options.container, 
					width: this.options.width, 
					height: this.options.height,
	                params: {
						bgcolor: this.options.params.bgcolor,
						play:this.options.params.play, 
						loop:this.options.params.loop, 
						quality:this.options.params.quality, 
						wmode:this.options.params.wmode, 
						allowfullscreen:this.options.params.allowfullscreen, 
						allowscriptaccess:this.options.params.allowscriptaccess,
						pluginspage: this.options.params.pluginspage,
						flashvars: flashvars
					}
	            });
	
				window.addEvent('load', function(){
					this.container.setStyle('visibility', 'visible');
				}.bind(this));
			}

		} catch(e) {
			this.ErrorHelper({method:"MP3Player Class : initialize()", error:e});
		}
		
	
	}
});



window.addEvents({
	'domready': function(){
		new Asset.css('static/css/js.css');
		correctSafariTabbing();
		new FlashUpdateWarning({inject: {el: document.id(document.body).getElement('.recent-work h2'), loc: 'after'}});
		var replaceRelExternal = new TargetBlankReplacement();
	}
});
