var gMap;
var gMarkerManager;
var gUniversities = [];
var gFactPageId = 0
var gStyleTheme;
var gCategories;
var gMapDataServiceUrl;
var content;

var startZoomLevel = 3;
var defaultRegionEndZoomLevel = 10;
var regionSmallEndZoomLevel = 11;

var regions = {
    stockholm: {
        lat: 59.332641,
        lon: 18.030796,
        zoomToLat: 59.291266,
        zoomToLon: 18.020668,
        zoomToLevel: 11,
        id: 1
    },
    gothenburg: {
        lat: 57.684967,
        lon: 11.975098,
        zoomToLat: 57.684967,
        zoomToLon: 11.975098,
        zoomToLevel: 11,
        id: 3
    },
    skane: {
        lat: 55.698434,
        lon: 13.540649,
        zoomToLat: 55.864113,
        zoomToLon: 13.098450,
        zoomToLevel: 8,
        id: 4
    },
    uppsala: {
        lat: 59.8575890,
        lon: 17.6294061,
        zoomToLat: 59.8575890,
        zoomToLon: 17.6294061,
        zoomToLevel: 8,
        id: 5
    },
    umea: {
        lat: 63.819265,
        lon: 20.309624,
        zoomToLat: 63.819265,
        zoomToLon: 20.309624,
        zoomToLevel: 11,
        id: 6
    }
}

function initContent(contentPageId) {
    $.getJSON(gMapDataServiceUrl + "?action=content&pageId=" + contentPageId, function(data) {
        content = data;
    });
}

function initializeMap(infoObj, center, factPageId, mapDataServiceUrl, contentPageId, theme) {
    gMapDataServiceUrl = mapDataServiceUrl;
    initContent(contentPageId);
    //gStyleTheme = 'study';
    gStyleTheme = theme;
    gFactPageId = factPageId;
    gCategories = infoObj.categories;

    if (GBrowserIsCompatible()) {
        gMap = new GMap2(document.getElementById("map_canvas"));

        gMap.setCenter(center, 5);
        gMap.addControl(new NavControl());
        gMap.addControl(new MapTypeControl());
        gMap.savePosition();
        univ.init(function() {
            gMap.addControl(new UniversityList());
            CreateWelcomeBox(infoObj);
            $(".universityInfoLayer").addClass("welcome");
            Plot(gUniversities);
        });
    }

    $("#large-map-wrapper .zoomBtn").click(function(e) {
        redrawMarkers();
    }); 

    $("#reset img").attr("title", infoObj.resetTitle);
}

function redrawMarkers() {
    var universityInfoLayer = $(".universityInfoLayer:first");
    var universityId = $(universityInfoLayer).attr('id');
    var university = findUniversity(universityId);
    CloseInfoLayer(".universityInfoLayer");
    DrawUniversity(university, false);
    $(this).removeClass("regionInfoLayer");
}

univ = {
    init: function(callback) {
        jQuery.getJSON(gMapDataServiceUrl + "?action=list&pageId=" + gFactPageId, function(data) {
            $(data.items).each(function(i, university) {
                gUniversities[gUniversities.length] = university;
                $("#preLoader").append($("<img />").attr("src", university.Logo));
            });
            callback.call();
        });
    },
    getHash: function(url) {
        var m = /#(.*?)$/.exec(url);
        return m === null ? null : m[1];
    }
}


function CreateWelcomeBox(infoObj) {
    var pin = $(document.createElement("p")),
	plus = $(document.createElement("p")),
	infoText = $(document.createElement("DIV"));
    pin.addClass("signDesc").addClass("first").append("<img src=\"/Layout/UniversityMap/images/knappnal_karta.png\" alt=\"\"/><span>" + infoObj.pinText + "</span>");
    plus.addClass("signDesc").append("<img src=\"/Layout/UniversityMap/images/plus_karta.png\" alt=\"\"/><span>" + infoObj.plusText + "</span>");
    infoText.append($("<h2/>").text(infoObj.header))
    .append($("<p/>").text(infoObj.text))
	.append(pin)
	.append(plus);

    var info = new UniversityInfowin(new GLatLng(58, 25), infoText.html(), null);
    gMap.addOverlay(info);
}

///# Json Handling #

function GetJSON(service, callbackFunc, obj) {
    var result;
    $.ajax({
        async: false,
        url: service,
        contentType: "application/json; charset=utf-8",
        dataType: 'json',
        success: function(data) {
            if (obj == undefined) {
                result = callbackFunc(data);
            } else {
                result = callbackFunc(data, obj);
            }
        }
    });
    return result;
}

function ShowUniversityInfo(id, marker, pan, isInRegion, regionId) {

    var markerPoint = gMap.fromLatLngToContainerPixel(marker.getLatLng());

    var html = GetJSON(gMapDataServiceUrl + "?pageId=" + gFactPageId + "&action=univ&itemId=" + id, BuildUniversityInfo, null);

    var universityInfo = new UniversityInfowin(marker.getLatLng(), html, id, false, isInRegion, regionId, true);

    $(universityInfo).attr("id", id);

    gMap.addOverlay(universityInfo);

    var universityId = id.replace("UnivId", "");
    SetupUniversityModules(universityId);    

    var latlng = gMap.fromContainerPixelToLatLng(new GPoint(markerPoint.x, markerPoint.y - 100));
    if (pan) {
        gMap.panTo(latlng);
    }

}
function PeekUniversityInfo(id, marker, multiple, isInRegion, regionId, callback) {

    var markerPoint = gMap.fromLatLngToContainerPixel(marker.getLatLng()), html;

    $.getJSON(gMapDataServiceUrl + "?pageId=" + gFactPageId + "&action=univ&itemId=" + id, function(item) {
        var value = transformObjectToString(item),
		a = $(document.createElement("a"));
        a.text(item.Name);
        a.attr({ "href": "#" + value });
        a.click(function(e) {
            e.preventDefault();
            ShowUniversityInfo(item.Id, marker, false, isInRegion, regionId);
        });
        html = a;
        var universityInfo = new UniversityInfowin(marker.getLatLng(), html, id, multiple, isInRegion, regionId, false);
        gMap.addOverlay(universityInfo);
        universityInfo = universityInfo;
        //pushes everything down to provide space for information window
        var latlng = gMap.fromContainerPixelToLatLng(new GPoint(markerPoint.x, markerPoint.y));
        if (callback != null) {
            callback(item);
        }
    });
}

