﻿/* ---------------------------------------------------------------------

MemberToMember Dialog/People Picker Functionality
Written by SusQtech
www.susqtech.com

* requires jQuery 1.3.2 or later
* http://ajax.microsoft.com/ajax/jquery/jquery-1.3.2.min.js

--------------------------------------------------------------------- */

/*vars not configurable*/

//Will do auto-complete 'AutoCompleteRefreshTime' seconds after every keystroke
var mtmPeoplePickerPostTypeAutoComplete = false;

//URL to which auto-complete XML requests are made
var mtmPeoplePickerAutoCompleteRequestUrl = "/_layouts/community/peoplepicker/peoplesearch.aspx";
// Web services URL
var mtmPeoplePickerAutoCompleteRequestWebService = "/_layouts/community/readonlywebservices/PeoplePickerService.asmx/PeopleQueryRaw";
var mtmPeoplePickerAutoCompleteRequestWithGroupWebService = "/_layouts/community/readonlywebservices/PeoplePickerService.asmx/PeopleQueryWithGroupMembershipIdentifierJson";

//URL to which message contents will be posted
var mtmDialogPostUrl = "/_layouts/community/peoplepicker/sendmessage.aspx";

var mtmDefaultProfileImage = "/SQTComm_Images/profile-default.png";

/*end vars not configurable */

// invite member link to attach the mtm dialog to
var inviteMembersToGroupLinkBase = "/_layouts/community/messaging/compose.aspx?InviteGroupID=";
var groupID = "";

// Add dialog, fade, and auto-complete DIVs to page
$(document).ready(function() {
if ($("form:eq(0)") != null) {
		$("form:eq(0)").prepend("<div class=\"mtmFade\" onclick=\"mtmHideDialog();\"></div>");
		$("form:eq(0)").prepend("<div class=\"mtmDialog\"><h3></h3><div class=\"mtmDialogBody\"></div></div>");
		$("form:eq(0)").prepend("<div class=\"mtmAutoCompleteMenu\"></div>");
	}

	// add dialog popup call to "invite members" to group link
	if ($("a[href*=" + inviteMembersToGroupLinkBase + "]") != null) {
		$("a[href*=" + inviteMembersToGroupLinkBase + "]").each(function() {
			$(this).attr('title', '');
			groupID = $(this).attr("href").replace(inviteMembersToGroupLinkBase, "");
			$(this).click(function(e) {
				mtmShowDialog("InviteMemberToGroup");
				e.preventDefault();
				return false;
			});
		});
    }

    //Correct the AD user's mtmDialog links
    $(".profileLinks .contactLink").each(function() {
        var click = $(this).html();

        click = click.replace(/\\/g, "\\\\");

        $(this).html(click);
       });
	
});

