var OreTownItem = function(owner, title, description, url, imageurl, defaultzindex) {
	this.owner = owner;
	this.title = title;
	this.description = description;
	this.url = url;
	this.imageUrl = imageurl;
	
	var self = this;
	var element = $('<div class="item"></div>');
	var image = null;
	var titleBarContainer = null;
	var titleBarBackground = null;
	var titleBarTextHeadline = null;
	var titleBarTextDescription = null;
	
	if (defaultzindex)
		element.css('zIndex', defaultzindex);
	
	//
	// apply css
	element.css({
		width: this.owner.width,
		height: this.owner.height
	});
	
	var createImage = function() {
		image = $('<img />');
		image.attr({
			src: imageurl,
			//alt: title,
			//title: title,
			width: self.owner.width,
			height: self.owner.height
		});
	}
	
	var createTitleBarContainer = function() {
		titleBarContainer = $('<div />');
		titleBarContainer.css({
			position: 'absolute',
			bottom: 0,
			left: 0,
			width: self.owner.width,
			height: 80
		});
	}
	
	var createTitleBarBackground = function() {
		titleBarBackground = $('<div />');
		titleBarBackground.css({
			position: 'absolute',
			top: 0,
			left: 0,
			width: self.owner.width,
			height: 80,
			backgroundColor: '#000',
			opacity: .6
		});
	}
	
	var createTitleBarText = function() {
		titleBarTextHeadline = $('<h1 />');
		titleBarTextHeadline.text(self.title);
		
		titleBarTextDescription = $('<p />');
		titleBarTextDescription.text(self.description);
	}
	
	this.write = function() {
		//
		// now create some stuff
		createImage();
		createTitleBarContainer();
		createTitleBarBackground();
		createTitleBarText();
		
		//
		// and append it to the element
		titleBarContainer.append(titleBarBackground);
		titleBarContainer.append(titleBarTextHeadline);
		titleBarContainer.append(titleBarTextDescription);
		
		element.append(image);
		element.append(titleBarContainer);
		
		
		//
		// and then append element to writeObject
		self.owner._appendToWriteObject(element);
	};
	
	this.imageWidth = function() {
		return image.width();
	}
	
	this.imageHeight = function() {
		return image.height();
	}
	
	this.setZIndex = function(zIndex) {
		element.css('zIndex', zIndex);
	}
	
	this.fadeIn = function(speed, callback) {
		element.fadeIn(speed, callback);
	}
	
	this.fadeOut = function(speed, callback) {
		element.fadeOut(speed, callback);
	}
	
	this.hide = function() {
		element.hide();
	}
	
	this.show = function() {
		element.show();
	}
};

var OreTownImageMarkers = function(owner) {
	var self = this;
	var element = $('<div class="image-markers" />');
	var markers = [];
	var _imageUrl = 'http://sweden.engcon.com/images/18.1161b3221301c286c4e8000350/prick.png';
	var _useBreakPoints = false;
	var _breakPointSize = 15;
	
	this.owner = owner;
	this.owner._appendToWriteObject(element);
	
	this.useBreakPoints = function(breakPointSize) {
		_useBreakPoints = true;
		_breakPointSize = breakPointSize; 
	}
	
	this.addMarker = function() {
		var marker = $('<img />');
		marker.attr('src', _imageUrl);
		marker.css('opacity', .3);
		marker.addClass('not-active');
		
		if (_useBreakPoints && markers.length % _breakPointSize == 0 && markers.length != 0)
			element.append('<br />');
		
		element.append(marker);
		markers.push(marker);
	};
	
	this.setActiveMarker = function(index) {
		element.find('.active').fadeTo('slow', .3).removeClass('active');
		markers[index].addClass('active').fadeTo('slow', 1);
	}
}

