var tx={}; // tavernoxoros API

tx.refresh_map=function() {}

function is_checkbox(c) {
  return c.nodeType==1/*Node.ELEMENT_NODE*/ && c.tagName=="INPUT" && c.type=="checkbox"
}

function chbxtext_click(s) {
  var c=s.parentNode.firstChild;
  while (c) {
    if (is_checkbox(c)) {
      c.checked=!c.checked;
      if (c.onclick) c.onclick();
    }
    c=c.nextSibling;
  }
}

function checkboxes_checked(x,f) {
  var c=x.firstChild;
  while (c) {
    if (is_checkbox(c))
      c.checked=f(c.checked);
    checkboxes_checked(c,f);
    c=c.nextSibling;
  }
}

function selectall(div_id) {
  checkboxes_checked(document.getElementById(div_id),function(x) {return true});
}

function selectnone(div_id) {
  checkboxes_checked(document.getElementById(div_id),function(x) {return false});
}

function getFirstElementByClass(node,className,tag) {
  if (!tag) tag="*";
  var c=node.getElementsByTagName(tag);
  for (var i=0; i<c.length; i++)
    if (c[i].className==className)
      return c[i];
}

tx.setCookie=function(c_name,value,expiredays) {
  var exdate=new Date();
  exdate.setDate(exdate.getDate()+expiredays);
  document.cookie=c_name+"=" +encodeURIComponent(value)+((expiredays==null) ? "" : ";expires="+exdate.toGMTString());
}

tx.getCookie=function(c_name) {
  if (document.cookie.length) {
    var c_start=document.cookie.indexOf(c_name + "=");
    if (c_start!=-1) {
      c_start=c_start+c_name.length+1;
      var c_end=document.cookie.indexOf(";",c_start);
      if (c_end==-1) c_end=document.cookie.length;
      return decodeURIComponent(document.cookie.substring(c_start,c_end));
    }
  }
  return null;
}

function todayoryesterday(dt) {
  var now=new Date();
  now.setHours(0,0,0,0);
  now.setHours(0,0,0,0);
  var t=new Date();
  t.setTime(dt.getTime());
  t.setHours(0,0,0,0);
  t.setHours(0,0,0,0);
  return Math.floor((now.getTime()-t.getTime())/86400000+0.5);
}

function convert_timestamps(node) {
  var c=node.firstChild;
  while (c) {
    if (c.nodeType==1) {
      if (c.tagName=="SPAN" && c.className=="timestamp") {
        c.className="datetime";
        var dt=new Date();
        dt.setTime(parseInt(c.firstChild.nodeValue)*1000);
        var y=todayoryesterday(dt);
        var d=(y==0) ? "Σήμερα" : (y==1 ? "Χθες" : dt.getDate()+"/"+(dt.getMonth()+1)+"/"+dt.getFullYear());
        var h=dt.getHours();
        var m=dt.getMinutes();
        var t=(h==1 ? " στη " : " στις " )+(h<10 ? "0"+h : h)+":"+(m<10 ? "0"+m : m);
        while (c.firstChild) c.removeChild(c.firstChild);
        c.appendChild(document.createTextNode(d+t));
      }
      else
        convert_timestamps(c);
    }
    c=c.nextSibling;
  }
}

function http_post(url,pdata,callback) {
  var req=new XMLHttpRequest();
  req.onreadystatechange=function() {
    if (req.readyState==4) {
      if (req.aborted_) return; // firefox 2 bug
      callback(req.responseText,req.status);
    }
  }
  req.open("POST",url,true);
  req.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
  req.send(pdata);
  return(req);
}

function busy_div(div,divC) {
  while (div.firstChild) div.removeChild(div.firstChild);
  divC=divC ? divC : div;
  var t=Math.floor((divC.clientHeight-150)/2);
  if (t<0) t=0;
  div.innerHTML='<div style="padding-top:'+t+'px; text-align:center;"><img src="graphics/busy.gif" style="width:150px; height:150px;"/></div>';
}

