var map;
var geoXml = new Array();

//NFC DEMO
var nfcUpdate;
geoXml['TransitDemo'] = mashupUrls[1];
var showTransitDemo = false;
var transitDemoUpdate;
geoXml['Transit'] = mashupUrls[1];

var georss = new Array();

var poiMarkers = new Array();
var markerTrackers = new Array();

var rssUpdate;
var rssRefresh;

var inTransit = false;

// marker containers
var userMarker = null;

var progressBarCounter = 1;
var progressInterval;

var count = 0;

//vars from other modules that are ABSOLUTELY NEEDED
//(ie. onLoad, refresh, listeners) here
var mpActive = false;
var buddyActive = false;
var stopPolling = false;
var myAvatar = false;
var panningToEvent = false;
var eventTabActive = false;
var activeCreateMPRouteFrom = false;
var activeCreateMPPlaceTo = false;
var activeCreateBusFrom = false;
var activeCreateBusTo = false;
var busStopsShown = false;
var libKML = false;
var eventActive = false;
var mapOnly = false;
var showTransit = false;
// refresh map only - minimal server calls here.
function refreshMap() {
    
    // when weather is on, update waether in visible area
    if(weatherOn && map.getInfoWindow().isHidden()) {
        geoXml['Weather'] = mashupUrls[3];
        georss['Weather'].load(geoXml['Weather'], true);
        geoXml['ClosestWeather'] = mashupUrls[0] + "?closest=true&centerlat=" + map.getCenter().lat() + "&centerlon=" + map.getCenter().lng();
        georss['ClosestWeather'].load(geoXml['ClosestWeather'], true);
    }
    

    
    if ((map.isCenterOnUser()) && (userMarker != null)) {
        // center on the user marker when center on user is true and the user marker is set
        map.setCenterOnUser(false);
        panToMarker(userMarker.getLatLng().lat(), userMarker.getLatLng().lng());
        map.setCenterOnUser(true);
    }
}


//Called once every 10 seconds
function refresh() {
    refreshMap();
    //    if ((userMarker != null) && (userMarker.isTracking) && (!gpsOn)) {
    //    if ((userMarker != null) && (!gpsOn)) { // disregard tracking to support location based routing
    //        // update current location to server
    //        setUserLocation(userMarker.getLatLng().lat(), userMarker.getLatLng().lng());
    //    }
    
    if(gpsOn && !inTransit) {
        updateGpsLocal();
    }
    
    if(inTransit || userMode == 1) {
        updateGpsServer();
    }

    if(mpActive) {
        updateAttendees();
    }
    
    // update notifications from server
    updateNotifications();
    
    // update buddy markers from server
    if(buddyActive) {
        updateBuddies();
    }

    if(stopPolling && userMarker != null && map.getInfoWindow().isHidden()) {
        getStops(userMarker.getLatLng(), 1);
    }
}


