var MAX_LEN = 132;
var AFTER_DELIMS = ' !#%&)*+,-./:;=>?@]^_`|}~　！＃％＆）＊＋，－．／：；＝＞？＠］＾＿｀｜｝」』】〉》〕、。～・‥…';
var BEFORE_DELIMS = '"' + "'" + '$(<[{”’＄（＜［￥｛「『【〈《〔';
var POST_DESC = false;
var HINT_TID = 0;
var d = document;
TwitterAPI.SERVER = 'http://taj-proxy.appspot.com';
TwitterAPI.PATH = 'splitwit';
$(function(){
	$('#relogin').click(function(){
		TwitterAPI.relogin();
		return false;
	});

	var longstr = '';
	var headerstr = '';
	var footerstr = '';
	var longtweet = $('#longtweet');
	var tweetheader = $('#tweetheader');
	var tweetfooter = $('#tweetfooter');
	tweetheader.focus(viewHint).blur(hideHint);
	tweetfooter.focus(viewHint).blur(hideHint);
	var tid = setInterval(function() {
		var str = longtweet.val().replace(/[\n\r]+/g, ' ');
		var header = tweetheader.val();
		var footer = tweetfooter.val();
		var changed = false;
		if (str != longstr) {
			longstr = str;
			changed = true;
		}
		if (header != headerstr) {
			headerstr = header;
			changed = true;
		}
		if (footer != footerstr) {
			footerstr = footer;
			changed = true;
		}
		if (changed) {
			parseStr(str, header, footer);
		}
	}, 500);
});
function viewHint() {
	clearTimeout(HINT_TID);
	$('#info').animate({opacity: 0.0});
	$('#hint').animate({opacity: 1.0});
}
function hideHint() {
	clearTimeout(HINT_TID);
	HINT_TID = setTimeout(function() {
		$('#info').animate({opacity: 1.0});
		$('#hint').animate({opacity: 0.0});
	}, 500);
}
function parseStr(str, header, footer) {
	var len = str.length;
	if (len == 0) {
		$('#preview').html('ここにプレビューが表示されます。');
		return;
	}
	var tweets = new Array();
	var tweet = '';
	var scrap = '';
	var maxLen = MAX_LEN - header.length - footer.length;
	for (var i=0; i<len; i++) {
		var c = str[i];
		var isA = (AFTER_DELIMS.indexOf(c) >= 0);
		var isB = (BEFORE_DELIMS.indexOf(c) >= 0);
		if (isA || isB) {
			if (isA) scrap += c;
			if (tweet.length + scrap.length > maxLen) {
				if (tweet.length > 0) {
					tweets.push(tweet);
					tweet = scrap;
				} else if (scrap.length > 0) {
					tweets.push(scrap);
				}
			} else {
				tweet += scrap;
			}
			scrap = '';
			if (isB) scrap += c;
		} else {
			scrap += c;
		}
	}
	if (tweet.length + scrap.length < maxLen) {
		tweet += scrap;
		scrap = '';
	}
	if (tweet.length > 0) {
		tweets.push(tweet);
	}
	if (scrap.length > 0) {
		tweets.push(scrap);
	}
	var preview = $('#preview');
	preview.empty();
	var max = tweets.length;
	var over = false;
	for (var i=0; i<max; i++) {
		var tweet = header + tweets[i].trim() + (footer.length > 0 ? ' ' : '') + footer;
		if (max>1) tweet += ' (' + (i+1) + '/' + max + ')';
		var count = tweet.length;
		if (count > 140) over = true;
		preview.append(
			'<div class="block" id="block_' + i + '">' +
				'<input type="hidden" id="tweet_' + i + '" value="' + tweet.html() + '" />' +
				'<div class="tweet">' + tweet.html() + '</div>' +
				'<div class="count' + (count > 140 ? ' over' : '') + '">' + count + ' <img src="style/loading.gif" /></div>' +
			'</div>'
		);
	}
	if (over) {
		preview.append(
			'<div class="result error">' +
				'分割に失敗し、140 文字を超えてしまったツイートがあります。スペースなどで調整して下さい。' +
			'</div>'
		);
	} else {
		preview.append(
			'<div class="result">' +
				'<input type="radio" name="postDesc" id="postDesc_false" onclick="postDesc(false);" />' +
				'<label for="postDesc_false">若い番号順で上から下に</label> ' +
				'<input type="radio" name="postDesc" id="postDesc_true" onclick="postDesc(true);" />' +
				'<label for="postDesc_true">逆順にして下から上へ</label>' +
				'<br />' +
				'<input type="button" value="まとめて投稿する" id="postAll" onclick="postAll(' + max + ');" />' +
			'</div>'
		);
		$('#postDesc_' + POST_DESC).attr('checked', true);
	}
}
function postDesc(desc) {
	POST_DESC = desc;
}
function postAll(max) {
	TwitterAPI.users.own(function(own) {
		if (own && own.screen_name) {
			$('#postAll, #tweetheader, #tweetfooter, #longtweet, #postDesc_false, #postDesc_true').attr('disabled', true);
			var btn = $('#postAll');
			post(btn, 0, max, own.screen_name);
		} else {
			alert('認証に失敗しました。');
		}
	});
}
function post(btn, index, max, name) {
	if (index >= max) {
		btn.hide();
		$('#longtweet').val('');
		$('#postAll, #tweetheader, #tweetfooter, #longtweet, #postDesc_false, #postDesc_true').attr('disabled', false);
		return;
	}
	var blockIndex = POST_DESC ? max - index - 1 : index;
	btn.val(name + ' に投稿中... (' + (index+1) + '/' + max + ')');
	var block = $('#block_' + blockIndex);
	block.addClass('posting');
	var tweet = $('#tweet_' + blockIndex).val();
	TwitterAPI.statuses.update(tweet, function() {
		block.fadeOut();
		setTimeout(function() {
			post(btn, index+1, max, name);
		}, 500);
	});
}

String.prototype.trim = function() {
    return this.replace(/^[ ]+|[ ]+$/g, '');
}
String.prototype.html = function() {
    return this.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;');
}
