/* [file src="swfobject.js"]
*/
/*	SWFObject v2.0 <http://code.google.com/p/swfobject/>
	Copyright (c) 2007 Geoff Stearns, Michael Williams, and Bobby van der Sluis
	This software is released under the MIT License <http://www.opensource.org/licenses/mit-license.php>
*/
var swfobject=function(){var Z="undefined",P="object",B="Shockwave Flash",h="ShockwaveFlash.ShockwaveFlash",W="application/x-shockwave-flash",K="SWFObjectExprInst",G=window,g=document,N=navigator,f=[],H=[],Q=null,L=null,T=null,S=false,C=false;var a=function(){var l=typeof g.getElementById!=Z&&typeof g.getElementsByTagName!=Z&&typeof g.createElement!=Z&&typeof g.appendChild!=Z&&typeof g.replaceChild!=Z&&typeof g.removeChild!=Z&&typeof g.cloneNode!=Z,t=[0,0,0],n=null;if(typeof N.plugins!=Z&&typeof N.plugins[B]==P){n=N.plugins[B].description;if(n){n=n.replace(/^.*\s+(\S+\s+\S+$)/,"$1");t[0]=parseInt(n.replace(/^(.*)\..*$/,"$1"),10);t[1]=parseInt(n.replace(/^.*\.(.*)\s.*$/,"$1"),10);t[2]=/r/.test(n)?parseInt(n.replace(/^.*r(.*)$/,"$1"),10):0}}else{if(typeof G.ActiveXObject!=Z){var o=null,s=false;try{o=new ActiveXObject(h+".7")}catch(k){try{o=new ActiveXObject(h+".6");t=[6,0,21];o.AllowScriptAccess="always"}catch(k){if(t[0]==6){s=true}}if(!s){try{o=new ActiveXObject(h)}catch(k){}}}if(!s&&o){try{n=o.GetVariable("$version");if(n){n=n.split(" ")[1].split(",");t=[parseInt(n[0],10),parseInt(n[1],10),parseInt(n[2],10)]}}catch(k){}}}}var v=N.userAgent.toLowerCase(),j=N.platform.toLowerCase(),r=/webkit/.test(v)?parseFloat(v.replace(/^.*webkit\/(\d+(\.\d+)?).*$/,"$1")):false,i=false,q=j?/win/.test(j):/win/.test(v),m=j?/mac/.test(j):/mac/.test(v);/*@cc_on i=true;@if(@_win32)q=true;@elif(@_mac)m=true;@end@*/return{w3cdom:l,pv:t,webkit:r,ie:i,win:q,mac:m}}();var e=function(){if(!a.w3cdom){return }J(I);if(a.ie&&a.win){try{g.write("<script id=__ie_ondomload defer=true src=//:><\/script>");var i=c("__ie_ondomload");if(i){i.onreadystatechange=function(){if(this.readyState=="complete"){this.parentNode.removeChild(this);V()}}}}catch(j){}}if(a.webkit&&typeof g.readyState!=Z){Q=setInterval(function(){if(/loaded|complete/.test(g.readyState)){V()}},10)}if(typeof g.addEventListener!=Z){g.addEventListener("DOMContentLoaded",V,null)}M(V)}();function V(){if(S){return }if(a.ie&&a.win){var m=Y("span");try{var l=g.getElementsByTagName("body")[0].appendChild(m);l.parentNode.removeChild(l)}catch(n){return }}S=true;if(Q){clearInterval(Q);Q=null}var j=f.length;for(var k=0;k<j;k++){f[k]()}}function J(i){if(S){i()}else{f[f.length]=i}}function M(j){if(typeof G.addEventListener!=Z){G.addEventListener("load",j,false)}else{if(typeof g.addEventListener!=Z){g.addEventListener("load",j,false)}else{if(typeof G.attachEvent!=Z){G.attachEvent("onload",j)}else{if(typeof G.onload=="function"){var i=G.onload;G.onload=function(){i();j()}}else{G.onload=j}}}}}function I(){var l=H.length;for(var j=0;j<l;j++){var m=H[j].id;if(a.pv[0]>0){var k=c(m);if(k){H[j].width=k.getAttribute("width")?k.getAttribute("width"):"0";H[j].height=k.getAttribute("height")?k.getAttribute("height"):"0";if(O(H[j].swfVersion)){if(a.webkit&&a.webkit<312){U(k)}X(m,true)}else{if(H[j].expressInstall&&!C&&O("6.0.65")&&(a.win||a.mac)){D(H[j])}else{d(k)}}}}else{X(m,true)}}}function U(m){var k=m.getElementsByTagName(P)[0];if(k){var p=Y("embed"),r=k.attributes;if(r){var o=r.length;for(var n=0;n<o;n++){if(r[n].nodeName.toLowerCase()=="data"){p.setAttribute("src",r[n].nodeValue)}else{p.setAttribute(r[n].nodeName,r[n].nodeValue)}}}var q=k.childNodes;if(q){var s=q.length;for(var l=0;l<s;l++){if(q[l].nodeType==1&&q[l].nodeName.toLowerCase()=="param"){p.setAttribute(q[l].getAttribute("name"),q[l].getAttribute("value"))}}}m.parentNode.replaceChild(p,m)}}function F(i){if(a.ie&&a.win&&O("8.0.0")){G.attachEvent("onunload",function(){var k=c(i);if(k){for(var j in k){if(typeof k[j]=="function"){k[j]=function(){}}}k.parentNode.removeChild(k)}})}}function D(j){C=true;var o=c(j.id);if(o){if(j.altContentId){var l=c(j.altContentId);if(l){L=l;T=j.altContentId}}else{L=b(o)}if(!(/%$/.test(j.width))&&parseInt(j.width,10)<310){j.width="310"}if(!(/%$/.test(j.height))&&parseInt(j.height,10)<137){j.height="137"}g.title=g.title.slice(0,47)+" - Flash Player Installation";var n=a.ie&&a.win?"ActiveX":"PlugIn",k=g.title,m="MMredirectURL="+G.location+"&MMplayerType="+n+"&MMdoctitle="+k,p=j.id;if(a.ie&&a.win&&o.readyState!=4){var i=Y("div");p+="SWFObjectNew";i.setAttribute("id",p);o.parentNode.insertBefore(i,o);o.style.display="none";G.attachEvent("onload",function(){o.parentNode.removeChild(o)})}R({data:j.expressInstall,id:K,width:j.width,height:j.height},{flashvars:m},p)}}function d(j){if(a.ie&&a.win&&j.readyState!=4){var i=Y("div");j.parentNode.insertBefore(i,j);i.parentNode.replaceChild(b(j),i);j.style.display="none";G.attachEvent("onload",function(){j.parentNode.removeChild(j)})}else{j.parentNode.replaceChild(b(j),j)}}function b(n){var m=Y("div");if(a.win&&a.ie){m.innerHTML=n.innerHTML}else{var k=n.getElementsByTagName(P)[0];if(k){var o=k.childNodes;if(o){var j=o.length;for(var l=0;l<j;l++){if(!(o[l].nodeType==1&&o[l].nodeName.toLowerCase()=="param")&&!(o[l].nodeType==8)){m.appendChild(o[l].cloneNode(true))}}}}}return m}function R(AE,AC,q){var p,t=c(q);if(typeof AE.id==Z){AE.id=q}if(a.ie&&a.win){var AD="";for(var z in AE){if(AE[z]!=Object.prototype[z]){if(z=="data"){AC.movie=AE[z]}else{if(z.toLowerCase()=="styleclass"){AD+=' class="'+AE[z]+'"'}else{if(z!="classid"){AD+=" "+z+'="'+AE[z]+'"'}}}}}var AB="";for(var y in AC){if(AC[y]!=Object.prototype[y]){AB+='<param name="'+y+'" value="'+AC[y]+'" />'}}t.outerHTML='<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"'+AD+">"+AB+"</object>";F(AE.id);p=c(AE.id)}else{if(a.webkit&&a.webkit<312){var AA=Y("embed");AA.setAttribute("type",W);for(var x in AE){if(AE[x]!=Object.prototype[x]){if(x=="data"){AA.setAttribute("src",AE[x])}else{if(x.toLowerCase()=="styleclass"){AA.setAttribute("class",AE[x])}else{if(x!="classid"){AA.setAttribute(x,AE[x])}}}}}for(var w in AC){if(AC[w]!=Object.prototype[w]){if(w!="movie"){AA.setAttribute(w,AC[w])}}}t.parentNode.replaceChild(AA,t);p=AA}else{var s=Y(P);s.setAttribute("type",W);for(var v in AE){if(AE[v]!=Object.prototype[v]){if(v.toLowerCase()=="styleclass"){s.setAttribute("class",AE[v])}else{if(v!="classid"){s.setAttribute(v,AE[v])}}}}for(var u in AC){if(AC[u]!=Object.prototype[u]&&u!="movie"){E(s,u,AC[u])}}t.parentNode.replaceChild(s,t);p=s}}return p}function E(k,i,j){var l=Y("param");l.setAttribute("name",i);l.setAttribute("value",j);k.appendChild(l)}function c(i){return g.getElementById(i)}function Y(i){return g.createElement(i)}function O(k){var j=a.pv,i=k.split(".");i[0]=parseInt(i[0],10);i[1]=parseInt(i[1],10);i[2]=parseInt(i[2],10);return(j[0]>i[0]||(j[0]==i[0]&&j[1]>i[1])||(j[0]==i[0]&&j[1]==i[1]&&j[2]>=i[2]))?true:false}function A(m,j){if(a.ie&&a.mac){return }var l=g.getElementsByTagName("head")[0],k=Y("style");k.setAttribute("type","text/css");k.setAttribute("media","screen");if(!(a.ie&&a.win)&&typeof g.createTextNode!=Z){k.appendChild(g.createTextNode(m+" {"+j+"}"))}l.appendChild(k);if(a.ie&&a.win&&typeof g.styleSheets!=Z&&g.styleSheets.length>0){var i=g.styleSheets[g.styleSheets.length-1];if(typeof i.addRule==P){i.addRule(m,j)}}}function X(k,i){var j=i?"visible":"hidden";if(S){c(k).style.visibility=j}else{A("#"+k,"visibility:"+j)}}return{registerObject:function(l,i,k){if(!a.w3cdom||!l||!i){return }var j={};j.id=l;j.swfVersion=i;j.expressInstall=k?k:false;H[H.length]=j;X(l,false)},getObjectById:function(l){var i=null;if(a.w3cdom&&S){var j=c(l);if(j){var k=j.getElementsByTagName(P)[0];if(!k||(k&&typeof j.SetVariable!=Z)){i=j}else{if(typeof k.SetVariable!=Z){i=k}}}}return i},embedSWF:function(n,u,r,t,j,m,k,p,s){if(!a.w3cdom||!n||!u||!r||!t||!j){return }r+="";t+="";if(O(j)){X(u,false);var q=(typeof s==P)?s:{};q.data=n;q.width=r;q.height=t;var o=(typeof p==P)?p:{};if(typeof k==P){for(var l in k){if(k[l]!=Object.prototype[l]){if(typeof o.flashvars!=Z){o.flashvars+="&"+l+"="+k[l]}else{o.flashvars=l+"="+k[l]}}}}J(function(){R(q,o,u);if(q.id==u){X(u,true)}})}else{if(m&&!C&&O("6.0.65")&&(a.win||a.mac)){X(u,false);J(function(){var i={};i.id=i.altContentId=u;i.width=r;i.height=t;i.expressInstall=m;D(i)})}}},getFlashPlayerVersion:function(){return{major:a.pv[0],minor:a.pv[1],release:a.pv[2]}},hasFlashPlayerVersion:O,createSWF:function(k,j,i){if(a.w3cdom&&S){return R(k,j,i)}else{return undefined}},createCSS:function(j,i){if(a.w3cdom){A(j,i)}},addDomLoadEvent:J,addLoadEvent:M,getQueryParamValue:function(m){var l=g.location.search||g.location.hash;if(m==null){return l}if(l){var k=l.substring(1).split("&");for(var j=0;j<k.length;j++){if(k[j].substring(0,k[j].indexOf("="))==m){return k[j].substring((k[j].indexOf("=")+1))}}}return""},expressInstallCallback:function(){if(C&&L){var i=c(K);if(i){i.parentNode.replaceChild(L,i);if(T){X(T,true);if(a.ie&&a.win){L.style.display="block"}}L=null;T=null;C=false}}}}}();

/* [file src="Platform.js"]
*/
/*	usemedia.com . joes koppers . 10-12.2008
	thnx for reading this code */


/*	Virtueel Platform main application
*/

Platform = function(lan,path,login,sections,dev,internal)
{
	var obj = this;
	
	//defaults
	this.name = 'VP';
	this.version = '2.5';
	this.language = lan;
	this.mode = (dev)? 'test':'production';
	this.pagetitle = 'Virtueel Platform'; //used by history
	this.internal = internal;
	
	//initialize server comm
	this.server = XHR.init('/db');
	
	//settings
	this.sections = sections;
	this.parsePath(path);
	this.filters = ['time','type','tag'];
//	this.vpsection = 10; //default selected type in vp section
	this.msg = this.addMessages();
	this.hcolor = '#3b8fad';//blue accent color '#007f6d'; //green accent color
	this.pagelength = 20; //items per query/page
	this.page = 1;
    

	//extend with edit script when logged in
	this.login = login!=''? login:false;
	if (this.login)
	{
		utils.loadScript('Platform.Edit.js',function() { obj.enableEditing(); obj.initGui() } );
	} else {
		this.initGui();
        if(this.section != "map" && this.section != "agenda" && this.section != "identity") {
            this.layout.toggleSets();
        }
	}
}

Platform.prototype.initGui = function()
{
	/*	build GUI
	*/
	this.addLayout();
	
	if (this.section=="agenda") this.addAgenda();
	if (this.section=="map") this.addMap();
	if (this.section=="identity") this.addIdentity();

	if(this.section != "map" && this.section != "agenda"  && this.section != "identity") {
 //       this.vpsection = 10;
    }
	this.addFilter();

	//load item //->move to history script later
	if (this.section!='identity' && this.section!='map' && !this.selectedSet && (this.hash || this.path[0]))
	{
		var id = this.hash || this.path[0];
		if (id=='' || isNaN(Number(id))) return;

		dbg.msg('Platform: deeplink to item id=',id);
		this.deeplink = id; //blocks closeItem call from toggleSets
		this.selectItem(id);
	}
 //   this.vpsection = null;
}

Platform.prototype.parsePath = function(path)
{
	/*	parse entry path
	*/
	var p = path.split('/');
	var h = window.location.hash.substr(1);
	dbg.msg('Platform: path=',path,' p=',p,', hash=',window.location.hash);
	
	//section
	switch (p[0])
	{
		case 'instituut':
		case 'institute':
			this.sets = true;
			this.section = 'vp';
			break;
			
		case 'agenda':
			this.section = 'agenda';
			break;
		case 'identity':
            this.section = 'identity';
            break;
		case 'organisaties':
		case 'organisations':
			this.section = 'map';
			break;

		default:
			this.sets = true;
			this.section = 'index';
			this.showintro = !this.internal; //show intro if referrer is not internal
	}
	
	//hash (set, filter or vpsection)
	if (h!='')
	{
		//set
		if (h.indexOf('set/')!=-1)
		{
			this.selectedSet = h.replace('set/','');
			dbg.msg('Platform: selectedSet=',this.selectedSet);
		}
		
		//filter
		if (h.indexOf('filter/')!=-1)
		{
			var filter = h.replace('filter/','');
			if (filter!='')
			{
				this.selectedSet = 'bookmark';
				this.bookmarkedFilter = filter;
				this.showintro = false;
				dbg.msg('Platform: selectedSet=',this.selectedSet,' filter=',this.bookmarkedFilter);
			}
			else
			{
				//reset filter, (always) show intro
				this.showintro = true;
			}
		}
		
		//vpsection
		if (h.indexOf('instituut/')!=-1 || h.indexOf('institute/')!=-1)
		{
			this.vpsection = this.language=='nl'? h.replace('instituut/',''):h.replace('institute/','');
			this.showintro = false;
			
			dbg.msg('Platform: vpsection=',this.vpsection);
		}
		
	}
	
	this.path = p;
	this.hash = h;
}

