//MultiTextComplete 

var sMtcOldSearch = "";
var aMtcOldResults = [];
var aMtcOldResultsFull = [];
var bMtcMoreResultsPresent = false;

jQuery.fn.multiTextComplete = function(options){	
 	
 	if (options.singleResult == undefined){
 		options.singleResult = false;
 	}
 	var input = this;
 	input.wrapAll("<span></span>"); 	
	var close = function(){		
		jQuery('#' + options.itemContainer.attr.id).remove();
		jQuery('#' + options.itemContainer.attr.id + "_iframe").remove();
		resetOldSearch ();		
	};
	jQuery(document).bind('mousedown', close);	
	var resetOldSearch =function () {
		sMtcOldSearch = "";
		aMtcOldResults = [];
		bMtcMoreResultsPresent = false;
	}
	var newSelection = function(item){
		return	jQuery(item)
				.addClass("selected");		
	};	
	var oldSelection = function(item){
		return	jQuery(item || ('#' + options.itemContainer.attr.id + ' .selected'))
				.removeClass("selected");		
	};	
	
	var newItem = function(text,user,abUser){
		jQuery('#' + options.itemContainer.attr.id).show();
		return	jQuery("<div></div>")
				.css(options.item.css || {})
				.html(text || "")
				.hover(
					function(){
						oldSelection()		
							.css({color:options.item.hoverColorOff, backgroundColor:options.item.hoverBackgroundOff});
						newSelection(this)
							.css({color:options.item.hoverColorOn || "", backgroundColor:options.item.hoverBackgroundOn || ""});
					},
					function(){
						oldSelection()
							.css({color:options.item.hoverColorOff, backgroundColor:options.item.hoverBackgroundOff});
						newSelection(this)
							.css({color:options.item.hoverColorOff || "", backgroundColor:options.item.hoverBackgroundOff || ""});
					}
				)
				.click(function(){					
					var text = jQuery(this).html();
					text = text.toLowerCase().split("<span")[0]
					if (options.singleResult)
						input.val(text);
					else
						setSearchResultString(input,text);
					close();
					options.onItemSelect(user,abUser);
				});			
	}	
	
	var printItems = function(){
		sSearch = getCurrentSearchString(input)
		if (sSearch.length > 1){
			if (bMtcMoreResultsPresent || sSearch.indexOf(sMtcOldSearch) == -1 || sMtcOldSearch.length < 2) {
				//do new search
				sMtcOldSearch = sSearch
				aMtcOldResults = [];
				jQuery.getJSON(options.url+sSearch, function(data) {	
					var users = data['I@LIST@'];
					if (typeof(users) != 'undefined'){
						for (var i = 0; i < users.length ; i++){
							var email = users[i].sPRIMARY_EMAIL.toLowerCase();
							var firstName = (users[i].sFIRST_NAME == undefined) ? "" : users[i].sFIRST_NAME;
							var lastName = (users[i].sLAST_NAME == undefined) ? "" : users[i].sLAST_NAME;
							var nickName = (users[i].sNICKNAME == undefined) ? "" : users[i].sNICKNAME;
							var userId = (users[i].lADDRESS_ID == undefined) ? "" : users[i].lADDRESS_ID;
							var date = (users[i].sBIRTHDAY == undefined) ? "" : users[i].sBIRTHDAY;
							var user = {"userId": userId, "date":date,"email":email,"firstName":firstName,"lastName":lastName,"nickName":nickName}
							matchedElement = getMatchingElement(user,sSearch);
							if (matchedElement != "")
								email = email + "<span class='match'> ["+matchedElement+"]</span>";
							newItem(email,user,users[i]).appendTo(jQuery('#' + options.itemContainer.attr.id));
							//save old search
							aMtcOldResults.push(user);
							aMtcOldResultsFull.push(users[i]);
						}
						// If the results contained 20 searches, there might be more, next time do a new search anyway.
						if (users.length >= 20)
							bMtcMoreResultsPresent = true;
						else 
							bMtcMoreResultsPresent = false;
					}
					else {
						jQuery('#ac_container').remove();
						return false;
					}
					
				});
				
			}
			else {
				//kick out non matches
				var aFilter = [];
				for (var i = 0; i < aMtcOldResults.length ; i++){
					if (isStringInUser(aMtcOldResults[i],sSearch)){
						aFilter.push(aMtcOldResults[i]);
					}					
				}
				aMtcOldResults = aFilter;
				//render
				if (aMtcOldResults.length > 0) {
					for (var i = 0; i < aMtcOldResults.length ; i++){
						var user = aMtcOldResults[i];
						var fullUser = aMtcOldResultsFull[i]
						var email = user.email;
						matchedElement = getMatchingElement(user,sSearch);
							if (matchedElement != "")
								email = email + "<span class='match'> ["+matchedElement+"]</span>";
							newItem(email,user,fullUser).appendTo(jQuery('#' + options.itemContainer.attr.id));
					}
					sMtcOldSearch = sSearch;
				}
				else {
					jQuery('#ac_container').remove();
				}				
			}
		}
	}
	var isStringInUser = function (user,searchTerm){
		searchTerm = searchTerm.toLowerCase();
		if (user.email.toLowerCase().indexOf(searchTerm)==0)
			return true;
		else if (user.lastName.toLowerCase().indexOf(searchTerm)==0)
			return true;
		else if (user.firstName.toLowerCase().indexOf(searchTerm)==0)
			return true;
		else if (user.nickName.toLowerCase().indexOf(searchTerm)==0)
			return true;
		else
			return false;
	}
	var getMatchingElement = function (user,searchTerm){
		searchTerm = searchTerm.toLowerCase();
		if (user.email.toLowerCase().indexOf(searchTerm)==0)
			return "";
		else if (user.lastName.toLowerCase().indexOf(searchTerm)==0)
			return user.lastName + ", " + user.firstName;
		else if (user.firstName.toLowerCase().indexOf(searchTerm)==0)
			return user.firstName + " " + user.lastName;
		else if (user.nickName.toLowerCase().indexOf(searchTerm)==0)
			return user.nickName;
		else
			return "";
	}
	var getCurrentSearchString  = function (input){
		//returns the text between commas where the cursor is at
		var fullText = input.val();
		var aFullText = fullText.split(",");
		aFullText = cleanSpaces(aFullText);
		var cursorPosition = getCursorPosition(input.attr('id'));//.selectionStart;
		var currentSearchString = "";
		var textPosition = 0;
		for (var i = 0 ; i < aFullText.length; i++) {
			textPosition += aFullText[i].length;
			if (i!=0)
				textPosition += 2;
			
			if (textPosition >= cursorPosition) {
				return aFullText[i];
				break;
			}
		}
		return "";
	}
	
	var setSearchResultString = function (input,string){
		input.val(cleanInput(input));
		var fullText = input.val();
		var aFullText = fullText.split(",");
		aFullText = cleanSpaces(aFullText);
		var cursorPosition = getCursorPosition(input.attr('id'))
		var newFullText = "";
		
		var firstMatch = true;
		var currentSearchString = "";
		var textPosition = 0;
		for (var i = 0 ; i < aFullText.length; i++) {
			textPosition += aFullText[i].length;
			if (i!=0)
				textPosition += 2;
			if (textPosition >= cursorPosition && firstMatch) {
				aFullText[i] = string;
				firstMatch = false;
			}
			if (i!=0)
				newFullText += ", " + aFullText[i];
			else
				newFullText += aFullText[i];
		}
		newFullText += ", ";
		input.val(newFullText);
		input.val(cleanInput(input));
	}
	
	var cleanSpaces = function(aSearchterms)  {
		for (var i = 0 ; i < aSearchterms.length; i++) {
			aSearchterms[i] = aSearchterms[i].replace(/^[ \s]+/,"");
		}
		return aSearchterms;
	}
	
	var cleanInput = function(input)  {
		var value = input.val();
		value = value.replace(/\n/,"");
		return(value);
	}
	
	input.keydown(function(e){		
		if(input.val().length > (options.minimumKeystrokes || 2)-1){		
			switch(e.keyCode){
				case 188:
					//comma!
					break;
				case 37:
				case 39:
					break;							
				case 13:
					e.preventDefault();
					jQuery('#' + options.itemContainer.attr.id + ' .selected').click();
					/*
						var text = jQuery('#' + options.itemContainer.attr.id + ' .selected').html();
						if (text!=null){
							text = text.toLowerCase().split("<span")[0];
							if (options.singleResult)
								input.val(text);
							else
								setSearchResultString(input,text);
							close();
							options.onItemSelect();	
						}
						else {
							input.val(input.val()+"\r")
							input.focus();
						}
					*/
					break;
				case 27:
					
					e.preventDefault();					
					close();		
					break;
				case 38:
					// up arrow
					e.preventDefault();
					if(jQuery('#' + options.itemContainer.attr.id + ' .selected').length > 0 && jQuery('#' + options.itemContainer.attr.id + ' .selected').prev().length == 1){							
						jQuery('#' + options.itemContainer.attr.id + ' .selected').each(function(i, item){							
							oldSelection(item)
								.css({color:options.item.hoverColorOff, backgroundColor:options.item.hoverBackgroundOff})
								.prev()
								.addClass("selected")
								.css({color:options.item.hoverColorOn, backgroundColor:options.item.hoverBackgroundOn});});
					}
					else if(jQuery('#' + options.itemContainer.attr.id + ' .selected').length == 0){
						newSelection('#' + options.itemContainer.attr.id + ' div:first')
							.css({color:options.item.hoverColorOn, backgroundColor:options.item.hoverBackgroundOn});
					}	
					break;
				case 40:
					// down arrow
					e.preventDefault();					
					if(jQuery('#' + options.itemContainer.attr.id + ' .selected').length > 0 && jQuery('#' + options.itemContainer.attr.id + ' .selected').next().length == 1){							
						jQuery('#' + options.itemContainer.attr.id + ' .selected').each(function(i, item){							
							oldSelection(item)								
								.css('color',options.item.hoverColorOff).css('backgroundColor',options.item.hoverBackgroundOff)
								.next()
								.addClass("selected")
								.css('color',options.item.hoverColorOn).css('backgroundColor',options.item.hoverBackgroundOn)
							});
					}
					else if(jQuery('#' + options.itemContainer.attr.id + ' .selected').length == 0){
						newSelection('#' + options.itemContainer.attr.id + ' div:first')							
							.css({color:options.item.hoverColorOn, backgroundColor:options.item.hoverBackgroundOn});
					}	
					break;
				default:					
								
					break;
			}
		}
		else{
			close();
		}
	});
	
	input.keyup(function(e){		
		if(input.val().length > (options.minimumKeystrokes || 2)-1){		
			switch(e.keyCode){
				case 188:
				case 37:
				case 39:
				case 13:
				case 27:
				case 38:
				case 40:
					break;
				default:
					if(jQuery('#' + options.itemContainer.attr.id).length == 0){	
						jQuery("<div style='display:none;'></div>")
							.attr(options.itemContainer.attr)
							.css(options.positioning.css)
							.css(options.itemContainer.css)							
							.mousedown(function(e){
								e.stopPropagation();
							})							
							.prependTo(options.positioning.relativeTo ||input.parent());								
						if(options.useIframe){										
							jQuery("<iframe></iframe>")
								.attr({ id: options.itemContainer.attr.id + "_iframe",	frameBorder: "0" })
								.css(options.positioning.css)
								.css({ background: "Transparent", border: "none", display: "block", zIndex: options.itemContainer.css.zIndex-1	})			
								.prependTo(options.positioning.relativeTo || input.parent());
						}
												
						printItems();																				
					}
					else{
						jQuery('#' + options.itemContainer.attr.id).html("");								
						printItems();
					}					
					break;
			}
		}
		else{
			close();
		}
	});
}
function getCursorPosition(inp){
	var textarea = $(document.getElementById(inp));	
	textarea.focus();	
	if (textarea[0] && typeof(textarea[0].selectionStart) == 'number') {		
		return textarea[0].selectionStart;
	} else if(document.selection) {
		var selection_range = document.selection.createRange().duplicate();		
		if (selection_range.parentElement() == textarea[0]) { // Check that the selection is actually in our textarea
			// Create three ranges, one containing all the text before the selection,
			// one containing all the text in the selection (this already exists), and one containing all
			// the text after the selection.
			var before_range = document.body.createTextRange();
			before_range.moveToElementText(textarea[0]); // Selects all the text
			before_range.setEndPoint("EndToStart", selection_range); // Moves the end where we need it

			var after_range = document.body.createTextRange();
			after_range.moveToElementText(textarea[0]); // Selects all the text
			after_range.setEndPoint("StartToEnd", selection_range); // Moves the start where we need it

			var before_finished = false, selection_finished = false, after_finished = false;
			var before_text, untrimmed_before_text, selection_text, untrimmed_selection_text, after_text, untrimmed_after_text;

			// Load the text values we need to compare
			before_text = untrimmed_before_text = before_range.text;
			selection_text = untrimmed_selection_text = selection_range.text;
			after_text = untrimmed_after_text = after_range.text;

			// Check each range for trimmed newlines by shrinking the range by 1 character and seeing
			// if the text property has changed. If it has not changed then we know that IE has trimmed
			// a \r\n from the end.
			do {
				if (!before_finished) {
					if (before_range.compareEndPoints("StartToEnd", before_range) == 0) {
						before_finished = true;
					} else {
						before_range.moveEnd("character", -1)
						if (before_range.text == before_text) {
							untrimmed_before_text += "\r\n";
						} else {
							before_finished = true;
						}
					}
				}
				if (!selection_finished) {
					if (selection_range.compareEndPoints("StartToEnd", selection_range) == 0) {
						selection_finished = true;
					} else {
						selection_range.moveEnd("character", -1)
						if (selection_range.text == selection_text) {
							untrimmed_selection_text += "\r\n";
						} else {
							selection_finished = true;
						}
					}
				}
				if (!after_finished) {
					if (after_range.compareEndPoints("StartToEnd", after_range) == 0) {
						after_finished = true;
					} else {
						after_range.moveEnd("character", -1)
						if (after_range.text == after_text) {
							untrimmed_after_text += "\r\n";
						} else {
							after_finished = true;
						}
					}
				}

			} while ((!before_finished || !selection_finished || !after_finished));

			// Untrimmed success test to make sure our results match what is actually in the textarea
			// This can be removed once you're confident it's working correctly
			var untrimmed_text = untrimmed_before_text + untrimmed_selection_text + untrimmed_after_text;
			var untrimmed_successful = false;
			if (textarea[0].value == untrimmed_text) {
				untrimmed_successful = true;
			}
			// ** END Untrimmed success test
			var startPoint = untrimmed_before_text.length;			
			return(startPoint);
		}
	}
}
function mtcGetUser(uId){
	
	var result = null;
	for (i=0 ; i > aMtcOldResults.length() ; i++){
		if (aMtcOldResults[i].id == uId)
			result = aMtcOldResults[i]
	}
	return result;
}