function adjust() {
    var currentWindow = Richfaces.getWindowSize();
    var w = currentWindow.width;
    var h = currentWindow.height;
    var htmlElementMarginBottom = Richfaces.getComputedStyleSize(document.documentElement, "margin-bottom");
    var htmlElementMarginLeft = Richfaces.getComputedStyleSize(document.documentElement, "margin-left");
    var htmlElementMarginRight = Richfaces.getComputedStyleSize(document.documentElement, "margin-right");
    var htmlElementMarginTop = Richfaces.getComputedStyleSize(document.documentElement, "margin-top");
    var bodyElementMarginBottom = Richfaces.getComputedStyleSize("bodyElm", "margin-bottom");
    var bodyElementMarginLeft = Richfaces.getComputedStyleSize("bodyElm", "margin-left");
    var bodyElementMarginRight = Richfaces.getComputedStyleSize("bodyElm", "margin-right");
    var bodyElementMarginTop = Richfaces.getComputedStyleSize("bodyElm", "margin-top");
    var headerElement = document.getElementById("header");
    var headerElementHeight = Richfaces.getComputedStyleSize("header", "height");
    var tabpanelElement = document.getElementById("tabpanel");
    var tabpanelElementMarginBottom = Richfaces.getComputedStyleSize("tabpanel", "margin-bottom");
    var tabpanelElementMarginLeft = Richfaces.getComputedStyleSize("tabpanel", "margin-left");
    var tabpanelElementMarginRight = Richfaces.getComputedStyleSize("tabpanel", "margin-right");
    var tabpanelElementMarginTop = Richfaces.getComputedStyleSize("tabpanel", "margin-top");
    //    var tabpanelElementHeight = Richfaces.getComputedStyleSize("tabpanel", "height");
    var tabpanelElementWidth = Richfaces.getComputedStyleSize("tabpanel", "width");
    var tabbedPaneElement = document.getElementById("tabbedPane");
    var contentElement = document.getElementById("content");
    var contentElementMarginBottom = Richfaces.getComputedStyleSize("content", "margin-bottom");
    var contentElementMarginLeft = Richfaces.getComputedStyleSize("content", "margin-left");
    var contentElementMarginRight = Richfaces.getComputedStyleSize("content", "margin-right");
    var contentElementMarginTop = Richfaces.getComputedStyleSize("content", "margin-top");
    //    var contentElementHeight = Richfaces.getComputedStyleSize("content", "height");
    //    var contentElementWidth = Richfaces.getComputedStyleSize("content", "width");
    var togglePanelsElement = document.getElementById("togglePanels");
    var togglePanelsElementHeight = Richfaces.getComputedStyleSize("togglePanels", "height");
    //    var togglePanelsElementWidth = Richfaces.getComputedStyleSize("togglePanels", "width");
    //    var togglePanelsElementStyle = window.getComputedStyle(togglePanelsElement, '');
    var mapControlsElement = document.getElementById("mapControls");
    //    var mapControlsElementHeight = Richfaces.getComputedStyleSize("mapControls", "height");
    //    var mapControlsElementWidth = Richfaces.getComputedStyleSize("mapControls", "width");
    //    var mapControlsElementStyle = window.getComputedStyle(mapControlsElement, '');
    var moveUpElement = document.getElementById("moveUp");
    var moveUpElementHeight = Richfaces.getComputedStyleSize("moveUp", "height");
    //    var moveUpElementWidth = Richfaces.getComputedStyleSize("moveUp", "width");
    //    var moveUpElementStyle = window.getComputedStyle(moveUpElement, '');
    var moveDownElement = document.getElementById("moveDown");
    var moveDownElementHeight = Richfaces.getComputedStyleSize("moveDown", "height");
    //    var moveDownElementWidth = Richfaces.getComputedStyleSize("moveDown", "width");
    //    var moveDownElementStyle = window.getComputedStyle(moveDownElement, '');
    var moveLeftElement = document.getElementById("moveLeft");
    //    var moveLeftElementHeight = Richfaces.getComputedStyleSize("moveLeft", "height");
    var moveLeftElementWidth = Richfaces.getComputedStyleSize("moveLeft", "width");
    //    var moveLeftElementStyle = window.getComputedStyle(moveLeftElement, '');
    var moveRightElement = document.getElementById("moveRight");
    //    var moveRightElementHeight = Richfaces.getComputedStyleSize("moveRight", "height");
    var moveRightElementWidth = Richfaces.getComputedStyleSize("moveRight", "width");
    //    var moveRightElementStyle = window.getComputedStyle(moveRightElement, '');
    var webContainerElement = document.getElementById("webContainer");
    //    var webContainerElementHeight = Richfaces.getComputedStyleSize("webContainer", "height");
    //    var webContainerElementWidth = Richfaces.getComputedStyleSize("webContainer", "width");
    //    var webContainerElementStyle = window.getComputedStyle(webContainerElement, '');
    var toolbarElement = document.getElementById("toolbarForm");

    //      var toolbarElementHeight = 38;
    var toolbarElementHeight = Richfaces.getComputedStyleSize("toolbarForm", "height");
    //    var toolbarElementWidth = Richfaces.getComputedStyleSize("toolbarForm", "width");
    //    var toolbarElementStyle = window.getComputedStyle(toolbarElement, '');
    //    var tabbedPaneElement = document.getElementById("tabbedPane");
    //    var tabbedPaneElementHeight = Richfaces.getComputedStyleSize("tabbedPane", "height");
    //    var tabbedPaneElementWidth = Richfaces.getComputedStyleSize("tabbedPane", "width");
    //    var tabbedPaneElementStyle = window.getComputedStyle(tabbedPaneElement, '');


    var screenContentWidth = (w - htmlElementMarginLeft - htmlElementMarginRight - bodyElementMarginLeft - bodyElementMarginRight);
    var screenContentHeight = (h - htmlElementMarginTop - htmlElementMarginBottom - bodyElementMarginTop - bodyElementMarginBottom);
    
    // Unify the content area browser independently (ie. both in FF and IE)
    // The width is the screen content width without the tabpanel width and margins
    var scrollbarWidth = 16;
    var scrollbarHeight = 0; // using CSS3 overflow-x to hide vertical scrollbar
    // IE excludes the scrollbars from the screen content width and height
    if (Richfaces.browser.isIE) {
        scrollbarWidth = 6;
        scrollbarHeight = 4;
        // there is a strange empty space after each element
        // this hack moves the toolbar 19 px higher to cover the empty area
        toolbarElement.style.position = "relative";
        toolbarElement.style.top = "-19px";
    }
    
    var contentElementWidth = (screenContentWidth - scrollbarWidth - tabpanelElementWidth - tabpanelElementMarginLeft - tabpanelElementMarginRight - contentElementMarginLeft - contentElementMarginRight);
    var contentElementHeight = (screenContentHeight - scrollbarHeight);
    //    alert('containerMaxHeight = ' + contentElementHeight + ' - ' + togglePanelsElementHeight + ' - ' + toolbarElementHeight);
    if (isNaN(togglePanelsElementHeight)) {
        togglePanelsElementHeight = 0;
        togglePanelsElement.style.display = "none"
    } else {
        togglePanelsElement.style.display = "block"
    }
    var containerMaxHeight = (contentElementHeight - togglePanelsElementHeight - toolbarElementHeight);
    //    alert('middleMaxHeight = ' + containerMaxHeight + ' - ' + moveUpElementHeight + ' - ' + moveDownElementHeight);
    var middleMaxHeight = (containerMaxHeight - moveUpElementHeight - moveDownElementHeight);

    //    alert('before contentElementWidth' + contentElement.style.height + ' to become ' + contentElementWidth);
    // set content width to max
    contentElement.style.width = contentElementWidth + "px";
    //    alert('before contentElementHeight, which is ' + contentElement.style.height + ' to height ' + contentElementHeight);
    // set content height to max
    contentElement.style.height = contentElementHeight + "px";

    // IE does not like to set height and width to display none elements, therefore
    // only set the height and width on IE for web container when displayed
    if ((!Richfaces.browser.isIE) || (Richfaces.getComputedStyle("webControls", "display") != "none")) {
        //      alert('before webContainerElementHeight and Width');
        // set webcontrol height and width to max
        webContainerElement.style.height = containerMaxHeight + "px";
        webContainerElement.style.width = contentElementWidth + "px";
    }
    
    // IE dislikes hidden elements and cannot set styles for them
    if ((!Richfaces.browser.isIE) || (Richfaces.getComputedStyle("mapControls", "display") != "none")) {
        var mapContainerElement = document.getElementById("mapContainer");
        //      alert('before mapContainerElementHeight');
        //      alert('mapContainerElementHeight:' + mapContainerElement.style.height + ' to become ' + middleMaxHeight);
        // set moveLeft/Right&mapcontainer height to max - fixed-heights
        mapContainerElement.style.height = middleMaxHeight + "px";
        //      alert('mapContainerElementHeight:' + mapContainerElement.style.height);
        //      alert('before moveLeftElementHeight');
        moveLeftElement.style.height = middleMaxHeight + "px";
        //      alert('before moveRightElementHeight');
        moveRightElement.style.height = middleMaxHeight + "px";

        //      alert('before mapContainerElementWidth');
        // set mapcontainer width to max - fixed-widths
        //    alert('mapContainerElement = ' + contentElementWidth + ' - ' + moveLeftElementWidth + ' - ' + moveRightElementWidth);
        mapContainerElement.style.width = (contentElementWidth - moveLeftElementWidth - moveRightElementWidth) + "px";
    }

    //    alert('done');
    /*

     left for possible future debugging
    alert("window: " + w + " x " + h + "\n"
    + "html: " + Richfaces.getComputedStyleSize(document.documentElement,"width") + " x " + Richfaces.getComputedStyleSize(document.documentElement,"height")+ " :\t " + Richfaces.getComputedStyleSize(document.documentElement,"margin-top") + ":" + Richfaces.getComputedStyleSize(document.documentElement,"margin-left") + ":" + Richfaces.getComputedStyleSize(document.documentElement,"margin-right") + ":" + Richfaces.getComputedStyleSize(document.documentElement,"margin-bottom") + "\n"
    + "body: " + Richfaces.getComputedStyleSize("bodyElm", "width") + " x " + Richfaces.getComputedStyleSize("bodyElm", "height")+ " :\t " + Richfaces.getComputedStyleSize("bodyElm", "margin-top") + ":" + Richfaces.getComputedStyleSize("bodyElm", "margin-left") + ":" + Richfaces.getComputedStyleSize("bodyElm", "margin-right") + ":" + Richfaces.getComputedStyleSize("bodyElm", "margin-bottom") + "\n"
    + "tabpanel: " + tabpanelElement.style.width + " x " + tabpanelElement.style.height + " :\t " + tabpanelElementWidth + " x " + tabpanelElementHeight + "\n"
    + "content: " + contentElement.style.width + " x " + contentElement.style.height + " :\t " + contentElementWidth + " x " + contentElementHeight + "\n"
    + "togglePanels: " + togglePanelsElement.style.width + " x " + togglePanelsElement.style.height + " :\t " + togglePanelsElementWidth + " x " + togglePanelsElementHeight + "\n"
    + "mapControls: " + mapControlsElement.style.width + " x " + mapControlsElement.style.height + " :\t " + mapControlsElementWidth + " x " + mapControlsElementHeight + "\n"
    + "webContainer: " + webContainerElement.style.width + " x " + webContainerElement.style.height + " :\t " + webContainerElementWidth + " x " + webContainerElementHeight + "\n"
    + "toolbar: " + toolbarElement.style.width + " x " + toolbarElement.style.height + " :\t " + toolbarElementWidth + " x " + toolbarElementHeight + "\n"
    + "tabbedPane: " + tabbedPaneElement.style.width + " x " + tabbedPaneElement.style.height + " :\t " + tabbedPaneElementWidth + " x " + tabbedPaneElementHeight + "\n"
    );
    */
   
    // tabpanel width fixed, set height to max
    // tabpanel height is changed last to make the resize more reliable
    tabpanelElement.style.height = (screenContentHeight - headerElementHeight - scrollbarHeight) + "px";
    //    alert("screen " + screenContentHeight + " header " + headerElementHeight + " scrollbar " + scrollbarHeight);
    tabbedPaneElement.style.height = (screenContentHeight - headerElementHeight - scrollbarHeight) + "px";
    
    if(map) {
        map.checkResize();
    }
}

