/* $Id: tabtable.js 23766 2008-10-03 13:26:45Z bjorn $ */
// Maak nieuwe tabjestabel
// parentId: id van parent-element
// tabs: datastructuur van tabel
function TabTable(parentId, tabs) {
	this.tabs = tabs;
	this.parentId = document.getElementById(parentId);
	this.isFirstTab = true;
	this.deleteHandler = null;
	this.sortOnLoad = true;
	this.sortable = true;
	this.pageSize = 50;
	this.currentTab = 0;
	this.tabId = "tabs";
	this.loadCnt = 0;
  this.totalColumns = 0;
}

// setSortable
TabTable.prototype.setSortable = function(sortable) {
  this.sortable = sortable;
};

// sortHeaderRenderer
TabTable.prototype.setHeaderRenderer = function(headerRenderer) {
	this.headerRenderer = headerRenderer;
};

// sortOnLoad: boolean: sort or not
TabTable.prototype.setSortOnLoad = function(sortOnLoad) {
	this.sortOnLoad = sortOnLoad;
};

TabTable.prototype.setComparator = function(compare) {
	this.compare = compare;
};

// deleteHandler: function to call when deleting row
TabTable.prototype.setDeleteHandler = function(deleteHandler) {
	this.deleteHandler = deleteHandler;
}

TabTable.prototype.setId = function(id) {
  this.id = id;
}

TabTable.prototype.getId = function() {
  return this.id || 'taglist'; // backwards compatibility with legacy usage
}

TabTable.prototype.setOnloadHandler = function(handler) {
	this.onloadHandler = handler;
}

TabTable.prototype.setOnPageloadHandler = function(handler) {
	this.onPageloadHandler = handler;
}

TabTable.prototype.setNoResultHandler = function(handler) {
	this.noResultHandler = handler;
}

TabTable.prototype.setTabId = function(tabId) {
	this.tabId = tabId;
}

TabTable.prototype.setPageSize = function(pageSize){
	this.pageSize = pageSize;
}

TabTable.prototype.tabHighlight = function(name) {
	attach('#'+this.tabId, function(elt){ul=elt});
	var lis = ul.getElementsByTagName('li');
	var t = 0;
	for (var l = 0; l < this.tabs.length; l++) {
		if (this.tabs[l].total > 0) {
			if (this.tabs[l].name.toLowerCase() == name.toLowerCase())
				lis[t].className = 'actief first';
			else
				lis[t].className = '';
			t++;
		}
	}
}

TabTable.prototype.show = function() {
//printfire('TABTABLE SHOW', this);
	var me = this;

	DWREngine.beginBatch();
	for (var i=0; i<this.tabs.length; i++){
    count(i);
	}	
	DWREngine.endBatch();

	function count(i) {
		me.tabs[i].count(tab);

		function tab(cnt) {
			me.tabs[i].loaded = true;
			me.tabs[i].counted = true;
			me.tabs[i].total = cnt;
			var allLoaded = true;

			for (var t = 0; t < me.tabs.length; t++) {
				if (!me.tabs[t].loaded) {
					allLoaded = false;
					break;
				}
			}

			if (me.maakTab(i, cnt)) {
				me.toonItems(i);
			}

			if (allLoaded) {
				me.allLoaded();
			}
		}
	}
};

TabTable.prototype.toonItems = function(i, forced) {
	var me = this;
	me.tabs[i].opening = true;
//printfire('toonItems i:', me.tabs[i]);
	if (this.tabs[i].data && !forced) {
		//printfire('TT loadItems');
    loadItems(this.tabs[i].data);
	} else {
		//printfire('TT forced of nog geen data');
    // disabled ivm IE6 bug, flikkerende lijnen :s
		//waitStart();
		if (typeof this.tabs[i].offset == "undefined") {
			//printfire('TT offset undefined');
      this.tabs[i].offset = 0;
			this.tabs[i].total = 0;
			this.tabs[i].sortcol = 0;
			this.tabs[i].sortdesc = true;
			this.tabs[i].counted = false;
			if (this.sortOnLoad) {
				var struc = this.tabs[i].columns;
				for(var j=0; j<struc.length; j++){
					if (struc[j].defaultsort) {
						this.tabs[i].sortcol = j;
						if (struc[j].defaultdesc === false)
							this.tabs[i].sortdesc = false;
						break;
					}
				}
			}
		}
    this.tabs[i].count(getCount);
		if (this.tabs[i].findEx){
			//printfire('TT findEx');
      var col = this.tabs[i].columns[this.tabs[i].sortcol];
			if (typeof col.psort != 'undefined'){
				sort = col.psort;
      }
			else {
				sort = col.p;
      }
			this.tabs[i].findEx(this.tabs[i].offset, sort, this.tabs[i].sortdesc, loadItems);
		} 
    else {
			//printfire('TT starting to load');
      this.tabs[i].find(loadItems);
		}
	}

	function loadItems(data) {
//printfire('Callback: loadItems Data: %o', data);
    waitStop();
		me.tabs[i].data = data;

		me.loadData(data, me.tabs, i, deleted);

		function deleted(evt) {
			var o = (evt && evt.target) || window.event.srcElement;
			var target = o.getElementsByTagName('input')[0].value;
			me.deleteHandler(target, i);
		}
	}

	function getCount(cnt) {
		me.tabs[i].total = cnt;
		me.setTabText(i, cnt);
		me.setCounter(i);
	}
};

