var days = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
var daysAbbr = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];
var lat = 41.7927;
var lon = -87.593;
var map;
var overlays = {};
function $(id) {
    return document.getElementById(id);
}
function updateTime(now) {
// $('day').innerHTML = days[now.getDay()];
//    $('time').innerHTML = formatTime(now);
    for (var i=0;i<routes.length;i++) {
        if (isRunning(routes[i], now)) {
            $('bus_'+routes[i]+'_label').style.color = '#000';
        } else {
            $('bus_'+routes[i]+'_label').style.color = '#aaa';
        }
    }
}
function isWeeHour(hour, minute) {
    return (hour < 6 || (hour == 6 && minute < 30));
}
function effectiveDOW(time) {
    var hour = time.getHours();
    var minute = time.getMinutes();
    var day = time.getDay();
    if (isWeeHour(hour, minute)) {
        day = ((day + 6) % 7);
    }
    return day;
}
function effectiveHour(hour, minute) {
    if (isWeeHour(hour, minute)) {
        return hour + 24;
    }
    return hour;
}
function isRunning(routeNum, time) {
    var route = routeNum;
    if (routeNum == '170') {
        if (time.getHours() > 12) {
            route = '170 PM';
        } else {
            route = '170 AM';
        }
    }
    var minute = time.getMinutes();
    var hour = effectiveHour(time.getHours(), minute);
    var day = effectiveDOW(time);
    var todaysSchedule = schedule[route]['schedule'][day];
    var startTime;
    var endTime;
    for (var i=0; i<todaysSchedule.length; i++) {
        if (todaysSchedule[i].match(/(\d+:\d\d [ap]\.m\.) - (\d+:\d\d [ap]\.m\.)/)) {
            if (!startTime) {
                startTime = RegExp.$1;
            }
            endTime = RegExp.$2;
        }
    }
    if (startTime && endTime) {
        startHourMin = parseTime(startTime);
        endHourMin = parseTime(endTime);
        startHourMin.hour = effectiveHour(startHourMin.hour, startHourMin.minute);
        endHourMin.hour = effectiveHour(endHourMin.hour, endHourMin.minute);
        return timeGreaterThanOrEqualTo(hour, minute, effectiveHour(startHourMin.hour, startHourMin.minute), startHourMin.minute)
            && timeGreaterThanOrEqualTo(effectiveHour(endHourMin.hour, endHourMin.minute), endHourMin.minute, hour, minute);
    }
    return false;
}
function addOffsetToTime(time, offset) {
    offset = parseInt(offset);
    time.minute += offset;
    while (time.minute > 60) {
        time.minute -= 60;
        time.hour++;
    }
    time.hour %= 24;
    return time;
}
function addOffsetToTimeRange(range, offset) {
    if (range.match(/(\d+:\d+ [ap]\.m\.) - (\d+:\d+ [ap]\.m\.) every (\d+)/)) {
        var start = RegExp.$1;
        var end = RegExp.$2;
        var interval = RegExp.$3;
        var newStart = addOffsetToTime(parseTime(start), offset);
        var newEnd = addOffsetToTime(parseTime(end), offset);
        return formatHourMin(newStart.hour, newStart.minute) + " - " + 
            formatHourMin(newEnd.hour, newEnd.minute) + " every "+interval;
    }
    return range;
}
function doshit() {
    updateWeather();
    var now = new Date();
    updateTime(now);
    if (GBrowserIsCompatible()) {
        map = new GMap2($("map"), { mapTypes: [ G_PHYSICAL_MAP ] });
        map.setCenter(new GLatLng(lat, lon), 15);
        map.addControl(new GLargeMapControl());
        GEvent.addListener(map, 'click', function(overlay) {
                if (overlay.schedule) {
                var time = new Date();
                var dow = effectiveDOW(time);
                var scheduleHTML = '';
                scheduleHTML += '<b>'+overlay.routeName+" - "+overlay.stopName+"</b><br /><br />";
                scheduleHTML += days[dow]+"'s schedule: <br />";
                if (overlay.schedule[dow].length > 0) {
                for (var i=0; i<overlay.schedule[dow].length; i++) {
                scheduleHTML += addOffsetToTimeRange(overlay.schedule[dow][i], overlay.stopOffset) + " mins<br />";
                }
                } else {
                scheduleHTML += "No buses running today";
                }
                var windowOpts = {};
                if (overlay.getIcon().infoWindowAnchor) {
                windowOpts.pixelOffset = new GSize(
                    overlay.getIcon().infoWindowAnchor.x - overlay.getIcon().iconAnchor.x,
                    overlay.getIcon().infoWindowAnchor.y - overlay.getIcon().iconAnchor.y);
                }
                map.openInfoWindowHtml(overlay.getLatLng(), scheduleHTML, windowOpts);
                }
        });
        var checked_one;
        for (var i=0;i<routes.length;i++) {
            if (isRunning(routes[i], now) && !checked_one) {
                $('bus_'+routes[i]).checked = true;
                loadRoute(routes[i]);
                checked_one = true;
            }
        }
        setTimeout('update()', 60 * 1000);
    } else {
        alert("Your browser does not support the Unofficial UofC Bus Map");
    }
}
function update() {
    var now = new Date();
    updateTime(now);
    setTimeout('update()', 60 * 1000);
}
function iconURL(which, color) {
    return "markers/arrows/"+which+"-"+color+".png";
}
function iconTransparentURL(which) {
    return "markers/templates/"+which+"-transparent.png";
}
function loadRoute(routeNum) {
    var now = new Date();
    var route = routeNum;
    map.clearOverlays();
    if (routeNum == '170') {
        if (now.getHours() > 12) {
            route = '170 PM';
        } else {
            route = '170 AM';
        }
    }
    var mySchedule = schedule[route];
    if (!overlays[route]) {
        var points = [];
        for (var i=0; i<mySchedule['route'].length; i++) {
            points.push(new GLatLng(mySchedule['route'][i]['lat'], mySchedule['route'][i]['lng']));
        }
        overlays[route] = {};
        overlays[route]['route'] = new GPolyline(points, '#'+mySchedule['color'], 4, 0.55);

        var arrows = ['up', 'down', 'left', 'right'];
        for (var i=0; i<arrows.length; i++) {
            overlays[route][arrows[i]] = new GIcon();
            overlays[route][arrows[i]].image = iconURL(arrows[i], mySchedule['color']);
            overlays[route][arrows[i]].transparent = iconTransparentURL(arrows[i]);
        }
        overlays[route]['up'].iconSize = new GSize(16, 53);
        overlays[route]['up'].iconAnchor = new GPoint(8, 52);
        overlays[route]['up'].infoWindowAnchor = new GPoint(6, 1);
        overlays[route]['up'].imageMap = 
            [ 5,0, 15,18, 11,18, 13,32, 13,46, 10,47, 11,52,
            4,52, 5,47, 1,47, 4,18, 0,17, 0,14, 4,0 ];

        overlays[route]['down'].iconSize = new GSize(16, 53);
        overlays[route]['down'].iconAnchor = new GPoint(8, 52);
        overlays[route]['down'].infoWindowAnchor = new GPoint(14, 1);
        overlays[route]['down'].imageMap = 
            [ 3,0, 13,0, 11,30, 15,30, 10,52, 4,52, 4,39, 0,30, 3,29, 2,13 ];

        overlays[route]['left'].iconSize = new GSize(48, 29);
        overlays[route]['left'].infoWindowAnchor = new GPoint(28, 2);
        overlays[route]['left'].iconAnchor = new GPoint(24, 28);
        overlays[route]['left'].imageMap =
            [ 17,0, 17,3, 25,2, 47,2, 47,14, 28,12, 28,28, 21,28, 21,11,
            18,11, 17,15, 0,11, 0,9, 16,0 ];

        overlays[route]['right'].iconSize = new GSize(48, 29);
        overlays[route]['right'].infoWindowAnchor = new GPoint(23, 4);
        overlays[route]['right'].iconAnchor = new GPoint(22, 28);
        overlays[route]['right'].imageMap =
            [ 31,0, 47,9, 29,15, 29,11, 25,11, 25,28, 19,28,
            19,12, 0,14, 0,2, 29,2, 29,2 ];
    }
    map.addOverlay(overlays[route]['route']);
    for (var i=0; i<mySchedule['stops'].length; i++) {
        var stop = mySchedule['stops'][i];
        var marker = new GMarker(new GLatLng(stop['lat'], stop['lng']),
                { 'icon': overlays[route][stop['icon']], 'title': stop['name'] })
        marker.schedule = mySchedule['schedule'];
        marker.stopName = stop['name'];
        marker.stopOffset = stop['offset'];
        if (routeNum.match(/^\d+/)) {
            marker.routeName = "CTA "+routeNum;
        } else {
            marker.routeName = routeNum;
        }
        map.addOverlay(marker);
    }
}