function ShowRegionInfo(region, marker) {

    var markerPoint = gMap.fromLatLngToContainerPixel(marker.getLatLng());
    var container = $("<div />");
    var currentZoomLevel = gMap.getZoom();

    $(gUniversities).each(function(i, item) {
        var withinregion = false;
        $(item.Locations).each(function(i, location) {
            if (location.Region === region) {
                withinregion = true;
            }
        });
        if (withinregion) { // || (region === 1 && item.Region === 0 && currentZoomLevel < defaultRegionEndZoomLevel && item.Name.indexOf("SÃ¶dertÃ¶rn") > -1)){
            var universitys = $("<div/>").css({ 'padding': '4px', 'border-bottom': 'solid 1px #e8e8e8' }),
			a = $(document.createElement("a"));
            a.text(item.Name);
            a.attr("href", "#" + transformObjectToString(item));
            a.appendTo(universitys);
            universitys.appendTo(container);
        }
    });

    var regionInfo = new UniversityInfowin(marker.getLatLng(), container.html(), "region" + region, true, region, true);
    gMap.addOverlay(regionInfo);
    $(".universityInfoLayer .infowin-content a").click(function(e) {
        e.preventDefault();
        PopUniversityInfo(transformStringToObject(univ.getHash(e.target)));
    });

}

function BuildRegionInfo(data) {

    var container = $("<div />");
    var currentZoomLevel = gMap.getZoom();

    CloseInfoLayer();

    $(data.items).each(function(i, item) {
        if (currentZoomLevel < defaultRegionEndZoomLevel || (currentZoomLevel >= defaultRegionEndZoomLevel && item.Name.indexOf("SÃ¶dertÃ¶rn") < 0)) {
            var university = $("<div/>").css({ 'padding': '4px', 'border-bottom': 'solid 1px #e8e8e8' });

            $("<div />").text(item.Name).appendTo(university);

            AddZoomReadMoreButtons(item, university, "regionInfoBoxButtons", true);

            university.appendTo(container);
        }
    });

    return container.html();
}

function RedrawReadMoreAndRightColumn(item) {
    $("#universityInfoControl .holder").empty();
    $("#sidebar .holder").empty();

    var holderMainBox = $("#readMore");
    var holderFactsBox = $("#facts");
    var name = $("<h2/>").text(item.Name);

    holderMainBox.append($("<a/>").addClass("return-to-map").attr("href", "#").text("Return to map").css({ 'float': 'right' }))
        .append(name.clone())
        .append(item.Description);

    $("a.return-to-map").click(function(e) {
        e.preventDefault();
        $('html').animate({
            scrollTop: $("#map_canvas").offset().top
        }, 500);
    });

    holderMainBox.slideShow(item.SlideShow);

    var quickFactBox = GetQuickFactBox(item);

    CreateTextInfoBox('', quickFactBox.html(), holderFactsBox);

    if (item.TextInformation != '') {
        CreateTextInfoBox('', item.TextInformation, holderFactsBox);
    }

    holderFactsBox.locationList(item.CampusLocations);
}

function GetQuickFactBox(item) {
    var quickFactBox = $("<div />").addClass("quickFacts")
        .append('<div class="fact"><span class="factHeader">' + content["LocationHeader"] + '</span> ' + item.QuickFacts.Location + '</div>')
        .append('<div class="fact"><span class="factHeader">' + content["FoundedHeader"] + '</span> ' + item.QuickFacts.Founded + '</div>')
        .append('<div class="fact"><span class="factHeader">' + content["StudentsHeader"] + '</span> ' + item.QuickFacts.Students + '</div>')
        .append('<div class="fact"><span class="factHeader">' + content["FacultyHeader"] + '</span> ' + item.QuickFacts.Faculty + '</div>')
        .append('<div class="fact"><span class="factHeader">' + content["WebSiteHeader"] + '</span> <a target="_blank" href="http://' + item.QuickFacts.WebSite.Url + '">' + item.QuickFacts.WebSite.Description + '</a></div>')
        .append('<div class="fact"><span class="factHeader">' + content["PhoneHeader"] + '</span> ' + item.QuickFacts.Phone + '</div>');
    return quickFactBox;
}

function BuildUniversityInfo(item) {
    RedrawReadMoreAndRightColumn(item);

    var universityInfoBox = $("<div/>").addClass("universityInfoBoxTextHolder");

    var quickFactBox = GetQuickFactBox(item);

    universityInfoBox
        .append($("<img />")
            .attr("src", item.QuickFacts.Logo)
            .attr("alt", "Logo of " + item.Name)
            .addClass("universityLogo"))
        .append(name)
        .append(quickFactBox);


    AddZoomReadMoreButtons(item, universityInfoBox, "universityInfoBoxButtons", false);

    var html = universityInfoBox.html();

    return html;
}

