/*
 * viewperson_pubselect.js
 *
 * Copyright (c) 2009 Bo Gao (elivoa|gmail.com)
 *
 * $Date: 2010-05-05 $
 */

/*********************
 * pub select page
 *********************/
var loading_img = '<div style="text-align: center;"><img src="images/loading[0].gif" /></div>';
var _naid = -1;

/** init naid */
function init_publist(naid){
	_naid = naid;
}

$(document).ready(function() {
	var pub_changed = false;

	$('#disambiguation_btn').toggle(function() {
		pub_changed = true;
		/* Disambiguation Mode */
		$(this).text('[BACK]');
		$('#pub_select_area').fadeIn();
		$('#pub_area').hide();
		$('#pub_select_area').load("ajaxpage.do?m=inc_person_publist_edit_1list&naid="+_naid);
	}, function() {
		/* Publication View */
		$(this).text('[Edit disambiguation Result]');
		if (pub_changed == false) {
			$('#pub_area').fadeIn();
			$('#pub_select_area').hide();
		} else {
			pub_changed = false;
			var pub_area_obj = $('#pub_area');
			//pub_area_obj.html(loading_img);
			pub_area_obj.fadeIn();
			$('#pub_select_area').hide();
			pub_area_obj.load("ajaxpage.do?m=inc_person_publist_show&naid="+_naid);
		}
	});
});

function changeView(){
	$('#disambiguation_btn').click();
}


var others_in_one_list = false;
function setInOneList(onelist){
	others_in_one_list = onelist;
}

/**
 * Create Publication Node
 * side: 0 - left side.
 * 		 1 - right side.
 */
function createPubNode(side, from_person_id, to_person_id, pub_id, idx, pub_str, year, dubious, userid){
	// if in_one_list mode and create right side node.
	if(others_in_one_list && side == 1){
		var person_div_obj = $('#publist_-5');
	} else {
		var person_div_obj = $('#publist_'+from_person_id);
	}

	var tempyear = year;
	if(dubious==1){
		tempyear = 2100;
	}
	var insertLocation = foundInsertPosition(person_div_obj, tempyear);
	
	//alert(from_person_id+'-'+to_person_id)
	// Add PubElement
	
	var html = '<div year="'+year+'" class="pub"';
	if(dubious==1){
		html += ' style="background-color: rgb(128, 64, 64)"';
	}
	html += ">";
	
	html += '<div class="idx">['+idx+']</div>';
	html += '<div class="text">'+pub_str+'</div>';
	if(side==0){ // left side, button is remove
		html += generateOperationLink('remove', 'Remove', from_person_id, to_person_id, pub_id, year, userid);
	} else { // right side, button is get
		html += generateOperationLink('get', 'Get', from_person_id, to_person_id, pub_id, year, userid);
	}
	html += '</div>';                                                                    
	var htmlObj = $(html);
	htmlObj.hover(onMouseIn, onMouseOut);// hover
	pubNodeList[pub_id] = htmlObj;
	insertLocation.after(htmlObj);
}

function onMouseIn(){
	$(this).css('border','solid 1px #6fbee7');
	//$(this).css('background-color', color);
	var btn = $(this).find('.function_area');
	btn.css('visibility','visible');
}

function onMouseOut(){
	$(this).css('border','solid 1px #999');
	//$(this).css('background-color','');
	var btn = $(this).find('.function_area');
	btn.css('visibility','hidden');
}

// generate method call used on operation link
function generateOperationLink(action, display_name, from_person_id, to_person_id, pub_id ,year, userid){
	var html = '<input type="button" id="'+action+'"_button class="function_area" value="' + display_name + '" onclick=\'';
	
	html += 'Login_na('+userid+', function(){onPubMove("' + action + '", pubNodeList['+pub_id+'] , ' + 
		from_person_id + ', ' + to_person_id + ', ' + pub_id + ', ' + year + ', 0, '+ userid +');}, null)';
	
	fromPersonList[pub_id] = from_person_id;
	//alert("changed: from_person_id is "+from_person_id);
	
	//add by wxz, 1 for right, 0 for left
	if(action=='get'){
		sideList[pub_id] = 1;	
	}
	else if(action=='remove'){
		sideList[pub_id] = 0;
	}
	
	html += '\' />';
	return html;
}

