var twitUsername = '';
var twitPassword = '';
var twitAt = 'yo @matisyahu ';
var twitEnd = ' #matisTV';
var tweetRefresh = 120 * 1000;
var $pUsername;
var $pPassword;
var $pPostMsg;
var $pPost;
var $pErrMsg;
var $pCounter;
var $pLogin;
var $pLoginInfo;
var $pLoginBtn;
var $pSendBtn;

var errMsg = '';
var errMsgTm = -1;
var waitTm;
var waitSecs;

$(function() {
    pageInit();

    $pLoginBtn.click(function() {   // Login/out button
        if(twitLoggedIn()) {
            twitLogout();
            updateStatus();
            return true;
        }
        
        twitUsername = $pUsername.val();
        twitPassword = $pPassword.val();

        if(!validateCredentials()) {    // Outputs err msg on err
            updateStatus();
            return false;
        }

        var postData = 'name=' + twitUsername + '&pass=' + twitPassword;
        
        $.ajax( {
            type: "POST",
            cache: false,
            url: "/tv/twitter_verify/",
            data: postData,
            success: function( msg ){
                errMsg = msg;
            },
            error: function (XMLHttpRequest, textStatus, errorThrown) {
                errMsg = textStatus + errorThrown;
            },
            complete: function (XMLHttpRequest, textStatus, errorThrown) {
                if(handleLoginApiCall(errMsg)) {
                    twitLogin();
                }
                updateStatus();
            }
        });
    });
    
    $pSendBtn.click( function() {
        var msg = $pPostMsg.val();
        if(msg == 'Type your message here' || msg.length < 4) {
            errMsg = 'Invalid status update message';
            updateStatus();
            return false;
        }
        
        var postData = 'name=' + twitUsername + '&pass=' + twitPassword + '&msg=' + twitAt + msg + twitEnd;
    
        $.ajax( {
            type: "POST",
            cache: false,
            url: "/tv/twitter_post/",
            data: postData,
            success: function( msg ){
                errMsg = msg;
            },
            error: function (XMLHttpRequest, textStatus, errorThrown) {
                errMsg = textStatus + errorThrown;
            },
            complete: function (XMLHttpRequest, textStatus, errorThrown) {
                if(handleSendApiCall(errMsg)) {
                    disablePosting();
                }
                updateStatus();
            }
        });
    });
});

function pageInit()
{
    $pLogin = $(".twitLogin");
    $pUsername = $(".twitLogin input:text").toggleVal({populateFrom: "custom", text: "username"}).hide();
    $pPassword = $(".twitLogin input:password").toggleVal({populateFrom: "custom", text: "password"}).hide();
    $pLoginBtn = $(".twitLogin input:button");

    $pPostMsg = $(".twitPost textarea").toggleVal({populateFrom: "custom", text: "Type your message here"});
    $pSendBtn = $(".twitPost input:button");
    $pCounter = $(".twitCounter");
    
    $pPost = $(".twitPost").hide();
    $pLoginInfo = $(".twitLoginInfo").hide();
    $pWait = $(".twitWait").hide();
    $pErrMsg = $(".twitErr").hide();

    updateCounter();

    $pPostMsg.focus(updateCounter).blur(updateCounter).keydown(limitCounter).keypress(updateCounter).keyup(updateCounter);
    
    twitToggleLogin();
    
    // TODO: If post time exists then get time remaining and restart the time
    // For now make it another 30 secs.
    if(getPostTimeCookie()) {
        disablePosting();
    }
    
    setInterval( "reloadTweetsContent()", tweetRefresh );
}

function reloadTweetsContent() {
    $('.tweets').load("/tv/twitter_search?").animate({opacity: 0.3}, 300 ).animate({opacity: 1.0}, 500, 'swing' );
}

function disablePosting() {
    $pPost.fadeOut(1100);
    waitSecs = 30;
    setPostTimeCookie();
    $pWait.html('You have ' + waitSecs + ' secs. until you may post again');
    $pWait.fadeIn(2000);
    waitTm = setInterval("enablePosting()", 1 * 1000);
}

function enablePosting() {
    --waitSecs;
    $pWait.html('You have <strong>' + waitSecs + ' secs.</strong> until you may post again');
    if(waitSecs <= 0) {
        clearInterval(waitTm);
        $pWait.fadeOut(600);
        if(twitLoggedIn()) {        // Ha!
            $pPost.fadeIn(1000);
        }            
    }
}