// Show dialog
var mtmPeoplePickerAutoCompleteHideTimer = setTimeout('void(0);', 0);
var mtmDialogMode = "message";
function mtmShowDialog(mode, username, display) {
	if (mode == "colleague") {
		$(".mtmDialog h3").text("Colleague Request");
		$(".mtmDialogBody").html("<div class=\"mtmDialogFormField\"><label>To:</label><div class=\"mtmPeoplePickerReadOnly\">" + display + "<input type=\"hidden\" value=\"" + username + "\" name=\"usernames\" id=\"usernames\" /></div></div><div class=\"mtmDialogFormField\"><label>Subject:</label><div class=\"mtmDialogInputReadOnly\">" + mtmDialogAddColleagueSubjectText + "</div><input type=\"hidden\" name=\"subject\" value=\"" + mtmDialogAddColleagueSubjectText + "\" /></div><div class=\"mtmDialogFormFieldWide\"><label>Message:</label><textarea name=\"message\">" + mtmDialogAddColleagueMessageText + "</textarea></div><div class=\"mtmDialogFormActions\"><a href=\"javascript:void(0);\" onclick=\"mtmSendMessage();\">Send Message</a><a class=\"mtmDialogButtonAlt\" href=\"javascript:void(0);\" onclick=\"mtmHideDialog();\">Cancel</a></div>");
		mtmDialogMode = "colleague";
	}
	else if (mode == "InviteMemberToGroup") {

		//get group name		
		var groupName = $("[class=pageTitle]").text().replace("Overview", "");
		//get group link
		var groupLink = $(".communityTabs a[href*=/profile.aspx]").attr("href");
		groupLink = "<a href=\"" + groupLink + "\">Join this Group</a>"
		// get username
		var currentUsername = $("[class=profileName]").find("a:first").html();
		var currentUsernameLink = $("[class=profileName]").find("a:first").attr("href");
		$(".mtmDialog h3").text("Invite Members to " + groupName);
		var subject = mtmDialogInviteMemberToGroupSubjectText.replace("[GroupName]", groupName);
		var message = mtmDialogInviteMemberToGroupMessageText.replace("[GroupLink]", groupLink);
		message = message.replace("[CurrentUserName]", currentUsername);
		message = message.replace("[GroupName]", groupName);

		$(".mtmDialogBody").html("<div class=\"mtmDialogFormField\"><label>To:</label><div class=\"mtmPeoplePicker\">\<input type=\"text\" name=\"to\" id=\"to\" /><input type=\"hidden\" value=\"" + username + "\" name=\"usernames\" id=\"usernames\" /></div></div><div class=\"mtmDialogFormField\"><label>Subject:</label><input type=\"text\" name=\"subject\" value=\"" + subject + "\" /><input type=\"hidden\" name=\"subject\" value=\"" + subject + "\" /></div><div class=\"mtmDialogFormFieldWide\"><label>Message:</label><textarea name=\"message\">" + message + "</textarea></div><div class=\"mtmDialogFormActions\"><a href=\"javascript:void(0);\" onclick=\"mtmSendMessage();\">Send Message</a><a class=\"mtmDialogButtonAlt\" href=\"javascript:void(0);\" onclick=\"mtmHideDialog();\">Cancel</a></div>");
		mtmDialogMode = mode;
	}
	else {
		$(".mtmDialog h3").text("Send a Message");
		$(".mtmDialogBody").html("<div class=\"mtmDialogFormField\"><label>To:</label><div class=\"mtmPeoplePicker\"> <input type=\"text\" name=\"to\" id=\"to\" /><input type=\"hidden\" name=\"usernames\" id=\"usernames\" /></div></div><div class=\"mtmDialogFormField\"><label>Subject:</label><input type=\"text\" name=\"subject\" /></div><div class=\"mtmDialogFormFieldWide\"><label>Message:</label><textarea name=\"message\" /></div><div class=\"mtmDialogFormActions\"><a href=\"javascript:void(0);\" onclick=\"mtmSendMessage();\">Send Message</a><a class=\"mtmDialogButtonAlt\" href=\"javascript:void(0);\" onclick=\"mtmHideDialog();\">Cancel</a></div>");
	}

	//$('.mtmDialog input#to').autoGrowInput({ comfortZone: 50, minWidth: 50, maxWidth: 170 });
	$('.mtmDialog input#to').keydown(function(e) {
		if ((e.which && e.which == 13) || (e.keyCode && e.keyCode == 13)) { // enter key
			mtmPeoplePickerAddCurrentlySelectedPerson();
			return false;
		}
		else if ((e.which && e.which == 40) || (e.keyCode && e.keyCode == 40)) { // down arrow
			mtmAutoCompleteNext();
		}
		else if ((e.which && e.which == 38) || (e.keyCode && e.keyCode == 38)) { // up arrow
			mtmAutoCompletePrev();
		}
		else if ((e.which && e.which == 16) || (e.keyCode && e.keyCode == 16) || (e.which && e.which == 17) || (e.keyCode && e.keyCode == 17) || (e.which && e.which == 18) || (e.keyCode && e.keyCode == 18) || (e.which && e.which == 33) || (e.keyCode && e.keyCode == 33) || (e.which && e.which == 34) || (e.keyCode && e.keyCode == 34) || (e.which && e.which == 35) || (e.keyCode && e.keyCode == 35) || (e.which && e.which == 36) || (e.keyCode && e.keyCode == 36) || (e.which && e.which == 37) || (e.keyCode && e.keyCode == 37) || (e.which && e.which == 39) || (e.keyCode && e.keyCode == 39) || (e.which && e.which == 9) || (e.keyCode && e.keyCode == 9)) {
			// don't search on arrow keys, shift, ctrl, alt, etc.
		}
		else {
			if ((e.which && e.which == 8) || (e.keyCode && e.keyCode == 8)) { // backspace
				if ($('.mtmDialog input#to').val() == '') {
					$('.mtmPeoplePicker .mtmPeoplePickerPerson:last').remove();
					mtmPeoplePickerUpdateUsernames();
				}
			}
			clearTimeout(mtmPeoplePickerSearchTimer);
			mtmPeoplePickerSearchTimer = setTimeout('mtmPeoplePickerSearch();', mtmPeoplePickerAutoCompleteRefreshTime);
		}
	});
	$('.mtmDialog input[name=subject]').focus(function() {
		mtmPeoplePickerAutoCompleteHideTimer = setTimeout('mtmPeoplePickerUnSearch();', 100);
	});
	$('.mtmDialog textarea[name=message]').focus(function() {
		mtmPeoplePickerAutoCompleteHideTimer = setTimeout('mtmPeoplePickerUnSearch();', 100);
	});

	var slideTop = Math.round(($(".mtmDialog").height() / 2) * -1);
	var slideLeft = Math.round(($(".mtmDialog").width() / 2) * -1);
	$(".mtmDialog").css('margin', slideTop + 'px 0 0 ' + slideLeft + 'px');

	if (username != null && display != null) {
		mtmPeoplePickerAdd(username, display);
	}

	$(".mtmFade").show();
	$(".mtmDialog").show('medium');

	// disable window scrolling
	if (!mtmDialogAllowScroll) {
		var scrollAmt = $(window).scrollTop();
		$(window).scroll(function() {
			$(window).scrollTop(scrollAmt);
		});
	}

	window.setTimeout(function() {
		$('.mtmDialog input#to').focus();
	}, 500);
}

