// Loosely based on a work by Remy Sharp, see http://remysharp.com/2007/05/18/add-twitter-to-your-blog-step-by-step/
// Modified Apr 2009 by Oliver Lau <oliver@knallwade.de>
// $Id: twitter.js 7f68c826a8a2 2010/01/14 06:58:06 Oliver Lau <oliver@knallwade.de> $

var browser = (function() {
    var b = navigator.userAgent.toLowerCase();
    return {
        safari: /webkit/.test(b),
        opera: /opera/.test(b),
        msie: /msie/.test(b) && !(/opera/).test(b),
        mozilla: /mozilla/.test(b) && !(/(compatible|webkit)/).test(b)
    };
})();

var readyList = [];
var isReady = false;

function ready(callback) {
    if (!isReady)
        readyList.push(callback);
    else
        callback.call();
}

function fireReady() {
    isReady = true;
    var fn;
    while (fn = readyList.shift())
        fn.call();
}

function prepareOnReady() {
    if (browser.mozilla || browser.opera) {
        document.addEventListener('DOMContentLoaded', fireReady, false);
    }
    else if (browser.msie) {
        document.write("<scr" + "ipt id=__ie_init defer=true src=//:><\/script>");
        var script = document.getElementById('__ie_init');
        if (script) {
            script.onreadystatechange = function() {
                if (this.readyState != 'complete')
                    return;
                this.parentNode.removeChild(this);
                fireReady.call();
            };
        }
        script = null;
    } else if (browser.safari) {
        var safariTimer = setInterval(function() {
            if (document.readyState == 'loaded' || document.readyState == 'complete') {
                clearInterval(safariTimer);
                safariTimer = null;
                fireReady.call();
            }
        }, 10);
    }
}

var tweet = {
    target: 'tweet',
    hideReplies: true,
    callback: 'twitterCallback',
    username: 'bein_godik',
    page: 1,
    count: 25,
    maxCount: 200,
    tries: 0,
    maxTries: 10,
    loaderIcon: '<img src="http://static.knallwade.de/images/loading2.gif" style="border:0" width="16" height="16" title="Bitte warten ...">'
};

tweet.render = function(obj) {
    var target = document.getElementById(this.target);
    var pageSpan = document.createElement('p');
	if (obj == null || typeof(obj) == 'undefined') {
		if (++this.tries < this.maxTries)
			return this.get();
	    pageSpan.innerHTML = 'Fehler beim Einlesen! <input type="button" onclick="tweet.getWithLoaderIcon()" value="Nochmal versuchen">';
	    clearSubtree(target);
		target.appendChild(pageSpan);
		return 0;
	}
	this.tries = 0;
    pageSpan.className = 'twitterPage';
    pageSpan.style.height = '16px';
    pageSpan.style.width = '16px';
    pageSpan.id = 'pageSpan';
    pageSpan.innerHTML = 'Seite&nbsp;' + this.page;
    var ul = document.createElement('ul');
    var max = (obj.length > this.count)? this.count : obj.length;
    for (var i = 0; obj[i] && (i < max); ++i) {
    	var o =  obj[i];
        if (this.hideReplies && o.text.substr(0, 1) == '@') 
            continue;
        var li = document.createElement('li');
        var statusSpan = document.createElement('span');
        statusSpan.className = 'twitterStatus';
        statusSpan.innerHTML = linkify(o.text);
        var timeSpan = document.createElement('span');
        timeSpan.className = 'twitterTime';
        timeSpan.innerHTML = '<a href="http://twitter.com/' + o.user.screen_name + '/statuses/' + o.id + '" target="_blank">' + relative_time(o.created_at) + '</a>';;
        li.appendChild(statusSpan);
        li.appendChild(document.createElement('br'));
        li.appendChild(timeSpan);
        ul.appendChild(li);
    }
    clearSubtree(target);
    target.appendChild(pageSpan);
    target.appendChild(ul);
    if (this.page > 1) {
		var prevButton = document.createElement('input');
		prevButton.type = 'button';
		prevButton.id = 'prevButton';
		prevButton.value = '<- jüngere Einträge';
		prevButton.onclick = function() { tweet.prev(); };
		prevButton.className = 'more';
		target.appendChild(prevButton);
    }
    target.appendChild(document.createTextNode(' '));
    if ((obj.length >= this.count) && (this.count < this.maxCount)) {
        var nextButton = document.createElement('input');
		nextButton.type = 'button';
		nextButton.id = 'nextButton';
		nextButton.value = 'ältere Einträge ->';
		nextButton.onclick = function() { tweet.next(); };
		nextButton.className = 'more';
		target.appendChild(nextButton);
    }
    var twitSrcSpan = document.createElement('p');
    twitSrcSpan.className = 'twitterSrc';
    twitSrcSpan.innerHTML = 'Datenquelle: <a href="http://twitter.com/bein_godik" target="_blank">twitter.com/bein_godik</a>';
    target.appendChild(twitSrcSpan);
};