function GetUniversity(id) {
    var result;
    $.each(gUniversities, function(i, university) {
        if (university.Id == id)
            result = university;
    });
    return result;
}

function getRegion(regionId) {
    var result;
    $.each(regions, function(i, region) {
        if (region.id == regionId) {
            result = region;
        }
    });
    return result;
}

function getZoomLevel(region) {
    var zoomLevel = startZoomLevel;
    if (region === 1 || region === 0 || region === 2) {
        zoomLevel = regions["stockholm"]["zoomToLevel"];
    }
    if (region === 4) {
        zoomLevel = regions["skane"]["zoomToLevel"];
    }
    if (region === 5) {
        zoomLevel = regions["uppsala"]["zoomToLevel"];
    }
    if (region === 6) {
        zoomLevel = regions["umea"]["zoomToLevel"];
    }
    if (region === 3) {
        zoomLevel = regions["gothenburg"]["zoomToLevel"];
    }
    return zoomLevel;
}
function uniqueId(item, coordinate) {
    return item.Id + coordinate.Latitude.toString().replace(".", "_") + coordinate.Longitude.toString().replace(".", "_");
}
function Plot(data) {
    gMarkerManager = new MarkerManager(gMap);
    var timeout;
    $(data).each(function(i, item) {
        $(item.Locations).each(function(j, location) {
            var marker = CreateUniversityMarker(item, location.Latitude, location.Longitude);
            gMarkerManager.addMarker(marker, getZoomLevel(location.Region));
            GEvent.addListener(marker, 'mouseover', function() {
                $("#" + item.Id).mouseover(function() {
                    clearTimeout(timeout);
                });
                if ($("#" + item.Id).length == 0) {
                    PeekUniversityInfo(item.Id, marker, true, true, location.Region);
                }
            });
            GEvent.addListener(marker, 'mouseout', function() {
                if ($("#" + item.Id + " .quickFacts").length === 0) {
                    $("#" + item.Id).mouseover(function() {
                        clearTimeout(timeout);
                    });
                    $("#" + item.Id).mouseout(function() {
                        timeout = setTimeout(function() {
                            CloseInfoLayer("#" + item.Id);
                        }, 400);
                    });
                    timeout = setTimeout(function() {
                        CloseInfoLayer("#" + item.Id);
                    }, 400);
                }
            });
            GEvent.addListener(marker, 'click', function() {
                var university = findUniversity(item.Id);
                DrawSmallCampusMaps(university.Locations);
                ShowUniversityInfo(item.Id, marker, false);
            });
        });
    });
    //stockholm
    var regionMarkerStockholm = CreateRegionMarker(regions["stockholm"]);
    gMarkerManager.addMarker(regionMarkerStockholm, startZoomLevel, regions["stockholm"]["zoomToLevel"]-1);
    GEvent.addListener(regionMarkerStockholm, 'mouseover', function() {
        $("#region1").mouseover(function() {
            clearTimeout(timeout);
        });
        if ($("#region1").length == 0) {
            ShowRegionInfo(1, regionMarkerStockholm);
        }
    });
    GEvent.addListener(regionMarkerStockholm, 'mouseout', function() {
        $("#region1").mouseover(function() {
            clearTimeout(timeout);
        });
        $("#region1").mouseout(function() {
            timeout = setTimeout(function() {
                CloseInfoLayer("#region1");
            }, 400);
        });
        timeout = setTimeout(function() {
            CloseInfoLayer("#region1");
        }, 400);
    });
    GEvent.addListener(regionMarkerStockholm, 'click', function() {
        CloseInfoLayer();
        gMap.setZoom(parseInt(regions["stockholm"]["zoomToLevel"]));
        gMap.panTo(new GLatLng(regions["stockholm"]["zoomToLat"], regions["stockholm"]["zoomToLon"]));
    });
    //gothenburg
    var regionMarkerGothenburg = CreateRegionMarker(regions["gothenburg"]);
    gMarkerManager.addMarker(regionMarkerGothenburg, startZoomLevel, regions["gothenburg"]["zoomToLevel"] - 1);
    GEvent.addListener(regionMarkerGothenburg, 'mouseover', function() {
        $("#region3").mouseover(function() {
            clearTimeout(timeout);
        });
        if ($("#region3").length == 0) {
            ShowRegionInfo(3, regionMarkerGothenburg);
        }
    });
    GEvent.addListener(regionMarkerGothenburg, 'mouseout', function() {
        $("#region3").mouseover(function() {
            clearTimeout(timeout);
        });
        $("#region3").mouseout(function() {
            timeout = setTimeout(function() {
                CloseInfoLayer("#region3");
            }, 400);
        });
        timeout = setTimeout(function() {
            CloseInfoLayer("#region3");
        }, 400);
    });
    GEvent.addListener(regionMarkerGothenburg, 'click', function() {
        CloseInfoLayer();
        gMap.setZoom(parseInt(regions["gothenburg"]["zoomToLevel"]));
        gMap.panTo(new GLatLng(regions["gothenburg"]["lat"], regions["gothenburg"]["lon"]));
    });
    //skane
    var regionMarkerSkane = CreateRegionMarker(regions["skane"]);
    gMarkerManager.addMarker(regionMarkerSkane, startZoomLevel, regions["skane"]["zoomToLevel"] - 1);
    GEvent.addListener(regionMarkerSkane, 'mouseover', function() {
        $("#region4").mouseover(function() {
            clearTimeout(timeout);
        });
        if ($("#region4").length == 0) {
            ShowRegionInfo(4, regionMarkerSkane);
        }
    });
    GEvent.addListener(regionMarkerSkane, 'mouseout', function() {
        $("#region4").mouseover(function() {
            clearTimeout(timeout);
        });
        $("#region4").mouseout(function() {
            timeout = setTimeout(function() {
                CloseInfoLayer("#region4");
            }, 400);
        });
        timeout = setTimeout(function() {
            CloseInfoLayer("#region4");
        }, 400);
    });
    GEvent.addListener(regionMarkerSkane, 'click', function() {
        CloseInfoLayer();
        gMap.setZoom(parseInt(regions["skane"]["zoomToLevel"]));
        gMap.panTo(new GLatLng(regions["skane"]["zoomToLat"], regions["skane"]["zoomToLon"]));
    });

    // uppsala
    // added: 2010-12-14
    // Redmine: #12027
    var regionMarkerUppsala = CreateRegionMarker(regions["uppsala"]);
    gMarkerManager.addMarker(regionMarkerUppsala, startZoomLevel, regions["uppsala"]["zoomToLevel"] - 1);
    GEvent.addListener(regionMarkerUppsala, 'mouseover', function() {
        $("#region5").mouseover(function() {
            clearTimeout(timeout);
        });
        if ($("#region5").length == 0) {
            ShowRegionInfo(5, regionMarkerUppsala);
        }
    });
    GEvent.addListener(regionMarkerUppsala, 'mouseout', function() {
        $("#region5").mouseover(function() {
            clearTimeout(timeout);
        });
        $("#region5").mouseout(function() {
            timeout = setTimeout(function() {
                CloseInfoLayer("#region5");
            }, 400);
        });
        timeout = setTimeout(function() {
            CloseInfoLayer("#region5");
        }, 400);
    });
    GEvent.addListener(regionMarkerUppsala, 'click', function() {
        CloseInfoLayer();
        gMap.setZoom(parseInt(regions["uppsala"]["zoomToLevel"]));
        gMap.panTo(new GLatLng(regions["uppsala"]["zoomToLat"], regions["uppsala"]["zoomToLon"]));
    });


    // umeå
    // added: 2010-12-14
    // Redmine: #12027
    var regionMarkerUmea = CreateRegionMarker(regions["umea"]);
    gMarkerManager.addMarker(regionMarkerUmea, startZoomLevel, regions["umea"]["zoomToLevel"] - 1);
    GEvent.addListener(regionMarkerUmea, 'mouseover', function() {
        $("#region6").mouseover(function() {
            clearTimeout(timeout);
        });
        if ($("#region6").length == 0) {
            ShowRegionInfo(6, regionMarkerUmea);
        }
    });
    GEvent.addListener(regionMarkerUmea, 'mouseout', function() {
        $("#region6").mouseover(function() {
            clearTimeout(timeout);
        });
        $("#region6").mouseout(function() {
            timeout = setTimeout(function() {
                CloseInfoLayer("#region6");
            }, 400);
        });
        timeout = setTimeout(function() {
            CloseInfoLayer("#region6");
        }, 400);
    });

    GEvent.addListener(regionMarkerUmea, 'click', function() {
        CloseInfoLayer();
        gMap.setZoom(parseInt(regions["umea"]["zoomToLevel"]));
        gMap.panTo(new GLatLng(regions["umea"]["zoomToLat"], regions["umea"]["zoomToLon"]));
    });

    gMarkerManager.refresh();
}



