var site_url = 'http://sort.lounge.jp/';

function addEvent(elm, listener, fn) {
	try { elm.addEventListener(listener, fn, false); }
	catch (e) { elm.attachEvent("on"+listener, fn); }
}

var html = '';

var theme = '';
var screen_name = '';
var title = '';
var detail = '';
var instruction = '';
var draw = '';
var list = new Array();
var new_uri = '';

getTheme();

var lstMember = new Array(); 
var parent = new Array(); 
var equal = new Array(); 
var rec = new Array(); 
var cmp1,cmp2; 
var head1,head2; 
var nrec; 

var qno;
var totalSize;
var finished;

//変数の初期化+++++++++++++++++++++++++++++++++++++++++++++ 
function initialize() {
	if (!title) {
		$('#sort-title').html('無効');
		$('#message').html('URLがおかしいっぽいです。').addClass('red');
		$('#sort-opponents').remove();
		return;
	}
	
	try { $('title').prepend(title + ' : '); }
	catch (e) { document.title = title + ' : ' + document.title; }
	
	$('#sort-title').html('<a href="'+site_url+theme+'">'+title+'</a>');
	
	if (html && screen_name) {
		$('#sort-ing').html('<a href="http://twitter.com/'+screen_name+'" target="_blank">@'+screen_name+'</a>のソート結果です。');
		$('#topic-path').append(' > <a href="'+site_url+theme+'/'+screen_name+'">@'+screen_name+'の結果</a>');
		$('#sort-end').remove();
		$('#message').html(detail).addClass('blue');
		$('#sort-opponents').remove();
		$('#sort-result').html(html);
		$('#sort-result').append('<input id="sort-twit" type="button" value="Twitterでつぶやく" />');
		$('#sort-twit').bind('click', function() {
			document.location = new_uri;
		});
		$('#foot-menu').html('<a href="'+site_url+theme+'">「'+title+'」を試す</a>');
	}
	else {
		if (draw == '') {
			$('#sort-opponents').addClass('prohibit-draw');
			$('#sort-draw').remove();
		}
		$('#sort-opponents').show();
		$('#message').html(detail + "<br />" + instruction).addClass('blue');
		$('#sort-ing').html('第 <span class="sort-qno"></span> 問目 （<span class="sort-process"></span>％ 完了）');
		if (draw != "") $('#sort-draw').html(draw);
	}
	
	if (screen_name) return;
	
	var n = 0;
	var mid;
	var i;
	
	//ソートすべき配列 
	lstMember[n] = new Array(); 
	for (i=0; i<list.length; i++) { 
		lstMember[n][i] = i; 
	} 
	parent[n] = -1; 
	totalSize = 0; 
	n++; 

	for (i=0; i<lstMember.length; i++) { 
	//要素数が２以上なら２分割し、 
	//分割された配列をlstMemberの最後に加える 
		if(lstMember[i].length>=2) { 
			mid = Math.ceil(lstMember[i].length/2); 
			lstMember[n] = new Array(); 
			lstMember[n] = lstMember[i].slice(0,mid); 
			totalSize += lstMember[n].length; 
			parent[n] = i; 
			n++; 
			lstMember[n] = new Array(); 
			lstMember[n] = lstMember[i].slice(mid,lstMember[i].length); 
			totalSize += lstMember[n].length; 
			parent[n] = i; 
			n++;
		}
	}
	
	nrec = 0;
	
	for (i = 0; i <= list.length; i++) {
		//保存用配列 
		rec[i] = 0; 
		//引き分けの結果を保存するリスト 
		equal[i] = -1;
	}

	cmp1 = lstMember.length-2;
	cmp2 = lstMember.length-1;
	head1 = 0;
	head2 = 0;
	qno = 1;
	finished = 0;

	$('#sort-opponent-a').bind('click', function() { sortList(-1); });
	$('#sort-opponent-b').bind('click', function() { sortList(1); });
	$('#sort-draw').bind('click', function() { sortList(0); });

	updateHtml(true); 

} 