function get_metadata(node) {
  var metadata={};
  var divs=node.getElementsByTagName("div");
  var h;
  for (var i=0; i<divs.length; i++) {
    if (divs[i].className && divs[i].className=="metadata") {
      var s=divs[i].firstChild.nodeValue;
      try {
        h=eval("({"+s+"})"); // replace eval
      }
      catch(err) {h={json_error:true}};
      for (var x in h) metadata[x]=h[x];
    }
  }
  return metadata;
}

var downloading={};

function abort_download_div(div) {
  if (downloading[div]) {
    downloading[div].aborted_=true; // firefox 2 bug
    downloading[div].abort();
    window.clearTimeout(downloading[div].timeoutID_);
    delete(downloading[div]);
  }
}

function download_div(div,url,vars,post_process,divC) {
  var timeoutID;
  function callback(doc,code) {
    window.clearTimeout(timeoutID);
    delete(downloading[div]);
    var t=document.createElement("div");
    if (code!=200 && code!=400 && code!=404 && code!=500) {
      t.innerHTML=
        '<div id="timeout_page_metadata" class="metadata"></div>'+
        '<div class="metadata">title:&quot;Σφάλμα&quot;</div>'+
        '<div class="tabs_noheader">'+
        '  <div class="tabs">'+
        '    <div class="tabs_page">'+
        '      Παρουσιάστηκε κάποιο πρόβλημα κατά την επεξεργασία του αιτήματος.<br/><br/>'+
        '      <button id="timeout_page_button" type="button">Προσπάθησε ξανά</button>'+
        '    </div>'+
        '  </div>'+
        '</div>';
      var c=t.getElementsByTagName("*");
      for (var i=0; i<c.length; i++)
        if (c[i].id=="timeout_page_metadata") {
          c[i].innerHTML='';
	  c[i].appendChild(document.createTextNode('page:"'+vars.p+'"'));
	}
        else if (c[i].id=="timeout_page_button") {
          c[i].onclick=function() {download_div(div,url,vars,post_process,divC)};
	}
    }
    else {
      t.innerHTML=doc;
    }
    convert_timestamps(t);
    recursive_tabify(t);
    var metadata=get_metadata(t);
    div.innerHTML="";
    div.appendChild(t);
    if (post_process) post_process(t,metadata,code);
  }
  abort_download_div(div);
  busy_div(div,divC);
  var pdata="";
  for (var x in vars) pdata+=x+"="+encodeURIComponent(vars[x])+"&";
  if (pdata.length>0) pdata=pdata.substr(0,pdata.length-1);
  var req=http_post(url,pdata,callback);
  timeoutID=window.setTimeout(function() {abort_download_div(div); callback(null,0)},30000);
  req.timeoutID_=timeoutID;
  downloading[div]=req;
}

function get_params() {
  var p=location.href.substr(location.href.lastIndexOf("#")+1).split("&");
  var params={};
  for (var i in p) {
    var j=p[i].indexOf("=");
    if (j>=0)
      params[p[i].substring(0,j)]=decodeURIComponent(p[i].substring(j+1,p[i].length))
    else
      params[p[i]]=undefined;
  }
  return params;
}
var params=get_params();