///# Helper functions #

function AddUniversities(data, obj) {
    $(data).each(function(i, item) {
        var value = transformObjectToString(item);
        var li = $(document.createElement("li")),
		a = $(document.createElement("a"));
        a.text(item.Name);
        a.attr("href", "#" + value).appendTo(li);
        li.appendTo(obj);
    });
}

function AddZoomReadMoreButtons(item, obj, cssClass, addZoom) {

    var pos = 'left';
    var readMore = "javascript:ReadMore()";
    if (cssClass.indexOf("region") >= 0) {
        readMore = "javascript:ReadMore(true,'" + item.Id + ";" + item.Coordinate[0].Latitude + ";" + item.Coordinate[0].Longitude + "')";
    }

    var div = $("<div />").append($("<a/>").text("Read more")
            .attr("href", readMore)
            .addClass(cssClass));
    if (addZoom) {
        div.append($("<a/>").text("Zoom in")
				.attr("href", "javascript:ZoomIn('" + transformObjectToString(item) + "')")
				.addClass(cssClass)).appendTo(obj);
    } else {
        div.appendTo(obj);
    }
}

function CloseInfoLayer(layerSelector) {

    if (layerSelector == undefined)
        layerSelector = ".universityInfoLayer, .infoLayer";

    $(layerSelector, gMap.getPane(G_MAP_FLOAT_PANE)).remove();
}


function CreateTextInfoBox(header, content, holder) {
    $("<div />").addClass("banner2008").addClass("banner-white")
        .append('<div class="head"><h2>' + header + '</h2></div>')
        .append($("<div/>").addClass("content").append(content))
        .append($("<div/>").addClass("foot"))
    .appendTo(holder);
}

function CreateRegionMarker(region) {

    var data = { name: "", imagePath: '/Layout/UniversityMap/images/plus_karta.png', width: 30, height: 31, hDiff: 15, vDiff: 15 };
    var opt = CreateUniversityMarkerOption(data);
    return new GMarker(new GLatLng(region["lat"], region["lon"]), opt)
}

