var map;
var markerstore;
var markerstore_sorted;
var selected_terrace = -1;
var times = new Array();
var translations = new Array();

var sunIcon = new GIcon(); 
sunIcon.image = 'images/marker_sun.png';
sunIcon.iconSize = new GSize(22, 22);
sunIcon.iconAnchor = new GPoint(6, 20);
sunIcon.infoWindowAnchor = new GPoint(5, 1);

var darkIcon = new GIcon(); 
darkIcon.image = 'images/marker_dark.png';
darkIcon.iconSize = new GSize(22, 22);
darkIcon.iconAnchor = new GPoint(6, 20);
darkIcon.infoWindowAnchor = new GPoint(5, 1);

function initializeMap() 
{
    if (GBrowserIsCompatible()) {
        map = new GMap2(document.getElementById("map_canvas"));
        
        var tw_lat = readCookie("tw_lat");
        var tw_lon = readCookie("tw_lon");
        var tw_zoom = readCookie("tw_zoom");
        var tw_city = readCookie("tw_city");
            
        if (tw_lat!=null && tw_lon!=null && tw_zoom!=null 
            && tw_city==city) {
            map.setCenter(new GLatLng(parseFloat(tw_lat), 
                            parseFloat(tw_lon)), parseInt(tw_zoom));        
        } else {
            map.setCenter(new GLatLng(initial_lat, initial_lon), initial_zoom);
            createCookie("tw_lat", initial_lat, 120);
            createCookie("tw_lon", initial_lon, 120);
            createCookie("tw_zoom", initial_zoom, 120);             
        }
            
        createCookie("tw_city", city, 120);
              
        map.setUIToDefault();
        
        GEvent.addListener(map, "moveend", function() {
            updateVisibleTerraces();
            var mapcenter = map.getCenter();
            
            if (map.getZoom()>10) {
                createCookie("tw_lat", mapcenter.lat(), 120);
                createCookie("tw_lon", mapcenter.lng(), 120);
                createCookie("tw_zoom", map.getZoom(), 120);         
            }
        });
        
    }
}  

function updateMarkers()
{
    
    map.clearOverlays();
    markerstore = new Array();
    markerstore_sorted = new Array();
  
    showLoadingDialog(translate("Updating map..."));
  
    GDownloadUrl("php/interface/markers.php?city="+encodeURIComponent(city)
                    +"&time="+$("#time").html(), function(data) {
      
        var xml = GXml.parse(data);
        var markers = xml.documentElement.getElementsByTagName("marker");
        var showmarkers = $("input[name='terraces']:checked").val(); 
        for (var i = 0; i < markers.length; i++) {
          
            var id = markers[i].getAttribute("id");
            var name = markers[i].getAttribute("name");
            var point = new GLatLng(parseFloat(markers[i].getAttribute("lat")),
                                    parseFloat(markers[i].getAttribute("lon")));
            var sun = markers[i].getAttribute("sun");
            var marker = createMarker(id, name, point, sun);
            markerstore[id] = marker;
            markerstore[id].sun = sun;
            markerstore_sorted.push(id);
            
            map.addOverlay(marker);
            
            if (showmarkers=="sun" && parseInt(sun)==0)
                marker.hide();
            if (showmarkers=="dark" && parseInt(sun)==1)
                marker.hide();
                          
            if (selected_terrace==id) {
                if (sun==1)
                    marker.setImage("images/marker_sun_selected.png");        
                else
                    marker.setImage("images/marker_dark_selected.png");
            }
                      
        }
          
        updateVisibleTerraces();        
        
        hideLoadingDialog();
        
    });  
  
}

function createMarker(id, name, point, sun) {

  if (sun==1)
    var options = { icon: sunIcon, title: name };
  else
    var options = { icon: darkIcon, title: name };
      
  var marker = new GMarker(point, options);
  
  GEvent.addListener(marker, 'click', function() {
    loadTerraceInfo(id,escape(name));  
  });
  
  return marker;
}

function loadTerraceInfo(id, name)
{

    if (selected_terrace>0) {
        if (markerstore[selected_terrace].sun==1)
            markerstore[selected_terrace].setImage("images/marker_sun.png");
        else
            markerstore[selected_terrace].setImage("images/marker_dark.png");
    }
      
    selected_terrace = id;
    
    if (markerstore[selected_terrace].sun==1)
        markerstore[selected_terrace].setImage("images/marker_sun_selected.png");        
    else
        markerstore[selected_terrace].setImage("images/marker_dark_selected.png");
      
    name = unescape(name);
    $("#terracecontent").html("Ladataan tietoja...");
        
    jQuery("#terracecontent").load("php/interface/terraceinfo.php?id="+id
                                    +"&city="+city+"&language="+language);
    
         
    $("#terracetitle").html(name);
}

