var weekdays = $A(['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']);
var fullWeekdays = $A(['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']);
var daytimes = $A(['morning', 'noon', 'evening']);
var freqToDwmX = { 'daily': '0px', 'weekly': '-20px', 'monthly': '-40px' };
var freqToDays = { 'daily': 1, 'weekly': 7, 'monthly': 30 };
var frequencies = $A(['daily', 'weekly', 'monthly']);
var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];

function validateTime(t) {
    if (t == '')
        return '';
    m = t.match(/^(\d\d)[:]?(\d\d)$/);
    if (!m) {
        alert('Please enter valid time, or leave empty');
        return null;
    }
    var res = null;
    try {
        var h = parseInt(m[1], 10);
        var mn = parseInt(m[2], 10);
        if (!(h < 0 || h > 23 || mn < 0 || mn> 59))
            res = m[1] + ':' + m[2];
    } catch(e) {}
    if (!res) {
        alert('Time is invalid: "' + t + '"');
        return null;
    }
    return res;
}
function checkNewTask(id, e) {
    v = $(id).value;
    if (v == '') {
        alert("You must fill out the task name");
        return false;
    }
    var form = Event.extend(e).element();
    var selecttime = form.down('.selecttime');
    if (selecttime) {
        var inp = selecttime.down('input');
        var t = validateTime(inp.value);
        if (!t)
            return false;
        inp.value = t;
    }
    if ($('advancednote').innerHTML.match('^Additional text'))
        $('advancednote').innerHTML = '';
    return true;
}

var elementNowEdited = null;
var parentOfDwmSelect = null;
var savedNextReminder = '';
var savedReminderTime = '';
var savedScrollPosition = 0;
var currentAlltdMouseOver = null;
var isScwLoaded = false;
var currentYellowBox = null;
var tzoffset = String((new Date()).getTimezoneOffset());
var currentSharetask = null;
var closingSharetaskdlg = false;
var openingSharetaskdlg = false;

function stopEvent(e) {
    Event.extend(e).stop();
}

function alltdClearHover(alltd) {
    alltd.style.borderColor = 'transparent';
    alltd.style.backgroundColor = '';
    alltd.style.cursor = '';
    alltd.firstDescendant().style.display = 'none';
    currentAlltdMouseOver = null;
}

function closeTaskEditor(element) {
    if (element == null) {
        return false;
    }
    element.down('p').show();
    element.down('.rightside').style.display = 'block';
    var followers = element.down('div.followers');
    if (followers)
        followers.show();
    var editboxdiv = $('taskeditor');
    element.removeChild(editboxdiv);
    editboxdiv.hide();
    $('taskeditorplace').appendChild(editboxdiv);
    element.style.borderColor = '';
    elementNowEdited = null;
    return false;
}

var currentNoteboxObserver = null;

function dateToDateString(d) {
    return d.getDate().toString() + ' ' + months[d.getMonth()] + ' ' + d.getFullYear().toString();
}
function dateToTimeString(d) {
    var hours = d.getHours().toString();
    if (hours.length == 1)
        hours = '0' + hours
    var minutes = d.getMinutes().toString();
    if (minutes.length == 1)
        minutes = '0' + minutes
    return hours + ':' + minutes;
}

function dateFromDateString(d) {
    var m = d.match(/(\d+)\s+(...)\s+(\d+)/);
    var newDate = new Date(parseInt(m[3]), months.indexOf(m[2]), parseInt(m[1], 10));
    return newDate;
}

function getFullWeekday(d) {
    return fullWeekdays[(d.getDay()+6) % 7];
}

