var ustwt_sinceID = null;
var ustwt_tweetTimeout = null;
var ustwt_recalculateTime = null;
var ustwt_ignoredIDs = new Array();
var ustwt_prefix;
var ustwt_suffix;
var ustwt_requestTime = 10; //second

function ustwt_loadTweets() {
    var url = 'http://search.twitter.com/search.json?random=' + Math.random();
    url += '&callback=ustwt_gotTweets';
    url += '&q=' + encodeURIComponent(ustwt_prefix);
    url += '&rpp=10';
    if (ustwt_sinceID !== null) {
        url += '&since_id=' + ustwt_sinceID;
    }
    var script = new Element('script');
    script.type = 'text/javascript';
    script.src = url
    $(document.body).grab(script);
	$$('#tweets').setStyle('height',document.body.offsetHeight-81 )
}

function ustwt_loadTweetsIn(secs) {
    ustwt_cancelTweetLoad();
    ustwt_tweetTimeout = setTimeout(ustwt_loadTweets, secs * 1000);
    ustwt_recalculateTimes();
}

function ustwt_recalculateTimes() {
    $each($$('.tweetago'), function(i,j){
	i.set('text', ' '+ustwt_fuzzyTime(new Date(i.get('alt'))));
    });
}

function ustwt_cancelTweetLoad() {
    if (ustwt_tweetTimeout !== null) {
        clearTimeout(ustwt_tweetTimeout);
    }
}

function ustwt_fuzzyTime(date) {
    var now = new Date();
    var secs = (now - date) / 1000;
    if (secs < 5) {
        return 'less than 5 seconds ago';
    } else if (secs < 10) {
        return 'less than 10 seconds ago';
    } else if (secs < 20) {
        return 'less than 20 seconds ago';
    } else if (secs < 60) {
        return 'half a minute ago';
    } else if (secs < 120) {
        return '1 minute ago';
    } else if (secs < 60*60) {
        var minutes = Math.floor(secs / 60);
        return minutes + ' minutes ago';
    } else if (secs < 24*60*60) {
        var hours = Math.floor(secs / (60*60));
        if (hours == 1) {
            return 'about 1 hour ago';
        } else {
            return 'about ' + hours + ' hours ago';
        }
    } else {
        return date.toDateString();
    }
}