//リストのソート+++++++++++++++++++++++++++++++++++++++++++ 
//flag：比較結果 
// -1：左を選択 
// 0：引き分け 
// 1：右を選択 
function sortList(flag) {
	if (finished >= totalSize) return false;
	
	var i;
	var str;
	
	//recに保存
	if (flag < 0) {
		rec[nrec] = lstMember[cmp1][head1];
		head1++;
		nrec++;
		finished++;
		while (equal[rec[nrec-1]]!=-1) {
			rec[nrec] = lstMember[cmp1][head1];
			head1++;
			nrec++;
			finished++;
		}
	}
	else if (flag>0) { 
		rec[nrec] = lstMember[cmp2][head2]; 
		head2++; 
		nrec++; 
		finished++; 
		while (equal[rec[nrec-1]]!=-1) { 
			rec[nrec] = lstMember[cmp2][head2]; 
			head2++; 
			nrec++; 
			finished++; 
		} 
	} 
	else { 
		rec[nrec] = lstMember[cmp1][head1]; 
		head1++; 
		nrec++; 
		finished++; 
		while (equal[rec[nrec-1]]!=-1) { 
			rec[nrec] = lstMember[cmp1][head1]; 
			head1++; 
			nrec++; 
			finished++; 
		} 
		equal[rec[nrec-1]] = lstMember[cmp2][head2]; 
		rec[nrec] = lstMember[cmp2][head2]; 
		head2++; 
		nrec++; 
		finished++; 
		while (equal[rec[nrec-1]]!=-1) { 
			rec[nrec] = lstMember[cmp2][head2]; 
			head2++; 
			nrec++; 
			finished++;
		}
	}

//片方のリストを走査し終えた後の処理 
if (head1<lstMember[cmp1].length && head2==lstMember[cmp2].length) { 
//リストcmp2が走査済 - リストcmp1の残りをコピー 
while (head1<lstMember[cmp1].length){ 
rec[nrec] = lstMember[cmp1][head1]; 
head1++; 
nrec++; 
finished++; 
} 
} 
else if (head1==lstMember[cmp1].length && head2<lstMember[cmp2].length) { 
//リストcmp1が走査済 - リストcmp2の残りをコピー 
while (head2<lstMember[cmp2].length){ 
rec[nrec] = lstMember[cmp2][head2]; 
head2++; 
nrec++; 
finished++; 
} 
} 

	//両方のリストの最後に到達した場合は 
	//親リストを更新する
	if (head1==lstMember[cmp1].length && head2==lstMember[cmp2].length) { 
		for (i=0; i<lstMember[cmp1].length+lstMember[cmp2].length; i++) { 
			lstMember[parent[cmp1]][i] = rec[i]; 
		} 
		lstMember.pop(); 
		lstMember.pop(); 
		cmp1 = cmp1-2; 
		cmp2 = cmp2-2; 
		head1 = 0; 
		head2 = 0; 

		//新しい比較を行う前にrecを初期化 
		if (head1==0 && head2==0) { 
			for (i=0; i<list.length; i++) { 
				rec[i] = 0; 
			} 
			nrec = 0; 
		} 
	} 

	if (cmp1<0) { 
		updateHtml(false);
	}
	else {
		updateHtml(true);
	}
}


//HTMLを更新
function updateHtml(flag) {
	if (flag) {
		var process = Math.floor(finished * 100 / totalSize);
		var str1 = list[ lstMember[cmp1][head1] ];
		var str2 = list[ lstMember[cmp2][head2] ];
		
		$('.sort-qno').html(qno);
		$('.sort-process').html(process);
		$('#sort-opponent-a').html(str1);
		$('#sort-opponent-b').html(str2);
		
		qno++; 
	}
	else {
		$('.sort-qno').html(qno-1);
		$('.sort-process').html(100);
		$('#sort-ing').html($('#sort-end').html());
		
		$('#sort-opponents').remove();
		showResult();
	}
} 