function goweb(websiteurl) {
    // Set url to websiteurl. If undefined, use default homeUrlText
    // Hide the map and show the web-frame
                    
    var containerWeb = document.getElementById("webContainer");
    var controlsMap = document.getElementById("mapControls");
    var controlsWeb = document.getElementById("webControls");

    // set url to iframe
    if(websiteurl) {
        containerWeb.src = websiteurl;
    //    } else {
    //        containerWeb.src = "http://hubi.tte.erve.vtt.fi/festmenu/hubi_info.html";
    }
    // Hide map
    if (controlsMap.style.display != "none") {
        controlsMap.style.display = "none";
    }

    // Show web
    if (controlsWeb.style.display != "inline") {
        controlsWeb.style.display = "inline";
    }
    
    //release variables (and memory)
    containerWeb = null;
    controlsMap = null;
    controlsWeb = null;
}

function gomap() {
    // Hide the web-frame and show the map 

    var controlsMap = document.getElementById("mapControls");
    var controlsWeb = document.getElementById("webControls");

    // Hide web
    if (controlsWeb.style.display != "none") {
        controlsWeb.style.display = "none";
    }

    // Show map
    if (controlsMap.style.display != "inline") {
        controlsMap.style.display = "inline";
    }

    //release variables (and memory)
    controlsMap = null;
    controlsWeb = null;
}

