function clientDimensions()
{
	var w = 0;
	var h = 0;

	//IE
	if(!window.innerWidth)
	{
		//strict mode
		if(!(document.documentElement.clientWidth == 0))
		{
			w = document.documentElement.clientWidth;
			h = document.documentElement.clientHeight;
		}
		//quirks mode
		else
		{
			w = document.body.clientWidth;
			h = document.body.clientHeight;
		}
	}
	//w3c
	else
	{
		w = window.innerWidth;
		h = window.innerHeight;
	}
	return {width:w,height:h};
}

function extractLinkId(href) {
	if (href) {
		var slashPos = href.lastIndexOf('/');
		if (slashPos > 0 && slashPos < href.length + 1) {
			return href.substr(slashPos + 1);
		} else {
			return href;
		}
	}
	return 0;
}

function extractHref(href) {
	if (href) {
		var atPos = href.lastIndexOf('@');
		if (atPos >= 0 && atPos < href.length + 1) {
			return href.substr(atPos + 1);
		} else {
			return href;
		}
	}
	return 0;
}

function extractId(separator, sText) {
	if (sText) {
		var sepPos = sText.lastIndexOf(separator);
		if (sepPos > 0 && sepPos < sText.length + 1) {
			return sText.substr(sepPos + 1);
		} else {
			return sText;
		}
	}
	return 0;
}


function loadingOn(id, parentSel, empty, options) {
	if (!options) options = {};
	
	var useClass = (options.useClass) ? options.useClass : 'loading-img';
	var img = (options.img) ? options.img : 'loader_eye_left.gif';
	var loadingImg = $('<img/>').attr({'src' : appObj.baseUrl + 'img/' + img, 'id' : id, 'class' : useClass});
	var parentEl = $(parentSel);
	if (empty) {
		$(parentEl).empty();
	}
	
	if (img != 'none')
	{	
		if (options.prepend)
		{
			parentEl.prepend(loadingImg);
		} 
		else
		{
		parentEl.append(loadingImg);	
		}
	}
	
}

function loadingOff(id) {
	$(id).remove();
}	

function loadElement(customConfig) {
	var config = {
		selEl:'',
		url:'',
		data:null,
		loadId:'',
		scroll:false,
		extraSuccessCallback:null
	}

	for (var key in customConfig) {
		config[key] = customConfig[key];
	}	
	
	var type = (config.data) ? "POST" : "GET";
	
	var ajaxParams = {
		type:type,
		url: config.url,
		//processData:false,
		data:config.data,
		cache:false,
		dataType: 'html',
		beforeSend: function(xhr) {
			loadingOn(config.loadId, config.selEl, true, config);
		},
		success: function(response, status) {
			loadingOff(config.loadId);
			$(config.selEl).html(response);
			if (config.scroll) {
				setScrollForElement($(config.selEl));
				/*
				$(config.selEl).jScrollPane({scrollbarWidth:12, scrollbarMargin:-12, wheelSpeed:40}).onImagesLoad(
						{
							callback: function(ref) {
								$(ref).jScrollPane(settings);
							}
						}
					);
				*/
			}
			if (config.extraSuccessCallback) {
				config.extraSuccessCallback();
			}
		}
	};
	return $.ajax(ajaxParams);
}


function applicationRawContentDelay(customConfig) {
	customConfig.delay = 190;
	applicationRawContent(customConfig);
}

function applicationRawContent(customConfig) {
	var config = {
		url:'', selEl:'#application-raw-content', loadId:'app-raw-load', scroll:false
	}
	
	for (var key in customConfig) {
		config[key] = customConfig[key];
	}
	
	if (config.sendForm) {
		config.data = $(config.sendForm).serialize();
	}
	
	if (config.disableControl) {
		disableButtonControl();
	}
	
	if (config.delay) {
		setTimeout(function() {loadElement(config);}, config.delay);	
	} else {
		loadElement(config);
	}
}

function checkTopMenu(loggedIn, menuLoadUrl, language) {
	if (!language) {
		language = 2;
	}
	var menuDiv = null;
	if (loggedIn) {
		menuDiv =  $('#menu-global-logged-in');
	} else {
		menuDiv =  $('#menu-global-logged-out');
	}
	
	if (menuDiv.size() < 1) {
		$('#header-inner').load(menuLoadUrl, null, function() {
			$('#header-inner').attr({'clanguage':language});
		});
	}
}