function updateVisibleTerraces()
{
    var bounds = map.getBounds();
    var areahtml = "";
    var count = 0;
    var total = 0;
    var cellsonrow = 0;
    var showmarkers = $("input[name='terraces']:checked").val();    
    
    for (var i in markerstore_sorted) {
        id = markerstore_sorted[i];
        marker = markerstore[id];
        total++;
                
        if (bounds.containsLatLng(marker.getLatLng())) {
                       
            if (showmarkers=="sun" && markerstore[id].sun==0)
                continue;
            if (showmarkers=="dark" && markerstore[id].sun==1)
                continue;            
            
            if (markerstore[id].sun==1)
                areahtml += '<img src="images/marker_sun.png" width="22" height="22" alt="Sun marker"/>';
            else
                areahtml += '<img src="images/marker_dark.png" width="22" height="22" alt="Sun marker"/>';
                            
            areahtml += " <a href=\"#\" onClick=\"javascript: loadTerraceInfo("
                        +id+",'"+escape(marker.getTitle())
                        +"'); $('#terracesonview').click();\">"
                        +marker.getTitle()+ "</a><br/>";
            count++;
        }
    }
    
    if (count==0) {
        areahtml += translate("No terraces on view");
        $("#randomterrace").css("visibility", "hidden");
    } else
        $("#randomterrace").css("visibility", "visible");   
    
    $("#terracesonviewselection").html(areahtml);
    
    $("#terracesonview").html(translate("Total")+" "+total+" "
                                +translate("terraces")+", "
                                +translate("on view")+" "+count
                                +'<img id="terracesonviewdropdown" src="images/triangle.png" width="7" height="4" alt="Dropdown"/>'); 

}

function updateWeather()
{
    var currenttime = new Date();
    ms = currenttime.getTime();    
    
    if ($("#weathercontent").html()=="")
        $("#weathercontent").html(translate("Loading weather information.."));
    $("#weathercontent").load("php/interface/weather.php?language="
                                +language+"&city="+city+"&preventcache="+ms, {}, 
        function(json){
            // IE6 PNG transparency fix      
                
            $('body').supersleight({shim: 'images/transparent.gif'});            
      
        });
}

function formatSearchResultRow(row)
{

    if (row.length>1)
        return row[1];
    else 
        return false;             
  
}
  
function hideAndShowMarkers(showmarkers)
{
    for ( var i in markerstore ) {
        if (showmarkers=="all") {        
            markerstore[i].show();
        } else if(showmarkers=="sun") {
            if (markerstore[i].sun==1)
                markerstore[i].show();
            else
                markerstore[i].hide();        
        } else if(showmarkers=="dark"){
            if (markerstore[i].sun==0)
                markerstore[i].show();
            else
                markerstore[i].hide();        
        } else
            return;
            
    }
    
}
  
function makeTimeSelection() 
{
    var current = new Date();
    var newtimes = new Array();
      
    var html = '<a href="#" class="timelink">'+translate("Now")+'</a><br/>';
    newtimes[0]=translate("Now");
    
    for(var n=1; n<12; n++)
      {
        var looptime = new Date(current.getTime()+n*60*60*1000);
        html = html + '<a href="#" class="timelink">'+looptime.getHours()+':00</a><br/>';
        newtimes[n] = looptime.getHours()+":00";
      }
      
    $('#timeselection').html(html);
    times = newtimes;   
            
    $(".timelink").click(function () {
        $("#time").html(jQuery(this).html());
        $("#selecttime").click();
        updateNextAndPreviousVisibility();
        updateMarkers();
        updateExtraWeatherInfo();
        loadRandomTerraces();
    });
        
}

function nextTime()
{
  
    var selected = $("#time").html();   

    for (var i=0; i<times.length; i++) {
               
        if (selected==times[i]) {
            if (i<(times.length-1)) {
                $('#time').html(times[i+1]);
                updateMarkers();
                updateExtraWeatherInfo();
                loadRandomTerraces();               
                
                if (i==(times.length-2))
                    $('#nexttime').css('visibility','hidden');
                if (times.length>1)
                    $('#previoustime').css('visibility','visible');                                        
                                    
                break;
            }
        }
    }
        
}
  
