$(function() {
	$("select#organisation").change(function() {
		loadPullRequests();
		$("input#filter").val("");
	});
	
	var completed = false;
	var running = false;
	
	var refresh = function() {
		$.post('pull-request-import-status.gh', function(data) {
			var pullRequests = eval('(' + data + ')');
			var allCompleted = false;
			if(pullRequests.length == 0) {
				$("#submit").prop("disabled", "disabled");
			} else {
				allCompleted = true;
				for (var i=0; i<pullRequests.length; i++) {
					var id = pullRequests[i].index;
					var description = pullRequests[i].value;
					var status = pullRequests[i].status.toLowerCase();
					var shortDescription = pullRequests[i].shortDescription;
					$("#status_" + id).attr("class", "status " + status);
					$("#status_description_" + id).text(shortDescription);
					$("#status_description_" + id).attr("title", description);
					if(status == 'sync') {
						allCompleted = false;
					}
				}
			}
			
			if(allCompleted || repos.length <= 0) {
				completed = true;
				$("#submit").prop("disabled", "");
				$("#submit").html("<span class=\"button green\"><span>Next &gt;</span></span>")
				clearInterval(refreshInterval);
				running = false;
			}
		});
	}
	
	$("#submit").click(function() {
		var destination;

		if(completed || $("tr").length <= 0) {
			$('#pullrequests').submit();
			return true;
		} else {
			
			$("tr").each(function() {
				var importCheckbox = $(this).find("td input:checkbox");
				if(importCheckbox.prop("checked")) {
					var importTypeSelect = $(this).find("#importtype");
					$(importTypeSelect).attr("style","display: none;");
				}
			});
			
			$.ajax({
				type : "POST",
				url : "pull-request-import.gh",
				data : $("#pullrequests").serialize(),
				success : function() {
					$(".status").each(function() {
						$(this).attr("display","block");
					});
					refresh();
					refreshInterval = setInterval(refresh, 2000);
				}
			});
			running = true;
			$("#submit").prop("disabled", "disabled");
			return false;
		}
	});
	
	$("#cancel").click(function() {
		if(running) {
			$.ajax({
				type : "POST",
				url : "pull-request-import-cancel.gh",
				success: function() {
					refresh();
				}
			});
		} else {
			window.location = "/";
		}
	});
});	

// Table sort - DataTables
var table = $('#pull-requests'),
    tableStyled = false;

table.dataTable({
    'aoColumnDefs': [
        { 'bSortable': false, 'aTargets': [ 0, 4 ] }
    ],
    'oLanguage': {
        'sLengthMenu': '_MENU_ Rows',
        'sSearch':'Search pull request'
    },
    'sPaginationType': 'full_numbers',
    'sDom': '<"dataTables_header"fpl>t',
    'bAutoWidth': true,
    'fnDrawCallback': function( oSettings )
    {
        // Only run once
    }
});

$("table thead input#checkall").change(function() {
	var checked = $(this).prop("checked");
	$("table tbody td input#checkall").each(function() {
		$(this).prop("checked", checked);
	});
});

$("table thead select#importtype").change(function() {
	var importType = $("table thead select#importtype option:selected").val();
	$("table tbody select#importtype option").filter(function() {
	    return $(this).text() == importType; 
	}).prop('selected', true);
});