// Hide dialog
function mtmHideDialog() {
	$('.mtmFade').hide();
	$('.mtmDialog').hide('medium');
	mtmPeoplePickerUnSearch()

	// enable window scrolling
	if (!mtmDialogAllowScroll) {
		$(window).unbind('scroll');
	}
}

// Send message
function mtmSendMessage() {
	var usernamesString = $('.mtmDialog input#usernames').val();
	var subjectString = $('.mtmDialog input[name=subject]').val();
	var bodyString = $('.mtmDialog textarea[name=message]').val();
	if (usernamesString.length > 0 && subjectString.length > 0 && bodyString.length > 0) {
		if (mtmDialogMode == "colleague") {
			$('.mtmDialogBody').html('<div class="mtmDialogLoading"><img src="' + mtmDialogLoadingUrl + '" alt="Loading..." /></div>');
			$.ajax({
				url: mtmDialogPostUrl,
				type: "POST",
				data: ({
					to: usernamesString,
					subject: subjectString,
					body: bodyString,
					messageMode: mtmDialogMode
				}),
				success: function(msg) {
					$('.mtmDialogBody').html('<p><strong>Your colleague request has been sent!</strong> Closing automatically in a few seconds...</p><div class=\"mtmDialogFormActions\"><a class=\"mtmDialogButtonAlt\" href=\"javascript:void(0);\" onclick=\"mtmHideDialog();\">Close</a></div>');
					setTimeout('mtmHideDialog();', 5000);
				},
				error: function(msg) {
					$('.mtmDialogBody').html('<p><strong>Oops!</strong> Your colleague request failed to send! (Error details: ' + msg + ')</p><div class=\"mtmDialogFormActions\"><a class=\"mtmDialogButtonAlt\" href=\"javascript:void(0);\" onclick=\"mtmHideDialog();\">Close</a></div>');
				}
			});
		}
		else if (mtmDialogMode == "InviteMemberToGroup") {
			$('.mtmDialogBody').html('<div class="mtmDialogLoading"><img src="' + mtmDialogLoadingUrl + '" alt="Loading..." /></div>');
			$.ajax({
				url: mtmDialogPostUrl,
				type: "POST",
				data: ({
					to: usernamesString,
					subject: subjectString,
					body: bodyString,
					messageMode: mtmDialogMode,
					groupID: groupID
				}),
				success: function(msg) {
					$('.mtmDialogBody').html('<p><strong>Your message has been sent!</strong> Closing automatically in a few seconds...</p><div class=\"mtmDialogFormActions\"><a class=\"mtmDialogButtonAlt\" href=\"javascript:void(0);\" onclick=\"mtmHideDialog();\">Close</a></div>');
					setTimeout('mtmHideDialog();', 5000);
				},
				error: function(msg) {
					$('.mtmDialogBody').html('<p><strong>Oops!</strong> Your message failed to send! (Error details: ' + msg + ')</p><div class=\"mtmDialogFormActions\"><a class=\"mtmDialogButtonAlt\" href=\"javascript:void(0);\" onclick=\"mtmHideDialog();\">Close</a></div>');
				}
			});

		}
		else {
			$('.mtmDialogBody').html('<div class="mtmDialogLoading"><img src="' + mtmDialogLoadingUrl + '" alt="Loading..." /></div>');
			$.ajax({
				url: mtmDialogPostUrl,
				type: "POST",
				data: ({
					to: usernamesString,
					subject: subjectString,
					body: bodyString,
					messageMode: mtmDialogMode
				}),
				success: function(msg) {
					$('.mtmDialogBody').html('<p><strong>Your message has been sent!</strong> Closing automatically in a few seconds...</p><div class=\"mtmDialogFormActions\"><a class=\"mtmDialogButtonAlt\" href=\"javascript:void(0);\" onclick=\"mtmHideDialog();\">Close</a></div>');
					setTimeout('mtmHideDialog();', 5000);
				},
				error: function(msg) {
					$('.mtmDialogBody').html('<p><strong>Oops!</strong> Your message failed to send! (Error details: ' + msg + ')</p><div class=\"mtmDialogFormActions\"><a class=\"mtmDialogButtonAlt\" href=\"javascript:void(0);\" onclick=\"mtmHideDialog();\">Close</a></div>');
				}
			});
		}
	}
	else {
		if (usernamesString.length == 0) {
			alert(mtmDialogErrorTextNoRecipients);
			$('.mtmDialog input#to').focus();
		}
		else if (subjectString.length == 0) {
			alert(mtmDialogErrorTextNoSubject);
			$('.mtmDialog input[name=subject]').focus();
		}
		else if (bodyString.length == 0) {
			alert(mtmDialogErrorTextNoMessage);
			$('.mtmDialog textarea[name=message]').focus();
		}
	}
}