function checkReloadOuterElements(baseUrl, language, languageCode3) {
		
	var topMenu = $('#header-inner');
	if (topMenu.size() > 0 && topMenu.attr('clanguage') != language) {
		topMenu.load(baseUrl + 'users/loadGlobalMenu/' + language, null, function() {
			$('#header-inner').attr({'clanguage':language});
		});	
	}

	var appMenu = $('#application-menu-container');
	if (appMenu.size() > 0 && appMenu.attr('clanguage') != language) {
		appMenu.load(baseUrl + 'users/applicationMenu/' + appObj.appMenuSelection + '/' + language, null, function() {
			$('#application-menu-container').attr({'clanguage':language});
			menuVisualSelect(appObj.appMenuSelection);
		});
	}
	
	var mbody = $('body');
	if (mbody.size() > 0 && mbody.attr('clanguage') != language) {
		mbody.css({'background-image':'url(' + appObj.baseUrl + 'img/background_chat_' + languageCode3 + '.jpg)'});
		mbody.attr({'clanguage':language});
	}
}

function checkLayoutIsSet(redirect) {
	var containerEl = $('#container');
	if (!containerEl || containerEl.size() < 1) {
		document.location = redirect;
	}
}

function prepareFullScreen() {
	$('#application').removeClass('split-bg');
}

function prepareSplitScreen() {
	$('#application').addClass('split-bg');
}

function setScrollForElement(el) {
	var settings = {scrollbarWidth:12, scrollbarMargin:-12, wheelSpeed:40};
	el.jScrollPane(settings).onImagesLoad(
			{
				callback: function(ref) {
					$(ref).jScrollPane(settings);
				}
			}
		);
	//el[0].scrollTo(200,true);
		
}


function setFullScroll() {
	//_doSetFullScroll();
	setTimeout('_doSetFullScroll();', 300);
}

function setSplitScroll(right) {
	var suffix = right ? 'right' : 'left';
	//_doSetSplitScroll(suffix);
	setTimeout('_doSetSplitScroll(\'' + suffix + '\');', 300);
}

function _doSetFullScroll() {
	setScrollForElement($('#full-content'));
	//$('#full-content').jScrollPane({scrollbarWidth:12, scrollbarMargin:-12, wheelSpeed:40/*, reinitialiseOnImageLoad:true*/});
}

function _doSetSplitScroll(suffix) {
	setScrollForElement($('#split-content-' + suffix + '-scroller'));
	//$('#split-content-' + suffix + '-scroller').jScrollPane({scrollbarWidth:12, scrollbarMargin:-12, wheelSpeed:40/*, reinitialiseOnImageLoad:true*/});
}


function menuVisualSelect(index) {
	// delelect all
	$('.button-menu-active').attr({'class' : 'button-menu'});
	if (index > 0) {
		$('#button-menu-' + index).attr({'class' : 'button-menu-active'});
	}
	appObj.appMenuSelection = index;
}

function menuVisualSelectByElement(el) {
	// delelect all
	$('.button-menu-active').attr({'class' : 'button-menu'});
	if (el) {
		el.children('.button-menu').attr({'class' : 'button-menu-active'});
	}
}


function loadList(customConfig) {
	var config = {
		right:false, url:'', params:null, extraSuccessCallback:null
	}
	
	for (var key in customConfig) {
		config[key] = customConfig[key];
	}
	
	var suffix = (config.right) ? 'right' : 'left';
	config.img = 'loader_eye_' + suffix + '.gif';
	
	config.selEl = '#split-content-' + suffix + '-inner';
	config.loadId = 'split-load- ' + suffix;

	return loadElement(config);
}

function listVisualSelectToggle(id, right) {
	var suffix = (right) ? 'right' : 'left';	
	var el = $('#list-entry-' + suffix + '-' + id);
	if (el.size() > 0) {
		if (el.attr('class') == 'list-box-selected') {
			el.attr({'class' : 'list-box'});
			return false;
		} else {
			el.attr({'class' : 'list-box-selected'});
			return true;
		}
	}
	return false;
}

function listVisualSelect(id, right, noUnselect) {
	var suffix = (right) ? 'right' : 'left';	
	if (!noUnselect) {
		$('#split-content-' + suffix + '-inner .list-box-selected').attr({'class' : 'list-box'});
	}
	$('#list-entry-' + suffix + '-' + id).attr({'class' : 'list-box-selected'});
}

function listVisualUnSelect(id, right) {
	var suffix = (right) ? 'right' : 'left';	
	$('#list-entry-' + suffix + '-' + id).attr({'class' : 'list-box'});
}


