/* v1.0 */
Registrano = {
    BlogBadge: {
        version: "1.0",
        messages: {
            attendees: "報名人數：",
            go_to_event: "前往活動報名網頁"
        },
        addEvent: function( obj, type, fn ) {
            if (obj.addEventListener) {
                obj.addEventListener( type, fn, false );
            }
            else if (obj.attachEvent) {
                obj["e"+type+fn] = fn;
                obj[type+fn] = function() { obj["e"+type+fn]( window.event ); }
                obj.attachEvent( "on"+type, obj[type+fn] );
            }
            else {
                obj["on"+type] = obj["e"+type+fn];
            }
        },
        /* http://code.google.com/p/getelementsbyclassname/ by Robert Nyman, http://www.robertnyman.com */
        getElementsByClassName: function(className, tag, elm) {
            if (document.getElementsByClassName) {
                getElementsByClassName = function (className, tag, elm) {
                    elm = elm || document;
                    var elements = elm.getElementsByClassName(className),
                        nodeName = (tag)? new RegExp("\\b" + tag + "\\b", "i") : null,
                        returnElements = [],
                        current;
                    for(var i=0, il=elements.length; i<il; i+=1){
                        current = elements[i];
                        if(!nodeName || nodeName.test(current.nodeName)) {
                            returnElements.push(current);
                        }
                    }
                    return returnElements;
                };
            }
            else if (document.evaluate) {
                getElementsByClassName = function (className, tag, elm) {
                    tag = tag || "*";
                    elm = elm || document;
                    var classes = className.split(" "),
                        classesToCheck = "",
                        xhtmlNamespace = "http://www.w3.org/1999/xhtml",
                        namespaceResolver = (document.documentElement.namespaceURI === xhtmlNamespace)? xhtmlNamespace : null,
                        returnElements = [],
                        elements,
                        node;
                    for(var j=0, jl=classes.length; j<jl; j+=1){
                        classesToCheck += "[contains(concat(' ', @class, ' '), ' " + classes[j] + " ')]";
                    }
                    try {
                        elements = document.evaluate(".//" + tag + classesToCheck, elm, namespaceResolver, 0, null);
                    }
                    catch (e) {
                        elements = document.evaluate(".//" + tag + classesToCheck, elm, null, 0, null);
                    }
                    while ((node = elements.iterateNext())) {
                        returnElements.push(node);
                    }
                    return returnElements;
                };
            }
            else {
                getElementsByClassName = function (className, tag, elm) {
                    tag = tag || "*";
                    elm = elm || document;
                    var classes = className.split(" "),
                        classesToCheck = [],
                        elements = (tag === "*" && elm.all)? elm.all : elm.getElementsByTagName(tag),
                        current,
                        returnElements = [],
                        match;
                    for(var k=0, kl=classes.length; k<kl; k+=1){
                        classesToCheck.push(new RegExp("(^|\\s)" + classes[k] + "(\\s|$)"));
                    }
                    for(var l=0, ll=elements.length; l<ll; l+=1){
                        current = elements[l];
                        match = false;
                        for(var m=0, ml=classesToCheck.length; m<ml; m+=1){
                            match = classesToCheck[m].test(current.className);
                            if (!match) {
                                break;
                            }
                        }
                        if (match) {
                            returnElements.push(current);
                        }
                    }
                    return returnElements;
                };
            }
            return getElementsByClassName(className, tag, elm);
        },
        init: function() {
            var badges = this.getElementsByClassName('registrano-blog-badge');
            for (var i=0; i<badges.length; i++) {
                if (!badges[i].id || !badges[i].id.match(/registrano-blog-badge-.+/).length) {
                    continue;
                }
                var name = badges[i].id.replace(/^registrano-blog-badge-/,"");
                var s = document.createElement('script');
                s.type="text/javascript";
                s.src='http://registrano.com/events/' + name + '.js?callback=Registrano.BlogBadge.render&time=' + (new Date()).getTime();
                document.getElementById(badges[i].id).appendChild(s);
            }
        },
        formatDate: function(date, format) {
            if(date instanceof Date) {
                var months = new Array("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec");
                var yyyy = date.getFullYear();
                var yy = yyyy.toString().substring(2);
                var m = date.getMonth() + 1;
                var mm = m < 10 ? "0" + m : m;
                var mmm = months[m-1];
                var d = date.getDate();
                var dd = d < 10 ? "0" + d : d;

                var h = date.getHours();
                var hh = h < 10 ? "0" + h : h;
                var n = date.getMinutes();
                var nn = n < 10 ? "0" + n : n;
                var s = date.getSeconds();
                var ss = s < 10 ? "0" + s : s;

                format = format.replace(/yyyy/i, yyyy);
                format = format.replace(/yy/i, yy);
                format = format.replace(/mmm/i, mmm);
                format = format.replace(/mm/i, mm);
                format = format.replace(/m/i, m);
                format = format.replace(/dd/i, dd);
                format = format.replace(/d/i, d);
                format = format.replace(/hh/i, hh);
                format = format.replace(/h/i, h);
                format = format.replace(/nn/i, nn);
                format = format.replace(/n/i, n);
                format = format.replace(/ss/i, ss);
                format = format.replace(/s/i, s);

                return format;
            } else {
                return "";
            }
        },
        render: function(data) {
            var start_at = new Date(data.start_at),
                end_at   = new Date(data.end_at),
                day      = Math.floor( (end_at - start_at) / 86400000 ),
                str      = "",
                id       = 'registrano-blog-badge-' + data.name;

            str += '<h5 class="event-title">' + data.title + '</h5>';
            str += '<div class="bd">';
            str += '<div class="event-date">';
            if (day) {
                var year = end_at.getFullYear() - start_at.getFullYear();
                if (year) {
                    str += this.formatDate(start_at, "yyyy/mm/dd hh:nn") + ' ~ ' + this.formatDate(end_at, "yyyy/mm/dd hh:nn");
                } else {
                    str += this.formatDate(start_at, "yyyy/mm/dd hh:nn") + ' ~ ' + this.formatDate(end_at, "mm/dd hh:nn");
                }
            } else {
                str += this.formatDate(start_at, "yyyy/mm/dd hh:nn") + ' ~ ' + this.formatDate(end_at, "hh:nn");
            }
            str += '</div>';
            str += '<div class="event-attendees">' ;
            if( isNaN(data.total) ){
             str += this.messages.attendees + data.total;
            }
            if (parseInt(data.capacity) > 0) {
                str += ( isNaN(data.total) ? '' : '/' ) + data.capacity;
            }
            str += '</div>';
            str += '<div><a class="event-link" href="' + data.url + '">' + this.messages.go_to_event + '</a></div>';
            if (data.registrants) {
                str += '<ul class="event-attendees-list">';
                var len = data.registrants.length;
                for (var i=0; i<len; i++) {
                    str += '<li><img alt="' + data.registrants[i].nickname + '" src="' + data.registrants[i].icon + '"></li>';
                }
                str += '</ul>';
            }
            str += '</div>';
            document.getElementById(id).innerHTML += str;
        }
    }
};

Registrano.BlogBadge.addEvent(window, 'load', function() {
    Registrano.BlogBadge.init();
});