function createUserMarker(img, latlng) {
    // place a draggable marker in the center of the screen
    var desc = "Olet tässä";
    var label = "Sinä";
    var icon = new GIcon();
    icon.image = img;
    icon.iconSize = new GSize(32, 41);
    icon.iconAnchor = new GPoint(15, 40);
    icon.infoWindowAnchor = new GPoint(15, 40);
    userMarker = new GMarker(latlng, {
        icon: icon,
        title: label,
        draggable: true
    });
    // the position should be updated to reflect current location, therefore is removed as no update takes place
    //        var position = userMarker.getLatLng();
    //        var info = "<h3>" + label +"</h3><p>" + desc + "</p>" + position + "<br />"; //<button onclick='removeUserMarker();'>Poista sijaintini</button>";
    //        addListener(userMarker, info);
    GEvent.addListener(userMarker, "dragstart", function() {
        userMarker.isCenterOnUser = map.isCenterOnUser();
        map.setCenterOnUser(false);
        if(showTransit) {
            getToTransit();
        }
    });
    GEvent.addListener(userMarker, "dragend", function(){
        map.setCenterOnUser(userMarker.isCenterOnUser);
        setUserLocation(userMarker.getLatLng().lat(), userMarker.getLatLng().lng());
    });
    map.addOverlay(userMarker);
}

