// ==UserScript==
// @name          del.icio.us save with date
// @namespace     http://e8y.net/repos/delicious-save-with-date
// @include       http://del.icio.us/*
// ==/UserScript==
//
// @version       0.0.5

(function() {
    
    var formElem = document.getElementById('delForm');
    if (!formElem) {
        return;
    }
    
    Date.prototype.toYYMMDD = function(delim) {
        var yy = this.getYear();      if (yy < 2000) yy += 1900;
        var mm = this.getMonth() + 1; if (mm < 10)   mm = '0' + mm;
        var dd = this.getDate();      if (dd < 10)   dd = '0' + dd;
        return yy + delim + mm + delim + dd;
    }
    
    Date.prototype.toHHMMSS = function(delim) {
        var hh = this.getHours();     if (hh < 10)   mm = '0' + hh;
        var mm = this.getMinutes();   if (mm < 10)   mm = '0' + mm;
        var ss = this.getSeconds();   if (ss < 10)   ss = '0' + ss;
        return hh + delim + mm + delim + ss;
    }
    
    Date.prototype.toISO8601 = function() {
        var yy = this.getUTCFullYear();
        var mm = this.getUTCMonth() + 1; if (mm < 10)   mm = '0' + mm;
        var dd = this.getUTCDate();      if (dd < 10)   dd = '0' + dd;
        var hh = this.getUTCHours();     if (hh < 10)   hh = '0' + hh;
        var mi = this.getUTCMinutes();   if (mi < 10)   mi = '0' + mi;
        var ss = this.getUTCSeconds();   if (ss < 10)   ss = '0' + ss;
        
        return yy + '-' + mm + '-' + dd + 'T' + hh + ':' + mi + ':' + ss + 'Z';
    }
    
    Date.prototype.getTimeZoneDifference = function() {
        var td;
        var tz = this.getTimezoneOffset();
        if (tz > 0) td = '-';
        else        td = '+';
        return td += ( tz / 60 * -1 );
    }
    
    Array.prototype.toDate = function() {
        this[1]--;
        return new Date(this[0], this[1], this[2], this[3], this[4], this[5]);
    }
    
    // set default date(current)...
    var postedAt = new Date();
        
    // looking for <input name='date'>...
    var dateInput;
    var inputTags = formElem.getElementsByTagName('input');
    for (var i = 0; i < inputTags.length; i++) {
        if (inputTags[i].name == 'date') {
            // set Date object (UTC -> Local)...
            dateInput = inputTags[i];
            postedAt = dateInput.value.match(/\d+/g).toDate();
            postedAt.setTime(postedAt.getTime() - postedAt.getTimezoneOffset() * 60 * 1000);
            break;
        }
    }
    
    // for new url...
    if (!dateInput) {
        dateInput = document.createElement('input');
        dateInput.setAttribute('name', 'date');
        dateInput.setAttribute('type', 'hidden');
        formElem.appendChild(dateInput);
    }
    
    // new TR...
    var dateTr = document.createElement('tr');
    for (var i = 0, td = document.createElement('td'); i < 3; i++) {
        dateTr.appendChild( td.cloneNode(true) );
    }
    
    // 1st TD...
    with (dateTr.getElementsByTagName('td')[0]) {
        setAttribute('class', 'rs');
        innerHTML = 'date';
    }

    // 2nd TD...
    with (dateTr.getElementsByTagName('td')[1]) {
        var inp = document.createElement('input');
        var inp1 = appendChild( inp.cloneNode(true) );
        var inp2 = appendChild( inp.cloneNode(true) );
        
        inp1.setAttribute('id', 'myd1'); 
        inp1.setAttribute('value', postedAt.toYYMMDD('-') ); 
        inp1.setAttribute('style', 'width:80px; margin-right:5px;');
        
        inp2.setAttribute('id', 'myd2'); 
        inp2.setAttribute('value', postedAt.toHHMMSS(':') ); 
        inp2.setAttribute('style', 'width:60px; margin-right:5px;');
        
        innerHTML += '<span class=smaller>GMT ' + postedAt.getTimeZoneDifference() + '</span>';
    }
    
    // fix HTML...
    var tbodyElem = formElem.getElementsByTagName('tbody')[0];
    var trTags = tbodyElem.getElementsByTagName('tr');
    var lastTr = tbodyElem.removeChild( trTags[ trTags.length - 1 ] );
    tbodyElem.appendChild(dateTr);
    tbodyElem.appendChild(lastTr);
    
    // set event...    
    formElem.addEventListener("submit", function(e) {
        dateInput.value = ( document.getElementById('myd1').value + ';' + document.getElementById('myd2').value ).match(/\d+/g).toDate().toISO8601();
        // alert(dateInput.value);
    }, false);

})();