// find a year banner to insert pub node into.
function foundInsertPosition(container, year){
	// Find position and add year bar.
	var isFoundEqual = false;
	var equalBanner = undefined;
	var isNeighborFound = false;
	var banner = undefined;
	var invalidYear = false;
	var intYear = Number(year);	

	if(intYear < 1700 || 2212 < intYear){
		intYear = 0
		invalidYear = true;
	}
	var flag = true;
	container.children().each(		
		function(){
			if(flag==false)return;
			var type = $(this).attr('class');
			if(type == "year_banner"){
				var loopyear = Number($(this).attr('year'));
				// alert("compare ---- "+loopyear+" .compareWith "+intYear+"?");

				if(loopyear == intYear){
					isFoundEqual = true;
					equalBanner = $(this);
					flag = false;
					return;
				}else if(loopyear < intYear){
					banner = $(this);
					isNeighborFound = true;
					flag = false;
					return;
				}else if(loopyear > intYear){
					banner = $(this);
				}
			}
	});

	// create year if needed
	if(isFoundEqual == true){	
		return equalBanner;
	} else if(invalidYear == true){
		var year_banner;
		if(year==2100)
			year_banner = $('<div year="'+ year +'" class="year_banner">' + 'Dubious' + '</div>');
		else{
			year_banner = $('<div year="'+ year +'" class="year_banner">' + year + '</div>');
		}
		//var year_banner = $('<div year="'+ year +'" class="year_banner"> - </div>');
		$(year_banner).appendTo(container);
		return year_banner;
	} else if(isNeighborFound == true){	//create new year_banner		
		var year_banner;
		if(year==2100)
			year_banner = $('<div year="'+ year +'" class="year_banner">' + 'Dubious' + '</div>');
		else{
			year_banner = $('<div year="'+ year +'" class="year_banner">' + year + '</div>');
		}
		banner.before(year_banner);
		return year_banner;
	} else {
		var year_banner;
		if(year==2100)
			year_banner = $('<div year="'+ year +'" class="year_banner">' + 'Dubious' + '</div>');
		else{
			year_banner = $('<div year="'+ year +'" class="year_banner">' + year + '</div>');
		}
		//var year_banner = $('<div year="'+ year +'" class="year_banner">' + year + '</div>');
		$(year_banner).appendTo(container);
		return year_banner;
	}
}

// Animation and ajax call of move publication.
// @param action 'get' / 'remove'
function onPubMove(action, pubNode, from_person_id, to_person_id, pid, year, merge, userid){
	var function_area = pubNode.find('.function_area');
	function_area.val("Loading...");
	function_area.attr('disabled', true);
	pubNode.fadeTo('slow', 0.4, function(){
		$.ajax({
			url: "/ajaxpage.do?m=na_pub_move",
			dataType: 'text',
			data: ({
				na_action : action,
				from_person_id : from_person_id,
				to_person_id: to_person_id,
				pid : pid,
				year : year,
				jsessionid : Math.round(Math.random()*10000)
			}),
			success: function(data){
				if(data == 'error'){
					movePubFailed(action, pubNode, 'Unknown Error');
				} else if (data == 'PubMoveStateChangedException'){
					movePubFailed(action, pubNode, 'PubMoveStateChangedException');
				} else {
					var pieces = data.split(',');
					var result = pieces[0];
					if(result == 'success' || result== 'PubMoveStateAlreadyException'){
						to_person_id = pieces[1];
						movePub(action, pubNode, from_person_id, to_person_id, pid, year, userid);
						//alert("from: "+from_person_id+", to: "+to_person_id+" list: "+fromPersonList[pid]);
						
						if(merge!=1 && edit_pid_pid[pid].length >= 1){						
							var text = pid+";";
							var count = 0;
							for (var tempid in edit_pid_pid[pid]){
								var newpid = edit_pid_pid[pid][tempid];
								if((action=='get' && sideList[newpid]==1) || (action=='remove' && sideList[newpid]==0)){
									text += newpid+",";
									count++;
								}
							}
							if(count > 0){
								$("body").append("<div id='PropagationDialog_"+pid+"' title='Do you want Propagation?'></div>");
								$("#PropagationDialog_"+pid).load(
									'propagationDialogue.jsp?pid='+text,
									function(){
									$('#PropagationDialog_'+pid).dialog({
										autoOpen: false,
										modal:true,
										width: 800,
										draggable:false,
										buttons: {
											"Yes": function(){
												for (var temp_id in edit_pid_pid[pid]){
													var new_pid = edit_pid_pid[pid][temp_id];
													//alert(new_pid+" from: "+fromPersonList[new_pid]+", to: "+to_person_id);
													var newaction;
													if(sideList[new_pid]==0){
														newaction = 'remove';
													}
													else{
														newaction = 'get';
													}
													
													onPubMove(newaction, pubNodeList[new_pid], fromPersonList[new_pid], 
														to_person_id, new_pid, edit_year[new_pid], 1, userid);
												}
												$("#PropagationDialog_"+pid).dialog("close");
											},
											"No": function(){
												$("#PropagationDialog_"+pid).dialog("close");
											}
										}
									});
									$("#PropagationDialog_"+pid).dialog("open");
								});
							}
						}
					}else{
						movePubFailed(action, pubNode);
					}
				}
	    	},
			error: function(){
	        	$(this).addClass("error");
	        	movePubFailed(action, pubNode);
	    	}
		})
	});
}

