var debug=false;

if(!Array.indexOf){
	    Array.prototype.indexOf = function(obj){
	        for(var i=0; i<this.length; i++){
	            if(this[i]==obj){
	                return i;
	            }
	        }
	        return -1;
	    }
	}

function JSDB(){
  this.rawdata=null;
  this.datapoints=new Array();
  this.nostrip=false;
  this.loadData=function(filename){
    this.rawdata=syncreq(filename);
    try{
      this.rawdata=this.rawdata.replace(/\n/g," ");
      this.rawdata=this.rawdata.replace(/\r/g," ");
    }catch(e){alert("Error with server response");}
 /*   try{	
      var pics=this.rawdata.match(/<img.*?\>/g);
      if(pics)
	for(var n=0;n<pics.length;n++){
	  try{
	    var pic=pics[n].match(/\".*?\"/g);
	    pic=pic[0];
	    this.rawdata=this.rawdata.replace(pics[n],pic.substring(1,pic.length-1));
	  }catch(e){alert("Error parsing picture");}
	}
    }catch(e){alert("Error parsing pictures");}*/
   // try{
       //   alert(this.rawdata);
      var x=this.rawdata.match(/<table.*?>.*?<\/table.*?>/g);
      //  alert(x);
      for(var n=0;n<x.length;n++){
        //try{
          var dp=new DataPoint();
          dp.loadData(x[n],this.nostrip);
			if(debug)
				document.getElementById("log").innerHTML+="<hr><h1>----------------</h1><hr>";
          this.datapoints[n]=dp;
	  dp.setValue("id",n);
        //}catch(e){alert("Error parsing datapoint");}
      }
    //}catch(e){alert("Error parsing datapoints "+e);}
  };

  this.search=function(valstart,keys){
//    alert("s "+valstart+" "+keys);
    valstart=valstart.toLowerCase();
    var words=valstart.split(" ");
    for(var n=0;n<words.length;n++)
      words[n]=trim(words[n]);
    var result=new Array();
    for(var n=0;n<this.datapoints.length;n++){
	var add=true;
	for(var i=0;i<words.length;i++)
	  if(!this.datapoints[n].search(words[i],keys)){
	    add=false;
	    break;
	  }
        if(add)//this.datapoints[n].search(words[i],keys))
	    result[result.length]=n;
      }

    return result;
  };

}

function DataPoint(){
  this.rawdata=null;
  this.kvs=new Array();

  this.loadData=function(raw,nostrip){
	this.rawdata=raw;
        var x=this.rawdata.match(/<tr.*?>.*?<\/tr.*?>/g);
	for(var n=0;n<x.length;n++){
	  var y=x[n].match(/<td.*?>.*?<\/td.*?>/g);
	//  document.getElementById("log").innerHTML+="'"+y[0]+"'='"+y[1]+"'<hr>";
	
	  if(y.length!=2)
	    alert("error parsing key-value-pair: '"+x[n]+"'");
	  else{
	    var key=y[0].match(/>.*?</);
	    key=key[0];
	    key=key.substring(1,key.length-1);
	    key=trim(key);
		var val=y[1];
		if(key=="bild"){
			val=val.match(/src=".*?"/);
			if(val){
				val=val[0];
				val=val.substring(5,val.length-1);
				val=trim(val);
			}
 		//	val=val.replace("<"," ");
 		//	val=val.replace(">"," ");
		/*	val=val[0];
			val=val.substring(1,val.length-1);*/

		}else{
			//val=y[1].match(/>.*?</);
			if(nostrip!=true)
			  val=stripHTML(val);
			else
			  val=stripTables(val);
			//val=val[0];
			//val=val.substring(1,val.length-1);
			val=trim(val);
			if(val=="&nbsp;" || val.length==0)
				val=null;
// 			val=val.length+"-"+val;
		}
		if(debug){
		  document.getElementById("log").innerHTML+="'"+key+"'='"+val+"'<hr>";
			if(key=="bild")
				document.getElementById("log").innerHTML+="<br><img src='"+val+"'> </img><hr>";
		}
	    if(key && val){
	      var kv=new KV(key,val);

	      this.kvs[this.kvs.length]=kv;
	    }
	  }
	}
  };

  this.getKV=function(key){
    for(var n=0;n<this.kvs.length;n++)
      if(this.kvs[n].key==key)
	return this.kvs[n];
    return null;
  };

  this.getValue=function(key,defaultval){
    for(var n=0;n<this.kvs.length;n++)
      if(this.kvs[n].key==key)
	return this.kvs[n].val;
    return defaultval;
  };

  this.setValue=function(key,val){
    for(var n=0;n<this.kvs.length;n++)
      if(this.kvs[n].key==key){
	this.kvs[n].val=val;
	return;
      }
   this.kvs[this.kvs.length]=new KV(key,val);
  };


  this.toString=function(){
    var result="Datapoint\n";
    for(var n=0;n<this.kvs.length;n++)
      result+=this.kvs[n]+"\n";
    return result;
  };

  this.sort=function(){
    this.kvs.sort(function(a,b){
      if(a.key>b.key)
	return 1;
      if(b.key>a.key)
	return -1;
      return 0;
    });
  };

  this.search=function(valstart,keys){
    for(var n=0;n<this.kvs.length;n++)
      if(!keys || keys.indexOf(this.kvs[n].key)>-1)
	//if((isNaN(valstart) && this.kvs[n].val.toLowerCase().indexOf(valstart)>-1) || (!isNaN(valstart) && this.kvs[n].val.toLowerCase().indexOf(valstart)==0)){
	  if(valstart.length==0 || this.kvs[n].val.toLowerCase().indexOf(valstart)==0 || this.kvs[n].val.toLowerCase().indexOf(" "+valstart)!=-1){
// 	alert(this.kvs[n].key);
	  return true;
	  }
    
    return false;
  };
}

function KV(k,v){
  this.key=k;
  this.val=v;
  this.toString=function(){return "'"+this.key+"'='"+this.val+"'";};
}


function syncreq(url) {
  try{	
      var http_request = false;
      try{ http_request = new ActiveXObject("Msxml2.XMLHTTP.3.0"); }catch(e){}
      if(!http_request) try{ http_request = new ActiveXObject("Microsoft.XMLHTTP"); }catch(e){}
      if(!http_request) try{ http_request = new XMLHttpRequest(); }catch(e){}
      if(!http_request){ alert("Giving up :( Cannot create an XMLHTTP instance");return;}
      var mime="text/xml";
      if (http_request.overrideMimeType)
	  http_request.overrideMimeType(mime);
      http_request.open("GET", url+"?rnd="+Math.random(),false);
      http_request.setRequestHeader("Content-Type", mime);
      http_request.send(null);
      var d=http_request.responseText;
      return d;
   }catch(e){alert("Error requesting url "+url+"("+e.message+")");}
};

function trim(str){
 return str.replace(/^\s*/, "").replace(/\s*$/, "");
}

function log(s){
	document.getElementById("log").innerHTML+="<hr>"+s+"<hr>";
}

function stripHTML(s){
	s = s.replace(/&(lt|gt);/g, function (strMatch, p1){
		return (p1 == "lt")? "<" : ">";
	});
 	s = s.replace(/<\/?[^>]+(>|$)/g, "");
	return s;
}

function stripTables(s){
	s = s.replace(/&(lt|gt);/g, function (strMatch, p1){
		return (p1 == "lt")? "<" : ">";
	});
 	s = s.replace(/<td\/?[^>]+(>|$)/g, "");
 	s = s.replace(/<\/td?[^>]+(>|$)/g, "");
	return s;
}