function CreateUniversityMarker(item, lat, lon) {

    var data = { name: item.Name, imagePath: '/Layout/UniversityMap/images/knappnal_karta.png', width: 16, height: 33, hDiff: 8, vDiff: 3 };

    opt = CreateUniversityMarkerOption(data);

    return new GMarker(new GLatLng(lat, lon), opt);
}


function CreateUniversityMarkerOption(data) {

    var hCenter = data.width - data.hDiff;
    var vCenter = data.height - data.vDiff;

    var uniMarkerIcon = new GIcon();
    uniMarkerIcon.image = data.imagePath;
    uniMarkerIcon.size = new GSize(data.width, data.height);
    uniMarkerIcon.iconAnchor = new GPoint(hCenter, vCenter);
    uniMarkerIcon.infoWindowAnchor = new GPoint(hCenter, 0);

    var opt = {};
    opt.icon = uniMarkerIcon;
    opt.draggable = false;
    opt.clickable = true;
    opt.dragCrossMove = false;
    opt.title = name;

    return opt;
}


function FilterUniversities() {

    var valueArr = [],
    added = [],
	addedId = [],
	plotAll

    $(".universityListHeader .checked input").each(function(index) {
        valueArr.push($(this).attr("value"));
    });
    $('#universitylist li').remove();
    $(gUniversities).each(function(i, university) {
        if (valueArr.length == $(".universityListHeader input").length) {
            var value = transformObjectToString(university),
				li = $(document.createElement("LI")),
				a = $(document.createElement("a"));
            plotAll = true
            a.text(university.Name);
            a.attr("href", "#" + value).appendTo(li);
            li.appendTo($("#universitylist"));
        } else {
            $(valueArr).each(function(y, val) {
                if ($.inArray(val, university.Categories) >= 0 && $.inArray(university["Id"], addedId) === -1) {
                    var value = transformObjectToString(university),
						li = $(document.createElement("LI")),
						a = $(document.createElement("a"));
                    a.text(university.Name);
                    a.attr("href", "#" + value).appendTo(li);
                    li.appendTo($("#universitylist"));
                    addedId.push(university["Id"]);
                    added.push(university);
                }
            });
        }
    });
    gMap.clearOverlays();
    if (plotAll) {
        Plot(gUniversities);
    } else {
        Plot(added);
    }
}

function IsRegion(latlng) {
    is = false;
    $.each(regions, function(i, region) {
        if (latlng.lat() == region["lat"] && latlng.lng() == region["lon"]) {
            is = true;
        }
    });
    return is;
}

function IsString(obj) {
    return typeof obj == 'string';
}

function PopClickedUniversity() {
    var data = $(this).attr("data");

    PopUniversityInfo(data);
}

function PopUniversityInfo(data) {
    ZoomIn(data);
}


function ReadMore(readInformation, data) {

    if (readInformation == undefined) {
        readInformation = false;
    }

    if (readInformation) {
        var dataSet = data.split(";");
        var university = findUniversity(dataSet[0]);
        DrawSmallCampusMaps(university.Locations);
        ShowUniversityInfo(dataSet[0], gMarkerManager.getMarker(dataSet[1], dataSet[2], gMap.getZoom()), true);
    }

    $('html').animate({
        scrollTop: $("#universityListHolder").offset().top
    }, 500);
}

function SetupUniversityModules(universityId) {
    var url = window.location.pathname + "?universityId=" + universityId;
    $.get(url, function(response) {
        var responseWrapper = $("<div/>").append(response.replace(/<script(.|\s)*?\/script>/g, ""));
        var universityModules = responseWrapper.find("#university-modules");
        $("#university-modules").html(universityModules);
    });        
}


function transformStringToObject(value) {

    var splitValue = value.split(";");
    var coordinateData = JSON.parse(unescape(splitValue[3]));

    var data = {
        Id: splitValue[0],
        MapZoomLevel: splitValue[1],
        Category: splitValue[2],
        Locations: coordinateData,
        Name: splitValue[4]
    }

    return data;
}

function transformObjectToString(data) {
    locations = JSON.stringify(data.Locations);

    return data.Id + ";" + data.MapZoomLevel + ";" + data.Category + ";" + locations + ";" + data.Name;
}


function ZoomIn(data) {
    if (data == undefined) {
        return;
    }
    var item = data;
    if (IsString(item)) {
        item = transformStringToObject(data);
    }
    var multiple = false;
    if (item.Locations.length > 1) {
        multiple = true;
    }

    CloseInfoLayer(".universityInfoLayer");

    gMap.setZoom(parseInt(item.MapZoomLevel));
    if (multiple) {
        gMap.returnToSavedPosition()
    }
    DrawUniversity(item);
}

function DrawUniversity(university, doPan) {
    if (doPan == null) {
        doPan = true;
    }
    var multiple = false;
    if (university.Locations.length > 1) {
        multiple = true;
    }
    $(university.Locations).each(function(i, location) {
        var latitude;
        var longitude;
        var isInRegion = location.Region != -1 && getRegion(location.Region) != null;
        var currentZoomLevel = gMap.getZoom();
        var regionSpecificEndZoomLevel = getZoomLevel(location.Region);
        regionSpecificEndZoomLevel = regionSpecificEndZoomLevel;
        if (isInRegion && currentZoomLevel < regionSpecificEndZoomLevel) {
            var region = getRegion(location.Region);
            latitude = region.lat;
            longitude = region.lon;
            isInRegion = true;
        } else {
            latitude = location.Latitude;
            longitude = location.Longitude;
        }
        var marker = gMarkerManager.getMarker(latitude, longitude, university.MapZoomLevel);
        if (multiple && !location.IsHeadCampus) {
            PeekUniversityInfo(university.Id, marker, true, isInRegion, location.Region, RedrawReadMoreAndRightColumn);
        } else {
            if (location.IsHeadCampus) {
                doPan = false;
            }
            ShowUniversityInfo(university.Id, marker, doPan, isInRegion, location.Region);
            if (doPan) {
                gMap.panTo(new GLatLng(university.Locations[0].Latitude, university.Locations[0].Longitude));
            }
        }
    });
}