function main() {
  if (!GBrowserIsCompatible()) {
    document.body.innerHTML=
      'Η ιστοσελίδα αυτή δεν είναι συμβατή με τον browser σας.<br/>'+
      'Υποστηρίζονται οι παρακάτω εκδόσεις των browser ή νεότερες:'+
      '<ul>'+
      '  <li>Firefox 1.5</li>'+
      '  <li>Internet Explorer 7</li>'+
      '  <li>Safari 3</li>'+
      '  <li>Google Chrome</li>'+
      '  <li>Opera 9</li>'+
      '  <li>Konqueror 3.5</li>'+
      '  <li>οποιοσδήποτε browser βασίζεται στη μηχανή Gecko 1.8</li>'+
      '</ul>'+
      'Προτείνεται η χρήση του <a href="http://www.mozilla.com/firefox/">Firefox</a> 3.<br/><br/>'+
      'Your browser is not compatible with this website.'
    return;
  }
  else if (InternetExplorerL7) {
    document.body.innerHTML=
      'Δυστυχώς, από εδώ και πέρα δεν θα υποστηρίζονται οι παλαιότερες εκδόσεις του Internet Explorer, λόγω του πλήθους των προβλημάτων που παρουσιάζουν.<br/>'+
      'Παρακαλώ αναβαθμίστε στην τελευταία έκδοση ή προτιμότερα εγκαταστήστε τον <a href="http://www.mozilla.com/firefox/">Firefox</a> 3.<br/><br/>'+
      'Υποστηρίζονται οι παρακάτω εκδόσεις των browser ή νεότερες:'+
      '<ul>'+
      '  <li>Firefox 1.5</li>'+
      '  <li>Internet Explorer 7</li>'+
      '  <li>Safari 3</li>'+
      '  <li>Google Chrome</li>'+
      '  <li>Opera 9</li>'+
      '  <li>Konqueror 3.5</li>'+
      '  <li>οποιοσδήποτε browser βασίζεται στη μηχανή Gecko 1.8</li>'+
      '</ul>'+
      'Your browser is not compatible with this website.'
    return;
  }

  debug=function(enable) {
    var tabs_header=getFirstElementByClass(sidebar,"tabs_header","div");
    var d;
    for (var i=0; i<tabs_header.childNodes.length; i++) {
      if (tabs_header.childNodes[i].innerHTML=="debug") {
        d=tabs_header.childNodes[i];
        break;
      }
    }
    if (d) {
      d.id=enable ? "_debug" : "debug";
    }
  }

  var debuglog_div=document.getElementById("debuglog");
  
  tx.debuglog=function() {
    for(var i=0; i<arguments.length; i++) {
      debuglog_div.appendChild(document.createTextNode(arguments[i]));
      debuglog_div.appendChild(document.createElement("br"));
    }
  }

  if (document.createElement("canvas").getContext) {
    tx.debuglog("canvas: using canvas element");
    var Canvas=function(parent,width,height) {
      if (!parent.renderingContext) {
        var canvas=document.createElement("canvas");
        parent.appendChild(canvas);
        parent.renderingContext=canvas.getContext("2d");
        canvas.width=width;
        canvas.height=height;
      }
      this.drawImage=function(x,y,img) {
        parent.renderingContext.drawImage(img,x,y);
      }
      this.finalize=function() {
      }
    }
    var max_block_size=2000;
  }
  else {
    tx.debuglog("canvas: using images");
    var Canvas=function(parent,width,height) {
      var div=document.createElement("div");
      var html="";
      this.drawImage=function(x,y,img) {
        html+='<img src="'+img.src+'" style="position:absolute; left:'+x+'px; top:'+y+'px;" />';
      }
      this.finalize=function() {
        div.innerHTML=html;
        parent.appendChild(div);
      }
    }
    var max_block_size=40;
  }

  var marker_radius=4;
  var map;
  var marker_pixels=[];
  var selected_points=[];
  var points=[];
  var pointsById={};
  var categories=[];

  var mainpane=document.getElementById("mainpane");
  var sidebar=document.getElementById("sidebar");
  var infobox=document.getElementById("infobox");
  var infoboxt=document.getElementById("infoboxt");
  var infoboxc=document.getElementById("infoboxc");
  var permalink=document.getElementById("permalink");
  var show_on_map=document.getElementById("show_on_map");
  var tooltip=document.getElementById("tooltip");
  var working=document.getElementById("working");
  var infobox_metadata=document.getElementById("infobox_metadata");
  var categories_form=document.getElementById("categories");
  var namesonly=document.getElementById("namesonly");
  var usecategories=document.getElementById("usecategories");
  var filters={
    h24:document.getElementById("cbf_24"),
    out:document.getElementById("cbf_out"),
    del:document.getElementById("cbf_del"),
    music:document.getElementById("cbf_music"),
    chain:document.getElementById("cbf_chain"),
    amea:document.getElementById("cbf_amea"),
    dead:document.getElementById("cbf_dead")
  }
  var searchbox=document.getElementById("searchbox");
  var searchresults=document.getElementById("searchresults");

  var max_hist=10;
  var infobox_browser_history_current;
  var infobox_browser_history_back=[];
  var infobox_browser_history_forward=[];

  var markers=[
    [document.getElementById("marker_selected")],
    [document.getElementById("marker_regular_a"),document.getElementById("marker_regular")]
  ];

  var buttons={l:document.getElementById("button_l"),r:document.getElementById("button_r"),x:document.getElementById("button_x")};

  function window_resize() {
    tx.refresh_map();
    if (InternetExplorer) {
      infobox.style.left="";
      var w=mainpane.offsetWidth-parseInt(infobox.currentStyle.left)-parseInt(infobox.currentStyle.right);
      if (w>parseInt(infobox.currentStyle.maxWidth))
        infobox.style.left=Math.floor((mainpane.offsetWidth-parseInt(infobox.currentStyle.maxWidth))/2)+"px";
      infobox.style.top="";
      var h=mainpane.offsetWidth-parseInt(infobox.currentStyle.top)-parseInt(infobox.currentStyle.bottom);
      if (h>parseInt(infobox.currentStyle.maxHeight))
        infobox.style.top=Math.floor((mainpane.offsetHeight-parseInt(infobox.currentStyle.maxHeight))/2)+"px";
    }
  }

  function get_cat_mask() {
    var cat_mask=0;
    for (var i=0; i<categories.length; i++)
      if (categories[i].checkbox.checked)
        cat_mask^=1<<(categories[i].id-1);
    return cat_mask;
  }

  function infobox_browse(page) {
    function process_metadata(metadata) {
      infoboxt.innerHTML="";
      infoboxt.appendChild(document.createTextNode(metadata.title));
      infobox_metadata.innerHTML="";
      for (var x in metadata) {
        infobox_metadata.appendChild(document.createTextNode(x+": "+metadata[x]));
        infobox_metadata.appendChild(document.createElement("br"));
      }
      if (metadata.page) {
        permalink.href="?p="+metadata.page;
        permalink.style.display="inline";
      }
      else
        permalink.style.display="none";
      if (metadata.latlon && metadata.latlon.length==2) {
        show_on_map.onclick=function() {tx.show_on_map(metadata.latlon); return false};
        show_on_map.style.display="inline";
      }
      else
        show_on_map.style.display="none";
      infobox.className=infobox.className.replace("loading","_loading");
    }
    function hpush(h,x) {
      if (x) {
        h.push(x);
        if (h.length>max_hist) h.splice(0,h.length-max_hist);
      }
    }
    function check_browser_history() {
      buttons.l.disable_(infobox_browser_history_back.length==0);
      buttons.r.disable_(infobox_browser_history_forward.length==0);
    }
    tx.show_on_map();
    if (typeof(page)=="string") {
      infobox_browser_history_forward=[];
      if (infobox_browser_history_current) {
        hpush(infobox_browser_history_back,infobox_browser_history_current);
	infobox_browser_history_current=null;
      }
      check_browser_history();
      infobox.style.display="block";
      infoboxt.innerHTML="";
      infoboxt.appendChild(document.createTextNode("Έφτασε!"));
      infobox.className=infobox.className.replace("_loading","loading");
      download_div(infoboxc,"action",{m:'infobox',p:page},function(div,metadata,code) {
        process_metadata(metadata);
	infobox_browser_history_current=div;
        check_browser_history();
      })
    }
    else {
      if (page<0 && infobox_browser_history_back.length>0) {
        abort_download_div(infoboxc);
        if (infobox_browser_history_current)
	  hpush(infobox_browser_history_forward,infobox_browser_history_current);
        var t=infobox_browser_history_back.pop();
      }
      else if (page>0 && infobox_browser_history_forward.length>0) {
        abort_download_div(infoboxc);
        if (infobox_browser_history_current)
	  hpush(infobox_browser_history_back,infobox_browser_history_current);
        var t=infobox_browser_history_forward.pop();
      }
      if (t) {
        while (infoboxc.firstChild) infoboxc.removeChild(infoboxc.firstChild);
        infoboxc.appendChild(t);
        process_metadata(get_metadata(t));
	infobox_browser_history_current=t;
      }
      check_browser_history();
    }
  }

  function infobox_close() {
    abort_download_div(infoboxc);
    infobox.style.display="none";
    tx.show_on_map();
  }

  var points_overlay={
    counter: 0,
    refresh: function() {
      working.style.visibility="visible";
      if (this.hasOwnProperty("curr_point")) {
        window.clearTimeout(this.timeoutID);
        this.new_canvas.innerHTML="";
        map.removeOverlay(this.new_overlay);
      };
      if (map.getZoom()!=this.zoom && this.hasOwnProperty("overlay")) {
        this.canvas.innerHTML="";
        map.removeOverlay(this.overlay);
        delete this.overlay;
      };
      this.zoom=map.getZoom();
      this.counter++;
      var map_size=map.getSize();
      this.width=map_size.width;
      this.height=map_size.height;
      this.bounds=map.getBounds();
      this.pixels={};
      var cat_mask=get_cat_mask();
      var flags_min=0;
      var flags_max=0xffff;
      if (filters.h24.checked) flags_min|=2;
      if (filters.out.checked) flags_min|=4;
      if (filters.del.checked) flags_min|=16;
      if (filters.music.checked) flags_min|=32;
      if (filters.chain.checked) flags_max^=8;
      if (filters.amea.checked) flags_min|=64;
      if (filters.dead.checked) {flags_min|=1} else flags_max^=1;
      for (var i=0; i<points.length; i++) {
        if (this.bounds.containsLatLng(points[i].latlon) && (points[i].categories & cat_mask)!=0 &&
            (points[i].flags & flags_min)==flags_min && (points[i].flags | flags_max)==flags_max) {
          var p=map.fromLatLngToContainerPixel(points[i].latlon);
          points[i].x=p.x;
          points[i].y=p.y;
          if (undefined==this.pixels[[p.x,p.y]])
            this.pixels[[p.x,p.y]]=[i]
          else
            this.pixels[[p.x,p.y]].push(i);
        }
        else {
          delete points[i].x;
        }
      }
      //document.title=map.fromContainerPixelToLatLng(new GPoint(-this.width,2*this.height))+"\n"+
      //               map.fromContainerPixelToLatLng(new GPoint(2*this.width,-this.height));
      this.new_overlay=new ELabel(this.bounds.getSouthWest(),
                                  '<div id="canvas'+this.counter+'" style="width:'+this.width+'px; height:'+this.height+'px;"/>');
      map.addOverlay(this.new_overlay);
      this.new_overlay.hide();
      this.new_canvas=document.getElementById("canvas"+this.counter);
      this.curr_point=0;
      this.timeoutID=window.setTimeout(function() {points_overlay.draw_some_points()},1);
    },
    draw_some_points: function() {
      if (this.curr_point<points.length) {
        var block=new Canvas(this.new_canvas,this.width,this.height);
        var m=max_block_size;
        while (m && this.curr_point<points.length) {
          if (undefined!=points[this.curr_point].x) {
            var x=points[this.curr_point].x;
            var y=points[this.curr_point].y;
            var ps=this.pixels[[x,y]];
            if (ps && ps[0]==this.curr_point) {
              var g=points[ps[0]].marker;
              var e=points[ps[0]].exact;
              for (var i in ps) {
                g=Math.max(g,points[ps[i]].marker);
                e=Math.max(e,points[ps[i]].exact);
              }
              block.drawImage(x-marker_radius,y-marker_radius,markers[g][e]);
              m--;
            }
          }
          this.curr_point++;
        }
        block.finalize();
        this.timeoutID=window.setTimeout(function() {points_overlay.draw_some_points()},1);
      }
      else if (this.curr_point!=undefined) {
        var block=new Canvas(this.new_canvas,this.width,this.height);
        for (var t in selected_points) {
          var p=map.fromLatLngToContainerPixel(selected_points[t]);
          block.drawImage(p.x-11,p.y-11,markers[0][0]);
        }
        block.finalize();
        delete this.curr_point;
        this.timeoutID=window.setTimeout(function() {points_overlay.draw_some_points()},1);
      }
      else {
        this.new_overlay.show();
        if (this.hasOwnProperty('overlay')) {
          this.canvas.innerHTML="";
          map.removeOverlay(this.overlay);
        };
        this.overlay=this.new_overlay;
        this.canvas=this.new_canvas;
        working.style.visibility="hidden";
      }
    }
  }
  tx.refresh_map=function() {points_overlay.refresh()}

  function taverns_from_pixel(latlon,max) {
    var result=[];
    if (latlon) {
      var p=map.fromLatLngToContainerPixel(latlon);
      for (var i=0; i<marker_pixels.length; i++) {
        var q=points_overlay.pixels[[p.x+marker_pixels[i].x,p.y+marker_pixels[i].y]];
        if (q) for (var j=0; j<q.length; j++) {
          if (result.length==max) {
            result.more=true;
            return result;
          }
          result.push(points[q[j]].id);
        }
      }
    }
    return result;
  }

var last_latlon;
  function map_mousemove(latlon) {
last_latlon=latlon;
    var taverns=taverns_from_pixel(latlon,10);
    if (taverns.length) {
      var x=0;
      var y=0;
      var div=document.createElement("div");
      for (var i=0; i<taverns.length; i++) {
        var q=points[pointsById[taverns[i]]];
        div.appendChild(document.createTextNode(q.tname));
        div.appendChild(document.createElement("br"));
        x+=q.x;
        y+=q.y;
      }
      if (taverns.more) {
        div.appendChild(document.createElement("br"));
        div.appendChild(document.createTextNode("...και μερικά ακόμα!"));
      }
      while (tooltip.firstChild) tooltip.removeChild(tooltip.firstChild);
      tooltip.appendChild(div);
      x/=taverns.length;
      y/=taverns.length;
      var p=map.fromLatLngToDivPixel(map.fromContainerPixelToLatLng(new GPoint(x,y)));
      var pos=new GControlPosition(G_ANCHOR_TOP_LEFT,new GSize(p.x,p.y+22)); 
      pos.apply(tooltip);
      tooltip.style.visibility="visible";
    }
    else
      tooltip.style.visibility="hidden";
  }

  function map_click(overlay,latlon) {
    var taverns=taverns_from_pixel(latlon,20);
    if (taverns.length==0)
      infobox_close()
    else if (taverns.length==1)
      infobox_browse("t"+taverns[0])
    else {
      var p="y"+taverns.join(",");
      if (taverns.more) p+="m";
      infobox_browse(p);
    }
  }

  tx.validate_debug=function(vars) {
    tx.debuglog("Form variables:");
    for (var x in vars) tx.debuglog(x+"="+vars[x]);
    return false;
  }

  tx.validate_user_comment=function(vars) {
    if (!vars.comment || !vars.comment.length) {
      alert("Το σχόλιο δεν πρέπει να είναι κενό");
      return false;
    }
    if (vars.comment.length>4096) {
      alert("Το σχόλιο δεν πρέπει να υπερβαίνει τους 4096 χαρακτήρες");
      return false;
    }
    tx.setCookie("uc_name",vars.author,300);
    tx.setCookie("uc_email",vars.email,300);
    return true;
  }

  tx.submit_form=function(node,mode,vars,validator) {
    var form=node;
    while (form && (form.nodeType!=1 || form.tagName!="FORM")) form=form.parentNode;
    while (node && node.className!="tabs_body") node=node.parentNode;
    if (!node) return;
    if (!vars) vars={};
    if (form) {
      var c=form.getElementsByTagName("*");
      for (var i=0; i<c.length; i++) if (c[i].name) vars[c[i].name]=c[i].value;
    }
    if (validator && !validator(vars)) return;
    vars.m=mode;
    download_div(node.firstChild,'action',vars,null,node.parentNode);
  }

  function add_checkbox(categories_form,tag) {
    var div=document.createElement("div");
    div.className="checkbox";
    categories_form.appendChild(div);
    var checkbox=document.createElement("input");
    checkbox.type="checkbox";
    div.appendChild(checkbox);
    checkbox.checked=true;
    checkbox.onclick=tx.refresh_map;
    var span=document.createElement("span");
    span.onclick=function (){chbxtext_click(span)};
    span.appendChild(document.createTextNode(tag));
    div.appendChild(span);
    return checkbox;
  }

  function process_downloaded_data(doc,code) {
    if (code!=200) return; //
    var data=doc.split("\n\n");
    var cats=data[0].split("\n");
    for (var i=0; i<cats.length; i++) {
      var fields=cats[i].split("|");
      if (fields.length!=2) continue;
      var id=parseInt(fields[0]);
      var tag=fields[1];
      var checkbox=add_checkbox(categories_form,tag);
      categories.push({id:id,tag:tag,checkbox:checkbox});
    }
    var taverns=(data[1] ? data[1] : "").split("\n");
    for (var i=0; i<taverns.length; i++) {
      var fields=taverns[i].split("|");
      if (fields.length!=7) continue;
      var p={
        id:parseInt(fields[0]),
        tname:fields[1],
        latlon:new GLatLng(parseFloat(fields[2]),parseFloat(fields[3])),
        exact:parseInt(fields[4]),
        categories:parseInt(fields[5]),
        flags:parseInt(fields[6])
      }
      p.marker=1;
      points.push(p);
    }
    for (var i=0; i<points.length; i++)
      pointsById[points[i].id]=i;
    if (params.p)
      infobox_browse(params.p)
    else if (!tx.getCookie("welcome"))
      infobox_browse("u/welcome");
    window_resize();
    var splash=document.getElementById("splash");
    splash.parentNode.removeChild(splash);
  }

  function initinize () {
    http_post("action","m=points",process_downloaded_data);
    for (var y=-marker_radius; y<=marker_radius; y++)
      for (var x=-marker_radius; x<=marker_radius; x++)
        if (x*x+y*y<=marker_radius*marker_radius)
          marker_pixels.push({x:x, y:y});

    tx.debuglog("Google Maps API version: "+G_API_VERSION);
    map=new GMap2(document.getElementById("map"),{draggableCursor:"default",draggingCursor:"default"});
    map.addMapType(G_PHYSICAL_MAP);
    mt=map.getMapTypes();
    for (var i=0; i<mt.length; i++)
      mt[i].getMinimumResolution=function() {return Math.floor(Math.log(screen.width)/Math.LN2)-7;}
    map.addControl(new GLargeMapControl3D());
    map.addControl(new GMapTypeControl());
    map.addControl(new GScaleControl());
    map.setCenter(new GLatLng(40.62,22.92),12,G_NORMAL_MAP);
    map.enableScrollWheelZoom();
    map.enableContinuousZoom();
    new GKeyboardHandler(map);

    map.getPane(G_MAP_MARKER_MOUSE_TARGET_PANE).appendChild(tooltip);
    var container=map.getContainer();
    var pos=new GControlPosition(G_ANCHOR_BOTTOM_LEFT,new GSize(200,5));
    pos.apply(working);
    container.appendChild(working);
    var souvlakiL=document.getElementById("souvlakiL");
    var pos=new GControlPosition(G_ANCHOR_TOP_RIGHT,new GSize(0,47));
    pos.apply(souvlakiL);
    container.appendChild(souvlakiL);

    window.onresize=window_resize;
    GEvent.addListener(map,"moveend",function() {tx.refresh_map()});
    GEvent.addListener(map,"mousemove",map_mousemove);
    GEvent.addListener(map,"mouseout",function() {map_mousemove(null)});
    GEvent.addListener(map,"click",map_click);
    infobox.onmouseover=function() {map_mousemove(null)};
    if (navigator && navigator.product=="Gecko" && (/linux/i).test(navigator.platform)) // google maps api bug under Linux/Gecko
      infobox.addEventListener("DOMMouseScroll", function(e){e.stopPropagation()},true);

    function set_button_img(i,t) {
      var img=buttons[i];
      if (img.disabled_) return;
      img.src="graphics/buttons/"+i+t+".png";
    }
    for (var x in buttons) 
      (function (x){
        buttons[x].onmouseout=function() {set_button_img(x,"")};
        buttons[x].onmouseover=function() {set_button_img(x,"o")};
        buttons[x].disable_=function(f) { buttons[x].disabled_=false; set_button_img(x,f ? "d" : ""); buttons[x].disabled_=f;}
      })(x);
    buttons.l.disable_(true);
    buttons.r.disable_(true);

    var resultsininfobox=document.getElementById("resultsininfobox");
    document.getElementById("searchform").onsubmit=function() {tx.perform_search(searchbox.value,0); return false};

    for (c in filters) filters[c].checked=false;

    recursive_tabify(sidebar);
    var t=document.createElement("div");
    t.innerHTML='<div class="tabs"><div class="tabs_page" title="|"></div></div>';
    recursive_tabify(t);
    infoboxc.appendChild(t);
    var ibh=document.getElementById("infoboxh").offsetHeight;
    var ibs=document.getElementById("infoboxs").offsetHeight;
    var ith=getFirstElementByClass(t,"tabs_selected","span").offsetHeight;
    var gah=document.getElementById("google_ad").offsetHeight;
    var sth=getFirstElementByClass(sidebar,"tabs_selected","span").offsetHeight;
    infobox.style.display="none";
    var css="#infobox #infoboxc {top:"+ibh+"px; bottom:"+ibs+"px;}\n"+
            "#infobox div.tabs_live .tabs_bodyc {top:"+ith+"px;}\n"+
            "#infobox.shaded {height:"+(ibh+ibs)+"px;}\n"+
            "#sidebar div.tabs_live {bottom:"+gah+"px;}\n"+
            "#sidebar div.tabs_live .tabs_bodyc {top:"+sth+"px;}";
    var style=document.createElement("style");
    style.type="text/css";
    if (!InternetExplorer)
      style.appendChild(document.createTextNode(css))
    else
      style.styleSheet.cssText=css;
    document.getElementsByTagName("head")[0].appendChild(style);
    debug(params.debug);
  }

  initinize ();

  // If you are reading this you have no life

  tx.infobox_browse=function(page) {
    infobox_browse(page);
  }

  tx.browse=tx.infobox_browse; //deprecated

  tx.infobox_browse_back=function() {
    infobox_browse(-1);
  }

  tx.infobox_browse_forward=function() {
    infobox_browse(1);
  }

  tx.infobox_close=function() {
    infobox_close()
  }

  tx.perform_search=function(q,offset) {
    download_div(searchresults,"action",{m:'search',q:q,offset:offset});
  }

  tx.show_on_map=function() {
    if (arguments.length) {
      selected_points.length=0;
      for(var i=0; i<arguments.length; i++)
        selected_points.push(new GLatLng(arguments[i][0],arguments[i][1]));
      infobox.className=infobox.className.replace("_shaded","shaded");
      tx.refresh_map();
      if (map.getZoom()==17)
        map.panTo(selected_points[0])
      else
        map.setCenter(selected_points[0],17);
    }
    else if (selected_points.length) {
      selected_points.length=0;
      infobox.className=infobox.className.replace("shaded","_shaded");
      tx.refresh_map();
    }
  }

  tx.enable_osm=function(button) {
    if (button) button.disabled=true;
    var osmAttribution='Δεδομένα χάρτη <a href="http://www.openstreetmap.org/" target="_blank">OpenStreetMap</a>';
    var osmCopyrights=new GCopyrightCollection("");
    osmCopyrights.addCopyright(new GCopyright("osm",new GLatLngBounds(new GLatLng(-90,-180),new GLatLng(90,180)),0,osmAttribution));
    var osmTileLayer=new GTileLayer(osmCopyrights,0,18,{isPng:true,opacity:1})
    osmTileLayer.getTileUrl=function(tile,zoom) {
      return "http://"+"abc"[Math.floor(Math.random()*3)]+".tile.openstreetmap.org/"+zoom+"/"+tile.x+"/"+tile.y+".png";
    };
    tx.OSM_MAP=new GMapType([osmTileLayer],G_SATELLITE_MAP.getProjection(),"OSM");
    map.addMapType(tx.OSM_MAP);
  }
}

