//browser stuff
var isMac = (navigator.appVersion.indexOf("Mac")>=0);
var isNS4 = (document.layers)?true:false;
var isIEMac = ((document.all)&&isMac);
var isIE4 = ((document.all)&&navigator.appVersion.indexOf("MSIE 4."));
var isIE5 = ((document.all)&&navigator.appVersion.indexOf("MSIE 5."));  
var gPreviewElement = null;

function unfoshizzle(b) {
    var e="";
    for (var i=1;i<=b[0];i++)
        e+=String.fromCharCode(b[i]-b[i+b[0]]);
    document.write(e);
}

var OnLoad = new Object();
OnLoad.tasks = new Array();
OnLoad.loader = function() {
    var tasks = OnLoad.tasks;
    for (var i=0;i<tasks.length;i++)
        tasks[i]();
};
OnLoad.load = function(js) {
    var tasks = OnLoad.tasks;
    if ((tasks.length==0) && window.onload)
        tasks[tasks.length]=window.onload;
    window.onload = OnLoad.loader;
    tasks[tasks.length]=js;
};

Array.prototype.clone = function() {
    var n = new Array();
    for (var i=0;i<this.length;i++)
        n[i]=this[i];
    return n;
};

Array.prototype.add = function(v) {
    this.push(v);
    return this;
};

Array.prototype.remove = function(v) {
    for (var i=0;i<this.length;i++) {
        if (this[i]==v) {
            for (i++;i<this.length;i++)
                this[i-1]=this[i];
            this.pop();
            break;
        }
    }
    return this;
};

Date.timeSinceInWords = function(inPast, includeSeconds) {
  var dp = new Date(inPast).getTime();
  var dn = new Date().getTime();

  var d_msecs = dn - dp;
  var d_secs  = d_msecs/1000;
  var d_mins  = d_secs/60;

  if (d_mins < 1) {
    if (includeSeconds)
      return (d_mins < 0)?'less than a minute':'1 minute';
    if (d_secs < 5)
      return 'less than 5 seconds';
    else if (d_secs < 10)
      return 'less than 10 seconds';
    else if (d_secs < 20)
      return 'less than 20 seconds';
    else if (d_secs < 40)
      return 'half a mintue';
    else if (d_secs < 59)
      return 'less than a minute';
    return '1 minute';
  } else if (d_mins < 45) {
    return Math.round(d_mins) + ' minutes';
  } else if (d_mins < 90) {
    return 'about 1 hour';
  } else if (d_mins < 1440) {
    return 'about ' + Math.round(d_mins/60) + ' hours';
  } else if (d_mins < 2880) {
    return '1 day';
  } else if (d_mins < 43776) {
    return Math.round(d_mins/1440) + ' days';
  } else {
    var d_mons = d_mins/43776;
    var d_year = d_mins/525312;
    if (d_year < 1) {
      if (d_mons < 1) {
        return 'less than a month';
      } else if (d_mons < 2) {
        return 'over a month';
      } else {
        return "over " + Math.round(d_mons) + " months";
      }
    } else if (d_year < 2) {
      return "over a year";
    } else {
      return "over " + Math.round(d_year) + " years";
    }
  }
}

var CommentCounts = new Object();
CommentCounts.load = function() {
    var req=null;
    if (window.XMLHttpRequest) {
        req = new XMLHttpRequest();
    }
    else if (window.ActiveXObject) {
        req = new ActiveXObject("Microsoft.XMLHTTP");
    }
    if (!req)
        return;

    req.open('GET','/root/js_update_comment_counts')
    req.onreadystatechange = function() {
        if (req.readyState != 4)
            return;
        //alert(req.responseText);
        eval(req.responseText);
    };
    req.send(null);
};
CommentCounts.update = function(id,count) {
    var o = $('blog-comment-'+id);
    if (!o) return;
    o.childNodes[0].nodeValue = count;
    //o.parentNode.setAttribute('class','comment-count-on');
    o.parentNode.className = 'comment-count-on';
};

var CommentUpdater = new Object();