tweet.get = function () {
	window[this.callback] = function(obj) { tweet.render(obj); };
	ready((function() {
        return function () {
            if (!document.getElementById(tweet.target))
                return;
            var url = '/twitproxy2.php?page=' + tweet.page + '&count=' + tweet.count + '&x=' + Math.random();
            var script = document.createElement('script');
            script.setAttribute('src', url);
            document.getElementsByTagName('head')[0].appendChild(script);
        };
    })());
};

tweet.getWithLoaderIcon = function() {
	var target = document.getElementById(this.target);
	clearSubtree(target);
	target.innerHTML = this.loaderIcon;
	this.get();
};

tweet.disablePrevNextButtons = function() {
    var prevButton = document.getElementById('prevButton');
    if (prevButton)
        prevButton.disabled = true;
    var nextButton = document.getElementById('nextButton');
    if (nextButton)
        nextButton.disabled = true;
    var pageSpan = document.getElementById('pageSpan');
    if (pageSpan)
        pageSpan.innerHTML = this.loaderIcon;
};

tweet.proceed = function() {
    this.disablePrevNextButtons();
    this.get();
    scrollToTop('maincontent');
    return false;
};

tweet.prev = function() {
   	--this.page;
   	return this.proceed();
};

tweet.next = function() {
    ++this.page;
   	return this.proceed();
};

