if(!rtgi) var rtgi={};

if(!rtgi.mapFilter){

	rtgi.mapFilter=function(id,mapfile,textfile,map,input,output){
		var self=this;
		this.id=id;
		this.qry=$(input);
		this.out=$(output);
		this.texts=false;
		$.ajax({
			url: textfile,
			type: "GET",
			dataType: "json",
			success: function(json){
				self.texts=json.texts || [];
				log("["+self.id+"] "+self.texts.length+" texts loaded");
				self.qry.keyup(function(e){ self.searchText(e); }).select();
				var prm=rtgi.anchor.get(self.id),i,k;
				if(prm){
					log("["+self.id+"] anchor ["+prm+"] found");
					self.qry.val(prm);
				}
				self.view=new Seadragon.Viewer(map);
				self.view.openDzi(mapfile);
				self.view.addEventListener("open",function(){
					log("["+self.id+"] viewer opened");
					if(self.qry.val().length) {
						self.searchText({which:0});
						self.searchText({which:13});
					}
				});
			}
		});
	}

	rtgi.mapFilter.prototype={
		zoomwidth:0.07,
		zoomheight:0.07,
		dx:false,
		dy:0.5,

		searchText: function(e){
			if(e.which==13) {
				if(this.dx!==false) this.showText(this.dx,this.dy);
			} else {
				var s=this.qry.val().toLowerCase();
				var nb=0, self=this;
				this.out.empty();
				this.dx=false;
				if(s.length) {
					log("["+this.id+"] searching ["+s+"]");
					for(var i=0,l=this.texts.length,r=new RegExp(s),t;i<l;++i){
						t=this.texts[i];
						if(r.test(t.text)) {
							this.out.append(
								$('<div class="resitem" x="'+t.x+'" y="'+t.y+'">'+t.text+'</div>').click(function(e){
									self.showDivText(this); 
								})
							);
							if(this.dx===false){
								this.dx=t.x;
								this.dy=t.y;
							}
							if(++nb>9) {
								this.out.append('<div class="resinfo">more...</div>');
								break;
							}
						}
					}
					if(this.dx===false) {
						this.out.html('<div class="resinfo">nothing match</div>');
						log("["+this.id+"] nothing found");
					} else
						log("["+this.id+"] at least "+nb+" matches");
				}
			}
		},
		
		showDivText: function(div){
			var d=$(div);
			this.showText(d.attr('x'),d.attr('y'),d.text());
		},

		showText: function(x,y,txt){
			var d=$(this);
			rtgi.anchor.put(this.id,txt || this.qry.val());
			x-=(this.zoomwidth/2); //x+=0.07;
			y-=(this.zoomheight/2); //y-=0.145;
			log("["+this.id+"] zooming to "+x+","+y);
			this.view.viewport.fitBounds(new Seadragon.Rect(x,y,this.zoomwidth,this.zoomheight));
		}
	}
}

if(!rtgi.anchor) rtgi.anchor={
	serialize: function(dta){ return encodeURIComponent((dta.constructor==Array) ? dta.join(";") : dta); },
	unserialize: function(str){ return decodeURIComponent(str).split(";"); },
	put: function(key,val){ 
		var p=document.location.href.indexOf('#');
		var u=(p!=-1) ? rtgi.anchor.unserialize(document.location.href.substr(p+1)) : [], ok=false;
		for(var i=0;i<u.length;++i){
			var k=u[i].split('=');
			if(k[0]==key) {
				u[i]=key+"="+val;
				ok=true;
			}
		}
		if(!ok) u.push(key+"="+val);
		document.location="#"+rtgi.anchor.serialize(u);
	},
	get: function(key){
		var p=document.location.href.indexOf('#');
		var u=(p!=-1) ? rtgi.anchor.unserialize(document.location.href.substr(p+1)) : [];
		for(var i=0;i<u.length;++i){
			var k=u[i].split('=');
			if(k[0]==key) return k[1];
		}
		return false;
	}
}

var log=function(){};
if(/jsdebug/i.test(document.location.href)){
	if(window.console && window.console.debug) log=function(msg){ window.console.debug(msg); }; //firebug
	else if(window.console && window.console.log) log=function(msg){ window.console.log(msg); }; //safari
	else if(console && console.log) log=function(msg){ console.log(msg); }; //chrome
	else if(opera && opera.postError) log=function(msg){ opera.postError(msg); }; //opera
	else if(show) log=function(msg){ show.info(msg); }; //slipbanana
}
