var keys=function(id){this.id=id;this.values=[];this.link=[]},o=keys.prototype
o.setvalue=function(key,value,force){
	if((force&&this.values[key])||this.values[key]==null){
		var a=this.values.length
		if(this.values[key]==null){this.link[key]=a;this.link[a]=key}
		else{a=this.link[key]}
		this.values[key]=this.values[a]=value
	}
}
o.getvalue=function(key,value){
	return (this.values[key]==null)?null:this.values[key]
}
o.deletekey=function(key){
	var link=this.link[key]
	if(this.values[link]){delete this.values[link]}
	if(this.values[key]){delete this.values[key]}
	if(this.link[key]){delete this.link[key]}
	if(this.link[link]){delete this.link[link]}
}
o.buildquerystring=function(){
	var a=[]
	var b=this.values
	var c=this.link
	for(var i=0;i<b.length;i++){
		if(c[i]!=null){a[a.length]=c[i]+"="+b[i]}
	}
	return a.join("&")
}
o.readquerystring=function(str,force){
	var a=unescape(String(str).replace(/\?/,"")).split("&"),b
	for(var i=0;i<a.length;i++){
		b=a[i].split("=");if(typeof b[0]!="string"||b.length==1){continue}
		this.setvalue(b[0],b[1],force)	
	}
}
o.deletekeys=function(){
	var a=arguments
	if(!a.length){
		this.link=[];this.values=[];return
	}
	for(var i=0;i<a.length;i++){
		this.deletekey(a[i])
	}
}
o=null
var getkeys=function(id,force){
	if(!top[id]||force){top[id]=new keys(id)}
	return top[id]
}

/*
top.getkeys("groepwaarden1",self,true)
getkeys('naam',self,true/false)
2e argument geeft aan waar een variabele moet worden aangemaakt die verwijst naar het object in de top.
in dit geval "groepwaarden1"
true geeft aan dat een bestaande keyset in de top met dezelfde naam mag worden overschreven

deletekeys() : 
	verwijdert alle keys of..
deletekeys('key1','key2','key3')
	verwijdert key1 + key2 + key3

*/