function trackUser(isTracking) {
    // store tracking value to marker
    if (userMarker != null) {
        userMarker.isTracking = isTracking;
    //potential conflict
    //setUserLocation(userMarker.getLatLng().lat(), userMarker.getLatLng().lng());
    }
}

function removeUserMarker() {
    // unnecessary as setCenterOn also executes updateUserMarker, which removes map centerOnUser    map.setCenterOnUser(false); // disable center on user in gmap
    setCenterOn(false); // disable center on user on server
    setTrackUser(false); // disable track user on server
    if (userMarker != null) {
        // reset all values to remove possible circular references
        userMarker.isTracking = null;
        userMarker.isCenterOnUser = null;
        map.removeOverlay(userMarker);
        userMarker = null;
    }
}

// toggle center on user
function updateUserMarker(isCenter) {
    // store new value
    map.setCenterOnUser(isCenter);

    if (isCenter && userMarker != null) {
        // center on the user marker
        panToMarker(userMarker.getLatLng().lat(), userMarker.getLatLng().lng());
    }
}

function updateUserMarkerWithGps(lat, lon) {
    if(userMarker != null) {
        userMarker.setLatLng(new GLatLng(lat, lon));
    }
}

function toggleWeather() {
    weatherOn = !weatherOn;
    georss['Weather'].showHide();
    georss['ClosestWeather'].showHide();
}
                