function editClicked(element) {
    if (elementNowEdited == element)
        return false;
    if (elementNowEdited != null)
        closeTaskEditor(elementNowEdited);
    elementNowEdited = element;
    alltdClearHover(element);
    element.style.borderColor = '#666';
    element.down('p').hide();
    element.down('.rightside').hide();
    var followers = element.down('div.followers');
    if (followers)
        followers.hide();
    var taskeditor = $('taskeditor')
    $('taskeditorplace').removeChild(taskeditor);
    element.appendChild(taskeditor, element.next());
    taskeditor.style.display = 'block';
    var editbox = taskeditor.firstDescendant();
    editbox.value = element.down('span.tlink').innerHTML;
    var notebox = taskeditor.down('.notefield>textarea');
    notebox.value = element.down('.tlink').title;
    if (notebox.value.match(/^See attachments in the email/)) {
        notebox.writeAttribute('readonly', 'readonly');
        notebox.style.backgroundColor = '#ccc';
    } else {
        notebox.removeAttribute('readonly');
        notebox.style.backgroundColor = '#fff';
    }
    if (notebox.value == '' ) {
        notebox.value = 'add note here';
        notebox.style.color = '#777';
        currentNoteboxObserver = function(e) { 
                if (notebox.value == 'add note here') {
                    notebox.value = ''; 
                    notebox.style.color = '#000'; 
                }
            };
        notebox.observe('focus', currentNoteboxObserver);
    } else {
        notebox.style.color = '#000';
        if (currentNoteboxObserver)
            notebox.stopObserving('focus', currentNoteboxObserver);
    }
    var freq = element.down('.taskdata>.dfreq').innerHTML;
    var nextReminder = element.down('.taskdata>.dnext').innerHTML;
    var freqtimes = element.down('.taskdata>.dfreqtimes').innerHTML;
    var derived = element.down('.taskdata>.dderived');
    if (derived)
        $('reannouncebtn').style.display = 'inline';
    else
        $('reannouncebtn').hide();
    $('tefreq').value = freq;
    $('tefreqtimes').value = freqtimes;
    nextReminder = new Date(Date.parse(nextReminder));
    savedNextReminder = dateToDateString(nextReminder);
    $('spweekday').innerHTML = getFullWeekday(nextReminder);
    $('spnextreminder').innerHTML = savedNextReminder;
    savedReminderTime = dateToTimeString(nextReminder);
    $('spremindertime').value = savedReminderTime;
    editbox.focus();
    editbox.select();
    return false;
}

function taskIdFromTrElement(tr) {
    return tr.readAttribute('id').substring(4);
}

function showAjaxLoader(div) {
    div.appendChild(new Element('div', {className: 'ajaxloader'}));
}
function removeAjaxLoader(div) {
    div.down('.ajaxloader').remove();
}

function newReminderFromSelectedDate(alltd, dateString, timeString) {
    var m = dateString.match(/(\d+) (...) (\d+)/);
    var oldReminder = alltd.down('.taskdata>.dnext').innerHTML;
    oldReminder = new Date(Date.parse(oldReminder));
    oldReminder.setDate(parseInt(m[1], 10));
    oldReminder.setMonth(months.indexOf(m[2]));
    oldReminder.setFullYear(parseInt(m[3]));
    if (timeString != '' ) {
        m = timeString.match(/^(\d\d)[:]?(\d\d)$/);
        oldReminder.setHours(parseInt(m[1], 10))
        oldReminder.setMinutes(parseInt(m[2], 10))
    }
    return oldReminder.toUTCString().slice(5);
}

function saveClicked(element) {
    var taskeditor = $('taskeditor')
    if (!validateTime($('spremindertime').value))
        return false;
    var taskid = taskIdFromTrElement(element.up('tr'));
    var td = element.up('td');
    var newtitle = taskeditor.down('.taskformtext').value;
    var textarea = taskeditor.down('textarea')
    var newcontent = textarea.value;
    if (newcontent == 'add note here')
        newcontent = ''
    var freq = $('tefreq').value;
    var freqtimes = parseInt($('tefreqtimes').value, 10);
    var nextReminder = $('spnextreminder').innerHTML;
    var reminderTime = $('spremindertime').value;
    if (nextReminder != savedNextReminder || reminderTime != savedReminderTime)
        nextReminder = newReminderFromSelectedDate(element, nextReminder, reminderTime);
    else
        nextReminder = '';
    savedNextReminder = '';
    savedReminderTime = '';
    showAjaxLoader(element);
    new Ajax.Request('changetask', { method: 'post', parameters: {'id':taskid, 'title': newtitle, 'content': newcontent, 'freq': freq, 'freqtimes': freqtimes, 'nextreminder': nextReminder, 'tzoffset': tzoffset }, onSuccess: function(transport) { 
            var result = transport.responseText.evalJSON()
            td.className = result['freqclass'];
            element.down('span.tlink').innerHTML = result['newtitle'];
            var newContent = result['newcontent'];
            if (newContent.match(/^PICKLED:/))
                newContent = 'See attachments in the email';
            element.down('span.tlink').title = newContent;
            var link = element.down('.urltask');
            if (link != null && result['islink']) {
                link.href = result['newcontent'].split('\n')[0];
            }
            element.down('.taskdata>.dnext').innerHTML = result['newnext'];
            element.down('.taskdata>.dfreq').innerHTML = result['freq'];
            element.down('.taskdata>.dfreqtimes').innerHTML = result['freqtimes'];
            updateSmallDate(element);
            var timespan = element.down('p span.time');
            timespan.innerHTML = '[' + result['when'] + ']';
            removeAjaxLoader(element);
        },
        onFailure: function(transport) { removeAjaxLoader(element); }
    });
    closeTaskEditor(element);
    return false;
}

