
function createFlashTag(url, flashcontainerid, height, width, fullscreen) {
	var swf = new SWFObject(url, flashcontainerid + '_swf', width, height, '8');
	swf.addParam('allowfullscreen', (fullscreen ? 'true' : 'false'));
	swf.write(flashcontainerid);
}

function setWorkitemMenuSub(index) {
	var menuItemCount = $('#menu_sub a').size();
	var positiveIndex = (index + menuItemCount) % menuItemCount;
	var elm = $('#menu_sub a:eq(' + positiveIndex + ')');

	// toggle menu item
	$('#menu_sub a').removeClass('active');
	elm.addClass('active');

	// fetch url and set flashfile
	var url = elm.attr('rel');
	/*$('#workitemFlashfile_swf').attr('src', url);*/
	createFlashTag(url, flashcontainerid, height, width);

	// remember index
	currentMenuSubIndex = positiveIndex;

	// show (maybe it's currently hidden)
	$('#workitemFlashfile').show();
}


/* 			general backend functions 			*/
function changeLanguage(url, to) {
	$.get(url, {culture: to}, function() {
		window.location.reload(true); // make sure to NOT read from cache, as then the old user culture is still used
	});
}

function checkFormParameters($target) {
	$target.find(':input, label').removeClass('defective');

	// check and highlight inputs
	$target.find(':text, textarea').each(function() {
		if ($(this).val() == '') {
			$(this).addClass('defective');
		}
	});

	// check checkboxes, highlight labels
	$target.find(':checkbox').each(function() {
		if ($(this).attr('checked') != true) {
			$(this).siblings('label').addClass('defective');
		}
	});

	var hasDefectiveElements = $target.find(':input.defective, label.defective').size() > 0;
	if (hasDefectiveElements) {
		alert(checkFormParametersErrorMessage);
	}

	return !hasDefectiveElements;
}

function sendFeedback() {
	var $target = $('form');
	if (checkFormParameters($target) === true) {
		$.post(feedbackUrl, $target.serialize(), function() {alert(sendFormSuccessMessage); window.location.reload();});
	}
}

function isValidNumberKey(evt) {
	var validKey = false;

	// escape if ctrl or enter is pressed (user wants probably to reload etc.)
	if (evt.ctrlKey || evt.keyCode == 13) {
		return true;
	}

	// allow digits
	validKey = !evt.shiftKey && (evt.keyCode >= 48) && (evt.keyCode <= 57); // normal
	validKey = validKey || (!evt.shiftKey && (evt.keyCode >= 96) && (evt.keyCode <= 105)); // numblock

	// allow arrow keys
	validKey = validKey || ((evt.keyCode >= 37) && (evt.keyCode <= 40));

	// allow pos1 and end and tab
	validKey = validKey || (evt.keyCode == 35) || (evt.keyCode == 36) || (evt.keyCode == 9);

	// allow backspace and delete
	validKey = validKey || (evt.keyCode == 8) || (evt.keyCode == 46);

	return validKey;
}




/* 			execute after page has been loaded 			*/
$(function() {

	/* --------------- scrolling via mouse wheel --------------- */
	$('.scrollable').bind('mousewheel', function(event, delta) {
		var p = (delta > 0) ? '-=' : '+=';
		var delta_abs = Math.abs(delta);
		var multiplier = scrollStep;
		var s = (p + Math.round(delta_abs * multiplier));
		$(this).scrollTo(s);
	})


	/* --------------- restrict certain input fields to integers only --------------- */
	$('input[type="text"].restrictToIntegers').bind('keydown', function(evt) {
		var validKey = isValidNumberKey(evt);

		if (!validKey) {
			evt.preventDefault(true);
			evt.returnValue = false;
		}

		return validKey;
	});



	/* --------------- automatically select text in inputs after click --------------- */
	$('input[type="text"], ' + 'input[type="password"], ' + 'textarea').bind('click', function(evt) {
		$(this).select();
	});





	//
	// --------------------- extending jQuery ---------------------
	//
	jQuery.extend({
		xget: function(url, data, onComplete, onLoad, type) {
			$.xsend(url, 'ajax', data, onComplete, onLoad, type);
		},

		/**
		 * Executes a request and returns x-json-header besides result-data.
		 *
		 * @param string url
		 * @param string eventName
		 * @param object data
		 * @param function onComplete
		 * @param function onLoad
		 * @param string type 'post' or 'get', the latter is default
		 */
		xsend: function(url, eventName, data, onComplete, onLoad, type) {
			$.ajax({
				type: type ? type : 'get',
				url: url,
				data: data,
				beforeSend: function(request) {
					$(document).trigger(eventName + 'RequestStart');
					if (onLoad) {
						onLoad();
					}
				},
				complete: function(response, statusText) {
					$(document).trigger(eventName + 'RequestStop');
					var jsonResponseHeaderObject = eval('(' + response.getResponseHeader('X-JSON') + ')');
					var result = response.responseText;
					var statusCode = response.status;

					onComplete(jsonResponseHeaderObject, result, statusCode);
				}
			});
		},

		xpost: function(url, data, onComplete, onLoad) {
			$.xget(url, data, onComplete, onLoad, 'post');
		}

	});


});

