// Who's on code using google calendar.
// Original code and idea is from :  http://www.techimo.com/forum/webmastering-programming/220354-help-javascript.html

//get the current date into variable WhosOnDate
WhosOnDate = new Date();

function formatGCalDate(gCalTime) {

    var remtxt = gCalTime;

    function consume(retxt) {
        var match = remtxt.match(new RegExp('^' + retxt));
        if (match) {
            remtxt = remtxt.substring(match[0].length);
            return match[0];
        }
        return '';
    }

    var totalCorrMins = 0;

    var year = consume('\\d{4}');
    consume('-?');

    if (year <= 200) {
        year = parseInt(year + 1900);
    }

    var month = consume('\\d{2}');
    consume('-?');
    var dateMonth = consume('\\d{2}');
    var timeOrNot = consume('T');

    if (timeOrNot == 'T') {
        var hours = consume('\\d{2}');
        consume(':?');
        var mins = consume('\\d{2}');
        consume('(:\\d{2})?(\\.\\d{3})?');
        var zuluOrNot = consume('Z');

        if (zuluOrNot != 'Z') {
            var corrPlusMinus = consume('[\\+\\-]');
            if (corrPlusMinus != '') {
                var corrHours = consume('\\d{2}');
                consume(':?');
                var corrMins = consume('\\d{2}');
                totalCorrMins = (corrPlusMinus == '-' ? 1 : -1) * (Number(corrHours) * 60 + (corrMins == '' ? 0 : Number(corrMins)));
            }
        }

        var originalDateEpoch = Date.UTC(year, month - 1, dateMonth, hours, mins);
        var gmtDateEpoch = originalDateEpoch + totalCorrMins * 1000 * 60;
        var ld = new Date(gmtDateEpoch);

    }
    return ld;
}

function formatGCalTime(gCalTime, showDate) {

    /**
    * This is a hack to pass in xs:date or xs:dateTime formatted string and return only MM/DD string
    *
    * @param {string} gCalTime is the xs:date or xs:dateTime formatted string
    * @param {boolean} showDate is if you want the full date or just MM/DD
    * @return {string} is the human-readable date or date/time string 
    */

    var remtxt = gCalTime;
    function consume(retxt) {
        var match = remtxt.match(new RegExp('^' + retxt));
        if (match) {
            remtxt = remtxt.substring(match[0].length);
            return match[0];
        }
        return '';
    }

    var totalCorrMins = 0;
    var year = consume('\\d{4}');
    consume('-?');
    if (year <= 200) {
        year = parseInt(year + 1900);
    }

    var month = consume('\\d{2}');
    consume('-?');
    var dateMonth = consume('\\d{2}');
    var timeOrNot = consume('T');

    if (timeOrNot == 'T') {
        var hours = consume('\\d{2}');
        consume(':?');
        var mins = consume('\\d{2}');
        consume('(:\\d{2})?(\\.\\d{3})?');
        var zuluOrNot = consume('Z');

        if (zuluOrNot != 'Z') {
            var corrPlusMinus = consume('[\\+\\-]');
            if (corrPlusMinus != '') {
                var corrHours = consume('\\d{2}');
                consume(':?');
                var corrMins = consume('\\d{2}');
                totalCorrMins = (corrPlusMinus == '-' ? 1 : -1) * (Number(corrHours) * 60 + (corrMins == '' ? 0 : Number(corrMins)));
            }
        }

        var originalDateEpoch = Date.UTC(year, month - 1, dateMonth, hours, mins);
        var gmtDateEpoch = originalDateEpoch + totalCorrMins * 1000 * 60;
        var ld = new Date(gmtDateEpoch);

        var strDate = ""
        if (showDate == "yes") {
            strDate = (ld.getMonth() + 1) + '/' + (ld.getDate()) + ' - ';
        }
        dateString = strDate + ((ld.getHours() > 12) ? (ld.getHours() - 12) : (ld.getHours() === 0 ? 12 : ld.getHours())) + ':' + ((ld.getMinutes() < 10) ? ('0' + ld.getMinutes()) : (ld.getMinutes())) + ((ld.getHours() >= 12) ? 'pm' : 'am');
    } else {
        dateString = parseInt(month) + '/' + parseInt(dateMonth);
    }

    return dateString;

}

