/* NOTES:

   KML data is stored here:
   http://www.adelaide.edu.au/campuses/googlemap/kml/

   In google earth you can save individual folders as kml files such as:
   http://www.adelaide.edu.au/campuses/googlemap/kml/blah.kml

   The complete data structure is here:
   http://www.adelaide.edu.au/campuses/googlemap/kml/all_data.kml

   The campuses main buildings maps is a GEOXML XML overlay:
   http://www.adelaide.edu.au/campuses/googlemap/kml/building_overlay3.kml

*/


// 'service and facilities' checkbox history management (hides and shows sidebar controls and map layers)
var $sublayerhistory = "";
var checkboxhistory = "";
var NameIconHash = new Array();
var FacilitiesData;

// THE FOLLOWING FUNCTION ARE FOR THE 'SERVICES AND FACILITIES' MAP FUNCTIONALITY

function useful_facilities_content() {
    cleanup_overlays();
    var $sidehtml = $("<h2>Facilities and Services</h2><table id='sidebarTABLE'><tbody id='sidebarTBODY'></tbody></table>");
    $("#sidebar").empty();
    $("#sidebar").append($sidehtml);
    LoadKMLData(function(){
        // open the first 'layer' by default
        $("#Popular-Services").attr('checked','checked');
        add_map_markers('Popular-Services', true, $("#Popular-Services").closest("tr"));
    });
}


function LoadKMLData(cb) {
    var data_url = "/cgi-bin/misc-bin/xml2json.pl?file=/apps/web_docs/adeluweb/campuses/northtce/googleapp/kml/facilities_services.kml";
    // if (window.location.href.match(/webdev/)) data_url += "&no_cache=1";
    $.getJSON(data_url,
              function(data) {
                  FacilitiesData = data;
                  var Folders = FacilitiesData.kml.Document.Folder;

                  for (var i = 0; i < Folders.Folder.length; i++) {
                      var name = Folders.Folder[i].name.$t;
                      var id = StringConvert(name, true);
                      add_layers(id,name);
                  }
                  if (cb) cb();
              });
}

// sets up the HTML for the 'services and facilities' sidebar controls
function add_layers(id, name) {
    var $layerTR = $('<tr></tr>');
    var $layerTD = $('<td></td><td></td><td></td>');
    var $input = $('<input type="checkbox" />').attr('id',id).click(function(){ add_map_markers(this.id, this.checked, $(this).closest("tr")) });
    var $link = $('<h5>' + name + '</h5>');
    $layerTD.eq(0).append($input);
    $layerTD.eq(1).append($link);
    $layerTR.append($layerTD);
    $layerTR.appendTo("#sidebarTBODY");
}


function add_map_markers (id, checked , $parent){
    var checkboxname = StringConvert(id, false);
    if (checked){
        // clear hash
        NameIconHash = [];
        layer_history(id,$parent);

        var vticon = new GIcon(G_DEFAULT_ICON);
        vticon.iconSize = new GSize(32, 37);
        vticon.iconAnchor = new GPoint(15, 37);
        vticon.infoWindowAnchor = new GPoint(15, 6);
        vticon.shadow = "http://www.adelaide.edu.au/global/images/icons/gmaps/kml/shadow-university.png";
        vticon.shadowSize = new GSize(51.0, 37.0);

        var Folders = FacilitiesData.kml.Document.Folder;
        for (var i = 0; i < Folders.Folder.length; i++) {
            var name = Folders.Folder[i].name.$t;
            if (name == checkboxname) {
                var SelectedFolder = Folders.Folder[i];
                for (var j = 0; j < SelectedFolder.Placemark.length; j++) {
                    function MarkerMan(mark) {
                        var markerOptions = {icon:vticon};
                        var FindIcon = mark.styleUrl.$t;
                        var icon = IconFinder(FindIcon);
                        vticon.image = icon;

                        var markername = mark.name ? mark.name.$t : 'No name';
                        var markerdes =  mark.description ? mark.description.$t : '';
                        var markerpoints = mark.Point.coordinates.$t;
                        var LatLng = markerpoints.split(',');
                        var Lng = LatLng[0];
                        var Lat = LatLng[1];
                        var point = new GLatLng(Lat,Lng);
                        var marker = new GMarker(point, markerOptions);

                        GEvent.addListener(marker, "click", function() {
                            map.setZoom(17);
                            var myHtml = "<div style='width:350px'><h2>"+ markername + "</h2><p>" + markerdes + "</p></div>";
                            map.openInfoWindowHtml(point, myHtml ,{onCloseFn: function() { centre_map(); }});
                        });
                        map.addOverlay(marker);

                        // to avoid display of markers with the same name twice we add markernames and icons to a hash table which is defined globally.

                        var MarkerObj = new Object();
                        MarkerObj.icon = icon;
                        MarkerObj.point = point;
                        MarkerObj.des = markerdes;
                        NameIconHash[markername]  = MarkerObj;

                    }
                    var mark = SelectedFolder.Placemark[j];
                    MarkerMan(mark);
                }
                break;
            }
        }
        add_sublayers($parent);

    } else if (!checked) {
        remove_sublayers(id, $parent);
    }
}