//# Google Map Controls and Overlays


// #UniversityList#
//
// UniversityList is the control with a list where the user can 
// select university without going into the map 

function UniversityList() { }

UniversityList.prototype = new GControl();

UniversityList.prototype.initialize = function(map) {
    var container = document.createElement("div");

    $(container).attr("class", "universityControl");

    var universityListHeader = $("<div/>").addClass("universityListHeader")
    .html('<h3>' + content["UniversityListHeader"] + '</h3><p>' + content["UniversityListText"] + '</p>')

    var rowWrapper;
    $(gCategories).each(function(i, item) {
        if (i % 2 == 0) {
            rowWrapper = $(document.createElement("div"));
            rowWrapper.addClass("checkbox-wrapper");
            universityListHeader.append(rowWrapper);
        }

        var check = $(document.createElement("input"));
        check.attr({ "type": "checkbox", value: item.value, "id": "chk_" + item.value, "name": "category", "checked": "checked" });
        var label = $(document.createElement("label")).text(item.name).attr("for", "chk_" + item.value).prepend(check);
        label.addClass("checked");
        label.click(function(e) {
            $(this).toggleClass("checked");
            FilterUniversities();
            e.preventDefault();
        });
        rowWrapper.append(label);
    });

    universityListHeader.appendTo(container);


    var univlist = $("<ul />").attr("id", "universitylist");
    univlist.click(function(e) {
        $(this).find(".selected").removeClass("selected");
        $(e.target).addClass("selected")
        var obj = transformStringToObject(univ.getHash(e.target));
        ZoomIn(obj);

        DrawSmallCampusMaps(obj.Locations);

        e.preventDefault();
    });
    AddUniversities(gUniversities, univlist)
    univlist.appendTo(container);
    map.getContainer().appendChild(container);

    return container;
}

UniversityList.prototype.getDefaultPosition = function() {
    return new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(15, 15));
}

UniversityList.prototype.setButtonStyle_ = function(button) {
}

function UniversityInfowin(latlng, html, id, multiple, isInRegion, regionId, isFullInfoWindow) {
    this.latlng_ = latlng;
    this.html_ = html;
    this.prototype = new GOverlay();

    // Creates the DIV representing the infowindow
    this.initialize = function(map) {
        if (!multiple) {
            CloseInfoLayer(".universityInfoLayer");
        }
        var universityInfoLayer = $('<div />').addClass("universityInfoLayer");
        var currentZoomLevel = gMap.getZoom();

        if (isFullInfoWindow) {
            universityInfoLayer.addClass("full-info-window");
        }

        if (regionId != null) {
            var regionSpecificEndZoomLevel = getZoomLevel(regionId);
            regionSpecificEndZoomLevel = regionSpecificEndZoomLevel;

            if (isInRegion && currentZoomLevel < regionSpecificEndZoomLevel) {
                universityInfoLayer.addClass("regionInfoLayer");
            }
        }


        if (id != null) {
            universityInfoLayer.attr("id", id);
        }
        universityInfoLayer.appendTo(map.getPane(G_MAP_FLOAT_PANE))

        this.map_ = map;
        this.div_ = universityInfoLayer;
        this.update(html);
    }

    this.update = function(html) {
        this.html_ = html;

        var content = $('<div/>').addClass('infowin-content').html(html);

        var contentArea = $('<div />').addClass("contentArea");

        $("<a/>").addClass("closeButton")
        .attr('href', 'javascript:CloseInfoLayer(".universityInfoLayer");')
        .append($("<img/>").attr('src', '/Layout/UniversityMap/images/stang_knapp.png'))
        .appendTo(contentArea);

        contentArea.append(content);

        this.div_.append(contentArea);


        this.redraw(true);
    }

    // Remove the main DIV from the map pane
    this.remove = function() {
        this.div_.remove();
    }
    // Copy our data to a new instance
    this.copy = function() {
        return new UniversityInfowin(this.latlng_, this.html_);
    }

    // Redraw based on the current projection and zoom level
    this.redraw = function(force) {
        var height = this.div_.height();

        if (!force) return;

        var point = this.map_.fromLatLngToDivPixel(this.latlng_);
        var pinHeight = IsRegion(this.latlng_) ? 60 : 65;
        var y = point.y - (height + pinHeight);
        var x = point.x - 61;

        this.div_.css({ top: y, left: x });

    }

    this.height = function() {
        return this.div_.height();
    }

}

// #NavControl#
//

function NavControl() {}

NavControl.prototype = new GControl();