function previousTime()
{
    var selected = $("#time").html();
    
    for (var i=0; i<times.length; i++) {
        
        if (selected==times[i]) {
            if (i>0) {
                $('#time').html(times[i-1]);
                updateMarkers();
                updateExtraWeatherInfo();
                loadRandomTerraces();               
                
                if (i<=1)
                    $('#previoustime').css('visibility','hidden');
                if (times.length>1)
                    $('#nexttime').css('visibility','visible');                                
                break;
            }
              
       }
    }
    
}
  
function updateNextAndPreviousVisibility() {

    var selected = $("#time").html();
    
    for (var i=0; i<times.length; i++) {
        
        if (selected==times[i]) {
            if (i==0) {
               $('#previoustime').css('visibility','hidden');
               if (times.length>1)
                    $('#nexttime').css('visibility','visible');                                
            }else if (i==(times.length-1)) {
               $('#nexttime').css('visibility','hidden');
               if (times.length>1)
                    $('#previoustime').css('visibility','visible');                        
            }else {
               $('#previoustime').css('visibility','visible');               
               $('#nexttime').css('visibility','visible');            
            
            }

            break;              
        }
        
    }      
}
  
function zoomMap(lat, lon, zoomlevel)
{
    map.setZoom(zoomlevel);
    map.panTo(new GLatLng(lat, lon));
    
}

function sendTerraceInformation()
{
    
    var terrace = $("#terrace_name").val();
    var address = $("#terrace_address").val();
    var sunstart = $("#terrace_sunstart").val();
    var sunend = $("#terrace_sunend").val();
    var comment = $("#terrace_comments").val();
    var email = $("#terrace_email").val();
    
    if (terrace=="") {
        $("#terracedialog_feedback").html(translate("Terrace name is missing"));
        return;
    }
    
    showLoadingDialog(translate("Sending information..."));
    
    $.getJSON("php/interface/terracefeedback.php?terrace="+terrace+"&address="
                +encodeURIComponent(address) +"&sunstart="+encodeURIComponent(sunstart)
                +"&sunend="+encodeURIComponent(sunend)+"&comments="+encodeURIComponent(comment)
                +"&email="+encodeURIComponent(email), 
                function(json)
      {
        if (json.status=="ok") {
            $("#terracedialog_feedback").html(translate("Information sent"));
            var terrace = $("#terrace_name").val("");
            var address = $("#terrace_address").val("");
            var sunstart = $("#terrace_sunstart").val("");
            var sunend = $("#terrace_sunend").val("");
            var comment = $("#terrace_comments").val("");          
        }else
            $("#terracedialog_feedback").html(json.message);
                          
        hideLoadingDialog();
        
      });    
          
}

function addComment(terraceid)
{    
    $("#comment_terraceid").val(terraceid);
    $("#comment_fi").val("");
    $("#comment_en").val("");
    $("#comment_nick").val("");
    $("#comment_feedback").html("");
    $("#comment_fi_characters").html("200");    
    $("#comment_en_characters").html("200");       
    $("#commentdialog").dialog('open');
}

function sendComment()
{
    var terraceid = $("#comment_terraceid").val();
    var comment_fi = trim($("#comment_fi").val());
    var comment_en = trim($("#comment_en").val());
    var nick = trim($("#comment_nick").val());
    var code = trim($("#comment_code").val());
     
    if (comment_fi=="" && comment_en=="") {
        $("#commentdialog_feedback").html(translate("Please write comment before sending"));
        return;             
    }
         
    if (nick=="") {
        $("#commentdialog_feedback").html(translate("Nickname is missing"));
        return;             
    }
    
    if (comment_fi.length>200) {
        $("#commentdialog_feedback").html(translate("Comment in finnish is too long"));
        return;     
    }
    
    if (comment_en.length>200) {
        $("#commentdialog_feedback").html(translate("Comment in english is too long"));
        return;     
    }
    
    if (code=="") {
        $("#commentdialog_feedback").html(translate("Please input code in image"));
        return;             
    }
        
    // HTML tags are not allowed
        
    if (nick!=strip_tags(nick)) {
        $("#commentdialog_feedback").html(translate("HTML formatting is not allowed in nickname"));
        return;     
    }
        
    if (comment_fi!=strip_tags(comment_fi) || comment_en!=strip_tags(comment_en)) {
        $("#commentdialog_feedback").html(translate("HTML formatting is not allowed in comments"));
        return;
    }
    
    showLoadingDialog(translate("Saving comment..."));
        
    $.getJSON("php/interface/savecomment.php?terraceid="+terraceid
                +"&comment_fi="+encodeURIComponent(comment_fi)
                +"&comment_en="+encodeURIComponent(comment_en)
                +"&nick="+encodeURIComponent(nick)+"&language="
                +language+"&code="+code, function(json) {
        hideLoadingDialog();
      
        if (json.status=="ok") {
            loadTerraceInfo(terraceid, $("#terracetitle").html());
            $("#commentdialog").dialog('close');
        } else
            $("#commentdialog_feedback").html(json.message);              
    });
     
}
 