function faciltiesinfowindow(id){
    // convert id to name
    map.setZoom(17);
    var name = StringConvert(id, false);
    var myHtml = "<div style='width:350px'><h2>"+ name + "</h2><p>" + NameIconHash[name].des + "</p></div>";
    map.openInfoWindowHtml(NameIconHash[name].point, myHtml ,{onCloseFn: function() {centre_map();}});
}


// Adds the 'sublayers' under checkboxes. Called by the 'add_map_icons' function
function add_sublayers($parent) {

    // no simple way of sorting hash keys in JS so have a work around;
    var NameIconHashSort = [];
    for (var name in NameIconHash) {
        NameIconHashSort.push(name);
    }
    NameIconHashSort.sort();
    NameIconHashSort.reverse();


    for (var i=0; i < NameIconHashSort.length; i++ ) {
        // create id from the names with - instead of spaces
        var id = StringConvert(NameIconHashSort[i], true);

        var $sublayerTR = $('<tr></tr>');
        var $sublayerTD = $('<td></td><td></td><td></td>');
        var $sublayername = $("<a id='" + id +"'href='#'>" + NameIconHashSort[i] +"</a>").click(function(){ faciltiesinfowindow(this.id);return false;});

        var $sublayericon = $('<img width="22" height="22" src="' + NameIconHash[NameIconHashSort[i]].icon + '" />');
        $sublayerTD.eq(0).append($sublayericon);
        $sublayerTD.eq(1).append($sublayername);
        $sublayerTR.addClass("sublayer").append($sublayerTD);
        $sublayerTR.insertAfter($parent);
    }
}

// Removes the 'sublayers' under checkboxes. Called by the 'add_map_icons' function
function remove_sublayers(id ,sublayer) {
    cleanup_overlays();
    sublayer.nextAll().each(function(){
        if ($(this).hasClass("sublayer")) {
            $(this).remove();
        }
    });
    document.getElementById(id).checked = false;
}

// Keeps track of which layer is open by initialising global vars. Called by 'add_map_icons' function.
function layer_history(id, $parent) {
    if ($sublayerhistory != "" && checkboxhistory != id) {
        remove_sublayers(checkboxhistory, $sublayerhistory);
        $sublayerhistory = $parent;
        checkboxhistory = id;
    } else if ($sublayerhistory == "") {
        $sublayerhistory = $parent;
        checkboxhistory = id;
    }
}

function IconFinder(findstyle) {
    var icontofind = findstyle.substr(2);
    var icon =  icontofind.replace(/\d+/g,"");
    for (var k = 0; k < FacilitiesData.kml.Document.Style.length ;k++) {
        var styleID = FacilitiesData.kml.Document.Style[k]._id;
        if (styleID.indexOf(icon) != -1) {
            iconURL = FacilitiesData.kml.Document.Style[k].IconStyle.Icon.href.$t
            return iconURL;
            break;
        }

    }
}


// helper function - converts spaces to dashs and the reverse (used of creating ID's etc.)
function StringConvert(string, flag) {
    if (flag) {
        // convert to spaces to dashes
        var id = string.replace(/\s+/g, "-");
        return id;

    } else {
        // convert dashes to spaces
        var name = string.replace(/-+/g, " ");
        return name;
    }

}