function deleteClicked(element, permanently) {
    var tasktext = element.down('span.tlink').innerHTML;
    if (permanently) {
        if (!confirm('Delete permanently:\n' + tasktext))
            return;
    }
    else
        if (!confirm('Deleting:\n' + tasktext))
            return;
    var taskid = taskIdFromTrElement(element.up('tr'));
    showAjaxLoader(element);
    new Ajax.Request('deletetask', { method: 'post', parameters: {'id':taskid, 'permanently': permanently}, onSuccess: function(transport) { 
            var siblings = element.up('tr').nextSiblings();
            for (var i = 0; i < siblings.length; i++) {
                var tr = siblings[i];
                if (tr.className == 'trbg0') {
                    tr.className = 'trbg1';
                } else {
                    tr.className = 'trbg0';
                }
            }
            removeAjaxLoader(element);
            element.up('tr').remove();
        },
        onFailure: function(transport) { removeAjaxLoader(element); }
    });
    return false;
}

function taskclick(e) {
    var element = Event.extend(e).element();
    if (element.className == 'smallx')
        return false;
    if (element.className == 'urltask')
        return true;
    if (element.className != 'alltd')
        element = element.up('.alltd');
    editClicked(element);
    return false;
}

function internalSetFreq(td, anchor) {
    var taskid = taskIdFromTrElement(td.up('tr'));
    var newFreq = anchor.innerHTML;
    showAjaxLoader(td.down('.alltd'));
    new Ajax.Request('changefreq', { method: 'post', parameters: {'taskid':taskid, 'freq': newFreq, 'tzoffset': tzoffset}, onSuccess: function(transport) { 
            td.className = anchor.innerHTML;
            var result = transport.responseText.evalJSON();
            var timespan = td.down('p span.time');
            timespan.innerHTML = '[' + result['when'] + ']';
            td.down('.taskdata>.dfreq').innerHTML = newFreq;
            td.down('.taskdata>.dfreqtimes').innerHTML = '1';
            td.down('.taskdata>.dnext').innerHTML = result['newnext'];
            updateSmallDate(td);
            td.down('.dwm').style.backgroundPosition = freqToDwmX[newFreq] + ' 0px';
            removeAjaxLoader(td.down('.alltd'));
            var derived = td.down('.taskdata>.dderived');
            if (derived)
                alert('Frequency changed successfully. There are ' + derived.innerHTML + ' users sharing this reminder. To update them, click on the "Save & Re-announce" button in the reminder settings.');
        },
        onFailure: function(transport) { removeAjaxLoader(td.down('.alltd')); }
    });
}

function debug(s) {
    document.body.down('#debug').innerHTML = s;
}
function taskEditKeyPressed(e) {
    var element = Event.extend(e).element();
    if (e.keyCode == 13 && element.tagName.toLowerCase() != 'textarea') {
        if (elementNowEdited.down('.taskdata>.dderived'))
            alert('Please click on either "Save" or "Save & Re-announce"');
        else
            saveClicked(elementNowEdited);
    }
    else if (e.keyCode == 27) {
        closeTaskEditor(elementNowEdited);
    }
}

function clickTab1(e) {
    var element = Event.extend(e).element();
    element.up('div').style.background = 'transparent url(/static/images/toptab1.png) no-repeat top left';
    var li1 = element.up('li');
    var li2 = element.up('li').next();
    li1.innerHTML = '<span>Remind Yourself</span>';
    li2.innerHTML = '<a href="#" onclick="return clickTab2(event)"><span>Remind a Friend</span></a>';
    $('remindyourself').style.display = 'block';
    $('remindafriend').hide();
    $('task').focus();
    return false;
}

function clickTab2(e) {
    var element = Event.extend(e).element();
    element.up('div').style.background = 'transparent url(/static/images/toptab2.png) no-repeat top left';
    var li1 = element.up('li').previous();
    var li2 = element.up('li');
    li1.innerHTML = '<a href="#" onclick="return clickTab1(event)"><span>Remind Yourself</span></a>';
    li2.innerHTML = '<span>Remind a Friend</span>';
    $('remindafriend').style.display = 'block';
    $('remindyourself').hide();
    $('friendemail').focus();
    $('friendemail').select();
    return false;
}