function getDefaultListSelection(screen, right) {
	var curSel = 0;
	
	if (right) {
		var list = 'right';
	} else {
		var list = 'left';
	}
	if (appObj.screens[screen] && appObj.screens[screen][list]) {
		var settings = appObj.screens[screen][list];
		
		if (settings.lastSel!=0) {
			curSel = settings.lastSel;
		}
		if ((curSel == 0 || settings.overrideLast) && settings.overrideSel != 0) {
			curSel = settings.overrideSel
		}
	}
	
	if (curSel == 0) {
		curSel = '.alink:first';
	} else {
		curSel = '#list-entry-' + list + '-link-' + curSel;
	}
	
	return curSel;
}

function listSelect(right, selector, screen) {
	if (!selector || selector == 0) {
		selector = getDefaultListSelection(screen, right);
	}
	
	if (!right) {	
		var selEntry = $('#split-content-left-inner ' + selector);
	} else {
		var selEntry = $('#split-content-right-inner ' + selector);
	}

	
	if (selEntry.length > 0) {
		selEntry.click();
		return true;
	} if (selector != '.alink:first') {
		listSelect(right, '.alink:first');
	}
	
	return false;
}

function onLeftListSelect(screen, newId) {
	var lastSel = appObj.screens[screen].left.lastSel;
	appObj.screens[screen].left.lastSel = newId;
	if (lastSel == 0 || lastSel != newId) {
		// reset right preselect
		appObj.screens[screen].right.lastSel = 0;
	}
}

function onRightListSelect(screen, newId) {
	appObj.screens[screen].right.lastSel = newId;
}

function enableCtButtonControlRight(text, buttonId, options) {
	options.contentContainerId = '#split-content-right-inner';
	enableCtButtonControl(text, buttonId, options);
}

function enableCtButtonControl(text, buttonId, options) {
	if (!options) options = {};

	if (!options.contentContainerId) {
		options.contentContainerId = '#full-content .content-box';
	}

	var button = $('#' + buttonId);
	
	if (button.size() == 0) {
		var innerClass = 'button-wide-ct';
		var innerStyle = '';
		if (options.left) {
			innerClass = 'button-wide-sp';
			innerStyle = 'style=margin-left:' + options.left + 'px;';
		}
		$(options.contentContainerId).append('<div class="button-ct-container"><div class="' + innerClass + '" id="' + buttonId + '" ' + innerStyle +'>' + text + '</div></div>');
		button = $('#' + buttonId);
	}	
	
	if (text) {
		button.html(text);
	}
	button.removeAttr('disabled');
	button.css({'color':'#333333'});
	
	if (options.hide) {
		button.hide();
	} else {
		button.show();	
	}
	
	if (options.clickHandler) {
		var allHandler = function(e) {
			buttonDown(buttonId, 'button-wide-ct');
			if (options.delay) {
				setTimeout(function() {options.clickHandler(e);}, options.delay);
			} else {
				options.clickHandler(e);
			}
		};
		uniqueClick(button, allHandler);
	} else if (options.unbind) {
		button.unbind('click');
	}
}


function enableButtonControl(text, options) {
	if (!options) options = {};

	if (text) {
		$('#button-control').attr({'value' : text});
	}
	$('#button-control').removeAttr('disabled');
	$('#button-control').css({'color':'#000000'});
	
	if (options.hide) {
		$('#button-control').hide();
	} else {
		$('#button-control').show();	
	}
	
	if (options.clickHandler) {
		var allHandler = function(e) {
			options.clickHandler(e);
			controlButtonDown();
		};
		uniqueClick($('#button-control'), allHandler);
	} else if (options.unbind) {
		$('#button-control').unbind('click');
	}
}

function disableButtonControl(text, options) {
	if (!options) options = {};
	
	if (text) {
		$('#button-control').attr({'value' : text});
	}
	$('#button-control').attr({'disabled' : 'disabled'}).css({'color':'#999999'});
	if (options.hide) {
		$('#button-control').hide();
	}
	
	if (options.clickHandler) {
		uniqueClick($('#button-control'), options.clickHandler);
	} else if (options.unbind) {
		$('#button-control').unbind('click');
	}
}

function executeActionForEntry(id) {
	var action = null;
	var index = "default"
	
	if (appObj.buttonControlAssignments[id]) {
		index = appObj.buttonControlAssignments[id];
	}
	if (appObj.buttonControlActions[index]) {
		action = appObj.buttonControlActions[index];
		action();
	}	
}

function setButtonActionForEntry(id) {
	var action = null;
	var index = "default"
	
	if (appObj.buttonControlAssignments[id]) {
		index = appObj.buttonControlAssignments[id];
	}

	if (appObj.buttonControlActions[index]) {
		action = appObj.buttonControlActions[index];
		var allHandler = function(e) {
			action(e);
			controlButtonDown();
		};
		uniqueClick($('#button-control'), allHandler);
	} else {
		$('#button-control').unbind('click');
	}	
}

