var TG = {
    namespace: function(ns) {
        if (!this[ns]) {
            this[ns] = {};
        }
    }
};
TG.namespace('util');
TG.util.build = {
    retweet: function(listItem, cx) {
        // RT @username <tweet> <url>
        var username = $(listItem).attr('tg:username');
        var tweet = $(listItem).attr('tg:tweet');
        var url = $(listItem).attr('tg:href');

        $('.r_msg_id', cx).val('');
        $('.reply_twitter_msg_id', cx).val('');
        $('.tweet_text', cx).val('RT @' + jQuery.trim(username) + ': ' + jQuery.trim(tweet) + ' ' + jQuery.trim(url) + ' ').focus().trigger('keyup');
    },

    reply: function(listItem, cx) {
        // @username <url>
        var username = $(listItem).attr('tg:username');
        var tweet = $(listItem).attr('tg:tweet');
        var rmsgid = $(listItem).attr('tg:msg_id');
        var rtweetid = $(listItem).attr('tg:twitter_id');
        var url = $(listItem).attr('tg:href');

        $('.r_msg_id', cx).val(rmsgid);
        $('.twitter_in_reply_to_status_id', cx).val(rtweetid);
        $('.tweet_text', cx).val('@' + jQuery.trim(username) + ' ').focus().trigger('keyup');
    }
};

TG.util.oauth = {
    win: null,
    timer: null,
    loginUpdate: function() {
        $.getJSON('/-login/check?format=json', TG.util.oauth.loginCallback);
    },
    loginCallback: function(data) {
        if (data && data.loggedin) {
            TG.util.login.update(data);
        }
    },
    winCheck: function() {
        if (!TG.util.oauth.win || TG.util.oauth.win.closed) {
            window.clearInterval(TG.util.oauth.timer);
            return TG.util.oauth.loginUpdate();
        }
    },
    loginClick: function() {
        TG.util.oauth.win = window.open('/-oauth-twitter/request?gotoafter=1&gotor=oauthtwitter&gotop=action%3Dwindowend', 
            'OAuthTwitterRequest', 
            'menubar=yes,location=yes,resizable=yes,scrollbars=yes,status=yes,width=800,height=400');
        if (!TG.util.oauth.win) return true;

        TG.util.oauth.timer = window.setInterval(TG.util.oauth.winCheck, 300);
        return false;
    }
};

TG.util.login = {
    updatefnlist: [],
    update: function(data) {
        $(TG.util.login.updatefnlist).each(function() {
            this(data);
        });
    },
    updateGlobal: function(data) {
        if (data.loggedin) {
            $('body').removeClass('loggedout').addClass('loggedin');
            TG.util.msg.clear();
            TG.util.msg.add('success', 'You are now logged in as '+data.username);
        } else {
            $('body').removeClass('loggedin').addClass('loggedout');
            TG.util.msg.clear();
            TG.util.msg.add('success', 'You are now logged out');
        }
    },
    updateHeader: function(data) {
        if (data.loggedin) {
            $('li.mygoo a').attr('href', '/u/'+data.username)
                .attr('title', 'Logged in as '+data.username);
            $('li.logout a').attr('title', 'Logged in as '+data.username);
        } else {
            $('li.mygoo a').attr('href', '')
                .attr('title', '');
            $('li.logout a').attr('title', '');
        }
    },
    submitForm: function(f) {
        TG.util.msg.add('success', 'Now uploading your message...');
        $(f).submit();
    }
};
TG.util.login.updatefnlist = [TG.util.login.updateGlobal, TG.util.login.updateHeader];

TG.util.msg = {
    clear: function() {
        var hold = $('div#messages div.hidden').clone();
        $('div#messages div.message').slideUp('fast').remove();
        $(hold).appendTo('div#messages');
    },
    add: function(type, message) {
        var tpl = $('div#messages div.hidden').clone();
        $(tpl).addClass(type).find('span').html(message);
        $(tpl).appendTo('div#messages');
        $(tpl).slideDown('fast');
    }
};

TG.util.follow = {
    submit: function(f) {
        var followMeAction = $(f).attr('action');
        var followMeButton = $(f).find('button');
        var beforeText = followMeButton.html();
        followMeButton.html('Updating...').blur().attr('disabled', 'disabled');

        var params = $(f).serialize() + '&ar=1';
        $.post(followMeAction,
        params,
        function(data) {
            if (data.response.status == 'ok') {
                // successful follow
                followMeButton.hide();
                $(f).next().find('button').show();
            }
            followMeButton.html(beforeText).removeAttr('disabled');
        },
        "json");
    }
}