function closeBox(e, boxClass) {
    var xlink = Event.extend(e).element();
    xlink.up('.' + boxClass).hide();
    return false
}

function positionAdsense() {
    var adsense = $('adsense');
    var target = $('leftcol');
    if (!adsense)
        return;
    var tasktable = $('tasktablediv2');
    if (tasktable) {
        if (tasktable.down('.tasktable').getHeight() < 170)
            target = tasktable;
            adsense.style.marginTop = '25px';
    }
    else if ($('noactivereminders') && $('rightcol'))
        target = $('rightcol');
    if (target) {
        adsense.remove();
        target.appendChild(adsense);
        adsense.style.display = 'block';
    }
}

function alltdMouseOver(alltd) {
    return function (e) { 
        if (alltd == elementNowEdited)
            return;
        alltd.style.borderColor = '#888';
        alltd.style.backgroundColor = '#ddd';
        alltd.style.cursor = 'pointer';
        var sharetask = alltd.firstDescendant();
        sharetask.style.display = 'block';
        currentAlltdMouseOver = alltd;
    };
}

function alltdMouseOut(alltd) {
    return function (e) { 
        if (alltd == elementNowEdited)
            return;
        var movedTo = mouseOutRelatedTarget(e);
        if (movedTo && movedTo.up) {
            if (movedTo.up('#selectdwm') && parentOfDwmSelect && parentOfDwmSelect.up('.alltd') == alltd)
                return;
            if (movedTo.id == 'sharetaskdlg' || movedTo.up('#sharetaskdlg'))
                return;
            if (movedTo.up('div') == alltd)
                return;
        }
        alltdClearHover(alltd);
    };
}
function getFollowers(taskid, callback) {
    new Ajax.Request('getderived', { method: 'post', parameters: {'taskid':taskid}, onSuccess: function(transport) { 
            var result = transport.responseText.evalJSON();
            callback(result['emails']);
        },
        onFailure: function(transport) { callback([]); }
    });
}
function sharetaskMouseOver(e) {
    element = Event.extend(e).element();
    if (element != currentSharetask) {
        openingSharetaskdlg = true;
        window.setTimeout(function() {
            if (!openingSharetaskdlg)
                return;
            openingSharetaskdlg = false;
            var dlg = $('sharetaskdlg');
            var scroll = $('tasktablediv2').scrollTop;
            var alltd = element.up('.alltd');
            var offset = $('rightcol').cumulativeOffset()[1];
            var input = dlg.down('input');
            input.value = element.href;
            dlg.style.top = String(alltd.cumulativeOffset()[1] - offset + alltd.getHeight() - scroll - 4) + 'px';
            $('followerlist').hide();
            var dderived = alltd.down('.taskdata>.dderived');
            if (dderived) {
                var taskid = taskIdFromTrElement(alltd.up('tr'));
                $('followerlist').innerHTML = '';
                getFollowers(taskid, function(followers) {
                        var followersst = '';
                        if (followers.length == 0)
                            return
                        for (var i = 0; i < followers.length; i++)
                            followersst += followers[i] + '<br/>';
                        followersst = followersst.slice(0, followersst.length-5);
                        $('followerlist').innerHTML = '<h4>Followed by:</h4>' + followersst;
                        $('followerlist').show();
                    });
            }
            dlg.style.display = 'block';
            input.select();
            input.focus();
            currentSharetask = element;
        }, 400);
    }
    return false;
}
function sharetaskMouseOut(e) {
    element = Event.extend(e).element();
    openingSharetaskdlg = false;
    if (mouseOutRelatedTarget(e) == $('sharetaskdlg'))
        return false;
    if (currentSharetask) {
        var dlg = $('sharetaskdlg');
        dlg.style.display = 'none';
        currentSharetask = null;
    }
    return false;
}
function sharetaskdlgMouseOut(e) {
    var dlg = $('sharetaskdlg');
    var target = mouseOutRelatedTarget(e);
    if (target == dlg || target.up('#sharetaskdlg') == dlg)
        return;
    if (currentAlltdMouseOver)
        alltdClearHover(currentAlltdMouseOver);
    currentSharetask = null;
    closingSharetaskdlg = true;
    window.setTimeout(function() {
        if (!closingSharetaskdlg)
            return;
        closingSharetaskdlg = false;
        $('sharetaskdlg').hide();
    }, 300);
}
function sharetaskdlgMouseMove(e) {
    closingSharetaskdlg = false;
}
function updateSmallDate(alltd) {
    var m = alltd.down('.taskdata>.dnext').innerHTML.match(/(...) (\d+), /);
    alltd.down('.smalldate>a').innerHTML = String(parseInt(m[2],10)) + ' ' + m[1];
}
function onLoad(event) {
    if ($('taskeditor') != null) {
        $('taskeditor').select('input').each(function (inp) {
            inp.observe('keypress', taskEditKeyPressed);
        });
        $('taskeditor').select('textarea').each(function (x) { x.observe('keypress', taskEditKeyPressed);});
    }
    var indicator = $('indicator');
    if (indicator) {
        indicator.hide();
        indicator.setOpacity(0.6);
    }
    var friendemail = $('friendemail');
    if (friendemail) {
        friendemail.observe('focus', function() { 
                if (friendemail.value.match(/^Start typ/))
                    friendemail.select();
        });
    }
    var flash = $('flash');
    if (flash != null ) {
        flash.setOpacity(0);
        flash.style.display = 'block';
        Effect.Fade(flash, {from: 0.0, to: 1.0, duration: 0.4})
        window.setTimeout(function() {
            Effect.Fade(flash, {duration: 0.6, from: 1.0, to: 0.05});
            // hack: avoid 1-pixel tilt in IE7
            window.setTimeout(function() {flash.style.visibility = 'hidden';}, 600);
        }, 2000 + flash.innerHTML.length * 40);
    }
    if ($('friendemail') != null ) {
        var friendAutoCompleter = new Ajax.Autocompleter('friendemail', 'friendemail_autocomplete','autocompletefriend', {indicator: 'indicator', frequency: 0.2});
    }
    var dateboxes = $A(document.getElementsByClassName('datebox'));
    dateboxes.each(function(datebox) {
            var input = datebox.down('input');
            var dateanchor = datebox.down('.datespan')
            var wdspan = datebox.down('.weekdayspan')
            if (input.value != '') {
                dateanchor.innerHTML = input.value;
                wdspan.innerHTML = getFullWeekday(dateFromDateString(input.value));
            } else
                retrieveNextreminder(datebox.up(1).down('select'));
        });
    var morebox = $('morebox');
    if (morebox) {
        $A(morebox.select('a')).each(function (anchor) {
            anchor.style.width = String(morebox.getWidth()) + 'px';
        });
    }
    $A(document.getElementsByClassName('tzinput')).each(function(inp) { 
        inp.value = tzoffset; });
    var alltds = $A(document.getElementsByClassName('alltd'));
    alltds.each(function(alltd) {
            alltd.observe('mouseover', alltdMouseOver(alltd));
            alltd.observe('mouseout', alltdMouseOut(alltd));
            alltd.observe('mousemove', function(e) { Event.extend(e).stop(); });
            alltd.observe('click', taskclick);
            updateSmallDate(alltd);
            alltd.down('.rightside').style.display = 'block';
            var sharetask = alltd.firstDescendant();
//            sharetask.setOpacity(0.5);
            sharetask.observe('mouseover', sharetaskMouseOver);
            sharetask.observe('mouseout', sharetaskMouseOut);
            sharetask.observe('click', function(e) {Event.extend(e).stop();});
        });
    /*
    if ($('tasktablediv2')) {
        $(document.body).observe('mousemove', function(e) {
            if (currentAlltdMouseOver)
                alltdClearHover(currentAlltdMouseOver);
        });
    }
    */
    var advancednote = $('advancednote');
    if (advancednote) {
        advancednote.observe('focus', function(e) {
            if (advancednote.innerHTML.match('^Additional text')) {
                advancednote.innerHTML = '';
                advancednote.style.color = '#000';
            }
        });
    }
    positionAdsense();
}

