var currentDate, currentYear, currentTarget, openDate;

function openCalendar(imgId, target, callback)
{
    var date = new Date();
    var y, m, d;

    var value = document.getElementById(target).value;
    if (value.indexOf('-') != -1) {
        d = value.substring(0, value.indexOf('-'));
        value = value.substring(value.indexOf('-') + 1);
    }
    if (value.indexOf('-') != -1) {
        m = value.substring(0, value.indexOf('-'));
        value = value.substring(value.indexOf('-') + 1);
    }
    y = value;

    if (y && m && d) {
        date = new Date(y, m - 1, d);
    }

    openDate = date.getTime();
    openGoto(openDate, imgId, target, callback);
}

function openGoto(timestamp, imgId, target, callback)
{
    var row, cell, img, link, days;

    currentTarget = target;

    var d = new Date(timestamp);
    currentDate = d;
    var month = d.getMonth();
    currentYear = d.getYear();
    if (currentYear < 1900) {
        currentYear += 1900;
    }
    var firstOfMonth = new Date(currentYear, month, 1);
    var diff = firstOfMonth.getDay() - 1;
    if (diff == -1) {
        diff = 6;
    }
    switch (month) {
    case 3:
    case 5:
    case 8:
    case 10:
        days = 30;
        break;

    case 1:
        if (currentYear % 4 == 0 && (currentYear % 100 != 0 || currentYear % 400 == 0)) {
            days = 29;
        } else {
            days = 28;
        }
        break;

    default:
        days = 31;
        break;
    }

    var wdays = [
        'Mo',
        'Tu',
        'We',
        'Th',
        'Fr',
        'Sa',
        'Su'
    ];
    var months = [
        'January',
        'February',
        'March',
        'April',
        'May',
        'June',
        'July',
        'August',
        'September',
        'October',
        'November',
        'December'
    ];

    var div = document.getElementById('goto');
    if (div.firstChild) {
        div.removeChild(div.firstChild);
    }

    var table = document.createElement('TABLE');
    var thead = document.createElement('THEAD');
    var tbody = document.createElement('TBODY');
    table.appendChild(thead);
    table.appendChild(tbody);
    table.className = 'stdtable calendarPopup';
    table.cellSpacing = 0;

    // Title bar.
    row = document.createElement('TR');
    row.style.backgroundColor = '#f1ffdb';
    cell = document.createElement('TD');
    cell.colSpan = 7;
    cell.className = 'rightAlign';
    link = document.createElement('A');
    link.href = '#';
    link.onclick = function()
    {
        var div = document.getElementById('goto');
        div.style.display = 'none';
        if (div.firstChild) {
            div.removeChild(div.firstChild);
        }
        var iefix = document.getElementById('goto_iefix');
        if (iefix) {
            iefix.style.display = 'none';
        }
        return false;
    }
    link.appendChild(document.createTextNode('x'));
    cell.appendChild(link);
    row.appendChild(cell);
    thead.appendChild(row);

    // Year.
    row = document.createElement('TR');
    row.style.backgroundColor = '#f1ffdb';
    cell = document.createElement('TD');
    link = document.createElement('A');
    link.href = '#';
    link.innerHTML = '<img style="float:right" src="images/left-2-arrow.png" alt="&lt;" />';
    link.onclick = function()
    {
        newDate = new Date(currentYear - 1, currentDate.getMonth(), 1);
        openGoto(newDate.getTime(), imgId, currentTarget, callback);
        return false;
    }
    cell.appendChild(link);
    row.appendChild(cell);

    cell = document.createElement('TD');
    cell.className = 'colheader';
    cell.style.border = 'none';
    cell.colSpan = 5;
    cell.align = 'center';
    var y = document.createTextNode(currentYear);
    cell.appendChild(y);
    row.appendChild(cell);

    cell = document.createElement('TD');
    link = document.createElement('A');
    link.href = '#';
    link.innerHTML = '<img style="float:left" src="images/right-2-arrow.png" alt="&gt;" />';
    link.onclick = function()
    {
        newDate = new Date(currentYear + 1, currentDate.getMonth(), 1);
        openGoto(newDate.getTime(), imgId, currentTarget, callback);
        return false;
    }
    cell.appendChild(link);
    cell.className = 'rightAlign';
    row.appendChild(cell);
    thead.appendChild(row);

    // Month name.
    row = document.createElement('TR');
    row.className = 'colheader';
    cell.style.border = 'none';
    row.style.backgroundColor = '#f1ffdb';
    cell = document.createElement('TD');
    link = document.createElement('A');
    link.href = '#';
    link.innerHTML = '<img style="float:right" src="images/left-1-arrow.png" alt="&lt;" />';
    link.onclick = function()
    {
        var newMonth = currentDate.getMonth() - 1;
        var newYear = currentYear;
        if (newMonth == -1) {
            newMonth = 11;
            newYear -= 1;
        }
        newDate = new Date(newYear, newMonth, 1);
        openGoto(newDate.getTime(), imgId, currentTarget, callback);
        return false;
    }
    cell.appendChild(link);
    row.appendChild(cell);

    cell = document.createElement('TD');
    cell.className = 'colheader';
    cell.colSpan = 5;
    cell.align = 'center';
    var m = document.createTextNode(months[month]);
    cell.appendChild(m);
    row.appendChild(cell);

    cell = document.createElement('TD');
    cell.className = 'rightAlign';
    link = document.createElement('A');
    link.href = '#';
    link.innerHTML = '<img style="float:left" src="images/right-1-arrow.png" alt="&gt;" />';
    link.onclick = function()
    {
        newDate = new Date(currentYear, currentDate.getMonth() + 1, 1);
        openGoto(newDate.getTime(), imgId, currentTarget, callback);
        return false;
    }
    cell.appendChild(link);
    row.appendChild(cell);
    thead.appendChild(row);

    // Weekdays.
    row = document.createElement('TR');
    row.className = 'rowheader';
    for (var i = 0; i < 7; ++i) {
        cell = document.createElement('TD');
        cell.className = 'rowheader';
        cell.style.padding = '0';
        cell.style.textAlign = 'center';
        cell.style.width = 100 / 7 + "%";
        weekday = document.createTextNode(wdays[i]);
        cell.appendChild(weekday);
        row.appendChild(cell);
    }
    thead.appendChild(row);

    // Rows.
    var week, italic;
    var count = 1;
    var today = new Date();
    var open = new Date(openDate);
    var openYear = open.getYear();
    if (openYear < 1900) {
        openYear += 1900;
    }
    var thisYear = today.getYear();
    if (thisYear < 1900) {
        thisYear += 1900;
    }

    for (var i = 1; i <= days; ++i) {
        if (count == 1) {
            row = document.createElement('TR');
        }
        if (i == 1) {
            for (var j = 0; j < diff; ++j) {
                cell = document.createElement('TD');
                row.appendChild(cell);
                ++count;
            }
        }
        cell = document.createElement('TD');
        cell.style.width = 100 / 7 + "%";
        if (thisYear == currentYear &&
            today.getMonth() == month &&
            today.getDate() == i) {
            cell.className = 'today';
        }
        if (thisYear == openYear &&
            open.getMonth() == month &&
            open.getDate() == i) {
            if (cell.className.length) {
                cell.className += ' current';
            } else {
                cell.className = 'current';
            }
        }

        link = document.createElement('A');
        cell.appendChild(link);

        link.href = i;
        link.onclick = function()
        {
            var day = this.href;
            while (day.indexOf('/') != -1) {
                day = day.substring(day.indexOf('/') + 1);
            }

            document.getElementById(currentTarget).value = day + '-' + (currentDate.getMonth() + 1) + '-' + currentYear;

            var div = document.getElementById('goto');
            div.style.display = 'none';
            if (div.firstChild) {
                div.removeChild(div.firstChild);
            }
            var iefix = document.getElementById('goto_iefix');
            if (iefix) {
                iefix.style.display = 'none';
            }

            if (callback) {
                if (typeof callback != 'function') {
                    callback = new Function(callback);
                }
                callback();
            }

            return false;
        }

        day = document.createTextNode(i);
        link.appendChild(day);

        row.appendChild(cell);
        if (count == 7) {
            tbody.appendChild(row);
            count = 0;
        }
        ++count;
    }
    if (count > 1) {
        for (var i = count; i <= 7; ++i) {
            cell = document.createElement('TD');
            row.appendChild(cell);
        }
        tbody.appendChild(row);
    }

    div.appendChild(table);
    div.style.display = '';
    div.style.position = 'absolute';
    div.style.visibility = 'visible';

    // Position the popup every time in case of a different input,
    // window sizing changes, etc.
    var el = document.getElementById(imgId);
    var p = getAbsolutePosition(el);

    if (p.x + div.offsetWidth > document.body.offsetWidth) {
        div.style.left = (document.body.offsetWidth - 10 - div.offsetWidth) + 'px';
    } else {
        div.style.left = p.x + 'px';
    }
    if (p.y + div.offsetHeight > document.body.offsetHeight) {
        div.style.top = (document.body.offsetHeight - 10 - div.offsetHeight) + 'px';
    } else {
        div.style.top = p.y + 'px';
    }

}

function getAbsolutePosition(el)
{
    var r = {x: el.offsetLeft, y: el.offsetTop};
    if (el.offsetParent) {
        var tmp = getAbsolutePosition(el.offsetParent);
        r.x += tmp.x;
        r.y += tmp.y;
    }
    return r;
}

function setSelectValue(select, value)
{
    select.value = value;
    if (select.value != value) {
        for (var i = 0; i < select.options.length; ++i) {
            if (select.options[i].value == value) {
                select.selectedIndex = i;
                return true;
            }
        }
    }

    return false;
}