TabTable.prototype.allLoaded = function() {
	var total = 0;
	var tabLoaded = false;
	for (var i = 0; i < this.tabs.length; i++) {
		total += this.tabs[i].total;
		if (this.tabs[i].opening)
			tabLoaded = true;
	}
	if (!tabLoaded) { // niets geladen (defaulttab.cnt==0)
		for (var i = 0; i < this.tabs.length; i++) {
			if (this.tabs[i].total > 0) {
				this.toonItems(i);
				break;
			}
		}
		
	}
	if (total == 0) {
		if(this.noResultHandler){
			//this.parentId.innerHTML = "<p>De zoekmachine heeft niets gevonden.</p>";
			this.noResultHandler(this.parentId);
		}
	}
	if (this.onloadHandler) {
		this.onloadHandler();
	}
};

TabTable.prototype.setCounter = function(i) {
	var me = this;
	var el = document.getElementById('blader-tekst');
	var vorige = document.getElementById('vorige');
	var volgende = document.getElementById('volgende');
	if (el) {
    var pg = Math.floor(this.tabs[i].offset/this.pageSize) + 1;
		var pgTotal = Math.ceil(this.tabs[i].total/this.pageSize);
		vorige.src = (me.tabs[i].offset > 0) ? '/pix/iconen/vorige-lichtrood.png' : '/pix/iconen/pixel.gif';
		volgende.src = (pg < pgTotal) ? '/pix/iconen/volgende-lichtrood.png' : '/pix/iconen/pixel.gif';
		el.innerHTML = (pgTotal != 1) ? pg+" / "+pgTotal : '';
		vorige.onclick = function() {
			if (me.tabs[i].offset >= me.pageSize) {
				me.tabs[i].offset -= me.pageSize;
			}
			me.toonItems(i, true);
			me.setCounter(i);
		}
		volgende.onclick = function() {
			if (me.tabs[i].offset + me.pageSize < me.tabs[i].total) {
				me.tabs[i].offset += me.pageSize;
			}
			me.toonItems(i, true);
			me.setCounter(i);
		}
	}
};

// Create a new tab
TabTable.prototype.maakTab = function(i, cnt) {
	var me = this;
	this.currentTab = i;
	var ret = false;
	if (cnt == 0)
		return;
	var ul = document.getElementById(this.tabId);
	var li = document.createElement('li');

	var rightSideLi = null;
	// Plaats de tab op de juiste positie; zoek de tab rechts van de nieuwe tab
	for (j = i+1; j < this.tabs.length; j++) {
		if (this.tabs[j].li) {
			rightSideLi = this.tabs[j].li;
			break;
		}
	}

	if (rightSideLi) // Rechtertab gevonden: plaats nieuwe tab ervoor
		ul.insertBefore(li, rightSideLi);
	else // Plaats achteraan
		ul.appendChild(li);

	var hasDefaultTab = false;
	for (var t = 0; t < me.tabs.length; t++) {
		if (typeof me.tabs[t].defaultTab != 'undefined' && me.tabs[t].defaultTab) {
			if (!me.tabs[t].counted)
				hasDefaultTab = true;
			break;
		}
	}

	if ((typeof me.tabs[i].defaultTab != 'undefined' && me.tabs[i].defaultTab) || (!hasDefaultTab && this.isFirstTab)) {
		this.isFirstTab = false;
		li.className = 'actief first';
		ret = true;
	}

	highlight(li, {link: false});
	this.tabs[i].li = li;
	this.setTabText(i, cnt);
	li.onclick = tabClickHandler;
	return ret;


	function tabClickHandler(evt) {
		//printfire(evt.target.alt);
		//window.location = window.location.split('#')[0] + '#TEST';
		
		if (me.onTabClick) {
			if (!me.onTabClick(i))
				return;
		}
		lis = ul.getElementsByTagName("li");
		for(var l=0; l<lis.length; l++) {
			if (lis[l]==li)
				addClass(lis[l], 'actief');
			else
				removeClass(lis[l], 'actief');
		}
		me.toonItems(i);
		me.setCounter(i);
		if(me.tabs[i].onclick)
			me.tabs[i].onclick();
	}
};

