var rater_running = false;

function _load_rater(html, relationship_type){
	var simple_rater = $('.simple-rater-hover');
	if(simple_rater.length){
		simple_rater.html(html);
		return simple_rater;
	}else{
		$('#ranking-'+relationship_type).append('<div class="simple-rater-hover">'+html+'</div>');
		return $('.simple-rater-hover');
	}
	rater_running = false;
}

function round_number(num, dec) {
	var dec = dec ? dec : 2;
	var num = parseFloat(num);
	var num_parts = num.toString().split('.');
	if(num_parts.length == 2){
		var result = parseFloat(num_parts[0]+'.'+num_parts[1].substr(0, dec));
	}else{
		var result = num;
	}
	//var result = Math.round(num*Math.pow(10,dec))/Math.pow(10,dec);
	return result;
}

function setSelectionRangeX(input, selectionStart, selectionEnd) {
   if (input.createTextRange) {
      var range = input.createTextRange();
      range.collapse(true);
      range.moveEnd('character', selectionEnd);
      range.moveStart('character', selectionStart);
      range.select();
    } else if (input.setSelectionRange) {
      input.focus();
      input.setSelectionRange(selectionStart, selectionEnd);
    }
}

function _handle_autocomplete(relationship_type){
	var autocomplete_element = document.getElementById('rater-criterionName');
	var options = {
		callback : GLOBALS.contextPath + '/ajax/findRatingCriterion?query=%1',
		delayInit : true,
		autoHide : true,
		onResultEnter : function(eventType, data) {
			$('div.autocomplete').remove();
			_handle_rate_input(data, relationship_type);
		}
	};

	var ac = new Autocomplete(autocomplete_element, options);

	$(autocomplete_element)
		.addClass('first')
		.val('eg. integrity')
		.bind('click', function(ev){
			if($(this).hasClass('first')){
				$(this)
					.unbind('click')
					.removeClass('first')
					.val('');
			}
		})
		.bind('keydown', function(ev){
			if($(this).hasClass('first')){
				$(this)
					.removeClass('first')
					.val('');
			}
			if(ev.keyCode == 13){
				new_criterion(this, relationship_type);
			}
		});
	$('.rating-add').bind('click', function(){
		new_criterion(autocomplete_element, relationship_type);
		return false;
	});
	setSelectionRangeX(autocomplete_element, 0, 0);
}

function new_criterion(_this, relationship_type){
	var new_criterion = $(_this).val();
	$('.rating-container')
		.html('<em id="cr-name">'+new_criterion+'</em> is new, please enter a brief description:<br /> <input type="text" name="cr-description" id="cr-description" /> <a id="criterion-save" class="save" href=""><span class="actionFont">save</span></a> <a id="criterion-cancel" class="cancel" href=""><span class="actionFont">x</span></a>');
		$('#cr-description')
			.trigger('focus')
			.bind('keydown', function(ev){
				if(ev.keyCode == 13){
					$('#criterion-save').trigger('click');
				}
			});
		$('#criterion-save')
			.bind('click', function(){
				var cr_name = new_criterion;
				var cr_description = $('#cr-description').val();
				$.getJSON(GLOBALS.contextPath + '/ajax/createRatingCriterion?name='+escape(cr_name)+'&description='+escape(cr_description), function(data){
					_handle_rate_input(data.ratingCriterion, relationship_type);
				});
				return false;
			});
		setSelectionRangeX(document.getElementById('cr-description'), 0, 0);

}

function _handle_rate_input(criterion, role_id){
	var run_rater = function(object){
		var rating = round_number(parseFloat($('#cr-rating').val()), 1);
		rating = rating ? rating : 0;
		if((rating <= 10) && (rating >= 1)){
			$.getJSON(GLOBALS.contextPath + '/ajax/rateSomething?create&rateableId='+GLOBALS.sid+'&roleId='+role_id+'&criterionId='+criterion.id+'&type=SUBJECT&value='+rating, function(data){
				window.location.href = window.location.href;
			});
		}else{
			var container = $('.rating-container');
			var error = $('span.error', container);
			if(error.length == 0){
				container.append('<br /><span class="error">Please enter a value between 1 and 10</span>');
			}
		}
		return false;
	};

	$('.rating-container')
		.html('<em>'+criterion.name+'</em> 1-10<br /><input type="text" name="cr-rating" id="cr-rating" value="0" style="width:30px;" /> <a id="criterion-save" class="save" href=""><span class="actionFont">save</span></a> <a id="criterion-cancel" class="cancel" href=""><span class="closeButton">x</span></a>');
			$('#cr-rating')
				.trigger('focus')
				.bind('keydown', function(ev){
					if(ev.keyCode == 13){
						run_rater(this);
					}
				});
	$('#criterion-save').bind('click', function(){ run_rater(this); return false; });
	setSelectionRangeX(document.getElementById('cr-rating'), 0, 0);
}