//結果の表示+++++++++++++++++++++++++++++++++++++++++++++++ 
function showResult() {
	var rank = 1;
	var same = 1;
	var i;
	
	var html = '<table><tr><th>順位</th><th>名前</th></tr>';
	var json = '';
	var ans = '';
	var no1 = "「"+list[lstMember[0][0]]+"」";
	if (equal[lstMember[0][0]] == lstMember[0][1]) no1 += "など";
	for (i = 0; i < list.length; i++) {
		html += '<tr><td class="rank">'+(rank <= 3 ? '<img src="/img/rank_'+rank+'.gif" alt="'+rank+'" />' : rank)+'</td><td>'+list[lstMember[0][i]]+'</td></tr>';
//		json += "'i"+i+"':{'r"+rank+"':'"+list[lstMember[0][i]]+"'},";
		ans = list[lstMember[0][i]];
//		ans = ans.replace(/&/g, '&amp;');
		ans = ans.replace(/\&/g, '%26');
//		alert(ans);
		json += "{'r':'"+rank+"','i':'"+ans+"'},";
//		json += "{'r':'"+rank+"','i':'"+list[lstMember[0][i]]+"'},";
		if (i < list.length - 1) {
			if (equal[lstMember[0][i]] == lstMember[0][i+1]) {
				same++;
			}
			else {
				rank += same;
				same = 1;
			}
		}
	}
	html += '</table>';
//	json = json.replace(/'/g, '%27');
	json = encodeURI('[' + json.replace(/,$/g, '') + ']');
//alert(json);
//	return;
	
	var screen_name = $('#screen_name').text();
	if (screen_name) {
		saveAnswer(screen_name, json);
//		$('#foot-menu').html('コメント：<input id="twitter-comment" type="text" name="twitter-comment" /><input id="twitter-send" type="button" value="つぶやく" />');
	}
	else {
//		button = '<a href="/twitter_oauth.php?r='+theme+'/{screen_name}'+'">'
//		button = '<img src="/img/twitter_oauth.png" alt="ログイン" />';//'</a><br />';

		$('#sort-result').html(html);//.append(button);
		
		$('#sort-result').append('<input id="sort-twit" type="button" value="Twitterでつぶやく" />');
		
		$('#sort-twit').bind('click', function() {

			var status;

				status = '「'+title+'」の結果、1位は'+no1+'でした。'+
					site_url +theme+' #sortin';

			status = encodeURI(status);
			status = status.replace(/\?/g, '%3f');
			status = status.replace(/\&/g, '%26');
			status = status.replace(/\#/g, '%23');
			var uri = 'http://twitter.com/home?status='+status;
			document.location = uri;

		});
	}
/*	else {
	}*/
}



function getTheme() {
	var str = window.location.href.replace(site_url, '');
//	alert(str);
	var p = str.split('/');
	theme = p[0];
	screen_name = p[1];
	
	if (theme && !screen_name) {
		var api = site_url+'api/get_theme.php?theme='+theme;
		$.getJSONP(api+"&dt=jsonp&callback={callback}", function(json) {
//			var result = json.result;
			if (json.result == 1) {
				title = json.theme.title;
				detail = json.theme.detail;
				instruction = json.theme.instruction;
				draw = json.theme.draw;
				list = json.items;
			}
		});
	}
	else if (theme && screen_name) {
		var api = site_url+'api/get_answer.php?theme='+theme+'&screen_name='+screen_name;
		$.getJSONP(api+"&dt=jsonp&callback={callback}", function(json) {
//			var result = json.result;
			if (json.result == 1) {
				title = json.theme.title;
				detail = json.theme.detail;
				answer = json.theme.answer;
				html = '<table><tr><th>順位</th><th>名前</th></tr>';
				var rank, item;
				for (var i = 0; i < answer.length; i++) {
					rank = answer[i].r;
					item = answer[i].i;
					html += '<tr><td class="rank">'+(rank <= 3 ? '<img src="/img/rank_'+rank+'.gif" alt="'+rank+'" />' : rank)+'</td><td>'+item+'</td></tr>';
				}
				html += '</table>';
				
				var no1 = "「"+answer[0].i+"」";
				if (answer[0].r == answer[1].r) no1 += "など";
				var status = '.@'+screen_name+' さんの「'+title+'」の結果、1位は'+no1+'でした。 '+
						site_url +theme+'/'+screen_name+' #sortin';
				status = encodeURI(status);
				status = status.replace(/\?/g, '%3f');
				status = status.replace(/\&/g, '%26');
				status = status.replace(/\#/g, '%23');
				new_uri = 'http://twitter.com/home?status='+status;
			}
		});
	}
}

function saveAnswer(screen_name, answer) {
//	alert(no1);
	var api = site_url+'api/save_answer.php?theme='+theme+'&screen_name='+screen_name+'&answer='+answer;
	$.getJSONP(api+"&dt=jsonp&callback={callback}", function(json) {
		if (json.result == 1) {
//			alert('保存完了');
			document.location = site_url + theme + '/' + screen_name;
		}
	});
	
}

addEvent(window, 'load', initialize);