Platform.prototype.addMessages = function()
{
	/*	bi-lingual interface texts
	*/
	var m = new Object();
	var nl = this.language=='nl';
	
	m['home'] = nl? 'terug naar begin site':'back to site start';
	m['print'] = nl? 'printbare tekst versie':'printable text version';
	m['logout'] = nl? 'ingelogd in usebase, klik om uit te loggen':'logged into usebase, click to logout';
	m['query_too_short'] = nl? 'Voer aub minimaal 3 characters in om op te zoeken':'Please insert a minimum of 3 chars to search for';
	m['filter_reset'] = nl? 'reset alle filter keuzes':'reset all filter options';
	m['filter_back'] = nl? 'terug naar filter resultaat lijst':'back to filter result list';
	m['filter_bookmark'] = nl? 'rechts-klik (ctrl-klik) om deze filter te bookmarken':'right-click (ctrl-click) to bookmark this filter';
	m['filter_loaded'] = nl? 'wacht aub tot het filter geladen is..':'please wait until filter is loaded..';
	m['columns_nav'] = nl? 'lees verder ':'continue reading ';
	m['article_reset'] = nl? 'terug naar het begin van het artikel':'return to start of article';
	m['map_bounds'] = nl? 'toon hele gebied':'show entire area';
	m['show_on_map'] = nl? 'toon op kaart':'show on map';
	m['go_today'] = nl? 'terug naar vandaag':'back to today';
	m['form_required'] = nl? 'vul aub alle verplichte velden in':'please fill in all required fields';
	m['form_submitted'] = nl? 'uw gegevens zijn verstuurd.':'you\'re information has been sent.';
	
	//update Date formatting (default is english)
	if (nl)
	{
		Date.months = ['januari','februari','maart','april','mei','juni','juli','augustus','september','oktober','november','december'];
		Date.days = ['zondag','maandag','dinsdag','woensdag','donderdag','vrijdag','zaterdag'];
	}
		
	return m;	
}

Platform.prototype.select = function(section)
{
	/*	switch main section of site (index, agenda or map)
	*/
    //console.log(section);
	var location = '/';
	if (this.language=='en') location += 'en/';
	
	if (section=='map') location += this.language=='nl'? 'organisaties':'organisations';
	if (section=='agenda') location += 'agenda';
	if (section=='identity') location += 'identity';
	
	//keep selected item
	if (section!='map' && this.item) location += location.substr(location.length-1)=='/'? this.item:'/'+this.item;
	
	//for development
	if (String(top.location).indexOf('dev=true')!=-1)
	{
		location += location.substr(location.length-1)=='/'? '?dev=true':'/?dev=true';
	}
	
	top.location = location;
}

Platform.prototype.toggleLanguage = function(lan)
{
	this.language = this.language=='nl'? 'en':'nl';
	this.select(this.section);
}

Platform.prototype.selectSection = function(section)
{
	/*	select vp section (about, contact)
	*/
	dbg.msg('Platform: selectSection(',section,')');
	
	if (this.section!='index')
	{
		//switch to index
		var s = this.sections[section];
		var location = '/';
		if (this.language=='en') location += 'en/institute/';
		else location += 'instituut/';
		location += s.replace(/ /g,'_');
	
		top.location = location;
		return;
	}
	
	if (!this.filter['time'].all) //prevent errors on slow connection
	{
	//	alert(this.msg['filter_loaded']); 
		return; 
	}
    
	//if (this.layout.filter.intro) this.layout.toggleFilter();
	
	this.vpsection = section;
		
	if (!this.filter['time'].all.selected)
	{
		//enable all options in type filter
		for (var id in this.filter['type'].buttons) this.filter['type'].buttons[id].setDisabled(false);
	}

	this.filter.rset();
	this.filter.filter('type');
    if(section == 1004) {
        this.filter.selectSet(section); 
    }
}