var loadPullRequests = function (repository) {
	$('#pull-requests').attr("style","display: none;");
	$('.dataTables_header').attr("style","display: none;");
	$("div.loading").attr("style","display: visible;");
	if (repository == undefined) {
		$("ul.repo-list").empty();
	}
	$("table#pull-requests tbody").empty();
	$("#submit").prop("disabled", "disabled");

	var organisation = $("select#organisation option:selected").val();
	$.post('pull-request-list.gh', 
		{ 
		"organisation": organisation,
		"repository": repository
		},
		function(data) {
		
		var prs = eval('(' + data + ')');
		var numItems = 0;
		table.fnClearTable();
		var idx = 0;
		for (var i=0; i<prs.length; i++) {
			var pr = prs[i];

			if(repository == undefined) {
				repoLi = $("ul.repo-list li#" + pr.repository);
				if(repoLi.length == 0) {
					$('<li id="' + pr.repository + '"><a href="#">' + pr.repository + '</a>' + 
							(pr.pullrequests == undefined ? '':'<p>' + pr.pullrequests.length + '</p>') + 
							'</li>').appendTo('ul.repo-list');
				} 
			}
			
			if(pr.pullrequests != undefined) {
				for(var j=0; j<pr.pullrequests.length; j++) {
					var req = pr.pullrequests[j];
					var paramPrefix = "pr." + idx;
					table.fnAddData( [ 
		                        '<input type="checkbox" name="' + paramPrefix + '.selected" id="checkall" checked="checked">',
		                        '#' + req.id + 
		                        '<input type="hidden" name="' + paramPrefix + '.idx" value="' + idx + '"/>' +
		                        '<input type="hidden" name="' + paramPrefix + '.id" value="' + req.id + '"/>' +
		                        '<input type="hidden" name="' + paramPrefix + '.repo" value="' + pr.repository + '"/>',
		                        '<p class="repository">' + pr.repository + '</p> | ' +
		                        '<p class="title">' + req.title + '</p>' +
		                        '<p class="body">' + req.body + '</p>' +
		                        '<p class="author">by ' + req.author + '</p>',
		                        '<p class="timestamp">' + req.date + '</p>',
		                        '<select name="' + paramPrefix + '.type" id="importtype"><option>Squash</option><option>Commits</option> </select>' +
		                        '<span id="status_' +  idx + '" class="status" ></span>' +
		                        '<label id="status_description_' + idx + '" class="synch-status">'
			                  ] );
					idx = idx + 1;
				}
				numItems = numItems + pr.pullrequests.length;
			}
		}
		
		if(repository == undefined) {
			var repoSort = function sortAlpha(a,b){  
				var cmpA = ($(a).find("p") == undefined ? "0":$(a).find("p").text()) + $(a).find("a").text();
				var cmpB = ($(b).find("p") == undefined ? "0":$(b).find("p").text()) + $(b).find("a").text();
				return cmpA > cmpB ? 1 : -1;  
			};  
			  
			$('ul.repo-list li').sort(repoSort).appendTo('ul.repo-list');
			$('<li class="all selected"><a href="#">All repositories</a><p>' + numItems + "</p></li>").prependTo('ul.repo-list');
			$('ul.repo-list li a').click(function() {
				var prevClass = $("ul.repo-list li.selected").attr("class");
				$("ul.repo-list li.selected").attr("class", prevClass == "all selected" ? "all":"");

				var currClass = $(this).parent().attr("class");
				$(this).parent().attr("class", currClass + " selected");
				
				var repository = $(this).text();
				if($(this).parent().attr("class").indexOf("all") < 0) {
					loadPullRequests($(this).text());
				} else {
					loadPullRequests();
				}
			});
		}
		
		$("#submit").prop("disabled", "");
		$(".filter").attr("style","display: visible;");		
		$("div.loading").attr("style","display: none;");
		$('#pull-requests').attr("style","display: visible;");
		$('.dataTables_header').attr("style","display: visible;");
	});
};

var filterTimeout;
$("input#repo-filter").keyup(function() {
	if (filterTimeout) {
		clearTimeout(filterTimeout);
	}
	filterTimeout = setTimeout(function () {
		filterRepositories();
	},500);
});

var filterRepositories = function() {
	var filter = $("input#repo-filter").val().toLowerCase();
	var numRepos = 0;
	$("ul.repo-list li").each(function() {
		var repoName = $(this).find("a").text();
		var matched = repoName.toLowerCase().indexOf(filter)>=0;
		if(matched) {
			$(this).attr("style","display: visible;");
		} else {
			$(this).attr("style","display: none;");
		}
	});
}

$(document).ready(function () {
	loadPullRequests();
});