var SWFObject = function(dummy, name, width, height) {
	if (typeof width == 'string')
		width = parseInt(width);
		
	if (typeof height == 'string')
		height = parseInt(height);
		
	var self = this;
	var variables = {};
	var items = [];
	var writeObject = null;
	var currentIndex = 0;
	var markers = null;
	var interval = null;
	var animationQueue = 0;
	//var adCheckUrl = '/4.36260c9c12f2741385780004709.Adcheck.portlet';
	var buttonUrl = 'http://sweden.engcon.com/images/18.1161b3221301c286c4e8000321/readmore.png';
	
	//
	// some timeings.
	
	var adFirstTimeout = 5000;
	var adTimeout = 15000;
	var adHideTimout = 5000;
	var isFirstAd = true;
	
	var btnNext = null;
	var btnPrev = null;
	var btnReadMore = null;
	
	var imgNextThumb = null;
	var imgPrevThumb = null;
	
	var adContainer = null;
	
	this.width = 590;
	this.height = 384;
	
	//
	// add some dummies
	this.addParam = function() {}
	
	this.addVariable = function(key, value) {
		variables[key] = value;
	}
	
	this._appendToWriteObject = function(data) {
		writeObject.append(data);
	}
	
	var _addAdContainer = function() {
		adContainer = $('<div class="ad-container" />');
		
		writeObject.append(adContainer);
	};
	
	var _loadAd = function() {
		$.get(adCheckUrl, _adLoaded);
	}
	
	var _adLoaded = function(adContent) {
		if (adContent == '')
			return;
			
		adContainer.html('<div class="ad-content">' + adContent + '</div>');
		
		var showTime = adTimeout;
		if (isFirstAd) {
			showTime = adFirstTimeout;
			isFirstAd = false;
		}
		
		setTimeout(_showAd, showTime)
	};
	
	var _showAd = function() {
		adContainer.animate({top: 1}, 1000, 'easeOutBounce', function() {
			setTimeout(_hideAd, adHideTimout);
		});
	}
	
	var _hideAd = function() {
		adContainer.animate({top: 418}, 500, 'easeInExpo', function() {
			adContainer.css('top', -400);
			_loadAd();
		});
	}
	
	var _addButtons = function() {
		btnNext = $('<a href="#" id="btnNext" />');
		btnPrev = $('<a href="#" id="btnPrev" />');
		
		btnNext.css({
			opacity: 0
		});
		
		btnPrev.css({
			opacity: 0
		});
		
		writeObject.append(btnNext);
		writeObject.append(btnPrev);
		
		btnNext.click(btnNext_Click);
		btnPrev.click(btnPrev_Click);
		
		btnNext.hover(_buttonMouseOver, _buttonMouseOut);
		btnPrev.hover(_buttonMouseOver, _buttonMouseOut);
		
		imgNextThumb = $('<img />');
		imgPrevThumb = $('<img />');
		
		btnNext.append(imgNextThumb);
		btnPrev.append(imgPrevThumb);
		
		//
		// read more button
		btnReadMore = $('<a href="#" class="readmore"><img src="' + buttonUrl + '" alt="Läs mer" /></a>');
		writeObject.append(btnReadMore);
		btnReadMore.click(btnReadMode_Click);
	}
	
	this.write = function(id) {
		writeObject = $('#' + id);
		writeObject.css({
			width: width,
			height: height,
			overflow: 'hidden',
			position: 'relative'
		}).addClass('bildspel');
		
		var html = '';
		if (!variables['url'])
			html += 'Variable <strong>url</strong> missing!';
		
		
		writeObject.html(html);
		markers = new OreTownImageMarkers(self);
		
		//
		// add buttons
		
		_addButtons();
		
		if (variables['url']) {
			$.get(variables.url, _feedReceived);
		}
	}
	
	var _buttonMouseOver = function(e) {
		var target = e.target;
		if (target.tagName != 'A')
			target = $(target).parent();
			
		var btn = $(target);
		btn.stop();
		btn.fadeTo('fast', 1);
	}
	
	var _buttonMouseOut = function(e) {
		var target = e.target;
		if (target.tagName != 'A')
			target = $(target).parent();
			
		var btn = $(target);
		btn.stop();
		btn.fadeTo('fast', 0);
	}
	
	
	
	var _gotoImage = function(nextIndex) {
		if (animationQueue > 0)
			return;
			
			
		var next = items[nextIndex];
		var current = items[currentIndex];
		
		next.setZIndex(1);
		current.setZIndex(2);
		next.hide();
		
		markers.setActiveMarker(nextIndex);
		animationQueue += 2;
		
		
		setTimeout(_renderNextPrevThumbs, 200);
		next.fadeIn('slow', function() { animationQueue--; });
		current.fadeOut('slow', function() { animationQueue--; });
		currentIndex = nextIndex;
	}
	
	var _nextImage = function() {
		
		var nextIndex = currentIndex + 1;
		if (nextIndex >= items.length)
			nextIndex = 0;
			
		_gotoImage(nextIndex);
		
	}
	
	var btnReadMode_Click = function() {
		window.location.href = items[currentIndex].url;
	}
	
	var btnNext_Click = function() {
		clearInterval(interval);
		_nextImage();
		
		return false;
	}
	
	var btnPrev_Click = function() {
		clearInterval(interval);
		
		var prevIndex = currentIndex - 1;
		if (prevIndex < 0) {
			prevIndex = items.length - 1;
		}
		
		_gotoImage(prevIndex);
		return false;
	}
	
	var _renderNextPrevThumbsFailedAtempts = 0;
	var _renderNextPrevThumbs = function() {
		var calculateWidth = function(width, height) {
			var ratio = width / height;
			return 38 * ratio;
		};
		
		var prevIndex = currentIndex - 1;
		if (prevIndex < 0) {
			prevIndex = items.length - 1;
		}
		
		var nextIndex = currentIndex + 1;
		if (nextIndex >= items.length) {
			nextIndex = 0;
		}
		
		var next = items[nextIndex];
		var prev = items[prevIndex];
		
		//
		// om vi inte får tag på bildens bredd/höjd så vänta 500 ms och försök igen
		/*if (prev.imageWidth() == 0 || prev.imageHeight() == 0 || next.imageHeight() == 0 || next.imageWidth() == 0) {
			_renderNextPrevThumbsFailedAtempts++;
			if( _renderNextPrevThumbsFailedAtempts == 20) {
				console.log('Avbryter.');
				_renderNextPrevThumbsFailedAtempts = 0;
				return;
			}
			
			setTimeout(_renderNextPrevThumbs, 500);
			return;
		}*/
		
		_renderNextPrevThumbsFailedAtempts = 0;
		imgNextThumb.attr({
			src: next.imageUrl,
			height: 38,
			width: 58
		});
		
		imgPrevThumb.attr({
			src: prev.imageUrl,
			height: 38,
			width: 58
		});
		
	}
	
	//
	// private 
	var _feedReceived = function(feed) {
		feed = $(feed);
		
		var tmpItems = feed.find('item');
		var feedItems = [];
		for (var i = 0; i < tmpItems.length; i++)
			feedItems.push(tmpItems.eq(i));
		
		//
		// sort by random...
		feedItems.sort(function() { 
			var rand = Math.floor((Math.random() * 3) - 1);
			return rand;
		});
		
		if (feedItems.length > 15)
			markers.useBreakPoints(Math.ceil(Math.min(feedItems.length, 40) / 2));
			
		for (var i = 0; i < feedItems.length && i < 40; i++) {
			var feedItem = feedItems[i];
			var imageurl = feedItem.find('enclosure').attr('url');
			var url = feedItem.find('link').text();
			var desc = feedItem.find('description').text();
			var title = feedItem.find('title').text();
			
			var item = new OreTownItem(self, title, desc, url, imageurl, (feedItems.length + 10) - i);
			items.push(item);
			
			markers.addMarker();
			
			//
			// write out and hide all but first.
			item.write();
			if (i > 0) {
				item.hide();
			} else {
				markers.setActiveMarker(0);
			}
		}
		if (items.length > 1) {
		_renderNextPrevThumbs();
		
		interval = setInterval(_nextImage, 6000);
		}
		else {
			$("#btnPrev").hide();
			$("#btnNext").hide();
			$(".image-markers").hide();
			
		}
		//
		// add
		
	}
	
};