TabTable.prototype.setTabText = function(n, cnt) {
	var html = '';
	if(this.tabs[n].picture){
		src = this.tabs[n].picture['src'];
		width = this.tabs[n].picture['width'];
		height = this.tabs[n].picture['height'];
		alt = this.tabs[n].picture['alt'] ? ' alt="'+this.tabs[n].picture['alt']+'"' : '';
		title = this.tabs[n].picture['title'] ? ' title="'+this.tabs[n].picture['title']+'"' : '';
		html = '<img src="'+src+'" width="'+width+'" height="'+height+'"'+alt+title+' class="tabtabletitle" />';
	}
	else{
		html = this.tabs[n].name;
	}
	if (this.tabs[n].showcount !== false)
		html += cnt.toString();
	this.tabs[n].li.innerHTML = html;
};

TabTable.prototype.loadData = function(data, tabs, i, deleteRowHandler) {
//printfire('LOAD DATA!! - %o - %o - %o',i, tabs[i], data);
	var me = this;
	var desc = true;
	var sortcol = -1;

	struc = tabs[i].columns;
	
	if (typeof tabs[i].sortcol != 'undefined') {
		sortcol = tabs[i].sortcol;
		sortdesc = tabs[i].sortdesc;
	} else if (this.sortOnLoad) {
		for(var j=0; j<struc.length; j++){
			if (struc[j].defaultsort) {
				sortcol = j;
				if (struc[sortcol].defaultdesc === false)
					sortdesc = false;
				break;
			}
		}
	}

	var table = this.table;

	redraw(sortcol, sortdesc);

	if (me.onPageloadHandler) {
		me.onPageloadHandler();
	}

	function populate(sortcol, sortdesc) {

//printfire('populate(sortcol, sortdesc)', sortcol, sortdesc);
		if (me.tabs[i].findEx) {
			me.tabs[i].sortcol = sortcol;
			me.tabs[i].sortdesc = sortdesc;
			me.toonItems(i, true);
		} else {
			redraw(sortcol, sortdesc);
		}
	}

	function redraw(sortcol, sortdesc) {
//printfire('Redraw');
		if (!me.tabs[i].findEx && me.tabs[i].sortOnLoad){
			sortRows(sortcol, sortdesc);
    }
		
		me.totalColumns = 0; // reset column count
    removeChildren(me.parentId);
		var tableNew = document.createElement('table');
		tableNew.className = 'tabtable rowhighlight';
		tableNew.id = me.getId();
		tableNew.cellPadding = 0;
		tableNew.cellSpacing = 0;
		tableNew.border = 0;
		me.parentId.appendChild(tableNew);

		me.table = table = tableNew;
		var tr = table.insertRow(0);
		for (var j=0, len=struc.length; j<len; j++){
			var filterHtml = '';
			if(struc[j].filterCallback){
        filterHtml = struc[j].filterCallback(i);
			}

			var sortClass = '';
			if (sortcol==j && me.sortable) {
				sortClass = sortdesc ? 'sortdesc' : 'sortasc';
			}
			var title = struc[j].title || '';
			title += filterHtml;
			sortClass += struc[j].headerClassName ? ' '+struc[j].headerClassName : '';
			//var colspan = struc[j].colSpan && me.totCols? || ''
      if(me.totalColumns < len){
        addTh(tr, j, title, sortClass+(struc[j].sort?' sort':''), (struc[j].colSpan || ''));
      }
		}


		if (loggedin && me.deleteHandler) {
			addTh(tr, j, '&nbsp;');
		}
//printfire('the Data', data);
		for (var k=0, dataLength=data.length; k < dataLength; k++) {
//printfire('DATA', data[k]);
			var tr = table.insertRow(k + 1);
			tr.className = 'mo';
      if(k == dataLength - 1){
        tr.className += ' last';
      }
//printfire('Structure %o', struc);			
			for (var j=0; j<struc.length; j++) {
				if (struc[j].handler) {
					var t = struc[j].handler(data[k]);
					addTd(tr, j, t, struc[j].className || "data");
//printfire('CONTINUE');
					continue;
				}
				if (data[k][struc[j].p] == null) {
					data[k][struc[j].p] = "";
				}
				//printfire("struc[j].type: %o", struc[j].type);
        //printfire('Data %o', data[k])

//printfire('start switch', struc[j].type);
        switch (struc[j].type) {
					case 'mediaclass':
						switch(data[k][struc[j].p]) {
							case 'TRACK':
								d = 'Song';
							break;
							case 'LIVE_RECORDING':
								d = 'Concert';
							break;
							case 'DJ_SET':
								d = 'DJ-set';
							break;
							case 'PROGRAM':
								d = 'Programma';
							break;
							case 'INTERVIEW':
								d = 'Interview';
							break;
							case 'STUDIO_SESSION':
								d = 'Sessie';
							break;
							default:
//								printfire("onbekende mediaclass: %o", data[k][struc[j].p]);
								d = data[k][struc[j].p].toLowerCase();
						}
						
						addTd(tr, j, d, struc[j].className);
					break;
					
					case 'mediaFragment.mediatype':
            var dataSet = data[k]['mediaFragment'];
            var rowColor = struc[j].rowColor ? struc[j].rowColor : 'fff';
            var d = '<div class="'+dataSet[struc[j].p].toLowerCase()+'icoon-'+rowColor+' mouseover" style="width:20px;height:20px"></div>';
            addTd(tr, j, d, struc[j].className);
          break;
					
					case 'mediatype':
//						var d = '<img src="/pix/iconen/'+data[k][struc[j].p].toLowerCase()+'-animatie-lichtrood.gif" >';
            var rowColor = struc[j].rowColor ? struc[j].rowColor : 'fff';
						var d = '<div class="'+data[k][struc[j].p].toLowerCase()+'icoon-'+rowColor+' mouseover" style="width:20px;height:20px"></div>';
						addTd(tr, j, d, struc[j].className);
					break;
					
					case 'luisterpaalIcoon':
					  var d = '<div class="cdIcoon';
					  d += data[k].active ? ' active' : ' inactive';
					  d += '">&nbsp;</div>';
					  var cls = struc[j].className;
						cls += data[k].active ? ' active' : ' inactive';
						addTd(tr, j, d, cls);
					break;
					
					case 'luisterpaalTitle':
            var d;
						if(data[k].active){
							d = '<a href="/speler/luisterpaal/'+data[k].number+'" rel="speler">'+data[k].title+'</a>';
						}
						else{
							d = data[k].title;
						}
            var cls = struc[j].className+' cdTitle';
            cls += data[k].active ? ' active' : ' inactive';
            addTd(tr, j, d, cls);
//printfire('LP TITLE', data[k], d);						
					break;
					
					case 'name':
//printfire('TB NAME ', data[k], d);            

						addTd(tr, j, data[k][struc[j].p] , struc[j].className);
					break;					
					
					case 'text':
						var td  = tr.insertCell(j);
						var t = '';
						td.className = 'data';
						
						if(struc[j].className){
							td.className += ' '+struc[j].className;
						}
						var href;
						if(struc[j].href){
							href = struc[j].href+(data[k].number || data[k].node);
						}
						if(struc[j].hreffn){
							href = struc[j].hreffn(data[k]);
						}

						if(href){
							t += '<a href="'+href+'">'+data[k][struc[j].p]+'</a>';
						}
						else {
							t += data[k][struc[j].p];
						}
						td.innerHTML = '<div>'+t+'</div>';
						//printfire("text: t: %o", t);
					break;
					
					case 'date':
						var d = "";
						if (data[k][struc[j].p])
							d = korteDatum(data[k][struc[j].p]);
						var tdClass = 'nowrap';
						tdClass += struc[j].className ? ' '+struc[j].className : '';
						addTd(tr, j, d, tdClass);
				  break;
					
					case 'userProfile':
            addTd(tr, j, data[k][struc[j].p], struc[j].className);
          break;
					
          case 'userProfileName':
						addTd(tr, j, data[k]['author'].profileName , struc[j].className);
          break;
					
					case 'userProfileBody':
            var body = data[k].showsite == 1 ? data[k][struc[j].p] : '&nbsp;'; 
            addTd(tr, j, body, struc[j].className);
          break;

					case 'userProfileImage':
					  //var dataSet = dataSet || dataSet;
						var td  = tr.insertCell(j);
						td.className = 'profileImage';
						if(struc[j].className){
		  				td.className += ' '+struc[j].className;
						}
						var url;
						if(data[k].profile.showSite){
	 					  url = (data[k].profile && data[k].profile.image) ? data[k].profile.image.URL+'+s(30)+part(0x0x30x20)+s(!30x!20)+f(asis)' : '/pix/iconen/user-lichtrood-op-fff.gif';
							td.innerHTML = '<a href="/mijn3voor12/'+data[k].profile.profileName+'/profiel">'+data[k].profile.profileName+'</a>';
							td.className += ' mouseover';
						}
						else{
  						url = '/pix/iconen/user-999-op-fff.gif'; 
              td.innerHTML = data[k].profile.profileName;
						} 
						td.style.backgroundImage = "url('"+url+"')";
						
					break;

          case 'match':
//printfire('Match %o', data[k]);
            var td = tr.insertCell(j);
            td.className = 'match';
            if(struc[j].className){
              td.className += ' '+struc[j].className;
            }
						var score = 0;
						var score_text = ['slecht', 'matig', 'goed', 'uitstekend'];
						var len = data[k][struc[j].p].length;
            if(len > 0){ score = 1; }
            if(len > 3){ score = 2; }
            if(len > 5){ score = 3; }
						var d = '<div class="match placeholder">&nbsp;';
						d += '<div class="fillcolor" style="width: '+ 50*score+'px"></div>';
            d += '<div>'+score_text[score]+'</div>';
						//d += score_text[score];
						d += '</div>';
						td.innerHTML = d;
						
          break;
          
					case 'commaList':
					  var d = data[k][struc[j].p].join(', ');
						var cls = struc[j].className || '';
						addTd(tr, j, d, cls, false);
          break;
          
					case 'userProfileType':
            var cls = struc[j].className;
            cls += data[k].showsite == 1 ? ' active' : ' inactive';
            addTd(tr, j, '' , cls);      
          break;
          
					case 'artists':
						var td  = tr.insertCell(j);
						td.className = 'data';
						if(struc[j].className)
							td.className += ' '+struc[j].className;
						var artists = data[k][struc[j].p];
						/*
						if (artists[0].images && artists[0].images[0]) {
							td.style.backgroundImage = 'url(\''+artists[0].images[0].URL+'+s(30)+crop(30x20)\')';
						}
						*/

						var t = '';
						for (var m=0; m<artists.length; m++){
							t += artists[m].name;
							if(m < artists.length-1){
								t +=', ';
							}
						}

						td.innerHTML = '<div><span class="artists">'+(t || '&nbsp;')+'</span></div>';
						break;
					case 'tags':
						var tags = data[k][struc[j].p];
						var t = '<div>';
						if(tags.length > 0){
							var tagsClass = this.struc[j].columnColor ? 'tags col_'+this.struc[j].columnColor : 'tags';
							t += '<ul class="'+tagsClass+'">';
							for (var m=0; m<tags.length; m++) {
								if (tags[m])
									t += '<li>'+tags[m].value+'</li>';
								if (m > 10) // max tags
									break;
							}
              t += '</ul>';
						}
							t += '</div>';
						addTd(tr, j, t, struc[j].className);
					break;
					
					case 'score':
						var score = data[k][struc[j].p];
						var t = "<div class='score-rand'><div class='score' style='width: "+Math.floor(40*score)+"px'></div></div>";
						addTd(tr, j, t, struc[j].className);
					break;
					
					case 'mediaFragment.rating':
					  var ds = data[k]['mediaFragment']
					case 'rating':
					  var dataSet = ds || data[k];
						var rating = Math.floor((dataSet[struc[j].p])/2);
            var t = rating == 0 ? '<div>' : '<div>&nbsp;';
						for (var m=0; m<rating; m++)
							t += '<img src="/pix/iconen/ster-donkergrijs.png" width="18" height="20" alt="" class="png" />';
						t += '</div>';
						var cls = struc[j].className;
						cls += dataSet.active ? ' active' : ' inactive';
						addTd(tr, j, t, cls);
          break;
				}
			}
			if (loggedin && me.deleteHandler) {
					var td  = tr.insertCell(-1);
					td.className = 'delete';
					td.innerHTML = '<input type="hidden" value="'+data[k].number+'"/>&nbsp;';
					td.onclick = deleteRowHandler;
			}
		
		}
		attach('#'+me.getId()+' td.data', rowhighlight);
		attach('#'+me.getId()+' td.mouseover', rowhighlight);
		if (tabs[i].onrowclick) { 
			attach('#'+me.getId()+' td.data', doOnClick, tabs[i].onrowclick);
		}
	
		// no data
		if(data.length == 0 && me.noResultHandler){
			me.noResultHandler(me.parentId);
		}
		refresh(table);
	}
	
	function doOnClick(elt, onclick) {
    var tr = getParentByTagName(elt, 'tr');
		elt.onclick = function() {
			if (hasClass(tr, 'mo')) {
				var a = tr.getElementsByTagName('a');
				if (a) {
					return onclick(a[0].href);
				}
			}
		}
	}

	function addTd(tr, j, text, className, addDataClass) {
		var td  = tr.insertCell(j);
		td.className = className;
		if (j == tabs[i].columns.length - 1)
			className += ' last';
		td.className += addDataClass ? ' data' : '';
		td.innerHTML = text || '&nbsp;';
	}
	
	function addTh(tr, j, text, className, colSpan) {
		var th = tr.insertCell(j);
		var colSpan = colSpan || 1;
    th.colSpan = colSpan;
    me.totalColumns += colSpan;
//printfire('insert tH %o', me.totalColumns);    
    if (/sort/.test(className)) {
			th.onclick = columnClickHandler;
		}
		if (me.headerRenderer)
			text = me.headerRenderer(text);
		th.innerHTML = text;
		if (j == tabs[i].columns.length - 1)
			className += ' last';
		th.className = className+' header';

		function columnClickHandler(evt) {
// printfire('sortclick %o - %o - %o', i, evt, th);
      if (me.onHeaderClick) {
				if (!me.onHeaderClick(i))
					return;
			}
			if (struc[j].changeorder === false) {
			  populate(th.cellIndex, struc[j].defaultdesc);
			}
			else {
				if (th.cellIndex == sortcol) {
					if (me.tabs[i].total > me.pageSize)
						me.tabs[i].offset = me.tabs[i].total - me.tabs[i].offset - me.pageSize;
						if (me.tabs[i].offset < 0)
							me.tabs[i].offset = 0;
					populate(sortcol, !sortdesc);
				} else {
					populate(th.cellIndex, struc[j].defaultdesc || false);
				}
			}
		}
	}
	/**
	 * here sorting takes place
	 * @TODO make sortable for match neighbours
	 * 
	 * @param {Object} col
	 * @param {Object} desc
	 */
	function sortRows(col, desc) {
		me.tabs[i].sortcol = sortcol = col;
		me.tabs[i].sortdesc = sortdesc = desc;

		if (me.compare) {
			data.sort(me.compare(struc, sortcol, sortdesc));
		} else {
			data.sort(comp);
		}

		function comp(a, b) {
      if (struc[sortcol].attribute) {
        ac = a[struc[sortcol].p][0][struc[sortcol].attribute];
				bc = b[struc[sortcol].p][0][struc[sortcol].attribute];
			} else {
				ac = a[struc[sortcol].p];
				bc = b[struc[sortcol].p];
			}

			if (typeof ac == "string") {
				ac = ac.toLowerCase();
			}
			if (typeof bc == "string") {
				bc = bc.toLowerCase();
			}
			if (ac > bc)
				return sortdesc ? 1 : -1;
			if (ac == bc)
				return 0;
			else
				return sortdesc ? -1 : 1;
		}
	}
};

var maandenKort = ['jan', 'feb', 'maa', 'apr', 'mei', 'juni', 'juli', 'aug', 'sep', 'okt', 'nov', 'dec'];

function korteDatum(date) {
//	return date.getDate()+" "+maandenKort[date.getMonth()]+" "+date.getFullYear()+" "+date.getHours()+(date.getMinutes()>=10?":":":0")+date.getMinutes();
	return date.getDate()+" "+maandenKort[date.getMonth()]+" "+date.getFullYear();
}