function waitForPendingTitles(e) {
    var pt = $(document.body).select(".pendingtitle");
    pt._each(function(div) {
        var taskid = div.innerHTML;
        new Ajax.Request('waitfortitle', { method: 'post', parameters: {'id':taskid}, onSuccess: function(transport) { 
                var newTitle = transport.responseText.evalJSON()['title'];
                $('task' + taskid).down('span.tlink').innerHTML = newTitle;
            }
        });
    });
}

function taskFlash(e) {
    var flashtask = $('flashtask');
    if (flashtask == null)
        return;
    var m = $('flashtask').innerHTML.match(/^(\d+),(.*)$/);
    if (!m)
        return;
    var tr = $('task' + m[1]);
    if (tr == null) {
        return;
    }
    var oldClass = tr.className;
    tr.className = 'flashtask';
    window.setTimeout(function() {
        tr.className = oldClass;
    }, 700);
    if (m[2] == 'edit')
        editClicked(tr.down('.alltd'));
}
function saveAndReannounce(alltd) {
    saveClicked(alltd);
    var taskid = taskIdFromTrElement(alltd.up('tr'));
    var numOfUsers = alltd.down('.taskdata>.dderived').innerHTML;
    new Ajax.Request('reannounce', { method: 'post', parameters: {'taskid':taskid}, onSuccess: function(transport) { 
            var result = transport.responseText.evalJSON()
            if (result['num'] == 0)
                alert('All users are up to date.');
            else
                alert('Emails are being sent to ' + String(result['num']) + ' users who needed the update');
        },
        onFailure: function(transport) { alert('Sorry, some error occurred.'); removeAjaxLoader(alltd); }
    });
}
function editorButtonClick(e) {
    var element = Event.extend(e).element();
    if (element.value == 'Cancel')
        closeTaskEditor(elementNowEdited);
    else if (element.value == 'Save')
        saveClicked(element.up('.alltd'));
    else if (element.value.match(/announce$/))
        saveAndReannounce(element.up('.alltd'));
}