NavControl.prototype.initialize = function(map) {
    var container = document.createElement("div");

    $(container).css({ width: 90, height: 200 });

    var controls = [];

    controls[controls.length] = $("<div/>").addClass("controlBtn").attr("id", "up").append('<img src="/Layout/GoogleMaps/Schemes/' + gStyleTheme + '/GoogleControlPanUp.gif" />');
    controls[controls.length] = $("<div/>").addClass("controlBtn").attr("id", "left").append('<img src="/Layout/GoogleMaps/Schemes/' + gStyleTheme + '/GoogleControlPanLeft.gif" />');
    controls[controls.length] = $("<div/>").addClass("controlBtn").attr("id", "reset").append('<img src="/Layout/GoogleMaps/Schemes/' + gStyleTheme + '/GoogleControlReset.gif" />');
    controls[controls.length] = $("<div/>").addClass("controlBtn").attr("id", "right").append('<img src="/Layout/GoogleMaps/Schemes/' + gStyleTheme + '/GoogleControlPanRight.gif" />');
    controls[controls.length] = $("<div/>").addClass("controlBtn").attr("id", "down").append('<img src="/Layout/GoogleMaps/Schemes/' + gStyleTheme + '/GoogleControlPanDown.gif" />');
    var state = ['both', 'left', 'none', 'right'];

    var actions = [];
    actions[actions.length] = function() { map.panDirection(0, 1); };
    actions[actions.length] = function() { map.panDirection(1, 0); };
    actions[actions.length] = function() { map.returnToSavedPosition(); };
    actions[actions.length] = function() { map.panDirection(-1, 0); };
    actions[actions.length] = function() { map.panDirection(0, -1); };

    $(controls).each(function(i) {
        var current = $(controls[i]);
        current.hover(function(e) {
            substituteImage(this, $.browser.msie ? e.target : e.currentTarget, ".gif", "_Hover.gif");
        }, function(e) {
            substituteImage(this, $.browser.msie ? e.target : e.currentTarget, "_Hover.gif", ".gif");
        });
        current.click(actions[i]);
        current.css({
            'padding-left': i < 1 || i > 3 ? 24 : 0
        });

        current.appendTo(container);
        if (i < 1 || i > 2)
            $("<br/>").appendTo(container);

    });

    map.getContainer().appendChild(container);
    map.addControl(new ZoomControl());

    return container;
}

NavControl.prototype.getDefaultPosition = function() {
    return new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(826, 44));
}

NavControl.prototype.setButtonStyle_ = function(button) {
}


function ZoomControl() {}

ZoomControl.prototype = new GControl();

ZoomControl.prototype.initialize = function(map) {
    var container = document.createElement("div");

    $(container).css({ width: 90, height: 200 });

    var controls = [];

    controls[controls.length] = $("<div/>").addClass("controlBtn zoomBtn").attr("id", "zIn").append('<img src="/Layout/GoogleMaps/Schemes/' + gStyleTheme + '/GoogleControlZoomIn.gif" />');
    controls[controls.length] = $("<div/>").addClass("controlBtn zoomBtn").attr("id", "zOut").append('<img src="/Layout/GoogleMaps/Schemes/' + gStyleTheme + '/GoogleControlZoomOut.gif" />');
    var state = ['both', 'left', 'none', 'right'];

    var actions = [];
    actions[actions.length] = function() { map.zoomIn(); };
    actions[actions.length] = function() { map.zoomOut(); };

    $(controls).each(function(i) {
        var current = $(controls[i]);
        current.hover(function(e) {
            substituteImage(this, $.browser.msie ? e.target : e.currentTarget, ".gif", "_Hover.gif");
        }, function(e) {
            substituteImage(this, $.browser.msie ? e.target : e.currentTarget, "_Hover.gif", ".gif");
        });
        current.click(actions[i]);

        current.appendTo(container);
    });

    map.getContainer().appendChild(container);
    
    return container;
}


// #MapTypeControl#
//

function MapTypeControl() { }

MapTypeControl.prototype = new GControl();

MapTypeControl.prototype.initialize = function(map) {
    var container = document.createElement("div");

    $(container).css({ width: 250 });

    var controls = [];

    controls[controls.length] = $("<div/>").addClass("controlBtn").attr("id", "normal").append('<img src="/Layout/GoogleMaps/Schemes/' + gStyleTheme + '/GoogleControlMap.png" />');
    controls[controls.length] = $("<div/>").addClass("controlBtn").attr("id", "satellite").append('<img src="/Layout/GoogleMaps/Schemes/' + gStyleTheme + '/GoogleControlSatellite.png" />');
    controls[controls.length] = $("<div/>").addClass("controlBtn").attr("id", "hybrid").append('<img src="/Layout/GoogleMaps/Schemes/' + gStyleTheme + '/GoogleControlHybrid.png" />');

    var actions = [];
    actions[actions.length] = function() { map.setMapType(G_NORMAL_MAP); };
    actions[actions.length] = function() { map.setMapType(G_SATELLITE_MAP); };
    actions[actions.length] = function() { map.setMapType(G_HYBRID_MAP); };

    $(controls).each(function(i) {
        var current = $(controls[i]);
        current.hover(function(e) {
            substituteImage(this, $.browser.msie ? e.target : e.currentTarget, ".png", "_Hover.png");
        }, function(e) {
            substituteImage(this, $.browser.msie ? e.target : e.currentTarget, "_Hover.png", ".png");
        });
        current.click(actions[i]);

        current.appendTo(container);
    });


    map.getContainer().appendChild(container);

    return container;
}

MapTypeControl.prototype.getDefaultPosition = function() {
    return new GControlPosition(G_ANCHOR_TOP_RIGHT, new GSize(7, 14));
}

MapTypeControl.prototype.setButtonStyle_ = function(button) {
}
function substitute(src, find, substitution) {
    var index = src.indexOf(find);

    if (index < 0)
        return src;

    return src.substring(0, index) + substitution;
}