function ustwt_gotTweet(profileImageURL, username, text, createdAt) {
    var userURL = 'http://twitter.com/' + username;

    var div = new Element('div');
    div.addClass('tweet');

    var imgLink = new Element('a');
    imgLink.target = "_blank";
    imgLink.href = userURL;

    var img = new Element('img');
    img.src = profileImageURL;
    img.width = 32;
    img.height = 32;
    img.alt = '';
    imgLink.grab(img);

    div.grab(imgLink);

    var mainDiv = new Element('div');
    mainDiv.addClass('tweetmain');

    var userName = new Element('b');
    userName.appendText(username);
    userName.addClass('tweettext');
    mainDiv.grab(userName);
    mainDiv.appendText(': ');

    if (text.substr(text.length - ustwt_suffix.length - 3).replace(/&gt;/g, ">").replace(/ /g,"+") == ustwt_suffix) {
        text = text.substr(0, text.length - ustwt_suffix.length - 3);
    }

    // URLs to links
    text = text.replace(/(ftp|http|https):\/\/[0-9a-zA-Z/.?#&]+(\b|$)(\/?)/gim,'<a href="$&" target="_blank">$&</a>');
    text = text.replace(/([^\/])(www[0-9a-zA-Z/.?#&]+(\b|$))(\/?)/gim, '$1<a href="http://$2" target="_blank">$2</a>');

    // Solution B: text = text.replace(/ \(.* live &gt; http:\/\/ustre.am\/.*\)/gi, "");
    var textSpan = new Element('span');
    textSpan.addClass('tweettext');
    textSpan.set('html', text);
    mainDiv.grab(textSpan);

    var dateSpan = new Element('span');
    dateSpan.addClass('tweetago');
    dateSpan.set('alt', createdAt);
    dateSpan.appendText(' ').appendText(ustwt_fuzzyTime(new Date(createdAt)));
    mainDiv.grab(dateSpan);

    div.grab(mainDiv);

    var clearHackDiv = new Element('div');
    clearHackDiv.addClass('clearhack');
    div.grab(clearHackDiv);

    $('tweets').grab(div, 'top');
    $$('.tweet.first').removeClass('first');
    $$('.tweet:first-child').addClass('first');
}

function ustwt_gotTweets(data) {
	var newTweet = false;

    if (ustwt_sinceID === null || data.max_id > ustwt_sinceID) {
        ustwt_sinceID = data.max_id;
    }

    var tweets = data.results;
    for (var i = tweets.length-1; i >= 0; i--) {
        var tweet = tweets[i];
        if (ustwt_ignoredIDs.indexOf(tweet.id) == -1) {
        	if (!newTweet) {
        		newTweet = true;
        	}

            ustwt_gotTweet(tweet.profile_image_url, tweet.from_user,
                           tweet.text, tweet.created_at);
        }
    }

    // only the first 100 tweet sholud visible
    $each($$('.tweet'), function(obj, i) {
    	if (i >= 100) {
    		obj.destroy();
    	}
    });

    if (newTweet) {
    	ustwt_requestTime = ustwt_requestTime * 0.8;
    	if (ustwt_requestTime < 10) {
    		ustwt_requestTime = 10;
    	}
    } else {
    	ustwt_requestTime = ustwt_requestTime * 1.25;
    	if (ustwt_requestTime > 60) {
    		ustwt_requestTime = 60;
    	}
    }

    //console.log('New message: '+(newTweet ? 'yes' : 'no')+'\nRequest time: '+ustwt_requestTime+' sec');

    ustwt_loadTweetsIn(ustwt_requestTime);
}

function ustwt_createForm() {
    var username = null;
    var password = null;

    function unfilled(field, callback) {
        var oldSpellcheck;
        function handler() {
            field.spellcheck = oldSpellcheck;
            field.removeEvent('click', handler);
            field.removeEvent('focus', handler);
            field.value = '';
            field.removeClass('unfilled');
            if (callback !== undefined) {
                callback();
            }
        }
        field = $(field);
        field.addClass('unfilled');
        oldSpellcheck = field.spellcheck;
        field.spellcheck = false;
        field.addEvent('click', handler);
        field.addEvent('focus', handler);
    }

    function onEnter(field, callback) {
        $(field).addEvent('keypress', function(ev) {
            if (ev.code == 13) {
                callback();
            }
        });
    }

    function unfilledPassword(field, callback) {
    	unfilled(field, function() {
            try {
            	$('passwordFieldOver').setStyle('display', 'none');
            } catch (err) { }
            if (callback !== undefined) {
                callback();
            }
        });
    }

    $('error').setStyle('display', 'none');
    $('error').setStyle('opacity', '0');
    $('error').setStyle('visibility', 'hidden');
    function showError(msg, callback) {
        function formFadedOut() {
            $('form').get('tween').removeEvent('complete', formFadedOut);
            if (callback !== undefined) {
                callback();
            }
            $('error').setStyle('display', 'block');
            $('error').fade('in');
            $('error').set('text', msg);
            $('error').get('tween').addEvent('complete', errorFadedIn);
        }
        function errorFadedIn() {
            $('error').get('tween').removeEvent('complete', errorFadedIn);
            $('error').fade('out');
            $('error').get('tween').addEvent('complete', errorFadedOut);
        }
        function errorFadedOut() {
            $('error').get('tween').removeEvent('complete', errorFadedOut);
            $('error').setStyle('display', 'none');
            $('form').fade('in');
            $('error').set('text', '');
        }
        $('form').fade('out');
        $('form').get('tween').addEvent('complete', formFadedOut);
    }

    function createLoginForm() {
        $('form').empty();

        var loginForm = new Element('div');
        loginForm.addClass('loginform');
        loginForm.setStyle('position', 'relative');

        var loginTitle = new Element('span');
        loginTitle.addClass('logintitle')
        loginTitle.appendText('Login with Twitter: ');
        loginForm.grab(loginTitle);

        var usernameField = new Element('input');
        usernameField.set('type', 'text');
        if (aGetCookie('ustwUserName'))
        	usernameField.set('value', aGetCookie('ustwUserName'));
        else
        	usernameField.set('value', 'Username');
        usernameField.addClass('usernamefield');
        unfilled(usernameField);
        loginForm.grab(usernameField);

        var passwordField = new Element('input');
        passwordField.set('type', 'password');
        passwordField.set('id', 'passwordfield');
        passwordField.addClass('passwordfield');
        if (aGetCookie('ustwPwd'))
        	passwordField.set('value', aGetCookie('ustwPwd'));
        else
        {
			unfilledPassword(passwordField);
		}
        loginForm.grab(passwordField);

        var passwordFieldOver = new Element('div', {
        	id: 'passwordFieldOver',
        	html: 'Password',
        	styles: {
	        	position: 'absolute',
	        	zIndex: 5,
	        	top: 20,
	        	left: 293,
	        	width: 92,
	        	height: 16,
	        	backgroundColor: 'transparent',
	        	color: '#a8b1b9',
	        	fontSize: 12,
	        	textAlign: 'left',
	        	padding: '5px 0 0 3px',
	        	border: '0 none',
	        	verticalAlign: 'middle'
        	},
        	events: {
        		click: function() {
        			$('passwordFieldOver').setStyle('display', 'none');
        			$('passwordfield').focus();
        		}
        	}
        });
        loginForm.grab(passwordFieldOver);

        var loginBtn = new Element('input');
        loginBtn.set('type', 'button');
        loginBtn.set('value', 'Login');
        loginBtn.addClass('loginbtn');
        if (aGetCookie('ustwUserName') && aGetCookie('ustwPwd'))
        {
			submit();
        }
        else
        {
        	loginForm.grab(loginBtn);
        	$('form').grab(loginForm);
		}
        function submit() {
            $('form').fade('out');
            new Request.JSON({url: '/twitterjs/login', onSuccess: function(data) {
                if (data.success) {
                    username = usernameField.value;
                    password = passwordField.value;
                    aSetCookie('ustwUserName', username);
                    aSetCookie('ustwPwd', password);
                    createSendForm();
                    $('form').fade('in');
                } else {
                    showError(data.error);
                }
            }, onFailure: function() {
                showError('Network error. Please retry.');
            }}).post({
                username: usernameField.value,
                password: passwordField.value
            });
        }
        loginBtn.addEvent('click', submit);
        onEnter(usernameField, submit);
        onEnter(passwordField, submit);
    }
    createLoginForm();

    function createSendForm() {
        $('form').empty();

        var msgFieldWrapper = new Element('div');
        msgFieldWrapper.addClass('msgfieldwrapper');

        var msgField = new Element('input');
        msgField.set('type', 'text');
        msgField.addClass('msgfield');
        msgField.set('value', 'Hey '+ustwt_prefix.replace('+', ' ') + ' ');

        msgFieldWrapper.grab(msgField);

        $('form').grab(msgFieldWrapper);

        var sendMeta = new Element('div');
        sendMeta.addClass('sendmeta');

        var login = new Element('div');
        login.addClass('login');
        login.appendText('@' + username + ' | ');

        var logoutLink = new Element('a');
        logoutLink.set('href', '#');
        logoutLink.set('text', 'log out');
        logoutLink.addEvent('click', function(ev) {
            ev.preventDefault();
            username = null;
            password = null;
            aDeleteCookie('ustwUserName');
            aDeleteCookie('ustwPwd');
            function formFadedOut() {
                $('form').get('tween').removeEvent('complete', formFadedOut);
                createLoginForm();
                $('form').fade('in');
            }
            $('form').fade('out');
            $('form').get('tween').addEvent('complete', formFadedOut);
        });

        login.grab(logoutLink);

        sendMeta.grab(login);

        var sendBtnWrapper = new Element('div');
        sendBtnWrapper.addClass('sendbtnwrapper');

        var charCount = new Element('span');
        charCount.addClass('charcount');
        sendBtnWrapper.grab(charCount);

        var sendBtn = new Element('input');
        sendBtn.set('type', 'button');
        sendBtn.addClass('sendbtn');
        sendBtn.set('value', 'Send');
        sendBtnWrapper.grab(sendBtn);

        sendMeta.grab(sendBtnWrapper);

        $('form').grab(sendMeta);

        function error() {
            if (!msgField.value) {
                return 'Enter a message.';
            }
            if (remainingChars() < 0) {
                return 'Ack! Too many characters!';
            }
            return null;
        }

        function remainingChars() {
            var length = msgField.value.length + 1 + ustwt_suffix.length;
            return 140 - length;
        }

        function update() {
            charCount.set('text', remainingChars());
            if (error() !== null) {
                sendBtn.addClass('disabled');
            } else {
                sendBtn.removeClass('disabled');
            }
        }
        msgField.addEvent('keyup', update);
        msgField.addEvent('keypress', update);
        update();
        try {
            msgField.focus();
        } catch (err) { }

        function makeFollowBox() {
            var followBox = new Element('div');
            followBox.addClass('followbox');

            var followTextWrapper = new Element('div');
            followTextWrapper.addClass('followtextwrapper');

            var followText = new Element('span');
            followText.addClass('followtext');
            followText.set('text', 'Follow us for live updates!');
            followTextWrapper.grab(followText);

            followBox.grab(followTextWrapper);

            var followLogo = new Element('img');
            followLogo.addClass('followlogo');
            followLogo.src = 'http://cdn1.ustream.tv/socialfeed/followlogo.jpg';
            followLogo.width = 20;
            followLogo.height = 20;
            followBox.grab(followLogo);

            var followName = new Element('span');
            followName.addClass('followname');
            followName.set('text', 'Ustream');
            followBox.grab(followName);

            var followButton = new Element('input');
            followButton.addClass('followbutton');
            followButton.set('type', 'button');
            followButton.set('value', 'Follow');
            followButton.addEvent('click', function() {
                new Request().send({
                    'url': '/twitterjs/follow',
                    'data': {
                        'username': username,
                        'password': password
                    }
                });
                followButton.setStyle('display', 'none');
                followedCheck.setStyle('display', 'block');
                followText.fade('out');
                followText.get('tween').addEvent('complete', function() {
                    followText.set('text', 'You are now following us!');
                    followText.fade('in');
                });
            });
            followBox.grab(followButton);

            var followedNotice = new Element('div');
            followedNotice.addClass('followednotice');

            var followedCheck = new Element('img');
            followedCheck.addClass('followedcheck');
            followedCheck.width = 9;
            followedCheck.height = 9;
            followedCheck.src = 'followedcheck.gif';
            followedCheck.setStyle('display', 'none');
            followBox.grab(followedCheck);
            return followBox;
        }

        function startCountdown(follows) {
            var start = new Date();
            $('countdown').setStyle('visibility', 'hidden');
            $('countdown').setStyle('opacity', '0');
            var countdownText = new Element('div');
            $('countdown').grab(countdownText);
            if (!follows) {
                $('countdown').grab(makeFollowBox());
            }
            function tick() {
                var remaining = 30 - Math.floor((new Date() - start) / 1000);
                if (remaining <= 0) {
                    function countdownFadedOut() {
                        $('countdown').get('tween').removeEvent('complete', countdownFadedOut);
                        $('countdown').empty();
                        $('form').fade('in');
                    }
                    $('countdown').fade('out');
                    $('countdown').get('tween').addEvent('complete', countdownFadedOut);
                } else {
                    countdownText.set('text', 'Please wait ' + remaining + ' seconds before tweeting again.');
                    setTimeout(tick, 1000);
                }
            }
            tick();
            $('countdown').fade('in');
        }

        function send() {
            var errorMsg = error();
            if (errorMsg !== null) {
                showError(errorMsg);
                return;
            }

            $('form').fade('out');
            new Request.JSON({url: '/twitterjs/send', onSuccess: function(data) {
                if (data.success) {
                    createSendForm();
                    startCountdown(data.follows);
                    ustwt_gotTweet(data.result.user.profile_image_url,
                                   data.result.user.screen_name,
                                   data.result.text,
                                   new Date());
                    ustwt_ignoredIDs.push(data.result.id);
                } else {
                    showError(data.error);
                }
            }, onFailure: function() {
                showError('Network error. Please retry.');
            }}).post({
                username: username,
                password: password,
                message: msgField.value + ' ' + ustwt_suffix
            });
        }
        sendBtn.addEvent('click', send);
        onEnter(msgField, send);
    }
}

function ustwt_parseQueryString() {
    var result = {};
    var query = document.location.search.substring(1);
    var parts = query.split("&");
    for (var i = 0; i < parts.length; i++) {
        var part = parts[i].split("=");
        var key = decodeURIComponent(part[0]);
        var value = decodeURIComponent(part[1]);
        result[key] = value;
    }
    return result;
}

function ustwt_start() {
    var query = ustwt_parseQueryString();
    ustwt_prefix = query['prefix'];
    ustwt_suffix = query['suffix'].replace(/&gt;/gi, ">");
   /* if (ustwt_suffix.indexOf('ustream.com') === -1 &&
        ustwt_suffix.indexOf('ustream.tv') === -1 &&
        ustwt_suffix.indexOf('ustre.am') === -1) {
        $(document.body).empty();
        $(document.body).setStyle('background', 'red');
        return;
    }*/
    ustwt_loadTweets();
    ustwt_createForm();
}

function aGetCookie(name)
{
   var start = document.cookie.indexOf(name+"=");
   var len = start+name.length+1;
   if ((!start) && (name != document.cookie.substring(0,name.length))) return null;
   if (start == -1) return null;
   var end = document.cookie.indexOf(";",len);
   if (end == -1) end = document.cookie.length;
   return unescape(document.cookie.substring(len,end));
}

function aSetCookie(name,value,expires,path,domain,secure)
{
	var exdate=new Date();
	exdate.setDate(exdate.getDate()+30);

	var cookieString = name + "=" +escape(value) +
	   ( (expires) ? ";expires=" + expires.toGMTString() : '') +
	   ( (path) ? ";path=" + path : "") +
	   ( (domain) ? ";domain=" + domain : "") +
	   ( (secure) ? ";secure" : "");
	document.cookie = cookieString;
}

function aDeleteCookie(name,path,domain)
{
   if (aGetCookie(name)) document.cookie = name + "=" +
	  ( (path) ? ";path=" + path : "") +
	  ( (domain) ? ";domain=" + domain : "") +
	  ";expires=Thu, 01-Jan-70 00:00:01 GMT";
}

window.addEvent('domready', ustwt_start);