function saveName(e) {
    var firstName = $('firstname').value;
    var lastName = $('lastname').value;
    if (firstName == '' || lastName == '') {
        alert('You must fill out your first and last names');
        return;
    }
    new Ajax.Request('savename', { method: 'post', parameters: {'first':firstName, 'last': lastName}, onSuccess: function(transport) {
        var fullName = transport.responseText.evalJSON()['fullname'];
        $('username').down('span').innerHTML = fullName;
    }});
    $('fullname').hide();
}

function closeCurrentYellowBox() {
    if (!currentYellowBox) 
        return;
    currentYellowBox.hide();
    currentYellowBox = null;
}

function showWhy(e, box, off) {
    closeCurrentYellowBox();
    var ev = Event.extend(e);
    ev.stop();
    var element = ev.element();
    box.remove();
    var offsets = element.cumulativeOffset();
    element.up('body').appendChild(box);
    box.style.top = offsets[1] + element.getHeight() + off[1] + 1 + 'px';
    box.style.left = offsets[0] + off[0] + 'px';
    box.style.display = 'block';
    box.style.zIndex = 10;
    currentYellowBox = box;
    return false;
}

function closeMessage(e) {
    var element = Event.extend(e).element();
    element.up('.messagebox').style.display = 'none';
    return false;
}

function onNameFocus(e) {
    var element = Event.extend(e).element();
    var boxes = element.up('form').select('.messagebox');
    for (var i = 0; i < boxes.length; i++ ) {
        boxes[i].hide();
    }
    return true;
}

function dwmMouseEnter(e) {
    var element = Event.extend(e).element();
    var selectdwm = $('selectdwm');
    var offset = element.cumulativeOffset();
    var scroll = $('tasktablediv2').scrollTop;
    var centered = $('centered').cumulativeOffset();
    selectdwm.style.left = String(offset[0] - centered[0]) + 'px';
    selectdwm.style.top = String(offset[1] - scroll - centered[1] + 20) + 'px';
    selectdwm.style.display = 'block';
    parentOfDwmSelect = element;
}

function mouseOutRelatedTarget(e) {
    if (!e) var e = window.event;
    return $(e.relatedTarget || e.toElement);
}

function dwmMouseExit(e) {
    var element = Event.extend(e).element();
    var selectdwm = $('selectdwm');
    var movedTo = mouseOutRelatedTarget(e);
    if (!movedTo || !movedTo.up || !movedTo.up('#selectdwm'))
        selectdwm.hide();
}

function selectdwmMouseOut(e) {
    var selectdwm = $('selectdwm');
    var movedTo = mouseOutRelatedTarget(e);
    if (!movedTo || !movedTo.up('#selectdwm')) {
        selectdwm.hide();
        if (parentOfDwmSelect)
            alltdClearHover(parentOfDwmSelect.up('.alltd'));
    }
}

function dwmSelect(e) {
    var element = Event.extend(e).element();
    if (!parentOfDwmSelect)
        return false;
    var posx = freqToDwmX[element.innerHTML];
    parentOfDwmSelect.style.backgroundPosition = posx + ' -20px';
    var td = parentOfDwmSelect.up('td');
    internalSetFreq(td, element);
    $('selectdwm').hide();
    return false;
}