//add by wxz for person merge
function onPersonMerge(from_person_id, to_person_id, userid){
	if(confirm("Do you want this person to be merged into the person in the left?")) {
		for(var pubindex in personPubList[from_person_id]){
			var pid = personPubList[from_person_id][pubindex];
			//action, pubNode, from_person_id, to_person_id, pid, year
			onPubMove('get', pubNodeList[pid], from_person_id, to_person_id, pid, edit_year[pid], 1, userid);
		}
		deletePersonInDB(1, from_person_id);
		//$('#person_'+from_person_id).fadeTo('slow', 0.5);
		$('#person_'+from_person_id).hide();
	}
}


// Restore animation
function movePubFailed(action, pubNode, msg){
	if(msg == 'PubMoveStateChangedException'){
		alert('Some one already move this publication to another person, please refresh and retry.');
	} else {
		alert('Error occured when move publication. '+ msg);
	}
	pubNode.fadeTo('fast', 1);
	var function_area = pubNode.find('.function_area');
	if(action=='remove'){
		function_area.html('Remove');
	} else {
		function_area.html('Get');
	}
	function_area.attr('disabled', true);
}

// move pub animation, part 2.
function movePub(action, pubNode, from_person_id, to_person_id, pub_id, year, userid){
	//fromPersonList[pub_id] = to_person_id;
	var speed = 500;
	// if in_one_list mode and create right side node.
	if(others_in_one_list && action == "remove"){
		var container = $('#publist_-5');
	} else{
		var container = $('#publist_'+to_person_id);
		// create person if not valid
		if(container == undefined || container.html()==null){
			createPersonContainer(1, to_person_id, 'Others', null, null, userid);
			container = $('#publist_'+to_person_id);
		}
	}
	var insertLocation = foundInsertPosition(container, year);

	var newPubNode = pubNode.clone();
	//newPubNode.detach()
	newPubNode.css('position', 'absolute');
	newPubNode.hover(onMouseIn, onMouseOut);
	newPubNode.offset({
		left: pubNode.offset().left + $(window).scrollLeft(),
		top: pubNode.offset().top + $(window).scrollTop()
	});
	var fixed = $('<div class="fixedwrapper" style="height:0;width:0;margin:0;padding:0;border:0;" ></div>')
	pubNode.after(fixed);
	fixed.after(newPubNode);
	//pubNode.after(newPubNode);

	var placeholder2 = $('<div class="pub">');
	placeholder2.height(0);
	placeholder2.css('opacity', 0);
	insertLocation.after(placeholder2);

	pubNode.css('border', '0')
	pubNode.css('margin', '0')
	pubNode.css('padding', '5px')
	pubNode.animate({
		opacity: 0.1,
		height: '-' + pubNode.height(),
		margin:0,
		padding:0
	}, speed, function(){
		pubNode.remove();
	});

	placeholder2.animate({
		opacity: 0.8,
		height: '+' + newPubNode.height()
	}, speed);

	newPubNode.animate({
		opacity: 0.25,
		left: [insertLocation.offset().left - 1, 'linear'],
		top:  [insertLocation.offset().top + 18, 'linear']
	}, speed, function() {
		newPubNode.fadeTo('fast', 1, function(){
			newPubNode.css('position', 'static');
			placeholder2.replaceWith(newPubNode);

			// rebuild all indexes
			rebuildIndex(from_person_id)
			if(others_in_one_list){
				rebuildIndex(-5)
			} else {
				rebuildIndex(to_person_id)
			}
			//newPubNode.height(120);
		});

		// update link button
		var btn = newPubNode.find('.function_area');
		if(action=='remove'){
			btn.replaceWith(generateOperationLink('get', 'Get', to_person_id, from_person_id, pub_id, year, userid));
		} else {
			btn.replaceWith(generateOperationLink('remove', 'Remove', to_person_id, from_person_id, pub_id, year, userid));
		}

		// update index
		var indexSpan = newPubNode.find('.idx');
		indexSpan.html('[-]');
	});
	
	pubNodeList[pub_id] = newPubNode;
}

/**
 * rebuild index number in one container
 */
