var bmg = bmg || {};
$(document).ready(function() {
	/**
	 * stuff for the tablesorter plugin
	 */
	function intFindParser (){}
	intFindParser.prototype.id = 'intFindParser',
	intFindParser.prototype.regExp = /(\d*)/,
	intFindParser.prototype.is = function(s) {
		var found = s.search(this.regExp);
		if (found != -1) {
			return true;
		}
		return false;
	};
	intFindParser.prototype.format = function(s) {
		var format = s.replace(this.regExp, "$1");
		return format;
	};
	intFindParser.prototype.type = 'numeric';

	$.tablesorter.formatFloat = function(s) {
		s = s.replace(/\./g, '');
		s = s.replace(/,/, '.');
		var i = parseFloat(s);
		return (isNaN(i)) ? 0 : i;
	}
	$.tablesorter.isDigit = function(s, config) {
		s = s.replace(/\.([0-9]{3})/g, '$1');
		var DECIMAL = '\\' + config.decimal;
		var exp = '(^[+]?0(' + DECIMAL +'0+)?$)|(^([-+]?[1-9][0-9]*)$)|(^([-+]?((0?|[1-9][0-9]*)' + DECIMAL +'(0*[1-9][0-9]*)))$)|(^[-+]?[1-9]+[0-9]*' + DECIMAL +'0+$)';
		return RegExp(exp).test($.trim(s));
	}
	$.tablesorter.addParser({
		id: 'timeLeft',
		is: function(s) {
			var foundSeconds = s.search(/Sek\./);
			if (foundSeconds != -1) {
				return true;
			}
			return false;
		},
		format: function(s) {
			var seconds = this.getValueByFollowString(s, 'Sek');
			var minutes = this.getValueByFollowString(s, 'Min');
			var hours = this.getValueByFollowString(s, 'Std');
			var days = this.getValueByFollowString(s, 'Tage');
			var months = this.getValueByFollowString(s, 'Monate');
			var years = this.getValueByFollowString(s, 'Jahre');
			var date = new Date(years, months, days, hours, minutes, seconds);
			return date.getTime();
		},
		type: 'numeric',
		getValueByFollowString: function(haystack, needle) {
			var regExpression = new RegExp("(\\d+\) " + needle + "");
			var ret = haystack.match(regExpression);
			if (ret == null) {
				return 0;
			}
			return ret[1];
		}
	});
	$.tablesorter.addParser({
		id: 'opened',
		regExp: /(\d\d):(\d\d):(\d\d) (\d\d)\.(\d\d)\.(\d\d\d\d)/,
		is: function(s) {
			var found = s.search(this.regExp);
			if (found != -1) {
				return true;
			}
			return false;
		},
		format: function(s) {
			var format = s.replace(this.regExp, "$6-$5-$4-$1-$2-$3");
			format = format.split('-');
			var date = new Date(format[0], format[1] - 1, format[2], format[3], format[4], format[5]);
			return date.getTime();
		},
		type: 'numeric'
	});

	var levelParser = new intFindParser();
	levelParser.id = 'level';
	levelParser.regExp = /mindestens Level (\d*)/;
	$.tablesorter.addParser(levelParser);

	var durationParser = new intFindParser();
	durationParser.id = 'duration';
	durationParser.regExp = /(\d*) Minuten/;
	$.tablesorter.addParser(durationParser);

	$.tablesorter.addParser({
		id: 'germandate',
		is: function(s) {
			var matchGermanDate = s.search(/\d\d.\d\d.\d\d\d\d/);
			if (matchGermanDate != -1) {
				return true;
			}
			return false;
		},
		format: function(s) {
			var a = s.split('.');
			a[1] = a[1].replace(/^[0]+/g,"");
			return new Date(a.reverse().join("/")).getTime();
		},
		type: 'numeric'
	});
	$.tablesorter.addParser({
		id: 'removeEuro',
		is: function(s) {
			var foundEuro = s.search(/\u20ac/);
			if (foundEuro != -1) {
				return true;
			} else {
				return false;
			}
		},
		format: function(s) {
			s = s.replace(/\u20ac/, '');
			return $.tablesorter.formatFloat(s);
		},
		type: 'numeric'
	});
	function textExtraction(node) {
		var regExp = /.*\(Kosten: (\d*)\u20ac\).*/;
		var found = node.innerHTML.search(regExp);
		if (found != -1) {
			return node.innerHTML.replace(regExp, "$1");
		}

		if(node.childNodes[0] && node.childNodes[0].hasChildNodes()) {
			return node.childNodes[0].innerHTML;
		} else {
			return node.innerHTML;
		}
	}
	$(".tablesorter").each(function(i) {
		var options = {
			widgets: [
				'zebra'
			],
			decimal: ',',
			textExtraction: textExtraction
		};
		var tsorder = this.className.match(/tsorder_(\d*)/);
		if (tsorder != undefined && tsorder[1] != undefined) {
			options.sortList = [[tsorder[1], 0]];
		}
		$(this).tablesorter(options);
	});

	/**
	 * Stuff for the slider
	 */
	var skillPointsForm = document.getElementById('skillPointsForm');
	if (skillPointsForm != undefined) {
		bmg.skills = bmg.skills || {};
		bmg.skills.getCurrentPoints = function() {
			var currentPoints = 0;
			$('form#skillPointsForm .skillSettings input[type=slider]').each(function() {
				currentPoints += parseFloat($(this)[0].value);
			});
			return currentPoints;
		}
		bmg.skills.getAvailablePoints = function() {
			return parseFloat($('#availablePoints').val().replace(/0;/, ''));
		}
		bmg.skills.setAvailablePoints = function() {
			$('#availablePoints').slider('value', 0, bmg.skills.maxPoints - bmg.skills.getCurrentPoints());
		}
		bmg.skills.raiseCaller = function(object) {
			if (bmg.skills.raiseTime == 0) {
				return;
			}
			bmg.skills.raise(object);
			if (bmg.skills.raiseTime > 50) {
				bmg.skills.raiseTime = bmg.skills.raiseTime/1.5;
			}
			window.setTimeout(function(){bmg.skills.raiseCaller(object)}, bmg.skills.raiseTime);
		}
		bmg.skills.raise = function(object) {
			var slider = object.parent().find('.slider');
			if (object.hasClass('minus')) {
				var newValue = parseFloat(slider.slider('value')) - 1;
			} else {
				var newValue = parseFloat(slider.slider('value')) + 1;
			}
			slider.slider('value', newValue);
			sliderCallback(slider);
		}
		bmg.skills.enablePlusMinus = function(direction) {
			$('.skillSettings .' + direction).each(function() {
				$(this).mousedown(function(){
					bmg.skills.raiseTime = 500;
					bmg.skills.raiseCaller($(this));
				});
				$(this).mouseout(function() {
					bmg.skills.raiseTime = 0;
				});
				$(this).mouseup(function() {
					bmg.skills.raiseTime = 0;
				});
			});
		}
		bmg.disableSlider = function(object){
			object.parent().find(".jslider-pointer").unbind('mousedown');
			object.parent().find(".jslider-pointer").addClass('disabledPointer');
		}
		bmg.hideSlider = function(object) {
			object.parent().find('.jslider-pointer')[0].className = '';
		}
		bmg.skills.maxPoints = bmg.skills.getCurrentPoints() + bmg.skills.getAvailablePoints();
		$('#availablePoints').slider({
			from: 0,
			to: bmg.skills.maxPoints,
			step: 1,
			round: 0,
			skin: 'plastic'
		});
		bmg.disableSlider($('#availablePoints'));
		bmg.hideSlider($('#availablePoints'));
		bmg.skills.startPoints = {};
		$(".slider").each(function() {
			bmg.skills.startPoints[$(this).attr('name')] = $(this).val();
		});
		function sliderCallback(object) {
			if (typeof object == 'object') {
				var sliderNode = object;
			} else {
				var sliderNode = $(this)[0].inputNode;
			}
			var pointsLeft = bmg.skills.getCurrentPoints() - bmg.skills.maxPoints;
			var startPoints = bmg.skills.startPoints[sliderNode.attr('name')];
			if (pointsLeft > 0) {
				var currentValue = sliderNode.slider('value');
				sliderNode.slider('value', currentValue - pointsLeft);
			}
			if (parseFloat(sliderNode.slider('value')) < startPoints) {
				sliderNode.slider('value', startPoints);
			}
			bmg.skills.setAvailablePoints();
		}
		$(".slider").slider({
			from: 0,
			to: 99,
			step: 1,
			round: 0,
			scale: [0, '|', 50, '|', 99],
			limits: false,
			dimension: '&nbsp;Punkte',
			callback: sliderCallback
		});
		bmg.skills.enablePlusMinus('plus');
		bmg.skills.enablePlusMinus('minus');

		/**
		 * Set tooltips for slider elements
		 */
		$(".skillSliderContainer .jslider-pointer").tooltip({
			bodyHandler: function() {
				return $(this).parents()[5].getAttribute('tooltip');
			},
			track: 1
		});
	}

	/**
	 * Enable phonebook functionality for writing messages
	 */
	$("form input#messageReceiver").autocomplete('index.php?section=nachrichten_erstellen&action=names&requestType=ajax', {
	});
        $("form input#suche").autocomplete('index.php?section=home&action=names&requestType=ajax', {
	});
        $("form input#biete").autocomplete('index.php?section=home&action=names2&requestType=ajax', {
	});
        $("form input#isuche").autocomplete('index.php?section=suchen&action=names&requestType=ajax', {
	});
        $("form input#ibiete").autocomplete('index.php?section=suchen&action=names2&requestType=ajax', {
	});

	/**
	 * Callback for adding posts at the end of the thread.
	 */
	bmg.addPosts = function(data) {
		if ($.browser.msie == true) {
			var oldInner = $("#postList")[0].parentNode.innerHTML;
			var newInner = oldInner.replace(/<\/TBODY><\/TABLE>/,  data.html + '</tbody></table>');
			$("#postList")[0].parentNode.innerHTML = newInner;
			var lastRow = $("#forumNewPost")[0].parentNode.parentNode;
			lastRow.parentNode.removeChild(lastRow);
			$("#postList")[0].children[0].appendChild(lastRow);
		} else {
			$("#postList")[0].innerHTML += data.html;
			var lastRow = $("#forumNewPost")[0].parentNode.parentNode;
			lastRow.parentNode.removeChild(lastRow);
			$("#postList")[0].appendChild(lastRow);
		}
		bmg.applyFormSubmitHandler("#forumNewPost", bmg.addPosts);
	}

	/**
	 * Callback for adding threads.
	 */
	bmg.addThread = function(data) {
		if ($.browser.msie == true) {
			window.location.href = window.location.href;
		} else {
			$("table.threadList tbody").prepend(data.html);
			$("table.threadList").trigger("update");
		}
		bmg.addDeleteThreadHandler("a.deleteThread:first"); // new row needs the delete handler
	}

	/**
	 * Forum: create post
	 */
	bmg.applyFormSubmitHandler = function(selector, callback) {
		$(selector).bind('submit', function(){
			var data = {};
			$(selector).find("input").each(function() {
				data[$(this).attr('name')] = $(this).val();
			});
			$(selector).find("textarea").each(function() {
				data[$(this).attr('name')] = $(this).val();
			});
			$.post(
				$(selector).attr('action'),
				data,
				function(selector, callback){ return function(data) {
					data = $.evalJSON(data);
					if(data.success == true) {
						callback(data);
					}
					$(selector).find("input").each(function() {
						if ($(this).attr('type') != 'submit' && $(this).attr('type') != 'hidden') {
							$(this).val('');
						}
					});
					$(selector).find("textarea").each(function() {
						$(this).val('');
					});
				}}(selector, callback)
			);
			return false;
		});
	};
	bmg.applyFormSubmitHandler("#forumNewPost", bmg.addPosts);
	bmg.applyFormSubmitHandler("#forumNewThread", bmg.addThread);

	bmg.addDeleteThreadHandler = function(selector) {
		$(selector).bind('click', function() {
			$.get(this.href, {}, function(data) {
				data = $.evalJSON(data);
				if (data.success == true) {
					$("#threadRow" + data.threadId).remove();
					$("table.threadList").trigger("update");
				}
			});
			return false;
		});

		$(selector).confirm({
			msg: "Wirklich l&ouml;schen?<br />",
			buttons: {
				wrapper: '<button></button>',
				ok: 'OK',
				cancel: 'Abbrechen',
				separator: ''
			}
		});
	}
	bmg.addDeleteThreadHandler("a.deleteThread");

	bmg.addReceiver = function() {
		var newUsername = $('#messageReceiver').val();
		$.get('index.php?section=nachrichten_erstellen&action=getUserId&requestType=ajax', {username: newUsername}, bmg.addReceiverCallback);
		return false;
	}

	bmg.addReceiverCallback = function(result) {
		result = $.evalJSON(result);
		if (result.success != true) {
			alert('Es gibt keinen Benutzer mit diesem Namen.');
			return false;
		}
		var users = result.users;
		for (userId in users) {
			var username = users[userId];
			var userEle = document.createElement('div');
			userEle.className = 'receiver';
			userEle.id = 'receiver' + userId;
			var linkEle = document.createElement('a');
			linkEle.href = 'index.php?section=profil&userid=' + userId;
			linkEle.target = '_blank';
			linkEle.appendChild(document.createTextNode(username));
			var delEle = document.createElement('a');
			delEle.className = 'deleteUser';
			$(delEle).click(bmg.removeReceiver);
			delEle.href = '#';
			delEle.appendChild(document.createTextNode('X'));
			var inputEle = document.createElement('input');
			inputEle.type = 'hidden';
			inputEle.name = 'too[]';
			inputEle.value = username;
			userEle.appendChild(delEle);
			userEle.appendChild(linkEle);
			userEle.appendChild(inputEle);
			$('#receiverList').append(userEle);
		}
		return false;
	}

	bmg.addConsortiumsMember = function() {
		$.get('index.php?section=konsortium&action=getMember&requestType=ajax', {}, bmg.addReceiverCallback);
	}

	bmg.addIndexMember = function() {
		$.get('index.php?section=gruppen&action=getMember&requestType=ajax', {}, bmg.addReceiverCallback);
	}

	bmg.addAllUsers = function() {
		$.get('index.php?section=nachrichten_erstellen&action=getAllUsers&requestType=ajax', {}, bmg.addReceiverCallback);
	}

	bmg.removeReceiver = function(event) {
		var nodeToRemove = event.currentTarget.parentNode;
		nodeToRemove.parentNode.removeChild(nodeToRemove);
		return false;
	}

	$('a.addConfirmMessage').click(function(){
		var href = $(this).attr('href');
		if (href != '#' && href != '') {
			location.href = $(this).attr('href');
		}
	});
	$('.addConfirmMessage').confirm({
		msg: "Aktion wirklich ausf&uuml;hren?<br />",
		buttons: {
			wrapper: '<button></button>',
			ok: 'OK',
			cancel: 'Abbrechen',
			separator: ''
		}
	});

	$('#konsTresorPaymentType').change(function() {
		if ($(this).val() === 'aus') {
			$('#paymentTo').show();
		} else {
			$('#paymentTo').hide();
		}
	});

	bmg.changeChecks = function(tableId) {
		$("#" + tableId).find('input[type=checkbox]').each(function(){
			if (this.checked === true) {
				this.checked = false;
			} else {
				this.checked = true;
			}
		});
	}
});