function smallxClick(e) {
    var element = Event.extend(e).element();
    element = element.up('.alltd');
    deleteClicked(element, false);
    return false;
}

function smallxTrashed(e) {
    var element = Event.extend(e).element();
    element = element.up('.statictd');
    deleteClicked(element, true);
    return false;
}

function waitUntilScwLoaded(e, retries, func) {
    if (e)
        Event.extend(e).stop();
    if (retries == 0)
        return false;
    if (!isScwLoaded) {
        window.setTimeout(function () { waitUntilScwLoaded(null, retries - 1, func); }, 250);
        return false;
    }
    func();
}

function callScwShow(element, evt) {
    waitUntilScwLoaded(evt, 12, function () {
        scwNextAction = function () { 
            var newDate = dateFromDateString($('spnextreminder').innerHTML);
            $('spweekday').innerHTML = getFullWeekday(newDate);
        };
        scwShow(element, evt, 40);
        savedScrollPosition = $('tasktablediv2').scrollTop;
    });
    return false;
}

function changeNextreminder(e) {
    var ev = Event.extend(e);
    var element = ev.element();
    var savedValue = element.innerHTML;
    waitUntilScwLoaded(ev, 12, function () {
        scwNextAction = function () { 
            if (element.innerHTML != savedValue) {
                element.up().down('input').value = element.innerHTML;
                element.up().down('.weekdayspan').innerHTML = 
                    getFullWeekday(dateFromDateString(element.innerHTML));
            }
            element.up('form').down('.formsubmit').focus();
        };
        scwShow(element, ev, -40);
    });
    return false;
}

function clickSmallDate(e) {
    waitUntilScwLoaded(e, 12, function () {
        var ev = Event.extend(e);
        var anchor = ev.element();
        ev.stop();
        if (!isScwLoaded)
            return false;
        var alltd = anchor.up('.alltd');
        var nextReminder = alltd.down('.taskdata>.dnext').innerHTML;
        nextReminder = new Date(Date.parse(nextReminder));
        anchor.innerHTML = dateToDateString(nextReminder);
        savedNextReminder = anchor.innerHTML;
        scwNextAction = function () { 
            nextReminder = newReminderFromSelectedDate(alltd, anchor.innerHTML, '');
            var selectedDate = anchor.innerHTML;
            var m = anchor.innerHTML.match(/(\d+) (...)/)
            anchor.innerHTML = String(parseInt(m[1],10)) + ' ' + m[2];
            if (selectedDate == savedNextReminder)
                return;
            var taskid = taskIdFromTrElement(alltd.up('tr'));
            showAjaxLoader(alltd);
            new Ajax.Request('changenext', { method: 'post', parameters: {'taskid':taskid, 'nextreminder': nextReminder, 'tzoffset': tzoffset}, onSuccess: function(transport) { 
                    var result = transport.responseText.evalJSON();
                    var timespan = alltd.down('p span.time');
                    timespan.innerHTML = '[' + result['when'] + ']';
                    alltd.down('.taskdata>.dnext').innerHTML = result['newnext'];
                    updateSmallDate(alltd);
                    removeAjaxLoader(alltd);
                    var derived = alltd.down('.taskdata>.dderived');
                    if (derived)
                        alert('Reminder changed successfully. There are ' + derived.innerHTML + ' users sharing this reminder. To update them, click on the "Save & Re-announce" button in the reminder settings.');
                },
                onFailure: function(transport) { removeAjaxLoader(alltd); }
            });
        };
        scwShow(anchor, ev, -114);
        savedScrollPosition = $('tasktablediv2').scrollTop;
    });
    return false;
}

function tableScroll(e) {
    var element = Event.extend(e).element();
    var newPos = element.scrollTop;
    var scw = $('scw');
    if (scw && scw.style.visibility == 'inherit') {
        var t = parseInt(scw.style.top.match(/(\d+)px/)[1]);
        var newTop = String(t - newPos + savedScrollPosition) + 'px';
        scw.style.top = newTop;
        $('scwIframe').style.top = newTop;
        savedScrollPosition = newPos;
    }
}

function showAdvanced(e) {
    var element = Event.extend(e).element();
    var advanced = element.up(2).down('.advanced');
    if (element.innerHTML.match(/^Advanced/)) {
        element.innerHTML = 'Hide advanced settings';
        advanced.style.display = 'block';
        var advancedtime = advanced.down('#advancedtime');
        advancedtime.focus();
        advancedtime.select();
    } else {
        element.innerHTML = 'Advanced settings';
        advanced.style.display = 'none';
        element.blur();
    }
    return false;
}