function listEvents(root, divId) {
    document.body.style.cursor = "wait";
    var feed = root.feed;
    var events = document.getElementById(divId);

    if (events) {
        if (events.childNodes.length > 0) {
            events.removeChild(events.childNodes[0]);
        }
    }
    var ul = document.createElement('ul');
    if (feed.entry == null) {
        events.innerHTML = "<center>Sorry no live arb dj shows today!</center>";
    }
    else {
        for (var i = 0; i < feed.entry.length; i++) {
            var entry = feed.entry[i];
            var title = entry.title.$t;
            var skype = entry['gd$where'][0].valueString;
            var start = entry['gd$when'][0].startTime;
            var end = entry['gd$when'][0].endTime;

            // pl_link: I use the description field on the google event to put a URL to the
            // DJ's playlist. If the url is found, it will make the DJ's show name
            // into a hyperlink to there playlist.
            var pl_link = entry.content.$t;

            var startDate = formatGCalDate(start);
            var endDate = formatGCalDate(end);
            var rightNow = new Date();
            var showTime = WhosOnDate;
            var startString = formatGCalTime(start, true);
            var endString = formatGCalTime(end, false);

            var li = document.createElement('p');

            if (typeof pl_link != 'undefined') {
                // pl_link != 'undefined' means that a URL was found in the event
                // so build out the html as a hyperlink
                var bold = document.createElement('b')
                bold.appendChild(document.createTextNode(startString + ' to ' + endString));
                li.appendChild(bold);
                li.appendChild(document.createElement('br'));
                var ison = false;

                if ((startDate < showTime && endDate > showTime) && (rightNow.getDay() == showTime.getDay())) {
                    // we are currently inside the event timewise, so display a little 'on air' image before the name.
                    var newImg = document.createElement('img');
                    newImg.alt = ' On Air';
                    newImg.src = 'onair.gif';
                    newImg.setAttribute('width', '66');
                    newImg.setAttribute('height', '19');
                    li.appendChild(newImg);
                    ison = true;
                }

                entryLink = document.createElement('a');
                entryLink.setAttribute('href', 'http://www.loudcity.com/stations/arb-life-unlimited/files/show/lc_arb_tuner.html');
                entryLink.appendChild(document.createTextNode(title));
                li.appendChild(entryLink);
            } else {
                //wasn't a link so just output DJ's show as text
                li.appendChild(document.createTextNode(startString + ' to ' + endString + '<br>' + title));
            }

            ul.appendChild(li);
        }
        events.innerHTML = "";
        events.appendChild(ul);
    }
    document.body.style.cursor = "default";
}

function insertDJs(root) {
    listEvents(root, 'agenda');
}

function y2k(number) {
    // firefox return years from 1900 not full year
    return (number < 1000) ? number + 1900 : number;
}

function startup() {
    LoadDJList(0);
}

function LoadDJList(direction) {

    var headID = document.getElementsByTagName("head")[0];
    var newScript = document.createElement('script');

    if (direction == 0) WhosOnDate = new Date();
    else WhosOnDate.setDate(WhosOnDate.getDate() + direction);

    var date = WhosOnDate;
    var offset = (date.getHours() * 60) + date.getMinutes() + (date.getTimezoneOffset() - 300);
    var today

    if (offset + date.getTimezoneOffset() >= 0) {
        today = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds()));
    }
    else {
        today = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate() - 1, date.getHours(), date.getMinutes(), date.getSeconds()));
    }

    var strToday = today.getFullYear() + '-' + ((today.getMonth() + 1) < 10 ? '0' : '') + (today.getMonth() + 1) + '-' + (today.getDate() < 10 ? '0' : '') + today.getDate();

    var today2 = today;

    var interval = 1; //Setting the interval as a variable to show its applicability
    var myDate = new Date(today2.getYear(), today2.getMonth(), today2.getDate() - 0 + interval);
    document.getElementById('tomorrow').innerHTML = getDateStr(myDate, false) + " >>";

    interval = -1;
    var myDate = new Date(today2.getYear(), today2.getMonth(), today2.getDate() - 0 + interval);
    document.getElementById('yesterday').innerHTML = "<< " + getDateStr(myDate, false);

    interval = 0;
    var myDate = new Date(today2.getYear(), today2.getMonth(), today2.getDate() - 0 + interval);

    document.getElementById('scheduledate').innerHTML = getDateStr(myDate, true);
    newScript.type = "text/javascript";
    newScript.src = "http://www.google.com/calendar/feeds/rbrequests@gmail.com/public/full?alt=json-in-script&callback=insertDJs&orderby=starttime&max-results=10&singleevents=true&sortorder=ascending&start-min=" + strToday.toString() + "T00:00:00-06:00&start-max=" + strToday.toString() + "T23:59:59-06:00";




    headID.appendChild(newScript);
}

function getDateStr(inDate, showyear) {

    var d_names = new Array("Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat");

    //        alert(navigator.userAgent.toLowerCase().indexOf("msie") == -1);
    if (navigator.userAgent.toLowerCase().indexOf("msie") == -1) {
        d_names = Array("Tue", "Wed", "Thu", "Fri", "Sat", "Sun", "Mon");
    }

    var m_names = new Array("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec");

    var d = new Date();
    var curr_day = inDate.getDay();
    var curr_date = inDate.getDate();
    var sup = "";
    if (curr_date == 1 || curr_date == 21 || curr_date == 31) {
        sup = "st";
    }
    else if (curr_date == 2 || curr_date == 22) {
        sup = "nd";
    }
    else if (curr_date == 3 || curr_date == 23) {
        sup = "rd";
    }
    else {
        sup = "th";
    }
    var curr_month = inDate.getMonth();
    var curr_year = inDate.getFullYear();
    if (curr_year <= 1900) {
        curr_year += 1900;
    }

    var withyear = (d_names[curr_day] + " " + curr_date + "<SUP>" + sup + "</SUP> " + m_names[curr_month] + " " + curr_year);

    var without = (d_names[curr_day] + " " + curr_date + "<SUP>" + sup + "</SUP> " + m_names[curr_month]);

    return (showyear == true) ? withyear : without;

}