BrowserShots = function (textElements, options) {
	
	var self = this;
	
	this.defaultUrl = '< Ihre URL >';
	
	var textElems = jQuery.extend({
		error : {
				wrongUrl : 'URL ist ungültig. Geben sie eine Gültige ein',
				serviceUnavail : 'Browser-Check ist zur Zeit nicht erreichbar. Bitte versuchen Sie es später erneut',
				unknown : 'Ein unbekannter Fehler ist aufgetreten. Bitte versuchen Sie es später erneut.',
				timeoutXmlRpc : 'Timeout xmlrpc-server'	
			},
			
		sidebar : {
				requestStarted : ' Der Browser-Check kann einige Minuten dauern. Ein Infokasten informiert Sie über den Status.</strong>',
				requestFinished : 'Der Browser-Check ist fertig.',
				cancelButton : 'Neue URL eingeben'
				
		},
		labelLoaderStatus : 'Ladefortschritt Browser-Check',
		labelDownloadZip : 'Browser-Check in Originalauflösung als ZIP-Datei runterladen'
	}, textElements);
	
	this.browsershots;
	this.currentURL;
	
	this.loadInfoIsClosed = false;
	
	this.settings = jQuery.extend(
		{
			action : 'index.php?eID=tandem_browsershots_ajax',
			resultsPage : 'index.php?id=52',
			
			cookiePath : '/',
			
			resultsPageNav :'#Navigation ul > li > ul > li > ul li:contains(Browser-Check)',
						
			getStatusPause : '10s',
			sizes: ['original','512','160'],
			
			formElem : '#BrowserShotsSidebar',
			resultsContainer : '.tx-tandembrowsershots-pi2',
			
			beforeSubmitUrl : function () {
				jQuery('#BrowserShotsSideBar .red').hide();
				jQuery('#BrowserShotsSideBar').block();
			},
			
			afterSubmitUrl : function() {
				document.location = document.location.protocol + '//' + document.location.host + '/' + self.settings.resultsPage;
			},
			
			afterSubmitUrlError : function (error) {
				jQuery('#BrowserShotsSideBar').unblock();
				jQuery('#BrowserShotsSideBar .red').empty();
				
				switch (error.code) {
					case 1001: 
						$('#BrowserShotsSideBar .red').append(textElems.error.wrongUrl);
						break;
					case 1002:
					case 1010:
						$('#BrowserShotsSideBar .red').append(textElems.error.serviceUnavail);
						break;
					default:
						$('#BrowserShotsSideBar .red').append(textElems.error.unknown);
						break;
				}
				
				jQuery('#BrowserShotsSideBar .red').show();
			},
			
			afterGetStatus : function() {
				if (parseInt(jQuery.cookie('tandem_browsershots_finished')) != 1) {
					jQuery('#BrowserShotsResults .info').html(textElems.sidebar.requestStarted);
					jQuery(document).stopTime().oneTime(self.settings.getStatusPause, self.getStatus);
				}
				else {
					jQuery('#BrowserShotsResults .info').html(textElems.sidebar.requestFinished);
				}
				
				if (typeof self.browsershots != 'undefined' && jQuery('#BrowserShotsResults p.download').not(':empty')) {
					jQuery.each(self.browsershots, function(index, browsershot) {
						if (browsershot.status == 'uploaded') {
							jQuery('#BrowserShotsResults p.download').html('<a href="' + self.settings.action + '&action=getzip' + '">' + textElems.labelDownloadZip + '</a>');
							return false;
						}
					});
				}
			},
						
			thumbnailMouseOver : function(event) {},
			
			thumbnailMouseOut : function(event) {},
			
			removeSubmitForm : function() {
				$('#BrowserShotsSideBar input[type=submit], #BrowserShotsSideBar input[type=text]').hide();
					
				$('#BrowserShotsSideBar .red').empty();
				if (jQuery.cookie('tandem_browsershots_finished') != 1) {
					$('#BrowserShotsSideBar .red').append(textElems.sidebar.requestStarted);
				}
				else {
					$('#BrowserShotsSideBar .red').append('<a href="' + self.settings.resultsPage + '">' + textElems.sidebar.requestFinished +'</a>');
				}
					
				$('#BrowserShotsSideBar').append('<input class="los" id="CancelBrowserShot" type="button" value="' + textElems.sidebar.cancelButton + '" />');
					
				$('#CancelBrowserShot').click(function(event){
					event.preventDefault();
					$(this).remove();
					$('#BrowserShotsSideBar .red').empty();
					$('#BrowserShotsSideBar input[type=submit], #BrowserShotsSideBar input[type=text]').show();
					self.reset();
				});
			}			
		}, options
	);
	
	this.submitUrl = function (url) {
		if (jQuery.cookie('tandem_browsershots_groupid') == null) {
			self.settings.beforeSubmitUrl();
			jQuery.post(self.settings.action, {url:url}, function(data) {
				if (typeof data.groupId == 'number') {
					jQuery.cookie('tandem_browsershots_groupid', data.groupId, {path : self.settings.cookiePath});
					self.settings.afterSubmitUrl();
				}
				else if (data.length == 0) {
					self.settings.afterSubmitUrlError({code:1010,message:textElems.error.timeoutXmlRpc});
				}
				else if (data.error) {
					self.settings.afterSubmitUrlError(data.error);
				}
			}, 'json');
		}
	}
	
	this.getStatus = function () {
		var groupId = jQuery.cookie('tandem_browsershots_groupid');
		if (groupId != null) {
			jQuery.getJSON(self.settings.action, function(data){
				if (data.browsershots) {
					self.browsershots = jQuery.extend(true, self.browsershots, data.browsershots);
					self.currentURL = data.url;
					self.checkBrowserShots();
					self.buildLoader('#ColRight');
					self.updateResults();
				}
				self.settings.afterGetStatus();				
			});
		}
	}
	
	this.checkBrowserShots = function () {
		var allUploaded = 1;
		jQuery.each(self.browsershots, function(key, browsershot){
			if (browsershot.status != 'uploaded') {	
				allUploaded = 0;
			}
		});
		self.updateResults();
		jQuery.cookie('tandem_browsershots_finished', allUploaded, {path : self.settings.cookiePath});
	}
	
	this.reset = function () {
		jQuery('#BrowserShotsSideBar').block();
		jQuery.post(self.settings.action, {action: 'reset'}, function(data, textStatus) {
			if (textStatus == 'success') {
				jQuery.cookie('tandem_browsershots_groupid', null, {path : self.settings.cookiePath});
				jQuery.cookie('tandem_browsershots_finished', null, {path : self.settings.cookiePath});
				jQuery.cookie('tandem_browsershots_loader_position', null, {path : self.settings.cookiePath});
				this.browsershots = null;
				jQuery('#BrowserShotsResults').remove();
				jQuery('.LoadInfo').remove();
				jQuery(bs.settings.resultsPageNav).hide();
			}
			
			jQuery('#BrowserShotsSideBar').unblock();
		});
	}
	
	this.buildLoader = function () {
		var loadingStatus = self.getLoadingStatus();
		
		if (!self.LoadInfoIsClosed || (loadingStatus == 100 && jQuery(self.settings.resultsContainer).length == 0)) {
			
			var selector = 'body';
			var loaderHtml = '';
			var lastLoaderPos =  jQuery.parseJSON(jQuery.cookie('tandem_browsershots_loader_position'));
			
			var isResized = false;
			
			if (jQuery('.LoadInfo').length == 0 ) {
				$loaderHtml = jQuery('<div class="LoadInfo">' +
					'<div><a class="closeButton" href="#">x</a></div>' +
					'<h2 class="clear-right"><a href="' + self.settings.resultsPage +'">' + loadingStatus + ' %</a></h2>' +
					'<p>' + textElems.labelLoaderStatus + '</p>' +
				'</div>');
				
				jQuery(selector).append($loaderHtml);				
				jQuery('.LoadInfo')
					.css(lastLoaderPos != null ? lastLoaderPos : {
						left: jQuery('#Page').innerWidth() + jQuery('#Page').offset()['left'] - $('.LoadInfo').outerWidth(),
						top: jQuery('#Page').offset()['top']
					})
					.bind('drag', function(event){$(this).css({ top:event.offsetY, left:event.offsetX });})
					.bind('dragend', function(event){self.saveLoaderPosition(this)});
				
				jQuery('.LoadInfo a.closeButton').click(function(event) {
					event.preventDefault();
					self.LoadInfoIsClosed = true;
					jQuery('.LoadInfo').remove();
				});
				
				jQuery(window)
					.data('oldPageOffset', jQuery('#Page').offset())
					.data('oldWindowHeight', jQuery(window).height())
					.resize(function (event){
						if (!isResized) {
							isResized = true;
							var oldPageOffset = jQuery(window).data('oldPageOffset');
							var newPageOffset = jQuery('#Page').offset();
							
							var oldWindowHeight = jQuery(window).data('oldWindowHeight');
							var newWindowHeight = jQuery(window).height();
													
							var newPos = new Object();
							var loadInfoTopAndHeight = jQuery('.LoadInfo').position()['top'] + jQuery('.LoadInfo').height();
							
								
							if (oldPageOffset.left < newPageOffset.left) {
								newPos.left = '+=' + (newPageOffset.left - oldPageOffset.left);
							}
							else if (oldPageOffset.left > newPageOffset.left) {
								newPos.left = '-=' + (oldPageOffset.left - newPageOffset.left);
							}
							
							if (oldWindowHeight > newWindowHeight && newWindowHeight < loadInfoTopAndHeight) {
								diffHeight = oldWindowHeight - newWindowHeight;
								if (diffHeight < loadInfoTopAndHeight)
									newPos.top = '-=' + diffHeight;
								else
									newPos.top = 0;
							}
														
							jQuery(window).data('oldPageOffset', newPageOffset);
							jQuery(window).data('oldWindowHeight', newWindowHeight);
							jQuery('.LoadInfo').animate(newPos, function(){
								isResized = false;
								self.saveLoaderPosition(this);
							});
						}
					});
			} 
			else {
				jQuery('.LoadInfo h2 a').html(loadingStatus + ' %');
			}
			
		}
	}
	
	this.saveLoaderPosition = function (LoadInfoElem) {
		jQuery.cookie('tandem_browsershots_loader_position', $.toJSON($(LoadInfoElem).position()), {path: self.settings.cookiePath});
	}
	
	this.setupStatusInterval = function () {
		jQuery(document).everyTime(self.settings.interval, 'bsGetStatus',self.getStatus);
	}
	
	this.initResults = function () {
		if(jQuery(self.settings.resultsContainer).length > 0) { 
			jQuery(self.settings.resultsContainer).load('/?type=55');
		}
	}
	
	this.updateResults = function () {
		var resContainer = jQuery(self.settings.resultsContainer);
		jQuery(self.settings.resultsContainer + ' p.thumbload').html('für <strong>' + self.currentURL + '</strong>');
		
		if (resContainer.length > 0) {
			var groupId = jQuery.cookie('tandem_browsershots_groupid');
			jQuery.each(self.browsershots, function(index, browsershot){
				if (browsershot.status == 'uploaded' && $('#' + browsershot.hashkey).length == 0) {
										
					thumbAElem = resContainer.find('.' + browsershot.browser + ' a');
					thumbImgElem = resContainer.find('.' + browsershot.browser + ' img');
					
					self.loadBrowsershot(thumbImgElem, 'src', browsershot, '160');
					
					bsImgParams = {
						action : 'getscreenshot',
						hashkey : browsershot.hashkey,
						size : 'original',
						mode : 'display'
					};
					
					thumbAElem
						.attr({
							href : self.settings.action + '&' + jQuery.param(bsImgParams),
							rel : 'prettyPhoto',
							title : jQuery('.' + browsershot.browser + ' span').text(),
							id : browsershot.hashkey
						})
						.hover(self.settings.thumbnailMouseOver, self.settings.thumbnailMouseOut);
				}
			});
			
			
		}
	}
	
	 this.loadBrowsershot = function(jElem, attribute, browsershot, size) {
		var postParams = {
			action: 'getscreenshot',
			hashkey: browsershot.hashkey,
			size: size
		};
		jQuery.post(self.settings.action, postParams, function(data) {
			jElem.attr(attribute, data.screenshot);
		}, 'json');
	}
		
	this.getLoadingStatus = function() {
		var uploaded = 0;
		var total = 0;
		
		if (typeof self.browsershots == 'object') {
			jQuery.each(self.browsershots, function(index, browsershot) {
				total++;
				if (browsershot.status == 'uploaded') uploaded++;
			});
		}
		else return 0;
		
		return parseInt(Math.round((uploaded / total) * 100));
	}
	
}

jQuery(function(){
	
	if (typeof BrowserShots != 'undefined' && jQuery.isFunction(BrowserShots)) {
		
		var isFinshed = parseInt(jQuery.cookie('tandem_browsershots_finished'));
		var bsGroupId = jQuery.cookie('tandem_browsershots_groupid');		
		
		bs = new BrowserShots();
		
		if (bsGroupId != null) {
			bs.settings.removeSubmitForm();
			bs.initResults();
			bs.getStatus();
		}
		else {
			jQuery(bs.settings.resultsPageNav).hide();
		}
		
		if (jQuery('#BrowserShotsSideBar').length == 1) {
			$('#BrowserShotsSideBar form').submit(function(event) {
				event.preventDefault();
				bs.submitUrl($(this).find('input[type=text]').eq(0).val());
			});
					
			$('#BrowserShotsSideBar [type=text]').val(bs.defaultUrl).focus(function(event){
				if (this.value == bs.defaultUrl) this.value = '';
			})
			.blur(function(event) {
				if (this.value == '') this.value = bs.defaultUrl;
			});
		}
	}
});