function retrieveNextreminder(combobox) {
    var form = combobox.up('form');
    var input = form.down('.datebox>input');
    if (input.value != '')
        return;
    var nextrem = form.down('.datebox>.datespan');
    var weekday = form.down('.datebox>.weekdayspan');
    var remtime = form.down('.advanced>.selecttime>input');
    var customfreq = combobox.up('.customfreq');
    var freqtimes = null;
    if (customfreq)
        freqtimes = parseInt(customfreq.down('#cftimes').value, 10);
    if (!freqtimes)
        freqtimes = 1;
    new Ajax.Request('calcnextreminder', { method: 'post', parameters: {'freq': combobox.value,'freqtimes': freqtimes, 'tzoffset': tzoffset}, onSuccess: function(transport) { 
            var result = transport.responseText.evalJSON()
            nextrem.innerHTML = result['nextreminder'];
            weekday.innerHTML = getFullWeekday(dateFromDateString(result['nextreminder']));
            remtime.value = result['remindertime'];
            remtime.observe('change', advancedTimeChanged);
        }
    });
    nextrem.innerHTML = '';
    weekday.innerHTML = 'calculating...';
}
function onChangeFreq(e) {
    var element = Event.extend(e).element();
    retrieveNextreminder(element);
    $('cffreq').value = element.value;
    element.up('form').down('.formsubmit').focus();
}
function onChangeAdvancedFreq(e) {
    var element = Event.extend(e).element();
    retrieveNextreminder(element);
    $('cftimes').select();
    $('cftimes').focus();
}
function onChangeFreqTimes(e) {
    var element = Event.extend(e).element();
    retrieveNextreminder($('cffreq'));
    element.up('form').down('.formsubmit').focus();
}
function onChangeTEFreq(e) {
    $('tefreqtimes').select();
    $('tefreqtimes').focus();
}

function loadCalendar() {
    window.setTimeout(function() { 
            var scr = new Element('script', 
                                  {type: 'text/javascript', src: '/static/javascript/scw.js'});
            document.getElementsByTagName('head')[0].appendChild(scr);
        }, 1500 );
}
function scwLoaded() {
    var weekstart = $('weekstart');
    if (!weekstart)
        return;
    scwWeekStart = parseInt(weekstart.innerHTML, 10);
}
function moreMouseOver(e) {
    $('morebox').style.display = 'block';
}
function moreMouseOut(e) {
    var movedTo = mouseOutRelatedTarget(e);
    if (movedTo.id != 'morebox' && !movedTo.up('#morebox'))
        $('morebox').hide();
}
function moreboxMouseOut(e) {
    var movedTo = mouseOutRelatedTarget(e);
    if (movedTo != $('morebox') && (!movedTo || !movedTo.up('#morebox')))
        $('morebox').hide();
}
function advancedTimeChanged(e) {
    var element = Event.extend(e).element()
    var morning = element.up('form').down('.datebox>.morningspan');
    if (!morning)
        return;
    var m = element.value.match(/^(\d\d)[:]?(\d\d)$/)
    if (m)
        morning.innerHTML = m[1] + ':' + m[2] + ',';
    else
        morning.innerHTML = 'N/A'
}

function customFreqSelect(e) {
    var element = Event.extend(e).element();
    var cftimes = $('cftimes');
    if (element.checked) {
        cftimes.enable();
        cftimes.className = '';
        $('cffreq').enable();
        $('cffreq').className = '';
        $('selectfreq').disable();
        $('selectfreq').className = 'disabled';
        retrieveNextreminder($('cffreq'));
        cftimes.focus();
    } else {
        cftimes.disable();
        cftimes.className = 'disabled';
        $('cffreq').disable();
        $('cffreq').className = 'disabled';
        $('selectfreq').enable();
        $('selectfreq').className = '';
        retrieveNextreminder($('selectfreq'));
        element.blur();
    }
    return true;
}
function onChangeFacebookCB(e) {
    var element = Event.extend(e).element();
    if (element.checked)
        $('suggestfacebook').style.visibility = 'visible';
    else
        $('suggestfacebook').style.visibility = 'hidden';
    element.blur();
}
Event.observe(window, 'load', onLoad);

document.observe('click',closeCurrentYellowBox);

