/********************************
google map
********************************/

  /* globals */
  var latMax=0.0;
  var latMin=0.0;
  var lngMax=0.0;
  var lngMin=0.0;
  var currentLat=0.0;
  var currentLng=0.0;
  var lats=new Array();
  var lngs=new Array();
  var orts=new Array();
  var dates=new Array();
  var preises=new Array();
  var typies = new Array(); /*angebot type in Englisch*/
  var links = new Array();
  var markers=new Array();
  var providers = new Array(); /*providers*/
  var map=null; /*gmap2*/
  var mapid="map";
  var mapdebug=true;
  var tableId=""; //active data tables ID
  var tableIds = new Array();
      tableIds.push("space_search_result_data");//only these tables allow to use gmap
      tableIds.push("airport-transfer-results");

  var zoomFactor=10; //default zoom factor
  var isInTableView = false; //true for table view, false for detals view

  var iconMap 		= "/gfx/maps/raumobil_maps_alt_inaktiv.png";
  var iconMapHigh	= "/gfx/maps/raumobil_maps_alt_aktiv.png";
  var iconPlane 	= "/gfx/maps/b_maps_flughafen_inaktiv.png";//flughafen icon
  var iconEvent		= "/gfx/maps/b_maps_event_inaktiv.png";
  var iconEventHigh	= "/gfx/maps/b_maps_event_aktiv.png";
  var iconPark		= "/gfx/maps/b_maps_parkplatz_inaktiv.png";
  var iconParkHigh	= "/gfx/maps/b_maps_parkplatz_aktiv.png";
  var iconLiving	= "/gfx/maps/b_maps_wohnung_inaktiv.png";
  var iconLivingHigh= "/gfx/maps/b_maps_wohnung_aktiv.png";
  var iconWork 		= "/gfx/maps/maps_arbeitsraum_inaktiv.png";
  var iconWorkHigh  = "/gfx/maps/maps_arbeitsraum_aktiv.png";
  var iconStorage 	= "/gfx/maps/maps_lagerraum_inaktiv.png";
  var iconStorageHigh="/gfx/maps/maps_lagerraum_aktiv.png";


  var icons	= new Array(); 	//array store icon url on map
  var iconsHigh = new Array();//stoe icon url on map while mouerover
  var iconsText = new Array();


  var jobAfterStart=new Array();//save all call backfuntion name after load

  var latCenter = 0.0; //center all date in result table.
  var lngCenter = 0.0;
  var maxRecordsNumNoScrollbar = 10; //how many max records without a scrollbar
  var wideTableWidth = "670px"; //table width in style, if show scroll bar
  var wideTableHight = "250px";



  /* This function will be called an end of loadgmap(). It checkes AfterStartingTask for Job to do.
  */
  function doJobAfterStart(){
    var i=0;
  for(i=0; i<jobAfterStart.length; i++){
    var f=jobAfterStart[i];
    /*http://forum.de.selfhtml.org/archiv/2006/4/t127798/*/
    if(typeof window[f]=='function'){ window[f]();}
  }
  }

  function addJobAfterStart( jobName ){
    jobAfterStart.push(jobName);
    return false;
  }

  /* Search in DOM for table in tableIds.
  */
  function setTableId(){
    var i=0;
    var tid = null;
    for(i=0; i<tableIds.length; i++){
      tid=$(tableIds[i]);
      if(tid){
        //if found, save the table id
        tableId=tableIds[i];
      }
    }
    if(tableId==""){
      /*alert("Can not find any data table.");*/
      /*maybe in details ansicht*/
      isInTableView = false;
    }
    else{
      isInTableView = true;
    }
    return false;
  }

  /* with this function you can define your own icon
  */
  function setIconMap(iconUrl){
    iconMap = iconUrl ;
  }

  /* define your own own highlight icon
  */
  function seticonMapHigh(iconUrl){
    iconMapHigh = iconUrl;
  }

   /* Return a GlagLng Array
    */
    function setCityArray(){
      if( isInTableView ){
        setCityArrayFromTable($(tableId)); //init cities with table results
        isInTableView=true;
      }
      else{
        setCityArrayInDetail();
        isInTableView = false;
      }
     }

     function setCityArrayFromTable(){
         var t=document.getElementById(tableId); //try to get result table
         var tbody=t.tBodies[0];
         var r=tbody.rows.length; /*get tbody line nummer*/

          lats = new Array(); //init
          lngs = new Array();
          preises = new Array();
          typies = new Array();
          links = new Array();
          orts = new Array();
          dates = new Array();
          providers = new Array();
          icons	= new Array(); //icons
          iconsHigh = new Array();
          iconsText = new Array();

        for(n=0; n<r; n++){
            var tr=tbody.rows[n];
            var lat  = getVFromTr(tr,0);
            var lng  = getVFromTr(tr,1);
            var preis= getVFromTr(tr,2);
            var type = getVFromTr(tr,3);
            var link = getLink(tr);
            var ort = getVFromTr(tr,4);
            var date= getVFromTr(tr,5);
            var provider=getVFromTr(tr, 6);
            var iconImg = getIconImageUrlFromTr(tr, 7); // 8 is mouseover text


            //points.push(new GLatLng(lat, lng));
            if(lat==""){lat=0.0;}
            if(lng==""){lng=0.0;}
            lats.push(parseFloat(lat));
            lngs.push(parseFloat(lng));

            preises.push(preis);
            typies.push(type);
            links.push(link);
            orts.push(ort);
            dates.push(date);
            providers.push(provider);
            icons.push(iconImg.inactive);
            iconsHigh.push(iconImg.active);
            iconsText.push(iconImg.text);
        }
        //return points;
        return true;
     }

     function setCityArrayInDetail(){
    var dlats=document.getElementsByName("space_loaction_lat");
    var dlngs=document.getElementsByName("space_loaction_lng");
        //alert(dlats[0].value+", "+dlngs[0].value);
      if(dlats.length!=dlngs.length){
        //alert("Anzahl der lat und lng nicht match.");
        return false;
      }
    else{

      lats.push(parseFloat(dlats[0].value));
      lngs.push(parseFloat(dlngs[0].value));

      //alert(lats[0]+", "+lngs[0]);

      preises.push(0);
      typies.push(0);
      links.push(0);
      orts.push(0);
      dates.push(0);
      providers.push(0);

      zoomFactor = 12; //reset zoom Factor while in detail view
      return true;
    }
     }

     function getLink(trobj){
       var link=trobj.cells[trobj.cells.length-2].getElementsByTagName('a')[0].href;
       return link;
     }

     /*
       1.parm: tr object
       2.type. 0,the first input, 1. the second input
     */
     function getVFromTr(tr, index){
       var lastTd=tr.cells[tr.cells.length-1];
       var value = lastTd.getElementsByTagName("input")[index].value;
       return value;
     }



  /*
  serch the lats and lngs, return a center point
  Return: GPoint
  */
  function getCenter(){
    /*if only one coordinate in map*/
    if(lngs.length==1 && lats.length==1){
      return (new GLatLng(parseFloat(lats[0]),parseFloat(lngs[0])));
    }

    latMin = 99; latMax = 0.0;
    lngMin = 99; lngMax = 0.0;
     for(var i=0; i<lngs.length-1; i++){
       //alert("lats["+i+"]="+lats[i]+", lngs["+i+"]="+lngs[i]);
       if(lats[i]>0 && lngs[i]>0){
         latMin = Math.min(latMin, lats[i]);	latMax = Math.max(latMax, lats[i]);
         lngMin = Math.min(lngMin, lngs[i]);	lngMax = Math.max(lngMax, lngs[i]);
       }
     }
     //alert("latMin:"+latMin+", latMax="+latMax+", lngMin="+lngMin+", lngMax="+lngMax);
     latCenter= (parseFloat(latMin)+parseFloat(latMax))/2;
     lngCenter= (parseFloat(lngMin)+parseFloat(lngMax))/2;
     return (new GLatLng(latCenter,lngCenter));
  }

  function createMap(){
      map   = new GMap2(document.getElementById(mapid));
        map.addControl(new GLargeMapControl()); //pan and zoom
        map.addControl(new GMapTypeControl());
        map.addControl(new GScaleControl()); //Massstab
        map.enableContinuousZoom();
        map.enableDoubleClickZoom();
    return true;
  }


  /*
   loadgmap erst nach wartezeit aufrufen!
  */
  function loadgmap() {
        window.setTimeout("wrappedloadgmap()", 1000);
        //wrappedloadgmap();
  }

  /*
   main function
  */
  function wrappedloadgmap() {
    //alert("loadgmap was called.");
    createMap();
    setTableId();//if use table as data source
        //var points=getCityList();
        setCityArray();
    var l=lats;
    var g=lngs;
    var foundPoints=false;
    for(var i=0; i<l.length;i++){
      if(l[i]>0){
        //alert("found points at "+i);
        foundPoints=true;
        i=l.length;
      }
    }
        if(!foundPoints){
          //alert("No points was found. ");
          switchToTable();
          hideMap(mapid);
          hideSwitchButton();
          return false;
        }
        else{
          //alert("points found! Show map.");
          switchToMap(); /*resize the table*/
        }


        map.setCenter(getCenter(), zoomFactor);


        var raumicon = new GIcon();
        raumicon.image = iconMap; //default map icon
        raumicon.iconSize = new GSize(24, 24);
        raumicon.iconAnchor = new GPoint(0,24);
        raumicon.infoWindowAnchor = new GPoint(0,24);/*wichitg for info window*/


        markers = new Array(); //init markers
        for(var i=0; i<l.length; i++){
          var m = null;
          if(l[i]>0 && g[i]>0){
            if(isInTableView){
               raumicon.image = icons[i]; //dynmic icons
            }
            m = new GMarker( new GLatLng(l[i], g[i]) , {icon: raumicon, title: iconsText[i]});
            var parm= new Array();
            if(isInTableView){/*show info window only in table view */
              parm.push(m); //1. marker
              parm.push(i); //2. index
              GEvent.addListener( m, "click", 		createItemHandler(this, "addInforwindow", parm) );
              GEvent.addListener( m, "mouseover", 	createItemHandler(this, "iconOnMouseOver", parm ));
              GEvent.addListener( m, "mouseout", 	createItemHandler(this, "iconOnMouseOut",  parm));
            }
            map.addOverlay(m);
          }
          else{
            m=false;
          }
          markers.push(m);
        }
       //alert( markers.length + " markers were added.");

        doJobAfterStart();
        return true;
    }

  function hideTable(tab){
    return true;
  }


    function hideMap(mapid){
       //alert("GMap2 will be cleaned.")
         map=null;
         map=false;
         //alert("now map is "+map);

     // alert("map will be hided");

      $("gmapdiv").style['display']='none';
     // alert($("gmapdiv"));


      return true;
    }


    function showMap(mapid){
      $("gmapdiv").style['display']='block';
      if(!map){
        //alert("showmap(): can not find map object ("+map+")! call loadmap()");
        loadgmap();
      }
      return true;
    }

    /* add a info window auf marker
     * parm[0] = obj marker
     * parm[1] = index in table
    */
    function addInforwindow(parm){
      var marker=parm[0];
      var index=parm[1];
      if(typeof (parm[0])!="object"){ alert("showinfo(): input must be a object.");  return false;}
      marker.openInfoWindowHtml(getRaumInfoByTrIndex(index));
      return true;
    }

    function iconOnMouseOver(parm){
      parm[0].setImage(iconsHigh[parm[1]]);
      return false;
    }

    function iconOnMouseOut(parm){
      parm[0].setImage(icons[parm[1]]);
      return false;
    }


    /*
     *	Retrun: string html code
    */
    function getRaumInfoByTrIndex( index){
      var _str = "";
      _str += "<div>";
      if(typies[index]!=0) 	{_str += "<p>Art: "+typies[index]+"<br />";}
      if(preises[index]!=0)	{_str += "Preis: "+preises[index]+"<br />";}
      if(orts[index]!=0)	{_str += "Ort: "+orts[index]+"<br />";}
      if(dates[index]!=0)	{_str += "ab: "+dates[index]+"<br />";}
      if(providers[index]!=0){ _str += "Anbieter: "+providers[index]+"<br />";}
      _str += "<div style='text-align:right;'><a href='"+links[index]+"'>Details</a></div>";
      _str += "</p>";
      return _str;
    }

    /* event when mouse over map icon in result table
    * parm: link object
    * Return true/false:
    */
    function overmap(linkObj){
      var tr=linkObj.parentNode.parentNode;
      var index=tr.sectionRowIndex;
      var lat=parseFloat(lats[index]);
      var lng=parseFloat(lngs[index]) ;
      flyTo( lat, lng);

      var m=markers[index]; //get the maker copy
      map.removeOverlay(markers[index]); //new!remove the original marker
      map.addOverlay(m); //new!add the copy on map, so make it on top.
      var imgUrl = iconsHigh[index];
      m.setImage(imgUrl);// set maker highlight
      return true;
    }

    function outmap(linkObj){
      var tr=linkObj.parentNode.parentNode;//
      var index=tr.sectionRowIndex;
      var m=markers[index];
      var imgUrl = icons[index];
      //m.setImage(iconMap); //not iconmap original icon
      m.setImage(imgUrl);
      return true;
    }

    function flyTo(lat, lng){
      //alert("Fly to :"+lat+", "+lng);
      if(!map){ createMap();}
      currentLat=lat;
      currentLng=lng;
      /* show lat and lng value in text feld
      document.getElementById("currentLat").value=currentLat;
      document.getElementById("currentLng").value=currentLng;
      */
      var newPoint = new GLatLng(lat, lng);
      var currentPoint = map.getCenter();
      map.panTo(newPoint);
      return true;
    }

    function ShowInfOnMap(linkObj){
      var tr=linkObj.parentNode.parentNode;
      var index=tr.sectionRowIndex;
      var parm = new Array();
      var m=markers[index];
      parm.push(m);
      parm.push(index);
      addInforwindow(parm);
      return true;
    }

    function hideInfoMap(){
      return true;
    }

    /*
     * switch table view and gmap+table view
     * a cookie will be setted to save the user choice.
    */
    function viewSwitch(){
      if(map){
        switchToTable(); //map aus
        switchText(0);
        document.cookie = "showmap="+false+";";        //set cookie showmap=false
      }
      else{
        switchToMap(); // map ein
        switchText(1);
        document.cookie = "showmap="+true+";";         //set cookie showmap=true
      }
      return true;
    }

    function switchToTable(){
      //alert("swtich to table view!");
        hideMap(mapid);
      var t=document.getElementById(tableId);
      if(!t){
       // alert("can not find daten table.");
          /*maybe in detail View*/
          return false;
      }
      t.parentNode.style['height'] = "auto";
      /*t.parentNode.style['overflow'] = "hidden";*/
      t.style["width"] = wideTableWidth; //to default table width
      var geotds=document.getElementsByName("mapbtn");
      for(var i=0; i<geotds.length; i++){
          geotds[i].style["display"]="none";//hide map icon in table
       }
        return true;
    }

    /* shwo map view (table+map). and check if a scrollbar needed.
    * if needed, reset the table style.fload
    */
    function switchToMap(){
      showMap(mapid);
      var t=document.getElementById(tableId);
      if(!t){
        /*maybe in detail View*/
        return false;
      }
    /*if recores is too less, do not show scroolbar*/
    if(t.tBodies[0].rows.length > maxRecordsNumNoScrollbar){
      //alert("records rows max value reached.");
      t.parentNode.style['height'] = wideTableHight; //div container
      t.parentNode.style['overflow'] = "auto";
      t.style["width"] = wideTableWidth; //table self
    }
    else{
      t.parentNode.style['height'] = "auto";
      t.style["width"] = wideTableWidth;
      //t.parentNode.style['overflow'] = "hidden";
    }
    var geotds=document.getElementsByName("mapbtn");
    for(var i=0; i<geotds.length; i++){
      geotds[i].style["display"]="inline";
    }
      return true;
    }

    function switchToMix(){
      showMap(mapid);
    var t=document.getElementById(tableId);
    t.parentNode.style['height'] = "250px";
    t.parentNode.style['overflow'] = "auto";
    var geotds=document.getElementsByName("geotd");
    for(var i=0; i<geotds.length; i++){
      geotds[i].style["display"]="inline";
    }
      return true;
    }

    function switchText(type){
      var text="";

      switch(type){
        case 0:
          text="Google Map einblenden";
        break;
        case 1:
          text="Google Map ausblenden";
        break;
        default:
          text="";
        break;
      }
      var btn=document.getElementById("gmap_switch_btn");
      if(!btn){return false;}
      /*get text*/
      btn.childNodes[0].nodeValue=text;
      return true;
    }

    function hideSwitchButton(){
      var btnId="gmap_switch_btn";
      var button = document.getElementById(btnId);
      if(!button){
        //alert("Can not get button #"+ btnId);
        return false;
      }
      button.style["display"]="none";
      return true;
    }

    /*
    * Main Function to show Airport on map.
    */
    function showAirport(){
      var airportLat = parseFloat($("ap_lat").value);
      var airportLng = parseFloat($("ap_lng").value);
      if( airportLat == 0 || airportLng == 0){
        return false;
      }
      var apicon = new GIcon();
        apicon.image = iconPlane;
        apicon.iconSize = new GSize(24, 24);
        apicon.iconAnchor = new GPoint(0,24);
        apicon.infoWindowAnchor = new GPoint(0,24);/*wichitg for info window*/
      var m_a = new GMarker( new GLatLng(airportLat, airportLng) , apicon);
      map.addOverlay(m_a);
      resetMapCenter(airportLat, airportLng);
      return false;
    }

    function resetMapCenter(alat, alng){
       map.setCenter(getCenter(), zoomFactor);//set all table daten center
       var currentCenter = map.getCenter(); //GLatLng
      var currentLat = currentCenter.lat();
       var currentLng = currentCenter.lng();
       /*var currentLat = latCenter;
       var currentLng = lngCenter;*/
      latCenter = (parseFloat(alat)+parseFloat(currentLat))/2;
      lngCenter = (parseFloat(alng)+parseFloat(currentLng))/2;
      var newCenter = new GLatLng(latCenter,lngCenter);
      map.setCenter(newCenter, 11);
      return true;
    }


  /* return a icon type of gmap
  * Return: anonomeyclass
        inactive:
        active:
        text:
  */
    function getIconImageUrlFromTr(tr, index){
      var value= getVFromTr(tr, index); //index=7
      var types = value.split("#");
      var titel = getVFromTr(tr, index+1); //index=8
          titel = titel.slice(0,titel.length-1);//cut out the last ","

      if(types.length>2){
        return {inactive: iconMap, active: iconMapHigh, text: titel}; //more than one icons was found.
      }

      var v = types[0];
       if(v == 'event'){
          return {inactive: iconEvent, active: iconEventHigh, text: titel};
       }
       if(v=='living'){
         return {inactive: iconLiving, active: iconLivingHigh, text: titel};
       }
       else if( v=='parking'){
         return {inactive: iconPark, active: iconParkHigh, text: titel};
       }
       else if( v== 'work'){
         return {inactive: iconWork, active: iconWorkHigh , text: titel}; //ToDo: add Img
       }
       else if(v== 'storage'){
         return {inactive: iconStorage, active: iconStorageHigh, text: titel}; //ToDo: add img
       }
       else{
         return {inactive: iconMap, active: iconMapHigh, text: titel};
       }
    }


/****************google map function end *********************/