function substituteImage(me, target, find, substitution) {
    var image = $("img", target);
    if ($(target).attr("id") == $(me).attr("id")) {
        var src = substitute(image.attr("src"), find, substitution);
        image.attr("src", src);
    }
}

function findUniversity(universityId) {
    var result;
    $.each(gUniversities, function(index, university) {
        if (university.Id == universityId) {
            result = university;
        }
    });
    return result;
}

///#jQuery addon
var slideIntervalId = -1;
function changeSlide() {
    var nextSlideShowControl = $("#slideShowControl .selected").next();
    if (!nextSlideShowControl.hasClass("slideShowItem")) {
        nextSlideShowControl = $(".slideShowItem:first");
    }
    $("#slideShowControl .selected").removeClass("selected");
    nextSlideShowControl.addClass("selected");
    var src = nextSlideShowControl.attr("src");
    if ($("img.slide:visible").attr("src") !== src) {
        $("img.slide").fadeOut("slow");
        $("img.slide[src='" + src + "']").fadeIn("slow");
    }
}

function stopAutoplay() {
    window.clearInterval(slideIntervalId);
    $("#autoplayButton").removeClass("started");
    $("#autoplayButton").addClass("stopped");
}

function DrawSmallCampusMaps(locations) {
    $("#right-column-map-canvas .content").empty();
    $("#right-column-map-canvas").show();
    $(locations).each(function(i, location) {
        var gLatLng = new GLatLng(location.Latitude, location.Longitude);
        DrawSmallCampusMap(gLatLng, i);
    });
}

function DrawSmallCampusMap(gLatLng, campusId) {
    if (GBrowserIsCompatible()) {
        var container = document.createElement("div");
        var Id = "right-column-map-canvas-" + campusId;
        container.id = Id;
        $(container).addClass("small-map");
        $("#right-column-map-canvas .content").append(container);

        smallMap = new GMap2(container);
        smallMap.addControl(new ZoomControl());
        smallMap.setCenter(gLatLng, 14);
        smallMap.addOverlay(new GMarker(gLatLng));
    }
}

if (jQuery) (function() {
    $.extend($.fn, {
        slideShow: function(images) { // images, array of objects with a description and url to the image, in code [{Description:'Text',Url:'/upload/test.gif'} ... ]
            window.clearInterval(slideIntervalId);
            if (images.length > 0) {
                $(this).each(function(i, el) {
                    var slideShowHolder = $("<div/>").attr("id", "slideShowHolder");

                    var slideShowControl = $("<div />").attr("id", "slideShowControl");

                    $(images).each(function(i, image) {
                        slideShowControl.addControl(image);

                        slideShowHolder.addSlide(image);
                    });

                    slideShowHolder.addStartStopControl();

                    $(".slideShowItem", slideShowControl).click(function(e) {
                        stopAutoplay();
                        $(".selected", slideShowControl).removeClass("selected");
                        $(this).addClass("selected");
                        var src = $(this).attr("src");
                        if ($("img.slide:visible").attr("src") !== src) {
                            $("img.slide").fadeOut("slow");
                            $("img.slide[src='" + src + "']").fadeIn("slow");
                        }
                    });

                    $(slideShowHolder).hover(
                        function(e) {
                            $("#slideShowHolder").addClass("hover-selected");
                        },
                        function(e) {
                            $("#slideShowHolder").removeClass("hover-selected");
                        }
                    );

                    $(el).append(slideShowHolder.append(slideShowControl));
                    $("img.slide:first").fadeIn("def");
                    $(".slideShowItem:first", slideShowControl).addClass("selected");
                });
                slideIntervalId = window.setInterval(changeSlide, 5000);
            }
        },

        locationList: function(locations) {
            if (locations.length > 0)
                $(this).each(function(i, el) {
                    var locationHolder = $("<div />").addClass("banner2008").addClass("banner-white");
                    $("<div />").addClass("head").append($("<h2/>").text("Campus")).appendTo(locationHolder);
                    var locationContent = $("<div />").addClass("content");
                    $(locations).each(function(i, location) {
                        locationContent.addLocation(location);
                    });
                    locationContent.appendTo(locationHolder);
                    $("<div />").addClass("foot").appendTo(locationHolder);
                    locationHolder.appendTo($(el));
                });
        },

        addSlide: function(imageData) {
            $(this).each(function() {
                $("<img />").addClass("slide")
                .attr("alt", imageData.Description)
                .attr("src", imageData.Url)
                .hide()
                .appendTo($(this));
            });
        },

        toggleAutoplay: function() {
            if ($(this).hasClass("stopped")) {
                changeSlide();
                slideIntervalId = window.setInterval(changeSlide, 5000);
                $(this).removeClass("stopped");
                $(this).addClass("started");
            } else {
                stopAutoplay();
            }
        },

        addStartStopControl: function() {
            var autoplayButton = $("<div />").attr("id", "autoplayButton").addClass("started").click(this.toggleAutoplay);
            var autoplayArrow = $("<div />").attr("id", "autoplayArrow");
            autoplayButton.append(autoplayArrow);
            $(this).append(autoplayButton);
        },

        addControl: function(controlData) {
            $(this).each(function() {
                $("<div />").addClass("slideShowItem")
                    .attr("src", controlData.Url)
                    .html("&nbsp;")
                    .appendTo($(this));
            });
        },

        addLocation: function(locationData) {
            var me = $(this);
            $("<h3/>").text(locationData.Description).appendTo(me);
            $("<img />")
                .attr("src", locationData.Url)
                .attr("alt", locationData.Description)
                .appendTo(me);
        }
    });
})(jQuery);