function handleLoginApiCall(result) {
    if(result == '200') {
        errMsg = "Authenticated login";
        return true;
    }
    else if(result == '401') {
        errMsg = "Invalid login credentials";
        return false;
    }
    errMsg = result;
    return false;
}

function handleSendApiCall(result) {
    if(result == '200') {
        errMsg = "Twitter status updated";
        return true;
    }
    else if(result == '401') {
        errMsg = "Invalid login credentials";
        return false;
    }
    errMsg = result;
    return false;
}

function updateStatus() {
    if(errMsgTm > 0) {      // Already have a status msg going
        clearInterval(errMsgTm);
        $pErrMsg.fadeOut(200);
    }
    $pErrMsg.html(errMsg).fadeIn(800);
    errMsgTm = setInterval( "hideErrMsg()", 5000 );
}

function hideErrMsg() {
    clearInterval(errMsgTm);
    errMsgTm = -1;
    $pErrMsg.fadeOut(800);
}

function twitToggleLogin() {
    if(twitLoggedIn()) {
        $pUsername.fadeOut(400).hide();
        $pPassword.fadeOut(400).hide();
        if($pWait.is(':hidden') && !getPostTimeCookie())
            $pPost.fadeIn(1000);
        $pLoginInfo.hide().text('You are logged in as ' + twitUsername).fadeIn(600);
        $pLoginBtn.hide().val('logout').fadeIn(600);
    }
    else {
        $pLoginInfo.hide();
        $pPost.fadeOut(1000);
        $pLoginBtn.hide().val('login').fadeIn(600);
        $pUsername.fadeIn(600);
        $pPassword.fadeIn(600);
    }
}

function updateCounter() {
    if($pPostMsg.val().length > 140 - twitAt.length - twitEnd.length) {
        $pPostMsg.val($pPostMsg.val().substr(0, 140 - twitAt.length - twitEnd.length));
    }
    $pCounter.html(140 - $pPostMsg.val().length - twitAt.length - twitEnd.length);
}

function limitCounter(e) {
    if($pPostMsg.val() > 140 - twitAt.length - twitEnd.length && e.keyCode != 8)
        return false;
    return true;
}

function twitLoggedIn() {
    twitGetCredentials();
    if(twitUsername == '' || twitPassword == '')
        return false;
    return true;
}

function twitLogin() {
    twitSetCredentials();
    twitToggleLogin();
}

function twitLogout() {
    twitDelCredentials();
    $pUsername.val(twitUsername).blur();
    $pPassword.val(twitPassword).blur();
    $pPostMsg.val('').blur();
    twitToggleLogin();
    errMsg = 'Logged out';
}

function validateCredentials() {
    errMsg = '';
    if(twitUsername == 'username' || twitUsername.length < 4) {
        errMsg = 'Invalid or too short username';
    }
    else if(twitPassword == 'password' || twitPassword.length < 4) {
        errMsg = 'Invalid or too short password';
    }

    if(errMsg.length) {
        return false;
    }
    return true;
}

function twitGetCredentials() {
    try {
        Cookies = new CookieHandler();
        twitUsername = Cookies.getCookie('twitu');
        twitPassword = Cookies.getCookie('twitp');
    }
    catch(e) { 
        twitUsername = '';
        twitPassword = '';
    }
    
    if(typeof(twitUsername) == 'undefined' || twitUsername == null) {
        twitUsername = '';
    }
    if(typeof(twitPassword) == 'undefined' || twitPassword == null) {
        twitPassword = '';
    }
}

function twitSetCredentials() {
    try {
        Cookies = new CookieHandler();
        Cookies.setCookie('twitu', twitUsername);
        Cookies.setCookie('twitp', twitPassword);
    }
    catch(e){
    }
}

function twitDelCredentials() {
    try {
        Cookies = new CookieHandler();
        Cookies.deleteCookie('twitu');
        Cookies.deleteCookie('twitp');
    }
    catch(e){
    }

    twitUsername = '';
    twitPassword = '';
}

function getPostTimeCookie() {
    try {
        Cookies = new CookieHandler();
        if(!Cookies.getCookie('twitpt'))
            return false;
    }
    catch(e) { 
        return false;
    }
    
    return true;
}

function setPostTimeCookie() {
    try {
        Cookies = new CookieHandler();
        Cookies.setCookie('twitpt', 'post-delay', 30);
    }
    catch(e){
    }
}

function delPostTimeCookie() {
    try {
        Cookies = new CookieHandler();
        Cookies.deleteCookie('twitpt');
    }
    catch(e){
    }
}