Platform.prototype.selectItem = function(id,rsp)
{
    
	/*	display a single item in expanded view,
	*/
	if (!rsp)
	{
		dbg.msg('Platform: selectItem(',id,')');

		this.layout.resetContent();
		this.layout.toggleContent('item');
	
		dbg.tmr();	
		var obj = this;
		this.server.get('item',function(rsp) { obj.selectItem(id,rsp) },'lan',this.language,'id',id);
		return;
	}

	//validate
	if (!rsp.item)
	{
		//window.location.hash = '';
		this.layout.toggleContent('list');
		return;
	}
	
	id = rsp.item.id; //update to real id, could be a friendly
    //alert(id);

    if(this.items && this.items[id] != undefined) {
        
        this.layout.updateNavigation(this.items[id].index+1,true);
    } 	
    
	dbg.msg('Platform, got item',rsp.dbg || '','tmr',' h=',window.location.hash);

	//update history
	if (window.location.hash.substr(1)!=id && this.path[0]!=id)
	{
		window.location.hash = '#'+id; //->TMP, update history object later
		//page title
		document.title = this.pagetitle+' - '+rsp.item.title.replace(/&#039;/,'\'');
	}
	
	//update item browse navigation (for index only)
	if (this.section=='index' && this.items && this.items[id])
	{
        
	}
    
    //update content
	this.item = id;
	var obj = this;
  

	window.setTimeout(function() { obj.layout.updateContent(rsp.item) },100); //delay is for loading anim display
}

Platform.prototype.closeItem = function()
{
	if (!this.item) return;
	
	dbg.msg('Platform: closeItem, item=',this.item,', this.path=',this.path);

	//reset path for external deeplinked item //->prevents links like /itemid#itemid, at cost of a page refresh. use this?
// 	if (this.item==this.path[0])
// 	{
// 		top.location = '/';
// 		return;
// 	}
	
	delete this.item;
        this.layout.toggleContent('list');
    
    
	this.layout.scrollTo(0,true);
	document.title = this.pagetitle;
}

Platform.prototype.addItems = function(items)
{
	/*	display current filter result set
	*/

	//clear current display
	for (var id in this.items)
	{
		this.items[id].gui.dispose();
	}
	delete this.items;
    if(this.section=='identity') {
        return;
    }
	if ( this.section=='map' || (this.section=='agenda' && this.agenda.mode!='year'))
	{
		this.items = new Object();
		this[this.section].addItems(items);
		return;
	}
	
	dbg.msg('Platform, adding items..');
	
	//update navigation
	this.layout.updateNavigation(this.page);
	
	//add new
	this.items = new Object();
	for (var i=0; i<items.length; i++)
	{
		var id = items[i].id;
		this.items[id] = items[i];
		this.items[id].index = i;
		
		//create list item
		this.items[id].gui = this.layout.createItem(items[i]);
		
		//expand first item
		if ((i==0 && this.page==1) || this.vpsection) this.items[id].gui.togglePreview();
	}
	
	if (this.vpsection && this.filter.loaded) delete this.vpsection;
	
	//browsing expanded items?
	if (this.browsing!=undefined) 
	{
		this.selectItem(items[this.browsing-1].id);
		delete this.browsing;
	}
	
	//update page gradient after adding items (pagelength might be changed, skipped for MSIE)
	//if (!browser.cssfilter) this.layout.gradient.update(this.layout.w,this.layout.h);
}

Platform.prototype.browseItems = function(d,rsp)
{
	/*	browse current filter result set
	*/
	if (!rsp)
	{
		dbg.msg('Platform: browseItems(',d,'), current page=',this.page);
		if (d!='init') this.page += (d=='next')? 1:-1;

		var obj = this;
		var action = 'browse';
		var offset = (this.page-1)*20;
    
		//current search and tags
        this.filter.tagmodus = 'AND';
		var separator = this.filter.tagmodus =='OR' ? ',':',';
		var tags = this.filter.checkOptions('tag').join(separator);
		var search = this.filter.search.button.selected? this.filter.search.input.value:'';
		var searchtype = this.filter.search.type=='boolean'? 'boolean':'';
// 		var vp = this.selectedSet && this.selectedSet.vp? 1:0;
        if(this.filter.selectedSet && (this.filter.selectedSet.selected == true || this.filter.selectedSet.selected == 1)) {
            var types = this.filter.selectedSet.types;
            var period = this.filter.selectedSet.times;
            if(offset == 0) {
                action = 'init';
            }
            		this.server.get('items',function(rsp) { obj.browseItems(d,rsp) },'vp',0,'lan',this.language,'action',action,'section',this.section,'offset',offset,'types',types,'tags',tags,'search',search,'searchtype',searchtype,'times',period);

        } else {
            var period = this.agenda && this.agenda.mode!='year'? this.agenda.period:'';
            var types = this.filter.checkOptions('type').join(separator);
		this.server.get('items',function(rsp) { obj.browseItems(d,rsp) },'vp',0,'lan',this.language,'action',action,'section',this.section,'offset',offset,'types',types,'tags',tags,'search',search,'searchtype',searchtype,'period',period);
            
        }
		//query with offset
	}
	else
	{
		dbg.msg('Filter: <span style="color:#00a890">got items, count=<b style="font-size:10px">',rsp.query.rows,'</b>, t=',rsp.query.time,'</span>','tmr');
		if (rsp.dbg) dbg.msg('Filter: dbg=',rsp.dbg);
		
		this.addItems(rsp.items);
	}
}

Platform.prototype.browseExpandedItems = function(d)
{
	/*	browse expanded items in current filter result set
	*/
	var index = this.items[this.item].index;
		index += (d=='next')? 1:-1;
		
	dbg.msg('Platform: browseExpandedItems, current=',this.items[this.item].index,', next=',index);
		
	var offset = (this.page-1)*20;
		
	if (index==-1 || index==this.pagelength )
	{
		//load new page first
		this.browsing = d=='next'? 1:this.pagelength;
		this.browseItems(d);
	}
	else
	{
		//find and select next item
		for (var id in this.items)
		{
			if (this.items[id].index==index) break;
		}
        
		this.selectItem(id);
	}
}

Platform.prototype.submitForm = function(elm)
{
	/*	validate and submit item form
	*/
	if (!this.item) return;

	dbg.msg('Platform: submit.. id=',this.item);

	//get and validate inputs
	var inputs = new Array('id='+this.item,'lan='+this.language);
	var fail = false;
	for (var i=0; i<this.layout.item['item-form'].elements.length; i++)
	{
		var e = this.layout.item['item-form'].elements[i];
		if (e.type=='button') continue;
		if (e.type!='checkbox' && e.className.indexOf('required')!=-1 && e.value=='')
		{
			fail = true;
			break;
		}
		var value = e.type=='checkbox'? e.checked? 'on':'':e.value
		inputs.push(e.name.substr(6)+'='+encodeURIComponent(value));
	}
	
	if (fail)
	{
		alert(this.msg['form_required']);
		return;
	}

	//disable submit button
//	elm.style.display = 'none';
	var img = document.createElement('img');
//		img.style.marginRight = '6px';
//		img.src = 'media/item_loading.gif';
	elm.parentNode.appendChild(img);
	
	//post form
	for (var id in inputs)
	
	var obj = this;
	var ajax = new XHR.XMLObj();
		ajax.done_action = function(rsp) { obj.submittedForm(rsp,elm) };
		ajax.post_vars = inputs.join('&');

	ajax.httpRequest('/db/formsubmit.php');
}

Platform.prototype.submittedForm = function(rsp,elm,parsed)
{
	/*	validate post and display message
	*/
	if (!parsed)
	{
		var obj = this;
		XHR.parse(rsp,function(rsp) { obj.submittedForm(rsp,elm,true) } );
		return;
	}
	
	if (!rsp.isError)
	{
		var msg = rsp.message || this.msg['form_submitted'];
		var c = this.layout.columns;
			c.rset();
			c.navigate('rset');
			c.init('<p>'+msg+'</p>');
	}
	else
	{
		//re-enable submit button
	//	elm.style.display = 'block';
		elm.parentNode.removeChild(elm.parentNode.lastChild)
	}
}


Platform.prototype.addHistory = function()
{
	/*	ajax bookmarking and browse history
	*/
	function History(parent)
	{
		this.parent = parent;
		
		this.path = '';
		this.i_path = '';

		this.init();
	}
	
	History.prototype.init = function()
	{
		var obj = this;
		
		if (!browser.cssfilter)
		{
			/*	periodically check location for hash changes 
			*/
			this.monitor = window.setInterval(function() { obj.check() },50);
		}
		else
		{
			/*	IE: need to add hidden iframe, as location.hash changes are not added to browser history
			*/
			if (!this.iframe)
			{
				dbg.msg('<span style="color:#999966">[IE]History: creating iframe..</span>');
				
				var div = document.createElement('div');
					div.id = 'history-iframe-container';
					div.innerHTML = '<iframe id="history-iframe" name="history-iframe" onload="vp.history.init()" src="media/blank.gif" style=""></iframe>'; //use inline onload script to get it working
				document.body.appendChild(div);
				this.iframe = div.firstChild;
			}
			else if (!this.iframeloaded)
			{
				this.iframeloaded = true;
				
				/*	periodically check for iframe content and location hash changes 
				*/
				this.monitor = setInterval(function () {
			
					var elm = obj.iframe.contentWindow.document.getElementById('path');
					var path = elm? elm.innerText:'';
					var hash = window.location.hash.substr(1);
		
					//dbg.msg('checking iframe, p=',path);
					
					if (path!=obj.i_path)
					{
						//iframe changed
						dbg.msg('<span style="color:#999966">[IE]History: iframe changed! obj.path=',obj.path,'</span>');
						obj.i_path = path;
						if (path!='') window.location.hash = path; //will cause update, see below
						else 
						{
							//no hisotry beyond initital empty iframe
							window.history.go(1);							
						}
					}
					else if (hash!=obj.path)
					{
						//hash changed
						dbg.msg('<span style="color:#999966">[IE]History: hash changed!</span>');
						obj.check();
					}
				}, 50);
			}
		}
	}
	
	History.prototype.update = function(path,search)
	{
		/*	update location (history)
		*/
		dbg.msg('<span style="color:#999966">History: set path.. (',path,',',search,')</span>');
	
		if (!path)
		{
			//get path from current interface state
// 			var section = this.parent.sections_lookup.labels[this.parent.section];
// 			var path = this.parent.section_group +'/'+ section;
// 		
// 			if (this.parent.item) path += '/' + this.parent.item;
// 			
// 			if (this.deeplink) delete this.deeplink;
// 			if (this.deepsearch) delete this.deepsearch;
		}
		else
		{
			//remove trailing + in search queries
//			if (path.substr(path.length-1)=='+') path = path.substring(0,path.length-1)+'/';		
		}

		dbg.msg('<span style="color:#999966">History: path = ',path,'</span>');
		
		//update window title
		var title = path;
		if (this.parent.item && !search) title = this.parent.items[this.parent.item].title; //actual title for expanded item
		//if (search) title = 'search/'+this.parent.search.inputfield.value
		
		//var title = (!this.parent.item)? path:this.parent.items[this.parent.item].title; //actual title for expanded item
		document.title = this.parent.pagetitle+' - '+title;
		
		if (path!=window.location.hash.substr(1))
		{
			
			//return; //no update needed
		
			this.path = path;
			window.location.hash = path;
			
			//IE workaround
			if (this.iframe) this.updateIframe(path);
		}
		else dbg.msg('<span style="color:#999966">History: no update</span>');
		
		//active search?
		if (search) this.update(search);
	
// 		if (!browser.cssfilter)
// 		{
// 			if (search) this.update(search);
// 		}
// 		else
// 		{
// 			if (search) this.search.setpath = true;
// 			//update hidden iframe to get this working in IE
// 			
// 			//window.location.hash = path;
// 	
// 			
// 			
// 			
// 			this.updateIframe(path);
// 		}	
	}

	History.prototype.updateIframe = function(path)
	{
		/*	IE-only, update contents of hidden iframe to force browser history entry
		*/
		dbg.msg('<span style="color:#999966">[IE]History: update iframe to path=',path,'</span>');
		
		this.i_path = path;
		
		var doc = this.iframe.contentWindow.document;
		doc.open();
		doc.write('<html><body bgcolor=white><div id="path">'+path+'</div></body></html>');
		doc.close();
	}
	
	History.prototype.check = function()
	{
		//dbg.msg('<span style="color:#dd0000">History.check()</span>');
	
		/*	update interface
		*/
		var hash = window.location.hash.substr(1);
		if (!hash || !this.parent.sections || !this.parent.items || this.path==hash) return;
	
		var parts = hash.split('/');
		if (parts.length<=0) return;
		
		dbg.msg('<span style="color:#dd0000">History: select(',hash,')</span>');
		
		this.path = hash;
			
		switch (parts[0])
		{
			case 'film':
			case 'photo':
			
				//bookmark/deeplink?
				if (!this.parent.section_group)
				{
					dbg.msg('<span style="color:#dd0000">History: deep link</span>');
					
					//update iframe contents
					if (this.iframe)
					{
						dbg.msg('<span style="color:#999966">[IE]History: deeplink, update iframe</span>');
						this.updateIframe(hash);
					}
					
					//deeplinking to item?
					if (parts[2])
					{
						dbg.msg('<span style="color:#999966">deeplink to item..</span>');
						this.deeplink = parts[2]; //item will expand after header and menu select..
					}
				}
				
				//reset search (if any)
				this.parent.search.active = false;
				this.parent.layout.menu.showSearch(false);
	
				//filter items
				var section = this.parent.sections_lookup.ids[parts[1]];
				if (parts[0]!=this.parent.section_group)
				{
					//new main section
					this.parent.layout.header.select(parts[0],section,parts[2]);
				}
				else
				{
					//new section
					this.parent.layout.menu.select(section,parts[2]);
				}
				break;
		
			case 'search':
				if (!this.parent.search.active)
				{
					//bookmark/deeplink?
					if (!this.parent.section_group)
					{
						//enter site first
						dbg.msg('<span style="color:#dd0000">History: deep link</span>');
						//update doc title
						document.title = 'Thom Hoffman - '+hash;
						
						this.deepsearch = parts[1].replace(/\+/,' ');
						this.parent.layout.header.select('photo');
					}
					else
					{
						//open search gui and enter query
						this.parent.search.remoteInput(parts[1]);
					}
				
				}
				else
				{
					//just collapse expanded item
					if (this.parent.item) this.parent.items[this.parent.item].collapse();
				}
				break;
		}
	}

	/*	init
	*/
	this.history = new History(this);
	
}

/* [file src="Platform.Layout.js"]
*/
/*	usemedia.com . joes koppers . 10-12.2008, rev 2.2009
	thnx for reading this code */


/*	Virtueel Platform layout & gui elements
*/

Platform.prototype.addLayout = function()
{
	function Layout(platform)
	{
		this.platform = platform;
		
		//DOM references
		var divs = ['grid','page','container','header','content'];
		for (var i=0; i<divs.length; i++) this[divs[i]] = document.getElementById(divs[i]);
		
//		this.page.style.background = '#cfcfcf url(media/bg_page_gradient.png) repeat-x';

		this.buildCache();

		this.createHeaderDivs();
		this.createFilter();
        
		this.createContentDivs();
		this.createTitle();

		//inital dimensions
		this.resize();
		
		//interactive header elements

		//content
		this.createContent();
		this.createMeta();
		//page gradient background (animated)
		//this.gradient = new Gradient(this,[[0,124,184],[189,219,230]]);
		//start animating..
		//this.gradient.sequence(true);
		
		this.mode = 'list';

		//window resize event
		var obj = this;
		window.onresize = function() { obj.resize() };
	}
	
	Layout.prototype.buildCache = function()
	{
		/*	preload some images, improves rollover behaviour in IE
		*/
		this.cache = new Object();
		
		var buttons = ['time','type','tag','vp'];
		for (var i=0; i<buttons.length; i++)
		{
			this.cache['button_'+buttons[i]] = new Image();
			this.cache['button_'+buttons[i]].src = 'media/bg_button_'+buttons[i]+'X.png';
			this.cache['button_'+buttons[i]+'-s'] = new Image();
			this.cache['button_'+buttons[i]+'-s'].src = 'media/bg_button_'+buttons[i]+'_selected.png';
		}

		this.cache['list_item'] = new Image();
		this.cache['list_item'].src = 'media/bg_list_item.png';
		this.cache['list_itemX'] = new Image();
		this.cache['list_itemX'].src = 'media/bg_list_itemX.png';

		var sections = this.platform.language=='nl'? ['alles','agenda','organisaties']:['all','agenda','organisations'];
		for (var i=0; i<sections.length; i++)
		{
			this.cache['section_'+sections[i]] = new Image();
			this.cache['section_'+sections[i]].src = 'media/button_section_'+sections[i]+'.png';
			this.cache['section_'+sections[i]+'X'] = new Image();
			this.cache['section_'+sections[i]+'X'].src = 'media/button_section_'+sections[i]+'X.png';
		}
	}

	Layout.prototype.resize = function()
	{
		/*	cross browser document body dimensions
		*/
		this.w = (window.innerWidth!=null)? window.innerWidth:(document.documentElement && document.documentElement.clientWidth)? document.documentElement.clientWidth:(document.body!=null)? document.body.clientWidth:0;
		this.h = (window.innerHeight!=null)? window.innerHeight:(document.documentElement && document.documentElement.clientHeight)? document.documentElement.clientHeight:(document.body!=null)? document.body.clientHeight:0;

		this.update();

		//auto position debugger at bottom of window
		if (typeof(dbg)=='object') dbg.moveTo(20,this.h-dbg.h-10);
	}

	Layout.prototype.update = function()
	{
		//if (this.gradient) this.gradient.update(this.w,this.h);
		
		//1280 full layout, fit 4 columns
		if ((browser.cssfilter && this.w==1260) || this.w==1280)
		{
			var l = 93;
			var n = 3;
		}
		else
		{
			l = 93; 
			//var n = Math.max(3,Math.min(4,Math.floor((this.w - l - 30 - 25) / 295)));
            var n = 3;
		}
// 		else
// 		{
// 			//page width (3 or 4 columns)
// 			var l = 108;
// 			var n = Math.max(3,Math.min(4,Math.floor((this.w - l - 30 - 25) / 285)));
// 		}

		this.cols = n;
		var w = Math.max(880,(n*280)+((n-1)*5)+30);
		if (n!=4) w+=15;

//		dbg.msg('Layout update, w=',w,', cols=',n);

		//adjust layout in map view
		if (this.platform.section=='map')
		{
			l = l-1;
			w = w+1;

		}


		if (this.item['item-text'])
		{
	//		this.item['item-text'].style.width = w-30 +'px';
	//		this.item.bg.src = 'media/bg_expanded_item_'+n+'.png';
		}
		
		//columns
		if (this.columns) this.columns.updateLayout(n);
		
		//agenda
		if (this.platform.agenda)
		{
			this.platform.agenda.navigation.style.marginRight = (n==4 && this.platform.agenda.mode=='month')? '296px':'11px';
		}

		//minimum page height
		var h = Math.max(600,this.h-22);

	}
	
	Layout.prototype.scrollTo = function(y,clearhash)
	{
		/*	scroll page to value (animated)
		*/
		var offset = document.body.scrollTop || document.documentElement.scrollTop;

		if (!this.scroll) this.scroll = this.addAnimation(function(values) { window.scrollTo(0,values[0]) },undefined,.6);

		//update hash when done? (closing item)
		this.scroll.callback = clearhash? function() { window.location.hash = 'filter' }:undefined;
		
		//exception for IE, hash reload bug //->resolve later?
// 		if (clearhash && browser.cssfilter && this.platform.deeplink) 
// 		{
// 			delete this.scroll.callback;
// 			delete this.platform.deeplink;
// 		}

		this.scroll.start(offset,y);
	}
	
	Layout.prototype.addAnimation = function(update,callback,speed,margin)
	{
		/*	return a slide object
		*/

		function Slide(update,callback,speed,margin)
		{
			this.sliding = false;
			this.speed = speed || 0.35;
			this.margin = margin || 1;

			this.update = update; //called during slide with current values as array
			this.callback = callback;
		}
		
		Slide.prototype.start = function()
		{
			/*	init and start slide,
				param = (value,targetvalue) pairs */
				
			this.values = new Array();
			this.tvalues = new Array();
		
			for (var i=0; i<arguments.length; i+=2)
			{
				this.values[i] = arguments[i];
				this.tvalues[i] = arguments[i+1];
			}

			this.slide();
		}
		
		Slide.prototype.slide = function()
		{
			var update = false;

			for (var i=0; i<this.values.length; i++)
			{
				var d = this.tvalues[i]-this.values[i];
				this.values[i] += this.speed*(d);
				var upd = (d>0 && this.values[i]<this.tvalues[i]-this.margin) || (d<0 && this.values[i]>this.tvalues[i]+this.margin);
				if (upd) update = true;
			}

			if (update)
			{
				this.update(this.values);
				//loop
				var obj = this;
				this.sliding = window.setTimeout(function() { obj.slide() },40);
			}
			else
			{
				//done, set to exact end target position
				for (var i=0; i<this.values.length; i+=2) this.values[i] = this.tvalues[i];
				this.update(this.values);
				
				if (this.callback) this.callback();
				this.sliding = false;
			}
		}
		
		return new Slide(update,callback,speed,margin);
	}


	/*	header and filter
	*/

	Layout.prototype.createHeaderDivs = function()
	{	
		this.header.innerHTML = '';  //cleared for FF cache bug
		var elms = ['vpfilter','clr','vptitle','meta']; 
		if (this.platform.sets) elms.push('sets-header');
		for (var i=0; i<elms.length; i++)
		{
			var div = document.createElement('div');
				div.id = elms[i];
				
			this.header.appendChild(div);
			this[elms[i]+'div'] = div;
		}
		
		if (this.platform.sets) this.createSetsHeader();
        
       
        
	}

	Layout.prototype.createMeta = function()
	{
		/*	meta links: external, help, language, login
		*/
		
		//login (usebase session)
		if (this.platform.login)
		{
			var div = this.platform.edit.createLogout();
			this.metadiv.appendChild(div);
		}
		
		//language
		var obj = this.platform;
		var src = this.platform.language=='nl'? 'english':'nederlands';
        if(document.getElementById('search')) {

    }
		
		var options = this.platform.language=='nl'? ['over ons / contact','activiteiten','nieuwsbrief']:['about us / contact','activities','newsletter'];
		var sections = [21,22,20];
        var meta_holder = document.createElement('ul');
        meta_holder.style.zIndex = 1000;
		for (var i=0; i<options.length; i++)
		{
			var img = document.createElement('li');
				img.className = 'meta-link';
				if (this.platform.section=='map') img.className+= ' meta-link-map';
				img.innerHTML = options[i];
				img.link = sections[i];
                    img.onclick = function() { obj.platform.selectSection(this.link) };
                meta_holder.appendChild(img);
		}
        this.metadiv.appendChild(meta_holder);
        
        
        this.sets = new Object();
		this.sets.expanded = false;
		
		var state = this.sets.expanded? 'collapse':'expand';
		
		var obj = this;
		
 		//loading indicator
		var img = document.createElement('img');
			img.id = 'sets-loading';
			var s = this.platform.section=='map'? '_map':'';
			img.src = 'media/filter_loading'+s+'.gif';
		this.sets.loading = img;
	//	this['sets-headerdiv'].appendChild(img);

		
		var img = document.createElement('li');
			img.id = 'sets-toggle';
	//		img.style.fontWeight = 'bold';
	//		img.src = 'media/button_selections_'+state+'_'+this.platform.language+'.png';
			img.onmousedown = function(e) { utils.cancelEvents(e,true) }; //prevent drag

			//event handling	
		//	img.onmouseover = function() { if (this.src.indexOf('X.png')==-1) this.src = this.src.replace('.png','X.png') };
		//	img.onmouseout = function() { if (this.src.indexOf('X.png')!=-1) this.src = this.src.replace('X.png','.png') };
			img.onclick = function() { obj.toggleSets() };
			
            this.sets.toggle = img;
            img.innerHTML = '<span style="font-weight:bold;background:url(media/expandicon.png) no-repeat;background-position: 90px 7px;padding-right:25px;">uitgelicht</span>';
            var ul = document.getElementById('meta').getElementsByTagName('ul');
            ul[0].appendChild(img);
	}

	Layout.prototype.createTitle = function()
	{
		/*	vp/e-culture title
		*/
	//	var canvas = document.createElement('canvas');
	//		canvas.width = 205;
	//		canvas.height = 115;
	//		canvas.style.width = '205px';
	//		canvas.style.height = '115px';
	//	this.vptitlediv.appendChild(canvas);
		
		//init canvas element for IE
	//	if (typeof(G_vmlCanvasManager)=='object') canvas = G_vmlCanvasManager.initElement(canvas);
			var img = document.createElement('img');
			img.id = 'e-culture';
			img.src = 'media/label_e-culture_nl.png';
            
               
            
			img.onmousedown = function(e) { utils.cancelEvents(e,true) }; //prevent drag
            img.onclick = this.platform.language=='nl'? function() { top.location = '/filter/' }:function() { top.location = '/en/filter/' };
		this.vptitlediv.appendChild(img);
        this.vptitlediv.style.position = 'relative';
         this.vptitlediv.style.width = '205px';
		var div = document.createElement('div');
            div.style.position = 'absolute';
            div.style.top = '-10px';
            div.style.left = '-8px';
            
		var div2 = document.createElement('div');
			div2.id = 'e-culture2';
            
		div.appendChild(div2);
        
		this.vptitlediv.appendChild(div);
        //media/label_e-culture_nl.png
        
          var flashvars = {'path':'/db/identity.json','gateway':''};
			var params = {wmode:"transparent"};
			var attributes = {};
			swfobject.embedSWF("/PieChart.swf", "e-culture2", "85", "85", "9.0.0","expressInstall.swf", flashvars, params, attributes); 
        document.getElementById('e-culture2').onclick = function() {
            if(vp.language == 'nl') {
                window.location = '/index.php?identity';
            } else {
                window.location = '/en/index.php?identity';
            
            }
        }
	
	//	this.title = canvas;		
	}

	Layout.prototype.updateTitlePattern = function()
	{
		/*	draw title pattern in current gradient
		*/
		if (!this.gradient) return;
		var ctx = this.title.getContext('2d');
		
		var r = 4.6;
		var offset = 15;//this.layout.setsOffset();//24 + this.layout.setsdiv.offsetTop - (window.pageYOffset || document.body.scrollTop);

		ctx.clearRect(0,0,205,115);
		ctx.lineWidth = .85;
		
		var p = [
			[0,0],[15,0],[30,0],[60,0],[90,0],[105,0],[135,0],[165,0],[195,0],
			[0,15],[165,15],
			[0,30],[15,30],[45,30],[75,30],
			[0,45],
			[15,60],[45,60],
			[0,75],[15,75],[30,75],[75,75],
			[0,90],
			[15,105]
		];

		for (var i=0; i<p.length; i++)
		{
			ctx.beginPath();
			ctx.arc(p[i][0]+r+.5,p[i][1]+r+.5,r,0,Math.PI*2,true);
				
			//color according to underlying page gradient
			ctx.strokeStyle = this.gradient.getColorAt(p[i][1] + 5 + Math.max(0,offset));
			ctx.stroke();
		}
	}
	
	Layout.prototype.createSetsHeader = function()
	{
		/*	sets collapse/expand
		*/
				
		
		//'add set' button in edit-mode
		if (this.platform.edit)
		{
			var s = this.platform.edit.createAddSet();
			this['sets-headerdiv'].appendChild(s);
		}
	}
	
	Layout.prototype.toggleSets = function()
	{
		/*	expand/collapse sets display
		*/
        
		dbg.msg('Layout: toggle sets, expanded=',this.sets.expanded);
		this.sets.expanded = !this.sets.expanded;
        

		var e = this.sets.expanded;
       
		var state = e? 'collapse':'expand';
	//	this.sets.toggle.src = 'media/button_selections_'+state+'_'+this.platform.language+'.png';

		//update set icons
		var f = this.platform.filter;
		if (this.sets.expanded && f && f.sets)
		{
			for (id in f.sets)
			{
				if (f.sets[id].gui) f.sets[id].gui.setIcon();
			}
		}

		//this.setsdiv.style.display = e? 'none':'block';
		this.setsdiv.style.height = e? '1px' : 'auto';
		this.setsdiv.style.paddingTop = e? '1px' : '0px';
		this.setsdiv.style.paddingBottom = e? '1px' : '100px';
        //document.getElementById('sets-toggle').className = e? 'inactive' : 'active';


		if(state == 'collapse') {
			document.getElementById('sets-toggle').innerHTML = '<span style="font-weight:bold;background:url(media/collapseicon.png) no-repeat;background-position: 90px 7px;padding-right:25px;">uitgelicht</span>';
		}
		else {
			document.getElementById('sets-toggle').innerHTML = '<span style="font-weight:bold;background:url(media/expandicon.png) no-repeat;background-position: 90px 7px;padding-right:25px;">uitgelicht</span>';
		}
Cufon.replace('#sets-toggle', { hover: true });

		this.setsdiv.style.overflow = 'hidden';
        
		if (e && this.platform.item && this.platform.item!=this.platform.deeplink) this.platform.closeItem();
	}
	
	Layout.prototype.createFilter = function()
	{
		/*	filter gui
		*/
		var obj = this;
        this.platform.showintro = false;
 
        
		var filter = new Object();
        filter.elm = this.vpfilterdiv;

			
		//layout
		var elms = ['header','body','footer'];
		for (var i=0; i<elms.length; i++)
		{
			var div = document.createElement('div');
				div.className = 'filter-layout';
				div.id = 'filter-'+elms[i];
			filter.elm.appendChild(div);
			filter[elms[i]] = div;
		}


		/*	header
		*/
 		//loading indicator
		var img = document.createElement('img');
			img.id = 'filter-loading';
			var s = this.platform.section=='map'? '_map':'';
			img.src = 'media/filter_loading'+s+'.gif';
		filter.header.appendChild(img);
		filter.loading = img;

		//index
		var img = document.createElement('img');
			img.id = 'index';
		//	img.src = 'media/label_index.png';
			//event handling
			//img.title = this.platform.msg['filter_reset'];
			//img.onclick = function() { obj.platform.filter.rset(true); if (obj.filter.intro) obj.toggleFilter() }; //reset filter
			img.onmousedown = function(e) { utils.cancelEvents(e,true) }; //prevent drag
		//filter.header.appendChild(img);
		
		//section select
		var div = document.createElement('div');
			div.id = 'filter-section';
			//div.style.left = this.platform.language=='nl'? '162px':'169px';

		var options = this.platform.language=='nl'? ['alles','agenda','organisaties']:['all','agenda','organisations'];
		var sections = ['index','agenda','map'];
		var lan = this.platform.language=='en'? 'en/':'';
		for (var i=0; i<options.length; i++)
		{
			var selected = this.platform.section==sections[i]? '-selected':'';
			
			var a = document.createElement('a')
			var link = i==0? '':options[i];
				a.href = '/'+ lan + link;
				a.onclick = function() { this.blur() };

			var img = document.createElement('img');
			//	img.style.height = '20px';
				img.section = sections[i];
				img.src = 'media/button_section_'+options[i]+selected+'.png';

			//event handling
		//	img.onmouseover = function() { if (this.src.indexOf('selected')==-1) this.src = this.src.replace('.png','X.png') };
		//	img.onmouseout = function() { if (this.src.indexOf('selected')==-1) this.src = this.src.replace('X.png','.png') };
			
			a.appendChild(img);
			div.appendChild(a);
		}
		filter.header.appendChild(div);

		//expand/collapse
	/*
        	var img = document.createElement('img');
			img.id = 'filter-collapse';
			var s = this.platform.showintro? 'expand':'collapse';
			img.src = 'media/button_filter_'+s+'.png';
			
			img.style.cursor = 'pointer';
			img.onmouseover = function() { this.src = this.src.replace('.png','X.png') };
			img.onmouseout = function() { this.src = this.src.replace('X.png','.png') };
			img.onclick = function() { obj.toggleFilter() };

 		filter.header.appendChild(img);
 		filter.expand = img;
 		
*/
		/*	body
		*/
		//collapsed gui
		var div = document.createElement('div');
			div.id = 'filter-expanded';
		filter.collapseddiv = div;
		
		var options = this.platform.language=='nl'? ['wanneer','wat','waarover']:['when','what','about'];
		var w = this.platform.section=='map'? 296:197;
		var n = this.platform.section=='map'? 1:0;
		for (var i=n; i<options.length; i++)
		{
			var add = (this.platform.section!='map' && i==1)? 1:0;
			var b = new Button(this.platform,this.platform.filters[i],options[i],function() { obj.toggleFilter() },{ w:w+add, path:'static' });
			div.appendChild(b.elm);
		}
//		filter.body.appendChild(div);

		//expanded gui
		var div = document.createElement('div');
			div.id = 'filter-expanded';
		filter.expandeddiv = div;

		var rows = [1,2,2];
		if (this.platform.section=='map') rows[1] = 3;
		if (this.platform.section=='agenda') rows[1] = 1;
		if (this.platform.section=='identity') rows[1] = 1;

	//	console.log(options);
		for (var i=n; i<options.length; i++)
		{
			//'all' container
		//	var a = document.createElement('li');
			//	a.className = 'button-container';
			//	a.style.width = '90px';
			//	a.style.height = (rows[i]*22) +'px';
			//	a.style.background = 'transparent url(media/bg_button_'+this.platform.filters[i]+'_fill.png) repeat';
				
			//buttons container
			var b = document.createElement('ul');
            b.className = "menu-buttons";
            
            if(i == options.length -1) {
            	b.style.background = 'url(media/menu_bg2.png)';
            	b.style.height = '52px';	
            }
            else b.style.background = 'url(media/menu_bg1.png)';
            
            /*
				b.className = 'button-container';
				b.style.width = '500px';
				b.style.marginRight = '0px';
				b.style.height = (rows[i]*22) +'px';
				b.style.background = 'transparent url(media/bg_button_'+this.platform.filters[i]+'_fill.png) repeat';
				b.style.overflow = 'hidden';
                */

			//expand/collapse for tags container
			if (this.platform.filters[i]=='tag')
			{
				//more indicator
				var img = document.createElement('li');
					img.id = "tags-more";
                    img.innerHTML = 'more';
	
			//	b.appendChild(img);
				//b.style.minHeight = (rows[i]*22) +'px';
				img.onclick = function() {
					this.src = (this.src.indexOf('more')!=-1)? 'media/icon_tags_less.png':'media/icon_tags_more.png';
					obj.toggleTags();
				};
				
				filter.tagsexpanded = true; //default collapsed
			}
				
			filter[this.platform.filters[i]+'div'] = b;
				
		//	div.appendChild(a);
			div.appendChild(b);
		}
		filter.body.appendChild(div);
		
		//intro
		/*
        if (this.platform.showintro)
		{
			filter.body.style.backgroundImage = 'url(media/filter_intro_short_'+this.platform.language+'.png)';
			filter.intro = true;
		}
		
		
		/*	footer
		*/
		//result
        var rightcorner = document.createElement('IMG');
        rightcorner.align = "absmiddle";
        rightcorner.src = "media/totitemscornerright.png";
        
        
         var leftcorner = document.createElement('IMG');
        leftcorner.align = "absmiddle";
        leftcorner.src = "media/totitemscornerleft.png";
        
        var holderDiv = document.createElement('DIV');
        
		var result = document.createElement('span');
			result.id = 'filter-result';
		var action = document.createElement('span');
			action.id = 'filter-action';

		//magenta 'filter' button		
		if (this.platform.showintro)
		{
			var img = document.createElement('img');
				img.src = 'media/button_filter.png';
		//		img.onmouseover = function() { this.src = 'media/button_filterX.png' };
		//		img.onmouseout = function() { this.src = 'media/button_filter.png' };
				img.onclick = function() { obj.platform.filter.rset(true); obj.toggleFilter() };
			action.appendChild(img);
		}
        holderDiv.className = 'filter-footer-box';
        holderDiv.appendChild(leftcorner);
		holderDiv.appendChild(action);
		holderDiv.appendChild(result);

        holderDiv.appendChild(rightcorner);
		filter.footer.appendChild(holderDiv);
        

        
		filter.result = result;
		filter.action = action;


		this.filter = filter;
		
		//this.filter.expanded = this.platform.showintro? true:false;
		
		this.platform.showintro = false;
	}
	
	
	Layout.prototype.createSearch = function(obj)
	{
		/*	search input gui
		*/
		var div = document.createElement('div');
			div.id = 'search';
			
		//empty button as background
		var b = this.createButton('tag','',undefined,{ w:153 });
	//	div.appendChild(b.elm);
	//	b.elm.style.visibility = 'inherit';
			document.getElementById('filter-section').appendChild(div);
        
                        var img2 = document.createElement('img');
			img2.className = 'meta-link';
			if (this.platform.section=='map') img2.className+= ' meta-link-map';
			img2.src = 'media/label_nederlands.png';
            img2.style.position = 'relative';
            img2.style.left = '10px';
            img2.onclick = function() { vp.toggleLanguage('nl') }
            div.appendChild(img2);
            
        		var img = document.createElement('img');
			img.className = 'meta-link';
			if (this.platform.section=='map') img.className+= ' meta-link-map';
			img.src = 'media/label_english.png';
            img.onclick = function() { vp.toggleLanguage('en') }
		div.appendChild(img);


        
        
        
        
		//input element
		var form = document.createElement('form');
			form.onsubmit = function() { return false }; //no submit
		var input = document.createElement('input');
			input.name = 'query';
			input.id = 'search-query';
		div.appendChild(input);
		
		//reset
		var img = document.createElement('img');
			img.id = 'search-reset';
	//		img.src = 'media/search_reset.png';
	//		img.onmouseover = function() { this.src = 'media/search_resetX.png' };
	//		img.onmouseout = function() { this.src = 'media/search_reset.png' };
	//	div.appendChild(img);
		
		
		//submit
		var f = this.platform.filter;
	
		//references
		obj.elm = div;
		obj.button = b;
		obj.input = input;
		obj.rset = img;
		obj.edge = new Object();

		//design edges
	
		var d = document.createElement('label');
        d.innerHTML = this.platform.language=='nl' ? 'zoeken' : 'search';
	//		d.style.backgroundImage = 'url(media/search_edge_bottom.png)';
	//		d.style.top = '17px';
        d.onclick = function() { f.query() };
		div.appendChild(d);
		
		//include edges setSelected
		obj.setSelected = function(select)
		{
			this.button.setSelected(select)
			var s = select? '-selected':'';
	//		this.edge.left.src = 'media/search_edge_left'+s+'.png';
	//		this.edge.right.src = 'media/search_edge_right'+s+'.png';
		}

		//append to filter container
	
	}


	/*	body and expanded item
	*/

	Layout.prototype.createContentDivs = function()
	{
		/*	list, content, footer
		*/
		this.content.innerHTML = ''; //cleared for FF cache bug
		var obj = this;

		//list + navigation		
		var list = document.createElement('div');
			list.id = 'list';
		
		var nav = this.createNavigation( function(type) { obj.platform.browseItems(type) } );
        
        nav.id = 'list-navigation';
        
        var location = document.getElementById('filter-footer').getElementsByTagName('img');
        location[1].parentNode.insertBefore(nav,location[1])
		//document.getElementById('filter-footer').appendChild(nav);
     //   document.getElementById('filter-footer')
            	this.navigation = nav;
        
		//sets
		if (this.platform.sets)
		{
			var sets = document.createElement('div');
				sets.id = 'sets';
			
			var clr = document.createElement('div');
				clr.className = 'clear';
	
			sets.appendChild(clr);
			this.setsdiv = sets;
			
			list.appendChild(sets);
		}

		var clr = document.createElement('div');
			clr.className = 'clear';
		list.appendChild(clr);
		
		this.list = list;
		this.content.appendChild(list);
		
		//expanded item content
		var div = document.createElement('div');
			div.id = 'item';
		
		this.content.appendChild(div);
		this.item = new Object();
		this.item.elm = div;		
			
		//clear + footer
		var c = document.createElement('div');
			c.className = 'clear';
		this.content.appendChild(c);
		
	 this.createFooter();
	}
	
	Layout.prototype.createFooter = function()
	{
		var footer = document.createElement('div');
			footer.id = 'footer';
		var lan = this.platform.language=='nl'? '':'/en';
		var colophon = this.platform.language=='nl'? 'colofon':'colophon';
		var str = '<span>';
			str+= '&copy; '+new Date().getFullYear();
			str+= ' Virtueel Platform | ';
			//social
			str+= '<a href="http://twitter.com/virtueelp" target="_blank"><img class="footer-icon" src="media/web2.0/twitter_icon.png">Twitter</a> | ';
			str+= '<a href="http://www.netvibes.com/virtueelplatform" target="_blank"><img class="footer-icon" src="media/web2.0/netvibes_icon.png">Netvibes</a> | ';
			str+= '<a href="http://www.flickr.com/photos/v-p" target="_blank"><img class="footer-icon" src="media/web2.0/flickr_icon.png">Flickr</a> | ';
			str+= '<a href="http://delicious.com/virtueelplatform" target="_blank"><img class="footer-icon" src="media/web2.0/delicious_icon.png">Delicious</a> | ';
			//internal
			str+= '<a id="rssfeeds-link" href="/rssfeeds"><img class="footer-icon" src="media/web2.0/rss_icon.png">RSS</a> | ';
			str+= '<a id="disclaimer-link" href="/disclaimer">Disclaimer</a> | ';
			str+= '<a id="'+colophon+'-link" href="/'+colophon+'">'+colophon+'</a> | ';
			//page top
			str+= '<a id="top-link" href="javascript://top">';
			//str+= this.platform.language=='nl'? 'pagina':'page';
			str+= ' Top <img src="media/totop_arrow.png">';
			str+= '</span>';

		footer.innerHTML = str;
		document.getElementById('container').appendChild(footer);		

		//event handling
		var obj = this;
		document.getElementById('top-link').onclick = function() { obj.scrollTo(0); this.blur(); };
		var links = ['rssfeeds','disclaimer',colophon];
		for (var i=0; i<links.length; i++)
		{
			document.getElementById(links[i]+'-link').onclick = function() { obj.platform.selectItem(this.id.substring(0,this.id.length-5)); this.blur(); return false };
		}
        	if (this.platform.section=='map') {
                document.getElementById('footer').style.display = 'block';
                document.getElementById('footer').style.zIndex = 2;
                 document.getElementById('footer').style.position = 'absolute';
                 document.getElementById('footer').style.bottom = '0px';
            }
	}

	Layout.prototype.createContent = function()
	{
		/*	expanded item layout
		*/
		var obj = this;
		//background with dropshadow
		var img = document.createElement('img');
			img.id = 'item-backdrop';
			img.src = 'media/bg_expanded_item_'+this.cols+'.png';
		this.item.bg = img;
		this.item.elm.appendChild(img);

		//layout		
		var elms = ['item-title','item-meta','item-navigation','item-text'];
		for (var i=0; i<elms.length; i++)
		{
			var div = document.createElement('div');
				div.id = elms[i];
			this.item[elms[i]] = div;
			if (elms[i]=='item-text')
			{
				//add form for use with itemforms usebase extension
				var form = document.createElement('form');
					form.name = 'item-form';
					form.onsubmit = function() { return false };
					form.appendChild(div)
				this.item['item-form'] = form;
				this.item.elm.appendChild(form);
			}
			else 
			{
				this.item.elm.appendChild(div);
			}
		}
		var elms = ['columns-container','columns-media'];
		for (var i=0; i<elms.length; i++)
		{
			var div = document.createElement('div');
				div.id = elms[i];
			this.item[elms[i]] = div;
			this.item['item-text'].appendChild(div);
		}

		//title + icon
		var span = document.createElement('span');
			span.style.cursor = 'pointer';
			span.title = this.platform.msg['article_reset'];
			span.onclick = function() {
				//reset content
				//obj.columns.updateLayout();
				obj.columns.updateLayout(obj.columns.maxlayout,true);
				obj.browseMedia('rset');
			};
		var c = document.createElement('canvas');
			c.className = 'list-item-icon';
			c.width = 10;
			c.height = 10;
			c.style.top = '4px';
		this.item['item-title'].appendChild(span);
		this.item['item-title'].appendChild(c);
		//init canvas element for IE
		if (typeof(G_vmlCanvasManager)=='object') c = G_vmlCanvasManager.initElement(c);
		
		this.item.setIcon = function()
		{
			var ctx = obj.item['item-title'].lastChild.getContext('2d');
			var r = 5;
			var offset = 24 + obj.content.offsetTop - (document.body.scrollTop || document.documentElement.scrollTop);
	
			ctx.clearRect(0,0,10,10);
			ctx.beginPath();
			ctx.arc(r,r,r,0,Math.PI*2,true);
					
			//color according to underlying page gradient
		//	ctx.fillStyle = obj.gradient.getColorAt(5 + Math.max(0,offset));
		//	ctx.fill();
		}


		//item navigation, close, print and browse
		var nav = this.createNavigation( function(type) { obj.platform.browseExpandedItems(type) } );
 			nav.id = 'item-browse';
			nav.style.width = '138px';//'138px';//:'108px';
            nav.getElementsByTagName('img')[1].style.float = 'left';

		this.browse = nav;
		this.item['item-navigation'].appendChild(nav);
		//close
		var div = document.createElement('div');
			div.id = 'item-close';
		//var img = document.createElement('img');
		//	img.src = 'media/icon_close.png';
		//	img.style.cssFloat = 'left';
		//div.appendChild(img);
		var img = document.createElement('img');
			img.src = 'media/label_close_'+this.platform.language+'.png';
			img.style.cssFloat = 'left';
			img.style.margin = '2px 0px 4px 2px';
		div.appendChild(img);

		div.onclick = function() { obj.platform.closeItem() };
		this.item['item-navigation'].appendChild(div);
		//print
		var a = document.createElement('a');
			a.id = 'item-print';
			a.href = ''; //updated by updateContent()
			a.target = '_blank';
			a.title = this.platform.msg['print'];
			a.onclick = function() { this.blur() };
		var img = document.createElement('img');
			img.style.border = '0px';
			img.src = 'media/button_print.png';
			a.appendChild(img);
		this.item['item-navigation'].appendChild(a);
		this.print = a;

		
		//media column interaction (container, collapse, navigate)
		this.item.media = new Object();
		var div = document.createElement('div');
        div.id = 'media-container';
		this.item['columns-media'].appendChild(div);
		this.item.media.elm = div;

		this.item.media.toggle = img;
		this.item.media.collapsed = false; //expanded by default
		
		var nav = this.createNavigation( function(type) { obj.browseMedia(type) }, ['up','down'] );
        nav.id = 'columns-media-navigation';
    
		
		this.item.media.nav = nav;
		this.item.media.count = 0;
		//add sliding animation
		this.item.media.scroll = this.addAnimation(function(values) { obj.item.media.elm.style.top = -values[0] +'px' },undefined,.25);
        this.item['columns-media'].appendChild(nav);

		//text columns + navigation
		var nav = this.createNavigation( function(type) { obj.columns.navigate(type) } );
 			nav.id = 'columns-navigation';
		
        this.item.elm.appendChild(nav);
        

		var cols = document.createElement('div');
			cols.id = 'columns';

		this.item['columns-container'].appendChild(cols);

		this.columns = new ColumnLayout(cols,295,465,20+5);
		this.columns.navdiv = nav;
		this.columns.nav = 0;
		
		//extend columns class
		this.columns.done = function()
		{ 	
			dbg.msg('Layout.columns: done, nav=',this.nav,', cols=',this.cols,', layout=',this.layout);
			
			var p = this.nav/this.layout +1;
			var pages = Math.ceil(this.cols/this.layout);
			var w = obj.platform.language=='nl'? 138:173;
			if (pages>10) w += 15;
			this.navdiv.style.width = w +'px';
            if(this.navdiv.getElementsByTagName('div').length == 0) {
                var h = document.createElement('div');
            } else {
                var h =this.navdiv.getElementsByTagName('div')[0];
            }
            
            h.style.display = 'inline';
            h.innerHTML = obj.platform.msg['columns_nav']+p+'/'+pages;
			this.navdiv.style.display = this.cols<=this.layout? 'none':'block';
			this.navdiv.getElementsByTagName('img')[0].style.display = this.nav > 0? 'inline':'inline';
			this.navdiv.getElementsByTagName('img')[0].style.visibility = this.nav > 0? 'visible':'hidden';
            
            this.navdiv.childNodes[2].parentNode.insertBefore(h,this.navdiv.childNodes[2]);
			this.navdiv.getElementsByTagName('img')[1].style.display = this.cols-this.layout>this.nav? 'block':'none';
		}

		this.columns.navigate = function(direction)
		{
			switch(direction)
			{
				case 'next':
					if (this.nav>=this.cols-this.layout) return;
					//shift cols left
					this.nav += this.layout;
					var tx = -this.nav * (this.column_w + this.column_g);
					break;
				
				case 'prev':
					if (this.nav<this.layout) return;
					//shift cols right
					this.nav -= this.layout;
					var tx = -(this.nav) * (this.column_w + this.column_g);
					break;
				
				case 'rset':
					this.nav = 0;
					this.x = 0;
					this.parent.style.left = '0px';
					break;
			}
			if (direction!='rset') this.moveTo(tx);
		}
		
		this.columns.updateLayout = function(n,force)
		{
			if (!force && n==this.maxlayout) return; //no update needed

			this.maxlayout = n;
			var extra = obj.item.media.collapsed || obj.item.media.count==0;
			
			dbg.msg('Layout.columns: updateLayout, n=',n,', extra=',extra);
			
			this.layout = extra? n:n-1;
			obj.item['columns-container'].style.width = this.layout*330 +'px';

			var r = extra? 0:330;
			this.navdiv.style.right = r +26 +'px';

			this.navigate('rset');
			this.done();
		}

 		this.resize();
	}
	
	Layout.prototype.toggleContent = function(mode)
	{
		/*	toggle between list and content
		*/
		if (!mode) this.mode = this.mode=='list'? 'item':'list';
		else this.mode = mode;
        if(this.platform.section!='agenda') {
            document.getElementById('meta').style.display =  (this.mode=='list') ?'block':   'none' ;
           } 
		this.list.style.display = this.mode=='list'? 'block':'none';
		this.item.elm.style.display = this.mode=='item'? 'block':'none';
	}
	
	Layout.prototype.toggleMedia = function()
	{
		/*	expand or collapse the item media column
		*/
		this.item.media.collapsed = !this.item.media.collapsed;
		var c = this.item.media.collapsed;

		this.item['columns-media'].style.display = c? 'none':'block';
		this.item.media.nav.style.display = c? 'none':this.item.media.elm.offsetHeight>460? 'block':'none';
		var src = c? '_collapsed':'';
		this.item.media.toggle.src = 'media/media_column_'+this.platform.language+src+'.png';
		
		//update text-columns layout
		this.columns.updateLayout(this.columns.maxlayout,true);
	}
	
	Layout.prototype.updateContent = function(item)
	{
		/*	set contents of expanded item
		*/
		var obj = this;

		var str = '<a name="#'+item.id+'">'+item.title+'</a>';
		//var str = item.title;
		if (this.platform.edit) str+= this.platform.edit.createEditLink(item);
		this.item['item-title'].firstChild.innerHTML = str;

		//meta (date, type)
		var str = '';		
		if (item.startdate && this.platform.section!='vp')
		{
			var d = new Date(item.startdate*1000);
			var y = ' &rsquo;<b>'+String(d.getFullYear()).substr(2)+'</b>';
			var date = d.format('humandate');
			//str+= '<span class="date">'+date.substring(0,date.length-4)+y+'</span>';
		}
		//console.log(item);
//str+= '<span class="type"><b>Tag</b> '+this.platform.sections[item.section]+'</span>';

		//vp
		if (item.vp)
		{
			str+= '<span class="vp">';
			str+= this.platform.language=='nl'? 'door':'by';
			str+= ' Virtueel Platform</span> | ';//<br>';
		}

		this.item['item-meta'].innerHTML = str;
		
		//url
		var link = document.location.hostname+'/';
		if (item.url) link+= item.url;
		else
		{
			if (this.platform.language=='en') link+= 'en/';
			link+= item.id;
		}
		var a = document.createElement('a');
        a.href = 'http://'+link;
        a.innerHTML = link;
		this.item['item-meta'].appendChild(a);
		
		//print link
		var link = '/print/'+item.id;
			if (this.platform.language=='en') link = '/en'+link;
			this.print.href = link;
		this.print.style.display = item.section==23? 'none':'block';
		
		//media
		this.item.media.count = item.media? item.media.length:0;
		this.item['columns-media'].style.display = (item.media && !this.item.media.collapsed)? 'block':'none';
		this.item.media.toggle.style.display = item.media? 'block':'none';
		if (item.media) this.updateMedia(item.media);
		//update avail columns
		this.columns.updateLayout(this.columns.maxlayout,true);
		
		//text contents
		var intro = '';
		//map link
		if (item.section==30)
		{
			var org = this.platform.language=='en'? '/en/organisations/':'/organisaties/';
			intro+= '<p><a href="'+org+item.id+'">'+this.platform.msg['show_on_map']+'</a></p>';
		}
		//dates
		if (item.section>=10 && item.section<20)
		{
			var times = ['startdate','enddate'];
			var has_end = (item.enddate && item.enddate!=item.startdate);
		
			//intro+= '<p class="date" style="font-size:11px;">';
			intro+= '<div class="artdate">';
            intro+= '<span class="item-topic">'+this.platform.sections[item.section]+'</span>';
			for (var i=0; i<2; i++)
			{
				if (has_end)
				{
					if (this.platform.language=='nl')
					{
						var label = i==0? 'van':'tot';
						var w = 26;
					}
					else
					{
						var label = i==0? 'from':'untill';
						var w = 35;
					}
					intro+= '<span class="date-label">'+label+'</span><span class="date">';
					//<span class="date-label" style="width:'+w+'px">'+label+':</span>
				}
				else
				{
					
					if (i==1) break;
					intro+= '<span class="date">';
				}

				var d = new Date(item[times[i]]*1000);
				var t = d.format('time')

				var da = d.getDate();
				da = (da < 10)? '0' + String(da): String(da);
				var mo = d.getMonth() + 1;
				mo = (mo < 10)? '0' + String(mo): String(mo);
				var y = '<b>&rsquo;'+String(d.getFullYear()).substr(2)+'</b>';

//				intro+= d.format('longhumandate');
				intro+= '<span class="day"><b>'+da+'</b></span><span class="month"><b>'+mo+'</b></span><span class="year">'+y+'</span>';
								
				if (t!='0:00' && t!='23:59' && item.section!=10 && item.section!=13) intro+= ' - <strong>'+t+'</strong>';
				
				intro+= '</span>';
			}
			intro+= '</div>';
		}
		//short
		intro+= '<p class="short">'+item.intro+'</p>';

		//body	
		var text = '<p>'+item.text+'</p>';
		
		//append form submit
		if (item.section==23)
		{
			var value = this.platform.language=='nl'? 'stuur op':'send';
			var str = '<p class="form" style="text-align:right">';
				str+= '<input id="item-form-submit" type="button" class="form-button" value="'+value+'" style="float:right">';
				str+= '</p>';

			var text = item.text + str;
		}		
		
		//append attached files to text
		if (item.files)
		{
			var str = '<p>';
			for (var i=0; i<item.files.length; i++)
			{
				var f = item.files[i];
				str+= '<img class="attachment" src="media/icon_'+f.kind+'.gif">';
				str+= '<a href="/downloads/'+f.file+'" title="'+f.caption+'">';
				str+= f.caption || f.file;
				str+= '</a><br>';
			}
			str+= '</p>';
			
			text+= str;
		}
		
		this.columns.init(intro+text);
       // console.log(obj);
		 this.updateNavigation(1,true);
//   document.getElementById('paginator').style.display = 'none';
		//scroll expanded item into view (if needed)
		var s = (document.body.scrollTop || document.documentElement.scrollTop);
		var b = 542 + 22 + this.content.offsetTop - s;
		if (b>this.h)
		{
			//nearest grid position
			var t = Math.ceil((s + (b-this.h))/15) * 15;
 			window.setTimeout(function() { obj.scrollTo(t) },150);
		}
		
		//add form interaction
		if (item.section==23)
		{
			document.getElementById('item-form-submit').onclick = function() { obj.platform.submitForm(this) }
		}
	}
	
	Layout.prototype.updateMedia = function(media)
	{
		/*	expanded item media column contents
		*/
		
	//	this.item.media.elm.style.top = '0px';
		
		//add media
		for (var i=0; i<media.length; i++)
		{
			var m = media[i];
			if (m.type=='files') continue;
			
			var div = document.createElement('div');
				div.className = 'media-display';
			
			this.item.media.elm.appendChild(div);

			if (m.kind=='image')
			{
				if (m.sw>m.sh)
				{
					//landscape
					var w = Math.min(265,m.sw);
					var h = m.sw<265? m.sh:Math.round(265/m.sw * m.sh);
					
					dbg.msg('Layout.updateMedia: landscape, sw=',m.sw,', sh=',m.sh,' => w=',w,', h=',h);
				}
				else
				{
					//portrait
					var h = Math.min(265,m.sh);
					var w = m.sh<265? m.sw:Math.round(265/m.sh * m.sw);
					
					dbg.msg('Layout.updateMedia: portrait, sw=',m.sw,', sh=',m.sh,' => w=',w,', h=',h);
				}

				var img = document.createElement('img');
					img.style.width = w +'px';
					img.style.height = h +'px';
					img.style.backgroundColor = '#cfcfcf';
					img.src = 'media/content/'+m.id+'_small.jpg';
				div.appendChild(img);
			}
			else
			{
				//embed flv player..
				var w = 265;
				var h = 170;
				var src = 'media/content/'+m.id+'.flv';
				var thumb = 'media/content/'+m.id+'_small.jpg';
				
				//player container div
				var elm = document.createElement('div');
					elm.id = 'mediaplayer_'+m.id;
					elm.style.width = w +'px';
					elm.style.height = h +'px';
					elm.style.backgroundColor = '#cfcfcf';
				div.appendChild(elm);

/*
  var flashvars = {'path':'/db/identity.json','gateway':''};
			var params = {wmode:"transparent"};
			
			swfobject.embedSWF("/PieChart.swf", "e-culture2", "85", "85", "9.0.0","expressInstall.swf", flashvars, params, attributes); 
        document.getElementById('e-culture2').onclick = function() {
            window.location = '/index.php?identity';
            */


                var attributes = {};
                var params = {'allowscriptaccess':'always','allowfullscreen':'true','wmode':'opaque','flashvars':'&file='+src+'&image='+thumb+'&backcolor=cfcfcf&screencolor=cfcfcf&skin=media/mediaplayer/nacht.swf'};
				var p = swfobject.embedSWF('media/mediaplayer/player.swf','mediaplayer_'+m.id,w,h,'9',"expressInstall.swf",params,attributes);
			//		p.addParam();
			//		p.addParam('allowfullscreen','true');
			//		p.addParam('wmode','opaque');
			//		p.addParam();
				//	p.write(elm.id);
			}

			//caption
			var caption = document.createElement('div');
				caption.style.paddingTop = '3px';
				caption.style.width = '265px';
				caption.innerHTML = m.caption || '';
				
			div.appendChild(caption);
		}
		
		//enable navigation
		this.browseMedia('rset');
		
		dbg.msg('media done','tmr');
	}
	
	Layout.prototype.browseMedia = function(direction)
	{
		dbg.msg('Layout.browseMedia, d=',direction);
	
		var media = this.item.media;
		var nav = this.item.media.nav;
		var m = this.item.media.elm.childNodes;
		
		var scroll = this.addAnimation(function(values) { window.scrollTo(0,values[0]) },undefined,.35);
		
		switch(direction)
		{
			case 'down':
                
				//find last visible elm
				for (var i=0; i<m.length; i++)
				{
					if (m[i].offsetTop+m[i].offsetHeight>media.pages[media.page]+460)
					{
						var y = m[i].offsetTop;
						break;
					}
				}
				media.page++;
				media.pages[media.page] = y;
				media.scroll.start(media.pages[media.page-1],y);
				
//				media.elm.style.top = -y +'px';

				//update nav display
				nav.childNodes[1].style.display = 'block';
 				if (media.elm.lastChild.offsetTop+media.elm.lastChild.offsetHeight<media.pages[media.page]+460) nav.childNodes[2].style.display = 'none';
				break;
			
			case 'up':
				media.page--;
				var y = media.pages[media.page];
				media.scroll.start(media.pages[media.page+1],y);
				
				//update nav display
				nav.childNodes[2].style.display = 'block';
				if (media.page==0) nav.childNodes[1].style.display = 'none';
				break;
			
			case 'rset':
				media.y = 0;
				media.page = 0;
				media.pages = [0];
				media.elm.style.top = '0px';
                for(var i = 1; i < m.length; i++) {
          //          m[i].style.display = 'none';
                }
                

				//display nav?
                document.getElementById('columns-media').style.width = "300px";
                document.getElementById('columns-media').style.right = "0px";

                nav.style.position = 'absolute';				
                nav.style.right = '0px';
                nav.style.bottom = '15px';				

				nav.style.display = media.elm.offsetHeight>460? 'block':'none';
				nav.childNodes[1].style.display = 'none';
				nav.childNodes[2].style.display = 'block';
				break;
		}
		
				

		//if (direction!='rset') this.moveTo(tx);
	}
	
	Layout.prototype.resetContent = function()
	{
		/*	clear current expanded item
		*/
		this.columns.rset();
		this.columns.navigate('rset');
		
		this.item['item-title'].firstChild.innerHTML = '<img src="media/item_loading.gif" style="margin-top:1px">';
		this.item['item-meta'].innerHTML = '';
		
		this.item.media.elm.innerHTML = '';
		
		this.browse.style.display = 'none'
		this.browse.firstChild.innerHTML = '';
	}
	
	Layout.prototype.createNavigation = function(callback,type)
	{
		/*	create a navigation element (prev/next and status display)
		*/
    
		var div = document.createElement('span');
        div.className = 'navigation';
		
		var span = document.createElement('div');
		div.appendChild(span);

		var buttons = type || ['prev','next'];
		for (var i=0; i<buttons.length; i++)
		{
                var img = document.createElement('img');
                img.style.display = 'inline';
                img.align = 'absmiddle';
				img.src = 'media/icon_'+buttons[i]+'.png';
				img.type = buttons[i];

			//event handling
			var obj = this;
			img.onclick = function() { callback(this.type) };
			div.appendChild(img);
		}
        
		return div;
	}
	
	Layout.prototype.updateNavigation = function(page,item)
	{
		/*	update list items navigation, item browse */
        var ext = '';
        if(item) {ext = 'item';}
		if (!item && this.mode != 'item')
		{
			//items list
			var p = this.platform.language=='nl'? 'pagina ':'page ';
			var pages = Math.ceil(this.platform.filter.count/this.platform.pagelength);	
			this.navigation.style.display = pages<2? 'none':'block';
            if(document.getElementById('paginator'+ext)) {
                paginator = document.getElementById('paginator'+ext);
            } else {
                var paginator = document.createElement('div');
                paginator.id = 'paginator'+ext;
                this.navigation.getElementsByTagName('img')[0].parentNode.insertBefore(paginator,this.navigation.getElementsByTagName('img')[1]);
            }
            
            paginator.style.float = 'left';
            paginator.style.CSSfloat = 'left';
        
			paginator.innerHTML = p + page + '/' + pages;
	
            this.navigation.getElementsByTagName('img')[0].id = 'prevBt';
            this.navigation.getElementsByTagName('img')[1].id = 'nextBt';
            
			this.navigation.getElementsByTagName('img')[0].style.display = page >1? 'inline':'none';
			this.navigation.getElementsByTagName('img')[1].style.display = pages>1 && page<pages ? 'inline':'none';
            this.navigation.style.zIndex = '1000';

		}
		else 
		{
                        document.getElementById('list-navigation').style.display = 'none';

			if (page!=undefined) {            
                if(document.getElementById('paginator_item')) {
                    paginator = document.getElementById('paginator_item');
                } else {
                    var paginator = document.createElement('div');
                    paginator.id = 'paginator_item';
                    this.browse.getElementsByTagName('img')[0].parentNode.insertBefore(paginator,this.browse.getElementsByTagName('img')[1]);
                }
                var offset = (this.platform.page-1) * this.platform.pagelength;
                if(!this.platform.filter.count) { this.platform.filter.count = 1;}
                paginator.innerHTML = 'item ' + (page+offset) + '/' + this.platform.filter.count;
                paginator.style.width = '90px';
               
                this.browse.getElementsByTagName('img')[0].style.float = 'left';
                this.browse.getElementsByTagName('img')[0].style.visibility = page >1? 'visible':'hidden';
                this.browse.getElementsByTagName('img')[1].style.visibility = this.platform.filter.count>1 && page+offset<this.platform.filter.count ? 'visible':'hidden'; 
                this.browse.style.display = 'block';
                this.browse.getElementsByTagName('img')[1].style.float = 'left';

                
                
            } else {
                this.browse.style.display = 'none';
    
        }
    }
}


	/*	vp buttons
	*/
	
	Layout.prototype.createButton = function(type,id,callback,options)
	{
		return new Button(this.platform,type,id,callback,options);
	}
	
	function Button(platform,type,id,callback,options)
	{
		/*	create a button object
			options: [w], [selected], [disabled], [last], [section], [path (to label cache)] */
			
		this.platform = platform;
		this.type = type;
		this.id = id;
		this.loaded = false;

		if (!options) var options = new Object();
		
		var selected = options.selected? '_selected':'';
		this.selected = options.selected? true:false;
		this.section = options.section;
		this.disabled = options.disabled;
		this.last = options.last;
		this.w = options.w;
		var path = options.path? '&p='+options.path:'';
		
		var div = document.createElement('div');
			div.className = 'button';
			div.style.visibility = 'hidden';
			div.style.background = 'transparent url(media/bg_button_'+type+selected+'.png) no-repeat';
			if (this.w) div.style.width = this.w +'px';
			
		var edge = document.createElement('img');
			edge.style.position = options.w? 'absolute':'relative';
			if (options.w) edge.style.right = '0px';
			else edge.style.cssFloat = 'left';
			edge.src = 'media/bg_button_'+type+'_edge'+selected+'.png';
		
		var label = document.createElement('img');
			label.style.margin = '3px 0px 0px 8px';
			label.style.cssFloat = 'left';
			var obj = this;
			label.onload = function() { obj.ready(this) };
			label.onmousedown = function() { return false };
			if (id!='') label.src = 'media/generated/button.php?n='+id+path;
			else
			{
				label.style.width = '1px';
				label.style.height = '1px';
				label.src = 'media/blank.gif';
			}
			
		div.appendChild(label);
		div.appendChild(edge);
		
		if (this.disabled) this.setDisabled(true);

		//event handling
		this.elm = div;
		if (callback) this.enable(callback);
	}
	
	Button.prototype.ready = function(label)
	{
		if (!label.offsetWidth && !this.w)
		{
			dbg.msg('id=',this.id,' - no offset, retry');
		
			var obj = this;
			window.setTimeout(function() { obj.ready(label) },200);
			return;
		}
		
		if (!this.w) this.elm.style.width = label.offsetWidth +16 +'px';
		if (this.elm) this.elm.style.visibility = 'inherit';
		this.loaded = true;
		
		if (this.last) this.addEdge();
	}

	Button.prototype.enable = function(callback)
	{
		/*	attach or remove callback from button
		*/
		this.active = callback? true:false;
		this.elm.style.cursor = callback? 'pointer':'auto';

		if (typeof(callback)=='function')
		{
			var obj = this;
			this.elm.onmouseover = function() {
				if (!obj.active || this.style.backgroundImage.indexOf('X.png')!=-1) return;
				this.style.backgroundImage = 'url(media/bg_button_'+obj.type+'X.png)';
				this.childNodes[1].style.visibility = 'hidden';
			};
			this.elm.onmouseout = function() {
				var s = obj.selected? '_selected':'';
				this.style.backgroundImage = 'url(media/bg_button_'+obj.type+s+'.png)';
				this.childNodes[1].style.visibility = 'inherit';
			};
			this.elm.onclick = function() { if (obj.active) callback(obj.section,obj.enabled) };
		}
	}
	
	Button.prototype.setDisabled = function(disabled)
	{
		/*	fade button (remains selected / active if enabled)
		*/
		this.disabled = disabled;

		if (browser.cssfilter) this.elm.style.filter = disabled? 'progid:DXImageTransform.Microsoft.Alpha(opacity=55)':''; //IE 7
		else this.elm.style.opacity = disabled? .55:1;
	}
	
	Button.prototype.setSelected = function(selected)
	{
		this.selected = (selected || selected==undefined)? true:false;
		var s = this.selected? '_selected':'';
		this.elm.style.backgroundImage = 'url(media/bg_button_'+this.type+s+'.png)';
		this.elm.childNodes[1].src = 'media/bg_button_'+this.type+'_edge'+s+'.png';
	}
	
	Button.prototype.addEdge = function()
	{
		/*	adds edge on right side, used for last button on a row
		*/
		var edge = document.createElement('div');
			edge.style.position = 'absolute';
			edge.style.top = '0px';
			edge.style.right = '0px';
			edge.style.width = '1px';
		//	edge.style.height = '22px';
			edge.style.backgroundImage = 'url(media/bg_button_'+this.type+'.png)';
		
		this.elm.style.width = parseInt(this.elm.style.width)+1 +'px';
		this.elm.appendChild(edge);
		this.last = true;
	}

	Button.prototype.rset = function()
	{
		this.setDisabled(false);
		if (this.last)
		{
			//remove edge
			this.elm.removeChild(this.elm.lastChild);
			this.elm.style.width = parseInt(this.elm.style.width)-1 +'px';
			this.last = false;
		}
	}
	
	Button.prototype.dispose = function()
	{
		delete this.elm;
	}


	/*	vp sets ('selections')
	*/
	
	Layout.prototype.setsOffset = function()
	{
		/*	return vertical offset of sets on screen, relative to top of page gradient
		*/
		return (24 + this.setsdiv.offsetTop - (document.body.scrollTop || document.documentElement.scrollTop));
	}

	Layout.prototype.createSet = function(id,title,meta,layout,selected,online)
	{
		return new Set(this,id,title,meta,layout,selected,online);
	}
	
	function Set(layout,id,title,meta,matrix,selected,online)
	{
		/*	create a set object
			options: title, matrix, [selected] */
			
		var obj = this;			
		this.layout = layout;
		this.platform = layout.platform;
		this.id = id;
		this.online = online;
		this.title = title;
		this.meta = meta || '';
		this.matrix = matrix || new Array();
		this.selected = selected!=undefined? selected:false;
	
		var div = document.createElement('div');
			div.className = 'set';
			if (!this.online) div.className += ' set-offline';
			
		//do not display offline sets
		if (!this.online && !this.platform.login) div.style.display = 'none';
			
		var img = document.createElement('img');
			img.className = 'set-frame';
			img.src = 'media/set_frame_blue.png';
			
		var title = document.createElement('div');
			title.className = 'set-title';
			if (!this.online) title.className += ' set-title-offline';
			title.innerHTML = this.title;//this.setTitle();
			
		var meta = document.createElement('div');
			meta.className = 'set-meta';
			if (!this.online) meta.className += ' set-meta-offline';
			meta.innerHTML = this.meta;//this.title;//this.setTitle();
			
		var b = document.createElement('img');
			b.className = 'set-filter';
			b.src = 'media/button_filter_set.png';

		//div.appendChild(img);
		div.appendChild(title);
		div.appendChild(meta);
		div.appendChild(b);

	
		//event handling
		div.style.cursor = 'pointer';
        
	//	div.onmouseover = function() { if (!obj.selected) { this.style.backgroundImage = 'url(media/bg_list_item.png)'; b.src = 'media/button_filter_setX.png' } };
	//	div.onmouseout = function() { if (!obj.selected) { this.style.backgroundImage = ''; b.src = 'media/button_filter_set.png' } };
		div.onmousedown = function(e) { utils.cancelEvents(e,true) } //prevents accidental text select

		div.onclick = id=='filter'? function() { obj.platform.closeItem() }:function() {obj.platform.filter.loaded = true;obj.setSelected(true) };
        //obj.platform.filter.loaded = true

		this.elm = div;
		this.button = b;
		this.titlediv = title;
		this.metadiv = meta;
		
		if (this.platform.edit) 
		{
			this.edit = this.platform.edit.createSetEdit(this.id);
			div.appendChild(this.edit.elm);
		}
		
		this.setIcon();
		if (selected) this.setSelected(true,true);
	}
	
	Set.prototype.setIcon = function()
	{
   
		/*	create canvas pattern display, based on this.matrix
				format: array(1,0,1...), up to 9 elements, added left to right, top to bottom */
			
		if (!this.canvas)
		{
			//create and append canvas
			var c = document.createElement('canvas');
				c.className = 'set-icon';
			//	c.width = 40;
			//	c.height = 40;

			this.elm.appendChild(c);
			
			//init canvas element for IE
			if (typeof(G_vmlCanvasManager)=='object') c = G_vmlCanvasManager.initElement(c);
			
			this.canvas = c;
		}
		
		//draw pattern
		var ctx = this.canvas.getContext('2d');

		/* 	temporary IE8 standards mode compatibility fix, remove when either excanvas or IE8 fixes issue (clientWidth = 0)
		*/
		if (typeof(G_vmlCanvasManager)=='object' && parseInt(this.canvas.firstChild.style.width)==0)
		{
			var node = this.canvas.firstChild;
		//	node.style.width = '40px';
		//	node.style.height = '40px';
		}
		/*
		*/
		
		var x = 0;
		var y = 0;
		var r = 5;
		var offset = this.elm.offsetTop + 15 + this.layout.content.offsetTop + this.layout.setsdiv.offsetTop - (document.body.scrollTop || document.documentElement.scrollTop);
		//this.layout.setsOffset();//24 + this.layout.setsdiv.offsetTop - (window.pageYOffset || document.body.scrollTop);

		ctx.clearRect(0,0,40,40);
		
		for (var i=0; i<this.matrix.length; i++)
		{
			if (i==3 || i==6) y+=15;
			
			if (this.matrix[i])
			{
				x = (i-((y/15)*3)) * 15;
				
				ctx.beginPath();
				ctx.arc(x+r,y+r,r,0,Math.PI*2,true);
				
				//color according to underlying page gradient
			//	ctx.fillStyle = this.layout.gradient.getColorAt(y + 5 + Math.max(0,offset));
			//	ctx.fill();
			}
		}
	}
	
	Set.prototype.setSelected = function(select,force)
	{
		/*	(un)select a Set
		*/
		dbg.msg('Set: id=',this.id,', select=',select,' selected=',this.selected);
		
	
		
		this.selected = select;
	//	this.elm.style.backgroundImage = select? 'url(media/bg_list_item.png)':'';
	//	this.elm.childNodes[1].style.fontWeight = select? 'bold':'normal';
	//	this.button.style.visibility = select? 'hidden':'visible';
	//	this.button.src = 'media/button_filter_set.png';

		//filter
		if (this.id!='filter' && select) this.platform.filter.selectSet(this.id);
		
		//edit
		if (this.edit && this.id!='filter')
		{
			if (!select && this.edit.editing) this.edit.cancel();
			this.edit.elm.style.display = select? 'block':'none';
		}
	}

	
	/*	vp items
	*/
	
	Layout.prototype.createItem = function(item)
	{
		return new Item(this,item);
	}
	
	function Item(layout,item)
	{
		/*	create a list-item object,
			param: layout, item (platform item object) */
			
		var obj = this;
		this.layout = layout;
		this.id = item.id;
		this.section = item.section;
 		this.thumb = item.thumb;
	
		//create DOM elements
		var div = document.createElement('div');
        div.className = 'list-item';
        div.style.marginRight = '5px';
        div.style.marginBottom = '13px';
        div.id = 'item_'+this.id;
        
        if(vp.section == 'agenda') {
            div.style.top = '0px';
        }
			
		//event handling
		//div.onmouseover = function() { this.style.backgroundImage = 'url(media/bg_list_itemX.png)' };
		//div.onmouseout = function() { this.style.backgroundImage = 'url(media/bg_list_item.png)' };
		div.onclick = function() { obj.layout.platform.selectItem(this.id.substr(5)) };
	
		if (item.index!=0)
		{
			div.style.marginTop = Math.round(Math.random()*3)*15 +'px';
			div.style.marginLeft = 15+ Math.round(Math.random()*5)*15 +'px';
		}	
			
		//expand
		this.preview = false;
		var img = document.createElement('img');
			img.className = 'list-item-expand';
			img.src = 'media/icon_expand.png';
			img.onmouseover = function() { if (this.src.indexOf('X.png')==-1) this.src = this.src.replace('.png','X.png') };
			img.onmouseout = function() { if (this.src.indexOf('X.png')!=-1) this.src = this.src.replace('X.png','.png') };
			img.onclick = function(e) { obj.togglePreview(); utils.cancelEvents(e,true) };
		div.appendChild(img);
		
		var t = document.createElement('div');
			t.className = 'list-item-title-expanded';
			t.innerHTML = item.vp? ''+item.title:item.title;
		div.appendChild(t);
		this.title_preview = t;
		
		var tw = 0;
		if (this.thumb)
		{
			var img = document.createElement('img');
				img.className = 'list-item-thumb';

			this.thumb.elm = img;
			tw = this.updateThumb();
			
			img.src = 'media/content/'+item.thumb.id+'_thumb.jpg';
			div.appendChild(img);
 		}

		//content: title, meta and short
		var c = document.createElement('div');
			c.className = 'list-item-content';
			c.style.width = (190-13-tw) +'px';
		div.appendChild(c);
		this.content = c;



		//meta
		var m = document.createElement('div');
			m.className = 'list-item-meta';
		//var str = '';
		var str = '<span class="type"><b>'+this.layout.platform.sections[this.section]+'</b></span>';
		if (item.startdate && layout.platform.section!='vp')
		{
			var d = new Date(item.startdate*1000);
			var y = '<b>&rsquo;'+String(d.getFullYear()).substr(2)+'</b>';
			var mo = d.getMonth() + 1;
			mo = (mo < 10)? '0' + String(mo): String(mo);
			var da = d.getDate();
			da = (da < 10)? '0' + String(da): String(da);
			str+= '<span class="date"><span class="day"><b>'+da+'</b></span><span class="month"><b>'+mo+'</b></span><span class="year">'+y+'</b></span></span>';
			//str+= '<span class="date">'+d.format('shortesthumandate')+y+'</span>';
		}
		//str+= '<span class="type">'+this.layout.platform.sections[this.section]+'</span>';
		m.innerHTML = str;
		c.appendChild(m);
        		//title
		var t = document.createElement('span');
			t.className = 'list-item-title';
			t.innerHTML = item.title;
		c.appendChild(t);
		this.title = t;
		//div.firstChild.appendChild(m);
		
		this.meta = m;

		//short
		var s = document.createElement('span');
			s.className = 'list-item-short';
			s.innerHTML = item.intro.substring(0,175);
			if (item.intro.length>175) s.innerHTML += '..';
		c.appendChild(s);
		this.intro = s;
		
		//add to list
		this.elm = div;
		this.layout.list.insertBefore(div,this.layout.list.lastChild);

		//type
		//if (layout.platform.filter && layout.platform.filter.type.collection) this.updateType();
		

	
		
		//delayed setIcon, to make sure elm.offsetTop is available
		var d = 50 + Math.round(Math.random()*5)*50; //random timing for visual effect
		//window.setTimeout(function() { obj.setIcon(true) },d);
	}
	
	Item.prototype.updateThumb = function()
	{
		/*	proportional thumb dimensions, returns (calculated) width
		*/
		var max = this.preview? 100:60;
		var tw = 0;

		if (this.thumb.w>=this.thumb.h)
		{
			//landscape
			var tw = max+5;
			var th = Math.round((max/this.thumb.w) * this.thumb.h);
			this.thumb.elm.style.width = max +'px';
			this.thumb.elm.style.height = th +'px';
		}
		else
		{
			//portrait
			this.thumb.elm.style.height = max +'px';
			var tw = Math.round((max/this.thumb.h) * this.thumb.w);
			this.thumb.elm.style.width = tw +'px';
			tw+=5;
			var th = max;
		}
		
		this.thumb.elm.style.marginTop = this.preview? '15px':'2px';
		var m = (Math.ceil(th/15) * 15) - th; //stay on 15px grid
		this.thumb.elm.style.marginBottom = this.preview? m + 2 +'px':'0px';
	
		return tw;
	}
	
		
	Item.prototype.togglePreview = function()
	{
		/*	expand or collapse item preview
		*/
		
		this.preview = !this.preview;
		var w = this.preview? 250:190;
		
		this.elm.firstChild.src = this.preview? 'media/icon_collapse.png':'media/icon_expand.png';
		this.elm.style.width = w+'px';
		
		this.title.style.display = this.preview? 'none':'block';
		this.title_preview.style.display = this.preview? 'block':'none';
		this.intro.style.display = this.preview? 'block':'none';
		
		var tw = 0;
		var margin = this.preview? 5:15;
		if (this.thumb) tw = this.updateThumb();
		this.content.style.width = (w-margin-tw) +'px';
		
		if (this.vp)
		{
			this.vp.style.left = this.preview? '15px':'0px';
			this.vp.style.top = this.preview? '2px':'17px';
		}
	}
	
	Item.prototype.dispose = function()
	{
		/*	remove dom elements
		*/
		this.layout.list.removeChild(this.elm);
	}


	
	/*	page animated gradient background
	*/
	
	
	
	/*	init
	*/
	this.layout = new Layout(this);
}

/* [file src="Platform.Filter.js"]
*/
/*	usemedia.com . joes koppers . 10-12.2008
	thnx for reading this code */


/*	Virtueel Platform filter
*/

Platform.prototype.addFilter = function()
{
	/*	init filter object
	*/
	
	function Filter(platform)
	{
		this.platform = platform;
		this.tagmodus = 'AND';
		this.loaded = false;
		for (var i=0; i<platform.filters.length; i++)
		{
			this[platform.filters[i]] = {
				buttons:new Object(),
				options:0
			};
		}

		//sets / filter
		if (platform.section=='index') this.addSets();
		else this.filter();
	}
	
	Filter.prototype.addCollection = function(type,options)
	{
		/*	create base (initial) filter options collection for type
		*/
		this[type].collection = new Object();
    
		for (var i=0; i<options.length; i++) this[type].collection[options[i].filter] = options[i];
       // console.log(this[type].collection);
	}

	Filter.prototype.addTimes = function()
	{
		/*	TIME filter options
		*/
		if (this.platform.section=='map') return; //no time options in map (organizations) section
		
		var year = Number(new Date().getFullYear());
		
		if (this.platform.section=='agenda')
		{
			var options = new Array();
			var filters = new Array();
			
			for (var i=year-7; i<=year+1; i++)
			{
				filters.push(i);
				if (i!=year) options.push(i);
				else 
				{
					var y = this.platform.language=='nl'? 'dit jaar':'this year';
					options.push(y);
				}
			}
		}
		else
		{
			var options = this.platform.language=='nl'? ['vorig jaar','dit jaar','deze maand','deze week','vandaag','actueel']:['last year','this year','this month','this week','today','current'];
			var filters = ['last_year','year','month','week','day','current'];
		}
		
		var rsp = { options:[] };
		for (var i=0; i<options.length; i++) 
		{
			rsp.options.push( { name:options[i], filter:filters[i] } );
            
		}
		this.addCollection('time',rsp.options);
		this.addOptions('time',rsp);
	}

	Filter.prototype.addTypes = function(rsp,by_set)
	{
		/*	TYPE filter options
		*/
		if (!rsp)
		{
			var obj = this;
			dbg.tmr();
			if (!by_set)
			{
				this.platform.server.get('types',function(rsp) { obj.addTypes(rsp) },'section',this.platform.section,'action',this.type.collection? 'update':'init');
			}
			else
			{
				//selected set or bookmarked filter with times: force update of items-type dataset
				this.platform.server.get('types',function(rsp) { obj.addTypes(rsp) },'section',this.platform.section,'action','setupdate','times',this.selectedSet.times);
			}
			return;
		}
		
		dbg.msg('Filter: got types, count=',rsp.query.rows,', t=',rsp.query.time,'tmr');
		if (rsp.dbg) dbg.msg('Filter: dbg=',rsp.dbg);
		
		if (!this.type.collection)
		{
			this.addCollection('type',rsp.options);

			//store (and display) count of initial items dataset
			if (rsp.items)
			{
				this.total = rsp.items;
				if (this.platform.layout.filter.intro) this.result(this.total);
				else this.result();
			}
		}
		else
		{
        return;
			/*	enable/disable base type collection
			*/
			var subset = new Object();
			for (var i=0; i<rsp.options.length; i++) subset[rsp.options[i].filter] = true;
			
			rsp.options = new Array();

 			for (var id in this.type.collection)
 			{
				var t = this.type.collection[id];
 				rsp.options.push( { name:t.name, filter:t.filter, disabled:!subset[id] } );
 			}
		}

		this.addOptions('type',rsp);
		//update tags
		this.addTags();
	}
	
	Filter.prototype.addTags = function(rsp)
	{
		/*	TAG filter options
		*/
        
		if (!this.search) this.addSearch();
		
		if (!rsp)
		{
			var obj = this;
			dbg.tmr();
			var action = this.tag.collection? 'update':'init';
			this.platform.server.get('tags',function(rsp) { obj.addTags(rsp) },'action',action);
			return;
		}
		
		dbg.msg('Filter: got tags, count=',rsp.query.rows,', t=',rsp.query.time,'tmr');
		
		//sort tags to count desc
		rsp.options.sort( function(a,b) { return b.count-a.count } );
		
		if (!this.tag.collection) this.addCollection('tag',rsp.options)
		else
		{
        return;
			/*	add tags from base collection (as disabled) to current subset
			*/
			var subset = new Object();
            
			for (var i=0; i<rsp.options.length; i++) subset[rsp.options[i].filter] = true;
						
			for (var id in this.tag.collection)
			{
				if (!subset[id])
				{
					var t = this.tag.collection[id];
					rsp.options.push( { name:t.name, filter:t.filter, count:t.count, total:t.total, disabled:true } );
				}
			}
		}
		
		this.addOptions('tag',rsp);
	}
	
	Filter.prototype.addSearch = function()
	{
		/*	add search input (to tag filter)	
		*/
		this.search = new Object();
		this.search.type = 'boolean';
		this.platform.layout.createSearch(this.search);
		
		//add interaction to input
		var obj = this;
		this.search.input.onkeydown = function(e)
		{
			if (!e) e = event;
			if (e.keyCode==13) obj.query(); //enter key
		}
		var ignoredKeys = { 9:'tab',16:'shift',17:'ctrl',18:'alt',224:'apple',37:'arrow',38:'arrow',39:'arrow',40:'arrow' };
		this.search.input.onkeyup = function(e)
		{
			if (!e) e = event;
			if (ignoredKeys[e.keyCode]) return e.returnValue;
			
			//show/hide reset
		//	obj.search.rset.style.display = this.value.length>0? 'block':'none';
			if (this.value.length==0) obj.query(true);
		}
		this.search.rset.onclick = function() { obj.query(true) };
		
		//->TMP, for boolean vs natural tests
		this.search.toggleMode = function() {
			this.type = this.type=='natural'? 'boolean':'natural';
			obj.tag.toggleSearch.setSelected(this.type=='natural');
			dbg.msg('Filter: search mode=',this.type);
			obj.filter('search');
		};
	}
	
	Filter.prototype.addOptions = function(type,rsp)
	{
		/*	add filter options (buttons)
		*/
		var obj = this;
        var totalWidth = 0;
        var moreSet = false;
		//clear current
		var container = this.platform.layout.filter[type+'div'];
    
		for (var id in this[type].buttons)
		{
			container.removeChild(this[type].buttons[id].elm);
			this[type].buttons[id].rset();
		}
        
        
   
        
		if (type!='vp' && !this[type].all)
		{
			var options = this.platform.language=='nl'? { time:'wanneer', type:'wat', tag:'waarover' }:{ time:'when', type:'what', tag:'about' };
			//var b = this.platform.layout.createButton(type,options[type],undefined,{ path:'static', selected:true });
            var b = document.createElement('li');
            b.className = 'subject';
            b.innerHTML = '<span><b>'+options[type]+'</b></span>';
                        
            if(options[type] == 'waarover' || options[type] == 'about') 
            {
            	b.style.height = '124px';	
            }
                        
			container.appendChild(b);
							
			this[type].all = b;
			
	
		}
        
        
        /* ADD ALL BUTTON */
        
        

            var b = document.createElement('LI');
            var c = document.createElement('A');
            c.href ="#";            
       
            
            $(c).addEvent('click',function(event) { 
                var targetNode = event.target;
                while(targetNode.tagName != 'a' &&targetNode.tagName != 'A' ) {
                    targetNode = targetNode.parentNode;
                }
                
                
                if(targetNode.parentNode.className == 'active') {
                    targetNode.parentNode.className = '';
                } else {
                   targetNode.parentNode.className = 'active'
                    obj.selectAll(type,false); 

                }
            });

            c.innerHTML = this.platform.language=='nl'? 'alle':'all';
         //   b.className = 'active';
          
            container.appendChild(b);
            b.appendChild(c);
            var width = $(c).getSize();
            b.style.width = width.x +'px';
            b.style.overflow = 'hidden';
        
        
        /* END ADD ALL BUTTON ...START OPTIONS INSERT*/

		for (var i=0; i<rsp.options.length; i++)
		{
          //  alert(i);
          
          ///CREATE MORE BUTTONS AT SET POSITION
          
          if ((type=='tag' && totalWidth+100 > 1100 && moreSet == false) || (type =='type' && i == 7)) {
            var b = document.createElement('LI');
            moreSet = true;
            var c = document.createElement('A');
            var c2 = document.createElement('A');

            var n = document.createElement('IMG');
            n.src = 'http://www.virtueelplatform.nl/media/icon_next.png';
            c.href ="#";            
       
            if(type == 'type') { 
                $(c2).addEvent('click',function(event) { 
                    
                    document.getElementById('filter-expanded').getElementsByTagName('UL')[1].style.height = '26px';
                    
                    c2.style.display = 'none';
                    
                    if(document.getElementById('filter-expanded').getElementsByTagName('UL')[2].style.height != 'auto') {
                            document.getElementById('list').style.paddingTop = '0px';
                            document.getElementById('sets').style.top = '0px';
                            document.getElementById('item').style.top = '19px';
       
                    } else {
                            document.getElementById('list').style.paddingTop = '48px';
                            document.getElementById('sets').style.top = '-48px';                        
                            document.getElementById('item').style.top = '94px';
                            
                    }

                });
                
                
                $(c).addEvent('click',function(event) { 
                                       
                        document.getElementById('filter-expanded').getElementsByTagName('UL')[1].style.height = 'auto';
                        
                        c2.style.display = 'block';
                        
                        if(document.getElementById('filter-expanded').getElementsByTagName('UL')[2].style.height != 'auto') {
                            document.getElementById('list').style.paddingTop = '25px';
                            document.getElementById('item').style.top = '44px';
                            if(document.getElementById('sets')) {document.getElementById('sets').style.top = '-25px';}
                        } else {
                            document.getElementById('item').style.top = '118px';
                            document.getElementById('list').style.paddingTop = '73px';
                             if(document.getElementById('sets')) {document.getElementById('sets').style.top = '-75px'; }                       
                        }   
                });

            } else if(type == 'tag') {
                
                
                $(c2).addEvent('click',function(event) { 
                        
                        c2.style.display = 'none';
                        try {
                        document.getElementById('filter-expanded').getElementsByTagName('UL')[2].style.height = '52px';
                        } catch(error) {
                            document.getElementById('filter-expanded').getElementsByTagName('UL')[1].style.height = '52px';

                            document.getElementById('map-container').style.top = '141px';
                            document.getElementById('meta').style.display ='none';
                        }
                        
                        if(document.getElementById('filter-expanded').getElementsByTagName('UL')[1].style.height != 'auto') {
                            document.getElementById('list').style.paddingTop = '0px';
                            document.getElementById('sets').style.top = '0px';
                            document.getElementById('item').style.top = '19px';
                        } else {
                            document.getElementById('list').style.paddingTop = '25px';
                            document.getElementById('sets').style.top = '-25px';  
                            document.getElementById('item').style.top = '44px';
                        }
                        
                        
                    });

                
                $(c).addEvent('click',function(event) { 
                
                    if(document.getElementById('sets')) {document.getElementById('sets').style.position = 'relative';}
                    c2.style.display = 'block';
                          
                    try {
                        document.getElementById('filter-expanded').getElementsByTagName('UL')[2].style.height = 'auto';
                    } catch(error) {
                        document.getElementById('filter-expanded').getElementsByTagName('UL')[1].style.height = 'auto';
                        document.getElementById('map-container').style.top = '215px';
                        document.getElementById('meta').style.display ='none';
                    }
   
                        if(document.getElementById('filter-expanded').getElementsByTagName('UL')[1].style.height != 'auto') {
                            document.getElementById('list').style.paddingTop = '45px';
                             if(document.getElementById('sets')) {document.getElementById('sets').style.top = '-45px';}
                            document.getElementById('item').style.top = '44px';
                        } else {
                            document.getElementById('list').style.paddingTop = '70px';
                             if(document.getElementById('sets')) {document.getElementById('sets').style.top = '-72px';}  
                            document.getElementById('item').style.top = '94px';
                        }

                });
            }
            
            c.innerHTML = this.platform.language=='nl'? 'meer':'more';
            c2.innerHTML = this.platform.language=='nl'? 'verberg':'hide';
            
            c2.style.display = 'none';
            c2.style.position = 'relative';
            c2.style.fontWeight = 'bold';
            c2.style.textTransform = 'none';
            c2.style.paddingLeft = '8px';
            c2.style.paddingBottom = '10px';
                        
            container.appendChild(b);
            c.appendChild(n);
            c.style.position = 'relative';
            c.style.fontWeight = 'bold';
            c.style.textTransform = 'none';
            c.style.paddingLeft = '8px';
            
            n.style.position = 'absolute';
            n.style.left = '35px';
            b.appendChild(c2);
            b.appendChild(c);

            b.style.backgroundImage = 'none';
            b.style.width = '80px';
            b.style.overflow = 'hidden';
            b.style.borderRight = 'none';
          
          }
          
          
          


          ///END CREATE MORE BUTTONS AT SET POSITION

          
			var options = {
				path:'static',
				section:rsp.options[i].filter,
				disabled:rsp.options[i].disabled
			};
         
			if (type=='tag') options.selected = this.tag.collection[rsp.options[i].filter].selected;
     //       console.log(container);
            //<li><a href="#">ERFGOED</a></li>
            var b = document.createElement('LI');
            var c = document.createElement('A');
            
        
       //     if (obj.active) callback(obj.section,true) };
           //console.log(obj);
            c.href ="#";
            c.id = rsp.options[i].filter;
            
       
            
            $(c).addEvent('click',function(event) { 
                var targetNode = event.target;
                while(targetNode.tagName != 'a' &&targetNode.tagName != 'A' ) {
                    targetNode = targetNode.parentNode;
                }
                
                obj.select(type,targetNode.id,true); 
                
                
                
                if(targetNode.parentNode.className == 'active') {
                    targetNode.parentNode.className = '';
                } else {
                   targetNode.parentNode.className = 'active'
                }
            });

            c.innerHTML = rsp.options[i].name;
           
          
            container.appendChild(b);
             b.appendChild(c);
            
            var width = $(c).getSize();
            totalWidth += width.x;
           // console.log(Browser.Engine != true);
            if(!Browser.Engine.trident) {
                totalWidth += 3;
            }
            b.style.width = width.x +'px';
            b.style.overflow = 'hidden';
		}
		
		//store options count
		this[type].options = i;
  
        //console.log(this[type]);
					Cufon.replace('#vpfilter li', { hover: true });
		
		this.optionsLoaded(type);

	}
	
	Filter.prototype.optionsLoaded = function(type)
	{
		/*	check for all filter options to be loaded,
			add button edges when true 	*/
     //   console.log('test');
		var n = 0;
		for (var id in this[type].buttons)
		{
			if (!this[type].buttons[id].loaded) break;
			n++;
		}
		
		if (n==this[type].options)
		{
			dbg.msg('Filter: optionsLoaded(',type,')');
		
			n = 0;
			for (var id in this[type].buttons)
			{
				n++;
				var elm = this[type].buttons[id].elm;
				if ((!elm.nextSibling || (elm.nextSibling && elm.offsetTop<elm.nextSibling.offsetTop)) && elm.offsetLeft+elm.offsetWidth<500)
				{
					this[type].buttons[id].addEdge();
				}
			}

			//store number of rows for tags (expand)
			if (type=='tag')
			{
				var layout = this.platform.layout;
				this.platform.layout.filter.tagrows = layout.filter.tagdiv.lastChild.offsetTop/22;
				
				//update filter size + margin if tags are expanded
				if (layout.filter.tagsexpanded) layout.toggleTags(true);
				
				/*	filter is now complete
				*/
				if (!this.loaded)
				{
					dbg.msg('Filter: complete');
                    
					this.loaded = true;
					delete this.platform.deeplink;
					this.platform.layout.filter.loading.style.display = 'none';
					if (this.platform.layout.sets) this.platform.layout.sets.loading.style.display = 'none';
					if (this.selectedSet) this.selectedSet.display(true);
					if (this.agenda) this.agenda.updateNavigation();
					if (this.platform.vpsection)
					{
						this.addTags();
						delete this.platform.vpsection;
					}
				}
			}
		}
		else
		{
			//not loaded, retry in 100ms
			var obj = this;
			window.setTimeout(function() { obj.optionsLoaded(type) },100);
		}
	}
	
	Filter.prototype.checkOptions = function(type)
	{
		/*	return array of selected options
		*/
		var selected = [];
//        console.log(this[type].collection);
         /*
		for (var id in this[type].buttons)
		{
			//if (type=='tag' && this[type].buttons[id].disabled) continue; //don't count disabled tags
			if (this[type].buttons[id].selected) selected.push(id);
		}
        */
        for (var filter in this[type].collection)
		{
           //     console.log(filter);
            if (this[type].collection[filter].selected) selected.push(filter);
			//if (type=='tag' && this[type].buttons[id].disabled) continue; //don't count disabled tags
		//	if (this[type].collection[i].selected) selected.push(this[type].collection[i].filter);
		}
		return selected;
	}
	
	Filter.prototype.toggleTagMode = function(by_set)
	{
		this.tagmodus = 'AND';
		///this.tag.toggle.setSelected(this.tagmodus=='AND');
		
		if (!by_set)
		{
			this.resetSet();
			this.filter('tag');
		}
	}
	
	Filter.prototype.selectAll = function(type,rset)
	{
		dbg.msg('Filter: selectAll(',type,')');
	
	//	this[type].all.setSelected(true);
	//	this[type].all.enable(false);
	//	console.log(this[type]);
		for (var b in this[type].collection)
		{
			this[type].collection[b].selected = false;
             document.getElementById(b).parentNode.className = '';
			// b.selected = false;
		}
		
		if (!rset)
		{
			if (type=='time' && this.platform.agenda) this.platform.agenda.setPeriod();
			this.resetSet();	
			this.filter(type);
		}
	}
	
	Filter.prototype.select = function(type,id,by_set)
	{
    
		/*	option select
		*/
		dbg.msg('Filter: select(',type,',',id,')');
		
		var obj = this
	//	var button = this[type].buttons[id];
	//	if (!button) return;
    		switch (type)
		{
			case 'vp':
			case 'time':
				
               
                    for (item in this[type].collection) {

                        this[type].collection[item].selected = false;
                      //  this[type].collection[item.filter].selected = false;
                        $(item).parentNode.className = '';
                     //   this[type].collection[filter]
                        if($(item).parentNode.id == id) {
                            $(item).parentNode.className = 'active';
                           } 
                    }
                    this[type].collection[id].selected = true;
                    
                    document.getElementById('filter-expanded').getElementsByTagName('ul')[0].getElementsByTagName('li')[1].className = '';

              //  }
  
				break;
				
			case 'type':
            
                    document.getElementById('filter-expanded').getElementsByTagName('ul')[1].getElementsByTagName('li')[1].className = '';

			case 'tag':
				/*	type/tag: OR buttons, multi selected, all = none
				*/
		
				if(this[type].collection[id].selected == true) {
                    this[type].collection[id].selected = false;
                } else {
                    this[type].collection[id].selected = true;
                    try {
                    document.getElementById('filter-expanded').getElementsByTagName('ul')[2].getElementsByTagName('li')[1].className = '';
                    } catch(error){}

                }
       
				if (this.checkOptions(type).length > 0)
				{
				//	this[type].all.setSelected(false);
				//	this[type].all.enable(function(id) { obj.selectAll(type) });
				}

				break;
		}
		if (!by_set)
		{
			if (type=='time' && this.platform.agenda) this.platform.agenda.setPeriod('year',this.checkOptions('time')[0]);
              
			this.resetSet();
			this.filter(type);
		}
		else 
		{
			dbg.msg('----filter select by set, type=',type,' default-set=',this.defaultSet);
		
			if (type=='time')
			{
				if (this.defaultSet)
				{
					this.defaultSet = false;
					this.addTypes(undefined,true);
					if (!this.platform.layout.filter.intro) this.result(); //updates bookmark
				}
				else
				{
					this.filter(type);
				}
			
				
			}
		}
        this.filter(type);


	}

	Filter.prototype.query = function(rset,filter_rset)
	{
		/*	execute or reset search query
		*/
		if (rset)
		{
			this.resetSet();
			this.search.input.value = '';
			this.search.rset.style.display = 'none';
			if (!filter_rset) this.search.input.focus();
			
			//reset filter
			if (this.search.button.selected)
			{
				this.search.setSelected(false);
				if (!filter_rset) this.filter('tag');
			}
		}
		else
		{
			if (this.search.input.value.length<3) alert(this.platform.msg['query_too_short'])
			else
			{
				this.search.setSelected(true);
				this.resetSet();
				this.filter('search');
			}
		}
	}
	
	Filter.prototype.filter = function(type,rsp)
	{
		/*	execute filter options
		*/
		if (!rsp)
		{
// 			
			var p = this.platform;
			p.page = 1; //reset paging
			
			//loading anim
			var s = p.section=='map'? '_map':'';
			p.layout.filter.result.innerHTML = '<img src="media/filter_loading'+s+'.gif">';
			
			var action = type || 'init';

			var times = type? this.checkOptions('time').join(','):'';
			var types = type? this.checkOptions('type').join(','):'';
			var separator = this.tagmodus=='OR'? ',':'+';
			var tags = type? this.checkOptions('tag').join(separator):'';
			var search = this.search && this.search.button.selected? this.search.input.value:'';
			var searchtype = this.search && this.search.type=='boolean'? 'boolean':'';
			var vp = this.selectedSet && this.selectedSet.vp? 1:0;
			var period = this.platform.agenda && this.platform.agenda.mode!='year'? this.platform.agenda.period:'';
			
			//default selected set (home or bookmarkedFilter) ?
			if (!type && this.selectedSet)
			{
				dbg.msg('Filter, init with set=',this.selectedSet.id);
				
				this.defaultSet = true;
				
				times = this.selectedSet.times;
				types = this.selectedSet.types;
				tags = this.selectedSet.tags;
				search = this.selectedSet.search;
				searchtype = 'boolean';
				
				//expand sets display
				if (this.selectedSet.id!='bookmark' && (this.selectedSet.online || p.login)) p.layout.toggleSets();
			}
			
			//vp section?
			if ((type=='type' || type==undefined) && p.vpsection)
			{
				types = p.vpsection;
				//delete p.vpsection;
			}
			var obj = this;
			dbg.msg('* Filter: type=',type,', action=',action,', defaultSet=',this.defaultSet);
			dbg.tmr();
			if (type=='search' || type=='tag')
			{
				this.platform.server.get('items',function(rsp) { obj.filter(type,rsp) },'lan',p.language,'section',p.section,'action',action,'types',types,'tags',tags,'search',search,'searchtype',searchtype,'period',period,'vp',vp);
			}
			else
			{
				this.platform.server.get('items',function(rsp) { obj.filter(type,rsp) },'lan',p.language,'section',p.section,'action',action,'times',times,'types',types,'tags',tags,'search',search,'searchtype',searchtype,'period',period,'vp',vp);
			}
		}
		else
		{
			dbg.msg('Filter: <span style="color:#00a890">got items, count=<b style="font-size:10px">',rsp.query.rows,'</b>, t=',rsp.query.time,'</span>','tmr');
			if (rsp.dbg) dbg.msg('Filter: dbg=',rsp.dbg);
			
			//update filter set count
			this.count = rsp.query.rows;
			if (this.defaultSet && this.platform.layout.filter.intro)
			{
				if (this.total) this.result(this.total,rsp.query.time);
			}
			else
			{
				this.result(this.count,rsp.query.time);
			}
			
			//close expanded item
			if (type!=undefined && this.platform.item)
			{
				//do not close item if deeplinked under vp section
// 				if (this.platform.section=='vp' && this.platform.hash) delete this.platform.hash;
// 				else
// 				{
					this.platform.closeItem();
// 				}
			}
			
			dbg.msg('--filtered, type=',type,' defaultSet=',this.defaultSet);

			//add filtered items
			if (type=='time' && this.defaultSet) //skip items update for time filter and default set
			{
				this.defaultSet = false;
			}
			else
			{
// 				dbg.msg('=== reset default ===, action=',action,', type=',type);
			
				this.platform.addItems(rsp.items);
				if (type!=undefined) this.defaultSet = false;
			}
			
			//filter update
			switch (type)
			{
				case undefined:
				case 'init':
					//filter init
					this.addTimes();
					this.addTypes();
                                    this.rset();

					break;
					
				case 'time':
					this.addTypes();
					break;
					
				case 'type':
					this.addTags();
					break;
			}
		}
	}
	
	Filter.prototype.result = function(count,time)
	{
		/*	display filter result count
		*/
		dbg.msg('** display filter result');
		
		if (count==undefined) count = this.count;
		var f = this.platform.layout.filter;
		var str = '<strong>'+count+'</strong> item';
		if (count!=1) str+= 's';
		str+= f.intro? ' in index.. ':this.platform.language=='nl'? ' gevonden.. ':' found.. ';

		f.result.innerHTML = str;
        if (this.platform.section=='map')
				{
        f.footer.style.zIndex  = '200000';
        f.footer.style.top = '0px';
        f.footer.style.position = 'relative';
     }
		
		//add reset and bookmark option, if filtered
		if (!f.intro)
		{
			f.action.innerHTML = '';

			if (this.total && count!=this.total)
			{
				var obj = this;
				
				//bookmark (not in agenda, map)
				if (this.platform.section=='index')
				{
                /*
					var a = document.createElement('a');
						a.href = this.getUrl() || '/filter/'+this.platform.bookmarkedFilter;
						a.onclick = function() { obj.bookmark(this.href); this.blur(); return false };
						a.innerHTML = '<img class="filter-action" src="media/button_bookmark.png" onmouseover="this.src=\'media/button_bookmarkX.png\'" onmouseout="this.src=\'media/button_bookmark.png\'">';
					f.action.appendChild(a);
                    */
				}
					
				//reset
				var r = document.createElement('img');
					r.className = 'filter-action';
					r.src = 'media/button_reset.png';
					r.title = this.platform.msg['filter_reset'];
                    r.id="reset_button";
					//r.onmouseover = function() { this.src = 'media/button_resetX.png' };
					//r.onmouseout = function() { this.src = 'media/button_reset.png' };
					r.onclick = function() { obj.rset(true) };
                    if(!document.getElementById('reset_button')) {
                   //     document.getElementById('filter-section').appendChild(r);
                }
			}
			
			if (this.platform.section=='map')
			{	
				//add bounds button
				f.action.appendChild(this.platform.map.setBounds);
			}
		}
	}
	
	Filter.prototype.getUrl = function()
	{
		/*	return bookmarkable url for current filter options
		*/
		if (!this.time.all || !this.type.all || !this.tag.all) return;

		var times = this['time'].all.selected? 'alltimes':this.checkOptions('time').join(',');
		var types = this['type'].all.selected? 'alltypes':this.checkOptions('type').join(',');
 		var tags = this['tag'].all.selected? 'alltags':this.checkOptions('tag').join(this.tagmodus=='OR'? ',':'+');

 		var search = this.search && this.search.button.selected? this.search.input.value:'';
 		var searchtype = this.search && this.search.type=='boolean'? 'boolean':'';
 		var vp = this.selectedSet && this.selectedSet.vp? 1:0;
// 		var period = this.platform.agenda && this.platform.agenda.mode!='year'? this.platform.agenda.period:'';

		var url = '/filter/';
			url+= times+'/'+types+'/'+tags+'/';
		if (search) url+= search+'/'; //+searchtype+'/';
		if (vp) url+= vp;
		
		return url;
	}
	
	Filter.prototype.bookmark = function(url)
	{
		/*	add bookmark
		*/
		if (browser.cssfilter)
		{
			//IE Favorite
			var e = this.platform.language=='nl'? 'e-cultuur':'e-culture';
			window.external.AddFavorite('http://'+document.location.host+url,'Virtueel Platform '+e+' filter');
		}
		else
		{
			//other (manual)
			alert(this.platform.msg['filter_bookmark']);
		}
		return false;
	}
	
	Filter.prototype.rset = function(complete)
	{
		/*	reset filter to all times, types, tags
		*/
		if (complete)
		{
			//determine which filter needs reset
			var type;
			if (this['time'].all && !this['time'].all.selected) type = 'time';
			else if (!this['type'].all.selected) type = 'type';
			else if (!this['tag'].all.selected) type = 'tag';
			
			if (this.platform.item) this.platform.closeItem();
			
			dbg.msg('Filter: complete reset, type=',type);
		}
		
		//reset gui
		if (this['time'].all) this.selectAll('time',true);
		this.selectAll('type',true);
		this.selectAll('tag',true);
		
		this.query(true,true);
	
		if (this.tagmodus=='AND') this.toggleTagMode(true);
	
		//update items	
		if (complete)
		{
			this.platform.layout.filter.result.innerHTML = '<img src="media/filter_loading.gif">';
			this.platform.layout.filter.action.innerHTML = '';
			this.filter(type);
		}
	}
	
	Filter.prototype.addSets = function(rsp)
	{
		if (!rsp)
		{
			this.sets = new Object();
			
			dbg.tmr();
			var obj = this;
			this.platform.server.get('sets',function(rsp) { obj.addSets(rsp) },'lan',this.platform.language);
			return;
		}
		
		dbg.msg('Filter, got sets, count=',rsp.sets.length,rsp.dbg || '','tmr');
		
		for (var i=0; i<rsp.sets.length; i++)
		{
			this.addSet(rsp.sets[i]);
		}
		
		dbg.msg('Filter: addSets, bookmark=',this.platform.bookmarkedFilter);
		
		//bookmarked filter: add as selected set
		if (this.platform.bookmarkedFilter)
		{
			var options = this.platform.bookmarkedFilter.split('/');

			this.addSet( {
				id:'bookmark',
				times:options[0]!='alltimes'? options[0]:'',
				types:options[1]!='alltypes'? options[1]:'',
				tags:options[2]!='alltags'? options[2]:'',
				search:options[3]? options[3].replace(/\+/g,' '):'',
				vp:0
			} );
			
			this.selectSet('bookmark');
		}

		//init filter		
		this.filter();
		
		//this.platform.layout.toggleSets();
	}
	
	Filter.prototype.addSet = function(s)
	{
		if (window.location.hash!='')
		{
			//deeplink or bookmark?
			if (this.platform.selectedSet && this.platform.selectedSet==s.id)
			{
				//set link
				s.selected = true;
			}
			else
			{
				//if item link, do not load any sets
				if (this.platform.hash!='filter' && this.platform.hash!='filter/') s.selected = false;
			}
		}
		else
		{
			//overrule default sets for internal links
			if (this.platform.internal) s.selected = false;
		}
		
		dbg.msg('Filter: addSet, id=',s.id,' selected=',s.selected)
		
		this.sets[s.id] = s;
		
		if (s.id!='bookmark')
		{
			var p = this.platform;
			var gui = p.layout.createSet(s.id,s.title,s.meta,s.layout,s.selected,s.online);
					Cufon.replace('#meta li', { hover: true });

			var node = s.id=='new'? p.layout['setsdiv'].firstChild:p.layout['setsdiv'].lastChild;
			p.layout['setsdiv'].insertBefore(gui.elm,node);
		
			this.sets[s.id].gui = gui;
		}
		
		var obj = this;
		this.sets[s.id].display = function(init)
		{
			/*	update filter state
			*/
			
			dbg.msg('Set: updating filter..',', init=',init);
			
			//update filter state, in reverse order
			if (this.tags!='')
			{
				if (this.tags.indexOf('+')!=-1 && obj.tagmodus!='AND') obj.toggleTagMode(true);
		//		if (this.tags.indexOf(',')!=-1 && obj.tagmodus!='OR') obj.toggleTagMode(true);
				
				var separator = '+';
				var tags = this.tags.split(separator);
				for (var i=0; i<tags.length; i++)
				{
					obj.select('tag',tags[i],true);
				}
			}
			
			if (this.search!='')
			{
				obj.search.input.value = this.search;
				obj.search.setSelected(true);
		//		obj.search.rset.style.display = 'block';
			}

			if (this.types!='')
			{
				var types = this.types.split(',');
				for (var i=0; i<types.length; i++)
				{
					obj.select('type',types[i],true);
				}
				
				//update tags display
				if (this.times=='' && init) obj.addTags(); 
			}
			
			//times last (updates entire set, including items)
			if (this.times!='')
			{
				obj.select('time',this.times,true);
				//if (!init) obj.filter('time');
			}
			else
			{
				if (!init)
				{
					obj.defaultSet = false;
					obj.filter('time');
				}
			}
		}
	}
	
	Filter.prototype.selectSet = function(id)
	{
		/*	apply set to filter, or load set in index
		*/
		
		dbg.msg('Filter: selectSet(',id,'), filter loaded=',this.loaded);
		
		this.setedit = false;

		if (this.loaded) this.rset();

		//de-select current
		if (this.selectedSet) this.selectedSet.gui.setSelected(false);
		
		//hide intro (if not defaultset)
		if (this.loaded && this.platform.layout.filter.intro) this.platform.layout.toggleFilter();

		this.selectedSet = this.sets[id];

		
		
		//update filter / items
		if (this.loaded) this.selectedSet.display(); //otherwise called after initial tag options are loaded
	}
	
	Filter.prototype.resetSet = function()
	{
        
        
		if (!this.selectedSet || this.setedit) return;
				
		if (this.selectedSet.gui) this.selectedSet.gui.setSelected(false);
		delete this.selectedSet;
		
		//highlight filterset
// 		this.platform.layout.filterset.elm.style.backgroundImage = 'url(media/bg_set.png)';
// 		this.platform.layout.filterset.rset.src = 'media/set_reset.png';
	}
	

	/*	init
	*/
	this.filter = new Filter(this);
}

