function getUrlParam(param) {
	param = param.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
	var results = new RegExp("[\\?&]" + param + "=([^&#]*)").exec(window.location.href);
	if (results == null)
		return null;
	else
		return results[1];
}

/* namespace wrapper */
(function($) {
	
	/* convert rows array to dict with {list: list-row, desc: desc-row} */
	function split(rows) {
		var result = [];
		for (i = 0; i < rows.length / 2; i++) {
			result.push({line: rows[i * 2],
						 desc: rows[i * 2 + 1]});
		}
		return result;
	}
	
	/* sort function with arbitrary value getter function */
	function sort(splits, asc, getter) {
		var minus = -1;
		if (!asc)
			minus = +1;
		return splits.sort(function(a, b) {
			var aval = getter(a);
			var bval = getter(b);
			if (aval < bval)
				return minus;
			else if (aval > bval)
				return -minus;
			else
				return 0;
		});
	}
	
	/* re-set expanding descriptions (gets messed up by sorting remove/add html) */
	function setExpands(element) {
		$("tr.line .expand", element).toggle(
			function(){
				$(this).toggleClass('open');
				$(this).parents('tr').next().show();
			},function(){
				$(this).toggleClass('open');
				$(this).parents('tr').next().hide();
			}
		);
	}
	
	/* add sorting to table column */
	function addSorting(classname, getter) {
		$(".download-center-category table thead td." + classname + " span").click(function() {
			/* remove "active" class from any other columns */
			$(".download-center-category table thead td span").removeClass('active');
			$(this).addClass('active');
			$(this).toggleClass('asc');
			var asc = $(this).hasClass('asc');
			var rows = $('tbody tr', $(this).parents('table'));
			var splits = split(rows);
			splits = sort(splits, asc, getter);
			var tbody = $('tbody', $(this).parents('table'));
			tbody.empty();
			for (i = 0; i < splits.length; i++) {
				var even = 'even';
				if (i % 2 != 0)
					even = 'odd';
				var s = splits[i];
				$(s.line).removeClass('even');
				$(s.line).removeClass('odd');
				$(s.desc).removeClass('even');
				$(s.desc).removeClass('odd');
				$(s.line).addClass(even);
				$(s.desc).addClass(even);
				tbody.append(s.line);
				tbody.append(s.desc);
			}
			/* reset show-hide */
			setExpands(tbody);
		});
	}
	
	function getClassParam(elem, clazz) {
		/* extract element's class with given prefix */
		var tagclass = $(elem).attr("class");
		var startpos = tagclass.indexOf(clazz + '-');
		tagclass = tagclass.substr(startpos);
		var endpos = tagclass.indexOf(' ');
		if (endpos == -1)
			endpos = tagclass.length;
		var param = tagclass.substr(0, endpos);
		return param;
	}
	
	function getUID(elem) {
		/* extract uid-xxxx from elem's class attribute */
		return getClassParam(elem, 'uid');
	}
	
	$(document).ready(function(){
		
		/* hide files descriptions */
		$(".download-center-category tr.desc").hide(); 
		
		/* make categories into accordion */
		$(".download-center-category").each(function() {
			
			$(this).accordion({clearStyle: true,
							   autoHeight: false,
							   alwaysOpen: false,
							   active: false,
							   header: 'a.' + getUID(this)});
		});
		
		/* show/hide descriptions */
		$(".download-center-category tr.line .expand").toggle(
			function(){
				$(this).toggleClass('open');
				$(this).parents('tr').next().show();
			},function(){
				$(this).toggleClass('open');
				$(this).parents('tr').next().hide();
			}
		);
		
		/* select all files in category, when clicked on table header */
		$(".download-center-category thead td.select span").click(function(e) {
			$(this).toggleClass('select');
			$("input[type='checkbox']", $(this).parents('table'))
				.attr('checked', $(this).hasClass('select'));
			
		});
		
		/* sorting for different columns */
		addSorting('title', function(elem) {
			return $('td.title', elem.line).text();
		});
		
		addSorting('type', function(elem) {
			return $('td.type img', elem.line).attr('src');
		});
		
		addSorting('size', function(elem) {
			var size = $('td.size', elem.line).text().split(' ');
			var amount = parseFloat(size[0]);
			var unit = size[1];
			if (unit == 'kB')
				amount *= 1024;
			else if (unit == 'MB')
				amount *= 1024 * 1024;
			return amount;
		})
		
		/* clear list button */
		$('input#reset').click(function() {
			/* uncheck all files */
			$(".download-center-category input[type='checkbox']").attr('checked', false);
			/* clear cart */
			$.get(clear_url);
		});
		
		/* check url for parameters and expand categories */
		var categoryUID = getUrlParam('category');
		if (categoryUID != null) {
			categoryUID = 'uid-' + categoryUID;
			while (true) {
				var uid = categoryUID.substr(4);
				var selector = '.download-center-category.' + categoryUID;
				var parent = $(selector).parent('.download-center-category');
				if (parent == null || parent.length != 1)
					break;
				$(parent).accordion('activate', 'a.current-' + uid);
				categoryUID = getUID(parent);
			}
		}
		
		/* check url for parameters and select file */
		var fileUID = getUrlParam('file');
		if (fileUID != null) {
			fileUID = 'file-' + fileUID;
			$(".download-center-category input[type='checkbox']." + fileUID).attr('checked', true);
		}
		
	});
	
})(jQuery);