function refreshContent() 
{
    
    current_time = $("#time").html();
    
    updateWeather();
    updateExtraWeatherInfo();
    makeTimeSelection();
    
    if (!in_array(current_time, times)) {
        $("#time").html(times[0]);        
        updateMarkers();
    }
    
    setTimeout("refreshContent()", 10*60*1000); 
}

function updateExtraWeatherInfo() {

    $.getJSON("php/interface/extraweatherinfo.php?time="+$("#time").html()
                +"&language="+language, function(json) {
        if (json.status=="ok") {
            if (json.sunnotice=="") {
                $("#notice").css("visibility", "hidden");
            }else {
                $("#noticetext").html(json.sunnotice);
                $("#notice").css("visibility", "visible");                
            }
            
            $("#weatherindex").css("visibility", "visible");
            
            if (json.weatherindex==0)
                $("#weatherindex").attr("src", "images/bad.png");
            else if (json.weatherindex==1)
                $("#weatherindex").attr("src", "images/ok.png");
            else if (json.weatherindex==2)
                $("#weatherindex").attr("src", "images/good.png");
            else
                $("#weatherindex").css("visibility", "hidden");
            
        }else {
            $("#notice").css("visibility", "hidden");            
            $("#weatherindex").css("visibility", "hidden");            
        }
        
        $('body').supersleight({shim: 'images/transparent.gif'});  
      
    }); 

}

function selectRandomTerrace() {

    var bounds = map.getBounds();
    var showmarkers = $("input[name='terraces']:checked").val();    
    var count = 0;
    
    // First calculate terraces on view
    
    for (var i in markerstore) {
        var marker = markerstore[i];
        
        if (bounds.containsLatLng(marker.getLatLng())) {

            if (showmarkers=="sun" && marker.sun==0)
                continue;
            if (showmarkers=="dark" && marker.sun==1)
                continue;            
             
            count++;
        
        }
    }
               
    // Then select one of them randomly
    
    var random_terrace = rand(1,count);
    count = 0;
    
    for (var i in markerstore) {
        var marker = markerstore[i];
        
        if (bounds.containsLatLng(marker.getLatLng())) {
                   
            if (showmarkers=="sun" && marker.sun==0)
                continue;
            if (showmarkers=="dark" && marker.sun==1)
                continue;            
             
            count++;
        
            if (count==random_terrace) {
                GEvent.trigger(marker,'click'); 
                return;
            }
        }
    }    

    alert(translate("Could not select random terrace. This should not be possible,\nbut please try again!"));

}

function loadRandomTerraces() 
{
    var currenttime = new Date();
    ms = currenttime.getTime();  
    
    $.getJSON("php/interface/randomterraces.php?time="+$("#time").html()
                +"&city="+city+"&language="+language+"&preventcache="+ms,
                function(json) {
        
        translate("Loading random terraces...");
        
        if (json.status=="error") {
            $("#adds").html(translate("Could not load random terraces"));
            return;
        }
        
        var html = '<table id="addlayouttable"><tr>';
        
        $.each(json.terraces, function(i,item) {
            html += '<td><div class="add"><div class="addtitle">';
            if (item.sun==1)
                html += '<img src="images/marker_sun.png" width="22" height="22" alt="Sun icon"/> ';
            else          
                html += '<img src="images/marker_dark.png" width="22" height="22" alt="Dark icon"/> ';
                
            html += item.name.substring(0,20)+'</div><div class="addcontent">'
                    +item.region+'<br/>'+item.address+'<br/>'+item.onthesun
                    +'<br/><a href="#" onclick="loadTerraceInfo('+item.id
                    +',\''+escape(item.name)+'\'); zoomMap('+item.lat
                    +','+item.lon+')">'+translate("Show on the map")
                    +'</a><br/>';
            
            if (item.homepage!=null && item.homepage!="")       
                html += '<a href="'+item.homepage
                        +'" target="_blank">'+translate("Go to restaurant homepage")
                        +'</a>';
            html += '</div></div></td>'; 
        });
        
        html += "</tr></table>";
        
        $("#adds").html(html);
            
    });
    
}

