// ==UserScript==
// @name           Bittwit
// @namespace      jp.in_vitro.gmscript.bittwit
// @description    Append bit.ly shorten button to Twitter
// @include        http://twitter.com/*
// ==/UserScript==

// constants
var bitlyUrl = 'http://api.bit.ly/shorten?version=2.0.1';
var bitlyAccount = 'bittwit';
var bitlyApiKey = 'R_27b4c8e5f21e6743359bed34babbbd0d';

(function(d){

function main(){
    // get Twitter submit button node
    var updateSubmit = document.getElementById("update-submit");
    if(updateSubmit == null){
        return;
    }
    var statusBtn = updateSubmit.parentNode;
    if(statusBtn == null){
        return;
    }

    // <br> between udpate button and shorten button
    var br = document.createElement("br");
    statusBtn.appendChild(br);

    // shorten button
    var bittwitSubmit = document.createElement("input");
    bittwitSubmit.id = 'bittwit-submit';
    bittwitSubmit.class = 'status-btn round-btn';
    bittwitSubmit.type = 'button';
    bittwitSubmit.value = 'Shorten selected';
    bittwitSubmit.name = 'Shorten';
    bittwitSubmit.style.margin = '3px 0px';
    bittwitSubmit.addEventListener('click', function(){shorten();}, true);
    statusBtn.appendChild(bittwitSubmit);

    var titleCheckbox = document.createElement("input");
    titleCheckbox.id = 'title-checkbox';
    titleCheckbox.type = 'checkbox';
    titleCheckbox.value = '1';
    titleCheckbox.name = 'title-checkbox';
    titleCheckbox.style.margin = '8px 2px';
    titleCheckbox.checked = true;
    statusBtn.appendChild(titleCheckbox);
}

var originalUrl;
var requireTitle;
var title;
var shortUrl;
var done;
var remind;

function shorten(){
    GM_log('Start function shorten.');

    getRequireTitle();

    // get original url
    getOriginalUrl();
    if(originalUrl == null){
        return;
    }

    if(requireTitle){
        getTitle();
    }
    callBitly();

    remind = 10;
    replaceUrl();
}

function getOriginalUrl(){
    // get textarea node for status
    var status = document.getElementById("status");
    var statusValue = status.value;

    // get selected value
    var start = status.selectionStart;
    var end = status.selectionEnd;
    var selectedValue = statusValue.slice(start, end);

    if(selectedValue == ""){
        var urlRegexp = /(\w+):\/\/(\S+)/;
        var regexpResult = statusValue.match(urlRegexp);
        if(regexpResult == null){
            originalUrl = null;
	}
        originalUrl = regexpResult[0];
    }else{
        originalUrl = selectedValue;
    }

    if(originalUrl.indexOf("http") != 0){
        originalUrl = null;
    }

    GM_log('Original url is ' + originalUrl);
}

function getRequireTitle(){
    var require = document.getElementById('title-checkbox');
    requireTitle = require.checked;
}

function getTitle(){
   
    GM_xmlhttpRequest({
        method: "GET",
        url: originalUrl,
        onload: function(response){
            var html = response.responseText;
            var titleRegexp = /<title>(.+)<\/title>/;
            var regexpResult = html.match(titleRegexp);
            if(regexpResult == null){
               titleRegexp = /<title>(.+)/;
               regexpResult = html.match(titleRegexp);
               if(regexpResult == null){
                   title = null;
               }
            }
            title = regexpResult[1];
        }
    });
}

function replaceUrl(){
    if((shortUrl != null && (!requireTitle || title != null)) || remind <= 0){
        var status = document.getElementById('status');
        var statusValue = status.value;
        statusValue = statusValue.replace(originalUrl, (requireTitle ? title + " ": "") + shortUrl); 
        status.value = statusValue;
        title = null;
        shortUrl = null;
    }else{
        remind--;
        setTimeout(replaceUrl, 500);
    }
}

function callBitly(){

    // create url of bit.ly api
    var url = bitlyUrl + '&login=' + bitlyAccount;
    url += '&apiKey=' + bitlyApiKey;
    url += '&longUrl=' + encodeURI(originalUrl);

    GM_log('bit.ly URL is ' + url);

    // call bit.ly api
    GM_xmlhttpRequest({
        method: "GET",
        url: url,
        onload: function(bitlyResponse){
            GM_log('Receive bit.ly API response.' + bitlyResponse.responseText); 

            var json = eval('(' + bitlyResponse.responseText + ')');
            var statusCode = json.statusCode;
            if(statusCode != 'OK'){
                GM_log('Status code of bit.ly API response is not OK.' + statusCode);
                return;
            }
            shortUrl = json.results[originalUrl].shortUrl;
        }
    });

    GM_log('End function shorten.');
}

main();
}(document));