function onLoad() {
    // Compatible browsers are GMap compatible and not IE6. There might be other not supported browsers as well.
    if (GBrowserIsCompatible() && (!Richfaces.browser.isIE6)) {
        map = new GMap2(document.getElementById("mapContainer"));
        map.setCenter(new GLatLng(0, 0),0); // any location, reset after size adjustment
        // adjust elements to fit screen.
        adjust();
        //        map.addMapType(G_PHYSICAL_MAP); // there are zoom levels that are empty above 17, meaning the restriction should be adjusted for the physical map
        map.addControl(new GMapTypeControl(), new GControlPosition(G_ANCHOR_TOP_RIGHT, new GSize(10,10)));
        _mPreferMetric = true;
        map.addControl(new GScaleControl());
        map.setCenter(new GLatLng(myCoords[0], myCoords[1]), myCoords[2]);
        // Add user position to center of screen
        if(myAvatar) {
            createUserMarker(myAvatar, new GLatLng(myCoords[0], myCoords[1]));
        }else {
            //Fallback, no avatar
            createUserMarker("images/me_marker.png", new GLatLng(myCoords[0], myCoords[1]));
        }
        //        map.setMapType(G_HYBRID_MAP); // use aerial/satellite map

        var overviewMap = new GOverviewMapControl();
        map.addControl(overviewMap);
        overviewMap.hide(true);

        map.enableContinuousZoom();
        map.enableDoubleClickZoom();
        map.enableScrollWheelZoom();

        GEvent.addListener(map, "dragstart", function() {
            if (map.isCenterOnUser()) {
                map.setCenterOnUser(false); // avoid fast drag drop misbehaviour and update value on client
                setCenterOn(false); // update value on server
            }
        });

        //    GEvent.addListener(map, "zoomend", function() {
        //        refresh(true);
        //   });

        // ====== Restricting the range of Zoom Levels =====
        // Get the list of map types
        var mt = map.getMapTypes();
        // Overwrite the getMinimumResolution() and getMaximumResolution() methods
        for (var i=0; i<mt.length; i++) {
            //      mt[i].getMinimumResolution = function() {return 7;}
            mt[i].getMaximumResolution = function() {
                return 17;
            }
        }

        GEvent.addListener(map, "moveend", function() {
            if(mapOnly && map.getInfoWindow().isHidden() &&!panningToEvent &&eventTabActive) {
                setLatLon(map.getBounds().getSouthWest().lat(),
                    map.getBounds().getSouthWest().lng(),
                    map.getBounds().getNorthEast().lat(),
                    map.getBounds().getNorthEast().lng());
            }
            refreshMap();
            panningToEvent = false;
        });

        GEvent.addListener(map, "click", function(overlay, latlng) {
            // This can be used to identify which tab is currently active and create markers accordingly
            //        if (RichFaces.isTabActive("bustab_lbl")) {
            //        alert("bustab is active");
            //    } else {
            //        alert("bustab is not active");
            //    }
            if (activeCreateMPRouteFrom) {
                if(overlay) {
                //When overlay is passed on, the overlay is clicked and
                // an additional Meeting Point is not created.
                } else {
                    if (mpRouteFromMarker != null) {
                        // if marker exist, set location
                        mpRouteFromMarker.setLatLng(latlng);
                    } else {
                        // create marker and set location
                        createMPRouteFromMarker(latlng);
                    }
                    mpReverseLookupFrom(latlng.lat(), latlng.lng());
                    activeMPRouteFrom(false);
                }
            } else if (activeCreateMPPlaceTo) {
                if(overlay) {
                //When overlay is passed on, the overlay is clicked and
                // an additional Meeting Point is not created.
                } else {
                    //one intresting thingy, this ensures (overlay) that meetingpoint is not made twice in the same place
                    //and java code makes some painful hoops to ensure that same meetingpoint is not made twice...
                    //
                    if (mpPlaceToMarker != null) {
                        // if marker exist, set location
                        mpPlaceToMarker.setLatLng(latlng);
                    } else {
                        // create marker and set location
                        createMPPlaceToMarker(latlng);
                    }
                    startProgress();
                    addPlaceLatLon(latlng.lat(), latlng.lng());
                    activeMPPlaceTo(false);
                //stopProgress() in addplaceLatLon...
                //        if(confirm("Create meetingpoint at " + latlng.lat() + " and " +latlng.lng() + "!")) {
                //            //TODO: add coordinates to list of places
                //        }
                }
        
            } else if (activeCreateBusFrom || activeCreateBusTo){
                if(overlay) {
                //When overlay is passed on, the overlay is clicked and
                // an additional Meeting Point is not created.
                } else {
                    //TODO: implement actual reverse geocoding or simply use a double set of coordinates
                    if(activeCreateBusFrom) {
                        if (busFromMarker != null) {
                            // if marker exist, set location
                            busFromMarker.setLatLng(latlng);
                        } else {
                            // create marker and set location
                            createBusFromMarker(latlng);
                        }
                        reverseLookupFrom(latlng.lat(), latlng.lng());
                        activeBusFrom(false);
                    }
                    //          var busFromElement = document.getElementById("busSubmitForm:busFrom");
                    //          busFromElement.value = latlng.lat() + ";" + latlng.lng();
                    //          }
                    if(activeCreateBusTo) {
                        if (busToMarker != null) {
                            // if marker exist, set location
                            busToMarker.setLatLng(latlng);
                        } else {
                            // create marker and set location
                            createBusToMarker(latlng);
                        }
                        reverseLookupTo(latlng.lat(), latlng.lng());
                        activeBusTo(false);
                    //              var busToElement = document.getElementById("busSubmitForm:busTo");
                    //          busToElement.value = latlng.lat() + ";" + latlng.lng();
                    }
                //          if (busFromElement.value == "1234") {
                //              busFromElement.value = "2222233";
                //          } else {
                //              busFromElement.value = "1234";
                //          }
                }
            }
            else {
                if(!overlay && map.getZoom() > 13 && busStopsShown) {
                    getStops(latlng);
            
                }
            }
        });

        // geoXml initialized before map
        geoXml['Weather'] = mashupUrls[3];
        georss['Weather'] = new MGeoRSS();
        map.addMGeoRSS(georss['Weather']);
        georss['Weather'].showHide();
        
        geoXml['ClosestWeather'] = mashupUrls[0] + "?closest=true&centerlat=" + map.getCenter().lat() + "&centerlon=" + map.getCenter().lng();
        georss['ClosestWeather'] = new MGeoRSS();
        map.addMGeoRSS(georss['ClosestWeather']);
        georss['ClosestWeather'].showHide();
        georss['ClosestWeather'].load(geoXml['ClosestWeather'], false, true);
        
        georss['Transit'] = new MGeoRSS();
        map.addMGeoRSS(georss['Transit']);

        //NFC DEMO
        if(userMode == 1) {
            nfcDemo();
        }
        //END
        //    rssUpdate = setInterval("update()", 10000);
        rssRefresh = setInterval("refresh()", 10000);

        if(libKML) {
            libGeo = new GGeoXml(libKML);
        }

        if(eventActive) {
            setEventMarkers(); //For as long as the event tab is selected on start
        }

        updateSettings();
        checkTermsAccepted();
        
    } else {
        var textarea = document.getElementById("bodyElm");
        textarea.onresize = null; //Disable onresize event
        textarea.innerHTML = "Valitettavasti tätä selainta ei tueta. Päivitä tai vaihda selaintasi esimerkiksi uusimpaan <a href='http://www.mozilla-europe.org/fi/firefox/'>Firefoxiin</a>(Suositus) tai <a href='http://www.microsoft.com/finland/windows/downloads/ie/getitnow.mspx'>Internet Exploreriin</a>";
    }
    

}