// Add person
function mtmPeoplePickerAdd(username, display) {
	if (!mtmPeoplePickerFindUsername(username)) {
		var peopleSpan = $("<span class=\"mtmPeoplePickerPerson\">" + display + "</span> ");
		$(peopleSpan).attr('rel', username);
		$(peopleSpan).click(function() {
			$(this).remove();
			mtmPeoplePickerUpdateUsernames();
			$('.mtmDialog input#to').focus();
		});
		$(peopleSpan).insertBefore(".mtmDialog input#to");
		mtmPeoplePickerUpdateUsernames();
	}
	$(".mtmDialog input#to").val('');
	$(".mtmDialog input#to").width(50);
	$('.mtmDialog input#to').focus();
}

function mtmPeoplePickerAddCurrentlySelectedPerson() {
	if ($('.mtmAutoCompleteMenu').css('display') == 'block') {
		var selectedItem = $('.mtmAutoCompleteMenuItem.selected');
		var username = $(selectedItem).attr('rel');
		var display = $(selectedItem).children('.mtmAutoCompleteMenuItemRight').children('h6').text();
		mtmPeoplePickerAdd(username, display);
		mtmPeoplePickerUnSearch();
	}
}

// Update username input value
function mtmPeoplePickerUpdateUsernames() {
	var usernames = new Array();
	$('.mtmPeoplePicker .mtmPeoplePickerPerson').each(function(i) {
		usernames[i] = $(this).attr('rel');
	});
	$('.mtmDialog input#usernames').val(usernames.join(','));
}

// Check for duplicate values
function mtmPeoplePickerFindUsername(name) {
	var currentNames = $('.mtmDialog input#usernames').val().split(',');
	var foundName = false;
	for (var i = 0; i < currentNames.length; i++) {
		if (currentNames[i] == name) {
			foundName = true;
			break;
		}
	}
	return foundName;
}