function _load_role_ratings(relationship_type){
	$.getJSON(GLOBALS.contextPath + '/ajax/rateSomething?init&rateableId='+GLOBALS.sid+'&type=SUBJECT&roleId='+relationship_type, function(data){
		html = '<div class="autocompleteContainer" id="autocompleteWidgetId">';
		html += '<div class="rating-container">'+
				'enter a criterion:<br /><input type="text" id="rater-criterionName" class="autocomplete" autocomplete="off"/> <a class="rating-add" href=""><span class="actionFont">rate</span></a> <a class="rating-cancel cancel" href=""><span class="closeButton">x</span></a>';
		$(data.ratings).each(function(i, item){
			html += '<br /><br /><span><em id="rating-'+item.id+'">'+item.criterionName+'</em> 1-10:<br /><input type="text" name="cr-rating" class="cr-rating cr-rating-update" value="'+round_number(item.value, 1)+'" style="width:30px;" /> <a class="rating-save save" href=""><span class="actionFont">save</span></a> <a class="rating-cancel cancel" href=""><span class="closeButton">x</span></a></span>';
		});

		html += '</div></div>';
		_load_rater(html, relationship_type);

		$('.cr-rating-update').bind('keypress', function(ev){
			if(ev.keyCode == 13){
				$('.rating-save').trigger('click');
			}
		});

		$('#rater-criterionName').trigger('focus');
		_handle_autocomplete(relationship_type);
	});
}

$(document).bind('ready', function(){
	setTimeout(run_simplerater, 1000);
});

function run_simplerater(){
	var timeout;
	var role_id;
	var rating_all = false;

	$('#criterion-cancel, .rating-cancel').live('click', function(){
		rater_running = false;
		$('.simple-rater-hover').remove();
		return false;
	});

	$('.rating-save')
		.live('click', function(){
			var value_input = $(this).parent('span').find('input');
			var value = value_input.val();
			value = round_number(parseFloat(value), 1);
			var rating_id = $(this).parent('span').find('em').attr('id');
			rating_id = rating_id.split('-');
			rating_id = rating_id[1];


			if(value == 0){
				var json_url = GLOBALS.contextPath + '/ajax/rateSomething?delete&ratingId='+rating_id;
				$.getJSON(json_url, function(data){
					window.location.href = window.location.href;
				});
			}else if(value <= 10 && value >= 1){
				var json_url = GLOBALS.contextPath + '/ajax/rateSomething?update&ratingId='+rating_id+'&value='+value;
				$.getJSON(json_url, function(data){
					window.location.href = window.location.href;
				});
			}else{
				var container = $(this).parent('span');
				var error = $('span.error', container);
				if(error.length == 0){
					container.append('<br /><span class="error">please enter a value between 0 and 10</span>');
				}
			}

			return false;
		});

//	if(GLOBALS.uid&&GLOBALS.sid&&GLOBALS.uid!=GLOBALS.sid){
    if (GLOBALS.uid != GLOBALS.sid) {
        /*
		$('#roleList li').bind('mouseover', function(){
			rating_all = false;
			if(rater_running==false){
				var target = $(this);
				clearTimeout(timeout);
				timeout = setTimeout(
					function(){
						var simple_rater = $('.simple-rater-hover');
						if(simple_rater.length==0&&rater_running==false){
							$('a.role-handler').css('display', 'none');
							$(target).find('a.role-handler').css('display', 'inline');
						}
					},
					400
				);
			}
		});

		$('#everybodyOnSubjectColumn, #firstColumn table:nth-child(2), #firstColumn td:first').bind('mouseover', function(){
			if(!rating_all){
				clearTimeout(timeout);
				$('a.role-handler').css('display', 'none');
			}
		});

		$('.simple-rater-hover').live('mouseover', function(){
			clearTimeout(timeout);
			$('a.role-handler').css('display', 'none');
		});
		*/

		$('#rateAllButton').bind('click', function(){
			rating_all = true;
			$('a.role-handler').css('display', 'inline');
			return false;
		});

		$('#roleList li a.role-handler')
			.live('click', function(e){
                var $this = $(this);
                if (GLOBALS.uid < 0) {
                    new RegisterLoginWindow({
                      contextPath: GLOBALS.contextPath,
                      onSuccess: function(userInfo) {
                        $this.click();
                      },
                      module: 'rate subject'
                    });
                    return false;
                }
				rater_running = true;
				$('#roleList li a.role-handler').css('display', 'none');
				role_id = $(e.target).attr('id');
				role_id = role_id.split('-');
				role_id = role_id[1];

				$.getJSON(GLOBALS.contextPath + '/ajax/getSubjectRelationship?subjectId='+GLOBALS.sid, function(data){
					var html = '';
					if(data.relationshipType=='UNKNOWN'){
						var counter = 0;
						$(data.relationshipTypeOptions).each(function(i, item){
							counter++;
							if(counter==1){
								html+=' '+item.label+'</p><p class="subject-relationship-options">';
							}else{
								html+='<a href=""><span id="relationship-'+item.value+'">'+item.label+'</span><br></a>';
							}
						});
						html+=' &nbsp;';
						_load_rater(html, role_id);
					}else{
						_load_role_ratings(role_id);
					}
				});
				return false;
			});

		$('div.simple-rater-hover p.subject-relationship-options a').live('click', function(){
			var relationship_type = $(this).find('span').attr('id');
			relationship_type = relationship_type.split('-');
			relationship_type = relationship_type[1];
			$.getJSON(GLOBALS.contextPath + '/ajax/editSubject?setRelationship&subjectId='+GLOBALS.sid+'&relationshipType='+relationship_type, function(data){
				if(data.error==false){
					$.getJSON(GLOBALS.contextPath + '/ajax/getSubjectRelationship?subjectId='+GLOBALS.sid, function(data){
						_load_role_ratings(role_id);
					});
				}
			});
			return false;
		});
	}
}