function getButtonTextForEntry(id) {
	var index = 'default';
	var buttonText = null;
	
	if (appObj.buttonControlAssignments[id]) {
		index = appObj.buttonControlAssignments[id];
	}

	if (appObj.buttonControlLabels[index]) {
		buttonText = appObj.buttonControlLabels[index];
	} else {
		buttonText = '';
	}
	return buttonText;
}

function initializeButtonForEntry(id, options) {
	if (!options) options = {};
	
	var buttonText = getButtonTextForEntry(id);	
	
	if (options.disable) {
		disableButtonControl(buttonText, options);
	} else {
		enableButtonControl(buttonText, options);
	}
}

function uniqueClick(element, fn) {
	if (element && element.size() > 0) {
		element.unbind('click');
		element.click(fn);
	}
}

function EndForOnlineDuel() {
	disableButtonControl();
	
	appObj.gameType = 'to_duel';
	appObj.gameMode = false;
	
	$('#application').html('<div id="application-inner"><div id="application-raw-content"><div class="content-box">...</div></div></div>');
}

function EndGame(bTabbed) {
	disableButtonControl();
	appObj.gameMode = false;
	
	var loadConfig = { url:appObj.baseUrl + 'users/endGame/', selEl:'#application', loadId:'game-end-load' };
	
	if (bTabbed)
	{
		loadConfig = { url:appObj.baseUrl + 'users/showRawMessage/error-new-tab', selEl:'#application', loadId:'app-raw-load' };
	}
	
	loadElement(loadConfig);
}

function EndDuel(bTabbed) {
	disableButtonControl();
	appObj.gameMode = false;

	var loadConfig = { url:appObj.baseUrl + 'users/endDuel/', selEl:'#application', loadId:'game-end-load' };
	
	if (bTabbed)
	{
		loadConfig = { url:appObj.baseUrl + 'users/showRawMessage/error-new-tab', selEl:'#application', loadId:'app-raw-load' };
	}
	
	loadElement(loadConfig);
}

function GameClick(buttonText, callback) {
	if (!buttonText && !callback) {
		disableButtonControl('',{hide:true});
	} else {
		enableButtonControl(buttonText, {clickHandler:callback});
	}
	return false;
}

function buttonDown(id, baseClass, additionalClasses) {
	var ref = $('#' + id);
	if (!baseClass || baseClass == '') {
		baseClass = '';
		var classStr = 'button-generic-active';
	} else {
		var classStr = baseClass + '-active';
	}
	if (additionalClasses) {
		classStr += ' ' + additionalClasses;
	}
	$(ref).attr({'class':classStr});
	
	setTimeout('buttonUp(\''+ id +'\', \'' + baseClass + '\' , \'' + additionalClasses + '\');', 170);
}

function buttonUp(id, baseClass, additionalClasses) {
	var ref = $('#' + id);
	if (!baseClass) {
		var classStr = 'button-generic';
	} else {
		var classStr = baseClass;
	}
	if (additionalClasses) {
		classStr += ' ' + additionalClasses;
	}
	$(ref).attr({'class':classStr});
}


function controlButtonDown() {
	$('#bottom-controls').attr({'class':'active'}).blur();
	setTimeout('controlButtonUp();', 200);
}

function controlButtonUp() {
	$('#bottom-controls').removeAttr('class');
}

function startKeepAlive()
{
	if (timerKeepAlive == null)
	{
		timerKeepAlive = window.setTimeout('keepAlive()', 240000);
	}
}

function keepAlive()
{
	$.get("/users/keepAlive", function(data){
		if (data == "OK")
		{		
			timerKeepAlive = window.setTimeout('keepAlive()', 240000);
		}
		else
			stopKeepAlive();
	});	
}

function stopKeepAlive()
{
	if (timerKeepAlive != null)
	{
		window.clearTimeout(timerKeepAlive);
		timerKeepAlive = null;
	}
}

function testChallenge( userId, button )
{
	$.get('/dsa_game/duel.php?action=testchallenge&user='+userId+"&usession="+encodeURIComponent(g_sSession)+"&rnd="+((new Date).getTime()), function(response)
	{
		if (response == '-')
		{
			if (timerCountDown != null)
			{
				window.clearTimeout(timerCountDown);
				timerCountDown = null;
				$(button).click();
			}	
		}
	});
}