// People-picker auto-complete
var mtmPeoplePickerAllowSearch = true;
var mtmPeoplePickerSearchTimer = setTimeout('void(0)', 0);
var mtmPeoplePickerAutoCompleteCurrentPage = 1;
function mtmPeoplePickerSearch(pageOverride) {

	mtmPeoplePickerAutoCompleteCurrentPage = 1;
	if (pageOverride != null) {
		mtmPeoplePickerAutoCompleteCurrentPage = pageOverride;
	}
	var mtmPeoplePickerAutoCompleteTotalResults = 0;
	if ($('.mtmDialog input#to').val().length >= mtmPeoplePickerAutoCompleteMinChars) {
		$('.mtmAutoCompleteMenu').empty();
		// determine which web service to call
		var wsURL = mtmPeoplePickerAutoCompleteRequestWebService;
		if (groupID != "") {
			wsURL = mtmPeoplePickerAutoCompleteRequestWithGroupWebService;
		}

		$.ajax({
			async: true,
			url: wsURL,
			type: "POST",
			contentType: "application/json; charset=utf-8",
			data: "{ \"username\":\"" + $(".mtmDialog input#to").val() + "\", \"groupId\":\"" + groupID + "\", \"currentPage\":\"" + mtmPeoplePickerAutoCompleteCurrentPage + "\", \"itemsPerPage\":\"" + mtmPeoplePickerAutoCompleteItemLimit + "\" }",
			dataType: "json",
			complete: function(xml, txtStatus) {

				var result = eval('(' + xml.responseText + ')');

				mtmPeoplePickerAutoCompleteCurrentPage = parseInt(result.d.Page);
				mtmPeoplePickerAutoCompleteTotalResults = parseInt(result.d.TotalResults);

				$.each(result.d.People, function(i, p) {

					var username = p.AccountName;
					var display = p.DisplayName;
					var itemDiv = $('<div class="mtmAutoCompleteMenuItem" />');
					if (i == 0) { $(itemDiv).addClass('selected'); }
					$(itemDiv).attr('rel', username);
					var itemDivLeft = $('<div class="mtmAutoCompleteMenuItemLeft" />');
					var itemDivRight = $('<div class="mtmAutoCompleteMenuItemRight" />');
					var img = $('<img/>');
					var imgUrl = p.PictureUrl;
					if (imgUrl == "")
						imgUrl = mtmDefaultProfileImage;
					$(img).attr('src', imgUrl);
					$(img).appendTo(itemDivLeft);
					if (p.IsColleague) {
						var colleagueIcon = $('<img class="mtmAutoCompleteMenuItemMyColleague" alt="My Colleague" src="' + mtmDialogColleagueIconUrl + '" />');
						$(colleagueIcon).appendTo(itemDivRight);
					}
					var name = $('<h6/>');
					$(name).html(display);
					$(name).appendTo(itemDivRight);
					var title = jQuery.trim(p.Title);
					var organization = jQuery.trim(p.Company);
					var location = p.Location;
					if (organization != "") {
						organization = '<strong>' + organization + '</strong>';
						if (title != "") {
							title = title + ', ';
						}
					}

					var meta = $('<div/>');
					$(meta).addClass('meta');
					$(meta).append('<div>' + title + organization + '</div>');
					$(meta).append('<div>' + location + '</div>');
					if (groupID != "") {
						if (p.IsMemberOfGroup) {
							$(meta).append('<div style="color:#F57D31;">Already a Member</div>');
						}
					}
					$(meta).appendTo(itemDivRight);
					$(itemDivLeft).appendTo(itemDiv);
					$(itemDivRight).appendTo(itemDiv);
					var clearDiv = $('<div class="clear" />');
					$(clearDiv).appendTo(itemDiv);
					$(itemDiv).click(function() {
						clearTimeout(mtmPeoplePickerAutoCompleteHideTimer);
						mtmPeoplePickerAdd(username, display);
						mtmPeoplePickerUnSearch();
					});
					$('.mtmAutoCompleteMenu').append(itemDiv);
				});


				var divFooter = $('<div class="mtmAutoCompleteMenuFooter"></div>');
				$('.mtmAutoCompleteMenu').append(divFooter);

				if (mtmPeoplePickerAutoCompleteCurrentPage > 1) {
					var backDiv = $('<div class="mtmAutoCompleteMenuItemBack"><a href="javascript:void(0);" onclick="clearTimeout(mtmPeoplePickerAutoCompleteHideTimer);mtmPeoplePickerSearchBack();">back...</a></div>');
					$('.mtmAutoCompleteMenuFooter').append(backDiv);
				}

				if (mtmPeoplePickerAutoCompleteCurrentPage * mtmPeoplePickerAutoCompleteItemLimit < mtmPeoplePickerAutoCompleteTotalResults) {
					var moreDiv = $('<div class="mtmAutoCompleteMenuItemMore"><a href="javascript:void(0);" onclick="clearTimeout(mtmPeoplePickerAutoCompleteHideTimer);mtmPeoplePickerSearchMore();">more...</a></div>');
					$('.mtmAutoCompleteMenuFooter').append(moreDiv);
				}
			}
		});

		var boxW = $('.mtmPeoplePicker').width();
		var boxH = $('.mtmPeoplePicker').height();
		var boxPos = $('.mtmPeoplePicker').offset();
		$('.mtmAutoCompleteMenu').css('top', boxPos.top + boxH + 8);
		$('.mtmAutoCompleteMenu').css('left', boxPos.left);
		$('.mtmAutoCompleteMenu').css('width', boxW + 6);
		$('.mtmAutoCompleteMenu').show();
	}
	else {
		mtmPeoplePickerUnSearch();
	}
}

