/*
BASIS STRUCTUUR VOOR EEN SWITCHER:

<div class="switch">
	<div class="switchImage floatl">
		
	</div>
	<div class="floatl">
		<div class="switchHeader">
			
		</div>
		<div class="switchContent">
			<div class="switchButtons switch24 mtop20">
				
			</div>
		</div>
	</div>
</div>

*/
var Switcher = function(element) {
	var _self = this;
	
	var _element = null;
			
	var _imageElement = null;
	var _headerElement = null;
	var _contentElement = null;
	var _buttonElement = null;
	
	var _pointer = 0;
	
	var _clickable = false;
	var _paused = false;
	
	var _delay = 5000;
	var _animate = 200;
	
	var _interval = null;
	var _autoRotation = true;
	
	var _images = [];
	var _headers = [];
	var _contents = [];
	
	var _setInterval = function() {
		_interval = setInterval(function() {_iteration();}, _delay);
	};
	var _unsetInterval = function() {
		clearInterval(_interval);
	};
	var _resetInterval = function() {
		_unsetInterval();
		_setInterval();
	};
	
	var _handleImage = function(index) {
		if(!_imageElement.length) {
			return false;
		}
		
		var halfTime = (parseInt(_animate)/2);
		
		if(_images[index] !== false) {
			var imageCollection = $(_images[index]);
			
			if(_imageElement.find('img').length) {
				_imageElement.contents().animate({
					left : '-'+_imageElement.find('img').width()
				},halfTime, function() {
					_imageElement.empty().prepend(imageCollection);
					
					if(imageCollection.length) {
						imageCollection.css('left', '-'+imageCollection.width()+'px');
						imageCollection.css('position', 'relative');
						imageCollection.animate({
							left : '0px'
						}, halfTime);
					}
				});
			}
			else {
				_imageElement.prepend(imageCollection);
				imageCollection.css('left', '-'+imageCollection.width()+'px');
				imageCollection.css('position', 'relative');
				imageCollection.animate({
					left : '0px'
				}, halfTime);
			}
		}
		else {
			_imageElement.find('img').fadeOut(halfTime, function() {
				_imageElement.empty();
			});
		}
		
		return true;
	};
	var _handleHeader = function(index) {
		if(_headers[index] === false) {
			return false;
		}
		if(!_headerElement.length) {
			return false;
		}
		
		var halfTime = (parseInt(_animate)/2);
		var headerCollection = $(_headers[index]);
		
		_headerElement.fadeOut(halfTime, function(){
			_headerElement.empty().prepend(headerCollection);
			
			_headerElement.fadeIn(halfTime);	
		});
		
		return true;
	};
	var _handleContent = function(index) {
		if(!_contentElement.length) {
			return false;
		}
		if(_contents[index] === false) {
			return false;
		}
		
		var halfTime = (parseInt(_animate)/2);
		
		var contentCollection = $(_contents[index]);
		
		_contentElement.fadeOut(halfTime, function() {
			_contentElement.children(':not(.switchButtons)').remove();
			_contentElement.prepend(contentCollection);
			_contentElement.fadeIn(halfTime);
		});
		
		return true;
	};
	
	var _switchTo = function(index) {
		_clickable = false;
		
		_buttonElement.find('.switchButton').removeClass('greenButton24inactive').removeClass('greenButton24active').addClass('greenButton24inactive');
		_buttonElement.find('.switchIndex_'+index).removeClass('greenButton24inactive').addClass('greenButton24active');
		
		_handleImage(index);
		_handleHeader(index);
		_handleContent(index);
		
		setTimeout(function() {
			_clickable = true;
		}, _animate);
	};
	
	var _advancePointer = function() {
		if(_pointer < (_contents.length-1)) {
			_pointer++;
		}
		else {
			_pointer = 0;
		}
	};
	
	var _bind = function() {
		_buttonElement.find('.switchButton').bind("click", function() {
			if(_clickable) {
				var button = $(this);
				var destinationIndex = button.attr("class").split(" ");
				
				for(var i = 0;i < destinationIndex.length;i++) {
					if(destinationIndex[i].indexOf('switchIndex_') != '-1') {
						destinationIndex = parseInt(destinationIndex[i].split("_")[1]);
					}
				}
				
				_switchTo(destinationIndex);
				_pointer = destinationIndex;
				
				if(_autoRotation) {
					_resetInterval();
				}
			}
			return false;
		});
	};
	var _unbind = function() {
		_buttonElement.find('.switchButton').unbind("click");
	};
	
	
	var _emptyContainers = function() {
		if(_images.length) {
			_imageElement.empty();
		}
		
		if(_headers.length) {
			_headerElement.empty();
		}
		
		if(_contents.length) {
			_contentElement.children(':not(.switchButtons)').remove();
		}
	};
	
	var _iteration = function() {
		_advancePointer();
		_switchTo(_pointer);
	};
	var __construct = function(element) {
		if(typeof element != "object") {
			throw "Invalid argument: element value must contain a jQuery element with a switch class";
		}
		
		if(element.length > 0 && element.hasClass('switch')) {
			_element = element;
		}
		
		else if(element.length == 0) {
			throw "Invalid argument: required switch element could not be found.";
		}
		else if(!element.hasClass('switch')) {
			throw "Invalid argument: required switch element does not contain the required CSS switch class.";
		}
		else {
			throw "Invalid argument: element";
		}
		
		if(element.find('.switchContent').length == 0) {
			throw "Runtime exception: element does not contain required switchContent element.";
		}
		
		_imageElement = _element.find('.switchImage');
		_headerElement = _element.find('.switchHeader');
		_contentElement = _element.find('.switchContent');
		_buttonElement = _element.find('.switchButtons');
		
		if(_buttonElement.length) {
			_buttonElement.empty();
		}
	};
	this.initialize = function(autoRotation) {
		_switchTo(0);
		
		if(autoRotation) {
			_interval = setInterval(function() {_iteration();}, _delay);
		}
		
		_autoRotation = autoRotation;
	};
	this.add = function(image, header, content) {
		if(typeof image == "undefined" || image === null) {
			throw "Invalid argument: image value must contain an image or false value.";
		}
		
		if(typeof header != "string") {
			throw "Invalid argument: header value must contain a string or false value.";
		}
		
		if(typeof content != "string") {
			throw "Invalid argument: content value must contain string or false value.";
		}
		
		_unbind();
		
		_images.push(image);
		_headers.push(header);
		_contents.push(content);
		
		_emptyContainers();
		
		var buttonMargin = "";
		
		if(_contents.length > 1) {
			buttonMargin = "ml10";
		}
		
		_buttonElement.append('<a href="#" class="greenButton24 '+buttonMargin+' greenButton24inactive switchIndex_'+(_contents.length-1)+' switchButton"></a>');
		
		_bind();
	};
	this.settings = function(settings) {
		var isObject = false;
		
		if(settings instanceof Object) {
			isObject = true;
		}
		
		if(isObject) {
			for(var prop in settings) {
				switch(prop) {
					case "delay":
						_delay = settings[prop];
					break;
					case "animation":
						_animate = settings[prop];
					break;
				}
			}
			
			return true;
		}
		
		return false;
	};
	
	this.setAnimation = function(ms) {
		_animate = ms;
	};
	this.getAnimation = function() {
		return _animate;
	};
	
	this.setDelay = function(ms) {
		_delay = ms;
	};
	this.getDelay = function() {
		return _delay;
	};
	
	this.getPaused = function() {
		return _paused;
	};
	
	this.getElement = function() {
		return _element;
	};
	
	this.pause = function() {
		if(!_paused) {
			_unsetInterval();
			_clickable = false;
			_paused = true;
		}
	};
	this.resume = function() {
		if(_paused) {
			_setInterval();
			_clickable = true;
			_paused = false;
		}
	};
	
	__construct(element);
};