$(document).ready(function(){

    // Add Hover classes to buttons for all browsers
    $("button").hover(function() {
        $(this).addClass("hover");
    }, function() {
        $(this).removeClass("hover");
    });

    // Add Hover class to the tweets for IE6 
    $("ul.tweet li").hover(function() {
        $(this).addClass("hover");
    }, function() {
        $(this).removeClass("hover");
    });

    // Extra fun for tweet box on focus 
    //todo whats this for
    $('.tweet_text').focus(function(){
        $(this).parent("div.tweetBox").addClass("focus");
    }).blur(function(){
        $(this).parent("div.tweetBox").removeClass("focus");
    });

    // Swap the default file input for a text feld to paste links into
    $('a.toggle-url').click(function() {
        $(this).closest('p').hide().next().show();
        return false;
    });
    // Cancel the URL field and take user back to upload field
    $('a.cancel-upload-url').click(function(){
        $(this).closest('p').hide().prev().show();
        return false;
    });

    //url input 'defaults'
    var default_input_upload_url = 'Enter Image URL';
    var elt_upload_url = $('input.upload_url');
    elt_upload_url.each(function() {
        if ($(this).val() == '') $(this).val(default_input_upload_url);
    });
    elt_upload_url.focus(function(){
        if ($(this).val() == default_input_upload_url) $(this).val('');
    }).blur(function(){
        if ($(this).val() == '') $(this).val(default_input_upload_url);
    }).closest('form').submit(function() {
        var elt = $('input.upload_url', this);
        if (elt.val() == default_input_upload_url) elt.val('');
    });

    //twitter username 'defaults'
    var default_input_username = 'Twitter Username';
    var elt_username = $('input.username');
    elt_username.each(function() {
        if ($(this).val() == '') $(this).val(default_input_username);
    });
    elt_username.focus(function() { 
        if ($(this).val() == default_input_username) $(this).val('');
    }).blur(function() { 
        if ($(this).val() == '') $(this).val(default_input_username);
    }).closest('form').submit(function() {
        var elt = $('input.username', this);
        if (elt.val() == default_input_username) elt.val('');
    });

    // The actual password field
    $('input.password').hide().blur(function() {
        if ($(this).val() == '') {
            $(this).toggle();
            $(this).next().toggle();
        }
    });
    // Password dummy field
    $('input.password-dummy').show().focus(function() {
        $(this).toggle();
        $(this).prev().toggle().focus();
    });

    //search q 'defaults'
    $('#search_form').submit(function() {
        window.location= "/s/" + $('#q').val();
        return false;
    });
    var default_input_q = 'Search Now';
    var elt_q = $('input#q');
    if (elt_q.val() == '') elt_q.val(default_input_q);
    elt_q.focus(function() { 
        $(this).val('');
    }).blur(function() { 
        if ($(this).val() == '') $(this).val(default_input_q);
    }).closest('form').submit(function() {
        var elt = $('input#q', this);
        if (elt.val() == default_input_q) elt.val('');
    });

    // ------------------------------------------
    // CHARACTER COUNTER
    // ------------------------------------------
    $('input.uploadfile').change(function(){
        twimageURL = 30;
        $(this).closest('fieldset').find('textarea.tweet_text').keyup();
    });
    $('input.upload_url').keyup(function(){
        twimageURL = ($(this).val().length > 0) ? (30) : (0);
        $(this).closest('fieldset').find('textarea.tweet_text').keyup();
    });
    var maxTweetLength = 140;
    var twimageURL = 0;

    $('textarea.tweet_text').keyup(function(){
        var span = $(this).closest('form').find('span.chars-remaining');
        var button = $(this).closest('form').find('button');
        var tweetLength = $(this).val().length;
        var charsLeft = maxTweetLength - tweetLength - twimageURL;

        if (charsLeft < 0) {
            button.attr('disabled','disabled').addClass('disabled');
        } else if (charsLeft >= 0) {
            button.removeAttr('disabled').removeClass('disabled');
        }

        if (charsLeft <= 10) {
            span.html(charsLeft).removeClass('coming-close').addClass('maxed-out');
        } else if (charsLeft <= 20) {
            span.html(charsLeft).addClass('coming-close').removeClass('maxed-out');
        } else if (charsLeft > 20) {
            span.html(charsLeft).removeClass('coming-close').removeClass('maxed-out');
        }
    }).trigger('keyup');

    $('form.tweet').submit(function(e) {
        $('form.tweet button').attr('disabled','disabled').addClass('disabled');
        if (!$('body').hasClass('loggedin')) {
            TG.util.login.updatefnlist[TG.util.login.updatefnlist.length] = function(data) {
                if (data.loggedin) {
                    TG.util.login.submitForm(e.target);
                }
            }
            TG.util.oauth.loginClick();
            return false;
        }
    });

    $('form.followForm').submit(function(e) {
        $(this).find('button').attr('disabled','disabled').addClass('disabled');
        if (!$('body').hasClass('loggedin')) {
            TG.util.login.updatefnlist[TG.util.login.updatefnlist.length] = function(data) {
                if (data.loggedin) {
                    TG.util.follow.submit(e.target);
                }
            }
            TG.util.oauth.loginClick();
            return false;
        } else {
            TG.util.follow.submit(e.target);
            return false;
        }
    });

    // re-tweet & reply
    $('ol.tweet dd.rt a').click(function() {
        TG.util.build.retweet($(this).parents('li'));
        return false;
    });
    $('ol.tweet dd.reply a').click(function() {
        TG.util.build.reply($(this).parents('li'));
        return false;
    });

    // close messages
    $('div.message a.close').live('click', function() {
        $(this).parent('div.message').slideUp('fast');
        return false;
    });

    //oauth links
    $('.oauthrequest a').click(TG.util.oauth.loginClick);

});
