
var aSubjRoleDefs = new Array();
var subj_role_cnt = 0;
function oSubjRoleDefs(id, name, desc) {
	this.id = id;
	this.name = name;
	this.desc = desc;
}


;(function($) {
	$.fn.extend({
        lbSubjectRoles: function(options) {
        	opts = $.extend({}, $.subjectRoles.defaults, options);
			return this.each(function() {
				new $.subjectRoles(this, opts);
			});
        }
    });

$.subjectRoles = function(obj, opts) {
	var $this = $(obj);
	//var roleCntnr = null;
	var selectedDef = '';
	var selectedRoleId = '';
	var selectedRoleName = '';
	var selectedDefElement = null;
	var sAjaxUpdateType = '';
	var sPaneWidth = parseInt($('.subjectPane').css('width'));
	var wWallLeft = parseInt($('#wonderwall').css('left'));

	$('#roleList .roleFont, #roleList .specialtyFont').mouseover(function(){
				$(this).css('cursor', 'pointer')
			}).hoverIntent({
			     sensitivity: 2, // number = sensitivity threshold (must be 1 or higher)
			     interval: 500, // number = milliseconds for onMouseOver polling interval
			     over: enterEditMode, // function = onMouseOver callback (REQUIRED)
			     timeout: 500, // number = milliseconds delay before onMouseOut
			     out: cursorDefault // function = onMouseOut callback (REQUIRED)
			});

	if (!opts.called_by_ranking) {
		$('#mnuAddSubjRole').click(function(){
			if (GLOBALS.uid >= 0) {
				$('#cntnrAddRole').show();
				$('#firstColumn').css('width', '475px');
				$('.subjectPane').css('width', sPaneWidth+165+ 'px');
				$('#wonderwall').css('left', wWallLeft+175+'px');


				setFocus(document.getElementById("tlbRoleAdd"));
				//setFocus($('#tlbRoleAdd'));
				var add_roleAC = new Autocomplete(document.getElementById('tlbRoleAdd'), {
					callback: GLOBALS.contextPath + '/ajax/findRole?query=%1&akaNames=true&createOption=true',
					width: '200',
					autoHide: false,
					onResultEnter: function(type, data){
						$('#tlbRoleIdAdd').val(data.id);
					// $("#searchRole").blur();
					},
					onSearchFailed: function(){
					// $('#roleNotFound_warning').css('display','block');
					},
					onSearchInitiated: function(){
						$('#tlbRoleIdAdd').val('');
					//$('#roleNotFound_warning').css('display','none');
					},
					onResultClear: function(){
						$('#tlbRoleIdAdd').val('');
					//$('#roleNotFound_warning').css('display','none');
					}
				});

        $('#comAddSubjRole').click(function(){
          var rID = $('#tlbRoleIdAdd').val();
          add_roleAC.hideBox();
          if (rID == '' || rID == '-1') {
            getNewRoleDesc($('#tlbRoleAdd').val());
          }
          else {
            sAjaxUpdateType = 'add subject role';
            var url = opts.create_subject_role_url + '&roleId=' + rID;
            doAjax('GET', url, '', '', loadServerResponse);
          }
        });

				$('#roleAddClose').click(function(){
          $('#tlbRoleAdd').val('');
					$('#cntnrAddRole').hide();
					$('#firstColumn').css('width', '300px');
					$('.subjectPane').css('width', sPaneWidth+'px');
					$('#wonderwall').css('left', wWallLeft+'px');
				});
			}
			else {
				location.href = GLOBALS.loginUrl + '?next=viewSubject&subjectId=' + GLOBALS.sid;
			}
		});
	}


	$('.comAddSpec').click(function() {
		if (GLOBALS.uid >= 0) {
			if ($(this).has("span").length == 0) {
				//selectedDefElement = $(this);
				//selectedDef = $(this).html();
				selectedRoleId = getRoleId($(this).attr('id'), 1);
				$(this).siblings('.spNormal').hide();
				$(this).html('').append($('<span></span>').addClass('lbEditBrackets').html('{'), $('<input type="text" name="lbAddSpecialty" id="lbAddSpecialty" class="exampleText first" autocomplete="off" />').val('eg: pediatrics'), $('<span></span>').addClass('lbEditBrackets').html('} '), $('<input type="hidden" name="lbAddSpecialtyId" id="lbAddSpecialtyId" />').val(''), $('<a></a>').addClass('commands actionFont').html('save').click(function(){
					var sID = $('#lbAddSpecialtyId').val();
					if ((sID == '') || (sID == -1)) {
						sAjaxUpdateType = 'add role specialty';
						var url = opts.create_role_specialty_url + escape($('#lbAddSpecialty').val());
						doAjax('GET', url, '', '', loadServerResponse);
					}
					else {
						sAjaxUpdateType = 'add subject role specialty';
						var url = opts.create_subject_role_specialty_url + '&roleId=' + selectedRoleId + '&specialtyId=' + sID;
						doAjax('GET', url, '', '', loadServerResponse);
					}
				}));

				setFocus(document.getElementById("lbAddSpecialty"));

				var add_specialtyAC = new Autocomplete(document.getElementById('lbAddSpecialty'), {
					callback: GLOBALS.contextPath + '/ajax/findRoleSpecialty?query=%1&akaNames=true&createOption=true',
					width: '200',
					autoHide: false,
					onResultEnter: function(type, data){
						$('#lbAddSpecialtyId').val(data.id);
					// $("#searchRole").blur();
					},
					onSearchFailed: function(){
					// $('#roleNotFound_warning').css('display','block');
					},
					onSearchInitiated: function(){
						$('#lbAddSpecialtyId').val('');
					//$('#roleNotFound_warning').css('display','none');
					},
					onResultClear: function(){
						$('#lbAddSpecialtyId').val('');
					//$('#roleNotFound_warning').css('display','none');
					}
				});
			}
		} else {
			location.href = GLOBALS.loginUrl + '?next=viewSubject&subjectId=' + GLOBALS.sid;
		}
	});

	$('.roleEditClose a').click(function() {
		$('#firstColumn').css('width', '300px');
		$('.subjectPane').css('width', sPaneWidth+'px');
		$('#wonderwall').css('left', wWallLeft+'px');
		$(this).parent().parent().hide();
		if (selectedDef != '') {
			$(this).parent().parent().siblings('.lbRoleEditCntnr').children('.lbRoleDesc').html(selectedDef);
		}
		$(this).parent().parent().siblings('.lbRoleEditCntnr').hide();
		$(this).parent().parent().siblings('.roleFont').children().hide();
		$(this).parent().parent().siblings('.specialtyFont').children().hide();
		$(this).parent().parent().siblings('.specialtyFont').children('.comCntnr').children('.comAddSpec').html('add ');
		$(this).parent().parent().siblings('.specialtyFont').children('.comCntnr').children('.comAddSpec').siblings('.spNormal').show();
		$(this).parent().parent().siblings('.comCntnr').hide();
		$(this).parent().parent().siblings('.comCntnr').children('.comAddSpec').html('add ');
		$(this).parent().parent().siblings('.comCntnr').children('.comAddSpec').siblings('.spNormal').show();
	});

	$('.comRemove').click(function() {
		if (GLOBALS.uid >= 0) {
			var rId = getRoleId($(this).parent().parent().attr('id'), 1);
			sAjaxUpdateType = getRoleId($(this).parent().parent().attr('id'), 0);
			if (sAjaxUpdateType == 'roleId') {
				sAjaxUpdateType = 'remove subject role';
				var url = opts.remove_subject_role_url + '&roleId=' + rId;
				doAjax('GET', url, '', '', loadServerResponse);
			}
			else
				if (sAjaxUpdateType == 'roleSpecialty') {
					sAjaxUpdateType = 'remove subject role specialty';
					var roId = getRoleId($(this).parent().parent().siblings('.roleFont').attr('id'), 1);
					var url = opts.remove_subject_role_specialty_url + '&roleId=' + roId + '&specialtyId=' + rId;
					doAjax('GET', url, '', '', loadServerResponse);
				}
		} else {
			location.href = GLOBALS.loginUrl + '?next=viewSubject&subjectId=' + GLOBALS.sid;
		}
	});

	function enterEditMode() {
		var selId, rName;
		var sel = getRoleId($(this).attr('id'), 0);
		closeAllRoleEdits();
		$(this).css('cursor', 'pointer');
		$('#firstColumn').css('width', '380px');
		$('.subjectPane').css('width', sPaneWidth+70+'px');
		$('#wonderwall').css('left', wWallLeft+80+'px');
		$(this).children().show();
		$(this).siblings('.lbRoleEditCntnr, .comCntnr, .cntnrRoleEditClose').show();
		if (sel == 'roleSpecialty') {
			$(this).siblings('.roleFont').children().show();
		}

		$(this).siblings('.specialtyFont').children().show();

		if (GLOBALS.uid > 0) {
			if (sel == 'roleSpecialty') {
				var rId = $(this).siblings('.roleFont').attr('id');
				if (rId == selectedRoleId) return;
				selId = getRoleId(rId, 1);
				rName = getRoleName($('#'+rId).html());
			} else {
				selId = getRoleId($(this).attr('id'), 1);
				rName = getRoleName($(this).html());
			}
			var descNode = $('#subjRoleDesc-'+selId);
			descEditMode(descNode, rName);
		}
	};

	function closeAllRoleEdits() {
		$('#roleList .roleFont').children().hide();
		$('#roleList .roleFont').siblings('.lbRoleEditCntnr, .cntnrRoleEditClose').hide();

		if (selectedDefElement) {
			if (selectedDef != '') {
				$(selectedDefElement).html(selectedDef);
			}
			selectedDefElement = null;
			selectedDef = '';
		}
		$('#roleList .roleFont').siblings('.comCntnr').children('.comAddSpec').html('add ');
		$('#roleList .roleFont').siblings('.comCntnr').hide();
		$('#roleList .roleFont').siblings('.specialtyFont').children().hide();
		//$('#lbliAddRole').remove();
	};

	function descEditMode(descNode, rName) {
		if (($(descNode).hasClass('isNotLBRole')) || (GLOBALS.isAdmin)) {
			if ($(descNode).has("span").length == 0) {
				selectedDefElement = $(descNode);
				selectedRoleName = rName;
				selectedDef = $(descNode).html();
				selectedRoleId = getRoleId($(descNode).attr('id'), 1);
				$(descNode).html('').append($('<span></span>').addClass('lbEditBrackets').html('{ '), $('<input name="tlbRoleDescEdit" id="tlbRoleDescEdit" />').val(selectedDef), $('<span></span>').addClass('lbEditBrackets').html(' } '), $('<a></a>').addClass('commands actionFont').html('save').click(function(){
					selectedDef = $('#tlbRoleDescEdit').val();
					sAjaxUpdateType = 'update desc';
					var url = opts.update_role_url + selectedRoleId + '&name=' + escape(selectedRoleName) + '&description=' + escape(selectedDef);
					doAjax('GET', url, '', '', loadServerResponse);
				}));

				var v = $('#tlbRoleDescEdit').val();
				var ln = v.length;
				setSelectionRange(document.getElementById('tlbRoleDescEdit'), ln, ln);
				$('#tlbRoleDescEdit').focus(function() {
					if ($(this).val() == 'not defined. please define role') {
						$(this).val('');
						//$(this).removeClass('exampleText');
					}
				});
			}
		}
	};

	function getNewRoleDesc(rl) {
		$('#cntnrAddRole').hide();
		$('#mnuAddSubjRole').hide();
		$('#cntnrAddRoleDesc').show();
		$('#tlbRoleAddDesc').focus();
		$('#comAddSubjRoleDesc').click(function() {
			sAjaxUpdateType = 'add role';
			var url = opts.create_role_url + escape(rl) + '&description='+escape($('#tlbRoleAddDesc').val());
			doAjax('GET', url, '', '', loadServerResponse);
		});
		$('#roleAddDescClose').click(function() {
			$('#cntnrAddRoleDesc').hide();
			$('#tlbRoleAdd').val('');
      $('#mnuAddSubjRole').show();
		});

	};

	function loadServerResponse(response) {
		if (response.error) {
		    var message = '';
			console.log('error');
			alert('Error: \n\n' + response.errors['_GLOBAL_'][0]);
		}
		else if (response.redirectTo) {
		    window.location = response.redirectTo;
		} else {
			if (sAjaxUpdateType == 'add role') {
				//if (sAjaxUpdateType == 'add role') {
				//add new role to subject
				sAjaxUpdateType = 'add subject role';
				var url = opts.create_subject_role_url + '&roleId=' + response.role.id;
				doAjax('GET', url, '', '', loadServerResponse);
			//}
			}
			else
				if (sAjaxUpdateType == 'update desc') {
					$(selectedDefElement).html(selectedDef);
				}
				else
					if (sAjaxUpdateType == 'add subject role') {
						window.location = opts.redirectTo;
					}
					else
						if (sAjaxUpdateType == 'add role specialty') {
							//if (sAjaxUpdateType == 'add role specialty') {
							//add new role specialty to subject
							sAjaxUpdateType = 'add subject role specialty';
							var url = opts.create_subject_role_specialty_url + '&roleId=' + selectedRoleId + '&specialtyId=' + response.roleSpecialty.id;
							doAjax('GET', url, '', '', loadServerResponse);
						//}

						}
						else
							if (sAjaxUpdateType == 'add subject role specialty') {
								window.location = opts.redirectTo;
							}
							else
								if ((sAjaxUpdateType == 'remove subject role') || (sAjaxUpdateType == 'remove subject role specialty')) {
									window.location = opts.redirectTo;
								}
		}
	};

	function cursorDefault() {
		$(this).css('cursor', 'default');
	};

	function getRoleId(rl, index) {
		return rl.split('-')[index];
	};

	function getRoleName(s) {
		return jQuery.trim(s.substr(0, s.indexOf('<s')));
	};

	function setInputWidth(input) {
		var str = $(input).val();
		var ln = str.length;
		if (ln != 0) {
			$(input).css('width', ln * 7);
		}
	};

	function setFocus(input) {
		setSelectionRange(input, 0, 0);
		$(input).click(function() {
			if ($(this).hasClass('first')) {
				$(this).unbind('click').removeClass('first').val('');
			}
		}).keydown(function() {
			if ($(this).hasClass('first')) {
				$(this).removeClass('first').val('');
			}
		});
	};

	function setSelectionRange(input, selectionStart, selectionEnd) {
	   // IE
	   if (input.createTextRange) {
	      var range = input.createTextRange();
	      range.collapse(true);
	      range.moveEnd('character', selectionEnd);
	      range.moveStart('character', selectionStart);
	      range.select();
	    // real browsers :)
	    } else if (input.setSelectionRange) {
	      input.focus();
	      input.setSelectionRange(selectionStart, selectionEnd);
	    }
	};

	function doAjax(t, u, d, fnBefore, fnSuccess) {
		$.ajax({
			type: t,
			url: u,
			data: d,
			dataType: 'json',
			beforeSend: fnBefore,
			success: fnSuccess,
			error: showError
	 	}); //close $.ajax
	};

	function showError(XMLHttpRequest, textStatus, errorThrown) {
		console.log(textStatus);
	};

};

$.subjectRoles.defaults = {
	subject_id: GLOBALS.sid,
	get_subject_role_url: GLOBALS['contextPath'] + '/ajax/getSubjectRoles?subjectid=',
	create_subject_role_url: GLOBALS['contextPath'] + '/ajax/editSubject?addRole&subjectId=' + GLOBALS.sid,
	remove_subject_role_url: GLOBALS['contextPath'] + '/ajax/editSubject?removeRole&subjectId=' + GLOBALS.sid,
	get_role_url: GLOBALS['contextPath'] + '/ajax/getRole?id=',
	create_role_url: GLOBALS['contextPath'] + '/ajax/createRole?name=',
	update_role_url: GLOBALS['contextPath'] + '/ajax/editRole?id=',
	create_role_specialty_url: GLOBALS['contextPath'] + '/ajax/createRoleSpecialty?name=',
	create_subject_role_specialty_url: GLOBALS['contextPath'] + '/ajax/editSubject?addSpecialty&subjectId=' + GLOBALS.sid,
	remove_subject_role_specialty_url: GLOBALS['contextPath'] + '/ajax/editSubject?removeSpecialty&subjectId=' + GLOBALS.sid,
	redirectTo: GLOBALS['contextPath'] + '/viewSubject/' + GLOBALS.sid,
	called_by_ranking: false
};

})(jQuery);