CommentUpdater.pSubmitHandlers = new Array();
CommentUpdater.pUpdateHandlers = new Array();
CommentUpdater.cSubmitHandlers = new Array();
CommentUpdater.cUpdateHandlers = new Array();
CommentUpdater.pFailureHandlers = new Array();
CommentUpdater.cFailureHandlers = new Array();
CommentUpdater.cCancelHandlers = new Array();

CommentUpdater.addPreviewSubmittedHandler = function(h) {
    CommentUpdater.pSubmitHandlers
        = CommentUpdater.pSubmitHandlers.clone().add(h);
};

CommentUpdater.addPreviewUpdatedHandler = function(h) {
    CommentUpdater.pUpdateHandlers
        = CommentUpdater.pUpdateHandlers.clone().add(h);
};

CommentUpdater.addPreviewFailedHandler = function(h) {
    CommentUpdater.pFailureHandlers
        = CommentUpdater.pFailureHandlers.clone().add(h);
};

CommentUpdater.addCommentSubmittedHandler = function(h) {
    CommentUpdater.cSubmitHandlers
        = CommentUpdater.cSubmitHandlers.clone().add(h);
};

CommentUpdater.addCommentUpdatedHandler = function(h) {
    CommentUpdater.cUpdateHandlers
        = CommentUpdater.cUpdateHandlers.clone().add(h);
};

CommentUpdater.addCommentFailedHandler = function(h) {
    CommentUpdater.cFailureHandlers
        = CommentUpdater.cFailureHandlers.clone().add(h);
};

CommentUpdater.addCommentCancelledHandler = function(h) {
    CommentUpdater.cCancelHandlers
        = CommentUpdater.cCancelHandlers.clone().add(h);
};

CommentUpdater.firePreviewSubmitted = function() {
    var h = CommentUpdater.pSubmitHandlers;
    for (var i=0;i<h.length;i++)
        h[i]();
};

CommentUpdater.firePreviewUpdated = function(request) {
    var h = CommentUpdater.pUpdateHandlers;
    for (var i=0;i<h.length;i++)
        h[i](request);
};

CommentUpdater.firePreviewFailed = function(request) {
    var h = CommentUpdater.pFailureHandlers;
    for (var i=0;i<h.length;i++)
        h[i](request);
};

CommentUpdater.fireCommentSubmitted = function() {
    var h = CommentUpdater.cSubmitHandlers;
    for (var i=0;i<h.length;i++)
        h[i]();
};

CommentUpdater.fireCommentUpdated = function(request) {
    var h = CommentUpdater.cUpdateHandlers;
    for (var i=0;i<h.length;i++)
        h[i](request);
};

CommentUpdater.fireCommentCancelled = function() {
    var h = CommentUpdater.cCancelHandlers;
    for (var i=0;i<h.length;i++)
        h[i]();
};

CommentUpdater.fireCommentFailed = function(request) {
    var h = CommentUpdater.cFailureHandlers;
    for (var i=0;i<h.length;i++)
        h[i](request);
};

CommentUpdater.deID = function(n) {
    if (!n)
        return;
    if (n.id)
        n.id = null;
    for (var i=0;i<n.childNodes.length;i++)
        CommentUpdater.deID(n.childNodes[i]);
};

var Wicket = new Object();
Wicket.isShowing = false;
Wicket.show = function() {
    //new Effect.BlindDown('wicket');
    new Effect.Appear('wicket');
    Wicket.isShowing = true;
};
Wicket.hide = function() {
    //new Effect.BlindUp('wicket');
    new Effect.Fade('wicket');
    Wicket.isShowing = false;
};
Wicket.unload = function() {
    new Effect.BlindUp('wicket', {
            afterFinish: function() {
                Element.remove('wicket');
                Wicket.isShowing = false;
            }});
};
Wicket.load = function() {
    if ($('wicket')) {
        if (Wicket.isShowing)
            Wicket.hide();
        else
            Wicket.show();
        return;
    }

    new Ajax.Updater(
        {},
        '/root/wicket',
        {
            asynchronous:true,
            evalScripts:true,
            onComplete:function(request) {
                var a = $('a');
                var b = $('b');
                var d = document.createElement('div');
                d.setAttribute('style','display:none;');
                d.setAttribute('id','wicket');
                d.innerHTML = request.responseText;
                a.insertBefore(d,b);
                Wicket.show();
            }
        });

};