var fullMonthName = [ 'Januar', 'Februar', 'März', 'April', 'Mai', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember' ];

function relative_time(time_value) {
    var values = time_value.split(' ');
    var parsed_date = Date.parse(values[1] + ' ' + values[2] + ', ' + values[5] + ' ' + values[3]);
    var date = new Date(parsed_date);
    var relative_to = new Date();
    var delta = parseInt((relative_to.getTime() - parsed_date) / 1000);
    var r = '';

    function formatTime(date) {
        var min = date.getMinutes() + '';
        if (min.length == 1)
            min = '0' + min;
        return date.getHours() + ':' + min + '&nbsp;Uhr';
    }

    function formatDate(date) {
        var year = date.getFullYear();
        return date.getDate() + '. ' + fullMonthName[date.getMonth()] + ' ' + (((new Date()).getFullYear() != year)? year : '');
    }

    delta += 60*relative_to.getTimezoneOffset();
    if (delta < 5) {
        r = 'vor weniger als fünf Sekunden';
    } else if (delta < 30) {
        r = 'vor einer halben Minute';
    } else if (delta < 60) {
        r = 'vor weniger als einer Minute';
    } else if (delta < 120) {
        r = 'vor gut einer Minute';
    } else if (delta < (45*60)) {
        r = 'vor ' + (parseInt(delta/60)).toString() + ' Minuten';
    } else if (delta < (2*90*60)) {
        r = 'vor etwa einer Stunde';
    } else if (delta < (24*60*60)) {
        r = 'vor etwa ' + (parseInt(delta/3600)).toString() + ' Stunden';
    } else {
        var sOffset = -60*relative_to.getTimezoneOffset();
        var tzDate = new Date(date.getTime() + 1000*sOffset);
        r = 'am ' + formatDate(tzDate) + ' um ' + formatTime(tzDate);
    }
    return r;
}


var linkifyEntities = { '"':'&quot;', '&':'&amp;', '<':'&lt;', '>':'&gt;' };

function linkify(s) {
	return s.replace(/^RT /, function(m) {
		return '<acronym title="Re-tweeting">RT</acronym> ';
	}).replace(/(https?:\/\/[\w\.-]+\.[a-z\.]{2,6}[\/\w\.-]*\/?)( - )?/g, function(d, m1, m2) {
		var res = m1.match(/(http:\/\/[\w\.-]+\/)(\w+)/);
		if (res) {
			var lnk  = res[1];
			var code = res[2];
			if (lnk.match(/((twitgoo|twitpic)\.com|img\.ly)/)) {
				return '<p><a target="_blank" href="' + m1 + '"><img src="' + lnk + 'show/thumb/' + code + '"></a></p>';
			}
			else if (lnk.match(/yfrog\.com/)) {
				return '<p><a target="_blank" href="' + m1 + '"><img src="' + m1 + '.th.jpg" style="border:0"></a></p>';
			}
		}
		return d;
 	}).replace(/((href|src)=")?([A-Za-z]+:\/\/[A-Za-z0-9-_]+\.[A-Za-z0-9-_:%&\?\/.=]+)/g, function(m1, m2, m3, m4) {
	    return (m2=='href="' || m2=='src="')? (m2 + m4) : '<a target="_blank" href="' + m4 + '">' + m4 + '</a>';
	}).replace(/(^|[^\w])(@[\d\w\-]+)/g, function(d, m1, m2) {
	    return m1 + '@<a target="_blank" href="http://twitter.com/' + m2.substr(1) + '">' + m2.substr(1) + '</a>';
	}).replace(/"&<>/, function (m) {
	    return linkifyEntities[m];
	}).replace(/(^|[^\w])(#[\d\wäöüÄÖÜáéíóúàèìòùß-]+)/g, function(d, m1, m2) {
	    return m1 + '#<a target="_blank" href="http://twitter.com/search?q=' + m2.substr(1) + '">' + m2.substr(1) + '</a>';
	}).replace(/(^|[^\w])(L:([^ ,\.]+))/g, function(d, m1, m2) {
	    return m1 + '<a target="_blank" href="http://maps.google.com/maps?q=' + m2.substr(2) + '">' + m2.substr(2) + '</a>';
	});
}

function clearSubtree(node) {
    while (node.firstChild)
    	node.removeChild(node.firstChild);
}

var scrollInterval = 10; // ms
var scrollDuration; // ms
var scrollTime;
var scrollTarget;
var scrollDistance;
var scroller = null;

function accel(t, b, c, d) {
    return c/2*(1-Math.cos(Math.PI*t/d))+b;
}

function scrollPage() {
	scrollTime += scrollInterval;
	if (scrollTime < scrollDuration) {
		window.scrollTo(0, accel(scrollTime, scrollTarget, scrollDistance, scrollDuration));
    }
    else {
        window.scrollTo(0, scrollTarget + scrollDistance);
        clearInterval(scroller);
        scroller = null;
    }
}

function scrollToTop(id) {
	if (document.getElementById(id)) {
		scrollTime = 0;
		var topPos = document.getElementById(id).offsetTop;
		var heightCorrection = (topPos > 20)? 20 : 0;
		if (typeof (window.pageYOffset) == 'number') {
			// Non-IE modern browsers
			scrollTarget = window.pageYOffset;
			scrollDistance = topPos - heightCorrection - scrollTarget;
			scrollDuration = 500;
		}
		else if (document.documentElement) {
			// IE in Standards Compliance mode
			scrollTarget = document.documentElement.scrollTop;
			scrollDistance = topPos - scrollTarget;
			if (window.XMLHttpRequest)
				scrollDuration = 500; // IE7
			else
				scrollDuration = 1500; // IE6
		}
		else if (document.body && (document.body.scrollLeft || document.body.scrollTop) ) {
			// DOM compliant method, IE Quirks Mode
			scrSt = document.body.scrollTop;
			scrollDistance = topPos - scrollTarget;
			scrollDuration = 500;
		}
		if (scroller)
		    clearInterval(scroller);
	    scroller = setInterval(scrollPage, scrollInterval);
	}
}

prepareOnReady();