function startCheck4Challenge()
{
	if (!IsCheckChallengeRunning())
	{
		var fn = function(response)
		{
			if (response != '')
			{
				var pos = response.indexOf('<!--challenge-response-->');
				if (pos != -1)
				{
					stopCheck4Challenge();
					$('#dlgChallengeAcceptContent').html(response);
					showDialog('#dlgChallengeAccept', countDown('#dlgChallengeAcceptSeconds','#online-duel-decline', 30));
					testChallenge(appObj.userId, '#online-duel-decline');
				}
			}			
		};
		StartCheckChallenge(fn, appObj.userId);
	}
//	if (timerCheck4Challenge == null)
//	{
//		timerCheck4Challenge = window.setTimeout('check4Challenge()', 8000);
//	}
}

function stopCheck4Challenge()
{
	StopCheckChallenge();
//	if (timerCheck4Challenge != null)
//	{
//		window.clearTimeout(timerCheck4Challenge);
//		timerCheck4Challenge = null;
//	}
}

function check4Challenge()
{
	timerCheck4Challenge = null;
	check4OnlineChallenge(function(response)
	{
		if (response != '')
		{
			var pos = response.indexOf('<!--challenge-response-->');
			if (pos != -1)
			{
				stopCheck4Challenge();
				$('#dlgChallengeAcceptContent').html(response);
				showDialog('#dlgChallengeAccept', countDown('#dlgChallengeAcceptSeconds','#online-duel-decline', 30));
				testChallenge(appObj.userId, '#online-duel-decline');
			}
		}			
	});
	startCheck4Challenge();
}

function check4OnlineChallenge(f)
{
	$.get('/duels/check4Challenge', f);
}

function countDown(timerId, clickButtonId, count)
{
	if (count >= 0)
	{
		$(timerId).html(count);
		timerCountDown=window.setTimeout('countDown(\'' + timerId + '\',\'' + clickButtonId + '\',' + parseInt(count-1) + ')', 1000);
	}
	else
	{
		$(clickButtonId).click();
		//$.modal.close();
		timeCountDown=null;
	}
}


function countDownDuelWait(count)
{
	timerCountDown=window.setTimeout('countDownDuelWait(' + parseInt(count-1) + ')', 1000);

	if (count >= 0)
	{
		$('#dlgChallengeWaitSeconds').html(count);
	}

	if (count == -1)
	{
			$('#dlgChallengeWaitContent').html('<img src="/img/loader_eye_left.gif">');
	}
	
	if (count == -10)
	{
		clearChallenge();
		$('#dlgChallengeWaitContent').html('Herausforderung abgelehnt.<br/><br/><div class="button-generic" id="online-duel-back" onclick="$.modal.close();applicationRawContent({url:\'/duels/onlineDuel\'});return false;">Zur&uuml;ck</div>');
		
		if (timerCountDown != null)
		{
		window.clearTimeout(timerCountDown);
		timerCountDown = null;
		}
		
		if (timerChallengeStatus != null)
		{
			window.clearTimeout(timerChallengeStatus);
			timerChallengeStatus = null;
		}	
	}
}

function declineChallenge()
{
	declineOnlineChallenge();
	startCheck4Challenge();
}

function declineOnlineChallenge()
{
	if (timerCountDown != null)
	{
		window.clearTimeout(timerCountDown);
	}	

	$.modal.close();
	var url='/duels/declineChallenge';
	$.post(url);
}

function acceptChallenge()
{
	if (timerChallengeStatus != null)
	{
		window.clearTimeout(timerChallengeStatus);
		timerChallengeStatus = null;
	}
	acceptOnlineChallenge();
}

function acceptOnlineChallenge()
{
	if (timerCountDown != null)
	{
		window.clearTimeout(timerCountDown);
		timerCountDown = null;
	}	

	$.modal.close();
	applicationRawContent({url:'/duels/startOnlineDuel'});
}

function clearChallenge()
{
	var url='/duels/clearChallenge';
	$.post(url);
}

function getChallengeStatus(userId)
{
	$.get('/duels/getChallengeStatus/'+userId, function(response)
	{
		if (response != '')
		{
			if (timerCountDown != null)
			{
				window.clearTimeout(timerCountDown);
				timerCountDown = null;
			}	
			
			if (timerChallengeStatus != null)
			{
				window.clearTimeout(timerChallengeStatus);
				timerChallengeStatus = null;
			}	
			$('#dlgChallengeWaitContent').html(response);
			timerCountDown = countDown('#dlgConfirmSeconds', '#online-duel-confirm', 10)
		}
	});
	timerChallengeStatus=window.setTimeout('getChallengeStatus(' + parseInt(userId) +')', 1000);
}