//NFC DEMO Code
function nfcDemo() {
    georss['TransitDemo'] = new MGeoRSS();
    map.addMGeoRSS(georss['TransitDemo']);
    geoXml['TransitDemo'] = mashupUrls[1] + "&demo=1";
    georss['TransitDemo'].load(geoXml['TransitDemo'], true, true);
    showTransitDemo = true;
    georss['TransitDemo'].show();
    if(transitDemoUpdate) {
        clearInterval(transitDemoUpdate);
    }
    transitDemoUpdate = setInterval("updateTransitDemo()", 10000);
    if(nfcUpdate) {
        clearInterval(nfcUpdate);
    }
    nfcUpdate = setInterval("nfcCheck()", 10000);
}

function nfcCheck() {
    checkNFC();
    checkNFCStop();
    if(nfcUpdate) {
        clearInterval(nfcUpdate);
    }
    nfcUpdate = setInterval("nfcCheck()", 10000);
}

function nfcStop(latlng) {
    if("stopClose" == latlng) {
        map.closeInfoWindow();
        return;
    }
    if("ignore" != latlng) {
        var lat = latlng.substring(0, latlng.indexOf("¨"));
        var lon = latlng.substring(latlng.indexOf("¨") + 1);
        var point = new GLatLng(parseFloat(lat), parseFloat(lon));
        getStops(point, "demo");
    }
}

