if (typeof renderTwitters != "function") {
    (function () {
        var j = function () {
            var b = navigator.userAgent.toLowerCase();
            return {
                webkit: /(webkit|khtml)/.test(b),
                opera: /opera/.test(b),
                msie: /msie/.test(b) && !/opera/.test(b),
                mozilla: /mozilla/.test(b) && !/(compatible|webkit)/.test(b)
            };
        }();
        var k = 0;
        var n = [];
        var o = false;
        var p = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
        window.ify = function () {
            var c = {
                '"': "&quot;",
                '&': "&amp;",
                '<': "&lt;",
                '>': "&gt;"
            };
            return {
                link: function (t) {
                    return t.replace(/[a-z]+:\/\/[a-z0-9-_]+\.[a-z0-9-_:~%&\?\/.=]+[^:\.,\)\s*$]/gi, function (m) {
                        return "<br>Lien : <a href=\"" + m + "\">" + (m.length > 25 ? m.substr(0, 24) + "..." : m) + "</a> / ";
                    });
                }, at: function (t) {
                    return t.replace(/(^|[^\w]+)\@([a-zA-Z0-9_]{1,15})/g, function (m, a, b) {
                        return a + ("@<a href=\"http://twitter.com/" + b + "\">" + b + "</a>");
                    });
                }, hash: function (t) {
                    return t.replace(/(^|[^\w'"]+)\#([a-zA-Z0-9_]+)/g, function (m, a, b) {
                        return ''//a + ("<a href=\"http://search.twitter.com/search?q=%23" + b + "\">" + b + "</a>");
                    });
                }, clean: function (a) {
                    return this.hash(this.at(this.link(a)));
                }
            };
        }();
        window.renderTwitters = function (a, b) {
            function node(e) {
                return document.createElement(e);
            }


            function text(t) {
                return document.createTextNode(t);
            }

            var c = document.getElementById(b.twitterTarget);
            var d = null;
            var f = node("ul"),
                li, statusSpan, timeSpan, i, max = a.length > b.count ? b.count : a.length;
            for (i = 0; i < max && a[i]; i++) {
                d = getTwitterData(a[i]);
                if (b.ignoreReplies && a[i].text.substr(0, 1) == "@") {
                    max++;
                    continue;
                }
                li = node("li");
                if (b.template) {
                    li.innerHTML = b.template.replace(/%([a-z_\-\.]*)%/gi, function (m, l) {
                        var r = d[l] + "" || "";
                        if (l == "text" && b.enableLinks) {
                            r = ify.clean(r);
                        }
                        return r;
                    });
                } else {
                    statusSpan = node("span");
                    statusSpan.className = "twitterStatus";
                    timeSpan = node("span");
                    timeSpan.className = "twitterTime";
                    statusSpan.innerHTML = a[i].text;
                    if (b.enableLinks == true) {
                        statusSpan.innerHTML = ify.clean(statusSpan.innerHTML);
                    }
                    //timeSpan.innerHTML = relative_time(a[i].created_at);
                    if (b.prefix) {
                        var s = node("span");
                        s.className = "twitterPrefix";
                        s.innerHTML = b.prefix.replace(/%(.*?)%/g, function (m, l) {
                            return a[i].user[l];
                        });
                        li.appendChild(s);
                        li.appendChild(text(" "));
                    }
                    li.appendChild(statusSpan);
                    li.appendChild(text(" "));
                    li.appendChild(timeSpan);
                }
                if (b.newwindow) {
                    li.innerHTML = li.innerHTML.replace(/<br><a href/gi, "<a target=\"_blank\" href");
                }
                f.appendChild(li);
            }
            if (b.clearContents) {
                while (c.firstChild) {
                    c.removeChild(c.firstChild);
                }
            }
            c.appendChild(f);
            if (typeof b.callback == "function") {
                b.callback();
            }
        };
        window.getTwitters = function (e, f, g, h) {
            k++;
            if (typeof f == "object") {
                h = f;
                f = h.id;
                g = h.count;
            }
            if (!g) {
                g = 1;
            }
            if (h) {
                h.count = g;
            } else {
                h = {};
            }
            if (!h.timeout && typeof h.onTimeout == "function") {
                h.timeout = 10;
            }
            if (typeof h.clearContents == "undefined") {
                h.clearContents = true;
            }
            if (h.withFriends) {
                h.withFriends = false;
            }
            h.twitterTarget = e;
            if (typeof h.enableLinks == "undefined") {
                h.enableLinks = true;
            }
            window["twitterCallback" + k] = function (a) {
                if (h.timeout) {
                    clearTimeout(window["twitterTimeout" + k]);
                }
                renderTwitters(a, h);
            };
            ready(function (c, d) {
                return function () {
                    if (!document.getElementById(c.twitterTarget)) {
                        return;
                    }
                    var a = "http://www.twitter.com/statuses/" + (c.withFriends ? "friends_timeline" : "user_timeline") + "/" + f + ".json?callback=twitterCallback" + d + "&count=20&cb=" + Math.random();
                    if (c.timeout) {
                        window["twitterTimeout" + d] = setTimeout(function () {
                            if (c.onTimeoutCancel) {
                                window["twitterCallback" + d] = function () {};
                            }
                            c.onTimeout.call(document.getElementById(c.twitterTarget));
                        }, c.timeout * 1000);
                    }
                    var b = document.createElement("script");
                    b.setAttribute("src", a);
                    document.getElementsByTagName("head")[0].appendChild(b);
                };
            }(h, k));
        };
        DOMReady();

        function getTwitterData(a) {
            var b = a,
                i;
            for (i in a.user) {
                b["user_" + i] = a.user[i];
            }
            b.time = ''//relative_time(a.created_at);
            return b;
        }


        function ready(a) {
            if (!o) {
                n.push(a);
            } else {
                a.call();
            }
        }


        function fireReady() {
            o = true;
            var a;
            while ((a = n.shift())) {
                a.call();
            }
        }


        function DOMReady() {
            if (document.addEventListener && !j.webkit) {
                document.addEventListener("DOMContentLoaded", fireReady, false);
            } else if (j.msie) {
                document.write("<script id=__ie_init defer=true src=//:></script>");
                var a = document.getElementById("__ie_init");
                if (a) {
                    a.onreadystatechange = function () {
                        if (this.readyState != "complete") {
                            return;
                        }
                        this.parentNode.removeChild(this);
                        fireReady.call();
                    };
                }
                a = null;
            } else if (j.webkit) {
                var b = setInterval(function () {
                    if (document.readyState == "loaded" || document.readyState == "complete") {
                        clearInterval(b);
                        b = null;
                        fireReady.call();
                    }
                }, 10);
            }
        }


        function relative_time(c) {
            var d = c.split(" "),
                parsed_date = Date.parse(d[1] + (" " + d[2] + ", " + d[5] + " " + d[3])),
                date = new Date(parsed_date),
                relative_to = arguments.length > 1 ? arguments[1] : new Date,
                delta = parseInt((relative_to.getTime() - parsed_date) / 1000),
                r = "";

            function formatTime(a) {
                var b = a.getHours(),
                    min = a.getMinutes() + "",
                    ampm = "AM";
                if (b == 0) {
                    b = 12;
                } else if (b == 12) {
                    ampm = "PM";
                } else if (b > 12) {
                    b -= 12;
                    ampm = "PM";
                }
                if (min.length == 1) {
                    min = "0" + min;
                }
                return b + (":" + min + " " + ampm);
            }


            function formatDate(a) {
                var b = a.toDateString().split(/ /),
                    mon = p[a.getMonth()],
                    day = a.getDate() + "",
                    dayi = parseInt(day),
                    year = a.getFullYear(),
                    thisyear = (new Date).getFullYear(),
                    th = "th";
                if (dayi % 10 == 1 && day.substr(0, 1) != "1") {
                    th = "st";
                } else if (dayi % 10 == 2 && day.substr(0, 1) != "1") {
                    th = "nd";
                } else if (dayi % 10 == 3 && day.substr(0, 1) != "1") {
                    th = "rd";
                }
                if (day.substr(0, 1) == "0") {
                    day = day.substr(1);
                }
                return mon + (" " + day + th + (thisyear != year ? ", " + year : ""));
            }

            delta = delta + relative_to.getTimezoneOffset() * 60;
            if (delta < 5) {
                r = "less than 5 seconds ago";
            } else if (delta < 30) {
                r = "half a minute ago";
            } else if (delta < 60) {
                r = "less than a minute ago";
            } else if (delta < 120) {
                r = "1 minute ago";
            } else if (delta < 2700) {
                r = parseInt(delta / 60).toString() + " minutes ago";
            } else if (delta < 10800) {
                r = "about 1 hour ago";
            } else if (delta < 86400) {
                r = "about " + parseInt(delta / 3600).toString() + " hours ago";
            } else {
                if (delta < 172800) {
                    r = formatTime(date) + " yesterday";
                } else {
                    r = formatTime(date) + (" " + formatDate(date));
                }
            }
            return r;
        }

    }());
}