function rebuildIndex(container_person_id){
	var container = $('#publist_' + container_person_id);
	var all_indexes = container.find(".idx");
	var count = all_indexes.length;
	all_indexes.each(function(){
		$(this).html('['+count+']');
		count -= 1;
	});
}

/**
 * Create Person Profile Info and publication list container.
 * side: 0 - left side.
 * 		 1 - right side.
 */
function createPersonContainer(side, person_id, person_name, person_affilation, to_person_id, userid){
	var profile_html = '<div class="profile" id="person_'+person_id+'" >';
	if(person_id < 0){
		profile_html += '<span class="namenolink">' +person_name+'</span>';
	}
	else{
		profile_html += '<span class="name" onclick=\"window.location.href=\'viewperson.do?naid='+ person_id + '\'\">' +person_name+'</span>';
	}
	if(side==1 && person_affilation != "Others"){
		profile_html += '<input type="button" class="function_area" value="merge" onclick=\'onPersonMerge('+person_id+','+to_person_id+','+userid+')\' />';
	}
	if(person_affilation != undefined && person_affilation != 'null' && person_affilation != '' ){
		profile_html += '<span class="aff" > (' + person_affilation + ')</span>';
	}
	profile_html += '<div id="publist_' + person_id + '" class="publist"></div>';
	var newProfileNode = $(profile_html);
	if(0==side){
		newProfileNode.appendTo('#pub_select_main');
	} else {
		newProfileNode.appendTo('#pub_select_others');
	}
	return newProfileNode;
}

/**
 * Create New Person Profile Info and publication list container.
 */
function createNewPersonInDB(side, person_name, to_person_id, userid){
	if(confirm("Do you want to create a new person?")) {
		$.ajax({
			url: "/ajaxpage.do?m=na_create_new_person",
			dataType: 'text',
			data: ({
				person_name : person_name,
				jsessionid : Math.round(Math.random()*10000)
			}),
			success: function(data){
				//alert("create in DB: "+data);
				if(data == 'error'){
					alert("dataError");
				}
				else if (data == 'createPersonError'){
					alert("createPersonError");
				}
				else {
					var pieces = data.split(',');
					var result = pieces[0];
					if(result == 'success'){
						person_id = pieces[1];
						createNewPersonContainer(side, person_id, person_name, '', to_person_id, userid);
						//location.reload();
						//document.URL=location.href;
						//location.replace(newLocation);
					}else{
						alert(data+" Data Return Error");
					}
				}
	    	},
			error: function(){
	        	$(this).addClass("error");
	    	}
		})
	}
}

/**
 * Delete Person After Merge.
 */
function deletePersonInDB(side, person_id){
	$.ajax({
		url: "/ajaxpage.do?m=na_delete_person",
		dataType: 'text',
		data: ({
			person_id : person_id,
			jsessionid : Math.round(Math.random()*10000)
		}),
		success: function(data){
			//alert("delete in DB: "+data);
			if(data == 'error'){
				alert("dataError");
			}
			else if (data == 'deletePersonError'){
				alert("deletePersonError");
			}
			else {
				if(data != 'success'){
					alert(data+" Data Return Error");
				}
			}
    	},
		error: function(){
        	$(this).addClass("error");
    	}
	})
}


/**
 * Create New Person Profile Info and publication list container.
 * side: 0 - left side.
 * 		 1 - right side.
 */
function createNewPersonContainer(side, person_id, person_name, person_affilation, to_person_id, userid){
	var profile_html = '<div class="profile" id="person_'+person_id+'" >';
	profile_html += '<span class="name" onclick=\"window.location.href=\'viewperson.do?naid='+ person_id + '\'\">' +person_name+'</span>';
	if(side==1 && person_affilation != "Others"){
		profile_html += '<input type="button" class="function_area" value="merge" onclick=\'onPersonMerge('+person_id+','+to_person_id+','+userid+')\' />';
	}
	if(person_affilation != undefined && person_affilation != 'null' && person_affilation != '' ){
		profile_html += '<span class="aff" > (' + person_affilation + ')</span>';
	}
	profile_html += '<div id="publist_' + person_id + '" class="publist"></div>';
	var newProfileNode = $(profile_html);
	if(0==side){
		newProfileNode.appendTo('#pub_select_main');
	} else {
		newProfileNode.appendTo('#create_new_person');
	}
	return newProfileNode;
}

/**
 * Switch between PerPerson/AllOthersInOne View
 */
function toggleView(m, person_id){
	var container = $('#pub_select_area');
	var loaded=false;
	container.fadeOut('fast', function(){
		if(!loaded){
			container.html(loading_img)
		}
		container.show();
	});
	container.load('ajaxpage.do?m='+m+'&naid='+person_id, function(){
		loaded=true;
	});
}