function updateTransitDemo() {
    if(showTransitDemo) {
        georss['TransitDemo'].load(geoXml['TransitDemo'], true, true);
    }
    else {
        clearInterval(transitDemoUpdate);
    }
}
//NFC DEMO Code end

function updateProgress() {
    if(progressBarCounter <= 20) {
        var progressbar = document.getElementById("toolbarForm:progressBar");
        if(progressbar && progressbar.component) {
            progressbar.component.setValue(progressBarCounter*5);
        }
    }
    progressBarCounter++;
}
                
function stopProgress() {
    clearInterval(progressInterval);
    var progressbar = document.getElementById("toolbarForm:progressBar");
    if(progressbar && progressbar.component) {
        progressbar.component.disable();
        progressbar.component.setValue(101);
    }
}
    	 	
function startProgress(){
    progressBarCounter = 1;
    //liika klikkailu voi jättää roikkumaan intervalleja
    //joten to be on the safe side...
    clearInterval(progressInterval);
    var progressbar = document.getElementById("toolbarForm:progressBar");
    if(progressbar && progressbar.component) {
        progressbar.component.enable();
        progressbar.component.setValue(1);
    }
    progressInterval = setInterval("updateProgress()",333);
}

function switchTab(pane, tab, label) {
    if (RichFaces.onTabChange(null, pane, tab)) 
        RichFaces.switchTab(pane,tab,label);
}

function panToMarker(lat, lng) {
    if(lat && lng && lat != 200 && lng != 200) {
        map.panTo(new GLatLng(lat,lng));
    }
}

function updateGpsLocal() {
    var posData = document.getElementById("posData");
    posData.src = posDataSrc + count;
    count++;
    updateGpsServer();
}

function addListener(marker, info) {
    GEvent.addListener(marker, "click", function() {
        marker.openInfoWindowHtml(info);
    });
}

function parseStringsToMarkerArray(strings) {
    var markers = new Array();
    for(var i = 0; i < strings.length; i++) {
        var temp = strings[i];
        var lat = temp.substring(0, temp.indexOf("¨"));
        temp = temp.substring(temp.indexOf("¨") + 1);
        var lon = temp.substring(0, temp.indexOf("¨"));
        temp = temp.substring(temp.indexOf("¨") + 1);
        var point = new GLatLng(lat, lon);
        var marker;
        if(temp.length > 1) {
            var icn = temp.substring(0, temp.indexOf("!")); //Icon url
            temp = temp.substring(temp.indexOf("!") + 1);
            var width = temp.substring(0, temp.indexOf("!"));
            temp = temp.substring(temp.indexOf("!") + 1);
            var height = temp.substring(0, temp.indexOf("!"));
            temp = temp.substring(temp.indexOf("!") + 1);
            var x = temp.substring(0, temp.indexOf("!"));
            var y = temp.substring(temp.indexOf("!") + 1);
            var icon = new GIcon();
            icon.image = icn;
            icon.iconSize = new GSize(width, height);
            icon.iconAnchor = new GPoint(parseInt(x),parseInt(y));
            icon.infoWindowAnchor = new GPoint(parseInt(x),parseInt(y));
            marker = new GMarker(point, {
                icon: icon
            });
        }
        else {
            marker = new GMarker(point);
        }
        markers.push(marker);
    }
    return markers;
}