Wicket.reload = function(request) {
    var w = $('wicket');
    w.innerHTML = request.responseText;
    /*
    new Effect.BlindUp('wicket', {
        afterFinish: function() {
            var w = $('wicket');
            w.innerHTML = request.responseText;
            w.style.display = 'block';
            //window.setTimeout(function() { new Effect.BlindDown(w) }, 1000);
        }
    });
    */
};


/** Event Wiring **/
/** Cruft added oct. 2nd to clean up event handler **/
if (document.addEventListener) {
    document.addEventListener('keyup',
        (function() {
            var kh = function(e) {
                var id = (window.event)?event.keyCode:e.keyCode;
                if (id!=76)
                    return;
                if (!((window.event)?event.ctrlKey:e.ctrlKey))
                    return;
                Wicket.load();
            };
            window.unload = function(onunload) {
                var ul = function() {
                    document.removeEventListener(
                        'keyup',kh,true);
                };

                if (typeof onunload == 'undefined') {
                    return ul;
                } else {
                    return function() {
                        ul.call(window);
                        onunload.call(window);
                    };
                }
            }(window.unload);
            return kh;
        })(),
        true);
}

CommentUpdater.addPreviewSubmittedHandler(
    function() {

        //clear error list
        var e = $('comment-errors');
        Element.hide('comment-errors');
        $A(e.childNodes).each(function(e) {
            e.parentNode.removeChild(e);
        });
        CommentUpdater.deID(gPreviewElement);

        /*
        $('preview-form').setAttribute('class','busy');
        */
        $('preview-form').className = 'busy';
        $('preview-button').disabled = true;
    });

CommentUpdater.addPreviewUpdatedHandler(
    function(request) {
        $('preview-button').disabled = false;
        /*
        $('preview-form').removeAttribute('class');
        */
        $('preview-form').className = '';
        if (request.status != 200) return;
        var c = $('comment-list').lastChild;
        while (c.previousSibling!=null && c.nodeName != 'DIV')
            c = c.previousSibling;

        if (gPreviewElement != null) {
            new Effect.BlindUp(gPreviewElement, {
                duration:   0.6,
                afterFinish: function() {
                    Element.remove(gPreviewElement);
                    new Effect.BlindDown(c);
                    gPreviewElement = c;
                }
            });
        }
        else {
            new Effect.BlindDown(c);
            gPreviewElement = c;
        }
    });

CommentUpdater.addPreviewFailedHandler(
    function(request) {
        Element.show('comment-errors');
        new Effect.Highlight('comment-errors');
    });

CommentUpdater.addCommentSubmittedHandler(
    function() {
        $('comment-button').disabled = true;
        $('comment-cancel').disabled = true;
        /*
        $('preview-form').setAttribute('class','busy');
        */
        $('preview-form').className = 'busy';
    });

CommentUpdater.addCommentUpdatedHandler(
    function(request) {
        $('comment-button').disabled = false;
        $('comment-cancel').disabled = false;
        /*
        $('preview-form').removeAttribute('class');
        */
        $('preview-form').className = '';
        if (request.status != 200) return;
        $('preview_text').value = '';

        Element.remove('comment-form');

        /*
        gPreviewElement.setAttribute('class',
            gPreviewElement.getAttribute('class').replace('preview',''));
        */

        gPreviewElement.className
            = gPreviewElement.className.replace('preview','');
        gPreviewElement = null;

        var c = $('count');
        c.value = parseInt(c.value) + 1;
    });

CommentUpdater.addCommentFailedHandler(
    function(request) {
        alert('comment failed');
    });

CommentUpdater.addCommentCancelledHandler(
    function() {
        CommentUpdater.deID(gPreviewElement);
        if (gPreviewElement) {
            new Effect.BlindUp(gPreviewElement,{
                afterFinish: function() {
                    Element.remove(gPreviewElement);
                    gPreviewElement = null;
                }
            });
        }
    });