// People-picker auto-complete pagination
function mtmPeoplePickerSearchMore() {
	mtmPeoplePickerAutoCompleteCurrentPage += 1;
	mtmPeoplePickerSearch(mtmPeoplePickerAutoCompleteCurrentPage);
	$('.mtmDialog input#to').focus();
}

// People-picker auto-complete pagination, moving back
function mtmPeoplePickerSearchBack() {
	mtmPeoplePickerAutoCompleteCurrentPage -= 1;
	mtmPeoplePickerSearch(mtmPeoplePickerAutoCompleteCurrentPage);
	$('.mtmDialog input#to').focus();
}

// Hide auto-complete menu
function mtmPeoplePickerUnSearch() {
	$('.mtmAutoCompleteMenu').hide();
}

// Next auto-complete result (down arrow)
function mtmAutoCompleteNext() {
	var currentlySelected = $('.mtmAutoCompleteMenuItem.selected');
	var nextItem = $(currentlySelected).next('.mtmAutoCompleteMenuItem');
	if ($(nextItem).size() == 0) {
		var nextItem = $('.mtmAutoCompleteMenuItem:first');
	}
	$(currentlySelected).removeClass('selected');
	$(nextItem).addClass('selected');
}

// Previous auto-complete result (up arrow)
function mtmAutoCompletePrev() {
	var currentlySelected = $('.mtmAutoCompleteMenuItem.selected');
	var nextItem = $(currentlySelected).prev('.mtmAutoCompleteMenuItem');
	if ($(nextItem).size() == 0) {
		var nextItem = $('.mtmAutoCompleteMenuItem:last');
	}
	$(currentlySelected).removeClass('selected');
	$(nextItem).addClass('selected');
}

// Auto-grow input for people picker input
(function($) {
	// jQuery autoGrowInput plugin by James Padolsey
	// See related thread: http://stackoverflow.com/questions/931207/is-there-a-jquery-autogrow-plugin-for-text-fields
	$.fn.autoGrowInput = function(o) {
		o = $.extend({
			maxWidth: 1000,
			minWidth: 0,
			comfortZone: 70
		}, o);
		this.filter('input:text').each(function() {
			var minWidth = o.minWidth || $(this).width(),
                val = '',
                input = $(this),
                testSubject = $('<tester/>').css({
                	position: 'absolute',
                	top: -9999,
                	left: -9999,
                	width: 'auto',
                	fontSize: input.css('fontSize'),
                	fontFamily: input.css('fontFamily'),
                	fontWeight: input.css('fontWeight'),
                	letterSpacing: input.css('letterSpacing'),
                	whiteSpace: 'nowrap'
                }),
                check = function() {
                	if (val === (val = input.val())) { return; }
                	// Enter new content into testSubject
                	var escaped = val.replace(/&/g, '&amp;').replace(/\s/g, '&nbsp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
                	testSubject.html(escaped);
                	// Calculate new width + whether to change
                	var testerWidth = testSubject.width(),
                        newWidth = (testerWidth + o.comfortZone) >= minWidth ? testerWidth + o.comfortZone : minWidth,
                        currentWidth = input.width(),
                        isValidWidthChange = (newWidth < currentWidth && newWidth >= minWidth)
                                             || (newWidth > minWidth && newWidth < o.maxWidth);
                	// Animate width
                	if (isValidWidthChange) {
                		input.width(newWidth);
                	}
                };
			testSubject.insertAfter(input);
			$(this).bind('keyup keydown blur update', check);
		});
		return this;
	};
})(jQuery);
